[{"bookSourceName": "部署自测"},{"bookSourceName": "爱丽丝书屋 (alicesw3.homes)", "bookSourceType": 0, "bookSourceUrl": "https://www.alicesw3.homes/", "bookUrlPattern": "https?://[^/]+/(novel|other/chapters/id)/\\d+\\.html", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": false, "eventListener": false, "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Mobile Safari/537.36\",\"Referer\":\"https://www.alicesw2.homes/\"}", "lastUpdateTime": "1794734311749", "respondTime": 180000, "ruleBookInfo": {"author": "class.infos@tag.span.0@tag.a@text##作者：|\\s", "coverUrl": "class.cover img@src||img@src", "intro": "class.jianjie@text", "name": "class.mu_h1@tag.h1@text||h1@text", "tocUrl": "@js:var u=String(baseUrl||'');u.indexOf('/novel/')>-1?u.replace('/novel/','/other/chapters/id/'):u"}, "ruleContent": {"content": "class.content_txt@html||class.read-content@html||class.j_readContent@html||id.content@html||@js:var h=String(result||'');var m=h.match(/<div[^>]*class=\"[^\"]*(?:content_txt|read-content)[^\"]*\"[^>]*>([\\s\\S]*?)<\\/div>/i);out=m?m[1]:'';"}, "ruleExplore": [], "ruleSearch": {"author": "class.mb-1@tag.a@text##作者：|\\s", "bookList": "class.list-group-item", "bookUrl": "tag.h5@tag.a@href##^(?!http)##https://www.alicesw3.homes", "intro": "class.content-txt@text", "kind": "tag.small@text", "name": "tag.h5@tag.a@text"}, "ruleToc": {"chapterList": ":href=\"(/book/[^\"]+)\"[^>]*>([^<]+)", "chapterName": "$2", "chapterUrl": "$1"}, "searchUrl": "https://www.alicesw3.homes/search.html?q={{key}}&f=_all&sort=relevance&serialize=", "weight": 0},{"bookSourceName": "爱丽丝书屋 (alicesw3.homes)", "bookSourceType": 0, "bookSourceUrl": "https://www.alicesw3.homes/", "bookUrlPattern": "https?://[^/]+/(novel|other/chapters/id)/\\d+\\.html", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": false, "eventListener": false, "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Mobile Safari/537.36\",\"Referer\":\"https://www.alicesw2.homes/\"}", "lastUpdateTime": 1794733658398, "respondTime": 180000, "ruleBookInfo": {"author": "class.infos@tag.span.0@tag.a@text##作者：|\\s", "coverUrl": "class.cover img@src||img@src", "intro": "class.jianjie@text", "name": "class.mu_h1@tag.h1@text||h1@text", "tocUrl": "@js:var u=String(baseUrl||'');u.indexOf('/novel/')>-1?u.replace('/novel/','/other/chapters/id/'):u"}, "ruleContent": {"content": "class.content_txt@html||class.read-content@html||class.j_readContent@html||id.content@html||@js:var h=String(result||'');var m=h.match(/<div[^>]*class=\"[^\"]*(?:content_txt|read-content)[^\"]*\"[^>]*>([\\s\\S]*?)<\\/div>/i);out=m?m[1]:'';"}, "ruleExplore": {}, "ruleSearch": {"author": "class.mb-1@tag.a@text##作者：|\\s", "bookList": "class.list-group-item", "bookUrl": "tag.h5@tag.a@href##^(?!http)##https://www.alicesw3.homes", "intro": "class.content-txt@text", "kind": "tag.small@text", "name": "tag.h5@tag.a@text"}, "ruleToc": {"chapterList": ":href=\"(/book/[^\"]+)\"[^>]*>([^<]+)", "chapterName": "$2", "chapterUrl": "$1"}, "searchUrl": "https://www.alicesw3.homes/search.html?q={{key}}&f=_all&sort=relevance&serialize=", "weight": 0},{"bookSourceComment": "注意：本站仅支持按书名搜索（搜作者名无结果）。", "bookSourceGroup": "❤", "bookSourceName": "得奇小说", "bookSourceType": 0, "bookSourceUrl": "https://www.deqixss.com", "concurrentRate": "500", "customButton": false, "customOrder": 19, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nconst list = []\nconst push = (title, url, size) => list.push({\n  title,\n  url,\n  style: {\n  \t layout_flexGrow: 1,\n  \t layout_flexBasisPercent: size||0.29\n  }\n});\n\nconst cats = \"全部::0\\n玄幻小说::1\\n都市小说::2\\n仙侠小说::3\\n历史小说::4\\n科幻小说::5\\n诸天无限::6\\n悬疑小说::7\\n体育小说::8\\n游戏小说::9\\n综合其他::10\"\nconst ranks = \"总点击榜::allvisit\\n月点击榜::monthvisit\\n周点击榜::weekvisit\\n日点击榜::dayvisit\\n总推荐榜::allvote\\n月推荐榜::monthvote\\n周推荐榜::weekvote\\n日推荐榜::dayvote\\n总月票榜::allvipvote\\n本月票榜::monthvipvote\\n前月票榜::previpvote\\n周月票榜::weekvipvote\\n日月票榜::dayvipvote\\n总鲜花榜::allflower\\n月鲜花榜::monthflower\\n周鲜花榜::weekflower\\n日鲜花榜::dayflower\\n总鸡蛋榜::allegg\\n月鸡蛋榜::monthegg\\n周鸡蛋榜::weekegg\\n日鸡蛋榜::dayegg\\n总销售榜::allsale\\n月销售榜::monthsale\\n周销售榜::weeksale\\n日销售榜::daysale\\n月勤更榜::monthwords\\n周勤更榜::weekwords\\n日勤更榜::daywords\\n最近更新::lastupdate\\n最新入库::postdate\\n最新上架::signtime\\n收藏榜::goodnum\\n字数榜::words\\n编辑推荐::toptime\\n新书榜::newhot\"\n\npush(\"书库\",\"\",1)\ncats.split(\"\\n\").forEach(cat => {\n\t let [title, id] = cat.split(\"::\")\n\t push(title, `/sort/${id}/{{page}}.html`)\n})\npush(\"排行 - 全本\",\"\",1)\nranks.split(\"\\n\").forEach(rank => {\n\t let [title, rk] = rank.split(\"::\")\n\t push(title, `/modules/article/toplist.php?order=allvisit&fullflag=${rk}&page={{page}}`)\n})\n\nJSON.stringify(list)", "jsLib": "function towan(e) {\n    if(!e) return;\n    if (e < 1e4) {\n        return e + \"字\";\n    } else {\n        return (e / 1e4).toFixed(1) + \"万字\";\n    }\n}", "lastUpdateTime": "1794731346667", "respondTime": 12532, "ruleBookInfo": {"author": "[property$=author]@content", "coverUrl": "[property$=image]@content", "intro": "[property$=description]@content", "kind": "[property$=category]@content&&\n[property$=status]@content&&\n[property$=update_time]@content", "lastChapter": "[property$=latest_chapter_name]@content", "name": "[property$=book_name]@content", "wordCount": "<js>\nlet size = result?.match(/towan\\('\\d+'\\)/)?.[0];\neval(size || \"\")\n</js>"}, "ruleContent": {"content": "<js>\nlet [, aid, cid] = baseUrl.match(/\\/books\\/(\\d+)\\/(\\d+)\\.html/);\nlet url = `https://www.deqixss.com/scripts/chapter.js.php?aid=${aid}&cid=${cid}&referrer=${baseUrl}`;\nlet tokenHtml = java.ajax(url);\neval(String(tokenHtml));\n\nlet params = {\n  aid,\n  cid,\n  token: chapterToken,\r\n  timestamp,\r\n  nonce\n};\nlet paramStr =\tObject.entries(params)\n    .map(x=>x.join(\"=\")).join(\"&\");\nlet headers = {\n\t \"Referer\": baseUrl,\n\t \"Accept\":\t\"text/plain, */*; q=0.01\",\n  \"X-Requested-With\": \"XMLHttpRequest\"\n}\nurl = \"https://www.deqixss.com/modules/article/ajax2.php?\"+paramStr+\",\"+JSON.stringify({\n\t headers\n})\n\njava.ajax(url)\n</js>\n$..content||$.message", "replaceRegex": "@js:\nconst FILTER_RULES = [\n  /更新不易.+?看最新章节！/g,\n  /更新不易.+?看最新无错章节！/g, \n  /更新不易.+?最新小说章节！/g,\n  /速.?读.?谷/g, \n  /本章节未完.+?请订阅/g,\n  '当&前@章#节$内%容^不&完*整！要~查!看-完_整|章;节)请(退&出%阅#读|模*式！',\n  \n]\n\nfor(let reg of FILTER_RULES){\n\t result = result.replace(reg, \"\")\n}\nresult;"}, "ruleExplore": [], "ruleSearch": {"author": ".author.0@text##作者：", "bookList": ".bookbox", "bookUrl": ".bookname a@href", "coverUrl": ".bookname a@href@js:\nlet id = result.match(/\\/(\\d+)\\/$/)[1];\nlet sid = parseInt(id / 1000);\n`/files/article/image/${sid}/${id}/${id}s.jpg`", "intro": ".update@textNodes", "lastChapter": ".cat a@text", "name": ".bookname a@text", "wordCount": "//script/text()@js:\nif(result){\n\t eval(result)\n}"}, "ruleToc": {"chapterList": "#list-chapterAll dd a", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": ".next@href"}, "searchUrl": "https://www.deqixss.com/modules/article/search.php,{\n  \"body\": \"searchkey={{key}}&action=login\",\n  \"method\": \"POST\"\n}", "weight": 0},{"bookSourceName": "篱笆好文学", "bookSourceUrl": "https://m.libahao2.com", "bookSourceGroup": "网络小说", "bookSourceType": 0, "enable": true, "searchUrl": "https://m.libahao2.com/search?q={{key}}&page={{page}}", "ruleSearch": {"bookList": "div.book-item", "name": "h3@text", "author": "span.author@text", "coverUrl": "img@src", "intro": "p.desc@text", "bookUrl": "a@href"}, "ruleBookInfo": {"name": "h1.title@text", "author": "span.author@text", "coverUrl": "img.cover@src", "intro": "div.intro@textNodes", "lastChapter": "div.last-chapter@text"}, "ruleToc": {"chapterList": "div.chapter-list li", "chapterName": "a@text", "chapterUrl": "a@href", "isVolume": false}, "ruleContent": {"content": "div.read-content@html##<div.*?>.*?</div>##"}, "header": {"User‑Agent": "Mozilla/5.0 (Mobile; Android) AppleWebKit/537.36 Chrome/120 Mobile Safari/537.36"}, "lastUpdateTime": "1794657061980"},{"bookSourceComment": "", "bookSourceGroup": "", "bookSourceName": "爱丽丝书屋 (alicesw2.homes)", "bookSourceType": 0, "bookSourceUrl": "https://www.alicesw2.homes/", "bookUrlPattern": "https?://[^/]+/(novel|other/chapters/id)/\\d+\\.html", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": false, "exploreUrl": "", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Mobile Safari/537.36\",\"Referer\":\"https://www.alicesw2.homes/\"}", "lastUpdateTime": "1794655100018", "respondTime": 180000, "ruleBookInfo": {"init": "", "name": "class.mu_h1@tag.h1@text||h1@text", "author": "class.infos@tag.span.0@tag.a@text##作者：|\\s", "coverUrl": "class.cover img@src||img@src", "intro": "class.jianjie@text", "kind": "", "lastChapter": "", "wordCount": "", "tocUrl": "@js:var u=String(baseUrl||'');u.indexOf('/novel/')>-1?u.replace('/novel/','/other/chapters/id/'):u"}, "ruleContent": {"content": "class.content_txt@html||class.read-content@html||class.j_readContent@html||id.content@html||@js:var h=String(result||'');var m=h.match(/<div[^>]*class=\"[^\"]*(?:content_txt|read-content)[^\"]*\"[^>]*>([\\s\\S]*?)<\\/div>/i);out=m?m[1]:'';", "nextContentUrl": "", "replaceRegex": "", "webJs": "", "sourceRegex": ""}, "ruleExplore": {"bookList": ""}, "ruleSearch": {"bookList": "class.list-group-item", "name": "tag.h5@tag.a@text", "author": "class.mb-1@tag.a@text##作者：|\\s", "coverUrl": "", "bookUrl": "tag.h5@tag.a@href##^(?!http)##https://www.alicesw2.homes", "lastChapter": "", "kind": "tag.small@text", "intro": "class.content-txt@text", "wordCount": ""}, "ruleToc": {"chapterList": ":href=\"(/book/[^\"]+)\"[^>]*>([^<]+)", "chapterName": "$2", "chapterUrl": "$1", "nextTocUrl": "", "preUpdateJs": ""}, "searchUrl": "https://www.alicesw2.homes/search.html?q={{key}}&f=_all&sort=relevance&serialize=", "weight": 0},{"bookSourceComment": "爱丽丝书屋 (ALICESW) 书源 v2\n[站点]\n· 繁体站: https://www.alicesw.tw （本书源实际抓取站点）\n· 简体站: https://www.alicesw.com （需代理才能访问，未使用）\n[说明]\n· 原站为繁体，本规则已用 java.t2s() 将书名/作者/分类/简介/章节名/正文/标题统一转为简体\n· 若个别字未转换（如\"著/么\"等），属手机端简繁词典覆盖范围，可在阅读器\"简繁转换\"里二次转换\n· 发现页分组: 最新 / 原创 / 排行(本日·本周·本月·总) / 分类(29个)\n· 排行榜\"总排行\"第一名作者列显示点击量，为站点数据怪癖，非规则错误\n[v2 优化 2026-11-14]\n· 正文净化: 删除站点混入正文尾部的「打賞 評論」功能按钮段（replaceRegex + js 双保险）\n· 正文净化: 删除「p站视频…建议直接下载app + 推广URL」四段连排广告块（含 ---- 分隔线），54008《借讀那兩年》第一章实证；js 链含裸文案行/裸URL行/孤分隔线逐层降级\n· 封面: 站点分类/排行/原创/搜索列表页本身无封面元素（纯文本 li，无 img 无懒加载），详情页封面为 img.321cdn.com 随机 md5 无法从书 id 推导；改为 BookInfo 写 cache + explore/search 读 cache 兜底——进过详情页的书在列表也有封面，零额外请求\n· 修复: tocUrl 原 :contains(查看目錄) 与站点实际链接文字「查看全部章節」不匹配导致目录页取错\n[免责]\n· 网站内容为成人向文学，请自行甄别", "bookSourceGroup": "成人", "bookSourceName": "🔞爱丽丝书屋", "bookSourceType": 0, "bookSourceUrl": "https://www.alicesw.tw", "bookUrlPattern": "https://www\\.alicesw\\.tw/novel/\\d+\\.html", "customButton": false, "customOrder": 88, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreScreen": "", "exploreUrl": "[\n  {\"title\":\"最新\",\"url\":\"\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n  {\"title\":\"最新更新\",\"url\":\"https://www.alicesw.tw/all/order/update_time+desc.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"原创\",\"url\":\"\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n  {\"title\":\"原創專區\",\"url\":\"https://www.alicesw.tw/original.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"排行\",\"url\":\"\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n  {\"title\":\"本日排行\",\"url\":\"https://www.alicesw.tw/other/rank_hits/order/hits_day.html\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"本周排行\",\"url\":\"https://www.alicesw.tw/other/rank_hits/order/hits_week.html\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"本月排行\",\"url\":\"https://www.alicesw.tw/other/rank_hits/order/hits_month.html\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"總排行\",\"url\":\"https://www.alicesw.tw/other/rank_hits/order/hits.html\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"分类\",\"url\":\"\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n  {\"title\":\"科幻\",\"url\":\"https://www.alicesw.tw/lists/71.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"經典\",\"url\":\"https://www.alicesw.tw/lists/79.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"奇幻\",\"url\":\"https://www.alicesw.tw/lists/75.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"系統\",\"url\":\"https://www.alicesw.tw/lists/69.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"武俠\",\"url\":\"https://www.alicesw.tw/lists/68.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"亂倫\",\"url\":\"https://www.alicesw.tw/lists/65.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"都市\",\"url\":\"https://www.alicesw.tw/lists/64.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"鄉村\",\"url\":\"https://www.alicesw.tw/lists/63.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"同人\",\"url\":\"https://www.alicesw.tw/lists/73.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"玄幻\",\"url\":\"https://www.alicesw.tw/lists/62.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"校園\",\"url\":\"https://www.alicesw.tw/lists/61.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"穿越\",\"url\":\"https://www.alicesw.tw/lists/70.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"反差\",\"url\":\"https://www.alicesw.tw/lists/22.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"凌辱\",\"url\":\"https://www.alicesw.tw/lists/46.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"墮落\",\"url\":\"https://www.alicesw.tw/lists/18.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"純愛\",\"url\":\"https://www.alicesw.tw/lists/19.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"偽娘\",\"url\":\"https://www.alicesw.tw/lists/52.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"蘿莉\",\"url\":\"https://www.alicesw.tw/lists/48.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"熟女\",\"url\":\"https://www.alicesw.tw/lists/56.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"正太\",\"url\":\"https://www.alicesw.tw/lists/50.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"明星\",\"url\":\"https://www.alicesw.tw/lists/72.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"NTR\",\"url\":\"https://www.alicesw.tw/lists/54.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"媚黑\",\"url\":\"https://www.alicesw.tw/lists/53.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"調教\",\"url\":\"https://www.alicesw.tw/lists/58.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"言情\",\"url\":\"https://www.alicesw.tw/lists/59.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"百合\",\"url\":\"https://www.alicesw.tw/lists/47.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"耽美\",\"url\":\"https://www.alicesw.tw/lists/82.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"重口\",\"url\":\"https://www.alicesw.tw/lists/21.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"其他\",\"url\":\"https://www.alicesw.tw/lists/57.html?page={{page}}\",\"style\":{\"layout_flexGrow\":1}}\n]\n", "header": "@js:\nJSON.stringify({\n\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36\"\n})\n", "lastUpdateTime": "1794646683605", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=\"og:novel:author\"]@content<js>java.t2s(String(result))</js>", "coverUrl": "meta[property=\"og:image\"]@content||div.imgbox img@src<js>var u=String(result);if(u&&u.indexOf('//')<0){u='https://www.alicesw.tw'+u;}if(u&&book&&book.bookUrl){cache.put('asw_cov_'+book.bookUrl,u);}u</js>", "intro": "div.jianjie@text<js>java.t2s(String(result))</js>", "kind": "meta[property=\"og:novel:category\"]@content<js>java.t2s(String(result))</js>", "lastChapter": "meta[property=\"og:novel:latest_chapter_name\"]@content<js>java.t2s(String(result))</js>", "name": "meta[property=\"og:novel:book_name\"]@content<js>java.t2s(String(result))</js>", "tocUrl": "a:contains(查看全部章節)@href||a:contains(查看目錄)@href##^##https://www.alicesw.tw"}, "ruleContent": {"content": "div.content_txt p@textNodes<js>var t=String(java.t2s(String(result))); t=t.replace(/!\\[([^\\]]*)\\]\\(([^)]*)\\)/g,''); t=t.replace(/^[\\u3000 \\t]*(?:章节|章節)\\d+\\s*$/gm,''); t=t.replace(/(?:^|\\n)[ \\t\\u3000]*-{5,}[ \\t\\u3000]*\\n[ \\t\\u3000]*p站视[频頻][^\\n]*下[载載]app[^\\n]*\\n[ \\t\\u3000]*https?:\\/\\/[^\\s]+[ \\t\\u3000]*\\n[ \\t\\u3000]*-{5,}[ \\t\\u3000]*(?=\\n|$)/g,'');t=t.replace(/^[ \\t\\u3000]*p站视[频頻][^\\n]*下[载載]app[^\\n]*$/gm,'');t=t.replace(/^[ \\t\\u3000]*https?:\\/\\/[^\\s]+[ \\t\\u3000]*$/gm,'');t=t.replace(/(?:^|\\n)[ \\t\\u3000]*-{5,}[ \\t\\u3000]*\\n[ \\t\\u3000]*本文件[来來]自[^\\n]*\\n(?:[ \\t\\u3000]*[发發][布佈][页頁]\\d*[：:][^\\n]*\\n?)+[ \\t\\u3000]*-{5,}[ \\t\\u3000]*(?=\\n|$)/g,'');t=t.replace(/^[ \\t\\u3000]*本文件[来來]自[^\\n]*$/gm,'');t=t.replace(/^[ \\t\\u3000]*[发發][布佈][页頁]\\d*[：:][^\\n]*$/gm,'');t=t.replace(/打[赏賞][ \\t\\u3000]*评[论論][ \\t\\u3000]*/g,'');t</js>", "replaceRegex": "##(?s)[ \\t\\u3000]*-{5,}[ \\t\\u3000]*\\n[ \\t\\u3000]*p站视[频頻][^\\n]*下[载載]app[^\\n]*\\n[ \\t\\u3000]*https?://[^\\s]+[ \\t\\u3000]*\\n[ \\t\\u3000]*-{5,}[ \\t\\u3000]*|(?s)[ \\t\\u3000]*-{5,}[ \\t\\u3000]*\\n[ \\t\\u3000]*本文件[来來]自[^\\n]*\\n(?:[ \\t\\u3000]*[发發][布佈][页頁]\\d*[：:][^\\n]*\\n?)+[ \\t\\u3000]*-{5,}[ \\t\\u3000]*|打[赏賞][ \\t\\u3000]*评[论論][ \\t\\u3000]*##", "title": "h1#chapterTitle@text||h3@text<js>java.t2s(String(result))</js>"}, "ruleExplore": {"author": "span.s5@text||li.four@text<js>java.t2s(String(result))</js>", "bookList": "ul.txt-list li||div.rec_rullist ul", "bookUrl": "span.s2 a@href||li.two a@href<js>'https://www.alicesw.tw' + result</js>", "coverUrl": "span.s2 a@href||li.two a@href<js>var u='https://www.alicesw.tw'+String(result);var c=cache.get('asw_cov_'+u);c?c:''</js>", "kind": "span.s2 a@text||li.sev a@text<js>var t=String(result).replace(/^\\[([^\\]]+)\\].*$/,'$1').replace(/小說$/,''); java.t2s(t)</js>", "lastChapter": "li.three a@text<js>java.t2s(String(result))</js>", "name": "span.s2 a@text||li.two a@text<js>var t=String(result).replace(/^\\[[^\\]]+\\]\\s*/,''); java.t2s(t)</js>", "wordCount": "li.five@text"}, "ruleSearch": {"author": "p.mb-1 a@text<js>java.t2s(String(result))</js>", "bookList": ".list-group-item", "bookUrl": "h5 a@href##^##https://www.alicesw.tw", "checkKeyWord": "加樂園", "coverUrl": "h5 a@href<js>var u='https://www.alicesw.tw'+String(result);var c=cache.get('asw_cov_'+u);c?c:''</js>", "intro": "p.content-txt@text<js>java.t2s(String(result))</js>", "name": "h5 a@text<js>var t=String(result).replace(/^\\d+\\.\\s*/,''); java.t2s(t)</js>"}, "ruleToc": {"chapterList": "ul.section-list li", "chapterName": "a@text<js>java.t2s(String(result))</js>", "chapterUrl": "a@href##^##https://www.alicesw.tw"}, "searchUrl": "https://www.alicesw.tw/search.html?q={{key}}&f=_all&p={{page}}", "weight": 0},{"bookSourceComment": "同人小说网 trxs.cc｜全站 GB2312。★★★ 本站有 60 秒搜索冷却（返回“系统限制的搜索时间间隔为 60 秒”提示页，该页没有书籍列表，App 会显示“获取成功但列表为空”）。所以：一次搜索没结果时不要连点，等 1 分钟再搜一次；也不要在网页上刚搜过就马上用 App 搜。★ 首次使用先点书源菜单【登录】，在弹出的网页里等 Cloudflare 的 Just a moment... 自动跳转完成再返回，Cookie 会保存。本版已去掉 loginCheckJs（它会误判登录失败）。目录只有“第N节”是站点自身限制。", "bookSourceGroup": "同人", "bookSourceName": "同人小说网(trxs)", "bookSourceType": 0, "bookSourceUrl": "https://trxs.cc", "customButton": false, "customOrder": 16, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "同人小说::/tongren/<,index_{{page}}.html>\n全本同人::/tags-150-{{page-1}}.html\n连载同人::/tags-151-{{page-1}}.html\n排行榜单::/hot/<,index_{{page}}.html>", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1794642097942", "loginUrl": "https://trxs.cc", "respondTime": 180000, "ruleBookInfo": {"author": ".date>a@text", "coverUrl": ".pic img@src", "intro": ".infos p@html", "kind": ".menNav a.1@text", "name": "h1@text##\\((全本|完结|\\d+[-~]\\d+)\\)$"}, "ruleContent": {"content": ".read_chapterDetail p@text", "replaceRegex": "##^本章完.*|All Rights Reserved.*|Powered by.*"}, "ruleExplore": {"author": ".booknews@textNodes##作者[:：]\\s*|\\s+$", "bookList": ".bk", "bookUrl": "tag.a.0@href", "coverUrl": "img@src", "intro": "p@text", "lastChapter": "label.date@text", "name": "h3@text##\\((全本|完结|\\d+[-~]\\d+)\\)$", "wordCount": "label.size@text"}, "ruleSearch": {"author": ".booknews@textNodes##作者[:：]\\s*|\\s+$", "bookList": ".bk", "bookUrl": "tag.a.0@href", "coverUrl": "img@src", "intro": "p@text", "lastChapter": "label.date@text", "name": "h3@text##\\((全本|完结|\\d+[-~]\\d+)\\)$", "wordCount": "label.size@text"}, "ruleToc": {"chapterList": ".book_list a", "chapterName": "text##^\\s+", "chapterUrl": "href"}, "searchUrl": "/e/search/index.php,{\"charset\":\"gb2312\",\"method\":\"POST\",\"body\":\"keyboard={{key}}&show=title&classid=0\"}", "weight": 0},{"bookSourceComment": "同人小说网 trxs.cc（参考官方优质源 id 7890 结构修正）｜全站 GB2312。★★ 使用前必须先过验证：点书源菜单【登录】→ 在弹出的网页里等 Cloudflare 的“Just a moment...”自动跳转完成，出现网站页面后返回即可，Cookie 会保存。不先过验证，搜索会被挑战页拦截并报 ClassCastException。★ 本版已去掉 loginCheckJs（原来源没有，它的存在会让登录流程被判失败），登录地址改为站点首页。目录只有“第N节”是站点自身限制。", "bookSourceGroup": "同人", "bookSourceName": "同人小说网(trxs)", "bookSourceType": 0, "bookSourceUrl": "https://trxs.cc", "customButton": false, "customOrder": 16, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "同人小说::/tongren/<,index_{{page}}.html>\n全本同人::/tags-150-{{page-1}}.html\n连载同人::/tags-151-{{page-1}}.html\n排行榜单::/hot/<,index_{{page}}.html>", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1794640976421", "loginUrl": "https://trxs.cc", "respondTime": 180000, "ruleBookInfo": {"author": ".date>a@text", "coverUrl": ".pic img@src", "intro": ".infos p@html", "kind": ".menNav a.1@text", "name": "h1@text##\\(\\S+"}, "ruleContent": {"content": ".read_chapterDetail p@text", "replaceRegex": "##^本章完.*|All Rights Reserved.*|Powered by.*"}, "ruleExplore": {"author": ".booknews@textNodes##作者[:：]\\s*|\\s+$", "bookList": ".bk", "bookUrl": "tag.a.0@href", "coverUrl": "img@src", "intro": "p@text", "lastChapter": "label.date@text", "name": "h3@text", "wordCount": "label.size@text"}, "ruleSearch": {"author": ".booknews@textNodes##作者[:：]\\s*|\\s+$", "bookList": ".bk", "bookUrl": "tag.a.0@href", "coverUrl": "img@src", "intro": "p@text", "lastChapter": "label.date@text", "name": "h3@text", "wordCount": "label.size@text"}, "ruleToc": {"chapterList": ".book_list a", "chapterName": "text##^\\s+", "chapterUrl": "href"}, "searchUrl": "/e/search/indexsearch.php,{\"charset\":\"gb2312\",\"method\":\"POST\",\"body\":\"keyboard={{key}}&show=title&classid=0\"}", "weight": 0},{"bookSourceComment": "【第一版主·言璃版 v4】\n更新日期：2026-08-19\n\n本次更新：\n1. 修复搜索无结果——搜索词改为按 GBK 编码提交（网站只认 GBK，UTF-8 会返回空）\n2. 搜索改为 GET 方式（POST 方式返回空结果）\n3. 去掉书源URL末尾的 /##（它会破坏 URL 拼接）\n4. 补全发现页解析规则（列表/书名/书链接/作者/最新章节/字数）\n5. 按真实网页结构修正搜索页选择器\n\n────────────\n\n第一版主网址导航：\nhttps://dddyyybbbzzz.xyz/\n\n网址：\nhttps://www.bz4444444.net/\nhttps://www.bz444444444.com/\nhttps://www.banzhu44444444.net/\n\n点「登录」= 进入网站手动过验证\n\n如果无法访问小说了，就重新登录网站再次手动验证，一般就可以解决问题了。", "bookSourceGroup": "R18", "bookSourceName": "第一版主·言璃版", "bookSourceType": 0, "bookSourceUrl": "https://www.banzhu44444444.net", "bookUrlPattern": "", "concurrentRate": "3", "customOrder": -48, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "[{\"title\":\"全部\",\"url\":\"/shuku/0-lastupdate-0-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"连载中\",\"url\":\"/shuku/0-lastupdate-1-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"已完本\",\"url\":\"/shuku/0-lastupdate-2-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"总人气\",\"url\":\"/shuku/0-allvisit-0-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"月人气\",\"url\":\"/shuku/0-monthvisit-0-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"字数\",\"url\":\"/shuku/0-size-0-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"新书\",\"url\":\"/shuku/0-postdate-0-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"玄幻奇幻\",\"url\":\"/shuku/1-lastupdate-0-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"武侠仙侠\",\"url\":\"/shuku/2-lastupdate-0-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"都市言情\",\"url\":\"/shuku/3-lastupdate-0-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"穿越历史\",\"url\":\"/shuku/4-lastupdate-0-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"科幻灵异\",\"url\":\"/shuku/5-lastupdate-0-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"藏经阁\",\"url\":\"/shuku/6-lastupdate-0-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"其他类别\",\"url\":\"/shuku/7-lastupdate-0-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\" \",\"url\":\" \",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}}]", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; U; Android 8.1.0; zh-CN; MI 8 Lite Build/OPM1.171019.019) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 UCBrowser/13.2.0.1100 Mobile Safari/537.36\"}", "lastUpdateTime": "1794572725333", "loginCheckJs": "", "loginUi": "", "loginUrl": "https://www.banzhu44444444.net/", "respondTime": 60000, "ruleBookInfo": {"author": "", "coverUrl": "", "init": "", "intro": ".bd.2@text", "kind": "", "lastChapter": "ul.list.0@li.0@text", "name": "h1@text", "wordCount": ""}, "ruleContent": {"content": "<js>\nfunction x(a, b) {\n\tresult = String(result).replace(a, b);\n}\n//debug\nfunction d(debug) {\n\tjava.log(debug);\n\tjava.log(result);\n}\n\n//同时加载多章时，自动验证成功后有的页面加载失败时重新获取\nif(/<div\\s*class=\"title\"\\s*>.*1234/.test(src)){\n \t//重新设置正文解析内容\n\tjava.setContent(java.ajax(baseUrl));\n}\n\n//获取正文内容\nresult = java.getString('.page-content@tag.p.0@html');\n\n//大概第四页正文有切割，需要调接口获取这一页剩余正文\nif (/\\$.post\\('',{'j':'1'}/.test(src)) {\n\tresult += java.ajax(String(baseUrl + ',' + JSON.stringify({\n\t\t\"method\": \"POST\",\n\t\t\"body\": \"j=1\"\n\t})))\n}\n\n//d(\"正文\"+baseUrl)\n\n//有问题修改下面正则 两个br标签换行显示\nx(/((\\s*)<br>\\n?){2}/g,\"<br><br>\");\n//d('1.0:')\nx(/<script.*<\\/script>/g,\"\");\n\ntry {\n\t// Aes解密\n\tsecret = src.match(/=\\s*secret\\(\\s*['\"](.+?)['\"],[\\s]*['\"](.+?)['\"],[^);]*?/);\n\tstring = secret[1]\n\tcode = java.md5Encode(secret[2]);\n\tiv = code.substring(0, 16);\n\tkey = code.substring(16);\n\t//java.log(baseUrl + \" Aes解密ok：\" + code + \"\\n\" + iv + \"\\n\" + key)\n\tresult = java.createSymmetricCrypto(\"AES/CBC/PKCS7Padding\", key, iv).decryptStr(string);\n} catch (err) {\n\ttry {\n\t\t// 乱序恢复\n\t\tns = java.base64Decode(src.match(/var ns='(.+?)';/)[1]).split(',');\n\t\t//java.log(baseUrl + \"乱序恢复ok\")\n\t\tparagraphArr = result.split('<br><br>');\n\t\tresult = \"\";\n\t\tfor (i = 1; i <= paragraphArr.length; i++) {\n\t\t\tresult += paragraphArr[ns[i] - ns[0]] + '<br><br>';\n\t\t}\n\t} catch (err) {\n\t\t//java.log(baseUrl + \"乱序恢复Aes解密no\")\n\t}\n}\n\n//初始化图片链接\nx(/(<img\\s+)data\\-cfsrc=\"[^\"]+\"/g,\"$1\");\nx(/[\\r\\n]?[\\t ]*<img .+?toimg\\/data\\/([^\\.]+)[^>]+>[\\t ]*[\\r\\n]?/g, \"#$1#\");\n\n//初始化字体格式的文字,匹配<i>&#xe800</i>\nx(/<i>(.*?)<\\/i>/g, function(str, p1) {\n\t//java.log(p1.charCodeAt().toString(16));\n\t//返回16进制，例：p1=&#xe800 返回格式#e800#\n\treturn '#' + p1.charCodeAt().toString(16) + '#'\n})\n//d('2.0:')\n\n//转换空格\nx(/&nbsp;/g, ' ');\n//初始化分段准备\nx(/[\\t  ]{2,2}/g, \"　\");\n\n//去掉标签里的属性\nx(/(\\<|&lt;)([^\\>]*?)(\\s|&nbsp;)[^\\>]*(\\>|&gt;)/g, \"<$2>\");\n//d('2.1:')\n//段落换行\nx(/\\s*(\\n|<br\\/?>)+\\s*(　{2,})?/gi, \"\\r\\n\");\n//d('3.0:')\n//去掉不需要的标签\nx(/([\\r\\n　]*\\<\\/?([A-Za-z]*)?\\>[\\r\\n　]*)/gi, \"\");\n\n//引号替换\nx(/‘/g, \"『\");\nx(/’/g, \"』\");\nx(/“/g, \"「\");\nx(/”/g, \"」\");\n\nif (/(Undefined|(^\\s*$))/.test(result)) {\n\tresult =\n\t\t\"<br/>　　网站分页有时有问题不可用，速度慢的时候就会是现在这样了，网站速度快的时候就没事了。<br/>　　换个时间刷新试试！！！<br/>　　换个时间刷新试试！！！<br/>　　换个时间刷新试试！！！<br/>\" + result;\n}\n\n//d(\"正文\"+baseUrl)\n\"\\r\\n\" + result + \"hereispagebreak\";\n</js>", "imageStyle": "TEXT", "nextContentUrl": ".chapterPages@tag.a!0@href@js:\nfor (let i in result) {\n\tresult[i] = String(result[i]).replace(/.+?\\('\\d+','\\d+','(\\d+)','(\\d+)'\\).+?/, (str, p1, p2) => p1 + '_' + p2 + '.html');\n}\nresult", "replaceRegex": "<js>\nfunction d(debug) {\n\tjava.log(debug);\n\tjava.log(result);\n}\n/*\nfunction x(a, b, c) {\n\tif (c) {\n\t\twhile (c.exec(result)) {\n\t\t\treplace(a, b)\n\t\t}\n\t\treturn false\n\t}\n\treplace(a, b)\n}\n*/\nfunction x(a, b, c) {\n\tif (!c) return replace(a, b);\n\twhile (c.exec(result)) {\n\t\treplace(a, b)\n\t}\n}\nfunction replace(a, b) {\n\tresult = String(result).replace(a, b);\n}\n\n// 拼音还原\nx(/#1040782805#/gi,\"奸\");\nx(/#1063785572#/gi,\"搞\");\nx(/#1082275499#/gi,\"台\");\nx(/#1218400718#/gi,\"虐\");\nx(/#1697595086#/gi,\"斩\");\nx(/#1801354585#/gi,\"勃\");\nx(/#1810002091#/gi,\"九\");\nx(/#1947937898#/gi,\"粉\");\nx(/#2022721869#/gi,\"粉\");\nx(/#2033008053#/gi,\"撸\");\nx(/#2063259833#/gi,\"色\");\nx(/#2090369734#/gi,\"熟\");\nx(/#2173857009#/gi,\"高\");\nx(/#2174754224#/gi,\"暴\");\nx(/#2276251664#/gi,\"嫩\");\nx(/#2293535402#/gi,\"兽\");\nx(/#2444947917#/gi,\"性\");\nx(/#2471389451#/gi,\"湿\");\nx(/#2525826615#/gi,\"狗\");\nx(/#2548022544#/gi,\"狗\");\nx(/#2553168545#/gi,\"穴\");\nx(/#2633701054#/gi,\"棒\");\nx(/#2761875847#/gi,\"胸\");\nx(/#2769203094#/gi,\"未\");\nx(/#2781961287#/gi,\"厥\");\nx(/#2811411890#/gi,\"亡\");\nx(/#2965616717#/gi,\"爱\");\nx(/#3043454467#/gi,\"日\");\nx(/#3089649511#/gi,\"宫\");\nx(/#3296363576#/gi,\"欲\");\nx(/#3309926634#/gi,\"宰\");\nx(/#3342690501#/gi,\"舌\");\nx(/#3382216428#/gi,\"义\");\nx(/#3746262645#/gi,\"舔\");\nx(/#3893173869#/gi,\"介\");\nx(/#4006928252#/gi,\"吞\");\nx(/#4017050851#/gi,\"交\");\nx(/#0678663477#/gi,\"情\");\nx(/#5736430795#/gi,\"内\");\nx(/#5110754259#/gi,\"吸\");\nx(/#9763512263#/gi,\"美\");\nx(/#0923672614#/gi,\"死\");\nx(/#5318824731#/gi,\"妈\");\nx(/#6197424834#/gi,\"中\");\nx(/#9925956069#/gi,\"处\");\nx(/#0486110525#/gi,\"水\");\nx(/#6378369235#/gi,\"胡\");\nx(/#5732450242#/gi,\"母\");\nx(/#8087788059#/gi,\"国\");\nx(/#6259252852#/gi,\"杀\");\nx(/#6514831790#/gi,\"血\");\nx(/#7228562021#/gi,\"纪\");\nx(/#7051993783#/gi,\"硬\");\nx(/#9636759436#/gi,\"药\");\nx(/#6789528781#/gi,\"学\");\nx(/#5213317466#/gi,\"具\");\nx(/#9134848937#/gi,\"做\");\nx(/#5910985788#/gi,\"足\");\nx(/#7074467222#/gi,\"逼\");\nx(/#5265224411#/gi,\"干\");\nx(/#9860153795#/gi,\"麻\");\nx(/#4933790542#/gi,\"枪\");\nx(/#8698737337#/gi,\"奶\");\nx(/#7051410763#/gi,\"马\");\nx(/#4740869798#/gi,\"操\");\nx(/#8478694653#/gi,\"主\");\nx(/#6855685283#/gi,\"摇\");\nx(/#6281647881#/gi,\"流\");\nx(/#0423651377#/gi,\"插\");\nx(/#4808579862#/gi,\"臀\");\nx(/#5946892177#/gi,\"淫\");\nx(/#4481675898#/gi,\"荡\");\nx(/#8280163404#/gi,\"蛋\");\nx(/#9308659858#/gi,\"射\");\nx(/#0961296593#/gi,\"弹\");\nx(/#5229950952#/gi,\"肉\");\nx(/#5260398634#/gi,\"指\");\nx(/#6050660618#/gi,\"屁\");\nx(/#5969522288#/gi,\"亲\");\nx(/#5429058065#/gi,\"弟\");\nx(/#5366734122#/gi,\"共\");\nx(/#6957748176#/gi,\"尸\");\nx(/#9928120606#/gi,\"腿\");\nx(/#0551252288#/gi,\"龟\");\nx(/#7618693335#/gi,\"呻\");\nx(/#0975893408#/gi,\"吟\");\nx(/#0026372214#/gi,\"丝\");\nx(/#5318162318#/gi,\"贱\");\nx(/#0720742117#/gi,\"乳\");\nx(/#4488426878#/gi,\"缝\");\nx(/#6768988724#/gi,\"鸡\");\nx(/#0092238155#/gi,\"阴\");\nx(/#0551722925#/gi,\"唇\");\nx(/#6534003186#/gi,\"蜜\");\nx(/#5518664754#/gi,\"骚\");\nx(/#4668655063#/gi,\"潮\");\nx(/#4766000693#/gi,\"精\");\nx(/#8666880661#/gi,\"凌\");\nx(/#5105645092#/gi,\"温\");\nx(/#5329628684#/gi,\"辱\");\nx(/#0473556214#/gi,\"含\");\nx(/#4472054519#/gi,\"咪\");\nx(/#7508904751#/gi,\"帮\");\nx(/#0783213298#/gi,\"丁\");\nx(/#9821815185#/gi,\"裸\");\nx(/#0146287633#/gi,\"露\");\nx(/#0756494362#/gi,\"偷\");\nx(/#5710915044#/gi,\"童\");\nx(/#8954155954#/gi,\"炮\");\nx(/#5004143384#/gi,\"乱\");\nx(/#9829762678#/gi,\"妇\");\nx(/#4538628495#/gi,\"挤\");\nx(/#9173059916#/gi,\"毒\");\nx(/#9720548295#/gi,\"杜\");\nx(/#7130632296#/gi,\"席\");\nx(/#8993789017#/gi,\"洞\");\nx(/#5758773674#/gi,\"棍\");\nx(/#5245263419#/gi,\"轮\");\nx(/#0261725863#/gi,\"泽\");\nx(/#9572021917#/gi,\"尿\");\nx(/#8926554707#/gi,\"炸\");\nx(/#0351216125#/gi,\"坑\");\nx(/#0050897572#/gi,\"涛\");\nx(/#4436421269#/gi,\"党\");\nx(/#8997927012#/gi,\"灭\");\nx(/#8592042303#/gi,\"腐\");\nx(/#6560841485#/gi,\"伦\");\nx(/#1607055014#/gi,\"酸\");\nx(/#2158558763#/gi,\"幼\");\nx(/#8051876761#/gi,\"漪\");\nx(/#4704630913#/gi,\"茎\");\nx(/#0519063805#/gi,\"秽\");\nx(/#8861933232#/gi,\"婊\");\nx(/#8261828414#/gi,\"肛\");\nx(/#8025291368#/gi,\"锦\");\nx(/#0813524594#/gi,\"妓\");\nx(/#2729628100#/gi,\"颅\");\nx(/#4510436554#/gi,\"菊\");\nx(/#1024850854#/gi,\"嫡\");\n//字体格式文字替换\n//替换格式规则  x(/#正则#/gi,\"文本\");\n//例：一般在字体编辑器复制出来对应的编号 uniE800或者$E800为\"的\"这个字,  正则替换格式：\n\n//净化替换\nx(/([^\\n]*?(手.?机.?看.?[小片](.?[书说])?|搜?.{0,4}索?.{0,4}第.{0,4}一.{0,4}版.{0,4}主)[^\\n]*)/gi,\"\");\nx(/([^\\n]*([最樶]新.?)?[地网].?[址祉阯].?[发發沷].?[布怖].?[页頁]?[\\:：]?[1１4４]?[^\\n]*)/g,\"\");\nx(/([^\\n]*([最寻找发].{0,3}[新回].{0,3}[网地{0,3}[址阯])[^\\n]*)/gi,\"\");\nx(/([^\\n]*\\\\u5730\\\\u5740\\\\u767c\\\\u5e03\\\\u9801[^\\n]*)/gi,\"\");\nx(/([^\\n]*[1１][a-zA-Zａ-ｚＡ-Ｚ][2２][a-zA-Zａ-ｚＡ-Ｚ][3３][a-zA-Zａ-ｚＡ-Ｚ]([4４][a-zA-Zａ-ｚＡ-Ｚ])?[^<\\r\\n]*)/gi,\"\");\nx(/([^\\n]*ＹＹＤＳＴxＴ(．ＣＣ)?[^\\n]*)/,\"\");\nx(/(.*[0０][1１][bЪｂ][ｚz].*)/gi,\"\");\nx(/(.*[真发即百更].?[正送可度多].?[网电获搜精].?[站子得索彩].?\\s?[请邮最第小].*)/gi,\"\");\nx(/([^<\\n]*?手.机.看.小.[书说][^\\n]*)/gi,\"\");\nx(/(ｂｚ２０２１)[^<\\n]+/gi,\"\");\nx(/(手机阅读小说：７７７８８７７[^\\n]*)/gi,\"\");\nx(/(diyibanzhu@gmail.com)/gi,\"\");\n(/((（待续）|(地~址~)|(手机看片))[^\\n]*)/gi,\"\");\nx(/([^\\n]*#chao#.+?#lian#.+?#jie#[^\\n]*)/gi,\"\");\nx(/([^\\n]*[wШЩ]*?.*[c℃ㄈＣ][oО⊙ò〇Ο０][mмММΜ][^\\n]*)/gi,\"\");\nx(/([^\\n]*使用chrome谷歌浏览[^\\n]*)/gi,\"\");\nx(/（苹果手机使用.+/g,\"\");\nx(/.*((５|６|７|８)X)+.*/g,\"\");\nx(/www.diyibanzhu.net/g,\"\");\n\n//分页后的断行还原\nx(/([\\r\\n]?\\s*(hereispagebreak)[\\r\\n]?\\s*)/gi, \"\");\n\n//35字换行排版恢复\nx(/([\\r\\n])((tjjtds)?.{33,39}[，、．～…\"：；'—『「\\u4e00-\\u9fa5][\\r\\n])\\s{2}/gi, \"$1$2tjjtds\", /([\\r\\n])((tjjtds)?.{33,39}[，、．～…\"：；'—『「\\u4e00-\\u9fa5][\\r\\n])\\s{2}/gi);\n\n// 换行修复\n//x(/([\\r\\n])((tjjtds)?.{33,39}[，、．～…\"：；'—『「\\u4e00-\\u9fa5][\\r\\n])\\s{2}/gi, \"$1$2tjjtds\", 1);\n\nx(/[\\r\\n](tjjtds|　+?[\\r\\n])/g, \"\");\n//为防万一，去掉汉字之间的空格\nx(/([\\u4e00-\\u9fa5])[ 　]+([\\u4e00-\\u9fa5])/g, '$1$2');\n//去掉多余换行\nx(/[\\r\\n]{2,}/g, \"\\r\\n\")\n\nx(/([「][^」]+)\\s*\\n\\s*/g, \"$1\", /([「][^」]+)\\s*\\n\\s*/g);\nx(/([\\u4e00-\\u9fa5][『「][^，。？！：；]{1,12}[」』])\\s+/g, \"$1\");\nx(/([。！？…])([『「])/g, \"$1\\r\\n　　$2\");\n// 日期换行\nfunction dateBreak(){\n  let reg = /^.{1,100}/;\n  let r100 = result.match(reg);\n  if(r100 && r100[0]){\n    let str = r100[0];\n    let reg2 = /(\\d+年\\d+月\\d+日)/\n    if(reg2.test(str)){\n      result = result.replace(reg,str.replace(reg2,'$1\\r\\n'));\n    }\n  }\n}\ndateBreak()\nx(/([\\u4e00-\\u9fa5])\\s+([\\u4e00-\\u9fa5])/g,'$1$2');\nresult;\n</js>"}, "ruleExplore": {"author": ".info@a.0@text", "bookList": ".bd@.column-2", "bookUrl": ".name@href", "coverUrl": "", "intro": "p.info.1@text", "kind": "span.0@text&&p.info.1@text##更新：", "lastChapter": ".update@a@text", "name": ".name@text", "wordCount": ".info@span@text##字数："}, "ruleSearch": {"author": ".info.0@text##作者：##", "bookList": ".column-2", "bookUrl": ".name@href", "checkKeyWord": "", "coverUrl": "@js:'http://m.diyibanzhu.quest/images/jipin-default.jpg'", "intro": "", "kind": "", "lastChapter": ".update@a@text", "name": ".name@text", "wordCount": ".words@text##字数：##"}, "ruleToc": {"chapterList": ".chapter-list.1@li", "chapterName": "a@text", "chapterUrl": "a@href", "nextTocUrl": "text.下页@href"}, "searchUrl": "/s.php?objectType=2&type=articlename&s={{java.encodeURI(String(key),'GBK')}}&page={{page}},{\n\t\"charset\":\"gbk\",\n\t\"headers\":{\"Referer\":\"https://www.banzhu44444444.net/\",\"Origin\":\"https://www.banzhu44444444.net\"}\n}", "weight": 0},{"bookSourceComment": "2026.11 修正版：bookList 改为 .section1.inner ul li，去除 :has()", "bookSourceGroup": "页面简洁、干净、爽朗，所有小说免费", "bookSourceName": "🌈土豆小说网", "bookSourceType": 0, "bookSourceUrl": "https://spudnovel.com", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "[\n    {\"title\":\"男生频道\",\"url\":\"/site/list?sex=2&page={{page}}\"},\n    {\"title\":\"女生频道\",\"url\":\"/site/list?sex=0&page={{page}}\"},\n    {\"title\":\"全本小说\",\"url\":\"/site/list?finish=1&page={{page}}\"},\n    {\"title\":\"连载小说\",\"url\":\"/site/list?finish=0&page={{page}}\"},\n    {\"title\":\"双男主\",\"url\":\"/site/list?cid=475&page={{page}}\"},\n    {\"title\":\"双女主\",\"url\":\"/site/list?cid=580&page={{page}}\"},\n    {\"title\":\"都市日常\",\"url\":\"/site/list?cid=385&page={{page}}\"},\n    {\"title\":\"悬疑脑洞\",\"url\":\"/site/list?cid=332&page={{page}}\"}\n]", "header": "User-Agent: Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36", "loginUrl": "https://spudnovel.com/site/login", "respondTime": 180000, "ruleBookInfo": {"author": "@css:.book-detail-info p:contains(作者：)@text##作者：##\u0001", "coverUrl": "@css:.book-img img@src", "intro": "@css:.intro@text", "kind": "@css:.tag-box a@text", "lastChapter": "@css:.book-detail-info p:contains(最新：)@text##最新：##\u0001", "name": "@css:.book-detail-info h2@text", "wordCount": "@css:.book-detail-info p:contains(字数：)@text##字数：##\u0001"}, "ruleContent": {"content": "@css:.entry-content p@textNodes##\\s*", "nextContentUrl": "@css:nav.nav-single a[rel=next]@href", "title": "@css:.single-header .title@text"}, "ruleExplore": {"bookList": "@css:.section1.inner ul li", "name": "@css:.book-info h3 a@text##《|》", "author": "@css:.book-info p.author:contains(作者：) a@text", "bookUrl": "@css:.book-img a@href", "coverUrl": "@css:.book-img img@src", "intro": "@css:.book-info p[style*='float']@text", "kind": "@css:.book-info .type a@text", "wordCount": "@css:.book-info span.author:first-child@text"}, "ruleSearch": {"bookList": "@css:.section1.inner ul li", "name": "@css:.book-info h3 a@text##《|》", "author": "@css:.book-info p.author:contains(作者：) a@text", "bookUrl": "@css:.book-img a@href", "coverUrl": "@css:.book-img img@src", "intro": "@css:.book-info p[style*='float']@text", "kind": "@css:.book-info .type a@text", "lastChapter": "@css:.book-info p.author:contains(最新：) a@text", "wordCount": "@css:.book-info span.author:first-child@text", "checkKeyWord": "system"}, "ruleToc": {"chapterList": "@css:.book-catalog.inner.mt20 ul li", "chapterName": "tag.a@text", "chapterUrl": "tag.a@href", "isPay": "false", "isVip": "false"}, "searchUrl": "/site/list?q={{key}}", "weight": 0, "concurrentRate": "1000", "lastUpdateTime": "1794568641807"},{"bookSourceGroup": "纯接口,API", "bookSourceName": "📖 星辰小说", "bookSourceType": 0, "bookSourceUrl": "https://quickapi.biduwenxue.com/api/xingchen", "bookUrlPattern": "https?://(?:quickapi|m|api|imgcdn)[a-z0-9.\\-]*\\.biduwenxue\\.com/api/book/info\\?.*?bookId=\\d+", "concurrentRate": "1/800", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:(function(){\n  // 读当前 API 线路（多通道兜底，@js 环境绑定差异大）\n  var B='';\n  try{B=XC_base()}catch(e0){}\n  if(!B){try{B=XC_ok(source.get('xcLine'))}catch(e1){}}\n  if(!B){try{var vv=String(this.source.getVariable()||'');var oo=vv?(JSON.parse(vv)||{}):{};B=XC_ok(oo.xcLine)}catch(e2){}}\n  if(!B){try{B=XC_ok(java.get('xcLine'))}catch(e3){}}\n  if(!B){try{B=XC_ok(cache.get('xcLine'))}catch(e4){}}\n  if(!B)B='https://quickapi.biduwenxue.com';\n  if(String(B).indexOf('http')!==0)B='https://quickapi.biduwenxue.com';\n  B=String(B).replace(/\\/+$/,'');\n  var OPT=JSON.stringify({method:'POST',body:'x=1',headers:{'Content-Type':'application/x-www-form-urlencoded'}});\n  // 选中频道：infoMap 优先（select 真机注入）→ java.get 兜底 → 默认男频\n  var ch='',hasIm=false;\n  try{if(typeof infoMap!=='undefined'&&infoMap['频道']){ch=String(infoMap['频道']);hasIm=true}}catch(e5){}\n  if(!hasIm){try{var v2=String(java.get('xcChannel')||'');if(v2)ch=v2}catch(e6){}}\n  if(ch!=='男频'&&ch!=='女频')ch='男频';\n  var pd=(ch==='男频')?1:2, mark=(ch==='男频')?'♂ ':'♀ ';\n  // 全部条目均来自 ProxyPin 抓包中 App 真实操作的接口与响应：\n  //   allCategorys(男17/女7) / book.rankList(男女各3榜) /\n  //   columnList(appname=lingmao-android -> 男生id9 女生id10) /\n  //   columnContent(每栏目3个 xmbdName) / xmbd.bookList(xmbdId 36..41)\n  var CFG={\"男频\": {\"colId\": 9, \"colName\": \"男生\", \"lists\": [[36, \"老书虫热推\"], [37, \"全网齐上新\"], [38, \"经典耐看\"]]}, \"女频\": {\"colId\": 10, \"colName\": \"女生\", \"lists\": [[39, \"通勤路上看\"], [40, \"午休睡前看\"], [41, \"晚上自己看\"]]}};\n  var ALLC={\"男频\": [[1, \"都市热血\"], [2, \"玄幻爽文\"], [3, \"历史权谋\"], [4, \"武侠仙侠\"], [6, \"末世脑洞\"], [7, \"悬疑恐怖\"], [25, \"都市逆袭\"], [26, \"都市重生\"], [27, \"都市修真\"], [28, \"都市战神\"], [29, \"都市小白\"], [31, \"都市异能\"], [32, \"都市脑洞\"], [33, \"都市乡土\"], [34, \"玄幻奇幻\"], [35, \"玄幻脑洞\"], [36, \"历史架空\"]], \"女频\": [[10, \"现言\"], [11, \"古言\"], [12, \"幻想言情\"], [14, \"穿越重生\"], [41, \"穿越架空\"], [44, \"风水灵异\"], [45, \"推理刑侦\"]]};\n  var RKS=[[1, \"人气榜\"], [2, \"收藏榜\"], [3, \"字数榜\"]];\n  var CATS=ALLC[ch]||ALLC['男频'];\n  var c=CFG[ch];\n  var out=[];\n  // ① 频道 select：infoMap 优先 → result 兜底 → java.refreshExplore() 清两级缓存重绘\n  out.push({title:'频道',type:'select',chars:['男频','女频'],default:'男频',\n    action:\"(function(){var v='';try{if(typeof infoMap!=='undefined'&&infoMap['频道'])v=String(infoMap['频道']);}catch(e){}if(!v){try{if(typeof result!=='undefined'&&result&&result.get)v=String(result.get('频道')||'');}catch(e2){}}if(v){java.put('xcChannel',v);java.toast('✅ 已切换到频道：'+v);}else{java.toast('⚠ 未取到频道选项，保持原频道');}try{java.refreshExplore();}catch(e3){try{java.reUiView(true);}catch(e4){}}})()\",\n    style:{layout_flexBasisPercent:1,layout_wrapBefore:true}});\n  // ② 当前频道状态行（动态文本，纯文本不带外层引号）\n  out.push({title:'当前频道',type:'button',action:\"java.toast('当前频道：'+(java.get('xcChannel')||'男频'))\",\n    viewName:\"'当前频道：'+(java.get('xcChannel')||'男频')\",\n    style:{layout_flexBasisPercent:1,layout_wrapBefore:true}});\n  // ③ 榜单（book/rankList 实测：男/女各 人气/收藏/字数；rankBookList POST + {{page}} 原生翻页）\n  for(var i=0;i<RKS.length;i++){\n    // ★ 男频字数榜(rankType=3)站点 current=1 返回 data:[] 空壳，数据从 current=2 起\n    //   （抓包 17 条 rankBookList 从无 rankType=3；对照 current=1 空 / 2 有2本 / 3 有10本 / 4 有1本）。\n    //   换 appname/pageSize/完整设备参数均无效 ⇒ 站点数据缺陷，用页码偏移 +1 让首屏落到有数据的页。\n    //   其它 5 个榜单 current=1 均有数据，保持 {{page}}；女频字数榜 current=1 也有数据。\n    var pgExpr=(pd===1 && RKS[i][0]===3)?'{{(function(){return (Number(page)||1)+1})()}}':'{{page}}';\n    out.push({title:mark+RKS[i][1],\n      url:B+'/api/rankBookList?current='+pgExpr+'&pindao='+pd+'&rankType='+RKS[i][0]+'&pageSize=30,'+OPT,\n      style:{layout_flexBasisPercent:0.33,layout_flexGrow:0}});\n  }\n  // ④ 精品栏目（columnContent 该频道栏目，@js 摊平 3 个 dataList；站点一次返回全部，不带 {{page}}）\n  out.push({title:'✨ '+c.colName+'·精品书单',\n    url:B+'/api/boutique/columnContent?columnId='+c.colId+','+OPT,\n    style:{layout_flexBasisPercent:1,layout_wrapBefore:true}});\n  // ⑤ 该频道 3 个真实书单（xmbdName 取自抓包 columnContent 的 data[].xmbdName；current=2 空=不分页）\n  for(var k=0;k<c.lists.length;k++){\n    out.push({title:'📚 '+c.lists[k][1],\n      url:B+'/api/xmbd/bookList?xmbdId='+c.lists[k][0]+'&current=1,'+OPT,\n      style:{layout_flexBasisPercent:0.33,layout_flexGrow:0}});\n  }\n  // ⑥ 该频道分类（search/lib GET + {{page}}；分类名取自抓包 allCategorys）\n  for(var j=0;j<CATS.length;j++){\n    out.push({title:mark+CATS[j][1],\n      url:B+'/api/search/lib?s='+CATS[j][0]+'&pageNo={{page}}&pageSize=30',\n      style:{layout_flexBasisPercent:0.33,layout_flexGrow:0}});\n  }\n  return JSON.stringify(out);\n})()\n", "header": "{\"User-Agent\": \"okhttp/4.9.2\"}", "jsLib": "function XC_ok(v){\n  var s='';try{s=String(v)}catch(e){return ''}\n  if(!s||s==='null'||s==='undefined')return '';\n  if(s.indexOf('http')!==0)s='https://'+s;\n  var m=/^(https?:\\/\\/[^\\/]+)/.exec(s);return m?m[1]:'';\n}\nfunction XC_base(){\n  var d='';\n  try{d=XC_ok(source.get('xcLine'))}catch(e0){}\n  if(!d){try{var v=String(this.source.getVariable()||'');var o=v?(JSON.parse(v)||{}):{};d=XC_ok(o.xcLine)}catch(e1){}}\n  if(!d){try{d=XC_ok(java.get('xcLine'))}catch(e2){}}\n  if(!d){try{d=XC_ok(cache.get('xcLine'))}catch(e3){}}\n  if(!d){try{d=XC_ok(java.get('xcLine'))}catch(e4){}}\n  if(!d)d='https://quickapi.biduwenxue.com';\n  return d;\n}\nfunction XC_cover(c){\n  c=String(c||'');\n  if(!c||c==='null'||c==='undefined')return '';\n  if(c.indexOf('http')===0)return c;\n  return 'https://biduwenxue-img.oss-cn-beijing.aliyuncs.com/'+c.replace(/^\\/+/, '');\n}\nfunction XC_arr(){return new Packages.java.util.ArrayList()}\n", "lastUpdateTime": "1794548470379", "loginUi": "[{\"name\": \"发布页\", \"type\": \"text\", \"viewName\": \"'网址发布页地址'\", \"style\": {\"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"应用发布页\", \"type\": \"button\", \"action\": \"XC_pubFrom(result)\", \"viewName\": \"'💾 应用发布页地址'\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}, {\"name\": \"获取路线\", \"type\": \"button\", \"action\": \"XC_fetchPub()\", \"viewName\": \"'🧭 一键从发布页获取网址路线'\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}, {\"name\": \"测试延时\", \"type\": \"button\", \"action\": \"XC_testAll()\", \"viewName\": \"'⏱ 测试延时(ms写入各网址按钮)'\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}, {\"name\": \"检查登录状态\", \"type\": \"button\", \"action\": \"XC_checkLogin()\", \"viewName\": \"'🔍 检查登录状态/线路可用性'\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}, {\"name\": \"当前线路\", \"type\": \"label\", \"viewName\": \"XC_curLineText()\", \"style\": {\"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"网址列表\", \"type\": \"button\", \"action\": \"\", \"viewName\": \"'━━━ 点击切换网址（延时见按钮名）━━━'\", \"style\": {\"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"网址1\", \"type\": \"button\", \"action\": \"XC_switch(1)\", \"viewName\": \"XC_lineBtn(1)\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}, {\"name\": \"网址2\", \"type\": \"button\", \"action\": \"XC_switch(2)\", \"viewName\": \"XC_lineBtn(2)\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}, {\"name\": \"网址3\", \"type\": \"button\", \"action\": \"XC_switch(3)\", \"viewName\": \"XC_lineBtn(3)\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}, {\"name\": \"网址4\", \"type\": \"button\", \"action\": \"XC_switch(4)\", \"viewName\": \"XC_lineBtn(4)\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}, {\"name\": \"网址5\", \"type\": \"button\", \"action\": \"XC_switch(5)\", \"viewName\": \"XC_lineBtn(5)\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}, {\"name\": \"网址6\", \"type\": \"button\", \"action\": \"XC_switch(6)\", \"viewName\": \"XC_lineBtn(6)\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}, {\"name\": \"显示线路\", \"type\": \"button\", \"action\": \"XC_showLines()\", \"viewName\": \"'📋 显示当前全部线路'\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}, {\"name\": \"恢复默认\", \"type\": \"button\", \"action\": \"XC_reset()\", \"viewName\": \"'↩ 恢复默认线路'\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}, {\"name\": \"打开发布页\", \"type\": \"button\", \"action\": \"XC_web()\", \"viewName\": \"'🌐 打开网址发布页'\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}, {\"name\": \"说明\", \"type\": \"label\", \"viewName\": \"'ℹ 星辰小说：游客免登会员，无需登录；本面板仅用于线路运维'\", \"style\": {\"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}]", "loginUrl": "// ============ 星辰小说 · 发布页/线路运维面板 ============\n// APK Url.BASE_URL 固定 https://quickapi.biduwenxue.com；版本配置发布页\n// https://imgcdn.biduwenxue.com/apk/server_lm.txt 内含 apiAddress/h5Address 备用线路。\n// 本站游客自动注册(registerOrLogin/user)即「免登会员」，无需账号密码登录；\n// 故无登录框，但按需求提供完整发布页/线路运维面板 + 检查登录状态按钮。\n// 各按钮各阶段 Toast：开始 → 过程 → 结果/失败。\n// 兼容 LT + legado-E：V1 静态 loginUi；viewName 动态文本只读 source（无 java 绑定）；\n// action 由 SourceLoginDialog 拼 \"$loginJS\\n$action\" 后 eval，本文件函数全部可见。\nvar XC_MAX=6;\nvar XC_PUB_DEFAULT='https://imgcdn.biduwenxue.com/apk/server_lm.txt';\nvar XC_LINE_DEFAULT='https://quickapi.biduwenxue.com';\nvar XC_UA='okhttp/4.9.2';\nvar XC_FALLBACK=[\n 'https://quickapi.biduwenxue.com','http://quickapi.biduwenxue.com',\n 'https://m.biduwenxue.com','https://imgcdn.biduwenxue.com',\n 'https://biduwenxue-img.oss-cn-beijing.aliyuncs.com'];\nfunction XC_toast(t){try{java.longToast(String(t))}catch(e){try{java.toast(String(t))}catch(e2){}}}\nfunction XC_gv(k,d){var v='';try{v=String(source.get(k))}catch(e){v=''}\n  if(v===''||v==='null'||v==='undefined')v=d||'';return v}\nfunction XC_norm(u){var s=String(u||'').trim().replace(/\\/+$/,'');\n  if(s==='')return '';if(s.indexOf('http')!==0)s='https://'+s;\n  var m=/^(https?:\\/\\/[^\\/]+)/.exec(s);return m?m[1]:''}\nfunction XC_host(u){var m=/^https?:\\/\\/([^\\/]+)/.exec(String(u));return m?m[1]:String(u)}\nfunction XC_hdr(){return JSON.stringify({'User-Agent':XC_UA})}\nfunction XC_pub(){return XC_gv('xcPub',XC_PUB_DEFAULT)}\nfunction XC_line(){var d=XC_norm(XC_gv('xcLine',XC_LINE_DEFAULT));return d.indexOf('http')===0?d:XC_LINE_DEFAULT}\nfunction XC_writeLine(L){\n  L=XC_norm(L)||XC_LINE_DEFAULT;\n  try{source.put('xcLine',L)}catch(e0){}\n  try{var o={},v=String(source.getVariable()||'');try{o=v?(JSON.parse(v)||{}):{}}catch(e1){o={}}\n      o.xcLine=L;source.setVariable(JSON.stringify(o))}catch(e2){}\n  try{java.put('xcLine',L)}catch(e3){}\n  try{cache.put('xcLine',L)}catch(e4){}\n  return L;\n}\nfunction XC_setFound(list){var out=[],i,u;\n  for(i=0;i<list.length&&out.length<XC_MAX;i++){u=XC_norm(list[i]);if(u&&out.indexOf(u)<0)out.push(u)}\n  if(!out.length)out=XC_FALLBACK.slice(0);\n  source.put('xcFound',out.join(' '));\n  for(i=0;i<XC_MAX;i++)source.put('xcDelay'+i,'');\n  return out;}\nfunction XC_found(){var s=XC_gv('xcFound','');if(!s)return XC_setFound(XC_FALLBACK);\n  var a=s.split(/\\s+/),out=[],i;\n  for(i=0;i<a.length&&out.length<XC_MAX;i++){var u=XC_norm(a[i]);if(u&&out.indexOf(u)<0)out.push(u)}\n  return out.length?out:XC_setFound(XC_FALLBACK);}\nfunction XC_pubFrom(r){\n  XC_toast('💾 正在保存发布页地址…');\n  var v='';\n  try{if(r&&r.get)v=String(r.get('发布页')||'')}catch(e0){}\n  if(!v){try{v=String(r['发布页']||'')}catch(eA){}}\n  if(!v){try{if(result&&result.get)v=String(result.get('发布页')||'')}catch(e1){}}\n  if(!v){try{v=String(result['发布页']||'')}catch(eB){}}\n  if(!v||!v.trim())v=XC_PUB_DEFAULT;\n  var p=XC_norm(v);source.put('xcPub',p);\n  XC_toast('✅ 发布页已设为：'+p+'\\n点「🧭 一键从发布页获取网址路线」生效');\n  XC_refresh();}\nfunction XC_fetchPub(){\n  var pub=XC_pub(),url=pub+'/apk/server_lm.txt';\n  XC_toast('🧭 开始获取：正在打开发布页 '+XC_host(pub));\n  var raw='',err='';\n  try{raw=String(java.ajax(url+',{\"headers\":{\"User-Agent\":\"'+XC_UA+'\"},\"timeout\":10000}'))}catch(e){err=String(e).substring(0,90)}\n  if(!err&&(raw.length<20||raw.indexOf('Exception')===0||raw.indexOf('timeout')>-1))err='发布页内容异常';\n  if(err!==''){\n    XC_toast('⚠ 发布页抓取失败('+err+')，载入内置 '+XC_FALLBACK.length+' 条兜底线路');\n    XC_setFound(XC_FALLBACK);XC_toast('✅ 已载入内置线路；点「⏱ 测试延时」测速');XC_refresh();return;}\n  XC_toast('🔓 发布页已获取('+raw.length+'B)，正在解析线路…');\n  var lines=[],i,u,m,re=/https?:\\/\\/([a-z0-9][a-z0-9.\\-]*\\.[a-z]{2,}(?::[0-9]+)?)/gi;\n  while((m=re.exec(raw))!==null){u=XC_norm(m[0]);\n    var hn=XC_host(u);\n    // 只收本站家族域名；排除阿里云/统计/第三方 API 等非站点线路\n    if(hn.indexOf('biduwenxue')<0)continue;\n    if(u&&lines.indexOf(u)<0)lines.push(u)}\n  var cur=XC_line();if(lines.indexOf(cur)<0)lines.unshift(cur);\n  for(i=0;i<XC_FALLBACK.length&&lines.length<XC_MAX;i++)if(lines.indexOf(XC_FALLBACK[i])<0)lines.push(XC_FALLBACK[i]);\n  var got=XC_setFound(lines);try{XC_writeLine(XC_line())}catch(eW){}\n  XC_toast('✅ 共获取 '+got.length+' 条路线：\\n'+got.map(XC_host).join('\\n'));\n  XC_toast('已写入各网址按钮；点「⏱ 测试延时」把 ms 写进按钮名');XC_refresh();}\nfunction XC_probe(u){var h=XC_host(u),p='';\n  if(h.indexOf('quickapi')>-1)p='/api/book/info?bookId=207376';\n  else if(h.indexOf('imgcdn')>-1)p='/apk/server_lm.txt';\n  else if(h.indexOf('oss-cn')>-1)p='/pic/book/taoxiaoshuo/207376.jpg?x-oss-process=image/resize,w_90/format,webp';\n  else if(h.indexOf('m.biduwenxue')>-1)p='/api/m/2022-11-1/privacy_app.html';\n  else p='/';\n  return u+p+',{\"headers\":{\"User-Agent\":\"'+XC_UA+'\"},\"timeout\":8000}';}\nfunction XC_testAll(){\n  var list=XC_found();\n  XC_toast('⏱ 开始测速：共 '+list.length+' 条线路，逐个请求真实业务路径（绝不测搜索）…');\n  var i,t0,b,ms,tag,best=-1,bestMs=999999;\n  for(i=0;i<list.length;i++){ms=-1;tag='✗ 不可达';t0=Date.now();\n    try{b=String(java.ajax(XC_probe(list[i])));\n      // 本站特征：quickapi 系须 code:0；imgcdn 系须 server_lm.txt 的 androidVersion；\n      // oss 图床系返回二进制(长度>1000)；m 系隐私页须含 html 标签。绝不按纯长度放行第三方域。\n      var hn=XC_host(list[i]);\n      var ok=false;\n      if(hn.indexOf('quickapi')>-1)ok=b.indexOf('\"code\":0')>-1;\n      else if(hn.indexOf('imgcdn')>-1)ok=b.indexOf('androidVersion')>-1||b.indexOf('apiAddress')>-1;\n      else if(hn.indexOf('oss-cn')>-1)ok=b.length>1000;\n      else ok=(b.indexOf('<html')>-1||b.indexOf('<!DOCTYPE')>-1)&&b.length>500;\n      var bad=b.indexOf('Exception')>-1||b.indexOf('timeout')>-1||b.indexOf('Request method')>-1;\n      if(bad)tag='✗ 异常';\n      else if(ok){ms=Date.now()-t0;tag=ms+'ms';if(ms<bestMs){bestMs=ms;best=i}}\n      else tag='✗ 内容异常('+b.length+'B)';\n    }catch(e){tag='✗ '+String(e).substring(0,28)}\n    source.put('xcDelay'+i,tag);\n    XC_toast('  ['+(i+1)+'/'+list.length+'] '+XC_host(list[i])+' → '+tag);}\n  if(best>=0){source.put('xcDelay'+best,'⚡'+bestMs+'ms');\n    XC_toast('🏁 测速完成：最快 '+XC_host(list[best])+' '+bestMs+'ms（点对应网址按钮切换）')}\n  else XC_toast('⚠ 测速完成：暂无可用线路，请先「🧭 一键从发布页获取网址路线」');\n  XC_refresh();}\nfunction XC_checkLogin(){\n  var d=XC_line();XC_toast('🔍 正在检查当前线路：'+XC_host(d));\n  var b='',code=0;\n  try{var r=java.connect(d+'/api/book/info?bookId=207376',XC_hdr(),15000);\n      b=String(r.body());try{code=r.code?r.code():0}catch(eC){code=0}}\n  catch(e){XC_toast('❌ 检查失败：'+String(e).substring(0,90));return}\n  if(b.indexOf('Exception')>-1||(code&&(code<200||code>=400))||b.indexOf('\"code\":0')<0){\n    XC_toast('❌ 当前线路不可用('+(code?('HTTP '+code):'无有效数据')+')，建议测速后切换线路');return}\n  XC_toast('✅ 游客态可用（免登会员，无需登录）｜线路 '+XC_host(d)+' 正常返回 code:0｜本书源不依赖登录');}\nfunction XC_curLineText(){var l=XC_line(),dl='';\n  try{dl=XC_gv('xcDelay'+XC_found().indexOf(l),'')}catch(e){}\n  return '📍 当前线路：'+XC_host(l)+(dl?'（'+dl+'）':'')+'｜点下方网址按钮切换';}\nfunction XC_lineBtn(n){var list=XC_found(),i=Number(n)-1;\n  if(i<0||i>=list.length)return '━━ 网址'+n+' 未获取 ━━';\n  var cur=XC_line(),mark=(list[i]===cur)?'▶ ':'　 ';\n  var dl=XC_gv('xcDelay'+i,'');if(dl)mark+=dl+' ';\n  return mark+XC_host(list[i]);}\nfunction XC_switch(n){var list=XC_found(),i=Number(n)-1;\n  if(i<0||i>=list.length){XC_toast('⚠ 网址 '+n+' 尚未获取，请先点「🧭 一键从发布页获取网址路线」');return}\n  var old=XC_line(),nw=list[i];XC_toast('🔄 正在切换到 '+XC_host(nw)+' …');\n  XC_writeLine(nw);XC_toast('✅ 已切换：'+XC_host(old)+' → '+XC_host(nw));\n  XC_toast('📍 搜索/发现/详情/目录/正文全部跟随新线路；请下拉刷新发现页');XC_refresh();}\nfunction XC_reset(){XC_toast('↩ 正在恢复默认线路…');XC_writeLine(XC_LINE_DEFAULT);\n  XC_toast('✅ 已恢复默认：'+XC_LINE_DEFAULT);XC_refresh();}\nfunction XC_showLines(){XC_toast('📋 当前全部路线('+XC_found().length+')：\\n'+XC_found().map(XC_host).join('\\n'))}\nfunction XC_web(){var p=XC_pub();try{java.startBrowser(p+'/apk/server_lm.txt',p);XC_toast('🌐 已打开发布页 '+XC_host(p))}\n  catch(e){XC_toast('❌ 打开发布页失败：'+String(e).substring(0,60))}}\nfunction XC_refresh(){var ok=false;\n  try{java.reLoginView();ok=true}catch(e){try{java.reLoginView(false);ok=true}catch(e2){ok=false}}\n  if(!ok)XC_toast('ℹ 按钮文字可能未即时刷新：重新打开本面板即可看到 ▶ 标记与延时');}\nfunction login(e){if(e!=undefined){XC_toast(String(e));return}\n  XC_toast('✅ 星辰小说书源：游客免登（免登会员），无需账号密码');\n  XC_toast('📍 当前线路 '+XC_host(XC_line())+'｜发布页 '+XC_pub());}\n", "respondTime": 180000, "ruleBookInfo": {"author": "$.author", "coverUrl": "$.coverUrl", "init": "@js:\n(function(){\nvar XB='';try{XB=XC_base()}catch(eB){}\nif(!XB){try{XB=XC_ok(source.get('xcLine'))}catch(eB2){}}\nif(!XB)XB='https://quickapi.biduwenxue.com';\nfunction CV(c){c=String(c||'');if(!c||c==='null'||c==='undefined')return '';\n  if(c.indexOf('http')===0)return c;\n  return 'https://biduwenxue-img.oss-cn-beijing.aliyuncs.com/'+c.replace(/^\\/+/, '');}\nvar o={};try{o=JSON.parse(String(result||''))}catch(e){o={}}\nvar d=o.data||{}, b=d.book||o.book||d, a=d.author||{}, c=d.category||{};\nvar bid=b.id||'';\nreturn JSON.stringify({\n  name:String(b.title||''),\n  author:String(a.nickname||b.authorName||''),\n  coverUrl:CV(b.cover),\n  intro:'<br>\\n📂 分类：'+String(c.name||b.categoryName||'')+'\\n🎗 标签：'+String(b.keywords||'')\n        +'\\n📖 字数：'+String(b.wordCount||'')+'\\n🕰 更新：'+String(b.updateTime||'')\n        +'\\n📝 简介：\\n'+String(b.intro||'').replace(/\\r/g,''),\n  kind:String(c.name||'')+'\\n'+(String(b.completionStatus)==='NORMAL'?'完结':'连载')+'\\n评分 '+String(b.bookGrade||''),\n  wordCount:String(b.wordCount||''),\n  lastChapter:String(b.lastChapterTitle||''),\n  tocUrl:XB+'/api/book/chapters?bookId='+bid+'&pageNum=1&pageSize=100000'\n});\n})()", "intro": "$.intro", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name", "tocUrl": "$.tocUrl", "wordCount": "$.wordCount"}, "ruleContent": {"content": "$.data.content"}, "ruleExplore": {"author": "$.author", "bookList": "@js:\n(function(){\nvar XB='';try{XB=XC_base()}catch(eB){}\nif(!XB){try{XB=XC_ok(source.get('xcLine'))}catch(eB2){}}\nif(!XB)XB='https://quickapi.biduwenxue.com';\nfunction CV(c){c=String(c||'');if(!c||c==='null'||c==='undefined')return '';\n  if(c.indexOf('http')===0)return c;\n  return 'https://biduwenxue-img.oss-cn-beijing.aliyuncs.com/'+c.replace(/^\\/+/, '');}\nvar o={};try{o=JSON.parse(String(result||''))}catch(e){o={}}\nvar d=o.data, arr=[], i, j;\nif(d && typeof d.length==='number' && d.length>0){\n  if(d.length && d[0] && d[0].dataList){          // 精品 columnContent：摊平各栏目 dataList\n    for(i=0;i<d.length;i++){var dl=d[i].dataList||[];for(j=0;j<dl.length;j++)arr.push(dl[j])}\n  }else arr=d;                                    // 榜单 rankBookList\n}else if(d && d.pageList && d.pageList.length){arr=d.pageList}  // 分类 search/lib\nelse if(d && d.pageList){arr=d.pageList}\nelse if(o.pageList){arr=o.pageList}\nvar out=new Packages.java.util.ArrayList();\nfor(i=0;i<arr.length;i++){\n  var b=arr[i]||{};if(!b)continue;\n  var bid=b.id||b.bookId;if(!bid)continue;\n  var cn=b.categoryname||b.categoryName||'';\n  var wc=b.wordcount||b.wordCount||'';\n  var au=b.authorname||b.authorName||b.author||'';\n  var gr=b.bookGrade||'';\n  var ch=b.channelid||b.channelId||'';\n  out.add(JSON.stringify({\n    bookUrl: XB+'/api/book/info?bookId='+bid,\n    name: String(b.title||''),\n    author: String(au),\n    coverUrl: CV(b.cover),\n    intro: String(b.intro||'').replace(/\\r/g,''),\n    kind: String(cn)+(ch?('\\n'+(String(ch)==='1'?'男频':'女频')):'')+(gr?('\\n评分 '+gr):''),\n    wordCount: String(wc)\n  }));\n}\nreturn out;\n})()", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "name": "$.name", "wordCount": "$.wordCount"}, "ruleSearch": {"author": "$.author", "bookList": "@js:\n(function(){\nvar XB='';try{XB=XC_base()}catch(eB){}\nif(!XB){try{XB=XC_ok(source.get('xcLine'))}catch(eB2){}}\nif(!XB)XB='https://quickapi.biduwenxue.com';\nfunction CV(c){c=String(c||'');if(!c||c==='null'||c==='undefined')return '';\n  if(c.indexOf('http')===0)return c;\n  return 'https://biduwenxue-img.oss-cn-beijing.aliyuncs.com/'+c.replace(/^\\/+/, '');}\nvar o={};try{o=JSON.parse(String(result||''))}catch(e){o={}}\nvar d=o.data, arr=[], i, j;\nif(d && typeof d.length==='number' && d.length>0){\n  if(d.length && d[0] && d[0].dataList){          // 精品 columnContent：摊平各栏目 dataList\n    for(i=0;i<d.length;i++){var dl=d[i].dataList||[];for(j=0;j<dl.length;j++)arr.push(dl[j])}\n  }else arr=d;                                    // 榜单 rankBookList\n}else if(d && d.pageList && d.pageList.length){arr=d.pageList}  // 分类 search/lib\nelse if(d && d.pageList){arr=d.pageList}\nelse if(o.pageList){arr=o.pageList}\nvar out=new Packages.java.util.ArrayList();\nfor(i=0;i<arr.length;i++){\n  var b=arr[i]||{};if(!b)continue;\n  var bid=b.id||b.bookId;if(!bid)continue;\n  var cn=b.categoryname||b.categoryName||'';\n  var wc=b.wordcount||b.wordCount||'';\n  var au=b.authorname||b.authorName||b.author||'';\n  var gr=b.bookGrade||'';\n  var ch=b.channelid||b.channelId||'';\n  out.add(JSON.stringify({\n    bookUrl: XB+'/api/book/info?bookId='+bid,\n    name: String(b.title||''),\n    author: String(au),\n    coverUrl: CV(b.cover),\n    intro: String(b.intro||'').replace(/\\r/g,''),\n    kind: String(cn)+(ch?('\\n'+(String(ch)==='1'?'男频':'女频')):'')+(gr?('\\n评分 '+gr):''),\n    wordCount: String(wc)\n  }));\n}\nreturn out;\n})()", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "name": "$.name", "wordCount": "$.wordCount"}, "ruleToc": {"chapterList": "@js:\n(function(){\nvar XB='';try{XB=XC_base()}catch(eB){}\nif(!XB){try{XB=XC_ok(source.get('xcLine'))}catch(eB2){}}\nif(!XB)XB='https://quickapi.biduwenxue.com';\nvar o={};try{o=JSON.parse(String(result||''))}catch(e){o={}}\nvar d=o.data||{}, pu=d.pageUtil||{}, a=pu.pageList||d.pageList||((d&&typeof d.length==='number')?d:[]);\nvar opt=JSON.stringify({method:'POST',body:'x=1',headers:{'Content-Type':'application/x-www-form-urlencoded'}});\nvar out=new Packages.java.util.ArrayList();\nfor(var i=0;i<a.length;i++){var c=a[i]||{};if(!c||!c.id)continue;\n  out.add(JSON.stringify({\n    name:String(c.title||''),\n    url:XB+'/api/chapter/info?bookId='+String(c.bookId||'')+'&chapterId='+String(c.id)+','+opt,\n    updateTime:String(c.wordCount||'')+' 字 · '+String(c.publishTime||'')\n  }));}\nreturn out;\n})()", "chapterName": "$.name", "chapterUrl": "$.url", "updateTime": "$.updateTime"}, "searchUrl": "@js:\n(function(){\nvar XB='';try{XB=XC_base()}catch(eB){}\nif(!XB){try{XB=XC_ok(source.get('xcLine'))}catch(eB2){}}\nif(!XB)XB='https://quickapi.biduwenxue.com';\nfunction CV(c){c=String(c||'');if(!c||c==='null'||c==='undefined')return '';\n  if(c.indexOf('http')===0)return c;\n  return 'https://biduwenxue-img.oss-cn-beijing.aliyuncs.com/'+c.replace(/^\\/+/, '');}\nreturn XB+'/api/search?keywords='+java.encodeURI(key)+'&pageNo='+page+'&pageSize=30,'+\n  JSON.stringify({method:'POST',body:'x=1',headers:{'Content-Type':'application/x-www-form-urlencoded'}});\n})()", "weight": 0},{"bookSourceComment": "//淘小说APP接口API源", "bookSourceGroup": "APP接口", "bookSourceName": "📖 淘小说API", "bookSourceType": 0, "bookSourceUrl": "https://tybook.taoyuewenhua.net", "bookUrlPattern": "https?://(?:tybook|scdn|app)\\.taoyuewenhua\\.net/(?:tf/book|app/chapters)\\?.*|https?://app\\.taoyuewenhua\\.net/tybook/.*|ttbook://m\\.taoyuewenhua\\.com/(?:push|game|homepage)/.*", "concurrentRate": "1/1500", "customButton": false, "customOrder": 2, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\n(function(){\n  var CFG={\"男生\":{\"ctype\":\"1\",\"freeType\":\"1\",\"modules\":[[\"推荐榜\",-1000006],[\"好看到停不下来\",61]],\"ranks\":[[\"推荐榜\",100],[\"完本榜\",110],[\"人气榜\",10],[\"热搜榜\",80],[\"收藏榜\",20],[\"阅读榜\",30]],\"cats\":[[\"都市\",105000],[\"玄幻\",101000],[\"历史\",106000],[\"军事\",107000],[\"奇闻怪谈\",108000],[\"武侠\",109000],[\"科幻\",110000],[\"游戏\",111000],[\"仙侠\",102000],[\"悬疑\",112000],[\"轻小说\",113000],[\"都市修真\",114000]],\"tags\":[\"末世\",\"系统\",\"穿越\",\"重生\",\"无敌\",\"签到\",\"爽文\",\"打脸\",\"赘婿\",\"战神\",\"神医\",\"奶爸\",\"脑洞\",\"网游\",\"同人\",\"无限流\",\"种田\",\"都市\"],\"tagFrom\":\"5\"},\"女生\":{\"ctype\":\"2\",\"freeType\":\"2\",\"modules\":[[\"推荐榜\",-1000005],[\"恋爱神作\",69]],\"ranks\":[[\"推荐榜\",100],[\"完本榜\",110],[\"人气榜\",10],[\"热搜榜\",80],[\"收藏榜\",20],[\"阅读榜\",30]],\"cats\":[[\"现代言情\",204000],[\"古代言情\",203000],[\"幻想言情\",205000],[\"浪漫青春\",206000],[\"悬疑推理\",208000],[\"短篇\",210000],[\"豪门总裁\",207000],[\"穿越时空\",209000],[\"宫闱宅斗\",211000]],\"tags\":[\"重生\",\"穿越\",\"年代\",\"娱乐圈\",\"系统\",\"爽文\",\"种田\"],\"tagFrom\":\"5\"},\"完结\":{\"ctype\":\"1\",\"freeType\":\"1\",\"modules\":[[\"精品完结\",32],[\"都市爽文\",41],[\"玄幻奇文\",42],[\"最新完结\",-1000016]],\"ranks\":[[\"完本榜\",110],[\"推荐榜\",100],[\"人气榜\",10],[\"收藏榜\",20],[\"阅读榜\",30]],\"cats\":[[\"完结·都市\",105000],[\"完结·玄幻\",101000],[\"完结·历史\",106000],[\"完结·仙侠\",102000],[\"完结·科幻\",110000],[\"完结·游戏\",111000]],\"tags\":[\"爽文\",\"系统\",\"重生\",\"无敌\",\"种田\",\"年代\",\"脑洞\",\"无限流\",\"末世\",\"穿越\"],\"tagFrom\":\"5\"},\"新书\":{\"ctype\":\"1\",\"freeType\":\"1\",\"modules\":[[\"精品新书\",37],[\"都市爽文\",48],[\"玄幻奇文\",49],[\"最新上架\",-1000004]],\"ranks\":[[\"推荐榜\",100],[\"人气榜\",10],[\"热搜榜\",80],[\"新书榜\",100]],\"cats\":[[\"新书·都市\",105000],[\"新书·玄幻\",101000],[\"新书·仙侠\",102000],[\"新书·科幻\",110000],[\"新书·历史\",106000],[\"新书·游戏\",111000]],\"tags\":[\"系统\",\"穿越\",\"重生\",\"脑洞\",\"签到\",\"都市\",\"玄幻\",\"爽文\",\"无敌\",\"末世\"],\"tagFrom\":\"5\"},\"阅文好书\":{\"ctype\":\"1\",\"freeType\":\"1\",\"modules\":[[\"热门精品\",26],[\"主编强推\",27],[\"名家神作\",29],[\"完结好书\",30],[\"新书上架\",28],[\"精品推荐\",31]],\"ranks\":[[\"推荐榜\",100],[\"完本榜\",110],[\"人气榜\",10],[\"阅读榜\",30]],\"cats\":[[\"名家·都市\",105000],[\"名家·玄幻\",101000],[\"名家·仙侠\",102000],[\"名家·历史\",106000],[\"名家·科幻\",110000],[\"名家·悬疑\",112000]],\"tags\":[\"热血\",\"玄幻\",\"仙侠\",\"都市\",\"系统\",\"重生\",\"穿越\",\"爽文\",\"种田\",\"脑洞\"],\"tagFrom\":\"5\"}};\n  var NAMES=[\"男生\",\"女生\",\"完结\",\"新书\",\"阅文好书\"];\n  // 选中频道：infoMap 优先（发现页 select 真机注入），java.get 兜底（无 infoMap 版本）\n  var ch=\"\",hasIm=false;\n  try{ if(typeof infoMap!==\"undefined\" && infoMap[\"频道\"]){ch=String(infoMap[\"频道\"]);hasIm=true;} }catch(e){}\n  if(!hasIm){ try{ var v=String(java.get(\"txChannel\")||\"\"); if(v) ch=v; }catch(e){} }\n  if(!CFG[ch]) ch=\"男生\";\n  var c=CFG[ch], out=[];\n  function head(t){\n    out.push({title:t,url:\"\",type:\"button\",action:\"java.toast('\"+t+\"')\",\n      style:{layout_flexBasisPercent:1,layout_wrapBefore:true,layout_justifySelf:\"flex_start\"}});\n  }\n  function row(t,path,extra){\n    out.push({title:t,\n      url:\"@js:\\nTX_explore(java, source, \"+JSON.stringify(path)+\", \"+JSON.stringify(extra)+\", page);\",\n      type:\"url\",style:{layout_flexGrow:1,layout_flexBasisPercent:0.25}});\n  }\n  // ① 频道 select（5 选 1）：infoMap 优先 → result 兜底 → 拿不到则保持原频道，\n  //    再 java.refreshExplore() 清两级缓存并重绘（青橙 v7.1 成熟范式，LT/E 均验证）\n  out.push({title:\"频道\",type:\"select\",chars:NAMES,default:\"男生\",\n    action:\"(function(){var v='';try{if(typeof infoMap!=='undefined'&&infoMap['频道'])v=String(infoMap['频道']);}catch(e){}if(!v){try{if(typeof result!=='undefined'&&result&&result.get)v=String(result.get('频道')||'');}catch(e2){}}if(v){java.put('txChannel',v);java.toast('✅ 已切换到频道：'+v);}else{java.toast('⚠ 未取到频道选项，保持原频道');}try{java.refreshExplore();}catch(e3){try{java.reUiView(true);}catch(e4){}}})()\",\n    style:{layout_flexBasisPercent:1,layout_wrapBefore:true}});\n  // ② 当前频道状态行（viewName 动态文本，返回纯文本不带外层引号）\n  out.push({title:\"当前频道\",type:\"button\",action:\"\",\n    viewName:\"'当前频道：'+(java.get('txChannel')||'男生')\",\n    style:{layout_flexBasisPercent:1,layout_wrapBefore:true}});\n  // ③ 频道真实模块（channel_books，带 page/pageSize 由 Legado 递增，不写死页码上限）\n  head(\"▌ \"+ch+\" · 频道精选\");\n  for(var i=0;i<c.modules.length;i++){\n    row(c.modules[i][0],\"/book_mall/channel_books\",\n        {mcid:String(c.modules[i][1]),seed:\"0\",category:\"\",ext:\"\"});\n  }\n  // ④ 频道榜单（book_rank，brtype 来自 /public/mioptions 的 bookRankTabs）\n  head(\"▌ \"+ch+\" · 排行榜\");\n  for(var j=0;j<c.ranks.length;j++){\n    row(c.ranks[j][0],\"/book_mall/book_rank\",\n        {brtype:String(c.ranks[j][1]),ctype:c.ctype,status:\"0\"});\n  }\n  // ⑤ 频道分类（search_by_category，categoryId 来自旧源 + 真机抓包）\n  head(\"▌ \"+ch+\" · 分类\");\n  for(var k=0;k<c.cats.length;k++){\n    row(c.cats[k][0],\"/ty/search_by_category\",\n        {categoryId:String(c.cats[k][1]),freeType:c.freeType,from:\"13\",order:\"0\",status:\"0\"});\n  }\n  // ⑥ 频道热门标签（tags，from 用抓包实锤的 5）\n  head(\"▌ \"+ch+\" · 热门标签\");\n  for(var m=0;m<c.tags.length;m++){\n    row(c.tags[m],\"/ty/search_by_category\",\n        {freeType:c.freeType,from:c.tagFrom,order:\"0\",status:\"0\",tags:c.tags[m]});\n  }\n  // ⑦ 全频道通用：搜索发现（search_recommend 返回 $.data.books）\n  head(\"▌ 全站 · 搜索发现\");\n  row(\"猜你喜欢\",\"/authopt/search_recommend\",{ctype:c.ctype});\n  return JSON.stringify(out);\n})()", "header": "{\"User-Agent\": \"okhttp/5.1.0\"}", "jsLib": "// ===== 淘小说 11.2.8 公共签名库 =====\n// sign = MD5( 全部请求参数按 key 字典序排列、值用 UTF-8 明文拼接 + \"&key=mibook_123456\" ).toUpperCase()\n// 实锤： 112 条请求离线碰撞 112/112 命中；App 内 java.md5Encode 复算一致。\n// 注意：sign 的是「解码后的参数值」；URL 里才 encodeURIComponent。\n// 注意：key 也要参与排序（当业务参数恰好含 key 时不可重复追加）。\nfunction TX_signBase(p) {\n  var ks = Object.keys(p).sort();\n  var s = '';\n  for (var i = 0; i < ks.length; i++) {\n    if (i) s += '&';\n    s += ks[i] + '=' + String(p[ks[i]]);\n  }\n  return s;\n}\nfunction TX_query(p) {\n  var ks = Object.keys(p).sort();\n  var q = '';\n  for (var i = 0; i < ks.length; i++) {\n    if (i) q += '&';\n    q += ks[i] + '=' + encodeURIComponent(String(p[ks[i]]));\n  }\n  return q;\n}\n// jv = java 绑定（规则 @js 环境），显式传入以兼容 jsLib 共享 scope\nfunction TX_url(jv, p, host, path) {\n  var sign = String(jv.md5Encode(TX_signBase(p) + '&key=mibook_123456')).toUpperCase();\n  return host + path + '?' + TX_query(p) + '&sign=' + sign;\n}\n\n// 11.2.8 真机抓包的固定设备/游客参数。\n// 对照实验实锤：book_rank/tf/book/tf/chapter_content 只校验 sign，token↔uid 可任意；\n// 唯独 /authopt/ty/search_books 额外校验 token↔uid 配对（伪造 → errcode 205 Invalid token）。\n// 故此处使用真机抓包的那组配对凭证，绝不自造。\nfunction TX_dev() {\n  return {\n    android_id: '76546fb5b7fa81c2',\n    appid: 'mibook',\n    brand: 'Xiaomi',\n    channel: 'XiaoMi',\n    device_id: '38825f4366714ddba026677ee69a004c',\n    model: 'MI 8',\n    optype: '0',\n    ostype: '0',\n    osversion: '10',\n    package_name: 'com.martian.ttbook',\n    token: 'a8976c97-ab2f-4bac-b4a6-389475e77719',\n    uid: '85861337',\n    version_code: '801',\n    version_name: '11.2.8'\n  };\n}\n// 服务端不校验 t 时效（2022 年旧时间戳 / 未来时间戳 / 当前时间戳 三组均 errcode:0），\n// 但仍每次用当前时间，避免任何潜在的日志侧异常。\nfunction TX_params(extra) {\n  var p = TX_dev();\n  if (extra) for (var k in extra) p[k] = extra[k];\n  p.t = String(Date.now());\n  return p;\n}\n\n// 面板切换的线路：sv = source 绑定，由规则 @js 显式传入。\n// ★jsLib 共享 scope 不注入任何规则环境绑定（java/book/source/result/baseUrl 全无，源码级实锤），\n//   所以本文件里所有函数一律「显式传参」，绝不裸用 source/java。\nfunction TX_host(sv) {\n  var d = '';\n  try { d = String(sv.get('txApiHost') || ''); } catch (e) { d = ''; }\n  if (!d || d.indexOf('http') !== 0) d = 'https://tybook.taoyuewenhua.net';\n  return d.replace(/\\/+$/, '');\n}\nfunction TX_cdn(sv) {\n  var d = '';\n  try { d = String(sv.get('txCdnHost') || ''); } catch (e) { d = ''; }\n  if (!d || d.indexOf('http') !== 0) d = 'https://scdn.taoyuewenhua.net';\n  return d.replace(/\\/+$/, '');\n}\n\n// ===== 各规则入口（jv=java、sv=source，全部由规则 @js 显式传入） =====\n// 搜索：/authopt/ty/search_books，Legado 的 page 从 1 开始，接口 page 从 0 开始\nfunction TX_search(jv, sv, key, page) {\n  var p = TX_params({\n    ctype: '1',\n    keywords: String(key),\n    page: String((Number(page) || 1) - 1),\n    pageSize: '10',\n    searchType: '1',\n    sourceName: 'yw'\n  });\n  return TX_url(jv, p, TX_host(sv), '/authopt/ty/search_books');\n}\n// 搜索/发现列表里的 bookUrl：/tf/book?bid=xxx\nfunction TX_bookUrl(jv, sv, bid) {\n  var p = TX_params({ bid: String(bid) });\n  return TX_url(jv, p, TX_host(sv), '/tf/book');\n}\n// 详情 → 目录：/tf/chapter_list 302 跳到免签名 CDN，Legado 网络栈自动跟随\n// 极简参数报 errcode 202 Empty app id ⇒ 必须带 TX_dev() 全套参数（实锤）\nfunction TX_tocUrl(jv, sv, bid) {\n  var p = TX_params({ bid: String(bid), retry: '0' });\n  return TX_url(jv, p, TX_host(sv), '/tf/chapter_list');\n}\n// 目录章节 → 正文：/tf/chapter_content?bid=&cid=&autoBuy=true\nfunction TX_contentUrl(jv, sv, bid, cid) {\n  var p = TX_params({ bid: String(bid), cid: String(cid), autoBuy: 'true' });\n  return TX_url(jv, p, TX_host(sv), '/tf/chapter_content');\n}\n// 发现页：book_rank 榜单 / search_by_category 分类 / channel_books 书城频道 / search_recommend\n// 站点无「下一页」字段，终止判据用「本页返回空 / 与上一页内容重复」由 Legado 自己处理，\n// 不写死页码上限（用户明确要求：站点以后加书要能自动继续）。\nfunction TX_explore(jv, sv, path, extra, page) {\n  var e = {};\n  if (extra) for (var k in extra) e[k] = extra[k];\n  e.page = String((Number(page) || 1) - 1);\n  e.pageSize = '10';\n  var p = TX_params(e);\n  return TX_url(jv, p, TX_host(sv), path);\n}\n\n// 供用户粘贴 App 分享链接时反解 bid（bookUrlPattern 命中后由详情页规则使用）\nfunction TX_bidFrom(u) {\n  var m = /[?&]bid=([^&#]+)/.exec(String(u));\n  return m ? decodeURIComponent(m[1]) : '';\n}", "lastUpdateTime": "1794548504444", "loginUi": "[{\"name\": \"发布页\", \"type\": \"text\", \"viewName\": \"'发布页地址(官方落地页)'\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}, {\"name\": \"应用发布页\", \"type\": \"button\", \"action\": \"TX_pubFrom(result)\", \"viewName\": \"'💾 应用发布页地址'\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}, {\"name\": \"获取路线\", \"type\": \"button\", \"action\": \"TX_fetchPub()\", \"viewName\": \"'🧭 一键从发布页获取网址路线'\", \"style\": {\"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"测试延时\", \"type\": \"button\", \"action\": \"TX_testAll()\", \"viewName\": \"'⏱ 检测路线延迟(ms写入路线按钮)'\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}, {\"name\": \"检查登录状态\", \"type\": \"button\", \"action\": \"TX_checkLogin()\", \"viewName\": \"'🔍 检查登录状态/游客凭证'\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}, {\"name\": \"显示线路\", \"type\": \"button\", \"action\": \"TX_toast(TX_found().join(' / '))\", \"viewName\": \"'📋 显示当前全部路线'\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}, {\"name\": \"打开网站\", \"type\": \"button\", \"action\": \"TX_web()\", \"viewName\": \"'🌐 打开官方落地页'\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}, {\"name\": \"当前线路\", \"type\": \"button\", \"action\": \"\", \"viewName\": \"TX_curLineText()\", \"style\": {\"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"路线标题\", \"type\": \"button\", \"action\": \"\", \"viewName\": \"'━━ 点击切换路线（延时见按钮名）━━'\", \"style\": {\"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"路线1\", \"type\": \"button\", \"action\": \"TX_switch(1)\", \"viewName\": \"TX_lineBtn(1)\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}, {\"name\": \"路线2\", \"type\": \"button\", \"action\": \"TX_switch(2)\", \"viewName\": \"TX_lineBtn(2)\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}, {\"name\": \"路线3\", \"type\": \"button\", \"action\": \"TX_switch(3)\", \"viewName\": \"TX_lineBtn(3)\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}, {\"name\": \"路线4\", \"type\": \"button\", \"action\": \"TX_switch(4)\", \"viewName\": \"TX_lineBtn(4)\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}, {\"name\": \"路线5\", \"type\": \"button\", \"action\": \"TX_switch(5)\", \"viewName\": \"TX_lineBtn(5)\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}, {\"name\": \"路线6\", \"type\": \"button\", \"action\": \"TX_switch(6)\", \"viewName\": \"TX_lineBtn(6)\", \"style\": {\"layout_flexBasisPercent\": 0.48, \"layout_flexGrow\": 1}}]", "loginUrl": "// ========== 淘小说 11.2.8 运维面板 ==========\n// 全部函数挂在 loginUrl；SourceLoginDialog 用 \"$loginJS\\n$action\" 一起 eval。\n// 绑定差异（源码级实锤）：loginUi<js> 无 source/java；按钮 action 有 java(SourceLoginJsExtensions)\n// 且 source 仍绑定；viewName 表达式用 source 可用但不保证 java ⇒ 视图函数只读 source。\n// 兼容 LT(gedoor/LegadoTeam) 与 E(Luoyacheng/legado-E)：V1 静态 loginUi 是 E 版唯一可用形态。\n\nvar TX_MAX = 6;\nvar TX_PUB_DEFAULT = 'https://m.taoyuewenhua.com';\nvar TX_API_DEFAULT = 'https://tybook.taoyuewenhua.net';\nvar TX_CDN_DEFAULT = 'https://scdn.taoyuewenhua.net';\nvar TX_UA = 'okhttp/5.1.0';\n// 内置线路池：全部来自 2026-11-12 真机抓包 + 实测可达，不臆造域名。\n// ★不收录 https://app.taoyuewenhua.net：该域仅用于 assetlinks.json（manifest 实锤），\n//   实测根路径 403，放进线路池会误导用户切到不可用线路。\n// ★收录 m.taoyuewenhua.com 作为官方落地页（实测 200/7069B），但它不是 API 线路，\n//   切换时 TX_switch 会把它当发布页展示，不会替换 txApiHost（见下）。\nvar TX_FALLBACK = [\n  'https://tybook.taoyuewenhua.net',\n  'https://scdn.taoyuewenhua.net',\n  'https://m.taoyuewenhua.com',\n  'http://scdn.taoyuewenhua.net'\n];\n\nfunction login() { return 'ok'; }   // 必须实现，否则点右上角 √ 抛 \"Function login not implements!!!\"\n\nfunction TX_toast(t) {\n  try { java.longToast(String(t)); } catch (e) { try { java.toast(String(t)); } catch (e2) {} }\n}\nfunction TX_gv(k, def) {\n  var v = '';\n  try { v = String(source.get(k)); } catch (e) { v = ''; }\n  if (v === '' || v === 'null' || v === 'undefined') v = def || '';\n  return v;\n}\nfunction TX_norm(u) {\n  var s = String(u || '').trim().replace(/\\/+$/, '');\n  if (!s) return '';\n  if (s.indexOf('http') !== 0) s = 'https://' + s;\n  var m = /^(https?:\\/\\/[^/]+)/.exec(s);\n  return m ? m[1] : s;\n}\nfunction TX_of(u) {\n  var m = /^https?:\\/\\/([^/]+)/.exec(String(u));\n  return m ? m[1] : String(u);\n}\nfunction TX_hdr() { return JSON.stringify({'User-Agent': TX_UA}); }\nfunction TX_refresh() {\n  try { java.reLoginView(false); } catch (e) {\n    try { java.reUiView(false); } catch (e2) {}\n  }\n}\n\n// ---------- 发布页输入框 ----------\nfunction TX_pub() {\n  var p = TX_norm(TX_gv('txPub', TX_PUB_DEFAULT));\n  return p || TX_PUB_DEFAULT;\n}\nfunction TX_pubFrom(r) {\n  var v = '';\n  try { if (r && r.get) v = String(r.get('发布页') || ''); } catch (e0) {}\n  if (!v) { try { v = String(r['发布页'] || ''); } catch (eA) {} }\n  if (!v) { try { if (result && result.get) v = String(result.get('发布页') || ''); } catch (e1) {} }\n  if (!v) { try { if (result) v = String(result['发布页'] || ''); } catch (eB) {} }\n  if (!v || !v.trim()) v = TX_PUB_DEFAULT;\n  var p = TX_norm(v);\n  TX_toast('⏳ 正在应用发布页：' + TX_of(p) + ' …');\n  try { source.put('txPub', p); } catch (e) { TX_toast('❌ 写入失败：' + e); return; }\n  TX_toast('✅ 发布页已设为 ' + TX_of(p) + '，请点「🧭 一键从发布页获取网址路线」');\n  TX_refresh();\n}\n\n// ---------- 线路池持久化 ----------\nfunction TX_setFound(list) {\n  var out = [], i, u;\n  for (i = 0; i < list.length && out.length < TX_MAX; i++) {\n    u = TX_norm(list[i]);\n    if (u && out.indexOf(u) < 0) out.push(u);\n  }\n  if (!out.length) out = TX_FALLBACK.slice(0);\n  try { source.put('txFound', out.join(' ')); } catch (e) {}\n  for (i = 0; i < TX_MAX; i++) { try { source.put('txDelay' + i, ''); } catch (e2) {} }\n  return out;\n}\nfunction TX_found() {\n  var s = TX_gv('txFound', '');\n  if (!s) return TX_setFound(TX_FALLBACK);\n  var a = s.split(/\\s+/), out = [], i;\n  for (i = 0; i < a.length && out.length < TX_MAX; i++) {\n    var u = TX_norm(a[i]);\n    if (u.indexOf('http') === 0 && out.indexOf(u) < 0) out.push(u);\n  }\n  return out.length ? out : TX_setFound(TX_FALLBACK);\n}\n// ★不能用 .map(TX_host)：jsLib 的 TX_host(sv) 需要显式 source 参数，作为 map 回调会拿到\n//   (element,index,array) 三个实参导致返回错值甚至抛错，中断按钮后半段 Toast。统一改 TX_of。\nfunction TX_foundText() { return TX_found().map(TX_of).join(' / '); }\n\n// ---------- 🧭 一键从发布页获取网址路线 ----------\n// 分阶段 Toast：开始 → 抓取 → 解析 → 写池 → 完成 / 失败兜底\nfunction TX_fetchPub() {\n  var pub = TX_pub();\n  TX_toast('🧭 阶段1/4：正在打开发布页 ' + TX_of(pub) + ' …');\n  var raw = '', err = '', ms = 0;\n  try {\n    var t0 = Date.now();\n    var r0 = java.connect(pub + '/', TX_hdr(), 12000);\n    ms = Date.now() - t0;\n    raw = String(r0.body());\n    if (r0.code && r0.code() !== 200) err = 'HTTP ' + r0.code();\n  } catch (e) { err = String(e).substring(0, 90); }\n  if (!err && (raw.length < 20 || raw.indexOf('Exception') === 0)) err = '内容异常(' + raw.length + 'B)';\n  if (err) {\n    TX_toast('⚠ 阶段1失败：' + err + '；载入内置 ' + TX_FALLBACK.length + ' 条兜底线路');\n    TX_setFound(TX_FALLBACK);\n    TX_toast('✅ 已载入内置线路，请点「⏱ 检测路线延迟」测速');\n    TX_refresh(); return;\n  }\n  TX_toast('🔓 阶段2/4：发布页已获取(' + raw.length + 'B / ' + ms + 'ms)，正在解析同族域名…');\n  var lines = [], m, u, hn;\n  // 从发布页正文抽取 taoyuewenhua.com/net 同族域名（排除纯资源/图床）\n  var re = /https?:\\/\\/([a-z0-9][a-z0-9.\\-]*\\.taoyuewenhua\\.(?:com|net))/gi;\n  while ((m = re.exec(raw)) !== null) {\n    u = TX_norm(m[0]); hn = TX_of(u);\n    if (lines.indexOf(u) < 0) lines.push(u);\n  }\n  // 发布页自身 host 也算一条路线\n  var self = TX_norm(pub);\n  if (self && lines.indexOf(self) < 0) lines.push(self);\n  // ★池首固定为「当前正在用的 API 主线路」，发布页解析出的域追加在后：\n  //   避免用户打开面板看到的第 1 个按钮是落地页（不是 API），误点后以为切了线路。\n  var lines2 = [TX_norm(TX_gv('txApiHost', TX_API_DEFAULT))];\n  var i;\n  for (i = 0; i < lines.length && lines2.length < TX_MAX; i++) {\n    if (lines2.indexOf(lines[i]) < 0) lines2.push(lines[i]);\n  }\n  // 内置兜底补齐（真机抓包实锤的线路）\n  for (i = 0; i < TX_FALLBACK.length && lines2.length < TX_MAX; i++) {\n    if (lines2.indexOf(TX_FALLBACK[i]) < 0) lines2.push(TX_FALLBACK[i]);\n  }\n  lines = lines2;\n  TX_toast('🔎 阶段3/4：解析到 ' + lines.length + ' 条候选，正在写入线路按钮…');\n  var got = TX_setFound(lines);\n  TX_toast('✅ 阶段4/4：共 ' + got.length + ' 条路线 → ' + got.map(TX_of).join(' / '));\n  TX_toast('📌 延时尚未写入，请点「⏱ 检测路线延迟（ms写入路线按钮）」');\n  TX_refresh();\n}\n\n// ---------- ⏱ 检测路线延迟（ms 写进各网址按钮） ----------\n// 判活按线路类型分别走真实可用路径（全部为非搜索接口，用户主动点击才触发）：\n//   · tybook API 线路 → 现算 sign 的 /auth/account.do（游客账户探针，返回 errcode:0）\n//   · scdn CDN 线路   → 免签名静态目录 /app/chapters/{bid}.json\n//   · 官方落地页 m.   → 根路径 HTML（200 / 7069B）\n// ★坑（实测）：tybook 根路径返回 39B 的 {\"errcode\":202,\"errmsg\":\"Empty app id\"}，\n//   用「根路径 + 长度阈值」判活会把正常 API 线路误标成「内容异常」；必须用带完整\n//   参数的签名接口。java.connect 失败时返回异常堆栈串而非抛异常，须显式排除。\nfunction TX_probeUrl(u) {\n  if (u.indexOf('scdn.taoyuewenhua.net') > -1) {\n    return u + '/app/chapters/yw_20120838908848304.json';\n  }\n  if (u.indexOf('tybook.taoyuewenhua.net') > -1) {\n    return TX_url(java, TX_params({}), u, '/auth/account.do');\n  }\n  return u + '/';\n}\nfunction TX_testAll() {\n  var list = TX_found();\n  TX_toast('⏱ 阶段1/3：开始测速，共 ' + list.length + ' 条路线（非搜索接口，不触发搜索风控）…');\n  var i, r, b, ms, tag, best = -1, bestMs = 999999;\n  for (i = 0; i < list.length; i++) {\n    ms = -1; tag = '✗ 不可达';\n    try {\n      var t0 = Date.now();\n      r = java.connect(TX_probeUrl(list[i]), TX_hdr(), 10000);\n      b = String(r.body());\n      if (b.indexOf('Exception') > -1 || b.indexOf('timeout') > -1) {\n        tag = '✗ 不可达';\n      } else if (r.code && (r.code() < 200 || r.code() >= 400)) {\n        tag = '✗ HTTP/' + r.code();\n      } else if (b.indexOf('\"errcode\":0') > -1 || b.indexOf('\"chapterList\"') > -1 || b.length > 500) {\n        ms = Date.now() - t0;\n        try { if (r.callTime) { var ct = Number(r.callTime()); if (ct > 0) ms = ct; } } catch (eC) {}\n        tag = ms + 'ms';\n        if (ms < bestMs) { bestMs = ms; best = i; }\n      } else {\n        tag = '✗ 内容异常(' + b.length + 'B)';\n      }\n    } catch (e) { tag = '✗ ' + String(e).substring(0, 24); }\n    try { source.put('txDelay' + i, tag); } catch (e2) {}\n    TX_toast('  · 路线' + (i + 1) + ' ' + TX_of(list[i]) + ' → ' + tag);\n  }\n  TX_toast('📝 阶段2/3：延时已写入各网址按钮，正在刷新面板…');\n  if (best >= 0) {\n    try { source.put('txBest', String(best)); } catch (e3) {}\n    try { source.put('txDelay' + best, '⚡' + bestMs + 'ms'); } catch (e4) {}\n  }\n  TX_refresh();\n  TX_toast('✅ 阶段3/3：测速完成' + (best >= 0 ? '，最快 ' + TX_of(list[best]) + ' ⚡' + bestMs + 'ms（未自动切换，请手动点路线按钮）' : '，全部不可达'));\n}\n\n// ---------- 🔍 检查登录状态 ----------\n// 本源是游客态：无账号体系。该按钮给出「是否需要登录」的明确结论 + 凭证健康度。\n// 只打 /auth/account.do（非搜索接口），不会触发搜索风控。\nfunction TX_checkLogin() {\n  TX_toast('🔍 阶段1/3：正在检查游客凭证与接口连通性…');\n  var p = TX_params({});\n  var api = TX_gv('txApiHost', TX_API_DEFAULT);\n  var u = TX_url(java, p, api, '/auth/account.do');\n  var r = null, b = '', code = 0;\n  try { r = java.connect(u, TX_hdr(), 10000); b = String(r.body()); code = Number(r.code()); }\n  catch (e) { b = 'Exception ' + e; }\n  var ok = code >= 200 && code < 400 && b.indexOf('\"errcode\":0') > -1;\n  var isVip = /\"isVip\":true/.test(b);\n  TX_toast('📡 阶段2/3：/auth/account.do → HTTP ' + code + ' / ' + b.length + 'B');\n  if (ok) {\n    TX_toast('✅ 阶段3/3：游客凭证有效，无需登录（isVip=' + isVip + '）；搜索/详情/目录/正文均可用');\n  } else {\n    TX_toast('❌ 阶段3/3：接口异常 ' + b.slice(0, 100) + '；请在「路线」里切换到 ⚡ 最快线路后重试');\n  }\n  try { source.put('txLoginCheck', ok ? '游客态正常' : '异常'); } catch (e2) {}\n  TX_refresh();\n}\nfunction TX_web() {\n  TX_toast('🌐 正在打开官方落地页 ' + TX_of(TX_pub()) + ' …');\n  try { java.openUrl(TX_pub()); TX_toast('✅ 已调起浏览器'); }\n  catch (e) { TX_toast('⚠ 无法调起浏览器：' + String(e).slice(0, 80) + '；地址：' + TX_pub()); }\n}\n\n// ---------- 线路切换（各网站一个按钮） ----------\n// 切线路时同时写 txApiHost / txCdnHost：若选中的是 scdn 则只切 CDN，API 保持默认；\n// 其余线路切 API。这样「各网站点击切换」对真实生效的域名语义正确。\nfunction TX_switch(n) {\n  var list = TX_found();\n  if (n < 1 || n > list.length) { TX_toast('⚠ 路线' + n + ' 不存在，当前只有 ' + list.length + ' 条'); return; }\n  var u = list[n - 1];\n  TX_toast('⏳ 正在切换到路线' + n + '：' + TX_of(u) + ' …');\n  try {\n    if (u.indexOf('scdn.taoyuewenhua.net') > -1) {\n      // CDN 线路：只切目录域名，API 保持默认\n      source.put('txCdnHost', u);\n      source.put('txApiHost', TX_API_DEFAULT);\n    } else if (u.indexOf('tybook.taoyuewenhua.net') > -1) {\n      // 主 API 线路：切 API，CDN 回默认\n      source.put('txApiHost', u);\n      source.put('txCdnHost', TX_CDN_DEFAULT);\n    } else {\n      // 官方落地页等「非 API 域」：只记发布页，不动 API/CDN，\n      // 避免用户误切到 403 的 assetlinks 域导致整源不可用。\n      source.put('txPub', u);\n    }\n    source.put('txLine', String(n));\n  } catch (e) { TX_toast('❌ 写入失败：' + e); return; }\n  TX_toast('✅ 已切换到 ' + TX_of(u) + '；请重新搜索/刷新书城验证');\n  TX_refresh();\n}\n\n// ---------- viewName 动态文本（只读 source，不碰 java） ----------\n// ★viewName 为 JS 表达式时，求值结果经 normalizeJsResult「原样显示、不剥引号」\n//   （源码级实锤），因此这两个函数返回纯文本，禁止自带外层单引号。\nfunction TX_lineBtn(n) {\n  var list = TX_found();\n  if (n > list.length) return '— 备用位 —';\n  var u = list[n - 1];\n  var d = TX_gv('txDelay' + (n - 1), '');\n  var cur = '';\n  try { cur = String(source.get('txLine') || ''); } catch (e) {}\n  var mark = (String(n) === cur) ? '● ' : '○ ';\n  return mark + TX_of(u) + (d ? ' ' + d : '');\n}\nfunction TX_curLineText() {\n  var api = TX_gv('txApiHost', TX_API_DEFAULT);\n  var cdn = TX_gv('txCdnHost', TX_CDN_DEFAULT);\n  var st = TX_gv('txLoginCheck', '未检查');\n  return '当前 API：' + TX_of(api) + ' ｜ CDN：' + TX_of(cdn) + ' ｜ 状态：' + st;\n}", "respondTime": 180000, "ruleBookInfo": {"author": "$.authorName", "coverUrl": "$.coverUrl", "init": "$.data", "intro": "<br>\n📂 分类：{{$.categoryName}}\n🎗 标签：{{$.tagList##\\s##，}}\n👤 主角：{{$.roleList##\\s##，}}\n🕰 更新：{{java.timeFormat(java.getString('$.latestChapterUpdateTime'))}}\n📖 字数：{{$.allWords}}\n📝 简介：\n{{$.intro}}", "kind": "{{$.categoryName}}\n{{java.getString('$.status')=='50'?'完结':'连载'}}\n{{$.tagList##\\s##·}}", "lastChapter": "$.latestChapter", "name": "$.title", "tocUrl": "@js:\n// {{$.bid}} 由 Legado 模板先求值，再进 @js\nTX_tocUrl(java, source, '{{$.bid}}');", "wordCount": "$.allWords"}, "ruleContent": {"content": "$.data.content"}, "ruleExplore": {"author": "$.authorName", "bookList": "$.data.bookList||$.data.books", "bookUrl": "sourceId@js:\n// result = 该条书籍 JSON 的 sourceId 字段值（前缀规则 sourceId@js: 已取出）\nTX_bookUrl(java, source, result);", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "{{$.categoryName}}\n{{java.getString('$.status')=='50'?'完结':'连载'}}\n{{$.tagList##\\s##·}}", "name": "$.title", "wordCount": "$.allWords"}, "ruleSearch": {"author": "$.authorName", "bookList": "$.data.bookList", "bookUrl": "sourceId@js:\n// result = 该条书籍 JSON 的 sourceId 字段值（前缀规则 sourceId@js: 已取出）\nTX_bookUrl(java, source, result);", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "{{$.categoryName}}\n{{java.getString('$.status')=='50'?'完结':'连载'}}\n{{$.tagList##\\s##·}}", "name": "$.title", "wordCount": "$.allWords"}, "ruleToc": {"chapterList": "$.data.chapterList", "chapterName": "$.title", "chapterUrl": "@js:\nTX_contentUrl(java, source, '{{$.bid}}', '{{$.cid}}');", "updateTime": "{{$.words}} 字 · {{java.timeFormat(java.getString('$.modifiedOn'))}}"}, "searchUrl": "@js:\nTX_search(java, source, key, page);", "variableComment": "本源无需填写变量；线路切换请用「菜单→登录」里的路线按钮。", "weight": 0},{"bookSourceGroup": "API,APP", "bookSourceName": "🍊青橙小说API", "bookSourceType": 0, "bookSourceUrl": "https://goway.reader.yueyouxs.com", "bookUrlPattern": "https?://(?:goway|dl|cdn\\.p|ads|bi)\\.reader\\.yueyouxs\\.com/goway/goread/app/book/detail\\?bookId=[0-9]+.*", "concurrentRate": "1500", "customButton": false, "customOrder": 4, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\n(function(){\n  var out=[];\n  var CHS={\"男频\": {\"c\": \"11\", \"cls\": [[\"都市人生\", 1100], [\"玄幻奇幻\", 1101], [\"武侠仙侠\", 1102], [\"军事历史\", 1103], [\"科幻末世\", 1104], [\"游戏体育\", 1105], [\"悬疑灵异\", 1107], [\"脑洞大开\", 1108]], \"plot\": [\"乡土\", \"系统\", \"重生\", \"热血\", \"升级流\", \"废材流\", \"洪荒\", \"无敌流\", \"医术\", \"脑洞\", \"扮猪吃虎\", \"年代\"], \"role\": [\"高手下山\", \"赘婿\", \"兵王\", \"神医\", \"保镖\", \"奶爸\", \"女总裁\", \"校花\", \"神豪\", \"至尊\", \"草根\", \"妖孽\"], \"common\": true}, \"女频\": {\"c\": \"21\", \"cls\": [[\"现代言情\", 2100], [\"古代言情\", 2101], [\"幻想言情\", 2102], [\"穿越时空\", 2104], [\"宫闱争斗\", 2105], [\"豪门总裁\", 2106], [\"婚恋爱情\", 2107], [\"经商种田\", 2108]], \"plot\": [\"甜宠\", \"先婚后爱\", \"医术\", \"马甲\", \"重生\", \"扮猪吃虎\", \"种田\", \"快穿\", \"系统\", \"娱乐圈\", \"年代\", \"穿越\"], \"role\": [\"总裁\", \"萌宝\", \"女强\", \"团宠\", \"反派\", \"王妃\", \"嫡女\", \"皇后\", \"宠妻\", \"腹黑\", \"天才\", \"农女\"], \"common\": true}, \"短篇\": {\"c\": \"41\", \"cls\": [[\"现实情感\", 4100], [\"家庭婚姻\", 4102], [\"热血青春\", 4103], [\"治愈成长\", 4104], [\"奇闻怪谈\", 4105], [\"悬疑脑洞\", 4106], [\"古风言情\", 4107]], \"plot\": [\"出轨\", \"反转\", \"婚姻\", \"家庭\", \"打脸逆袭\", \"治愈\", \"白月光\", \"虐恋\", \"重生\"], \"role\": [], \"common\": false}, \"图书\": {\"c\": \"31\", \"cls\": [[\"学习强国\", 3104], [\"文学小说\", 3102], [\"古代典籍\", 3103], [\"名家名作\", 3105], [\"出版读物\", 3101], [\"史家专著\", 3108]], \"plot\": [], \"role\": [], \"common\": false}};\n  var ch='',hasIm=false;\n  try{ if(typeof infoMap!=='undefined' && infoMap['频道']){ ch=String(infoMap['频道']); hasIm=true; } }catch(e){}\n  if(!hasIm){ try{ var v=String(java.get('qcChannel')||''); if(v) ch=v; }catch(e){} }\n  if(!CHS[ch]) ch='男频';\n  var cfg=CHS[ch], cnum=cfg.c, C=cfg.cls, PLOT=cfg.plot, ROLE=cfg.role;\n\n  function head(title){\n    return {title:title,url:'',type:'button',action:\"java.toast('\"+title+\"')\",\n            style:{layout_flexBasisPercent:1,layout_wrapBefore:true,layout_flexGrow:0}};\n  }\n  function sec(title,sid){\n    var bd='data=&sectionId='+sid+'&page=1';\n    return {title:title,url:QC_url('/goway/goread/app/section/v4/book/list','',bd)+','+QC_opt(bd),style:{}};\n  }\n  function simple(title,path,bd){\n    return {title:title,url:QC_url('/goway/goread/app/'+path,'',bd)+','+QC_opt(bd),style:{}};\n  }\n  function paged(title,tagList,c,cs,ob,ff){\n    var bd='tagList='+tagList+'&classify='+c+'&psize=20&fullFlag='+ff+'&tagTypeId=0&orderBy='+ob+'&page=1&classifySecondList='+cs;\n    var js=\"(function(){var pg=1;try{if(page!=null&&String(page)!=='')pg=parseInt(String(page))||1;}catch(e){}try{var m=String(result).match(/[?&]page=([0-9]+)/);if(m)pg=parseInt(m[1])||1;}catch(e){}if(pg<1)pg=1;return 'https://goway.reader.yueyouxs.com'+QC_sign('/goway/goread/app/classify/v352/search','page='+pg,\"+JSON.stringify(bd)+\");})()\";\n    var opt={\"method\":\"POST\",\"headers\":{\"Content-Type\":\"application/x-www-form-urlencoded\",\"User-Agent\":\"okhttp/4.10.0\"},\"body\":bd,\"js\":js};\n    return {title:title,url:'https://goway.reader.yueyouxs.com/goway/goread/app/classify/v352/search?page={{page}},'+JSON.stringify(opt),style:{}};\n  }\n\n  /* ① 频道 select: 男频/女频/短篇/图书 */\n  out.push({title:'频道',type:'select',chars:['男频','女频','短篇','图书'],default:'男频',\n    action:\"java.put('qcChannel',infoMap['频道']); java.refreshExplore();\",style:{layout_wrapBefore:true}});\n  out.push({title:'状态',type:'button',action:\"java.toast('当前频道：'+(java.get('qcChannel')||'男频'))\",\n    viewName:\"'当前：'+(java.get('qcChannel')||'男频')\",style:{layout_wrapBefore:true}});\n  /* ② 通用榜单只给男频/女频(短篇/图书的 rank/clsTag 实测忽略 classify 恒返回男频数据, 不挂避免误导) */\n  if(cfg.common){\n    var S=[[\"🔥 热门风向标\", 3066], [\"⭐ 满级神作\", 3068], [\"📈 热门追更榜\", 2747], [\"✅ 完结精品库\", 2748], [\"🚀 异军突起\", 2751], [\"📕 火爆完本\", 3227], [\"🆕 最新好书\", 3228]];\n    for(var i=0;i<S.length;i++) out.push(sec(S[i][0],S[i][1]));\n    out.push(simple('🏆 热门排行','rank/v4/index','classify='+cnum));\n    out.push(simple('🏷️ 标签精选','clsTag/getBookList','classify='+cnum+'&page=1'));\n    out.push(simple('✨ 个性化推荐','section/v4/recommend/list','data=&page=1'));\n  }\n  /* ③ 分类: 满格标题 + 常驻 热度/更新/新书 */\n  var O=[[\"热度\", \"readers\"], [\"更新\", \"cpsUpdateTime\"], [\"新书\", \"createTime\"]];\n  out.push(head('📚 '+ch+' · 题材分类'));\n  for(var i=0;i<C.length;i++){\n    out.push(head(C[i][0]));\n    for(var k=0;k<O.length;k++) out.push(paged(O[k][0],'',cnum,String(C[i][1]),O[k][1],'-1'));\n  }\n  /* ④ 情节标签 */\n  if(PLOT.length){\n    out.push(head('🎭 '+ch+' · 情节标签'));\n    for(var i=0;i<PLOT.length;i++) out.push(paged(PLOT[i],PLOT[i],cnum,'','readers','-1'));\n  }\n  /* ⑤ 角色标签 */\n  if(ROLE.length){\n    out.push(head('👤 '+ch+' · 角色标签'));\n    for(var i=0;i<ROLE.length;i++) out.push(paged(ROLE[i],ROLE[i],cnum,'','readers','-1'));\n  }\n  /* ⑥ 状态筛选(常驻有 url, 保证短篇/图书也有非空 url 首项) */\n  var F=[[\"全部\", \"-1\"], [\"连载\", \"0\"], [\"完结\", \"1\"]];\n  out.push(head('📖 '+ch+' · 全站状态'));\n  for(var k=0;k<F.length;k++) out.push(paged(F[k][0],'',cnum,'','readers',F[k][1]));\n  return JSON.stringify(out);\n})()", "header": "{\n  \"User-Agent\": \"okhttp/4.10.0\",\n  \"Content-Type\": \"application/x-www-form-urlencoded\"\n}", "jsLib": "/* 青橙小说 签名库 (QC) —— 静态票据 + 按 path/query/body 重算 sign\n   自 com.qingcheng.reader 5.0.1.1 / libnative-lib.so\n   _s   = MD5(deviceId+userId) 固定\n   sign = HMAC-SHA256(KEY, path+encodedQuery+\"&\"+R0+\"&\"+排序POST参数(解一层URL编码))\n   _p   = URLEncode(DES/ECB/NoPadding(DESK, R0+\"&sign=\"+sign + \\u0001填充到8倍数)) Base64\n   注: R0 内 uth 依赖旧 time, 故 time 必须固定为抓包时刻; 服务端实测无时间窗口(40min+仍有效)\n*/\nvar QC_KEY='NiozHhg/lMm5ja-DVEV_jzk$,t0B4*$5';\nvar QC_DESK='snY%169j';\nvar QC_R0='utId=&deviceId=ylms&userId=y233108512&sex=unknown&tmpToken=18ed8908ad0749d2ab6e1dc91f055eec&st=4&uth=21920cda455ba0f3883dc675899c5354&oaid=&udid=';\nvar QC_COMMON='platId=2&appId=com.qingcheng.reader&channelId=qingchengxs&appVersion=5.0.1&srcChannelId=qingchengxs&time=1794411627&_s=0D8E1B4226B86B69A867999DE9F2C505&mode=1&verCode=5000101&insTs=1794411459';\nvar QC_B64='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nfunction QC_b64(x){var o='';for(var i=0;i<x.length;i+=3){var a=x[i]&255,b=i+1<x.length?x[i+1]&255:0,c=i+2<x.length?x[i+2]&255:0,n=(a<<16)|(b<<8)|c;o+=QC_B64.charAt((n>>18)&63)+QC_B64.charAt((n>>12)&63)+(i+1<x.length?QC_B64.charAt((n>>6)&63):'=')+(i+2<x.length?QC_B64.charAt(n&63):'=');}return o;}\nfunction QC_dec1(s){var o='';for(var i=0;i<s.length;i++){if(s.charAt(i)==='%'&&i+2<s.length){var h=s.slice(i+1,i+3);if(/^[0-9a-fA-F]{2}$/.test(h)){o+=String.fromCharCode(parseInt(h,16));i+=2;continue;}}o+=s.charAt(i);}return o;}\nfunction QC_hm(s){var m=Packages.javax.crypto.Mac.getInstance('HmacSHA256');m.init(new Packages.javax.crypto.spec.SecretKeySpec(new Packages.java.lang.String(QC_KEY).getBytes('UTF-8'),'HmacSHA256'));var d=m.doFinal(new Packages.java.lang.String(s).getBytes('UTF-8'));var o='';for(var i=0;i<d.length;i++){var h=(d[i]&255).toString(16);o+=h.length<2?'0'+h:h;}return o;}\nfunction QC_ec(s){var c=Packages.javax.crypto.Cipher.getInstance('DES/ECB/NoPadding');c.init(Packages.javax.crypto.Cipher.ENCRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(new Packages.java.lang.String(QC_DESK).getBytes('UTF-8'),'DES'));return QC_b64(c.doFinal(new Packages.java.lang.String(s).getBytes('UTF-8')));}\nfunction QC_jurl(s){return String(Packages.java.net.URLEncoder.encode(s,'UTF-8'));}\nfunction QC_sign(path,queryExtra,body){\n  var q=QC_COMMON+(queryExtra?'&'+queryExtra:'');\n  var d={},ps=String(body||'').split('&');\n  for(var i=0;i<ps.length;i++){var p=ps[i].indexOf('=');if(p>0)d[ps[i].slice(0,p)]=QC_dec1(ps[i].slice(p+1));}\n  var ks=[];for(var k in d)ks.push(k);ks.sort();\n  var so=[];for(var i=0;i<ks.length;i++)if(d[ks[i]]!=='')so.push(ks[i]+'='+d[ks[i]]);\n  var plain=QC_R0+'&sign='+QC_hm(path+q+'&'+QC_R0+'&'+so.join('&'));\n  var L=new Packages.java.lang.String(plain).getBytes('UTF-8').length;\n  while(L%8!==0){plain+='\\u0001';L++;}\n  return path+'?'+q+'&_p='+QC_jurl(QC_ec(plain));\n}\n\n/* QC_url: 纯函数, 返回带签名的完整 URL (不含 java 绑定) */\nfunction QC_url(path, qe, body, host){\n  return 'https://' + (host || 'goway.reader.yueyouxs.com') + QC_sign(path, qe, body);\n}\nfunction QC_opt(body){\n  return JSON.stringify({\"method\":\"POST\",\"headers\":{\"Content-Type\":\"application/x-www-form-urlencoded\",\"User-Agent\":\"okhttp/4.10.0\"},\"body\":body});\n}\nfunction QC_clean(s){ return String(s==null?'':s).replace(/<[^>]*>/g,'').replace(/&nbsp;/g,' ').replace(/&amp;/g,'&'); }\nfunction QC_post(path, qe, body, host, jv){\n  return String(jv.ajax(QC_url(path,qe,body,host) + ',' + QC_opt(body)));\n}\n", "lastUpdateTime": "1794548526828", "loginUi": "[{\"name\": \"状态\", \"type\": \"button\", \"action\": \"QC_checkLogin(java)\", \"viewName\": \"QC_statusLabel()\"}, {\"name\": \"线路\", \"type\": \"button\", \"action\": \"QC_testMs(java)\", \"viewName\": \"QC_lineLabel()\"}, {\"name\": \"🔍 检查登录状态\", \"type\": \"button\", \"action\": \"QC_checkLogin(java)\"}, {\"name\": \"⚡ 测试官方API延时\", \"type\": \"button\", \"action\": \"QC_testMs(java)\"}, {\"name\": \"📚 测试目录·正文线路\", \"type\": \"button\", \"action\": \"QC_testDl(java)\"}, {\"name\": \"🧪 签名票据自检\", \"type\": \"button\", \"action\": \"QC_selfTest(java)\"}]", "loginUrl": "/* 青橙小说 签名库 (QC) —— 静态票据 + 按 path/query/body 重算 sign\n   自 com.qingcheng.reader 5.0.1.1 / libnative-lib.so\n   _s   = MD5(deviceId+userId) 固定\n   sign = HMAC-SHA256(KEY, path+encodedQuery+\"&\"+R0+\"&\"+排序POST参数(解一层URL编码))\n   _p   = URLEncode(DES/ECB/NoPadding(DESK, R0+\"&sign=\"+sign + \\u0001填充到8倍数)) Base64\n   注: R0 内 uth 依赖旧 time, 故 time 必须固定为抓包时刻; 服务端实测无时间窗口(40min+仍有效)\n*/\nvar QC_KEY='NiozHhg/lMm5ja-DVEV_jzk$,t0B4*$5';\nvar QC_DESK='snY%169j';\nvar QC_R0='utId=&deviceId=ylms&userId=y233108512&sex=unknown&tmpToken=18ed8908ad0749d2ab6e1dc91f055eec&st=4&uth=21920cda455ba0f3883dc675899c5354&oaid=&udid=';\nvar QC_COMMON='platId=2&appId=com.qingcheng.reader&channelId=qingchengxs&appVersion=5.0.1&srcChannelId=qingchengxs&time=1794411627&_s=0D8E1B4226B86B69A867999DE9F2C505&mode=1&verCode=5000101&insTs=1794411459';\nvar QC_B64='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nfunction QC_b64(x){var o='';for(var i=0;i<x.length;i+=3){var a=x[i]&255,b=i+1<x.length?x[i+1]&255:0,c=i+2<x.length?x[i+2]&255:0,n=(a<<16)|(b<<8)|c;o+=QC_B64.charAt((n>>18)&63)+QC_B64.charAt((n>>12)&63)+(i+1<x.length?QC_B64.charAt((n>>6)&63):'=')+(i+2<x.length?QC_B64.charAt(n&63):'=');}return o;}\nfunction QC_dec1(s){var o='';for(var i=0;i<s.length;i++){if(s.charAt(i)==='%'&&i+2<s.length){var h=s.slice(i+1,i+3);if(/^[0-9a-fA-F]{2}$/.test(h)){o+=String.fromCharCode(parseInt(h,16));i+=2;continue;}}o+=s.charAt(i);}return o;}\nfunction QC_hm(s){var m=Packages.javax.crypto.Mac.getInstance('HmacSHA256');m.init(new Packages.javax.crypto.spec.SecretKeySpec(new Packages.java.lang.String(QC_KEY).getBytes('UTF-8'),'HmacSHA256'));var d=m.doFinal(new Packages.java.lang.String(s).getBytes('UTF-8'));var o='';for(var i=0;i<d.length;i++){var h=(d[i]&255).toString(16);o+=h.length<2?'0'+h:h;}return o;}\nfunction QC_ec(s){var c=Packages.javax.crypto.Cipher.getInstance('DES/ECB/NoPadding');c.init(Packages.javax.crypto.Cipher.ENCRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(new Packages.java.lang.String(QC_DESK).getBytes('UTF-8'),'DES'));return QC_b64(c.doFinal(new Packages.java.lang.String(s).getBytes('UTF-8')));}\nfunction QC_jurl(s){return String(Packages.java.net.URLEncoder.encode(s,'UTF-8'));}\nfunction QC_sign(path,queryExtra,body){\n  var q=QC_COMMON+(queryExtra?'&'+queryExtra:'');\n  var d={},ps=String(body||'').split('&');\n  for(var i=0;i<ps.length;i++){var p=ps[i].indexOf('=');if(p>0)d[ps[i].slice(0,p)]=QC_dec1(ps[i].slice(p+1));}\n  var ks=[];for(var k in d)ks.push(k);ks.sort();\n  var so=[];for(var i=0;i<ks.length;i++)if(d[ks[i]]!=='')so.push(ks[i]+'='+d[ks[i]]);\n  var plain=QC_R0+'&sign='+QC_hm(path+q+'&'+QC_R0+'&'+so.join('&'));\n  var L=new Packages.java.lang.String(plain).getBytes('UTF-8').length;\n  while(L%8!==0){plain+='\\u0001';L++;}\n  return path+'?'+q+'&_p='+QC_jurl(QC_ec(plain));\n}\n\n/* ===== 运维面板 ===== */\n\n/* 青橙小说 运维面板(精简版): 本源固定官方域, 无发布页线路轮换; 游客态免登录 */\nfunction login(){ return 'ok'; }\nfunction QC_tip(jv,msg,key,val){\n  try{jv.toast(String(msg));}catch(e){}\n  try{jv.longToast(String(msg));}catch(e){}\n  try{if(key)jv.put(key,String(val==null?msg:val));}catch(e){}\n  try{jv.reLoginView(false);}catch(e){try{jv.reUiView(false);}catch(e2){}}\n  return String(msg);\n}\nfunction QC_get(jv,k,d){var v='';try{v=String(jv.get(k)||'');}catch(e){}return v||d;}\n/* ① 检查登录状态: 本源游客态即可用, 显示票据与接口状态 */\nfunction QC_checkLogin(jv){\n  QC_tip(jv,'⏳ 正在检查接口与票据状态…','qcStatus','检查中…');\n  var body='bookId=272713&needChapter=0&needRecommend=0',ok=false,ms=0,code='?',t0=Date.now();\n  try{\n    var u='https://goway.reader.yueyouxs.com'+QC_sign('/goway/goread/app/book/detail','',body);\n    var o=JSON.stringify({\"method\":\"POST\",\"headers\":{\"Content-Type\":\"application/x-www-form-urlencoded\",\"User-Agent\":\"okhttp/4.10.0\"},\"body\":body});\n    var s=String(jv.ajax(u+','+o)); ms=Date.now()-t0;\n    try{code=String(JSON.parse(s).code);}catch(e){}\n    ok=(code==='0');\n  }catch(e){}\n  var state=ok?'✅ 游客态可用（本源无需登录）':'❌ 接口异常 code='+code;\n  return QC_tip(jv,'登录状态：'+state+'｜票据 _s 静态有效｜延时 '+ms+'ms','qcStatus',(ok?'游客态OK':'异常')+' '+ms+'ms');\n}\n/* ② 官方 API 线路延时测试(单域, ms 写入状态按钮) */\nfunction QC_testMs(jv){\n  QC_tip(jv,'⏳ 正在测试官方 API 线路延时…','qcStatus','测速中…');\n  var body='bookId=272713&needChapter=0&needRecommend=0',ms='失败',ok=false;\n  var t0=Date.now();\n  try{\n    var u='https://goway.reader.yueyouxs.com'+QC_sign('/goway/goread/app/book/detail','',body);\n    var o=JSON.stringify({\"method\":\"POST\",\"headers\":{\"Content-Type\":\"application/x-www-form-urlencoded\",\"User-Agent\":\"okhttp/4.10.0\"},\"body\":body});\n    var s=String(jv.ajax(u+','+o));\n    ok=(s.indexOf('\"code\":0')>=0&&s.indexOf('bookName')>=0);\n    ms=ok?String(Date.now()-t0)+'ms':'不可用';\n  }catch(e){}\n  jv.put('qcSpeed',ms);\n  return QC_tip(jv,(ok?'✅ 官方线路正常 ':'❌ 官方线路异常 ')+ms,'qcStatus','官方线路 '+ms);\n}\n/* ③ 目录/正文线路延时测试 */\nfunction QC_testDl(jv){\n  QC_tip(jv,'⏳ 正在测试目录·正文线路延时…','qcStatus','测速中…');\n  var qe='bookId=272713&chapterId=0&isAll=1',ms='失败',ok=false,t0=Date.now();\n  try{\n    var u='https://dl.reader.yueyouxs.com'+QC_sign('/userCenter/getChapterList',qe,'tmp=');\n    var o=JSON.stringify({\"method\":\"POST\",\"headers\":{\"Content-Type\":\"application/x-www-form-urlencoded\",\"User-Agent\":\"okhttp/4.10.0\"},\"body\":\"tmp=\"});\n    var s=String(jv.ajax(u+','+o));\n    ok=(s.indexOf('\"code\":0')>=0&&s.indexOf('chapterId')>=0);\n    ms=ok?String(Date.now()-t0)+'ms':'不可用';\n  }catch(e){}\n  jv.put('qcSpeedDl',ms);\n  return QC_tip(jv,(ok?'✅ 目录·正文线路正常 ':'❌ 目录·正文线路异常 ')+ms,'qcStatus','DL线路 '+ms);\n}\n/* ④ 签名票据自检(重放比对, 内联签名库已在上方) */\nfunction QC_selfTest(jv){\n  QC_tip(jv,'⏳ 正在校验签名算法…','qcStatus','自检中…');\n  var cap='8V2uOfk%2BpFEuFu1J9nzFSeDyHv%2FOQgsQenZywqH7gBHpM%2FLtd%2FKPiKPTOS7aisJR1ltB3Zvzx2aLVhM1cNqMfcb8GXmQJO2bQuNS4CQqnjgQkU0zCzziJRuwtQmEFVbtlfDwvxsOUFO6ibx%2Fbu1dZGOV4rtnAngaC7ff7RUc2JVJKnwp1%2BKAdqA8iYZUvh1OwcmKRoDc2sJsNjSR%2FTJEdK%2BOLxPDSsU93PlW37m%2FFNg1lKWycncbvRTnLfDsABhvvwxvOUxexfRg0bxifksRZLOMjNtnoxJe';\n  var B='trace=20_20-17-1x265526%253FisRead%253D0%2526sectionId%253D295%2526id%253D5348&needRecommend=0&shelfBookIds=272713%2C271939%2C266764%2C275277%2C247700%2C272997%2C265526%2C269934&needChapter=0&bookId=272713';\n  var mine='';\n  try{\n    var d={},ps=B.split('&');\n    for(var i=0;i<ps.length;i++){var p=ps[i].indexOf('=');if(p>0)d[ps[i].slice(0,p)]=QC_dec1(ps[i].slice(p+1));}\n    var ks=[];for(var k in d)ks.push(k);ks.sort();\n    var so=[];for(var i=0;i<ks.length;i++)if(d[ks[i]]!=='')so.push(ks[i]+'='+d[ks[i]]);\n    var plain=QC_R0+'&sign='+QC_hm('/goway/goread/app/book/detail'+QC_COMMON+'&'+QC_R0+'&'+so.join('&'));\n    var L=new Packages.java.lang.String(plain).getBytes('UTF-8').length;\n    while(L%8!==0){plain+='\\u0001';L++;}\n    mine=QC_jurl(QC_ec(plain));\n  }catch(e){mine='ERR '+e;}\n  var ok=(mine===cap);\n  return QC_tip(jv,(ok?'✅ 签名算法自检通过（与官方密文字节级一致）':'❌ 签名自检失败：'+String(mine).slice(0,60)),'qcStatus',ok?'签名OK':'签名异常');\n}\n/* viewName 动态文本(viewName 环境有 java 绑定) */\nfunction QC_statusLabel(){\n  var s='';try{s=String(java.get('qcStatus')||'未检测');}catch(e){s='未检测';}\n  return '状态：'+s;\n}\nfunction QC_lineLabel(){\n  var a='';try{a=String(java.get('qcSpeed')||'待测试');}catch(e){a='待测试';}\n  var b='';try{b=String(java.get('qcSpeedDl')||'待测试');}catch(e){b='待测试';}\n  return '🟢 官方 goway '+a+' ｜ 目录·正文 dl '+b;\n}\n", "respondTime": 180000, "ruleBookInfo": {"author": "$.author", "coverUrl": "$.coverUrl", "init": "@js:\n(function(){\n  var id = String(baseUrl).replace(/^.*?bookId=([0-9]+).*$/,'$1');\n  if(!/^[0-9]+$/.test(id)){ try{ id = String(book.bookUrl||'').replace(/^.*?bookId=([0-9]+).*$/,'$1'); }catch(e){} }\n  if(!/^[0-9]+$/.test(id)) return '{}';\n  var body = 'bookId=' + id + '&needChapter=0&needRecommend=0';\n  var raw = QC_post('/goway/goread/app/book/detail','',body,'goway.reader.yueyouxs.com',java);\n  var j = {}; try{ j = JSON.parse(raw); }catch(e){}\n  var b = (j.data && j.data.book) || {};\n  return JSON.stringify({\n    name: QC_clean(b.bookName), author: QC_clean(b.authorName),\n    kind: (b.classifyName||'') + '/' + (b.classifySecondName||'') + '/' + (b.tag||''),\n    wordCount: b.wordsDesc||'', lastChapter: b.latestChapterName||'',\n    intro: String(b.intro||'').replace(/\\r/g,''), coverUrl: b.bookPic||'',\n    tocUrl: 'https://dl.reader.yueyouxs.com/userCenter/getChapterList?bookId=' + id + '&chapterId=0&isAll=1'\n  });\n})()", "intro": "$.intro", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name", "tocUrl": "$.tocUrl", "wordCount": "$.wordCount"}, "ruleContent": {"content": "@js:\n(function(){\n  var u = String(baseUrl);\n  var mb = u.match(/bookId=([0-9]+)/), mc = u.match(/chapterId=([0-9]+)/);\n  if(!mb || !mc) return '';\n  var body = 'inBuyView=false&ossSwitch=0&feeState=0&chapterId=' + mc[1] + '&useSrvAutoBuy=1&readCount=0&autoBuy=false&isOssed=0&bookId=' + mb[1];\n  var raw = QC_post('/userCenter/v310/downloadChapter','',body,'dl.reader.yueyouxs.com',java);\n  var j = {}; try{ j = JSON.parse(raw); }catch(e){}\n  var cu = j.data && j.data.contentUrl;\n  if(!cu) return '［获取失败］' + (j.msg||'无正文直链');\n  var txt = String(java.ajax(cu));\n  if(txt.indexOf('<?xml')===0 || txt.indexOf('<Error')>=0) return '［获取失败］' + txt.slice(0,120);\n  return txt.replace(/\\r/g,'').replace(/^\\s+|\\s+$/g,'');\n})()"}, "ruleExplore": {"author": "$.author", "bookList": "@js:\n(function(){\n  var raw=String(result || (typeof src!=='undefined'?src:'') || '');\n  var j={};try{j=JSON.parse(raw);}catch(e){}\n  var arr=[];\n  if(j.data){\n    if(Array.isArray(j.data)) arr=j.data;\n    else if(j.data.list && Array.isArray(j.data.list)) arr=j.data.list;\n    else if(j.data.bookList && Array.isArray(j.data.bookList)) arr=j.data.bookList;\n    else if(j.data.rankList && Array.isArray(j.data.rankList)) arr=j.data.rankList;\n  }\n  var list=new Packages.java.util.ArrayList();\n  for(var i=0;i<arr.length;i++){\n    var b=arr[i]; if(!b) continue;\n    var bid=b.bookId||b.id||b.wapBookId; if(!bid) continue;\n    var nm=b.bookName||'';\n    list.add(JSON.stringify({\n      name:QC_clean(nm), author:QC_clean(b.authorName||''),\n      coverUrl:b.bookPic||'',\n      kind:(b.classifyName||'')+'/'+(b.classifySecondName||'')+' · '+(b.wordsDesc||''),\n      intro:String(b.introOrRec||b.intro||'').replace(/\\r/g,''),\n      bookUrl:'https://goway.reader.yueyouxs.com/goway/goread/app/book/detail?bookId='+bid\n    }));\n  }\n  return list;\n})()", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "name": "$.name"}, "ruleSearch": {"author": "$.author", "bookList": "@js:\n(function(){\n  var raw = String(result || (typeof src!=='undefined'?src:'') || '');\n  var j = {}; try{ j = JSON.parse(raw); }catch(e){}\n  var arr = (j.data && j.data.list && Array.isArray(j.data.list)) ? j.data.list : [];\n  var list = new Packages.java.util.ArrayList();\n  for(var i=0;i<arr.length;i++){\n    var b = arr[i];\n    if(!b.id) continue;\n    list.add(JSON.stringify({\n      name: QC_clean(b.bookName), author: QC_clean(b.authorName),\n      kind: (b.tag||'') , wordCount: b.wordsDesc||'', intro: String(b.intro||'').replace(/\\r/g,''),\n      coverUrl: b.bookPic||'',\n      bookUrl: 'https://goway.reader.yueyouxs.com/goway/goread/app/book/detail?bookId=' + b.id\n    }));\n  }\n  return list;\n})()", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "name": "$.name", "wordCount": "$.wordCount"}, "ruleToc": {"chapterList": "@js:\n(function(){\n  var id = String(baseUrl).replace(/^.*?bookId=([0-9]+).*$/,'$1');\n  if(!/^[0-9]+$/.test(id)) return new Packages.java.util.ArrayList();\n  var qe = 'bookId=' + id + '&chapterId=0&isAll=1';\n  var txt = QC_post('/userCenter/getChapterList', qe, 'tmp=', 'dl.reader.yueyouxs.com', java);\n  var j = {}; try{ j = JSON.parse(txt); }catch(e){}\n  var arr = (j.data && Array.isArray(j.data)) ? j.data : [];\n  var list = new Packages.java.util.ArrayList();\n  for(var i=0;i<arr.length;i++){\n    var c = arr[i];\n    list.add(JSON.stringify({\n      name: String(c.chapterName||''),\n      url: 'https://dl.reader.yueyouxs.com/userCenter/v310/downloadChapter?bookId=' + id + '&chapterId=' + c.chapterId,\n      vip: (c.isFee===1 || c.vip===1)\n    }));\n  }\n  return list;\n})()", "chapterName": "$.name", "chapterUrl": "$.url", "isVip": "$.vip"}, "searchUrl": "@js:\n(function(){\n  var kw = String(key||'');\n  var body = 'keyword=' + kw + '&page=' + page + '&psize=20&withRecommend=1';\n  return QC_url('/goway/goread/app/search/v4/getBookByKeyword','',body) + ',' + QC_opt(body);\n})()", "weight": 0},{"bookSourceComment": "本书源 来源于laizhiyu大佬\n\n本次修改尽量减少webView搜索太慢问题，硬编码html，去掉不必要的dom渲染及.js、 .css网络拉取。每日轮转的签名函数做了缓存，定时拉取。\n\n注：cache对象的超时参数有点bug，到了设定时间不会自动失效，只有杀了阅读app后台才生效。", "bookSourceGroup": "小说", "bookSourceName": "可乐小说（可以使用网址添加）", "bookSourceType": 0, "bookSourceUrl": "https://www.klxs123.com/", "bookUrlPattern": "https?://www\\.klxs123\\.com/book/\\w+\\.html", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nconst groups = {\n  \"二次元\": [\n    {title:\"原生幻想\", url:\"/list-25-{{page}}/\"},\n    {title:\"恋爱日常\", url:\"/list-26-{{page}}/\"},\n    {title:\"衍生同人\", url:\"/list-27-{{page}}/\"},\n    {title:\"搞笑吐槽\", url:\"/list-28-{{page}}/\"}\n  ],\n  \"男生\": [\n    {title:\"玄幻小说\", url:\"/list-4-{{page}}/\"},\n    {title:\"奇幻小说\", url:\"/list-5-{{page}}/\"},\n    {title:\"武侠小说\", url:\"/list-6-{{page}}/\"},\n    {title:\"仙侠小说\", url:\"/list-7-{{page}}/\"},\n    {title:\"都市小说\", url:\"/list-8-{{page}}/\"},\n    {title:\"军事小说\", url:\"/list-9-{{page}}/\"},\n    {title:\"历史小说\", url:\"/list-10-{{page}}/\"},\n    {title:\"游戏小说\", url:\"/list-11-{{page}}/\"},\n    {title:\"体育小说\", url:\"/list-12-{{page}}/\"},\n    {title:\"科幻小说\", url:\"/list-13-{{page}}/\"},\n    {title:\"诸天无限\", url:\"/list-14-{{page}}/\"},\n    {title:\"悬疑小说\", url:\"/list-15-{{page}}/\"}\n  ],\n  \"女生\": [\n    {title:\"古代言情\", url:\"/list-16-{{page}}/\"},\n    {title:\"仙侠奇缘\", url:\"/list-17-{{page}}/\"},\n    {title:\"现代言情\", url:\"/list-18-{{page}}/\"},\n    {title:\"浪漫青春\", url:\"/list-19-{{page}}/\"},\n    {title:\"玄幻言情\", url:\"/list-20-{{page}}/\"},\n    {title:\"悬疑推理\", url:\"/list-21-{{page}}/\"},\n    {title:\"科幻空间\", url:\"/list-22-{{page}}/\"},\n    {title:\"游戏竞技\", url:\"/list-23-{{page}}/\"},\n    {title:\"短篇言情\", url:\"/list-24-{{page}}/\"},\n    {title:\"轻小说\", url:\"/list-42-{{page}}/\"}\n  ]\n};\n\nconst list = [];\n\nlist.push({\n  title: \"频道\",\n  type: \"select\",\n  chars: [\"男生\", \"女生\", \"二次元\"],\n  default: \"男生\",\n  action: \"java.refreshExplore()\",\n  style: {layout_flexBasisPercent: 1}\n});\n\nconst selected = infoMap[\"频道\"] || \"男生\";\nconst items = groups[selected];\n\nitems.forEach(item => {\n  list.push({\n    title: item.title,\n    url: item.url,\n    style: {layout_flexBasisPercent: 0.29}\n  });\n});\n\ninfoMap.save();\nJSON.stringify(list);", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 12; Pixel 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\",\n  \"Referer\": \"https://www.klxs123.com/\"\n}", "lastUpdateTime": "1794538081508", "loginUrl": "https://www.rrssk.com/0005.html", "respondTime": 180000, "ruleBookInfo": {"author": "[property$=author]@content", "coverUrl": "[property=og:image]@content", "intro": "[property=og:description]@content", "kind": "[property$=category]@content&&\n[property$=status]@content&&\n[property$=update_time]@content", "lastChapter": "[property$=latest_chapter_name]@content", "name": "[property$=book_name]@content", "tocUrl": "@js:\nbaseUrl.replace(\"/book/\", \"/chapter/\")"}, "ruleContent": {"content": ".content > p@text\n<js>\nconst chars = \"内暴强情缝肏插逼操潮喷阴艳裸乳荡穴鸡淫苞奸胸射嫩肉骚性蒂茎陰騷奶屄成人药春迷尿粉肛龟头A精屌口狂蜜处女唇道阳虐虫妇液色颜熟交爽臀爆舔做爱欲吹自慰点gG玉幼援抽Bb水母狗户部要了奴小脚痒酥死我兽揉搓捏扣抠棍棒洞密美少摩腿春乱伦露漏浪开巨根菊巴黑豪好肥送艳被干拔乱理白刺体下面诱感快货比日妈你娘婊子配仙火叫在里子宫给聊照流群屁眼马无码友拳洞片黄偷禁套弄位脱光舒服溜舞丢还糜妻换妓招嫖娼aA毛Hh一夜本热推图书娃男抓浑圆饱满润湿滑丰腴韵尤物横陈存娇喘息麻桃透风腹长粗肿胀人紧夹吸撅起来雪发翘硕大胴双草坐挲跨柔软臂瘫媚秘破\";\nconst replacementChars = chars.split(\"\");\nreplacementChars[43] = \"AV\";\n\nvar content = String(result).replace(/<i class=\"icon icon-uni([0-9a-fA-F]{4})\"><\\/i>/g, (_, p1) =>\n  String.fromCharCode(parseInt(p1, 16))\n);\n\ncontent = content.replace(/[\\uE001-\\uE101]/g, char => {\n  let code = char.charCodeAt(0);\n  return replacementChars[code - 0xE001];\n});\n</js>", "nextContentUrl": ".btnW a:contains(下一页)@href", "title": "h1@text"}, "ruleExplore": {"author": "a[href*=author]@text", "bookList": ".dList li", "bookUrl": ".name a@href", "coverUrl": "img@src", "intro": ".intro@text", "kind": ".dlS.1@dd@text", "lastChapter": ".infoM2 dt:contains(更新：) + dd@text", "name": ".name a@text"}, "ruleReview": {"enabled": true}, "ruleSearch": {"author": ".book-card__meta-item:contains(作者：)@ownText", "bookList": ".book-card@js:\nif(!result || result.size() === 0){\n\t // 搜索失败，立即清空所有缓存\n  cache.delete(\"home_html_data\");\n  cache.delete(\"home_html_timestamp\");\n  cache.delete(\"daily_signjs_value\");\n  cache.delete(\"daily_signjs_timestamp\");\n}\n\nresult;", "bookUrl": ".book-card@onclick\n@js:\nconst window = {\n  open(url){\n    let t = url.match(/t=([\\w%]+)/)?.[1];\n    if(!t) return \"\";\n    return java.base64Decode(decodeURIComponent(t))\n  }\n};\n\neval(result)", "coverUrl": "img@src", "intro": ".book-card__desc@text", "kind": ".book-tag@text&&.book-card__update@text##更新：", "name": ".book-card__title@text"}, "ruleToc": {"chapterList": "@js:\nconst chapters = [];\nif(/\\/chapter\\//.test(baseUrl)) {\n  let doc = org.jsoup.Jsoup.parse(result);\n  let elements = doc.select(\".chapListBody a\");\n  elements.forEach(a => {\n    let text = a.text().trim();\n    let href = a.attr(\"href\");\n    chapters.push({text, href})\n  })\n} else {\n  try {\n    let trimRes = String(result).trim();\n    if (trimRes.startsWith(\"<\")) {\n      // 返回HTML，直接跳出，不执行JSON解析\n      throw \"not json\";\n    }\n    let json = JSON.parse(result);\n    if (json.data && json.data.length > 0){\n      json.data.forEach(ch => {\n        chapters.push({\n          text: ch.chaptername,\n          href: ch.chapterurl\n        })\n      })\n    }\n  } catch (e) {\n    // 这里去掉toast弹窗，不再弹出Unexpected token报错干扰\n    // java.longToast(e.message)\n  }\n}\n\nchapters", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": "@js:\n(() => {\nconst nextpageList = java.getStringList(\"@@.dropDown li:not(.cur)@data-p\");\nconst jsUrl = result.match(/src=\"(\\/templates\\/js\\/[A-Za-z0-9]+\\.js)\"/)?.[1];\nif(nextpageList.size() == 0 || !jsUrl) return [];\n\nconst host = java.toURL(baseUrl).origin;\nconst cryptHtml = java.ajax(host+jsUrl);\nconst key = cryptHtml.match(/new AESCrypt\\('([A-Za-z0-9]{32})'\\)/)?.[1];\nconst iv = cryptHtml.match(/CryptoJS\\.enc\\.Utf8\\.parse\\('(\\d{16})'\\)/)?.[1];\nif(!key || !iv) return [];\n\nconst id = baseUrl.match(/chapter\\/(.*?)\\.html/)?.[1];\nconst nextpages = Array.from(nextpageList, (page) => {\n  let postBody = java.createSymmetricCrypto('AES/CBC/PKCS5Padding', key, iv).encryptBase64(JSON.stringify({\n    id: id,\n    page: page\n  }));\n  return host + '/index.php?action=loadChapterPage,' + JSON.stringify({\n\t   \"method\": \"POST\",\n\t   \"body\": \"data=\"+encodeURIComponent(postBody)\n  })\n});\n\nreturn nextpages\n})()"}, "searchUrl": "@js:\n/**\n * 对齐网站搜索规则前置校验\n * 1. 去除首尾空格\n * 2. 字数限制：2～8个字\n * 3. 拦截高危特殊符号，只允许常规中文、字母、数字、常用中文标点\n * 非法特殊符号：引号、斜杠、括号、@#$^&*{}[]等脚本危险字符\n */\nfunction checkKeywordLegal(word) {\n    const trimWord = String(word).trim();\n    const kwLen = trimWord.length;\n    // 空值拦截\n    if (kwLen === 0) {\n        java.longToast(\"搜索关键词不能为空\");\n        throw new Error(\"搜索关键词不能为空\");\n    }\n    // 字数校验 2～8位\n    if (kwLen < 2 || kwLen > 8) {\n    \t   java.longToast(\"搜索关键字只允许2~8个字之间\");\n        throw new Error(\"搜索关键字只允许2~8个字之间\");\n    }\n    // 禁止高危特殊符号正则\n    const forbidReg = /[\\\\\\\"\\(\\)\\{\\}\\[\\]<>@#$%^&*;:|~]/;\n    if (forbidReg.test(trimWord)) {\n    \t   java.longToast(\"关键词包含非法特殊符号，请重新输入\");\n        throw new Error(\"关键词包含非法特殊符号，请重新输入\");\n    }\n}\n\n// JS字符串转义兜底，防止注入语法报错\nfunction jsStrEscape(str) {\n    if (str == null) return \"\";\n    return String(str)\n        .replace(/\\\\/g, \"\\\\\\\\\")\n        .replace(/\"/g, '\\\\\"')\n        .replace(/\\n/g, \"\\\\n\")\n        .replace(/\\r/g, \"\\\\r\")\n        .replace(/\\t/g, \"\\\\t\");\n}\n// 最先执行关键词校验，不合法直接抛出，终止全部后续流程\ncheckKeywordLegal(key);\n\nvar host = \"https://www.rrssk.com\";\nvar homeUrl = host + \"/0005.html\";\n\n// 缓存Key定义\nconst KEY_HOME_HTML = \"home_html_data\";\nconst KEY_HOME_STAMP = \"home_html_timestamp\";\nconst KEY_SIGNJS_VAL = \"daily_signjs_value\";\nconst KEY_SIGNJS_STAMP = \"daily_signjs_timestamp\";\n\n// 时效配置（单位：秒）\nconst HOME_TTL = 120;\nconst SIGNJS_TTL = 21600;\n\n// public.js 固定硬编码\nconst publicJsCode = `\n// rrssk public.js v11\nfunction __enc(x) {\n    return encodeURIComponent(x).replace(/[!'()*]/g, function(c) {\n        return '%' + c.charCodeAt(0).toString(16).toUpperCase();\n    });\n}\nfunction __signData(kw, t) {\n    if (!window.__SIGN || typeof window.__SIGN.f !== 'function') return null;\n    var ts = Math.floor(Date.now() / 1000);\n    return { ts: ts, s: window.__SIGN.f(__enc(kw), t, ts) };\n}\n`;\n\nconst nowSecond = Math.floor(Date.now() / 1000);\n\n// 读取首页缓存，双重校验过期\nlet homeHtmlRaw = null;\nconst cacheHome = cache.get(KEY_HOME_HTML);\nconst cacheHomeStamp = Number(cache.get(KEY_HOME_STAMP) || 0);\n// 缓存存在 + 手动时间未超时才复用\nif (cacheHome && cacheHomeStamp && (nowSecond - cacheHomeStamp < HOME_TTL)) {\n    homeHtmlRaw = cacheHome;\n}\n\n// 过期|无缓存，重新拉取\nif (!homeHtmlRaw) {\n    homeHtmlRaw = String(java.ajax(homeUrl));\n    cache.put(KEY_HOME_HTML, homeHtmlRaw, HOME_TTL);\n    cache.put(KEY_HOME_STAMP, String(nowSecond), HOME_TTL);\n}\n\n// 解析页面关键内容\nconst tMatch = homeHtmlRaw.match(/name=\"_t\" value=\"([^\"]+)\"/);\nconst apiMatch = homeHtmlRaw.match(/action=[\"'](\\/\\?action=\\w+)[\"']/);\nconst signJsLinkMatch = homeHtmlRaw.match(/<script src=\"(\\/\\?action=signJs[^\"]+)\"/);\n\nif (!tMatch) {\n\t   java.longToast(\"页面解析失败：未获取_t签名令牌\");\n    throw new Error(\"页面解析失败：未获取_t签名令牌\");\n}\nif (!apiMatch) {\n\t   java.longToast(\"页面解析失败：未获取搜索接口地址\");\n    throw new Error(\"页面解析失败：未获取搜索接口地址\");\n}\nif (!signJsLinkMatch) {\n\t   java.longToast(\"页面解析失败：未匹配signJs脚本链接\");\n    throw new Error(\"页面解析失败：未匹配signJs脚本链接\");\n};\n\nconst tokenT = tMatch[1];\nconst searchApi = apiMatch[1];\n\n// signJs 双重过期校验\nlet signJsCode = null;\nconst cacheSignJsVal = cache.get(KEY_SIGNJS_VAL);\nconst cacheSignJsStamp = Number(cache.get(KEY_SIGNJS_STAMP) || 0);\nif (cacheSignJsVal && cacheSignJsStamp && (nowSecond - cacheSignJsStamp < SIGNJS_TTL)) {\n    signJsCode = cacheSignJsVal;\n}\n\nif (!signJsCode) {\n    const signJsUrl = host + signJsLinkMatch[1];\n    signJsCode = String(java.ajax(signJsUrl));\n    cache.put(KEY_SIGNJS_VAL, signJsCode, SIGNJS_TTL);\n    cache.put(KEY_SIGNJS_STAMP, String(nowSecond), SIGNJS_TTL);\n}\n\n// 简化页面\nlet renderHtml = homeHtmlRaw\n    .replace(/<link[^>]*>/gi, '')\n    .replace(/<img[^>]*>/gi, '')\n    .replace(/<svg[\\s\\S]*?<\\/svg>/gi, '')\n    .replace(/<footer[\\s\\S]*?<\\/footer>/gi, '')\n    .replace(/<script src=\"\\/templates\\/js\\/jquery[\\s\\S]*?<\\/script>/, '')\n    .replace(/<script src=\"\\/templates\\/js\\/public\\.js[\\s\\S]*?<\\/script>/, `<script>${publicJsCode}</script>`)\n    .replace(/<script src=\"\\/\\?action=signJs[\\s\\S]*?<\\/script>/, `<script>${signJsCode}</script>`);\n\n// 执行签名\nconst safeKey = jsStrEscape(key);\nconst injectScript = `const res = __signData(\"${safeKey}\",\"${tokenT}\"); res ? res.s : null;`;\nconst signResult = String(java.webView(renderHtml, homeUrl, injectScript, false));\n\nif (!signResult || signResult === \"00000000\") {\n\t   java.longToast(\"签名失败：WebView环境指纹校验不通过\");\n    throw new Error(\"签名失败：WebView环境指纹校验不通过\");\n}\n\n// 拼装POST参数\nconst postBody = \"_t=\" + encodeURIComponent(tokenT)\n    + \"&_ts=\" + Math.floor(Date.now() / 1000)\n    + \"&_s=\" + encodeURIComponent(signResult)\n    + \"&keyword=\" + encodeURIComponent(key);\n\nhost + searchApi + \",\" + JSON.stringify({\n    method: \"POST\",\n    body: postBody\n});", "weight": 0},{"bookSourceComment": "v7：修复登录面板在真机报 TypeError: java.lang.reflect.Array.newInstance 不是函数（改用 BufferedReader 文本流读法，规则层同步去掉 byte[] 创建）；测速判据放宽为「有实质响应即通」；恢复「检查登录状态」并升级为线路自检按钮（显示版本/字节数/是否盾页/影片链接数）。线路仍从发布页动态获取、测速不自动切换。\n2026.11.13 v8：新增子内容规则(subContent)，从站内弹幕接口取弹幕供内置播放器加载；\n播放/线路/目录/正文解密与 v7 完全一致，弹幕取不到时静默放弃、不影响播放。", "bookSourceGroup": "影视频源 🎬", "bookSourceName": "▶ OmoFun 动漫（弹幕版）", "bookSourceType": 4, "bookSourceUrl": "https://www.omofuns.com", "bookUrlPattern": "https?://[^/]+/anime/[0-9a-f]{24}\\.html", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:(function(){\nvar UA='Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n// 默认兜底线路（与发布页当前 4 条一致）；实际线路来自登录面板「一键从发布页获取」写入的 om_lines\nvar DEF_LINES=['https://www.omofuns.com','https://cn.233dm.com','https://cn.211dm.com','https://cn.agekkkk.com'];\nfunction lines(){\n  var raw=SV('om_lines'),a=null;\n  if(raw){try{a=JSON.parse(String(raw));}catch(e){a=null;}}\n  if(a&&a.length){\n    var r=[],seen={};\n    for(var i=0;i<a.length;i++){\n      var u=(typeof a[i]==='string')?a[i]:(a[i]&&a[i].u?String(a[i].u):'');\n      u=String(u).replace(/\\/+$/,'');\n      if(u.indexOf('https://')===0&&u.indexOf('fb.omoo')<0&&!seen[u]){seen[u]=1;r.push(u);}\n    }\n    if(r.length)return r;\n  }\n  // 兼容旧书源遗留的 om_sn / om_s1..8\n  var n=parseInt(SV('om_sn'),10)||0,r2=[];\n  for(var j=1;j<=n&&j<=8;j++){var v=SV('om_s'+j).replace(/\\/+$/,'');if(v.indexOf('https://')===0)r2.push(v);}\n  if(r2.length)return r2;\n  return DEF_LINES;\n}\nvar K=[78,63,169,194,18,125,136,239,85,170,11,205,222,173,190,239];\nfunction S(v){try{var s=String(v==null?'':v);return (s==='null'||s==='undefined'||s==='[object Object]'||s==='JsNull')?'':s;}catch(e){return '';}}\nfunction SV(k){try{return S(source.get(k));}catch(e){return '';}}\nfunction sub(k,v){try{source.put(k,String(v));}catch(e){}}\nfunction curLine(){var c=SV('om_line').replace(/\\/+$/,''),a=lines();if(c.indexOf('https://')===0&&c.indexOf('fb.omoo')<0){for(var i=0;i<a.length;i++)if(a[i]===c)return c;if(c===SV('om_custom').replace(/\\/+$/,''))return c;}return a[0];}\nfunction hostOf(u){var s=String(u==null?'':u),m=/^https?:\\/\\/([^\\/]+)/.exec(s);if(!m)return '';var hn=m[1],a=lines();for(var i=0;i<a.length;i++){if(a[i].replace(/^https?:\\/\\//,'')===hn)return a[i];}if(s.indexOf('https://')===0)return 'https://'+hn;return '';}\nfunction ord(){var c=curLine(),a=lines(),r=[c];for(var i=0;i<a.length;i++){if(a[i]!==c)r.push(a[i]);}return r;}\nfunction gt(h){h=String(h==null?'':h);if(!h)return true;return h.indexOf('\\u7cfb\\u7edf\\u5b89\\u5168\\u9a8c\\u8bc1')>=0||h.indexOf('verify_check')>=0;}\nfunction okPage(h){h=String(h==null?'':h);if(!h||h.length<8000)return false;if(gt(h))return false;return true;}\nfunction b64(s){var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',o='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i)&255,b=i+1<s.length?s.charCodeAt(i+1)&255:null,c=i+2<s.length?s.charCodeAt(i+2)&255:null,n=(a<<16)|((b||0)<<8)|(c||0);o+=t.charAt((n>>18)&63)+t.charAt((n>>12)&63)+(b===null?'=':t.charAt((n>>6)&63))+(c===null?'=':t.charAt(n&63));}return o;}\nfunction tk(){var ts=String(Date.now()),p='';for(var i=0;i<ts.length;i++)p+=String.fromCharCode(ts.charCodeAt(i)^K[i%16]);return b64(p);}\nfunction b64b(s){\n  // 用 ByteArrayOutputStream 生成 byte[]，避开反射建数组的高危 API\n  // （Legado 登录面板/部分真机环境里该 Class 会被解析成 JavaPackage 而非类）\n  var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n  var bos=new Packages.java.io.ByteArrayOutputStream(),buf=0,bits=0,i,ch,v;\n  for(i=0;i<s.length;i++){\n    ch=s.charAt(i);\n    if(ch==='='||ch==='\\n'||ch==='\\r'||ch===' ')continue;\n    v=t.indexOf(ch);\n    if(v<0)continue;\n    buf=((buf<<6)|v)&0x3FFFFF;bits+=6;\n    if(bits>=8){bits-=8;bos.write((buf>>bits)&255);}\n  }\n  return bos.toByteArray();\n}\nfunction hk(b){var m=/^https?:\\/\\/([^\\/]+)/.exec(String(b||''));return m?('om_ck_'+m[1]):'om_ck_x';}\nfunction rdCk(b){return SV(hk(b));}\nfunction wrCk(b,sc){if(!sc)return;var parts=String(sc).split(';');var kv=parts[0];if(kv&&kv.indexOf('=')>0){var old=rdCk(b),name=kv.split('=')[0];var keep=[];if(old){var o=old.split(';');for(var i=0;i<o.length;i++){var p=String(o[i]).replace(/^\\s+/,'');if(p&&p.split('=')[0]!==name)keep.push(p);}}keep.push(kv);sub(hk(b),keep.join('; '));}}\nfunction TXT(c){\n  // 文本流读法：InputStream -> (gzip 则包 GZIPInputStream) -> BufferedReader 逐行。\n  // 全程不创建 Java byte[]，避开反射建数组的高危 API。\n  var is=c.getInputStream();\n  try{\n    var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);\n  }catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\n// 最后一次重试用：跳过 SSL 证书/主机名校验（应对被劫持的线路或自签播放器证书）\nfunction looseSSL(c){\n  // 最后一次重试兜底：只跳过主机名校验（足以应对 CN=*.10086.cn 这类劫持证书）。\n  // 不再自建 TrustManager[] —— 那需要反射创建 Java 数组，真机会崩。\n  try{\n    var hv=new JavaAdapter(Packages.javax.net.ssl.HostnameVerifier,{verify:function(a,b){return true;}});\n    c.setHostnameVerifier(hv);\n  }catch(e){}\n}\nfunction REQ(url,method,body,ck,loose){\n  var out={code:0,h:'',sc:''};\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod(method||'GET');\n    c.setConnectTimeout(8000);c.setReadTimeout(15000);\n    c.setInstanceFollowRedirects(true);\n    if(loose)looseSSL(c);\n    c.setRequestProperty('User-Agent',UA);\n    c.setRequestProperty('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    if(ck)c.setRequestProperty('Cookie',String(ck));\n    if(body!=null){c.setDoOutput(true);c.setRequestProperty('Content-Type','application/x-www-form-urlencoded');var os=c.getOutputStream();os.write(new Packages.java.lang.String(String(body)).getBytes('UTF-8'));os.flush();os.close();}\n    out.code=c.getResponseCode();\n    try{out.h=TXT(c);}catch(e1){out.h='';}\n    try{var v=c.getHeaderFields().get('Set-Cookie');if(v){var t=[];for(var i=0;i<v.size();i++)t.push(String(v.get(i)));out.sc=t.join(';');}}catch(e2){}\n  }catch(e){out.h='';out.err=String(e);}\n  return out;\n}\nfunction pass(b){\n  try{\n    var r=REQ(b+'/index.php/ajax/verify_check?type=search','POST','i='+encodeURIComponent(tk()),rdCk(b));\n    wrCk(b,r.sc);\n    var s=String(r.h||'');\n    return s.indexOf('\"code\":1')>=0||s.indexOf('\"code\": 1')>=0;\n  }catch(e){return false;}\n}\nfunction G1(b,p){var r=REQ(b+p,'GET',null,rdCk(b));wrCk(b,r.sc);return String(r.h||'');}\nfunction fetch(b,p){\n  var h=G1(b,p);\n  if(okPage(h))return h;\n  for(var i=0;i<2;i++){\n    if(!pass(b))break;\n    try{Packages.java.lang.Thread.sleep(400);}catch(e){}\n    h=G1(b,p);\n    if(okPage(h))break;\n  }\n  return h;\n}\nfunction pick(p){\n  var a=ord(),last='';\n  for(var i=0;i<a.length;i++){\n    var h=fetch(a[i],p);\n    if(okPage(h)){if(a[i]!==curLine())sub('om_line',a[i]);return{h:h,b:a[i]};}\n    last=h;\n  }\n  return{h:last,b:a[0]};\n}\nfunction pth(u){var s=String(u==null?'':u),m=/^https?:\\/\\/[^\\/]+(\\/[^\\s]*)?$/.exec(s);return m?(m[1]||'/'):'/';}\nfunction abs(b,u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('http')===0)return u;if(u.indexOf('//')===0)return 'https:'+u;if(u.charAt(0)==='/')return b+u;return b+'/'+u;}\nfunction pic(u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('//')===0)return 'https:'+u;if(u.indexOf('http')===0){if(u.replace(/\\/+$/,'')==='https://as.cfhls.top')return '';return u;}if(u.charAt(0)==='/')return 'https://as.cfhls.top'+u;return u;}\nfunction Jp(h){try{return Packages.org.jsoup.Jsoup.parse(String(h||''));}catch(e){return null;}}\nfunction txt(e){try{return e?String(e.text()).trim():'';}catch(x){return '';}}\nfunction attr(e,n){try{return e?String(e.attr(n)||'').trim():'';}catch(x){return '';}}\nfunction first(d,sel){try{var e=d.select(sel);return e&&e.size()>0?e.get(0):null;}catch(x){return null;}}\nfunction parseList(h,b){\n  var out=[],seen={};\n  if(!h||gt(h))return out;\n  var d=Jp(h);if(!d)return out;\n  var as=null;\n  try{as=d.select('a[href*=/anime/]');}catch(e1){return out;}\n  if(!as)return out;\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);var u=attr(a,'href');\n    if(u.indexOf('/anime/')<0||u.indexOf('.html')<0)continue;\n    if(u.indexOf('/play/')>=0)continue;\n    var n=attr(a,'title');if(!n)n=txt(a);\n    if(!n||n.length>60)continue;\n    // 无封面不再跳过条目：隐藏轮播 banner 只有图床根路径背景，coverUrl 留空即可，\n    // 详情页规则会自动补封面。若同 URL 已有条目且旧的无封面、新的有封面，则用新的替换。\n    var p1=attr(a,'data-original');\n    if(!p1){var im=first(a,'img');if(im){p1=attr(im,'data-original')||attr(im,'src');}}\n    p1=pic(p1);\n    var old=seen[u];\n    if(old){\n      if(p1){var prev=null;try{prev=JSON.parse(out[old-1]);}catch(e8){}\n        if(prev&&!prev.coverUrl){\n          var kind2=prev.kind||'',last2=prev.lastChapter||'';\n          var li2=null;try{li2=a.parent();}catch(e9){}\n          var g2=0;while(li2&&g2++<4){var tg2='';try{tg2=String(li2.tagName());}catch(e10){}if(String(tg2).toLowerCase()==='li')break;try{li2=li2.parent();}catch(e11){li2=null;break;}}\n          if(li2){var bs2=null;try{bs2=li2.select('span b');}catch(e12){}if(bs2&&bs2.size()>=2){kind2=txt(bs2.get(0));last2=txt(bs2.get(bs2.size()-1));}}\n          out[old-1]=JSON.stringify({name:prev.name,bookUrl:prev.bookUrl,coverUrl:p1,kind:kind2,lastChapter:last2});\n        }\n      }\n      continue;\n    }\n    var kind='',last='';var li=null;try{li=a.parent();}catch(e4){}\n    var g=0;\n    while(li&&g++<4){var tg='';try{tg=String(li.tagName());}catch(e5){}if(String(tg).toLowerCase()==='li')break;try{li=li.parent();}catch(e6){li=null;break;}}\n    if(li){var bs=null;try{bs=li.select('span b');}catch(e7){}\n      if(bs&&bs.size()>=2){kind=txt(bs.get(0));last=txt(bs.get(bs.size()-1));}}\n    seen[u]=out.length+1;\n    out.push(JSON.stringify({name:n,bookUrl:abs(b,u),coverUrl:p1,kind:kind,lastChapter:last}));\n  }\n  return out;\n}\nfunction arr(list,out){try{var l=new Packages.java.util.ArrayList();for(var i=0;i<out.length;i++)l.add(out[i]);return l;}catch(e){return out;}}\n\nvar b=curLine();\nvar rows=[\n {title:'\\ud83d\\udcfa \\u9996\\u9875\\u63a8\\u8350',url:b+'/'},\n {title:'\\ud83d\\uddd3 \\u65b0\\u756a\\u8868\\uff08\\u5468\\u66f4\\uff09',url:b+'/week/'},\n {title:'\\ud83d\\udd25 \\u4eca\\u65e5\\u70ed\\u64ad',url:b+'/dayhot/'},\n {title:'\\ud83c\\uddef\\ud83c\\uddf5 \\u65e5\\u6f2b',url:b+'/type/1-{{page}}.html'},\n {title:'\\ud83c\\udde8\\ud83c\\uddf3 \\u56fd\\u6f2b',url:b+'/type/2-{{page}}.html'},\n {title:'\\ud83c\\udfac \\u52a8\\u753b',url:b+'/type/5-{{page}}.html'},\n {title:'\\ud83c\\udf9e \\u5267\\u573a\\u7248',url:b+'/type/24-{{page}}.html'},\n {title:'\\ud83e\\uddb8 \\u7279\\u6444',url:b+'/type/4-{{page}}.html'},\n {title:'\\ud83c\\uddfa\\ud83c\\uddf8 \\u7f8e\\u6f2b',url:b+'/type/3-{{page}}.html'}\n];\nreturn JSON.stringify(rows);\n})()", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1794533014312", "loginCheckJs": "(function(){ try { return result || ''; } catch(e) { return ''; } })()", "loginUi": "[{\"key\": \"om_status\", \"type\": \"text\", \"name\": \"当前状态\", \"viewName\": \"OM_status(source)\", \"hint\": \"切换线路后点右上角 √ 保存\"}, {\"key\": \"om_pub\", \"type\": \"text\", \"name\": \"发布页网址\", \"hint\": \"默认 https://fb.omoo.tv/ ，发布页改版/换镜像时在此修改\", \"defaultValue\": \"https://fb.omoo.tv/\"}, {\"key\": \"om_btn_get\", \"type\": \"button\", \"name\": \"🔄 一键从发布页获取网址路线\", \"action\": \"OM_actGet(java,source)\"}, {\"key\": \"om_btn_speed\", \"type\": \"button\", \"name\": \"⚡ 测试延时（只显示结果，不自动切换）\", \"action\": \"OM_actSpeed(java,source)\"}, {\"key\": \"om_btn_check\", \"type\": \"button\", \"name\": \"🔍 检查登录状态 / 自检当前线路\", \"action\": \"OM_actCheck(java,source)\"}, {\"key\": \"om_btn_line1\", \"type\": \"button\", \"name\": \"线路 1\", \"viewName\": \"OM_label(source,0)\", \"action\": \"OM_actSet(java,source,0)\"}, {\"key\": \"om_btn_line2\", \"type\": \"button\", \"name\": \"线路 2\", \"viewName\": \"OM_label(source,1)\", \"action\": \"OM_actSet(java,source,1)\"}, {\"key\": \"om_btn_line3\", \"type\": \"button\", \"name\": \"线路 3\", \"viewName\": \"OM_label(source,2)\", \"action\": \"OM_actSet(java,source,2)\"}, {\"key\": \"om_btn_line4\", \"type\": \"button\", \"name\": \"线路 4\", \"viewName\": \"OM_label(source,3)\", \"action\": \"OM_actSet(java,source,3)\"}, {\"key\": \"om_btn_line5\", \"type\": \"button\", \"name\": \"线路 5\", \"viewName\": \"OM_label(source,4)\", \"action\": \"OM_actSet(java,source,4)\"}, {\"key\": \"om_btn_line6\", \"type\": \"button\", \"name\": \"线路 6\", \"viewName\": \"OM_label(source,5)\", \"action\": \"OM_actSet(java,source,5)\"}, {\"key\": \"om_btn_line7\", \"type\": \"button\", \"name\": \"线路 7\", \"viewName\": \"OM_label(source,6)\", \"action\": \"OM_actSet(java,source,6)\"}, {\"key\": \"om_btn_line8\", \"type\": \"button\", \"name\": \"线路 8\", \"viewName\": \"OM_label(source,7)\", \"action\": \"OM_actSet(java,source,7)\"}, {\"key\": \"om_custom\", \"type\": \"text\", \"name\": \"自定义线路\", \"hint\": \"填 https:// 开头的完整域名\"}, {\"key\": \"om_btn_custom\", \"type\": \"button\", \"name\": \"➡ 切换到自定义线路\", \"action\": \"OM_custom(java,source)\"}, {\"key\": \"om_btn_reset\", \"type\": \"button\", \"name\": \"↩ 恢复默认线路\", \"action\": \"OM_reset(java,source)\"}]", "loginUrl": "<js>\nfunction login(){}\nvar OM_DEF=['https://www.omofuns.com','https://cn.233dm.com','https://cn.211dm.com','https://cn.agekkkk.com'];\nvar OM_PUB='https://fb.omoo.tv/';\nvar OM_UA='Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\nfunction OM_g(v){var x=String(v===undefined||v===null?'':v);return (x==='null'||x==='undefined'||x==='JsNull'||x==='[object Object]')?'':x;}\nfunction OM_pub(sv){var v=OM_g(sv.get('om_pub')).replace(/\\/+$/,'');return v.indexOf('http')===0?v:OM_PUB;}\nfunction OM_toast(jv,m){try{jv.toast(m);return;}catch(e){}try{jv.longToast(m);}catch(e2){}}\n\n// 纯 JS base64 解码（Latin-1，线路 URL 均为 ASCII）\nfunction OM_b64d(s){\n  var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',o='',buf=0,bits=0,i,v;\n  for(i=0;i<s.length;i++){\n    var ch=s.charAt(i);if(ch==='='||ch==='\\n'||ch==='\\r'||ch===' ')continue;\n    v=t.indexOf(ch);if(v<0)continue;\n    buf=((buf<<6)|v)&0xFFFFFF;bits+=6;\n    if(bits>=8){bits-=8;o+=String.fromCharCode((buf>>bits)&255);}\n  }\n  return o;\n}\n\n// 原生 HttpURLConnection：发布页 / 线路探活共用，绝不调用 java.ajax（真机会 ClassCastException）\nfunction OM_GET(url){\n  var out={h:'',ms:0,ok:false,err:''},t0=Date.now();\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod('GET');c.setConnectTimeout(6000);c.setReadTimeout(10000);\n    c.setInstanceFollowRedirects(true);\n    c.setRequestProperty('User-Agent',OM_UA);\n    c.setRequestProperty('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    out.h=OM_TXT(c);\n    // 判据放宽：只要拿到实质响应就算「线路通」。安全验证页也是通的（过盾由规则层负责）。\n    out.ok=out.h.length>=1000;\n  }catch(e){out.err=String(e);}\n  out.ms=Date.now()-t0;return out;\n}\n// 文本流读法：不创建 Java byte[]，避开真机上会崩的反射建数组 API\nfunction OM_TXT(c){\n  var is=c.getInputStream();\n  try{\n    var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);\n  }catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\n\n// 从发布页混淆脚本里执行出 encodedLinks（脚本字符串已打散，纯正则取不到，必须 eval）\nfunction OM_fetchLines(jv,pub){\n  var r=OM_GET(pub);\n  if(!r.h)return{err:'\\u65e0\\u6cd5\\u8bfb\\u53d6\\u53d1\\u5e03\\u9875\\uff1a'+(r.err||'\\u7a7a\\u54cd\\u5e94')};\n  var re=/<script[^>]*>([\\s\\S]*?)<\\/script>/g,m,code='';\n  while((m=re.exec(r.h))!==null){if(m[1].indexOf('encodedLinks')>=0)code=m[1];}\n  if(!code)return{err:'\\u53d1\\u5e03\\u9875\\u672a\\u627e\\u5230\\u7ebf\\u8def\\u6570\\u7ec4\\uff08\\u7ed3\\u6784\\u53ef\\u80fd\\u5df2\\u53d8\\uff09'};\n  var encodedLinks=null;\n  try{\n    var window=this,document={\n      createElement:function(){return{style:{},setAttribute:function(){},appendChild:function(){},innerHTML:'',textContent:''};},\n      body:{appendChild:function(){}},getElementById:function(){return null;}\n    };\n    eval(code);\n  }catch(e){/* DOM 部分可能抛错，encodedLinks 通常已赋值 */}\n  if(!encodedLinks||!encodedLinks.length)return{err:'\\u7ebf\\u8def\\u6570\\u7ec4\\u4e3a\\u7a7a\\u6216\\u811a\\u672c\\u65e0\\u6cd5\\u6267\\u884c'};\n  var out=[],seen={};\n  for(var i=0;i<encodedLinks.length;i++){\n    var parts=String(encodedLinks[i]).split('|'),u='';\n    try{u=OM_b64d(parts[0]).replace(/\\/+$/,'');}catch(e2){}\n    if(u.indexOf('http')!==0||seen[u])continue;\n    seen[u]=1;\n    out.push({u:u,n:parts[1]||u.replace(/^https?:\\/\\//,'')});\n  }\n  if(!out.length)return{err:'\\u89e3\\u7801\\u540e\\u65e0\\u6709\\u6548\\u7ebf\\u8def'};\n  return{lines:out};\n}\n\nfunction OM_load(sv){\n  var raw=OM_g(sv.get('om_lines'));\n  if(raw){try{var a=JSON.parse(raw);if(a&&a.length)return a;}catch(e){}}\n  var r=[];for(var i=0;i<OM_DEF.length;i++)r.push({u:OM_DEF[i],n:OM_DEF[i].replace(/^https?:\\/\\//,'')});\n  return r;\n}\nfunction OM_save(sv,lines){\n  var n=Math.min(lines.length,8);\n  sv.put('om_lines',JSON.stringify(lines.slice(0,n)));\n  sv.put('om_line',lines[0].u);\n  for(var i=0;i<8;i++)sv.put('om_sp_'+i,'');\n  return n;\n}\nfunction OM_status(sv){\n  var arr=OM_load(sv),cur=OM_g(sv.get('om_line')).replace(/\\/+$/,''),idx=-1;\n  for(var i=0;i<arr.length;i++)if(arr[i].u===cur)idx=i;\n  return '\\u3010v7\\u3011\\u5f53\\u524d\\uff1a'+(cur||'\\u9ed8\\u8ba4')+(idx>=0?('\\uff08\\u7b2c'+(idx+1)+'\\u6761\\uff09'):'')\n    +' \\uff5c \\u53d1\\u5e03\\u9875\\uff1a'+OM_pub(sv)+' \\uff5c \\u5171 '+arr.length+' \\u6761';\n}\nfunction OM_label(sv,i){\n  var arr=OM_load(sv);\n  if(i>=arr.length)return '\\uff08\\u7a7a\\u4f4d '+(i+1)+'\\uff09';\n  var cur=OM_g(sv.get('om_line')).replace(/\\/+$/,''),sp=OM_g(sv.get('om_sp_'+i));\n  return (cur===arr[i].u?'\\u2714 ':'')+'\\u7ebf\\u8def'+(i+1)+' '+arr[i].n+(sp?('  '+sp):'');\n}\nfunction OM_actGet(jv,sv){\n  OM_toast(jv,'\\u23f3 \\u6b63\\u5728\\u8bfb\\u53d6\\u53d1\\u5e03\\u9875\\uff0c\\u8bf7\\u7a0d\\u5019\\u2026');\n  var res=OM_fetchLines(jv,OM_pub(sv));\n  if(res.err){OM_toast(jv,'\\u274c '+res.err+'\\uff1b\\u4e5f\\u53ef\\u5728\\u4e0b\\u65b9\\u586b\\u5199\\u81ea\\u5b9a\\u4e49\\u7ebf\\u8def');return;}\n  var n=OM_save(sv,res.lines);\n  OM_toast(jv,'\\u2705 \\u5df2\\u4ece\\u53d1\\u5e03\\u9875\\u83b7\\u53d6 '+n+' \\u6761\\u7ebf\\u8def\\uff0c\\u9ed8\\u8ba4\\u7b2c 1 \\u6761\\uff1b\\u8bf7\\u70b9\\u300c\\u6d4b\\u8bd5\\u5ef6\\u65f6\\u300d\\u540e\\u81ea\\u884c\\u70b9\\u9009');\n  try{jv.reLoginView();}catch(e){}\n}\nfunction OM_actSpeed(jv,sv){\n  var arr=OM_load(sv);\n  OM_toast(jv,'\\u23f3 \\u6b63\\u5728\\u6d4b\\u901f '+arr.length+' \\u6761\\u7ebf\\u8def\\uff0c\\u8bf7\\u7a0d\\u5019\\u2026');\n  var best=-1,bestMs=1e12;\n  for(var i=0;i<arr.length;i++){\n    var r=OM_GET(arr[i].u+'/');\n    sv.put('om_sp_'+i,r.ok?(r.ms+'ms'):('\\u4e0d\\u53ef\\u7528 '+r.ms+'ms'));\n    if(r.ok&&r.ms<bestMs){bestMs=r.ms;best=i;}\n  }\n  if(best>=0){\n    sv.put('om_sp_'+best,'\\u26a1'+bestMs+'ms');\n    OM_toast(jv,'\\u2705 \\u6d4b\\u901f\\u5b8c\\u6210\\uff0c\\u6700\\u5feb '+arr[best].n+' '+bestMs+'ms\\uff1b\\u70b9\\u5bf9\\u5e94\\u300c\\u7ebf\\u8def N\\u300d\\u6309\\u94ae\\u5373\\u53ef\\u5207\\u6362\\uff08\\u4e0d\\u4f1a\\u81ea\\u52a8\\u5207\\uff09');\n  }else{\n    OM_toast(jv,'\\u26a0 \\u5168\\u90e8\\u7ebf\\u8def\\u63a2\\u6d3b\\u672a\\u901a\\u8fc7\\uff0c\\u8bf7\\u68c0\\u67e5\\u7f51\\u7edc\\u6216\\u91cd\\u65b0\\u83b7\\u53d6\\u53d1\\u5e03\\u9875\\u7ebf\\u8def');\n  }\n  try{jv.reLoginView();}catch(e){}\n}\nfunction OM_actSet(jv,sv,i){\n  var arr=OM_load(sv);\n  if(i>=arr.length){OM_toast(jv,'\\u26a0 \\u8be5\\u7ebf\\u8def\\u4f4d\\u4e3a\\u7a7a\\uff0c\\u8bf7\\u5148\\u83b7\\u53d6\\u7ebf\\u8def');return;}\n  sv.put('om_line',arr[i].u);\n  var r=OM_GET(arr[i].u+'/');\n  OM_toast(jv,(r.ok?'\\u2705 \\u5df2\\u5207\\u6362 ':'\\u26a0 \\u5df2\\u5207\\u6362\\u4f46\\u63a2\\u6d3b\\u672a\\u901a\\u8fc7 ')+arr[i].n+'\\uff08'+r.ms+'ms\\uff09');\n  try{jv.reLoginView();}catch(e){}\n}\nfunction OM_custom(jv,sv){\n  var v=OM_g(sv.get('om_custom')).replace(/\\/+$/,'');\n  if(v.indexOf('https://')!==0){OM_toast(jv,'\\u26a0 \\u8bf7\\u586b https:// \\u5f00\\u5934\\u7684\\u5b8c\\u6574\\u57df\\u540d');return;}\n  sv.put('om_line',v);\n  OM_toast(jv,'\\u2705 \\u5df2\\u5207\\u6362\\u81ea\\u5b9a\\u4e49\\u7ebf\\u8def\\uff1a'+v);\n  try{jv.reLoginView();}catch(e){}\n}\nfunction OM_reset(jv,sv){\n  sv.put('om_lines','');sv.put('om_line',OM_DEF[0]);\n  for(var i=0;i<8;i++)sv.put('om_sp_'+i,'');\n  OM_toast(jv,'\\u21a9 \\u5df2\\u6062\\u590d\\u9ed8\\u8ba4 4 \\u6761\\u7ebf\\u8def\\uff1b\\u82e5\\u9700\\u6700\\u65b0\\u7ebf\\u8def\\u8bf7\\u70b9\\u300c\\u4e00\\u952e\\u4ece\\u53d1\\u5e03\\u9875\\u83b7\\u53d6\\u7f51\\u5740\\u8def\\u7ebf\\u300d');\n  try{jv.reLoginView();}catch(e){}\n}\nfunction OM_actCheck(jv,sv){\n  var arr=OM_load(sv),cur=OM_g(sv.get('om_line')).replace(/\\/+$/,'');\n  if(cur.indexOf('https://')!==0)cur=arr.length?arr[0].u:'';\n  if(!cur){OM_toast(jv,'\\u274c \\u7ebf\\u8def\\u6c60\\u4e3a\\u7a7a\\uff0c\\u8bf7\\u5148\\u70b9\\u300c\\u4e00\\u952e\\u4ece\\u53d1\\u5e03\\u9875\\u83b7\\u53d6\\u7f51\\u5740\\u8def\\u7ebf\\u300d');return;}\n  OM_toast(jv,'\\u23f3 \\u6b63\\u5728\\u81ea\\u68c0 '+cur.replace(/^https?:\\/\\//,'')+' \\u2026');\n  var r=OM_GET(cur+'/');\n  var shield=r.h.indexOf('\\u7cfb\\u7edf\\u5b89\\u5168\\u9a8c\\u8bc1')>=0||r.h.indexOf('verify_check')>=0;\n  var n=0;try{var mm=r.h.match(/\\/anime\\/[a-f0-9]{24}\\.html/g);n=mm?mm.length:0;}catch(e){}\n  var state=shield?'\\u26a0 \\u5b89\\u5168\\u9a8c\\u8bc1\\u9875\\uff08\\u89c4\\u5219\\u4f1a\\u81ea\\u52a8\\u8fc7\\u76fe\\uff09':(n>0?'\\u2705 \\u6b63\\u5e38\\u9875':'\\u26a0 \\u65e0\\u5f71\\u7247\\u94fe\\u63a5');\n  var msg='v7 \\u81ea\\u68c0\\uff5c'+cur.replace(/^https?:\\/\\//,'')+'\\uff5c'+r.h.length+' \\u5b57\\u8282\\uff5c'+state+'\\uff5c\\u5f71\\u7247 '+n+' \\u4e2a\\uff5c'+r.ms+'ms';\n  if(r.err)msg+='\\uff5c\\u9519\\u8bef\\uff1a'+String(r.err).substring(0,50);\n  OM_toast(jv,msg);\n  try{sv.put('om_lastcheck',msg);}catch(e2){}\n  try{jv.reLoginView();}catch(e3){}\n}\n</js>", "respondTime": 180000, "ruleBookInfo": {"author": "$.a", "coverUrl": "$.c", "init": "@js:(function(){\nvar UA='Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n// 默认兜底线路（与发布页当前 4 条一致）；实际线路来自登录面板「一键从发布页获取」写入的 om_lines\nvar DEF_LINES=['https://www.omofuns.com','https://cn.233dm.com','https://cn.211dm.com','https://cn.agekkkk.com'];\nfunction lines(){\n  var raw=SV('om_lines'),a=null;\n  if(raw){try{a=JSON.parse(String(raw));}catch(e){a=null;}}\n  if(a&&a.length){\n    var r=[],seen={};\n    for(var i=0;i<a.length;i++){\n      var u=(typeof a[i]==='string')?a[i]:(a[i]&&a[i].u?String(a[i].u):'');\n      u=String(u).replace(/\\/+$/,'');\n      if(u.indexOf('https://')===0&&u.indexOf('fb.omoo')<0&&!seen[u]){seen[u]=1;r.push(u);}\n    }\n    if(r.length)return r;\n  }\n  // 兼容旧书源遗留的 om_sn / om_s1..8\n  var n=parseInt(SV('om_sn'),10)||0,r2=[];\n  for(var j=1;j<=n&&j<=8;j++){var v=SV('om_s'+j).replace(/\\/+$/,'');if(v.indexOf('https://')===0)r2.push(v);}\n  if(r2.length)return r2;\n  return DEF_LINES;\n}\nvar K=[78,63,169,194,18,125,136,239,85,170,11,205,222,173,190,239];\nfunction S(v){try{var s=String(v==null?'':v);return (s==='null'||s==='undefined'||s==='[object Object]'||s==='JsNull')?'':s;}catch(e){return '';}}\nfunction SV(k){try{return S(source.get(k));}catch(e){return '';}}\nfunction sub(k,v){try{source.put(k,String(v));}catch(e){}}\nfunction curLine(){var c=SV('om_line').replace(/\\/+$/,''),a=lines();if(c.indexOf('https://')===0&&c.indexOf('fb.omoo')<0){for(var i=0;i<a.length;i++)if(a[i]===c)return c;if(c===SV('om_custom').replace(/\\/+$/,''))return c;}return a[0];}\nfunction hostOf(u){var s=String(u==null?'':u),m=/^https?:\\/\\/([^\\/]+)/.exec(s);if(!m)return '';var hn=m[1],a=lines();for(var i=0;i<a.length;i++){if(a[i].replace(/^https?:\\/\\//,'')===hn)return a[i];}if(s.indexOf('https://')===0)return 'https://'+hn;return '';}\nfunction ord(){var c=curLine(),a=lines(),r=[c];for(var i=0;i<a.length;i++){if(a[i]!==c)r.push(a[i]);}return r;}\nfunction gt(h){h=String(h==null?'':h);if(!h)return true;return h.indexOf('\\u7cfb\\u7edf\\u5b89\\u5168\\u9a8c\\u8bc1')>=0||h.indexOf('verify_check')>=0;}\nfunction okPage(h){h=String(h==null?'':h);if(!h||h.length<8000)return false;if(gt(h))return false;return true;}\nfunction b64(s){var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',o='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i)&255,b=i+1<s.length?s.charCodeAt(i+1)&255:null,c=i+2<s.length?s.charCodeAt(i+2)&255:null,n=(a<<16)|((b||0)<<8)|(c||0);o+=t.charAt((n>>18)&63)+t.charAt((n>>12)&63)+(b===null?'=':t.charAt((n>>6)&63))+(c===null?'=':t.charAt(n&63));}return o;}\nfunction tk(){var ts=String(Date.now()),p='';for(var i=0;i<ts.length;i++)p+=String.fromCharCode(ts.charCodeAt(i)^K[i%16]);return b64(p);}\nfunction b64b(s){\n  // 用 ByteArrayOutputStream 生成 byte[]，避开反射建数组的高危 API\n  // （Legado 登录面板/部分真机环境里该 Class 会被解析成 JavaPackage 而非类）\n  var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n  var bos=new Packages.java.io.ByteArrayOutputStream(),buf=0,bits=0,i,ch,v;\n  for(i=0;i<s.length;i++){\n    ch=s.charAt(i);\n    if(ch==='='||ch==='\\n'||ch==='\\r'||ch===' ')continue;\n    v=t.indexOf(ch);\n    if(v<0)continue;\n    buf=((buf<<6)|v)&0x3FFFFF;bits+=6;\n    if(bits>=8){bits-=8;bos.write((buf>>bits)&255);}\n  }\n  return bos.toByteArray();\n}\nfunction hk(b){var m=/^https?:\\/\\/([^\\/]+)/.exec(String(b||''));return m?('om_ck_'+m[1]):'om_ck_x';}\nfunction rdCk(b){return SV(hk(b));}\nfunction wrCk(b,sc){if(!sc)return;var parts=String(sc).split(';');var kv=parts[0];if(kv&&kv.indexOf('=')>0){var old=rdCk(b),name=kv.split('=')[0];var keep=[];if(old){var o=old.split(';');for(var i=0;i<o.length;i++){var p=String(o[i]).replace(/^\\s+/,'');if(p&&p.split('=')[0]!==name)keep.push(p);}}keep.push(kv);sub(hk(b),keep.join('; '));}}\nfunction TXT(c){\n  // 文本流读法：InputStream -> (gzip 则包 GZIPInputStream) -> BufferedReader 逐行。\n  // 全程不创建 Java byte[]，避开反射建数组的高危 API。\n  var is=c.getInputStream();\n  try{\n    var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);\n  }catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\n// 最后一次重试用：跳过 SSL 证书/主机名校验（应对被劫持的线路或自签播放器证书）\nfunction looseSSL(c){\n  // 最后一次重试兜底：只跳过主机名校验（足以应对 CN=*.10086.cn 这类劫持证书）。\n  // 不再自建 TrustManager[] —— 那需要反射创建 Java 数组，真机会崩。\n  try{\n    var hv=new JavaAdapter(Packages.javax.net.ssl.HostnameVerifier,{verify:function(a,b){return true;}});\n    c.setHostnameVerifier(hv);\n  }catch(e){}\n}\nfunction REQ(url,method,body,ck,loose){\n  var out={code:0,h:'',sc:''};\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod(method||'GET');\n    c.setConnectTimeout(8000);c.setReadTimeout(15000);\n    c.setInstanceFollowRedirects(true);\n    if(loose)looseSSL(c);\n    c.setRequestProperty('User-Agent',UA);\n    c.setRequestProperty('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    if(ck)c.setRequestProperty('Cookie',String(ck));\n    if(body!=null){c.setDoOutput(true);c.setRequestProperty('Content-Type','application/x-www-form-urlencoded');var os=c.getOutputStream();os.write(new Packages.java.lang.String(String(body)).getBytes('UTF-8'));os.flush();os.close();}\n    out.code=c.getResponseCode();\n    try{out.h=TXT(c);}catch(e1){out.h='';}\n    try{var v=c.getHeaderFields().get('Set-Cookie');if(v){var t=[];for(var i=0;i<v.size();i++)t.push(String(v.get(i)));out.sc=t.join(';');}}catch(e2){}\n  }catch(e){out.h='';out.err=String(e);}\n  return out;\n}\nfunction pass(b){\n  try{\n    var r=REQ(b+'/index.php/ajax/verify_check?type=search','POST','i='+encodeURIComponent(tk()),rdCk(b));\n    wrCk(b,r.sc);\n    var s=String(r.h||'');\n    return s.indexOf('\"code\":1')>=0||s.indexOf('\"code\": 1')>=0;\n  }catch(e){return false;}\n}\nfunction G1(b,p){var r=REQ(b+p,'GET',null,rdCk(b));wrCk(b,r.sc);return String(r.h||'');}\nfunction fetch(b,p){\n  var h=G1(b,p);\n  if(okPage(h))return h;\n  for(var i=0;i<2;i++){\n    if(!pass(b))break;\n    try{Packages.java.lang.Thread.sleep(400);}catch(e){}\n    h=G1(b,p);\n    if(okPage(h))break;\n  }\n  return h;\n}\nfunction pick(p){\n  var a=ord(),last='';\n  for(var i=0;i<a.length;i++){\n    var h=fetch(a[i],p);\n    if(okPage(h)){if(a[i]!==curLine())sub('om_line',a[i]);return{h:h,b:a[i]};}\n    last=h;\n  }\n  return{h:last,b:a[0]};\n}\nfunction pth(u){var s=String(u==null?'':u),m=/^https?:\\/\\/[^\\/]+(\\/[^\\s]*)?$/.exec(s);return m?(m[1]||'/'):'/';}\nfunction abs(b,u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('http')===0)return u;if(u.indexOf('//')===0)return 'https:'+u;if(u.charAt(0)==='/')return b+u;return b+'/'+u;}\nfunction pic(u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('//')===0)return 'https:'+u;if(u.indexOf('http')===0){if(u.replace(/\\/+$/,'')==='https://as.cfhls.top')return '';return u;}if(u.charAt(0)==='/')return 'https://as.cfhls.top'+u;return u;}\nfunction Jp(h){try{return Packages.org.jsoup.Jsoup.parse(String(h||''));}catch(e){return null;}}\nfunction txt(e){try{return e?String(e.text()).trim():'';}catch(x){return '';}}\nfunction attr(e,n){try{return e?String(e.attr(n)||'').trim():'';}catch(x){return '';}}\nfunction first(d,sel){try{var e=d.select(sel);return e&&e.size()>0?e.get(0):null;}catch(x){return null;}}\nfunction parseList(h,b){\n  var out=[],seen={};\n  if(!h||gt(h))return out;\n  var d=Jp(h);if(!d)return out;\n  var as=null;\n  try{as=d.select('a[href*=/anime/]');}catch(e1){return out;}\n  if(!as)return out;\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);var u=attr(a,'href');\n    if(u.indexOf('/anime/')<0||u.indexOf('.html')<0)continue;\n    if(u.indexOf('/play/')>=0)continue;\n    var n=attr(a,'title');if(!n)n=txt(a);\n    if(!n||n.length>60)continue;\n    // 无封面不再跳过条目：隐藏轮播 banner 只有图床根路径背景，coverUrl 留空即可，\n    // 详情页规则会自动补封面。若同 URL 已有条目且旧的无封面、新的有封面，则用新的替换。\n    var p1=attr(a,'data-original');\n    if(!p1){var im=first(a,'img');if(im){p1=attr(im,'data-original')||attr(im,'src');}}\n    p1=pic(p1);\n    var old=seen[u];\n    if(old){\n      if(p1){var prev=null;try{prev=JSON.parse(out[old-1]);}catch(e8){}\n        if(prev&&!prev.coverUrl){\n          var kind2=prev.kind||'',last2=prev.lastChapter||'';\n          var li2=null;try{li2=a.parent();}catch(e9){}\n          var g2=0;while(li2&&g2++<4){var tg2='';try{tg2=String(li2.tagName());}catch(e10){}if(String(tg2).toLowerCase()==='li')break;try{li2=li2.parent();}catch(e11){li2=null;break;}}\n          if(li2){var bs2=null;try{bs2=li2.select('span b');}catch(e12){}if(bs2&&bs2.size()>=2){kind2=txt(bs2.get(0));last2=txt(bs2.get(bs2.size()-1));}}\n          out[old-1]=JSON.stringify({name:prev.name,bookUrl:prev.bookUrl,coverUrl:p1,kind:kind2,lastChapter:last2});\n        }\n      }\n      continue;\n    }\n    var kind='',last='';var li=null;try{li=a.parent();}catch(e4){}\n    var g=0;\n    while(li&&g++<4){var tg='';try{tg=String(li.tagName());}catch(e5){}if(String(tg).toLowerCase()==='li')break;try{li=li.parent();}catch(e6){li=null;break;}}\n    if(li){var bs=null;try{bs=li.select('span b');}catch(e7){}\n      if(bs&&bs.size()>=2){kind=txt(bs.get(0));last=txt(bs.get(bs.size()-1));}}\n    seen[u]=out.length+1;\n    out.push(JSON.stringify({name:n,bookUrl:abs(b,u),coverUrl:p1,kind:kind,lastChapter:last}));\n  }\n  return out;\n}\nfunction arr(list,out){try{var l=new Packages.java.util.ArrayList();for(var i=0;i<out.length;i++)l.add(out[i]);return l;}catch(e){return out;}}\n\nvar b=hostOf(baseUrl)||curLine(),h=String(result||''),d=gt(h)?null:Jp(h);\nvar nm0='';if(d){nm0=txt(first(d,'h1.title'));}\nif(!nm0){var r0=pick(pth(baseUrl));h=r0.h;b=r0.b;d=Jp(h);}\nvar name='',p1='',meta='',status='',intro='';\nif(d){\n name=txt(first(d,'h1.title'));\n var im=first(d,'a.pic img');\n if(im){p1=attr(im,'data-original')||attr(im,'src');}\n try{var ps=d.select('p.data');\n   for(var i=0;i<ps.size();i++){var t=String(ps.get(i).text()).trim();\n     if(t.indexOf('\\u7c7b\\u578b')===0)meta=t;\n     else if(t.indexOf('\\u72b6\\u6001')===0)status=t.replace(/^\\u72b6\\u6001[\\uff1a:]\\s*/,'');}\n }catch(e1){}\n intro=txt(first(d,'.detail-content'))||txt(first(d,'.detail-sketch'))||txt(first(d,'.desc'));\n}\nvar kind='';\nif(meta){kind=meta.replace(/^\\u7c7b\\u578b[\\uff1a:]\\s*/,'').split('/')[0].replace(/[,\\uff0c]\\s*/g,' \\u00b7 ').trim();}\nvar o={a:'OmoFun',c:pic(p1),k:kind,w:status,t:status||'\\u2014',i:intro,n:name,tocUrl:String(baseUrl||'')};\nreturn JSON.stringify(o);\n})()", "intro": "$.i", "kind": "$.k", "lastChapter": "$.t", "name": "$.n", "tocUrl": "$.tocUrl", "wordCount": "$.w"}, "ruleContent": {"content": "@js:(function(){\nvar UA='Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n// 默认兜底线路（与发布页当前 4 条一致）；实际线路来自登录面板「一键从发布页获取」写入的 om_lines\nvar DEF_LINES=['https://www.omofuns.com','https://cn.233dm.com','https://cn.211dm.com','https://cn.agekkkk.com'];\nfunction lines(){\n  var raw=SV('om_lines'),a=null;\n  if(raw){try{a=JSON.parse(String(raw));}catch(e){a=null;}}\n  if(a&&a.length){\n    var r=[],seen={};\n    for(var i=0;i<a.length;i++){\n      var u=(typeof a[i]==='string')?a[i]:(a[i]&&a[i].u?String(a[i].u):'');\n      u=String(u).replace(/\\/+$/,'');\n      if(u.indexOf('https://')===0&&u.indexOf('fb.omoo')<0&&!seen[u]){seen[u]=1;r.push(u);}\n    }\n    if(r.length)return r;\n  }\n  // 兼容旧书源遗留的 om_sn / om_s1..8\n  var n=parseInt(SV('om_sn'),10)||0,r2=[];\n  for(var j=1;j<=n&&j<=8;j++){var v=SV('om_s'+j).replace(/\\/+$/,'');if(v.indexOf('https://')===0)r2.push(v);}\n  if(r2.length)return r2;\n  return DEF_LINES;\n}\nvar K=[78,63,169,194,18,125,136,239,85,170,11,205,222,173,190,239];\nfunction S(v){try{var s=String(v==null?'':v);return (s==='null'||s==='undefined'||s==='[object Object]'||s==='JsNull')?'':s;}catch(e){return '';}}\nfunction SV(k){try{return S(source.get(k));}catch(e){return '';}}\nfunction sub(k,v){try{source.put(k,String(v));}catch(e){}}\nfunction curLine(){var c=SV('om_line').replace(/\\/+$/,''),a=lines();if(c.indexOf('https://')===0&&c.indexOf('fb.omoo')<0){for(var i=0;i<a.length;i++)if(a[i]===c)return c;if(c===SV('om_custom').replace(/\\/+$/,''))return c;}return a[0];}\nfunction hostOf(u){var s=String(u==null?'':u),m=/^https?:\\/\\/([^\\/]+)/.exec(s);if(!m)return '';var hn=m[1],a=lines();for(var i=0;i<a.length;i++){if(a[i].replace(/^https?:\\/\\//,'')===hn)return a[i];}if(s.indexOf('https://')===0)return 'https://'+hn;return '';}\nfunction ord(){var c=curLine(),a=lines(),r=[c];for(var i=0;i<a.length;i++){if(a[i]!==c)r.push(a[i]);}return r;}\nfunction gt(h){h=String(h==null?'':h);if(!h)return true;return h.indexOf('\\u7cfb\\u7edf\\u5b89\\u5168\\u9a8c\\u8bc1')>=0||h.indexOf('verify_check')>=0;}\nfunction okPage(h){h=String(h==null?'':h);if(!h||h.length<8000)return false;if(gt(h))return false;return true;}\nfunction b64(s){var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',o='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i)&255,b=i+1<s.length?s.charCodeAt(i+1)&255:null,c=i+2<s.length?s.charCodeAt(i+2)&255:null,n=(a<<16)|((b||0)<<8)|(c||0);o+=t.charAt((n>>18)&63)+t.charAt((n>>12)&63)+(b===null?'=':t.charAt((n>>6)&63))+(c===null?'=':t.charAt(n&63));}return o;}\nfunction tk(){var ts=String(Date.now()),p='';for(var i=0;i<ts.length;i++)p+=String.fromCharCode(ts.charCodeAt(i)^K[i%16]);return b64(p);}\nfunction b64b(s){\n  // 用 ByteArrayOutputStream 生成 byte[]，避开反射建数组的高危 API\n  // （Legado 登录面板/部分真机环境里该 Class 会被解析成 JavaPackage 而非类）\n  var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n  var bos=new Packages.java.io.ByteArrayOutputStream(),buf=0,bits=0,i,ch,v;\n  for(i=0;i<s.length;i++){\n    ch=s.charAt(i);\n    if(ch==='='||ch==='\\n'||ch==='\\r'||ch===' ')continue;\n    v=t.indexOf(ch);\n    if(v<0)continue;\n    buf=((buf<<6)|v)&0x3FFFFF;bits+=6;\n    if(bits>=8){bits-=8;bos.write((buf>>bits)&255);}\n  }\n  return bos.toByteArray();\n}\nfunction hk(b){var m=/^https?:\\/\\/([^\\/]+)/.exec(String(b||''));return m?('om_ck_'+m[1]):'om_ck_x';}\nfunction rdCk(b){return SV(hk(b));}\nfunction wrCk(b,sc){if(!sc)return;var parts=String(sc).split(';');var kv=parts[0];if(kv&&kv.indexOf('=')>0){var old=rdCk(b),name=kv.split('=')[0];var keep=[];if(old){var o=old.split(';');for(var i=0;i<o.length;i++){var p=String(o[i]).replace(/^\\s+/,'');if(p&&p.split('=')[0]!==name)keep.push(p);}}keep.push(kv);sub(hk(b),keep.join('; '));}}\nfunction TXT(c){\n  // 文本流读法：InputStream -> (gzip 则包 GZIPInputStream) -> BufferedReader 逐行。\n  // 全程不创建 Java byte[]，避开反射建数组的高危 API。\n  var is=c.getInputStream();\n  try{\n    var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);\n  }catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\n// 最后一次重试用：跳过 SSL 证书/主机名校验（应对被劫持的线路或自签播放器证书）\nfunction looseSSL(c){\n  // 最后一次重试兜底：只跳过主机名校验（足以应对 CN=*.10086.cn 这类劫持证书）。\n  // 不再自建 TrustManager[] —— 那需要反射创建 Java 数组，真机会崩。\n  try{\n    var hv=new JavaAdapter(Packages.javax.net.ssl.HostnameVerifier,{verify:function(a,b){return true;}});\n    c.setHostnameVerifier(hv);\n  }catch(e){}\n}\nfunction REQ(url,method,body,ck,loose){\n  var out={code:0,h:'',sc:''};\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod(method||'GET');\n    c.setConnectTimeout(8000);c.setReadTimeout(15000);\n    c.setInstanceFollowRedirects(true);\n    if(loose)looseSSL(c);\n    c.setRequestProperty('User-Agent',UA);\n    c.setRequestProperty('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    if(ck)c.setRequestProperty('Cookie',String(ck));\n    if(body!=null){c.setDoOutput(true);c.setRequestProperty('Content-Type','application/x-www-form-urlencoded');var os=c.getOutputStream();os.write(new Packages.java.lang.String(String(body)).getBytes('UTF-8'));os.flush();os.close();}\n    out.code=c.getResponseCode();\n    try{out.h=TXT(c);}catch(e1){out.h='';}\n    try{var v=c.getHeaderFields().get('Set-Cookie');if(v){var t=[];for(var i=0;i<v.size();i++)t.push(String(v.get(i)));out.sc=t.join(';');}}catch(e2){}\n  }catch(e){out.h='';out.err=String(e);}\n  return out;\n}\nfunction pass(b){\n  try{\n    var r=REQ(b+'/index.php/ajax/verify_check?type=search','POST','i='+encodeURIComponent(tk()),rdCk(b));\n    wrCk(b,r.sc);\n    var s=String(r.h||'');\n    return s.indexOf('\"code\":1')>=0||s.indexOf('\"code\": 1')>=0;\n  }catch(e){return false;}\n}\nfunction G1(b,p){var r=REQ(b+p,'GET',null,rdCk(b));wrCk(b,r.sc);return String(r.h||'');}\nfunction fetch(b,p){\n  var h=G1(b,p);\n  if(okPage(h))return h;\n  for(var i=0;i<2;i++){\n    if(!pass(b))break;\n    try{Packages.java.lang.Thread.sleep(400);}catch(e){}\n    h=G1(b,p);\n    if(okPage(h))break;\n  }\n  return h;\n}\nfunction pick(p){\n  var a=ord(),last='';\n  for(var i=0;i<a.length;i++){\n    var h=fetch(a[i],p);\n    if(okPage(h)){if(a[i]!==curLine())sub('om_line',a[i]);return{h:h,b:a[i]};}\n    last=h;\n  }\n  return{h:last,b:a[0]};\n}\nfunction pth(u){var s=String(u==null?'':u),m=/^https?:\\/\\/[^\\/]+(\\/[^\\s]*)?$/.exec(s);return m?(m[1]||'/'):'/';}\nfunction abs(b,u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('http')===0)return u;if(u.indexOf('//')===0)return 'https:'+u;if(u.charAt(0)==='/')return b+u;return b+'/'+u;}\nfunction pic(u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('//')===0)return 'https:'+u;if(u.indexOf('http')===0){if(u.replace(/\\/+$/,'')==='https://as.cfhls.top')return '';return u;}if(u.charAt(0)==='/')return 'https://as.cfhls.top'+u;return u;}\nfunction Jp(h){try{return Packages.org.jsoup.Jsoup.parse(String(h||''));}catch(e){return null;}}\nfunction txt(e){try{return e?String(e.text()).trim():'';}catch(x){return '';}}\nfunction attr(e,n){try{return e?String(e.attr(n)||'').trim():'';}catch(x){return '';}}\nfunction first(d,sel){try{var e=d.select(sel);return e&&e.size()>0?e.get(0):null;}catch(x){return null;}}\nfunction parseList(h,b){\n  var out=[],seen={};\n  if(!h||gt(h))return out;\n  var d=Jp(h);if(!d)return out;\n  var as=null;\n  try{as=d.select('a[href*=/anime/]');}catch(e1){return out;}\n  if(!as)return out;\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);var u=attr(a,'href');\n    if(u.indexOf('/anime/')<0||u.indexOf('.html')<0)continue;\n    if(u.indexOf('/play/')>=0)continue;\n    var n=attr(a,'title');if(!n)n=txt(a);\n    if(!n||n.length>60)continue;\n    // 无封面不再跳过条目：隐藏轮播 banner 只有图床根路径背景，coverUrl 留空即可，\n    // 详情页规则会自动补封面。若同 URL 已有条目且旧的无封面、新的有封面，则用新的替换。\n    var p1=attr(a,'data-original');\n    if(!p1){var im=first(a,'img');if(im){p1=attr(im,'data-original')||attr(im,'src');}}\n    p1=pic(p1);\n    var old=seen[u];\n    if(old){\n      if(p1){var prev=null;try{prev=JSON.parse(out[old-1]);}catch(e8){}\n        if(prev&&!prev.coverUrl){\n          var kind2=prev.kind||'',last2=prev.lastChapter||'';\n          var li2=null;try{li2=a.parent();}catch(e9){}\n          var g2=0;while(li2&&g2++<4){var tg2='';try{tg2=String(li2.tagName());}catch(e10){}if(String(tg2).toLowerCase()==='li')break;try{li2=li2.parent();}catch(e11){li2=null;break;}}\n          if(li2){var bs2=null;try{bs2=li2.select('span b');}catch(e12){}if(bs2&&bs2.size()>=2){kind2=txt(bs2.get(0));last2=txt(bs2.get(bs2.size()-1));}}\n          out[old-1]=JSON.stringify({name:prev.name,bookUrl:prev.bookUrl,coverUrl:p1,kind:kind2,lastChapter:last2});\n        }\n      }\n      continue;\n    }\n    var kind='',last='';var li=null;try{li=a.parent();}catch(e4){}\n    var g=0;\n    while(li&&g++<4){var tg='';try{tg=String(li.tagName());}catch(e5){}if(String(tg).toLowerCase()==='li')break;try{li=li.parent();}catch(e6){li=null;break;}}\n    if(li){var bs=null;try{bs=li.select('span b');}catch(e7){}\n      if(bs&&bs.size()>=2){kind=txt(bs.get(0));last=txt(bs.get(bs.size()-1));}}\n    seen[u]=out.length+1;\n    out.push(JSON.stringify({name:n,bookUrl:abs(b,u),coverUrl:p1,kind:kind,lastChapter:last}));\n  }\n  return out;\n}\nfunction arr(list,out){try{var l=new Packages.java.util.ArrayList();for(var i=0;i<out.length;i++)l.add(out[i]);return l;}catch(e){return out;}}\n\nvar b=hostOf(baseUrl)||curLine(),page=String(result||'');\n// 播放页 result 若被盾拦截或为空，用原生 HTTP 自己抓一次（自动过盾 + 换线）\nif(page.indexOf('player_aaaa')<0){var rr=pick(pth(baseUrl));page=rr.h;b=rr.b;}\nvar i=page.indexOf('var player_aaaa=');\nif(i<0) return '\\u26a0 \\u672a\\u627e\\u5230\\u64ad\\u653e\\u6570\\u636e\\uff08\\u9875\\u9762\\u5b57\\u8282='+page.length+'\\uff0c\\u53ef\\u80fd\\u88ab\\u5b89\\u5168\\u9a8c\\u8bc1\\u62e6\\u622a\\uff09';\nvar st=page.indexOf('{',i),dep=0,end=-1,inStr=false,q='';\nif(st<0) return '\\u26a0 \\u64ad\\u653e\\u6570\\u636e\\u8d77\\u59cb\\u7b26\\u7f3a\\u5931';\nfor(var k=st;k<page.length;k++){\n  var c=page.charAt(k);\n  if(inStr){ if(c==='\\\\'){k++;continue;} if(c===q)inStr=false; continue; }\n  if(c==='\"'||c===\"'\"){ inStr=true; q=c; continue; }\n  if(c==='{')dep++; else if(c==='}'){ dep--; if(dep===0){ end=k+1; break; } }\n}\nif(end<0) return '\\u26a0 \\u64ad\\u653e\\u6570\\u636e\\u62ec\\u53f7\\u4e0d\\u914d\\u5e73';\nvar pd=null;\ntry{ pd=JSON.parse(page.slice(st,end)); }catch(e2){ return '\\u26a0 \\u64ad\\u653e\\u6570\\u636e\\u89e3\\u6790\\u5931\\u8d25'; }\nvar rawUrl=String(pd.url||'');\nif(String(pd.encrypt)==='1'){ try{ rawUrl=unescape(rawUrl); }catch(e3){ } }\nif(!rawUrl) return '\\u26a0 \\u8be5\\u96c6\\u6682\\u65e0\\u64ad\\u653e\\u5730\\u5740';\nvar dmid='';\ntry{ var dm=/\\\"dmid\\\"\\s*:\\s*\\\"?(\\d+)\\\"?/.exec(page); if(dm)dmid=dm[1]; }catch(e5){ }\nif(!dmid)dmid=String(pd.id||'');\nvar pic1=String((pd.vod_data&&pd.vod_data.vod_pic)||'');\nvar qs=[\n  'url='+encodeURIComponent(rawUrl),\n  'dmid='+encodeURIComponent(dmid),\n  'next='+encodeURIComponent(String(pd.link_next||'')),\n  'name='+encodeURIComponent(String((pd.vod_data&&pd.vod_data.vod_name)||'')),\n  'sid='+encodeURIComponent(String(pd.sid||'1')),\n  'nid='+encodeURIComponent(String(pd.nid||'1')),\n  'ph='+encodeURIComponent('https://as.cfhls.top/'),\n  'h='+encodeURIComponent(b),\n  'pic='+encodeURIComponent(pic1)\n];\n// 3 次机会：art 主域 → low 备用域 → 跳过 SSL 校验再试 art（应对证书/主机名问题）\nvar hosts=['https://art.v2player.top:8989/player/?','https://low.v2player.top:8989/player/?','https://art.v2player.top:8989/player/?'];\nvar ph1='',mm=null,lastErr='';\nfor(var retry=0;retry<3;retry++){\n  var tu=hosts[retry]+qs.join('&')+(retry?('&_r='+Date.now()+'_'+retry):'');\n  try{\n    var resp=REQ(tu,'GET',null,'',retry===2);\n    ph1=String(resp.h||'');lastErr=String(resp.err||'');\n  }catch(e6){ph1='';lastErr=String(e6);}\n  mm=/playData\\('([^']+)','([^']+)'\\)/.exec(ph1);\n  if(mm)break;\n  try{ Packages.java.lang.Thread.sleep(300); }catch(eS){}\n}\nif(!mm) return '\\u26a0 \\u64ad\\u653e\\u5668\\u65e0\\u54cd\\u5e94\\uff08\\u5df2\\u8bd5 3 \\u6b21\\uff0c\\u672b\\u6b21\\u5b57\\u8282='+ph1.length+'\\uff09\\u3002\\u82e5\\u6301\\u7eed\\u5931\\u8d25\\u8bf7\\u5728\\u8c03\\u8bd5\\u6b63\\u6587\\u91cc\\u770b\\u6b64\\u63d0\\u793a\\uff0c\\u6216\\u5207\\u6362\\u7ebf\\u8def';\ntry{\n  var cipher=mm[1], ivHex=mm[2];\n  var keyB=new Packages.java.lang.String('ABABEF777999CCCD').getBytes('UTF-8');\n  var key=new Packages.javax.crypto.spec.SecretKeySpec(keyB,'AES');\n  var hl=ivHex.length/2;\n  var ivbos=new Packages.java.io.ByteArrayOutputStream();\n  for(var hi=0;hi<hl;hi++)ivbos.write(parseInt(ivHex.substr(hi*2,2),16));\n  var ivb=ivbos.toByteArray();\n  var iv=new Packages.javax.crypto.spec.IvParameterSpec(ivb);\n  var cb=b64b(cipher);\n  var cc=Packages.javax.crypto.Cipher.getInstance('AES/CBC/PKCS5Padding');\n  cc.init(2,key,iv);\n  var d2=cc.doFinal(cb);\n  var u2=String(new Packages.java.lang.String(d2,'UTF-8')).trim();\n  if(u2.indexOf('org.h://')===0) u2='https://'+u2.slice(8);\n  if(u2.indexOf('http')!==0) return '\\u26a0 \\u89e3\\u6790\\u51fa\\u7684\\u5730\\u5740\\u5f02\\u5e38\\uff1a'+u2.slice(0,100);\n  return u2;\n}catch(e7){ return '\\u26a0 \\u64ad\\u653e\\u5730\\u5740\\u89e3\\u5bc6\\u5931\\u8d25\\uff1a'+e7; }\n\n})()", "subContent": "@js:(function(){\nvar UA='Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\nvar K=[78,63,169,194,18,125,136,239,85,170,11,205,222,173,190,239];\nvar API='https://danmu.v2player.top:8989/cxvbsfhapi.php/barrage/index';\nfunction S(v){try{var s=String(v==null?'':v);return (s==='null'||s==='undefined'||s==='[object Object]'||s==='JsNull')?'':s;}catch(e){return '';}}\nfunction b64(s){var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',o='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i)&255,b=i+1<s.length?s.charCodeAt(i+1)&255:null,c=i+2<s.length?s.charCodeAt(i+2)&255:null,n=(a<<16)|((b||0)<<8)|(c||0);o+=t.charAt((n>>18)&63)+t.charAt((n>>12)&63)+(b===null?'=':t.charAt((n>>6)&63))+(c===null?'=':t.charAt(n&63));}return o;}\nfunction tk(){var ts=String(Date.now()),p='';for(var i=0;i<ts.length;i++)p+=String.fromCharCode(ts.charCodeAt(i)^K[i%16]);return b64(p);}\nfunction TXT(c){\n  var is=c.getInputStream();\n  try{var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);}catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\nfunction looseSSL(c){\n  try{var hv=new JavaAdapter(Packages.javax.net.ssl.HostnameVerifier,{verify:function(a,b){return true;}});c.setHostnameVerifier(hv);}catch(e){}\n}\nfunction REQ(url,method,body,ct,loose,ck){\n  var out={code:0,h:'',sc:''};\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod(method||'GET');\n    c.setConnectTimeout(8000);c.setReadTimeout(15000);\n    c.setInstanceFollowRedirects(true);\n    if(loose)looseSSL(c);\n    c.setRequestProperty('User-Agent',UA);\n    c.setRequestProperty('Accept','application/json, text/plain, */*');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    c.setRequestProperty('Origin','https://art.v2player.top:8989');\n    c.setRequestProperty('Referer','https://art.v2player.top:8989/player/');\n    if(ck)c.setRequestProperty('Cookie',String(ck));\n    if(body!=null){\n      c.setDoOutput(true);\n      if(ct)c.setRequestProperty('Content-Type',ct);\n      var os=c.getOutputStream();\n      os.write(new Packages.java.lang.String(String(body)).getBytes('UTF-8'));\n      os.flush();os.close();\n    }\n    out.code=c.getResponseCode();\n    try{out.h=TXT(c);}catch(e1){out.h='';}\n    try{var v=c.getHeaderFields().get('Set-Cookie');if(v){var t=[];for(var i=0;i<v.size();i++)t.push(String(v.get(i)));out.sc=t.join(';');}}catch(e2){}\n  }catch(e){out.h='';}\n  return out;\n}\nfunction gt(h){h=S(h);if(!h)return true;return h.indexOf('系统安全验证')>=0||h.indexOf('verify_check')>=0;}\nfunction pass(b,ck){try{var r=REQ(b+'/index.php/ajax/verify_check?type=search','POST','i='+encodeURIComponent(tk()),'application/x-www-form-urlencoded',false,ck);return {ok:String(r.h||'').indexOf('\"code\":1')>=0||String(r.h||'').indexOf('\"code\": 1')>=0,ck:String(r.sc||ck||'')};}catch(e){return {ok:false,ck:ck};}}\nfunction getPlay(u){\n  var ck='',g=REQ(u,'GET',null,'',false,null),h=S(g.h);\n  if(g.sc)ck=g.sc;\n  if(h&&!gt(h)&&h.length>2000)return h;\n  var m=/^(https?:\\/\\/[^\\/]+)/.exec(u);\n  if(m){for(var i=0;i<2;i++){var p=pass(m[1],ck);ck=p.ck;if(!p.ok)break;g=REQ(u,'GET',null,'',false,ck);h=S(g.h);if(h&&!gt(h)&&h.length>2000)return h;}}\n  return h;\n}\nfunction esc(s){\n  s=S(s).replace(/[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]/g,'');\n  return s.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/\"/g,'&quot;').replace(/'/g,'&apos;');\n}\nfunction color10(c){var m=/^#?([0-9a-fA-F]{6})$/.exec(S(c).replace(/\\s/g,''));return m?parseInt(m[1],16):16777215;}\nfunction modeBili(m){var n=parseInt(m,10);if(n===1)return 5;if(n===2)return 4;return 1;}\nfunction DM_XML(list){\n  var out=['<?xml version=\"1.0\" encoding=\"UTF-8\"?>','<i>',\n           '<chatserver>chat.bilibili.com</chatserver>','<chatid>0</chatid>',\n           '<mission>0</mission>','<maxlimit>8000</maxlimit>','<state>0</state>',\n           '<real_name>0</real_name>','<source>k-v</source>'];\n  for(var i=0;i<list.length;i++){\n    var d=list[i]||{},t=parseFloat(d.time);\n    if(isNaN(t)||t<0)t=0;\n    var p=[t.toFixed(3),modeBili(d.mode),25,color10(d.color),0,0,0,String(i+1)].join(',');\n    out.push('<d p=\"'+p+'\">'+esc(d.text)+'</d>');\n  }\n  out.push('</i>');\n  return out.join('\\n');\n}\ntry{\n  var u=S(baseUrl);\n  var pm=/\\/play\\/(\\d+)\\/(\\d+)\\.html/.exec(u);\n  var nid=pm?pm[2]:'1';\n  // dmid(番剧级ID) 优先从本次响应 HTML 取；result 被 content 改写时自己重抓一次播放页\n  var html=S(result),dm=/\"?dmid\"?\\s*:\\s*\"?(\\d+)\"?/.exec(html),vid=dm?dm[1]:'';\n  if(!vid&&u){var gp=getPlay(u);var dm2=/\"?dmid\"?\\s*:\\s*\"?(\\d+)\"?/.exec(gp);if(dm2)vid=dm2[1];}\n  if(!vid)return '';\n  var body=JSON.stringify({vid:parseInt(vid,10),sid:0,nid:parseInt(nid,10)});\n  var r=REQ(API,'POST',body,'application/json;charset=UTF-8',false,null);\n  var txt=S(r.h);\n  if(!txt)r=REQ(API,'POST','vid='+parseInt(vid,10)+'&sid=0&nid='+parseInt(nid,10),'application/x-www-form-urlencoded',true,null);\n  txt=S(r.h);\n  if(!txt)return '';\n  var list=[];\n  try{list=JSON.parse(txt).list||[];}catch(e){return '';}\n  if(!list.length)return '';\n  return DM_XML(list);\n}catch(e){return '';}\n})()"}, "ruleExplore": {"author": "$.kind", "bookList": "@js:(function(){\nvar UA='Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n// 默认兜底线路（与发布页当前 4 条一致）；实际线路来自登录面板「一键从发布页获取」写入的 om_lines\nvar DEF_LINES=['https://www.omofuns.com','https://cn.233dm.com','https://cn.211dm.com','https://cn.agekkkk.com'];\nfunction lines(){\n  var raw=SV('om_lines'),a=null;\n  if(raw){try{a=JSON.parse(String(raw));}catch(e){a=null;}}\n  if(a&&a.length){\n    var r=[],seen={};\n    for(var i=0;i<a.length;i++){\n      var u=(typeof a[i]==='string')?a[i]:(a[i]&&a[i].u?String(a[i].u):'');\n      u=String(u).replace(/\\/+$/,'');\n      if(u.indexOf('https://')===0&&u.indexOf('fb.omoo')<0&&!seen[u]){seen[u]=1;r.push(u);}\n    }\n    if(r.length)return r;\n  }\n  // 兼容旧书源遗留的 om_sn / om_s1..8\n  var n=parseInt(SV('om_sn'),10)||0,r2=[];\n  for(var j=1;j<=n&&j<=8;j++){var v=SV('om_s'+j).replace(/\\/+$/,'');if(v.indexOf('https://')===0)r2.push(v);}\n  if(r2.length)return r2;\n  return DEF_LINES;\n}\nvar K=[78,63,169,194,18,125,136,239,85,170,11,205,222,173,190,239];\nfunction S(v){try{var s=String(v==null?'':v);return (s==='null'||s==='undefined'||s==='[object Object]'||s==='JsNull')?'':s;}catch(e){return '';}}\nfunction SV(k){try{return S(source.get(k));}catch(e){return '';}}\nfunction sub(k,v){try{source.put(k,String(v));}catch(e){}}\nfunction curLine(){var c=SV('om_line').replace(/\\/+$/,''),a=lines();if(c.indexOf('https://')===0&&c.indexOf('fb.omoo')<0){for(var i=0;i<a.length;i++)if(a[i]===c)return c;if(c===SV('om_custom').replace(/\\/+$/,''))return c;}return a[0];}\nfunction hostOf(u){var s=String(u==null?'':u),m=/^https?:\\/\\/([^\\/]+)/.exec(s);if(!m)return '';var hn=m[1],a=lines();for(var i=0;i<a.length;i++){if(a[i].replace(/^https?:\\/\\//,'')===hn)return a[i];}if(s.indexOf('https://')===0)return 'https://'+hn;return '';}\nfunction ord(){var c=curLine(),a=lines(),r=[c];for(var i=0;i<a.length;i++){if(a[i]!==c)r.push(a[i]);}return r;}\nfunction gt(h){h=String(h==null?'':h);if(!h)return true;return h.indexOf('\\u7cfb\\u7edf\\u5b89\\u5168\\u9a8c\\u8bc1')>=0||h.indexOf('verify_check')>=0;}\nfunction okPage(h){h=String(h==null?'':h);if(!h||h.length<8000)return false;if(gt(h))return false;return true;}\nfunction b64(s){var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',o='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i)&255,b=i+1<s.length?s.charCodeAt(i+1)&255:null,c=i+2<s.length?s.charCodeAt(i+2)&255:null,n=(a<<16)|((b||0)<<8)|(c||0);o+=t.charAt((n>>18)&63)+t.charAt((n>>12)&63)+(b===null?'=':t.charAt((n>>6)&63))+(c===null?'=':t.charAt(n&63));}return o;}\nfunction tk(){var ts=String(Date.now()),p='';for(var i=0;i<ts.length;i++)p+=String.fromCharCode(ts.charCodeAt(i)^K[i%16]);return b64(p);}\nfunction b64b(s){\n  // 用 ByteArrayOutputStream 生成 byte[]，避开反射建数组的高危 API\n  // （Legado 登录面板/部分真机环境里该 Class 会被解析成 JavaPackage 而非类）\n  var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n  var bos=new Packages.java.io.ByteArrayOutputStream(),buf=0,bits=0,i,ch,v;\n  for(i=0;i<s.length;i++){\n    ch=s.charAt(i);\n    if(ch==='='||ch==='\\n'||ch==='\\r'||ch===' ')continue;\n    v=t.indexOf(ch);\n    if(v<0)continue;\n    buf=((buf<<6)|v)&0x3FFFFF;bits+=6;\n    if(bits>=8){bits-=8;bos.write((buf>>bits)&255);}\n  }\n  return bos.toByteArray();\n}\nfunction hk(b){var m=/^https?:\\/\\/([^\\/]+)/.exec(String(b||''));return m?('om_ck_'+m[1]):'om_ck_x';}\nfunction rdCk(b){return SV(hk(b));}\nfunction wrCk(b,sc){if(!sc)return;var parts=String(sc).split(';');var kv=parts[0];if(kv&&kv.indexOf('=')>0){var old=rdCk(b),name=kv.split('=')[0];var keep=[];if(old){var o=old.split(';');for(var i=0;i<o.length;i++){var p=String(o[i]).replace(/^\\s+/,'');if(p&&p.split('=')[0]!==name)keep.push(p);}}keep.push(kv);sub(hk(b),keep.join('; '));}}\nfunction TXT(c){\n  // 文本流读法：InputStream -> (gzip 则包 GZIPInputStream) -> BufferedReader 逐行。\n  // 全程不创建 Java byte[]，避开反射建数组的高危 API。\n  var is=c.getInputStream();\n  try{\n    var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);\n  }catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\n// 最后一次重试用：跳过 SSL 证书/主机名校验（应对被劫持的线路或自签播放器证书）\nfunction looseSSL(c){\n  // 最后一次重试兜底：只跳过主机名校验（足以应对 CN=*.10086.cn 这类劫持证书）。\n  // 不再自建 TrustManager[] —— 那需要反射创建 Java 数组，真机会崩。\n  try{\n    var hv=new JavaAdapter(Packages.javax.net.ssl.HostnameVerifier,{verify:function(a,b){return true;}});\n    c.setHostnameVerifier(hv);\n  }catch(e){}\n}\nfunction REQ(url,method,body,ck,loose){\n  var out={code:0,h:'',sc:''};\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod(method||'GET');\n    c.setConnectTimeout(8000);c.setReadTimeout(15000);\n    c.setInstanceFollowRedirects(true);\n    if(loose)looseSSL(c);\n    c.setRequestProperty('User-Agent',UA);\n    c.setRequestProperty('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    if(ck)c.setRequestProperty('Cookie',String(ck));\n    if(body!=null){c.setDoOutput(true);c.setRequestProperty('Content-Type','application/x-www-form-urlencoded');var os=c.getOutputStream();os.write(new Packages.java.lang.String(String(body)).getBytes('UTF-8'));os.flush();os.close();}\n    out.code=c.getResponseCode();\n    try{out.h=TXT(c);}catch(e1){out.h='';}\n    try{var v=c.getHeaderFields().get('Set-Cookie');if(v){var t=[];for(var i=0;i<v.size();i++)t.push(String(v.get(i)));out.sc=t.join(';');}}catch(e2){}\n  }catch(e){out.h='';out.err=String(e);}\n  return out;\n}\nfunction pass(b){\n  try{\n    var r=REQ(b+'/index.php/ajax/verify_check?type=search','POST','i='+encodeURIComponent(tk()),rdCk(b));\n    wrCk(b,r.sc);\n    var s=String(r.h||'');\n    return s.indexOf('\"code\":1')>=0||s.indexOf('\"code\": 1')>=0;\n  }catch(e){return false;}\n}\nfunction G1(b,p){var r=REQ(b+p,'GET',null,rdCk(b));wrCk(b,r.sc);return String(r.h||'');}\nfunction fetch(b,p){\n  var h=G1(b,p);\n  if(okPage(h))return h;\n  for(var i=0;i<2;i++){\n    if(!pass(b))break;\n    try{Packages.java.lang.Thread.sleep(400);}catch(e){}\n    h=G1(b,p);\n    if(okPage(h))break;\n  }\n  return h;\n}\nfunction pick(p){\n  var a=ord(),last='';\n  for(var i=0;i<a.length;i++){\n    var h=fetch(a[i],p);\n    if(okPage(h)){if(a[i]!==curLine())sub('om_line',a[i]);return{h:h,b:a[i]};}\n    last=h;\n  }\n  return{h:last,b:a[0]};\n}\nfunction pth(u){var s=String(u==null?'':u),m=/^https?:\\/\\/[^\\/]+(\\/[^\\s]*)?$/.exec(s);return m?(m[1]||'/'):'/';}\nfunction abs(b,u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('http')===0)return u;if(u.indexOf('//')===0)return 'https:'+u;if(u.charAt(0)==='/')return b+u;return b+'/'+u;}\nfunction pic(u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('//')===0)return 'https:'+u;if(u.indexOf('http')===0){if(u.replace(/\\/+$/,'')==='https://as.cfhls.top')return '';return u;}if(u.charAt(0)==='/')return 'https://as.cfhls.top'+u;return u;}\nfunction Jp(h){try{return Packages.org.jsoup.Jsoup.parse(String(h||''));}catch(e){return null;}}\nfunction txt(e){try{return e?String(e.text()).trim():'';}catch(x){return '';}}\nfunction attr(e,n){try{return e?String(e.attr(n)||'').trim():'';}catch(x){return '';}}\nfunction first(d,sel){try{var e=d.select(sel);return e&&e.size()>0?e.get(0):null;}catch(x){return null;}}\nfunction parseList(h,b){\n  var out=[],seen={};\n  if(!h||gt(h))return out;\n  var d=Jp(h);if(!d)return out;\n  var as=null;\n  try{as=d.select('a[href*=/anime/]');}catch(e1){return out;}\n  if(!as)return out;\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);var u=attr(a,'href');\n    if(u.indexOf('/anime/')<0||u.indexOf('.html')<0)continue;\n    if(u.indexOf('/play/')>=0)continue;\n    var n=attr(a,'title');if(!n)n=txt(a);\n    if(!n||n.length>60)continue;\n    // 无封面不再跳过条目：隐藏轮播 banner 只有图床根路径背景，coverUrl 留空即可，\n    // 详情页规则会自动补封面。若同 URL 已有条目且旧的无封面、新的有封面，则用新的替换。\n    var p1=attr(a,'data-original');\n    if(!p1){var im=first(a,'img');if(im){p1=attr(im,'data-original')||attr(im,'src');}}\n    p1=pic(p1);\n    var old=seen[u];\n    if(old){\n      if(p1){var prev=null;try{prev=JSON.parse(out[old-1]);}catch(e8){}\n        if(prev&&!prev.coverUrl){\n          var kind2=prev.kind||'',last2=prev.lastChapter||'';\n          var li2=null;try{li2=a.parent();}catch(e9){}\n          var g2=0;while(li2&&g2++<4){var tg2='';try{tg2=String(li2.tagName());}catch(e10){}if(String(tg2).toLowerCase()==='li')break;try{li2=li2.parent();}catch(e11){li2=null;break;}}\n          if(li2){var bs2=null;try{bs2=li2.select('span b');}catch(e12){}if(bs2&&bs2.size()>=2){kind2=txt(bs2.get(0));last2=txt(bs2.get(bs2.size()-1));}}\n          out[old-1]=JSON.stringify({name:prev.name,bookUrl:prev.bookUrl,coverUrl:p1,kind:kind2,lastChapter:last2});\n        }\n      }\n      continue;\n    }\n    var kind='',last='';var li=null;try{li=a.parent();}catch(e4){}\n    var g=0;\n    while(li&&g++<4){var tg='';try{tg=String(li.tagName());}catch(e5){}if(String(tg).toLowerCase()==='li')break;try{li=li.parent();}catch(e6){li=null;break;}}\n    if(li){var bs=null;try{bs=li.select('span b');}catch(e7){}\n      if(bs&&bs.size()>=2){kind=txt(bs.get(0));last=txt(bs.get(bs.size()-1));}}\n    seen[u]=out.length+1;\n    out.push(JSON.stringify({name:n,bookUrl:abs(b,u),coverUrl:p1,kind:kind,lastChapter:last}));\n  }\n  return out;\n}\nfunction arr(list,out){try{var l=new Packages.java.util.ArrayList();for(var i=0;i<out.length;i++)l.add(out[i]);return l;}catch(e){return out;}}\n\nvar b=hostOf(baseUrl)||curLine(),h=String(result||'');\nvar out=gt(h)?[]:parseList(h,b);\nif(out.length===0){\n  var r=pick(pth(baseUrl));\n  if(okPage(r.h)){out=parseList(r.h,r.b);}\n}\nreturn arr(null,out);\n})()", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name"}, "ruleSearch": {"author": "$.kind", "bookList": "@js:(function(){\nvar UA='Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n// 默认兜底线路（与发布页当前 4 条一致）；实际线路来自登录面板「一键从发布页获取」写入的 om_lines\nvar DEF_LINES=['https://www.omofuns.com','https://cn.233dm.com','https://cn.211dm.com','https://cn.agekkkk.com'];\nfunction lines(){\n  var raw=SV('om_lines'),a=null;\n  if(raw){try{a=JSON.parse(String(raw));}catch(e){a=null;}}\n  if(a&&a.length){\n    var r=[],seen={};\n    for(var i=0;i<a.length;i++){\n      var u=(typeof a[i]==='string')?a[i]:(a[i]&&a[i].u?String(a[i].u):'');\n      u=String(u).replace(/\\/+$/,'');\n      if(u.indexOf('https://')===0&&u.indexOf('fb.omoo')<0&&!seen[u]){seen[u]=1;r.push(u);}\n    }\n    if(r.length)return r;\n  }\n  // 兼容旧书源遗留的 om_sn / om_s1..8\n  var n=parseInt(SV('om_sn'),10)||0,r2=[];\n  for(var j=1;j<=n&&j<=8;j++){var v=SV('om_s'+j).replace(/\\/+$/,'');if(v.indexOf('https://')===0)r2.push(v);}\n  if(r2.length)return r2;\n  return DEF_LINES;\n}\nvar K=[78,63,169,194,18,125,136,239,85,170,11,205,222,173,190,239];\nfunction S(v){try{var s=String(v==null?'':v);return (s==='null'||s==='undefined'||s==='[object Object]'||s==='JsNull')?'':s;}catch(e){return '';}}\nfunction SV(k){try{return S(source.get(k));}catch(e){return '';}}\nfunction sub(k,v){try{source.put(k,String(v));}catch(e){}}\nfunction curLine(){var c=SV('om_line').replace(/\\/+$/,''),a=lines();if(c.indexOf('https://')===0&&c.indexOf('fb.omoo')<0){for(var i=0;i<a.length;i++)if(a[i]===c)return c;if(c===SV('om_custom').replace(/\\/+$/,''))return c;}return a[0];}\nfunction hostOf(u){var s=String(u==null?'':u),m=/^https?:\\/\\/([^\\/]+)/.exec(s);if(!m)return '';var hn=m[1],a=lines();for(var i=0;i<a.length;i++){if(a[i].replace(/^https?:\\/\\//,'')===hn)return a[i];}if(s.indexOf('https://')===0)return 'https://'+hn;return '';}\nfunction ord(){var c=curLine(),a=lines(),r=[c];for(var i=0;i<a.length;i++){if(a[i]!==c)r.push(a[i]);}return r;}\nfunction gt(h){h=String(h==null?'':h);if(!h)return true;return h.indexOf('\\u7cfb\\u7edf\\u5b89\\u5168\\u9a8c\\u8bc1')>=0||h.indexOf('verify_check')>=0;}\nfunction okPage(h){h=String(h==null?'':h);if(!h||h.length<8000)return false;if(gt(h))return false;return true;}\nfunction b64(s){var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',o='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i)&255,b=i+1<s.length?s.charCodeAt(i+1)&255:null,c=i+2<s.length?s.charCodeAt(i+2)&255:null,n=(a<<16)|((b||0)<<8)|(c||0);o+=t.charAt((n>>18)&63)+t.charAt((n>>12)&63)+(b===null?'=':t.charAt((n>>6)&63))+(c===null?'=':t.charAt(n&63));}return o;}\nfunction tk(){var ts=String(Date.now()),p='';for(var i=0;i<ts.length;i++)p+=String.fromCharCode(ts.charCodeAt(i)^K[i%16]);return b64(p);}\nfunction b64b(s){\n  // 用 ByteArrayOutputStream 生成 byte[]，避开反射建数组的高危 API\n  // （Legado 登录面板/部分真机环境里该 Class 会被解析成 JavaPackage 而非类）\n  var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n  var bos=new Packages.java.io.ByteArrayOutputStream(),buf=0,bits=0,i,ch,v;\n  for(i=0;i<s.length;i++){\n    ch=s.charAt(i);\n    if(ch==='='||ch==='\\n'||ch==='\\r'||ch===' ')continue;\n    v=t.indexOf(ch);\n    if(v<0)continue;\n    buf=((buf<<6)|v)&0x3FFFFF;bits+=6;\n    if(bits>=8){bits-=8;bos.write((buf>>bits)&255);}\n  }\n  return bos.toByteArray();\n}\nfunction hk(b){var m=/^https?:\\/\\/([^\\/]+)/.exec(String(b||''));return m?('om_ck_'+m[1]):'om_ck_x';}\nfunction rdCk(b){return SV(hk(b));}\nfunction wrCk(b,sc){if(!sc)return;var parts=String(sc).split(';');var kv=parts[0];if(kv&&kv.indexOf('=')>0){var old=rdCk(b),name=kv.split('=')[0];var keep=[];if(old){var o=old.split(';');for(var i=0;i<o.length;i++){var p=String(o[i]).replace(/^\\s+/,'');if(p&&p.split('=')[0]!==name)keep.push(p);}}keep.push(kv);sub(hk(b),keep.join('; '));}}\nfunction TXT(c){\n  // 文本流读法：InputStream -> (gzip 则包 GZIPInputStream) -> BufferedReader 逐行。\n  // 全程不创建 Java byte[]，避开反射建数组的高危 API。\n  var is=c.getInputStream();\n  try{\n    var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);\n  }catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\n// 最后一次重试用：跳过 SSL 证书/主机名校验（应对被劫持的线路或自签播放器证书）\nfunction looseSSL(c){\n  // 最后一次重试兜底：只跳过主机名校验（足以应对 CN=*.10086.cn 这类劫持证书）。\n  // 不再自建 TrustManager[] —— 那需要反射创建 Java 数组，真机会崩。\n  try{\n    var hv=new JavaAdapter(Packages.javax.net.ssl.HostnameVerifier,{verify:function(a,b){return true;}});\n    c.setHostnameVerifier(hv);\n  }catch(e){}\n}\nfunction REQ(url,method,body,ck,loose){\n  var out={code:0,h:'',sc:''};\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod(method||'GET');\n    c.setConnectTimeout(8000);c.setReadTimeout(15000);\n    c.setInstanceFollowRedirects(true);\n    if(loose)looseSSL(c);\n    c.setRequestProperty('User-Agent',UA);\n    c.setRequestProperty('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    if(ck)c.setRequestProperty('Cookie',String(ck));\n    if(body!=null){c.setDoOutput(true);c.setRequestProperty('Content-Type','application/x-www-form-urlencoded');var os=c.getOutputStream();os.write(new Packages.java.lang.String(String(body)).getBytes('UTF-8'));os.flush();os.close();}\n    out.code=c.getResponseCode();\n    try{out.h=TXT(c);}catch(e1){out.h='';}\n    try{var v=c.getHeaderFields().get('Set-Cookie');if(v){var t=[];for(var i=0;i<v.size();i++)t.push(String(v.get(i)));out.sc=t.join(';');}}catch(e2){}\n  }catch(e){out.h='';out.err=String(e);}\n  return out;\n}\nfunction pass(b){\n  try{\n    var r=REQ(b+'/index.php/ajax/verify_check?type=search','POST','i='+encodeURIComponent(tk()),rdCk(b));\n    wrCk(b,r.sc);\n    var s=String(r.h||'');\n    return s.indexOf('\"code\":1')>=0||s.indexOf('\"code\": 1')>=0;\n  }catch(e){return false;}\n}\nfunction G1(b,p){var r=REQ(b+p,'GET',null,rdCk(b));wrCk(b,r.sc);return String(r.h||'');}\nfunction fetch(b,p){\n  var h=G1(b,p);\n  if(okPage(h))return h;\n  for(var i=0;i<2;i++){\n    if(!pass(b))break;\n    try{Packages.java.lang.Thread.sleep(400);}catch(e){}\n    h=G1(b,p);\n    if(okPage(h))break;\n  }\n  return h;\n}\nfunction pick(p){\n  var a=ord(),last='';\n  for(var i=0;i<a.length;i++){\n    var h=fetch(a[i],p);\n    if(okPage(h)){if(a[i]!==curLine())sub('om_line',a[i]);return{h:h,b:a[i]};}\n    last=h;\n  }\n  return{h:last,b:a[0]};\n}\nfunction pth(u){var s=String(u==null?'':u),m=/^https?:\\/\\/[^\\/]+(\\/[^\\s]*)?$/.exec(s);return m?(m[1]||'/'):'/';}\nfunction abs(b,u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('http')===0)return u;if(u.indexOf('//')===0)return 'https:'+u;if(u.charAt(0)==='/')return b+u;return b+'/'+u;}\nfunction pic(u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('//')===0)return 'https:'+u;if(u.indexOf('http')===0){if(u.replace(/\\/+$/,'')==='https://as.cfhls.top')return '';return u;}if(u.charAt(0)==='/')return 'https://as.cfhls.top'+u;return u;}\nfunction Jp(h){try{return Packages.org.jsoup.Jsoup.parse(String(h||''));}catch(e){return null;}}\nfunction txt(e){try{return e?String(e.text()).trim():'';}catch(x){return '';}}\nfunction attr(e,n){try{return e?String(e.attr(n)||'').trim():'';}catch(x){return '';}}\nfunction first(d,sel){try{var e=d.select(sel);return e&&e.size()>0?e.get(0):null;}catch(x){return null;}}\nfunction parseList(h,b){\n  var out=[],seen={};\n  if(!h||gt(h))return out;\n  var d=Jp(h);if(!d)return out;\n  var as=null;\n  try{as=d.select('a[href*=/anime/]');}catch(e1){return out;}\n  if(!as)return out;\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);var u=attr(a,'href');\n    if(u.indexOf('/anime/')<0||u.indexOf('.html')<0)continue;\n    if(u.indexOf('/play/')>=0)continue;\n    var n=attr(a,'title');if(!n)n=txt(a);\n    if(!n||n.length>60)continue;\n    // 无封面不再跳过条目：隐藏轮播 banner 只有图床根路径背景，coverUrl 留空即可，\n    // 详情页规则会自动补封面。若同 URL 已有条目且旧的无封面、新的有封面，则用新的替换。\n    var p1=attr(a,'data-original');\n    if(!p1){var im=first(a,'img');if(im){p1=attr(im,'data-original')||attr(im,'src');}}\n    p1=pic(p1);\n    var old=seen[u];\n    if(old){\n      if(p1){var prev=null;try{prev=JSON.parse(out[old-1]);}catch(e8){}\n        if(prev&&!prev.coverUrl){\n          var kind2=prev.kind||'',last2=prev.lastChapter||'';\n          var li2=null;try{li2=a.parent();}catch(e9){}\n          var g2=0;while(li2&&g2++<4){var tg2='';try{tg2=String(li2.tagName());}catch(e10){}if(String(tg2).toLowerCase()==='li')break;try{li2=li2.parent();}catch(e11){li2=null;break;}}\n          if(li2){var bs2=null;try{bs2=li2.select('span b');}catch(e12){}if(bs2&&bs2.size()>=2){kind2=txt(bs2.get(0));last2=txt(bs2.get(bs2.size()-1));}}\n          out[old-1]=JSON.stringify({name:prev.name,bookUrl:prev.bookUrl,coverUrl:p1,kind:kind2,lastChapter:last2});\n        }\n      }\n      continue;\n    }\n    var kind='',last='';var li=null;try{li=a.parent();}catch(e4){}\n    var g=0;\n    while(li&&g++<4){var tg='';try{tg=String(li.tagName());}catch(e5){}if(String(tg).toLowerCase()==='li')break;try{li=li.parent();}catch(e6){li=null;break;}}\n    if(li){var bs=null;try{bs=li.select('span b');}catch(e7){}\n      if(bs&&bs.size()>=2){kind=txt(bs.get(0));last=txt(bs.get(bs.size()-1));}}\n    seen[u]=out.length+1;\n    out.push(JSON.stringify({name:n,bookUrl:abs(b,u),coverUrl:p1,kind:kind,lastChapter:last}));\n  }\n  return out;\n}\nfunction arr(list,out){try{var l=new Packages.java.util.ArrayList();for(var i=0;i<out.length;i++)l.add(out[i]);return l;}catch(e){return out;}}\n\nvar p=pth(baseUrl);\n// 少数版本 Legado 会把 baseUrl 里的百分号编码还原成中文，Java URL 不接受裸中文\nif(/[^\\x00-\\x7F]/.test(p)){try{p=encodeURI(p);}catch(ep){}}\nvar r=pick(p);\nvar out=okPage(r.h)?parseList(r.h,r.b):[];\nreturn arr(null,out);\n})()", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name"}, "ruleToc": {"chapterList": "@js:(function(){\nvar UA='Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n// 默认兜底线路（与发布页当前 4 条一致）；实际线路来自登录面板「一键从发布页获取」写入的 om_lines\nvar DEF_LINES=['https://www.omofuns.com','https://cn.233dm.com','https://cn.211dm.com','https://cn.agekkkk.com'];\nfunction lines(){\n  var raw=SV('om_lines'),a=null;\n  if(raw){try{a=JSON.parse(String(raw));}catch(e){a=null;}}\n  if(a&&a.length){\n    var r=[],seen={};\n    for(var i=0;i<a.length;i++){\n      var u=(typeof a[i]==='string')?a[i]:(a[i]&&a[i].u?String(a[i].u):'');\n      u=String(u).replace(/\\/+$/,'');\n      if(u.indexOf('https://')===0&&u.indexOf('fb.omoo')<0&&!seen[u]){seen[u]=1;r.push(u);}\n    }\n    if(r.length)return r;\n  }\n  // 兼容旧书源遗留的 om_sn / om_s1..8\n  var n=parseInt(SV('om_sn'),10)||0,r2=[];\n  for(var j=1;j<=n&&j<=8;j++){var v=SV('om_s'+j).replace(/\\/+$/,'');if(v.indexOf('https://')===0)r2.push(v);}\n  if(r2.length)return r2;\n  return DEF_LINES;\n}\nvar K=[78,63,169,194,18,125,136,239,85,170,11,205,222,173,190,239];\nfunction S(v){try{var s=String(v==null?'':v);return (s==='null'||s==='undefined'||s==='[object Object]'||s==='JsNull')?'':s;}catch(e){return '';}}\nfunction SV(k){try{return S(source.get(k));}catch(e){return '';}}\nfunction sub(k,v){try{source.put(k,String(v));}catch(e){}}\nfunction curLine(){var c=SV('om_line').replace(/\\/+$/,''),a=lines();if(c.indexOf('https://')===0&&c.indexOf('fb.omoo')<0){for(var i=0;i<a.length;i++)if(a[i]===c)return c;if(c===SV('om_custom').replace(/\\/+$/,''))return c;}return a[0];}\nfunction hostOf(u){var s=String(u==null?'':u),m=/^https?:\\/\\/([^\\/]+)/.exec(s);if(!m)return '';var hn=m[1],a=lines();for(var i=0;i<a.length;i++){if(a[i].replace(/^https?:\\/\\//,'')===hn)return a[i];}if(s.indexOf('https://')===0)return 'https://'+hn;return '';}\nfunction ord(){var c=curLine(),a=lines(),r=[c];for(var i=0;i<a.length;i++){if(a[i]!==c)r.push(a[i]);}return r;}\nfunction gt(h){h=String(h==null?'':h);if(!h)return true;return h.indexOf('\\u7cfb\\u7edf\\u5b89\\u5168\\u9a8c\\u8bc1')>=0||h.indexOf('verify_check')>=0;}\nfunction okPage(h){h=String(h==null?'':h);if(!h||h.length<8000)return false;if(gt(h))return false;return true;}\nfunction b64(s){var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',o='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i)&255,b=i+1<s.length?s.charCodeAt(i+1)&255:null,c=i+2<s.length?s.charCodeAt(i+2)&255:null,n=(a<<16)|((b||0)<<8)|(c||0);o+=t.charAt((n>>18)&63)+t.charAt((n>>12)&63)+(b===null?'=':t.charAt((n>>6)&63))+(c===null?'=':t.charAt(n&63));}return o;}\nfunction tk(){var ts=String(Date.now()),p='';for(var i=0;i<ts.length;i++)p+=String.fromCharCode(ts.charCodeAt(i)^K[i%16]);return b64(p);}\nfunction b64b(s){\n  // 用 ByteArrayOutputStream 生成 byte[]，避开反射建数组的高危 API\n  // （Legado 登录面板/部分真机环境里该 Class 会被解析成 JavaPackage 而非类）\n  var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n  var bos=new Packages.java.io.ByteArrayOutputStream(),buf=0,bits=0,i,ch,v;\n  for(i=0;i<s.length;i++){\n    ch=s.charAt(i);\n    if(ch==='='||ch==='\\n'||ch==='\\r'||ch===' ')continue;\n    v=t.indexOf(ch);\n    if(v<0)continue;\n    buf=((buf<<6)|v)&0x3FFFFF;bits+=6;\n    if(bits>=8){bits-=8;bos.write((buf>>bits)&255);}\n  }\n  return bos.toByteArray();\n}\nfunction hk(b){var m=/^https?:\\/\\/([^\\/]+)/.exec(String(b||''));return m?('om_ck_'+m[1]):'om_ck_x';}\nfunction rdCk(b){return SV(hk(b));}\nfunction wrCk(b,sc){if(!sc)return;var parts=String(sc).split(';');var kv=parts[0];if(kv&&kv.indexOf('=')>0){var old=rdCk(b),name=kv.split('=')[0];var keep=[];if(old){var o=old.split(';');for(var i=0;i<o.length;i++){var p=String(o[i]).replace(/^\\s+/,'');if(p&&p.split('=')[0]!==name)keep.push(p);}}keep.push(kv);sub(hk(b),keep.join('; '));}}\nfunction TXT(c){\n  // 文本流读法：InputStream -> (gzip 则包 GZIPInputStream) -> BufferedReader 逐行。\n  // 全程不创建 Java byte[]，避开反射建数组的高危 API。\n  var is=c.getInputStream();\n  try{\n    var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);\n  }catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\n// 最后一次重试用：跳过 SSL 证书/主机名校验（应对被劫持的线路或自签播放器证书）\nfunction looseSSL(c){\n  // 最后一次重试兜底：只跳过主机名校验（足以应对 CN=*.10086.cn 这类劫持证书）。\n  // 不再自建 TrustManager[] —— 那需要反射创建 Java 数组，真机会崩。\n  try{\n    var hv=new JavaAdapter(Packages.javax.net.ssl.HostnameVerifier,{verify:function(a,b){return true;}});\n    c.setHostnameVerifier(hv);\n  }catch(e){}\n}\nfunction REQ(url,method,body,ck,loose){\n  var out={code:0,h:'',sc:''};\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod(method||'GET');\n    c.setConnectTimeout(8000);c.setReadTimeout(15000);\n    c.setInstanceFollowRedirects(true);\n    if(loose)looseSSL(c);\n    c.setRequestProperty('User-Agent',UA);\n    c.setRequestProperty('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    if(ck)c.setRequestProperty('Cookie',String(ck));\n    if(body!=null){c.setDoOutput(true);c.setRequestProperty('Content-Type','application/x-www-form-urlencoded');var os=c.getOutputStream();os.write(new Packages.java.lang.String(String(body)).getBytes('UTF-8'));os.flush();os.close();}\n    out.code=c.getResponseCode();\n    try{out.h=TXT(c);}catch(e1){out.h='';}\n    try{var v=c.getHeaderFields().get('Set-Cookie');if(v){var t=[];for(var i=0;i<v.size();i++)t.push(String(v.get(i)));out.sc=t.join(';');}}catch(e2){}\n  }catch(e){out.h='';out.err=String(e);}\n  return out;\n}\nfunction pass(b){\n  try{\n    var r=REQ(b+'/index.php/ajax/verify_check?type=search','POST','i='+encodeURIComponent(tk()),rdCk(b));\n    wrCk(b,r.sc);\n    var s=String(r.h||'');\n    return s.indexOf('\"code\":1')>=0||s.indexOf('\"code\": 1')>=0;\n  }catch(e){return false;}\n}\nfunction G1(b,p){var r=REQ(b+p,'GET',null,rdCk(b));wrCk(b,r.sc);return String(r.h||'');}\nfunction fetch(b,p){\n  var h=G1(b,p);\n  if(okPage(h))return h;\n  for(var i=0;i<2;i++){\n    if(!pass(b))break;\n    try{Packages.java.lang.Thread.sleep(400);}catch(e){}\n    h=G1(b,p);\n    if(okPage(h))break;\n  }\n  return h;\n}\nfunction pick(p){\n  var a=ord(),last='';\n  for(var i=0;i<a.length;i++){\n    var h=fetch(a[i],p);\n    if(okPage(h)){if(a[i]!==curLine())sub('om_line',a[i]);return{h:h,b:a[i]};}\n    last=h;\n  }\n  return{h:last,b:a[0]};\n}\nfunction pth(u){var s=String(u==null?'':u),m=/^https?:\\/\\/[^\\/]+(\\/[^\\s]*)?$/.exec(s);return m?(m[1]||'/'):'/';}\nfunction abs(b,u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('http')===0)return u;if(u.indexOf('//')===0)return 'https:'+u;if(u.charAt(0)==='/')return b+u;return b+'/'+u;}\nfunction pic(u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('//')===0)return 'https:'+u;if(u.indexOf('http')===0){if(u.replace(/\\/+$/,'')==='https://as.cfhls.top')return '';return u;}if(u.charAt(0)==='/')return 'https://as.cfhls.top'+u;return u;}\nfunction Jp(h){try{return Packages.org.jsoup.Jsoup.parse(String(h||''));}catch(e){return null;}}\nfunction txt(e){try{return e?String(e.text()).trim():'';}catch(x){return '';}}\nfunction attr(e,n){try{return e?String(e.attr(n)||'').trim():'';}catch(x){return '';}}\nfunction first(d,sel){try{var e=d.select(sel);return e&&e.size()>0?e.get(0):null;}catch(x){return null;}}\nfunction parseList(h,b){\n  var out=[],seen={};\n  if(!h||gt(h))return out;\n  var d=Jp(h);if(!d)return out;\n  var as=null;\n  try{as=d.select('a[href*=/anime/]');}catch(e1){return out;}\n  if(!as)return out;\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);var u=attr(a,'href');\n    if(u.indexOf('/anime/')<0||u.indexOf('.html')<0)continue;\n    if(u.indexOf('/play/')>=0)continue;\n    var n=attr(a,'title');if(!n)n=txt(a);\n    if(!n||n.length>60)continue;\n    // 无封面不再跳过条目：隐藏轮播 banner 只有图床根路径背景，coverUrl 留空即可，\n    // 详情页规则会自动补封面。若同 URL 已有条目且旧的无封面、新的有封面，则用新的替换。\n    var p1=attr(a,'data-original');\n    if(!p1){var im=first(a,'img');if(im){p1=attr(im,'data-original')||attr(im,'src');}}\n    p1=pic(p1);\n    var old=seen[u];\n    if(old){\n      if(p1){var prev=null;try{prev=JSON.parse(out[old-1]);}catch(e8){}\n        if(prev&&!prev.coverUrl){\n          var kind2=prev.kind||'',last2=prev.lastChapter||'';\n          var li2=null;try{li2=a.parent();}catch(e9){}\n          var g2=0;while(li2&&g2++<4){var tg2='';try{tg2=String(li2.tagName());}catch(e10){}if(String(tg2).toLowerCase()==='li')break;try{li2=li2.parent();}catch(e11){li2=null;break;}}\n          if(li2){var bs2=null;try{bs2=li2.select('span b');}catch(e12){}if(bs2&&bs2.size()>=2){kind2=txt(bs2.get(0));last2=txt(bs2.get(bs2.size()-1));}}\n          out[old-1]=JSON.stringify({name:prev.name,bookUrl:prev.bookUrl,coverUrl:p1,kind:kind2,lastChapter:last2});\n        }\n      }\n      continue;\n    }\n    var kind='',last='';var li=null;try{li=a.parent();}catch(e4){}\n    var g=0;\n    while(li&&g++<4){var tg='';try{tg=String(li.tagName());}catch(e5){}if(String(tg).toLowerCase()==='li')break;try{li=li.parent();}catch(e6){li=null;break;}}\n    if(li){var bs=null;try{bs=li.select('span b');}catch(e7){}\n      if(bs&&bs.size()>=2){kind=txt(bs.get(0));last=txt(bs.get(bs.size()-1));}}\n    seen[u]=out.length+1;\n    out.push(JSON.stringify({name:n,bookUrl:abs(b,u),coverUrl:p1,kind:kind,lastChapter:last}));\n  }\n  return out;\n}\nfunction arr(list,out){try{var l=new Packages.java.util.ArrayList();for(var i=0;i<out.length;i++)l.add(out[i]);return l;}catch(e){return out;}}\n\nvar b=hostOf(baseUrl)||curLine(),h=String(result||'');\nfunction tp(hh,bb){\n var out=[],seen={},d=Jp(hh);\n if(!d)return out;\n try{\n   var pane=first(d,'div[id^=playlist]');\n   var as=null;\n   try{if(pane)as=pane.select('a[href*=/play/]');}catch(e1){}\n   if(!as||as.size()===0){try{as=d.select('div[id^=playlist] a[href*=/play/]');}catch(e2){}} \n   if(!as||as.size()===0){try{as=d.select('a[href*=/play/]');}catch(e3){}} \n   if(as&&as.size()>0){\n     for(var i=0;i<as.size();i++){\n       var a=as.get(i),u=attr(a,'href');\n       if(u.indexOf('/play/')<0||seen[u])continue;\n       seen[u]=1;\n       var n=attr(a,'title')||txt(a);\n       if(!n)n='\\u7b2c'+(out.length+1)+'\\u96c6';\n       out.push(JSON.stringify({n:n,u:abs(bb,u)}));\n     }\n   }\n }catch(ez){}\n return out;\n}\nvar out=gt(h)?[]:tp(h,b);\nif(out.length===0){var r1=pick(pth(baseUrl));out=tp(r1.h,r1.b);}\nreturn arr(null,out);\n})()", "chapterName": "$.n", "chapterUrl": "$.u"}, "searchUrl": "@js:(function(){\nvar UA='Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n// 默认兜底线路（与发布页当前 4 条一致）；实际线路来自登录面板「一键从发布页获取」写入的 om_lines\nvar DEF_LINES=['https://www.omofuns.com','https://cn.233dm.com','https://cn.211dm.com','https://cn.agekkkk.com'];\nfunction lines(){\n  var raw=SV('om_lines'),a=null;\n  if(raw){try{a=JSON.parse(String(raw));}catch(e){a=null;}}\n  if(a&&a.length){\n    var r=[],seen={};\n    for(var i=0;i<a.length;i++){\n      var u=(typeof a[i]==='string')?a[i]:(a[i]&&a[i].u?String(a[i].u):'');\n      u=String(u).replace(/\\/+$/,'');\n      if(u.indexOf('https://')===0&&u.indexOf('fb.omoo')<0&&!seen[u]){seen[u]=1;r.push(u);}\n    }\n    if(r.length)return r;\n  }\n  // 兼容旧书源遗留的 om_sn / om_s1..8\n  var n=parseInt(SV('om_sn'),10)||0,r2=[];\n  for(var j=1;j<=n&&j<=8;j++){var v=SV('om_s'+j).replace(/\\/+$/,'');if(v.indexOf('https://')===0)r2.push(v);}\n  if(r2.length)return r2;\n  return DEF_LINES;\n}\nvar K=[78,63,169,194,18,125,136,239,85,170,11,205,222,173,190,239];\nfunction S(v){try{var s=String(v==null?'':v);return (s==='null'||s==='undefined'||s==='[object Object]'||s==='JsNull')?'':s;}catch(e){return '';}}\nfunction SV(k){try{return S(source.get(k));}catch(e){return '';}}\nfunction sub(k,v){try{source.put(k,String(v));}catch(e){}}\nfunction curLine(){var c=SV('om_line').replace(/\\/+$/,''),a=lines();if(c.indexOf('https://')===0&&c.indexOf('fb.omoo')<0){for(var i=0;i<a.length;i++)if(a[i]===c)return c;if(c===SV('om_custom').replace(/\\/+$/,''))return c;}return a[0];}\nfunction hostOf(u){var s=String(u==null?'':u),m=/^https?:\\/\\/([^\\/]+)/.exec(s);if(!m)return '';var hn=m[1],a=lines();for(var i=0;i<a.length;i++){if(a[i].replace(/^https?:\\/\\//,'')===hn)return a[i];}if(s.indexOf('https://')===0)return 'https://'+hn;return '';}\nfunction ord(){var c=curLine(),a=lines(),r=[c];for(var i=0;i<a.length;i++){if(a[i]!==c)r.push(a[i]);}return r;}\nfunction gt(h){h=String(h==null?'':h);if(!h)return true;return h.indexOf('\\u7cfb\\u7edf\\u5b89\\u5168\\u9a8c\\u8bc1')>=0||h.indexOf('verify_check')>=0;}\nfunction okPage(h){h=String(h==null?'':h);if(!h||h.length<8000)return false;if(gt(h))return false;return true;}\nfunction b64(s){var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',o='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i)&255,b=i+1<s.length?s.charCodeAt(i+1)&255:null,c=i+2<s.length?s.charCodeAt(i+2)&255:null,n=(a<<16)|((b||0)<<8)|(c||0);o+=t.charAt((n>>18)&63)+t.charAt((n>>12)&63)+(b===null?'=':t.charAt((n>>6)&63))+(c===null?'=':t.charAt(n&63));}return o;}\nfunction tk(){var ts=String(Date.now()),p='';for(var i=0;i<ts.length;i++)p+=String.fromCharCode(ts.charCodeAt(i)^K[i%16]);return b64(p);}\nfunction b64b(s){\n  // 用 ByteArrayOutputStream 生成 byte[]，避开反射建数组的高危 API\n  // （Legado 登录面板/部分真机环境里该 Class 会被解析成 JavaPackage 而非类）\n  var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n  var bos=new Packages.java.io.ByteArrayOutputStream(),buf=0,bits=0,i,ch,v;\n  for(i=0;i<s.length;i++){\n    ch=s.charAt(i);\n    if(ch==='='||ch==='\\n'||ch==='\\r'||ch===' ')continue;\n    v=t.indexOf(ch);\n    if(v<0)continue;\n    buf=((buf<<6)|v)&0x3FFFFF;bits+=6;\n    if(bits>=8){bits-=8;bos.write((buf>>bits)&255);}\n  }\n  return bos.toByteArray();\n}\nfunction hk(b){var m=/^https?:\\/\\/([^\\/]+)/.exec(String(b||''));return m?('om_ck_'+m[1]):'om_ck_x';}\nfunction rdCk(b){return SV(hk(b));}\nfunction wrCk(b,sc){if(!sc)return;var parts=String(sc).split(';');var kv=parts[0];if(kv&&kv.indexOf('=')>0){var old=rdCk(b),name=kv.split('=')[0];var keep=[];if(old){var o=old.split(';');for(var i=0;i<o.length;i++){var p=String(o[i]).replace(/^\\s+/,'');if(p&&p.split('=')[0]!==name)keep.push(p);}}keep.push(kv);sub(hk(b),keep.join('; '));}}\nfunction TXT(c){\n  // 文本流读法：InputStream -> (gzip 则包 GZIPInputStream) -> BufferedReader 逐行。\n  // 全程不创建 Java byte[]，避开反射建数组的高危 API。\n  var is=c.getInputStream();\n  try{\n    var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);\n  }catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\n// 最后一次重试用：跳过 SSL 证书/主机名校验（应对被劫持的线路或自签播放器证书）\nfunction looseSSL(c){\n  // 最后一次重试兜底：只跳过主机名校验（足以应对 CN=*.10086.cn 这类劫持证书）。\n  // 不再自建 TrustManager[] —— 那需要反射创建 Java 数组，真机会崩。\n  try{\n    var hv=new JavaAdapter(Packages.javax.net.ssl.HostnameVerifier,{verify:function(a,b){return true;}});\n    c.setHostnameVerifier(hv);\n  }catch(e){}\n}\nfunction REQ(url,method,body,ck,loose){\n  var out={code:0,h:'',sc:''};\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod(method||'GET');\n    c.setConnectTimeout(8000);c.setReadTimeout(15000);\n    c.setInstanceFollowRedirects(true);\n    if(loose)looseSSL(c);\n    c.setRequestProperty('User-Agent',UA);\n    c.setRequestProperty('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    if(ck)c.setRequestProperty('Cookie',String(ck));\n    if(body!=null){c.setDoOutput(true);c.setRequestProperty('Content-Type','application/x-www-form-urlencoded');var os=c.getOutputStream();os.write(new Packages.java.lang.String(String(body)).getBytes('UTF-8'));os.flush();os.close();}\n    out.code=c.getResponseCode();\n    try{out.h=TXT(c);}catch(e1){out.h='';}\n    try{var v=c.getHeaderFields().get('Set-Cookie');if(v){var t=[];for(var i=0;i<v.size();i++)t.push(String(v.get(i)));out.sc=t.join(';');}}catch(e2){}\n  }catch(e){out.h='';out.err=String(e);}\n  return out;\n}\nfunction pass(b){\n  try{\n    var r=REQ(b+'/index.php/ajax/verify_check?type=search','POST','i='+encodeURIComponent(tk()),rdCk(b));\n    wrCk(b,r.sc);\n    var s=String(r.h||'');\n    return s.indexOf('\"code\":1')>=0||s.indexOf('\"code\": 1')>=0;\n  }catch(e){return false;}\n}\nfunction G1(b,p){var r=REQ(b+p,'GET',null,rdCk(b));wrCk(b,r.sc);return String(r.h||'');}\nfunction fetch(b,p){\n  var h=G1(b,p);\n  if(okPage(h))return h;\n  for(var i=0;i<2;i++){\n    if(!pass(b))break;\n    try{Packages.java.lang.Thread.sleep(400);}catch(e){}\n    h=G1(b,p);\n    if(okPage(h))break;\n  }\n  return h;\n}\nfunction pick(p){\n  var a=ord(),last='';\n  for(var i=0;i<a.length;i++){\n    var h=fetch(a[i],p);\n    if(okPage(h)){if(a[i]!==curLine())sub('om_line',a[i]);return{h:h,b:a[i]};}\n    last=h;\n  }\n  return{h:last,b:a[0]};\n}\nfunction pth(u){var s=String(u==null?'':u),m=/^https?:\\/\\/[^\\/]+(\\/[^\\s]*)?$/.exec(s);return m?(m[1]||'/'):'/';}\nfunction abs(b,u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('http')===0)return u;if(u.indexOf('//')===0)return 'https:'+u;if(u.charAt(0)==='/')return b+u;return b+'/'+u;}\nfunction pic(u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('//')===0)return 'https:'+u;if(u.indexOf('http')===0){if(u.replace(/\\/+$/,'')==='https://as.cfhls.top')return '';return u;}if(u.charAt(0)==='/')return 'https://as.cfhls.top'+u;return u;}\nfunction Jp(h){try{return Packages.org.jsoup.Jsoup.parse(String(h||''));}catch(e){return null;}}\nfunction txt(e){try{return e?String(e.text()).trim():'';}catch(x){return '';}}\nfunction attr(e,n){try{return e?String(e.attr(n)||'').trim():'';}catch(x){return '';}}\nfunction first(d,sel){try{var e=d.select(sel);return e&&e.size()>0?e.get(0):null;}catch(x){return null;}}\nfunction parseList(h,b){\n  var out=[],seen={};\n  if(!h||gt(h))return out;\n  var d=Jp(h);if(!d)return out;\n  var as=null;\n  try{as=d.select('a[href*=/anime/]');}catch(e1){return out;}\n  if(!as)return out;\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);var u=attr(a,'href');\n    if(u.indexOf('/anime/')<0||u.indexOf('.html')<0)continue;\n    if(u.indexOf('/play/')>=0)continue;\n    var n=attr(a,'title');if(!n)n=txt(a);\n    if(!n||n.length>60)continue;\n    // 无封面不再跳过条目：隐藏轮播 banner 只有图床根路径背景，coverUrl 留空即可，\n    // 详情页规则会自动补封面。若同 URL 已有条目且旧的无封面、新的有封面，则用新的替换。\n    var p1=attr(a,'data-original');\n    if(!p1){var im=first(a,'img');if(im){p1=attr(im,'data-original')||attr(im,'src');}}\n    p1=pic(p1);\n    var old=seen[u];\n    if(old){\n      if(p1){var prev=null;try{prev=JSON.parse(out[old-1]);}catch(e8){}\n        if(prev&&!prev.coverUrl){\n          var kind2=prev.kind||'',last2=prev.lastChapter||'';\n          var li2=null;try{li2=a.parent();}catch(e9){}\n          var g2=0;while(li2&&g2++<4){var tg2='';try{tg2=String(li2.tagName());}catch(e10){}if(String(tg2).toLowerCase()==='li')break;try{li2=li2.parent();}catch(e11){li2=null;break;}}\n          if(li2){var bs2=null;try{bs2=li2.select('span b');}catch(e12){}if(bs2&&bs2.size()>=2){kind2=txt(bs2.get(0));last2=txt(bs2.get(bs2.size()-1));}}\n          out[old-1]=JSON.stringify({name:prev.name,bookUrl:prev.bookUrl,coverUrl:p1,kind:kind2,lastChapter:last2});\n        }\n      }\n      continue;\n    }\n    var kind='',last='';var li=null;try{li=a.parent();}catch(e4){}\n    var g=0;\n    while(li&&g++<4){var tg='';try{tg=String(li.tagName());}catch(e5){}if(String(tg).toLowerCase()==='li')break;try{li=li.parent();}catch(e6){li=null;break;}}\n    if(li){var bs=null;try{bs=li.select('span b');}catch(e7){}\n      if(bs&&bs.size()>=2){kind=txt(bs.get(0));last=txt(bs.get(bs.size()-1));}}\n    seen[u]=out.length+1;\n    out.push(JSON.stringify({name:n,bookUrl:abs(b,u),coverUrl:p1,kind:kind,lastChapter:last}));\n  }\n  return out;\n}\nfunction arr(list,out){try{var l=new Packages.java.util.ArrayList();for(var i=0;i<out.length;i++)l.add(out[i]);return l;}catch(e){return out;}}\n\nvar b=curLine();\nreturn b+'/search/'+encodeURIComponent(String(key))+'----------{{page}}---.html';\n})()", "weight": 0},{"bookSourceComment": "封面：百度图片代理原样保留（站点自有国内通道）；其余统一归一到 fffgood.com。正文沿用 v2 纯 JS base64 解码。", "bookSourceGroup": "影视频源 🎬", "bookSourceName": "🎬奈飞工厂", "bookSourceType": 4, "bookSourceUrl": "https://www.netflixgc.com", "customButton": false, "customOrder": 27, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>\nvar host = \"https://www.netflixgc.com\";\nvar channels = { \"🎬 电影\": 1, \"📺 电视剧\": 2, \"🧸 漫剧\": 3, \"🎭 综艺\": 23, \"🎞️ 纪录片\": 24 };\nvar currentChannel = '🎬 电影';\ntry {\n  var saved = source.getVariable();\n  if (saved) {\n    var obj = JSON.parse(saved);\n    if (obj.channel) currentChannel = obj.channel;\n  }\n} catch(e) {}\nvar cid = channels[currentChannel] || 1;\n\nvar filters = {\n  \"类型\": {\n    \"1\": [\"全部\",\"喜剧\",\"爱情\",\"恐怖\",\"动作\",\"科幻\",\"剧情\",\"犯罪\",\"奇幻\",\"悬疑\",\"惊悚\",\"家庭\",\"冒险\",\"同性\",\"运动\",\"战争\",\"灾难\",\"NETFLIX\",\"HBO\",\"BBC ONE\",\"HULU\",\"APPLE TV\",\"FOX\"],\n    \"2\": [\"全部\",\"古装\",\"战争\",\"青春偶像\",\"喜剧\",\"爱情\",\"家庭\",\"犯罪\",\"动作\",\"奇幻\",\"剧情\",\"历史\",\"经典\",\"乡村\",\"情景\",\"商战\",\"恐怖\",\"悬疑\",\"惊悚\",\"冒险\",\"同性\",\"运动\",\"灾难\",\"NETFLIX\",\"HBO\",\"BBC ONE\",\"HULU\",\"APPLE TV\",\"FOX\",\"NBC\",\"其他\"],\n    \"3\": [\"全部\",\"搞笑\",\"热血\",\"催泪\",\"后宫\",\"机战\",\"致郁\",\"百合\",\"推理\",\"校园\",\"音乐\",\"社团\",\"装通\",\"战斗\",\"日常\",\"恋爱\",\"冒险\",\"魔幻\",\"喜剧\",\"动作\",\"奇幻\",\"剧情\",\"动画\",\"科幻\",\"NETFLIX\"],\n    \"23\": [\"全部\",\"真人秀\",\"搞笑\",\"音乐\",\"冒险\",\"爱情\",\"喜剧\",\"脱口秀\",\"NETFLIX\"],\n    \"24\": [\"全部\",\"人物\",\"军事\",\"历史\",\"文化\",\"探索\",\"科技\",\"自然\",\"剧情\",\"纪录片\",\"NETFLIX\"]\n  },\n  \"地区\": {\n    \"1\": [\"全部\",\"中国\",\"大陆\",\"香港\",\"台湾\",\"美国\",\"韩国\",\"日本\",\"泰国\",\"新加坡\",\"马来西亚\",\"印度\",\"英国\",\"法国\",\"瑞典\",\"瑞士\",\"乌克兰\",\"加拿大\",\"西班牙\",\"俄罗斯\",\"其它\"],\n    \"2\": [\"全部\",\"中国\",\"大陆\",\"香港\",\"台湾\",\"美国\",\"韩国\",\"日本\",\"泰国\",\"新加坡\",\"马来西亚\",\"印度\",\"英国\",\"法国\",\"瑞典\",\"瑞士\",\"乌克兰\",\"加拿大\",\"西班牙\",\"俄罗斯\",\"其它\"],\n    \"3\": [\"全部\",\"日本\",\"美国\",\"其他\"],\n    \"23\": [\"全部\",\"美国\",\"日本\",\"韩国\"],\n    \"24\": [\"全部\",\"美国\",\"日本\",\"韩国\",\"英国\"]\n  },\n  \"年份\": {\n    \"1\": [\"全部\",\"2026\",\"2025\",\"2024\",\"2023\",\"2022\",\"2021\",\"2020\",\"2019\",\"2018\",\"2017\",\"2016\",\"2015\",\"2014\",\"2013\",\"2012\",\"2011\",\"2010\",\"2009\",\"2008\",\"2007\",\"2006\",\"2005\",\"2004\",\"2003\",\"2002\",\"2001\",\"2000\",\"1999\",\"1998\",\"1997\",\"1996\",\"1995\",\"1994\",\"1993\",\"1992\",\"1991\",\"1990\",\"其他\"],\n    \"2\": [\"全部\",\"2026\",\"2025\",\"2024\",\"2023\",\"2022\",\"2021\",\"2020\",\"2019\",\"2018\",\"2017\",\"2016\",\"2015\",\"2014\",\"2013\",\"2012\",\"2011\",\"2010\",\"2009\",\"2008\",\"2007\",\"2006\",\"2005\",\"2004\",\"2003\",\"2002\",\"2001\",\"2000\"],\n    \"3\": [\"全部\",\"2026\",\"2025\",\"2024\",\"2023\",\"2022\",\"2021\",\"2020\",\"2019\",\"2018\",\"2017\",\"2016\",\"2015\",\"2014\",\"2013\",\"2012\",\"2011\",\"2010\",\"2009\",\"2008\",\"2007\",\"2006\",\"2005\",\"2004\",\"2003\",\"2002\",\"2001\",\"2000\",\"1999\",\"1998\",\"1997\",\"1996\",\"1995\",\"1994\",\"1993\",\"1992\",\"1991\",\"1990\",\"其他\"],\n    \"23\": [\"全部\",\"2026\",\"2025\",\"2024\",\"2023\",\"2022\",\"2021\",\"2020\",\"2019\",\"2018\",\"2017\",\"2016\",\"2015\",\"2014\",\"2013\",\"2012\",\"2011\",\"其他\"],\n    \"24\": [\"全部\",\"2026\",\"2025\",\"2024\",\"2023\",\"2022\",\"2021\",\"2020\",\"2019\",\"2018\",\"2017\",\"2016\",\"2015\",\"2014\",\"2013\",\"2012\",\"2011\",\"其他\"]\n  },\n  \"语言\": {\n    \"1\": [\"全部\",\"中文\",\"粤语\",\"闽南语\",\"英语\",\"日语\",\"韩语\",\"法语\",\"俄语\",\"德语\",\"泰语\",\"瑞典语\",\"印度语\"],\n    \"2\": [\"全部\",\"中文\",\"国语\",\"粤语\",\"闽南语\",\"英语\",\"日语\",\"韩语\",\"法语\",\"俄语\",\"德语\",\"泰语\",\"瑞典语\",\"印度语\",\"其它\"],\n    \"3\": [\"全部\",\"日语\",\"英语\"],\n    \"23\": [\"全部\",\"英语\",\"日语\",\"韩语\"],\n    \"24\": [\"全部\",\"英语\",\"日语\",\"韩语\"]\n  }\n};\n\nvar ui = [\n  { title: '关键字', type: 'text', default: '', style: { layout_flexBasisPercent: 1 } },\n  { title: '🔍 搜剧', type: 'button', action: \"var k=infoMap['关键字']; if(!k){ java.toast('请输入影片名称'); } else { java.searchBook(k, source); }\", style: { layout_flexBasisPercent: 1 } },\n  { title: '频道切换', type: 'select', chars: Object.keys(channels), default: currentChannel, action: \"var c=infoMap['频道切换']; var obj={}; try{obj=JSON.parse(source.getVariable());}catch(e){} obj.channel=c; source.setVariable(JSON.stringify(obj)); java.refreshExplore(); java.toast('已切换到: '+c);\", style: { layout_flexBasisPercent: 1 } }\n];\n\nfunction pushTag(group, name, urlStr) {\n  ui.push({ title: name, url: urlStr, style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.2 } });\n}\n\nvar sorts = [{name: \"按最新\", val: \"time\"}, {name: \"按最热\", val: \"hits\"}, {name: \"按评分\", val: \"score\"}];\nui.push({ title: '👇 【排行榜】', url: '', style: { layout_flexBasisPercent: 1, layout_flexGrow: 1 } });\nsorts.forEach(function(s) {\n  var apiBody = \"type=\"+cid+\"&class=&area=&year=&lang=&letter=&by=\"+s.val+\"&page={{page}}\";\n  var apiUrl = host + \"/index.php/ds_api/vod,{\\\"method\\\":\\\"POST\\\",\\\"body\\\":\\\"\" + apiBody + \"\\\"}\";\n  pushTag(\"排行\", s.name, apiUrl);\n});\n\nui.push({ title: '👇 【按类型】', url: '', style: { layout_flexBasisPercent: 1, layout_flexGrow: 1 } });\n(filters[\"类型\"][cid] || []).forEach(function(c) {\n  var cPath = c === \"全部\" ? \"\" : encodeURIComponent(c);\n  var apiBody = \"type=\"+cid+\"&class=\"+cPath+\"&area=&year=&lang=&letter=&by=time&page={{page}}\";\n  var apiUrl = host + \"/index.php/ds_api/vod,{\\\"method\\\":\\\"POST\\\",\\\"body\\\":\\\"\" + apiBody + \"\\\"}\";\n  pushTag(\"类型\", c, apiUrl);\n});\n\nui.push({ title: '👇 【按地区】', url: '', style: { layout_flexBasisPercent: 1, layout_flexGrow: 1 } });\n(filters[\"地区\"][cid] || []).forEach(function(a) {\n  var aPath = a === \"全部\" ? \"\" : encodeURIComponent(a);\n  var apiBody = \"type=\"+cid+\"&class=&area=\"+aPath+\"&year=&lang=&letter=&by=time&page={{page}}\";\n  var apiUrl = host + \"/index.php/ds_api/vod,{\\\"method\\\":\\\"POST\\\",\\\"body\\\":\\\"\" + apiBody + \"\\\"}\";\n  pushTag(\"地区\", a, apiUrl);\n});\n\nui.push({ title: '👇 【按年份】', url: '', style: { layout_flexBasisPercent: 1, layout_flexGrow: 1 } });\n(filters[\"年份\"][cid] || []).forEach(function(y) {\n  var yPath = y === \"全部\" ? \"\" : y;\n  var apiBody = \"type=\"+cid+\"&class=&area=&year=\"+yPath+\"&lang=&letter=&by=time&page={{page}}\";\n  var apiUrl = host + \"/index.php/ds_api/vod,{\\\"method\\\":\\\"POST\\\",\\\"body\\\":\\\"\" + apiBody + \"\\\"}\";\n  pushTag(\"年份\", y, apiUrl);\n});\n\nui.push({ title: '👇 【按语言】', url: '', style: { layout_flexBasisPercent: 1, layout_flexGrow: 1 } });\n(filters[\"语言\"][cid] || []).forEach(function(l) {\n  var lPath = l === \"全部\" ? \"\" : encodeURIComponent(l);\n  var apiBody = \"type=\"+cid+\"&class=&area=&year=&lang=\"+lPath+\"&letter=&by=time&page={{page}}\";\n  var apiUrl = host + \"/index.php/ds_api/vod,{\\\"method\\\":\\\"POST\\\",\\\"body\\\":\\\"\" + apiBody + \"\\\"}\";\n  pushTag(\"语言\", l, apiUrl);\n});\n\nJSON.stringify(ui);\n</js>", "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\"}", "lastUpdateTime": "1794503658460", "respondTime": 2558, "ruleBookInfo": {"author": "meta[property=og:novel:author]@content || .slide-info:matches(演员) a@text || .slide-info:contains(演员) a@text", "coverUrl": ".detail-pic img@data-src##^(?!https?://image\\.baidu\\.com/).*?(/upload/vod/[A-Za-z0-9_./-]+?\\.(?:jpg|jpeg|png|webp|gif)).*$##https://fffgood.com$1", "intro": "meta[property=og:description]@content || #height_limit@text || .text.cor3@text", "kind": "meta[property=og:novel:category]@content || .slide-info:matches(类型) a@text || .slide-info:contains(类型) a@text", "lastChapter": "meta[property=og:novel:latest_chapter_name]@content || .slide-info-remarks:nth-of-type(1)@text || .slide-info-remarks:eq(0)@text", "name": "meta[property=og:novel:book_name]@content || h3.slide-info-title@text"}, "ruleContent": {"content": "@js:\n(function(){\n  var TBL = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\n  // 纯 JS base64 解码：解码结果是 %xx 形式的 ASCII，String.fromCharCode 足够\n  function b64(s){\n    s = String(s).replace(/[^A-Za-z0-9+/]/g, '');\n    var out = '', i = 0, a, b, c, dd, e;\n    while (i + 1 < s.length){\n      a = TBL.indexOf(s.charAt(i++));\n      b = TBL.indexOf(s.charAt(i++));\n      c  = i < s.length ? TBL.indexOf(s.charAt(i++)) : -1;\n      dd = i < s.length ? TBL.indexOf(s.charAt(i++)) : -1;\n      e = (a << 18) | (b << 12) | ((c < 0 ? 0 : c) << 6) | (dd < 0 ? 0 : dd);\n      out += String.fromCharCode((e >>> 16) & 255);\n      if (c  >= 0) out += String.fromCharCode((e >>> 8) & 255);\n      if (dd >= 0) out += String.fromCharCode(e & 255);\n    }\n    return out;\n  }\n\n  var h = '';\n  try { h = String(result || ''); } catch(err) { return ''; }\n\n  // 平衡括号提取 var player_aaaa={...}，避免 split('</script>') 在别的页面被截断\n  var p = h.indexOf('var player_aaaa=');\n  if (p < 0) return '';\n  var st = h.indexOf('{', p);\n  if (st < 0) return '';\n  var dep = 0, ins = false, esc = false, en = -1;\n  for (var j = st; j < h.length; j++){\n    var ch = h.charAt(j);\n    if (ins){\n      if (esc) esc = false;\n      else if (ch === '\\\\') esc = true;\n      else if (ch === '\"') ins = false;\n    } else {\n      if (ch === '\"') ins = true;\n      else if (ch === '{') dep++;\n      else if (ch === '}') { dep--; if (dep === 0) { en = j; break; } }\n    }\n  }\n  if (en < 0) return '';\n\n  var data;\n  try { data = JSON.parse(h.substring(st, en + 1)); } catch(err2) { return ''; }\n  var u = String(data.url || '');\n  if (!u) return '';\n\n  var enc = Number(data.encrypt || 0);\n  if (enc === 2){\n    try { u = decodeURIComponent(b64(u)); } catch(err3) { u = b64(u); }\n  } else if (enc === 1){\n    try { u = decodeURIComponent(u); } catch(err4) {}\n  }\n  return u.replace(/\\\\\\//g, '/');\n})()"}, "ruleExplore": {"author": "$.vod_actor", "bookList": "$.list", "bookUrl": "$.url", "coverUrl": "$.vod_pic##^(?!https?://image\\.baidu\\.com/).*?(/upload/vod/[A-Za-z0-9_./-]+?\\.(?:jpg|jpeg|png|webp|gif)).*$##https://fffgood.com$1", "intro": "$.vod_blurb", "kind": "$.vod_tag##<[^>]+>", "lastChapter": "$.vod_remarks", "name": "$.vod_name"}, "ruleSearch": {"author": ".slide-info:contains(演员) a@text", "bookList": ".search-list .flex.rel.overflow", "bookUrl": "a[href*=/voddetail/]@href", "coverUrl": "img@data-src##^(?!https?://image\\.baidu\\.com/).*?(/upload/vod/[A-Za-z0-9_./-]+?\\.(?:jpg|jpeg|png|webp|gif)).*$##https://fffgood.com$1", "kind": ".slide-info:contains(类型) a@text", "lastChapter": ".slide-info-remarks:eq(0)@text", "name": "h3.slide-info-title@text"}, "ruleToc": {"chapterList": ".anthology-list-play li a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "https://www.netflixgc.com/vodsearch/-------------.html?wd={{key}}", "weight": 0},{"bookSourceUrl": "https://jiuxiaozw.com", "bookSourceName": "九霄中文网", "bookSourceGroup": "小说", "bookSourceType": 0, "bookSourceComment": "九霄中文网 jiuxiaozw.com\n· 书库 1700 多本，以热门连载和完结作品为主，每天更新\n· 免登录、无验证码，支持搜索书名和作者\n· 发现页：周榜｜月榜｜最近更新｜完结｜七个题材分类\n· 目录每页 2048 章，长篇也能很快加载完\n· 已设置并发限制（每秒 3 次），请勿调高，以免被网站限流", "enabled": true, "enabledExplore": true, "enabledCookieJar": false, "concurrentRate": "3/1000", "customOrder": 0, "weight": 0, "respondTime": 180000, "lastUpdateTime": "1794487793152", "searchUrl": "/api/books?q={{key}}&limit=20&page={{page}}", "ruleSearch": {"bookList": "$[*]", "name": "$.title", "author": "$.author", "intro": "$.description", "kind": "{{$.category}},{{$.status}}", "lastChapter": "$.latestChapter", "updateTime": "$.lastUpdated", "coverUrl": "$.cover_image", "bookUrl": "/api/books/{{$.id}}/detail"}, "exploreUrl": "周榜::/api/books?orderBy=weekly_views&order=desc&limit=20&page={{page}}\n月榜::/api/books?orderBy=monthly_views&order=desc&limit=20&page={{page}}\n最近更新::/api/books?orderBy=updatedAt&order=desc&limit=20&page={{page}}\n完结::/api/books?status=完结&orderBy=views&order=desc&limit=20&page={{page}}\n玄幻::/api/books?category=玄幻&orderBy=weekly_views&order=desc&limit=20&page={{page}}\n仙侠::/api/books?category=仙侠&orderBy=weekly_views&order=desc&limit=20&page={{page}}\n都市::/api/books?category=都市&orderBy=weekly_views&order=desc&limit=20&page={{page}}\n历史::/api/books?category=历史&orderBy=weekly_views&order=desc&limit=20&page={{page}}\n科幻::/api/books?category=科幻&orderBy=weekly_views&order=desc&limit=20&page={{page}}\n轻小说::/api/books?category=轻小说&orderBy=weekly_views&order=desc&limit=20&page={{page}}\n诸天无限::/api/books?category=诸天无限&orderBy=weekly_views&order=desc&limit=20&page={{page}}", "ruleExplore": {"bookList": "$[*]", "name": "$.title", "author": "$.author", "intro": "$.description", "kind": "{{$.category}},{{$.status}}", "lastChapter": "$.latestChapter", "updateTime": "$.lastUpdated", "coverUrl": "$.cover_image", "bookUrl": "/api/books/{{$.id}}/detail"}, "ruleBookInfo": {"name": "$.book.title", "author": "$.book.author", "intro": "$.book.description", "kind": "{{$.book.category}},{{$.book.status}}", "lastChapter": "$.book.latestChapter", "updateTime": "$.book.lastUpdated", "wordCount": "$.totalWords", "coverUrl": "$.book.cover_image", "tocUrl": "/api/books/{{$.book.id}}/catalog?offset=0&limit=2048"}, "ruleToc": {"chapterList": "$.rows[*]", "chapterName": "@js:var t=String(java.getString(\"$.title\")).trim();var n=java.getString(\"$.chapter_number\");!t?\"第\"+n+\"章\":/^第|第.+章|感言|同人|请假|通知|单章|说明|番外|新书|设定|总结|推书|月票|推荐票|求票|抽奖|上架|假条|完本|停更|断更|爆更|后记|作品相关|^(?:献词|序幕|序章|序言|序曲|楔子|引子|尾声)(?![一-龥])/.test(t)?t:\"第\"+n+\"章 \"+t", "chapterUrl": "/api/chapters/{{$.id}}", "nextTocUrl": "@js:var t=parseInt(java.getString(\"$.total\"));var o=parseInt(java.getString(\"$.offset\"));var n=o+2048;n<t?String(baseUrl).replace(/offset=\\d+/,\"offset=\"+n):\"\""}, "ruleContent": {"content": "$.content"}},{"bookSourceUrl": "https://jiuxiaozw.com", "bookSourceName": "九霄中文网", "bookSourceGroup": "小说", "bookSourceType": 0, "bookSourceComment": "九霄中文网 jiuxiaozw.com\n· 书库 1700 多本，以热门连载和完结作品为主，每天更新\n· 免登录、无验证码，支持搜索书名和作者\n· 发现页：周榜｜月榜｜最近更新｜完结｜七个题材分类\n· 目录每页 2048 章，长篇也能很快加载完\n· 已设置并发限制（每秒 3 次），请勿调高，以免被网站限流", "enabled": true, "enabledExplore": true, "enabledCookieJar": false, "concurrentRate": "3/1000", "customOrder": 0, "weight": 0, "respondTime": 180000, "lastUpdateTime": "1794486209188", "searchUrl": "/api/books?q={{key}}&limit=20&page={{page}}", "ruleSearch": {"bookList": "$[*]", "name": "$.title", "author": "$.author", "intro": "$.description", "kind": "{{$.category}},{{$.status}}", "updateTime": "$.lastUpdated", "coverUrl": "$.cover_image", "bookUrl": "/api/books/{{$.id}}/detail"}, "exploreUrl": "周榜::/api/books?orderBy=weekly_views&order=desc&limit=20&page={{page}}\n月榜::/api/books?orderBy=monthly_views&order=desc&limit=20&page={{page}}\n最近更新::/api/books?orderBy=updatedAt&order=desc&limit=20&page={{page}}\n完结::/api/books?status=完结&orderBy=views&order=desc&limit=20&page={{page}}\n玄幻::/api/books?category=玄幻&orderBy=weekly_views&order=desc&limit=20&page={{page}}\n仙侠::/api/books?category=仙侠&orderBy=weekly_views&order=desc&limit=20&page={{page}}\n都市::/api/books?category=都市&orderBy=weekly_views&order=desc&limit=20&page={{page}}\n历史::/api/books?category=历史&orderBy=weekly_views&order=desc&limit=20&page={{page}}\n科幻::/api/books?category=科幻&orderBy=weekly_views&order=desc&limit=20&page={{page}}\n轻小说::/api/books?category=轻小说&orderBy=weekly_views&order=desc&limit=20&page={{page}}\n诸天无限::/api/books?category=诸天无限&orderBy=weekly_views&order=desc&limit=20&page={{page}}", "ruleExplore": {"bookList": "$[*]", "name": "$.title", "author": "$.author", "intro": "$.description", "kind": "{{$.category}},{{$.status}}", "updateTime": "$.lastUpdated", "coverUrl": "$.cover_image", "bookUrl": "/api/books/{{$.id}}/detail"}, "ruleBookInfo": {"name": "$.book.title", "author": "$.book.author", "intro": "$.book.description", "kind": "{{$.book.category}},{{$.book.status}}", "lastChapter": "$.chapters[0].title", "updateTime": "$.book.lastUpdated", "wordCount": "$.totalWords", "coverUrl": "$.book.cover_image", "tocUrl": "/api/books/{{$.book.id}}/catalog?offset=0&limit=2048"}, "ruleToc": {"chapterList": "$.rows[*]", "chapterName": "$.title", "chapterUrl": "/api/chapters/{{$.id}}", "nextTocUrl": "@js:var t=parseInt(java.getString(\"$.total\"));var o=parseInt(java.getString(\"$.offset\"));var n=o+2048;n<t?String(baseUrl).replace(/offset=\\d+/,\"offset=\"+n):\"\""}, "ruleContent": {"content": "$.content"}},{"bookSourceComment": "v7：修复登录面板在真机报 TypeError: java.lang.reflect.Array.newInstance 不是函数（改用 BufferedReader 文本流读法，规则层同步去掉 byte[] 创建）；测速判据放宽为「有实质响应即通」；恢复「检查登录状态」并升级为线路自检按钮（显示版本/字节数/是否盾页/影片链接数）。线路仍从发布页动态获取、测速不自动切换。", "bookSourceGroup": "影视频源 🎬", "bookSourceName": "▶ OmoFun 动漫", "bookSourceType": 4, "bookSourceUrl": "https://www.omofuns.com", "bookUrlPattern": "https?://[^/]+/anime/[0-9a-f]{24}\\.html", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:(function(){\nvar UA='Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n// 默认兜底线路（与发布页当前 4 条一致）；实际线路来自登录面板「一键从发布页获取」写入的 om_lines\nvar DEF_LINES=['https://www.omofuns.com','https://cn.233dm.com','https://cn.211dm.com','https://cn.agekkkk.com'];\nfunction lines(){\n  var raw=SV('om_lines'),a=null;\n  if(raw){try{a=JSON.parse(String(raw));}catch(e){a=null;}}\n  if(a&&a.length){\n    var r=[],seen={};\n    for(var i=0;i<a.length;i++){\n      var u=(typeof a[i]==='string')?a[i]:(a[i]&&a[i].u?String(a[i].u):'');\n      u=String(u).replace(/\\/+$/,'');\n      if(u.indexOf('https://')===0&&u.indexOf('fb.omoo')<0&&!seen[u]){seen[u]=1;r.push(u);}\n    }\n    if(r.length)return r;\n  }\n  // 兼容旧书源遗留的 om_sn / om_s1..8\n  var n=parseInt(SV('om_sn'),10)||0,r2=[];\n  for(var j=1;j<=n&&j<=8;j++){var v=SV('om_s'+j).replace(/\\/+$/,'');if(v.indexOf('https://')===0)r2.push(v);}\n  if(r2.length)return r2;\n  return DEF_LINES;\n}\nvar K=[78,63,169,194,18,125,136,239,85,170,11,205,222,173,190,239];\nfunction S(v){try{var s=String(v==null?'':v);return (s==='null'||s==='undefined'||s==='[object Object]'||s==='JsNull')?'':s;}catch(e){return '';}}\nfunction SV(k){try{return S(source.get(k));}catch(e){return '';}}\nfunction sub(k,v){try{source.put(k,String(v));}catch(e){}}\nfunction curLine(){var c=SV('om_line').replace(/\\/+$/,''),a=lines();if(c.indexOf('https://')===0&&c.indexOf('fb.omoo')<0){for(var i=0;i<a.length;i++)if(a[i]===c)return c;if(c===SV('om_custom').replace(/\\/+$/,''))return c;}return a[0];}\nfunction hostOf(u){var s=String(u==null?'':u),m=/^https?:\\/\\/([^\\/]+)/.exec(s);if(!m)return '';var hn=m[1],a=lines();for(var i=0;i<a.length;i++){if(a[i].replace(/^https?:\\/\\//,'')===hn)return a[i];}if(s.indexOf('https://')===0)return 'https://'+hn;return '';}\nfunction ord(){var c=curLine(),a=lines(),r=[c];for(var i=0;i<a.length;i++){if(a[i]!==c)r.push(a[i]);}return r;}\nfunction gt(h){h=String(h==null?'':h);if(!h)return true;return h.indexOf('\\u7cfb\\u7edf\\u5b89\\u5168\\u9a8c\\u8bc1')>=0||h.indexOf('verify_check')>=0;}\nfunction okPage(h){h=String(h==null?'':h);if(!h||h.length<8000)return false;if(gt(h))return false;return true;}\nfunction b64(s){var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',o='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i)&255,b=i+1<s.length?s.charCodeAt(i+1)&255:null,c=i+2<s.length?s.charCodeAt(i+2)&255:null,n=(a<<16)|((b||0)<<8)|(c||0);o+=t.charAt((n>>18)&63)+t.charAt((n>>12)&63)+(b===null?'=':t.charAt((n>>6)&63))+(c===null?'=':t.charAt(n&63));}return o;}\nfunction tk(){var ts=String(Date.now()),p='';for(var i=0;i<ts.length;i++)p+=String.fromCharCode(ts.charCodeAt(i)^K[i%16]);return b64(p);}\nfunction b64b(s){\n  // 用 ByteArrayOutputStream 生成 byte[]，避开反射建数组的高危 API\n  // （Legado 登录面板/部分真机环境里该 Class 会被解析成 JavaPackage 而非类）\n  var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n  var bos=new Packages.java.io.ByteArrayOutputStream(),buf=0,bits=0,i,ch,v;\n  for(i=0;i<s.length;i++){\n    ch=s.charAt(i);\n    if(ch==='='||ch==='\\n'||ch==='\\r'||ch===' ')continue;\n    v=t.indexOf(ch);\n    if(v<0)continue;\n    buf=((buf<<6)|v)&0x3FFFFF;bits+=6;\n    if(bits>=8){bits-=8;bos.write((buf>>bits)&255);}\n  }\n  return bos.toByteArray();\n}\nfunction hk(b){var m=/^https?:\\/\\/([^\\/]+)/.exec(String(b||''));return m?('om_ck_'+m[1]):'om_ck_x';}\nfunction rdCk(b){return SV(hk(b));}\nfunction wrCk(b,sc){if(!sc)return;var parts=String(sc).split(';');var kv=parts[0];if(kv&&kv.indexOf('=')>0){var old=rdCk(b),name=kv.split('=')[0];var keep=[];if(old){var o=old.split(';');for(var i=0;i<o.length;i++){var p=String(o[i]).replace(/^\\s+/,'');if(p&&p.split('=')[0]!==name)keep.push(p);}}keep.push(kv);sub(hk(b),keep.join('; '));}}\nfunction TXT(c){\n  // 文本流读法：InputStream -> (gzip 则包 GZIPInputStream) -> BufferedReader 逐行。\n  // 全程不创建 Java byte[]，避开反射建数组的高危 API。\n  var is=c.getInputStream();\n  try{\n    var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);\n  }catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\n// 最后一次重试用：跳过 SSL 证书/主机名校验（应对被劫持的线路或自签播放器证书）\nfunction looseSSL(c){\n  // 最后一次重试兜底：只跳过主机名校验（足以应对 CN=*.10086.cn 这类劫持证书）。\n  // 不再自建 TrustManager[] —— 那需要反射创建 Java 数组，真机会崩。\n  try{\n    var hv=new JavaAdapter(Packages.javax.net.ssl.HostnameVerifier,{verify:function(a,b){return true;}});\n    c.setHostnameVerifier(hv);\n  }catch(e){}\n}\nfunction REQ(url,method,body,ck,loose){\n  var out={code:0,h:'',sc:''};\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod(method||'GET');\n    c.setConnectTimeout(8000);c.setReadTimeout(15000);\n    c.setInstanceFollowRedirects(true);\n    if(loose)looseSSL(c);\n    c.setRequestProperty('User-Agent',UA);\n    c.setRequestProperty('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    if(ck)c.setRequestProperty('Cookie',String(ck));\n    if(body!=null){c.setDoOutput(true);c.setRequestProperty('Content-Type','application/x-www-form-urlencoded');var os=c.getOutputStream();os.write(new Packages.java.lang.String(String(body)).getBytes('UTF-8'));os.flush();os.close();}\n    out.code=c.getResponseCode();\n    try{out.h=TXT(c);}catch(e1){out.h='';}\n    try{var v=c.getHeaderFields().get('Set-Cookie');if(v){var t=[];for(var i=0;i<v.size();i++)t.push(String(v.get(i)));out.sc=t.join(';');}}catch(e2){}\n  }catch(e){out.h='';out.err=String(e);}\n  return out;\n}\nfunction pass(b){\n  try{\n    var r=REQ(b+'/index.php/ajax/verify_check?type=search','POST','i='+encodeURIComponent(tk()),rdCk(b));\n    wrCk(b,r.sc);\n    var s=String(r.h||'');\n    return s.indexOf('\"code\":1')>=0||s.indexOf('\"code\": 1')>=0;\n  }catch(e){return false;}\n}\nfunction G1(b,p){var r=REQ(b+p,'GET',null,rdCk(b));wrCk(b,r.sc);return String(r.h||'');}\nfunction fetch(b,p){\n  var h=G1(b,p);\n  if(okPage(h))return h;\n  for(var i=0;i<2;i++){\n    if(!pass(b))break;\n    try{Packages.java.lang.Thread.sleep(400);}catch(e){}\n    h=G1(b,p);\n    if(okPage(h))break;\n  }\n  return h;\n}\nfunction pick(p){\n  var a=ord(),last='';\n  for(var i=0;i<a.length;i++){\n    var h=fetch(a[i],p);\n    if(okPage(h)){if(a[i]!==curLine())sub('om_line',a[i]);return{h:h,b:a[i]};}\n    last=h;\n  }\n  return{h:last,b:a[0]};\n}\nfunction pth(u){var s=String(u==null?'':u),m=/^https?:\\/\\/[^\\/]+(\\/[^\\s]*)?$/.exec(s);return m?(m[1]||'/'):'/';}\nfunction abs(b,u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('http')===0)return u;if(u.indexOf('//')===0)return 'https:'+u;if(u.charAt(0)==='/')return b+u;return b+'/'+u;}\nfunction pic(u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('//')===0)return 'https:'+u;if(u.indexOf('http')===0){if(u.replace(/\\/+$/,'')==='https://as.cfhls.top')return '';return u;}if(u.charAt(0)==='/')return 'https://as.cfhls.top'+u;return u;}\nfunction Jp(h){try{return Packages.org.jsoup.Jsoup.parse(String(h||''));}catch(e){return null;}}\nfunction txt(e){try{return e?String(e.text()).trim():'';}catch(x){return '';}}\nfunction attr(e,n){try{return e?String(e.attr(n)||'').trim():'';}catch(x){return '';}}\nfunction first(d,sel){try{var e=d.select(sel);return e&&e.size()>0?e.get(0):null;}catch(x){return null;}}\nfunction parseList(h,b){\n  var out=[],seen={};\n  if(!h||gt(h))return out;\n  var d=Jp(h);if(!d)return out;\n  var as=null;\n  try{as=d.select('a[href*=/anime/]');}catch(e1){return out;}\n  if(!as)return out;\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);var u=attr(a,'href');\n    if(u.indexOf('/anime/')<0||u.indexOf('.html')<0)continue;\n    if(u.indexOf('/play/')>=0)continue;\n    var n=attr(a,'title');if(!n)n=txt(a);\n    if(!n||n.length>60)continue;\n    // 无封面不再跳过条目：隐藏轮播 banner 只有图床根路径背景，coverUrl 留空即可，\n    // 详情页规则会自动补封面。若同 URL 已有条目且旧的无封面、新的有封面，则用新的替换。\n    var p1=attr(a,'data-original');\n    if(!p1){var im=first(a,'img');if(im){p1=attr(im,'data-original')||attr(im,'src');}}\n    p1=pic(p1);\n    var old=seen[u];\n    if(old){\n      if(p1){var prev=null;try{prev=JSON.parse(out[old-1]);}catch(e8){}\n        if(prev&&!prev.coverUrl){\n          var kind2=prev.kind||'',last2=prev.lastChapter||'';\n          var li2=null;try{li2=a.parent();}catch(e9){}\n          var g2=0;while(li2&&g2++<4){var tg2='';try{tg2=String(li2.tagName());}catch(e10){}if(String(tg2).toLowerCase()==='li')break;try{li2=li2.parent();}catch(e11){li2=null;break;}}\n          if(li2){var bs2=null;try{bs2=li2.select('span b');}catch(e12){}if(bs2&&bs2.size()>=2){kind2=txt(bs2.get(0));last2=txt(bs2.get(bs2.size()-1));}}\n          out[old-1]=JSON.stringify({name:prev.name,bookUrl:prev.bookUrl,coverUrl:p1,kind:kind2,lastChapter:last2});\n        }\n      }\n      continue;\n    }\n    var kind='',last='';var li=null;try{li=a.parent();}catch(e4){}\n    var g=0;\n    while(li&&g++<4){var tg='';try{tg=String(li.tagName());}catch(e5){}if(String(tg).toLowerCase()==='li')break;try{li=li.parent();}catch(e6){li=null;break;}}\n    if(li){var bs=null;try{bs=li.select('span b');}catch(e7){}\n      if(bs&&bs.size()>=2){kind=txt(bs.get(0));last=txt(bs.get(bs.size()-1));}}\n    seen[u]=out.length+1;\n    out.push(JSON.stringify({name:n,bookUrl:abs(b,u),coverUrl:p1,kind:kind,lastChapter:last}));\n  }\n  return out;\n}\nfunction arr(list,out){try{var l=new Packages.java.util.ArrayList();for(var i=0;i<out.length;i++)l.add(out[i]);return l;}catch(e){return out;}}\n\nvar b=curLine();\nvar rows=[\n {title:'\\ud83d\\udcfa \\u9996\\u9875\\u63a8\\u8350',url:b+'/'},\n {title:'\\ud83d\\uddd3 \\u65b0\\u756a\\u8868\\uff08\\u5468\\u66f4\\uff09',url:b+'/week/'},\n {title:'\\ud83d\\udd25 \\u4eca\\u65e5\\u70ed\\u64ad',url:b+'/dayhot/'},\n {title:'\\ud83c\\uddef\\ud83c\\uddf5 \\u65e5\\u6f2b',url:b+'/type/1-{{page}}.html'},\n {title:'\\ud83c\\udde8\\ud83c\\uddf3 \\u56fd\\u6f2b',url:b+'/type/2-{{page}}.html'},\n {title:'\\ud83c\\udfac \\u52a8\\u753b',url:b+'/type/5-{{page}}.html'},\n {title:'\\ud83c\\udf9e \\u5267\\u573a\\u7248',url:b+'/type/24-{{page}}.html'},\n {title:'\\ud83e\\uddb8 \\u7279\\u6444',url:b+'/type/4-{{page}}.html'},\n {title:'\\ud83c\\uddfa\\ud83c\\uddf8 \\u7f8e\\u6f2b',url:b+'/type/3-{{page}}.html'}\n];\nreturn JSON.stringify(rows);\n})()", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1794476852786", "loginCheckJs": "(function(){ try { return result || ''; } catch(e) { return ''; } })()", "loginUi": "[{\"key\": \"om_status\", \"type\": \"text\", \"name\": \"当前状态\", \"viewName\": \"OM_status(source)\", \"hint\": \"切换线路后点右上角 √ 保存\"}, {\"key\": \"om_pub\", \"type\": \"text\", \"name\": \"发布页网址\", \"hint\": \"默认 https://fb.omoo.tv/ ，发布页改版/换镜像时在此修改\", \"defaultValue\": \"https://fb.omoo.tv/\"}, {\"key\": \"om_btn_get\", \"type\": \"button\", \"name\": \"🔄 一键从发布页获取网址路线\", \"action\": \"OM_actGet(java,source)\"}, {\"key\": \"om_btn_speed\", \"type\": \"button\", \"name\": \"⚡ 测试延时（只显示结果，不自动切换）\", \"action\": \"OM_actSpeed(java,source)\"}, {\"key\": \"om_btn_check\", \"type\": \"button\", \"name\": \"🔍 检查登录状态 / 自检当前线路\", \"action\": \"OM_actCheck(java,source)\"}, {\"key\": \"om_btn_line1\", \"type\": \"button\", \"name\": \"线路 1\", \"viewName\": \"OM_label(source,0)\", \"action\": \"OM_actSet(java,source,0)\"}, {\"key\": \"om_btn_line2\", \"type\": \"button\", \"name\": \"线路 2\", \"viewName\": \"OM_label(source,1)\", \"action\": \"OM_actSet(java,source,1)\"}, {\"key\": \"om_btn_line3\", \"type\": \"button\", \"name\": \"线路 3\", \"viewName\": \"OM_label(source,2)\", \"action\": \"OM_actSet(java,source,2)\"}, {\"key\": \"om_btn_line4\", \"type\": \"button\", \"name\": \"线路 4\", \"viewName\": \"OM_label(source,3)\", \"action\": \"OM_actSet(java,source,3)\"}, {\"key\": \"om_btn_line5\", \"type\": \"button\", \"name\": \"线路 5\", \"viewName\": \"OM_label(source,4)\", \"action\": \"OM_actSet(java,source,4)\"}, {\"key\": \"om_btn_line6\", \"type\": \"button\", \"name\": \"线路 6\", \"viewName\": \"OM_label(source,5)\", \"action\": \"OM_actSet(java,source,5)\"}, {\"key\": \"om_btn_line7\", \"type\": \"button\", \"name\": \"线路 7\", \"viewName\": \"OM_label(source,6)\", \"action\": \"OM_actSet(java,source,6)\"}, {\"key\": \"om_btn_line8\", \"type\": \"button\", \"name\": \"线路 8\", \"viewName\": \"OM_label(source,7)\", \"action\": \"OM_actSet(java,source,7)\"}, {\"key\": \"om_custom\", \"type\": \"text\", \"name\": \"自定义线路\", \"hint\": \"填 https:// 开头的完整域名\"}, {\"key\": \"om_btn_custom\", \"type\": \"button\", \"name\": \"➡ 切换到自定义线路\", \"action\": \"OM_custom(java,source)\"}, {\"key\": \"om_btn_reset\", \"type\": \"button\", \"name\": \"↩ 恢复默认线路\", \"action\": \"OM_reset(java,source)\"}]", "loginUrl": "<js>\nfunction login(){}\nvar OM_DEF=['https://www.omofuns.com','https://cn.233dm.com','https://cn.211dm.com','https://cn.agekkkk.com'];\nvar OM_PUB='https://fb.omoo.tv/';\nvar OM_UA='Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\nfunction OM_g(v){var x=String(v===undefined||v===null?'':v);return (x==='null'||x==='undefined'||x==='JsNull'||x==='[object Object]')?'':x;}\nfunction OM_pub(sv){var v=OM_g(sv.get('om_pub')).replace(/\\/+$/,'');return v.indexOf('http')===0?v:OM_PUB;}\nfunction OM_toast(jv,m){try{jv.toast(m);return;}catch(e){}try{jv.longToast(m);}catch(e2){}}\n\n// 纯 JS base64 解码（Latin-1，线路 URL 均为 ASCII）\nfunction OM_b64d(s){\n  var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',o='',buf=0,bits=0,i,v;\n  for(i=0;i<s.length;i++){\n    var ch=s.charAt(i);if(ch==='='||ch==='\\n'||ch==='\\r'||ch===' ')continue;\n    v=t.indexOf(ch);if(v<0)continue;\n    buf=((buf<<6)|v)&0xFFFFFF;bits+=6;\n    if(bits>=8){bits-=8;o+=String.fromCharCode((buf>>bits)&255);}\n  }\n  return o;\n}\n\n// 原生 HttpURLConnection：发布页 / 线路探活共用，绝不调用 java.ajax（真机会 ClassCastException）\nfunction OM_GET(url){\n  var out={h:'',ms:0,ok:false,err:''},t0=Date.now();\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod('GET');c.setConnectTimeout(6000);c.setReadTimeout(10000);\n    c.setInstanceFollowRedirects(true);\n    c.setRequestProperty('User-Agent',OM_UA);\n    c.setRequestProperty('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    out.h=OM_TXT(c);\n    // 判据放宽：只要拿到实质响应就算「线路通」。安全验证页也是通的（过盾由规则层负责）。\n    out.ok=out.h.length>=1000;\n  }catch(e){out.err=String(e);}\n  out.ms=Date.now()-t0;return out;\n}\n// 文本流读法：不创建 Java byte[]，避开真机上会崩的反射建数组 API\nfunction OM_TXT(c){\n  var is=c.getInputStream();\n  try{\n    var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);\n  }catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\n\n// 从发布页混淆脚本里执行出 encodedLinks（脚本字符串已打散，纯正则取不到，必须 eval）\nfunction OM_fetchLines(jv,pub){\n  var r=OM_GET(pub);\n  if(!r.h)return{err:'\\u65e0\\u6cd5\\u8bfb\\u53d6\\u53d1\\u5e03\\u9875\\uff1a'+(r.err||'\\u7a7a\\u54cd\\u5e94')};\n  var re=/<script[^>]*>([\\s\\S]*?)<\\/script>/g,m,code='';\n  while((m=re.exec(r.h))!==null){if(m[1].indexOf('encodedLinks')>=0)code=m[1];}\n  if(!code)return{err:'\\u53d1\\u5e03\\u9875\\u672a\\u627e\\u5230\\u7ebf\\u8def\\u6570\\u7ec4\\uff08\\u7ed3\\u6784\\u53ef\\u80fd\\u5df2\\u53d8\\uff09'};\n  var encodedLinks=null;\n  try{\n    var window=this,document={\n      createElement:function(){return{style:{},setAttribute:function(){},appendChild:function(){},innerHTML:'',textContent:''};},\n      body:{appendChild:function(){}},getElementById:function(){return null;}\n    };\n    eval(code);\n  }catch(e){/* DOM 部分可能抛错，encodedLinks 通常已赋值 */}\n  if(!encodedLinks||!encodedLinks.length)return{err:'\\u7ebf\\u8def\\u6570\\u7ec4\\u4e3a\\u7a7a\\u6216\\u811a\\u672c\\u65e0\\u6cd5\\u6267\\u884c'};\n  var out=[],seen={};\n  for(var i=0;i<encodedLinks.length;i++){\n    var parts=String(encodedLinks[i]).split('|'),u='';\n    try{u=OM_b64d(parts[0]).replace(/\\/+$/,'');}catch(e2){}\n    if(u.indexOf('http')!==0||seen[u])continue;\n    seen[u]=1;\n    out.push({u:u,n:parts[1]||u.replace(/^https?:\\/\\//,'')});\n  }\n  if(!out.length)return{err:'\\u89e3\\u7801\\u540e\\u65e0\\u6709\\u6548\\u7ebf\\u8def'};\n  return{lines:out};\n}\n\nfunction OM_load(sv){\n  var raw=OM_g(sv.get('om_lines'));\n  if(raw){try{var a=JSON.parse(raw);if(a&&a.length)return a;}catch(e){}}\n  var r=[];for(var i=0;i<OM_DEF.length;i++)r.push({u:OM_DEF[i],n:OM_DEF[i].replace(/^https?:\\/\\//,'')});\n  return r;\n}\nfunction OM_save(sv,lines){\n  var n=Math.min(lines.length,8);\n  sv.put('om_lines',JSON.stringify(lines.slice(0,n)));\n  sv.put('om_line',lines[0].u);\n  for(var i=0;i<8;i++)sv.put('om_sp_'+i,'');\n  return n;\n}\nfunction OM_status(sv){\n  var arr=OM_load(sv),cur=OM_g(sv.get('om_line')).replace(/\\/+$/,''),idx=-1;\n  for(var i=0;i<arr.length;i++)if(arr[i].u===cur)idx=i;\n  return '\\u3010v7\\u3011\\u5f53\\u524d\\uff1a'+(cur||'\\u9ed8\\u8ba4')+(idx>=0?('\\uff08\\u7b2c'+(idx+1)+'\\u6761\\uff09'):'')\n    +' \\uff5c \\u53d1\\u5e03\\u9875\\uff1a'+OM_pub(sv)+' \\uff5c \\u5171 '+arr.length+' \\u6761';\n}\nfunction OM_label(sv,i){\n  var arr=OM_load(sv);\n  if(i>=arr.length)return '\\uff08\\u7a7a\\u4f4d '+(i+1)+'\\uff09';\n  var cur=OM_g(sv.get('om_line')).replace(/\\/+$/,''),sp=OM_g(sv.get('om_sp_'+i));\n  return (cur===arr[i].u?'\\u2714 ':'')+'\\u7ebf\\u8def'+(i+1)+' '+arr[i].n+(sp?('  '+sp):'');\n}\nfunction OM_actGet(jv,sv){\n  OM_toast(jv,'\\u23f3 \\u6b63\\u5728\\u8bfb\\u53d6\\u53d1\\u5e03\\u9875\\uff0c\\u8bf7\\u7a0d\\u5019\\u2026');\n  var res=OM_fetchLines(jv,OM_pub(sv));\n  if(res.err){OM_toast(jv,'\\u274c '+res.err+'\\uff1b\\u4e5f\\u53ef\\u5728\\u4e0b\\u65b9\\u586b\\u5199\\u81ea\\u5b9a\\u4e49\\u7ebf\\u8def');return;}\n  var n=OM_save(sv,res.lines);\n  OM_toast(jv,'\\u2705 \\u5df2\\u4ece\\u53d1\\u5e03\\u9875\\u83b7\\u53d6 '+n+' \\u6761\\u7ebf\\u8def\\uff0c\\u9ed8\\u8ba4\\u7b2c 1 \\u6761\\uff1b\\u8bf7\\u70b9\\u300c\\u6d4b\\u8bd5\\u5ef6\\u65f6\\u300d\\u540e\\u81ea\\u884c\\u70b9\\u9009');\n  try{jv.reLoginView();}catch(e){}\n}\nfunction OM_actSpeed(jv,sv){\n  var arr=OM_load(sv);\n  OM_toast(jv,'\\u23f3 \\u6b63\\u5728\\u6d4b\\u901f '+arr.length+' \\u6761\\u7ebf\\u8def\\uff0c\\u8bf7\\u7a0d\\u5019\\u2026');\n  var best=-1,bestMs=1e12;\n  for(var i=0;i<arr.length;i++){\n    var r=OM_GET(arr[i].u+'/');\n    sv.put('om_sp_'+i,r.ok?(r.ms+'ms'):('\\u4e0d\\u53ef\\u7528 '+r.ms+'ms'));\n    if(r.ok&&r.ms<bestMs){bestMs=r.ms;best=i;}\n  }\n  if(best>=0){\n    sv.put('om_sp_'+best,'\\u26a1'+bestMs+'ms');\n    OM_toast(jv,'\\u2705 \\u6d4b\\u901f\\u5b8c\\u6210\\uff0c\\u6700\\u5feb '+arr[best].n+' '+bestMs+'ms\\uff1b\\u70b9\\u5bf9\\u5e94\\u300c\\u7ebf\\u8def N\\u300d\\u6309\\u94ae\\u5373\\u53ef\\u5207\\u6362\\uff08\\u4e0d\\u4f1a\\u81ea\\u52a8\\u5207\\uff09');\n  }else{\n    OM_toast(jv,'\\u26a0 \\u5168\\u90e8\\u7ebf\\u8def\\u63a2\\u6d3b\\u672a\\u901a\\u8fc7\\uff0c\\u8bf7\\u68c0\\u67e5\\u7f51\\u7edc\\u6216\\u91cd\\u65b0\\u83b7\\u53d6\\u53d1\\u5e03\\u9875\\u7ebf\\u8def');\n  }\n  try{jv.reLoginView();}catch(e){}\n}\nfunction OM_actSet(jv,sv,i){\n  var arr=OM_load(sv);\n  if(i>=arr.length){OM_toast(jv,'\\u26a0 \\u8be5\\u7ebf\\u8def\\u4f4d\\u4e3a\\u7a7a\\uff0c\\u8bf7\\u5148\\u83b7\\u53d6\\u7ebf\\u8def');return;}\n  sv.put('om_line',arr[i].u);\n  var r=OM_GET(arr[i].u+'/');\n  OM_toast(jv,(r.ok?'\\u2705 \\u5df2\\u5207\\u6362 ':'\\u26a0 \\u5df2\\u5207\\u6362\\u4f46\\u63a2\\u6d3b\\u672a\\u901a\\u8fc7 ')+arr[i].n+'\\uff08'+r.ms+'ms\\uff09');\n  try{jv.reLoginView();}catch(e){}\n}\nfunction OM_custom(jv,sv){\n  var v=OM_g(sv.get('om_custom')).replace(/\\/+$/,'');\n  if(v.indexOf('https://')!==0){OM_toast(jv,'\\u26a0 \\u8bf7\\u586b https:// \\u5f00\\u5934\\u7684\\u5b8c\\u6574\\u57df\\u540d');return;}\n  sv.put('om_line',v);\n  OM_toast(jv,'\\u2705 \\u5df2\\u5207\\u6362\\u81ea\\u5b9a\\u4e49\\u7ebf\\u8def\\uff1a'+v);\n  try{jv.reLoginView();}catch(e){}\n}\nfunction OM_reset(jv,sv){\n  sv.put('om_lines','');sv.put('om_line',OM_DEF[0]);\n  for(var i=0;i<8;i++)sv.put('om_sp_'+i,'');\n  OM_toast(jv,'\\u21a9 \\u5df2\\u6062\\u590d\\u9ed8\\u8ba4 4 \\u6761\\u7ebf\\u8def\\uff1b\\u82e5\\u9700\\u6700\\u65b0\\u7ebf\\u8def\\u8bf7\\u70b9\\u300c\\u4e00\\u952e\\u4ece\\u53d1\\u5e03\\u9875\\u83b7\\u53d6\\u7f51\\u5740\\u8def\\u7ebf\\u300d');\n  try{jv.reLoginView();}catch(e){}\n}\nfunction OM_actCheck(jv,sv){\n  var arr=OM_load(sv),cur=OM_g(sv.get('om_line')).replace(/\\/+$/,'');\n  if(cur.indexOf('https://')!==0)cur=arr.length?arr[0].u:'';\n  if(!cur){OM_toast(jv,'\\u274c \\u7ebf\\u8def\\u6c60\\u4e3a\\u7a7a\\uff0c\\u8bf7\\u5148\\u70b9\\u300c\\u4e00\\u952e\\u4ece\\u53d1\\u5e03\\u9875\\u83b7\\u53d6\\u7f51\\u5740\\u8def\\u7ebf\\u300d');return;}\n  OM_toast(jv,'\\u23f3 \\u6b63\\u5728\\u81ea\\u68c0 '+cur.replace(/^https?:\\/\\//,'')+' \\u2026');\n  var r=OM_GET(cur+'/');\n  var shield=r.h.indexOf('\\u7cfb\\u7edf\\u5b89\\u5168\\u9a8c\\u8bc1')>=0||r.h.indexOf('verify_check')>=0;\n  var n=0;try{var mm=r.h.match(/\\/anime\\/[a-f0-9]{24}\\.html/g);n=mm?mm.length:0;}catch(e){}\n  var state=shield?'\\u26a0 \\u5b89\\u5168\\u9a8c\\u8bc1\\u9875\\uff08\\u89c4\\u5219\\u4f1a\\u81ea\\u52a8\\u8fc7\\u76fe\\uff09':(n>0?'\\u2705 \\u6b63\\u5e38\\u9875':'\\u26a0 \\u65e0\\u5f71\\u7247\\u94fe\\u63a5');\n  var msg='v7 \\u81ea\\u68c0\\uff5c'+cur.replace(/^https?:\\/\\//,'')+'\\uff5c'+r.h.length+' \\u5b57\\u8282\\uff5c'+state+'\\uff5c\\u5f71\\u7247 '+n+' \\u4e2a\\uff5c'+r.ms+'ms';\n  if(r.err)msg+='\\uff5c\\u9519\\u8bef\\uff1a'+String(r.err).substring(0,50);\n  OM_toast(jv,msg);\n  try{sv.put('om_lastcheck',msg);}catch(e2){}\n  try{jv.reLoginView();}catch(e3){}\n}\n</js>", "respondTime": 180000, "ruleBookInfo": {"author": "$.a", "coverUrl": "$.c", "init": "@js:(function(){\nvar UA='Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n// 默认兜底线路（与发布页当前 4 条一致）；实际线路来自登录面板「一键从发布页获取」写入的 om_lines\nvar DEF_LINES=['https://www.omofuns.com','https://cn.233dm.com','https://cn.211dm.com','https://cn.agekkkk.com'];\nfunction lines(){\n  var raw=SV('om_lines'),a=null;\n  if(raw){try{a=JSON.parse(String(raw));}catch(e){a=null;}}\n  if(a&&a.length){\n    var r=[],seen={};\n    for(var i=0;i<a.length;i++){\n      var u=(typeof a[i]==='string')?a[i]:(a[i]&&a[i].u?String(a[i].u):'');\n      u=String(u).replace(/\\/+$/,'');\n      if(u.indexOf('https://')===0&&u.indexOf('fb.omoo')<0&&!seen[u]){seen[u]=1;r.push(u);}\n    }\n    if(r.length)return r;\n  }\n  // 兼容旧书源遗留的 om_sn / om_s1..8\n  var n=parseInt(SV('om_sn'),10)||0,r2=[];\n  for(var j=1;j<=n&&j<=8;j++){var v=SV('om_s'+j).replace(/\\/+$/,'');if(v.indexOf('https://')===0)r2.push(v);}\n  if(r2.length)return r2;\n  return DEF_LINES;\n}\nvar K=[78,63,169,194,18,125,136,239,85,170,11,205,222,173,190,239];\nfunction S(v){try{var s=String(v==null?'':v);return (s==='null'||s==='undefined'||s==='[object Object]'||s==='JsNull')?'':s;}catch(e){return '';}}\nfunction SV(k){try{return S(source.get(k));}catch(e){return '';}}\nfunction sub(k,v){try{source.put(k,String(v));}catch(e){}}\nfunction curLine(){var c=SV('om_line').replace(/\\/+$/,''),a=lines();if(c.indexOf('https://')===0&&c.indexOf('fb.omoo')<0){for(var i=0;i<a.length;i++)if(a[i]===c)return c;if(c===SV('om_custom').replace(/\\/+$/,''))return c;}return a[0];}\nfunction hostOf(u){var s=String(u==null?'':u),m=/^https?:\\/\\/([^\\/]+)/.exec(s);if(!m)return '';var hn=m[1],a=lines();for(var i=0;i<a.length;i++){if(a[i].replace(/^https?:\\/\\//,'')===hn)return a[i];}if(s.indexOf('https://')===0)return 'https://'+hn;return '';}\nfunction ord(){var c=curLine(),a=lines(),r=[c];for(var i=0;i<a.length;i++){if(a[i]!==c)r.push(a[i]);}return r;}\nfunction gt(h){h=String(h==null?'':h);if(!h)return true;return h.indexOf('\\u7cfb\\u7edf\\u5b89\\u5168\\u9a8c\\u8bc1')>=0||h.indexOf('verify_check')>=0;}\nfunction okPage(h){h=String(h==null?'':h);if(!h||h.length<8000)return false;if(gt(h))return false;return true;}\nfunction b64(s){var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',o='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i)&255,b=i+1<s.length?s.charCodeAt(i+1)&255:null,c=i+2<s.length?s.charCodeAt(i+2)&255:null,n=(a<<16)|((b||0)<<8)|(c||0);o+=t.charAt((n>>18)&63)+t.charAt((n>>12)&63)+(b===null?'=':t.charAt((n>>6)&63))+(c===null?'=':t.charAt(n&63));}return o;}\nfunction tk(){var ts=String(Date.now()),p='';for(var i=0;i<ts.length;i++)p+=String.fromCharCode(ts.charCodeAt(i)^K[i%16]);return b64(p);}\nfunction b64b(s){\n  // 用 ByteArrayOutputStream 生成 byte[]，避开反射建数组的高危 API\n  // （Legado 登录面板/部分真机环境里该 Class 会被解析成 JavaPackage 而非类）\n  var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n  var bos=new Packages.java.io.ByteArrayOutputStream(),buf=0,bits=0,i,ch,v;\n  for(i=0;i<s.length;i++){\n    ch=s.charAt(i);\n    if(ch==='='||ch==='\\n'||ch==='\\r'||ch===' ')continue;\n    v=t.indexOf(ch);\n    if(v<0)continue;\n    buf=((buf<<6)|v)&0x3FFFFF;bits+=6;\n    if(bits>=8){bits-=8;bos.write((buf>>bits)&255);}\n  }\n  return bos.toByteArray();\n}\nfunction hk(b){var m=/^https?:\\/\\/([^\\/]+)/.exec(String(b||''));return m?('om_ck_'+m[1]):'om_ck_x';}\nfunction rdCk(b){return SV(hk(b));}\nfunction wrCk(b,sc){if(!sc)return;var parts=String(sc).split(';');var kv=parts[0];if(kv&&kv.indexOf('=')>0){var old=rdCk(b),name=kv.split('=')[0];var keep=[];if(old){var o=old.split(';');for(var i=0;i<o.length;i++){var p=String(o[i]).replace(/^\\s+/,'');if(p&&p.split('=')[0]!==name)keep.push(p);}}keep.push(kv);sub(hk(b),keep.join('; '));}}\nfunction TXT(c){\n  // 文本流读法：InputStream -> (gzip 则包 GZIPInputStream) -> BufferedReader 逐行。\n  // 全程不创建 Java byte[]，避开反射建数组的高危 API。\n  var is=c.getInputStream();\n  try{\n    var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);\n  }catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\n// 最后一次重试用：跳过 SSL 证书/主机名校验（应对被劫持的线路或自签播放器证书）\nfunction looseSSL(c){\n  // 最后一次重试兜底：只跳过主机名校验（足以应对 CN=*.10086.cn 这类劫持证书）。\n  // 不再自建 TrustManager[] —— 那需要反射创建 Java 数组，真机会崩。\n  try{\n    var hv=new JavaAdapter(Packages.javax.net.ssl.HostnameVerifier,{verify:function(a,b){return true;}});\n    c.setHostnameVerifier(hv);\n  }catch(e){}\n}\nfunction REQ(url,method,body,ck,loose){\n  var out={code:0,h:'',sc:''};\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod(method||'GET');\n    c.setConnectTimeout(8000);c.setReadTimeout(15000);\n    c.setInstanceFollowRedirects(true);\n    if(loose)looseSSL(c);\n    c.setRequestProperty('User-Agent',UA);\n    c.setRequestProperty('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    if(ck)c.setRequestProperty('Cookie',String(ck));\n    if(body!=null){c.setDoOutput(true);c.setRequestProperty('Content-Type','application/x-www-form-urlencoded');var os=c.getOutputStream();os.write(new Packages.java.lang.String(String(body)).getBytes('UTF-8'));os.flush();os.close();}\n    out.code=c.getResponseCode();\n    try{out.h=TXT(c);}catch(e1){out.h='';}\n    try{var v=c.getHeaderFields().get('Set-Cookie');if(v){var t=[];for(var i=0;i<v.size();i++)t.push(String(v.get(i)));out.sc=t.join(';');}}catch(e2){}\n  }catch(e){out.h='';out.err=String(e);}\n  return out;\n}\nfunction pass(b){\n  try{\n    var r=REQ(b+'/index.php/ajax/verify_check?type=search','POST','i='+encodeURIComponent(tk()),rdCk(b));\n    wrCk(b,r.sc);\n    var s=String(r.h||'');\n    return s.indexOf('\"code\":1')>=0||s.indexOf('\"code\": 1')>=0;\n  }catch(e){return false;}\n}\nfunction G1(b,p){var r=REQ(b+p,'GET',null,rdCk(b));wrCk(b,r.sc);return String(r.h||'');}\nfunction fetch(b,p){\n  var h=G1(b,p);\n  if(okPage(h))return h;\n  for(var i=0;i<2;i++){\n    if(!pass(b))break;\n    try{Packages.java.lang.Thread.sleep(400);}catch(e){}\n    h=G1(b,p);\n    if(okPage(h))break;\n  }\n  return h;\n}\nfunction pick(p){\n  var a=ord(),last='';\n  for(var i=0;i<a.length;i++){\n    var h=fetch(a[i],p);\n    if(okPage(h)){if(a[i]!==curLine())sub('om_line',a[i]);return{h:h,b:a[i]};}\n    last=h;\n  }\n  return{h:last,b:a[0]};\n}\nfunction pth(u){var s=String(u==null?'':u),m=/^https?:\\/\\/[^\\/]+(\\/[^\\s]*)?$/.exec(s);return m?(m[1]||'/'):'/';}\nfunction abs(b,u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('http')===0)return u;if(u.indexOf('//')===0)return 'https:'+u;if(u.charAt(0)==='/')return b+u;return b+'/'+u;}\nfunction pic(u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('//')===0)return 'https:'+u;if(u.indexOf('http')===0){if(u.replace(/\\/+$/,'')==='https://as.cfhls.top')return '';return u;}if(u.charAt(0)==='/')return 'https://as.cfhls.top'+u;return u;}\nfunction Jp(h){try{return Packages.org.jsoup.Jsoup.parse(String(h||''));}catch(e){return null;}}\nfunction txt(e){try{return e?String(e.text()).trim():'';}catch(x){return '';}}\nfunction attr(e,n){try{return e?String(e.attr(n)||'').trim():'';}catch(x){return '';}}\nfunction first(d,sel){try{var e=d.select(sel);return e&&e.size()>0?e.get(0):null;}catch(x){return null;}}\nfunction parseList(h,b){\n  var out=[],seen={};\n  if(!h||gt(h))return out;\n  var d=Jp(h);if(!d)return out;\n  var as=null;\n  try{as=d.select('a[href*=/anime/]');}catch(e1){return out;}\n  if(!as)return out;\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);var u=attr(a,'href');\n    if(u.indexOf('/anime/')<0||u.indexOf('.html')<0)continue;\n    if(u.indexOf('/play/')>=0)continue;\n    var n=attr(a,'title');if(!n)n=txt(a);\n    if(!n||n.length>60)continue;\n    // 无封面不再跳过条目：隐藏轮播 banner 只有图床根路径背景，coverUrl 留空即可，\n    // 详情页规则会自动补封面。若同 URL 已有条目且旧的无封面、新的有封面，则用新的替换。\n    var p1=attr(a,'data-original');\n    if(!p1){var im=first(a,'img');if(im){p1=attr(im,'data-original')||attr(im,'src');}}\n    p1=pic(p1);\n    var old=seen[u];\n    if(old){\n      if(p1){var prev=null;try{prev=JSON.parse(out[old-1]);}catch(e8){}\n        if(prev&&!prev.coverUrl){\n          var kind2=prev.kind||'',last2=prev.lastChapter||'';\n          var li2=null;try{li2=a.parent();}catch(e9){}\n          var g2=0;while(li2&&g2++<4){var tg2='';try{tg2=String(li2.tagName());}catch(e10){}if(String(tg2).toLowerCase()==='li')break;try{li2=li2.parent();}catch(e11){li2=null;break;}}\n          if(li2){var bs2=null;try{bs2=li2.select('span b');}catch(e12){}if(bs2&&bs2.size()>=2){kind2=txt(bs2.get(0));last2=txt(bs2.get(bs2.size()-1));}}\n          out[old-1]=JSON.stringify({name:prev.name,bookUrl:prev.bookUrl,coverUrl:p1,kind:kind2,lastChapter:last2});\n        }\n      }\n      continue;\n    }\n    var kind='',last='';var li=null;try{li=a.parent();}catch(e4){}\n    var g=0;\n    while(li&&g++<4){var tg='';try{tg=String(li.tagName());}catch(e5){}if(String(tg).toLowerCase()==='li')break;try{li=li.parent();}catch(e6){li=null;break;}}\n    if(li){var bs=null;try{bs=li.select('span b');}catch(e7){}\n      if(bs&&bs.size()>=2){kind=txt(bs.get(0));last=txt(bs.get(bs.size()-1));}}\n    seen[u]=out.length+1;\n    out.push(JSON.stringify({name:n,bookUrl:abs(b,u),coverUrl:p1,kind:kind,lastChapter:last}));\n  }\n  return out;\n}\nfunction arr(list,out){try{var l=new Packages.java.util.ArrayList();for(var i=0;i<out.length;i++)l.add(out[i]);return l;}catch(e){return out;}}\n\nvar b=hostOf(baseUrl)||curLine(),h=String(result||''),d=gt(h)?null:Jp(h);\nvar nm0='';if(d){nm0=txt(first(d,'h1.title'));}\nif(!nm0){var r0=pick(pth(baseUrl));h=r0.h;b=r0.b;d=Jp(h);}\nvar name='',p1='',meta='',status='',intro='';\nif(d){\n name=txt(first(d,'h1.title'));\n var im=first(d,'a.pic img');\n if(im){p1=attr(im,'data-original')||attr(im,'src');}\n try{var ps=d.select('p.data');\n   for(var i=0;i<ps.size();i++){var t=String(ps.get(i).text()).trim();\n     if(t.indexOf('\\u7c7b\\u578b')===0)meta=t;\n     else if(t.indexOf('\\u72b6\\u6001')===0)status=t.replace(/^\\u72b6\\u6001[\\uff1a:]\\s*/,'');}\n }catch(e1){}\n intro=txt(first(d,'.detail-content'))||txt(first(d,'.detail-sketch'))||txt(first(d,'.desc'));\n}\nvar kind='';\nif(meta){kind=meta.replace(/^\\u7c7b\\u578b[\\uff1a:]\\s*/,'').split('/')[0].replace(/[,\\uff0c]\\s*/g,' \\u00b7 ').trim();}\nvar o={a:'OmoFun',c:pic(p1),k:kind,w:status,t:status||'\\u2014',i:intro,n:name,tocUrl:String(baseUrl||'')};\nreturn JSON.stringify(o);\n})()", "intro": "$.i", "kind": "$.k", "lastChapter": "$.t", "name": "$.n", "tocUrl": "$.tocUrl", "wordCount": "$.w"}, "ruleContent": {"content": "@js:(function(){\nvar UA='Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n// 默认兜底线路（与发布页当前 4 条一致）；实际线路来自登录面板「一键从发布页获取」写入的 om_lines\nvar DEF_LINES=['https://www.omofuns.com','https://cn.233dm.com','https://cn.211dm.com','https://cn.agekkkk.com'];\nfunction lines(){\n  var raw=SV('om_lines'),a=null;\n  if(raw){try{a=JSON.parse(String(raw));}catch(e){a=null;}}\n  if(a&&a.length){\n    var r=[],seen={};\n    for(var i=0;i<a.length;i++){\n      var u=(typeof a[i]==='string')?a[i]:(a[i]&&a[i].u?String(a[i].u):'');\n      u=String(u).replace(/\\/+$/,'');\n      if(u.indexOf('https://')===0&&u.indexOf('fb.omoo')<0&&!seen[u]){seen[u]=1;r.push(u);}\n    }\n    if(r.length)return r;\n  }\n  // 兼容旧书源遗留的 om_sn / om_s1..8\n  var n=parseInt(SV('om_sn'),10)||0,r2=[];\n  for(var j=1;j<=n&&j<=8;j++){var v=SV('om_s'+j).replace(/\\/+$/,'');if(v.indexOf('https://')===0)r2.push(v);}\n  if(r2.length)return r2;\n  return DEF_LINES;\n}\nvar K=[78,63,169,194,18,125,136,239,85,170,11,205,222,173,190,239];\nfunction S(v){try{var s=String(v==null?'':v);return (s==='null'||s==='undefined'||s==='[object Object]'||s==='JsNull')?'':s;}catch(e){return '';}}\nfunction SV(k){try{return S(source.get(k));}catch(e){return '';}}\nfunction sub(k,v){try{source.put(k,String(v));}catch(e){}}\nfunction curLine(){var c=SV('om_line').replace(/\\/+$/,''),a=lines();if(c.indexOf('https://')===0&&c.indexOf('fb.omoo')<0){for(var i=0;i<a.length;i++)if(a[i]===c)return c;if(c===SV('om_custom').replace(/\\/+$/,''))return c;}return a[0];}\nfunction hostOf(u){var s=String(u==null?'':u),m=/^https?:\\/\\/([^\\/]+)/.exec(s);if(!m)return '';var hn=m[1],a=lines();for(var i=0;i<a.length;i++){if(a[i].replace(/^https?:\\/\\//,'')===hn)return a[i];}if(s.indexOf('https://')===0)return 'https://'+hn;return '';}\nfunction ord(){var c=curLine(),a=lines(),r=[c];for(var i=0;i<a.length;i++){if(a[i]!==c)r.push(a[i]);}return r;}\nfunction gt(h){h=String(h==null?'':h);if(!h)return true;return h.indexOf('\\u7cfb\\u7edf\\u5b89\\u5168\\u9a8c\\u8bc1')>=0||h.indexOf('verify_check')>=0;}\nfunction okPage(h){h=String(h==null?'':h);if(!h||h.length<8000)return false;if(gt(h))return false;return true;}\nfunction b64(s){var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',o='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i)&255,b=i+1<s.length?s.charCodeAt(i+1)&255:null,c=i+2<s.length?s.charCodeAt(i+2)&255:null,n=(a<<16)|((b||0)<<8)|(c||0);o+=t.charAt((n>>18)&63)+t.charAt((n>>12)&63)+(b===null?'=':t.charAt((n>>6)&63))+(c===null?'=':t.charAt(n&63));}return o;}\nfunction tk(){var ts=String(Date.now()),p='';for(var i=0;i<ts.length;i++)p+=String.fromCharCode(ts.charCodeAt(i)^K[i%16]);return b64(p);}\nfunction b64b(s){\n  // 用 ByteArrayOutputStream 生成 byte[]，避开反射建数组的高危 API\n  // （Legado 登录面板/部分真机环境里该 Class 会被解析成 JavaPackage 而非类）\n  var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n  var bos=new Packages.java.io.ByteArrayOutputStream(),buf=0,bits=0,i,ch,v;\n  for(i=0;i<s.length;i++){\n    ch=s.charAt(i);\n    if(ch==='='||ch==='\\n'||ch==='\\r'||ch===' ')continue;\n    v=t.indexOf(ch);\n    if(v<0)continue;\n    buf=((buf<<6)|v)&0x3FFFFF;bits+=6;\n    if(bits>=8){bits-=8;bos.write((buf>>bits)&255);}\n  }\n  return bos.toByteArray();\n}\nfunction hk(b){var m=/^https?:\\/\\/([^\\/]+)/.exec(String(b||''));return m?('om_ck_'+m[1]):'om_ck_x';}\nfunction rdCk(b){return SV(hk(b));}\nfunction wrCk(b,sc){if(!sc)return;var parts=String(sc).split(';');var kv=parts[0];if(kv&&kv.indexOf('=')>0){var old=rdCk(b),name=kv.split('=')[0];var keep=[];if(old){var o=old.split(';');for(var i=0;i<o.length;i++){var p=String(o[i]).replace(/^\\s+/,'');if(p&&p.split('=')[0]!==name)keep.push(p);}}keep.push(kv);sub(hk(b),keep.join('; '));}}\nfunction TXT(c){\n  // 文本流读法：InputStream -> (gzip 则包 GZIPInputStream) -> BufferedReader 逐行。\n  // 全程不创建 Java byte[]，避开反射建数组的高危 API。\n  var is=c.getInputStream();\n  try{\n    var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);\n  }catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\n// 最后一次重试用：跳过 SSL 证书/主机名校验（应对被劫持的线路或自签播放器证书）\nfunction looseSSL(c){\n  // 最后一次重试兜底：只跳过主机名校验（足以应对 CN=*.10086.cn 这类劫持证书）。\n  // 不再自建 TrustManager[] —— 那需要反射创建 Java 数组，真机会崩。\n  try{\n    var hv=new JavaAdapter(Packages.javax.net.ssl.HostnameVerifier,{verify:function(a,b){return true;}});\n    c.setHostnameVerifier(hv);\n  }catch(e){}\n}\nfunction REQ(url,method,body,ck,loose){\n  var out={code:0,h:'',sc:''};\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod(method||'GET');\n    c.setConnectTimeout(8000);c.setReadTimeout(15000);\n    c.setInstanceFollowRedirects(true);\n    if(loose)looseSSL(c);\n    c.setRequestProperty('User-Agent',UA);\n    c.setRequestProperty('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    if(ck)c.setRequestProperty('Cookie',String(ck));\n    if(body!=null){c.setDoOutput(true);c.setRequestProperty('Content-Type','application/x-www-form-urlencoded');var os=c.getOutputStream();os.write(new Packages.java.lang.String(String(body)).getBytes('UTF-8'));os.flush();os.close();}\n    out.code=c.getResponseCode();\n    try{out.h=TXT(c);}catch(e1){out.h='';}\n    try{var v=c.getHeaderFields().get('Set-Cookie');if(v){var t=[];for(var i=0;i<v.size();i++)t.push(String(v.get(i)));out.sc=t.join(';');}}catch(e2){}\n  }catch(e){out.h='';out.err=String(e);}\n  return out;\n}\nfunction pass(b){\n  try{\n    var r=REQ(b+'/index.php/ajax/verify_check?type=search','POST','i='+encodeURIComponent(tk()),rdCk(b));\n    wrCk(b,r.sc);\n    var s=String(r.h||'');\n    return s.indexOf('\"code\":1')>=0||s.indexOf('\"code\": 1')>=0;\n  }catch(e){return false;}\n}\nfunction G1(b,p){var r=REQ(b+p,'GET',null,rdCk(b));wrCk(b,r.sc);return String(r.h||'');}\nfunction fetch(b,p){\n  var h=G1(b,p);\n  if(okPage(h))return h;\n  for(var i=0;i<2;i++){\n    if(!pass(b))break;\n    try{Packages.java.lang.Thread.sleep(400);}catch(e){}\n    h=G1(b,p);\n    if(okPage(h))break;\n  }\n  return h;\n}\nfunction pick(p){\n  var a=ord(),last='';\n  for(var i=0;i<a.length;i++){\n    var h=fetch(a[i],p);\n    if(okPage(h)){if(a[i]!==curLine())sub('om_line',a[i]);return{h:h,b:a[i]};}\n    last=h;\n  }\n  return{h:last,b:a[0]};\n}\nfunction pth(u){var s=String(u==null?'':u),m=/^https?:\\/\\/[^\\/]+(\\/[^\\s]*)?$/.exec(s);return m?(m[1]||'/'):'/';}\nfunction abs(b,u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('http')===0)return u;if(u.indexOf('//')===0)return 'https:'+u;if(u.charAt(0)==='/')return b+u;return b+'/'+u;}\nfunction pic(u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('//')===0)return 'https:'+u;if(u.indexOf('http')===0){if(u.replace(/\\/+$/,'')==='https://as.cfhls.top')return '';return u;}if(u.charAt(0)==='/')return 'https://as.cfhls.top'+u;return u;}\nfunction Jp(h){try{return Packages.org.jsoup.Jsoup.parse(String(h||''));}catch(e){return null;}}\nfunction txt(e){try{return e?String(e.text()).trim():'';}catch(x){return '';}}\nfunction attr(e,n){try{return e?String(e.attr(n)||'').trim():'';}catch(x){return '';}}\nfunction first(d,sel){try{var e=d.select(sel);return e&&e.size()>0?e.get(0):null;}catch(x){return null;}}\nfunction parseList(h,b){\n  var out=[],seen={};\n  if(!h||gt(h))return out;\n  var d=Jp(h);if(!d)return out;\n  var as=null;\n  try{as=d.select('a[href*=/anime/]');}catch(e1){return out;}\n  if(!as)return out;\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);var u=attr(a,'href');\n    if(u.indexOf('/anime/')<0||u.indexOf('.html')<0)continue;\n    if(u.indexOf('/play/')>=0)continue;\n    var n=attr(a,'title');if(!n)n=txt(a);\n    if(!n||n.length>60)continue;\n    // 无封面不再跳过条目：隐藏轮播 banner 只有图床根路径背景，coverUrl 留空即可，\n    // 详情页规则会自动补封面。若同 URL 已有条目且旧的无封面、新的有封面，则用新的替换。\n    var p1=attr(a,'data-original');\n    if(!p1){var im=first(a,'img');if(im){p1=attr(im,'data-original')||attr(im,'src');}}\n    p1=pic(p1);\n    var old=seen[u];\n    if(old){\n      if(p1){var prev=null;try{prev=JSON.parse(out[old-1]);}catch(e8){}\n        if(prev&&!prev.coverUrl){\n          var kind2=prev.kind||'',last2=prev.lastChapter||'';\n          var li2=null;try{li2=a.parent();}catch(e9){}\n          var g2=0;while(li2&&g2++<4){var tg2='';try{tg2=String(li2.tagName());}catch(e10){}if(String(tg2).toLowerCase()==='li')break;try{li2=li2.parent();}catch(e11){li2=null;break;}}\n          if(li2){var bs2=null;try{bs2=li2.select('span b');}catch(e12){}if(bs2&&bs2.size()>=2){kind2=txt(bs2.get(0));last2=txt(bs2.get(bs2.size()-1));}}\n          out[old-1]=JSON.stringify({name:prev.name,bookUrl:prev.bookUrl,coverUrl:p1,kind:kind2,lastChapter:last2});\n        }\n      }\n      continue;\n    }\n    var kind='',last='';var li=null;try{li=a.parent();}catch(e4){}\n    var g=0;\n    while(li&&g++<4){var tg='';try{tg=String(li.tagName());}catch(e5){}if(String(tg).toLowerCase()==='li')break;try{li=li.parent();}catch(e6){li=null;break;}}\n    if(li){var bs=null;try{bs=li.select('span b');}catch(e7){}\n      if(bs&&bs.size()>=2){kind=txt(bs.get(0));last=txt(bs.get(bs.size()-1));}}\n    seen[u]=out.length+1;\n    out.push(JSON.stringify({name:n,bookUrl:abs(b,u),coverUrl:p1,kind:kind,lastChapter:last}));\n  }\n  return out;\n}\nfunction arr(list,out){try{var l=new Packages.java.util.ArrayList();for(var i=0;i<out.length;i++)l.add(out[i]);return l;}catch(e){return out;}}\n\nvar b=hostOf(baseUrl)||curLine(),page=String(result||'');\n// 播放页 result 若被盾拦截或为空，用原生 HTTP 自己抓一次（自动过盾 + 换线）\nif(page.indexOf('player_aaaa')<0){var rr=pick(pth(baseUrl));page=rr.h;b=rr.b;}\nvar i=page.indexOf('var player_aaaa=');\nif(i<0) return '\\u26a0 \\u672a\\u627e\\u5230\\u64ad\\u653e\\u6570\\u636e\\uff08\\u9875\\u9762\\u5b57\\u8282='+page.length+'\\uff0c\\u53ef\\u80fd\\u88ab\\u5b89\\u5168\\u9a8c\\u8bc1\\u62e6\\u622a\\uff09';\nvar st=page.indexOf('{',i),dep=0,end=-1,inStr=false,q='';\nif(st<0) return '\\u26a0 \\u64ad\\u653e\\u6570\\u636e\\u8d77\\u59cb\\u7b26\\u7f3a\\u5931';\nfor(var k=st;k<page.length;k++){\n  var c=page.charAt(k);\n  if(inStr){ if(c==='\\\\'){k++;continue;} if(c===q)inStr=false; continue; }\n  if(c==='\"'||c===\"'\"){ inStr=true; q=c; continue; }\n  if(c==='{')dep++; else if(c==='}'){ dep--; if(dep===0){ end=k+1; break; } }\n}\nif(end<0) return '\\u26a0 \\u64ad\\u653e\\u6570\\u636e\\u62ec\\u53f7\\u4e0d\\u914d\\u5e73';\nvar pd=null;\ntry{ pd=JSON.parse(page.slice(st,end)); }catch(e2){ return '\\u26a0 \\u64ad\\u653e\\u6570\\u636e\\u89e3\\u6790\\u5931\\u8d25'; }\nvar rawUrl=String(pd.url||'');\nif(String(pd.encrypt)==='1'){ try{ rawUrl=unescape(rawUrl); }catch(e3){ } }\nif(!rawUrl) return '\\u26a0 \\u8be5\\u96c6\\u6682\\u65e0\\u64ad\\u653e\\u5730\\u5740';\nvar dmid='';\ntry{ var dm=/\\\"dmid\\\"\\s*:\\s*\\\"?(\\d+)\\\"?/.exec(page); if(dm)dmid=dm[1]; }catch(e5){ }\nif(!dmid)dmid=String(pd.id||'');\nvar pic1=String((pd.vod_data&&pd.vod_data.vod_pic)||'');\nvar qs=[\n  'url='+encodeURIComponent(rawUrl),\n  'dmid='+encodeURIComponent(dmid),\n  'next='+encodeURIComponent(String(pd.link_next||'')),\n  'name='+encodeURIComponent(String((pd.vod_data&&pd.vod_data.vod_name)||'')),\n  'sid='+encodeURIComponent(String(pd.sid||'1')),\n  'nid='+encodeURIComponent(String(pd.nid||'1')),\n  'ph='+encodeURIComponent('https://as.cfhls.top/'),\n  'h='+encodeURIComponent(b),\n  'pic='+encodeURIComponent(pic1)\n];\n// 3 次机会：art 主域 → low 备用域 → 跳过 SSL 校验再试 art（应对证书/主机名问题）\nvar hosts=['https://art.v2player.top:8989/player/?','https://low.v2player.top:8989/player/?','https://art.v2player.top:8989/player/?'];\nvar ph1='',mm=null,lastErr='';\nfor(var retry=0;retry<3;retry++){\n  var tu=hosts[retry]+qs.join('&')+(retry?('&_r='+Date.now()+'_'+retry):'');\n  try{\n    var resp=REQ(tu,'GET',null,'',retry===2);\n    ph1=String(resp.h||'');lastErr=String(resp.err||'');\n  }catch(e6){ph1='';lastErr=String(e6);}\n  mm=/playData\\('([^']+)','([^']+)'\\)/.exec(ph1);\n  if(mm)break;\n  try{ Packages.java.lang.Thread.sleep(300); }catch(eS){}\n}\nif(!mm) return '\\u26a0 \\u64ad\\u653e\\u5668\\u65e0\\u54cd\\u5e94\\uff08\\u5df2\\u8bd5 3 \\u6b21\\uff0c\\u672b\\u6b21\\u5b57\\u8282='+ph1.length+'\\uff09\\u3002\\u82e5\\u6301\\u7eed\\u5931\\u8d25\\u8bf7\\u5728\\u8c03\\u8bd5\\u6b63\\u6587\\u91cc\\u770b\\u6b64\\u63d0\\u793a\\uff0c\\u6216\\u5207\\u6362\\u7ebf\\u8def';\ntry{\n  var cipher=mm[1], ivHex=mm[2];\n  var keyB=new Packages.java.lang.String('ABABEF777999CCCD').getBytes('UTF-8');\n  var key=new Packages.javax.crypto.spec.SecretKeySpec(keyB,'AES');\n  var hl=ivHex.length/2;\n  var ivbos=new Packages.java.io.ByteArrayOutputStream();\n  for(var hi=0;hi<hl;hi++)ivbos.write(parseInt(ivHex.substr(hi*2,2),16));\n  var ivb=ivbos.toByteArray();\n  var iv=new Packages.javax.crypto.spec.IvParameterSpec(ivb);\n  var cb=b64b(cipher);\n  var cc=Packages.javax.crypto.Cipher.getInstance('AES/CBC/PKCS5Padding');\n  cc.init(2,key,iv);\n  var d2=cc.doFinal(cb);\n  var u2=String(new Packages.java.lang.String(d2,'UTF-8')).trim();\n  if(u2.indexOf('org.h://')===0) u2='https://'+u2.slice(8);\n  if(u2.indexOf('http')!==0) return '\\u26a0 \\u89e3\\u6790\\u51fa\\u7684\\u5730\\u5740\\u5f02\\u5e38\\uff1a'+u2.slice(0,100);\n  return u2;\n}catch(e7){ return '\\u26a0 \\u64ad\\u653e\\u5730\\u5740\\u89e3\\u5bc6\\u5931\\u8d25\\uff1a'+e7; }\n\n})()"}, "ruleExplore": {"author": "$.kind", "bookList": "@js:(function(){\nvar UA='Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n// 默认兜底线路（与发布页当前 4 条一致）；实际线路来自登录面板「一键从发布页获取」写入的 om_lines\nvar DEF_LINES=['https://www.omofuns.com','https://cn.233dm.com','https://cn.211dm.com','https://cn.agekkkk.com'];\nfunction lines(){\n  var raw=SV('om_lines'),a=null;\n  if(raw){try{a=JSON.parse(String(raw));}catch(e){a=null;}}\n  if(a&&a.length){\n    var r=[],seen={};\n    for(var i=0;i<a.length;i++){\n      var u=(typeof a[i]==='string')?a[i]:(a[i]&&a[i].u?String(a[i].u):'');\n      u=String(u).replace(/\\/+$/,'');\n      if(u.indexOf('https://')===0&&u.indexOf('fb.omoo')<0&&!seen[u]){seen[u]=1;r.push(u);}\n    }\n    if(r.length)return r;\n  }\n  // 兼容旧书源遗留的 om_sn / om_s1..8\n  var n=parseInt(SV('om_sn'),10)||0,r2=[];\n  for(var j=1;j<=n&&j<=8;j++){var v=SV('om_s'+j).replace(/\\/+$/,'');if(v.indexOf('https://')===0)r2.push(v);}\n  if(r2.length)return r2;\n  return DEF_LINES;\n}\nvar K=[78,63,169,194,18,125,136,239,85,170,11,205,222,173,190,239];\nfunction S(v){try{var s=String(v==null?'':v);return (s==='null'||s==='undefined'||s==='[object Object]'||s==='JsNull')?'':s;}catch(e){return '';}}\nfunction SV(k){try{return S(source.get(k));}catch(e){return '';}}\nfunction sub(k,v){try{source.put(k,String(v));}catch(e){}}\nfunction curLine(){var c=SV('om_line').replace(/\\/+$/,''),a=lines();if(c.indexOf('https://')===0&&c.indexOf('fb.omoo')<0){for(var i=0;i<a.length;i++)if(a[i]===c)return c;if(c===SV('om_custom').replace(/\\/+$/,''))return c;}return a[0];}\nfunction hostOf(u){var s=String(u==null?'':u),m=/^https?:\\/\\/([^\\/]+)/.exec(s);if(!m)return '';var hn=m[1],a=lines();for(var i=0;i<a.length;i++){if(a[i].replace(/^https?:\\/\\//,'')===hn)return a[i];}if(s.indexOf('https://')===0)return 'https://'+hn;return '';}\nfunction ord(){var c=curLine(),a=lines(),r=[c];for(var i=0;i<a.length;i++){if(a[i]!==c)r.push(a[i]);}return r;}\nfunction gt(h){h=String(h==null?'':h);if(!h)return true;return h.indexOf('\\u7cfb\\u7edf\\u5b89\\u5168\\u9a8c\\u8bc1')>=0||h.indexOf('verify_check')>=0;}\nfunction okPage(h){h=String(h==null?'':h);if(!h||h.length<8000)return false;if(gt(h))return false;return true;}\nfunction b64(s){var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',o='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i)&255,b=i+1<s.length?s.charCodeAt(i+1)&255:null,c=i+2<s.length?s.charCodeAt(i+2)&255:null,n=(a<<16)|((b||0)<<8)|(c||0);o+=t.charAt((n>>18)&63)+t.charAt((n>>12)&63)+(b===null?'=':t.charAt((n>>6)&63))+(c===null?'=':t.charAt(n&63));}return o;}\nfunction tk(){var ts=String(Date.now()),p='';for(var i=0;i<ts.length;i++)p+=String.fromCharCode(ts.charCodeAt(i)^K[i%16]);return b64(p);}\nfunction b64b(s){\n  // 用 ByteArrayOutputStream 生成 byte[]，避开反射建数组的高危 API\n  // （Legado 登录面板/部分真机环境里该 Class 会被解析成 JavaPackage 而非类）\n  var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n  var bos=new Packages.java.io.ByteArrayOutputStream(),buf=0,bits=0,i,ch,v;\n  for(i=0;i<s.length;i++){\n    ch=s.charAt(i);\n    if(ch==='='||ch==='\\n'||ch==='\\r'||ch===' ')continue;\n    v=t.indexOf(ch);\n    if(v<0)continue;\n    buf=((buf<<6)|v)&0x3FFFFF;bits+=6;\n    if(bits>=8){bits-=8;bos.write((buf>>bits)&255);}\n  }\n  return bos.toByteArray();\n}\nfunction hk(b){var m=/^https?:\\/\\/([^\\/]+)/.exec(String(b||''));return m?('om_ck_'+m[1]):'om_ck_x';}\nfunction rdCk(b){return SV(hk(b));}\nfunction wrCk(b,sc){if(!sc)return;var parts=String(sc).split(';');var kv=parts[0];if(kv&&kv.indexOf('=')>0){var old=rdCk(b),name=kv.split('=')[0];var keep=[];if(old){var o=old.split(';');for(var i=0;i<o.length;i++){var p=String(o[i]).replace(/^\\s+/,'');if(p&&p.split('=')[0]!==name)keep.push(p);}}keep.push(kv);sub(hk(b),keep.join('; '));}}\nfunction TXT(c){\n  // 文本流读法：InputStream -> (gzip 则包 GZIPInputStream) -> BufferedReader 逐行。\n  // 全程不创建 Java byte[]，避开反射建数组的高危 API。\n  var is=c.getInputStream();\n  try{\n    var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);\n  }catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\n// 最后一次重试用：跳过 SSL 证书/主机名校验（应对被劫持的线路或自签播放器证书）\nfunction looseSSL(c){\n  // 最后一次重试兜底：只跳过主机名校验（足以应对 CN=*.10086.cn 这类劫持证书）。\n  // 不再自建 TrustManager[] —— 那需要反射创建 Java 数组，真机会崩。\n  try{\n    var hv=new JavaAdapter(Packages.javax.net.ssl.HostnameVerifier,{verify:function(a,b){return true;}});\n    c.setHostnameVerifier(hv);\n  }catch(e){}\n}\nfunction REQ(url,method,body,ck,loose){\n  var out={code:0,h:'',sc:''};\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod(method||'GET');\n    c.setConnectTimeout(8000);c.setReadTimeout(15000);\n    c.setInstanceFollowRedirects(true);\n    if(loose)looseSSL(c);\n    c.setRequestProperty('User-Agent',UA);\n    c.setRequestProperty('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    if(ck)c.setRequestProperty('Cookie',String(ck));\n    if(body!=null){c.setDoOutput(true);c.setRequestProperty('Content-Type','application/x-www-form-urlencoded');var os=c.getOutputStream();os.write(new Packages.java.lang.String(String(body)).getBytes('UTF-8'));os.flush();os.close();}\n    out.code=c.getResponseCode();\n    try{out.h=TXT(c);}catch(e1){out.h='';}\n    try{var v=c.getHeaderFields().get('Set-Cookie');if(v){var t=[];for(var i=0;i<v.size();i++)t.push(String(v.get(i)));out.sc=t.join(';');}}catch(e2){}\n  }catch(e){out.h='';out.err=String(e);}\n  return out;\n}\nfunction pass(b){\n  try{\n    var r=REQ(b+'/index.php/ajax/verify_check?type=search','POST','i='+encodeURIComponent(tk()),rdCk(b));\n    wrCk(b,r.sc);\n    var s=String(r.h||'');\n    return s.indexOf('\"code\":1')>=0||s.indexOf('\"code\": 1')>=0;\n  }catch(e){return false;}\n}\nfunction G1(b,p){var r=REQ(b+p,'GET',null,rdCk(b));wrCk(b,r.sc);return String(r.h||'');}\nfunction fetch(b,p){\n  var h=G1(b,p);\n  if(okPage(h))return h;\n  for(var i=0;i<2;i++){\n    if(!pass(b))break;\n    try{Packages.java.lang.Thread.sleep(400);}catch(e){}\n    h=G1(b,p);\n    if(okPage(h))break;\n  }\n  return h;\n}\nfunction pick(p){\n  var a=ord(),last='';\n  for(var i=0;i<a.length;i++){\n    var h=fetch(a[i],p);\n    if(okPage(h)){if(a[i]!==curLine())sub('om_line',a[i]);return{h:h,b:a[i]};}\n    last=h;\n  }\n  return{h:last,b:a[0]};\n}\nfunction pth(u){var s=String(u==null?'':u),m=/^https?:\\/\\/[^\\/]+(\\/[^\\s]*)?$/.exec(s);return m?(m[1]||'/'):'/';}\nfunction abs(b,u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('http')===0)return u;if(u.indexOf('//')===0)return 'https:'+u;if(u.charAt(0)==='/')return b+u;return b+'/'+u;}\nfunction pic(u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('//')===0)return 'https:'+u;if(u.indexOf('http')===0){if(u.replace(/\\/+$/,'')==='https://as.cfhls.top')return '';return u;}if(u.charAt(0)==='/')return 'https://as.cfhls.top'+u;return u;}\nfunction Jp(h){try{return Packages.org.jsoup.Jsoup.parse(String(h||''));}catch(e){return null;}}\nfunction txt(e){try{return e?String(e.text()).trim():'';}catch(x){return '';}}\nfunction attr(e,n){try{return e?String(e.attr(n)||'').trim():'';}catch(x){return '';}}\nfunction first(d,sel){try{var e=d.select(sel);return e&&e.size()>0?e.get(0):null;}catch(x){return null;}}\nfunction parseList(h,b){\n  var out=[],seen={};\n  if(!h||gt(h))return out;\n  var d=Jp(h);if(!d)return out;\n  var as=null;\n  try{as=d.select('a[href*=/anime/]');}catch(e1){return out;}\n  if(!as)return out;\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);var u=attr(a,'href');\n    if(u.indexOf('/anime/')<0||u.indexOf('.html')<0)continue;\n    if(u.indexOf('/play/')>=0)continue;\n    var n=attr(a,'title');if(!n)n=txt(a);\n    if(!n||n.length>60)continue;\n    // 无封面不再跳过条目：隐藏轮播 banner 只有图床根路径背景，coverUrl 留空即可，\n    // 详情页规则会自动补封面。若同 URL 已有条目且旧的无封面、新的有封面，则用新的替换。\n    var p1=attr(a,'data-original');\n    if(!p1){var im=first(a,'img');if(im){p1=attr(im,'data-original')||attr(im,'src');}}\n    p1=pic(p1);\n    var old=seen[u];\n    if(old){\n      if(p1){var prev=null;try{prev=JSON.parse(out[old-1]);}catch(e8){}\n        if(prev&&!prev.coverUrl){\n          var kind2=prev.kind||'',last2=prev.lastChapter||'';\n          var li2=null;try{li2=a.parent();}catch(e9){}\n          var g2=0;while(li2&&g2++<4){var tg2='';try{tg2=String(li2.tagName());}catch(e10){}if(String(tg2).toLowerCase()==='li')break;try{li2=li2.parent();}catch(e11){li2=null;break;}}\n          if(li2){var bs2=null;try{bs2=li2.select('span b');}catch(e12){}if(bs2&&bs2.size()>=2){kind2=txt(bs2.get(0));last2=txt(bs2.get(bs2.size()-1));}}\n          out[old-1]=JSON.stringify({name:prev.name,bookUrl:prev.bookUrl,coverUrl:p1,kind:kind2,lastChapter:last2});\n        }\n      }\n      continue;\n    }\n    var kind='',last='';var li=null;try{li=a.parent();}catch(e4){}\n    var g=0;\n    while(li&&g++<4){var tg='';try{tg=String(li.tagName());}catch(e5){}if(String(tg).toLowerCase()==='li')break;try{li=li.parent();}catch(e6){li=null;break;}}\n    if(li){var bs=null;try{bs=li.select('span b');}catch(e7){}\n      if(bs&&bs.size()>=2){kind=txt(bs.get(0));last=txt(bs.get(bs.size()-1));}}\n    seen[u]=out.length+1;\n    out.push(JSON.stringify({name:n,bookUrl:abs(b,u),coverUrl:p1,kind:kind,lastChapter:last}));\n  }\n  return out;\n}\nfunction arr(list,out){try{var l=new Packages.java.util.ArrayList();for(var i=0;i<out.length;i++)l.add(out[i]);return l;}catch(e){return out;}}\n\nvar b=hostOf(baseUrl)||curLine(),h=String(result||'');\nvar out=gt(h)?[]:parseList(h,b);\nif(out.length===0){\n  var r=pick(pth(baseUrl));\n  if(okPage(r.h)){out=parseList(r.h,r.b);}\n}\nreturn arr(null,out);\n})()", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name"}, "ruleSearch": {"author": "$.kind", "bookList": "@js:(function(){\nvar UA='Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n// 默认兜底线路（与发布页当前 4 条一致）；实际线路来自登录面板「一键从发布页获取」写入的 om_lines\nvar DEF_LINES=['https://www.omofuns.com','https://cn.233dm.com','https://cn.211dm.com','https://cn.agekkkk.com'];\nfunction lines(){\n  var raw=SV('om_lines'),a=null;\n  if(raw){try{a=JSON.parse(String(raw));}catch(e){a=null;}}\n  if(a&&a.length){\n    var r=[],seen={};\n    for(var i=0;i<a.length;i++){\n      var u=(typeof a[i]==='string')?a[i]:(a[i]&&a[i].u?String(a[i].u):'');\n      u=String(u).replace(/\\/+$/,'');\n      if(u.indexOf('https://')===0&&u.indexOf('fb.omoo')<0&&!seen[u]){seen[u]=1;r.push(u);}\n    }\n    if(r.length)return r;\n  }\n  // 兼容旧书源遗留的 om_sn / om_s1..8\n  var n=parseInt(SV('om_sn'),10)||0,r2=[];\n  for(var j=1;j<=n&&j<=8;j++){var v=SV('om_s'+j).replace(/\\/+$/,'');if(v.indexOf('https://')===0)r2.push(v);}\n  if(r2.length)return r2;\n  return DEF_LINES;\n}\nvar K=[78,63,169,194,18,125,136,239,85,170,11,205,222,173,190,239];\nfunction S(v){try{var s=String(v==null?'':v);return (s==='null'||s==='undefined'||s==='[object Object]'||s==='JsNull')?'':s;}catch(e){return '';}}\nfunction SV(k){try{return S(source.get(k));}catch(e){return '';}}\nfunction sub(k,v){try{source.put(k,String(v));}catch(e){}}\nfunction curLine(){var c=SV('om_line').replace(/\\/+$/,''),a=lines();if(c.indexOf('https://')===0&&c.indexOf('fb.omoo')<0){for(var i=0;i<a.length;i++)if(a[i]===c)return c;if(c===SV('om_custom').replace(/\\/+$/,''))return c;}return a[0];}\nfunction hostOf(u){var s=String(u==null?'':u),m=/^https?:\\/\\/([^\\/]+)/.exec(s);if(!m)return '';var hn=m[1],a=lines();for(var i=0;i<a.length;i++){if(a[i].replace(/^https?:\\/\\//,'')===hn)return a[i];}if(s.indexOf('https://')===0)return 'https://'+hn;return '';}\nfunction ord(){var c=curLine(),a=lines(),r=[c];for(var i=0;i<a.length;i++){if(a[i]!==c)r.push(a[i]);}return r;}\nfunction gt(h){h=String(h==null?'':h);if(!h)return true;return h.indexOf('\\u7cfb\\u7edf\\u5b89\\u5168\\u9a8c\\u8bc1')>=0||h.indexOf('verify_check')>=0;}\nfunction okPage(h){h=String(h==null?'':h);if(!h||h.length<8000)return false;if(gt(h))return false;return true;}\nfunction b64(s){var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',o='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i)&255,b=i+1<s.length?s.charCodeAt(i+1)&255:null,c=i+2<s.length?s.charCodeAt(i+2)&255:null,n=(a<<16)|((b||0)<<8)|(c||0);o+=t.charAt((n>>18)&63)+t.charAt((n>>12)&63)+(b===null?'=':t.charAt((n>>6)&63))+(c===null?'=':t.charAt(n&63));}return o;}\nfunction tk(){var ts=String(Date.now()),p='';for(var i=0;i<ts.length;i++)p+=String.fromCharCode(ts.charCodeAt(i)^K[i%16]);return b64(p);}\nfunction b64b(s){\n  // 用 ByteArrayOutputStream 生成 byte[]，避开反射建数组的高危 API\n  // （Legado 登录面板/部分真机环境里该 Class 会被解析成 JavaPackage 而非类）\n  var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n  var bos=new Packages.java.io.ByteArrayOutputStream(),buf=0,bits=0,i,ch,v;\n  for(i=0;i<s.length;i++){\n    ch=s.charAt(i);\n    if(ch==='='||ch==='\\n'||ch==='\\r'||ch===' ')continue;\n    v=t.indexOf(ch);\n    if(v<0)continue;\n    buf=((buf<<6)|v)&0x3FFFFF;bits+=6;\n    if(bits>=8){bits-=8;bos.write((buf>>bits)&255);}\n  }\n  return bos.toByteArray();\n}\nfunction hk(b){var m=/^https?:\\/\\/([^\\/]+)/.exec(String(b||''));return m?('om_ck_'+m[1]):'om_ck_x';}\nfunction rdCk(b){return SV(hk(b));}\nfunction wrCk(b,sc){if(!sc)return;var parts=String(sc).split(';');var kv=parts[0];if(kv&&kv.indexOf('=')>0){var old=rdCk(b),name=kv.split('=')[0];var keep=[];if(old){var o=old.split(';');for(var i=0;i<o.length;i++){var p=String(o[i]).replace(/^\\s+/,'');if(p&&p.split('=')[0]!==name)keep.push(p);}}keep.push(kv);sub(hk(b),keep.join('; '));}}\nfunction TXT(c){\n  // 文本流读法：InputStream -> (gzip 则包 GZIPInputStream) -> BufferedReader 逐行。\n  // 全程不创建 Java byte[]，避开反射建数组的高危 API。\n  var is=c.getInputStream();\n  try{\n    var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);\n  }catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\n// 最后一次重试用：跳过 SSL 证书/主机名校验（应对被劫持的线路或自签播放器证书）\nfunction looseSSL(c){\n  // 最后一次重试兜底：只跳过主机名校验（足以应对 CN=*.10086.cn 这类劫持证书）。\n  // 不再自建 TrustManager[] —— 那需要反射创建 Java 数组，真机会崩。\n  try{\n    var hv=new JavaAdapter(Packages.javax.net.ssl.HostnameVerifier,{verify:function(a,b){return true;}});\n    c.setHostnameVerifier(hv);\n  }catch(e){}\n}\nfunction REQ(url,method,body,ck,loose){\n  var out={code:0,h:'',sc:''};\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod(method||'GET');\n    c.setConnectTimeout(8000);c.setReadTimeout(15000);\n    c.setInstanceFollowRedirects(true);\n    if(loose)looseSSL(c);\n    c.setRequestProperty('User-Agent',UA);\n    c.setRequestProperty('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    if(ck)c.setRequestProperty('Cookie',String(ck));\n    if(body!=null){c.setDoOutput(true);c.setRequestProperty('Content-Type','application/x-www-form-urlencoded');var os=c.getOutputStream();os.write(new Packages.java.lang.String(String(body)).getBytes('UTF-8'));os.flush();os.close();}\n    out.code=c.getResponseCode();\n    try{out.h=TXT(c);}catch(e1){out.h='';}\n    try{var v=c.getHeaderFields().get('Set-Cookie');if(v){var t=[];for(var i=0;i<v.size();i++)t.push(String(v.get(i)));out.sc=t.join(';');}}catch(e2){}\n  }catch(e){out.h='';out.err=String(e);}\n  return out;\n}\nfunction pass(b){\n  try{\n    var r=REQ(b+'/index.php/ajax/verify_check?type=search','POST','i='+encodeURIComponent(tk()),rdCk(b));\n    wrCk(b,r.sc);\n    var s=String(r.h||'');\n    return s.indexOf('\"code\":1')>=0||s.indexOf('\"code\": 1')>=0;\n  }catch(e){return false;}\n}\nfunction G1(b,p){var r=REQ(b+p,'GET',null,rdCk(b));wrCk(b,r.sc);return String(r.h||'');}\nfunction fetch(b,p){\n  var h=G1(b,p);\n  if(okPage(h))return h;\n  for(var i=0;i<2;i++){\n    if(!pass(b))break;\n    try{Packages.java.lang.Thread.sleep(400);}catch(e){}\n    h=G1(b,p);\n    if(okPage(h))break;\n  }\n  return h;\n}\nfunction pick(p){\n  var a=ord(),last='';\n  for(var i=0;i<a.length;i++){\n    var h=fetch(a[i],p);\n    if(okPage(h)){if(a[i]!==curLine())sub('om_line',a[i]);return{h:h,b:a[i]};}\n    last=h;\n  }\n  return{h:last,b:a[0]};\n}\nfunction pth(u){var s=String(u==null?'':u),m=/^https?:\\/\\/[^\\/]+(\\/[^\\s]*)?$/.exec(s);return m?(m[1]||'/'):'/';}\nfunction abs(b,u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('http')===0)return u;if(u.indexOf('//')===0)return 'https:'+u;if(u.charAt(0)==='/')return b+u;return b+'/'+u;}\nfunction pic(u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('//')===0)return 'https:'+u;if(u.indexOf('http')===0){if(u.replace(/\\/+$/,'')==='https://as.cfhls.top')return '';return u;}if(u.charAt(0)==='/')return 'https://as.cfhls.top'+u;return u;}\nfunction Jp(h){try{return Packages.org.jsoup.Jsoup.parse(String(h||''));}catch(e){return null;}}\nfunction txt(e){try{return e?String(e.text()).trim():'';}catch(x){return '';}}\nfunction attr(e,n){try{return e?String(e.attr(n)||'').trim():'';}catch(x){return '';}}\nfunction first(d,sel){try{var e=d.select(sel);return e&&e.size()>0?e.get(0):null;}catch(x){return null;}}\nfunction parseList(h,b){\n  var out=[],seen={};\n  if(!h||gt(h))return out;\n  var d=Jp(h);if(!d)return out;\n  var as=null;\n  try{as=d.select('a[href*=/anime/]');}catch(e1){return out;}\n  if(!as)return out;\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);var u=attr(a,'href');\n    if(u.indexOf('/anime/')<0||u.indexOf('.html')<0)continue;\n    if(u.indexOf('/play/')>=0)continue;\n    var n=attr(a,'title');if(!n)n=txt(a);\n    if(!n||n.length>60)continue;\n    // 无封面不再跳过条目：隐藏轮播 banner 只有图床根路径背景，coverUrl 留空即可，\n    // 详情页规则会自动补封面。若同 URL 已有条目且旧的无封面、新的有封面，则用新的替换。\n    var p1=attr(a,'data-original');\n    if(!p1){var im=first(a,'img');if(im){p1=attr(im,'data-original')||attr(im,'src');}}\n    p1=pic(p1);\n    var old=seen[u];\n    if(old){\n      if(p1){var prev=null;try{prev=JSON.parse(out[old-1]);}catch(e8){}\n        if(prev&&!prev.coverUrl){\n          var kind2=prev.kind||'',last2=prev.lastChapter||'';\n          var li2=null;try{li2=a.parent();}catch(e9){}\n          var g2=0;while(li2&&g2++<4){var tg2='';try{tg2=String(li2.tagName());}catch(e10){}if(String(tg2).toLowerCase()==='li')break;try{li2=li2.parent();}catch(e11){li2=null;break;}}\n          if(li2){var bs2=null;try{bs2=li2.select('span b');}catch(e12){}if(bs2&&bs2.size()>=2){kind2=txt(bs2.get(0));last2=txt(bs2.get(bs2.size()-1));}}\n          out[old-1]=JSON.stringify({name:prev.name,bookUrl:prev.bookUrl,coverUrl:p1,kind:kind2,lastChapter:last2});\n        }\n      }\n      continue;\n    }\n    var kind='',last='';var li=null;try{li=a.parent();}catch(e4){}\n    var g=0;\n    while(li&&g++<4){var tg='';try{tg=String(li.tagName());}catch(e5){}if(String(tg).toLowerCase()==='li')break;try{li=li.parent();}catch(e6){li=null;break;}}\n    if(li){var bs=null;try{bs=li.select('span b');}catch(e7){}\n      if(bs&&bs.size()>=2){kind=txt(bs.get(0));last=txt(bs.get(bs.size()-1));}}\n    seen[u]=out.length+1;\n    out.push(JSON.stringify({name:n,bookUrl:abs(b,u),coverUrl:p1,kind:kind,lastChapter:last}));\n  }\n  return out;\n}\nfunction arr(list,out){try{var l=new Packages.java.util.ArrayList();for(var i=0;i<out.length;i++)l.add(out[i]);return l;}catch(e){return out;}}\n\nvar p=pth(baseUrl);\n// 少数版本 Legado 会把 baseUrl 里的百分号编码还原成中文，Java URL 不接受裸中文\nif(/[^\\x00-\\x7F]/.test(p)){try{p=encodeURI(p);}catch(ep){}}\nvar r=pick(p);\nvar out=okPage(r.h)?parseList(r.h,r.b):[];\nreturn arr(null,out);\n})()", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name"}, "ruleToc": {"chapterList": "@js:(function(){\nvar UA='Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n// 默认兜底线路（与发布页当前 4 条一致）；实际线路来自登录面板「一键从发布页获取」写入的 om_lines\nvar DEF_LINES=['https://www.omofuns.com','https://cn.233dm.com','https://cn.211dm.com','https://cn.agekkkk.com'];\nfunction lines(){\n  var raw=SV('om_lines'),a=null;\n  if(raw){try{a=JSON.parse(String(raw));}catch(e){a=null;}}\n  if(a&&a.length){\n    var r=[],seen={};\n    for(var i=0;i<a.length;i++){\n      var u=(typeof a[i]==='string')?a[i]:(a[i]&&a[i].u?String(a[i].u):'');\n      u=String(u).replace(/\\/+$/,'');\n      if(u.indexOf('https://')===0&&u.indexOf('fb.omoo')<0&&!seen[u]){seen[u]=1;r.push(u);}\n    }\n    if(r.length)return r;\n  }\n  // 兼容旧书源遗留的 om_sn / om_s1..8\n  var n=parseInt(SV('om_sn'),10)||0,r2=[];\n  for(var j=1;j<=n&&j<=8;j++){var v=SV('om_s'+j).replace(/\\/+$/,'');if(v.indexOf('https://')===0)r2.push(v);}\n  if(r2.length)return r2;\n  return DEF_LINES;\n}\nvar K=[78,63,169,194,18,125,136,239,85,170,11,205,222,173,190,239];\nfunction S(v){try{var s=String(v==null?'':v);return (s==='null'||s==='undefined'||s==='[object Object]'||s==='JsNull')?'':s;}catch(e){return '';}}\nfunction SV(k){try{return S(source.get(k));}catch(e){return '';}}\nfunction sub(k,v){try{source.put(k,String(v));}catch(e){}}\nfunction curLine(){var c=SV('om_line').replace(/\\/+$/,''),a=lines();if(c.indexOf('https://')===0&&c.indexOf('fb.omoo')<0){for(var i=0;i<a.length;i++)if(a[i]===c)return c;if(c===SV('om_custom').replace(/\\/+$/,''))return c;}return a[0];}\nfunction hostOf(u){var s=String(u==null?'':u),m=/^https?:\\/\\/([^\\/]+)/.exec(s);if(!m)return '';var hn=m[1],a=lines();for(var i=0;i<a.length;i++){if(a[i].replace(/^https?:\\/\\//,'')===hn)return a[i];}if(s.indexOf('https://')===0)return 'https://'+hn;return '';}\nfunction ord(){var c=curLine(),a=lines(),r=[c];for(var i=0;i<a.length;i++){if(a[i]!==c)r.push(a[i]);}return r;}\nfunction gt(h){h=String(h==null?'':h);if(!h)return true;return h.indexOf('\\u7cfb\\u7edf\\u5b89\\u5168\\u9a8c\\u8bc1')>=0||h.indexOf('verify_check')>=0;}\nfunction okPage(h){h=String(h==null?'':h);if(!h||h.length<8000)return false;if(gt(h))return false;return true;}\nfunction b64(s){var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',o='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i)&255,b=i+1<s.length?s.charCodeAt(i+1)&255:null,c=i+2<s.length?s.charCodeAt(i+2)&255:null,n=(a<<16)|((b||0)<<8)|(c||0);o+=t.charAt((n>>18)&63)+t.charAt((n>>12)&63)+(b===null?'=':t.charAt((n>>6)&63))+(c===null?'=':t.charAt(n&63));}return o;}\nfunction tk(){var ts=String(Date.now()),p='';for(var i=0;i<ts.length;i++)p+=String.fromCharCode(ts.charCodeAt(i)^K[i%16]);return b64(p);}\nfunction b64b(s){\n  // 用 ByteArrayOutputStream 生成 byte[]，避开反射建数组的高危 API\n  // （Legado 登录面板/部分真机环境里该 Class 会被解析成 JavaPackage 而非类）\n  var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n  var bos=new Packages.java.io.ByteArrayOutputStream(),buf=0,bits=0,i,ch,v;\n  for(i=0;i<s.length;i++){\n    ch=s.charAt(i);\n    if(ch==='='||ch==='\\n'||ch==='\\r'||ch===' ')continue;\n    v=t.indexOf(ch);\n    if(v<0)continue;\n    buf=((buf<<6)|v)&0x3FFFFF;bits+=6;\n    if(bits>=8){bits-=8;bos.write((buf>>bits)&255);}\n  }\n  return bos.toByteArray();\n}\nfunction hk(b){var m=/^https?:\\/\\/([^\\/]+)/.exec(String(b||''));return m?('om_ck_'+m[1]):'om_ck_x';}\nfunction rdCk(b){return SV(hk(b));}\nfunction wrCk(b,sc){if(!sc)return;var parts=String(sc).split(';');var kv=parts[0];if(kv&&kv.indexOf('=')>0){var old=rdCk(b),name=kv.split('=')[0];var keep=[];if(old){var o=old.split(';');for(var i=0;i<o.length;i++){var p=String(o[i]).replace(/^\\s+/,'');if(p&&p.split('=')[0]!==name)keep.push(p);}}keep.push(kv);sub(hk(b),keep.join('; '));}}\nfunction TXT(c){\n  // 文本流读法：InputStream -> (gzip 则包 GZIPInputStream) -> BufferedReader 逐行。\n  // 全程不创建 Java byte[]，避开反射建数组的高危 API。\n  var is=c.getInputStream();\n  try{\n    var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);\n  }catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\n// 最后一次重试用：跳过 SSL 证书/主机名校验（应对被劫持的线路或自签播放器证书）\nfunction looseSSL(c){\n  // 最后一次重试兜底：只跳过主机名校验（足以应对 CN=*.10086.cn 这类劫持证书）。\n  // 不再自建 TrustManager[] —— 那需要反射创建 Java 数组，真机会崩。\n  try{\n    var hv=new JavaAdapter(Packages.javax.net.ssl.HostnameVerifier,{verify:function(a,b){return true;}});\n    c.setHostnameVerifier(hv);\n  }catch(e){}\n}\nfunction REQ(url,method,body,ck,loose){\n  var out={code:0,h:'',sc:''};\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod(method||'GET');\n    c.setConnectTimeout(8000);c.setReadTimeout(15000);\n    c.setInstanceFollowRedirects(true);\n    if(loose)looseSSL(c);\n    c.setRequestProperty('User-Agent',UA);\n    c.setRequestProperty('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    if(ck)c.setRequestProperty('Cookie',String(ck));\n    if(body!=null){c.setDoOutput(true);c.setRequestProperty('Content-Type','application/x-www-form-urlencoded');var os=c.getOutputStream();os.write(new Packages.java.lang.String(String(body)).getBytes('UTF-8'));os.flush();os.close();}\n    out.code=c.getResponseCode();\n    try{out.h=TXT(c);}catch(e1){out.h='';}\n    try{var v=c.getHeaderFields().get('Set-Cookie');if(v){var t=[];for(var i=0;i<v.size();i++)t.push(String(v.get(i)));out.sc=t.join(';');}}catch(e2){}\n  }catch(e){out.h='';out.err=String(e);}\n  return out;\n}\nfunction pass(b){\n  try{\n    var r=REQ(b+'/index.php/ajax/verify_check?type=search','POST','i='+encodeURIComponent(tk()),rdCk(b));\n    wrCk(b,r.sc);\n    var s=String(r.h||'');\n    return s.indexOf('\"code\":1')>=0||s.indexOf('\"code\": 1')>=0;\n  }catch(e){return false;}\n}\nfunction G1(b,p){var r=REQ(b+p,'GET',null,rdCk(b));wrCk(b,r.sc);return String(r.h||'');}\nfunction fetch(b,p){\n  var h=G1(b,p);\n  if(okPage(h))return h;\n  for(var i=0;i<2;i++){\n    if(!pass(b))break;\n    try{Packages.java.lang.Thread.sleep(400);}catch(e){}\n    h=G1(b,p);\n    if(okPage(h))break;\n  }\n  return h;\n}\nfunction pick(p){\n  var a=ord(),last='';\n  for(var i=0;i<a.length;i++){\n    var h=fetch(a[i],p);\n    if(okPage(h)){if(a[i]!==curLine())sub('om_line',a[i]);return{h:h,b:a[i]};}\n    last=h;\n  }\n  return{h:last,b:a[0]};\n}\nfunction pth(u){var s=String(u==null?'':u),m=/^https?:\\/\\/[^\\/]+(\\/[^\\s]*)?$/.exec(s);return m?(m[1]||'/'):'/';}\nfunction abs(b,u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('http')===0)return u;if(u.indexOf('//')===0)return 'https:'+u;if(u.charAt(0)==='/')return b+u;return b+'/'+u;}\nfunction pic(u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('//')===0)return 'https:'+u;if(u.indexOf('http')===0){if(u.replace(/\\/+$/,'')==='https://as.cfhls.top')return '';return u;}if(u.charAt(0)==='/')return 'https://as.cfhls.top'+u;return u;}\nfunction Jp(h){try{return Packages.org.jsoup.Jsoup.parse(String(h||''));}catch(e){return null;}}\nfunction txt(e){try{return e?String(e.text()).trim():'';}catch(x){return '';}}\nfunction attr(e,n){try{return e?String(e.attr(n)||'').trim():'';}catch(x){return '';}}\nfunction first(d,sel){try{var e=d.select(sel);return e&&e.size()>0?e.get(0):null;}catch(x){return null;}}\nfunction parseList(h,b){\n  var out=[],seen={};\n  if(!h||gt(h))return out;\n  var d=Jp(h);if(!d)return out;\n  var as=null;\n  try{as=d.select('a[href*=/anime/]');}catch(e1){return out;}\n  if(!as)return out;\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);var u=attr(a,'href');\n    if(u.indexOf('/anime/')<0||u.indexOf('.html')<0)continue;\n    if(u.indexOf('/play/')>=0)continue;\n    var n=attr(a,'title');if(!n)n=txt(a);\n    if(!n||n.length>60)continue;\n    // 无封面不再跳过条目：隐藏轮播 banner 只有图床根路径背景，coverUrl 留空即可，\n    // 详情页规则会自动补封面。若同 URL 已有条目且旧的无封面、新的有封面，则用新的替换。\n    var p1=attr(a,'data-original');\n    if(!p1){var im=first(a,'img');if(im){p1=attr(im,'data-original')||attr(im,'src');}}\n    p1=pic(p1);\n    var old=seen[u];\n    if(old){\n      if(p1){var prev=null;try{prev=JSON.parse(out[old-1]);}catch(e8){}\n        if(prev&&!prev.coverUrl){\n          var kind2=prev.kind||'',last2=prev.lastChapter||'';\n          var li2=null;try{li2=a.parent();}catch(e9){}\n          var g2=0;while(li2&&g2++<4){var tg2='';try{tg2=String(li2.tagName());}catch(e10){}if(String(tg2).toLowerCase()==='li')break;try{li2=li2.parent();}catch(e11){li2=null;break;}}\n          if(li2){var bs2=null;try{bs2=li2.select('span b');}catch(e12){}if(bs2&&bs2.size()>=2){kind2=txt(bs2.get(0));last2=txt(bs2.get(bs2.size()-1));}}\n          out[old-1]=JSON.stringify({name:prev.name,bookUrl:prev.bookUrl,coverUrl:p1,kind:kind2,lastChapter:last2});\n        }\n      }\n      continue;\n    }\n    var kind='',last='';var li=null;try{li=a.parent();}catch(e4){}\n    var g=0;\n    while(li&&g++<4){var tg='';try{tg=String(li.tagName());}catch(e5){}if(String(tg).toLowerCase()==='li')break;try{li=li.parent();}catch(e6){li=null;break;}}\n    if(li){var bs=null;try{bs=li.select('span b');}catch(e7){}\n      if(bs&&bs.size()>=2){kind=txt(bs.get(0));last=txt(bs.get(bs.size()-1));}}\n    seen[u]=out.length+1;\n    out.push(JSON.stringify({name:n,bookUrl:abs(b,u),coverUrl:p1,kind:kind,lastChapter:last}));\n  }\n  return out;\n}\nfunction arr(list,out){try{var l=new Packages.java.util.ArrayList();for(var i=0;i<out.length;i++)l.add(out[i]);return l;}catch(e){return out;}}\n\nvar b=hostOf(baseUrl)||curLine(),h=String(result||'');\nfunction tp(hh,bb){\n var out=[],seen={},d=Jp(hh);\n if(!d)return out;\n try{\n   var pane=first(d,'div[id^=playlist]');\n   var as=null;\n   try{if(pane)as=pane.select('a[href*=/play/]');}catch(e1){}\n   if(!as||as.size()===0){try{as=d.select('div[id^=playlist] a[href*=/play/]');}catch(e2){}} \n   if(!as||as.size()===0){try{as=d.select('a[href*=/play/]');}catch(e3){}} \n   if(as&&as.size()>0){\n     for(var i=0;i<as.size();i++){\n       var a=as.get(i),u=attr(a,'href');\n       if(u.indexOf('/play/')<0||seen[u])continue;\n       seen[u]=1;\n       var n=attr(a,'title')||txt(a);\n       if(!n)n='\\u7b2c'+(out.length+1)+'\\u96c6';\n       out.push(JSON.stringify({n:n,u:abs(bb,u)}));\n     }\n   }\n }catch(ez){}\n return out;\n}\nvar out=gt(h)?[]:tp(h,b);\nif(out.length===0){var r1=pick(pth(baseUrl));out=tp(r1.h,r1.b);}\nreturn arr(null,out);\n})()", "chapterName": "$.n", "chapterUrl": "$.u"}, "searchUrl": "@js:(function(){\nvar UA='Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n// 默认兜底线路（与发布页当前 4 条一致）；实际线路来自登录面板「一键从发布页获取」写入的 om_lines\nvar DEF_LINES=['https://www.omofuns.com','https://cn.233dm.com','https://cn.211dm.com','https://cn.agekkkk.com'];\nfunction lines(){\n  var raw=SV('om_lines'),a=null;\n  if(raw){try{a=JSON.parse(String(raw));}catch(e){a=null;}}\n  if(a&&a.length){\n    var r=[],seen={};\n    for(var i=0;i<a.length;i++){\n      var u=(typeof a[i]==='string')?a[i]:(a[i]&&a[i].u?String(a[i].u):'');\n      u=String(u).replace(/\\/+$/,'');\n      if(u.indexOf('https://')===0&&u.indexOf('fb.omoo')<0&&!seen[u]){seen[u]=1;r.push(u);}\n    }\n    if(r.length)return r;\n  }\n  // 兼容旧书源遗留的 om_sn / om_s1..8\n  var n=parseInt(SV('om_sn'),10)||0,r2=[];\n  for(var j=1;j<=n&&j<=8;j++){var v=SV('om_s'+j).replace(/\\/+$/,'');if(v.indexOf('https://')===0)r2.push(v);}\n  if(r2.length)return r2;\n  return DEF_LINES;\n}\nvar K=[78,63,169,194,18,125,136,239,85,170,11,205,222,173,190,239];\nfunction S(v){try{var s=String(v==null?'':v);return (s==='null'||s==='undefined'||s==='[object Object]'||s==='JsNull')?'':s;}catch(e){return '';}}\nfunction SV(k){try{return S(source.get(k));}catch(e){return '';}}\nfunction sub(k,v){try{source.put(k,String(v));}catch(e){}}\nfunction curLine(){var c=SV('om_line').replace(/\\/+$/,''),a=lines();if(c.indexOf('https://')===0&&c.indexOf('fb.omoo')<0){for(var i=0;i<a.length;i++)if(a[i]===c)return c;if(c===SV('om_custom').replace(/\\/+$/,''))return c;}return a[0];}\nfunction hostOf(u){var s=String(u==null?'':u),m=/^https?:\\/\\/([^\\/]+)/.exec(s);if(!m)return '';var hn=m[1],a=lines();for(var i=0;i<a.length;i++){if(a[i].replace(/^https?:\\/\\//,'')===hn)return a[i];}if(s.indexOf('https://')===0)return 'https://'+hn;return '';}\nfunction ord(){var c=curLine(),a=lines(),r=[c];for(var i=0;i<a.length;i++){if(a[i]!==c)r.push(a[i]);}return r;}\nfunction gt(h){h=String(h==null?'':h);if(!h)return true;return h.indexOf('\\u7cfb\\u7edf\\u5b89\\u5168\\u9a8c\\u8bc1')>=0||h.indexOf('verify_check')>=0;}\nfunction okPage(h){h=String(h==null?'':h);if(!h||h.length<8000)return false;if(gt(h))return false;return true;}\nfunction b64(s){var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',o='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i)&255,b=i+1<s.length?s.charCodeAt(i+1)&255:null,c=i+2<s.length?s.charCodeAt(i+2)&255:null,n=(a<<16)|((b||0)<<8)|(c||0);o+=t.charAt((n>>18)&63)+t.charAt((n>>12)&63)+(b===null?'=':t.charAt((n>>6)&63))+(c===null?'=':t.charAt(n&63));}return o;}\nfunction tk(){var ts=String(Date.now()),p='';for(var i=0;i<ts.length;i++)p+=String.fromCharCode(ts.charCodeAt(i)^K[i%16]);return b64(p);}\nfunction b64b(s){\n  // 用 ByteArrayOutputStream 生成 byte[]，避开反射建数组的高危 API\n  // （Legado 登录面板/部分真机环境里该 Class 会被解析成 JavaPackage 而非类）\n  var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n  var bos=new Packages.java.io.ByteArrayOutputStream(),buf=0,bits=0,i,ch,v;\n  for(i=0;i<s.length;i++){\n    ch=s.charAt(i);\n    if(ch==='='||ch==='\\n'||ch==='\\r'||ch===' ')continue;\n    v=t.indexOf(ch);\n    if(v<0)continue;\n    buf=((buf<<6)|v)&0x3FFFFF;bits+=6;\n    if(bits>=8){bits-=8;bos.write((buf>>bits)&255);}\n  }\n  return bos.toByteArray();\n}\nfunction hk(b){var m=/^https?:\\/\\/([^\\/]+)/.exec(String(b||''));return m?('om_ck_'+m[1]):'om_ck_x';}\nfunction rdCk(b){return SV(hk(b));}\nfunction wrCk(b,sc){if(!sc)return;var parts=String(sc).split(';');var kv=parts[0];if(kv&&kv.indexOf('=')>0){var old=rdCk(b),name=kv.split('=')[0];var keep=[];if(old){var o=old.split(';');for(var i=0;i<o.length;i++){var p=String(o[i]).replace(/^\\s+/,'');if(p&&p.split('=')[0]!==name)keep.push(p);}}keep.push(kv);sub(hk(b),keep.join('; '));}}\nfunction TXT(c){\n  // 文本流读法：InputStream -> (gzip 则包 GZIPInputStream) -> BufferedReader 逐行。\n  // 全程不创建 Java byte[]，避开反射建数组的高危 API。\n  var is=c.getInputStream();\n  try{\n    var enc=c.getHeaderField('Content-Encoding');\n    if(enc&&String(enc).toLowerCase().indexOf('gzip')>=0)\n      is=new Packages.java.util.zip.GZIPInputStream(is);\n  }catch(e){}\n  var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n  var sb=new Packages.java.lang.StringBuilder(),ln;\n  while((ln=br.readLine())!==null)sb.append(ln).append('\\n');\n  try{br.close();}catch(e2){}\n  return String(sb.toString());\n}\n// 最后一次重试用：跳过 SSL 证书/主机名校验（应对被劫持的线路或自签播放器证书）\nfunction looseSSL(c){\n  // 最后一次重试兜底：只跳过主机名校验（足以应对 CN=*.10086.cn 这类劫持证书）。\n  // 不再自建 TrustManager[] —— 那需要反射创建 Java 数组，真机会崩。\n  try{\n    var hv=new JavaAdapter(Packages.javax.net.ssl.HostnameVerifier,{verify:function(a,b){return true;}});\n    c.setHostnameVerifier(hv);\n  }catch(e){}\n}\nfunction REQ(url,method,body,ck,loose){\n  var out={code:0,h:'',sc:''};\n  try{\n    var c=new Packages.java.net.URL(String(url)).openConnection();\n    c.setRequestMethod(method||'GET');\n    c.setConnectTimeout(8000);c.setReadTimeout(15000);\n    c.setInstanceFollowRedirects(true);\n    if(loose)looseSSL(c);\n    c.setRequestProperty('User-Agent',UA);\n    c.setRequestProperty('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');\n    c.setRequestProperty('Accept-Language','zh-CN,zh;q=0.9');\n    c.setRequestProperty('Accept-Encoding','gzip, deflate');\n    if(ck)c.setRequestProperty('Cookie',String(ck));\n    if(body!=null){c.setDoOutput(true);c.setRequestProperty('Content-Type','application/x-www-form-urlencoded');var os=c.getOutputStream();os.write(new Packages.java.lang.String(String(body)).getBytes('UTF-8'));os.flush();os.close();}\n    out.code=c.getResponseCode();\n    try{out.h=TXT(c);}catch(e1){out.h='';}\n    try{var v=c.getHeaderFields().get('Set-Cookie');if(v){var t=[];for(var i=0;i<v.size();i++)t.push(String(v.get(i)));out.sc=t.join(';');}}catch(e2){}\n  }catch(e){out.h='';out.err=String(e);}\n  return out;\n}\nfunction pass(b){\n  try{\n    var r=REQ(b+'/index.php/ajax/verify_check?type=search','POST','i='+encodeURIComponent(tk()),rdCk(b));\n    wrCk(b,r.sc);\n    var s=String(r.h||'');\n    return s.indexOf('\"code\":1')>=0||s.indexOf('\"code\": 1')>=0;\n  }catch(e){return false;}\n}\nfunction G1(b,p){var r=REQ(b+p,'GET',null,rdCk(b));wrCk(b,r.sc);return String(r.h||'');}\nfunction fetch(b,p){\n  var h=G1(b,p);\n  if(okPage(h))return h;\n  for(var i=0;i<2;i++){\n    if(!pass(b))break;\n    try{Packages.java.lang.Thread.sleep(400);}catch(e){}\n    h=G1(b,p);\n    if(okPage(h))break;\n  }\n  return h;\n}\nfunction pick(p){\n  var a=ord(),last='';\n  for(var i=0;i<a.length;i++){\n    var h=fetch(a[i],p);\n    if(okPage(h)){if(a[i]!==curLine())sub('om_line',a[i]);return{h:h,b:a[i]};}\n    last=h;\n  }\n  return{h:last,b:a[0]};\n}\nfunction pth(u){var s=String(u==null?'':u),m=/^https?:\\/\\/[^\\/]+(\\/[^\\s]*)?$/.exec(s);return m?(m[1]||'/'):'/';}\nfunction abs(b,u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('http')===0)return u;if(u.indexOf('//')===0)return 'https:'+u;if(u.charAt(0)==='/')return b+u;return b+'/'+u;}\nfunction pic(u){u=String(u==null?'':u).trim();if(!u)return '';if(u.indexOf('//')===0)return 'https:'+u;if(u.indexOf('http')===0){if(u.replace(/\\/+$/,'')==='https://as.cfhls.top')return '';return u;}if(u.charAt(0)==='/')return 'https://as.cfhls.top'+u;return u;}\nfunction Jp(h){try{return Packages.org.jsoup.Jsoup.parse(String(h||''));}catch(e){return null;}}\nfunction txt(e){try{return e?String(e.text()).trim():'';}catch(x){return '';}}\nfunction attr(e,n){try{return e?String(e.attr(n)||'').trim():'';}catch(x){return '';}}\nfunction first(d,sel){try{var e=d.select(sel);return e&&e.size()>0?e.get(0):null;}catch(x){return null;}}\nfunction parseList(h,b){\n  var out=[],seen={};\n  if(!h||gt(h))return out;\n  var d=Jp(h);if(!d)return out;\n  var as=null;\n  try{as=d.select('a[href*=/anime/]');}catch(e1){return out;}\n  if(!as)return out;\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);var u=attr(a,'href');\n    if(u.indexOf('/anime/')<0||u.indexOf('.html')<0)continue;\n    if(u.indexOf('/play/')>=0)continue;\n    var n=attr(a,'title');if(!n)n=txt(a);\n    if(!n||n.length>60)continue;\n    // 无封面不再跳过条目：隐藏轮播 banner 只有图床根路径背景，coverUrl 留空即可，\n    // 详情页规则会自动补封面。若同 URL 已有条目且旧的无封面、新的有封面，则用新的替换。\n    var p1=attr(a,'data-original');\n    if(!p1){var im=first(a,'img');if(im){p1=attr(im,'data-original')||attr(im,'src');}}\n    p1=pic(p1);\n    var old=seen[u];\n    if(old){\n      if(p1){var prev=null;try{prev=JSON.parse(out[old-1]);}catch(e8){}\n        if(prev&&!prev.coverUrl){\n          var kind2=prev.kind||'',last2=prev.lastChapter||'';\n          var li2=null;try{li2=a.parent();}catch(e9){}\n          var g2=0;while(li2&&g2++<4){var tg2='';try{tg2=String(li2.tagName());}catch(e10){}if(String(tg2).toLowerCase()==='li')break;try{li2=li2.parent();}catch(e11){li2=null;break;}}\n          if(li2){var bs2=null;try{bs2=li2.select('span b');}catch(e12){}if(bs2&&bs2.size()>=2){kind2=txt(bs2.get(0));last2=txt(bs2.get(bs2.size()-1));}}\n          out[old-1]=JSON.stringify({name:prev.name,bookUrl:prev.bookUrl,coverUrl:p1,kind:kind2,lastChapter:last2});\n        }\n      }\n      continue;\n    }\n    var kind='',last='';var li=null;try{li=a.parent();}catch(e4){}\n    var g=0;\n    while(li&&g++<4){var tg='';try{tg=String(li.tagName());}catch(e5){}if(String(tg).toLowerCase()==='li')break;try{li=li.parent();}catch(e6){li=null;break;}}\n    if(li){var bs=null;try{bs=li.select('span b');}catch(e7){}\n      if(bs&&bs.size()>=2){kind=txt(bs.get(0));last=txt(bs.get(bs.size()-1));}}\n    seen[u]=out.length+1;\n    out.push(JSON.stringify({name:n,bookUrl:abs(b,u),coverUrl:p1,kind:kind,lastChapter:last}));\n  }\n  return out;\n}\nfunction arr(list,out){try{var l=new Packages.java.util.ArrayList();for(var i=0;i<out.length;i++)l.add(out[i]);return l;}catch(e){return out;}}\n\nvar b=curLine();\nreturn b+'/search/'+encodeURIComponent(String(key))+'----------{{page}}---.html';\n})()", "weight": 0},{"bookSourceGroup": "test", "bookSourceName": "test", "bookSourceType": 0, "bookSourceUrl": "https://www.ahcy.net", "searchUrl": "https://www.ahcy.net/modules/article/search.php?searchkey={{key}}", "bookUrlPattern": "http?:\\/\\/www\\.ahcy\\.net\\/\\d+\\/\\d+\\/", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": false, "lastUpdateTime": "1794459051169", "respondTime": 180000, "ruleBookInfo": {"name": "#info h1@text", "author": "#info p:nth-child(2)@text", "coverUrl": "#fmimg img@src", "intro": "#intro@text", "kind": "#info p:nth-child(1)@text", "lastChapter": "#info p:nth-child(4) a@text", "tocUrl": ""}, "ruleContent": {"content": "#content@html", "title": ".bookname h1@text", "replaceRegex": [["<script.*?</script>", ""], ["记住本书.*?小说", ""], ["www\\.ahcy\\.net", ""], ["\\s{2,}", "\n"]]}, "ruleExplore": [], "ruleSearch": {"bookList": "table tbody tr", "name": "td:nth-child(1) a@text", "author": "td:nth-child(3)@text", "coverUrl": "", "bookUrl": "td:nth-child(1) a@href", "lastChapter": "td:nth-child(2) a@text"}, "ruleToc": {"chapterList": "#list dl dd a", "chapterName": "ownText", "chapterUrl": "href", "nextTocUrl": ""}, "weight": 0},{"bookSourceComment": "把 B 站当有声书库：搜索/发现 -> 视频 = 一本书，分P = 一章，播放该分P的音频轨。\n逻辑严格对齐开源项目 abts（github.com/fengqiao57/abts）：WBI 签名、听书过滤规则同源。\n免登录可用。首次使用会先预热 Cookie 并做 gaia 风控激活，稍等即可。\n未登录最高 64K 音质（dash id 30216）；导入含 SESSDATA 的 Cookie 可解锁更高音质。\n音频流有时效（约 2 小时），但每章播放前都会重新取流，不存在过期问题。\n遇到 -412「网络繁忙」已内置自动退避重试；持续报错可稍后再试。", "bookSourceGroup": "听书", "bookSourceName": "哔哩哔哩听书", "bookSourceType": 1, "bookSourceUrl": "https://www.bilibili.com", "concurrentRate": "1/400", "customButton": false, "customOrder": 16, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>biliExploreUrl()</js>", "header": "{\"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36\",\"Referer\":\"https://www.bilibili.com\",\"Origin\":\"https://www.bilibili.com\"}", "jsLib": "/* =====================================================================\n * 哔哩哔哩听书 · Legado 书源公共库 (jsLib)\n * ---------------------------------------------------------------------\n * 逻辑严格对齐 abts (github.com/fengqiao57/abts) 的 lib/core/network/\n * wbi_signer.dart 与 lib/services/bili_api.dart。\n *\n * 注意：Rhino 环境下访问不到 java.md5Encode，因此这里自带纯 JS MD5。\n * 所有函数均为纯计算（不触碰 java/http），网络动作在各 rule 的 JS 里完成。\n * ===================================================================== */\n\nvar BILI_HOME = 'https://www.bilibili.com';\nvar BILI_API = 'https://api.bilibili.com';\nvar BILI_SEARCH_HOME = 'https://search.bilibili.com';\nvar BILI_UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36';\n\n/* ---------- 状态码：命中这些视为风控，需要重试 ---------- */\nvar BILI_RISK_CODES = { '-412': 1, '-352': 1, '-509': 1 };\n\n/* =====================================================================\n * 一、纯 JS MD5（UTF-8 友好，中文关键词必须走 UTF-8）\n * ===================================================================== */\n\nfunction biliUtf8Bytes(str) {\n  var out = [], i = 0, c, c2, cc;\n  var s = String(str);\n  while (i < s.length) {\n    c = s.charCodeAt(i++);\n    if (c < 0x80) {\n      out.push(c);\n    } else if (c < 0x800) {\n      out.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f));\n    } else if (c >= 0xd800 && c < 0xdc00 && i < s.length) {\n      // 代理对\n      c2 = s.charCodeAt(i++);\n      cc = 0x10000 + ((c & 0x3ff) << 10) + (c2 & 0x3ff);\n      out.push(\n        0xf0 | (cc >> 18),\n        0x80 | ((cc >> 12) & 0x3f),\n        0x80 | ((cc >> 6) & 0x3f),\n        0x80 | (cc & 0x3f)\n      );\n    } else {\n      out.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f));\n    }\n  }\n  return out;\n}\n\nvar BILI_MD5_S = [\n  7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,\n  5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,\n  4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,\n  6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21\n];\n\nvar BILI_MD5_K = (function () {\n  var k = [], i;\n  for (i = 0; i < 64; i++) {\n    k[i] = Math.floor(Math.abs(Math.sin(i + 1)) * 4294967296) & 0xffffffff;\n  }\n  return k;\n})();\n\nfunction biliHex32(n) {\n  var r = '', v, k;\n  for (k = 0; k < 4; k++) {\n    v = (n >>> (k * 8)) & 0xff;\n    r += (v < 16 ? '0' : '') + v.toString(16);\n  }\n  return r;\n}\n\nfunction biliMd5(str) {\n  var b = biliUtf8Bytes(str);\n  var len = b.length;\n  var i, j;\n  // 填充\n  b.push(0x80);\n  while (b.length % 64 !== 56) b.push(0);\n  var bitHi = Math.floor((len * 8) / 4294967296);\n  var bitLo = (len * 8) >>> 0;\n  b.push(bitLo & 0xff, (bitLo >>> 8) & 0xff, (bitLo >>> 16) & 0xff, (bitLo >>> 24) & 0xff);\n  b.push(bitHi & 0xff, (bitHi >>> 8) & 0xff, (bitHi >>> 16) & 0xff, (bitHi >>> 24) & 0xff);\n\n  var v1 = 0x67452301, v2 = 0xefcdab89, v3 = 0x98badcfe, v4 = 0x10325476;\n  var M = [], A, B, C, D, F, g;\n\n  function rotl(x, n) {\n    return ((x << n) | (x >>> (32 - n))) >>> 0;\n  }\n\n  for (i = 0; i < b.length; i += 64) {\n    for (j = 0; j < 16; j++) {\n      M[j] = (b[i + j * 4] |\n        (b[i + j * 4 + 1] << 8) |\n        (b[i + j * 4 + 2] << 16) |\n        (b[i + j * 4 + 3] << 24)) >>> 0;\n    }\n    A = v1; B = v2; C = v3; D = v4;\n    for (j = 0; j < 64; j++) {\n      if (j < 16) {\n        F = (B & C) | (~B & D); g = j;\n      } else if (j < 32) {\n        F = (D & B) | (~D & C); g = (5 * j + 1) % 16;\n      } else if (j < 48) {\n        F = B ^ C ^ D; g = (3 * j + 5) % 16;\n      } else {\n        F = C ^ (B | ~D); g = (7 * j) % 16;\n      }\n      F = (F + A + BILI_MD5_K[j] + M[g]) >>> 0;\n      A = D; D = C; C = B;\n      B = (B + rotl(F, BILI_MD5_S[j])) >>> 0;\n    }\n    v1 = (v1 + A) >>> 0;\n    v2 = (v2 + B) >>> 0;\n    v3 = (v3 + C) >>> 0;\n    v4 = (v4 + D) >>> 0;\n  }\n  return biliHex32(v1) + biliHex32(v2) + biliHex32(v3) + biliHex32(v4);\n}\n\n/* =====================================================================\n * 二、WBI 签名 —— 对齐 wbi_signer.dart\n * ===================================================================== */\n\nvar BILI_MIXIN_TAB = [\n  46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35,\n  27, 43, 5, 49, 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13,\n  37, 48, 7, 16, 24, 55, 40, 61, 26, 17, 0, 1, 60, 51, 30, 4,\n  22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, 36, 20, 34, 44, 52\n];\n\nfunction biliMixinKey(orig) {\n  var s = '', i;\n  for (i = 0; i < 32; i++) s += orig.charAt(BILI_MIXIN_TAB[i]);\n  return s;\n}\n\n/** 从 https://i0.hdslb.com/bfs/wbi/xxx.png 提取 xxx */\nfunction biliKeyOf(url) {\n  var name = url.substring(url.lastIndexOf('/') + 1);\n  var dot = name.lastIndexOf('.');\n  return dot > 0 ? name.substring(0, dot) : name;\n}\n\n/** 对齐 Dart: 先剔除 !'()* 再做 encodeURIComponent */\nfunction biliWbiEncode(v) {\n  var s = String(v).replace(/[!'()*]/g, '');\n  return encodeURIComponent(s);\n}\n\n/**\n * 对参数对象做 WBI 签名，返回可直接拼接的 query string（不含前导 ?）\n * params: 普通对象；会就地加入 wts 与 w_rid\n */\nfunction biliSignQuery(params, imgUrl, subUrl) {\n  var mk = biliMixinKey(biliKeyOf(imgUrl) + biliKeyOf(subUrl));\n  params.wts = Math.floor(Date.now() / 1000);\n  var keys = [], k, i;\n  for (k in params) {\n    if (params.hasOwnProperty(k) && params[k] !== null && params[k] !== undefined) keys.push(k);\n  }\n  keys.sort();\n  var buf = '';\n  for (i = 0; i < keys.length; i++) {\n    buf += biliWbiEncode(keys[i]) + '=' + biliWbiEncode(params[keys[i]]) + '&';\n  }\n  var noTail = buf.substring(0, buf.length - 1);\n  params.w_rid = biliMd5(noTail + mk);\n  var qs = '', head = '';\n  for (i = 0; i < keys.length; i++) {\n    qs += head + encodeURIComponent(keys[i]) + '=' + encodeURIComponent(params[keys[i]]);\n    head = '&';\n  }\n  qs += '&w_rid=' + params.w_rid;\n  return qs;\n}\n\n/* =====================================================================\n * 三、听书内容判定 —— 对齐 bili_api.dart 的 _isAudiobookItem\n * ===================================================================== */\n\nvar BILI_AUDIO_HINTS = [\n  '有声小说', '有声书', '有声剧', '有声读物', '有声', '听书', '评书', '相声',\n  '广播剧', '演播', '朗读', '诵读', '长书', '连播', '说书', '单口', '播讲',\n  '多人剧', '小说剧'\n];\nvar BILI_NOISE_HINTS = [\n  '一口气看完', '漫推', '漫画', '解说', '讲解', '解读', '动画', '鬼畜', '混剪',\n  '沙雕', '速看', 'reaction', '预告', '游戏实况', '配音秀'\n];\nvar BILI_GENRE_HINTS = [\n  '评书', '相声', '广播剧', '听书', '演播', '朗读', '诵读', '长书', '连播',\n  '说书', '单口', '播讲'\n];\nvar BILI_AUDIO_TYPE_ID = 195;\n\nfunction biliHas(str, arr) {\n  var i;\n  for (i = 0; i < arr.length; i++) {\n    if (str.indexOf(arr[i]) >= 0) return true;\n  }\n  return false;\n}\n\n/** 去掉搜索结果标题里的 <em class=\"keyword\"> 高亮标签 */\nfunction biliCleanTitle(t) {\n  return String(t == null ? '' : t)\n    .replace(/<em class=\"keyword\">/g, '')\n    .replace(/<\\/em>/g, '');\n}\n\n/** 封面协议归一化：//i0.hdslb.com 与 http:// 统一转 https */\nfunction biliNormalizePic(u) {\n  var s = String(u == null ? '' : u).trim();\n  if (!s) return s;\n  if (s.indexOf('//') === 0) return 'https:' + s;\n  if (s.indexOf('http://') === 0) return 'https://' + s.substring(7);\n  return s;\n}\n\n/** duration 可能是秒数，也可能是 \"1:02:03\" / \"5152:33\" 字符串 */\nfunction biliDurSec(v) {\n  if (v === null || v === undefined) return 0;\n  if (typeof v === 'number') return v;\n  var s = String(v).trim();\n  if (!s) return 0;\n  var p = s.split(':');\n  if (p.length >= 2) {\n    var t = 0, i;\n    for (i = 0; i < p.length; i++) t = t * 60 + (parseInt(p[i].trim(), 10) || 0);\n    return t;\n  }\n  return parseInt(s, 10) || 0;\n}\n\n/**\n * 是否算听书内容。\n * title/tag/desc/typeid/duration 来自搜索条目，keyword 为搜索词（可空）。\n */\nfunction biliIsAudiobook(title, tag, desc, typeid, duration, keyword) {\n  title = biliCleanTitle(title);\n  var meta = String(tag == null ? '' : tag) + ' ' + String(desc == null ? '' : desc);\n  if (biliHas(title + ' ' + meta, BILI_NOISE_HINTS)) return false;\n\n  var sec = biliDurSec(duration);\n  if (biliHas(title, BILI_AUDIO_HINTS) && sec >= 300) return true;\n  if (parseInt(typeid, 10) === BILI_AUDIO_TYPE_ID && sec >= 600) return true;\n  if (biliHas(meta, BILI_AUDIO_HINTS) && sec >= 1800) return true;\n  if (keyword && biliHas(String(keyword), BILI_GENRE_HINTS) && sec >= 1800) return true;\n  return false;\n}\n\n/** 时长秒 -> \"1:02:03\" / \"12:34\" */\nfunction biliDurText(sec) {\n  var n = parseInt(sec, 10) || 0;\n  if (n <= 0) return '';\n  var h = Math.floor(n / 3600), m = Math.floor((n % 3600) / 60), s = n % 60;\n  var mm = m < 10 ? '0' + m : '' + m;\n  var ss = s < 10 ? '0' + s : '' + s;\n  if (h > 0) return h + ':' + mm + ':' + ss;\n  return mm + ':' + ss;\n}\n\n/** 从 JSON 字符串安全取对象 */\nfunction biliJson(s) {\n  return JSON.parse(String(s));\n}\n\n/* =====================================================================\n * 四、需要网络的函数\n * ---------------------------------------------------------------------\n * Rhino 中 jsLib 被挂拼成 prototype scope，函数体里访问不到调用者的\n * java/cache binding（词法作用域在 sharedScope）。因此这里统一把\n * java(实现了 JsExtensions 的对象) 与 cache(CacheManager) 显式入参。\n * 这样规则里写 <js>fn(java,cache,...)</js> 一行即可调用，也便于离线测试。\n * ===================================================================== */\n\n/* ---- 缓存 key ---- */\nvar BILI_CK_WBI = 'bili_wbi_keys';\nvar BILI_CK_READY = 'bili_warmup_ready';\nvar BILI_CK_KW = 'bili_search_keyword';\nvar BILI_CK_PAGE = 'bili_search_page';\n\n/* =====================================================================\n * 发现页分类：[显示名, 搜索关键词, 排序方式]\n * 严格对齐 abts lib/data/seed_books.dart 的 DiscoverSeeds.categories\n * 与 hotKeys。\n * ===================================================================== */\nvar BILI_CATEGORIES = [\n  ['热门推荐', '有声小说', 'click', 1],\n  ['广播剧', '广播剧 全集', '', 1],\n  ['评书', '评书 单田芳', '', 1],\n  ['相声', '相声 德云社', '', 1],\n  ['悬疑', '悬疑有声小说', '', 1],\n  ['玄幻仙侠', '玄幻小说听书', '', 1],\n  ['名著悦读', '世界名著朗读', '', 1],\n  ['名家主播', '', '', 1],\n  ['周建龙', '周建龙 有声小说', ''],\n  ['紫襟', '紫襟 有声小说', ''],\n  ['王明军', '王明军 有声小说', ''],\n  ['艾宝良', '艾宝良 有声小说', ''],\n  ['李野默', '李野默 有声小说', ''],\n  ['青雪', '青雪 有声小说', ''],\n  ['单田芳', '单田芳 评书', ''],\n  ['刘兰芳', '刘兰芳 评书', ''],\n  ['袁阔成', '袁阔成 评书', ''],\n  ['田连元', '田连元 评书', ''],\n  ['郭德纲', '郭德纲 相声', ''],\n  ['马三立', '马三立 相声', ''],\n  ['光合积木', '光合积木 广播剧', ''],\n  ['729声工场', '729声工场 广播剧', ''],\n  ['边江工作室', '边江工作室 广播剧', ''],\n  ['头陀渊', '头陀渊 有声小说', ''],\n  ['桑梓', '桑梓 有声小说', ''],\n  ['道听途说', '道听途说 有声小说', '']\n];\n\n/* 分类项默认占满一行；主播类一行排 4 个，避免发现页过长 */\nvar BILI_ANCHOR_BASIS = 0.25;\n\n/* 发现页搜索框的标题，同时也是 infoMap 里的取值 key。\n * ⚠️ 改这里时必须同步改下面 biliExploreUrl 里 action 中的 '🔍 关键词' 字面量\n *    （那段必须与番茄短剧保持逐字一致，不能改成变量拼接以外的差异写法）。 */\nvar BILI_SEARCH_KEY = '🔍 关键词';\n\n/**\n * 生成发现页（ExploreKind 数组，JSON 字符串）。\n *\n * 与「名::url」纯文本格式不同，这里返回 JSON 数组，从而支持：\n *  1. type:'text'  输入框，输入值会落进 infoMap[title]\n *  2. type:'button' 按钮，点击时执行 action\n * 两者配合即可在发现页内直接发起搜索（跳过手输 pencil）。\n *\n * 分类的 url 仍是一段延迟执行的 <js>，真正请求时才由 AnalyzeUrl 计算签名，\n * 避免 exploreKinds 把已签名的 w_rid 缓存下来导致过期。\n */\nfunction biliExploreUrl() {\n  var items = [];\n\n  // ── 搜索区：输入框 + 搜索按钮 ──\n  items.push({\n    title: BILI_SEARCH_KEY,\n    type: 'text',\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.65 }\n  });\n  items.push({\n    title: '📤 搜索',\n    type: 'button',\n    // ⚠️ 这一段与番茄短剧的实现逐字保持一致，不要擅自加 .replace() 之类改造：\n    //    source.bookSourceName 拿到的是 java.lang.String，Rhino 里对它调\n    //    replace(/:/g,'') 会命中 Java 的 replace(CharSequence,CharSequence)\n    //    而非 ECMAScript 的 String.prototype.replace，RegExp 传不进去会抛错，\n    //    而 evalButtonClick 会静默吞掉异常，表现就是「点按钮没反应」。\n    //    scope 取「书源名::书源地址」，与 RssJsExtensions 里的做法一致。\n    action:\n      \"java.searchBook(infoMap['🔍 关键词']||'',source.bookSourceName+'::'+source.getKey())\",\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: -1 }\n  });\n\n  // ── 分类区 / 主播区 ──\n  for (var i = 0; i < BILI_CATEGORIES.length; i++) {\n    var c = BILI_CATEGORIES[i];\n    // 第 4 项为布局宽度；主分类显式给 1（占满一行），主播缺省则用 0.25（一行四个）\n    var basis = c.length > 3 ? c[3] : BILI_ANCHOR_BASIS;\n    if (!c[1]) {\n      // 纯标题行，url 为空 -> 点击无响应，仅作分组标签\n      items.push({\n        title: c[0],\n        url: '',\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: basis }\n      });\n      continue;\n    }\n    items.push({\n      title: c[0],\n      url:\n        '<js>biliSearchUrl(java,cache,' +\n        JSON.stringify(c[1]) +\n        ',1,' +\n        JSON.stringify(c[2]) +\n        ')</js>',\n      style: { layout_flexGrow: 1, layout_flexBasisPercent: basis }\n    });\n  }\n\n  return JSON.stringify(items);\n}\n\nfunction biliSleep(ms) {\n  var t = Date.now() + ms;\n  while (Date.now() < t) {\n    /* 退避等待，规避 B 站风控 */\n  }\n}\n\n/* ---- CacheManager 薄封装 ----\n * 不依赖 put(key,value,saveTime) 的 Int 形参（Rhino 传 double 易踩类型转换坑），\n * 改为自行存储时间戳来判断有效期。\n */\nfunction biliCacheGet(cache, k) {\n  try {\n    var v = cache.get(k);\n    return v === null || v === undefined ? '' : String(v);\n  } catch (e) {\n    return '';\n  }\n}\n\nfunction biliCacheSet(cache, k, v) {\n  try {\n    cache.put(k, String(v));\n  } catch (e) {\n    try {\n      cache.put(k, String(v), 0);\n    } catch (e2) {}\n  }\n}\n\nfunction biliCacheDel(cache, k) {\n  try {\n    cache.delete(k);\n  } catch (e) {}\n}\n\n/**\n * 预热：访问首页种 buvid3/b_nut，激活一次 gaia 风控闭环。\n * 成功后在 1 小时内不再重复。\n */\nfunction biliWarmup(java, cache) {\n  var ready = biliCacheGet(cache, BILI_CK_READY);\n  var rp = ready.split('|');\n  if (rp.length === 2 && Date.now() - parseInt(rp[1], 10) < 3600000) return true;\n  try {\n    java.ajax(BILI_HOME + '/');\n  } catch (e) {\n    /* 预热失败不阻塞 */\n  }\n  try {\n    // gaia：Buvid 激活，显著压低 v_voucher / -412 概率\n    var png = biliBase64Bytes(biliRandomPngBytes());\n    var payload = JSON.stringify({\n      '3064': 1,\n      '39c8': '333.1387.fp.risk',\n      '3c43': { adca: 'Linux', bfe9: png.substring(png.length - 50) }\n    });\n    java.ajax(\n      BILI_API +\n        '/x/internal/gaia-gateway/ExClimbWuzhi,{\"method\":\"POST\",\"body\":' +\n        JSON.stringify({ payload: payload }) +\n        '}'\n    );\n  } catch (e) {\n    /* 静默 */\n  }\n  biliCacheSet(cache, BILI_CK_READY, '1|' + Date.now());\n  return true;\n}\n\n/** 拼接一段伪造 PNG 的字节（gaia 上报用，对齐 BiliClient._ensureBuvidActivated） */\nfunction biliRandomPngBytes() {\n  var bytes = [], i;\n  for (i = 0; i < 32; i++) bytes.push(Math.floor(Math.random() * 256));\n  bytes = bytes.concat([0, 0, 0, 0, 73, 69, 78, 68]); // IEND 尾块\n  for (i = 0; i < 4; i++) bytes.push(Math.floor(Math.random() * 256));\n  return bytes;\n}\n\n/** base64 编码字节数组（Rhino 无 btoa，手写一版） */\nfunction biliBase64Bytes(bytes) {\n  var T =\n    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n  var out = '', i, b1, b2, b3;\n  for (i = 0; i < bytes.length; i += 3) {\n    b1 = bytes[i];\n    b2 = bytes[i + 1];\n    b3 = bytes[i + 2];\n    var triplet = (b1 << 16) | ((b2 === undefined ? 0 : b2) << 8) | (b3 === undefined ? 0 : b3);\n    out += T.charAt((triplet >> 18) & 0x3f) + T.charAt((triplet >> 12) & 0x3f);\n    if (b2 === undefined) {\n      out += '==';\n    } else {\n      out += T.charAt((triplet >> 6) & 0x3f);\n      out += b3 === undefined ? '=' : T.charAt(triplet & 0x3f);\n    }\n  }\n  return out;\n}\n\n/**\n * 取 WBI 公钥对 [imgUrl, subUrl]，按 24 小时缓存。\n * 对齐 BiliClient._refreshWbiKeys + BiliApi 的按天刷新策略。\n */\nfunction biliWbiKeys(java, cache, force) {\n  if (!force) {\n    var p = biliCacheGet(cache, BILI_CK_WBI).split('|');\n    if (p.length === 3 && p[0] && p[1]) {\n      if (Date.now() - parseInt(p[2], 10) < 86400000) return [p[0], p[1]];\n    }\n  }\n  var txt;\n  try {\n    txt = java.ajax(BILI_API + '/x/web-interface/nav');\n  } catch (e) {\n    return null;\n  }\n  if (!txt) return null;\n  var j;\n  try {\n    j = JSON.parse(String(txt));\n  } catch (e) {\n    return null;\n  }\n  var d = j.data || {};\n  var w = d.wbi_img;\n  if (!w || !w.img_url || !w.sub_url) return null;\n  biliCacheSet(cache, BILI_CK_WBI, w.img_url + '|' + w.sub_url + '|' + Date.now());\n  return [w.img_url, w.sub_url];\n}\n\n/**\n * 生成带 WBI 签名的 search/type 完整 URL\n * @param order 可选：'click' 按播放排序（榜单），'' 综合排序\n */\nfunction biliSearchUrl(java, cache, word, page, order) {\n  biliWarmup(java, cache);\n  var ks = biliWbiKeys(java, cache);\n  if (!ks) throw 'B站初始化失败：取不到 WBI 公钥';\n  var n = parseInt(page, 10);\n  if (!n || n < 1) n = 1;\n  var p = {\n    search_type: 'video',\n    keyword: word,\n    page: n,\n    page_size: 20,\n    platform: 'pc',\n    web_location: 1430654\n  };\n  if (order) p.order = order;\n  biliCacheSet(cache, BILI_CK_KW, word);\n  biliCacheSet(cache, BILI_CK_PAGE, String(n));\n  return BILI_API + '/x/web-interface/wbi/search/type?' + biliSignQuery(p, ks[0], ks[1]);\n}\n\n/**\n * 解析并过滤 search/type 响应。\n * @param body  响应体字符串\n * @param word  搜索词（用于“题材放宽”判定，可为空）\n * @param page  页码（补搜时会用到）\n * @return 数组，每项为一个 JSON 字符串\n */\nfunction biliSearchBody(java, cache, body, word, page) {\n  var j;\n  try {\n    j = JSON.parse(String(body));\n  } catch (e) {\n    return [];\n  }\n  var d = j.data || {};\n\n  // 风控兜底：v_voucher / -412 / -352 时刷新公钥后重试一次\n  if (j.code !== 0 || !d.result) {\n    if (d.v_voucher || j.code === -412 || j.code === -352) {\n      if (java && cache) {\n        biliSleep(1200);\n        var ks2 = biliWbiKeys(java, cache, true);\n        if (ks2) {\n          var n = parseInt(page, 10);\n          if (!n || n < 1) n = 1;\n          var p2 = {\n            search_type: 'video',\n            keyword: word,\n            page: n,\n            page_size: 20,\n            platform: 'pc',\n            web_location: 1430654\n          };\n          var u2 =\n            BILI_API + '/x/web-interface/wbi/search/type?' + biliSignQuery(p2, ks2[0], ks2[1]);\n          try {\n            j = JSON.parse(String(java.ajax(u2)));\n            d = j.data || {};\n          } catch (e2) {\n            /* 保持原值 */\n          }\n        }\n      }\n    }\n  }\n\n  var list = d.result || [];\n  var out = [];\n  var i;\n  for (i = 0; i < list.length; i++) {\n    var m = list[i];\n    var bvid = m.bvid || '';\n    if (!bvid) continue;\n    if (!biliIsAudiobook(m.title, m.tag, m.description, m.typeid, m.duration, word)) continue;\n    out.push(m);\n  }\n\n  // 对齐 BiliApi.search：命中太少且关键词本身不含听书词时，补搜 “关键词 有声小说”\n  if (out.length < 6 && java && cache && !biliHas(String(word), BILI_AUDIO_HINTS)) {\n    try {\n      var extras = biliSearchRawList(java, cache, word + ' 有声小说', page);\n      var seen = {};\n      for (i = 0; i < out.length; i++) seen[out[i].bvid] = 1;\n      for (i = 0; i < extras.length; i++) {\n        var e3 = extras[i];\n        if (e3.bvid && !seen[e3.bvid]) {\n          seen[e3.bvid] = 1;\n          out.push(e3);\n        }\n      }\n    } catch (e4) {\n      /* 补搜失败不影响主结果 */\n    }\n  }\n\n  // 输出成 Legado bookList 可直接消费的形态：每项一个 JSON 字符串\n  var res = [];\n  for (i = 0; i < out.length; i++) {\n    var it = out[i];\n    res.push(\n      JSON.stringify({\n        bvid: it.bvid,\n        aid: it.aid,\n        mid: it.mid,\n        name: biliCleanTitle(it.title),\n        author: it.author || '',\n        cover: biliNormalizePic(it.pic),\n        intro: it.description || '',\n        kind: it.typename || '',\n        tag: it.tag || '',\n        play: it.play || 0,\n        pubdate: it.pubdate || 0,\n        sdur: biliDurSec(it.duration),\n        dur: biliDurText(biliDurSec(it.duration)),\n        bookUrl: BILI_API + '/x/web-interface/view?bvid=' + it.bvid\n      })\n    );\n  }\n  return res;\n}\n\n/** 内部：取某个关键词的已过滤列表（补搜用） */\nfunction biliSearchRawList(java, cache, kw, page) {\n  var ks = biliWbiKeys(java, cache);\n  if (!ks) return [];\n  var n = parseInt(page, 10);\n  if (!n || n < 1) n = 1;\n  var p = {\n    search_type: 'video',\n    keyword: kw,\n    page: n,\n    page_size: 20,\n    platform: 'pc',\n    web_location: 1430654\n  };\n  var u = BILI_API + '/x/web-interface/wbi/search/type?' + biliSignQuery(p, ks[0], ks[1]);\n  var body = java.ajax(u);\n  var j;\n  try {\n    j = JSON.parse(String(body));\n  } catch (e) {\n    return [];\n  }\n  var d = j.data || {};\n  var list = d.result || [];\n  var out = [];\n  for (var i = 0; i < list.length; i++) {\n    var m = list[i];\n    if (!m.bvid) continue;\n    if (!biliIsAudiobook(m.title, m.tag, m.description, m.typeid, m.duration, kw)) continue;\n    out.push(m);\n  }\n  return out;\n}\n\n/**\n * 取某个分P的音频地址（DASH audio）。\n * 对齐 BiliApi.playUrl + BookAudio.pickPreferred。\n */\nfunction biliAudioUrl(java, cache, bvid, cid) {\n  if (!bvid) throw '缺少 bvid';\n  if (!cid) throw '缺少 cid';\n  biliWarmup(java, cache);\n  var p = {\n    bvid: bvid,\n    cid: cid,\n    qn: 80,\n    fnval: 4048,\n    fnver: 0,\n    fourk: 1,\n    try_look: 1,\n    gaia_source: 'prefer-ua'\n  };\n  var ks = biliWbiKeys(java, cache);\n  if (!ks) throw 'B站初始化失败：取不到 WBI 公钥';\n  var j = biliPlayurl(java, cache, p, ks);\n  if (j.code !== 0) {\n    // 风控：刷新公钥重试一次\n    biliSleep(1200);\n    ks = biliWbiKeys(java, cache, true);\n    if (ks) j = biliPlayurl(java, cache, p, ks);\n  }\n  if (j.code !== 0) throw '取流失败 ' + j.code + ' ' + j.message;\n\n  var d = j.data || {};\n  var dash = d.dash || {};\n  // 优先无损/杜比，其次按带宽降序\n  if (dash.flac && dash.flac.audio && dash.flac.audio.baseUrl) return dash.flac.audio.baseUrl;\n  if (dash.dolby && dash.dolby.audio && dash.dolby.audio.length && dash.dolby.audio[0].baseUrl) {\n    return dash.dolby.audio[0].baseUrl;\n  }\n  var arr = dash.audio || [];\n  if (!arr.length) throw '该分P没有可用音轨';\n  arr = arr.slice(0).sort(function (a, b) {\n    return (b.bandwidth || 0) - (a.bandwidth || 0);\n  });\n  return arr[0].baseUrl;\n}\n\n/** 内部：调 playurl 并返回 parsed json */\nfunction biliPlayurl(java, cache, p, ks) {\n  var u = BILI_API + '/x/player/wbi/playurl?' + biliSignQuery(p, ks[0], ks[1]);\n  var txt = java.ajax(u);\n  try {\n    return JSON.parse(String(txt));\n  } catch (e) {\n    return { code: -1, message: '解析失败' };\n  }\n}\n\n/**\n * 从任意包含 bvid / cid 的 URL 中抽取参数。\n * chapterUrl 形如 https://api.bilibili.com/x/player/pagelist?bvid=BV1xx&cid=123\n */\nfunction biliParseUrl(urlStr) {\n  var s = String(urlStr);\n  var b = /[?&]bvid=([^&]+)/.exec(s);\n  var c = /[?&]cid=([^&]+)/.exec(s);\n  return {\n    bvid: b ? decodeURIComponent(b[1]) : '',\n    cid: c ? decodeURIComponent(c[1]) : ''\n  };\n}\n\n/**\n * 解析分P列表（pagelist 响应）成 Legado 章节数组。\n * pagelist 的每一项不含 bvid，因此从当前请求 URL(baseUrl) 里补出来，\n * 并预先拼好 chapterUrl，让 ruleToc 只需走纯 JsonPath。\n * @return 数组，每项为一个 JSON 字符串\n */\nfunction biliChapterList(body, base) {\n  var j;\n  try {\n    j = JSON.parse(String(body));\n  } catch (e) {\n    return [];\n  }\n  var arr = j.data || [];\n  var bv = biliParseUrl(base).bvid;\n  var out = [], i;\n  for (i = 0; i < arr.length; i++) {\n    var p = arr[i];\n    if (!p || !p.cid) continue;\n    out.push(\n      JSON.stringify({\n        cid: p.cid,\n        page: p.page,\n        part: p.part || '',\n        sdur: biliDurSec(p.duration),\n        dur: biliDurText(biliDurSec(p.duration)),\n        bvid: bv,\n        url: BILI_API + '/x/player/pagelist?bvid=' + bv + '&cid=' + p.cid\n      })\n    );\n  }\n  return out;\n}\n", "lastUpdateTime": "1794394409800", "respondTime": 180000, "ruleBookInfo": {"author": "$.data.owner.name", "coverUrl": "$.data.pic@js:biliNormalizePic(result)", "intro": "$.data.desc", "kind": "<js>biliJson(result).data.tname||'有声书'</js>", "lastChapter": "<js>biliJson(result).data.videos+' 集'</js>", "name": "$.data.title", "tocUrl": "https://api.bilibili.com/x/player/pagelist?bvid={$.data.bvid}", "wordCount": "$.data.duration"}, "ruleContent": {"content": "<js>biliAudioUrl(java,cache,biliParseUrl(baseUrl).bvid,biliParseUrl(baseUrl).cid)</js>"}, "ruleExplore": {"author": "$.author", "bookList": "<js>biliSearchBody(java,cache,result,cache.get('bili_search_keyword')||'',cache.get('bili_search_page')||1)</js>", "bookUrl": "$.bookUrl", "coverUrl": "$.cover", "intro": "$.intro", "kind": "$.kind", "lastChapter": "$.dur", "name": "$.name", "wordCount": "$.sdur"}, "ruleSearch": {"author": "$.author", "bookList": "<js>biliSearchBody(java,cache,result,cache.get('bili_search_keyword')||'',cache.get('bili_search_page')||1)</js>", "bookUrl": "$.bookUrl", "coverUrl": "$.cover", "intro": "$.intro", "kind": "$.kind", "lastChapter": "$.dur", "name": "$.name", "wordCount": "$.sdur"}, "ruleToc": {"chapterList": "<js>biliChapterList(result,baseUrl)</js>", "chapterName": "$.part", "chapterUrl": "$.url", "updateTime": "$.dur"}, "searchUrl": "<js>biliSearchUrl(java,cache,key,page,'')</js>", "weight": 0},{"bookSourceComment": "txt520.org（txt520小说网）书源。站点编码为 GBK/gb2312，搜索与正文均按 GBK 处理。结构与「22k阅读网书源」同格式（legado/阅读 系书源）。\n\n【站点结构】\n- 详情页 /{分类}/{id}.html：书名(h1)、作者(div.nav_autor)、简介(div.desc)、在线阅读入口(a.readnow → /read/{vol}-{id}.html)。\n- 目录页 /read/{vol}-{id}.html：章节列表在 div.list > li > a，链接形如 /view/{vol}-{id}-{n}.html，链接文字为「第N节」。\n- 正文页 /view/{vol}-{id}-{n}.html：正文在 div.content，每个 <p> 一段。注意：每本书被切成固定长度的「节」(view 页)，章节标题(第N章)跨「节」被截断，且不存在按章节的独立 URL——目录项是「第N节」，阅读时正文连续，但目录粒度是「节」而非「章」（网站数据形态，书源无法改）。\n\n【正文】正文规则用 div.content@html，未使用 replaceRegex（legado 的 replaceRegex 以 | 作多规则分隔符，删前缀式正则易被误解析而掏空正文）。代价：每本书「第一节」顶部会残留 书名/作者/简介/「正文卷」页眉（无害，仅首节显示）。\n\n【搜索】Empire CMS 搜索 /e/search/index.php，POST 提交 keyboard/show/title/classid=0，请求体与关键词均按 gbk 编码（charset 用小写 gbk——这是社区标准写法；大写 GBK 或 gb2312 在你的阅读版本里会关键词编码/解码失败而搜不到；UTF-8 会直接返回「没有搜索到相关的内容」）。搜索结果书名形如「[玄幻]方寸道主」，name 规则已用 ##\\[[^\\]]*\\]##\\(\\d+-\\d+\\) 同时去除「[分类]」前缀与「(x-y)」后缀。本站搜索无需 Cookie，故未加反爬 Cookie 逻辑。\n\n【发现】分类与排行落地页(ul.list)可正常抓取，但 Empire CMS 分页形如 /xuanhuan/index_2.html（无 /index_1.html），与 legado {{page}} 从 1 起递增不兼容，故发现项只接落地页(第 1 页)。\n\n【封面】本站无封面图，coverUrl 留空。\n\n【重要·搜索局限】本站原生搜索（Empire CMS 搜索索引）严重残缺：仅支持「整书名精确匹配」，且约一半书籍根本未被收录进索引；子串/作者/分类词搜索全部无效。实测 60 本真实书名只有 32 本能搜到（带标点书名多数搜不到）。因此书源侧无法让「搜索」返回更多结果——这是服务端硬限制。要找更多小说，请改用「发现」页：已内置全部分类（玄幻/修真/都市/网游/科幻/武侠/历史/军事/奇幻/悬疑/同人/诸天）的完整翻页（每类最多 12 页×25 本≈300 本）及排行榜，可直接按分类翻遍整站约 3500+ 本小说。搜索仅作为「已知完整书名」的精确查书入口。", "bookSourceGroup": "txt520.org", "bookSourceName": "txt520小说网", "bookSourceType": 0, "bookSourceUrl": "https://www.txt520.org/", "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "exploreUrl": "[{\"title\": \"玄幻·1\", \"url\": \"/xuanhuan/\"}, {\"title\": \"玄幻·2\", \"url\": \"/xuanhuan/index_2.html\"}, {\"title\": \"玄幻·3\", \"url\": \"/xuanhuan/index_3.html\"}, {\"title\": \"玄幻·4\", \"url\": \"/xuanhuan/index_4.html\"}, {\"title\": \"玄幻·5\", \"url\": \"/xuanhuan/index_5.html\"}, {\"title\": \"玄幻·6\", \"url\": \"/xuanhuan/index_6.html\"}, {\"title\": \"玄幻·7\", \"url\": \"/xuanhuan/index_7.html\"}, {\"title\": \"玄幻·8\", \"url\": \"/xuanhuan/index_8.html\"}, {\"title\": \"玄幻·9\", \"url\": \"/xuanhuan/index_9.html\"}, {\"title\": \"玄幻·10\", \"url\": \"/xuanhuan/index_10.html\"}, {\"title\": \"玄幻·11\", \"url\": \"/xuanhuan/index_11.html\"}, {\"title\": \"玄幻·12\", \"url\": \"/xuanhuan/index_12.html\"}, {\"title\": \"修真·1\", \"url\": \"/xiuzhen/\"}, {\"title\": \"修真·2\", \"url\": \"/xiuzhen/index_2.html\"}, {\"title\": \"修真·3\", \"url\": \"/xiuzhen/index_3.html\"}, {\"title\": \"修真·4\", \"url\": \"/xiuzhen/index_4.html\"}, {\"title\": \"修真·5\", \"url\": \"/xiuzhen/index_5.html\"}, {\"title\": \"修真·6\", \"url\": \"/xiuzhen/index_6.html\"}, {\"title\": \"修真·7\", \"url\": \"/xiuzhen/index_7.html\"}, {\"title\": \"修真·8\", \"url\": \"/xiuzhen/index_8.html\"}, {\"title\": \"修真·9\", \"url\": \"/xiuzhen/index_9.html\"}, {\"title\": \"修真·10\", \"url\": \"/xiuzhen/index_10.html\"}, {\"title\": \"修真·11\", \"url\": \"/xiuzhen/index_11.html\"}, {\"title\": \"修真·12\", \"url\": \"/xiuzhen/index_12.html\"}, {\"title\": \"都市·1\", \"url\": \"/ds/\"}, {\"title\": \"都市·2\", \"url\": \"/ds/index_2.html\"}, {\"title\": \"都市·3\", \"url\": \"/ds/index_3.html\"}, {\"title\": \"都市·4\", \"url\": \"/ds/index_4.html\"}, {\"title\": \"都市·5\", \"url\": \"/ds/index_5.html\"}, {\"title\": \"都市·6\", \"url\": \"/ds/index_6.html\"}, {\"title\": \"都市·7\", \"url\": \"/ds/index_7.html\"}, {\"title\": \"都市·8\", \"url\": \"/ds/index_8.html\"}, {\"title\": \"都市·9\", \"url\": \"/ds/index_9.html\"}, {\"title\": \"都市·10\", \"url\": \"/ds/index_10.html\"}, {\"title\": \"都市·11\", \"url\": \"/ds/index_11.html\"}, {\"title\": \"都市·12\", \"url\": \"/ds/index_12.html\"}, {\"title\": \"网游·1\", \"url\": \"/wangyou/\"}, {\"title\": \"网游·2\", \"url\": \"/wangyou/index_2.html\"}, {\"title\": \"网游·3\", \"url\": \"/wangyou/index_3.html\"}, {\"title\": \"网游·4\", \"url\": \"/wangyou/index_4.html\"}, {\"title\": \"网游·5\", \"url\": \"/wangyou/index_5.html\"}, {\"title\": \"网游·6\", \"url\": \"/wangyou/index_6.html\"}, {\"title\": \"网游·7\", \"url\": \"/wangyou/index_7.html\"}, {\"title\": \"网游·8\", \"url\": \"/wangyou/index_8.html\"}, {\"title\": \"网游·9\", \"url\": \"/wangyou/index_9.html\"}, {\"title\": \"网游·10\", \"url\": \"/wangyou/index_10.html\"}, {\"title\": \"网游·11\", \"url\": \"/wangyou/index_11.html\"}, {\"title\": \"网游·12\", \"url\": \"/wangyou/index_12.html\"}, {\"title\": \"科幻·1\", \"url\": \"/kehuan/\"}, {\"title\": \"科幻·2\", \"url\": \"/kehuan/index_2.html\"}, {\"title\": \"科幻·3\", \"url\": \"/kehuan/index_3.html\"}, {\"title\": \"科幻·4\", \"url\": \"/kehuan/index_4.html\"}, {\"title\": \"科幻·5\", \"url\": \"/kehuan/index_5.html\"}, {\"title\": \"科幻·6\", \"url\": \"/kehuan/index_6.html\"}, {\"title\": \"科幻·7\", \"url\": \"/kehuan/index_7.html\"}, {\"title\": \"科幻·8\", \"url\": \"/kehuan/index_8.html\"}, {\"title\": \"科幻·9\", \"url\": \"/kehuan/index_9.html\"}, {\"title\": \"科幻·10\", \"url\": \"/kehuan/index_10.html\"}, {\"title\": \"科幻·11\", \"url\": \"/kehuan/index_11.html\"}, {\"title\": \"科幻·12\", \"url\": \"/kehuan/index_12.html\"}, {\"title\": \"武侠·1\", \"url\": \"/wuxia/\"}, {\"title\": \"武侠·2\", \"url\": \"/wuxia/index_2.html\"}, {\"title\": \"武侠·3\", \"url\": \"/wuxia/index_3.html\"}, {\"title\": \"武侠·4\", \"url\": \"/wuxia/index_4.html\"}, {\"title\": \"武侠·5\", \"url\": \"/wuxia/index_5.html\"}, {\"title\": \"武侠·6\", \"url\": \"/wuxia/index_6.html\"}, {\"title\": \"武侠·7\", \"url\": \"/wuxia/index_7.html\"}, {\"title\": \"武侠·8\", \"url\": \"/wuxia/index_8.html\"}, {\"title\": \"武侠·9\", \"url\": \"/wuxia/index_9.html\"}, {\"title\": \"武侠·10\", \"url\": \"/wuxia/index_10.html\"}, {\"title\": \"武侠·11\", \"url\": \"/wuxia/index_11.html\"}, {\"title\": \"历史·1\", \"url\": \"/lishi/\"}, {\"title\": \"历史·2\", \"url\": \"/lishi/index_2.html\"}, {\"title\": \"历史·3\", \"url\": \"/lishi/index_3.html\"}, {\"title\": \"历史·4\", \"url\": \"/lishi/index_4.html\"}, {\"title\": \"历史·5\", \"url\": \"/lishi/index_5.html\"}, {\"title\": \"历史·6\", \"url\": \"/lishi/index_6.html\"}, {\"title\": \"历史·7\", \"url\": \"/lishi/index_7.html\"}, {\"title\": \"历史·8\", \"url\": \"/lishi/index_8.html\"}, {\"title\": \"历史·9\", \"url\": \"/lishi/index_9.html\"}, {\"title\": \"历史·10\", \"url\": \"/lishi/index_10.html\"}, {\"title\": \"历史·11\", \"url\": \"/lishi/index_11.html\"}, {\"title\": \"历史·12\", \"url\": \"/lishi/index_12.html\"}, {\"title\": \"军事·1\", \"url\": \"/junshi/\"}, {\"title\": \"军事·2\", \"url\": \"/junshi/index_2.html\"}, {\"title\": \"军事·3\", \"url\": \"/junshi/index_3.html\"}, {\"title\": \"军事·4\", \"url\": \"/junshi/index_4.html\"}, {\"title\": \"军事·5\", \"url\": \"/junshi/index_5.html\"}, {\"title\": \"军事·6\", \"url\": \"/junshi/index_6.html\"}, {\"title\": \"军事·7\", \"url\": \"/junshi/index_7.html\"}, {\"title\": \"军事·8\", \"url\": \"/junshi/index_8.html\"}, {\"title\": \"奇幻·1\", \"url\": \"/qihuan/\"}, {\"title\": \"奇幻·2\", \"url\": \"/qihuan/index_2.html\"}, {\"title\": \"奇幻·3\", \"url\": \"/qihuan/index_3.html\"}, {\"title\": \"奇幻·4\", \"url\": \"/qihuan/index_4.html\"}, {\"title\": \"奇幻·5\", \"url\": \"/qihuan/index_5.html\"}, {\"title\": \"奇幻·6\", \"url\": \"/qihuan/index_6.html\"}, {\"title\": \"奇幻·7\", \"url\": \"/qihuan/index_7.html\"}, {\"title\": \"奇幻·8\", \"url\": \"/qihuan/index_8.html\"}, {\"title\": \"奇幻·9\", \"url\": \"/qihuan/index_9.html\"}, {\"title\": \"奇幻·10\", \"url\": \"/qihuan/index_10.html\"}, {\"title\": \"奇幻·11\", \"url\": \"/qihuan/index_11.html\"}, {\"title\": \"悬疑·1\", \"url\": \"/guihua/\"}, {\"title\": \"悬疑·2\", \"url\": \"/guihua/index_2.html\"}, {\"title\": \"悬疑·3\", \"url\": \"/guihua/index_3.html\"}, {\"title\": \"悬疑·4\", \"url\": \"/guihua/index_4.html\"}, {\"title\": \"悬疑·5\", \"url\": \"/guihua/index_5.html\"}, {\"title\": \"悬疑·6\", \"url\": \"/guihua/index_6.html\"}, {\"title\": \"悬疑·7\", \"url\": \"/guihua/index_7.html\"}, {\"title\": \"悬疑·8\", \"url\": \"/guihua/index_8.html\"}, {\"title\": \"同人·1\", \"url\": \"/erciyuan/\"}, {\"title\": \"同人·2\", \"url\": \"/erciyuan/index_2.html\"}, {\"title\": \"同人·3\", \"url\": \"/erciyuan/index_3.html\"}, {\"title\": \"同人·4\", \"url\": \"/erciyuan/index_4.html\"}, {\"title\": \"同人·5\", \"url\": \"/erciyuan/index_5.html\"}, {\"title\": \"同人·6\", \"url\": \"/erciyuan/index_6.html\"}, {\"title\": \"同人·7\", \"url\": \"/erciyuan/index_7.html\"}, {\"title\": \"同人·8\", \"url\": \"/erciyuan/index_8.html\"}, {\"title\": \"同人·9\", \"url\": \"/erciyuan/index_9.html\"}, {\"title\": \"同人·10\", \"url\": \"/erciyuan/index_10.html\"}, {\"title\": \"同人·11\", \"url\": \"/erciyuan/index_11.html\"}, {\"title\": \"同人·12\", \"url\": \"/erciyuan/index_12.html\"}, {\"title\": \"诸天·1\", \"url\": \"/zhutian/\"}, {\"title\": \"诸天·2\", \"url\": \"/zhutian/index_2.html\"}, {\"title\": \"诸天·3\", \"url\": \"/zhutian/index_3.html\"}, {\"title\": \"诸天·4\", \"url\": \"/zhutian/index_4.html\"}, {\"title\": \"诸天·5\", \"url\": \"/zhutian/index_5.html\"}, {\"title\": \"诸天·6\", \"url\": \"/zhutian/index_6.html\"}, {\"title\": \"诸天·7\", \"url\": \"/zhutian/index_7.html\"}, {\"title\": \"诸天·8\", \"url\": \"/zhutian/index_8.html\"}, {\"title\": \"诸天·9\", \"url\": \"/zhutian/index_9.html\"}, {\"title\": \"排行榜·1\", \"url\": \"/ranking/\"}, {\"title\": \"排行榜·2\", \"url\": \"/ranking/index_2.html\"}, {\"title\": \"排行榜·3\", \"url\": \"/ranking/index_3.html\"}, {\"title\": \"排行榜·4\", \"url\": \"/ranking/index_4.html\"}, {\"title\": \"排行榜·5\", \"url\": \"/ranking/index_5.html\"}, {\"title\": \"排行榜·6\", \"url\": \"/ranking/index_6.html\"}, {\"title\": \"排行榜·7\", \"url\": \"/ranking/index_7.html\"}, {\"title\": \"排行榜·8\", \"url\": \"/ranking/index_8.html\"}]", "lastUpdateTime": "1794376109848", "respondTime": 180000, "ruleBookInfo": {"author": "div.nav_autor@text##^作者[:：]", "coverUrl": "", "intro": "div.desc@text", "kind": "div.newsnav a:last-of-type@text", "lastChapter": "", "name": "div.nav_name h1@text", "tocUrl": "a.readnow@href"}, "ruleContent": {"content": "div.content@html", "nextContentUrl": "", "title": "div.content p:matches(第[0-9]+章)@text"}, "ruleExplore": {"author": "div.bookWriter span:first-child@text##^作者[:：]", "bookList": "ul.list li", "bookUrl": "a.title@href", "coverUrl": "", "intro": "p.desc@text", "kind": "", "name": "a.title b@text##\\[[^\\]]*\\]##\\(\\d+-\\d+\\)"}, "ruleSearch": {"author": "div.bookWriter span:first-child@text##^作者[:：]", "bookList": "ul.list li", "bookUrl": "a.title@href", "coverUrl": "", "intro": "p.desc@text", "kind": "", "lastChapter": "div.bookWriter span.pubdate@text", "name": "a.title b@text##\\[[^\\]]*\\]##\\(\\d+-\\d+\\)"}, "ruleToc": {"chapterList": "div.list li", "chapterName": "a@text##^\\s+", "chapterUrl": "a@href"}, "searchUrl": "https://www.txt520.org/e/search/index.php,{\"body\":\"keyboard={{key}}&show=title&classid=0\",\"method\":\"POST\",\"charset\":\"gbk\"}", "weight": 0, "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 11; Pixel 4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36\",\"Accept-Language\":\"zh-CN,zh;q=0.9\",\"Referer\":\"https://www.txt520.org/\"}"},{"bookSourceComment": "txt520.org（txt520小说网）书源。站点编码为 GBK/gb2312，搜索与正文均按 GBK 处理。结构与「22k阅读网书源」同格式（legado/阅读 系书源）。\n\n【站点结构】\n- 详情页 /{分类}/{id}.html：书名(h1)、作者(div.nav_autor)、简介(div.desc)、在线阅读入口(a.readnow → /read/{vol}-{id}.html)。\n- 目录页 /read/{vol}-{id}.html：章节列表在 div.list > li > a，链接形如 /view/{vol}-{id}-{n}.html，链接文字为「第N节」。\n- 正文页 /view/{vol}-{id}-{n}.html：正文在 div.content，每个 <p> 一段。注意：每本书被切成固定长度的「节」(view 页)，章节标题(第N章)跨「节」被截断，且不存在按章节的独立 URL——目录项是「第N节」，阅读时正文连续，但目录粒度是「节」而非「章」（网站数据形态，书源无法改）。\n\n【正文】正文规则用 div.content@html，未使用 replaceRegex（legado 的 replaceRegex 以 | 作多规则分隔符，删前缀式正则易被误解析而掏空正文）。代价：每本书「第一节」顶部会残留 书名/作者/简介/「正文卷」页眉（无害，仅首节显示）。\n\n【搜索】Empire CMS 搜索 /e/search/index.php，POST 提交 keyboard/show/title/classid=0，请求体与关键词均按 gbk 编码（charset 用小写 gbk——这是社区标准写法；大写 GBK 或 gb2312 在你的阅读版本里会关键词编码/解码失败而搜不到；UTF-8 会直接返回「没有搜索到相关的内容」）。搜索结果书名形如「[玄幻]方寸道主」，name 规则已用 ##\\[[^\\]]*\\]##\\(\\d+-\\d+\\) 同时去除「[分类]」前缀与「(x-y)」后缀。本站搜索无需 Cookie，故未加反爬 Cookie 逻辑。\n\n【发现】分类与排行落地页(ul.list)可正常抓取，但 Empire CMS 分页形如 /xuanhuan/index_2.html（无 /index_1.html），与 legado {{page}} 从 1 起递增不兼容，故发现项只接落地页(第 1 页)。\n\n【封面】本站无封面图，coverUrl 留空。", "bookSourceGroup": "txt520.org", "bookSourceName": "txt520小说网", "bookSourceType": 0, "bookSourceUrl": "https://www.txt520.org/", "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "exploreUrl": "[{\"title\":\"玄幻\",\"url\":\"/xuanhuan/\"},{\"title\":\"修真\",\"url\":\"/xiuzhen/\"},{\"title\":\"都市\",\"url\":\"/ds/\"},{\"title\":\"网游\",\"url\":\"/wangyou/\"},{\"title\":\"科幻\",\"url\":\"/kehuan/\"},{\"title\":\"武侠\",\"url\":\"/wuxia/\"},{\"title\":\"历史\",\"url\":\"/lishi/\"},{\"title\":\"军事\",\"url\":\"/junshi/\"},{\"title\":\"奇幻\",\"url\":\"/qihuan/\"},{\"title\":\"悬疑\",\"url\":\"/guihua/\"},{\"title\":\"同人\",\"url\":\"/erciyuan/\"},{\"title\":\"诸天\",\"url\":\"/zhutian/\"},{\"title\":\"排行榜\",\"url\":\"/ranking/\"}]", "lastUpdateTime": "1794375308703", "respondTime": 180000, "ruleBookInfo": {"author": "div.nav_autor@text##^作者[:：]", "coverUrl": "", "intro": "div.desc@text", "kind": "div.newsnav a:last-of-type@text", "lastChapter": "", "name": "div.nav_name h1@text", "tocUrl": "a.readnow@href"}, "ruleContent": {"content": "div.content@html", "nextContentUrl": "", "title": "div.content p:matches(第[0-9]+章)@text"}, "ruleExplore": {"author": "div.bookWriter span:first-child@text##^作者[:：]", "bookList": "ul.list li", "bookUrl": "a.title@href", "coverUrl": "", "intro": "p.desc@text", "kind": "", "name": "a.title b@text##\\[[^\\]]*\\]##\\(\\d+-\\d+\\)"}, "ruleSearch": {"author": "div.bookWriter span:first-child@text##^作者[:：]", "bookList": "ul.list li", "bookUrl": "a.title@href", "coverUrl": "", "intro": "p.desc@text", "kind": "", "lastChapter": "div.bookWriter span.pubdate@text", "name": "a.title b@text##\\[[^\\]]*\\]##\\(\\d+-\\d+\\)"}, "ruleToc": {"chapterList": "div.list li", "chapterName": "a@text##^\\s+", "chapterUrl": "a@href"}, "searchUrl": "https://www.txt520.org/e/search/index.php,{\"body\":\"keyboard={{key}}&show=title&classid=0\",\"method\":\"POST\",\"charset\":\"gbk\"}", "weight": 0, "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 11; Pixel 4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36\",\"Accept-Language\":\"zh-CN,zh;q=0.9\",\"Referer\":\"https://www.txt520.org/\"}"},{"bookSourceName": "❄️听雪聚合", "bookSourceType": 0, "bookSourceUrl": "听雪聚合", "customButton": true, "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": true, "exploreUrl": "@js:\nvar conf = ensureConfig.call(this);\nvar currentSource = conf.source || '';\nvar currentGender = conf.gender || 'boy';\n\nvar srcList = getSourceList.call(this);\nvar srcMeta = {};\nfor (var i = 0; i < srcList.length; i++) {\n    srcMeta[srcList[i].name] = srcList[i];\n}\n\nvar currentMode = conf.mode || 'novel';\nvar firstSource = String(currentSource || '').split(',')[0].trim();\nif (firstSource && srcMeta[firstSource] && srcMeta[firstSource].tab) {\n    currentMode = srcMeta[firstSource].tab;\n}\n\nvar MODE_LABELS = {\n    novel: '📖小说',\n    audio: '🎧听书',\n    comic: '🌈漫画',\n    video: '▶️短剧',\n    download: '⬇️下载'\n};\nvar LABEL_TO_MODE = {\n    '📖小说': 'novel',\n    '🎧听书': 'audio',\n    '🌈漫画': 'comic',\n    '▶️短剧': 'video',\n    '⬇️下载': 'download'\n};\n\nvar srcOptions = [{ label: '☁️聚合搜索', value: '' }];\nfor (var i = 0; i < srcList.length; i++) {\n    var it = srcList[i];\n    if (it.tab && it.tab != currentMode) continue;\n    srcOptions.push({ label: it.name, value: it.name });\n}\n\nvar defaultLabel = '☁️聚合搜索';\nfor (var k = 0; k < srcOptions.length; k++) {\n    if (srcOptions[k].value == firstSource) { defaultLabel = srcOptions[k].label; break; }\n}\nvar srcMapStr = JSON.stringify(srcOptions).replace(/\\\\/g,'\\\\\\\\').replace(/\"/g,'\\\\\"');\n\nvar firstModeSource = '';\nfor (var i = 0; i < srcList.length; i++) {\n    if (srcList[i].tab == currentMode && srcList[i].name) { firstModeSource = srcList[i].name; break; }\n}\nvar useSource = firstSource || firstModeSource;\n\nvar controls = [];\ncontrols.push({ title: '☃关键词💭：书名/作者', type: 'text', style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.6 } });\ncontrols.push({ title: '🔍搜索', type: 'button', action: \"java.searchBook(infoMap['☃关键词💭：书名/作者'] || '')\", style: { layout_flexGrow: 1, layout_flexBasisPercent: -1, layout_alignSelf: 'baseline' } });\ncontrols.push({ title: '🔄刷新', type: 'button', action: 'java.refreshExplore()', style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.4, layout_alignSelf: 'baseline' } });\ncontrols.push({ title: '⚙登录', type: 'button', action: \"java.open('login','http',null)\", style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.4, layout_alignSelf: 'baseline' } });\n\ncontrols.push({\n    title: '性别',\n    type: 'select',\n    chars: ['♂️男频', '♀️女频'],\n    default: currentGender == 'girl' ? '♀️女频' : '♂️男频',\n    action: \"(function(){var raw=infoMap['性别']||'';var v=(raw.indexOf('女')>=0)?'girl':'boy';setConfig.call(this,{gender:v});java.refreshExplore();})()\",\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.4 }\n});\n\ncontrols.push({\n    title: '模式',\n    type: 'select',\n    chars: ['📖小说', '🎧听书', '🌈漫画', '▶️短剧', '⬇️下载'],\n    default: MODE_LABELS[currentMode] || '📖小说',\n    action: \"(function(){var raw=infoMap['模式']||'';var map=JSON.parse('\" + JSON.stringify(LABEL_TO_MODE).replace(/\\\\/g,'\\\\\\\\').replace(/\"/g,'\\\\\"') + \"');var v=map[raw]||'novel';setConfig.call(this,{mode:v,source:''});java.refreshExplore();})()\",\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.4 }\n});\n\ncontrols.push({\n    title: '源站',\n    type: 'select',\n    chars: srcOptions.map(function(x){return x.label;}),\n    default: defaultLabel,\n    action: \"(function(){var raw=infoMap['源站']||'';var opts=JSON.parse('\" + srcMapStr + \"');var map={};opts.forEach(function(i){map[i.label]=i.value;});setConfig.call(this,{source:map[raw]||''});java.refreshExplore();})()\",\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n});\n\nvar currentJjTab = getConfig.call(this).jj_tab || '多元';\nif (String(useSource).indexOf('晋江') >= 0) {\n    var jjTabs = [\"🏷 言情\", \"🏷 纯爱\", \"🏷 百合\", \"🏷 无Cp\", \"🏷 多元\"];\n    var jjTagMap = {\"🏷 言情\":\"言情\",\"🏷 纯爱\":\"纯爱\",\"🏷 百合\":\"百合\",\"🏷 无Cp\":\"无Cp\",\"🏷 多元\":\"多元\"};\n    var jjTagMapStr = JSON.stringify(jjTagMap).replace(/\\\\/g,'\\\\\\\\').replace(/\"/g,'\\\\\"');\n\n    controls.push({\n        title: '频道',\n        type: 'select',\n        chars: jjTabs,\n        default: \"🏷 \" + currentJjTab,\n        action: \"(function(){var raw=infoMap['频道']||'';var tagMap=JSON.parse('\" + jjTagMapStr + \"');var tagName=tagMap[raw]||'多元';setConfig.call(this,{jj_tab:tagName});java.refreshExplore();})()\",\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n    });\n}\n\nvar sort = controls.slice();\n\nvar shelfEntries = [];\nvar shelfFirstSource = String(firstSource || '').trim();\nvar showFanqieShelf = shelfFirstSource == '' || shelfFirstSource.indexOf('番茄') >= 0;\nvar showJjShelf = shelfFirstSource.indexOf('晋江') >= 0;\n\nfunction shelfUrl(sourceName, loginValue, groupValue) {\n    return getHost.call(this) + '/api/bookshelf,' + JSON.stringify({\n        method: 'POST',\n        body: JSON.stringify({\n            source: sourceName,\n            logins: String(loginValue || ''),\n            group: String(groupValue || '')\n        }),\n        headers: buildHeaders.call(this)\n    });\n}\n\nfunction makeShelfBookList(sourceName, loginValue) {\n    try {\n        var shelfRes = postJson.call(this, '/api/bookshelf', {\n            source: sourceName,\n            logins: String(loginValue || ''),\n            group: ''\n        });\n        if (shelfRes && shelfRes.code == 0 && Array.isArray(shelfRes.data)) {\n            return shelfRes.data;\n        }\n    } catch (e) {}\n    return [];\n}\n\nfunction shelfGroups(books) {\n    var seen = {};\n    var groups = [];\n    for (var i = 0; i < books.length; i++) {\n        var gid = String((books[i] && books[i].group_id) || '').trim();\n        var gname = String((books[i] && books[i].group_name) || '').trim();\n        if (!gid || !gname || seen[gid]) continue;\n        seen[gid] = true;\n        groups.push({ id: gid, name: gname });\n    }\n    return groups;\n}\n\nfunction pushShelfDivider() {\n    shelfEntries.push({\n        title: '────────',\n        url: '',\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n    });\n}\n\nvar fqSession = getSessionId.call(this) || getSessionIdFromCookie.call(this);\nif (showFanqieShelf && fqSession) {\n    var fqBooks = makeShelfBookList.call(this, '番茄', fqSession);\n    var fqGroups = shelfGroups(fqBooks);\n    var fqName = '';\n    try {\n        var userRaw = java.ajax('https://fanqienovel.com/api/user/info/v2,' + JSON.stringify({\n            method: 'GET',\n            headers: { Cookie: 'sessionid=' + fqSession }\n        }));\n        var userObj = JSON.parse(userRaw);\n        fqName = String(userObj && userObj.data && userObj.data.name || '');\n    } catch (e) {}\n\n    shelfEntries.push({\n        title: (fqName ? fqName + ' 的个人中心' : '我的番茄书架'),\n        url: '',\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n    });\n    shelfEntries.push({\n        title: '我的书架（全部）',\n        url: shelfUrl.call(this, '番茄', fqSession, ''),\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.5 }\n    });\n    for (var fg = 0; fg < fqGroups.length; fg++) {\n        shelfEntries.push({\n            title: '📁 ' + fqGroups[fg].name,\n            url: shelfUrl.call(this, '番茄', fqSession, fqGroups[fg].id),\n            style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.4 }\n        });\n    }\n\n    pushShelfDivider();\n}\n\nvar jjLogin = getJjToken.call(this);\nif (showJjShelf && jjLogin) {\n    var jjBooks = makeShelfBookList.call(this, '晋江', jjLogin);\n    var jjGroups = shelfGroups(jjBooks);\n\n    shelfEntries.push({\n        title: '📁 个人书架',\n        url: '',\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n    });\n    shelfEntries.push({\n        title: '📓 全部收藏',\n        url: shelfUrl.call(this, '晋江', jjLogin, ''),\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.45 }\n    });\n\n    var jjUncategorized = null;\n    var jjOtherGroups = [];\n    for (var jg = 0; jg < jjGroups.length; jg++) {\n        if (jjGroups[jg].name == '尚未分类') {\n            jjUncategorized = jjGroups[jg];\n        } else {\n            jjOtherGroups.push(jjGroups[jg]);\n        }\n    }\n\n    if (jjUncategorized) {\n        shelfEntries.push({\n            title: '📁 ' + jjUncategorized.name,\n            url: shelfUrl.call(this, '晋江', jjLogin, jjUncategorized.id),\n            style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.29 }\n        });\n    }\n\n    for (var jg2 = 0; jg2 < jjOtherGroups.length; jg2++) {\n        shelfEntries.push({\n            title: '📁 ' + jjOtherGroups[jg2].name,\n            url: shelfUrl.call(this, '晋江', jjLogin, jjOtherGroups[jg2].id),\n            style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.29 }\n        });\n    }\n\n    pushShelfDivider();\n}\n\nif (shelfEntries.length) {\n    sort = sort.concat(shelfEntries);\n}\n\nvar useGender = (currentMode == 'audio') ? 'boy' : currentGender;\nvar fqFilter = conf.fq_filter || '';\n\ntry {\n    var d = postJson.call(this, '/api/discover', {\n        source: useSource,\n        gender: useGender,\n        tab: currentJjTab,\n        selected_items: fqFilter\n    });\n    if (d && d.code != 0) {\n        java.toast(d.message);\n    }\n    var data = (d && Array.isArray(d.data)) ? d.data : [];\n    if (data.length > 0) {\n        data.forEach(function (t) {\n            if (!t) return;\n            var st = (t.style && typeof t.style === 'object' && !Array.isArray(t.style)) ? t.style : { layout_flexGrow: 1, layout_flexBasisPercent: 0.3 };\n            var link = t.sing\n                ? (getHost.call(this) + '/api/discover/books,' + JSON.stringify({\n                    method: 'POST',\n                    body: JSON.stringify({\n                        sing: t.sing,\n                        gender: useGender,\n                        source: useSource,\n                        tab: currentJjTab || '',\n                        page: '{{page}}',\n                        selected_items: fqFilter\n                    })\n                }))\n                : '';\n            sort.push({ title: String(t.title || ''), url: link, style: st });\n        });\n    } else {\n        sort.push({ title: '【' + (useSource || '聚合') + '】暂无发现页数据', url: '', style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } });\n    }\n} catch (e) {\n    sort.push({ title: '发现页加载失败，请检查服务器/登录', url: '', style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } });\n}\nJSON.stringify(sort);", "header": "@js:\nJSON.stringify(buildHeaders.call(this));", "jsLib": "let localVersion = '1.20261110.1';  //本地版本号\n\nfunction getHosts() {\n    return [\n    'https://tingx.abrdns.com',\n    'http://154.12.85.126:5000'\n    ];\n}\n\nfunction getStvHosts() {\n    return [\n        'https://sangtacviet.com',\n        'https://sangtacviet.app',\n        'https://sangtacviet.vip',\n        'https://sangtacviet.pro',\n        'https://sangtacviet.xyz',\n        'http://14.225.254.182',\n        'http://103.82.20.93'\n    ];\n}\n\nfunction getStvHost() {\n    let c = getConfig.call(this);\n    let saved = String(c.stv_host || '').trim();\n    if (saved) return saved.replace(/\\/+$/, '');\n    return 'https://sangtacviet.com';\n}\n\nfunction setStvHost(host) {\n    let list = getStvHosts();\n    let target = String(host || '').replace(/\\/+$/, '');\n    if (list.indexOf(target) == -1) {\n        return { ok: false, message: '未配置的STV线路：' + host };\n    }\n    setConfig.call(this, { stv_host: target });\n    return { ok: true, host: target };\n}\n\nfunction stvNextHost() {\n    let list = getStvHosts();\n    let cur = getStvHost.call(this);\n    let idx = list.indexOf(cur);\n    let next = list[(idx + 1) % list.length];\n    setConfig.call(this, { stv_host: next });\n    return next;\n}\n\nfunction stvCurrentHostLabel() {\n    let cur = getStvHost.call(this);\n    let list = getStvHosts();\n    let idx = list.indexOf(cur);\n    return (idx >= 0 ? (idx + 1) + '/' + list.length + ' · ' : '') + cur;\n}\n\nfunction getHost() {\n    let { source } = this;\n    let c = getConfig.call(this);\n    if (c.host) return String(c.host).replace(/\\/+$/, '');\n    let base = '';\n    try { base = \"https://tingx.abrdns.com\"; } catch (e) {}\n    if (!base && typeof baseUrl !== 'undefined' && baseUrl) base = String(baseUrl);\n    if (!base) base = getHosts()[0];\n    return base.replace(/\\/+$/, '');\n}\n\nfunction getConfig() {\n    let { source } = this;\n    try {\n        let configStr = source.getVariable();\n        if (!configStr || configStr.trim() == \"\") return {};\n        let config = JSON.parse(configStr);\n        if (Array.isArray(config)) return config[0] || {};\n        if (config && typeof config == 'object') return config;\n        return {};\n    } catch (e) { return {}; }\n}\n\nfunction setConfig(obj) {\n    let { source } = this;\n    try {\n        let config = getConfig.call(this);\n        for (let k in obj) { if (obj.hasOwnProperty(k)) config[k] = obj[k]; }\n        source.setVariable(JSON.stringify([config]));\n        return true;\n    } catch (e) { return false; }\n}\n\nfunction ensureConfig() {\n    let c = getConfig.call(this);\n    let changed = false;\n    if (!c.gender) { c.gender = 'boy'; changed = true; }\n    if (c.source == undefined) { c.source = ''; changed = true; }\n    if (!c.sources) { c.sources = { novel: [], audio: [], comic: [], video: [], download: [] }; changed = true; }\n    if (changed) setConfig.call(this, c);\n    return c;\n}\n\nfunction deviceType() {\n    let { java } = this;\n    try {\n        var id = java.deviceID();\n        if (id && id !== '') {\n            return true;\n        }\n    } catch (e) {}\n    \n    try {\n        var id = java.androidId();\n        if (id && id !== '') {\n            return false;\n        }\n    } catch (e) {}\n    \n    return false;\n}\n\nfunction getDeviceId() {\n    let { java } = this;\n    let dev = '';\n    try { let id1 = java.deviceID(); if (id1 && String(id1) !== '') dev = String(id1); } catch (e) {}\n    if (!dev) { try { let id2 = java.androidId(); if (id2 && String(id2) !== '') dev = String(id2); } catch (e) {} }\n    return dev;\n}\n\nfunction checkMsg(res) {\n    let { java } = this;\n    try {\n        let obj = JSON.parse(res);\n        if (obj.code !== 0) {\n            java.toast(obj.message);\n        }\n    } catch (e) {}\n    return res;\n}\n\nfunction getToken() {\n    let { source } = this;\n    let b64 = '';\n    try { b64 = String(source.getLoginHeader() || '').trim(); } catch (e) {}\n    return { b64: b64 };\n}\n\nfunction buildHeaders() {\n    let { java } = this;\n    let t = getToken.call(this);\n    let dev = getDeviceId.call(this);\n    let ts = String(Math.floor(Date.now() / 1000));\n\n    let plain = '';\n    if (t.b64) {\n        try { plain = java.base64Decode(t.b64); } catch (e) { plain = ''; }\n    }\n\n    return {\n        'User-Agent': java.getWebViewUA(),\n        'x-novel-token': t.b64,\n        'x-novel-deviceid': dev,\n        'x-novel-timestamap': ts,\n        'x-novel-public': java.md5Encode(plain + dev + ts).toLowerCase(),\n        'x-novel-version': '10'\n    };\n}\n\nfunction postJson(path, obj) {\n    let { java } = this;\n    let headers = buildHeaders.call(this);\n    headers['Content-Type'] = 'application/json';\n    let opt = { method: 'POST', body: JSON.stringify(obj || {}), headers: headers };\n    let res = java.ajax(getHost.call(this) + path + ',' + JSON.stringify(opt));\n    res = decryptIfEncrypted.call(this, res);\n    try { return JSON.parse(res); } catch (e) { return { code: -1, message: '解析失败', raw: res }; }\n}\n\nfunction getSourceList() {\n    let list = [];\n    try {\n        let arr = postJson.call(this, '/api/source', {});\n        if (Array.isArray(arr)) {\n            arr.forEach(function (it) { if (it && it.enabled && it.name) list.push(it); });\n            list.sort(function (a, b) { return (a.sort || 0) - (b.sort || 0); });\n        }\n    } catch (e) {}\n    return list;\n}\n\nfunction getCmtBrowserOptions() {\n    return {\n        expandedCornersRadius: 20,\n        dismissOnTouchOutside: true,\n        isDraggable: true,\n        shouldDimBackground: true,\n        backgroundDimAmount: 0.5,\n        hardwareAccelerated: true,\n        isNestedScrollingEnabled: true,\n        isGestureInsetBottomIgnored: true,\n        setFitToContents: false,\n        heightPercentage: 0.75,\n        isHideable: true\n    };\n}\n\nfunction showCmt(bid, cid, para, date, sourceName) {\n    let { java } = this;\n    let url = getHost.call(this) + '/comment'\n            + '?tab=paras&book_id=' + bid\n            + '&item_id=' + cid\n            + '&para=' + para\n            + '&source=' + (sourceName || '');\n    try {\n        java.showBrowser(url, null, 'window.java=java;', JSON.stringify(getCmtBrowserOptions.call(this)));\n    } catch (e) {\n        try { java.startBrowser(url, '段评'); } catch (e2) {\n            java.toast('打开段评失败：' + e2);\n        }\n    }\n}\n\nfunction getSessionId() {\n    let config = getConfig.call(this);\n    return String(config.fanqie_sessionid || '');\n}\n\nfunction getSessionIdFromCookie() {\n    const { cookie } = this;\n    try {\n        let cookieHeader = String(cookie.getCookie('fanqienovel.com'));\n        let sessionId = cookieHeader.match(/sessionid=([^;]+)/)?.[1] || null;\n        if (sessionId) return sessionId;\n    } catch (e) {}\n    return \"\";\n}\n\nfunction getJjToken() {\n    let { source } = this;\n    let config = getConfig.call(this);\n\n    let loginInfoKey = '';\n    try {\n        let info = source.getLoginInfoMap() || {};\n        loginInfoKey = String(info.get('晋江登录Token') || '').trim();\n    } catch (e) {}\n\n    if (loginInfoKey) return loginInfoKey;\n\n    return String(config.jj_token || '').trim();\n}\n\nfunction buildJjHeaders() {\n    let { java } = this;\n    return {\n        \"source\": \"android\",\n        \"versiontype\": \"reading\",\n        \"versioncode\": \"467\",\n        \"version-code\": \"467\",\n        \"User-Agent\": java.getWebViewUA()\n    };\n}\n\nfunction jjEncode(data) {\n    let { java } = this;\n    return java.createSymmetricCrypto(\"DES/CBC/PKCS5Padding\", \"KW8Dvm2N\", \"1ae2c94b\").encryptBase64(data);\n}\n\nfunction isShelfSyncEnabled() {\n    try {\n        return String(getConfig.call(this).shelf_sync || 'off') == 'on';\n    } catch (e) {\n        return false;\n    }\n}\n\nfunction syncShelf(isAdd) {\n    let { java, book } = this;\n    try {\n        if (!book || !book.tocUrl) return;\n        let raw = String(book.tocUrl || '').replace(/\\\\/g, '').replace(/^data:catalogUrl;base64,/, '');\n        let idx = raw.indexOf(',');\n        if (idx >= 0) raw = raw.substring(0, idx);\n        raw = raw.replace(/[^A-Za-z0-9+/=]/g, '');\n        let catalog = JSON.parse(String(java.base64Decode(raw) || '').replace(/\\\\/g, ''));\n        let sourceName = String(catalog.source || '');\n        let bookId = String(catalog.book_id || catalog.bookid || '');\n        if (!bookId) return;\n\n        let apiSource = '';\n        let logins = '';\n        if (sourceName.indexOf('番茄') >= 0) {\n            apiSource = '番茄';\n            logins = getSessionId.call(this) || getSessionIdFromCookie.call(this);\n        } else if (sourceName.indexOf('晋江') >= 0) {\n            apiSource = '晋江';\n            logins = getJjToken.call(this);\n        }\n        if (!apiSource || !logins) {\n            java.toast('书架同步：请先登录' + apiSource);\n            return;\n        }\n\n        let res = postJson.call(this, '/api/bookshelf/sync', {\n            source: apiSource,\n            logins: String(logins),\n            book_id: bookId,\n            action: isAdd ? 'add' : 'del',\n            group: ''\n        });\n        if (res && res.code == 0) {\n            java.toast((isAdd ? '已同步到' : '已从') + apiSource + (isAdd ? '书架' : '书架移除'));\n        } else {\n            java.toast((res && res.message) || '书架同步失败');\n        }\n    } catch (e) {\n        java.log('syncShelf error: ' + e);\n        java.toast('书架同步失败');\n    }\n}\n\nfunction syncProgress(chapterParams) {\n    let { java } = this;\n    try {\n        let conf = getConfig.call(this);\n        if ((conf.progress_sync || 'off') != 'on') return;\n\n        let sourceName = String(chapterParams.source || '');\n        let logins = '';\n        if (/^晋江/.test(sourceName)) {\n            logins = String(conf.jj_token || '');\n        } else if (/^番茄/.test(sourceName)) {\n            logins = String(conf.fanqie_sessionid || '');\n        }\n        if (!logins) return;\n\n        let headers = buildHeaders.call(this);\n        headers['Content-Type'] = 'application/json';\n\n        let body = JSON.stringify({\n            source: sourceName,\n            book_id: String(chapterParams.book_id || ''),\n            item_id: String(chapterParams.item_id || ''),\n            logins: logins\n        });\n\n        let opt = { method: 'POST', body: body, headers: headers };\n        let res = java.ajax(getHost.call(this) + '/api/progress,' + JSON.stringify(opt));\n        res = decryptIfEncrypted.call(this, res);\n        let obj = JSON.parse(res);\n        if (obj.code !== 0) java.log('进度同步失败：' + (obj.message || '未知错误'));\n    } catch (e) {\n        java.log('进度同步异常：' + e);\n    }\n}\n\nfunction decryptIfEncrypted(res) {\n    let raw = String(res == undefined || res == null ? '' : res).trim();\n    if (!raw) return res;\n\n    if (raw.indexOf('\"aes-256-gcm\"') >= 0 && raw.charAt(0) == '{') {\n        try {\n            let obj = JSON.parse(raw);\n            if (obj.alg == 'aes-256-gcm' && obj.data && obj.iv && obj.tag) {\n                return aesGcmDecrypt.call(this, raw);\n            }\n            if (obj.data && typeof obj.data == 'object' && obj.data.alg == 'aes-256-gcm') {\n                let dec = aesGcmDecrypt.call(this, obj.data);\n                try { obj.data = JSON.parse(dec); }\n                catch (e) { obj.data = dec; }\n                return JSON.stringify(obj);\n            }\n        } catch (e) {}\n    }\n    return res;\n}\n\nfunction aesGcmDecrypt(payload) {\n    let { java } = this;\n    let obj = null;\n    try {\n        obj = (typeof payload == 'string') ? JSON.parse(payload) : payload;\n        if (!obj || obj.alg !== 'aes-256-gcm' || !obj.data || !obj.iv || !obj.tag) return payload;\n    } catch (e) { return payload; }\n\n    try {\n        let C = Packages.javax.crypto.Cipher;\n        let K = Packages.javax.crypto.spec.SecretKeySpec;\n        let G = Packages.javax.crypto.spec.GCMParameterSpec;\n        let S = Packages.java.lang.String;\n        let A = Packages.java.util.Arrays;\n        let Sys = Packages.java.lang.System;\n\n        let keyBytes = new S(\"Lk4#Fj9&Gh1*Ds6^Qw3!Er8@Ty5%Ui0o\").getBytes(\"UTF-8\");\n        let ivBytes = java.base64DecodeToByteArray(obj.iv);\n        let tagBytes = java.base64DecodeToByteArray(obj.tag);\n        let dataBytes = java.base64DecodeToByteArray(obj.data);\n\n        let combined = A.copyOf(dataBytes, dataBytes.length + tagBytes.length);\n        Sys.arraycopy(tagBytes, 0, combined, dataBytes.length, tagBytes.length);\n\n        let cipher = C.getInstance(\"AES/GCM/NoPadding\");\n        cipher.init(C.DECRYPT_MODE, new K(keyBytes, \"AES\"), new G(128, ivBytes));\n        return new S(cipher.doFinal(combined), \"UTF-8\").toString();\n    } catch (e) {}\n\n    try {\n        function b64dec(s) {\n            let T = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n            let out = [], v = 0, bits = 0;\n            s = String(s).replace(/[^A-Za-z0-9+/]/g, '');\n            for (let i = 0; i < s.length; i++) {\n                v = (v << 6) | T.indexOf(s.charAt(i));\n                bits += 6;\n                if (bits >= 8) { bits -= 8; out.push((v >> bits) & 0xFF); }\n            }\n            return out;\n        }\n        function utf8dec(plain) {\n            let s = '', buf = [];\n            for (let i = 0; i < plain.length; i++) {\n                let c = plain[i];\n                if (c < 0x80) buf.push(c);\n                else if (c < 0xE0) buf.push(((c & 0x1F) << 6) | (plain[++i] & 0x3F));\n                else if (c < 0xF0) buf.push(((c & 0x0F) << 12) | ((plain[++i] & 0x3F) << 6) | (plain[++i] & 0x3F));\n                else {\n                    let cp = ((c & 0x07) << 18) | ((plain[++i] & 0x3F) << 12) | ((plain[++i] & 0x3F) << 6) | (plain[++i] & 0x3F);\n                    cp -= 0x10000;\n                    buf.push(0xD800 + (cp >> 10), 0xDC00 + (cp & 0x3FF));\n                }\n                if (buf.length > 4096) { s += String.fromCharCode.apply(null, buf); buf = []; }\n            }\n            s += String.fromCharCode.apply(null, buf);\n            return s;\n        }\n\n        let SBOX = [\n            0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76,\n            0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0,\n            0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15,\n            0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75,\n            0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84,\n            0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf,\n            0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8,\n            0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2,\n            0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73,\n            0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb,\n            0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79,\n            0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08,\n            0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a,\n            0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e,\n            0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf,\n            0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16\n        ];\n        function xtime(a) { return ((a << 1) ^ (a & 0x80 ? 0x1b : 0)) & 0xFF; }\n        function gmul(a, b) {\n            let p = 0;\n            for (let i = 0; i < 8; i++) {\n                if (b & 1) p ^= a;\n                let hi = a & 0x80;\n                a = (a << 1) & 0xFF;\n                if (hi) a ^= 0x1b;\n                b >>= 1;\n            }\n            return p;\n        }\n        function expandKey(key) {\n            let Nk = 8, w = [], rcon = 1;\n            for (let i = 0; i < Nk; i++) w.push([key[4*i], key[4*i+1], key[4*i+2], key[4*i+3]]);\n            for (let i = Nk; i < 60; i++) {\n                let t = w[i-1].slice();\n                if (i % Nk == 0) {\n                    t = [t[1], t[2], t[3], t[0]].map(x => SBOX[x]);\n                    t[0] ^= rcon;\n                    rcon = xtime(rcon);\n                } else if (i % Nk == 4) {\n                    t = t.map(x => SBOX[x]);\n                }\n                w.push([w[i-Nk][0]^t[0], w[i-Nk][1]^t[1], w[i-Nk][2]^t[2], w[i-Nk][3]^t[3]]);\n            }\n            let rk = [];\n            for (let i = 0; i < w.length; i++) rk.push(w[i][0], w[i][1], w[i][2], w[i][3]);\n            return rk;\n        }\n        function encryptBlock(rk, input) {\n            let st = input.slice(0, 16);\n            for (let i = 0; i < 16; i++) st[i] ^= rk[i];\n            for (let round = 1; round <= 14; round++) {\n                for (let i = 0; i < 16; i++) st[i] = SBOX[st[i]];\n                let t = st.slice();\n                for (let r = 1; r < 4; r++)\n                    for (let c = 0; c < 4; c++)\n                        st[r + 4*c] = t[r + 4*((c + r) % 4)];\n                if (round !== 14) {\n                    for (let c = 0; c < 4; c++) {\n                        let i = 4*c;\n                        let a0 = st[i], a1 = st[i+1], a2 = st[i+2], a3 = st[i+3];\n                        st[i]   = gmul(a0,2)^gmul(a1,3)^a2^a3;\n                        st[i+1] = a0^gmul(a1,2)^gmul(a2,3)^a3;\n                        st[i+2] = a0^a1^gmul(a2,2)^gmul(a3,3);\n                        st[i+3] = gmul(a0,3)^a1^a2^gmul(a3,2);\n                    }\n                }\n                for (let i = 0; i < 16; i++) st[i] ^= rk[round*16 + i];\n            }\n            return st;\n        }\n        function gfMul(x, y) {\n            let z = new Array(16).fill(0);\n            let v = y.slice();\n            for (let i = 0; i < 128; i++) {\n                if ((x[i >> 3] >> (7 - (i & 7))) & 1) {\n                    for (let j = 0; j < 16; j++) z[j] ^= v[j];\n                }\n                let lsb = v[15] & 1;\n                for (let j = 15; j > 0; j--) v[j] = ((v[j] >> 1) | ((v[j-1] & 1) << 7)) & 0xFF;\n                v[0] >>= 1;\n                if (lsb) v[0] ^= 0xE1;\n            }\n            return z;\n        }\n        function writeBitsBE(arr, offset, bits) {\n            for (let i = 0; i < 8; i++) {\n                arr[offset + 7 - i] = bits % 256;\n                bits = Math.floor(bits / 256);\n            }\n        }\n        function ghash(H, data, aadBits, ctBits) {\n            let y = new Array(16).fill(0);\n            for (let i = 0; i < data.length; i += 16) {\n                let block = new Array(16).fill(0);\n                for (let j = 0; j < 16 && i + j < data.length; j++) block[j] = data[i+j];\n                for (let j = 0; j < 16; j++) y[j] ^= block[j];\n                y = gfMul(y, H);\n            }\n            let lenBlock = new Array(16).fill(0);\n            writeBitsBE(lenBlock, 0, aadBits);\n            writeBitsBE(lenBlock, 8, ctBits);\n            for (let j = 0; j < 16; j++) y[j] ^= lenBlock[j];\n            y = gfMul(y, H);\n            return y;\n        }\n        function inc32(block) {\n            for (let i = 15; i >= 12; i--) {\n                block[i] = (block[i] + 1) & 0xFF;\n                if (block[i] !== 0) break;\n            }\n        }\n        function gcmDecrypt(key, iv, ct, tag) {\n            let rk = expandKey(key);\n            let H = encryptBlock(rk, new Array(16).fill(0));\n            let J0;\n            if (iv.length == 12) J0 = iv.concat([0, 0, 0, 1]);\n            else J0 = ghash(H, iv, 0, iv.length * 8);\n            let S = ghash(H, ct, 0, ct.length * 8);\n            let ej0 = encryptBlock(rk, J0);\n            let calcTag = new Array(16);\n            for (let i = 0; i < 16; i++) calcTag[i] = S[i] ^ ej0[i];\n            for (let i = 0; i < 16; i++) {\n                if (calcTag[i] !== tag[i]) return null;\n            }\n            let out = [];\n            let ctr = J0.slice();\n            for (let i = 0; i < ct.length; i += 16) {\n                inc32(ctr);\n                let ks = encryptBlock(rk, ctr);\n                for (let j = 0; j < 16 && i + j < ct.length; j++) {\n                    out.push(ct[i+j] ^ ks[j]);\n                }\n            }\n            return out;\n        }\n\n        let key = [];\n        let keyStr = \"Lk4#Fj9&Gh1*Ds6^Qw3!Er8@Ty5%Ui0o\";\n        for (let i = 0; i < keyStr.length; i++) key.push(keyStr.charCodeAt(i) & 0xFF);\n\n        let iv = b64dec(obj.iv);\n        let tag = b64dec(obj.tag);\n        let ct = b64dec(obj.data);\n\n        let plain = gcmDecrypt(key, iv, ct, tag);\n        if (!plain) return payload;\n        return utf8dec(plain);\n    } catch (e) {\n        return payload;\n    }\n}\n\nfunction getJjShelfClass() {\n    let { java } = this;\n    try {\n        var token = getJjToken.call(this);\n        if (!token) {\n            java.toast(\"请先配置晋江登录Token\");\n            return;\n        }\n\n        var url = \"https://app.jjwxc.org/app.jjwxc/android/reading/FavoriteClass/favoriteClass\";\n        var body = encode.call(this, JSON.stringify({\n            \"versionCode\": \"444\",\n            \"token\": token\n        }));\n\n        var headers = {\n            \"versioncode\": \"444\",\n            \"versiontype\": \"reading\",\n            \"User-Agent\": java.getWebViewUA()\n        };\n\n        var res = java.post(url, body, headers).body();\n        var data = JSON.parse(res);\n\n        if (!data || !data.data || !data.data.length) {\n            java.log(\"获取分类失败: \" + res);\n            java.toast(\"获取分类失败，请检查登录状态\");\n            return;\n        }\n\n        var excludeIds = { \"-1\": true, \"-2\": true, \"-3\": true };\n        var classList = [];\n        for (var i = 0; i < data.data.length; i++) {\n            var item = data.data[i];\n            var cid = String(item.classid);\n            if (excludeIds[cid]) continue;\n            classList.push({\n                classId: cid,\n                className: String(item.classname)\n            });\n        }\n\n        if (classList.length == 0) {\n            java.toast(\"暂无可用分类\");\n            return;\n        }\n\n        var config = getConfig.call(this);\n        var savedId = String(config.type_id || \"\");\n\n        var cardsHtml = \"\";\n        for (var j = 0; j < classList.length; j++) {\n            var c = classList[j];\n            var selected = (String(c.classId) == savedId) ? \" selected\" : \"\";\n            cardsHtml +=\n                '<div class=\"class-card' + selected + '\" data-id=\"' + c.classId + '\" onclick=\"pick(this)\">' +\n                    '<div class=\"class-name\">' + c.className + '</div>' +\n                    '<div class=\"class-id\">ID: ' + c.classId + '</div>' +\n                '</div>';\n        }\n\n        var html = `<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no\">\n<title>晋江收藏分类</title>\n<style>\n*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}\nbody{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;background:#0a0a0f;background-image:radial-gradient(ellipse at 30% 20%, #2a1020 0%, #0a0e27 50%, #1a0d1a 100%);color:#e8e8f0;min-height:100vh;padding:20px}\n.header{text-align:center;padding:10px 0 18px}\n.header h1{font-size:1.3rem;font-weight:800;background:linear-gradient(135deg,#e8e8f0 40%,#c14a63);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}\n.header p{font-size:.72rem;color:#8888a0;margin-top:4px}\n.current-bar{display:flex;align-items:center;gap:8px;padding:10px 14px;margin-bottom:16px;background:rgba(193,74,99,.1);border:1px solid rgba(193,74,99,.3);border-radius:10px;font-size:.74rem;color:rgba(255,255,255,.85)}\n.current-bar strong{color:#fff}\n.grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}\n.class-card{position:relative;padding:16px 10px;border-radius:14px;background:rgba(255,255,255,.04);border:2px solid rgba(255,255,255,.08);cursor:pointer;transition:all .25s;text-align:center}\n.class-card:hover{border-color:rgba(255,255,255,.2);background:rgba(255,255,255,.08)}\n.class-card.selected{border-color:#c14a63;background:rgba(193,74,99,.18);box-shadow:0 0 20px rgba(193,74,99,.3)}\n.class-card.selected::after{content:'✓';position:absolute;top:6px;right:8px;width:18px;height:18px;border-radius:50%;background:#c14a63;color:#fff;font-size:11px;display:flex;align-items:center;justify-content:center}\n.class-name{font-size:.8rem;font-weight:600;color:rgba(255,255,255,.9);word-break:break-all}\n.class-id{font-size:.62rem;color:rgba(255,255,255,.4);margin-top:4px}\n.tip{text-align:center;font-size:.68rem;color:rgba(255,255,255,.35);margin-top:20px}\n</style>\n</head>\n<body>\n<div class=\"header\">\n    <h1>晋江收藏分类</h1>\n    <p>选择后点击右上角 ✓ 保存</p>\n</div>\n<div class=\"current-bar\">\n    <span>当前已选择分类ID：<strong id=\"currentId\">` + (savedId || \"-\") + `</strong></span>\n</div>\n<div class=\"grid\" id=\"grid\">` + cardsHtml + `</div>\n<div class=\"tip\">新分类请先在晋江 App 内创建</div>\n<div id=\"result-output\" style=\"display:none;\">` + savedId + `</div>\n<script>\nfunction pick(el){\n    document.querySelectorAll('.class-card').forEach(function(c){c.classList.remove('selected');});\n    el.classList.add('selected');\n    document.getElementById('currentId').textContent = el.getAttribute('data-id');\n    document.getElementById('result-output').textContent = el.getAttribute('data-id');\n}\n</script>\n</body>\n</html>`;\n\n        var base64 = \"data:text/html;base64,\" + java.base64Encode(html);\n        var result = java.startBrowserAwait(base64, \"晋江收藏分类\", false);\n\n        if (!result || !result.body()) {\n            java.toast(\"已取消分类设置\");\n            return;\n        }\n\n        var bodyHtml = result.body();\n        var match = bodyHtml.match(/<div id=\"result-output\"[^>]*>([^<]*)<\\/div>/);\n        var newId = \"\";\n        if (match && match[1]) {\n            newId = match[1].trim();\n        }\n\n        if (!newId) {\n            java.toast(\"未选择分类\");\n            return;\n        }\n\n        setConfig.call(this, { type_id: String(newId) });\n        java.toast(\"\\n已保存分类ID：\" + newId);\n\n    } catch (e) {\n        java.log(\"获取书架分类失败: \" + e);\n        java.toast(\"\\n获取书架分类失败\");\n    }\n}\n\nfunction selectSource() {\n    let { java } = this;\n    var base = getHost.call(this);\n    var list = [];\n    try {\n        var opt = { method: 'POST', body: '{}' };\n        var res = java.ajax(base + '/api/source,' + JSON.stringify(opt));\n        var arr = JSON.parse(res);\n        if (Array.isArray(arr)) {\n            for (var i = 0; i < arr.length; i++) {\n                var it = arr[i];\n                if (it && it.enabled && it.name) list.push(it);\n            }\n            list.sort(function (a, b) { return (a.sort || 0) - (b.sort || 0); });\n        }\n    } catch (e) {\n        java.toast('源站列表请求失败：' + e);\n        return;\n    }\n    if (!list.length) { java.toast('源站列表为空'); return; }\n\n    var conf = getConfig.call(this);\n    var TABS = ['novel', 'audio', 'comic', 'video', 'download'];\n    var TAB_LABEL = { novel: '小说', audio: '听书', comic: '漫画', video: '短剧', download: '下载' };\n    var TAB_ICON = { novel: 'fa-book-open', audio: 'fa-headphones', comic: 'fa-images', video: 'fa-film', download: 'fa-download' };\n\n    var sourcesCfg = conf.sources || {};\n    TABS.forEach(function (t) { if (!Array.isArray(sourcesCfg[t])) sourcesCfg[t] = []; });\n\n    var allCfg = Array.isArray(conf.allTabs) ? conf.allTabs.slice() : [];\n    TABS.forEach(function (t) {\n        if (sourcesCfg[t].length > 0 && allCfg.indexOf(t) !== -1) {\n            allCfg = allCfg.filter(function (x) { return x !== t; });\n        }\n    });\n\n    var tabMap = {};\n    for (var i = 0; i < list.length; i++) {\n        var item = list[i];\n        var tab = item.tab || 'novel';\n        if (TABS.indexOf(tab) == -1) continue;\n        if (!tabMap[tab]) tabMap[tab] = [];\n        tabMap[tab].push(item);\n    }\n\n    var tabsData = [];\n    for (var t = 0; t < TABS.length; t++) {\n        var tabKey = TABS[t];\n        var items = tabMap[tabKey] || [];\n        var selNames = sourcesCfg[tabKey] || [];\n        var isAll = allCfg.indexOf(tabKey) !== -1;\n        var cards = [];\n        cards.push({ name: '', label: '全部源站', all: true, sel: isAll, lv: '' });\n        for (var j = 0; j < items.length; j++) {\n            var it = items[j];\n            var lvNum = (it.group && it.group.level) ? Number(it.group.level) : Number(it.min_user_group || 1);\n            cards.push({\n                name: it.name,\n                label: it.name,\n                all: false,\n                sel: selNames.indexOf(it.name) !== -1,\n                lv: lvNum > 1 ? ('LV' + lvNum) : ''\n            });\n        }\n        tabsData.push({ tab: tabKey, label: TAB_LABEL[tabKey], icon: TAB_ICON[tabKey], cards: cards });\n    }\n\n    function jsonForHtml(v) {\n        return JSON.stringify(v).replace(/</g, '\\\\u003c').replace(/>/g, '\\\\u003e').replace(/&/g, '\\\\u0026');\n    }\n    var dataJson = jsonForHtml(tabsData);\n\n    var html = '<!DOCTYPE html><html lang=\"zh-CN\" data-theme=\"glass\" data-mode=\"light\"><head>' +\n        '<meta charset=\"UTF-8\">' +\n        '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover\">' +\n        '<meta name=\"theme-color\" content=\"#E8EEF6\">' +\n        '<title>源站选择</title>' +\n        '<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css\">' +\n        '<style>' +\n        ':root{' +\n        '--bg-rgb:232,238,246;--surface-rgb:255,255,255;--text-rgb:31,38,51;--muted-rgb:108,120,140;' +\n        '--line-rgb:150,165,190;--primary-rgb:91,124,250;' +\n        '--bg:#e8eef6;--surface:#ffffff;--surface-soft:#f6f9ff;--text:#1f2633;--muted:#6c788c;' +\n        '--primary:#5b7cfa;--primary-dark:#4363d8;--primary-ink:#f7f9ff;' +\n        '--border:rgba(var(--line-rgb),.18);--primary-soft:rgba(var(--primary-rgb),.08);' +\n        '--text-soft:rgba(var(--text-rgb),.78);--border-soft:rgba(var(--line-rgb),.16);' +\n        '--card-bg:rgba(var(--surface-rgb),.78);' +\n        '--radius-lg:20px;--radius:14px;--radius-sm:10px;' +\n        '--shadow:0 18px 40px -26px rgba(31,45,80,.35),0 2px 8px rgba(31,45,80,.05);' +\n        '--shadow-card:var(--shadow);' +\n        '--font-cn:\"PingFang SC\",\"Hiragino Sans GB\",\"Microsoft YaHei\",system-ui,-apple-system,\"Segoe UI\",Roboto,sans-serif;' +\n        '}' +\n        '*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}' +\n        'html{min-height:100%}' +\n        'body{margin:0;min-height:100vh;color:var(--text);font-family:var(--font-cn);font-size:15px;line-height:1.6;' +\n        'background:var(--bg);position:relative;overflow-x:hidden;' +\n        '-webkit-font-smoothing:antialiased;' +\n        'padding:calc(14px + env(safe-area-inset-top)) 14px calc(22px + env(safe-area-inset-bottom))}' +\n        'body::before{content:\"\";position:fixed;inset:0;z-index:0;pointer-events:none;' +\n        'background:radial-gradient(900px 520px at 12% -8%,rgba(var(--primary-rgb),.16),transparent 68%),' +\n        'radial-gradient(760px 480px at 94% 4%,rgba(120,220,230,.18),transparent 72%),' +\n        'linear-gradient(180deg,var(--bg),var(--bg))}' +\n        '.wrap{max-width:720px;margin:0 auto;position:relative;z-index:1}' +\n        '.glass{background:linear-gradient(155deg,rgba(var(--surface-rgb),.86),rgba(var(--surface-rgb),.58));' +\n        'border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-card);' +\n        'backdrop-filter:blur(22px) saturate(1.2);-webkit-backdrop-filter:blur(22px) saturate(1.2);' +\n        'animation:slideIn .5s cubic-bezier(.22,.61,.36,1)}' +\n        '@keyframes slideIn{from{opacity:0;transform:translateY(18px) scale(.99)}to{opacity:1;transform:none}}' +\n        '.hero{display:flex;align-items:center;gap:14px;padding:17px 18px;margin-bottom:12px}' +\n        '.hero-icon{flex:0 0 auto;width:46px;height:46px;border-radius:14px;display:flex;align-items:center;justify-content:center;font-size:20px;' +\n        'background:linear-gradient(135deg,var(--primary),var(--primary-dark));color:#fff;' +\n        'box-shadow:0 12px 24px -12px rgba(var(--primary-rgb),.85)}' +\n        '.hero h1{margin:0;font-size:19px;line-height:1.25;letter-spacing:.2px}' +\n        '.hero p{margin:5px 0 0;font-size:12px;line-height:1.55;color:var(--muted)}' +\n        '.tabs{display:flex;gap:6px;overflow-x:auto;padding:6px;margin-bottom:12px;scrollbar-width:none;-ms-overflow-style:none}' +\n        '.tabs::-webkit-scrollbar{display:none}' +\n        '.tab{flex:0 0 auto;display:inline-flex;align-items:center;gap:7px;border:1px solid transparent;background:transparent;color:var(--muted);' +\n        'padding:9px 12px;border-radius:12px;font:inherit;font-size:13px;font-weight:600;cursor:pointer;transition:.18s}' +\n        '.tab:hover{background:rgba(var(--surface-rgb),.5);color:var(--text)}' +\n        '.tab.on{background:var(--primary-soft);color:var(--primary);border-color:rgba(var(--primary-rgb),.28)}' +\n        '.tab i{font-size:13px}.tab-count{font-size:10px;line-height:1.6;padding:0 6px;border-radius:999px;background:rgba(var(--line-rgb),.14);opacity:.85}' +\n        '.panel{display:none}.panel.on{display:block;animation:fade .18s ease}' +\n        '@keyframes fade{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}' +\n        '.all-card{width:100%;display:flex;align-items:center;gap:10px;padding:14px 16px;margin-bottom:10px;border-radius:16px;' +\n        'border:1px solid var(--border);background:linear-gradient(155deg,rgba(var(--surface-rgb),.9),rgba(var(--surface-rgb),.6));' +\n        'box-shadow:0 12px 30px -24px rgba(31,45,80,.55);color:var(--text);font:inherit;text-align:left;cursor:pointer;transition:.18s}' +\n        '.all-card .ico{font-size:16px;color:var(--primary)}.all-card .t{flex:1;font-size:14px;font-weight:600}' +\n        '.all-card.sel{border-color:rgba(var(--primary-rgb),.5);background:linear-gradient(155deg,rgba(var(--primary-rgb),.16),rgba(var(--primary-rgb),.05));box-shadow:0 0 0 3px var(--primary-soft)}' +\n        '.check{flex:0 0 auto;width:22px;height:22px;border-radius:50%;border:1px solid var(--border);background:rgba(var(--surface-rgb),.6);' +\n        'display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:800;color:transparent;transition:.18s}' +\n        '.all-card.sel .check,.src-card.sel .check{background:var(--primary);border-color:var(--primary);color:#fff}' +\n        '.grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:9px}' +\n        '@media(max-width:520px){.grid{grid-template-columns:repeat(2,minmax(0,1fr))}}' +\n        '.src-card{position:relative;display:flex;align-items:center;justify-content:center;min-height:78px;padding:12px 10px 14px;' +\n        'border-radius:16px;border:1px solid var(--border);background:linear-gradient(155deg,rgba(var(--surface-rgb),.9),rgba(var(--surface-rgb),.6));' +\n        'box-shadow:0 12px 28px -24px rgba(31,45,80,.5);color:var(--text);font:inherit;font-size:12.5px;line-height:1.4;' +\n        'word-break:break-all;cursor:pointer;transition:.18s}' +\n        '.src-card:active{transform:scale(.97)}' +\n        '.src-card.sel{border-color:rgba(var(--primary-rgb),.52);background:linear-gradient(155deg,rgba(var(--primary-rgb),.16),rgba(var(--primary-rgb),.05));box-shadow:0 0 0 3px var(--primary-soft)}' +\n        '.src-card .name{max-width:100%;text-align:center}' +\n        '.src-card .lv{position:absolute;right:8px;bottom:7px;font-size:9px;font-weight:700;color:#b98a3a;background:rgba(185,138,58,.13);border:1px solid rgba(185,138,58,.32);padding:1px 5px;border-radius:6px}' +\n        '.src-card .check{position:absolute;top:7px;right:7px;width:18px;height:18px;font-size:10px}' +\n        '.empty{text-align:center;color:var(--muted);padding:38px 12px;font-size:13px}' +\n        '.tips{display:flex;align-items:center;gap:9px;margin-top:14px;padding:12px 16px;border-radius:16px;color:var(--muted);font-size:12px;line-height:1.55}' +\n        '.tips .dot{flex:0 0 auto;width:7px;height:7px;border-radius:50%;background:var(--primary);box-shadow:0 0 0 4px var(--primary-soft)}' +\n        '.tips b{color:var(--text)}' +\n        '</style></head><body><div class=\"wrap\">' +\n        '<header class=\"hero glass\"><div class=\"hero-icon\"><i class=\"fa-solid fa-satellite-dish\"></i></div><div><h1>源站选择</h1><p>按分类多选，点选需要的站点；「全部源站」与具体源站互斥</p></div></header>' +\n        '<div class=\"tabs glass\" id=\"tabs\" role=\"tablist\"></div>' +\n        '<main id=\"panels\"></main>' +\n        '<footer class=\"tips glass\"><span class=\"dot\"></span><span id=\"sel-tip\">已选 <b id=\"sel-count\">0</b> 个源站</span></footer>' +\n        '</div><div id=\"result-output\" style=\"display:none;\"></div>' +\n        '<script>' +\n        'var DATA=' + dataJson + ';' +\n        'var curTab=DATA.length?DATA[0].tab:\"novel\";' +\n        'var tabsEl=document.getElementById(\"tabs\"),panelsEl=document.getElementById(\"panels\"),outEl=document.getElementById(\"result-output\");' +\n        'function esc(v){return String(v==undefined?\"\":v).replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/\\'/g,\"&#39;\");}' +\n        'function renderTabs(){var h=\"\";for(var i=0;i<DATA.length;i++){var g=DATA[i];var n=g.cards.length>1?g.cards.length-1:0;' +\n        'h+=\"<button type=\\\\\"button\\\\\" class=\\\\\"tab\"+(g.tab==curTab?\" on\":\"\")+\"\\\\\" role=\\\\\"tab\\\\\" data-tab=\\\\\"\"+esc(g.tab)+\"\\\\\"><i class=\\\\\"fa-solid \"+g.icon+\"\\\\\"></i>\"+esc(g.label)+\"<span class=\\\\\"tab-count\\\\\">\"+n+\"</span></button>\";}tabsEl.innerHTML=h;}' +\n        'function renderPanels(){var h=\"\";for(var i=0;i<DATA.length;i++){var g=DATA[i];h+=\"<section class=\\\\\"panel\"+(g.tab==curTab?\" on\":\"\")+\"\\\\\" data-panel=\\\\\"\"+esc(g.tab)+\"\\\\\">\";' +\n        'var all=g.cards[0];h+=\"<button type=\\\\\"button\\\\\" class=\\\\\"all-card\"+(all.sel?\" sel\":\"\")+\"\\\\\" data-all=\\\\\"1\\\\\" data-name=\\\\\"\\\\\"><i class=\\\\\"fa-solid fa-globe ico\\\\\"></i><span class=\\\\\"t\\\\\">全部源站</span><span class=\\\\\"check\\\\\"><i class=\\\\\"fa-solid fa-check\\\\\"></i></span></button>\";' +\n        'var others=g.cards.slice(1);if(!others.length){h+=\"<div class=\\\\\"empty\\\\\">该分类暂无源站</div>\";}else{h+=\"<div class=\\\\\"grid\\\\\">\";' +\n        'for(var j=0;j<others.length;j++){var c=others[j];h+=\"<button type=\\\\\"button\\\\\" class=\\\\\"src-card\"+(c.sel?\" sel\":\"\")+\"\\\\\" data-name=\\\\\"\"+esc(c.name)+\"\\\\\"><span class=\\\\\"name\\\\\">\"+esc(c.label)+\"</span>\"+(c.lv?\"<span class=\\\\\"lv\\\\\">\"+esc(c.lv)+\"</span>\":\"\")+\"<span class=\\\\\"check\\\\\"><i class=\\\\\"fa-solid fa-check\\\\\"></i></span></button>\";}' +\n        'h+=\"</div>\";}h+=\"</section>\";}panelsEl.innerHTML=h;}' +\n        'function renderAll(){renderTabs();renderPanels();}' +\n        'function setTab(tab){curTab=tab;renderAll();}' +\n        'function getGroup(tab){for(var i=0;i<DATA.length;i++){if(DATA[i].tab==tab){return DATA[i];}}return null;}' +\n        'function setSelected(btn,on){if(on){btn.classList.add(\"sel\");}else{btn.classList.remove(\"sel\");}}' +\n        'function syncOut(){var out={novel:[],audio:[],comic:[],video:[],download:[]};var allSel=[];' +\n        'var nodes=panelsEl.querySelectorAll(\".src-card.sel\");for(var i=0;i<nodes.length;i++){var p=nodes[i].parentNode;while(p&&!p.getAttribute(\"data-panel\")){p=p.parentNode;}var t=p?p.getAttribute(\"data-panel\"):\"\";var n=nodes[i].getAttribute(\"data-name\");if(t&&out[t]&&n&&out[t].indexOf(n)<0){out[t].push(n);}}' +\n        'var allNodes=panelsEl.querySelectorAll(\".all-card.sel\");for(var k=0;k<allNodes.length;k++){var p2=allNodes[k].parentNode;while(p2&&!p2.getAttribute(\"data-panel\")){p2=p2.parentNode;}if(p2){allSel.push(p2.getAttribute(\"data-panel\"));}}' +\n        'outEl.textContent=JSON.stringify(allSel)+\"|||\"+JSON.stringify(out);' +\n        'var cnt=0;for(var key in out){if(out.hasOwnProperty(key)){cnt+=out[key].length;}}' +\n        'var el=document.getElementById(\"sel-count\");if(el){el.textContent=String(cnt);}' +\n        'var tip=document.getElementById(\"sel-tip\");if(tip){tip.innerHTML=\"已选 <b id=\\\\\"sel-count\\\\\">\"+cnt+\"</b> 个源站\"+(allSel.length?\" · 全部源站分类：\"+allSel.join(\"、\"):\"\");}}' +\n        'function toggleAll(btn){var panel=btn.parentNode;var tab=panel.getAttribute(\"data-panel\");var g=getGroup(tab);if(!g){return;}' +\n        'var on=!g.cards[0].sel;g.cards[0].sel=on;for(var j=1;j<g.cards.length;j++){g.cards[j].sel=false;}' +\n        'var allBtn=panel.querySelector(\".all-card\");var cards=panel.querySelectorAll(\".src-card\");' +\n        'setSelected(allBtn,on);for(var c=0;c<cards.length;c++){setSelected(cards[c],false);}syncOut();}' +\n        'function toggleOne(btn){var panel=btn.parentNode.parentNode;var tab=panel.getAttribute(\"data-panel\");var g=getGroup(tab);if(!g){return;}' +\n        'var name=btn.getAttribute(\"data-name\");g.cards[0].sel=false;' +\n        'var allBtn=panel.querySelector(\".all-card\");if(allBtn){setSelected(allBtn,false);}' +\n        'var on=false;for(var j=1;j<g.cards.length;j++){if(g.cards[j].name==name){g.cards[j].sel=!g.cards[j].sel;on=g.cards[j].sel;break;}}' +\n        'setSelected(btn,on);syncOut();}' +\n        'tabsEl.addEventListener(\"click\",function(e){var el=e.target;while(el&&el!==tabsEl&&!el.getAttribute(\"data-tab\")){el=el.parentNode;}if(el&&el!==tabsEl){setTab(el.getAttribute(\"data-tab\"));}});' +\n        'panelsEl.addEventListener(\"click\",function(e){var el=e.target;while(el&&el!==panelsEl&&!el.classList.contains(\"all-card\")&&!el.classList.contains(\"src-card\")){el=el.parentNode;}if(!el||el==panelsEl){return;}if(el.classList.contains(\"all-card\")){toggleAll(el);}else if(el.classList.contains(\"src-card\")){toggleOne(el);}});' +\n        'renderAll();syncOut();' +\n        '</script></body></html>';\n\n    var dataUrl = 'data:text/html;base64,' + java.base64Encode(html);\n    var choice = java.startBrowserAwait(dataUrl, '源站选择', false);\n    if (!choice || !choice.body()) { java.toast('已取消源站设置'); return; }\n\n    var body = choice.body();\n    var m = body.match(/<div id=\"result-output\"[^>]*>([^<]*)<\\/div>/);\n    var rawOut = (m && m[1]) ? m[1].trim() : '';\n    rawOut = rawOut.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&amp;/g, '&').replace(/&quot;/g, '\"').replace(/&#39;/g, \"'\");\n\n    var newSources = { novel: [], audio: [], comic: [], video: [], download: [] };\n    var newAllTabs = [];\n    try {\n        var parts = rawOut.split('|||');\n        var allArr = JSON.parse(parts[0] || '[]');\n        var srcObj = JSON.parse(parts[1] || '{}');\n        if (Array.isArray(allArr)) newAllTabs = allArr;\n        if (srcObj && typeof srcObj == 'object') {\n            TABS.forEach(function (t) { if (Array.isArray(srcObj[t])) newSources[t] = srcObj[t]; });\n        }\n    } catch (e) {}\n\n    TABS.forEach(function (t) {\n        if (newSources[t].length > 0) {\n            newAllTabs = newAllTabs.filter(function (x) { return x !== t; });\n        }\n    });\n\n    var merged = [];\n    TABS.forEach(function (t) {\n        newSources[t].forEach(function (n) { if (merged.indexOf(n) == -1) merged.push(n); });\n    });\n\n    setConfig.call(this, { sources: newSources, allTabs: newAllTabs, source: merged.join(',') });\n    var cnt = merged.length;\n    var allCnt = newAllTabs.length;\n    java.toast(cnt > 0 ? ('源站已保存（共 ' + cnt + ' 个）') : (allCnt > 0 ? '已保存（全部源站）' : '已保存（未选择具体源站）'));\n}\n\nfunction parseVer(v) {\n    return String(v || '').split('.').map(function (x) { return parseInt(x, 10) || 0; });\n}\n\nfunction cmpVer(a, b) {\n    let pa = parseVer(a), pb = parseVer(b);\n    let len = Math.max(pa.length, pb.length);\n    for (let i = 0; i < len; i++) {\n        let x = pa[i] || 0, y = pb[i] || 0;\n        if (x > y) return 1;\n        if (x < y) return -1;\n    }\n    return 0;\n}\n\nfunction shouldBlockByVersion(serverVerObj) {\n    if (!serverVerObj || !serverVerObj.version) return false;\n    let sv = String(serverVerObj.version);\n    let lv = String(localVersion || '');\n    if (cmpVer(sv, lv) <= 0) return false;\n\n    let isForce = (serverVerObj.force == true || String(serverVerObj.force) == 'true');\n    let tipMsg = serverVerObj.msg || '';   // ← 用 version.msg\n\n    if (isForce) {\n        try { java.toast('\\n服务端要求强制更新 ' + sv + (tipMsg ? '\\n' + tipMsg : '')); } catch (e) {}\n        try { checkVersion.call(this); } catch (e) {}\n    } else {\n        try { java.toast('有新版本 ' + sv + (tipMsg ? '\\n' + tipMsg : '') + '\\n可在登录页「🔄更新检测」查看'); } catch (e) {}\n    }\n\n    return false;\n}\n\nfunction checkVersion() {\n    let { java } = this;\n    var host = getHost.call(this);\n    var versionApi = host + '/api/version?aid=sy';\n    var siteApi = host + '/api/site/public';\n\n    function esc(v) {\n        return String(v == undefined ? '' : v)\n            .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\n            .replace(/\"/g, '&quot;').replace(/'/g, '&#39;');\n    }\n\n    var siteName = '书源更新';\n    try {\n        var siteRes = java.ajax(siteApi);\n        var siteObj = JSON.parse(siteRes);\n        if (siteObj && siteObj.data && siteObj.data.site_name) {\n            siteName = String(siteObj.data.site_name);\n        }\n    } catch (e) {}\n\n    var res;\n    try { res = java.ajax(versionApi); }\n    catch (e) { java.toast('版本检查失败：网络异常'); return; }\n    var obj;\n    try { obj = JSON.parse(res); }\n    catch (e) { java.toast('版本检查失败：返回解析异常'); return; }\n    if (!obj || obj.code !== 0 || !obj.data || !obj.data.version) {\n        java.toast((obj && obj.message) || '版本检查失败'); return;\n    }\n\n    var serverVer = String(obj.data.version);\n    var myLocalVer = String(localVersion || '');\n    var cmp = cmpVer(serverVer, myLocalVer);   // 复用 jsLib 的 cmpVer\n\n    if (cmp > 0) {\n        var msg = String(obj.data.msg || '有新版本啦');\n        var force = String(obj.data.force || 'false') == 'true';\n        var downloadUrl = String(obj.data.download_url || '');\n        var updateLog = obj.data.update_log || {};\n\n        var dates = Object.keys(updateLog).filter(function (d) {\n            return Array.isArray(updateLog[d]) && updateLog[d].length;\n        }).sort(function (a, b) { return b.localeCompare(a); });\n\n        var latestDate = dates[0] || '';\n        var latestItems = latestDate ? updateLog[latestDate] : [];\n        var historyDates = dates.slice(1);\n\n        var latestLogHtml = '';\n        latestItems.forEach(function (t) {\n            latestLogHtml += '<div class=\"update-text\">' + esc(t) + '</div>';\n        });\n\n        var historyHtml = '';\n        historyDates.forEach(function (d) {\n            historyHtml += '<div class=\"history-item\"><div class=\"history-date\"><i class=\"fas fa-calendar-day\"></i><span>' + esc(d) + '</span></div>';\n            updateLog[d].forEach(function (t) {\n                historyHtml += '<div class=\"history-text\">' + esc(t) + '</div>';\n            });\n            historyHtml += '</div>';\n        });\n        var historyCountText = historyDates.length ? '(' + historyDates.length + '条)' : '';\n\n        var bodyHtml = '<!DOCTYPE html><html lang=\"zh-CN\" data-theme=\"glass\" data-mode=\"light\"><head>' +\n            '<meta charset=\"UTF-8\">' +\n            '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0,viewport-fit=cover\">' +\n            '<title>' + esc(siteName) + '</title>' +\n            '<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css\">' +\n            '<style>' +\n            ':root{' +\n            '--bg-rgb:232,238,246;--surface-rgb:255,255,255;--text-rgb:31,38,51;--muted-rgb:108,120,140;' +\n            '--line-rgb:150,165,190;--primary-rgb:91,124,250;' +\n            '--bg:#e8eef6;--surface:#ffffff;--surface-soft:#f6f9ff;--text:#1f2633;--muted:#6c788c;' +\n            '--primary:#5b7cfa;--primary-dark:#4363d8;--primary-ink:#f7f9ff;' +\n            '--border:rgba(var(--line-rgb),.18);--primary-soft:rgba(var(--primary-rgb),.08);' +\n            '--text-soft:rgba(var(--text-rgb),.78);--border-soft:rgba(var(--line-rgb),.16);' +\n            '--card-bg:rgba(var(--surface-rgb),.78);' +\n            '--radius-lg:20px;--radius:14px;--radius-sm:10px;' +\n            '--shadow:0 18px 40px -26px rgba(31,45,80,.35),0 2px 8px rgba(31,45,80,.05);' +\n            '--shadow-card:var(--shadow);' +\n            '--font-cn:\"PingFang SC\",\"Hiragino Sans GB\",\"Microsoft YaHei\",system-ui,-apple-system,\"Segoe UI\",Roboto,sans-serif;' +\n            '--font-mono:\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,\"Courier New\",monospace;' +\n            '}' +\n            '*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}' +\n            'html{min-height:100%}' +\n            'body{margin:0;min-height:100vh;color:var(--text);font-family:var(--font-cn);font-size:15px;line-height:1.6;' +\n            'background:var(--bg);overflow-x:hidden;position:relative;' +\n            '-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;' +\n            'display:flex;align-items:center;justify-content:center;padding:calc(18px + env(safe-area-inset-top)) 14px calc(22px + env(safe-area-inset-bottom))}' +\n            '.waves{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden;background:linear-gradient(180deg,#eef3fb 0%,#e3ecf8 50%,#dbe6f5 100%)}' +\n            '.wave{position:absolute;left:-50%;width:200%;height:200%;border-radius:45%;opacity:.55;' +\n            'background:radial-gradient(circle at 50% 50%,rgba(91,124,250,.28),rgba(91,124,250,0) 65%);' +\n            'animation:waveMove 18s linear infinite}' +\n            '.wave.w1{top:-120%;animation-duration:20s}' +\n            '.wave.w2{top:-110%;animation-duration:26s;animation-direction:reverse;opacity:.4;' +\n            'background:radial-gradient(circle at 50% 50%,rgba(120,170,255,.24),rgba(120,170,255,0) 65%)}' +\n            '.wave.w3{top:-100%;animation-duration:32s;opacity:.3;' +\n            'background:radial-gradient(circle at 50% 50%,rgba(160,200,255,.22),rgba(160,200,255,0) 65%)}' +\n            '@keyframes waveMove{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}' +\n            'body::after{content:\"\";position:fixed;inset:0;z-index:0;pointer-events:none;' +\n            'background:radial-gradient(1200px 600px at 15% 0%,rgba(var(--bg-rgb),.1),rgba(var(--bg-rgb),0) 70%),' +\n            'linear-gradient(180deg,rgba(var(--bg-rgb),.06) 0%,rgba(var(--bg-rgb),.14) 55%,rgba(var(--bg-rgb),.22) 100%)}' +\n            'h1,h2,h3,p{margin:0}' +\n            '.wrap{width:100%;max-width:440px;position:relative;z-index:1}' +\n            '.card{box-sizing:border-box;padding:22px;border:1px solid var(--border);border-radius:var(--radius-lg);' +\n            'background:var(--card-bg);box-shadow:var(--shadow-card);' +\n            'backdrop-filter:blur(12px) saturate(1.04);-webkit-backdrop-filter:blur(12px) saturate(1.04);' +\n            'animation:slideIn .6s cubic-bezier(.22,.61,.36,1)}' +\n            '@keyframes slideIn{from{opacity:0;transform:translateY(24px) scale(.98)}to{opacity:1;transform:none}}' +\n            '.head{text-align:center;margin-bottom:18px}' +\n            '.head h1{font-size:22px;letter-spacing:.01em;margin-bottom:6px}' +\n            '.head p{font-size:13.5px;color:var(--muted)}' +\n            '.eyebrow{display:inline-block;color:var(--primary);font-size:11.5px;font-weight:700;letter-spacing:.22em;text-transform:uppercase;margin-bottom:6px}' +\n            '.versions{display:flex;align-items:stretch;gap:10px;margin:16px 0}' +\n            '.v-card{flex:1;min-width:0;padding:14px 12px;border:1px solid var(--border);border-radius:var(--radius);' +\n            'background:rgba(var(--surface-rgb),.6);box-shadow:var(--shadow-card);text-align:center;position:relative;' +\n            'backdrop-filter:blur(10px) saturate(1.05);-webkit-backdrop-filter:blur(10px) saturate(1.05)}' +\n            '.v-card .k{font-size:11.5px;color:var(--muted);display:flex;align-items:center;justify-content:center;gap:5px}' +\n            '.v-card .n{font-size:15px;font-weight:700;margin-top:4px;word-break:break-all;font-family:var(--font-mono)}' +\n            '.v-card .d{font-size:11.5px;color:var(--muted);margin-top:4px}' +\n            '.v-card.latest{background:linear-gradient(140deg,rgba(var(--primary-rgb),.16),rgba(var(--primary-rgb),.04));' +\n            'border-color:rgba(var(--primary-rgb),.34);box-shadow:0 0 26px -10px rgba(var(--primary-rgb),.5),var(--shadow-card);' +\n            'animation:breathe 3s ease-in-out infinite}' +\n            '@keyframes breathe{0%,100%{transform:scale(1)}50%{transform:scale(1.02)}}' +\n            '.v-card.latest .k,.v-card.latest .n{color:var(--primary-dark)}' +\n            '.vs{flex:none;width:34px;height:34px;border-radius:50%;align-self:center;display:flex;align-items:center;justify-content:center;' +\n            'font-size:13px;color:var(--primary);background:rgba(var(--surface-rgb),.85);border:1px solid var(--border);' +\n            'box-shadow:0 6px 16px -10px rgba(var(--primary-rgb),.5);' +\n            'backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);' +\n            'animation:pulseIndicator 1.6s ease-in-out infinite}' +\n            '@keyframes pulseIndicator{0%,100%{transform:scale(1)}50%{transform:scale(1.1)}}' +\n            '.section{margin-top:14px;border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;' +\n            'background:rgba(var(--surface-rgb),.55);box-shadow:var(--shadow-card);' +\n            'backdrop-filter:blur(10px) saturate(1.04);-webkit-backdrop-filter:blur(10px) saturate(1.04);' +\n            'animation:slideIn .5s ease .25s backwards}' +\n            '.section-head{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;' +\n            'border-bottom:1px solid var(--border);background:rgba(var(--surface-rgb),.5)}' +\n            '.section-head h2{font-size:15px;font-weight:600;display:flex;align-items:center;gap:7px}' +\n            '.section-head h2 i{color:var(--primary)}' +\n            '.tag{padding:3px 9px;border-radius:999px;background:var(--primary-soft);color:var(--primary);font-size:11.5px;font-weight:600}' +\n            '.section-body{padding:14px}' +\n            '.log-date{display:flex;align-items:center;gap:6px;color:var(--primary);font-size:12.5px;font-weight:700;' +\n            'padding-bottom:7px;border-bottom:1px dashed var(--border-soft);margin-bottom:7px}' +\n            '.update-text{position:relative;padding-left:15px;margin:6px 0;line-height:1.55;font-size:13.5px;color:var(--text-soft);white-space:pre-wrap;word-break:break-word}' +\n            '.update-text::before{content:\"•\";position:absolute;left:0;color:var(--primary);font-weight:700;font-size:1.15rem;line-height:1}' +\n            '.history-head{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;' +\n            'border-bottom:1px solid var(--border);background:rgba(var(--surface-rgb),.5);cursor:pointer;user-select:none;transition:background .2s}' +\n            '.history-head:hover{background:rgba(var(--surface-rgb),.7)}' +\n            '.history-head h2{font-size:15px;font-weight:600;display:flex;align-items:center;gap:7px}' +\n            '.history-head h2 i{color:var(--primary)}' +\n            '.toggle{background:none;border:none;color:var(--muted);cursor:pointer;font-weight:500;display:flex;align-items:center;gap:4px;font-size:12.5px;transition:color .2s}' +\n            '.toggle:hover{color:var(--primary)}' +\n            '.history-body{padding:0 14px;max-height:0;overflow:hidden;transition:max-height .4s ease,padding .4s ease}' +\n            '.history-body.open{max-height:60vh;overflow-y:auto;padding:14px;scrollbar-width:thin}' +\n            '.history-body.open::-webkit-scrollbar{width:6px}' +\n            '.history-body.open::-webkit-scrollbar-thumb{background:rgba(var(--line-rgb),.35);border-radius:4px}' +\n            '.history-item{margin-bottom:14px;padding-bottom:14px;border-bottom:1px dashed var(--border-soft)}' +\n            '.history-item:last-child{border-bottom:none;margin-bottom:0;padding-bottom:0}' +\n            '.history-date{font-weight:600;margin-bottom:7px;display:flex;align-items:center;gap:4px;font-size:12.5px;color:var(--primary);' +\n            'background:var(--primary-soft);padding:5px 9px;border-radius:6px}' +\n            '.history-text{position:relative;padding-left:15px;margin:6px 0;line-height:1.5;font-size:13px;color:var(--text-soft);white-space:pre-wrap;word-break:break-word}' +\n            '.history-text::before{content:\"•\";position:absolute;left:0;color:var(--primary);font-weight:700;font-size:1.1rem;line-height:1}' +\n            '.btn{display:flex;align-items:center;justify-content:center;gap:8px;box-sizing:border-box;width:100%;padding:13px 18px;' +\n            'margin-top:14px;border:1px solid transparent;border-radius:var(--radius-sm);font:inherit;font-size:14.5px;font-weight:600;' +\n            'text-decoration:none;cursor:pointer;transition:background .16s ease,box-shadow .16s ease,transform .12s ease;' +\n            'color:var(--primary-ink);background:linear-gradient(135deg,var(--primary) 0%,var(--primary) 60%,var(--primary-dark) 100%);' +\n            'box-shadow:0 10px 22px -14px rgba(var(--primary-rgb),.9);position:relative;overflow:hidden}' +\n            '.btn::after{content:\"\";position:absolute;top:-50%;left:-50%;width:200%;height:200%;' +\n            'background:linear-gradient(90deg,transparent,rgba(255,255,255,.35),transparent);transform:rotate(30deg);' +\n            'animation:btnShine 3s ease-in-out infinite}' +\n            '@keyframes btnShine{0%,60%{transform:translateX(-120%) rotate(30deg)}80%,100%{transform:translateX(120%) rotate(30deg)}}' +\n            '.btn:hover{background:linear-gradient(135deg,var(--primary) 0%,var(--primary-dark) 60%,var(--primary-dark) 100%);transform:translateY(-1px)}' +\n            '.btn:active{transform:translateY(1px) scale(.98)}' +\n            '.btn i,.btn span{position:relative;z-index:1}' +\n            '.foot{margin-top:14px;text-align:center;color:var(--muted);font-size:12px;line-height:1.6}' +\n            '@media(max-width:400px){.versions{flex-direction:column}.vs{transform:rotate(90deg)}.card{padding:18px 16px}}' +\n            '</style></head><body>' +\n            '<div class=\"waves\"><div class=\"wave w1\"></div><div class=\"wave w2\"></div><div class=\"wave w3\"></div></div>' +\n            '<div class=\"wrap\"><section class=\"card\">' +\n            '<div class=\"head\">' +\n            '<span class=\"eyebrow\">Version Update</span>' +\n            '<h1>' + esc(siteName) + '</h1>' +\n            '<p>' + esc(msg) + '</p>' +\n            '</div>' +\n            '<div class=\"versions\">' +\n            '<div class=\"v-card\"><div class=\"k\"><i class=\"fas fa-cube\"></i> 当前版本</div><div class=\"n\">v' + esc(myLocalVer) + '</div><div class=\"d\">您的当前版本</div></div>' +\n            '<div class=\"vs\"><i class=\"fas fa-arrow-right\"></i></div>' +\n            '<div class=\"v-card latest\"><div class=\"k\"><i class=\"fas fa-star\"></i> 最新版本</div><div class=\"n\">v' + esc(serverVer) + '</div><div class=\"d\">可用最新版本</div></div>' +\n            '</div>' +\n            (latestLogHtml ? '<div class=\"section\"><div class=\"section-head\"><h2><i class=\"fas fa-bolt\"></i> 最新更新</h2><span class=\"tag\">最新发布</span></div><div class=\"section-body\"><div class=\"log-date\"><i class=\"fas fa-calendar-alt\"></i>' + esc(latestDate) + '</div>' + latestLogHtml + '</div></div>' : '') +\n            (downloadUrl ? '<a href=\"' + esc(downloadUrl) + '\" class=\"btn\"><i class=\"fas fa-rocket\"></i><span>立即更新</span></a>' : '') +\n            (historyHtml ? '<div class=\"section\" style=\"padding:0\"><div class=\"history-head\" onclick=\"toggleLogs()\"><h2><i class=\"fas fa-history\"></i> 历史更新 <span>' + historyCountText + '</span></h2><button class=\"toggle\"><span id=\"toggleText\">展开历史</span><i class=\"fas fa-chevron-down\" id=\"toggleIcon\"></i></button></div><div class=\"history-body\" id=\"logList\">' + historyHtml + '</div></div>' : '') +\n            '<p class=\"foot\">' + (force ? '本次为强制更新，请更新后再使用书源' : '更新后返回书源即可生效') + '</p>' +\n            '</section></div>' +\n            '<script>' +\n            'let logsCollapsed=true;' +\n            'function toggleLogs(){logsCollapsed=!logsCollapsed;var l=document.getElementById(\"logList\");var t=document.getElementById(\"toggleText\");var i=document.getElementById(\"toggleIcon\");' +\n            'if(logsCollapsed){l.classList.remove(\"open\");t.textContent=\"展开历史\";i.className=\"fas fa-chevron-down\";}else{l.classList.add(\"open\");t.textContent=\"收起历史\";i.className=\"fas fa-chevron-up\";}}' +\n            '</script></body></html>';\n\n        if (downloadUrl) {\n            try {\n                java.startBrowserAwait('data:text/html;base64,' + java.base64Encode(bodyHtml), '书源更新', false);\n            } catch (e) {\n                java.toast('打开更新页失败：' + e);\n            }\n        } else {\n            java.longToast('发现新版本：' + serverVer + '\\n' + msg);\n        }\n        return;\n    }\n\n    if (cmp < 0) {\n        java.longToast('非法版本\\n本地版本：' + myLocalVer + '\\n服务器版本：' + serverVer + '\\n本地版本高于服务器版本，请检查书源来源是否被修改。');\n        return;\n    }\n    java.toast('已是最新版本：' + myLocalVer);\n}\n\nfunction paraSettings() {\n    let { java } = this;\n    let conf = getConfig.call(this);\n    let curReview = conf.para_review || 'off';\n    let curStyle = conf.para_style || 'TEXT';\n    let curSy = conf.para_sy || 'off';\n    let curProgress = conf.progress_sync || 'off';\n    let curShelf = conf.shelf_sync || 'off';\n    let curStv = conf.stv_content || 'off';\n\n    var html = '<!DOCTYPE html><html lang=\"zh-CN\"><head>' +\n        '<meta charset=\"UTF-8\">' +\n        '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no\">' +\n        '<title>书源设置</title>' +\n        '<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css\">' +\n        '<style>' +\n        ':root{' +\n        '--bg-rgb:232,238,246;--surface-rgb:255,255,255;--text-rgb:31,38,51;--muted-rgb:108,120,140;' +\n        '--line-rgb:150,165,190;--primary-rgb:91,124,250;' +\n        '--bg:#e8eef6;--surface:#ffffff;--text:#1f2633;--muted:#6c788c;' +\n        '--primary:#5b7cfa;--primary-dark:#4363d8;' +\n        '--border:rgba(var(--line-rgb),.18);--primary-soft:rgba(var(--primary-rgb),.08);' +\n        '--radius-lg:20px;--radius:14px;' +\n        '--shadow:0 18px 40px -26px rgba(31,45,80,.35),0 2px 8px rgba(31,45,80,.05);' +\n        '--font-cn:\"PingFang SC\",\"Hiragino Sans GB\",\"Microsoft YaHei\",system-ui,-apple-system,sans-serif;' +\n        '}' +\n        '*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}' +\n        'html,body{min-height:100%}' +\n        'body{margin:0;min-height:100vh;color:var(--text);font-family:var(--font-cn);font-size:15px;line-height:1.6;' +\n        'background:var(--bg);padding:calc(14px + env(safe-area-inset-top)) 14px calc(22px + env(safe-area-inset-bottom));position:relative;overflow-x:hidden}' +\n        'body::before{content:\"\";position:fixed;inset:0;z-index:0;pointer-events:none;' +\n        'background:radial-gradient(900px 520px at 12% -8%,rgba(var(--primary-rgb),.16),transparent 68%),' +\n        'radial-gradient(760px 480px at 94% 4%,rgba(120,220,230,.18),transparent 72%)}' +\n        '.wrap{max-width:720px;margin:0 auto;position:relative;z-index:1}' +\n        '.glass{background:linear-gradient(155deg,rgba(var(--surface-rgb),.86),rgba(var(--surface-rgb),.58));' +\n        'border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow);' +\n        'backdrop-filter:blur(22px) saturate(1.2);-webkit-backdrop-filter:blur(22px) saturate(1.2)}' +\n        '.hero{display:flex;align-items:center;gap:14px;padding:17px 18px;margin-bottom:12px}' +\n        '.hero-icon{flex:0 0 auto;width:46px;height:46px;border-radius:14px;display:flex;align-items:center;justify-content:center;font-size:20px;' +\n        'background:linear-gradient(135deg,var(--primary),var(--primary-dark));color:#fff}' +\n        '.hero h1{margin:0;font-size:19px;line-height:1.25}' +\n        '.hero p{margin:5px 0 0;font-size:12px;line-height:1.55;color:var(--muted)}' +\n        '.card{padding:16px 18px;margin-bottom:12px}' +\n        '.group-title{font-size:12px;font-weight:700;color:var(--muted);letter-spacing:1px;padding:4px 2px 8px}' +\n        '.row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 0}' +\n        '.row + .row{border-top:1px solid var(--border)}' +\n        '.row .label{font-size:14px;font-weight:600}' +\n        '.row .desc{font-size:11.5px;color:var(--muted);margin-top:2px;line-height:1.5}' +\n        '.switch{position:relative;width:52px;height:28px;flex:none;cursor:pointer}' +\n        '.switch input{opacity:0;width:0;height:0}' +\n        '.switch-slider{position:absolute;inset:0;background:rgba(var(--line-rgb),.35);border-radius:28px;transition:.3s;border:1px solid var(--border)}' +\n        '.switch-slider::before{content:\"\";position:absolute;width:22px;height:22px;left:2px;bottom:2px;background:#fff;border-radius:50%;transition:.3s;box-shadow:0 2px 8px rgba(0,0,0,.3)}' +\n        '.switch input:checked + .switch-slider{background:var(--primary);border-color:var(--primary)}' +\n        '.switch input:checked + .switch-slider::before{transform:translateX(24px)}' +\n        '.seg{display:flex;gap:6px;padding:5px;border-radius:14px;background:rgba(var(--surface-rgb),.6);border:1px solid var(--border);flex:none}' +\n        '.seg button{border:none;background:transparent;font:inherit;font-size:13px;font-weight:600;padding:8px 16px;border-radius:10px;cursor:pointer;color:var(--muted);transition:.18s}' +\n        '.seg button.on{background:linear-gradient(135deg,var(--primary),var(--primary-dark));color:#fff;box-shadow:0 6px 16px -10px rgba(var(--primary-rgb),.9)}' +\n        '.tip{padding:12px 16px;border-radius:14px;font-size:12px;line-height:1.6;color:var(--muted)}' +\n        '.tip b{color:var(--text)}' +\n        '</style></head><body><div class=\"wrap\">' +\n        '<header class=\"hero glass\"><div class=\"hero-icon\"><i class=\"fa-solid fa-sliders\"></i></div><div><h1>书源设置</h1><p>段评、进度同步、书架同步、STV补全</p></div></header>' +\n\n        // 段评\n        '<section class=\"card glass\">' +\n        '<div class=\"group-title\">段评</div>' +\n        '<div class=\"row\"><div><div class=\"label\">段评开关</div><div class=\"desc\">仅番茄小说、QQ阅读、晋江、七猫、少年梦丶书旗支持</div></div>' +\n        '<label class=\"switch\"><input type=\"checkbox\" id=\"reviewSwitch\" ' + (curReview == 'on' ? 'checked' : '') + '><span class=\"switch-slider\"></span></label></div>' +\n        '<div class=\"row\"><div><div class=\"label\">段评图标大小</div><div class=\"desc\">TEXT 大号 / text 小号</div></div>' +\n        '<div class=\"seg\" id=\"styleSeg\">' +\n        '<button type=\"button\" data-val=\"TEXT\" class=\"' + (curStyle == 'TEXT' ? 'on' : '') + '\">TEXT（大）</button>' +\n        '<button type=\"button\" data-val=\"text\" class=\"' + (curStyle == 'text' ? 'on' : '') + '\">text（小）</button>' +\n        '</div></div>' +\n        '<div class=\"row\"><div><div class=\"label\">源阅适配</div><div class=\"desc\">IOS源阅适配，其他IOS应用段评异常也可尝试开启</div></div>' +\n        '<label class=\"switch\"><input type=\"checkbox\" id=\"sySwitch\" ' + (curSy == 'on' ? 'checked' : '') + '><span class=\"switch-slider\"></span></label></div>' +\n        '</section>' +\n\n        // 同步\n        '<section class=\"card glass\">' +\n        '<div class=\"group-title\">同步</div>' +\n        '<div class=\"row\"><div><div class=\"label\">进度同步</div><div class=\"desc\">翻章时上报晋江 / 番茄系列阅读进度</div></div>' +\n        '<label class=\"switch\"><input type=\"checkbox\" id=\"progressSwitch\" ' + (curProgress == 'on' ? 'checked' : '') + '><span class=\"switch-slider\"></span></label></div>' +\n        '<div class=\"row\"><div><div class=\"label\">书架同步</div><div class=\"desc\">加入/移除书架时同步到晋江 / 番茄APP</div></div>' +\n        '<label class=\"switch\"><input type=\"checkbox\" id=\"shelfSwitch\" ' + (curShelf == 'on' ? 'checked' : '') + '><span class=\"switch-slider\"></span></label></div>' +\n        '</section>' +\n\n        // STV\n        '<section class=\"card glass\">' +\n        '<div class=\"group-title\">STV</div>' +\n        '<div class=\"row\"><div><div class=\"label\">STV正文补全</div><div class=\"desc\">晋江章节在聚合接口无内容时，改用STV接口取正文（需自备账号并登录STV）</div></div>' +\n        '<label class=\"switch\"><input type=\"checkbox\" id=\"stvSwitch\" ' + (curStv == 'on' ? 'checked' : '') + '><span class=\"switch-slider\"></span></label></div>' +\n        '</section>' +\n\n        '<div class=\"tip glass\">当前：段评 <b id=\"curReview\">' + (curReview == 'on' ? '开启' : '关闭') + '</b> · 图标 <b id=\"curStyle\">' + curStyle + '</b> · 源阅适配 <b id=\"curSy\">' + (curSy == 'on' ? '开启' : '关闭') + '</b>' +\n        ' · 进度同步 <b id=\"curProgress\">' + (curProgress == 'on' ? '开启' : '关闭') + '</b> · 书架同步 <b id=\"curShelf\">' + (curShelf == 'on' ? '开启' : '关闭') + '</b>' +\n        ' · STV正文 <b id=\"curStv\">' + (curStv == 'on' ? '开启' : '关闭') + '</b></div>' +\n        '</div>' +\n        '<div id=\"result-output\" style=\"display:none;\">' + curReview + '|' + curStyle + '|' + curSy + '|' + curProgress + '|' + curShelf + '|' + curStv + '</div>' +\n        '<script>' +\n        'var out=document.getElementById(\"result-output\");' +\n        'function sync(){var r=document.getElementById(\"reviewSwitch\").checked?\"on\":\"off\";' +\n        'var s=document.querySelector(\"#styleSeg button.on\").getAttribute(\"data-val\");' +\n        'var y=document.getElementById(\"sySwitch\").checked?\"on\":\"off\";' +\n        'var p=document.getElementById(\"progressSwitch\").checked?\"on\":\"off\";' +\n        'var b=document.getElementById(\"shelfSwitch\").checked?\"on\":\"off\";' +\n        'var t=document.getElementById(\"stvSwitch\").checked?\"on\":\"off\";' +\n        'out.textContent=r+\"|\"+s+\"|\"+y+\"|\"+p+\"|\"+b+\"|\"+t;' +\n        'document.getElementById(\"curReview\").textContent=r==\"on\"?\"开启\":\"关闭\";' +\n        'document.getElementById(\"curStyle\").textContent=s;' +\n        'document.getElementById(\"curSy\").textContent=y==\"on\"?\"开启\":\"关闭\";' +\n        'document.getElementById(\"curProgress\").textContent=p==\"on\"?\"开启\":\"关闭\";' +\n        'document.getElementById(\"curShelf\").textContent=b==\"on\"?\"开启\":\"关闭\";' +\n        'document.getElementById(\"curStv\").textContent=t==\"on\"?\"开启\":\"关闭\";}' +\n        '[\"reviewSwitch\",\"sySwitch\",\"progressSwitch\",\"shelfSwitch\",\"stvSwitch\"].forEach(function(id){document.getElementById(id).addEventListener(\"change\",sync);});' +\n        'document.querySelectorAll(\"#styleSeg button\").forEach(function(btn){btn.addEventListener(\"click\",function(){' +\n        'document.querySelectorAll(\"#styleSeg button\").forEach(function(x){x.classList.remove(\"on\");});' +\n        'btn.classList.add(\"on\");sync();});});' +\n        'sync();' +\n        '</script></body></html>';\n\n    var choice = java.startBrowserAwait('data:text/html;base64,' + java.base64Encode(html), '书源设置', false);\n    if (!choice || !choice.body()) { java.toast('已取消书源设置'); return; }\n\n    var body = choice.body();\n    var m = body.match(/<div id=\"result-output\"[^>]*>([^<]*)<\\/div>/);\n    var raw = (m && m[1]) ? m[1].trim() : '';\n    var parts = raw.split('|');\n    var review = parts[0] == 'on' ? 'on' : 'off';\n    var style = parts[1] == 'text' ? 'text' : 'TEXT';\n    var sy = parts[2] == 'on' ? 'on' : 'off';\n    var progress = parts[3] == 'on' ? 'on' : 'off';\n    var shelf = parts[4] == 'on' ? 'on' : 'off';\n    var stv = parts[5] == 'on' ? 'on' : 'off';\n\n    setConfig.call(this, {\n        para_review: review,\n        para_style: style,\n        para_sy: sy,\n        progress_sync: progress,\n        shelf_sync: shelf,\n        stv_content: stv\n    });\n    java.toast('已保存：段评' + (review == 'on' ? '开启' : '关闭') +\n        ' · 进度同步' + (progress == 'on' ? '开启' : '关闭') +\n        ' · 书架同步' + (shelf == 'on' ? '开启' : '关闭') +\n        ' · STV正文' + (stv == 'on' ? '开启' : '关闭'));\n}\n\nfunction FqFilter() {\n    let { java, source } = this;\n    try {\n        var cfg = getConfig.call(this);\n        var savedParams = cfg.fq_filter || \"\";\n\n        var config = {\n            lengths: [\"10万\",\"30万\",\"50万\",\"30万以上\",\"50万以上\",\"100万以上\",\"200万以上\",\"300万以上\",\"500万以上\"],\n            statuses: [\"完结\",\"连载\",\"半年完结\",\"3天更新\",\"7天更新\",\"1月更新\"],\n            sorts: [\"热门\",\"新书\",\"评分\",\"字数\"]\n        };\n\n        function buildGroup(title, icon, items, category) {\n            var h = '<div class=\"section\">';\n            h += '<div class=\"section-title\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">' + icon + '</svg><span>' + title + '</span><span class=\"tag\">单选</span></div>';\n            h += '<div class=\"grid\">';\n            items.forEach(function(name) {\n                h += '<div class=\"opt-card\" data-cat=\"' + category + '\" data-val=\"' + name + '\" onclick=\"pick(this)\"><div class=\"opt-name\">' + name + '</div></div>';\n            });\n            h += '</div></div>';\n            return h;\n        }\n\n        var icons = {\n            length: '<path d=\"M3 6h18M3 12h18M3 18h12\"/>',\n            status: '<polyline points=\"22 12 18 12 15 21 9 3 6 12 2 12\"/>',\n            sort: '<path d=\"M3 6h13M3 12h9M3 18h5\"/><polyline points=\"17 10 21 14 17 18\"/>'\n        };\n\n        var html = `<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\">\n<title>番茄筛选</title>\n<style>\n:root{--bg:#0a0a0f;--text:#e8e8f0;--accent:#ff6b35;--accent-glow:rgba(255,107,53,.4);--gold:#f0c040}\n*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;background:var(--bg);background-image:radial-gradient(ellipse at 30% 20%,#2a1205 0%,#0a0e27 50%,#1a0d1a 100%);color:var(--text);min-height:100vh;padding:20px;position:relative;overflow-x:hidden}\n.stars{position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:0}\n.star{position:absolute;border-radius:50%;background:#fff;animation:twinkle var(--duration) ease-in-out infinite alternate;animation-delay:var(--delay)}\n@keyframes twinkle{0%{opacity:.1;transform:scale(.8)}50%{opacity:.9;transform:scale(1.1)}100%{opacity:.2;transform:scale(.9)}}\n.container{width:100%;max-width:640px;margin:0 auto;position:relative;z-index:10;background:rgba(15,12,20,.6);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border-radius:24px;border:1px solid rgba(255,255,255,.08);box-shadow:0 20px 60px rgba(0,0,0,.6),0 0 60px rgba(255,107,53,.1);overflow:hidden;animation:cardIn .6s cubic-bezier(.22,.61,.36,1)}\n@keyframes cardIn{from{opacity:0;transform:translateY(20px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}\n.header{padding:28px 24px 20px;text-align:center;border-bottom:1px solid rgba(255,255,255,.06);background:linear-gradient(180deg,rgba(255,107,53,.12),transparent)}\n.header-title{display:flex;align-items:center;justify-content:center;gap:10px}\n.header-title svg{width:22px;height:22px;color:var(--accent);filter:drop-shadow(0 0 8px var(--accent-glow))}\n.header h1{font-size:22px;font-weight:700;letter-spacing:1px;color:rgba(255,255,255,.95);text-shadow:0 0 24px rgba(255,107,53,.5)}\n.header p{font-size:12px;color:rgba(255,255,255,.45);margin-top:6px;letter-spacing:2px}\n.current-badge{display:flex;align-items:center;justify-content:center;gap:8px;margin:20px 24px 0;padding:12px 20px;background:rgba(255,107,53,.12);border:1px solid rgba(255,107,53,.3);border-radius:14px;font-size:13px;color:rgba(255,255,255,.7)}\n.current-badge .dot{width:8px;height:8px;border-radius:50%;background:var(--accent);box-shadow:0 0 10px var(--accent-glow);animation:pulse 2s ease-in-out infinite}\n@keyframes pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.6;transform:scale(1.2)}}\n.current-badge strong{color:#fff;font-weight:600}\n.section{padding:20px 24px 0}\n.section:last-of-type{padding-bottom:0}\n.section-title{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:600;color:rgba(255,255,255,.85);margin-bottom:12px;letter-spacing:.5px}\n.section-title svg{width:16px;height:16px;color:var(--accent);filter:drop-shadow(0 0 6px var(--accent-glow))}\n.tag{font-size:10px;padding:2px 8px;border-radius:10px;background:rgba(255,107,53,.15);border:1px solid rgba(255,107,53,.3);color:rgba(255,255,255,.6);font-weight:400;margin-left:auto}\n.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}\n.opt-card{position:relative;padding:12px 6px;border-radius:14px;background:rgba(255,255,255,.03);border:1px solid rgba(255,255,255,.08);cursor:pointer;transition:all .3s cubic-bezier(.22,.61,.36,1);text-align:center;overflow:hidden}\n.opt-card:hover{border-color:rgba(255,255,255,.2);background:rgba(255,255,255,.06);transform:translateY(-2px);box-shadow:0 8px 24px rgba(0,0,0,.3)}\n.opt-card.selected{border-color:var(--accent);background:rgba(255,107,53,.18);box-shadow:0 0 20px rgba(255,107,53,.3)}\n.opt-card.selected::after{content:'✓';position:absolute;top:5px;right:6px;width:16px;height:16px;border-radius:50%;background:var(--accent);color:#fff;font-size:10px;display:flex;align-items:center;justify-content:center;box-shadow:0 0 8px var(--accent-glow)}\n.opt-name{font-size:12px;font-weight:500;color:rgba(255,255,255,.85);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:0 4px}\n.opt-card.selected .opt-name{color:#fff}\n.clear-area{padding:20px 24px 0}\n.clear-btn{width:100%;padding:12px;border:1px dashed rgba(255,255,255,.25);border-radius:14px;background:transparent;font-size:13px;color:rgba(255,255,255,.5);cursor:pointer;transition:all .3s;display:flex;align-items:center;justify-content:center;gap:8px}\n.clear-btn:hover{border-color:rgba(255,107,53,.6);color:var(--accent);background:rgba(255,107,53,.06)}\n.clear-btn svg{width:14px;height:14px}\n.footer{text-align:center;font-size:11px;color:rgba(255,255,255,.3);padding:16px 24px 22px;letter-spacing:1px;border-top:1px solid rgba(255,255,255,.05);margin-top:20px}\n@media (max-width:480px){.grid{grid-template-columns:repeat(3,1fr);gap:8px}.header h1{font-size:20px}.section{padding:16px 16px 0}.clear-area{padding:16px 16px 0}}\n</style>\n</head>\n<body>\n<div class=\"stars\" id=\"stars\"></div>\n<div class=\"container\">\n<div class=\"header\">\n<div class=\"header-title\">\n<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\"/></svg>\n<h1>番茄筛选</h1>\n</div>\n<p>选择后点击右上角 ✓ ，并刷新发现页生效</p>\n</div>\n<div class=\"current-badge\">\n<span class=\"dot\"></span>\n当前：<strong id=\"current-value\">` + (savedParams || \"未选择\") + `</strong>\n</div>\n` + buildGroup(\"字数参数\", icons.length, config.lengths, \"length\") +\n     buildGroup(\"状态参数\", icons.status, config.statuses, \"status\") +\n     buildGroup(\"排序参数\", icons.sort, config.sorts, \"sort\") + `\n<div class=\"clear-area\">\n<button onclick=\"clearAll()\" class=\"clear-btn\">\n<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"/></svg>\n清除所有选择\n</button>\n</div>\n<div class=\"footer\">仅番茄发现页生效</div>\n</div>\n<div id=\"result-output\" style=\"display:none;\">` + savedParams + `</div>\n<script>\nvar config = ` + JSON.stringify(config) + `;\nvar selection = { length: null, status: null, sort: null };\nvar initParams = document.getElementById('result-output').textContent.trim();\nif (initParams && initParams !== \"未选择\" && initParams !== \"undefined\") {\n    initParams.split(\", \").forEach(function(item) {\n        if (config.lengths.indexOf(item) >= 0) selection.length = item;\n        else if (config.statuses.indexOf(item) >= 0) selection.status = item;\n        else if (config.sorts.indexOf(item) >= 0) selection.sort = item;\n    });\n}\ndocument.querySelectorAll('.opt-card').forEach(function(el) {\n    var cat = el.getAttribute('data-cat');\n    var val = el.getAttribute('data-val');\n    if (selection[cat] == val) el.classList.add('selected');\n});\nfunction pick(el) {\n    var cat = el.getAttribute('data-cat');\n    var val = el.getAttribute('data-val');\n    if (selection[cat] == val) {\n        selection[cat] = null;\n        el.classList.remove('selected');\n    } else {\n        selection[cat] = val;\n        document.querySelectorAll('.opt-card[data-cat=\"' + cat + '\"]').forEach(function(c) {\n            c.classList.remove('selected');\n        });\n        el.classList.add('selected');\n    }\n    updateOutput();\n}\nfunction updateOutput() {\n    var all = [];\n    for (var k in selection) { if (selection[k]) all.push(selection[k]); }\n    var text = all.length > 0 ? all.join(\", \") : \"未选择\";\n    document.getElementById('current-value').textContent = text;\n    document.getElementById('result-output').textContent = all.length > 0 ? all.join(\", \") : \"\";\n}\nfunction clearAll() {\n    selection = { length: null, status: null, sort: null };\n    document.querySelectorAll('.opt-card').forEach(function(el) { el.classList.remove('selected'); });\n    updateOutput();\n}\n(function() {\n    var c = document.getElementById('stars');\n    for (var i = 0; i < 60; i++) {\n        var s = document.createElement('div');\n        s.className = 'star';\n        var size = Math.random() < 0.7 ? 1 : (Math.random() < 0.8 ? 2 : 3);\n        s.style.width = size + 'px';\n        s.style.height = size + 'px';\n        s.style.left = Math.random() * 100 + '%';\n        s.style.top = Math.random() * 100 + '%';\n        s.style.setProperty('--duration', (1.5 + Math.random() * 3) + 's');\n        s.style.setProperty('--delay', (Math.random() * 4) + 's');\n        s.style.opacity = 0.2 + Math.random() * 0.6;\n        if (size == 3) s.style.boxShadow = '0 0 6px rgba(255,255,255,0.5)';\n        c.appendChild(s);\n    }\n})();\n</script>\n</body>\n</html>`;\n\n        var base64 = \"data:text/html;base64,\" + java.base64Encode(html);\n        var result = java.startBrowserAwait(base64, \"番茄筛选\", false);\n\n        if (!result || !result.body()) {\n            java.toast(\"已取消筛选设置\");\n            return;\n        }\n\n        var body = result.body();\n        var resultDivStart = body.indexOf('<div id=\"result-output\"');\n        var selectedItems = \"\";\n\n        if (resultDivStart > -1) {\n            var contentStart = body.indexOf('>', resultDivStart);\n            if (contentStart > -1) {\n                contentStart += 1;\n                var contentEnd = body.indexOf('</div>', contentStart);\n                if (contentEnd > contentStart) {\n                    selectedItems = body.substring(contentStart, contentEnd).trim();\n                    if (selectedItems == \"未选择\") {\n                        selectedItems = \"\";\n                    } else {\n                        if (selectedItems.startsWith('\">')) selectedItems = selectedItems.substring(2);\n                        else if (selectedItems.startsWith('>')) selectedItems = selectedItems.substring(1);\n                    }\n                }\n            }\n        }\n\n        setConfig.call(this, { fq_filter: selectedItems });\n\n    if (selectedItems == \"\") {\n        java.toast(\"已清除所有筛选条件\");\n    } else {\n        java.toast(\"设置成功，仅番茄发现页生效\\n当前：\" + selectedItems);\n    }\n        } catch (e) {\n            java.log(e);\n            java.toast(\"已取消筛选设置\");\n    }\n}\n\nfunction encode(data) {\n    let { java } = this;\n    return java.createSymmetricCrypto(\"DES/CBC/PKCS5Padding\", String(\"KW8Dvm2N\"), String(\"1ae2c94b\")).encryptBase64(data);\n}\n\nfunction decode(data) {\n    let { java } = this;\n    try {\n        var encryptedBytes = java.base64DecodeToByteArray(data);\n        var key = \"F#kL9$mQpR2&sVzX\";\n        var iv = \"7HnT3!cW8@xM0yBv\";\n        var crypto = java.createSymmetricCrypto(\"AES/CBC/PKCS5Padding\", key, iv);\n        return crypto.decryptStr(encryptedBytes);\n    } catch (e) {\n        return data;\n    }\n}\n\nfunction getStvCookie() {\n    let c = getConfig.call(this);\n    return String(c.stv_cookie || '').trim();\n}", "lastUpdateTime": "1794356831195", "loginUi": "[\n  {\n    \"name\": \"邮箱\",\n    \"type\": \"text\"\n  },\n  {\n    \"name\": \"密码\",\n    \"type\": \"password\"\n  },\n  {\n    \"name\": \"⭕账号登录\",\n    \"type\": \"button\",\n    \"action\": \"login(true)\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🔑账号注册\",\n    \"type\": \"button\",\n    \"action\": \"register()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"❌退出登录\",\n    \"type\": \"button\",\n    \"action\": \"logout()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🔅用户中心\",\n    \"type\": \"button\",\n    \"action\": \"user()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"📡源站选择\",\n    \"type\": \"button\",\n    \"action\": \"selectSource()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"name\": \"🎚服务器切换\",\n    \"type\": \"button\",\n    \"action\": \"switchServer()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🔄服务器检测\",\n    \"type\": \"button\",\n    \"action\": \"checkServer()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🎁书源设置\",\n    \"type\": \"button\",\n    \"action\": \"paraSettings()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🌟升级用户组\",\n    \"type\": \"button\",\n    \"action\": \"level()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🫧我的气泡\",\n    \"type\": \"button\",\n    \"action\": \"icons()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🔄更新检测\",\n    \"type\": \"button\",\n    \"action\": \"checkVersion()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"📓晋江收藏分类\",\n    \"type\": \"button\",\n    \"action\": \"getJjShelfClass()\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"name\": \"🍅番茄筛选\",\n    \"type\": \"button\",\n    \"action\": \"FqFilter()\",\n    \"style\": { \n    \t\"layout_flexGrow\": 1,\n    \t \"layout_flexBasisPercent\": 0.45 \n    \t }\n  },\n  {\n    \"name\": \"🔄强制刷新\",\n    \"type\": \"button\",\n    \"action\": \"toggleRefresh()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n},\n  {\n    \"name\": \"🍅番茄登录\",\n    \"type\": \"button\",\n    \"action\": \"fq_login()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"❌退出番茄\",\n    \"type\": \"button\",\n    \"action\": \"fq_logout()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"晋江登录Token\",\n    \"type\": \"password\"\n  },\n  {\n    \"name\": \"📱晋江扫码登录\",\n    \"type\": \"button\",\n    \"action\": \"loginJjScan()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n},\n{\n    \"name\": \"❌退出晋江\",\n    \"type\": \"button\",\n    \"action\": \"logoutJj()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n},\n{\n    \"name\": \"STV账号\",\n    \"type\": \"text\"\n  },\n  {\n    \"name\": \"STV密码\",\n    \"type\": \"password\"\n  },\n  {\n    \"name\": \"🔐STV登录\",\n    \"type\": \"button\",\n    \"action\": \"stvLogin()\",\n    \"style\": { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.45 }\n},\n{\n    \"name\": \"❌退出STV\",\n    \"type\": \"button\",\n    \"action\": \"stvLogout()\",\n    \"style\": { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.45 }\n},\n  {\n    \"name\": \"🔀STV线路切换\",\n    \"type\": \"button\",\n    \"action\": \"stvSwitchHost()\",\n    \"style\": { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.45 }\n},\n{\n    \"name\": \"📡当前STV线路\",\n    \"type\": \"button\",\n    \"action\": \"stvShowHost()\",\n    \"style\": { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.45 }\n}\n]", "loginUrl": "function login(flag) {\n    let email = '', pwd = '';\n    try {\n        if (flag == true) {\n            email = result.get('邮箱') || '';\n            pwd = result.get('密码') || '';\n        } else {\n            let info = source.getLoginInfoMap() || {};\n            email = info.get('邮箱') || '';\n            pwd = info.get('密码') || '';\n        }\n    } catch (e) {}\n\n    email = String(email || '').trim();\n    pwd = String(pwd || '').trim();\n    if (!email || !pwd) return java.toast('请先填写邮箱和密码');\n\n    java.toast('正在登录…');\n    try {\n        let opt = { method: 'POST', body: JSON.stringify({ email: email, password: pwd }) };\n        let res = java.ajax(getHost.call(this) + '/api/login,' + JSON.stringify(opt));\n        let obj = null;\n        try { obj = JSON.parse(res); } catch (e) { obj = null; }\n\n        if (!obj || obj.code !== 0 || !obj.data || !obj.data.token) {\n            let msg = (obj && obj.message) || '未知错误';\n            return java.toast('\\n❌ 登录失败：' + msg);\n        }\n\n        let d = obj.data;\n        let u = d.user || {};\n        let g = d.group || {};\n        let m = d.membership || {};\n        let benefits = d.benefits || m.benefits || g.benefits || '';\n\n        source.putLoginHeader(d.token);\n\n        let name = u.nickname || u.email || email;\n        let level = g.level || m.level || 1;\n        let groupName = g.name || m.group_name || '普通用户';\n        let isMember = !!(u.is_member || m.is_member);\n        let expires = m.expires_at || d.member_expires_at || '';\n        let masked = d.api_token_masked || '';\n        let rateWin = g.rate_limit_window || '';\n        let rateMax = g.rate_limit_max || '';\n        let devLimit = g.device_limit || '';\n        let resetLimit = g.token_reset_limit || '';\n        let resetDays = g.token_reset_window_days || '';\n\n        let lines = [];\n        lines.push('✅ 登录成功');\n        lines.push('');\n        lines.push('👤 用户：' + name);\n        if (u.email) lines.push('📧 邮箱：' + u.email);\n        lines.push('🏅 等级：Lv' + level + ' · ' + groupName + (isMember ? '（会员）' : '（普通）'));\n        if (expires) lines.push('⏰ 会员到期：' + expires);\n        if (masked) lines.push('🔑 Token：' + masked);\n        if (u.last_login_at) lines.push('🕒 上次登录：' + u.last_login_at);\n        if (rateWin && rateMax) lines.push('🚦 限流：' + rateWin + '秒内最多 ' + rateMax + ' 次');\n        if (devLimit) lines.push('📱 设备上限：' + devLimit + ' 台');\n        if (resetLimit && resetDays) lines.push('🔄 Token重置：每 ' + resetDays + ' 天 ' + resetLimit + ' 次');\n        if (benefits) {\n            lines.push('');\n            lines.push('💡 ' + benefits);\n        }\n\n        java.longToast('\\n' + lines.join('\\n'));\n    } catch (e) {\n        java.toast('\\n❌ 登录失败：' + e);\n    }\n}\n\nfunction logout() {\n    try { source.removeLoginHeader(); } catch (e) {}\n    try { source.removeLoginInfo(); } catch (e) {}\n    java.toast('已退出登录');\n}\n\nfunction fq_login() {\n    try {\n        java.startBrowserAwait(\"https://fanqienovel.com/main/writer/login\", \"登录\");\n    } catch (e) {\n        java.toast(e);\n        return false;\n    }\n\n    try {\n        cookie.removeCookie(\"snssdk.com\");\n    } catch (e) {}\n\n    let sessionId = getSessionIdFromCookie.call(this);\n    if (!sessionId) sessionId = getSessionId.call(this);\n\n    if (!sessionId || String(sessionId).trim() == \"\") {\n        java.toast(\"未获取到登录凭据，登录失败\");\n        return false;\n    }\n\n    let user = \"\";\n    try {\n        let resp = java.ajax(\"https://fanqienovel.com/api/user/info/v2,\" + JSON.stringify({\n            method: \"GET\",\n            headers: { \"Cookie\": \"sessionid=\" + sessionId }\n        }));\n        user = JSON.parse(resp)?.data?.name || \"\";\n    } catch (e) {\n        java.log(e);\n    }\n\n    if (!user) {\n        java.toast(\"登录凭据无效或已过期，登录失败\");\n        return false;\n    }\n\n    setConfig.call(this, { fanqie_sessionid: sessionId });\n\n    java.toast(\"\\n\\n欢迎 \" + user + \"\\n登录成功！\");\n    return true;\n}\n\nfunction fq_logout() {\n    try { cookie.removeCookie(\"fanqienovel.com\"); } catch (e) {}\n    try { cookie.removeCookie(\"snssdk.com\"); } catch (e) {}\n    setConfig.call(this, { fanqie_sessionid: \"\" });\n    java.toast('已退出番茄登录');\n}\n\nfunction loginJjScan() {\n    let { java } = this;\n    try {\n        let headers = buildJjHeaders.call(this);\n        let e = java.ajax(\"https://android.jjwxc.com/app.jjwxc/android/reading/Login/scanCodeLogin?versionCode=467,\" + JSON.stringify({ headers: headers }));\n        let eData = JSON.parse(e).data;\n        let jjscanurl = \"https://www.jjwxc.net?action=scanCode&jjreader_key=\" + eData.jjreader_key + \"&device_key=\" + eData.device_key;\n        let enjj = encodeURIComponent(jjscanurl);\n\n        let html = '<!DOCTYPE html><html><head><meta charset=\"UTF-8\">' +\n            '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no\">' +\n            '<title>晋江扫码登录</title><style>' +\n            '*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}' +\n            'body{font-family:-apple-system,BlinkMacSystemFont,\"PingFang SC\",\"Microsoft YaHei\",sans-serif;' +\n            'background:#0a0a0f;background-image:radial-gradient(ellipse at 30% 20%,#2a1020 0%,#0a0e27 50%,#1a0d1a 100%);' +\n            'color:#e8e8f0;min-height:100vh;padding:20px;display:flex;align-items:center;justify-content:center}' +\n            '.container{width:100%;max-width:420px;background:rgba(15,12,20,.75);backdrop-filter:blur(20px);' +\n            'border-radius:24px;border:1px solid rgba(255,255,255,.08);box-shadow:0 20px 60px rgba(0,0,0,.6);overflow:hidden}' +\n            '.header{padding:24px 24px 18px;text-align:center;border-bottom:1px solid rgba(255,255,255,.06);' +\n            'background:linear-gradient(180deg,rgba(193,74,99,.15),transparent)}' +\n            '.header h1{font-size:20px;font-weight:700;letter-spacing:1px;background:linear-gradient(135deg,#e8e8f0 40%,#c14a63);' +\n            '-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}' +\n            '.header p{font-size:12px;color:rgba(255,255,255,.45);letter-spacing:2px;margin-top:4px}' +\n            '.content{padding:24px}.qr-wrapper{width:240px;height:240px;margin:0 auto 20px;border-radius:20px;' +\n            'background:#fff;padding:12px;box-shadow:0 8px 32px rgba(193,74,99,.25)}' +\n            '.qr-wrapper img{width:100%;height:100%;display:block;border-radius:12px}' +\n            '.steps{display:flex;flex-direction:column;gap:12px;margin-bottom:16px}' +\n            '.step{display:flex;align-items:flex-start;gap:10px;font-size:13px;color:rgba(255,255,255,.75);line-height:1.5}' +\n            '.step-num{flex-shrink:0;width:22px;height:22px;border-radius:50%;background:rgba(193,74,99,.2);' +\n            'border:1px solid rgba(193,74,99,.5);color:#c14a63;font-size:11px;font-weight:700;' +\n            'display:flex;align-items:center;justify-content:center;margin-top:1px}' +\n            '.tip{padding:12px 14px;background:rgba(240,192,64,.08);border:1px solid rgba(240,192,64,.25);' +\n            'border-radius:12px;font-size:12px;color:rgba(240,192,64,.95);line-height:1.5}' +\n            '.footer{padding:14px 24px 20px;text-align:center;font-size:11px;color:rgba(255,255,255,.3);' +\n            'border-top:1px solid rgba(255,255,255,.05);letter-spacing:1px}' +\n            '</style></head><body><div class=\"container\">' +\n            '<div class=\"header\"><h1>晋江扫码登录</h1><p>SCAN TO LOGIN</p></div>' +\n            '<div class=\"content\"><div class=\"qr-wrapper\"><img src=\"https://api.qrtool.cn/?text=' + enjj + '\"></div>' +\n            '<div class=\"steps\">' +\n            '<div class=\"step\"><span class=\"step-num\">1</span><span>打开已登录晋江的手机 App</span></div>' +\n            '<div class=\"step\"><span class=\"step-num\">2</span><span>进入「我的」，点击右上角「扫码」图标</span></div>' +\n            '<div class=\"step\"><span class=\"step-num\">3</span><span>扫描上方二维码并确认授权</span></div>' +\n            '<div class=\"step\"><span class=\"step-num\">4</span><span>授权后，点击页面右上角 ✓ 完成登录</span></div>' +\n            '</div><div class=\"tip\">请先扫码授权，再点右上角 ✓。提前点击会导致二维码失效，需要重新扫码</div>' +\n            '</div><div class=\"footer\">晋江文学城 · 安全登录</div></div></body></html>';\n\n        let u = java.startBrowserAwait(\"data:text/html;base64,\" + java.base64Encode(html), \"扫码登录\", false).body();\n\n        if (u) {\n            headers[\"Content-Type\"] = \"application/octet-stream\";\n            let checkLogin = \"https://android.jjwxc.com/app.jjwxc/android/reading/Login/checkJjreaderLogin\";\n            let body = jjEncode.call(this, JSON.stringify({\n                \"versionCode\": \"467\",\n                \"jjreader_key\": eData.jjreader_key,\n                \"device_key\": eData.device_key\n            }));\n            let checkLoginpost = {\n                \"method\": \"POST\",\n                \"body\": body,\n                \"headers\": headers\n            };\n            checkLogin = checkLogin + \",\" + JSON.stringify(checkLoginpost);\n            let t = java.ajax(checkLogin);\n            t = JSON.parse(t).data?.token ?? JSON.parse(t).message;\n\n            if (/\\d+_/.test(t)) {\n                setConfig.call(this, { jj_token: t });\n                java.toast(\"✅ 晋江登录成功\\nToken 已保存\");\n            } else {\n                java.toast(t);\n            }\n        }\n    } catch (e) {\n        java.log(e);\n        java.toast(\"扫码登录失败，请重试\");\n    }\n}\n\nfunction logoutJj() {\n    setConfig.call(this, { jj_token: \"\" });\n    java.toast(\"已退出晋江登录\");\n}\n\nfunction switchServer() {\n    let list = getHosts();\n    if (!list.length) { java.toast('未配置服务器'); return; }\n    let cur = getHost.call(this);\n    let idx = list.indexOf(cur);\n    let next = list[(idx + 1) % list.length];\n    setConfig.call(this, { host: next });\n    java.toast('已切换服务器：\\n' + next);\n}\n\nfunction checkServer() {\n    let cur = getHost.call(this);\n    java.toast('正在检测：\\n' + cur);\n    let t1 = Date.now();\n    try {\n        let opt = { headers: buildHeaders.call(this) };\n        let res = java.ajax(cur + '/api/site/public,' + JSON.stringify(opt));\n        let ms = Date.now() - t1;\n        let obj = null;\n        try { obj = JSON.parse(res); } catch (e) { obj = null; }\n        let siteName = (obj.data && obj.data.site_name) ? String(obj.data.site_name) : '未知';\n        let ok = !!(obj.code == 0 && siteName.indexOf('听雪') >= 0);\n        let elapsed = (obj.meta && obj.meta.elapsedMs != null) ? obj.meta.elapsedMs : ms;\n        let level = elapsed < 800 ? '💖 优秀' : elapsed < 2000 ? '💛 一般' : '💔 较慢';\n        java.longToast(\n            '\\n服务器：' + cur + '\\n' +\n            '站点：' + siteName + (ok ? ' ✅' : ' ❌') + '\\n' +\n            '延迟：' + elapsed + 'ms（' + level + '）'\n        );\n    } catch (e) {\n        java.longToast('\\n服务器：' + cur + '\\n❌ 连接失败\\n' + e);\n    }\n}\n\nfunction toggleRefresh() {\n    let conf = getConfig.call(this);\n    let on = (conf.chapter_refresh_force || 'off') == 'on';\n    setConfig.call(this, { chapter_refresh_force: on ? 'off' : 'on' });\n    java.toast(on ? '\\n✔️已关闭强制刷新' : '\\n❗已开启强制刷新（绕过缓存）');\n}\n\nfunction showConfig() {\n    let c = getConfig.call(this);\n    let s = c.sources || {};\n    let lines = [];\n    ['novel','audio','comic','video','download'].forEach(function(t){\n        let arr = s[t] || [];\n        let label = {novel:'小说',audio:'听书',comic:'漫画',video:'短剧',download:'下载'}[t];\n        lines.push(label + '：' + (arr.length ? arr.join('、') : '全部'));\n    });\n    let msg = '当前配置：\\n' +\n        '服务器：' + getHost.call(this) + '\\n' +\n        lines.join('\\n') + '\\n' +\n        '性别：' + (c.gender == 'girl' ? '女频' : '男频') + '\\n' +\n        '账号：' + (getToken.call(this).b64 ? '已登录' : '未登录') + '\\n' +\n        '番茄：' + (getSessionId.call(this) ? '已登录' : '未登录');\n    java.longToast(msg);\n}\n\nfunction stvLogin() {\n    let { java, source } = this;\n    let info = source.getLoginInfoMap() || {};\n    let username = String(info.get('STV账号') || '').trim();\n    let psw = String(info.get('STV密码') || '').trim();\n    if (!username || !psw) return java.toast('请填写STV账号和密码');\n\n    let host = getStvHost.call(this);\n    java.toast('正在登录STV…');\n    try {\n        let body = 'username=' + encodeURIComponent(username) + '&psw=' + encodeURIComponent(psw);\n        let res = java.post(host + '/index.php?ajax=login', body, {\n            'x-requested-with': 'com.sangtacviet.mobilereader',\n            'User-Agent': java.getWebViewUA()\n        });\n        let respBody = String(res.body() || '');\n        if (respBody.trim() != 'success') {\n            return java.toast('STV登录失败：' + respBody);\n        }\n        let sets = [];\n        try { sets = res.headers('set-cookie').toArray(); } catch (e) {}\n        let cookieParts = [];\n        for (let i = 0; i < sets.length; i++) {\n            let kv = String(sets[i]).split(';')[0].trim();\n            if (kv) cookieParts.push(kv);\n        }\n        let cookieStr = cookieParts.join('; ');\n        if (!cookieStr) return java.toast('STV登录成功但未取到cookie');\n        setConfig.call(this, { stv_cookie: cookieStr });\n        java.toast('✅ STV登录成功\\n线路：' + host + '\\nCookie：' + cookieStr);\n    } catch (e) {\n        java.toast('STV登录异常：' + e);\n    }\n}\n\nfunction stvLogout() {\n    setConfig.call(this, { stv_cookie: '' });\n    java.toast('已退出STV');\n}\n\nfunction stvSwitchHost() {\n    let { java } = this;\n    let next = stvNextHost.call(this);\n    java.toast('已切换STV线路：\\n' + next);\n}\n\nfunction stvShowHost() {\n    let { java } = this;\n    java.longToast('当前STV线路：\\n' + stvCurrentHostLabel.call(this));\n}\n\nfunction register() { java.startBrowserAwait(getHost.call(this) + '/spa/#/register', \"注册\"); }\nfunction user() { java.startBrowserAwait(getHost.call(this) + '/spa/#/member', \"用户中心\"); }\nfunction icons() { java.startBrowserAwait(getHost.call(this) + '/spa/#/member/icons', \"段评气泡\"); }\nfunction level() { java.startBrowserAwait('https://wzyp.cn/shop/FXB8NXCR', \"升级\"); }", "respondTime": 180000, "ruleBookInfo": {"author": "$.author", "coverUrl": "$.cover", "init": "<js>\nif (String(baseUrl).startsWith(\"data:\")) {\n    let res = JSON.parse(java.hexDecodeToString(result));\n    let request = getHost.call(this) + `/api/detail,${JSON.stringify({\n        method: \"POST\",\n        body: JSON.stringify(res),\n        headers: buildHeaders.call(this)\n    })}`;\n    result = java.ajax(request);\n}\nresult = decryptIfEncrypted.call(this, result);\nresult = checkMsg.call(this, result);\nresult;\n</js>\n$.data", "intro": "&nbsp;&nbsp;\n✨ 源站：{{$.source}}{{\"\\n\"+\"​\"}}\n{{$.desc}}", "kind": "$.tags", "lastChapter": "{{$.source}} · {{$.latest_chapter_title}}", "name": "$.title", "tocUrl": "<js>\nlet catalog = {\n    source: result.source,\n    sing: result.sing,\n    book_id: result.book_id,\n    title: result.title,\n    tab: result.tab\n};\n\nlet yunurl = java.base64Encode(JSON.stringify(catalog));\nresult = `data:catalogUrl;base64,${yunurl},{\"type\":\"qingci\"}`;\n</js>", "wordCount": "$.word_count"}, "ruleContent": {"callBackJs": "let handled = false;\n\nif (event == 'addBookShelf' || event == 'delBookShelf') {\n    if (isShelfSyncEnabled.call(this)) {\n        syncShelf.call(this, event == 'addBookShelf');\n    }\n    handled = true;\n}\n\nif (event == 'clickCustomButton') {\n    let targetUrl = '';\n\n    // 正文页：章评\n    if (chapter && chapter.url) {\n        try {\n            let chUrl = String(chapter.url);\n            let b64 = chUrl.replace(/^data:contentUrl;base64,/, '');\n            let idx = b64.indexOf(',');\n            if (idx >= 0) b64 = b64.substring(0, idx);\n            let params = JSON.parse(java.base64Decode(b64));\n            let bid = params.book_id || '';\n            let cid = params.item_id || '';\n            let src = params.source || '';\n            if (bid && cid) {\n                targetUrl = getHost.call(this) + '/comment?tab=chapter&book_id=' + bid\n                          + '&item_id=' + cid\n                          + '&source=' + src;\n            }\n        } catch (e) {}\n    }\n\n    // 详情页：书评\n    if (!targetUrl && book && book.tocUrl) {\n        try {\n            let tocUrl = String(book.tocUrl);\n            let b64 = tocUrl.replace(/^data:catalogUrl;base64,/, '');\n            let idx = b64.indexOf(',');\n            if (idx >= 0) b64 = b64.substring(0, idx);\n            let catalog = JSON.parse(java.base64Decode(b64));\n            let bid = catalog.book_id || catalog.bookid || '';\n            let src = catalog.source || '';\n            if (bid) {\n                targetUrl = getHost.call(this) + '/comment?tab=book&book_id=' + bid\n                          + '&source=' + src;\n            }\n        } catch (e) {}\n    }\n\n    if (targetUrl) {\n        java.showBrowser(\n            targetUrl,\n            null,\n            'window.java=java;',\n            JSON.stringify(getCmtBrowserOptions.call(this))\n        );\n    } else {\n        java.toast('请等待章节或详情加载完毕');\n    }\n    handled = true;\n}\n\nhandled;", "content": "@js:\nfunction cleanText(t) {\n    if (t == null) return '';\n    return String(t)\n        .replace(/\\r\\n/g, '\\n')\n        .replace(/\\r/g, '\\n')\n        .replace(/[ \\t]+\\n/g, '\\n')\n        .replace(/\\n{2,}/g, '\\n')\n        .replace(/^\\n+|\\n+$/g, '')\n        .trim();\n}\n\nlet chapterParams = JSON.parse(java.hexDecodeToString(result));\nchapterParams.token = getJjToken();\nchapterParams.version = localVersion;\nlet conf = getConfig.call(this);\nlet sourceName = chapterParams.source || '';\n\nif (conf.chapter_refresh_force == 'on') {\n    chapterParams.force_refresh = 'on';\n}\n\nif (conf.stv_content == 'on') {\n    chapterParams.stv_content = 'on';\n}\n\nlet toneVar = String(book.getVariable('custom') || '');\nif (!toneVar) {\n    if (sourceName == '番茄听书') toneVar = '1';\n    else if (sourceName == '书旗听书') toneVar = 'yifei';\n}\nchapterParams.tone_id = toneVar;\nsyncProgress.call(this, chapterParams);\n\nlet paraOn = (conf.para_review || 'off') == 'on';\nlet paraStyle = conf.para_style || 'TEXT';\nlet syOn = (conf.para_sy || 'off') == 'on';\n\nif (syOn) chapterParams.devicetype = \"ios\";\nelse chapterParams.devicetype = \"android\";\n\nlet paraSources = ['番茄小说', 'QQ阅读', '晋江','半夏', '七猫', '少年梦', '书旗'];\nif (paraOn && paraSources.indexOf(sourceName) != -1) {\n    chapterParams.review = 'on';\n    chapterParams.style = paraStyle;\n}\n\nif (sourceName == '书旗听书' || sourceName == '番茄听书') {\n    let obj = postJson.call(this, '/api/audio', chapterParams);\n    result = cleanText((obj.data || {}).main_url || '');\n} else {\n    let obj;\n    try {\n        obj = postJson.call(this, '/api/content', chapterParams);\n    } catch (e) {\n        obj = { code: -1, message: '解析失败', raw: String(e) };\n    }\n\n    if (shouldBlockByVersion.call(this, obj.data && obj.data.version)) {\n        result = '';\n    } else {\n        let hasContent = !!(obj.data && obj.data.content != null && String(obj.data.content).trim() != '');\n        let content = hasContent ? obj.data.content : (obj.message || '');\n        let tab = (obj.data && obj.data.tab) || chapterParams.tab || '';\n        let isVideoLink = (tab == 'video' && content && /^https?:\\/\\//i.test(String(content)));\n\n        let rawText = hasContent ? String(content) : '';\n        let cnCount = (rawText.match(/[\\u4e00-\\u9fa5]/g) || []).length;\n        let valid = hasContent && cnCount >= 20;\n\n        let stvOn = (conf.stv_content || 'off') == 'on';\n        let stvSource = (sourceName == '晋江') ? 'jjwxc' : ((sourceName == '起点') ? 'qidian' : '');\n        let needStv = !isVideoLink && !valid && stvOn && stvSource;\n\n        if (needStv) {\n            let urlIndex = chapterParams.item_id;\n            let bookid = chapterParams.book_id;\n            let h = stvSource;\n            let bhost = getStvHost.call(this);\n            let loginCookie = getStvCookie.call(this);\n\n            if (!loginCookie) {\n                result = '【STV正文获取失败】未登录STV（缺少cookie）';\n            } else {\n                try {\n                    let grantUrl = bhost + '/io/grantcontext/context?hostid=' + h + '&bookid=' + bookid;\n                    let grantHeaders = {\n                        'cookie': loginCookie,\n                        'x-requested-with': 'com.sangtacviet.mobilereader'\n                    };\n                    let grantRes = java.get(grantUrl, grantHeaders);\n                    let scriptCode = String(grantRes.body());\n\n                    let sessionCookie = '';\n                    try {\n                        let sets = grantRes.headers('set-cookie').toArray();\n                        let parts = [];\n                        for (let si = 0; si < sets.length; si++) {\n                            let kv = String(sets[si]).split(';')[0].trim();\n                            if (kv) parts.push(kv);\n                        }\n                        sessionCookie = parts.join('; ');\n                    } catch (e) {}\n\n                    var __chapterKey = '';\n                    var window = {\n                        document: { hidden: false },\n                        Capacitor: '0',\n                        app: {\n                            net: java,\n                            reader: {\n                                __defineGetter__: (k, func) => { __chapterKey = func(); }\n                            }\n                        }\n                    };\n                    var btoa = (s) => String(yuedu.base64Encode(s));\n                    var Capacitor = {};\n                    var key;\n                    var yuedu = java;\n                    var Pkgs = Packages;\n                    Packages = undefined;\n                    java = undefined;\n                    eval('(()=>{var _0xp = globalThis.String.fromCharCode;String.fromCharCode = function() {var args = Array.prototype.slice.call(arguments);return _0xp.apply(null, args).replace(/const /g, \"let \");};' + scriptCode + ';return key;})()');\n                    java = yuedu;\n                    Packages = Pkgs;\n                    KEY = __chapterKey;\n\n                    if (!KEY) {\n                        result = '【STV正文获取失败】未取到章节KEY';\n                    } else {\n                        let allCookies = [loginCookie, sessionCookie].filter(Boolean).join('; ');\n                        let stv_cookie = 'transmode=chinese; ' + allCookies;\n                        let SIGN_SUFFIX = '&sajax=readchapter&erogh982^%*%^*';\n                        let SIGN_KEY = KEY + SIGN_SUFFIX;\n                        let sign = java.md5Encode('bookid=' + bookid + '&c=' + urlIndex + '&h=' + h + '&key=' + SIGN_KEY);\n                        let chapterUrl = bhost + '/index.php?sajax=readchapter&h=' + h + '&bookid=' + bookid + '&c=' + urlIndex + '&key=' + KEY;\n\n                        let chapterOpt = {\n                            method: 'GET',\n                            headers: {\n                                'cookie': stv_cookie,\n                                'X-STV-Sign': sign,\n                                'x-requested-with': 'com.sangtacviet.mobilereader',\n                                'x-stv-transport': 'app',\n                                'Referer': bhost + '/',\n                                'Origin': bhost\n                            }\n                        };\n                        let stvRaw = '';\n                        let retry = 0;\n                        while (retry < 3) {\n                            stvRaw = java.ajax(chapterUrl + ',' + JSON.stringify(chapterOpt)) + '';\n                            if (stvRaw.indexOf('error code: 1015') == -1) break;\n                            retry++;\n                            if (retry < 3) {\n                                try { java.lang.Thread.sleep(1000); } catch (e) {}\n                            }\n                        }\n                        if (stvRaw.indexOf('error code: 1015') != -1) {\n                            result = '【STV正文获取失败】STV接口返回 error code: 1015（重试3次仍失败）';\n                        } else {\n                        try {\n                            let jsonObj = JSON.parse(stvRaw);\n                            if (jsonObj.data) {\n                                let text = String(jsonObj.data);\n\n                                text = text.replace(/<br\\s*\\/?>/gi, '\\n');\n                                text = text.replace(/<\\/p>/gi, '\\n');\n                                text = text.replace(/<[^>]+>/g, '');\n\n                                text = text.replace(/^\\uFEFF/, '');\n                                text = text.replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]/g, '');\n                                text = text.replace(/[\\u200B-\\u200D\\uFEFF]/g, '');\n\n                                text = text.replace(/&[^;]*?\\([A-Za-z]{4,}\\)[^;]*?;/g, '');\n                                text = text.replace(/<[^>]*?\\([A-Za-z]{4,}\\)[^>]*?>/g, '');\n                                text = text.replace(/\\([A-Za-z]{4,}\\)/g, '');\n\n                                text = text.replace(/<b><font color=red>[\\s\\S]*?<\\/b>/gi, '');\n                                text = text.replace(/<!--[\\s\\S]*?-->/g, '');\n\n                                let lines = text.split('\\n');\n                                let kept = [];\n                                for (let li = 0; li < lines.length; li++) {\n                                    let line = lines[li];\n                                    if (/^Người/.test(line)) continue;\n                                    if (/@Bạn/.test(line)) continue;\n                                    if (/Đọc tại/.test(line)) continue;\n                                    if (/Tải.*Scan/.test(line)) continue;\n                                    if (/[（(][^）)]*飞卢小说[^）)]*[）)]/.test(line)) continue;\n                                    if (/看无下划线版小说请下载飞卢小说/.test(line)) continue;\n                                    kept.push(line);\n                                }\n                                text = kept.join('\\n');\n\n                                text = text.replace(/\\n{2,}/g, '\\n').trim();\n\n                                if (text) {\n                                    if (h == 'jjwxc') {\n                                        chapterParams.content = text;\n                                        chapterParams.stv_content = stvOn ? 'on' : 'off';\n                                        let obj2 = null;\n                                        try {\n                                            obj2 = postJson.call(this, '/api/content', chapterParams);\n                                        } catch (e) {}\n                                        if (paraOn && obj2 && obj2.data && obj2.data.content != null && String(obj2.data.content).trim() != '') {\n                                            result = cleanText(obj2.data.content);\n                                        } else {\n                                            result = cleanText(text);\n                                        }\n                                    } else {\n                                        result = cleanText(text);\n                                    }\n                                } else {\n                                    result = '【STV正文为空】';\n                                }\n                            } else {\n                                let errMsg = jsonObj.err || jsonObj.error || '';\n                                let cnMsg = '';\n                                if (/truyện không tồn tại/i.test(errMsg)) cnMsg = '该书在STV系统中不存在';\n                                else if (/Khởi động lại/i.test(errMsg)) cnMsg = 'STV要求重启应用（请清除cookie后重新登录）';\n                                else if (/bị khóa/i.test(errMsg)) cnMsg = 'STV账号已被锁定';\n                                else if (/hết hạn/i.test(errMsg)) cnMsg = 'STV登录已过期，请重新登录';\n                                else if (/JJMoney trong tài khoản không đủ/i.test(errMsg)) cnMsg = 'STV账号JJMoney余额不足，请去STV网页端充值/兑换后再试';\n                                else if (/lỗi/i.test(errMsg)) cnMsg = 'STV服务端错误';\n                                else cnMsg = errMsg || '未知错误';\n                                result = '【STV正文获取失败】' + cnMsg;\n                            }\n                        } catch (e) {\n                            result = '【STV正文解析失败】' + e + ' raw=' + String(stvRaw).substring(0, 200);\n                        }\n                        }\n                    }\n                } catch (e) {\n                    java = yuedu;\n                    Packages = Pkgs;\n                    result = '【STV请求异常】' + e;\n                }\n            }\n        } else if (isVideoLink) {\n            if (book.durChapterIndex == chapter.index) {\n                try {\n                    java.startBrowser(String(content), chapter.title);\n                    java.toast('正在加载视频\\n视频加载较慢，请耐心等待');\n                } catch (e) {}\n            }\n            result = '【刷新正文】播放\\n直链:\\n' + cleanText(content);\n        } else {\n            result = cleanText(content);\n        }\n    }\n}", "imageStyle": "FULL", "payAction": "let raw = String(baseUrl);\nlet b64 = raw.replace(/^data:contentUrl;base64,/, '');\nlet idx = b64.indexOf(',');\nif (idx >= 0) b64 = b64.substring(0, idx);\nlet chapterParams = JSON.parse(java.base64Decode(b64));\n\nlet bid = String(chapterParams.book_id || '');\nlet cid = String(chapterParams.item_id || '');\n\nlet token = getJjToken.call(this);\nlet enbody = String(Date.now()) + \":\" + token + \":\" + bid;\nlet sign = encode.call(this, enbody);\nlet body = \"versionCode=444&novelId=\" + bid + \"&chapters=\" + cid + \"&orderType=15&isautoBuy=0&autosubscribeStatus=0&notUseBackpoint=&sign=\" + sign;\nlet url = \"https://android.jjwxc.net/androidapi/buy,\";\nlet post = { \"method\": \"POST\", \"body\": String(body) };\nlet a = java.ajax(url + JSON.stringify(post));\nlet res = JSON.parse(a);\nif (/购买成功/.test(res.message)) {\n    java.longToast(res.message);\n    result = true;\n} else {\n    let mm = res.message == \"\"\n        ? (res.popupdata && res.popupdata.popupmessage ? res.popupdata.popupmessage : \"购买失败\") + \"\\n❗️进晋江app进行一次验证后❗️才能在阅读app使用购买功能\"\n        : res.message;\n    java.longToast(mm);\n}", "replaceRegex": "##\\(本章完\\)|\\(\\)|\\(第\\d+/\\d+页\\)|(?:.*(?:蟹蟹|扔了|感谢|投出|灌溉营养液|送的|谢谢).*?(?:手榴|月票|霸王票|小天使|火箭炮|深水鱼雷|浅水炸弹|地雷|营养液)([xX]\\d+)*.*|.*?瓶[；~]|\".*?\"(?:营养液|手榴弹|月票|霸王票|小天使|火箭炮|深水鱼雷|浅水炸弹|地雷)x\\d+|读者.*?(月石|营养液).*|地雷感谢：[\\s\\S]+)|<\\?xml.*?XHTML.*", "subContent": "@js:\nlet chapterParams = JSON.parse(java.hexDecodeToString(result));\n\nvar sourceName = chapterParams.source || '';\n\nlet toneVar = String(book.getVariable('custom') || '');\nif (!toneVar) {\n    if (sourceName == '番茄听书') toneVar = '1';\n    else if (sourceName == '书旗听书') toneVar = 'yifei';\n}\nchapterParams.tone_id = toneVar;\n\nlet allowSources = ['番茄听书', '番茄畅听', '七猫听书', '酷我听书', '书旗听书', '喜马拉雅', '懒人听书'];\nif (allowSources.indexOf(sourceName) == -1) {\n    result = '';\n} else {\n    let headers = buildHeaders.call(this);\n    headers['Content-Type'] = 'application/json';\n    let op = { method: \"POST\", body: JSON.stringify(chapterParams), headers: headers };\n    let url = getHost.call(this) + `/api/lrc,${JSON.stringify(op)}`;\n    let res = java.ajax(url);\n    res = decryptIfEncrypted.call(this, res);\n    let obj = JSON.parse(res);\n    result = (obj.data && obj.data.lrc) ? obj.data.lrc : '';\n}"}, "ruleExplore": {"author": "$.author", "bookList": "<js>\nlet res = decryptIfEncrypted.call(this, result);\nres = checkMsg.call(this, res);\nresult = res;\n</js>\n$.data", "bookUrl": "<js>\nlet detail = {\n    source: result.source,\n    sing: result.sing,\n    book_id: result.book_id\n};\nlet yunurl = java.base64Encode(JSON.stringify(detail));\nresult = `data:detailsUrl;base64,${yunurl},{\"type\":\"qingci\"}`;\n</js>", "coverUrl": "$.cover", "intro": "$.desc", "kind": "$.tags", "lastChapter": "$.latest_chapter_title", "name": "$.title", "wordCount": "$.word_count"}, "ruleSearch": {"author": "$.author", "bookList": "<js>\nlet res = decryptIfEncrypted.call(this, result);\nres = checkMsg.call(this, res);\nresult = res;\n</js>\n$.data.list", "bookUrl": "<js>\nlet detail = {\n    source: result.source,\n    sing: result.sing,\n    book_id: result.book_id\n};\nlet yunurl = java.base64Encode(JSON.stringify(detail));\nresult = `data:detailsUrl;base64,${yunurl},{\"type\":\"qingci\"}`;\n</js>", "checkKeyWord": "十日终焉", "coverUrl": "$.cover", "intro": "$.desc", "kind": "$.tags", "lastChapter": "{{$.source}} · {{$.latest_chapter_title}}", "name": "$.title", "wordCount": "$.word_count"}, "ruleToc": {"chapterList": "<js>\nvar res = JSON.parse(java.hexDecodeToString(result));\nlet device = deviceType() ? 'ios' : 'android';\nlet typeMap;\n\nif (device == 'android') {\n    typeMap = { audio: 32, comic: 64 };\n    book.type = res.tab in typeMap ? typeMap[res.tab] : 8;\n} else {\n    typeMap = { audio: 1, comic: 2, video: 3 };\n    book.type = res.tab in typeMap ? typeMap[res.tab] : 0;\n}\nvar headers = buildHeaders.call(this);\nheaders['Content-Type'] = 'application/json';\nvar op = { method: \"POST\", body: JSON.stringify(res), headers: headers };\nvar request = getHost.call(this) + '/api/catalog,' + JSON.stringify(op);\nresult = java.ajax(request);\nresult = decryptIfEncrypted.call(this, result);\nresult = checkMsg.call(this, result);\nresult;\n</js>\n$.data", "chapterName": "$.title", "chapterUrl": "<js>\nif (result.is_volume == true) {\n    result = \"\";\n} else {\n    let content = {\n    \t   sing: result.sing,\n        book_id: result.book_id || \"\",\n        item_id: result.item_id || \"\",\n        content_md5: result.content_md5 || \"\",\n        chapter_index: result.chapter_index,\n        source: result.source\n    };\n    let yunurl = java.base64Encode(JSON.stringify(content));\n    result = `data:contentUrl;base64,${yunurl},{\"type\":\"qingci\"}`;\n}\n</js>", "isPay": "$.is_pay", "isVip": "$.is_vip", "isVolume": "$.is_volume", "updateTime": "$.tag"}, "searchUrl": "<js>\nvar conf = ensureConfig.call(this);\nvar sourceVal = conf.source || '';\nvar param = sourceVal ? '&source=' + sourceVal.split(',').map(function(s){ return s.trim(); }).join(',') : '';\n\nvar mode = conf.mode || 'novel';\nvar modeMap = {\n    '📖小说': 'novel',\n    '🎧听书': 'audio',\n    '🌈漫画': 'comic',\n    '▶️短剧': 'video',\n    '⬇️下载': 'download'\n};\nif (modeMap[mode]) mode = modeMap[mode];\n\nvar sources = conf.sources || {};\nvar allTabs = Array.isArray(conf.allTabs) ? conf.allTabs : [];\nvar tabs = ['novel', 'audio', 'comic', 'video', 'download'];\n\nvar curList = sources[mode] || [];\nif (curList.length == 0 && allTabs.indexOf(mode) == -1) {\n    for (var i = 0; i < tabs.length; i++) {\n        var t = tabs[i];\n        if ((sources[t] || []).length > 0 || allTabs.indexOf(t) != -1) {\n            mode = t;\n            break;\n        }\n    }\n}\n\nresult = getHost.call(this) + '/api/search?keyword={{key}}&page={{page}}&tab=' + mode + param;\n</js>", "weight": 0},{"bookSourceComment": "UU看书 www.uukan.org（原思兔小说）。搜索 /search/{关键字}.html，详情 /book/{书ID}.html，目录 /chapter/{书ID}/1.html 分 3 页每页 500 章，正文容器 div#content。", "bookSourceGroup": "自制,网页源", "bookSourceName": "UU看书(www.uukan.org)", "bookSourceType": 0, "bookSourceUrl": "https://www.uukan.org", "bookUrlPattern": "https?://(www[.])?uukan[.]org/book/[\\w]+\\.html", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": false, "eventListener": false, "lastUpdateTime": "1794189596956", "respondTime": 180000, "ruleBookInfo": {"author": "class.booktag@tag.a.0@text", "coverUrl": "class.bookcover@tag.img@src", "intro": "class.bookintro@text", "kind": "class.breadcrumb@tag.li.1@tag.a@text", "lastChapter": "class.bookchapter@text", "name": "class.booktitle@text", "tocUrl": "@js:\n(() => {\n    var h = java.getString('class.bookchapter@href');\n    var m = h.match(/\\/chapter\\/([^\\/]+)\\//);\n    return m ? '/chapter/' + m[1] + '/1.html' : '';\n})()", "wordCount": "class.booktag@tag.span.0@text"}, "ruleContent": {"content": "id.content@html", "title": "class.read@tag.h1@text"}, "ruleExplore": [], "ruleSearch": {"author": "class.author.0@text##作者：", "bookList": "class.bookbox", "bookUrl": "class.bookname@tag.a@href", "intro": "class.update@text##简介：", "kind": "class.breadcrumb@tag.li.1@tag.a@text", "lastChapter": "class.cat@tag.a@text", "name": "class.bookname@tag.a@text", "wordCount": "class.author.1@text##字数："}, "ruleToc": {"chapterList": "id.allchapter@tag.a", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": "text.下一页@href"}, "searchUrl": "/search/{{key}}.html", "weight": 0},{"bookSourceComment": "【请勿删除校对作者成果标注】\n本系列书源由B站“星之墨辰”整理，并且免费无偿分享该整合系列，感兴趣的小伙伴，可以来B站搜索我哦。", "bookSourceName": "墨辰整理书源系列7.5版", "bookSourceType": 0, "bookSourceUrl": "墨辰整理书源大全", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nli = [\n    {\"༺墨辰整合系列:禁止倒卖倒卖༻\": \"\"},\n    { \"𓆩书源整理:星之墨辰𓆪\": \"\"},\n    {\"⏭粉丝交流-企鹅群聊⏮\": \"https://qm.qq.com/cgi-bin/qm/qr?k=KQgeXUbwlDmrUcdS2iEflDePyinhslGK&jump_from=webapi&authKey=S8C8lwgpZX4Iz7+rme7iLEZvmN0uSJ+FiRWR1ZRbVPt2iJNbpHLbtSF8GG6wMVeQ\" },\n    {\"◾️哔哩哔哩◾️\": \"https://space.bilibili.com/501149848\" },\n    {\"◽️新公众号◽️\": \"https://mp.weixin.qq.com/s/uq7ytU33MTMdSarCUs9RAA\" },\n    {\"🔸夸克网盘-更新合集🔸\": \"https://pan.quark.cn/s/b0e1c6e0252c\" },\n    {\"🔹百度网盘-更新合集🔹\": \"https://pan.baidu.com/s/1j-UGCyyihVRR2_JHf3jClg?pwd=1234\" },\n]\n\nbuHuanHang = [\n    \"◾️哔哩哔哩◾️\",\n    \"◽️新公众号◽️\",\n]\n// 处理按钮\nli.forEach(item => {\n    item.title = Object.keys(item)[0]\n    item.url = Object.values(item)[0]\n    delete item[Object.keys(item)[0]]\n\n    // 添加格式\n    item.style = {}\n    item.style.layout_flexGrow = 1\n    item.style.layout_flexShrink = 1\n    item.style.layout_alignSelf = \"auto\"\n    item.style.layout_wrapBefore = \"false\"\n    if (buHuanHang.includes(item.title)) {\n        item.style.layout_flexBasisPercent = -1\n    } else {\n        item.style.layout_flexBasisPercent = 1\n    }\n})\n\njava.longToast(`\\n\\n作者主页：\\nhttps://space.bilibili.com/501149848`)\nJSON.stringify(li)", "jsLib": "function getWebViewUA() {\n    const {java, cache} = this\n    let userAgent = String(java.getWebViewUA())\n    if (userAgent.includes(\"Windows NT 10.0; Win64; x64\")) {\n        userAgent = \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Mobile Safari/537.36\"\n    }\n    // java.log(`userAgent=${userAgent}`)\n    return String(userAgent)\n}\n\nfunction startBrowser(url, title) {\n    const {java} = this\n    if (!title) title = url\n    let headers = {}\n    headers[\"User-Agent\"] = this.getWebViewUA()\n\n    if (url.endsWith(\".json\")) {\n        java.openUrl(`legado://import/importonline?src=${url}`)\n    } else {\n        java.startBrowser(`${url}, ${JSON.stringify({headers: headers})}`, title)\n    }\n}", "lastUpdateTime": 1793775010809, "loginUi": "@js:\nlet li = [\n{\"𓆩书源整理:星之墨辰𓆪\": \"\" },\n{\"⟡粉丝交流-企鹅群聊⟡\": \"https://qm.qq.com/cgi-bin/qm/qr?k=KQgeXUbwlDmrUcdS2iEflDePyinhslGK&jump_from=webapi&authKey=S8C8lwgpZX4Iz7+rme7iLEZvmN0uSJ+FiRWR1ZRbVPt2iJNbpHLbtSF8GG6wMVeQ\" },\n{\"⛥视频更新:哔哩哔哩⛦\": \"https://space.bilibili.com/501149848\" },\n{\"☾新书源渠道:微信公众号☽\": \"https://mp.weixin.qq.com/s/uq7ytU33MTMdSarCUs9RAA\" },\n{\"🔸夸克网盘更新🔸\": \"https://pan.quark.cn/s/b0e1c6e0252c\" },\n{\"🔹百度网盘更新🔹\": \"https://pan.baidu.com/s/1j-UGCyyihVRR2_JHf3jClg?pwd=1234\" },\n]\n\nbuHuanHang = [\n\"🔸夸克网盘更新🔸\",\n\"🔹百度网盘更新🔹\",\n]\n// 处理按钮\nli.forEach(item => {\n    item.name = Object.keys(item)[0]\n    item.type = \"button\"\n    if (Object.values(item)[0] !== \"\") {\n        item.action = `startBrowser('${Object.values(item)[0]}')`;\n    }\n    delete item[Object.keys(item)[0]]\n\n    // 添加格式\n    item.style = {}\n    item.style.layout_flexGrow = 1\n    if (buHuanHang.includes(item.name)) {\n        item.style.layout_flexBasisPercent = -1\n    } else {\n        item.style.layout_flexBasisPercent = 1\n    }\n})\n\nJSON.stringify(li)", "loginUrl": "function login() {}", "respondTime": 180669, "ruleBookInfo": {}, "ruleContent": {}, "ruleExplore": {"bookList": "@js:\nstartBrowser(baseUrl, \"星之墨辰\") "}, "ruleSearch": {}, "ruleToc": {}, "searchUrl": "@js:\njava.longToast(`\n\n┍────────────────┒\n│①不同种类资源搜索，可点击右上角│\n│三个点进行切换，切换后会根据书源│\n│排序进行加载。　　　　　　　　　│\n│②找到想看资源后，如果资源无法浏│\n│览，可以尝试点击换源，切换其他书│\n│源查看，或开启魔法重试。　　　　│\n│③浏览文字时如有广告，可长按点击│\n│替换，在替换为那里打个空格并点保│\n│存，则可以屏蔽该广告显示。　　　│\n├────────────────┤\n│优先使用阅读最新版导入该书源合集│\n│更多资源可前往此书源发现页面查看│\n└────────────────┘\n┍　　　　合集作者：星之墨辰　　　┒\n├────────────────┤\n│　　此次书源合集完全免费分享　　│\n│　　　严禁任何倒买倒卖行为　　　│\n├────────────────┤\n│部分书源可在登录界面进行账号登录│\n└────────────────┘\n`)\n\"https://space.bilibili.com/501149848\"", "variableComment": "哔哩哔哩关键词：书源\n微信公众号关键词：书源", "weight": 0},{"bookSourceComment": "// 261108 修复：站点改版为笔趣阁Bootstrap模板；搜索改 POST /searchNN.html（form action 动态取）；\n// 域名 www.ijjxs.org 被宝塔WAF图形验证码拦截(首次访问即拦, Secure Cookie 与仅HTTP站点冲突)，\n// 默认线路用源站裸IP 177.5.49.192 直连免验证；登录面板可切换线路/测速/检查登录状态。\n// 本站搜索/详情/目录/正文无需账号，/bookcase/ 书架功能才需登录，故不写账号登录UI。\n// ★站点搜索限频是「会话级配额」：HTTP日志实锤 200+alert(\"搜索间隔: 30 秒\")，隔 2 分钟仍被拒，\n//   清 Cookie 换新会话立即成功（与 xsbook 同型）。searchUrl 的 URL 选项 js（请求前置JS环境）每次搜索前清线路域 Cookie 自愈\n//   （★{{}} 内联 JS 环境不注入 cookie 绑定，调用抛 ReferenceError 被 try/catch 吞掉=静默失效；\n//   必须放 URL 选项 js 字段=请求前置JS环境。注意 removeCookie 作用于本次请求的会话Cookie栈，\n//   使本次请求不携带旧键；持久层 Cookie 与响应 Set-Cookie 不受影响）；\n//   不主动探测搜索频率、不连发验证，避免触发风控。loginCheckJs 对限频页给出提示。\n// 兼容 LegadoTeam(gedoor) 与 legado-E(Luoyacheng)：列表返回 java.util.ArrayList；字段名/返回类型两版一致。\n// ★261108 二次修复「换路线失败」：jsLib 函数编译期捕获 source 快照会冻结，面板 source.put 写入后规则仍读旧值；\n//   ★三环境键空间实锤：{{}} 内联JS(AnalyzeUrl.evalJS) 里 source.get 实时、java.get 恒空、cookie 未绑定；\n//   eval_js 环境 java.get/source.get 互通；jsLib 函数编译期捕获 source 快照会冻结。\n//   ⇒ 正解=所有入口 {{}} 内联 IIFE 直接用 source.get('ijLine') 实时取，不经过 jsLib 函数；\n//     面板按钮 action 用 source.put 写入同一键空间；清 Cookie 仍走 URL 选项 js。\n// ★261108 三次修复「触发人机验证应弹验证码」：loginCheckJs 检测宝塔WAF页 → 抓 /get_btwaf_captcha_base64 真图\n//   → java.getVerificationCode(data:image/png;base64,真图) 弹窗让用户填 → /Verification_auth_btwaf 提交\n//   → 成功后从 result.raw().request() 取 method/body/headers 原样重放 → new StrResponse(url,body) 返回，搜索继续。\n//   探针实锤 loginCheckJs 环境有 key/page/result.raw().request()/java.getVerificationCode/cookie；1px透明PNG探针不能当图用。\n// ★261108 四次修复「填码后没继续搜索」：HTTP日志实锤 验证成功(status:true)→重放 POST /search7e.html 得 404。\n//   根因=同一A记录按Host分发两套站：域名过盾后是「久久小说网」模板(GET /search/?searchkey= + .item + #booktxt)，\n//   裸IP是「笔趣阁」模板(POST /search7e.html + #bookcon)。且过盾票是短时/IP会话，必须验证后立刻重放。\n//   修法=loginCheckJs 按Host分派重放接口(域名用GET /search/、裸IP原样POST)，不再回填原请求头(避免重复头)；\n//   ruleSearch/ruleExplore/详情/正文/目录全部改双模板兼容。\n// ★261108 五次修复「目录排序错误·最新章节排前面」：域名侧 #list 是单个 dl，\n//   dt[0]=最新章节(9条倒序) + dt[1]=全部章节目录(277条正序) + 末尾又重复最新9条。\n//   原兜底 doc.select('dl') 全收 → 最新章节置顶。修法=从「全部章节目录」dt 锚点之后取所有数字章节 a、\n//   按 href 去重保先出现；裸IP侧仍用「a最多的 ul.list-charts」段。", "bookSourceGroup": "AI", "bookSourceName": "久久小说(修复版)", "bookSourceType": 0, "bookSourceUrl": "http://www.ijjxs.org/", "bookUrlPattern": "https?://(?:www\\.)?ijjxs\\.org/\\d+_\\d+/?|https?://177\\.5\\.49\\.192/\\d+_\\d+/?", "customButton": false, "customOrder": 1859, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\": \"全部小说\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http://177.5.49.192';return L.replace(/\\\\/+$/,'')})()}}/class/{{page}}/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"玄幻\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http://177.5.49.192';return L.replace(/\\\\/+$/,'')})()}}/class/xuanhuan/{{page}}/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"仙侠\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http://177.5.49.192';return L.replace(/\\\\/+$/,'')})()}}/class/xianxia/{{page}}/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"都市\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http://177.5.49.192';return L.replace(/\\\\/+$/,'')})()}}/class/dushi/{{page}}/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"历史\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http://177.5.49.192';return L.replace(/\\\\/+$/,'')})()}}/class/lishi/{{page}}/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"网游\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http://177.5.49.192';return L.replace(/\\\\/+$/,'')})()}}/class/wangyou/{{page}}/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"科幻\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http://177.5.49.192';return L.replace(/\\\\/+$/,'')})()}}/class/kehuan/{{page}}/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"女生\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http://177.5.49.192';return L.replace(/\\\\/+$/,'')})()}}/class/nvsheng/{{page}}/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"其他\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http://177.5.49.192';return L.replace(/\\\\/+$/,'')})()}}/class/qita/{{page}}/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"全本\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http://177.5.49.192';return L.replace(/\\\\/+$/,'')})()}}/quanben/class/{{page}}/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"总排行\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http://177.5.49.192';return L.replace(/\\\\/+$/,'')})()}}/rank/allvisit/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"月排行\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http://177.5.49.192';return L.replace(/\\\\/+$/,'')})()}}/rank/monthvisit/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"周排行\", \"url\": \"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http://177.5.49.192';return L.replace(/\\\\/+$/,'')})()}}/rank/weekvisit/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}]", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\", \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\", \"Accept-Language\": \"zh-CN,zh;q=0.9\"}", "jsLib": "function IJ_base(){\n var L='';\n // ★java.get 在规则/内联 JS 环境读的是实时值；jsLib 函数编译期捕获的 source 快照会冻结\n try{ L=String(source.get('ijLine')||''); }catch(e){}\n if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0) L='http://177.5.49.192';\n return L.replace(/\\/+$/,'');\n}\nfunction IJ_action(){\n var L=IJ_base();\n try{\n  var h=String(java.ajax(L+'/'));\n  var m=h.match(/action=['\"](\\/search[^'\"]*\\.html)['\"]/);\n  if(m) return L+m[1];\n }catch(e){}\n return L+'/search7e.html';\n}\nfunction IJ_cookieJs(){\n return \"try{cookie.removeCookie('\"+IJ_base()+\"/')}catch(e){}\";\n}", "lastUpdateTime": "1794108423745", "loginCheckJs": "(function(){\n var R=result;\n try{\n  var b=String(R.body()||'');\n  var waf=b.indexOf('宝塔防火墙')>=0||b.indexOf('Verification_auth_btwaf')>=0||b.indexOf('请输入验证码')>=0;\n  if(!waf){\n   if(b.indexOf('搜索间隔: 30 秒')>=0) java.toast('久久小说：站点搜索间隔 30 秒，已自动清会话重试；若仍出现请稍后再搜');\n   return R;\n  }\n  var u=String(R.url());\n  var root=u.replace(/^(https?:\\/\\/[^\\/]+).*$/,'$1');\n  java.toast('久久小说：① 触发宝塔人机验证，正在获取验证码图片…');\n  var capUrl=root+'/get_btwaf_captcha_base64?captcha='+Date.now();\n  var capRaw=String(java.ajax(capUrl));\n  var cap='';\n  try{ var cj=JSON.parse(capRaw); if(cj&&cj.msg) cap=String(cj.msg); }catch(e){}\n  if(!cap||cap.indexOf('iVBOR')<0){ java.toast('久久小说：✗ 验证码图片获取失败，请稍后重试或切换线路'); return R; }\n  var code='';\n  try{ code=String(java.getVerificationCode('data:image/png;base64,'+cap)||'').replace(/^\\s+|\\s+$/g,''); }\n  catch(e){ java.toast('久久小说：✗ 验证码弹窗失败：'+e); return R; }\n  if(!code){ java.toast('久久小说：✗ 已取消验证码输入，本次搜索终止'); return R; }\n  java.toast('久久小说：② 已收到验证码，正在提交校验…');\n  var vUrl=root+'/Verification_auth_btwaf?captcha='+encodeURIComponent(code);\n  var vRaw=String(java.ajax(vUrl));\n  var ok=false;\n  try{ var vj=JSON.parse(vRaw); ok=!!(vj&&vj.status); }catch(e){ ok=vRaw.indexOf('true')>=0; }\n  if(!ok){ java.toast('久久小说：✗ 验证码错误或已过期，请重新搜索再试'); return R; }\n  java.toast('久久小说：③ 验证通过，正在继续本次搜索…');\n\n  // ★按 Host 分派重放接口：域名过盾后是「久久小说网」模板(GET /search/?searchkey=)，\n  //   裸IP是「笔趣阁」模板(POST /search7e.html)。验证成功后的放行窗口很短，必须立刻重放。\n  var isDomain=root.indexOf('ijjxs.org')>=0;\n  var kw='';\n  try{ kw=String(key||''); }catch(e){}\n  if(!kw){\n   try{\n    var rb0=R.raw().request().body();\n    if(rb0){ var B0=new Packages.okio.Buffer(); rb0.writeTo(B0);\n     var m=String(B0.readUtf8()).match(/searchkey=([^&]*)/); if(m) kw=decodeURIComponent(m[1]); }\n   }catch(e){}\n  }\n  var replayUrl='', replay='';\n  if(isDomain){\n   // 域名侧：搜索/发现/详情/正文全部用 GET 路径；这里只重放「本次被拦的请求」对应的域名侧等价 URL\n   var path=u.slice(root.length);\n   if(path.indexOf('/search')===0){\n    replayUrl=root+'/search/?searchkey='+encodeURIComponent(kw);\n   }else if(path.indexOf('/class')===0||path.indexOf('/rank')===0||path.indexOf('/quanben')===0){\n    replayUrl=root+path;   // 分类/排行/全本路径两侧同名\n   }else{\n    replayUrl=root+path;   // 详情/章节路径两侧同名\n   }\n   try{ replay=String(java.ajax(replayUrl)); }\n   catch(e){ java.toast('久久小说：✗ 过盾后重放失败：'+e); return R; }\n  }else{\n   // 裸IP侧：原样重放（method+body），但不回填全部原请求头，避免重复 Connection/Keep-Alive/Cookie\n   var req=R.raw().request();\n   var method=String(req.method()||'GET');\n   replayUrl=String(req.url());\n   var body='';\n   try{\n    var rb=req.body();\n    if(rb){ var B=new Packages.okio.Buffer(); rb.writeTo(B); body=String(B.readUtf8()); }\n   }catch(e){}\n   var opt={method:method};\n   if(body) opt.body=body;\n   try{ replay=String(java.ajax(replayUrl+','+JSON.stringify(opt))); }\n   catch(e){ java.toast('久久小说：✗ 过盾后重放失败：'+e); return R; }\n  }\n  if(replay.indexOf('宝塔防火墙')>=0||replay.indexOf('请输入验证码')>=0){\n   java.toast('久久小说：⚠ 验证已提交但页面仍被拦截，请在浏览器过盾后再搜，或切到裸IP线路');\n   return R;\n  }\n  if(replay.indexOf('404 Not Found')>=0){\n   java.toast('久久小说：⚠ 过盾成功但重放地址不存在（'+replayUrl+'），请切到裸IP线路');\n   return R;\n  }\n  try{\n   var NR=new Packages.io.legado.app.help.http.StrResponse(replayUrl,replay);\n   return NR;\n  }catch(e){\n   java.toast('久久小说：✗ 响应重建失败：'+e);\n   return R;\n  }\n }catch(e){\n  try{ java.toast('久久小说：✗ 人机验证处理异常：'+e); }catch(e2){}\n  return R;\n }\n})()", "loginUi": "[{\"name\": \"发布页\", \"type\": \"text\", \"viewName\": \"'发布页地址'\"}, {\"name\": \"应用\", \"type\": \"button\", \"action\": \"IJ_pub(java,result)\"}, {\"name\": \"🧭 一键获取网址路线\", \"type\": \"button\", \"action\": \"IJ_toast(java,'开始获取路线');IJ_fetch(java)\"}, {\"name\": \"⏱ 测试延时\", \"type\": \"button\", \"action\": \"IJ_toast(java,'开始测速');IJ_speed(java)\"}, {\"name\": \"🔍 检查登录状态\", \"type\": \"button\", \"action\": \"IJ_check(java)\"}, {\"name\": \"线路1\", \"type\": \"button\", \"action\": \"IJ_switch(java,1)\", \"viewName\": \"IJ_btn(source,1)\"}, {\"name\": \"线路2\", \"type\": \"button\", \"action\": \"IJ_switch(java,2)\", \"viewName\": \"IJ_btn(source,2)\"}, {\"name\": \"线路3\", \"type\": \"button\", \"action\": \"IJ_switch(java,3)\", \"viewName\": \"IJ_btn(source,3)\"}, {\"name\": \"线路4\", \"type\": \"button\", \"action\": \"IJ_switch(java,4)\", \"viewName\": \"IJ_btn(source,4)\"}, {\"name\": \"线路5\", \"type\": \"button\", \"action\": \"IJ_switch(java,5)\", \"viewName\": \"IJ_btn(source,5)\"}, {\"name\": \"线路6\", \"type\": \"button\", \"action\": \"IJ_switch(java,6)\", \"viewName\": \"IJ_btn(source,6)\"}, {\"name\": \"🌐 打开当前线路\", \"type\": \"button\", \"action\": \"java.startBrowser(IJ_line(java)+'/', '久久小说')\"}]", "loginUrl": "function login(){return 'ok';}\nfunction IJ_toast(jv,s){try{jv.toast(s)}catch(e){}try{jv.longToast(s)}catch(e){}}\nfunction IJ_gv(jv,k,d){\n var v='';try{v=String(jv.get(k)||'')}catch(e){}\n if(!v||v==='null'||v==='undefined')v=d||'';return v;\n}\nfunction IJ_line(jv){\n var v=IJ_gv(jv,'ijLine','');\n if(!v||v.indexOf('http')!==0)v='http://177.5.49.192';\n return v.replace(/\\/+$/,'');\n}\nfunction IJ_btn(jv,n){\n var list=IJ_gv(jv,'ijLines','').split('|'),i=Number(n)-1;\n if(i<0||i>=list.length||!list[i])return '━━ 线路'+n+' 未获取 ━━';\n var cur=IJ_line(jv),mark=(list[i]===cur)?'▶ ':'　 ';\n var d=IJ_gv(jv,'ijDelay'+n,'');if(d)mark+=d+' ';\n return mark+list[i].replace(/^https?:\\/\\//,'').replace(/\\/+$/,'');\n}\nfunction IJ_reUi(jv){try{jv.reLoginView(false)}catch(e){try{jv.reUiView(false)}catch(e2){}}}\nfunction IJ_apply(jv){\n var v=IJ_gv(jv,'ijPub','').replace(/^\\s+|\\s+$/g,'');\n if(!v)return '';\n if(v.indexOf('http')!==0)v='http://'+v;\n v=v.replace(/\\/+$/,'');\n var pool=IJ_gv(jv,'ijLines','');\n if(pool.split('|').indexOf(v)<0)pool=(pool?pool+'|':'')+v;\n jv.put('ijLines',pool);jv.put('ijLine',v);\n return v;\n}\nfunction IJ_fetch(jv){\n IJ_toast(jv,'① 正在从发布页/输入框获取网址路线…');\n var pub=IJ_gv(jv,'ijPub','').replace(/^\\s+|\\s+$/g,'');\n var found=[];\n if(pub){\n  if(pub.indexOf('http')!==0)pub='http://'+pub;\n  try{\n   var h=String(jv.ajax(pub));\n   IJ_toast(jv,'② 已打开发布页，正在解析页面中的网址…');\n   var re=/https?:\\/\\/[a-z0-9.\\-]+(?:\\/[^\\s\"'<>]*)?/gi,m;\n   while((m=re.exec(h))!==null){\n    var u=m[0].replace(/\\/+$/,'');\n    var host=u.replace(/^https?:\\/\\//,'').split('/')[0];\n    if(/^(www\\.)?(w3\\.org|cloudflare|cloudfront|google|baidu|alicdn|qq|weibo|cnzz|51\\.la|doubleclick|gstatic|bootstrapcdn|jquery|jsdelivr|unpkg)\\b/i.test(host))continue;\n    if(found.indexOf(u)<0)found.push(u);\n   }\n  }catch(e){IJ_toast(jv,'发布页读取失败：'+e);}\n }else{\n  IJ_toast(jv,'② 未填发布页，改用内置线路池：域名 + 裸IP直连');\n }\n var defs=['http://www.ijjxs.org','http://177.5.49.192'];\n for(var i=0;i<defs.length;i++)if(found.indexOf(defs[i])<0)found.push(defs[i]);\n jv.put('ijLines',found.join('|'));\n IJ_toast(jv,'③ 获取完成，共 '+found.length+' 条路线；点「⏱ 测试延时」测速');\n IJ_reUi(jv);\n return found.join('|');\n}\nfunction IJ_body(x){\n try{ if(x&&x.body) return String(x.body()); }catch(e){}\n return String(x||'');\n}\nfunction IJ_speed(jv){\n IJ_toast(jv,'① 开始测速（并发，跳过全局限速）…');\n var list=IJ_gv(jv,'ijLines','').split('|'),clean=[];\n for(var z=0;z<list.length;z++)if(list[z])clean.push(list[z].replace(/\\/+$/,''));\n if(!clean.length){IJ_toast(jv,'✗ 线路池为空，请先点「🧭 一键获取网址路线」');return '';}\n var urls=[];\n for(var i=0;i<clean.length;i++)urls.push(clean[i]+'/');\n var res=[],t0=Date.now(),done=false;\n try{\n  var rs=jv.ajaxAll(urls,true);\n  for(var k=0;k<clean.length;k++){\n   var rr=null;try{rr=rs.get(k)}catch(e){}\n   var s=IJ_body(rr);\n   var ok=s.length>5000&&s.indexOf('Exception')<0&&s.indexOf('宝塔防火墙')<0;\n   var ct='';\n   try{if(rr&&rr.callTime)ct=String(rr.callTime())+'ms';}catch(e){}\n   if(!ok)ct='超时/验证';\n   if(!ct)ct=ok?'可达':'超时/验证';\n   jv.put('ijDelay'+(k+1),ct);\n   res.push(clean[k]+'='+ct);\n  }\n  done=true;\n }catch(e){IJ_toast(jv,'并发测速不可用，改串行：'+e);}\n if(!done){\n  for(var q=0;q<clean.length;q++){\n   var st=Date.now(),ok2=false;\n   try{\n    var s2=String(jv.ajax(clean[q]+'/,'+JSON.stringify({timeout:8000})));\n    ok2=s2.length>5000&&s2.indexOf('宝塔防火墙')<0&&s2.indexOf('Exception')<0;\n   }catch(e2){}\n   var ct2=ok2?(Date.now()-st)+'ms':'超时/验证';\n   jv.put('ijDelay'+(q+1),ct2);res.push(clean[q]+'='+ct2);\n  }\n }\n IJ_toast(jv,'② 测速完成（总 '+(Date.now()-t0)+'ms）：'+res.join(' , ')+'；点各线路按钮即时切换');\n IJ_reUi(jv);\n return res.join('|');\n}\nfunction IJ_switch(jv,n){\n IJ_toast(jv,'① 正在切换到线路 '+n+' …');\n var list=IJ_gv(jv,'ijLines','').split('|'),i=Number(n)-1;\n if(i<0||i>=list.length||!list[i]){IJ_toast(jv,'✗ 线路 '+n+' 不存在，请先获取路线');return '';}\n var v=list[i].replace(/\\/+$/,'');\n jv.put('ijLine',v);\n IJ_toast(jv,'② 已切换：'+v+'（下一次搜索/发现/目录即时生效）');\n IJ_reUi(jv);\n return v;\n}\nfunction IJ_check(jv){\n IJ_toast(jv,'① 正在检查线路连通性与登录状态…');\n var base=IJ_line(jv),s='';\n try{s=String(jv.ajax(base+'/'))}catch(e){s='ERR '+e;}\n var waf=s.indexOf('宝塔防火墙')>=0||s.indexOf('请输入验证码')>=0;\n var real=s.indexOf('笔趣阁')>=0&&s.length>5000;\n var logged=s.indexOf('退出登录')>=0||s.indexOf('ss_username')>=0;\n var tip=waf?'⚠ 当前线路被宝塔人机验证拦截（建议切到裸IP线路或浏览器过盾）':(real?'✓ 线路连通，返回真实页面':'✗ 线路异常：'+s.slice(0,60));\n IJ_toast(jv,'② '+tip+' ｜ 账号登录：'+(logged?'已登录':'未登录（本站搜索/阅读/正文无需登录，书架功能才需要账号）'));\n try{jv.put('ijStatus',tip)}catch(e){}\n IJ_reUi(jv);\n return tip;\n}\nfunction IJ_pub(jv,r){\n var v='';\n try{v=String(r.get('发布页')||'')}catch(e){}\n try{if(!v)v=String(r['发布页']||'')}catch(e){}\n if(!v){IJ_toast(jv,'✗ 请先填发布页地址');return '';}\n jv.put('ijPub',v);\n var a=IJ_apply(jv);\n IJ_toast(jv,'③ 已应用发布页网址：'+a+'；点「🧭 一键获取网址路线」拉取全部路线');\n IJ_reUi(jv);\n return a;\n}", "respondTime": 180000, "ruleBookInfo": {"author": ".info2 h3 a@text||[property=\"og:novel:author\"]@content", "coverUrl": ".info1 img@src||[property=\"og:image\"]@content", "intro": ".info2 div p@text||[property=\"og:description\"]@content", "kind": ".info3 p.0@text||[property~=category|status|update_time]@content", "lastChapter": ".info3 p.2 a@text||[property=\"og:novel:lastest_chapter_name\"]@content", "name": ".info2 h1@text||[property=\"og:novel:book_name\"]@content"}, "ruleContent": {"content": ".content-body@p@html||#booktxt@p@html||#booktxt@html", "nextContentUrl": "#next_url@href||text.下一页@href", "replaceRegex": "##本章未完[^<]*|<center>[\\s\\S]*?</center>|最近转码严重.*退出阅读模式。谢谢|<script[\\s\\S]*?</script>"}, "ruleExplore": {"author": ".btm@text||.book_author a@text||td.2@a@text", "bookList": ".item||.media||#bookcon tr:gt(0)", "bookUrl": ".image@a.0@href||h4.book-title a@href||td.1@a@href", "coverUrl": "img@data-original||img@src", "intro": "dd@text||p.book-intro-index@text||td.3@text", "kind": "class.blue.visible-xs@text||td.4@text", "name": "dt@a@text||h4.book-title a@text||td.1@a@text", "wordCount": "class.orange.visible-xs@text"}, "ruleSearch": {"author": ".btm@text||td.2@a@text", "bookList": ".item||#bookcon tr:gt(0)", "bookUrl": ".image@a.0@href||a.0@href||td.1@a@href", "coverUrl": "img@data-original||img@src", "intro": "dd@text||td.3@text", "kind": "class.blue.visible-xs@text||td.4@text", "name": "dt@a@text||td.1@a@text", "wordCount": "class.orange.visible-xs@text"}, "ruleToc": {"chapterList": "@js:\n(function(){\n var raw=String(result||'');\n var out=[];\n try{\n  var doc=Packages.org.jsoup.Jsoup.parse(raw);\n  var cand=null;\n  // A) 裸IP「笔趣阁」模板：多个 ul.list-charts，选章节链接最多的段（全部章节段）\n  var uls=doc.select('ul.list-charts');\n  var best=0;\n  for(var i=0;i<uls.size();i++){\n   var n=uls.get(i).select('a[href*=.html]').size();\n   if(n>best){best=n;cand=uls.get(i);}\n  }\n  // B) 域名「久久小说网」模板：单个 dl，dt[0]=最新章节(倒序9) / dt[1]=全部章节目录(正序)\n  //    必须从「全部章节目录」dt 之后开始取，避免最新章节排到最前；末尾还会重复最新9条 → 按 href 去重\n  if(!cand || best<20){\n   var dls=doc.select('dl');\n   for(var d=0;d<dls.size();d++){\n    var dl=dls.get(d);\n    var dts=dl.select('dt');\n    var anchor=null;\n    for(var t=0;t<dts.size();t++){\n     if(dts.get(t).text().indexOf('全部章节目录')>=0){anchor=dts.get(t);break;}\n    }\n    if(anchor){\n     var kids=dl.children();\n     var start=kids.indexOf(anchor);\n     // 收集 anchor 之后所有带数字章节 href 的 a（含 dt[2] 之后的 hc 段，仍正序）\n     var tmp=[];\n     for(var q=start+1;q<kids.size();q++){\n      var e=kids.get(q);\n      var as=e.tagName()==='a'?[e]:e.select('a');\n      for(var z=0;z<as.length;z++){\n       var a=as[z],h=a.attr('href')||'',tx=a.text()||'';\n       if(/\\/\\d+_\\d+\\/\\d+\\.html/.test(h))tmp.push(JSON.stringify({n:tx,u:h}));\n      }\n     }\n     if(tmp.length>best){best=tmp.length;cand={_items:tmp};}\n    }\n   }\n  }\n  if(cand){\n   var items=[];\n   if(cand._items){ items=cand._items; }\n   else{\n    var as2=cand.select('a');\n    for(var j=0;j<as2.size();j++){\n     var a2=as2.get(j),h2=a2.attr('href')||'',t2=a2.text()||'';\n     if(!/\\/\\d+_\\d+\\/\\d+\\.html/.test(h2))continue;\n     items.push(JSON.stringify({n:t2,u:h2}));\n    }\n   }\n   // 按 href 去重（保先出现）：域名侧末尾会重复最新9条，裸IP侧各段互不重叠\n   var seen={};\n   for(var k=0;k<items.length;k++){\n    var o=JSON.parse(items[k]);\n    if(seen[o.u])continue;seen[o.u]=1;\n    out.push(items[k]);\n   }\n  }\n }catch(e){}\n var list=new Packages.java.util.ArrayList();\n for(var m=0;m<out.length;m++)list.add(out[m]);\n return list;\n})()", "chapterName": "$.n", "chapterUrl": "$.u"}, "searchUrl": "{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http://177.5.49.192';L=L.replace(/\\/+$/,'');try{var h=String(java.ajax(L+'/'));var m=h.match(/action=['\"](\\/search[^'\"]*\\.html)['\"]/);if(m)return L+m[1]}catch(e){}return L+'/search7e.html'})()}},{\"method\":\"POST\",\"body\":\"searchkey={{key}}\",\"headers\":{\"Content-Type\":\"application/x-www-form-urlencoded\",\"Referer\":\"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http://177.5.49.192';return L.replace(/\\/+$/,'')})()}}/\"},\"js\":\"{{(function(){var L='';try{L=String(source.get('ijLine')||'')}catch(e){}if(!L||L==='null'||L==='undefined'||L.indexOf('http')!==0)L='http://177.5.49.192';return \"try{cookie.removeCookie('\"+L.replace(/\\/+$/,'')+\"/')}catch(e){}\"})()}}\"}", "weight": 0},{"bookSourceComment": "KL-Manga(klmanga.autos) 原版日文漫画 · 书源 v1.0.2 (2026-11-08)\n· v1.0.2 变更：\n· 目录已自动反转：第1話 → 最新話；搜索无分页（站点限制）。\n· 正文走站点 admin-ajax decode_images 接口（免Cookie，每批10图自动翻页），加载失败可重试整章。\n· 图片直链有分钟级时效：打开章节后请及时阅读/缓存；若个别页过期，重新进入该章节即可刷新。\n· 图片为 p1–p5.pubg-img.si:183 镜像轮询；该CDN按单连接限速(~12KB/s)，数MB大图加载慢属站点本身特性。\n· 图片证书链不完整，由系统 AIA 自动补链（Android 9+ 正常）；\n· 仅供个人学习备份，请于24小时内删除并支持正版。", "bookSourceGroup": "漫画;Raw;日文", "bookSourceName": "KL-Manga", "bookSourceType": 2, "bookSourceUrl": "https://klmanga.autos", "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "exploreUrl": "全部漫画::/manga-raw/page/{{page}}/\nアクション::/manga-genre/%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3/page/{{page}}/\nファンタジー::/manga-genre/%E3%83%95%E3%82%A1%E3%83%B3%E3%82%BF%E3%82%B8%E3%83%BC/page/{{page}}/\n恋愛::/manga-genre/%E6%81%8B%E6%84%9B/page/{{page}}/\nコメディ::/manga-genre/%E3%82%B3%E3%83%A1%E3%83%87%E3%82%A3/page/{{page}}/\n異世界・転生::/manga-genre/%E7%95%B0%E4%B8%96%E7%95%8C%83%E3%83%BB%E8%BB%A2%E7%94%9F/page/{{page}}/\n少年マンガ::/manga-genre/%E5%B0%91%E5%B9%B4%E3%83%9E%E3%83%B3%E3%82%AC/page/{{page}}/", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36\",\"Accept-Language\":\"ja,en;q=0.8\",\"Referer\":\"https://klmanga.autos/\"}", "lastUpdateTime": "1794083957055", "respondTime": 180000, "ruleBookInfo": {"coverUrl": "class.main-thumb@tag.img@src", "intro": "class.content-text@textNodes", "kind": "class.z-single-mg@class.genres.0@tag.a@text", "lastChapter": "class.chapter-box@tag.h4.0@tag.a@tag.span.0@text##^.*【|】$##", "name": "class.z-single-mg@tag.h1@text##\\s*\\(Raw[^)]*\\)\\s*$##"}, "ruleContent": {"content": "<js>(function(){\n  var html=String(result);\n  var m=html.match(/reading_chapter\\s*[:=]\\s*\"?(\\d+)\"?/);\n  if(!m)return \"\";\n  var chId=m[1];\n  var root=(String(baseUrl).match(/^https?:\\/\\/[^\\/]+/)||[\"https://klmanga.autos\"])[0];\n  var head={\n    \"Content-Type\":\"application/x-www-form-urlencoded; charset=UTF-8\",\n    \"X-Requested-With\":\"XMLHttpRequest\",\n    \"User-Agent\":\"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36\",\n    \"Referer\":String(baseUrl),\n    \"Origin\":root\n  };\n  function doPost(body){\n    var opt=root+\"/wp-admin/admin-ajax.php\"+',{\"method\":\"POST\",\"body\":\"'+body+'\",\"headers\":'+JSON.stringify(head)+\"}\";\n    try{var s=java.ajax(opt);if(s)return String(s);}catch(e){}\n    try{\n      if(java.post){\n        var r=java.post(root+\"/wp-admin/admin-ajax.php\",body,head);\n        if(r){\n          if(typeof r===\"string\")return r;\n          if(typeof r.body===\"function\")return String(r.body());\n        }\n      }\n    }catch(e){}\n    return null;\n  }\n  var urls=[],idx=0,guard=0;\n  while(guard++<300){\n    var body=\"action=z_do_ajax&_action=decode_images&reading_chapter=\"+chId+\"&img_index=\"+idx+\"&content=\";\n    var txt=null;\n    for(var t=0;t<3&&txt===null;t++){txt=doPost(body);}\n    if(txt===null)break;\n    var j=null;try{j=JSON.parse(txt);}catch(e){}\n    if(!j)break;\n    var mes=String(j.mes||\"\");\n    var re=/<img\\b[^>]*?\\bsrc\\s*=\\s*[\"']([^\"']+)[\"']/gi,mm,got=0;\n    while((mm=re.exec(mes))){\n      var u=mm[1].replace(/\\\\\\//g,\"/\").trim().replace(/\\s+/g,\"%20\");\n      if(/^https?:\\/\\//i.test(u)&&urls.indexOf(u)<0){\n        got++;\n        u=u.replace(/^(https?):\\/\\/p[1-5](\\.pubg-img\\.si(?::\\d+)?)(\\/.*)$/i,\n          function(_,pr,dm,pt){return pr+\"://p\"+((urls.length%5)+1)+dm+pt;});\n        urls.push(u);\n      }\n    }\n    if(got===0)break;\n    var nx=parseInt(j.img_index,10);\n    if(!(nx>idx))nx=idx+got;\n    idx=nx;\n  }\n  return urls.join(\"\\n\");\n})()</js>\n", "imageStyle": "FULL"}, "ruleExplore": {"bookList": "class.entry", "bookUrl": "tag.h2@tag.a@href", "coverUrl": "class.thumb@tag.img@src", "kind": "class.genres@tag.a@text", "lastChapter": "class.thumb@tag.a.1@text", "name": "tag.h2@tag.a@text##\\s*\\(Raw[^)]*\\)\\s*$##"}, "ruleSearch": {"bookList": "class.entry", "bookUrl": "tag.h2@tag.a@href", "checkKeyWord": "ワンピース", "coverUrl": "class.thumb@tag.img@src", "kind": "class.genres@tag.a@text", "lastChapter": "class.thumb@tag.a.1@text", "name": "tag.h2@tag.a@text##\\s*\\(Raw[^)]*\\)\\s*$##"}, "ruleToc": {"chapterList": "<js>(function(){\n  var out=[],re=/<h4>\\s*<a[^>]*href=\"([^\"]*\\/chapter-\\d+(?:-\\d+)?\\/)\"[^>]*>\\s*<span>([^<]*)<\\/span>/g,m;\n  while((m=re.exec(String(result)))){\n    var name=(m[2]||\"\").replace(/\\s*\\(Raw[^)]*\\)\\s*/,\"\").replace(/\\s+/g,\" \").trim();\n    var bn=(name.match(/【(.+?)】/)||[])[1];\n    if(bn)name=bn;\n    if(!name)name=\"第\"+(out.length+1)+\"話\";\n    out.push('<a href=\"'+m[1]+'\">'+name+'</a>');\n  }\n  out.reverse();\n  return out;\n})()</js>", "chapterName": "tag.a@text", "chapterUrl": "tag.a@href"}, "searchUrl": "/?s={{key}}", "weight": 0},{"bookSourceComment": "修复发现页", "bookSourceName": "ESJ Zone", "bookSourceType": 0, "bookSourceUrl": "https://www.esjzone.one", "bookUrlPattern": "https?://www.esjzone.one/detail/.*", "customOrder": 2, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "@js:\nvar result = [];\nfunction header(t) {\n  result.push({'title': '>> ' + t + ' <<', 'url': '',\n    'style': {'layout_flexGrow': 1, 'layout_flexBasisPercent': 1}});\n}\nfunction item(t, u, basis) {\n  result.push({'title': t, 'url': u,\n    'style': {'layout_flexGrow': 1, 'layout_flexBasisPercent': basis || 0.25}});\n}\nheader('提示: 未登录时各分类显示同一原创列表, 点书源【登录】(网页)后自动区分');\nheader('轻小说分类 · 最新更新');\nitem('全部', '/list-01/{{page}}.html');\nitem('日轻', '/list-11/{{page}}.html');\nitem('原创', '/list-21/{{page}}.html');\nitem('韩轻', '/list-31/{{page}}.html');\nheader('全部 · 8种排序');\nitem('最新上架', '/list-02/{{page}}.html');\nitem('最高评分', '/list-03/{{page}}.html');\nitem('最多观看', '/list-04/{{page}}.html');\nitem('最多文章', '/list-05/{{page}}.html');\nitem('最多讨论', '/list-06/{{page}}.html');\nitem('最多收藏', '/list-07/{{page}}.html');\nitem('最多字数', '/list-08/{{page}}.html');\nheader('日轻 · 精选');\nitem('最高评分', '/list-13/{{page}}.html');\nitem('最多收藏', '/list-17/{{page}}.html');\nheader('原创 · 精选');\nitem('最高评分', '/list-23/{{page}}.html');\nitem('最多收藏', '/list-27/{{page}}.html');\nheader('韩轻 · 精选');\nitem('最高评分', '/list-33/{{page}}.html');\nitem('最多收藏', '/list-37/{{page}}.html');\nheader('一週更新 · 需登录');\nitem('一週更新(单页870+本)', '/update/', 1);\nheader('个人中心 · 需登录');\nitem('我的收藏', '/my/favorite', 0.5);\nitem('观看记录', '/my/view', 0.5);\nJSON.stringify(result)", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\", \"Referer\": \"https://www.esjzone.one/\"}", "lastUpdateTime": "1794083825278", "loginUrl": "https://www.esjzone.one/my/login", "respondTime": 180000, "ruleBookInfo": {"author": "class.list-unstyled mb-2 book-detail@tag.li.1@tag.a@text\n@js:\njava.t2s(result)", "canReName": "true", "coverUrl": "@css:div.col-md-3 > div > a > img@src", "intro": "{{@@section.widget-tags@a.tag@text##(^|[\\n])##🏷️}}\n{{'&lrm;'}}\n{{@@div.description@html}}\n@js:\njava.t2s(result)", "kind": "@js:\nvar r = [];\nvar t = java.getString('class.list-unstyled mb-2 book-detail@tag.li.0@text');\nvar d = java.getString('class.list-unstyled mb-2 book-detail@tag.li.2@text');\nvar e = java.getString('@css:.book-detail label:has(.icon-eye)@text');\nvar h = java.getString('@css:.book-detail label:has(.icon-heart)@text');\nif (t) r.push(String(t).replace(/^.+?:\\s*/, ''));\nif (e) r.push('关注:' + String(e).trim());\nif (h) r.push('喜欢:' + String(h).trim());\nif (d) r.push('更新:' + String(d).replace(/^.+?:\\s*/, ''));\nr.join(',')", "lastChapter": "@css:div[id = chapterList] >a:last-child@text\n@js:\njava.t2s(result)", "name": "@css:div.col-md-9.book-detail > h2@text\n@js:\njava.t2s(result)", "wordCount": "@css: .book-detail label:has(.icon-file-text)@text##,##"}, "ruleContent": {"content": "@css:div.forum-content.mt-3, div.d_post_content@all\n@js:\njava.t2s(result)"}, "ruleExplore": {"author": "class.card-author@tag.a@text\n@js:\njava.t2s(result)", "bookList": "div.col-lg-3.col-md-4.col-sm-3.col-xs-6, div.product-item", "bookUrl": "@css:.card-title a, .product-title a@href", "coverUrl": "class.main-img@class.lazyload@data-src\n@js:\nresult.match(\"empty\") ? \"\" : result", "intro": "@css:.card-ep, .book-ep@text\n@js:\njava.t2s(result)", "kind": "@js:\nvar r = [];\nvar b = java.getString('@css:.product-badge@text');\nvar e = java.getString('@css:.column:has(.icon-eye)@text');\nvar h = java.getString('@css:.column:has(.icon-heart)@text');\nvar f = java.getString('@css:.column:has(.icon-feather)@text');\nvar m = java.getString('@css:.column:has(.icon-message-square)@text');\nif (b) r.push(String(b).trim());\nif (e) r.push('关注:' + String(e).trim());\nif (h) r.push('喜欢:' + String(h).trim());\nif (f) r.push('羽毛:' + String(f).trim());\nif (m) r.push('评论:' + String(m).trim());\nr.join(',')", "lastChapter": "@css:.card-ep a, .book-ep a@text\n@js:\njava.t2s(result)", "name": "@css:.card-title a, .product-title@text\n@js:\njava.t2s(result)", "wordCount": "@css: .column:has(.icon-file-text)@text##,##"}, "ruleSearch": {"author": "class.card-author@tag.a@text\n@js:\njava.t2s(result)", "bookList": "div.col-lg-3.col-md-4.col-sm-3.col-xs-6, div.product-item", "bookUrl": "@css:.card-title a, .product-title a@href", "coverUrl": "class.main-img@class.lazyload@data-src\n@js:\nresult.match(\"empty\") ? \"\" : result", "intro": "@css:.card-ep, .book-ep@text\n@js:\njava.t2s(result)", "kind": "@js:\nvar r = [];\nvar b = java.getString('@css:.product-badge@text');\nvar e = java.getString('@css:.column:has(.icon-eye)@text');\nvar h = java.getString('@css:.column:has(.icon-heart)@text');\nvar f = java.getString('@css:.column:has(.icon-feather)@text');\nvar m = java.getString('@css:.column:has(.icon-message-square)@text');\nif (b) r.push(String(b).trim());\nif (e) r.push('关注:' + String(e).trim());\nif (h) r.push('喜欢:' + String(h).trim());\nif (f) r.push('羽毛:' + String(f).trim());\nif (m) r.push('评论:' + String(m).trim());\nr.join(',')", "lastChapter": "@css:.card-ep a, .book-ep a@text\n@js:\njava.t2s(result)", "name": "@css:.card-title a, .product-title@text\n@js:\njava.t2s(result)", "wordCount": "@css: .column:has(.icon-file-text)@text##,##"}, "ruleToc": {"chapterList": "#chapterList@a[data-title], p.non, summary", "chapterName": "text\n@js:\njava.t2s(result)", "chapterUrl": "href", "isVolume": "p.non@text||summary@text"}, "searchUrl": "https://www.esjzone.one/tags/{{key}}", "weight": 0},{"bookSourceComment": "2026.11.04 基于 https://github.com/ch6vip/fqapp 书旗(shuqi)上游协议制作的 Legado 纯 APP 接口书源。\n\n【协议】纯JS复现官方 App 加密口：2048字节 keystream 二进制 XOR + base64（data 与 x-sq-public 各自从 keystream[0] 起算）+ MD5 签名（按键名升序拼 k=v& + skey 盐）+ enc18 派生 + 36键 x-sq-public（体内 platform=an / 头内 platform=2）。黄金向量与 Rust 单测逐一比对通过。\n\n【链路】搜索=render/search/native_v3；详情=reader/titlepage；目录=H5 /chapter?bid= 全量真章名，H5缺失(部分新书返回55字节location.replace)时降级 content.shuqireader.com/openapi/book/chapterlist（bscpubKey+MD5签名，卷数组→真章名+chapterId）；正文=免签 CDN JSONP 明文（2host×2flag×2scheme，VIP章亦可），失败降级 chapterinfo ROT13+base64；发现=H5 19个榜单 + 书库分类（服务端渲染，支持分页）。\n【卷名】仅当站点本身分卷(≥2卷且有卷名)时，在每卷第一章名前标注一次【卷名】；单卷/无卷名不加，章名保持原样。\n\n【UA】必须 okhttp/3.12.13：实测 www.shuqi.com 对浏览器 UA 一律返回 1120 字节 403 拦截页（伪装成正常 HTML），headers 键名必须大写 'User-Agent'。\n\n【登录】游客态完全可用，无需登录；登录界面仅提供状态检查/线路测速/切换/重置设备身份。\n【限频】concurrentRate=1/3000 且搜索规则内置 3 秒最小间隔，避免触发风控。\n【兼容】LegadoTeam 官方版 + legado-E（全纯JS，不依赖 BouncyCastle/android.util.Base64）。\n【注意】目录 H5 页约 1.2MB/本；搜索接口不支持分页（page 参数是模块名常量）。", "bookSourceGroup": "书旗,小说,APP,AI", "bookSourceName": "🌙 书旗小说(APP接口)", "bookSourceType": 0, "bookSourceUrl": "https://www.shuqi.com##书旗APP", "bookUrlPattern": "https?://(?:www\\.shuqi\\.com|shuqi\\.com|www\\.shuqireader\\.com|c1\\.shuqireader\\.com|c2\\.shuqireader\\.com)/(?:book/[0-9]+\\.html|reader\\?bid=[0-9]+(?:&cid=[0-9]+)?|httpserver/filecache/get_book_content_[0-9]+_[0-9]+_[0-9]+_0_0\\.html)", "concurrentRate": "1/3000", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\n(function(){\n var B='';try{B=String(source.get('sqWeb')||'')}catch(e){};if(!B||B==='null')B='https://www.shuqi.com';B=B.replace(/\\/$/,'');\n var rows=[];\n function head(t){rows.push({title:t,url:'',style:{layout_flexBasisPercent:1,layout_wrapBefore:true,layout_justifySelf:'flex_start'}});}\n function add(t,u){rows.push({title:t,url:u+'&page={{page}}',style:{layout_flexGrow:1}});}\n head('📊 男频榜单');\n add('男频点击榜',B+'?rank=boyClick');add('男频收藏榜',B+'?rank=boyStore');\n add('男频订阅榜',B+'?rank=boyOrder');add('男频人气榜',B+'?rank=boyhot');\nadd('男频完结榜',B+'?rank=boyEnd');\n add('男频更新榜',B+'?rank=boyUpdate');\n head('💕 女频榜单');\n add('女频点击榜',B+'?rank=girlClick');add('女频收藏榜',B+'?rank=girlStore');\n add('女频订阅榜',B+'?rank=girlOrder');add('女频人气榜',B+'?rank=girlhot');\nadd('女频完结榜',B+'?rank=girlEnd');\n add('女频更新榜',B+'?rank=girlUpdate');\n head('🏆 全站榜单');\n add('全站完结榜',B+'?rank=allEnd');\n add('全站字数榜',B+'?rank=allWords');add('全站点击榜',B+'?rank=allClick');\n add('全站收藏榜',B+'?rank=allStore');add('全站订阅榜',B+'?rank=allOrder');\n head('📚 书库·频道');\n add('全部书库',B+'?sqs=1');add('男频书库',B+'?sz=1');add('女频书库',B+'?sz=2');\n head('📚 书库·分类');\n add('都市',B+'?fc=7');add('社会生活',B+'?fc=15');add('玄幻',B+'?fc=29');\n add('科幻',B+'?fc=34%2C102');add('悬疑',B+'?fc=41%2C108');add('历史',B+'?fc=45');\n add('体育',B+'?fc=54');add('武侠',B+'?fc=58');add('游戏',B+'?fc=63');\n add('仙侠',B+'?fc=67%2C98');add('同人',B+'?fc=71');add('现代言情',B+'?fc=76');\n add('古代言情',B+'?fc=86');add('玄幻言情',B+'?fc=94');add('幻想言情',B+'?fc=122');\n add('浪漫青春',B+'?fc=127');\n head('📚 书库·状态/字数/更新');\n add('连载',B+'?st=1');add('完结',B+'?st=2');\n add('30万以下',B+'?wd=11');add('30~50万',B+'?wd=12');add('50~100万',B+'?wd=13');\n add('100~200万',B+'?wd=14');add('200万以上',B+'?wd=15');\n add('3天内更新',B+'?tm=3');add('7天内更新',B+'?tm=7');\n add('半月内更新',B+'?tm=15');add('一月内更新',B+'?tm=30');\n return JSON.stringify(rows);\n})()", "header": "{\"User-Agent\": \"okhttp/3.12.13\"}", "jsLib": "var SQ_KSB64 = \"QAwnzM9laLzStxk3jlPL517JAu73dQemPSrdOnAdiisooFf/leYyXjc+8Az7oJ94j+pdGzsxGh6jmOs+f7HMz+6qEhMo/nxkrOvr72JIyqouvb0EMsAPWAZvS14X6TM3f9ulxMC4BOBxHBE6MF5rflH9KXEAQUjsww4Ef5//yCuiqPjQyNbKWZAy6mMdLvzXWa8wl2V1t4nUDJgJbaxBDXNPpu1K6M6yxHC9QbDXzhyOcn6R2ZXAkETdxZP28P4qjKDMNNg4tjxlWV5r+iMVveR/WlY6VdLMXRHHceteh9yu8KKSJ60WKb74Jp2a+ZSbT0sxbJ1Pm3/0GPGdLP4/NJTaZ/Z32U8S2JlaUBq6XHB5dwDvmChP86fHFvctkkY2XWRAZYKvAyscO3BX40v/fAtgfBKbwZZQn4PU/3C+svDdLITilbO8wEkIedR/2xtz4BZDgylGN5B33zAZCbIvOhL6u8YxrRhIPEIVwK4kS+/GxlHOg7ycGbMxx6WSdF4XtlKTk5cbam3+kcmUe4OIwCwYYq6IKaoO0O93AgL0O7bI4/oGlRqvns/1AhVP5Lv8qPELw5vCWe7ZAfqPUzFf3V6kRQMSk9gM/MicDcwrO9+Jp68P0MrC5QvUAS/QMr8vkL96UIj3qID17DFtf+v5JMCm37/45/rhw4yjccpMlYMD1xtl1VvByAE3IXTQJi7I0T2eHGwldAGEnmQxgjxCTy3MRJNqsodjx3y1o+4sLLRODqdbmgKGalsI7VTCgdn7D7gdWUKHWbM4ueFqB1zOoSvjmpi65MINtk2OkJwQUgXF8CEsbV57v382ri2IuJ2d3owaKVHB9x8X12L4tjxasn9EqKgStA9dwhQ7dhlFDKnHJ3F7nwKB/lnzsbgC0zH/fcqLPA8Q34aAb87IQz/F65M0g1oS3JJ9goAOJFDWSjWxZ5SrtrKm5zs9IHoJ18GAzQBZ7gDYm3oaFIHOAZiYISEPOWDqdDWYHGm2Mb7stADWdJ7c961sipFrosEu5HEoSDS2IhiADJbtRsYl6yhL+xyMvVICLtynr9hxwnu7dpINxyfCbwvQEI2nz6QBeUlfvDJgf9bOaExdQ3Hcjj/FMabfizUQEeYFSr40iW0ciIyjEwSddunLKtRHfQXULpVTGL6Gy6kFKLW9CEgQxNqNENE1SZWBq55f3gCLnac5tqiyqOFzycm879YE0u7ZuCB7usVEpIizT8xdg2VKv5kkfwX4un4T9xvhb0NG1GMVvd0WIw3Tidb7NjzPqdpMfdhZEMJfUmU/HNUugH8BQw1KakZwqodYjcCwm1WDOqnnug42yFvAy8Ih7q40b6cmjWYYLrvm7NW9dNDdVpGnNvYmgZkyvAi/fMrGVul+FGOkz3kchtqFyuDQM0a0cI43PbZxUDQU1jttZUB/3j5845ibFl4/gL2A0/6dwz3AraAlTRmqQrAoqF1h2oXY8IKF5CgaCjGcOcwrlCIkEebTfAvgrbccoof/IFNUFEZ9fcJ0wT6iZ9eSND6uJgg8pcbwHoy4pc2dft8tkN3ksHMRM3XFgScYQQRXVGuh14nbG6CH4piIC07lzb3ItgfIrQI97+9uLvWHrex7FnwDJOmQQIuUjdlrcfBdvMh0yVsESZQAzuDzqFiSBaSECqmmuSPifxcYpQqOLsXwheX2el1ojv5TsyUVvB3avEtyBADAa/V+XdNBqAwnbOftakdTto9pR52FxRVmHFzJzF0hGuMOz2XqIFvqNsbTPdWfdjT1riKyD1bxRboS356818/uN3EL6hqw4opXBLst6IoxALq0wB3h0k9Gt5TYJ8DgzmolSCeWRMVtgr8bwqhsIMDlncPcbJOhb24DPL5yosQitCt4ifkweGcDhIQN7Q1ilQLAmbV7KFQYyjmhbVwQnyemcaUYINNYPPyFoSaYwbo5XPKVwo5QubpYb9HMMM5d7EjqC3jrK6AzZ0/vfILWwHvuYDpgAHSuY+TnJdGvmvOIlURYvxC6NQZObwRX2fcsUd0nfvG9IS4W5sSg1mE+PR7FQoLKGU1dEFEFyScx0r0FopHLcDWRPLRZPUjA0wUE4Migk8HgXRC8lD09rZ1SmBtZNyaAc62GO8NcrHWF2u0viNMA7RHDlwkUhf/pgnvqFxRI6UuWY877Keoi9oaDbBcGpLUXiNK9ixNZk2UPvWYMfYNFg2yemBg0tT6Pkj7EwHKDkHz/I+uYlfak1MirdQJGckI9bzfN57L2j+G4ocuImVwC/StMhR2gRwdDo7Z7o3MUOmoy5XQWPehFfpDAoPpnwPupCM52r4QhLWYntvc/uhN9YSvthcWQdDOxKbI2GtFBzrq8X7SoGandqr1ijv4WFMrvbygo57GVN56Ka5NvBf3wIxrzYQpOSbwVczRh/Sztmj9r3NtKCrOY8/pqzX1nNThujmIW3SFJBbxEa1I0N6ZrORMjEe8afJcG33vcifgAbdJOan9Me9uIiDzBN9kS+iR29VtkIMWRNBSWI/eg+PZJAzoSYgtQmpYAscnB7OeEh2OCSegTjuXn9KKBiHKMiFldmhwDdtofsD4qL25FafrgJom76jSH0vAJ17QotQ1t0URNtj8AR68Bty9EBfnUJ0MSW3Rqjg/CjITS22JB/UzrquNzIAyAyv305DW3yTaZ1tzTpe6eJyLAVMAyxtcy3iWgiOFBvDl2R0cLICeAIH9aKR6+h1KfJ8JNgNKcH/DvZXcBL58=\";\nvar SQ_SKEY = \"467694bd8912441cae8498b3c7e4282c\";\nvar SQ_SQSV = \"1.0\";\nvar SQ_UID = \"8158804976\";\nvar SQ_CIUID = \"8000000\";\nvar SQ_HOST = \"https://ocean.shuqireader.com\";\nvar SQ_UA = \"okhttp/3.12.13\";\nvar SQ_H5UA = \"okhttp/3.12.13\";\nvar SQ_B64C = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nvar SQ_PUB = [\n[\"soft_id\",\"1\"],[\"user_id\",SQ_UID],[\"userId\",SQ_UID],[\"ver\",\"261013\"],\n[\"subVer\",\"sqrelease\"],[\"appVer\",\"12.7.0.268\"],[\"theme\",\"day\"],[\"platform\",\"an\"],\n[\"placeid\",\"1069\"],[\"sdk\",\"32\"],[\"cpu\",\"x86_64\"],[\"pkg_cpu\",\"arm64-v8a\"],[\"wh\",\"900x1600\"],\n[\"msv\",\"3\"],[\"vc\",\"5d73\"],[\"mod\",\"BVL-AN16\"],[\"manufacturer\",\"HONOR\"],[\"brand\",\"HONOR\"],\n[\"net_type\",\"wifi\"],[\"net_type_str\",\"wifi\"],[\"first_placeid\",\"src1069\"],[\"aak\",\"a3a840\"],\n[\"utype\",\"pre_vip\"],[\"net\",\"4\"],[\"net_env\",\"4\"],[\"permissionType\",\"0\"],[\"personalized\",\"1\"],\n[\"contentRecom\",\"1\"],[\"scene_code\",\"\"],[\"rom\",\"12\"],[\"sqUniqDeviceId\",\"\"],[\"utdid\",\"\"],\n[\"sn\",\"\"],[\"umidtoken\",\"\"],[\"otdd\",\"\"]];\nvar SQ_ORDER = [\"soft_id\",\"user_id\",\"userId\",\"ver\",\"subVer\",\"appVer\",\"theme\",\"platform\",\"placeid\",\n\"sdk\",\"cpu\",\"pkg_cpu\",\"wh\",\"msv\",\"enc\",\"vc\",\"mod\",\"manufacturer\",\"brand\",\"net_type\",\"net_type_str\",\n\"first_placeid\",\"aak\",\"utype\",\"net\",\"net_env\",\"permissionType\",\"personalized\",\"contentRecom\",\n\"scene_code\",\"rom\",\"sqUniqDeviceId\",\"utdid\",\"sn\",\"umidtoken\",\"otdd\"];\nvar SQ_NOSIGN = [\"sign\",\"key\",\"_public\",\"_reqid\",\"_beta\",\"_\",\"X\",\"XNEBULAXMLHTTPREQUEST\",\"callbackUrl\"];\nfunction SQ_b64d(s){s=String(s).replace(/[^A-Za-z0-9+\\/=]/g,\"\");var o=[],i=0,c1,c2,c3,c4;\n while(i<s.length){c1=SQ_B64C.indexOf(s.charAt(i++));c2=SQ_B64C.indexOf(s.charAt(i++));\n  c3=SQ_B64C.indexOf(s.charAt(i++));c4=SQ_B64C.indexOf(s.charAt(i++));\n  if(c2<0)break;o.push(((c1<<2)|(c2>>4))&255);\n  if(c3>=0){o.push((((c2&15)<<4)|(c3>>2))&255);\n   if(c4>=0)o.push((((c3&3)<<6)|c4)&255);}}\n return o;}\nfunction SQ_b64e(bs){var o=\"\",i=0,L=bs.length,a,b,c,n;\n while(i<L){a=bs[i++]&255;b=i<L?bs[i++]&255:-1;c=i<L?bs[i++]&255:-1;\n  n=(a<<16)|((b<0?0:b)<<8)|(c<0?0:c);\n  o+=SQ_B64C.charAt((n>>18)&63)+SQ_B64C.charAt((n>>12)&63)+\n     (b<0?\"=\":SQ_B64C.charAt((n>>6)&63))+(c<0?\"=\":SQ_B64C.charAt(n&63));}\n return o;}\nfunction SQ_u8(s){var o=[],i=0,c,c2,cp;s=String(s);\n for(i=0;i<s.length;i++){c=s.charCodeAt(i);\n  if(c<128)o.push(c);\n  else if(c<2048)o.push(192|(c>>6),128|(c&63));\n  else if(c>=0xD800&&c<=0xDBFF&&i+1<s.length){c2=s.charCodeAt(++i);\n   cp=0x10000+((c-0xD800)<<10)+(c2-0xDC00);\n   o.push(240|(cp>>18),128|((cp>>12)&63),128|((cp>>6)&63),128|(cp&63));}\n  else o.push(224|(c>>12),128|((c>>6)&63),128|(c&63));}\n return o;}\nfunction SQ_u8s(bs){var s=\"\",i=0,c,b1,b2,b3,cp;\n while(i<bs.length){c=bs[i++]&255;\n  if(c<128)s+=String.fromCharCode(c);\n  else if(c<224){b1=bs[i++]&255;s+=String.fromCharCode(((c&31)<<6)|(b1&63));}\n  else if(c<240){b1=bs[i++]&255;b2=bs[i++]&255;s+=String.fromCharCode(((c&15)<<12)|((b1&63)<<6)|(b2&63));}\n  else{b1=bs[i++]&255;b2=bs[i++]&255;b3=bs[i++]&255;\n   cp=(((c&7)<<18)|((b1&63)<<12)|((b2&63)<<6)|(b3&63))-0x10000;\n   s+=String.fromCharCode(0xD800+(cp>>10),0xDC00+(cp&1023));}}\n return s;}\nfunction SQ_uri(s){return encodeURIComponent(String(s));}\nfunction SQ_pubEnc(s){return SQ_uri(s).replace(/\\+/g,\"%20\").replace(/\\*/g,\"%2A\").replace(/%7E/g,\"~\");}\nfunction SQ_md5(str){\n var bs=SQ_u8(String(str)),i,j,L=bs.length;\n var SA=[7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,\n  5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,\n  4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,\n  6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21];\n var KT=[];for(i=0;i<64;i++)KT[i]=Math.floor(Math.abs(Math.sin(i+1))*4294967296);\n function rol(x,c){return (x<<c)|(x>>>(32-c));}\n function add(a,b){var l=(a&65535)+(b&65535),h=(a>>>16)+(b>>>16)+(l>>>16);return ((h<<16)|(l&65535))>>>0;}\n var bitLen=L*8;\n bs.push(128);\n while(bs.length%64!==56)bs.push(0);\n var hi=Math.floor(bitLen/4294967296),lo=bitLen>>>0;\n bs.push(lo&255,(lo>>>8)&255,(lo>>>16)&255,(lo>>>24)&255,\n        hi&255,(hi>>>8)&255,(hi>>>16)&255,(hi>>>24)&255);\n var a0=0x67452301,b0=0xefcdab89,c0=0x98badcfe,d0=0x10325476;\n for(i=0;i<bs.length;i+=64){\n  var M=[];for(j=0;j<16;j++){var q=i+j*4;M[j]=(bs[q]|(bs[q+1]<<8)|(bs[q+2]<<16)|(bs[q+3]<<24))>>>0;}\n  var A=a0,B=b0,C=c0,D=d0,F,g,tmp;\n  for(j=0;j<64;j++){\n   if(j<16){F=(B&C)|((~B)&D);g=j;}\n   else if(j<32){F=(D&B)|((~D)&C);g=(5*j+1)%16;}\n   else if(j<48){F=B^C^D;g=(3*j+5)%16;}\n   else{F=C^(B|(~D));g=(7*j)%16;}\n   F=add(add(add(A,F),KT[j]),M[g]);\n   tmp=D;D=C;C=B;B=add(B,rol(F,SA[j]));A=tmp;}\n  a0=add(a0,A);b0=add(b0,B);c0=add(c0,C);d0=add(d0,D);}\n function hx(n){var s=\"\",k;for(k=0;k<4;k++){var v=(n>>>(k*8))&255;s+=(v<16?\"0\":\"\")+v.toString(16);}return s;}\n return hx(a0)+hx(b0)+hx(c0)+hx(d0);}\nfunction SQ_enc18(uid,ts){ts=String(ts);while(ts.length<13)ts=\"2\"+ts;if(ts.length>13)ts=ts.slice(0,13);\n var n=Number(uid)||0;if(n===0)n=24697;\n var k=Number(ts.charAt(1)+ts.charAt(3)+ts.charAt(5)+ts.charAt(8)+ts.charAt(6))||0;\n var p=k===0?12347*n:k*n;\n var tail=String(p).slice(-5);\n return tail+ts;}\nfunction SQ_sign(pairs){var a=[],i,k,v;\n for(i=0;i<pairs.length;i++){k=pairs[i][0];v=pairs[i][1];\n  if(SQ_NOSIGN.indexOf(k)>=0)continue;a.push([k,String(v)]);}\n var has=false;for(i=0;i<a.length;i++)if(a[i][0]===\"sqSv\")has=true;\n if(!has)a.push([\"sqSv\",SQ_SQSV]);\n a.sort(function(x,y){return x[0]<y[0]?-1:(x[0]>y[0]?1:0);});\n var raw=\"\";for(i=0;i<a.length;i++)raw+=a[i][0]+\"=\"+SQ_uri(a[i][1])+\"&\";\n raw+=\"skey=\"+SQ_SKEY;return SQ_md5(raw);}\nfunction SQ_pubStr(uid,enc,dev){var m={},i,k;\n for(i=0;i<SQ_PUB.length;i++)m[SQ_PUB[i][0]]=SQ_PUB[i][1];\n for(k in dev)if(dev.hasOwnProperty(k))m[k]=dev[k];\n m.user_id=uid;m.userId=uid;m.platform=\"2\";m.enc=enc;\n var o=\"\";for(i=0;i<SQ_ORDER.length;i++){k=SQ_ORDER[i];\n  if(m[k]!==undefined)o+=k+\"=\"+SQ_pubEnc(m[k])+\"&\";}\n return o;}\nfunction SQ_xorB64(bytes){var ks=SQ_KS(),o=[],i,n=bytes.length<ks.length?bytes.length:ks.length;\n for(i=0;i<n;i++)o.push((bytes[i]&255)^(ks[i]&255));\n return SQ_b64e(o);}\nvar SQ_KS_CACHE=null;\nfunction SQ_KS(){if(!SQ_KS_CACHE)SQ_KS_CACHE=SQ_b64d(SQ_KSB64);return SQ_KS_CACHE;}\nfunction SQ_rnd(n,hex){var C=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\",H=\"0123456789abcdef\",s=\"\";\n for(var i=0;i<n;i++)s+=(hex?H:C).charAt(Math.floor(Math.random()*(hex?16:62)));return s;}\nfunction SQ_newDev(){return {sqUniqDeviceId:SQ_rnd(22,0),utdid:SQ_rnd(28,0),sn:SQ_rnd(16,1),\n umidtoken:SQ_rnd(40,1),otdd:SQ_rnd(22,0)};}\nfunction SQ_dev(S){var v=\"\";try{v=String(S.get(\"sqDev\")||\"\");}catch(e){}\n if(v&&v.length>10&&v!==\"null\"){try{var d=JSON.parse(v);if(d&&d.sn)return d;}catch(e2){}}\n var d2=SQ_newDev();try{S.put(\"sqDev\",JSON.stringify(d2));}catch(e3){}return d2;}\nfunction SQ_req(path,biz,uid,S,ts){uid=uid||SQ_UID;ts=ts||String(Date.now());\n var dev=SQ_dev(S);var enc=SQ_enc18(uid,ts);\n var m={},i,k,v;\n for(i=0;i<SQ_PUB.length;i++)m[SQ_PUB[i][0]]=SQ_PUB[i][1];\n for(k in dev)if(dev.hasOwnProperty(k))m[k]=dev[k];\n m.user_id=uid;m.userId=uid;m.platform=\"an\";m.enc=enc;m.timestamp=ts;\n for(i=0;i<biz.length;i++)m[biz[i][0]]=String(biz[i][1]);\n m.isTeenMode=\"0\";m.sqSv=SQ_SQSV;\n var pairs=[];for(k in m)if(m.hasOwnProperty(k))pairs.push([k,m[k]]);\n m.sign=SQ_sign(pairs);m.key=\"sq_app_gateway\";\n var plain=SQ_u8(JSON.stringify(m));\n var body=\"data=\"+SQ_uri(SQ_xorB64(plain));\n var pub=SQ_pubStr(uid,enc,dev);\n var hdr={\"content-type\":\"application/x-www-form-urlencoded\",\"user-agent\":SQ_UA,\n  \"x-sq-req-platform\":\"an\",\"x-sq-s-key\":\"23011413\",\"x-sq-sv\":\"3.0\",\n  \"x-sq-public\":SQ_xorB64(SQ_u8(pub)),\"x-sq-req-encrypt\":\"sdk\",\n  \"x-sq-req-encrypt-param\":\"x-sq-public\",\"x-sq-api-encrypt\":\"1\"};\n return {url:SQ_HOST+path,option:{method:\"POST\",body:body,headers:hdr,timeout:15000}};}\nfunction SQ_post(Jv,S,path,biz,uid){var r=SQ_req(path,biz,uid,S);\n var raw=String(Jv.ajax(r.url+\",\"+JSON.stringify(r.option)));\n try{return JSON.parse(raw);}catch(e){throw new Error(\"书旗接口返回异常: \"+raw.slice(0,120));}}\nfunction SQ_get(Jv,url,ua){var o={timeout:12000,headers:{\"User-Agent\":ua||SQ_H5UA}};\n return String(Jv.ajax(url+\",\"+JSON.stringify(o)));}\nvar SQ_WEB = \"https://www.shuqi.com\";\nvar SQ_WEB_ALT = [\"https://www.shuqi.com\",\"https://shuqi.com\"];\nvar SQ_CDN_ALT = [\"https://c1.shuqireader.com\",\"https://c2.shuqireader.com\"];\nvar SQ_ALL_LINES = SQ_WEB_ALT.concat(SQ_CDN_ALT);\nvar SQ_CDN_HOSTS = [\"c1.shuqireader.com\",\"c2.shuqireader.com\"];\nvar SQ_CDN_FLAGS = [\"3111111111\",\"2111111111\"];\nvar SQ_P_SEARCH = \"/sqan/render/render/search/native_v3\";\nvar SQ_P_TITLE = \"/sqan/sqapi/bff/api/v1/reader/titlepage\";\nvar SQ_P_CHINFO = \"/sqan/sqapi/bff/api/v1/reader/chapterinfo\";\nfunction SQ_S(x){return \"\"+(x===undefined||x===null?\"\":x);}\nfunction SQ_trim(s){return SQ_S(s).replace(/^\\s+|\\s+$/g,\"\");}\nfunction SQ_plain(s){return SQ_trim(SQ_S(s).replace(/<[^>]*>/g,\"\").replace(/&nbsp;/g,\" \").replace(/&amp;/g,\"&\").replace(/&lt;/g,\"<\").replace(/&gt;/g,\">\").replace(/&quot;/g,'\"').replace(/\\s+/g,\" \"));}\nfunction SQ_wan(v){var n=Number(v)||0;if(n>=1e8)return (Math.round(n/1e6)/100)+\"亿字\";if(n>=1e4)return (Math.round(n/1e3)/10)+\"万字\";return n>0?n+\"字\":\"\";}\nfunction SQ_status(v){return SQ_S(v)===\"2\"?\"完结\":\"连载\";}\nfunction SQ_tagStr(m){var a=m.tags||m.tagList||[];var o=[],i;\n if(typeof a===\"string\")return SQ_plain(a);\n for(i=0;i<a.length;i++){var t=a[i];o.push(SQ_plain(typeof t===\"string\"?t:(t&&(t.tagName||t.name))||\"\"));}\n return o.filter(function(x){return x}).join(\",\");}\nfunction SQ_bid(u){var s=SQ_S(u),m;\n m=s.match(/get_book_content_([0-9]{1,12})_([0-9]{1,20})_/);if(m)return m[1];\n m=s.match(/(?:\\/book\\/|\\/sqbook\\/|bid=|bookId=)([0-9]{1,12})/);return m?m[1]:\"\";}\nfunction SQ_cid(u){var s=SQ_S(u),m;\n m=s.match(/get_book_content_[0-9]{1,12}_([0-9]{1,20})_/);if(m)return m[1];\n m=s.match(/(?:cid=|sqch\\/\\d+\\/)([0-9]{1,20})/);return m?m[1]:\"\";}\nfunction SQ_bookUrl(id,S){try{return SQ_web(S)+\"/book/\"+id+\".html\"}catch(e){return SQ_WEB_ALT[0]+\"/book/\"+id+\".html\";}}\nfunction SQ_chUrl(bid,cid,S){try{return SQ_cdnHost(S)+\"/httpserver/filecache/get_book_content_\"+bid+\"_\"+cid+\"_3111111111_0_0.html\"}catch(e){return SQ_CDN_ALT[0]+\"/httpserver/filecache/get_book_content_\"+bid+\"_\"+cid+\"_3111111111_0_0.html\";}}\nfunction SQ_gv(S,k,d){var v=\"\";try{v=SQ_S(S.get(k)||\"\");}catch(e){}\n if(!v||v===\"null\"||v===\"undefined\")v=d||\"\";return SQ_S(v);}\nfunction SQ_web(S){\n var w=SQ_gv(S,\"sqWeb\",SQ_WEB).replace(/\\/$/,\"\");\n var ok=false,i;for(i=0;i<SQ_WEB_ALT.length;i++)if(w===SQ_WEB_ALT[i])ok=true;\n if(!ok)w=SQ_WEB_ALT[0];\n return w;}\nfunction SQ_cdnHost(S){\n var c=SQ_gv(S,\"sqCdn\",\"https://c1.shuqireader.com\").replace(/\\/$/,\"\");\n var ok2=false,i;for(i=0;i<SQ_CDN_ALT.length;i++)if(c===SQ_CDN_ALT[i])ok2=true;\n if(!ok2)c=SQ_CDN_ALT[0];\n return c;}\nfunction SQ_put(S,k,v){try{S.put(k,SQ_S(v));}catch(e){try{java.put(k,SQ_S(v));}catch(e2){}}}\nfunction SQ_webGet(Jv,url){var o={timeout:12000,headers:{\"User-Agent\":SQ_UA}};\n return SQ_S(Jv.ajax(url+\",\"+JSON.stringify(o)));}\nfunction SQ_api(Jv,S,path,biz,uid){return SQ_post(Jv,S,path,biz,uid);}\nfunction SQ_searchUrl(Jv,S,kw,pg){\n var biz=[[\"page\",\"searchResultV3\"],[\"query\",SQ_S(kw)],[\"timestamp\",String(Date.now())]];\n var r=SQ_req(SQ_P_SEARCH,biz,null,S);\n return r.url+\",\"+JSON.stringify(r.option);\n}\nfunction SQ_searchBooks(resp,S){S=S||{get:function(){return \"\"}};\n var d={};try{d=(resp&&typeof resp===\"object\")?resp:JSON.parse(SQ_S(resp));}catch(e){return [];}\n var mods=(d.data&&d.data.moduleInfos)||[],out=[],seen={},i;\n for(i=0;i<mods.length;i++){\n  var b=mods[i]&&mods[i].book;if(!b||!b.bookId)continue;\n  var id=SQ_S(b.bookId);if(seen[id])continue;seen[id]=1;\n  var kind=[];\n  var bottom=SQ_plain(b.bottomText||\"\");if(bottom)kind.push(bottom);\n  var tags=SQ_tagStr(b);if(tags)kind.push(tags);\n  out.push({name:SQ_plain(b.bookName||b.displayBookName),author:SQ_plain(b.authorName),\n   bookUrl:SQ_bookUrl(id,S),coverUrl:SQ_S(b.imgUrl||\"\"),\n   intro:SQ_plain(b.desc),kind:kind.join(\",\"),wordCount:SQ_wan(b.wordCount),\n   lastChapter:\"\",status:SQ_status(b.state)});\n }\n return out;\n}\nfunction SQ_detail(Jv,S,rawUrl){\n var bid=SQ_bid(rawUrl);if(!bid)throw new Error(\"书旗：无效书籍ID\");\n var info=null;\n try{var r=SQ_api(Jv,S,SQ_P_TITLE,[[\"bookId\",bid]]);\n  var b=(r&&r.data&&r.data.bookInfo)||null;\n  if(b&&b.bookName){\n   var score=(r.data&&r.data.scoreInfo)||{};\n   var kind=[SQ_S(b.secCateName||\"\"),SQ_tagStr(b),SQ_status(b.serialState),score.bookScore?score.bookScore+\"分\":\"\",SQ_wan(b.wordCount)].filter(function(x){return x});\n   info={name:SQ_plain(b.bookName),author:SQ_plain(b.authorName),\n    intro:SQ_plain(b.briefIntro||b.desc||b.intro),kind:kind.join(\",\"),\n    coverUrl:SQ_S(b.coverUrl||b.imgUrl||\"\"),wordCount:SQ_wan(b.wordCount),\n    lastChapter:SQ_plain((b.lastChapter&&b.lastChapter.chapterName)||b.latestChapterName||\"\"),\n    tocUrl:SQ_bookUrl(bid,S)};\n  }\n }catch(e){}\n if(!info){\n  try{var h=SQ_webGet(Jv,SQ_web(S)+\"/book/\"+bid+\".html\");\n   var ti=(h.match(/<title>([\\s\\S]{0,160}?)<\\/title>/)||[])[1]||\"\";\n   var mt=ti.match(/《([^》]+)》/);var nm=mt?mt[1]:\"\";\n   var au=(h.match(/作者[：:]\\s*([^<\\s,，]{1,20})/)||[])[1]||\"\";\n   var iv=(h.match(/简介[：:]?([\\s\\S]{0,400}?)<\\/p>/)||[])[1]||\"\";\n   info={name:nm||\"书籍\"+bid,author:au,intro:SQ_plain(iv),kind:\"\",coverUrl:\"\",wordCount:\"\",lastChapter:\"\",tocUrl:SQ_bookUrl(bid,S)};\n  }catch(e2){throw new Error(\"书旗：详情获取失败 \"+bid);}\n }\n return info;\n}\nfunction SQ_h5Rows(seg,bid,S){\n var rows=[],seen={},re=/href=\"\\/reader\\?bid=\\d+&(?:amp;)?cid=(\\d+)\"[^>]*>([\\s\\S]*?)<\\/a>/g,m;\n while((m=re.exec(seg))!==null){\n  var cid=m[1];if(seen[cid])continue;seen[cid]=1;\n  var inner=SQ_S(m[2]).replace(/<i[^>]*>[\\s\\S]*?<\\/i>/gi,\" \").replace(/<[^>]*>/g,\" \");\n  inner=SQ_plain(inner).replace(/^\\d+[.、]\\s*/,\"\");\n  if(!inner)continue;\n  rows.push({pos:m.index,title:inner,url:SQ_chUrl(bid,cid,S)});\n  if(rows.length>20000)break;\n }\n return rows;\n}\nfunction SQ_volMark(name,title){\n var vn=SQ_S(name);if(!vn)return title;\n if(SQ_S(title).indexOf(vn)>=0)return title;\n return \"【\"+vn+\"】\"+title;\n}\nfunction SQ_openToc(Jv,S,bid){\n var KEY=\"37e81a9d8f02596e1b895d07c171d5c9\",UID=\"8000000\";\n var ts=String(Math.floor(Date.now()/1000));\n var q=\"bookId=\"+bid+\"&user_id=\"+UID+\"&timestamp=\"+ts+\"&sign=\"+SQ_md5(String(bid)+ts+UID+KEY);\n var raw=\"\";\n try{raw=SQ_webGet(Jv,\"https://content.shuqireader.com/openapi/book/chapterlist?shuqi_h5=205&platform=0&\"+q);}catch(e){}\n if(!raw||raw.length<200){try{raw=SQ_webGet(Jv,\"https://ocean.shuqireader.com/api/bcspub/qswebapi/book/chapterlist?_=&\"+q);}catch(e2){}}\n var d={};try{d=JSON.parse(raw);}catch(e3){return [];}\n if(String(d.state)!==\"200\"&&String(d.status)!==\"200\")return [];\n var dt=d.data||{},cls=dt.chapterList||[],vols=[],i,j;\n for(i=0;i<cls.length;i++){\n  var v=cls[i]||{},a=v.volumeList||v.chapterList||v.chapter||[],rows=[];\n  for(j=0;j<a.length;j++){\n   var c=a[j]||{},cid=SQ_S(c.chapterId||c.cid||\"\");\n   if(!cid)continue;\n   var nm=SQ_plain(c.chapterName||c.name||c.title||\"\");\n   if(!nm)nm=\"第\"+(rows.length+1)+\"章\";\n   rows.push({title:nm,url:SQ_chUrl(bid,cid,S)});\n   if(rows.length>20000)break;\n  }\n  if(rows.length)vols.push({name:SQ_plain(v.volumeName||v.name||\"\"),rows:rows});\n }\n if(!vols.length)return [];\n var multi=vols.length>=2,out=[];\n for(i=0;i<vols.length;i++){\n  var vv=vols[i],vname=multi?vv.name:\"\";\n  for(j=0;j<vv.rows.length;j++){\n   var t=vv.rows[j].title;\n   if(j===0&&vname)t=SQ_volMark(vname,t);\n   out.push({title:t,url:vv.rows[j].url});\n  }\n }\n return out;\n}\nfunction SQ_toc(Jv,S,rawUrl){\n var bid=SQ_bid(rawUrl);if(!bid)throw new Error(\"书旗：无效书籍ID\");\n var h=\"\";\n try{h=SQ_webGet(Jv,SQ_web(S)+\"/chapter?bid=\"+bid);}catch(e){}\n if(h.length>5000&&h.indexOf(\"cid=\")>=0){\n  var rows=SQ_h5Rows(h,bid,S);\n  if(rows.length){\n   var marks=[],vm=/<div class=\"vol_name\"[^>]*>\\s*<span>([\\s\\S]*?)<\\/span>/g,mm;\n   while((mm=vm.exec(h))!==null)marks.push({pos:mm.index,name:SQ_plain(mm[1])});\n   var out=[],k,vi,fk,firstSet={};\n   if(marks.length>=2){\n    for(vi=0;vi<marks.length;vi++){\n     fk=-1;\n     for(k=0;k<rows.length;k++)if(rows[k].pos>=marks[vi].pos&&(vi+1>=marks.length||rows[k].pos<marks[vi+1].pos)){fk=k;break;}\n     if(fk>=0&&marks[vi].name)firstSet[fk]=marks[vi].name;\n    }\n   }\n   for(k=0;k<rows.length;k++){\n    var t=rows[k].title;\n    if(firstSet[k])t=SQ_volMark(firstSet[k],t);\n    out.push({title:t,url:rows[k].url});\n   }\n   return out;\n  }\n }\n return SQ_openToc(Jv,S,bid);\n}\nfunction SQ_cdnParse(body){\n var s=SQ_S(body),i=s.indexOf(\"(\"),j=s.lastIndexOf(\")\"),inner=i>0&&j>i?s.slice(i+1,j):s;\n try{var a=JSON.parse(inner);var c=SQ_S(a&&a[0]&&a[0].content);\n  if(!c)return \"\";\n  return SQ_trim(c.replace(/<br\\s*\\/?>/gi,\"\\n\").replace(/&nbsp;/g,\" \").replace(/<[^>]*>/g,\"\")\n   .replace(/&amp;/g,\"&\").replace(/&lt;/g,\"<\").replace(/&gt;/g,\">\").replace(/&quot;/g,'\"'));\n }catch(e){return \"\";}\n}\nfunction SQ_rot13(s){return SQ_S(s).replace(/[a-zA-Z]/g,function(c){var b=c<=\"Z\"?65:97;return String.fromCharCode((c.charCodeAt(0)-b+13)%26+b);});}\nfunction SQ_ciDecode(s){var r=SQ_rot13(s).replace(/\\s+/g,\"\");\n try{return SQ_u8s(SQ_b64d(r)).replace(/<br\\s*\\/?>/gi,\"\\n\");}catch(e){return \"\";}}\nfunction SQ_content(Jv,S,rawUrl){\n var bid=SQ_bid(rawUrl),cid=SQ_cid(rawUrl);\n if(!bid||!cid)throw new Error(\"书旗：章节地址无效\");\n var note=[],i,f,h,sch,url,txt;\n var pref=SQ_cdnHost(S).split(\"//\")[1];\n var hs=SQ_CDN_HOSTS.slice();\n hs.sort(function(a,b){return (a===pref?-1:0)-(b===pref?-1:0)});\n for(sch=0;sch<2;sch++){\n  var scheme=sch===0?\"https\":\"http\";\n  for(h=0;h<hs.length;h++){\n   for(f=0;f<SQ_CDN_FLAGS.length;f++){\n    url=scheme+\"://\"+hs[h]+\"/httpserver/filecache/get_book_content_\"+bid+\"_\"+cid+\"_\"+SQ_CDN_FLAGS[f]+\"_0_0.html\";\n    try{var b=SQ_webGet(Jv,url);txt=SQ_cdnParse(b);\n     if(txt.length>30)return txt;note.push(SQ_CDN_HOSTS[h]+\"/\"+SQ_CDN_FLAGS[f]+\":空\");\n    }catch(e){note.push(SQ_CDN_HOSTS[h]+\"/\"+SQ_CDN_FLAGS[f]+\":失败\");}\n   }\n  }\n }\n try{var cr=SQ_api(Jv,S,SQ_P_CHINFO,[[\"bookId\",bid],[\"chapterId\",cid]],SQ_CIUID);\n  var enc=SQ_S(cr&&cr.data&&cr.data.chapter&&cr.data.chapter.content);\n  if(enc){var dec=SQ_ciDecode(enc);if(dec.length>30)return dec;}\n }catch(e){note.push(\"chapterinfo:\"+SQ_S(e).slice(0,40));}\n throw new Error(\"书旗：本章正文不可用（\"+(cid)+\"）。\"+(note.length?note.slice(0,3).join(\"; \"):\"可能需登录或为付费章\"));\n}\nfunction SQ_explore(Jv,S,rawUrl,pg){\n var u=SQ_S(rawUrl);\n var mp=u.match(/[?&]page=([0-9]+)/);var p=mp?Number(mp[1]):(Number(pg)||1);\n var path=\"\",m;\n if((m=u.match(/[?&]rank=([A-Za-z]+)/)))path=\"/ranklist?rank=\"+m[1]+\"&page=\"+p;\n else if(/[?&](?:sz|fc|wd|tm|st|store|sqs)=/.test(u)||u.indexOf(\"/store\")>=0){\n  var q=u.indexOf(\"?\")>=0?u.slice(u.indexOf(\"?\")+1).replace(/&amp;/g,\"&\"):\"\";\n  q=q.replace(/[?&]?page=[0-9]+/g,\"\").replace(/^&+|&+$/g,\"\");\n  var keep=[],kv=q.split(\"&\"),i0;\n  for(i0=0;i0<kv.length;i0++){if(/^(sz|fc|wd|tm|st)=/.test(kv[i0]))keep.push(kv[i0]);}\n  path=\"/store?\"+(keep.length?keep.join(\"&\")+\"&\":\"\")+\"page=\"+p;\n }\n else path=\"/rank?page=\"+p;\n var web=SQ_web(S);\n var h=\"\";\n try{h=SQ_webGet(Jv,web+path);}catch(e){}\n if(h.length<2000)return [];\n var out=[],seen={},re,i2;\n if(path.indexOf(\"/ranklist\")===0||path.indexOf(\"/rank?\")===0){\n  re=/<li class=\"clearfix\">([\\s\\S]*?)<\\/li>/g;\n  var mm;\n  while((mm=re.exec(h))!==null){\n   var li=SQ_S(mm[1]);\n   var mb=li.match(/\\/book\\/(\\d+)\\.html/);if(!mb||seen[mb[1]])continue;seen[mb[1]]=1;\n   var title=(li.match(/<h3>([\\s\\S]*?)<\\/h3>/)||[])[1]||\"\";\n   var img=(li.match(/<img[^>]*src=\"([^\"]+)\"/)||[])[1]||\"\";\n   var au=(li.match(/class=\"bkuser-icon\"[^>]*>[\\s\\S]*?<a[^>]*>([\\s\\S]*?)<\\/a>/)||[])[1]||\"\";\n   var cate=(li.match(/class=\"bkcate-icon\">([\\s\\S]*?)<\\/span>/)||[])[1]||\"\";\n   var des=(li.match(/class=\"ranklist-des\">([\\s\\S]*?)<\\/p>/)||[])[1]||\"\";\n   var tags=(li.match(/class=\"ranklist-tag\">([\\s\\S]*?)<\\/p>/)||[])[1]||\"\";\n   var tg=SQ_plain(tags.replace(/<[^>]*>/g,\" \"));\n   out.push({name:SQ_plain(title),author:SQ_plain(au),bookUrl:SQ_bookUrl(mb[1],S),\n    coverUrl:SQ_S(img),intro:SQ_plain(des),kind:[SQ_plain(cate),tg].filter(function(x){return x}).join(\",\")});\n  }\n }else{\n  var lis=h.split('<li');\n  for(i2=1;i2<lis.length;i2++){\n   var li=SQ_S(lis[i2].split('</li>')[0]);\n   if(li.indexOf('store-tag')<0)continue;\n   var mb2=li.match(/\\/book\\/(\\d+)\\.html/);if(!mb2||seen[mb2[1]])continue;seen[mb2[1]]=1;\n   var nm=(li.match(/<h3[^>]*>([\\s\\S]*?)<\\/h3>/)||[])[1]||'';\n   if(!nm){var mt2=li.match(/<a[^>]*href=\"\\/book\\/\\d+\\.html\"[^>]*title=\"([^\"]*)\"/);if(mt2)nm=mt2[1];}\n   var im=(li.match(/<img[^>]*class=\"cover\"[^>]*src=\"([^\"]+)\"/)||li.match(/<img[^>]*src=\"([^\"]+)\"/)||[])[1]||'';\n   var des=(li.match(/class=\"store-des\">([\\s\\S]*?)<\\/p>/)||[])[1]||'';\n   var au=(li.match(/class=\"store-tag[^>]*>[\\s\\S]*?<a[^>]*>([\\s\\S]*?)<\\/a>/)||[])[1]||'';\n   au=SQ_plain(au).replace(/^作者[：:]\\s*/,'');\n   var cate=(li.match(/class=\"store-tag[^>]*>[\\s\\S]*?<span>([\\s\\S]*?)<\\/span>/)||[])[1]||'';\n   if(!nm)continue;\n   out.push({name:SQ_plain(nm),author:au,bookUrl:SQ_bookUrl(mb2[1],S),coverUrl:SQ_S(im),\n    intro:SQ_plain(des),kind:SQ_plain(cate)});\n  }\n }\n return out;\n}\nfunction SQ_speedKey(host){return \"sqsp_\"+SQ_S(host).replace(/[^a-z0-9]/gi,\"\").slice(0,24);}\nfunction SQ_speedTest(Jv,S){\n var res=[],i,best=\"\",bm=99999999;\n for(i=0;i<SQ_ALL_LINES.length;i++){\n  var host=SQ_ALL_LINES[i];\n  var isCdn=SQ_CDN_ALT.indexOf(host)>=0;\n  var probe=isCdn?host+\"/httpserver/filecache/get_book_content_34078_2180322_3111111111_0_0.html\"\n                  :host+\"/ranklist?rank=boyClick\";\n  var t0=Date.now(),ok=false,ms=0;\n  try{var h=SQ_webGet(Jv,probe);\n   ms=Date.now()-t0;\n   ok=isCdn?(h.indexOf(\"success_jsonpCallback\")>=0&&h.indexOf(\"\\\\u3000\")>=0)\n           :(h.length>5000&&h.indexOf(\"ranklist-ul\")>=0&&h.indexOf(\"访问被拒绝\")<0);\n  }catch(e){ms=Date.now()-t0;}\n  var st=ok?ms+\"ms\":\"超时/不支持\";\n  SQ_put(S,SQ_speedKey(host),st);\n  res.push({host:host,kind:isCdn?\"CDN\":\"H5\",ms:ms,ok:ok,st:st});\n  if(ok&&!isCdn&&ms<bm){bm=ms;best=host;}\n }\n if(best){SQ_put(S,SQ_speedKey(best),\"⚡\"+bm+\"ms\");SQ_put(S,\"sqWeb\",best);}\n return {best:best,bm:bm,rows:res};\n}\nfunction SQ_setWeb(S,host){SQ_put(S,\"sqWeb\",SQ_S(host).replace(/\\/$/,\"\"));return SQ_S(host);}\nfunction SQ_checkLogin(Jv,S){\n var out={needLogin:false,ok:false,detail:\"\"};\n try{var r=SQ_api(Jv,S,SQ_P_TITLE,[[\"bookId\",\"34078\"]]);\n  out.ok=!!(r&&r.data&&r.data.bookInfo);\n  out.detail=out.ok?\"游客态可用（无需登录）\":\"接口异常\";\n }catch(e){out.detail=SQ_S(e).slice(0,80);}\n return out;\n}", "lastUpdateTime": "1794079877053", "loginCheckJs": "(function(){var b='';try{b=String(result.body())}catch(e){try{b=String(result)}catch(e2){}};if(b.indexOf('403 - 访问被拒绝')>=0){throw new Error('⚠️ 书旗 H5 站点 403 拦截（UA/线路异常），请点登录界面「测试延时」切换线路');}return result;})()", "loginUi": "[{\"name\": \"📖 书旗小说(APP接口) · 游客态可用，无需登录\", \"type\": \"button\", \"action\": \"SQ_uiHelp(java)\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"🔍 检查登录状态（游客态连通性）\", \"type\": \"button\", \"action\": \"SQ_uiCheck(java)\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"🌐 网址发布页\", \"type\": \"text\", \"key\": \"sqPubUrl\", \"hint\": \"书旗无独立发布页；如需自定义上游线路可填网址（可选）\", \"default\": \"https://www.shuqi.com/\"}, {\"name\": \"📥 一键从发布页获取网址路线\", \"type\": \"button\", \"action\": \"SQ_uiFetchPub(java)\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"🌐 当前线路\", \"type\": \"button\", \"action\": \"SQ_uiShowWeb(java)\", \"viewName\": \"'🌐 当前线路：'+(source.get('sqWeb')||'https://www.shuqi.com')\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"⏱ 测试延时（逐站测速，结果写入下方按钮）\", \"type\": \"button\", \"action\": \"SQ_uiSpeed(java)\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"🔘 H5 主站 www.shuqi.com\", \"type\": \"button\", \"action\": \"SQ_uiSetLine(java,'https://www.shuqi.com')\", \"viewName\": \"'🔘 H5 主站 www.shuqi.com '+(source.get('sqsp_httpswwwshuqicom')||'未测速')\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"🔘 H5 裸域 shuqi.com\", \"type\": \"button\", \"action\": \"SQ_uiSetLine(java,'https://shuqi.com')\", \"viewName\": \"'🔘 H5 裸域 shuqi.com '+(source.get('sqsp_httpsshuqicom')||'未测速')\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"🔘 CDN c1.shuqireader.com\", \"type\": \"button\", \"action\": \"SQ_uiSetLine(java,'https://c1.shuqireader.com')\", \"viewName\": \"'🔘 CDN c1.shuqireader.com '+(source.get('sqsp_httpsc1shuqireadercom')||'未测速')\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"🔘 CDN c2.shuqireader.com\", \"type\": \"button\", \"action\": \"SQ_uiSetLine(java,'https://c2.shuqireader.com')\", \"viewName\": \"'🔘 CDN c2.shuqireader.com '+(source.get('sqsp_httpsc2shuqireadercom')||'未测速')\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"🔄 重置设备身份（接口异常时点此）\", \"type\": \"button\", \"action\": \"SQ_uiResetDev(java)\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"ℹ️ 关于 / UA 与限频说明\", \"type\": \"button\", \"action\": \"SQ_uiAbout(java)\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}]", "loginUrl": "function SQ_T(jv,msg){try{jv.longToast(msg);return;}catch(e){}try{jv.toast(msg);}catch(e2){}}\nfunction SQ_PUB(jv){try{return String(jv.get('sqPubUrl')||'')}catch(e){return ''}}\nfunction SQ_SET(jv,k,v){try{jv.put(k,String(v))}catch(e){}}\nfunction SQ_GET(jv,k){try{return String(jv.get(k)||'')}catch(e){return ''}}\nfunction SQ_HOSTS(){return ['https://www.shuqi.com','https://shuqi.com','https://c1.shuqireader.com','https://c2.shuqireader.com']}\nfunction SQ_KEY(h){return 'sqsp_'+String(h).replace(/[^a-z0-9]/gi,'').slice(0,24)}\nfunction SQ_AJAX(jv,u,ms){var o={timeout:ms||8000,headers:{'User-Agent':'okhttp/3.12.13'}};\n return String(jv.ajax(u+','+JSON.stringify(o)));}\nfunction SQ_PARSE(h){\n var out=[],re=/href=[\"'](https?:\\/\\/[a-z0-9.-]*shuqi[a-z0-9.-]*)[\"']/gi,m,seen={};\n while((m=re.exec(h))!==null){var u=m[1].replace(/\\/$/,'');if(!seen[u]){seen[u]=1;out.push(u)}}\n return out;}\nfunction SQ_uiHelp(jv){SQ_T(jv,'ℹ️ 书旗小说书源：上游为书旗官方 App 加密接口（游客态），无需账号登录。\\n搜索/详情/目录/正文/发现均可用；VIP 章正文来自免签 CDN 缓存。');}\nfunction SQ_uiAbout(jv){SQ_T(jv,'ℹ️ UA 固定 okhttp/3.12.13（站点对浏览器 UA 返回 403 拦截页）。\\n已内置搜索最小间隔 3 秒与 concurrentRate 限速，请勿连续高频搜索以免触发风控。\\n兼容 LegadoTeam 官方版与 legado-E。');}\nfunction SQ_uiCheck(jv){\n SQ_T(jv,'⏳ 正在检查登录状态与接口连通性…');\n try{\n  var o={timeout:10000,headers:{'User-Agent':'okhttp/3.12.13','content-type':'application/x-www-form-urlencoded'}};\n  var h=SQ_AJAX(jv,'https://www.shuqi.com/ranklist?rank=boyClick',10000);\n  if(h.length>5000&&h.indexOf('访问被拒绝')<0){\n   SQ_T(jv,'✅ 游客态可用，无需登录（H5 榜单连通，'+h.length+' 字节）\\n书源接口正常，可直接搜索阅读。');return;}\n  SQ_T(jv,'⚠️ H5 站点返回异常（可能被限频），但加密接口仍可尝试；如搜索失败请稍后重试。');\n }catch(e){SQ_T(jv,'❌ 检查失败：'+String(e).slice(0,120)+'\\n请检查网络或点「测试延时」切换线路。');}\n}\nfunction SQ_uiFetchPub(jv){\n var pub=SQ_PUB(jv);if(!pub){SQ_T(jv,'⚠️ 请先在上方「网址发布页」输入框填写网址');return;}\n SQ_T(jv,'⏳ 正在从发布页获取网址路线：'+pub);\n try{\n  var h=SQ_AJAX(jv,pub,10000);\n  var ls=SQ_PARSE(h);\n  if(!ls.length){SQ_T(jv,'ℹ️ 书旗为官方固定域名，无独立网址发布页；未从该页解析到线路。\\n已保留内置 4 条官方线路，可直接点「测试延时」后切换。');return;}\n  SQ_SET(jv,'sqPubLines',ls.join('\\n'));\n  SQ_T(jv,'✅ 发布页解析完成，共 '+ls.length+' 条线路：\\n'+ls.slice(0,8).join('\\n')+'\\n（书源规则仍使用官方接口域名，线路仅用于 H5 榜单/目录）');\n }catch(e){SQ_T(jv,'❌ 发布页获取失败：'+String(e).slice(0,120)+'\\n内置线路仍可用。');}\n}\nfunction SQ_uiSpeed(jv){\n SQ_T(jv,'⏳ 开始逐站测速（2 条 H5 + 2 条 CDN，约 5~30 秒），请稍候…');\n var hs=SQ_HOSTS(),msg='📊 测速结果：',best='',bm=99999999,i;\n for(i=0;i<hs.length;i++){\n  var h=hs[i],isCdn=h.indexOf('c1.')>=0||h.indexOf('c2.')>=0;\n  var probe=isCdn?h+'/httpserver/filecache/get_book_content_34078_2180322_3111111111_0_0.html'\n                 :h+'/ranklist?rank=boyClick';\n  var t0=Date.now(),st='超时/不支持',ok=false,ms=0;\n  try{var r=SQ_AJAX(jv,probe,8000);ms=Date.now()-t0;\n   ok=isCdn?(r.indexOf('success_jsonpCallback')>=0&&r.indexOf('\\\\u3000')>=0)\n           :(r.length>5000&&r.indexOf('ranklist-ul')>=0&&r.indexOf('访问被拒绝')<0);\n   st=ok?ms+'ms':'内容异常/不支持';}catch(e){ms=Date.now()-t0;st='失败';}\n  SQ_SET(jv,SQ_KEY(h),st);\n  msg+='\\n'+(i+1)+'. ['+(isCdn?'CDN':'H5')+'] '+h.split('//')[1]+' → '+st;\n  if(ok&&!isCdn&&ms<bm){bm=ms;best=h;}\n }\n if(best){SQ_SET(jv,SQ_KEY(best),'⚡'+bm+'ms');SQ_SET(jv,'sqWeb',best);\n  msg+='\\n—— 最快 H5：'+best.split('//')[1]+' ('+bm+'ms)，已自动切换';}\n else msg+='\\n—— 无可用 H5 线路，保持原线路（加密接口搜索不受影响）';\n SQ_T(jv,msg);\n try{jv.reLoginView();}catch(e){try{jv.reUiView();}catch(e2){}}\n}\nfunction SQ_uiSetLine(jv,host){\n var isCdn=host.indexOf('c1.')>=0||host.indexOf('c2.')>=0;\n SQ_T(jv,'⏳ 正在切换'+(isCdn?' CDN 正文':' H5 站点')+'线路：'+host+' …');\n SQ_SET(jv,isCdn?'sqCdn':'sqWeb',host);\n var probe=isCdn?host+'/httpserver/filecache/get_book_content_34078_2180322_3111111111_0_0.html'\n                :host+'/ranklist?rank=boyClick';\n var t0=Date.now(),ok=false,ms=0;\n try{var r=SQ_AJAX(jv,probe,8000);ms=Date.now()-t0;\n  ok=isCdn?(r.indexOf('success_jsonpCallback')>=0&&r.indexOf('\\\\u3000')>=0)\n          :(r.length>5000&&r.indexOf('ranklist-ul')>=0&&r.indexOf('访问被拒绝')<0);}catch(e){}\n SQ_SET(jv,SQ_KEY(host),ok?ms+'ms':'不可用');\n SQ_T(jv,ok?('✅ 已切换'+(isCdn?' CDN 正文':' H5 站点')+'：'+host+'（'+ms+'ms）\\n'+(isCdn?'章节正文将优先走该 CDN；':'发现页/目录/详情将走该域；')+'加密接口不受影响。')\n           :('⚠️ 已写入：'+host+'\\n但该线路当前不可达，可点「测试延时」重新选线，或切回主站。'));\n try{jv.reLoginView();}catch(e){try{jv.reUiView();}catch(e2){}}\n}\nfunction SQ_uiShowWeb(jv){SQ_T(jv,'🌐 当前 H5 线路：'+SQ_GET(jv,'sqWeb')+'\\n📦 当前 CDN 线路：'+SQ_GET(jv,'sqCdn'));}\nfunction SQ_uiSetWeb(jv,host){SQ_uiSetLine(jv,host);}\nfunction SQ_uiResetDev(jv){\n SQ_T(jv,'⏳ 正在重置设备身份…');\n try{jv.put('sqDev','');SQ_T(jv,'✅ 设备身份已重置，下次请求将生成新游客设备（可解决偶发接口异常）。');}\n catch(e){SQ_T(jv,'❌ 重置失败：'+String(e).slice(0,100));}\n}\nfunction SQ_uiTokens(jv){return SQ_GET(jv,'sqPubLines');}\nfunction login(){return 'ok';}", "respondTime": 36356, "ruleBookInfo": {"author": "$.author", "coverUrl": "$.coverUrl", "init": "@js:\n(function(){return JSON.stringify(SQ_detail(java,source,String(baseUrl)));})()", "intro": "$.intro", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name", "tocUrl": "$.tocUrl", "wordCount": "$.wordCount"}, "ruleContent": {"content": "@js:\n(function(){return SQ_content(java,source,String(baseUrl));})()"}, "ruleExplore": {"author": "$.author", "bookList": "@js:\n(function(){var l=SQ_explore(java,source,String(baseUrl),1);var o=[],i;for(i=0;i<l.length;i++)o.push(JSON.stringify(l[i]));return o;})()", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "name": "$.name"}, "ruleSearch": {"author": "$.author", "bookList": "@js:\n(function(){var d='';try{d=(typeof result==='string')?result:String(result)}catch(e){};var l=SQ_searchBooks(d,source);var o=[],i;for(i=0;i<l.length;i++)o.push(JSON.stringify(l[i]));return o;})()", "bookUrl": "$.bookUrl", "checkKeyWord": "凡人修仙传", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name", "wordCount": "$.wordCount"}, "ruleToc": {"chapterList": "@js:\n(function(){var l=[];try{l=SQ_toc(java,source,String(baseUrl))}catch(e){return [];}var o=[],i;for(i=0;i<l.length;i++)o.push(JSON.stringify(l[i]));return o;})()", "chapterName": "$.title", "chapterUrl": "$.url"}, "searchUrl": "@js:\n(function(){var kw='';try{kw=String(key)}catch(e){var m=String(baseUrl).match(/[?&](?:q|key|kw)=([^&]*)/);if(m){try{kw=decodeURIComponent(m[1])}catch(e2){kw=m[1]}}};var pg=(typeof page!=='undefined'&&page)?Number(page):1;var last=0;try{last=Number(String(source.get('sqSearchTs')||'0'))||0}catch(e3){};var now=Date.now();var wait=3000-(now-last);if(wait>0&&wait<3000){var _done=false;try{java.sleep(wait);_done=true}catch(eS){};if(!_done){var _t=Date.now();while(Date.now()-_t<wait){}}}try{source.put('sqSearchTs',String(Date.now()))}catch(e4){};if(pg>1){return [];}return SQ_searchUrl(java,source,kw,pg);})()", "weight": 0},{"bookSourceName": "❄️听雪聚合", "bookSourceType": 0, "bookSourceUrl": "听雪聚合", "customButton": true, "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": true, "exploreUrl": "@js:\nvar conf = ensureConfig.call(this);\nvar currentSource = conf.source || '';\nvar currentGender = conf.gender || 'boy';\n\nvar srcList = getSourceList.call(this);\nvar srcMeta = {};\nfor (var i = 0; i < srcList.length; i++) {\n    srcMeta[srcList[i].name] = srcList[i];\n}\n\nvar currentMode = conf.mode || 'novel';\nvar firstSource = String(currentSource || '').split(',')[0].trim();\nif (firstSource && srcMeta[firstSource] && srcMeta[firstSource].tab) {\n    currentMode = srcMeta[firstSource].tab;\n}\n\nvar MODE_LABELS = {\n    novel: '📖小说',\n    audio: '🎧听书',\n    comic: '🌈漫画',\n    video: '▶️短剧',\n    download: '⬇️下载'\n};\nvar LABEL_TO_MODE = {\n    '📖小说': 'novel',\n    '🎧听书': 'audio',\n    '🌈漫画': 'comic',\n    '▶️短剧': 'video',\n    '⬇️下载': 'download'\n};\n\nvar srcOptions = [{ label: '☁️聚合搜索', value: '' }];\nfor (var i = 0; i < srcList.length; i++) {\n    var it = srcList[i];\n    if (it.tab && it.tab != currentMode) continue;\n    srcOptions.push({ label: it.name, value: it.name });\n}\n\nvar defaultLabel = '☁️聚合搜索';\nfor (var k = 0; k < srcOptions.length; k++) {\n    if (srcOptions[k].value == firstSource) { defaultLabel = srcOptions[k].label; break; }\n}\nvar srcMapStr = JSON.stringify(srcOptions).replace(/\\\\/g,'\\\\\\\\').replace(/\"/g,'\\\\\"');\n\nvar firstModeSource = '';\nfor (var i = 0; i < srcList.length; i++) {\n    if (srcList[i].tab == currentMode && srcList[i].name) { firstModeSource = srcList[i].name; break; }\n}\nvar useSource = firstSource || firstModeSource;\n\nvar controls = [];\ncontrols.push({ title: '☃关键词💭：书名/作者', type: 'text', style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.6 } });\ncontrols.push({ title: '🔍搜索', type: 'button', action: \"java.searchBook(infoMap['☃关键词💭：书名/作者'] || '')\", style: { layout_flexGrow: 1, layout_flexBasisPercent: -1, layout_alignSelf: 'baseline' } });\ncontrols.push({ title: '🔄刷新', type: 'button', action: 'java.refreshExplore()', style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.4, layout_alignSelf: 'baseline' } });\ncontrols.push({ title: '⚙登录', type: 'button', action: \"java.open('login','http',null)\", style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.4, layout_alignSelf: 'baseline' } });\n\ncontrols.push({\n    title: '性别',\n    type: 'select',\n    chars: ['♂️男频', '♀️女频'],\n    default: currentGender == 'girl' ? '♀️女频' : '♂️男频',\n    action: \"(function(){var raw=infoMap['性别']||'';var v=(raw.indexOf('女')>=0)?'girl':'boy';setConfig.call(this,{gender:v});java.refreshExplore();})()\",\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.4 }\n});\n\ncontrols.push({\n    title: '模式',\n    type: 'select',\n    chars: ['📖小说', '🎧听书', '🌈漫画', '▶️短剧', '⬇️下载'],\n    default: MODE_LABELS[currentMode] || '📖小说',\n    action: \"(function(){var raw=infoMap['模式']||'';var map=JSON.parse('\" + JSON.stringify(LABEL_TO_MODE).replace(/\\\\/g,'\\\\\\\\').replace(/\"/g,'\\\\\"') + \"');var v=map[raw]||'novel';setConfig.call(this,{mode:v,source:''});java.refreshExplore();})()\",\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.4 }\n});\n\ncontrols.push({\n    title: '源站',\n    type: 'select',\n    chars: srcOptions.map(function(x){return x.label;}),\n    default: defaultLabel,\n    action: \"(function(){var raw=infoMap['源站']||'';var opts=JSON.parse('\" + srcMapStr + \"');var map={};opts.forEach(function(i){map[i.label]=i.value;});setConfig.call(this,{source:map[raw]||''});java.refreshExplore();})()\",\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n});\n\nvar currentJjTab = getConfig.call(this).jj_tab || '多元';\nif (String(useSource).indexOf('晋江') >= 0) {\n    var jjTabs = [\"🏷 言情\", \"🏷 纯爱\", \"🏷 百合\", \"🏷 无Cp\", \"🏷 多元\"];\n    var jjTagMap = {\"🏷 言情\":\"言情\",\"🏷 纯爱\":\"纯爱\",\"🏷 百合\":\"百合\",\"🏷 无Cp\":\"无Cp\",\"🏷 多元\":\"多元\"};\n    var jjTagMapStr = JSON.stringify(jjTagMap).replace(/\\\\/g,'\\\\\\\\').replace(/\"/g,'\\\\\"');\n\n    controls.push({\n        title: '频道',\n        type: 'select',\n        chars: jjTabs,\n        default: \"🏷 \" + currentJjTab,\n        action: \"(function(){var raw=infoMap['频道']||'';var tagMap=JSON.parse('\" + jjTagMapStr + \"');var tagName=tagMap[raw]||'多元';setConfig.call(this,{jj_tab:tagName});java.refreshExplore();})()\",\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n    });\n}\n\nvar sort = controls.slice();\n\n/* v41.24：发现页书架（聚合/番茄显示番茄，晋江显示晋江；其他源不显示） */\nvar shelfEntries = [];\nvar shelfFirstSource = String(firstSource || '').trim();\nvar showFanqieShelf = shelfFirstSource == '' || shelfFirstSource.indexOf('番茄') >= 0;\nvar showJjShelf = shelfFirstSource.indexOf('晋江') >= 0;\n\nfunction shelfUrl(sourceName, loginValue, groupValue) {\n    return getHost.call(this) + '/api/bookshelf,' + JSON.stringify({\n        method: 'POST',\n        body: JSON.stringify({\n            source: sourceName,\n            logins: String(loginValue || ''),\n            group: String(groupValue || '')\n        }),\n        headers: buildHeaders.call(this)\n    });\n}\n\nfunction makeShelfBookList(sourceName, loginValue) {\n    try {\n        var shelfRes = postJson.call(this, '/api/bookshelf', {\n            source: sourceName,\n            logins: String(loginValue || ''),\n            group: ''\n        });\n        if (shelfRes && shelfRes.code == 0 && Array.isArray(shelfRes.data)) {\n            return shelfRes.data;\n        }\n    } catch (e) {}\n    return [];\n}\n\nfunction shelfGroups(books) {\n    var seen = {};\n    var groups = [];\n    for (var i = 0; i < books.length; i++) {\n        var g = String((books[i] && (books[i].group_name || books[i].group_id)) || '').trim();\n        if (!g || seen[g]) continue;\n        seen[g] = true;\n        groups.push(g);\n    }\n    return groups;\n}\n\nfunction pushShelfDivider() {\n    shelfEntries.push({\n        title: '────────',\n        url: '',\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n    });\n}\n\nvar fqSession = getSessionId.call(this) || getSessionIdFromCookie.call(this);\nif (showFanqieShelf && fqSession) {\n    var fqBooks = makeShelfBookList.call(this, '番茄', fqSession);\n    var fqGroups = shelfGroups(fqBooks);\n    var fqName = '';\n    try {\n        var userRaw = java.ajax('https://fanqienovel.com/api/user/info/v2,' + JSON.stringify({\n            method: 'GET',\n            headers: { Cookie: 'sessionid=' + fqSession }\n        }));\n        var userObj = JSON.parse(userRaw);\n        fqName = String(userObj && userObj.data && userObj.data.name || '');\n    } catch (e) {}\n\n    shelfEntries.push({\n        title: (fqName ? fqName + ' 的个人中心' : '我的番茄书架'),\n        url: '',\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n    });\n    shelfEntries.push({\n        title: '我的书架（全部）',\n        url: shelfUrl.call(this, '番茄', fqSession, ''),\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.5 }\n    });\n    for (var fg = 0; fg < fqGroups.length; fg++) {\n        shelfEntries.push({\n            title: '📁 ' + fqGroups[fg],\n            url: shelfUrl.call(this, '番茄', fqSession, fqGroups[fg]),\n            style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.4 }\n        });\n    }\n\n    pushShelfDivider();\n}\n\nvar jjLogin = getJjToken.call(this);\nif (showJjShelf && jjLogin) {\n    var jjBooks = makeShelfBookList.call(this, '晋江', jjLogin);\n    var jjGroups = shelfGroups(jjBooks);\n\n    shelfEntries.push({\n        title: '📁 个人书架',\n        url: '',\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n    });\n    shelfEntries.push({\n        title: '📓 全部收藏',\n        url: shelfUrl.call(this, '晋江', jjLogin, ''),\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.5 }\n    });\n    for (var jg = 0; jg < jjGroups.length; jg++) {\n        shelfEntries.push({\n            title: '📁 ' + jjGroups[jg],\n            url: shelfUrl.call(this, '晋江', jjLogin, jjGroups[jg]),\n            style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.4 }\n        });\n    }\n\n    pushShelfDivider();\n}\n\nif (shelfEntries.length) {\n    sort = sort.concat(shelfEntries);\n}\n\nvar useGender = (currentMode == 'audio') ? 'boy' : currentGender;\n\ntry {\n    var d = postJson.call(this, '/api/discover', { source: useSource, gender: useGender, tab: currentJjTab });\n    if (d && d.code != 0) {\n        java.toast(d.message);\n    }\n    var data = (d && Array.isArray(d.data)) ? d.data : [];\n    if (data.length > 0) {\n        data.forEach(function (t) {\n            if (!t) return;\n            var st = (t.style && typeof t.style == 'object' && !Array.isArray(t.style)) ? t.style : { layout_flexGrow: 1, layout_flexBasisPercent: 0.3 };\n            var link = t.sing\n                ? (getHost.call(this) + '/api/discover/books,' + JSON.stringify({\n                    method: 'POST',\n                    body: JSON.stringify({\n                        sing: t.sing,\n                        gender: useGender,\n                        source: useSource,\n                        tab: currentJjTab || '',\n                        page: '{{page}}'\n                    })\n                }))\n                : '';\n            sort.push({ title: String(t.title || ''), url: link, style: st });\n        });\n    } else {\n        sort.push({ title: '【' + (useSource || '聚合') + '】暂无发现页数据', url: '', style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } });\n    }\n} catch (e) {\n    sort.push({ title: '发现页加载失败，请检查服务器/登录', url: '', style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } });\n}\nJSON.stringify(sort);", "header": "@js:\nJSON.stringify(buildHeaders.call(this));", "jsLib": "let localVersion = '1.20261107.2';  //本地版本号\n\nfunction getHosts() {\n    return [\n    'https://tingx.abrdns.com',\n    'http://154.12.85.126:5000'\n    ];\n}\n\nfunction getHost() {\n    let { source } = this;\n    let c = getConfig.call(this);\n    if (c.host) return String(c.host).replace(/\\/+$/, '');\n    let base = '';\n    try { base = \"https://tingx.abrdns.com\"; } catch (e) {}\n    if (!base && typeof baseUrl !== 'undefined' && baseUrl) base = String(baseUrl);\n    if (!base) base = getHosts()[0];\n    return base.replace(/\\/+$/, '');\n}\n\nfunction getConfig() {\n    let { source } = this;\n    try {\n        let configStr = source.getVariable();\n        if (!configStr || configStr.trim() == \"\") return {};\n        let config = JSON.parse(configStr);\n        if (Array.isArray(config)) return config[0] || {};\n        if (config && typeof config == 'object') return config;\n        return {};\n    } catch (e) { return {}; }\n}\n\nfunction setConfig(obj) {\n    let { source } = this;\n    try {\n        let config = getConfig.call(this);\n        for (let k in obj) { if (obj.hasOwnProperty(k)) config[k] = obj[k]; }\n        source.setVariable(JSON.stringify([config]));\n        return true;\n    } catch (e) { return false; }\n}\n\nfunction ensureConfig() {\n    let c = getConfig.call(this);\n    let changed = false;\n    if (!c.gender) { c.gender = 'boy'; changed = true; }\n    if (c.source == undefined) { c.source = ''; changed = true; }\n    if (!c.sources) { c.sources = { novel: [], audio: [], comic: [], video: [], download: [] }; changed = true; }\n    if (changed) setConfig.call(this, c);\n    return c;\n}\n\nfunction deviceType() {\n    let { java } = this;\n    try {\n        var id = java.deviceID();\n        if (id && id !== '') {\n            return true;\n        }\n    } catch (e) {}\n    \n    try {\n        var id = java.androidId();\n        if (id && id !== '') {\n            return false;\n        }\n    } catch (e) {}\n    \n    return false;\n}\n\nfunction getDeviceId() {\n    let { java } = this;\n    let dev = '';\n    try { let id1 = java.deviceID(); if (id1 && String(id1) !== '') dev = String(id1); } catch (e) {}\n    if (!dev) { try { let id2 = java.androidId(); if (id2 && String(id2) !== '') dev = String(id2); } catch (e) {} }\n    return dev;\n}\n\nfunction checkMsg(res) {\n    let { java } = this;\n    try {\n        let obj = JSON.parse(res);\n        if (obj.code !== 0) {\n            java.toast(obj.message);\n        }\n    } catch (e) {}\n    return res;\n}\n\nfunction getToken() {\n    let { source } = this;\n    let b64 = '';\n    try { b64 = String(source.getLoginHeader() || '').trim(); } catch (e) {}\n    return { b64: b64 };\n}\n\nfunction buildHeaders() {\n    let { java } = this;\n    let t = getToken.call(this);\n    let dev = getDeviceId.call(this);\n    let ts = String(Math.floor(Date.now() / 1000));\n\n    let plain = '';\n    if (t.b64) {\n        try { plain = java.base64Decode(t.b64); } catch (e) { plain = ''; }\n    }\n\n    return {\n        'User-Agent': java.getWebViewUA(),\n        'x-novel-token': t.b64,\n        'x-novel-deviceid': dev,\n        'x-novel-timestamap': ts,\n        'x-novel-public': java.md5Encode(plain + dev + ts).toLowerCase(),\n        'x-novel-version': '10'\n    };\n}\n\nfunction postJson(path, obj) {\n    let { java } = this;\n    let headers = buildHeaders.call(this);\n    headers['Content-Type'] = 'application/json';\n    let opt = { method: 'POST', body: JSON.stringify(obj || {}), headers: headers };\n    let res = java.ajax(getHost.call(this) + path + ',' + JSON.stringify(opt));\n    res = decryptIfEncrypted.call(this, res);\n    try { return JSON.parse(res); } catch (e) { return { code: -1, message: '解析失败', raw: res }; }\n}\n\nfunction getSourceList() {\n    let list = [];\n    try {\n        let arr = postJson.call(this, '/api/source', {});\n        if (Array.isArray(arr)) {\n            arr.forEach(function (it) { if (it && it.enabled && it.name) list.push(it); });\n            list.sort(function (a, b) { return (a.sort || 0) - (b.sort || 0); });\n        }\n    } catch (e) {}\n    return list;\n}\n\nfunction getCmtBrowserOptions() {\n    return {\n        expandedCornersRadius: 20,\n        dismissOnTouchOutside: true,\n        isDraggable: true,\n        shouldDimBackground: true,\n        backgroundDimAmount: 0.5,\n        hardwareAccelerated: true,\n        isNestedScrollingEnabled: true,\n        isGestureInsetBottomIgnored: true,\n        setFitToContents: false,\n        heightPercentage: 0.75,\n        isHideable: true\n    };\n}\n\nfunction showCmt(bid, cid, para, date, sourceName) {\n    let { java } = this;\n    let url = getHost.call(this) + '/comment'\n            + '?tab=paras&book_id=' + bid\n            + '&item_id=' + cid\n            + '&para=' + para\n            + '&source=' + (sourceName || '');\n    try {\n        java.showBrowser(url, null, 'window.java=java;', JSON.stringify(getCmtBrowserOptions.call(this)));\n    } catch (e) {\n        try { java.startBrowser(url, '段评'); } catch (e2) {\n            java.toast('打开段评失败：' + e2);\n        }\n    }\n}\n\nfunction getSessionId() {\n    let config = getConfig.call(this);\n    return String(config.fanqie_sessionid || '');\n}\n\nfunction getSessionIdFromCookie() {\n    const { cookie } = this;\n    try {\n        let cookieHeader = String(cookie.getCookie('fanqienovel.com'));\n        let sessionId = cookieHeader.match(/sessionid=([^;]+)/)?.[1] || null;\n        if (sessionId) return sessionId;\n    } catch (e) {}\n    return \"\";\n}\n\nfunction getJjToken() {\n    let { source } = this;\n    let config = getConfig.call(this);\n\n    let loginInfoKey = '';\n    try {\n        let info = source.getLoginInfoMap() || {};\n        loginInfoKey = String(info.get('晋江登录Token') || '').trim();\n    } catch (e) {}\n\n    if (loginInfoKey) return loginInfoKey;\n\n    return String(config.jj_token || '').trim();\n}\n\nfunction buildJjHeaders() {\n    let { java } = this;\n    return {\n        \"source\": \"android\",\n        \"versiontype\": \"reading\",\n        \"versioncode\": \"467\",\n        \"version-code\": \"467\",\n        \"User-Agent\": java.getWebViewUA()\n    };\n}\n\nfunction jjEncode(data) {\n    let { java } = this;\n    return java.createSymmetricCrypto(\"DES/CBC/PKCS5Padding\", \"KW8Dvm2N\", \"1ae2c94b\").encryptBase64(data);\n}\n\nfunction isShelfSyncEnabled() {\n    try {\n        return String(getConfig.call(this).shelf_sync || 'off') == 'on';\n    } catch (e) {\n        return false;\n    }\n}\n\nfunction syncShelf(isAdd) {\n    let { java, book } = this;\n    try {\n        if (!book || !book.tocUrl) return;\n        let raw = String(book.tocUrl || '').replace(/\\\\/g, '').replace(/^data:catalogUrl;base64,/, '');\n        let idx = raw.indexOf(',');\n        if (idx >= 0) raw = raw.substring(0, idx);\n        raw = raw.replace(/[^A-Za-z0-9+/=]/g, '');\n        let catalog = JSON.parse(String(java.base64Decode(raw) || '').replace(/\\\\/g, ''));\n        let sourceName = String(catalog.source || '');\n        let bookId = String(catalog.book_id || catalog.bookid || '');\n        if (!bookId) return;\n\n        let apiSource = '';\n        let logins = '';\n        if (sourceName.indexOf('番茄') >= 0) {\n            apiSource = '番茄';\n            logins = getSessionId.call(this) || getSessionIdFromCookie.call(this);\n        } else if (sourceName.indexOf('晋江') >= 0) {\n            apiSource = '晋江';\n            logins = getJjToken.call(this);\n        }\n        if (!apiSource || !logins) {\n            java.toast('书架同步：请先登录' + apiSource);\n            return;\n        }\n\n        let res = postJson.call(this, '/api/bookshelf/sync', {\n            source: apiSource,\n            logins: String(logins),\n            book_id: bookId,\n            action: isAdd ? 'add' : 'del',\n            group: ''\n        });\n        if (res && res.code == 0) {\n            java.toast((isAdd ? '已同步到' : '已从') + apiSource + (isAdd ? '书架' : '书架移除'));\n        } else {\n            java.toast((res && res.message) || '书架同步失败');\n        }\n    } catch (e) {\n        java.log('syncShelf error: ' + e);\n        java.toast('书架同步失败');\n    }\n}\n\nfunction syncProgress(chapterParams) {\n    let { java } = this;\n    try {\n        let conf = getConfig.call(this);\n        if ((conf.progress_sync || 'off') != 'on') return;\n\n        let sourceName = String(chapterParams.source || '');\n        let logins = '';\n        if (/^晋江/.test(sourceName)) {\n            logins = String(conf.jj_token || '');\n        } else if (/^番茄/.test(sourceName)) {\n            logins = String(conf.fanqie_sessionid || '');\n        }\n        if (!logins) return;\n\n        let headers = buildHeaders.call(this);\n        headers['Content-Type'] = 'application/json';\n\n        let body = JSON.stringify({\n            source: sourceName,\n            book_id: String(chapterParams.book_id || ''),\n            item_id: String(chapterParams.item_id || ''),\n            logins: logins\n        });\n\n        let opt = { method: 'POST', body: body, headers: headers };\n        let res = java.ajax(getHost.call(this) + '/api/progress,' + JSON.stringify(opt));\n        res = decryptIfEncrypted.call(this, res);\n        let obj = JSON.parse(res);\n        if (obj.code !== 0) java.log('进度同步失败：' + (obj.message || '未知错误'));\n    } catch (e) {\n        java.log('进度同步异常：' + e);\n    }\n}\n\nfunction decryptIfEncrypted(res) {\n    let raw = String(res == undefined || res == null ? '' : res).trim();\n    if (!raw) return res;\n\n    if (raw.indexOf('\"aes-256-gcm\"') >= 0 && raw.charAt(0) == '{') {\n        try {\n            let obj = JSON.parse(raw);\n            if (obj.alg == 'aes-256-gcm' && obj.data && obj.iv && obj.tag) {\n                return aesGcmDecrypt.call(this, raw);\n            }\n            if (obj.data && typeof obj.data == 'object' && obj.data.alg == 'aes-256-gcm') {\n                let dec = aesGcmDecrypt.call(this, obj.data);\n                try { obj.data = JSON.parse(dec); }\n                catch (e) { obj.data = dec; }\n                return JSON.stringify(obj);\n            }\n        } catch (e) {}\n    }\n    return res;\n}\n\nfunction aesGcmDecrypt(payload) {\n    let { java } = this;\n    let obj = null;\n    try {\n        obj = (typeof payload == 'string') ? JSON.parse(payload) : payload;\n        if (!obj || obj.alg !== 'aes-256-gcm' || !obj.data || !obj.iv || !obj.tag) return payload;\n    } catch (e) { return payload; }\n\n    try {\n        let C = Packages.javax.crypto.Cipher;\n        let K = Packages.javax.crypto.spec.SecretKeySpec;\n        let G = Packages.javax.crypto.spec.GCMParameterSpec;\n        let S = Packages.java.lang.String;\n        let A = Packages.java.util.Arrays;\n        let Sys = Packages.java.lang.System;\n\n        let keyBytes = new S(\"Lk4#Fj9&Gh1*Ds6^Qw3!Er8@Ty5%Ui0o\").getBytes(\"UTF-8\");\n        let ivBytes = java.base64DecodeToByteArray(obj.iv);\n        let tagBytes = java.base64DecodeToByteArray(obj.tag);\n        let dataBytes = java.base64DecodeToByteArray(obj.data);\n\n        let combined = A.copyOf(dataBytes, dataBytes.length + tagBytes.length);\n        Sys.arraycopy(tagBytes, 0, combined, dataBytes.length, tagBytes.length);\n\n        let cipher = C.getInstance(\"AES/GCM/NoPadding\");\n        cipher.init(C.DECRYPT_MODE, new K(keyBytes, \"AES\"), new G(128, ivBytes));\n        return new S(cipher.doFinal(combined), \"UTF-8\").toString();\n    } catch (e) {}\n\n    try {\n        function b64dec(s) {\n            let T = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n            let out = [], v = 0, bits = 0;\n            s = String(s).replace(/[^A-Za-z0-9+/]/g, '');\n            for (let i = 0; i < s.length; i++) {\n                v = (v << 6) | T.indexOf(s.charAt(i));\n                bits += 6;\n                if (bits >= 8) { bits -= 8; out.push((v >> bits) & 0xFF); }\n            }\n            return out;\n        }\n        function utf8dec(plain) {\n            let s = '', buf = [];\n            for (let i = 0; i < plain.length; i++) {\n                let c = plain[i];\n                if (c < 0x80) buf.push(c);\n                else if (c < 0xE0) buf.push(((c & 0x1F) << 6) | (plain[++i] & 0x3F));\n                else if (c < 0xF0) buf.push(((c & 0x0F) << 12) | ((plain[++i] & 0x3F) << 6) | (plain[++i] & 0x3F));\n                else {\n                    let cp = ((c & 0x07) << 18) | ((plain[++i] & 0x3F) << 12) | ((plain[++i] & 0x3F) << 6) | (plain[++i] & 0x3F);\n                    cp -= 0x10000;\n                    buf.push(0xD800 + (cp >> 10), 0xDC00 + (cp & 0x3FF));\n                }\n                if (buf.length > 4096) { s += String.fromCharCode.apply(null, buf); buf = []; }\n            }\n            s += String.fromCharCode.apply(null, buf);\n            return s;\n        }\n\n        let SBOX = [\n            0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76,\n            0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0,\n            0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15,\n            0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75,\n            0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84,\n            0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf,\n            0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8,\n            0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2,\n            0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73,\n            0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb,\n            0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79,\n            0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08,\n            0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a,\n            0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e,\n            0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf,\n            0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16\n        ];\n        function xtime(a) { return ((a << 1) ^ (a & 0x80 ? 0x1b : 0)) & 0xFF; }\n        function gmul(a, b) {\n            let p = 0;\n            for (let i = 0; i < 8; i++) {\n                if (b & 1) p ^= a;\n                let hi = a & 0x80;\n                a = (a << 1) & 0xFF;\n                if (hi) a ^= 0x1b;\n                b >>= 1;\n            }\n            return p;\n        }\n        function expandKey(key) {\n            let Nk = 8, w = [], rcon = 1;\n            for (let i = 0; i < Nk; i++) w.push([key[4*i], key[4*i+1], key[4*i+2], key[4*i+3]]);\n            for (let i = Nk; i < 60; i++) {\n                let t = w[i-1].slice();\n                if (i % Nk == 0) {\n                    t = [t[1], t[2], t[3], t[0]].map(x => SBOX[x]);\n                    t[0] ^= rcon;\n                    rcon = xtime(rcon);\n                } else if (i % Nk == 4) {\n                    t = t.map(x => SBOX[x]);\n                }\n                w.push([w[i-Nk][0]^t[0], w[i-Nk][1]^t[1], w[i-Nk][2]^t[2], w[i-Nk][3]^t[3]]);\n            }\n            let rk = [];\n            for (let i = 0; i < w.length; i++) rk.push(w[i][0], w[i][1], w[i][2], w[i][3]);\n            return rk;\n        }\n        function encryptBlock(rk, input) {\n            let st = input.slice(0, 16);\n            for (let i = 0; i < 16; i++) st[i] ^= rk[i];\n            for (let round = 1; round <= 14; round++) {\n                for (let i = 0; i < 16; i++) st[i] = SBOX[st[i]];\n                let t = st.slice();\n                for (let r = 1; r < 4; r++)\n                    for (let c = 0; c < 4; c++)\n                        st[r + 4*c] = t[r + 4*((c + r) % 4)];\n                if (round !== 14) {\n                    for (let c = 0; c < 4; c++) {\n                        let i = 4*c;\n                        let a0 = st[i], a1 = st[i+1], a2 = st[i+2], a3 = st[i+3];\n                        st[i]   = gmul(a0,2)^gmul(a1,3)^a2^a3;\n                        st[i+1] = a0^gmul(a1,2)^gmul(a2,3)^a3;\n                        st[i+2] = a0^a1^gmul(a2,2)^gmul(a3,3);\n                        st[i+3] = gmul(a0,3)^a1^a2^gmul(a3,2);\n                    }\n                }\n                for (let i = 0; i < 16; i++) st[i] ^= rk[round*16 + i];\n            }\n            return st;\n        }\n        function gfMul(x, y) {\n            let z = new Array(16).fill(0);\n            let v = y.slice();\n            for (let i = 0; i < 128; i++) {\n                if ((x[i >> 3] >> (7 - (i & 7))) & 1) {\n                    for (let j = 0; j < 16; j++) z[j] ^= v[j];\n                }\n                let lsb = v[15] & 1;\n                for (let j = 15; j > 0; j--) v[j] = ((v[j] >> 1) | ((v[j-1] & 1) << 7)) & 0xFF;\n                v[0] >>= 1;\n                if (lsb) v[0] ^= 0xE1;\n            }\n            return z;\n        }\n        function writeBitsBE(arr, offset, bits) {\n            for (let i = 0; i < 8; i++) {\n                arr[offset + 7 - i] = bits % 256;\n                bits = Math.floor(bits / 256);\n            }\n        }\n        function ghash(H, data, aadBits, ctBits) {\n            let y = new Array(16).fill(0);\n            for (let i = 0; i < data.length; i += 16) {\n                let block = new Array(16).fill(0);\n                for (let j = 0; j < 16 && i + j < data.length; j++) block[j] = data[i+j];\n                for (let j = 0; j < 16; j++) y[j] ^= block[j];\n                y = gfMul(y, H);\n            }\n            let lenBlock = new Array(16).fill(0);\n            writeBitsBE(lenBlock, 0, aadBits);\n            writeBitsBE(lenBlock, 8, ctBits);\n            for (let j = 0; j < 16; j++) y[j] ^= lenBlock[j];\n            y = gfMul(y, H);\n            return y;\n        }\n        function inc32(block) {\n            for (let i = 15; i >= 12; i--) {\n                block[i] = (block[i] + 1) & 0xFF;\n                if (block[i] !== 0) break;\n            }\n        }\n        function gcmDecrypt(key, iv, ct, tag) {\n            let rk = expandKey(key);\n            let H = encryptBlock(rk, new Array(16).fill(0));\n            let J0;\n            if (iv.length == 12) J0 = iv.concat([0, 0, 0, 1]);\n            else J0 = ghash(H, iv, 0, iv.length * 8);\n            let S = ghash(H, ct, 0, ct.length * 8);\n            let ej0 = encryptBlock(rk, J0);\n            let calcTag = new Array(16);\n            for (let i = 0; i < 16; i++) calcTag[i] = S[i] ^ ej0[i];\n            for (let i = 0; i < 16; i++) {\n                if (calcTag[i] !== tag[i]) return null;\n            }\n            let out = [];\n            let ctr = J0.slice();\n            for (let i = 0; i < ct.length; i += 16) {\n                inc32(ctr);\n                let ks = encryptBlock(rk, ctr);\n                for (let j = 0; j < 16 && i + j < ct.length; j++) {\n                    out.push(ct[i+j] ^ ks[j]);\n                }\n            }\n            return out;\n        }\n\n        let key = [];\n        let keyStr = \"Lk4#Fj9&Gh1*Ds6^Qw3!Er8@Ty5%Ui0o\";\n        for (let i = 0; i < keyStr.length; i++) key.push(keyStr.charCodeAt(i) & 0xFF);\n\n        let iv = b64dec(obj.iv);\n        let tag = b64dec(obj.tag);\n        let ct = b64dec(obj.data);\n\n        let plain = gcmDecrypt(key, iv, ct, tag);\n        if (!plain) return payload;\n        return utf8dec(plain);\n    } catch (e) {\n        return payload;\n    }\n}\n\nfunction getJjShelfClass() {\n    let { java } = this;\n    try {\n        var token = getJjToken.call(this);\n        if (!token) {\n            java.toast(\"请先配置晋江登录Token\");\n            return;\n        }\n\n        var url = \"https://app.jjwxc.org/app.jjwxc/android/reading/FavoriteClass/favoriteClass\";\n        var body = encode.call(this, JSON.stringify({\n            \"versionCode\": \"444\",\n            \"token\": token\n        }));\n\n        var headers = {\n            \"versioncode\": \"444\",\n            \"versiontype\": \"reading\",\n            \"User-Agent\": java.getWebViewUA()\n        };\n\n        var res = java.post(url, body, headers).body();\n        var data = JSON.parse(res);\n\n        if (!data || !data.data || !data.data.length) {\n            java.log(\"获取分类失败: \" + res);\n            java.toast(\"获取分类失败，请检查登录状态\");\n            return;\n        }\n\n        var excludeIds = { \"-1\": true, \"-2\": true, \"-3\": true };\n        var classList = [];\n        for (var i = 0; i < data.data.length; i++) {\n            var item = data.data[i];\n            var cid = String(item.classid);\n            if (excludeIds[cid]) continue;\n            classList.push({\n                classId: cid,\n                className: String(item.classname)\n            });\n        }\n\n        if (classList.length == 0) {\n            java.toast(\"暂无可用分类\");\n            return;\n        }\n\n        var config = getConfig.call(this);\n        var savedId = String(config.type_id || \"\");\n\n        var cardsHtml = \"\";\n        for (var j = 0; j < classList.length; j++) {\n            var c = classList[j];\n            var selected = (String(c.classId) == savedId) ? \" selected\" : \"\";\n            cardsHtml +=\n                '<div class=\"class-card' + selected + '\" data-id=\"' + c.classId + '\" onclick=\"pick(this)\">' +\n                    '<div class=\"class-name\">' + c.className + '</div>' +\n                    '<div class=\"class-id\">ID: ' + c.classId + '</div>' +\n                '</div>';\n        }\n\n        var html = `<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no\">\n<title>晋江收藏分类</title>\n<style>\n*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}\nbody{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;background:#0a0a0f;background-image:radial-gradient(ellipse at 30% 20%, #2a1020 0%, #0a0e27 50%, #1a0d1a 100%);color:#e8e8f0;min-height:100vh;padding:20px}\n.header{text-align:center;padding:10px 0 18px}\n.header h1{font-size:1.3rem;font-weight:800;background:linear-gradient(135deg,#e8e8f0 40%,#c14a63);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}\n.header p{font-size:.72rem;color:#8888a0;margin-top:4px}\n.current-bar{display:flex;align-items:center;gap:8px;padding:10px 14px;margin-bottom:16px;background:rgba(193,74,99,.1);border:1px solid rgba(193,74,99,.3);border-radius:10px;font-size:.74rem;color:rgba(255,255,255,.85)}\n.current-bar strong{color:#fff}\n.grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}\n.class-card{position:relative;padding:16px 10px;border-radius:14px;background:rgba(255,255,255,.04);border:2px solid rgba(255,255,255,.08);cursor:pointer;transition:all .25s;text-align:center}\n.class-card:hover{border-color:rgba(255,255,255,.2);background:rgba(255,255,255,.08)}\n.class-card.selected{border-color:#c14a63;background:rgba(193,74,99,.18);box-shadow:0 0 20px rgba(193,74,99,.3)}\n.class-card.selected::after{content:'✓';position:absolute;top:6px;right:8px;width:18px;height:18px;border-radius:50%;background:#c14a63;color:#fff;font-size:11px;display:flex;align-items:center;justify-content:center}\n.class-name{font-size:.8rem;font-weight:600;color:rgba(255,255,255,.9);word-break:break-all}\n.class-id{font-size:.62rem;color:rgba(255,255,255,.4);margin-top:4px}\n.tip{text-align:center;font-size:.68rem;color:rgba(255,255,255,.35);margin-top:20px}\n</style>\n</head>\n<body>\n<div class=\"header\">\n    <h1>晋江收藏分类</h1>\n    <p>选择后点击右上角 ✓ 保存</p>\n</div>\n<div class=\"current-bar\">\n    <span>当前已选择分类ID：<strong id=\"currentId\">` + (savedId || \"-\") + `</strong></span>\n</div>\n<div class=\"grid\" id=\"grid\">` + cardsHtml + `</div>\n<div class=\"tip\">新分类请先在晋江 App 内创建</div>\n<div id=\"result-output\" style=\"display:none;\">` + savedId + `</div>\n<script>\nfunction pick(el){\n    document.querySelectorAll('.class-card').forEach(function(c){c.classList.remove('selected');});\n    el.classList.add('selected');\n    document.getElementById('currentId').textContent = el.getAttribute('data-id');\n    document.getElementById('result-output').textContent = el.getAttribute('data-id');\n}\n</script>\n</body>\n</html>`;\n\n        var base64 = \"data:text/html;base64,\" + java.base64Encode(html);\n        var result = java.startBrowserAwait(base64, \"晋江收藏分类\", false);\n\n        if (!result || !result.body()) {\n            java.toast(\"已取消分类设置\");\n            return;\n        }\n\n        var bodyHtml = result.body();\n        var match = bodyHtml.match(/<div id=\"result-output\"[^>]*>([^<]*)<\\/div>/);\n        var newId = \"\";\n        if (match && match[1]) {\n            newId = match[1].trim();\n        }\n\n        if (!newId) {\n            java.toast(\"未选择分类\");\n            return;\n        }\n\n        setConfig.call(this, 'type_id', String(newId));\n        java.toast(\"\\n已保存分类ID：\" + newId);\n\n    } catch (e) {\n        java.log(\"获取书架分类失败: \" + e);\n        java.toast(\"\\n获取书架分类失败\");\n    }\n}\n\nfunction selectSource() {\n    let { java } = this;\n    var base = getHost.call(this);\n    var list = [];\n    try {\n        var opt = { method: 'POST', body: '{}' };\n        var res = java.ajax(base + '/api/source,' + JSON.stringify(opt));\n        var arr = JSON.parse(res);\n        if (Array.isArray(arr)) {\n            for (var i = 0; i < arr.length; i++) {\n                var it = arr[i];\n                if (it && it.enabled && it.name) list.push(it);\n            }\n            list.sort(function (a, b) { return (a.sort || 0) - (b.sort || 0); });\n        }\n    } catch (e) {\n        java.toast('源站列表请求失败：' + e);\n        return;\n    }\n    if (!list.length) { java.toast('源站列表为空'); return; }\n\n    var conf = getConfig.call(this);\n    var TABS = ['novel', 'audio', 'comic', 'video', 'download'];\n    var TAB_LABEL = { novel: '小说', audio: '听书', comic: '漫画', video: '短剧', download: '下载' };\n    var TAB_ICON = { novel: 'fa-book-open', audio: 'fa-headphones', comic: 'fa-images', video: 'fa-film', download: 'fa-download' };\n\n    var sourcesCfg = conf.sources || {};\n    TABS.forEach(function (t) { if (!Array.isArray(sourcesCfg[t])) sourcesCfg[t] = []; });\n\n    var allCfg = Array.isArray(conf.allTabs) ? conf.allTabs.slice() : [];\n    TABS.forEach(function (t) {\n        if (sourcesCfg[t].length > 0 && allCfg.indexOf(t) !== -1) {\n            allCfg = allCfg.filter(function (x) { return x !== t; });\n        }\n    });\n\n    var tabMap = {};\n    for (var i = 0; i < list.length; i++) {\n        var item = list[i];\n        var tab = item.tab || 'novel';\n        if (TABS.indexOf(tab) == -1) continue;\n        if (!tabMap[tab]) tabMap[tab] = [];\n        tabMap[tab].push(item);\n    }\n\n    var tabsData = [];\n    for (var t = 0; t < TABS.length; t++) {\n        var tabKey = TABS[t];\n        var items = tabMap[tabKey] || [];\n        var selNames = sourcesCfg[tabKey] || [];\n        var isAll = allCfg.indexOf(tabKey) !== -1;\n        var cards = [];\n        cards.push({ name: '', label: '全部源站', all: true, sel: isAll, lv: '' });\n        for (var j = 0; j < items.length; j++) {\n            var it = items[j];\n            var lvNum = (it.group && it.group.level) ? Number(it.group.level) : Number(it.min_user_group || 1);\n            cards.push({\n                name: it.name,\n                label: it.name,\n                all: false,\n                sel: selNames.indexOf(it.name) !== -1,\n                lv: lvNum > 1 ? ('LV' + lvNum) : ''\n            });\n        }\n        tabsData.push({ tab: tabKey, label: TAB_LABEL[tabKey], icon: TAB_ICON[tabKey], cards: cards });\n    }\n\n    function jsonForHtml(v) {\n        return JSON.stringify(v).replace(/</g, '\\\\u003c').replace(/>/g, '\\\\u003e').replace(/&/g, '\\\\u0026');\n    }\n    var dataJson = jsonForHtml(tabsData);\n\n    var html = '<!DOCTYPE html><html lang=\"zh-CN\" data-theme=\"glass\" data-mode=\"light\"><head>' +\n        '<meta charset=\"UTF-8\">' +\n        '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover\">' +\n        '<meta name=\"theme-color\" content=\"#E8EEF6\">' +\n        '<title>源站选择</title>' +\n        '<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css\">' +\n        '<style>' +\n        ':root{' +\n        '--bg-rgb:232,238,246;--surface-rgb:255,255,255;--text-rgb:31,38,51;--muted-rgb:108,120,140;' +\n        '--line-rgb:150,165,190;--primary-rgb:91,124,250;' +\n        '--bg:#e8eef6;--surface:#ffffff;--surface-soft:#f6f9ff;--text:#1f2633;--muted:#6c788c;' +\n        '--primary:#5b7cfa;--primary-dark:#4363d8;--primary-ink:#f7f9ff;' +\n        '--border:rgba(var(--line-rgb),.18);--primary-soft:rgba(var(--primary-rgb),.08);' +\n        '--text-soft:rgba(var(--text-rgb),.78);--border-soft:rgba(var(--line-rgb),.16);' +\n        '--card-bg:rgba(var(--surface-rgb),.78);' +\n        '--radius-lg:20px;--radius:14px;--radius-sm:10px;' +\n        '--shadow:0 18px 40px -26px rgba(31,45,80,.35),0 2px 8px rgba(31,45,80,.05);' +\n        '--shadow-card:var(--shadow);' +\n        '--font-cn:\"PingFang SC\",\"Hiragino Sans GB\",\"Microsoft YaHei\",system-ui,-apple-system,\"Segoe UI\",Roboto,sans-serif;' +\n        '}' +\n        '*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}' +\n        'html{min-height:100%}' +\n        'body{margin:0;min-height:100vh;color:var(--text);font-family:var(--font-cn);font-size:15px;line-height:1.6;' +\n        'background:var(--bg);position:relative;overflow-x:hidden;' +\n        '-webkit-font-smoothing:antialiased;' +\n        'padding:calc(14px + env(safe-area-inset-top)) 14px calc(22px + env(safe-area-inset-bottom))}' +\n        'body::before{content:\"\";position:fixed;inset:0;z-index:0;pointer-events:none;' +\n        'background:radial-gradient(900px 520px at 12% -8%,rgba(var(--primary-rgb),.16),transparent 68%),' +\n        'radial-gradient(760px 480px at 94% 4%,rgba(120,220,230,.18),transparent 72%),' +\n        'linear-gradient(180deg,var(--bg),var(--bg))}' +\n        '.wrap{max-width:720px;margin:0 auto;position:relative;z-index:1}' +\n        '.glass{background:linear-gradient(155deg,rgba(var(--surface-rgb),.86),rgba(var(--surface-rgb),.58));' +\n        'border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-card);' +\n        'backdrop-filter:blur(22px) saturate(1.2);-webkit-backdrop-filter:blur(22px) saturate(1.2);' +\n        'animation:slideIn .5s cubic-bezier(.22,.61,.36,1)}' +\n        '@keyframes slideIn{from{opacity:0;transform:translateY(18px) scale(.99)}to{opacity:1;transform:none}}' +\n        '.hero{display:flex;align-items:center;gap:14px;padding:17px 18px;margin-bottom:12px}' +\n        '.hero-icon{flex:0 0 auto;width:46px;height:46px;border-radius:14px;display:flex;align-items:center;justify-content:center;font-size:20px;' +\n        'background:linear-gradient(135deg,var(--primary),var(--primary-dark));color:#fff;' +\n        'box-shadow:0 12px 24px -12px rgba(var(--primary-rgb),.85)}' +\n        '.hero h1{margin:0;font-size:19px;line-height:1.25;letter-spacing:.2px}' +\n        '.hero p{margin:5px 0 0;font-size:12px;line-height:1.55;color:var(--muted)}' +\n        '.tabs{display:flex;gap:6px;overflow-x:auto;padding:6px;margin-bottom:12px;scrollbar-width:none;-ms-overflow-style:none}' +\n        '.tabs::-webkit-scrollbar{display:none}' +\n        '.tab{flex:0 0 auto;display:inline-flex;align-items:center;gap:7px;border:1px solid transparent;background:transparent;color:var(--muted);' +\n        'padding:9px 12px;border-radius:12px;font:inherit;font-size:13px;font-weight:600;cursor:pointer;transition:.18s}' +\n        '.tab:hover{background:rgba(var(--surface-rgb),.5);color:var(--text)}' +\n        '.tab.on{background:var(--primary-soft);color:var(--primary);border-color:rgba(var(--primary-rgb),.28)}' +\n        '.tab i{font-size:13px}.tab-count{font-size:10px;line-height:1.6;padding:0 6px;border-radius:999px;background:rgba(var(--line-rgb),.14);opacity:.85}' +\n        '.panel{display:none}.panel.on{display:block;animation:fade .18s ease}' +\n        '@keyframes fade{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}' +\n        '.all-card{width:100%;display:flex;align-items:center;gap:10px;padding:14px 16px;margin-bottom:10px;border-radius:16px;' +\n        'border:1px solid var(--border);background:linear-gradient(155deg,rgba(var(--surface-rgb),.9),rgba(var(--surface-rgb),.6));' +\n        'box-shadow:0 12px 30px -24px rgba(31,45,80,.55);color:var(--text);font:inherit;text-align:left;cursor:pointer;transition:.18s}' +\n        '.all-card .ico{font-size:16px;color:var(--primary)}.all-card .t{flex:1;font-size:14px;font-weight:600}' +\n        '.all-card.sel{border-color:rgba(var(--primary-rgb),.5);background:linear-gradient(155deg,rgba(var(--primary-rgb),.16),rgba(var(--primary-rgb),.05));box-shadow:0 0 0 3px var(--primary-soft)}' +\n        '.check{flex:0 0 auto;width:22px;height:22px;border-radius:50%;border:1px solid var(--border);background:rgba(var(--surface-rgb),.6);' +\n        'display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:800;color:transparent;transition:.18s}' +\n        '.all-card.sel .check,.src-card.sel .check{background:var(--primary);border-color:var(--primary);color:#fff}' +\n        '.grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:9px}' +\n        '@media(max-width:520px){.grid{grid-template-columns:repeat(2,minmax(0,1fr))}}' +\n        '.src-card{position:relative;display:flex;align-items:center;justify-content:center;min-height:78px;padding:12px 10px 14px;' +\n        'border-radius:16px;border:1px solid var(--border);background:linear-gradient(155deg,rgba(var(--surface-rgb),.9),rgba(var(--surface-rgb),.6));' +\n        'box-shadow:0 12px 28px -24px rgba(31,45,80,.5);color:var(--text);font:inherit;font-size:12.5px;line-height:1.4;' +\n        'word-break:break-all;cursor:pointer;transition:.18s}' +\n        '.src-card:active{transform:scale(.97)}' +\n        '.src-card.sel{border-color:rgba(var(--primary-rgb),.52);background:linear-gradient(155deg,rgba(var(--primary-rgb),.16),rgba(var(--primary-rgb),.05));box-shadow:0 0 0 3px var(--primary-soft)}' +\n        '.src-card .name{max-width:100%;text-align:center}' +\n        '.src-card .lv{position:absolute;right:8px;bottom:7px;font-size:9px;font-weight:700;color:#b98a3a;background:rgba(185,138,58,.13);border:1px solid rgba(185,138,58,.32);padding:1px 5px;border-radius:6px}' +\n        '.src-card .check{position:absolute;top:7px;right:7px;width:18px;height:18px;font-size:10px}' +\n        '.empty{text-align:center;color:var(--muted);padding:38px 12px;font-size:13px}' +\n        '.tips{display:flex;align-items:center;gap:9px;margin-top:14px;padding:12px 16px;border-radius:16px;color:var(--muted);font-size:12px;line-height:1.55}' +\n        '.tips .dot{flex:0 0 auto;width:7px;height:7px;border-radius:50%;background:var(--primary);box-shadow:0 0 0 4px var(--primary-soft)}' +\n        '.tips b{color:var(--text)}' +\n        '</style></head><body><div class=\"wrap\">' +\n        '<header class=\"hero glass\"><div class=\"hero-icon\"><i class=\"fa-solid fa-satellite-dish\"></i></div><div><h1>源站选择</h1><p>按分类多选，点选需要的站点；「全部源站」与具体源站互斥</p></div></header>' +\n        '<div class=\"tabs glass\" id=\"tabs\" role=\"tablist\"></div>' +\n        '<main id=\"panels\"></main>' +\n        '<footer class=\"tips glass\"><span class=\"dot\"></span><span id=\"sel-tip\">已选 <b id=\"sel-count\">0</b> 个源站</span></footer>' +\n        '</div><div id=\"result-output\" style=\"display:none;\"></div>' +\n        '<script>' +\n        'var DATA=' + dataJson + ';' +\n        'var curTab=DATA.length?DATA[0].tab:\"novel\";' +\n        'var tabsEl=document.getElementById(\"tabs\"),panelsEl=document.getElementById(\"panels\"),outEl=document.getElementById(\"result-output\");' +\n        'function esc(v){return String(v==undefined?\"\":v).replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/\\'/g,\"&#39;\");}' +\n        'function renderTabs(){var h=\"\";for(var i=0;i<DATA.length;i++){var g=DATA[i];var n=g.cards.length>1?g.cards.length-1:0;' +\n        'h+=\"<button type=\\\\\"button\\\\\" class=\\\\\"tab\"+(g.tab==curTab?\" on\":\"\")+\"\\\\\" role=\\\\\"tab\\\\\" data-tab=\\\\\"\"+esc(g.tab)+\"\\\\\"><i class=\\\\\"fa-solid \"+g.icon+\"\\\\\"></i>\"+esc(g.label)+\"<span class=\\\\\"tab-count\\\\\">\"+n+\"</span></button>\";}tabsEl.innerHTML=h;}' +\n        'function renderPanels(){var h=\"\";for(var i=0;i<DATA.length;i++){var g=DATA[i];h+=\"<section class=\\\\\"panel\"+(g.tab==curTab?\" on\":\"\")+\"\\\\\" data-panel=\\\\\"\"+esc(g.tab)+\"\\\\\">\";' +\n        'var all=g.cards[0];h+=\"<button type=\\\\\"button\\\\\" class=\\\\\"all-card\"+(all.sel?\" sel\":\"\")+\"\\\\\" data-all=\\\\\"1\\\\\" data-name=\\\\\"\\\\\"><i class=\\\\\"fa-solid fa-globe ico\\\\\"></i><span class=\\\\\"t\\\\\">全部源站</span><span class=\\\\\"check\\\\\"><i class=\\\\\"fa-solid fa-check\\\\\"></i></span></button>\";' +\n        'var others=g.cards.slice(1);if(!others.length){h+=\"<div class=\\\\\"empty\\\\\">该分类暂无源站</div>\";}else{h+=\"<div class=\\\\\"grid\\\\\">\";' +\n        'for(var j=0;j<others.length;j++){var c=others[j];h+=\"<button type=\\\\\"button\\\\\" class=\\\\\"src-card\"+(c.sel?\" sel\":\"\")+\"\\\\\" data-name=\\\\\"\"+esc(c.name)+\"\\\\\"><span class=\\\\\"name\\\\\">\"+esc(c.label)+\"</span>\"+(c.lv?\"<span class=\\\\\"lv\\\\\">\"+esc(c.lv)+\"</span>\":\"\")+\"<span class=\\\\\"check\\\\\"><i class=\\\\\"fa-solid fa-check\\\\\"></i></span></button>\";}' +\n        'h+=\"</div>\";}h+=\"</section>\";}panelsEl.innerHTML=h;}' +\n        'function renderAll(){renderTabs();renderPanels();}' +\n        'function setTab(tab){curTab=tab;renderAll();}' +\n        'function getGroup(tab){for(var i=0;i<DATA.length;i++){if(DATA[i].tab==tab){return DATA[i];}}return null;}' +\n        'function setSelected(btn,on){if(on){btn.classList.add(\"sel\");}else{btn.classList.remove(\"sel\");}}' +\n        'function syncOut(){var out={novel:[],audio:[],comic:[],video:[],download:[]};var allSel=[];' +\n        'var nodes=panelsEl.querySelectorAll(\".src-card.sel\");for(var i=0;i<nodes.length;i++){var p=nodes[i].parentNode;while(p&&!p.getAttribute(\"data-panel\")){p=p.parentNode;}var t=p?p.getAttribute(\"data-panel\"):\"\";var n=nodes[i].getAttribute(\"data-name\");if(t&&out[t]&&n&&out[t].indexOf(n)<0){out[t].push(n);}}' +\n        'var allNodes=panelsEl.querySelectorAll(\".all-card.sel\");for(var k=0;k<allNodes.length;k++){var p2=allNodes[k].parentNode;while(p2&&!p2.getAttribute(\"data-panel\")){p2=p2.parentNode;}if(p2){allSel.push(p2.getAttribute(\"data-panel\"));}}' +\n        'outEl.textContent=JSON.stringify(allSel)+\"|||\"+JSON.stringify(out);' +\n        'var cnt=0;for(var key in out){if(out.hasOwnProperty(key)){cnt+=out[key].length;}}' +\n        'var el=document.getElementById(\"sel-count\");if(el){el.textContent=String(cnt);}' +\n        'var tip=document.getElementById(\"sel-tip\");if(tip){tip.innerHTML=\"已选 <b id=\\\\\"sel-count\\\\\">\"+cnt+\"</b> 个源站\"+(allSel.length?\" · 全部源站分类：\"+allSel.join(\"、\"):\"\");}}' +\n        'function toggleAll(btn){var panel=btn.parentNode;var tab=panel.getAttribute(\"data-panel\");var g=getGroup(tab);if(!g){return;}' +\n        'var on=!g.cards[0].sel;g.cards[0].sel=on;for(var j=1;j<g.cards.length;j++){g.cards[j].sel=false;}' +\n        'var allBtn=panel.querySelector(\".all-card\");var cards=panel.querySelectorAll(\".src-card\");' +\n        'setSelected(allBtn,on);for(var c=0;c<cards.length;c++){setSelected(cards[c],false);}syncOut();}' +\n        'function toggleOne(btn){var panel=btn.parentNode.parentNode;var tab=panel.getAttribute(\"data-panel\");var g=getGroup(tab);if(!g){return;}' +\n        'var name=btn.getAttribute(\"data-name\");g.cards[0].sel=false;' +\n        'var allBtn=panel.querySelector(\".all-card\");if(allBtn){setSelected(allBtn,false);}' +\n        'var on=false;for(var j=1;j<g.cards.length;j++){if(g.cards[j].name==name){g.cards[j].sel=!g.cards[j].sel;on=g.cards[j].sel;break;}}' +\n        'setSelected(btn,on);syncOut();}' +\n        'tabsEl.addEventListener(\"click\",function(e){var el=e.target;while(el&&el!==tabsEl&&!el.getAttribute(\"data-tab\")){el=el.parentNode;}if(el&&el!==tabsEl){setTab(el.getAttribute(\"data-tab\"));}});' +\n        'panelsEl.addEventListener(\"click\",function(e){var el=e.target;while(el&&el!==panelsEl&&!el.classList.contains(\"all-card\")&&!el.classList.contains(\"src-card\")){el=el.parentNode;}if(!el||el==panelsEl){return;}if(el.classList.contains(\"all-card\")){toggleAll(el);}else if(el.classList.contains(\"src-card\")){toggleOne(el);}});' +\n        'renderAll();syncOut();' +\n        '</script></body></html>';\n\n    var dataUrl = 'data:text/html;base64,' + java.base64Encode(html);\n    var choice = java.startBrowserAwait(dataUrl, '源站选择', false);\n    if (!choice || !choice.body()) { java.toast('已取消源站设置'); return; }\n\n    var body = choice.body();\n    var m = body.match(/<div id=\"result-output\"[^>]*>([^<]*)<\\/div>/);\n    var rawOut = (m && m[1]) ? m[1].trim() : '';\n    rawOut = rawOut.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&amp;/g, '&').replace(/&quot;/g, '\"').replace(/&#39;/g, \"'\");\n\n    var newSources = { novel: [], audio: [], comic: [], video: [], download: [] };\n    var newAllTabs = [];\n    try {\n        var parts = rawOut.split('|||');\n        var allArr = JSON.parse(parts[0] || '[]');\n        var srcObj = JSON.parse(parts[1] || '{}');\n        if (Array.isArray(allArr)) newAllTabs = allArr;\n        if (srcObj && typeof srcObj == 'object') {\n            TABS.forEach(function (t) { if (Array.isArray(srcObj[t])) newSources[t] = srcObj[t]; });\n        }\n    } catch (e) {}\n\n    TABS.forEach(function (t) {\n        if (newSources[t].length > 0) {\n            newAllTabs = newAllTabs.filter(function (x) { return x !== t; });\n        }\n    });\n\n    var merged = [];\n    TABS.forEach(function (t) {\n        newSources[t].forEach(function (n) { if (merged.indexOf(n) == -1) merged.push(n); });\n    });\n\n    setConfig.call(this, { sources: newSources, allTabs: newAllTabs, source: merged.join(',') });\n    var cnt = merged.length;\n    var allCnt = newAllTabs.length;\n    java.toast(cnt > 0 ? ('源站已保存（共 ' + cnt + ' 个）') : (allCnt > 0 ? '已保存（全部源站）' : '已保存（未选择具体源站）'));\n}\n\nfunction parseVer(v) {\n    return String(v || '').split('.').map(function (x) { return parseInt(x, 10) || 0; });\n}\n\nfunction cmpVer(a, b) {\n    let pa = parseVer(a), pb = parseVer(b);\n    let len = Math.max(pa.length, pb.length);\n    for (let i = 0; i < len; i++) {\n        let x = pa[i] || 0, y = pb[i] || 0;\n        if (x > y) return 1;\n        if (x < y) return -1;\n    }\n    return 0;\n}\n\nfunction shouldBlockByVersion(serverVerObj) {\n    if (!serverVerObj || !serverVerObj.version) return false;\n    let sv = String(serverVerObj.version);\n    let lv = String(localVersion || '');\n    if (cmpVer(sv, lv) <= 0) return false;\n\n    let isForce = (serverVerObj.force == true || String(serverVerObj.force) == 'true');\n    let tipMsg = serverVerObj.msg || '';   // ← 用 version.msg\n\n    if (isForce) {\n        try { java.toast('\\n服务端要求强制更新 ' + sv + (tipMsg ? '\\n' + tipMsg : '')); } catch (e) {}\n        try { checkVersion.call(this); } catch (e) {}\n    } else {\n        try { java.toast('有新版本 ' + sv + (tipMsg ? '\\n' + tipMsg : '') + '\\n可在登录页「🔄更新检测」查看'); } catch (e) {}\n    }\n\n    return false;\n}\n\nfunction checkVersion() {\n    let { java } = this;\n    var host = getHost.call(this);\n    var versionApi = host + '/api/version?aid=sy';\n    var siteApi = host + '/api/site/public';\n\n    function esc(v) {\n        return String(v == undefined ? '' : v)\n            .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\n            .replace(/\"/g, '&quot;').replace(/'/g, '&#39;');\n    }\n\n    var siteName = '书源更新';\n    try {\n        var siteRes = java.ajax(siteApi);\n        var siteObj = JSON.parse(siteRes);\n        if (siteObj && siteObj.data && siteObj.data.site_name) {\n            siteName = String(siteObj.data.site_name);\n        }\n    } catch (e) {}\n\n    var res;\n    try { res = java.ajax(versionApi); }\n    catch (e) { java.toast('版本检查失败：网络异常'); return; }\n    var obj;\n    try { obj = JSON.parse(res); }\n    catch (e) { java.toast('版本检查失败：返回解析异常'); return; }\n    if (!obj || obj.code !== 0 || !obj.data || !obj.data.version) {\n        java.toast((obj && obj.message) || '版本检查失败'); return;\n    }\n\n    var serverVer = String(obj.data.version);\n    var myLocalVer = String(localVersion || '');\n    var cmp = cmpVer(serverVer, myLocalVer);   // 复用 jsLib 的 cmpVer\n\n    if (cmp > 0) {\n        var msg = String(obj.data.msg || '有新版本啦');\n        var force = String(obj.data.force || 'false') == 'true';\n        var downloadUrl = String(obj.data.download_url || '');\n        var updateLog = obj.data.update_log || {};\n\n        var dates = Object.keys(updateLog).filter(function (d) {\n            return Array.isArray(updateLog[d]) && updateLog[d].length;\n        }).sort(function (a, b) { return b.localeCompare(a); });\n\n        var latestDate = dates[0] || '';\n        var latestItems = latestDate ? updateLog[latestDate] : [];\n        var historyDates = dates.slice(1);\n\n        var latestLogHtml = '';\n        latestItems.forEach(function (t) {\n            latestLogHtml += '<div class=\"update-text\">' + esc(t) + '</div>';\n        });\n\n        var historyHtml = '';\n        historyDates.forEach(function (d) {\n            historyHtml += '<div class=\"history-item\"><div class=\"history-date\"><i class=\"fas fa-calendar-day\"></i><span>' + esc(d) + '</span></div>';\n            updateLog[d].forEach(function (t) {\n                historyHtml += '<div class=\"history-text\">' + esc(t) + '</div>';\n            });\n            historyHtml += '</div>';\n        });\n        var historyCountText = historyDates.length ? '(' + historyDates.length + '条)' : '';\n\n        var bodyHtml = '<!DOCTYPE html><html lang=\"zh-CN\" data-theme=\"glass\" data-mode=\"light\"><head>' +\n            '<meta charset=\"UTF-8\">' +\n            '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0,viewport-fit=cover\">' +\n            '<title>' + esc(siteName) + '</title>' +\n            '<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css\">' +\n            '<style>' +\n            ':root{' +\n            '--bg-rgb:232,238,246;--surface-rgb:255,255,255;--text-rgb:31,38,51;--muted-rgb:108,120,140;' +\n            '--line-rgb:150,165,190;--primary-rgb:91,124,250;' +\n            '--bg:#e8eef6;--surface:#ffffff;--surface-soft:#f6f9ff;--text:#1f2633;--muted:#6c788c;' +\n            '--primary:#5b7cfa;--primary-dark:#4363d8;--primary-ink:#f7f9ff;' +\n            '--border:rgba(var(--line-rgb),.18);--primary-soft:rgba(var(--primary-rgb),.08);' +\n            '--text-soft:rgba(var(--text-rgb),.78);--border-soft:rgba(var(--line-rgb),.16);' +\n            '--card-bg:rgba(var(--surface-rgb),.78);' +\n            '--radius-lg:20px;--radius:14px;--radius-sm:10px;' +\n            '--shadow:0 18px 40px -26px rgba(31,45,80,.35),0 2px 8px rgba(31,45,80,.05);' +\n            '--shadow-card:var(--shadow);' +\n            '--font-cn:\"PingFang SC\",\"Hiragino Sans GB\",\"Microsoft YaHei\",system-ui,-apple-system,\"Segoe UI\",Roboto,sans-serif;' +\n            '--font-mono:\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,\"Courier New\",monospace;' +\n            '}' +\n            '*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}' +\n            'html{min-height:100%}' +\n            'body{margin:0;min-height:100vh;color:var(--text);font-family:var(--font-cn);font-size:15px;line-height:1.6;' +\n            'background:var(--bg);overflow-x:hidden;position:relative;' +\n            '-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;' +\n            'display:flex;align-items:center;justify-content:center;padding:calc(18px + env(safe-area-inset-top)) 14px calc(22px + env(safe-area-inset-bottom))}' +\n            '.waves{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden;background:linear-gradient(180deg,#eef3fb 0%,#e3ecf8 50%,#dbe6f5 100%)}' +\n            '.wave{position:absolute;left:-50%;width:200%;height:200%;border-radius:45%;opacity:.55;' +\n            'background:radial-gradient(circle at 50% 50%,rgba(91,124,250,.28),rgba(91,124,250,0) 65%);' +\n            'animation:waveMove 18s linear infinite}' +\n            '.wave.w1{top:-120%;animation-duration:20s}' +\n            '.wave.w2{top:-110%;animation-duration:26s;animation-direction:reverse;opacity:.4;' +\n            'background:radial-gradient(circle at 50% 50%,rgba(120,170,255,.24),rgba(120,170,255,0) 65%)}' +\n            '.wave.w3{top:-100%;animation-duration:32s;opacity:.3;' +\n            'background:radial-gradient(circle at 50% 50%,rgba(160,200,255,.22),rgba(160,200,255,0) 65%)}' +\n            '@keyframes waveMove{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}' +\n            'body::after{content:\"\";position:fixed;inset:0;z-index:0;pointer-events:none;' +\n            'background:radial-gradient(1200px 600px at 15% 0%,rgba(var(--bg-rgb),.1),rgba(var(--bg-rgb),0) 70%),' +\n            'linear-gradient(180deg,rgba(var(--bg-rgb),.06) 0%,rgba(var(--bg-rgb),.14) 55%,rgba(var(--bg-rgb),.22) 100%)}' +\n            'h1,h2,h3,p{margin:0}' +\n            '.wrap{width:100%;max-width:440px;position:relative;z-index:1}' +\n            '.card{box-sizing:border-box;padding:22px;border:1px solid var(--border);border-radius:var(--radius-lg);' +\n            'background:var(--card-bg);box-shadow:var(--shadow-card);' +\n            'backdrop-filter:blur(12px) saturate(1.04);-webkit-backdrop-filter:blur(12px) saturate(1.04);' +\n            'animation:slideIn .6s cubic-bezier(.22,.61,.36,1)}' +\n            '@keyframes slideIn{from{opacity:0;transform:translateY(24px) scale(.98)}to{opacity:1;transform:none}}' +\n            '.head{text-align:center;margin-bottom:18px}' +\n            '.head h1{font-size:22px;letter-spacing:.01em;margin-bottom:6px}' +\n            '.head p{font-size:13.5px;color:var(--muted)}' +\n            '.eyebrow{display:inline-block;color:var(--primary);font-size:11.5px;font-weight:700;letter-spacing:.22em;text-transform:uppercase;margin-bottom:6px}' +\n            '.versions{display:flex;align-items:stretch;gap:10px;margin:16px 0}' +\n            '.v-card{flex:1;min-width:0;padding:14px 12px;border:1px solid var(--border);border-radius:var(--radius);' +\n            'background:rgba(var(--surface-rgb),.6);box-shadow:var(--shadow-card);text-align:center;position:relative;' +\n            'backdrop-filter:blur(10px) saturate(1.05);-webkit-backdrop-filter:blur(10px) saturate(1.05)}' +\n            '.v-card .k{font-size:11.5px;color:var(--muted);display:flex;align-items:center;justify-content:center;gap:5px}' +\n            '.v-card .n{font-size:15px;font-weight:700;margin-top:4px;word-break:break-all;font-family:var(--font-mono)}' +\n            '.v-card .d{font-size:11.5px;color:var(--muted);margin-top:4px}' +\n            '.v-card.latest{background:linear-gradient(140deg,rgba(var(--primary-rgb),.16),rgba(var(--primary-rgb),.04));' +\n            'border-color:rgba(var(--primary-rgb),.34);box-shadow:0 0 26px -10px rgba(var(--primary-rgb),.5),var(--shadow-card);' +\n            'animation:breathe 3s ease-in-out infinite}' +\n            '@keyframes breathe{0%,100%{transform:scale(1)}50%{transform:scale(1.02)}}' +\n            '.v-card.latest .k,.v-card.latest .n{color:var(--primary-dark)}' +\n            '.vs{flex:none;width:34px;height:34px;border-radius:50%;align-self:center;display:flex;align-items:center;justify-content:center;' +\n            'font-size:13px;color:var(--primary);background:rgba(var(--surface-rgb),.85);border:1px solid var(--border);' +\n            'box-shadow:0 6px 16px -10px rgba(var(--primary-rgb),.5);' +\n            'backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);' +\n            'animation:pulseIndicator 1.6s ease-in-out infinite}' +\n            '@keyframes pulseIndicator{0%,100%{transform:scale(1)}50%{transform:scale(1.1)}}' +\n            '.section{margin-top:14px;border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;' +\n            'background:rgba(var(--surface-rgb),.55);box-shadow:var(--shadow-card);' +\n            'backdrop-filter:blur(10px) saturate(1.04);-webkit-backdrop-filter:blur(10px) saturate(1.04);' +\n            'animation:slideIn .5s ease .25s backwards}' +\n            '.section-head{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;' +\n            'border-bottom:1px solid var(--border);background:rgba(var(--surface-rgb),.5)}' +\n            '.section-head h2{font-size:15px;font-weight:600;display:flex;align-items:center;gap:7px}' +\n            '.section-head h2 i{color:var(--primary)}' +\n            '.tag{padding:3px 9px;border-radius:999px;background:var(--primary-soft);color:var(--primary);font-size:11.5px;font-weight:600}' +\n            '.section-body{padding:14px}' +\n            '.log-date{display:flex;align-items:center;gap:6px;color:var(--primary);font-size:12.5px;font-weight:700;' +\n            'padding-bottom:7px;border-bottom:1px dashed var(--border-soft);margin-bottom:7px}' +\n            '.update-text{position:relative;padding-left:15px;margin:6px 0;line-height:1.55;font-size:13.5px;color:var(--text-soft);white-space:pre-wrap;word-break:break-word}' +\n            '.update-text::before{content:\"•\";position:absolute;left:0;color:var(--primary);font-weight:700;font-size:1.15rem;line-height:1}' +\n            '.history-head{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;' +\n            'border-bottom:1px solid var(--border);background:rgba(var(--surface-rgb),.5);cursor:pointer;user-select:none;transition:background .2s}' +\n            '.history-head:hover{background:rgba(var(--surface-rgb),.7)}' +\n            '.history-head h2{font-size:15px;font-weight:600;display:flex;align-items:center;gap:7px}' +\n            '.history-head h2 i{color:var(--primary)}' +\n            '.toggle{background:none;border:none;color:var(--muted);cursor:pointer;font-weight:500;display:flex;align-items:center;gap:4px;font-size:12.5px;transition:color .2s}' +\n            '.toggle:hover{color:var(--primary)}' +\n            '.history-body{padding:0 14px;max-height:0;overflow:hidden;transition:max-height .4s ease,padding .4s ease}' +\n            '.history-body.open{max-height:60vh;overflow-y:auto;padding:14px;scrollbar-width:thin}' +\n            '.history-body.open::-webkit-scrollbar{width:6px}' +\n            '.history-body.open::-webkit-scrollbar-thumb{background:rgba(var(--line-rgb),.35);border-radius:4px}' +\n            '.history-item{margin-bottom:14px;padding-bottom:14px;border-bottom:1px dashed var(--border-soft)}' +\n            '.history-item:last-child{border-bottom:none;margin-bottom:0;padding-bottom:0}' +\n            '.history-date{font-weight:600;margin-bottom:7px;display:flex;align-items:center;gap:4px;font-size:12.5px;color:var(--primary);' +\n            'background:var(--primary-soft);padding:5px 9px;border-radius:6px}' +\n            '.history-text{position:relative;padding-left:15px;margin:6px 0;line-height:1.5;font-size:13px;color:var(--text-soft);white-space:pre-wrap;word-break:break-word}' +\n            '.history-text::before{content:\"•\";position:absolute;left:0;color:var(--primary);font-weight:700;font-size:1.1rem;line-height:1}' +\n            '.btn{display:flex;align-items:center;justify-content:center;gap:8px;box-sizing:border-box;width:100%;padding:13px 18px;' +\n            'margin-top:14px;border:1px solid transparent;border-radius:var(--radius-sm);font:inherit;font-size:14.5px;font-weight:600;' +\n            'text-decoration:none;cursor:pointer;transition:background .16s ease,box-shadow .16s ease,transform .12s ease;' +\n            'color:var(--primary-ink);background:linear-gradient(135deg,var(--primary) 0%,var(--primary) 60%,var(--primary-dark) 100%);' +\n            'box-shadow:0 10px 22px -14px rgba(var(--primary-rgb),.9);position:relative;overflow:hidden}' +\n            '.btn::after{content:\"\";position:absolute;top:-50%;left:-50%;width:200%;height:200%;' +\n            'background:linear-gradient(90deg,transparent,rgba(255,255,255,.35),transparent);transform:rotate(30deg);' +\n            'animation:btnShine 3s ease-in-out infinite}' +\n            '@keyframes btnShine{0%,60%{transform:translateX(-120%) rotate(30deg)}80%,100%{transform:translateX(120%) rotate(30deg)}}' +\n            '.btn:hover{background:linear-gradient(135deg,var(--primary) 0%,var(--primary-dark) 60%,var(--primary-dark) 100%);transform:translateY(-1px)}' +\n            '.btn:active{transform:translateY(1px) scale(.98)}' +\n            '.btn i,.btn span{position:relative;z-index:1}' +\n            '.foot{margin-top:14px;text-align:center;color:var(--muted);font-size:12px;line-height:1.6}' +\n            '@media(max-width:400px){.versions{flex-direction:column}.vs{transform:rotate(90deg)}.card{padding:18px 16px}}' +\n            '</style></head><body>' +\n            '<div class=\"waves\"><div class=\"wave w1\"></div><div class=\"wave w2\"></div><div class=\"wave w3\"></div></div>' +\n            '<div class=\"wrap\"><section class=\"card\">' +\n            '<div class=\"head\">' +\n            '<span class=\"eyebrow\">Version Update</span>' +\n            '<h1>' + esc(siteName) + '</h1>' +\n            '<p>' + esc(msg) + '</p>' +\n            '</div>' +\n            '<div class=\"versions\">' +\n            '<div class=\"v-card\"><div class=\"k\"><i class=\"fas fa-cube\"></i> 当前版本</div><div class=\"n\">v' + esc(myLocalVer) + '</div><div class=\"d\">您的当前版本</div></div>' +\n            '<div class=\"vs\"><i class=\"fas fa-arrow-right\"></i></div>' +\n            '<div class=\"v-card latest\"><div class=\"k\"><i class=\"fas fa-star\"></i> 最新版本</div><div class=\"n\">v' + esc(serverVer) + '</div><div class=\"d\">可用最新版本</div></div>' +\n            '</div>' +\n            (latestLogHtml ? '<div class=\"section\"><div class=\"section-head\"><h2><i class=\"fas fa-bolt\"></i> 最新更新</h2><span class=\"tag\">最新发布</span></div><div class=\"section-body\"><div class=\"log-date\"><i class=\"fas fa-calendar-alt\"></i>' + esc(latestDate) + '</div>' + latestLogHtml + '</div></div>' : '') +\n            (downloadUrl ? '<a href=\"' + esc(downloadUrl) + '\" class=\"btn\"><i class=\"fas fa-rocket\"></i><span>立即更新</span></a>' : '') +\n            (historyHtml ? '<div class=\"section\" style=\"padding:0\"><div class=\"history-head\" onclick=\"toggleLogs()\"><h2><i class=\"fas fa-history\"></i> 历史更新 <span>' + historyCountText + '</span></h2><button class=\"toggle\"><span id=\"toggleText\">展开历史</span><i class=\"fas fa-chevron-down\" id=\"toggleIcon\"></i></button></div><div class=\"history-body\" id=\"logList\">' + historyHtml + '</div></div>' : '') +\n            '<p class=\"foot\">' + (force ? '本次为强制更新，请更新后再使用书源' : '更新后返回书源即可生效') + '</p>' +\n            '</section></div>' +\n            '<script>' +\n            'let logsCollapsed=true;' +\n            'function toggleLogs(){logsCollapsed=!logsCollapsed;var l=document.getElementById(\"logList\");var t=document.getElementById(\"toggleText\");var i=document.getElementById(\"toggleIcon\");' +\n            'if(logsCollapsed){l.classList.remove(\"open\");t.textContent=\"展开历史\";i.className=\"fas fa-chevron-down\";}else{l.classList.add(\"open\");t.textContent=\"收起历史\";i.className=\"fas fa-chevron-up\";}}' +\n            '</script></body></html>';\n\n        if (downloadUrl) {\n            try {\n                java.startBrowserAwait('data:text/html;base64,' + java.base64Encode(bodyHtml), '书源更新', false);\n            } catch (e) {\n                java.toast('打开更新页失败：' + e);\n            }\n        } else {\n            java.longToast('发现新版本：' + serverVer + '\\n' + msg);\n        }\n        return;\n    }\n\n    if (cmp < 0) {\n        java.longToast('非法版本\\n本地版本：' + myLocalVer + '\\n服务器版本：' + serverVer + '\\n本地版本高于服务器版本，请检查书源来源是否被修改。');\n        return;\n    }\n    java.toast('已是最新版本：' + myLocalVer);\n}\n\nfunction paraSettings() {\n    let { java } = this;\n    let conf = getConfig.call(this);\n    let curReview = conf.para_review || 'off';\n    let curStyle = conf.para_style || 'TEXT';\n    let curSy = conf.para_sy || 'off';\n    let curProgress = conf.progress_sync || 'off';\n    let curShelf = conf.shelf_sync || 'off';\n\n    var html = '<!DOCTYPE html><html lang=\"zh-CN\"><head>' +\n        '<meta charset=\"UTF-8\">' +\n        '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no\">' +\n        '<title>书源设置</title>' +\n        '<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css\">' +\n        '<style>' +\n        ':root{' +\n        '--bg-rgb:232,238,246;--surface-rgb:255,255,255;--text-rgb:31,38,51;--muted-rgb:108,120,140;' +\n        '--line-rgb:150,165,190;--primary-rgb:91,124,250;' +\n        '--bg:#e8eef6;--surface:#ffffff;--text:#1f2633;--muted:#6c788c;' +\n        '--primary:#5b7cfa;--primary-dark:#4363d8;' +\n        '--border:rgba(var(--line-rgb),.18);--primary-soft:rgba(var(--primary-rgb),.08);' +\n        '--radius-lg:20px;--radius:14px;' +\n        '--shadow:0 18px 40px -26px rgba(31,45,80,.35),0 2px 8px rgba(31,45,80,.05);' +\n        '--font-cn:\"PingFang SC\",\"Hiragino Sans GB\",\"Microsoft YaHei\",system-ui,-apple-system,sans-serif;' +\n        '}' +\n        '*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}' +\n        'html,body{min-height:100%}' +\n        'body{margin:0;min-height:100vh;color:var(--text);font-family:var(--font-cn);font-size:15px;line-height:1.6;' +\n        'background:var(--bg);padding:calc(14px + env(safe-area-inset-top)) 14px calc(22px + env(safe-area-inset-bottom));position:relative;overflow-x:hidden}' +\n        'body::before{content:\"\";position:fixed;inset:0;z-index:0;pointer-events:none;' +\n        'background:radial-gradient(900px 520px at 12% -8%,rgba(var(--primary-rgb),.16),transparent 68%),' +\n        'radial-gradient(760px 480px at 94% 4%,rgba(120,220,230,.18),transparent 72%)}' +\n        '.wrap{max-width:720px;margin:0 auto;position:relative;z-index:1}' +\n        '.glass{background:linear-gradient(155deg,rgba(var(--surface-rgb),.86),rgba(var(--surface-rgb),.58));' +\n        'border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow);' +\n        'backdrop-filter:blur(22px) saturate(1.2);-webkit-backdrop-filter:blur(22px) saturate(1.2)}' +\n        '.hero{display:flex;align-items:center;gap:14px;padding:17px 18px;margin-bottom:12px}' +\n        '.hero-icon{flex:0 0 auto;width:46px;height:46px;border-radius:14px;display:flex;align-items:center;justify-content:center;font-size:20px;' +\n        'background:linear-gradient(135deg,var(--primary),var(--primary-dark));color:#fff}' +\n        '.hero h1{margin:0;font-size:19px;line-height:1.25}' +\n        '.hero p{margin:5px 0 0;font-size:12px;line-height:1.55;color:var(--muted)}' +\n        '.card{padding:16px 18px;margin-bottom:12px}' +\n        '.group-title{font-size:12px;font-weight:700;color:var(--muted);letter-spacing:1px;padding:4px 2px 8px}' +\n        '.row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 0}' +\n        '.row + .row{border-top:1px solid var(--border)}' +\n        '.row .label{font-size:14px;font-weight:600}' +\n        '.row .desc{font-size:11.5px;color:var(--muted);margin-top:2px;line-height:1.5}' +\n        '.switch{position:relative;width:52px;height:28px;flex:none;cursor:pointer}' +\n        '.switch input{opacity:0;width:0;height:0}' +\n        '.switch-slider{position:absolute;inset:0;background:rgba(var(--line-rgb),.35);border-radius:28px;transition:.3s;border:1px solid var(--border)}' +\n        '.switch-slider::before{content:\"\";position:absolute;width:22px;height:22px;left:2px;bottom:2px;background:#fff;border-radius:50%;transition:.3s;box-shadow:0 2px 8px rgba(0,0,0,.3)}' +\n        '.switch input:checked + .switch-slider{background:var(--primary);border-color:var(--primary)}' +\n        '.switch input:checked + .switch-slider::before{transform:translateX(24px)}' +\n        '.seg{display:flex;gap:6px;padding:5px;border-radius:14px;background:rgba(var(--surface-rgb),.6);border:1px solid var(--border);flex:none}' +\n        '.seg button{border:none;background:transparent;font:inherit;font-size:13px;font-weight:600;padding:8px 16px;border-radius:10px;cursor:pointer;color:var(--muted);transition:.18s}' +\n        '.seg button.on{background:linear-gradient(135deg,var(--primary),var(--primary-dark));color:#fff;box-shadow:0 6px 16px -10px rgba(var(--primary-rgb),.9)}' +\n        '.tip{padding:12px 16px;border-radius:14px;font-size:12px;line-height:1.6;color:var(--muted)}' +\n        '.tip b{color:var(--text)}' +\n        '</style></head><body><div class=\"wrap\">' +\n        '<header class=\"hero glass\"><div class=\"hero-icon\"><i class=\"fa-solid fa-sliders\"></i></div><div><h1>书源设置</h1><p>段评、进度同步、书架同步</p></div></header>' +\n\n        // 段评\n        '<section class=\"card glass\">' +\n        '<div class=\"group-title\">段评</div>' +\n        '<div class=\"row\"><div><div class=\"label\">段评开关</div><div class=\"desc\">仅番茄、企鹅阅读、晋江、七猫、少年梦、起点支持</div></div>' +\n        '<label class=\"switch\"><input type=\"checkbox\" id=\"reviewSwitch\" ' + (curReview == 'on' ? 'checked' : '') + '><span class=\"switch-slider\"></span></label></div>' +\n        '<div class=\"row\"><div><div class=\"label\">段评图标大小</div><div class=\"desc\">TEXT 大号 / text 小号</div></div>' +\n        '<div class=\"seg\" id=\"styleSeg\">' +\n        '<button type=\"button\" data-val=\"TEXT\" class=\"' + (curStyle == 'TEXT' ? 'on' : '') + '\">TEXT（大）</button>' +\n        '<button type=\"button\" data-val=\"text\" class=\"' + (curStyle == 'text' ? 'on' : '') + '\">text（小）</button>' +\n        '</div></div>' +\n        '<div class=\"row\"><div><div class=\"label\">源阅适配</div><div class=\"desc\">IOS源阅适配，其他IOS应用段评异常也可尝试开启</div></div>' +\n        '<label class=\"switch\"><input type=\"checkbox\" id=\"sySwitch\" ' + (curSy == 'on' ? 'checked' : '') + '><span class=\"switch-slider\"></span></label></div>' +\n        '</section>' +\n\n        // 同步\n        '<section class=\"card glass\">' +\n        '<div class=\"group-title\">同步</div>' +\n        '<div class=\"row\"><div><div class=\"label\">进度同步</div><div class=\"desc\">翻章时上报晋江 / 番茄系列阅读进度</div></div>' +\n        '<label class=\"switch\"><input type=\"checkbox\" id=\"progressSwitch\" ' + (curProgress == 'on' ? 'checked' : '') + '><span class=\"switch-slider\"></span></label></div>' +\n        '<div class=\"row\"><div><div class=\"label\">书架同步</div><div class=\"desc\">加入/移除书架时同步到晋江 / 番茄系列</div></div>' +\n        '<label class=\"switch\"><input type=\"checkbox\" id=\"shelfSwitch\" ' + (curShelf == 'on' ? 'checked' : '') + '><span class=\"switch-slider\"></span></label></div>' +\n        '</section>' +\n\n        '<div class=\"tip glass\">当前：段评 <b id=\"curReview\">' + (curReview == 'on' ? '开启' : '关闭') + '</b> · 图标 <b id=\"curStyle\">' + curStyle + '</b> · 源阅适配 <b id=\"curSy\">' + (curSy == 'on' ? '开启' : '关闭') + '</b>' +\n        ' · 进度同步 <b id=\"curProgress\">' + (curProgress == 'on' ? '开启' : '关闭') + '</b> · 书架同步 <b id=\"curShelf\">' + (curShelf == 'on' ? '开启' : '关闭') + '</b></div>' +\n        '</div>' +\n        '<div id=\"result-output\" style=\"display:none;\">' + curReview + '|' + curStyle + '|' + curSy + '|' + curProgress + '|' + curShelf + '</div>' +\n        '<script>' +\n        'var out=document.getElementById(\"result-output\");' +\n        'function sync(){var r=document.getElementById(\"reviewSwitch\").checked?\"on\":\"off\";' +\n        'var s=document.querySelector(\"#styleSeg button.on\").getAttribute(\"data-val\");' +\n        'var y=document.getElementById(\"sySwitch\").checked?\"on\":\"off\";' +\n        'var p=document.getElementById(\"progressSwitch\").checked?\"on\":\"off\";' +\n        'var b=document.getElementById(\"shelfSwitch\").checked?\"on\":\"off\";' +\n        'out.textContent=r+\"|\"+s+\"|\"+y+\"|\"+p+\"|\"+b;' +\n        'document.getElementById(\"curReview\").textContent=r==\"on\"?\"开启\":\"关闭\";' +\n        'document.getElementById(\"curStyle\").textContent=s;' +\n        'document.getElementById(\"curSy\").textContent=y==\"on\"?\"开启\":\"关闭\";' +\n        'document.getElementById(\"curProgress\").textContent=p==\"on\"?\"开启\":\"关闭\";' +\n        'document.getElementById(\"curShelf\").textContent=b==\"on\"?\"开启\":\"关闭\";}' +\n        '[\"reviewSwitch\",\"sySwitch\",\"progressSwitch\",\"shelfSwitch\"].forEach(function(id){document.getElementById(id).addEventListener(\"change\",sync);});' +\n        'document.querySelectorAll(\"#styleSeg button\").forEach(function(btn){btn.addEventListener(\"click\",function(){' +\n        'document.querySelectorAll(\"#styleSeg button\").forEach(function(x){x.classList.remove(\"on\");});' +\n        'btn.classList.add(\"on\");sync();});});' +\n        'sync();' +\n        '</script></body></html>';\n\n    var choice = java.startBrowserAwait('data:text/html;base64,' + java.base64Encode(html), '书源设置', false);\n    if (!choice || !choice.body()) { java.toast('已取消书源设置'); return; }\n\n    var body = choice.body();\n    var m = body.match(/<div id=\"result-output\"[^>]*>([^<]*)<\\/div>/);\n    var raw = (m && m[1]) ? m[1].trim() : '';\n    var parts = raw.split('|');\n    var review = parts[0] == 'on' ? 'on' : 'off';\n    var style = parts[1] == 'text' ? 'text' : 'TEXT';\n    var sy = parts[2] == 'on' ? 'on' : 'off';\n    var progress = parts[3] == 'on' ? 'on' : 'off';\n    var shelf = parts[4] == 'on' ? 'on' : 'off';\n\n    setConfig.call(this, {\n        para_review: review,\n        para_style: style,\n        para_sy: sy,\n        progress_sync: progress,\n        shelf_sync: shelf\n    });\n    java.toast('已保存：段评' + (review == 'on' ? '开启' : '关闭') +\n        ' · 进度同步' + (progress == 'on' ? '开启' : '关闭') +\n        ' · 书架同步' + (shelf == 'on' ? '开启' : '关闭'));\n}\n\nfunction encode(data) {\n    let { java } = this;\n    return java.createSymmetricCrypto(\"DES/CBC/PKCS5Padding\", String(\"KW8Dvm2N\"), String(\"1ae2c94b\")).encryptBase64(data);\n}\n\nfunction decode(data) {\n    let { java } = this;\n    try {\n        var encryptedBytes = java.base64DecodeToByteArray(data);\n        var key = \"F#kL9$mQpR2&sVzX\";\n        var iv = \"7HnT3!cW8@xM0yBv\";\n        var crypto = java.createSymmetricCrypto(\"AES/CBC/PKCS5Padding\", key, iv);\n        return crypto.decryptStr(encryptedBytes);\n    } catch (e) {\n        return data;\n    }\n}", "lastUpdateTime": "1794037053337", "loginUi": "[\n  {\n    \"name\": \"邮箱\",\n    \"type\": \"text\"\n  },\n  {\n    \"name\": \"密码\",\n    \"type\": \"password\"\n  },\n  {\n    \"name\": \"⭕账号登录\",\n    \"type\": \"button\",\n    \"action\": \"login(true)\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🔑账号注册\",\n    \"type\": \"button\",\n    \"action\": \"register()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"❌退出登录\",\n    \"type\": \"button\",\n    \"action\": \"logout()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🔅用户中心\",\n    \"type\": \"button\",\n    \"action\": \"user()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"📡切换源站与搜索模式\",\n    \"type\": \"button\",\n    \"action\": \"selectSource()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"name\": \"🎚服务器切换\",\n    \"type\": \"button\",\n    \"action\": \"switchServer()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🔄服务器检测\",\n    \"type\": \"button\",\n    \"action\": \"checkServer()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🎁书源设置\",\n    \"type\": \"button\",\n    \"action\": \"paraSettings()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🌟升级用户组\",\n    \"type\": \"button\",\n    \"action\": \"level()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🫧我的气泡\",\n    \"type\": \"button\",\n    \"action\": \"icons()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🔄更新检测\",\n    \"type\": \"button\",\n    \"action\": \"checkVersion()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🔮当前配置\",\n    \"type\": \"button\",\n    \"action\": \"showConfig()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🔄强制刷新\",\n    \"type\": \"button\",\n    \"action\": \"toggleRefresh()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🍅番茄登录\",\n    \"type\": \"button\",\n    \"action\": \"fq_login()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"❌退出番茄\",\n    \"type\": \"button\",\n    \"action\": \"fq_logout()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  }\n]", "loginUrl": "function login(flag) {\n    let email = '', pwd = '';\n    try {\n        if (flag == true) {\n            email = result.get('邮箱') || '';\n            pwd = result.get('密码') || '';\n        } else {\n            let info = source.getLoginInfoMap() || {};\n            email = info.get('邮箱') || '';\n            pwd = info.get('密码') || '';\n        }\n    } catch (e) {}\n\n    email = String(email || '').trim();\n    pwd = String(pwd || '').trim();\n    if (!email || !pwd) return java.toast('请先填写邮箱和密码');\n\n    java.toast('正在登录…');\n    try {\n        let headers = buildHeaders.call(this);\nheaders['Content-Type'] = 'application/json';\n        let opt = { method: 'POST', body: JSON.stringify({ email, password: pwd }), headers: headers };\n        let res = java.ajax(getHost.call(this) + '/api/login,' + JSON.stringify(opt));\n        let obj = null;\n        try { obj = JSON.parse(res); } catch (e) { obj = null; }\n\n        if (!obj || obj.code !== 0 || !obj.data || !obj.data.token) {\n            let msg = (obj && obj.message) || '未知错误';\n            return java.toast('\\n❌ 登录失败：' + msg);\n        }\n\n        let d = obj.data;\n        let u = d.user || {};\n        let g = d.group || {};\n        let m = d.membership || {};\n        let benefits = d.benefits || m.benefits || g.benefits || '';\n\n        source.putLoginHeader(d.token);\n\n        let name = u.nickname || u.email || email;\n        let level = g.level || m.level || 1;\n        let groupName = g.name || m.group_name || '普通用户';\n        let isMember = !!(u.is_member || m.is_member);\n        let expires = m.expires_at || d.member_expires_at || '';\n        let masked = d.api_token_masked || '';\n        let rateWin = g.rate_limit_window || '';\n        let rateMax = g.rate_limit_max || '';\n        let devLimit = g.device_limit || '';\n        let resetLimit = g.token_reset_limit || '';\n        let resetDays = g.token_reset_window_days || '';\n\n        let lines = [];\n        lines.push('✅ 登录成功');\n        lines.push('');\n        lines.push('👤 用户：' + name);\n        if (u.email) lines.push('📧 邮箱：' + u.email);\n        lines.push('🏅 等级：Lv' + level + ' · ' + groupName + (isMember ? '（会员）' : '（普通）'));\n        if (expires) lines.push('⏰ 会员到期：' + expires);\n        if (masked) lines.push('🔑 Token：' + masked);\n        if (u.last_login_at) lines.push('🕒 上次登录：' + u.last_login_at);\n        if (rateWin && rateMax) lines.push('🚦 限流：' + rateWin + '秒内最多 ' + rateMax + ' 次');\n        if (devLimit) lines.push('📱 设备上限：' + devLimit + ' 台');\n        if (resetLimit && resetDays) lines.push('🔄 Token重置：每 ' + resetDays + ' 天 ' + resetLimit + ' 次');\n        if (benefits) {\n            lines.push('');\n            lines.push('💡 ' + benefits);\n        }\n\n        java.longToast('\\n' + lines.join('\\n'));\n    } catch (e) {\n        java.toast('\\n❌ 登录失败：' + e);\n    }\n}\n\nfunction logout() {\n    try { source.removeLoginHeader(); } catch (e) {}\n    try { source.removeLoginInfo(); } catch (e) {}\n    java.toast('已退出登录');\n}\n\nfunction fq_login() {\n    try {\n        java.startBrowserAwait(\"https://fanqienovel.com/main/writer/login\", \"登录\");\n    } catch (e) {\n        java.toast(e);\n        return false;\n    }\n\n    try {\n        cookie.removeCookie(\"snssdk.com\");\n    } catch (e) {}\n\n    let sessionId = getSessionIdFromCookie.call(this);\n    if (!sessionId) sessionId = getSessionId.call(this);\n\n    if (!sessionId || String(sessionId).trim() == \"\") {\n        java.toast(\"未获取到登录凭据，登录失败\");\n        return false;\n    }\n\n    let user = \"\";\n    try {\n        let resp = java.ajax(\"https://fanqienovel.com/api/user/info/v2,\" + JSON.stringify({\n            method: \"GET\",\n            headers: { \"Cookie\": \"sessionid=\" + sessionId }\n        }));\n        user = JSON.parse(resp)?.data?.name || \"\";\n    } catch (e) {\n        java.log(e);\n    }\n\n    if (!user) {\n        java.toast(\"登录凭据无效或已过期，登录失败\");\n        return false;\n    }\n\n    setConfig.call(this, { fanqie_sessionid: sessionId });\n\n    java.toast(\"\\n\\n欢迎 \" + user + \"\\n登录成功！\");\n    return true;\n}\n\nfunction fq_logout() {\n    try { cookie.removeCookie(\"fanqienovel.com\"); } catch (e) {}\n    try { cookie.removeCookie(\"snssdk.com\"); } catch (e) {}\n    setConfig.call(this, { fanqie_sessionid: \"\" });\n    java.toast('已退出番茄登录');\n}\n\nfunction loginJjScan() {\n    let { java } = this;\n    try {\n        let headers = buildJjHeaders.call(this);\n        let e = java.ajax(\"https://android.jjwxc.com/app.jjwxc/android/reading/Login/scanCodeLogin?versionCode=467,\" + JSON.stringify({ headers: headers }));\n        let eData = JSON.parse(e).data;\n        let jjscanurl = \"https://www.jjwxc.net?action=scanCode&jjreader_key=\" + eData.jjreader_key + \"&device_key=\" + eData.device_key;\n        let enjj = encodeURIComponent(jjscanurl);\n\n        let html = '<!DOCTYPE html><html><head><meta charset=\"UTF-8\">' +\n            '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no\">' +\n            '<title>晋江扫码登录</title><style>' +\n            '*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}' +\n            'body{font-family:-apple-system,BlinkMacSystemFont,\"PingFang SC\",\"Microsoft YaHei\",sans-serif;' +\n            'background:#0a0a0f;background-image:radial-gradient(ellipse at 30% 20%,#2a1020 0%,#0a0e27 50%,#1a0d1a 100%);' +\n            'color:#e8e8f0;min-height:100vh;padding:20px;display:flex;align-items:center;justify-content:center}' +\n            '.container{width:100%;max-width:420px;background:rgba(15,12,20,.75);backdrop-filter:blur(20px);' +\n            'border-radius:24px;border:1px solid rgba(255,255,255,.08);box-shadow:0 20px 60px rgba(0,0,0,.6);overflow:hidden}' +\n            '.header{padding:24px 24px 18px;text-align:center;border-bottom:1px solid rgba(255,255,255,.06);' +\n            'background:linear-gradient(180deg,rgba(193,74,99,.15),transparent)}' +\n            '.header h1{font-size:20px;font-weight:700;letter-spacing:1px;background:linear-gradient(135deg,#e8e8f0 40%,#c14a63);' +\n            '-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}' +\n            '.header p{font-size:12px;color:rgba(255,255,255,.45);letter-spacing:2px;margin-top:4px}' +\n            '.content{padding:24px}.qr-wrapper{width:240px;height:240px;margin:0 auto 20px;border-radius:20px;' +\n            'background:#fff;padding:12px;box-shadow:0 8px 32px rgba(193,74,99,.25)}' +\n            '.qr-wrapper img{width:100%;height:100%;display:block;border-radius:12px}' +\n            '.steps{display:flex;flex-direction:column;gap:12px;margin-bottom:16px}' +\n            '.step{display:flex;align-items:flex-start;gap:10px;font-size:13px;color:rgba(255,255,255,.75);line-height:1.5}' +\n            '.step-num{flex-shrink:0;width:22px;height:22px;border-radius:50%;background:rgba(193,74,99,.2);' +\n            'border:1px solid rgba(193,74,99,.5);color:#c14a63;font-size:11px;font-weight:700;' +\n            'display:flex;align-items:center;justify-content:center;margin-top:1px}' +\n            '.tip{padding:12px 14px;background:rgba(240,192,64,.08);border:1px solid rgba(240,192,64,.25);' +\n            'border-radius:12px;font-size:12px;color:rgba(240,192,64,.95);line-height:1.5}' +\n            '.footer{padding:14px 24px 20px;text-align:center;font-size:11px;color:rgba(255,255,255,.3);' +\n            'border-top:1px solid rgba(255,255,255,.05);letter-spacing:1px}' +\n            '</style></head><body><div class=\"container\">' +\n            '<div class=\"header\"><h1>晋江扫码登录</h1><p>SCAN TO LOGIN</p></div>' +\n            '<div class=\"content\"><div class=\"qr-wrapper\"><img src=\"https://api.qrtool.cn/?text=' + enjj + '\"></div>' +\n            '<div class=\"steps\">' +\n            '<div class=\"step\"><span class=\"step-num\">1</span><span>打开已登录晋江的手机 App</span></div>' +\n            '<div class=\"step\"><span class=\"step-num\">2</span><span>进入「我的」，点击右上角「扫码」图标</span></div>' +\n            '<div class=\"step\"><span class=\"step-num\">3</span><span>扫描上方二维码并确认授权</span></div>' +\n            '<div class=\"step\"><span class=\"step-num\">4</span><span>授权后，点击页面右上角 ✓ 完成登录</span></div>' +\n            '</div><div class=\"tip\">请先扫码授权，再点右上角 ✓。提前点击会导致二维码失效，需要重新扫码</div>' +\n            '</div><div class=\"footer\">晋江文学城 · 安全登录</div></div></body></html>';\n\n        let u = java.startBrowserAwait(\"data:text/html;base64,\" + java.base64Encode(html), \"扫码登录\", false).body();\n\n        if (u) {\n            headers[\"Content-Type\"] = \"application/octet-stream\";\n            let checkLogin = \"https://android.jjwxc.com/app.jjwxc/android/reading/Login/checkJjreaderLogin\";\n            let body = jjEncode.call(this, JSON.stringify({\n                \"versionCode\": \"467\",\n                \"jjreader_key\": eData.jjreader_key,\n                \"device_key\": eData.device_key\n            }));\n            let checkLoginpost = {\n                \"method\": \"POST\",\n                \"body\": body,\n                \"headers\": headers\n            };\n            checkLogin = checkLogin + \",\" + JSON.stringify(checkLoginpost);\n            let t = java.ajax(checkLogin);\n            t = JSON.parse(t).data?.token ?? JSON.parse(t).message;\n\n            if (/\\d+_/.test(t)) {\n                setConfig.call(this, { jj_token: t });\n                java.toast(\"✅ 晋江登录成功\\nToken 已保存\");\n            } else {\n                java.toast(t);\n            }\n        }\n    } catch (e) {\n        java.log(e);\n        java.toast(\"扫码登录失败，请重试\");\n    }\n}\n\nfunction logoutJj() {\n    setConfig.call(this, { jj_token: \"\" });\n    java.toast(\"已退出晋江登录\");\n}\n\nfunction switchServer() {\n    let list = getHosts();\n    if (!list.length) { java.toast('未配置服务器'); return; }\n    let cur = getHost.call(this);\n    let idx = list.indexOf(cur);\n    let next = list[(idx + 1) % list.length];\n    setConfig.call(this, { host: next });\n    java.toast('已切换服务器：\\n' + next);\n}\n\nfunction checkServer() {\n    let cur = getHost.call(this);\n    java.toast('正在检测：\\n' + cur);\n    let t1 = Date.now();\n    try {\n        let opt = { headers: buildHeaders.call(this) };\n        let res = java.ajax(cur + '/api/site/public,' + JSON.stringify(opt));\n        let ms = Date.now() - t1;\n        let obj = null;\n        try { obj = JSON.parse(res); } catch (e) { obj = null; }\n        let siteName = (obj.data && obj.data.site_name) ? String(obj.data.site_name) : '未知';\n        let ok = !!(obj.code == 0 && siteName.indexOf('听雪') >= 0);\n        let elapsed = (obj.meta && obj.meta.elapsedMs != null) ? obj.meta.elapsedMs : ms;\n        let level = elapsed < 800 ? '💖 优秀' : elapsed < 2000 ? '💛 一般' : '💔 较慢';\n        java.longToast(\n            '\\n服务器：' + cur + '\\n' +\n            '站点：' + siteName + (ok ? ' ✅' : ' ❌') + '\\n' +\n            '延迟：' + elapsed + 'ms（' + level + '）'\n        );\n    } catch (e) {\n        java.longToast('\\n服务器：' + cur + '\\n❌ 连接失败\\n' + e);\n    }\n}\n\nfunction toggleRefresh() {\n    let conf = getConfig.call(this);\n    let on = (conf.chapter_refresh_force || 'off') == 'on';\n    setConfig.call(this, { chapter_refresh_force: on ? 'off' : 'on' });\n    java.toast(on ? '\\n✔️已关闭强制刷新' : '\\n❗已开启强制刷新（绕过缓存）');\n}\n\nfunction showConfig() {\n    let c = getConfig.call(this);\n    let s = c.sources || {};\n    let lines = [];\n    ['novel','audio','comic','video','download'].forEach(function(t){\n        let arr = s[t] || [];\n        let label = {novel:'小说',audio:'听书',comic:'漫画',video:'短剧',download:'下载'}[t];\n        lines.push(label + '：' + (arr.length ? arr.join('、') : '全部'));\n    });\n    let msg = '当前配置：\\n' +\n        '服务器：' + getHost.call(this) + '\\n' +\n        lines.join('\\n') + '\\n' +\n        '性别：' + (c.gender == 'girl' ? '女频' : '男频') + '\\n' +\n        '账号：' + (getToken.call(this).b64 ? '已登录' : '未登录') + '\\n' +\n        '番茄：' + (getSessionId.call(this) ? '已登录' : '未登录');\n    java.longToast(msg);\n}\n\nfunction register() { java.startBrowserAwait(getHost.call(this) + '/spa/#/register', \"注册\"); }\nfunction user() { java.startBrowserAwait(getHost.call(this) + '/spa/#/member', \"用户中心\"); }\nfunction icons() { java.startBrowserAwait(getHost.call(this) + '/spa/#/member/icons', \"段评气泡\"); }\nfunction level() { java.startBrowserAwait('https://wzyp.cn/shop/FXB8NXCR', \"升级\"); }", "respondTime": 180000, "ruleBookInfo": {"author": "$.author", "coverUrl": "$.cover", "init": "<js>\nif (String(baseUrl).startsWith(\"data:\")) {\n    let res = JSON.parse(java.hexDecodeToString(result));\n    let request = getHost.call(this) + `/api/detail,${JSON.stringify({\n        method: \"POST\",\n        body: JSON.stringify(res),\n        headers: buildHeaders.call(this)\n    })}`;\n    result = java.ajax(request);\n}\nresult = decryptIfEncrypted.call(this, result);\nresult = checkMsg.call(this, result);\nresult;\n</js>\n$.data", "intro": "&nbsp;&nbsp;\n❄️ 源站：{{$.source}}{{\"\\n\"+\"​\"}}\n{{$.desc}}", "kind": "$.tags", "lastChapter": "{{$.source}} · {{$.latest_chapter_title}}", "name": "$.title", "tocUrl": "<js>\nlet catalog = {\n    source: result.source,\n    sing: result.sing,\n    book_id: result.book_id,\n    title: result.title,\n    tab: result.tab\n};\n\nlet yunurl = java.base64Encode(JSON.stringify(catalog));\nresult = `data:catalogUrl;base64,${yunurl},{\"type\":\"qingci\"}`;\n</js>", "wordCount": "$.word_count"}, "ruleContent": {"callBackJs": "let handled = false;\n\nif (event == 'addBookShelf' || event == 'delBookShelf') {\n    if (isShelfSyncEnabled.call(this)) {\n        syncShelf.call(this, event == 'addBookShelf');\n    }\n    handled = true;\n}\n\nif (event == 'clickCustomButton') {\n    let targetUrl = '';\n\n    // 正文页：章评\n    if (chapter && chapter.url) {\n        try {\n            let chUrl = String(chapter.url);\n            let b64 = chUrl.replace(/^data:contentUrl;base64,/, '');\n            let idx = b64.indexOf(',');\n            if (idx >= 0) b64 = b64.substring(0, idx);\n            let params = JSON.parse(java.base64Decode(b64));\n            let bid = params.book_id || '';\n            let cid = params.item_id || '';\n            let src = params.source || '';\n            if (bid && cid) {\n                targetUrl = getHost.call(this) + '/comment?tab=chapter&book_id=' + bid\n                          + '&item_id=' + cid\n                          + '&source=' + src;\n            }\n        } catch (e) {}\n    }\n\n    // 详情页：书评\n    if (!targetUrl && book && book.tocUrl) {\n        try {\n            let tocUrl = String(book.tocUrl);\n            let b64 = tocUrl.replace(/^data:catalogUrl;base64,/, '');\n            let idx = b64.indexOf(',');\n            if (idx >= 0) b64 = b64.substring(0, idx);\n            let catalog = JSON.parse(java.base64Decode(b64));\n            let bid = catalog.book_id || catalog.bookid || '';\n            let src = catalog.source || '';\n            if (bid) {\n                targetUrl = getHost.call(this) + '/comment?tab=book&book_id=' + bid\n                          + '&source=' + src;\n            }\n        } catch (e) {}\n    }\n\n    if (targetUrl) {\n        java.showBrowser(\n            targetUrl,\n            null,\n            'window.java=java;',\n            JSON.stringify(getCmtBrowserOptions.call(this))\n        );\n    } else {\n        java.toast('请等待章节或详情加载完毕');\n    }\n    handled = true;\n}\n\nhandled;", "content": "@js:\nlet chapterParams = JSON.parse(java.hexDecodeToString(result));\nchapterParams.version = localVersion;\n\nlet conf = getConfig.call(this);\nlet sourceName = chapterParams.source || '';\n\nif (conf.chapter_refresh_force == 'on') {\n    chapterParams.force_refresh = 'on';\n}\n\nlet toneVar = String(book.getVariable('custom') || '');\nif (!toneVar) {\n    if (sourceName == '番茄听书') toneVar = '1';\n    else if (sourceName == '书旗听书') toneVar = 'yifei';\n}\nchapterParams.tone_id = toneVar;\nsyncProgress.call(this, chapterParams);\n\nlet paraOn = (conf.para_review || 'off') == 'on';\nlet paraStyle = conf.para_style || 'TEXT';\nlet syOn = (conf.para_sy || 'off') == 'on';\n\nif (syOn) {\n    chapterParams.devicetype = \"ios\";\n} else {\n    chapterParams.devicetype = \"android\";\n}\n\nlet paraSources = ['番茄小说', 'QQ阅读', '晋江', '七猫', '少年梦', '书旗'];\nif (paraOn && paraSources.indexOf(sourceName) !== -1) {\n    chapterParams.review = 'on';\n    chapterParams.style = paraStyle;\n}\n\nif (sourceName == '书旗听书' || sourceName == '番茄听书') {\n    let obj = postJson.call(this, '/api/audio', chapterParams);\n    let data = obj.data || {};\n    result = data.main_url || '';\n} else {\n    let obj = postJson.call(this, '/api/content', chapterParams);\n\n    if (shouldBlockByVersion.call(this, obj.data && obj.data.version)) {\n        result = '';\n    } else {\n        let content = (obj.data && obj.data.content != null) ? obj.data.content : obj.message;\n        let tab = (obj.data && obj.data.tab) || chapterParams.tab || '';\n\n        if (tab == 'video' && content && /^https?:\\/\\//i.test(String(content))) {\n            if (book.durChapterIndex == chapter.index) {\n                try {\n                    java.startBrowser(String(content), chapter.title);\n                    java.toast('正在加载视频\\n视频加载较慢，请耐心等待');\n                } catch (e) {}\n            }\n            result = '【刷新正文】播放\\n直链:\\n' + content;\n        } else {\n            result = content;\n        }\n    }\n}", "imageStyle": "FULL", "payAction": "let raw = String(baseUrl);\nlet b64 = raw.replace(/^data:contentUrl;base64,/, '');\nlet idx = b64.indexOf(',');\nif (idx >= 0) b64 = b64.substring(0, idx);\nlet chapterParams = JSON.parse(java.base64Decode(b64));\n\nlet bid = String(chapterParams.book_id || '');\nlet cid = String(chapterParams.item_id || '');\n\nlet token = getJjToken.call(this);\nlet enbody = String(Date.now()) + \":\" + token + \":\" + bid;\nlet sign = encode.call(this, enbody);\nlet body = \"versionCode=444&novelId=\" + bid + \"&chapters=\" + cid + \"&orderType=15&isautoBuy=0&autosubscribeStatus=0&notUseBackpoint=&sign=\" + sign;\nlet url = \"https://android.jjwxc.net/androidapi/buy,\";\nlet post = { \"method\": \"POST\", \"body\": String(body) };\nlet a = java.ajax(url + JSON.stringify(post));\nlet res = JSON.parse(a);\nif (/购买成功/.test(res.message)) {\n    java.longToast(res.message);\n    result = true;\n} else {\n    let mm = res.message == \"\"\n        ? (res.popupdata && res.popupdata.popupmessage ? res.popupdata.popupmessage : \"购买失败\") + \"\\n❗️进晋江app进行一次验证后❗️才能在阅读app使用购买功能\"\n        : res.message;\n    java.longToast(mm);\n}", "subContent": "@js:\nlet chapterParams = JSON.parse(java.hexDecodeToString(result));\n\nvar sourceName = chapterParams.source || '';\n\nlet toneVar = String(book.getVariable('custom') || '');\nif (!toneVar) {\n    if (sourceName == '番茄听书') toneVar = '1';\n    else if (sourceName == '书旗听书') toneVar = 'yifei';\n}\nchapterParams.tone_id = toneVar;\n\nlet allowSources = ['番茄听书', '番茄畅听', '七猫听书', '酷我听书', '书旗听书'];\nif (allowSources.indexOf(sourceName) == -1) {\n    result = '';\n} else {\n    let headers = buildHeaders.call(this);\n    headers['Content-Type'] = 'application/json';\n    let op = { method: \"POST\", body: JSON.stringify(chapterParams), headers: headers };\n    let url = getHost.call(this) + `/api/lrc,${JSON.stringify(op)}`;\n    let res = java.ajax(url);\n    res = decryptIfEncrypted.call(this, res);\n    let obj = JSON.parse(res);\n    result = (obj.data && obj.data.lrc) ? obj.data.lrc : '';\n}"}, "ruleExplore": {"author": "$.author", "bookList": "<js>\nlet res = decryptIfEncrypted.call(this, result);\nres = checkMsg.call(this, res);\nresult = res;\n</js>\n$.data", "bookUrl": "<js>\nlet detail = {\n    source: result.source,\n    sing: result.sing,\n    book_id: result.book_id\n};\nlet yunurl = java.base64Encode(JSON.stringify(detail));\nresult = `data:detailsUrl;base64,${yunurl},{\"type\":\"qingci\"}`;\n</js>", "coverUrl": "$.cover", "intro": "$.desc", "kind": "$.tags", "lastChapter": "$.latest_chapter_title", "name": "$.title", "wordCount": "$.word_count"}, "ruleSearch": {"author": "$.author", "bookList": "<js>\nlet res = decryptIfEncrypted.call(this, result);\nres = checkMsg.call(this, res);\nresult = res;\n</js>\n$.data.list", "bookUrl": "<js>\nlet detail = {\n    source: result.source,\n    sing: result.sing,\n    book_id: result.book_id\n};\nlet yunurl = java.base64Encode(JSON.stringify(detail));\nresult = `data:detailsUrl;base64,${yunurl},{\"type\":\"qingci\"}`;\n</js>", "checkKeyWord": "十日终焉", "coverUrl": "$.cover", "intro": "$.desc", "kind": "$.tags", "lastChapter": "{{$.source}} · {{$.latest_chapter_title}}", "name": "$.title", "wordCount": "$.word_count"}, "ruleToc": {"chapterList": "<js>\nvar res = JSON.parse(java.hexDecodeToString(result));\nlet device = deviceType() ? 'ios' : 'android';\nlet typeMap;\n\nif (device == 'android') {\n    typeMap = { audio: 32, comic: 64 };\n    book.type = res.tab in typeMap ? typeMap[res.tab] : 8;\n} else {\n    typeMap = { audio: 1, comic: 2, video: 3 };\n    book.type = res.tab in typeMap ? typeMap[res.tab] : 0;\n}\nvar headers = buildHeaders.call(this);\nheaders['Content-Type'] = 'application/json';\nvar op = { method: \"POST\", body: JSON.stringify(res), headers: headers };\nvar url = getHost.call(this) + '/api/catalog,' + JSON.stringify(op);\nresult = java.ajax(url);\nresult = decryptIfEncrypted.call(this, result);\nresult = checkMsg.call(this, result);\nresult;\n</js>\n$.data", "chapterName": "$.title", "chapterUrl": "<js>\nif (result.is_volume == true) {\n    result = \"\";\n} else {\n    let content = {\n    \t   sing: result.sing,\n        book_id: result.book_id || \"\",\n        item_id: result.item_id || \"\",\n        content_md5: result.content_md5 || \"\",\n        chapter_index: result.chapter_index,\n        source: result.source\n    };\n    let yunurl = java.base64Encode(JSON.stringify(content));\n    result = `data:contentUrl;base64,${yunurl},{\"type\":\"qingci\"}`;\n}\n</js>", "isPay": "$.is_pay", "isVip": "$.is_vip", "isVolume": "$.is_volume", "updateTime": "$.tag"}, "searchUrl": "<js>\nvar conf = ensureConfig.call(this);\nvar sourceVal = conf.source || '';\nvar param = sourceVal ? '&source=' + sourceVal.split(',').map(function(s){ return s.trim(); }).join(',') : '';\n\nvar mode = conf.mode || 'novel';\nvar modeMap = {\n    '📖小说': 'novel',\n    '🎧听书': 'audio',\n    '🌈漫画': 'comic',\n    '▶️短剧': 'video',\n    '⬇️下载': 'download'\n};\nif (modeMap[mode]) mode = modeMap[mode];\n\nvar sources = conf.sources || {};\nvar allTabs = Array.isArray(conf.allTabs) ? conf.allTabs : [];\nvar tabs = ['novel', 'audio', 'comic', 'video', 'download'];\n\nvar curList = sources[mode] || [];\nif (curList.length == 0 && allTabs.indexOf(mode) == -1) {\n    for (var i = 0; i < tabs.length; i++) {\n        var t = tabs[i];\n        if ((sources[t] || []).length > 0 || allTabs.indexOf(t) != -1) {\n            mode = t;\n            break;\n        }\n    }\n}\n\nresult = getHost.call(this) + '/api/search?keyword={{key}}&page={{page}}&tab=' + mode + param;\n</js>", "weight": 0},{"bookSourceComment": "基于书源2修复：详情目录、目录规则、正文接口改用新站结构；保留线路切换与搜索验证。正文 API 使用当前章节域名，适配镜像切换。", "bookSourceGroup": "通常书源 📂", "bookSourceName": "📂霹雳书屋", "bookSourceType": 0, "bookSourceUrl": "https://www.pilishuwu.com", "bookUrlPattern": "https?://[^/]+/\\d+/\\d+/info\\.html", "concurrentRate": "1000", "customButton": false, "customOrder": 91, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreScreen": "", "exploreUrl": "[{\"title\":\"全部小说\",\"url\":\"{{host.call(this)}}/0/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"男频小说\",\"url\":\"{{host.call(this)}}/1/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"女频小说\",\"url\":\"{{host.call(this)}}/2/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"电子图书\",\"url\":\"{{host.call(this)}}/3/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"无CP小说\",\"url\":\"{{host.call(this)}}/4/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.3,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"纯爱小说\",\"url\":\"{{host.call(this)}}/5/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"百合小说\",\"url\":\"{{host.call(this)}}/6/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"轻小说\",\"url\":\"{{host.call(this)}}/8/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"最新入库\",\"url\":\"{{host.call(this)}}/top/list/0/1/{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"全部点击\",\"url\":\"{{host.call(this)}}/top/list/0/2/{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"本年点击\",\"url\":\"{{host.call(this)}}/top/list/0/3/{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"本月点击\",\"url\":\"{{host.call(this)}}/top/list/0/4/{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"本周点击\",\"url\":\"{{host.call(this)}}/top/list/0/5/{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"本日点击\",\"url\":\"{{host.call(this)}}/top/list/0/6/{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true}]", "header": "@js:\nvar h = host.call(this);\nJSON.stringify({\n  \"User-Agent\": java.getWebViewUA(),\n  \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\n  \"Accept-Language\": \"zh-CN,zh;q=0.9,en;q=0.8\",\n  \"Referer\": h + \"/\"\n})\n", "jsLib": "function host(){\n  var src=this.source;\n  var m=src?src.getLoginInfoMap():null;\n  var h=(m&&m[\"线路\"])||\"https://www.pili45.com\";\n  if(String(h).indexOf(\"http\")!=0){\n    if(String(h).indexOf(\"pilibook\")>=0) h=\"https://www.pilibook.net\";\n    else if(String(h).indexOf(\"pilishuwu\")>=0) h=\"https://www.pilishuwu.com\";\n    else h=\"https://www.pili45.com\";\n  }\n  return String(h).replace(/\\/$/,\"\");\n}", "lastUpdateTime": "1793975442494", "loginCheckJs": "var resultUrl = result.url();\nvar resultCode = result.code();\nvar resultBoDy = String(result.body()||\"\");\nif (/Just a moment|Checking your browser|_cf_|cf-browser-verification|challenge-platform/i.test(resultBoDy) && resultCode >= 403) {\n  java.longToast(\"请完成人机验证后点右上角对勾\");\n  cookie.removeCookie(baseUrl);\n  result = java.startBrowserAwait(resultUrl, \"Cloudflare验证\", false);\n}\nresult;", "loginUi": "[{\"name\":\"线路\",\"type\":\"select\",\"chars\":[\"https://www.pilishuwu.com\",\"https://www.pilibook.net\",\"https://www.pili45.com\"],\"default\":\"https://www.pili45.com\"}]", "loginUrl": "@js:\nfunction login(){\n  var m=source.getLoginInfoMap()||{};\n  source.putLoginInfo(JSON.stringify(m));\n  java.toast(\"已切换线路：\"+host.call(this));\n}\n", "respondTime": 130012, "ruleBookInfo": {"author": ".custom-info-box p.1@text##作者：||div.book-info-status a[href*=author]@text||p.book-status@text", "coverUrl": ".custom-cover-img@src||img.0@src||div.book-cover img@src||img.book-cover@src", "intro": "标签：{{@@.custom-tags a@text##\\s##,}}\n简介：{{@@.custom-intro@text}}", "kind": ".custom-tags a@text##\\s##,||.custom-info-box p.2@text##分类：||a.book-fenlei@text||span.book-fenlei@text", "lastChapter": ".custom-latest-chapter a@text||.custom-latest-chapter@text||a.book-newest@text", "name": ".custom-book-name@text||p.custom-book-name@text||h1@text||h2.book-title@text", "tocUrl": "text.章节目录@href||@js:baseUrl.replace(/info\\.html.*$/, 'menu/1.html')"}, "ruleContent": {"content": "@js:\nvar html = String(result || '');\nvar cid = '';\nvar m1 = html.match(/data-chapter-id=\"(\\d+)\"/);\nif (m1) cid = m1[1];\nif (!cid) {\n  var m2 = html.match(/id:\\s*'(\\d+)'/);\n  if (m2) cid = m2[1];\n}\nvar content = '';\nif (cid) {\n  var om = baseUrl.match(/^https?:\\/\\/[^\\/]+/);\n  var origin = om ? om[0] : source.key;\n  var apiUrl = origin + '/wmcms/ajax/index.php?action=novel.getchapter&cid=' + cid + '&format=1';\n  var res = java.ajax(apiUrl);\n  try {\n    var json = JSON.parse(res);\n    if (json.code == 200 && json.data && json.data.chapter) {\n      var ch = json.data.chapter;\n      if (String(ch.chapter_isvip) == '0' && ch.content && ch.content.length > 0) {\n        var lines = [];\n        for (var i = 0; i < ch.content.length; i++) lines.push(String(ch.content[i]));\n        content = lines.join('\\n');\n      } else if (String(ch.chapter_isvip) != '0') {\n        content = '【VIP章节，需订阅后阅读】';\n      } else {\n        content = '【本章内容为空】';\n      }\n    } else {\n      content = '【接口返回异常 code=' + json.code + '】';\n    }\n  } catch(e) {\n    content = '【JSON解析失败: ' + e + '】';\n  }\n} else {\n  content = '【未能提取章节ID】';\n}\nresult = content;\nresult;", "nextContentUrl": "#readLoadNext a:last-child@href", "title": "#chapterTitle@text"}, "ruleExplore": {"author": "p.x-book__info--author@tag.span.0@text||.x-info__author span@text||span.book-status@text", "bookList": ".x-library__books .x-book||.x-rank__book||div.x-book", "bookUrl": "a@href", "coverUrl": "img@data-src||img@src||img.x-book__cover@src", "intro": ".x-book__info--chapter@text||.x-info__intro@text||p.x-book__intro@text", "kind": "span.red@text||.x-info__author@ownText||span.book-fenlei@text", "name": ".x-book__info--name@text||.x-info__name@text||p.x-book__info--name@text", "wordCount": ".word-convert@text"}, "ruleSearch": {"author": ".book-status@text||p.x-book__info--author@tag.span.0@text||span.book-status@text", "bookList": "@js:\nfunction books(){var a=java.getElements('.x-library__books .x-book');if(a&&a.size()>0)return a;return java.getElements('.x-book');}\nvar c=books();\nif(c&&c.size()>0){c;}else{\nvar s=String(result||'');\nvar need=s.indexOf('验证码')>=0 && s.indexOf('请稍候')<0 && s.indexOf('Just a moment')<0 && s.indexOf('搜索结果')<0;\nif(need){\njava.longToast('请完成搜索验证后点右上角对勾');\nvar resp=java.startBrowserAwait(java.get('url'),'搜索验证');\nvar html='';try{html=String(resp.body());}catch(e){html=String(resp);}\njava.setContent(html);\nc=books();\n}\nc;\n}", "bookUrl": ".x-book__coverbox a@href", "checkKeyWord": "系统", "coverUrl": "img@data-src||img@src||img.x-book__cover@src", "intro": ".x-book__intro@text||.x-book__info--chapter@text||p.x-book__intro@text", "kind": ".book-fenlei@text||span.red@text||span.book-fenlei@text", "name": ".x-book__info--name@text||p.x-book__info--name@text", "wordCount": ".word-convert@text"}, "ruleToc": {"chapterList": "ol#chapterListContainer li.custom-chapter-item || #chapterListContainer li.custom-chapter-item", "chapterName": "a span@text || a@text", "chapterUrl": "a@href", "nextTocUrl": "a:contains(下一页)@href || a:contains(下页)@href"}, "searchUrl": "@js:\nvar k = java.encodeURI(key);\nvar h = host.call(this);\nvar url = page > 1\n  ? (h + \"/search/0/\" + k + \"/\" + page + \".html\")\n  : (h + \"/module/search/search.php?key=\" + k + \"&module=novel&type=0\");\njava.put(\"url\", url);\nvar waitJs = \"(()=>{var b=document.querySelectorAll('.x-book');if(b.length)return document.documentElement.outerHTML;var t=document.title||'';var h=document.body?document.body.innerHTML:'';if(h.indexOf('验证码')>=0&&t.indexOf('请稍候')<0&&t.indexOf('Just a moment')<0)return document.documentElement.outerHTML;return null;})()\";\nurl + ',' + JSON.stringify({webView:true, webJs:waitJs, webViewDelayTime:1500});\n", "variableComment": "登录UI「线路」：主站 pilishuwu.com / 镜像 pilibook.net / 镜像 pili45.com。默认 pili45.com。目录/详情/正文已按新站结构修复。", "weight": 0},{"bookSourceComment": "基于书源2修复：详情目录、目录规则、正文接口改用新站结构；保留线路切换与搜索验证。正文 API 使用当前章节域名，适配镜像切换。", "bookSourceGroup": "通常书源 📂", "bookSourceName": "📂霹雳书屋", "bookSourceType": 0, "bookSourceUrl": "https://www.pilishuwu.com", "bookUrlPattern": "https?://[^/]+/\\d+/\\d+/info\\.html", "concurrentRate": "1000", "customButton": false, "customOrder": 92, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreScreen": "", "exploreUrl": "[{\"title\":\"全部小说\",\"url\":\"{{host.call(this)}}/0/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"男频小说\",\"url\":\"{{host.call(this)}}/1/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"女频小说\",\"url\":\"{{host.call(this)}}/2/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"电子图书\",\"url\":\"{{host.call(this)}}/3/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"无CP小说\",\"url\":\"{{host.call(this)}}/4/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.3,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"纯爱小说\",\"url\":\"{{host.call(this)}}/5/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"百合小说\",\"url\":\"{{host.call(this)}}/6/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"轻小说\",\"url\":\"{{host.call(this)}}/8/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"最新入库\",\"url\":\"{{host.call(this)}}/top/list/0/1/{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"全部点击\",\"url\":\"{{host.call(this)}}/top/list/0/2/{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"本年点击\",\"url\":\"{{host.call(this)}}/top/list/0/3/{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"本月点击\",\"url\":\"{{host.call(this)}}/top/list/0/4/{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"本周点击\",\"url\":\"{{host.call(this)}}/top/list/0/5/{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true},{\"title\":\"本日点击\",\"url\":\"{{host.call(this)}}/top/list/0/6/{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1},\"webView\":true}]", "header": "@js:\nvar h = host.call(this);\nJSON.stringify({\n  \"User-Agent\": java.getWebViewUA(),\n  \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\n  \"Accept-Language\": \"zh-CN,zh;q=0.9,en;q=0.8\",\n  \"Referer\": h + \"/\"\n})\n", "jsLib": "function host(){\n  var src=this.source;\n  var m=src?src.getLoginInfoMap():null;\n  var h=(m&&m[\"线路\"])||\"https://www.pili45.com\";\n  if(String(h).indexOf(\"http\")!=0){\n    if(String(h).indexOf(\"pilibook\")>=0) h=\"https://www.pilibook.net\";\n    else if(String(h).indexOf(\"pilishuwu\")>=0) h=\"https://www.pilishuwu.com\";\n    else h=\"https://www.pili45.com\";\n  }\n  return String(h).replace(/\\/$/,\"\");\n}", "lastUpdateTime": "1793974061538", "loginCheckJs": "var resultUrl = result.url();\nvar resultCode = result.code();\nvar resultBoDy = String(result.body()||\"\");\nif (/Just a moment|Checking your browser|_cf_|cf-browser-verification|challenge-platform/i.test(resultBoDy) && resultCode >= 403) {\n  java.longToast(\"请完成人机验证后点右上角对勾\");\n  cookie.removeCookie(baseUrl);\n  result = java.startBrowserAwait(resultUrl, \"Cloudflare验证\", false);\n}\nresult;", "loginUi": "[{\"name\":\"线路\",\"type\":\"select\",\"chars\":[\"https://www.pilishuwu.com\",\"https://www.pilibook.net\",\"https://www.pili45.com\"],\"default\":\"https://www.pili45.com\"}]", "loginUrl": "@js:\nfunction login(){\n  var m=source.getLoginInfoMap()||{};\n  source.putLoginInfo(JSON.stringify(m));\n  java.toast(\"已切换线路：\"+host.call(this));\n}\n", "respondTime": 130012, "ruleBookInfo": {"author": ".x-detail__info--author@text##作者：||div.book-info-status a[href*=author]@text||p.book-status@text", "coverUrl": "class.x-book__coverbox.0@tag.img.0@src||div.book-cover img@src||img.book-cover@src", "intro": ".x-detail__intro--content@text||div.book-intro@text||p.book-intro@text", "kind": ".x-detail__info--words.0@text##分类：##||a.book-fenlei@text||span.book-fenlei@text", "lastChapter": ".x-catalog__new@text##最新||a.book-newest@text", "name": ".x-detail__info--title@text||h1@text||h2.book-title@text", "tocUrl": "@js:baseUrl.replace(/info\\.html.*$/, 'menu/1.html')"}, "ruleContent": {"content": "@js:\nvar html = String(result || '');\nvar cid = '';\nvar m1 = html.match(/data-chapter-id=\"(\\d+)\"/);\nif (m1) cid = m1[1];\nif (!cid) {\n  var m2 = html.match(/id:\\s*'(\\d+)'/);\n  if (m2) cid = m2[1];\n}\nvar content = '';\nif (cid) {\n  var om = baseUrl.match(/^https?:\\/\\/[^\\/]+/);\n  var origin = om ? om[0] : source.key;\n  var apiUrl = origin + '/wmcms/ajax/index.php?action=novel.getchapter&cid=' + cid + '&format=1';\n  var res = java.ajax(apiUrl);\n  try {\n    var json = JSON.parse(res);\n    if (json.code == 200 && json.data && json.data.chapter) {\n      var ch = json.data.chapter;\n      if (String(ch.chapter_isvip) == '0' && ch.content && ch.content.length > 0) {\n        var lines = [];\n        for (var i = 0; i < ch.content.length; i++) lines.push(String(ch.content[i]));\n        content = lines.join('\\n');\n      } else if (String(ch.chapter_isvip) != '0') {\n        content = '【VIP章节，需订阅后阅读】';\n      } else {\n        content = '【本章内容为空】';\n      }\n    } else {\n      content = '【接口返回异常 code=' + json.code + '】';\n    }\n  } catch(e) {\n    content = '【JSON解析失败: ' + e + '】';\n  }\n} else {\n  content = '【未能提取章节ID】';\n}\nresult = content;\nresult;", "nextContentUrl": "#readLoadNext a:last-child@href", "title": "#chapterTitle@text"}, "ruleExplore": {"author": "p.x-book__info--author@tag.span.0@text||.x-info__author span@text||span.book-status@text", "bookList": ".x-library__books .x-book||.x-rank__book||div.x-book", "bookUrl": "a@href", "coverUrl": "img@data-src||img@src||img.x-book__cover@src", "intro": ".x-book__info--chapter@text||.x-info__intro@text||p.x-book__intro@text", "kind": "span.red@text||.x-info__author@ownText||span.book-fenlei@text", "name": ".x-book__info--name@text||.x-info__name@text||p.x-book__info--name@text", "wordCount": ".word-convert@text"}, "ruleSearch": {"author": ".book-status@text||p.x-book__info--author@tag.span.0@text||span.book-status@text", "bookList": "@js:\nfunction books(){var a=java.getElements('.x-library__books .x-book');if(a&&a.size()>0)return a;return java.getElements('.x-book');}\nvar c=books();\nif(c&&c.size()>0){c;}else{\nvar s=String(result||'');\nvar need=s.indexOf('验证码')>=0 && s.indexOf('请稍候')<0 && s.indexOf('Just a moment')<0 && s.indexOf('搜索结果')<0;\nif(need){\njava.longToast('请完成搜索验证后点右上角对勾');\nvar resp=java.startBrowserAwait(java.get('url'),'搜索验证');\nvar html='';try{html=String(resp.body());}catch(e){html=String(resp);}\njava.setContent(html);\nc=books();\n}\nc;\n}", "bookUrl": ".x-book__coverbox a@href", "checkKeyWord": "系统", "coverUrl": "img@data-src||img@src||img.x-book__cover@src", "intro": ".x-book__intro@text||.x-book__info--chapter@text||p.x-book__intro@text", "kind": ".book-fenlei@text||span.red@text||span.book-fenlei@text", "name": ".x-book__info--name@text||p.x-book__info--name@text", "wordCount": ".word-convert@text"}, "ruleToc": {"chapterList": "ol#chapterListContainer li.custom-chapter-item || #chapterListContainer li.custom-chapter-item", "chapterName": "a span@text || a@text", "chapterUrl": "a@href", "nextTocUrl": "a:contains(下一页)@href || a:contains(下页)@href"}, "searchUrl": "@js:\nvar k = java.encodeURI(key);\nvar h = host.call(this);\nvar url = page > 1\n  ? (h + \"/search/0/\" + k + \"/\" + page + \".html\")\n  : (h + \"/module/search/search.php?key=\" + k + \"&module=novel&type=0\");\njava.put(\"url\", url);\nvar waitJs = \"(()=>{var b=document.querySelectorAll('.x-book');if(b.length)return document.documentElement.outerHTML;var t=document.title||'';var h=document.body?document.body.innerHTML:'';if(h.indexOf('验证码')>=0&&t.indexOf('请稍候')<0&&t.indexOf('Just a moment')<0)return document.documentElement.outerHTML;return null;})()\";\nurl + ',' + JSON.stringify({webView:true, webJs:waitJs, webViewDelayTime:1500});\n", "variableComment": "登录UI「线路」：主站 pilishuwu.com / 镜像 pilibook.net / 镜像 pili45.com。默认 pili45.com。目录/详情/正文已按新站结构修复。", "weight": 0},{"bookSourceComment": "猫扑中文文学阅读 m.bookmaopu.com\n1. 全站需移动端 UA（header 已内置；旧版安卓 UA 会被 CF WAF 403，请勿改动）。\n2. 搜索为 POST /page/search.html，单次返回 30 条；站点翻页依赖服务端会话，书源只取第一页，换词重搜即可。\n3. 正文分页是字符流硬切（跨页断句、标签被切半），ruleContent 用 JS 逐页抓取按原序无缝拼接；未用官方 nextContentUrl（多页按换行拼接会断句，且末页「下一章」指向目录页会引入噪声）。\n4. 站点无发布页/多线路；阅读正文无需登录，故未配置登录界面。\n5. 刚更新的最新章节页面可能短暂只有「阅读提示」无正文（站点生成延迟），稍后重试即可。\n6. 兼容两套正文模板（新书 <p> 段 / 老书 <br><br> 段），过滤站点维护提示与孤立标点。\n7. 封面双路径：/uploads/images/<ID>s.jpg 是有效真实封面（实测 8/8 200 图片），/uploads/<日期>/<hash>.jpg 旧路径已全站 404（0/21）；列表 img 多为空靠 onerror 兜底 nocover.jpg。coverUrl 用 @js 判定：有效真实封面绝对化、旧死链/空回退 /static/images/nocover.jpg（列表规则从 result.parent() 的 ul.xbk 取兄弟 li.tjimg img，详情规则从整页 HTML 字符串取 .xsfm img）。", "bookSourceGroup": "AI", "bookSourceName": "猫扑中文文学", "bookSourceType": 0, "bookSourceUrl": "https://m.bookmaopu.com", "bookUrlPattern": "https?://m\\.bookmaopu\\.com/\\d+\\.html", "concurrentRate": "1/500", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "玄幻奇幻::/1.html?page={{page}}\n仙侠修真::/2.html?page={{page}}\n都市青春::/3.html?page={{page}}\n穿越历史::/4.html?page={{page}}\n网游竞技::/5.html?page={{page}}\n科幻科技::/6.html?page={{page}}\n恐怖灵异::/7.html?page={{page}}\n女生言情::/8.html?page={{page}}\n其他类型::/9.html?page={{page}}\n排行榜::/top.html\n完本::/news.html", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.82 Mobile Safari/537.36\"}", "lastUpdateTime": "1793973331593", "respondTime": 180000, "ruleBookInfo": {"author": "class.xx.0@tag.li.1@tag.a.0@text", "canReName": "1", "coverUrl": "@js:(function(){\nvar base='https://m.bookmaopu.com';\nvar NO=base+'/static/images/nocover.jpg';\nvar s='';\ntry{\n  if(typeof result==='string'){\n    var m=result.match(/<div class=\\x22xsfm\\x22>\\s*<img[^>]*src=\\x22([^\\x22]*)\\x22/);\n    s=m?m[1]:'';\n  }else if(result&&result.select){\n    var im=result.select('li.tjimg img').first();\n    if(!im&&result.parent){im=result.parent().select('li.tjimg img').first();}\n    s=im?im.attr('src'):'';\n  }else if(result&&result.parent){\n    var im2=result.parent().select('li.tjimg img').first();\n    s=im2?im2.attr('src'):'';\n  }\n}catch(e){}\ns=String(s||'').trim();\nif(!s||s.indexOf('nocover')>=0)return NO;\nif(s.indexOf('http')===0)return s;\nif(s.charAt(0)!=='/')s='/'+s;\n// 旧目录 /uploads/<6位日期>/<hash>.jpg 已全站 404（实测 0/21），直接回退\nif(/^\\/uploads\\/\\d{6}\\//.test(s))return NO;\nreturn base+s;\n})()", "intro": "class.jianjie.0@text", "kind": "class.xx.0@tag.li.0@tag.a.0@text", "lastChapter": "class.xx.0@tag.li.4@tag.a.0@text", "name": "tag.h1.0@text"}, "ruleContent": {"content": "@js:(function(){\nvar root='https://m.bookmaopu.com';\nvar cur=String(baseUrl);\nvar ids=cur.match(/:\\/\\/[^\\/]+\\/(\\d+)\\/(\\d+)\\//)||[];var bookId=ids[1]||'';var chapId=ids[2]||'';\nvar seen={},parts=[],guard=0,first=true;\nwhile(cur&&guard<30){\n  guard++;\n  if(seen[cur])break;\n  seen[cur]=1;\n  var u=cur.indexOf('http')===0?cur:root+cur;\n  var h=(first&&typeof result!=='undefined'&&result)?String(result):String(java.ajax(u));\n  first=false;\n  var m=h.match(/<div id=\\x22nr1\\x22>([\\s\\S]*?)<\\/div>/);\n  if(!m)break;\n  var t=m[1];\n  t=t.replace(/^[\\s\\S]*?正常阅读！\\s*(?:(?:<br\\s*\\/?\\s*>|\\s)*)/,'');\n  t=t.replace(/<(?![a-zA-Z\\/!])/g,'');\n  t=t.replace(/<p>[^<]*(?:还未完|请点击下一页|请大家收藏)[^<]*<\\/p>/g,'');\n  t=t.replace(/^\\s*\\/p>\\s*/,'');\n  t=t.replace(/(?:<br\\s*\\/?\\s*>\\s*)+$/,'');\n  t=t.replace(/<div align=\\x22center\\x22>[\\s\\S]*?<\\/div>/g,'');\n  t=t.replace(/报送后维护人员会在两分钟内校正章节内容\\s*[,，]?\\s*请耐心等待。?\\s*/g,'');\n  parts.push(t);\n  var n=h.match(/id=\\x22pb_next\\x22\\s+href=\\x22([^\\x22]*)\\x22/);\n  var nx=n?n[1]:'';\n  if(!nx||nx==='javascript:;'||nx.indexOf('/'+bookId+'/'+chapId+'/')!==0||!/\\/\\d+\\.html$/.test(nx))break;\n  cur=nx;\n}\nvar html=parts.join('');\nhtml=html.replace(/<div align=\\x22center\\x22[^>]*>[\\s\\S]*$/,'');\n\nhtml=html.replace(/<p[^>]*>/g,'').replace(/<\\/p>/g,'\\n');\nhtml=html.replace(/<br\\s*\\/?\\s*>/g,'\\n');\nhtml=html.replace(/&nbsp;/g,' ').replace(/&ldquo;/g,'“').replace(/&rdquo;/g,'”').replace(/&lsquo;/g,'‘').replace(/&rsquo;/g,'’').replace(/&hellip;/g,'…').replace(/&mdash;/g,'—').replace(/&amp;/g,'&');\nhtml=html.replace(/[ \\t]+/g,' ');\nhtml=html.replace(/ ?\\n ?/g,'\\n');\nhtml=html.replace(/[^\\n]*(?:align=\\x22center|postError|报送后维护人员|请耐心等待)[^\\n]*\\n?/g,'');\nhtml=html.replace(/\\n\\s*[,，]\\s*(?=\\n|$)/g,'\\n');html=html.replace(/\\n{3,}/g,'\\n\\n').replace(/^\\s+/,'');\nreturn html;\n})()"}, "ruleExplore": {"author": "tag.span.1@tag.a.0@text", "bookList": "class.tjxs", "bookUrl": "class.xsm.0@tag.a.0@href", "coverUrl": "@js:(function(){\nvar base='https://m.bookmaopu.com';\nvar NO=base+'/static/images/nocover.jpg';\nvar s='';\ntry{\n  if(typeof result==='string'){\n    var m=result.match(/<div class=\\x22xsfm\\x22>\\s*<img[^>]*src=\\x22([^\\x22]*)\\x22/);\n    s=m?m[1]:'';\n  }else if(result&&result.select){\n    var im=result.select('li.tjimg img').first();\n    if(!im&&result.parent){im=result.parent().select('li.tjimg img').first();}\n    s=im?im.attr('src'):'';\n  }else if(result&&result.parent){\n    var im2=result.parent().select('li.tjimg img').first();\n    s=im2?im2.attr('src'):'';\n  }\n}catch(e){}\ns=String(s||'').trim();\nif(!s||s.indexOf('nocover')>=0)return NO;\nif(s.indexOf('http')===0)return s;\nif(s.charAt(0)!=='/')s='/'+s;\n// 旧目录 /uploads/<6位日期>/<hash>.jpg 已全站 404（实测 0/21），直接回退\nif(/^\\/uploads\\/\\d{6}\\//.test(s))return NO;\nreturn base+s;\n})()", "intro": "tag.span.2@text", "kind": "class.tjrs.0@tag.i.0@text", "name": "class.xsm.0@tag.a.0@text"}, "ruleSearch": {"author": "tag.span.1@tag.a.0@text", "bookList": "class.tjxs", "bookUrl": "class.xsm.0@tag.a.0@href", "checkKeyWord": "全民", "coverUrl": "@js:(function(){\nvar base='https://m.bookmaopu.com';\nvar NO=base+'/static/images/nocover.jpg';\nvar s='';\ntry{\n  if(typeof result==='string'){\n    var m=result.match(/<div class=\\x22xsfm\\x22>\\s*<img[^>]*src=\\x22([^\\x22]*)\\x22/);\n    s=m?m[1]:'';\n  }else if(result&&result.select){\n    var im=result.select('li.tjimg img').first();\n    if(!im&&result.parent){im=result.parent().select('li.tjimg img').first();}\n    s=im?im.attr('src'):'';\n  }else if(result&&result.parent){\n    var im2=result.parent().select('li.tjimg img').first();\n    s=im2?im2.attr('src'):'';\n  }\n}catch(e){}\ns=String(s||'').trim();\nif(!s||s.indexOf('nocover')>=0)return NO;\nif(s.indexOf('http')===0)return s;\nif(s.charAt(0)!=='/')s='/'+s;\n// 旧目录 /uploads/<6位日期>/<hash>.jpg 已全站 404（实测 0/21），直接回退\nif(/^\\/uploads\\/\\d{6}\\//.test(s))return NO;\nreturn base+s;\n})()", "intro": "tag.span.2@text", "kind": "class.tjrs.0@tag.i.0@text", "name": "class.xsm.0@tag.a.0@text"}, "ruleToc": {"chapterList": "class.zxjz.-1@tag.li", "chapterName": "tag.a.0@text", "chapterUrl": "tag.a.0@href"}, "searchUrl": "https://m.bookmaopu.com/page/search.html,{\"method\":\"POST\",\"body\":\"type=articlename&searchkey={{key}}\"}", "weight": 0},{"bookSourceName": "❄️听雪聚合", "bookSourceType": 0, "bookSourceUrl": "听雪聚合", "customButton": true, "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": true, "exploreUrl": "@js:\nvar conf = ensureConfig.call(this);\nvar currentSource = conf.source || '';\nvar currentGender = conf.gender || 'boy';\n\nvar srcList = getSourceList.call(this);\nvar srcMeta = {};\nfor (var i = 0; i < srcList.length; i++) {\n    srcMeta[srcList[i].name] = srcList[i];\n}\n\nvar currentMode = conf.mode || 'novel';\nvar firstSource = String(currentSource || '').split(',')[0].trim();\nif (firstSource && srcMeta[firstSource] && srcMeta[firstSource].tab) {\n    currentMode = srcMeta[firstSource].tab;\n}\n\nvar MODE_LABELS = {\n    novel: '📖小说',\n    audio: '🎧听书',\n    comic: '🌈漫画',\n    video: '▶️短剧',\n    download: '⬇️下载'\n};\nvar LABEL_TO_MODE = {\n    '📖小说': 'novel',\n    '🎧听书': 'audio',\n    '🌈漫画': 'comic',\n    '▶️短剧': 'video',\n    '⬇️下载': 'download'\n};\n\nvar srcOptions = [{ label: '☁️聚合搜索', value: '' }];\nfor (var i = 0; i < srcList.length; i++) {\n    var it = srcList[i];\n    if (it.tab && it.tab != currentMode) continue;\n    srcOptions.push({ label: it.name, value: it.name });\n}\n\nvar defaultLabel = '☁️聚合搜索';\nfor (var k = 0; k < srcOptions.length; k++) {\n    if (srcOptions[k].value == firstSource) { defaultLabel = srcOptions[k].label; break; }\n}\nvar srcMapStr = JSON.stringify(srcOptions).replace(/\\\\/g,'\\\\\\\\').replace(/\"/g,'\\\\\"');\n\nvar firstModeSource = '';\nfor (var i = 0; i < srcList.length; i++) {\n    if (srcList[i].tab == currentMode && srcList[i].name) { firstModeSource = srcList[i].name; break; }\n}\nvar useSource = firstSource || firstModeSource;\n\nvar controls = [];\ncontrols.push({ title: '☃关键词💭：书名/作者', type: 'text', style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.6 } });\ncontrols.push({ title: '🔍搜索', type: 'button', action: \"java.searchBook(infoMap['☃关键词💭：书名/作者'] || '')\", style: { layout_flexGrow: 1, layout_flexBasisPercent: -1, layout_alignSelf: 'baseline' } });\ncontrols.push({ title: '🔄刷新', type: 'button', action: 'java.refreshExplore()', style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.4, layout_alignSelf: 'baseline' } });\ncontrols.push({ title: '⚙登录', type: 'button', action: \"java.open('login','http',null)\", style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.4, layout_alignSelf: 'baseline' } });\n\ncontrols.push({\n    title: '性别',\n    type: 'select',\n    chars: ['♂️男频', '♀️女频'],\n    default: currentGender == 'girl' ? '♀️女频' : '♂️男频',\n    action: \"(function(){var raw=infoMap['性别']||'';var v=(raw.indexOf('女')>=0)?'girl':'boy';setConfig.call(this,{gender:v});java.refreshExplore();})()\",\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.4 }\n});\n\ncontrols.push({\n    title: '模式',\n    type: 'select',\n    chars: ['📖小说', '🎧听书', '🌈漫画', '▶️短剧', '⬇️下载'],\n    default: MODE_LABELS[currentMode] || '📖小说',\n    action: \"(function(){var raw=infoMap['模式']||'';var map=JSON.parse('\" + JSON.stringify(LABEL_TO_MODE).replace(/\\\\/g,'\\\\\\\\').replace(/\"/g,'\\\\\"') + \"');var v=map[raw]||'novel';setConfig.call(this,{mode:v,source:''});java.refreshExplore();})()\",\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.4 }\n});\n\ncontrols.push({\n    title: '源站',\n    type: 'select',\n    chars: srcOptions.map(function(x){return x.label;}),\n    default: defaultLabel,\n    action: \"(function(){var raw=infoMap['源站']||'';var opts=JSON.parse('\" + srcMapStr + \"');var map={};opts.forEach(function(i){map[i.label]=i.value;});setConfig.call(this,{source:map[raw]||''});java.refreshExplore();})()\",\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n});\n\nvar currentJjTab = getConfig.call(this).jj_tab || '多元';\nif (String(useSource).indexOf('晋江') >= 0) {\n    var jjTabs = [\"🏷 言情\", \"🏷 纯爱\", \"🏷 百合\", \"🏷 无Cp\", \"🏷 多元\"];\n    var jjTagMap = {\"🏷 言情\":\"言情\",\"🏷 纯爱\":\"纯爱\",\"🏷 百合\":\"百合\",\"🏷 无Cp\":\"无Cp\",\"🏷 多元\":\"多元\"};\n    var jjTagMapStr = JSON.stringify(jjTagMap).replace(/\\\\/g,'\\\\\\\\').replace(/\"/g,'\\\\\"');\n\n    controls.push({\n        title: '频道',\n        type: 'select',\n        chars: jjTabs,\n        default: \"🏷 \" + currentJjTab,\n        action: \"(function(){var raw=infoMap['频道']||'';var tagMap=JSON.parse('\" + jjTagMapStr + \"');var tagName=tagMap[raw]||'多元';setConfig.call(this,{jj_tab:tagName});java.refreshExplore();})()\",\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n    });\n}\n\nvar sort = controls.slice();\n\n/* v41.24：发现页书架（聚合/番茄显示番茄，晋江显示晋江；其他源不显示） */\nvar shelfEntries = [];\nvar shelfFirstSource = String(firstSource || '').trim();\nvar showFanqieShelf = shelfFirstSource == '' || shelfFirstSource.indexOf('番茄') >= 0;\nvar showJjShelf = shelfFirstSource.indexOf('晋江') >= 0;\n\nfunction shelfUrl(sourceName, loginValue, groupValue) {\n    return getHost.call(this) + '/api/bookshelf,' + JSON.stringify({\n        method: 'POST',\n        body: JSON.stringify({\n            source: sourceName,\n            logins: String(loginValue || ''),\n            group: String(groupValue || '')\n        }),\n        headers: buildHeaders.call(this)\n    });\n}\n\nfunction makeShelfBookList(sourceName, loginValue) {\n    try {\n        var shelfRes = postJson.call(this, '/api/bookshelf', {\n            source: sourceName,\n            logins: String(loginValue || ''),\n            group: ''\n        });\n        if (shelfRes && shelfRes.code == 0 && Array.isArray(shelfRes.data)) {\n            return shelfRes.data;\n        }\n    } catch (e) {}\n    return [];\n}\n\nfunction shelfGroups(books) {\n    var seen = {};\n    var groups = [];\n    for (var i = 0; i < books.length; i++) {\n        var g = String((books[i] && (books[i].group_name || books[i].group_id)) || '').trim();\n        if (!g || seen[g]) continue;\n        seen[g] = true;\n        groups.push(g);\n    }\n    return groups;\n}\n\nfunction pushShelfDivider() {\n    shelfEntries.push({\n        title: '────────',\n        url: '',\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n    });\n}\n\nvar fqSession = getSessionId.call(this) || getSessionIdFromCookie.call(this);\nif (showFanqieShelf && fqSession) {\n    var fqBooks = makeShelfBookList.call(this, '番茄', fqSession);\n    var fqGroups = shelfGroups(fqBooks);\n    var fqName = '';\n    try {\n        var userRaw = java.ajax('https://fanqienovel.com/api/user/info/v2,' + JSON.stringify({\n            method: 'GET',\n            headers: { Cookie: 'sessionid=' + fqSession }\n        }));\n        var userObj = JSON.parse(userRaw);\n        fqName = String(userObj && userObj.data && userObj.data.name || '');\n    } catch (e) {}\n\n    shelfEntries.push({\n        title: (fqName ? fqName + ' 的个人中心' : '我的番茄书架'),\n        url: '',\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n    });\n    shelfEntries.push({\n        title: '我的书架（全部）',\n        url: shelfUrl.call(this, '番茄', fqSession, ''),\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.5 }\n    });\n    for (var fg = 0; fg < fqGroups.length; fg++) {\n        shelfEntries.push({\n            title: '📁 ' + fqGroups[fg],\n            url: shelfUrl.call(this, '番茄', fqSession, fqGroups[fg]),\n            style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.4 }\n        });\n    }\n\n    pushShelfDivider();\n}\n\nvar jjLogin = getJjToken.call(this);\nif (showJjShelf && jjLogin) {\n    var jjBooks = makeShelfBookList.call(this, '晋江', jjLogin);\n    var jjGroups = shelfGroups(jjBooks);\n\n    shelfEntries.push({\n        title: '📁 个人书架',\n        url: '',\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n    });\n    shelfEntries.push({\n        title: '📓 全部收藏',\n        url: shelfUrl.call(this, '晋江', jjLogin, ''),\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.5 }\n    });\n    for (var jg = 0; jg < jjGroups.length; jg++) {\n        shelfEntries.push({\n            title: '📁 ' + jjGroups[jg],\n            url: shelfUrl.call(this, '晋江', jjLogin, jjGroups[jg]),\n            style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.4 }\n        });\n    }\n\n    pushShelfDivider();\n}\n\nif (shelfEntries.length) {\n    sort = sort.concat(shelfEntries);\n}\n\nvar useGender = (currentMode == 'audio') ? 'boy' : currentGender;\n\ntry {\n    var d = postJson.call(this, '/api/discover', { source: useSource, gender: useGender, tab: currentJjTab });\n    if (d && d.code != 0) {\n        java.toast(d.message);\n    }\n    var data = (d && Array.isArray(d.data)) ? d.data : [];\n    if (data.length > 0) {\n        data.forEach(function (t) {\n            if (!t) return;\n            var st = (t.style && typeof t.style == 'object' && !Array.isArray(t.style)) ? t.style : { layout_flexGrow: 1, layout_flexBasisPercent: 0.3 };\n            var link = t.sing\n                ? (getHost.call(this) + '/api/discover/books,' + JSON.stringify({\n                    method: 'POST',\n                    body: JSON.stringify({\n                        sing: t.sing,\n                        gender: useGender,\n                        source: useSource,\n                        tab: currentJjTab || '',\n                        page: '{{page}}'\n                    })\n                }))\n                : '';\n            sort.push({ title: String(t.title || ''), url: link, style: st });\n        });\n    } else {\n        sort.push({ title: '【' + (useSource || '聚合') + '】暂无发现页数据', url: '', style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } });\n    }\n} catch (e) {\n    sort.push({ title: '发现页加载失败，请检查服务器/登录', url: '', style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } });\n}\nJSON.stringify(sort);", "header": "@js:\nJSON.stringify(buildHeaders.call(this));", "jsLib": "let localVersion = '1.20261105.1';  //本地版本号\n\nfunction getHosts() {\n    return [\n    'https://tingx.abrdns.com',\n    'http://154.12.85.126:5000'\n    ];\n}\n\nfunction getHost() {\n    let { source } = this;\n    let c = getConfig.call(this);\n    if (c.host) return String(c.host).replace(/\\/+$/, '');\n    let base = '';\n    try { base = \"https://tingx.abrdns.com\"; } catch (e) {}\n    if (!base && typeof baseUrl !== 'undefined' && baseUrl) base = String(baseUrl);\n    if (!base) base = getHosts()[0];\n    return base.replace(/\\/+$/, '');\n}\n\nfunction getConfig() {\n    let { source } = this;\n    try {\n        let configStr = source.getVariable();\n        if (!configStr || configStr.trim() == \"\") return {};\n        let config = JSON.parse(configStr);\n        if (Array.isArray(config)) return config[0] || {};\n        if (config && typeof config == 'object') return config;\n        return {};\n    } catch (e) { return {}; }\n}\n\nfunction setConfig(obj) {\n    let { source } = this;\n    try {\n        let config = getConfig.call(this);\n        for (let k in obj) { if (obj.hasOwnProperty(k)) config[k] = obj[k]; }\n        source.setVariable(JSON.stringify([config]));\n        return true;\n    } catch (e) { return false; }\n}\n\nfunction ensureConfig() {\n    let c = getConfig.call(this);\n    let changed = false;\n    if (!c.gender) { c.gender = 'boy'; changed = true; }\n    if (c.source == undefined) { c.source = ''; changed = true; }\n    if (!c.sources) { c.sources = { novel: [], audio: [], comic: [], video: [], download: [] }; changed = true; }\n    if (changed) setConfig.call(this, c);\n    return c;\n}\n\nfunction deviceType() {\n    let { java } = this;\n    try {\n        var id = java.deviceID();\n        if (id && id !== '') {\n            return true;\n        }\n    } catch (e) {}\n    \n    try {\n        var id = java.androidId();\n        if (id && id !== '') {\n            return false;\n        }\n    } catch (e) {}\n    \n    return false;\n}\n\nfunction getDeviceId() {\n    let { java } = this;\n    let dev = '';\n    try { let id1 = java.deviceID(); if (id1 && String(id1) !== '') dev = String(id1); } catch (e) {}\n    if (!dev) { try { let id2 = java.androidId(); if (id2 && String(id2) !== '') dev = String(id2); } catch (e) {} }\n    return dev;\n}\n\nfunction checkMsg(res) {\n    let { java } = this;\n    try {\n        let obj = JSON.parse(res);\n        if (obj.code !== 0) {\n            java.toast(obj.message);\n        }\n    } catch (e) {}\n    return res;\n}\n\nfunction getToken() {\n    let { source } = this;\n    let b64 = '';\n    try { b64 = String(source.getLoginHeader() || '').trim(); } catch (e) {}\n    return { b64: b64 };\n}\n\nfunction buildHeaders() {\n    let { java } = this;\n    let t = getToken.call(this);\n    let dev = getDeviceId.call(this);\n    let ts = String(Math.floor(Date.now() / 1000));\n\n    let plain = '';\n    if (t.b64) {\n        try { plain = java.base64Decode(t.b64); } catch (e) { plain = ''; }\n    }\n\n    return {\n        'User-Agent': java.getWebViewUA(),\n        'x-novel-token': t.b64,\n        'x-novel-deviceid': dev,\n        'x-novel-timestamap': ts,\n        'x-novel-public': java.md5Encode(plain + dev + ts).toLowerCase(),\n        'x-novel-version': '2'\n    };\n}\n\nfunction postJson(path, obj) {\n    let { java } = this;\n    let headers = buildHeaders.call(this);\n    headers['Content-Type'] = 'application/json';\n    let opt = { method: 'POST', body: JSON.stringify(obj || {}), headers: headers };\n    let res = java.ajax(getHost.call(this) + path + ',' + JSON.stringify(opt));\n    res = decryptIfEncrypted.call(this, res);\n    try { return JSON.parse(res); } catch (e) { return { code: -1, message: '解析失败', raw: res }; }\n}\n\nfunction getSourceList() {\n    let list = [];\n    try {\n        let arr = postJson.call(this, '/api/source', {});\n        if (Array.isArray(arr)) {\n            arr.forEach(function (it) { if (it && it.enabled && it.name) list.push(it); });\n            list.sort(function (a, b) { return (a.sort || 0) - (b.sort || 0); });\n        }\n    } catch (e) {}\n    return list;\n}\n\nfunction getCmtBrowserOptions() {\n    return {\n        expandedCornersRadius: 20,\n        dismissOnTouchOutside: true,\n        isDraggable: true,\n        shouldDimBackground: true,\n        backgroundDimAmount: 0.5,\n        hardwareAccelerated: true,\n        isNestedScrollingEnabled: true,\n        isGestureInsetBottomIgnored: true,\n        setFitToContents: false,\n        heightPercentage: 0.75,\n        isHideable: true\n    };\n}\n\nfunction showCmt(bid, cid, para, date, sourceName) {\n    let { java } = this;\n    let url = getHost.call(this) + '/comment'\n            + '?tab=paras&book_id=' + bid\n            + '&item_id=' + cid\n            + '&para=' + para\n            + '&source=' + (sourceName || '');\n    try {\n        java.showBrowser(url, null, 'window.java=java;', JSON.stringify(getCmtBrowserOptions.call(this)));\n    } catch (e) {\n        try { java.startBrowser(url, '段评'); } catch (e2) {\n            java.toast('打开段评失败：' + e2);\n        }\n    }\n}\n\nfunction getSessionId() {\n    let config = getConfig.call(this);\n    return String(config.fanqie_sessionid || '');\n}\n\nfunction getSessionIdFromCookie() {\n    const { cookie } = this;\n    try {\n        let cookieHeader = String(cookie.getCookie('fanqienovel.com'));\n        let sessionId = cookieHeader.match(/sessionid=([^;]+)/)?.[1] || null;\n        if (sessionId) return sessionId;\n    } catch (e) {}\n    return \"\";\n}\n\nfunction getJjToken() {\n    let config = getConfig.call(this);\n    return String(config.jj_token || '');\n}\n\nfunction buildJjHeaders() {\n    let { java } = this;\n    return {\n        \"source\": \"android\",\n        \"versiontype\": \"reading\",\n        \"versioncode\": \"467\",\n        \"version-code\": \"467\",\n        \"User-Agent\": java.getWebViewUA()\n    };\n}\n\nfunction jjEncode(data) {\n    let { java } = this;\n    return java.createSymmetricCrypto(\"DES/CBC/PKCS5Padding\", \"KW8Dvm2N\", \"1ae2c94b\").encryptBase64(data);\n}\n\nfunction isShelfSyncEnabled() {\n    try {\n        return String(getConfig.call(this).shelf_sync || 'off') == 'on';\n    } catch (e) {\n        return false;\n    }\n}\n\nfunction syncShelf(isAdd) {\n    let { java, book } = this;\n    try {\n        if (!book || !book.tocUrl) return;\n        let raw = String(book.tocUrl || '').replace(/\\\\/g, '').replace(/^data:catalogUrl;base64,/, '');\n        let idx = raw.indexOf(',');\n        if (idx >= 0) raw = raw.substring(0, idx);\n        raw = raw.replace(/[^A-Za-z0-9+/=]/g, '');\n        let catalog = JSON.parse(String(java.base64Decode(raw) || '').replace(/\\\\/g, ''));\n        let sourceName = String(catalog.source || '');\n        let bookId = String(catalog.book_id || catalog.bookid || '');\n        if (!bookId) return;\n\n        let apiSource = '';\n        let logins = '';\n        if (sourceName.indexOf('番茄') >= 0) {\n            apiSource = '番茄';\n            logins = getSessionId.call(this) || getSessionIdFromCookie.call(this);\n        } else if (sourceName.indexOf('晋江') >= 0) {\n            apiSource = '晋江';\n            logins = getJjToken.call(this);\n        }\n        if (!apiSource || !logins) {\n            java.toast('书架同步：请先登录' + apiSource);\n            return;\n        }\n\n        let res = postJson.call(this, '/api/bookshelf/sync', {\n            source: apiSource,\n            logins: String(logins),\n            book_id: bookId,\n            action: isAdd ? 'add' : 'del',\n            group: ''\n        });\n        if (res && res.code == 0) {\n            java.toast((isAdd ? '已同步到' : '已从') + apiSource + (isAdd ? '书架' : '书架移除'));\n        } else {\n            java.toast((res && res.message) || '书架同步失败');\n        }\n    } catch (e) {\n        java.log('syncShelf error: ' + e);\n        java.toast('书架同步失败');\n    }\n}\n\nfunction syncProgress(chapterParams) {\n    let { java } = this;\n    try {\n        let conf = getConfig.call(this);\n        if ((conf.progress_sync || 'off') != 'on') return;\n\n        let sourceName = String(chapterParams.source || '');\n        let logins = '';\n        if (/^晋江/.test(sourceName)) {\n            logins = String(conf.jj_token || '');\n        } else if (/^番茄/.test(sourceName)) {\n            logins = String(conf.fanqie_sessionid || '');\n        }\n        if (!logins) return;\n\n        let headers = buildHeaders.call(this);\n        headers['Content-Type'] = 'application/json';\n\n        let body = JSON.stringify({\n            source: sourceName,\n            book_id: String(chapterParams.book_id || ''),\n            item_id: String(chapterParams.item_id || ''),\n            logins: logins\n        });\n\n        let opt = { method: 'POST', body: body, headers: headers };\n        let res = java.ajax(getHost.call(this) + '/api/progress,' + JSON.stringify(opt));\n        res = decryptIfEncrypted.call(this, res);\n        let obj = JSON.parse(res);\n        if (obj.code !== 0) java.log('进度同步失败：' + (obj.message || '未知错误'));\n    } catch (e) {\n        java.log('进度同步异常：' + e);\n    }\n}\n\nfunction decryptIfEncrypted(res) {\n    let raw = String(res == undefined || res == null ? '' : res).trim();\n    if (!raw) return res;\n\n    if (raw.indexOf('\"aes-256-gcm\"') >= 0 && raw.charAt(0) == '{') {\n        try {\n            let obj = JSON.parse(raw);\n            if (obj.alg == 'aes-256-gcm' && obj.data && obj.iv && obj.tag) {\n                return aesGcmDecrypt.call(this, raw);\n            }\n            if (obj.data && typeof obj.data == 'object' && obj.data.alg == 'aes-256-gcm') {\n                let dec = aesGcmDecrypt.call(this, obj.data);\n                try { obj.data = JSON.parse(dec); }\n                catch (e) { obj.data = dec; }\n                return JSON.stringify(obj);\n            }\n        } catch (e) {}\n    }\n    return res;\n}\n\nfunction aesGcmDecrypt(payload) {\n    let { java } = this;\n    let obj = null;\n    try {\n        obj = (typeof payload == 'string') ? JSON.parse(payload) : payload;\n        if (!obj || obj.alg !== 'aes-256-gcm' || !obj.data || !obj.iv || !obj.tag) return payload;\n    } catch (e) { return payload; }\n\n    try {\n        let C = Packages.javax.crypto.Cipher;\n        let K = Packages.javax.crypto.spec.SecretKeySpec;\n        let G = Packages.javax.crypto.spec.GCMParameterSpec;\n        let S = Packages.java.lang.String;\n        let A = Packages.java.util.Arrays;\n        let Sys = Packages.java.lang.System;\n\n        let keyBytes = new S(\"Lk4#Fj9&Gh1*Ds6^Qw3!Er8@Ty5%Ui0o\").getBytes(\"UTF-8\");\n        let ivBytes = java.base64DecodeToByteArray(obj.iv);\n        let tagBytes = java.base64DecodeToByteArray(obj.tag);\n        let dataBytes = java.base64DecodeToByteArray(obj.data);\n\n        let combined = A.copyOf(dataBytes, dataBytes.length + tagBytes.length);\n        Sys.arraycopy(tagBytes, 0, combined, dataBytes.length, tagBytes.length);\n\n        let cipher = C.getInstance(\"AES/GCM/NoPadding\");\n        cipher.init(C.DECRYPT_MODE, new K(keyBytes, \"AES\"), new G(128, ivBytes));\n        return new S(cipher.doFinal(combined), \"UTF-8\").toString();\n    } catch (e) {}\n\n    try {\n        function b64dec(s) {\n            let T = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n            let out = [], v = 0, bits = 0;\n            s = String(s).replace(/[^A-Za-z0-9+/]/g, '');\n            for (let i = 0; i < s.length; i++) {\n                v = (v << 6) | T.indexOf(s.charAt(i));\n                bits += 6;\n                if (bits >= 8) { bits -= 8; out.push((v >> bits) & 0xFF); }\n            }\n            return out;\n        }\n        function utf8dec(plain) {\n            let s = '', buf = [];\n            for (let i = 0; i < plain.length; i++) {\n                let c = plain[i];\n                if (c < 0x80) buf.push(c);\n                else if (c < 0xE0) buf.push(((c & 0x1F) << 6) | (plain[++i] & 0x3F));\n                else if (c < 0xF0) buf.push(((c & 0x0F) << 12) | ((plain[++i] & 0x3F) << 6) | (plain[++i] & 0x3F));\n                else {\n                    let cp = ((c & 0x07) << 18) | ((plain[++i] & 0x3F) << 12) | ((plain[++i] & 0x3F) << 6) | (plain[++i] & 0x3F);\n                    cp -= 0x10000;\n                    buf.push(0xD800 + (cp >> 10), 0xDC00 + (cp & 0x3FF));\n                }\n                if (buf.length > 4096) { s += String.fromCharCode.apply(null, buf); buf = []; }\n            }\n            s += String.fromCharCode.apply(null, buf);\n            return s;\n        }\n\n        let SBOX = [\n            0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76,\n            0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0,\n            0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15,\n            0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75,\n            0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84,\n            0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf,\n            0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8,\n            0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2,\n            0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73,\n            0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb,\n            0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79,\n            0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08,\n            0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a,\n            0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e,\n            0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf,\n            0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16\n        ];\n        function xtime(a) { return ((a << 1) ^ (a & 0x80 ? 0x1b : 0)) & 0xFF; }\n        function gmul(a, b) {\n            let p = 0;\n            for (let i = 0; i < 8; i++) {\n                if (b & 1) p ^= a;\n                let hi = a & 0x80;\n                a = (a << 1) & 0xFF;\n                if (hi) a ^= 0x1b;\n                b >>= 1;\n            }\n            return p;\n        }\n        function expandKey(key) {\n            let Nk = 8, w = [], rcon = 1;\n            for (let i = 0; i < Nk; i++) w.push([key[4*i], key[4*i+1], key[4*i+2], key[4*i+3]]);\n            for (let i = Nk; i < 60; i++) {\n                let t = w[i-1].slice();\n                if (i % Nk == 0) {\n                    t = [t[1], t[2], t[3], t[0]].map(x => SBOX[x]);\n                    t[0] ^= rcon;\n                    rcon = xtime(rcon);\n                } else if (i % Nk == 4) {\n                    t = t.map(x => SBOX[x]);\n                }\n                w.push([w[i-Nk][0]^t[0], w[i-Nk][1]^t[1], w[i-Nk][2]^t[2], w[i-Nk][3]^t[3]]);\n            }\n            let rk = [];\n            for (let i = 0; i < w.length; i++) rk.push(w[i][0], w[i][1], w[i][2], w[i][3]);\n            return rk;\n        }\n        function encryptBlock(rk, input) {\n            let st = input.slice(0, 16);\n            for (let i = 0; i < 16; i++) st[i] ^= rk[i];\n            for (let round = 1; round <= 14; round++) {\n                for (let i = 0; i < 16; i++) st[i] = SBOX[st[i]];\n                let t = st.slice();\n                for (let r = 1; r < 4; r++)\n                    for (let c = 0; c < 4; c++)\n                        st[r + 4*c] = t[r + 4*((c + r) % 4)];\n                if (round !== 14) {\n                    for (let c = 0; c < 4; c++) {\n                        let i = 4*c;\n                        let a0 = st[i], a1 = st[i+1], a2 = st[i+2], a3 = st[i+3];\n                        st[i]   = gmul(a0,2)^gmul(a1,3)^a2^a3;\n                        st[i+1] = a0^gmul(a1,2)^gmul(a2,3)^a3;\n                        st[i+2] = a0^a1^gmul(a2,2)^gmul(a3,3);\n                        st[i+3] = gmul(a0,3)^a1^a2^gmul(a3,2);\n                    }\n                }\n                for (let i = 0; i < 16; i++) st[i] ^= rk[round*16 + i];\n            }\n            return st;\n        }\n        function gfMul(x, y) {\n            let z = new Array(16).fill(0);\n            let v = y.slice();\n            for (let i = 0; i < 128; i++) {\n                if ((x[i >> 3] >> (7 - (i & 7))) & 1) {\n                    for (let j = 0; j < 16; j++) z[j] ^= v[j];\n                }\n                let lsb = v[15] & 1;\n                for (let j = 15; j > 0; j--) v[j] = ((v[j] >> 1) | ((v[j-1] & 1) << 7)) & 0xFF;\n                v[0] >>= 1;\n                if (lsb) v[0] ^= 0xE1;\n            }\n            return z;\n        }\n        function writeBitsBE(arr, offset, bits) {\n            for (let i = 0; i < 8; i++) {\n                arr[offset + 7 - i] = bits % 256;\n                bits = Math.floor(bits / 256);\n            }\n        }\n        function ghash(H, data, aadBits, ctBits) {\n            let y = new Array(16).fill(0);\n            for (let i = 0; i < data.length; i += 16) {\n                let block = new Array(16).fill(0);\n                for (let j = 0; j < 16 && i + j < data.length; j++) block[j] = data[i+j];\n                for (let j = 0; j < 16; j++) y[j] ^= block[j];\n                y = gfMul(y, H);\n            }\n            let lenBlock = new Array(16).fill(0);\n            writeBitsBE(lenBlock, 0, aadBits);\n            writeBitsBE(lenBlock, 8, ctBits);\n            for (let j = 0; j < 16; j++) y[j] ^= lenBlock[j];\n            y = gfMul(y, H);\n            return y;\n        }\n        function inc32(block) {\n            for (let i = 15; i >= 12; i--) {\n                block[i] = (block[i] + 1) & 0xFF;\n                if (block[i] !== 0) break;\n            }\n        }\n        function gcmDecrypt(key, iv, ct, tag) {\n            let rk = expandKey(key);\n            let H = encryptBlock(rk, new Array(16).fill(0));\n            let J0;\n            if (iv.length == 12) J0 = iv.concat([0, 0, 0, 1]);\n            else J0 = ghash(H, iv, 0, iv.length * 8);\n            let S = ghash(H, ct, 0, ct.length * 8);\n            let ej0 = encryptBlock(rk, J0);\n            let calcTag = new Array(16);\n            for (let i = 0; i < 16; i++) calcTag[i] = S[i] ^ ej0[i];\n            for (let i = 0; i < 16; i++) {\n                if (calcTag[i] !== tag[i]) return null;\n            }\n            let out = [];\n            let ctr = J0.slice();\n            for (let i = 0; i < ct.length; i += 16) {\n                inc32(ctr);\n                let ks = encryptBlock(rk, ctr);\n                for (let j = 0; j < 16 && i + j < ct.length; j++) {\n                    out.push(ct[i+j] ^ ks[j]);\n                }\n            }\n            return out;\n        }\n\n        let key = [];\n        let keyStr = \"Lk4#Fj9&Gh1*Ds6^Qw3!Er8@Ty5%Ui0o\";\n        for (let i = 0; i < keyStr.length; i++) key.push(keyStr.charCodeAt(i) & 0xFF);\n\n        let iv = b64dec(obj.iv);\n        let tag = b64dec(obj.tag);\n        let ct = b64dec(obj.data);\n\n        let plain = gcmDecrypt(key, iv, ct, tag);\n        if (!plain) return payload;\n        return utf8dec(plain);\n    } catch (e) {\n        return payload;\n    }\n}\n\nfunction getJjShelfClass() {\n    let { java } = this;\n    try {\n        var token = getJjToken.call(this);\n        if (!token) {\n            java.toast(\"请先配置晋江登录Token\");\n            return;\n        }\n\n        var url = \"https://app.jjwxc.org/app.jjwxc/android/reading/FavoriteClass/favoriteClass\";\n        var body = encode.call(this, JSON.stringify({\n            \"versionCode\": \"444\",\n            \"token\": token\n        }));\n\n        var headers = {\n            \"versioncode\": \"444\",\n            \"versiontype\": \"reading\",\n            \"User-Agent\": java.getWebViewUA()\n        };\n\n        var res = java.post(url, body, headers).body();\n        var data = JSON.parse(res);\n\n        if (!data || !data.data || !data.data.length) {\n            java.log(\"获取分类失败: \" + res);\n            java.toast(\"获取分类失败，请检查登录状态\");\n            return;\n        }\n\n        var excludeIds = { \"-1\": true, \"-2\": true, \"-3\": true };\n        var classList = [];\n        for (var i = 0; i < data.data.length; i++) {\n            var item = data.data[i];\n            var cid = String(item.classid);\n            if (excludeIds[cid]) continue;\n            classList.push({\n                classId: cid,\n                className: String(item.classname)\n            });\n        }\n\n        if (classList.length == 0) {\n            java.toast(\"暂无可用分类\");\n            return;\n        }\n\n        var config = getConfig.call(this);\n        var savedId = String(config.type_id || \"\");\n\n        var cardsHtml = \"\";\n        for (var j = 0; j < classList.length; j++) {\n            var c = classList[j];\n            var selected = (String(c.classId) == savedId) ? \" selected\" : \"\";\n            cardsHtml +=\n                '<div class=\"class-card' + selected + '\" data-id=\"' + c.classId + '\" onclick=\"pick(this)\">' +\n                    '<div class=\"class-name\">' + c.className + '</div>' +\n                    '<div class=\"class-id\">ID: ' + c.classId + '</div>' +\n                '</div>';\n        }\n\n        var html = `<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no\">\n<title>晋江收藏分类</title>\n<style>\n*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}\nbody{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;background:#0a0a0f;background-image:radial-gradient(ellipse at 30% 20%, #2a1020 0%, #0a0e27 50%, #1a0d1a 100%);color:#e8e8f0;min-height:100vh;padding:20px}\n.header{text-align:center;padding:10px 0 18px}\n.header h1{font-size:1.3rem;font-weight:800;background:linear-gradient(135deg,#e8e8f0 40%,#c14a63);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}\n.header p{font-size:.72rem;color:#8888a0;margin-top:4px}\n.current-bar{display:flex;align-items:center;gap:8px;padding:10px 14px;margin-bottom:16px;background:rgba(193,74,99,.1);border:1px solid rgba(193,74,99,.3);border-radius:10px;font-size:.74rem;color:rgba(255,255,255,.85)}\n.current-bar strong{color:#fff}\n.grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}\n.class-card{position:relative;padding:16px 10px;border-radius:14px;background:rgba(255,255,255,.04);border:2px solid rgba(255,255,255,.08);cursor:pointer;transition:all .25s;text-align:center}\n.class-card:hover{border-color:rgba(255,255,255,.2);background:rgba(255,255,255,.08)}\n.class-card.selected{border-color:#c14a63;background:rgba(193,74,99,.18);box-shadow:0 0 20px rgba(193,74,99,.3)}\n.class-card.selected::after{content:'✓';position:absolute;top:6px;right:8px;width:18px;height:18px;border-radius:50%;background:#c14a63;color:#fff;font-size:11px;display:flex;align-items:center;justify-content:center}\n.class-name{font-size:.8rem;font-weight:600;color:rgba(255,255,255,.9);word-break:break-all}\n.class-id{font-size:.62rem;color:rgba(255,255,255,.4);margin-top:4px}\n.tip{text-align:center;font-size:.68rem;color:rgba(255,255,255,.35);margin-top:20px}\n</style>\n</head>\n<body>\n<div class=\"header\">\n    <h1>晋江收藏分类</h1>\n    <p>选择后点击右上角 ✓ 保存</p>\n</div>\n<div class=\"current-bar\">\n    <span>当前已选择分类ID：<strong id=\"currentId\">` + (savedId || \"-\") + `</strong></span>\n</div>\n<div class=\"grid\" id=\"grid\">` + cardsHtml + `</div>\n<div class=\"tip\">新分类请先在晋江 App 内创建</div>\n<div id=\"result-output\" style=\"display:none;\">` + savedId + `</div>\n<script>\nfunction pick(el){\n    document.querySelectorAll('.class-card').forEach(function(c){c.classList.remove('selected');});\n    el.classList.add('selected');\n    document.getElementById('currentId').textContent = el.getAttribute('data-id');\n    document.getElementById('result-output').textContent = el.getAttribute('data-id');\n}\n</script>\n</body>\n</html>`;\n\n        var base64 = \"data:text/html;base64,\" + java.base64Encode(html);\n        var result = java.startBrowserAwait(base64, \"晋江收藏分类\", false);\n\n        if (!result || !result.body()) {\n            java.toast(\"已取消分类设置\");\n            return;\n        }\n\n        var bodyHtml = result.body();\n        var match = bodyHtml.match(/<div id=\"result-output\"[^>]*>([^<]*)<\\/div>/);\n        var newId = \"\";\n        if (match && match[1]) {\n            newId = match[1].trim();\n        }\n\n        if (!newId) {\n            java.toast(\"未选择分类\");\n            return;\n        }\n\n        setConfig.call(this, 'type_id', String(newId));\n        java.toast(\"\\n已保存分类ID：\" + newId);\n\n    } catch (e) {\n        java.log(\"获取书架分类失败: \" + e);\n        java.toast(\"\\n获取书架分类失败\");\n    }\n}\n\nfunction selectSource() {\n    let { java } = this;\n    var base = getHost.call(this);\n    var list = [];\n    try {\n        var opt = { method: 'POST', body: '{}' };\n        var res = java.ajax(base + '/api/source,' + JSON.stringify(opt));\n        var arr = JSON.parse(res);\n        if (Array.isArray(arr)) {\n            for (var i = 0; i < arr.length; i++) {\n                var it = arr[i];\n                if (it && it.enabled && it.name) list.push(it);\n            }\n            list.sort(function (a, b) { return (a.sort || 0) - (b.sort || 0); });\n        }\n    } catch (e) {\n        java.toast('源站列表请求失败：' + e);\n        return;\n    }\n    if (!list.length) { java.toast('源站列表为空'); return; }\n\n    var conf = getConfig.call(this);\n    var TABS = ['novel', 'audio', 'comic', 'video', 'download'];\n    var TAB_LABEL = { novel: '小说', audio: '听书', comic: '漫画', video: '短剧', download: '下载' };\n    var TAB_ICON = { novel: 'fa-book-open', audio: 'fa-headphones', comic: 'fa-images', video: 'fa-film', download: 'fa-download' };\n\n    var sourcesCfg = conf.sources || {};\n    TABS.forEach(function (t) { if (!Array.isArray(sourcesCfg[t])) sourcesCfg[t] = []; });\n\n    var allCfg = Array.isArray(conf.allTabs) ? conf.allTabs.slice() : [];\n    TABS.forEach(function (t) {\n        if (sourcesCfg[t].length > 0 && allCfg.indexOf(t) !== -1) {\n            allCfg = allCfg.filter(function (x) { return x !== t; });\n        }\n    });\n\n    var tabMap = {};\n    for (var i = 0; i < list.length; i++) {\n        var item = list[i];\n        var tab = item.tab || 'novel';\n        if (TABS.indexOf(tab) == -1) continue;\n        if (!tabMap[tab]) tabMap[tab] = [];\n        tabMap[tab].push(item);\n    }\n\n    var tabsData = [];\n    for (var t = 0; t < TABS.length; t++) {\n        var tabKey = TABS[t];\n        var items = tabMap[tabKey] || [];\n        var selNames = sourcesCfg[tabKey] || [];\n        var isAll = allCfg.indexOf(tabKey) !== -1;\n        var cards = [];\n        cards.push({ name: '', label: '全部源站', all: true, sel: isAll, lv: '' });\n        for (var j = 0; j < items.length; j++) {\n            var it = items[j];\n            var lvNum = (it.group && it.group.level) ? Number(it.group.level) : Number(it.min_user_group || 1);\n            cards.push({\n                name: it.name,\n                label: it.name,\n                all: false,\n                sel: selNames.indexOf(it.name) !== -1,\n                lv: lvNum > 1 ? ('LV' + lvNum) : ''\n            });\n        }\n        tabsData.push({ tab: tabKey, label: TAB_LABEL[tabKey], icon: TAB_ICON[tabKey], cards: cards });\n    }\n\n    function jsonForHtml(v) {\n        return JSON.stringify(v).replace(/</g, '\\\\u003c').replace(/>/g, '\\\\u003e').replace(/&/g, '\\\\u0026');\n    }\n    var dataJson = jsonForHtml(tabsData);\n\n    var html = '<!DOCTYPE html><html lang=\"zh-CN\" data-theme=\"glass\" data-mode=\"light\"><head>' +\n        '<meta charset=\"UTF-8\">' +\n        '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover\">' +\n        '<meta name=\"theme-color\" content=\"#E8EEF6\">' +\n        '<title>源站选择</title>' +\n        '<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css\">' +\n        '<style>' +\n        ':root{' +\n        '--bg-rgb:232,238,246;--surface-rgb:255,255,255;--text-rgb:31,38,51;--muted-rgb:108,120,140;' +\n        '--line-rgb:150,165,190;--primary-rgb:91,124,250;' +\n        '--bg:#e8eef6;--surface:#ffffff;--surface-soft:#f6f9ff;--text:#1f2633;--muted:#6c788c;' +\n        '--primary:#5b7cfa;--primary-dark:#4363d8;--primary-ink:#f7f9ff;' +\n        '--border:rgba(var(--line-rgb),.18);--primary-soft:rgba(var(--primary-rgb),.08);' +\n        '--text-soft:rgba(var(--text-rgb),.78);--border-soft:rgba(var(--line-rgb),.16);' +\n        '--card-bg:rgba(var(--surface-rgb),.78);' +\n        '--radius-lg:20px;--radius:14px;--radius-sm:10px;' +\n        '--shadow:0 18px 40px -26px rgba(31,45,80,.35),0 2px 8px rgba(31,45,80,.05);' +\n        '--shadow-card:var(--shadow);' +\n        '--font-cn:\"PingFang SC\",\"Hiragino Sans GB\",\"Microsoft YaHei\",system-ui,-apple-system,\"Segoe UI\",Roboto,sans-serif;' +\n        '}' +\n        '*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}' +\n        'html{min-height:100%}' +\n        'body{margin:0;min-height:100vh;color:var(--text);font-family:var(--font-cn);font-size:15px;line-height:1.6;' +\n        'background:var(--bg);position:relative;overflow-x:hidden;' +\n        '-webkit-font-smoothing:antialiased;' +\n        'padding:calc(14px + env(safe-area-inset-top)) 14px calc(22px + env(safe-area-inset-bottom))}' +\n        'body::before{content:\"\";position:fixed;inset:0;z-index:0;pointer-events:none;' +\n        'background:radial-gradient(900px 520px at 12% -8%,rgba(var(--primary-rgb),.16),transparent 68%),' +\n        'radial-gradient(760px 480px at 94% 4%,rgba(120,220,230,.18),transparent 72%),' +\n        'linear-gradient(180deg,var(--bg),var(--bg))}' +\n        '.wrap{max-width:720px;margin:0 auto;position:relative;z-index:1}' +\n        '.glass{background:linear-gradient(155deg,rgba(var(--surface-rgb),.86),rgba(var(--surface-rgb),.58));' +\n        'border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-card);' +\n        'backdrop-filter:blur(22px) saturate(1.2);-webkit-backdrop-filter:blur(22px) saturate(1.2);' +\n        'animation:slideIn .5s cubic-bezier(.22,.61,.36,1)}' +\n        '@keyframes slideIn{from{opacity:0;transform:translateY(18px) scale(.99)}to{opacity:1;transform:none}}' +\n        '.hero{display:flex;align-items:center;gap:14px;padding:17px 18px;margin-bottom:12px}' +\n        '.hero-icon{flex:0 0 auto;width:46px;height:46px;border-radius:14px;display:flex;align-items:center;justify-content:center;font-size:20px;' +\n        'background:linear-gradient(135deg,var(--primary),var(--primary-dark));color:#fff;' +\n        'box-shadow:0 12px 24px -12px rgba(var(--primary-rgb),.85)}' +\n        '.hero h1{margin:0;font-size:19px;line-height:1.25;letter-spacing:.2px}' +\n        '.hero p{margin:5px 0 0;font-size:12px;line-height:1.55;color:var(--muted)}' +\n        '.tabs{display:flex;gap:6px;overflow-x:auto;padding:6px;margin-bottom:12px;scrollbar-width:none;-ms-overflow-style:none}' +\n        '.tabs::-webkit-scrollbar{display:none}' +\n        '.tab{flex:0 0 auto;display:inline-flex;align-items:center;gap:7px;border:1px solid transparent;background:transparent;color:var(--muted);' +\n        'padding:9px 12px;border-radius:12px;font:inherit;font-size:13px;font-weight:600;cursor:pointer;transition:.18s}' +\n        '.tab:hover{background:rgba(var(--surface-rgb),.5);color:var(--text)}' +\n        '.tab.on{background:var(--primary-soft);color:var(--primary);border-color:rgba(var(--primary-rgb),.28)}' +\n        '.tab i{font-size:13px}.tab-count{font-size:10px;line-height:1.6;padding:0 6px;border-radius:999px;background:rgba(var(--line-rgb),.14);opacity:.85}' +\n        '.panel{display:none}.panel.on{display:block;animation:fade .18s ease}' +\n        '@keyframes fade{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}' +\n        '.all-card{width:100%;display:flex;align-items:center;gap:10px;padding:14px 16px;margin-bottom:10px;border-radius:16px;' +\n        'border:1px solid var(--border);background:linear-gradient(155deg,rgba(var(--surface-rgb),.9),rgba(var(--surface-rgb),.6));' +\n        'box-shadow:0 12px 30px -24px rgba(31,45,80,.55);color:var(--text);font:inherit;text-align:left;cursor:pointer;transition:.18s}' +\n        '.all-card .ico{font-size:16px;color:var(--primary)}.all-card .t{flex:1;font-size:14px;font-weight:600}' +\n        '.all-card.sel{border-color:rgba(var(--primary-rgb),.5);background:linear-gradient(155deg,rgba(var(--primary-rgb),.16),rgba(var(--primary-rgb),.05));box-shadow:0 0 0 3px var(--primary-soft)}' +\n        '.check{flex:0 0 auto;width:22px;height:22px;border-radius:50%;border:1px solid var(--border);background:rgba(var(--surface-rgb),.6);' +\n        'display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:800;color:transparent;transition:.18s}' +\n        '.all-card.sel .check,.src-card.sel .check{background:var(--primary);border-color:var(--primary);color:#fff}' +\n        '.grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:9px}' +\n        '@media(max-width:520px){.grid{grid-template-columns:repeat(2,minmax(0,1fr))}}' +\n        '.src-card{position:relative;display:flex;align-items:center;justify-content:center;min-height:78px;padding:12px 10px 14px;' +\n        'border-radius:16px;border:1px solid var(--border);background:linear-gradient(155deg,rgba(var(--surface-rgb),.9),rgba(var(--surface-rgb),.6));' +\n        'box-shadow:0 12px 28px -24px rgba(31,45,80,.5);color:var(--text);font:inherit;font-size:12.5px;line-height:1.4;' +\n        'word-break:break-all;cursor:pointer;transition:.18s}' +\n        '.src-card:active{transform:scale(.97)}' +\n        '.src-card.sel{border-color:rgba(var(--primary-rgb),.52);background:linear-gradient(155deg,rgba(var(--primary-rgb),.16),rgba(var(--primary-rgb),.05));box-shadow:0 0 0 3px var(--primary-soft)}' +\n        '.src-card .name{max-width:100%;text-align:center}' +\n        '.src-card .lv{position:absolute;right:8px;bottom:7px;font-size:9px;font-weight:700;color:#b98a3a;background:rgba(185,138,58,.13);border:1px solid rgba(185,138,58,.32);padding:1px 5px;border-radius:6px}' +\n        '.src-card .check{position:absolute;top:7px;right:7px;width:18px;height:18px;font-size:10px}' +\n        '.empty{text-align:center;color:var(--muted);padding:38px 12px;font-size:13px}' +\n        '.tips{display:flex;align-items:center;gap:9px;margin-top:14px;padding:12px 16px;border-radius:16px;color:var(--muted);font-size:12px;line-height:1.55}' +\n        '.tips .dot{flex:0 0 auto;width:7px;height:7px;border-radius:50%;background:var(--primary);box-shadow:0 0 0 4px var(--primary-soft)}' +\n        '.tips b{color:var(--text)}' +\n        '</style></head><body><div class=\"wrap\">' +\n        '<header class=\"hero glass\"><div class=\"hero-icon\"><i class=\"fa-solid fa-satellite-dish\"></i></div><div><h1>源站选择</h1><p>按分类多选，点选需要的站点；「全部源站」与具体源站互斥</p></div></header>' +\n        '<div class=\"tabs glass\" id=\"tabs\" role=\"tablist\"></div>' +\n        '<main id=\"panels\"></main>' +\n        '<footer class=\"tips glass\"><span class=\"dot\"></span><span id=\"sel-tip\">已选 <b id=\"sel-count\">0</b> 个源站</span></footer>' +\n        '</div><div id=\"result-output\" style=\"display:none;\"></div>' +\n        '<script>' +\n        'var DATA=' + dataJson + ';' +\n        'var curTab=DATA.length?DATA[0].tab:\"novel\";' +\n        'var tabsEl=document.getElementById(\"tabs\"),panelsEl=document.getElementById(\"panels\"),outEl=document.getElementById(\"result-output\");' +\n        'function esc(v){return String(v==undefined?\"\":v).replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/\\'/g,\"&#39;\");}' +\n        'function renderTabs(){var h=\"\";for(var i=0;i<DATA.length;i++){var g=DATA[i];var n=g.cards.length>1?g.cards.length-1:0;' +\n        'h+=\"<button type=\\\\\"button\\\\\" class=\\\\\"tab\"+(g.tab==curTab?\" on\":\"\")+\"\\\\\" role=\\\\\"tab\\\\\" data-tab=\\\\\"\"+esc(g.tab)+\"\\\\\"><i class=\\\\\"fa-solid \"+g.icon+\"\\\\\"></i>\"+esc(g.label)+\"<span class=\\\\\"tab-count\\\\\">\"+n+\"</span></button>\";}tabsEl.innerHTML=h;}' +\n        'function renderPanels(){var h=\"\";for(var i=0;i<DATA.length;i++){var g=DATA[i];h+=\"<section class=\\\\\"panel\"+(g.tab==curTab?\" on\":\"\")+\"\\\\\" data-panel=\\\\\"\"+esc(g.tab)+\"\\\\\">\";' +\n        'var all=g.cards[0];h+=\"<button type=\\\\\"button\\\\\" class=\\\\\"all-card\"+(all.sel?\" sel\":\"\")+\"\\\\\" data-all=\\\\\"1\\\\\" data-name=\\\\\"\\\\\"><i class=\\\\\"fa-solid fa-globe ico\\\\\"></i><span class=\\\\\"t\\\\\">全部源站</span><span class=\\\\\"check\\\\\"><i class=\\\\\"fa-solid fa-check\\\\\"></i></span></button>\";' +\n        'var others=g.cards.slice(1);if(!others.length){h+=\"<div class=\\\\\"empty\\\\\">该分类暂无源站</div>\";}else{h+=\"<div class=\\\\\"grid\\\\\">\";' +\n        'for(var j=0;j<others.length;j++){var c=others[j];h+=\"<button type=\\\\\"button\\\\\" class=\\\\\"src-card\"+(c.sel?\" sel\":\"\")+\"\\\\\" data-name=\\\\\"\"+esc(c.name)+\"\\\\\"><span class=\\\\\"name\\\\\">\"+esc(c.label)+\"</span>\"+(c.lv?\"<span class=\\\\\"lv\\\\\">\"+esc(c.lv)+\"</span>\":\"\")+\"<span class=\\\\\"check\\\\\"><i class=\\\\\"fa-solid fa-check\\\\\"></i></span></button>\";}' +\n        'h+=\"</div>\";}h+=\"</section>\";}panelsEl.innerHTML=h;}' +\n        'function renderAll(){renderTabs();renderPanels();}' +\n        'function setTab(tab){curTab=tab;renderAll();}' +\n        'function getGroup(tab){for(var i=0;i<DATA.length;i++){if(DATA[i].tab==tab){return DATA[i];}}return null;}' +\n        'function setSelected(btn,on){if(on){btn.classList.add(\"sel\");}else{btn.classList.remove(\"sel\");}}' +\n        'function syncOut(){var out={novel:[],audio:[],comic:[],video:[],download:[]};var allSel=[];' +\n        'var nodes=panelsEl.querySelectorAll(\".src-card.sel\");for(var i=0;i<nodes.length;i++){var p=nodes[i].parentNode;while(p&&!p.getAttribute(\"data-panel\")){p=p.parentNode;}var t=p?p.getAttribute(\"data-panel\"):\"\";var n=nodes[i].getAttribute(\"data-name\");if(t&&out[t]&&n&&out[t].indexOf(n)<0){out[t].push(n);}}' +\n        'var allNodes=panelsEl.querySelectorAll(\".all-card.sel\");for(var k=0;k<allNodes.length;k++){var p2=allNodes[k].parentNode;while(p2&&!p2.getAttribute(\"data-panel\")){p2=p2.parentNode;}if(p2){allSel.push(p2.getAttribute(\"data-panel\"));}}' +\n        'outEl.textContent=JSON.stringify(allSel)+\"|||\"+JSON.stringify(out);' +\n        'var cnt=0;for(var key in out){if(out.hasOwnProperty(key)){cnt+=out[key].length;}}' +\n        'var el=document.getElementById(\"sel-count\");if(el){el.textContent=String(cnt);}' +\n        'var tip=document.getElementById(\"sel-tip\");if(tip){tip.innerHTML=\"已选 <b id=\\\\\"sel-count\\\\\">\"+cnt+\"</b> 个源站\"+(allSel.length?\" · 全部源站分类：\"+allSel.join(\"、\"):\"\");}}' +\n        'function toggleAll(btn){var panel=btn.parentNode;var tab=panel.getAttribute(\"data-panel\");var g=getGroup(tab);if(!g){return;}' +\n        'var on=!g.cards[0].sel;g.cards[0].sel=on;for(var j=1;j<g.cards.length;j++){g.cards[j].sel=false;}' +\n        'var allBtn=panel.querySelector(\".all-card\");var cards=panel.querySelectorAll(\".src-card\");' +\n        'setSelected(allBtn,on);for(var c=0;c<cards.length;c++){setSelected(cards[c],false);}syncOut();}' +\n        'function toggleOne(btn){var panel=btn.parentNode.parentNode;var tab=panel.getAttribute(\"data-panel\");var g=getGroup(tab);if(!g){return;}' +\n        'var name=btn.getAttribute(\"data-name\");g.cards[0].sel=false;' +\n        'var allBtn=panel.querySelector(\".all-card\");if(allBtn){setSelected(allBtn,false);}' +\n        'var on=false;for(var j=1;j<g.cards.length;j++){if(g.cards[j].name==name){g.cards[j].sel=!g.cards[j].sel;on=g.cards[j].sel;break;}}' +\n        'setSelected(btn,on);syncOut();}' +\n        'tabsEl.addEventListener(\"click\",function(e){var el=e.target;while(el&&el!==tabsEl&&!el.getAttribute(\"data-tab\")){el=el.parentNode;}if(el&&el!==tabsEl){setTab(el.getAttribute(\"data-tab\"));}});' +\n        'panelsEl.addEventListener(\"click\",function(e){var el=e.target;while(el&&el!==panelsEl&&!el.classList.contains(\"all-card\")&&!el.classList.contains(\"src-card\")){el=el.parentNode;}if(!el||el==panelsEl){return;}if(el.classList.contains(\"all-card\")){toggleAll(el);}else if(el.classList.contains(\"src-card\")){toggleOne(el);}});' +\n        'renderAll();syncOut();' +\n        '</script></body></html>';\n\n    var dataUrl = 'data:text/html;base64,' + java.base64Encode(html);\n    var choice = java.startBrowserAwait(dataUrl, '源站选择', false);\n    if (!choice || !choice.body()) { java.toast('已取消源站设置'); return; }\n\n    var body = choice.body();\n    var m = body.match(/<div id=\"result-output\"[^>]*>([^<]*)<\\/div>/);\n    var rawOut = (m && m[1]) ? m[1].trim() : '';\n    rawOut = rawOut.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&amp;/g, '&').replace(/&quot;/g, '\"').replace(/&#39;/g, \"'\");\n\n    var newSources = { novel: [], audio: [], comic: [], video: [], download: [] };\n    var newAllTabs = [];\n    try {\n        var parts = rawOut.split('|||');\n        var allArr = JSON.parse(parts[0] || '[]');\n        var srcObj = JSON.parse(parts[1] || '{}');\n        if (Array.isArray(allArr)) newAllTabs = allArr;\n        if (srcObj && typeof srcObj == 'object') {\n            TABS.forEach(function (t) { if (Array.isArray(srcObj[t])) newSources[t] = srcObj[t]; });\n        }\n    } catch (e) {}\n\n    TABS.forEach(function (t) {\n        if (newSources[t].length > 0) {\n            newAllTabs = newAllTabs.filter(function (x) { return x !== t; });\n        }\n    });\n\n    var merged = [];\n    TABS.forEach(function (t) {\n        newSources[t].forEach(function (n) { if (merged.indexOf(n) == -1) merged.push(n); });\n    });\n\n    setConfig.call(this, { sources: newSources, allTabs: newAllTabs, source: merged.join(',') });\n    var cnt = merged.length;\n    var allCnt = newAllTabs.length;\n    java.toast(cnt > 0 ? ('源站已保存（共 ' + cnt + ' 个）') : (allCnt > 0 ? '已保存（全部源站）' : '已保存（未选择具体源站）'));\n}\n\nfunction parseVer(v) {\n    return String(v || '').split('.').map(function (x) { return parseInt(x, 10) || 0; });\n}\n\nfunction cmpVer(a, b) {\n    let pa = parseVer(a), pb = parseVer(b);\n    let len = Math.max(pa.length, pb.length);\n    for (let i = 0; i < len; i++) {\n        let x = pa[i] || 0, y = pb[i] || 0;\n        if (x > y) return 1;\n        if (x < y) return -1;\n    }\n    return 0;\n}\n\nfunction shouldBlockByVersion(serverVerObj) {\n    if (!serverVerObj || !serverVerObj.version) return false;\n    let sv = String(serverVerObj.version);\n    let lv = String(localVersion || '');\n    if (cmpVer(sv, lv) <= 0) return false;\n\n    let isForce = (serverVerObj.force == true || String(serverVerObj.force) == 'true');\n    let tipMsg = serverVerObj.msg || '';   // ← 用 version.msg\n\n    if (isForce) {\n        try { java.toast('\\n服务端要求强制更新 ' + sv + (tipMsg ? '\\n' + tipMsg : '')); } catch (e) {}\n        try { checkVersion.call(this); } catch (e) {}\n    } else {\n        try { java.toast('有新版本 ' + sv + (tipMsg ? '\\n' + tipMsg : '') + '\\n可在登录页「🔄更新检测」查看'); } catch (e) {}\n    }\n\n    return false;\n}\n\nfunction checkVersion() {\n    let { java } = this;\n    var host = getHost.call(this);\n    var versionApi = host + '/api/version?aid=sy';\n    var siteApi = host + '/api/site/public';\n\n    function esc(v) {\n        return String(v == undefined ? '' : v)\n            .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\n            .replace(/\"/g, '&quot;').replace(/'/g, '&#39;');\n    }\n\n    var siteName = '书源更新';\n    try {\n        var siteRes = java.ajax(siteApi);\n        var siteObj = JSON.parse(siteRes);\n        if (siteObj && siteObj.data && siteObj.data.site_name) {\n            siteName = String(siteObj.data.site_name);\n        }\n    } catch (e) {}\n\n    var res;\n    try { res = java.ajax(versionApi); }\n    catch (e) { java.toast('版本检查失败：网络异常'); return; }\n    var obj;\n    try { obj = JSON.parse(res); }\n    catch (e) { java.toast('版本检查失败：返回解析异常'); return; }\n    if (!obj || obj.code !== 0 || !obj.data || !obj.data.version) {\n        java.toast((obj && obj.message) || '版本检查失败'); return;\n    }\n\n    var serverVer = String(obj.data.version);\n    var myLocalVer = String(localVersion || '');\n    var cmp = cmpVer(serverVer, myLocalVer);   // 复用 jsLib 的 cmpVer\n\n    if (cmp > 0) {\n        var msg = String(obj.data.msg || '有新版本啦');\n        var force = String(obj.data.force || 'false') == 'true';\n        var downloadUrl = String(obj.data.download_url || '');\n        var updateLog = obj.data.update_log || {};\n\n        var dates = Object.keys(updateLog).filter(function (d) {\n            return Array.isArray(updateLog[d]) && updateLog[d].length;\n        }).sort(function (a, b) { return b.localeCompare(a); });\n\n        var latestDate = dates[0] || '';\n        var latestItems = latestDate ? updateLog[latestDate] : [];\n        var historyDates = dates.slice(1);\n\n        var latestLogHtml = '';\n        latestItems.forEach(function (t) {\n            latestLogHtml += '<div class=\"update-text\">' + esc(t) + '</div>';\n        });\n\n        var historyHtml = '';\n        historyDates.forEach(function (d) {\n            historyHtml += '<div class=\"history-item\"><div class=\"history-date\"><i class=\"fas fa-calendar-day\"></i><span>' + esc(d) + '</span></div>';\n            updateLog[d].forEach(function (t) {\n                historyHtml += '<div class=\"history-text\">' + esc(t) + '</div>';\n            });\n            historyHtml += '</div>';\n        });\n        var historyCountText = historyDates.length ? '(' + historyDates.length + '条)' : '';\n\n        var bodyHtml = '<!DOCTYPE html><html lang=\"zh-CN\" data-theme=\"glass\" data-mode=\"light\"><head>' +\n            '<meta charset=\"UTF-8\">' +\n            '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0,viewport-fit=cover\">' +\n            '<title>' + esc(siteName) + '</title>' +\n            '<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css\">' +\n            '<style>' +\n            ':root{' +\n            '--bg-rgb:232,238,246;--surface-rgb:255,255,255;--text-rgb:31,38,51;--muted-rgb:108,120,140;' +\n            '--line-rgb:150,165,190;--primary-rgb:91,124,250;' +\n            '--bg:#e8eef6;--surface:#ffffff;--surface-soft:#f6f9ff;--text:#1f2633;--muted:#6c788c;' +\n            '--primary:#5b7cfa;--primary-dark:#4363d8;--primary-ink:#f7f9ff;' +\n            '--border:rgba(var(--line-rgb),.18);--primary-soft:rgba(var(--primary-rgb),.08);' +\n            '--text-soft:rgba(var(--text-rgb),.78);--border-soft:rgba(var(--line-rgb),.16);' +\n            '--card-bg:rgba(var(--surface-rgb),.78);' +\n            '--radius-lg:20px;--radius:14px;--radius-sm:10px;' +\n            '--shadow:0 18px 40px -26px rgba(31,45,80,.35),0 2px 8px rgba(31,45,80,.05);' +\n            '--shadow-card:var(--shadow);' +\n            '--font-cn:\"PingFang SC\",\"Hiragino Sans GB\",\"Microsoft YaHei\",system-ui,-apple-system,\"Segoe UI\",Roboto,sans-serif;' +\n            '--font-mono:\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,\"Courier New\",monospace;' +\n            '}' +\n            '*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}' +\n            'html{min-height:100%}' +\n            'body{margin:0;min-height:100vh;color:var(--text);font-family:var(--font-cn);font-size:15px;line-height:1.6;' +\n            'background:var(--bg);overflow-x:hidden;position:relative;' +\n            '-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;' +\n            'display:flex;align-items:center;justify-content:center;padding:calc(18px + env(safe-area-inset-top)) 14px calc(22px + env(safe-area-inset-bottom))}' +\n            '.waves{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden;background:linear-gradient(180deg,#eef3fb 0%,#e3ecf8 50%,#dbe6f5 100%)}' +\n            '.wave{position:absolute;left:-50%;width:200%;height:200%;border-radius:45%;opacity:.55;' +\n            'background:radial-gradient(circle at 50% 50%,rgba(91,124,250,.28),rgba(91,124,250,0) 65%);' +\n            'animation:waveMove 18s linear infinite}' +\n            '.wave.w1{top:-120%;animation-duration:20s}' +\n            '.wave.w2{top:-110%;animation-duration:26s;animation-direction:reverse;opacity:.4;' +\n            'background:radial-gradient(circle at 50% 50%,rgba(120,170,255,.24),rgba(120,170,255,0) 65%)}' +\n            '.wave.w3{top:-100%;animation-duration:32s;opacity:.3;' +\n            'background:radial-gradient(circle at 50% 50%,rgba(160,200,255,.22),rgba(160,200,255,0) 65%)}' +\n            '@keyframes waveMove{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}' +\n            'body::after{content:\"\";position:fixed;inset:0;z-index:0;pointer-events:none;' +\n            'background:radial-gradient(1200px 600px at 15% 0%,rgba(var(--bg-rgb),.1),rgba(var(--bg-rgb),0) 70%),' +\n            'linear-gradient(180deg,rgba(var(--bg-rgb),.06) 0%,rgba(var(--bg-rgb),.14) 55%,rgba(var(--bg-rgb),.22) 100%)}' +\n            'h1,h2,h3,p{margin:0}' +\n            '.wrap{width:100%;max-width:440px;position:relative;z-index:1}' +\n            '.card{box-sizing:border-box;padding:22px;border:1px solid var(--border);border-radius:var(--radius-lg);' +\n            'background:var(--card-bg);box-shadow:var(--shadow-card);' +\n            'backdrop-filter:blur(12px) saturate(1.04);-webkit-backdrop-filter:blur(12px) saturate(1.04);' +\n            'animation:slideIn .6s cubic-bezier(.22,.61,.36,1)}' +\n            '@keyframes slideIn{from{opacity:0;transform:translateY(24px) scale(.98)}to{opacity:1;transform:none}}' +\n            '.head{text-align:center;margin-bottom:18px}' +\n            '.head h1{font-size:22px;letter-spacing:.01em;margin-bottom:6px}' +\n            '.head p{font-size:13.5px;color:var(--muted)}' +\n            '.eyebrow{display:inline-block;color:var(--primary);font-size:11.5px;font-weight:700;letter-spacing:.22em;text-transform:uppercase;margin-bottom:6px}' +\n            '.versions{display:flex;align-items:stretch;gap:10px;margin:16px 0}' +\n            '.v-card{flex:1;min-width:0;padding:14px 12px;border:1px solid var(--border);border-radius:var(--radius);' +\n            'background:rgba(var(--surface-rgb),.6);box-shadow:var(--shadow-card);text-align:center;position:relative;' +\n            'backdrop-filter:blur(10px) saturate(1.05);-webkit-backdrop-filter:blur(10px) saturate(1.05)}' +\n            '.v-card .k{font-size:11.5px;color:var(--muted);display:flex;align-items:center;justify-content:center;gap:5px}' +\n            '.v-card .n{font-size:15px;font-weight:700;margin-top:4px;word-break:break-all;font-family:var(--font-mono)}' +\n            '.v-card .d{font-size:11.5px;color:var(--muted);margin-top:4px}' +\n            '.v-card.latest{background:linear-gradient(140deg,rgba(var(--primary-rgb),.16),rgba(var(--primary-rgb),.04));' +\n            'border-color:rgba(var(--primary-rgb),.34);box-shadow:0 0 26px -10px rgba(var(--primary-rgb),.5),var(--shadow-card);' +\n            'animation:breathe 3s ease-in-out infinite}' +\n            '@keyframes breathe{0%,100%{transform:scale(1)}50%{transform:scale(1.02)}}' +\n            '.v-card.latest .k,.v-card.latest .n{color:var(--primary-dark)}' +\n            '.vs{flex:none;width:34px;height:34px;border-radius:50%;align-self:center;display:flex;align-items:center;justify-content:center;' +\n            'font-size:13px;color:var(--primary);background:rgba(var(--surface-rgb),.85);border:1px solid var(--border);' +\n            'box-shadow:0 6px 16px -10px rgba(var(--primary-rgb),.5);' +\n            'backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);' +\n            'animation:pulseIndicator 1.6s ease-in-out infinite}' +\n            '@keyframes pulseIndicator{0%,100%{transform:scale(1)}50%{transform:scale(1.1)}}' +\n            '.section{margin-top:14px;border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;' +\n            'background:rgba(var(--surface-rgb),.55);box-shadow:var(--shadow-card);' +\n            'backdrop-filter:blur(10px) saturate(1.04);-webkit-backdrop-filter:blur(10px) saturate(1.04);' +\n            'animation:slideIn .5s ease .25s backwards}' +\n            '.section-head{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;' +\n            'border-bottom:1px solid var(--border);background:rgba(var(--surface-rgb),.5)}' +\n            '.section-head h2{font-size:15px;font-weight:600;display:flex;align-items:center;gap:7px}' +\n            '.section-head h2 i{color:var(--primary)}' +\n            '.tag{padding:3px 9px;border-radius:999px;background:var(--primary-soft);color:var(--primary);font-size:11.5px;font-weight:600}' +\n            '.section-body{padding:14px}' +\n            '.log-date{display:flex;align-items:center;gap:6px;color:var(--primary);font-size:12.5px;font-weight:700;' +\n            'padding-bottom:7px;border-bottom:1px dashed var(--border-soft);margin-bottom:7px}' +\n            '.update-text{position:relative;padding-left:15px;margin:6px 0;line-height:1.55;font-size:13.5px;color:var(--text-soft);white-space:pre-wrap;word-break:break-word}' +\n            '.update-text::before{content:\"•\";position:absolute;left:0;color:var(--primary);font-weight:700;font-size:1.15rem;line-height:1}' +\n            '.history-head{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;' +\n            'border-bottom:1px solid var(--border);background:rgba(var(--surface-rgb),.5);cursor:pointer;user-select:none;transition:background .2s}' +\n            '.history-head:hover{background:rgba(var(--surface-rgb),.7)}' +\n            '.history-head h2{font-size:15px;font-weight:600;display:flex;align-items:center;gap:7px}' +\n            '.history-head h2 i{color:var(--primary)}' +\n            '.toggle{background:none;border:none;color:var(--muted);cursor:pointer;font-weight:500;display:flex;align-items:center;gap:4px;font-size:12.5px;transition:color .2s}' +\n            '.toggle:hover{color:var(--primary)}' +\n            '.history-body{padding:0 14px;max-height:0;overflow:hidden;transition:max-height .4s ease,padding .4s ease}' +\n            '.history-body.open{max-height:60vh;overflow-y:auto;padding:14px;scrollbar-width:thin}' +\n            '.history-body.open::-webkit-scrollbar{width:6px}' +\n            '.history-body.open::-webkit-scrollbar-thumb{background:rgba(var(--line-rgb),.35);border-radius:4px}' +\n            '.history-item{margin-bottom:14px;padding-bottom:14px;border-bottom:1px dashed var(--border-soft)}' +\n            '.history-item:last-child{border-bottom:none;margin-bottom:0;padding-bottom:0}' +\n            '.history-date{font-weight:600;margin-bottom:7px;display:flex;align-items:center;gap:4px;font-size:12.5px;color:var(--primary);' +\n            'background:var(--primary-soft);padding:5px 9px;border-radius:6px}' +\n            '.history-text{position:relative;padding-left:15px;margin:6px 0;line-height:1.5;font-size:13px;color:var(--text-soft);white-space:pre-wrap;word-break:break-word}' +\n            '.history-text::before{content:\"•\";position:absolute;left:0;color:var(--primary);font-weight:700;font-size:1.1rem;line-height:1}' +\n            '.btn{display:flex;align-items:center;justify-content:center;gap:8px;box-sizing:border-box;width:100%;padding:13px 18px;' +\n            'margin-top:14px;border:1px solid transparent;border-radius:var(--radius-sm);font:inherit;font-size:14.5px;font-weight:600;' +\n            'text-decoration:none;cursor:pointer;transition:background .16s ease,box-shadow .16s ease,transform .12s ease;' +\n            'color:var(--primary-ink);background:linear-gradient(135deg,var(--primary) 0%,var(--primary) 60%,var(--primary-dark) 100%);' +\n            'box-shadow:0 10px 22px -14px rgba(var(--primary-rgb),.9);position:relative;overflow:hidden}' +\n            '.btn::after{content:\"\";position:absolute;top:-50%;left:-50%;width:200%;height:200%;' +\n            'background:linear-gradient(90deg,transparent,rgba(255,255,255,.35),transparent);transform:rotate(30deg);' +\n            'animation:btnShine 3s ease-in-out infinite}' +\n            '@keyframes btnShine{0%,60%{transform:translateX(-120%) rotate(30deg)}80%,100%{transform:translateX(120%) rotate(30deg)}}' +\n            '.btn:hover{background:linear-gradient(135deg,var(--primary) 0%,var(--primary-dark) 60%,var(--primary-dark) 100%);transform:translateY(-1px)}' +\n            '.btn:active{transform:translateY(1px) scale(.98)}' +\n            '.btn i,.btn span{position:relative;z-index:1}' +\n            '.foot{margin-top:14px;text-align:center;color:var(--muted);font-size:12px;line-height:1.6}' +\n            '@media(max-width:400px){.versions{flex-direction:column}.vs{transform:rotate(90deg)}.card{padding:18px 16px}}' +\n            '</style></head><body>' +\n            '<div class=\"waves\"><div class=\"wave w1\"></div><div class=\"wave w2\"></div><div class=\"wave w3\"></div></div>' +\n            '<div class=\"wrap\"><section class=\"card\">' +\n            '<div class=\"head\">' +\n            '<span class=\"eyebrow\">Version Update</span>' +\n            '<h1>' + esc(siteName) + '</h1>' +\n            '<p>' + esc(msg) + '</p>' +\n            '</div>' +\n            '<div class=\"versions\">' +\n            '<div class=\"v-card\"><div class=\"k\"><i class=\"fas fa-cube\"></i> 当前版本</div><div class=\"n\">v' + esc(myLocalVer) + '</div><div class=\"d\">您的当前版本</div></div>' +\n            '<div class=\"vs\"><i class=\"fas fa-arrow-right\"></i></div>' +\n            '<div class=\"v-card latest\"><div class=\"k\"><i class=\"fas fa-star\"></i> 最新版本</div><div class=\"n\">v' + esc(serverVer) + '</div><div class=\"d\">可用最新版本</div></div>' +\n            '</div>' +\n            (latestLogHtml ? '<div class=\"section\"><div class=\"section-head\"><h2><i class=\"fas fa-bolt\"></i> 最新更新</h2><span class=\"tag\">最新发布</span></div><div class=\"section-body\"><div class=\"log-date\"><i class=\"fas fa-calendar-alt\"></i>' + esc(latestDate) + '</div>' + latestLogHtml + '</div></div>' : '') +\n            (downloadUrl ? '<a href=\"' + esc(downloadUrl) + '\" class=\"btn\"><i class=\"fas fa-rocket\"></i><span>立即更新</span></a>' : '') +\n            (historyHtml ? '<div class=\"section\" style=\"padding:0\"><div class=\"history-head\" onclick=\"toggleLogs()\"><h2><i class=\"fas fa-history\"></i> 历史更新 <span>' + historyCountText + '</span></h2><button class=\"toggle\"><span id=\"toggleText\">展开历史</span><i class=\"fas fa-chevron-down\" id=\"toggleIcon\"></i></button></div><div class=\"history-body\" id=\"logList\">' + historyHtml + '</div></div>' : '') +\n            '<p class=\"foot\">' + (force ? '本次为强制更新，请更新后再使用书源' : '更新后返回书源即可生效') + '</p>' +\n            '</section></div>' +\n            '<script>' +\n            'let logsCollapsed=true;' +\n            'function toggleLogs(){logsCollapsed=!logsCollapsed;var l=document.getElementById(\"logList\");var t=document.getElementById(\"toggleText\");var i=document.getElementById(\"toggleIcon\");' +\n            'if(logsCollapsed){l.classList.remove(\"open\");t.textContent=\"展开历史\";i.className=\"fas fa-chevron-down\";}else{l.classList.add(\"open\");t.textContent=\"收起历史\";i.className=\"fas fa-chevron-up\";}}' +\n            '</script></body></html>';\n\n        if (downloadUrl) {\n            try {\n                java.startBrowserAwait('data:text/html;base64,' + java.base64Encode(bodyHtml), '书源更新', false);\n            } catch (e) {\n                java.toast('打开更新页失败：' + e);\n            }\n        } else {\n            java.longToast('发现新版本：' + serverVer + '\\n' + msg);\n        }\n        return;\n    }\n\n    if (cmp < 0) {\n        java.longToast('非法版本\\n本地版本：' + myLocalVer + '\\n服务器版本：' + serverVer + '\\n本地版本高于服务器版本，请检查书源来源是否被修改。');\n        return;\n    }\n    java.toast('已是最新版本：' + myLocalVer);\n}\n\nfunction paraSettings() {\n    let { java } = this;\n    let conf = getConfig.call(this);\n    let curReview = conf.para_review || 'off';\n    let curStyle = conf.para_style || 'TEXT';\n    let curSy = conf.para_sy || 'off';\n    let curProgress = conf.progress_sync || 'off';\n    let curShelf = conf.shelf_sync || 'off';\n\n    var html = '<!DOCTYPE html><html lang=\"zh-CN\"><head>' +\n        '<meta charset=\"UTF-8\">' +\n        '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no\">' +\n        '<title>书源设置</title>' +\n        '<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css\">' +\n        '<style>' +\n        ':root{' +\n        '--bg-rgb:232,238,246;--surface-rgb:255,255,255;--text-rgb:31,38,51;--muted-rgb:108,120,140;' +\n        '--line-rgb:150,165,190;--primary-rgb:91,124,250;' +\n        '--bg:#e8eef6;--surface:#ffffff;--text:#1f2633;--muted:#6c788c;' +\n        '--primary:#5b7cfa;--primary-dark:#4363d8;' +\n        '--border:rgba(var(--line-rgb),.18);--primary-soft:rgba(var(--primary-rgb),.08);' +\n        '--radius-lg:20px;--radius:14px;' +\n        '--shadow:0 18px 40px -26px rgba(31,45,80,.35),0 2px 8px rgba(31,45,80,.05);' +\n        '--font-cn:\"PingFang SC\",\"Hiragino Sans GB\",\"Microsoft YaHei\",system-ui,-apple-system,sans-serif;' +\n        '}' +\n        '*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}' +\n        'html,body{min-height:100%}' +\n        'body{margin:0;min-height:100vh;color:var(--text);font-family:var(--font-cn);font-size:15px;line-height:1.6;' +\n        'background:var(--bg);padding:calc(14px + env(safe-area-inset-top)) 14px calc(22px + env(safe-area-inset-bottom));position:relative;overflow-x:hidden}' +\n        'body::before{content:\"\";position:fixed;inset:0;z-index:0;pointer-events:none;' +\n        'background:radial-gradient(900px 520px at 12% -8%,rgba(var(--primary-rgb),.16),transparent 68%),' +\n        'radial-gradient(760px 480px at 94% 4%,rgba(120,220,230,.18),transparent 72%)}' +\n        '.wrap{max-width:720px;margin:0 auto;position:relative;z-index:1}' +\n        '.glass{background:linear-gradient(155deg,rgba(var(--surface-rgb),.86),rgba(var(--surface-rgb),.58));' +\n        'border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow);' +\n        'backdrop-filter:blur(22px) saturate(1.2);-webkit-backdrop-filter:blur(22px) saturate(1.2)}' +\n        '.hero{display:flex;align-items:center;gap:14px;padding:17px 18px;margin-bottom:12px}' +\n        '.hero-icon{flex:0 0 auto;width:46px;height:46px;border-radius:14px;display:flex;align-items:center;justify-content:center;font-size:20px;' +\n        'background:linear-gradient(135deg,var(--primary),var(--primary-dark));color:#fff}' +\n        '.hero h1{margin:0;font-size:19px;line-height:1.25}' +\n        '.hero p{margin:5px 0 0;font-size:12px;line-height:1.55;color:var(--muted)}' +\n        '.card{padding:16px 18px;margin-bottom:12px}' +\n        '.group-title{font-size:12px;font-weight:700;color:var(--muted);letter-spacing:1px;padding:4px 2px 8px}' +\n        '.row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 0}' +\n        '.row + .row{border-top:1px solid var(--border)}' +\n        '.row .label{font-size:14px;font-weight:600}' +\n        '.row .desc{font-size:11.5px;color:var(--muted);margin-top:2px;line-height:1.5}' +\n        '.switch{position:relative;width:52px;height:28px;flex:none;cursor:pointer}' +\n        '.switch input{opacity:0;width:0;height:0}' +\n        '.switch-slider{position:absolute;inset:0;background:rgba(var(--line-rgb),.35);border-radius:28px;transition:.3s;border:1px solid var(--border)}' +\n        '.switch-slider::before{content:\"\";position:absolute;width:22px;height:22px;left:2px;bottom:2px;background:#fff;border-radius:50%;transition:.3s;box-shadow:0 2px 8px rgba(0,0,0,.3)}' +\n        '.switch input:checked + .switch-slider{background:var(--primary);border-color:var(--primary)}' +\n        '.switch input:checked + .switch-slider::before{transform:translateX(24px)}' +\n        '.seg{display:flex;gap:6px;padding:5px;border-radius:14px;background:rgba(var(--surface-rgb),.6);border:1px solid var(--border);flex:none}' +\n        '.seg button{border:none;background:transparent;font:inherit;font-size:13px;font-weight:600;padding:8px 16px;border-radius:10px;cursor:pointer;color:var(--muted);transition:.18s}' +\n        '.seg button.on{background:linear-gradient(135deg,var(--primary),var(--primary-dark));color:#fff;box-shadow:0 6px 16px -10px rgba(var(--primary-rgb),.9)}' +\n        '.tip{padding:12px 16px;border-radius:14px;font-size:12px;line-height:1.6;color:var(--muted)}' +\n        '.tip b{color:var(--text)}' +\n        '</style></head><body><div class=\"wrap\">' +\n        '<header class=\"hero glass\"><div class=\"hero-icon\"><i class=\"fa-solid fa-sliders\"></i></div><div><h1>书源设置</h1><p>段评、进度同步、书架同步</p></div></header>' +\n\n        // 段评\n        '<section class=\"card glass\">' +\n        '<div class=\"group-title\">段评</div>' +\n        '<div class=\"row\"><div><div class=\"label\">段评开关</div><div class=\"desc\">仅番茄、企鹅阅读、晋江、七猫、少年梦、起点支持</div></div>' +\n        '<label class=\"switch\"><input type=\"checkbox\" id=\"reviewSwitch\" ' + (curReview == 'on' ? 'checked' : '') + '><span class=\"switch-slider\"></span></label></div>' +\n        '<div class=\"row\"><div><div class=\"label\">段评图标大小</div><div class=\"desc\">TEXT 大号 / text 小号</div></div>' +\n        '<div class=\"seg\" id=\"styleSeg\">' +\n        '<button type=\"button\" data-val=\"TEXT\" class=\"' + (curStyle == 'TEXT' ? 'on' : '') + '\">TEXT（大）</button>' +\n        '<button type=\"button\" data-val=\"text\" class=\"' + (curStyle == 'text' ? 'on' : '') + '\">text（小）</button>' +\n        '</div></div>' +\n        '<div class=\"row\"><div><div class=\"label\">源阅适配</div><div class=\"desc\">IOS源阅适配，其他IOS应用段评异常也可尝试开启</div></div>' +\n        '<label class=\"switch\"><input type=\"checkbox\" id=\"sySwitch\" ' + (curSy == 'on' ? 'checked' : '') + '><span class=\"switch-slider\"></span></label></div>' +\n        '</section>' +\n\n        // 同步\n        '<section class=\"card glass\">' +\n        '<div class=\"group-title\">同步</div>' +\n        '<div class=\"row\"><div><div class=\"label\">进度同步</div><div class=\"desc\">翻章时上报晋江 / 番茄系列阅读进度</div></div>' +\n        '<label class=\"switch\"><input type=\"checkbox\" id=\"progressSwitch\" ' + (curProgress == 'on' ? 'checked' : '') + '><span class=\"switch-slider\"></span></label></div>' +\n        '<div class=\"row\"><div><div class=\"label\">书架同步</div><div class=\"desc\">加入/移除书架时同步到晋江 / 番茄系列</div></div>' +\n        '<label class=\"switch\"><input type=\"checkbox\" id=\"shelfSwitch\" ' + (curShelf == 'on' ? 'checked' : '') + '><span class=\"switch-slider\"></span></label></div>' +\n        '</section>' +\n\n        '<div class=\"tip glass\">当前：段评 <b id=\"curReview\">' + (curReview == 'on' ? '开启' : '关闭') + '</b> · 图标 <b id=\"curStyle\">' + curStyle + '</b> · 源阅适配 <b id=\"curSy\">' + (curSy == 'on' ? '开启' : '关闭') + '</b>' +\n        ' · 进度同步 <b id=\"curProgress\">' + (curProgress == 'on' ? '开启' : '关闭') + '</b> · 书架同步 <b id=\"curShelf\">' + (curShelf == 'on' ? '开启' : '关闭') + '</b></div>' +\n        '</div>' +\n        '<div id=\"result-output\" style=\"display:none;\">' + curReview + '|' + curStyle + '|' + curSy + '|' + curProgress + '|' + curShelf + '</div>' +\n        '<script>' +\n        'var out=document.getElementById(\"result-output\");' +\n        'function sync(){var r=document.getElementById(\"reviewSwitch\").checked?\"on\":\"off\";' +\n        'var s=document.querySelector(\"#styleSeg button.on\").getAttribute(\"data-val\");' +\n        'var y=document.getElementById(\"sySwitch\").checked?\"on\":\"off\";' +\n        'var p=document.getElementById(\"progressSwitch\").checked?\"on\":\"off\";' +\n        'var b=document.getElementById(\"shelfSwitch\").checked?\"on\":\"off\";' +\n        'out.textContent=r+\"|\"+s+\"|\"+y+\"|\"+p+\"|\"+b;' +\n        'document.getElementById(\"curReview\").textContent=r==\"on\"?\"开启\":\"关闭\";' +\n        'document.getElementById(\"curStyle\").textContent=s;' +\n        'document.getElementById(\"curSy\").textContent=y==\"on\"?\"开启\":\"关闭\";' +\n        'document.getElementById(\"curProgress\").textContent=p==\"on\"?\"开启\":\"关闭\";' +\n        'document.getElementById(\"curShelf\").textContent=b==\"on\"?\"开启\":\"关闭\";}' +\n        '[\"reviewSwitch\",\"sySwitch\",\"progressSwitch\",\"shelfSwitch\"].forEach(function(id){document.getElementById(id).addEventListener(\"change\",sync);});' +\n        'document.querySelectorAll(\"#styleSeg button\").forEach(function(btn){btn.addEventListener(\"click\",function(){' +\n        'document.querySelectorAll(\"#styleSeg button\").forEach(function(x){x.classList.remove(\"on\");});' +\n        'btn.classList.add(\"on\");sync();});});' +\n        'sync();' +\n        '</script></body></html>';\n\n    var choice = java.startBrowserAwait('data:text/html;base64,' + java.base64Encode(html), '书源设置', false);\n    if (!choice || !choice.body()) { java.toast('已取消书源设置'); return; }\n\n    var body = choice.body();\n    var m = body.match(/<div id=\"result-output\"[^>]*>([^<]*)<\\/div>/);\n    var raw = (m && m[1]) ? m[1].trim() : '';\n    var parts = raw.split('|');\n    var review = parts[0] == 'on' ? 'on' : 'off';\n    var style = parts[1] == 'text' ? 'text' : 'TEXT';\n    var sy = parts[2] == 'on' ? 'on' : 'off';\n    var progress = parts[3] == 'on' ? 'on' : 'off';\n    var shelf = parts[4] == 'on' ? 'on' : 'off';\n\n    setConfig.call(this, {\n        para_review: review,\n        para_style: style,\n        para_sy: sy,\n        progress_sync: progress,\n        shelf_sync: shelf\n    });\n    java.toast('已保存：段评' + (review == 'on' ? '开启' : '关闭') +\n        ' · 进度同步' + (progress == 'on' ? '开启' : '关闭') +\n        ' · 书架同步' + (shelf == 'on' ? '开启' : '关闭'));\n}\n\nfunction encode(data) {\n    let { java } = this;\n    return java.createSymmetricCrypto(\"DES/CBC/PKCS5Padding\", String(\"KW8Dvm2N\"), String(\"1ae2c94b\")).encryptBase64(data);\n}\n\nfunction decode(data) {\n    let { java } = this;\n    try {\n        var encryptedBytes = java.base64DecodeToByteArray(data);\n        var key = \"F#kL9$mQpR2&sVzX\";\n        var iv = \"7HnT3!cW8@xM0yBv\";\n        var crypto = java.createSymmetricCrypto(\"AES/CBC/PKCS5Padding\", key, iv);\n        return crypto.decryptStr(encryptedBytes);\n    } catch (e) {\n        return data;\n    }\n}", "lastUpdateTime": "1793930313016", "loginUi": "[\n  {\n    \"name\": \"邮箱\",\n    \"type\": \"text\"\n  },\n  {\n    \"name\": \"密码\",\n    \"type\": \"password\"\n  },\n  {\n    \"name\": \"⭕账号登录\",\n    \"type\": \"button\",\n    \"action\": \"login(true)\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🔑账号注册\",\n    \"type\": \"button\",\n    \"action\": \"register()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"❌退出登录\",\n    \"type\": \"button\",\n    \"action\": \"logout()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🔅用户中心\",\n    \"type\": \"button\",\n    \"action\": \"user()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"📡切换源站与搜索模式\",\n    \"type\": \"button\",\n    \"action\": \"selectSource()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"name\": \"🎚服务器切换\",\n    \"type\": \"button\",\n    \"action\": \"switchServer()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🔄服务器检测\",\n    \"type\": \"button\",\n    \"action\": \"checkServer()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🎁书源设置\",\n    \"type\": \"button\",\n    \"action\": \"paraSettings()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🌟升级用户组\",\n    \"type\": \"button\",\n    \"action\": \"level()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🫧我的气泡\",\n    \"type\": \"button\",\n    \"action\": \"icons()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🔄更新检测\",\n    \"type\": \"button\",\n    \"action\": \"checkVersion()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🔮当前配置\",\n    \"type\": \"button\",\n    \"action\": \"showConfig()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"🔄强制刷新\",\n    \"type\": \"button\",\n    \"action\": \"toggleRefresh()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"📓晋江收藏分类\",\n    \"type\": \"button\",\n    \"action\": \"getJjShelfClass()\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"name\": \"🍅番茄登录\",\n    \"type\": \"button\",\n    \"action\": \"fq_login()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"❌退出番茄\",\n    \"type\": \"button\",\n    \"action\": \"fq_logout()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"📱晋江扫码登录\",\n    \"type\": \"button\",\n    \"action\": \"loginJjScan()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  },\n  {\n    \"name\": \"❌退出晋江\",\n    \"type\": \"button\",\n    \"action\": \"logoutJj()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.45\n    }\n  }\n]", "loginUrl": "function login(flag) {\n    let email = '', pwd = '';\n    try {\n        if (flag == true) {\n            email = result.get('邮箱') || '';\n            pwd = result.get('密码') || '';\n        } else {\n            let info = source.getLoginInfoMap() || {};\n            email = info.get('邮箱') || '';\n            pwd = info.get('密码') || '';\n        }\n    } catch (e) {}\n\n    email = String(email || '').trim();\n    pwd = String(pwd || '').trim();\n    if (!email || !pwd) return java.toast('请先填写邮箱和密码');\n\n    java.toast('正在登录…');\n    try {\n        let opt = { method: 'POST', body: JSON.stringify({ email: email, password: pwd }) };\n        let res = java.ajax(getHost.call(this) + '/api/login,' + JSON.stringify(opt));\n        let obj = null;\n        try { obj = JSON.parse(res); } catch (e) { obj = null; }\n\n        if (!obj || obj.code !== 0 || !obj.data || !obj.data.token) {\n            let msg = (obj && obj.message) || '未知错误';\n            return java.toast('\\n❌ 登录失败：' + msg);\n        }\n\n        let d = obj.data;\n        let u = d.user || {};\n        let g = d.group || {};\n        let m = d.membership || {};\n        let benefits = d.benefits || m.benefits || g.benefits || '';\n\n        source.putLoginHeader(d.token);\n\n        let name = u.nickname || u.email || email;\n        let level = g.level || m.level || 1;\n        let groupName = g.name || m.group_name || '普通用户';\n        let isMember = !!(u.is_member || m.is_member);\n        let expires = m.expires_at || d.member_expires_at || '';\n        let masked = d.api_token_masked || '';\n        let rateWin = g.rate_limit_window || '';\n        let rateMax = g.rate_limit_max || '';\n        let devLimit = g.device_limit || '';\n        let resetLimit = g.token_reset_limit || '';\n        let resetDays = g.token_reset_window_days || '';\n\n        let lines = [];\n        lines.push('✅ 登录成功');\n        lines.push('');\n        lines.push('👤 用户：' + name);\n        if (u.email) lines.push('📧 邮箱：' + u.email);\n        lines.push('🏅 等级：Lv' + level + ' · ' + groupName + (isMember ? '（会员）' : '（普通）'));\n        if (expires) lines.push('⏰ 会员到期：' + expires);\n        if (masked) lines.push('🔑 Token：' + masked);\n        if (u.last_login_at) lines.push('🕒 上次登录：' + u.last_login_at);\n        if (rateWin && rateMax) lines.push('🚦 限流：' + rateWin + '秒内最多 ' + rateMax + ' 次');\n        if (devLimit) lines.push('📱 设备上限：' + devLimit + ' 台');\n        if (resetLimit && resetDays) lines.push('🔄 Token重置：每 ' + resetDays + ' 天 ' + resetLimit + ' 次');\n        if (benefits) {\n            lines.push('');\n            lines.push('💡 ' + benefits);\n        }\n\n        java.longToast('\\n' + lines.join('\\n'));\n    } catch (e) {\n        java.toast('\\n❌ 登录失败：' + e);\n    }\n}\n\nfunction logout() {\n    try { source.removeLoginHeader(); } catch (e) {}\n    try { source.removeLoginInfo(); } catch (e) {}\n    java.toast('已退出登录');\n}\n\nfunction fq_login() {\n    try {\n        java.startBrowserAwait(\"https://fanqienovel.com/main/writer/login\", \"登录\");\n    } catch (e) {\n        java.toast(e);\n        return false;\n    }\n\n    try {\n        cookie.removeCookie(\"snssdk.com\");\n    } catch (e) {}\n\n    let sessionId = getSessionIdFromCookie.call(this);\n    if (!sessionId) sessionId = getSessionId.call(this);\n\n    if (!sessionId || String(sessionId).trim() == \"\") {\n        java.toast(\"未获取到登录凭据，登录失败\");\n        return false;\n    }\n\n    let user = \"\";\n    try {\n        let resp = java.ajax(\"https://fanqienovel.com/api/user/info/v2,\" + JSON.stringify({\n            method: \"GET\",\n            headers: { \"Cookie\": \"sessionid=\" + sessionId }\n        }));\n        user = JSON.parse(resp)?.data?.name || \"\";\n    } catch (e) {\n        java.log(e);\n    }\n\n    if (!user) {\n        java.toast(\"登录凭据无效或已过期，登录失败\");\n        return false;\n    }\n\n    setConfig.call(this, { fanqie_sessionid: sessionId });\n\n    java.toast(\"\\n\\n欢迎 \" + user + \"\\n登录成功！\");\n    return true;\n}\n\nfunction fq_logout() {\n    try { cookie.removeCookie(\"fanqienovel.com\"); } catch (e) {}\n    try { cookie.removeCookie(\"snssdk.com\"); } catch (e) {}\n    setConfig.call(this, { fanqie_sessionid: \"\" });\n    java.toast('已退出番茄登录');\n}\n\nfunction loginJjScan() {\n    let { java } = this;\n    try {\n        let headers = buildJjHeaders.call(this);\n        let e = java.ajax(\"https://android.jjwxc.com/app.jjwxc/android/reading/Login/scanCodeLogin?versionCode=467,\" + JSON.stringify({ headers: headers }));\n        let eData = JSON.parse(e).data;\n        let jjscanurl = \"https://www.jjwxc.net?action=scanCode&jjreader_key=\" + eData.jjreader_key + \"&device_key=\" + eData.device_key;\n        let enjj = encodeURIComponent(jjscanurl);\n\n        let html = '<!DOCTYPE html><html><head><meta charset=\"UTF-8\">' +\n            '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no\">' +\n            '<title>晋江扫码登录</title><style>' +\n            '*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}' +\n            'body{font-family:-apple-system,BlinkMacSystemFont,\"PingFang SC\",\"Microsoft YaHei\",sans-serif;' +\n            'background:#0a0a0f;background-image:radial-gradient(ellipse at 30% 20%,#2a1020 0%,#0a0e27 50%,#1a0d1a 100%);' +\n            'color:#e8e8f0;min-height:100vh;padding:20px;display:flex;align-items:center;justify-content:center}' +\n            '.container{width:100%;max-width:420px;background:rgba(15,12,20,.75);backdrop-filter:blur(20px);' +\n            'border-radius:24px;border:1px solid rgba(255,255,255,.08);box-shadow:0 20px 60px rgba(0,0,0,.6);overflow:hidden}' +\n            '.header{padding:24px 24px 18px;text-align:center;border-bottom:1px solid rgba(255,255,255,.06);' +\n            'background:linear-gradient(180deg,rgba(193,74,99,.15),transparent)}' +\n            '.header h1{font-size:20px;font-weight:700;letter-spacing:1px;background:linear-gradient(135deg,#e8e8f0 40%,#c14a63);' +\n            '-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}' +\n            '.header p{font-size:12px;color:rgba(255,255,255,.45);letter-spacing:2px;margin-top:4px}' +\n            '.content{padding:24px}.qr-wrapper{width:240px;height:240px;margin:0 auto 20px;border-radius:20px;' +\n            'background:#fff;padding:12px;box-shadow:0 8px 32px rgba(193,74,99,.25)}' +\n            '.qr-wrapper img{width:100%;height:100%;display:block;border-radius:12px}' +\n            '.steps{display:flex;flex-direction:column;gap:12px;margin-bottom:16px}' +\n            '.step{display:flex;align-items:flex-start;gap:10px;font-size:13px;color:rgba(255,255,255,.75);line-height:1.5}' +\n            '.step-num{flex-shrink:0;width:22px;height:22px;border-radius:50%;background:rgba(193,74,99,.2);' +\n            'border:1px solid rgba(193,74,99,.5);color:#c14a63;font-size:11px;font-weight:700;' +\n            'display:flex;align-items:center;justify-content:center;margin-top:1px}' +\n            '.tip{padding:12px 14px;background:rgba(240,192,64,.08);border:1px solid rgba(240,192,64,.25);' +\n            'border-radius:12px;font-size:12px;color:rgba(240,192,64,.95);line-height:1.5}' +\n            '.footer{padding:14px 24px 20px;text-align:center;font-size:11px;color:rgba(255,255,255,.3);' +\n            'border-top:1px solid rgba(255,255,255,.05);letter-spacing:1px}' +\n            '</style></head><body><div class=\"container\">' +\n            '<div class=\"header\"><h1>晋江扫码登录</h1><p>SCAN TO LOGIN</p></div>' +\n            '<div class=\"content\"><div class=\"qr-wrapper\"><img src=\"https://api.qrtool.cn/?text=' + enjj + '\"></div>' +\n            '<div class=\"steps\">' +\n            '<div class=\"step\"><span class=\"step-num\">1</span><span>打开已登录晋江的手机 App</span></div>' +\n            '<div class=\"step\"><span class=\"step-num\">2</span><span>进入「我的」，点击右上角「扫码」图标</span></div>' +\n            '<div class=\"step\"><span class=\"step-num\">3</span><span>扫描上方二维码并确认授权</span></div>' +\n            '<div class=\"step\"><span class=\"step-num\">4</span><span>授权后，点击页面右上角 ✓ 完成登录</span></div>' +\n            '</div><div class=\"tip\">请先扫码授权，再点右上角 ✓。提前点击会导致二维码失效，需要重新扫码</div>' +\n            '</div><div class=\"footer\">晋江文学城 · 安全登录</div></div></body></html>';\n\n        let u = java.startBrowserAwait(\"data:text/html;base64,\" + java.base64Encode(html), \"扫码登录\", false).body();\n\n        if (u) {\n            headers[\"Content-Type\"] = \"application/octet-stream\";\n            let checkLogin = \"https://android.jjwxc.com/app.jjwxc/android/reading/Login/checkJjreaderLogin\";\n            let body = jjEncode.call(this, JSON.stringify({\n                \"versionCode\": \"467\",\n                \"jjreader_key\": eData.jjreader_key,\n                \"device_key\": eData.device_key\n            }));\n            let checkLoginpost = {\n                \"method\": \"POST\",\n                \"body\": body,\n                \"headers\": headers\n            };\n            checkLogin = checkLogin + \",\" + JSON.stringify(checkLoginpost);\n            let t = java.ajax(checkLogin);\n            t = JSON.parse(t).data?.token ?? JSON.parse(t).message;\n\n            if (/\\d+_/.test(t)) {\n                setConfig.call(this, { jj_token: t });\n                java.toast(\"✅ 晋江登录成功\\nToken 已保存\");\n            } else {\n                java.toast(t);\n            }\n        }\n    } catch (e) {\n        java.log(e);\n        java.toast(\"扫码登录失败，请重试\");\n    }\n}\n\nfunction logoutJj() {\n    setConfig.call(this, { jj_token: \"\" });\n    java.toast(\"已退出晋江登录\");\n}\n\nfunction switchServer() {\n    let list = getHosts();\n    if (!list.length) { java.toast('未配置服务器'); return; }\n    let cur = getHost.call(this);\n    let idx = list.indexOf(cur);\n    let next = list[(idx + 1) % list.length];\n    setConfig.call(this, { host: next });\n    java.toast('已切换服务器：\\n' + next);\n}\n\nfunction checkServer() {\n    let cur = getHost.call(this);\n    java.toast('正在检测：\\n' + cur);\n    let t1 = Date.now();\n    try {\n        let opt = { headers: buildHeaders.call(this) };\n        let res = java.ajax(cur + '/api/site/public,' + JSON.stringify(opt));\n        let ms = Date.now() - t1;\n        let obj = null;\n        try { obj = JSON.parse(res); } catch (e) { obj = null; }\n        let siteName = (obj.data && obj.data.site_name) ? String(obj.data.site_name) : '未知';\n        let ok = !!(obj.code == 0 && siteName.indexOf('听雪') >= 0);\n        let elapsed = (obj.meta && obj.meta.elapsedMs != null) ? obj.meta.elapsedMs : ms;\n        let level = elapsed < 800 ? '💖 优秀' : elapsed < 2000 ? '💛 一般' : '💔 较慢';\n        java.longToast(\n            '服务器：' + cur + '\\n' +\n            '站点：' + siteName + (ok ? ' ✅' : ' ❌') + '\\n' +\n            '延迟：' + elapsed + 'ms（' + level + '）'\n        );\n    } catch (e) {\n        java.longToast('服务器：' + cur + '\\n❌ 连接失败\\n' + e);\n    }\n}\n\nfunction toggleRefresh() {\n    let conf = getConfig.call(this);\n    let on = (conf.chapter_refresh_force || 'off') == 'on';\n    setConfig.call(this, { chapter_refresh_force: on ? 'off' : 'on' });\n    java.toast(on ? '\\n✔️已关闭强制刷新' : '\\n❗已开启强制刷新（绕过缓存）');\n}\n\nfunction showConfig() {\n    let c = getConfig.call(this);\n    let s = c.sources || {};\n    let lines = [];\n    ['novel','audio','comic','video','download'].forEach(function(t){\n        let arr = s[t] || [];\n        let label = {novel:'小说',audio:'听书',comic:'漫画',video:'短剧',download:'下载'}[t];\n        lines.push(label + '：' + (arr.length ? arr.join('、') : '全部'));\n    });\n    let msg = '当前配置：\\n' +\n        '服务器：' + getHost.call(this) + '\\n' +\n        lines.join('\\n') + '\\n' +\n        '性别：' + (c.gender == 'girl' ? '女频' : '男频') + '\\n' +\n        '账号：' + (getToken.call(this).b64 ? '已登录' : '未登录') + '\\n' +\n        '番茄：' + (getSessionId.call(this) ? '已登录' : '未登录');\n    java.longToast(msg);\n}\n\nfunction register() { java.startBrowserAwait(getHost.call(this) + '/spa/#/register', \"注册\"); }\nfunction user() { java.startBrowserAwait(getHost.call(this) + '/spa/#/member', \"用户中心\"); }\nfunction icons() { java.startBrowserAwait(getHost.call(this) + '/spa/#/member/icons', \"段评气泡\"); }\nfunction level() { java.startBrowserAwait('https://9wa.br3.cn/uB', \"升级\"); }", "respondTime": 180000, "ruleBookInfo": {"author": "$.author", "coverUrl": "$.cover", "init": "<js>\nif (String(baseUrl).startsWith(\"data:\")) {\n    let res = JSON.parse(java.hexDecodeToString(result));\n    let request = getHost.call(this) + `/api/detail,${JSON.stringify({\n        method: \"POST\",\n        body: JSON.stringify(res),\n        headers: buildHeaders.call(this)\n    })}`;\n    result = java.ajax(request);\n}\nresult = decryptIfEncrypted.call(this, result);\nresult = checkMsg.call(this, result);\nresult;\n</js>\n$.data", "intro": "&nbsp;&nbsp;\n❄️ 源站：{{$.source}}{{\"\\n\"+\"​\"}}\n{{$.desc}}", "kind": "$.tags", "lastChapter": "{{$.source}} · {{$.latest_chapter_title}}", "name": "$.title", "tocUrl": "<js>\nlet catalog = {\n    source: result.source,\n    sing: result.sing,\n    book_id: result.book_id,\n    title: result.title,\n    tab: result.tab\n};\n\nlet yunurl = java.base64Encode(JSON.stringify(catalog));\nresult = `data:catalogUrl;base64,${yunurl},{\"type\":\"qingci\"}`;\n</js>", "wordCount": "$.word_count"}, "ruleContent": {"callBackJs": "let handled = false;\n\nif (event == 'addBookShelf' || event == 'delBookShelf') {\n    if (isShelfSyncEnabled.call(this)) {\n        syncShelf.call(this, event == 'addBookShelf');\n    }\n    handled = true;\n}\n\nif (event == 'clickCustomButton') {\n    let targetUrl = '';\n\n    // 正文页：章评\n    if (chapter && chapter.url) {\n        try {\n            let chUrl = String(chapter.url);\n            let b64 = chUrl.replace(/^data:contentUrl;base64,/, '');\n            let idx = b64.indexOf(',');\n            if (idx >= 0) b64 = b64.substring(0, idx);\n            let params = JSON.parse(java.base64Decode(b64));\n            let bid = params.book_id || '';\n            let cid = params.item_id || '';\n            let src = params.source || '';\n            if (bid && cid) {\n                targetUrl = getHost.call(this) + '/comment?tab=chapter&book_id=' + bid\n                          + '&item_id=' + cid\n                          + '&source=' + src;\n            }\n        } catch (e) {}\n    }\n\n    // 详情页：书评\n    if (!targetUrl && book && book.tocUrl) {\n        try {\n            let tocUrl = String(book.tocUrl);\n            let b64 = tocUrl.replace(/^data:catalogUrl;base64,/, '');\n            let idx = b64.indexOf(',');\n            if (idx >= 0) b64 = b64.substring(0, idx);\n            let catalog = JSON.parse(java.base64Decode(b64));\n            let bid = catalog.book_id || catalog.bookid || '';\n            let src = catalog.source || '';\n            if (bid) {\n                targetUrl = getHost.call(this) + '/comment?tab=book&book_id=' + bid\n                          + '&source=' + src;\n            }\n        } catch (e) {}\n    }\n\n    if (targetUrl) {\n        java.showBrowser(\n            targetUrl,\n            null,\n            'window.java=java;',\n            JSON.stringify(getCmtBrowserOptions.call(this))\n        );\n    } else {\n        java.toast('请等待章节或详情加载完毕');\n    }\n    handled = true;\n}\n\nhandled;", "content": "@js:\nlet chapterParams = JSON.parse(java.hexDecodeToString(result));\nchapterParams.version = localVersion;\n\nlet conf = getConfig.call(this);\nlet sourceName = chapterParams.source || '';\n\nif (conf.chapter_refresh_force == 'on') {\n    chapterParams.force_refresh = 'on';\n}\n\nlet toneVar = String(book.getVariable('custom') || '');\nif (!toneVar) {\n    if (sourceName == '番茄听书') toneVar = '1';\n    else if (sourceName == '书旗听书') toneVar = 'yifei';\n}\nchapterParams.tone_id = toneVar;\nsyncProgress.call(this, chapterParams);\n\nlet paraOn = (conf.para_review || 'off') == 'on';\nlet paraStyle = conf.para_style || 'TEXT';\nlet syOn = (conf.para_sy || 'off') == 'on';\n\nif (syOn) {\n    chapterParams.devicetype = \"ios\";\n} else {\n    chapterParams.devicetype = \"android\";\n}\n\nlet paraSources = ['番茄小说', '企鹅阅读', '晋江', '七猫', '少年梦', '书旗'];\nif (paraOn && paraSources.indexOf(sourceName) !== -1) {\n    chapterParams.review = 'on';\n    chapterParams.style = paraStyle;\n}\n\nif (sourceName == '书旗听书' || sourceName == '番茄听书') {\n    let obj = postJson.call(this, '/api/audio', chapterParams);\n    let data = obj.data || {};\n    result = data.main_url || '';\n} else {\n    let obj = postJson.call(this, '/api/content', chapterParams);\n\n    if (shouldBlockByVersion.call(this, obj.data && obj.data.version)) {\n        result = '';\n    } else {\n        let content = (obj.data && obj.data.content != null) ? obj.data.content : obj.message;\n        let tab = (obj.data && obj.data.tab) || chapterParams.tab || '';\n\n        if (tab == 'video' && content && /^https?:\\/\\//i.test(String(content))) {\n            if (book.durChapterIndex == chapter.index) {\n                try {\n                    java.startBrowser(String(content), chapter.title);\n                    java.toast('正在加载视频\\n视频加载较慢，请耐心等待');\n                } catch (e) {}\n            }\n            result = '【刷新正文】播放\\n直链:\\n' + content;\n        } else {\n            result = content;\n        }\n    }\n}", "imageStyle": "FULL", "payAction": "let raw = String(baseUrl);\nlet b64 = raw.replace(/^data:contentUrl;base64,/, '');\nlet idx = b64.indexOf(',');\nif (idx >= 0) b64 = b64.substring(0, idx);\nlet chapterParams = JSON.parse(java.base64Decode(b64));\n\nlet bid = String(chapterParams.book_id || '');\nlet cid = String(chapterParams.item_id || '');\n\nlet token = getJjToken.call(this);\nlet enbody = String(Date.now()) + \":\" + token + \":\" + bid;\nlet sign = encode.call(this, enbody);\nlet body = \"versionCode=444&novelId=\" + bid + \"&chapters=\" + cid + \"&orderType=15&isautoBuy=0&autosubscribeStatus=0&notUseBackpoint=&sign=\" + sign;\nlet url = \"https://android.jjwxc.net/androidapi/buy,\";\nlet post = { \"method\": \"POST\", \"body\": String(body) };\nlet a = java.ajax(url + JSON.stringify(post));\nlet res = JSON.parse(a);\nif (/购买成功/.test(res.message)) {\n    java.longToast(res.message);\n    result = true;\n} else {\n    let mm = res.message == \"\"\n        ? (res.popupdata && res.popupdata.popupmessage ? res.popupdata.popupmessage : \"购买失败\") + \"\\n❗️进晋江app进行一次验证后❗️才能在阅读app使用购买功能\"\n        : res.message;\n    java.longToast(mm);\n}", "subContent": "@js:\nlet chapterParams = JSON.parse(java.hexDecodeToString(result));\n\nvar sourceName = chapterParams.source || '';\n\nlet toneVar = String(book.getVariable('custom') || '');\nif (!toneVar) {\n    if (sourceName == '番茄听书') toneVar = '1';\n    else if (sourceName == '书旗听书') toneVar = 'yifei';\n}\nchapterParams.tone_id = toneVar;\n\nlet allowSources = ['番茄听书', '番茄畅听', '七猫听书', '酷我听书', '书旗听书'];\nif (allowSources.indexOf(sourceName) == -1) {\n    result = '';\n} else {\n    let headers = buildHeaders.call(this);\n    headers['Content-Type'] = 'application/json';\n    let op = { method: \"POST\", body: JSON.stringify(chapterParams), headers: headers };\n    let url = getHost.call(this) + `/api/lrc,${JSON.stringify(op)}`;\n    let res = java.ajax(url);\n    res = decryptIfEncrypted.call(this, res);\n    let obj = JSON.parse(res);\n    result = (obj.data && obj.data.lrc) ? obj.data.lrc : '';\n}"}, "ruleExplore": {"author": "$.author", "bookList": "<js>\nlet res = decryptIfEncrypted.call(this, result);\nres = checkMsg.call(this, res);\nresult = res;\n</js>\n$.data", "bookUrl": "<js>\nlet detail = {\n    source: result.source,\n    sing: result.sing,\n    book_id: result.book_id\n};\nlet yunurl = java.base64Encode(JSON.stringify(detail));\nresult = `data:detailsUrl;base64,${yunurl},{\"type\":\"qingci\"}`;\n</js>", "coverUrl": "$.cover", "intro": "$.desc", "kind": "$.tags", "lastChapter": "$.latest_chapter_title", "name": "$.title", "wordCount": "$.word_count"}, "ruleSearch": {"author": "$.author", "bookList": "<js>\nlet res = decryptIfEncrypted.call(this, result);\nres = checkMsg.call(this, res);\nresult = res;\n</js>\n$.data.list", "bookUrl": "<js>\nlet detail = {\n    source: result.source,\n    sing: result.sing,\n    book_id: result.book_id\n};\nlet yunurl = java.base64Encode(JSON.stringify(detail));\nresult = `data:detailsUrl;base64,${yunurl},{\"type\":\"qingci\"}`;\n</js>", "checkKeyWord": "十日终焉", "coverUrl": "$.cover", "intro": "$.desc", "kind": "$.tags", "lastChapter": "{{$.source}} · {{$.latest_chapter_title}}", "name": "$.title", "wordCount": "$.word_count"}, "ruleToc": {"chapterList": "<js>\nvar res = JSON.parse(java.hexDecodeToString(result));\nlet device = deviceType() ? 'ios' : 'android';\nlet typeMap;\n\nif (device == 'android') {\n    typeMap = { audio: 32, comic: 64 };\n    book.type = res.tab in typeMap ? typeMap[res.tab] : 8;\n} else {\n    typeMap = { audio: 1, comic: 2, video: 3 };\n    book.type = res.tab in typeMap ? typeMap[res.tab] : 0;\n}\nvar headers = buildHeaders.call(this);\nheaders['Content-Type'] = 'application/json';\nvar op = { method: \"POST\", body: JSON.stringify(res), headers: headers };\nvar url = getHost.call(this) + '/api/catalog,' + JSON.stringify(op);\nresult = decryptIfEncrypted.call(this, java.ajax(url));\nresult = checkMsg.call(this, result);\nresult;\n</js>\n$.data", "chapterName": "$.title", "chapterUrl": "<js>\nif (result.is_volume == true) {\n    result = \"\";\n} else {\n    let content = {\n    \t   sing: result.sing,\n        book_id: result.book_id || \"\",\n        item_id: result.item_id || \"\",\n        content_md5: result.content_md5 || \"\",\n        chapter_index: result.chapter_index,\n        source: result.source\n    };\n    let yunurl = java.base64Encode(JSON.stringify(content));\n    result = `data:contentUrl;base64,${yunurl},{\"type\":\"qingci\"}`;\n}\n</js>", "isPay": "$.is_pay", "isVip": "$.is_vip", "isVolume": "$.is_volume", "updateTime": "$.tag"}, "searchUrl": "<js>\nvar conf = ensureConfig.call(this);\nvar sourceVal = conf.source || '';\nvar param = sourceVal ? '&source=' + sourceVal.split(',').map(function(s){ return s.trim(); }).join(',') : '';\n\nvar mode = conf.mode || 'novel';\nvar modeMap = {\n    '📖小说': 'novel',\n    '🎧听书': 'audio',\n    '🌈漫画': 'comic',\n    '▶️短剧': 'video',\n    '⬇️下载': 'download'\n};\nif (modeMap[mode]) mode = modeMap[mode];\n\nvar sources = conf.sources || {};\nvar allTabs = Array.isArray(conf.allTabs) ? conf.allTabs : [];\nvar tabs = ['novel', 'audio', 'comic', 'video', 'download'];\n\nvar curList = sources[mode] || [];\nif (curList.length == 0 && allTabs.indexOf(mode) == -1) {\n    for (var i = 0; i < tabs.length; i++) {\n        var t = tabs[i];\n        if ((sources[t] || []).length > 0 || allTabs.indexOf(t) != -1) {\n            mode = t;\n            break;\n        }\n    }\n}\n\nresult = getHost.call(this) + '/api/search?keyword={{key}}&page={{page}}&tab=' + mode + param;\n</js>", "weight": 0},{"bookSourceComment": "wap.22k.org 书源。站点每次搜索都会 Set-Cookie: ss_search_delay=1 (Max-Age=30, path=/)，请求一旦带上它就只返回「搜索间隔: 30 秒」空页 → 连续搜索第 2 次起 0 结果。三层防护：enabledCookieJar=false 不加载 CookieJar；loginCheckJs 在每次响应后清除 Cookie（下一次请求必干净）；searchUrl 的 {{cookie.removeCookie}} 请求前再清一次。header 不写 Cookie，避免被 App 合并注入。搜索为站点硬上限 100 条（LIMIT 100，无分页）；发现页支持 {{page}} 翻页。关键词至少 2 个汉字。正文标题规则已改为纯文本（原 ##（[^）]*） 正则会被阅读App误解析成字面量混入正文）。 本版搜索为 POST /search/。", "bookSourceGroup": "自制", "bookSourceName": "22k小说·连续搜", "bookSourceType": 0, "bookSourceUrl": "https://wap.22k.org/", "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "exploreUrl": "[{\"title\":\"玄幻奇幻\",\"url\":\"/lei/1/{{page}}/\"},{\"title\":\"武侠修真\",\"url\":\"/lei/2/{{page}}/\"},{\"title\":\"都市言情\",\"url\":\"/lei/3/{{page}}/\"},{\"title\":\"历史军事\",\"url\":\"/lei/4/{{page}}/\"},{\"title\":\"游戏竞技\",\"url\":\"/lei/5/{{page}}/\"},{\"title\":\"恐怖灵异\",\"url\":\"/lei/6/{{page}}/\"},{\"title\":\"科幻灵异\",\"url\":\"/lei/7/{{page}}/\"},{\"title\":\"其他类型\",\"url\":\"/lei/8/{{page}}/\"},{\"title\":\"科幻魔幻(漫)\",\"url\":\"/lei/9/{{page}}/\"},{\"title\":\"少年热血(漫)\",\"url\":\"/lei/10/{{page}}/\"},{\"title\":\"都市爱情(漫)\",\"url\":\"/lei/11/{{page}}/\"},{\"title\":\"武侠格斗(漫)\",\"url\":\"/lei/12/{{page}}/\"},{\"title\":\"全本\",\"url\":\"/quanben/lei/{{page}}/\"},{\"title\":\"排行榜\",\"url\":\"/top.html\"}]", "lastUpdateTime": "1793887392822", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=\"og:novel:author\"]@content||meta[property=\"og:comic:author\"]@content||.novel_info_title i a@text", "coverUrl": ".novel_info_main img@src##^http:##https:", "intro": "meta[property=\"og:description\"]@content||#info .intro@text", "kind": "meta[property=\"og:novel:category\"]@content||meta[property=\"og:comic:category\"]@content", "lastChapter": "meta[property=\"og:novel:lastest_chapter_name\"]@content||meta[property=\"og:comic:lastest_chapter_name\"]@content||.novel_info_title .flex.to100 a@text", "name": "meta[property=\"og:novel:book_name\"]@content||meta[property=\"og:comic:book_name\"]@content||h1@text"}, "ruleContent": {"content": "div.novel-start-text@html||#contents@html||article.content@html", "nextContentUrl": "#next_url@href##^(?!.*_\\d+\\.html).*$", "title": "p.style_h1@text||h1@text"}, "ruleExplore": {"author": ".li_bottom a@text##^\\s+||.rank-author@text||p@text##\\s*\\d+\\s*万字.*$", "bookList": "ul.flex>li||ul.rank-list li||li.searchresult", "bookUrl": ".img_span a@href||a@href", "coverUrl": "img@data-original##^http:##https:||img@src", "intro": "p.indent@text||p.searchresult_p@text", "kind": ".img_span span@text##\\s*/.*$", "name": "h2@text||h3@text||a@text"}, "ruleSearch": {"author": "p@text##^\\s+|\\s*\\d+\\s*万字.*$", "bookList": "li.searchresult", "bookUrl": ".img_span a@href||a@href", "coverUrl": "img@data-original##^http:##https:||img@src", "intro": "p.searchresult_p@text", "kind": ".img_span span@text##\\s*/.*$", "lastChapter": "p.2 a@text", "name": "h3@text||span.hot@text"}, "ruleToc": {"chapterList": "#catalog #ul_all_chapters li", "chapterName": "a@text||a@title", "chapterUrl": "a@href"}, "searchUrl": "{{cookie.removeCookie(source.getKey())}}/search/,{\"body\":\"searchkey={{key}}&searchtype=all\",\"charset\":\"UTF-8\",\"method\":\"POST\"}", "weight": 0, "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 12; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Mobile Safari/537.36\",\"Referer\":\"https://wap.22k.org/\"}", "loginCheckJs": "try{cookie.removeCookie(source.key)}catch(e){}\ntry{cookie.removeCookie(source.getKey())}catch(e){}\ntry{cookie.removeCookie('https://wap.22k.org/')}catch(e){}\nresult"},{"bookSourceComment": "wap.22k.org 书源。站点每次搜索都会 Set-Cookie: ss_search_delay=1 (Max-Age=30, path=/)，请求一旦带上它就只返回「搜索间隔: 30 秒」空页 → 连续搜索第 2 次起 0 结果。三层防护：enabledCookieJar=false 不加载 CookieJar；loginCheckJs 在每次响应后清除 Cookie（下一次请求必干净）；searchUrl 的 {{cookie.removeCookie}} 请求前再清一次。header 不写 Cookie，避免被 App 合并注入。搜索为站点硬上限 100 条（LIMIT 100，无分页）；发现页支持 {{page}} 翻页。关键词至少 2 个汉字。 本版搜索为 POST /search/。", "bookSourceGroup": "自制", "bookSourceName": "22k小说·连续搜", "bookSourceType": 0, "bookSourceUrl": "https://wap.22k.org/", "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "exploreUrl": "[{\"title\":\"玄幻奇幻\",\"url\":\"/lei/1/{{page}}/\"},{\"title\":\"武侠修真\",\"url\":\"/lei/2/{{page}}/\"},{\"title\":\"都市言情\",\"url\":\"/lei/3/{{page}}/\"},{\"title\":\"历史军事\",\"url\":\"/lei/4/{{page}}/\"},{\"title\":\"游戏竞技\",\"url\":\"/lei/5/{{page}}/\"},{\"title\":\"恐怖灵异\",\"url\":\"/lei/6/{{page}}/\"},{\"title\":\"科幻灵异\",\"url\":\"/lei/7/{{page}}/\"},{\"title\":\"其他类型\",\"url\":\"/lei/8/{{page}}/\"},{\"title\":\"科幻魔幻(漫)\",\"url\":\"/lei/9/{{page}}/\"},{\"title\":\"少年热血(漫)\",\"url\":\"/lei/10/{{page}}/\"},{\"title\":\"都市爱情(漫)\",\"url\":\"/lei/11/{{page}}/\"},{\"title\":\"武侠格斗(漫)\",\"url\":\"/lei/12/{{page}}/\"},{\"title\":\"全本\",\"url\":\"/quanben/lei/{{page}}/\"},{\"title\":\"排行榜\",\"url\":\"/top.html\"}]", "lastUpdateTime": "1793885860727", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=\"og:novel:author\"]@content||meta[property=\"og:comic:author\"]@content||.novel_info_title i a@text", "coverUrl": ".novel_info_main img@src##^http:##https:", "intro": "meta[property=\"og:description\"]@content##^[^《]*《[^》]*》\\s*||#info .intro@text", "kind": "meta[property=\"og:novel:category\"]@content||meta[property=\"og:comic:category\"]@content", "lastChapter": "meta[property=\"og:novel:lastest_chapter_name\"]@content||meta[property=\"og:comic:lastest_chapter_name\"]@content||.novel_info_title .flex.to100 a@text", "name": "meta[property=\"og:novel:book_name\"]@content||meta[property=\"og:comic:book_name\"]@content||h1@text"}, "ruleContent": {"content": "div.novel-start-text@html||#contents@html||article.content@html", "nextContentUrl": "#next_url@href##^(?!.*_\\d+\\.html).*$", "title": "p.style_h1@text##（[^）]*）||h1@text##（[^）]*）"}, "ruleExplore": {"author": ".li_bottom a@text##^\\s+||.rank-author@text||p@text##\\s*\\d+\\s*万字.*$", "bookList": "ul.flex>li||ul.rank-list li||li.searchresult", "bookUrl": ".img_span a@href||a@href", "coverUrl": "img@data-original##^http:##https:||img@src", "intro": "p.indent@text||p.searchresult_p@text", "kind": ".img_span span@text##\\s*/.*$", "name": "h2@text||h3@text||a@text"}, "ruleSearch": {"author": "p@text##^\\s+|\\s*\\d+\\s*万字.*$", "bookList": "li.searchresult", "bookUrl": ".img_span a@href||a@href", "coverUrl": "img@data-original##^http:##https:||img@src", "intro": "p.searchresult_p@text", "kind": ".img_span span@text##\\s*/.*$", "lastChapter": "p.2 a@text", "name": "h3@text||span.hot@text"}, "ruleToc": {"chapterList": "#catalog #ul_all_chapters li", "chapterName": "a@text||a@title", "chapterUrl": "a@href"}, "searchUrl": "{{cookie.removeCookie(source.getKey())}}/search/,{\"body\":\"searchkey={{key}}&searchtype=all\",\"charset\":\"UTF-8\",\"method\":\"POST\"}", "weight": 0, "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 12; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Mobile Safari/537.36\",\"Referer\":\"https://wap.22k.org/\"}", "loginCheckJs": "try{cookie.removeCookie(source.key)}catch(e){}\ntry{cookie.removeCookie(source.getKey())}catch(e){}\ntry{cookie.removeCookie('https://wap.22k.org/')}catch(e){}\nresult"},{"bookSourceComment": "wap.22k.org 书源。搜索为站点硬上限 100 条（服务端 LIMIT 100，无分页、无参数可调），书源已把 100 条全部解析，无丢弃；想看更多书请用发现页：12 个分类 + 全本均支持 {{page}} 翻页（分类最多 7500 页），排行榜一次返回 1611 本。搜索关键词至少 2 个汉字。 搜索前用 cookie.removeCookie 清除限流 Cookie。", "bookSourceGroup": "自制", "bookSourceName": "22k小说·可翻页", "bookSourceType": 0, "bookSourceUrl": "https://wap.22k.org/", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "[{\"title\":\"玄幻奇幻\",\"url\":\"/lei/1/{{page}}/\"},{\"title\":\"武侠修真\",\"url\":\"/lei/2/{{page}}/\"},{\"title\":\"都市言情\",\"url\":\"/lei/3/{{page}}/\"},{\"title\":\"历史军事\",\"url\":\"/lei/4/{{page}}/\"},{\"title\":\"游戏竞技\",\"url\":\"/lei/5/{{page}}/\"},{\"title\":\"恐怖灵异\",\"url\":\"/lei/6/{{page}}/\"},{\"title\":\"科幻灵异\",\"url\":\"/lei/7/{{page}}/\"},{\"title\":\"其他类型\",\"url\":\"/lei/8/{{page}}/\"},{\"title\":\"科幻魔幻(漫)\",\"url\":\"/lei/9/{{page}}/\"},{\"title\":\"少年热血(漫)\",\"url\":\"/lei/10/{{page}}/\"},{\"title\":\"都市爱情(漫)\",\"url\":\"/lei/11/{{page}}/\"},{\"title\":\"武侠格斗(漫)\",\"url\":\"/lei/12/{{page}}/\"},{\"title\":\"全本\",\"url\":\"/quanben/lei/{{page}}/\"},{\"title\":\"排行榜\",\"url\":\"/top.html\"}]", "lastUpdateTime": "1793884904951", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=\"og:novel:author\"]@content||meta[property=\"og:comic:author\"]@content||.novel_info_title i a@text", "coverUrl": ".novel_info_main img@src##^http:##https:", "intro": "meta[property=\"og:description\"]@content##^[^《]*《[^》]*》\\s*||#info .intro@text", "kind": "meta[property=\"og:novel:category\"]@content||meta[property=\"og:comic:category\"]@content", "lastChapter": "meta[property=\"og:novel:lastest_chapter_name\"]@content||meta[property=\"og:comic:lastest_chapter_name\"]@content||.novel_info_title .flex.to100 a@text", "name": "meta[property=\"og:novel:book_name\"]@content||meta[property=\"og:comic:book_name\"]@content||h1@text"}, "ruleContent": {"content": "div.novel-start-text@html||#contents@html||article.content@html", "nextContentUrl": "#next_url@href##^(?!.*_\\d+\\.html).*$", "title": "p.style_h1@text##（[^）]*）||h1@text##（[^）]*）"}, "ruleExplore": {"author": ".li_bottom a@text##^\\s+||.rank-author@text||p@text##\\s*\\d+\\s*万字.*$", "bookList": "ul.flex>li||ul.rank-list li||li.searchresult", "bookUrl": ".img_span a@href||a@href", "coverUrl": "img@data-original##^http:##https:||img@src", "intro": "p.indent@text||p.searchresult_p@text", "kind": ".img_span span@text##\\s*/.*$", "name": "h2@text||h3@text||a@text"}, "ruleSearch": {"author": "p@text##^\\s+|\\s*\\d+\\s*万字.*$", "bookList": "li.searchresult", "bookUrl": ".img_span a@href||a@href", "coverUrl": "img@data-original##^http:##https:||img@src", "intro": "p.searchresult_p@text", "kind": ".img_span span@text##\\s*/.*$", "lastChapter": "p.2 a@text", "name": "h3@text||span.hot@text"}, "ruleToc": {"chapterList": "#catalog #ul_all_chapters li", "chapterName": "a@text||a@title", "chapterUrl": "a@href"}, "searchUrl": "{{cookie.removeCookie(source.getKey())}}/search/,{\"body\":\"searchkey={{key}}&searchtype=all\",\"charset\":\"UTF-8\",\"method\":\"POST\"}", "weight": 0, "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 12; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Mobile Safari/537.36\",\"Referer\":\"https://wap.22k.org/\"}"},{"bookSourceComment": "wap.22k.org 书源。搜索前用 {{cookie.removeCookie(source.getKey())}} 主动清除站点的 ss_search_delay 限流 Cookie（阅读App标准解法，源仓库同模板书源通用）；POST /search/ 带 charset=UTF-8；关键词至少2个汉字。", "bookSourceGroup": "自制", "bookSourceName": "22k小说", "bookSourceType": 0, "bookSourceUrl": "https://wap.22k.org/", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "[{\"title\":\"玄幻奇幻\",\"url\":\"/lei/1/1/\"},{\"title\":\"武侠修真\",\"url\":\"/lei/2/1/\"},{\"title\":\"都市言情\",\"url\":\"/lei/3/1/\"},{\"title\":\"历史军事\",\"url\":\"/lei/4/1/\"},{\"title\":\"游戏竞技\",\"url\":\"/lei/5/1/\"},{\"title\":\"恐怖灵异\",\"url\":\"/lei/6/1/\"},{\"title\":\"科幻灵异\",\"url\":\"/lei/7/1/\"},{\"title\":\"其他类型\",\"url\":\"/lei/8/1/\"},{\"title\":\"科幻魔幻(漫)\",\"url\":\"/lei/9/1/\"},{\"title\":\"少年热血(漫)\",\"url\":\"/lei/10/1/\"},{\"title\":\"都市爱情(漫)\",\"url\":\"/lei/11/1/\"},{\"title\":\"武侠格斗(漫)\",\"url\":\"/lei/12/1/\"},{\"title\":\"全本\",\"url\":\"/quanben/lei/\"},{\"title\":\"排行榜\",\"url\":\"/top.html\"}]", "lastUpdateTime": "1793884059707", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=\"og:novel:author\"]@content||meta[property=\"og:comic:author\"]@content||.novel_info_title i a@text", "coverUrl": ".novel_info_main img@src##^http:##https:", "intro": "meta[property=\"og:description\"]@content##^[^《]*《[^》]*》\\s*||#info .intro@text", "kind": "meta[property=\"og:novel:category\"]@content||meta[property=\"og:comic:category\"]@content", "lastChapter": "meta[property=\"og:novel:lastest_chapter_name\"]@content||meta[property=\"og:comic:lastest_chapter_name\"]@content||.novel_info_title .flex.to100 a@text", "name": "meta[property=\"og:novel:book_name\"]@content||meta[property=\"og:comic:book_name\"]@content||h1@text"}, "ruleContent": {"content": "div.novel-start-text@html||#contents@html||article.content@html", "nextContentUrl": "#next_url@href##^(?!.*_\\d+\\.html).*$", "title": "p.style_h1@text##（[^）]*）||h1@text##（[^）]*）"}, "ruleExplore": {"author": ".li_bottom a@text##^\\s+||.rank-author@text||p@text##\\s*\\d+\\s*万字.*$", "bookList": "ul.flex>li||ul.rank-list li||li.searchresult", "bookUrl": ".img_span a@href||a@href", "coverUrl": "img@data-original##^http:##https:||img@src", "intro": "p.indent@text||p.searchresult_p@text", "kind": ".img_span span@text##\\s*/.*$", "name": "h2@text||h3@text||a@text"}, "ruleSearch": {"author": "p@text##^\\s+|\\s*\\d+\\s*万字.*$", "bookList": "li.searchresult", "bookUrl": ".img_span a@href||a@href", "coverUrl": "img@data-original##^http:##https:||img@src", "intro": "p.searchresult_p@text", "kind": ".img_span span@text##\\s*/.*$", "lastChapter": "p.2 a@text", "name": "h3@text||span.hot@text"}, "ruleToc": {"chapterList": "#catalog #ul_all_chapters li", "chapterName": "a@text||a@title", "chapterUrl": "a@href"}, "searchUrl": "{{cookie.removeCookie(source.getKey())}}/search/,{\"body\":\"searchkey={{key}}&searchtype=all\",\"charset\":\"UTF-8\",\"method\":\"POST\"}", "weight": 0, "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 12; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Mobile Safari/537.36\",\"Referer\":\"https://wap.22k.org/\"}"},{"bookSourceComment": "发布页 https://fb.omoo.tv/ 动态取 4 条线路；登录面板可换发布页/一键取线/并发测速/逐线路切换/检查状态。站点免登录；搜索/分类页偶发 MACCMS「系统安全验证」，loginCheckJs 自动 POST verify_check 过盾（本地时间戳 XOR 生成 token）。正文现场请求 art.v2player.top 播放器页，AES-CBC/PKCS7 解密出 mp4 直链，bookSourceType=4 直接播放。搜索链路 3 秒节流，不设全局限速；兼容 Legado Team / legado-E。", "bookSourceGroup": "AI,动漫", "bookSourceName": "▶ OmoFun 动漫（发布页多线路）", "bookSourceType": 4, "bookSourceUrl": "https://fb.omoo.tv/", "bookUrlPattern": "https?://[^/]+/anime/[0-9a-f]{24}\\.html", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:(function(){var line=OM_line(source);var rows=[{title:'📺 首页推荐',url:line+'/'},{title:'🗓 周更表',url:line+'/week/'},{title:'🔥 今日热播',url:line+'/dayhot/'},{title:'🌸 新番表',url:line+'/topic/'},{title:'🇯🇵 日漫',url:line+'/type/1-{{page}}.html'},{title:'🇨🇳 国漫',url:line+'/type/2-{{page}}.html'},{title:'🎬 动画',url:line+'/type/5-{{page}}.html'},{title:'🎞 剧场',url:line+'/type/24-{{page}}.html'},{title:'🦸 特摄',url:line+'/type/4-{{page}}.html'},{title:'🇺🇸 美漫',url:line+'/type/3-{{page}}.html'}];return JSON.stringify(rows);})()", "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36\", \"Referer\": \"https://www.omofuns.com/\"}", "jsLib": "\n// ===================== OmoFun 公用工具 =====================\nvar OM_UA = \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36\";\nvar OM_PUB = \"https://fb.omoo.tv/\";\nvar OM_DEFAULT = \"https://www.omofuns.com\";\nvar OM_PLAYER = \"https://art.v2player.top:8989/player/?\";\nvar OM_AESKEY = \"ABABEF777999CCCD\";\nvar OM_LINES = [\n  \"https://www.omofuns.com\", \"https://cn.233dm.com\",\n  \"https://cn.211dm.com\", \"https://cn.agekkkk.com\"\n];\nvar OM_LINE_NAMES = [\"omofuns.com\", \"cn.233dm.com\", \"cn.211dm.com\", \"cn.agekkkk.com\"];\n\n// JsNull 三态归一：E 版 source.get 未设置返回 truthy 对象\nfunction OM_g(v) {\n  var s = String(v === undefined || v === null ? '' : v);\n  if (s === '' || s === 'null' || s === 'undefined' || s === 'JsNull' || s === '[object Object]') return '';\n  return s;\n}\nfunction OM_line(sv) {\n  var v = '';\n  try { v = OM_g(sv.get('om_line')); } catch (e) { }\n  if (v.indexOf('http') !== 0) v = OM_DEFAULT;\n  return v.replace(/\\/+$/, '');\n}\nfunction OM_pub(sv) {\n  var v = '';\n  try { v = OM_g(sv.get('om_pub')); } catch (e) { }\n  if (v.indexOf('http') !== 0) v = OM_PUB;\n  return v.replace(/\\/+$/, '');\n}\nfunction OM_toast(jv, msg) {\n  try { jv.toast(msg); return; } catch (e) { }\n  try { jv.longToast(msg); } catch (e2) { }\n}\n// 纯 JS Latin-1 base64（Rhino 里 java.base64Encode(byte[]) 会被字符串化成 [B@xxx）\nfunction OM_b64(s) {\n  var t = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=', o = '';\n  for (var i = 0; i < s.length; i += 3) {\n    var a = s.charCodeAt(i) & 255;\n    var b = i + 1 < s.length ? s.charCodeAt(i + 1) & 255 : null;\n    var c = i + 2 < s.length ? s.charCodeAt(i + 2) & 255 : null;\n    var n = (a << 16) | ((b || 0) << 8) | (c || 0);\n    o += t.charAt((n >> 18) & 63) + t.charAt((n >> 12) & 63)\n      + (b === null ? '=' : t.charAt((n >> 6) & 63))\n      + (c === null ? '=' : t.charAt(n & 63));\n  }\n  return o;\n}\n// MACCMS「系统安全验证」token：时间戳 XOR 16字节固定密钥 → Latin-1 → base64\nfunction OM_token() {\n  var key = [0x4e, 0x3f, 0xa9, 0xc2, 0x12, 0x7d, 0x88, 0xef,\n             0x55, 0xaa, 0x0b, 0xcd, 0xde, 0xad, 0xbe, 0xef];\n  var ts = String(Date.now()), p = '';\n  for (var i = 0; i < ts.length; i++) p += String.fromCharCode(ts.charCodeAt(i) ^ key[i % 16]);\n  return OM_b64(p);\n}\n// 过盾：POST verify_check 种 Cookie。type 取 search/show；成功后同域全站放行。\nfunction OM_pass(jv, line, type) {\n  var t = type || 'search';\n  var u = line.replace(/\\/+$/, '') + '/index.php/ajax/verify_check?type=' + t;\n  var tok = OM_token();\n  var hd = {\n    'Content-Type': 'application/x-www-form-urlencoded',\n    'Referer': line.replace(/\\/+$/, '') + '/',\n    'X-Requested-With': 'XMLHttpRequest',\n    'User-Agent': OM_UA,\n    'Origin': line.replace(/\\/+$/, '')\n  };\n  try {\n    var r = jv.post(u, 'i=' + encodeURIComponent(tok), hd);\n    var b = String(r.body());\n    return b.indexOf('\"code\":1') >= 0 || b.indexOf('\"code\": 1') >= 0 || /\"msg\"\\s*:\\s*\"ok\"/.test(b);\n  } catch (e) { return false; }\n}\n// 发布页线路解析：eval 混淆脚本取 encodedLinks → base64 解码\nfunction OM_fetchLines(jv, pubUrl) {\n  var h = String(jv.ajax(pubUrl));\n  var re = /<script>([\\w\\W]*?)<\\/script>/g, m, code = '';\n  while ((m = re.exec(h)) !== null) code = m[1];\n  if (!code || code.indexOf('encodedLinks') < 0) return { err: '发布页结构变化，未找到线路数组', html: h.slice(0, 200) };\n  var window = this, document = {};\n  var arr;\n  try { eval(code); arr = encodedLinks; } catch (e) { return { err: '发布页脚本执行失败：' + e }; }\n  if (!arr || !arr.length) return { err: '发布页线路数组为空' };\n  var out = [], seen = {};\n  for (var i = 0; i < arr.length; i++) {\n    var parts = String(arr[i]).split('|'), u = '';\n    try { u = String(jv.base64Decode(parts[0])); } catch (e2) { }\n    u = u.replace(/\\/+$/, '');\n    if (u.indexOf('http') !== 0 || seen[u]) continue;\n    seen[u] = 1;\n    out.push({ u: u, n: parts[1] || u.replace(/^https?:\\/\\//, '') });\n  }\n  return { lines: out };\n}\n// 线路探活三判据：code 200-399 + body 足够长 + 非异常堆栈串\nfunction OM_probeOne(jv, u) {\n  var t = Date.now();\n  try {\n    var r = jv.ajax(u + '/');\n    var raw = r && r.raw && typeof r.raw === 'function' ? r.raw() : null;\n    var code = 0;\n    try { code = raw ? raw.code() : 0; } catch (e0) { }\n    var b = String(r.body ? r.body() : r);\n    var ok = (code >= 200 && code < 400 || code === 0) && b.length > 20000\n      && !(b.length < 3000 && /Exception|Error|堆栈/.test(b));\n    return { u: u, ms: Date.now() - t, ok: ok, len: b.length };\n  } catch (e) { return { u: u, ms: Date.now() - t, ok: false, err: String(e) }; }\n}\n// 保存线路池：每个按钮一个键 om_s1..om_s8 + 池数量 om_sn\nfunction OM_saveLines(sv, lines) {\n  var n = Math.min(lines.length, 8);\n  try {\n    sv.put('om_sn', String(n));\n    for (var i = 0; i < 8; i++) sv.put('om_s' + (i + 1), i < n ? lines[i].u : '');\n    sv.put('om_lines', JSON.stringify(lines.slice(0, n)));\n    sv.put('om_line', lines[0].u);\n  } catch (e) { }\n  return n;\n}\nfunction OM_loadLines(sv) {\n  var arr = [];\n  try {\n    var raw = OM_g(sv.get('om_lines'));\n    if (raw) { var p = JSON.parse(raw); if (p && p.length) arr = p; }\n  } catch (e) { }\n  if (!arr.length) {\n    var n = 0;\n    try { n = parseInt(OM_g(sv.get('om_sn')), 10) || 0; } catch (e2) { }\n    for (var i = 1; i <= n; i++) {\n      var u = ''; try { u = OM_g(sv.get('om_s' + i)); } catch (e3) { }\n      if (u.indexOf('http') === 0) arr.push({ u: u, n: u.replace(/^https?:\\/\\//, '') });\n    }\n  }\n  if (!arr.length) for (var k = 0; k < OM_LINES.length; k++) arr.push({ u: OM_LINES[k], n: OM_LINE_NAMES[k] });\n  return arr;\n}\nfunction OM_speedKey(i) { return 'om_sp' + (i + 1); }\nfunction OM_lineLabel(sv, i) {\n  var arr = OM_loadLines(sv);\n  if (i >= arr.length) return '（空位 ' + (i + 1) + '）';\n  var sp = ''; try { sp = OM_g(sv.get(OM_speedKey(i))); } catch (e) { }\n  var mark = sp.indexOf('⚡') === 0 ? '⚡' : '';\n  return (mark ? '⚡ ' : '') + arr[i].n + ' ' + (sp || '未测速');\n}\n// 站点的书详情相对 URL 列表规则公共选择器\nvar OM_LIST = 'ul.BIaC_ACJijja > li';\n", "lastUpdateTime": "1793883835574", "loginCheckJs": "(function(){try{var b='';try{b=String(result&&result.body?result.body():result);}catch(e){b=String(result||'');}if(b.length<8000&&(b.indexOf('系统安全验证')>=0||b.indexOf('verify_check')>=0)){OM_toast(java,'⏳ 站点要求安全验证，正在自动过盾…');var ok=OM_pass(java,OM_line(source),'search');OM_toast(java,ok?'✅ 过盾成功，请重试刚才的操作':'⚠ 过盾未成功，可在书源登录面板切换线路');}}catch(err){}return result;})()", "loginUi": "[{\"key\": \"om_pub\", \"type\": \"text\", \"name\": \"发布页网址\", \"hint\": \"默认 https://fb.omoo.tv/ ，可改成镜像发布页\", \"defaultValue\": \"https://fb.omoo.tv/\"}, {\"key\": \"om_status\", \"type\": \"text\", \"name\": \"当前状态\", \"viewName\": \"OM_status(source)\", \"hint\": \"当前线路 / 发布页 / 线路数\"}, {\"key\": \"om_btn_get\", \"type\": \"button\", \"name\": \"🔄 一键从发布页获取网址路线\", \"action\": \"OM_actGetLines(java,source)\"}, {\"key\": \"om_btn_speed\", \"type\": \"button\", \"name\": \"⚡ 测试延时（测得 ms 写入各线路按钮）\", \"action\": \"OM_actSpeed(java,source)\"}, {\"key\": \"om_btn_line1\", \"type\": \"button\", \"name\": \"线路 1\", \"viewName\": \"OM_lineLabel(source,0)\", \"action\": \"OM_actSetLine(java,source,0)\"}, {\"key\": \"om_btn_line2\", \"type\": \"button\", \"name\": \"线路 2\", \"viewName\": \"OM_lineLabel(source,1)\", \"action\": \"OM_actSetLine(java,source,1)\"}, {\"key\": \"om_btn_line3\", \"type\": \"button\", \"name\": \"线路 3\", \"viewName\": \"OM_lineLabel(source,2)\", \"action\": \"OM_actSetLine(java,source,2)\"}, {\"key\": \"om_btn_line4\", \"type\": \"button\", \"name\": \"线路 4\", \"viewName\": \"OM_lineLabel(source,3)\", \"action\": \"OM_actSetLine(java,source,3)\"}, {\"key\": \"om_btn_line5\", \"type\": \"button\", \"name\": \"线路 5\", \"viewName\": \"OM_lineLabel(source,4)\", \"action\": \"OM_actSetLine(java,source,4)\"}, {\"key\": \"om_btn_line6\", \"type\": \"button\", \"name\": \"线路 6\", \"viewName\": \"OM_lineLabel(source,5)\", \"action\": \"OM_actSetLine(java,source,5)\"}, {\"key\": \"om_btn_line7\", \"type\": \"button\", \"name\": \"线路 7\", \"viewName\": \"OM_lineLabel(source,6)\", \"action\": \"OM_actSetLine(java,source,6)\"}, {\"key\": \"om_btn_line8\", \"type\": \"button\", \"name\": \"线路 8\", \"viewName\": \"OM_lineLabel(source,7)\", \"action\": \"OM_actSetLine(java,source,7)\"}, {\"key\": \"om_btn_check\", \"type\": \"button\", \"name\": \"✅ 检查登录状态（免登录/过盾状态）\", \"action\": \"OM_actCheck(java,source)\"}]", "loginUrl": "<js>\n\n// ============ 登录面板（线路运维 + 检查登录状态） ============\n// 本面板仅做线路管理，站点本身无需登录即可搜索/观看。\n// login() 必须存在，否则点右上角 √ 会抛 Function login not implements。\nfunction login() { }\n\n// 当前状态概览（viewName 动态文本）\nfunction OM_status(sv) {\n  var arr = OM_loadLines(sv);\n  var cur = OM_line(sv), pub = OM_pub(sv);\n  var idx = -1;\n  for (var i = 0; i < arr.length; i++) if (arr[i].u === cur) idx = i;\n  return '当前线路：' + cur.replace(/^https?:\\/\\//, '')\n    + (idx >= 0 ? '（第' + (idx + 1) + '条）' : '（自定义）')\n    + ' ｜ 发布页：' + pub.replace(/^https?:\\/\\//, '')\n    + ' ｜ 共 ' + arr.length + ' 条线路';\n}\n\n// 按钮 1：一键从发布页获取网址路线\nfunction OM_actGetLines(jv, sv) {\n  OM_toast(jv, '⏳ 正在读取发布页，请稍候…');\n  var res = OM_fetchLines(jv, OM_pub(sv));\n  if (res.err) { OM_toast(jv, '❌ 获取线路失败：' + res.err); return; }\n  var n = OM_saveLines(sv, res.lines);\n  for (var i = 0; i < 8; i++) { try { sv.put(OM_speedKey(i), ''); } catch (e) { } }\n  OM_toast(jv, '✅ 已从发布页获取 ' + n + ' 条线路，默认切到第 1 条；请点「测试延时」测速');\n  try { jv.reLoginView(); } catch (e2) { }\n}\n\n// 按钮 2：测试延时（并发 ajaxAll，结果写回各线路按钮）\nfunction OM_actSpeed(jv, sv) {\n  var arr = OM_loadLines(sv);\n  if (!arr.length) { OM_toast(jv, '⚠ 线路池为空，请先点「一键从发布页获取网址路线」'); return; }\n  OM_toast(jv, '⏳ 正在并发测速 ' + arr.length + ' 条线路，请稍候…');\n  var urls = [];\n  for (var i = 0; i < arr.length; i++) urls.push(arr[i].u + '/');\n  var results = null;\n  try {\n    // 双参 ajaxAll(urls,true) 两版通吃；单参重载兜底\n    try { results = jv.ajaxAll(urls, true); } catch (e0) { results = jv.ajaxAll(urls); }\n  } catch (e1) { results = null; }\n  var out = [];\n  for (var k = 0; k < arr.length; k++) {\n    var ms = -1, ok = false;\n    if (results && results.length > k) {\n      var one = results[k];\n      try {\n        var b = String(one.body ? one.body() : one);\n        var raw = one && one.raw && typeof one.raw === 'function' ? one.raw() : null;\n        var code = 0; try { code = raw ? raw.code() : 0; } catch (ex) { }\n        ms = -1;\n        ok = (code >= 200 && code < 400 || code === 0) && b.length > 20000\n          && !(b.length < 3000 && /Exception|Error/.test(b));\n      } catch (e2) { }\n    }\n    if (ms < 0 || !ok) { var p = OM_probeOne(jv, arr[k].u); ms = p.ms; ok = p.ok; }\n    out.push({ u: arr[k].u, ms: ms, ok: ok });\n  }\n  var best = -1, bestMs = 1e12;\n  for (var q = 0; q < out.length; q++) {\n    var txt = out[q].ok ? (out[q].ms + 'ms') : '超时/异常';\n    if (out[q].ok && out[q].ms < bestMs) { bestMs = out[q].ms; best = q; }\n    try { sv.put(OM_speedKey(q), txt); } catch (e3) { }\n  }\n  if (best >= 0) {\n    try { sv.put(OM_speedKey(best), '⚡' + bestMs + 'ms'); } catch (e4) { }\n    try { sv.put('om_line', out[best].u); } catch (e5) { }\n    OM_toast(jv, '✅ 测速完成！最快 ' + arr[best].n + ' ' + bestMs + 'ms，已自动切换；延时已写入各线路按钮');\n  } else {\n    OM_toast(jv, '⚠ 测速完成但无可用线路，请检查网络或点「一键从发布页获取网址路线」更新');\n  }\n  try { jv.reLoginView(); } catch (e6) { OM_toast(jv, 'ℹ 若按钮文字未刷新，请关闭后重新打开本面板'); }\n}\n\n// 线路切换按钮（各网站一个）\nfunction OM_actSetLine(jv, sv, idx) {\n  var arr = OM_loadLines(sv);\n  if (idx >= arr.length) { OM_toast(jv, '⚠ 该线路位为空，请先获取线路'); return; }\n  OM_toast(jv, '⏳ 正在切换到 ' + arr[idx].n + ' …');\n  try { sv.put('om_line', arr[idx].u); } catch (e) { }\n  var p = OM_probeOne(jv, arr[idx].u);\n  if (p.ok) OM_toast(jv, '✅ 已切换到 ' + arr[idx].n + '（' + p.ms + 'ms），线路可用');\n  else OM_toast(jv, '⚠ 已切换到 ' + arr[idx].n + '，但探活未通过（' + p.ms + 'ms）；可再点测速或换其他线路');\n  try { jv.reLoginView(); } catch (e2) { }\n}\n\n// 按钮：检查登录状态（站点免登录，这里检查过盾 Cookie 与线路可用性）\nfunction OM_actCheck(jv, sv) {\n  OM_toast(jv, '⏳ 正在检查线路与过盾状态…');\n  var line = OM_line(sv);\n  var h = '';\n  try { h = String(jv.ajax(line + '/')); } catch (e) { }\n  var blocked = h.indexOf('系统安全验证') >= 0 || h.indexOf('verify_check') >= 0;\n  if (blocked) {\n    OM_toast(jv, '⚠ 检测到安全验证页，正在自动过盾…');\n    var ok = OM_pass(jv, line, 'search');\n    OM_toast(jv, ok ? '✅ 过盾成功，Cookie 已刷新，可正常搜索/观看' : '❌ 过盾失败，请切换线路后重试');\n  } else if (h.length > 20000) {\n    OM_toast(jv, '✅ 状态正常：免登录，线路 ' + line.replace(/^https?:\\/\\//, '') + ' 可用，无验证拦截');\n  } else {\n    OM_toast(jv, '⚠ 线路响应异常（' + h.length + ' 字节），建议点「测试延时」或换线路');\n  }\n  try { jv.reLoginView(); } catch (e2) { }\n}\n\n</js>", "respondTime": 180000, "ruleBookInfo": {"author": "$.a", "coverUrl": "$.c", "init": "@js:\n(function(){\n  var h=String(result||'');\n  var J=Packages.org.jsoup.Jsoup, d=J.parse(h);\n  function tx(sel){ var e=d.select(sel).first(); return e?String(e.text()).trim():''; }\n  var name=tx('h1.title');\n  var pic=''; var im=d.select('a.pic img').first();\n  if(im) pic=String(im.attr('data-original')||im.attr('src')||'').trim();\n  if(pic && pic.indexOf('http')!==0 && pic.indexOf('//')!==0) pic='https://as.cfhls.top/'+pic.replace(/^\\/+/,'');\n  if(pic.indexOf('//')===0) pic='https:'+pic;\n  var meta=tx('p.data.hidden-xs');\n  var status=''; var ps=d.select('p.data');\n  for(var i=0;i<ps.size();i++){var t=String(ps.get(i).text());if(t.indexOf('状态')===0){status=t.replace(/^状态[：:]\\s*/,'');break;}}\n  var intro=tx('.detail-content')||tx('.detail-sketch');\n  var o={\n    a:'OmoFun', c:pic, k:meta.replace(/^类型[：:]\\s*/,'').replace(/\\s*\\/\\s*/g,'·'),\n    w:status, t:status, i:intro, n:name, tocUrl:String(baseUrl||'')\n  };\n  return JSON.stringify(o);\n})()\n", "intro": "$.i", "kind": "$.k", "lastChapter": "$.t", "name": "$.n", "tocUrl": "$.tocUrl", "wordCount": "$.w"}, "ruleContent": {"content": "@js:\n(function(){\n  // Legado 已把播放页 HTML 放进 result，直接用（避免重复请求触发风控）\n  var page=String(result||'');\n  if(page.length<3000 && (page.indexOf('系统安全验证')>=0||page.indexOf('verify_check')>=0)){\n    try{ OM_pass(java,OM_line(source),'search'); page=String(java.ajax(String(baseUrl||''))); }catch(e1){ }\n  }\n  // player_aaaa 是含嵌套 vod_data 的内联 JSON，贪婪正则会提前截断 → 括号配平提取\n  var i=page.indexOf('var player_aaaa=');\n  if(i<0) return '⚠ 未找到播放数据（页面结构可能已变更，或该集已下架）';\n  var st=page.indexOf('{',i), dep=0, end=-1, inStr=false, q='';\n  if(st<0) return '⚠ 播放数据起始符缺失';\n  for(var k=st;k<page.length;k++){\n    var c=page.charAt(k);\n    if(inStr){ if(c==='\\\\'){k++;continue;} if(c===q)inStr=false; continue; }\n    if(c==='\"'||c===\"'\"){ inStr=true; q=c; continue; }\n    if(c==='{')dep++; else if(c==='}'){ dep--; if(dep===0){ end=k+1; break; } }\n  }\n  if(end<0) return '⚠ 播放数据括号不配平';\n  var pd=null;\n  try{ pd=JSON.parse(page.slice(st,end)); }catch(e2){ return '⚠ 播放数据解析失败：'+e2; }\n  var rawUrl=String(pd.url||'');\n  if(String(pd.encrypt)==='1'){ try{ rawUrl=unescape(rawUrl); }catch(e3){ } }\n  else if(String(pd.encrypt)==='2'){ try{ rawUrl=String(java.base64Decode(rawUrl)); }catch(e4){ } }\n  if(!rawUrl) return '⚠ 该集暂无播放地址';\n  // 构造第三方播放器页参数（与 /static/player/mp4.js 一致）\n  var dmid='';\n  try{ var dm=/\"dmid\"\\s*:\\s*\"?(\\d+)\"?/.exec(page); if(dm)dmid=dm[1]; }catch(e5){ }\n  if(!dmid)dmid=String(pd.id||'');\n  var pic=String(pd.vod_data&&pd.vod_data.vod_pic||'');\n  var picHost=pic.indexOf('http')===0?'':'https://as.cfhls.top/';\n  var line=OM_line(source);\n  var qs=[\n    'url='+encodeURIComponent(rawUrl),\n    'dmid='+encodeURIComponent(dmid),\n    'next='+encodeURIComponent(String(pd.link_next||'')),\n    'name='+encodeURIComponent(String(pd.vod_data&&pd.vod_data.vod_name||'')),\n    'sid='+encodeURIComponent(String(pd.sid||'1')),\n    'nid='+encodeURIComponent(String(pd.nid||'1')),\n    'ph='+encodeURIComponent(picHost),\n    'h='+encodeURIComponent(line),\n    'pic='+encodeURIComponent(pic)\n  ];\n  var purl=OM_PLAYER+qs.join('&');\n  // 第三方播放器高峰期偶发返回极短空页（曾见 16 字节 <!DOCTYPE html>）\n  // → 3 次重试，每次换 ts 破缓存；仍失败给可读提示\n  var playerHtml='', mm=null;\n  for(var retry=0;retry<3;retry++){\n    var tryUrl=purl+(retry?'&_r='+Date.now()+'_'+retry:'');\n    try{ playerHtml=String(java.ajax(tryUrl)); }catch(e6){ playerHtml=''; }\n    mm=/playData\\('([^']+)','([^']+)'\\)/.exec(playerHtml);\n    if(mm) break;\n    try{ Packages.java.lang.Thread.sleep(400); }catch(eSleep){ }\n  }\n  if(!mm) return '⚠ 播放器解析繁忙（已重试 3 次），请稍后重试或在登录面板切换线路';\n  var cipher=mm[1], ivHex=mm[2];\n  try{\n    var keyBytes=java.strToBytes(OM_AESKEY);\n    var ivBytes=java.hexDecodeToByteArray(ivHex);\n    var c=java.createSymmetricCrypto('AES/CBC/PKCS7Padding',keyBytes,ivBytes);\n    var u=String(c.decryptStr(cipher)).trim();\n    // 站方偶发把协议头写成 org.h:// 之类的伪装，统一还原\n    if(u.indexOf('org.h://')===0) u='https://'+u.slice(8);\n    if(u.indexOf('http')!==0) return '⚠ 解析出的地址异常：'+u.slice(0,120);\n    return u;\n  }catch(e7){ return '⚠ 播放地址解密失败：'+e7; }\n})()\n"}, "ruleExplore": {"bookList": "@js:\n(function(){\n  var h=String(result||'');\n  if(h.length<100)return [];\n  var J=Packages.org.jsoup.Jsoup,d=J.parse(h);\n  var as=d.select('a[href*=/anime/]');\n  var out=[],seen={};\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);\n    var u=String(a.attr('href')||'');\n    var pic=String(a.attr('data-original')||'');\n    var n=String(a.attr('title')||'').trim();\n    if(!u||!pic||!n||seen[u])continue;\n    seen[u]=1;\n    var kind='',last='';\n    var li=a.closest('li');\n    if(li){var bs=li.select('span b');if(bs.size()>=2){kind=String(bs.get(0).text());last=String(bs.get(bs.size()-1).text());}}\n    out.push(JSON.stringify({name:n,bookUrl:u,coverUrl:pic,kind:kind,lastChapter:last}));\n  }\n  // ★E 版 getElements 是 `result as List<Any>`（无 NativeArray 分支），\n  //   返回 Rhino 原生数组会 ClassCastException → TocEmptyException/列表空。\n  //   必须返回 Java java.util.ArrayList，两版通吃。\n  var list=new Packages.java.util.ArrayList();\n  for(var j=0;j<out.length;j++) list.add(out[j]);\n  return list;\n})()\n", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name"}, "ruleSearch": {"bookList": "@js:\n(function(){\n  var h=String(result||'');\n  if(h.length<100)return [];\n  var J=Packages.org.jsoup.Jsoup,d=J.parse(h);\n  var as=d.select('a[href*=/anime/]');\n  var out=[],seen={};\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);\n    var u=String(a.attr('href')||'');\n    var pic=String(a.attr('data-original')||'');\n    var n=String(a.attr('title')||'').trim();\n    if(!u||!pic||!n||seen[u])continue;\n    seen[u]=1;\n    var kind='',last='';\n    var li=a.closest('li');\n    if(li){var bs=li.select('span b');if(bs.size()>=2){kind=String(bs.get(0).text());last=String(bs.get(bs.size()-1).text());}}\n    out.push(JSON.stringify({name:n,bookUrl:u,coverUrl:pic,kind:kind,lastChapter:last}));\n  }\n  // ★E 版 getElements 是 `result as List<Any>`（无 NativeArray 分支），\n  //   返回 Rhino 原生数组会 ClassCastException → TocEmptyException/列表空。\n  //   必须返回 Java java.util.ArrayList，两版通吃。\n  var list=new Packages.java.util.ArrayList();\n  for(var j=0;j<out.length;j++) list.add(out[j]);\n  return list;\n})()\n", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name"}, "ruleToc": {"chapterList": "@js:\n(function(){\n  var h=String(result||'');\n  var J=Packages.org.jsoup.Jsoup, d=J.parse(h);\n  var panes=d.select('div[id^=playlist]');\n  var out=[], seen={};\n  // E 版 getElements 只认 Java List，末尾统一转 ArrayList\n  // 只取第一条播放线路（精品），避免 4 条线路重复 800+ 集\n  if(panes.size()>0){\n    var as=panes.get(0).select('ul.play-list-content li.play-list-content-item a');\n    for(var i=0;i<as.size();i++){\n      var a=as.get(i), u=String(a.attr('href')||''), n=String(a.attr('title')||a.text()||'').trim();\n      if(!u||seen[u])continue; seen[u]=1;\n      if(u.indexOf('/play/')<0)continue;\n      out.push(JSON.stringify({n:n||('第'+(out.length+1)+'集'),u:u}));\n    }\n  }\n  if(out.length===0){\n    // 兜底：详情页「立即播放」按钮\n    var pb=d.select('a.play-btn, .play-btn a').first();\n    var u2=pb?String(pb.attr('href')||''):'';\n    if(u2.indexOf('/play/')>=0) out.push(JSON.stringify({n:'▶ 播放',u:u2}));\n  }\n  var list=new Packages.java.util.ArrayList();\n  for(var j=0;j<out.length;j++) list.add(out[j]);\n  return list;\n})()\n", "chapterName": "$.n", "chapterUrl": "$.u"}, "searchUrl": "@js:(function(){var line=OM_line(source);var now=Date.now(),last=0;try{last=parseInt(OM_g(source.get('om_search_last')),10)||0;}catch(e){}var wait=3000-(now-last);if(wait>0&&wait<=3000){try{java.log('[OmoFun] 搜索节流 '+wait+'ms');}catch(e2){}try{Packages.java.lang.Thread.sleep(wait);}catch(e4){}}try{source.put('om_search_last',String(Date.now()));}catch(e3){}return line+'/search/'+java.encodeURI(String(key))+'-------------.html';})()", "weight": 0},{"bookSourceComment": "wap.22k.org 极简备版：GET 绝对地址，不用任何 JS 求值；enabledCookieJar=false 让App不保存 ss_search_delay 限流Cookie；不写死任何 Cookie 头。主版不行时试这个。", "bookSourceGroup": "自制", "bookSourceName": "22k小说(简版)", "bookSourceType": 0, "bookSourceUrl": "https://wap.22k.org/", "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "exploreUrl": "[{\"title\":\"玄幻奇幻\",\"url\":\"/lei/1/1/\"},{\"title\":\"武侠修真\",\"url\":\"/lei/2/1/\"},{\"title\":\"都市言情\",\"url\":\"/lei/3/1/\"},{\"title\":\"历史军事\",\"url\":\"/lei/4/1/\"},{\"title\":\"游戏竞技\",\"url\":\"/lei/5/1/\"},{\"title\":\"恐怖灵异\",\"url\":\"/lei/6/1/\"},{\"title\":\"科幻灵异\",\"url\":\"/lei/7/1/\"},{\"title\":\"其他类型\",\"url\":\"/lei/8/1/\"},{\"title\":\"科幻魔幻(漫)\",\"url\":\"/lei/9/1/\"},{\"title\":\"少年热血(漫)\",\"url\":\"/lei/10/1/\"},{\"title\":\"都市爱情(漫)\",\"url\":\"/lei/11/1/\"},{\"title\":\"武侠格斗(漫)\",\"url\":\"/lei/12/1/\"},{\"title\":\"全本\",\"url\":\"/quanben/lei/\"},{\"title\":\"排行榜\",\"url\":\"/top.html\"}]", "lastUpdateTime": "1793883853037", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=\"og:novel:author\"]@content||meta[property=\"og:comic:author\"]@content||.novel_info_title i a@text", "coverUrl": ".novel_info_main img@src##^http:##https:", "intro": "meta[property=\"og:description\"]@content##^[^《]*《[^》]*》\\s*||#info .intro@text", "kind": "meta[property=\"og:novel:category\"]@content||meta[property=\"og:comic:category\"]@content", "lastChapter": "meta[property=\"og:novel:lastest_chapter_name\"]@content||meta[property=\"og:comic:lastest_chapter_name\"]@content||.novel_info_title .flex.to100 a@text", "name": "meta[property=\"og:novel:book_name\"]@content||meta[property=\"og:comic:book_name\"]@content||h1@text"}, "ruleContent": {"content": "div.novel-start-text@html||#contents@html||article.content@html", "nextContentUrl": "#next_url@href##^(?!.*_\\d+\\.html).*$", "title": "p.style_h1@text##（[^）]*）||h1@text##（[^）]*）"}, "ruleExplore": {"author": ".li_bottom a@text##^\\s+||.rank-author@text||p@text##\\s*\\d+\\s*万字.*$", "bookList": "ul.flex>li||ul.rank-list li||li.searchresult", "bookUrl": ".img_span a@href||a@href", "coverUrl": "img@data-original##^http:##https:||img@src", "intro": "p.indent@text||p.searchresult_p@text", "kind": ".img_span span@text##\\s*/.*$", "name": "h2@text||h3@text||a@text"}, "ruleSearch": {"author": "p@text##^\\s+|\\s*\\d+\\s*万字.*$", "bookList": "li.searchresult", "bookUrl": ".img_span a@href||a@href", "coverUrl": "img@data-original##^http:##https:||img@src", "intro": "p.searchresult_p@text", "kind": ".img_span span@text##\\s*/.*$", "lastChapter": "p.2 a@text", "name": "h3@text||span.hot@text"}, "ruleToc": {"chapterList": "#catalog #ul_all_chapters li", "chapterName": "a@text||a@title", "chapterUrl": "a@href"}, "searchUrl": "https://wap.22k.org/search/?searchkey={{key}}&searchtype=all", "weight": 0, "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 12; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Mobile Safari/537.36\",\"Referer\":\"https://wap.22k.org/\"}"},{"bookSourceComment": "wap.22k.org 书源（按笔仙阁可用结构重写）：搜索地址用根相对路径 /search/，POST 由阅读App自动带 Content-Type；请求头留空；发现地址全部以 / 开头。搜索关键词需≥2个字符。", "bookSourceGroup": "自制", "bookSourceName": "22k小说", "bookSourceType": 0, "bookSourceUrl": "https://wap.22k.org/", "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "exploreUrl": "[{\"title\":\"玄幻奇幻\",\"url\":\"/lei/1/1/\"},{\"title\":\"武侠修真\",\"url\":\"/lei/2/1/\"},{\"title\":\"都市言情\",\"url\":\"/lei/3/1/\"},{\"title\":\"历史军事\",\"url\":\"/lei/4/1/\"},{\"title\":\"游戏竞技\",\"url\":\"/lei/5/1/\"},{\"title\":\"恐怖灵异\",\"url\":\"/lei/6/1/\"},{\"title\":\"科幻灵异\",\"url\":\"/lei/7/1/\"},{\"title\":\"其他类型\",\"url\":\"/lei/8/1/\"},{\"title\":\"科幻魔幻(漫)\",\"url\":\"/lei/9/1/\"},{\"title\":\"少年热血(漫)\",\"url\":\"/lei/10/1/\"},{\"title\":\"都市爱情(漫)\",\"url\":\"/lei/11/1/\"},{\"title\":\"武侠格斗(漫)\",\"url\":\"/lei/12/1/\"},{\"title\":\"全本\",\"url\":\"/quanben/lei/\"},{\"title\":\"排行榜\",\"url\":\"/top.html\"}]", "lastUpdateTime": "1793881713653", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=\"og:novel:author\"]@content||meta[property=\"og:comic:author\"]@content||.novel_info_title i a@text", "coverUrl": ".novel_info_main img@src##^http:##https:", "intro": "meta[property=\"og:description\"]@content##^[^《]*《[^》]*》\\s*||#info .intro@text", "kind": "meta[property=\"og:novel:category\"]@content||meta[property=\"og:comic:category\"]@content", "lastChapter": "meta[property=\"og:novel:lastest_chapter_name\"]@content||meta[property=\"og:comic:lastest_chapter_name\"]@content||.novel_info_title .flex.to100 a@text", "name": "meta[property=\"og:novel:book_name\"]@content||meta[property=\"og:comic:book_name\"]@content||h1@text"}, "ruleContent": {"content": "div.novel-start-text@html||#contents@html||article.content@html", "nextContentUrl": "#next_url@href##^(?!.*_\\d+\\.html).*$", "title": "p.style_h1@text##（[^）]*）||h1@text##（[^）]*）"}, "ruleExplore": {"author": ".li_bottom a@text##^\\s+||.rank-author@text||p@text##\\s*\\d+\\s*万字.*$", "bookList": "ul.flex>li||ul.rank-list li||li.searchresult", "bookUrl": ".img_span a@href||a@href", "coverUrl": "img@data-original##^http:##https:||img@src", "intro": "p.indent@text||p.searchresult_p@text", "kind": ".img_span span@text##\\s*/.*$", "name": "h2@text||h3@text||a@text"}, "ruleSearch": {"author": "p@text##^\\s+|\\s*\\d+\\s*万字.*$", "bookList": "li.searchresult", "bookUrl": ".img_span a@href||a@href", "coverUrl": "img@data-original##^http:##https:||img@src", "intro": "p.searchresult_p@text", "kind": ".img_span span@text##\\s*/.*$", "lastChapter": "p.2 a@text", "name": "h3@text||span.hot@text"}, "ruleToc": {"chapterList": "#catalog #ul_all_chapters li", "chapterName": "a@text||a@title", "chapterUrl": "a@href"}, "searchUrl": "/search/,{\"body\":\"searchkey={{key}}&searchtype=all\",\"charset\":\"UTF-8\",\"method\":\"POST\"}", "weight": 0},{"bookSourceComment": "wap.22k.org 书源。搜索用 POST 表单（必须带 Content-Type，否则站点返回 0 条）；checkKeyWord 指定站内有的书名，避免阅读 App 校验时用短关键词触发「关键字最少 2 个字符」而误判搜索失效。", "bookSourceGroup": "自制", "bookSourceName": "22k小说", "bookSourceType": 0, "bookSourceUrl": "https://wap.22k.org/", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\":\"玄幻奇幻\",\"url\":\"lei/1/1/\"},{\"title\":\"武侠修真\",\"url\":\"lei/2/1/\"},{\"title\":\"都市言情\",\"url\":\"lei/3/1/\"},{\"title\":\"历史军事\",\"url\":\"lei/4/1/\"},{\"title\":\"游戏竞技\",\"url\":\"lei/5/1/\"},{\"title\":\"恐怖灵异\",\"url\":\"lei/6/1/\"},{\"title\":\"科幻灵异\",\"url\":\"lei/7/1/\"},{\"title\":\"其他类型\",\"url\":\"lei/8/1/\"},{\"title\":\"科幻魔幻(漫)\",\"url\":\"lei/9/1/\"},{\"title\":\"少年热血(漫)\",\"url\":\"lei/10/1/\"},{\"title\":\"都市爱情(漫)\",\"url\":\"lei/11/1/\"},{\"title\":\"武侠格斗(漫)\",\"url\":\"lei/12/1/\"},{\"title\":\"全本\",\"url\":\"quanben/lei/\"},{\"title\":\"排行榜\",\"url\":\"top.html\"}]", "header": "{\"User-Agent\":\"Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1\",\"Referer\":\"https://wap.22k.org/\"}", "lastUpdateTime": "1793880871764", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=\"og:novel:author\"]@content||meta[property=\"og:comic:author\"]@content||.novel_info_title i a@text", "coverUrl": ".novel_info_main img@src##^http:##https:", "intro": "meta[property=\"og:description\"]@content##^[^《]*《[^》]*》\\s*||#info .intro@text", "kind": "meta[property=\"og:novel:category\"]@content||meta[property=\"og:comic:category\"]@content", "lastChapter": "meta[property=\"og:novel:lastest_chapter_name\"]@content||meta[property=\"og:comic:lastest_chapter_name\"]@content||.novel_info_title .flex.to100 a@text", "name": "meta[property=\"og:novel:book_name\"]@content||meta[property=\"og:comic:book_name\"]@content||h1@text"}, "ruleContent": {"content": "div.novel-start-text@html||#contents@html||article.content@html", "nextContentUrl": "#next_url@href##^(?!.*_\\d+\\.html).*$", "title": "p.style_h1@text##（[^）]*）||h1@text##（[^）]*）"}, "ruleExplore": {"author": ".li_bottom a@text##^\\s+||.rank-author@text||p@text##\\s*\\d+\\s*万字.*$", "bookList": "ul.flex>li||ul.rank-list li||li.searchresult", "bookUrl": ".img_span a@href||a@href", "coverUrl": "img@data-original##^http:##https:||img@src", "intro": "p.indent@text||p.searchresult_p@text", "kind": ".img_span span@text##\\s*/.*$", "name": "h2@text||h3@text||a@text"}, "ruleSearch": {"author": "p@text##^\\s+|\\s*\\d+\\s*万字.*$", "bookList": "li.searchresult", "bookUrl": ".img_span a@href||a@href", "coverUrl": "img@data-original##^http:##https:||img@src", "intro": "p.searchresult_p@text", "kind": ".img_span span@text##\\s*/.*$", "lastChapter": "p.2 a@text", "name": "h3@text||span.hot@text", "checkKeyWord": "赤心巡天"}, "ruleToc": {"chapterList": "#catalog #ul_all_chapters li", "chapterName": "a@text||a@title", "chapterUrl": "a@href"}, "searchUrl": "search/,{\"body\":\"searchkey={{key}}&searchtype=all\",\"charset\":\"utf-8\",\"method\":\"POST\",\"headers\":{\"Content-Type\":\"application/x-www-form-urlencoded; charset=UTF-8\",\"Referer\":\"https://wap.22k.org/\"}}", "weight": 0},{"bookSourceComment": "wap.22k.org 备选书源：搜索改用 POST 表单方式（必须带 Content-Type）。与标准版二选一导入，不要同时启用。", "bookSourceGroup": "自制", "bookSourceName": "22k小说(POST备选)", "bookSourceType": 0, "bookSourceUrl": "https://wap.22k.org", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\":\"玄幻奇幻\",\"url\":\"/lei/1/1/\"},{\"title\":\"武侠修真\",\"url\":\"/lei/2/1/\"},{\"title\":\"都市言情\",\"url\":\"/lei/3/1/\"},{\"title\":\"历史军事\",\"url\":\"/lei/4/1/\"},{\"title\":\"游戏竞技\",\"url\":\"/lei/5/1/\"},{\"title\":\"恐怖灵异\",\"url\":\"/lei/6/1/\"},{\"title\":\"科幻灵异\",\"url\":\"/lei/7/1/\"},{\"title\":\"其他类型\",\"url\":\"/lei/8/1/\"},{\"title\":\"科幻魔幻(漫)\",\"url\":\"/lei/9/1/\"},{\"title\":\"少年热血(漫)\",\"url\":\"/lei/10/1/\"},{\"title\":\"都市爱情(漫)\",\"url\":\"/lei/11/1/\"},{\"title\":\"武侠格斗(漫)\",\"url\":\"/lei/12/1/\"},{\"title\":\"全本\",\"url\":\"/quanben/lei/\"},{\"title\":\"排行榜\",\"url\":\"/top.html\"}]", "header": "{\"User-Agent\":\"Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1\",\"Referer\":\"https://wap.22k.org/\"}", "lastUpdateTime": "1793880479927", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=\"og:novel:author\"]@content||meta[property=\"og:comic:author\"]@content||.novel_info_title i a@text", "coverUrl": ".novel_info_main img@src##^http:##https:", "intro": "meta[property=\"og:description\"]@content##^[^《]*《[^》]*》\\s*||#info .intro@text", "kind": "meta[property=\"og:novel:category\"]@content||meta[property=\"og:comic:category\"]@content", "lastChapter": "meta[property=\"og:novel:lastest_chapter_name\"]@content||meta[property=\"og:comic:lastest_chapter_name\"]@content||.novel_info_title .flex.to100 a@text", "name": "meta[property=\"og:novel:book_name\"]@content||meta[property=\"og:comic:book_name\"]@content||h1@text"}, "ruleContent": {"content": "div.novel-start-text@html||#contents@html||article.content@html", "nextContentUrl": "#next_url@href##^(?!.*_\\d+\\.html).*$", "title": "p.style_h1@text##（[^）]*）||h1@text##（[^）]*）"}, "ruleExplore": {"author": ".li_bottom a@text##^\\s+||.rank-author@text||p@text##\\s*\\d+\\s*万字.*$", "bookList": "ul.flex>li||ul.rank-list li||li.searchresult", "bookUrl": ".img_span a@href||a@href", "coverUrl": "img@data-original##^http:##https:||img@src", "intro": "p.indent@text||p.searchresult_p@text", "kind": ".img_span span@text##\\s*/.*$", "name": "h2@text||h3@text||a@text"}, "ruleSearch": {"author": "p@text##^\\s+|\\s*\\d+\\s*万字.*$", "bookList": "li.searchresult", "bookUrl": ".img_span a@href||a@href", "coverUrl": "img@data-original##^http:##https:||img@src", "intro": "p.searchresult_p@text", "kind": ".img_span span@text##\\s*/.*$", "lastChapter": "p.2 a@text", "name": "h3@text||span.hot@text"}, "ruleToc": {"chapterList": "#catalog #ul_all_chapters li", "chapterName": "a@text||a@title", "chapterUrl": "a@href"}, "searchUrl": "/search/,{\"method\": \"POST\", \"body\": \"searchkey={{key}}&searchtype=all\", \"headers\": {\"Content-Type\": \"application/x-www-form-urlencoded; charset=UTF-8\", \"Referer\": \"https://wap.22k.org/\"}}", "weight": 0},{"bookSourceComment": "作者：姚浅书", "bookSourceGroup": "自制", "bookSourceName": "978小说", "bookSourceType": 0, "bookSourceUrl": "https://www.978xs.com", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\":\"玄幻\",\"url\":\"/leimu/1/\"},{\"title\":\"武侠\",\"url\":\"/leimu/2/\"},{\"title\":\"都市\",\"url\":\"/leimu/3/\"},{\"title\":\"历史\",\"url\":\"/leimu/4/\"},{\"title\":\"网游\",\"url\":\"/leimu/5/\"},{\"title\":\"科幻\",\"url\":\"/leimu/6/\"},{\"title\":\"言情\",\"url\":\"/leimu/7/\"},{\"title\":\"其他\",\"url\":\"/leimu/8/\"},{\"title\":\"全本\",\"url\":\"/quanben/\"}]", "header": "{\"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\", \"Referer\": \"https://www.978xs.com/\"}", "lastUpdateTime": "1793864725972", "respondTime": 180000, "ruleBookInfo": {"author": "address.author@text##作者:|\\s||meta[property=\"og:novel:author\"]@content", "coverUrl": "meta[property=\"og:image\"]@content", "intro": "meta[property=\"og:description\"]@content", "kind": "meta[property=\"og:novel:category\"]@content", "lastChapter": "meta[property=\"og:novel:latest_chapter_name\"]@content", "name": "h1@text||meta[property=\"og:novel:book_name\"]@content"}, "ruleContent": {"content": "#content@html||#nr1@html||.content@html"}, "ruleExplore": {"author": ".author@text||.s4@text##作者：|\\s||em@text##作者：", "bookList": "div.bookbox||li:has(.s4)||.hot_sale||.list .ft||div.cont", "bookUrl": "h4 a@href||.bookname a@href||a@href||h5 a@href", "coverUrl": ".cover img@src||img@src||a.img img@src", "intro": ".intro@text||.review@text||p@text", "name": "h4 a@text||.bookname a@text||.title@text||h5 a@text"}, "ruleSearch": {"author": "$.author", "bookList": "$.data.search[*]||$.data.search", "bookUrl": "$.book_list_url##^(?!http)##https://www.978xs.com", "coverUrl": "$.cover##^(?!http)##https://www.978xs.com", "kind": "$.cate_name", "lastChapter": "$.latest_chapter_name", "name": "$.book_name||$.title"}, "ruleToc": {"chapterList": ":href=\"(/\\d+/\\d+\\.html)\"[^>]*>([^<]+)", "chapterName": "$2", "chapterUrl": "$1"}, "searchUrl": "@js:var k=java.encodeURI(key);var reqUrl='https://www.978xs.com/user/search.html?q='+k;var h=String(java.ajax(reqUrl));var p='q='+k;var r=/var\\s+(\\w+)\\s*=\\s*[\"']([^\"']*)[\"']/g;var m;while((m=r.exec(h))!==null){p+='&'+m[1]+'='+m[2];}var opt={method:\"POST\",body:p,headers:{\"X-Requested-With\":\"XMLHttpRequest\",\"Referer\":reqUrl,\"Content-Type\":\"application/x-www-form-urlencoded; charset=UTF-8\"}};out='https://www.978xs.com/api/search,'+JSON.stringify(opt);", "weight": 0},{"bookSourceComment": "//需要登录\n2026.11.04 发现添加", "bookSourceGroup": "自己使用", "bookSourceName": "📖书海阁", "bookSourceType": 0, "bookSourceUrl": "https://book.washai.net/", "concurrentRate": "1/1500", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nvar fx_Url = \"https://book.washai.net\";\nvar ui = [];\n\n// 读取折叠状态\nvar st = {};\ntry { st = JSON.parse(source.getVariable()); } catch (e) { st = {}; }\nvar isPhExpanded = (st.phExpanded !== false);\nvar isFlExpanded = (st.flExpanded !== false);\nvar isMyExpanded = (st.myExpanded !== false);\n\nvar push = (arr, title, surl, size) => {\n    if (title !== \"\") {\n        arr.push({ title: title, url: surl, style: { layout_flexGrow: 1, layout_flexBasisPercent: size } });\n    }\n};\n\n// ==========================================\n// 提取 Token、用户名 和 组装 Headers\n// ==========================================\nvar ck = cookie.getCookie('https://book.washai.net/user/read_history.html') || '';\nvar match = ck.match(/novel_browser_token=([^;]+)/);\nvar ck_token = match ? match[1] : \"\"; \n\nvar username = \"\";\nvar authMatch = ck.match(/Authorization=([^;]+)/) || ck.match(/FrontRefreshToken=([^;]+)/);\nif (authMatch) {\n    var parts = authMatch[1].split('.');\n    if (parts.length === 3) {\n        try {\n            var b64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');\n            while (b64.length % 4 !== 0) { b64 += '='; }\n            var payload = JSON.parse(base64Decode(b64));\n            username = payload.username || \"\";\n        } catch(e) {}\n    }\n}\nif (username === \"\") { username = \"解析失败\"; }\n\nvar my_headers = {\n    \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36\",\n    \"Accept\": \"application/json, text/javascript, */*; q=0.01\",\n    \"X-Browser-Token\": ck_token,\n    \"X-Requested-With\": \"XMLHttpRequest\",\n    \"Referer\": \"https://book.washai.net/\",\n    \"Origin\": \"https://book.washai.net\"\n};\nvar obj = { \"headers\": my_headers };\n\n// ==========================================\n// 1. 数据收集区\n// ==========================================\n// 排行榜\nvar phArr = [];\nvar phurl = `${fx_Url}/book/book_ranking.html`;\ntry {\n    var phhtml = java.ajax(phurl);\n    var phdoc = org.jsoup.Jsoup.parse(phhtml);\n    var rankNodes = phdoc.select(\"#rankType li a\");\n    if (rankNodes && rankNodes.size() > 0) {\n        for (var i = 0; i < rankNodes.size(); i++) {\n            var node = rankNodes.get(i);\n            var apiUrl = `${fx_Url}/book/listRank?type=${node.attr(\"data-rank-type\")}&limit=30`;\n            push(phArr, node.text(), ImRequest(apiUrl, obj), 0.3); \n        }\n    }\n} catch(e) {}\n\n// 分类 (组装成带大标题的数据结构)\nvar flArr = [];\nvar workDirection = [[\"全部\", \"\"], [\"男频\", \"0\"], [\"女频\", \"1\"]];\nvar allCats = [[\"全部\", \"\"], [\"玄幻奇幻\", \"1\"], [\"武侠仙侠\", \"2\"], [\"都市言情\", \"3\"], [\"历史军事\", \"4\"], [\"科幻灵异\", \"5\"], [\"网游竞技\", \"6\"], [\"女生频道\", \"7\"], [\"次元同人\", \"8\"]];\nvar maleCats = [[\"全部\", \"\"], [\"玄幻奇幻\", \"1\"], [\"武侠仙侠\", \"2\"], [\"都市言情\", \"3\"], [\"历史军事\", \"4\"], [\"科幻灵异\", \"5\"], [\"网游竞技\", \"6\"], [\"次元同人\", \"8\"]];\nvar femaleCats = [[\"全部\", \"\"], [\"女生频道\", \"7\"]];\n\nfor (var i = 0; i < workDirection.length; i++) {\n    var dName = workDirection[i][0];\n    var dVal  = workDirection[i][1];\n    var currentCats = allCats;\n    if (dName === \"男频\") currentCats = maleCats;\n    if (dName === \"女频\") currentCats = femaleCats;\n    \n    flArr.push({ isHeader: true, title: \"= \" + dName + \" =\", url: \"\", style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } });\n    \n    for (var j = 0; j < currentCats.length; j++) {\n        var cName = currentCats[j][0];\n        var cVal  = currentCats[j][1];\n        var dirParam = (dVal === \"\") ? \"\" : \"&workDirection=\" + dVal;\n        var catParam = (cVal === \"\") ? \"\" : \"&catId=\" + cVal;\n        var url = `${fx_Url}/book/searchByPage?curr={{page}}&limit=30&keyword=${dirParam}${catParam}`;\n        push(flArr, cName, ImRequest(url, obj), 0.3);\n    }\n}\n\n// 书架\nvar myArr = [];\nvar isLogin = (ck_token !== \"\");\nmyArr.push({ \n    title: isLogin ? `🔵 已登录：${username}` : \"🔴 账户状态：未登录\", \n    url: \"\", type: \"text\", style: { layout_flexBasisPercent: 1 }\n});\n\nif (isLogin) {\n    myArr.push({ \n        title: \"🚪 退出登录\", url: \"\", type: \"button\", \n        action: \"try{cookie.removeCookie('https://book.washai.net');}catch(e){}; java.toast('✅ 账户已彻底退出'); java.refreshExplore();\", \n        style: { layout_flexBasisPercent: 0.46 } \n    });\n} else {\n    myArr.push({ \n        title: \"🔑 立即登录\", url: \"\", type: \"button\", \n        action: \"java.startBrowserAwait('https://book.washai.net/user/login.html', '请登录后返回'); java.refreshExplore();\", \n        style: { layout_flexBasisPercent: 0.46 } \n    });\n}\nvar sjurl = `${fx_Url}/user/listBookShelfByPage?curr={{page}}&limit=10&sortBy=updatetime&order=desc/read_history.html`;\npush(myArr, \"书架\", ImRequest(sjurl, obj), 0.46);\nmyArr.push({ \n    title: \"🍪 查看Cookie\", url: \"\", type: \"button\", \n    action: \"var ck = cookie.getCookie('https://book.washai.net/user/read_history.html') || '未获取到Cookie'; java.longToast('当前书架Cookie:\\\\n' + ck);\", \n    style: { layout_flexBasisPercent: 0.46 } \n});\nmyArr.push({ \n    title: \"ℹ️ 关于\", url: \"\", type: \"button\", \n    action: \"var comment = source.bookSourceComment;java.longToast(comment);\", \n    style: { layout_flexBasisPercent: 0.46 } \n});\n\n\n// ==========================================\n// 3. 组装渲染 (各管各的，互不干涉)\n// ==========================================\n\n// ① 我的模块 (两列排版，单独补全)\nui.push({ \n    title: isMyExpanded ? \"▼ 👤 我的 (点击收起)\" : \"▶ 👤 我的 (点击展开)\", \n    url: \"\", type: \"button\", \n    action: \"(function(){var c={};try{c=JSON.parse(source.getVariable())}catch(e){};c.myExpanded=(c.myExpanded===false?true:false);source.setVariable(JSON.stringify(c));})();java.refreshExplore()\", \n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } \n});\nif (isMyExpanded) {\n    myArr.forEach(function(item) { ui.push(item); });\n    if (myArr.length % 2 !== 1) {\n        ui.push({ title: \"　\", url: \"\", style: { layout_flexBasisPercent: 0.19} });\n    }\n}\n\n// ② 排行榜模块 (三列排版，单独补全)\nui.push({ \n    title: isPhExpanded ? \"▼ 🔥 排行榜 (点击收起)\" : \"▶ 🔥 排行榜 (点击展开)\", \n    url: \"\", type: \"button\", \n    action: \"(function(){var c={};try{c=JSON.parse(source.getVariable())}catch(e){};c.phExpanded=(c.phExpanded===false?true:false);source.setVariable(JSON.stringify(c));})();java.refreshExplore()\", \n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } \n});\nif (isPhExpanded) {\n    phArr.forEach(function(item) {\n        ui.push({ title: item.title, url: item.url, type: item.type, action: item.action, style: { layout_flexBasisPercent: 0.3 } });\n    });\n    if (phArr.length % 3 !== 0) {\n        ui.push({ title: \"　\", url: \"\", style: { layout_flexBasisPercent: 0.00001 }});\n    }\n}\n\n// ③ 分类模块 (三列排版+大标题，单独补全)\nui.push({ \n    title: isFlExpanded ? \"▼ 📚 分类 (点击收起)\" : \"▶ 📚 分类 (点击展开)\", \n    url: \"\", type: \"button\", \n    action: \"(function(){var c={};try{c=JSON.parse(source.getVariable())}catch(e){};c.flExpanded=(c.flExpanded===false?true:false);source.setVariable(JSON.stringify(c));})();java.refreshExplore()\", \n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } \n});\nif (isFlExpanded) {\n    var tempCount = 0; // 单独给小分类计数\n    flArr.forEach(function(item) {\n        if (item.isHeader) {\n            // 遇到大标题，如果上一排小按钮没满，先补位\n            if (tempCount > 0 && tempCount % 3 !== 0) {\n                ui.push({ title: \"　\", url: \"\", style: { layout_flexBasisPercent: 0.1} });\n            }\n            tempCount = 0; \n            // 推入大标题\n            ui.push({ title: item.title, url: \"\", style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } });\n        } else {\n            tempCount++;\n            // 推入小分类\n            ui.push({ title: item.title, url: item.url, style: { layout_flexBasisPercent: 0.3 } });\n        }\n    });\n    // 收尾补位\n    if (tempCount > 0 && tempCount % 3 !== 1) {\n        ui.push({ title: \"　\", url: \"\", style: { layout_flexBasisPercent: 0.00001} });\n    }\n}\n\n// 输出\nJSON.stringify(ui);", "jsLib": "//JSON安全解析\nfunction ImJson(input) {\n    if (input && typeof input === \"object\") return input;\n    return JSON.parse(String(input || \"{}\"));\n}\n\n//Legado ajax请求参数拼接工具（对齐lmRequest标准模板）\nfunction ImRequest(url, options) {\n    return String(url) + \",\" + JSON.stringify(options || {});\n}\n\n// 1. 字节数组 -> Hex\nfunction bytesToHex(bytes) {\n    if (!bytes) return \"\";\n    try {\n        var sb = new java.lang.StringBuilder();\n        for(var i = 0; i < bytes.length; i++){\n            var b = bytes[i] & 0xff;\n            var hexStr = java.lang.Integer.toHexString(b);\n            if(hexStr.length === 1){\n                sb.append(\"0\");\n            }\n            sb.append(hexStr);\n        }\n        return sb.toString();\n    } catch(e) { return \"\"; }\n}\n\n// 2. Hex -> 字节数组\nfunction hexToBytes(hex) {\n    if (!hex || hex.length % 2 !== 0) return null;\n    try {\n        var len = hex.length;\n        var bytes = new Array(len / 2);\n        for (var i = 0; i < len; i += 2) {\n            bytes[i / 2] = parseInt(hex.substring(i, i + 2), 16);\n        }\n        return bytes;\n    } catch(e) { return null; }\n}\n\n// 3. 字节数组 -> 普通字符串 (UTF-8)\nfunction bytesToString(bytes) {\n    if (!bytes) return \"\";\n    try {\n        return new java.lang.String(bytes, \"UTF-8\");\n    } catch(e) { return \"\"; }\n}\n\n// 4. 字节数组 -> Base64\nfunction encodeBase64(bytes) {\n    if (!bytes) return \"\";\n    try {\n        if (typeof android !== 'undefined' && android.util && android.util.Base64) {\n            return android.util.Base64.encodeToString(bytes, 0).replace(/\\n/g, \"\");\n        }\n        if (typeof java !== 'undefined' && java.util && java.util.Base64) {\n            return java.util.Base64.getEncoder().encodeToString(bytes);\n        }\n    } catch(e) {}\n    return bytesToHex(bytes);\n}\n\n// 5. 字符串 Base64 解码 (直接传 Base64 字符串，返回明文)\nfunction decodeB64(str) {\n    if (!str) return \"\";\n    try {\n        var b64 = str.replace(/-/g, '+').replace(/_/g, '/');\n        while (b64.length % 4 !== 0) { b64 += '='; }\n        var byteArr = java.base64DecodeToByteArray(b64);\n        return bytesToString(byteArr);\n    } catch(e) {\n        return \"\";\n    }\n}\n\n// 6. JWT 密文 -> 明文 JSON 对象\nfunction parseJwt(jwtStr) {\n    if (!jwtStr) return null;\n    var parts = jwtStr.split('.');\n    if (parts.length === 3) {\n        var plainText = decodeB64(parts[1]);\n        if (plainText) {\n            try {\n                return JSON.parse(plainText);\n            } catch(e) {}\n        }\n    }\n    return null;\n}\n\n// Base64解码\n// 纯 JS 原生 Base64 解码（不依赖 Java，完美支持中文）\nfunction base64Decode(s) {\n    const base64Table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n    s = String(s).replace(/=+$/, '');\n    let out = '';\n    let bits = 0;\n    let value = 0;\n    for (let i = 0; i < s.length; i++) {\n        let idx = base64Table.indexOf(s[i]);\n        if (idx === -1) continue;\n        value = (value << 6) | idx;\n        bits += 6;\n        if (bits >= 8) {\n            bits -= 8;\n            // 先把字节推入数组\n            out += '%' + ('00' + ((value >> bits) & 0xFF).toString(16)).slice(-2);\n        }\n    }\n    try {\n        // 用 decodeURIComponent 把十六进制转回正常中文\n        return decodeURIComponent(out);\n    } catch (e) {\n        return out; // 如果解析失败，回退原始结果\n    }\n}\n\n// 纯 JS 原生 Base64 加密（不依赖 Java，完美支持中文）\nfunction base64Encode(str) {\n    if (!str) return \"\";\n    \n    // 1. 先转 UTF-8 格式（防止中文乱码）\n    var utf8Str = encodeURIComponent(String(str)).replace(/%([0-9A-F]{2})/g, function(match, p1) {\n        return String.fromCharCode('0x' + p1);\n    });\n    \n    const base64Table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n    let out = '';\n    let i = 0;\n    \n    // 2. 核心算法：按 6 位分组转字符\n    while (i < utf8Str.length) {\n        let chr1 = utf8Str.charCodeAt(i++);\n        let chr2 = utf8Str.charCodeAt(i++);\n        let chr3 = utf8Str.charCodeAt(i++);\n        \n        let enc1 = chr1 >> 2;\n        let enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\n        let enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\n        let enc4 = chr3 & 63;\n        \n        // 处理剩余字符（不足3个字节）\n        if (isNaN(chr2)) {\n            enc3 = enc4 = 64;\n        } else if (isNaN(chr3)) {\n            enc4 = 64;\n        }\n        \n        out += base64Table.charAt(enc1) + base64Table.charAt(enc2) +\n               (enc3 === 64 ? '=' : base64Table.charAt(enc3)) +\n               (enc4 === 64 ? '=' : base64Table.charAt(enc4));\n    }\n    \n    return out;\n}", "lastUpdateTime": "1793843960702", "loginUrl": "https://book.washai.net/user/login.html", "respondTime": 180000, "ruleBookInfo": {"author": "@css:a#bookAuthor@text", "coverUrl": "@css:img#bookCoverImg@src", "intro": "@css:meta[name='description']@content", "kind": "@css:div.nav_sub a:eq(1)@text", "lastChapter": "@css:a#lastIndexLink@text", "name": "@css:h1#bookName@text", "tocUrl": "@css:a#allIndexLink@href", "wordCount": "@css:em#bookWordCount@text"}, "ruleContent": {"content": "div.readChapterAppendBody p@html"}, "ruleExplore": {"author": "$.authorName", "bookList": "$.data.list[*]&&$.data", "bookUrl": "https://book.washai.net/book/{{$.id||$.bookId}}.html", "coverUrl": "https://book.washai.net{{$.picUrl}}", "intro": "{{$.bookDesc}}\n{{$.lastIndexUpdateTime}}", "kind": "$.catName&&$.bookStatusText", "lastChapter": "$.lastIndexName", "name": "$.bookName", "wordCount": "$.wordCount"}, "ruleSearch": {"author": "@css:p.classBookAuthor>a@text", "bookList": "@css:#bookList>article", "bookUrl": "@css:h3.classBookTitle>a@href", "coverUrl": "@css:span.classBookCover img@src", "intro": "@css:p.classBookDesc@text", "kind": "@css:a.classCoverCat@text", "lastChapter": "@css:p.classBookChapter>a@text", "name": "@css:h3.classBookTitle>a@text", "wordCount": "@css:p.classBookMeta@text##^[^·]*·\\s*([0-9.]+万字).*##$1###"}, "ruleToc": {"chapterList": "@js:\nvar list = [];\nvar base = String(baseUrl);\nvar html = java.ajax(base);\nvar doc = org.jsoup.Jsoup.parse(html);\nvar lis = doc.select(\"ul#bookIndexList > li\");\nvar domain = \"https://book.washai.net\";\nvar href;\nfor (var i = 0; i < lis.size(); i++) {\n    var li = lis.get(i);\n    if (li.hasClass(\"catalogVolumeHeading\") || li.select(\"h4\").size() > 0) {\n        var t = String(li.select(\"h4\").text()).trim();\n        var name = t || \"正文\";\n        list.push({\n            text: \"🏮〖\" + name + \"〗🏮\",\n            href: href,\n            volume: true\n        });\n    } \n    // 2. 识别章节\n    else {\n        var a = li.select(\"a\").first();\n        if (!a) continue;\n        var rawText = String(a.text()).trim();\n        href = String(a.attr(\"href\") || \"\");\n        if (!rawText || !href) continue;\n        if (href.indexOf(\"http\") !== 0 && href.indexOf(\"//\") !== 0) {\n            href = domain + (href.charAt(0) === \"/\" ? href : \"/\" + href);\n        }\n\n        var symbol = rawText.indexOf(\"免费\") !== -1 ? \"📝 \" : \"🔒 \";\n        var cleanName = rawText.replace(/\\[免费\\]/g, \"\")\n                               .replace(/\\[VIP\\]/gi, \"\")\n                               .replace(/免费/g, \"\")\n                               .replace(/VIP/gi, \"\")\n                               .trim();\n\n        // 推入章节\n        list.push({ text: symbol + cleanName, href: href });\n    }\n}\nlist;", "chapterName": "text", "chapterUrl": "href", "isVolume": "volume", "nextTocUrl": "//*[@id=\"indexPager\"]//a[contains(text(),\"下一页\")]/@href"}, "searchUrl": "/book/bookclass.html?k={{key}}&page={{page}}", "weight": 0},{"bookSourceComment": "发布页 https://fb.omoo.tv/ 动态取 4 条线路；登录面板可换发布页/一键取线/并发测速/逐线路切换/检查状态。站点免登录；搜索/分类页偶发 MACCMS「系统安全验证」，loginCheckJs 自动 POST verify_check 过盾（本地时间戳 XOR 生成 token）。正文现场请求 art.v2player.top 播放器页，AES-CBC/PKCS7 解密出 mp4 直链，bookSourceType=4 直接播放。搜索链路 3 秒节流，不设全局限速；兼容 Legado Team / legado-E。", "bookSourceGroup": "AI,动漫", "bookSourceName": "▶ OmoFun 动漫（发布页多线路）", "bookSourceType": 4, "bookSourceUrl": "https://fb.omoo.tv/", "bookUrlPattern": "https?://[^/]+/anime/[0-9a-f]{24}\\.html", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:(function(){var line=OM_line(source);var rows=[{title:'📺 首页推荐',url:line+'/'},{title:'🗓 周更表',url:line+'/week/'},{title:'🔥 今日热播',url:line+'/dayhot/'},{title:'🌸 新番表',url:line+'/topic/'},{title:'🇯🇵 日漫',url:line+'/type/1-{{page}}.html'},{title:'🇨🇳 国漫',url:line+'/type/2-{{page}}.html'},{title:'🎬 动画',url:line+'/type/5-{{page}}.html'},{title:'🎞 剧场',url:line+'/type/24-{{page}}.html'},{title:'🦸 特摄',url:line+'/type/4-{{page}}.html'},{title:'🇺🇸 美漫',url:line+'/type/3-{{page}}.html'}];return JSON.stringify(rows);})()", "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36\", \"Referer\": \"https://www.omofuns.com/\"}", "jsLib": "\n// ===================== OmoFun 公用工具 =====================\nvar OM_UA = \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36\";\nvar OM_PUB = \"https://fb.omoo.tv/\";\nvar OM_DEFAULT = \"https://www.omofuns.com\";\nvar OM_PLAYER = \"https://art.v2player.top:8989/player/?\";\nvar OM_AESKEY = \"ABABEF777999CCCD\";\nvar OM_LINES = [\n  \"https://www.omofuns.com\", \"https://cn.233dm.com\",\n  \"https://cn.211dm.com\", \"https://cn.agekkkk.com\"\n];\nvar OM_LINE_NAMES = [\"omofuns.com\", \"cn.233dm.com\", \"cn.211dm.com\", \"cn.agekkkk.com\"];\n\n// JsNull 三态归一：E 版 source.get 未设置返回 truthy 对象\nfunction OM_g(v) {\n  var s = String(v === undefined || v === null ? '' : v);\n  if (s === '' || s === 'null' || s === 'undefined' || s === 'JsNull' || s === '[object Object]') return '';\n  return s;\n}\nfunction OM_line(sv) {\n  var v = '';\n  try { v = OM_g(sv.get('om_line')); } catch (e) { }\n  if (v.indexOf('http') !== 0) v = OM_DEFAULT;\n  return v.replace(/\\/+$/, '');\n}\nfunction OM_pub(sv) {\n  var v = '';\n  try { v = OM_g(sv.get('om_pub')); } catch (e) { }\n  if (v.indexOf('http') !== 0) v = OM_PUB;\n  return v.replace(/\\/+$/, '');\n}\nfunction OM_toast(jv, msg) {\n  try { jv.toast(msg); return; } catch (e) { }\n  try { jv.longToast(msg); } catch (e2) { }\n}\n// 纯 JS Latin-1 base64（Rhino 里 java.base64Encode(byte[]) 会被字符串化成 [B@xxx）\nfunction OM_b64(s) {\n  var t = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=', o = '';\n  for (var i = 0; i < s.length; i += 3) {\n    var a = s.charCodeAt(i) & 255;\n    var b = i + 1 < s.length ? s.charCodeAt(i + 1) & 255 : null;\n    var c = i + 2 < s.length ? s.charCodeAt(i + 2) & 255 : null;\n    var n = (a << 16) | ((b || 0) << 8) | (c || 0);\n    o += t.charAt((n >> 18) & 63) + t.charAt((n >> 12) & 63)\n      + (b === null ? '=' : t.charAt((n >> 6) & 63))\n      + (c === null ? '=' : t.charAt(n & 63));\n  }\n  return o;\n}\n// MACCMS「系统安全验证」token：时间戳 XOR 16字节固定密钥 → Latin-1 → base64\nfunction OM_token() {\n  var key = [0x4e, 0x3f, 0xa9, 0xc2, 0x12, 0x7d, 0x88, 0xef,\n             0x55, 0xaa, 0x0b, 0xcd, 0xde, 0xad, 0xbe, 0xef];\n  var ts = String(Date.now()), p = '';\n  for (var i = 0; i < ts.length; i++) p += String.fromCharCode(ts.charCodeAt(i) ^ key[i % 16]);\n  return OM_b64(p);\n}\n// 过盾：POST verify_check 种 Cookie。type 取 search/show；成功后同域全站放行。\nfunction OM_pass(jv, line, type) {\n  var t = type || 'search';\n  var u = line.replace(/\\/+$/, '') + '/index.php/ajax/verify_check?type=' + t;\n  var tok = OM_token();\n  var hd = {\n    'Content-Type': 'application/x-www-form-urlencoded',\n    'Referer': line.replace(/\\/+$/, '') + '/',\n    'X-Requested-With': 'XMLHttpRequest',\n    'User-Agent': OM_UA,\n    'Origin': line.replace(/\\/+$/, '')\n  };\n  try {\n    var r = jv.post(u, 'i=' + encodeURIComponent(tok), hd);\n    var b = String(r.body());\n    return b.indexOf('\"code\":1') >= 0 || b.indexOf('\"code\": 1') >= 0 || /\"msg\"\\s*:\\s*\"ok\"/.test(b);\n  } catch (e) { return false; }\n}\n// 发布页线路解析：eval 混淆脚本取 encodedLinks → base64 解码\nfunction OM_fetchLines(jv, pubUrl) {\n  var h = String(jv.ajax(pubUrl));\n  var re = /<script>([\\w\\W]*?)<\\/script>/g, m, code = '';\n  while ((m = re.exec(h)) !== null) code = m[1];\n  if (!code || code.indexOf('encodedLinks') < 0) return { err: '发布页结构变化，未找到线路数组', html: h.slice(0, 200) };\n  var window = this, document = {};\n  var arr;\n  try { eval(code); arr = encodedLinks; } catch (e) { return { err: '发布页脚本执行失败：' + e }; }\n  if (!arr || !arr.length) return { err: '发布页线路数组为空' };\n  var out = [], seen = {};\n  for (var i = 0; i < arr.length; i++) {\n    var parts = String(arr[i]).split('|'), u = '';\n    try { u = String(jv.base64Decode(parts[0])); } catch (e2) { }\n    u = u.replace(/\\/+$/, '');\n    if (u.indexOf('http') !== 0 || seen[u]) continue;\n    seen[u] = 1;\n    out.push({ u: u, n: parts[1] || u.replace(/^https?:\\/\\//, '') });\n  }\n  return { lines: out };\n}\n// 线路探活三判据：code 200-399 + body 足够长 + 非异常堆栈串\nfunction OM_probeOne(jv, u) {\n  var t = Date.now();\n  try {\n    var r = jv.ajax(u + '/');\n    var raw = r && r.raw && typeof r.raw === 'function' ? r.raw() : null;\n    var code = 0;\n    try { code = raw ? raw.code() : 0; } catch (e0) { }\n    var b = String(r.body ? r.body() : r);\n    var ok = (code >= 200 && code < 400 || code === 0) && b.length > 20000\n      && !(b.length < 3000 && /Exception|Error|堆栈/.test(b));\n    return { u: u, ms: Date.now() - t, ok: ok, len: b.length };\n  } catch (e) { return { u: u, ms: Date.now() - t, ok: false, err: String(e) }; }\n}\n// 保存线路池：每个按钮一个键 om_s1..om_s8 + 池数量 om_sn\nfunction OM_saveLines(sv, lines) {\n  var n = Math.min(lines.length, 8);\n  try {\n    sv.put('om_sn', String(n));\n    for (var i = 0; i < 8; i++) sv.put('om_s' + (i + 1), i < n ? lines[i].u : '');\n    sv.put('om_lines', JSON.stringify(lines.slice(0, n)));\n    sv.put('om_line', lines[0].u);\n  } catch (e) { }\n  return n;\n}\nfunction OM_loadLines(sv) {\n  var arr = [];\n  try {\n    var raw = OM_g(sv.get('om_lines'));\n    if (raw) { var p = JSON.parse(raw); if (p && p.length) arr = p; }\n  } catch (e) { }\n  if (!arr.length) {\n    var n = 0;\n    try { n = parseInt(OM_g(sv.get('om_sn')), 10) || 0; } catch (e2) { }\n    for (var i = 1; i <= n; i++) {\n      var u = ''; try { u = OM_g(sv.get('om_s' + i)); } catch (e3) { }\n      if (u.indexOf('http') === 0) arr.push({ u: u, n: u.replace(/^https?:\\/\\//, '') });\n    }\n  }\n  if (!arr.length) for (var k = 0; k < OM_LINES.length; k++) arr.push({ u: OM_LINES[k], n: OM_LINE_NAMES[k] });\n  return arr;\n}\nfunction OM_speedKey(i) { return 'om_sp' + (i + 1); }\nfunction OM_lineLabel(sv, i) {\n  var arr = OM_loadLines(sv);\n  if (i >= arr.length) return '（空位 ' + (i + 1) + '）';\n  var sp = ''; try { sp = OM_g(sv.get(OM_speedKey(i))); } catch (e) { }\n  var mark = sp.indexOf('⚡') === 0 ? '⚡' : '';\n  return (mark ? '⚡ ' : '') + arr[i].n + ' ' + (sp || '未测速');\n}\n// 站点的书详情相对 URL 列表规则公共选择器\nvar OM_LIST = 'ul.BIaC_ACJijja > li';\n", "lastUpdateTime": "1793810310737", "loginCheckJs": "(function(){try{var b='';try{b=String(result&&result.body?result.body():result);}catch(e){b=String(result||'');}if(b.length<8000&&(b.indexOf('系统安全验证')>=0||b.indexOf('verify_check')>=0)){OM_toast(java,'⏳ 站点要求安全验证，正在自动过盾…');var ok=OM_pass(java,OM_line(source),'search');OM_toast(java,ok?'✅ 过盾成功，请重试刚才的操作':'⚠ 过盾未成功，可在书源登录面板切换线路');}}catch(err){}return result;})()", "loginUi": "[{\"key\": \"om_pub\", \"type\": \"text\", \"name\": \"发布页网址\", \"hint\": \"默认 https://fb.omoo.tv/ ，可改成镜像发布页\", \"defaultValue\": \"https://fb.omoo.tv/\"}, {\"key\": \"om_status\", \"type\": \"text\", \"name\": \"当前状态\", \"viewName\": \"OM_status(source)\", \"hint\": \"当前线路 / 发布页 / 线路数\"}, {\"key\": \"om_btn_get\", \"type\": \"button\", \"name\": \"🔄 一键从发布页获取网址路线\", \"action\": \"OM_actGetLines(java,source)\"}, {\"key\": \"om_btn_speed\", \"type\": \"button\", \"name\": \"⚡ 测试延时（测得 ms 写入各线路按钮）\", \"action\": \"OM_actSpeed(java,source)\"}, {\"key\": \"om_btn_line1\", \"type\": \"button\", \"name\": \"线路 1\", \"viewName\": \"OM_lineLabel(source,0)\", \"action\": \"OM_actSetLine(java,source,0)\"}, {\"key\": \"om_btn_line2\", \"type\": \"button\", \"name\": \"线路 2\", \"viewName\": \"OM_lineLabel(source,1)\", \"action\": \"OM_actSetLine(java,source,1)\"}, {\"key\": \"om_btn_line3\", \"type\": \"button\", \"name\": \"线路 3\", \"viewName\": \"OM_lineLabel(source,2)\", \"action\": \"OM_actSetLine(java,source,2)\"}, {\"key\": \"om_btn_line4\", \"type\": \"button\", \"name\": \"线路 4\", \"viewName\": \"OM_lineLabel(source,3)\", \"action\": \"OM_actSetLine(java,source,3)\"}, {\"key\": \"om_btn_line5\", \"type\": \"button\", \"name\": \"线路 5\", \"viewName\": \"OM_lineLabel(source,4)\", \"action\": \"OM_actSetLine(java,source,4)\"}, {\"key\": \"om_btn_line6\", \"type\": \"button\", \"name\": \"线路 6\", \"viewName\": \"OM_lineLabel(source,5)\", \"action\": \"OM_actSetLine(java,source,5)\"}, {\"key\": \"om_btn_line7\", \"type\": \"button\", \"name\": \"线路 7\", \"viewName\": \"OM_lineLabel(source,6)\", \"action\": \"OM_actSetLine(java,source,6)\"}, {\"key\": \"om_btn_line8\", \"type\": \"button\", \"name\": \"线路 8\", \"viewName\": \"OM_lineLabel(source,7)\", \"action\": \"OM_actSetLine(java,source,7)\"}, {\"key\": \"om_btn_check\", \"type\": \"button\", \"name\": \"✅ 检查登录状态（免登录/过盾状态）\", \"action\": \"OM_actCheck(java,source)\"}]", "loginUrl": "<js>\n\n// ============ 登录面板（线路运维 + 检查登录状态） ============\n// 本面板仅做线路管理，站点本身无需登录即可搜索/观看。\n// login() 必须存在，否则点右上角 √ 会抛 Function login not implements。\nfunction login() { }\n\n// 当前状态概览（viewName 动态文本）\nfunction OM_status(sv) {\n  var arr = OM_loadLines(sv);\n  var cur = OM_line(sv), pub = OM_pub(sv);\n  var idx = -1;\n  for (var i = 0; i < arr.length; i++) if (arr[i].u === cur) idx = i;\n  return '当前线路：' + cur.replace(/^https?:\\/\\//, '')\n    + (idx >= 0 ? '（第' + (idx + 1) + '条）' : '（自定义）')\n    + ' ｜ 发布页：' + pub.replace(/^https?:\\/\\//, '')\n    + ' ｜ 共 ' + arr.length + ' 条线路';\n}\n\n// 按钮 1：一键从发布页获取网址路线\nfunction OM_actGetLines(jv, sv) {\n  OM_toast(jv, '⏳ 正在读取发布页，请稍候…');\n  var res = OM_fetchLines(jv, OM_pub(sv));\n  if (res.err) { OM_toast(jv, '❌ 获取线路失败：' + res.err); return; }\n  var n = OM_saveLines(sv, res.lines);\n  for (var i = 0; i < 8; i++) { try { sv.put(OM_speedKey(i), ''); } catch (e) { } }\n  OM_toast(jv, '✅ 已从发布页获取 ' + n + ' 条线路，默认切到第 1 条；请点「测试延时」测速');\n  try { jv.reLoginView(); } catch (e2) { }\n}\n\n// 按钮 2：测试延时（并发 ajaxAll，结果写回各线路按钮）\nfunction OM_actSpeed(jv, sv) {\n  var arr = OM_loadLines(sv);\n  if (!arr.length) { OM_toast(jv, '⚠ 线路池为空，请先点「一键从发布页获取网址路线」'); return; }\n  OM_toast(jv, '⏳ 正在并发测速 ' + arr.length + ' 条线路，请稍候…');\n  var urls = [];\n  for (var i = 0; i < arr.length; i++) urls.push(arr[i].u + '/');\n  var results = null;\n  try {\n    // 双参 ajaxAll(urls,true) 两版通吃；单参重载兜底\n    try { results = jv.ajaxAll(urls, true); } catch (e0) { results = jv.ajaxAll(urls); }\n  } catch (e1) { results = null; }\n  var out = [];\n  for (var k = 0; k < arr.length; k++) {\n    var ms = -1, ok = false;\n    if (results && results.length > k) {\n      var one = results[k];\n      try {\n        var b = String(one.body ? one.body() : one);\n        var raw = one && one.raw && typeof one.raw === 'function' ? one.raw() : null;\n        var code = 0; try { code = raw ? raw.code() : 0; } catch (ex) { }\n        ms = -1;\n        ok = (code >= 200 && code < 400 || code === 0) && b.length > 20000\n          && !(b.length < 3000 && /Exception|Error/.test(b));\n      } catch (e2) { }\n    }\n    if (ms < 0 || !ok) { var p = OM_probeOne(jv, arr[k].u); ms = p.ms; ok = p.ok; }\n    out.push({ u: arr[k].u, ms: ms, ok: ok });\n  }\n  var best = -1, bestMs = 1e12;\n  for (var q = 0; q < out.length; q++) {\n    var txt = out[q].ok ? (out[q].ms + 'ms') : '超时/异常';\n    if (out[q].ok && out[q].ms < bestMs) { bestMs = out[q].ms; best = q; }\n    try { sv.put(OM_speedKey(q), txt); } catch (e3) { }\n  }\n  if (best >= 0) {\n    try { sv.put(OM_speedKey(best), '⚡' + bestMs + 'ms'); } catch (e4) { }\n    try { sv.put('om_line', out[best].u); } catch (e5) { }\n    OM_toast(jv, '✅ 测速完成！最快 ' + arr[best].n + ' ' + bestMs + 'ms，已自动切换；延时已写入各线路按钮');\n  } else {\n    OM_toast(jv, '⚠ 测速完成但无可用线路，请检查网络或点「一键从发布页获取网址路线」更新');\n  }\n  try { jv.reLoginView(); } catch (e6) { OM_toast(jv, 'ℹ 若按钮文字未刷新，请关闭后重新打开本面板'); }\n}\n\n// 线路切换按钮（各网站一个）\nfunction OM_actSetLine(jv, sv, idx) {\n  var arr = OM_loadLines(sv);\n  if (idx >= arr.length) { OM_toast(jv, '⚠ 该线路位为空，请先获取线路'); return; }\n  OM_toast(jv, '⏳ 正在切换到 ' + arr[idx].n + ' …');\n  try { sv.put('om_line', arr[idx].u); } catch (e) { }\n  var p = OM_probeOne(jv, arr[idx].u);\n  if (p.ok) OM_toast(jv, '✅ 已切换到 ' + arr[idx].n + '（' + p.ms + 'ms），线路可用');\n  else OM_toast(jv, '⚠ 已切换到 ' + arr[idx].n + '，但探活未通过（' + p.ms + 'ms）；可再点测速或换其他线路');\n  try { jv.reLoginView(); } catch (e2) { }\n}\n\n// 按钮：检查登录状态（站点免登录，这里检查过盾 Cookie 与线路可用性）\nfunction OM_actCheck(jv, sv) {\n  OM_toast(jv, '⏳ 正在检查线路与过盾状态…');\n  var line = OM_line(sv);\n  var h = '';\n  try { h = String(jv.ajax(line + '/')); } catch (e) { }\n  var blocked = h.indexOf('系统安全验证') >= 0 || h.indexOf('verify_check') >= 0;\n  if (blocked) {\n    OM_toast(jv, '⚠ 检测到安全验证页，正在自动过盾…');\n    var ok = OM_pass(jv, line, 'search');\n    OM_toast(jv, ok ? '✅ 过盾成功，Cookie 已刷新，可正常搜索/观看' : '❌ 过盾失败，请切换线路后重试');\n  } else if (h.length > 20000) {\n    OM_toast(jv, '✅ 状态正常：免登录，线路 ' + line.replace(/^https?:\\/\\//, '') + ' 可用，无验证拦截');\n  } else {\n    OM_toast(jv, '⚠ 线路响应异常（' + h.length + ' 字节），建议点「测试延时」或换线路');\n  }\n  try { jv.reLoginView(); } catch (e2) { }\n}\n\n</js>", "respondTime": 180000, "ruleBookInfo": {"author": "$.a", "coverUrl": "$.c", "init": "@js:\n(function(){\n  var h=String(result||'');\n  var J=Packages.org.jsoup.Jsoup, d=J.parse(h);\n  function tx(sel){ var e=d.select(sel).first(); return e?String(e.text()).trim():''; }\n  var name=tx('h1.title');\n  var pic=''; var im=d.select('a.pic img').first();\n  if(im) pic=String(im.attr('data-original')||im.attr('src')||'').trim();\n  if(pic && pic.indexOf('http')!==0 && pic.indexOf('//')!==0) pic='https://as.cfhls.top/'+pic.replace(/^\\/+/,'');\n  if(pic.indexOf('//')===0) pic='https:'+pic;\n  var meta=tx('p.data.hidden-xs');\n  var status=''; var ps=d.select('p.data');\n  for(var i=0;i<ps.size();i++){var t=String(ps.get(i).text());if(t.indexOf('状态')===0){status=t.replace(/^状态[：:]\\s*/,'');break;}}\n  var intro=tx('.detail-content')||tx('.detail-sketch');\n  var o={\n    a:'OmoFun', c:pic, k:meta.replace(/^类型[：:]\\s*/,'').replace(/\\s*\\/\\s*/g,'·'),\n    w:status, t:status, i:intro, n:name, tocUrl:String(baseUrl||'')\n  };\n  return JSON.stringify(o);\n})()\n", "intro": "$.i", "kind": "$.k", "lastChapter": "$.t", "name": "$.n", "tocUrl": "$.tocUrl", "wordCount": "$.w"}, "ruleContent": {"content": "@js:\n(function(){\n  // Legado 已把播放页 HTML 放进 result，直接用（避免重复请求触发风控）\n  var page=String(result||'');\n  if(page.length<3000 && (page.indexOf('系统安全验证')>=0||page.indexOf('verify_check')>=0)){\n    try{ OM_pass(java,OM_line(source),'search'); page=String(java.ajax(String(baseUrl||''))); }catch(e1){ }\n  }\n  // player_aaaa 是含嵌套 vod_data 的内联 JSON，贪婪正则会提前截断 → 括号配平提取\n  var i=page.indexOf('var player_aaaa=');\n  if(i<0) return '⚠ 未找到播放数据（页面结构可能已变更，或该集已下架）';\n  var st=page.indexOf('{',i), dep=0, end=-1, inStr=false, q='';\n  if(st<0) return '⚠ 播放数据起始符缺失';\n  for(var k=st;k<page.length;k++){\n    var c=page.charAt(k);\n    if(inStr){ if(c==='\\\\'){k++;continue;} if(c===q)inStr=false; continue; }\n    if(c==='\"'||c===\"'\"){ inStr=true; q=c; continue; }\n    if(c==='{')dep++; else if(c==='}'){ dep--; if(dep===0){ end=k+1; break; } }\n  }\n  if(end<0) return '⚠ 播放数据括号不配平';\n  var pd=null;\n  try{ pd=JSON.parse(page.slice(st,end)); }catch(e2){ return '⚠ 播放数据解析失败：'+e2; }\n  var rawUrl=String(pd.url||'');\n  if(String(pd.encrypt)==='1'){ try{ rawUrl=unescape(rawUrl); }catch(e3){ } }\n  else if(String(pd.encrypt)==='2'){ try{ rawUrl=String(java.base64Decode(rawUrl)); }catch(e4){ } }\n  if(!rawUrl) return '⚠ 该集暂无播放地址';\n  // 构造第三方播放器页参数（与 /static/player/mp4.js 一致）\n  var dmid='';\n  try{ var dm=/\"dmid\"\\s*:\\s*\"?(\\d+)\"?/.exec(page); if(dm)dmid=dm[1]; }catch(e5){ }\n  if(!dmid)dmid=String(pd.id||'');\n  var pic=String(pd.vod_data&&pd.vod_data.vod_pic||'');\n  var picHost=pic.indexOf('http')===0?'':'https://as.cfhls.top/';\n  var line=OM_line(source);\n  var qs=[\n    'url='+encodeURIComponent(rawUrl),\n    'dmid='+encodeURIComponent(dmid),\n    'next='+encodeURIComponent(String(pd.link_next||'')),\n    'name='+encodeURIComponent(String(pd.vod_data&&pd.vod_data.vod_name||'')),\n    'sid='+encodeURIComponent(String(pd.sid||'1')),\n    'nid='+encodeURIComponent(String(pd.nid||'1')),\n    'ph='+encodeURIComponent(picHost),\n    'h='+encodeURIComponent(line),\n    'pic='+encodeURIComponent(pic)\n  ];\n  var purl=OM_PLAYER+qs.join('&');\n  // 第三方播放器高峰期偶发返回极短空页（曾见 16 字节 <!DOCTYPE html>）\n  // → 3 次重试，每次换 ts 破缓存；仍失败给可读提示\n  var playerHtml='', mm=null;\n  for(var retry=0;retry<3;retry++){\n    var tryUrl=purl+(retry?'&_r='+Date.now()+'_'+retry:'');\n    try{ playerHtml=String(java.ajax(tryUrl)); }catch(e6){ playerHtml=''; }\n    mm=/playData\\('([^']+)','([^']+)'\\)/.exec(playerHtml);\n    if(mm) break;\n    try{ Packages.java.lang.Thread.sleep(400); }catch(eSleep){ }\n  }\n  if(!mm) return '⚠ 播放器解析繁忙（已重试 3 次），请稍后重试或在登录面板切换线路';\n  var cipher=mm[1], ivHex=mm[2];\n  try{\n    var keyBytes=java.strToBytes(OM_AESKEY);\n    var ivBytes=java.hexDecodeToByteArray(ivHex);\n    var c=java.createSymmetricCrypto('AES/CBC/PKCS7Padding',keyBytes,ivBytes);\n    var u=String(c.decryptStr(cipher)).trim();\n    // 站方偶发把协议头写成 org.h:// 之类的伪装，统一还原\n    if(u.indexOf('org.h://')===0) u='https://'+u.slice(8);\n    if(u.indexOf('http')!==0) return '⚠ 解析出的地址异常：'+u.slice(0,120);\n    return u;\n  }catch(e7){ return '⚠ 播放地址解密失败：'+e7; }\n})()\n"}, "ruleExplore": {"bookList": "@js:\n(function(){\n  var h=String(result||'');\n  if(h.length<100)return [];\n  var J=Packages.org.jsoup.Jsoup,d=J.parse(h);\n  var as=d.select('a[href*=/anime/]');\n  var out=[],seen={};\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);\n    var u=String(a.attr('href')||'');\n    var pic=String(a.attr('data-original')||'');\n    var n=String(a.attr('title')||'').trim();\n    if(!u||!pic||!n||seen[u])continue;\n    seen[u]=1;\n    var kind='',last='';\n    var li=a.closest('li');\n    if(li){var bs=li.select('span b');if(bs.size()>=2){kind=String(bs.get(0).text());last=String(bs.get(bs.size()-1).text());}}\n    out.push(JSON.stringify({name:n,bookUrl:u,coverUrl:pic,kind:kind,lastChapter:last}));\n  }\n  // ★E 版 getElements 是 `result as List<Any>`（无 NativeArray 分支），\n  //   返回 Rhino 原生数组会 ClassCastException → TocEmptyException/列表空。\n  //   必须返回 Java java.util.ArrayList，两版通吃。\n  var list=new Packages.java.util.ArrayList();\n  for(var j=0;j<out.length;j++) list.add(out[j]);\n  return list;\n})()\n", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name"}, "ruleSearch": {"bookList": "@js:\n(function(){\n  var h=String(result||'');\n  if(h.length<100)return [];\n  var J=Packages.org.jsoup.Jsoup,d=J.parse(h);\n  var as=d.select('a[href*=/anime/]');\n  var out=[],seen={};\n  for(var i=0;i<as.size();i++){\n    var a=as.get(i);\n    var u=String(a.attr('href')||'');\n    var pic=String(a.attr('data-original')||'');\n    var n=String(a.attr('title')||'').trim();\n    if(!u||!pic||!n||seen[u])continue;\n    seen[u]=1;\n    var kind='',last='';\n    var li=a.closest('li');\n    if(li){var bs=li.select('span b');if(bs.size()>=2){kind=String(bs.get(0).text());last=String(bs.get(bs.size()-1).text());}}\n    out.push(JSON.stringify({name:n,bookUrl:u,coverUrl:pic,kind:kind,lastChapter:last}));\n  }\n  // ★E 版 getElements 是 `result as List<Any>`（无 NativeArray 分支），\n  //   返回 Rhino 原生数组会 ClassCastException → TocEmptyException/列表空。\n  //   必须返回 Java java.util.ArrayList，两版通吃。\n  var list=new Packages.java.util.ArrayList();\n  for(var j=0;j<out.length;j++) list.add(out[j]);\n  return list;\n})()\n", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name"}, "ruleToc": {"chapterList": "@js:\n(function(){\n  var h=String(result||'');\n  var J=Packages.org.jsoup.Jsoup, d=J.parse(h);\n  var panes=d.select('div[id^=playlist]');\n  var out=[], seen={};\n  // E 版 getElements 只认 Java List，末尾统一转 ArrayList\n  // 只取第一条播放线路（精品），避免 4 条线路重复 800+ 集\n  if(panes.size()>0){\n    var as=panes.get(0).select('ul.play-list-content li.play-list-content-item a');\n    for(var i=0;i<as.size();i++){\n      var a=as.get(i), u=String(a.attr('href')||''), n=String(a.attr('title')||a.text()||'').trim();\n      if(!u||seen[u])continue; seen[u]=1;\n      if(u.indexOf('/play/')<0)continue;\n      out.push(JSON.stringify({n:n||('第'+(out.length+1)+'集'),u:u}));\n    }\n  }\n  if(out.length===0){\n    // 兜底：详情页「立即播放」按钮\n    var pb=d.select('a.play-btn, .play-btn a').first();\n    var u2=pb?String(pb.attr('href')||''):'';\n    if(u2.indexOf('/play/')>=0) out.push(JSON.stringify({n:'▶ 播放',u:u2}));\n  }\n  var list=new Packages.java.util.ArrayList();\n  for(var j=0;j<out.length;j++) list.add(out[j]);\n  return list;\n})()\n", "chapterName": "$.n", "chapterUrl": "$.u"}, "searchUrl": "@js:(function(){var line=OM_line(source);var now=Date.now(),last=0;try{last=parseInt(OM_g(source.get('om_search_last')),10)||0;}catch(e){}var wait=3000-(now-last);if(wait>0&&wait<=3000){try{java.log('[OmoFun] 搜索节流 '+wait+'ms');}catch(e2){}try{Packages.java.lang.Thread.sleep(wait);}catch(e4){}}try{source.put('om_search_last',String(Date.now()));}catch(e3){}return line+'/search/'+java.encodeURI(String(key))+'-------------.html';})()", "weight": 0},{"bookSourceComment": "【书海阁 book.washai.net · 2026-11-04】\n· 全站 UTF-8 / Cloudflare / SSR 服务端渲染；游客可读搜索·详情·目录·正文（实测后期章节 needBuy=false），无需登录，故不写登录 UI 与登录状态检查按钮\n· 搜索：GET /book/bookclass.html?k={{key}}（页面无 form；站点 common.js 的 searchByK 明确跳转该地址），SSR 直出 #bookList\n· 限速：concurrentRate=1/2000（全站 2 秒 1 请求），避免搜索过于频繁触发风控；目录 100 章/页串行分页，长篇约 12 页会慢一些，属限速权衡（可自行调成 1/1000）\n· UA：header 字段内置完整 Chrome UA（书源真字段名是 header，不是带 Map 后缀的字段；写错会被 Gson 静默丢弃）\n· 详情与目录分离：tocUrl → /book/indexList-<id>.html；不写 intro，因详情页 #bookDesc 是站方 SEO 套话，保留搜索结果里的真简介\n· 目录分页：每页 100 章，第1页 indexList-<id>.html、第2页起 indexList/<id>/<N>.html；nextTocUrl 只按「下一页」文案取 1 个 URL，末页 return null（防「上一页」回环）\n· 目录 chapterList 写 id.bookIndexList@tag.li@tag.a：部分书首页混有 li.catalogVolumeHeading 卷标题（无 <a>），直接选 a 元素可自动排除；★Default 规则的 [xxx] 是数组索引语法不是 CSS 属性选择器，写 tag.li[data-index-id] 会被误解析导致「列表大小:0 → TocEmptyException」（要属性选择器必须用 @css: 前缀）\n· 正文：#showReading 下的 readChapterAppendBody；实测末章（大结局）needBuy=false 正文直出，游客无需登录（★不能用 #readPanel：页面恒含隐藏的「此章为VIP章节，需要订阅」#vipPanel，会污染正文）\n· 无章内分页（flipPageProgress=1/1），「下一章」是独立章节 URL 且已被目录覆盖，故不写 nextContentUrl 防串章\n· 发现：全部作品 + 8 分类（带 {{page}} 分页）+ 4 榜单（单页 30 本，站点无分页）；榜单作者栏偶有「榜单第一」占位数据，已用 ## 规则清空\n· wordCount 用 @js: 从卡片元素取 p.classBookMeta / p.rankCardMeta（★不能把 ##替换 与 ||组合符 混写：替换段会吞掉后半段规则文本）\n· 兼容性：列表规则全用 Default/CSS 选择器（不返回 JS 数组），nextTocUrl 用 IIFE 返回 String/null，兼容 Legado 官方版与 legado-E\n· 未检测到网址发布页：首页无「发布页/备用/网址/线路/镜像」字样，washai.net / www / m 三个根域均无 DNS 记录 ⇒ 按需求不写线路管理面板", "bookSourceGroup": "AI", "bookSourceName": "📚书海阁", "bookSourceType": 0, "bookSourceUrl": "https://book.washai.net", "bookUrlPattern": "^https?://book\\.washai\\.net/book/(?:indexList-\\d+\\.html|indexList/\\d+/\\d+\\.html|\\d+\\.html|\\d+/\\d+\\.html)(?:\\?.*)?$", "concurrentRate": "1/1000", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\": \"▌全部作品 · 可翻页\", \"url\": \"\", \"style\": {\"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"title\": \"全部作品\", \"url\": \"https://book.washai.net/book/bookclass.html?page={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.5}}, {\"title\": \"▌分类浏览 · 可翻页\", \"url\": \"\", \"style\": {\"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"title\": \"玄幻奇幻\", \"url\": \"https://book.washai.net/book/bookclass.html?c=1&page={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.5}}, {\"title\": \"武侠仙侠\", \"url\": \"https://book.washai.net/book/bookclass.html?c=2&page={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.5}}, {\"title\": \"都市言情\", \"url\": \"https://book.washai.net/book/bookclass.html?c=3&page={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.5}}, {\"title\": \"历史军事\", \"url\": \"https://book.washai.net/book/bookclass.html?c=4&page={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.5}}, {\"title\": \"科幻灵异\", \"url\": \"https://book.washai.net/book/bookclass.html?c=5&page={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.5}}, {\"title\": \"网游竞技\", \"url\": \"https://book.washai.net/book/bookclass.html?c=6&page={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.5}}, {\"title\": \"女生频道\", \"url\": \"https://book.washai.net/book/bookclass.html?c=7&page={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.5}}, {\"title\": \"次元同人\", \"url\": \"https://book.washai.net/book/bookclass.html?c=8&page={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.5}}, {\"title\": \"▌排行榜 · 单页30本\", \"url\": \"\", \"style\": {\"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"title\": \"人气榜\", \"url\": \"https://book.washai.net/book/book_ranking.html?type=0\", \"style\": {\"layout_flexBasisPercent\": 0.5}}, {\"title\": \"新书榜\", \"url\": \"https://book.washai.net/book/book_ranking.html?type=1\", \"style\": {\"layout_flexBasisPercent\": 0.5}}, {\"title\": \"更新榜\", \"url\": \"https://book.washai.net/book/book_ranking.html?type=2\", \"style\": {\"layout_flexBasisPercent\": 0.5}}, {\"title\": \"评论榜\", \"url\": \"https://book.washai.net/book/book_ranking.html?type=3\", \"style\": {\"layout_flexBasisPercent\": 0.5}}]", "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\", \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\", \"Accept-Language\": \"zh-CN,zh;q=0.9\"}", "lastUpdateTime": "1793807034620", "respondTime": 180000, "ruleBookInfo": {"author": "id.bookAuthor@text", "coverUrl": "id.bookCoverImg@src", "kind": "id.bookCatBadge@text", "lastChapter": "id.lastIndexLink@text", "name": "id.bookName@text", "tocUrl": "id.allIndexLink@href", "wordCount": "id.bookWordCount@text"}, "ruleContent": {"content": "id.showReading@class.readChapterAppendBody@html##<script[\\s\\S]*?</script>|<style[\\s\\S]*?</style>"}, "ruleExplore": {"author": "class.classBookAuthor@tag.a@text||class.rankCardAuthor@tag.a@text##^榜单第[一二三四五六七八九十\\d]+$", "bookList": "id.bookList@class.classBookCard||id.bookRankList@class.rankCard", "bookUrl": "class.classBookTitle@tag.a@href||class.rankCardTitle@tag.a@href", "coverUrl": "class.classBookCover@tag.img@src||class.rankCardCover@tag.img@src", "intro": "class.classBookDesc@text||class.rankCardDesc@text", "kind": "class.classCoverCat@text||class.rankCoverCat@text", "lastChapter": "class.classBookChapter@tag.a@text", "name": "class.classBookTitle@tag.a@text||class.rankCardTitle@tag.a@text", "wordCount": "@js:(function(){var t='';try{var e=result;var x=e.select('p.classBookMeta');if(x.size()===0)x=e.select('p.rankCardMeta');if(x.size()>0)t=String(x.get(0).text());}catch(err){}var m=t.match(/·\\s*([^\\s]+)\\s*$/);return m?m[1]:'';})()"}, "ruleSearch": {"author": "class.classBookAuthor@tag.a@text||class.rankCardAuthor@tag.a@text##^榜单第[一二三四五六七八九十\\d]+$", "bookList": "id.bookList@class.classBookCard||id.bookRankList@class.rankCard", "bookUrl": "class.classBookTitle@tag.a@href||class.rankCardTitle@tag.a@href", "coverUrl": "class.classBookCover@tag.img@src||class.rankCardCover@tag.img@src", "intro": "class.classBookDesc@text||class.rankCardDesc@text", "kind": "class.classCoverCat@text||class.rankCoverCat@text", "lastChapter": "class.classBookChapter@tag.a@text", "name": "class.classBookTitle@tag.a@text||class.rankCardTitle@tag.a@text", "wordCount": "@js:(function(){var t='';try{var e=result;var x=e.select('p.classBookMeta');if(x.size()===0)x=e.select('p.rankCardMeta');if(x.size()>0)t=String(x.get(0).text());}catch(err){}var m=t.match(/·\\s*([^\\s]+)\\s*$/);return m?m[1]:'';})()"}, "ruleToc": {"chapterList": "id.bookIndexList@tag.li@tag.a", "chapterName": "text##\\s*\\[[^\\]]*\\]$", "chapterUrl": "href", "nextTocUrl": "@js:(function(){\nvar h='';try{h=String(src||'');}catch(e){}\nif(h.indexOf('pgBtn')<0){try{h=String(result||'');}catch(e2){}}\nvar u=null;\ntry{var d=org.jsoup.Jsoup.parse(h);var a=d.select('a.pgBtn');\nfor(var i=0;i<a.size();i++){if(String(a.get(i).text()).indexOf('\\u4e0b\\u4e00\\u9875')>=0){var x=String(a.get(i).attr('href'));if(x){u=x;break;}}}\n}catch(e3){}\nif(!u){var m=h.match(/href=\"([^\"]+)\"[^>]*>\\u4e0b\\u4e00\\u9875</);if(m)u=m[1];}\nreturn u||null;\n})()"}, "searchUrl": "/book/bookclass.html?k={{key}}", "weight": 0},{"bookSourceComment": "★xanimu(2D/3D成人动漫视频站) v1.0\n【站点】xanimu.art | xanimu.ws（同站双域线路，App网络下 .ws 快 30-60 倍）\n【发布页】https://x99dh.com（Cloudflare「Just a moment」双层加密跳转页；另有 x99dh.lat/net/cc/pro/github.io 五个静态跳转镜像）\n【线路】默认 xanimu.ws；登录面板可切换 .art/.ws、一键从发布页取线（双层 AES-GCM 解密）、测延时自动选最快。\n【搜索】GET /zh-CN/?s=关键词（WS线路实测<1s）+ 排序 filter（latest/most-viewed/longest，分页用 {pageSlug}/N/ 格式）\n【发现】四大板块（推荐/最新/最多浏览/最长）+ 30个热门分类\n【正文】详情页 <video> MP4 直链（high/low 双清晰度），CDN无Referer校验，App网络直连200\n【风险】无登录；未实测搜索限频（请勿高频搜索）；CDN(nosofiles.com)域名变动需更新\n【v1.0】LT版+E版双兼容：@js列表返回JS数组、字段用$.键、发布页解密走javax.crypto（E版无createSymmetricCrypto）\n", "bookSourceGroup": "🎬视频", "bookSourceName": "🎬xanimu成人动漫", "bookSourceType": 4, "bookSourceUrl": "https://xanimu.ws/zh-CN/", "bookUrlPattern": "https?://xanimu\\.(ws|art|net|cc|pro|lat)/zh-CN/\\d+[^?]*", "concurrentRate": "1/30000", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:// xanimu exploreUrl JS\nfunction XA_E_base() {\n  var b = '';\n  try { b = String(source.get('xaHost') || ''); } catch (e) { b = ''; }\n  if (!b || b.indexOf('http') !== 0) b = 'https://xanimu.ws';\n  return b.replace(/\\/+$/, '');\n}\nvar PS = '%E6%9C%89%E5%85%B3%E8%AF%A6%E7%BB%86%E4%BF%A1%E6%81%AF%EF%BC%8C%E8%AF%B7%E6%9F%A5%E7%9C%8B%E6%AD%A4%E9%A1%B5%E9%9D%A2%E3%80%82';\nvar CATS = [\n  ['推荐', ''], ['最新', 'latest'], ['最多浏览', 'most-viewed'], ['最长', 'longest'],\n  ['日本动画片', '16884%E4%B8%AA%E7%81%B5%E9%AD%82'], ['卡通片', '40241%E5%8D%A1%E9%80%9A'],\n  ['3D', '5-3d-%E6%97%A0%E5%B0%BD'], ['2D', '36900-2d'], ['毛茸茸', '4-%E6%AF%9B%E8%8C%B8%E8%8C%B8%E7%9A%84%E6%97%A0%E5%B0%BD'],\n  ['游戏', '22%E6%B8%B8%E6%88%8F'], ['原神', '40979%E5%85%83%E7%A5%9E%E5%86%B2%E5%87%BB'], ['Pokemon', '24-%E9%83%A8%E7%94%B5%E8%A7%86%E8%8A%82%E7%9B%AE/26-pokemon'],\n  ['Naruto', '614-naruto-2'], ['One Piece', '24-%E9%83%A8%E7%94%B5%E8%A7%86%E8%8A%82%E7%9B%AE/9466-one-piece'],   ['龙珠', '24-%E9%83%A8%E7%94%B5%E8%A7%86%E8%8A%82%E7%9B%AE/9473-dragon-ball'], ['进击的巨人', '61626%E6%94%BB%E5%87%BB%E6%B3%B0%E5%9D%A6'], ['电锯人', '24-%E9%83%A8%E7%94%B5%E8%A7%86%E8%8A%82%E7%9B%AE/47870-chainsaw-man'],\n  ['柔术海战', '78551-%E6%9F%94%E6%9C%AF%E4%BC%9A%E6%88%98'], ['魅魔', '16704-%E9%AD%85%E9%AD%94'], ['触手', '7%E8%A7%A6%E6%89%8B%E5%8F%98%E6%80%81%E8%89%B2%E6%83%85%E7%89%87'],\n  ['扶他', '8-futanari-%E6%97%A0%E5%B0%BD'], ['后宫', '9470-%E5%90%8E%E5%AE%AB%E6%97%A0%E5%B0%BD'], ['乱伦', '6-%E4%B9%B1%E4%BC%A6%E6%97%A0%E5%B0%BD'],\n  ['中出', '19-%E4%B8%AD%E5%87%BA%E6%97%A0%E5%B0%BD'], ['HMV', '47441-hmv'], ['MMD', '47420%E6%AF%AB%E7%B1%B3'],\n  ['Asmr', '39558-%E9%98%BF%E6%96%AF%E7%8E%9B'], ['漫画', '15410%E6%BC%AB%E7%94%BB'], ['Disney', '9479-disney-%E6%97%A0%E5%B0%BD']\n];\nvar rows = [];\nvar PG = \"{{page === 1 ? '' : '/\" + PS + \"/' + page + '/'}}\";\nfor (var i = 0; i < CATS.length ; i++) {\n  var nm = CATS[i][0];\n  var slug = CATS[i][1];\n  var u;\n  if (slug === '') {\n    u = XA_E_base() + '/zh-CN/' + PG;\n  } else if (slug === 'latest' || slug === 'most-viewed' || slug === 'longest') {\n    u = XA_E_base() + '/zh-CN/' + PG + '?filter=' + slug;\n  } else {\n    u = XA_E_base() + '/zh-CN/' + slug + '/' + PG;\n  }\n  rows.push(nm + '::' + u);\n  if (i === 3) { rows.push('--- 分类 ---::' + XA_E_base() + '/zh-CN/'); }\n}\nrows.join('&&');\n", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1793807619286", "loginUi": "[{\"name\": \"xaHost\", \"type\": \"text\", \"action\": \"XA_use(String(result['xaHost']||''));\", \"viewName\": \"XA_hostLabel()\"}, {\"name\": \"📡 一键从发布页获取线路\", \"type\": \"button\", \"action\": \"XA_fetchLines()\"}, {\"name\": \"⏱ 测试延时并自动选最快\", \"type\": \"button\", \"viewName\": \"XA_statusLabel()\", \"action\": \"XA_probeAll()\"}, {\"name\": \"○ xanimu.ws（默认推荐）\", \"type\": \"button\", \"action\": \"XA_use('https://xanimu.ws')\"}, {\"name\": \"○ xanimu.art（备用）\", \"type\": \"button\", \"action\": \"XA_use('https://xanimu.art')\"}, {\"name\": \"xaPub\", \"type\": \"text\", \"action\": \"XA_putPub();\", \"viewName\": \"XA_pubLabel()\"}]", "loginUrl": "// xanimu login panel functions (V1 static loginUi + viewName dynamic text)\nfunction XA_toast(msg) {\n  try { java.toast(String(msg)); } catch (e) {\n    try { java.longToast(String(msg)); } catch (e2) {}\n  }\n}\nfunction XA_refresh() {\n  try { java.reLoginView(false); return; } catch (e) {}\n  try { java.reLoginView(); return; } catch (e) {}\n  try { java.reUiView(false); return; } catch (e) {}\n  try { java.reUiView(); } catch (e) {}\n}\nfunction XA_base() {\n  var b = '';\n  try { b = String(source.get('xaHost') || ''); } catch (e) { b = ''; }\n  if (!b || b.indexOf('http') !== 0) b = 'https://xanimu.ws';\n  return b.replace(/\\/+$/, '');\n}\nfunction XA_use(h) {\n  var host = String(h || '').replace(/\\/+$/, '');\n  if (host.indexOf('http') !== 0) host = 'https://' + host;\n  try { source.put('xaHost', host); } catch (e) { try { java.put('xaHost', host); } catch (e2) {} }\n  XA_toast('已切换线路: ' + host);\n  XA_refresh();\n}\nfunction XA_now() { return XA_base(); }\nfunction XA_setPub(v) {\n  var p = String(v || '').trim();\n  if (!p) p = 'https://x99dh.com';\n  if (p.indexOf('http') !== 0) p = 'https://' + p;\n  try { source.put('xaPub', p); } catch (e) { try { java.put('xaPub', p); } catch (e2) {} }\n  XA_toast('发布页已存: ' + p);\n}\nfunction XA_putPub() {\n  var v = '';\n  try { v = String(result['xaPub'] || ''); } catch (e) { v = ''; }\n  if (!v || v.length < 6) v = 'https://x99dh.com';\n  XA_setPub(v);\n}\nfunction XA_hexDec(h) {\n  var s = '';\n  for (var i = 0; i < h.length; i += 2) {\n    s += String.fromCharCode(parseInt(h.substr(i, 2), 16));\n  }\n  return s;\n}\nfunction XA_xorBytes(a1, a2) {\n  var BAOS = Packages.java.io.ByteArrayOutputStream;\n  var kb = new BAOS();\n  var n = a1.length < a2.length ? a1.length : a2.length;\n  for (var i = 0; i < n; i++) {\n    kb.write((a1[i] & 0xff) ^ (a2[i] & 0xff));\n  }\n  return kb.toByteArray();\n}\nfunction XA_gcm(keyBytes, ivBytes, ctBytes) {\n  var cipher = Packages.javax.crypto.Cipher.getInstance('AES/GCM/NoPadding');\n  var key = new Packages.javax.crypto.spec.SecretKeySpec(keyBytes, 'AES');\n  var spec = new Packages.javax.crypto.spec.GCMParameterSpec(128, ivBytes);\n  cipher.init(Packages.javax.crypto.Cipher.DECRYPT_MODE, key, spec);\n  return java.bytesToStr(cipher.doFinal(ctBytes));\n}\nfunction XA_staticDecrypt(inner) {\n  var mk = inner.match(/var k=X\\(B\\(\"([A-Za-z0-9+\\/=]+)\"\\)\\s*,\\s*B\\(\"([A-Za-z0-9+\\/=]+)\"\\)\\)/);\n  var mi = inner.match(/var iv=B\\(\"([A-Za-z0-9+\\/=]+)\"\\)/);\n  var mc = inner.match(/var ct=B\\(\"([A-Za-z0-9+\\/=]{50,})\"\\)/);\n  if (!mk || !mi || !mc) return null;\n  var k1 = java.base64DecodeToByteArray(mk[1]);\n  var k2 = java.base64DecodeToByteArray(mk[2]);\n  var iv = java.base64DecodeToByteArray(mi[1]);\n  var ct = java.base64DecodeToByteArray(mc[1]);\n  return XA_gcm(XA_xorBytes(k1, k2), iv, ct);\n}\nfunction XA_splitIvCt(all, ivLen) {\n  var BAOS = Packages.java.io.ByteArrayOutputStream;\n  var iv = new BAOS();\n  var ct = new BAOS();\n  for (var i = 0; i < all.length; i++) {\n    if (i < ivLen) { iv.write(all[i] & 0xff); } else { ct.write(all[i] & 0xff); }\n  }\n  return { iv: iv.toByteArray(), ct: ct.toByteArray() };\n}\nfunction XA_sealedDecrypt(plain) {\n  var mu = plain.match(/uk\\s*=\\s*C\\(new Uint8Array\\(\\[([\\d,\\s]+)\\]\\)\\s*,\\s*new Uint8Array\\(\\[([\\d,\\s]+)\\]\\)\\)/);\n  var ms = plain.match(/sealed\\s*=\\s*\\[([\\s\\S]*?)\\];/);\n  if (!mu || !ms) return null;\n  var a1 = mu[1].split(',').map(function (x) { return parseInt(x.trim(), 10); });\n  var a2 = mu[2].split(',').map(function (x) { return parseInt(x.trim(), 10); });\n  var key = XA_xorBytes(a1, a2);\n  var list = ms[1].match(/\"([A-Za-z0-9+\\/=]{20,})\"/g) || [];\n  var lines = [];\n  for (var i = 0; i < list.length; i++) {\n    try {\n      var all = java.base64DecodeToByteArray(list[i].replace(/\"/g, ''));\n      var p = XA_splitIvCt(all, 12);\n      lines.push(XA_gcm(key, p.iv, p.ct));\n    } catch (e) {}\n  }\n  return lines;\n}\nfunction XA_navSites(pub) {\n  var UA = 'Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36';\n  var body = '';\n  try {\n    body = String(java.ajax(pub + ',{\"headers\":{\"User-Agent\":\"' + UA + '\"},\"retry\":2}'));\n  } catch (e) { body = ''; }\n  if (!body || body.length < 500) return [];\n  var m = body.match(/encodedData\\s*=\\s*'([A-Za-z0-9+\\/=]+)'/);\n  if (!m) return [];\n  var raw = '';\n  try { raw = java.base64Decode(m[1]); } catch (e2) { raw = ''; }\n  if (!raw || raw.indexOf('%5B') < 0 && raw.indexOf('[{') < 0) return [];\n  var json = '';\n  try { json = decodeURIComponent(raw); } catch (e3) { json = raw; }\n  var sites = [];\n  try {\n    var arr = JSON.parse(json);\n    for (var si = 0; si < arr.length; si++) {\n      if (arr[si] && arr[si].name && arr[si].url) {\n        sites.push({ name: String(arr[si].name), url: String(arr[si].url) });\n      }\n    }\n  } catch (e4) {\n    var re = /\"name\"\\s*:\\s*\"([^\"]+)\"[\\s\\S]{0,400}?\"url\"\\s*:\\s*\"([^\"]+)\"/g;\n    var mm;\n    while ((mm = re.exec(json)) !== null) {\n      sites.push({ name: mm[1], url: mm[2] });\n    }\n  }\n  return sites;\n}\nfunction XA_linesFromPub(pub) {\n  var hosts = [];\n  var pubs = [pub, 'https://x99dh.github.io', 'https://x99dh.lat', 'https://x99dh.net'];\n  for (var i = 0; i < pubs.length && hosts.length === 0; i++) {\n    if (!pubs[i]) continue;\n    try {\n      var sites = XA_navSites(pubs[i]);\n      for (var j = 0; j < sites.length; j++) {\n        var u = String(sites[j].url || '');\n        if (u.indexOf('xanimu') < 0) continue;\n        var mh = u.match(/https?:\\/\\/([^\\/\\s]+)/);\n        if (mh && hosts.indexOf(mh[1]) < 0) hosts.push(mh[1]);\n      }\n    } catch (e) {}\n  }\n  if (hosts.length === 0) { hosts = ['xanimu.ws', 'xanimu.art']; }\n  return hosts;\n}\nfunction XA_fetchLines() {\n  XA_toast('正在从发布页获取线路...');\n  var pub = 'https://x99dh.com';\n  try { pub = String(result['xaPub'] || '') || pub; } catch (e) {}\n  if (pub.indexOf('http') !== 0) pub = 'https://' + pub.replace(/\\/+$/, '');\n  var lines = XA_linesFromPub(pub);\n  for (var i = 0; i < lines.length; i++) {\n    source.put('xaLine' + i, lines[i]);\n  }\n  source.put('xaLineN', String(lines.length));\n  XA_toast('已获取 ' + lines.length + ' 条线路: ' + lines.join(', '));\n  XA_refresh();\n}\nfunction XA_probe(host, cb) {\n  var UA = 'Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36';\n  var t0 = Date.now();\n  try {\n    var r = java.connect(host + '/zh-CN/', JSON.stringify({ 'User-Agent': UA }), 12000);\n    var code = r && r.code ? r.code() : -1;\n    var ms = Date.now() - t0;\n    var bodyLen = 0;\n    try { bodyLen = String(r.body() || '').length; } catch (e) {}\n    if (code === 200 && bodyLen > 50000) { return { ok: true, ms: ms }; }\n    return { ok: false, ms: ms, why: 'HTTP' + code + '/' + bodyLen };\n  } catch (e2) {\n    return { ok: false, ms: Date.now() - t0, why: String(e2).substring(0, 40) };\n  }\n}\nfunction XA_statusLabel() {\n  var cur = XA_base();\n  return '当前: ' + cur.replace('https://', '');\n}\nfunction XA_hostLabel() {\n  return '主站线路(输入或点按钮切换)';\n}\nfunction XA_probeAll() {\n  var hosts = [];\n  try {\n    var n = parseInt(String(source.get('xaLineN') || '0'), 10) || 0;\n    for (var i = 0; i < n; i++) {\n      var h = String(source.get('xaLine' + i) || '');\n      if (h && hosts.indexOf(h) < 0) hosts.push(h);\n    }\n  } catch (e) {}\n  if (hosts.indexOf('xanimu.ws') < 0) hosts.push('xanimu.ws');\n  if (hosts.indexOf('xanimu.art') < 0) hosts.push('xanimu.art');\n  XA_toast('测延时中, 共 ' + hosts.length + ' 条...');\n  var best = null;\n  var lines = [];\n  for (var j = 0; j < hosts.length; j++) {\n    var res = XA_probe('https://' + hosts[j].replace(/^https?:\\/\\//, ''));\n    var tag = res.ok ? (res.ms + 'ms') : ('✗ ' + (res.why || '失败'));\n    lines.push(hosts[j] + '=' + tag);\n    if (res.ok && (!best || res.ms < best.ms)) { best = { host: hosts[j], ms: res.ms }; }\n  }\n  source.put('xaDelay', lines.join(' | '));\n  if (best) {\n    source.put('xaHost', 'https://' + best.host);\n    XA_toast('最快: ' + best.host + ' ' + best.ms + 'ms 已切换');\n  } else {\n    XA_toast('全部线路异常: ' + lines.join(' | '));\n  }\n  XA_refresh();\n}\nfunction XA_lineLabel(i, def) {\n  var cur = XA_base().replace('https://', '');\n  var lab = '';\n  try { lab = String(source.get('xaLine' + i) || ''); } catch (e) {}\n  if (!lab) lab = def;\n  var delay = '';\n  try { delay = String(source.get('xaDelay') || ''); } catch (e2) {}\n  var dd = '';\n  var parts = delay.split(' | ');\n  for (var k = 0; k < parts.length; k++) {\n    if (parts[k].indexOf(lab) === 0) { dd = parts[k].substring(lab.length + 1); break; }\n  }\n  var mark = lab === cur ? '●' : '○';\n  var fast = '';\n  if (dd && dd.indexOf('ms') > 0) {\n    var num = parseInt(dd, 10);\n    if (num && num < 1500) { fast = ' ⚡'; }\n  }\n  return mark + ' ' + lab + (dd ? ' ' + dd : '') + fast;\n}\nfunction XA_login() { return 'ok'; }\nfunction XA_pubLabel() {\n  return '发布页网址(默认 x99dh.com)';\n}\nfunction login() { return 'ok'; }\n", "respondTime": 3668, "ruleBookInfo": {"author": "b", "coverUrl": "g", "init": "@js:(function(){\nvar h=String(result);\nvar m=h.match(/<h1[^>]*>([\\s\\S]*?)<\\/h1>/);\nvar name=m?m[1].replace(/<[^>]+>/g,'').trim():'';\nvar v=h.match(/views-number[^>]*>[\\s\\S]{0,120}?([\\d.,]+[KM]?)[\\s\\S]{0,40}?<\\/span>/);\nvar d=h.match(/duration[^>]*>([^<]+)</);\nvar du=h.match(/length.:.[\\d]+ min/);\nvar kw=h.match(/keywords.:.\\s*([^\"']+?)\\s*.,/);\nvar pom=h.match(/<video[^>]*\\sposter=.[^\\s\"']+/);\nvar de=h.match(/<meta name=.description. content=.([^\\s\"]{10,300})/);\nvar g='';\nif(pom){var gi=pom[0].indexOf('poster=')+8;g=pom[0].substring(gi).replace(/[\"']+$/,'');}\nreturn JSON.stringify({a:name,b:'xanimu',c:(kw?kw[1]:''),d:(v?v[1]:''),e:(d?d[1].trim():''),f:(de?de[1]:''),g:g,h:String(baseUrl||'')});\n})()", "intro": "f", "kind": "c", "lastChapter": "e", "name": "a", "tocUrl": "h", "wordCount": "d"}, "ruleContent": {"content": "@js:(function(){\nvar h=String(result);\nvar m=h.match(/<video[^>]*\\ssrc=.[^\\s\"']+\\.(mp4|m3u8)[^\\s\"']*/);\nif(!m){m=h.match(/<source[^>]*\\ssrc=.[^\\s\"']+\\.(mp4|m3u8)[^\\s\"']*/);}\nif(!m)return '';\nvar u=m[0];\nvar p=u.indexOf('src=');\nu=u.substring(p+5).replace(/[\\\"']+$/,'');\nreturn u;\n})()", "imageStyle": "FULL"}, "ruleExplore": [], "ruleSearch": {"bookList": "class.video-block", "bookUrl": "tag.a.0@href", "checkKeyWord": "naruto", "coverUrl": "tag.img.0@data-src||tag.img.0@src", "kind": "class.duration@text", "lastChapter": "class.rating-nolike@text||class.rating@text", "name": "class.title@text", "wordCount": "class.views-number@text"}, "ruleToc": {"chapterList": "@js:(function(){var out=[];out.push(JSON.stringify({n:String(book&&book.name?book.name:'正片'),u:String(baseUrl||'')}));return out;})()", "chapterName": "$.n", "chapterUrl": "$.u"}, "searchUrl": "@js:(function(){var b='https://xanimu.ws';try{var v=String(source.get('xaHost')||'');if(v.indexOf('http')===0)b=v.replace(/\\/+$/,'')}catch(e){}return b+\"/zh-CN/{{page === 1 ? '' : '/%E6%9C%89%E5%85%B3%E8%AF%A6%E7%BB%86%E4%BF%A1%E6%81%AF%EF%BC%8C%E8%AF%B7%E6%9F%A5%E7%9C%8B%E6%AD%A4%E9%A1%B5%E9%9D%A2%E3%80%82/' + page + '/'}}?s=\"+encodeURIComponent(String(key||''))+',\"retry\":2'})()", "weight": 0},{"bookSourceGroup": "笔趣阁", "bookSourceName": "笔趣阁", "bookSourceType": 0, "bookSourceUrl": "https://m.qidian.com", "customButton": false, "customOrder": -2, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>(function(){\nvar _H = (typeof _dpSrv === 'function') ? _dpSrv() : 'http://43.139.147.103:8070';\nvar FALLBACK = [{\"title\":\"请选择平台\",\"type\":\"select\",\"chars\": [\"📖 综合\", \"🌙 得奇小说\", \"圣墟小说网\", \"提书网(tishu)\", \"思兔阅读(sto66)\", \"2K小说\", \"同人小说(trxs123)\", \"黑岩阅读\", \"🍅 番茄小说\", \"思路客\", \"夜伴书屋\",\"错层小说\", \"STV镜像\", \"笔下文学网(bxwx9)\", \"笔趣阁小说网(biquguo)\", \"37阅读网(37yue)\", \"大唐小说\", \"小说屋\",\"笔趣阁(bqgooo.cc)\", \"书旗小说\", \"米读小说\", \"七猫小说\", \"武侠小说网(wuxiayue)\", \"爱下电子书(ixdzs8) ✨优质\", \"🌙 顶点小说·APP接口 ✨优质\", \"📖 读知阁\" ],\"default\":\"📖 综合\",\"action\":\"show(infoMap['请选择平台'],'dpsrc')\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"≡ 综合分类（多源合并）≡\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"玄幻\",\"url\":_H+\"/api/discover/unified_list/0?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"仙侠\",\"url\":_H+\"/api/discover/unified_list/1?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"都市\",\"url\":_H+\"/api/discover/unified_list/2?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"历史\",\"url\":_H+\"/api/discover/unified_list/3?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"科幻\",\"url\":_H+\"/api/discover/unified_list/4?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"悬疑\",\"url\":_H+\"/api/discover/unified_list/5?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"游戏\",\"url\":_H+\"/api/discover/unified_list/6?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"言情\",\"url\":_H+\"/api/discover/unified_list/7?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"完本\",\"url\":_H+\"/api/discover/unified_list/8?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"最新\",\"url\":_H+\"/api/discover/unified_list/9?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"排行\",\"url\":_H+\"/api/discover/unified_list/10?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"--\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}}];\ntry{\nvar _p=_dpExplorePage(java, cache, FALLBACK);\nif(_p){return _p;}\n}catch(e){}\nreturn JSON.stringify(FALLBACK);\n})()</js>", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; SM-S918B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\", \"Accept-Language\": \"zh-CN,zh;q=0.9\"}", "jsLib": "var _DP_JV = null, _DP_BK = null, _DP_CH = null;\nvar _DP_ILLU_DIAG = '';   \nfunction _dpSetCtx(jv, bk, ch) {\n    try { if (jv) _DP_JV = jv; } catch (e1) {}\n    try { if (bk) _DP_BK = bk; } catch (e2) {}\n    try { if (ch) _DP_CH = ch; } catch (e3) {}\n    return _DP_JV;\n}\nfunction _dpScopeChapter() {\n    try { if (typeof chapter !== 'undefined' && chapter) return chapter; } catch (e1) {}\n    try { if (_DP_CH) return _DP_CH; } catch (e2) {}\n    return null;\n}\nfunction _dpJv(jv) {\n    if (jv) return jv;\n    if (_DP_JV) return _DP_JV;\n    try { if (typeof java !== 'undefined' && java) return java; } catch (e1) {}\n    try { if (typeof source !== 'undefined' && source) return source; } catch (e2) {}\n    return null;\n}\n\nvar _DP_UA = 'Mozilla/5.0 (Linux; Android 12; Redmi K40 Build/SKQ1.220213.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/110.0.0.0 Mobile Safari/537.36';\nvar _DP_LANG = 'zh-CN,zh;q=0.9';\nvar _DP_QD_DIAG = '';\nvar _DP_DEBUG = true;          \nvar _DP_DEBUG_OK = false;      \nvar _DP_NET_ERR = '';          \nvar _DP_CSRF = '';             \nvar _DP_LAST_FAIL = '';        \nvar _DP_HOT_EMPTY = false;\nvar _DP_HOT_DIAG = '';\nvar _DP_IMG_VH = 55;\n\nvar _DP_SERVER = 'http://43.139.147.103:8070';   \n\nfunction _dpSrv() {\n    try {\n        var sc = _dpSrcOf(_dpJv());\n        if (sc && typeof sc.get === 'function') {\n            var v = String(sc.get('agg_server') || '').replace(/\\/+$/, '');\n            if (v) return v;\n        }\n    } catch (e0) {}\n    return _DP_SERVER;\n}\nvar _dpBidCache = {};          \nvar _dpCatCache = {};          \n\nfunction _dpFlat(s) {\n    try { s = String(s == null ? '' : s); } catch (e0) { s = ''; }\n    try { s = s.split('').join(''); } catch (e1) {}\n    return s;\n}\nfunction _dpFlatHd(hd) {\n    var out = {};\n    try { for (var k in hd) { out[_dpFlat(k)] = _dpFlat(hd[k]); } } catch (e) { return hd; }\n    return out;\n}\n\nfunction _dpToast(jav, msg) {\n    if (!_DP_DEBUG) return;\n    try { jav.toast(msg); } catch (e) {}\n}\n\nfunction _dpT2S(jav, s) {\n    var v = String(s == null ? '' : s);\n    if (!v) return v;\n    try { var r = jav.t2s(v); if (r) return String(r); } catch (e) {}\n    return v;\n}\nfunction _dpGetJson(jav, url, headers) {\n    try {\n        var r = jav.get(url, headers);\n        var body = String(r.body() || '');\n        if (!body) return null;\n        return JSON.parse(body);\n    } catch (e) { _DP_NET_ERR = String(e); return null; }\n}\nfunction _dpIsHtmlBlock(t) {\n    return /<(p|br|div|h[1-6])[\\s>\\/]/i.test(String(t == null ? '' : t));\n}\n\nfunction _dpPlainText(s) {\n    return String(s == null ? '' : s)\n        .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n        .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n        .replace(/<br\\s*\\/?>/gi, '\\n')\n        .replace(/<\\/p>/gi, '\\n')\n        .replace(/<\\/div>/gi, '\\n')\n        .replace(/<[^>]*>/g, '')\n        .replace(/&nbsp;/gi, ' ')\n        .replace(/&ldquo;/gi, '“').replace(/&rdquo;/gi, '”')\n        .replace(/&hellip;/gi, '…').replace(/&mdash;/gi, '—')\n        .replace(/&amp;/gi, '&').replace(/&lt;/gi, '<')\n        .replace(/&gt;/gi, '>').replace(/&quot;/gi, '\"')\n        .replace(/&#\\d+;/g, ' ');\n}\nfunction _dpInjectServer(t, nm, au, cn, jav) {\n    try {\n        var plain = _dpIsHtmlBlock(t) ? _dpPlainText(t) : t;\n        var body = 'name=' + encodeURIComponent(nm)\n                 + '&author=' + encodeURIComponent(au)\n                 + '&chapter=' + encodeURIComponent(cn)\n                 + '&text=' + encodeURIComponent(plain)\n                 + '&hot=' + ((_dpSegCardOn(jav) || _dpEndCardOn(jav)) ? '1' : '0')\n                 + '&bubble=' + (_dpBubbleOn(jav) ? '1' : '0')\n                 + '&segcard=' + (_dpSegCardOn(jav) ? '1' : '0')\n                 + '&endcard=' + (_dpEndCardOn(jav) ? '1' : '0')\n                 + '&theme=' + _dpTheme(jav);\n        var r = '';\n        try {\n            var _resp = jav.post(_dpSrv() + '/qqdp/inline', body,\n                {\"Content-Type\": \"application/x-www-form-urlencoded;charset=utf-8\"});\n            r = String(_resp.body() || '');\n        } catch (e4) {\n            try {\n                r = String(jav.post(_dpSrv() + '/qqdp/inline', body, {}).body() || '');\n            } catch (e5) { r = ''; }\n        }\n        if (r.length > 80 && r.indexOf('qqShowCmt(') >= 0) {\n            var n = (r.match(/qqShowCmt\\(/g) || []).length;\n            if (_DP_DEBUG_OK) _dpToast(jav, '段评:服务器通道' + n + '个');\n            return r;\n        }\n        if (!_DP_LAST_FAIL) {\n            _DP_LAST_FAIL = '服务器:未注入(len=' + r.length\n                + (plain && r === plain ? ' 原样返回' : '') + ')';\n        }\n        return '';\n    } catch (e) {\n        if (!_DP_LAST_FAIL) _DP_LAST_FAIL = '服务器:异常 ' + e;\n        return '';\n    }\n}\n\nfunction __dpInject(txt, nm, au, cn, jav, ck, bko, chapter) {\n    var t = String(txt == null ? '' : txt);\n    function _reIllu(x) {\n        try { return __dpIllu(x, bko, chapter, jav); } catch (eI2) { return x; }\n    }\n    try {\n        t = _dpFitImgs(t);\n        try { t = __dpIllu(t, bko, chapter, jav); } catch (eIllu) {}  \n        _dpSetCtx(jav, bko, _dpScopeChapter());\n        var bubbleOn = true, segCardOn = true, endCardOn = true;\n        try { bubbleOn = _dpBubbleOn(jav); } catch (eSO) {}\n        try { segCardOn = _dpSegCardOn(jav); } catch (eSO2) {}\n        try { endCardOn = _dpEndCardOn(jav); } catch (eHO2) {}\n        if (bko && nm) { try { _dpRegBook(_dpSrcOf(jav), nm, bko.bookUrl ? String(bko.bookUrl) : ''); } catch (eR0) {} }\n        if (!bubbleOn && !segCardOn && !endCardOn) { return t; }\n        if (t.length < 80) return t;\n        if (t.indexOf('qqShowCmt(') >= 0) return t;\n        if (t.indexOf('</p>') < 0 && /<p[\\s>]/i.test(t)) {\n            t = t.replace(/<p([^>]*)>/gi, '</p><p$1>').replace(/^(<\\/p>)+/i, '') + '</p>';\n        }\n        nm = _dpT2S(jav, nm);\n        au = _dpT2S(jav, au);\n        cn = _dpT2S(jav, cn);\n        if (!cn) {\n            try {\n                var mm = t.replace(/^[\\s\\u3000]+/, '').match(/^(第[0-9一二三四五六七八九十百千两零]{1,12}[章节回卷集篇][^\\n]{0,24})/);\n                if (mm) cn = mm[1];\n            } catch (e0) {}\n        }\n        if (!nm || !cn) { _dpToast(jav, '段评:缺名 nm=' + nm + ' cn=' + cn); return t; }\n\n        _DP_NET_ERR = '';\n        var srv = _dpInjectServer(t, nm, au, cn, jav);\n        if (srv) return _reIllu(srv);\n\n        _dpToast(jav, '段评:服务器未取到(' + _DP_LAST_FAIL + ')');\n        return _reIllu(t);\n    } catch (e) { _dpToast(jav, '段评:异常 ' + e); return txt; }\n}\n\n\nvar _JJ_SERVER = 'http://43.139.147.103:8070';  \nfunction _dpDpSrv(ovr){\n    try {\n        var s = _dpSrcOf(_dpJv());\n        if (s && typeof s.get === 'function') {\n            var v = String(s.get(ovr || 'jj_server') || '');\n            if (v) return v.replace(/\\/+$/, '');\n        }\n    } catch (e) {}\n    return _JJ_SERVER;\n}\nfunction _dpDpShow(jv, url) {\n    var cfg = JSON.stringify({\n        \"expandedCornersRadius\": 20, \"dismissOnTouchOutside\": true, \"isDraggable\": true,\n        \"shouldDimBackground\": true, \"backgroundDimAmount\": 0.5, \"hardwareAccelerated\": true,\n        \"isNestedScrollingEnabled\": true, \"isGestureInsetBottomIgnored\": true,\n        \"setFitToContents\": true, \"isHideable\": true, \"heightPercentage\": 0.8\n    });\n    var html = '';\n    try { html = String(jv.ajax(url) || ''); } catch (eA) {}\n    if (html && html.indexOf('<!DOCTYPE html>') >= 0) {\n        try { jv.showBrowser(url, html, '', cfg); return true; } catch (eB) {}\n    }\n    try { jv.showBrowser(url, null, null, cfg); return true; } catch (eB2) {}\n    try { jv.startBrowser(url, '段评'); } catch (eC) {}\n    return false;\n}\nfunction _jjSrv() {\n    try { return _dpDpSrv('jj_server'); } catch (e) { return _JJ_SERVER; }\n}\nfunction jjShowCmt(nid, cid, para, cnt, pt64) {\n    var jv = null;\n    try { if (this && this.java) jv = this.java; } catch (e) {}\n    if (!jv) jv = _dpJv();\n    if (!jv) return;\n    try {\n        nid = _dpFlat(nid); cid = _dpFlat(cid); para = _dpFlat(para);\n        if (!nid || !cid) { try { jv.toast('段评参数缺失'); } catch (e0) {} return; }\n        if (!para) para = '1';\n        var tq = '';\n        try { tq = encodeURIComponent(_dpFlat(pt64)); } catch (eT) {}\n        var host = _JJ_SERVER;\n        try { host = _jjSrv(); } catch (eH) {}\n        _dpDpShow(jv, host + '/jj/review?nid=' + encodeURIComponent(nid) +\n                       '&cid=' + encodeURIComponent(cid) +\n                       '&para=' + encodeURIComponent(para) +\n                       '&size=50&fmt=html' + (tq ? '&pt=' + tq : ''));\n    } catch (eAll) {\n        try { jv.toast('段评打开失败：' + eAll); } catch (eT2) {}\n    }\n}\nfunction sqShowCmt(bid, cid, para, cnt, pt64) {\n    var jv = null;\n    try { if (this && this.java) jv = this.java; } catch (e) {}\n    if (!jv) jv = _dpJv();\n    if (!jv) return;\n    bid = _dpFlat(bid); cid = _dpFlat(cid); para = _dpFlat(para);\n    if (!bid || !cid) { try { jv.toast('段评参数缺失'); } catch (e0) {} return; }\n    if (!para) para = 'p001';\n    var pq = encodeURIComponent(para);\n    var tq = '';\n    try { tq = encodeURIComponent(_dpFlat(pt64)); } catch (eT) {}\n    _dpDpShow(jv, _JJ_SERVER + '/shuqi/review?bid=' + encodeURIComponent(bid) +\n                   '&cid=' + encodeURIComponent(cid) +\n                   '&pid=' + pq + '&para=' + pq + '&size=50&fmt=html' +\n                   (tq ? '&pt=' + tq : ''));\n}\n\nfunction qqShowCmt(bid, cid, segId, csrf, q, qdBid, qdCid, name, author, ch) {\n    var jv = null;\n    try { if (this && this.java) jv = this.java; } catch (e) {}\n    if (!jv) jv = _dpJv();          \n    if (!jv) return;\n    bid = _dpFlat(bid); cid = _dpFlat(cid); segId = _dpFlat(segId); csrf = _dpFlat(csrf);\n    q = _dpFlat(q); qdBid = _dpFlat(qdBid); qdCid = _dpFlat(qdCid);\n    name = _dpFlat(name); author = _dpFlat(author); ch = _dpFlat(ch);\n    if (arguments.length >= 10) { _dpShowServer(jv, bid, cid, segId, csrf, q, qdBid, qdCid, name, author, ch); }\n    else if (arguments.length >= 6) { _dpShowServer(jv, bid, cid, segId, csrf, q, qdBid, qdCid, '', '', ''); }\n    else { _dpShowServer(jv, '0', '0', segId, csrf, '', bid, cid, '', '', ''); }\n}\n\nfunction _dpFailCode() {\n    var d = '';\n    try { d = _dpFlat(_DP_QD_DIAG || ''); } catch (e1) {}\n    if (d) return d.replace(/\\s+/g, ' ').slice(0, 70);\n    try { if (_DP_NET_ERR) return ('网络 ' + _dpFlat(_DP_NET_ERR)).replace(/\\s+/g, ' ').slice(0, 70); } catch (e2) {}\n    try { if (!_DP_CSRF) return '未拿到 csrf'; } catch (e3) {}\n    return '本章无数据返回';\n}\n\nfunction _dpShowServer(jv, bid, cid, para, uuid, q, qdBid, qdCid, name, author, ch) {\n    var url = _dpSrv() + '/qqdp/para?bid=' + bid + '&cid=' + cid + '&offset=' + para;\n    if (uuid) { url += '&uuid=' + uuid; }\n    if (q) { url += '&q=' + encodeURIComponent(q); }\n    if (qdBid && qdCid) { url += '&qd_bid=' + qdBid + '&qd_cid=' + qdCid; }\n    if (name) { url += '&name=' + name; }\n    if (author) { url += '&author=' + author; }\n    if (ch) { url += '&ch=' + ch; }\n    var html = '';\n    try { html = String(jv.ajax(url) || ''); } catch (eA) {}\n    if (html) {\n        try {\n            var cfg = JSON.stringify({\n                \"expandedCornersRadius\": 20,\n                \"dismissOnTouchOutside\": true,\n                \"isDraggable\": true,\n                \"shouldDimBackground\": true,\n                \"backgroundDimAmount\": 0.5,\n                \"hardwareAccelerated\": true,\n                \"isNestedScrollingEnabled\": true,\n                \"isGestureInsetBottomIgnored\": true,\n                \"setFitToContents\": true,\n                \"isHideable\": true,\n                \"heightPercentage\": 0.8\n            });\n            jv.showBrowser(url, html, '', cfg);\n            return;\n        } catch (eB) {}\n    }\n    try { jv.startBrowser(url, '段评'); } catch (eC) {\n        try { jv.toast('段评加载失败: ' + _dpFailCode()); } catch (eD) {}\n    }\n}\nvar _DP3_SRVS = ['http://43.139.147.103:8070', 'http://43.139.147.103'];\ntry {\n    var _dpSrvV = _dpSrv();\n    if (_dpSrvV) {\n        _DP3_SRVS = [_dpSrvV];\n        if (_dpSrvV.indexOf(':8070') < 0) _DP3_SRVS.push('http://43.139.147.103:8070');\n    }\n} catch (eSrv) {}\nvar _DP3_SRV_OK = '';\nvar _DP3_CACHE = {};\nvar _DP3_BAD = null;\nvar _DP3_TTL = 3600 * 1000;\nvar _DP3_MISS_TTL = 6 * 3600 * 1000;\nvar _DP3_BUDGET = 45000;         \nvar _DP3_MAX_TRY = 3;            \nvar _DP3_TO_SEARCH = 20000;      \nvar _DP3_TO_BOOK = 15000;        \nvar _DP3_TO_TOC = 40000;         \nvar _DP3_TO_CHAPTER = 35000;     \n\nfunction _dp3Try(jav, path, src, to) {\n    var order = [], i;\n    if (_DP3_SRV_OK) order.push(_DP3_SRV_OK);\n    for (i = 0; i < _DP3_SRVS.length; i++) {\n        if (_DP3_SRVS[i] !== _DP3_SRV_OK) order.push(_DP3_SRVS[i]);\n    }\n    for (i = 0; i < order.length; i++) {\n        var body = '';\n        try {\n            var r = jav.get(order[i] + path, null, to || 8000);   \n            if (r) body = String(r.body() || '');\n        } catch (e0) { body = ''; }\n        if (!body) { try { body = String(jav.ajax(order[i] + path) || ''); } catch (e1) { body = ''; } }\n        if (!body || body.length < 2) continue;\n        try {\n            var j = JSON.parse(body);\n            if (j) { _DP3_SRV_OK = order[i]; return j; }\n        } catch (e2) {  }\n    }\n    return null;\n}\n\nfunction _dp3TryUrl(jav, url, to) {\n    var body = '';\n    try {\n        var r = jav.get(url, null, to || 8000);   \n        if (r) body = String(r.body() || '');\n    } catch (e0) { body = ''; }\n    if (!body) { try { body = String(jav.ajax(url) || ''); } catch (e1) { body = ''; } }\n    if ((!body || body.length < 3) && _DP3_SRV_OK) {\n        var alt = String(url).replace(/^https?:\\/\\/[^\\/]+/, _DP3_SRV_OK);\n        try { body = String(jav.ajax(alt) || ''); } catch (e2) { body = ''; }\n    }\n    if (!body) return null;\n    try { return JSON.parse(body); } catch (e3) { return null; }\n}\n\nfunction _dp3Norm(s) {\n    return String(s == null ? '' : s)\n        .replace(/[\\s\\u3000]+/g, '')\n        .replace(/[：:，,。.、！!？?；;（）()《》〈〉【】\\[\\]\"\"''—\\-_|]/g, '')\n        .toLowerCase();\n}\n\nfunction _dp3Cn2int(s) {\n    var D = { '零': 0, '〇': 0, '一': 1, '壹': 1, '二': 2, '两': 2, '贰': 2, '三': 3, '叁': 3,\n              '四': 4, '肆': 4, '五': 5, '伍': 5, '六': 6, '陆': 6, '七': 7, '柒': 7, '八': 8, '捌': 8,\n              '九': 9, '玖': 9 };\n    var U = { '十': 10, '拾': 10, '百': 100, '佰': 100, '千': 1000, '仟': 1000, '万': 10000 };\n    var total = 0, section = 0, num = -1, seen = false;\n    for (var i = 0; i < s.length; i++) {\n        var c = s.charAt(i);\n        if (D[c] !== undefined) { num = D[c]; seen = true; }\n        else if (U[c] !== undefined) {\n            var u = U[c];\n            if (u >= 10000) { section = (section + (num < 0 ? 0 : num)) * u; total += section; section = 0; num = -1; }\n            else { section += (num < 0 ? 1 : num) * u; num = -1; }\n            seen = true;\n        } else { return NaN; }\n    }\n    if (!seen) return NaN;\n    return total + section + (num < 0 ? 0 : num);\n}\n\nfunction _dp3Seq(name) {\n    var s = String(name == null ? '' : name).replace(/[\\s\\u3000]+/g, '');\n    var m = s.match(/第\\s*([0-9]{1,10})\\s*[章节回节话]/);\n    if (m) return parseInt(m[1], 10);\n    m = s.match(/第\\s*([零〇一壹二两贰三叁四肆五伍六陆七柒八捌九玖十拾百佰千仟万]{1,12})\\s*[章节回节话]/);\n    if (m) { var v = _dp3Cn2int(m[1]); if (!isNaN(v)) return v; }\n    m = s.match(/^\\s*([0-9]{1,10})[\\.、,，:：]/);\n    if (m) return parseInt(m[1], 10);\n    return NaN;\n}\n\n\n\n\n\n\n\n\nfunction _dp3Get(src, k) {\n    if (!src) return null;\n    try { var v = src.get(k); if (v !== undefined && v !== null && String(v) !== '') return String(v); } catch (e) {}\n    try {\n        var all = src.getVariable();\n        if (all) {\n            var o = JSON.parse(String(all));\n            if (o && o[k] !== undefined && o[k] !== null && String(o[k]) !== '') return String(o[k]);\n        }\n    } catch (e2) {}\n    return null;\n}\nfunction _dp3Put(src, k, v) {\n    if (!src) return;\n    try { src.put(k, String(v)); return; } catch (e) {}\n    try { src.putVariable(k, String(v)); } catch (e2) {}\n}\n\n\nfunction _dpBody(raw) {\n    var h = String(raw == null ? '' : raw);\n    if (!h || h.length < 200) return h;\n    try {\n        var mm = h.match(/<script id=\"vite-plugin-ssr_pageContext\"[^>]*>([\\s\\S]*?)<\\/script>/i);\n        if (mm) {\n            var ci = null;\n            try { ci = JSON.parse(mm[1]).pageContext.pageProps.pageData.chapterInfo; } catch (eJ) {}\n            var ct = ci ? String(ci.content == null ? '' : ci.content) : '';\n            if (_dpTxtLen(ct) > 60) return ct;\n        }\n    } catch (e1) {}\n    try {\n        var pi = h.search(/<div[^>]*class=\"[^\"]*\\bprint\\b[^\"]*\"[^>]*>/i);\n        if (pi >= 0) {\n            var seg = h.slice(pi).replace(/^<div[^>]*>/i, '');\n            seg = _dpCutDiv(seg)\n                    .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n                    .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n                    .replace(/<h1[^>]*>[\\s\\S]*?<\\/h1>/i, '');\n            if (_dpTxtLen(seg) > 60) return seg;\n        }\n    } catch (e2) {}\n    return h;\n}\n\nfunction _dpFitImgs(t) {\n    var s = String(t == null ? '' : t);\n    if (!s || s.indexOf('<img') < 0) return s;\n    var vh = _DP_IMG_VH;\n    try {\n        if (!vh) vh = 55;\n        var v = _dp3Get(_dpSrcOf(_dpJv()), 'dpimgvh');\n        if (v) { var n = parseInt(v, 10); if (!isNaN(n) && n >= 15 && n <= 100) vh = n; }\n    } catch (e0) {}\n    var css = 'max-width:100%;height:auto;max-height:' + vh + 'vh;object-fit:contain;';\n    try {\n        return s.replace(/<img\\b([^>]*)>/gi, function (m0, a) {\n            if (/max-height\\s*:/i.test(a)) return m0;\n            if (/\\sstyle\\s*=\\s*\"/i.test(a)) {\n                return '<img' + a.replace(/(\\sstyle\\s*=\\s*\")([^\"]*)\"/i, '$1$2;' + css + '\"') + '>';\n            }\n            return '<img' + a + ' style=\"' + css + '\">';\n        });\n    } catch (e1) { return s; }\n}\n\nfunction _dpTxtLen(s) {\n    try { return String(s == null ? '' : s).replace(/<[^>]*>/g, '').replace(/[\\s\\u3000]/g, '').length; }\n    catch (e) { return 0; }\n}\n\nfunction _dpCutDiv(s) {\n    var d = 0, re = /<div\\b[^>]*>|<\\/div\\s*>/gi, m;\n    while ((m = re.exec(s)) !== null) {\n        if (m[0].charAt(1) === '/') { d--; if (d <= 0) return s.slice(0, m.index); }\n        else d++;\n    }\n    return s;\n}\n\n\nfunction _dpMeta(h, prop) {\n    try {\n        var re = /<meta\\b[^>]*>/gi, m;\n        while ((m = re.exec(String(h))) !== null) {\n            var tag = m[0];\n            if (tag.indexOf(prop) < 0) continue;\n            var c = tag.match(/content\\s*=\\s*([\"'])([\\s\\S]*?)\\1/i);\n            if (c) return c[2];\n        }\n    } catch (e) {}\n    return '';\n}\n\nfunction _dpBookIntro(h, baseUrl, jav, bko) {\n    _dpSetCtx(jav, bko, _dpScopeChapter());\n    var o = _dpMeta(h, 'og:description');\n    if (!o) {\n        try {\n            var m = String(h).match(/<p[^>]*class=\"[^\"]*summary__content[^\"]*\"[^>]*>([\\s\\S]*?)<\\/p>/i);\n            if (m) o = _dpPlainText(m[1]).replace(/[\\s\\u3000]+/g, ' ').replace(/^ | $/g, '');\n        } catch (e1) {}\n    }\n    if (!o) {\n        o = _dpMeta(h, 'name=\"description\"');\n        if (o) o = o.replace(/^[^,]*?,已更新\\s*\\d+\\s*章[、,：:]?\\s*最新章节[：:]?/, '');\n    }\n    return o;\n}\n\nfunction _dpBooks(src) {\n    try {\n        var v = _dp3Get(src, 'dp3books');\n        if (v) { var a = JSON.parse(String(v)); if (a && a.length) return a; }\n    } catch (e) {}\n    return [];\n}\n\nfunction _dpBid(u) {\n    try { var m = String(u || '').match(/\\/book\\/(\\d+)/); if (m) return m[1]; } catch (e) {}\n    return '';\n}\n\nfunction _dpRegBook(src, name, bookUrl) {\n    if (!src || !name) return;\n    try {\n        var bid = _dpBid(bookUrl), old = _dpBooks(src), out = [{ n: String(name), b: bid }], i;\n        for (i = 0; i < old.length && out.length < 40; i++) {\n            if (String(old[i].n) === String(name)) continue;\n            out.push({ n: String(old[i].n), b: String(old[i].b || '') });\n        }\n        if (old.length && String(old[0].n) === String(name) && String(old[0].b || '') === bid) return;\n        _dp3Put(src, 'dp3books', JSON.stringify(out));\n    } catch (e) {}\n}\n\nfunction _dpExploreFill(r) {\n    try {\n        if (!r || r.u) return r;\n        var bid = String(r.bid == null ? '' : r.bid);\n        var q = String(r.dp3q == null ? '' : r.dp3q);\n        r.u = 'https://m.qidian.com/book/' + bid + '/?dp3q=' + q;\n        r.c = 'https://bookcover.yuewen.com/qdbimg/349573/' + bid + '/180';\n    } catch (e0) {}\n    return r;\n}\n\nfunction _dpExploreList(baseUrl, result, jav) {\n    var body = String(result == null ? '' : result);\n    try { _dpSetCtx(jav, null, null); } catch (eS0) {}\n    try {\n        if (String(baseUrl || '').indexOf('dp3panel') >= 0) {\n            return JSON.stringify({ data: { records: [] } });\n        }\n    } catch (e1) {}\n    try {\n        var jd = JSON.parse(body);\n        if (jd && jd.disc === true) {\n            return JSON.stringify({ data: { records: (jd.records || []) } });\n        }\n    } catch (eD) {}\n    try {\n        var j = JSON.parse(body);\n        var r = j && j.data && j.data.records;\n        if (r && r.length) {\n            var keep = [];\n            for (var i = 0; i < r.length; i++) {\n                if (!r[i]) continue;\n                if (r[i].dp3q === undefined) r[i].dp3q = '';\n                if (String(r[i].bAuth || '') === 'VIP补章源') continue;   \n                _dpExploreFill(r[i]);   \n                keep.push(r[i]);\n            }\n            return JSON.stringify({ data: { records: keep } });\n        }\n    } catch (e2) {}\n    return body;\n}\n\n\n\n\n\n\n\nfunction _dpGradeIsAdult(src) {\n    return false;\n}\nfunction _dpGradeSet(jav, on) {\n    on = false;\n    try { _dp3Put(_dpSrcOf(jav), 'dp_adult', '0'); } catch (e) {}\n    var upd = {};\n    upd[\"lu_grade_n\"] = (on ? \"○ \" : \"◉ \") + \"📖 正常小说\";\n    upd[\"lu_grade_a\"] = (on ? \"◉ \" : \"○ \") + \"🔞 成人小说\";\n    try { jav.upLoginData(upd); } catch (eU) {}\n    try {\n        jav.toast('📖 已切回正常小说（成人内容已迁至独立入口）');\n    } catch (e2) {}\n    try { jav.refreshExplore(); } catch (e4) {}\n    return '已切换：📖 正常小说（成人内容已迁至独立入口）';\n}\nfunction _dpGradeRows(jav) {\n    return [];\n}\nfunction _dpGradePick(v) {\n    var jv = null;\n    try { if (this && this.java) jv = this.java; } catch (e0) {}\n    if (!jv) { try { if (typeof java !== 'undefined' && java) jv = java; } catch (e1) {} }\n    var on = String(v == null ? '' : v).indexOf('成人') >= 0;\n    return _dpGradeSet(jv, on);\n}\n\nfunction _dpLuRow(name, label, action, dynLabel, basis) {\n    var r = {\n        name: name, type: \"button\",\n        style: {\n            layout_flexGrow: 1,\n            layout_flexBasisPercent: (basis == null ? 0.45 : basis)\n        }\n    };\n    r.viewName = dynLabel ? String(label) : (\"'\" + String(label).replace(/'/g, \"\") + \"'\");\n    if (action) r.action = action;\n    return r;\n}\n\n\n\nfunction _dpSegOn(jav) {\n    var src = _dpSrcOf(jav);\n    var v = _dp3Get(src, 'dp_seg_on');\n    if (v === null) return true;\n    return v !== '0';\n}\nfunction _dpHotOn(jav) {\n    var src = _dpSrcOf(jav);\n    var v = _dp3Get(src, 'dp_hot_on');\n    if (v === null) return true;\n    return v !== '0';\n}\nfunction _dpFineGet(jav, key, legacy) {\n    var src = _dpSrcOf(jav);\n    var v = _dp3Get(src, key);\n    if (v !== null && v !== '') return v !== '0';\n    return legacy;\n}\nfunction _dpBubbleOn(jav)  { return _dpFineGet(jav, 'dp_bubble_on',  _dpSegOn(jav)); }\nfunction _dpSegCardOn(jav) { return _dpFineGet(jav, 'dp_segcard_on', _dpSegOn(jav) && _dpHotOn(jav)); }\nfunction _dpEndCardOn(jav) { return _dpFineGet(jav, 'dp_endcard_on', _dpHotOn(jav)); }\n\nfunction _dpSwMark(on) { return (on ? \"◉ \" : \"○ \"); }\nfunction _dpBubbleLabel(on)  { return _dpSwMark(on) + \"💬 段评气泡\"; }\nfunction _dpSegCardLabel(on) { return _dpSwMark(on) + \"🔥 段神评卡\"; }\nfunction _dpEndCardLabel(on) { return _dpSwMark(on) + \"📌 章末大卡\"; }\nfunction _dpSwMigrate(jav) {\n    try {\n        var src = _dpSrcOf(jav);\n        var b = _dp3Get(src, 'dp_bubble_on'), s = _dp3Get(src, 'dp_segcard_on'), e = _dp3Get(src, 'dp_endcard_on');\n        if (b !== null && b !== '' && s !== null && s !== '' && e !== null && e !== '') return;\n        _dp3Put(src, 'dp_bubble_on',  _dpBubbleOn(jav)  ? '1' : '0');\n        _dp3Put(src, 'dp_segcard_on', _dpSegCardOn(jav) ? '1' : '0');\n        _dp3Put(src, 'dp_endcard_on', _dpEndCardOn(jav) ? '1' : '0');\n    } catch (eM) {}\n}\nfunction _dpSwAllOn(jav) {\n    try { return (_dpBubbleOn(jav) && _dpSegCardOn(jav) && _dpEndCardOn(jav)) ? true : false; }\n    catch (e) { return true; }\n}\nfunction _dpToggleOne(jav, key, name, onGet, labelFn, onMsg, offMsg) {\n    _dpSwMigrate(jav);\n    var src = _dpSrcOf(jav);\n    var on = onGet(jav);\n    _dp3Put(src, key, on ? '0' : '1');\n    var upd = {};\n    upd[name] = labelFn(!on);\n    _dpLuDone(jav, on ? offMsg : onMsg, upd);\n    return String(on ? offMsg : onMsg).split('（')[0];\n}\nfunction _dpToggleBubbleSw(jav) {\n    return _dpToggleOne(jav, 'dp_bubble_on', 'tog_bubble', _dpBubbleOn, _dpBubbleLabel,\n        '已开启段评气泡（正文段尾小气泡），重新打开本章生效',\n        '已关闭段评气泡（热评卡不受影响），重新打开本章生效');\n}\nfunction _dpToggleSegCardSw(jav) {\n    return _dpToggleOne(jav, 'dp_segcard_on', 'tog_segcard', _dpSegCardOn, _dpSegCardLabel,\n        '已开启段神评卡（段内热评大卡），重新打开本章生效',\n        '已关闭段神评卡（气泡不受影响），重新打开本章生效');\n}\nfunction _dpToggleEndCardSw(jav) {\n    return _dpToggleOne(jav, 'dp_endcard_on', 'tog_endcard', _dpEndCardOn, _dpEndCardLabel,\n        '已开启章末大卡（本章说/神评论），重新打开本章生效',\n        '已关闭章末大卡（气泡不受影响），重新打开本章生效');\n}\nvar _DP_CARD_THEMES = ['white', 'night', 'black', 'jade', 'kraft', 'wood'];\nvar _DP_CARD_THEME_LABEL = {\n    white: '☀️ 白露', night: '🌙 夜间', black: '⚫ 纯黑',\n    jade: '🍃 青竹', kraft: '📜 牛皮纸', wood: '🪵 木纹'\n};\nfunction _dpCardThemeNorm(v) {\n    var t = String(v == null ? '' : v).replace(/^\\s+|\\s+$/g, '').toLowerCase();\n    if (t === 'light') return 'white';          \n    if (t === 'dark') return 'night';\n    for (var i = 0; i < _DP_CARD_THEMES.length; i++) {\n        if (_DP_CARD_THEMES[i] === t) return t;\n    }\n    return 'white';                             \n}\nfunction _dpCardThemeLabel(t) {\n    return _DP_CARD_THEME_LABEL[_dpCardThemeNorm(t)] || _DP_CARD_THEME_LABEL.white;\n}\nfunction _dpTheme(jav) {\n    try {\n        var src = _dpSrcOf(jav);\n        var v = _dp3Get(src, 'dp_card_theme');\n        if (v !== null && String(v) !== '') return _dpCardThemeNorm(v);\n        var old = _dp3Get(src, 'dp_theme');\n        if (old !== null && String(old) !== '') return _dpCardThemeNorm(old);\n        return 'white';\n    } catch (eT) { return 'white'; }\n}\nfunction _dpToggleTheme(jav) {\n    var src = _dpSrcOf(jav);\n    var now = _dpTheme(jav);\n    var idx = 0;\n    for (var i = 0; i < _DP_CARD_THEMES.length; i++) {\n        if (_DP_CARD_THEMES[i] === now) { idx = i; break; }\n    }\n    var next = _DP_CARD_THEMES[(idx + 1) % _DP_CARD_THEMES.length];\n    _dp3Put(src, 'dp_card_theme', next);\n    _dp3Put(src, 'dp_theme', next);\n    var upd = {};\n    upd[\"tog_theme\"] = \"◉ 🎨 卡片配色：\" + _dpCardThemeLabel(next);\n    _dpLuDone(jav, '卡片配色：' + _dpCardThemeLabel(next) + '（重新打开本章生效）', upd);\n    return '卡片配色：' + _dpCardThemeLabel(next);\n}\n\n\nfunction _dpDpSrcGet(jav) {\n    try {\n        var s = _dpSrcOf(jav);\n        var v = String(_dp3Get(s, 'dp_dpsrc') || '').toLowerCase();\n        return (v === 'qq') ? 'qq' : 'qd';\n    } catch (e) { return 'qd'; }\n}\nfunction _dpDpSrcLabel(k) {\n    return (String(k) === 'qq') ? 'QQ阅读段评' : '起点段评';\n}\nfunction _dpDpSrcRows(jav) {\n    var cur = _dpDpSrcGet(jav);\n    return [\n        _dpLuRow(\"tog_dp_head\", \"↓   段评通道   ↓\", null, false, 1),\n        _dpLuRow(\"tog_dpsrc\", \"◉ 🔄 段评切换：\" + _dpDpSrcLabel(cur), \"_dpToggleDpSrc(java)\", false, 1)\n    ];\n}\nfunction _dpToggleDpSrc(jav) {\n    var s = _dpSrcOf(jav);\n    var now = _dpDpSrcGet(jav);\n    var next = (now === 'qq') ? 'qd' : 'qq';\n    _dp3Put(s, 'dp_dpsrc', next);\n    var got = next;\n    try {\n        var r = String(jav.ajax(_dpSrv() + '/qqdp/dpsrc?src=' + next) || '');\n        var o = JSON.parse(r);\n        if (o && o.pref) { got = String(o.pref); }\n    } catch (e1) {}\n    if (got !== next) { _dp3Put(s, 'dp_dpsrc', got); }\n    var upd = {};\n    upd[\"tog_dpsrc\"] = \"◉ 🔄 段评切换：\" + _dpDpSrcLabel(got);\n    _dpLuDone(jav, '段评已切换到：' + _dpDpSrcLabel(got), upd);\n    return '';\n}\n\nfunction _dpSegHotRows(jav) {\n    var rows = [];\n    rows.push(_dpLuRow(\"tog_head\", \"↓   段评   ↓\", null, false, 1));\n    rows.push(_dpLuRow(\"tog_bubble\", _dpBubbleLabel(_dpBubbleOn(jav)), \"_dpToggleBubbleSw(java)\", false, 1));\n    rows.push(_dpLuRow(\"tog_segcard\", _dpSegCardLabel(_dpSegCardOn(jav)), \"_dpToggleSegCardSw(java)\", false, 1));\n    rows.push(_dpLuRow(\"tog_endcard\", _dpEndCardLabel(_dpEndCardOn(jav)), \"_dpToggleEndCardSw(java)\", false, 1));\n    rows.push(_dpLuRow(\"tog_theme\", \"◉ 🎨 卡片配色：\" + _dpCardThemeLabel(_dpTheme(jav)),\n        \"_dpToggleTheme(java)\", false, 1));\n    try {\n        var _dpRows = _dpDpSrcRows(jav);\n        for (var _dpi = 0; _dpi < _dpRows.length; _dpi++) rows.push(_dpRows[_dpi]);\n    } catch (eDP) {}\n    return rows;\n}\n\nfunction _dpLuFallback() {\n    try {\n        return JSON.stringify([\n            _dpLuRow(\"lu_hint\", \"↓   账号登录   ↓\", null, false, 1),\n            _dpLuRow(\"lu_fqweb\", \"🍅 番茄账号登录\", \"_dpFqWebLogin(java, (typeof cookie!==\\\"undefined\\\"?cookie:null))\", false, 0.45),\n            _dpLuRow(\"lu_login\", \"📖 起点网页登录\", \"_dpLuLogin(java, \\\"\\\")\", false, 0.45),\n            _dpLuRow(\"lu_tip\", \"部分设置暂不可用，账号登录仍可继续\", null, false, 1)\n        ]);\n    } catch (e) { return \"[]\"; }\n}\n\n\n\nfunction _dpLuDone(jav, msg, upd) {\n    try { jav.toast(msg); } catch (e) {}\n    if (upd) { try { jav.upLoginData(upd); } catch (e0) {} }\n    try { jav.refreshContent(); } catch (e2) {}\n}\n\n\n\n\n\n\n\n\nfunction _dpLuLogin(jav, url) {\n    try {\n        var jv = _dpJv(jav);\n        var u = String(url || '');\n        if (!u) { try { var s = _dpSrcOf(jv); if (s && s.loginUrl) u = String(s.loginUrl); } catch (e0) {} }\n        if (!u) u = 'https://ptlogin.qidian.com/login';\n        try { jv.startBrowser(u, '登录起点'); return ''; } catch (e1) {}\n        try { if (jv && jv.showBrowser) jv.showBrowser(u); } catch (e2) {}\n    } catch (e) { try { jav.toast('打开登录页失败：' + (e && e.message ? e.message : e)); } catch (e3) {} }\n    return '';\n}\n\nfunction _dpFqAuthBase(jav) {\n    try { if (_DP3_SRV_OK) return String(_DP3_SRV_OK).replace(/\\/+$/, ''); } catch (e0) {}\n    try { if (_DP3_SRVS && _DP3_SRVS.length) return String(_DP3_SRVS[0]).replace(/\\/+$/, ''); } catch (e1) {}\n    return _dpSrv();\n}\n\n\n\nfunction _dpFqAuthLogin(jav) {\n    try {\n        var jv = _dpJv(jav);\n        var u = _dpFqAuthBase(jv) + '/fq/auth/login';\n        try { jv.startBrowser(u, '番茄登录/续期'); return ''; } catch (e1) {}\n        try { if (jv && jv.showBrowser) jv.showBrowser(u); } catch (e2) {}\n    } catch (e) { try { jav.toast('打开番茄登录页失败：' + (e && e.message ? e.message : e)); } catch (e3) {} }\n    return '';\n}\n\n\n\nvar _DP_FQ_GRAB_CHAN = '';\n\nfunction _dpFqCookieGet(jv, tag, ckObj) {\n    var v = '';\n    try {\n        if (ckObj && typeof ckObj.getCookie === 'function') v = String(ckObj.getCookie(tag) || '');\n    } catch (e0) { v = ''; }\n    if (!v) {\n        try {\n            if (typeof cookie !== 'undefined' && cookie && typeof cookie.getCookie === 'function') {\n                v = String(cookie.getCookie(tag) || '');\n            }\n        } catch (e1) { v = ''; }\n    }\n    if (!v && jv) {\n        try { if (typeof jv.getCookie === 'function') v = String(jv.getCookie(tag) || ''); } catch (e2) { v = ''; }\n    }\n    if (!v && jv) {\n        try {\n            if (typeof jv.getCookieStore === 'function') {\n                var st = jv.getCookieStore();\n                if (st && typeof st.getCookie === 'function') v = String(st.getCookie('https://' + tag + '/') || '');\n            }\n        } catch (e3) { v = ''; }\n    }\n    return v;\n}\n\nfunction _dpFqGrabCookie(jav, ckObj) {\n    var jv = _dpJv(jav);\n    var PREF = ['fanqienovel.com', 'www.fanqienovel.com', 'm.fanqienovel.com'];\n    var REST = ['fqnovel.com', 'reading.snssdk.com', 'snssdk.com', 'bytedance.com'];\n    var chan = [];\n    var SESS = /(?:^|;\\s*)(?:sessionid|sessionid_ss|sid_guard|sid_tt|sid_ucp_v1|ssid_ucp_v1)=/;\n\n    function merge(list) {\n        var bag = {}, order = [], i, j, m;\n        for (i = 0; i < list.length; i++) {\n            var c = _dpFqCookieGet(jv, list[i], ckObj);\n            if (!c) continue;\n            chan.push(list[i] + '(' + c.length + ')');\n            var parts = c.split(';');\n            for (j = 0; j < parts.length; j++) {\n                var kv = String(parts[j]).replace(/^\\s+|\\s+$/g, '');\n                if (!kv || kv.indexOf('=') < 0) continue;\n                var k = kv.split('=')[0];\n                if (k && !bag[k]) { bag[k] = kv; order.push(k); }\n            }\n        }\n        var out = [];\n        for (m = 0; m < order.length; m++) out.push(bag[order[m]]);\n        return out.join('; ');\n    }\n\n    var s1 = merge(PREF);\n    if (SESS.test(s1)) {\n        try { _DP_FQ_GRAB_CHAN = chan.join(', '); } catch (eA) {}\n        return s1;\n    }\n    var s2 = merge(REST);\n    var all = (s1 && s2) ? (s1 + '; ' + s2) : (s1 || s2);\n    try { _DP_FQ_GRAB_CHAN = chan.join(', ') || '(空)'; } catch (eB) {}\n    return SESS.test(all) ? all : '';\n}\n\nfunction _dpFqGrabSave(jav, ckObj) {\n    try {\n        var jv = _dpJv(jav);\n        var ck = _dpFqGrabCookie(jv, ckObj);\n        if (!ck) {\n            try { jv.toast('❌ 没抓到登录态 Cookie —— 已打开诊断页'); } catch (e0) {}\n            try { _dpFqDiag(jv); } catch (eD) {}\n            return '';\n        }\n        var base = _dpFqAuthBase(jv);\n        var txt = '', how = '';\n        var tries = [];\n\n        try {\n            var enc = '';\n            try { enc = encodeURIComponent(ck); } catch (eE) { enc = ck; }\n        var u = base + '/fq/auth/setq?switch=1&ck=' + enc;\n            txt = String(jv.ajax(u, 20000) || '');\n            how = 'S1 GET /fq/auth/setq';\n        } catch (e1) { txt = ''; tries.push('S1:' + (e1 && e1.message ? e1.message : e1)); }\n\n        if (!txt) {\n            try {\n                var p2 = JSON.stringify({ Cookie: ck });\n                txt = String(jv.post(base + '/fq/auth/set', p2,\n                    { 'Content-Type': 'application/json;charset=utf-8' }, 20000).body() || '');\n                how = 'S2 POST /fq/auth/set';\n            } catch (e2) { txt = ''; tries.push('S2:' + (e2 && e2.message ? e2.message : e2)); }\n        }\n\n        if (!txt) {\n            try {\n                var p3 = JSON.stringify({ Cookie: ck });\n                txt = String(jv.post(base + '/fq/auth/set', p3, {}, 20000).body() || '');\n                how = 'S3 POST(空headers)';\n            } catch (e3) { txt = ''; tries.push('S3:' + (e3 && e3.message ? e3.message : e3)); }\n        }\n\n        var ok = false, msg = '', tail = '';\n        try {\n            var o = JSON.parse(txt);\n            ok = !!o.ok;\n            if (ok) {\n                msg = o.user || o.probe || '';\n                var stt = o.status || {};\n                var dl = (stt.days_left === null || stt.days_left === undefined) ? null : stt.days_left;\n                if (dl !== null) tail = '（剩 ' + dl + ' 天）';\n            } else {\n                msg = o.err || '';\n            }\n        } catch (e4) {}\n        try { jv.toast(ok ? ('✅ 番茄凭证已保存 · ' + msg + tail) : ('❌ 保存失败：' + (msg || '服务器无响应'))); } catch (e5) {}\n        if (ok) {\n            try { if (jv.refreshContent) jv.refreshContent(); } catch (e7) {}\n        } else {\n            try {\n                var d = _dpFqDiagText(jv);\n                d += '\\n\\n--- 本次上传 ---\\n抓取通道: ' + String(_DP_FQ_GRAB_CHAN || '(无)')\n                   + '\\nCookie 长度: ' + ck.length\n                   + '\\n上传策略: ' + (how || '(三条全失败)')\n                   + '\\n策略报错: ' + (tries.join(' | ') || '(无)')\n                   + '\\n服务器返回: ' + (txt || '(空)');\n                _dpFqShowDiag(jv, '❌ 保存失败 · 诊断', d);\n            } catch (e8) {}\n        }\n    } catch (e) { try { jav.toast('抓取失败：' + (e && e.message ? e.message : e)); } catch (e9) {} }\n    return '';\n}\n\nfunction _dpFqWebLogin(jav, ckObj) {\n    var jv = _dpJv(jav);\n    var opened = false;\n    try {\n        if (jv && typeof jv.startBrowserAwait === 'function') {\n            jv.startBrowserAwait('https://fanqienovel.com/', '番茄登录（登录完成后返回）');\n            opened = true;\n        }\n    } catch (e1) { opened = false; }\n    if (!opened) {\n        try { return _dpFqAuthLogin(jv); } catch (e2) {}\n        try { if (jv && jv.toast) jv.toast('无法打开番茄登录页，请检查书源服务器连接'); } catch (e3) {}\n        return '';\n    }\n    try { return _dpFqGrabSave(jv, ckObj); } catch (e4) { return ''; }\n}\n\nfunction _dpFqCookieHosts() {\n    return [\n        'https://fanqienovel.com', 'https://fanqienovel.com/',\n        'https://www.fanqienovel.com', 'https://www.fanqienovel.com/',\n        'https://m.fanqienovel.com', 'https://m.fanqienovel.com/',\n        'https://reading.snssdk.com', 'https://reading.snssdk.com/',\n        'https://api5-normal-sinfonlineb.fqnovel.com', 'https://api5-normal-sinfonlineb.fqnovel.com/',\n        'https://api.fqnovel.com', 'https://api.fqnovel.com/',\n        'https://fqnovel.com', 'https://fqnovel.com/',\n        'https://sso.snssdk.com', 'https://sso.snssdk.com/',\n        'https://passport.snssdk.com', 'https://passport.snssdk.com/',\n        'https://snssdk.com', 'https://snssdk.com/',\n        'https://sso.bytedance.com', 'https://sso.bytedance.com/',\n        'https://bytedance.com', 'https://bytedance.com/',\n        'https://www.bytedance.com', 'https://www.bytedance.com/'\n    ];\n}\n\nfunction _dpFqShowDiag(jav, title, lines) {\n    var jv = _dpJv(jav);\n    var esc = String(lines == null ? '' : lines)\n        .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n    var html = '<!DOCTYPE html><html><head><meta charset=\"utf-8\">'\n        + '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">'\n        + '<style>body{background:#f5f6f8;color:#1f2328;margin:0;padding:14px;'\n        + 'font:14px/1.6 -apple-system,\"PingFang SC\",\"Microsoft YaHei\",sans-serif}'\n        + 'h2{font-size:17px;margin:0 0 10px}pre{background:#1f2328;color:#e8eaed;padding:12px;'\n        + 'border-radius:9px;font-size:11.5px;line-height:1.55;white-space:pre-wrap;word-break:break-all}</style>'\n        + '</head><body><h2>' + title + '</h2><pre>' + esc + '</pre></body></html>';\n    try { jv.startBrowser('https://fanqienovel.com/', title, html); return true; } catch (e0) {}\n    try { if (jv.showBrowser) { jv.showBrowser('https://fanqienovel.com/', html, '', ''); return true; } } catch (e1) {}\n    return false;\n}\n\nfunction _dpFqDiagText(jav) {\n    var jv = _dpJv(jav), L = [], ck = null, err = '', i;\n    L.push('java 对象          : ' + (jv ? 'OK' : 'NULL'));\n    L.push('java.getCookieStore: ' + !!(jv && jv.getCookieStore)\n        + '   ← Legado JS 里没有这个 API，false 是正常的，不是故障');\n    try { ck = (jv && jv.getCookieStore) ? jv.getCookieStore() : null; } catch (e0) { err = String(e0 && e0.message ? e0.message : e0); }\n    L.push('CookieStore 实例   : ' + (ck ? 'OK' : 'NULL') + (err ? ('  err=' + err) : ''));\n    L.push('java.getCookie()   : ' + !!(jv && typeof jv.getCookie === 'function'));\n    L.push('store.getCookie()  : ' + !!(ck && typeof ck.getCookie === 'function'));\n    L.push('store.getKey()     : ' + !!(ck && typeof ck.getKey === 'function'));\n    L.push('');\n    L.push('--- 各域名 Cookie（最多显示 180 字）---');\n    var hosts = _dpFqCookieHosts(), nonEmpty = 0;\n    for (i = 0; i < hosts.length; i++) {\n        var v = '';\n            try { v = String(ck && ck.getCookie ? (ck.getCookie(hosts[i]) || '') : ''); } catch (e2) { v = 'ERR:' + (e2 && e2.message); }\n        if (v && v.indexOf('ERR:') !== 0) nonEmpty++;\n        L.push((v ? '[有] ' : '[空] ') + hosts[i] + '  =>  ' + (v ? (v.length + ' 字符  ' + v.slice(0, 180)) : ''));\n    }\n    L.push('');\n    L.push('非空域名数: ' + nonEmpty + ' / ' + hosts.length);\n    var merged = _dpFqGrabCookie(jv);\n    L.push('合并后长度: ' + merged.length);\n    L.push('合并内容  : ' + (merged || '(空)'));\n    L.push('');\n    L.push('--- 服务端 ---');\n    var base = _dpFqAuthBase(jv);\n    L.push('base = ' + base);\n    var st = null;\n    try { st = _dp3Try(jv, '/fq/auth/status?test=1', null, 8000); } catch (e3) {}\n    L.push('status = ' + (st ? JSON.stringify(st) : '(取不到)'));\n    return L.join('\\n');\n}\n\nfunction _dpFqDiag(jav) {\n    try {\n        var jv = _dpJv(jav);\n        var txt = _dpFqDiagText(jv);\n        if (!_dpFqShowDiag(jv, '🔍 番茄凭证抓取诊断', txt)) {\n            try { jv.toast(txt.slice(0, 400)); } catch (e1) {}\n        }\n    } catch (e) { try { jav.toast('诊断失败：' + (e && e.message ? e.message : e)); } catch (e2) {} }\n    return '';\n}\n\n\n\n\n\nfunction _dpLuList(bko, jav) {\n    var rows = [];\n    jav = _dpJv(jav);\n    try {\n        rows.push(_dpLuRow(\"lu_login_head\", \"↓   账号登录   ↓\", null, false, 1));\n        rows.push(_dpLuRow(\"lu_fqweb\", \"🍅 番茄账号登录\", \"_dpFqWebLogin(java, (typeof cookie!==\\\"undefined\\\"?cookie:null))\", false, 0.45));\n        rows.push(_dpLuRow(\"lu_login\", \"📖 起点网页登录\", \"_dpLuLogin(java, \\\"\\\")\", false, 0.45));\n        try { rows = rows.concat(_dpGradeRows(jav)); } catch (eG0) {}\n        try { rows = rows.concat(_dpSegHotRows(jav)); } catch (eS0) {}\n        return JSON.stringify(rows);\n    } catch (e) {\n        try { return _dpLuFallback(); } catch (e2) { return \"[]\"; }\n    }\n}\n\n\n\n\n\n\n\nfunction __qpCsrf(jav, ck, src) {\n    var K = 'qp_csrf', TTL = 12 * 3600 * 1000, tok = '';\n    var now = 0; try { now = new Date().getTime(); } catch (e) { now = 0; }\n    try { if (_QP_CSRF && _QP_CSRF.t && (now - _QP_CSRF.t) < TTL) return _QP_CSRF.v; } catch (e0) {}\n    try {\n        var raw = src ? String(src.get(K) || '') : '';\n        if (raw) {\n            var o = JSON.parse(raw);\n            if (o && o.t && (now - o.t) < TTL && o.v) return String(o.v);\n        }\n    } catch (e1) {}\n    try { tok = String(ck.getKey('https://qidian.com', '_csrfToken') || ''); } catch (e2) { tok = ''; }\n    if (!tok) {\n        var urls = ['https://m.qidian.com/rank/', 'https://m.qidian.com/free/', 'https://m.qidian.com/'];\n        for (var i = 0; i < urls.length && !tok; i++) {\n            var r = null;\n            try { r = jav.get(urls[i], null, 15000); } catch (e3) { r = null; }\n            if (!r) continue;\n            try { tok = String(r.cookie('_csrfToken') || ''); } catch (e4) { tok = ''; }\n            if (!tok) {\n                var hh = '';\n                try { hh = String(r.headers() || ''); } catch (e5) { hh = ''; }\n                try { hh += '|' + String(r.headers().values('Set-Cookie').join('|') || ''); } catch (e5b) { hh = ''; }\n                var m1 = hh.match(/_csrfToken=([0-9a-fA-F\\-]{16,})/);\n                if (m1) tok = m1[1];\n            }\n            if (!tok) {\n                var bd = '';\n                try { bd = String(r.body() || ''); } catch (e6) { bd = ''; }\n                var m2 = bd.match(/_csrfToken[\"']?\\s*[:=]\\s*[\"']?([0-9a-fA-F\\-]{16,})/);\n                if (m2) tok = m2[1];\n            }\n        }\n    }\n    if (tok) {\n        try { _QP_CSRF = { t: now, v: tok }; } catch (e7) {}\n        try { if (src) src.put(K, JSON.stringify({ t: now, v: tok })); } catch (e8) {}\n    }\n    return tok;\n}\nvar _QP_CSRF = null;\n\n\n\n\nfunction _dpCtx() {\n    var o = { java: null, book: null, chapter: null };\n    try { if (typeof java !== 'undefined' && java) o.java = java; } catch (e1) {}\n    try { if (typeof book !== 'undefined' && book) o.book = book; } catch (e2) {}\n    try { if (typeof chapter !== 'undefined' && chapter) o.chapter = chapter; } catch (e3) {}\n    try { if (!o.java && this && this.java) o.java = this.java; } catch (e4) {}\n    try { if (!o.book && this && this.book) o.book = this.book; } catch (e5) {}\n    try { if (!o.chapter && this && this.chapter) o.chapter = this.chapter; } catch (e6) {}\n    if (!o.java) o.java = _dpJv();\n    try { if (!o.book && _DP_BK) o.book = _DP_BK; } catch (e7) {}\n    try { if (!o.chapter && _DP_CH) o.chapter = _DP_CH; } catch (e8) {}\n    return o;\n}\n\nfunction _dpBookName(b) {\n    try { if (b && b.name) return String(b.name).trim(); } catch (e) {}\n    return '';\n}\n\nfunction _dpBGet(b, k) {\n    if (!b || typeof b.getVariable !== 'function') return '';\n    try { var v = b.getVariable(k); return (v === undefined || v === null) ? '' : String(v); } catch (e) {}\n    return '';\n}\nfunction _dpBPut(b, k, v) {\n    if (!b || typeof b.putVariable !== 'function') return;\n    try { b.putVariable(k, String(v == null ? '' : v)); } catch (e) {}\n}\n\nfunction _dpSrcOf(jv) {\n    try {\n        if (jv) {\n            var s = null;\n            try { if (typeof jv.getSource === 'function') s = jv.getSource(); } catch (e0) {}\n            if (s && typeof s.get === 'function') return s;\n            if (typeof jv.get === 'function' && typeof jv.put === 'function') return jv;\n        }\n    } catch (e) {}\n    return null;\n}\n\nfunction _dpCandKey() { return 'dp3cands_'; }\nfunction _dpCandGet(b, src) {\n    var k = _dpCandKey() + _dpBookName(b);\n    var s = src ? (_dp3Get(src, k) || '') : '';\n    if (!s) s = _dpBGet(b, 'dp3cands');\n    if (!s) return null;\n    try { var a = JSON.parse(String(s)); if (a && a.length) return a; } catch (e) {}\n    return null;\n}\nfunction _dpCandSet(b, src, arr) {\n    var s = '';\n    try { s = JSON.stringify(arr); } catch (e1) { return; }\n    _dpBPut(b, 'dp3cands', s);\n    if (src) { try { _dp3Put(src, _dpCandKey() + _dpBookName(b), s); } catch (e2) {} }\n}\n\nfunction _dpPickGet(b) {\n    var s = _dpBGet(b, 'dp3pick');\n    if (!s) return null;\n    try { var o = JSON.parse(s); if (o && o.i) return o; } catch (e) {}\n    return null;\n}\nfunction _dpPickSave(c, it) {\n    var b = c.book, jv = c.java, k = _dpBookName(b);\n    var o = { i: it.i, u: it.u, n: it.n || '' };\n    _dpBPut(b, 'dp3pick', JSON.stringify(o));\n    _dpBPut(b, 'dp3cur', String(o.n || ''));\n    _dpBPut(b, 'dp3err', '');\n    var s = _dpSrcOf(jv);\n    if (s) { try { _dp3Put(s, 'dp3_' + k, JSON.stringify({ i: o.i, u: o.u })); } catch (e4) {} }\n    _dpBPut(b, 'dp3miss_' + k, '');\n    if (s) { try { _dp3Put(s, 'dp3miss_' + k, ''); } catch (e6) {} }\n    try { delete _DP3_CACHE['dp3miss_' + k]; } catch (e7) {}\n    try { if (k) _DP3_CACHE[k] = { i: o.i, u: o.u }; } catch (e5) {}\n    return o;\n}\nfunction _dpPickClear(c) {\n    var b = c.book, jv = c.java, k = _dpBookName(b);\n    _dpBPut(b, 'dp3pick', '');\n    _dpBPut(b, 'dp3cur', '');\n    _dpBPut(b, 'dp3err', '');\n    var s = _dpSrcOf(jv);\n    if (s) {\n        try { _dp3Put(s, 'dp3_' + k, ''); } catch (e1) {}\n        try { _dp3Put(s, 'dp3miss_' + k, ''); } catch (e2) {}\n    }\n    try { delete _DP3_CACHE['dp3miss_' + k]; } catch (e3) {}\n}\n\nfunction _dp3SrcName(r) {\n    try {\n        var t = String(r.intro || '');\n        var m = t.match(/来自\\s*[:：]\\s*([^\\]\\s|]+)/);\n        if (m && m[1]) return String(m[1]).trim();\n        var lc = String(r.lastChapter || '');\n        var p = lc.split(/[:：]/);\n        if (p.length > 1 && p[0] && p[0].length <= 12) return String(p[0]).trim();\n        var bu = String(r.bookUrl || '');\n        var mu = bu.match(/[?&]u=([^&]+)/);\n        if (mu) {\n            var u = decodeURIComponent(mu[1]);\n            var md = u.match(/^https?:\\/\\/([^\\/]+)/);\n            if (md) return md[1];\n        }\n    } catch (e) {}\n    return '';\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction _dpAggHost() {\n    try { if (_DP3_SRV_OK) return _DP3_SRV_OK; } catch (e0) {}\n    try { if (_DP3_SRVS && _DP3_SRVS.length) return _DP3_SRVS[0]; } catch (e1) {}\n    return _dpSrv();\n}\n\nfunction __dpIllu(txt, book, chapter, jav) {\n    var t = String(txt == null ? '' : txt);\n    try {\n        function _dec(s) {\n            s = String(s == null ? '' : s);\n            try { return decodeURIComponent(s); } catch (e) { return s; }\n        }\n\n        var ch = chapter;\n        if (!ch) { try { ch = _dpCtx().chapter; } catch (eCtx) {} }\n        if (!ch) { try { ch = _DP_CH; } catch (eCh) {} }\n        var bk = book;\n        if (!bk) { try { bk = _dpCtx().book; } catch (eBk) {} }\n\n        var bid = '';\n        try {\n            var bu = _dec(bk && bk.bookUrl ? String(bk.bookUrl) : '');\n            var m0 = bu.match(/book\\/(\\d+)/) || bu.match(/[?&]bid=(\\d+)/)\n                     || bu.match(/bookId=(\\d+)/);\n            if (m0) bid = m0[1];\n        } catch (eB) {}\n        var cid = '';\n        try {\n            var cu = _dec(ch && (ch.url || ch.chapterUrl) ? String(ch.url || ch.chapterUrl) : '');\n            var m1 = cu.match(/chapter\\/(\\d+)\\/(\\d+)/)\n                     || cu.match(/chapterId=(\\d+)/)\n                     || cu.match(/(\\d{6,})\\/?$/)\n                     || cu.match(/\\/(\\d{5,})\\/?$/);\n            if (m1) cid = m1.length > 2 ? m1[2] : m1[1];\n            if (!cid) {\n                var m2 = cu.match(/\\/(\\d{6,})(?:\\/|$)/g);\n                if (m2 && m2.length) {\n                    var last = m2[m2.length - 1].replace(/\\//g, '');\n                    if (last && last !== bid) cid = last;\n                }\n            }\n        } catch (eC) {}\n        if (!cid && t) {\n            try {\n                var m3 = t.match(/chapterId[\"'\\s:=]+(\\d{6,})/);\n                if (m3) cid = m3[1];\n            } catch (eS) {}\n        }\n        if (!bid || !cid) {\n            try {\n                var _aq = (__dpIllu._aggQd || {})[String(_dpAggCur(ch, ''))];\n                if (_aq) { if (!bid) bid = _aq.bid; if (!cid) cid = _aq.cid; }\n            } catch (eAq) {}\n        }\n        if (!cid) {\n            try { _DP_ILLU_DIAG = 'no-cid'; } catch (eD) {}\n            return t;\n        }\n        var kk = (bid || '?') + '_' + cid;\n        try { if (__dpIllu._seen === undefined) __dpIllu._seen = {}; } catch (eInit) {}\n\n        if (t.indexOf('class=\"dp-illu\"') >= 0) {\n            try { _DP_ILLU_DIAG = 'skip: already injected'; } catch (eD1) {}\n            return t;\n        }\n\n        var payload = null;\n        if (__dpIllu._seen[kk] !== undefined) {\n            payload = __dpIllu._seen[kk];\n        } else {\n            var host = _dpAggHost();\n            var url = host + '/api/illu?bid=' + encodeURIComponent(bid)\n                            + '&cid=' + encodeURIComponent(cid);\n            var body = '', _netOK = false;\n            try {\n                var _r1 = jav.get(url, {}, 25000);\n                if (_r1) { body = String(_r1.body() || ''); _netOK = true; }\n            } catch (e0) {\n                try {\n                    var _r2 = jav.get(url, {}, 25000);\n                    if (_r2) { body = String(_r2.body() || ''); _netOK = true; }\n                } catch (e1) { _netOK = false; }\n            }\n            body = String(body || '').replace(/^\\s+|\\s+$/g, '');\n            if (body && body.charAt(0) === '{') {\n                try { payload = JSON.parse(body); } catch (eJ) { payload = null; }\n            }\n            if (!payload) {\n                payload = { ok: false, hit: false, items: [] };\n            }\n            if (_netOK) { try { __dpIllu._seen[kk] = payload; } catch (eS0) {} }\n        }\n        var items = (payload && payload.items) ? payload.items : [];\n        try {\n            _DP_ILLU_DIAG = 'bid=' + bid + ' cid=' + cid + ' items=' + items.length;\n        } catch (eD2) {}\n        if (!items.length) return t;\n\n        function _norm(s) {\n            return String(s == null ? '' : s)\n                .replace(/[\\s\\u3000]+/g, '')\n                .replace(/[\\u2018\\u2019\\u201c\\u201d\\u300c\\u300d\\u300e\\u300f]/g, '\"')\n                .replace(/[\\u2026]+/g, '\\u2026')\n                .replace(/[\\u2014\\u2015]+/g, '\\u2014');\n        }\n        var txtN = '', srcArr = [];\n        (function () {\n            var i = 0, n = t.length;\n            while (i < n) {\n                var c = t.charAt(i);\n                if (c === '\\u2026') {\n                    var j1 = i; while (j1 < n && t.charAt(j1) === '\\u2026') j1++;\n                    txtN += '\\u2026'; srcArr.push(i); i = j1; continue;\n                }\n                if (c === '\\u2014' || c === '\\u2015') {\n                    var j2 = i; while (j2 < n && (t.charAt(j2) === '\\u2014' || t.charAt(j2) === '\\u2015')) j2++;\n                    txtN += '\\u2014'; srcArr.push(i); i = j2; continue;\n                }\n                if (/[\\s\\u3000]/.test(c)) { i++; continue; }\n                if (/[\\u2018\\u2019\\u201c\\u201d\\u300c\\u300d\\u300e\\u300f]/.test(c)) {\n                    txtN += '\"'; srcArr.push(i); i++; continue;\n                }\n                txtN += c; srcArr.push(i); i++;\n            }\n        })();\n\n        function _posOf(endNorm) {\n            var posRaw = srcArr[endNorm];\n            if (posRaw === undefined) return -1;\n            var ch0 = t.charAt(posRaw);\n            if (ch0 === '\\u2026') {\n                var jj = posRaw; while (jj < t.length && t.charAt(jj) === '\\u2026') jj++;\n                posRaw = jj - 1;\n            } else if (ch0 === '\\u2014' || ch0 === '\\u2015') {\n                var jj2 = posRaw; while (jj2 < t.length && (t.charAt(jj2) === '\\u2014' || t.charAt(jj2) === '\\u2015')) jj2++;\n                posRaw = jj2 - 1;\n            }\n            var pos = posRaw + 1;   \n            var TAILCH = '\\u3002\\uff01\\uff1f\\uff1b\\uff0c\\u2026\\u2014\"\\'\\u201d\\u2019)\\uff09]\\u3011\\u300b\\u300d\\u300f}> \\t\\r\\n\\u3000';\n            while (pos < t.length && TAILCH.indexOf(t.charAt(pos)) >= 0) pos++;\n            if (t.substr(pos, 4) === '</p>') pos += 4;\n            return pos;\n        }\n        function _endsOf(anchorBefore) {\n            var a = _norm(anchorBefore), res = [], from = 0, guard = 0;\n            if (a.length < 4) return res;          \n            while (guard++ < 64) {\n                var ip = txtN.indexOf(a, from);\n                if (ip < 0) break;\n                var p = _posOf(ip + a.length - 1);\n                if (p >= 0) res.push(p);\n                from = ip + 1;\n            }\n            if (!res.length) {\n                var tail = a.slice(-8), tp = txtN.indexOf(tail);\n                if (tp >= 0) { var q1 = _posOf(tp + tail.length - 1); if (q1 >= 0) res.push(q1); }\n            }\n            if (!res.length) {\n                var head = a.slice(0, 8), hp = txtN.indexOf(head);\n                if (hp >= 0) { var q2 = _posOf(hp + head.length - 1); if (q2 >= 0) res.push(q2); }\n            }\n            return res;\n        }\n        function _findEnd(anchorBefore, refRaw) {\n            var res = _endsOf(anchorBefore);\n            if (!res.length) return -1;\n            if (refRaw >= 0 && res.length > 1) {\n                var best = res[0], bd = Math.abs(res[0] - refRaw);\n                for (var i = 1; i < res.length; i++) {\n                    var d = Math.abs(res[i] - refRaw);\n                    if (d < bd) { bd = d; best = res[i]; }\n                }\n                return best;\n            }\n            return res[0];\n        }\n\n        var _AD_RE = /下载本站免费小说阅读器|手机浏览器扫码下载|随时随地免费看小说|本章有错误|推荐本书|加入书架|投推荐票|收藏本站|手机浏览器访问|打开手机阅读|返回书架|最新网址|浏览器打开|点击安装|继续阅读|作者的话|作者有话说|作者感言|先更后改|求月票|求推荐票|求订阅|求票|ps[:：]|PS[:：]/;\n        function _segBounds() {\n            var bs = [], re = /<p[^>]*>|<\\/p\\s*>|\\r?\\n/g, m2;\n            var cur = 0;\n            while ((m2 = re.exec(t)) !== null) {\n                bs.push({ start: cur, end: m2.index });\n                cur = m2.index + m2[0].length;\n            }\n            bs.push({ start: cur, end: t.length });\n            return bs;\n        }\n        function _findByParaEnd(n) {\n            if (!(n > 0)) return -1;\n            var bs = _segBounds(), cnt = 0;\n            for (var i = 0; i < bs.length; i++) {\n                var s = t.slice(bs[i].start, bs[i].end)\n                    .replace(/<[^>]*>/g, '').replace(/&nbsp;/g, ' ');\n                s = s.replace(/^\\s+|\\s+$/g, '');\n                if (!s) continue;\n                if (s.length >= 4 && _AD_RE.test(s)) continue;\n                cnt++;\n                if (cnt === n) return bs[i].end;\n            }\n            return -1;\n        }\n\n        var plan = [];\n        for (var ii = 0; ii < items.length; ii++) {\n            var it = items[ii] || {};\n            var anc = it.anchor || {};\n            var at = -1;\n            var paraRef = (anc.para > 0) ? _findByParaEnd(anc.para) : -1;\n            if (anc.before) at = _findEnd(anc.before, paraRef);\n            if (at < 0 && anc.after) {\n                var an = _norm(anc.after), ap = -1, from2 = 0, g2 = 0;\n                while (g2++ < 64) {\n                    var h2 = txtN.indexOf(an, from2);\n                    if (h2 < 0) break;\n                    var p3 = srcArr[h2];\n                    if (p3 !== undefined && (ap < 0\n                            || (paraRef >= 0 && Math.abs(p3 - paraRef) < Math.abs(ap - paraRef)))) {\n                        ap = p3;\n                    }\n                    if (ap >= 0 && paraRef < 0) break;\n                    from2 = h2 + 1;\n                }\n                at = ap;\n            }\n            if (at < 0) at = paraRef;\n            if (at < 0) {\n                try { _DP_ILLU_DIAG += ' drop@' + ii; } catch (eDd) {}\n                continue;\n            }\n            plan.push({ at: at, html: it.html });\n        }\n        if (!plan.length) {\n            return t;\n        }\n\n        plan.sort(function (a, b) { return a.at - b.at; });\n        var out = '', last = 0;\n        for (var pi = 0; pi < plan.length; pi++) {\n            var p = plan[pi];\n            var cut = (p.at < last) ? last : p.at;\n            var seg = t.slice(last, cut);\n            if (seg && !/[\\r\\n]$/.test(seg)) seg += '\\n';\n            out += seg;\n            out += '<div class=\"dp-illu\">' + p.html + '</div>';\n            last = cut;\n        }\n        var rest = t.slice(last);\n        if (rest && !/^[\\r\\n]/.test(rest) && !/^\\s*$/.test(rest)) {\n            out += '\\n';\n        }\n        out += rest;\n        return out;\n    } catch (e) {\n        try { _DP_ILLU_DIAG = 'err ' + (e && e.message ? e.message : String(e)); } catch (eD3) {}\n        return t;\n    }\n}\n\nfunction _dpIsAgg(u) {\n    return /\\/api\\/(?:book|toc|chapter)\\?/i.test(String(u == null ? '' : u));\n}\nfunction _dpAggI(u) { var m = String(u == null ? '' : u).match(/[?&]i=(\\d+)/); return m ? m[1] : ''; }\nfunction _dpAggU(u) { var m = String(u == null ? '' : u).match(/[?&]u=([^&]+)/); return m ? decodeURIComponent(m[1]) : ''; }\nfunction _dpAggSwUrl(url, jav) {\n    var b = true, s = true, e = true, t = 'white';\n    try { b = _dpBubbleOn(jav); } catch (e0) {}\n    try { s = _dpSegCardOn(jav); } catch (e1) {}\n    try { e = _dpEndCardOn(jav); } catch (e2) {}\n    try { t = _dpTheme(jav); } catch (e3) {}\n    return url + (url.indexOf('?') >= 0 ? '&' : '?')\n        + 'bubble=' + (b ? '1' : '0')\n        + '&segcard=' + (s ? '1' : '0')\n        + '&endcard=' + (e ? '1' : '0')\n        + '&theme=' + t;\n}\nfunction _dpAggApi(kind, i, u) {\n    return _dpAggHost() + '/api/' + kind + '?i=' + i + '&u=' + encodeURIComponent(u);\n}\nfunction _dpAggCur(chapter, baseUrl) {\n    var a = '';\n    try { a = chapter ? String(chapter.url || '') : ''; } catch (e0) {}\n    if (!_dpIsAgg(a)) { try { a = chapter ? String(chapter.baseUrl || '') : ''; } catch (e1) {} }\n    if (!_dpIsAgg(a)) { try { a = String(baseUrl || ''); } catch (e2) {} }\n    return a;\n}\nfunction _dpAggWant(chapter, baseUrl) { return _dpIsAgg(_dpAggCur(chapter, baseUrl)); }\nfunction _dpAggStripIntro(s) {\n    return String(s == null ? '' : s).replace(/^\\s*\\[来自\\s*[:：][^\\]]*\\]\\s*/, '').trim();\n}\nfunction _dpStripTags(s) {\n    return String(s == null ? '' : s).replace(/<[^>]*>/g, '').replace(/&nbsp;/g, ' ').trim();\n}\n\nfunction _dpQdSearchItems(h) {\n    var out = [], i, parts = String(h == null ? '' : h).split('<div class=\"y-list__item\"');\n    for (i = 1; i < parts.length; i++) {\n        var seg = parts[i];\n        var mb = seg.match(/data-bid=\"(\\d+)\"/);\n        if (!mb) continue;\n        var mn = seg.match(/<h2[^>]*class=\"[^\"]*_searchBookName[^\"]*\"[^>]*>([\\s\\S]*?)<\\/h2>/i);\n        var name = mn ? _dpStripTags(mn[1]) : '';\n        if (!name) { var mt = seg.match(/\\btitle=\"([^\"]*?)在线阅读\"/); if (mt) name = mt[1]; }\n        if (!name) continue;\n        var ma = seg.match(/<p[^>]*class=\"[^\"]*_searchBookAuthor[^\"]*\"[^>]*>([\\s\\S]*?)<\\/p>/i);\n        var mi = seg.match(/<p[^>]*class=\"[^\"]*_searchBookDesc[^\"]*\"[^>]*>([\\s\\S]*?)<\\/p>/i);\n        var mk = seg.match(/<div[^>]*class=\"[^\"]*_tags[^\"]*\"[^>]*>([\\s\\S]*?)<\\/div>/i);\n        var mc = seg.match(/<img[^>]*class=\"[^\"]*_bookImg[^\"]*\"[^>]*>/i);\n        var cover = '';\n        if (mc) { var md = mc[0].match(/data-src=\"([^\"]+)\"/); if (md) cover = md[1]; }\n        if (cover.indexOf('//') === 0) cover = 'https:' + cover;\n        var kindTxt = mk ? _dpStripTags(mk[1]) : '';\n        var wcTxt = '';\n        if (mk) {\n            try {\n                var mws = String(mk[1]).match(/([\\d]+(?:\\.[\\d]+)?)\\s*(万)?字/);\n                if (mws) {\n                    wcTxt = mws[1] + (mws[2] ? '万' : '') + '字';\n                    kindTxt = kindTxt.replace(/[\\d]+(?:\\.[\\d]+)?\\s*万?字/g, '')\n                                     .replace(/\\s{2,}/g, ' ').replace(/^\\s+|\\s+$/g, '');\n                }\n            } catch (eW) { }\n        }\n        out.push({\n            name: name,\n            author: ma ? _dpStripTags(ma[1]) : '',\n            intro: mi ? _dpStripTags(mi[1]) : '',\n            kind: kindTxt,\n            coverUrl: cover,\n            lastChapter: '',\n            wordCount: wcTxt,\n            bookUrl: 'https://m.qidian.com/book/' + mb[1] + '/'\n        });\n    }\n    return out;\n}\n\nfunction _dpAggRows(rows, key) {\n    var agg = [], seen = {}, i;\n    for (i = 0; i < rows.length; i++) {\n        var r = rows[i]; if (!r) continue;\n        var bu = String(r.bookUrl || ''); if (!bu) continue;\n        var isQd = /qidian\\.com\\/book\\//.test(bu);\n        var mi = bu.match(/[?&]i=(\\d+)/);\n        if (!isQd && !mi) continue;\n        var nm = String(r.name || '').replace(/^\\s+|\\s+$/g, ''); if (!nm) continue;\n        var _au = String(r.author || '').replace(/^\\s+|\\s+$/g, '');\n        var kk = (isQd ? 'qd' : mi[1]) + '|' + _dp3Norm(nm) + '|' + _dp3Norm(_au);\n        if (seen[kk]) continue;\n        seen[kk] = 1;\n        var kd = String(r.kind || ''), sn = '';\n        if (isQd) {\n            if (kd.indexOf('起点') !== 0) kd = '起点｜' + kd;\n            sn = '起点';\n        } else {\n            try { sn = _dp3SrcName(r); } catch (eS) { }\n            if (!sn) sn = '源' + (mi ? mi[1] : '?');\n            if (kd.indexOf('〔') !== 0) kd = '〔' + sn + '〕' + (kd ? ' ' + kd : '');\n        }\n        var lc = String(r.lastChapter || '').replace(/^\\s+|\\s+$/g, '');\n        agg.push({\n            name: nm,\n            author: String(r.author || ''),\n            intro: _dpAggStripIntro(r.intro),\n            kind: kd,\n            coverUrl: String(r.coverUrl || ''),\n            lastChapter: lc,\n            wordCount: String(r.wordCount || ''),\n            bookUrl: bu\n        });\n    }\n    return agg.slice(0, 60);\n}\n\n\nfunction _dpSearchRows(raw, key, jav, src) {\n    var out = [], i;\n    var _k0 = '';\n    try { _k0 = (typeof key === 'undefined' || key == null) ? '' : String(key); } catch (eK0) { _k0 = ''; }\n    _k0 = _k0.replace(/^\\s+|\\s+$/g, '');\n    try {\n        var _j0 = JSON.parse(String(raw == null ? '' : raw));\n        var _a0 = null;\n        if (Object.prototype.toString.call(_j0) === '[object Array]') _a0 = _j0;\n        else if (_j0 && Object.prototype.toString.call(_j0.list) === '[object Array]') _a0 = _j0.list;\n        else if (_j0 && Object.prototype.toString.call(_j0.data) === '[object Array]') _a0 = _j0.data;\n        if (_a0 && _a0.length) return _dpAggRows(_a0, _k0);\n    } catch (eJ0) { }\n    try { out = _dpQdSearchItems(raw); } catch (eQ) { out = []; }\n    try {\n        if (!_k0) return out;\n        var rows = _dp3Try(jav, '/api/search?key=' + encodeURIComponent(_k0) + '&type=novel', src, _DP3_TO_SEARCH);\n        if (!rows || !rows.length) return out;\n        var agg = _dpAggRows(rows, _k0);\n        for (i = 0; i < agg.length; i++) out.push(agg[i]);\n    } catch (e1) { }\n    return out;\n}\n\n\nfunction _dpInfoFallback(book, field) {\n    try {\n        if (!book) return '';\n        if (field === 'name') return String(book.name || '');\n        if (field === 'author') return String(book.author || '');\n        if (field === 'coverUrl') return String(book.coverUrl || '');\n        if (field === 'kind') return String(book.kind || '');\n    } catch (e) { }\n    return '';\n}\nfunction _dpEpubHit() {\n    for (var i = 0; i < arguments.length; i++) {\n        var s = String(arguments[i] == null ? '' : arguments[i]);\n        if (!s) continue;\n        if (/\\.epub([?#]|$)/i.test(s)) return s.slice(0, 60);\n        if (/(^|[\\s,，;；|/])epub([\\s,，;；|/]|$)/i.test(s)) return s.slice(0, 60);\n    }\n    return '';\n}\nfunction _dpQdWordCount(h) {\n    var s = String(h == null ? '' : h);\n    if (!s) return '';\n    try {\n        var i = s.indexOf('总字数');\n        if (i > 0) {\n            var seg = s.slice(Math.max(0, i - 400), i);\n            var mv = seg.match(/class=\"[^\"]*value[^\"]*\"[^>]*>\\s*([\\d.]+)\\s*</g);\n            if (mv && mv.length) {\n                var lastHtml = mv[mv.length - 1];\n                var mv2 = lastHtml.match(/>\\s*([\\d.]+)\\s*<$/);\n                var val = mv2 ? mv2[1] : '';\n                var after = seg.slice(seg.lastIndexOf(lastHtml) + lastHtml.length);\n                var mu = after.match(/class=\"[^\"]*unit[^\"]*\"[^>]*>\\s*([^<]*?)\\s*</);\n                var u = mu ? mu[1].replace(/\\s/g, '') : '字';\n                if (val) return val + u;\n            }\n        }\n        var m2 = s.match(/([\\d]+(?:\\.[\\d]+)?)\\s*(万)?字/);\n        if (m2) return m2[1] + (m2[2] ? '万' : '') + '字';\n    } catch (e) { }\n    return '';\n}\n\nfunction _dpInfoField(baseUrl, result, jav, book, field) {\n    var u = String(baseUrl == null ? '' : baseUrl);\n    var s = String(result == null ? '' : result);\n    if (_dpIsAgg(u)) {\n        var j = null;\n        try { j = JSON.parse(s); } catch (e0) { j = null; }\n        if (!j || typeof j !== 'object') { try { j = _dp3TryUrl(jav, u, _DP3_TO_BOOK); } catch (e1) { j = null; } }\n        if (!j) return _dpInfoFallback(book, field);\n        var ep = '';\n        try {\n            ep = _dpEpubHit(j.kind, j.format, j.intro, j.downloadUrl, j.lastChapter, j.url);\n        } catch (eE) { ep = ''; }\n        if (ep) { throw new Error('该源返回的是 EPUB 电子书（' + ep + '），不支持在线阅读，请换源'); }\n        if (field === 'intro') {\n            var _bd = _dpAggStripIntro(j.intro) || _dpInfoFallback(book, field);\n            var _sn = '';\n            try { _sn = _dp3SrcName(j); } catch (eS3) { _sn = ''; }\n            return _sn ? ('📖 来源：' + _sn + '\\n\\n' + _bd) : _bd;\n        }\n        var v0 = (j[field] == null ? '' : String(j[field]));\n        return v0 || _dpInfoFallback(book, field);\n    }\n    try {\n        if (field === 'name') {\n            return _dpMeta(s, 'og:title')\n                || _dpStripTags((s.match(/<h1[^>]*>([\\s\\S]*?)<\\/h1>/i) || [, ''])[1])\n                || _dpInfoFallback(book, 'name');\n        }\n        if (field === 'author') {\n            var a = _dpMeta(s, 'og:novel:author');\n            if (!a) { var m1 = s.match(/<a[^>]*class=\"[^\"]*author-link[^\"]*\"[^>]*>([\\s\\S]*?)<\\/a>/i); a = m1 ? _dpStripTags(m1[1]) : ''; }\n            return a || _dpInfoFallback(book, 'author');\n        }\n        if (field === 'kind') return _dpMeta(s, 'og:novel:category') || _dpInfoFallback(book, 'kind');\n        if (field === 'coverUrl') return _dpMeta(s, 'og:image') || _dpInfoFallback(book, 'coverUrl');\n        if (field === 'lastChapter') return _dpMeta(s, 'og:novel:latest_chapter_name');\n        if (field === 'wordCount') return _dpQdWordCount(s);\n        if (field === 'intro') return _dpBookIntro(s, u, jav, book) || _dpInfoFallback(book, 'intro');\n    } catch (e2) {}\n    return '';\n}\n\nfunction _dpTocUrl(baseUrl, result) {\n    var u = String(baseUrl == null ? '' : baseUrl);\n    if (_dpIsAgg(u)) {\n        try {\n            var j = JSON.parse(String(result == null ? '' : result));\n            var t = (j && j.tocUrl) ? String(j.tocUrl) : '';\n            if (t && /\\/api\\/toc\\?/.test(t)) return t;\n        } catch (eT) { }\n        return _dpAggApi('toc', _dpAggI(u), _dpAggU(u));\n    }\n    try { return u.split('?')[0].split('#')[0].replace(/\\/+$/, '') + '/catalog/'; } catch (e) { return u; }\n}\nfunction _dpQdTocItems(html) {\n    var out = [], re = /<a\\b([^>]*)>([\\s\\S]*?)<\\/a>/gi, m, onlyChapter = true, pass;\n    for (pass = 0; pass < 2; pass++) {\n        onlyChapter = (pass === 0);\n        re.lastIndex = 0;\n        out = [];\n        while ((m = re.exec(String(html))) !== null) {\n            var attrs = String(m[1] || ''), inner = String(m[2] || '');\n            var mc = attrs.match(/data-cid=\"(\\d+)\"/);\n            if (!mc) continue;\n            if (/_secondHeader|_lastChapterCN|_lastChapterUT/.test(attrs)) continue;\n            if (/_lastChapterCN/.test(inner)) continue;\n            var cm = attrs.match(/class=\"([^\"]*)\"/);\n            var cls = cm ? cm[1] : '';\n            if (onlyChapter && cls.indexOf('_chapterItem') < 0) continue;\n            var mn = inner.match(/<h([23])[^>]*>([\\s\\S]*?)<\\/h\\1>/i);\n            if (!mn) continue;\n            var n = _dpStripTags(mn[2]);\n            if (!n) continue;\n            out.push({ name: n, cid: mc[1], cls: cls });\n        }\n        if (out.length) break;      \n    }\n    return out;\n}\nfunction _dpTocRows(baseUrl, raw, jav) {\n    var u = String(baseUrl == null ? '' : baseUrl);\n    var s = String(raw == null ? '' : raw);\n    var out = [], i;\n    if (_dpIsAgg(u)) {\n        var arr = null;\n        try { arr = JSON.parse(s); } catch (e0) { arr = null; }\n        if ((!arr || !arr.length) && jav) { try { arr = _dp3TryUrl(jav, u, _DP3_TO_TOC); } catch (e1) { arr = null; } }\n        if (!arr || !arr.length) return out;\n        var _epCnt = 0, _epSmp = '';\n        for (var _ei = 0; _ei < arr.length; _ei++) {\n            var _eu = String((arr[_ei] && arr[_ei].url) || '');\n            if (/\\.epub([?#]|$)/i.test(_eu)) { _epCnt++; if (!_epSmp) _epSmp = _eu.slice(0, 60); }\n        }\n        if (_epCnt > 0) { throw new Error('目录含 ' + _epCnt + ' 个 EPUB 文件直链（' + _epSmp + '），不支持在线阅读，请换源'); }\n        for (i = 0; i < arr.length; i++) {\n            if (arr[i] && arr[i].name) out.push({ name: String(arr[i].name), url: String(arr[i].url || '') });\n        }\n        try {\n            var q1 = _dp3Seq(out[0].name), q2 = _dp3Seq(out[out.length - 1].name);\n            if (!isNaN(q1) && !isNaN(q2) && q1 > q2) out.reverse();\n        } catch (e2) {}\n        return out;\n    }\n    var bid = (_dpBid(u) || '');\n    var items = [];\n    try { items = _dpQdTocItems(s); } catch (e3) { items = []; }\n    for (i = 0; i < items.length; i++) {\n        out.push({ name: items[i].name, url: '/chapter/' + bid + '/' + items[i].cid + '/' });\n    }\n    if (bid && jav && out.length) {\n        try {\n            var _bhost = _dpAggHost();\n            var _burl = _bhost + '/qqdp/blocks?bid=' + encodeURIComponent(bid);\n            var _bb = '';\n            try { _bb = String(jav.get(_burl, null, 8000).body() || ''); }\n            catch (eB1) { try { _bb = String(jav.get(_burl, null, 8000).body() || ''); } catch (eB2) { _bb = ''; } }\n            if (!_bb) { try { _bb = String(jav.ajax(_burl) || ''); } catch (eB3) { _bb = ''; } }\n            var _bj = null;\n            if (_bb && _bb.charAt(0) === '{') { try { _bj = JSON.parse(_bb); } catch (eB4) { _bj = null; } }\n            if (_bj && _bj.blocks && _bj.blocks.length) {\n                var _bs = {}, _bi;\n                for (_bi = 0; _bi < _bj.blocks.length; _bi++) _bs[String(_bj.blocks[_bi])] = 1;\n                for (_bi = 0; _bi < out.length; _bi++) {\n                    var _bm = String(out[_bi].url || '').match(/\\/chapter\\/\\d+\\/(\\d+)\\//);\n                    if (_bm && _bs[_bm[1]] && String(out[_bi].name).indexOf('📺') < 0) {\n                        out[_bi].name = '📺 ' + out[_bi].name;\n                    }\n                }\n            }\n        } catch (eB0) {}\n    }\n    return out;\n}\n\n\n\nfunction _dpAggBody(raw, chapter, baseUrl, jav) {\n    var url = _dpAggCur(chapter, baseUrl);\n    var s = String(raw == null ? '' : raw);\n    var j = null;\n    try { j = JSON.parse(s); } catch (e0) { j = null; }\n    var _isAgg = _dpIsAgg(url);\n    var _swAllOn = (_dpSwAllOn(jav) && _dpTheme(jav) === 'white');\n    if (!j || typeof j !== 'object') {\n        var _u = (_isAgg && !_swAllOn) ? _dpAggSwUrl(url, jav) : url;\n        try { j = _dp3TryUrl(jav, _u, _DP3_TO_CHAPTER); } catch (e1) { j = null; }\n    } else if (_isAgg && !_swAllOn) {\n        var _j2 = null;\n        try { _j2 = _dp3TryUrl(jav, _dpAggSwUrl(url, jav), _DP3_TO_CHAPTER); } catch (eSw) { _j2 = null; }\n        if (_j2 && typeof _j2 === 'object' && _j2.content) { j = _j2; }\n    }\n    try {\n        if (j && j.qd_bid && j.qd_cid) {\n            if (!__dpIllu._aggQd) __dpIllu._aggQd = {};\n            __dpIllu._aggQd[String(url)] = { bid: String(j.qd_bid), cid: String(j.qd_cid) };\n        }\n    } catch (eQd) {}\n    var ct = (j && j.content) ? String(j.content) : '';\n    return ct;\n}\n\nvar _DP_EX_TTL = 10 * 60 * 1000;      \n\nfunction _dpExIn(arr, v) {\n    for (var i = 0; i < (arr ? arr.length : 0); i++) { if (arr[i] === v) return true; }\n    return false;\n}\n\nfunction show(k, v) {\n    var jv = null, ck = null;\n    try { if (this && this.java) jv = this.java; } catch (e0) {}\n    try { if (this && this.cache) ck = this.cache; } catch (e1) {}\n    if (!jv) { try { if (typeof java !== 'undefined' && java) jv = java; } catch (e2) {} }\n    if (!ck) { try { if (typeof cache !== 'undefined' && cache) ck = cache; } catch (e3) {} }\n    try { if (ck) ck.put(String(v), String(k)); } catch (e4) {}\n    try { if (jv) jv.refreshExplore(); } catch (e5) {}\n}\n\nfunction create(k, chars, defaultV, v, size) {\n    return {\n        title: k,\n        type: 'select',\n        chars: chars,\n        default: defaultV,\n        action: \"show(infoMap['\" + k + \"'],'\" + v + \"')\",\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: size }\n    };\n}\n\nfunction _dpExTab(jav) {\n    var ck = _DP3_CACHE['dpex'], now = 0;\n    try { now = new Date().getTime(); } catch (eN) { now = 0; }\n    if (ck && ck.v && ck.v.length && (now - ck.t) < _DP_EX_TTL) return ck.v;\n    var j = null;\n    try { j = _dp3Try(jav, '/api/discover/tabs', null, 15000); } catch (e0) { j = null; }\n    var v = (j && j.sources && j.sources.length) ? j.sources : null;\n    if (v) { try { _DP3_CACHE['dpex'] = { t: now, v: v }; } catch (e1) {} return v; }\n    return (ck && ck.v && ck.v.length) ? ck.v : null;\n}\n\nfunction _dpExCatsRaw(jav) {\n    var ck = _DP3_CACHE['dpexc_raw'], now = 0;\n    try { now = new Date().getTime(); } catch (eN) { now = 0; }\n    if (ck && ck.v && (now - ck.t) < _DP_EX_TTL) return ck.v;\n    var j = null;\n    try { j = _dp3Try(jav, '/api/discover/cats', null, 15000); } catch (e0) { j = null; }\n    if (j) { try { _DP3_CACHE['dpexc_raw'] = { t: now, v: j }; } catch (e1) {} return j; }\n    return (ck && ck.v) ? ck.v : null;\n}\n\nfunction _dpExCats(jav, adult, chan) {\n    var j = _dpExCatsRaw(jav);\n    if (!j) return null;\n    if (!adult) return (j.novel && j.novel.length) ? j.novel : null;\n    if (chan === '漫画') return (j.comic && j.comic.length) ? j.comic : null;\n    if (chan === '视频') return (j.video && j.video.length) ? j.video : null;\n    return (j.adult && j.adult.length) ? j.adult : null;\n}\n\nfunction _dpChanPick(v) {\n    var jv = null, ck = null;\n    try { if (this && this.java) jv = this.java; } catch (e0) {}\n    try { if (this && this.cache) ck = this.cache; } catch (e1) {}\n    if (!jv) { try { if (typeof java !== 'undefined' && java) jv = java; } catch (e2) {} }\n    if (!ck) { try { if (typeof cache !== 'undefined' && cache) ck = cache; } catch (e3) {} }\n    try {\n        var _wv = String(v == null ? '' : v);\n        if (_wv.indexOf('漫画') >= 0 || _wv.indexOf('视频') >= 0) {\n            var _ad = false;\n            try { _ad = _dpGradeIsAdult(_dpSrcOf(jv)); } catch (eA) { _ad = false; }\n            if (!_ad) {\n                var _mh = (_wv.indexOf('漫画') >= 0);\n                try { if (jv) jv.toast(_mh\n                    ? '📚 浏览漫画时请在编辑页切换类型到图片'\n                    : '🎬 浏览视频时请在编辑页切换类型到视频'); } catch (eT) {}\n                try { if (jv) jv.refreshExplore(); } catch (eR) {}\n                return '';   \n            }\n        }\n    } catch (eG) {}\n    try { if (ck) ck.put('dpchan', String(v)); } catch (e4) {}\n    try { if (ck) ck.put('dpsrc', ''); } catch (e5) {}\n    try { if (jv) jv.refreshExplore(); } catch (e6) {}\n    return '';\n}\n\nfunction _dpAppendSearchBar(out, cur, map, wantType, ADULT) {\n    var host = '';\n    try { host = _dpAggHost(); } catch (e0) { host = ''; }\n    if (!host) return;\n    var KWKEY = '单源搜索';\n    var idx = -1, nm = cur;\n    try {\n        if (map && map[cur] && typeof map[cur].i === 'number') idx = map[cur].i;\n    } catch (e1) { idx = -1; }\n    var _pos = 0;\n    try {\n        for (var _i = 0; _i < out.length; _i++) {\n            var _it = out[_i] || {};\n            if (String(_it.title || '').indexOf('≡') >= 0 && String(_it.url || '') === '') { _pos = _i; break; }\n        }\n    } catch (eP) { _pos = 0; }\n    var _textItem = {\n        title: KWKEY, type: 'text',\n        viewName: \"'输入关键词'\",\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.62 }\n    };\n    var js = \"(function(){\"\n           + \"var _kw='';try{_kw=String((infoMap&&infoMap['\" + KWKEY + \"'])||'');}catch(eK){}\"\n           + \"var _nm='';try{_nm=String((infoMap&&infoMap['请选择平台'])||'');}catch(eN){}\"\n           + \"return '\" + host + \"/api/discover/srcsearch?src=\" + idx + \"&type=\" + wantType + \"&adult=\" + (ADULT ? 1 : 0) + \"&key='\"\n           + \"+encodeURIComponent(_kw)+'&page={{page}}&name='+encodeURIComponent(_nm);\"\n           + \"})()\";\n    var _urlItem = {\n        title: '🔍 单源搜索', type: 'url',\n        url: '<js>' + js + '</js>',\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.38 }\n    };\n    out.splice(_pos, 0, _textItem, _urlItem);\n}\n\n\nfunction _dpStripCh(t) {\n    var s = String(t == null ? '' : t);\n    var pf = ['\\uD83D\\uDCD6 ', '\\uD83D\\uDCDA ', '\\uD83C\\uDFAC ', '\\uD83D\\uDD1E '];\n    for (var i = 0; i < pf.length; i++) {\n        if (s.indexOf(pf[i]) === 0) return s.slice(pf[i].length);\n    }\n    return s;\n}\nfunction _dpExplorePage(jav, cacheObj, fallback) {\n    var srcs = null;\n    try { srcs = _dpExTab(jav); } catch (e0) { srcs = null; }\n    if (!srcs || !srcs.length) return null;\n\n    function _g(k, d) {\n        var v = '';\n        try {\n            v = String(cacheObj && cacheObj.get ? (cacheObj.get(k) || '') : '');\n        } catch (e) { v = ''; }\n        return v || d;\n    }\n    var ADULT = false;\n    try { ADULT = _dpGradeIsAdult(_dpSrcOf(jav)); } catch (eGA) { ADULT = false; }\n    var chanRaw = _g('dpchan', '📖 小说');\n    var chan = (chanRaw.indexOf('漫画') >= 0) ? '漫画'\n             : (chanRaw.indexOf('视频') >= 0) ? '视频' : '小说';\n    if (!ADULT) chan = '小说';        \n    var wantType = (chan === '漫画') ? 2 : (chan === '视频') ? 4 : 0;\n\n    var i, nm, names = [], map = {};\n    for (i = 0; i < srcs.length; i++) {\n        if (!srcs[i]) continue;\n        if (!!srcs[i].adult !== ADULT) continue;\n        if (srcs[i].type !== wantType) continue;   \n        nm = String((srcs[i].em || '') + (srcs[i].name || ('源' + srcs[i].i)));\n        if (_dpExIn(names, nm)) nm = nm + '·' + srcs[i].i;   \n        names.push(nm);\n        map[nm] = srcs[i];\n    }\n    var AGG = '📖 综合';\n    names.unshift(AGG);\n\n    var cur = '';\n    try { cur = String(cacheObj && cacheObj.get ? (cacheObj.get('dpsrc') || '') : ''); } catch (e1) { cur = ''; }\n    if (!cur || !_dpExIn(names, cur)) cur = AGG;        \n\n    var out = [];\n    function _fin(o) {\n        try { _dpAppendSearchBar(o, cur, map, wantType, ADULT); } catch (eSB) {}\n        return JSON.stringify(o);\n    }\n    out.push({\n        title: '内容分级', type: 'select',\n        chars: ['📖 正常'],\n        default: '📖 正常',\n        action: \"_dpGradePick(infoMap['内容分级'])\",\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.5 }\n    });\n    out.push({\n        title: '频道', type: 'select',\n        chars: (ADULT ? ['📖 小说', '📚 漫画', '🎬 视频'] : ['📖 小说']),   \n        default: '📖 ' + chan,\n        action: \"_dpChanPick(infoMap['频道'])\",\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.5 }\n    });\n    out.push(create('请选择平台', names, cur, 'dpsrc', 1));\n\n    if (cur === AGG) {\n        var _cats = null;\n        try { _cats = _dpExCats(jav, ADULT, chan); } catch (eC0) { _cats = null; }\n        if (_cats && _cats.length) {\n            out.push({\n                title: '≡ ' + cur + ' 分类（多源合并）≡', url: '',\n                style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n            });\n            for (var _c2 = 0; _c2 < _cats.length; _c2++) {\n                out.push({\n                    title: _dpStripCh(String(_cats[_c2].title || '')),\n                    url: String(_cats[_c2].url || ''),\n                    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.25 }\n                });\n            }\n            return _fin(out);\n        }\n        var fb = [];\n        if (!ADULT && fallback && fallback.length) {\n            for (var fi = 0; fi < fallback.length; fi++) {\n                if (fallback[fi] && fallback[fi].url) fb.push(fallback[fi]);\n            }\n        }\n        return _fin(out.concat(fb));\n    }\n\n    var s = map[cur];\n    if (!s || !s.cats || !s.cats.length) {\n        out.push({\n            title: '「' + cur + '」暂无分类数据', url: '',\n            style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n        });\n        return _fin(out);\n    }\n\n    out.push({\n        title: '≡ ' + cur + ' ≡', url: '',\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n    });\n\n    var base = _dpAggHost(), cnt = 0, one;\n    for (i = 0; i < s.cats.length; i++) {\n        one = String(s.cats[i]);\n        out.push({\n            title: _dpStripCh(one),\n            url: base + '/api/discover/list?i=' + s.i + '&cat='\n                 + encodeURIComponent(one) + '&page={{page}}',\n            style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.25 }\n        });\n        cnt++;\n        if (cnt >= 2) cnt = 0;\n    }\n    while (cnt > 0 && cnt < 2) {                              \n        out.push({\n            title: '--', url: '',\n            style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.25 }\n        });\n        cnt++;\n    }\n    return _fin(out);\n}\n\nfunction fqShowCmt(a, b, c) {\n    var jv = null, bid = '', iid = '';\n    if (a && typeof a === 'object') { jv = a; bid = String(b || ''); iid = String(c || ''); }\n    else { bid = String(a || ''); iid = String(b || ''); }\n    if (!jv) { try { if (this && this.java) jv = this.java; } catch (e0) {} }\n    if (!jv) { try { jv = _dpJv(); } catch (e1) {} }\n    if (!bid || !iid) { try { jv.toast('fqShowCmt 参数缺失'); } catch (e9) {} return; }\n    var host = '';\n    try { host = _dpAggHost(); } catch (e1) { host = _dpSrv(); }\n    var url = host + '/fq/review?item_id=' + encodeURIComponent(iid)\n            + '&book_id=' + encodeURIComponent(bid);\n    var cfg = '{\"heightPercentage\":0.72}';\n    var html = '';\n    try { html = String(jv.ajax(url) || ''); } catch (eA) { html = ''; }\n    var _ok = false;\n    try { if (jv.showBrowser) { jv.showBrowser(url, (html && html.length > 200) ? html : null, null, cfg); _ok = true; } } catch (e2) {}\n    if (_ok) { return; }\n    try { jv.startBrowser(url, '本章评论'); return; } catch (e3) {}\n    try { jv.toast('本章评论：' + url); } catch (e4) {}\n}\nfunction fqShowPara(a, b, c, dd) {\n    var jv = null, bid = '', iid = '', para = '';\n    if (a && typeof a === 'object') { jv = a; bid = String(b || ''); iid = String(c || ''); para = String(dd || ''); }\n    else { bid = String(a || ''); iid = String(b || ''); para = String(c || ''); }\n    if (!jv) { try { if (this && this.java) jv = this.java; } catch (e0) {} }\n    if (!jv) { try { jv = _dpJv(); } catch (e1) {} }\n    if (!bid || !iid || para === '') { try { jv.toast('fqShowPara 参数缺失'); } catch (e9) {} return; }\n    var host = '';\n    try { host = _dpAggHost(); } catch (e1) { host = _dpSrv(); }\n    var url = host + '/fq/review?item_id=' + encodeURIComponent(iid)\n            + '&book_id=' + encodeURIComponent(bid) + '&para=' + encodeURIComponent(para);\n    var cfg = '{\"heightPercentage\":0.72}';\n    var html = '';\n    try { html = String(jv.ajax(url) || ''); } catch (eA) { html = ''; }\n    var _ok = false;\n    try { if (jv.showBrowser) { jv.showBrowser(url, (html && html.length > 200) ? html : null, null, cfg); _ok = true; } } catch (e2) {}\n    if (_ok) { return; }\n    try { jv.startBrowser(url, '段评'); return; } catch (e3) {}\n    try { jv.toast('段评：' + url); } catch (e4) {}\n}\n\nfunction _tdJv() {\n    try { if (this && this.java) return this.java; } catch (e) {}\n    try { if (typeof java !== 'undefined' && java) return java; } catch (e) {}\n    return null;\n}\nfunction _tdEsc(s) {\n    return String(s == null ? '' : s)\n        .replace(/&/g, '&amp;').replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\nfunction _taduShow(bid, cid, seg) {\n    var jv = _tdJv.call(this);\n    if (!jv) { try { jv = java; } catch (e) {} }\n    var html = '';\n    try {\n        seg = Number(seg || 0);\n        var base = 'http://43.139.147.103:8070';\n        var u = base + '/tadu/seg?bid=' + encodeURIComponent(bid)\n              + '&cid=' + encodeURIComponent(cid) + '&seg=' + seg;\n        var raw = '';\n        try { raw = String(jv.ajax(u) || ''); } catch (e) { raw = ''; }\n        var d = {};\n        try { d = (JSON.parse(raw) || {}).data || {}; } catch (e) { d = {}; }\n        var cs = d.comments || [];\n        var items = '';\n        for (var i = 0; i < cs.length; i++) {\n            var c = cs[i] || {};\n            var txt = String(c.text || '');\n            if (txt.length > 300) txt = txt.slice(0, 300) + '…';\n            var av = String(c.avatar || '');\n            var nick = String(c.user || '读者');\n            var segTag = (c.seg && seg <= 0) ? '<span class=\"ip\">第' + c.seg + '段</span>' : '';\n            var meta = [];\n            if (Number(c.like || 0) > 0) meta.push(Number(c.like) + ' 赞');\n            if (Number(c.reply || 0) > 0) meta.push(Number(c.reply) + ' 回复');\n            if (c.time) meta.push(_tdEsc(String(c.time)));\n            var avatarHtml = av\n                ? '<img class=\"av\" src=\"' + _tdEsc(av) + '\" onerror=\"this.style.display=\\'none\\'\"/>'\n                : '<div class=\"av ph\">' + _tdEsc(nick.charAt(0)) + '</div>';\n            items += '<div class=\"card\">' + avatarHtml + '<div class=\"main\">'\n                  + '<div class=\"nick\">' + _tdEsc(nick) + segTag + '</div>'\n                  + '<div class=\"txt\">' + _tdEsc(txt) + '</div>'\n                  + (meta.length ? '<div class=\"meta\">' + _tdEsc(meta.join(' · ')) + '</div>' : '')\n                  + '</div></div>';\n        }\n        if (!items) items = '<div class=\"empty\">该段落暂无段评</div>';\n        var head = d.content ? String(d.content)\n                 : (seg > 0 ? ('第 ' + seg + ' 段') : '本书段评');\n        if (head.length > 120) head = head.slice(0, 120) + '…';\n        html = '<!doctype html><html><head><meta charset=\"utf-8\">'\n             + '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><style>'\n             + 'body{margin:0;background:#f8f8f8;color:#1f2329;'\n             + 'font-family:-apple-system,\"PingFang SC\",\"Microsoft YaHei\",Arial,sans-serif}'\n             + '.topbar{display:flex;justify-content:space-between;padding:12px 16px;background:#fff;border-bottom:1px solid #eee}'\n             + '.topbar span:first-child{font-size:13px;color:#666}'\n             + '.topbar span:last-child{font-size:15px;font-weight:600;color:#111}'\n             + '.wrap{padding:12px}'\n             + '.head{margin:0 0 12px;padding:14px 16px;background:#fff;border:1px solid #eaeaea;border-radius:12px}'\n             + '.sub{color:#111;font-size:15px;line-height:1.6;word-break:break-all}'\n             + '.card{display:flex;gap:9px;margin:0 0 10px;padding:14px;background:#fff;border:1px solid #e2e5ea;border-radius:14px}'\n             + '.av{width:38px;height:38px;border-radius:50%;object-fit:cover;flex:0 0 38px;background:#eee}'\n             + '.av.ph{display:flex;align-items:center;justify-content:center;color:#fff;background:#4A90E2;font-size:15px}'\n             + '.main{flex:1;min-width:0}'\n             + '.nick{font-size:13px;color:#333;font-weight:600;margin-bottom:5px}'\n             + '.ip{font-size:11px;color:#999;font-weight:400;margin-left:6px}'\n             + '.txt{font-size:15px;line-height:1.7;word-break:break-word}'\n             + '.meta{font-size:12px;color:#999;margin-top:7px}'\n             + '.empty{color:#999;text-align:center;padding:40px 0}'\n             + '</style></head><body>'\n             + '<div class=\"topbar\"><span>共 ' + cs.length + ' 条段评</span><span>段评详情</span></div>'\n             + '<div class=\"wrap\"><div class=\"head\"><div class=\"sub\">' + _tdEsc(head) + '</div></div>'\n             + items + '</div></body></html>';\n        var cfg = JSON.stringify({ isHideable: true, expandedCornersRadius: 16,\n                                   skipCollapsed: true, heightPercentage: 0.82 });\n        jv.showBrowser(base, html, '', cfg);\n    } catch (e) {\n        try { jv.toast('段评加载失败: ' + e); } catch (e2) {}\n        try { jv.startBrowser('data:text/html;base64,'\n            + jv.base64Encode(html || '<html><body>段评加载失败</body></html>'), '段评'); } catch (e3) {}\n    }\n}", "lastUpdateTime": "1793806190671", "loginUi": "@js:(function(){try{return _dpAqUi(book, java);}catch(e){return _dpLuFallback();}})()", "loginUrl": "@js:\n\nvar AQ_DEFAULT_BASE = 'http://43.139.147.103:8070';  \n\nfunction _aqBase() {\n    var b = '';\n    try { b = String(source.get('agg_server') || ''); } catch (e) {}\n    b = b.replace(/\\/+$/, '');\n    return b || AQ_DEFAULT_BASE;\n}\n\nfunction _aqV(name) {\n    try {\n        if (typeof result !== 'undefined' && result) {\n            if (typeof result.get === 'function') {\n                var g = result.get(name);\n                if (g != null && String(g) !== '') return String(g);\n            } else if (result[name] != null && String(result[name]) !== '') {\n                return String(result[name]);\n            }\n        }\n    } catch (e) {}\n    try {\n        if (typeof source !== 'undefined' && source && source.getLoginInfoMap) {\n            var m = source.getLoginInfoMap();\n            if (m) {\n                var v = (typeof m.get === 'function') ? m.get(name) : m[name];\n                if (v != null) return String(v);\n            }\n        }\n    } catch (e2) {}\n    return '';\n}\n\nfunction aqDev() {\n    var d = '';\n    try { d = String(source.get('aq_dev') || ''); } catch (e) {}\n    d = d.replace(/[^0-9a-f]/gi, '').toLowerCase();\n    if (!/^[a-f0-9]{32}$/.test(d)) {\n        d = '';\n        try { d = String(java.deviceID() || ''); } catch (e1) {}\n        if (!d) { try { d = String(java.androidId() || ''); } catch (e2) {} }\n        d = d.replace(/[^0-9a-f]/gi, '').toLowerCase();\n        if (!/^[a-f0-9]{16,64}$/.test(d)) {\n            d = '';\n            for (var i = 0; i < 32; i++) {\n                d += '0123456789abcdef'.charAt(Math.floor(Math.random() * 16));\n            }\n        }\n        if (d.length > 64) d = d.substring(0, 64);\n        try { source.put('aq_dev', d); } catch (e3) {}\n    }\n    return d;\n}\n\nfunction _aqPost(path, obj) {\n    var base = _aqBase();\n    var body = JSON.stringify(obj);\n    var hd = { 'Content-Type': 'application/json' };\n    var resp = '';\n    try {\n        var r = java.post(base + path, body, hd, 15000);\n        if (r) { try { resp = String(r.body ? r.body() : r); } catch (e1) { resp = String(r); } }\n    } catch (e2) { resp = ''; }\n    if (!resp) {\n        var opt = JSON.stringify({ method: 'POST', headers: hd, body: body });\n        try { resp = String(java.ajax(base + path + ',' + opt) || ''); } catch (e3) { resp = ''; }\n    }\n    resp = _aqTidy(resp);\n    var c0 = resp.charAt(0);\n    if (c0 !== '{' && c0 !== '[') { return null; }\n    try { return JSON.parse(resp); } catch (e4) { return null; }\n}\n\nfunction _aqGet(path) {\n    var base = _aqBase();\n    var resp = '';\n    try {\n        var r = java.get(base + path, {}, 12000);\n        if (r) { try { resp = String(r.body ? r.body() : r); } catch (e1) { resp = String(r); } }\n    } catch (e2) { resp = ''; }\n    if (!resp) {\n        try { resp = String(java.ajax(base + path) || ''); } catch (e3) { resp = ''; }\n    }\n    resp = _aqTidy(resp);\n    var c0 = resp.charAt(0);\n    if (c0 !== '{' && c0 !== '[') { return null; }\n    try { return JSON.parse(resp); } catch (e4) { return null; }\n}\n\nfunction _aqTidy(s) {\n    s = String(s == null ? '' : s);\n    try { s = s.replace(/^\\uFEFF/, ''); } catch (e) {}\n    return s.replace(/^\\s+|\\s+$/g, '');\n}\n\nfunction _aqToast(s) {\n    try { java.toast(String(s)); } catch (e) {}\n}\n\nvar _AQ_IMPORT_URL = 'http://43.139.147.103:8070/fq/bookSource.json';\n\nvar _AQ_SELF_VER = '20261102-3';\n\nfunction _dpSrcLocalVer() {\n    var v = '';\n    try { v = String(source.get('aq_src_ver') || ''); } catch (e0) {}\n    if (!v) { v = _AQ_SELF_VER; }\n    return v;\n}\n\nfunction _dpSrcFetchVer() {\n    var base = _aqBase();\n    var resp = '';\n    try {\n        var r = java.get(base + '/fq/version.json', {}, 12000);\n        if (r) { try { resp = String(r.body ? r.body() : r); } catch (e1) { resp = String(r); } }\n    } catch (e2) { resp = ''; }\n    if (!resp) {\n        try { resp = String(java.ajax(base + '/fq/version.json') || ''); } catch (e3) { resp = ''; }\n    }\n    resp = _aqTidy(resp);\n    if (resp.charAt(0) !== '{') { return null; }\n    try { return JSON.parse(resp); } catch (e4) { return null; }\n}\n\nfunction _dpSrcVerText() {\n    var remote = null;\n    try { remote = _dpSrcFetchVer(); } catch (e0) {}\n    var local = _dpSrcLocalVer();\n    if (remote && remote.version) {\n        if (local && local === String(remote.version)) {\n            return '📦 已是最新版 ' + local;\n        }\n        var tip = '📦 本地 ' + (local || '未知') + ' → 最新 ' + remote.version;\n        if (remote.requireImport === false) { tip += '（服务端升级，无需导入）'; }\n        return tip;\n    }\n    if (local) { return '📦 当前版本 ' + local + '（服务端版本未知）'; }\n    return '📦 版本未知（点下方按钮检查）';\n}\n\nfunction _dpSrcUpd() {\n    try {\n        var remote = _dpSrcFetchVer();\n        if (!remote || !remote.version) {\n            _aqToast('检查失败：网络错误，请稍后重试');\n            return '';\n        }\n        var local = _dpSrcLocalVer();\n        var ver = String(remote.version);\n        if (local && local === ver) {\n            _aqToast('✅ 已是最新版 ' + ver + '，无需更新');\n            try { java.upLoginData({ 'aq_ver': '📦 已是最新版 ' + ver }); } catch (eU) {}\n            return '';\n        }\n        try {\n            java.upLoginData({ 'aq_ver': '📦 本地 ' + (local || '未知') + ' → 最新 ' + ver });\n        } catch (eU2) {}\n        var needImport = remote.requireImport !== false;\n        if (!needImport) {\n            try { source.put('aq_src_ver', ver); } catch (eS) {}\n            _aqToast('服务端已升级到 ' + ver + '，无需重新导入，直接使用即可');\n            return '';\n        }\n        var msg = '有新版：' + (local ? local + ' → ' : '') + ver;\n        var ch = [];\n        if (Object.prototype.toString.call(remote.changes) === '[object Array]') { ch = remote.changes; }\n        var shown = ch.slice(0, 5);\n        if (shown.length) { msg += '\\n' + shown.join('\\n'); }\n        if (ch.length > 5) { msg += '\\n…共 ' + ch.length + ' 条，详情可看更新日志页'; }\n        var notice = '';\n        try { if (remote.notice != null) { notice = String(remote.notice); } } catch (eN) {}\n        if (notice) { msg += '\\n📢 ' + notice; }\n        msg += '\\n即将打开导入确认页…';\n        _aqToast(msg);\n        var deep = 'legado://import/bookSource?src=' + encodeURIComponent(_AQ_IMPORT_URL);\n        var okDeep = false;\n        try { java.openUrl(deep); okDeep = true; } catch (eO) {}\n        if (!okDeep) {\n            _aqToast('唤起导入页失败\\n请手动：书源管理 → 网络 → 粘贴 ' + _AQ_IMPORT_URL);\n        }\n    } catch (e) {\n        _aqToast('更新出错：' + (e && e.message ? e.message : e));\n    }\n    return '';\n}\n\nfunction aqVer() {\n    try {\n        var t = _dpSrcVerText();\n        try { java.upLoginData({ 'aq_ver': t }); } catch (e0) {}\n        return '';\n    } catch (e) { return ''; }\n}\n\nfunction login(force) {\n    try {\n        var email = _aqV('邮箱');\n        var pw = _aqV('密码');\n        if (!email || !pw) { _aqToast('请填写邮箱和密码'); return ''; }\n        var j = _aqPost('/user/auth/login', {\n            email: email, password: pw, device: aqDev()\n        });\n        if (!j) { _aqToast('网络错误，请重试'); return ''; }\n        if (j.code === 0) {\n            try {\n                var sess = String(j.session || '');\n                if (sess && typeof cookie !== 'undefined' && cookie) {\n                    cookie.setCookie(_aqBase(), 'rq_session=' + sess);\n                }\n            } catch (e1) {}\n            try { java.upLoginData({ 'aq_quota_line': _aqQuotaText() }); } catch (eQ) {}\n            try { source.put('aq_email', String(email)); } catch (eM) {}\n            _aqToast('登录成功');\n            try { java.refreshContent(); } catch (e2) {}\n        } else if (j.code === 429) {\n            _aqToast((j.message || '登录设备数已达上限') + '\\n点「🚪 下线其它设备」可腾出名额');\n        } else {\n            _aqToast(j.message || '登录失败');\n        }\n    } catch (e) {\n        _aqToast('登录出错：' + (e && e.message ? e.message : e));\n    }\n    return '';\n}\n\nfunction register() {\n    try {\n        var code = _aqV('注册码');\n        var email = _aqV('邮箱');\n        var pw = _aqV('密码');\n        if (!code) { _aqToast('请先点「🎫 领取注册码」拿到注册码'); return ''; }\n        if (!email || !pw) { _aqToast('请填写邮箱和密码'); return ''; }\n        var j = _aqPost('/user/auth/register', {\n            code: code, email: email, password: pw, device: aqDev()\n        });\n        if (!j) { _aqToast('网络错误，请重试'); return ''; }\n        if (j.code === 0) {\n            try {\n                var sess = String(j.session || '');\n                if (sess && typeof cookie !== 'undefined' && cookie) {\n                    cookie.setCookie(_aqBase(), 'rq_session=' + sess);\n                }\n            } catch (e1) {}\n            try { source.put('aq_email', String(email)); } catch (eM) {}\n            _aqToast('注册成功');\n            try { java.upLoginData({ '注册码': '' }); } catch (eC) {}\n            try { java.upLoginData({ 'aq_quota_line': _aqQuotaText() }); } catch (eQ) {}\n            try { java.refreshContent(); } catch (e2) {}\n        } else {\n            _aqToast(j.message || '注册失败');\n        }\n    } catch (e) {\n        _aqToast('注册出错：' + (e && e.message ? e.message : e));\n    }\n    return '';\n}\n\nfunction aqIssue() {\n    try {\n        var st = _aqGet('/user/code/state');\n        if (st && st.selfCodeEnabled === false) {\n            _aqToast('管理员已暂停发码');\n            return '';\n        }\n        if (st && st.pool_exhausted === true) {\n            _aqToast('注册码已发完（剩 0 / ' + (st.pool_total == null ? '?' : st.pool_total)\n                + ' 个名额）\\n请等待释放或联系管理员');\n            return '';\n        }\n        var email = _aqV('邮箱');\n        if (!email) {\n            _aqToast('请先在上方「邮箱」栏填好邮箱，再点「领取注册码」\\n邮箱用于以后找回注册码，务必填对');\n            return '';\n        }\n        var j = _aqPost('/user/code/issue', { device: aqDev(), email: email });\n        if (!j) { _aqToast('网络错误，请重试'); return ''; }\n        if (j.code === 0) {\n            var c = String(j.reg_code || '');\n            try { java.upLoginData({ '注册码': c }); } catch (e1) {}\n            var left = (j.remaining_today != null) ? ('｜今日还可发 ' + j.remaining_today + ' 个') : '';\n            var poolLeft = (j.remaining_pool != null && j.pool_total != null)\n                ? ('\\n余额：剩 ' + j.remaining_pool + ' / ' + j.pool_total + ' 个名额') : '';\n            try { java.upLoginData({ 'aq_stock': _aqCodeStockText(j) }); } catch (eSk) {}\n            _aqToast('已领取：' + c + left + poolLeft + '\\n请立即点「📝 注册」完成注册');\n        } else if (j.code_existing) {\n            try { java.upLoginData({ '注册码': String(j.code_existing) }); } catch (e2) {}\n            _aqToast('本机已领过：' + j.code_existing + '\\n如需更换请先「♻️ 解绑当前设备」');\n        } else {\n            _aqToast(j.message || '领取失败');\n        }\n    } catch (e) {\n        _aqToast('领码出错：' + (e && e.message ? e.message : e));\n    }\n    return '';\n}\n\nfunction aqRelease() {\n    try {\n        var j = _aqPost('/user/code/release', { device: aqDev() });\n        if (!j) { _aqToast('网络错误，请重试'); return ''; }\n        if (j.code === 0) {\n            if (j.already_released) {\n                _aqToast(j.note || '当前没有生效的注册码，可直接点「🎫 领取注册码」');\n            } else {\n                try { java.upLoginData({ '注册码': '' }); } catch (e1) {}\n                if (j.code_revoked) {\n                    _aqToast('已解绑，可重新领取');\n                } else {\n                    _aqToast('已解绑。该码已用于注册，换机请直接用邮箱密码登录');\n                }\n            }\n        } else {\n            _aqToast(j.message || '解绑失败');\n        }\n    } catch (e) {\n        _aqToast('解绑出错：' + (e && e.message ? e.message : e));\n    }\n    return '';\n}\n\nfunction aqFind() {\n    try {\n        var email = _aqV('邮箱');\n        if (!email) { _aqToast('请先填写邮箱（领码时用的那个）'); return ''; }\n        var j = _aqPost('/user/code/find', { email: email, device: aqDev() });\n        if (!j) { _aqToast('网络错误，请重试'); return ''; }\n        if (j.code === 0 && j.codes && j.codes.length) {\n            var unused = null;\n            for (var i = 0; i < j.codes.length; i++) {\n                if (j.codes[i].status === 'unused') { unused = j.codes[i].code; break; }\n            }\n            if (unused) {\n                try { java.upLoginData({ '注册码': unused }); } catch (e1) {}\n                _aqToast('已找回：' + unused);\n            } else {\n                _aqToast('本机领的码已失效（过期/已作废/已用于注册）\\n直接点「🎫 领取注册码」换一张新码');\n            }\n        } else {\n            _aqToast(j.message || '该邮箱没有领码记录');\n        }\n    } catch (e) {\n        _aqToast('找回出错：' + (e && e.message ? e.message : e));\n    }\n    return '';\n}\n\nfunction _aqLimitSrcText(q) {\n    var s = String((q && q.source) || '');\n    if (s === 'exempt') return '豁免·不限';\n    if (s === 'custom') return '单独设的额度';\n    if (s === 'default') return '默认额度';\n    return '来源未知';\n}\n\nfunction _aqCodeStockText(st) {\n    try {\n        var a = st || _aqGet('/user/auth/status');\n        if (a) {\n            var tot = a.pool_total;\n            var left = a.remaining_pool;\n            if (a.pool_exhausted === true) {\n                return '🎟 注册码余额：0 个名额（已发完，等释放）';\n            }\n            if (left != null && tot != null) {\n                var t = '🎟 注册码余额：剩 ' + left + ' / ' + tot + ' 个名额可注册';\n                if (a.low_stock === true) { t += ' · 库存偏低'; }\n                if (a.remaining_today != null) { t += '｜今日还可发 ' + a.remaining_today; }\n                return t;\n            }\n        }\n    } catch (eS) {}\n    return '🎟 注册码余额：读取失败 · 点这里重试';\n}\n\nfunction _aqQuotaText(st) {\n    try {\n        var a = st || _aqGet('/user/auth/status');\n        if (a && a.code === 0 && a.loggedIn && a.quota) {\n            var q = a.quota;\n            var lim = (q.limit == null) ? '不限' : q.limit;\n            var t = '📊 今日已读 ' + q.used + ' / ' + lim + ' 章';\n            if (q.remaining != null) { t += '（剩 ' + q.remaining + '）'; }\n            if (q.bypass) { t += ' · 暂不计限'; }\n            t += '｜' + _aqLimitSrcText(q);\n            return t;\n        }\n        if (a && a.loggedIn === false) {\n            return '📊 未登录 · 登录后这里显示今日额度';\n        }\n    } catch (e) {}\n    return '📊 额度获取失败 · 点这里重试';\n}\n\nfunction _aqWhoText(st) {\n    try {\n        var a = st || _aqGet('/user/auth/status');\n        if (!a) return '🔌 状态未知 · 点这里重试';\n        if (a.code === 0 && a.loggedIn) {\n            var em = '';\n            try { em = String((a.user && a.user.email) || ''); } catch (eE) {}\n            var q = a.quota || {};\n            var lim = (q.limit == null) ? '不限' : (q.limit + ' 章');\n            return '✅ 已登录' + (em ? '：' + em : '') + '｜今日 ' + q.used + ' / ' + lim\n                 + '（' + _aqLimitSrcText(q) + '）';\n        }\n        if (a.code === 401 || a.loggedIn === false) {\n            return '❌ 未登录 · 会话已失效，填邮箱密码再点登录';\n        }\n    } catch (e) {}\n    return '⚠ 登录状态读取失败 · 点这里重试';\n}\n\nfunction aqStock() {\n    try {\n        var a = _aqGet('/user/auth/status');\n        if (!a) { _aqToast('网络错误，请重试'); return ''; }\n        var t = _aqCodeStockText(a);\n        try { java.upLoginData({ 'aq_stock': t }); } catch (e1) {}\n        var more = '';\n        if (a.remaining_pool != null && a.pool_total != null) {\n            more = '\\n已发 ' + (a.pool_total - a.remaining_pool) + ' / ' + a.pool_total + ' 个名额';\n        }\n        _aqToast(t + more);\n    } catch (e) { _aqToast('查询出错'); }\n    return '';\n}\n\nfunction aqCheck() {\n    try {\n        var a = _aqGet('/user/auth/status');\n        if (!a) { _aqToast('网络错误，请重试'); return ''; }\n        var t = _aqWhoText(a);\n        _aqToast(t);\n        try { java.upLoginData({ 'aq_who': t }); } catch (e1) {}\n        try { java.upLoginData({ 'aq_quota_line': _aqQuotaText(a) }); } catch (e2) {}\n        if (a.code === 0 && a.loggedIn) {\n            try {\n                var em = String((a.user && a.user.email) || '');\n                if (em) {\n                    java.upLoginData({ '邮箱': em });\n                    source.put('aq_email', em);   \n                }\n            } catch (e3) {}\n        }\n    } catch (e) {\n        _aqToast('检测出错：' + (e && e.message ? e.message : e));\n    }\n    return '';\n}\n\nfunction aqQuota() {\n    try {\n        var j = _aqGet('/user/api/quota');\n        if (!j) { _aqToast('网络错误，请重试'); return ''; }\n        if (j.code !== 0) {\n            _aqToast(j.message || '未登录');\n            try { java.upLoginData({ 'aq_quota_line': '📊 未登录 · 登录后这里显示今日额度' }); } catch (e0) {}\n            return '';\n        }\n        var lim = (j.limit == null) ? '不限' : j.limit;\n        var t = '📊 今日已读 ' + j.used + ' / ' + lim + ' 章';\n        if (j.remaining != null) { t += '（剩 ' + j.remaining + '）'; }\n        if (j.bypass) { t += ' · 暂不计限'; }\n        try { java.upLoginData({ 'aq_quota_line': t }); } catch (e1) {}\n        _aqToast(t + '\\n重读同一章不重复计 · 每日本地 0 点重置');\n    } catch (e) {\n        _aqToast('查询出错');\n    }\n    return '';\n}\n\nfunction aqKickOthers() {\n    try {\n        var d = _aqGet('/user/api/devices');\n        if (!d || d.code !== 0) { _aqToast('请先登录'); return ''; }\n        var list = d.devices || [];\n        var n = 0, names = [];\n        for (var i = 0; i < list.length; i++) {\n            var it = list[i];\n            if (it.current || !it.active) { continue; }\n            if (!it.device) { continue; }   \n            names.push((it.device_label || '?') + '(' + it.active + ')');\n            var j = _aqPost('/user/api/devices/kick', { device: it.device });\n            if (j && j.code === 0) { n += (j.kicked || 0); }\n        }\n        if (!n) { _aqToast('没有其它在线设备（共 ' + list.length + ' 台）'); return ''; }\n        _aqToast('已下线 ' + n + ' 个会话：' + names.join('、'));\n    } catch (e) {\n        _aqToast('操作出错：' + (e && e.message ? e.message : e));\n    }\n    return '';\n}\n\nfunction aqLogout() {\n    try {\n        _aqPost('/user/auth/logout', {});\n        try { cookie.removeCookie(_aqBase()); } catch (e1) {}\n        try { java.upLoginData({ 'aq_quota_line': _aqQuotaText() }); } catch (e2) {}\n        _aqToast('已退出登录');\n        try { java.refreshContent(); } catch (e3) {}\n    } catch (e) {}\n    return '';\n}\n\nfunction _dpLuRow(name, label, action, dynLabel, basis) {\n    var r = {\n        name: name, type: 'button',\n        style: {\n            layout_flexGrow: 1,\n            layout_flexBasisPercent: (basis == null ? 0.45 : basis)\n        }\n    };\n    r.viewName = dynLabel ? String(label) : JSON.stringify(String(label));\n    if (action) r.action = action;\n    return r;\n}\n\nfunction _dpLuFallback() {\n    try {\n        return JSON.stringify([\n            _dpLuRow('lu_hint', '↓   账号登录   ↓', null, false, 1),\n            _dpLuRow('lu_login', '🔑 登录', 'login(true)', false, 0.45),\n            _dpLuRow('lu_reg', '📝 注册', 'register()', false, 0.45),\n            _dpLuRow('lu_tip', '每日 100 章 · 重读不重复计 · 未登录无法阅读', null, false, 1)\n        ]);\n    } catch (e) { return '[]'; }\n}\n\nfunction _dpAqRows() {\n    var r = [];\n    var hint = '点「🎫 领取注册码」自助领码：一机一码，换机先解绑';\n    var st = _aqGet('/user/code/state');\n    if (st && st.code === 0) {\n        if (st.codeHint) {\n            var parts = String(st.codeHint).split('\\n');\n            hint = parts[0];\n        }\n        if (st.selfCodeEnabled === false) {\n            r.push(_dpLuRow('aq_off', '⛔ 管理员已暂停发码', null, false, 1));\n        }\n    }\n    var _st = null;\n    try { _st = _aqGet('/user/auth/status'); } catch (eSt) {}\n    var qtext = '📊 今日额度加载中…';\n    try { qtext = _aqQuotaText(_st); } catch (eq) {}\n    r.push(_dpLuRow('aq_quota_line', qtext, 'aqQuota()', false, 1));\n    var whoText = '🔌 登录状态检测中…';\n    try { whoText = _aqWhoText(_st); } catch (ew) {}\n    r.push(_dpLuRow('aq_who', whoText, 'aqCheck()', false, 1));\n    r.push(_dpLuRow('aq_head', '↓  注册码登录（阅读额度）  ↓', null, false, 1));\n    var stockText = '🎟 注册码余额加载中…';\n    try { stockText = _aqCodeStockText(_st); } catch (eSk) {}\n    r.push(_dpLuRow('aq_stock', stockText, 'aqStock()', false, 1));\n    r.push({ name: '注册码', type: 'text', default: '' });\n    var _mail = '';\n    try { _mail = String(source.get('aq_email') || ''); } catch (eM) {}\n    r.push({ name: '邮箱', type: 'text', default: _mail });\n    r.push({ name: '密码', type: 'password', default: '' });\n    r.push(_dpLuRow('aq_check', '🔄 检测登录状态', 'aqCheck()', false, 1));\n    r.push(_dpLuRow('aq_login', '🔑 登录', 'login(true)', false, 0.45));\n    r.push(_dpLuRow('aq_reg', '📝 注册', 'register()', false, 0.45));\n    r.push(_dpLuRow('aq_issue', '🎫 领取注册码', 'aqIssue()', false, 0.45));\n    r.push(_dpLuRow('aq_release', '♻️ 解绑当前设备', 'aqRelease()', false, 0.45));\n    r.push(_dpLuRow('aq_find', '🔍 找回注册码', 'aqFind()', false, 0.45));\n    r.push(_dpLuRow('aq_kick', '🚪 下线其它设备', 'aqKickOthers()', false, 0.45));\n    r.push(_dpLuRow('aq_logout', '⏏️ 退出登录', 'aqLogout()', false, 1));\n    r.push(_dpLuRow('aq_ver', '📦 版本检查中…', 'aqVer()', false, 1));\n    r.push(_dpLuRow('aq_upd', '⟳ 检查书源更新', '_dpSrcUpd()', false, 1));\n    var tip = hint;\n    if (st && st.code === 0) {\n        if (st.pool_exhausted === true) {\n            tip += '｜注册码已发完，等待释放';\n        } else if (st.remaining_today != null) {\n            tip += '｜今日还可发 ' + st.remaining_today + ' 个';\n        }\n        tip += '｜每日 ' + (st.dailyLimit == null ? 100 : st.dailyLimit) + ' 章';\n    }\n    r.push(_dpLuRow('aq_tip', tip, null, false, 1));\n    return r;\n}\n\nfunction _dpAqUi(bko, jav) {\n    try {\n        var rows = _dpAqRows();\n        try {\n            if (typeof _dpLuList === 'function') {\n                var rest = JSON.parse(_dpLuList(bko, jav));\n                if (rest && rest.length) rows = rows.concat(rest);\n            }\n        } catch (eB) {}\n        return JSON.stringify(rows);\n    } catch (e) { return '[]'; }\n}\n", "respondTime": 180000, "ruleBookInfo": {"author": "@js:_dpInfoField(baseUrl, result, java, book, 'author')", "coverUrl": "@js:_dpInfoField(baseUrl, result, java, book, 'coverUrl')", "intro": "@js:_dpInfoField(baseUrl, result, java, book, 'intro')", "kind": "@js:_dpInfoField(baseUrl, result, java, book, 'kind')", "lastChapter": "@js:_dpInfoField(baseUrl, result, java, book, 'lastChapter')", "name": "@js:_dpInfoField(baseUrl, result, java, book, 'name')", "tocUrl": "@js:_dpTocUrl(baseUrl, result)", "wordCount": "@js:_dpInfoField(baseUrl, result, java, book, 'wordCount')"}, "ruleContent": {"content": "<js>(function(){\nfunction _ILLU(x){try{return __dpIllu(String(x==null?\"\":x),book,chapter,java);}catch(eI){return x;}}\nif((typeof _dpAggWant===\"function\")&&_dpAggWant(chapter,baseUrl)){\n    try{_dpSetCtx(java,book,chapter);}catch(eS){}\n    return _ILLU(_dpAggBody(result,chapter,baseUrl,java));\n}\nreturn _ILLU(_dpBody(String(result==null?\"\":result)));\n})()</js>\n@js:(function(){if((typeof _dpAggWant==='function')&&_dpAggWant(chapter,baseUrl))return result;return __dpInject(result, book ? String(book.name || '') : '', book ? String(book.author || '') : '', chapter ? String(chapter.title || '') : '', java, cookie, book, chapter);})()"}, "ruleExplore": {"author": "$.bAuth", "bookList": "<js>var _h=(typeof src!=='undefined'&&src!=null)?String(src):String(result==null?'':result);result=_dpExploreList(baseUrl,_h,java);</js>\n$.data.records||$.dp3.records", "bookUrl": "$.u", "coverUrl": "$.c", "intro": "$.desc", "kind": "$.subCat||$.cat", "name": "$.bName", "wordCount": "$.cnt"}, "ruleSearch": {"author": "$.author", "bookList": "<js>var _h=(typeof src!=='undefined'&&src!=null)?String(src):String(result==null?'':result); var _r=[];try{_r=_dpSearchRows(_h,'',java,source)||[];}catch(eS0){_r=[];}result=JSON.stringify({list:_r});</js>\n$.list", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name", "wordCount": "$.wordCount"}, "ruleToc": {"chapterList": "<js>var _h=(typeof src!=='undefined'&&src!=null)?String(src):String(result==null?'':result);var _r=[];try{_r=_dpTocRows(baseUrl,_h,java)||[];}catch(eT0){_r=[];}result=JSON.stringify({list:_r});</js>\n$.list", "chapterName": "$.name", "chapterUrl": "$.url"}, "searchUrl": "@js:\nvar _g='';\ntry { _g=String(source.get('dp_adult')||''); } catch(e1){}\nif(!_g){ try { _g=String(source.get('dpgrade')||''); } catch(e2){} }\nif(!_g){ try { _g=String(cache.get('dpgrade')||''); } catch(e3){} }\nvar _a=((String(_g)==='1')||String(_g).indexOf('成人')>=0)?'1':'0';\n_dpAggHost() + '/api/search?key={{key}}&page={{page}}&type=novel&adult='+_a+'&all_src=1&batch=0&budget=25&sv=1';\n", "weight": 0},{"bookSourceGroup": "聚合", "bookSourceName": "聚合小说", "bookSourceType": 0, "bookSourceUrl": "https://m.qidian.com", "customButton": false, "customOrder": -2, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>(function(){\nvar _H = (typeof _dpSrv === 'function') ? _dpSrv() : 'http://43.139.147.103:8070';\nvar FALLBACK = [{\"title\":\"请选择平台\",\"type\":\"select\",\"chars\": [\"📖 综合\", \"🌙 得奇小说\", \"圣墟小说网\", \"提书网(tishu)\", \"思兔阅读(sto66)\", \"2K小说\", \"同人小说(trxs123)\", \"黑岩阅读\", \"🍅 番茄小说\", \"思路客\", \"夜伴书屋\",\"错层小说\", \"STV镜像\", \"笔下文学网(bxwx9)\", \"笔趣阁小说网(biquguo)\", \"37阅读网(37yue)\", \"大唐小说\", \"小说屋\",\"笔趣阁(bqgooo.cc)\", \"书旗小说\", \"米读小说\", \"七猫小说\", \"武侠小说网(wuxiayue)\", \"爱下电子书(ixdzs8) ✨优质\", \"🌙 顶点小说·APP接口 ✨优质\", \"📖 读知阁\" ],\"default\":\"📖 综合\",\"action\":\"show(infoMap['请选择平台'],'dpsrc')\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"≡ 综合分类（多源合并）≡\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"玄幻\",\"url\":_H+\"/api/discover/unified_list/0?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"仙侠\",\"url\":_H+\"/api/discover/unified_list/1?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"都市\",\"url\":_H+\"/api/discover/unified_list/2?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"历史\",\"url\":_H+\"/api/discover/unified_list/3?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"科幻\",\"url\":_H+\"/api/discover/unified_list/4?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"悬疑\",\"url\":_H+\"/api/discover/unified_list/5?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"游戏\",\"url\":_H+\"/api/discover/unified_list/6?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"言情\",\"url\":_H+\"/api/discover/unified_list/7?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"完本\",\"url\":_H+\"/api/discover/unified_list/8?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"最新\",\"url\":_H+\"/api/discover/unified_list/9?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"排行\",\"url\":_H+\"/api/discover/unified_list/10?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"--\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}}];\ntry{\nvar _p=_dpExplorePage(java, cache, FALLBACK);\nif(_p){return _p;}\n}catch(e){}\nreturn JSON.stringify(FALLBACK);\n})()</js>", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; SM-S918B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\", \"Accept-Language\": \"zh-CN,zh;q=0.9\"}", "jsLib": "var _DP_JV = null, _DP_BK = null, _DP_CH = null;\nvar _DP_ILLU_DIAG = '';   \nfunction _dpSetCtx(jv, bk, ch) {\n    try { if (jv) _DP_JV = jv; } catch (e1) {}\n    try { if (bk) _DP_BK = bk; } catch (e2) {}\n    try { if (ch) _DP_CH = ch; } catch (e3) {}\n    return _DP_JV;\n}\nfunction _dpScopeChapter() {\n    try { if (typeof chapter !== 'undefined' && chapter) return chapter; } catch (e1) {}\n    try { if (_DP_CH) return _DP_CH; } catch (e2) {}\n    return null;\n}\nfunction _dpJv(jv) {\n    if (jv) return jv;\n    if (_DP_JV) return _DP_JV;\n    try { if (typeof java !== 'undefined' && java) return java; } catch (e1) {}\n    try { if (typeof source !== 'undefined' && source) return source; } catch (e2) {}\n    return null;\n}\n\nvar _DP_UA = 'Mozilla/5.0 (Linux; Android 12; Redmi K40 Build/SKQ1.220213.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/110.0.0.0 Mobile Safari/537.36';\nvar _DP_LANG = 'zh-CN,zh;q=0.9';\nvar _DP_QD_DIAG = '';\nvar _DP_DEBUG = true;          \nvar _DP_DEBUG_OK = false;      \nvar _DP_NET_ERR = '';          \nvar _DP_CSRF = '';             \nvar _DP_LAST_FAIL = '';        \nvar _DP_HOT_EMPTY = false;\nvar _DP_HOT_DIAG = '';\nvar _DP_IMG_VH = 55;\n\nvar _DP_SERVER = 'http://43.139.147.103:8070';   \n\nfunction _dpSrv() {\n    try {\n        var sc = _dpSrcOf(_dpJv());\n        if (sc && typeof sc.get === 'function') {\n            var v = String(sc.get('agg_server') || '').replace(/\\/+$/, '');\n            if (v) return v;\n        }\n    } catch (e0) {}\n    return _DP_SERVER;\n}\nvar _dpBidCache = {};          \nvar _dpCatCache = {};          \n\nfunction _dpFlat(s) {\n    try { s = String(s == null ? '' : s); } catch (e0) { s = ''; }\n    try { s = s.split('').join(''); } catch (e1) {}\n    return s;\n}\nfunction _dpFlatHd(hd) {\n    var out = {};\n    try { for (var k in hd) { out[_dpFlat(k)] = _dpFlat(hd[k]); } } catch (e) { return hd; }\n    return out;\n}\n\nfunction _dpToast(jav, msg) {\n    if (!_DP_DEBUG) return;\n    try { jav.toast(msg); } catch (e) {}\n}\n\nfunction _dpT2S(jav, s) {\n    var v = String(s == null ? '' : s);\n    if (!v) return v;\n    try { var r = jav.t2s(v); if (r) return String(r); } catch (e) {}\n    return v;\n}\nfunction _dpGetJson(jav, url, headers) {\n    try {\n        var r = jav.get(url, headers);\n        var body = String(r.body() || '');\n        if (!body) return null;\n        return JSON.parse(body);\n    } catch (e) { _DP_NET_ERR = String(e); return null; }\n}\nfunction _dpIsHtmlBlock(t) {\n    return /<(p|br|div|h[1-6])[\\s>\\/]/i.test(String(t == null ? '' : t));\n}\n\nfunction _dpPlainText(s) {\n    return String(s == null ? '' : s)\n        .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n        .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n        .replace(/<br\\s*\\/?>/gi, '\\n')\n        .replace(/<\\/p>/gi, '\\n')\n        .replace(/<\\/div>/gi, '\\n')\n        .replace(/<[^>]*>/g, '')\n        .replace(/&nbsp;/gi, ' ')\n        .replace(/&ldquo;/gi, '“').replace(/&rdquo;/gi, '”')\n        .replace(/&hellip;/gi, '…').replace(/&mdash;/gi, '—')\n        .replace(/&amp;/gi, '&').replace(/&lt;/gi, '<')\n        .replace(/&gt;/gi, '>').replace(/&quot;/gi, '\"')\n        .replace(/&#\\d+;/g, ' ');\n}\nfunction _dpInjectServer(t, nm, au, cn, jav) {\n    try {\n        var plain = _dpIsHtmlBlock(t) ? _dpPlainText(t) : t;\n        var body = 'name=' + encodeURIComponent(nm)\n                 + '&author=' + encodeURIComponent(au)\n                 + '&chapter=' + encodeURIComponent(cn)\n                 + '&text=' + encodeURIComponent(plain)\n                 + '&hot=' + ((_dpSegCardOn(jav) || _dpEndCardOn(jav)) ? '1' : '0')\n                 + '&bubble=' + (_dpBubbleOn(jav) ? '1' : '0')\n                 + '&segcard=' + (_dpSegCardOn(jav) ? '1' : '0')\n                 + '&endcard=' + (_dpEndCardOn(jav) ? '1' : '0')\n                 + '&theme=' + _dpTheme(jav);\n        var r = '';\n        try {\n            var _resp = jav.post(_dpSrv() + '/qqdp/inline', body,\n                {\"Content-Type\": \"application/x-www-form-urlencoded;charset=utf-8\"});\n            r = String(_resp.body() || '');\n        } catch (e4) {\n            try {\n                r = String(jav.post(_dpSrv() + '/qqdp/inline', body, {}).body() || '');\n            } catch (e5) { r = ''; }\n        }\n        if (r.length > 80 && r.indexOf('qqShowCmt(') >= 0) {\n            var n = (r.match(/qqShowCmt\\(/g) || []).length;\n            if (_DP_DEBUG_OK) _dpToast(jav, '段评:服务器通道' + n + '个');\n            return r;\n        }\n        if (!_DP_LAST_FAIL) {\n            _DP_LAST_FAIL = '服务器:未注入(len=' + r.length\n                + (plain && r === plain ? ' 原样返回' : '') + ')';\n        }\n        return '';\n    } catch (e) {\n        if (!_DP_LAST_FAIL) _DP_LAST_FAIL = '服务器:异常 ' + e;\n        return '';\n    }\n}\n\nfunction __dpInject(txt, nm, au, cn, jav, ck, bko, chapter) {\n    var t = String(txt == null ? '' : txt);\n    function _reIllu(x) {\n        try { return __dpIllu(x, bko, chapter, jav); } catch (eI2) { return x; }\n    }\n    try {\n        t = _dpFitImgs(t);\n        try { t = __dpIllu(t, bko, chapter, jav); } catch (eIllu) {}  \n        _dpSetCtx(jav, bko, _dpScopeChapter());\n        var bubbleOn = true, segCardOn = true, endCardOn = true;\n        try { bubbleOn = _dpBubbleOn(jav); } catch (eSO) {}\n        try { segCardOn = _dpSegCardOn(jav); } catch (eSO2) {}\n        try { endCardOn = _dpEndCardOn(jav); } catch (eHO2) {}\n        if (bko && nm) { try { _dpRegBook(_dpSrcOf(jav), nm, bko.bookUrl ? String(bko.bookUrl) : ''); } catch (eR0) {} }\n        if (!bubbleOn && !segCardOn && !endCardOn) { return t; }\n        if (t.length < 80) return t;\n        if (t.indexOf('qqShowCmt(') >= 0) return t;\n        if (t.indexOf('</p>') < 0 && /<p[\\s>]/i.test(t)) {\n            t = t.replace(/<p([^>]*)>/gi, '</p><p$1>').replace(/^(<\\/p>)+/i, '') + '</p>';\n        }\n        nm = _dpT2S(jav, nm);\n        au = _dpT2S(jav, au);\n        cn = _dpT2S(jav, cn);\n        if (!cn) {\n            try {\n                var mm = t.replace(/^[\\s\\u3000]+/, '').match(/^(第[0-9一二三四五六七八九十百千两零]{1,12}[章节回卷集篇][^\\n]{0,24})/);\n                if (mm) cn = mm[1];\n            } catch (e0) {}\n        }\n        if (!nm || !cn) { _dpToast(jav, '段评:缺名 nm=' + nm + ' cn=' + cn); return t; }\n\n        _DP_NET_ERR = '';\n        var srv = _dpInjectServer(t, nm, au, cn, jav);\n        if (srv) return _reIllu(srv);\n\n        _dpToast(jav, '段评:服务器未取到(' + _DP_LAST_FAIL + ')');\n        return _reIllu(t);\n    } catch (e) { _dpToast(jav, '段评:异常 ' + e); return txt; }\n}\n\n\nvar _JJ_SERVER = 'http://43.139.147.103:8070';  \nfunction _dpDpSrv(ovr){\n    try {\n        var s = _dpSrcOf(_dpJv());\n        if (s && typeof s.get === 'function') {\n            var v = String(s.get(ovr || 'jj_server') || '');\n            if (v) return v.replace(/\\/+$/, '');\n        }\n    } catch (e) {}\n    return _JJ_SERVER;\n}\nfunction _dpDpShow(jv, url) {\n    var cfg = JSON.stringify({\n        \"expandedCornersRadius\": 20, \"dismissOnTouchOutside\": true, \"isDraggable\": true,\n        \"shouldDimBackground\": true, \"backgroundDimAmount\": 0.5, \"hardwareAccelerated\": true,\n        \"isNestedScrollingEnabled\": true, \"isGestureInsetBottomIgnored\": true,\n        \"setFitToContents\": true, \"isHideable\": true, \"heightPercentage\": 0.8\n    });\n    var html = '';\n    try { html = String(jv.ajax(url) || ''); } catch (eA) {}\n    if (html && html.indexOf('<!DOCTYPE html>') >= 0) {\n        try { jv.showBrowser(url, html, '', cfg); return true; } catch (eB) {}\n    }\n    try { jv.showBrowser(url, null, null, cfg); return true; } catch (eB2) {}\n    try { jv.startBrowser(url, '段评'); } catch (eC) {}\n    return false;\n}\nfunction _jjSrv() {\n    try { return _dpDpSrv('jj_server'); } catch (e) { return _JJ_SERVER; }\n}\nfunction jjShowCmt(nid, cid, para, cnt, pt64) {\n    var jv = null;\n    try { if (this && this.java) jv = this.java; } catch (e) {}\n    if (!jv) jv = _dpJv();\n    if (!jv) return;\n    try {\n        nid = _dpFlat(nid); cid = _dpFlat(cid); para = _dpFlat(para);\n        if (!nid || !cid) { try { jv.toast('段评参数缺失'); } catch (e0) {} return; }\n        if (!para) para = '1';\n        var tq = '';\n        try { tq = encodeURIComponent(_dpFlat(pt64)); } catch (eT) {}\n        var host = _JJ_SERVER;\n        try { host = _jjSrv(); } catch (eH) {}\n        _dpDpShow(jv, host + '/jj/review?nid=' + encodeURIComponent(nid) +\n                       '&cid=' + encodeURIComponent(cid) +\n                       '&para=' + encodeURIComponent(para) +\n                       '&size=50&fmt=html' + (tq ? '&pt=' + tq : ''));\n    } catch (eAll) {\n        try { jv.toast('段评打开失败：' + eAll); } catch (eT2) {}\n    }\n}\nfunction sqShowCmt(bid, cid, para, cnt, pt64) {\n    var jv = null;\n    try { if (this && this.java) jv = this.java; } catch (e) {}\n    if (!jv) jv = _dpJv();\n    if (!jv) return;\n    bid = _dpFlat(bid); cid = _dpFlat(cid); para = _dpFlat(para);\n    if (!bid || !cid) { try { jv.toast('段评参数缺失'); } catch (e0) {} return; }\n    if (!para) para = 'p001';\n    var pq = encodeURIComponent(para);\n    var tq = '';\n    try { tq = encodeURIComponent(_dpFlat(pt64)); } catch (eT) {}\n    _dpDpShow(jv, _JJ_SERVER + '/shuqi/review?bid=' + encodeURIComponent(bid) +\n                   '&cid=' + encodeURIComponent(cid) +\n                   '&pid=' + pq + '&para=' + pq + '&size=50&fmt=html' +\n                   (tq ? '&pt=' + tq : ''));\n}\n\nfunction qqShowCmt(bid, cid, segId, csrf, q, qdBid, qdCid, name, author, ch) {\n    var jv = null;\n    try { if (this && this.java) jv = this.java; } catch (e) {}\n    if (!jv) jv = _dpJv();          \n    if (!jv) return;\n    bid = _dpFlat(bid); cid = _dpFlat(cid); segId = _dpFlat(segId); csrf = _dpFlat(csrf);\n    q = _dpFlat(q); qdBid = _dpFlat(qdBid); qdCid = _dpFlat(qdCid);\n    name = _dpFlat(name); author = _dpFlat(author); ch = _dpFlat(ch);\n    if (arguments.length >= 10) { _dpShowServer(jv, bid, cid, segId, csrf, q, qdBid, qdCid, name, author, ch); }\n    else if (arguments.length >= 6) { _dpShowServer(jv, bid, cid, segId, csrf, q, qdBid, qdCid, '', '', ''); }\n    else { _dpShowServer(jv, '0', '0', segId, csrf, '', bid, cid, '', '', ''); }\n}\n\nfunction _dpFailCode() {\n    var d = '';\n    try { d = _dpFlat(_DP_QD_DIAG || ''); } catch (e1) {}\n    if (d) return d.replace(/\\s+/g, ' ').slice(0, 70);\n    try { if (_DP_NET_ERR) return ('网络 ' + _dpFlat(_DP_NET_ERR)).replace(/\\s+/g, ' ').slice(0, 70); } catch (e2) {}\n    try { if (!_DP_CSRF) return '未拿到 csrf'; } catch (e3) {}\n    return '本章无数据返回';\n}\n\nfunction _dpShowServer(jv, bid, cid, para, uuid, q, qdBid, qdCid, name, author, ch) {\n    var url = _dpSrv() + '/qqdp/para?bid=' + bid + '&cid=' + cid + '&offset=' + para;\n    if (uuid) { url += '&uuid=' + uuid; }\n    if (q) { url += '&q=' + encodeURIComponent(q); }\n    if (qdBid && qdCid) { url += '&qd_bid=' + qdBid + '&qd_cid=' + qdCid; }\n    if (name) { url += '&name=' + name; }\n    if (author) { url += '&author=' + author; }\n    if (ch) { url += '&ch=' + ch; }\n    var html = '';\n    try { html = String(jv.ajax(url) || ''); } catch (eA) {}\n    if (html) {\n        try {\n            var cfg = JSON.stringify({\n                \"expandedCornersRadius\": 20,\n                \"dismissOnTouchOutside\": true,\n                \"isDraggable\": true,\n                \"shouldDimBackground\": true,\n                \"backgroundDimAmount\": 0.5,\n                \"hardwareAccelerated\": true,\n                \"isNestedScrollingEnabled\": true,\n                \"isGestureInsetBottomIgnored\": true,\n                \"setFitToContents\": true,\n                \"isHideable\": true,\n                \"heightPercentage\": 0.8\n            });\n            jv.showBrowser(url, html, '', cfg);\n            return;\n        } catch (eB) {}\n    }\n    try { jv.startBrowser(url, '段评'); } catch (eC) {\n        try { jv.toast('段评加载失败: ' + _dpFailCode()); } catch (eD) {}\n    }\n}\nvar _DP3_SRVS = ['http://43.139.147.103:8070', 'http://43.139.147.103'];\ntry {\n    var _dpSrvV = _dpSrv();\n    if (_dpSrvV) {\n        _DP3_SRVS = [_dpSrvV];\n        if (_dpSrvV.indexOf(':8070') < 0) _DP3_SRVS.push('http://43.139.147.103:8070');\n    }\n} catch (eSrv) {}\nvar _DP3_SRV_OK = '';\nvar _DP3_CACHE = {};\nvar _DP3_BAD = null;\nvar _DP3_TTL = 3600 * 1000;\nvar _DP3_MISS_TTL = 6 * 3600 * 1000;\nvar _DP3_BUDGET = 45000;         \nvar _DP3_MAX_TRY = 3;            \nvar _DP3_TO_SEARCH = 20000;      \nvar _DP3_TO_BOOK = 15000;        \nvar _DP3_TO_TOC = 40000;         \nvar _DP3_TO_CHAPTER = 35000;     \n\nfunction _dp3Try(jav, path, src, to) {\n    var order = [], i;\n    if (_DP3_SRV_OK) order.push(_DP3_SRV_OK);\n    for (i = 0; i < _DP3_SRVS.length; i++) {\n        if (_DP3_SRVS[i] !== _DP3_SRV_OK) order.push(_DP3_SRVS[i]);\n    }\n    for (i = 0; i < order.length; i++) {\n        var body = '';\n        try {\n            var r = jav.get(order[i] + path, null, to || 8000);   \n            if (r) body = String(r.body() || '');\n        } catch (e0) { body = ''; }\n        if (!body) { try { body = String(jav.ajax(order[i] + path) || ''); } catch (e1) { body = ''; } }\n        if (!body || body.length < 2) continue;\n        try {\n            var j = JSON.parse(body);\n            if (j) { _DP3_SRV_OK = order[i]; return j; }\n        } catch (e2) {  }\n    }\n    return null;\n}\n\nfunction _dp3TryUrl(jav, url, to) {\n    var body = '';\n    try {\n        var r = jav.get(url, null, to || 8000);   \n        if (r) body = String(r.body() || '');\n    } catch (e0) { body = ''; }\n    if (!body) { try { body = String(jav.ajax(url) || ''); } catch (e1) { body = ''; } }\n    if ((!body || body.length < 3) && _DP3_SRV_OK) {\n        var alt = String(url).replace(/^https?:\\/\\/[^\\/]+/, _DP3_SRV_OK);\n        try { body = String(jav.ajax(alt) || ''); } catch (e2) { body = ''; }\n    }\n    if (!body) return null;\n    try { return JSON.parse(body); } catch (e3) { return null; }\n}\n\nfunction _dp3Norm(s) {\n    return String(s == null ? '' : s)\n        .replace(/[\\s\\u3000]+/g, '')\n        .replace(/[：:，,。.、！!？?；;（）()《》〈〉【】\\[\\]\"\"''—\\-_|]/g, '')\n        .toLowerCase();\n}\n\nfunction _dp3Cn2int(s) {\n    var D = { '零': 0, '〇': 0, '一': 1, '壹': 1, '二': 2, '两': 2, '贰': 2, '三': 3, '叁': 3,\n              '四': 4, '肆': 4, '五': 5, '伍': 5, '六': 6, '陆': 6, '七': 7, '柒': 7, '八': 8, '捌': 8,\n              '九': 9, '玖': 9 };\n    var U = { '十': 10, '拾': 10, '百': 100, '佰': 100, '千': 1000, '仟': 1000, '万': 10000 };\n    var total = 0, section = 0, num = -1, seen = false;\n    for (var i = 0; i < s.length; i++) {\n        var c = s.charAt(i);\n        if (D[c] !== undefined) { num = D[c]; seen = true; }\n        else if (U[c] !== undefined) {\n            var u = U[c];\n            if (u >= 10000) { section = (section + (num < 0 ? 0 : num)) * u; total += section; section = 0; num = -1; }\n            else { section += (num < 0 ? 1 : num) * u; num = -1; }\n            seen = true;\n        } else { return NaN; }\n    }\n    if (!seen) return NaN;\n    return total + section + (num < 0 ? 0 : num);\n}\n\nfunction _dp3Seq(name) {\n    var s = String(name == null ? '' : name).replace(/[\\s\\u3000]+/g, '');\n    var m = s.match(/第\\s*([0-9]{1,10})\\s*[章节回节话]/);\n    if (m) return parseInt(m[1], 10);\n    m = s.match(/第\\s*([零〇一壹二两贰三叁四肆五伍六陆七柒八捌九玖十拾百佰千仟万]{1,12})\\s*[章节回节话]/);\n    if (m) { var v = _dp3Cn2int(m[1]); if (!isNaN(v)) return v; }\n    m = s.match(/^\\s*([0-9]{1,10})[\\.、,，:：]/);\n    if (m) return parseInt(m[1], 10);\n    return NaN;\n}\n\n\n\n\n\n\n\n\nfunction _dp3Get(src, k) {\n    if (!src) return null;\n    try { var v = src.get(k); if (v !== undefined && v !== null && String(v) !== '') return String(v); } catch (e) {}\n    try {\n        var all = src.getVariable();\n        if (all) {\n            var o = JSON.parse(String(all));\n            if (o && o[k] !== undefined && o[k] !== null && String(o[k]) !== '') return String(o[k]);\n        }\n    } catch (e2) {}\n    return null;\n}\nfunction _dp3Put(src, k, v) {\n    if (!src) return;\n    try { src.put(k, String(v)); return; } catch (e) {}\n    try { src.putVariable(k, String(v)); } catch (e2) {}\n}\n\n\nfunction _dpBody(raw) {\n    var h = String(raw == null ? '' : raw);\n    if (!h || h.length < 200) return h;\n    try {\n        var mm = h.match(/<script id=\"vite-plugin-ssr_pageContext\"[^>]*>([\\s\\S]*?)<\\/script>/i);\n        if (mm) {\n            var ci = null;\n            try { ci = JSON.parse(mm[1]).pageContext.pageProps.pageData.chapterInfo; } catch (eJ) {}\n            var ct = ci ? String(ci.content == null ? '' : ci.content) : '';\n            if (_dpTxtLen(ct) > 60) return ct;\n        }\n    } catch (e1) {}\n    try {\n        var pi = h.search(/<div[^>]*class=\"[^\"]*\\bprint\\b[^\"]*\"[^>]*>/i);\n        if (pi >= 0) {\n            var seg = h.slice(pi).replace(/^<div[^>]*>/i, '');\n            seg = _dpCutDiv(seg)\n                    .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n                    .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n                    .replace(/<h1[^>]*>[\\s\\S]*?<\\/h1>/i, '');\n            if (_dpTxtLen(seg) > 60) return seg;\n        }\n    } catch (e2) {}\n    return h;\n}\n\nfunction _dpFitImgs(t) {\n    var s = String(t == null ? '' : t);\n    if (!s || s.indexOf('<img') < 0) return s;\n    var vh = _DP_IMG_VH;\n    try {\n        if (!vh) vh = 55;\n        var v = _dp3Get(_dpSrcOf(_dpJv()), 'dpimgvh');\n        if (v) { var n = parseInt(v, 10); if (!isNaN(n) && n >= 15 && n <= 100) vh = n; }\n    } catch (e0) {}\n    var css = 'max-width:100%;height:auto;max-height:' + vh + 'vh;object-fit:contain;';\n    try {\n        return s.replace(/<img\\b([^>]*)>/gi, function (m0, a) {\n            if (/max-height\\s*:/i.test(a)) return m0;\n            if (/\\sstyle\\s*=\\s*\"/i.test(a)) {\n                return '<img' + a.replace(/(\\sstyle\\s*=\\s*\")([^\"]*)\"/i, '$1$2;' + css + '\"') + '>';\n            }\n            return '<img' + a + ' style=\"' + css + '\">';\n        });\n    } catch (e1) { return s; }\n}\n\nfunction _dpTxtLen(s) {\n    try { return String(s == null ? '' : s).replace(/<[^>]*>/g, '').replace(/[\\s\\u3000]/g, '').length; }\n    catch (e) { return 0; }\n}\n\nfunction _dpCutDiv(s) {\n    var d = 0, re = /<div\\b[^>]*>|<\\/div\\s*>/gi, m;\n    while ((m = re.exec(s)) !== null) {\n        if (m[0].charAt(1) === '/') { d--; if (d <= 0) return s.slice(0, m.index); }\n        else d++;\n    }\n    return s;\n}\n\n\nfunction _dpMeta(h, prop) {\n    try {\n        var re = /<meta\\b[^>]*>/gi, m;\n        while ((m = re.exec(String(h))) !== null) {\n            var tag = m[0];\n            if (tag.indexOf(prop) < 0) continue;\n            var c = tag.match(/content\\s*=\\s*([\"'])([\\s\\S]*?)\\1/i);\n            if (c) return c[2];\n        }\n    } catch (e) {}\n    return '';\n}\n\nfunction _dpBookIntro(h, baseUrl, jav, bko) {\n    _dpSetCtx(jav, bko, _dpScopeChapter());\n    var o = _dpMeta(h, 'og:description');\n    if (!o) {\n        try {\n            var m = String(h).match(/<p[^>]*class=\"[^\"]*summary__content[^\"]*\"[^>]*>([\\s\\S]*?)<\\/p>/i);\n            if (m) o = _dpPlainText(m[1]).replace(/[\\s\\u3000]+/g, ' ').replace(/^ | $/g, '');\n        } catch (e1) {}\n    }\n    if (!o) {\n        o = _dpMeta(h, 'name=\"description\"');\n        if (o) o = o.replace(/^[^,]*?,已更新\\s*\\d+\\s*章[、,：:]?\\s*最新章节[：:]?/, '');\n    }\n    return o;\n}\n\nfunction _dpBooks(src) {\n    try {\n        var v = _dp3Get(src, 'dp3books');\n        if (v) { var a = JSON.parse(String(v)); if (a && a.length) return a; }\n    } catch (e) {}\n    return [];\n}\n\nfunction _dpBid(u) {\n    try { var m = String(u || '').match(/\\/book\\/(\\d+)/); if (m) return m[1]; } catch (e) {}\n    return '';\n}\n\nfunction _dpRegBook(src, name, bookUrl) {\n    if (!src || !name) return;\n    try {\n        var bid = _dpBid(bookUrl), old = _dpBooks(src), out = [{ n: String(name), b: bid }], i;\n        for (i = 0; i < old.length && out.length < 40; i++) {\n            if (String(old[i].n) === String(name)) continue;\n            out.push({ n: String(old[i].n), b: String(old[i].b || '') });\n        }\n        if (old.length && String(old[0].n) === String(name) && String(old[0].b || '') === bid) return;\n        _dp3Put(src, 'dp3books', JSON.stringify(out));\n    } catch (e) {}\n}\n\nfunction _dpExploreFill(r) {\n    try {\n        if (!r || r.u) return r;\n        var bid = String(r.bid == null ? '' : r.bid);\n        var q = String(r.dp3q == null ? '' : r.dp3q);\n        r.u = 'https://m.qidian.com/book/' + bid + '/?dp3q=' + q;\n        r.c = 'https://bookcover.yuewen.com/qdbimg/349573/' + bid + '/180';\n    } catch (e0) {}\n    return r;\n}\n\nfunction _dpExploreList(baseUrl, result, jav) {\n    var body = String(result == null ? '' : result);\n    try { _dpSetCtx(jav, null, null); } catch (eS0) {}\n    try {\n        if (String(baseUrl || '').indexOf('dp3panel') >= 0) {\n            return JSON.stringify({ data: { records: [] } });\n        }\n    } catch (e1) {}\n    try {\n        var jd = JSON.parse(body);\n        if (jd && jd.disc === true) {\n            return JSON.stringify({ data: { records: (jd.records || []) } });\n        }\n    } catch (eD) {}\n    try {\n        var j = JSON.parse(body);\n        var r = j && j.data && j.data.records;\n        if (r && r.length) {\n            var keep = [];\n            for (var i = 0; i < r.length; i++) {\n                if (!r[i]) continue;\n                if (r[i].dp3q === undefined) r[i].dp3q = '';\n                if (String(r[i].bAuth || '') === 'VIP补章源') continue;   \n                _dpExploreFill(r[i]);   \n                keep.push(r[i]);\n            }\n            return JSON.stringify({ data: { records: keep } });\n        }\n    } catch (e2) {}\n    return body;\n}\n\n\n\n\n\n\n\nfunction _dpGradeIsAdult(src) {\n    return false;\n}\nfunction _dpGradeSet(jav, on) {\n    on = false;\n    try { _dp3Put(_dpSrcOf(jav), 'dp_adult', '0'); } catch (e) {}\n    var upd = {};\n    upd[\"lu_grade_n\"] = (on ? \"○ \" : \"◉ \") + \"📖 正常小说\";\n    upd[\"lu_grade_a\"] = (on ? \"◉ \" : \"○ \") + \"🔞 成人小说\";\n    try { jav.upLoginData(upd); } catch (eU) {}\n    try {\n        jav.toast('📖 已切回正常小说（成人内容已迁至独立入口）');\n    } catch (e2) {}\n    try { jav.refreshExplore(); } catch (e4) {}\n    return '已切换：📖 正常小说（成人内容已迁至独立入口）';\n}\nfunction _dpGradeRows(jav) {\n    return [];\n}\nfunction _dpGradePick(v) {\n    var jv = null;\n    try { if (this && this.java) jv = this.java; } catch (e0) {}\n    if (!jv) { try { if (typeof java !== 'undefined' && java) jv = java; } catch (e1) {} }\n    var on = String(v == null ? '' : v).indexOf('成人') >= 0;\n    return _dpGradeSet(jv, on);\n}\n\nfunction _dpLuRow(name, label, action, dynLabel, basis) {\n    var r = {\n        name: name, type: \"button\",\n        style: {\n            layout_flexGrow: 1,\n            layout_flexBasisPercent: (basis == null ? 0.45 : basis)\n        }\n    };\n    r.viewName = dynLabel ? String(label) : (\"'\" + String(label).replace(/'/g, \"\") + \"'\");\n    if (action) r.action = action;\n    return r;\n}\n\n\n\nfunction _dpSegOn(jav) {\n    var src = _dpSrcOf(jav);\n    var v = _dp3Get(src, 'dp_seg_on');\n    if (v === null) return true;\n    return v !== '0';\n}\nfunction _dpHotOn(jav) {\n    var src = _dpSrcOf(jav);\n    var v = _dp3Get(src, 'dp_hot_on');\n    if (v === null) return true;\n    return v !== '0';\n}\nfunction _dpFineGet(jav, key, legacy) {\n    var src = _dpSrcOf(jav);\n    var v = _dp3Get(src, key);\n    if (v !== null && v !== '') return v !== '0';\n    return legacy;\n}\nfunction _dpBubbleOn(jav)  { return _dpFineGet(jav, 'dp_bubble_on',  _dpSegOn(jav)); }\nfunction _dpSegCardOn(jav) { return _dpFineGet(jav, 'dp_segcard_on', _dpSegOn(jav) && _dpHotOn(jav)); }\nfunction _dpEndCardOn(jav) { return _dpFineGet(jav, 'dp_endcard_on', _dpHotOn(jav)); }\n\nfunction _dpSwMark(on) { return (on ? \"◉ \" : \"○ \"); }\nfunction _dpBubbleLabel(on)  { return _dpSwMark(on) + \"💬 段评气泡\"; }\nfunction _dpSegCardLabel(on) { return _dpSwMark(on) + \"🔥 段神评卡\"; }\nfunction _dpEndCardLabel(on) { return _dpSwMark(on) + \"📌 章末大卡\"; }\nfunction _dpSwMigrate(jav) {\n    try {\n        var src = _dpSrcOf(jav);\n        var b = _dp3Get(src, 'dp_bubble_on'), s = _dp3Get(src, 'dp_segcard_on'), e = _dp3Get(src, 'dp_endcard_on');\n        if (b !== null && b !== '' && s !== null && s !== '' && e !== null && e !== '') return;\n        _dp3Put(src, 'dp_bubble_on',  _dpBubbleOn(jav)  ? '1' : '0');\n        _dp3Put(src, 'dp_segcard_on', _dpSegCardOn(jav) ? '1' : '0');\n        _dp3Put(src, 'dp_endcard_on', _dpEndCardOn(jav) ? '1' : '0');\n    } catch (eM) {}\n}\nfunction _dpSwAllOn(jav) {\n    try { return (_dpBubbleOn(jav) && _dpSegCardOn(jav) && _dpEndCardOn(jav)) ? true : false; }\n    catch (e) { return true; }\n}\nfunction _dpToggleOne(jav, key, name, onGet, labelFn, onMsg, offMsg) {\n    _dpSwMigrate(jav);\n    var src = _dpSrcOf(jav);\n    var on = onGet(jav);\n    _dp3Put(src, key, on ? '0' : '1');\n    var upd = {};\n    upd[name] = labelFn(!on);\n    _dpLuDone(jav, on ? offMsg : onMsg, upd);\n    return String(on ? offMsg : onMsg).split('（')[0];\n}\nfunction _dpToggleBubbleSw(jav) {\n    return _dpToggleOne(jav, 'dp_bubble_on', 'tog_bubble', _dpBubbleOn, _dpBubbleLabel,\n        '已开启段评气泡（正文段尾小气泡），重新打开本章生效',\n        '已关闭段评气泡（热评卡不受影响），重新打开本章生效');\n}\nfunction _dpToggleSegCardSw(jav) {\n    return _dpToggleOne(jav, 'dp_segcard_on', 'tog_segcard', _dpSegCardOn, _dpSegCardLabel,\n        '已开启段神评卡（段内热评大卡），重新打开本章生效',\n        '已关闭段神评卡（气泡不受影响），重新打开本章生效');\n}\nfunction _dpToggleEndCardSw(jav) {\n    return _dpToggleOne(jav, 'dp_endcard_on', 'tog_endcard', _dpEndCardOn, _dpEndCardLabel,\n        '已开启章末大卡（本章说/神评论），重新打开本章生效',\n        '已关闭章末大卡（气泡不受影响），重新打开本章生效');\n}\nvar _DP_CARD_THEMES = ['white', 'night', 'black', 'jade', 'kraft', 'wood'];\nvar _DP_CARD_THEME_LABEL = {\n    white: '☀️ 白露', night: '🌙 夜间', black: '⚫ 纯黑',\n    jade: '🍃 青竹', kraft: '📜 牛皮纸', wood: '🪵 木纹'\n};\nfunction _dpCardThemeNorm(v) {\n    var t = String(v == null ? '' : v).replace(/^\\s+|\\s+$/g, '').toLowerCase();\n    if (t === 'light') return 'white';          \n    if (t === 'dark') return 'night';\n    for (var i = 0; i < _DP_CARD_THEMES.length; i++) {\n        if (_DP_CARD_THEMES[i] === t) return t;\n    }\n    return 'white';                             \n}\nfunction _dpCardThemeLabel(t) {\n    return _DP_CARD_THEME_LABEL[_dpCardThemeNorm(t)] || _DP_CARD_THEME_LABEL.white;\n}\nfunction _dpTheme(jav) {\n    try {\n        var src = _dpSrcOf(jav);\n        var v = _dp3Get(src, 'dp_card_theme');\n        if (v !== null && String(v) !== '') return _dpCardThemeNorm(v);\n        var old = _dp3Get(src, 'dp_theme');\n        if (old !== null && String(old) !== '') return _dpCardThemeNorm(old);\n        return 'white';\n    } catch (eT) { return 'white'; }\n}\nfunction _dpToggleTheme(jav) {\n    var src = _dpSrcOf(jav);\n    var now = _dpTheme(jav);\n    var idx = 0;\n    for (var i = 0; i < _DP_CARD_THEMES.length; i++) {\n        if (_DP_CARD_THEMES[i] === now) { idx = i; break; }\n    }\n    var next = _DP_CARD_THEMES[(idx + 1) % _DP_CARD_THEMES.length];\n    _dp3Put(src, 'dp_card_theme', next);\n    _dp3Put(src, 'dp_theme', next);\n    var upd = {};\n    upd[\"tog_theme\"] = \"◉ 🎨 卡片配色：\" + _dpCardThemeLabel(next);\n    _dpLuDone(jav, '卡片配色：' + _dpCardThemeLabel(next) + '（重新打开本章生效）', upd);\n    return '卡片配色：' + _dpCardThemeLabel(next);\n}\n\n\nfunction _dpDpSrcGet(jav) {\n    try {\n        var s = _dpSrcOf(jav);\n        var v = String(_dp3Get(s, 'dp_dpsrc') || '').toLowerCase();\n        return (v === 'qq') ? 'qq' : 'qd';\n    } catch (e) { return 'qd'; }\n}\nfunction _dpDpSrcLabel(k) {\n    return (String(k) === 'qq') ? 'QQ阅读段评' : '起点段评';\n}\nfunction _dpDpSrcRows(jav) {\n    var cur = _dpDpSrcGet(jav);\n    return [\n        _dpLuRow(\"tog_dp_head\", \"↓   段评通道   ↓\", null, false, 1),\n        _dpLuRow(\"tog_dpsrc\", \"◉ 🔄 段评切换：\" + _dpDpSrcLabel(cur), \"_dpToggleDpSrc(java)\", false, 1)\n    ];\n}\nfunction _dpToggleDpSrc(jav) {\n    var s = _dpSrcOf(jav);\n    var now = _dpDpSrcGet(jav);\n    var next = (now === 'qq') ? 'qd' : 'qq';\n    _dp3Put(s, 'dp_dpsrc', next);\n    var got = next;\n    try {\n        var r = String(jav.ajax(_dpSrv() + '/qqdp/dpsrc?src=' + next) || '');\n        var o = JSON.parse(r);\n        if (o && o.pref) { got = String(o.pref); }\n    } catch (e1) {}\n    if (got !== next) { _dp3Put(s, 'dp_dpsrc', got); }\n    var upd = {};\n    upd[\"tog_dpsrc\"] = \"◉ 🔄 段评切换：\" + _dpDpSrcLabel(got);\n    _dpLuDone(jav, '段评已切换到：' + _dpDpSrcLabel(got), upd);\n    return '';\n}\n\nfunction _dpSegHotRows(jav) {\n    var rows = [];\n    rows.push(_dpLuRow(\"tog_head\", \"↓   段评   ↓\", null, false, 1));\n    rows.push(_dpLuRow(\"tog_bubble\", _dpBubbleLabel(_dpBubbleOn(jav)), \"_dpToggleBubbleSw(java)\", false, 1));\n    rows.push(_dpLuRow(\"tog_segcard\", _dpSegCardLabel(_dpSegCardOn(jav)), \"_dpToggleSegCardSw(java)\", false, 1));\n    rows.push(_dpLuRow(\"tog_endcard\", _dpEndCardLabel(_dpEndCardOn(jav)), \"_dpToggleEndCardSw(java)\", false, 1));\n    rows.push(_dpLuRow(\"tog_theme\", \"◉ 🎨 卡片配色：\" + _dpCardThemeLabel(_dpTheme(jav)),\n        \"_dpToggleTheme(java)\", false, 1));\n    try {\n        var _dpRows = _dpDpSrcRows(jav);\n        for (var _dpi = 0; _dpi < _dpRows.length; _dpi++) rows.push(_dpRows[_dpi]);\n    } catch (eDP) {}\n    return rows;\n}\n\nfunction _dpLuFallback() {\n    try {\n        return JSON.stringify([\n            _dpLuRow(\"lu_hint\", \"↓   账号登录   ↓\", null, false, 1),\n            _dpLuRow(\"lu_fqweb\", \"🍅 番茄账号登录\", \"_dpFqWebLogin(java, (typeof cookie!==\\\"undefined\\\"?cookie:null))\", false, 0.45),\n            _dpLuRow(\"lu_login\", \"📖 起点网页登录\", \"_dpLuLogin(java, \\\"\\\")\", false, 0.45),\n            _dpLuRow(\"lu_tip\", \"部分设置暂不可用，账号登录仍可继续\", null, false, 1)\n        ]);\n    } catch (e) { return \"[]\"; }\n}\n\n\n\nfunction _dpLuDone(jav, msg, upd) {\n    try { jav.toast(msg); } catch (e) {}\n    if (upd) { try { jav.upLoginData(upd); } catch (e0) {} }\n    try { jav.refreshContent(); } catch (e2) {}\n}\n\n\n\n\n\n\n\n\nfunction _dpLuLogin(jav, url) {\n    try {\n        var jv = _dpJv(jav);\n        var u = String(url || '');\n        if (!u) { try { var s = _dpSrcOf(jv); if (s && s.loginUrl) u = String(s.loginUrl); } catch (e0) {} }\n        if (!u) u = 'https://ptlogin.qidian.com/login';\n        try { jv.startBrowser(u, '登录起点'); return ''; } catch (e1) {}\n        try { if (jv && jv.showBrowser) jv.showBrowser(u); } catch (e2) {}\n    } catch (e) { try { jav.toast('打开登录页失败：' + (e && e.message ? e.message : e)); } catch (e3) {} }\n    return '';\n}\n\nfunction _dpFqAuthBase(jav) {\n    try { if (_DP3_SRV_OK) return String(_DP3_SRV_OK).replace(/\\/+$/, ''); } catch (e0) {}\n    try { if (_DP3_SRVS && _DP3_SRVS.length) return String(_DP3_SRVS[0]).replace(/\\/+$/, ''); } catch (e1) {}\n    return _dpSrv();\n}\n\n\n\nfunction _dpFqAuthLogin(jav) {\n    try {\n        var jv = _dpJv(jav);\n        var u = _dpFqAuthBase(jv) + '/fq/auth/login';\n        try { jv.startBrowser(u, '番茄登录/续期'); return ''; } catch (e1) {}\n        try { if (jv && jv.showBrowser) jv.showBrowser(u); } catch (e2) {}\n    } catch (e) { try { jav.toast('打开番茄登录页失败：' + (e && e.message ? e.message : e)); } catch (e3) {} }\n    return '';\n}\n\n\n\nvar _DP_FQ_GRAB_CHAN = '';\n\nfunction _dpFqCookieGet(jv, tag, ckObj) {\n    var v = '';\n    try {\n        if (ckObj && typeof ckObj.getCookie === 'function') v = String(ckObj.getCookie(tag) || '');\n    } catch (e0) { v = ''; }\n    if (!v) {\n        try {\n            if (typeof cookie !== 'undefined' && cookie && typeof cookie.getCookie === 'function') {\n                v = String(cookie.getCookie(tag) || '');\n            }\n        } catch (e1) { v = ''; }\n    }\n    if (!v && jv) {\n        try { if (typeof jv.getCookie === 'function') v = String(jv.getCookie(tag) || ''); } catch (e2) { v = ''; }\n    }\n    if (!v && jv) {\n        try {\n            if (typeof jv.getCookieStore === 'function') {\n                var st = jv.getCookieStore();\n                if (st && typeof st.getCookie === 'function') v = String(st.getCookie('https://' + tag + '/') || '');\n            }\n        } catch (e3) { v = ''; }\n    }\n    return v;\n}\n\nfunction _dpFqGrabCookie(jav, ckObj) {\n    var jv = _dpJv(jav);\n    var PREF = ['fanqienovel.com', 'www.fanqienovel.com', 'm.fanqienovel.com'];\n    var REST = ['fqnovel.com', 'reading.snssdk.com', 'snssdk.com', 'bytedance.com'];\n    var chan = [];\n    var SESS = /(?:^|;\\s*)(?:sessionid|sessionid_ss|sid_guard|sid_tt|sid_ucp_v1|ssid_ucp_v1)=/;\n\n    function merge(list) {\n        var bag = {}, order = [], i, j, m;\n        for (i = 0; i < list.length; i++) {\n            var c = _dpFqCookieGet(jv, list[i], ckObj);\n            if (!c) continue;\n            chan.push(list[i] + '(' + c.length + ')');\n            var parts = c.split(';');\n            for (j = 0; j < parts.length; j++) {\n                var kv = String(parts[j]).replace(/^\\s+|\\s+$/g, '');\n                if (!kv || kv.indexOf('=') < 0) continue;\n                var k = kv.split('=')[0];\n                if (k && !bag[k]) { bag[k] = kv; order.push(k); }\n            }\n        }\n        var out = [];\n        for (m = 0; m < order.length; m++) out.push(bag[order[m]]);\n        return out.join('; ');\n    }\n\n    var s1 = merge(PREF);\n    if (SESS.test(s1)) {\n        try { _DP_FQ_GRAB_CHAN = chan.join(', '); } catch (eA) {}\n        return s1;\n    }\n    var s2 = merge(REST);\n    var all = (s1 && s2) ? (s1 + '; ' + s2) : (s1 || s2);\n    try { _DP_FQ_GRAB_CHAN = chan.join(', ') || '(空)'; } catch (eB) {}\n    return SESS.test(all) ? all : '';\n}\n\nfunction _dpFqGrabSave(jav, ckObj) {\n    try {\n        var jv = _dpJv(jav);\n        var ck = _dpFqGrabCookie(jv, ckObj);\n        if (!ck) {\n            try { jv.toast('❌ 没抓到登录态 Cookie —— 已打开诊断页'); } catch (e0) {}\n            try { _dpFqDiag(jv); } catch (eD) {}\n            return '';\n        }\n        var base = _dpFqAuthBase(jv);\n        var txt = '', how = '';\n        var tries = [];\n\n        try {\n            var enc = '';\n            try { enc = encodeURIComponent(ck); } catch (eE) { enc = ck; }\n        var u = base + '/fq/auth/setq?switch=1&ck=' + enc;\n            txt = String(jv.ajax(u, 20000) || '');\n            how = 'S1 GET /fq/auth/setq';\n        } catch (e1) { txt = ''; tries.push('S1:' + (e1 && e1.message ? e1.message : e1)); }\n\n        if (!txt) {\n            try {\n                var p2 = JSON.stringify({ Cookie: ck });\n                txt = String(jv.post(base + '/fq/auth/set', p2,\n                    { 'Content-Type': 'application/json;charset=utf-8' }, 20000).body() || '');\n                how = 'S2 POST /fq/auth/set';\n            } catch (e2) { txt = ''; tries.push('S2:' + (e2 && e2.message ? e2.message : e2)); }\n        }\n\n        if (!txt) {\n            try {\n                var p3 = JSON.stringify({ Cookie: ck });\n                txt = String(jv.post(base + '/fq/auth/set', p3, {}, 20000).body() || '');\n                how = 'S3 POST(空headers)';\n            } catch (e3) { txt = ''; tries.push('S3:' + (e3 && e3.message ? e3.message : e3)); }\n        }\n\n        var ok = false, msg = '', tail = '';\n        try {\n            var o = JSON.parse(txt);\n            ok = !!o.ok;\n            if (ok) {\n                msg = o.user || o.probe || '';\n                var stt = o.status || {};\n                var dl = (stt.days_left === null || stt.days_left === undefined) ? null : stt.days_left;\n                if (dl !== null) tail = '（剩 ' + dl + ' 天）';\n            } else {\n                msg = o.err || '';\n            }\n        } catch (e4) {}\n        try { jv.toast(ok ? ('✅ 番茄凭证已保存 · ' + msg + tail) : ('❌ 保存失败：' + (msg || '服务器无响应'))); } catch (e5) {}\n        if (ok) {\n            try { if (jv.refreshContent) jv.refreshContent(); } catch (e7) {}\n        } else {\n            try {\n                var d = _dpFqDiagText(jv);\n                d += '\\n\\n--- 本次上传 ---\\n抓取通道: ' + String(_DP_FQ_GRAB_CHAN || '(无)')\n                   + '\\nCookie 长度: ' + ck.length\n                   + '\\n上传策略: ' + (how || '(三条全失败)')\n                   + '\\n策略报错: ' + (tries.join(' | ') || '(无)')\n                   + '\\n服务器返回: ' + (txt || '(空)');\n                _dpFqShowDiag(jv, '❌ 保存失败 · 诊断', d);\n            } catch (e8) {}\n        }\n    } catch (e) { try { jav.toast('抓取失败：' + (e && e.message ? e.message : e)); } catch (e9) {} }\n    return '';\n}\n\nfunction _dpFqWebLogin(jav, ckObj) {\n    var jv = _dpJv(jav);\n    var opened = false;\n    try {\n        if (jv && typeof jv.startBrowserAwait === 'function') {\n            jv.startBrowserAwait('https://fanqienovel.com/', '番茄登录（登录完成后返回）');\n            opened = true;\n        }\n    } catch (e1) { opened = false; }\n    if (!opened) {\n        try { return _dpFqAuthLogin(jv); } catch (e2) {}\n        try { if (jv && jv.toast) jv.toast('无法打开番茄登录页，请检查书源服务器连接'); } catch (e3) {}\n        return '';\n    }\n    try { return _dpFqGrabSave(jv, ckObj); } catch (e4) { return ''; }\n}\n\nfunction _dpFqCookieHosts() {\n    return [\n        'https://fanqienovel.com', 'https://fanqienovel.com/',\n        'https://www.fanqienovel.com', 'https://www.fanqienovel.com/',\n        'https://m.fanqienovel.com', 'https://m.fanqienovel.com/',\n        'https://reading.snssdk.com', 'https://reading.snssdk.com/',\n        'https://api5-normal-sinfonlineb.fqnovel.com', 'https://api5-normal-sinfonlineb.fqnovel.com/',\n        'https://api.fqnovel.com', 'https://api.fqnovel.com/',\n        'https://fqnovel.com', 'https://fqnovel.com/',\n        'https://sso.snssdk.com', 'https://sso.snssdk.com/',\n        'https://passport.snssdk.com', 'https://passport.snssdk.com/',\n        'https://snssdk.com', 'https://snssdk.com/',\n        'https://sso.bytedance.com', 'https://sso.bytedance.com/',\n        'https://bytedance.com', 'https://bytedance.com/',\n        'https://www.bytedance.com', 'https://www.bytedance.com/'\n    ];\n}\n\nfunction _dpFqShowDiag(jav, title, lines) {\n    var jv = _dpJv(jav);\n    var esc = String(lines == null ? '' : lines)\n        .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n    var html = '<!DOCTYPE html><html><head><meta charset=\"utf-8\">'\n        + '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">'\n        + '<style>body{background:#f5f6f8;color:#1f2328;margin:0;padding:14px;'\n        + 'font:14px/1.6 -apple-system,\"PingFang SC\",\"Microsoft YaHei\",sans-serif}'\n        + 'h2{font-size:17px;margin:0 0 10px}pre{background:#1f2328;color:#e8eaed;padding:12px;'\n        + 'border-radius:9px;font-size:11.5px;line-height:1.55;white-space:pre-wrap;word-break:break-all}</style>'\n        + '</head><body><h2>' + title + '</h2><pre>' + esc + '</pre></body></html>';\n    try { jv.startBrowser('https://fanqienovel.com/', title, html); return true; } catch (e0) {}\n    try { if (jv.showBrowser) { jv.showBrowser('https://fanqienovel.com/', html, '', ''); return true; } } catch (e1) {}\n    return false;\n}\n\nfunction _dpFqDiagText(jav) {\n    var jv = _dpJv(jav), L = [], ck = null, err = '', i;\n    L.push('java 对象          : ' + (jv ? 'OK' : 'NULL'));\n    L.push('java.getCookieStore: ' + !!(jv && jv.getCookieStore)\n        + '   ← Legado JS 里没有这个 API，false 是正常的，不是故障');\n    try { ck = (jv && jv.getCookieStore) ? jv.getCookieStore() : null; } catch (e0) { err = String(e0 && e0.message ? e0.message : e0); }\n    L.push('CookieStore 实例   : ' + (ck ? 'OK' : 'NULL') + (err ? ('  err=' + err) : ''));\n    L.push('java.getCookie()   : ' + !!(jv && typeof jv.getCookie === 'function'));\n    L.push('store.getCookie()  : ' + !!(ck && typeof ck.getCookie === 'function'));\n    L.push('store.getKey()     : ' + !!(ck && typeof ck.getKey === 'function'));\n    L.push('');\n    L.push('--- 各域名 Cookie（最多显示 180 字）---');\n    var hosts = _dpFqCookieHosts(), nonEmpty = 0;\n    for (i = 0; i < hosts.length; i++) {\n        var v = '';\n            try { v = String(ck && ck.getCookie ? (ck.getCookie(hosts[i]) || '') : ''); } catch (e2) { v = 'ERR:' + (e2 && e2.message); }\n        if (v && v.indexOf('ERR:') !== 0) nonEmpty++;\n        L.push((v ? '[有] ' : '[空] ') + hosts[i] + '  =>  ' + (v ? (v.length + ' 字符  ' + v.slice(0, 180)) : ''));\n    }\n    L.push('');\n    L.push('非空域名数: ' + nonEmpty + ' / ' + hosts.length);\n    var merged = _dpFqGrabCookie(jv);\n    L.push('合并后长度: ' + merged.length);\n    L.push('合并内容  : ' + (merged || '(空)'));\n    L.push('');\n    L.push('--- 服务端 ---');\n    var base = _dpFqAuthBase(jv);\n    L.push('base = ' + base);\n    var st = null;\n    try { st = _dp3Try(jv, '/fq/auth/status?test=1', null, 8000); } catch (e3) {}\n    L.push('status = ' + (st ? JSON.stringify(st) : '(取不到)'));\n    return L.join('\\n');\n}\n\nfunction _dpFqDiag(jav) {\n    try {\n        var jv = _dpJv(jav);\n        var txt = _dpFqDiagText(jv);\n        if (!_dpFqShowDiag(jv, '🔍 番茄凭证抓取诊断', txt)) {\n            try { jv.toast(txt.slice(0, 400)); } catch (e1) {}\n        }\n    } catch (e) { try { jav.toast('诊断失败：' + (e && e.message ? e.message : e)); } catch (e2) {} }\n    return '';\n}\n\n\n\n\n\nfunction _dpLuList(bko, jav) {\n    var rows = [];\n    jav = _dpJv(jav);\n    try {\n        rows.push(_dpLuRow(\"lu_login_head\", \"↓   账号登录   ↓\", null, false, 1));\n        rows.push(_dpLuRow(\"lu_fqweb\", \"🍅 番茄账号登录\", \"_dpFqWebLogin(java, (typeof cookie!==\\\"undefined\\\"?cookie:null))\", false, 0.45));\n        rows.push(_dpLuRow(\"lu_login\", \"📖 起点网页登录\", \"_dpLuLogin(java, \\\"\\\")\", false, 0.45));\n        try { rows = rows.concat(_dpGradeRows(jav)); } catch (eG0) {}\n        try { rows = rows.concat(_dpSegHotRows(jav)); } catch (eS0) {}\n        return JSON.stringify(rows);\n    } catch (e) {\n        try { return _dpLuFallback(); } catch (e2) { return \"[]\"; }\n    }\n}\n\n\n\n\n\n\n\nfunction __qpCsrf(jav, ck, src) {\n    var K = 'qp_csrf', TTL = 12 * 3600 * 1000, tok = '';\n    var now = 0; try { now = new Date().getTime(); } catch (e) { now = 0; }\n    try { if (_QP_CSRF && _QP_CSRF.t && (now - _QP_CSRF.t) < TTL) return _QP_CSRF.v; } catch (e0) {}\n    try {\n        var raw = src ? String(src.get(K) || '') : '';\n        if (raw) {\n            var o = JSON.parse(raw);\n            if (o && o.t && (now - o.t) < TTL && o.v) return String(o.v);\n        }\n    } catch (e1) {}\n    try { tok = String(ck.getKey('https://qidian.com', '_csrfToken') || ''); } catch (e2) { tok = ''; }\n    if (!tok) {\n        var urls = ['https://m.qidian.com/rank/', 'https://m.qidian.com/free/', 'https://m.qidian.com/'];\n        for (var i = 0; i < urls.length && !tok; i++) {\n            var r = null;\n            try { r = jav.get(urls[i], null, 15000); } catch (e3) { r = null; }\n            if (!r) continue;\n            try { tok = String(r.cookie('_csrfToken') || ''); } catch (e4) { tok = ''; }\n            if (!tok) {\n                var hh = '';\n                try { hh = String(r.headers() || ''); } catch (e5) { hh = ''; }\n                try { hh += '|' + String(r.headers().values('Set-Cookie').join('|') || ''); } catch (e5b) { hh = ''; }\n                var m1 = hh.match(/_csrfToken=([0-9a-fA-F\\-]{16,})/);\n                if (m1) tok = m1[1];\n            }\n            if (!tok) {\n                var bd = '';\n                try { bd = String(r.body() || ''); } catch (e6) { bd = ''; }\n                var m2 = bd.match(/_csrfToken[\"']?\\s*[:=]\\s*[\"']?([0-9a-fA-F\\-]{16,})/);\n                if (m2) tok = m2[1];\n            }\n        }\n    }\n    if (tok) {\n        try { _QP_CSRF = { t: now, v: tok }; } catch (e7) {}\n        try { if (src) src.put(K, JSON.stringify({ t: now, v: tok })); } catch (e8) {}\n    }\n    return tok;\n}\nvar _QP_CSRF = null;\n\n\n\n\nfunction _dpCtx() {\n    var o = { java: null, book: null, chapter: null };\n    try { if (typeof java !== 'undefined' && java) o.java = java; } catch (e1) {}\n    try { if (typeof book !== 'undefined' && book) o.book = book; } catch (e2) {}\n    try { if (typeof chapter !== 'undefined' && chapter) o.chapter = chapter; } catch (e3) {}\n    try { if (!o.java && this && this.java) o.java = this.java; } catch (e4) {}\n    try { if (!o.book && this && this.book) o.book = this.book; } catch (e5) {}\n    try { if (!o.chapter && this && this.chapter) o.chapter = this.chapter; } catch (e6) {}\n    if (!o.java) o.java = _dpJv();\n    try { if (!o.book && _DP_BK) o.book = _DP_BK; } catch (e7) {}\n    try { if (!o.chapter && _DP_CH) o.chapter = _DP_CH; } catch (e8) {}\n    return o;\n}\n\nfunction _dpBookName(b) {\n    try { if (b && b.name) return String(b.name).trim(); } catch (e) {}\n    return '';\n}\n\nfunction _dpBGet(b, k) {\n    if (!b || typeof b.getVariable !== 'function') return '';\n    try { var v = b.getVariable(k); return (v === undefined || v === null) ? '' : String(v); } catch (e) {}\n    return '';\n}\nfunction _dpBPut(b, k, v) {\n    if (!b || typeof b.putVariable !== 'function') return;\n    try { b.putVariable(k, String(v == null ? '' : v)); } catch (e) {}\n}\n\nfunction _dpSrcOf(jv) {\n    try {\n        if (jv) {\n            var s = null;\n            try { if (typeof jv.getSource === 'function') s = jv.getSource(); } catch (e0) {}\n            if (s && typeof s.get === 'function') return s;\n            if (typeof jv.get === 'function' && typeof jv.put === 'function') return jv;\n        }\n    } catch (e) {}\n    return null;\n}\n\nfunction _dpCandKey() { return 'dp3cands_'; }\nfunction _dpCandGet(b, src) {\n    var k = _dpCandKey() + _dpBookName(b);\n    var s = src ? (_dp3Get(src, k) || '') : '';\n    if (!s) s = _dpBGet(b, 'dp3cands');\n    if (!s) return null;\n    try { var a = JSON.parse(String(s)); if (a && a.length) return a; } catch (e) {}\n    return null;\n}\nfunction _dpCandSet(b, src, arr) {\n    var s = '';\n    try { s = JSON.stringify(arr); } catch (e1) { return; }\n    _dpBPut(b, 'dp3cands', s);\n    if (src) { try { _dp3Put(src, _dpCandKey() + _dpBookName(b), s); } catch (e2) {} }\n}\n\nfunction _dpPickGet(b) {\n    var s = _dpBGet(b, 'dp3pick');\n    if (!s) return null;\n    try { var o = JSON.parse(s); if (o && o.i) return o; } catch (e) {}\n    return null;\n}\nfunction _dpPickSave(c, it) {\n    var b = c.book, jv = c.java, k = _dpBookName(b);\n    var o = { i: it.i, u: it.u, n: it.n || '' };\n    _dpBPut(b, 'dp3pick', JSON.stringify(o));\n    _dpBPut(b, 'dp3cur', String(o.n || ''));\n    _dpBPut(b, 'dp3err', '');\n    var s = _dpSrcOf(jv);\n    if (s) { try { _dp3Put(s, 'dp3_' + k, JSON.stringify({ i: o.i, u: o.u })); } catch (e4) {} }\n    _dpBPut(b, 'dp3miss_' + k, '');\n    if (s) { try { _dp3Put(s, 'dp3miss_' + k, ''); } catch (e6) {} }\n    try { delete _DP3_CACHE['dp3miss_' + k]; } catch (e7) {}\n    try { if (k) _DP3_CACHE[k] = { i: o.i, u: o.u }; } catch (e5) {}\n    return o;\n}\nfunction _dpPickClear(c) {\n    var b = c.book, jv = c.java, k = _dpBookName(b);\n    _dpBPut(b, 'dp3pick', '');\n    _dpBPut(b, 'dp3cur', '');\n    _dpBPut(b, 'dp3err', '');\n    var s = _dpSrcOf(jv);\n    if (s) {\n        try { _dp3Put(s, 'dp3_' + k, ''); } catch (e1) {}\n        try { _dp3Put(s, 'dp3miss_' + k, ''); } catch (e2) {}\n    }\n    try { delete _DP3_CACHE['dp3miss_' + k]; } catch (e3) {}\n}\n\nfunction _dp3SrcName(r) {\n    try {\n        var t = String(r.intro || '');\n        var m = t.match(/来自\\s*[:：]\\s*([^\\]\\s|]+)/);\n        if (m && m[1]) return String(m[1]).trim();\n        var lc = String(r.lastChapter || '');\n        var p = lc.split(/[:：]/);\n        if (p.length > 1 && p[0] && p[0].length <= 12) return String(p[0]).trim();\n        var bu = String(r.bookUrl || '');\n        var mu = bu.match(/[?&]u=([^&]+)/);\n        if (mu) {\n            var u = decodeURIComponent(mu[1]);\n            var md = u.match(/^https?:\\/\\/([^\\/]+)/);\n            if (md) return md[1];\n        }\n    } catch (e) {}\n    return '';\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction _dpAggHost() {\n    try { if (_DP3_SRV_OK) return _DP3_SRV_OK; } catch (e0) {}\n    try { if (_DP3_SRVS && _DP3_SRVS.length) return _DP3_SRVS[0]; } catch (e1) {}\n    return _dpSrv();\n}\n\nfunction __dpIllu(txt, book, chapter, jav) {\n    var t = String(txt == null ? '' : txt);\n    try {\n        function _dec(s) {\n            s = String(s == null ? '' : s);\n            try { return decodeURIComponent(s); } catch (e) { return s; }\n        }\n\n        var ch = chapter;\n        if (!ch) { try { ch = _dpCtx().chapter; } catch (eCtx) {} }\n        if (!ch) { try { ch = _DP_CH; } catch (eCh) {} }\n        var bk = book;\n        if (!bk) { try { bk = _dpCtx().book; } catch (eBk) {} }\n\n        var bid = '';\n        try {\n            var bu = _dec(bk && bk.bookUrl ? String(bk.bookUrl) : '');\n            var m0 = bu.match(/book\\/(\\d+)/) || bu.match(/[?&]bid=(\\d+)/)\n                     || bu.match(/bookId=(\\d+)/);\n            if (m0) bid = m0[1];\n        } catch (eB) {}\n        var cid = '';\n        try {\n            var cu = _dec(ch && (ch.url || ch.chapterUrl) ? String(ch.url || ch.chapterUrl) : '');\n            var m1 = cu.match(/chapter\\/(\\d+)\\/(\\d+)/)\n                     || cu.match(/chapterId=(\\d+)/)\n                     || cu.match(/(\\d{6,})\\/?$/)\n                     || cu.match(/\\/(\\d{5,})\\/?$/);\n            if (m1) cid = m1.length > 2 ? m1[2] : m1[1];\n            if (!cid) {\n                var m2 = cu.match(/\\/(\\d{6,})(?:\\/|$)/g);\n                if (m2 && m2.length) {\n                    var last = m2[m2.length - 1].replace(/\\//g, '');\n                    if (last && last !== bid) cid = last;\n                }\n            }\n        } catch (eC) {}\n        if (!cid && t) {\n            try {\n                var m3 = t.match(/chapterId[\"'\\s:=]+(\\d{6,})/);\n                if (m3) cid = m3[1];\n            } catch (eS) {}\n        }\n        if (!bid || !cid) {\n            try {\n                var _aq = (__dpIllu._aggQd || {})[String(_dpAggCur(ch, ''))];\n                if (_aq) { if (!bid) bid = _aq.bid; if (!cid) cid = _aq.cid; }\n            } catch (eAq) {}\n        }\n        if (!cid) {\n            try { _DP_ILLU_DIAG = 'no-cid'; } catch (eD) {}\n            return t;\n        }\n        var kk = (bid || '?') + '_' + cid;\n        try { if (__dpIllu._seen === undefined) __dpIllu._seen = {}; } catch (eInit) {}\n\n        if (t.indexOf('class=\"dp-illu\"') >= 0) {\n            try { _DP_ILLU_DIAG = 'skip: already injected'; } catch (eD1) {}\n            return t;\n        }\n\n        var payload = null;\n        if (__dpIllu._seen[kk] !== undefined) {\n            payload = __dpIllu._seen[kk];\n        } else {\n            var host = _dpAggHost();\n            var url = host + '/api/illu?bid=' + encodeURIComponent(bid)\n                            + '&cid=' + encodeURIComponent(cid);\n            var body = '', _netOK = false;\n            try {\n                var _r1 = jav.get(url, {}, 25000);\n                if (_r1) { body = String(_r1.body() || ''); _netOK = true; }\n            } catch (e0) {\n                try {\n                    var _r2 = jav.get(url, {}, 25000);\n                    if (_r2) { body = String(_r2.body() || ''); _netOK = true; }\n                } catch (e1) { _netOK = false; }\n            }\n            body = String(body || '').replace(/^\\s+|\\s+$/g, '');\n            if (body && body.charAt(0) === '{') {\n                try { payload = JSON.parse(body); } catch (eJ) { payload = null; }\n            }\n            if (!payload) {\n                payload = { ok: false, hit: false, items: [] };\n            }\n            if (_netOK) { try { __dpIllu._seen[kk] = payload; } catch (eS0) {} }\n        }\n        var items = (payload && payload.items) ? payload.items : [];\n        try {\n            _DP_ILLU_DIAG = 'bid=' + bid + ' cid=' + cid + ' items=' + items.length;\n        } catch (eD2) {}\n        if (!items.length) return t;\n\n        function _norm(s) {\n            return String(s == null ? '' : s)\n                .replace(/[\\s\\u3000]+/g, '')\n                .replace(/[\\u2018\\u2019\\u201c\\u201d\\u300c\\u300d\\u300e\\u300f]/g, '\"')\n                .replace(/[\\u2026]+/g, '\\u2026')\n                .replace(/[\\u2014\\u2015]+/g, '\\u2014');\n        }\n        var txtN = '', srcArr = [];\n        (function () {\n            var i = 0, n = t.length;\n            while (i < n) {\n                var c = t.charAt(i);\n                if (c === '\\u2026') {\n                    var j1 = i; while (j1 < n && t.charAt(j1) === '\\u2026') j1++;\n                    txtN += '\\u2026'; srcArr.push(i); i = j1; continue;\n                }\n                if (c === '\\u2014' || c === '\\u2015') {\n                    var j2 = i; while (j2 < n && (t.charAt(j2) === '\\u2014' || t.charAt(j2) === '\\u2015')) j2++;\n                    txtN += '\\u2014'; srcArr.push(i); i = j2; continue;\n                }\n                if (/[\\s\\u3000]/.test(c)) { i++; continue; }\n                if (/[\\u2018\\u2019\\u201c\\u201d\\u300c\\u300d\\u300e\\u300f]/.test(c)) {\n                    txtN += '\"'; srcArr.push(i); i++; continue;\n                }\n                txtN += c; srcArr.push(i); i++;\n            }\n        })();\n\n        function _posOf(endNorm) {\n            var posRaw = srcArr[endNorm];\n            if (posRaw === undefined) return -1;\n            var ch0 = t.charAt(posRaw);\n            if (ch0 === '\\u2026') {\n                var jj = posRaw; while (jj < t.length && t.charAt(jj) === '\\u2026') jj++;\n                posRaw = jj - 1;\n            } else if (ch0 === '\\u2014' || ch0 === '\\u2015') {\n                var jj2 = posRaw; while (jj2 < t.length && (t.charAt(jj2) === '\\u2014' || t.charAt(jj2) === '\\u2015')) jj2++;\n                posRaw = jj2 - 1;\n            }\n            var pos = posRaw + 1;   \n            var TAILCH = '\\u3002\\uff01\\uff1f\\uff1b\\uff0c\\u2026\\u2014\"\\'\\u201d\\u2019)\\uff09]\\u3011\\u300b\\u300d\\u300f}> \\t\\r\\n\\u3000';\n            while (pos < t.length && TAILCH.indexOf(t.charAt(pos)) >= 0) pos++;\n            if (t.substr(pos, 4) === '</p>') pos += 4;\n            return pos;\n        }\n        function _endsOf(anchorBefore) {\n            var a = _norm(anchorBefore), res = [], from = 0, guard = 0;\n            if (a.length < 4) return res;          \n            while (guard++ < 64) {\n                var ip = txtN.indexOf(a, from);\n                if (ip < 0) break;\n                var p = _posOf(ip + a.length - 1);\n                if (p >= 0) res.push(p);\n                from = ip + 1;\n            }\n            if (!res.length) {\n                var tail = a.slice(-8), tp = txtN.indexOf(tail);\n                if (tp >= 0) { var q1 = _posOf(tp + tail.length - 1); if (q1 >= 0) res.push(q1); }\n            }\n            if (!res.length) {\n                var head = a.slice(0, 8), hp = txtN.indexOf(head);\n                if (hp >= 0) { var q2 = _posOf(hp + head.length - 1); if (q2 >= 0) res.push(q2); }\n            }\n            return res;\n        }\n        function _findEnd(anchorBefore, refRaw) {\n            var res = _endsOf(anchorBefore);\n            if (!res.length) return -1;\n            if (refRaw >= 0 && res.length > 1) {\n                var best = res[0], bd = Math.abs(res[0] - refRaw);\n                for (var i = 1; i < res.length; i++) {\n                    var d = Math.abs(res[i] - refRaw);\n                    if (d < bd) { bd = d; best = res[i]; }\n                }\n                return best;\n            }\n            return res[0];\n        }\n\n        var _AD_RE = /下载本站免费小说阅读器|手机浏览器扫码下载|随时随地免费看小说|本章有错误|推荐本书|加入书架|投推荐票|收藏本站|手机浏览器访问|打开手机阅读|返回书架|最新网址|浏览器打开|点击安装|继续阅读|作者的话|作者有话说|作者感言|先更后改|求月票|求推荐票|求订阅|求票|ps[:：]|PS[:：]/;\n        function _segBounds() {\n            var bs = [], re = /<p[^>]*>|<\\/p\\s*>|\\r?\\n/g, m2;\n            var cur = 0;\n            while ((m2 = re.exec(t)) !== null) {\n                bs.push({ start: cur, end: m2.index });\n                cur = m2.index + m2[0].length;\n            }\n            bs.push({ start: cur, end: t.length });\n            return bs;\n        }\n        function _findByParaEnd(n) {\n            if (!(n > 0)) return -1;\n            var bs = _segBounds(), cnt = 0;\n            for (var i = 0; i < bs.length; i++) {\n                var s = t.slice(bs[i].start, bs[i].end)\n                    .replace(/<[^>]*>/g, '').replace(/&nbsp;/g, ' ');\n                s = s.replace(/^\\s+|\\s+$/g, '');\n                if (!s) continue;\n                if (s.length >= 4 && _AD_RE.test(s)) continue;\n                cnt++;\n                if (cnt === n) return bs[i].end;\n            }\n            return -1;\n        }\n\n        var plan = [];\n        for (var ii = 0; ii < items.length; ii++) {\n            var it = items[ii] || {};\n            var anc = it.anchor || {};\n            var at = -1;\n            var paraRef = (anc.para > 0) ? _findByParaEnd(anc.para) : -1;\n            if (anc.before) at = _findEnd(anc.before, paraRef);\n            if (at < 0 && anc.after) {\n                var an = _norm(anc.after), ap = -1, from2 = 0, g2 = 0;\n                while (g2++ < 64) {\n                    var h2 = txtN.indexOf(an, from2);\n                    if (h2 < 0) break;\n                    var p3 = srcArr[h2];\n                    if (p3 !== undefined && (ap < 0\n                            || (paraRef >= 0 && Math.abs(p3 - paraRef) < Math.abs(ap - paraRef)))) {\n                        ap = p3;\n                    }\n                    if (ap >= 0 && paraRef < 0) break;\n                    from2 = h2 + 1;\n                }\n                at = ap;\n            }\n            if (at < 0) at = paraRef;\n            if (at < 0) {\n                try { _DP_ILLU_DIAG += ' drop@' + ii; } catch (eDd) {}\n                continue;\n            }\n            plan.push({ at: at, html: it.html });\n        }\n        if (!plan.length) {\n            return t;\n        }\n\n        plan.sort(function (a, b) { return a.at - b.at; });\n        var out = '', last = 0;\n        for (var pi = 0; pi < plan.length; pi++) {\n            var p = plan[pi];\n            var cut = (p.at < last) ? last : p.at;\n            var seg = t.slice(last, cut);\n            if (seg && !/[\\r\\n]$/.test(seg)) seg += '\\n';\n            out += seg;\n            out += '<div class=\"dp-illu\">' + p.html + '</div>';\n            last = cut;\n        }\n        var rest = t.slice(last);\n        if (rest && !/^[\\r\\n]/.test(rest) && !/^\\s*$/.test(rest)) {\n            out += '\\n';\n        }\n        out += rest;\n        return out;\n    } catch (e) {\n        try { _DP_ILLU_DIAG = 'err ' + (e && e.message ? e.message : String(e)); } catch (eD3) {}\n        return t;\n    }\n}\n\nfunction _dpIsAgg(u) {\n    return /\\/api\\/(?:book|toc|chapter)\\?/i.test(String(u == null ? '' : u));\n}\nfunction _dpAggI(u) { var m = String(u == null ? '' : u).match(/[?&]i=(\\d+)/); return m ? m[1] : ''; }\nfunction _dpAggU(u) { var m = String(u == null ? '' : u).match(/[?&]u=([^&]+)/); return m ? decodeURIComponent(m[1]) : ''; }\nfunction _dpAggSwUrl(url, jav) {\n    var b = true, s = true, e = true, t = 'white';\n    try { b = _dpBubbleOn(jav); } catch (e0) {}\n    try { s = _dpSegCardOn(jav); } catch (e1) {}\n    try { e = _dpEndCardOn(jav); } catch (e2) {}\n    try { t = _dpTheme(jav); } catch (e3) {}\n    return url + (url.indexOf('?') >= 0 ? '&' : '?')\n        + 'bubble=' + (b ? '1' : '0')\n        + '&segcard=' + (s ? '1' : '0')\n        + '&endcard=' + (e ? '1' : '0')\n        + '&theme=' + t;\n}\nfunction _dpAggApi(kind, i, u) {\n    return _dpAggHost() + '/api/' + kind + '?i=' + i + '&u=' + encodeURIComponent(u);\n}\nfunction _dpAggCur(chapter, baseUrl) {\n    var a = '';\n    try { a = chapter ? String(chapter.url || '') : ''; } catch (e0) {}\n    if (!_dpIsAgg(a)) { try { a = chapter ? String(chapter.baseUrl || '') : ''; } catch (e1) {} }\n    if (!_dpIsAgg(a)) { try { a = String(baseUrl || ''); } catch (e2) {} }\n    return a;\n}\nfunction _dpAggWant(chapter, baseUrl) { return _dpIsAgg(_dpAggCur(chapter, baseUrl)); }\nfunction _dpAggStripIntro(s) {\n    return String(s == null ? '' : s).replace(/^\\s*\\[来自\\s*[:：][^\\]]*\\]\\s*/, '').trim();\n}\nfunction _dpStripTags(s) {\n    return String(s == null ? '' : s).replace(/<[^>]*>/g, '').replace(/&nbsp;/g, ' ').trim();\n}\n\nfunction _dpQdSearchItems(h) {\n    var out = [], i, parts = String(h == null ? '' : h).split('<div class=\"y-list__item\"');\n    for (i = 1; i < parts.length; i++) {\n        var seg = parts[i];\n        var mb = seg.match(/data-bid=\"(\\d+)\"/);\n        if (!mb) continue;\n        var mn = seg.match(/<h2[^>]*class=\"[^\"]*_searchBookName[^\"]*\"[^>]*>([\\s\\S]*?)<\\/h2>/i);\n        var name = mn ? _dpStripTags(mn[1]) : '';\n        if (!name) { var mt = seg.match(/\\btitle=\"([^\"]*?)在线阅读\"/); if (mt) name = mt[1]; }\n        if (!name) continue;\n        var ma = seg.match(/<p[^>]*class=\"[^\"]*_searchBookAuthor[^\"]*\"[^>]*>([\\s\\S]*?)<\\/p>/i);\n        var mi = seg.match(/<p[^>]*class=\"[^\"]*_searchBookDesc[^\"]*\"[^>]*>([\\s\\S]*?)<\\/p>/i);\n        var mk = seg.match(/<div[^>]*class=\"[^\"]*_tags[^\"]*\"[^>]*>([\\s\\S]*?)<\\/div>/i);\n        var mc = seg.match(/<img[^>]*class=\"[^\"]*_bookImg[^\"]*\"[^>]*>/i);\n        var cover = '';\n        if (mc) { var md = mc[0].match(/data-src=\"([^\"]+)\"/); if (md) cover = md[1]; }\n        if (cover.indexOf('//') === 0) cover = 'https:' + cover;\n        var kindTxt = mk ? _dpStripTags(mk[1]) : '';\n        var wcTxt = '';\n        if (mk) {\n            try {\n                var mws = String(mk[1]).match(/([\\d]+(?:\\.[\\d]+)?)\\s*(万)?字/);\n                if (mws) {\n                    wcTxt = mws[1] + (mws[2] ? '万' : '') + '字';\n                    kindTxt = kindTxt.replace(/[\\d]+(?:\\.[\\d]+)?\\s*万?字/g, '')\n                                     .replace(/\\s{2,}/g, ' ').replace(/^\\s+|\\s+$/g, '');\n                }\n            } catch (eW) { }\n        }\n        out.push({\n            name: name,\n            author: ma ? _dpStripTags(ma[1]) : '',\n            intro: mi ? _dpStripTags(mi[1]) : '',\n            kind: kindTxt,\n            coverUrl: cover,\n            lastChapter: '',\n            wordCount: wcTxt,\n            bookUrl: 'https://m.qidian.com/book/' + mb[1] + '/'\n        });\n    }\n    return out;\n}\n\nfunction _dpAggRows(rows, key) {\n    var agg = [], seen = {}, i;\n    for (i = 0; i < rows.length; i++) {\n        var r = rows[i]; if (!r) continue;\n        var bu = String(r.bookUrl || ''); if (!bu) continue;\n        var isQd = /qidian\\.com\\/book\\//.test(bu);\n        var mi = bu.match(/[?&]i=(\\d+)/);\n        if (!isQd && !mi) continue;\n        var nm = String(r.name || '').replace(/^\\s+|\\s+$/g, ''); if (!nm) continue;\n        var _au = String(r.author || '').replace(/^\\s+|\\s+$/g, '');\n        var kk = (isQd ? 'qd' : mi[1]) + '|' + _dp3Norm(nm) + '|' + _dp3Norm(_au);\n        if (seen[kk]) continue;\n        seen[kk] = 1;\n        var kd = String(r.kind || ''), sn = '';\n        if (isQd) {\n            if (kd.indexOf('起点') !== 0) kd = '起点｜' + kd;\n            sn = '起点';\n        } else {\n            try { sn = _dp3SrcName(r); } catch (eS) { }\n            if (!sn) sn = '源' + (mi ? mi[1] : '?');\n            if (kd.indexOf('〔') !== 0) kd = '〔' + sn + '〕' + (kd ? ' ' + kd : '');\n        }\n        var lc = String(r.lastChapter || '').replace(/^\\s+|\\s+$/g, '');\n        agg.push({\n            name: nm,\n            author: String(r.author || ''),\n            intro: _dpAggStripIntro(r.intro),\n            kind: kd,\n            coverUrl: String(r.coverUrl || ''),\n            lastChapter: lc,\n            wordCount: String(r.wordCount || ''),\n            bookUrl: bu\n        });\n    }\n    return agg.slice(0, 60);\n}\n\n\nfunction _dpSearchRows(raw, key, jav, src) {\n    var out = [], i;\n    var _k0 = '';\n    try { _k0 = (typeof key === 'undefined' || key == null) ? '' : String(key); } catch (eK0) { _k0 = ''; }\n    _k0 = _k0.replace(/^\\s+|\\s+$/g, '');\n    try {\n        var _j0 = JSON.parse(String(raw == null ? '' : raw));\n        var _a0 = null;\n        if (Object.prototype.toString.call(_j0) === '[object Array]') _a0 = _j0;\n        else if (_j0 && Object.prototype.toString.call(_j0.list) === '[object Array]') _a0 = _j0.list;\n        else if (_j0 && Object.prototype.toString.call(_j0.data) === '[object Array]') _a0 = _j0.data;\n        if (_a0 && _a0.length) return _dpAggRows(_a0, _k0);\n    } catch (eJ0) { }\n    try { out = _dpQdSearchItems(raw); } catch (eQ) { out = []; }\n    try {\n        if (!_k0) return out;\n        var rows = _dp3Try(jav, '/api/search?key=' + encodeURIComponent(_k0) + '&type=novel', src, _DP3_TO_SEARCH);\n        if (!rows || !rows.length) return out;\n        var agg = _dpAggRows(rows, _k0);\n        for (i = 0; i < agg.length; i++) out.push(agg[i]);\n    } catch (e1) { }\n    return out;\n}\n\n\nfunction _dpInfoFallback(book, field) {\n    try {\n        if (!book) return '';\n        if (field === 'name') return String(book.name || '');\n        if (field === 'author') return String(book.author || '');\n        if (field === 'coverUrl') return String(book.coverUrl || '');\n        if (field === 'kind') return String(book.kind || '');\n    } catch (e) { }\n    return '';\n}\nfunction _dpEpubHit() {\n    for (var i = 0; i < arguments.length; i++) {\n        var s = String(arguments[i] == null ? '' : arguments[i]);\n        if (!s) continue;\n        if (/\\.epub([?#]|$)/i.test(s)) return s.slice(0, 60);\n        if (/(^|[\\s,，;；|/])epub([\\s,，;；|/]|$)/i.test(s)) return s.slice(0, 60);\n    }\n    return '';\n}\nfunction _dpQdWordCount(h) {\n    var s = String(h == null ? '' : h);\n    if (!s) return '';\n    try {\n        var i = s.indexOf('总字数');\n        if (i > 0) {\n            var seg = s.slice(Math.max(0, i - 400), i);\n            var mv = seg.match(/class=\"[^\"]*value[^\"]*\"[^>]*>\\s*([\\d.]+)\\s*</g);\n            if (mv && mv.length) {\n                var lastHtml = mv[mv.length - 1];\n                var mv2 = lastHtml.match(/>\\s*([\\d.]+)\\s*<$/);\n                var val = mv2 ? mv2[1] : '';\n                var after = seg.slice(seg.lastIndexOf(lastHtml) + lastHtml.length);\n                var mu = after.match(/class=\"[^\"]*unit[^\"]*\"[^>]*>\\s*([^<]*?)\\s*</);\n                var u = mu ? mu[1].replace(/\\s/g, '') : '字';\n                if (val) return val + u;\n            }\n        }\n        var m2 = s.match(/([\\d]+(?:\\.[\\d]+)?)\\s*(万)?字/);\n        if (m2) return m2[1] + (m2[2] ? '万' : '') + '字';\n    } catch (e) { }\n    return '';\n}\n\nfunction _dpInfoField(baseUrl, result, jav, book, field) {\n    var u = String(baseUrl == null ? '' : baseUrl);\n    var s = String(result == null ? '' : result);\n    if (_dpIsAgg(u)) {\n        var j = null;\n        try { j = JSON.parse(s); } catch (e0) { j = null; }\n        if (!j || typeof j !== 'object') { try { j = _dp3TryUrl(jav, u, _DP3_TO_BOOK); } catch (e1) { j = null; } }\n        if (!j) return _dpInfoFallback(book, field);\n        var ep = '';\n        try {\n            ep = _dpEpubHit(j.kind, j.format, j.intro, j.downloadUrl, j.lastChapter, j.url);\n        } catch (eE) { ep = ''; }\n        if (ep) { throw new Error('该源返回的是 EPUB 电子书（' + ep + '），不支持在线阅读，请换源'); }\n        if (field === 'intro') {\n            var _bd = _dpAggStripIntro(j.intro) || _dpInfoFallback(book, field);\n            var _sn = '';\n            try { _sn = _dp3SrcName(j); } catch (eS3) { _sn = ''; }\n            return _sn ? ('📖 来源：' + _sn + '\\n\\n' + _bd) : _bd;\n        }\n        var v0 = (j[field] == null ? '' : String(j[field]));\n        return v0 || _dpInfoFallback(book, field);\n    }\n    try {\n        if (field === 'name') {\n            return _dpMeta(s, 'og:title')\n                || _dpStripTags((s.match(/<h1[^>]*>([\\s\\S]*?)<\\/h1>/i) || [, ''])[1])\n                || _dpInfoFallback(book, 'name');\n        }\n        if (field === 'author') {\n            var a = _dpMeta(s, 'og:novel:author');\n            if (!a) { var m1 = s.match(/<a[^>]*class=\"[^\"]*author-link[^\"]*\"[^>]*>([\\s\\S]*?)<\\/a>/i); a = m1 ? _dpStripTags(m1[1]) : ''; }\n            return a || _dpInfoFallback(book, 'author');\n        }\n        if (field === 'kind') return _dpMeta(s, 'og:novel:category') || _dpInfoFallback(book, 'kind');\n        if (field === 'coverUrl') return _dpMeta(s, 'og:image') || _dpInfoFallback(book, 'coverUrl');\n        if (field === 'lastChapter') return _dpMeta(s, 'og:novel:latest_chapter_name');\n        if (field === 'wordCount') return _dpQdWordCount(s);\n        if (field === 'intro') return _dpBookIntro(s, u, jav, book) || _dpInfoFallback(book, 'intro');\n    } catch (e2) {}\n    return '';\n}\n\nfunction _dpTocUrl(baseUrl, result) {\n    var u = String(baseUrl == null ? '' : baseUrl);\n    if (_dpIsAgg(u)) {\n        try {\n            var j = JSON.parse(String(result == null ? '' : result));\n            var t = (j && j.tocUrl) ? String(j.tocUrl) : '';\n            if (t && /\\/api\\/toc\\?/.test(t)) return t;\n        } catch (eT) { }\n        return _dpAggApi('toc', _dpAggI(u), _dpAggU(u));\n    }\n    try { return u.split('?')[0].split('#')[0].replace(/\\/+$/, '') + '/catalog/'; } catch (e) { return u; }\n}\nfunction _dpQdTocItems(html) {\n    var out = [], re = /<a\\b([^>]*)>([\\s\\S]*?)<\\/a>/gi, m, onlyChapter = true, pass;\n    for (pass = 0; pass < 2; pass++) {\n        onlyChapter = (pass === 0);\n        re.lastIndex = 0;\n        out = [];\n        while ((m = re.exec(String(html))) !== null) {\n            var attrs = String(m[1] || ''), inner = String(m[2] || '');\n            var mc = attrs.match(/data-cid=\"(\\d+)\"/);\n            if (!mc) continue;\n            if (/_secondHeader|_lastChapterCN|_lastChapterUT/.test(attrs)) continue;\n            if (/_lastChapterCN/.test(inner)) continue;\n            var cm = attrs.match(/class=\"([^\"]*)\"/);\n            var cls = cm ? cm[1] : '';\n            if (onlyChapter && cls.indexOf('_chapterItem') < 0) continue;\n            var mn = inner.match(/<h([23])[^>]*>([\\s\\S]*?)<\\/h\\1>/i);\n            if (!mn) continue;\n            var n = _dpStripTags(mn[2]);\n            if (!n) continue;\n            out.push({ name: n, cid: mc[1], cls: cls });\n        }\n        if (out.length) break;      \n    }\n    return out;\n}\nfunction _dpTocRows(baseUrl, raw, jav) {\n    var u = String(baseUrl == null ? '' : baseUrl);\n    var s = String(raw == null ? '' : raw);\n    var out = [], i;\n    if (_dpIsAgg(u)) {\n        var arr = null;\n        try { arr = JSON.parse(s); } catch (e0) { arr = null; }\n        if ((!arr || !arr.length) && jav) { try { arr = _dp3TryUrl(jav, u, _DP3_TO_TOC); } catch (e1) { arr = null; } }\n        if (!arr || !arr.length) return out;\n        var _epCnt = 0, _epSmp = '';\n        for (var _ei = 0; _ei < arr.length; _ei++) {\n            var _eu = String((arr[_ei] && arr[_ei].url) || '');\n            if (/\\.epub([?#]|$)/i.test(_eu)) { _epCnt++; if (!_epSmp) _epSmp = _eu.slice(0, 60); }\n        }\n        if (_epCnt > 0) { throw new Error('目录含 ' + _epCnt + ' 个 EPUB 文件直链（' + _epSmp + '），不支持在线阅读，请换源'); }\n        for (i = 0; i < arr.length; i++) {\n            if (arr[i] && arr[i].name) out.push({ name: String(arr[i].name), url: String(arr[i].url || '') });\n        }\n        try {\n            var q1 = _dp3Seq(out[0].name), q2 = _dp3Seq(out[out.length - 1].name);\n            if (!isNaN(q1) && !isNaN(q2) && q1 > q2) out.reverse();\n        } catch (e2) {}\n        return out;\n    }\n    var bid = (_dpBid(u) || '');\n    var items = [];\n    try { items = _dpQdTocItems(s); } catch (e3) { items = []; }\n    for (i = 0; i < items.length; i++) {\n        out.push({ name: items[i].name, url: '/chapter/' + bid + '/' + items[i].cid + '/' });\n    }\n    if (bid && jav && out.length) {\n        try {\n            var _bhost = _dpAggHost();\n            var _burl = _bhost + '/qqdp/blocks?bid=' + encodeURIComponent(bid);\n            var _bb = '';\n            try { _bb = String(jav.get(_burl, null, 8000).body() || ''); }\n            catch (eB1) { try { _bb = String(jav.get(_burl, null, 8000).body() || ''); } catch (eB2) { _bb = ''; } }\n            if (!_bb) { try { _bb = String(jav.ajax(_burl) || ''); } catch (eB3) { _bb = ''; } }\n            var _bj = null;\n            if (_bb && _bb.charAt(0) === '{') { try { _bj = JSON.parse(_bb); } catch (eB4) { _bj = null; } }\n            if (_bj && _bj.blocks && _bj.blocks.length) {\n                var _bs = {}, _bi;\n                for (_bi = 0; _bi < _bj.blocks.length; _bi++) _bs[String(_bj.blocks[_bi])] = 1;\n                for (_bi = 0; _bi < out.length; _bi++) {\n                    var _bm = String(out[_bi].url || '').match(/\\/chapter\\/\\d+\\/(\\d+)\\//);\n                    if (_bm && _bs[_bm[1]] && String(out[_bi].name).indexOf('📺') < 0) {\n                        out[_bi].name = '📺 ' + out[_bi].name;\n                    }\n                }\n            }\n        } catch (eB0) {}\n    }\n    return out;\n}\n\n\n\nfunction _dpAggBody(raw, chapter, baseUrl, jav) {\n    var url = _dpAggCur(chapter, baseUrl);\n    var s = String(raw == null ? '' : raw);\n    var j = null;\n    try { j = JSON.parse(s); } catch (e0) { j = null; }\n    var _isAgg = _dpIsAgg(url);\n    var _swAllOn = (_dpSwAllOn(jav) && _dpTheme(jav) === 'white');\n    if (!j || typeof j !== 'object') {\n        var _u = (_isAgg && !_swAllOn) ? _dpAggSwUrl(url, jav) : url;\n        try { j = _dp3TryUrl(jav, _u, _DP3_TO_CHAPTER); } catch (e1) { j = null; }\n    } else if (_isAgg && !_swAllOn) {\n        var _j2 = null;\n        try { _j2 = _dp3TryUrl(jav, _dpAggSwUrl(url, jav), _DP3_TO_CHAPTER); } catch (eSw) { _j2 = null; }\n        if (_j2 && typeof _j2 === 'object' && _j2.content) { j = _j2; }\n    }\n    try {\n        if (j && j.qd_bid && j.qd_cid) {\n            if (!__dpIllu._aggQd) __dpIllu._aggQd = {};\n            __dpIllu._aggQd[String(url)] = { bid: String(j.qd_bid), cid: String(j.qd_cid) };\n        }\n    } catch (eQd) {}\n    var ct = (j && j.content) ? String(j.content) : '';\n    return ct;\n}\n\nvar _DP_EX_TTL = 10 * 60 * 1000;      \n\nfunction _dpExIn(arr, v) {\n    for (var i = 0; i < (arr ? arr.length : 0); i++) { if (arr[i] === v) return true; }\n    return false;\n}\n\nfunction show(k, v) {\n    var jv = null, ck = null;\n    try { if (this && this.java) jv = this.java; } catch (e0) {}\n    try { if (this && this.cache) ck = this.cache; } catch (e1) {}\n    if (!jv) { try { if (typeof java !== 'undefined' && java) jv = java; } catch (e2) {} }\n    if (!ck) { try { if (typeof cache !== 'undefined' && cache) ck = cache; } catch (e3) {} }\n    try { if (ck) ck.put(String(v), String(k)); } catch (e4) {}\n    try { if (jv) jv.refreshExplore(); } catch (e5) {}\n}\n\nfunction create(k, chars, defaultV, v, size) {\n    return {\n        title: k,\n        type: 'select',\n        chars: chars,\n        default: defaultV,\n        action: \"show(infoMap['\" + k + \"'],'\" + v + \"')\",\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: size }\n    };\n}\n\nfunction _dpExTab(jav) {\n    var ck = _DP3_CACHE['dpex'], now = 0;\n    try { now = new Date().getTime(); } catch (eN) { now = 0; }\n    if (ck && ck.v && ck.v.length && (now - ck.t) < _DP_EX_TTL) return ck.v;\n    var j = null;\n    try { j = _dp3Try(jav, '/api/discover/tabs', null, 15000); } catch (e0) { j = null; }\n    var v = (j && j.sources && j.sources.length) ? j.sources : null;\n    if (v) { try { _DP3_CACHE['dpex'] = { t: now, v: v }; } catch (e1) {} return v; }\n    return (ck && ck.v && ck.v.length) ? ck.v : null;\n}\n\nfunction _dpExCatsRaw(jav) {\n    var ck = _DP3_CACHE['dpexc_raw'], now = 0;\n    try { now = new Date().getTime(); } catch (eN) { now = 0; }\n    if (ck && ck.v && (now - ck.t) < _DP_EX_TTL) return ck.v;\n    var j = null;\n    try { j = _dp3Try(jav, '/api/discover/cats', null, 15000); } catch (e0) { j = null; }\n    if (j) { try { _DP3_CACHE['dpexc_raw'] = { t: now, v: j }; } catch (e1) {} return j; }\n    return (ck && ck.v) ? ck.v : null;\n}\n\nfunction _dpExCats(jav, adult, chan) {\n    var j = _dpExCatsRaw(jav);\n    if (!j) return null;\n    if (!adult) return (j.novel && j.novel.length) ? j.novel : null;\n    if (chan === '漫画') return (j.comic && j.comic.length) ? j.comic : null;\n    if (chan === '视频') return (j.video && j.video.length) ? j.video : null;\n    return (j.adult && j.adult.length) ? j.adult : null;\n}\n\nfunction _dpChanPick(v) {\n    var jv = null, ck = null;\n    try { if (this && this.java) jv = this.java; } catch (e0) {}\n    try { if (this && this.cache) ck = this.cache; } catch (e1) {}\n    if (!jv) { try { if (typeof java !== 'undefined' && java) jv = java; } catch (e2) {} }\n    if (!ck) { try { if (typeof cache !== 'undefined' && cache) ck = cache; } catch (e3) {} }\n    try {\n        var _wv = String(v == null ? '' : v);\n        if (_wv.indexOf('漫画') >= 0 || _wv.indexOf('视频') >= 0) {\n            var _ad = false;\n            try { _ad = _dpGradeIsAdult(_dpSrcOf(jv)); } catch (eA) { _ad = false; }\n            if (!_ad) {\n                var _mh = (_wv.indexOf('漫画') >= 0);\n                try { if (jv) jv.toast(_mh\n                    ? '📚 浏览漫画时请在编辑页切换类型到图片'\n                    : '🎬 浏览视频时请在编辑页切换类型到视频'); } catch (eT) {}\n                try { if (jv) jv.refreshExplore(); } catch (eR) {}\n                return '';   \n            }\n        }\n    } catch (eG) {}\n    try { if (ck) ck.put('dpchan', String(v)); } catch (e4) {}\n    try { if (ck) ck.put('dpsrc', ''); } catch (e5) {}\n    try { if (jv) jv.refreshExplore(); } catch (e6) {}\n    return '';\n}\n\nfunction _dpAppendSearchBar(out, cur, map, wantType, ADULT) {\n    var host = '';\n    try { host = _dpAggHost(); } catch (e0) { host = ''; }\n    if (!host) return;\n    var KWKEY = '单源搜索';\n    var idx = -1, nm = cur;\n    try {\n        if (map && map[cur] && typeof map[cur].i === 'number') idx = map[cur].i;\n    } catch (e1) { idx = -1; }\n    var _pos = 0;\n    try {\n        for (var _i = 0; _i < out.length; _i++) {\n            var _it = out[_i] || {};\n            if (String(_it.title || '').indexOf('≡') >= 0 && String(_it.url || '') === '') { _pos = _i; break; }\n        }\n    } catch (eP) { _pos = 0; }\n    var _textItem = {\n        title: KWKEY, type: 'text',\n        viewName: \"'输入关键词'\",\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.62 }\n    };\n    var js = \"(function(){\"\n           + \"var _kw='';try{_kw=String((infoMap&&infoMap['\" + KWKEY + \"'])||'');}catch(eK){}\"\n           + \"var _nm='';try{_nm=String((infoMap&&infoMap['请选择平台'])||'');}catch(eN){}\"\n           + \"return '\" + host + \"/api/discover/srcsearch?src=\" + idx + \"&type=\" + wantType + \"&adult=\" + (ADULT ? 1 : 0) + \"&key='\"\n           + \"+encodeURIComponent(_kw)+'&page={{page}}&name='+encodeURIComponent(_nm);\"\n           + \"})()\";\n    var _urlItem = {\n        title: '🔍 单源搜索', type: 'url',\n        url: '<js>' + js + '</js>',\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.38 }\n    };\n    out.splice(_pos, 0, _textItem, _urlItem);\n}\n\n\nfunction _dpStripCh(t) {\n    var s = String(t == null ? '' : t);\n    var pf = ['\\uD83D\\uDCD6 ', '\\uD83D\\uDCDA ', '\\uD83C\\uDFAC ', '\\uD83D\\uDD1E '];\n    for (var i = 0; i < pf.length; i++) {\n        if (s.indexOf(pf[i]) === 0) return s.slice(pf[i].length);\n    }\n    return s;\n}\nfunction _dpExplorePage(jav, cacheObj, fallback) {\n    var srcs = null;\n    try { srcs = _dpExTab(jav); } catch (e0) { srcs = null; }\n    if (!srcs || !srcs.length) return null;\n\n    function _g(k, d) {\n        var v = '';\n        try {\n            v = String(cacheObj && cacheObj.get ? (cacheObj.get(k) || '') : '');\n        } catch (e) { v = ''; }\n        return v || d;\n    }\n    var ADULT = false;\n    try { ADULT = _dpGradeIsAdult(_dpSrcOf(jav)); } catch (eGA) { ADULT = false; }\n    var chanRaw = _g('dpchan', '📖 小说');\n    var chan = (chanRaw.indexOf('漫画') >= 0) ? '漫画'\n             : (chanRaw.indexOf('视频') >= 0) ? '视频' : '小说';\n    if (!ADULT) chan = '小说';        \n    var wantType = (chan === '漫画') ? 2 : (chan === '视频') ? 4 : 0;\n\n    var i, nm, names = [], map = {};\n    for (i = 0; i < srcs.length; i++) {\n        if (!srcs[i]) continue;\n        if (!!srcs[i].adult !== ADULT) continue;\n        if (srcs[i].type !== wantType) continue;   \n        nm = String((srcs[i].em || '') + (srcs[i].name || ('源' + srcs[i].i)));\n        if (_dpExIn(names, nm)) nm = nm + '·' + srcs[i].i;   \n        names.push(nm);\n        map[nm] = srcs[i];\n    }\n    var AGG = '📖 综合';\n    names.unshift(AGG);\n\n    var cur = '';\n    try { cur = String(cacheObj && cacheObj.get ? (cacheObj.get('dpsrc') || '') : ''); } catch (e1) { cur = ''; }\n    if (!cur || !_dpExIn(names, cur)) cur = AGG;        \n\n    var out = [];\n    function _fin(o) {\n        try { _dpAppendSearchBar(o, cur, map, wantType, ADULT); } catch (eSB) {}\n        return JSON.stringify(o);\n    }\n    out.push({\n        title: '内容分级', type: 'select',\n        chars: ['📖 正常'],\n        default: '📖 正常',\n        action: \"_dpGradePick(infoMap['内容分级'])\",\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.5 }\n    });\n    out.push({\n        title: '频道', type: 'select',\n        chars: (ADULT ? ['📖 小说', '📚 漫画', '🎬 视频'] : ['📖 小说']),   \n        default: '📖 ' + chan,\n        action: \"_dpChanPick(infoMap['频道'])\",\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.5 }\n    });\n    out.push(create('请选择平台', names, cur, 'dpsrc', 1));\n\n    if (cur === AGG) {\n        var _cats = null;\n        try { _cats = _dpExCats(jav, ADULT, chan); } catch (eC0) { _cats = null; }\n        if (_cats && _cats.length) {\n            out.push({\n                title: '≡ ' + cur + ' 分类（多源合并）≡', url: '',\n                style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n            });\n            for (var _c2 = 0; _c2 < _cats.length; _c2++) {\n                out.push({\n                    title: _dpStripCh(String(_cats[_c2].title || '')),\n                    url: String(_cats[_c2].url || ''),\n                    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.25 }\n                });\n            }\n            return _fin(out);\n        }\n        var fb = [];\n        if (!ADULT && fallback && fallback.length) {\n            for (var fi = 0; fi < fallback.length; fi++) {\n                if (fallback[fi] && fallback[fi].url) fb.push(fallback[fi]);\n            }\n        }\n        return _fin(out.concat(fb));\n    }\n\n    var s = map[cur];\n    if (!s || !s.cats || !s.cats.length) {\n        out.push({\n            title: '「' + cur + '」暂无分类数据', url: '',\n            style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n        });\n        return _fin(out);\n    }\n\n    out.push({\n        title: '≡ ' + cur + ' ≡', url: '',\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n    });\n\n    var base = _dpAggHost(), cnt = 0, one;\n    for (i = 0; i < s.cats.length; i++) {\n        one = String(s.cats[i]);\n        out.push({\n            title: _dpStripCh(one),\n            url: base + '/api/discover/list?i=' + s.i + '&cat='\n                 + encodeURIComponent(one) + '&page={{page}}',\n            style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.25 }\n        });\n        cnt++;\n        if (cnt >= 2) cnt = 0;\n    }\n    while (cnt > 0 && cnt < 2) {                              \n        out.push({\n            title: '--', url: '',\n            style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.25 }\n        });\n        cnt++;\n    }\n    return _fin(out);\n}\n\nfunction fqShowCmt(a, b, c) {\n    var jv = null, bid = '', iid = '';\n    if (a && typeof a === 'object') { jv = a; bid = String(b || ''); iid = String(c || ''); }\n    else { bid = String(a || ''); iid = String(b || ''); }\n    if (!jv) { try { if (this && this.java) jv = this.java; } catch (e0) {} }\n    if (!jv) { try { jv = _dpJv(); } catch (e1) {} }\n    if (!bid || !iid) { try { jv.toast('fqShowCmt 参数缺失'); } catch (e9) {} return; }\n    var host = '';\n    try { host = _dpAggHost(); } catch (e1) { host = _dpSrv(); }\n    var url = host + '/fq/review?item_id=' + encodeURIComponent(iid)\n            + '&book_id=' + encodeURIComponent(bid);\n    var cfg = '{\"heightPercentage\":0.72}';\n    var html = '';\n    try { html = String(jv.ajax(url) || ''); } catch (eA) { html = ''; }\n    var _ok = false;\n    try { if (jv.showBrowser) { jv.showBrowser(url, (html && html.length > 200) ? html : null, null, cfg); _ok = true; } } catch (e2) {}\n    if (_ok) { return; }\n    try { jv.startBrowser(url, '本章评论'); return; } catch (e3) {}\n    try { jv.toast('本章评论：' + url); } catch (e4) {}\n}\nfunction fqShowPara(a, b, c, dd) {\n    var jv = null, bid = '', iid = '', para = '';\n    if (a && typeof a === 'object') { jv = a; bid = String(b || ''); iid = String(c || ''); para = String(dd || ''); }\n    else { bid = String(a || ''); iid = String(b || ''); para = String(c || ''); }\n    if (!jv) { try { if (this && this.java) jv = this.java; } catch (e0) {} }\n    if (!jv) { try { jv = _dpJv(); } catch (e1) {} }\n    if (!bid || !iid || para === '') { try { jv.toast('fqShowPara 参数缺失'); } catch (e9) {} return; }\n    var host = '';\n    try { host = _dpAggHost(); } catch (e1) { host = _dpSrv(); }\n    var url = host + '/fq/review?item_id=' + encodeURIComponent(iid)\n            + '&book_id=' + encodeURIComponent(bid) + '&para=' + encodeURIComponent(para);\n    var cfg = '{\"heightPercentage\":0.72}';\n    var html = '';\n    try { html = String(jv.ajax(url) || ''); } catch (eA) { html = ''; }\n    var _ok = false;\n    try { if (jv.showBrowser) { jv.showBrowser(url, (html && html.length > 200) ? html : null, null, cfg); _ok = true; } } catch (e2) {}\n    if (_ok) { return; }\n    try { jv.startBrowser(url, '段评'); return; } catch (e3) {}\n    try { jv.toast('段评：' + url); } catch (e4) {}\n}\n\nfunction _tdJv() {\n    try { if (this && this.java) return this.java; } catch (e) {}\n    try { if (typeof java !== 'undefined' && java) return java; } catch (e) {}\n    return null;\n}\nfunction _tdEsc(s) {\n    return String(s == null ? '' : s)\n        .replace(/&/g, '&amp;').replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\nfunction _taduShow(bid, cid, seg) {\n    var jv = _tdJv.call(this);\n    if (!jv) { try { jv = java; } catch (e) {} }\n    var html = '';\n    try {\n        seg = Number(seg || 0);\n        var base = 'http://43.139.147.103:8070';\n        var u = base + '/tadu/seg?bid=' + encodeURIComponent(bid)\n              + '&cid=' + encodeURIComponent(cid) + '&seg=' + seg;\n        var raw = '';\n        try { raw = String(jv.ajax(u) || ''); } catch (e) { raw = ''; }\n        var d = {};\n        try { d = (JSON.parse(raw) || {}).data || {}; } catch (e) { d = {}; }\n        var cs = d.comments || [];\n        var items = '';\n        for (var i = 0; i < cs.length; i++) {\n            var c = cs[i] || {};\n            var txt = String(c.text || '');\n            if (txt.length > 300) txt = txt.slice(0, 300) + '…';\n            var av = String(c.avatar || '');\n            var nick = String(c.user || '读者');\n            var segTag = (c.seg && seg <= 0) ? '<span class=\"ip\">第' + c.seg + '段</span>' : '';\n            var meta = [];\n            if (Number(c.like || 0) > 0) meta.push(Number(c.like) + ' 赞');\n            if (Number(c.reply || 0) > 0) meta.push(Number(c.reply) + ' 回复');\n            if (c.time) meta.push(_tdEsc(String(c.time)));\n            var avatarHtml = av\n                ? '<img class=\"av\" src=\"' + _tdEsc(av) + '\" onerror=\"this.style.display=\\'none\\'\"/>'\n                : '<div class=\"av ph\">' + _tdEsc(nick.charAt(0)) + '</div>';\n            items += '<div class=\"card\">' + avatarHtml + '<div class=\"main\">'\n                  + '<div class=\"nick\">' + _tdEsc(nick) + segTag + '</div>'\n                  + '<div class=\"txt\">' + _tdEsc(txt) + '</div>'\n                  + (meta.length ? '<div class=\"meta\">' + _tdEsc(meta.join(' · ')) + '</div>' : '')\n                  + '</div></div>';\n        }\n        if (!items) items = '<div class=\"empty\">该段落暂无段评</div>';\n        var head = d.content ? String(d.content)\n                 : (seg > 0 ? ('第 ' + seg + ' 段') : '本书段评');\n        if (head.length > 120) head = head.slice(0, 120) + '…';\n        html = '<!doctype html><html><head><meta charset=\"utf-8\">'\n             + '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><style>'\n             + 'body{margin:0;background:#f8f8f8;color:#1f2329;'\n             + 'font-family:-apple-system,\"PingFang SC\",\"Microsoft YaHei\",Arial,sans-serif}'\n             + '.topbar{display:flex;justify-content:space-between;padding:12px 16px;background:#fff;border-bottom:1px solid #eee}'\n             + '.topbar span:first-child{font-size:13px;color:#666}'\n             + '.topbar span:last-child{font-size:15px;font-weight:600;color:#111}'\n             + '.wrap{padding:12px}'\n             + '.head{margin:0 0 12px;padding:14px 16px;background:#fff;border:1px solid #eaeaea;border-radius:12px}'\n             + '.sub{color:#111;font-size:15px;line-height:1.6;word-break:break-all}'\n             + '.card{display:flex;gap:9px;margin:0 0 10px;padding:14px;background:#fff;border:1px solid #e2e5ea;border-radius:14px}'\n             + '.av{width:38px;height:38px;border-radius:50%;object-fit:cover;flex:0 0 38px;background:#eee}'\n             + '.av.ph{display:flex;align-items:center;justify-content:center;color:#fff;background:#4A90E2;font-size:15px}'\n             + '.main{flex:1;min-width:0}'\n             + '.nick{font-size:13px;color:#333;font-weight:600;margin-bottom:5px}'\n             + '.ip{font-size:11px;color:#999;font-weight:400;margin-left:6px}'\n             + '.txt{font-size:15px;line-height:1.7;word-break:break-word}'\n             + '.meta{font-size:12px;color:#999;margin-top:7px}'\n             + '.empty{color:#999;text-align:center;padding:40px 0}'\n             + '</style></head><body>'\n             + '<div class=\"topbar\"><span>共 ' + cs.length + ' 条段评</span><span>段评详情</span></div>'\n             + '<div class=\"wrap\"><div class=\"head\"><div class=\"sub\">' + _tdEsc(head) + '</div></div>'\n             + items + '</div></body></html>';\n        var cfg = JSON.stringify({ isHideable: true, expandedCornersRadius: 16,\n                                   skipCollapsed: true, heightPercentage: 0.82 });\n        jv.showBrowser(base, html, '', cfg);\n    } catch (e) {\n        try { jv.toast('段评加载失败: ' + e); } catch (e2) {}\n        try { jv.startBrowser('data:text/html;base64,'\n            + jv.base64Encode(html || '<html><body>段评加载失败</body></html>'), '段评'); } catch (e3) {}\n    }\n}", "lastUpdateTime": "1793805210582", "loginUi": "@js:(function(){try{return _dpAqUi(book, java);}catch(e){return _dpLuFallback();}})()", "loginUrl": "@js:\n\nvar AQ_DEFAULT_BASE = 'http://43.139.147.103:8070';  \n\nfunction _aqBase() {\n    var b = '';\n    try { b = String(source.get('agg_server') || ''); } catch (e) {}\n    b = b.replace(/\\/+$/, '');\n    return b || AQ_DEFAULT_BASE;\n}\n\nfunction _aqV(name) {\n    try {\n        if (typeof result !== 'undefined' && result) {\n            if (typeof result.get === 'function') {\n                var g = result.get(name);\n                if (g != null && String(g) !== '') return String(g);\n            } else if (result[name] != null && String(result[name]) !== '') {\n                return String(result[name]);\n            }\n        }\n    } catch (e) {}\n    try {\n        if (typeof source !== 'undefined' && source && source.getLoginInfoMap) {\n            var m = source.getLoginInfoMap();\n            if (m) {\n                var v = (typeof m.get === 'function') ? m.get(name) : m[name];\n                if (v != null) return String(v);\n            }\n        }\n    } catch (e2) {}\n    return '';\n}\n\nfunction aqDev() {\n    var d = '';\n    try { d = String(source.get('aq_dev') || ''); } catch (e) {}\n    d = d.replace(/[^0-9a-f]/gi, '').toLowerCase();\n    if (!/^[a-f0-9]{32}$/.test(d)) {\n        d = '';\n        try { d = String(java.deviceID() || ''); } catch (e1) {}\n        if (!d) { try { d = String(java.androidId() || ''); } catch (e2) {} }\n        d = d.replace(/[^0-9a-f]/gi, '').toLowerCase();\n        if (!/^[a-f0-9]{16,64}$/.test(d)) {\n            d = '';\n            for (var i = 0; i < 32; i++) {\n                d += '0123456789abcdef'.charAt(Math.floor(Math.random() * 16));\n            }\n        }\n        if (d.length > 64) d = d.substring(0, 64);\n        try { source.put('aq_dev', d); } catch (e3) {}\n    }\n    return d;\n}\n\nfunction _aqPost(path, obj) {\n    var base = _aqBase();\n    var body = JSON.stringify(obj);\n    var hd = { 'Content-Type': 'application/json' };\n    var resp = '';\n    try {\n        var r = java.post(base + path, body, hd, 15000);\n        if (r) { try { resp = String(r.body ? r.body() : r); } catch (e1) { resp = String(r); } }\n    } catch (e2) { resp = ''; }\n    if (!resp) {\n        var opt = JSON.stringify({ method: 'POST', headers: hd, body: body });\n        try { resp = String(java.ajax(base + path + ',' + opt) || ''); } catch (e3) { resp = ''; }\n    }\n    resp = _aqTidy(resp);\n    var c0 = resp.charAt(0);\n    if (c0 !== '{' && c0 !== '[') { return null; }\n    try { return JSON.parse(resp); } catch (e4) { return null; }\n}\n\nfunction _aqGet(path) {\n    var base = _aqBase();\n    var resp = '';\n    try {\n        var r = java.get(base + path, {}, 12000);\n        if (r) { try { resp = String(r.body ? r.body() : r); } catch (e1) { resp = String(r); } }\n    } catch (e2) { resp = ''; }\n    if (!resp) {\n        try { resp = String(java.ajax(base + path) || ''); } catch (e3) { resp = ''; }\n    }\n    resp = _aqTidy(resp);\n    var c0 = resp.charAt(0);\n    if (c0 !== '{' && c0 !== '[') { return null; }\n    try { return JSON.parse(resp); } catch (e4) { return null; }\n}\n\nfunction _aqTidy(s) {\n    s = String(s == null ? '' : s);\n    try { s = s.replace(/^\\uFEFF/, ''); } catch (e) {}\n    return s.replace(/^\\s+|\\s+$/g, '');\n}\n\nfunction _aqToast(s) {\n    try { java.toast(String(s)); } catch (e) {}\n}\n\nvar _AQ_IMPORT_URL = 'http://43.139.147.103:8070/fq/bookSource.json';\n\nvar _AQ_SELF_VER = '20261102-3';\n\nfunction _dpSrcLocalVer() {\n    var v = '';\n    try { v = String(source.get('aq_src_ver') || ''); } catch (e0) {}\n    if (!v) { v = _AQ_SELF_VER; }\n    return v;\n}\n\nfunction _dpSrcFetchVer() {\n    var base = _aqBase();\n    var resp = '';\n    try {\n        var r = java.get(base + '/fq/version.json', {}, 12000);\n        if (r) { try { resp = String(r.body ? r.body() : r); } catch (e1) { resp = String(r); } }\n    } catch (e2) { resp = ''; }\n    if (!resp) {\n        try { resp = String(java.ajax(base + '/fq/version.json') || ''); } catch (e3) { resp = ''; }\n    }\n    resp = _aqTidy(resp);\n    if (resp.charAt(0) !== '{') { return null; }\n    try { return JSON.parse(resp); } catch (e4) { return null; }\n}\n\nfunction _dpSrcVerText() {\n    var remote = null;\n    try { remote = _dpSrcFetchVer(); } catch (e0) {}\n    var local = _dpSrcLocalVer();\n    if (remote && remote.version) {\n        if (local && local === String(remote.version)) {\n            return '📦 已是最新版 ' + local;\n        }\n        var tip = '📦 本地 ' + (local || '未知') + ' → 最新 ' + remote.version;\n        if (remote.requireImport === false) { tip += '（服务端升级，无需导入）'; }\n        return tip;\n    }\n    if (local) { return '📦 当前版本 ' + local + '（服务端版本未知）'; }\n    return '📦 版本未知（点下方按钮检查）';\n}\n\nfunction _dpSrcUpd() {\n    try {\n        var remote = _dpSrcFetchVer();\n        if (!remote || !remote.version) {\n            _aqToast('检查失败：网络错误，请稍后重试');\n            return '';\n        }\n        var local = _dpSrcLocalVer();\n        var ver = String(remote.version);\n        if (local && local === ver) {\n            _aqToast('✅ 已是最新版 ' + ver + '，无需更新');\n            try { java.upLoginData({ 'aq_ver': '📦 已是最新版 ' + ver }); } catch (eU) {}\n            return '';\n        }\n        try {\n            java.upLoginData({ 'aq_ver': '📦 本地 ' + (local || '未知') + ' → 最新 ' + ver });\n        } catch (eU2) {}\n        var needImport = remote.requireImport !== false;\n        if (!needImport) {\n            try { source.put('aq_src_ver', ver); } catch (eS) {}\n            _aqToast('服务端已升级到 ' + ver + '，无需重新导入，直接使用即可');\n            return '';\n        }\n        var msg = '有新版：' + (local ? local + ' → ' : '') + ver;\n        var ch = [];\n        if (Object.prototype.toString.call(remote.changes) === '[object Array]') { ch = remote.changes; }\n        var shown = ch.slice(0, 5);\n        if (shown.length) { msg += '\\n' + shown.join('\\n'); }\n        if (ch.length > 5) { msg += '\\n…共 ' + ch.length + ' 条，详情可看更新日志页'; }\n        var notice = '';\n        try { if (remote.notice != null) { notice = String(remote.notice); } } catch (eN) {}\n        if (notice) { msg += '\\n📢 ' + notice; }\n        msg += '\\n即将打开导入确认页…';\n        _aqToast(msg);\n        var deep = 'legado://import/bookSource?src=' + encodeURIComponent(_AQ_IMPORT_URL);\n        var okDeep = false;\n        try { java.openUrl(deep); okDeep = true; } catch (eO) {}\n        if (!okDeep) {\n            _aqToast('唤起导入页失败\\n请手动：书源管理 → 网络 → 粘贴 ' + _AQ_IMPORT_URL);\n        }\n    } catch (e) {\n        _aqToast('更新出错：' + (e && e.message ? e.message : e));\n    }\n    return '';\n}\n\nfunction aqVer() {\n    try {\n        var t = _dpSrcVerText();\n        try { java.upLoginData({ 'aq_ver': t }); } catch (e0) {}\n        return '';\n    } catch (e) { return ''; }\n}\n\nfunction login(force) {\n    try {\n        var email = _aqV('邮箱');\n        var pw = _aqV('密码');\n        if (!email || !pw) { _aqToast('请填写邮箱和密码'); return ''; }\n        var j = _aqPost('/user/auth/login', {\n            email: email, password: pw, device: aqDev()\n        });\n        if (!j) { _aqToast('网络错误，请重试'); return ''; }\n        if (j.code === 0) {\n            try {\n                var sess = String(j.session || '');\n                if (sess && typeof cookie !== 'undefined' && cookie) {\n                    cookie.setCookie(_aqBase(), 'rq_session=' + sess);\n                }\n            } catch (e1) {}\n            try { java.upLoginData({ 'aq_quota_line': _aqQuotaText() }); } catch (eQ) {}\n            try { source.put('aq_email', String(email)); } catch (eM) {}\n            _aqToast('登录成功');\n            try { java.refreshContent(); } catch (e2) {}\n        } else if (j.code === 429) {\n            _aqToast((j.message || '登录设备数已达上限') + '\\n点「🚪 下线其它设备」可腾出名额');\n        } else {\n            _aqToast(j.message || '登录失败');\n        }\n    } catch (e) {\n        _aqToast('登录出错：' + (e && e.message ? e.message : e));\n    }\n    return '';\n}\n\nfunction register() {\n    try {\n        var code = _aqV('注册码');\n        var email = _aqV('邮箱');\n        var pw = _aqV('密码');\n        if (!code) { _aqToast('请先点「🎫 领取注册码」拿到注册码'); return ''; }\n        if (!email || !pw) { _aqToast('请填写邮箱和密码'); return ''; }\n        var j = _aqPost('/user/auth/register', {\n            code: code, email: email, password: pw, device: aqDev()\n        });\n        if (!j) { _aqToast('网络错误，请重试'); return ''; }\n        if (j.code === 0) {\n            try {\n                var sess = String(j.session || '');\n                if (sess && typeof cookie !== 'undefined' && cookie) {\n                    cookie.setCookie(_aqBase(), 'rq_session=' + sess);\n                }\n            } catch (e1) {}\n            try { source.put('aq_email', String(email)); } catch (eM) {}\n            _aqToast('注册成功');\n            try { java.upLoginData({ '注册码': '' }); } catch (eC) {}\n            try { java.upLoginData({ 'aq_quota_line': _aqQuotaText() }); } catch (eQ) {}\n            try { java.refreshContent(); } catch (e2) {}\n        } else {\n            _aqToast(j.message || '注册失败');\n        }\n    } catch (e) {\n        _aqToast('注册出错：' + (e && e.message ? e.message : e));\n    }\n    return '';\n}\n\nfunction aqIssue() {\n    try {\n        var st = _aqGet('/user/code/state');\n        if (st && st.selfCodeEnabled === false) {\n            _aqToast('管理员已暂停发码');\n            return '';\n        }\n        if (st && st.pool_exhausted === true) {\n            _aqToast('注册码已发完（剩 0 / ' + (st.pool_total == null ? '?' : st.pool_total)\n                + ' 个名额）\\n请等待释放或联系管理员');\n            return '';\n        }\n        var email = _aqV('邮箱');\n        if (!email) {\n            _aqToast('请先在上方「邮箱」栏填好邮箱，再点「领取注册码」\\n邮箱用于以后找回注册码，务必填对');\n            return '';\n        }\n        var j = _aqPost('/user/code/issue', { device: aqDev(), email: email });\n        if (!j) { _aqToast('网络错误，请重试'); return ''; }\n        if (j.code === 0) {\n            var c = String(j.reg_code || '');\n            try { java.upLoginData({ '注册码': c }); } catch (e1) {}\n            var left = (j.remaining_today != null) ? ('｜今日还可发 ' + j.remaining_today + ' 个') : '';\n            var poolLeft = (j.remaining_pool != null && j.pool_total != null)\n                ? ('\\n余额：剩 ' + j.remaining_pool + ' / ' + j.pool_total + ' 个名额') : '';\n            try { java.upLoginData({ 'aq_stock': _aqCodeStockText(j) }); } catch (eSk) {}\n            _aqToast('已领取：' + c + left + poolLeft + '\\n请立即点「📝 注册」完成注册');\n        } else if (j.code_existing) {\n            try { java.upLoginData({ '注册码': String(j.code_existing) }); } catch (e2) {}\n            _aqToast('本机已领过：' + j.code_existing + '\\n如需更换请先「♻️ 解绑当前设备」');\n        } else {\n            _aqToast(j.message || '领取失败');\n        }\n    } catch (e) {\n        _aqToast('领码出错：' + (e && e.message ? e.message : e));\n    }\n    return '';\n}\n\nfunction aqRelease() {\n    try {\n        var j = _aqPost('/user/code/release', { device: aqDev() });\n        if (!j) { _aqToast('网络错误，请重试'); return ''; }\n        if (j.code === 0) {\n            if (j.already_released) {\n                _aqToast(j.note || '当前没有生效的注册码，可直接点「🎫 领取注册码」');\n            } else {\n                try { java.upLoginData({ '注册码': '' }); } catch (e1) {}\n                if (j.code_revoked) {\n                    _aqToast('已解绑，可重新领取');\n                } else {\n                    _aqToast('已解绑。该码已用于注册，换机请直接用邮箱密码登录');\n                }\n            }\n        } else {\n            _aqToast(j.message || '解绑失败');\n        }\n    } catch (e) {\n        _aqToast('解绑出错：' + (e && e.message ? e.message : e));\n    }\n    return '';\n}\n\nfunction aqFind() {\n    try {\n        var email = _aqV('邮箱');\n        if (!email) { _aqToast('请先填写邮箱（领码时用的那个）'); return ''; }\n        var j = _aqPost('/user/code/find', { email: email, device: aqDev() });\n        if (!j) { _aqToast('网络错误，请重试'); return ''; }\n        if (j.code === 0 && j.codes && j.codes.length) {\n            var unused = null;\n            for (var i = 0; i < j.codes.length; i++) {\n                if (j.codes[i].status === 'unused') { unused = j.codes[i].code; break; }\n            }\n            if (unused) {\n                try { java.upLoginData({ '注册码': unused }); } catch (e1) {}\n                _aqToast('已找回：' + unused);\n            } else {\n                _aqToast('本机领的码已失效（过期/已作废/已用于注册）\\n直接点「🎫 领取注册码」换一张新码');\n            }\n        } else {\n            _aqToast(j.message || '该邮箱没有领码记录');\n        }\n    } catch (e) {\n        _aqToast('找回出错：' + (e && e.message ? e.message : e));\n    }\n    return '';\n}\n\nfunction _aqLimitSrcText(q) {\n    var s = String((q && q.source) || '');\n    if (s === 'exempt') return '豁免·不限';\n    if (s === 'custom') return '单独设的额度';\n    if (s === 'default') return '默认额度';\n    return '来源未知';\n}\n\nfunction _aqCodeStockText(st) {\n    try {\n        var a = st || _aqGet('/user/auth/status');\n        if (a) {\n            var tot = a.pool_total;\n            var left = a.remaining_pool;\n            if (a.pool_exhausted === true) {\n                return '🎟 注册码余额：0 个名额（已发完，等释放）';\n            }\n            if (left != null && tot != null) {\n                var t = '🎟 注册码余额：剩 ' + left + ' / ' + tot + ' 个名额可注册';\n                if (a.low_stock === true) { t += ' · 库存偏低'; }\n                if (a.remaining_today != null) { t += '｜今日还可发 ' + a.remaining_today; }\n                return t;\n            }\n        }\n    } catch (eS) {}\n    return '🎟 注册码余额：读取失败 · 点这里重试';\n}\n\nfunction _aqQuotaText(st) {\n    try {\n        var a = st || _aqGet('/user/auth/status');\n        if (a && a.code === 0 && a.loggedIn && a.quota) {\n            var q = a.quota;\n            var lim = (q.limit == null) ? '不限' : q.limit;\n            var t = '📊 今日已读 ' + q.used + ' / ' + lim + ' 章';\n            if (q.remaining != null) { t += '（剩 ' + q.remaining + '）'; }\n            if (q.bypass) { t += ' · 暂不计限'; }\n            t += '｜' + _aqLimitSrcText(q);\n            return t;\n        }\n        if (a && a.loggedIn === false) {\n            return '📊 未登录 · 登录后这里显示今日额度';\n        }\n    } catch (e) {}\n    return '📊 额度获取失败 · 点这里重试';\n}\n\nfunction _aqWhoText(st) {\n    try {\n        var a = st || _aqGet('/user/auth/status');\n        if (!a) return '🔌 状态未知 · 点这里重试';\n        if (a.code === 0 && a.loggedIn) {\n            var em = '';\n            try { em = String((a.user && a.user.email) || ''); } catch (eE) {}\n            var q = a.quota || {};\n            var lim = (q.limit == null) ? '不限' : (q.limit + ' 章');\n            return '✅ 已登录' + (em ? '：' + em : '') + '｜今日 ' + q.used + ' / ' + lim\n                 + '（' + _aqLimitSrcText(q) + '）';\n        }\n        if (a.code === 401 || a.loggedIn === false) {\n            return '❌ 未登录 · 会话已失效，填邮箱密码再点登录';\n        }\n    } catch (e) {}\n    return '⚠ 登录状态读取失败 · 点这里重试';\n}\n\nfunction aqStock() {\n    try {\n        var a = _aqGet('/user/auth/status');\n        if (!a) { _aqToast('网络错误，请重试'); return ''; }\n        var t = _aqCodeStockText(a);\n        try { java.upLoginData({ 'aq_stock': t }); } catch (e1) {}\n        var more = '';\n        if (a.remaining_pool != null && a.pool_total != null) {\n            more = '\\n已发 ' + (a.pool_total - a.remaining_pool) + ' / ' + a.pool_total + ' 个名额';\n        }\n        _aqToast(t + more);\n    } catch (e) { _aqToast('查询出错'); }\n    return '';\n}\n\nfunction aqCheck() {\n    try {\n        var a = _aqGet('/user/auth/status');\n        if (!a) { _aqToast('网络错误，请重试'); return ''; }\n        var t = _aqWhoText(a);\n        _aqToast(t);\n        try { java.upLoginData({ 'aq_who': t }); } catch (e1) {}\n        try { java.upLoginData({ 'aq_quota_line': _aqQuotaText(a) }); } catch (e2) {}\n        if (a.code === 0 && a.loggedIn) {\n            try {\n                var em = String((a.user && a.user.email) || '');\n                if (em) {\n                    java.upLoginData({ '邮箱': em });\n                    source.put('aq_email', em);   \n                }\n            } catch (e3) {}\n        }\n    } catch (e) {\n        _aqToast('检测出错：' + (e && e.message ? e.message : e));\n    }\n    return '';\n}\n\nfunction aqQuota() {\n    try {\n        var j = _aqGet('/user/api/quota');\n        if (!j) { _aqToast('网络错误，请重试'); return ''; }\n        if (j.code !== 0) {\n            _aqToast(j.message || '未登录');\n            try { java.upLoginData({ 'aq_quota_line': '📊 未登录 · 登录后这里显示今日额度' }); } catch (e0) {}\n            return '';\n        }\n        var lim = (j.limit == null) ? '不限' : j.limit;\n        var t = '📊 今日已读 ' + j.used + ' / ' + lim + ' 章';\n        if (j.remaining != null) { t += '（剩 ' + j.remaining + '）'; }\n        if (j.bypass) { t += ' · 暂不计限'; }\n        try { java.upLoginData({ 'aq_quota_line': t }); } catch (e1) {}\n        _aqToast(t + '\\n重读同一章不重复计 · 每日本地 0 点重置');\n    } catch (e) {\n        _aqToast('查询出错');\n    }\n    return '';\n}\n\nfunction aqKickOthers() {\n    try {\n        var d = _aqGet('/user/api/devices');\n        if (!d || d.code !== 0) { _aqToast('请先登录'); return ''; }\n        var list = d.devices || [];\n        var n = 0, names = [];\n        for (var i = 0; i < list.length; i++) {\n            var it = list[i];\n            if (it.current || !it.active) { continue; }\n            if (!it.device) { continue; }   \n            names.push((it.device_label || '?') + '(' + it.active + ')');\n            var j = _aqPost('/user/api/devices/kick', { device: it.device });\n            if (j && j.code === 0) { n += (j.kicked || 0); }\n        }\n        if (!n) { _aqToast('没有其它在线设备（共 ' + list.length + ' 台）'); return ''; }\n        _aqToast('已下线 ' + n + ' 个会话：' + names.join('、'));\n    } catch (e) {\n        _aqToast('操作出错：' + (e && e.message ? e.message : e));\n    }\n    return '';\n}\n\nfunction aqLogout() {\n    try {\n        _aqPost('/user/auth/logout', {});\n        try { cookie.removeCookie(_aqBase()); } catch (e1) {}\n        try { java.upLoginData({ 'aq_quota_line': _aqQuotaText() }); } catch (e2) {}\n        _aqToast('已退出登录');\n        try { java.refreshContent(); } catch (e3) {}\n    } catch (e) {}\n    return '';\n}\n\nfunction _dpLuRow(name, label, action, dynLabel, basis) {\n    var r = {\n        name: name, type: 'button',\n        style: {\n            layout_flexGrow: 1,\n            layout_flexBasisPercent: (basis == null ? 0.45 : basis)\n        }\n    };\n    r.viewName = dynLabel ? String(label) : JSON.stringify(String(label));\n    if (action) r.action = action;\n    return r;\n}\n\nfunction _dpLuFallback() {\n    try {\n        return JSON.stringify([\n            _dpLuRow('lu_hint', '↓   账号登录   ↓', null, false, 1),\n            _dpLuRow('lu_login', '🔑 登录', 'login(true)', false, 0.45),\n            _dpLuRow('lu_reg', '📝 注册', 'register()', false, 0.45),\n            _dpLuRow('lu_tip', '每日 100 章 · 重读不重复计 · 未登录无法阅读', null, false, 1)\n        ]);\n    } catch (e) { return '[]'; }\n}\n\nfunction _dpAqRows() {\n    var r = [];\n    var hint = '点「🎫 领取注册码」自助领码：一机一码，换机先解绑';\n    var st = _aqGet('/user/code/state');\n    if (st && st.code === 0) {\n        if (st.codeHint) {\n            var parts = String(st.codeHint).split('\\n');\n            hint = parts[0];\n        }\n        if (st.selfCodeEnabled === false) {\n            r.push(_dpLuRow('aq_off', '⛔ 管理员已暂停发码', null, false, 1));\n        }\n    }\n    var _st = null;\n    try { _st = _aqGet('/user/auth/status'); } catch (eSt) {}\n    var qtext = '📊 今日额度加载中…';\n    try { qtext = _aqQuotaText(_st); } catch (eq) {}\n    r.push(_dpLuRow('aq_quota_line', qtext, 'aqQuota()', false, 1));\n    var whoText = '🔌 登录状态检测中…';\n    try { whoText = _aqWhoText(_st); } catch (ew) {}\n    r.push(_dpLuRow('aq_who', whoText, 'aqCheck()', false, 1));\n    r.push(_dpLuRow('aq_head', '↓  注册码登录（阅读额度）  ↓', null, false, 1));\n    var stockText = '🎟 注册码余额加载中…';\n    try { stockText = _aqCodeStockText(_st); } catch (eSk) {}\n    r.push(_dpLuRow('aq_stock', stockText, 'aqStock()', false, 1));\n    r.push({ name: '注册码', type: 'text', default: '' });\n    var _mail = '';\n    try { _mail = String(source.get('aq_email') || ''); } catch (eM) {}\n    r.push({ name: '邮箱', type: 'text', default: _mail });\n    r.push({ name: '密码', type: 'password', default: '' });\n    r.push(_dpLuRow('aq_check', '🔄 检测登录状态', 'aqCheck()', false, 1));\n    r.push(_dpLuRow('aq_login', '🔑 登录', 'login(true)', false, 0.45));\n    r.push(_dpLuRow('aq_reg', '📝 注册', 'register()', false, 0.45));\n    r.push(_dpLuRow('aq_issue', '🎫 领取注册码', 'aqIssue()', false, 0.45));\n    r.push(_dpLuRow('aq_release', '♻️ 解绑当前设备', 'aqRelease()', false, 0.45));\n    r.push(_dpLuRow('aq_find', '🔍 找回注册码', 'aqFind()', false, 0.45));\n    r.push(_dpLuRow('aq_kick', '🚪 下线其它设备', 'aqKickOthers()', false, 0.45));\n    r.push(_dpLuRow('aq_logout', '⏏️ 退出登录', 'aqLogout()', false, 1));\n    r.push(_dpLuRow('aq_ver', '📦 版本检查中…', 'aqVer()', false, 1));\n    r.push(_dpLuRow('aq_upd', '⟳ 检查书源更新', '_dpSrcUpd()', false, 1));\n    var tip = hint;\n    if (st && st.code === 0) {\n        if (st.pool_exhausted === true) {\n            tip += '｜注册码已发完，等待释放';\n        } else if (st.remaining_today != null) {\n            tip += '｜今日还可发 ' + st.remaining_today + ' 个';\n        }\n        tip += '｜每日 ' + (st.dailyLimit == null ? 100 : st.dailyLimit) + ' 章';\n    }\n    r.push(_dpLuRow('aq_tip', tip, null, false, 1));\n    return r;\n}\n\nfunction _dpAqUi(bko, jav) {\n    try {\n        var rows = _dpAqRows();\n        try {\n            if (typeof _dpLuList === 'function') {\n                var rest = JSON.parse(_dpLuList(bko, jav));\n                if (rest && rest.length) rows = rows.concat(rest);\n            }\n        } catch (eB) {}\n        return JSON.stringify(rows);\n    } catch (e) { return '[]'; }\n}\n", "respondTime": 180000, "ruleBookInfo": {"author": "@js:_dpInfoField(baseUrl, result, java, book, 'author')", "coverUrl": "@js:_dpInfoField(baseUrl, result, java, book, 'coverUrl')", "intro": "@js:_dpInfoField(baseUrl, result, java, book, 'intro')", "kind": "@js:_dpInfoField(baseUrl, result, java, book, 'kind')", "lastChapter": "@js:_dpInfoField(baseUrl, result, java, book, 'lastChapter')", "name": "@js:_dpInfoField(baseUrl, result, java, book, 'name')", "tocUrl": "@js:_dpTocUrl(baseUrl, result)", "wordCount": "@js:_dpInfoField(baseUrl, result, java, book, 'wordCount')"}, "ruleContent": {"content": "<js>(function(){\nfunction _ILLU(x){try{return __dpIllu(String(x==null?\"\":x),book,chapter,java);}catch(eI){return x;}}\nif((typeof _dpAggWant===\"function\")&&_dpAggWant(chapter,baseUrl)){\n    try{_dpSetCtx(java,book,chapter);}catch(eS){}\n    return _ILLU(_dpAggBody(result,chapter,baseUrl,java));\n}\nreturn _ILLU(_dpBody(String(result==null?\"\":result)));\n})()</js>\n@js:(function(){if((typeof _dpAggWant==='function')&&_dpAggWant(chapter,baseUrl))return result;return __dpInject(result, book ? String(book.name || '') : '', book ? String(book.author || '') : '', chapter ? String(chapter.title || '') : '', java, cookie, book, chapter);})()"}, "ruleExplore": {"author": "$.bAuth", "bookList": "<js>var _h=(typeof src!=='undefined'&&src!=null)?String(src):String(result==null?'':result);result=_dpExploreList(baseUrl,_h,java);</js>\n$.data.records||$.dp3.records", "bookUrl": "$.u", "coverUrl": "$.c", "intro": "$.desc", "kind": "$.subCat||$.cat", "name": "$.bName", "wordCount": "$.cnt"}, "ruleSearch": {"author": "$.author", "bookList": "<js>var _h=(typeof src!=='undefined'&&src!=null)?String(src):String(result==null?'':result); var _r=[];try{_r=_dpSearchRows(_h,'',java,source)||[];}catch(eS0){_r=[];}result=JSON.stringify({list:_r});</js>\n$.list", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name", "wordCount": "$.wordCount"}, "ruleToc": {"chapterList": "<js>var _h=(typeof src!=='undefined'&&src!=null)?String(src):String(result==null?'':result);var _r=[];try{_r=_dpTocRows(baseUrl,_h,java)||[];}catch(eT0){_r=[];}result=JSON.stringify({list:_r});</js>\n$.list", "chapterName": "$.name", "chapterUrl": "$.url"}, "searchUrl": "@js:\nvar _g='';\ntry { _g=String(source.get('dp_adult')||''); } catch(e1){}\nif(!_g){ try { _g=String(source.get('dpgrade')||''); } catch(e2){} }\nif(!_g){ try { _g=String(cache.get('dpgrade')||''); } catch(e3){} }\nvar _a=((String(_g)==='1')||String(_g).indexOf('成人')>=0)?'1':'0';\n_dpAggHost() + '/api/search?key={{key}}&page={{page}}&type=novel&adult='+_a+'&all_src=1&batch=0&budget=25&sv=1';\n", "weight": 0},{"bookSourceComment": "2026.11.04 基于 https://github.com/ch6vip/fqapp 书旗(shuqi)上游协议制作的 Legado 纯 APP 接口书源。\n\n【协议】纯JS复现官方 App 加密口：2048字节 keystream 二进制 XOR + base64（data 与 x-sq-public 各自从 keystream[0] 起算）+ MD5 签名（按键名升序拼 k=v& + skey 盐）+ enc18 派生 + 36键 x-sq-public（体内 platform=an / 头内 platform=2）。黄金向量与 Rust 单测逐一比对通过。\n\n【链路】搜索=render/search/native_v3；详情=reader/titlepage；目录=H5 /chapter?bid= 全量真章名（失败降级 chapterinfo 递推）；正文=免签 CDN JSONP 明文（2host×2flag×2scheme，VIP章亦可），失败降级 chapterinfo ROT13+base64；发现=H5 19个榜单 + 书库分类（服务端渲染，支持分页）。\n\n【UA】必须 okhttp/3.12.13：实测 www.shuqi.com 对浏览器 UA 一律返回 1120 字节 403 拦截页（伪装成正常 HTML），headers 键名必须大写 'User-Agent'。\n\n【登录】游客态完全可用，无需登录；登录界面仅提供状态检查/线路测速/切换/重置设备身份。\n【限频】concurrentRate=1/3000 且搜索规则内置 3 秒最小间隔，避免触发风控。\n【兼容】LegadoTeam 官方版 + legado-E（全纯JS，不依赖 BouncyCastle/android.util.Base64）。\n【注意】目录 H5 页约 1.2MB/本；搜索接口不支持分页（page 参数是模块名常量）。", "bookSourceGroup": "书旗,小说,APP,AI", "bookSourceName": "🌙 书旗小说(APP接口)", "bookSourceType": 0, "bookSourceUrl": "https://www.shuqi.com##书旗APP", "bookUrlPattern": "https?://(?:www\\.shuqi\\.com|shuqi\\.com|www\\.shuqireader\\.com|c1\\.shuqireader\\.com|c2\\.shuqireader\\.com)/(?:book/[0-9]+\\.html|reader\\?bid=[0-9]+(?:&cid=[0-9]+)?|httpserver/filecache/get_book_content_[0-9]+_[0-9]+_[0-9]+_0_0\\.html)", "concurrentRate": "1/3000", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\n(function(){\n var B='';try{B=String(source.get('sqWeb')||'')}catch(e){};if(!B||B==='null')B='https://www.shuqi.com';B=B.replace(/\\/$/,'');\n var rows=[];\n function head(t){rows.push({title:t,url:'',style:{layout_flexBasisPercent:1,layout_wrapBefore:true,layout_justifySelf:'flex_start'}});}\n function add(t,u){rows.push({title:t,url:u+'&page={{page}}',style:{layout_flexGrow:1}});}\n head('📊 男频榜单');\n add('男频点击榜',B+'?rank=boyClick');add('男频收藏榜',B+'?rank=boyStore');\n add('男频订阅榜',B+'?rank=boyOrder');add('男频人气榜',B+'?rank=boyhot');\nadd('男频完结榜',B+'?rank=boyEnd');\n add('男频更新榜',B+'?rank=boyUpdate');\n head('💕 女频榜单');\n add('女频点击榜',B+'?rank=girlClick');add('女频收藏榜',B+'?rank=girlStore');\n add('女频订阅榜',B+'?rank=girlOrder');add('女频人气榜',B+'?rank=girlhot');\nadd('女频完结榜',B+'?rank=girlEnd');\n add('女频更新榜',B+'?rank=girlUpdate');\n head('🏆 全站榜单');\n add('全站完结榜',B+'?rank=allEnd');\n add('全站字数榜',B+'?rank=allWords');add('全站点击榜',B+'?rank=allClick');\n add('全站收藏榜',B+'?rank=allStore');add('全站订阅榜',B+'?rank=allOrder');\n head('📚 书库·频道');\n add('全部书库',B+'?sqs=1');add('男频书库',B+'?sz=1');add('女频书库',B+'?sz=2');\n head('📚 书库·分类');\n add('都市',B+'?fc=7');add('社会生活',B+'?fc=15');add('玄幻',B+'?fc=29');\n add('科幻',B+'?fc=34%2C102');add('悬疑',B+'?fc=41%2C108');add('历史',B+'?fc=45');\n add('体育',B+'?fc=54');add('武侠',B+'?fc=58');add('游戏',B+'?fc=63');\n add('仙侠',B+'?fc=67%2C98');add('同人',B+'?fc=71');add('现代言情',B+'?fc=76');\n add('古代言情',B+'?fc=86');add('玄幻言情',B+'?fc=94');add('幻想言情',B+'?fc=122');\n add('浪漫青春',B+'?fc=127');\n head('📚 书库·状态/字数/更新');\n add('连载',B+'?st=1');add('完结',B+'?st=2');\n add('30万以下',B+'?wd=11');add('30~50万',B+'?wd=12');add('50~100万',B+'?wd=13');\n add('100~200万',B+'?wd=14');add('200万以上',B+'?wd=15');\n add('3天内更新',B+'?tm=3');add('7天内更新',B+'?tm=7');\n add('半月内更新',B+'?tm=15');add('一月内更新',B+'?tm=30');\n return JSON.stringify(rows);\n})()", "header": "{\"User-Agent\": \"okhttp/3.12.13\"}", "jsLib": "var SQ_KSB64 = \"QAwnzM9laLzStxk3jlPL517JAu73dQemPSrdOnAdiisooFf/leYyXjc+8Az7oJ94j+pdGzsxGh6jmOs+f7HMz+6qEhMo/nxkrOvr72JIyqouvb0EMsAPWAZvS14X6TM3f9ulxMC4BOBxHBE6MF5rflH9KXEAQUjsww4Ef5//yCuiqPjQyNbKWZAy6mMdLvzXWa8wl2V1t4nUDJgJbaxBDXNPpu1K6M6yxHC9QbDXzhyOcn6R2ZXAkETdxZP28P4qjKDMNNg4tjxlWV5r+iMVveR/WlY6VdLMXRHHceteh9yu8KKSJ60WKb74Jp2a+ZSbT0sxbJ1Pm3/0GPGdLP4/NJTaZ/Z32U8S2JlaUBq6XHB5dwDvmChP86fHFvctkkY2XWRAZYKvAyscO3BX40v/fAtgfBKbwZZQn4PU/3C+svDdLITilbO8wEkIedR/2xtz4BZDgylGN5B33zAZCbIvOhL6u8YxrRhIPEIVwK4kS+/GxlHOg7ycGbMxx6WSdF4XtlKTk5cbam3+kcmUe4OIwCwYYq6IKaoO0O93AgL0O7bI4/oGlRqvns/1AhVP5Lv8qPELw5vCWe7ZAfqPUzFf3V6kRQMSk9gM/MicDcwrO9+Jp68P0MrC5QvUAS/QMr8vkL96UIj3qID17DFtf+v5JMCm37/45/rhw4yjccpMlYMD1xtl1VvByAE3IXTQJi7I0T2eHGwldAGEnmQxgjxCTy3MRJNqsodjx3y1o+4sLLRODqdbmgKGalsI7VTCgdn7D7gdWUKHWbM4ueFqB1zOoSvjmpi65MINtk2OkJwQUgXF8CEsbV57v382ri2IuJ2d3owaKVHB9x8X12L4tjxasn9EqKgStA9dwhQ7dhlFDKnHJ3F7nwKB/lnzsbgC0zH/fcqLPA8Q34aAb87IQz/F65M0g1oS3JJ9goAOJFDWSjWxZ5SrtrKm5zs9IHoJ18GAzQBZ7gDYm3oaFIHOAZiYISEPOWDqdDWYHGm2Mb7stADWdJ7c961sipFrosEu5HEoSDS2IhiADJbtRsYl6yhL+xyMvVICLtynr9hxwnu7dpINxyfCbwvQEI2nz6QBeUlfvDJgf9bOaExdQ3Hcjj/FMabfizUQEeYFSr40iW0ciIyjEwSddunLKtRHfQXULpVTGL6Gy6kFKLW9CEgQxNqNENE1SZWBq55f3gCLnac5tqiyqOFzycm879YE0u7ZuCB7usVEpIizT8xdg2VKv5kkfwX4un4T9xvhb0NG1GMVvd0WIw3Tidb7NjzPqdpMfdhZEMJfUmU/HNUugH8BQw1KakZwqodYjcCwm1WDOqnnug42yFvAy8Ih7q40b6cmjWYYLrvm7NW9dNDdVpGnNvYmgZkyvAi/fMrGVul+FGOkz3kchtqFyuDQM0a0cI43PbZxUDQU1jttZUB/3j5845ibFl4/gL2A0/6dwz3AraAlTRmqQrAoqF1h2oXY8IKF5CgaCjGcOcwrlCIkEebTfAvgrbccoof/IFNUFEZ9fcJ0wT6iZ9eSND6uJgg8pcbwHoy4pc2dft8tkN3ksHMRM3XFgScYQQRXVGuh14nbG6CH4piIC07lzb3ItgfIrQI97+9uLvWHrex7FnwDJOmQQIuUjdlrcfBdvMh0yVsESZQAzuDzqFiSBaSECqmmuSPifxcYpQqOLsXwheX2el1ojv5TsyUVvB3avEtyBADAa/V+XdNBqAwnbOftakdTto9pR52FxRVmHFzJzF0hGuMOz2XqIFvqNsbTPdWfdjT1riKyD1bxRboS356818/uN3EL6hqw4opXBLst6IoxALq0wB3h0k9Gt5TYJ8DgzmolSCeWRMVtgr8bwqhsIMDlncPcbJOhb24DPL5yosQitCt4ifkweGcDhIQN7Q1ilQLAmbV7KFQYyjmhbVwQnyemcaUYINNYPPyFoSaYwbo5XPKVwo5QubpYb9HMMM5d7EjqC3jrK6AzZ0/vfILWwHvuYDpgAHSuY+TnJdGvmvOIlURYvxC6NQZObwRX2fcsUd0nfvG9IS4W5sSg1mE+PR7FQoLKGU1dEFEFyScx0r0FopHLcDWRPLRZPUjA0wUE4Migk8HgXRC8lD09rZ1SmBtZNyaAc62GO8NcrHWF2u0viNMA7RHDlwkUhf/pgnvqFxRI6UuWY877Keoi9oaDbBcGpLUXiNK9ixNZk2UPvWYMfYNFg2yemBg0tT6Pkj7EwHKDkHz/I+uYlfak1MirdQJGckI9bzfN57L2j+G4ocuImVwC/StMhR2gRwdDo7Z7o3MUOmoy5XQWPehFfpDAoPpnwPupCM52r4QhLWYntvc/uhN9YSvthcWQdDOxKbI2GtFBzrq8X7SoGandqr1ijv4WFMrvbygo57GVN56Ka5NvBf3wIxrzYQpOSbwVczRh/Sztmj9r3NtKCrOY8/pqzX1nNThujmIW3SFJBbxEa1I0N6ZrORMjEe8afJcG33vcifgAbdJOan9Me9uIiDzBN9kS+iR29VtkIMWRNBSWI/eg+PZJAzoSYgtQmpYAscnB7OeEh2OCSegTjuXn9KKBiHKMiFldmhwDdtofsD4qL25FafrgJom76jSH0vAJ17QotQ1t0URNtj8AR68Bty9EBfnUJ0MSW3Rqjg/CjITS22JB/UzrquNzIAyAyv305DW3yTaZ1tzTpe6eJyLAVMAyxtcy3iWgiOFBvDl2R0cLICeAIH9aKR6+h1KfJ8JNgNKcH/DvZXcBL58=\";\nvar SQ_SKEY = \"467694bd8912441cae8498b3c7e4282c\";\nvar SQ_SQSV = \"1.0\";\nvar SQ_UID = \"8158804976\";\nvar SQ_CIUID = \"8000000\";\nvar SQ_HOST = \"https://ocean.shuqireader.com\";\nvar SQ_UA = \"okhttp/3.12.13\";\nvar SQ_H5UA = \"okhttp/3.12.13\";\nvar SQ_B64C = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nvar SQ_PUB = [\n[\"soft_id\",\"1\"],[\"user_id\",SQ_UID],[\"userId\",SQ_UID],[\"ver\",\"261013\"],\n[\"subVer\",\"sqrelease\"],[\"appVer\",\"12.7.0.268\"],[\"theme\",\"day\"],[\"platform\",\"an\"],\n[\"placeid\",\"1069\"],[\"sdk\",\"32\"],[\"cpu\",\"x86_64\"],[\"pkg_cpu\",\"arm64-v8a\"],[\"wh\",\"900x1600\"],\n[\"msv\",\"3\"],[\"vc\",\"5d73\"],[\"mod\",\"BVL-AN16\"],[\"manufacturer\",\"HONOR\"],[\"brand\",\"HONOR\"],\n[\"net_type\",\"wifi\"],[\"net_type_str\",\"wifi\"],[\"first_placeid\",\"src1069\"],[\"aak\",\"a3a840\"],\n[\"utype\",\"pre_vip\"],[\"net\",\"4\"],[\"net_env\",\"4\"],[\"permissionType\",\"0\"],[\"personalized\",\"1\"],\n[\"contentRecom\",\"1\"],[\"scene_code\",\"\"],[\"rom\",\"12\"],[\"sqUniqDeviceId\",\"\"],[\"utdid\",\"\"],\n[\"sn\",\"\"],[\"umidtoken\",\"\"],[\"otdd\",\"\"]];\nvar SQ_ORDER = [\"soft_id\",\"user_id\",\"userId\",\"ver\",\"subVer\",\"appVer\",\"theme\",\"platform\",\"placeid\",\n\"sdk\",\"cpu\",\"pkg_cpu\",\"wh\",\"msv\",\"enc\",\"vc\",\"mod\",\"manufacturer\",\"brand\",\"net_type\",\"net_type_str\",\n\"first_placeid\",\"aak\",\"utype\",\"net\",\"net_env\",\"permissionType\",\"personalized\",\"contentRecom\",\n\"scene_code\",\"rom\",\"sqUniqDeviceId\",\"utdid\",\"sn\",\"umidtoken\",\"otdd\"];\nvar SQ_NOSIGN = [\"sign\",\"key\",\"_public\",\"_reqid\",\"_beta\",\"_\",\"X\",\"XNEBULAXMLHTTPREQUEST\",\"callbackUrl\"];\nfunction SQ_b64d(s){s=String(s).replace(/[^A-Za-z0-9+\\/=]/g,\"\");var o=[],i=0,c1,c2,c3,c4;\n while(i<s.length){c1=SQ_B64C.indexOf(s.charAt(i++));c2=SQ_B64C.indexOf(s.charAt(i++));\n  c3=SQ_B64C.indexOf(s.charAt(i++));c4=SQ_B64C.indexOf(s.charAt(i++));\n  if(c2<0)break;o.push(((c1<<2)|(c2>>4))&255);\n  if(c3>=0){o.push((((c2&15)<<4)|(c3>>2))&255);\n   if(c4>=0)o.push((((c3&3)<<6)|c4)&255);}}\n return o;}\nfunction SQ_b64e(bs){var o=\"\",i=0,L=bs.length,a,b,c,n;\n while(i<L){a=bs[i++]&255;b=i<L?bs[i++]&255:-1;c=i<L?bs[i++]&255:-1;\n  n=(a<<16)|((b<0?0:b)<<8)|(c<0?0:c);\n  o+=SQ_B64C.charAt((n>>18)&63)+SQ_B64C.charAt((n>>12)&63)+\n     (b<0?\"=\":SQ_B64C.charAt((n>>6)&63))+(c<0?\"=\":SQ_B64C.charAt(n&63));}\n return o;}\nfunction SQ_u8(s){var o=[],i=0,c,c2,cp;s=String(s);\n for(i=0;i<s.length;i++){c=s.charCodeAt(i);\n  if(c<128)o.push(c);\n  else if(c<2048)o.push(192|(c>>6),128|(c&63));\n  else if(c>=0xD800&&c<=0xDBFF&&i+1<s.length){c2=s.charCodeAt(++i);\n   cp=0x10000+((c-0xD800)<<10)+(c2-0xDC00);\n   o.push(240|(cp>>18),128|((cp>>12)&63),128|((cp>>6)&63),128|(cp&63));}\n  else o.push(224|(c>>12),128|((c>>6)&63),128|(c&63));}\n return o;}\nfunction SQ_u8s(bs){var s=\"\",i=0,c,b1,b2,b3,cp;\n while(i<bs.length){c=bs[i++]&255;\n  if(c<128)s+=String.fromCharCode(c);\n  else if(c<224){b1=bs[i++]&255;s+=String.fromCharCode(((c&31)<<6)|(b1&63));}\n  else if(c<240){b1=bs[i++]&255;b2=bs[i++]&255;s+=String.fromCharCode(((c&15)<<12)|((b1&63)<<6)|(b2&63));}\n  else{b1=bs[i++]&255;b2=bs[i++]&255;b3=bs[i++]&255;\n   cp=(((c&7)<<18)|((b1&63)<<12)|((b2&63)<<6)|(b3&63))-0x10000;\n   s+=String.fromCharCode(0xD800+(cp>>10),0xDC00+(cp&1023));}}\n return s;}\nfunction SQ_uri(s){return encodeURIComponent(String(s));}\nfunction SQ_pubEnc(s){return SQ_uri(s).replace(/\\+/g,\"%20\").replace(/\\*/g,\"%2A\").replace(/%7E/g,\"~\");}\nfunction SQ_md5(str){\n var bs=SQ_u8(String(str)),i,j,L=bs.length;\n var SA=[7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,\n  5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,\n  4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,\n  6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21];\n var KT=[];for(i=0;i<64;i++)KT[i]=Math.floor(Math.abs(Math.sin(i+1))*4294967296);\n function rol(x,c){return (x<<c)|(x>>>(32-c));}\n function add(a,b){var l=(a&65535)+(b&65535),h=(a>>>16)+(b>>>16)+(l>>>16);return ((h<<16)|(l&65535))>>>0;}\n var bitLen=L*8;\n bs.push(128);\n while(bs.length%64!==56)bs.push(0);\n var hi=Math.floor(bitLen/4294967296),lo=bitLen>>>0;\n bs.push(lo&255,(lo>>>8)&255,(lo>>>16)&255,(lo>>>24)&255,\n        hi&255,(hi>>>8)&255,(hi>>>16)&255,(hi>>>24)&255);\n var a0=0x67452301,b0=0xefcdab89,c0=0x98badcfe,d0=0x10325476;\n for(i=0;i<bs.length;i+=64){\n  var M=[];for(j=0;j<16;j++){var q=i+j*4;M[j]=(bs[q]|(bs[q+1]<<8)|(bs[q+2]<<16)|(bs[q+3]<<24))>>>0;}\n  var A=a0,B=b0,C=c0,D=d0,F,g,tmp;\n  for(j=0;j<64;j++){\n   if(j<16){F=(B&C)|((~B)&D);g=j;}\n   else if(j<32){F=(D&B)|((~D)&C);g=(5*j+1)%16;}\n   else if(j<48){F=B^C^D;g=(3*j+5)%16;}\n   else{F=C^(B|(~D));g=(7*j)%16;}\n   F=add(add(add(A,F),KT[j]),M[g]);\n   tmp=D;D=C;C=B;B=add(B,rol(F,SA[j]));A=tmp;}\n  a0=add(a0,A);b0=add(b0,B);c0=add(c0,C);d0=add(d0,D);}\n function hx(n){var s=\"\",k;for(k=0;k<4;k++){var v=(n>>>(k*8))&255;s+=(v<16?\"0\":\"\")+v.toString(16);}return s;}\n return hx(a0)+hx(b0)+hx(c0)+hx(d0);}\nfunction SQ_enc18(uid,ts){ts=String(ts);while(ts.length<13)ts=\"2\"+ts;if(ts.length>13)ts=ts.slice(0,13);\n var n=Number(uid)||0;if(n===0)n=24697;\n var k=Number(ts.charAt(1)+ts.charAt(3)+ts.charAt(5)+ts.charAt(8)+ts.charAt(6))||0;\n var p=k===0?12347*n:k*n;\n var tail=String(p).slice(-5);\n return tail+ts;}\nfunction SQ_sign(pairs){var a=[],i,k,v;\n for(i=0;i<pairs.length;i++){k=pairs[i][0];v=pairs[i][1];\n  if(SQ_NOSIGN.indexOf(k)>=0)continue;a.push([k,String(v)]);}\n var has=false;for(i=0;i<a.length;i++)if(a[i][0]===\"sqSv\")has=true;\n if(!has)a.push([\"sqSv\",SQ_SQSV]);\n a.sort(function(x,y){return x[0]<y[0]?-1:(x[0]>y[0]?1:0);});\n var raw=\"\";for(i=0;i<a.length;i++)raw+=a[i][0]+\"=\"+SQ_uri(a[i][1])+\"&\";\n raw+=\"skey=\"+SQ_SKEY;return SQ_md5(raw);}\nfunction SQ_pubStr(uid,enc,dev){var m={},i,k;\n for(i=0;i<SQ_PUB.length;i++)m[SQ_PUB[i][0]]=SQ_PUB[i][1];\n for(k in dev)if(dev.hasOwnProperty(k))m[k]=dev[k];\n m.user_id=uid;m.userId=uid;m.platform=\"2\";m.enc=enc;\n var o=\"\";for(i=0;i<SQ_ORDER.length;i++){k=SQ_ORDER[i];\n  if(m[k]!==undefined)o+=k+\"=\"+SQ_pubEnc(m[k])+\"&\";}\n return o;}\nfunction SQ_xorB64(bytes){var ks=SQ_KS(),o=[],i,n=bytes.length<ks.length?bytes.length:ks.length;\n for(i=0;i<n;i++)o.push((bytes[i]&255)^(ks[i]&255));\n return SQ_b64e(o);}\nvar SQ_KS_CACHE=null;\nfunction SQ_KS(){if(!SQ_KS_CACHE)SQ_KS_CACHE=SQ_b64d(SQ_KSB64);return SQ_KS_CACHE;}\nfunction SQ_rnd(n,hex){var C=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\",H=\"0123456789abcdef\",s=\"\";\n for(var i=0;i<n;i++)s+=(hex?H:C).charAt(Math.floor(Math.random()*(hex?16:62)));return s;}\nfunction SQ_newDev(){return {sqUniqDeviceId:SQ_rnd(22,0),utdid:SQ_rnd(28,0),sn:SQ_rnd(16,1),\n umidtoken:SQ_rnd(40,1),otdd:SQ_rnd(22,0)};}\nfunction SQ_dev(S){var v=\"\";try{v=String(S.get(\"sqDev\")||\"\");}catch(e){}\n if(v&&v.length>10&&v!==\"null\"){try{var d=JSON.parse(v);if(d&&d.sn)return d;}catch(e2){}}\n var d2=SQ_newDev();try{S.put(\"sqDev\",JSON.stringify(d2));}catch(e3){}return d2;}\nfunction SQ_req(path,biz,uid,S,ts){uid=uid||SQ_UID;ts=ts||String(Date.now());\n var dev=SQ_dev(S);var enc=SQ_enc18(uid,ts);\n var m={},i,k,v;\n for(i=0;i<SQ_PUB.length;i++)m[SQ_PUB[i][0]]=SQ_PUB[i][1];\n for(k in dev)if(dev.hasOwnProperty(k))m[k]=dev[k];\n m.user_id=uid;m.userId=uid;m.platform=\"an\";m.enc=enc;m.timestamp=ts;\n for(i=0;i<biz.length;i++)m[biz[i][0]]=String(biz[i][1]);\n m.isTeenMode=\"0\";m.sqSv=SQ_SQSV;\n var pairs=[];for(k in m)if(m.hasOwnProperty(k))pairs.push([k,m[k]]);\n m.sign=SQ_sign(pairs);m.key=\"sq_app_gateway\";\n var plain=SQ_u8(JSON.stringify(m));\n var body=\"data=\"+SQ_uri(SQ_xorB64(plain));\n var pub=SQ_pubStr(uid,enc,dev);\n var hdr={\"content-type\":\"application/x-www-form-urlencoded\",\"user-agent\":SQ_UA,\n  \"x-sq-req-platform\":\"an\",\"x-sq-s-key\":\"23011413\",\"x-sq-sv\":\"3.0\",\n  \"x-sq-public\":SQ_xorB64(SQ_u8(pub)),\"x-sq-req-encrypt\":\"sdk\",\n  \"x-sq-req-encrypt-param\":\"x-sq-public\",\"x-sq-api-encrypt\":\"1\"};\n return {url:SQ_HOST+path,option:{method:\"POST\",body:body,headers:hdr,timeout:15000}};}\nfunction SQ_post(Jv,S,path,biz,uid){var r=SQ_req(path,biz,uid,S);\n var raw=String(Jv.ajax(r.url+\",\"+JSON.stringify(r.option)));\n try{return JSON.parse(raw);}catch(e){throw new Error(\"书旗接口返回异常: \"+raw.slice(0,120));}}\nfunction SQ_get(Jv,url,ua){var o={timeout:12000,headers:{\"User-Agent\":ua||SQ_H5UA}};\n return String(Jv.ajax(url+\",\"+JSON.stringify(o)));}\nvar SQ_WEB = \"https://www.shuqi.com\";\nvar SQ_WEB_ALT = [\"https://www.shuqi.com\",\"https://shuqi.com\"];\nvar SQ_CDN_ALT = [\"https://c1.shuqireader.com\",\"https://c2.shuqireader.com\"];\nvar SQ_ALL_LINES = SQ_WEB_ALT.concat(SQ_CDN_ALT);\nvar SQ_CDN_HOSTS = [\"c1.shuqireader.com\",\"c2.shuqireader.com\"];\nvar SQ_CDN_FLAGS = [\"3111111111\",\"2111111111\"];\nvar SQ_P_SEARCH = \"/sqan/render/render/search/native_v3\";\nvar SQ_P_TITLE = \"/sqan/sqapi/bff/api/v1/reader/titlepage\";\nvar SQ_P_CHINFO = \"/sqan/sqapi/bff/api/v1/reader/chapterinfo\";\nfunction SQ_S(x){return \"\"+(x===undefined||x===null?\"\":x);}\nfunction SQ_trim(s){return SQ_S(s).replace(/^\\s+|\\s+$/g,\"\");}\nfunction SQ_plain(s){return SQ_trim(SQ_S(s).replace(/<[^>]*>/g,\"\").replace(/&nbsp;/g,\" \").replace(/&amp;/g,\"&\").replace(/&lt;/g,\"<\").replace(/&gt;/g,\">\").replace(/&quot;/g,'\"').replace(/\\s+/g,\" \"));}\nfunction SQ_wan(v){var n=Number(v)||0;if(n>=1e8)return (Math.round(n/1e6)/100)+\"亿字\";if(n>=1e4)return (Math.round(n/1e3)/10)+\"万字\";return n>0?n+\"字\":\"\";}\nfunction SQ_status(v){return SQ_S(v)===\"2\"?\"完结\":\"连载\";}\nfunction SQ_tagStr(m){var a=m.tags||m.tagList||[];var o=[],i;\n if(typeof a===\"string\")return SQ_plain(a);\n for(i=0;i<a.length;i++){var t=a[i];o.push(SQ_plain(typeof t===\"string\"?t:(t&&(t.tagName||t.name))||\"\"));}\n return o.filter(function(x){return x}).join(\",\");}\nfunction SQ_bid(u){var s=SQ_S(u),m;\n m=s.match(/get_book_content_([0-9]{1,12})_([0-9]{1,20})_/);if(m)return m[1];\n m=s.match(/(?:\\/book\\/|\\/sqbook\\/|bid=|bookId=)([0-9]{1,12})/);return m?m[1]:\"\";}\nfunction SQ_cid(u){var s=SQ_S(u),m;\n m=s.match(/get_book_content_[0-9]{1,12}_([0-9]{1,20})_/);if(m)return m[1];\n m=s.match(/(?:cid=|sqch\\/\\d+\\/)([0-9]{1,20})/);return m?m[1]:\"\";}\nfunction SQ_bookUrl(id,S){try{return SQ_web(S)+\"/book/\"+id+\".html\"}catch(e){return SQ_WEB_ALT[0]+\"/book/\"+id+\".html\";}}\nfunction SQ_chUrl(bid,cid,S){try{return SQ_cdnHost(S)+\"/httpserver/filecache/get_book_content_\"+bid+\"_\"+cid+\"_3111111111_0_0.html\"}catch(e){return SQ_CDN_ALT[0]+\"/httpserver/filecache/get_book_content_\"+bid+\"_\"+cid+\"_3111111111_0_0.html\";}}\nfunction SQ_gv(S,k,d){var v=\"\";try{v=SQ_S(S.get(k)||\"\");}catch(e){}\n if(!v||v===\"null\"||v===\"undefined\")v=d||\"\";return SQ_S(v);}\nfunction SQ_web(S){\n var w=SQ_gv(S,\"sqWeb\",SQ_WEB).replace(/\\/$/,\"\");\n var ok=false,i;for(i=0;i<SQ_WEB_ALT.length;i++)if(w===SQ_WEB_ALT[i])ok=true;\n if(!ok)w=SQ_WEB_ALT[0];\n return w;}\nfunction SQ_cdnHost(S){\n var c=SQ_gv(S,\"sqCdn\",\"https://c1.shuqireader.com\").replace(/\\/$/,\"\");\n var ok2=false,i;for(i=0;i<SQ_CDN_ALT.length;i++)if(c===SQ_CDN_ALT[i])ok2=true;\n if(!ok2)c=SQ_CDN_ALT[0];\n return c;}\nfunction SQ_put(S,k,v){try{S.put(k,SQ_S(v));}catch(e){try{java.put(k,SQ_S(v));}catch(e2){}}}\nfunction SQ_webGet(Jv,url){var o={timeout:12000,headers:{\"User-Agent\":SQ_UA}};\n return SQ_S(Jv.ajax(url+\",\"+JSON.stringify(o)));}\nfunction SQ_api(Jv,S,path,biz,uid){return SQ_post(Jv,S,path,biz,uid);}\nfunction SQ_searchUrl(Jv,S,kw,pg){\n var biz=[[\"page\",\"searchResultV3\"],[\"query\",SQ_S(kw)],[\"timestamp\",String(Date.now())]];\n var r=SQ_req(SQ_P_SEARCH,biz,null,S);\n return r.url+\",\"+JSON.stringify(r.option);\n}\nfunction SQ_searchBooks(resp,S){S=S||{get:function(){return \"\"}};\n var d={};try{d=(resp&&typeof resp===\"object\")?resp:JSON.parse(SQ_S(resp));}catch(e){return [];}\n var mods=(d.data&&d.data.moduleInfos)||[],out=[],seen={},i;\n for(i=0;i<mods.length;i++){\n  var b=mods[i]&&mods[i].book;if(!b||!b.bookId)continue;\n  var id=SQ_S(b.bookId);if(seen[id])continue;seen[id]=1;\n  var kind=[];\n  var bottom=SQ_plain(b.bottomText||\"\");if(bottom)kind.push(bottom);\n  var tags=SQ_tagStr(b);if(tags)kind.push(tags);\n  out.push({name:SQ_plain(b.bookName||b.displayBookName),author:SQ_plain(b.authorName),\n   bookUrl:SQ_bookUrl(id,S),coverUrl:SQ_S(b.imgUrl||\"\"),\n   intro:SQ_plain(b.desc),kind:kind.join(\",\"),wordCount:SQ_wan(b.wordCount),\n   lastChapter:\"\",status:SQ_status(b.state)});\n }\n return out;\n}\nfunction SQ_detail(Jv,S,rawUrl){\n var bid=SQ_bid(rawUrl);if(!bid)throw new Error(\"书旗：无效书籍ID\");\n var info=null;\n try{var r=SQ_api(Jv,S,SQ_P_TITLE,[[\"bookId\",bid]]);\n  var b=(r&&r.data&&r.data.bookInfo)||null;\n  if(b&&b.bookName){\n   var score=(r.data&&r.data.scoreInfo)||{};\n   var kind=[SQ_S(b.secCateName||\"\"),SQ_tagStr(b),SQ_status(b.serialState),score.bookScore?score.bookScore+\"分\":\"\",SQ_wan(b.wordCount)].filter(function(x){return x});\n   info={name:SQ_plain(b.bookName),author:SQ_plain(b.authorName),\n    intro:SQ_plain(b.briefIntro||b.desc||b.intro),kind:kind.join(\",\"),\n    coverUrl:SQ_S(b.coverUrl||b.imgUrl||\"\"),wordCount:SQ_wan(b.wordCount),\n    lastChapter:SQ_plain((b.lastChapter&&b.lastChapter.chapterName)||b.latestChapterName||\"\"),\n    tocUrl:SQ_bookUrl(bid,S)};\n  }\n }catch(e){}\n if(!info){\n  try{var h=SQ_webGet(Jv,SQ_web(S)+\"/book/\"+bid+\".html\");\n   var ti=(h.match(/<title>([\\s\\S]{0,160}?)<\\/title>/)||[])[1]||\"\";\n   var mt=ti.match(/《([^》]+)》/);var nm=mt?mt[1]:\"\";\n   var au=(h.match(/作者[：:]\\s*([^<\\s,，]{1,20})/)||[])[1]||\"\";\n   var iv=(h.match(/简介[：:]?([\\s\\S]{0,400}?)<\\/p>/)||[])[1]||\"\";\n   info={name:nm||\"书籍\"+bid,author:au,intro:SQ_plain(iv),kind:\"\",coverUrl:\"\",wordCount:\"\",lastChapter:\"\",tocUrl:SQ_bookUrl(bid,S)};\n  }catch(e2){throw new Error(\"书旗：详情获取失败 \"+bid);}\n }\n return info;\n}\nfunction SQ_toc(Jv,S,rawUrl){\n var bid=SQ_bid(rawUrl);if(!bid)throw new Error(\"书旗：无效书籍ID\");\n var h=\"\";\n try{h=SQ_webGet(Jv,SQ_web(S)+\"/chapter?bid=\"+bid);}catch(e){}\n if(h.length>5000&&h.indexOf(\"cid=\")>=0){\n  var rows=[],seen={},re=/href=\"\\/reader\\?bid=\\d+&(?:amp;)?cid=(\\d+)\"[^>]*>([\\s\\S]*?)<\\/a>/g,m;\n  while((m=re.exec(h))!==null){\n   var cid=m[1];if(seen[cid])continue;seen[cid]=1;\n   var inner=SQ_S(m[2]).replace(/<i[^>]*>[\\s\\S]*?<\\/i>/gi,\" \").replace(/<[^>]*>/g,\" \");\n   inner=SQ_plain(inner).replace(/^\\d+[.、]\\s*/,\"\");\n   if(!inner)continue;\n   rows.push({title:inner,url:SQ_chUrl(bid,cid,S)});\n   if(rows.length>20000)break;\n  }\n  if(rows.length)return rows;\n }\n var base=0,first=\"\",total=0;\n try{var cr=SQ_api(Jv,S,SQ_P_CHINFO,[[\"bookId\",bid]],SQ_CIUID);\n  var ch=(cr&&cr.data&&cr.data.chapter)||{};\n  base=Number(ch.chapterId)||0;first=SQ_plain(ch.name||\"\");}catch(e){}\n try{var br=SQ_api(Jv,S,SQ_P_TITLE,[[\"bookId\",bid]]);\n  total=Number(br&&br.data&&br.data.bookInfo&&br.data.bookInfo.chapterTotalNum)||0;}catch(e2){}\n if(!base||!total||total>20000)throw new Error(\"书旗：目录不可用（H5与递推均失败），请稍后重试\");\n var out=[],i;for(i=0;i<total;i++){\n  out.push({title:i===0?(first||\"第1章\"):(\"第\"+(i+1)+\"章\"),url:SQ_chUrl(bid,String(base+i),S)});\n }\n return out;\n}\nfunction SQ_cdnParse(body){\n var s=SQ_S(body),i=s.indexOf(\"(\"),j=s.lastIndexOf(\")\"),inner=i>0&&j>i?s.slice(i+1,j):s;\n try{var a=JSON.parse(inner);var c=SQ_S(a&&a[0]&&a[0].content);\n  if(!c)return \"\";\n  return SQ_trim(c.replace(/<br\\s*\\/?>/gi,\"\\n\").replace(/&nbsp;/g,\" \").replace(/<[^>]*>/g,\"\")\n   .replace(/&amp;/g,\"&\").replace(/&lt;/g,\"<\").replace(/&gt;/g,\">\").replace(/&quot;/g,'\"'));\n }catch(e){return \"\";}\n}\nfunction SQ_rot13(s){return SQ_S(s).replace(/[a-zA-Z]/g,function(c){var b=c<=\"Z\"?65:97;return String.fromCharCode((c.charCodeAt(0)-b+13)%26+b);});}\nfunction SQ_ciDecode(s){var r=SQ_rot13(s).replace(/\\s+/g,\"\");\n try{return SQ_u8s(SQ_b64d(r)).replace(/<br\\s*\\/?>/gi,\"\\n\");}catch(e){return \"\";}}\nfunction SQ_content(Jv,S,rawUrl){\n var bid=SQ_bid(rawUrl),cid=SQ_cid(rawUrl);\n if(!bid||!cid)throw new Error(\"书旗：章节地址无效\");\n var note=[],i,f,h,sch,url,txt;\n var pref=SQ_cdnHost(S).split(\"//\")[1];\n var hs=SQ_CDN_HOSTS.slice();\n hs.sort(function(a,b){return (a===pref?-1:0)-(b===pref?-1:0)});\n for(sch=0;sch<2;sch++){\n  var scheme=sch===0?\"https\":\"http\";\n  for(h=0;h<hs.length;h++){\n   for(f=0;f<SQ_CDN_FLAGS.length;f++){\n    url=scheme+\"://\"+hs[h]+\"/httpserver/filecache/get_book_content_\"+bid+\"_\"+cid+\"_\"+SQ_CDN_FLAGS[f]+\"_0_0.html\";\n    try{var b=SQ_webGet(Jv,url);txt=SQ_cdnParse(b);\n     if(txt.length>30)return txt;note.push(SQ_CDN_HOSTS[h]+\"/\"+SQ_CDN_FLAGS[f]+\":空\");\n    }catch(e){note.push(SQ_CDN_HOSTS[h]+\"/\"+SQ_CDN_FLAGS[f]+\":失败\");}\n   }\n  }\n }\n try{var cr=SQ_api(Jv,S,SQ_P_CHINFO,[[\"bookId\",bid],[\"chapterId\",cid]],SQ_CIUID);\n  var enc=SQ_S(cr&&cr.data&&cr.data.chapter&&cr.data.chapter.content);\n  if(enc){var dec=SQ_ciDecode(enc);if(dec.length>30)return dec;}\n }catch(e){note.push(\"chapterinfo:\"+SQ_S(e).slice(0,40));}\n throw new Error(\"书旗：本章正文不可用（\"+(cid)+\"）。\"+(note.length?note.slice(0,3).join(\"; \"):\"可能需登录或为付费章\"));\n}\nfunction SQ_explore(Jv,S,rawUrl,pg){\n var u=SQ_S(rawUrl);\n var mp=u.match(/[?&]page=([0-9]+)/);var p=mp?Number(mp[1]):(Number(pg)||1);\n var path=\"\",m;\n if((m=u.match(/[?&]rank=([A-Za-z]+)/)))path=\"/ranklist?rank=\"+m[1]+\"&page=\"+p;\n else if(/[?&](?:sz|fc|wd|tm|st|store|sqs)=/.test(u)||u.indexOf(\"/store\")>=0){\n  var q=u.indexOf(\"?\")>=0?u.slice(u.indexOf(\"?\")+1).replace(/&amp;/g,\"&\"):\"\";\n  q=q.replace(/[?&]?page=[0-9]+/g,\"\").replace(/^&+|&+$/g,\"\");\n  var keep=[],kv=q.split(\"&\"),i0;\n  for(i0=0;i0<kv.length;i0++){if(/^(sz|fc|wd|tm|st)=/.test(kv[i0]))keep.push(kv[i0]);}\n  path=\"/store?\"+(keep.length?keep.join(\"&\")+\"&\":\"\")+\"page=\"+p;\n }\n else path=\"/rank?page=\"+p;\n var web=SQ_web(S);\n var h=\"\";\n try{h=SQ_webGet(Jv,web+path);}catch(e){}\n if(h.length<2000)return [];\n var out=[],seen={},re,i2;\n if(path.indexOf(\"/ranklist\")===0||path.indexOf(\"/rank?\")===0){\n  re=/<li class=\"clearfix\">([\\s\\S]*?)<\\/li>/g;\n  var mm;\n  while((mm=re.exec(h))!==null){\n   var li=SQ_S(mm[1]);\n   var mb=li.match(/\\/book\\/(\\d+)\\.html/);if(!mb||seen[mb[1]])continue;seen[mb[1]]=1;\n   var title=(li.match(/<h3>([\\s\\S]*?)<\\/h3>/)||[])[1]||\"\";\n   var img=(li.match(/<img[^>]*src=\"([^\"]+)\"/)||[])[1]||\"\";\n   var au=(li.match(/class=\"bkuser-icon\"[^>]*>[\\s\\S]*?<a[^>]*>([\\s\\S]*?)<\\/a>/)||[])[1]||\"\";\n   var cate=(li.match(/class=\"bkcate-icon\">([\\s\\S]*?)<\\/span>/)||[])[1]||\"\";\n   var des=(li.match(/class=\"ranklist-des\">([\\s\\S]*?)<\\/p>/)||[])[1]||\"\";\n   var tags=(li.match(/class=\"ranklist-tag\">([\\s\\S]*?)<\\/p>/)||[])[1]||\"\";\n   var tg=SQ_plain(tags.replace(/<[^>]*>/g,\" \"));\n   out.push({name:SQ_plain(title),author:SQ_plain(au),bookUrl:SQ_bookUrl(mb[1],S),\n    coverUrl:SQ_S(img),intro:SQ_plain(des),kind:[SQ_plain(cate),tg].filter(function(x){return x}).join(\",\")});\n  }\n }else{\n  var lis=h.split('<li');\n  for(i2=1;i2<lis.length;i2++){\n   var li=SQ_S(lis[i2].split('</li>')[0]);\n   if(li.indexOf('store-tag')<0)continue;\n   var mb2=li.match(/\\/book\\/(\\d+)\\.html/);if(!mb2||seen[mb2[1]])continue;seen[mb2[1]]=1;\n   var nm=(li.match(/<h3[^>]*>([\\s\\S]*?)<\\/h3>/)||[])[1]||'';\n   if(!nm){var mt2=li.match(/<a[^>]*href=\"\\/book\\/\\d+\\.html\"[^>]*title=\"([^\"]*)\"/);if(mt2)nm=mt2[1];}\n   var im=(li.match(/<img[^>]*class=\"cover\"[^>]*src=\"([^\"]+)\"/)||li.match(/<img[^>]*src=\"([^\"]+)\"/)||[])[1]||'';\n   var des=(li.match(/class=\"store-des\">([\\s\\S]*?)<\\/p>/)||[])[1]||'';\n   var au=(li.match(/class=\"store-tag[^>]*>[\\s\\S]*?<a[^>]*>([\\s\\S]*?)<\\/a>/)||[])[1]||'';\n   au=SQ_plain(au).replace(/^作者[：:]\\s*/,'');\n   var cate=(li.match(/class=\"store-tag[^>]*>[\\s\\S]*?<span>([\\s\\S]*?)<\\/span>/)||[])[1]||'';\n   if(!nm)continue;\n   out.push({name:SQ_plain(nm),author:au,bookUrl:SQ_bookUrl(mb2[1],S),coverUrl:SQ_S(im),\n    intro:SQ_plain(des),kind:SQ_plain(cate)});\n  }\n }\n return out;\n}\nfunction SQ_speedKey(host){return \"sqsp_\"+SQ_S(host).replace(/[^a-z0-9]/gi,\"\").slice(0,24);}\nfunction SQ_speedTest(Jv,S){\n var res=[],i,best=\"\",bm=99999999;\n for(i=0;i<SQ_ALL_LINES.length;i++){\n  var host=SQ_ALL_LINES[i];\n  var isCdn=SQ_CDN_ALT.indexOf(host)>=0;\n  var probe=isCdn?host+\"/httpserver/filecache/get_book_content_34078_2180322_3111111111_0_0.html\"\n                  :host+\"/ranklist?rank=boyClick\";\n  var t0=Date.now(),ok=false,ms=0;\n  try{var h=SQ_webGet(Jv,probe);\n   ms=Date.now()-t0;\n   ok=isCdn?(h.indexOf(\"success_jsonpCallback\")>=0&&h.indexOf(\"\\\\u3000\")>=0)\n           :(h.length>5000&&h.indexOf(\"ranklist-ul\")>=0&&h.indexOf(\"访问被拒绝\")<0);\n  }catch(e){ms=Date.now()-t0;}\n  var st=ok?ms+\"ms\":\"超时/不支持\";\n  SQ_put(S,SQ_speedKey(host),st);\n  res.push({host:host,kind:isCdn?\"CDN\":\"H5\",ms:ms,ok:ok,st:st});\n  if(ok&&!isCdn&&ms<bm){bm=ms;best=host;}\n }\n if(best){SQ_put(S,SQ_speedKey(best),\"⚡\"+bm+\"ms\");SQ_put(S,\"sqWeb\",best);}\n return {best:best,bm:bm,rows:res};\n}\nfunction SQ_setWeb(S,host){SQ_put(S,\"sqWeb\",SQ_S(host).replace(/\\/$/,\"\"));return SQ_S(host);}\nfunction SQ_checkLogin(Jv,S){\n var out={needLogin:false,ok:false,detail:\"\"};\n try{var r=SQ_api(Jv,S,SQ_P_TITLE,[[\"bookId\",\"34078\"]]);\n  out.ok=!!(r&&r.data&&r.data.bookInfo);\n  out.detail=out.ok?\"游客态可用（无需登录）\":\"接口异常\";\n }catch(e){out.detail=SQ_S(e).slice(0,80);}\n return out;\n}", "lastUpdateTime": "1793801293146", "loginCheckJs": "(function(){var b='';try{b=String(result.body())}catch(e){try{b=String(result)}catch(e2){}};if(b.indexOf('403 - 访问被拒绝')>=0){throw new Error('⚠️ 书旗 H5 站点 403 拦截（UA/线路异常），请点登录界面「测试延时」切换线路');}return result;})()", "loginUi": "[{\"name\": \"📖 书旗小说(APP接口) · 游客态可用，无需登录\", \"type\": \"button\", \"action\": \"SQ_uiHelp(java)\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"🔍 检查登录状态（游客态连通性）\", \"type\": \"button\", \"action\": \"SQ_uiCheck(java)\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"🌐 网址发布页\", \"type\": \"text\", \"key\": \"sqPubUrl\", \"hint\": \"书旗无独立发布页；如需自定义上游线路可填网址（可选）\", \"default\": \"https://www.shuqi.com/\"}, {\"name\": \"📥 一键从发布页获取网址路线\", \"type\": \"button\", \"action\": \"SQ_uiFetchPub(java)\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"🌐 当前线路\", \"type\": \"button\", \"action\": \"SQ_uiShowWeb(java)\", \"viewName\": \"'🌐 当前线路：'+(source.get('sqWeb')||'https://www.shuqi.com')\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"⏱ 测试延时（逐站测速，结果写入下方按钮）\", \"type\": \"button\", \"action\": \"SQ_uiSpeed(java)\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"🔘 H5 主站 www.shuqi.com\", \"type\": \"button\", \"action\": \"SQ_uiSetLine(java,'https://www.shuqi.com')\", \"viewName\": \"'🔘 H5 主站 www.shuqi.com '+(source.get('sqsp_httpswwwshuqicom')||'未测速')\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"🔘 H5 裸域 shuqi.com\", \"type\": \"button\", \"action\": \"SQ_uiSetLine(java,'https://shuqi.com')\", \"viewName\": \"'🔘 H5 裸域 shuqi.com '+(source.get('sqsp_httpsshuqicom')||'未测速')\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"🔘 CDN c1.shuqireader.com\", \"type\": \"button\", \"action\": \"SQ_uiSetLine(java,'https://c1.shuqireader.com')\", \"viewName\": \"'🔘 CDN c1.shuqireader.com '+(source.get('sqsp_httpsc1shuqireadercom')||'未测速')\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"🔘 CDN c2.shuqireader.com\", \"type\": \"button\", \"action\": \"SQ_uiSetLine(java,'https://c2.shuqireader.com')\", \"viewName\": \"'🔘 CDN c2.shuqireader.com '+(source.get('sqsp_httpsc2shuqireadercom')||'未测速')\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"🔄 重置设备身份（接口异常时点此）\", \"type\": \"button\", \"action\": \"SQ_uiResetDev(java)\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"ℹ️ 关于 / UA 与限频说明\", \"type\": \"button\", \"action\": \"SQ_uiAbout(java)\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}]", "loginUrl": "function SQ_T(jv,msg){try{jv.longToast(msg);return;}catch(e){}try{jv.toast(msg);}catch(e2){}}\nfunction SQ_PUB(jv){try{return String(jv.get('sqPubUrl')||'')}catch(e){return ''}}\nfunction SQ_SET(jv,k,v){try{jv.put(k,String(v))}catch(e){}}\nfunction SQ_GET(jv,k){try{return String(jv.get(k)||'')}catch(e){return ''}}\nfunction SQ_HOSTS(){return ['https://www.shuqi.com','https://shuqi.com','https://c1.shuqireader.com','https://c2.shuqireader.com']}\nfunction SQ_KEY(h){return 'sqsp_'+String(h).replace(/[^a-z0-9]/gi,'').slice(0,24)}\nfunction SQ_AJAX(jv,u,ms){var o={timeout:ms||8000,headers:{'User-Agent':'okhttp/3.12.13'}};\n return String(jv.ajax(u+','+JSON.stringify(o)));}\nfunction SQ_PARSE(h){\n var out=[],re=/href=[\"'](https?:\\/\\/[a-z0-9.-]*shuqi[a-z0-9.-]*)[\"']/gi,m,seen={};\n while((m=re.exec(h))!==null){var u=m[1].replace(/\\/$/,'');if(!seen[u]){seen[u]=1;out.push(u)}}\n return out;}\nfunction SQ_uiHelp(jv){SQ_T(jv,'ℹ️ 书旗小说书源：上游为书旗官方 App 加密接口（游客态），无需账号登录。\\n搜索/详情/目录/正文/发现均可用；VIP 章正文来自免签 CDN 缓存。');}\nfunction SQ_uiAbout(jv){SQ_T(jv,'ℹ️ UA 固定 okhttp/3.12.13（站点对浏览器 UA 返回 403 拦截页）。\\n已内置搜索最小间隔 3 秒与 concurrentRate 限速，请勿连续高频搜索以免触发风控。\\n兼容 LegadoTeam 官方版与 legado-E。');}\nfunction SQ_uiCheck(jv){\n SQ_T(jv,'⏳ 正在检查登录状态与接口连通性…');\n try{\n  var o={timeout:10000,headers:{'User-Agent':'okhttp/3.12.13','content-type':'application/x-www-form-urlencoded'}};\n  var h=SQ_AJAX(jv,'https://www.shuqi.com/ranklist?rank=boyClick',10000);\n  if(h.length>5000&&h.indexOf('访问被拒绝')<0){\n   SQ_T(jv,'✅ 游客态可用，无需登录（H5 榜单连通，'+h.length+' 字节）\\n书源接口正常，可直接搜索阅读。');return;}\n  SQ_T(jv,'⚠️ H5 站点返回异常（可能被限频），但加密接口仍可尝试；如搜索失败请稍后重试。');\n }catch(e){SQ_T(jv,'❌ 检查失败：'+String(e).slice(0,120)+'\\n请检查网络或点「测试延时」切换线路。');}\n}\nfunction SQ_uiFetchPub(jv){\n var pub=SQ_PUB(jv);if(!pub){SQ_T(jv,'⚠️ 请先在上方「网址发布页」输入框填写网址');return;}\n SQ_T(jv,'⏳ 正在从发布页获取网址路线：'+pub);\n try{\n  var h=SQ_AJAX(jv,pub,10000);\n  var ls=SQ_PARSE(h);\n  if(!ls.length){SQ_T(jv,'ℹ️ 书旗为官方固定域名，无独立网址发布页；未从该页解析到线路。\\n已保留内置 4 条官方线路，可直接点「测试延时」后切换。');return;}\n  SQ_SET(jv,'sqPubLines',ls.join('\\n'));\n  SQ_T(jv,'✅ 发布页解析完成，共 '+ls.length+' 条线路：\\n'+ls.slice(0,8).join('\\n')+'\\n（书源规则仍使用官方接口域名，线路仅用于 H5 榜单/目录）');\n }catch(e){SQ_T(jv,'❌ 发布页获取失败：'+String(e).slice(0,120)+'\\n内置线路仍可用。');}\n}\nfunction SQ_uiSpeed(jv){\n SQ_T(jv,'⏳ 开始逐站测速（2 条 H5 + 2 条 CDN，约 5~30 秒），请稍候…');\n var hs=SQ_HOSTS(),msg='📊 测速结果：',best='',bm=99999999,i;\n for(i=0;i<hs.length;i++){\n  var h=hs[i],isCdn=h.indexOf('c1.')>=0||h.indexOf('c2.')>=0;\n  var probe=isCdn?h+'/httpserver/filecache/get_book_content_34078_2180322_3111111111_0_0.html'\n                 :h+'/ranklist?rank=boyClick';\n  var t0=Date.now(),st='超时/不支持',ok=false,ms=0;\n  try{var r=SQ_AJAX(jv,probe,8000);ms=Date.now()-t0;\n   ok=isCdn?(r.indexOf('success_jsonpCallback')>=0&&r.indexOf('\\\\u3000')>=0)\n           :(r.length>5000&&r.indexOf('ranklist-ul')>=0&&r.indexOf('访问被拒绝')<0);\n   st=ok?ms+'ms':'内容异常/不支持';}catch(e){ms=Date.now()-t0;st='失败';}\n  SQ_SET(jv,SQ_KEY(h),st);\n  msg+='\\n'+(i+1)+'. ['+(isCdn?'CDN':'H5')+'] '+h.split('//')[1]+' → '+st;\n  if(ok&&!isCdn&&ms<bm){bm=ms;best=h;}\n }\n if(best){SQ_SET(jv,SQ_KEY(best),'⚡'+bm+'ms');SQ_SET(jv,'sqWeb',best);\n  msg+='\\n—— 最快 H5：'+best.split('//')[1]+' ('+bm+'ms)，已自动切换';}\n else msg+='\\n—— 无可用 H5 线路，保持原线路（加密接口搜索不受影响）';\n SQ_T(jv,msg);\n try{jv.reLoginView();}catch(e){try{jv.reUiView();}catch(e2){}}\n}\nfunction SQ_uiSetLine(jv,host){\n var isCdn=host.indexOf('c1.')>=0||host.indexOf('c2.')>=0;\n SQ_T(jv,'⏳ 正在切换'+(isCdn?' CDN 正文':' H5 站点')+'线路：'+host+' …');\n SQ_SET(jv,isCdn?'sqCdn':'sqWeb',host);\n var probe=isCdn?host+'/httpserver/filecache/get_book_content_34078_2180322_3111111111_0_0.html'\n                :host+'/ranklist?rank=boyClick';\n var t0=Date.now(),ok=false,ms=0;\n try{var r=SQ_AJAX(jv,probe,8000);ms=Date.now()-t0;\n  ok=isCdn?(r.indexOf('success_jsonpCallback')>=0&&r.indexOf('\\\\u3000')>=0)\n          :(r.length>5000&&r.indexOf('ranklist-ul')>=0&&r.indexOf('访问被拒绝')<0);}catch(e){}\n SQ_SET(jv,SQ_KEY(host),ok?ms+'ms':'不可用');\n SQ_T(jv,ok?('✅ 已切换'+(isCdn?' CDN 正文':' H5 站点')+'：'+host+'（'+ms+'ms）\\n'+(isCdn?'章节正文将优先走该 CDN；':'发现页/目录/详情将走该域；')+'加密接口不受影响。')\n           :('⚠️ 已写入：'+host+'\\n但该线路当前不可达，可点「测试延时」重新选线，或切回主站。'));\n try{jv.reLoginView();}catch(e){try{jv.reUiView();}catch(e2){}}\n}\nfunction SQ_uiShowWeb(jv){SQ_T(jv,'🌐 当前 H5 线路：'+SQ_GET(jv,'sqWeb')+'\\n📦 当前 CDN 线路：'+SQ_GET(jv,'sqCdn'));}\nfunction SQ_uiSetWeb(jv,host){SQ_uiSetLine(jv,host);}\nfunction SQ_uiResetDev(jv){\n SQ_T(jv,'⏳ 正在重置设备身份…');\n try{jv.put('sqDev','');SQ_T(jv,'✅ 设备身份已重置，下次请求将生成新游客设备（可解决偶发接口异常）。');}\n catch(e){SQ_T(jv,'❌ 重置失败：'+String(e).slice(0,100));}\n}\nfunction SQ_uiTokens(jv){return SQ_GET(jv,'sqPubLines');}\nfunction login(){return 'ok';}", "respondTime": 180000, "ruleBookInfo": {"author": "$.author", "coverUrl": "$.coverUrl", "init": "@js:\n(function(){return JSON.stringify(SQ_detail(java,source,String(baseUrl)));})()", "intro": "$.intro", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name", "tocUrl": "$.tocUrl", "wordCount": "$.wordCount"}, "ruleContent": {"content": "@js:\n(function(){return SQ_content(java,source,String(baseUrl));})()"}, "ruleExplore": {"author": "$.author", "bookList": "@js:\n(function(){var l=SQ_explore(java,source,String(baseUrl),1);var o=[],i;for(i=0;i<l.length;i++)o.push(JSON.stringify(l[i]));return o;})()", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "name": "$.name"}, "ruleSearch": {"author": "$.author", "bookList": "@js:\n(function(){var d='';try{d=(typeof result==='string')?result:String(result)}catch(e){};var l=SQ_searchBooks(d,source);var o=[],i;for(i=0;i<l.length;i++)o.push(JSON.stringify(l[i]));return o;})()", "bookUrl": "$.bookUrl", "checkKeyWord": "凡人修仙传", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name", "wordCount": "$.wordCount"}, "ruleToc": {"chapterList": "@js:\n(function(){var l=[];try{l=SQ_toc(java,source,String(baseUrl))}catch(e){return [];}var o=[],i;for(i=0;i<l.length;i++)o.push(JSON.stringify(l[i]));return o;})()", "chapterName": "$.title", "chapterUrl": "$.url"}, "searchUrl": "@js:\n(function(){var kw='';try{kw=String(key)}catch(e){var m=String(baseUrl).match(/[?&](?:q|key|kw)=([^&]*)/);if(m){try{kw=decodeURIComponent(m[1])}catch(e2){kw=m[1]}}};var pg=(typeof page!=='undefined'&&page)?Number(page):1;var last=0;try{last=Number(String(source.get('sqSearchTs')||'0'))||0}catch(e3){};var now=Date.now();var wait=3000-(now-last);if(wait>0&&wait<3000){var _done=false;try{java.sleep(wait);_done=true}catch(eS){};if(!_done){var _t=Date.now();while(Date.now()-_t<wait){}}}try{source.put('sqSearchTs',String(Date.now()))}catch(e4){};if(pg>1){return [];}return SQ_searchUrl(java,source,kw,pg);})()", "weight": 0},{"bookSourceComment": "永久地址：https://bqm.avds8.com/g/\nBy小新", "bookSourceGroup": "🔞,能用++++++", "bookSourceName": "优质粉嫩鲍", "bookSourceType": 0, "bookSourceUrl": "https://mbm.yzfnb9.life/yzfnb/cn/home/web/", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "[{\"title\":\"总排行榜\",\"url\":\"/cn/home/web/index.php/label/hot/page/{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"月排行榜\",\"url\":\"https://czy.yzfnb6.help/cn/home/web/index.php/label/hot_month/page/{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"周排行榜\",\"url\":\"/cn/home/web/index.php/label/hot_week/page/{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"日排行榜\",\"url\":\"/cn/home/web/index.php/label/hot_day/page/{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"最新上传\",\"url\":\"/cn/home/web/index.php/label/new/page/{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"熟母少妇\",\"url\":\"/cn/home/web/index.php/vod/type/id/20/page/{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"网红直播\",\"url\":\"/cn/home/web/index.php/vod/type/id/21/page/{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"自拍偷拍\",\"url\":\"/cn/home/web/index.php/vod/type/id/22/page/{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"强奸乱伦\",\"url\":\"/cn/home/web/index.php/vod/type/id/23/page/{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"高清国产\",\"url\":\"/cn/home/web/index.php/vod/type/id/24/page/{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"韩国专区\",\"url\":\"/cn/home/web/index.php/vod/type/id/25/page/{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"日本有码\",\"url\":\"/cn/home/web/index.php/vod/type/id/26/page/{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"日本无码\",\"url\":\"/cn/home/web/index.php/vod/type/id/27/page/{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"欧美情色\",\"url\":\"/cn/home/web/index.php/vod/type/id/28/page/{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"动漫卡通\",\"url\":\"/cn/home/web/index.php/vod/type/id/29/page/{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"三级伦理\",\"url\":\"/cn/home/web/index.php/vod/type/id/30/page/{{page}}.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n\n\n\n\n\n\n\n\n\n\n\n{\"title\":\"搜索\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},\n{\"title\":\"玩偶姐姐\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/玩偶姐姐.html\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},\n\n{\"title\":\"神宫\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/神宫\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"萝莉\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/萝莉\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"白木优子\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/白木优子\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"素股\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/素股\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"青空\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/青空\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"北野未奈\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/北野未奈\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"医院\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/医院\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"楪\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/楪\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"厕拍\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/厕拍\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"梦梦\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/梦梦\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"轮流\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/轮流\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"女装\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/女装\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"真实\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/真实\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"技师\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/技师\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"古装\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/古装\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"骚宝\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/骚宝\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"东北\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/东北\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"丈母娘\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/丈母娘\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"Hitomi\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/Hitomi\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"猫先生\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/猫先生\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"家庭\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/家庭\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"七森莉莉\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/七森莉莉\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"公交车\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/公交车\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"素人\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/素人\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"夏目\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/夏目\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"公公\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/公公\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"连裤袜\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/连裤袜\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"白洁\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/白洁\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"交换\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/交换\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"mimk\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/mimk\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"越南\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/越南\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"丝袜\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/丝袜\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"山手\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/山手\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"男男\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/男男\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"高中\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/高中\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"大学生\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/大学生\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"沈先生\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/沈先生\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"少女\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/少女\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"佐山爱\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/佐山爱\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"利哥\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/利哥\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"同事\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/同事\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"艳照门\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/艳照门\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"女神\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/女神\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"迪丽热巴\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/迪丽热巴\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"大乱交\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/大乱交\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"佐山\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/佐山\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"女教师\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/女教师\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"不穿\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/不穿\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"森泽\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/森泽\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"母亲\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/母亲\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"水野朝阳\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/水野朝阳\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"捅主任\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/捅主任\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"水果\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/水果\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"義母\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/義母\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"新村晶\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/新村晶\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"斗罗\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/斗罗\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"射精\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/射精\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"道具\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/道具\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"孕妇\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/孕妇\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"打屁股\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/打屁股\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"doci\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/doci\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"隔壁\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/隔壁\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"纹身\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/纹身\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"姐弟\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/姐弟\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"强奸\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/强奸\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"岬奈奈美\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/岬奈奈美\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"大嫂\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/大嫂\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"澡堂\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/澡堂\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"啄木鸟\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/啄木鸟\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"友田真希\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/友田真希\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"性感\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/性感\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"发现\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/发现\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"口爆\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/口爆\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"玉足\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/玉足\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"金主\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/金主\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"禽兽\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/禽兽\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"娇小\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/娇小\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"抄底\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/抄底\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"91\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/91\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"强迫\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/强迫\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"小萝莉\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/小萝莉\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"村上\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/村上\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"孕\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/孕\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"三宫\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/三宫\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"风韵\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/风韵\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"白峰美羽\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/白峰美羽\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"黑屌\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/黑屌\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"相泽\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/相泽\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"国产\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/国产\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"受不了\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/受不了\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"打飞机\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/打飞机\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"粉色情人\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/粉色情人\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"椎名空\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/椎名空\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"贫乳\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/贫乳\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"樱空\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/樱空\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"电击\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/电击\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"小学生\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/小学生\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"内射\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/内射\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"吴梦梦\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/吴梦梦\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"表情\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/表情\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"时间停止\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/时间停止\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"魔镜号\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/魔镜号\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"李宗瑞\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/李宗瑞\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"田优\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/田优\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"百合\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/百合\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"老太太\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/老太太\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"无码破解\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/无码破解\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"冲田\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/冲田\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"沈娜娜\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/沈娜娜\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"楓\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/楓\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"福利姬\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/福利姬\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"美乃雀\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/美乃雀\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"绿帽\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/绿帽\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"动漫\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/动漫\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"香港\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/香港\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"织田真子\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/织田真子\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"大长腿\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/大长腿\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"奴隶\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/奴隶\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"筱田优\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/筱田优\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"轮\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/轮\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"玲奈\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/玲奈\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"星宫一花\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/星宫一花\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"START\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/START\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"男技师\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/男技师\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"小马拉大车\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/小马拉大车\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"葵百合香\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/葵百合香\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"可爱\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/可爱\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"对话\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/对话\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"气质\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/气质\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"天海翼\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/天海翼\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"性教育\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/性教育\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"小松杏\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/小松杏\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"翼舞\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/翼舞\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"无毛\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/无毛\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"拳交\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/拳交\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"俄罗斯\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/俄罗斯\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"七海\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/七海\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"固定\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/固定\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"离异\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/离异\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"迷奸\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/迷奸\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"翔田千里\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/翔田千里\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"幼女\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/幼女\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"大叔\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/大叔\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"nana\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/nana\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"三级\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/三级\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"风间\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/风间\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"奶水\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/奶水\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"新人\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/新人\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"单男\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/单男\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"日本\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/日本\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"中文字幕\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/中文字幕\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"森日向子\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/森日向子\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"酒店\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/酒店\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"佐佐木明希\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/佐佐木明希\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"摩擦\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/摩擦\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"后宫\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/后宫\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"八木\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/八木\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"IPX\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/IPX\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"乳交\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/乳交\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"乳\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/乳\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"蒙眼\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/蒙眼\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"怀孕\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/怀孕\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"哺乳\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/哺乳\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"小姨子\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/小姨子\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"篠田\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/篠田\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"dass\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/dass\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"群\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/群\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"天使萌\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/天使萌\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"人妻\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/人妻\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"自慰\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/自慰\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"摄影师\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/摄影师\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"luxu\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/luxu\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"吉根\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/吉根\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"法国\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/法国\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"白眼\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/白眼\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"上羽\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/上羽\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"武藤\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/武藤\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"欧美\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/欧美\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"痉挛\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/痉挛\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"小宝\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/小宝\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"破解\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/破解\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"暴力\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/暴力\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"自拍\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/自拍\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"混剪\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/混剪\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"喷奶\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/喷奶\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"跳蛋\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/跳蛋\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"白丝\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/白丝\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"老外\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/老外\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"乱伦\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/乱伦\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"体育生\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/体育生\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"卡住\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/卡住\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"情侣\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/情侣\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"16岁\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/16岁\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"寸止\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/寸止\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"艾鲤\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/艾鲤\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"3穴\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/3穴\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"孩子\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/孩子\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"奶\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/奶\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"江波\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/江波\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"短发\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/短发\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"木下凛\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/木下凛\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"醉\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/醉\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"阿姨\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/阿姨\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"足疗\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/足疗\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"新妻优香\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/新妻优香\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"朋友\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/朋友\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"黑人\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/黑人\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"无套\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/无套\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"媚黑\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/媚黑\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"偷窥\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/偷窥\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"眼镜\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/眼镜\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"露点\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/露点\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"ipzz\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/ipzz\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"双马尾\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/双马尾\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"母女\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/母女\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"东京热\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/东京热\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"娜娜\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/娜娜\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"亨利\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/亨利\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"前列腺\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/前列腺\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"干妈\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/干妈\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"白袜\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/白袜\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"惩罚\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/惩罚\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"精油\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/精油\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"六十路\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/六十路\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"叶子\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/叶子\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"秘书\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/秘书\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"吞精\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/吞精\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"淫荡\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/淫荡\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"水卜\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/水卜\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"枫\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/枫\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"张芸熙\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/张芸熙\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"偷\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/偷\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"澤村\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/澤村\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"饼干\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/饼干\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"刺激\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/刺激\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"有菜\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/有菜\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"口交\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/口交\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"狗狗\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/狗狗\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"hmn\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/hmn\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"喷水\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/喷水\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"摄像头\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/摄像头\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"推川\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/推川\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"OL\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/OL\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"泰国\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/泰国\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"新有菜\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/新有菜\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"刘涛\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/刘涛\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"金瓶梅\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/金瓶梅\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"体检\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/体检\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"五十\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/五十\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"葵司\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/葵司\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"双插\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/双插\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"魔镜\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/魔镜\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"处女\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/处女\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"麻豆\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/麻豆\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"ssis\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/ssis\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"母子乱伦\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/母子乱伦\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"裸舞\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/裸舞\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"桥本香菜\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/桥本香菜\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"脚\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/脚\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"肛\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/肛\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"检查\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/检查\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"监控\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/监控\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"嫂\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/嫂\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"五十路\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/五十路\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"圣水\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/圣水\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"抖音风\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/抖音风\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"木下\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/木下\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"mom\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/mom\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"深田\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/深田\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"粉嫩\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/粉嫩\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"大神\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/大神\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"保健\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/保健\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"桃乃\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/桃乃\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"喝尿\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/喝尿\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"双穴\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/双穴\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"换妻\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/换妻\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"舞\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/舞\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"牛仔裤\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/牛仔裤\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"虐待\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/虐待\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"奸\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/奸\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"高中生\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/高中生\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"换脸\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/换脸\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"校园\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/校园\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"男模\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/男模\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"大屁股\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/大屁股\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"ure\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/ure\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"缅北\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/缅北\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"足\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/足\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"swag\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/swag\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"风韵犹存\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/风韵犹存\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"一字马\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/一字马\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"写真\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/写真\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"泽村\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/泽村\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"喉咙\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/喉咙\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"大屌\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/大屌\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"早泄\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/早泄\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"骚货\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/骚货\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"性奴\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/性奴\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"叶山\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/叶山\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"呆哥\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/呆哥\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"强暴\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/强暴\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"广场舞\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/广场舞\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"妹妹\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/妹妹\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"爱情故事\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/爱情故事\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"正太\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/正太\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"昭和\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/昭和\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"DOC\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/DOC\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"媚药\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/媚药\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"苏语棠\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/苏语棠\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"神宫寺\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/神宫寺\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"福建兄妹\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/福建兄妹\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"海角\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/海角\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"站街女\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/站街女\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"永井\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/永井\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"麻酥酥\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/麻酥酥\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"女厕\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/女厕\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"男同\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/男同\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"继父\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/继父\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"糖心\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/糖心\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"站街\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/站街\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"松下纱荣子\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/松下纱荣子\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"rbd\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/rbd\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"亲姐\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/亲姐\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"三上悠亚\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/三上悠亚\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"强\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/强\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"G奶\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/G奶\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"催眠\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/催眠\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"第一次\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/第一次\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"白虎\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/白虎\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"明日花\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/明日花\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"Juq\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/Juq\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"DVMM\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/DVMM\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"女同性恋\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/女同性恋\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"凪\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/凪\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"老师\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/老师\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"母乳\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/母乳\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"伟哥\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/伟哥\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"藤かんな\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/藤かんな\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"表姐\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/表姐\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"露出\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/露出\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"继母\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/继母\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"群交\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/群交\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"夏晴子\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/夏晴子\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"走光\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/走光\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"挑战\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/挑战\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"车震\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/车震\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"明星\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/明星\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"处男\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/处男\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"nsfs\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/nsfs\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"AI\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/AI\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"春药\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/春药\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"美少女\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/美少女\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"ju\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/ju\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"滝川\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/滝川\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"领导\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/领导\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"调教\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/调教\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"18岁\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/18岁\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"对白\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/对白\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"中出\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/中出\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"米菲兔\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/米菲兔\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"爆乳\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/爆乳\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"斗破苍穹\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/斗破苍穹\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"骚\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/骚\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"外围\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/外围\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"模特\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/模特\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"森泽佳奈\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/森泽佳奈\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"杏吧\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/杏吧\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"加勒比\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/加勒比\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"七天\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/七天\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"内裤\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/内裤\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"肛塞\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/肛塞\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"婚礼\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/婚礼\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"石原莉奈\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/石原莉奈\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"销售\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/销售\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"妻子\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/妻子\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"热舞\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/热舞\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"人兽\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/人兽\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"东凛\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/东凛\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"凪光\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/凪光\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"直男\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/直男\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"3p\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/3p\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"jk\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/jk\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"洗澡\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/洗澡\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"上司\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/上司\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"舔脚\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/舔脚\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"街射\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/街射\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"義父\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/義父\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"国模\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/国模\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"朝桐光\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/朝桐光\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"小鬼\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/小鬼\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"菊\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/菊\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"狗\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/狗\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"捷克\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/捷克\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"足浴\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/足浴\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"校花\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/校花\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"失禁\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/失禁\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"空姐\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/空姐\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"中文\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/中文\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"白石茉莉奈\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/白石茉莉奈\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"尿\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/尿\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"足拍\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/足拍\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"喉\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/喉\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"祖母\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/祖母\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"潜规则\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/潜规则\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"肛门\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/肛门\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"通野未帆\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/通野未帆\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"后入\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/后入\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"医生\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/医生\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"欲求不满\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/欲求不满\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"寝取\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/寝取\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"冲田杏梨\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/冲田杏梨\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"裸体\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/裸体\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"沟厕\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/沟厕\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"厕\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/厕\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"学校\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/学校\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"流出\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/流出\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"NHDT\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/NHDT\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"侵犯\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/侵犯\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"小野夕子\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/小野夕子\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"白上咲花\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/白上咲花\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"清纯\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/清纯\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"四级\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/四级\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"表妹\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/表妹\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"玩偶姐姐\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/玩偶姐姐\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"三浦惠理子\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/三浦惠理子\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"洛丽塔\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/洛丽塔\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"大秀\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/大秀\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"老公\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/老公\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"偷情\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/偷情\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"蹭\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/蹭\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"接吻\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/接吻\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"儿媳\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/儿媳\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"刘亦菲\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/刘亦菲\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"肉感\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/肉感\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"宿舍\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/宿舍\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"教学\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/教学\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"灌肠\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/灌肠\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"秀人\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/秀人\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"熟母\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/熟母\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"小孩\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/小孩\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"兽\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/兽\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"办公室\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/办公室\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"御姐\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/御姐\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"群p\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/群p\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"旁边\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/旁边\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"游戏\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/游戏\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"醉酒\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/醉酒\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"包养\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/包养\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"辻井\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/辻井\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"木村\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/木村\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"美脚\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/美脚\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"未成年\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/未成年\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"希咲\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/希咲\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"一般男女\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/一般男女\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"台湾\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/台湾\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"厕所偷拍\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/厕所偷拍\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"吉泽明步\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/吉泽明步\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"明里紬\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/明里紬\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"小女孩\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/小女孩\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"一本道\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/一本道\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"SDDE\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/SDDE\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"菊花\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/菊花\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"水川\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/水川\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"老头\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/老头\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"母狗\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/母狗\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"spa\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/spa\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"新村\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/新村\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"动物\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/动物\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"七森\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/七森\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"母娘\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/母娘\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"mism\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/mism\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"户外\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/户外\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"脱衣舞\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/脱衣舞\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"哭\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/哭\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"国产Ts\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/国产Ts\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"近距离\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/近距离\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"桃乃木\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/桃乃木\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"尾随\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/尾随\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"居家\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/居家\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"瘦猴\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/瘦猴\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"三浦\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/三浦\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"解说\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/解说\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"老妈\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/老妈\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"唾液\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/唾液\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"身材\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/身材\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"精神\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/精神\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"石川\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/石川\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"老板\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/老板\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"meyd\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/meyd\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"同人\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/同人\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"黑鬼\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/黑鬼\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"绿奴\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/绿奴\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"嫩\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/嫩\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"巨乳\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/巨乳\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"KTV\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/KTV\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"夫妻\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/夫妻\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"小马\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/小马\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"河北彩花\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/河北彩花\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"明里\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/明里\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"SDMM\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/SDMM\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"cos\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/cos\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"战争\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/战争\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"波多野结衣\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/波多野结衣\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"女王\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/女王\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"樱井\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/樱井\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"SONE\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/SONE\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"按摩店\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/按摩店\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"街头\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/街头\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"长腿\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/长腿\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"真空\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/真空\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"肌肉\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/肌肉\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"艾熙\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/艾熙\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"女仆\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/女仆\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"酒吧\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/酒吧\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"君岛\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/君岛\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"上位\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/上位\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"野战\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/野战\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"泡良\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/泡良\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"变性\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/变性\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"松本一香\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/松本一香\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"AIKa\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/AIKa\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"垃圾\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/垃圾\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"无码\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/无码\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"世界第一\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/世界第一\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"黑客\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/黑客\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"北野\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/北野\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"结婚\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/结婚\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"二零\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/二零\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"健身\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/健身\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"叶爱\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/叶爱\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"波多\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/波多\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"神木丽\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/神木丽\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"制服\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/制服\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"藤森\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/藤森\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"miru\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/miru\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"李蓉蓉\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/李蓉蓉\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"外卖\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/外卖\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"福建\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/福建\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"火影\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/火影\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"大桥未久\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/大桥未久\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"继妹\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/继妹\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"内衣\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/内衣\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"按摩\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/按摩\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"邻居\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/邻居\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"老婆\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/老婆\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"未亡人\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/未亡人\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"桥本有菜\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/桥本有菜\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"神木\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/神木\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"白嫩\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/白嫩\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"松本\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/松本\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"fc\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/fc\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"约\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/约\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"鬼父\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/鬼父\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"翔田\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/翔田\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"义父\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/义父\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"水野\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/水野\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"北条\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/北条\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"高颜值\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/高颜值\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"护士\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/护士\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"腹肌\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/腹肌\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"女友\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/女友\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"rion\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/rion\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"jul\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/jul\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"姐姐\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/姐姐\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"爱弓凉\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/爱弓凉\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"电车\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/电车\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"乌克兰\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/乌克兰\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"农村\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/农村\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"诱惑\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/诱惑\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"2穴\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/2穴\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"无防备\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/无防备\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"姐妹\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/姐妹\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"颜值\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/颜值\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"厕所\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/厕所\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"河北\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/河北\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"asmr\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/asmr\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"第一视角\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/第一视角\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"猎奇\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/猎奇\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"新妻\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/新妻\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"剧情\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/剧情\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"下海\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/下海\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"4p\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/4p\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"家庭摄像头\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/家庭摄像头\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"三穴\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/三穴\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"女上司\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/女上司\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"丝\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/丝\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"六十\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/六十\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"极品\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/极品\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"李雅\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/李雅\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"丈夫\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/丈夫\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"天海\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/天海\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"搭讪\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/搭讪\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"fc2\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/fc2\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"毒龙\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/毒龙\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"臀\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/臀\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"三宫椿\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/三宫椿\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"佐佐木\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/佐佐木\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"叫声\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/叫声\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"初中\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/初中\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"嫂子\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/嫂子\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"下药\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/下药\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"椎名由奈\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/椎名由奈\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"熟睡\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/熟睡\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"sm\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/sm\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"婆婆\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/婆婆\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"小早川\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/小早川\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"贷\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/贷\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"高清无码\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/高清无码\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"女性向\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/女性向\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"桥本\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/桥本\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"强推\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/强推\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"3d\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/3d\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"春菜\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/春菜\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"虐\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/虐\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"后妈\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/后妈\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"石川澪\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/石川澪\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"山口珠理\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/山口珠理\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"乳汁\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/乳汁\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"水野优香\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/水野优香\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"星宫\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/星宫\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"霸凌\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/霸凌\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"蜜桃臀\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/蜜桃臀\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"饼干姐姐\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/饼干姐姐\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"美女\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/美女\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"原神\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/原神\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"超乳\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/超乳\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"妈妈\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/妈妈\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"木下凛凛子\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/木下凛凛子\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"父女乱伦\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/父女乱伦\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"约炮\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/约炮\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"抖音\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/抖音\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"痴女\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/痴女\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"高潮\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/高潮\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"田中\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/田中\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"二零二五\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/二零二五\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"河北彩\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/河北彩\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"肥臀\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/肥臀\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"人狗\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/人狗\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"微胖\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/微胖\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"同学\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/同学\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"叶山小百合\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/叶山小百合\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"冢本\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/冢本\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"着衣\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/着衣\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"兄弟\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/兄弟\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"胖\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/胖\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"聊天记录\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/聊天记录\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"社长\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/社长\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"大奶\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/大奶\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"美乳\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/美乳\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"睡\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/睡\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"打桩\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/打桩\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"学生妹\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/学生妹\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"潮喷\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/潮喷\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"母\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/母\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"武藤彩香\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/武藤彩香\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"爱弓\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/爱弓\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"村长\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/村长\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"本田岬\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/本田岬\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"吃瓜\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/吃瓜\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"日向\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/日向\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"主播\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/主播\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"妈\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/妈\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"夏目彩春\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/夏目彩春\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"睡着\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/睡着\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"女奴\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/女奴\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"唐伯虎\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/唐伯虎\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"学妹\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/学妹\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"RCT\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/RCT\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"假屌\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/假屌\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"搜查官\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/搜查官\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"幼\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/幼\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"肛交\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/肛交\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"裸贷\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/裸贷\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"颤抖\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/颤抖\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"夜店\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/夜店\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"美乃\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/美乃\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"杨幂\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/杨幂\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"瘦子\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/瘦子\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"白木\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/白木\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"上海\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/上海\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"骑乘\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/骑乘\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"野外\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/野外\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"娃娃\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/娃娃\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"面前\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/面前\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"半推半就\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/半推半就\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"妻\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/妻\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"痴汉\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/痴汉\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"跳舞\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/跳舞\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"桃乃木香奈\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/桃乃木香奈\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"网红\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/网红\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"塚本\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/塚本\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"水卜樱\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/水卜樱\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"新婚\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/新婚\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"兄妹\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/兄妹\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"温泉\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/温泉\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"紧身\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/紧身\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"新娘\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/新娘\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"反差\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/反差\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"凌辱\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/凌辱\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"阿朱\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/阿朱\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"蒂法\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/蒂法\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"魅魔\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/魅魔\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"藤环奈\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/藤环奈\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"轮奸\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/轮奸\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"药\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/药\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"麻豆传媒\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/麻豆传媒\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"白上\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/白上\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"屁眼\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/屁眼\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"父女\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/父女\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"中年\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/中年\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"地铁\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/地铁\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"0930\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/0930\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"大槻响\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/大槻响\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"经典\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/经典\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"巨屌\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/巨屌\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"子宫\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/子宫\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"情趣\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/情趣\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"嫖娼\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/嫖娼\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"字幕\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/字幕\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"老熟女\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/老熟女\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"美谷朱里\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/美谷朱里\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"深喉\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/深喉\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"体育\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/体育\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"三上\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/三上\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"洗浴\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/洗浴\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"Rctd\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/Rctd\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"老女人\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/老女人\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"nhdta\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/nhdta\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"爆菊\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/爆菊\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"人妖\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/人妖\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"大爷\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/大爷\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"飞机\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/飞机\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"综艺\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/综艺\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"代孕\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/代孕\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"无码流出\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/无码流出\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"勾搭\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/勾搭\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"古东\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/古东\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"老逼\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/老逼\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"时间\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/时间\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"泄密\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/泄密\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"黑川\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/黑川\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"叫床\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/叫床\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"熟女\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/熟女\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"摄影\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/摄影\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"女团\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/女团\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"樱空桃\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/樱空桃\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"山岸逢花\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/山岸逢花\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"小宵\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/小宵\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"城中村\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/城中村\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"00后\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/00后\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"闺蜜\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/闺蜜\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"尻\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/尻\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"露脸\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/露脸\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"合集\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/合集\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"重口味\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/重口味\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"养生\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/养生\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"老阿姨\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/老阿姨\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"教师\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/教师\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"呕吐\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/呕吐\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"波多野\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/波多野\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"家政\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/家政\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"伪娘\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/伪娘\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"禁欲\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/禁欲\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"黑\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/黑\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"橘玛丽\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/橘玛丽\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"大学\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/大学\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"女女\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/女女\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"触手\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/触手\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"近亲\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/近亲\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"藤浦惠\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/藤浦惠\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"淫语\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/淫语\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"喉奥\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/喉奥\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"大胸\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/大胸\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"jur\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/jur\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"偷拍\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/偷拍\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"女儿\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/女儿\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"金先生\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/金先生\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"蜜美杏\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/蜜美杏\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"尿尿\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/尿尿\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"裸聊\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/裸聊\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"婚纱\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/婚纱\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"出轨\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/出轨\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"浴室\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/浴室\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"苏畅\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/苏畅\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"车模\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/车模\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"相泽南\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/相泽南\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"快手\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/快手\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"FAX\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/FAX\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"八蜜凛\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/八蜜凛\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"停止\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/停止\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"唯美\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/唯美\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"乳首\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/乳首\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"八蜜\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/八蜜\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"传媒\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/传媒\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"口\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/口\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"妃光\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/妃光\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"女上位\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/女上位\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"马眼\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/马眼\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"炮机\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/炮机\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"松下\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/松下\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"森沢\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/森沢\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"韩国\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/韩国\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"耳光\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/耳光\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"沈樵\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/沈樵\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"黄金\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/黄金\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"希岛\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/希岛\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"舔逼\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/舔逼\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"pmv\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/pmv\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"斗破\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/斗破\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"枫可怜\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/枫可怜\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"蹭蹭\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/蹭蹭\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"义母\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/义母\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"富婆\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/富婆\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"高清\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/高清\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"厨房\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/厨房\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"大妈\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/大妈\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"肉便器\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/肉便器\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"中学生\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/中学生\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"哺乳期\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/哺乳期\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"三浦步美\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/三浦步美\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"深田咏美\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/深田咏美\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"变态\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/变态\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"推油少年\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/推油少年\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"浅野\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/浅野\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"外婆\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/外婆\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"多人\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/多人\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"艳母\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/艳母\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"留学生\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/留学生\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"息子\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/息子\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"中学\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/中学\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"巨根\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/巨根\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"竹内\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/竹内\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"森日\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/森日\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"roe\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/roe\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"家教\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/家教\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"捡尸\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/捡尸\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"绿\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/绿\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"校服\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/校服\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"初中生\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/初中生\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"父\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/父\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"打电话\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/打电话\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"ntr\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/ntr\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"少妇\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/少妇\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"双洞\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/双洞\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"水果派\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/水果派\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"老板娘\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/老板娘\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"青空光\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/青空光\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"偷看\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/偷看\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"白嫖\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/白嫖\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"男奴\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/男奴\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"ts\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/ts\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"反抗\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/反抗\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"宫下\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/宫下\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"出差\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/出差\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"破处\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/破处\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"潮吹\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/潮吹\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"ADN\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/ADN\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"喷\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/喷\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"瑜伽裤\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/瑜伽裤\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"侄女\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/侄女\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"凉森\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/凉森\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"pred\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/pred\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"裤袜\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/裤袜\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"尤物\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/尤物\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"silk\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/silk\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"舅妈\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/舅妈\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"精神小妹\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/精神小妹\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"大槻\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/大槻\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"男娘\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/男娘\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"白浆\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/白浆\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"印度\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/印度\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"北条麻妃\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/北条麻妃\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"狐不妖\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/狐不妖\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"水端\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/水端\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"馒头\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/馒头\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"巨臀\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/巨臀\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"夕季\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/夕季\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"Julia\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/Julia\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"教室\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/教室\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"拘束\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/拘束\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"黒人\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/黒人\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"特写\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/特写\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"VR\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/VR\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"派对\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/派对\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"叫爸爸\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/叫爸爸\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"洗脑\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/洗脑\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"奶奶\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/奶奶\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"辛尤里\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/辛尤里\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"高三\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/高三\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"猜\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/猜\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"强上\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/强上\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"立花\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/立花\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"一线天\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/一线天\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"拷问\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/拷问\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"丰满\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/丰满\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"美腿\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/美腿\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"良家\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/良家\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"淫妻\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/淫妻\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"小姨\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/小姨\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"吊钟\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/吊钟\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"乱交\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/乱交\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"电话\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/电话\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"榨精\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/榨精\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"重口\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/重口\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"透明\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/透明\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"骚话\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/骚话\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"坦克\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/坦克\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"旗袍\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/旗袍\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"叔母\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/叔母\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"向井蓝\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/向井蓝\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"黑丝\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/黑丝\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"筱田\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/筱田\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"君岛美绪\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/君岛美绪\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"舔\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/舔\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"裸体模特\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/裸体模特\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"敏感\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/敏感\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"推油\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/推油\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"爸爸\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/爸爸\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"帅哥\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/帅哥\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"乡下\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/乡下\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"酒店偷拍\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/酒店偷拍\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"女技师\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/女技师\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"孟若羽\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/孟若羽\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"舌吻\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/舌吻\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"强制\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/强制\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"猥亵\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/猥亵\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"喂奶\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/喂奶\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"靴\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/靴\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"学生\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/学生\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"枫花恋\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/枫花恋\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"灌醉\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/灌醉\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"儿子\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/儿子\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"瑜伽\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/瑜伽\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"乳头\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/乳头\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"女同\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/女同\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"m男\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/m男\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"美国\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/美国\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"抽搐\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/抽搐\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"本庄\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/本庄\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"hunt\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/hunt\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"屎\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/屎\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"偷偷\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/偷偷\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"苍井空\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/苍井空\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"白峰\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/白峰\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"强行\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/强行\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"黑虎\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/黑虎\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"风间由美\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/风间由美\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"熟\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/熟\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"刘玥\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/刘玥\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"睡眠\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/睡眠\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"老人\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/老人\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"直播\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/直播\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"巨尻\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/巨尻\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"精液\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/精液\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"pUA\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/pUA\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"岳母\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/岳母\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"拳\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/拳\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"奴\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/奴\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"汉服\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/汉服\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"背德\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/背德\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"HOKS\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/HOKS\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"屁股\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/屁股\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"柚子猫\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/柚子猫\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"家族\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/家族\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"饥渴\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/饥渴\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"人与动物\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/人与动物\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"会所\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/会所\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"足交\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/足交\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"喝酒\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/喝酒\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"捆绑\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/捆绑\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"小早川怜子\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/小早川怜子\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"宫下玲奈\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/宫下玲奈\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"同性\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/同性\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"颜射\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/颜射\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"勾引\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/勾引\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"高跟\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/高跟\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"希岛爱理\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/希岛爱理\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"舞蹈\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/舞蹈\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"节目\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/节目\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"一色桃子\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/一色桃子\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"aldn\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/aldn\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"真实乱伦\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/真实乱伦\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"私拍\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/私拍\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"市来美保\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/市来美保\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"肉丝\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/肉丝\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"教练\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/教练\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\" 水卜\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/ 水卜\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"聚会\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/聚会\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"女婿\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/女婿\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"椎名\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/椎名\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"探花\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/探花\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"推特\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/推特\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"喝醉\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/喝醉\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"双飞\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/双飞\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"熟妇\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/熟妇\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"高跟鞋\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/高跟鞋\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"女朋友\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/女朋友\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"母子\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/母子\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"妃光莉\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/妃光莉\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}},{\"title\":\"扩阴\",\"url\":\"/cn/home/web/index.php/vod/search/page/{{page}}/wd/扩阴\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.2}}\n\n\n\n\n\n]\n\n", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 11; PCAM10 Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4103.106 Mobile Safari/537.36\"} ", "lastUpdateTime": "1793794858008", "respondTime": 180000, "ruleBookInfo": [], "ruleContent": {"content": "[class=\"videoplay_wrap\"]@all\n<js>\nconst startIndex = result.indexOf('url');\nconst endIndex = result.indexOf('\"',startIndex+12);\nconst url = result.slice(startIndex+6, endIndex).replaceAll(\"\\\\\",\"\");\njava.log(url)\njava.startBrowser(url,chapter.title)\njava.toast('正在加载视频\\n视频加载较慢，请耐心等待')\n' 【刷新正文】或【点击章节链接】跳转播放\\n不要相信且不要点击视频里的任何广告，误触后请立即返回\\n🔗直链:\\n'+url\n</js>"}, "ruleExplore": {"bookList": "[class=\"H5__content\"]@[class=\"video__wrap\"]@a", "bookUrl": "a@href", "coverUrl": "img@src", "kind": "p.-1@text\n", "name": "h3.-1@text@put:{t:@@h3.-1@text}"}, "ruleSearch": {"bookList": "[class=\"H5__content\"]@[class=\"video__wrap\"]@a", "bookUrl": "@href", "checkKeyWord": "玩偶姐姐", "coverUrl": "imd@src", "kind": "p.-1@text\n", "name": "h3.-1@text@put:{t:@@h3.-1@text}"}, "ruleToc": {"chapterList": "@js:[1]", "chapterName": "@get:{t}"}, "searchUrl": "https://mbm.yzfnb9.life/cn/home/web/index.php/vod/search/page/{{page}}/wd/{{key}}.html", "weight": 0},{"bookSourceName": "搬山人小说网", "bookSourceUrl": "https://www.banshanren.com", "bookSourceType": 0, "bookSourceGroup": "成人", "bookSourceComment": "阅读3.25。搜索、详情、目录、正文均基于真实页面结构验证。封面使用data-src。正文存在“ 0”噪声，已用replaceRegex清理。未在阅读App内实测完整导入与渲染。", "enabled": true, "enabledExplore": true, "enabledCookieJar": false, "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\"\n}", "searchUrl": "https://www.banshanren.com/search/index?keyword={{key}}", "exploreUrl": "[{\"title\":\"全部小说\",\"url\":\"/all/0-0-0-0-0-0-1-1/\"},{\"title\":\"排行榜\",\"url\":\"/rank\"}]", "ruleSearch": {"bookList": "li.novel_li", "name": "a.title@text", "author": "div.info_box@text", "coverUrl": "a.cover_box img@data-src", "bookUrl": "a.title@href", "intro": "text"}, "ruleBookInfo": {"name": "h1@text", "author": "script[type=\"application/ld+json\"]@js:\ntry {\n  var data = JSON.parse(result);\n  data.author && data.author.name ? data.author.name : '';\n} catch(e) { '' }", "coverUrl": "img.encrypted-image@data-src||img[data-src*=cover]@data-src", "intro": ".novel_summary_box@text||text", "lastChapter": ".catalog_top_box .hl@text||text.最新章节", "canReName": true}, "ruleToc": {"chapterList": ".chapter_list a[href*=/novel/]", "chapterName": "text", "chapterUrl": "href"}, "ruleContent": {"content": ".chapter_content_box@textNodes||.chapter_box@textNodes", "replaceRegex": "##\\s*0\\s*|游客|加入书架|催更|举报|显示更多|阅读全文|Copyright.*?2025"}, "ruleExplore": {"bookList": "li.novel_li", "name": "a.title@text", "author": "div.info_box@text", "coverUrl": "a.cover_box img@data-src", "bookUrl": "a.title@href"}, "lastUpdateTime": "1793773406188"},{"bookSourceName": "思兔小说-台湾小说网(twkan.cc)", "bookSourceGroup": "小说", "bookSourceUrl": "https://www.twkan.cc", "bookSourceType": 0, "bookSourceComment": "twkan.cc 台灣小說網。站点位于 Cloudflare 之后，若某次抓取返回验证码/空结果，属站点风控，稍后重试即可。", "customOrder": 100, "enabled": true, "enabledExplore": true, "lastUpdateTime": "1793773284013", "loginUrl": "", "respondTime": 0, "weight": 0, "serialNumber": 0, "exploreUrl": "https://www.twkan.cc/ranking.html", "searchUrl": "https://www.twkan.cc/search/{{key}}.html", "header": {"User-Agent": "Mozilla/5.0 (Linux; Android 13; SM-S918B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.9"}, "ruleSearch": {"bookList": "div.bookbox", "name": "h2.bookname a@text", "author": "div.bookinfo div.author:eq(0)@text@js:result.replace(/^作者[:：]\\s*/,'').trim()", "intro": "div.update@text@js:result.replace(/^簡介[:：]\\s*/,'').trim()", "bookUrl": "h2.bookname a@href", "lastChapter": "div.cat a@text"}, "ruleBookInfo": {"name": "h1.booktitle@text", "author": "p.booktag a.red@text", "coverUrl": "div.bookcover img@src", "intro": "p.bookintro@text@js:result.replace(/\\s*《[^》]*》是作家.*$/,'').trim()", "kind": "p.booktag a.blue:eq(0)@text", "lastChapter": "a.bookchapter@text", "tocUrl": "@js:(function(){var u=baseUrl||'';return u.replace(/\\/book\\//,'/chapter/');})()"}, "ruleToc": {"list": "#allchapter dd", "chapterName": "a@text", "chapterUrl": "a@href", "nextTocUrl": "@js:(function(){var u=baseUrl||'',m=u.match(/chapter\\/([A-Za-z0-9]+)(?:\\/(\\d+))?\\.html/);if(!m)return '';var b='https://www.twkan.cc/chapter/'+m[1];var p=m[2]?parseInt(m[2])+1:2;return b+'/'+p+'.html';})()"}, "ruleContent": {"content": "#content@js:(function(){var ps=result.select('p');var arr=[];for(var i=0;i<ps.size();i++){var t=ps.get(i).text().trim();if(t&&t!=='()'){arr.push(t);}}return arr.join('\\n');})()"}, "ruleExplore": {"bookList": "div.bookbox", "name": "h2.bookname a@text", "author": "div.bookinfo div.author:eq(0)@text@js:result.replace(/^作者[:：]\\s*/,'').trim()", "intro": "div.update@text@js:result.replace(/^簡介[:：]\\s*/,'').trim()", "bookUrl": "h2.bookname a@href", "lastChapter": "div.cat a@text"}},{"bookSourceName": "龙腾小说网", "bookSourceUrl": "https://www.10000api.net", "bookSourceType": 0, "bookSourceGroup": "小说", "bookSourceComment": "阅读3.25。搜索为POST。详情页/xiaoshuo/{id}/，章节/book/{id}/{cid}.html。正文页强制要求手机浏览器，桌面环境内容常加载失败。未在App内完整测试。", "enabled": true, "enabledExplore": true, "enabledCookieJar": false, "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1\"\n}", "searchUrl": "https://www.10000api.net/search,{\n  \"method\": \"POST\",\n  \"body\": \"searchkey={{key}}\",\n  \"headers\": {\n    \"Content-Type\": \"application/x-www-form-urlencoded\"\n  }\n}", "ruleSearch": {"bookList": "div.bookbox, .book-item, .list-item, a[href*=/xiaoshuo/]", "name": "h3@text||a@text||text", "author": "text.作者||.author@text||text", "coverUrl": "img@src", "bookUrl": "a[href*=/xiaoshuo/]@href||href", "intro": "p@text||.intro@text||text"}, "ruleBookInfo": {"name": "h1@text", "author": "a[href*=/zuozhe/]@text||text", "coverUrl": "img@src", "intro": "text.小说简介：||.intro@text||text", "lastChapter": "a[href*=/book/]@text||text.最新章节", "tocUrl": ""}, "ruleToc": {"chapterList": "a[href*=/book/]", "chapterName": "text", "chapterUrl": "href"}, "ruleContent": {"content": "#content@textNodes||.content@textNodes||#chaptercontent@textNodes||body@textNodes", "replaceRegex": "##小可爱提示您[\\s\\S]*?更方便。|更多内容加载中[\\s\\S]*?阅读！|温馨提示[\\s\\S]*?阅读。|本站只支持手机浏览器[\\s\\S]*?阅读！|《.*?》所有内容均来自[\\s\\S]*?最新章节。"}, "ruleExplore": {"bookList": "a[href*=/xiaoshuo/]", "name": "text", "bookUrl": "href"}, "lastUpdateTime": "1793773333179"},{"bookSourceComment": "聚合站点会一直更新其他的优质平台站点！官方的地址：https://moyue.app 本站唯一Telegram群组：https://t.me/moyuexiaoshuo\n\n本站聚合番茄，七猫，书旗，起点，qq阅读，顶点，小说，漫画，听书，短剧！全方位站点", "bookSourceGroup": "限免书源", "bookSourceName": "📖限免书源", "bookSourceType": 0, "bookSourceUrl": "限免书源", "customButton": false, "customOrder": 3, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>\ntry{\nvar cfg = SRCFG(source);\nvar modes = ['小说','听书','漫画','短剧'];\nvar tab = cfg.mode || '小说';\nif(modes.indexOf(tab) < 0){ tab = '小说'; }\nvar srcList = {};\ntry{ srcList = JSON.parse(String(java.ajax(host + '/legado/sources'))); }catch(e){}\nvar plats = SRCLIST(srcList, tab);\nvar out = [];\nout.push(SRFLT('模式', modes, tab, '模式', 1));\nout.push(SRFLT('平台', plats, cfg.platform, '平台', 1));\nif(tab == '小说'){\n  out.push(SRFLT('频道', ['男频','女频'], cfg.gender, '频道', 1));\n}\nvar plat = (cfg.platform=='' || cfg.platform=='全部' || plats.indexOf(cfg.platform)<0) ? '番茄' : PLATNAME(cfg.platform);\nvar gd = (cfg.gender == '女频') ? 2 : 1;\nvar menuUrl = host + '/legado/explore/menu?tab=' + encodeURIComponent(tab) + '&source=' + encodeURIComponent(plat) + '&gender=' + encodeURIComponent(cfg.gender);\nvar menuLoaded = false;\ntry{\n  var menu = JSON.parse(String(java.ajax(menuUrl)));\n  if(Array.isArray(menu) && menu.length > 0){\n    out = out.concat(menu);\n    menuLoaded = true;\n    try{\n      var sv = {};\n      try{ sv = JSON.parse(source.getVariable() || '{}'); }catch(e){}\n      sv._exploreCache = JSON.stringify(menu);\n      source.setVariable(JSON.stringify(sv));\n    }catch(e){}\n  }\n}catch(e){}\nif(!menuLoaded){\n  var cached = '';\n  try{\n    var sv = JSON.parse(source.getVariable() || '{}');\n    cached = sv._exploreCache || '';\n  }catch(e){}\n  if(cached){\n    try{\n      var cm = JSON.parse(cached);\n      if(Array.isArray(cm) && cm.length > 0){\n        out = out.concat(cm);\n        menuLoaded = true;\n      }\n    }catch(e){}\n  }\n}\nif(!menuLoaded){\n  var bt = encodeURIComponent(tab);\n  var bp = encodeURIComponent(plat);\n  var ranks = ['推荐榜','完本榜','热门榜','新书榜'];\n  for(var ri=0; ri<ranks.length; ri++){\n    out.push({title:ranks[ri], url:host+'/legado/explore/data?source='+bp+'&tab='+bt+'&bdtype='+encodeURIComponent(ranks[ri])+'&gender='+gd+'&is_ranking=1&page={{page}}', style:{layout_flexGrow:1, layout_flexBasisPercent:0.25}});\n  }\n}\nJSON.stringify(out);\n}catch(e){\n  JSON.stringify([{title:'发现页加载失败，下拉刷新重试', url:'', style:{layout_flexGrow:1, layout_flexBasisPercent:1}}]);\n}\n</js>", "header": "@js:try{var v={};try{v=JSON.parse(source.getVariable()||'{}')||{};}catch(e0){v={};}var d='';try{d=String(java.deviceID()||'').trim();}catch(e1){}if(!d){try{d=String(java.androidId()||'').trim();}catch(e2){}}if(!d&&v.did){d=String(v.did);}if(!d){d='did-'+Math.random().toString(36).slice(2)+Date.now().toString(36);}if(String(v.did||'')!==d){try{v.did=d;source.setVariable(JSON.stringify(v));}catch(e3){}}var h={'User-Agent':'Legado/3.0','X-Device-ID':'yd-'+d};if(v.token){h['Authorization']='Bearer '+v.token;}JSON.stringify(h);}catch(e){JSON.stringify({'User-Agent':'Legado/3.0'});}", "jsLib": "\nvar host = 'https://moyue.app';\n\nfunction J(r){ if(typeof r==='string'){ try{return JSON.parse(r);}catch(e){ return {}; } } return r||{}; }\nfunction detailUrlOf(bu){ return host+'/legado/detail?url='+encodeURIComponent(bu); }\nfunction tocUrlOf(bu){ return host+'/legado/toc?url='+encodeURIComponent(bu); }\n\nfunction contentUrlOf(cu){ return host+'/legado/content?url='+encodeURIComponent(cu)+'&fmt=legado'; }\nfunction PLATNAME(p){ return String(p||'').replace(/\\(VIP\\)$/,''); }\n\n\n\nfunction SRCLIST(j, tab){\n  var out=['全部'];\n  try{\n    var a=(j&&j[tab])||[];\n    for(var i=0;i<a.length;i++){ out.push(a[i].n + (a[i].v ? '(VIP)' : '')); }\n  }catch(e){}\n  if(out.length<2){ out.push('番茄'); }\n  return out;\n}\nfunction SRCFG(src){\n  var v={};\n  try{ v=JSON.parse(src.getVariable()||'{}')||{}; }catch(e){ v={}; }\n  var m=null;\n  try{ m=src.getLoginInfoMap(); }catch(e){ m=null; }\n  function pick(k,d){\n    if(v[k]){ return String(v[k]); }\n    if(m){ try{ var x=m.get(k); if(x){ return String(x); } }catch(e){} }\n    return d;\n  }\n  var h=String(v.host||'').trim();\n  if(!h && m){ try{ var lh=m.get('线路'); if(lh){ h=String(lh); } }catch(e){} }\n  if(!h){ h=host; }\n  if(h.indexOf('http')!=0){ h='http://'+h; }\n  return { host:h, gender:pick('频道','男频'), platform:pick('平台','全部'), mode:pick('模式','小说') };\n}\nfunction SRSHOW(m, t){\n  var j=this.java, s=this.source;\n  var data={};\n  try{ data=JSON.parse(s.getVariable()||'{}')||{}; }catch(e){ data={}; }\n  data[t]=m;\n  s.setVariable(JSON.stringify(data));\n  j.refreshExplore();\n}\nfunction SRFLT(title, chars, def, key, size){\n  return { title:title, type:'select', chars:chars, default:def,\n    action:\"SRSHOW(infoMap['\"+title+\"'],'\"+key+\"')\",\n    style:{layout_flexGrow:1, layout_flexBasisPercent:size} };\n}\nfunction SRHDR(title){\n  return { title:title, url:'', style:{layout_flexGrow:1, layout_flexBasisPercent:1} };\n}\n\n\n\n\n\n\nfunction probe() {\n    var java = this.java;\n    var source = this.source;\n\n    try {\n        if (typeof java.showReadingBrowser == 'function') {\n            return \"ios\";\n        }\n    } catch (e) {}\n\n    try {\n        if (typeof java.reLoginView == 'function') {\n            return \"panel\";\n        }\n        new Packages.io.legado.kazusa.utils.TimeoutCancellationException('');\n        return \"panel\";\n    } catch (e) {}\n\n    try {\n        if (typeof source.loginUi == 'function') {\n            return \"browser\";\n        }\n    } catch (e) {}\n\n    return \"panel\";\n}\n\nfunction openReview(url, sources, ident) {\n    var java = this.java;\n    if (ident == null) ident = '段评';\n    var rt = this.probe();\n    if (rt == \"panel\") {\n        var htmlContent = '';\n        try {\n            htmlContent = java.ajax(url);\n        } catch (e) {}\n        try {\n        java.showBrowser(\n            url,\n            htmlContent,\n            'window.java=java;',\n            JSON.stringify({\n                \"expandedCornersRadius\": 20,\n                \"dismissOnTouchOutside\": true,\n                \"isDraggable\": true,\n                \"shouldDimBackground\": true,\n                \"backgroundDimAmount\": 0.5,\n                \"hardwareAccelerated\": true,\n                \"isNestedScrollingEnabled\": true,\n                \"isGestureInsetBottomIgnored\": true,\n                \"setFitToContents\": true,\n                \"isHideable\": true,\n                \"heightPercentage\": 0.8\n            })\n        );\n        } catch (e) {\n            java.startBrowser(url, sources + ident);\n        }\n    } else {\n        try { java.showReadingBrowser(url, sources + ident); return; } catch (e) {}\n        java.startBrowser(url, sources + ident);\n    }\n}\n\nfunction godOpen(u, t) { try { java.showReadingBrowser(u, t); return; } catch (e) {} try { java.startBrowser(u, t); } catch (e) {} }\n\nfunction GETDID(){\n  var did='';\n  try{ did=String(java.deviceID()||'').trim(); }catch(e){}\n  if(!did){ try{ did=String(java.androidId()||'').trim(); }catch(e){} }\n  if(did){\n    try{ var v=JSON.parse(source.getVariable()||'{}')||{}; if(String(v.did||'')!==did){ v.did=did; source.setVariable(JSON.stringify(v)); } }catch(e){}\n    return 'yd-'+did;\n  }\n  var v={};\n  try{ v=JSON.parse(source.getVariable()||'{}')||{}; }catch(e){ v={}; }\n  if(v.did){ return 'yd-'+String(v.did); }\n  did='did-'+Math.random().toString(36).slice(2)+Date.now().toString(36);\n  try{ v.did=did; source.setVariable(JSON.stringify(v)); }catch(e){}\n  return 'yd-'+did;\n}", "lastUpdateTime": "1793682911621", "loginCheckJs": "if(result.code()==401||String(result.body()).indexOf('40101')>=0){source.login();var v={};try{v=JSON.parse(source.getVariable()||'{}');}catch(e){v={};}var d='';try{d=String(java.deviceID()||'').trim();}catch(e1){}if(!d){try{d=String(java.androidId()||'').trim();}catch(e2){}}if(!d&&v.did){d=String(v.did);}if(!d){d='did-'+Math.random().toString(36).slice(2)+Date.now().toString(36);}if(String(v.did||'')!==d){try{v.did=d;source.setVariable(JSON.stringify(v));}catch(e3){}}var h={'User-Agent':'Legado/3.0','X-Device-ID':'yd-'+d};if(v.token){h['Authorization']='Bearer '+v.token;}var u='';try{u=String(result.request().url());}catch(e){u='';}if(u){java.getStrResponse(u,JSON.stringify(h));}else{java.getStrResponse();}}else{result;}", "loginUi": "[{\"name\": \"邮箱\", \"type\": \"text\", \"default\": \"\"}, {\"name\": \"密码\", \"type\": \"password\", \"default\": \"\"}, {\"name\": \"登录墨阅\", \"type\": \"button\", \"action\": \"login(true)\"}, {\"name\": \"📝注册账号\", \"type\": \"button\", \"action\": \"java.startBrowserAwait((function(){var b='';try{b=String((JSON.parse(source.getVariable()||'{}')||{}).host||'');}catch(e){}return b||((typeof host!=='undefined'&&host)?host:'https://moyue.app');})()+'/register','注册墨阅账号')\"}, {\"name\": \"个人中心\", \"type\": \"button\", \"action\": \"(function(){var v={};try{v=JSON.parse(source.getVariable()||'{}');}catch(e){}var t=String(v.token||'');if(!t){java.toast('请先登录书源账号');return;}var bh=String(v.host||'')||((typeof host!=='undefined'&&host)?host:'https://moyue.app');java.startBrowser(bh+'/user/token-login?token='+encodeURIComponent(t),'墨阅·个人中心');})()\"}, {\"name\": \"退出登录\", \"type\": \"button\", \"action\": \"(function(){var v={};try{v=JSON.parse(source.getVariable()||'{}');}catch(e){}delete v.token;source.setVariable(JSON.stringify(v));java.toast('已退出登录');})()\"}]", "loginUrl": "function login(flag){\n  if(flag===undefined){\n    try{ result=JSON.parse(source.getLoginInfo()||'{}'); }catch(e){ result={}; }\n  }else{\n    try{ source.putLoginInfo(JSON.stringify(result)); result=JSON.parse(source.getLoginInfo()||'{}'); }catch(e){ result={}; }\n  }\n  var email=String(result['邮箱']||'');\n  var pwd=String(result['密码']||'');\n  if(!email||!pwd){ java.longToast('请填写邮箱和密码'); throw '请填写邮箱和密码'; }\n  var hh='';try{hh=String((JSON.parse(source.getVariable()||'{}')||{}).host||'').trim();}catch(e){}\n  if(!hh){ try{ hh=String(result['线路']||'').trim(); }catch(e){} }\n  if(!hh){ hh=(typeof host!=='undefined')?host:''; }\n  if(hh.indexOf('http')!=0){ hh='http://'+hh; }\n  var opt=JSON.stringify({method:'POST',body:JSON.stringify({email:email,password:pwd}),headers:{'Content-Type':'application/json','X-Device-ID':GETDID()}});\n  java.longToast('正在登录…');\n  var resp=java.ajax(hh+'/legado/login,'+opt);\n  var j=JSON.parse(resp);\n  if(j && j.code==200 && j.data && j.data.token){\n    var vv={};try{vv=JSON.parse(source.getVariable()||'{}');}catch(e){}\n    vv.token=j.data.token; vv.host=hh;\n    source.setVariable(JSON.stringify(vv));\n    java.longToast('登录成功'+((j.data.user&&j.data.user.nickname)?('：'+j.data.user.nickname):''));\n  }else{\n    var em=(j&&j.msg)||'登录失败'; java.longToast(em); throw em;\n  }\n}", "respondTime": 180000, "ruleBookInfo": {"author": "$.author", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "{{$.origin}} {{$.kind}}", "lastChapter": "$.lastChapter", "name": "$.name", "tocUrl": "<js>\nvar b = J(result);\nif(!b.bookUrl){ throw '详情bookUrl为空:' + String(result).substring(0,60); }\ntry{ book.type = b.bookType || 8; }catch(e){}\nhost + '/legado/toc?url=' + encodeURIComponent(b.bookUrl);\n</js>", "wordCount": "$.wordCount"}, "ruleContent": {"content": "<js>\nvar r = J(result);\nif(r.error){ throw r.error; }\ntry{ book.type = r.bookType || 8; }catch(e){}\nvar out;\nif(r.playUrl){\n  try{ java.startBrowser(r.playUrl, String(book.name||'短剧播放')); java.toast('正在打开播放器，支持选集/倍速/自动连播'); }catch(e){}\n  out = '【正在打开播放器】支持选集/倍速/自动连播';\n}else{\n  out = (r.lines||[]).join('\\n');\n  try{\n    var pf = 'panel';\n    try{ pf = probe.call(this) || 'panel'; }catch(e1){}\n    var rr = java.ajax(host + '/legado/render?pf=' + pf + ',' + JSON.stringify({method:'POST', body: out, headers:{'Content-Type':'text/plain;charset=utf-8'}}));\n    rr = String(rr||'');\n    if(rr && rr.indexOf('error') < 0){ out = rr; }\n  }catch(e2){}\n}\nout;\n</js>", "imageStyle": "full"}, "ruleExplore": {"author": "$.author", "bookList": "$", "bookUrl": "<js>detailUrlOf(J(result).bookUrl)</js>", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "{{$.origin}} {{$.kind}}", "lastChapter": "$.lastChapter", "name": "$.name", "wordCount": "$.wordCount"}, "ruleSearch": {"author": "$.author", "bookList": "$", "bookUrl": "<js>detailUrlOf(J(result).bookUrl)</js>", "checkKeyWord": "斗破苍穹", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "{{$.origin}} {{$.kind}}", "lastChapter": "$.lastChapter", "name": "$.name", "wordCount": "$.wordCount"}, "ruleToc": {"chapterList": "<js>\nvar r = JSON.parse(String(result));\nif(!Array.isArray(r) || r.length === 0){ throw '目录为空:' + String(result).substring(0,60); }\ntry{ book.type = r[0].bookType || 8; }catch(e){}\nJSON.stringify(r);\n</js>$[*]", "chapterName": "$.title", "chapterUrl": "<js>contentUrlOf(J(result).url)</js>", "isVolume": "<js>J(result).isVolume===true</js>", "updateTime": "$.updateTime"}, "searchUrl": "<js>\nvar cfg = SRCFG(source);\nvar tab = cfg.mode || '小说';\nhost + '/legado/search?key=' + encodeURIComponent(key) + '&page=' + page + '&tab=' + encodeURIComponent(tab) + '&source=' + encodeURIComponent(PLATNAME(cfg.platform));\n</js>", "weight": 0},{"bookSourceComment": "作者：姚浅书", "bookSourceGroup": "纳兰验证", "bookSourceName": "名熹小说", "bookSourceType": 0, "bookSourceUrl": "http://www.tjsyjjzs.com/", "customButton": false, "customOrder": 2, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": " 分 类 \n 全 部 ::/xclass/0/{{page}}.html\n 海棠耽美 ::/xclass/1/{{page}}.html\n 耽美小说 ::/xclass/2/{{page}}.html\n 男男色色 ::/xclass/3/{{page}}.html\n 海棠言情 ::/xclass/4/{{page}}.html\n 言情小说 ::/xclass/5/{{page}}.html\n 百合小说 ::/xclass/6/{{page}}.html\n 高辣小说 ::/xclass/7/{{page}}.html\n 情欲小说 ::/xclass/8/{{page}}.html\n 精品小说 ::/xclass/9/{{page}}.html\n 评书品书 ::/xclass/10/{{page}}.html\n 秘密趣事 ::/xclass/11/{{page}}.html\n 总 榜 \n 全 部 ::/ph/all_{{page}}.html\n 海棠耽美 ::/ph/all1_{{page}}.html\n 耽美小说 ::/ph/all2_{{page}}.html\n 男男色色 ::/ph/all3_{{page}}.html\n 海棠言情 ::/ph/all4_{{page}}.html\n 言情小说 ::/ph/all5_{{page}}.html\n 百合小说 ::/ph/all6_{{page}}.html\n 高辣小说 ::/ph/all7_{{page}}.html\n 情欲小说 ::/ph/all8_{{page}}.html\n 精品小说 ::/ph/all9_{{page}}.html\n 评书品书 ::/ph/all10_{{page}}.html\n 秘密趣事 ::/ph/all11_{{page}}.html\n 标 签 \n 快 穿 ::/tag/0/1/{{page}}.html\n 美 攻 ::/tag/0/2/{{page}}.html\n 肉 文 ::/tag/0/3/{{page}}.html\n 年 下 ::/tag/0/4/{{page}}.html\n 年 上 ::/tag/0/5/{{page}}.html\n 生 子 ::/tag/0/6/{{page}}.html\n 人 兽 ::/tag/0/7/{{page}}.html\n 强 强 ::/tag/0/8/{{page}}.html\n 穿 越 ::/tag/0/9/{{page}}.html\n 双 性 ::/tag/0/10/{{page}}.html\n 强 受 ::/tag/0/11/{{page}}.html\n ABO ::/tag/0/12/{{page}}.html\n 重 生 ::/tag/0/13/{{page}}.html\n H P ::/tag/0/14/{{page}}.html\n 虐 文 ::/tag/0/15/{{page}}.html\n 温 馨 ::/tag/0/16/{{page}}.html\n N P ::/tag/0/17/{{page}}.html\n 父 子 ::/tag/0/18/{{page}}.html\n 兄 弟 ::/tag/0/19/{{page}}.html\n 萌 文 ::/tag/0/20/{{page}}.html\n B E ::/tag/0/21/{{page}}.html\n 末 世 ::/tag/0/22/{{page}}.html\n 人 鱼 ::/tag/0/23/{{page}}.html\n 师 生 ::/tag/0/24/{{page}}.html\n 网 游 ::/tag/0/25/{{page}}.html\n娱乐圈::/tag/0/26/{{page}}.html\n 高 干 ::/tag/0/27/{{page}}.html\n金手指::/tag/0/28/{{page}}.html\n 反 攻 ::/tag/0/29/{{page}}.html\n 诱 受 ::/tag/0/30/{{page}}.html\n 种 田 ::/tag/0/31/{{page}}.html\n S M ::/tag/0/32/{{page}}.html\n 调 教 ::/tag/0/33/{{page}}.html\n 1V1 ::/tag/0/34/{{page}}.html\npovip ::/tag/0/35/{{page}}.html", "header": "{\"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\",\"Accept-Encoding\":\"identity\",\"Referer\":\"http://www.tjsyjjzs.com/\"}", "lastUpdateTime": "1793681918910", "respondTime": 180000, "ruleBookInfo": {"author": ".author a.1@text", "coverUrl": ".synopsisArea_detail@img@src", "intro": ".review@html", "kind": ".synopsisArea_detail p.1:2:4@text", "lastChapter": ".directoryArea@a.1@text", "name": ".title@text", "tocUrl": "text.查看完整目录@href"}, "ruleContent": {"content": "@js: var h=String(result); var m=h.match(/<div[^>]*id=[\"']chaptercontent[\"'][^>]*>([\\s\\S]*?)<\\/div>\\s*<script/i); var out='<p>正文提取失败，可能被拦截</p>'; if(m){ var c=m[1]; c=c.replace(/<br\\s*\\/?>\\s*<\\/p>/gi,'</p>'); out=c; } out;", "nextContentUrl": "@js: var href=String(result); var m=href.match(/\\/(\\d+_\\d+\\/\\d+_\\d+\\.html)/); var out=''; if(m){ out='http://www.tjsyjjzs.com/'+m[1]; } out;", "replaceRegex": "##本章尚未完.*|本章已阅读.*"}, "ruleExplore": {"author": "p.1@text##.*作者：##", "bookList": ".hot_sale", "bookUrl": "a@href", "coverUrl": "img@data-original", "intro": "p.2@text##简介：", "kind": "p.1@text##\\|.*##", "lastChapter": "p.2@text##连载 \\| 更新：##", "name": "p.0@text"}, "ruleSearch": {"author": "p.1@text##.*作者：##", "bookList": ".hot_sale", "bookUrl": "@js: var s=String(result); var m=s.match(/href=\"([^\"]+)\"/); var out=''; if(m){ var u=m[1]; if(u.indexOf('/')===0) out='http://www.tjsyjjzs.com'+u; else out=u; } out;", "coverUrl": "@js:\"http://www.tjsyjjzs.com/images/defaultimg.png\"", "kind": "p.1@text##\\|.*##", "lastChapter": "p.2@text##连载 \\| 更新：##", "name": "p.0@text"}, "ruleToc": {"chapterList": ".directoryArea p!0@a", "chapterName": "text", "chapterUrl": "href\n<js>\nvar s=String(result);\nvar out=s;\nif(s.indexOf('javascript:')===0){\n  var m=s.match(/'([0-9]+)','([0-9]+)','([0-9]+)'/);\n  if(m) out='http://www.tjsyjjzs.com/'+m[1]+'_'+m[2]+'/'+m[3]+'.html';\n} else if(s.indexOf('/')===0) {\n  out='http://www.tjsyjjzs.com'+s;\n}\nout;\n</js>"}, "searchUrl": "/s.html,{\"method\":\"POST\",\"body\":\"keyword={{key}}\"}", "weight": 0},{"bookSourceComment": "作者：纳兰容若 // 需手动过CF验证", "bookSourceName": "霹雳书屋-目录修复", "bookSourceType": 0, "bookSourceUrl": "https://www.pili45.com", "bookUrlPattern": ".*pili45\\.com/\\d+/\\d+/info\\.html.*", "concurrentRate": "1000", "customButton": false, "customOrder": 6, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\":\"全部小说\",\"url\":\"/0/list/1.html\"},{\"title\":\"男频小说\",\"url\":\"/1/list/1.html\"},{\"title\":\"女频小说\",\"url\":\"/2/list/1.html\"},{\"title\":\"电子图书\",\"url\":\"/3/list/1.html\"},{\"title\":\"无CP小说\",\"url\":\"/4/list/1.html\"},{\"title\":\"纯爱小说\",\"url\":\"/5/list/1.html\"}]", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\", \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\", \"Accept-Language\": \"zh-CN,zh;q=0.9,en;q=0.8\", \"Referer\": \"https://www.pili45.com/\"}", "lastUpdateTime": "1793638877521", "loginUi": "[\n  {\n    \"name\": \"🌐 打开浏览器完成验证\",\n    \"type\": \"button\",\n    \"action\": \"openBrowser()\",\n    \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}\n  },\n  {\n    \"name\": \"🍪 查看Cookie状态\",\n    \"type\": \"button\",\n    \"action\": \"checkCookie()\",\n    \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}\n  },\n  {\n    \"name\": \"🗑️ 清除Cookie\",\n    \"type\": \"button\",\n    \"action\": \"clearCookie()\",\n    \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}\n  }\n]", "loginUrl": "openBrowser = () => {\n    java.startBrowser('https://www.pili45.com', '请完成安全验证，通过后返回阅读即可');\n}\n\ncheckCookie = () => {\n    var c = java.getCookie('https://www.pili45.com');\n    if (c && c.indexOf('cf_clearance') !== -1) {\n        java.toast('✅ 已检测到 cf_clearance Cookie');\n    } else {\n        java.toast('❌ 未检测到 cf_clearance Cookie');\n    }\n}\n\nclearCookie = () => {\n    java.clearCookie('https://www.pili45.com');\n    java.toast('🗑️ Cookie 已清除');\n}", "respondTime": 180997, "ruleBookInfo": {"author": "div.book-info-status a[href*=author]@text || p.book-status@text", "coverUrl": "div.book-cover img@src || img.book-cover@src", "intro": "div.book-intro@text || p.book-intro@text", "kind": "a.book-fenlei@text || span.book-fenlei@text", "lastChapter": "a.book-newest@text", "name": "h1@text || h2.book-title@text", "tocUrl": "@js:baseUrl.replace(/info\\.html.*$/, 'menu/1.html')"}, "ruleContent": {"content": "@js:\nvar html = result;\nvar cid = '';\nvar m1 = html.match(/data-chapter-id=\"(\\d+)\"/);\nif (m1) cid = m1[1];\nif (!cid) {\n  var m2 = html.match(/id:\\s*'(\\d+)'/);\n  if (m2) cid = m2[1];\n}\nvar content = '';\nif (cid) {\n  var apiUrl = source.key + '/wmcms/ajax/index.php?action=novel.getchapter&cid=' + cid + '&format=1';\n  var res = java.ajax(apiUrl);\n  try {\n    var json = JSON.parse(res);\n    if (json.code == 200 && json.data && json.data.chapter) {\n      var ch = json.data.chapter;\n      if (ch.chapter_isvip == '0' && ch.content && ch.content.length > 0) {\n        var lines = [];\n        for (var i = 0; i < ch.content.length; i++) lines.push(String(ch.content[i]));\n        content = lines.join('\\n');\n      } else if (ch.chapter_isvip != '0') {\n        content = '【VIP章节，需订阅后阅读】';\n      } else {\n        content = '【本章内容为空】';\n      }\n    } else {\n      content = '【接口返回异常 code=' + json.code + '】';\n    }\n  } catch(e) {\n    content = '【JSON解析失败: ' + e + '】';\n  }\n} else {\n  content = '【未能提取章节ID】';\n}\nresult = content;\nresult;", "nextContentUrl": "#readLoadNext a:last-child@href"}, "ruleExplore": {"author": "span.book-status@text", "bookList": "div.x-book", "bookUrl": "div.x-book__coverbox a@href", "coverUrl": "img.x-book__cover@src", "intro": "p.x-book__intro@text", "kind": "span.book-fenlei@text", "name": "p.x-book__info--name@text"}, "ruleSearch": {"author": "span.book-status@text", "bookList": "div.x-book", "bookUrl": "div.x-book__coverbox a@href", "checkKeyWord": "我的", "coverUrl": "img.x-book__cover@src", "intro": "p.x-book__intro@text", "kind": "span.book-fenlei@text", "name": "p.x-book__info--name@text"}, "ruleToc": {"chapterList": "ol#chapterListContainer li.custom-chapter-item || #chapterListContainer li.custom-chapter-item", "chapterName": "a span@text || a@text", "chapterUrl": "a@href", "nextTocUrl": "a:contains(下一页)@href || a:contains(下页)@href"}, "searchUrl": "https://www.pili45.com/module/search/search.php?module=novel&key={{key}}", "weight": 0},{"bookSourceComment": "VirtualTaboo 直播（视频源）\n\n【目录 / 播放】\n· 视频类型：章节 URL 为 m3u8，调用 Legado 内置播放器\n· 文本类型：章节 URL 为主播页，正文打开网页播放器\n· 发现页顶部「🎬 播放方式」可切换：内置播放器 / 网页播放器（选网页后视频也走网页播放器）\n· 分辨率：优先用站点返回的 presets；presets 为空时统一用「自动(_auto)」，避免 480p 等档位 404\n· 卡顿时在目录切换域名线路（域名一/二/三…）\n· 切换书籍类型/播放方式后刷新目录生效\n\n【内置播放器弹幕】\n· 通过 ruleContent.subContent 读取站点聊天（/v2/models/{id}/chat）生成 Bilibili XML 弹幕\n· 普通消息白色、打赏消息橙色，显示「用户名：内容」\n· 章节加载时生成一次（静态弹幕），切线路/切集/重进章节可刷新；不是实时\n\n【网页播放器（文本类型）】\n· 完整页面：DPlayer + hls.js + FontAwesome，悬浮信息面板（主播信息/介绍/目标/粉丝团/打赏/时长）\n· 移动端适配 + 按视频实际比例自适应高度（最高 75vh）\n· 线路/清晰度/静音/横竖屏/全屏/刷新\n· 弹幕实时接收（WebSocket，断线自动重连并刷新 token）\n· 弹幕发送：POST /api/front/models/{id}/chat，带 Cookie 与 CSRF（csrfToken/csrfTimestamp/csrfNotifyTimestamp/uniq）\n\n【书架同步收藏】\n· 加入书架（addBookShelf）→ 自动 PUT 到站点「我的收藏」\n· 移出书架（delBookShelf）→ 自动 DELETE 取消收藏\n· 用 OkHttp 静默发送（带 Cookie + CSRF），toast 提示结果\n\n【发现页】\n· 我的收藏：登录后出现，按在线优先排序（/users/{uid}/favorites + /models/list?modelIds[]=…）\n· 付费主播显示/隐藏：源变量 showPaid=1 显示、0 隐藏\n· 书名只显示用户名，不追加（付费/离线/一对一）等状态后缀\n· 标签分类覆盖全部 liveTags，未覆盖标签归入「🔥 更多热门」\n\n【详情页】\n· 分类：在线/离线、免费/付费、性别年龄、国家、观众、粉丝、会员\n· 最新章节：本次开播 / 上次在线时间\n· 简介：账号代币、会员、互动能力、可录、粉丝团、主播资料、标签、兴趣、价格\n\n【登录】\n· 登录界面已移除，点「登录」直接打开网站登录页（loginUrl），Cookie 供全源使用", "bookSourceGroup": "视频直播", "bookSourceName": "VirtualTaboo直播优化", "bookSourceType": 4, "bookSourceUrl": "https://zh.virtualtaboo.live##吉吉国王", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": true, "exploreUrl": "@js:var sort=[],push=function(t,u,p){sort.push({title:t,url:u,style:{layout_flexBasisPercent:p}});};\nvar LIVE='https://zh.virtualtaboo.live';\nfunction getDisplay(tag){return (typeof lgTag==='function')?lgTag(tag):String(tag||'').replace(/([A-Z])/g,' $1').trim();}\nvar DEVICE=['doStrapon','doAnalToys','autoTagInteractiveToy','doDildoOrVibrator','fuckMachine','doNippleToys','doSexToys','autoTagKiiroo','autoTagLovense'];\nvar FETISH=['doSmoking','subcultureCuckold','specificsPiercing','cockRating','heels','corset','doFootFetish','specificJeans','subcultureBdsm','leather','subcultureMistresses','latex','nylon','specificsTattoos','specificPregnant','specificSportGear'];\nvar PERF=['striptease','eroticDance','twerk','oilShow','shower','topless','flashing','upskirt'];\nfunction buildChannel(cfg){\n  var tag=cfg.tag;\n  var data=JSON.parse(java.ajax(LIVE+'/api/front/models/liveTags?primaryTag='+tag+'&withMixedTags=true&sac=true'));\n  var groups=data.liveTagGroups||[],details=data.liveTagDetails||{};\n  function url(t){return LIVE+'/api/front/models?removeShows=false&recInFeatured=false&limit=60&offset={{(page-1)*60}}&primaryTag='+tag+'&filterGroupTags='+encodeURIComponent(JSON.stringify([[t]]))+'&sortBy=stripRanking&parentTag='+t+'&userRole=user&sac=true';}\n  var used={};\n  function render(list,title){if(!list||!list.length)return;push('❤️ '+title+' ❤️',null,1);for(var i=0;i<list.length;i++){var t=list[i];if(!t)continue;used[t]=1;push(getDisplay(t),url(t),0.29);}}\n  function findGroup(alias){for(var i=0;i<groups.length;i++)if(groups[i].alias===alias)return groups[i];return null;}\n  function sortTags(list){list.sort(function(a,b){var ca=details[a]?details[a].modelsLive||0:0,cb=details[b]?details[b].modelsLive||0:0;return cb-ca;});return list;}\n  function validOf(list){var v=[];for(var i=0;i<list.length;i++){var t=list[i];if(details[t]&&details[t].modelsLive>0)v.push(t);}return v;}\n  function renderGroup(alias,title){var g=findGroup(alias);if(!g)return;render(sortTags(validOf(g.tags||[])),title);}\n  function renderManual(list,title){render(sortTags(validOf(list)),title);}\n  if(cfg.header)push(cfg.header,null,1);\n  if(cfg.before)cfg.before(details,{push:push,url:url});\n  for(var gi=0;gi<cfg.groups.length;gi++)renderGroup(cfg.groups[gi][0],cfg.groups[gi][1]);\n  var langTags=[],subTags=[];\n  for(var t in details){if(details[t].modelsLive>0&&t.indexOf('-')===-1){if(t.indexOf('tagLanguage')===0)langTags.push(t);else if(t.indexOf('subculture')===0)subTags.push(t);}}\n  render(sortTags(langTags),'🌐 语言分类');\n  render(sortTags(subTags),'🎭 亚文化');\n  var all=findGroup('allTags'),act=[],body=[],perf=[];\n  if(all){var at=all.tags||[];for(var i=0;i<at.length;i++){var t=at[i];if(!details[t]||details[t].modelsLive<=0)continue;if(t.indexOf('do')===0)act.push(t);else if(t.indexOf('specific')===0)body.push(t);for(var k=0;k<PERF.length;k++){if(t.indexOf(PERF[k])!==-1){perf.push(t);break;}}}}\n  render(sortTags(act),'🎬 活动分类');\n  render(sortTags(body),'🔍 身体特征');\n  render(sortTags(perf),'💃 表演类型');\n  renderManual(DEVICE,'📱 设备分类');\n  renderManual(FETISH,'🖤 恋物癖');\n  var rest=[];\n  if(all){var at2=all.tags||[];for(var i2=0;i2<at2.length;i2++){var t2=at2[i2];if(!details[t2]||details[t2].modelsLive<=0)continue;if(!used[t2])rest.push(t2);}}\n  rest.sort(function(a,b){var ca=details[a]?details[a].modelsLive||0:0,cb=details[b]?details[b].modelsLive||0:0;return cb-ca;});\n  if(rest.length>20)rest=rest.slice(0,20);\n  render(rest,'🔥 更多热门');\n}\nvar G1=[['specials','🔥 特别推荐'],['age','🎂 年龄'],['ethnicity','🌍 人种'],['bodyType','💪 体型'],['hairColor','💇 发色'],['privatePrice','💰 价格']];\nvar GM=[['specials','🔥 特别推荐'],['orientation','💖 性取向'],['age','🎂 年龄'],['ethnicity','🌍 人种'],['bodyType','💪 体型'],['hairColor','💇 发色'],['privatePrice','💰 价格']];\nbuildChannel({tag:'girls',header:null,groups:G1,before:function(details,api){\n  api.push('🔥 在线热门',LIVE+'/api/front/models?removeShows=false&recInFeatured=false&limit=60&offset=0&primaryTag=girls&sortBy=stripRanking&userRole=user&sac=true',1);\n  try{\n    var ck=String(cookie.getCookie(LIVE+'/')||''),uid='',ps=ck.split('; ');\n    for(var pi=0;pi<ps.length;pi++){if(ps[pi].indexOf('AMP_')===0){var raw=ps[pi].substring(ps[pi].indexOf('=')+1);var o=JSON.parse(decodeURIComponent(java.base64Decode(raw)));uid=o.userId||'';}}\n    if(uid){\n      var favUrl=null;\n      try{favUrl=cache.get('lg_fav_url');}catch(e0){}\n      if(!favUrl){\n        try{\n          var fj=JSON.parse(String(java.ajax(LIVE+'/api/front/users/'+uid+'/favorites')));\n          var ids=(fj.modelIds||[]).slice(0,60);\n          if(ids.length){\n            try{\n              var rp=java.post(LIVE+'/api/front/models/get-statuses',JSON.stringify({ids:ids}),{'Content-Type':'application/json','Accept':'application/json'});\n              var st=JSON.parse(String(rp.body())).statuses||[],sm={};\n              for(var si=0;si<st.length;si++){sm[String(st[si].id)]=st[si].status;}\n              ids.sort(function(a,b){var sa=sm[String(a)]||'',sb=sm[String(b)]||'';return (sa!=='off'?0:1)-(sb!=='off'?0:1);});\n            }catch(e2){}\n            favUrl=LIVE+'/api/front/models/list?modelIds[]='+ids.join('&modelIds[]=');\n            try{cache.put('lg_fav_url',favUrl,60);}catch(e3){}\n          }\n        }catch(e4){}\n      }\n      if(favUrl)api.push('💕 我的收藏',favUrl,1);\n    }\n  }catch(e){}\n  var ql=[['🇨🇳 中文','tagLanguageChinese'],['🇯🇵 日语','tagLanguageJapanese'],['🇻🇳 越南语','tagLanguageVietnamese']];\n  for(var i=0;i<ql.length;i++){var c=details[ql[i][1]]?details[ql[i][1]].modelsLive||0:0;if(c>0)api.push(ql[i][0],api.url(ql[i][1]),0.29);}\n}});\nbuildChannel({tag:'couples',header:'💕 情侣专区 💕',groups:G1});\nbuildChannel({tag:'men',header:'👨 男主播专区 👨',groups:GM});\nbuildChannel({tag:'trans',header:'⚧️ 跨性别专区 ⚧️',groups:G1});\nvar __sd={};try{__sd=JSON.parse(String(source.getVariable()||'{}'));}catch(e){}\nvar __pm='native';try{__pm=(String(__sd.playMode)==='web')?'web':'native';}catch(e){}\nsort.unshift({title:'🎬 播放方式',url:'',type:'select',chars:['内置播放器','网页播放器'],default:(__pm==='web'?'网页播放器':'内置播放器'),action:\"lgPlaySet(infoMap['🎬 播放方式'])\",style:{layout_flexGrow:1,layout_flexBasisPercent:1}});\nsort.unshift({title:'🎭 付费主播',url:'',type:'select',chars:['显示','隐藏'],default:(String(__sd.showPaid)==='0'?'隐藏':'显示'),action:\"lgPaidSet(infoMap['🎭 付费主播'])\",style:{layout_flexGrow:1,layout_flexBasisPercent:1}});\nJSON.stringify(sort);", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\",\"Accept\":\"application/json, text/plain, */*\",\"Accept-Language\":\"zh-CN,zh;q=0.9,en;q=0.8\",\"Referer\":\"https://zh.virtualtaboo.live/\"}", "jsLib": "// ===== Legado 公共 JS 库：紧凑映射表 + 格式化 + 渲染 =====\nvar MAP_RAW=\"69^69式|eyeColorBlack^黑瞳|eyeColorBrown^棕瞳|eyeColorBlue^蓝瞳|eyeColorGreen^绿瞳|eyeColorGray^灰瞳|eyeColorHazel^榛瞳|subcultureGlamour^高贵|subcultureAnime^动漫|subcultureEgirl^电子女孩|subcultureKpop^韩流|subcultureStudent^学生|subcultureNerds^书呆子|subcultureGamers^玩家|subcultureBdsm^虐恋|subcultureCuckold^出轨|subcultureGoth^哥特|subcultureEmo^Emo|subcultureSwingers^交换伴侣|subcultureMistresses^情妇|subcultureHousewives^家庭主妇|subcultureGymBabe^健身宝贝|subcultureRomantic^浪漫|subculturePunks^朋克|subcultureClubber^夜店女郎|subcultureBottom^Bottom|subcultureTop^Top|subcultureChubbies^胖熊|subcultureCubs^小熊|subcultureDragQueens^变装皇后|subcultureEboy^E-boy|subcultureGymRats^健身狂|subcultureHunks^猛男|subcultureJocks^运动男|subcultureOtters^水獭|subcultureStuds^种马|en^英语|zh^中文|zt^繁体中文|jp^日语|ja^日语|ru^俄语|es^西语|fr^法语|de^德语|pt^葡语|vi^越南语|th^泰语|ar^阿语|hi^印地语|tr^土耳其语|pl^波兰语|ro^罗马尼亚语|it^意大利语|nl^荷兰语|id^印尼语|fil^菲律宾语|ko^韩语|mn^蒙古语|he^希伯来语|fa^波斯语|bn^孟加拉语|ta^泰米尔语|te^泰卢固语|gu^古吉拉特语|mr^马拉地语|kn^卡纳达语|ml^马拉雅拉姆语|or^奥里亚语|pa^旁遮普语|si^僧伽罗语|ne^尼泊尔语|ur^乌尔都语|sw^斯瓦希里语|am^阿姆哈拉语|ha^豪萨语|yo^约鲁巴语|ig^伊博语|zu^祖鲁语|xh^科萨语|st^塞索托语|sn^绍纳语|so^索马里语|rw^基尼亚隆达语|mg^马尔加什语|hairLengthLong^长发|hairLengthMedium^中发|hairLengthShort^短发|hairLengthBald^光头|mobile^手机直播|groupShow^群组秀|tagGroupSex^群交|fuckMachine^炮机|videoGames^游戏|asmr^ASMR|latex^乳胶|leather^皮革|corset^紧身衣|boots^靴子|heels^高跟鞋|nylon^丝袜|i18n_ar^阿语|i18n_zh^中文|ageYoung^年轻|ageTeen^18+|ageMilf^熟女|ageMature^成熟|sexting^文爱|BBW^大码|Big^丰满|Medium^匀称|Slim^纤细|Curvy^曲线|Petite^娇小|Athletic^运动|Average^匀称|Large^大码|Thin^纤细|Black^黑发|Brown^棕发|Blonde^金发|Red^红发|Colorful^彩发|Hairless^无毛|Asian^亚洲|White^白人|Ebony^黑人|Latino^拉丁|Indian^印度|MiddleEastern^中东|Multiracial^混血|Eight^8代币/分|SixteenToTwentyFour^16-24代币/分|ThirtyTwoSixty^32-60代币/分|NinetyPlus^90+代币/分|Handy^手活|HandyJob^手活|Pump^抽插机|Hairy^多毛|blowjob^口交|coffee^咖啡|cooking^烹饪|dirty-talk^骚话|foot-fetish^恋足|french-kiss^法式吻|gardening^园艺|gym^健身|hiking^徒步|sex-toys^性玩具|squirt^潮吹|underwear^内衣|yoga^瑜伽|massage^按摩|travel^旅行|music^音乐|movies^电影|reading^阅读|napping^小憩|mistress^情妇|acting^表演|adventure^冒险|classic^古典|diy^手工|gentle-sex^温柔性爱|object-sexuality^物品恋|role-play^角色扮演|role-playing^角色扮演|submission^顺从|submissive^顺从|cosplay^Cosplay|kissing^亲吻|dancing^跳舞|singing^唱歌|gaming^游戏|fashion^时尚|fitness^健身|photography^摄影|art^艺术|females^女|female^女|males^男|male^男|trans^跨性别|tranny^跨性别|couples^情侣|maleFemale^情侣|couple^情侣|group^情侣|girls^女主播|men^男主播|jerkOffInstruction^射精指导|cockRating^大屌评分|orientationBisexual^双性恋|orientationGay^男同|orientationStraight^异性恋|ageDaddies^大叔|tagMenTwinks^男同小鲜肉|subcultureNone^无|全裸^全裸|smallAudience^观众少|easter^复活节|trannies^跨性别|privateP2PNinetyPlus^90+代币/分|privateP2PPriceThirtyTwoSixty^32-60代币/分|privateP2PPriceSixteenToTwentyFour^16-24代币/分|privateP2PPriceEight^8代币/分|beach^海滩|bondage^束缚|deepthroat^深喉|hardcore^硬核|porn^色情|swinging^换偶|pop^流行乐|basketball^篮球|swimming^游泳|cafes-restaurants^咖啡馆/餐厅|k-pop^韩流|mystery^悬疑|playing-musical-instruments^乐器|psychology^心理学|romance^浪漫|seafood^海鲜|shopping^购物|tennis^网球|wine^红酒|anal^肛交|cuckold^出轨|group-sex^群交|chinese^中文|erotica^情色|hentai^动漫色情|photo^摄影|voyeurism^窥视|action^动作|art-galleries^美术馆|barbeque^烧烤|board-games^桌游|country^乡村音乐|sweet-tooth^甜食|astronomy^天文|football-soccer^足球|handmade^手工|makeup^化妆|r-and-b^R&B|rock^摇滚|sci-fi^科幻|techno^电子乐|interestedInMen^喜欢男性|interestedInWomen^喜欢女性|interestedInEverybody^都喜欢|18 years^18岁|big squirt^大潮吹|bigass^大屁股|bigboobs^大胸|bigcock^大屌|elegant^优雅|bdsm^BDSM/束缚|billiards^台球|hip-hop^嘻哈|jazz^爵士|latino^拉丁|night-clubs^夜店|parties^派对|surfing^冲浪|videomaking^视频制作|subcultureBears^胖熊|femaleTranny^跨性别|astrology^占星|tarot^塔罗|anals^肛交|cum^射精|cum bigcock^大屌射精|cum show facial squirt^颜射潮吹秀|cumshow^射精秀|eatcum^吃精|gameplay^游戏|gamerboy^游戏男孩|gush^喷涌|halloween^万圣节|jerkoff^打飞机|lovense domi^Lovense Domi|privateP2PPriceTwelveTwentyFour^12-24代币/分|sexGayCouples^男同情侣|smallcock^小屌|smalltits^小胸|anime^动漫|bars^酒吧|beer^啤酒|blogging^写博客|bowling^保龄球|boxing^拳击|burgers^汉堡|camping^露营|cartoon^卡通|cocktails^鸡尾酒|comedy^喜剧|comic-books^漫画|concerts^演唱会|cycling^骑行|drama^戏剧|edm^电子舞曲|family-vacation^家庭度假|folk^民谣|foreign-languages^外语|healthy^健康|house^浩室音乐|karaoke^卡拉OK|meditation^冥想|mindfulness^正念|mountaineering^登山|music-festivals^音乐节|picnics^野餐|poker^扑克|reality-tv^真人秀|road-trips^自驾游|running^跑步|standup^脱口秀|steak^牛排|technology-computers^电脑科技|thriller^惊悚|triathlon^铁人三项|twerk^电臀舞|vlogging^拍Vlog|volleyball^排球|vr-ar-games^VR/AR游戏|watching-tv^追剧|whiskey^威士忌|writing^写作|emo^Emo|ms^马来语|maleTranny^跨性别|ageOld^老年\";\nvar P_RAW={\"ethnicity\":\"Asian^亚洲|White^白人|Ebony^黑人|Latino^拉丁|Indian^印度|MiddleEastern^中东|Multiracial^混血\",\"bodyType\":\"Thin^纤细|Petite^娇小|Athletic^运动型|Medium^匀称|Curvy^曲线型|BBW^大码|Big^丰满|Slim^纤细|Muscular^肌肉型|Skinny^瘦\",\"hairColor\":\"Blonde^金发|Brown^棕发|Black^黑发|Red^红发|Colorful^彩发|Hairless^无毛\",\"specific\":\"Shaven^剃毛|Trimmed^修剪|BigTits^巨乳|SmallTits^小胸|Pregnant^孕妇|Interracial^跨种族|Tomboy^假小子|Queer^酷儿|NonBinary^非二元|BigClit^大阴蒂|BigNipples^大乳头|HairyArmpits^腋毛|Jeans^牛仔裤|SportGear^运动装备|POV^POV|SneakersSocks^球鞋白袜|Uncut^未割|BigBalls^大睾丸|Uniform^制服|PowerTop^强势攻|Mustache^胡子|MtF^MtF|Beardy^络腮胡|Bubblebutt^蜜桃臀|Femboy^伪娘|FtM^女转男|Shemale^人妖|TG^跨性别|TS^变性|Boots^靴子|Lesbians^女同|BBC^黑人大屌|Side^侧位|Sissy^伪娘|SmallCock^小屌|TV^变装|Vers^全能\",\"specifics\":\"Tattoos^纹身|Piercing^穿孔|BigAss^大屁股|Hairy^多毛|BigTits^巨乳|Shaven^剃毛|Pregnant^孕妇|BigCock^大屌\",\"do\":\"Talk^聊天|Masturbation^自慰|Striptease^脱衣舞|EroticDance^色情舞|Twerk^电臀舞|Smoking^抽烟|Yoga^瑜伽|Cooking^烹饪|Massage^按摩|Shower^淋浴|Flashing^快闪|Upskirt^裙底|Office^办公室|Cosplay^Cosplay|RolePlay^角色扮演|SexToys^性玩具|Music^音乐|VideoGames^游戏|Reading^阅读|Drawing^绘画|Singing^唱歌|Dancing^跳舞|Blowjob^口交|DeepThroat^深喉|Anal^后庭|DildoOrVibrator^震动棒|NippleToys^乳头玩具|Strapon^骑跨|69Position^69式|Cowgirl^女上|DoggyStyle^后入|Missionary^传教士|SpikeSpike^尖峰对尖|AssToMouth^后庭接吻|DoublePenetration^双重|Orgasm^高潮|CreamPie^内射|Cumshot^颜射|Bukkake^集体颜射|Gape^开肛|Gagging^塞口|Spanking^打屁股|Humiliation^羞辱|OilShow^精油|Ejaculation^射精|TittyFuck^乳交|Suck^吮吸|Fisting^拳交|Squirt^失禁|Threesome^三人|4some^四人|Sextape^自拍|CamToCam^对脸|Teledildonics^遥控玩具|Lovense^Lovense|Kiiroo^Kiiroo|PublicPlace^公共场所|Hardcore^硬核|Handy^手活|Pump^抽插机|Ahegao^高潮脸|Topless^露乳|Nylon^丝袜|Corset^紧身衣|Heels^高跟鞋|FootFetish^恋足|ggy-style^后入|minant^主导|Handjob^手活|Fingering^指交|Facesitting^骑脸|AnalToys^后庭玩具|JerkOffInstruction^射精指导|Facial^颜射|GloryHole^厕板洞|Cei^吃精|CumPlay^精液玩法|Pegging^穿戴阳具|Swallow^吞精|Precum^前液|Footjob^足交|Kissing^接吻|PussyLicking^舔阴|Flexing^秀肌肉|Gangbang^群体|CamelToe^骆驼趾|PenisRing^阴茎环|Outdoor^户外|Swingers^换偶|Cuckold^出轨|Latex^乳胶|Leather^皮革|Mistress^情妇|CockRating^大屌评分|mination^支配|Rubbing^摩擦|Sph^小鸟羞辱|Foursome^四人|Rimming^舔肛|Selfsucking^自舔\",\"autoTag\":\"Spy^可窥视|P2P^P2P|InteractiveToy^互动玩具|RecordablePrivate^可录制私秀|BestPrivates^最佳私秀|New^新主播|Vr^VR|Lovense^Lovense|Kiiroo^Kiiroo|NonNude^非全裸|Handy^手活|Hd^高清|RecordablePublic^可录公开|Lesbian^女同|OldYoung^老少配\",\"tagLanguage\":\"Chinese^中文|Taiwanese^台湾|Malaysian^马来语|Filipino^菲律宾语|Vietnamese^越南语|Ukrainian^乌克兰语|African^非洲裔|Algerian^阿尔及利亚|Argentinian^阿根廷|Armenian^亚美尼亚|Assamese^阿萨姆|Australian^澳大利亚|Austrian^奥地利人|Bangladeshi^孟加拉|Belgian^比利时|Bengali^孟加拉语|Brazilian^巴西|Bulgarian^保加利亚人|Canadian^加拿大|Chilean^智利|Colombian^哥伦比亚|Croatian^克罗地亚|Czech^捷克|Danish^丹麦|Dominican^多米尼加|Dutch^荷兰|Ecuadorian^厄瓜多尔|Egyptian^埃及|Estonian^爱沙尼亚|European^欧洲女孩|Korean^韩语|Finnish^芬兰|French^法语|Georgian^格鲁吉亚|GermanSpeaking^德语|Greek^希腊|Gujarati^古吉拉特|Hindi^印地|Hungarian^匈牙利|Indonesian^印度尼西亚|Irish^爱尔兰|Israeli^以色列|Italian^意大利|Jamaican^牙买加|Japanese^日语|Kannada^卡纳达|Kenyan^肯尼亚|Kiwi^新西兰|Latvian^拉脱维亚|Lithuanian^立陶宛|Malagasy^马尔加什|Malayalam^马拉雅拉姆|Marathi^马拉地|Mexican^墨西哥|Moroccan^摩洛哥|Nigerian^尼日利亚|Nordic^北欧|Norwegian^挪威|Odia^奥里亚|Peruvian^秘鲁|Polish^波兰|Portuguese^葡萄牙|PortugueseSpeaking^葡萄牙语|Punjabi^旁遮普|Romanian^罗马尼亚|RussianSpeaking^俄罗斯|Serbian^塞尔维亚|Slovakian^斯洛伐克|SouthAfrican^南非|Spanish^西班牙语|SpanishSpeaking^西班牙|SriLankan^斯里兰卡|Swedish^瑞典|Swiss^瑞士|Tamil^泰米尔|Telugu^泰卢固|Thai^泰国|Turkish^土耳其|UKModels^英国|USModels^美国|Ugandan^乌干达|Venezuelan^委内瑞拉|Zimbabwean^津巴布韦\",\"privatePrice\":\"Eight^8代币/分|SixteenToTwentyFour^16-24代币/分|ThirtyTwoSixty^32-60代币/分|NinetyPlus^90+代币\",\"country:\":\"us^美国|cn^中国|ru^俄罗斯|br^巴西|in^印度|id^印尼|th^泰国|vn^越南|tr^土耳其|pl^波兰|es^西班牙|mx^墨西哥|fr^法国|de^德国|it^意大利|uk^英国|gb^英国|ua^乌克兰|co^哥伦比亚|ve^委内瑞拉|pe^秘鲁|cl^智利|ar^阿根廷|cr^哥斯达黎加|pa^巴拿马|do^多米尼加|gt^危地马拉|hn^洪都拉斯|ni^尼加拉瓜|sv^萨尔瓦多|bo^玻利维亚|py^巴拉圭|ec^厄瓜多尔|uy^乌拉圭|za^南非|ke^肯尼亚|eg^埃及|ng^尼日利亚|gh^加纳|ma^摩洛哥|dz^阿尔及利亚|tn^突尼斯|il^以色列|sa^沙特|ae^阿联酋|my^马来西亚|ph^菲律宾|sg^新加坡|jp^日本|kr^韩国|tw^台湾|hk^香港|mo^澳门|au^澳大利亚|nz^新西兰|ca^加拿大|mm^缅甸|kh^柬埔寨|la^老挝|np^尼泊尔|pk^巴基斯坦|bd^孟加拉|lk^斯里兰卡|af^阿富汗|kz^哈萨克斯坦|uz^乌兹别克斯坦|mn^蒙古|ge^格鲁吉亚|am^亚美尼亚|az^阿塞拜疆|by^白俄罗斯|md^摩尔多瓦|ro^罗马尼亚|hu^匈牙利|cz^捷克|sk^斯洛伐克|at^奥地利|ch^瑞士|be^比利时|nl^荷兰|lu^卢森堡|dk^丹麦|no^挪威|se^瑞典|fi^芬兰|is^冰岛|ie^爱尔兰|pt^葡萄牙|gr^希腊|hr^克罗地亚|si^斯洛文尼亚|rs^塞尔维亚|mk^北马其顿|ba^波黑|me^黑山|bg^保加利亚|lt^立陶宛|lv^拉脱维亚|ee^爱沙尼亚|cy^塞浦路斯|mt^马耳他|ls^莱索托|bw^博茨瓦纳|zw^津巴布韦|zm^赞比亚|mw^马拉维|mg^马达加斯加|mu^毛里求斯|sc^塞舌尔|ru2^俄罗斯\"};\nfunction lgSplit(s){var o={};if(!s)return o;var a=s.split('|');for(var i=0;i<a.length;i++){var p=a[i].indexOf('^');if(p>0)o[a[i].slice(0,p)]=a[i].slice(p+1);}return o;}\nvar LG_MAP=lgSplit(MAP_RAW);\nvar LG_P={};for(var __g in P_RAW)LG_P[__g]=lgSplit(P_RAW[__g]);\nvar LG_PREFIXES=[\"tagLanguage\",\"privatePrice\",\"autoTag\",\"bodyType\",\"hairColor\",\"ethnicity\",\"specifics\",\"specific\",\"do\",\"country:\"];\nfunction lgLook(k){if(LG_MAP[k])return LG_MAP[k];for(var i=0;i<LG_PREFIXES.length;i++){var p=LG_PREFIXES[i];if(k.indexOf(p)===0&&k!==p){var r=k.slice(p.length);var m=LG_P[p];if(m&&m[r]!==undefined)return m[r];}}return null;}\nfunction lgMap(k){var v=lgLook(String(k));return v===null?undefined:v;}\nfunction lgTag(k){var x=String(k);var v=lgLook(x);if(v!==null)return v;if(x.indexOf('-')>-1){var ps=x.split('-'),r=[];for(var qi=0;qi<ps.length;qi++){r.push(lgTag(ps[qi]));}return r.join('/');}return x;}\nfunction lgText(k){return lgTag(k);}\nfunction lgInt(k){var v=lgLook(String(k));return v===null?String(k):v;}\nfunction lgCountry(k){if(!k)return '';var l=String(k).toLowerCase();var v=(LG_P.country&&LG_P.country[l]!==undefined)?LG_P.country[l]:null;return v!==null?v:String(k).toUpperCase();}\nfunction lgGender(g){var v=lgLook(String(g));return v===null?String(g):v;}\nfunction lgNum(n){var s=String(n),o='',c=0;for(var i=s.length-1;i>=0;i--){o=s.charAt(i)+o;c++;if(c%3===0&&i>0)o=','+o;}return o;}\nfunction lgTime(iso){if(!iso)return '';var t=new Date(iso);if(isNaN(t.getTime()))return '';function p(n){return n<10?'0'+n:''+n;}return p(t.getMonth()+1)+'-'+p(t.getDate())+' '+p(t.getHours())+':'+p(t.getMinutes());}\nfunction lgLangList(u){if(!u||!u.languages||!u.languages.length)return '';var a=[];for(var i=0;i<u.languages.length&&i<6;i++)a.push(lgTag(u.languages[i]));return a.join('/');}\nfunction lgRates(u,labelP2P,withRec){if(!u)return '';var a=[];if(withRec&&u.publicRecordingsRate!=null)a.push('录像 '+u.publicRecordingsRate);if(u.privateRate!=null)a.push('私秀 '+u.privateRate);if(u.p2pRate!=null)a.push((labelP2P||'1v1')+' '+u.p2pRate);if(u.spyRate!=null)a.push('窥视 '+u.spyRate);return a.join(' · ');}\n\n// ===== 规则渲染函数 =====\nvar ACC_URL='https://zh.virtualtaboo.live/api/front/v3/config/initial-dynamic';\nfunction lgViewerUrl(u){var g={'female':'girls','male':'men','group':'couples','tranny':'trans','trans':'trans','couples':'couples','maleFemale':'couples'}[(u.broadcastGender||u.gender||'')]||'girls';return 'https://zh.virtualtaboo.live/api/front/v4/models/search/group/username?query='+encodeURIComponent(u.username)+'&limit=20&offset=0&primaryTag='+g+'&uniq=';}\nfunction lgDetailIntro(result,accountJson,viewerJson){var d=(typeof result==='string')?JSON.parse(result):result,u=(d.user&&d.user.user)||{},out=[],acc={};try{var cfg=JSON.parse(String(accountJson||'{}'));acc=(cfg.initialDynamic&&cfg.initialDynamic.user)||cfg.user||{};}catch(e){}\nif(acc&&acc.username){out.push('👤 当前账号：'+acc.username);var line='🪙 剩余代币：'+(acc.tokens==null?'—':acc.tokens);if(acc.tokensPaid!=null)line+='（累计付费 '+acc.tokensPaid+'）';out.push(line);var bd=[];if(acc.isUltimate)bd.push('Ultimate');if(acc.isExGreen)bd.push('ExGreen');if(acc.isGreen)bd.push('Green');if(acc.isRegular)bd.push('Regular');if(acc.isGold)bd.push('Gold');if(bd.length)out.push('🎖️ 会员：'+bd.join(' · '));}else{out.push('👤 当前账号：未登录');}\nvar vc=null,isNew=false,fc=(d.cam&&d.cam.userFanClub)||null;if(viewerJson){try{var arr=(JSON.parse(String(viewerJson)).models)||[];for(var i=0;i<arr.length;i++){if(String(arr[i].id)===String(u.id)){vc=arr[i].viewersCount!=null?arr[i].viewersCount:null;isNew=!!arr[i].isNew;break;}}}catch(e){}}\nout.push('📡 状态：'+(u.isLive?'在线':'离线')+(u.isHd?' · 高清':'')+(u.isVr?' · VR':'')+(vc!=null?' · 观众 '+vc:''));\nvar cap=[];if(u.doPrivate)cap.push('私秀');if(u.doP2p)cap.push('1v1');if(u.doSpy)cap.push('窥视');out.push('🎫 互动：'+(cap.length?'可'+cap.join(' / '):'仅公开'));\nvar extra=[];if(u.isStorePrivateRecordings!==undefined)extra.push('🎬 可录私秀：'+(u.isStorePrivateRecordings?'是':'否'));var st=lgTime((d.cam&&d.cam.show&&d.cam.show.createdAt)?d.cam.show.createdAt:(u.statusChangedAt||''));if(st)extra.push('🕒 最近开播：'+st);if(extra.length)out.push(extra.join(' · '));\nvar meta=[];if(u.favoritedCount!=null)meta.push('⭐ 收藏 '+lgNum(u.favoritedCount));if(isNew)meta.push('🆕 新主播');if(fc&&fc.isActive!==undefined)meta.push('💠 粉丝团'+(fc.isActive?'已开通':'未开通')+(fc.subscription?'（已订阅）':''));if(meta.length)out.push(meta.join(' · '));\nvar m=[];if(u.age)m.push('年龄 '+u.age);if(u.gender)m.push(lgGender(u.gender));if(u.ethnicity)m.push(lgTag(u.ethnicity));if(u.bodyType)m.push(lgTag(u.bodyType));if(u.hairColor)m.push(lgTag(u.hairColor));if(u.country)m.push(String(u.country).toUpperCase());var lgs=lgLangList(u);if(lgs)m.push('语言 '+lgs);if(m.length)out.push('📋 主播：'+m.join(' · '));\nvar tags=(d.user&&d.user.tags)||[];if(tags.length){var tl=[];for(var ti=0;ti<tags.length&&tl.length<10;ti++){var tv=lgTag(tags[ti]);if(tl.join('|').indexOf(tv)<0)tl.push(tv);}if(tl.length)out.push('🏷️ 标签：'+tl.join(' · '));}\nvar iv=u.interests||[];if(iv.length){var il=[];for(var ii=0;ii<iv.length&&il.length<8;ii++)il.push(lgInt(iv[ii]));out.push('💡 兴趣：'+il.join(' / '));}\nvar rt=lgRates(u,'1v1',false);if(rt)out.push('💰 价格(token/分)：'+rt);return out.join('\\n');}\nfunction lgSearchIntro(result){var u=(typeof result==='string')?JSON.parse(result):result,lines=[],st={'public':'免费','groupShow':'付费','p2p':'一对一','off':'离线'};lines.push('状态: '+(u.isLive?'在线':'离线')+' · '+(st[u.status]||u.status||'未知'));\nvar meta=[];if(u.age)meta.push('年龄 '+u.age);if(u.gender)meta.push({'male':'男','female':'女','trans':'跨性别','maleFemale':'双性'}[u.gender]||u.gender);if(u.ethnicity)meta.push('人种 '+lgText(u.ethnicity));if(u.country){var ccv=lgCountry(u.country);if(ccv)meta.push('国家 '+ccv);}if(u.city)meta.push('城市 '+u.city);if(u.region)meta.push('地区 '+u.region);if(meta.length)lines.push(meta.join(' · '));\nvar look=[];if(u.bodyType)look.push('体型 '+lgText(u.bodyType));if(u.hairColor)look.push('发 '+lgText(u.hairColor));if(u.eyeColor)look.push('瞳 '+lgText(u.eyeColor));if(u.subculture)look.push('风格 '+lgText(u.subculture));if(look.length)lines.push(look.join(' · '));\nvar lgs=lgLangList(u);if(lgs)lines.push('语言: '+lgs);if(u.specifics&&u.specifics.length)lines.push('特征: '+u.specifics.slice(0,6).map(lgTag).join(' '));if(u.publicActivities&&u.publicActivities.length)lines.push('活动: '+u.publicActivities.slice(0,8).map(lgTag).join(' '));if(u.privateActivities&&u.privateActivities.length)lines.push('私秀活动: '+u.privateActivities.slice(0,4).map(lgTag).join(' '));\nvar rt=lgRates(u,'一对一',true);if(rt)lines.push('价格(token/分): '+rt);var caps=[];if(u.doSpy)caps.push('可窥视');if(u.doP2p)caps.push('可1v1');if(u.doPrivate)caps.push('可私秀');if(u.isStorePrivateRecordings)caps.push('有私录');if(u.isStorePublicRecordings)caps.push('有公录');if(u.isHd)caps.push('高清');if(u.isVr)caps.push('VR');if(u.isMobile)caps.push('手机');if(u.isGold)caps.push('金卡');if(u.hallOfFame)caps.push('名人堂');if(caps.length)lines.push('能力: '+caps.join(' '));if(u.favoritedCount)lines.push('收藏: '+lgNum(u.favoritedCount));return lines.join('\\n');}\nfunction lgBuildToc(result,text){ return (function(){var d=(typeof result==='string')?JSON.parse(result):result;var it=d.item||{};var paid=(it.status==='groupShow'||it.status==='p2p');var presets=((it.settings&&it.settings.presets)||[]).filter(function(p){return p&&p.indexOf('blurred')===-1});if(paid){presets=[];}if(!presets.length){presets=['auto'];if(paid){presets=['160p_blurred'];}}var lv=it.isLive?'在线':'离线';var pt={'public':'免费','groupShow':'付费','p2p':'一对一','private':'私秀','exclusivePrivate':'专属私秀','idle':'空闲','off':'离线'}[it.status]||'未知';var np=lv;if(pt&&pt!==lv)np+=' · '+pt;var cdns=['doppiocdn.media','doppiocdn.net','doppiocdn.org','doppiocdn.live','doppiocdn.com','doppiocdn1.com'];var cn=['一','二','三','四','五','六'];var out=[];for(var i=0;i<cdns.length;i++){var c=cdns[i];out.push(JSON.stringify({n:'域名'+cn[i],u:'',v:1}));for(var j=0;j<presets.length;j++){var p=presets[j];out.push(JSON.stringify({n:np+' · '+(p==='auto'?'自动':p),u:(text?'https://zh.virtualtaboo.live/'+it.username:'https://edge-hls.'+c+'/hls/'+it.modelId+'/master/'+it.modelId+'_'+p+'.m3u8?pkey=bXorqTB5ZhP5FcpX'),v:0}));}}return out})(); }\n\nfunction lgPaidSet(k){var S=this.source,J=this.java;try{if(!S&&typeof source!=='undefined')S=source;}catch(e){}try{if(!J&&typeof java!=='undefined')J=java;}catch(e){}var v={};try{v=JSON.parse(String(S.getVariable()||'{}'));}catch(e){}v.showPaid=(String(k).indexOf('隐藏')>-1)?'0':'1';try{S.putVariable(JSON.stringify(v));}catch(e){}try{J.refreshExplore();}catch(e){}}\n\nfunction lgPlaySet(k){var S=this.source,J=this.java;try{if(!S&&typeof source!=='undefined')S=source;}catch(e){}try{if(!J&&typeof java!=='undefined')J=java;}catch(e){}var v={};try{v=JSON.parse(String(S.getVariable()||'{}'));}catch(e){}v.playMode=(String(k).indexOf('网页')>-1)?'web':'native';try{S.putVariable(JSON.stringify(v));}catch(e){}try{J.refreshExplore();}catch(e){}try{J.refreshBookToc();}catch(e){}try{J.refreshContent();}catch(e){}}\n", "lastUpdateTime": "1793572949504", "loginUrl": "https://zh.virtualtaboo.live/", "respondTime": 180000, "ruleBookInfo": {"author": "{{$.user.user.name}}", "coverUrl": "@js:(function(){var d=(typeof result==='string')?JSON.parse(result):result;var u=(d.user&&d.user.user)||{},c=d.cam||{};if(u.snapshotTimestamp&&c.streamName)return 'https://img.doppiocdn.com/thumbs/'+u.snapshotTimestamp+'/'+c.streamName+'_webp';return u.avatarUrlThumb||u.avatarUrl||'';})()", "intro": "@js:(function(){\nvar d=(typeof result==='string')?JSON.parse(result):result;\nvar u=(d.user&&d.user.user)||{};\nvar acc='',vw='';\ntry{var c=cache.get('lg_acc');if(!c||String(c).indexOf('initialDynamic')<0){c=java.ajax(ACC_URL);cache.put('lg_acc',c,120);}acc=c;}catch(e){}\ntry{if(u.isLive&&u.username&&String(u.username).length>=3)vw=java.ajax(lgViewerUrl(u));}catch(e){}\nreturn lgDetailIntro(result,acc,vw);\n})()", "kind": "@js:(function(){\nvar d=(typeof result==='string')?JSON.parse(result):result;\nvar u=(d.user&&d.user.user)||{},c=d.cam||{};\nvar sm={public:'免费',groupShow:'付费群秀',private:'私秀',p2p:'1v1',exclusivePrivate:'专属私秀'};\nvar a=[];\nif(u.isLive){a.push('在线');if(sm[u.status])a.push(sm[u.status]);}\nelse{a.push(sm[u.status]||'离线');}\nif(u.broadcastGender)a.push(lgGender(u.broadcastGender)+(u.age?' '+u.age:''));\nvar g=lgCountry(u.country);if(g)a.push(g);\nvar vw=c.groupShowUsersCount;if(vw!=null&&vw>0)a.push('观众 '+vw);\nif(u.favoritedCount!=null)a.push('粉丝 '+lgNum(u.favoritedCount));\nvar bd=[];if(u.isUltimate)bd.push('Ultimate');if(u.isGold)bd.push('Gold');if(u.isGreen)bd.push('Green');\nif(bd.length)a.push(bd.join('/'));\nreturn a.join(' | ');\n})()", "lastChapter": "@js:(function(){var d=(typeof result==='string')?JSON.parse(result):result;var u=(d.user&&d.user.user)||{},c=d.cam||{};var t=(c.show&&c.show.createdAt)?c.show.createdAt:(u.statusChangedAt||'');if(u.isLive)return '本次开播：'+lgTime(t);if(u.wentIdleAt)return '上次在线：'+lgTime(u.wentIdleAt);return t?('最近开播：'+lgTime(t)):'';})()", "name": "{{$.user.user.username}}", "tocUrl": "https://zh.virtualtaboo.live/api/front/v2/broadcasts/{{$.user.user.id}}?uniq=ix9yufd20we8bscq"}, "ruleContent": {"callBackJs": "(function(){\n  try{\n    var ev=String(event||'');\n    if(ev!=='addBookShelf' && ev!=='delBookShelf') return true;\n    var m=String((book&&book.bookUrl)||'').match(/models\\/(\\d+)/);\n    var id=m?m[1]:'';\n    if(!id) return true;\n    var ck=String(cookie.getCookie('https://zh.virtualtaboo.live/')||'');\n    if(!ck) return true;\n    var cfg=JSON.parse(String(java.ajax('https://zh.virtualtaboo.live/api/front/v3/config/initial-dynamic')));\n    var d=(cfg&&cfg.initialDynamic)||{};\n    var uid=(d.user&&d.user.id)||'';\n    if(!uid) return true;\n    var csrf=d.csrfToken||'',ts=d.csrfTimestamp||'',nt=d.csrfNotifyTimestamp||'';\n    var body=JSON.stringify({csrfToken:csrf,csrfTimestamp:ts,csrfNotifyTimestamp:nt,uniq:'u'+Date.now()});\n    var client=new Packages.okhttp3.OkHttpClient();\n    var mt=Packages.okhttp3.MediaType.parse('application/json');\n    var rb=Packages.okhttp3.RequestBody.create(mt,body);\n    var builder=new Packages.okhttp3.Request.Builder()\n      .url('https://zh.virtualtaboo.live/api/front/users/'+uid+'/favorites/'+id)\n      .addHeader('Cookie',ck)\n      .addHeader('Accept','application/json')\n      .addHeader('User-Agent','Mozilla/5.0 (Linux; Android 13) Chrome/120 Mobile');\n    if(ev==='addBookShelf'){ builder.put(rb); }\n    else { builder.delete(rb); }\n    var resp=client.newCall(builder.build()).execute();\n    if(resp.code()===200){ java.toast(ev==='addBookShelf'?'已同步到站点收藏':'已取消站点收藏'); }\n    else { java.toast('收藏同步失败('+resp.code()+')'); }\n  }catch(e){ try{java.toast('收藏同步异常：'+e);}catch(x){} }\n  return true;\n})()", "content": "@js:(function(){\nvar LG_PLAYER_HTML=\"<!DOCTYPE html>\\n<html lang=\\\"zh-CN\\\">\\n<head>\\n    <meta charset=\\\"UTF-8\\\">\\n    <meta name=\\\"viewport\\\" content=\\\"width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no\\\">\\n    <title></title>\\n</head>\\n    <style>\\n        * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Microsoft Yahei', sans-serif; }\\n        body { color: #333; padding: 0.1rem; min-height: 100vh; background: #f5f5f5; }\\n        .app-container { display: grid; grid-template-columns: 1fr; gap: 1rem; max-width: 1200px; margin: 0 auto; }\\n        .live-section { border-radius: 12px; overflow: hidden; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); border: 1px solid #eaeaea; background: #fff; }\\n        .topic-section { padding: 14px 20px; border-bottom: 1px solid #eaeaea; background: #fff; display: none; }\\n        .topic-label { font-size: 12px; color: #666; margin-bottom: 6px; display: flex; align-items: center; gap: 8px; font-weight: 500; }\\n        .topic-content { font-size: 15px; color: #333; font-weight: 500; line-height: 1.4; }\\n        .chat-section { border-radius: 12px; padding: 1rem; display: flex; flex-direction: column; height: 500px; border: 1px solid #eaeaea; background: #fff; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); }\\n        .chat-messages { flex: 1; overflow-y: auto; padding-right: 0.5rem; width: 100%; }\\n        .chat-messages::-webkit-scrollbar { width: 6px; }\\n        .chat-messages::-webkit-scrollbar-track { background: #f0f0f0; border-radius: 3px; }\\n        .chat-messages::-webkit-scrollbar-thumb { background: #c0c0c0; border-radius: 3px; }\\n        .message-wrapper { display: block; margin-bottom: 0.3rem; width: 100%; }\\n        .message-item { padding: 0.3rem 0.6rem; border-radius: 16px; font-size: 0.85rem; line-height: 1.3; border: 1px solid rgba(224, 224, 224, 0.6); display: block; background: #f8f8f8; color: #333; width: 100%; word-break: break-word; box-sizing: border-box; }\\n        .lovense-item { border-color: #e0e0e0; background: #f8f8f8; }\\n        .tip-item { border-color: #e0e0e0; background: #f8f8f8; }\\n        .system-message { border-color: #e0e0e0; color: #666; font-size: 0.85rem; margin: 0 auto 0.3rem auto; background: #f8f8f8; }\\n        .user-name { font-weight: 600; color: #222; margin-left: 0.4rem; }\\n        .level-tag { font-size: 0.75rem; color: #666; background: #f0f0f0; padding: 0.1rem 0.4rem; border-radius: 8px; }\\n        .tip-amount { color: #e74c3c; font-weight: 600; }\\n        .live-header { padding: 16px 20px; border-bottom: 1px solid #eaeaea; display: flex; align-items: center; gap: 15px; background: #fff; }\\n        .avatar-container { width: 56px; height: 56px; flex-shrink: 0; }\\n        .avatar { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; border: 3px solid #007aff; }\\n        .host-info { flex: 1; min-width: 0; }\\n        .host-info h2 { font-size: 18px; margin-bottom: 6px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: #333; }\\n        .status-container { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }\\n        .live-badge { display: inline-flex; align-items: center; background: #ff3b30; color: white; padding: 4px 10px; border-radius: 4px; font-size: 12px; font-weight: 600; letter-spacing: 0.3px; }\\n        .live-badge::before { content: ''; display: inline-block; width: 6px; height: 6px; background-color: white; border-radius: 50%; margin-right: 6px; animation: blink 1.5s infinite; }\\n        @keyframes blink { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } }\\n        .viewer-count { font-size: 13px; color: #666; display: flex; align-items: center; gap: 5px; }\\n        .player-container { position: relative; background: #000000; overflow: hidden; }\\n        .player-container:fullscreen { display: flex; align-items: center; justify-content: center; }\\n        .player-container:-webkit-full-screen { display: flex; align-items: center; justify-content: center; }\\n        #dplayer { width: 100% !important; height: 100% !important; display: flex; align-items: center; }\\n        #dplayer video { object-fit: contain !important; }\\n        .dplayer-controller { display: none !important; }\\n        .dplayer-notice { display: none !important; }\\n        .custom-controls { position: absolute; bottom: 0; left: 0; right: 0; padding: 12px 15px 6px; display: flex; align-items: center; justify-content: space-between; opacity: 0; transition: opacity 0.2s; z-index: 1000; pointer-events: none; }\\n        .player-container.controls-visible .custom-controls { opacity: 1; pointer-events: auto; }\\n        .player-container.controls-hidden .custom-controls { opacity: 0; pointer-events: none; }\\n        .left-controls, .right-controls { display: flex; align-items: center; gap: 8px; pointer-events: auto; }\\n        .rotate-btn { background: rgba(255, 255, 255, 0.15); border: 1px solid rgba(255, 255, 255, 0.25); color: rgba(255, 255, 255, 0.9); padding: 6px 10px; border-radius: 6px; cursor: pointer; font-size: 13px; font-weight: 500; white-space: nowrap; display: flex; align-items: center; justify-content: center; transition: all 0.15s; min-width: 52px; pointer-events: auto; }\\n        .rotate-btn:hover { background: rgba(255, 255, 255, 0.25); color: white; }\\n        .control-btn { background: rgba(255, 255, 255, 0.15); border: 1px solid rgba(255, 255, 255, 0.25); color: #ffffff; width: 36px; height: 36px; border-radius: 6px; display: flex; align-items: center; justify-content: center; cursor: pointer; font-size: 16px; transition: all 0.15s; pointer-events: auto; }\\n        .control-btn:disabled { opacity: 0.5; cursor: not-allowed; }\\n        .selector-btn { background: rgba(255, 255, 255, 0.15); border: 1px solid rgba(255, 255, 255, 0.25); color: #ffffff; padding: 6px 10px; border-radius: 6px; cursor: pointer; font-size: 13px; font-weight: 500; white-space: nowrap; display: flex; align-items: center; gap: 5px; transition: all 0.15s; min-width: 65px; justify-content: center; pointer-events: auto; }\\n        .selector-menu { position: absolute; bottom: 42px; background: #ffffff; border-radius: 8px; min-width: 90px; display: none; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.16); border: 1px solid #d1d1d6; overflow: hidden; z-index: 1001; pointer-events: auto; }\\n        .menu-item { padding: 8px 12px; color: #333; cursor: pointer; font-size: 13px; transition: all 0.15s; border-bottom: 1px solid #eaeaea; display: flex; align-items: center; justify-content: space-between; pointer-events: auto; }\\n        .menu-item:last-child { border-bottom: none; }\\n        .menu-item:hover:not(:disabled) { background: #007aff; color: white; }\\n        .menu-item.active { background: rgba(10, 132, 255, 0.1); color: #007aff; }\\n        .menu-item.active:after { content: \\\"✓\\\"; font-size: 12px; color: #007aff; }\\n        .loading-indicator { position: absolute; top: 15px; left: 15px; background: rgba(0, 0, 0, 0.8); color: white; padding: 6px 12px; border-radius: 4px; font-size: 12px; z-index: 1002; display: none; border: 1px solid rgba(255, 255, 255, 0.1); }\\n        .floating-button { position: fixed; bottom: 20px; right: 20px; width: 60px; height: 60px; border-radius: 50%; background: #007aff; color: white; display: flex; align-items: center; justify-content: center; cursor: pointer; box-shadow: 0 4px 12px rgba(0, 122, 255, 0.3); z-index: 10000; border: none; font-size: 24px; }\\n        .floating-panel { position: fixed; bottom: 90px; right: 20px; width: 400px; background: #ffffff; border-radius: 12px; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15); padding: 20px; z-index: 9999; border: 1px solid #eaeaea; display: none; max-height: 80vh; overflow-y: auto; }\\n        .floating-panel::-webkit-scrollbar { width: 6px; }\\n        .floating-panel::-webkit-scrollbar-track { background: #f0f0f0; border-radius: 3px; }\\n        .floating-panel::-webkit-scrollbar-thumb { background: #c0c0c0; border-radius: 3px; }\\n        .floating-panel-title { font-size: 18px; font-weight: 600; margin-bottom: 15px; color: #333; padding-bottom: 10px; border-bottom: 1px solid #eaeaea; }\\n        .floating-info-section { margin-bottom: 20px; }\\n        .floating-info-section-title { font-size: 15px; color: #007aff; margin-bottom: 12px; font-weight: 600; display: flex; align-items: center; gap: 8px; }\\n        .floating-info-item { margin-bottom: 12px; display: flex; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid #f5f5f5; }\\n        .floating-info-item:last-child { border-bottom: none; margin-bottom: 0; }\\n        .floating-info-label { font-size: 13px; color: #666; min-width: 120px; }\\n        .floating-info-value { font-size: 14px; color: #333; font-weight: 500; text-align: right; flex: 1; }\\n        .floating-content { background: #f8f9fa; border: 1px solid #eaeaea; border-radius: 8px; padding: 12px; font-size: 14px; color: #333; line-height: 1.5; margin-bottom: 15px; }\\n        .floating-price-list { display: flex; flex-direction: column; gap: 8px; }\\n        .floating-price-item { background: #ffffff; border: 1px solid #eaeaea; border-radius: 8px; padding: 10px 12px; display: flex; align-items: center; justify-content: space-between; transition: all 0.2s; }\\n        .floating-price-item:hover { border-color: #007aff; }\\n        .floating-price-activity { font-size: 14px; color: #333; flex: 1; }\\n        .floating-price-value { font-size: 14px; color: #ff3b30; font-weight: 600; }\\n        @media (max-width: 768px) {\\n            .floating-panel { width: 350px; right: 10px; bottom: 80px; }\\n            .floating-button { width: 50px; height: 50px; font-size: 20px; right: 15px; bottom: 15px; }\\n            .live-header { padding: 14px 16px; }\\n            .avatar-container { width: 48px; height: 48px; }\\n            .host-info h2 { font-size: 16px; }\\n        }\\n        @media (max-width: 480px) {\\n            .floating-panel { width: 300px; }\\n            .chat-section { height: 400px; }\\n            .app-container { padding: 0.5rem; gap: 1rem; }\\n        }\\n    \\n        /* ===== 移动端适配 ===== */\\n        html, body { width: 100%; max-width: 100%; overflow-x: hidden; }\\n        body { padding: 0 !important; }\\n        .app-container { padding: 8px !important; gap: 8px !important; }\\n        .live-section, .chat-section { border-radius: 10px; }\\n        .player-container { width: 100%; aspect-ratio: 16/9; }\\n        #dplayer, #dplayer video { width: 100% !important; height: 100% !important; }\\n        .chat-section { height: 42vh; min-height: 220px; padding: 0.6rem; }\\n        .live-header { padding: 10px 12px; gap: 10px; }\\n        .avatar-container { width: 44px; height: 44px; }\\n        .host-info h2 { font-size: 16px; }\\n        .topic-content { font-size: 14px; }\\n        .custom-controls { padding: 10px 10px 4px; }\\n        .selector-btn, .control-btn, .rotate-btn { min-width: 44px; min-height: 36px; font-size: 13px; }\\n        .control-btn { width: 40px; height: 40px; }\\n        .floating-button { width: 44px; height: 44px; right: 12px; bottom: 12px; font-size: 18px; }\\n        .floating-panel { width: auto !important; left: 8px; right: 8px; bottom: 68px; max-height: 68vh; padding: 14px; }\\n        .menu-item { padding: 10px 12px; }\\n        @media (max-width: 480px) {\\n            .app-container { padding: 6px !important; gap: 6px !important; }\\n            .chat-section { height: 38vh; min-height: 200px; }\\n            .floating-panel { width: auto !important; left: 8px; right: 8px; }\\n        }\\n</style>\\n<body>\\n    <div id=\\\"config\\\" style=\\\"display:none;\\\">\\n        <div id=\\\"liveData\\\" style=\\\"display:none;\\\">__LIVE_DATA__</div>\\n    </div>\\n    \\n    <div class=\\\"app-container\\\">\\n        <div class=\\\"live-section\\\">\\n            <div class=\\\"topic-section\\\" id=\\\"topicContainer\\\">\\n                <div class=\\\"topic-label\\\">\\n                    <i class=\\\"fas fa-bullhorn\\\"></i> 直播标题\\n                </div>\\n                <div class=\\\"topic-content\\\" id=\\\"topic\\\"></div>\\n            </div>\\n            \\n            <div class=\\\"live-header\\\">\\n                <div class=\\\"avatar-container\\\">\\n                    <img class=\\\"avatar\\\" id=\\\"avatarImg\\\" src=\\\"\\\" alt=\\\"\\\">\\n                </div>\\n                <div class=\\\"host-info\\\">\\n                    <h2 id=\\\"hostName\\\">正在加载...</h2>\\n                    <div class=\\\"status-container\\\">\\n                        <span class=\\\"live-badge\\\">直播中</span>\\n                        <div class=\\\"viewer-count\\\">\\n                            <i class=\\\"fas fa-users\\\"></i>\\n                            <span id=\\\"membersCount\\\">--</span> 人\\n                        </div>\\n                    </div>\\n                </div>\\n            </div>\\n            \\n            <div class=\\\"player-container\\\" id=\\\"playerContainer\\\">\\n                <div id=\\\"dplayer\\\"></div>\\n                <div class=\\\"loading-indicator\\\" id=\\\"loadingIndicator\\\">正在切换...</div>\\n                <div class=\\\"custom-controls\\\">\\n                    <div class=\\\"left-controls\\\">\\n                        <button class=\\\"control-btn\\\" id=\\\"refreshBtn\\\" title=\\\"刷新播放\\\">\\n                            <i class=\\\"fas fa-redo-alt\\\"></i>\\n                        </button>\\n                        <button class=\\\"control-btn\\\" id=\\\"volumeBtn\\\" title=\\\"静音/取消静音\\\">\\n                            <i class=\\\"fas fa-volume-up\\\"></i>\\n                        </button>\\n                        <div class=\\\"rotate-btn\\\" id=\\\"rotateBtn\\\">竖屏</div>\\n                    </div>\\n                    <div class=\\\"right-controls\\\">\\n                        <div class=\\\"line-selector\\\">\\n                            <div class=\\\"selector-btn\\\" id=\\\"lineBtn\\\" title=\\\"选择线路\\\">线路1 <i class=\\\"fas fa-chevron-down\\\"></i></div>\\n                            <div class=\\\"selector-menu\\\" id=\\\"lineMenu\\\"></div>\\n                        </div>\\n                        <div class=\\\"quality-selector\\\">\\n                            <div class=\\\"selector-btn\\\" id=\\\"qualityBtn\\\" title=\\\"选择清晰度\\\">默认 <i class=\\\"fas fa-chevron-down\\\"></i></div>\\n                            <div class=\\\"selector-menu\\\" id=\\\"qualityMenu\\\"></div>\\n                        </div>\\n                        <button class=\\\"control-btn\\\" id=\\\"fullscreenBtn\\\" title=\\\"全屏\\\">\\n                            <i class=\\\"fas fa-expand\\\"></i>\\n                        </button>\\n                    </div>\\n                </div>\\n            </div>\\n        </div>\\n        \\n        <div class=\\\"chat-section\\\">\\n             <div class=\\\"chat-messages\\\" id=\\\"chatContainer\\\"></div>\\n             <div id=\\\"chatbar\\\"><input id=\\\"ci\\\" placeholder=\\\"发送弹幕…\\\" maxlength=\\\"200\\\"><button id=\\\"cs\\\">发送</button></div>\\n        </div>\\n    </div>\\n    \\n    <button class=\\\"floating-button\\\" id=\\\"floatingBtn\\\">\\n        <i class=\\\"fas fa-info\\\"></i>\\n    </button>\\n    \\n    <div class=\\\"floating-panel\\\" id=\\\"floatingPanel\\\">\\n        <div class=\\\"floating-panel-title\\\">直播信息</div>\\n        \\n        <div class=\\\"floating-info-section\\\">\\n            <div class=\\\"floating-info-section-title\\\">\\n                <i class=\\\"fas fa-user\\\"></i> 主播信息\\n            </div>\\n            <div class=\\\"floating-info-item\\\">\\n                <span class=\\\"floating-info-label\\\">主播名称:</span>\\n                <span class=\\\"floating-info-value\\\" id=\\\"floatingHostName\\\">--</span>\\n            </div>\\n            <div class=\\\"floating-info-item\\\">\\n                <span class=\\\"floating-info-label\\\">历史最高排行:</span>\\n                <span class=\\\"floating-info-value\\\" id=\\\"floatingTopBestPlace\\\">--</span>\\n            </div>\\n            <div class=\\\"floating-info-item\\\">\\n                <span class=\\\"floating-info-label\\\">总人数:</span>\\n                <span class=\\\"floating-info-value\\\" id=\\\"floatingMembersCount\\\">--</span>\\n            </div>\\n            <div class=\\\"floating-info-item\\\">\\n                <span class=\\\"floating-info-label\\\">首次开播日期:</span>\\n                <span class=\\\"floating-info-value\\\" id=\\\"floatingTipMenuCreatedAt\\\">--</span>\\n            </div>\\n            <div class=\\\"floating-info-item\\\">\\n                <span class=\\\"floating-info-label\\\" id=\\\"floatingDurationLabel\\\">时长标签:</span>\\n                <span class=\\\"floating-info-value\\\" id=\\\"floatingDuration\\\">--</span>\\n            </div>\\n            <div class=\\\"floating-info-item\\\">\\n                <span class=\\\"floating-info-label\\\" id=\\\"floatingTimeLabel\\\">时间标签:</span>\\n                <span class=\\\"floating-info-value\\\" id=\\\"floatingStatusTime\\\">--</span>\\n            </div>\\n        </div>\\n        \\n        <div class=\\\"floating-info-section\\\" id=\\\"floatingUserDescriptionSection\\\">\\n            <div class=\\\"floating-info-section-title\\\">\\n                <i class=\\\"fas fa-user-circle\\\"></i> 主播介绍\\n            </div>\\n            <div class=\\\"floating-content\\\" id=\\\"floatingUserDescription\\\"></div>\\n        </div>\\n        \\n        <div class=\\\"floating-info-section\\\" id=\\\"floatingGoalSection\\\">\\n            <div class=\\\"floating-info-section-title\\\">\\n                <i class=\\\"fas fa-bullseye\\\"></i> 直播目标\\n            </div>\\n            <div class=\\\"floating-content\\\" id=\\\"floatingGoalDescription\\\"></div>\\n        </div>\\n        \\n        <div class=\\\"floating-info-section\\\" id=\\\"floatingFanClubSection\\\">\\n            <div class=\\\"floating-info-section-title\\\">\\n                <i class=\\\"fas fa-users\\\"></i> 粉丝团留言\\n            </div>\\n            <div class=\\\"floating-content\\\" id=\\\"floatingFanClubDescription\\\"></div>\\n        </div>\\n        \\n        <div class=\\\"floating-info-section\\\">\\n            <div class=\\\"floating-info-section-title\\\">\\n                <i class=\\\"fas fa-gift\\\"></i> 打赏菜单\\n            </div>\\n            <div class=\\\"floating-price-list\\\" id=\\\"floatingPriceList\\\"></div>\\n        </div>\\n        \\n        <div class=\\\"floating-info-section\\\">\\n            <div class=\\\"floating-info-section-title\\\">\\n                <i class=\\\"fas fa-tv\\\"></i> 播放设置\\n            </div>\\n            <div class=\\\"floating-info-item\\\">\\n                <span class=\\\"floating-info-label\\\">当前线路:</span>\\n                <span class=\\\"floating-info-value\\\" id=\\\"floatingLine\\\">线路1</span>\\n            </div>\\n            <div class=\\\"floating-info-item\\\">\\n                <span class=\\\"floating-info-label\\\">清晰度:</span>\\n                <span class=\\\"floating-info-value\\\" id=\\\"floatingQuality\\\">默认</span>\\n            </div>\\n        </div>\\n    </div>\\n\\n    <script src=\\\"https://cdn.jsdelivr.net/npm/dplayer@1.27.1/dist/DPlayer.min.js\\\"></script>\\n    <script src=\\\"https://cdn.jsdelivr.net/npm/hls.js@1.4.10/dist/hls.min.js\\\"></script>\\n    <script src=\\\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/js/all.min.js\\\"></script>\\n    <script>\\n        const liveDataElement = document.getElementById('liveData');\\n        let liveData = {};\\n        \\n        if (liveDataElement.textContent) {\\n            try {\\n                liveData = JSON.parse(liveDataElement.textContent);\\n            } catch (e) {}\\n        }\\n        \\n        const chatContainer = document.getElementById('chatContainer');\\n        let chatWs = null; let __lastSendId = 0;\\n\\n        function addSystemMessage(text) {\\n            const systemDiv = document.createElement('div');\\n            systemDiv.className = 'message-item system-message';\\n            systemDiv.textContent = text;\\n            chatContainer.prepend(systemDiv);\\n            chatContainer.scrollTop = 0;\\n        }\\n        \\n        function initChat() {\\n            if (!liveData.modelId || !liveData.websocketUrl || !liveData.websocketToken) return;\\n\\n            addSystemMessage('开始连接弹幕服务器');\\n            \\n            const timeoutMs = 10000;\\n            let connectTimeoutTimer = setTimeout(() => {\\n                if (chatWs && chatWs.readyState !== WebSocket.OPEN) {\\n                    chatWs.close();\\n                    addSystemMessage('连接超时：未能成功连接弹幕服务器');\\n                }\\n            }, timeoutMs);\\n            \\n            if (chatWs && chatWs.readyState === WebSocket.OPEN) {\\n                chatWs.close();\\n            }\\n            \\n            chatWs = new WebSocket(`${liveData.websocketUrl}`);\\n            window.__chatWs = chatWs;\\n            __lastSendId = 3;\\n            const sendQueue = [\\n                '{\\\"connect\\\":{\\\"token\\\":\\\"' + liveData.websocketToken + '\\\"},\\\"id\\\":1}',\\n                `{\\\"subscribe\\\":{\\\"channel\\\":\\\"newChatMessage@${liveData.modelId}\\\"},\\\"id\\\":2}`\\n            ];\\n            \\n            function getUserLevelTag(userData) {\\n                return userData?.userRanking?.level ? `<span class=\\\"level-tag\\\">Lv.${userData.userRanking.level}</span>` : '';\\n            }\\n            \\n            function createMessageElement(data) {\\n                const messageDiv = document.createElement('div');\\n                messageDiv.className = 'message-item';\\n                \\n                const { type, userData, details } = data.message;\\n                const levelTag = getUserLevelTag(userData);\\n                \\n                let content = '';\\n                switch(type) {\\n                    case 'text':\\n                        messageDiv.className += ' text-item';\\n                        content = `${levelTag}<span class=\\\"user-name\\\">${userData.username}</span>: ${details.body}`;\\n                        break;\\n                    case 'tip':\\n                        messageDiv.className += ' tip-item';\\n                        content = `${levelTag}<span class=\\\"user-name\\\">${userData.username}</span>: 已支付<span class=\\\"tip-amount\\\">${details.amount}</span>代币`;\\n                        break;\\n                    case 'lovense':\\n                        messageDiv.className += ' lovense-item';\\n                        const { power, time, amount } = details.lovenseDetails.detail;\\n                        const powerText = power === 'low' ? '低' : power === 'medium' ? '中' : '高';\\n                        const clientLevelTag = getUserLevelTag(details.lovenseDetails.clientUserInfo);\\n                        content = `${clientLevelTag}<span class=\\\"user-name\\\">${details.lovenseDetails.clientUserInfo.username}</span>: ${powerText}强度 · ${time}秒`;\\n                        break;\\n                    default:\\n                        return null;\\n                }\\n                \\n                messageDiv.innerHTML = content;\\n                return messageDiv;\\n            }\\n            \\n            function addMessageToPanel(messageData) {\\n                const messageElement = createMessageElement(messageData);\\n                if (messageElement) {\\n                    const messageWrapper = document.createElement('div');\\n                    messageWrapper.className = 'message-wrapper';\\n                    messageWrapper.appendChild(messageElement);\\n                    chatContainer.prepend(messageWrapper);\\n                    chatContainer.scrollTop = 0;\\n                }\\n            }\\n            \\n            chatWs.onopen = () => {\\n                clearTimeout(connectTimeoutTimer);\\n                sendQueue.forEach(cmd => chatWs.send(cmd));\\n                addSystemMessage('弹幕服务器连接正常');\\n            };\\n            \\n            chatWs.onmessage = (e) => {\\n                if (e.data.trim() === '{}') {\\n                    chatWs.send('{}');\\n                    return;\\n                }\\n                try {\\n                    const data = JSON.parse(e.data);\\n                    if (data.ping) {\\n                        chatWs.send(JSON.stringify({ pong: data.ping }));\\n                    }\\n                    if (data.id === __lastSendId) {\\n                        if (data.error) { addSystemMessage('发送失败：' + (data.error.message || data.error.code)); }\\n                        else { addSystemMessage('发送成功'); }\\n                    }\\n                    if (data.push?.channel === `newChatMessage@${liveData.modelId}`) {\\n                        addMessageToPanel(data.push.pub.data);\\n                    }\\n                } catch (error) {}\\n            };\\n            \\n            chatWs.onerror = (err) => {\\n                const errorDiv = document.createElement('div');\\n                errorDiv.className = 'message-item system-message';\\n                errorDiv.textContent = '连接错误';\\n                chatContainer.prepend(errorDiv);\\n                chatContainer.scrollTop = 0;\\n            };\\n            \\n            chatWs.onclose = (e) => {\\n                const closeDiv = document.createElement('div');\\n                closeDiv.className = 'message-item system-message';\\n                closeDiv.textContent = `连接关闭 | 错误码: ${e.code}`;\\n                chatContainer.prepend(closeDiv);\\n                chatContainer.scrollTop = 0;\\n            };\\n        }\\n        \\n        const elements = {\\n            avatarImg: document.getElementById('avatarImg'),\\n            hostName: document.getElementById('hostName'),\\n            refreshBtn: document.getElementById('refreshBtn'),\\n            volumeBtn: document.getElementById('volumeBtn'),\\n            lineBtn: document.getElementById('lineBtn'),\\n            lineMenu: document.getElementById('lineMenu'),\\n            qualityBtn: document.getElementById('qualityBtn'),\\n            qualityMenu: document.getElementById('qualityMenu'),\\n            fullscreenBtn: document.getElementById('fullscreenBtn'),\\n            loadingIndicator: document.getElementById('loadingIndicator'),\\n            playerContainer: document.getElementById('playerContainer'),\\n            membersCount: document.getElementById('membersCount'),\\n            floatingBtn: document.getElementById('floatingBtn'),\\n            floatingPanel: document.getElementById('floatingPanel'),\\n            floatingHostName: document.getElementById('floatingHostName'),\\n            floatingTopBestPlace: document.getElementById('floatingTopBestPlace'),\\n            floatingMembersCount: document.getElementById('floatingMembersCount'),\\n            floatingTipMenuCreatedAt: document.getElementById('floatingTipMenuCreatedAt'),\\n            floatingTopic: document.getElementById('floatingTopic'),\\n            floatingTopicSection: document.getElementById('floatingTopicSection'),\\n            floatingGoalDescription: document.getElementById('floatingGoalDescription'),\\n            floatingGoalSection: document.getElementById('floatingGoalSection'),\\n            floatingUserDescription: document.getElementById('floatingUserDescription'),\\n            floatingUserDescriptionSection: document.getElementById('floatingUserDescriptionSection'),\\n            floatingFanClubDescription: document.getElementById('floatingFanClubDescription'),\\n            floatingFanClubSection: document.getElementById('floatingFanClubSection'),\\n            floatingPriceList: document.getElementById('floatingPriceList'),\\n            floatingDurationLabel: document.getElementById('floatingDurationLabel'),\\n            floatingDuration: document.getElementById('floatingDuration'),\\n            floatingTimeLabel: document.getElementById('floatingTimeLabel'),\\n            floatingStatusTime: document.getElementById('floatingStatusTime'),\\n            floatingLine: document.getElementById('floatingLine'),\\n            floatingQuality: document.getElementById('floatingQuality'),\\n            topicContainer: document.getElementById('topicContainer'),\\n            topic: document.getElementById('topic'),\\n            rotateBtn: document.getElementById('rotateBtn')\\n        };\\n        \\n        let dp = null;\\n        let isMuted = false;\\n        let isFullscreen = false;\\n        let hlsInstance = null;\\n        let durationInterval = null;\\n        let config = {};\\n        let hideControlsTimer = null;\\n        \\n        const getStreamUrl = (lineIndex = config.currentLine || 0, quality = config.currentQuality || 'auto') => {\\n            const line = config.hlsLines?.[lineIndex];\\n            if (!line || !config.stream) return '';\\n            \\n            const pureStatus = (config.status || '').toLowerCase();\\n            let suffix = '_auto';\\n            \\n            if (pureStatus !== 'public') {\\n                suffix = '_160p_blurred';\\n            } else if (quality === 'auto') {\\n                suffix = '_auto';\\n            } else {\\n                suffix = '_' + quality;\\n            }\\n            \\n            return `https://edge-hls.${line}/hls/${config.stream}/master/${config.stream}${suffix}.m3u8?pkey=bXorqTB5ZhP5FcpX`;\\n        };\\n        \\n        function showControls() {\\n            elements.playerContainer.classList.remove('controls-hidden');\\n            elements.playerContainer.classList.add('controls-visible');\\n            if (hideControlsTimer) {\\n                clearTimeout(hideControlsTimer);\\n            }\\n            hideControlsTimer = setTimeout(() => {\\n                elements.playerContainer.classList.remove('controls-visible');\\n                elements.playerContainer.classList.add('controls-hidden');\\n            }, 3000);\\n        }\\n        \\n        function switchStream(url) {\\n            if (!dp || !dp.video || !url) return;\\n            \\n            config.isSwitching = true;\\n            elements.loadingIndicator.style.display = 'block';\\n            showControls();\\n            \\n            const video = dp.video;\\n            video.pause();\\n            video.src = '';\\n            video.load();\\n            \\n            if (hlsInstance) {\\n                try {\\n                    hlsInstance.stopLoad();\\n                    setTimeout(() => {\\n                        hlsInstance.destroy();\\n                        hlsInstance = null;\\n                        startNewStream(url, video);\\n                    }, 50);\\n                } catch (e) {\\n                    hlsInstance.destroy();\\n                    hlsInstance = null;\\n                    startNewStream(url, video);\\n                }\\n            } else {\\n                startNewStream(url, video);\\n            }\\n        }\\n        \\n        function startNewStream(url, video) {\\n            video.src = url;\\n            \\n            if (Hls.isSupported()) {\\n                hlsInstance = new Hls({\\n                    enableWorker: true,\\n                    lowLatencyMode: true,\\n                    backBufferLength: 60,\\n                    maxBufferSize: 30 * 1000 * 1000,\\n                    maxBufferLength: 30\\n                });\\n                \\n                hlsInstance.loadSource(url);\\n                hlsInstance.attachMedia(video);\\n                \\n                hlsInstance.on(Hls.Events.MANIFEST_PARSED, () => {\\n                    completeSwitch();\\n                    video.play().catch(e => {});\\n                });\\n                \\n                hlsInstance.on(Hls.Events.ERROR, (event, data) => {\\n                    if (data.fatal) {\\n                        switch(data.type) {\\n                            case Hls.ErrorTypes.NETWORK_ERROR:\\n                                hlsInstance.startLoad();\\n                                break;\\n                            case Hls.ErrorTypes.MEDIA_ERROR:\\n                                hlsInstance.recoverMediaError();\\n                                break;\\n                            default:\\n                                completeSwitch();\\n                                break;\\n                        }\\n                    }\\n                });\\n                \\n                setTimeout(() => {\\n                    if (config.isSwitching) {\\n                        completeSwitch();\\n                    }\\n                }, 5000);\\n                \\n            } else if (video.canPlayType('application/vnd.apple.mpegurl')) {\\n                video.addEventListener('loadedmetadata', () => {\\n                    completeSwitch();\\n                    video.play().catch(e => {});\\n                });\\n                \\n                video.addEventListener('error', () => {\\n                    completeSwitch();\\n                });\\n                \\n                setTimeout(() => {\\n                    if (config.isSwitching) {\\n                        completeSwitch();\\n                    }\\n                }, 5000);\\n            } else {\\n                completeSwitch();\\n            }\\n        }\\n        \\n        function completeSwitch() {\\n            config.isSwitching = false;\\n            elements.loadingIndicator.style.display = 'none';\\n        }\\n        \\n        function initPlayer() {\\n            config = { ...liveData, currentLine: 0, currentQuality: 'auto', isSwitching: false };\\n            \\n            const url = getStreamUrl();\\n            if (!url) return;\\n            \\n            if (dp) {\\n                dp.destroy();\\n                dp = null;\\n            }\\n            \\n            dp = new DPlayer({\\n                container: document.getElementById('dplayer'),\\n                live: true,\\n                autoplay: true,\\n                theme: '#00a1d6',\\n                loop: false,\\n                lang: 'zh-cn',\\n                screenshot: false,\\n                hotkey: false,\\n                preload: 'auto',\\n                volume: 0.7,\\n                mutex: true,\\n                controls: false,\\n                video: {\\n                    url: url,\\n                    pic: config.coverImg,\\n                    type: 'customHls',\\n                    customType: {\\n                        customHls: function(video, player) {}\\n                    }\\n                },\\n                contextmenu: [],\\n                danmaku: false\\n            });\\n            \\n            const videoElement = dp.video;\\n            if (videoElement) {\\n                videoElement.style.pointerEvents = 'none';\\n                videoElement.addEventListener('click', function(e) {\\n                    e.preventDefault();\\n                    e.stopPropagation();\\n                    return false;\\n                });\\n            }\\n            \\n            const dplayerContainer = dp.container;\\n            dplayerContainer.style.pointerEvents = 'none';\\n            dplayerContainer.addEventListener('click', function(e) {\\n                e.preventDefault();\\n                e.stopPropagation();\\n                return false;\\n            });\\n            \\n            isMuted = dp.video.muted;\\n            elements.volumeBtn.innerHTML = isMuted \\n                ? '<i class=\\\"fas fa-volume-mute\\\"></i>'\\n                : '<i class=\\\"fas fa-volume-up\\\"></i>';\\n            \\n            switchStream(url);\\n        }\\n\\n        function refreshPlayer() {\\n            if (config.isSwitching || !config.stream) return;\\n            const url = getStreamUrl(config.currentLine, config.currentQuality);\\n            switchStream(url);\\n        }\\n        \\n        function switchLine(lineIndex) {\\n            if (config.isSwitching || !config.hlsLines || lineIndex >= config.hlsLines.length) return;\\n            config.currentLine = lineIndex;\\n            elements.lineBtn.innerHTML = `线路${lineIndex + 1} <i class=\\\"fas fa-chevron-down\\\"></i>`;\\n            elements.floatingLine.textContent = `线路${lineIndex + 1}`;\\n            updateLineMenuHighlights();\\n            elements.lineMenu.style.display = 'none';\\n            \\n            const url = getStreamUrl(lineIndex, config.currentQuality);\\n            switchStream(url);\\n        }\\n        \\n        function switchQuality(quality) {\\n            if (config.isSwitching) return;\\n            config.currentQuality = quality;\\n            const displayText = quality === 'auto' ? '默认' : quality;\\n            elements.qualityBtn.innerHTML = `${displayText} <i class=\\\"fas fa-chevron-down\\\"></i>`;\\n            elements.floatingQuality.textContent = displayText;\\n            updateQualityMenuHighlights();\\n            elements.qualityMenu.style.display = 'none';\\n            \\n            const url = getStreamUrl(config.currentLine, quality);\\n            switchStream(url);\\n        }\\n        \\n        function formatDuration(seconds) {\\n            if (!seconds) return '0秒';\\n            \\n            const days = Math.floor(seconds / (24 * 60 * 60));\\n            const hours = Math.floor((seconds % (24 * 60 * 60)) / (60 * 60));\\n            const minutes = Math.floor((seconds % (60 * 60)) / 60);\\n            const secs = Math.floor(seconds % 60);\\n            \\n            let result = '';\\n            if (days > 0) result += `${days}天`;\\n            if (hours > 0) result += `${hours}小时`;\\n            if (minutes > 0) result += `${minutes}分钟`;\\n            if (secs > 0 || result === '') result += `${secs}秒`;\\n            \\n            return result;\\n        }\\n        \\n        function updateTimeInfo() {\\n            if (!config.status || !config.startTime) return;\\n            \\n            const pureStatus = config.status.replace(/^状态：/, '').toLowerCase();\\n            const isPublic = pureStatus === 'public';\\n            const startTime = config.startTime ? new Date(config.startTime).getTime() : null;\\n            const now = Date.now();\\n            \\n            if (config.isLive && startTime) {\\n                if (isPublic) {\\n                    elements.floatingDurationLabel.textContent = '直播时长:';\\n                    elements.floatingTimeLabel.textContent = '直播时间:';\\n                    \\n                    const duration = Math.floor((now - startTime) / 1000);\\n                    const durationText = formatDuration(duration);\\n                    elements.floatingDuration.textContent = durationText;\\n                    \\n                    const startDate = new Date(startTime);\\n                    elements.floatingStatusTime.textContent = startDate.toLocaleString();\\n                } else {\\n                    elements.floatingDurationLabel.textContent = '持续时长:';\\n                    elements.floatingTimeLabel.textContent = '私密直播:';\\n                    \\n                    const duration = Math.floor((now - startTime) / 1000);\\n                    const durationText = formatDuration(duration);\\n                    elements.floatingDuration.textContent = durationText;\\n                    \\n                    const startDate = new Date(startTime);\\n                    elements.floatingStatusTime.textContent = startDate.toLocaleString();\\n                }\\n            } else if (startTime) {\\n                elements.floatingDurationLabel.textContent = '持续时长:';\\n                elements.floatingTimeLabel.textContent = '下播时间:';\\n                \\n                const duration = Math.floor((now - startTime) / 1000);\\n                let durationText = formatDuration(duration);\\n                elements.floatingDuration.textContent = durationText;\\n                \\n                const endDate = new Date(startTime);\\n                elements.floatingStatusTime.textContent = endDate.toLocaleString();\\n            } else {\\n                elements.floatingDuration.textContent = '--';\\n                elements.floatingStatusTime.textContent = '--';\\n            }\\n        }\\n        \\n        function startDurationUpdate() {\\n            if (durationInterval) {\\n                clearInterval(durationInterval);\\n            }\\n            \\n            updateTimeInfo();\\n            durationInterval = setInterval(updateTimeInfo, 1000);\\n        }\\n        \\n        function updateFloatingPanel() {\\n            const pureUsername = (config.username || '').split('/').pop() || config.username || '';\\n            elements.floatingHostName.textContent = pureUsername || '未知主播';\\n            elements.membersCount.textContent = config.membersCount > 0 ? config.membersCount.toLocaleString() : '--';\\n            elements.floatingMembersCount.textContent = config.membersCount > 0 ? config.membersCount.toLocaleString() : '--';\\n            \\n            if (config.topBestPlace > 0) {\\n                const rankText = `TOP ${config.topBestPlace}`;\\n                elements.floatingTopBestPlace.textContent = rankText;\\n            } else {\\n                elements.floatingTopBestPlace.textContent = '未上榜';\\n            }\\n            \\n            if (config.tipMenuCreatedAt) {\\n                const createdAt = new Date(config.tipMenuCreatedAt);\\n                elements.floatingTipMenuCreatedAt.textContent = createdAt.toLocaleString();\\n            } else {\\n                elements.floatingTipMenuCreatedAt.textContent = '--';\\n            }\\n            \\n            if (config.userDescription && config.userDescription.trim() !== '') {\\n                elements.floatingUserDescription.textContent = config.userDescription;\\n                elements.floatingUserDescriptionSection.style.display = 'block';\\n            } else {\\n                elements.floatingUserDescriptionSection.style.display = 'none';\\n            }\\n            \\n            if (config.goalDescription && config.goalDescription.trim() !== '') {\\n                elements.floatingGoalDescription.textContent = config.goalDescription;\\n                elements.floatingGoalSection.style.display = 'block';\\n            } else {\\n                elements.floatingGoalSection.style.display = 'none';\\n            }\\n            \\n            if (config.fanClubDescription && config.fanClubDescription.trim() !== '') {\\n                elements.floatingFanClubDescription.textContent = config.fanClubDescription;\\n                elements.floatingFanClubSection.style.display = 'block';\\n            } else {\\n                elements.floatingFanClubSection.style.display = 'none';\\n            }\\n            \\n            if (config.tipMenuPriceList && config.tipMenuPriceList.length > 0) {\\n                elements.floatingPriceList.innerHTML = '';\\n                config.tipMenuPriceList.forEach((tip) => {\\n                    const priceItem = document.createElement('div');\\n                    priceItem.className = 'floating-price-item';\\n                    \\n                    const activityDiv = document.createElement('div');\\n                    activityDiv.className = 'floating-price-activity';\\n                    activityDiv.textContent = tip.activity || '未命名';\\n                    \\n                    const priceDiv = document.createElement('div');\\n                    priceDiv.className = 'floating-price-value';\\n                    priceDiv.textContent = `${tip.price || 0} 代币`;\\n                    \\n                    priceItem.appendChild(activityDiv);\\n                    priceItem.appendChild(priceDiv);\\n                    elements.floatingPriceList.appendChild(priceItem);\\n                });\\n            } else {\\n                elements.floatingPriceList.innerHTML = '<div class=\\\"floating-price-item\\\"><div class=\\\"floating-price-activity\\\">暂无打赏菜单</div></div>';\\n            }\\n            \\n            startDurationUpdate();\\n        }\\n        \\n        function initUI() {\\n            const pureUsername = (config.username || '').split('/').pop() || config.username || '';\\n            elements.hostName.textContent = pureUsername || '未知主播';\\n            \\n            if (config.topic && config.topic.trim() !== '') {\\n                elements.topic.textContent = config.topic;\\n                elements.topicContainer.style.display = 'block';\\n                document.title = config.topic;\\n            } else {\\n                elements.topicContainer.style.display = 'none';\\n                document.title = pureUsername || '直播间';\\n            }\\n            \\n            if (config.avatarUrl) {\\n                const prefix = 'https://static-cdn.strpst.com';\\n                if (config.avatarUrl.startsWith(prefix + prefix)) {\\n                    config.avatarUrl = config.avatarUrl.replace(prefix + prefix, prefix);\\n                }\\n                elements.avatarImg.src = config.avatarUrl;\\n            } else {\\n                elements.avatarImg.src = '主播';\\n            }\\n            \\n            updateFloatingPanel();\\n        }\\n        \\n        function initLineMenu() {\\n            elements.lineMenu.innerHTML = '';\\n            \\n            if (!config.hlsLines || config.hlsLines.length === 0) {\\n                const item = document.createElement('div');\\n                item.className = 'menu-item';\\n                item.textContent = '无线路';\\n                item.style.opacity = '0.6';\\n                elements.lineMenu.appendChild(item);\\n                return;\\n            }\\n            \\n            config.hlsLines.forEach((line, index) => {\\n                const item = document.createElement('div');\\n                item.className = `menu-item ${index === config.currentLine ? 'active' : ''}`;\\n                item.textContent = `线路${index + 1}`;\\n                item.dataset.index = index;\\n                item.onclick = (e) => {\\n                    e.stopPropagation();\\n                    switchLine(index);\\n                };\\n                elements.lineMenu.appendChild(item);\\n            });\\n        }\\n        \\n        function initQualityMenu() {\\n            elements.qualityMenu.innerHTML = '';\\n            const pureStatus = (config.status || '').replace(/^状态：/, '').toLowerCase();\\n            \\n            let availableQualities = [];\\n            availableQualities.push({ value: 'auto', display: '默认' });\\n            \\n            if (pureStatus !== 'public') {\\n                availableQualities = [{ value: '160p_blurred', display: '模糊' }];\\n                config.currentQuality = '160p_blurred';\\n            } else if (config.pixelatedResolutions && config.pixelatedResolutions.length > 0) {\\n                config.pixelatedResolutions.forEach(resolution => {\\n                    if (resolution !== '160p_blurred') {\\n                        availableQualities.push({ \\n                            value: resolution, \\n                            display: resolution \\n                        });\\n                    }\\n                });\\n            }\\n            \\n            availableQualities.forEach((quality) => {\\n                const isActive = quality.value === config.currentQuality;\\n                const item = document.createElement('div');\\n                item.className = `menu-item ${isActive ? 'active' : ''}`;\\n                item.textContent = quality.display;\\n                item.dataset.quality = quality.value;\\n                item.onclick = (e) => {\\n                    e.stopPropagation();\\n                    switchQuality(quality.value);\\n                };\\n                elements.qualityMenu.appendChild(item);\\n            });\\n            \\n            const currentQuality = availableQualities.find(q => q.value === config.currentQuality);\\n            const displayText = currentQuality ? currentQuality.display : '默认';\\n            elements.qualityBtn.innerHTML = `${displayText} <i class=\\\"fas fa-chevron-down\\\"></i>`;\\n            elements.floatingQuality.textContent = displayText;\\n        }\\n        \\n        function updateLineMenuHighlights() {\\n            const items = elements.lineMenu.querySelectorAll('.menu-item');\\n            items.forEach((item, index) => {\\n                if (index === config.currentLine) {\\n                    item.classList.add('active');\\n                } else {\\n                    item.classList.remove('active');\\n                }\\n            });\\n        }\\n        \\n        function updateQualityMenuHighlights() {\\n            const items = elements.qualityMenu.querySelectorAll('.menu-item');\\n            items.forEach((item) => {\\n                const quality = item.dataset.quality;\\n                if (quality === config.currentQuality) {\\n                    item.classList.add('active');\\n                } else {\\n                    item.classList.remove('active');\\n                }\\n            });\\n        }\\n        \\n        async function handleRotateClick() {\\n            try {\\n                if (!document.fullscreenElement) {\\n                    await elements.playerContainer.requestFullscreen();\\n                }\\n                \\n                if (screen.orientation) {\\n                    const type = screen.orientation.type;\\n                    if (type.startsWith('portrait')) {\\n                        await screen.orientation.lock('landscape');\\n                        elements.rotateBtn.textContent = '横屏';\\n                    } else {\\n                        await screen.orientation.lock('portrait');\\n                        elements.rotateBtn.textContent = '横屏';\\n                    }\\n                }\\n                showControls();\\n            } catch (err) {}\\n        }\\n        \\n        function bindEvents() {\\n            elements.refreshBtn.addEventListener('click', (e) => {\\n                e.stopPropagation();\\n                refreshPlayer();\\n                showControls();\\n            });\\n            \\n            elements.volumeBtn.addEventListener('click', (e) => {\\n                e.stopPropagation();\\n                if (dp && dp.video && !config.isSwitching) {\\n                    isMuted = !isMuted;\\n                    dp.video.muted = isMuted;\\n                    elements.volumeBtn.innerHTML = isMuted \\n                        ? '<i class=\\\"fas fa-volume-mute\\\"></i>'\\n                        : '<i class=\\\"fas fa-volume-up\\\"></i>';\\n                }\\n                showControls();\\n            });\\n            \\n            elements.fullscreenBtn.addEventListener('click', (e) => {\\n                e.stopPropagation();\\n                if (!isFullscreen) {\\n                    const container = document.querySelector('.player-container');\\n                    if (container.requestFullscreen) {\\n                        container.requestFullscreen();\\n                    } else if (container.webkitRequestFullscreen) {\\n                        container.webkitRequestFullscreen();\\n                    }\\n                    elements.fullscreenBtn.innerHTML = '<i class=\\\"fas fa-compress\\\"></i>';\\n                } else {\\n                    if (document.exitFullscreen) {\\n                        document.exitFullscreen();\\n                    } else if (document.webkitExitFullscreen) {\\n                        document.webkitExitFullscreen();\\n                    }\\n                    elements.fullscreenBtn.innerHTML = '<i class=\\\"fas fa-expand\\\"></i>';\\n                }\\n                isFullscreen = !isFullscreen;\\n                showControls();\\n            });\\n            \\n            elements.lineBtn.addEventListener('click', (e) => {\\n                e.stopPropagation();\\n                elements.lineMenu.style.display = \\n                    elements.lineMenu.style.display === 'block' ? 'none' : 'block';\\n                elements.qualityMenu.style.display = 'none';\\n                updateLineMenuHighlights();\\n                showControls();\\n            });\\n            \\n            elements.qualityBtn.addEventListener('click', (e) => {\\n                e.stopPropagation();\\n                elements.qualityMenu.style.display = \\n                    elements.qualityMenu.style.display === 'block' ? 'none' : 'block';\\n                elements.lineMenu.style.display = 'none';\\n                updateQualityMenuHighlights();\\n                showControls();\\n            });\\n            \\n            elements.rotateBtn.addEventListener('click', (e) => {\\n                e.stopPropagation();\\n                handleRotateClick();\\n            });\\n            \\n            elements.playerContainer.addEventListener('touchstart', (e) => {\\n                if (e.target.closest('.custom-controls, .selector-menu, .control-btn, .selector-btn, .menu-item, .rotate-btn')) {\\n                    showControls();\\n                    return;\\n                }\\n                \\n                if (elements.playerContainer.classList.contains('controls-hidden')) {\\n                    showControls();\\n                } else {\\n                    elements.playerContainer.classList.remove('controls-visible');\\n                    elements.playerContainer.classList.add('controls-hidden');\\n                    if (hideControlsTimer) {\\n                        clearTimeout(hideControlsTimer);\\n                        hideControlsTimer = null;\\n                    }\\n                }\\n            });\\n            \\n            document.addEventListener('click', (e) => {\\n                if (!e.target.closest('.selector-btn')) {\\n                    elements.lineMenu.style.display = 'none';\\n                    elements.qualityMenu.style.display = 'none';\\n                }\\n            });\\n            \\n            document.addEventListener('fullscreenchange', handleFullscreenChange);\\n            document.addEventListener('webkitfullscreenchange', handleFullscreenChange);\\n            \\n            elements.floatingBtn.addEventListener('click', (e) => {\\n                e.stopPropagation();\\n                elements.floatingPanel.style.display = \\n                    elements.floatingPanel.style.display === 'block' ? 'none' : 'block';\\n            });\\n            \\n            document.addEventListener('click', (e) => {\\n                if (!e.target.closest('.floating-button') && !e.target.closest('.floating-panel')) {\\n                    elements.floatingPanel.style.display = 'none';\\n                }\\n            });\\n        }\\n        \\n        function handleFullscreenChange() {\\n            const isFullscreenNow = !!(document.fullscreenElement || \\n                document.webkitFullscreenElement);\\n            if (!isFullscreenNow) {\\n                elements.fullscreenBtn.innerHTML = '<i class=\\\"fas fa-expand\\\"></i>';\\n                isFullscreen = false;\\n            }\\n        }\\n        \\n        function initializeApp() {\\n            if (!liveData || Object.keys(liveData).length === 0) return;\\n            \\n            addSystemMessage('正在读取直播间信息');\\n            \\n            config = { ...liveData, currentLine: 0, currentQuality: 'auto', isSwitching: false };\\n            \\n            initUI();\\n            initLineMenu();\\n            initQualityMenu();\\n            initPlayer();\\n            bindEvents();\\n            initChat();\\n            \\n            elements.playerContainer.classList.add('controls-visible');\\n            showControls();\\n        }\\n        \\n        document.addEventListener('DOMContentLoaded', initializeApp);\\n    </script>\\n<script>(function(){\\nfunction fit(){try{\\n var pc=document.getElementById('playerContainer');\\n var v=document.querySelector('#dplayer video')||document.querySelector('video');\\n if(!pc||!v)return;\\n var w=pc.clientWidth||window.innerWidth||360;\\n var ar=(v.videoWidth&&v.videoHeight)?(v.videoWidth/v.videoHeight):(16/9);\\n var h=Math.round(w/ar);\\n var max=Math.round((window.innerHeight||640)*0.75);\\n if(h>max)h=max;\\n if(h<120)h=Math.round(w*9/16);\\n pc.style.aspectRatio='auto';\\n pc.style.height=h+'px';\\n}catch(e){}}\\nsetInterval(fit,1500);\\nwindow.addEventListener('resize',fit);\\ndocument.addEventListener('loadedmetadata',fit,true);\\ndocument.addEventListener('playing',fit,true);\\nsetTimeout(fit,800);setTimeout(fit,2500);\\n})();</script>\\n<script>(function(){try{\\nvar ck=((window.liveData&&liveData.cookieHeader)||'');\\nck.split(';').forEach(function(p){p=p.trim();if(p&&p.indexOf('=')>0){document.cookie=p+'; path=/';}});\\n}catch(e){}})();</script>\\n<script>(function(){\\nfunction sys(t){try{var box=(document.getElementById('chatContainer')||document.getElementById('chat'));var d=document.createElement('div');d.className='m';d.style.color='#7fd1ff';d.textContent=t;box.appendChild(d);box.scrollTop=box.scrollHeight;}catch(e){}}\\nsetTimeout(function(){\\n fetch('/api/front/v3/config/initial-dynamic',{credentials:'include'}).then(function(r){return r.text().then(function(t){return {s:r.status,t:t};});}).then(function(x){\\n  var user=null;try{var j=JSON.parse(x.t);user=(j.initialDynamic&&j.initialDynamic.user)||null;}catch(e){}\\n  sys('登录态：'+(user?('已登录 '+user.username):'未登录（接口状态 '+x.s+'）'));\\n }).catch(function(e){ sys('登录态检测失败：'+e); });\\n},1200);\\n})();</script>\\n<script>(function(){\\nfunction sys(t){try{var box=(document.getElementById('chatContainer')||document.getElementById('chat'));var d=document.createElement('div');d.className='m';d.style.color='#ff9b9b';d.textContent=t;box.appendChild(d);box.scrollTop=box.scrollHeight;}catch(e){}}\\nfunction send(){\\n try{\\n  var inp=document.getElementById('ci'); if(!inp) return;\\n  var txt=(inp.value||'').trim(); if(!txt) return;\\n  if(!liveData||!liveData.modelId){ sys('缺少模型ID'); return; }\\n  inp.value='';\\n  fetch('/api/front/models/'+liveData.modelId+'/chat',{method:'POST',credentials:'include',headers:{'Content-Type':'application/json','Accept':'application/json'},body:JSON.stringify({text:txt,csrfToken:(liveData.csrfToken||''),csrfTimestamp:(liveData.csrfTimestamp||''),csrfNotifyTimestamp:(liveData.csrfNotifyTimestamp||''),uniq:(liveData.uniq||('u'+Date.now()+Math.random().toString(16).slice(2)))})})\\n   .then(function(r){return r.text().then(function(t){return {ok:r.ok,status:r.status,t:t};});})\\n   .then(function(x){\\n     if(x.ok){ sys('发送成功'); }\\n     else { var msg=''; try{var j=JSON.parse(x.t);msg=j.error||(j.data&&JSON.stringify(j.data))||x.t;}catch(e){msg=x.t||x.status;} var hs=String(x.t).trim().slice(0,1)==='<'?'（返回HTML，可能未登录/风控）':''; sys('发送失败('+x.status+')'+hs+'：'+String(msg).slice(0,120)); }\\n   })\\n   .catch(function(e){ sys('发送异常：'+e); });\\n }catch(e){ sys('发送异常：'+e); }\\n}\\nvar b=document.getElementById('cs'); if(b) b.addEventListener('click',send);\\nvar i=document.getElementById('ci'); if(i) i.addEventListener('keydown',function(e){ if(e.key==='Enter'){ e.preventDefault(); send(); } });\\n})();</script>\\n<script>(function(){\\nfunction sys(t){try{var box=(document.getElementById('chatContainer')||document.getElementById('chat'));if(!box)return;var d=document.createElement('div');d.className='m';d.style.color='#ffd479';d.textContent=t;box.appendChild(d);box.scrollTop=box.scrollHeight;}catch(e){}}\\nvar reconnecting=false, attempts=0;\\nsetInterval(function(){\\n  try{\\n    if(typeof chatWs==='undefined'||!chatWs) return;\\n    if(chatWs.readyState===3){\\n      if(reconnecting) return; reconnecting=true;\\n      attempts++;\\n      if(attempts>8){ sys('弹幕重连次数过多，请重新打开播放器'); return; }\\n      sys('弹幕断开，正在重连('+attempts+')…');\\n      fetch('/api/front/v3/config/initial-dynamic',{credentials:'include'})\\n        .then(function(r){return r.json();})\\n        .then(function(j){\\n          var d=(j&&j.initialDynamic)||{}, w=d.websocket||{};\\n          if(w.url) liveData.websocketUrl=w.url;\\n          if(w.token) liveData.websocketToken=w.token;\\n          try{ initChat(); }catch(e){}\\n        })\\n        .catch(function(){})\\n        .then(function(){ setTimeout(function(){ reconnecting=false; }, 4000); });\\n    }\\n  }catch(e){}\\n},3000);\\n})();</script>\\n</body></html>\";\nvar url=String(chapter.url||'');\nvar t=Number(book.type||0);\nvar web=false;\ntry{var v=JSON.parse(String(source.getVariable()||'{}'));if(String(v.webMode)==='1')web=true;if(String(v.playMode)==='web')web=true;}catch(e){}\nif((t&8)===8&&(t&4)!==4)web=true;\nif(!web)return url;\nvar id='';try{var mt=String(book.bookUrl||'').match(/models\\/(\\d+)/);id=mt?mt[1]:'';}catch(e){}\nif(!id){try{var mu=url.match(/\\/models\\/(\\d+)\\//);id=mu?mu[1]:'';}catch(e){}}\nif(!id)return url;\n  var cam={},bc={},cfg={},mem={};\n  try{cam=JSON.parse(String(java.ajax('https://zh.virtualtaboo.live/api/front/v2/models/'+id+'/cam?uniq=0')));}catch(e){}\n  try{bc=(JSON.parse(String(java.ajax('https://zh.virtualtaboo.live/api/front/v2/broadcasts/'+id+'?uniq=0'))).item)||{};}catch(e){}\n  try{cfg=JSON.parse(String(java.ajax('https://zh.virtualtaboo.live/api/front/v3/config/initial')));}catch(e){}\n  try{mem=JSON.parse(String(java.ajax('https://zh.virtualtaboo.live/api/front/v2/models/'+id+'/members?uniq=0')));}catch(e){}\n  var u=(cam.user&&cam.user.user)||{},c=cam.cam||{};\n  var init=cfg.initial||{},common=init.common||{},client=init.client||{};\n  var hosts=common.hlsStreamHosts||{},order=['C','C1','D','D1','E','E1','F','F1','A','A1','B','B1'],lines=[];\n  for(var li=0;li<order.length;li++){var hh=hosts[order[li]];if(hh&&lines.indexOf(hh)<0)lines.push(hh);}\n  if(!lines.length){lines=['doppiocdn.media','doppiocdn.net','doppiocdn.org','doppiocdn.live','doppiocdn.com','doppiocdn1.com'];}\n  var ws=client.websocket||{};\n  var memCount=(mem.guests||0)+(mem.spies||0)+(mem.invisibles||0)+(mem.greens||0)+(mem.golds||0)+(mem.regulars||0);\n  var st=bc.status||u.status||'offline';\n  var presets=((bc.settings&&bc.settings.presets)||[]).filter(function(p){return p&&String(p).indexOf('blurred')===-1;});\n  if(st!=='public'){presets=[];}\n  if(!presets.length&&st==='public'){var hh2=(bc.settings&&bc.settings.height)||0;presets=(hh2>=720)?['720p','480p','240p']:['480p','240p'];}\n  var tips=[];if(c.tipMenu&&c.tipMenu.settings){tips=c.tipMenu.settings.map(function(x){return {activity:x.activity||'',price:x.price||0};});}\n  var data={status:st,isLive:!!bc.isLive,stream:bc.streamName||id,username:u.username||'',topic:c.topic||'',startTime:bc.statusChangedAt||'',tipsCreatedAt:(c.tipMenu&&c.tipMenu.createdAt)||'',membersCount:memCount,hlsLines:lines,pixelatedResolutions:presets,websocketUrl:ws.url||'',websocketToken:ws.token||'',modelId:id,topBestPlace:u.topBestPlace||0,userDescription:u.description||'',goalDescription:(c.goal&&c.goal.description)||'',fanClubDescription:(c.userFanClub&&c.userFanClub.description)||'',tipMenuPriceList:tips,csrfToken:(client.csrfToken||''),csrfTimestamp:(client.csrfTimestamp||''),csrfNotifyTimestamp:(client.csrfNotifyTimestamp||''),uniq:(client.sessionHash||''),cookieHeader:String(cookie.getCookie('https://zh.virtualtaboo.live/')||''),avatarUrl:(u.avatarUrl||''),cdn:(lines[0]||''),coverImg:(bc.snapshotTimestamp?'https://img.doppiocdn.com/thumbs/'+bc.snapshotTimestamp+'/'+(bc.streamName||id)+'_webp':(u.avatarUrl||''))};\n  try{cookie.setWebCookie('https://zh.virtualtaboo.live/',String(cookie.getCookie('https://zh.virtualtaboo.live/')||''));}catch(e){}\n  try{\n    var dj=JSON.stringify(data).replace(/</g,'\\\\u003c');\n    var h2=LG_PLAYER_HTML.split('__LIVE_DATA__').join(dj).split('__DATA__').join(dj);\n    java.startBrowser('https://zh.virtualtaboo.live/'+(data.username||''),'VirtualTaboo 播放器',h2);\n  }catch(e){}\n  return '已在网页播放器打开\\n'+url;\n})()", "subContent": "@js:(function(){\nvar id='';try{var m=String(book.bookUrl||'').match(/models\\/(\\d+)/);id=m?m[1]:'';}catch(e){}\nif(!id)return '';\nvar d={};try{d=JSON.parse(String(java.ajax('https://zh.virtualtaboo.live/api/front/v2/models/'+id+'/chat?limit=100')));}catch(e){}\nvar ms=(d&&d.messages)||[];\nif(!ms.length)return '';\nfunction esc(s){return String(s==null?'':s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/\"/g,'&quot;');}\nvar out=['<i>'];\nfor(var i=0;i<ms.length;i++){\n var mm=ms[i];if(!mm||!mm.details)continue;\n var txt='',color=16777215;\n if(mm.type==='text'){txt=mm.details.body||'';}\n else if(mm.type==='tip'){txt='💰 打赏 '+(mm.details.amount||0)+' 代币';color=16744192;}\n else continue;\n var u=(mm.userData&&mm.userData.username)||'';\n var body=u?(u+'：'+txt):txt;\n var t=(1+i*0.8).toFixed(1);\n out.push('<d p=\"'+t+',1,25,'+color+',0,0,0,0\">'+esc(body)+'</d>');\n}\nout.push('</i>');\nreturn out.join('');\n})()"}, "ruleExplore": {"bookList": "$.blocks..models[*]||$.models[*]", "bookUrl": "https://zh.virtualtaboo.live/api/front/v2/models/{{$.id}}/cam?timezoneOffset=-480&triggerRequest=loadCam&primaryTag=girls&withRecentShow=1&skipTipMenu=1&uniq=ix9yufd20we8bscq", "coverUrl": "@js:var sn=result.snapshotTimestamp;var st=result.streamName;if(sn&&st){'https://img.doppiocdn.com/thumbs/'+sn+'/'+st+'_webp'}else if(result.previewUrlThumbBig){result.previewUrlThumbBig}else if(result.previewUrl){result.previewUrl}else if(result.previewUrlThumbSmall){result.previewUrlThumbSmall}else if(result.avatarUrl){result.avatarUrl}else{''}", "kind": "@js:var s={'public':'免费','groupShow':'付费'}[result.status]||'离线';var c=result.country?result.country.toUpperCase()+' ':'未知';c+' | '+(s)+(result.isLive?(' | '+(result.viewersCount||0)+'在看'):'')", "name": "@js:\nvar hide=false;\ntry{var v=JSON.parse(String(source.getVariable()||'{}'));hide=(String(v.showPaid)==='0');}catch(e){}\nvar s=\"{{$.status}}\",n=\"{{$.username}}\";\nif(hide && s!=='public'){result='';}else{result=n;}"}, "ruleSearch": {"author": "$.username", "bookList": "$.models[*]", "bookUrl": "https://zh.virtualtaboo.live/api/front/v2/models/{{$.id}}/cam?timezoneOffset=-480&triggerRequest=loadCam&primaryTag=girls&withRecentShow=1&skipTipMenu=1&uniq=ix9yufd20we8bscq", "checkKeyWord": "bao", "coverUrl": "@js:try{var sn=result.streamName;var ts=result.snapshotTimestamp;if(sn&&ts){'https://img.doppiocdn.live/thumbs/'+ts+'/'+sn+'_webp'}else if(result.previewUrl){result.previewUrl}else if(result.previewUrlThumbBig){result.previewUrlThumbBig}else if(result.previewUrlThumbSmall){result.previewUrlThumbSmall}else if(result.avatarUrl){result.avatarUrl}else{''}}catch(e){''}", "intro": "@js:lgSearchIntro(result)", "kind": "@js:result=(function(r){if(typeof r==='string'){try{r=JSON.parse(r);}catch(e){}}var sm={'public':'免费','groupShow':'付费','private':'私秀','p2p':'1v1'}[r.status]||'离线';var a=[];var c=r.country?String(r.country).trim():'';if(c)a.push(c.toUpperCase());a.push(sm);var v=(r.viewersCount!=null)?r.viewersCount:0;if(v>0)a.push(v+'在看');return a.join(' | ');})(result);", "name": "@js:var s=\"{{$.status}}\",n=\"{{$.username}}\";var m={'public':'','groupShow':'（付费）','p2p':'（一对一）','private':'（私秀）','off':'（离线）'};var tag=(m[s]!==undefined)?m[s]:(s?'（'+s+'）':'');result=n+(tag||'');"}, "ruleToc": {"chapterList": "@js:(function(){\nvar t=Number(book.type||0);\nvar pm='',web=false;\ntry{var v=JSON.parse(String(source.getVariable()||'{}'));pm=String(v.playMode||'');if(pm==='web')web=true;if(!pm&&String(v.webMode)==='1')web=true;}catch(e){}\nvar text;\nif(web)text=true;else if(pm==='native')text=false;else text=((t&8)===8&&(t&4)!==4);\nbook.type=text?8:4;\nvar d=(typeof result==='string')?JSON.parse(result):result;\nvar it=d.item||{};\nif(!text){return lgBuildToc(result,false);}\nvar un=it.username||it.name||book.name||'';\nreturn [JSON.stringify({n:un,u:'https://zh.virtualtaboo.live/'+un,v:0})];\n})()", "chapterName": "@js:(function(){var e=(typeof result==='string')?JSON.parse(result):result;return e.n||''})()", "chapterUrl": "@js:(function(){var e=(typeof result==='string')?JSON.parse(result):result;return e.u||''})()", "isVolume": "@js:(function(){var e=(typeof result==='string')?JSON.parse(result):result;return e.v===1?'1':'0'})()"}, "searchUrl": "https://zh.virtualtaboo.live/api/front/v4/models/search/group/username?query={{key}}&limit=100&offset={{(page-1)*100}}&primaryTag=girls&uniq=", "variableComment": "showPaid：1=发现页显示付费/离线主播，0=隐藏；playMode：web=网页播放器，native=内置播放器；均可通过发现页顶部选择切换", "weight": 0},{"bookSourceComment": "修改自酷安（生命总归永恒）给出的书源", "bookSourceName": "顶点小说", "bookSourceType": 0, "bookSourceUrl": "http://www.xsbook.org", "bookUrlPattern": "https?://www\\.xsbook\\.org/\\d+_\\d+/?", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "玄幻::http://www.xsbook.org/xclass/1/{{page}}.html,{\"webView\":true}\n武侠::http://www.xsbook.org/xclass/2/{{page}}.html,{\"webView\":true}\n女频::http://www.xsbook.org/xclass/3/{{page}}.html,{\"webView\":true}\n现代::http://www.xsbook.org/xclass/4/{{page}}.html,{\"webView\":true}\n历史::http://www.xsbook.org/xclass/5/{{page}}.html,{\"webView\":true}\n游戏::http://www.xsbook.org/xclass/6/{{page}}.html,{\"webView\":true}\n科幻::http://www.xsbook.org/xclass/7/{{page}}.html,{\"webView\":true}\n美文::http://www.xsbook.org/xclass/8/{{page}}.html,{\"webView\":true}\n其他::http://www.xsbook.org/xclass/9/{{page}}.html,{\"webView\":true}\n总排行::http://www.xsbook.org/rank/allvisit/,{\"webView\":true}\n月排行::http://www.xsbook.org/rank/monthvisit/,{\"webView\":true}\n周排行::http://www.xsbook.org/rank/weekvisit/,{\"webView\":true}\n收藏榜::http://www.xsbook.org/rank/goodnum/,{\"webView\":true}", "lastUpdateTime": 1793532567485, "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=\"og:novel:author\"]@content", "coverUrl": "meta[property=\"og:image\"]@content##nocover[^\\n]*##", "intro": "meta[property=\"og:description\"]@content", "kind": "meta[property=\"og:novel:category\"]@content", "lastChapter": "meta[property=\"og:novel:lastest_chapter_name\"]@content||@css:#info a[rel=\"chapter\"]@text", "name": "meta[property=\"og:title\"]@content"}, "ruleContent": {"content": "<js>\nvar s = String(result);\nvar out = [];\nvar i = s.indexOf('id=\"booktxt\"');\nif (i >= 0) {\n  var st = s.indexOf('>', i) + 1;\n  var en = s.indexOf('</div>', st);\n  var t = s.substring(st, en > 0 ? en : s.length);\n  t = t.replace(/<br\\s*\\/?>/gi, '\\n');\n  t = t.replace(/<\\/p>/gi, '\\n');\n  t = t.replace(/<p[^>]*>/gi, '');\n  t = t.replace(/<[^>]+>/g, '');\n  t = t.replace(/&gt;/g, '>').replace(/&lt;/g, '<').replace(/&quot;/g, '\"').replace(/&#39;/g, \"'\").replace(/&nbsp;/g, ' ');\n  var lines = t.split('\\n');\n  for (var k = 0; k < lines.length; k++) {\n    var L = lines[k].replace(/^\\s+|\\s+$/g, '');\n    if (L === '') continue;\n    if (L.length < 80 && /https?:\\/\\/|www\\./i.test(L)) continue;\n    if (/^[^\\u4e00-\\u9fa5\\w]$/.test(L)) continue;\n    if (out.length > 0 && out[out.length - 1] === L) continue;\n    out.push(L);\n  }\n  var done = false;\n  while (!done) {\n    done = true;\n    var total = out.length;\n    for (var n = Math.floor(total / 2); n > 2; n--) {\n      var x = out.slice(total - n).join('\\n');\n      var y = out.slice(total - 2 * n, total - n).join('\\n');\n      if (x !== '' && x === y) {\n        out = out.slice(0, total - n);\n        done = false;\n        break;\n      }\n    }\n  }\n}\nvar text1 = out.join('\\n');\ntry {\n  var hasCache = (typeof cache !== 'undefined') && cache != null;\n  var ub = (typeof baseUrl === 'undefined') ? '' : String(baseUrl);\n  if (hasCache && ub !== '') {\n    var ubc = ub.replace(/,\\{[\\s\\S]*$/, '');\n    var km = ubc.match(/(\\d+_\\d+)\\/(\\d+?)(?:_\\d+)?\\.html/);\n    var key = 'xsbook_acc_' + (km ? km[1] + '/' + km[2] : ubc);\n    var isNext = /_\\d+\\.html/.test(ubc);\n    if (isNext) {\n      if (text1 !== '') {\n        var prev = cache.get(key);\n        if (prev) {\n          var pp = prev.split('\\n');\n          var cc = text1.split('\\n');\n          var maxk = pp.length < cc.length ? pp.length : cc.length;\n          for (var k2 = maxk; k2 >= 3; k2--) {\n            if (pp.slice(pp.length - k2).join('\\n') === cc.slice(0, k2).join('\\n')) {\n              cc = cc.slice(k2);\n              break;\n            }\n          }\n          text1 = cc.join('\\n');\n          if (text1 !== '') cache.put(key, prev + '\\n' + text1, 600);\n        } else {\n          cache.put(key, text1, 600);\n        }\n      }\n    } else if (text1 !== '') {\n      cache.put(key, text1, 600);\n    }\n  }\n} catch (dedupErr) {}\ntext1;\n</js>", "nextContentUrl": "<js>\nvar s = String(result);\nvar cur = '';\nvar c = s.match(/<link[^>]*rel=\"canonical\"[^>]*>/);\nif (c) { var ch = c[0].match(/href=\"([^\"]+)\"/); if (ch) { cur = ch[1]; } }\nvar nx = '';\nvar n = s.match(/<a[^>]*id=\"next_url\"[^>]*>/);\nif (n) { var nh = n[0].match(/href=\"([^\"]+)\"/); if (nh) { nx = nh[1]; } }\nvar out = '';\nif (cur !== '' && nx !== '' && !/_\\d+\\.html/.test(cur)) {\n  var a = cur.match(/([^\\/]+)\\.html/);\n  var b = nx.match(/([^\\/]+)\\.html/);\n  if (a && b && b[1] === a[1] + '_2') {\n    out = (nx.indexOf('http') === 0 ? nx : 'http://www.xsbook.org' + nx) + ',{\"webView\":true}';\n  }\n}\nout;\n</js>"}, "ruleExplore": {"author": "div.btm a@text", "bookList": "div.item", "bookUrl": "dl dt a@href##^(/.*)$##http://www.xsbook.org$1,{\"webView\":true}", "coverUrl": "@css:div.image img@data-original##nocover[^\\n]*##", "intro": "dl dd@text", "name": "dl dt a@text", "wordCount": "em.orange@text"}, "ruleSearch": {"author": "div.btm a@text", "bookList": "div.item", "bookUrl": "dl dt a@href##^(/.*)$##http://www.xsbook.org$1,{\"webView\":true}", "coverUrl": "@css:div.image img@data-original##nocover[^\\n]*##", "intro": "dl dd@text", "name": "dl dt a@text", "wordCount": "em.orange@text"}, "ruleToc": {"chapterList": "dt:nth-of-type(2) ~ a[rel=\"chapter\"]", "chapterName": "dd@text", "chapterUrl": "@href##^(/.*)$##http://www.xsbook.org$1,{\"webView\":true}"}, "searchUrl": "@js:try{cookie.removeCookie('http://www.xsbook.org/')}catch(e){};\nvar act='';\ntry{\n  var h=String(java.ajax('http://www.xsbook.org/,{\"headers\":{\"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\",\"Accept\":\"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\",\"Accept-Language\":\"zh-CN,zh;q=0.9\"}}'));\n  var m=h.match(/<form[^>]*name=\"search\"[^>]*action=\"([^\"]*)\"/)||h.match(/<form[^>]*action=\"([^\"]*search[^\"]*)\"/i);\n  if(m)act=m[1];\n}catch(e){};\nif(act){\n  if(!/^https?:\\/\\//.test(act))act='http://www.xsbook.org'+act;\n  try{cache.put('xsbook_act',act,86400)}catch(e){}\n}else{\n  try{act=cache.get('xsbook_act')}catch(e){}\n};\nif(!act)act='http://www.xsbook.org/search3d.html';\nact+'?searchkey={{key}},{\"webView\":true}'", "weight": 0},{"bookSourceComment": "🐾顶点小说xsbook 修复版 v2.0 (2026-10-31)\n\n【核心修复】\n1. 站点反爬=403双击验证：新会话首击403+Set-Cookie，带Cookie二击200。旧版 enabledCookieJar=false 且搜索规则先 removeCookie 再裸请求→永远403。\n   修复：enabledCookieJar=true + 全站请求URL选项 retry:2（403→存Cookie→自动重发→200）。\n2. 搜索action路径轮换(search7b.html→search3d.html...)，searchUrl用@js动态从首页form提取当前action(旧版设计本意如此，但旧版因removeCookie+无retry而失效)。\n3. 简介三级兜底：og:description→id.intro→meta[name=description]。\n4. 目录：最新段9条(新→旧)+完整段(旧→新)→JS按href保后去重得完整正序1299章。\n5. 发现页补全 ruleExplore（旧版为空），全站列表页统一 class.item。\n6. 封面懒加载，真图在 data-original（旧版img@src全是占位图）。\n7. 全本分页 /quanben/xclass/{page}.html（旧版无页码）。\n\n【风控】①搜索限频是\"会话级\"：同会话搜索间隔30秒(触发返回200+59字节alert\"搜索间隔: 30 秒\"空页)，会话被刷爆后持续被限(等再久也没用)。解法=searchUrl每次搜索前 cookie.removeCookie 换新会话(旧版设计本意)，配合 enabledCookieJar+retry:2 完成 403双击拿新Cookie。②全站对快速连发敏感(触发IP级风控升级后连Cookie都不下发)，已设 concurrentRate 1/8000（实测甜点值：8秒间隔站点直接放行；间隔更短(1秒)会被站点挂起到30秒才响应，更长则拖慢校验/下载；搜索30秒会话限频靠每次换新会话规避，不受此影响）。\n\n【登录】站点无需登录。登录面板=发布页线路管理：发布页输入框/一键获取线路/测延时/点选切换。\n\n【v2.5】站点会话在请求间隔后可能对任意页面重新触发403二次验证，详情页/章节页/下一页URL统一追加 {\"retry\":2} 由Legado自动双击过验证。", "bookSourceGroup": "顶点小说", "bookSourceName": "🐾顶点小说xsbook", "bookSourceType": 0, "bookSourceUrl": "http://www.xsbook.org", "concurrentRate": "1/8000", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\":\"♨️分类·排行♨️\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1.0}},{\"title\":\"玄幻\",\"url\":\"/xclass/1/{{page}}.html,{\\\"retry\\\":2}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"武侠\",\"url\":\"/xclass/2/{{page}}.html,{\\\"retry\\\":2}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"女频\",\"url\":\"/xclass/3/{{page}}.html,{\\\"retry\\\":2}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"现代\",\"url\":\"/xclass/4/{{page}}.html,{\\\"retry\\\":2}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"历史\",\"url\":\"/xclass/5/{{page}}.html,{\\\"retry\\\":2}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"游戏\",\"url\":\"/xclass/6/{{page}}.html,{\\\"retry\\\":2}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"科幻\",\"url\":\"/xclass/7/{{page}}.html,{\\\"retry\\\":2}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"美文\",\"url\":\"/xclass/8/{{page}}.html,{\\\"retry\\\":2}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"其他\",\"url\":\"/xclass/9/{{page}}.html,{\\\"retry\\\":2}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"全本\",\"url\":\"/quanben/xclass/{{page}}.html,{\\\"retry\\\":2}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"总排行榜\",\"url\":\"/rank/allvisit/,{\\\"retry\\\":2}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"月排行榜\",\"url\":\"/rank/monthvisit/,{\\\"retry\\\":2}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"周排行榜\",\"url\":\"/rank/weekvisit/,{\\\"retry\\\":2}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"收藏榜\",\"url\":\"/rank/goodnum/,{\\\"retry\\\":2}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}}]", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.82 Mobile Safari/537.36\"}", "lastUpdateTime": "1793472828629", "loginUi": "[{\"name\": \"ℹ️ 本站无需登录｜面板=发布页线路管理\", \"type\": \"text\", \"action\": \"XSB_noop(java)\"}, {\"name\": \"📡 当前线路\", \"type\": \"text\", \"action\": \"XSB_showLine(java)\", \"viewName\": \"'📡 当前线路: '+(source.get('xsb_line')?String(source.get('xsb_line')).replace(/^https?:\\\\/\\\\//,''):'主站 www.xsbook.org')\"}, {\"name\": \"🔗 发布页地址\", \"type\": \"text\", \"action\": \"XSB_setPub(java)\", \"default\": \"https://www.xsbook.org\"}, {\"name\": \"①从发布页获取线路\", \"type\": \"button\", \"action\": \"XSB_fetchLines(java)\"}, {\"name\": \"②测延时(全部线路)\", \"type\": \"button\", \"action\": \"XSB_speedTest(java)\"}, {\"name\": \"🌐 线路1\", \"type\": \"button\", \"action\": \"XSB_useLine(java,1)\", \"viewName\": \"var a=String(source.get('xsb_line1')||'');a?a.replace(/^https?:\\\\/\\\\//,'').substring(0,26)+' '+(source.get('xsb_sp1')||''):'(空位1)'\"}, {\"name\": \"🌐 线路2\", \"type\": \"button\", \"action\": \"XSB_useLine(java,2)\", \"viewName\": \"var a=String(source.get('xsb_line2')||'');a?a.replace(/^https?:\\\\/\\\\//,'').substring(0,26)+' '+(source.get('xsb_sp2')||''):'(空位2)'\"}, {\"name\": \"🌐 线路3\", \"type\": \"button\", \"action\": \"XSB_useLine(java,3)\", \"viewName\": \"var a=String(source.get('xsb_line3')||'');a?a.replace(/^https?:\\\\/\\\\//,'').substring(0,26)+' '+(source.get('xsb_sp3')||''):'(空位3)'\"}, {\"name\": \"🌐 线路4\", \"type\": \"button\", \"action\": \"XSB_useLine(java,4)\", \"viewName\": \"var a=String(source.get('xsb_line4')||'');a?a.replace(/^https?:\\\\/\\\\//,'').substring(0,26)+' '+(source.get('xsb_sp4')||''):'(空位4)'\"}, {\"name\": \"🌐 线路5\", \"type\": \"button\", \"action\": \"XSB_useLine(java,5)\", \"viewName\": \"var a=String(source.get('xsb_line5')||'');a?a.replace(/^https?:\\\\/\\\\//,'').substring(0,26)+' '+(source.get('xsb_sp5')||''):'(空位5)'\"}, {\"name\": \"🌐 线路6\", \"type\": \"button\", \"action\": \"XSB_useLine(java,6)\", \"viewName\": \"var a=String(source.get('xsb_line6')||'');a?a.replace(/^https?:\\\\/\\\\//,'').substring(0,26)+' '+(source.get('xsb_sp6')||''):'(空位6)'\"}, {\"name\": \"💡 获取线路→测延时→点线路按钮切换\", \"type\": \"text\", \"action\": \"XSB_noop(java)\"}]", "loginUrl": "<js>\n// ===== xsbook 发布页线路管理函数库 v2.0 =====\n// action 统一签名 XSB_xxx(java)，调用侧传 java(SourceLoginJsExtensions)\n// 变量键: xsb_pub=发布页 xsb_line=当前线路 xsb_lineN/xsb_spN=线路N与延时\nfunction XSB_gv(jv, k, d) {\n  var v = '';\n  try { v = String(jv.get(k) || ''); } catch (e) {}\n  if (!v || v == 'null' || v == 'undefined') v = d || '';\n  return v;\n}\nfunction XSB_T(jv, msg) {\n  var ok = false;\n  try { jv.longToast(msg); ok = true; } catch (e) {}\n  if (!ok) { try { jv.toast(msg); ok = true; } catch (e2) {} }\n  if (!ok) { try { jv.copyText(msg); } catch (e3) {} }\n}\nfunction XSB_noop(jv) {\n  XSB_T(jv, 'ℹ️ 本站无需登录。面板用法: 发布页输入框可改发布页→点①获取线路→②测延时→点线路按钮切换');\n}\nfunction XSB_showLine(jv) {\n  var cur = XSB_gv(jv, 'xsb_line', '');\n  if (cur) {\n    XSB_T(jv, '📡 当前线路: ' + cur);\n  } else {\n    XSB_T(jv, '📡 当前线路: 主站 http://www.xsbook.org');\n  }\n  try { jv.reLoginView(); } catch (e) { try { jv.reUiView(); } catch (e2) {} }\n}\nfunction XSB_setPub(jv) {\n  var p = '';\n  try {\n    var m = source.getLoginInfoMap();\n    if (m && m.get) { p = String(m.get('🔗 发布页地址') || ''); }\n  } catch (e) {}\n  if (!p) { p = XSB_gv(jv, 'xsb_pub', ''); }\n  p = p.trim();\n  if (!p) {\n    XSB_T(jv, '⚠️ 输入框为空，未修改。当前发布页: ' + (XSB_gv(jv, 'xsb_pub', '默认 https://www.xsbook.org')));\n    return;\n  }\n  if (p.indexOf('http') !== 0) { p = 'http://' + p; }\n  source.put('xsb_pub', p);\n  XSB_T(jv, '✅ 发布页已保存: ' + p + ' | 下一步点①获取线路');\n}\nfunction XSB_fetchLines(jv) {\n  XSB_T(jv, '⏳ 正在从发布页获取线路...');\n  var pub = XSB_gv(jv, 'xsb_pub', 'https://www.xsbook.org');\n  var html = '';\n  try { html = String(jv.ajax(pub)); } catch (e) { html = ''; }\n  var lines = [];\n  if (html.length >= 100) {\n    var ms = html.match(/href=\"(https?:\\/\\/[^\"]*xsbook[^\"]*)\"/g) || [];\n    for (var i = 0; i < ms.length; i++) {\n      var u = ms[i].replace(/href=\"(https?:\\/\\/[^\"]*)\"/, '$1');\n      if (u.indexOf('xsbooktxt') > -1) { continue; }\n      if (lines.indexOf(u) < 0) { lines.push(u); }\n    }\n  }\n  if (lines.length === 0) {\n    lines.push('http://www.xsbook.org');\n    XSB_T(jv, '⚠️ 发布页未解析到线路(可能被墙)，已填主站兜底');\n  }\n  source.put('xsb_lines', JSON.stringify(lines));\n  for (var i = 1; i <= 6; i++) {\n    if (i <= lines.length) { source.put('xsb_line' + i, lines[i - 1]); }\n    else { source.put('xsb_line' + i, ''); }\n    source.put('xsb_sp' + i, '');\n  }\n  XSB_T(jv, '✅ 获取到 ' + lines.length + ' 条线路:\\n' + lines.join('\\n'));\n  try { jv.reLoginView(); } catch (e) { XSB_T(jv, '提示: 重新打开面板可见线路按钮'); }\n}\nfunction XSB_speedTest(jv) {\n  XSB_T(jv, '⏳ 正在测延时(每线路8秒超时)...');\n  var lines = [];\n  for (var i = 1; i <= 6; i++) {\n    var a = XSB_gv(jv, 'xsb_line' + i, '');\n    if (a) { lines.push(a); }\n  }\n  if (lines.length === 0) { XSB_T(jv, '⚠️ 请先点①获取线路'); return; }\n  var best = '';\n  var bm = 99999999;\n  var msg = '';\n  for (var i = 0; i < lines.length; i++) {\n    var t0 = Date.now();\n    var st = '超时';\n    var ok = false;\n    var u = lines[i] + ',{\"timeout\":8000,\"retry\":0}';\n    try {\n      var b = String(jv.ajax(u));\n      if (b.length > 5000) { ok = true; st = (Date.now() - t0) + 'ms'; }\n    } catch (e) { st = '失败'; }\n    source.put('xsb_sp' + (i + 1), st);\n    msg += '\\n' + lines[i].replace(/^https?:\\/\\//, '') + '  ' + st;\n    if (ok && (Date.now() - t0) < bm) { bm = Date.now() - t0; best = lines[i]; }\n  }\n  if (best) {\n    var bi = lines.indexOf(best);\n    source.put('xsb_sp' + (bi + 1), '⚡' + XSB_gv(jv, 'xsb_sp' + (bi + 1), st));\n  }\n  XSB_T(jv, '✅ 测延时完成(⚡最快):\\n' + msg);\n  try { jv.reLoginView(); } catch (e) {}\n}\nfunction XSB_useLine(jv, n) {\n  var a = XSB_gv(jv, 'xsb_line' + n, '');\n  if (!a) { XSB_T(jv, '⚠️ 线路' + n + ' 为空，请先点①获取线路'); return; }\n  source.put('xsb_line', a);\n  XSB_T(jv, '✅ 已记录线路: ' + a + '\\n⚠️ 本源请求固定走 bookSourceUrl 主站，切换仅作记录；域名变动请编辑书源改 bookSourceUrl');\n  try { jv.reLoginView(); } catch (e) {}\n}\n</js>", "respondTime": 180000, "ruleBookInfo": {"author": "[property=\"og:novel:author\"]@content", "coverUrl": "[property=\"og:image\"]@content", "intro": "[property=\"og:description\"]@content||id.intro@text||[name=\"description\"]@content", "kind": "[property=\"og:novel:category\"]@content&&[property=\"og:novel:status\"]@content", "lastChapter": "[property=\"og:novel:lastest_chapter_name\"]@content", "name": "[property=\"og:novel:book_name\"]@content"}, "ruleContent": {"content": "id.booktxt@html", "nextContentUrl": "id.next_url.0@href\n@js:var u=result;try{if(u.size){u=u.get(0)}}catch(e){}String(u)+',{\"retry\":2}'", "replaceRegex": "##(本站所有小说均由根据搜索引擎转码而来[\\s\\S]*|请记住本书首发域名[\\s\\S]*|顶点小说.*?www\\.xsbook\\.org|www\\.xsbook\\.org)##g"}, "ruleExplore": {"author": "class.btm@a@text", "bookList": "class.item", "bookUrl": "a.0@href\n@js:String(result) + ',{\"retry\":2}'", "coverUrl": "img@data-original", "intro": "dl@dd@text", "kind": "em.0:1@text", "name": "dl@dt@a@text"}, "ruleSearch": {"author": "class.btm@a@text", "bookList": "class.item", "bookUrl": "a.0@href\n@js:String(result) + ',{\"retry\":2}'", "coverUrl": "img@data-original", "intro": "dl@dd@text", "kind": "em.0:1@text", "name": "dl@dt@a@text"}, "ruleToc": {"chapterList": "id.list@dl>a\n@js:var seen={};var out=[];for(var i=result.length-1;i>=0;i--){var u=String(result[i].attr(\"href\")||\"\");if(u&&!seen[u]){seen[u]=1;out.unshift(result[i])}}out;", "chapterName": "text", "chapterUrl": "href\n@js:String(result) + ',{\"retry\":2}'"}, "searchUrl": "@js:var base = \"http://www.xsbook.org\";try { cookie.removeCookie(base); } catch (e) {}var h = String(java.ajax(base + \"/,{\\\"retry\\\":2}\"));var m = h.match(/<form[^>]*action=\"([^\"]*)\"/);var act = m ? m[1] : \"/search7b.html\";base + act + \"?searchkey={{key}},{\\\"retry\\\":2}\";", "weight": 0},{"bookSourceName": "MissKon", "bookSourceType": 2, "bookSourceUrl": "https://misskon.us/", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nvar list = [];\nfunction C(t) {\n    list.push({\n        title: t,\n        style: {\n            layout_flexGrow: 1,\n            layout_flexBasisPercent: 1\n        }\n    });\n}\n\nfunction K(t, u) {\n    list.push({\n        title: t,\n        url: u,\n        style: {\n            layout_flexGrow: 1,\n            layout_flexBasisPercent: 0.25\n        }\n    });\n}\n\nvar P = '{{page}}';\n\nC('【中国工作室】')\nK(\"PANS\", `/zh/series/pans?page=${P}`)\nK(\"丽图100\", `/zh/series/litu100?page=${P}`)\nK(\"相约中国\", `/zh/series/metcn?page=${P}`)\nK(\"轰趴猫\", `/zh/series/partycat?page=${P}`)\nK(\"潘多拉\", `/zh/series/pandora?page=${P}`)\nK(\"行色\", `/zh/series/xing-se?page=${P}`)\nK(\"其他中国工作室\", `/zh/series/other-studios?page=${P}`)\nK(\"爱尤物\", `/zh/series/ugirls?page=${P}`)\nK(\"爱丝\", `/zh/series/aiss?page=${P}`)\nK(\"果团网\", `/zh/series/girlt?page=${P}`)\nK(\"黄甫\", `/zh/series/huang-fu?page=${P}`)\nK(\"妖精社\", `/zh/series/fairy-club?page=${P}`)\nK(\"无忌影社\", `/zh/series/wuji-works?page=${P}`)\nK(\"推女郎\", `/zh/series/tuigirl?page=${P}`)\nK(\"风吟鸟唱\", `/zh/series/wind-sings?page=${P}`)\nK(\"蜜丝\", `/zh/series/missleg?page=${P}`)\nK(\"头条女神\", `/zh/series/toutiaogirls?page=${P}`)\nK(\"希威社\", `/zh/series/sivvi-studio?page=${P}`)\nK(\"深夜企划\", `/zh/series/midnight-project?page=${P}`)\nK(\"北京天使\", `/zh/series/beijing-angel?page=${P}`)\nK(\"ISS系列\", `/zh/series/iss?page=${P}`)\nK(\"尤美\", `/zh/series/youmei?page=${P}`)\nK(\"A4U\", `/zh/series/a4u?page=${P}`)\nK(\"中国工作室\", `/zh/series/chinese-studios?page=${P}`)\nK(\"DDY\", `/zh/series/ddy?page=${P}`)\nK(\"蜜柚摄影\", `/zh/series/pomelo?page=${P}`)\nK(\"东莞V女郎\", `/zh/series/dongguan-vgirls?page=${P}`)\nK(\"SK丝库\", `/zh/series/sk-silk?page=${P}`)\nK(\"U238\", `/zh/series/u238?page=${P}`)\n\nC('【日本工作室】')\nK(\"Escape\", `/zh/series/escape?page=${P}`)\nK(\"FLASHデジタル写真集\", `/zh/series/flash?page=${P}`)\nK(\"FRIDAY\", `/zh/series/friday?page=${P}`)\nK(\"Graphis\", `/zh/series/graphis?page=${P}`)\nK(\"Prestige\", `/zh/series/prestige?page=${P}`)\nK(\"Super Pose Book\", `/zh/series/super-pose-book?page=${P}`)\nK(\"Urabon\", `/zh/series/urabon?page=${P}`)\nK(\"X-City\", `/zh/series/x-city?page=${P}`)\nK(\"アサ芸SEXY\", `/zh/series/morning-sexy?page=${P}`)\nK(\"周刊ポストデジタル写真集\", `/zh/series/weekly-post-digital-photo?page=${P}`)\n\nC('【韩国工作室】')\nK(\"ArtGravia\", `/zh/series/artgravia?page=${P}`)\nK(\"Espacia Korea\", `/zh/series/espacia-korea?page=${P}`)\nK(\"Loozy\", `/zh/series/loozy?page=${P}`)\nK(\"Makemodel\", `/zh/series/makemodel?page=${P}`)\nK(\"Pure Media\", `/zh/series/pure-media?page=${P}`)\n\nC('【各国其他套图】')\nK(\"其他地区套图\", `/zh/series/other-regions?page=${P}`)\nK(\"台模套图\", `/zh/series/taiwan-nude?page=${P}`)\nK(\"国模套图\", `/zh/series/chinese-nude?page=${P}`)\nK(\"国模套图\", `/zh/series/other-photos?page=${P}`)\nK(\"日模套图\", `/zh/series/japanese-nude?page=${P}`)\nK(\"港模套图\", `/zh/series/hongkong-nude?page=${P}`)\nK(\"韩模套图\", `/zh/series/korean-nude?page=${P}`)\n\nC('【其他套图】')\nK(\"AI图区\", `/zh/series/ai-photos?page=${P}`)\nK(\"书籍扫描\", `/zh/series/book-scans?page=${P}`)\nK(\"街拍\", `/zh/series/street-snap?page=${P}`)\n\nC('【台湾工作室】')\nK(\"ED Mosaic\", `/zh/series/ed-mosaic?page=${P}`)\nK(\"Fantasy Factory\", `/zh/series/fantasy-factory?page=${P}`)\nK(\"JVID\", `/zh/series/jvid?page=${P}`)\nK(\"TPimage\", `/zh/series/tpimage?page=${P}`)\n\nC('【Xiuren】')\nK(\"Leaked\", `/zh/series/leaked?page=${P}`)\nK(\"YouMi\", `/zh/series/youmi?page=${P}`)\nK(\"秀人网\", `/zh/series/all-xiuren?page=${P}`)\n\nJSON.stringify(list)", "lastUpdateTime": "1793443619126", "respondTime": 180000, "ruleBookInfo": {"intro": "@js:\nvar html = result;\n\nfunction esc(s) {\n    s = (s == null) ? '' : String(s);\n    return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n\nfunction getTheme() {\n    var h = [12, 28, 152, 168, 188, 205, 222, 248, 332][Math.floor(Math.random() * 9)];\n    var s = 44 + Math.floor(Math.random() * 14);\n    var l = 34 + Math.floor(Math.random() * 8);\n    return `hsl(${h} ${s + 4}% ${l}%)`;\n}\n\n// 基础数据\nvar p = html.match(/([\\d,]+)\\s*张照片/);\nvar v = html.match(/([\\d,]+)\\s*次浏览/);\nvar d = html.match(/(\\d{4}年\\d{1,2}月\\d{1,2}日)/);\n\nvar photos = p ? p[1] : \"-\";\nvar views = v ? v[1] : \"-\";\nvar date = d ? d[1] : \"-\";\n\nvar model = java.getString(\"div.mb-4 > a[href*='/models/']@text\") || \"-\";\nvar series = java.getString(\"div.mb-4 > a[href*='/series/']@text\") || \"-\";\nvar category = java.getString(\"div.mb-4 > a[href*='/categories/']@text\") || \"-\";\n\n// 简介\nvar intro = java.getString(\"meta[name=description]@content\") || java.getString(\"p.text-secondary.text-sm.leading-relaxed@text\") || \"暂无简介\";\nintro = esc(intro.trim());\n\n//  Tag\nvar tagsHtml = \"\";\nvar i = 0;\nvar colors = [\n    { bg: '#ecf5ff', bc: '#d9ecff', tc: '#409eff' },\n    { bg: '#f0f9eb', bc: '#e1f3d8', tc: '#67c23a' },\n    { bg: '#fdf6ec', bc: '#faecd8', tc: '#e6a23c' },\n    { bg: '#fef0f0', bc: '#fde2e2', tc: '#f56c6c' },\n    { bg: '#f4f4f5', bc: '#e9e9eb', tc: '#909399' }\n];\n\nvar reg = /<a[^>]+href=\"([^\"]*\\/tags\\/[^\"]*)\"[^>]*>\\s*(#[^<]+?)\\s*<\\/a>/gi;\nvar m;\nwhile ((m = reg.exec(html)) !== null) {\n    var u = String(m[1]).split(\"'\").join(\"\\\\'\");\n    var t = m[2].trim();\n    \n    if (t && u) {\n        var name = String(t).substring(1);\n        var nameEsc = name.split(\"'\").join(\"\\\\'\");\n        var c = colors[i % colors.length];\n        \n        \n        var uPage = u + \"?page=1\";\n        var action = encodeURIComponent(`java.open('explore', '${uPage}', '标签: ${nameEsc}');`);\n        \n        tagsHtml += `<a href=\"javascript:${action}\" style=\"text-decoration:none; display:inline-flex; align-items:center; background:${c.bg}; border:1px solid ${c.bc}; color:${c.tc}; height:24px; padding:0 9px; border-radius:4px; font-size:12px; margin:0 6px 8px 0; white-space:nowrap; font-weight:500;\">${t}</a>`;\n        i++;\n    }\n}\n\n// 推荐\nvar recHtml = \"\";\nvar recReg = /<a\\s+href=\"([^\"]+\\/albums\\/[^\"]+)\"\\s+class=\"album-card[^>]*>[\\s\\S]*?<img\\s+src=\"([^\"]+)\"[\\s\\S]*?<h3[^>]*>([^<]+)<\\/h3>/gi;\nvar r;\nvar rc = 0;\nvar safeSourceUrl = String(source.bookSourceUrl || \"\").split(\"'\").join(\"\\\\'\");\n\nwhile ((r = recReg.exec(html)) !== null && rc < 8) { \n    var rImg = r[2];\n    var rawTitle = String(r[3]).trim();\n    \n    \n    var cleanTitle = rawTitle.replace(/\\s*[（(][^）)]*[）)]/g, \"\").trim();\n    var safeKeyword = cleanTitle.split(\"'\").join(\"\\\\'\");\n    \n    var rAction = encodeURIComponent(`java.open('search', '${safeKeyword}', '${safeKeyword}', '${safeSourceUrl}');`);\n    \n    recHtml += `\n    <a href=\"javascript:${rAction}\" class=\"rec-card\">\n        <div class=\"img-box\">\n            <img src=\"${rImg}\" onerror=\"this.style.display='none'\">\n        </div>\n        <div class=\"rec-title\">${rawTitle}</div>\n        <div class=\"rec-tip\">🔍 源内搜索</div>\n    </a>`;\n    rc++;\n}\n\nvar accent = getTheme();\n\nvar htmlCode = `\n<useweb>\n<style>\n:root { --ink: #1c1917; --mute: #78716c; --line: #e7e5e4; --paper: #fafaf9; --accent: ${accent}; --font: \"Segoe UI\", \"PingFang SC\", system-ui, sans-serif; }\n* { box-sizing: border-box; }\nbody { margin: 0; font-family: var(--font); color: var(--ink); background: transparent; }\n.wrap { width: min(520px, 94vw); margin: 10px auto; padding-bottom: 30px; display: flex; flex-direction: column; gap: 12px; }\n.panel { background: #fff; border: 1px solid var(--line); border-radius: 14px; padding: 14px; box-shadow: 0 4px 12px rgba(0,0,0,0.03); }\n.title { margin: 0 0 10px; font-size: 15px; font-weight: 750; display:flex; justify-content:space-between; align-items:center; }\n.stats { display: flex; justify-content: space-around; text-align: center; background: var(--paper); padding: 12px 8px; border-radius: 10px; border: 1px solid var(--line); margin-bottom: 14px; }\n.stats span { color: var(--mute); font-size: 11px; }\n.stats b { color: var(--accent); font-size: 16px; font-family: system-ui; }\n.info { font-size: 13px; line-height: 1.8; color: #292524; margin-bottom: 12px; }\n.desc { background: var(--paper); padding: 10px 12px; border-radius: 8px; font-size: 12.5px; color: #444; line-height: 1.7; margin-bottom: 14px; border-left: 3px solid var(--accent); }\n.tags { border-top: 1px dashed var(--line); padding-top: 12px; display: flex; flex-wrap: wrap; }\n\n.rec-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px; }\n.rec-card { display: flex; flex-direction: column; background: var(--paper); border: 1px solid var(--line); border-radius: 10px; text-decoration: none; overflow: hidden; }\n.img-box { width: 100%; aspect-ratio: 3 / 4; background-color: #f0f0f0; position: relative; }\n.img-box img { width: 100%; height: 100%; object-fit: cover; display: block; }\n.rec-title { padding: 8px 8px 4px; font-size: 12.5px; font-weight: 600; color: var(--ink); line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }\n.rec-tip { padding: 0 8px 8px; font-size: 10px; color: var(--accent); font-weight: 500; }\n</style>\n<div class=\"wrap\">\n  <div class=\"panel\">\n    <h2 class=\"title\">图集档案</h2>\n    <div class=\"stats\">\n      <div><span>图片数量</span><br><b>${photos}</b></div>\n      <div><span>浏览次数</span><br><b>${views}</b></div>\n      <div><span>发布日期</span><br><b style=\"color:var(--ink); font-size:13px;\">${date}</b></div>\n    </div>\n    <div class=\"info\">\n      <b>👤 模特：</b>${esc(model)}<br>\n      <b>🎬 系列：</b>${esc(series)}<br>\n      <b>📁 分类：</b>${esc(category)}\n    </div>\n    <div class=\"desc\">${intro}</div>\n    ${tagsHtml ? `<div class=\"tags\">${tagsHtml}</div>` : ''}\n  </div>\n  \n  ${recHtml ? `\n  <div class=\"panel\">\n    <h2 class=\"title\" style=\"margin-bottom:12px;\">🌟 您可能还喜欢</h2>\n    <div class=\"rec-grid\">\n      ${recHtml}\n    </div>\n  </div>\n  ` : ''}\n</div>\n</useweb>\n`;\n\nhtmlCode;"}, "ruleContent": {"content": ".photo-item@img@all", "imageStyle": "FULL"}, "ruleExplore": {"author": ".p-3@span@text", "bookList": ".grid-cols-2>a", "bookUrl": "a@href", "coverUrl": "img@src", "kind": ".p-3@.mt-1@text", "name": "h3@text", "wordCount": "span.absolute@text##\\s*([\\d,]+)\\s*##观看数：$1"}, "ruleSearch": {"author": ".p-3@span@text", "bookList": ".grid-cols-2>a", "bookUrl": "a@href", "checkKeyWord": "大尺度", "coverUrl": "img@src", "kind": ".p-3@.mt-1@text", "name": "h3@text"}, "ruleToc": {"chapterList": "<js>\nvar html = result;\n\n\nvar baseUrl = \"\";\nvar cm = html.match(/<link\\s+rel=\"canonical\"\\s+href=\"([^\"]+)\"/);\nif (cm) baseUrl = cm[1].split('?')[0];\n\n\nvar maxPage = 1;\nvar re = /[?&]page=(\\d+)/g;\nvar pm;\nwhile ((pm = re.exec(html)) !== null) {\n    var n = parseInt(pm[1], 10);\n    if (n > maxPage) maxPage = n;\n}\n\n\nvar list = [];\nfor (var i = 1; i <= maxPage; i++) {\n    list.push({\n        title: \"第\" + i + \"页\",\n        url: i === 1 ? baseUrl : baseUrl + \"?page=\" + i\n    });\n}\n list\n</js>\n", "chapterName": "title", "chapterUrl": "url"}, "searchUrl": "/zh/albums/search?q={{key}}&page={{page}}", "weight": 0},{"bookSourceGroup": "视频,AI,R18", "bookSourceName": "🌸 hanime1.life", "bookSourceType": 4, "bookSourceUrl": "https://www.hanime1.life🔞", "bookUrlPattern": ".*hanime[0-9a-z.-]*(/enter)?/watch\\?v=\\d+.*", "concurrentRate": "1/1200", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "🏳 最新上传::https://www.hanime1.life/search?sort=%E6%9C%80%E6%96%B0%E4%B8%8A%E5%82%B3&page={{page}}\n最新上市::https://www.hanime1.life/search?sort=%E6%9C%80%E6%96%B0%E4%B8%8A%E5%B8%82&page={{page}}\n本日排行::https://www.hanime1.life/search?sort=%E6%9C%AC%E6%97%A5%E6%8E%92%E8%A1%8C&page={{page}}\n他们在看::https://www.hanime1.life/search?sort=%E4%BB%96%E5%80%91%E5%9C%A8%E7%9C%8B&page={{page}}\n里番::https://www.hanime1.life/search?genre=%E8%A3%8F%E7%95%AA&page={{page}}\n泡面番::https://www.hanime1.life/search?genre=%E6%B3%A1%E9%BA%B5%E7%95%AA&page={{page}}\nMotion Anime::https://www.hanime1.life/search?genre=Motion%20Anime&page={{page}}\n3DCG::https://www.hanime1.life/search?genre=3DCG&page={{page}}\n2.5D动画::https://www.hanime1.life/search?genre=2.5D&page={{page}}\n2D动画::https://www.hanime1.life/search?genre=2D%E5%8B%95%E7%95%AB&page={{page}}\nAI生成::https://www.hanime1.life/search?genre=AI%E7%94%9F%E6%88%90&page={{page}}\nMMD::https://www.hanime1.life/search?genre=MMD&page={{page}}\nCosplay::https://www.hanime1.life/search?genre=Cosplay&page={{page}}\n新番预告::https://www.hanime1.life/search?genre=%E6%96%B0%E7%95%AA%E9%A0%90%E5%91%8A&page={{page}}", "header": "{\"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36\",\"Referer\":\"https://www.hanime1.life/\"}", "jsLib": "function H1G(k){var v=\"\";try{v=source.get(k)}catch(e){try{v=java.get(k)}catch(e2){}};if(v===\"null\"||v===\"undefined\")v=\"\";return String(v||\"\")}\nfunction H1P(k,v){try{source.put(k,String(v))}catch(e){try{java.put(k,String(v))}catch(e2){}}}\nfunction H1DOM(){var d=\"\";try{d=H1G(\"h1dom\")}catch(e){d=\"\"}\n  if(!d){d=\"\"}\n  if(!d){return \"https://www.hanime1.life\"}\n  if(d.indexOf(\"http\")===0){return d}\n  return \"https://\"+d}\nfunction H1OPT(){return \"\"}\n\nfunction H1LIST(java,source,result){\n  var d=org.jsoup.Jsoup.parse(String(result))\n  var out=[]\n  var seen={}\n  // template A: sort/search pages\n  var cards=d.select('div.video-item-container[title]')\n  for(var i=0;i<cards.size();i++){\n    var card=cards.get(i)\n    var a=card.selectFirst(\"a.video-link\")\n    if(!a){continue}\n    var u=String(a.attr(\"href\"))\n    if(u.indexOf(\"watch?v=\")<0){continue}\n    var tt=card.selectFirst(\"div.title\")\n    var name=tt?tt.text().trim():\"\"\n    if(!name){continue}\n    var img=card.selectFirst(\"img.main-thumb\")\n    var cover=img?String(img.attr(\"src\")):\"\"\n    var dur=card.selectFirst(\"div.duration\")\n    var du=dur?dur.text().trim():\"\"\n    var sub=card.selectFirst(\"div.subtitle\")\n    var author=\"\";var date=\"\"\n    if(sub){\n      var aa=sub.selectFirst(\"a\")\n      author=aa?aa.text().trim():\"\"\n      var st=sub.selectFirst(\"span.subtitle-time\")\n      date=st?st.text().trim():\"\"\n    }\n    var st2=card.selectFirst(\"div.stats-container\")\n    var views=\"\"\n    if(st2){\n      var items=st2.select(\"div.stat-item\")\n      if(items.size()>1){views=String(items.get(1).text()).trim()}\n    }\n    if(seen[u]){continue}\n    seen[u]=1\n    out.push({name:name,u:u,cover:cover,author:author,date:date,du:du,views:views})\n  }\n  if(out.length>0){return out}\n  // template B: genre pages\n  var as2=d.select('a[href*=\"watch?v=\"]')\n  for(var i=0;i<as2.size();i++){\n    var a2=as2.get(i)\n    var u2=String(a2.attr(\"href\"))\n    if(seen[u2]){continue}\n    var inner=a2.selectFirst(\"div.home-rows-videos-div\")\n    if(!inner){continue}\n    var tt2=a2.selectFirst(\"div.home-rows-videos-title\")\n    var name2=tt2?tt2.text().trim():\"\"\n    if(!name2){continue}\n    var img2=a2.selectFirst(\"img\")\n    var cover2=img2?String(img2.attr(\"src\")):\"\"\n    seen[u2]=1\n    out.push({name:name2,u:u2,cover:cover2,author:\"\",date:\"\",du:\"\",views:\"\"})\n  }\n  return out\n}\n\nfunction H1CUR(java,source,result,baseUrl){\n  var d=org.jsoup.Jsoup.parse(String(result))\n  var h3=d.selectFirst(\"h3#shareBtn-title\")\n  var name=h3?h3.text().trim():\"\"\n  var h4s=d.select(\"div.video-details-wrapper h4\")\n  var author=\"\"\n  for(var i=0;i<h4s.size();i++){\n    var t=h4s.get(i).text().trim()\n    if(t){author=t;break}\n  }\n  if(!author){var vn=d.selectFirst(\"a#video-artist-name\");author=vn?vn.text().trim():\"\"}\n  var tags=[]\n  var tagEls=d.select(\"div.single-video-tag a\")\n  for(var i=0;i<tagEls.size();i++){\n    var tt=tagEls.get(i).text().trim()\n    tt=String(tt).replace(/^#\\s*/,\"\").replace(/\\s*\\(\\d+\\)\\s*$/,\"\").trim()\n    if(tt&&tt!==\"add\"&&tt!==\"remove\"&&tt!==\"new\"&&tt!==\"edit\"&&tt.indexOf(\".\")<0&&tt.length<20&&tags.indexOf(tt)<0){tags.push(tt)}\n  }\n  var desc=\"\"\n  var panel=d.selectFirst(\"div.video-description-panel\")\n  if(panel){\n    var cap=panel.selectFirst(\"div.video-caption-text\")\n    desc=cap?cap.text().trim():\"\"\n  }\n  var views=\"\";var date=\"\"\n  var vd=d.selectFirst(\"div.video-details-wrapper.hidden-sm\")\n  if(vd){\n    var vt=String(vd.text())\n    var vm=vt.match(/\\u89c2\\u770b\\u6b21\\u6570\\uff1a([^\\s&]+)/)\n    if(vm){views=vm[1]}\n    var dm=vt.match(/(20\\d{2}-\\d{2}-\\d{2})/)\n    if(dm){date=dm[1]}\n  }\n  var cover=\"\"\n  var pv=d.selectFirst(\"video#player\")\n  if(pv){var po=String(pv.attr(\"poster\"));cover=po}\n  var durSec=\"\"\n  var meta=d.selectFirst(\"meta[property=og:video:duration]\")\n  if(meta){durSec=String(meta.attr(\"content\"))}\n  var kindStr=tags.join(\",\")\n  var introStr=desc\n  if(views){introStr=introStr?(introStr+\"\\n\"+views):views}\n  if(date){introStr=introStr?(introStr+\"\\n\"+date):date}\n  var durStr=durSec?(\"\\u65f6\\u957f \"+durSec+\" \\u79d2\"):\"\"\n  return {name:name,author:author,tags:tags,desc:desc,views:views,date:date,cover:cover,durSec:durSec,kindStr:kindStr,introStr:introStr,durStr:durStr}\n}\n\nfunction H1CHAP(java,source,book,result,baseUrl){\n  var d=org.jsoup.Jsoup.parse(String(result))\n  var links=d.select('#playlist-scroll a[href*=\"watch?v=\"]')\n  var out=[];var seen={}\n  for(var i=0;i<links.size();i++){\n    var u=String(links.get(i).attr(\"href\"))\n    if(seen[u]){continue}\n    seen[u]=1\n    var title=\"\"\n    var cell=null\n    var p=links.get(i)\n    while(p!=null){\n      var cn=String(p.classNames ? p.classNames() : \"\")\n      if(cn.indexOf(\"playlist-hover-wrap\")>=0){cell=p;break}\n      p=p.parent()\n    }\n    if(cell){\n      var h4=cell.selectFirst(\"h4.video-title\")\n      title=h4?h4.text().trim():\"\"\n    }\n    if(!title){title=\"P\"+(out.length+1)}\n    out.push({n:title,u:u})\n  }\n  return out\n}\n\nfunction H1CONTENT(java,source,result,baseUrl){\n  var d=org.jsoup.Jsoup.parse(String(result))\n  var vp=d.selectFirst(\"video#player\")\n  if(!vp){return \"\"}\n  var srcs=vp.select(\"source\")\n  var pick=null;var curQ=\"720\"\n  var bm=String(baseUrl).match(/#Q(\\d+)/)\n  if(bm){curQ=bm[1]}\n  for(var i=0;i<srcs.size();i++){\n    var sz=String(srcs.get(i).attr(\"size\"))\n    if(sz===curQ){pick=srcs.get(i);break}\n  }\n  if(!pick){pick=srcs.size()>0?srcs.get(0):null}\n  if(!pick){var s0=String(vp.attr(\"src\")||\"\");if(s0){return s0}return \"\"}\n  return String(pick.attr(\"src\"))\n}\n\nfunction H1FIX(u){\n  var s=String(u||\"\")\n  if(!s){return \"\"}\n  if(s.indexOf(\"http\")!==0){return s}\n  return s\n}", "lastUpdateTime": "1793439001310", "loginUi": "[{\"name\": \"📌 发布页输入框(可留空)\", \"type\": \"text\", \"action\": \"H1NOOP()\"}, {\"name\": \"🚀 一键从发布页获取线路\", \"type\": \"button\", \"action\": \"H1PUB(java)\"}, {\"name\": \"⚡ 测试延时(全部线路)\", \"type\": \"button\", \"action\": \"H1SPEED(java)\"}, {\"name\": \"─── 线路点击切换 ───\", \"type\": \"button\", \"action\": \"H1NOOP()\"}, {\"name\": \"W1\", \"type\": \"button\", \"action\": \"H1SETD(java,'www.hanime1.life')\", \"viewName\": \"'线路1 www.hanime1.life '+(source.get('h1sp1')||'')\"}, {\"name\": \"W2\", \"type\": \"button\", \"action\": \"H1SETD(java,'www.hanime103.net')\", \"viewName\": \"'线路2 www.hanime103.net '+(source.get('h1sp2')||'')\"}, {\"name\": \"W3\", \"type\": \"button\", \"action\": \"H1SETD(java,'www.hanime103.com')\", \"viewName\": \"'线路3 www.hanime103.com '+(source.get('h1sp3')||'')\"}, {\"name\": \"W4\", \"type\": \"button\", \"action\": \"H1SETD(java,'www.hanime104.com')\", \"viewName\": \"'线路4 www.hanime104.com '+(source.get('h1sp4')||'')\"}, {\"name\": \"─── 诊断 ───\", \"type\": \"button\", \"action\": \"H1NOOP()\"}, {\"name\": \"🔍 检查登录状态\", \"type\": \"button\", \"action\": \"H1CK(java)\"}, {\"name\": \"🌐 用浏览器打开站点\", \"type\": \"button\", \"action\": \"H1BR(java)\"}]", "loginUrl": "function H1L(m){try{java.longToast(String(m))}catch(e){try{java.toast(String(m))}catch(e2){}}}\nfunction H1T(m){try{java.toast(String(m))}catch(e){try{java.longToast(String(m))}catch(e2){}}}\nfunction H1G(k){var v=\"\";try{v=source.get(k)}catch(e){try{v=java.get(k)}catch(e2){}};if(v===\"null\"||v===\"undefined\")v=\"\";return String(v||\"\")}\nfunction H1P(k,v){try{source.put(k,String(v))}catch(e){try{java.put(k,String(v))}catch(e2){}}}\nfunction H1DOM(){var d=H1G(\"h1dom\");if(!d){return \"https://www.hanime1.life\"}return \"https://\"+d}\nfunction H1NOOP(){H1T(\"H1T: 提示行无需点击\")}\nfunction H1SETD(jv,d){H1P(\"h1dom\",d);H1L(\"H1L: ✔ 已切换到 \"+d+\"，立即生效\");try{java.reLoginView(false)}catch(e){}}\nfunction H1BR(jv){var u=H1DOM()+\"/enter\";H1T(\"H1T: 正在打开 \"+u);try{java.openUrl(u)}catch(e){H1L(\"H1L: 打开失败 \"+e)}}\nfunction H1CK(jv){\n  var d=H1G(\"h1dom\");if(!d){H1L(\"H1L: 请先选择线路\");return}\n  H1T(\"H1T: 正在检查登录状态…\")\n  var u=\"https://\"+d+\"/enter\"\n  var r=\"\"\n  try{r=String(java.ajax(u))}catch(e){H1L(\"H1L: ✘ 线路不可达: \"+e);return}\n  if(r.indexOf(\"hanime1\")<0){H1L(\"H1L: ✘ 线路异常，请换线路\");return}\n  var c=\"\"\n  try{c=String(java.getCookie(u))}catch(e){c=\"\"}\n  var hasS=c.indexOf(\"hanime1_session\")>=0;var hasR=c.indexOf(\"remember_web\")>=0\n  if(hasS&&hasR){H1L(\"H1L: ✔ 登录Cookie完好（本站游客也可看）\")}\n  else{if(hasS){H1L(\"H1L: ✔ 会话Cookie存在（游客可看）\")}else{H1L(\"H1L: ✔ 未登录，游客可直接搜索观看；需登录请点「用浏览器打开站点」\")}}\n}\nfunction H1SPEED(jv){\n  H1T(\"H1T: ⚡ 开始测试 4 条线路延时…\")\n  var ds=[\"www.hanime1.life\",\"www.hanime103.net\",\"www.hanime103.com\",\"www.hanime104.com\"]\n  var urls=[]\n  for(var i=0;i<ds.length;i++){urls.push(\"https://\"+ds[i]+\"/enter\")}\n  var t0Arr=[];for(var i=0;i<urls.length;i++){t0Arr.push(Date.now())}\n  var res=null\n  try{res=java.appCache!==undefined?java.ajaxAll(urls):java.ajaxAll(urls)}catch(e){H1L(\"H1L: 测速失败 \"+e);return}\n  var ms=[];var okAny=false\n  for(var i=0;i<ds.length;i++){\n    var ok=false;var t=999999\n    try{var r=res[i];var b=String(r.body());var bl=b.length;t=(r.callTime&&r.callTime.call)?r.callTime():(Date.now()-t0Arr[i]);var code=0;try{code=r.raw.code()}catch(e2){try{code=r.code()}catch(e3){}}if(bl>50000||(code==200&&bl>2000)){ok=true}}catch(e){ok=false}\n    H1P(\"h1sp\"+(i+1), ok?(t+\"ms\"):\"超时\")\n    ms.push(ok?t:999999);if(ok){okAny=true}\n  }\n  var best=0\n  for(var i=1;i<ms.length;i++){if(ms[i]<ms[best])best=i}\n  if(okAny){H1P(\"h1dom\",ds[best]);H1L(\"H1L: ⚡ 最快线路 \"+ds[best]+\" \"+ms[best]+\"ms，已自动切换\")}\n  else{H1L(\"H1L: ✘ 全部线路超时，请检查网络/代理\")}\n  try{java.reLoginView(false)}catch(e){}\n}\nfunction H1PUB(jv){\n  H1T(\"H1T: 🚀 正在从发布页探测线路…\")\n  var cur=H1G(\"h1dom\");if(!cur){cur=\"www.hanime1.life\"}\n  var pool=[\"www.hanime1.life\",\"www.hanime103.net\",\"www.hanime103.com\",\"www.hanime104.com\"]\n  var seed=\"https://\"+cur+\"/enter\";var html=\"\"\n  try{html=String(java.ajax(seed))}catch(e){html=\"\"}\n  if(html.length>50000){\n    var rx=/https?:\\/\\/([a-z0-9.-]*hanime[0-9a-z.-]*)\\/enter/g;var mm;var extra=[]\n    while((mm=rx.exec(html))!==null){var d=mm[1].toLowerCase();if(pool.indexOf(d)<0&&extra.indexOf(d)<0){extra.push(d)}}\n    for(var i=0;i<extra.length&&pool.length<8;i++){pool.push(extra[i])}\n  }\n  H1T(\"H1T: 共 \"+pool.length+\" 条候选，逐个探活…\")\n  var live=[];var lat=[]\n  for(var i=0;i<pool.length;i++){\n    var u=\"https://\"+pool[i]+\"/enter\";var t0=Date.now();var ok=false;var body=\"\"\n    try{body=String(java.ajax(u))}catch(e){body=\"\"}\n    var dt=Date.now()-t0\n    if(body.length>50000&&body.indexOf(\"hanime1\")>=0){ok=true}\n    if(ok){live.push(pool[i]);lat.push(dt)}\n  }\n  if(live.length===0){H1L(\"H1L: ✘ 无存活线路；请检查网络或在发布页框填新域名再点本按钮\");return}\n  var minI=0\n  for(var i=1;i<lat.length;i++){if(lat[i]<lat[minI])minI=i}\n  H1P(\"h1pubdoms\",live.join(\",\"))\n  for(var i=0;i<pool.length;i++){\n    var li=live.indexOf(pool[i])\n    H1P(\"h1sp\"+(i+1), li>=0?(lat[li]+\"ms\"):\"超时\")\n  }\n  H1P(\"h1dom\",live[minI])\n  H1L(\"H1L: ✔ 存活 \"+live.length+\" 条：\"+live.join(\" | \")+\"; 最快 \"+live[minI]+\" 已切换\")\n  try{java.reLoginView(false)}catch(e){}\n}\nfunction login(){return \"ok\"}", "respondTime": 180000, "ruleBookInfo": {"author": "author", "coverUrl": "cover", "init": "@js:H1CUR(java,source,result,baseUrl)", "intro": "introStr", "kind": "kindStr", "lastChapter": "durStr", "name": "name", "tocUrl": "@js:(function(){var u=String(baseUrl);return u})()"}, "ruleContent": {"content": "@js:H1CONTENT(java,source,String(result),baseUrl)", "sourceRegex": "/jmpres/.*\\.mp4"}, "ruleExplore": {"author": "author", "bookList": "@js:H1LIST(java,source,String(result))", "bookUrl": "u", "coverUrl": "cover", "intro": "date", "kind": "du", "name": "name", "wordCount": "views"}, "ruleSearch": {"author": "author", "bookList": "@js:H1LIST(java,source,String(result))", "bookUrl": "u", "checkKeyWord": "催眠", "coverUrl": "cover", "intro": "date", "kind": "du", "name": "name", "wordCount": "views"}, "ruleToc": {"chapterList": "@js:H1CHAP(java,source,book,String(result),baseUrl)", "chapterName": "n", "chapterUrl": "u"}, "searchUrl": "/search?query={{key}}&page={{page}}", "variableComment": "h1dom=\\u5f53\\u524d\\u7ebf\\u8def\\u57df\\u540d(\\u4e0d\\u8981\\u624b\\u6539,\\u7528\\u767b\\u5f55\\u9762\\u677f\\u5207\\u6362);h1sp1~4=\\u5404\\u7ebf\\u8def\\u6d4b\\u901f\\u7ed3\\u679c", "weight": 0},{"bookSourceComment": "发布页：\nhttps://huangguoai.pages.dev\nhttps://huang-guo.pages.dev\nv10测速提速+新站根迁移：①登录面板测速改 java.ajaxAll(urls,true)（skipRateLimit双参重载，LT手机构建与E版源码均有）——concurrentRate=1/1500 的限速器曾把 ajaxAll 串行化（绑定源实测5条6269ms vs skip后8条500ms），60候选纯排队≈90秒；再加分批10条+断路器（攒够12条即停）+jxqgmx5ga根域优先排序，实测全活时测速<2秒。②判据修复：java.ajax网络失败不抛异常而是返回~1618B堆栈串⇒旧length>500判据恒真；ajaxAll里StrResponse的raw也是方法必须r.raw().code()（属性访问r.raw.code()拿不到值）；判活判据改为code 200-399+body>20000+排除Exception堆栈串。③ajaxTestAll的isTest=true不真发请求（body恒7字节）不可用于测速。④arj2ftl0/40ygo615老根域已被逐查询随机DNS投毒（假IPv6 2001::段/假IP，手机侧15s全灭）⇒发布页新根域jxqgmx5ga.cc（18/18子域100-252ms全活，302→4d2984.dsqqahhno.cc新站根）设为默认线/自愈首选/发现页静态域名，老根域在测速候选殿后；FIX对三个投毒根域强制迁移（间歇性污染探活会假阳性，参照h2na6qa39先例）。⑤FIX自愈批量探活6条jxqg子域一次并发完成（~300ms），失败回落单参ajaxAll（限速但jxqg全活时可用），全死回落DEF。⑥exploreUrl保持静态（避开@js:E版兼容风险）但迁移到thu.jxqgmx5ga.cc，302由OkHttp自动跟随；ruleExplore.bookUrl的FIX仍会把书URL重写到hg_line。⑦URL选项{\"timeout\":N}只控read timeout，连接超时~15s独立不可压短（死线批量并发由ajaxAll并发自然吞掉）。其余同v9.6.1（E版兼容/E版ArrayList目录/crypto-image封面解密/视频setType三件套）。", "bookSourceGroup": "影视,AI,R18", "bookSourceName": "黄果短剧🔞", "bookSourceType": 4, "bookSourceUrl": "https://l205.arj2ftl0.cc", "bookUrlPattern": "https?://[^/]+/video/\\d+(?:/ep-\\d+)?/?$", "concurrentRate": "1/1500", "coverDecodeJs": "(function(){\ntry{\nvar baos=new Packages.java.io.ByteArrayOutputStream();\nvar buf=new Packages.java.lang.String('00000000000000000000000000000000').getBytes();\nvar n=result.read(buf);\nwhile(n>0){baos.write(buf,0,n);n=result.read(buf)}\nvar enc=baos.toByteArray();\nif(!enc||enc.length<32)return enc;\nvar b0=(enc[0]+256)%256,b1=(enc[1]+256)%256,b2=(enc[2]+256)%256;\nif((b0===255&&b1===216)||(b0===137&&b1===80&&b2===78)||(b0===71&&b1===73&&b2===70)||(b0===82&&b1===73&&b2===70))return enc;\nif(enc.length%16!==0)return enc;\nvar Cipher=Packages.javax.crypto.Cipher;\nvar SKS=Packages.javax.crypto.spec.SecretKeySpec;\nvar IVS=Packages.javax.crypto.spec.IvParameterSpec;\nvar c=Cipher.getInstance('AES/CBC/NoPadding');\nc.init(Cipher.DECRYPT_MODE,new SKS(new Packages.java.lang.String('f5d965df75336270').getBytes('UTF-8'),'AES'),new IVS(new Packages.java.lang.String('97b60394abc2fbe1').getBytes('UTF-8')));\nvar dec=c.doFinal(enc);\nif(!dec||dec.length<32)return enc;\nvar eoi=-1;\nfor(var i=dec.length-2;i>0;i--){\n  if((dec[i]+256)%256===255&&(dec[i+1]+256)%256===217){eoi=i;break}\n}\nif(eoi>0&&eoi+2<dec.length)return Packages.java.util.Arrays.copyOf(dec,eoi+2);\nreturn dec;\n}catch(e){return null}\n})()\n", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>\nvar host = (function(){\n  var DEF = 'https://thu.jxqgmx5ga.cc';\n  var cur = DEF;\n  try {\n    var t = String(source.get('hg_line') || '');\n    if (t.indexOf('http') === 0) cur = t;\n  } catch(e) {}\n\n  var bad = cur.indexOf('h2na6qa39') >= 0 ||\n            cur.indexOf('arj2ftl0')  >= 0 ||\n            cur.indexOf('40ygo615')  >= 0;\n\n  var now = Date.now();\n  var ts = 0;\n  try { ts = parseInt(String(source.get('hg_line_chk'))) || 0; } catch(e) {}\n\n  if (!bad && now - ts < 180000) return cur;\n\n  var ok = false;\n  if (!bad) {\n    try { ok = String(java.ajax(cur + '/')).length > 20000; } catch(e) {}\n  }\n  if (ok) {\n    try { source.put('hg_line_chk', String(now)); } catch(e) {}\n    return cur;\n  }\n\n  var best = '';\n  var cs = [\n    'https://thu.jxqgmx5ga.cc',\n    'https://pku.jxqgmx5ga.cc',\n    'https://fdu.jxqgmx5ga.cc',\n    'https://sjtu.jxqgmx5ga.cc',\n    'https://zju.jxqgmx5ga.cc',\n    'https://nju.jxqgmx5ga.cc'\n  ];\n  var res = null;\n  try { res = java.ajaxAll(cs, true); }\n  catch(e1) { try { res = java.ajaxAll(cs); } catch(e2) {} }\n\n  if (res) {\n    var mBest = 1e12;\n    for (var k = 0; k < res.length; k++) {\n      var code = -9, ms = 1e12, bl = 0;\n      try { code = res[k].raw().code(); } catch(e3) {}\n      try { ms   = res[k].callTime();    } catch(e4) {}\n      try { bl   = String(res[k].body()).length; } catch(e5) {}\n      if (code >= 200 && code < 400 && bl > 20000 && ms < mBest) {\n        mBest = ms;\n        best  = cs[k];\n      }\n    }\n  }\n  if (!best) best = DEF;\n  try { source.put('hg_line', best); source.put('hg_line_chk', String(now)); } catch(e6) {}\n  try { java.longToast('线路自动切换：' + best); } catch(e7) {}\n  return best;\n})();\n\nhost = host.replace(/\\/+$/, '');\n\n// ===== 分类列表=====\nresult = `\n[{\"title\":\"AI成人短剧\",\"url\":\"${host}/ai-duanju/{{page}}/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.4}},{\"title\":\"AI成人漫剧\",\"url\":\"${host}/ai-manju/{{page}}/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.4}},{\"title\":\"AI换脸\",\"url\":\"${host}/ai-huanlian/{{page}}/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.4}},{\"title\":\"AI魔改\",\"url\":\"${host}/ai-mogai/{{page}}/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.4}},{\"title\":\"热播排行榜\",\"url\":\"${host}/ranks/hot/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"精品专题\",\"url\":\"${host}/topics/hot-aiduanju/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.4}},{\"title\":\"全部专题\",\"url\":\"${host}/topics/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.4}}]\n`\n</js>", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 14; Pixel 8 Build/UQ1A.240105.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/131.0.6778.81 Mobile Safari/537.36\",\"Accept\":\"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\",\"Accept-Language\":\"zh-CN,zh;q=0.9,en;q=0.8\",\"Referer\":\"{{baseUrl}}\"}", "lastUpdateTime": "1793437327784", "loginUi": "[{\"name\": \"黄果短剧 · 线路面板\", \"type\": \"label\", \"style\": {\"layout_flexBasisPercent\": 1}}, {\"name\": \"发布页地址\", \"type\": \"text\", \"key\": \"发布页地址\", \"default\": \"https://huangguoai.pages.dev/publish.js\", \"hint\": \"需以 http:// 或 https:// 开头\", \"style\": {\"layout_flexBasisPercent\": 1}}, {\"name\": \"获取网址并测速\", \"type\": \"button\", \"action\": \"FQ_hgGo()\", \"style\": {\"layout_flexBasisPercent\": 1}}, {\"name\": \"测速结果 · 点按切换\", \"type\": \"label\", \"style\": {\"layout_flexBasisPercent\": 1}}, {\"name\": \"线路1\", \"type\": \"button\", \"viewName\": \"FQ_siteName(0)\", \"action\": \"FQ_hgPick(0)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路2\", \"type\": \"button\", \"viewName\": \"FQ_siteName(1)\", \"action\": \"FQ_hgPick(1)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路3\", \"type\": \"button\", \"viewName\": \"FQ_siteName(2)\", \"action\": \"FQ_hgPick(2)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路4\", \"type\": \"button\", \"viewName\": \"FQ_siteName(3)\", \"action\": \"FQ_hgPick(3)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路5\", \"type\": \"button\", \"viewName\": \"FQ_siteName(4)\", \"action\": \"FQ_hgPick(4)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路6\", \"type\": \"button\", \"viewName\": \"FQ_siteName(5)\", \"action\": \"FQ_hgPick(5)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路7\", \"type\": \"button\", \"viewName\": \"FQ_siteName(6)\", \"action\": \"FQ_hgPick(6)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路8\", \"type\": \"button\", \"viewName\": \"FQ_siteName(7)\", \"action\": \"FQ_hgPick(7)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路9\", \"type\": \"button\", \"viewName\": \"FQ_siteName(8)\", \"action\": \"FQ_hgPick(8)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路10\", \"type\": \"button\", \"viewName\": \"FQ_siteName(9)\", \"action\": \"FQ_hgPick(9)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路11\", \"type\": \"button\", \"viewName\": \"FQ_siteName(10)\", \"action\": \"FQ_hgPick(10)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路12\", \"type\": \"button\", \"viewName\": \"FQ_siteName(11)\", \"action\": \"FQ_hgPick(11)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"当前线路\", \"type\": \"button\", \"action\": \"FQ_hgCur()\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"检查登录状态\", \"type\": \"button\", \"action\": \"FQ_hgChk()\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"恢复默认\", \"type\": \"button\", \"action\": \"FQ_hgRst()\", \"style\": {\"layout_flexBasisPercent\": 0.32}}]", "loginUrl": "function hgST(s){s=String(s==null?'':s);return s.replace(/\\/+$/,'')}\nfunction hgNL(){return String.fromCharCode(10)}\nfunction hgQ(c){return String.fromCharCode(34)+c+String.fromCharCode(34)}\nfunction hgDef(){return 'https://thu.jxqgmx5ga.cc'}\nfunction hgPubs(){return ['https://huangguoai.pages.dev/publish.js','https://hu-guo.pages.dev/publish.js']}\nfunction hgSubs(){return ['thu','pku','fdu','sjtu','zju','nju','xmu','sysu','whu','jlu','scu','ruc','bnu','nku','tju','sdu','hust','xjtu','hit']}\nfunction hgRoots(){return ['jxqgmx5ga.cc','arj2ftl0.cc','40ygo615.cc']}\nfunction hgHost(u){var s=hgST(u).replace(/^https?:\\/\\//,'');var i=s.indexOf('/');return i>0?s.substring(0,i):s}\nfunction hgShort(h){h=String(h||'');var d=h.split('.');var t=d[0]||h;if(t.length>13)t=t.substring(0,13);return t}\nfunction hgGV(k,dv){var v='';try{v=String(source.get(k)||'')}catch(e){}\n  if(!v||v=='null'||v=='undefined')v=dv;return v?hgST(v):''}\nfunction hgSV(k,v){try{source.put(k,String(v))}catch(e){}}\nfunction hgT(t){try{java.longToast(t)}catch(e){try{java.toast(t)}catch(e2){}}}\nfunction hgSites(){var r=hgGV('hg_sites','');var a=[];if(r){try{a=JSON.parse(r)}catch(e){}}return a}\nfunction hgRootSort(roots){\n  var pri=[],last=[];\n  for(var i=0;i<roots.length;i++){\n    var r=roots[i];\n    if(r.indexOf('arj2ftl0')>=0||r.indexOf('40ygo615')>=0||r.indexOf('h2na6qa39')>=0)last.push(r);\n    else pri.push(r);\n  }\n  return pri.concat(last)}\nfunction hgCand(){\n  var roots=hgRoots();\n  var ph='';\n  var pubs=hgPubs();\n  var pv=hgGV('pub','');\n  if(pv.indexOf('http')===0)pubs=[pv].concat(pubs);\n  for(var pi=0;pi<pubs.length;pi++){\n    try{ph=String(java.ajax(pubs[pi]+',{\"timeout\":8000,\"retry\":0}'))}catch(e){}\n    if(ph.length>500)break;\n  }\n  if(ph.length>500){\n    var m=ph.match(/var\\s+urls\\s*=\\s*\\[([\\s\\S]*?)\\]/);\n    if(m){var re=/['\"]([a-z0-9.\\-]+\\.[a-z]{2,}\\/?)['\"]/gi,mm;\n      var pr=[];\n      while((mm=re.exec(m[1]))!=null)pr.push(mm[1].replace(/\\/+$/,''));\n      if(pr.length)roots=pr;\n    }\n  }\n  roots=hgRootSort(roots);\n  var cs=[];\n  for(var i=0;i<roots.length;i++)for(var j=0;j<hgSubs().length;j++)cs.push('https://'+hgSubs()[j]+'.'+roots[i]);\n  cs.push(hgDef());\n  var seen={},ls=[];\n  for(var m2=0;m2<cs.length;m2++){if(!seen[cs[m2]]){seen[cs[m2]]=1;ls.push(cs[m2])}}\n  return ls}\nfunction hgBatchProbe(urls){\n  var rows=[];\n  var res=null;\n  try{res=java.ajaxAll(urls,true)}catch(e1){if(urls&&urls.length===1){}else{try{res=java.ajaxAll(urls)}catch(e2){}}}\n  if(!res&&urls&&urls.length===1){\n    try{var b=String(java.ajax(urls[0]+',{\"timeout\":8000,\"retry\":0}'));if(b.length>20000&&b.indexOf('Exception')<0)rows.push({url:urls[0],host:hgHost(urls[0]),ms:0,fin:''})}catch(e3){}\n    return rows}\n  if(res){\n    for(var k=0;k<res.length;k++){\n      var code=-9,ms=-1,bl=0,fin='',bod='';\n      try{code=res[k].raw().code()}catch(e){}\n      try{ms=res[k].callTime()}catch(e){}\n      try{bod=String(res[k].body());bl=bod.length}catch(e){}\n      try{var ss=String(res[k].raw().toString());var fm=ss.match(/url=(\\S+?)\\}/);if(fm)fin=fm[1]}catch(e){}\n      var isErr=(bod.indexOf('Exception')>=0&&bl<3000);\n      if(code>=200&&code<400&&bl>20000&&!isErr)rows.push({url:urls[k],host:hgHost(urls[k]),ms:ms,fin:fin});\n    }\n  }\n  return rows}\nfunction FQ_siteName(i){\n  try{\n    var a=hgSites();\n    if(!a.length)return '线路'+(i+1);\n    if(i>=a.length)return '';\n    var s=a[i];\n    var cur=hgGV('hg_line',hgDef());\n    return hgShort(s.host)+' '+s.ms+'ms'+(s.url===cur?' ✓':'');\n  }catch(e){return '线路'+(i+1)}\n}\nfunction FQ_hgGo(){\n  try{\n    var t0=Date.now();\n    var p=hgGV('pub',hgPubs()[0]);\n    if(!p||p.indexOf('http')!=0){hgT('发布页地址无效：需以 http:// 或 https:// 开头');return}\n    hgT('正在抓取发布页并测速...');\n    var ls=hgCand();\n    var rows=[];\n    var B=10,NEED=12;\n    for(var b=0;b<ls.length&&rows.length<NEED;b+=B){\n      var batch=ls.slice(b,b+B);\n      var bu=[];\n      for(var q=0;q<batch.length;q++)bu.push(batch[q]+'/');\n      var got=hgBatchProbe(bu);\n      for(var g=0;g<got.length&&rows.length<NEED;g++)rows.push(got[g]);\n    }\n    if(!rows.length){hgT('测速完成：'+ls.length+' 条线路全部不可用'+hgNL()+'耗时 '+((Date.now()-t0)/1000).toFixed(1)+' 秒');return}\n    rows.sort(function(x,y){return x.ms-y.ms});\n    hgSV('hg_sites',JSON.stringify(rows));\n    hgSV('hg_line',rows[0].url);\n    hgSV('hg_line_ts',String(Date.now()));\n    hgSV('hg_line_chk',String(Date.now()));\n    hgT('测速完成（'+ls.length+' 条，可用 '+rows.length+' 条，耗时 '+((Date.now()-t0)/1000).toFixed(1)+' 秒）'+hgNL()+'已选最快：'+rows[0].host+'（'+rows[0].ms+'ms）'+hgNL()+'若按钮名未刷新，重新打开本面板即可');\n    try{java.reLoginView(false)}catch(e){}\n  }catch(e){hgT('测速失败：'+String(e).substring(0,100))}\n}\nfunction FQ_hgPick(i){\n  try{\n    var a=hgSites();\n    if(!a.length||!a[i]){\n      hgT('该线路尚未测速，请先点「获取网址并测速」');\n      return;\n    }\n    hgSV('hg_line',a[i].url);\n    hgSV('hg_line_ts',String(Date.now()));\n    hgSV('hg_line_chk',String(Date.now()));\n    hgT('已选择网站：'+a[i].host+hgNL()+'延迟：'+a[i].ms+'ms');\n    try{java.reLoginView(false)}catch(e){}\n  }catch(e){hgT('切换失败：'+String(e).substring(0,80))}\n}\nfunction FQ_hgCur(){\n  try{hgT('当前线路：'+hgGV('hg_line',hgDef()))}catch(e){}\n}\nfunction FQ_hgChk(){\n  try{\n    var L=hgGV('hg_line',hgDef());\n    var h='';\n    try{h=String(java.ajax(L+'/profile/,{\"timeout\":8000,\"retry\":0}'))}catch(e){}\n    if(h.length<2000||(h.indexOf('Exception')>=0&&h.length<3000)){hgT('无法连接线路：'+L+hgNL()+'请检查网络或切换线路');return}\n    var guest=h.indexOf('data-auth-open='+hgQ('login')+'>'+String.fromCharCode(30331,24405,47,27880,20876))>=0;\n    var dash=h.indexOf('ID'+String.fromCharCode(65306)+String.fromCharCode(8212))>=0;\n    var out=h.indexOf(String.fromCharCode(36864,20986))>=0||h.indexOf('signOut')>=0||h.indexOf('logout')>=0;\n    if(guest&&dash)hgT('游客状态（未登录）'+hgNL()+'搜索/详情/目录/播放均可正常使用'+hgNL()+'登录后可看收藏与观看历史'+hgNL()+'当前线路：'+L);\n    else if(out)hgT('已登录'+hgNL()+'当前线路：'+L);\n    else hgT('状态未知（页面结构可能已变化）'+hgNL()+'当前线路：'+L);\n  }catch(e){hgT('检查失败：'+String(e).substring(0,80))}\n}\nfunction FQ_hgRst(){\n  try{\n    hgSV('pub',hgPubs()[0]);hgSV('hg_line',hgDef());hgSV('hg_line_ts','0');hgSV('hg_line_chk','0');hgSV('hg_sites','');\n    hgT('已恢复默认'+hgNL()+'线路：'+hgDef());\n    try{java.reLoginView(false)}catch(e){}\n  }catch(e){}\n}\nfunction login(){\n  try{java.longToast('当前为游客模式，无需登录');}catch(e){try{java.toast('当前为游客模式，无需登录')}catch(e2){}}\n}\n", "respondTime": 180000, "ruleBookInfo": {"author": "@js:\n(function(){\nvar h=String(result);\nvar a=h.match(/<meta name=author content=\"([^\"]*)\"/);\nif(a)return a[1];\nvar b=h.match(/class=\"hg-topic-banner__body\"[^>]*>[\\s\\S]*?<p>([^<]*)<\\/p>/);\nreturn b?b[1].substring(0,40):'黄果短剧';\n})()", "coverUrl": "@js:\n(function(){\nvar h=String(result);\nvar m=h.match(/data-history=\"[^\"]*\"[^>]*>/);\nif(m){\n  var d=m[0].replace(/&#34;/g,'\"').replace(/&quot;/g,'\"').replace(/&amp;/g,'&');\n  var c=d.match(/\"cover\":\"([^\"]+)\"/);\n  if(c){var o=c[1];if(o.indexOf('http')!==0)o='https://pic.drleao.cn'+o;return o+(o.indexOf('?')<0?'?':'&')+'hgimgv=2';}\n}\nvar ds=h.match(/data-src=\"(https:\\/\\/pic\\.[^\"]+)\"/);\nif(ds){var o2=ds[1];return o2+(o2.indexOf('?')<0?'?':'&')+'hgimgv=2';}\nreturn '';\n})()", "intro": "meta[name=description]@content", "kind": "@js:\n(function(){\nvar h=String(result);\nvar t=h.match(/data-track-total-episode=\"(\\d+)\"/);\nif(t)return t[1]+'集';\nvar g=h.match(/class=\"hg-topic-extra-pc\">([^<]*)<\\/span>/);\nif(g)return g[1];\nreturn '';\n})()", "name": "@js:\n(function(){\nvar h=String(result);\nvar m=h.match(/<h1[^>]*class=\"hg-web-play__title\"[^>]*>([^<]*)<\\/h1>/);\nif(m)return m[1].trim();\nvar t=h.match(/<h1[^>]*>([^<]*)<\\/h1>/);\nif(t)return t[1].replace(/介绍$/,'').trim();\nvar og=h.match(/property=\"og:title\" content=\"([^\"]*)\"/);\nif(og)return og[1].replace(/_免费在线观看.*$/,'').trim();\nreturn '';\n})()"}, "ruleContent": {"content": "@js:\n(function(){\nvar FIX=(function(){var DEF='https://thu.jxqgmx5ga.cc' ;var cur=DEF;try{var t=String(source.get('hg_line')||'');if(t.indexOf('http')===0)cur=t}catch(e){} var bad=cur.indexOf('h2na6qa39')>=0||cur.indexOf('arj2ftl0')>=0||cur.indexOf('40ygo615')>=0;var now=Date.now();var ts=0;try{ts=parseInt(String(source.get('hg_line_chk')))}catch(e){} if(isNaN(ts))ts=0;if(!bad&&now-ts<180000)return cur;var ok=false;if(!bad)try{ok=String(java.ajax(cur+'/,{\"timeout\":8000,\"retry\":0}')).length>20000}catch(e){} if(ok){try{source.put('hg_line_chk',String(now))}catch(e){} return cur}var best='';var cs=['https://thu.jxqgmx5ga.cc','https://pku.jxqgmx5ga.cc','https://fdu.jxqgmx5ga.cc','https://sjtu.jxqgmx5ga.cc','https://zju.jxqgmx5ga.cc','https://nju.jxqgmx5ga.cc'];var res=null;try{res=java.ajaxAll(cs,true)}catch(e1){} if(!res){try{res=java.ajaxAll(cs)}catch(e2){ } } if(res){var mBest=1e12;for(var k=0;k<res.length;k++){var code=-9,ms=1e12,bl=0;try{code=res[k].raw().code()}catch(e3){} try{ms=res[k].callTime()}catch(e4){} try{bl=String(res[k].body()).length}catch(e5){} if(code>=200&&code<400&&bl>20000&&ms<mBest){mBest=ms;best=cs[k]} } } if(!best)best=DEF;try{source.put('hg_line',best);source.put('hg_line_chk',String(now))}catch(e6){} try{java.longToast('原线路不可用，已自动切换：'+best)}catch(e7){} return best})();var h='';var got='';\nfor(var att=0;att<3&&(!got);att++){\n  var line=(att===0)?FIX:((function(){var cs=['https://pku.jxqgmx5ga.cc','https://thu.jxqgmx5ga.cc','https://fdu.jxqgmx5ga.cc','https://zju.jxqgmx5ga.cc','https://nju.jxqgmx5ga.cc','https://xmu.jxqgmx5ga.cc','https://sysu.jxqgmx5ga.cc','https://jlu.jxqgmx5ga.cc'] ;var res=null;try{res=java.ajaxAll(cs,true)}catch(e1){} var best='';if(res){var mb=1e12;for(var k=0;k<res.length;k++){var code=-9,ms=1e12,bl=0;try{code=res[k].raw().code()}catch(e3){} try{ms=res[k].callTime()}catch(e4){} try{bl=String(res[k].body()).length}catch(e5){} if(code>=200&&code<401&&bl>20000&&ms<mb){mb=ms;best=cs[k]} } } return best||FIX})());\n  if(att>0){try{source.put('hg_line',line);source.put('hg_line_chk',String(Date.now()))}catch(e8){}}\n  var h2=String(java.ajax(String(baseUrl).replace(/^https?:\\/\\/[^\\/]+/,line)+',{\"timeout\":8000,\"retry\":0}'));\n  var mm=h2.match(/<source src=\"([^\"]+)\"/);\n  if(mm){got=mm[1].split('&amp;').join('&')}else{try{source.put('hg_line_chk','0')}catch(e9){}}\n}\nreturn got;\n})()"}, "ruleExplore": {"author": "@js:\n(function(){\nvar h=String(result);\nvar tp=h.match(/class=\"hg-topic-card__meta\">[\\s\\S]*?<span>([^<]+)</);\nif(tp)return tp[1].trim();\nvar t=h.match(/data-track-type-name=\"([^\"]*)\"/);\nvar tg=h.match(/class=\"hg-drama-card__tags\">([\\s\\S]*?)<\\/div>/)||h.match(/class=\"hg-rank-item__tags\">([\\s\\S]*?)<\\/div>/);\nvar g='';\nif(tg)g=tg[1].replace(/<span class=\"sr-only\">[\\s\\S]*?<\\/span>/g,'').replace(/<[^>]*>/g,' ').replace(/\\s+/g,' ').trim();\nif(t)return t[1];\nreturn g;\n})()", "bookList": ".hg-list-page .hg-card-grid .hg-drama-card, .hg-list-page .hg-rank-item, .hg-list-page .hg-topic-grid .hg-topic-card", "bookUrl": "@js:\n(function(){\nvar FIX=(function(){var DEF='https://thu.jxqgmx5ga.cc' ;var cur=DEF;try{var t=String(source.get('hg_line')||'');if(t.indexOf('http')===0)cur=t}catch(e){} var bad=cur.indexOf('h2na6qa39')>=0||cur.indexOf('arj2ftl0')>=0||cur.indexOf('40ygo615')>=0;var now=Date.now();var ts=0;try{ts=parseInt(String(source.get('hg_line_chk')))}catch(e){} if(isNaN(ts))ts=0;if(!bad&&now-ts<180000)return cur;var ok=false;if(!bad)try{ok=String(java.ajax(cur+'/,{\"timeout\":8000,\"retry\":0}')).length>20000}catch(e){} if(ok){try{source.put('hg_line_chk',String(now))}catch(e){} return cur}var best='';var cs=['https://thu.jxqgmx5ga.cc','https://pku.jxqgmx5ga.cc','https://fdu.jxqgmx5ga.cc','https://sjtu.jxqgmx5ga.cc','https://zju.jxqgmx5ga.cc','https://nju.jxqgmx5ga.cc'];var res=null;try{res=java.ajaxAll(cs,true)}catch(e1){} if(!res){try{res=java.ajaxAll(cs)}catch(e2){ } } if(res){var mBest=1e12;for(var k=0;k<res.length;k++){var code=-9,ms=1e12,bl=0;try{code=res[k].raw().code()}catch(e3){} try{ms=res[k].callTime()}catch(e4){} try{bl=String(res[k].body()).length}catch(e5){} if(code>=200&&code<400&&bl>20000&&ms<mBest){mBest=ms;best=cs[k]} } } if(!best)best=DEF;try{source.put('hg_line',best);source.put('hg_line_chk',String(now))}catch(e6){} try{java.longToast('原线路不可用，已自动切换：'+best)}catch(e7){} return best})();\nvar h=String(result);\nvar root='';\ntry{root=String(source.get('hg_line')||'')}catch(e){}\nif(!root||root.indexOf('http')!==0){try{root=String(source.getBookSourceUrl())}catch(e2){root=''}}\nroot=root.split(String.fromCharCode(35,35))[0];\nif(!root||root.indexOf('http')!==0)root=String(baseUrl||'').split(String.fromCharCode(35,35))[0].replace(/\\/$/,'');\nroot=root.replace(/\\/$/,'');\nvar tp=h.match(/href=\"(\\/topics\\/[a-zA-Z0-9\\-]+\\/)\"/);\nif(tp)return root+tp[1];\nvar mv=h.match(/href=\"(\\/video\\/\\d+\\/)\"/);\nif(mv)return root+mv[1];\nreturn '';\n})()", "coverUrl": "@js:\n(function(){\nvar h=String(result);\nvar m=h.match(/data-src=\"([^\"]+)\"/);\nif(!m)return '';\nvar o=m[1];\nreturn o+(o.indexOf('?')<0?'?':'&')+'hgimgv=2';\n})()", "intro": "@js:\n(function(){\nvar h=String(result);\nvar tp=h.match(/class=\"hg-topic-card__meta\">[\\s\\S]*?<span>([^<]+)</);\nif(tp)return tp[1].trim();\nvar d=h.match(/class=\"hg-drama-card__desc\">([\\s\\S]*?)<\\/p>/)||h.match(/class=\"hg-rank-item__desc\">([\\s\\S]*?)<\\/p>/);\nreturn d?d[1].replace(/<[^>]*>/g,'').trim():'';\n})()", "kind": "@js:\n(function(){\nvar h=String(result);\nvar tp=h.match(/class=\"hg-topic-card__meta\">[\\s\\S]*?<span>([^<]+)</);\nif(tp)return '专题合集';\nvar t=h.match(/data-track-type-name=\"([^\"]*)\"/);\nvar tg=h.match(/class=\"hg-drama-card__tags\">([\\s\\S]*?)<\\/div>/)||h.match(/class=\"hg-rank-item__tags\">([\\s\\S]*?)<\\/div>/);\nvar g='';\nif(tg)g=tg[1].replace(/<span class=\"sr-only\">[\\s\\S]*?<\\/span>/g,'').replace(/<[^>]*>/g,' ').replace(/\\s+/g,' ').trim();\nif(t)return t[1]+' · '+g;\nreturn g;\n})()", "lastChapter": "@js:\n(function(){\nvar h=String(result);\nvar m=h.match(/data-ep-base=\"([^\"]*)\"/);\nif(m&&m[1]){\n  var t=h.match(/hg-ep-time__at\">([^<]*)</);\n  return t&&t[1]?m[1]+'（'+t[1]+'）':m[1];\n}\nvar s=h.match(/hg-drama-card__episode\">([^<]*)</);\nif(s&&s[1])return s[1];\nreturn '';\n})()", "name": "@js:\n(function(){\nvar h=String(result);\nvar m=h.match(/data-track-title=\"([^\"]*)\"/);\nif(m)return m[1];\nvar tp=h.match(/class=\"hg-topic-card__title\">([^<]+)</);\nif(tp)return tp[1].trim();\nvar a=h.match(/class=\"hg-drama-card__title\"[^>]*>[\\s\\S]*?<a[^>]*>([\\s\\S]*?)<\\/a>/)||h.match(/class=\"hg-rank-item__title\"[^>]*>[\\s\\S]*?<a[^>]*>([\\s\\S]*?)<\\/a>/);\nif(a)return a[1].replace(/<[^>]*>/g,'').replace(/全集在线观看/g,'').trim();\nreturn '';\n})()"}, "ruleSearch": {"author": "@js:\n(function(){\nvar h=String(result);\nvar tp=h.match(/class=\"hg-topic-card__meta\">[\\s\\S]*?<span>([^<]+)</);\nif(tp)return tp[1].trim();\nvar t=h.match(/data-track-type-name=\"([^\"]*)\"/);\nvar tg=h.match(/class=\"hg-drama-card__tags\">([\\s\\S]*?)<\\/div>/)||h.match(/class=\"hg-rank-item__tags\">([\\s\\S]*?)<\\/div>/);\nvar g='';\nif(tg)g=tg[1].replace(/<span class=\"sr-only\">[\\s\\S]*?<\\/span>/g,'').replace(/<[^>]*>/g,' ').replace(/\\s+/g,' ').trim();\nif(t)return t[1];\nreturn g;\n})()", "bookList": ".hg-list-page .hg-card-grid .hg-drama-card, .hg-list-page .hg-rank-item, .hg-list-page .hg-topic-grid .hg-topic-card", "bookUrl": "@js:\n(function(){\nvar FIX=(function(){var DEF='https://thu.jxqgmx5ga.cc' ;var cur=DEF;try{var t=String(source.get('hg_line')||'');if(t.indexOf('http')===0)cur=t}catch(e){} var bad=cur.indexOf('h2na6qa39')>=0||cur.indexOf('arj2ftl0')>=0||cur.indexOf('40ygo615')>=0;var now=Date.now();var ts=0;try{ts=parseInt(String(source.get('hg_line_chk')))}catch(e){} if(isNaN(ts))ts=0;if(!bad&&now-ts<180000)return cur;var ok=false;if(!bad)try{ok=String(java.ajax(cur+'/,{\"timeout\":8000,\"retry\":0}')).length>20000}catch(e){} if(ok){try{source.put('hg_line_chk',String(now))}catch(e){} return cur}var best='';var cs=['https://thu.jxqgmx5ga.cc','https://pku.jxqgmx5ga.cc','https://fdu.jxqgmx5ga.cc','https://sjtu.jxqgmx5ga.cc','https://zju.jxqgmx5ga.cc','https://nju.jxqgmx5ga.cc'];var res=null;try{res=java.ajaxAll(cs,true)}catch(e1){} if(!res){try{res=java.ajaxAll(cs)}catch(e2){ } } if(res){var mBest=1e12;for(var k=0;k<res.length;k++){var code=-9,ms=1e12,bl=0;try{code=res[k].raw().code()}catch(e3){} try{ms=res[k].callTime()}catch(e4){} try{bl=String(res[k].body()).length}catch(e5){} if(code>=200&&code<400&&bl>20000&&ms<mBest){mBest=ms;best=cs[k]} } } if(!best)best=DEF;try{source.put('hg_line',best);source.put('hg_line_chk',String(now))}catch(e6){} try{java.longToast('原线路不可用，已自动切换：'+best)}catch(e7){} return best})();\nvar h=String(result);\nvar root='';\ntry{root=String(source.get('hg_line')||'')}catch(e){}\nif(!root||root.indexOf('http')!==0){try{root=String(source.getBookSourceUrl())}catch(e2){root=''}}\nroot=root.split(String.fromCharCode(35,35))[0];\nif(!root||root.indexOf('http')!==0)root=String(baseUrl||'').split(String.fromCharCode(35,35))[0].replace(/\\/$/,'');\nroot=root.replace(/\\/$/,'');\nvar tp=h.match(/href=\"(\\/topics\\/[a-zA-Z0-9\\-]+\\/)\"/);\nif(tp)return root+tp[1];\nvar mv=h.match(/href=\"(\\/video\\/\\d+\\/)\"/);\nif(mv)return root+mv[1];\nreturn '';\n})()", "checkKeyWord": "全班地铁求生", "coverUrl": "@js:\n(function(){\nvar h=String(result);\nvar m=h.match(/data-src=\"([^\"]+)\"/);\nif(!m)return '';\nvar o=m[1];\nreturn o+(o.indexOf('?')<0?'?':'&')+'hgimgv=2';\n})()", "intro": "@js:\n(function(){\nvar h=String(result);\nvar tp=h.match(/class=\"hg-topic-card__meta\">[\\s\\S]*?<span>([^<]+)</);\nif(tp)return tp[1].trim();\nvar d=h.match(/class=\"hg-drama-card__desc\">([\\s\\S]*?)<\\/p>/)||h.match(/class=\"hg-rank-item__desc\">([\\s\\S]*?)<\\/p>/);\nreturn d?d[1].replace(/<[^>]*>/g,'').trim():'';\n})()", "kind": "@js:\n(function(){\nvar h=String(result);\nvar tp=h.match(/class=\"hg-topic-card__meta\">[\\s\\S]*?<span>([^<]+)</);\nif(tp)return '专题合集';\nvar t=h.match(/data-track-type-name=\"([^\"]*)\"/);\nvar tg=h.match(/class=\"hg-drama-card__tags\">([\\s\\S]*?)<\\/div>/)||h.match(/class=\"hg-rank-item__tags\">([\\s\\S]*?)<\\/div>/);\nvar g='';\nif(tg)g=tg[1].replace(/<span class=\"sr-only\">[\\s\\S]*?<\\/span>/g,'').replace(/<[^>]*>/g,' ').replace(/\\s+/g,' ').trim();\nif(t)return t[1]+' · '+g;\nreturn g;\n})()", "lastChapter": "@js:\n(function(){\nvar h=String(result);\nvar m=h.match(/data-ep-base=\"([^\"]*)\"/);\nif(m&&m[1]){\n  var t=h.match(/hg-ep-time__at\">([^<]*)</);\n  return t&&t[1]?m[1]+'（'+t[1]+'）':m[1];\n}\nvar s=h.match(/hg-drama-card__episode\">([^<]*)</);\nif(s&&s[1])return s[1];\nreturn '';\n})()", "name": "@js:\n(function(){\nvar h=String(result);\nvar m=h.match(/data-track-title=\"([^\"]*)\"/);\nif(m)return m[1];\nvar tp=h.match(/class=\"hg-topic-card__title\">([^<]+)</);\nif(tp)return tp[1].trim();\nvar a=h.match(/class=\"hg-drama-card__title\"[^>]*>[\\s\\S]*?<a[^>]*>([\\s\\S]*?)<\\/a>/)||h.match(/class=\"hg-rank-item__title\"[^>]*>[\\s\\S]*?<a[^>]*>([\\s\\S]*?)<\\/a>/);\nif(a)return a[1].replace(/<[^>]*>/g,'').replace(/全集在线观看/g,'').trim();\nreturn '';\n})()"}, "ruleToc": {"chapterList": "@js:\n(function(){\ntry{book.setType(4)}catch(e){}\nvar FIX=(function(){var DEF='https://thu.jxqgmx5ga.cc' ;var cur=DEF;try{var t=String(source.get('hg_line')||'');if(t.indexOf('http')===0)cur=t}catch(e){} var bad=cur.indexOf('h2na6qa39')>=0||cur.indexOf('arj2ftl0')>=0||cur.indexOf('40ygo615')>=0;var now=Date.now();var ts=0;try{ts=parseInt(String(source.get('hg_line_chk')))}catch(e){} if(isNaN(ts))ts=0;if(!bad&&now-ts<180000)return cur;var ok=false;if(!bad)try{ok=String(java.ajax(cur+'/,{\"timeout\":8000,\"retry\":0}')).length>20000}catch(e){} if(ok){try{source.put('hg_line_chk',String(now))}catch(e){} return cur}var best='';var cs=['https://thu.jxqgmx5ga.cc','https://pku.jxqgmx5ga.cc','https://fdu.jxqgmx5ga.cc','https://sjtu.jxqgmx5ga.cc','https://zju.jxqgmx5ga.cc','https://nju.jxqgmx5ga.cc'];var res=null;try{res=java.ajaxAll(cs,true)}catch(e1){} if(!res){try{res=java.ajaxAll(cs)}catch(e2){ } } if(res){var mBest=1e12;for(var k=0;k<res.length;k++){var code=-9,ms=1e12,bl=0;try{code=res[k].raw().code()}catch(e3){} try{ms=res[k].callTime()}catch(e4){} try{bl=String(res[k].body()).length}catch(e5){} if(code>=200&&code<400&&bl>20000&&ms<mBest){mBest=ms;best=cs[k]} } } if(!best)best=DEF;try{source.put('hg_line',best);source.put('hg_line_chk',String(now))}catch(e6){} try{java.longToast('原线路不可用，已自动切换：'+best)}catch(e7){} return best})();var h='';var usable=false;var line=FIX;\nfor(var att=0;att<3&&(!usable);att++){\n  if(att>0){line=(function(){var cs=['https://pku.jxqgmx5ga.cc','https://thu.jxqgmx5ga.cc','https://fdu.jxqgmx5ga.cc','https://zju.jxqgmx5ga.cc','https://nju.jxqgmx5ga.cc','https://xmu.jxqgmx5ga.cc','https://sysu.jxqgmx5ga.cc','https://jlu.jxqgmx5ga.cc'] ;var res=null;try{res=java.ajaxAll(cs,true)}catch(e1){} var best='';if(res){var mb=1e12;for(var k=0;k<res.length;k++){var code=-9,ms=1e12,bl=0;try{code=res[k].raw().code()}catch(e3){} try{ms=res[k].callTime()}catch(e4){} try{bl=String(res[k].body()).length}catch(e5){} if(code>=200&&code<401&&bl>20000&&ms<mb){mb=ms;best=cs[k]} } } return best||FIX})()}\n  var h2=String(java.ajax(String(baseUrl).replace(/^https?:\\/\\/[^\\/]+/,line.replace(/\\/$/,''))+',{\"timeout\":8000,\"retry\":0}'));\n  if(h2.indexOf('data-track-total-episode')>=0||h2.indexOf('hg-list-page')>=0){h=h2;usable=true}\n  else{try{source.put('hg_line_chk','0')}catch(e9){}}\n}\nvar bUrl=String(baseUrl).replace(/^https?:\\/\\/[^\\/]+/,(usable?line:FIX).replace(/\\/$/,''));\nvar root='';\ntry{root=String(source.get('hg_line')||'')}catch(e){}\nif(!root||root.indexOf('http')!==0){try{root=String(source.getBookSourceUrl())}catch(e2){root=''}}\nroot=root.split(String.fromCharCode(35,35))[0];\nif(!root||root.indexOf('http')!==0)root=String(baseUrl||'').split(String.fromCharCode(35,35))[0].replace(/\\/$/,'');\nroot=root.replace(/\\/$/,'');\nvar list=new Packages.java.util.ArrayList();\nvar TAB=String.fromCharCode(9);\nvar m=h.match(/data-track-total-episode=\"(\\d+)\"/);\nif(m){\n  var total=parseInt(m[1]);\n  var vr=String(bUrl).replace(/\\/$/,'').replace(/\\/ep-\\d+$/,'');\n  for(var i=1;i<=total;i++){list.add('第'+i+'集'+TAB+vr+(i===1?'/':'/ep-'+i+'/'));}\n  return list;\n}\nvar li=h.indexOf('hg-list-page');\nif(li<0){\n  var vr2=String(bUrl).replace(/\\/$/,'').replace(/\\/ep-\\d+$/,'');\n  list.add('第1集'+TAB+vr2+'/');\n  return list;\n}\nvar body=h.substring(li);\nvar re=/data-track-title=\"([^\"]*)\"/g,mm;\nwhile((mm=re.exec(body))!=null){\n  var st=body.lastIndexOf('<div',mm.index);\n  var seg=body.substring(st,st+1500);\n  var u=seg.match(/href=\"(\\/video\\/\\d+\\/)\"/);\n  if(!u)continue;\n  list.add(mm[1]+TAB+root+u[1]);\n}\nif(list.size()===0)list.add('专题视频'+TAB+root+'/');\nreturn list;\n})()", "chapterName": "@js:\n(function(){\nvar s=''+result;var i=s.indexOf(String.fromCharCode(9));return i>0?s.substring(0,i):s;\n})()", "chapterUrl": "@js:\n(function(){\nvar s=''+result;var i=s.indexOf(String.fromCharCode(9));return i>0?s.substring(i+1):s;\n})()"}, "searchUrl": "{{(function(){var DEF='https://thu.jxqgmx5ga.cc' ;var cur=DEF;try{var t=String(source.get('hg_line')||'');if(t.indexOf('http')===0)cur=t}catch(e){} var bad=cur.indexOf('h2na6qa39')>=0||cur.indexOf('arj2ftl0')>=0||cur.indexOf('40ygo615')>=0;var now=Date.now();var ts=0;try{ts=parseInt(String(source.get('hg_line_chk')))}catch(e){} if(isNaN(ts))ts=0;if(!bad&&now-ts<180000)return cur;var ok=false;if(!bad)try{ok=String(java.ajax(cur+'/,{\"timeout\":8000,\"retry\":0}')).length>20000}catch(e){} if(ok){try{source.put('hg_line_chk',String(now))}catch(e){} return cur}var best='';var cs=['https://thu.jxqgmx5ga.cc','https://pku.jxqgmx5ga.cc','https://fdu.jxqgmx5ga.cc','https://sjtu.jxqgmx5ga.cc','https://zju.jxqgmx5ga.cc','https://nju.jxqgmx5ga.cc'];var res=null;try{res=java.ajaxAll(cs,true)}catch(e1){} if(!res){try{res=java.ajaxAll(cs)}catch(e2){ } } if(res){var mBest=1e12;for(var k=0;k<res.length;k++){var code=-9,ms=1e12,bl=0;try{code=res[k].raw().code()}catch(e3){} try{ms=res[k].callTime()}catch(e4){} try{bl=String(res[k].body()).length}catch(e5){} if(code>=200&&code<400&&bl>20000&&ms<mBest){mBest=ms;best=cs[k]} } } if(!best)best=DEF;try{source.put('hg_line',best);source.put('hg_line_chk',String(now))}catch(e6){} try{java.longToast('原线路不可用，已自动切换：'+best)}catch(e7){} return best})()}}/search/video/{{encodeURIComponent(key)}}/", "weight": 0},{"bookSourceComment": "jmtt1.net(18mh.net) 三模式书源 v1.0", "bookSourceGroup": "AI", "bookSourceName": "禁漫天堂（漫画小说视频）", "bookSourceType": 0, "bookSourceUrl": "https://jmtt1.net", "bookUrlPattern": ".*\\/(comic|novel|mv)\\/detail\\/\\d+.*", "concurrentRate": "1/1500", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:(function(){\nvar H='https://abandon.yyc2mhau.cc';\nvar m='';\ntry{m=String(source.get('jmMode'));}catch(e1){}\nif(m==='null'||m==='undefined'){m='';}\nif(m===''){try{m=String(source.getVariable());}catch(e2){}if(m==='null'||m==='undefined'){m='';}}\nvar seg='comic';if(m==='小说'){seg='novel';}else if(m==='视频'){seg='mv';}\nvar comicCats=[['全部',''],['爱情','/aq'],['BL','/bl'],['单本','/db'],['短篇','/dp'],['韩漫','/hg'],['剧情','/jq'],['乱伦','/ll'],['奇幻','/qh'],['日漫','/rb'],['调教','/tj'],['同人','/tr'],['校园','/xy']];\nvar novelCats=[['全部',''],['都市激情','/dsjq'],['校园春色','/xycs'],['乡村爱情','/xcaq'],['系统异能','/xtyn'],['家庭乱伦','/jtll'],['穿越重生','/cycs'],['经典武侠','/jdwx'],['同人改编','/trgb'],['科学幻想','/kxhx'],['东方玄幻','/dfxh'],['娱乐明星','/ylmx'],['历史架空','/lsjk'],['西方魔幻','/xfmh'],['贤者小说','/xzxs']];\nvar mvCats=[['全部',''],['AI短剧','/aidj'],['国产视频','/gcsp'],['日本AV','/rbav'],['H动漫','/hdm'],['偷拍摄像','/tp'],['次元萝莉','/cyll'],['国产传媒','/gccm'],['主播福利','/zbfl'],['吃瓜爆料','/cgbl'],['无码流出','/wmlc'],['高清AV','/gqav'],['同人热播','/trrb'],['3D动漫','/3ddm']];\nvar cats=seg==='novel'?novelCats:(seg==='mv'?mvCats:comicCats);\nvar rows=[];\nfor(var i=0;i<cats.length;i++){\n  rows.push({title:seg+'·'+cats[i][0],url:H+'/'+seg+'/all'+cats[i][1]});\n}\nrows.push({title:'漫画·排行榜',url:H+'/comic/rank'});\nrows.push({title:'漫画·最近更新',url:H+'/comic/newest'});\nreturn JSON.stringify(rows);\n})()", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.82 Mobile Safari/537.36\"}", "jsLib": "// jmLib: 线路/模式/请求工具（规则 @js 与 loginUrl 共享；ES5 语法，Rhino 安全子集）\nvar JM_HOST_DEF = 'https://abandon.yyc2mhau.cc';\nvar JM_UA = 'Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.82 Mobile Safari/537.36';\nvar JM_PUB = 'https://jmtt1.net';\n\nfunction jmStr(v) {\n  var s = String(v == null ? '' : v);\n  if (s === 'null' || s === 'undefined') s = '';\n  return s;\n}\n\nfunction jmHost(sv) {\n  try {\n    var h = jmStr(sv.get('jmHost'));\n    if (h.indexOf('http') === 0) return h;\n  } catch (e1) {}\n  try {\n    var v = jmStr(sv.getVariable());\n    if (v.indexOf('http') === 0) return v;\n  } catch (e2) {}\n  return JM_HOST_DEF;\n}\n\nfunction jmUA() {\n  return JM_UA;\n}\n\nfunction jmOpt(timeout) {\n  var t = timeout || 20000;\n  return ',{\"headers\":{\"User-Agent\":\"' + JM_UA + '\"},\"timeout\":' + t + '}';\n}\n\nfunction jmMode(sv) {\n  var m = '';\n  try {\n    m = jmStr(sv.get('jmMode'));\n  } catch (e1) {}\n  if (m === '') {\n    try {\n      var v = sv.getVariable();\n      m = jmStr(v);\n    } catch (e2) {}\n  }\n  if (m === '小说' || m === '视频') return m;\n  return '漫画';\n}\n", "lastUpdateTime": "1793420433119", "loginUi": "[\n  {\"name\":\"jmPub\",\"type\":\"text\",\"viewName\":\"'🌐 发布页地址（可改）'\",\"value\":\"https://jmtt1.net\",\"action\":\"jmSavePub(java)\"},\n  {\"name\":\"jmFetch\",\"type\":\"button\",\"viewName\":\"'📡 一键从发布页获取线路'\",\"action\":\"jmFetchLines(java)\"},\n  {\"name\":\"jmTest\",\"type\":\"button\",\"viewName\":\"'📶 测试延时（ms 回填各线路按钮）'\",\"action\":\"jmTestCurrent(java)\"},\n  {\"name\":\"jmStatus\",\"type\":\"button\",\"viewName\":\"jmHostLabel()\",\"action\":\"jmTestCurrent(java)\"},\n  {\"name\":\"jmModeC\",\"type\":\"button\",\"viewName\":\"jmModeLabel('漫画')\",\"action\":\"jmSetMode(java,'漫画')\"},\n  {\"name\":\"jmModeN\",\"type\":\"button\",\"viewName\":\"jmModeLabel('小说')\",\"action\":\"jmSetMode(java,'小说')\"},\n  {\"name\":\"jmModeV\",\"type\":\"button\",\"viewName\":\"jmModeLabel('视频')\",\"action\":\"jmSetMode(java,'视频')\"},\n  {\"name\":\"jmLine0\",\"type\":\"button\",\"viewName\":\"jmLineLabel(0)\",\"action\":\"jmPickLine(java,0)\"},\n  {\"name\":\"jmLine1\",\"type\":\"button\",\"viewName\":\"jmLineLabel(1)\",\"action\":\"jmPickLine(java,1)\"},\n  {\"name\":\"jmLine2\",\"type\":\"button\",\"viewName\":\"jmLineLabel(2)\",\"action\":\"jmPickLine(java,2)\"},\n  {\"name\":\"jmLine3\",\"type\":\"button\",\"viewName\":\"jmLineLabel(3)\",\"action\":\"jmPickLine(java,3)\"},\n  {\"name\":\"jmLine4\",\"type\":\"button\",\"viewName\":\"jmLineLabel(4)\",\"action\":\"jmPickLine(java,4)\"},\n  {\"name\":\"jmLine5\",\"type\":\"button\",\"viewName\":\"jmLineLabel(5)\",\"action\":\"jmPickLine(java,5)\"}\n]", "loginUrl": "// jmtt loginUrl: 登录检查 + 三模式切换 + 发布页获取线路 + 测速选线（V1 静态 loginUi 的 action 函数库）\n// 环境：$loginJS\\n$buttonJS，source/java 绑定可用；java=SourceLoginJsExtensions（put/get/toast/longToast/ajax）\n// ★ 本串中 Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.82 Mobile Safari/537.36 占位在构建时替换为真实 UA；单引号字符串，避免与 action 的 Q() 拼接冲突\nfunction login() {\n  return '游客模式可用，无需登录。请使用下方按钮管理线路与模式。';\n}\n\nfunction jmQ(c) {\n  return String.fromCharCode(39);\n}\n\nfunction jmToast(jv, msg) {\n  try { jv.toast(msg); } catch (e1) {}\n  try { jv.longToast(msg); } catch (e2) {}\n}\n// 三模式切换：source.put('jmMode', mode) + 刷新面板按钮名\nfunction jmSetMode(java, mode) {\n  var jv = java;\n  try { jv.put('jmMode', mode); } catch (e1) {}\n  try { jv.setVariable(mode); } catch (e1b) {}\n  try { jv.toast('已切换：' + mode + ' 模式'); } catch (e2) {}\n  try { jv.reLoginView(false); } catch (e3) {}\n  return mode;\n}\n\n// 一键从发布页获取线路：抓 jmtt1.net 词表 → 生成候选 → 并发测速 → 最快者写 jmHost\nfunction jmFetchLines(java) {\n  var jv = java;\n  var msg = '';\n  try {\n    jmToast(jv, '⏳ 正在从发布页 jmtt1.net 获取线路…');\n    var pub = String(jv.ajax(jmPubUrl() + ',{\"timeout\":15000}'));\n    var mw = pub.match(/words\\s*=\\s*'([a-z,]+)'/);\n    if (!mw) { jmToast(jv, '❌ 发布页词表解析失败（检查发布页地址）'); return; }\n    var words = mw[1].split(',');\n    msg = '词表 ' + words.length + ' 词；';\n    // 生成候选：词表随机取 4 + backup 固定 2 = 6 线（与面板 6 个线路按钮对应）\n    var cand = [];\n    var used = {};\n    var tries = 0;\n    while (cand.length < 4 && tries < 60) {\n      tries++;\n      var w = words[Math.floor(Math.random() * words.length)];\n      if (w && !used[w]) { used[w] = 1; cand.push('https://' + w + '.yyc2mhau.cc'); }\n    }\n    // backup 固定域（/index/backup 页实测域名池样本）\n    var fixed = ['https://w9xfv.yyc2mhau.cc', 'https://18mh.01buliangrukou.com'];\n    for (var fi = 0; fi < fixed.length; fi++) {\n      if (cand.indexOf(fixed[fi]) < 0) cand.push(fixed[fi]);\n    }\n    jmSpeedTest(java, cand);\n  } catch (e) {\n    jmToast(jv, '❌ 获取线路失败：' + String(e).substring(0, 120));\n  }\n}\n// 逐线路测速：结果写 jmLatN 供 viewName 显示，最快写 jmHost；含 4073ms 防抖守卫\nfunction jmSpeedTest(java, cand) {\n  var jv = java;\n  var best = -1;\n  var bestMs = 999999;\n  for (var i = 0; i < cand.length; i++) {\n    var u = cand[i];\n    var t0 = Date.now();\n    var ok = false;\n    try {\n      String(jv.ajax(u + '/favicon.ico,{\"timeout\":8000}'));\n      ok = true;\n    } catch (e) { ok = false; }\n    var ms = Date.now() - t0;\n    if (!ok) ms = 999999;\n    try { jv.put('jmLat' + i, ok ? (ms + 'ms') : '超时'); } catch (ep) {}\n    try { jv.put('jmLine' + i, u); } catch (ep2) {}\n    if (ok && ms < bestMs) { bestMs = ms; best = i; }\n  }\n  var msg = '';\n  for (var j = 0; j < cand.length; j++) {\n    var l = '';\n    try { l = jmStr(jv.get('jmLine' + j)); } catch (eg) {}\n    var lt = '';\n    try { lt = jmStr(jv.get('jmLat' + j)); } catch (eg2) {}\n    if (l !== '') msg += (j + 1) + '. ' + l.replace('https://', '') + ' → ' + lt + '\\n';\n  }\n  var cur = '';\n  try { cur = jmStr(jv.get('jmHost')); } catch (eg3) {}\n  if (best >= 0) {\n    try { jv.put('jmHost', cand[best]); } catch (ep3) {}\n    msg += '✅ 已切换最快线路：' + cand[best].replace('https://', '') + '（' + bestMs + 'ms）';\n    jmToast(jv, msg);\n  } else {\n    msg += '❌ 全部线路不可达';\n    jmToast(jv, msg);\n  }\n  try { jv.reLoginView(false); } catch (er) {}\n}\n\n// 保存发布页输入值；jmGetPubInp 始终返回 true（V1 静态面板 text 行的值经 form 机制自动持久化）\nfunction jmSavePub(java) {\n  var jv = java;\n  var v = '';\n  try { v = jmStr(jv.get('jmPub')); } catch (e) {}\n  if (v.indexOf('http') !== 0) v = 'https://jmtt1.net';\n  try { jv.put('jmPub', v); } catch (e2) {}\n  jmToast(jv, '✅ 发布页地址已保存：' + v);\n  try { jv.reLoginView(false); } catch (e3) {}\n}\n\nfunction jmGetPubInp(v) {\n  return true;\n}\n\n// jmFetchLines 改从 jmPub 读发布页地址\nfunction jmPubUrl() {\n  var v = '';\n  try { v = jmStr(source.get('jmPub')); } catch (e) {}\n  if (v.indexOf('http') !== 0) v = 'https://jmtt1.net';\n  return v.replace(/\\/+$/, '');\n}\n\n// —— loginUrl 作用域独立的工具副本（不依赖 jsLib）——\nfunction jmStr(v) {\n  var s = String(v == null ? '' : v);\n  if (s === 'null' || s === 'undefined') s = '';\n  return s;\n}\n\n// 测试当前已存线路延时（不自动切换，只回填 ms 到各按钮）\nfunction jmTestCurrent(java) {\n  var jv = java;\n  var cand = [];\n  for (var i = 0; i < 6; i++) {\n    var u = '';\n    try { u = jmStr(jv.get('jmLine' + i)); } catch (e) {}\n    if (u.indexOf('http') === 0) cand.push(u);\n  }\n  if (cand.length === 0) {\n    jmToast(jv, '⚠️ 尚无线路缓存，请先点「📡 从发布页获取线路」');\n    return;\n  }\n  jmSpeedTest(java, cand, false);\n}\n\n// 点击某个线路按钮：快测该线 → 可达则切换 jmHost\nfunction jmPickLine(java, idx) {\n  var jv = java;\n  var u = '';\n  try { u = jmStr(jv.get('jmLine' + idx)); } catch (e) {}\n  if (u.indexOf('http') !== 0) {\n    jmToast(jv, '⚠️ 该线路位为空，请先点「📡 从发布页获取线路」');\n    return;\n  }\n  jmToast(jv, '⏳ 正在测试 ' + u.replace('https://', '') + ' …');\n  var t0 = Date.now();\n  var ok = false;\n  try {\n    String(jv.ajax(u + '/favicon.ico,{\"timeout\":6000}'));\n    ok = true;\n  } catch (e2) { ok = false; }\n  var ms = Date.now() - t0;\n  if (ok) {\n    try { jv.put('jmHost', u); } catch (e3) {}\n    try { jv.put('jmLat' + idx, ms + 'ms'); } catch (e4) {}\n    jmToast(jv, '✅ 已切换线路：' + u.replace('https://', '') + '（' + ms + 'ms）');\n  } else {\n    try { jv.put('jmLat' + idx, '超时'); } catch (e5) {}\n    jmToast(jv, '❌ 该线路不可达（超时），未切换');\n  }\n  try { jv.reLoginView(false); } catch (e6) {}\n}\n\n// —— viewName 标签函数（面板每次渲染重跑）——\nfunction jmModeLabel(m) {\n  var cur = '';\n  try { cur = jmStr(source.get('jmMode')); } catch (e) {}\n  if (cur === '') cur = '漫画';\n  var icon = m === '漫画' ? '📖' : (m === '小说' ? '📝' : '🎬');\n  return icon + ' ' + m + (cur === m ? ' ✓' : '');\n}\n\nfunction jmLineLabel(i) {\n  var h = '';\n  try { h = jmStr(source.get('jmLine' + i)); } catch (e) {}\n  var lat = '';\n  try { lat = jmStr(source.get('jmLat' + i)); } catch (e2) {}\n  if (h === '') return '线路' + (i + 1) + '（空）';\n  var cur = '';\n  try { cur = jmStr(source.get('jmHost')); } catch (e3) {}\n  var tag = cur === h ? ' ●当前' : '';\n  return '切 ' + h.replace('https://', '') + (lat === '' ? '' : ' ' + lat) + tag;\n}\n\nfunction jmHostLabel() {\n  var h = '';\n  try { h = jmStr(source.get('jmHost')); } catch (e) {}\n  if (h === '') h = '默认 abandon.yyc2mhau.cc';\n  return '🌐 当前线路：' + h.replace('https://', '');\n}\n", "respondTime": 180000, "ruleBookInfo": {"author": "@js:(function(){try{var m=String(result).match(/\"author\":\\s*\\{\\s*\"@type\":\\s*\"Person\",\\s*\"name\":\\s*\"([^\"]+)\"/);if(m)return m[1];}catch(e){}try{var a=String(result).match(/all\\/author\\/[^>]*>([^<]+)</);if(a)return a[1];}catch(e2){}return \"\";})()", "coverUrl": "@js:(function(){var t=String(result||\"\");var H=String(baseUrl).match(/^https?:\\/\\/[^\\/]+/);H=H?H[0]:\"https://abandon.yyc2mhau.cc\";var m=t.match(/data-src=\"https?:\\/\\/[^\\/?]+(\\/upload[^\"]+)\"/);if(m){var p=m[1].split(\"?\")[0];var b=java.base64Encode(p);var ext=p.split(\".\").pop();return H+\"/social-cover/\"+b+\".\"+ext;}try{var og=t.match(/og:image\" content=\"([^\"]+)\"/);if(og)return og[1];}catch(e2){}return \"\";})()", "intro": "@js:(function(){try{var m=String(result).match(/og:description\" content=\"([^\"]+)\"/);if(m)return m[1];}catch(e){}return '';})()", "kind": "@js:(function(){try{var m=String(result).match(/\"genre\":\\s*\\[([^\\]]+)\\]/);if(m){return m[1].replace(/\"/g,'').split(',').join(',');}return '';}catch(e){}try{var t=String(result).match(/jm-dt-tags[\\s\\S]{0,2500}?<\\/div>/);if(t){var g=t[0].match(/>([^<>]{1,12})<\\/<a>/g)||[];var o=[];for(var i=0;i<g.length;i++){var w=g[i].replace(/^>/,'').replace(/<\\/a>$/,'');if(w&&o.length<8)o.push(w);}return o.join(',');}return '';}catch(e2){}return '';})()", "lastChapter": "@js:(function(){try{var m=String(result).match(/jm-dt-ch__no\">([^<]+)<[\\s\\S]{0,200}?jm-dt-ch__t\">([^<]+)</);if(m)return m[1]+' '+m[2];}catch(e){}return '';})()", "name": "@js:(function(){var t=String(result||\"\");var m=t.match(/\"@type\":\\s*\"(?:ComicStory|Book|VideoObject)\"[\\s\\S]{0,3000}?\"name\":\\s*\"([^\"]+)\"/);if(m)return m[1];try{var h=t.match(/<h1[^>]*>([\\s\\S]{0,150}?)<\\/h1>/);if(h)return h[1].replace(/<[^>]*>/g,\"\").trim();}catch(e2){}return \"\";})()", "tocUrl": "@js:baseUrl"}, "ruleContent": {"content": "@js:(function(){\nvar u=String(baseUrl||'');\nvar t=String(result||'');\nvar out=[];\n// ===== 视频分支 =====\nif(u.indexOf('/mv/')>=0){\n  var mid=(u.match(/\\/detail\\/(\\d+)/)||[])[1];\n  var embed=u.replace(/\\/detail\\/\\d+.*$/,'/embed?id='+ (mid||''));\n  var title='';\n  try{var mm=String(result).match(/\"@type\":\\s*\"VideoObject\"[\\s\\S]{0,2000}?\"name\":\\s*\"([^\"]+)\"/);if(mm)title=mm[1];}catch(e3){}\n  try{java.startBrowser(embed, title||'禁漫天堂视频');}catch(e1){}\n  out.push('🎬 已在内置浏览器打开播放器。');\n  out.push('');\n  out.push('若未弹出，点菜单【刷新正文】重试，或手动打开：');\n  out.push(embed);\n  out.push('');\n  out.push('（三层签名链 m3u8+auth_key+1800s 窗口，需浏览器 hls.js 播放）');\n  return out.join('\\n');\n}\n// ===== 漫画分支 =====\nif(u.indexOf('/comic/')>=0){\n  var pi=t.indexOf('<section class=\"jm-rd-pages\"');\n  var pe=t.indexOf('</section>',pi);\n  var seg=pi>=0?t.substring(pi,pe):t;\n  var H=u.match(/^https?:\\/\\/[^\\/]+/);\n  H=H?H[0]:'https://abandon.yyc2mhau.cc';\n  var re=/data-src=\"(https?:\\/\\/[^\\/?]+)(\\/upload[^\"?]+)[^\"]*\"/g;var m;\n  while((m=re.exec(seg))!==null){\n    var p=m[2];\n    var b=java.base64Encode(p);\n    var ext=p.split('.').pop();\n    out.push('<img src=\"'+H+'/social-cover/'+b+'.'+ext+'\">');\n  }\n  if(out.length===0){\n    var re2=/<img[^>]*src=\"https?:\\/\\/[^\\/?]+(\\/upload[^\"?]+)[^\"]*\"/g;var m2;\n    while((m2=re2.exec(seg))!==null){\n      var p2=m2[1];\n      var b2=java.base64Encode(p2);\n      var e2=p2.split('.').pop();\n      out.push('<img src=\"'+H+'/social-cover/'+b2+'.'+e2+'\">');\n    }\n  }\n  return out.join('\\n');\n}\n// ===== 小说分支 =====\nvar si=t.indexOf('jm-rd-text');\nvar st=t.indexOf('>',si);\nvar en=t.indexOf('data-rd-text-end',st);\nif(en<0)en=t.indexOf('</article>',st);\nif(en<0)en=st+60000;\nvar seg2=t.substring(st+1,en);\nvar ps=seg2.match(/<p>[\\s\\S]*?<\\/p>/g)||[];\nvar ps2=[];\nfor(var i=0;i<ps.length;i++){\n  var x=ps[i].replace(/^<p>/,'').replace(/<\\/p>$/,'').replace(/<[^>]+>/g,'').replace(/&nbsp;/g,' ');\n  if(x.replace(/\\s/g,'')!=='')ps2.push('　　'+x);\n}\nif(ps2.length===0){ps2.push(String(t).substring(0,120));}\nreturn ps2.join('\\n');\n})()", "imageStyle": "FULL"}, "ruleExplore": [], "ruleSearch": {"bookList": "li.jm-card,li.jm-vcard", "bookUrl": "a.jm-card__cover@href||a.jm-vcard__cover@href", "checkKeyWord": "浪花里", "coverUrl": "@js:(function(){var h=\"\";try{h=result.html();}catch(e){h=String(result);}var m=h.match(/data-src=\"https?:\\/\\/[^\\/?]+(\\/upload[^\"]+)\"/);if(m){var p=m[1].split(\"?\")[0];var b=java.base64Encode(p);var ext=p.split(\".\").pop();var H=String(baseUrl).match(/^https?:\\/\\/[^\\/]+/);H=H?H[0]:\"https://abandon.yyc2mhau.cc\";return H+\"/social-cover/\"+b+\".\"+ext;}var s=h.match(/src=\"(https?:[^\"]+upload[^\"]+)\"/);return s?s[1]:\"\";})()", "kind": "span.jm-card__badge--status@text||span.jm-vcard__dur@text", "name": "h3 a@text"}, "ruleToc": {"chapterList": "@js:(function(){\nvar u=String(baseUrl||'');\nvar t=String(result||'');\nvar ps=t.indexOf('data-jm-dt-panel=\"chap\"');\nvar seg=ps>=0?t.substring(ps):t;\nvar L=[];\nvar isC=u.indexOf('/comic/')>=0;\nvar isV=u.indexOf('/mv/')>=0;\nvar r;\nif(isC){r=/href=\"(\\/comic\\/chapter\\/\\d+\\/\\d+)\"/g;}\nelse{r=/href=\"(\\/novel_chapter\\/\\d+\\/\\d+\\.html)\"/g;}\nvar seen={};var m;\nwhile((m=r.exec(seg))!==null){\n  var url=m[1];\n  if(seen[url])continue;\n  seen[url]=1;\n  var tail=url.split('/').pop();\n  var num=tail.replace(/^\\D+/,'').replace(/\\.html$/,'');\n  var title='\\u7b2c'+num+'\\u7ae0';\n  var ctx=seg.substring(m.index, m.index+600);\n  var mn=ctx.match(/jm-dt-ch__no\">([^<]+)</);\n  var mt=ctx.match(/jm-dt-ch__t\">([^<]+)</);\n  if(mn&&mt){title=mn[1]+' '+mt[1];}\n  var o={};o['title']=title;o['url']=url;L.push(o);\n}\ntry{if(isV){book.type=4;}else if(!isC){book.type=8;}else{book.type=64;}}catch(eT){}\nif(L.length===0&&isV){var o2={};o2['title']='\\u25b6 \\u6253\\u5f00\\u64ad\\u653e';o2['url']=u;L.push(o2);}\nreturn L;\n})()", "chapterName": "title", "chapterUrl": "url"}, "searchUrl": "@js:(function(){\nvar H='https://abandon.yyc2mhau.cc';\nvar UA='Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.82 Mobile Safari/537.36';\nvar m='';\ntry{m=String(source.get('jmMode'));}catch(e1){}\nif(m==='null'||m==='undefined'){m='';}\nif(m===''){try{m=String(source.getVariable());}catch(e2){}if(m==='null'||m==='undefined'){m='';}}\nvar seg='comic';\nif(m==='小说'){seg='novel';}else if(m==='视频'){seg='mv';}\nreturn H+'/'+seg+'/all?key_word={{key}}&page={{page}}' + ',{\"headers\":{\"User-Agent\":\"' + UA + '\"},\"timeout\":20000}';\n})()", "weight": 0},{"bookSourceComment": "【手机小说 shoujixs.net】\n站点：笔趣阁家族多域名同库站（wap主站UTF-8 + open-ki双备用域 + www GBK PC站）。\n无登录、无验证码、无CF、正文无广告。\n⚠️搜索限频：站点写入 ss_search_delay=1 Cookie 后 120 秒内拒绝搜索（返回 alert 搜索间隔页）；搜索限频已破解：searchUrl 的 URL选项 js 在每次搜索发请求前自动 removeCookie 清掉 ss_search_delay 限频标记（服务端认不到会话Cookie即当新访客放行），concurrentRate=1次/3秒防轰炸；loginCheckJs 兜底把限频页改写为提示。\n\n线路说明：\n- 登录面板可切换 3 条同库线路（wap.shoujixs.net 主 / open-ki.jishouzj.cc / open-ki.jishouxs.cc），支持一键测速选最快、自定义网址。\n- www.shoujixs.net 是 GBK 编码的 PC 模板，页面结构与 WAP 系完全不同，请勿填入自定义网址。\n- 站点无发布页，故面板提供「预置线路+测速+自定义网址」组合替代发布页功能。\n\n结构要点（规则为何这样写）：\n- 详情页 og:novel:* 全字段，三模板统一提取。\n- 目录：wap 模板的 div.directoryArea 未闭合（最新5章与全部章节同容器），用「全部章节列表/正文」h2 锚点切割后再按章节URL正则过滤；open-ki 模板是规范双容器取第2个。目录分页「下一页」按钮与「上一页」同容器，用按钮文本「下一页」判据取 href，末页 javascript:void(0) 返回 null 干净终止。\n- 正文：#articlecon(嵌套p>p) / #chaptercontent(直属p) 统一取内层p；章内分页 a#pt_next 用文本「下一页」判据（末页文本是「下一章」，必须排除否则会串章）。\n- 发现页（固定走主站 wap.shoujixs.net）：分类11类+周榜/月榜/总榜/全本各12项，URL 已实测全部有效；备用线路（open-ki.*）是纯书库镜像无列表页（列表页全404），故发现页不跟随线路切换；分类页约30页之后存在站点自身的数据空洞页（返回空列表），属站点数据问题非书源问题。\n\n搜索提示：支持书名和作者搜索；⚠️站点限制关键词最少 4 个汉字（少于 4 字必失败，书源已做前置提示）；限频已破解（每次搜索前自动清除 ss_search_delay 标记，服务端视为新访客放行）。", "bookSourceGroup": "AI", "bookSourceName": "手机小说", "bookSourceType": 0, "bookSourceUrl": "https://wap.shoujixs.net", "bookUrlPattern": ".*(shoujixs\\.(?:net|com)|jishouzj\\.cc|jishouxs\\.cc)/shoujixs_\\d+.*", "concurrentRate": "1,3000", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:(function(){var h='https://wap.shoujixs.net';var kinds=[['玄幻奇幻','xhqh'],['武侠小说','wx'],['仙侠小说','xx'],['都市现实','ds'],['军事小说','js'],['历史小说','ls'],['游戏体育','yxty'],['科幻小说','kh'],['灵异小说','ly'],['二次元类','ecy'],['言情小说','yq']];var out=[];var full={layout_flexGrow:1,layout_flexBasisPercent:1.0,layout_wrapBefore:true};var half={layout_flexGrow:1,layout_flexBasisPercent:0.5};var quarter={layout_flexGrow:1,layout_flexBasisPercent:0.25};out.push({title:'📚 分区',url:'',style:full});for(var i=0;i<kinds.length;i++){out.push({title:kinds[i][0],url:h+'/'+kinds[i][1]+'_{{page}}.html',style:quarter});}out.push({title:'🏆 周榜',url:'',style:full});out.push({title:'全部',url:h+'/top/week_{{page}}.html',style:quarter});for(var i=0;i<kinds.length;i++){out.push({title:kinds[i][0],url:h+'/top/week'+(i+1)+'_{{page}}.html',style:quarter});}out.push({title:'📅 月榜',url:'',style:full});out.push({title:'全部',url:h+'/top/month_{{page}}.html',style:quarter});for(var i=0;i<kinds.length;i++){out.push({title:kinds[i][0],url:h+'/top/month'+(i+1)+'_{{page}}.html',style:quarter});}out.push({title:'📜 总榜',url:'',style:full});out.push({title:'全部',url:h+'/top/all_{{page}}.html',style:quarter});for(var i=0;i<kinds.length;i++){out.push({title:kinds[i][0],url:h+'/top/all'+(i+1)+'_{{page}}.html',style:quarter});}out.push({title:'✅ 全本',url:'',style:full});out.push({title:'全部',url:h+'/quanben_{{page}}.html',style:quarter});for(var i=0;i<kinds.length;i++){out.push({title:kinds[i][0],url:h+'/quanben'+(i+1)+'_{{page}}.html',style:quarter});}return JSON.stringify(out);})()", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1793374230323", "loginCheckJs": "(function(){\nfunction bodyOf(x){var b='';try{b=String(x.body())}catch(e){try{b=String(x.body)}catch(e2){b=''}}return b;}\nvar b=bodyOf(result);\nif(b.indexOf('alert(')>=0&&b.length<500){\n  var msg='';\n  var m=String(b).match(/alert\\(\"([^\"]+)\"\\)/);\n  if(m)msg=m[1];\n  var tip='';\n  if(msg.indexOf('搜索间隔')>=0){\n    tip='<html><body><p>站点搜索限频：'+msg+'。书源每次搜索前会自动清除限频标记，若仍遇此提示请等待2分钟或稍后再试。</p></body></html>';\n  }else if(msg.indexOf('关键字')>=0){\n    tip='<html><body><p>关键词不符合要求：'+msg+'。本站要求关键词至少 4 个汉字，请输入更长的书名或作者名。</p></body></html>';\n  }else{\n    tip='<html><body><p>站点提示：'+msg+'</p></body></html>';\n  }\n  try{\n    return new Packages.io.legado.app.help.http.StrResponse(String(baseUrl), tip);\n  }catch(e){return result;}\n}\nreturn result;\n})()", "loginUi": "[{\"name\": \"状态\", \"type\": \"button\", \"action\": \"FQ_sj_now(java,source)\", \"viewName\": \"(function(){var h='';try{h=String(source.getVariable()||'')}catch(e){};return '🌐 当前线路：'+(h||String(source.getKey()||'wap.shoujixs.net'))})()\"}, {\"name\": \"customUrl\", \"type\": \"text\"}, {\"name\": \"使用自定义网址\", \"type\": \"button\", \"action\": \"FQ_sj_custom(java,source)\"}, {\"name\": \"线路1\", \"type\": \"button\", \"action\": \"FQ_sj_pick(java,source,0)\", \"viewName\": \"(function(){var cur='';try{cur=String(source.getVariable()||'')}catch(e){};var m='';try{m=String(source.get('sjMs0')||'')}catch(e){};var star=cur.indexOf('wap.shoujixs.net')>=0?'✅ ':'　';return star+'📶 wap.shoujixs.net[主] '+(m?('('+m+')'):'(未测速)')})()\"}, {\"name\": \"线路2\", \"type\": \"button\", \"action\": \"FQ_sj_pick(java,source,1)\", \"viewName\": \"(function(){var cur='';try{cur=String(source.getVariable()||'')}catch(e){};var m='';try{m=String(source.get('sjMs1')||'')}catch(e){};var star=cur.indexOf('jishouzj.cc')>=0?'✅ ':'　';return star+'📶 open-ki.jishouzj.cc '+(m?('('+m+')'):'(未测速)')})()\"}, {\"name\": \"线路3\", \"type\": \"button\", \"action\": \"FQ_sj_pick(java,source,2)\", \"viewName\": \"(function(){var cur='';try{cur=String(source.getVariable()||'')}catch(e){};var m='';try{m=String(source.get('sjMs2')||'')}catch(e){};var star=cur.indexOf('jishouxs.cc')>=0?'✅ ':'　';return star+'📶 open-ki.jishouxs.cc '+(m?('('+m+')'):'(未测速)')})()\"}, {\"name\": \"⚡ 一键测速并切换最快线路\", \"type\": \"button\", \"action\": \"FQ_sj_auto(java,source)\"}, {\"name\": \"⏱ 仅测试全部线路延时\", \"type\": \"button\", \"action\": \"FQ_sj_speed(java,source)\"}, {\"name\": \"🔍 检查连接/登录状态\", \"type\": \"button\", \"action\": \"FQ_sj_check(java,source)\"}, {\"name\": \"🧹 清除限频Cookie\", \"type\": \"button\", \"action\": \"FQ_sj_clear(java,source)\"}, {\"name\": \"ℹ️ 本站无需登录；站点无发布页，已预置3条同库线路；www.shoujixs.net 是GBK版模板不同请勿填入\", \"type\": \"label\"}]", "loginUrl": "function login(){java.toast('本站无需账号登录；请用下方按钮管理线路')}\nfunction SJ_hosts(){return ['https://wap.shoujixs.net','https://open-ki.jishouzj.cc','https://open-ki.jishouxs.cc'];}\nfunction SJ_host(sv){\n  var h='';try{h=String(sv.getVariable()||'')}catch(e){h=''}\n  var hs=SJ_hosts();\n  for(var i=0;i<hs.length;i++){if(h==hs[i])return hs[i];}\n  if(h.indexOf('http')===0)return h;\n  return String(sv.getKey());\n}\nfunction SJ_set(sv,u){try{sv.setVariable(u)}catch(e){}return u;}\nfunction SJ_refresh(){\n  var ok=false;\n  try{java.reLoginView();ok=true}catch(e){}\n  if(!ok){try{java.reUiView();ok=true}catch(e){}}\n  return ok;\n}\nfunction FQ_sj_now(jv,sv){\n  var h=SJ_host(sv);\n  java.toast('🌐 当前线路：'+h+'（书架旧书仍走其入库时的域名）');\n}\nfunction FQ_sj_pick(jv,sv,idx){\n  var hs=SJ_hosts();\n  if(idx<0||idx>=hs.length){java.toast('❌ 线路编号错误');return;}\n  java.toast('⏳ 正在切换到线路'+(idx+1)+'…');\n  SJ_set(sv,hs[idx]);\n  java.toast('✅ 已切换：'+hs[idx]+'（可搜索一次验证连通性）');\n  SJ_refresh();\n}\nfunction SJ_speedAll(jv){\n  var hs=SJ_hosts();\n  var urls=[];for(var i=0;i<hs.length;i++)urls.push(hs[i]+'/');\n  var rs=null;\n  try{rs=jv.ajaxAll(urls);}catch(e){return null;}\n  var best=-1;var bestT=9007199254740992;var msg=[];\n  for(var i=0;i<hs.length;i++){\n    var t=-1;var alive=false;\n    try{\n      var r=rs[i];var b='';\n      try{b=String(r.body())}catch(e1){b=''}\n      if(b.length>5000){\n        alive=true;\n        try{t=Number(r.callTime())}catch(e2){t=-1}\n      }\n    }catch(e){alive=false;}\n    var label=alive?(t>=0?(t+'ms'):'在线'):'失效';\n    try{jv.put('sjMs'+i,label)}catch(e3){}\n    msg.push(hs[i].replace('https://','')+'='+(alive?(t>=0?(t+'ms'):'在线'):'失效'));\n    if(alive&&t>=0&&t<bestT){bestT=t;best=i;}\n  }\n  return {best:best,bestT:bestT,msg:msg.join(' ｜ ')};\n}\nfunction FQ_sj_speed(jv,sv){\n  java.toast('⏳ 正在并发测速 3 条线路（约2~8秒）…');\n  var r=SJ_speedAll(jv);\n  if(r==null){java.toast('❌ 测速执行失败（ajaxAll 异常）');SJ_refresh();return;}\n  java.toast('⏱ 测速完成：'+r.msg);\n  SJ_refresh();\n}\nfunction FQ_sj_auto(jv,sv){\n  java.toast('⏳ 正在测速并自动切换最快线路…');\n  var r=SJ_speedAll(jv);\n  if(r==null){java.toast('❌ 测速执行失败（ajaxAll 异常）');SJ_refresh();return;}\n  if(r.best<0){\n    java.toast('❌ 全部线路异常，请检查网络后重试：'+r.msg);\n    SJ_refresh();return;\n  }\n  var hs=SJ_hosts();\n  SJ_set(sv,hs[r.best]);\n  java.toast('✅ 已切换最快线路：'+hs[r.best]+'（'+r.bestT+'ms）｜'+r.msg);\n  SJ_refresh();\n}\nfunction FQ_sj_custom(jv,sv){\n  var v='';\n  try{v=String(result.get('customUrl')||'')}catch(e){}\n  if(!v||v=='null'){try{v=String(result['customUrl']||'')}catch(e){v=''}}\n  if(!v||v.indexOf('http')!==0){\n    java.toast('❌ 请先在输入框输入以 http 开头的完整网址（如 https://wap.shoujixs.net）');\n    return;\n  }\n  v=v.replace(/\\/+$/,'');\n  java.toast('⏳ 正在切换自定义网址…');\n  SJ_set(sv,v);\n  java.toast('✅ 已切换：'+v+'（该站系列域名共用同一书库；若是陌生镜像请先搜索验证）');\n  SJ_refresh();\n}\nfunction FQ_sj_clear(jv,sv){\n  var n=0;\n  try{cookie.removeCookie('https://wap.shoujixs.net/');n++;}catch(e){}\n  try{cookie.removeCookie('https://wap.shoujixs.net/search/');n++;}catch(e){}\n  var hs=SJ_hosts();\n  for(var i=0;i<hs.length;i++){try{cookie.removeCookie(hs[i]+'/')}catch(e){}}\n  java.toast('🧹 已清除本站全部Cookie（含限频标记ss_search_delay），现在可以搜索了');\n  SJ_refresh();\n}\nfunction FQ_sj_check(jv,sv){\n  var h=SJ_host(sv);\n  java.toast('⏳ 正在检测 '+h+' …');\n  var t0=Date.now();var b='';\n  try{b=String(jv.ajax(h+'/'))}catch(e){\n    java.toast('❌ 连接失败：'+e+'（请换线路）');\n    return;\n  }\n  var ms=Date.now()-t0;\n  if(b.length>5000){\n    java.toast('✅ 连接正常 '+ms+'ms ｜ 本站无需账号登录 ｜ 当前线路：'+h);\n  }else{\n    java.toast('⚠️ 响应异常（仅'+b.length+'字符），域名可能已失效，请切换线路');\n  }\n}", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=og:novel:author]@content||.author@text##^作者：", "coverUrl": "meta[property=og:image]@content", "intro": "@js:(function(){var D=(result&&typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var t='';try{var e=D.select('div.review').first();if(e!=null)t=String(e.text());}catch(x){}if(!t){try{var e=D.select('p.review').first();if(e!=null){t=String(e.text());var sib=e.nextElementSibling();while(sib!=null&&String(sib.tagName())=='p'){var st=String(sib.text());if(st)t+='\\n'+st;sib=sib.nextElementSibling();}}}catch(x){}}if(!t){try{var e=D.select('#intro').first();if(e!=null)t=String(e.text());}catch(x){}}if(!t)return '';t=t.replace(/如果您喜欢.*$/,'');t=t.replace(/作者：.*所写的.*$/,'');return t.trim();})()", "kind": "meta[property=og:novel:category]@content", "lastChapter": "@js:(function(){var D=(result&&typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var t='';try{var m=D.select('meta[property=og:novel:latest_chapter_name]').first();if(m!=null)t=String(m.attr('content'));}catch(x){}if(!t){try{var e=D.select('div.directoryArea p a').first();if(e!=null)t=String(e.text());}catch(x){}}if(!t){try{var e=D.select('#list dl dd a').first();if(e!=null)t=String(e.text());}catch(x){}}return t.trim();})()", "name": "meta[property=og:novel:book_name]@content||meta[property=og:title]@content"}, "ruleContent": {"content": "@js:(function(){var D=(result&&typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var e=null;try{e=D.select('#articlecon').first();}catch(x){}if(e==null){try{e=D.select('#chaptercontent').first();}catch(x){}}if(e==null){try{e=D.select('#content').first();}catch(x){}}if(e==null){return '';}var sb='';var ps=e.select('p');for(var i=0;i<ps.size();i++){var t=String(ps.get(i).text());if(t.trim())sb+=t.trim()+'\\n';}if(!sb.trim()){sb=String(e.text());}var out=sb.trim();if(out.length<100||out.indexOf('内容正在加载中')>=0){try{var doc=String(result&&typeof result.select==='function'?result.outerHtml():String(result));var m1=doc.match(/articleid:\\s*'(\\d+)'/);var m2=doc.match(/chapterid:\\s*'(\\d+)'/);if(m1&&m2){var host=String(baseUrl).replace(/(https?:\\/\\/[^\\/]+).*/,'$1');var r2=java.post(host+'/api/reader_js.php','articleid='+m1[1]+'&chapterid='+m2[1]+'&pid=1',{});var body=String(r2.body());var D2=Packages.org.jsoup.Jsoup.parse(body);var ps3=D2.select('p');var sb2='';for(var i=0;i<ps3.size();i++){var t2=String(ps3.get(i).text());if(t2.trim())sb2+=t2.trim()+'\\n';}if(sb2.trim())out=sb2.trim();}}catch(x){}}return out;})()", "nextContentUrl": "@js:(function(){var D=(result&&typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var es=D.select('#pt_next');for(var i=0;i<es.size();i++){  var a=es.get(i);  var t=String(a.text());  var h=String(a.attr('href'));  if(t.indexOf('下一页')>=0&&h&&h.indexOf('javascript')<0&&h!='#'){return h;}}return null;})()"}, "ruleExplore": {"author": "@js:(function(){var e=result;var t='';try{var p=e.select('p.author').first();if(p!=null)t=String(p.text());}catch(x){}if(!t){try{var d=e.select('div.author').first();if(d!=null)t=String(d.text());}catch(x){}}t=t.replace(/^.*作者：/,'');var m=t.match(/^(.+?)\\s*\\|/);if(m)t=m[1];return t.trim();})()", "bookList": ".hot_sale||.bookbox", "bookUrl": "@js:(function(){var e=result;try{var a=e.select('a').first();if(a!=null)return String(a.attr('href'));}catch(x){}return '';})()", "coverUrl": "@js:(function(){var e=result;try{var im=e.select('img').first();if(im!=null)return String(im.attr('src'));}catch(x){}return '';})()", "name": "@js:(function(){var e=result;var t='';try{var p=e.select('p.title').first();if(p!=null)t=String(p.text());}catch(x){}if(!t){try{var a=e.select('h4.bookname a').first();if(a!=null)t=String(a.text());}catch(x){}}return t;})()"}, "ruleSearch": {"author": "@js:(function(){var e=result;var t='';try{var p=e.select('p.author').first();if(p!=null)t=String(p.text());}catch(x){}if(!t){try{var d=e.select('div.author').first();if(d!=null)t=String(d.text());}catch(x){}}t=t.replace(/^.*作者：/,'');var m=t.match(/^(.+?)\\s*\\|/);if(m)t=m[1];return t.trim();})()", "bookList": ".hot_sale||.bookbox", "bookUrl": "@js:(function(){var e=result;try{var a=e.select('a').first();if(a!=null)return String(a.attr('href'));}catch(x){}return '';})()", "kind": "@js:(function(){var e=result;var t='';try{var p=e.select('p.author').first();if(p!=null)t=String(p.text());}catch(x){}if(!t){try{var ds=e.select('div.author');if(ds.size()>1)t=String(ds.get(1).text());}catch(x){}}var m=t.match(/^(.+?)\\s*\\|/);if(m)t=m[1];t=t.replace(/^.*类型：/,'');return t.trim();})()", "lastChapter": "@js:(function(){var e=result;var t='';try{var ps=e.select('p.author');if(ps.size()>1)t=String(ps.get(1).text());}catch(x){}if(!t){try{var u=e.select('div.update a').first();if(u!=null)t=String(u.text());}catch(x){}}t=t.replace(/^.*更新：/,'').replace(/^.*最后章节：/,'');return t.trim();})()", "name": "@js:(function(){var e=result;var t='';try{var p=e.select('p.title').first();if(p!=null)t=String(p.text());}catch(x){}if(!t){try{var a=e.select('h4.bookname a').first();if(a!=null)t=String(a.text());}catch(x){}}return t;})()"}, "ruleToc": {"chapterList": "@js:(function(){var D=(result&&typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));function ok(u){return /(?:https?:\\/\\/[^\\/\\s]+)?\\/shoujixs_\\d+_\\d+\\.html$/.test(String(u||''));}var out=new Packages.java.util.ArrayList();try{  var divs=D.select('div.directoryArea');  var as=null;  if(divs.size()>1){    as=divs.get(1).select('p a');  }else if(divs.size()==1){    as=divs.get(0).select('h2 ~ p a');    if(as.size()==0){as=divs.get(0).select('p a');}  }  if(as!=null){    for(var i=0;i<as.size();i++){      var a=as.get(i);      if(ok(String(a.attr('href'))))out.add(a.parentNode());    }  }}catch(e){}return out;})()", "chapterName": "a@text", "chapterUrl": "a@href", "nextTocUrl": "@js:(function(){var D=(result&&typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var es=D.select('a.index-container-btn');for(var i=0;i<es.size();i++){  var a=es.get(i);  if(String(a.text()).indexOf('下一页')>=0){    var h=String(a.attr('href'));    if(h&&h.indexOf('javascript')<0&&h!='#'){return h;}  }}return null;})()"}, "searchUrl": "@js:(function(){var h='';try{h=String(source.getVariable()||'')}catch(e){h=''}if(h.indexOf('http')!==0){h='https://wap.shoujixs.net'}h=h.replace(/\\/+$/,'');return h+'/search/,{\\\"js\\\":\\\"try{cookie.removeCookie(String(baseUrl))}catch(e){}try{cookie.removeCookie(h+\\'/\\')}catch(e){}try{cookie.removeCookie(\\'https://wap.shoujixs.net/\\')}catch(e){}try{cookie.removeCookie(\\'https://open-ki.jishouzj.cc/\\')}catch(e){}try{cookie.removeCookie(\\'https://open-ki.jishouxs.cc/\\')}catch(e){}\\\",\\\"method\\\":\\\"POST\\\",\\\"body\\\":\\\"searchkey={{key}}&t=1\\\",\\\"charset\\\":\\\"utf-8\\\",\\\"timeout\\\":20000}';})()", "variableComment": "sjMs0/sjMs1/sjMs2=各线路测速结果；当前线路存于书源变量（登录面板管理）", "weight": 0},{"bookSourceComment": "都写完了才发现有VIP章节😥", "bookSourceGroup": "🔞小说", "bookSourceName": "精校书屋（有VIP章节）", "bookSourceType": 0, "bookSourceUrl": "https://m.xswu.org", "bookUrlPattern": "https://m.xswu.org/\\d+/\\d+/", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "玄幻修真::/list/1/{{page}}.html\n重生穿越::/list/2/{{page}}.html\n都市小说::/list/3/{{page}}.html\n军史小说::/list/4/{{page}}.html\n网游小说::/list/5/{{page}}.html\n科幻小说::/list/6/{{page}}.html\n灵异小说::/list/7/{{page}}.html\n言情小说::/list/8/{{page}}.html\n其他小说::/list/9/{{page}}.html", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 12; Pixel 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1793373143404", "respondTime": 180000, "ruleBookInfo": {"author": "[property$=author]@content", "canReName": "1", "coverUrl": "@js:\nlet m = baseUrl.match(/\\/(\\d+)\\/$/);\n`/img/${m[1]}.jpg`", "intro": "[property$=description]@content", "kind": "[property~=category|status|update_time]@content", "lastChapter": "[property$=latest_chapter_name]@content", "name": "[property$=book_name]@content", "tocUrl": "{{baseUrl}}999/"}, "ruleContent": {"content": "#txt p@text", "nextContentUrl": "@js:\nlet next = java.getStringList(\"#pb_next@href\")?.[0];\n/_/.test(next) ? next : null;"}, "ruleExplore": [], "ruleSearch": {"bookList": "a.list", "bookUrl": "href", "coverUrl": "href@js:\nlet m = result.match(/\\/(\\d+)\\/(\\d+)\\/$/);\n`/img/${m[2]}.jpg`", "intro": ".info@text", "name": "h4@text"}, "ruleToc": {"chapterList": "@js:\nconst list = java.getElements(\".ph_list.duaejh li a\");\nconst size = list.size();\nconst startMh = result.match(/nth-child/g);\nconst endMh = result.match(/nth-last-child/g);\nconst start = startMh ? startMh.length : 0;\nconst end = endMh ? size-endMh.length : size;\nstart < end ? list.subList(start, end) : []", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": "option!0@value"}, "searchUrl": "/search.html,{\n    \"method\": \"POST\",\n    \"body\": \"s={{key}}\"\n}", "weight": 0},{"bookSourceComment": "≡ 西瓜书屋 v3（2026-10-29 全量重写·多域名切换版）\n\n【域名体系】主站 www.xiguashuwu2.com（CF盾）｜备用 www.xiguashuwu.net（免CF）｜备用 www.xiguashuwu.com（免CF，http）。\n登录界面【切换网址】按钮循环切换三站并自动写入免验证Cookie(nginx_waf_passed=1)；搜索/发现/详情/目录/正文规则全部相对路径，切站即全链路跟随；书架书章节为相对URL时同样跟随。\n【搜索】/search/关键词。主站首次搜索若弹CF盾，通过一次即长期有效（弹出的就是带关键词的搜索页，直接点验证即可）；请勿连续频繁搜索（站点限3秒/次）。\n【详情】og:meta+页面字段双保险；封面取页内 _src（og:image 路径有重复段不可用）。\n【目录】catalog 正序分页（100章/页），下一页为JS跳转无href，已用页码正则还原；≤100章单页自动收尾（return null终止）。\n【正文】单JS三形态适配：①#C0NTENT静态页 ②meta乱序页（base64+UpWz公式 v-(i+1)%code 实证还原） ③AES加密页（newcon+页内passphrase，md5前16=iv/后16=key，CBC/PKCS7）。\n广告清理：本站新域名提示/simishuwu间隔域名/本章已阅读完毕/页内标题。\n【字图】正文敏感字为站内图片(wzbodyimg/*.png)按原图显示；旧版48KB置换表哈希已被站点轮换失效故移除，需要文字化请自行在替换净化补充映射。\n【发现】18入口已修复旧版分类ID动态拼接bug（玄幻=1…复古言情=15，完本/排行独立）。\n【兼容】LT(gedoor)+E(Luoyacheng)双版本实测API：createSymmetricCrypto/md5Encode/base64Decode/getVariable/setVariable/refreshExplore/cookie.setCookie；登录按钮action传(java,source)环境真实标识符；viewName动态文本两版支持。\n【实测】搜索16本/详情/目录/正文三形态python级验证通过；第3页为空页干扰页自动跳过。", "bookSourceGroup": "AI,R18", "bookSourceName": "🍑西瓜书屋[可换备用站]", "bookSourceType": 0, "bookSourceUrl": "https://www.xiguashuwu2.com", "bookUrlPattern": "https?://www\\.xiguashuwu2?\\.com/book/\\d+/.*", "customButton": false, "customOrder": 2, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\": \"全部\", \"url\": \"/category/0/{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1.0}}, {\"title\": \"玄幻\", \"url\": \"/category/1/{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"修真\", \"url\": \"/category/2/{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"都市\", \"url\": \"/category/3/{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"历史\", \"url\": \"/category/4/{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"网游\", \"url\": \"/category/5/{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"科幻\", \"url\": \"/category/6/{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"言情\", \"url\": \"/category/7/{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"其他\", \"url\": \"/category/8/{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"经典\", \"url\": \"/category/9/{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"同人\", \"url\": \"/category/10/{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"高辣\", \"url\": \"/category/11/{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"耽美\", \"url\": \"/category/12/{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"情欲\", \"url\": \"/category/13/{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"复古耽美\", \"url\": \"/category/14/{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"复古言情\", \"url\": \"/category/15/{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"完本\", \"url\": \"/category/finish/0/{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1.0}}, {\"title\": \"排行\", \"url\": \"/rank/all/0/{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1.0}}]", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; arm64; k) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 XiaoMi/MiuiBrowser/19.0.0 swan-mibrowser Mobile EdgA/126.0.0.0 Safari/537.36\"}", "lastUpdateTime": "1793294964902", "loginCheckJs": "(function(){\nvar b='';\ntry{b=String(result.body()||'')}catch(e){b=String(result||'')}\nvar u=String(baseUrl||'');\nif(b.indexOf('Just a moment')>=0||b.indexOf('_cf_chl_opt')>=0||b.indexOf('challenges.cloudflare')>=0){\n  java.toast('西瓜书屋：CF强制交互验证，弹出浏览器');\n  return java.startBrowserAwait(u,'西瓜书屋·人机验证');\n}\nif(b.indexOf('请不要频繁操作')>=0){\n  java.toast('西瓜书屋：触发站点限频(3秒/次)，请稍后重试');\n}\nreturn result;\n})()", "loginUi": "[{\"name\": \"状态栏\", \"type\": \"button\", \"action\": \"FQ_xg_now(java,source)\", \"viewName\": \"'🌐 当前：'+(source.getVariable()||source.getKey())\"}, {\"name\": \"切换网址\", \"type\": \"button\", \"action\": \"FQ_xg_swap(java,source)\", \"viewName\": \"'🔁 切换网址(当前→下一站) '+(source.getVariable()||'')\"}, {\"name\": \"回主站\", \"type\": \"button\", \"action\": \"FQ_xg_pick0(java,source)\", \"viewName\": \"'🏠 回主站 xiguashuwu2.com'\"}, {\"name\": \"用备用站\", \"type\": \"button\", \"action\": \"FQ_xg_pick2(java,source)\", \"viewName\": \"'🛡 备用站 xiguashuwu.net(免CF)'\"}, {\"name\": \"检查连接状态\", \"type\": \"button\", \"action\": \"FQ_xg_check(java,source)\", \"viewName\": \"'🔍 检查连接状态'\"}, {\"name\": \"手动过CF验证\", \"type\": \"button\", \"action\": \"FQ_xg_cf(java,source)\", \"viewName\": \"'🛂 手动过CF验证'\"}, {\"name\": \"⚠️ 站点限频3秒/次；主站搜索过一次CF盾长期有效；备用站免CF。\", \"type\": \"label\"}]", "loginUrl": "function login(){java.toast('本站无需账号登录；如遇CF盾请直接搜索一次，会自动弹出验证')}\nfunction xgHosts(){\n  return ['https://www.xiguashuwu2.com','https://www.xiguashuwu.net','http://www.xiguashuwu.com'];\n}\nfunction xgHost(sv){\n  var h=String(sv.getVariable()||'');\n  var hs=xgHosts();\n  for(var i=0;i<hs.length;i++){if(h==hs[i]){return hs[i];}}\n  return String(sv.getKey());\n}\nfunction xgSet(sv,u){\n  sv.setVariable(u);\n  cookie.setCookie(u,'nginx_waf_passed=1');\n  if(u.indexOf('xiguashuwu2')>=0){\n    java.toast('已切换主站(需过CF验证,通过一次长期有效)');\n  }else{\n    java.toast('已切换备用站并写入免验证Cookie');\n  }\n  return u;\n}\nfunction FQ_xg_now(java,source){java.toast('当前网址：'+xgHost(source)+'（点击切换按钮换站）');}\nfunction FQ_xg_swap(java,source){\n  var hs=xgHosts();\n  var cur=xgHost(source);\n  var k=0;\n  for(var i=0;i<hs.length;i++){if(hs[i]==cur){k=(i+1)%hs.length;break;}}\n  xgSet(source,hs[k]);\n}\nfunction FQ_xg_pick0(java,source){xgSet(source,xgHosts()[0]);}\nfunction FQ_xg_pick2(java,source){xgSet(source,xgHosts()[1]);}\nfunction FQ_xg_check(java,source){\n  var u=xgHost(source);\n  try{\n    var r=String(java.ajax(u)||'');\n    if(r.indexOf('安全验证')>=0){\n      java.toast('站点在线，但缺免验证Cookie，点【切换网址】重新选一次即可修复');\n    }else if(r.indexOf('Just a moment')>=0){\n      java.toast('主站CF盾拦截中：正常搜索一次会自动弹出验证');\n    }else if(r.length<500){\n      java.toast('网站响应异常('+r.length+'字符)，站点可能已更换域名');\n    }else{\n      java.toast('站点连接正常（'+u+'）');\n    }\n  }catch(e){java.toast('检查失败：'+e)}\n}\nfunction FQ_xg_cf(java,source){\n  try{\n    java.startBrowserAwait(xgHost(source)+'/search/','西瓜书屋·人机验证');\n    java.toast('验证流程结束，若搜索仍失败请稍后重试');\n  }catch(e){java.toast('未完成：'+e)}\n}", "respondTime": 180000, "ruleBookInfo": {"author": "class.author@a@text", "coverUrl": "class.BGsectionOne-top-left@img@_src||class.BGsectionOne-top-left@img@src", "intro": "class.BGsectionTwo-bottom@html", "kind": "class.category@span.0@text", "lastChapter": "class.newestChapter@span@text", "name": "class.title@text", "tocUrl": "text.查看全部章节@href||text.章节目录@href"}, "ruleContent": {"content": "<js>(function(){\nvar pg=String(src||result||'');\nif(!pg){return '';}\nvar out='';\ntry {\n  var endIdx=pg.indexOf('<div id=\"cload\"');\n  var seg=endIdx>=0?pg.substring(0,endIdx):pg;\n  var mnr=pg.match(/nrid=\"(.*?)\"/);\n  var nid=mnr?mnr[1]:'C0NTENT';\n  var startIdx=pg.indexOf('id=\"'+nid+'\"');\n  if(startIdx>=0){seg=pg.substring(startIdx,endIdx>=0?endIdx:pg.length);}\n  var smIdx=seg.indexOf('<div class=\"s_m\"');\n  if(smIdx>=0){var smEnd=seg.indexOf('</div>',smIdx)+6;seg=seg.substring(0,smIdx)+seg.substring(smEnd);}\n  var blocks=seg.match(/<div><p[\\s\\S]*?<\\/p><\\/div>/g)||[];\n  // 块内明文长度\n  var plainLen=0;\n  for(var bi=0;bi<blocks.length;bi++){\n    plainLen+=blocks[bi].replace(/<[^>]+>/g,'').replace(/\\s/g,'').length;\n  }\n  // UpWz 判据: nid 非 C0NTENT + meta client(b64序号) + codeurl + 序号数==块数 + 序号范围在[0,块数*2)内\n  var b6=pg.match(/<meta name=\"client\" content=\"([^\"]+)\"/);\n  var cd=pg.match(/codeurl=\"(\\d+)\"/);\n  var isUpWz=false; var nums=null; var code=0;\n  if(b6&&cd&&nid!=='C0NTENT'&&blocks.length>1){\n    var seq=String(java.base64Decode(b6[1]));\n    nums=seq.split(/[A-Z]+%/);\n    var cnt=0;\n    for(var qi=0;qi<nums.length;qi++){ if(!isNaN(parseInt(nums[qi],10))) cnt++; }\n    code=parseInt(cd[1],10);\n    if(cnt===blocks.length){ isUpWz=true; }\n  }\n  // AES 判据: 页面有 newcon=decodeURIComponent 且容器无正文（全部块合计明文<10字）\n  var m1=pg.match(/newcon=decodeURIComponent\\(\"([^\"]+)\"\\)/);\n  var m2=pg.match(/d\\(newcon,\"([^\"]+)\"\\)/);\n  if(plainLen<10 && m1 && m2){\n    var md=String(java.md5Encode(m2[1]));\n    out=String(java.createSymmetricCrypto('AES/CBC/PKCS5Padding', md.substring(16), md.substring(0,16)).decryptStr(decodeURIComponent(m1[1])));\n  } else if(isUpWz && plainLen>=10){\n    var slots=[];\n    for(var i=0;i<blocks.length;i++){\n      var v=parseInt(nums[i],10);\n      if(isNaN(v)){continue;}\n      var hh=blocks[i];\n      if(hh.indexOf('本站新')>=0||/[\\s\\.．]*si[\\s\\.．]*m[\\s\\.．]*i/i.test(hh)){continue;}\n      slots[v-Math.ceil((i+1)%code)]=hh;\n    }\n    var ps=[];\n    for(var j=0;j<slots.length;j++){if(slots[j]){ps.push(slots[j]);}}\n    out=ps.join('');\n  } else if(plainLen>=10){\n    out=blocks.join('');\n  } else { out=''; }\n  out=String(out||'');\n  out=out.replace(/<h1>[\\s\\S]*?<\\/h1>/g,'');\n  out=out.replace(/本站新（短）域名[^<]*/g,'');\n  out=out.replace(/[\\?？\\s]*s[\\s\\.．]*i[\\s\\.．]*m[\\s\\.．]*i[\\s\\.．]*s[\\s\\.．]*h[\\s\\.．]*u[\\s\\.．]*w[\\s\\.．]*u[\\s\\.．]*c[\\s\\.．]*o[\\s\\.．]*m[\\s\\.．]*/gi,'');\n  out=out.replace(/本章(已阅读)?完毕[^<]*/g,'');\n  out=out.replace(/本章尚未读完[^<]*/g,'');\n  return out;\n} catch(e){ java.log('xg content err: '+e); return String(out||''); }\n})()</js>", "nextContentUrl": "text.下一页@href"}, "ruleExplore": {"author": "p.1@span@a@text", "bookList": "class.CGsectionTwo-right-content-unit", "bookUrl": "a.title@href||p.0@a@href", "intro": "p.2@text", "name": "a.title@text||p.0@a@text"}, "ruleSearch": {"author": "span.2@text", "bookList": "<js>String(result||'').indexOf('未搜索到相关的小说')>=0?null:result</js>\n.SHsectionThree-middle p", "bookUrl": "span.1@a@href", "checkKeyWord": "清和", "kind": "span.0@text##\\[|\\]", "name": "span.1@text"}, "ruleToc": {"chapterList": "class.BCsectionTwo-top@li@a", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": "text.下一页@href##.*\\('(\\d+)','(\\d+)'\\).*##/book/$1/catalog/$2.html"}, "searchUrl": "@js:(function(){var u='/search/'+encodeURIComponent(String(key||''));var isLT=false;try{isLT=(typeof source.getLoginUiJs==='function');}catch(e){isLT=false;}if(isLT){return u+',{\"webView\":true,\"webViewDelayTime\":1800,\"timeout\":30000,\"retry\":1}';}return u+',{\"timeout\":30000,\"retry\":1}';})()", "weight": 0},{"bookSourceComment": "笔趣阁 www.byqg.cc 书源（2026-10 制作）。搜索走静态路径 /search/{关键字}.html（站点表单虽然是 GET /search?searchkey=，但那个地址返回空，真正的搜索入口由 default.js 的 handleSearch 拼成 /search/编码关键字.html）。详情页 /book/{id}.html；目录页 /chapter/{id}.html（目录用 select#linkIndex 的 option 自动跟随分页）；正文页 /chapter/{id}/{cid}.html，正文 div#content 为静态 <p> 段落，无广告、无分页。", "bookSourceGroup": "自制", "bookSourceName": "笔趣阁(byqg.cc)", "bookSourceType": 0, "bookSourceUrl": "https://www.byqg.cc", "bookUrlPattern": "https?://www\\.byqg\\.cc/book/[^/]+\\.html", "customOrder": 0, "enabled": true, "enabledExplore": false, "exploreUrl": "", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\",\n  \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\",\n  \"Accept-Language\": \"zh-CN,zh;q=0.9\"\n}", "lastUpdateTime": "1793292059992", "loginUrl": "", "ruleBookInfo": {"author": "@css:p.booktag a.red:eq(0)@text", "coverUrl": "@css:div.bookcover img@src", "intro": "@css:p.bookintro@text", "kind": "@css:p.booktag a.blue:eq(0)@text", "lastChapter": "@css:a.bookchapter@text", "name": "@css:h1.booktitle@text", "tocUrl": "<js>baseUrl.replace('/book/','/chapter/')</js>", "wordCount": "@css:p.booktag span.blue:eq(0)@text"}, "ruleContent": {"content": "@css:div#content@html", "nextContentUrl": "", "sourceRegex": "", "webJs": ""}, "ruleExplore": [], "ruleSearch": {"author": "@css:div.author:eq(0)@text##作者：", "bookList": "@css:div.bookbox", "bookUrl": "@css:.bookname a@href", "coverUrl": "", "intro": "@css:div.update:eq(1)@text##简介：", "kind": "", "lastChapter": "@css:div.update:eq(0) a@text", "name": "@css:.bookname a@text", "wordCount": "@css:div.author:eq(1)@text##字数："}, "ruleToc": {"chapterList": "@css:div#allchapter dl>dd>a", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": "<js>try{var cur=1,m=baseUrl.match(/\\/(\\d+)\\.html$/);if(m)cur=parseInt(m[1],10);var s=(typeof src==='string')?src:'';var re=/option[^>]+value=\"([^\"]*\\/(\\d+)\\.html)\"/g,best=\"\",bn=1e9,t;while((t=re.exec(s))!==null){var n=parseInt(t[2],10);if(n>cur&&n<bn){bn=n;best=t[1];}}best;}catch(e){\"\"}</js>"}, "searchUrl": "/search/{{key}}.html", "weight": 0},{"bookSourceComment": "得奇小说网（www.deqixss.com）\n\n【重要】本站正文由 JS 异步加载：页面里的 #chapter-content 是空的，真正正文由 /modules/article/ajax2.php 返回（GBK 编码 JSON）。\n处理方式：章节 URL 加 {\"webView\":true} 让 Legado 用 WebView 打开，再用 WebJs 在页面内同步 XHR 直接取回整章正文（token/timestamp/nonce 由页面头部 chapter.js.php 提供）。\n若某台设备取不到正文，多半是 WebView 太慢或站点改了接口，把 webJs 里的 ajax2.php 那行换成浏览器调试后的新地址即可。\n\n【目录】全部章节在 div#list-chapterAll 里；dl 顶部的 12 条“最新章节”是重复的，已排除。\n【搜索】列表结构：div.bookbox > div.bookinfo > h4.bookname / div.author / div.cat / div.update。", "bookSourceGroup": "得奇", "bookSourceName": "得奇小说网", "bookSourceType": 0, "bookSourceUrl": "https://www.deqixss.com", "bookUrlPattern": "https://www\\.deqixss\\.com/books/\\d+/", "customOrder": 0, "enabled": true, "enabledExplore": false, "exploreUrl": "", "header": "{\"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\",\"Accept\":\"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\",\"Accept-Language\":\"zh-CN,zh;q=0.9\",\"Referer\":\"https://www.deqixss.com/\"}", "lastUpdateTime": "1793291106552", "loginUrl": "", "ruleBookInfo": {"author": "@css:p.booktag>a.red@text", "coverUrl": "@css:div.bookcover img@src", "intro": "@css:p.bookintro@text", "kind": "@css:ol.breadcrumb li:eq(1)>a@text", "lastChapter": "@css:a.bookchapter@text", "name": "@css:h1.booktitle@text", "tocUrl": "", "wordCount": ""}, "ruleContent": {"content": "all##(?:更新不易|速读谷|shudugu\\.org|速\\.读\\.谷|速 读 谷|看最新完整章節，就上速讀谷|最后一批邀请码\\d+人发放，官方反馈群\\d+|本章节未完|当&前@章#节|𝕢).{0,30}##", "nextContentUrl": "", "sourceRegex": "", "webJs": "(function(){try{var m=window.location.pathname.match(/\\/books\\/(\\d+)\\/(\\d+)\\.html/);if(m){var u='/modules/article/ajax2.php?aid='+m[1]+'&cid='+m[2]+'&token='+encodeURIComponent(chapterToken)+'&timestamp='+timestamp+'&nonce='+encodeURIComponent(nonce);var x=new XMLHttpRequest();x.open('GET',u,false);x.overrideMimeType('text/plain; charset=gbk');x.send();var j=JSON.parse(x.responseText);if(j&&j.status===1&&j.data&&j.data.content){return j.data.content;}}}catch(e){}var el=document.getElementById('chapter-content');if(el&&el.innerHTML&&el.innerHTML.indexOf('加载中')<0){return el.innerHTML;}return '<p>正文加载失败，请先刷新目录再重试</p>';})()"}, "ruleExplore": [], "ruleSearch": {"author": "@css:div.bookinfo>div.author:eq(0)@text##作者：", "bookList": "@css:div.bookbox", "bookUrl": "@css:h4.bookname>a@href", "coverUrl": "", "intro": "@css:div.bookinfo>div.update@text##简介：", "kind": "", "lastChapter": "@css:div.bookinfo>div.cat>a@text", "name": "@css:h4.bookname>a@text", "wordCount": ""}, "ruleToc": {"chapterList": "@css:div#list-chapterAll dd", "chapterName": "a@text", "chapterUrl": "a@href##$##,{\"webView\":true}", "isVip": "", "nextTocUrl": "", "updateTime": ""}, "searchUrl": "/modules/article/search.php?searchkey={{key}}", "weight": 0},{"bookSourceComment": "全本小说网 https://www.qbxs.net —— 搜索(表格)、详情(含完整目录)、正文(自动续页)。站点对非浏览器 UA 返回 403，已内置桌面 Chrome UA，请勿删除 header。", "bookSourceGroup": "自制", "bookSourceName": "全本小说网", "bookSourceType": 0, "bookSourceUrl": "https://www.qbxs.net", "bookUrlPattern": "https?://www\\.qbxs\\.net/book/\\d+", "customOrder": 0, "enabled": true, "enabledExplore": false, "exploreUrl": "", "header": "{\"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\",\"Accept\":\"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\",\"Accept-Language\":\"zh-CN,zh;q=0.9\",\"Referer\":\"https://www.qbxs.net/\"}", "lastUpdateTime": "1793289954621", "loginUrl": "", "respondTime": 180000, "ruleBookInfo": {"author": "@css:.bq>span:nth-child(2)>a@text", "coverUrl": "@css:.pic img@src", "intro": "@css:.introduce .jj@text", "kind": "", "lastChapter": "@css:.lastchapter a@text##《[^》]*》", "name": "@css:.introduce h1@text", "tocUrl": "", "wordCount": ""}, "ruleContent": {"content": "@css:#articlecontent@html##<p>(?:\\[全本小说\\][\\s\\S]*?|𝕢[\\s\\S]*?)</p>", "nextContentUrl": "<js>var h=java.getString('@css:#next_url@href',false);(h&&/_\\d+\\.html$/.test(h))?h:'';</js>", "replaceRegex": "", "sourceRegex": "", "webJs": ""}, "ruleExplore": [], "ruleSearch": {"author": "tag.td.2@text", "bookList": "@css:table#rankinglist tr:has(td)", "bookUrl": "tag.td.0@tag.a.0@href", "coverUrl": "", "intro": "", "kind": "tag.td.3@text", "lastChapter": "tag.td.1@text", "name": "tag.td.0@text", "wordCount": ""}, "ruleToc": {"chapterList": "@css:.ml_list ul>li", "chapterName": "a@text", "chapterUrl": "a@href", "nextTocUrl": ""}, "searchUrl": "https://www.qbxs.net/search/?searchkey={{key}}", "weight": 0},{"bookSourceName": "精华书阁手机版 V2", "bookSourceGroup": "Push99的AI助手", "bookSourceType": 0, "bookSourceUrl": "https://m.jhsssd.com", "bookSourceComment": "", "enabled": true, "enabledExplore": true, "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 12; Pixel 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36\", \"Accept-Language\": \"zh-CN,zh;q=0.9\"}", "lastUpdateTime": "1793261889149", "weight": 0, "exploreUrl": "玄幻::https://m.jhsssd.com/list/1_{{page}}.html\n修真::https://m.jhsssd.com/list/2_{{page}}.html\n都市::https://m.jhsssd.com/list/3_{{page}}.html\n穿越::https://m.jhsssd.com/list/4_{{page}}.html\n网游::https://m.jhsssd.com/list/5_{{page}}.html\n科幻::https://m.jhsssd.com/list/6_{{page}}.html\n灵异::https://m.jhsssd.com/list/7_{{page}}.html\n女生::https://m.jhsssd.com/list/8_{{page}}.html\n其它::https://m.jhsssd.com/list/9_{{page}}.html", "ruleExplore": {"bookList": "@css:ul.xbk", "name": "@css:#list > ul.xbk > li.tjxs > span.xsm > a@text", "bookUrl": "@css:#list > ul.xbk > li.tjxs > span.xsm > a@href", "coverUrl": "@css:#list > ul.xbk > li.tjimg > a > img@src", "author": "", "intro": "", "kind": "", "lastChapter": ""}, "searchUrl": "https://m.jhsssd.com/search.html?word={{key}},{\"headers\":{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 12; Pixel 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36\"}}", "ruleSearch": {"bookList": "@css:div.searchbook", "name": "@css:html > body > div.searchbook > div.bookinfo > h4.bookname a@text", "author": "@css:.author@text", "intro": "", "kind": "@css:.cat@text", "lastChapter": "@css:.update a@text", "bookUrl": "@css:html > body > div.searchbook > div.bookinfo > h4.bookname a@href", "coverUrl": "@css:html > body > div.searchbook > div.bookimg > a > img@src"}, "ruleBookInfo": {"name": "@css:#bqgmb_head > h1@text", "author": "@css:html > body > div.cover > div.block > div.block_txt2  > p:nth-of-type(2)@text##^作者：", "intro": "@css:html > body > div.cover > div.introh3@text", "kind": "@css:html > body > div.cover > div.block > div.block_txt2  > p:nth-of-type(3)@text##^分类：", "lastChapter": "@css:html > body > div.cover > div.block > div.block_txt2  > p:nth-of-type(6)@text##^最新：", "coverUrl": "@css:html > body > div.cover > div.block > div.block_img2 > img@src", "tocUrl": ""}, "ruleToc": {"chapterList": "@css:ul.chapter:nth-of-type(2) li a", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": "@css:html > body > div.cover > div.listpage > span.right > a.onclick@href"}, "ruleContent": {"content": "@css:#nr1@text@js:result.replace(/[（(]\\s*本章未完，请点击下一页继续阅读\\s*[）)]/g,'').replace(/(?:[ \\t　\\u00a0]*\\r?\\n){2,}/g,'\\n').trim()", "nextContentUrl": "text.下一页@href", "replaceRegex": ""}},{"bookSourceName": "七步阁 V2", "bookSourceGroup": "Push99的AI助手", "bookSourceType": 0, "bookSourceUrl": "https://www.qibuge.com", "bookSourceComment": "", "enabled": true, "enabledExplore": true, "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\", \"Accept-Language\": \"zh-CN,zh;q=0.9\"}", "lastUpdateTime": "1793261932425", "weight": 0, "exploreUrl": "同人::https://www.qibuge.com/tongren/{{page}}.html\n玄幻奇幻::https://www.qibuge.com/xuanhuan/{{page}}.html\n武侠仙侠::https://www.qibuge.com/wuxia/{{page}}.html\n都市言情::https://www.qibuge.com/dushi/{{page}}.html\n军事历史::https://www.qibuge.com/junshi/{{page}}.html\n科幻网游::https://www.qibuge.com/kehuan/{{page}}.html\n推理灵异::https://www.qibuge.com/tuili/{{page}}.html\n青春校园::https://www.qibuge.com/xiaoyuan/{{page}}.html\n轻::https://www.qibuge.com/qingxs/{{page}}.html\n女生::https://www.qibuge.com/nvsheng/{{page}}.html", "ruleExplore": {"bookList": "@css:div.item", "name": "@css:div.ll > div.item > dl > dt > span > a@text", "bookUrl": "@css:div.ll > div.item > dl > dt > span > a@href", "coverUrl": "@css:#hotcontent > div.ll > div.item > div.image > a > img@src", "author": "", "intro": "", "kind": "", "lastChapter": ""}, "searchUrl": "<js>try{cookie.removeCookie('https://www.qibuge.com/')}catch(e){};var kb=java.encodeURI(key,'gbk');\"https://www.qibuge.com/search/?searchkey=\"+kb+','+JSON.stringify({charset:'gbk',headers:{'Cookie':'','Referer':\"https://www.qibuge.com/\",'User-Agent':\"Mozilla/5.0 (Linux; Android 12; Pixel 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36\"}})</js>", "ruleSearch": {"bookList": "@css:.novelslist2 li", "name": "@css:.s2 a@text", "author": "@css:.s4@text", "intro": "", "kind": "@css:.s1@text", "lastChapter": "@css:.s3 a@text", "bookUrl": "@css:.s2 a@href", "coverUrl": ""}, "ruleBookInfo": {"name": "@css:#info h1@text", "author": "@css:#info > p@text##^.*?者[：:]\\s*", "intro": "@css:#intro@text", "kind": "", "lastChapter": "", "coverUrl": "@css:#fmimg img@src", "tocUrl": ""}, "ruleToc": {"chapterList": "@css:#list dd a", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": ""}, "ruleContent": {"content": "@css:#content@text", "nextContentUrl": "", "replaceRegex": ""}},{"bookSourceName": "书本书 V2", "bookSourceGroup": "Push99的AI助手", "bookSourceType": 0, "bookSourceUrl": "https://www.shubenshu.com", "bookSourceComment": "", "enabled": true, "enabledExplore": true, "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\", \"Accept-Language\": \"zh-CN,zh;q=0.9\"}", "lastUpdateTime": "1793262052237", "weight": 0, "exploreUrl": "太荒吞天诀::https://www.shubenshu.com/ludl/{{page}}.html\n盖世神医::https://www.shubenshu.com/ludm/{{page}}.html\n全职剑修::https://www.shubenshu.com/luan/{{page}}.html\n天官赐邪::https://www.shubenshu.com/lcgr/{{page}}.html\n官道之色戒::https://www.shubenshu.com/lten/{{page}}.html\n惊鸿::https://www.shubenshu.com/lchi/{{page}}.html\n炼神鼎::https://www.shubenshu.com/lcdc/{{page}}.html\n道士不好惹::https://www.shubenshu.com/luhj/{{page}}.html\n将作妖::https://www.shubenshu.com/lvbv/{{page}}.html\n万古第一神::https://www.shubenshu.com/lbtf/{{page}}.html\n拔剑::https://www.shubenshu.com/lcar/{{page}}.html\n五仙门::https://www.shubenshu.com/luah/{{page}}.html\n十方剑主::https://www.shubenshu.com/lcei/{{page}}.html\n官道之巅::https://www.shubenshu.com/lcqn/{{page}}.html\n桃花劫::https://www.shubenshu.com/lcql/{{page}}.html\n权力争锋::https://www.shubenshu.com/lchc/{{page}}.html\n维京生存指南::https://www.shubenshu.com/lvvi/{{page}}.html\n纨绔县令::https://www.shubenshu.com/lcrg/{{page}}.html\n冒牌废太子::https://www.shubenshu.com/lcqo/{{page}}.html\n神祇在侧::https://www.shubenshu.com/lvrs/{{page}}.html\n超凡大谱系::https://www.shubenshu.com/lcid/{{page}}.html\n玩家请上车::https://www.shubenshu.com/luif/{{page}}.html\n急急如律令::https://www.shubenshu.com/lcas/{{page}}.html\n逆旅::https://www.shubenshu.com/lvbi/{{page}}.html\n道临寰宇::https://www.shubenshu.com/lvvz/{{page}}.html\n大干武圣::https://www.shubenshu.com/lvvm/{{page}}.html\n地仙种田实录::https://www.shubenshu.com/lvvb/{{page}}.html\n野性攀登::https://www.shubenshu.com/lvvn/{{page}}.html\n暗墟黎明::https://www.shubenshu.com/lvvh/{{page}}.html\n登神长阶::https://www.shubenshu.com/lvbk/{{page}}.html\n深夜沉溺::https://www.shubenshu.com/lcpk/{{page}}.html", "ruleExplore": {"bookList": "@css:div.item", "name": "@css:dt a@text", "bookUrl": "@css:dt a@href", "kind": "@css:.btm em@text", "intro": "@css:dd@textNodes", "coverUrl": "@css:.image img@data-original", "author": "", "lastChapter": ""}, "searchUrl": "<js>var kb=encodeURIComponent(key);var bd=\"keyboard=\"+kb+'&'+'show=title%2Cftitle%2Cwriter';var op={method:'POST',body:bd,charset:'utf-8',headers:{\"Content-Type\":\"application/x-www-form-urlencoded; charset=UTF-8\",\"Referer\":\"https://www.shubenshu.com/e/\"}};'https://www.shubenshu.com/e/search/'+','+JSON.stringify(op)</js>", "ruleSearch": {"bookList": "@css:div.item", "name": "@css:dt a@text", "author": "@css:.btm a@text", "intro": "@css:dd@textNodes", "kind": "@css:.btm em@text", "lastChapter": "", "bookUrl": "@css:dt a@href", "coverUrl": "@css:.image img@data-original"}, "ruleBookInfo": {"name": "@css:#info h1@text", "author": "@css:#info > p > a@text", "intro": "@css:#intro@text", "kind": "", "lastChapter": "@css:#info > p.hidden-xs > a@text", "coverUrl": "@css:#fmimg img@data-original", "tocUrl": "@css:a.chapterlist@href"}, "ruleToc": {"chapterList": "@css:#list a", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": ""}, "ruleContent": {"content": "@css:#content@text@js:result.replace(/[（(]\\s*本章未完，请点击下一页继续阅读\\s*[）)]/g,'').replace(/(?:[ \\t　\\u00a0]*\\r?\\n){2,}/g,'\\n').trim()", "nextContentUrl": "text.下一页@href", "replaceRegex": ""}, "enabledCookieJar": false},{"bookSourceName": "速读谷", "bookSourceUrl": "https://www.sudugu.cc", "bookSourceType": 0, "ruleVersion": 1, "bookSourceComment": "速读谷 www.sudugu.cc（杰奇 CMS 模板）。搜索走 /modules/article/search.php?searchkey=&searchtype=all（UTF-8 提交，服务端按书名匹配、不支持模糊，结果不含封面）；正文容器 div.con 用 <br /> 分行，取 @html 保留换行；章内分页「第 N 页」对应 URL 后缀 _N（首页 .html 或 _1.html 等价），用 mergePages 自动合并；目录分两页（每页 1000 章），靠 nextTocUrl 翻页合并。⚠️ 站点「最新章节」区块的 1~3 章尚未进入正文目录（目录缓存延迟），目录以正文目录为准。", "enabled": true, "enabledExplore": true, "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36\"}", "searchUrl": "https://www.sudugu.cc/modules/article/search.php?searchkey={{java.encodeURI(key)}}&searchtype=all", "ruleSearch": {"bookList": "#fengtui div.item || div.item", "name": "h3 a@text || h1 a@text", "bookUrl": "h3 a@href || h1 a@href##(#.*)$##", "author": "ul li:first-child@text##^作者：\\s*## || .itemtxt p a@text##^作者：\\s*##", "intro": "p@text##^简介：\\s*##", "lastChapter": "ul li a@text", "coverUrl": ".item img@src", "checkKeyWord": "斗破"}, "exploreUrl": "玄幻小说::/fenlei/1/{{page}}/\n仙侠小说::/fenlei/2/{{page}}/\n都市小说::/fenlei/3/{{page}}/\n历史小说::/fenlei/4/{{page}}/\n军事小说::/fenlei/5/{{page}}/\n科幻小说::/fenlei/6/{{page}}/\n言情小说::/fenlei/7/{{page}}/\n全本完结::/quanben/1.html", "ruleExplore": {"bookList": "div.item", "name": "h3 a@text", "bookUrl": "h3 a@href", "author": ".itemtxt p a@text##^作者：\\s*##", "kind": ".itemtxt p span@text", "lastChapter": ".itemtxt ul li:first-child a@text"}, "ruleBookInfo": {"name": ".itemtxt h1 a@text", "author": ".itemtxt p a@text##^作者：\\s*##", "kind": ".itemtxt p span@text", "lastChapter": ".itemtxt ul li:first-child a@text", "intro": "h2.op + .des@text", "coverUrl": ".item img@src", "tocUrl": ""}, "ruleToc": {"chapterList": "#list li a:not([href^='javascript'])", "chapterName": "text", "chapterUrl": "@href", "nextTocUrl": "#pages a.gr@href", "tocPageNextCss": "#pages a.gr[href^='http']"}, "ruleContent": {"content": ".con@html", "nextContentUrl": ".prenext a:contains(下一页)@href", "mergePages": true, "renderMode": "plain"}, "proxy": "auto", "lastUpdateTime": "1793252974259"},{"bookSourceName": "搬山人小说网", "bookSourceGroup": "小说", "bookSourceType": 0, "ruleVersion": 2, "bookSourceUrl": "https://www.banshanren.com", "bookSourceComment": "免签 JSON 搜索 /api/search?keyword=&page=；目录全量内嵌详情页，无独立目录页/无目录分页；正文明文，renderMode=plain。分类页 /all/ 的页码在第 8 段。⚠️ 站点有频控：连续抓多章会返回 10 段/约 700 字的限流壳（HTTP 200、结构正常、静默残缺），整本下载须降并发。规则与实测详见 docs/book-source-rules.md §17。", "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36\"}", "searchUrl": "/api/search?keyword={{key}}&page={{page}}", "ruleSearch": {"bookList": "$.model.data[*]", "name": "$.title", "author": "$.authors", "bookUrl": "$.slug##^(.+)$##https://www.banshanren.com/novel/$1", "coverUrl": "$.coverUrl", "intro": "$.description", "kind": "$.tagNames", "lastChapter": "$.latestUpdate", "wordCount": "$.wordCount"}, "exploreUrl": "全部小说::https://www.banshanren.com/all/0-0-0-0-0-0-1-{{page}}/\n奇幻玄幻::https://www.banshanren.com/all/0-4-0-0-0-0-1-{{page}}/\n现代都市::https://www.banshanren.com/all/0-3-0-0-0-0-1-{{page}}/\n武侠仙侠::https://www.banshanren.com/all/0-8-0-0-0-0-1-{{page}}/\n穿越重生::https://www.banshanren.com/all/0-7-0-0-0-0-1-{{page}}/\n科幻::https://www.banshanren.com/all/0-6-0-0-0-0-1-{{page}}/\n悬疑惊悚::https://www.banshanren.com/all/0-10-0-0-0-0-1-{{page}}/\n历史军事::https://www.banshanren.com/all/0-14-0-0-0-0-1-{{page}}/\n校园::https://www.banshanren.com/all/0-13-0-0-0-0-1-{{page}}/\n同人::https://www.banshanren.com/all/0-15-0-0-0-0-1-{{page}}/\n轻小说::https://www.banshanren.com/all/0-16-0-0-0-0-1-{{page}}/\nBG言情::https://www.banshanren.com/all/0-5-0-0-0-0-1-{{page}}/\nBL耽美::https://www.banshanren.com/all/0-1-0-0-0-0-1-{{page}}/\nGL百合::https://www.banshanren.com/all/0-2-0-0-0-0-1-{{page}}/\n男频::https://www.banshanren.com/all/1-0-0-0-0-0-1-{{page}}/\n女频::https://www.banshanren.com/all/2-0-0-0-0-0-1-{{page}}/", "ruleExplore": {"bookList": "ul.novel_list:not(.search_hot_box) li.novel_li", "name": "a.title@text", "bookUrl": "a.title@href##^/##https://www.banshanren.com/", "author": "div.title_box div.info_box:not(:has(img))@text##\\s*·[\\s\\S]*$##", "coverUrl": "img@data-src", "intro": "div.novel_intro_box@text", "kind": "ul.category_list@text"}, "ruleBookInfo": {"name": "div.novel_title_box h1@text", "author": "div.novel_title_box span.hl@text", "coverUrl": "div.novel_brief_box div.cover_box img@data-src", "intro": "div.novel_intro_box p.0@text", "kind": "div.bread_crumbs_box a.1@text", "lastChapter": "div.catalog_top_box span.hl@text"}, "ruleToc": {"chapterList": "ul.chapter_list li a", "chapterName": "@title", "chapterUrl": "@href", "nextTocUrl": "div.bread_crumbs_box a.2@href"}, "ruleContent": {"content": "div.chapter_content_box@html##<h2[^>]*>[\\s\\S]*?</h2>|<span[^>]*\\sclass=\"z[^\"]*\"[^>]*>[^<]*</span>##", "nextContentUrl": "a[title=\"下一章\"]@href", "prevContentUrl": "a[title=\"上一章\"]@href", "renderMode": "plain"}, "proxy": "auto", "lastUpdateTime": "1793253184065"},{"bookSourceComment": "荔枝短剧 liz04.com 视频书源 v1.4（2026-10-28 测速结果显示到线路按钮）\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n【站点】AI成人短剧站，Nuxt3 SSR。主站 liz01.com，线路 liz01~liz10.com，liz04.com 为官方「永久入口」。发布页 /road/。\n【搜索】GET /api/v1/search?keyword=&page=&size=20（服务端 JSON，真分页）\n【发现】topic 频道 + 全站排序 + 日/周/月榜 + 分类 + 标签，共 50+ 入口\n【目录】GET /api/v1/drama/{id}/episodes，一次返回全量剧集\n【播放】剧集页内联 JSON-LD contentUrl → /api/v1/cdn/(video|external)/manifest.m3u8?t=&sign=\n  · m3u8 为 AES-128，播放器自动处理\n  · 目录中「未更新」集为站点尚未放出，非书源问题\n【登录】游客可正常搜索/发现/播放。登录仅用于收藏、追剧、观看记录。\n  · 登录界面含：发布页输入框 + 从发布页获取网址 + 测速选线 + 切换线路 + 检查登录状态 + UA 设置\n【UA】已在 header 与所有 @js 请求中固定为 Chrome/Android UA，避免被 CDN 拦截\n【限频】concurrentRate=1500（1.5 秒/次），避免触发风控\n【v1.2 修复】\n  ① 封面不显示：header 的 Accept 改为图片优先（image/avif,image/webp,image/apng,image/*,*/*;q=0.8）\n    —— Glide 会复用书源 header 请求图床，text/html 开头的 Accept 可能被图床按内容协商分流\n  ② 视频不播放：ruleContent.content 改为只返回纯 URL（原来带「📺 标题」行污染了播放地址）\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n首次使用建议：书源菜单 → 登录 → 🚀从发布页获取网址 → ⚡测速选最快线路\n线路失效时：登录界面直接切换 liz01~liz10，或重新抓发布页\n【v1.3 修复：封面不显示真根因 = 图床整站 AES 加密】\n  站点所有封面都是加密图（Content-Type: application/octet-stream，无图片魔数），\n  浏览器靠 Worker 用 window.__NUXT__.config.public 的 imageAesKeyHex/imageAesIvHex\n  做 AES-128-CBC/NoPadding 解密后显示。Legado 用 coverDecodeJs 钩子同法解密：\n    · 已内置当前 key/iv（全站固定，多图取样验证）\n    · 魔数双保险：已是明文图片则原样透传\n    · key 轮换自愈：解密失败自动从首页 __NUXT__.config 重新提取 key/iv\n    · coverUrl 统一追加 ?lzcv=3 版本参数：绕过 Glide 密文磁盘缓存与 failUrl 进程黑名单\n  ⚠ 修复前浏览过的旧书封面可能仍不显示：在书籍详情刷新一下（或重新添加），\n    新 URL 带版本参数会强制重新下载+解密。\n【v1.4 登录界面：测速结果填到各线路按钮】\n  · 10 个「切 lizNN.com」按钮用 viewName 动态文本，实时显示各自测速结果\n  · 点「⚡ 测速选最快线路」后：每条线路 ms/超时/内容异常 写入按钮，最快线路加 ⚡ 前缀\n  · 切换线路后自动刷新面板，「📡 当前线路」同步更新\n\n【v1.5 修复：Legado-E 版封面不显示】\n  根因：legado-E 的 java.hexDecodeToByteArray 调用抛异常（方法可见但一调就炸），\n  coverDecodeJs 整体 try/catch 返回 null → 封面解密失败 → 全部封面不显示（LT 版无此问题）。\n  修法：key/iv 改为 base64 常量 + java.base64DecodeToByteArray；\n  自愈分支的 hex→bytes 改为纯 JS hex→base64 再解码，彻底不依赖 hexDecodeToByteArray。\n  双版本实测：LT 版 AES 向量回归通过；E 版 App 内 imageDecode 通道实测\n  硬编码 key 分支与自愈分支均解出真实封面（864×1152）。\n", "bookSourceGroup": "视频,R18,AI", "bookSourceName": "荔枝短剧🔞", "bookSourceType": 4, "bookSourceUrl": "https://liz04.com", "bookUrlPattern": "https?://liz\\d{2}\\.com/drama/\\d+(?:-[a-z0-9\\-]+)?(?:/|$)", "concurrentRate": "1500", "coverDecodeJs": "(function(){try{\nfunction mg(b){var x=(b[0]+256)%256;var y=(b[1]+256)%256;var z=(b[2]+256)%256;return (x===255&&y===216)||(x===137&&y===80&&z===78)||(x===71&&y===73&&z===70)||(x===82&&y===73&&z===70);}\nfunction h2b(hex){\n  var C='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n  var i=0,L=hex.length,o='';\n  while(i<L){\n    var b1=parseInt(hex.substr(i,2),16); i+=2;\n    var b2=i<L?parseInt(hex.substr(i,2),16):-1; i+=2;\n    var b3=i<L?parseInt(hex.substr(i,2),16):-1; i+=2;\n    o+=C.charAt(b1>>2);\n    o+=C.charAt(((b1&3)<<4)|((b2<0?0:b2)>>4));\n    if(b2<0){o+='==';break;}\n    o+=C.charAt(((b2&15)<<2)|((b3<0?0:b3)>>6));\n    if(b3<0){o+='=';break;}\n    o+=C.charAt(b3&63);\n  }\n  return java.base64DecodeToByteArray(o);\n}\nvar enc=null;\nvar isStream=false;\ntry{ isStream=(typeof result.read==='function'); }catch(e0){}\nif(isStream){\n  var baos=new Packages.java.io.ByteArrayOutputStream();\n  var buf=new Packages.java.lang.String('00000000000000000000000000000000').getBytes();\n  var n=result.read(buf);\n  while(n>0){baos.write(buf,0,n);n=result.read(buf);}\n  enc=baos.toByteArray();\n}else{enc=result;}\nif(!enc||enc.length<8){return enc;}\nif(mg(enc)){return enc;}\nif(enc.length%16!==0){return enc;}\nvar Cipher=Packages.javax.crypto.Cipher;\nvar SKS=Packages.javax.crypto.spec.SecretKeySpec;\nvar IVS=Packages.javax.crypto.spec.IvParameterSpec;\nfunction dec(kb,vb){var c=Cipher.getInstance('AES/CBC/NoPadding');c.init(2,new SKS(kb,'AES'),new IVS(vb));return c.doFinal(enc);}\nvar out=null;\ntry{\n  var kb0=java.base64DecodeToByteArray('6hnCHoXXaNpBZfWWSriGsg==');\n  var vb0=java.base64DecodeToByteArray('9NU+y8JzkB4NnNeEgjPHAg==');\n  if(kb0&&kb0.length===16&&vb0&&vb0.length===16){out=dec(kb0,vb0);}\n}catch(e1){}\nif(out&&mg(out)){return out;}\nvar host='https://liz04.com';\ntry{var hs=String(source.get('lizhost')||'');if(hs.indexOf('http')===0){host=hs;}}catch(e2){}\nvar pg='';\ntry{pg=String(java.ajax(host+'/,'+JSON.stringify({timeout:8000,headers:{'User-Agent':'Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36'}})));}catch(e3){return enc;}\nvar mk=pg.match(/imageAesKeyHex[^a-z0-9]{1,6}([0-9a-f]{32})/);\nvar mi=pg.match(/imageAesIvHex[^a-z0-9]{1,6}([0-9a-f]{32})/);\nif(!mk||!mi){return enc;}\nvar out2=null;\ntry{out2=dec(h2b(mk[1]),h2b(mi[1]));}catch(e4){return enc;}\nif(out2&&mg(out2)){return out2;}\nreturn enc;\n}catch(e){return null;}})()", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:(function(){\nfunction LZ_base(){\n  var b='';\n  try{ b=String(source.get('lizhost')); }catch(e){}\n  if(b.length<8||b.indexOf('http')!=0) b='https://liz04.com';\n  return b.replace(/\\/+$/,'');\n}\nfunction LZ_ua(){\n  var u='';\n  try{ u=String(source.get('lizua')); }catch(e){}\n  if(u.length<20) u='Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n  return u;\n}\nfunction LZ_hdr(){\n  return {'User-Agent':LZ_ua(),'Accept':'application/json, text/plain, */*','Referer':LZ_base()+'/'};\n}\nfunction LZ_opt(){\n  return JSON.stringify({'headers':LZ_hdr()});\n}\nfunction LZ_get(u){\n  try{ return String(java.ajax(u+','+LZ_opt())); }catch(e){ return ''; }\n}\nfunction LZ_json(t){\n  if(!t) return null;\n  try{\n    var o=JSON.parse(t);\n    return (o&&typeof o==='object')?o:null;\n  }catch(e){ return null; }\n}\nfunction LZ_items(o){\n  if(!o) return [];\n  var d=o.data;\n  if(!d) return [];\n  if(d.page&&d.page.items&&d.page.items.length>=0) return d.page.items;\n  if(d.items&&d.items.length>=0) return d.items;\n  if(d.result&&d.result.page&&d.result.page.items) return d.result.page.items;\n  if(Array.isArray(d)) return d;\n  return [];\n}\nfunction LZ_tagstr(tags){\n  if(!tags||!tags.length) return '';\n  var a=[];\n  for(var i=0;i<tags.length;i++){\n    var n=tags[i]?tags[i].name:null;\n    if(n&&String(n).length>0) a.push(String(n));\n  }\n  return a.join(' ');\n}\nfunction LZ_isAbs(u){\n  return typeof u==='string'&&(u.indexOf('http://')==0||u.indexOf('https://')==0||u.indexOf('//')==0);\n}\nfunction LZ_abs(u){\n  if(!u) return '';\n  var s=String(u);\n  if(s.indexOf('//')==0) return 'https:'+s;\n  if(s.indexOf('http')==0) return s;\n  if(s.charAt(0)=='/') return LZ_base()+s;\n  return LZ_base()+'/'+s;\n}\nfunction LZ_did(u){\n  var s=String(u||'').split(',')[0];\n  var m=s.match(/\\/drama\\/([0-9]+)/);\n  return m?m[1]:'';\n}\n\nvar b=LZ_base();\nvar rows=[];\nfunction push(t,u,grow){\n  rows.push({title:t,url:u,style:(grow?{layout_flexGrow:1}:{layout_flexBasisPercent:1})});\n}\n// ---- 分组标题（空 url 的按钮 Legado 会忽略，仅作视觉分组用 title 带前缀）----\npush('📺 精选频道','');\npush('精选·最热',b+'/api/v1/topic/lizhi-picked?tab=hot&page={{page}}&size=24',1);\npush('精选·最新',b+'/api/v1/topic/lizhi-picked?tab=new&page={{page}}&size=24',1);\npush('精选·收藏',b+'/api/v1/topic/lizhi-picked?tab=fav&page={{page}}&size=24',1);\npush('精选·点赞',b+'/api/v1/topic/lizhi-picked?tab=like&page={{page}}&size=24',1);\npush('🎬 原创频道','');\npush('原创·最热',b+'/api/v1/topic/lizhi-original?tab=hot&page={{page}}&size=24',1);\npush('原创·最新',b+'/api/v1/topic/lizhi-original?tab=new&page={{page}}&size=24',1);\npush('原创·收藏',b+'/api/v1/topic/lizhi-original?tab=fav&page={{page}}&size=24',1);\npush('🔥 全站排序','');\npush('全部·最新',b+'/api/v1/drama/list?sort=latest&page={{page}}&size=24',1);\npush('全部·最热',b+'/api/v1/drama/list?sort=hot&page={{page}}&size=24',1);\npush('全部·收藏',b+'/api/v1/drama/list?sort=fav&page={{page}}&size=24',1);\npush('全部·点赞',b+'/api/v1/drama/list?sort=like&page={{page}}&size=24',1);\npush('全部·随机',b+'/api/v1/drama/list?sort=random&page={{page}}&size=24',1);\npush('🆕 近期上新','');\npush('7天内上新',b+'/api/v1/drama/list?sort=latest&publishedWithinDays=7&page={{page}}&size=24',1);\npush('14天内上新',b+'/api/v1/drama/list?sort=latest&publishedWithinDays=14&page={{page}}&size=24',1);\npush('30天内上新',b+'/api/v1/drama/list?sort=latest&publishedWithinDays=30&page={{page}}&size=24',1);\npush('🏆 排行榜','');\npush('日榜',b+'/api/v1/rank?period=day',1);\npush('周榜',b+'/api/v1/rank?period=week',1);\npush('月榜',b+'/api/v1/rank?period=month',1);\npush('📁 荔枝原创分类','');\npush('原创-都市',b+'/api/v1/drama/list?categoryId=376&page={{page}}&size=24',1);\npush('原创-情感',b+'/api/v1/drama/list?categoryId=377&page={{page}}&size=24',1);\npush('原创-古风',b+'/api/v1/drama/list?categoryId=378&page={{page}}&size=24',1);\npush('原创-玄幻',b+'/api/v1/drama/list?categoryId=379&page={{page}}&size=24',1);\npush('原创-悬疑',b+'/api/v1/drama/list?categoryId=380&page={{page}}&size=24',1);\npush('原创-漫剧',b+'/api/v1/drama/list?categoryId=381&page={{page}}&size=24',1);\npush('📂 荔枝精选分类','');\npush('精选-COS',b+'/api/v1/drama/list?categoryId=486&page={{page}}&size=24',1);\npush('精选-都市',b+'/api/v1/drama/list?categoryId=383&page={{page}}&size=24',1);\npush('精选-情感',b+'/api/v1/drama/list?categoryId=384&page={{page}}&size=24',1);\npush('精选-古风',b+'/api/v1/drama/list?categoryId=385&page={{page}}&size=24',1);\npush('精选-玄幻',b+'/api/v1/drama/list?categoryId=386&page={{page}}&size=24',1);\npush('精选-悬疑',b+'/api/v1/drama/list?categoryId=387&page={{page}}&size=24',1);\npush('精选-漫剧',b+'/api/v1/drama/list?categoryId=388&page={{page}}&size=24',1);\npush('精选-更新',b+'/api/v1/drama/list?categoryId=389&page={{page}}&size=24',1);\npush('🏷 热门标签','');\npush('都市',b+'/api/v1/drama/list?tagIds=147&page={{page}}&size=24',1);\npush('爱情',b+'/api/v1/drama/list?tagIds=156&page={{page}}&size=24',1);\npush('甜宠',b+'/api/v1/drama/list?tagIds=157&page={{page}}&size=24',1);\npush('家庭',b+'/api/v1/drama/list?tagIds=159&page={{page}}&size=24',1);\npush('古装',b+'/api/v1/drama/list?tagIds=408&page={{page}}&size=24',1);\npush('悬疑',b+'/api/v1/drama/list?tagIds=178&page={{page}}&size=24',1);\npush('乱伦',b+'/api/v1/drama/list?tagIds=112&page={{page}}&size=24',1);\npush('绿帽',b+'/api/v1/drama/list?tagIds=215&page={{page}}&size=24',1);\npush('NTR',b+'/api/v1/drama/list?tagIds=223&page={{page}}&size=24',1);\npush('人妻',b+'/api/v1/drama/list?tagIds=205&page={{page}}&size=24',1);\npush('熟女',b+'/api/v1/drama/list?tagIds=197&page={{page}}&size=24',1);\npush('校园',b+'/api/v1/drama/list?tagIds=158&page={{page}}&size=24',1);\npush('穿越',b+'/api/v1/drama/list?tagIds=404&page={{page}}&size=24',1);\npush('重生',b+'/api/v1/drama/list?tagIds=405&page={{page}}&size=24',1);\npush('复仇',b+'/api/v1/drama/list?tagIds=403&page={{page}}&size=24',1);\npush('动作',b+'/api/v1/drama/list?tagIds=152&page={{page}}&size=24',1);\npush('职场',b+'/api/v1/drama/list?tagIds=200&page={{page}}&size=24',1);\npush('奇幻',b+'/api/v1/drama/list?tagIds=181&page={{page}}&size=24',1);\npush('科幻',b+'/api/v1/drama/list?tagIds=175&page={{page}}&size=24',1);\npush('灵异',b+'/api/v1/drama/list?tagIds=180&page={{page}}&size=24',1);\npush('喜剧',b+'/api/v1/drama/list?tagIds=396&page={{page}}&size=24',1);\npush('已完结',b+'/api/v1/drama/list?tagIds=191&page={{page}}&size=24',1);\npush('本周上新',b+'/api/v1/drama/list?tagIds=189&page={{page}}&size=24',1);\npush('女性成长',b+'/api/v1/drama/list?tagIds=401&page={{page}}&size=24',1);\npush('男同',b+'/api/v1/drama/list?tagIds=406&page={{page}}&size=24',1);\npush('女同',b+'/api/v1/drama/list?tagIds=407&page={{page}}&size=24',1);\nreturn JSON.stringify(rows);})()", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36\", \"Accept\": \"image/avif,image/webp,image/apng,image/*,*/*;q=0.8\", \"Accept-Language\": \"zh-CN,zh;q=0.9\"}", "lastUpdateTime": "1793195949363", "loginCheckJs": "\n(function(){\n  try{\n    var b='https://liz04.com';\n    try{ var s=String(source.get('lizhost')||''); if(s.length>6) b=s; }catch(e){}\n    var ck='';\n    try{ ck=String(java.getCookie(b,null)||''); }catch(e2){}\n    var logged=(ck&&(ck.indexOf('token')>=0||ck.indexOf('litchi.session')>=0));\n    if(!logged){ return result; }\n    // 已登录：确保带 Authorization 头（如站点用 Bearer token）\n    try{\n      var hm=java.getHeaderMap();\n      if(hm&&ck.indexOf('token')>=0){\n        var tk=ck.match(/token=([^;]+)/);\n        if(tk&&!hm.get('Authorization')) hm.put('Authorization','Bearer '+tk[1]);\n      }\n    }catch(e3){}\n    return result;\n  }catch(e4){ return result; }\n})()\n", "loginUi": "[{\"name\": \"🌐 线路与发布页\", \"type\": \"text\"}, {\"name\": \"发布页地址\", \"type\": \"input\", \"viewName\": \"source.get('lizroad')||'https://liz04.com/road/'\", \"action\": \"LZ_saveRoad()\"}, {\"name\": \"🚀 从发布页获取网址\", \"type\": \"button\", \"action\": \"LZ_fromRoad()\"}, {\"name\": \"⚡ 测速选最快线路\", \"type\": \"button\", \"action\": \"LZ_speed()\"}, {\"name\": \"📡 当前线路\", \"type\": \"text\", \"viewName\": \"(source.get('lizhost')||'https://liz04.com')\"}, {\"name\": \"切 liz01.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https://liz01.com')\", \"viewName\": \"'切 liz01.com '+(source.get('lizsp01')||'')\"}, {\"name\": \"切 liz02.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https://liz02.com')\", \"viewName\": \"'切 liz02.com '+(source.get('lizsp02')||'')\"}, {\"name\": \"切 liz03.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https://liz03.com')\", \"viewName\": \"'切 liz03.com '+(source.get('lizsp03')||'')\"}, {\"name\": \"切 liz04.com（永久入口）\", \"type\": \"button\", \"action\": \"LZ_setLine('https://liz04.com')\", \"viewName\": \"'切 liz04.com（永久入口） '+(source.get('lizsp04')||'')\"}, {\"name\": \"切 liz05.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https://liz05.com')\", \"viewName\": \"'切 liz05.com '+(source.get('lizsp05')||'')\"}, {\"name\": \"切 liz06.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https://liz06.com')\", \"viewName\": \"'切 liz06.com '+(source.get('lizsp06')||'')\"}, {\"name\": \"切 liz07.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https://liz07.com')\", \"viewName\": \"'切 liz07.com '+(source.get('lizsp07')||'')\"}, {\"name\": \"切 liz08.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https://liz08.com')\", \"viewName\": \"'切 liz08.com '+(source.get('lizsp08')||'')\"}, {\"name\": \"切 liz09.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https://liz09.com')\", \"viewName\": \"'切 liz09.com '+(source.get('lizsp09')||'')\"}, {\"name\": \"切 liz10.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https://liz10.com')\", \"viewName\": \"'切 liz10.com '+(source.get('lizsp10')||'')\"}, {\"name\": \"🧭 账号与登录\", \"type\": \"text\"}, {\"name\": \"🔄 检查登录状态\", \"type\": \"button\", \"action\": \"LZ_checkLogin()\"}, {\"name\": \"🔑 打开登录页\", \"type\": \"button\", \"action\": \"LZ_openLogin()\"}, {\"name\": \"⚙️ 请求头 UA\", \"type\": \"text\"}, {\"name\": \"自定义 UA\", \"type\": \"input\", \"viewName\": \"source.get('lizua')||''\", \"action\": \"LZ_saveUa()\"}, {\"name\": \"💾 保存 UA\", \"type\": \"button\", \"action\": \"LZ_saveUa(source.get('lizua')||'')\"}, {\"name\": \"♻️ 恢复默认 UA\", \"type\": \"button\", \"action\": \"LZ_resetUa()\"}]", "loginUrl": "\nfunction LZ_toast(m){ try{ java.toast(String(m)); }catch(e){} }\n\n// ---------- 基础工具 ----------\nfunction LZ_base2(){\n  var b='';\n  try{ b=String(source.get('lizhost')); }catch(e){}\n  if(b.length<8||b.indexOf('http')!=0) b='https://liz04.com';\n  return b.replace(/\\/+$/,'');\n}\nfunction LZ_ua2(){\n  var u='';\n  try{ u=String(source.get('lizua')); }catch(e){}\n  if(u.length<20) u='Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n  return u;\n}\nfunction LZ_req(u,ms){\n  var t0=Date.now();\n  try{\n    var r=java.ajax(u+','+JSON.stringify({timeout:ms||8000,headers:{'User-Agent':LZ_ua2(),'Accept':'text/html,application/xhtml+xml,*/*;q=0.8'}}));\n    var dt=Date.now()-t0;\n    var s=(r==null)?'':String(r);\n    return {ok:true,ms:dt,len:s.length,html:s,url:u};\n  }catch(e){\n    return {ok:false,ms:(Date.now()-t0),len:0,html:'',err:String(e&&e.message?e.message:e),url:u};\n  }\n}\n\n// ---------- 发布页抓线路 ----------\n// /road/ 页脚与 NUXT 数据里都带 liz01~liz10.com 线路\nfunction LZ_pickDomains(html){\n  var out=[];\n  if(!html) return out;\n  var re=/https?:\\/\\/(liz\\d{2}\\.com)/g;\n  var m;\n  while((m=re.exec(html))!=null){\n    var u='https://'+m[1];\n    if(out.indexOf(u)<0) out.push(u);\n  }\n  return out;\n}\n\n// ---------- 按钮：从发布页获取网址 ----------\nfunction LZ_fromRoad(){\n  var pub=String(source.get('lizroad')||'').trim();\n  if(pub.length<6){ pub='https://liz04.com/road/'; }\n  if(pub.indexOf('http')!=0){ pub='https://'+pub.replace(/^\\/+/,''); }\n  if(pub.charAt(pub.length-1)!='/') pub=pub+'/';\n  LZ_toast('正在读取发布页：'+pub);\n  var r=LZ_req(pub,12000);\n  if(!r.ok||r.len<500){\n    LZ_toast('✖ 发布页读取失败，请检查网络或手动输入发布页地址');\n    return 'fail';\n  }\n  var ds=LZ_pickDomains(r.html);\n  if(ds.length==0){\n    LZ_toast('✖ 发布页中未解析到线路地址');\n    return 'fail';\n  }\n  // 去重 + 只保留 http/https\n  var list=[];\n  for(var i=0;i<ds.length;i++){ if(list.indexOf(ds[i])<0) list.push(ds[i]); }\n  source.put('lizlines',list.join(','));\n  LZ_toast('✔ 已从发布页获取 '+list.length+' 条线路，点「⚡ 测速选最快」自动选择');\n  return 'ok';\n}\n\n// ---------- 测速结果辅助 ----------\nfunction LZ_spKey(host){\n  var m=String(host||'').match(/liz(\\d{2})\\.com/);\n  if(m) return 'lizsp'+m[1];\n  return 'lizsp_'+String(host||'').replace(/[^a-z0-9]/gi,'').substring(0,8);\n}\nfunction LZ_spClear(){\n  for(var p=1;p<=10;p++){ try{ source.put('lizsp'+('0'+p).slice(-2),''); }catch(e){} }\n}\nfunction LZ_refresh(){\n  try{ java.reLoginView(); return true; }catch(e){}\n  try{ java.reUiView(); return true; }catch(e2){}\n  return false;\n}\n\n// ---------- 按钮：测速选最快 ----------\nfunction LZ_speed(){\n  var raw=String(source.get('lizlines')||'');\n  var list=[];\n  if(raw.length>6){\n    var a=raw.split(',');\n    for(var i=0;i<a.length;i++){\n      var s=String(a[i]||'').trim();\n      if(s.length>6){ if(s.indexOf('http')!=0) s='https://'+s; list.push(s.replace(/\\/+$/,'')); }\n    }\n  }\n  if(list.length==0){\n    list=['https://liz04.com','https://liz03.com','https://liz01.com','https://liz02.com','https://liz05.com','https://liz06.com','https://liz07.com','https://liz08.com','https://liz09.com','https://liz10.com'];\n  }\n  LZ_spClear();\n  LZ_toast('正在测速 '+list.length+' 条线路…');\n  var best=null,bestMs=999999;\n  var msg=[];\n  for(var i=0;i<list.length;i++){\n    var host=list[i];\n    var r=LZ_req(host+'/',8000);\n    var tag='';\n    if(r.ok&&r.len>2000){\n      tag=r.ms+'ms';\n      if(r.ms<bestMs){ bestMs=r.ms; best=host; }\n    }else if(r.ok){ tag='内容异常'; }\n    else{ tag='超时'; }\n    try{ source.put(LZ_spKey(host),tag); }catch(e){}\n    msg.push(host.replace('https://','')+' '+tag);\n  }\n  if(best){\n    source.put('lizhost',best);\n    try{ source.put(LZ_spKey(best),'⚡'+source.get(LZ_spKey(best))); }catch(e2){}\n    var ok=LZ_refresh();\n    LZ_toast('⚡ 最快：'+best.replace('https://','')+' '+bestMs+'ms'+(ok?'\\n结果已填到各线路按钮':'\\n请重新打开登录面板查看结果'));\n    return 'ok';\n  }\n  LZ_refresh();\n  LZ_toast('✖ 所有线路均不可达\\n'+msg.join(' / '));\n  return 'fail';\n}\n\n// ---------- 按钮：切换线路 ----------\nfunction LZ_setLine(d){\n  if(!d){ LZ_toast('✖ 线路为空'); return 'fail'; }\n  var s=String(d).trim();\n  if(s.indexOf('http')!=0) s='https://'+s;\n  s=s.replace(/\\/+$/,'');\n  source.put('lizhost',s);\n  LZ_refresh();\n  LZ_toast('✔ 已切换到 '+s);\n  return 'ok';\n}\n\n// ---------- 按钮：检查登录状态 ----------\nfunction LZ_checkLogin(){\n  var b=LZ_base2();\n  var ck='';\n  try{ ck=String(java.getCookie(b,null)||''); }catch(e){}\n  if(!ck||ck.indexOf('token')<0){\n    if(ck.indexOf('litchi.session')<0){\n      LZ_toast('ℹ 当前为游客状态（未登录）\\n搜索 / 发现 / 播放均可正常使用\\n登录仅用于收藏、追剧、观看记录同步');\n      return 'guest';\n    }\n  }\n  // 尝试拉取用户信息\n  var r=LZ_req(b+'/api/v1/user/profile',8000);\n  if(r.ok&&r.html){\n    var t=r.html;\n    if(t.indexOf('\"success\":true')>=0||t.indexOf('\"success\": true')>=0){\n      var nm=t.match(/\"(?:nickName|nickname|loginName|userName)\"\\s*:\\s*\"([^\"]*)\"/);\n      LZ_toast('✔ 已登录'+(nm?('：'+nm[1]):'')+'\\n收藏/追剧/观看记录已同步');\n      return 'ok';\n    }\n  }\n  LZ_toast('ℹ 当前为游客状态（未登录）\\n搜索 / 发现 / 播放均可正常使用\\n登录仅用于收藏、追剧、观看记录同步');\n  return 'guest';\n}\n\n// ---------- 按钮：打开登录页 ----------\nfunction LZ_openLogin(){\n  try{\n    java.startBrowser(LZ_base2()+'/user','荔枝短剧 · 登录');\n    LZ_toast('已打开登录页，登录成功后返回点「🔄 检查登录状态」');\n  }catch(e){\n    LZ_toast('✖ 无法打开浏览器：'+String(e&&e.message?e.message:e));\n  }\n}\n\n// ---------- 按钮：保存 UA ----------\nfunction LZ_saveUa(u){\n  var s=String(u||'').trim();\n  if(s.length<20){ LZ_toast('✖ UA 太短，未保存'); return 'fail'; }\n  source.put('lizua',s);\n  LZ_toast('✔ 已保存自定义 UA');\n  return 'ok';\n}\nfunction LZ_resetUa(){\n  source.put('lizua','');\n  LZ_toast('✔ 已恢复默认 UA');\n  return 'ok';\n}\n\n// ---------- 按钮：保存发布页 ----------\nfunction LZ_saveRoad(u){\n  var s=String(u||'').trim();\n  if(s.length<6){ LZ_toast('✖ 发布页地址太短，未保存'); return 'fail'; }\n  if(s.indexOf('http')!=0) s='https://'+s.replace(/^\\/+/,'');\n  if(s.charAt(s.length-1)!='/') s=s+'/';\n  source.put('lizroad',s);\n  LZ_toast('✔ 发布页已保存：'+s);\n  return 'ok';\n}\nfunction LZ_resetRoad(){\n  source.put('lizroad','');\n  LZ_toast('✔ 已恢复默认发布页 https://liz04.com/road/');\n  return 'ok';\n}\n\n// ---------- 登录动作（V1 静态协议要求） ----------\nfunction login(){ return ''; }\n", "respondTime": 180000, "ruleBookInfo": {"author": "b", "coverUrl": "g", "init": "@js:(function(){\nfunction LZ_base(){\n  var b='';\n  try{ b=String(source.get('lizhost')); }catch(e){}\n  if(b.length<8||b.indexOf('http')!=0) b='https://liz04.com';\n  return b.replace(/\\/+$/,'');\n}\nfunction LZ_ua(){\n  var u='';\n  try{ u=String(source.get('lizua')); }catch(e){}\n  if(u.length<20) u='Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n  return u;\n}\nfunction LZ_hdr(){\n  return {'User-Agent':LZ_ua(),'Accept':'application/json, text/plain, */*','Referer':LZ_base()+'/'};\n}\nfunction LZ_opt(){\n  return JSON.stringify({'headers':LZ_hdr()});\n}\nfunction LZ_get(u){\n  try{ return String(java.ajax(u+','+LZ_opt())); }catch(e){ return ''; }\n}\nfunction LZ_json(t){\n  if(!t) return null;\n  try{\n    var o=JSON.parse(t);\n    return (o&&typeof o==='object')?o:null;\n  }catch(e){ return null; }\n}\nfunction LZ_items(o){\n  if(!o) return [];\n  var d=o.data;\n  if(!d) return [];\n  if(d.page&&d.page.items&&d.page.items.length>=0) return d.page.items;\n  if(d.items&&d.items.length>=0) return d.items;\n  if(d.result&&d.result.page&&d.result.page.items) return d.result.page.items;\n  if(Array.isArray(d)) return d;\n  return [];\n}\nfunction LZ_tagstr(tags){\n  if(!tags||!tags.length) return '';\n  var a=[];\n  for(var i=0;i<tags.length;i++){\n    var n=tags[i]?tags[i].name:null;\n    if(n&&String(n).length>0) a.push(String(n));\n  }\n  return a.join(' ');\n}\nfunction LZ_isAbs(u){\n  return typeof u==='string'&&(u.indexOf('http://')==0||u.indexOf('https://')==0||u.indexOf('//')==0);\n}\nfunction LZ_abs(u){\n  if(!u) return '';\n  var s=String(u);\n  if(s.indexOf('//')==0) return 'https:'+s;\n  if(s.indexOf('http')==0) return s;\n  if(s.charAt(0)=='/') return LZ_base()+s;\n  return LZ_base()+'/'+s;\n}\nfunction LZ_cov(u){\n  var s=LZ_abs(u);\n  if(!s) return '';\n  return s+((s.indexOf('?')<0)?'?':'&')+'lzcv=3';\n}\nfunction LZ_did(u){\n  var s=String(u||'').split(',')[0];\n  var m=s.match(/\\/drama\\/([0-9]+)/);\n  return m?m[1]:'';\n}\nvar id=LZ_did(String(baseUrl||''));if(!id) return '{}';var t=LZ_get(LZ_base()+'/api/v1/drama/'+id);var o=LZ_json(t);var d=(o&&o.data)?o.data:null;if(!d) return '{}';var tags=LZ_tagstr(d.tags);var cat=String(d.categoryName||'');var kind=tags;if(cat&&kind.indexOf(cat)<0) kind=(kind?cat+' '+kind:cat);if(!kind) kind=cat;var pub=d.publishedEpisodeCount||0;var tot=d.totalEpisodes||0;var st=d.partial?'连载中':'已完结';var ex=String(d.coverProgress||'');var sc=d.score?('评分 '+d.score+' 分'):'';var head=[];if(st)head.push(st);if(ex)head.push(ex);if(sc)head.push(sc);var intro=(head.length?head.join(' · ')+String.fromCharCode(10,10):'')+String(d.description||'');return JSON.stringify({a:String(d.title||''),b:'荔枝短剧',c:kind,d:(tot?('更新至'+pub+'集 / 全'+tot+'集'):''),e:'',f:intro,g:LZ_cov(d.coverUrl),h:LZ_base()+'/api/v1/drama/'+id+'/episodes'});})()", "intro": "f", "kind": "c", "lastChapter": "e", "name": "a", "tocUrl": "h", "wordCount": "d"}, "ruleContent": {"content": "@js:(function(){\nfunction LZ_base(){\n  var b='';\n  try{ b=String(source.get('lizhost')); }catch(e){}\n  if(b.length<8||b.indexOf('http')!=0) b='https://liz04.com';\n  return b.replace(/\\/+$/,'');\n}\nfunction LZ_ua(){\n  var u='';\n  try{ u=String(source.get('lizua')); }catch(e){}\n  if(u.length<20) u='Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n  return u;\n}\nfunction LZ_hdr(){\n  return {'User-Agent':LZ_ua(),'Accept':'application/json, text/plain, */*','Referer':LZ_base()+'/'};\n}\nfunction LZ_opt(){\n  return JSON.stringify({'headers':LZ_hdr()});\n}\nfunction LZ_get(u){\n  try{ return String(java.ajax(u+','+LZ_opt())); }catch(e){ return ''; }\n}\nfunction LZ_json(t){\n  if(!t) return null;\n  try{\n    var o=JSON.parse(t);\n    return (o&&typeof o==='object')?o:null;\n  }catch(e){ return null; }\n}\nfunction LZ_items(o){\n  if(!o) return [];\n  var d=o.data;\n  if(!d) return [];\n  if(d.page&&d.page.items&&d.page.items.length>=0) return d.page.items;\n  if(d.items&&d.items.length>=0) return d.items;\n  if(d.result&&d.result.page&&d.result.page.items) return d.result.page.items;\n  if(Array.isArray(d)) return d;\n  return [];\n}\nfunction LZ_tagstr(tags){\n  if(!tags||!tags.length) return '';\n  var a=[];\n  for(var i=0;i<tags.length;i++){\n    var n=tags[i]?tags[i].name:null;\n    if(n&&String(n).length>0) a.push(String(n));\n  }\n  return a.join(' ');\n}\nfunction LZ_isAbs(u){\n  return typeof u==='string'&&(u.indexOf('http://')==0||u.indexOf('https://')==0||u.indexOf('//')==0);\n}\nfunction LZ_abs(u){\n  if(!u) return '';\n  var s=String(u);\n  if(s.indexOf('//')==0) return 'https:'+s;\n  if(s.indexOf('http')==0) return s;\n  if(s.charAt(0)=='/') return LZ_base()+s;\n  return LZ_base()+'/'+s;\n}\nfunction LZ_did(u){\n  var s=String(u||'').split(',')[0];\n  var m=s.match(/\\/drama\\/([0-9]+)/);\n  return m?m[1]:'';\n}\nvar u=String(baseUrl||'').split(',')[0];var h='';try{ h=String(java.ajax(u+','+JSON.stringify({'headers':{'User-Agent':LZ_ua(),'Accept':'text/html,application/xhtml+xml,*/*;q=0.8','Referer':LZ_base()+'/'}}))); }catch(e){ return ''; }if(!h||h.length<200) return '';var i=h.indexOf('contentUrl');if(i<0) return '';i=h.indexOf(':',i);if(i<0) return '';i=i+1;while(i<h.length&&h.charAt(i)!='\"'&&h.charAt(i)!=\"'\") i++;if(i>=h.length) return '';i=i+1;var j=i;while(j<h.length&&h.charAt(j)!='\"'&&h.charAt(j)!=\"'\") j++;if(j<=i) return '';var m=[null,h.substring(i,j)];if(!m) return '';var cu=m[1];cu=cu.replace(/\\\\u002F/g,'/');if(cu.indexOf('http')!=0){ if(cu.charAt(0)=='/') cu=LZ_base()+cu; else cu=LZ_base()+'/'+cu;}return cu;})()"}, "ruleExplore": {"author": "$.author", "bookList": "@js:(function(){\nfunction LZ_base(){\n  var b='';\n  try{ b=String(source.get('lizhost')); }catch(e){}\n  if(b.length<8||b.indexOf('http')!=0) b='https://liz04.com';\n  return b.replace(/\\/+$/,'');\n}\nfunction LZ_ua(){\n  var u='';\n  try{ u=String(source.get('lizua')); }catch(e){}\n  if(u.length<20) u='Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n  return u;\n}\nfunction LZ_hdr(){\n  return {'User-Agent':LZ_ua(),'Accept':'application/json, text/plain, */*','Referer':LZ_base()+'/'};\n}\nfunction LZ_opt(){\n  return JSON.stringify({'headers':LZ_hdr()});\n}\nfunction LZ_get(u){\n  try{ return String(java.ajax(u+','+LZ_opt())); }catch(e){ return ''; }\n}\nfunction LZ_json(t){\n  if(!t) return null;\n  try{\n    var o=JSON.parse(t);\n    return (o&&typeof o==='object')?o:null;\n  }catch(e){ return null; }\n}\nfunction LZ_items(o){\n  if(!o) return [];\n  var d=o.data;\n  if(!d) return [];\n  if(d.page&&d.page.items&&d.page.items.length>=0) return d.page.items;\n  if(d.items&&d.items.length>=0) return d.items;\n  if(d.result&&d.result.page&&d.result.page.items) return d.result.page.items;\n  if(Array.isArray(d)) return d;\n  return [];\n}\nfunction LZ_tagstr(tags){\n  if(!tags||!tags.length) return '';\n  var a=[];\n  for(var i=0;i<tags.length;i++){\n    var n=tags[i]?tags[i].name:null;\n    if(n&&String(n).length>0) a.push(String(n));\n  }\n  return a.join(' ');\n}\nfunction LZ_isAbs(u){\n  return typeof u==='string'&&(u.indexOf('http://')==0||u.indexOf('https://')==0||u.indexOf('//')==0);\n}\nfunction LZ_abs(u){\n  if(!u) return '';\n  var s=String(u);\n  if(s.indexOf('//')==0) return 'https:'+s;\n  if(s.indexOf('http')==0) return s;\n  if(s.charAt(0)=='/') return LZ_base()+s;\n  return LZ_base()+'/'+s;\n}\nfunction LZ_cov(u){\n  var s=LZ_abs(u);\n  if(!s) return '';\n  return s+((s.indexOf('?')<0)?'?':'&')+'lzcv=3';\n}\nfunction LZ_did(u){\n  var s=String(u||'').split(',')[0];\n  var m=s.match(/\\/drama\\/([0-9]+)/);\n  return m?m[1]:'';\n}\nvar raw='';try{ raw=String(result||''); }catch(e0){}if(raw.length<10){ try{ raw=String(src||''); }catch(e1){} }if(raw.length<10) return [];var o=LZ_json(raw);var isRank=false;try{ isRank=(String(baseUrl||'').indexOf('/api/v1/rank')>=0); }catch(e2){}var its=[];if(isRank){var r=o&&o.data?o.data.items:null;if(r){for(var i=0;i<r.length;i++){ if(r[i]&&r[i].drama) its.push(r[i].drama); }}}else{ its=LZ_items(o); }var out=[];for(var i=0;i<its.length;i++){var it=its[i];if(!it)continue;out.push(JSON.stringify({name:String(it.title||''),author:'荔枝短剧',kind:LZ_tagstr(it.tags),wordCount:(it.totalEpisodes?('全'+it.totalEpisodes+'集'):''),lastChapter:(it.publishedEpisodeCount?('更新至'+it.publishedEpisodeCount+'集'):''),intro:String(it.description||''),coverUrl:LZ_cov(it.coverUrl),bookUrl:LZ_base()+'/drama/'+it.id+'/'}));}return out;})()", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name", "wordCount": "$.wordCount"}, "ruleSearch": {"author": "$.author", "bookList": "@js:(function(){\nfunction LZ_base(){\n  var b='';\n  try{ b=String(source.get('lizhost')); }catch(e){}\n  if(b.length<8||b.indexOf('http')!=0) b='https://liz04.com';\n  return b.replace(/\\/+$/,'');\n}\nfunction LZ_ua(){\n  var u='';\n  try{ u=String(source.get('lizua')); }catch(e){}\n  if(u.length<20) u='Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n  return u;\n}\nfunction LZ_hdr(){\n  return {'User-Agent':LZ_ua(),'Accept':'application/json, text/plain, */*','Referer':LZ_base()+'/'};\n}\nfunction LZ_opt(){\n  return JSON.stringify({'headers':LZ_hdr()});\n}\nfunction LZ_get(u){\n  try{ return String(java.ajax(u+','+LZ_opt())); }catch(e){ return ''; }\n}\nfunction LZ_json(t){\n  if(!t) return null;\n  try{\n    var o=JSON.parse(t);\n    return (o&&typeof o==='object')?o:null;\n  }catch(e){ return null; }\n}\nfunction LZ_items(o){\n  if(!o) return [];\n  var d=o.data;\n  if(!d) return [];\n  if(d.page&&d.page.items&&d.page.items.length>=0) return d.page.items;\n  if(d.items&&d.items.length>=0) return d.items;\n  if(d.result&&d.result.page&&d.result.page.items) return d.result.page.items;\n  if(Array.isArray(d)) return d;\n  return [];\n}\nfunction LZ_tagstr(tags){\n  if(!tags||!tags.length) return '';\n  var a=[];\n  for(var i=0;i<tags.length;i++){\n    var n=tags[i]?tags[i].name:null;\n    if(n&&String(n).length>0) a.push(String(n));\n  }\n  return a.join(' ');\n}\nfunction LZ_isAbs(u){\n  return typeof u==='string'&&(u.indexOf('http://')==0||u.indexOf('https://')==0||u.indexOf('//')==0);\n}\nfunction LZ_abs(u){\n  if(!u) return '';\n  var s=String(u);\n  if(s.indexOf('//')==0) return 'https:'+s;\n  if(s.indexOf('http')==0) return s;\n  if(s.charAt(0)=='/') return LZ_base()+s;\n  return LZ_base()+'/'+s;\n}\nfunction LZ_cov(u){\n  var s=LZ_abs(u);\n  if(!s) return '';\n  return s+((s.indexOf('?')<0)?'?':'&')+'lzcv=3';\n}\nfunction LZ_did(u){\n  var s=String(u||'').split(',')[0];\n  var m=s.match(/\\/drama\\/([0-9]+)/);\n  return m?m[1]:'';\n}\nvar raw='';try{ raw=String(result||''); }catch(e0){}if(raw.length<10){ try{ raw=String(src||''); }catch(e1){} }if(raw.length<10) return [];var o=LZ_json(raw);var its=LZ_items(o);var out=[];for(var i=0;i<its.length;i++){var it=its[i];if(!it)continue;var id=it.id;out.push(JSON.stringify({name:String(it.title||''),author:'荔枝短剧',kind:LZ_tagstr(it.tags),wordCount:(it.totalEpisodes?('全'+it.totalEpisodes+'集'):''),lastChapter:(it.publishedEpisodeCount?('更新至'+it.publishedEpisodeCount+'集'):''),intro:String(it.description||''),coverUrl:LZ_cov(it.coverUrl),bookUrl:LZ_base()+'/drama/'+id+'/'}));}return out;})()", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name", "wordCount": "$.wordCount"}, "ruleToc": {"chapterList": "@js:(function(){\nfunction LZ_base(){\n  var b='';\n  try{ b=String(source.get('lizhost')); }catch(e){}\n  if(b.length<8||b.indexOf('http')!=0) b='https://liz04.com';\n  return b.replace(/\\/+$/,'');\n}\nfunction LZ_ua(){\n  var u='';\n  try{ u=String(source.get('lizua')); }catch(e){}\n  if(u.length<20) u='Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n  return u;\n}\nfunction LZ_hdr(){\n  return {'User-Agent':LZ_ua(),'Accept':'application/json, text/plain, */*','Referer':LZ_base()+'/'};\n}\nfunction LZ_opt(){\n  return JSON.stringify({'headers':LZ_hdr()});\n}\nfunction LZ_get(u){\n  try{ return String(java.ajax(u+','+LZ_opt())); }catch(e){ return ''; }\n}\nfunction LZ_json(t){\n  if(!t) return null;\n  try{\n    var o=JSON.parse(t);\n    return (o&&typeof o==='object')?o:null;\n  }catch(e){ return null; }\n}\nfunction LZ_items(o){\n  if(!o) return [];\n  var d=o.data;\n  if(!d) return [];\n  if(d.page&&d.page.items&&d.page.items.length>=0) return d.page.items;\n  if(d.items&&d.items.length>=0) return d.items;\n  if(d.result&&d.result.page&&d.result.page.items) return d.result.page.items;\n  if(Array.isArray(d)) return d;\n  return [];\n}\nfunction LZ_tagstr(tags){\n  if(!tags||!tags.length) return '';\n  var a=[];\n  for(var i=0;i<tags.length;i++){\n    var n=tags[i]?tags[i].name:null;\n    if(n&&String(n).length>0) a.push(String(n));\n  }\n  return a.join(' ');\n}\nfunction LZ_isAbs(u){\n  return typeof u==='string'&&(u.indexOf('http://')==0||u.indexOf('https://')==0||u.indexOf('//')==0);\n}\nfunction LZ_abs(u){\n  if(!u) return '';\n  var s=String(u);\n  if(s.indexOf('//')==0) return 'https:'+s;\n  if(s.indexOf('http')==0) return s;\n  if(s.charAt(0)=='/') return LZ_base()+s;\n  return LZ_base()+'/'+s;\n}\nfunction LZ_did(u){\n  var s=String(u||'').split(',')[0];\n  var m=s.match(/\\/drama\\/([0-9]+)/);\n  return m?m[1]:'';\n}\nvar u=String(baseUrl||'').split(',')[0];if(u.indexOf('/episodes')<0){ u=LZ_base()+'/api/v1/drama/'+LZ_did(u)+'/episodes,'+LZ_opt();}var t=LZ_get(u);var o=LZ_json(t);var its=(o&&Array.isArray(o.data))?o.data:[];var out=[];for(var i=0;i<its.length;i++){var e=its[i];if(!e)continue;var no=e.epNo||(i+1);var ok=(e.available===true&&e.episodeId!=null);var nm=String(e.title||('第'+no+'集'));if(!ok) nm=nm+'（未更新）';out.push(JSON.stringify({name:nm,url:LZ_base()+'/drama/'+LZ_did(u)+'/ep-'+no+'/',isVip:(ok?false:true)}));}return out;})()", "chapterName": "$.name", "chapterUrl": "$.url", "isVip": "$.isVip"}, "searchUrl": "@js:(function(){\nfunction LZ_base(){\n  var b='';\n  try{ b=String(source.get('lizhost')); }catch(e){}\n  if(b.length<8||b.indexOf('http')!=0) b='https://liz04.com';\n  return b.replace(/\\/+$/,'');\n}\nfunction LZ_ua(){\n  var u='';\n  try{ u=String(source.get('lizua')); }catch(e){}\n  if(u.length<20) u='Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n  return u;\n}\nfunction LZ_hdr(){\n  return {'User-Agent':LZ_ua(),'Accept':'application/json, text/plain, */*','Referer':LZ_base()+'/'};\n}\nfunction LZ_opt(){\n  return JSON.stringify({'headers':LZ_hdr()});\n}\nfunction LZ_get(u){\n  try{ return String(java.ajax(u+','+LZ_opt())); }catch(e){ return ''; }\n}\nfunction LZ_json(t){\n  if(!t) return null;\n  try{\n    var o=JSON.parse(t);\n    return (o&&typeof o==='object')?o:null;\n  }catch(e){ return null; }\n}\nfunction LZ_items(o){\n  if(!o) return [];\n  var d=o.data;\n  if(!d) return [];\n  if(d.page&&d.page.items&&d.page.items.length>=0) return d.page.items;\n  if(d.items&&d.items.length>=0) return d.items;\n  if(d.result&&d.result.page&&d.result.page.items) return d.result.page.items;\n  if(Array.isArray(d)) return d;\n  return [];\n}\nfunction LZ_tagstr(tags){\n  if(!tags||!tags.length) return '';\n  var a=[];\n  for(var i=0;i<tags.length;i++){\n    var n=tags[i]?tags[i].name:null;\n    if(n&&String(n).length>0) a.push(String(n));\n  }\n  return a.join(' ');\n}\nfunction LZ_isAbs(u){\n  return typeof u==='string'&&(u.indexOf('http://')==0||u.indexOf('https://')==0||u.indexOf('//')==0);\n}\nfunction LZ_abs(u){\n  if(!u) return '';\n  var s=String(u);\n  if(s.indexOf('//')==0) return 'https:'+s;\n  if(s.indexOf('http')==0) return s;\n  if(s.charAt(0)=='/') return LZ_base()+s;\n  return LZ_base()+'/'+s;\n}\nfunction LZ_did(u){\n  var s=String(u||'').split(',')[0];\n  var m=s.match(/\\/drama\\/([0-9]+)/);\n  return m?m[1]:'';\n}\nvar b=LZ_base();var kw='';try{kw=String(key);}catch(e){}var pg=1;try{pg=Math.max(1,parseInt(page,10)||1);}catch(e2){}return b+'/api/v1/search?keyword='+encodeURIComponent(kw)+'&page='+pg+'&size=20,'+LZ_opt();})()", "weight": 0},{"bookSourceComment": "得奇小说网 www.deqitxt.com 书源 创建于2026-10-28。", "bookSourceGroup": "", "bookSourceName": "得奇小说网(deqitxt.com)20261028", "bookSourceType": 0, "bookSourceUrl": "https://www.deqitxt.com", "checkKeyWord": "夜无疆", "enabled": true, "enabledCookieJar": false, "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36\"}", "lastUpdateTime": "1793194459674", "respondTime": 180000, "searchUrl": "https://www.deqitxt.com/so/so.aspx?key={{key}}", "ruleSearch": {"bookList": "@css:div.container div.item", "name": "tag.h3@tag.a@text", "bookUrl": "tag.h3@tag.a@href", "author": "tag.p.1@tag.a@text##作者：", "kind": "tag.p.0@tag.span.1@text", "lastChapter": "tag.ul@tag.li.0@tag.a@text", "coverUrl": "tag.a@tag.img@src"}, "ruleBookInfo": {"name": "class.itemtxt@tag.h1@tag.a@text", "author": "class.itemtxt@tag.p.1@tag.a@text##作者：", "kind": "class.itemtxt@tag.p.0@tag.span.1@text", "coverUrl": "class.item@tag.img@src", "intro": "class.des@text", "lastChapter": "class.itemtxt@tag.ul.0@tag.li.0@tag.a@text", "tocUrl": ""}, "ruleToc": {"chapterList": "id.list@tag.li@tag.a", "chapterName": "text", "chapterUrl": "href"}, "ruleContent": {"content": "@css:div.con p@text", "nextContentUrl": "@css:div.prenext a:contains(下一页)@href"}, "weight": 0},{"bookSourceComment": "1. 修复了原版搜索参数缺失/错误导致的只能搜到第一页、搜不到全本的问题；2. 保留了原版的动态获取站源、自动处理验证码、正文解密等全部核心功能。", "bookSourceGroup": "自编", "bookSourceName": "®️爱丽丝书屋（路人二次修复搜索）", "bookSourceType": 0, "bookSourceUrl": "https://www.alicesw.com（自编+修复搜索）", "bookUrlPattern": "https?:\\/\\/.*?\\..*?(xnxnxn|alice|爱丽丝|als).*?\\.[a-zA-Z]+?\\/novel\\/\\d+\\.html", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\neval(String(source.loginUrl));\nlet Cookie = cookie.getCookie(GetUL());\nif (!/lf_user_auth/.test(Cookie) && source.getLoginHeader()) {\n    let ck = source.getLoginHeaderMap()['Cookie']\n    cookie.setCookie(GetUL(), ck);\n    java.toast('登录状态掉了，已重新登陆');\n}\nvar result = [];\nvar headers = JSON.stringify({\"headers\":{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.6167.171 Safari/537.36\"}});\nvar push = (title, url, size) =>\n    result.push({\n        title: title,\n        url: url ? `{{GetUL()}}${url},` + headers : url,\n        style: {\n            layout_flexGrow: 1,\n            layout_flexBasisPercent: size\n        }\n    });\npush(`当前站源：${GetUL()}`, null, 1)\nif (source.getLoginHeader()) {\n    let jc = source.getLoginHeaderMap();\n    let inf = decodeURIComponent(jc.get(\"Cookie\"));\n    let info = decodeURIComponent(inf).match(/\\{[\\s\\S]+\\}/)[0];\n    let username = JSON.parse(info)['username'];\n    let expe = Ajax(`${GetUL()}/user/index/index.html`);\n    let ex = org.jsoup.Jsoup.parse(expe).select('.group , .user-data li');\n    push(`用户◎${username}◎中心`, null, 1);\n    push(\"书架\", \"/user/bookshelf?page={{page}}\", 0.45);\n    push(\"阅读记录\", \"/user/recentread/index.html\", 0.45);\n    ex.forEach(xp => {\n        nam = String(xp.text()).replace(/[^\\u4e00-\\u9fa5a-zA-Z0-9]/g, \"\");\n        title = /\\d/.test(nam) ? nam.replace(/(\\d+)([^\\d]+)/, \"$2：$1\") : nam.replace(/^/, \"用户等级：\");\n        push(title, null, 0.45);\n    });\n} else {\n    push(\"未登录\", null, 1);\n}\npush(\"--------书库--------\", null, 1);\npush(\"最近更新\", \"/all{{Sort_()}}.html\", 0.45);\npush(\"原创\", \"/original.html?page={{page}}\", 0.45);\npush(\"排行\", null, 1);\nvar src = Ajax(`${GetUL()}/all/order/hits+desc.html`);\nvar ph = org.jsoup.Jsoup.parse(src).select('.paihang_ds a');\nph.forEach(ta => {\n    nam = ta.text();\n    ul = ta.attr('href')\n    push(nam, ul, 0.45);\n})\npush(\"分类\", null, 1);\nvar tag = org.jsoup.Jsoup.parse(src).select('.fenlei_ds a');\ntag.forEach(ta => {\n    nam = ta.text();\n    ul = String(ta.attr('href')).replace(/$/, \"?page={{page}}\").replace(/lists/, \"all/id\").replace(/\\.html/, `{{Sort_()}}$&`);\n    push(nam, ul, 0.25);\n})\nif (source.getLoginInfoMap()?.[\"发现自定义标签🏷️（中 / 英逗号分隔）\"] != \"\") {\n\t   push(\"自定义标签🏷️\", null, 1);\n\t   let myTags = String(source.getLoginInfoMap()[\"发现自定义标签🏷️（中 / 英逗号分隔）\"]).split(/[,，]/);\n\t   myTags.forEach(tag => {\n\t   \tlet url = `/search.html?q=${tag}&f=tag&sort={{Sort_('search')}}&p={{page}}&serialize=`;\n\t   \tpush(tag, url, 0.25);\n\t   \t});\n}\nJSON.stringify(result);", "header": "{\"User-Agent\": \"Mozilla/5.0 (Android 11; Mobile; rv:147.0) Gecko/147.0 Firefox/147.0\"}", "jsLib": "function calculateChecksum(nonce, cookieString) {\n    var cpk = \"ge_ua_p\";\n    if (!cookieString || !nonce) {\n        return null;\n    }\n    var cookieValue = \"\";\n    var cookieArray = cookieString.toString().split(\";\");\n    for (var i = 0; i < cookieArray.length; i++) {\n        var cookie = cookieArray[i].trim();\n        var parts = cookie.split(\"=\");\n        if (parts.length === 2 && parts[0] === cpk) {\n            cookieValue = parts[1];\n            break;\n        }\n    }\n    if (cookieValue.length === 0) {\n        return null;\n    }\n    var sum = 12345;\n    for (var i = 0; i < cookieValue.length; i++) {\n        var char = cookieValue[i];\n        if (/^[a-zA-Z0-9]$/.test(char)) {\n            sum += cookieValue.charCodeAt(i) * (nonce + i);\n        }\n    }\n    return {\n    \t\"body\": \"sum=\" + sum + \"&nonce=\" + nonce,\n    \t\"cookieValue\": cookieValue\n    \t};\n}\n\nfunction Check_(src, cookies = null, url) {\n    const { java } = this;\n    if (!/Checking your browser/.test(src)) return src;\n    java.toast('检测到验证，正在自动处理中……');\n    let nonce = parseInt(src.match(/nonce\\s*=\\s*(\\d+)/)[1]);\n    cookies = String(cookies);\n    let data = calculateChecksum(nonce, cookies);\n    let headers = {\n        \"User-Agent\": \"Mozilla/5.0 (Android 11; Mobile; rv:140.0) Gecko/140.0 Firefox/140.0\",\n        \"Content-Type\": \"application/x-www-form-urlencoded\",\n        \"Referer\": String(this.GetUL() + \"/\"),\n        \"X-Ge-Ua-Step\": \"prev\",\n        \"Cookie\": String(\"ge_ua_p=\" + data.cookieValue)\n    };\n    let postResponse = java.post(this.GetUL(), data.body, headers);\n    let success = JSON.parse(postResponse.body()).ok;\n    java.toast(success ? '验证通过' : '验证失败，请重试！');\n    if (!success) return src;\n    return java.ajax(url);\n}\n\nfunction Sort_(t) {\n\t   const { source } = this\n    const sgvs = JSON.parse(source.getVariable())?.s || 0;\n    if (!sgvs) return t === 'search' ? 'relevance' : '';\n    const sorts = ['update_time+desc', 'hits+desc', 'word+desc'];\n    const sort = sorts[sgvs - 1];\n    if (t === 'search') {\n        return sort.replace('+', '_');\n    }\n    return '/order/' + sort;\n}\n\nfunction GetUL() {\n\tconst { source } = this;\n\tlet sourceul = JSON.parse(source.getVariable()).sourl;\n\treturn sourceul;\n}\n\nfunction timeov(times) {\n    const date = new Date(times);\n    const year = date.getFullYear();\n    const month = String(date.getMonth() + 1).padStart(2, '0');\n    const day = String(date.getDate()).padStart(2, '0');\n    const hours = String(date.getHours()).padStart(2, '0');\n    const minutes = String(date.getMinutes()).padStart(2, '0');\n    const seconds = String(date.getSeconds()).padStart(2, '0');\n    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n}\n\ncodesvg = \"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIAogICAgIHZpZXdCb3g9IjAgMCA3MDAgMjAwIiAKICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIgogICAgIHN0eWxlPSJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyI+CiAgPHJlY3Qgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0id2hpdGUiLz4KICAKICA8IS0tIOmhtumDqOagh+mimCAtLT4KICA8dGV4dCB4PSI1MCUiIHk9IjQwIiAKICAgICAgICBmb250LXNpemU9IjIwIiAKICAgICAgICBmb250LXdlaWdodD0iYm9sZCIgCiAgICAgICAgdGV4dC1hbmNob3I9Im1pZGRsZSIgCiAgICAgICAgZmlsbD0iIzAwMCI+6YCJ5oup5Y+R6YCB57G75Z6LPC90ZXh0PgogIAogIDwhLS0g6K+E6K665qih5Z2XIC0tPgogIDx0ZXh0IHg9IjI1JSIgeT0iOTAiIAogICAgICAgIGZvbnQtc2l6ZT0iMTYiIAogICAgICAgIGZvbnQtd2VpZ2h0PSJib2xkIiAKICAgICAgICB0ZXh0LWFuY2hvcj0ibWlkZGxlIiAKICAgICAgICBmaWxsPSIjMDAwIj7or4Torro8L3RleHQ+CiAgPHRleHQgeD0iMjUlIiB5PSIxMTAiIAogICAgICAgIGZvbnQtc2l6ZT0iMTQiIAogICAgICAgIGZvbnQtd2VpZ2h0PSJib2xkIiAKICAgICAgICB0ZXh0LWFuY2hvcj0ibWlkZGxlIiAKICAgICAgICBmaWxsPSIjMDAwIj4o5aGr5YaZIuivhOiuuiIpPC90ZXh0PgogIAogIDwhLS0g5Zue5aSN5qih5Z2XIC0tPgogIDx0ZXh0IHg9Ijc1JSIgeT0iOTAiIAogICAgICAgIGZvbnQtc2l6ZT0iMTYiIAogICAgICAgIGZvbnQtd2VpZ2h0PSJib2xkIiAKICAgICAgICB0ZXh0LWFuY2hvcj0ibWlkZGxlIiAKICAgICAgICBmaWxsPSIjMDAwIj7lm57lpI08L3RleHQ+CiAgPHRleHQgeD0iNzUlIiB5PSIxMTAiIAogICAgICAgIGZvbnQtc2l6ZT0iMTQiIAogICAgICAgIGZvbnQtd2VpZ2h0PSJib2xkIiAKICAgICAgICB0ZXh0LWFuY2hvcj0ibWlkZGxlIiAKICAgICAgICBmaWxsPSIjMDAwIj4o5aGr5YaZIkBpZCIpPC90ZXh0PgogIAogIDwhLS0g5bqV6YOo5L+h5oGvIC0tPgogIDx0ZXh0IHg9IjUwJSIgeT0iMTgwIiAKICAgICAgICBmb250LXNpemU9IjE0IiAKICAgICAgICBmb250LXdlaWdodD0iYm9sZCIgCiAgICAgICAgdGV4dC1hbmNob3I9Im1pZGRsZSIgCiAgICAgICAgZmlsbD0iIzAwMCI+5qW85bGCaWTnroDku4vmnIk8L3RleHQ+Cjwvc3ZnPg==\";\n\nfunction Ajax(url) {\n     const { java, cookie } = this;\n     let result = java.ajax(url);\n     result = this.Check_(result, cookie.getCookie(this.GetUL()), url);\n     return result;\n}\n\nconst SALT1 = \"B3wlP9Tzo$0RIdlvX&^sg30^0&feAox%\";\nconst SALT2 = \"Rs4qM7mGrQ6aTMr8HHvv3WikTcY&kW8R\";\n\nconst PRIVATE_KEY = [\n    \"MIIEogIBAAKCAQEAnOUiABBEw9zzOqivp4uJxTd3D5Givmwx2i+JLVdyj9iO2S1E\",\n    \"crWOaO5k6lD4fbL0MnMH+luJhO3ySm1xDZy22ruzvPHhd+Sh3nH56+hOcj1jfpBx\",\n    \"lDPlwyo2nDshY0VFr/3fonFjepp5PP+eZKYt9YWtxrVMWOc0yNH6HuRA+zwUX28W\",\n    \"RlP/4vMWi6vEYt0XLt+lTBGqyvwxPYJBYivIehGz4exC7K1bpvX8LJWVARkvEIuf\",\n    \"Y3sQHtC/BTeYoEsipfZYafTgQHJ+KAOZSq/CET0USeTt+Evfn6YcbWX577DrRyGt\",\n    \"siJjojMEG5TKdDQWmGKTQb4E2+EpTrQYaCcaowIDAQABAoIBAC8L9noWZshkxPre\",\n    \"Am43RYTB8Q3WGfsH7psCjhvukQfZZFxzWocbMiz8733j8d+ffeJy4/2K3V3jDDiN\",\n    \"QM1YJOzKREdwMLAG+xL9EnhPHNbc2azmG2jZdxhi3CVVBdoCt7biZeEMJ0xobdqA\",\n    \"vDpqKnXpNAbV7qLqEcX2UQ5aW7H6BdCgGk9HRBKXs/ll65NZmxORXLoAVg+w7Vzi\",\n    \"XaLP6+43KNXUPLz0EPndDH9VkGlMcyu6q7pWLoz6eN0fNiP4Jfl9PbV4KFlye2xo\",\n    \"4FI+Go8luM0onDL1+bKE5RJHXqfS+ow9hYzBJSz39jyNpiH7j8Hg8mMDPm0VIYtM\",\n    \"sOF/RgECgYEAzuuziQzrT74ZW27AQqMFQFLvqMmnrhR4CPg0mRq/PMHSzh+Bs+nS\",\n    \"Gib2d1ulkKIDHPOG9EWKXBOUvHOBmGro+sOS9fnfoJYeNhLmX5K1xcDJpsBOMdZv\",\n    \"euEit2i7yy+KAc26fP+SoCQEHm1mlgZG1vcfJlPDofqwRyBeKHPAkGMCgYEAwhvb\",\n    \"Fw3udE0hws92+9GYmjES8jNauBaP3hlu3lmxcnjlVqlkHbc9PkvddmCsSB/5TUCH\",\n    \"7qJRgYLo+uov40zNNavXv8cTqWvDrJxTuDFn0OSjeIvqS9kXeVHjpBP6d4CCLAZM\",\n    \"b6owfM8JtBFx9ef9ll5mwBekZDrspEXOgoCQwMECgYBujaILvFpQ7alQn5ibQcxB\",\n    \"dM5VKQCs0oTbjflUP+UjCg+eT1kWDfxSOrT+SnnoD5eINVjKVAk7br7N/QylqaE2\",\n    \"sZ1oTIu9mdckXu6064aw1HMo46AjooVHatgIlC2ZvpmGoytbM5VceEG3HA5uY4Yf\",\n    \"vkLnUGO6vFzIc7O6+zVMLwKBgFmIab0vkt6YOUtXUIWEvwPYQOnwoBaraX7Dcm0j\",\n    \"KAMqGnanuWMvgxM6ARO6MZ0vCloEuu5qdnfrfzVFUgNhCIKKGgD+fWY3K9FxZfhe\",\n    \"6Yjj/Tb8Kn0DzJ0MFZk4Ed6PKvvNh/I1qRnYkZw6M7t+X2y9bF2MSiplN4PqIv/0\",\n    \"90/BAoGAQXzOzA3q+vcA9mwKvwXrPiSscmZMekV6RBUxf1riRzTnds9uWSTKz8QM\",\n    \"LpEoNB3tKSB+4raK6xJGJ914b+jc/B7ayHDksStOLeJLV6t5+bmoKjk6qBrUjTQX\",\n    \"y8x2rsHReaJw0SbZy+4x55nYTi/0mdzomR7N27EzYtzM7iWk5w0=\",\n].join(\"\\n\");\n\nfunction getAuthHeaders(sourceId, chapterId, t) {\n    const { java } = this;\n    const signStr = SALT1 + t + sourceId + chapterId + SALT2;\n    const token = java.digestHex(signStr, \"SHA-256\");\n    return {\n        \"User-Agent\": \"Mozilla/5.0 (Android 11; Mobile; rv:147.0) Gecko/147.0 Firefox/147.0\",\n        \"x-request-timestamp\": t,\n        \"x-request-token\": token,\n        \"X-Requested-With\": \"XMLHttpRequest\"\n    };\n}\n\nfunction decryptChapter(chapterData) {\n    const { java } = this;\n    const rsa = java.createAsymmetricCrypto(\"RSA/ECB/PKCS1Padding\");\n    rsa.setPrivateKey(java.base64DecodeToByteArray(PRIVATE_KEY));\n    const AesKeyByte = java.base64DecodeToByteArray(rsa.decryptStr(chapterData.aes_key_encrypt, false));\n    const aes = java.createSymmetricCrypto(\"AES/CBC/PKCS5Padding\", AesKeyByte, java.base64DecodeToByteArray(chapterData.iv));\n    return aes.decryptStr(java.base64DecodeToByteArray(chapterData.content_encrypt));\n}\n\nfunction getContent(Data) {\n    const { java, source } = this;\n    const { source_id: sourceId, chapter_id:chapterId, t, sign} = Data;\n    const url = `${this.GetUL()}/home/chapter/info?id=${sourceId}&key=${chapterId}&t=${t}&sign=${sign}`;\n    const headers = this.getAuthHeaders(sourceId, chapterId, t);\n    const response = java.get(url, headers);\n    const json = JSON.parse(response.body());\n    if (json.code === 1) {\n        const chapter = json.data.chapter;\n        const content = this.decryptChapter(chapter);\n        return content;\n    } else {\n        return \"加载失败：\" + json.msg;\n    }\n}", "lastUpdateTime": "1793180116830", "loginCheckJs": "if (/小说被禁用或已删除/.test(result.body())) java.toast('小说被禁用或已删除！');\nlet sr = Check_(result.body(), result.headers().get('set-cookie'), result.url());\nresult = Packages.io.legado.app.help.http.StrResponse(result.url(), sr);\nresult;", "loginUi": "[   \n    {\n        \"name\": \"获取站源\",\n        \"type\": \"button\",\n        \"action\": \"Geturls()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"站源1\",\n        \"type\": \"button\",\n        \"action\": \"Puturl(0)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"站源2\",\n        \"type\": \"button\",\n        \"action\": \"Puturl(1)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"站源3\",\n        \"type\": \"button\",\n        \"action\": \"Puturl(2)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"站源4\",\n        \"type\": \"button\",\n        \"action\": \"Puturl(3)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"用户名/邮箱\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"密码\",\n        \"type\": \"password\"\n    },\n    {\n        \"name\": \"注册\",\n        \"type\": \"button\",\n        \"action\": \"reg()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"登录\",\n        \"type\": \"button\",\n        \"action\": \"Login()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"登出\",\n        \"type\": \"button\",\n        \"action\": \"out()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"信息\",\n        \"type\": \"button\",\n        \"action\": \"show()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"评论展示开 / 关\",\n        \"type\": \"button\",\n        \"action\": \"Comment()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"点击切换分类排序方式\",\n        \"type\": \"button\",\n        \"action\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"默认\",\n        \"type\": \"button\",\n        \"action\": \"Tgch(0)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"时间\",\n        \"type\": \"button\",\n        \"action\": \"Tgch(1)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"人气\",\n        \"type\": \"button\",\n        \"action\": \"Tgch(2)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"字数\",\n        \"type\": \"button\",\n        \"action\": \"Tgch(3)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"发现自定义标签🏷️（中 / 英逗号分隔）\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"◎↓网络书架↓◎\",\n        \"type\": \"button\",\n        \"action\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"书籍ID\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"添加\",\n        \"type\": \"button\",\n        \"action\": \"AFBook(true)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"移除\",\n        \"type\": \"button\",\n        \"action\": \"AFBook(false)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"跳转\",\n        \"type\": \"button\",\n        \"action\": \"BookShelf()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    }\n]", "loginUrl": "var r = {\n\t   \"z\": 0,\n    \"s\": 0,\n    \"co\": 0,\n    \"urls\": [],\n    \"sourl\": \"https://www.alicesw.com\"\n};\n\ntry {\n    let v = JSON.parse(source.getVariable());\n    if (v === null && typeof v !== 'object' && Array.isArray(v)) {\n        source.setVariable(JSON.stringify(r, null, \"\\t\"));\n        java.toast('已初始化，使用默认站源');\n    }\n} catch (err) {\n    java.log(err.message);\n    source.setVariable(JSON.stringify(r, null, \"\\t\"));\n    java.toast('已初始化，使用默认站源');\n}\n\nvar sgv = JSON.parse(source.getVariable());\nvar sg = source.get(\"list\");\nvar ul = GetUL();\n\nfunction reg() {\n    java.startBrowser(`${ul}/user/user/reg.html`, \"注册账号\");\n}\n\nfunction Comment() {\n    let sgvo = sgv.co;\n    sgv.co = sgv.co ? 0 : 1;\n    source.setVariable(JSON.stringify(sgv, null, \"\\t\"));\n    java.toast(`\\n评论区\\n【${[\"开启\", \"禁用\"][sgvo]} → ${[\"开启\", \"禁用\"][sgv.co]}】`);\n}\n\nfunction login() {}\n\nfunction Tgch(o) {\n    const sort = [\"默认\", \"更新时间\", \"人气\", \"字数\"];\n    const one_ = sgv.s;\n    const msg = (sgv.s = o, source.setVariable(JSON.stringify(sgv, null, \"\\t\")), `排序方式\\n【${sort[one_]}→${sort[o]}】`);\n    java.toast(\"\\n\" + msg);\n}\n\nfunction Geturls() {\n    sgv.urls.length = 0;\n    try {\n        const res = org.jsoup.Jsoup.parse(java.get('https://xn--vcsx64d.asw4.cc/', {}).body()).select('.container a');\n        const url1 = java.base64Decode(res[0].attr('href').match(/['\"](.*?)['\"]/)[1]);\n        sgv.urls.push(String(url1).replace(/\\/?$/, \"\"));\n        const url2 = java.base64Decode(res[1].attr('href').match(/['\"](.*?)['\"]/)[1]);\n        let src = java.get(java.connect(url2).url(), {}).body();\n        src = java.get(org.jsoup.Jsoup.parse(src).select('#redirectButton').attr('href'), {}).body();\n        const seen = new Set();\n        for (let match of src.matchAll(/u\\d+\\s*=\\s*r\\([\"'](.*?)[\"']\\)/g)) {\n            if (!seen.has(match[1])) {\n                sgv.urls.push(match[1].split('').reverse().join(''));\n                seen.add(match[1]);\n            }\n        }\n        source.setVariable(JSON.stringify(sgv, null, \"\\t\"));\n\n        if (sgv.urls.length >= 2) {\n            java.toast(`获取成功，共获取到${sgv.urls.length}个站源\\n┎┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┒\\n${sgv.urls.join('\\n')}\\n┖┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┚`);\n        } else {\n            java.toast('获取失败，请重试或检查网络状况');\n        }\n    } catch (e) {\n        java.log(e);\n        java.toast('\\n未知错误，请检查网络或更新阅读版本！');\n    }\n}\n\nfunction Puturl(e) {\n    if (!sgv.urls.length) return java.toast('\\n当前没有站源，请获取后选择');\n    if (e + 1 > sgv.urls.length) return java.toast(`暂无站源${e+1}`);\n    \n    try {\n        const stime = Date.now();\n        java.get(sgv.urls[e], {});\n        const speedtime = (Date.now() - stime) / 1000;\n        \n        sgv.sourl = sgv.urls[e];\n        sgv?.booklist?.forEach(item => {\n            item.img = item.img.replace(/https?:\\/\\/[^\\/]+/, sgv.urls[e]);\n            item.url = item.url.replace(/https?:\\/\\/[^\\/]+/, sgv.urls[e]);\n        });\n        source.setVariable(JSON.stringify(sgv, null, \"\\t\"));\n        \n        const Cookie = cookie.getCookie(sgv.urls[e]);\n        if (!/lf_user_auth/.test(Cookie) && source.getLoginHeader()) {\n            cookie.setCookie(sgv.urls[e], source.getLoginHeaderMap().get('Cookie'));\n        }\n        java.toast(`站源已设置为【站源${e + 1}】：\\n${sgv.urls[e]}\\n♦解析用时${speedtime}秒♦`);\n    } catch (err) {\n        java.log(err.message);\n        java.toast(`\\n【站源${e+1}：${sgv.urls[e]}】\\n已失效，请检查网络状况或切换其他站源`);\n    }\n}\n\nfunction Login() {\n    cookie.removeCookie(ul);\n    const na = result['用户名/邮箱'];\n    const pa = result['密码'];\n    \n    if (!na || !pa) return;\n    \n    try {\n        const phpid = java.get(`${ul}/user/user/verify.html`, {}).header(\"set-cookies\");\n        const code = java.getVerificationCode(`${ul}/user/user/verify.html`);\n        const response = java.post(`${ul}/user/user/login.html`, \n            `username=${na}&password=${pa}&code=${code}`, \n            { \"x-requested-with\": \"XMLHttpRequest\", \"Cookie\": phpid });\n        \n        const ck = cookie.mapToCookie(response.cookies());\n        const usercode = JSON.parse(response.body()).msg;\n        java.toast(usercode);\n        \n        if (ck) {\n            source.putLoginHeader(JSON.stringify({\"Cookie\": ck}));\n            cookie.replaceCookie(GetUL(), ck);\n        } else {\n            source.removeLoginHeader();\n            cookie.removeCookie(GetUL());\n        }\n    } catch (e) {\n        java.log(e);\n        java.toast('\\n登录出错，请切换其他站源重试！');\n    }\n}\n\nfunction out() {\n    source.removeLoginHeader();\n    cookie.removeCookie(GetUL());\n    java.toast(\"已退出登录状态\");\n}\n\nfunction show() {\n    const jc = source.getLoginHeaderMap();\n    let us, id, codes;\n    \n    if (jc) {\n        const info = decodeURIComponent(decodeURIComponent(jc.get(\"Cookie\")).match(/\\{[\\s\\S]+\\}/)[0]);\n        const userInfo = JSON.parse(info);\n        us = userInfo.username;\n        id = userInfo.uid;\n        codes = \"✔️已登录\";\n    } else {\n        us = id = \"无\";\n        codes = \"❌未登录\";\n    }\n    \n    java.longToast(`\\n◎用户：${us}◎\\n◎用户ID：${id}◎\\n◎登录状态：${codes}◎`);\n}\n\nfunction AFBook(ta) {\n    const info = result['书籍ID'];\n    if (!info) return java.toast(\"\\n未填入书籍id，请进书籍详情页，或者手动填写。\");\n    if (!source.getLoginHeaderMap()) return java.toast(\"未登录，请登录后使用\");\n    \n    try {\n        let url;\n        if (ta) {\n            url = `${ul}/user/bookshelf/add?novel_id=${info}`;\n        } else {\n            let src = \"\";\n            for (let page = 1;; page++) {\n                let sr = java.ajax(`${ul}/user/bookshelf/index.html?page=${page}`);\n                if (!/书架空空如也/.test(sr)) {\n                    src += sr + \"\\n\";\n                } else break;\n            }\n            \n            const booklist = src.match(/\\/novel\\/\\d+\\.html/g);\n            const dfid = src.match(/\\/user\\/bookshelf\\/del\\/id[^\"']+/g);\n            const index = booklist.findIndex(book => book.includes(info));\n            if (index === -1) return java.toast('未找到书籍');\n            url = GetUL() + dfid[index];\n        }\n        const msg = java.get(url, {\"x-requested-with\": \"XMLHttpRequest\"});\n        java.toast(JSON.parse(msg.body()).msg);\n    } catch (error) {\n    \t   java.log(error);\n        java.toast('未知错误，已打印至日志');\n    }\n}\n\nfunction BookShelf() {\n    if (source.getLoginHeaderMap()) {\n        java.startBrowser(`${ul}/user/bookshelf/`, \"书架\");\n    } else {\n        java.toast(\"未登录，请登录后再使用此功能。\");\n    }\n}", "respondTime": 10479, "ruleBookInfo": {"author": "@get:{a}", "canReName": "1", "coverUrl": "@get:{i}\n@js:let url = /^https?/.test(result) ? result : GetUL() + result;\nresult = java.connect(url).code() == 200 ? url : 'https://img.321cdn.com/img/01.png';\nresult;", "init": "<js>\nvar bookid = baseUrl.match(/novel\\/(\\d+)/)[1];\nconst bookva = book.getVariable(\"custom\");\nif (bookva && bookva != \"\") {\n    if (source.getLoginHeader()) {\n        const commenturl = `${GetUL()}/home/comment/add.html`;\n        let body = `content=${bookva}&type=novel&mid=${bookid}`;\n        try {\n            const code = String(java.getVerificationCode(`data:image/svg+xml;base64,${codesvg}`));\n            if (code == \"评论\" || /^@\\d+$/.test(code)) {\n                if (/^@\\d+$/.test(code)) {\n                    body += `&pid=${code.match(/(\\d+)/)[1]}`;\n                }\n                const headers = { \"x-requested-with\": \"XMLHttpRequest\" };\n                const response = java.post(commenturl, body, headers).body();\n                java.toast(JSON.parse(response).msg);\n            } else {\n                Packages.java.lang.Thread.sleep(40);\n                java.toast('请按图片要求填写');\n            }\n        } catch (err) {\n            java.log(err);\n        }\n    } else {\n        java.toast(\"未登录，请登录后操作\");\n    }\n    book.putCustomVariable(\"\");\n}\n\ntry {\n    sourceinfo = source.getLoginInfoMap();\n    sourceinfo['书籍ID'] = bookid;\n    if (bookid) {\n        source.putLoginInfo(JSON.stringify(sourceinfo));\n    }\n    $ = _ => String(java.getString(_));\n    img = /^https?/.test($('[property$=image]@content')) ? $('[property$=image]@content') : GetUL() + $('[property$=image]@content');\n    list = {\n        \"ID\": bookid,\n        \"img\": img,\n        \"name\": $('[property$=book_name]@content'),\n        \"author\": $('[property$=author]@content'),\n        \"info\": $('[property$=description]@content').slice(0, 45),\n        \"url\": \"legado://import/addToBookshelf?src=\" + baseUrl\n    }\n    source.put(\"list\", JSON.stringify(list));\n} catch (err) {\n    java.log(\"登录UI未初始化保存数据：\" + err);\n}\nsrc;\n</js>\n@put:{\"n\":\"[property$=book_name]@content\",\n\"a\":\"[property$=author]@content\",\n\"t\":\"class.fix@p.2:-2@text##.*[：:]\",\n\"k\":\"class.tg@a@ownText##\\n##,\",\n\"i\":\"[property$=image]@content\",\n\"l\":\"[property$=latest_chapter_name]@content\",\n\"r\":\"class.fix@p.3@text##\\\\s·\\\\s##\\n📂\",\n\"T\":\"[property$=update_time]@content\",\n\"m\":\"text.查看全部章节@href\",\n\"z\":\"class.fix@p.4@text##.*：(.*)·##$1###\",\n\"o\":\"[property$=description]@content\"}", "intro": "&nbsp;&nbsp;📖书籍ID：{{baseUrl.match(/novel\\/(\\d+)/)[1]}}\n☑当前站源：{{GetUL()}}\n🔥@get:{r}\n🏷️标签：@get:{k}\n🕰️更新时间：@get:{T}\n📜简介：\n@get:{o}\n<js>\nconst Bookid = baseUrl.match(/novel\\/(\\d+)/)[1];\nconst contul = `${GetUL()}/index.php?s=/Home/comment/lists/id/${Bookid}/type/novel/limit/5/size/12`;\nvar CommentNur = JSON.parse(source.getVariable()).co;\nvar cont = \"\";\nif (!CommentNur) {\n    var src = java.ajax(contul);\n    java.setContent(src);\n    var list = java.getElement('//script[@src=\"/public/static/jquery/jquery.min.js\"]/following-sibling::script[1]');\n    var lists = JSON.parse(String(list[0]).match(/var\\s*trre=([\\s\\S]+),page_num/)[1]);\n    cont += \"🔻评论区：\\n❗️右上角书籍变量填入评论后刷新详情页发送评论。❗️\\n\";\n    if (lists.length > 0) {\n        if (source.getLoginHeader()) {\n            let jc = source.getLoginHeaderMap();\n            let inf = decodeURIComponent(jc.get(\"Cookie\"));\n            let info = decodeURIComponent(inf).match(/\\{[\\s\\S]+\\}/)[0];\n            let myuid = JSON.parse(info)['uid'];\n            var myComments = [];\n            function collectMyComments(comment, parentPath) {\n                let floor = parentPath ? `${parentPath}-${comment.floorIndex}` : comment.floorIndex;\n                if (comment.uid === Number(myuid)) {\n                    myComments.push({\n                        id: comment.id,\n                        username: comment.user.username,\n                        group: comment.user.group,\n                        floor: `【${floor}楼】`,\n                        time: timeov(comment.create_time * 1000),\n                        content: comment.content\n                    });\n                }\n                if (comment._?.forEach) {\n                    comment._.forEach((child, index) => {\n                        child.floorIndex = index + 1;\n                        collectMyComments(child, floor);\n                    });\n                }\n            }\n            lists.forEach((c, i) => {\n                c.floorIndex = i + 1;\n                collectMyComments(c, \"\");\n            });\n            var mySection = \"=== 我的评论（共找到\" + myComments.length + \"条） ===\\n\\n\";\n            myComments.forEach(m => {\n                mySection += `┌【ID：${m.id}】| 👤${m.username} | ${m.group} | ${m.time}\\n└评论：${m.content}\\n${m.floor}\\n `;\n            });\n        } else {\n            mySection = \"\";\n        }\n        function formatComments(items, parentName) {\n            if (!items || !items.length) return '';\n            return items.map(item => {\n                let time = timeov(item.create_time * 1000);\n                let replyTag = parentName ? ` | @${parentName}` : '';\n                let content = (parentName ? 'ㅤ' : '') + item.content;\n                let username = item.user?.username || \"已注销用户\";\n                let group = item.user?.group || \"未知\";\n                let block = `${parentName ? '└' + username : username} | ${group} | ${time}${replyTag}\\n${parentName ? content.replaceAll('\\n', '\\nㅤ') : content}`;\n                if (item._ && item._.length) {\n                    block += '\\n' + formatComments(item._, username);\n                }\n                return block;\n            }).join(parentName ? '\\n' : '\\nㅤ\\n');\n        }\n        var allSection = \"=== 全部评论（共\" + lists.length + \"条） ===\\n\\n\";\n        allSection += formatComments(lists);\n        cont += mySection + \"\\n\" + allSection;\n    } else {\n        cont += \"本书暂时没有评论喔\";\n    }\n}\nresult = result + \"\\n\" + cont;\nresult;\n</js>", "kind": "@get:{t}\n@get:{k}", "lastChapter": "@get:{l}◎@get:{T}", "name": "@get:{n}", "tocUrl": "@get:{m}\n@js: GetUL() + result;", "wordCount": "@get:{z}"}, "ruleContent": {"content": "@js:\nvar url = GetUL();\nvar nn = String(cookie.getCookie(url));\nvar coks = nn.split('; ');\nvar ckk = coks.filter(item => !item.startsWith(\"lf_reader_num\")).join('; ');\ncookie.setCookie(url, ckk);\nconst chapterul = java.hexDecodeToString(src);\nfunction content() {\n    let html = java.ajax(chapterul);\n    let content = String(java.getString('.content_txt@html', html));\n    return content.includes('正在获取小说信息') ? (eval('bookdata = ' + html.match(/book\\.initial\\s*=\\s*({[\\s\\S]+?};)/)[1]),getContent(bookdata)) : content;\n}\nconst text = content().trim();\nlet retryCount = 0;\nconst maxRetries = 3;\nlet result;\nwhile (retryCount < maxRetries) {\n    if (text != \"\" && !/正在加载小说中,请稍后/.test(text)) {\n        result = text;\n        break;\n    } else {\n        retryCount++;\n        java.toast(`\\n未获取到文本，正在重试...\\n（当前第${retryCount} / ${maxRetries}次重试）`);\n        text = content();\n    }\n}\nif (retryCount === maxRetries) {\n    result = \"重试三次仍未获取到文本，请检查网络状况。\";\n}\nresult;", "imageStyle": "DEFAULT", "replaceRegex": "##\\n*{{chapter.title}}\\n*"}, "ruleExplore": {"author": ".four@text||.t4@text||a[href$=\"author\"]@text||.datainfobox@p.1@a@text", "bookList": ".novel-item||.rec_rullist > ul||.list-group-item", "bookUrl": "a[href^=\"/novel/\"]@href\n@js: GetUL() + result;", "coverUrl": "img@src\n@js: /^https?/.test(result) ? result : GetUL() + result;", "intro": ".content-txt@text", "kind": "{{@@.sev@text%%.six@text}}\n{{@@.t6@text}}\n{{@@.t5@text}}\n{{@@.mb-1@text##浏览：(.*)##$1浏览###}}\n{{@@.badges@text}}\n{{@@.datainfobox@p.0:-1@text##.*?：}}", "lastChapter": ".datainfobox@p.-2@a@text||a[href^=\"/book/\"]@text", "name": "a[href^=\"/novel/\"]@text##^\\d+?\\.|全文阅读$", "wordCount": ".five@text||.mb-1@text||.datainfobox@p.2@ownText\n@js:\nif (/search/.test(baseUrl)) result = result.split(/\\s|\\u3000/)[1].replace(/.*?：/, \"\");\nresult;"}, "ruleSearch": {"author": ".mb-1 a@text", "bookList": ".list-group-item", "bookUrl": "a@href\n@js: GetUL() + result;", "intro": ".content-txt@text", "kind": "{{@@.mb-1@text##浏览：(.*)##$1浏览###}}\n{{@@a[href$=\"tag\"]@text%%small@text##\\[|\\]}}\n###", "name": "h5 a@text##^\\d+\\.", "wordCount": ".mb-1@text\n@js:result.split(/\\s|\\u3000/)[1].replace(/.*?：/, \"\");"}, "ruleToc": {"chapterList": "class.section-list@a", "chapterName": "text", "chapterUrl": "href\n<js>\nvar url = GetUL() + result;\nresult = `data:;base64,${java.base64Encode(url)},{\"type\":\"chapter\"}`;\nresult;\n</js>", "preUpdateJs": "eval(String(source.loginUrl));\nvar sourceUL = GetUL();\nif (!String(book.bookUrl).includes(sourceUL)) {\n  book.bookUrl = String(book.bookUrl).replace(/https?:\\/\\/[^\\/]+/,sourceUL);\n  book.tocUrl = String(book.tocUrl).replace(/https?:\\/\\/[^\\/]+/,sourceUL);\n  java.toast(\"\\n检测到切换源站，已更新目录链接。\");\n  java.refreshTocUrl();\n}"}, "searchUrl": "{{eval(String(source.loginUrl));GetUL();}}/search.html?q={{java.encodeURI(key)}}&f=_all&sort={{eval(String(source.loginUrl));Sort_('search');}}&p={{page}}&serialize=", "weight": 0},{"bookSourceName": "精华书阁手机版", "bookSourceGroup": "Push99的AI助手", "bookSourceType": 0, "bookSourceUrl": "https://m.jhsssd.com", "bookSourceComment": "", "enabled": true, "enabledExplore": true, "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 12; Pixel 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36\", \"Accept-Language\": \"zh-CN,zh;q=0.9\"}", "lastUpdateTime": "1793174098814", "weight": 0, "exploreUrl": "玄幻小说::https://m.jhsssd.com/list/1_{{page}}.html\n修真小说::https://m.jhsssd.com/list/2_{{page}}.html\n都市小说::https://m.jhsssd.com/list/3_{{page}}.html\n穿越小说::https://m.jhsssd.com/list/4_{{page}}.html\n网游小说::https://m.jhsssd.com/list/5_{{page}}.html\n科幻小说::https://m.jhsssd.com/list/6_{{page}}.html\n灵异小说::https://m.jhsssd.com/list/7_{{page}}.html\n女生小说::https://m.jhsssd.com/list/8_{{page}}.html\n其它小说::https://m.jhsssd.com/list/9_{{page}}.html", "ruleExplore": {"bookList": "@css:ul.xbk", "name": "@css:#list > ul.xbk > li.tjxs > span.xsm > a@text", "bookUrl": "@css:#list > ul.xbk > li.tjxs > span.xsm > a@href", "coverUrl": "@css:#list > ul.xbk > li.tjimg > a > img@src", "author": "", "intro": "", "kind": "", "lastChapter": ""}, "searchUrl": "https://m.jhsssd.com/search.html?word={{key}},{\"headers\":{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 12; Pixel 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36\"}}", "ruleSearch": {"bookList": "@css:div.searchbook", "name": "@css:html > body > div.searchbook > div.bookinfo > h4.bookname a@text", "author": "@css:.author@text", "intro": "", "kind": "@css:.cat@text", "lastChapter": "@css:.update a@text", "bookUrl": "@css:html > body > div.searchbook > div.bookinfo > h4.bookname a@href", "coverUrl": "@css:html > body > div.searchbook > div.bookimg > a > img@src"}, "ruleBookInfo": {"name": "@css:#bqgmb_head > h1@text", "author": "@css:html > body > div.cover > div.block > div.block_txt2  > p:nth-of-type(2)@text##^作者：", "intro": "@css:html > body > div.cover > div.introh3@textNodes", "kind": "@css:html > body > div.cover > div.block > div.block_txt2  > p:nth-of-type(3)@text##^分类：", "lastChapter": "@css:html > body > div.cover > div.block > div.block_txt2  > p:nth-of-type(6)@text##^最新：", "coverUrl": "@css:html > body > div.cover > div.block > div.block_img2 > img@src", "tocUrl": ""}, "ruleToc": {"chapterList": "@css:ul.chapter:nth-of-type(2) li a", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": "@css:html > body > div.cover > div.listpage > span.right > a.onclick@href"}, "ruleContent": {"content": "@css:#nr1", "nextContentUrl": "", "replaceRegex": ""}},{"bookSourceName": "精校书屋", "bookSourceGroup": "Push99的AI助手", "bookSourceType": 0, "bookSourceUrl": "https://m.xswu.org", "bookSourceComment": "", "enabled": true, "enabledExplore": true, "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 12; Pixel 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36\", \"Accept-Language\": \"zh-CN,zh;q=0.9\"}", "lastUpdateTime": "1793174158231", "weight": 0, "exploreUrl": "玄幻修真::https://m.xswu.org/list/1/{{page}}.html\n重生穿越::https://m.xswu.org/list/2/{{page}}.html\n都市小说::https://m.xswu.org/list/3/{{page}}.html\n军史小说::https://m.xswu.org/list/4/{{page}}.html\n网游小说::https://m.xswu.org/list/5/{{page}}.html\n科幻小说::https://m.xswu.org/list/6/{{page}}.html\n灵异小说::https://m.xswu.org/list/7/{{page}}.html\n言情小说::https://m.xswu.org/list/8/{{page}}.html\n其他小说::https://m.xswu.org/list/9/{{page}}.html", "ruleExplore": {"bookList": "@css:a.list", "bookUrl": "@href", "name": "@css:h4@text", "intro": "@css:.info@text", "author": "", "kind": "", "lastChapter": "", "coverUrl": ""}, "searchUrl": "https://m.xswu.org/search.html,{\"method\":\"POST\",\"body\":{\"s\":\"{{key}}\"},\"headers\":{\"Content-Type\":\"application/x-www-form-urlencoded\",\"Referer\":\"https://m.xswu.org/search.html\",\"User-Agent\":\"Mozilla/5.0 (Linux; Android 12; Pixel 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36\"}}", "ruleSearch": {"bookList": "@css:a.list", "name": "@css:h4@text", "author": "", "intro": "@css:.info@text", "kind": "", "lastChapter": "", "bookUrl": "@href", "coverUrl": "@css:img@data-original"}, "ruleBookInfo": {"name": "@css:html > body.info_xs > div.header_info > div.xs_info.xsjs > h2.br-b-1.fs14 > a.btn_cl_2@text", "author": "@css:html > body.info_xs > div.header_info > div.xs_info.xsjs > i > a@text", "intro": "@css:html > body.info_xs > div.header_info > div.xs_info.xsjs > div.xs_introduce@text", "kind": "", "lastChapter": "", "coverUrl": "", "tocUrl": "@css:a.btn-normal@href"}, "ruleToc": {"chapterList": "@css:html > body.chapterlist_xs > div.wbj10 > div.xs_info > ul.ph_list.duaejh li a", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": ""}, "ruleContent": {"content": "@css:.content", "nextContentUrl": "", "replaceRegex": ""}, "enabledCookieJar": false},{"bookSourceName": "素书卷", "bookSourceGroup": "Push99的AI助手", "bookSourceType": 0, "bookSourceUrl": "https://www.sushujuan.org", "bookSourceComment": "", "enabled": true, "enabledExplore": true, "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\", \"Accept-Language\": \"zh-CN,zh;q=0.9\"}", "lastUpdateTime": "1793174240179", "weight": 0, "exploreUrl": "全部::https://www.sushujuan.org/sort/0/{{page}}.html\n玄幻::https://www.sushujuan.org/sort/1/{{page}}.html\n仙侠::https://www.sushujuan.org/sort/2/{{page}}.html\n都市::https://www.sushujuan.org/sort/3/{{page}}.html\n历史::https://www.sushujuan.org/sort/4/{{page}}.html\n网游::https://www.sushujuan.org/sort/5/{{page}}.html\n科幻::https://www.sushujuan.org/sort/6/{{page}}.html\n灵异::https://www.sushujuan.org/sort/7/{{page}}.html\n女频::https://www.sushujuan.org/sort/8/{{page}}.html\n其他::https://www.sushujuan.org/sort/9/{{page}}.html", "ruleExplore": {"bookList": "@css:article.qy-bcard", "name": "@css:main.qy-main > section.qy-block > div.qy-blist > article.qy-bcard > div.qy-bcard__main > a.qy-bcard__title@text", "bookUrl": "@css:main.qy-main > section.qy-block > div.qy-blist > article.qy-bcard > div.qy-bcard__main > a.qy-bcard__title@href", "author": "@css:.qy-bcard__meta a@text", "coverUrl": "@css:section.qy-block > div.qy-blist > article.qy-bcard > div.qy-bcard__cover > a.qy-cover > img.qy-cover__img@src", "intro": "", "kind": "", "lastChapter": ""}, "searchUrl": "https://www.sushujuan.org/search.html,{\"method\":\"POST\",\"body\":{\"s\":\"{{key}}\"},\"headers\":{\"Content-Type\":\"application/x-www-form-urlencoded\",\"Referer\":\"https://www.sushujuan.org/search.html\"}}", "ruleSearch": {"bookList": "@css:article.qy-bcard", "name": "@css:main.qy-main.qy-main--slim > section.qy-block > div.qy-blist > article.qy-bcard > div.qy-bcard__main > a.qy-bcard__title@text", "author": "@css:.qy-bcard__meta a@text", "intro": "", "kind": "", "lastChapter": "", "bookUrl": "@css:main.qy-main.qy-main--slim > section.qy-block > div.qy-blist > article.qy-bcard > div.qy-bcard__main > a.qy-bcard__title@href", "coverUrl": "@css:section.qy-block > div.qy-blist > article.qy-bcard > div.qy-bcard__cover > a.qy-cover > img.qy-cover__img@src"}, "ruleBookInfo": {"name": "@css:body.qy-page.qy-page-info > div.qy-shell > main.qy-main > header.qy-book > div.qy-book__info > h1.qy-book__title@text", "author": "@css:div.qy-shell > main.qy-main > header.qy-book > div.qy-book__info > p.qy-book__au > a@text", "intro": "@css:div.qy-shell > main.qy-main > header.qy-book > div.qy-book__info > div.qy-book__stats > span.qy-book__stat@text", "kind": "", "lastChapter": "", "coverUrl": "@css:div.qy-shell > main.qy-main > header.qy-book > div.qy-book__cover > a.qy-cover > img.qy-cover__img@src", "tocUrl": "@css:div.qy-shell > main.qy-main > header.qy-book > div.qy-book__info > div.qy-book__acts > a.qy-btn.qy-btn--ghost@href"}, "ruleToc": {"chapterList": "@css:html > body.qy-page.qy-page-list > div.qy-shell > main.qy-main.qy-main--slim > section.qy-block > nav.qy-chapters.qy-chapters--full a", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": ""}, "ruleContent": {"content": "@css:#novelcontent", "nextContentUrl": "", "replaceRegex": ""}, "enabledCookieJar": false},{"bookSourceComment": "//2026-10-28 新增主动弹窗验证：配额用尽（check>=3）时，书源自动通过 startBrowserAwait 弹出内置浏览器并直接打开当前章节页，用户在网页里完成滑块（必要时先登录）后关闭返回，书源自动读取验证后的登录态并重新抓取本章正文，无需手动进菜单。自动降级：若版本不支持弹窗则回退为文字指引。其余：cid 独立请求、m/www 双域名（仅网络失败切换）、优先复用应用内网页已验证的登录态、2 秒限速、登录态仅在正文为空时校验。 //目录仅保留 type=item 的真实章节，过滤卷标题(volume)与占位(more)，避免无效请求。", "bookSourceGroup": "①🔰  正版,②🌸  常用", "bookSourceName": "🔰长佩文学", "bookSourceType": 0, "bookSourceUrl": "https://webapi.gongzicp.com", "bookUrlPattern": "", "concurrentRate": "2000", "customOrder": 15, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "<js>\nvar nums = 4;\nvar separator = '::'\ndate={\"昨日\":1,\"7天\":2,\"30天\":3,\"总\":8,\"时\":9,\"本周\":4,\"本月\":5};\n\n//有一些分类没有该时间，所以显示为空，需要换时间\nd=date[\"本周\"]\n\n\nall=[\"我的书架::https://m.gongzicp.com/webapi/usercoll/getList?page=1&filter=0&sort_key=3&sort_flag=2::1\",\"全部（分类）::75::1\",\"古代::3\",\"现代::1\",\"幻想::4\",\"悬疑::6\",\"短佩::66\",\"架空::9\",\"无CP::73\",\"百合::17\",\"畅销榜::75::1::1\",\"古代::3::::1\",\"现代::1::::1\",\"幻想::4::::1\",\"悬疑::6::::1\",\"短佩::66::::1\",\"架空::9::::1\",\"无CP::73::::1\",\"百合::17::::1\",\"上架榜::75::1::2\",\"古代::3::::2\",\"现代::1::::2\",\"幻想::4::::2\",\"悬疑::6::::2\",\"短佩::66::::2\",\"架空::9::::2\",\"无CP::73::::2\",\"百合::17::::2\",\"风云榜::75::1::3\",\"古代::3::::3\",\"现代::1::::3\",\"幻想::4::::3\",\"悬疑::6::::3\",\"短佩::66::::3\",\"架空::9::::3\",\"无CP::73::::3\",\"百合::17::::3\",\"热读榜::75::1::4\",\"古代::3::::4\",\"现代::1::::4\",\"幻想::4::::4\",\"悬疑::6::::4\",\"短佩::66::::4\",\"架空::9::::4\",\"无CP::73::::4\",\"百合::17::::4\",\"完结榜::75::1::5\",\"古代::3::::5\",\"现代::1::::5\",\"幻想::4::::5\",\"悬疑::6::::5\",\"短佩::66::::5\",\"架空::9::::5\",\"无CP::73::::5\",\"百合::17::::5\",\"人气榜::75::1::6\",\"古代::3::::6\",\"现代::1::::6\",\"幻想::4::::6\",\"悬疑::6::::6\",\"短佩::66::::6\",\"架空::9::::6\",\"无CP::73::::6\",\"百合::17::::6\",\"新书榜::75::1::7\",\"古代::3::::7\",\"现代::1::::7\",\"幻想::4::::7\",\"悬疑::6::::7\",\"短佩::66::::7\",\"架空::9::::7\",\"无CP::73::::7\",\"百合::17::::7\",\"新人榜::75::1::8\",\"古代::3::::8\",\"现代::1::::8\",\"幻想::4::::8\",\"悬疑::6::::8\",\"短佩::66::::8\",\"架空::9::::8\",\"无CP::73::::8\",\"百合::17::::8\",\"萌新榜::75::1::9\",\"古代::3::::9\",\"现代::1::::9\",\"幻想::4::::9\",\"悬疑::6::::9\",\"短佩::66::::9\",\"架空::9::::9\",\"无CP::73::::9\",\"百合::17::::9\",\"赞赏榜::75::1::10\",\"古代::3::::10\",\"现代::1::::10\",\"幻想::4::::10\",\"悬疑::6::::10\",\"短佩::66::::10\",\"架空::9::::10\",\"无CP::73::::10\",\"百合::17::::10\",\"互动榜::75::1::11\",\"古代::3::::11\",\"现代::1::::11\",\"幻想::4::::11\",\"悬疑::6::::11\",\"短佩::66::::11\",\"架空::9::::11\",\"无CP::73::::11\",\"百合::17::::11\",\"勤奋榜::75::1::12\",\"古代::3::::12\",\"现代::1::::12\",\"幻想::4::::12\",\"悬疑::6::::12\",\"短佩::66::::12\",\"架空::9::::12\",\"无CP::73::::12\",\"百合::17::::12\",\"潜力榜::75::1::15\",\"古代::3::::15\",\"现代::1::::15\",\"幻想::4::::15\",\"悬疑::6::::15\",\"短佩::66::::15\",\"架空::9::::15\",\"无CP::73::::15\",\"百合::17::::15\"]\n\n\n\n//下面不要动\nfunction parse(data){\n\tlet args=data.split(separator);\n\tlet title = args[0],url=args[1],num=nums;\n\t\n\t\n\t//看看链接如何生成，不需要生成，删除下一行\n\t let u=/^\\d+/.test(url)?\"https://webapi.gongzicp.com/novel/novelGetList?page={{page}}&size=10&tid=\"+url+\"&field=0&order=-1\":url\n\t \t\n try {num = /^\\d+/.test(args[2])?args[2]:num}catch(e){}\n try {\n \td=/^5|(?:10)|(?:12)$/g.test(args[3])?date[\"本月\"]:args[3]==11?date[\"时\"]:2;\n \tu = /^\\d+/.test(args[3])?\"https://webapi.gongzicp.com/novel/rankingGetList?tid=\"+url+\"&rid=\"+args[3]+\"&date=\"+d+\"&page={{page}}\":u\n }catch(e){}\n\treturn [title, u, num]\n\t}\n\nfunction FlexBox(title, url, num){\n\t\t let obj={};\n\t\t obj.style={},obj.title=title,obj.url=url?url:'',obj.style['layout_flexGrow']=1;\n\t\n\tlet data={1:1,2:0.4,3:0.25,4:0.2,5:0.15,7:0.1,10:0.05};\nobj.style['layout_flexBasisPercent']=data[num]\n\t\treturn obj\n\t\t}\nresult=JSON.stringify(all.map(data=>{\n\tlet args=parse(data);\n\treturn FlexBox.apply(null, args)\n\t}))\n</js>", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 8.1.0; JKM-AL00b Build/HUAWEIJKM-AL00b; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044807 Mobile Safari/537.36\"\n}", "lastUpdateTime": "1793174774011", "loginCheckJs": "", "loginUi": "", "loginUrl": "https://m.gongzicp.com/", "respondTime": 220878, "ruleBookInfo": {"author": "$.author_nickname", "coverUrl": "$.novel_cover", "init": "$.data", "intro": "$.novel_info", "kind": "$.type_names&&$.novel_process&&$.novel_tag_txt", "lastChapter": "$.novel_newcname##^\\d+\\s+", "name": "$.novel_name", "tocUrl": "https://webapi.gongzicp.com/novel/chapterGetList?nid={{$.novel_id}}", "wordCount": "$.novel_wordnumber"}, "ruleContent": {"content": "@js:(function(){\nvar mm = String(baseUrl).match(/read-(\\d+)/) || String(baseUrl).match(/(\\d+)/);\nvar cid = mm ? mm[1] : \"\";\nif (!cid) return \"\";\nfunction pull(token, host) {\n  var opt = \",{\\\"headers\\\":{\\\"referer\\\":\\\"https://m.gongzicp.com/read-\" + cid + \".html\\\",\\\"token\\\":\\\"\" + token + \"\\\",\\\"client\\\":\\\"h5\\\"}}\";\n  try { return JSON.parse(String(java.ajax(\"https://\" + host + \"/webapi/novel/chapterGetInfo?cid=\" + cid + \"&server=0\" + opt))); } catch (e) { return null; }\n}\nfunction valid(token) {\n  try {\n    var u = JSON.parse(String(java.ajax(\"https://m.gongzicp.com/webapi/user/getUserInfo,{\\\"headers\\\":{\\\"token\\\":\\\"\" + token + \"\\\",\\\"client\\\":\\\"h5\\\"}}\")));\n    return String(u.code) == \"200\";\n  } catch (e) { return true; }\n}\nfunction fromWebView() {\n  try { return String(java.webView(\"\", \"https://m.gongzicp.com/\", \"sessionStorage.getItem('token') || ''\") || \"\"); } catch (e) { return \"\"; }\n}\nfunction dec(c) {\n  try { return String(java.aesBase64DecodeToString(c, \"u0LRrbu$Enm84koA\", \"AES/CBC/PKCS5Padding\", \"$h$b3!iGzsYnnshj\") || \"\"); } catch (e) { return \"\"; }\n}\nvar token = String(java.get(\"cp_token\") || \"\");\nif (!token) {\n  token = fromWebView();\n  if (token) java.put(\"cp_token\", token);\n}\nif (!token) return \"【需要登录】请在书源菜单点「登录」，在应用内网页里登录长佩账号，然后刷新本章。\";\nvar r = pull(token, \"m.gongzicp.com\");\nif (r === null) r = pull(token, \"www.gongzicp.com\");\nif (r === null) return \"【获取失败】网络异常，请检查网络后重试。\";\nif (String(r.code) == \"9996\") { java.put(\"cp_token\", \"\"); return \"【登录已失效】请重新登录长佩账号后刷新本章。\"; }\nvar ci = r.data && r.data.chapterInfo;\nif (!ci) return \"【获取失败】\" + (r.msg || \"接口无数据\");\nvar txt = \"\";\nif (ci.content && ci.content.length > 40) txt = dec(ci.content);\nvar check = parseInt(String((r.data && r.data.check) || 0)) || 0;\nif (!txt) {\n  if (ci.chapterPrice > 0) return \"【本章需订阅】\" + ci.chapterPrice + \" 玉佩（账号内未购买本章）\";\n  // 第一步：尝试应用内网页已有的（可能已验证过的）登录态\n  var t2 = fromWebView();\n  if (t2 && t2 != token && valid(t2)) {\n    var r2 = pull(t2, \"m.gongzicp.com\");\n    var ci2 = r2 && r2.data && r2.data.chapterInfo;\n    if (ci2 && ci2.content && ci2.content.length > 40) {\n      var t2t = dec(ci2.content);\n      if (t2t) { token = t2; ci = ci2; txt = t2t; java.put(\"cp_token\", t2); }\n    }\n  }\n}\nif (!txt) {\n  var loginOk = valid(token);\n  if (!loginOk) { java.put(\"cp_token\", \"\"); return \"【登录已失效】请在弹出的验证网页里登录长佩账号并完成滑块，然后刷新本章。\"; }\n  if (check < 3) return \"【正文为空】站点未下发正文（check=\" + check + \"），请几分钟后重试。\";\n  // 第二步：配额用尽，主动弹出验证网页（章节页），用户完成滑块后自动继续\n  var popupOk = true;\n  try { java.startBrowserAwait(\"https://m.gongzicp.com/read-\" + cid + \".html\", \"长佩·滑块验证\"); }\n  catch (e) { popupOk = false; }\n  var t3 = fromWebView();\n  if (!t3) t3 = token;\n  var r3 = null, ci3 = null, t3t = \"\";\n  if (valid(t3)) {\n    r3 = pull(t3, \"m.gongzicp.com\");\n    if (r3 === null) r3 = pull(t3, \"www.gongzicp.com\");\n    ci3 = r3 && r3.data && r3.data.chapterInfo;\n    if (ci3 && ci3.content && ci3.content.length > 40) t3t = dec(ci3.content);\n  }\n  if (t3t) {\n    if (t3 != token) java.put(\"cp_token\", t3);\n    ci = ci3; txt = t3t;\n  } else {\n    if (!popupOk) return \"【需要验证】当前阅读版本不支持自动弹出验证窗口。请点书源菜单「登录」，在应用内网页进入本书章节页完成滑块后刷新本章。\";\n    if (!t3 || !valid(t3)) return \"【验证未完成】请在弹出的网页里先登录长佩账号，再进入章节完成滑块验证，然后刷新本章。\";\n    return \"【验证未通过】滑块未完成或未生效，请重试本章；若多次失败请等 30-60 分钟后再试。\";\n  }\n}\ntxt = String(txt).replace(/\\r/g, \"\").replace(/\\n[ \\t\\u3000]*\\n/g, \"\\n\\n\").replace(/[ \\t\\u3000]+\\n/g, \"\\n\").replace(/\\n{3,}/g, \"\\n\\n\").replace(/^\\s+|\\s+$/g, \"\");\nif (txt.indexOf(\"<\") < 0) txt = txt.replace(/\\n/g, \"<br>\");\nif (ci.postscript) txt = txt + \"<br><br>【作者有话说】\" + ci.postscript;\nreturn txt;\n})()", "imageStyle": "0", "nextContentUrl": "", "payAction": "baseUrl", "sourceRegex": "", "webJs": ""}, "ruleExplore": {"author": "", "bookList": "", "bookUrl": "", "coverUrl": "", "intro": "", "kind": "", "lastChapter": "", "name": ""}, "ruleSearch": {"author": "$.novel_author||$.author", "bookList": "<js>\nif(/search\\/novels/.test(baseUrl)){\n\ttry{\n\t//搜索作者\nurl = \"https://m.gongzicp.com/webapi/search/novelAndAuthor?k=\"+java.get(\"key\");\n\n$ = JSON.parse(java.ajax(url));\n\nuserid = $.data.user.user_id;\n\nurl = \"https://m.gongzicp.com/webapi/zone/userGetNovelList?uid=\"+userid+\"&type=coll\";\n\naid = JSON.parse(java.ajax(url)).data.list[0].author_id;\nurl = \"https://m.gongzicp.com/webapi/zone/userGetNovelList?aid=\"+aid+\"&type=author&page=\"+java.get(\"page\");\n\nlist =JSON.parse(java.ajax(url));\na= JSON.parse(result).data.list || []\nresult = a.concat(list.data.list);\nresult = JSON.stringify(result);\n}catch(e){}\n}\n\nif(baseUrl.match(/usercoll\\/getList/)){\nresult=result.replace(/[\\s\\S]+?<pre.*?>|<\\/pre>[\\s\\S]+/g,'');\n}else{\n\tresult=result\n}\n</js>\n$.data.list||$.[*]", "bookUrl": "https://webapi.gongzicp.com/novel/novelInfo?id={{$.novel_id||$.id}}", "checkKeyWord": "七小皇叔", "coverUrl": "$.novel_cover||$.cover", "intro": "$.novel_desc##<.*?>", "kind": "$.novel_type&&$.novel_tag&&$.process", "lastChapter": "{{$.novel_uptime||$.chapter}}•{{$.uptime}}##•$", "name": "$.novel_name||$.name##<.*?>", "wordCount": "$.novel_wordnumber"}, "ruleToc": {"chapterList": "$.data.list[?(@.type == 'item')]", "chapterName": "第{{$.order}}章 {{$.name}}\n<js>\nvol = \"{{$.type}}\"==\"volume\"?\" 📖 \":\"\"\nvol+result+vol\n</js>\n##第章\\s*|第\\d+章\\s*(?=第\\d+章)", "chapterUrl": "https://m.gongzicp.com/read-{{$.id}}.html\n@js:\njava.put(\"nid\",baseUrl.match(/id=(\\d+)/)[1])\n\"{{$.type}}\"==\"volume\"?\"\":result", "formatJs": "", "isVip": "@js:\n\"{{$.pay}}\"==\"true\"?true:false", "isVolume": "<js>\n\"{{$.type}}\"==\"volume\"?true:false\n</js>", "updateTime": "{{$.public_date}}  {{$.kt_number}}字##,|^字"}, "searchUrl": "https://webapi.gongzicp.com/search/novels?k={{java.put(\"key\",key);key}}&page={{java.put(\"page\",page)}}", "weight": 0},{"bookSourceName": "笔下文学", "bookSourceGroup": "Push99的AI助手", "bookSourceType": 0, "bookSourceUrl": "https://www.hen0.com", "bookSourceComment": "", "enabled": true, "enabledExplore": true, "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\", \"Accept-Language\": \"zh-CN,zh;q=0.9\"}", "lastUpdateTime": "1793173903607", "weight": 0, "exploreUrl": "玄幻奇幻::https://www.hen0.com/sort/1-{{page}}.html\n仙侠武侠::https://www.hen0.com/sort/2-{{page}}.html\n都市言情::https://www.hen0.com/sort/3-{{page}}.html\n军事历史::https://www.hen0.com/sort/4-{{page}}.html\n网游游戏::https://www.hen0.com/sort/5-{{page}}.html\n科幻小说::https://www.hen0.com/sort/6-{{page}}.html\n灵异悬疑::https://www.hen0.com/sort/7-{{page}}.html\n穿越架空::https://www.hen0.com/sort/8-{{page}}.html\n耽美其他::https://www.hen0.com/sort/9-{{page}}.html", "ruleExplore": {"bookList": "@css:div.card", "name": "@css:.book-title a@text", "bookUrl": "@css:.book-title a@href", "author": "@css:.book-author@text##^作者[:：]?", "lastChapter": "@css:.book-update@text", "coverUrl": "@css:.col-4 img@src", "intro": "", "kind": ""}, "searchUrl": "<js>var kb=java.encodeURI(key,'gbk');var op={method:'POST',body:'searchkey='+kb,charset:'gbk',headers:{'Content-Type':'application/x-www-form-urlencoded','Referer':\"https://www.hen0.com/\"}};\"https://www.hen0.com/search.html\"+','+JSON.stringify(op)</js>", "ruleSearch": {"bookList": "@css:table tbody tr", "name": "@css:td:nth-of-type(1) a@text", "author": "@css:td:nth-of-type(2)@text", "intro": "", "kind": "", "lastChapter": "@css:td:nth-of-type(3) a@text", "bookUrl": "@css:td:nth-of-type(1) a@href", "coverUrl": ""}, "ruleBookInfo": {"name": "@css:h1.book-title@text", "author": "@css:.book-author@text##^.*?者[：:]\\s*", "intro": "@css:.book-tags@textNodes", "kind": "", "lastChapter": "@css:.book-meta a@text", "coverUrl": "@css:.book-cover-large@src", "tocUrl": ""}, "ruleToc": {"chapterList": "@css:ul.chapter-list:nth-of-type(2) li a", "chapterName": "span@text", "chapterUrl": "href", "nextTocUrl": ""}, "ruleContent": {"content": "", "nextContentUrl": "", "replaceRegex": ""}, "enabledCookieJar": false},{"bookSourceName": "错层网", "bookSourceGroup": "Push99的AI助手", "bookSourceType": 0, "bookSourceUrl": "https://www.cuoceng.org", "bookSourceComment": "", "enabled": true, "enabledExplore": true, "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\", \"Accept-Language\": \"zh-CN,zh;q=0.9\"}", "lastUpdateTime": "1793174036208", "weight": 0, "exploreUrl": "玄幻::https://www.cuoceng.org/book/ranking/6b09b233-4d99-4f8f-aeb0-f9772e107d49/3-{page}.html\n仙侠::https://www.cuoceng.org/book/ranking/c91e0ef9-ad94-480e-a629-4cbddcdd1e3f/3-{page}.html\n都市::https://www.cuoceng.org/book/ranking/951b15a8-ba9f-4fbd-9790-6df513be5343/3-{page}.html\n科幻::https://www.cuoceng.org/book/ranking/f7ba5880-1f1e-4938-adb6-ebf4b2217e24/3-{page}.html\n言情::https://www.cuoceng.org/book/ranking/ed26a15a-9704-459c-9098-532d5edb6b28/3-{page}.html\n诸天无限::https://www.cuoceng.org/book/ranking/8dcf411a-99c9-4348-a924-990474f67296/3-{page}.html\n游戏::https://www.cuoceng.org/book/ranking/5ebd2d1f-6efb-478a-b5f9-628aba9146f9/3-{page}.html\n历史::https://www.cuoceng.org/book/ranking/fa7b085f-64ff-4763-a9b9-d0f4f8b98585/3-{page}.html\n轻小说::https://www.cuoceng.org/book/ranking/b7854bea-86da-4e4e-a530-39075be915df/3-{page}.html\n奇幻::https://www.cuoceng.org/book/ranking/c19ac87c-fad1-4924-8d9f-5d0d6445a62e/3-{page}.html\n武侠::https://www.cuoceng.org/book/ranking/258cfd48-26ec-4f2d-9faa-4ffe2310dcb7/3-{page}.html\n悬疑::https://www.cuoceng.org/book/ranking/5456c937-4501-4328-b3b9-c101249539ec/3-{page}.html\n军事::https://www.cuoceng.org/book/ranking/322eb578-6830-4080-9c54-66a06869aa90/3-{page}.html\n现实::https://www.cuoceng.org/book/ranking/a1c1c751-8804-4c40-964e-85cdb6c2f8d5/3-{page}.html\n体育::https://www.cuoceng.org/book/ranking/ccf0bf05-03ae-45f3-8126-ee4670819a5c/3-{page}.html\n重生::https://www.cuoceng.org/book/ranking/c4f8bd09-5cfa-4098-b31f-a55528cda380/3-{page}.html\n穿越::https://www.cuoceng.org/book/ranking/b96517a8-4171-455f-9cff-89aea91f52d6/3-{page}.html\n点击阅读::https://www.cuoceng.org/book/ranking/8ca3f02a-91af-474d-9340-dfb7be8e7d87/3-{page}.html\n全部目录::https://www.cuoceng.org/book/ranking/39fbc944-134c-4e46-b7a0-7da3bc114031/3-{page}.html\n山河志::https://www.cuoceng.org/book/ranking/eadaecdd-c0c1-4f2d-be25-35d6961d1ec3/3-{page}.html", "ruleExplore": {"bookList": "@css:div.item", "name": "@css:html > body > div.container.mb20 > div.item > div.itemtxt > h3 a@text", "bookUrl": "@css:html > body > div.container.mb20 > div.item > div.itemtxt > h3 a@href", "coverUrl": "@css:html > body > div.container.mb20 > div.item > a > img.lazyload@data-src", "author": "", "intro": "", "kind": "", "lastChapter": ""}, "searchUrl": "https://www.cuoceng.org/book/search.html?kw={{key}}&pageNo={{page}}", "ruleSearch": {"bookList": "$.content[*]", "name": "$.bkName", "author": "$.authName", "intro": "$.bkDesc", "kind": "$.cateName", "lastChapter": "$.lastChapterName", "bookUrl": "<js>'/book/'+result.id+'.html'</js>", "coverUrl": "$.bkCover"}, "ruleBookInfo": {"name": "@css:div.main.box_center > div.channelWrap.channelBookInfo > div.bookCover.cf > div.book_info > div.tit > h1@text", "author": "@css:div.main.box_center > div.channelWrap.channelBookInfo > div.bookCover.cf > div.book_info > div.tit > a.author@text##著", "intro": "@css:body > div.main.box_center > div.channelWrap.channelBookInfo > div.bookCover.cf > div.book_info > div.intro_txt@textNodes", "kind": "@css:div.channelWrap.channelBookInfo > div.bookCover.cf > div.book_info > ul.list > li  > span.item:nth-of-type(1)@text##^类别：", "lastChapter": "", "coverUrl": "@css:body > div.main.box_center > div.channelWrap.channelBookInfo > div.bookCover.cf > a.book_cover > img.cover.lazyload@data-src", "tocUrl": "@css:a.fr@href"}, "ruleToc": {"chapterList": "@css:.dirList li a", "chapterName": "span@text", "chapterUrl": "href", "nextTocUrl": ""}, "ruleContent": {"content": "@css:#readcontent .txtwrap", "nextContentUrl": "", "replaceRegex": ""}},{"bookSourceComment": "荔枝短剧 liz04.com 视频书源 v1.4（2026-10-28 测速结果显示到线路按钮）\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n【站点】AI成人短剧站，Nuxt3 SSR。主站 liz01.com，线路 liz01~liz10.com，liz04.com 为官方「永久入口」。发布页 /road/。\n【搜索】GET /api/v1/search?keyword=&page=&size=20（服务端 JSON，真分页）\n【发现】topic 频道 + 全站排序 + 日/周/月榜 + 分类 + 标签，共 50+ 入口\n【目录】GET /api/v1/drama/{id}/episodes，一次返回全量剧集\n【播放】剧集页内联 JSON-LD contentUrl → /api/v1/cdn/(video|external)/manifest.m3u8?t=&sign=\n  · m3u8 为 AES-128，播放器自动处理\n  · 目录中「未更新」集为站点尚未放出，非书源问题\n【登录】游客可正常搜索/发现/播放。登录仅用于收藏、追剧、观看记录。\n  · 登录界面含：发布页输入框 + 从发布页获取网址 + 测速选线 + 切换线路 + 检查登录状态 + UA 设置\n【UA】已在 header 与所有 @js 请求中固定为 Chrome/Android UA，避免被 CDN 拦截\n【限频】concurrentRate=1500（1.5 秒/次），避免触发风控\n【v1.2 修复】\n  ① 封面不显示：header 的 Accept 改为图片优先（image/avif,image/webp,image/apng,image/*,*/*;q=0.8）\n    —— Glide 会复用书源 header 请求图床，text/html 开头的 Accept 可能被图床按内容协商分流\n  ② 视频不播放：ruleContent.content 改为只返回纯 URL（原来带「📺 标题」行污染了播放地址）\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n首次使用建议：书源菜单 → 登录 → 🚀从发布页获取网址 → ⚡测速选最快线路\n线路失效时：登录界面直接切换 liz01~liz10，或重新抓发布页\n【v1.3 修复：封面不显示真根因 = 图床整站 AES 加密】\n  站点所有封面都是加密图（Content-Type: application/octet-stream，无图片魔数），\n  浏览器靠 Worker 用 window.__NUXT__.config.public 的 imageAesKeyHex/imageAesIvHex\n  做 AES-128-CBC/NoPadding 解密后显示。Legado 用 coverDecodeJs 钩子同法解密：\n    · 已内置当前 key/iv（全站固定，多图取样验证）\n    · 魔数双保险：已是明文图片则原样透传\n    · key 轮换自愈：解密失败自动从首页 __NUXT__.config 重新提取 key/iv\n    · coverUrl 统一追加 ?lzcv=3 版本参数：绕过 Glide 密文磁盘缓存与 failUrl 进程黑名单\n  ⚠ 修复前浏览过的旧书封面可能仍不显示：在书籍详情刷新一下（或重新添加），\n    新 URL 带版本参数会强制重新下载+解密。\n【v1.4 登录界面：测速结果填到各线路按钮】\n  · 10 个「切 lizNN.com」按钮用 viewName 动态文本，实时显示各自测速结果\n  · 点「⚡ 测速选最快线路」后：每条线路 ms/超时/内容异常 写入按钮，最快线路加 ⚡ 前缀\n  · 切换线路后自动刷新面板，「📡 当前线路」同步更新\n", "bookSourceGroup": "视频,R18,AI", "bookSourceName": "荔枝短剧🔞", "bookSourceType": 4, "bookSourceUrl": "https://liz04.com", "bookUrlPattern": "https?://liz\\d{2}\\.com/drama/\\d+(?:-[a-z0-9\\-]+)?(?:/|$)", "concurrentRate": "1500", "coverDecodeJs": "(function(){try{var baos=new Packages.java.io.ByteArrayOutputStream();var buf=new Packages.java.lang.String('00000000000000000000000000000000').getBytes();var n=result.read(buf);while(n>0){baos.write(buf,0,n);n=result.read(buf)}var enc=baos.toByteArray();if(!enc||enc.length<8){return enc}function mg(b){var x=(b[0]+256)%256;var y=(b[1]+256)%256;var z=(b[2]+256)%256;return (x===255&&y===216)||(x===137&&y===80&&z===78)||(x===71&&y===73&&z===70)||(x===82&&y===73&&z===70)}if(mg(enc)){return enc}if(enc.length%16!==0){return enc}var Cipher=Packages.javax.crypto.Cipher;var SKS=Packages.javax.crypto.spec.SecretKeySpec;var IVS=Packages.javax.crypto.spec.IvParameterSpec;var hb=java.hexDecodeToByteArray;function dec(k,v){var c=Cipher.getInstance('AES/CBC/NoPadding');c.init(2,new SKS(hb(k),'AES'),new IVS(hb(v)));return c.doFinal(enc)}var out=dec('ea19c21e85d768da4165f5964ab886b2','f4d53ecbc273901e0d9cd7848233c702');if(mg(out)){return out}var host='https://liz04.com';try{var hs=String(source.get('lizhost')||'');if(hs.indexOf('http')===0){host=hs}}catch(e1){}var pg='';try{pg=String(java.ajax(host+'/,'+JSON.stringify({timeout:8000,headers:{'User-Agent':'Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36'}})))}catch(e2){return enc}var mk=pg.match(/imageAesKeyHex[^a-z0-9]{1,6}([0-9a-f]{32})/);var mi=pg.match(/imageAesIvHex[^a-z0-9]{1,6}([0-9a-f]{32})/);if(!mk||!mi){return enc}var out2=dec(mk[1],mi[1]);if(mg(out2)){return out2}return enc}catch(e){return null}})()", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:(function(){\nfunction LZ_base(){\n  var b='';\n  try{ b=String(source.get('lizhost')); }catch(e){}\n  if(b.length<8||b.indexOf('http')!=0) b='https://liz04.com';\n  return b.replace(/\\/+$/,'');\n}\nfunction LZ_ua(){\n  var u='';\n  try{ u=String(source.get('lizua')); }catch(e){}\n  if(u.length<20) u='Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n  return u;\n}\nfunction LZ_hdr(){\n  return {'User-Agent':LZ_ua(),'Accept':'application/json, text/plain, */*','Referer':LZ_base()+'/'};\n}\nfunction LZ_opt(){\n  return JSON.stringify({'headers':LZ_hdr()});\n}\nfunction LZ_get(u){\n  try{ return String(java.ajax(u+','+LZ_opt())); }catch(e){ return ''; }\n}\nfunction LZ_json(t){\n  if(!t) return null;\n  try{\n    var o=JSON.parse(t);\n    return (o&&typeof o==='object')?o:null;\n  }catch(e){ return null; }\n}\nfunction LZ_items(o){\n  if(!o) return [];\n  var d=o.data;\n  if(!d) return [];\n  if(d.page&&d.page.items&&d.page.items.length>=0) return d.page.items;\n  if(d.items&&d.items.length>=0) return d.items;\n  if(d.result&&d.result.page&&d.result.page.items) return d.result.page.items;\n  if(Array.isArray(d)) return d;\n  return [];\n}\nfunction LZ_tagstr(tags){\n  if(!tags||!tags.length) return '';\n  var a=[];\n  for(var i=0;i<tags.length;i++){\n    var n=tags[i]?tags[i].name:null;\n    if(n&&String(n).length>0) a.push(String(n));\n  }\n  return a.join(' ');\n}\nfunction LZ_isAbs(u){\n  return typeof u==='string'&&(u.indexOf('http://')==0||u.indexOf('https://')==0||u.indexOf('//')==0);\n}\nfunction LZ_abs(u){\n  if(!u) return '';\n  var s=String(u);\n  if(s.indexOf('//')==0) return 'https:'+s;\n  if(s.indexOf('http')==0) return s;\n  if(s.charAt(0)=='/') return LZ_base()+s;\n  return LZ_base()+'/'+s;\n}\nfunction LZ_did(u){\n  var s=String(u||'').split(',')[0];\n  var m=s.match(/\\/drama\\/([0-9]+)/);\n  return m?m[1]:'';\n}\n\nvar b=LZ_base();\nvar rows=[];\nfunction push(t,u,grow){\n  rows.push({title:t,url:u,style:(grow?{layout_flexGrow:1}:{layout_flexBasisPercent:1})});\n}\n// ---- 分组标题（空 url 的按钮 Legado 会忽略，仅作视觉分组用 title 带前缀）----\npush('📺 精选频道','');\npush('精选·最热',b+'/api/v1/topic/lizhi-picked?tab=hot&page={{page}}&size=24',1);\npush('精选·最新',b+'/api/v1/topic/lizhi-picked?tab=new&page={{page}}&size=24',1);\npush('精选·收藏',b+'/api/v1/topic/lizhi-picked?tab=fav&page={{page}}&size=24',1);\npush('精选·点赞',b+'/api/v1/topic/lizhi-picked?tab=like&page={{page}}&size=24',1);\npush('🎬 原创频道','');\npush('原创·最热',b+'/api/v1/topic/lizhi-original?tab=hot&page={{page}}&size=24',1);\npush('原创·最新',b+'/api/v1/topic/lizhi-original?tab=new&page={{page}}&size=24',1);\npush('原创·收藏',b+'/api/v1/topic/lizhi-original?tab=fav&page={{page}}&size=24',1);\npush('🔥 全站排序','');\npush('全部·最新',b+'/api/v1/drama/list?sort=latest&page={{page}}&size=24',1);\npush('全部·最热',b+'/api/v1/drama/list?sort=hot&page={{page}}&size=24',1);\npush('全部·收藏',b+'/api/v1/drama/list?sort=fav&page={{page}}&size=24',1);\npush('全部·点赞',b+'/api/v1/drama/list?sort=like&page={{page}}&size=24',1);\npush('全部·随机',b+'/api/v1/drama/list?sort=random&page={{page}}&size=24',1);\npush('🆕 近期上新','');\npush('7天内上新',b+'/api/v1/drama/list?sort=latest&publishedWithinDays=7&page={{page}}&size=24',1);\npush('14天内上新',b+'/api/v1/drama/list?sort=latest&publishedWithinDays=14&page={{page}}&size=24',1);\npush('30天内上新',b+'/api/v1/drama/list?sort=latest&publishedWithinDays=30&page={{page}}&size=24',1);\npush('🏆 排行榜','');\npush('日榜',b+'/api/v1/rank?period=day',1);\npush('周榜',b+'/api/v1/rank?period=week',1);\npush('月榜',b+'/api/v1/rank?period=month',1);\npush('📁 荔枝原创分类','');\npush('原创-都市',b+'/api/v1/drama/list?categoryId=376&page={{page}}&size=24',1);\npush('原创-情感',b+'/api/v1/drama/list?categoryId=377&page={{page}}&size=24',1);\npush('原创-古风',b+'/api/v1/drama/list?categoryId=378&page={{page}}&size=24',1);\npush('原创-玄幻',b+'/api/v1/drama/list?categoryId=379&page={{page}}&size=24',1);\npush('原创-悬疑',b+'/api/v1/drama/list?categoryId=380&page={{page}}&size=24',1);\npush('原创-漫剧',b+'/api/v1/drama/list?categoryId=381&page={{page}}&size=24',1);\npush('📂 荔枝精选分类','');\npush('精选-COS',b+'/api/v1/drama/list?categoryId=486&page={{page}}&size=24',1);\npush('精选-都市',b+'/api/v1/drama/list?categoryId=383&page={{page}}&size=24',1);\npush('精选-情感',b+'/api/v1/drama/list?categoryId=384&page={{page}}&size=24',1);\npush('精选-古风',b+'/api/v1/drama/list?categoryId=385&page={{page}}&size=24',1);\npush('精选-玄幻',b+'/api/v1/drama/list?categoryId=386&page={{page}}&size=24',1);\npush('精选-悬疑',b+'/api/v1/drama/list?categoryId=387&page={{page}}&size=24',1);\npush('精选-漫剧',b+'/api/v1/drama/list?categoryId=388&page={{page}}&size=24',1);\npush('精选-更新',b+'/api/v1/drama/list?categoryId=389&page={{page}}&size=24',1);\npush('🏷 热门标签','');\npush('都市',b+'/api/v1/drama/list?tagIds=147&page={{page}}&size=24',1);\npush('爱情',b+'/api/v1/drama/list?tagIds=156&page={{page}}&size=24',1);\npush('甜宠',b+'/api/v1/drama/list?tagIds=157&page={{page}}&size=24',1);\npush('家庭',b+'/api/v1/drama/list?tagIds=159&page={{page}}&size=24',1);\npush('古装',b+'/api/v1/drama/list?tagIds=408&page={{page}}&size=24',1);\npush('悬疑',b+'/api/v1/drama/list?tagIds=178&page={{page}}&size=24',1);\npush('乱伦',b+'/api/v1/drama/list?tagIds=112&page={{page}}&size=24',1);\npush('绿帽',b+'/api/v1/drama/list?tagIds=215&page={{page}}&size=24',1);\npush('NTR',b+'/api/v1/drama/list?tagIds=223&page={{page}}&size=24',1);\npush('人妻',b+'/api/v1/drama/list?tagIds=205&page={{page}}&size=24',1);\npush('熟女',b+'/api/v1/drama/list?tagIds=197&page={{page}}&size=24',1);\npush('校园',b+'/api/v1/drama/list?tagIds=158&page={{page}}&size=24',1);\npush('穿越',b+'/api/v1/drama/list?tagIds=404&page={{page}}&size=24',1);\npush('重生',b+'/api/v1/drama/list?tagIds=405&page={{page}}&size=24',1);\npush('复仇',b+'/api/v1/drama/list?tagIds=403&page={{page}}&size=24',1);\npush('动作',b+'/api/v1/drama/list?tagIds=152&page={{page}}&size=24',1);\npush('职场',b+'/api/v1/drama/list?tagIds=200&page={{page}}&size=24',1);\npush('奇幻',b+'/api/v1/drama/list?tagIds=181&page={{page}}&size=24',1);\npush('科幻',b+'/api/v1/drama/list?tagIds=175&page={{page}}&size=24',1);\npush('灵异',b+'/api/v1/drama/list?tagIds=180&page={{page}}&size=24',1);\npush('喜剧',b+'/api/v1/drama/list?tagIds=396&page={{page}}&size=24',1);\npush('已完结',b+'/api/v1/drama/list?tagIds=191&page={{page}}&size=24',1);\npush('本周上新',b+'/api/v1/drama/list?tagIds=189&page={{page}}&size=24',1);\npush('女性成长',b+'/api/v1/drama/list?tagIds=401&page={{page}}&size=24',1);\npush('男同',b+'/api/v1/drama/list?tagIds=406&page={{page}}&size=24',1);\npush('女同',b+'/api/v1/drama/list?tagIds=407&page={{page}}&size=24',1);\nreturn JSON.stringify(rows);})()", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36\", \"Accept\": \"image/avif,image/webp,image/apng,image/*,*/*;q=0.8\", \"Accept-Language\": \"zh-CN,zh;q=0.9\"}", "lastUpdateTime": "1793131653791", "loginCheckJs": "\n(function(){\n  try{\n    var b='https://liz04.com';\n    try{ var s=String(source.get('lizhost')||''); if(s.length>6) b=s; }catch(e){}\n    var ck='';\n    try{ ck=String(java.getCookie(b,null)||''); }catch(e2){}\n    var logged=(ck&&(ck.indexOf('token')>=0||ck.indexOf('litchi.session')>=0));\n    if(!logged){ return result; }\n    // 已登录：确保带 Authorization 头（如站点用 Bearer token）\n    try{\n      var hm=java.getHeaderMap();\n      if(hm&&ck.indexOf('token')>=0){\n        var tk=ck.match(/token=([^;]+)/);\n        if(tk&&!hm.get('Authorization')) hm.put('Authorization','Bearer '+tk[1]);\n      }\n    }catch(e3){}\n    return result;\n  }catch(e4){ return result; }\n})()\n", "loginUi": "[{\"name\": \"🌐 线路与发布页\", \"type\": \"text\"}, {\"name\": \"发布页地址\", \"type\": \"input\", \"viewName\": \"source.get('lizroad')||'https://liz04.com/road/'\", \"action\": \"LZ_saveRoad()\"}, {\"name\": \"🚀 从发布页获取网址\", \"type\": \"button\", \"action\": \"LZ_fromRoad()\"}, {\"name\": \"⚡ 测速选最快线路\", \"type\": \"button\", \"action\": \"LZ_speed()\"}, {\"name\": \"📡 当前线路\", \"type\": \"text\", \"viewName\": \"(source.get('lizhost')||'https://liz04.com')\"}, {\"name\": \"切 liz01.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https://liz01.com')\", \"viewName\": \"'切 liz01.com '+(source.get('lizsp01')||'')\"}, {\"name\": \"切 liz02.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https://liz02.com')\", \"viewName\": \"'切 liz02.com '+(source.get('lizsp02')||'')\"}, {\"name\": \"切 liz03.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https://liz03.com')\", \"viewName\": \"'切 liz03.com '+(source.get('lizsp03')||'')\"}, {\"name\": \"切 liz04.com（永久入口）\", \"type\": \"button\", \"action\": \"LZ_setLine('https://liz04.com')\", \"viewName\": \"'切 liz04.com（永久入口） '+(source.get('lizsp04')||'')\"}, {\"name\": \"切 liz05.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https://liz05.com')\", \"viewName\": \"'切 liz05.com '+(source.get('lizsp05')||'')\"}, {\"name\": \"切 liz06.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https://liz06.com')\", \"viewName\": \"'切 liz06.com '+(source.get('lizsp06')||'')\"}, {\"name\": \"切 liz07.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https://liz07.com')\", \"viewName\": \"'切 liz07.com '+(source.get('lizsp07')||'')\"}, {\"name\": \"切 liz08.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https://liz08.com')\", \"viewName\": \"'切 liz08.com '+(source.get('lizsp08')||'')\"}, {\"name\": \"切 liz09.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https://liz09.com')\", \"viewName\": \"'切 liz09.com '+(source.get('lizsp09')||'')\"}, {\"name\": \"切 liz10.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https://liz10.com')\", \"viewName\": \"'切 liz10.com '+(source.get('lizsp10')||'')\"}, {\"name\": \"🧭 账号与登录\", \"type\": \"text\"}, {\"name\": \"🔄 检查登录状态\", \"type\": \"button\", \"action\": \"LZ_checkLogin()\"}, {\"name\": \"🔑 打开登录页\", \"type\": \"button\", \"action\": \"LZ_openLogin()\"}, {\"name\": \"⚙️ 请求头 UA\", \"type\": \"text\"}, {\"name\": \"自定义 UA\", \"type\": \"input\", \"viewName\": \"source.get('lizua')||''\", \"action\": \"LZ_saveUa()\"}, {\"name\": \"💾 保存 UA\", \"type\": \"button\", \"action\": \"LZ_saveUa(source.get('lizua')||'')\"}, {\"name\": \"♻️ 恢复默认 UA\", \"type\": \"button\", \"action\": \"LZ_resetUa()\"}]", "loginUrl": "\nfunction LZ_toast(m){ try{ java.toast(String(m)); }catch(e){} }\n\n// ---------- 基础工具 ----------\nfunction LZ_base2(){\n  var b='';\n  try{ b=String(source.get('lizhost')); }catch(e){}\n  if(b.length<8||b.indexOf('http')!=0) b='https://liz04.com';\n  return b.replace(/\\/+$/,'');\n}\nfunction LZ_ua2(){\n  var u='';\n  try{ u=String(source.get('lizua')); }catch(e){}\n  if(u.length<20) u='Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n  return u;\n}\nfunction LZ_req(u,ms){\n  var t0=Date.now();\n  try{\n    var r=java.ajax(u+','+JSON.stringify({timeout:ms||8000,headers:{'User-Agent':LZ_ua2(),'Accept':'text/html,application/xhtml+xml,*/*;q=0.8'}}));\n    var dt=Date.now()-t0;\n    var s=(r==null)?'':String(r);\n    return {ok:true,ms:dt,len:s.length,html:s,url:u};\n  }catch(e){\n    return {ok:false,ms:(Date.now()-t0),len:0,html:'',err:String(e&&e.message?e.message:e),url:u};\n  }\n}\n\n// ---------- 发布页抓线路 ----------\n// /road/ 页脚与 NUXT 数据里都带 liz01~liz10.com 线路\nfunction LZ_pickDomains(html){\n  var out=[];\n  if(!html) return out;\n  var re=/https?:\\/\\/(liz\\d{2}\\.com)/g;\n  var m;\n  while((m=re.exec(html))!=null){\n    var u='https://'+m[1];\n    if(out.indexOf(u)<0) out.push(u);\n  }\n  return out;\n}\n\n// ---------- 按钮：从发布页获取网址 ----------\nfunction LZ_fromRoad(){\n  var pub=String(source.get('lizroad')||'').trim();\n  if(pub.length<6){ pub='https://liz04.com/road/'; }\n  if(pub.indexOf('http')!=0){ pub='https://'+pub.replace(/^\\/+/,''); }\n  if(pub.charAt(pub.length-1)!='/') pub=pub+'/';\n  LZ_toast('正在读取发布页：'+pub);\n  var r=LZ_req(pub,12000);\n  if(!r.ok||r.len<500){\n    LZ_toast('✖ 发布页读取失败，请检查网络或手动输入发布页地址');\n    return 'fail';\n  }\n  var ds=LZ_pickDomains(r.html);\n  if(ds.length==0){\n    LZ_toast('✖ 发布页中未解析到线路地址');\n    return 'fail';\n  }\n  // 去重 + 只保留 http/https\n  var list=[];\n  for(var i=0;i<ds.length;i++){ if(list.indexOf(ds[i])<0) list.push(ds[i]); }\n  source.put('lizlines',list.join(','));\n  LZ_toast('✔ 已从发布页获取 '+list.length+' 条线路，点「⚡ 测速选最快」自动选择');\n  return 'ok';\n}\n\n// ---------- 测速结果辅助 ----------\nfunction LZ_spKey(host){\n  var m=String(host||'').match(/liz(\\d{2})\\.com/);\n  if(m) return 'lizsp'+m[1];\n  return 'lizsp_'+String(host||'').replace(/[^a-z0-9]/gi,'').substring(0,8);\n}\nfunction LZ_spClear(){\n  for(var p=1;p<=10;p++){ try{ source.put('lizsp'+('0'+p).slice(-2),''); }catch(e){} }\n}\nfunction LZ_refresh(){\n  try{ java.reLoginView(); return true; }catch(e){}\n  try{ java.reUiView(); return true; }catch(e2){}\n  return false;\n}\n\n// ---------- 按钮：测速选最快 ----------\nfunction LZ_speed(){\n  var raw=String(source.get('lizlines')||'');\n  var list=[];\n  if(raw.length>6){\n    var a=raw.split(',');\n    for(var i=0;i<a.length;i++){\n      var s=String(a[i]||'').trim();\n      if(s.length>6){ if(s.indexOf('http')!=0) s='https://'+s; list.push(s.replace(/\\/+$/,'')); }\n    }\n  }\n  if(list.length==0){\n    list=['https://liz04.com','https://liz03.com','https://liz01.com','https://liz02.com','https://liz05.com','https://liz06.com','https://liz07.com','https://liz08.com','https://liz09.com','https://liz10.com'];\n  }\n  LZ_spClear();\n  LZ_toast('正在测速 '+list.length+' 条线路…');\n  var best=null,bestMs=999999;\n  var msg=[];\n  for(var i=0;i<list.length;i++){\n    var host=list[i];\n    var r=LZ_req(host+'/',8000);\n    var tag='';\n    if(r.ok&&r.len>2000){\n      tag=r.ms+'ms';\n      if(r.ms<bestMs){ bestMs=r.ms; best=host; }\n    }else if(r.ok){ tag='内容异常'; }\n    else{ tag='超时'; }\n    try{ source.put(LZ_spKey(host),tag); }catch(e){}\n    msg.push(host.replace('https://','')+' '+tag);\n  }\n  if(best){\n    source.put('lizhost',best);\n    try{ source.put(LZ_spKey(best),'⚡'+source.get(LZ_spKey(best))); }catch(e2){}\n    var ok=LZ_refresh();\n    LZ_toast('⚡ 最快：'+best.replace('https://','')+' '+bestMs+'ms'+(ok?'\\n结果已填到各线路按钮':'\\n请重新打开登录面板查看结果'));\n    return 'ok';\n  }\n  LZ_refresh();\n  LZ_toast('✖ 所有线路均不可达\\n'+msg.join(' / '));\n  return 'fail';\n}\n\n// ---------- 按钮：切换线路 ----------\nfunction LZ_setLine(d){\n  if(!d){ LZ_toast('✖ 线路为空'); return 'fail'; }\n  var s=String(d).trim();\n  if(s.indexOf('http')!=0) s='https://'+s;\n  s=s.replace(/\\/+$/,'');\n  source.put('lizhost',s);\n  LZ_refresh();\n  LZ_toast('✔ 已切换到 '+s);\n  return 'ok';\n}\n\n// ---------- 按钮：检查登录状态 ----------\nfunction LZ_checkLogin(){\n  var b=LZ_base2();\n  var ck='';\n  try{ ck=String(java.getCookie(b,null)||''); }catch(e){}\n  if(!ck||ck.indexOf('token')<0){\n    if(ck.indexOf('litchi.session')<0){\n      LZ_toast('ℹ 当前为游客状态（未登录）\\n搜索 / 发现 / 播放均可正常使用\\n登录仅用于收藏、追剧、观看记录同步');\n      return 'guest';\n    }\n  }\n  // 尝试拉取用户信息\n  var r=LZ_req(b+'/api/v1/user/profile',8000);\n  if(r.ok&&r.html){\n    var t=r.html;\n    if(t.indexOf('\"success\":true')>=0||t.indexOf('\"success\": true')>=0){\n      var nm=t.match(/\"(?:nickName|nickname|loginName|userName)\"\\s*:\\s*\"([^\"]*)\"/);\n      LZ_toast('✔ 已登录'+(nm?('：'+nm[1]):'')+'\\n收藏/追剧/观看记录已同步');\n      return 'ok';\n    }\n  }\n  LZ_toast('ℹ 当前为游客状态（未登录）\\n搜索 / 发现 / 播放均可正常使用\\n登录仅用于收藏、追剧、观看记录同步');\n  return 'guest';\n}\n\n// ---------- 按钮：打开登录页 ----------\nfunction LZ_openLogin(){\n  try{\n    java.startBrowser(LZ_base2()+'/user','荔枝短剧 · 登录');\n    LZ_toast('已打开登录页，登录成功后返回点「🔄 检查登录状态」');\n  }catch(e){\n    LZ_toast('✖ 无法打开浏览器：'+String(e&&e.message?e.message:e));\n  }\n}\n\n// ---------- 按钮：保存 UA ----------\nfunction LZ_saveUa(u){\n  var s=String(u||'').trim();\n  if(s.length<20){ LZ_toast('✖ UA 太短，未保存'); return 'fail'; }\n  source.put('lizua',s);\n  LZ_toast('✔ 已保存自定义 UA');\n  return 'ok';\n}\nfunction LZ_resetUa(){\n  source.put('lizua','');\n  LZ_toast('✔ 已恢复默认 UA');\n  return 'ok';\n}\n\n// ---------- 按钮：保存发布页 ----------\nfunction LZ_saveRoad(u){\n  var s=String(u||'').trim();\n  if(s.length<6){ LZ_toast('✖ 发布页地址太短，未保存'); return 'fail'; }\n  if(s.indexOf('http')!=0) s='https://'+s.replace(/^\\/+/,'');\n  if(s.charAt(s.length-1)!='/') s=s+'/';\n  source.put('lizroad',s);\n  LZ_toast('✔ 发布页已保存：'+s);\n  return 'ok';\n}\nfunction LZ_resetRoad(){\n  source.put('lizroad','');\n  LZ_toast('✔ 已恢复默认发布页 https://liz04.com/road/');\n  return 'ok';\n}\n\n// ---------- 登录动作（V1 静态协议要求） ----------\nfunction login(){ return ''; }\n", "respondTime": 180000, "ruleBookInfo": {"author": "b", "coverUrl": "g", "init": "@js:(function(){\nfunction LZ_base(){\n  var b='';\n  try{ b=String(source.get('lizhost')); }catch(e){}\n  if(b.length<8||b.indexOf('http')!=0) b='https://liz04.com';\n  return b.replace(/\\/+$/,'');\n}\nfunction LZ_ua(){\n  var u='';\n  try{ u=String(source.get('lizua')); }catch(e){}\n  if(u.length<20) u='Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n  return u;\n}\nfunction LZ_hdr(){\n  return {'User-Agent':LZ_ua(),'Accept':'application/json, text/plain, */*','Referer':LZ_base()+'/'};\n}\nfunction LZ_opt(){\n  return JSON.stringify({'headers':LZ_hdr()});\n}\nfunction LZ_get(u){\n  try{ return String(java.ajax(u+','+LZ_opt())); }catch(e){ return ''; }\n}\nfunction LZ_json(t){\n  if(!t) return null;\n  try{\n    var o=JSON.parse(t);\n    return (o&&typeof o==='object')?o:null;\n  }catch(e){ return null; }\n}\nfunction LZ_items(o){\n  if(!o) return [];\n  var d=o.data;\n  if(!d) return [];\n  if(d.page&&d.page.items&&d.page.items.length>=0) return d.page.items;\n  if(d.items&&d.items.length>=0) return d.items;\n  if(d.result&&d.result.page&&d.result.page.items) return d.result.page.items;\n  if(Array.isArray(d)) return d;\n  return [];\n}\nfunction LZ_tagstr(tags){\n  if(!tags||!tags.length) return '';\n  var a=[];\n  for(var i=0;i<tags.length;i++){\n    var n=tags[i]?tags[i].name:null;\n    if(n&&String(n).length>0) a.push(String(n));\n  }\n  return a.join(' ');\n}\nfunction LZ_isAbs(u){\n  return typeof u==='string'&&(u.indexOf('http://')==0||u.indexOf('https://')==0||u.indexOf('//')==0);\n}\nfunction LZ_abs(u){\n  if(!u) return '';\n  var s=String(u);\n  if(s.indexOf('//')==0) return 'https:'+s;\n  if(s.indexOf('http')==0) return s;\n  if(s.charAt(0)=='/') return LZ_base()+s;\n  return LZ_base()+'/'+s;\n}\nfunction LZ_cov(u){\n  var s=LZ_abs(u);\n  if(!s) return '';\n  return s+((s.indexOf('?')<0)?'?':'&')+'lzcv=3';\n}\nfunction LZ_did(u){\n  var s=String(u||'').split(',')[0];\n  var m=s.match(/\\/drama\\/([0-9]+)/);\n  return m?m[1]:'';\n}\nvar id=LZ_did(String(baseUrl||''));if(!id) return '{}';var t=LZ_get(LZ_base()+'/api/v1/drama/'+id);var o=LZ_json(t);var d=(o&&o.data)?o.data:null;if(!d) return '{}';var tags=LZ_tagstr(d.tags);var cat=String(d.categoryName||'');var kind=tags;if(cat&&kind.indexOf(cat)<0) kind=(kind?cat+' '+kind:cat);if(!kind) kind=cat;var pub=d.publishedEpisodeCount||0;var tot=d.totalEpisodes||0;var st=d.partial?'连载中':'已完结';var ex=String(d.coverProgress||'');var sc=d.score?('评分 '+d.score+' 分'):'';var head=[];if(st)head.push(st);if(ex)head.push(ex);if(sc)head.push(sc);var intro=(head.length?head.join(' · ')+String.fromCharCode(10,10):'')+String(d.description||'');return JSON.stringify({a:String(d.title||''),b:'荔枝短剧',c:kind,d:(tot?('更新至'+pub+'集 / 全'+tot+'集'):''),e:'',f:intro,g:LZ_cov(d.coverUrl),h:LZ_base()+'/api/v1/drama/'+id+'/episodes'});})()", "intro": "f", "kind": "c", "lastChapter": "e", "name": "a", "tocUrl": "h", "wordCount": "d"}, "ruleContent": {"content": "@js:(function(){\nfunction LZ_base(){\n  var b='';\n  try{ b=String(source.get('lizhost')); }catch(e){}\n  if(b.length<8||b.indexOf('http')!=0) b='https://liz04.com';\n  return b.replace(/\\/+$/,'');\n}\nfunction LZ_ua(){\n  var u='';\n  try{ u=String(source.get('lizua')); }catch(e){}\n  if(u.length<20) u='Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n  return u;\n}\nfunction LZ_hdr(){\n  return {'User-Agent':LZ_ua(),'Accept':'application/json, text/plain, */*','Referer':LZ_base()+'/'};\n}\nfunction LZ_opt(){\n  return JSON.stringify({'headers':LZ_hdr()});\n}\nfunction LZ_get(u){\n  try{ return String(java.ajax(u+','+LZ_opt())); }catch(e){ return ''; }\n}\nfunction LZ_json(t){\n  if(!t) return null;\n  try{\n    var o=JSON.parse(t);\n    return (o&&typeof o==='object')?o:null;\n  }catch(e){ return null; }\n}\nfunction LZ_items(o){\n  if(!o) return [];\n  var d=o.data;\n  if(!d) return [];\n  if(d.page&&d.page.items&&d.page.items.length>=0) return d.page.items;\n  if(d.items&&d.items.length>=0) return d.items;\n  if(d.result&&d.result.page&&d.result.page.items) return d.result.page.items;\n  if(Array.isArray(d)) return d;\n  return [];\n}\nfunction LZ_tagstr(tags){\n  if(!tags||!tags.length) return '';\n  var a=[];\n  for(var i=0;i<tags.length;i++){\n    var n=tags[i]?tags[i].name:null;\n    if(n&&String(n).length>0) a.push(String(n));\n  }\n  return a.join(' ');\n}\nfunction LZ_isAbs(u){\n  return typeof u==='string'&&(u.indexOf('http://')==0||u.indexOf('https://')==0||u.indexOf('//')==0);\n}\nfunction LZ_abs(u){\n  if(!u) return '';\n  var s=String(u);\n  if(s.indexOf('//')==0) return 'https:'+s;\n  if(s.indexOf('http')==0) return s;\n  if(s.charAt(0)=='/') return LZ_base()+s;\n  return LZ_base()+'/'+s;\n}\nfunction LZ_did(u){\n  var s=String(u||'').split(',')[0];\n  var m=s.match(/\\/drama\\/([0-9]+)/);\n  return m?m[1]:'';\n}\nvar u=String(baseUrl||'').split(',')[0];var h='';try{ h=String(java.ajax(u+','+JSON.stringify({'headers':{'User-Agent':LZ_ua(),'Accept':'text/html,application/xhtml+xml,*/*;q=0.8','Referer':LZ_base()+'/'}}))); }catch(e){ return ''; }if(!h||h.length<200) return '';var i=h.indexOf('contentUrl');if(i<0) return '';i=h.indexOf(':',i);if(i<0) return '';i=i+1;while(i<h.length&&h.charAt(i)!='\"'&&h.charAt(i)!=\"'\") i++;if(i>=h.length) return '';i=i+1;var j=i;while(j<h.length&&h.charAt(j)!='\"'&&h.charAt(j)!=\"'\") j++;if(j<=i) return '';var m=[null,h.substring(i,j)];if(!m) return '';var cu=m[1];cu=cu.replace(/\\\\u002F/g,'/');if(cu.indexOf('http')!=0){ if(cu.charAt(0)=='/') cu=LZ_base()+cu; else cu=LZ_base()+'/'+cu;}return cu;})()"}, "ruleExplore": {"author": "$.author", "bookList": "@js:(function(){\nfunction LZ_base(){\n  var b='';\n  try{ b=String(source.get('lizhost')); }catch(e){}\n  if(b.length<8||b.indexOf('http')!=0) b='https://liz04.com';\n  return b.replace(/\\/+$/,'');\n}\nfunction LZ_ua(){\n  var u='';\n  try{ u=String(source.get('lizua')); }catch(e){}\n  if(u.length<20) u='Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n  return u;\n}\nfunction LZ_hdr(){\n  return {'User-Agent':LZ_ua(),'Accept':'application/json, text/plain, */*','Referer':LZ_base()+'/'};\n}\nfunction LZ_opt(){\n  return JSON.stringify({'headers':LZ_hdr()});\n}\nfunction LZ_get(u){\n  try{ return String(java.ajax(u+','+LZ_opt())); }catch(e){ return ''; }\n}\nfunction LZ_json(t){\n  if(!t) return null;\n  try{\n    var o=JSON.parse(t);\n    return (o&&typeof o==='object')?o:null;\n  }catch(e){ return null; }\n}\nfunction LZ_items(o){\n  if(!o) return [];\n  var d=o.data;\n  if(!d) return [];\n  if(d.page&&d.page.items&&d.page.items.length>=0) return d.page.items;\n  if(d.items&&d.items.length>=0) return d.items;\n  if(d.result&&d.result.page&&d.result.page.items) return d.result.page.items;\n  if(Array.isArray(d)) return d;\n  return [];\n}\nfunction LZ_tagstr(tags){\n  if(!tags||!tags.length) return '';\n  var a=[];\n  for(var i=0;i<tags.length;i++){\n    var n=tags[i]?tags[i].name:null;\n    if(n&&String(n).length>0) a.push(String(n));\n  }\n  return a.join(' ');\n}\nfunction LZ_isAbs(u){\n  return typeof u==='string'&&(u.indexOf('http://')==0||u.indexOf('https://')==0||u.indexOf('//')==0);\n}\nfunction LZ_abs(u){\n  if(!u) return '';\n  var s=String(u);\n  if(s.indexOf('//')==0) return 'https:'+s;\n  if(s.indexOf('http')==0) return s;\n  if(s.charAt(0)=='/') return LZ_base()+s;\n  return LZ_base()+'/'+s;\n}\nfunction LZ_cov(u){\n  var s=LZ_abs(u);\n  if(!s) return '';\n  return s+((s.indexOf('?')<0)?'?':'&')+'lzcv=3';\n}\nfunction LZ_did(u){\n  var s=String(u||'').split(',')[0];\n  var m=s.match(/\\/drama\\/([0-9]+)/);\n  return m?m[1]:'';\n}\nvar raw='';try{ raw=String(result||''); }catch(e0){}if(raw.length<10){ try{ raw=String(src||''); }catch(e1){} }if(raw.length<10) return [];var o=LZ_json(raw);var isRank=false;try{ isRank=(String(baseUrl||'').indexOf('/api/v1/rank')>=0); }catch(e2){}var its=[];if(isRank){var r=o&&o.data?o.data.items:null;if(r){for(var i=0;i<r.length;i++){ if(r[i]&&r[i].drama) its.push(r[i].drama); }}}else{ its=LZ_items(o); }var out=[];for(var i=0;i<its.length;i++){var it=its[i];if(!it)continue;out.push(JSON.stringify({name:String(it.title||''),author:'荔枝短剧',kind:LZ_tagstr(it.tags),wordCount:(it.totalEpisodes?('全'+it.totalEpisodes+'集'):''),lastChapter:(it.publishedEpisodeCount?('更新至'+it.publishedEpisodeCount+'集'):''),intro:String(it.description||''),coverUrl:LZ_cov(it.coverUrl),bookUrl:LZ_base()+'/drama/'+it.id+'/'}));}return out;})()", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name", "wordCount": "$.wordCount"}, "ruleSearch": {"author": "$.author", "bookList": "@js:(function(){\nfunction LZ_base(){\n  var b='';\n  try{ b=String(source.get('lizhost')); }catch(e){}\n  if(b.length<8||b.indexOf('http')!=0) b='https://liz04.com';\n  return b.replace(/\\/+$/,'');\n}\nfunction LZ_ua(){\n  var u='';\n  try{ u=String(source.get('lizua')); }catch(e){}\n  if(u.length<20) u='Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n  return u;\n}\nfunction LZ_hdr(){\n  return {'User-Agent':LZ_ua(),'Accept':'application/json, text/plain, */*','Referer':LZ_base()+'/'};\n}\nfunction LZ_opt(){\n  return JSON.stringify({'headers':LZ_hdr()});\n}\nfunction LZ_get(u){\n  try{ return String(java.ajax(u+','+LZ_opt())); }catch(e){ return ''; }\n}\nfunction LZ_json(t){\n  if(!t) return null;\n  try{\n    var o=JSON.parse(t);\n    return (o&&typeof o==='object')?o:null;\n  }catch(e){ return null; }\n}\nfunction LZ_items(o){\n  if(!o) return [];\n  var d=o.data;\n  if(!d) return [];\n  if(d.page&&d.page.items&&d.page.items.length>=0) return d.page.items;\n  if(d.items&&d.items.length>=0) return d.items;\n  if(d.result&&d.result.page&&d.result.page.items) return d.result.page.items;\n  if(Array.isArray(d)) return d;\n  return [];\n}\nfunction LZ_tagstr(tags){\n  if(!tags||!tags.length) return '';\n  var a=[];\n  for(var i=0;i<tags.length;i++){\n    var n=tags[i]?tags[i].name:null;\n    if(n&&String(n).length>0) a.push(String(n));\n  }\n  return a.join(' ');\n}\nfunction LZ_isAbs(u){\n  return typeof u==='string'&&(u.indexOf('http://')==0||u.indexOf('https://')==0||u.indexOf('//')==0);\n}\nfunction LZ_abs(u){\n  if(!u) return '';\n  var s=String(u);\n  if(s.indexOf('//')==0) return 'https:'+s;\n  if(s.indexOf('http')==0) return s;\n  if(s.charAt(0)=='/') return LZ_base()+s;\n  return LZ_base()+'/'+s;\n}\nfunction LZ_cov(u){\n  var s=LZ_abs(u);\n  if(!s) return '';\n  return s+((s.indexOf('?')<0)?'?':'&')+'lzcv=3';\n}\nfunction LZ_did(u){\n  var s=String(u||'').split(',')[0];\n  var m=s.match(/\\/drama\\/([0-9]+)/);\n  return m?m[1]:'';\n}\nvar raw='';try{ raw=String(result||''); }catch(e0){}if(raw.length<10){ try{ raw=String(src||''); }catch(e1){} }if(raw.length<10) return [];var o=LZ_json(raw);var its=LZ_items(o);var out=[];for(var i=0;i<its.length;i++){var it=its[i];if(!it)continue;var id=it.id;out.push(JSON.stringify({name:String(it.title||''),author:'荔枝短剧',kind:LZ_tagstr(it.tags),wordCount:(it.totalEpisodes?('全'+it.totalEpisodes+'集'):''),lastChapter:(it.publishedEpisodeCount?('更新至'+it.publishedEpisodeCount+'集'):''),intro:String(it.description||''),coverUrl:LZ_cov(it.coverUrl),bookUrl:LZ_base()+'/drama/'+id+'/'}));}return out;})()", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name", "wordCount": "$.wordCount"}, "ruleToc": {"chapterList": "@js:(function(){\nfunction LZ_base(){\n  var b='';\n  try{ b=String(source.get('lizhost')); }catch(e){}\n  if(b.length<8||b.indexOf('http')!=0) b='https://liz04.com';\n  return b.replace(/\\/+$/,'');\n}\nfunction LZ_ua(){\n  var u='';\n  try{ u=String(source.get('lizua')); }catch(e){}\n  if(u.length<20) u='Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n  return u;\n}\nfunction LZ_hdr(){\n  return {'User-Agent':LZ_ua(),'Accept':'application/json, text/plain, */*','Referer':LZ_base()+'/'};\n}\nfunction LZ_opt(){\n  return JSON.stringify({'headers':LZ_hdr()});\n}\nfunction LZ_get(u){\n  try{ return String(java.ajax(u+','+LZ_opt())); }catch(e){ return ''; }\n}\nfunction LZ_json(t){\n  if(!t) return null;\n  try{\n    var o=JSON.parse(t);\n    return (o&&typeof o==='object')?o:null;\n  }catch(e){ return null; }\n}\nfunction LZ_items(o){\n  if(!o) return [];\n  var d=o.data;\n  if(!d) return [];\n  if(d.page&&d.page.items&&d.page.items.length>=0) return d.page.items;\n  if(d.items&&d.items.length>=0) return d.items;\n  if(d.result&&d.result.page&&d.result.page.items) return d.result.page.items;\n  if(Array.isArray(d)) return d;\n  return [];\n}\nfunction LZ_tagstr(tags){\n  if(!tags||!tags.length) return '';\n  var a=[];\n  for(var i=0;i<tags.length;i++){\n    var n=tags[i]?tags[i].name:null;\n    if(n&&String(n).length>0) a.push(String(n));\n  }\n  return a.join(' ');\n}\nfunction LZ_isAbs(u){\n  return typeof u==='string'&&(u.indexOf('http://')==0||u.indexOf('https://')==0||u.indexOf('//')==0);\n}\nfunction LZ_abs(u){\n  if(!u) return '';\n  var s=String(u);\n  if(s.indexOf('//')==0) return 'https:'+s;\n  if(s.indexOf('http')==0) return s;\n  if(s.charAt(0)=='/') return LZ_base()+s;\n  return LZ_base()+'/'+s;\n}\nfunction LZ_did(u){\n  var s=String(u||'').split(',')[0];\n  var m=s.match(/\\/drama\\/([0-9]+)/);\n  return m?m[1]:'';\n}\nvar u=String(baseUrl||'').split(',')[0];if(u.indexOf('/episodes')<0){ u=LZ_base()+'/api/v1/drama/'+LZ_did(u)+'/episodes,'+LZ_opt();}var t=LZ_get(u);var o=LZ_json(t);var its=(o&&Array.isArray(o.data))?o.data:[];var out=[];for(var i=0;i<its.length;i++){var e=its[i];if(!e)continue;var no=e.epNo||(i+1);var ok=(e.available===true&&e.episodeId!=null);var nm=String(e.title||('第'+no+'集'));if(!ok) nm=nm+'（未更新）';out.push(JSON.stringify({name:nm,url:LZ_base()+'/drama/'+LZ_did(u)+'/ep-'+no+'/',isVip:(ok?false:true)}));}return out;})()", "chapterName": "$.name", "chapterUrl": "$.url", "isVip": "$.isVip"}, "searchUrl": "@js:(function(){\nfunction LZ_base(){\n  var b='';\n  try{ b=String(source.get('lizhost')); }catch(e){}\n  if(b.length<8||b.indexOf('http')!=0) b='https://liz04.com';\n  return b.replace(/\\/+$/,'');\n}\nfunction LZ_ua(){\n  var u='';\n  try{ u=String(source.get('lizua')); }catch(e){}\n  if(u.length<20) u='Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36';\n  return u;\n}\nfunction LZ_hdr(){\n  return {'User-Agent':LZ_ua(),'Accept':'application/json, text/plain, */*','Referer':LZ_base()+'/'};\n}\nfunction LZ_opt(){\n  return JSON.stringify({'headers':LZ_hdr()});\n}\nfunction LZ_get(u){\n  try{ return String(java.ajax(u+','+LZ_opt())); }catch(e){ return ''; }\n}\nfunction LZ_json(t){\n  if(!t) return null;\n  try{\n    var o=JSON.parse(t);\n    return (o&&typeof o==='object')?o:null;\n  }catch(e){ return null; }\n}\nfunction LZ_items(o){\n  if(!o) return [];\n  var d=o.data;\n  if(!d) return [];\n  if(d.page&&d.page.items&&d.page.items.length>=0) return d.page.items;\n  if(d.items&&d.items.length>=0) return d.items;\n  if(d.result&&d.result.page&&d.result.page.items) return d.result.page.items;\n  if(Array.isArray(d)) return d;\n  return [];\n}\nfunction LZ_tagstr(tags){\n  if(!tags||!tags.length) return '';\n  var a=[];\n  for(var i=0;i<tags.length;i++){\n    var n=tags[i]?tags[i].name:null;\n    if(n&&String(n).length>0) a.push(String(n));\n  }\n  return a.join(' ');\n}\nfunction LZ_isAbs(u){\n  return typeof u==='string'&&(u.indexOf('http://')==0||u.indexOf('https://')==0||u.indexOf('//')==0);\n}\nfunction LZ_abs(u){\n  if(!u) return '';\n  var s=String(u);\n  if(s.indexOf('//')==0) return 'https:'+s;\n  if(s.indexOf('http')==0) return s;\n  if(s.charAt(0)=='/') return LZ_base()+s;\n  return LZ_base()+'/'+s;\n}\nfunction LZ_did(u){\n  var s=String(u||'').split(',')[0];\n  var m=s.match(/\\/drama\\/([0-9]+)/);\n  return m?m[1]:'';\n}\nvar b=LZ_base();var kw='';try{kw=String(key);}catch(e){}var pg=1;try{pg=Math.max(1,parseInt(page,10)||1);}catch(e2){}return b+'/api/v1/search?keyword='+encodeURIComponent(kw)+'&page='+pg+'&size=20,'+LZ_opt();})()", "weight": 0},{"bookSourceComment": "// 正文改为书源内自行 AES 解密（不再依赖网页脚本执行时机），分页取 xlink 并做页码校验", "bookSourceGroup": "小说 书源", "bookSourceName": "宵夜小说", "bookSourceType": 0, "bookSourceUrl": "https://www.texasreadyblog.net", "bookUrlPattern": "https://www.800txt.org/book_\\d+/", "customOrder": 865, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "                               排行榜                              \n总排行榜::/remen/allvisit/{{page}}/ \n月排行榜::/remen/monthvisit/{{page}}/\n周排行榜::/remen/weekvisit/{{page}}/\n日排行榜::/remen/dayvisit/{{page}}/\n  收藏榜  ::/remen/goodnum/{{page}}/\n  字数榜  ::/remen/words/{{page}}/\n  推荐榜  ::/remen/allvote/{{page}}/\n  新书榜  ::/remen/postdate/{{page}}/\n  更新榜  ::/remen/lastupdate/{{page}}/                                              \n                                全  本                               \n高辣小说::/qb/gaola/{{page}}/\n言情小说::/qb/yanqing/{{page}}/\n耽美小说::/qb/danmei/{{page}}/\n都市小说::/qb/dushi/{{page}}/\n玄幻小说::/qb/xuanhuan/{{page}}/\n修仙小说::/qb/xiuxian/{{page}}/\n其他类型::/qb/qita/{{page}}/\n                                分  类                               \n高辣小说::/lei/gaola/{{page}}/\n言情小说::/lei/yanqing/{{page}}/\n耽美小说::/lei/danmei/{{page}}/\n都市小说::/lei/dushi/{{page}}/\n玄幻小说::/lei/xuanhuan/{{page}}/\n修仙小说::/lei/xiuxian/{{page}}/\n其他类型::/lei/qita/{{page}}/", "header": "{\n    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',\"Cookie\":\"0\",\"Origin\":\"https://www.texasreadyblog.net\",\"Referer\":\"https://www.texasreadyblog.net/\"\n}", "lastUpdateTime": 1732906261214, "loginUrl": "", "respondTime": 181421, "ruleBookInfo": {"author": ".caption-bookinfo@p.0@a@title", "coverUrl": ".thumbnail@href", "init": "", "intro": "", "kind": ".caption-bookinfo@span@textNodes", "lastChapter": "p[class^=lastchapter-]@a@title||p[^lastchapter-]@a@title", "name": "h1@text", "tocUrl": ".bookmore@a.1@href", "wordCount": ""}, "ruleContent": {"content": "@js:\nvar SBOX = [], INV = [];\nvar gm = function (a, b) {\n    var p = 0, i, h;\n    a &= 255; b &= 255;\n    for (i = 0; i < 8; i++) { if (b & 1) p ^= a; h = a & 128; a = (a << 1) & 255; if (h) a ^= 27; b >>= 1; }\n    return p & 255;\n};\nvar rl = function (x, n) { return ((x << n) | (x >> (8 - n))) & 255; };\n(function () {\n    var a, v, inv;\n    for (a = 0; a < 256; a++) {\n        inv = 0;\n        if (a) { for (v = 1; v < 256; v++) { if (gm(a, v) === 1) { inv = v; break; } } }\n        SBOX[a] = (inv ^ rl(inv, 1) ^ rl(inv, 2) ^ rl(inv, 3) ^ rl(inv, 4) ^ 99) & 255;\n    }\n    for (a = 0; a < 256; a++) INV[SBOX[a]] = a;\n})();\nvar expandKey = function (key) {\n    var w = [], i, j, t, rcon = 1;\n    for (i = 0; i < 4; i++) w[i] = [key[4 * i], key[4 * i + 1], key[4 * i + 2], key[4 * i + 3]];\n    for (i = 4; i < 44; i++) {\n        t = w[i - 1].slice();\n        if (i % 4 === 0) {\n            t = [t[1], t[2], t[3], t[0]];\n            t = [SBOX[t[0]], SBOX[t[1]], SBOX[t[2]], SBOX[t[3]]];\n            t[0] ^= rcon;\n            rcon = gm(rcon, 2);\n        }\n        w[i] = [];\n        for (j = 0; j < 4; j++) w[i][j] = w[i - 4][j] ^ t[j];\n    }\n    return w;\n};\nvar addRK = function (s, w, r) {\n    var c, rr, k;\n    for (c = 0; c < 4; c++) { k = w[r * 4 + c]; for (rr = 0; rr < 4; rr++) s[rr + 4 * c] ^= k[rr]; }\n};\nvar invShiftRows = function (s) {\n    var t = s.slice(), r, c;\n    for (r = 1; r < 4; r++) for (c = 0; c < 4; c++) s[r + 4 * c] = t[r + 4 * ((c - r + 4) % 4)];\n};\nvar invSubBytes = function (s) { for (var i = 0; i < 16; i++) s[i] = INV[s[i]]; };\nvar invMixColumns = function (s) {\n    var c, a0, a1, a2, a3;\n    for (c = 0; c < 4; c++) {\n        a0 = s[4 * c]; a1 = s[4 * c + 1]; a2 = s[4 * c + 2]; a3 = s[4 * c + 3];\n        s[4 * c] = gm(a0, 14) ^ gm(a1, 11) ^ gm(a2, 13) ^ gm(a3, 9);\n        s[4 * c + 1] = gm(a0, 9) ^ gm(a1, 14) ^ gm(a2, 11) ^ gm(a3, 13);\n        s[4 * c + 2] = gm(a0, 13) ^ gm(a1, 9) ^ gm(a2, 14) ^ gm(a3, 11);\n        s[4 * c + 3] = gm(a0, 11) ^ gm(a1, 13) ^ gm(a2, 9) ^ gm(a3, 14);\n    }\n};\nvar decBlock = function (blk, w) {\n    var s = blk.slice(), r;\n    addRK(s, w, 10);\n    for (r = 9; r >= 1; r--) { invShiftRows(s); invSubBytes(s); addRK(s, w, r); invMixColumns(s); }\n    invShiftRows(s); invSubBytes(s); addRK(s, w, 0);\n    return s;\n};\nvar aesDec = function (data, keyBytes, ivBytes) {\n    var w = expandKey(keyBytes), out = [], off, i, prev = ivBytes.slice(), s;\n    for (off = 0; off + 16 <= data.length; off += 16) {\n        s = decBlock(data.slice(off, off + 16), w);\n        for (i = 0; i < 16; i++) out.push(s[i] ^ prev[i]);\n        prev = data.slice(off, off + 16);\n    }\n    return out;\n};\nvar b64 = function (s) {\n    var cs = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n    var out = [], i, c, v, buf = 0, bits = 0;\n    s = String(s);\n    for (i = 0; i < s.length; i++) {\n        c = s.charAt(i);\n        if (c === \"=\") break;\n        v = cs.indexOf(c);\n        if (v < 0) continue;\n        buf = ((buf << 6) | v) & 0xffffff;\n        bits += 6;\n        if (bits >= 8) { bits -= 8; out.push((buf >> bits) & 255); }\n    }\n    return out;\n};\nvar u8 = function (b) {\n    var out = \"\", i = 0, x, y, z, q, cp;\n    while (i < b.length) {\n        x = b[i++];\n        if (x < 0x80) out += String.fromCharCode(x);\n        else if (x < 0xe0) { y = b[i++]; out += String.fromCharCode(((x & 31) << 6) | (y & 63)); }\n        else if (x < 0xf0) { y = b[i++]; z = b[i++]; out += String.fromCharCode(((x & 15) << 12) | ((y & 63) << 6) | (z & 63)); }\n        else {\n            y = b[i++]; z = b[i++]; q = b[i++];\n            cp = ((((x & 7) << 18) | ((y & 63) << 12) | ((z & 63) << 6) | (q & 63)) - 0x10000);\n            out += String.fromCharCode(0xd800 + (cp >> 10), 0xdc00 + (cp & 1023));\n        }\n    }\n    return out;\n};\nvar s = String(src);\nvar m = s.match(/booktxthtml'\\)\\.html\\(x\\(\\s*\"([^\"]+)\"\\s*,\\s*\"([^\"]+)\"\\s*,\\s*\"([^\"]+)\"\\s*\\)\\)/);\nvar h = \"\";\nif (m) {\n    var un = function (v) {\n        return String(v).replace(/\\\\u([0-9a-fA-F]{4})/g, function (a, b) { return String.fromCharCode(parseInt(b, 16)); }).split('\\\\/').join('/');\n    };\n    var data = b64(un(m[1]));\n    var key = un(m[2]), kb = [], i2;\n    for (i2 = 0; i2 < key.length; i2++) kb.push(key.charCodeAt(i2) & 255);\n    var raw = aesDec(data, kb, b64(un(m[3])));\n    var e = raw.length;\n    while (e > 0 && raw[e - 1] === 0) e--;\n    h = u8(raw.slice(0, e));\n}\nif (h.length < 20) {\n    var q = s.match(/<div id=\"booktxthtml\">([\\s\\S]*?)<\\/div>/);\n    h = q ? q[1] : \"\";\n}\nh = h.split(String.fromCharCode(0)).join(\"\").replace(/<script[\\s\\S]*?<\\/script>/gi, \"\").replace(/<br\\s*\\/?>/gi, \"\\n\").replace(/<\\/p>/gi, \"\\n\").replace(/<\\/div>/gi, \"\\n\").replace(/<[^>]+>/g, \"\");\nh = h.split(\"\\r\").join(\"\").split(\"&nbsp;\").join(\" \").split(\"&lt;\").join(\"<\").split(\"&gt;\").join(\">\").split(\"&quot;\").join(\"\\\"\").split(\"&#39;\").join(\"'\").split(\"&amp;\").join(\"&\");\nresult = h.replace(/[ \\t]+/g, \" \").replace(/\\n{3,}/g, \"\\n\\n\").replace(/^\\s+|\\s+$/g, \"\");", "nextContentUrl": "@js:\nvar t=src.match(/<title>[^<]*?\\((\\d+)\\s*\\/\\s*(\\d+)\\)/);\nvar pg=t?parseInt(t[1]):0;\nvar tot=t?parseInt(t[2]):0;\nvar x=(src.match(/xlink\\s*=\\s*'([^']*)'/)||[])[1]||'';\nx=x.split('\\\\/').join('/');\nvar cur=String(baseUrl).replace(/,\\s*\\{[\\s\\S]*\\}$/,'').split('?')[0];\nvar curName=cur.substring(cur.lastIndexOf('/')+1);\nvar curBase=curName.replace(/_\\d+\\.html?$/i,'').replace(/\\.html?$/i,'');\nvar xName=x.substring(x.lastIndexOf('/')+1);\nvar xBase=xName.replace(/_\\d+\\.html?$/i,'').replace(/\\.html?$/i,'');\nvar xPage=(xName.match(/_(\\d+)\\.html?$/i)||[])[1];\nvar origin=(String(baseUrl).match(/^https?:\\/\\/[^\\/]+/)||[''])[0];\nif(x&&xBase==curBase&&!(tot>0&&pg>=tot)&&!(xPage&&pg>0&&parseInt(xPage)!=pg+1)){result=(/^https?:\\/\\//i.test(x)?x:origin+x)}else{result=''}", "replaceRegex": "##.*{{book.name}}.*|.*{{book.author}}.*|.*{{chapter.title}}.*|本章未完.*|更多内容加载中.*|本站只支持手机浏览器访问.*|章节内容加载失败.*"}, "ruleExplore": {"author": "", "bookList": "", "bookUrl": "", "coverUrl": "", "intro": "", "name": ""}, "ruleSearch": {"author": ".author@text", "bookList": ".book-coverlist", "bookUrl": "h4@a@href", "coverUrl": "img@src", "intro": ".intro@text", "kind": ".status .label@text", "lastChapter": "", "name": "h4@a@title"}, "ruleToc": {"chapterList": ".panel-chapterlist@dd@a", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": "option@value||text.下一页@href"}, "searchUrl": "@js:\nvar su=source.getKey()\nvar htmlUrl=java.get(su,{}).headers('Location')\njava.log(`重定向：${htmlUrl[0]}`)\nvar posturl=htmlUrl[0]?htmlUrl[0]:(su.includes(\"#\")?su.match(/([^\\#]+)\\#/)[1]:su)\nposturl = posturl.slice(-1)=='/'?posturl.slice(0,-1):posturl\ncookie.removeCookie(posturl)\njava.log(`请求：${posturl}`)\n\nck=cookie.getCookie(posturl);\n\ncookie.setCookie(posturl,String(ck).replace(/search_delay=.*/,\"\"));\n\nso=posturl+\"/search,\"+JSON.stringify({\n  \"body\": \"searchkey=\"+key,\n  \"method\": \"POST\"\n});\njava.put(\"url\",String(so))\nso", "weight": 0},{"bookSourceComment": "版本: 20261028\n作者: 知秋\n反馈群：766236637\ntg群：https://t.me/+dcNnFFZv5KtmYjIx\n书旗api密码加群或者tg拿，免费！\n书旗源，免费看全部。正文以及正文评论走服务器，不要无止境的下载，不然就要加限制了", "bookSourceGroup": "api,shuqi", "bookSourceName": "书旗小说（知秋）", "bookSourceType": 0, "bookSourceUrl": "https://ocean.shuqireader.com", "concurrentRate": "1000", "customButton": false, "customOrder": -2, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nsort=[];\npush=(title,url,type1,type2)=>sort.push({\n\t\ttitle: title,\n\t\turl: url,\n\t\tstyle: {\n\t\t\t\tlayout_flexGrow: type1,\n\t\t\t\tlayout_flexBasisPercent: type2\n\t\t\t}\n\t});\n\t\n   \n\t\t\n\t\tfunction category(groupKey) {\t\t\t\t\t\t\t\n\t\t\t params = \"groupKey=\"+groupKey+\"&source=1\";\n    path = \"/api/bcsbizai/category/column/allitems\";\n    url = GetUrl(path, params);\t\t\t\n     return  JSON.parse(java.ajax(url)).data.items; \t\t\n\t\t}\n\n\nconst categorizedData = (i) => {\n  return category(i).reduce((acc, curr) => {\n    const { itemKey, itemSubType, itemName, itemId } = curr;    \n    const originalKey = itemSubType.includes(itemKey) ? itemKey : itemSubType;\n   iTag = itemKey == \"TAG\"?\"tagIds\":itemSubType.includes(\"SECOND\")?\"secondCategoryId\":\"firstCategoryId\";\n    \n    // 键名映射规则\n    const keyMap = {\n      \"CATEGORY\": \"分类\",\n      \"MAIN_LINE\": \"题材\",\n      \"PLOT\": \"情节\",\n      \"ROLE\": \"角色\",\n      \"STYLE\": \"风格\"\n    };\n    // 应用映射后的键名\n    const categoryKey = keyMap[originalKey] || originalKey;\n    \n    // 检查分类是否已经存在\n    let category = acc.find(item => item[0] === categoryKey);\n    // 如果分类不存在，创建新的分类项\n    if (category) {\n      category[1].push([itemName, itemId, iTag]);\n    } else {\n      acc.push([categoryKey, [[itemName, itemId, iTag]]]);\n    }\n    return acc;\n  }, []);\n};\n\t\t\n\t\tcategoryList = (i) =>{\n \t categoryList = categorizedData(i).map([title,list]=>{\t\t\t\n\t\t   push(title, null, 1, 1);\n\t\t   \n\t   list.map(([title,itemId, iTag],index)=>{\t\t\n\t   url = `@js:\n       params = \"curPage=\"+page+\"&pageSize=10&${iTag}=${itemId}\";\n       \n       path = \"/api/bcsbizai/xapi/categoryAndTag/books/h5\";\n       url = GetUrl(path, params);`;\n\t\t\t\tif(index +1<= list.length - list.length%3)\n\t\t\t {\tpush(title, url, 1, 0.25);}\n\t\t\t\telse{ push(title, url, 0, 0.29);}\n\t\t\t\t});\n\t});\n\treturn categoryList;\n} \t   \n\t\t\n\t\t\n\t\teval(String(source.loginUrl));\n\t\tlogin();\n  var v = source.getVariable();\n  var obj = JSON.parse(v)[0].fl[0];\n  var keys = Object.keys(obj);\n\t\tkeys.forEach(key => {\n\t\t\t\tname = key;\n\t\t  \ttype = obj[key]});\n\t push(name, null, 1, 1);\n   categoryList(type);\n\nJSON.stringify(sort);", "header": "{\n  \"accept\": \"application/json, text/plain, */*\",\n  \"user-agent\": \"Mozilla/5.0 (Linux; Android 9; Pixel 4 Build/PQ3A.190801.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/81.0.4044.117 Mobile Safari/537.36\",\n  \"content-type\": \"application/x-www-form-urlencoded\",\n  \"origin\": \"https://t.shuqi.com\",\n  \"x-requested-with\": \"mark.via.gp\",\n  \"sec-fetch-site\": \"cross-site\",\n  \"sec-fetch-mode\": \"cors\",\n  \"sec-fetch-dest\": \"empty\",\n  \"accept-language\": \"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7\"\n}", "jsLib": "let timeoffset = 2 * 60 * 60 * 1000;\n\nfunction sortedStr(str, i) {\t\n \t  let obj = {};\n    let arr = String(str).split('&');\n    arr.forEach(item => {\n        let [key, value] = item.split('=');\n        obj[key] = value;\n      });\n     var result = Object.keys(obj).sort();\n    if(/platform=0/.test(str)){\n     result = result\n     .map(key=>key + \"=\" + obj[key]).join(\"&\");\n    }else{\n     \tresult = result\n     \t.map(key=> obj[key]).join(\"\");\n    }    \n      return result\n}\n\nfunction Token() {\t\n \t  const { java, source } = this;\n    let origin = \"https://t.shuqi.com\";  \t \n   \tvar token = java.get(origin,{}).cookies()\n    .toString().match(/shuqi_token=([^,]*)/)[1];\n    var head = {\n    \t\t\"authorization\": \"Bearer \"+token\n    \t}; \t\n    token = source.putLoginHeader(\n    \tJSON.stringify(head));\n      return token\n}\n\nfunction GetUrl(path, params, sourceUrl) {\n \t  const { java, source } = this;\n \t  let sourceUrl = sourceUrl || \"https://ocean.shuqireader.com\";\n    var v = source.getVariable();\n    try{\n    var userId = JSON.parse(v)[0].uid[0].userId;\n  }catch(e){\n  \t  var userId = '12345678';\n  \t}\n      \n    var t = Date.now();\n    var time = ~~(t / 1e3);\n         \n    var gateway = \"sq_h5_gateway\";\n    var params0 = \"sqSv=1.0\";\n   \t var params1 = `user_id=${userId}&timestamp=${time}`;\n   \t \n   \t \n   \t \n   \t if (/info/.test(path)) {\n   \t  var skey = \"37e81a9d8f02596e1b895d07c171d5c9\";\n   \t  var params = params1 + \"&\" + params;\t  \n   \t  var sign = java.md5Encode(sortedStr(params) + skey);    \n     var body = params + \"&platform=0&needFreeStack=1&sign=\" + sign;\n   \t  \n   \t}else{\n    \t\tvar skey = \"eefc4798f28ea41622487ad80ef7e81c\";\n    \t\tvar params = params0 + \"&\" + params1 + \"&platform=0&\" + params;\n   \t  var sign = java.md5Encode(sortedStr(params) + \"&skey=\" + skey );\n   \t var body = params + \"&key=\" + gateway + \"&sign=\" + sign;\n   \n   \t\t}\n     \n   if (source.getLoginHeaderMap() == null) {\n   \t    \tthis.Token();\n   }\n  \n   var url = sourceUrl + path + \",\" + JSON.stringify({\n  \"body\": body,\n  \"method\": \"POST\"\n});\n\n   return url;\n}\n\n// SQ_COMMENT_API_V1_BEGIN\nvar SQ_COMMENT_API_BASE = \"https://sq.vv9v.cn\";\nvar _sqRenderExtKey = \"\";\nvar _sqRenderExtValue = null;\nvar _sqMetaMapCache = null;\nvar _sqShortMapCache = null;\n\nfunction sqSource() {\n    try { if (this && this.source) return this.source; } catch(e) {}\n    try { if (typeof source !== \"undefined\") return source; } catch(e2) {}\n    return null;\n}\n\nfunction sqJava() {\n    try { if (this && this.java) return this.java; } catch(e) {}\n    try { if (typeof java !== \"undefined\") return java; } catch(e2) {}\n    return null;\n}\n\nfunction sqLoginValue(key, defaultValue) {\n    try {\n        var s = sqSource.call(this);\n        var map = s && s.getLoginInfoMap ? s.getLoginInfoMap() : null;\n        var value = map && (map.get ? map.get(key) : map[key]);\n        if (value !== null && value !== undefined && String(value).trim() !== \"\") return String(value);\n    } catch(e) {}\n    return defaultValue == null ? \"\" : String(defaultValue);\n}\n\nfunction sqToggle(key, defaultValue) {\n    var value = sqLoginValue.call(this, key, \"\");\n    if (!value) return !!defaultValue;\n    value = String(value).trim().toLowerCase();\n    return value === \"✅\" || value === \"1\" || value === \"true\" || value === \"开\" || value === \"开启\";\n}\n\nfunction sqCommentConfig() {\n    var style = sqLoginValue.call(this, \"◎ 模板\", \"起点\");\n    var templateKey = String(style).replace(\"样式\", \"◎ 气泡\");\n    return {\n        paragraph: sqToggle.call(this, \"段评开关\", false),\n        chapter: sqToggle.call(this, \"章评开关\", false),\n        color: sqLoginValue.call(this, \"段评气泡颜色\", \"#666666\"),\n        colorSplit: sqToggle.call(this, \"段评分色\", false),\n        splitColor: sqLoginValue.call(this, \"分色气泡颜色\", \"#e23b3b\"),\n        splitCount: Number(sqLoginValue.call(this, \"分色评论数\", \"45\")) || 45,\n        hotColor: sqLoginValue.call(this, \"热门气泡颜色\", \"#f06060\"),\n        theme: sqLoginValue.call(this, \"评论主题\", \"自动\"),\n        height: sqLoginValue.call(this, \"评论窗口高度\", \"80\"),\n        bubbleStyle: style,\n        bubbleSize: sqLoginValue.call(this, \"◎ 大小\", \"text\"),\n        bubbleTemplate: sqLoginValue.call(this, templateKey, \"\")\n    };\n}\n\nfunction sqApiKey() {\n    return sqLoginValue.call(this, \"书旗apikey\", \"\") || sqLoginValue.call(this, \"书旗评论 API Key\", \"\");\n}\n\nfunction sqPost(path, body) {\n    var j = sqJava.call(this);\n    if (!j) return { ok: false, error: \"java unavailable\" };\n    var apiKey = sqApiKey.call(this);\n    if (!apiKey) return { ok: false, error: \"请先在登录页填写书旗apikey\" };\n    var payload = body || {};\n    payload.apiKey = apiKey;\n    var option = {\n        method: \"POST\",\n        body: JSON.stringify(payload),\n        headers: { \"Content-Type\": \"application/json\", \"Accept\": \"application/json\" }\n    };\n    try {\n        var raw = j.ajax(SQ_COMMENT_API_BASE + path + \",\" + JSON.stringify(option));\n        var text = String(raw || \"{}\").replace(/^\\uFEFF/, \"\").trim();\n        return JSON.parse(text || \"{}\");\n    } catch(e) {\n        try { j.log(\"书旗评论接口请求失败 \" + path + \": \" + e); } catch(_) {}\n        return { ok: false, error: String(e) };\n    }\n}\n\nfunction sqList(value) {\n    if (!value) return [];\n    if (Array.isArray(value)) return value;\n    if (value.size && value.get) {\n        var result = [];\n        for (var i = 0; i < value.size(); i++) result.push(value.get(i));\n        return result;\n    }\n    return [];\n}\n\nfunction sqRenderExt(bookId, chapterId) {\n    var key = String(bookId || \"\") + \":\" + String(chapterId || \"\");\n    if (key && key === _sqRenderExtKey && _sqRenderExtValue) return _sqRenderExtValue;\n    var response = sqPost.call(this, \"/v1/reader/render-ext\", {\n        bookId: String(bookId || \"\"),\n        chapterId: String(chapterId || \"\")\n    });\n    if (response && response.ok) {\n        _sqRenderExtKey = key;\n        _sqRenderExtValue = response;\n    }\n    return response || { ok: false };\n}\n\nfunction sqParagraphList(response) {\n    try {\n        var outer = response && response.data || {};\n        var data = outer.data || outer.Data || {};\n        var ext = data.bookChapterExtInfo || data.BookChapterExtInfo || {};\n        return sqList(ext.paragraphList || ext.ParagraphList);\n    } catch(e) {\n        return [];\n    }\n}\n\nfunction sqCommentList(response) {\n    try {\n        var outer = response && response.data || {};\n        var data = outer.data || outer.Data || {};\n        return sqList(data.commentList || data.CommentList);\n    } catch(e) {\n        return [];\n    }\n}\n\nfunction sqReadMap(key, cacheName) {\n    if (cacheName === \"meta\" && _sqMetaMapCache !== null) return _sqMetaMapCache;\n    if (cacheName === \"short\" && _sqShortMapCache !== null) return _sqShortMapCache;\n    var map = {};\n    try {\n        var j = sqJava.call(this);\n        var raw = j && j.get ? j.get(key) : \"\";\n        if (raw) map = JSON.parse(String(raw)) || {};\n    } catch(e) { map = {}; }\n    if (cacheName === \"meta\") _sqMetaMapCache = map;\n    if (cacheName === \"short\") _sqShortMapCache = map;\n    return map;\n}\n\nfunction sqLookupChapterMap(map, url) {\n    map = map || {};\n    var raw = String(url || \"\");\n    var optionAt = raw.lastIndexOf(\",{\");\n    if (optionAt > 0) raw = raw.substring(0, optionAt);\n    var candidates = [raw];\n    var queryAt = raw.indexOf(\"?\");\n    if (queryAt >= 0) candidates.push(raw.substring(queryAt));\n    var count = candidates.length;\n    for (var i = 0; i < count; i++) {\n        candidates.push(candidates[i].replace(/0$/, \"1\"));\n        candidates.push(candidates[i].replace(/1$/, \"0\"));\n    }\n    for (var j = 0; j < candidates.length; j++) {\n        if (Object.prototype.hasOwnProperty.call(map, candidates[j])) return map[candidates[j]];\n    }\n    return null;\n}\n\nfunction sqGetShortMap(ctx) {\n    return sqReadMap.call(ctx || this, \"sqShortMap\", \"short\");\n}\n\nfunction sqLookupMap(map, base) {\n    var value = sqLookupChapterMap(map, base);\n    return value == null ? \"\" : String(value);\n}\n\nfunction sqGetChapterMeta(url) {\n    var raw = String(url || \"\");\n    try {\n        var bidMatch = raw.match(/[#&?]sqBid=([^&#]+)/);\n        var cidMatch = raw.match(/[#&?]sqCid=([^&#]+)/);\n        if (bidMatch && cidMatch) {\n            return {\n                bookId: decodeURIComponent(bidMatch[1]),\n                chapterId: decodeURIComponent(cidMatch[1])\n            };\n        }\n    } catch(eHash) {}\n    var value = sqLookupChapterMap(sqReadMap.call(this, \"sqMetaMap\", \"meta\"), raw);\n    if (!value) return null;\n    if (typeof value === \"string\") {\n        try { value = JSON.parse(value); } catch(e) { return null; }\n    }\n    return value && value.bookId && value.chapterId ? value : null;\n}\n\nfunction sqGetChapterShortUrl(url) {\n    var value = sqLookupChapterMap(sqReadMap.call(this, \"sqShortMap\", \"short\"), url);\n    return value == null ? \"\" : String(value);\n}\n\nfunction sqSafeJs(value) {\n    return String(value == null ? \"\" : value)\n        .replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\").replace(/[\\r\\n]+/g, \"\");\n}\n\nfunction sqQuoteText(value) {\n    var text = String(value == null ? \"\" : value)\n        .replace(/<br\\s*\\/?>(?=.)/gi, \"\\n\")\n        .replace(/<img\\b[^>]*>/gi, \"\")\n        .replace(/<[^>]+>/g, \"\")\n        .replace(/&nbsp;/gi, \" \")\n        .replace(/&amp;/gi, \"&\")\n        .replace(/&quot;/gi, '\"')\n        .replace(/&#39;/gi, \"'\")\n        .replace(/&lt;/gi, \"<\")\n        .replace(/&gt;/gi, \">\")\n        .replace(/[\\s\\u00a0\\u3000]+/g, \" \")\n        .trim();\n    if (text.length > 160) text = text.slice(0, 160) + \"…\";\n    return text;\n}\nfunction sqBubbleData(count, bookId, chapterId, paragraphId, hot, kind, paraText) {\n    var j = sqJava.call(this);\n    var number = Number(count) || 0;\n    if (!j || !j.base64Encode || number <= 0) return \"\";\n    var cfg = sqCommentConfig.call(this);\n    var color = cfg.color;\n    if (cfg.colorSplit) {\n        if (hot) color = cfg.hotColor;\n        else if (number >= cfg.splitCount) color = cfg.splitColor;\n    }\n    if (!/^#[0-9a-fA-F]{6}$/.test(color)) color = \"#666666\";\n    var displayText = number > 999 ? \"999\" : String(number);\n    var font = \"Arial\";\n    var template = String(cfg.bubbleTemplate || \"\").trim();\n    var svg;\n    if (cfg.bubbleStyle !== \"起点\" && template.indexOf(\"<svg\") >= 0) {\n        svg = template\n            .replace(/\\$\\{qpyscolor\\}/g, color)\n            .replace(/\\$\\{qpwzcolor\\}/g, color)\n            .replace(/\\$\\{font\\}/g, font)\n            .replace(/\\$\\{displayText\\}/g, displayText);\n    } else {\n        svg = '<svg viewBox=\"5 14 45 36\" xmlns=\"http://www.w3.org/2000/svg\" width=\"180\" height=\"144\">' +\n            '<path d=\"M44 48 Q48 48 48 44 L48 20 Q48 16 44 16 L20 16 Q16 16 16 20 L16 24 S16 28 10 30 Q6 32 10 34 Q16 36 16 38 L16 44 Q16 48 20 48 Z\" fill=\"none\" stroke=\"' + color + '\" stroke-width=\"0.7\"/>' +\n            '<text x=\"32\" y=\"38\" text-anchor=\"middle\" font-family=\"' + font + '\" font-weight=\"600\" font-size=\"18\" fill=\"' + color + '\" dominant-baseline=\"middle\">' + displayText + '</text>' +\n            '</svg>';\n    }\n    var click;\n    if (kind === \"chapter\") {\n        click = \"showSqChapterComments('\" + sqSafeJs(bookId) + \"','\" + sqSafeJs(chapterId) + \"','\" + sqSafeJs(paragraphId) + \"','\" + sqSafeJs(sqQuoteText(paraText)) + \"')\";\n    } else {\n        click = \"showSqComments('\" + sqSafeJs(bookId) + \"','\" + sqSafeJs(chapterId) + \"','\" + sqSafeJs(paragraphId) + \"','\" + sqSafeJs(sqQuoteText(paraText)) + \"')\";\n    }\n    return \"data:image/svg+xml;base64,\" + j.base64Encode(svg) + \",\" + JSON.stringify({\n        style: cfg.bubbleSize === \"TEXT\" ? \"TEXT\" : \"text\",\n        type: \"sq\",\n        click: click\n    });\n}\n\nfunction sqBubbleImage(count, bookId, chapterId, paragraphId, hot, paraText) {\n    var data = sqBubbleData.call(this, count, bookId, chapterId, paragraphId, hot, \"paragraph\", paraText);\n    return data ? '<img src=\"' + data.replace(/\"/g, \"&quot;\") + '\">' : \"\";\n}\n\nfunction sqDecorateContent(content, bookId, chapterId, chapterTitle) {\n    var cfg = sqCommentConfig.call(this);\n    var sourceRef = sqSource.call(this);\n    var titleKey = \"sq_title_bubble_\" + String(chapterId || \"\");\n    function saveTitle(value) {\n        try { if (sourceRef && sourceRef.put && chapterId) sourceRef.put(titleKey, String(value || \"\")); } catch(e) {}\n    }\n    if ((!cfg.paragraph && !cfg.chapter) || !bookId || !chapterId) {\n        saveTitle(\"\");\n        return content;\n    }\n\n    var response = sqRenderExt.call(this, bookId, chapterId);\n    var paragraphs = sqParagraphList(response);\n    if (!paragraphs.length) {\n        saveTitle(\"\");\n        return content;\n    }\n\n    var titleItem = null;\n    var bodyItems = [];\n    for (var p = 0; p < paragraphs.length; p++) {\n        var item = paragraphs[p] || {};\n        var order = Number(item.orderId !== undefined ? item.orderId : item.OrderId);\n        var count = Number(item.commentCount || item.CommentCount || 0);\n        if (count <= 0) continue;\n        if (order === 0) titleItem = item;\n        else if (order > 0) bodyItems.push(item);\n    }\n\n    if (cfg.chapter && titleItem) {\n        var titleCount = Number(titleItem.commentCount || titleItem.CommentCount || 0);\n        var titlePid = titleItem.paragraphId || titleItem.ParagraphId || \"p000\";\n        var titleText = String(titleItem.text || titleItem.Text || titleItem.summaryText || titleItem.SummaryText || chapterTitle || \"\");\n        saveTitle(sqBubbleData.call(this, titleCount, bookId, chapterId, titlePid, !!(titleItem.isHotParagraph || titleItem.IsHotParagraph), \"chapter\", titleText));\n    } else {\n        saveTitle(\"\");\n    }\n    if (!cfg.paragraph) return content;\n\n    var pieces = String(content || \"\").split(/(<br\\s*\\/?>)/i);\n    var textIndexes = [];\n    for (var i = 0; i < pieces.length; i++) {\n        if (!/^<br\\s*\\/?>$/i.test(pieces[i]) && String(pieces[i]).trim()) textIndexes.push(i);\n    }\n    for (var b = 0; b < bodyItems.length; b++) {\n        var bodyItem = bodyItems[b] || {};\n        var bodyOrder = Number(bodyItem.orderId !== undefined ? bodyItem.orderId : bodyItem.OrderId);\n        var bodyCount = Number(bodyItem.commentCount || bodyItem.CommentCount || 0);\n        var bodyPid = bodyItem.paragraphId || bodyItem.ParagraphId || (\"p\" + String(bodyOrder));\n        var target = textIndexes[bodyOrder - 1];\n        if (target !== undefined) {\n            var bodyText = String(bodyItem.text || bodyItem.Text || bodyItem.summaryText || bodyItem.SummaryText || pieces[target] || \"\");\n            pieces[target] += sqBubbleImage.call(this, bodyCount, bookId, chapterId, bodyPid, !!(bodyItem.isHotParagraph || bodyItem.IsHotParagraph), bodyText);\n        }\n    }\n    return pieces.join(\"\");\n}\n\nfunction sqEscapeHtml(value) {\n    return String(value == null ? \"\" : value)\n        .replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\")\n        .replace(/\"/g, \"&quot;\").replace(/'/g, \"&#39;\");\n}\n\nfunction sqRichText(comment) {\n    var raw = String(comment && (comment.richText || comment.text) || \"\");\n    var images = [];\n    raw = raw.replace(/<img\\b[^>]*>/gi, function(tag) {\n        var match = tag.match(/src=[\"'](data:image\\/(?:webp|png|gif);base64,[A-Za-z0-9+/=]+)[\"']/i);\n        if (!match) return \"\";\n        var token = \"__SQ_EMOJI_\" + images.length + \"__\";\n        images.push('<img class=\"emoji\" src=\"' + match[1] + '\" alt=\"\">');\n        return token;\n    });\n    raw = sqEscapeHtml(raw).replace(/\\r?\\n/g, \"<br>\");\n    for (var i = 0; i < images.length; i++) raw = raw.replace(\"__SQ_EMOJI_\" + i + \"__\", images[i]);\n    return raw;\n}\n\nfunction sqFormatTime(value) {\n    var time = Number(value || 0);\n    if (!time) return \"\";\n    try { return sqJava.call(this).timeFormatUTC(time, \"yyyy-MM-dd HH:mm\", 28800000); } catch(e) { return \"\"; }\n}\n\nfunction sqReplyHtml(reply) {\n    var name = sqEscapeHtml(reply && reply.nickname || \"书友\");\n    var target = reply && reply.repliedUserNickname ? \" 回复 \" + sqEscapeHtml(reply.repliedUserNickname) : \"\";\n    return '<div class=\"reply\"><b>' + name + '</b>' + target + '：' + sqRichText(reply) + '</div>';\n}\n\nvar _sqReplyDomSeq = 0;\nfunction sqCommentCard(comment) {\n    comment = comment || {};\n    var avatar = String(comment.userPhoto || \"\");\n    var replyData = comment.replies || {};\n    var replies = sqList(replyData.commentList);\n    var replyHtml = \"\";\n    for (var i = 0; i < replies.length; i++) replyHtml += sqReplyHtml(replies[i]);\n    var badges = comment.isAuthor ? '<span class=\"badge\">作者</span>' : \"\";\n    if (comment.fanCard && comment.fanCard.levelName) badges += '<span class=\"badge muted\">' + sqEscapeHtml(comment.fanCard.levelName) + '</span>';\n\n    var replyNum = Number(comment.replyNum || 0);\n    var nextIndex = replyData.nextItemIndex;\n    var hasMore = replyNum > replies.length && nextIndex !== null && nextIndex !== undefined && String(nextIndex) !== \"\";\n    var safeMid = String(comment.mid || \"comment\").replace(/[^A-Za-z0-9_-]/g, \"_\");\n    var replyTarget = \"sq_replies_\" + safeMid + \"_\" + (_sqReplyDomSeq++);\n    var moreButton = hasMore\n        ? '<button class=\"reply-more\" type=\"button\" data-target=\"' + replyTarget + '\" data-mid=\"' + sqEscapeHtml(comment.mid || \"\") + '\" data-cursor=\"' + sqEscapeHtml(nextIndex) + '\" data-author=\"' + sqEscapeHtml(comment.authorId || \"0\") + '\" onclick=\"sqLoadReplies(this)\">展开更多回复</button>'\n        : \"\";\n\n    return '<article class=\"comment\">' +\n        '<div class=\"author\">' + (avatar ? '<img class=\"avatar\" src=\"' + sqEscapeHtml(avatar) + '\">' : '<span class=\"avatar fallback\"></span>') +\n        '<div class=\"identity\"><div><b>' + sqEscapeHtml(comment.nickname || \"书友\") + '</b>' + badges + '</div><time>' + sqFormatTime.call(this, comment.pubTime) + '</time></div>' +\n        '<span class=\"likes\">赞 ' + Number(comment.likes || 0) + '</span></div>' +\n        '<div class=\"text\">' + sqRichText(comment) + '</div>' +\n        ((replyHtml || moreButton) ? '<div class=\"replies\"><div id=\"' + replyTarget + '\">' + replyHtml + '</div>' + moreButton + '</div>' : '') +\n        '</article>';\n}\n\nfunction sqCards(list) {\n    list = sqList(list);\n    if (!list.length) return '<div class=\"empty\">暂无评论</div>';\n    var html = \"\";\n    for (var i = 0; i < list.length; i++) html += sqCommentCard.call(this, list[i]);\n    return html;\n}\n\nfunction sqBrowserConfig() {\n    var cfg = sqCommentConfig.call(this);\n    var height = Number(cfg.height || 80);\n    if (height > 1) height = height / 100;\n    if (!(height > 0 && height <= 1)) height = 0.8;\n    return {\n        state: 4,\n        isHideable: true,\n        heightPercentage: height,\n        expandedCornersRadius: 16,\n        dismissOnTouchOutside: true,\n        widthPercentage: 1.0,\n        maxWidth: -1,\n        skipCollapsed: true,\n        hardwareAccelerated: true,\n        webViewInitialScale: 100\n    };\n}\n\nfunction sqReplyBrowserScript() {\n    return [\n        '<script>',\n        '(function(){',\n        'function replyNode(item){',\n        'var row=document.createElement(\"div\");row.className=\"reply dynamic-reply\";',\n        'var name=document.createElement(\"b\");name.textContent=String(item.nickname||\"书友\");row.appendChild(name);',\n        'var text=\"\";if(item.repliedUserNickname)text+=\" 回复 \"+item.repliedUserNickname;text+=\"：\"+String(item.text||\"\");',\n        'row.appendChild(document.createTextNode(text));return row;',\n        '}',\n        'window.sqLoadReplies=function(button){',\n        'if(!button||button.disabled)return;var cfg=window.sqReplyRequest||{};var box=document.getElementById(button.getAttribute(\"data-target\"));if(!box)return;',\n        'button.disabled=true;button.textContent=\"加载中...\";',\n        'try{',\n        'var body={apiKey:cfg.apiKey,bookId:String(cfg.bookId||\"\"),chapterId:String(cfg.chapterId||\"\"),mid:String(button.getAttribute(\"data-mid\")||\"\"),itemIndex:Number(button.getAttribute(\"data-cursor\")||0),size:20,authorId:String(button.getAttribute(\"data-author\")||\"0\")};',\n        'var option={method:\"POST\",body:JSON.stringify(body),headers:{\"Content-Type\":\"application/json\",\"Accept\":\"application/json\"}};',\n        'var raw=window.java.ajax(cfg.apiBase+\"/v1/comments/chapter-replies,\"+JSON.stringify(option));var response=JSON.parse(String(raw||\"{}\").replace(/^\\\\uFEFF/,\"\"));',\n        'if(!response.ok)throw new Error(response.error||\"回复加载失败\");var outer=response.data||{},data=outer.data||{},list=data.commentList||[];',\n        'for(var i=0;i<list.length;i++)box.appendChild(replyNode(list[i]));',\n        'var next=data.nextItemIndex;if(next===null||next===undefined)next=response.pagination&&response.pagination.nextItemIndex;',\n        'var more=data.hasMore;if(more===null||more===undefined)more=response.pagination&&response.pagination.hasMore;',\n        'if(more&&list.length&&next!==null&&next!==undefined){button.setAttribute(\"data-cursor\",String(next));button.disabled=false;button.textContent=\"展开更多回复\";}else{button.disabled=true;button.className=\"reply-more ended\";button.textContent=\"已展开全部回复\";}',\n        '}catch(error){button.disabled=false;button.textContent=\"加载失败，点击重试\";}',\n        '};',\n        '})();',\n        '</script>'\n    ].join(\"\\n\");\n}\n\nfunction sqBrowserPreload(bookId, chapterId, mode, paragraphId, quoteText) {\n    return \"window.sqPageInit=\" + JSON.stringify({\n        apiBase: SQ_COMMENT_API_BASE,\n        apiKey: sqApiKey.call(this),\n        bookId: String(bookId || \"\"),\n        chapterId: String(chapterId || \"\"),\n        paragraphId: String(paragraphId || \"\"),\n        mode: String(mode || \"paragraph\"),\n        quoteText: sqQuoteText(quoteText)\n    }).replace(/</g, \"\\\\u003c\") + \";try{window.java=java;}catch(e){}\";\n}\n\nfunction sqHtmlShell(title, subtitle, content, tabs) {\n    var theme = sqCommentConfig.call(this).theme;\n    var forced = theme === \"深色\" ? \"dark\" : (theme === \"浅色\" ? \"light\" : \"auto\");\n    var css = ':root{--bg:#f5f5f5;--panel:#fff;--text:#202124;--muted:#73777f;--line:#e6e7e9;--accent:#df3f32;--reply:#f7f7f8}' +\n        '@media(prefers-color-scheme:dark){:root{--bg:#111214;--panel:#1b1c1f;--text:#eceef1;--muted:#a3a7ae;--line:#303238;--accent:#ff7165;--reply:#24262b}}' +\n        'html.dark{--bg:#111214;--panel:#1b1c1f;--text:#eceef1;--muted:#a3a7ae;--line:#303238;--accent:#ff7165;--reply:#24262b}' +\n        'html.light{--bg:#f5f5f5;--panel:#fff;--text:#202124;--muted:#73777f;--line:#e6e7e9;--accent:#df3f32;--reply:#f7f7f8}' +\n        '*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"PingFang SC\",\"Microsoft YaHei\",sans-serif}' +\n        'header{position:sticky;top:0;z-index:3;background:var(--panel);border-bottom:1px solid var(--line);padding:15px 16px 12px}h1{font-size:18px;margin:0 0 4px}header p{font-size:12px;color:var(--muted);margin:0}' +\n        '.tabs{display:flex;gap:22px;margin-top:12px}.tab{border:0;background:none;color:var(--muted);font-size:14px;padding:6px 0;border-bottom:2px solid transparent}.tab.active{color:var(--accent);border-color:var(--accent);font-weight:600}' +\n        'main{max-width:760px;margin:0 auto;padding:10px}.comment,.section{background:var(--panel);border:1px solid var(--line);border-radius:8px;margin-bottom:8px;padding:14px}' +\n        '.author{display:flex;align-items:center;gap:10px}.avatar{width:38px;height:38px;border-radius:50%;object-fit:cover;background:var(--reply)}.identity{min-width:0;flex:1}.identity b{font-size:14px}.identity time{display:block;color:var(--muted);font-size:11px;margin-top:3px}.likes{color:var(--muted);font-size:12px}.text{font-size:15px;line-height:1.72;margin:11px 0 2px;word-break:break-word}.emoji{width:24px;height:24px;vertical-align:middle}' +\n        '.badge{font-size:10px;color:#fff;background:var(--accent);border-radius:3px;padding:1px 4px;margin-left:5px}.badge.muted{background:#767b85}.replies{background:var(--reply);border-radius:6px;padding:8px 10px;margin-top:10px}.reply{font-size:13px;line-height:1.65;margin:5px 0}.reply b{color:var(--accent)}.more,.empty{color:var(--muted);font-size:12px;margin-top:5px}.empty{text-align:center;padding:40px 10px}' +\n        '.reply-more{min-height:30px;margin-top:8px;padding:4px 13px;border:0;border-radius:15px;background:var(--panel);color:var(--accent);font-size:12px;font-weight:600}.reply-more:disabled{opacity:.7}.reply-more.ended{color:var(--muted)}' +\n        '.section h2{font-size:14px;margin:0 0 10px;color:var(--accent)}.section .comment{border:0;border-top:1px solid var(--line);border-radius:0;margin:0;padding-left:0;padding-right:0}.section .comment:first-of-type{border-top:0}' +\n        '.panel[hidden]{display:none}';\n    var tabScript = tabs ? '<script>function sqTab(name){var ps=document.querySelectorAll(\".panel\"),bs=document.querySelectorAll(\".tab\");for(var i=0;i<ps.length;i++)ps[i].hidden=ps[i].id!==name;for(var j=0;j<bs.length;j++)bs[j].className=\"tab\"+(bs[j].getAttribute(\"data-tab\")===name?\" active\":\"\")}</script>' : \"\";\n    return '<!doctype html><html class=\"' + forced + '\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><style>' + css + '</style></head><body>' +\n        '<header><h1>' + sqEscapeHtml(title) + '</h1><p>' + sqEscapeHtml(subtitle) + '</p>' + (tabs || \"\") + '</header><main>' + content + '</main>' + tabScript + sqReplyBrowserScript() + '</body></html>';\n}\n\nfunction sqLiveCommentHtml() {\n    return [\n        '<!doctype html><html><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">',\n        '<style>',\n        ':root{--bg:#f5f5f5;--panel:#fff;--text:#202124;--muted:#73777f;--line:#e6e7e9;--accent:#df3f32;--reply:#f7f7f8}@media(prefers-color-scheme:dark){:root{--bg:#111214;--panel:#1b1c1f;--text:#eceef1;--muted:#a3a7ae;--line:#303238;--accent:#ff7165;--reply:#24262b}}',\n        '*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"PingFang SC\",\"Microsoft YaHei\",sans-serif}header{position:sticky;top:0;z-index:3;background:var(--panel);border-bottom:1px solid var(--line);padding:14px 16px 10px}h1{font-size:18px;margin:0 0 4px}.quote{display:none;margin:8px 0 6px;padding:9px 12px 9px 14px;border-left:3px solid var(--accent);background:var(--reply);border-radius:0 6px 6px 0;color:var(--text);font-size:14px;line-height:1.65;white-space:pre-wrap;word-break:break-word}#subtitle{font-size:12px;color:var(--muted)}.tabs{display:flex;gap:22px;margin-top:10px}.tab{border:0;background:none;color:var(--muted);font-size:14px;padding:6px 0;border-bottom:2px solid transparent}.tab.active{color:var(--accent);border-color:var(--accent);font-weight:600}main{max-width:760px;margin:0 auto;padding:10px}',\n        '.comment,.section{background:var(--panel);border:1px solid var(--line);border-radius:8px;margin-bottom:8px;padding:14px}.author-row{display:flex;align-items:center;gap:10px}.avatar{width:38px;height:38px;border-radius:50%;object-fit:cover;background:var(--reply)}.identity{min-width:0;flex:1}.identity b{font-size:14px}.identity time{display:block;color:var(--muted);font-size:11px;margin-top:3px}.likes{color:var(--muted);font-size:12px}.text{font-size:15px;line-height:1.72;margin:11px 0 2px;word-break:break-word}.emoji{width:24px;height:24px;vertical-align:middle}.replies{background:var(--reply);border-radius:6px;padding:8px 10px;margin-top:10px}.reply{font-size:13px;line-height:1.65;margin:5px 0}.reply b{color:var(--accent)}.reply-more{min-height:30px;margin-top:8px;padding:4px 13px;border:0;border-radius:15px;background:var(--panel);color:var(--accent);font-size:12px;font-weight:600}.reply-more:disabled{opacity:.7}.section h2{font-size:14px;margin:0 0 10px;color:var(--accent)}.section .comment{border:0;border-top:1px solid var(--line);border-radius:0;margin:0;padding-left:0;padding-right:0}.empty,.loading,.error{text-align:center;color:var(--muted);padding:34px 10px}.error{color:#b42318}',\n        '.skeleton{height:112px;border-radius:8px;margin-bottom:8px;background:linear-gradient(90deg,var(--panel),var(--reply),var(--panel));background-size:200% 100%;animation:shine 1.2s infinite}@keyframes shine{to{background-position:-200% 0}}',\n        '</style></head><body>',\n        '<header><h1 id=\"title\">段评</h1><div id=\"quote\" class=\"quote\"></div><div id=\"subtitle\">加载中...</div><div id=\"tabs\" class=\"tabs\"><button class=\"tab active\" data-order=\"hot\">最热</button><button class=\"tab\" data-order=\"new\">最新</button></div></header>',\n        '<main id=\"list\"><div class=\"skeleton\"></div><div class=\"skeleton\"></div></main>',\n        '<script>',\n        '(function(){',\n        'var init=window.sqPageInit||{},API=String(init.apiBase||\"\"),KEY=String(init.apiKey||\"\"),BID=String(init.bookId||\"\"),CID=String(init.chapterId||\"\"),PID=String(init.paragraphId||\"\"),MODE=String(init.mode||\"paragraph\"),QUOTE=String(init.quoteText||\"\"),seq=0;',\n        'var list=document.getElementById(\"list\"),title=document.getElementById(\"title\"),quote=document.getElementById(\"quote\"),subtitle=document.getElementById(\"subtitle\"),tabs=document.getElementById(\"tabs\");if(QUOTE){quote.textContent=QUOTE;quote.style.display=\"block\";}',\n        'function esc(v){return String(v==null?\"\":v).replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\");}',\n        'function rich(c){var r=String(c&&c.richText||\"\");if(r.indexOf(\"<img\")>=0)return r;return esc(c&&c.text||\"\");}',\n        'function api(path,body,done){body=body||{};body.apiKey=KEY;var payload=JSON.stringify(body),finished=false;function finish(err,value){if(finished)return;finished=true;done(err,value);}try{var xhr=new XMLHttpRequest();xhr.open(\"POST\",API+path,true);xhr.setRequestHeader(\"Content-Type\",\"application/json\");xhr.onload=function(){try{var root=JSON.parse(String(xhr.responseText||\"{}\").replace(/^\\\\uFEFF/,\"\"));if(!root.ok)throw new Error(root.error||\"接口错误\");finish(null,root);}catch(e){finish(e);}};xhr.onerror=function(){fallback();};xhr.send(payload);}catch(e){fallback();}function fallback(){try{var option={method:\"POST\",body:payload,headers:{\"Content-Type\":\"application/json\",\"Accept\":\"application/json\"}};var raw=window.java.ajax(API+path+\",\"+JSON.stringify(option));var root=JSON.parse(String(raw||\"{}\"));if(!root.ok)throw new Error(root.error||\"接口错误\");finish(null,root);}catch(e2){finish(e2);}}}',\n        'function replyHtml(r){return \"<div class=\\\\\"reply\\\\\"><b>\"+esc(r.nickname||\"书友\")+\"</b>\"+(r.repliedUserNickname?(\" 回复 \"+esc(r.repliedUserNickname)):\"\")+\"：\"+rich(r)+\"</div>\";}',\n        'function replyBox(c){var rd=c.replies||{},arr=rd.commentList||[],html=\"\",id=\"sq_reply_\"+(seq++),i;for(i=0;i<arr.length;i++)html+=replyHtml(arr[i]);var next=rd.nextItemIndex,total=Number(c.replyNum||0);var more=total>arr.length&&next!==null&&next!==undefined&&String(next)!==\"\";return (html||more)?(\"<div class=\\\\\"replies\\\\\"><div id=\\\\\"\"+id+\"\\\\\">\"+html+\"</div>\"+(more?(\"<button class=\\\\\"reply-more\\\\\" data-target=\\\\\"\"+id+\"\\\\\" data-mid=\\\\\"\"+esc(c.mid||\"\")+\"\\\\\" data-cursor=\\\\\"\"+esc(next)+\"\\\\\" data-author=\\\\\"\"+esc(c.authorId||0)+\"\\\\\">展开更多回复</button>\"):\"\")+\"</div>\"):\"\";}',\n        'function cardHtml(c){var av=String(c.userPhoto||\"\"),avatar=av?(\"<img class=\\\\\"avatar\\\\\" src=\\\\\"\"+esc(av)+\"\\\\\">\"):\"<span class=\\\\\"avatar\\\\\"></span>\";return \"<article class=\\\\\"comment\\\\\"><div class=\\\\\"author-row\\\\\">\"+avatar+\"<div class=\\\\\"identity\\\\\"><b>\"+esc(c.nickname||\"书友\")+\"</b><time>\"+esc(c.pubTime||\"\")+\"</time></div><span class=\\\\\"likes\\\\\">赞 \"+Number(c.likes||0)+\"</span></div><div class=\\\\\"text\\\\\">\"+rich(c)+\"</div>\"+replyBox(c)+\"</article>\";}',\n        'function wire(root){var buttons=root.querySelectorAll(\".reply-more\");for(var i=0;i<buttons.length;i++)buttons[i].onclick=function(){loadReplies(this);};}',\n        'function loadReplies(button){if(button.disabled)return;button.disabled=true;button.textContent=\"加载中...\";api(\"/v1/comments/chapter-replies\",{bookId:BID,chapterId:CID,mid:String(button.getAttribute(\"data-mid\")||\"\"),itemIndex:Number(button.getAttribute(\"data-cursor\")||0),size:20,authorId:String(button.getAttribute(\"data-author\")||0)},function(err,root){if(err){button.disabled=false;button.textContent=\"加载失败，点击重试\";return;}var outer=root.data||{},d=outer.data||{},arr=d.commentList||[],box=document.getElementById(button.getAttribute(\"data-target\"));for(var i=0;i<arr.length;i++){var holder=document.createElement(\"div\");holder.innerHTML=replyHtml(arr[i]);if(holder.firstChild)box.appendChild(holder.firstChild);}var next=d.nextItemIndex;if(next===null||next===undefined)next=root.pagination&&root.pagination.nextItemIndex;var more=d.hasMore;if(more===null||more===undefined)more=root.pagination&&root.pagination.hasMore;if(more&&arr.length&&next!==null&&next!==undefined){button.setAttribute(\"data-cursor\",String(next));button.disabled=false;button.textContent=\"展开更多回复\";}else{button.textContent=\"已展开全部回复\";}});}',\n        'function showError(err){list.innerHTML=\"<div class=\\\\\"error\\\\\">加载失败：\"+esc(err&&err.message||err)+\"</div>\";}',\n        \"function sqCommentPage(root) {\\n    var outer = root && root.data || {};\\n    var data = outer.data || outer.Data || {};\\n    var pagination = root && root.pagination || outer.pagination || data.pagination || {};\\n    var list = data.commentList || data.CommentList || [];\\n    var next = data.nextItemIndex;\\n    if (next === null || next === undefined) next = pagination.nextItemIndex;\\n    var more = data.hasMore;\\n    if (more === null || more === undefined) more = pagination.hasMore;\\n    if (typeof more === \\\"string\\\") more = more.toLowerCase() !== \\\"false\\\";\\n    return { list: Array.isArray(list) ? list : [], next: next, more: more };\\n}\\n\\nfunction sqCommentFooter(text, ended) {\\n    var node = document.getElementById(\\\"sq_comment_footer\\\");\\n    if (!node) {\\n        node = document.createElement(\\\"div\\\");\\n        node.id = \\\"sq_comment_footer\\\";\\n        node.className = \\\"empty\\\";\\n        list.appendChild(node);\\n    }\\n    node.textContent = text;\\n    node.className = ended ? \\\"empty\\\" : \\\"loading\\\";\\n    list.appendChild(node);\\n}\\n\\nvar sqPageOrder = \\\"\\\";\\nvar sqPageCursor = null;\\nvar sqPageLoading = false;\\nvar sqPageEnded = false;\\nvar sqPageLoaded = 0;\\nvar sqPageSize = 20;\\n\\nfunction sqMaybeLoadComments() {\\n    if (sqPageEnded || sqPageLoading || !sqPageOrder) return;\\n    if (window.innerHeight + window.scrollY >= document.documentElement.scrollHeight - 220) loadParagraph(sqPageOrder, false);\\n}\\n\\nwindow.addEventListener(\\\"scroll\\\", sqMaybeLoadComments);\\n\",\n        \"function loadParagraph(order, reset) {\\n    if (sqPageLoading) return;\\n    if (reset || sqPageOrder !== order) {\\n        sqPageOrder = order;\\n        sqPageCursor = null;\\n        sqPageEnded = false;\\n        sqPageLoaded = 0;\\n        list.innerHTML = '<div class=\\\"skeleton\\\"></div><div class=\\\"skeleton\\\"></div>';\\n    }\\n    if (sqPageEnded) return;\\n    sqPageLoading = true;\\n    var body = { bookId: BID, chapterId: CID, paragraphId: PID, order: order, size: sqPageSize };\\n    if (sqPageCursor !== null && sqPageCursor !== undefined && String(sqPageCursor) !== \\\"\\\") body.itemIndex = Number(sqPageCursor);\\n    api(\\\"/v1/comments/chapter-list\\\", body, function(err, root) {\\n        sqPageLoading = false;\\n        if (err) { showError(err); return; }\\n        var page = sqCommentPage(root);\\n        var arr = page.list;\\n        if (sqPageLoaded === 0) list.innerHTML = \\\"\\\";\\n        if (arr.length) {\\n            var html = \\\"\\\";\\n            for (var i = 0; i < arr.length; i++) html += cardHtml(arr[i]);\\n            list.insertAdjacentHTML(\\\"beforeend\\\", html);\\n            sqPageLoaded += arr.length;\\n            wire(list);\\n        }\\n        var next = page.next;\\n        var noNext = next === null || next === undefined || String(next) === \\\"\\\" || (sqPageCursor !== null && String(next) === String(sqPageCursor));\\n        sqPageEnded = !arr.length || page.more === false || noNext;\\n        if (sqPageEnded) {\\n            if (!sqPageLoaded) list.innerHTML = '<div class=\\\"empty\\\">暂无评论</div>';\\n            sqCommentFooter(\\\"已到底（共 \\\" + sqPageLoaded + \\\" 条）\\\", true);\\n        } else {\\n            sqPageCursor = next;\\n            sqCommentFooter(\\\"继续下滑加载\\\", false);\\n            setTimeout(sqMaybeLoadComments, 50);\\n        }\\n        subtitle.textContent = MODE === \\\"chapterTitle\\\" ? (\\\"章节标题 · \\\" + sqPageLoaded + \\\" 条已加载\\\") : (\\\"第 \\\" + Number(String(PID).replace(/\\\\D/g, \\\"\\\")) + \\\" 段 · \\\" + sqPageLoaded + \\\" 条已加载\\\");\\n    });\\n}\",\n        'function loadChapter(){title.textContent=\"章评\";tabs.style.display=\"none\";api(\"/v1/reader/render-ext\",{bookId:BID,chapterId:CID},function(err,root){if(err){showError(err);return;}var outer=root.data||{},d=outer.data||{},ext=d.bookChapterExtInfo||{},ps=(ext.paragraphList||[]).slice(0),total=0;for(var i=0;i<ps.length;i++)total+=Number(ps[i].commentCount||0);subtitle.textContent=\"本章共 \"+total+\" 条段评\";ps.sort(function(a,b){return Number(b.commentCount||0)-Number(a.commentCount||0);});ps=ps.slice(0,6);if(!ps.length){list.innerHTML=\"<div class=\\\\\"empty\\\\\">本章暂无评论</div>\";return;}list.innerHTML=\"\";for(var x=0;x<ps.length;x++)(function(item){var section=document.createElement(\"section\"),pid=String(item.paragraphId||(\"p\"+Number(item.orderId||0))),count=Number(item.commentCount||0);section.className=\"section\";section.innerHTML=\"<h2>第 \"+(Number(item.orderId||0)+1)+\" 段 · \"+count+\" 条</h2><div class=\\\\\"loading\\\\\">加载中...</div>\";list.appendChild(section);api(\"/v1/comments/chapter-list\",{bookId:BID,chapterId:CID,paragraphId:pid,order:\"hot\",size:5},function(e,res){if(e){section.innerHTML+=\"<div class=\\\\\"error\\\\\">加载失败</div>\";return;}var o=res.data||{},dd=o.data||{},arr=dd.commentList||[],html=section.querySelector(\"h2\").outerHTML;for(var z=0;z<arr.length;z++)html+=cardHtml(arr[z]);section.innerHTML=html;wire(section);});})(ps[x]);});}',\n        'var tabButtons=tabs.querySelectorAll(\".tab\");for(var i=0;i<tabButtons.length;i++)tabButtons[i].onclick=function(){for(var j=0;j<tabButtons.length;j++)tabButtons[j].className=\"tab\";this.className=\"tab active\";loadParagraph(this.getAttribute(\"data-order\"));};',\n        'if(MODE===\"chapter\")loadChapter();else{title.textContent=MODE===\"chapterTitle\"?\"章评\":\"段评\";loadParagraph(\"hot\");}',\n        '})();',\n        '</script></body></html>'\n    ].join(\"\\n\");\n}\n\nfunction showSqComments(bookId, chapterId, paragraphId, quoteText) {\n    var j = sqJava.call(this);\n    if (!j || !j.showBrowser) return;\n    j.showBrowser(SQ_COMMENT_API_BASE + \"/paragraph\", sqLiveCommentHtml(), sqBrowserPreload.call(this, bookId, chapterId, \"paragraph\", paragraphId, quoteText), JSON.stringify(sqBrowserConfig.call(this)));\n}\n\nfunction showSqChapterComments(bookId, chapterId, paragraphId, quoteText) {\n    var j = sqJava.call(this);\n    if (!j || !j.showBrowser) return;\n    j.showBrowser(SQ_COMMENT_API_BASE + \"/paragraph\", sqLiveCommentHtml(), sqBrowserPreload.call(this, bookId, chapterId, \"chapterTitle\", paragraphId || \"p000\", quoteText), JSON.stringify(sqBrowserConfig.call(this)));\n}\n\n// SQ_COMMENT_API_V1_END", "lastUpdateTime": "1793117600717", "loginCheckJs": "if (JSON.parse(result.body()).message == \"Api Gateway Auth ERROR\") {\n   \t\tToken();\n   }else{\n   \tresult;\n }", "loginUi": "@js:\nvar fullStyle = { layout_flexGrow: 1, layout_flexBasisPercent: 1 };\nvar halfStyle = { layout_flexGrow: 1, layout_flexBasisPercent: 0.4 };\nvar thirdStyle = { layout_flexGrow: 1, layout_flexBasisPercent: 0.3 };\nresult = JSON.stringify([\n  { name: \"书旗apikey\", type: \"password\", action: \"saveCommentSetting('书旗apikey')\", style: fullStyle },\n  { name: \"      📛     当前分类      📛      \", type: \"button\", action: \"login()\", style: fullStyle },\n  { name: \"⭕男频\", type: \"button\", action: \"set(0)\", style: halfStyle },\n  { name: \"⭕女频\", type: \"button\", action: \"set(1)\", style: halfStyle },\n  { name: \"userId\", type: \"text\", default: \"12345678\", style: fullStyle },\n  { name: \"💬 评论设置\", type: \"button\", action: \"commentRefreshTip()\", style: fullStyle },\n  { name: \"段评开关\", type: \"toggle\", action: \"commentRefreshTip()\", chars: [\"🔳\", \"✅\"], default: \"🔳\", style: halfStyle },\n  { name: \"章评开关\", type: \"toggle\", action: \"commentRefreshTip()\", chars: [\"🔳\", \"✅\"], default: \"🔳\", style: halfStyle },\n  { name: \"段评分色\", type: \"toggle\", action: \"commentRefreshTip()\", chars: [\"🔳\", \"✅\"], default: \"🔳\", style: halfStyle },\n  { name: \"段评气泡颜色\", type: \"text\", action: \"saveCommentSetting('段评气泡颜色')\", default: \"#666666\", style: thirdStyle },\n  { name: \"分色气泡颜色\", type: \"text\", action: \"saveCommentSetting('分色气泡颜色')\", default: \"#e23b3b\", style: thirdStyle },\n  { name: \"热门气泡颜色\", type: \"text\", action: \"saveCommentSetting('热门气泡颜色')\", default: \"#f06060\", style: thirdStyle },\n  { name: \"分色评论数\", type: \"text\", action: \"saveCommentSetting('分色评论数')\", default: \"45\", style: thirdStyle },\n  { name: \"评论窗口高度\", type: \"text\", action: \"saveCommentSetting('评论窗口高度')\", default: \"80\", style: thirdStyle },\n  { name: \"评论主题\", type: \"select\", chars: [\"自动\", \"浅色\", \"深色\"], default: \"自动\", style: halfStyle },\n  { name: \"◎ 模板\", type: \"select\", chars: [\"起点\", \"样式一\", \"样式二\", \"样式三\"], default: \"起点\", style: halfStyle },\n  { name: \"◎ 大小\", type: \"select\", chars: [\"TEXT\", \"text\"], default: \"text\", style: halfStyle },\n  { name: \"🍋 自定义气泡 🍋\", type: \"button\", style: fullStyle },\n  { name: \"◎ 气泡一\", type: \"text\", action: \"saveCommentSetting('◎ 气泡一')\", style: fullStyle },\n  { name: \"◎ 气泡二\", type: \"password\", action: \"saveCommentSetting('◎ 气泡二')\", style: fullStyle },\n  { name: \"◎ 气泡三\", type: \"password\", action: \"saveCommentSetting('◎ 气泡三')\", style: fullStyle },\n]);", "loginUrl": "genderList = [{\"男频\":\"male\"},{\"女频\":\"female\"}];\n\n//放置登入头\nfunction put(json){\n\t\treturn source.setVariable(\n\t\t\tJSON.stringify(json)\n\t\t);\n\t}\n\t\nfunction login() {    \t \t\n\t  \tvar userId = source.getLoginInfoMap() || {};\n\t  \t userId = userId[\"userId\"];\n\t\t\t userId = !/^\\d+/.test(userId) ? 12345678 : userId;   \n  var v = source.getVariable();\n  if(v == \"\"){ set(0); }\n    v = JSON.parse(source.getVariable());  \n    var uid = [{\"uid\":[{\"userId\":userId}]}];\n    var mergedObj = Object.assign({}, v[0], uid[0]);\n    var con = [mergedObj];\n    java.longToast(JSON.stringify(con));\n    return put(con);\n  }\n  \nfunction set(i){\n\t var gender = genderList[i];\n  var keys = Object.keys(gender);\n  keys.forEach(key => {\n     java.toast(\"设置成功！\"+ key);\n  });\n\treturn put([{\"fl\":[gender]}]);\n\t}\n\n// SQ_COMMENT_LOGIN_V1\nfunction commentRefreshTip() {\n  java.longToast(\"\\n评论设置已修改\\n请返回阅读页并刷新正文后生效\");\n}\n\nfunction saveCommentSetting(key) {\n  var value = String(result[key] || \"\").trim();\n  var map = new Packages.java.util.HashMap();\n  map.put(key, value);\n  java.upLoginData(map);\n  try { source.putLoginInfo(JSON.stringify(result)); } catch(e) {}\n  java.toast(key + \"已保存\");\n}", "respondTime": 180000, "ruleBookInfo": {"author": "authorName", "coverUrl": "imgUrl", "init": "$.data", "intro": "<br>\n🕰 更新：{{java.timeFormatUTC(java.getString(\"$.lastInsTime\")*1000,'yyyy-MM-dd HH:mm', timeoffset)}}\n&shy;\n🔖 标签：{{$.tag[*].tagName##\\n##,}}\n🔗 版权：{{$.cpName}}\n&shy;\n📂 简介：{{$.desc}}\n@js:result.replace(/.+：\\s/g,'')", "kind": "{{java.getString('$.freeStack')=='1'?'':'💲VIP'}}\n{{$.monthlyBuyTip}}\n{{$.className}}\n{{java.getString('$.state')=='1'?'连载':'完结'}}", "lastChapter": "lastChapter.chapterName", "name": "bookName", "tocUrl": "@js:\nbookId = \"{{$.bookId}}\";\nparams = `bookId=${bookId}`;\npath = \"/webapi/bcspub/openapi/book/chapterlist\";\nurl = GetUrl(path, params, 'https://ocean.shuqireader.com');", "wordCount": "{{$.wordCount}}万字"}, "ruleContent": {"content": "@js:\n(function () {\n  var meta = sqGetChapterMeta.call(this, baseUrl);\n  if (!meta || !meta.bookId || !meta.chapterId) return \"获取正文失败：缺少书籍或章节编号，请刷新目录\";\n  var response = sqPost.call(this, \"/v1/reader/chapter-content\", {\n    bookId: String(meta.bookId),\n    chapterId: String(meta.chapterId)\n  });\n  if (!response || !response.ok) return \"获取正文失败：\" + String(response && response.error || \"接口请求失败\");\n  var data = response.data || {};\n  var text = data.content;\n  if (typeof text !== \"string\" || !text) return \"获取正文失败：接口未返回章节正文\";\n  var chapterQuote = \"\";\n  try { if (typeof chapter !== \"undefined\" && chapter) chapterQuote = String(chapter.title || chapter.chapterName || \"\"); } catch (eChapterQuote) {}\n  return sqDecorateContent.call(this, text, meta.bookId, meta.chapterId, chapterQuote);\n})();", "title": "@js:\nvar sqTitleText = String(title || result || \"\");\ntry { chapter.putImgUrl(null); } catch(eClearSqTitle) {}\nvar sqTitleBubble = \"\";\nvar sqCfg = sqCommentConfig.call(this);\nvar sqMeta = sqGetChapterMeta.call(this, baseUrl);\nif (sqCfg.chapter && sqMeta && sqMeta.chapterId) {\n  try {\n    var sqTitleSource = sqSource.call(this);\n    if (sqTitleSource && sqTitleSource.get) sqTitleBubble = String(sqTitleSource.get(\"sq_title_bubble_\" + String(sqMeta.chapterId)) || \"\");\n  } catch(eSqTitle) { sqTitleBubble = \"\"; }\n}\nsqTitleText + sqTitleBubble;"}, "ruleExplore": [], "ruleSearch": {"author": "$.authorName||$.author", "bookList": ".[?(@.bookName)]||.[?(@.title)]", "bookUrl": "@js:\nbookId = \"{{$.bookId||$.bid}}\";\nparams = `bookId=${bookId}`;\npath = \"/webapi/bcspub/openapi/book/info\";\nurl = GetUrl(path, params);", "checkKeyWord": "御兽：只有我能看见隐藏进化路线", "coverUrl": "$.imgUrl||$.cover", "intro": "$.desc", "kind": "@js:\nc = \"{{$.className||$.category}}\";\ns1 = \"{{$.status}}\";\ns2 = \"{{$.state}}\";\nif(s1!=\"\"){\n\t   s = s1 == '0'?'连载':'完结';\n\t}else{\n\t\t  s = s2 == '1'?'连载':'完结';\n }\nresult = c + \",\" + s;", "lastChapter": "$.latest_chapter.cname", "name": "$.bookName||$.title", "wordCount": "$.wordCount||$.words"}, "ruleToc": {"chapterList": "<js>\nlist = [];\ndata = JSON.parse(src).data;\nchargeContUrlPrefix = data.chargeContUrlPrefix;\nfreeContUrlPrefix = data.freeContUrlPrefix;\nshortContUrlPrefix = data.shortContUrlPrefix;\nchapterList = data.chapterList;\nvar sqMetaMap = {};\nvar sqShortMap = {};\nvar sqCatalogBookId = \"\";\ntry { sqCatalogBookId = String(bookId || \"\"); } catch(e) {}\nif (!sqCatalogBookId) {\n  var sqBookMatch = String(baseUrl || \"\").match(/bookId=(\\d+)/);\n  if (sqBookMatch) sqCatalogBookId = sqBookMatch[1];\n}\nfunction sqFmtCatalogTime(ts) {\n  var d = new Date(Number(ts || 0) * 1000);\n  if (!Number(ts || 0)) return \"\";\n  function pad(n) { return n < 10 ? \"0\" + n : String(n); }\n  return d.getFullYear() + \"-\" + pad(d.getMonth() + 1) + \"-\" + pad(d.getDate()) + \" \" + pad(d.getHours()) + \":\" + pad(d.getMinutes());\n}\nfor (i in chapterList) {\n  volumeName = chapterList[i].volumeName;\n  list.push({ chapterName: \"🏮〖\" + volumeName + \"〗🏮\", isVolume: true });\n  chapterList[i].volumeList.forEach($ => {\n    var suffix = String($.contUrlSuffix || \"\");\n    var realChapterUrl = ($.isFreeRead ? freeContUrlPrefix : chargeContUrlPrefix) + suffix;\n    realChapterUrl = String(realChapterUrl || \"\").replace(/0$/, \"1\");\n    var currentBookId = String(sqCatalogBookId || \"\");\n    var currentChapterId = String($.chapterId || \"\");\n    chapterUrl = realChapterUrl + \"#sqBid=\" + encodeURIComponent(currentBookId) + \"&sqCid=\" + encodeURIComponent(currentChapterId);\n    shortUrl = shortContUrlPrefix + String($.shortContUrlSuffix || \"\");\n    time = sqFmtCatalogTime($.chapterUpdateTime);\n    wordCount = $.wordCount + \"字\";\n    chapterPrice = $.chapterPrice != \"0\" && !$.isFreeRead ? $.chapterPrice + \"书豆\" : \"\";\n    if (suffix) {\n      sqMetaMap[suffix] = { bookId: currentBookId, chapterId: currentChapterId };\n      if (shortUrl) sqShortMap[suffix] = shortUrl;\n    }\n    list.push({\n      chapterName: $.chapterName,\n      chapterUrl: chapterUrl,\n      isVip: !$.isFreeRead,\n      isPay: $.isBuy,\n      chapterInfo: [volumeName, time, wordCount, chapterPrice].join(\"丨\").replace(/丨$/, \"\")\n    });\n  });\n}\ntry {\n  java.put(\"sqMetaMap\", JSON.stringify(sqMetaMap));\n  java.put(\"sqShortMap\", JSON.stringify(sqShortMap));\n  _sqMetaMapCache = null;\n  _sqShortMapCache = null;\n} catch(eMap) {}\nlist\n</js>", "chapterName": "chapterName", "chapterUrl": "chapterUrl", "isPay": "isPay", "isVip": "isVip", "isVolume": "isVolume", "updateTime": "chapterInfo"}, "searchUrl": "https://read.xiaoshuo1-sm.com/novel/i.php?do=is_search&isNewBind=0&platform=3&&user_id=8000000&q={{key}}&page={{page}}&size=10&uid=8000000&filterMigu=1&ver=&p=3&timestamp={{~~(Date.now()/1e3)}}", "weight": 0},{"bookSourceComment": "//26.7.17修复\n//修复正文为空，添加搜索切换长篇和短篇，更改简体\n//短篇（/article/ 地址）自动生成单章目录", "bookSourceGroup": "老司机", "bookSourceName": "情色网小说网🎋", "bookSourceType": 0, "bookSourceUrl": "https://www.book18.org", "customOrder": 6491, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "[\n  {\"title\":\"发现-最新(长篇)\",\"url\":\"https://www.book18.org/zh-hans?sort=created&page={{page}}&per-page=50\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.4}},\n  {\"title\":\"发现-最多(长篇)\",\"url\":\"https://www.book18.org/zh-hans?sort=hits&page={{page}}&per-page=50\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.4}},\n  {\"title\":\"发现-最火(长篇)\",\"url\":\"https://www.book18.org/zh-hans?sort=views&page={{page}}&per-page=50\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.4}},\n  {\"title\":\"发现-推荐(长篇)\",\"url\":\"https://www.book18.org/zh-hans?sort=score&page={{page}}&per-page=50\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.4}},\n  {\"title\":\"发现-最好(长篇)\",\"url\":\"https://www.book18.org/zh-hans?sort=likes&page={{page}}&per-page=50\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.4}}\n]", "lastUpdateTime": 1784371200000, "respondTime": 180000, "loginUrl": "https://www.book18.org/zh-hans", "loginUi": "[\n  {\n    \"name\": \"🔄 点击一键切换【长篇/短篇】搜索\",\n    \"type\": \"button\",\n    \"action\": \"var currentType = source.getVariable() || '长篇'; var nextType = currentType == '长篇' ? '短篇' : '长篇'; source.setVariable(nextType); java.toast('🎋 切换成功！当前状态：【' + nextType + '】，请直接按手机返回键退出弹窗');\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  }\n]", "ruleBookInfo": {"author": "[property=\"og:description\"]@content##.*作者：(\\S+)##$1", "intro": "[property=\"og:description\"]@content", "name": "h1@text"}, "ruleContent": {"content": "#content@html", "replaceRegex": "##\\s*book18\\.org"}, "ruleExplore": {"bookList": ".list-group-item", "bookUrl": "a@href", "name": "a@text"}, "ruleSearch": {"bookList": ".list-group-item", "bookUrl": "a@href", "name": "a@text"}, "ruleToc": {"chapterList": "@js:\nvar arr = [];\nvar t = baseUrl;\nif (t.indexOf('/article/') > -1) {\n    arr.push(JSON.stringify({name: '正文', url: t}));\n} else {\n    var html = (typeof result == 'string' && result.length > 100) ? result : java.ajax(t);\n    var doc = org.jsoup.Jsoup.parse(html, t);\n    var els = doc.select('.list-group-item a');\n    for (var i = 0; i < els.size(); i++) {\n        var e = els.get(i);\n        arr.push(JSON.stringify({name: e.text(), url: e.attr('href')}));\n    }\n}\narr;", "chapterName": "@js:\nvar o = (typeof result == 'string') ? JSON.parse(result) : result;\no.name;", "chapterUrl": "@js:\nvar o = (typeof result == 'string') ? JSON.parse(result) : result;\no.url;"}, "searchUrl": "@js:\nvar type = \"长篇\";\ntry {\n    type = source.getVariable() || \"长篇\";\n} catch(e) {}\n\nif (type == \"短篇\") {\n    \"https://www.book18.org/zh-hans/article/index?q=\" + java.encodeURI(key, \"UTF-8\");\n} else {\n    \"https://www.book18.org/zh-hans?q=\" + java.encodeURI(key, \"UTF-8\");\n}", "weight": 0},{"bookSourceComment": "发布页：\nhttps://huangguoai.pages.dev\nhttps://huang-guo.pages.dev", "bookSourceGroup": "影视,AI,R18", "bookSourceName": "黄果短剧🔞", "bookSourceType": 4, "bookSourceUrl": "https://l205.arj2ftl0.cc", "bookUrlPattern": "https?://[^/]+/video/\\d+(?:/ep-\\d+)?/?$", "concurrentRate": "1/1500", "coverDecodeJs": "(function(){\ntry{\nvar baos=new Packages.java.io.ByteArrayOutputStream();\nvar buf=new Packages.java.lang.String('00000000000000000000000000000000').getBytes();\nvar n=result.read(buf);\nwhile(n>0){baos.write(buf,0,n);n=result.read(buf)}\nvar enc=baos.toByteArray();\nif(!enc||enc.length<32)return enc;\nvar b0=(enc[0]+256)%256,b1=(enc[1]+256)%256,b2=(enc[2]+256)%256;\nif((b0===255&&b1===216)||(b0===137&&b1===80&&b2===78)||(b0===71&&b1===73&&b2===70)||(b0===82&&b1===73&&b2===70))return enc;\nif(enc.length%16!==0)return enc;\nvar Cipher=Packages.javax.crypto.Cipher;\nvar SKS=Packages.javax.crypto.spec.SecretKeySpec;\nvar IVS=Packages.javax.crypto.spec.IvParameterSpec;\nvar c=Cipher.getInstance('AES/CBC/NoPadding');\nc.init(Cipher.DECRYPT_MODE,new SKS(new Packages.java.lang.String('f5d965df75336270').getBytes('UTF-8'),'AES'),new IVS(new Packages.java.lang.String('97b60394abc2fbe1').getBytes('UTF-8')));\nvar dec=c.doFinal(enc);\nif(!dec||dec.length<32)return enc;\nvar eoi=-1;\nfor(var i=dec.length-2;i>0;i--){\n  if((dec[i]+256)%256===255&&(dec[i+1]+256)%256===217){eoi=i;break}\n}\nif(eoi>0&&eoi+2<dec.length)return Packages.java.util.Arrays.copyOf(dec,eoi+2);\nreturn dec;\n}catch(e){return null}\n})()\n", "customButton": false, "customOrder": 3, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "AI成人短剧::https://l205.arj2ftl0.cc/ai-duanju/{{page}}/&&AI成人漫剧::https://l205.arj2ftl0.cc/ai-manju/{{page}}/&&AI换脸::https://l205.arj2ftl0.cc/ai-huanlian/{{page}}/&&AI魔改::https://l205.arj2ftl0.cc/ai-mogai/{{page}}/&&热播排行榜::https://l205.arj2ftl0.cc/ranks/hot/&&精品专题::https://l205.arj2ftl0.cc/topics/hot-aiduanju/&&全部专题::https://l205.arj2ftl0.cc/topics/", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 14; Pixel 8 Build/UQ1A.240105.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/131.0.6778.81 Mobile Safari/537.36\",\"Accept\":\"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\",\"Accept-Language\":\"zh-CN,zh;q=0.9,en;q=0.8\",\"Referer\":\"https://l205.arj2ftl0.cc/\"}", "lastUpdateTime": "1793112397400", "loginUi": "[{\"name\": \"黄果短剧 · 线路面板\", \"type\": \"label\", \"style\": {\"layout_flexBasisPercent\": 1}}, {\"name\": \"发布页地址\", \"type\": \"text\", \"key\": \"发布页地址\", \"default\": \"https://huangguoai.pages.dev/publish.js\", \"hint\": \"需以 http:// 或 https:// 开头\", \"style\": {\"layout_flexBasisPercent\": 1}}, {\"name\": \"获取网址并测速\", \"type\": \"button\", \"action\": \"FQ_hgGo()\", \"style\": {\"layout_flexBasisPercent\": 1}}, {\"name\": \"测速结果 · 点按切换\", \"type\": \"label\", \"style\": {\"layout_flexBasisPercent\": 1}}, {\"name\": \"线路1\", \"type\": \"button\", \"viewName\": \"FQ_siteName(0)\", \"action\": \"FQ_hgPick(0)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路2\", \"type\": \"button\", \"viewName\": \"FQ_siteName(1)\", \"action\": \"FQ_hgPick(1)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路3\", \"type\": \"button\", \"viewName\": \"FQ_siteName(2)\", \"action\": \"FQ_hgPick(2)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路4\", \"type\": \"button\", \"viewName\": \"FQ_siteName(3)\", \"action\": \"FQ_hgPick(3)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路5\", \"type\": \"button\", \"viewName\": \"FQ_siteName(4)\", \"action\": \"FQ_hgPick(4)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路6\", \"type\": \"button\", \"viewName\": \"FQ_siteName(5)\", \"action\": \"FQ_hgPick(5)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路7\", \"type\": \"button\", \"viewName\": \"FQ_siteName(6)\", \"action\": \"FQ_hgPick(6)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路8\", \"type\": \"button\", \"viewName\": \"FQ_siteName(7)\", \"action\": \"FQ_hgPick(7)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路9\", \"type\": \"button\", \"viewName\": \"FQ_siteName(8)\", \"action\": \"FQ_hgPick(8)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路10\", \"type\": \"button\", \"viewName\": \"FQ_siteName(9)\", \"action\": \"FQ_hgPick(9)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路11\", \"type\": \"button\", \"viewName\": \"FQ_siteName(10)\", \"action\": \"FQ_hgPick(10)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路12\", \"type\": \"button\", \"viewName\": \"FQ_siteName(11)\", \"action\": \"FQ_hgPick(11)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"当前线路\", \"type\": \"button\", \"action\": \"FQ_hgCur()\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"检查登录状态\", \"type\": \"button\", \"action\": \"FQ_hgChk()\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"恢复默认\", \"type\": \"button\", \"action\": \"FQ_hgRst()\", \"style\": {\"layout_flexBasisPercent\": 0.32}}]", "loginUrl": "function hgST(s){s=String(s==null?'':s);return s.replace(/\\/+$/,'')}\nfunction hgNL(){return String.fromCharCode(10)}\nfunction hgQ(c){return String.fromCharCode(34)+c+String.fromCharCode(34)}\nfunction hgDef(){return 'https://l205.arj2ftl0.cc'}\nfunction hgPub(){return 'https://huangguoai.pages.dev/publish.js'}\nfunction hgSubs(){return ['thu','pku','fdu','sjtu','zju','nju','xmu','sysu','whu','jlu','scu','ruc','bnu','nku','tju','sdu','hust','xjtu','hit']}\nfunction hgRoots(){return ['arj2ftl0.cc','40ygo615.cc','h2na6qa39.cc']}\nfunction hgHost(u){var s=hgST(u).replace(/^https?:\\/\\//,'');var i=s.indexOf('/');return i>0?s.substring(0,i):s}\nfunction hgShort(h){h=String(h||'');var d=h.split('.');var t=d[0]||h;if(t.length>13)t=t.substring(0,13);return t}\nfunction hgGV(k,d){var v='';try{v=String(source.get(k)||'')}catch(e){}\n  if(!v||v=='null'||v=='undefined')v=d;return v?hgST(v):''}\nfunction hgSV(k,v){try{source.put(k,String(v))}catch(e){}}\nfunction hgT(t){try{java.longToast(t)}catch(e){try{java.toast(t)}catch(e2){}}}\nfunction hgSites(){var r=hgGV('hg_sites','');var a=[];if(r){try{a=JSON.parse(r)}catch(e){}}return a}\nfunction hgCand(){\n  var p=hgGV('pub',hgPub());\n  var h='';\n  try{h=String(java.ajax(p))}catch(e){}\n  if(h.length<500){try{h=String(java.ajax(hgPub()))}catch(e2){}}\n  var roots=[];\n  if(h.length>=500){\n    var m=h.match(/var\\s+urls\\s*=\\s*\\[([\\s\\S]*?)\\]/);\n    if(m){var re=/['\"]([a-z0-9.\\-]+\\.[a-z]{2,}\\/?)['\"]/gi,mm;\n      while((mm=re.exec(m[1]))!=null)roots.push(mm[1].replace(/\\/+$/,''))}\n  }\n  if(!roots.length)roots=hgRoots();\n  var cs=[];\n  for(var i=0;i<roots.length;i++)for(var j=0;j<hgSubs().length;j++)cs.push('https://'+hgSubs()[j]+'.'+roots[i]);\n  for(var k=0;k<hgRoots().length;k++)cs.push('https://'+hgRoots()[k]);\n  cs.push(hgDef());\n  var seen={},ls=[];\n  for(var m2=0;m2<cs.length;m2++){if(!seen[cs[m2]]){seen[cs[m2]]=1;ls.push(cs[m2])}}\n  return ls}\nfunction hgProbe(u){\n  var t0=Date.now();\n  try{\n    var r=java.ajax(u+'/');\n    var b=String(r);\n    if(b.length>20000)return {ok:true,ms:Date.now()-t0};\n  }catch(e){}\n  return {ok:false,ms:-1}}\nfunction FQ_siteName(i){\n  try{\n    var a=hgSites();\n    if(!a.length)return '线路'+(i+1);\n    if(i>=a.length)return '';\n    var s=a[i];\n    var cur=hgGV('hg_line',hgDef());\n    return hgShort(s.host)+' '+s.ms+'ms'+(s.url===cur?' ✓':'');\n  }catch(e){return '线路'+(i+1)}\n}\nfunction FQ_hgGo(){\n  try{\n    var p=hgGV('pub',hgPub());\n    if(!p||p.indexOf('http')!=0){hgT('发布页地址无效：需以 http:// 或 https:// 开头');return}\n    hgT('正在抓取发布页并测速...');\n    var ls=hgCand();\n    var urls=[];\n    for(var i=0;i<ls.length;i++)urls.push(ls[i]+'/');\n    var rows=[];\n    var res=null;\n    try{res=java.ajaxAll(urls)}catch(e){}\n    if(res&&res.length){\n      for(var j=0;j<res.length&&j<ls.length;j++){\n        var r=res[j];\n        var code=0,ct=-1,bl=0;\n        try{code=r.raw.code()}catch(e){}\n        try{ct=r.callTime()}catch(e2){}\n        try{bl=String(r.body()).length}catch(e3){}\n        if(code>=200&&code<400&&bl>20000)rows.push({url:ls[j],host:hgHost(ls[j]),ms:ct});\n      }\n    }else{\n      for(var j2=0;j2<ls.length;j2++){\n        var p2=hgProbe(ls[j2]);\n        if(p2.ok)rows.push({url:ls[j2],host:hgHost(ls[j2]),ms:p2.ms});\n      }\n    }\n    if(!rows.length){hgT('测速完成：'+ls.length+' 条线路全部不可用');return}\n    rows.sort(function(x,y){return x.ms-y.ms});\n    rows=rows.slice(0,12);\n    hgSV('hg_sites',JSON.stringify(rows));\n    hgSV('hg_line',rows[0].url);\n    hgSV('hg_line_ts',String(Date.now()));\n    hgT('测速完成（'+ls.length+' 条，可用 '+rows.length+' 条）'+hgNL()+'已选最快：'+rows[0].host+'（'+rows[0].ms+'ms）'+hgNL()+'若按钮名未刷新，重新打开本面板即可');\n    try{java.reLoginView(false)}catch(e){}\n  }catch(e){hgT('测速失败：'+String(e).substring(0,100))}\n}\nfunction FQ_hgPick(i){\n  try{\n    var a=hgSites();\n    if(!a.length||!a[i]){\n      hgT('该线路尚未测速，请先点「获取网址并测速」');\n      return;\n    }\n    hgSV('hg_line',a[i].url);\n    hgSV('hg_line_ts',String(Date.now()));\n    hgT('已选择网站：'+a[i].host+hgNL()+'延迟：'+a[i].ms+'ms');\n    try{java.reLoginView(false)}catch(e){}\n  }catch(e){hgT('切换失败：'+String(e).substring(0,80))}\n}\nfunction FQ_hgCur(){\n  try{hgT('当前线路：'+hgGV('hg_line',hgDef()))}catch(e){}\n}\nfunction FQ_hgChk(){\n  try{\n    var L=hgGV('hg_line',hgDef());\n    var h='';\n    try{h=String(java.ajax(L+'/profile/'))}catch(e){}\n    if(h.length<2000){hgT('无法连接线路：'+L+hgNL()+'请检查网络或切换线路');return}\n    var guest=h.indexOf('data-auth-open='+hgQ('login')+'>'+String.fromCharCode(30331,24405,47,27880,20876))>=0;\n    var dash=h.indexOf('ID'+String.fromCharCode(65306)+String.fromCharCode(8212))>=0;\n    var out=h.indexOf(String.fromCharCode(36864,20986))>=0||h.indexOf('signOut')>=0||h.indexOf('logout')>=0;\n    if(guest&&dash)hgT('游客状态（未登录）'+hgNL()+'搜索/详情/目录/播放均可正常使用'+hgNL()+'登录后可看收藏与观看历史'+hgNL()+'当前线路：'+L);\n    else if(out)hgT('已登录'+hgNL()+'当前线路：'+L);\n    else hgT('状态未知（页面结构可能已变化）'+hgNL()+'当前线路：'+L);\n  }catch(e){hgT('检查失败：'+String(e).substring(0,80))}\n}\nfunction FQ_hgRst(){\n  try{\n    hgSV('pub',hgPub());hgSV('hg_line',hgDef());hgSV('hg_line_ts','0');hgSV('hg_sites','');\n    hgT('已恢复默认'+hgNL()+'线路：'+hgDef());\n    try{java.reLoginView(false)}catch(e){}\n  }catch(e){}\n}\nfunction login(){\n  try{java.longToast('当前为游客模式，无需登录');}catch(e){try{java.toast('当前为游客模式，无需登录')}catch(e2){}}\n}\n", "respondTime": 180000, "ruleBookInfo": {"author": "@js:\n(function(){\nvar h=String(result);\nvar a=h.match(/<meta name=author content=\"([^\"]*)\"/);\nif(a)return a[1];\nvar b=h.match(/class=\"hg-topic-banner__body\"[^>]*>[\\s\\S]*?<p>([^<]*)<\\/p>/);\nreturn b?b[1].substring(0,40):'黄果短剧';\n})()", "coverUrl": "@js:\n(function(){\nvar h=String(result);\nvar m=h.match(/data-history=\"[^\"]*\"[^>]*>/);\nif(m){\n  var d=m[0].replace(/&#34;/g,'\"').replace(/&quot;/g,'\"').replace(/&amp;/g,'&');\n  var c=d.match(/\"cover\":\"([^\"]+)\"/);\n  if(c){var o=c[1];if(o.indexOf('http')!==0)o='https://pic.drleao.cn'+o;return o+(o.indexOf('?')<0?'?':'&')+'hgimgv=2';}\n}\nvar ds=h.match(/data-src=\"(https:\\/\\/pic\\.[^\"]+)\"/);\nif(ds){var o2=ds[1];return o2+(o2.indexOf('?')<0?'?':'&')+'hgimgv=2';}\nreturn '';\n})()", "intro": "meta[name=description]@content", "kind": "@js:\n(function(){\nvar h=String(result);\nvar t=h.match(/data-track-total-episode=\"(\\d+)\"/);\nif(t)return t[1]+'集';\nvar g=h.match(/class=\"hg-topic-extra-pc\">([^<]*)<\\/span>/);\nif(g)return g[1];\nreturn '';\n})()", "name": "@js:\n(function(){\nvar h=String(result);\nvar m=h.match(/<h1[^>]*class=\"hg-web-play__title\"[^>]*>([^<]*)<\\/h1>/);\nif(m)return m[1].trim();\nvar t=h.match(/<h1[^>]*>([^<]*)<\\/h1>/);\nif(t)return t[1].replace(/介绍$/,'').trim();\nvar og=h.match(/property=\"og:title\" content=\"([^\"]*)\"/);\nif(og)return og[1].replace(/_免费在线观看.*$/,'').trim();\nreturn '';\n})()"}, "ruleContent": {"content": "@js:\n(function(){\nvar h = String(java.ajax(String(baseUrl)));\nvar m = h.match(/<source src=\"([^\"]+)\"/);\nreturn m ? m[1].split('&amp;').join('&') : '';\n})()"}, "ruleExplore": {"author": "@js:\n(function(){\nvar h=String(result);\nvar tp=h.match(/class=\"hg-topic-card__meta\">[\\s\\S]*?<span>([^<]+)</);\nif(tp)return tp[1].trim();\nvar t=h.match(/data-track-type-name=\"([^\"]*)\"/);\nvar tg=h.match(/class=\"hg-drama-card__tags\">([\\s\\S]*?)<\\/div>/)||h.match(/class=\"hg-rank-item__tags\">([\\s\\S]*?)<\\/div>/);\nvar g='';\nif(tg)g=tg[1].replace(/<span class=\"sr-only\">[\\s\\S]*?<\\/span>/g,'').replace(/<[^>]*>/g,' ').replace(/\\s+/g,' ').trim();\nif(t)return t[1];\nreturn g;\n})()", "bookList": ".hg-list-page .hg-card-grid .hg-drama-card, .hg-list-page .hg-rank-item, .hg-list-page .hg-topic-grid .hg-topic-card", "bookUrl": "@js:\n(function(){\nvar h=String(result);\nvar root='';\ntry{root=String(source.get('hg_line')||'')}catch(e){}\nif(!root||root.indexOf('http')!==0){try{root=String(source.getBookSourceUrl())}catch(e2){root=''}}\nroot=root.split(String.fromCharCode(35,35))[0];\nif(!root||root.indexOf('http')!==0)root=String(baseUrl||'').split(String.fromCharCode(35,35))[0].replace(/\\/$/,'');\nroot=root.replace(/\\/$/,'');\nvar tp=h.match(/href=\"(\\/topics\\/[a-zA-Z0-9\\-]+\\/)\"/);\nif(tp)return root+tp[1];\nvar mv=h.match(/href=\"(\\/video\\/\\d+\\/)\"/);\nif(mv)return root+mv[1];\nreturn '';\n})()", "coverUrl": "@js:\n(function(){\nvar h=String(result);\nvar m=h.match(/data-src=\"([^\"]+)\"/);\nif(!m)return '';\nvar o=m[1];\nreturn o+(o.indexOf('?')<0?'?':'&')+'hgimgv=2';\n})()", "intro": "@js:\n(function(){\nvar h=String(result);\nvar tp=h.match(/class=\"hg-topic-card__meta\">[\\s\\S]*?<span>([^<]+)</);\nif(tp)return tp[1].trim();\nvar d=h.match(/class=\"hg-drama-card__desc\">([\\s\\S]*?)<\\/p>/)||h.match(/class=\"hg-rank-item__desc\">([\\s\\S]*?)<\\/p>/);\nreturn d?d[1].replace(/<[^>]*>/g,'').trim():'';\n})()", "kind": "@js:\n(function(){\nvar h=String(result);\nvar tp=h.match(/class=\"hg-topic-card__meta\">[\\s\\S]*?<span>([^<]+)</);\nif(tp)return '专题合集';\nvar t=h.match(/data-track-type-name=\"([^\"]*)\"/);\nvar tg=h.match(/class=\"hg-drama-card__tags\">([\\s\\S]*?)<\\/div>/)||h.match(/class=\"hg-rank-item__tags\">([\\s\\S]*?)<\\/div>/);\nvar g='';\nif(tg)g=tg[1].replace(/<span class=\"sr-only\">[\\s\\S]*?<\\/span>/g,'').replace(/<[^>]*>/g,' ').replace(/\\s+/g,' ').trim();\nif(t)return t[1]+' · '+g;\nreturn g;\n})()", "lastChapter": ".hg-drama-card__episode@data-ep-base||.hg-drama-card__episode@text", "name": "@js:\n(function(){\nvar h=String(result);\nvar m=h.match(/data-track-title=\"([^\"]*)\"/);\nif(m)return m[1];\nvar tp=h.match(/class=\"hg-topic-card__title\">([^<]+)</);\nif(tp)return tp[1].trim();\nvar a=h.match(/class=\"hg-drama-card__title\"[^>]*>[\\s\\S]*?<a[^>]*>([\\s\\S]*?)<\\/a>/)||h.match(/class=\"hg-rank-item__title\"[^>]*>[\\s\\S]*?<a[^>]*>([\\s\\S]*?)<\\/a>/);\nif(a)return a[1].replace(/<[^>]*>/g,'').replace(/全集在线观看/g,'').trim();\nreturn '';\n})()"}, "ruleSearch": {"author": "@js:\n(function(){\nvar h=String(result);\nvar tp=h.match(/class=\"hg-topic-card__meta\">[\\s\\S]*?<span>([^<]+)</);\nif(tp)return tp[1].trim();\nvar t=h.match(/data-track-type-name=\"([^\"]*)\"/);\nvar tg=h.match(/class=\"hg-drama-card__tags\">([\\s\\S]*?)<\\/div>/)||h.match(/class=\"hg-rank-item__tags\">([\\s\\S]*?)<\\/div>/);\nvar g='';\nif(tg)g=tg[1].replace(/<span class=\"sr-only\">[\\s\\S]*?<\\/span>/g,'').replace(/<[^>]*>/g,' ').replace(/\\s+/g,' ').trim();\nif(t)return t[1];\nreturn g;\n})()", "bookList": ".hg-list-page .hg-card-grid .hg-drama-card, .hg-list-page .hg-rank-item, .hg-list-page .hg-topic-grid .hg-topic-card", "bookUrl": "@js:\n(function(){\nvar h=String(result);\nvar root='';\ntry{root=String(source.get('hg_line')||'')}catch(e){}\nif(!root||root.indexOf('http')!==0){try{root=String(source.getBookSourceUrl())}catch(e2){root=''}}\nroot=root.split(String.fromCharCode(35,35))[0];\nif(!root||root.indexOf('http')!==0)root=String(baseUrl||'').split(String.fromCharCode(35,35))[0].replace(/\\/$/,'');\nroot=root.replace(/\\/$/,'');\nvar tp=h.match(/href=\"(\\/topics\\/[a-zA-Z0-9\\-]+\\/)\"/);\nif(tp)return root+tp[1];\nvar mv=h.match(/href=\"(\\/video\\/\\d+\\/)\"/);\nif(mv)return root+mv[1];\nreturn '';\n})()", "checkKeyWord": "全班地铁求生", "coverUrl": "@js:\n(function(){\nvar h=String(result);\nvar m=h.match(/data-src=\"([^\"]+)\"/);\nif(!m)return '';\nvar o=m[1];\nreturn o+(o.indexOf('?')<0?'?':'&')+'hgimgv=2';\n})()", "intro": "@js:\n(function(){\nvar h=String(result);\nvar tp=h.match(/class=\"hg-topic-card__meta\">[\\s\\S]*?<span>([^<]+)</);\nif(tp)return tp[1].trim();\nvar d=h.match(/class=\"hg-drama-card__desc\">([\\s\\S]*?)<\\/p>/)||h.match(/class=\"hg-rank-item__desc\">([\\s\\S]*?)<\\/p>/);\nreturn d?d[1].replace(/<[^>]*>/g,'').trim():'';\n})()", "kind": "@js:\n(function(){\nvar h=String(result);\nvar tp=h.match(/class=\"hg-topic-card__meta\">[\\s\\S]*?<span>([^<]+)</);\nif(tp)return '专题合集';\nvar t=h.match(/data-track-type-name=\"([^\"]*)\"/);\nvar tg=h.match(/class=\"hg-drama-card__tags\">([\\s\\S]*?)<\\/div>/)||h.match(/class=\"hg-rank-item__tags\">([\\s\\S]*?)<\\/div>/);\nvar g='';\nif(tg)g=tg[1].replace(/<span class=\"sr-only\">[\\s\\S]*?<\\/span>/g,'').replace(/<[^>]*>/g,' ').replace(/\\s+/g,' ').trim();\nif(t)return t[1]+' · '+g;\nreturn g;\n})()", "lastChapter": ".hg-drama-card__episode@data-ep-base||.hg-drama-card__episode@text", "name": "@js:\n(function(){\nvar h=String(result);\nvar m=h.match(/data-track-title=\"([^\"]*)\"/);\nif(m)return m[1];\nvar tp=h.match(/class=\"hg-topic-card__title\">([^<]+)</);\nif(tp)return tp[1].trim();\nvar a=h.match(/class=\"hg-drama-card__title\"[^>]*>[\\s\\S]*?<a[^>]*>([\\s\\S]*?)<\\/a>/)||h.match(/class=\"hg-rank-item__title\"[^>]*>[\\s\\S]*?<a[^>]*>([\\s\\S]*?)<\\/a>/);\nif(a)return a[1].replace(/<[^>]*>/g,'').replace(/全集在线观看/g,'').trim();\nreturn '';\n})()"}, "ruleToc": {"chapterList": "@js:\n(function(){\ntry{book.setType(4)}catch(e){}\nvar h=String(java.ajax(String(baseUrl)));\nvar root='';\ntry{root=String(source.get('hg_line')||'')}catch(e){}\nif(!root||root.indexOf('http')!==0){try{root=String(source.getBookSourceUrl())}catch(e2){root=''}}\nroot=root.split(String.fromCharCode(35,35))[0];\nif(!root||root.indexOf('http')!==0)root=String(baseUrl||'').split(String.fromCharCode(35,35))[0].replace(/\\/$/,'');\nroot=root.replace(/\\/$/,'');\nvar list=new Packages.java.util.ArrayList();\nvar TAB=String.fromCharCode(9);\nvar m=h.match(/data-track-total-episode=\"(\\d+)\"/);\nif(m){\n  var total=parseInt(m[1]);\n  var vr=String(baseUrl).replace(/\\/$/,'').replace(/\\/ep-\\d+$/,'');\n  for(var i=1;i<=total;i++){list.add('第'+i+'集'+TAB+vr+(i===1?'/':'/ep-'+i+'/'));}\n  return list;\n}\nvar li=h.indexOf('hg-list-page');\nif(li<0){\n  var vr2=String(baseUrl).replace(/\\/$/,'').replace(/\\/ep-\\d+$/,'');\n  list.add('第1集'+TAB+vr2+'/');\n  return list;\n}\nvar body=h.substring(li);\nvar re=/data-track-title=\"([^\"]*)\"/g,mm;\nwhile((mm=re.exec(body))!=null){\n  var st=body.lastIndexOf('<div',mm.index);\n  var seg=body.substring(st,st+1500);\n  var u=seg.match(/href=\"(\\/video\\/\\d+\\/)\"/);\n  if(!u)continue;\n  list.add(mm[1]+TAB+root+u[1]);\n}\nif(list.size()===0)list.add('专题视频'+TAB+root+'/');\nreturn list;\n})()", "chapterName": "@js:\n(function(){\nvar s=''+result;var i=s.indexOf(String.fromCharCode(9));return i>0?s.substring(0,i):s;\n})()", "chapterUrl": "@js:\n(function(){\nvar s=''+result;var i=s.indexOf(String.fromCharCode(9));return i>0?s.substring(i+1):s;\n})()"}, "searchUrl": "{{source.get('hg_line') ? String(source.get('hg_line')) : 'https://l205.arj2ftl0.cc'}}/search/video/{{encodeURIComponent(key)}}/", "weight": 0},{"bookSourceGroup": "日常", "bookSourceName": "笔趣阁⛅", "bookSourceType": 0, "bookSourceUrl": "https://www.bqquge.org/", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "[\n  {\n    \"title\": \"🔖状态🔖\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"title\": \"排行\",\n    \"url\": \"https://www.bqquge.org/paihang{{page == 1 ? '' : '/' + page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"连载\",\n    \"url\": \"https://www.bqquge.org/lianzai{{page == 1 ? '' : '/' + page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"完结\",\n    \"url\": \"https://www.bqquge.org/wanjie{{page == 1 ? '' : '/' + page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"🔖分类🔖\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"title\": \"玄幻\",\n    \"url\": \"https://www.bqquge.org/xuanhuan{{page == 1 ? '' : '/' + page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"奇幻\",\n    \"url\": \"https://www.bqquge.org/qihuan{{page == 1 ? '' : '/' + page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"武侠\",\n    \"url\": \"https://www.bqquge.org/wuxia{{page == 1 ? '' : '/' + page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"仙侠\",\n    \"url\": \"https://www.bqquge.org/xianxia{{page == 1 ? '' : '/' + page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"都市\",\n    \"url\": \"https://www.bqquge.org/dushi{{page == 1 ? '' : '/' + page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"军事\",\n    \"url\": \"https://www.bqquge.org/junshi{{page == 1 ? '' : '/' + page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"历史\",\n    \"url\": \"https://www.bqquge.org/lishi{{page == 1 ? '' : '/' + page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"游戏\",\n    \"url\": \"https://www.bqquge.org/youxi{{page == 1 ? '' : '/' + page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"体育\",\n    \"url\": \"https://www.bqquge.org/tiyu{{page == 1 ? '' : '/' + page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"科幻\",\n    \"url\": \"https://www.bqquge.org/kehuan{{page == 1 ? '' : '/' + page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"悬疑\",\n    \"url\": \"https://www.bqquge.org/xuanyi{{page == 1 ? '' : '/' + page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"轻小\",\n    \"url\": \"https://www.bqquge.org/qingxiao{{page == 1 ? '' : '/' + page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"穿越\",\n    \"url\": \"https://www.bqquge.org/chuanyue{{page == 1 ? '' : '/' + page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"言情\",\n    \"url\": \"https://www.bqquge.org/yanqing{{page == 1 ? '' : '/' + page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  }\n]", "lastUpdateTime": "1793084445743", "respondTime": 180000, "ruleBookInfo": {"author": "p.0@text", "coverUrl": "", "intro": "class.des@p@text", "kind": "p.1@text", "name": "h1@text", "wordCount": "p.3@text"}, "ruleContent": {"content": ".con@all", "nextContentUrl": "text.下一页@href"}, "ruleExplore": {"author": "p.1@text", "bookList": "class.item", "bookUrl": "a@href", "coverUrl": "img@src", "kind": "p.0@span.1@text", "lastChapter": "ul@a.0@text", "name": "h3@a@text"}, "ruleSearch": {"author": "p.1@text", "bookList": "class.item", "bookUrl": "a@href", "coverUrl": "img@src", "lastChapter": "ul@a.0@text", "name": "h3@text"}, "ruleToc": {"chapterList": "class.dir clear@li", "chapterName": "a@text", "chapterUrl": "a@href"}, "searchUrl": "https://www.bqquge.org/so/{{key}}{{page == 1 ? '' : '/' + page}}", "weight": 0},{"bookSourceComment": "发布页：https://huangguoai.pages.dev\nhttps://huang-guo.pages.dev", "bookSourceGroup": "影视,AI,R18", "bookSourceName": "黄果短剧🔞", "bookSourceType": 4, "bookSourceUrl": "https://l205.arj2ftl0.cc", "bookUrlPattern": "https?://[^/]+/video/\\d+(?:/ep-\\d+)?/?$", "concurrentRate": "1/1500", "coverDecodeJs": "(function(){\ntry{\nvar baos=new Packages.java.io.ByteArrayOutputStream();\nvar buf=new Packages.java.lang.String('00000000000000000000000000000000').getBytes();\nvar n=result.read(buf);\nwhile(n>0){baos.write(buf,0,n);n=result.read(buf)}\nvar enc=baos.toByteArray();\nif(!enc||enc.length<32)return enc;\nvar b0=(enc[0]+256)%256,b1=(enc[1]+256)%256,b2=(enc[2]+256)%256;\nif((b0===255&&b1===216)||(b0===137&&b1===80&&b2===78)||(b0===71&&b1===73&&b2===70)||(b0===82&&b1===73&&b2===70))return enc;\nif(enc.length%16!==0)return enc;\nvar Cipher=Packages.javax.crypto.Cipher;\nvar SKS=Packages.javax.crypto.spec.SecretKeySpec;\nvar IVS=Packages.javax.crypto.spec.IvParameterSpec;\nvar c=Cipher.getInstance('AES/CBC/NoPadding');\nc.init(Cipher.DECRYPT_MODE,new SKS(new Packages.java.lang.String('f5d965df75336270').getBytes('UTF-8'),'AES'),new IVS(new Packages.java.lang.String('97b60394abc2fbe1').getBytes('UTF-8')));\nvar dec=c.doFinal(enc);\nif(!dec||dec.length<32)return enc;\nvar eoi=-1;\nfor(var i=dec.length-2;i>0;i--){\n  if((dec[i]+256)%256===255&&(dec[i+1]+256)%256===217){eoi=i;break}\n}\nif(eoi>0&&eoi+2<dec.length)return Packages.java.util.Arrays.copyOf(dec,eoi+2);\nreturn dec;\n}catch(e){return null}\n})()\n", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "AI成人短剧::https://l205.arj2ftl0.cc/ai-duanju/{{page}}/&&AI成人漫剧::https://l205.arj2ftl0.cc/ai-manju/{{page}}/&&AI换脸::https://l205.arj2ftl0.cc/ai-huanlian/{{page}}/&&AI魔改::https://l205.arj2ftl0.cc/ai-mogai/{{page}}/&&热播排行榜::https://l205.arj2ftl0.cc/ranks/hot/&&精品专题::https://l205.arj2ftl0.cc/topics/hot-aiduanju/&&全部专题::https://l205.arj2ftl0.cc/topics/", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 14; Pixel 8 Build/UQ1A.240105.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/131.0.6778.81 Mobile Safari/537.36\",\"Accept\":\"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\",\"Accept-Language\":\"zh-CN,zh;q=0.9,en;q=0.8\",\"Referer\":\"https://l205.arj2ftl0.cc/\"}", "lastUpdateTime": "1793076861771", "loginUi": "[{\"name\": \"黄果短剧 · 线路面板\", \"type\": \"label\", \"style\": {\"layout_flexBasisPercent\": 1}}, {\"name\": \"发布页地址\", \"type\": \"text\", \"key\": \"发布页地址\", \"default\": \"https://huangguoai.pages.dev/publish.js\", \"hint\": \"需以 http:// 或 https:// 开头\", \"style\": {\"layout_flexBasisPercent\": 1}}, {\"name\": \"获取网址并测速\", \"type\": \"button\", \"action\": \"FQ_hgGo()\", \"style\": {\"layout_flexBasisPercent\": 1}}, {\"name\": \"测速结果 · 点按切换\", \"type\": \"label\", \"style\": {\"layout_flexBasisPercent\": 1}}, {\"name\": \"线路1\", \"type\": \"button\", \"viewName\": \"FQ_siteName(0)\", \"action\": \"FQ_hgPick(0)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路2\", \"type\": \"button\", \"viewName\": \"FQ_siteName(1)\", \"action\": \"FQ_hgPick(1)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路3\", \"type\": \"button\", \"viewName\": \"FQ_siteName(2)\", \"action\": \"FQ_hgPick(2)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路4\", \"type\": \"button\", \"viewName\": \"FQ_siteName(3)\", \"action\": \"FQ_hgPick(3)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路5\", \"type\": \"button\", \"viewName\": \"FQ_siteName(4)\", \"action\": \"FQ_hgPick(4)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路6\", \"type\": \"button\", \"viewName\": \"FQ_siteName(5)\", \"action\": \"FQ_hgPick(5)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路7\", \"type\": \"button\", \"viewName\": \"FQ_siteName(6)\", \"action\": \"FQ_hgPick(6)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路8\", \"type\": \"button\", \"viewName\": \"FQ_siteName(7)\", \"action\": \"FQ_hgPick(7)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路9\", \"type\": \"button\", \"viewName\": \"FQ_siteName(8)\", \"action\": \"FQ_hgPick(8)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路10\", \"type\": \"button\", \"viewName\": \"FQ_siteName(9)\", \"action\": \"FQ_hgPick(9)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路11\", \"type\": \"button\", \"viewName\": \"FQ_siteName(10)\", \"action\": \"FQ_hgPick(10)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"线路12\", \"type\": \"button\", \"viewName\": \"FQ_siteName(11)\", \"action\": \"FQ_hgPick(11)\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"当前线路\", \"type\": \"button\", \"action\": \"FQ_hgCur()\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"检查登录状态\", \"type\": \"button\", \"action\": \"FQ_hgChk()\", \"style\": {\"layout_flexBasisPercent\": 0.32}}, {\"name\": \"恢复默认\", \"type\": \"button\", \"action\": \"FQ_hgRst()\", \"style\": {\"layout_flexBasisPercent\": 0.32}}]", "loginUrl": "function hgST(s){s=String(s==null?'':s);return s.replace(/\\/+$/,'')}\nfunction hgNL(){return String.fromCharCode(10)}\nfunction hgQ(c){return String.fromCharCode(34)+c+String.fromCharCode(34)}\nfunction hgDef(){return 'https://l205.arj2ftl0.cc'}\nfunction hgPub(){return 'https://huangguoai.pages.dev/publish.js'}\nfunction hgSubs(){return ['thu','pku','fdu','sjtu','zju','nju','xmu','sysu','whu','jlu','scu','ruc','bnu','nku','tju','sdu','hust','xjtu','hit']}\nfunction hgRoots(){return ['arj2ftl0.cc','40ygo615.cc','h2na6qa39.cc']}\nfunction hgHost(u){var s=hgST(u).replace(/^https?:\\/\\//,'');var i=s.indexOf('/');return i>0?s.substring(0,i):s}\nfunction hgShort(h){h=String(h||'');var d=h.split('.');var t=d[0]||h;if(t.length>13)t=t.substring(0,13);return t}\nfunction hgGV(k,d){var v='';try{v=String(source.get(k)||'')}catch(e){}\n  if(!v||v=='null'||v=='undefined')v=d;return v?hgST(v):''}\nfunction hgSV(k,v){try{source.put(k,String(v))}catch(e){}}\nfunction hgT(t){try{java.longToast(t)}catch(e){try{java.toast(t)}catch(e2){}}}\nfunction hgSites(){var r=hgGV('hg_sites','');var a=[];if(r){try{a=JSON.parse(r)}catch(e){}}return a}\nfunction hgCand(){\n  var p=hgGV('pub',hgPub());\n  var h='';\n  try{h=String(java.ajax(p))}catch(e){}\n  if(h.length<500){try{h=String(java.ajax(hgPub()))}catch(e2){}}\n  var roots=[];\n  if(h.length>=500){\n    var m=h.match(/var\\s+urls\\s*=\\s*\\[([\\s\\S]*?)\\]/);\n    if(m){var re=/['\"]([a-z0-9.\\-]+\\.[a-z]{2,}\\/?)['\"]/gi,mm;\n      while((mm=re.exec(m[1]))!=null)roots.push(mm[1].replace(/\\/+$/,''))}\n  }\n  if(!roots.length)roots=hgRoots();\n  var cs=[];\n  for(var i=0;i<roots.length;i++)for(var j=0;j<hgSubs().length;j++)cs.push('https://'+hgSubs()[j]+'.'+roots[i]);\n  for(var k=0;k<hgRoots().length;k++)cs.push('https://'+hgRoots()[k]);\n  cs.push(hgDef());\n  var seen={},ls=[];\n  for(var m2=0;m2<cs.length;m2++){if(!seen[cs[m2]]){seen[cs[m2]]=1;ls.push(cs[m2])}}\n  return ls}\nfunction hgProbe(u){\n  var t0=Date.now();\n  try{\n    var r=java.ajax(u+'/');\n    var b=String(r);\n    if(b.length>20000)return {ok:true,ms:Date.now()-t0};\n  }catch(e){}\n  return {ok:false,ms:-1}}\nfunction FQ_siteName(i){\n  try{\n    var a=hgSites();\n    if(!a.length)return '线路'+(i+1);\n    if(i>=a.length)return '';\n    var s=a[i];\n    var cur=hgGV('hg_line',hgDef());\n    return hgShort(s.host)+' '+s.ms+'ms'+(s.url===cur?' ✓':'');\n  }catch(e){return '线路'+(i+1)}\n}\nfunction FQ_hgGo(){\n  try{\n    var p=hgGV('pub',hgPub());\n    if(!p||p.indexOf('http')!=0){hgT('发布页地址无效：需以 http:// 或 https:// 开头');return}\n    hgT('正在抓取发布页并测速...');\n    var ls=hgCand();\n    var urls=[];\n    for(var i=0;i<ls.length;i++)urls.push(ls[i]+'/');\n    var rows=[];\n    var res=null;\n    try{res=java.ajaxAll(urls)}catch(e){}\n    if(res&&res.length){\n      for(var j=0;j<res.length&&j<ls.length;j++){\n        var r=res[j];\n        var code=0,ct=-1,bl=0;\n        try{code=r.raw.code()}catch(e){}\n        try{ct=r.callTime()}catch(e2){}\n        try{bl=String(r.body()).length}catch(e3){}\n        if(code>=200&&code<400&&bl>20000)rows.push({url:ls[j],host:hgHost(ls[j]),ms:ct});\n      }\n    }else{\n      for(var j2=0;j2<ls.length;j2++){\n        var p2=hgProbe(ls[j2]);\n        if(p2.ok)rows.push({url:ls[j2],host:hgHost(ls[j2]),ms:p2.ms});\n      }\n    }\n    if(!rows.length){hgT('测速完成：'+ls.length+' 条线路全部不可用');return}\n    rows.sort(function(x,y){return x.ms-y.ms});\n    rows=rows.slice(0,12);\n    hgSV('hg_sites',JSON.stringify(rows));\n    hgSV('hg_line',rows[0].url);\n    hgSV('hg_line_ts',String(Date.now()));\n    hgT('测速完成（'+ls.length+' 条，可用 '+rows.length+' 条）'+hgNL()+'已选最快：'+rows[0].host+'（'+rows[0].ms+'ms）'+hgNL()+'若按钮名未刷新，重新打开本面板即可');\n    try{java.reLoginView(false)}catch(e){}\n  }catch(e){hgT('测速失败：'+String(e).substring(0,100))}\n}\nfunction FQ_hgPick(i){\n  try{\n    var a=hgSites();\n    if(!a.length||!a[i]){\n      hgT('该线路尚未测速，请先点「获取网址并测速」');\n      return;\n    }\n    hgSV('hg_line',a[i].url);\n    hgSV('hg_line_ts',String(Date.now()));\n    hgT('已选择网站：'+a[i].host+hgNL()+'延迟：'+a[i].ms+'ms');\n    try{java.reLoginView(false)}catch(e){}\n  }catch(e){hgT('切换失败：'+String(e).substring(0,80))}\n}\nfunction FQ_hgCur(){\n  try{hgT('当前线路：'+hgGV('hg_line',hgDef()))}catch(e){}\n}\nfunction FQ_hgChk(){\n  try{\n    var L=hgGV('hg_line',hgDef());\n    var h='';\n    try{h=String(java.ajax(L+'/profile/'))}catch(e){}\n    if(h.length<2000){hgT('无法连接线路：'+L+hgNL()+'请检查网络或切换线路');return}\n    var guest=h.indexOf('data-auth-open='+hgQ('login')+'>'+String.fromCharCode(30331,24405,47,27880,20876))>=0;\n    var dash=h.indexOf('ID'+String.fromCharCode(65306)+String.fromCharCode(8212))>=0;\n    var out=h.indexOf(String.fromCharCode(36864,20986))>=0||h.indexOf('signOut')>=0||h.indexOf('logout')>=0;\n    if(guest&&dash)hgT('游客状态（未登录）'+hgNL()+'搜索/详情/目录/播放均可正常使用'+hgNL()+'登录后可看收藏与观看历史'+hgNL()+'当前线路：'+L);\n    else if(out)hgT('已登录'+hgNL()+'当前线路：'+L);\n    else hgT('状态未知（页面结构可能已变化）'+hgNL()+'当前线路：'+L);\n  }catch(e){hgT('检查失败：'+String(e).substring(0,80))}\n}\nfunction FQ_hgRst(){\n  try{\n    hgSV('pub',hgPub());hgSV('hg_line',hgDef());hgSV('hg_line_ts','0');hgSV('hg_sites','');\n    hgT('已恢复默认'+hgNL()+'线路：'+hgDef());\n    try{java.reLoginView(false)}catch(e){}\n  }catch(e){}\n}\nfunction login(){\n  try{java.longToast('当前为游客模式，无需登录');}catch(e){try{java.toast('当前为游客模式，无需登录')}catch(e2){}}\n}\n", "respondTime": 180000, "ruleBookInfo": {"author": "@js:\n(function(){\nvar h=String(result);\nvar a=h.match(/<meta name=author content=\"([^\"]*)\"/);\nif(a)return a[1];\nvar b=h.match(/class=\"hg-topic-banner__body\"[^>]*>[\\s\\S]*?<p>([^<]*)<\\/p>/);\nreturn b?b[1].substring(0,40):'黄果短剧';\n})()", "coverUrl": "@js:\n(function(){\nvar h=String(result);\nvar m=h.match(/data-history=\"[^\"]*\"[^>]*>/);\nif(m){\n  var d=m[0].replace(/&#34;/g,'\"').replace(/&quot;/g,'\"').replace(/&amp;/g,'&');\n  var c=d.match(/\"cover\":\"([^\"]+)\"/);\n  if(c){var o=c[1];if(o.indexOf('http')!==0)o='https://pic.drleao.cn'+o;return o+(o.indexOf('?')<0?'?':'&')+'hgimgv=2';}\n}\nvar ds=h.match(/data-src=\"(https:\\/\\/pic\\.[^\"]+)\"/);\nif(ds){var o2=ds[1];return o2+(o2.indexOf('?')<0?'?':'&')+'hgimgv=2';}\nreturn '';\n})()", "intro": "meta[name=description]@content", "kind": "@js:\n(function(){\nvar h=String(result);\nvar t=h.match(/data-track-total-episode=\"(\\d+)\"/);\nif(t)return t[1]+'集';\nvar g=h.match(/class=\"hg-topic-extra-pc\">([^<]*)<\\/span>/);\nif(g)return g[1];\nreturn '';\n})()", "name": "@js:\n(function(){\nvar h=String(result);\nvar m=h.match(/<h1[^>]*class=\"hg-web-play__title\"[^>]*>([^<]*)<\\/h1>/);\nif(m)return m[1].trim();\nvar t=h.match(/<h1[^>]*>([^<]*)<\\/h1>/);\nif(t)return t[1].replace(/介绍$/,'').trim();\nvar og=h.match(/property=\"og:title\" content=\"([^\"]*)\"/);\nif(og)return og[1].replace(/_免费在线观看.*$/,'').trim();\nreturn '';\n})()"}, "ruleContent": {"content": "@js:\n(function(){\nvar h = String(java.ajax(String(baseUrl)));\nvar m = h.match(/<source src=\"([^\"]+)\"/);\nreturn m ? m[1].split('&amp;').join('&') : '';\n})()"}, "ruleExplore": {"author": "@js:\n(function(){\nvar h=String(result);\nvar tp=h.match(/class=\"hg-topic-card__meta\">[\\s\\S]*?<span>([^<]+)</);\nif(tp)return tp[1].trim();\nvar t=h.match(/data-track-type-name=\"([^\"]*)\"/);\nvar tg=h.match(/class=\"hg-drama-card__tags\">([\\s\\S]*?)<\\/div>/)||h.match(/class=\"hg-rank-item__tags\">([\\s\\S]*?)<\\/div>/);\nvar g='';\nif(tg)g=tg[1].replace(/<span class=\"sr-only\">[\\s\\S]*?<\\/span>/g,'').replace(/<[^>]*>/g,' ').replace(/\\s+/g,' ').trim();\nif(t)return t[1];\nreturn g;\n})()", "bookList": ".hg-list-page .hg-card-grid .hg-drama-card, .hg-list-page .hg-rank-item, .hg-list-page .hg-topic-grid .hg-topic-card", "bookUrl": "@js:\n(function(){\nvar h=String(result);\nvar root='';\ntry{root=String(source.get('hg_line')||'')}catch(e){}\nif(!root||root.indexOf('http')!==0){try{root=String(source.getBookSourceUrl())}catch(e2){root=''}}\nroot=root.split(String.fromCharCode(35,35))[0];\nif(!root||root.indexOf('http')!==0)root=String(baseUrl||'').split(String.fromCharCode(35,35))[0].replace(/\\/$/,'');\nroot=root.replace(/\\/$/,'');\nvar tp=h.match(/href=\"(\\/topics\\/[a-zA-Z0-9\\-]+\\/)\"/);\nif(tp)return root+tp[1];\nvar mv=h.match(/href=\"(\\/video\\/\\d+\\/)\"/);\nif(mv)return root+mv[1];\nreturn '';\n})()", "coverUrl": "@js:\n(function(){\nvar h=String(result);\nvar m=h.match(/data-src=\"([^\"]+)\"/);\nif(!m)return '';\nvar o=m[1];\nreturn o+(o.indexOf('?')<0?'?':'&')+'hgimgv=2';\n})()", "intro": "@js:\n(function(){\nvar h=String(result);\nvar tp=h.match(/class=\"hg-topic-card__meta\">[\\s\\S]*?<span>([^<]+)</);\nif(tp)return tp[1].trim();\nvar d=h.match(/class=\"hg-drama-card__desc\">([\\s\\S]*?)<\\/p>/)||h.match(/class=\"hg-rank-item__desc\">([\\s\\S]*?)<\\/p>/);\nreturn d?d[1].replace(/<[^>]*>/g,'').trim():'';\n})()", "kind": "@js:\n(function(){\nvar h=String(result);\nvar tp=h.match(/class=\"hg-topic-card__meta\">[\\s\\S]*?<span>([^<]+)</);\nif(tp)return '专题合集';\nvar t=h.match(/data-track-type-name=\"([^\"]*)\"/);\nvar tg=h.match(/class=\"hg-drama-card__tags\">([\\s\\S]*?)<\\/div>/)||h.match(/class=\"hg-rank-item__tags\">([\\s\\S]*?)<\\/div>/);\nvar g='';\nif(tg)g=tg[1].replace(/<span class=\"sr-only\">[\\s\\S]*?<\\/span>/g,'').replace(/<[^>]*>/g,' ').replace(/\\s+/g,' ').trim();\nif(t)return t[1]+' · '+g;\nreturn g;\n})()", "name": "@js:\n(function(){\nvar h=String(result);\nvar m=h.match(/data-track-title=\"([^\"]*)\"/);\nif(m)return m[1];\nvar tp=h.match(/class=\"hg-topic-card__title\">([^<]+)</);\nif(tp)return tp[1].trim();\nvar a=h.match(/class=\"hg-drama-card__title\"[^>]*>[\\s\\S]*?<a[^>]*>([\\s\\S]*?)<\\/a>/)||h.match(/class=\"hg-rank-item__title\"[^>]*>[\\s\\S]*?<a[^>]*>([\\s\\S]*?)<\\/a>/);\nif(a)return a[1].replace(/<[^>]*>/g,'').replace(/全集在线观看/g,'').trim();\nreturn '';\n})()"}, "ruleSearch": {"author": "@js:\n(function(){\nvar h=String(result);\nvar tp=h.match(/class=\"hg-topic-card__meta\">[\\s\\S]*?<span>([^<]+)</);\nif(tp)return tp[1].trim();\nvar t=h.match(/data-track-type-name=\"([^\"]*)\"/);\nvar tg=h.match(/class=\"hg-drama-card__tags\">([\\s\\S]*?)<\\/div>/)||h.match(/class=\"hg-rank-item__tags\">([\\s\\S]*?)<\\/div>/);\nvar g='';\nif(tg)g=tg[1].replace(/<span class=\"sr-only\">[\\s\\S]*?<\\/span>/g,'').replace(/<[^>]*>/g,' ').replace(/\\s+/g,' ').trim();\nif(t)return t[1];\nreturn g;\n})()", "bookList": ".hg-list-page .hg-card-grid .hg-drama-card, .hg-list-page .hg-rank-item, .hg-list-page .hg-topic-grid .hg-topic-card", "bookUrl": "@js:\n(function(){\nvar h=String(result);\nvar root='';\ntry{root=String(source.get('hg_line')||'')}catch(e){}\nif(!root||root.indexOf('http')!==0){try{root=String(source.getBookSourceUrl())}catch(e2){root=''}}\nroot=root.split(String.fromCharCode(35,35))[0];\nif(!root||root.indexOf('http')!==0)root=String(baseUrl||'').split(String.fromCharCode(35,35))[0].replace(/\\/$/,'');\nroot=root.replace(/\\/$/,'');\nvar tp=h.match(/href=\"(\\/topics\\/[a-zA-Z0-9\\-]+\\/)\"/);\nif(tp)return root+tp[1];\nvar mv=h.match(/href=\"(\\/video\\/\\d+\\/)\"/);\nif(mv)return root+mv[1];\nreturn '';\n})()", "checkKeyWord": "全班地铁求生", "coverUrl": "@js:\n(function(){\nvar h=String(result);\nvar m=h.match(/data-src=\"([^\"]+)\"/);\nif(!m)return '';\nvar o=m[1];\nreturn o+(o.indexOf('?')<0?'?':'&')+'hgimgv=2';\n})()", "intro": "@js:\n(function(){\nvar h=String(result);\nvar tp=h.match(/class=\"hg-topic-card__meta\">[\\s\\S]*?<span>([^<]+)</);\nif(tp)return tp[1].trim();\nvar d=h.match(/class=\"hg-drama-card__desc\">([\\s\\S]*?)<\\/p>/)||h.match(/class=\"hg-rank-item__desc\">([\\s\\S]*?)<\\/p>/);\nreturn d?d[1].replace(/<[^>]*>/g,'').trim():'';\n})()", "kind": "@js:\n(function(){\nvar h=String(result);\nvar tp=h.match(/class=\"hg-topic-card__meta\">[\\s\\S]*?<span>([^<]+)</);\nif(tp)return '专题合集';\nvar t=h.match(/data-track-type-name=\"([^\"]*)\"/);\nvar tg=h.match(/class=\"hg-drama-card__tags\">([\\s\\S]*?)<\\/div>/)||h.match(/class=\"hg-rank-item__tags\">([\\s\\S]*?)<\\/div>/);\nvar g='';\nif(tg)g=tg[1].replace(/<span class=\"sr-only\">[\\s\\S]*?<\\/span>/g,'').replace(/<[^>]*>/g,' ').replace(/\\s+/g,' ').trim();\nif(t)return t[1]+' · '+g;\nreturn g;\n})()", "name": "@js:\n(function(){\nvar h=String(result);\nvar m=h.match(/data-track-title=\"([^\"]*)\"/);\nif(m)return m[1];\nvar tp=h.match(/class=\"hg-topic-card__title\">([^<]+)</);\nif(tp)return tp[1].trim();\nvar a=h.match(/class=\"hg-drama-card__title\"[^>]*>[\\s\\S]*?<a[^>]*>([\\s\\S]*?)<\\/a>/)||h.match(/class=\"hg-rank-item__title\"[^>]*>[\\s\\S]*?<a[^>]*>([\\s\\S]*?)<\\/a>/);\nif(a)return a[1].replace(/<[^>]*>/g,'').replace(/全集在线观看/g,'').trim();\nreturn '';\n})()"}, "ruleToc": {"chapterList": "@js:\n(function(){\ntry{book.setType(4)}catch(e){}\nvar h=String(java.ajax(String(baseUrl)));\nvar root='';\ntry{root=String(source.get('hg_line')||'')}catch(e){}\nif(!root||root.indexOf('http')!==0){try{root=String(source.getBookSourceUrl())}catch(e2){root=''}}\nroot=root.split(String.fromCharCode(35,35))[0];\nif(!root||root.indexOf('http')!==0)root=String(baseUrl||'').split(String.fromCharCode(35,35))[0].replace(/\\/$/,'');\nroot=root.replace(/\\/$/,'');\nvar list=new Packages.java.util.ArrayList();\nvar m=h.match(/data-track-total-episode=\"(\\d+)\"/);\nif(m){\n  var total=parseInt(m[1]);\n  var vr=String(baseUrl).replace(/\\/$/,'').replace(/\\/ep-\\d+$/,'');\n  for(var i=1;i<=total;i++){list.add('第'+i+'集'+String.fromCharCode(9)+vr+(i===1?'/':'/ep-'+i+'/'));}\n  return list;\n}\nvar li=h.indexOf('hg-list-page');\nvar body=(li>=0)?h.substring(li):h;\nvar re=/data-track-title=\"([^\"]*)\"/g,mm;\nwhile((mm=re.exec(body))!=null){\n  var st=body.lastIndexOf('<div',mm.index);\n  var seg=body.substring(st,st+1500);\n  var u=seg.match(/href=\"(\\/video\\/\\d+\\/)\"/);\n  if(!u)continue;\n  list.add(mm[1]+String.fromCharCode(9)+root+u[1]);\n}\nif(!list.length)list.add('专题视频'+String.fromCharCode(9)+root+'/');\nreturn list;\n})()", "chapterName": "@js:\n(function(){\nvar s=''+result;var i=s.indexOf(String.fromCharCode(9));return i>0?s.substring(0,i):s;\n})()", "chapterUrl": "@js:\n(function(){\nvar s=''+result;var i=s.indexOf(String.fromCharCode(9));return i>0?s.substring(i+1):s;\n})()"}, "searchUrl": "{{source.get('hg_line') ? String(source.get('hg_line')) : 'https://l205.arj2ftl0.cc'}}/search/video/{{encodeURIComponent(key)}}/", "weight": 0},{"bookSourceComment": "黄区聚合源：小说+视频。发现页按分类浏览，搜索固定搜视频。视频打开章节会弹出内置播放器；小说为图文正文。当前为镜像域名 zwtoacvqie3.hq777.icu，主站 huangqu.top。\nby斯诺伤", "bookSourceGroup": "聚合", "bookSourceName": "黄区", "bookSourceType": 0, "bookSourceUrl": "https://zwtoacvqie3.hq777.icu", "bookUrlPattern": "(xs_ls|videoplay)/\\d+", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\": \"🟡 黄区\", \"style\": {\"layout_wrapBefore\": true, \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"━━━ 🏠 首页 ━━━\", \"style\": {\"layout_wrapBefore\": true, \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"🏠 首页推荐\", \"url\": \"https://zwtoacvqie3.hq777.icu/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}}, {\"title\": \"\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}}, {\"title\": \"━━━ 📖 小说分类 ━━━\", \"style\": {\"layout_wrapBefore\": true, \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"小说首页\", \"url\": \"https://zwtoacvqie3.hq777.icu/category/66/-{{page}}-\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"都市\", \"url\": \"https://zwtoacvqie3.hq777.icu/category/xiaoshuo/69-{{page}}-\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"校园\", \"url\": \"https://zwtoacvqie3.hq777.icu/category/xiaoshuo/70-{{page}}-\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"系统\", \"url\": \"https://zwtoacvqie3.hq777.icu/category/xiaoshuo/72-{{page}}-\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"乱伦\", \"url\": \"https://zwtoacvqie3.hq777.icu/category/xiaoshuo/73-{{page}}-\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"穿越\", \"url\": \"https://zwtoacvqie3.hq777.icu/category/xiaoshuo/74-{{page}}-\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"武侠\", \"url\": \"https://zwtoacvqie3.hq777.icu/category/xiaoshuo/75-{{page}}-\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"同人\", \"url\": \"https://zwtoacvqie3.hq777.icu/category/xiaoshuo/76-{{page}}-\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"科幻\", \"url\": \"https://zwtoacvqie3.hq777.icu/category/xiaoshuo/77-{{page}}-\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"玄幻\", \"url\": \"https://zwtoacvqie3.hq777.icu/category/xiaoshuo/78-{{page}}-\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"明星\", \"url\": \"https://zwtoacvqie3.hq777.icu/category/xiaoshuo/79-{{page}}-\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"历史\", \"url\": \"https://zwtoacvqie3.hq777.icu/category/xiaoshuo/80-{{page}}-\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"奇幻\", \"url\": \"https://zwtoacvqie3.hq777.icu/category/xiaoshuo/81-{{page}}-\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"贤者\", \"url\": \"https://zwtoacvqie3.hq777.icu/category/xiaoshuo/82-{{page}}-\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"━━━ 🎬 视频分类 ━━━\", \"style\": {\"layout_wrapBefore\": true, \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"国产\", \"url\": \"https://zwtoacvqie3.hq777.icu/category/41/---{{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"女优\", \"url\": \"https://zwtoacvqie3.hq777.icu/category/42/---{{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"欧美\", \"url\": \"https://zwtoacvqie3.hq777.icu/category/43/---{{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"自拍\", \"url\": \"https://zwtoacvqie3.hq777.icu/category/41/45---{{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"泄密\", \"url\": \"https://zwtoacvqie3.hq777.icu/category/41/59---{{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"原创\", \"url\": \"https://zwtoacvqie3.hq777.icu/category/41/46---{{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"淫妻\", \"url\": \"https://zwtoacvqie3.hq777.icu/category/41/47---{{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"青年\", \"url\": \"https://zwtoacvqie3.hq777.icu/category/41/48---{{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"精品\", \"url\": \"https://zwtoacvqie3.hq777.icu/category/41/49---{{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"换脸\", \"url\": \"https://zwtoacvqie3.hq777.icu/category/41/62---{{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}]", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 12; V2283A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\", \"Referer\": \"https://zwtoacvqie3.hq777.icu/\"}", "jsLib": "var HQ_HOST = 'https://zwtoacvqie3.hq777.icu';\nvar HQ_KEY = 'UC2FmMyG928hRZY4';\nfunction hqDecode(html) {\n  try {\n    var m = String(html).match(/APP\\.Index\\('([A-Za-z0-9_-]+)'\\)/);\n    if (!m) return null;\n    var b64 = m[1].replace(/-/g, '+').replace(/_/g, '/');\n    while (b64.length % 4) b64 += '=';\n    var raw = Packages.android.util.Base64.decode(b64, 2);\n    var i;\n    for (i = 0; i < raw.length; i++) raw[i] = raw[i] ^ HQ_KEY.charCodeAt(i % HQ_KEY.length);\n    var bytes;\n    if (raw[0] == 1) {\n      var inf = new Packages.java.util.zip.Inflater(true);\n      inf.setInput(raw, 1, raw.length - 1);\n      var out = new Packages.java.io.ByteArrayOutputStream();\n      var buf = Packages.java.lang.reflect.Array.newInstance(Packages.java.lang.Byte.TYPE, 8192);\n      var n;\n      while (!inf.finished()) {\n        n = inf.inflate(buf);\n        if (n <= 0) break;\n        out.write(buf, 0, n);\n      }\n      inf.end();\n      bytes = out.toByteArray();\n    } else {\n      bytes = Packages.java.util.Arrays.copyOfRange(raw, 1, raw.length);\n    }\n    return JSON.parse(String(new Packages.java.lang.String(bytes, 'UTF-8')));\n  } catch (e) { return null; }\n}\nfunction hqEsc(s) {\n  return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\nfunction hqStrip(s) {\n  return String(s == null ? '' : s).replace(/<[^>]+>/g, '');\n}\nfunction hqItems(data) {\n  var arr = [];\n  if (!data) return arr;\n  var lists = [];\n  if (data.list) lists.push(data.list);\n  if (data.book && data.book.list) lists.push(data.book.list);\n  if (data.vod && data.vod.list) lists.push(data.vod.list);\n  if (data.new_vod && data.new_vod.list) lists.push(data.new_vod.list);\n  if (data.cnxh_list && data.cnxh_list.list) lists.push(data.cnxh_list.list);\n  var i, j, it;\n  for (i = 0; i < lists.length; i++) {\n    for (j = 0; j < lists[i].length; j++) {\n      it = lists[i][j];\n      if (it.book_id_attr != null) {\n        arr.push({ t: 'novel', id: '' + it.book_id_attr, name: it.name || '', pic: it.pic || it.picx || '', author: it.author || '', intro: it.notice || it.content || '', extra: it.tags || '' });\n      } else if (it.vod_id != null) {\n        arr.push({ t: 'vod', id: '' + it.vod_id, name: it.vod_name || '', pic: it.vod_pic || '', author: it.vod_author || it.user_name || '', intro: it.vod_blurb || '', extra: it.vod_duration || it.vod_remarks || '' });\n      }\n    }\n  }\n  return arr;\n}\nfunction hqCards(items) {\n  var s = '', i, it;\n  for (i = 0; i < items.length; i++) {\n    it = items[i];\n    s += '<div class=\"hq-item\" data-t=\"' + it.t + '\" data-id=\"' + it.id + '\">'\n      + '<span class=\"hq-name\">' + hqEsc(it.name) + '</span>'\n      + '<img class=\"hq-pic\" src=\"' + hqEsc(it.pic) + '\">'\n      + '<span class=\"hq-author\">' + hqEsc(it.author) + '</span>'\n      + '<span class=\"hq-intro\">' + hqEsc(String(it.intro).slice(0, 200)) + '</span>'\n      + '<span class=\"hq-extra\">' + hqEsc(it.extra) + '</span></div>';\n  }\n  return s;\n}", "lastUpdateTime": "1793024101152", "respondTime": 180000, "ruleBookInfo": {"author": "@js:\n(function () {\n  var u = String(baseUrl);\n  if (u.indexOf('/videoplay/') >= 0) {\n    var d = hqDecode(result);\n    return (d && d.info) ? String(d.info.vod_author || d.info.user_name || '') : '';\n  }\n  return '';\n})()", "coverUrl": "@js:\n(function () {\n  var u = String(baseUrl);\n  if (u.indexOf('/videoplay/') >= 0) {\n    var d = hqDecode(result);\n    return (d && d.info) ? String(d.info.vod_pic || '') : '';\n  }\n  var doc = org.jsoup.Jsoup.parse(String(result));\n  var img = doc.select('img[alt]');\n  return img.size() > 0 ? String(img.get(0).attr('src')) : '';\n})()", "intro": "@js:\n(function () {\n  var u = String(baseUrl);\n  if (u.indexOf('/videoplay/') >= 0) {\n    var d = hqDecode(result);\n    if (!d || !d.info) return '';\n    var s = d.info.vod_blurb || hqStrip(d.info.vod_content);\n    return String(s || '').slice(0, 300);\n  }\n  var doc = org.jsoup.Jsoup.parse(String(result));\n  var el = doc.select('.desc');\n  return el.size() > 0 ? String(el.get(0).text()) : '';\n})()", "kind": "@js:\n(function () {\n  var u = String(baseUrl);\n  if (u.indexOf('/videoplay/') >= 0) {\n    var d = hqDecode(result);\n    if (!d || !d.info) return '';\n    var cls = d.info.vod_class || [];\n    var s = cls.slice(0, 4).join(',');\n    if (d.info.vod_year) s += (s ? ',' : '') + d.info.vod_year;\n    return s;\n  }\n  var doc = org.jsoup.Jsoup.parse(String(result));\n  var txt = String(doc.select('.top .fix').text());\n  var parts = [];\n  var m1 = txt.match(/\\u7c7b\\s*\\u522b\\uff1a(\\S+)/);\n  if (m1) parts.push(m1[1]);\n  var m2 = txt.match(/\\u72b6\\s*\\u6001\\uff1a(\\S+)/);\n  if (m2) parts.push(m2[1]);\n  return parts.join(',');\n})()", "lastChapter": "@js:\n(function () {\n  var u = String(baseUrl);\n  if (u.indexOf('/videoplay/') >= 0) {\n    var d = hqDecode(result);\n    if (!d || !d.info) return '';\n    return d.info.vod_duration ? ('时长 ' + d.info.vod_duration) : String(d.info.vod_remarks || '');\n  }\n  var doc = org.jsoup.Jsoup.parse(String(result));\n  var ps = doc.select('.top .fix p');\n  var i, t;\n  for (i = 0; i < ps.size(); i++) {\n    t = String(ps.get(i).text());\n    if (t.indexOf('最新') >= 0) {\n      var a = ps.get(i).select('a');\n      return a.size() > 0 ? String(a.get(0).text()) : '';\n    }\n  }\n  return '';\n})()", "name": "@js:\n(function () {\n  var u = String(baseUrl);\n  if (u.indexOf('/videoplay/') >= 0) {\n    var d = hqDecode(result);\n    return (d && d.info) ? String(d.info.vod_name || '') : '';\n  }\n  var doc = org.jsoup.Jsoup.parse(String(result));\n  var p = doc.select('.top .fix p');\n  if (p.size() > 0) return String(p.get(0).text()).replace(/^\\u4e66\\s*\\u540d\\uff1a/, '').replace(/^\\s+|\\s+$/g, '');\n  var img = doc.select('img[alt]');\n  return img.size() > 0 ? String(img.get(0).attr('alt')) : '';\n})()"}, "ruleContent": {"content": "@js:\n(function () {\n  var u = String(baseUrl);\n  var NL = String.fromCharCode(10);\n  if (u.indexOf('/videoplay/') >= 0) {\n    var d = hqDecode(result);\n    if (!d || !d.info) return '详情数据解析失败，请刷新重试';\n    var url = d.info.vod_play_url || '';\n    if (!url) return '该视频暂无免费直链（可能需要付费），请到原站观看：' + NL + u;\n    if (book.durChapterIndex == chapter.index) {\n      var pic = d.info.vod_pic || '';\n      var html = '<html><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">'\n        + '<style>html,body{margin:0;padding:0;background:#000;height:100%}video{width:100%;height:100%;object-fit:contain}</style></head>'\n        + '<body><video src=\"' + url + '\" poster=\"' + pic + '\" controls autoplay playsinline></video></body></html>';\n      try { java.startBrowser('about:blank', String(book.name || '播放'), html); } catch (e) {}\n    }\n    return '\\u25b6 ' + String(d.info.vod_name || '') + NL + NL + '播放器已打开；若未弹出，可复制下方地址到手机浏览器打开：' + NL + url;\n  }\n  var doc = org.jsoup.Jsoup.parse(String(result));\n  var el = doc.select('#art-content');\n  if (!el.size()) return '正文解析失败';\n  var box = el.get(0);\n  var bad = box.select('script,ins,iframe,style');\n  var i;\n  for (i = 0; i < bad.size(); i++) bad.get(i).remove();\n  return box.html();\n})()"}, "ruleExplore": {"author": ".hq-author@text", "bookList": "@js:\n(function () {\n  var data = hqDecode(result);\n  var items = hqItems(data);\n  var doc = org.jsoup.Jsoup.parseBodyFragment(hqCards(items));\n  return doc.select('.hq-item');\n})()", "bookUrl": "@js:\n(function () {\n  var s = String(result);\n  var t = (s.match(/data-t=\"(\\w+)\"/) || [])[1];\n  var id = (s.match(/data-id=\"(\\d+)\"/) || [])[1];\n  if (!id) return '';\n  return t === 'novel' ? 'https://zwtoacvqie3.hq777.icu/xs_ls/' + id : 'https://zwtoacvqie3.hq777.icu/videoplay/' + id;\n})()", "coverUrl": ".hq-pic@src", "intro": ".hq-intro@text", "kind": ".hq-extra@text", "name": ".hq-name@text"}, "ruleSearch": {"bookList": "@js:\n(function () {\n  var doc = org.jsoup.Jsoup.parse(String(result));\n  var els = new org.jsoup.select.Elements();\n  els.addAll(doc.select('.novel-grid-item'));\n  els.addAll(doc.select('.videoGridH-item'));\n  return els;\n})()", "bookUrl": "@js:\n(function () {\n  var s = String(result);\n  var m = s.match(/href=\"(\\/xs_ls\\/\\d+)\"/);\n  if (m) return 'https://zwtoacvqie3.hq777.icu' + m[1];\n  m = s.match(/redirect_vod\\('(\\d+)'\\)/);\n  if (m) return 'https://zwtoacvqie3.hq777.icu/videoplay/' + m[1];\n  return '';\n})()", "checkKeyWord": "美女", "coverUrl": "@js:\n(function () {\n  var m = String(result).match(/<img[^>]*src=\"([^\"]+)\"/);\n  return m ? m[1] : '';\n})()", "name": "@js:\n(function () {\n  var s = String(result);\n  var m = s.match(/novel-grid-item-title\">([^<]+)/) || s.match(/videoGridH-item-title\">([^<]+)/);\n  return m ? m[1] : '';\n})()"}, "ruleToc": {"chapterList": "@js:\n(function () {\n  var u = String(baseUrl);\n  book.type = 8;\n  if (u.indexOf('/videoplay/') >= 0) {\n    var d = hqDecode(result);\n    var nm = (d && d.info && d.info.vod_name) || book.name || '播放';\n    var els = new org.jsoup.select.Elements();\n    var a = new org.jsoup.nodes.Element('a');\n    a.attr('href', u);\n    a.text('\\u25b6 ' + nm);\n    els.add(a);\n    return els;\n  }\n  var doc = org.jsoup.Jsoup.parse(String(result));\n  return doc.select('#myList li a');\n})()", "chapterName": "@text", "chapterUrl": "@href"}, "searchUrl": "https://zwtoacvqie3.hq777.icu/so/video/{{key}}/{{page}}", "weight": 0},{"bookSourceComment": "版本: 20261026\n作者: 知秋\n反馈群：766236637\ntg群：https://t.me/+dcNnFFZv5KtmYjIx\n支持全站小说，以及全站漫画\n速率限制为1分钟80章\n注意：请牢记你的密码，用户名为设备码\n\n登录：阅读内「注册/登录同步」登录成功后从 Cookie CYJapiToken 写入源变量。\nJWT 过期时请求会提示并自动打开登录页，关闭后重新同步。\n账号信息 / 上游绑定 / 改密请在 Web 控制台完成。\n\n搜索前缀：\n- 无前缀：小说\n- c: / c：：漫画\n- g: / g：：共享搜索（share=true）；漫画共享用 c:g:关键词\n- 纯数字：书号 bid（当前类型）\n- a:/v:/p：其它类型（暂未开放）\n\n发现类型请用发现页自定义按钮切换；登录页可切男频/女频与 API 地址。\n", "bookSourceGroup": "cyj,api", "bookSourceName": "✿次元姬（知秋）✿", "bookSourceType": 0, "bookSourceUrl": "https://cyj.vv9v.cn", "concurrentRate": "1000", "customButton": true, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": true, "exploreUrl": "@js:\nvar full = { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\nvar half = { layout_flexGrow: 1, layout_flexBasisPercent: 0.45 }\nsyncExplorePrefsFromMap.call(this)\nfunction exploreTypeLabel() {\n  var t = ''\n  try { t = String(source.get('exploreType') || source.get('type') || 'all') } catch (e) { }\n  if (t === 'novel') return '小说'\n  if (t === 'comic') return '漫画'\n  return '全部'\n}\nfunction genderLabel() {\n  try {\n    return String(source.get('gender') || '1') === '0' ? '女频' : '男频'\n  } catch (e) {\n    return '男频'\n  }\n}\nfunction styleLabel() {\n  try {\n    return String(source.get('exploreStyle') || 'default') === 'compact' ? '紧凑' : '默认'\n  } catch (e) {\n    return '默认'\n  }\n}\nvar compact = false\ntry { compact = String(source.get('exploreStyle') || '') === 'compact' } catch (eC) { }\nvar out = []\nout.push({\n  title: '✿ 发现设置 ✿',\n  type: 'button',\n  action: \"java.toast('切换下拉后会自动刷新分类')\",\n  style: full,\n})\nout.push({\n  title: '发现类型',\n  type: 'select',\n  chars: ['全部', '小说', '漫画'],\n  default: exploreTypeLabel(),\n  action: \"applyExploreTypeFromMap(String(infoMap.get().get('发现类型')||''))\",\n  style: half,\n})\nout.push({\n  title: '小说频道',\n  type: 'select',\n  chars: ['男频', '女频'],\n  default: genderLabel(),\n  action: \"applyExploreGenderFromMap(String(infoMap.get().get('小说频道')||''))\",\n  style: half,\n})\nout.push({\n  title: '发现样式',\n  type: 'select',\n  chars: ['默认', '紧凑'],\n  default: styleLabel(),\n  action: \"applyExploreStyleFromMap(String(infoMap.get().get('发现样式')||''))\",\n  style: half,\n})\nout.push({\n  title: '立即刷新发现',\n  type: 'button',\n  action: 'refreshExploreNow()',\n  style: half,\n})\nvar exploreType = String(source.get('exploreType') || source.get('type') || 'all')\nif (exploreType !== 'all' && exploreType !== 'novel' && exploreType !== 'comic') {\n  exploreType = 'all'\n}\ntry { source.put('type', exploreType) } catch (e) { }\nvar gender = String(source.get('gender') || '1')\nvar data = requestApi.call(this, '/explore/init', {\n  type: exploreType,\n  gender: gender,\n}) || []\nvar dense = { layout_flexGrow: 1, layout_flexBasisPercent: 0.2 }\nvar normalPct = 0.25\nfor (var i = 0; i < data.length; i++) {\n  var item = data[i]\n  if (!item || item.title == null) continue\n  var hasUrl = !!(item.url && String(item.url).trim())\n  if (hasUrl) {\n    var st = item.style || {}\n    var pct = normalPct\n    try {\n      if (st.layout_flexBasisPercent != null) pct = Number(st.layout_flexBasisPercent)\n    } catch (eP) { }\n    if (compact) {\n      out.push({\n        title: item.title,\n        url: item.url,\n        style: dense,\n      })\n    } else {\n      out.push({\n        title: item.title,\n        url: item.url,\n        style: {\n          layout_flexGrow: 1,\n          layout_flexBasisPercent: pct > 0 && pct < 1 ? pct : normalPct,\n        },\n      })\n    }\n  } else {\n    out.push(item)\n  }\n}\nJSON.stringify(out)\n", "jsLib": "var DEFAULT_API = 'https://cyj.vv9v.cn'\nvar COOKIE_TOKEN_KEY = 'CYJapiToken'\nfunction bookSourceOf(self) {\n  return (self && self.source) || (typeof source !== 'undefined' ? source : null)\n}\nfunction javaOf(self) {\n  return (self && self.java) || (typeof java !== 'undefined' ? java : null)\n}\nfunction getApiBase() {\n  var bs = bookSourceOf(this)\n  try {\n    var h = String((bs && bs.get('apiHost')) || '').trim()\n    if (h) return h.replace(/\\/$/, '')\n  } catch (e) { }\n  try {\n    var info = JSON.parse(String((bs && bs.getLoginInfo()) || '{}'))\n    var fromLogin = String(info['API地址'] || info['apiHost'] || '').trim()\n    if (fromLogin) return fromLogin.replace(/\\/$/, '')\n  } catch (e2) { }\n  return DEFAULT_API\n}\nvar api = DEFAULT_API\nfunction refreshApi() {\n  api = getApiBase.call(this)\n  return api\n}\nfunction getJwt() {\n  try {\n    var bs = bookSourceOf(this)\n    return String((bs && bs.getVariable()) || '').trim()\n  } catch (e) {\n    return ''\n  }\n}\nfunction asBook(r) {\n  if (r == null) return {}\n  if (typeof r === 'string') {\n    try { r = JSON.parse(r) } catch (e) { return {} }\n  }\n  try {\n    if (r && r.data != null && typeof r.data === 'object' && !Array.isArray(r.data)\n      && (r.code != null || r.msg != null)\n      && r.bid == null && r.type == null && r.name == null) {\n      r = r.data\n    }\n  } catch (e2) { }\n  return r || {}\n}\nfunction loginMap(k) {\n  var bs = bookSourceOf(this)\n  if (!this._mapCache) {\n    try { this._mapCache = bs ? bs.getLoginInfoMap() : null } catch (e) { this._mapCache = null }\n  }\n  var m = this._mapCache\n  if (k == null) return m\n  if (!m) {\n    try {\n      var info = JSON.parse(String((bs && bs.getLoginInfo()) || '{}'))\n      var v = info[k]\n      return v == null ? '' : String(v)\n    } catch (e2) { return '' }\n  }\n  var v2 = m.get ? m.get(k) : m[k]\n  return v2 == null ? '' : String(v2)\n}\nfunction headerGet(headers, name) {\n  if (!headers) return ''\n  var want = String(name || '').toLowerCase()\n  try {\n    if (typeof headers.get === 'function') {\n      var a = headers.get(name)\n      if (a) return String(a)\n      var b = headers.get(want)\n      if (b) return String(b)\n    }\n  } catch (e0) { }\n  try {\n    if (typeof headers.get === 'function') {\n      var names = headers.names ? headers.names() : null\n      if (names) {\n        var it = names.iterator ? names.iterator() : null\n        if (it) {\n          while (it.hasNext()) {\n            var n = String(it.next())\n            if (n.toLowerCase() === want) {\n              var hv = headers.get(n)\n              if (hv) return String(hv)\n            }\n          }\n        }\n      }\n    }\n  } catch (e1) { }\n  try {\n    var keys = Object.keys(headers)\n    for (var i = 0; i < keys.length; i++) {\n      if (String(keys[i]).toLowerCase() === want) return String(headers[keys[i]] || '')\n    }\n  } catch (e2) { }\n  return ''\n}\nfunction getApiUrl(path, data) {\n  refreshApi.call(this)\n  var token = getJwt.call(this)\n  data = data || {}\n  var qs = Object.entries(data)\n    .filter(function (kv) { return kv[1] !== undefined && kv[1] !== null && kv[1] !== '' })\n    .map(function (v) { return encodeURIComponent(v[0]) + '=' + encodeURIComponent(String(v[1])) })\n    .join('&')\n  var option = {\n    method: 'GET',\n    webView: false,\n    headers: {\n      Authorization: 'Bearer ' + token,\n    },\n  }\n  return api + path + (qs ? ('?' + qs) : '') + ',' + JSON.stringify(option)\n}\nfunction requestApi(path, data) {\n  var url = getApiUrl.call(this, path, data || {})\n  var javaObj = javaOf(this)\n  if (!javaObj) return null\n  var requestId = '(none)'\n  try {\n    var resp = javaObj.connect(url)\n    try {\n      var hid = headerGet(resp.headers(), 'X-Request-Id')\n      if (hid) requestId = hid\n    } catch (eH) { }\n    var httpCode = 0\n    try { httpCode = Number(resp.code()) } catch (eC) { }\n    var raw = String(resp.body() || '')\n    if (httpCode === 401 || httpCode === 403) {\n      javaObj.log('请求 ' + path + ' HTTP ' + httpCode + ' requestId=' + requestId)\n      javaObj.longToast('\\n未登录或无权限 (HTTP ' + httpCode + ')\\n请先在登录页「登录同步」\\nrequestId: ' + requestId)\n      return null\n    }\n    var res = {}\n    try { res = JSON.parse(raw) } catch (eP) {\n      javaObj.log('请求 ' + path + ' 非 JSON：' + raw.slice(0, 200))\n      javaObj.longToast('\\n请求失败\\nrequestId: ' + requestId + '\\n响应不是 JSON')\n      return null\n    }\n    if (res.requestId) requestId = String(res.requestId)\n    var ok = (res.msg == 'success' || res.msg === 'success') && (res.code == null || Number(res.code) >= 0)\n    if (!ok) {\n      var msg = String(res.msg || 'error')\n      javaObj.log('请求失败 ' + path + ' code=' + res.code + ' msg=' + msg + ' requestId=' + requestId)\n      javaObj.longToast('\\n操作失败 code=' + res.code + '\\n' + msg + '\\nrequestId: ' + requestId)\n      return null\n    }\n    if (res.data !== undefined) return res.data\n    return res\n  } catch (e) {\n    try {\n      javaObj.log('请求 ' + path + ' 异常：' + (e.message || e) + ' requestId=' + requestId)\n      javaObj.longToast('\\n请求异常\\n' + (e.message || e) + '\\nrequestId: ' + requestId)\n    } catch (e2) { }\n    return null\n  }\n}\nfunction deviceId() {\n  var javaObj = javaOf(this)\n  if (!javaObj) return ''\n  try {\n    return String(javaObj.androidId() || '').trim()\n  } catch (e1) {\n    return ''\n  }\n}\nfunction isAuthFailResponse(resp) {\n  if (!resp) return false\n  var code = 0\n  try { code = Number(resp.code()) } catch (e) { }\n  if (code === 401 || code === 403) return true\n  var body = ''\n  try { body = String(resp.body() || '') } catch (e2) { }\n  if (!body) return false\n  if (/无效token|token\\s*过期|未登录|unauthorized/i.test(body)) return true\n  try {\n    var j = JSON.parse(body)\n    if (!j) return false\n    var msg = String(j.msg || '')\n    var c = Number(j.code)\n    if ((c < 0 || c === 401 || c === 403) && /token|登录|鉴权|授权|未登录/i.test(msg)) return true\n  } catch (e3) { }\n  return false\n}\nfunction handleAuthFailInLoginCheck(resp) {\n  var javaObj = javaOf(this)\n  var bs = bookSourceOf(this)\n  if (!javaObj || !bs) return resp\n  if (String(bs.get('_authChecking') || '') === '1') return resp\n  var now = Date.now()\n  var last = Number(bs.get('_authReloginAt') || 0)\n  if (last && now - last < 45000) {\n    try { javaObj.toast('登录已过期，请重新登录同步') } catch (eT) { }\n    return resp\n  }\n  try { bs.put('_authReloginAt', String(now)) } catch (eP) { }\n  try { bs.setVariable('') } catch (e0) { }\n  try {\n    javaObj.longToast('\\n登录已过期或无效\\n即将打开登录页，完成后请关闭页面以同步 JWT')\n  } catch (e1) { }\n  try { bs.put('_authChecking', '1') } catch (eC) { }\n  try {\n    var id = deviceId.call(this)\n    var q = id ? ('?id=' + encodeURIComponent(id)) : ''\n    openConsole.call(this, '/login' + q, true)\n    var token = getJwt.call(this)\n    if (!token) return resp\n    try {\n      javaObj.getHeaderMap().put('Authorization', 'Bearer ' + token)\n    } catch (eH) { }\n    try {\n      if (javaObj.getStrResponse) return javaObj.getStrResponse()\n    } catch (eR) {\n      try { javaObj.log('auth retry: ' + eR) } catch (eL) { }\n    }\n    return resp\n  } finally {\n    try { bs.put('_authChecking', '0') } catch (eF) { }\n  }\n}\nfunction openConsole(path, awaitCookie) {\n  refreshApi.call(this)\n  var javaObj = javaOf(this)\n  var bs = bookSourceOf(this)\n  if (!javaObj || !bs) return\n  var base = api + '/console'\n  var p = String(path || '/')\n  if (p.charAt(0) !== '/') p = '/' + p\n  var url = base + p\n  if (awaitCookie) {\n    javaObj.startBrowserAwait(url, '次元姬登录')\n    var token = ''\n    try {\n      token = String(cookie.getKey(api, COOKIE_TOKEN_KEY) || '').trim()\n    } catch (e0) {\n      try { token = String(javaObj.getCookie(api, COOKIE_TOKEN_KEY) || '').trim() } catch (e1) { }\n    }\n    if (!token) {\n      javaObj.longToast('\\n未检测到登录 Cookie（' + COOKIE_TOKEN_KEY + '）\\n请确认在阅读内置浏览器完成登录后关闭页面')\n      return\n    }\n    bs.setVariable(token)\n    javaObj.longToast('\\n✅登录同步成功，JWT 已写入源变量')\n  } else {\n    javaObj.startBrowser(url, '次元姬控制台')\n  }\n}\nfunction parseSearchKey(key) {\n  var keyword = String(key || '').trim()\n  var type = 'novel'\n  var mode = 'novel'\n  var share = false\n  var unavailable = false\n  function peel(re, t, m) {\n    if (re.test(keyword)) {\n      keyword = keyword.replace(re, '').trim()\n      if (t) type = t\n      if (m) mode = m\n      return true\n    }\n    return false\n  }\n  peel(/^c(:|：)/i, 'comic', 'comic')\n    || peel(/^a(:|：)/i, 'audio', 'audio')\n    || peel(/^v(:|：)/i, 'video', 'video')\n    || peel(/^p(:|：)/i, 'publication', 'publication')\n  if (/^g(:|：)/i.test(keyword)) {\n    keyword = keyword.replace(/^g(:|：)/i, '').trim()\n    share = true\n  }\n  if (type !== 'novel' && type !== 'comic') {\n    unavailable = true\n  }\n  return { keyword: keyword, type: type, mode: mode, share: share, unavailable: unavailable }\n}\nfunction resolveBookId(bId) {\n  if (bId && String(bId).match(/^\\d+$/)) return String(bId)\n  try {\n    if (typeof book !== 'undefined' && book && book.bookUrl) {\n      var m = String(book.bookUrl).match(/[?&]bid=(\\d+)/)\n      if (m) return m[1]\n    }\n  } catch (e0) { }\n  try {\n    var bs = bookSourceOf(this)\n    var t = bs && bs.get('tempBookId')\n    if (t) return String(t)\n  } catch (e1) { }\n  return String(bId || '')\n}\nfunction refreshExploreNow() {\n  var javaObj = javaOf(this)\n  var bs = bookSourceOf(this)\n  try {\n    if (javaObj && javaObj.refreshExplore) javaObj.refreshExplore()\n  } catch (e1) {\n    try { javaObj && javaObj.log('java.refreshExplore: ' + e1) } catch (eL) { }\n  }\n  try {\n    if (bs && bs.refreshExplore) bs.refreshExplore()\n  } catch (e2) {\n    try { javaObj && javaObj.log('source.refreshExplore: ' + e2) } catch (eL2) { }\n  }\n}\nfunction mapGet(key) {\n  var k = String(key || '')\n  function ok(v) {\n    if (v == null) return false\n    if (typeof v === 'object') return false\n    var s = String(v)\n    return s !== '' && s.indexOf('{') !== 0 && s !== '[object Object]'\n  }\n  try {\n    if (typeof infoMap !== 'undefined' && infoMap != null) {\n      var v = null\n      try {\n        var whole = infoMap.get()\n        if (whole != null) {\n          if (typeof whole.get === 'function') v = whole.get(k)\n          else v = whole[k]\n        }\n      } catch (e0) { v = null }\n      if (ok(v)) return String(v)\n    }\n  } catch (e) { }\n  try {\n    if (typeof result !== 'undefined' && result != null) {\n      var rv = null\n      try {\n        if (result.get && typeof result.get === 'function') rv = result.get(k)\n      } catch (eG) { rv = null }\n      if (ok(rv)) return String(rv)\n      try {\n        rv = result[k]\n        if (ok(rv)) return String(rv)\n      } catch (eB) { }\n    }\n  } catch (e2) { }\n  return ''\n}\nfunction pickLabel(arg, key, allowed) {\n  var v = (arg != null) ? String(arg) : ''\n  if (v && allowed.indexOf(v) >= 0) return v\n  v = mapGet(key)\n  if (v && allowed.indexOf(v) >= 0) return v\n  return ''\n}\nfunction setGender(g) {\n  var bs = bookSourceOf(this)\n  if (bs) bs.put('gender', String(g))\n  refreshExploreNow.call(this)\n  var javaObj = javaOf(this)\n  if (javaObj) javaObj.longToast('\\n✅发现页频道：' + (String(g) === '0' ? '女频' : '男频'))\n}\nfunction setOrder(order, desc) {\n  var bs = bookSourceOf(this)\n  if (bs) bs.put('order', String(order))\n  var javaObj = javaOf(this)\n  if (javaObj) javaObj.longToast('\\n✅分类排序：' + desc + '\\n打开分类书单时生效')\n}\nfunction setSearchRank(rank, desc) {\n  var bs = bookSourceOf(this)\n  if (bs) bs.put('searchRank', String(rank))\n  var javaObj = javaOf(this)\n  if (javaObj) javaObj.longToast('\\n✅搜索排序：' + desc)\n}\nfunction setExploreType(t) {\n  var bs = bookSourceOf(this)\n  if (bs) {\n    bs.put('exploreType', t)\n    bs.put('type', t)\n  }\n  var label = t\n  if (t == 'all') label = '全部'\n  else if (t == 'novel') label = '小说'\n  else if (t == 'comic') label = '漫画'\n  refreshExploreNow.call(this)\n  var javaObj = javaOf(this)\n  if (javaObj) javaObj.longToast('\\n✅发现类型：' + label)\n}\nfunction setExploreStyle(style) {\n  var bs = bookSourceOf(this)\n  if (bs) bs.put('exploreStyle', String(style || 'default'))\n  refreshExploreNow.call(this)\n  var javaObj = javaOf(this)\n  if (javaObj) javaObj.longToast('\\n✅发现样式：' + (style === 'compact' ? '紧凑（分类更密）' : '默认'))\n}\nfunction applyExploreTypeFromMap(arg) {\n  var v = pickLabel(arg, '发现类型', ['全部', '小说', '漫画'])\n  var t = 'all'\n  if (v === '小说') t = 'novel'\n  else if (v === '漫画') t = 'comic'\n  setExploreType.call(this, t)\n}\nfunction applyExploreGenderFromMap(arg) {\n  var v = pickLabel(arg, '小说频道', ['男频', '女频'])\n  setGender.call(this, v === '女频' ? '0' : '1')\n}\nfunction applyExploreStyleFromMap(arg) {\n  var v = pickLabel(arg, '发现样式', ['默认', '紧凑'])\n  setExploreStyle.call(this, v === '紧凑' ? 'compact' : 'default')\n}\nfunction applyOrderFromMap(arg) {\n  var allowed = ['人气最高', '订阅最多', '最近更新', '最近上架', '最近新书']\n  var v = pickLabel(arg, '分类排序', allowed)\n  var map = {\n    '人气最高': '1',\n    '订阅最多': '2',\n    '最近更新': '3',\n    '最近上架': '4',\n    '最近新书': '6',\n  }\n  setOrder.call(this, map[v] || '1', v || '人气最高')\n}\nfunction applySearchRankFromMap(arg) {\n  var v = pickLabel(arg, '搜索排序', ['按推荐', '按人气', '按销量', '按更新'])\n  var map = {\n    '按推荐': '0',\n    '按人气': '1',\n    '按销量': '2',\n    '按更新': '3',\n  }\n  setSearchRank.call(this, map[v] || '0', v || '按推荐')\n}\nfunction applyForceRefreshFromMap(arg) {\n  var v = pickLabel(arg, '强制刷新章节', ['开', '关'])\n  var on = (v === '开')\n  var bs = bookSourceOf(this)\n  if (bs) bs.put('强制刷新章节', on ? '1' : '0')\n  var javaObj = javaOf(this)\n  if (javaObj) {\n    javaObj.longToast(on\n      ? '\\n✅章节强制刷新已开启\\n无权限时服务端会忽略'\n      : '\\n✅章节强制刷新已关闭')\n  }\n}\nfunction syncExplorePrefsFromMap() {\n  var bs = bookSourceOf(this)\n  if (!bs) return\n  try {\n    if (typeof infoMap === 'undefined' || infoMap == null) return\n    var tl = mapGet('发现类型')\n    if (tl === '小说') { bs.put('exploreType', 'novel'); bs.put('type', 'novel') }\n    else if (tl === '漫画') { bs.put('exploreType', 'comic'); bs.put('type', 'comic') }\n    else if (tl === '全部') { bs.put('exploreType', 'all'); bs.put('type', 'all') }\n    var gl = mapGet('小说频道')\n    if (gl === '女频') bs.put('gender', '0')\n    else if (gl === '男频') bs.put('gender', '1')\n    var sl = mapGet('发现样式')\n    if (sl === '紧凑') bs.put('exploreStyle', 'compact')\n    else if (sl === '默认') bs.put('exploreStyle', 'default')\n  } catch (e) { }\n}\n", "lastUpdateTime": "1792975970938", "loginCheckJs": "; (function (a) {\n  try {\n    if (typeof isAuthFailResponse === 'function' && isAuthFailResponse(a)) {\n      return handleAuthFailInLoginCheck(a)\n    }\n  } catch (e) {\n    try { java.log('loginCheckJs: ' + e) } catch (e2) { }\n  }\n  return a\n})(result)\n", "loginUi": "@js:\nvar fullStyle = { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\nvar halfStyle = { layout_flexGrow: 1, layout_flexBasisPercent: 0.45 }\nvar thirdStyle = { layout_flexGrow: 1, layout_flexBasisPercent: 0.28 }\nfunction btn(name, action, style) {\n  return {\n    name: name,\n    type: 'button',\n    action: action || '',\n    style: style || halfStyle,\n  }\n}\nfunction hdr(title) {\n  return btn('✿ ' + title + ' ✿', \"java.toast('\" + title + \"')\", fullStyle)\n}\nfunction exploreTypeLabel() {\n  var t = ''\n  try { t = String(source.get('exploreType') || source.get('type') || 'all') } catch (e) { }\n  if (t === 'novel') return '小说'\n  if (t === 'comic') return '漫画'\n  return '全部'\n}\nfunction genderLabel() {\n  try {\n    return String(source.get('gender') || '1') === '0' ? '女频' : '男频'\n  } catch (e) {\n    return '男频'\n  }\n}\nfunction orderLabel() {\n  var o = ''\n  try { o = String(source.get('order') || '1') } catch (e) { }\n  var map = {\n    '1': '人气最高',\n    '2': '订阅最多',\n    '3': '最近更新',\n    '4': '最近上架',\n    '6': '最近新书',\n  }\n  return map[o] || '人气最高'\n}\nfunction searchRankLabel() {\n  var o = ''\n  try { o = String(source.get('searchRank') || '0') } catch (e) { }\n  var map = {\n    '0': '按推荐',\n    '1': '按人气',\n    '2': '按销量',\n    '3': '按更新',\n  }\n  return map[o] || '按推荐'\n}\nfunction styleLabel() {\n  try {\n    return String(source.get('exploreStyle') || 'default') === 'compact' ? '紧凑' : '默认'\n  } catch (e) {\n    return '默认'\n  }\n}\nfunction forceRefreshDefault() {\n  try {\n    return String(source.get('强制刷新章节') || '0') === '1' ? '开' : '关'\n  } catch (e) {\n    return '关'\n  }\n}\nfunction jwtEmoji() {\n  try {\n    return String(source.getVariable() || '').trim() ? '✅' : '❌'\n  } catch (e) {\n    return '❌'\n  }\n}\nvar apiDefault = ''\ntry {\n  apiDefault = String(source.get('apiHost') || '')\n} catch (e0) { }\nif (!apiDefault) {\n  try {\n    var info = JSON.parse(String(source.getLoginInfo() || '{}'))\n    apiDefault = String(info['API地址'] || '')\n  } catch (e1) { }\n}\nvar main = [\n  hdr('账号'),\n  btn('注册同步', 'syncRegister()', halfStyle),\n  btn('登录同步', 'syncLogin()', halfStyle),\n  btn('账号信息', 'openAccount()', thirdStyle),\n  btn('上游绑定', 'openUpstream()', thirdStyle),\n  btn('修改密码', 'openPassword()', thirdStyle),\n  btn('查询本地 JWT', 'queryJwt()', fullStyle),\n  hdr('发现设置'),\n  {\n    name: '发现类型',\n    type: 'select',\n    chars: ['全部', '小说', '漫画'],\n    default: exploreTypeLabel(),\n    action: \"applyExploreTypeFromMap(String((result.get&&result.get('发现类型'))||''))\",\n    style: halfStyle,\n  },\n  {\n    name: '小说频道',\n    type: 'select',\n    chars: ['男频', '女频'],\n    default: genderLabel(),\n    action: \"applyExploreGenderFromMap(String((result.get&&result.get('小说频道'))||''))\",\n    style: halfStyle,\n  },\n  {\n    name: '发现样式',\n    type: 'select',\n    chars: ['默认', '紧凑'],\n    default: styleLabel(),\n    action: \"applyExploreStyleFromMap(String((result.get&&result.get('发现样式'))||''))\",\n    style: halfStyle,\n  },\n  {\n    name: '分类排序',\n    type: 'select',\n    chars: ['人气最高', '订阅最多', '最近更新', '最近上架', '最近新书'],\n    default: orderLabel(),\n    action: \"applyOrderFromMap(String((result.get&&result.get('分类排序'))||''))\",\n    style: halfStyle,\n  },\n  {\n    name: '搜索排序',\n    type: 'select',\n    chars: ['按推荐', '按人气', '按销量', '按更新'],\n    default: searchRankLabel(),\n    action: \"applySearchRankFromMap(String((result.get&&result.get('搜索排序'))||''))\",\n    style: halfStyle,\n  },\n  hdr('调试'),\n  { name: 'API地址', type: 'text', default: apiDefault, style: fullStyle },\n  btn('保存 API 地址', 'saveApiHost()', fullStyle),\n  { name: '手动JWT', type: 'text', default: '', style: fullStyle },\n  btn('保存手动 JWT', 'saveManualJwt()', fullStyle),\n  hdr('下载 / 购买'),\n  {\n    name: '强制刷新章节',\n    type: 'toggle',\n    chars: ['关', '开'],\n    default: forceRefreshDefault(),\n    action: \"applyForceRefreshFromMap(String((result.get&&result.get('强制刷新章节'))||''))\",\n    style: fullStyle,\n  },\n  { name: '书籍ID', type: 'text', style: fullStyle },\n  btn('全本后台下载', 'downloadNovel()', fullStyle),\n  { name: '购买数量', type: 'text', default: '5', style: fullStyle },\n  btn('购买全本', 'buy(true)', halfStyle),\n  btn('购买指定数量', 'buy(false)', halfStyle),\n]\nresult = JSON.stringify(main)\n", "loginUrl": "function login() { }\nfunction syncLogin() {\n  refreshApi.call(this)\n  var id = deviceId.call(this)\n  var q = id ? ('?id=' + encodeURIComponent(id)) : ''\n  openConsole.call(this, '/login' + q, true)\n}\nfunction syncRegister() {\n  refreshApi.call(this)\n  var id = deviceId.call(this)\n  if (!id) {\n    java.longToast('\\n无法获取设备 id（oaid/androidId），仍打开注册页')\n  }\n  var q = id ? ('?id=' + encodeURIComponent(id)) : ''\n  openConsole.call(this, '/register' + q, true)\n}\nfunction openAccount() {\n  openConsole.call(this, '/', false)\n}\nfunction openUpstream() {\n  openConsole.call(this, '/upstream', false)\n}\nfunction openPassword() {\n  openConsole.call(this, '/password', false)\n}\nfunction saveApiHost() {\n  var host = String((result && (result['API地址'] || result.get && result.get('API地址'))) || '').trim().replace(/\\/$/, '')\n  if (host && !/^https?:\\/\\//i.test(host)) {\n    return java.longToast('\\n❌API地址须以 http:// 或 https:// 开头')\n  }\n  source.put('apiHost', host)\n  try {\n    var info = JSON.parse(String(source.getLoginInfo() || '{}'))\n    info['API地址'] = host\n    source.putLoginInfo(JSON.stringify(info))\n  } catch (e) { }\n  try {\n    var map = new Packages.java.util.HashMap()\n    map.put('API地址', host)\n    java.upLoginData(map)\n  } catch (e2) { }\n  java.longToast(host ? ('\\n✅API地址已保存：' + host) : '\\n✅已恢复默认 API 地址')\n}\nfunction saveManualJwt() {\n  var token = String((result && (result['手动JWT'] || result.get && result.get('手动JWT'))) || '').trim()\n  if (!token) {\n    return java.longToast('\\n❌请粘贴 JWT')\n  }\n  source.setVariable(token)\n  java.longToast('\\n✅JWT 已写入源变量')\n}\nfunction switchForceChapRefresh() {\n  var old = source.get('强制刷新章节') || '0'\n  var on = old != '1'\n  source.put('强制刷新章节', on ? '1' : '0')\n  java.longToast(on\n    ? '\\n✅章节强制刷新已开启\\n无权限时服务端会忽略'\n    : '\\n✅章节强制刷新已关闭')\n}\nfunction downloadNovel() {\n  var bid = String((result && (result['书籍ID'] || result.get && result.get('书籍ID'))) || '').trim()\n  if (!/^\\d+$/.test(bid)) {\n    return java.toast('请输入有效书籍ID')\n  }\n  var data = requestApi.call(this, '/novel/download', { bid: bid })\n  if (!data) return\n  java.longToast('\\n✅全本下载已提交')\n}\nfunction buy(all) {\n  var bid = String((result && (result['书籍ID'] || result.get && result.get('书籍ID'))) || '').trim()\n  if (!/^\\d+$/.test(bid)) {\n    return java.longToast('\\n❌请输入有效书籍ID')\n  }\n  var data\n  if (all) {\n    data = requestApi.call(this, '/novel/buy_novel', { bid: bid })\n  } else {\n    var num = Number(String((result && (result['购买数量'] || result.get && result.get('购买数量'))) || '5'))\n    if (!num || num <= 0) num = 5\n    data = requestApi.call(this, '/novel/buy_chapter', { bid: bid, num: num })\n  }\n  if (!data) return\n  java.longToast('\\n✅购买完成')\n}\nfunction queryJwt() {\n  var token = getJwt.call(this)\n  if (!token) {\n    return java.longToast('\\n❌尚未登录，请先「注册同步」或「登录同步」')\n  }\n  java.longToast('\\n✅源变量已有 JWT（长度 ' + token.length + '）\\n账号/上游请到 Web 控制台查看')\n}\n", "respondTime": 180000, "ruleBookInfo": {"author": "@js:\nvar r=asBook(result); r.author || ''", "coverUrl": "@js:\nvar r=asBook(result); r.cover || ''", "init": "@js:\nvar d = result\ntry { if (typeof d === 'string') d = JSON.parse(d) } catch (e) { d = {} }\ntry {\n  if (d && d.data != null && typeof d.data === 'object' && !Array.isArray(d.data)\n    && (d.code != null || d.msg != null) && d.bid == null && d.type == null) {\n    d = d.data\n  }\n} catch (eWrap) { }\nvar bid = ''\ntry { bid = String((d && d.bid) || (d && d.id) || '') } catch (e0) { }\nif (!bid) {\n  try {\n    var m = String(baseUrl || '').match(/[?&]bid=(\\d+)/)\n    if (m) bid = m[1]\n  } catch (e1) { }\n}\nvar t = ''\ntry { t = String((d && d.type) || '') } catch (eType) { t = '' }\nif (!t) {\n  try {\n    var mBs = String(baseUrl || '').match(/[?&]_bsType=([^&,]+)/)\n    if (mBs && mBs[1]) t = decodeURIComponent(mBs[1])\n  } catch (eBs) { }\n}\nif (!t) {\n  try { t = String(source.get('searchMode') || 'novel') } catch (eSm) { t = 'novel' }\n}\nif (!t) t = 'novel'\nif (d && typeof d === 'object') {\n  if (!d.bid && bid) d.bid = bid\n  if (!d.id && bid) d.id = bid\n  d.type = t === 'tts' ? 'novel' : t\n  d.mode = t\n}\ntry { if (bid) source.put('tempBookId', String(bid)) } catch (e3) { }\nJSON.stringify(d || {})\n", "intro": "@js:\nvar rData = {}\ntry {\n  rData = (typeof asBook === 'function') ? asBook(result) : (\n    (typeof result === 'string') ? JSON.parse(result) : (result || {})\n  )\n} catch (e) { rData = {} }\nfunction esc(s) {\n  s = (s == null) ? '' : String(s)\n  return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;')\n}\nfunction firstAuthorChar(name) {\n  var s = String(name || '')\n  var stripped = s.replace(/^[^\\u4e00-\\u9fffA-Za-z]+/, '')\n  if (!stripped) stripped = s.trim()\n  return stripped ? stripped.charAt(0) : '作'\n}\nfunction pickAccent() {\n  var hues = [12, 28, 152, 168, 188, 205, 222, 248, 332]\n  var h = hues[Math.floor(Math.random() * hues.length)]\n  var s = 44 + Math.floor(Math.random() * 14)\n  var l = 34 + Math.floor(Math.random() * 8)\n  var c1 = 'hsl(' + h + ' ' + s + '% ' + (l - 7) + '%)'\n  var c2 = 'hsl(' + h + ' ' + (s + 6) + '% ' + l + '%)'\n  var c3 = 'hsl(' + h + ' ' + s + '% ' + (l - 4) + '%)'\n  return {\n    heroBg: 'linear-gradient(145deg, ' + c1 + ' 0%, ' + c2 + ' 45%, ' + c3 + ' 100%)',\n    accent: 'hsl(' + h + ' ' + (s + 4) + '% ' + l + '%)',\n    accentSoft: 'hsla(' + h + ' ' + (s + 4) + '% ' + l + '% / 0.16)',\n    shadow: 'hsla(' + h + ' ' + s + '% ' + l + '% / 0.3)',\n  }\n}\nvar authorName = esc(rData.author || '')\nvar authorInitial = esc(firstAuthorChar(rData.author || ''))\nvar bookName = esc(rData.name || '本书')\nvar introDesc = String(rData.desc || '').trim()\nvar introDescHtml = esc(introDesc)\nvar accent = pickAccent()\nvar status = esc(rData.status || '')\nvar category = [rData.category, rData.subCategory].filter(Boolean).map(esc).join(' · ')\nvar html = `\n<useweb>\n<style>\n:root {\n  --ink: #1c1917;\n  --mute: #78716c;\n  --line: #e7e5e4;\n  --paper: #fafaf9;\n  --panel: #ffffff;\n  --accent: ${accent.accent};\n  --accent-soft: ${accent.accentSoft};\n  --radius: 14px;\n  --font: \"Segoe UI\", \"PingFang SC\", \"Noto Sans SC\", system-ui, sans-serif;\n}\n* { box-sizing: border-box; }\nbody { margin: 0; font-family: var(--font); color: var(--ink); background: transparent; }\n.wrap {\n  width: min(520px, 94vw);\n  margin: 10px auto 18px;\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n}\n.hero {\n  background: ${accent.heroBg};\n  color: #f8fafc;\n  border-radius: var(--radius);\n  padding: 16px;\n  display: flex;\n  gap: 12px;\n  align-items: center;\n  box-shadow: 0 10px 28px ${accent.shadow};\n}\n.av.ph {\n  width: 52px; height: 52px; border-radius: 50%;\n  flex-shrink: 0;\n  border: 2px solid rgba(255,255,255,.35);\n  background: rgba(255,255,255,.15);\n  display: flex; align-items: center; justify-content: center;\n  font-size: 1.2rem; font-weight: 750; line-height: 1;\n  color: #f8fafc;\n}\n.h-main { min-width: 0; flex: 1; }\n.h-name { font-size: 1.05rem; font-weight: 750; }\n.h-book { margin-top: 6px; font-size: 0.72rem; opacity: .7; }\n.h-meta { margin-top: 4px; font-size: 0.72rem; opacity: .75; }\n.panel {\n  background: var(--panel);\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  padding: 14px 14px 12px;\n}\n.panel-h { margin-bottom: 10px; }\n.panel-h h2 { margin: 0; font-size: 0.95rem; font-weight: 750; }\n.dossier {\n  margin: 0;\n  white-space: pre-wrap;\n  word-break: break-word;\n  font-size: 0.82rem;\n  line-height: 1.65;\n  color: #292524;\n  background: var(--paper);\n  border-radius: 10px;\n  padding: 12px;\n  border-left: 3px solid var(--accent);\n}\n</style>\n<div class=\"wrap\">\n  <section class=\"hero\">\n    <span class=\"av ph\">${authorInitial}</span>\n    <div class=\"h-main\">\n      <div class=\"h-name\"><span>${authorName || '作者'}</span></div>\n      <div class=\"h-book\">${bookName}</div>\n      ${status || category ? `<div class=\"h-meta\">${[status, category].filter(Boolean).join(' · ')}</div>` : ''}\n    </div>\n  </section>\n  <section class=\"panel\">\n    <div class=\"panel-h\"><h2>本书档案</h2></div>\n    <pre class=\"dossier\">${introDescHtml || '暂无简介'}</pre>\n  </section>\n</div>\n</useweb>\n`\nhtml\n", "kind": "@js:\nvar r=asBook(result);\n[r.status, r.category, r.subCategory, r.tag].filter(Boolean).join(',')\n", "lastChapter": "@js:\nvar r=asBook(result); r.lastChapter || ''", "name": "@js:\nvar r=asBook(result); r.name || ''", "tocUrl": "@js:\nfunction pickStr() {\n  for (var i = 0; i < arguments.length; i++) {\n    var v = arguments[i]\n    if (v == null) continue\n    try { v = String(v).trim() } catch (e) { continue }\n    if (v && v !== 'null' && v !== 'undefined') return v\n  }\n  return ''\n}\nvar bid = pickStr(\n  java.getString('bid'),\n  java.getString('id'),\n  (typeof result === 'object' && result && result.bid),\n  (typeof result === 'object' && result && result.id),\n  source.get('tempBookId')\n)\nif (!bid) {\n  try {\n    var mBid = String(baseUrl || '').match(/[?&]bid=(\\d+)/)\n    if (mBid) bid = mBid[1]\n  } catch (e0) { }\n}\nvar t = pickStr(\n  java.getString('mode'),\n  java.getString('type'),\n  (typeof result === 'object' && result && result.mode),\n  (typeof result === 'object' && result && result.type),\n  'novel'\n)\nif (!bid) {\n  try { java.toast('无法解析书籍ID，无法加载目录') } catch (e3) { }\n}\ntry { source.put('tempBookId', String(bid)) } catch (e4) { }\n'data:;base64,' + java.base64Encode(String(bid)) + ',{\"type\":\"' + (t || 'novel') + '\",\"bid\":\"' + bid + '\"}'\n", "wordCount": "@js:\nvar r=asBook(result); r.charCount || ''"}, "ruleContent": {"callBackJs": "if (event == 'clickCustomButton' || event == 'longClickCustomButton') {\n  try { source.put('menuTag', 'main') } catch (e) { }\n  java.open('login')\n  true\n} else {\n  false\n}\n", "content": "@js:\nvar cid = java.hexDecodeToString(result)\nvar meta = JSON.parse(baseUrl.slice(baseUrl.indexOf('{')))\nvar type = meta.type || 'novel'\nvar bid = meta.bid\nif (type == 'novel' || type == 'tts') {\n  var chapParams = { bid: bid, cid: cid }\n  try {\n    if (String(source.get('强制刷新章节') || '') == '1') chapParams.forceRefresh = '1'\n  } catch (eFr) { }\n  var data = requestApi.call(this, '/novel/chap', chapParams)\n  if (!data || data.content == null) {\n    ''\n  } else {\n    String(data.content)\n  }\n} else if (type == 'comic') {\n  var comicParams = { bid: bid, cid: cid }\n  try {\n    if (String(source.get('强制刷新章节') || '') == '1') comicParams.forceRefresh = '1'\n  } catch (eFr2) { }\n  var comicData = requestApi.call(this, '/comic/chap', comicParams)\n  var pics = comicData && comicData.pics\n  if (!pics || !pics.length) {\n    ''\n  } else {\n    var html = ''\n    for (var i = 0; i < pics.length; i++) {\n      var pic = pics[i]\n      var imgSrc = ''\n      if (typeof pic === 'string') {\n        imgSrc = pic\n      } else if (pic) {\n        imgSrc = String(pic.imgUrl || pic.url || '')\n      }\n      if (imgSrc) html += '<img src=\"' + imgSrc + '\">'\n    }\n    html\n  }\n} else {\n  java.longToast('\\n暂不支持正文类型：' + type)\n  ''\n}\n", "imageStyle": "FULL", "payAction": ";(function () {\n  try {\n    var type = ''\n    var mType = String(chapter.url).match(/\"type\"\\s*:\\s*\"([^\"]+)\"/)\n    if (mType) type = mType[1]\n    if (type != 'novel' && type != 'comic') {\n      java.toast('\\n当前类型不支持章节购买：' + (type || 'unknown'))\n      return false\n    }\n    var bid = ''\n    var mBid = String(chapter.url).match(/\"bid\"\\s*:\\s*\"(\\d+)\"/)\n    if (mBid) bid = mBid[1]\n    if (!bid) {\n      var mBook = String(book.bookUrl || '').match(/bid=(\\d+)/)\n      if (mBook) bid = mBook[1]\n    }\n    var chapId = ''\n    var mB64 = String(chapter.url).match(/base64,([^,]+)/)\n    if (mB64) chapId = java.base64Decode(mB64[1])\n    if (!bid || !chapId) {\n      java.toast('\\n无法解析书籍/章节 ID')\n      return false\n    }\n    var path = type === 'comic' ? '/comic/buy_chapter' : '/novel/buy_chapter'\n    var data = requestApi.call(this, path, {\n      bid: bid,\n      cid: chapId,\n    })\n    if (data) {\n      java.longToast('\\n✅购买成功，请刷新章节')\n      return true\n    }\n    return false\n  } catch (e) {\n    java.log('payAction: ' + e)\n    return false\n  }\n}).call(this)\n"}, "ruleExplore": {"author": "author", "bookList": "$.data.books[*]", "bookUrl": "@js:\nvar t = java.getString('type') || 'novel'\nvar bid = java.getString('bid') || java.getString('id')\nvar searchMode = ''\ntry { searchMode = String(source.get('searchMode') || '').trim() } catch (e) { }\nif (!t || t === 'null') t = 'novel'\nvar infoType = t\nvar params = { bid: bid }\nif (searchMode && searchMode !== 'novel') params._bsType = searchMode\nelse if (t && t !== 'novel') params._bsType = t\ngetApiUrl('/' + infoType + '/info', params)\n", "coverUrl": "cover", "intro": "desc", "kind": "{{$.status}}\n{{$.category}}\n{{$.subCategory}}\n", "lastChapter": "lastChapter", "name": "name", "wordCount": "charCount"}, "ruleSearch": {"author": "author", "bookList": "$.data[*]", "bookUrl": "@js:\nvar t = java.getString('type') || 'novel'\nvar bid = java.getString('bid') || java.getString('id')\nvar searchMode = ''\ntry { searchMode = String(source.get('searchMode') || '').trim() } catch (e) { }\nif (!t || t === 'null') t = 'novel'\nvar infoType = t\nvar params = { bid: bid }\nif (searchMode && searchMode !== 'novel') params._bsType = searchMode\nelse if (t && t !== 'novel') params._bsType = t\ngetApiUrl('/' + infoType + '/info', params)\n", "checkKeyWord": "诡秘之主", "coverUrl": "cover", "intro": "desc", "kind": "{{$.status}}\n{{$.category}}\n{{$.subCategory}}\n", "lastChapter": "lastChapter", "name": "name", "wordCount": "charCount"}, "ruleToc": {"chapterList": "@js:\nvar bid = ''\ntry { bid = String(java.hexDecodeToString(result) || '').trim() } catch (e0) { bid = '' }\nif (!/^\\d+$/.test(bid)) {\n  try {\n    var raw = String(result == null ? '' : result).trim()\n    if (/^\\d+$/.test(raw)) bid = raw\n  } catch (e1) { }\n}\nvar meta = {}\ntry {\n  meta = JSON.parse(baseUrl.slice(baseUrl.indexOf('{')))\n} catch (e2) { meta = {} }\nvar type = String(meta.type || '').trim()\nif (!type || type === 'null' || type === 'undefined') type = 'novel'\ntry {\n  var metaBid = String(meta.bid || '').trim()\n  if (/^\\d+$/.test(metaBid)) bid = metaBid\n} catch (e3) { }\nif (!bid) {\n  try { bid = String(source.get('tempBookId') || '').trim() } catch (e4) { }\n}\nvar apiType = (type == 'tts') ? 'novel' : type\nif (!apiType) apiType = 'novel'\nvar chaps = []\nif (!bid) {\n  java.toast('无法解析书籍ID，获取目录失败')\n} else if (apiType !== 'novel' && apiType !== 'comic') {\n  java.longToast('\\n暂未开放目录类型：' + apiType)\n} else {\n  book.type = apiType === 'comic' ? 64 : 8\n  try {\n    var loginInfo = JSON.parse(source.getLoginInfo() || '{}')\n    loginInfo.书籍ID = bid\n    source.putLoginInfo(JSON.stringify(loginInfo))\n  } catch (eLi) { }\n  var catalog = requestApi.call(this, '/' + apiType + '/catalog', { bid: bid }) || []\n  var sharedRows = requestApi.call(this, '/' + apiType + '/cache', { bid: bid }) || []\n  var shareMap = {}\n  for (var ci = 0; ci < sharedRows.length; ci++) {\n    var d = sharedRows[ci]\n    var id = d.cid != null ? d.cid : d.chapId\n    if (id != null) shareMap[String(id)] = d\n  }\n  function fmtTime(timestamp) {\n    var date = new Date(timestamp)\n    var year = date.getFullYear()\n    var month = String(date.getMonth() + 1).padStart(2, '0')\n    var day = String(date.getDate()).padStart(2, '0')\n    var hours = String(date.getHours()).padStart(2, '0')\n    var minutes = String(date.getMinutes()).padStart(2, '0')\n    return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes\n  }\n  for (var vi = 0; vi < catalog.length; vi++) {\n    var volume = catalog[vi]\n    chaps.push({\n      name: volume.volumeName,\n      voltype: true,\n    })\n    var chapters = volume.chapters || []\n    for (var chi = 0; chi < chapters.length; chi++) {\n      var chapRow = chapters[chi]\n      var chapId = chapRow.cid\n      var chapName = chapRow.chapName\n      var count = apiType === 'comic' ? (chapRow.picCount || 0) : (chapRow.charCount || 0)\n      var unit = apiType === 'comic' ? '页' : '字'\n      var isVip = chapRow.isVip\n      var isBuy = chapRow.isBuy\n      var displayTime = chapRow.displayTime\n      var isShare = !!shareMap[String(chapId)]\n      var url = 'data:;base64,' + java.base64Encode(String(chapId)) + ',{\"type\":\"' + type + '\",\"bid\":\"' + bid + '\"}'\n      chaps.push({\n        id: chapId,\n        name: (isVip ? (isBuy ? ' 🔑 ' : isShare ? '  🍎 ' : '') : '') + chapName,\n        url: url,\n        info: fmtTime(displayTime) + ' | ' + (count + unit) + (isShare ? '  🍎 ' : isBuy ? ' 🔑 ' : ''),\n        isVip: !isShare && isVip,\n        isBuy: isBuy,\n      })\n    }\n  }\n}\nchaps\n", "chapterName": "name", "chapterUrl": "url", "isPay": "isBuy", "isVip": "isVip", "isVolume": "voltype", "updateTime": "info"}, "searchUrl": "@js:\nvar parsed = parseSearchKey.call(this, key)\ntry { source.put('searchMode', parsed.mode) } catch (e) { }\nif (parsed.unavailable) {\n  java.longToast('\\n暂未开放：' + parsed.type + '\\n当前支持小说 / 漫画（c:）（可用 g: 共享）')\n  getApiUrl('/novel/search', { keyword: '0', page: 1, share: true })\n} else {\n  var apiType = parsed.mode === 'comic' ? 'comic' : 'novel'\n  var params = {\n    keyword: parsed.keyword || key,\n    page: page,\n  }\n  if (parsed.share) params.share = true\n  try {\n    var rank = String(source.get('searchRank') || '').trim()\n    if (rank === '0' || rank === '1' || rank === '2' || rank === '3') {\n      params.rankType = rank\n    }\n  } catch (e2) { }\n  getApiUrl('/' + apiType + '/search', params)\n}\n", "variableComment": "JWT（由登录同步自动写入；也可手动粘贴）", "weight": 0},{"bookSourceComment": "版本：20261026\n作者：知秋\n反馈群：766236637\ntg群：https://t.me/+dcNnFFZv5KtmYjIx\n注意：快速下载建议在登录界面的全本下载先进行缓存\n1.请登录自己号看自己订阅的书籍\n2. 内置了一个号，部分资源免费阅读，但是不支持下载，只支持在线观看\n4. 登录账密请不要多次输入错误，会出现验证码，遇到这种情况等待一会重新登录\n介绍：\n1. 使用服务器进行中转，有请求速率限制，小说为一秒3次。\n2. 临时token口令为 天一团队是倒狗(qq为1070240776和845646066和1484608559)请勿相信任何需要付费的说法欢迎来官方反馈群举报\n3. 获取token请点击登录界面，获取token按钮，点击测试/修改token可查询日下载量，切记获取token后请保存，最后选择√存储成功，token为3日有效期，到期请重新获取，切记token变为明文，请勿外泄，异地登录多次会封禁token，如封禁请等过期重新获取。(token改为明文存源变量中防止丢失)\n4. 共享数据库如有，则优先使用数据库，共享章节开头的图标为🍅\n5. 章节目录前有图标🎉，即为共享章节\n6. 支持下载，请把预下载改成0-3之间，请求有超限拉黑，请勿大规模批量下载\n7. 支持订阅接口，但是不要重复点击\n8. 反馈q群：755947375，token问题群里找我，或者社区找也行(社区不经常在线，上线看到会回)\n9. 接口请求速率存在限制，请不要大规模下载，耐心等待。", "bookSourceGroup": "少年梦,api,优质,禁止外传", "bookSourceName": "✿少年梦（知秋）✿", "bookSourceType": 0, "bookSourceUrl": "少年梦＃知秋", "concurrentRate": "1000", "customButton": false, "customOrder": -1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nlet token = String(source.getVariable())\nif (token == '') {\n  java.longToast('\\n❌未获取共享Token，请于登录界面获取共享Token后使用')\n}\nlet data = requestApiUrl('/novel/explore/init', {})\n//小说·共享更新时间::@js:getApiUrl('/novel/novels', {page})\n//我的书架::@js:getApiUrl('/console/bookrack', {page})\nJSON.stringify(data)", "jsLib": "const host = '少年梦'\nconst branch = 'temp'\nconst version = '1.0.0'\nconst api = 'https://snd.vv9v.cn'\nconst apiAdmin = 'https://zqmy.vv9v.cn'\n\nfunction releasePage() {\n  this.java.startBrowser(`${apiAdmin}/source/release/?host=${host}&branch=${branch}&version=${version}&lastUpdateTime=${this.source.lastUpdateTime}`, '发布页')\n}\n\nfunction checkUpdate() {\n  let lastCheckUpdateTime = Number(this.source.get('lastCheckUpdateTime')) || 0\n  let now = Date.now()\n  if (now - lastCheckUpdateTime < 12 * 3600 * 1000) return\n  this.source.put('lastCheckUpdateTime', String(now))\n  let data = requestApiUrl.call(this, '/source/sources', { host, branch, version }, apiAdmin)\n  if (!data) return\n  if (data.history[0].version != version) {\n    releasePage.call(this)\n  }\n}\n\nfunction getApiUrl(path, data, host = api) {\n  const { source } = this\n  data = Object.entries(data).map(v => v.join('=')).join('&')\n  const option = {\n    method: \"GET\",\n    headers: {\n      'authorization': `Bearer ${source.getVariable()}`\n    }\n  }\n  const url = host + path + '?' + data + ',' + JSON.stringify(option)\n  return url\n}\n\nfunction requestApiUrl(path, data, host = api) {\n  const url = getApiUrl.call(this, path, data, host)\n  try {\n    let res = this.java.ajax(url)\n    res = JSON.parse(res)\n    if (res.code != 0) {\n      this.java.longToast(`\\n❌操作失败，code${res.code}：\\n${res.msg}`)\n    } else {\n      return res.data\n    }\n  } catch (e) {\n    this.java.log(`请求共享接口${path}异常：` + e.message)\n  }\n  return null\n}\n\nfunction getCNTimeString(time, format = 'YYYY/MM/DD HH:mm:ss') {\n  const date = time ? new Date(time) : new Date()\n  const year = date.getFullYear()\n  const month = String(date.getMonth() + 1).padStart(2, '0')\n  const day = String(date.getDate()).padStart(2, '0')\n  const hours = String(date.getHours()).padStart(2, '0')\n  const minutes = String(date.getMinutes()).padStart(2, '0')\n  const seconds = String(date.getSeconds()).padStart(2, '0')\n  return format.replace('YYYY', String(year))\n    .replace('MM', month)\n    .replace('DD', day)\n    .replace('HH', hours)\n    .replace('mm', minutes)\n    .replace('ss', seconds)\n}", "lastUpdateTime": "1792975903295", "loginUi": "[\n  {\n    \"name\": \"源作者\",\n    \"type\": \"text\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"name\": \"官方反馈群\",\n    \"type\": \"text\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"name\": \"临时Token口令\",\n    \"type\": \"text\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"name\": \"查询Token\",\n    \"type\": \"button\",\n    \"action\": \"queryToken()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"获取Token\",\n    \"type\": \"button\",\n    \"action\": \"getTempToken()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"检查更新\",\n    \"type\": \"button\",\n    \"action\": \"releasePage()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"数据库统计\",\n    \"type\": \"button\",\n    \"action\": \"showDb()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"账号\",\n    \"type\": \"text\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"name\": \"密码\",\n    \"type\": \"password\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"name\": \"登录\",\n    \"type\": \"button\",\n    \"action\": \"_login()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.27\n    }\n  },\n  {\n    \"name\": \"退出登录\",\n    \"type\": \"button\",\n    \"action\": \"logout()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.27\n    }\n  },\n  {\n    \"name\": \"账号信息\",\n    \"type\": \"button\",\n    \"action\": \"showUserInfo()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.27\n    }\n  },\n  {\n    \"name\": \"开关自动订阅未购章节\",\n    \"type\": \"button\",\n    \"action\": \"toggleAutoBuy()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"name\": \"书籍ID\",\n    \"type\": \"text\"\n  },\n  {\n    \"name\": \"全本后台下载\",\n    \"type\": \"button\",\n    \"action\": \"downloadNovel()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"name\": \"🛒购买全本🛒\",\n    \"type\": \"button\",\n    \"action\": \"buy(true)\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"name\": \"购买数量\",\n    \"type\": \"text\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"name\": \"🛒购买指定数量章节（默认5）🛒\",\n    \"type\": \"button\",\n    \"action\": \"buy(false)\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  }\n]", "loginUrl": "function login() {\n  let info = JSON.parse(String(source.getLoginInfo()))\n  _login(info)\n}\n\nfunction _login(info) {\n  info = info || result\n  let username = info['账号']\n  let password = info['密码']\n  if (username == '' || password == '') {\n    return java.longToast('\\n❌登录失败，用户名或密码不能为空')\n  }\n  let data = requestApiUrl('/console/login', { username, password })\n  if (!data || !data.id) return\n  source.putLoginInfo(JSON.stringify(info))\n  showUserInfo()\n}\n\nfunction logout() {\n  let data = requestApiUrl('/console/logout', {})\n  if (!data || !data.msg) return\n  let { msg } = data\n  java.longToast(`\\n✅${msg}`)\n}\n\nfunction showUserInfo() {\n  let data = requestApiUrl('/console/info', {})\n  if (!data || !data.msg) return\n  let { msg } = data\n  java.longToast(`\\n✅${msg}`)\n}\n\nfunction toggleAutoBuy() {\n  let auto = source.get('autoBuy') == '1'\n  source.put('autoBuy', auto ? '0' : '1')\n  java.longToast(`\\n✅自动订阅未购章节已${auto ? '关闭' : '开启\\n阅读时将自动订阅未购买章节'}`)\n}\n\nfunction queryToken() {\n  let token = String(source.getVariable())\n  if (token.length <= 60) {\n    java.toast('请输入有效token')\n  } else {\n    let info = requestApiUrl('/user/test', { token })\n    if (!info) return\n    java.longToast(`\\n✅查询成功\\n用户：${info.id}${info.max ? `\\n日下载上限：${info.max}` : ''}\\n今日已下载：${info.used}\\n日下载剩余：${info.left}\\n创建时间：${info.createTime}${info.ddl ? `\\n到期时间：${info.ddlTime}` : ''}`)\n  }\n}\n\nfunction getTempToken() {\n  let pw1 = String(result['源作者'])\n  if (pw1 == '') {\n    return java.longToast('请输入源作者')\n  }\n  let pw2 = String(result['官方反馈群'])\n  if (pw2 == '') {\n    return java.longToast('请输入官方反馈群')\n  }\n  let pw3 = String(result['临时Token口令'])\n  if (pw3 == '') {\n    return java.longToast('请输入临时Token口令')\n  }\n  let info = requestApiUrl('/user/temp', { id: java.androidId(), pw1, pw2, pw3 })\n  if (!info) return\n  let token = info.token\n  source.setVariable(token)\n  java.longToast(`\\n✅获取临时token成功\\n用户：${info.id}\\n日下载剩余：${info.left}\\n创建时间：${info.createTime}\\n到期时间：${info.ddlTime}`)\n  source.putLoginInfo(JSON.stringify(result))\n}\n\nfunction showDb() {\n  let data = requestApiUrl('/system/dbinfo', {})\n  if (!data) return\n  let { msg } = data\n  java.longToast(`\\n✅${msg}`)\n}\n\nfunction downloadNovel() {\n  let novelId = +String(result['书籍ID'])\n  if (!novelId) {\n    return java.longToast('\\n❌请输入有效书籍ID')\n  }\n  let data = requestApiUrl('/novel/download', { novelId })\n  if (!data) return\n  let { msg } = data\n  java.longToast(`\\n✅${msg}`)\n}\n\nfunction buy(all) {\n  let novelId = +String(result['书籍ID'])\n  if (!novelId) {\n    return java.longToast('\\n❌请输入有效书籍ID')\n  }\n  let data\n  if (all) {\n    data = requestApiUrl('/console/subscribe', { novelId, num: -1 })\n  } else {\n    let num = +String(result['购买数量'])\n    if (!num || num <= 0) {\n      num = 5\n    }\n    data = requestApiUrl('/console/subscribe', { novelId, num })\n  }\n  if (!data) return\n  java.longToast('\\n✅' + data.msg)\n}", "respondTime": 180000, "ruleBookInfo": {"author": "penName", "coverUrl": "https://aliossouterendtest.shaoniandream.com{{$.picture}}", "init": "data", "intro": "&nbsp;{{$.jianjie}}", "kind": "{{java.getString('$.isUpdate') == '0' ? '完本' : '连载'}}\n{{java.getString('$.sortName')}}\n{{java.getString('$.booklabel')}}", "lastChapter": "ChapterName\n@js:\nif (result != '') {\n  result = String(result).replace('连载至', '')\n}\nresult", "name": "title", "tocUrl": "id||BookID\n@js:\n`data:;base64,${java.base64Encode(result)},{\"type\":\"SNDapi\"}`", "wordCount": "FontCount"}, "ruleContent": {"content": "@js:\ncheckUpdate()\nlet chapId = java.hexDecodeToString(result)\nlet info = JSON.parse(baseUrl.slice(baseUrl.indexOf('{')))\nlet novelId = info.novelId\nlet autoBuy = source.get('autoBuy') == '1'\nlet data = requestApiUrl('/novel/chap', { novelId, chapId, autoBuy })\ndata.content\n", "payAction": "// java.log('章节url：' + chapter.url)\nlet novelId = chapter.url.match(/\"novelId\":\\s*\"(\\d+)\"/)[1]\nlet chapId = java.base64Decode(chapter.url.match(/base64,(.*?),/)[1])\nlet data = requestApiUrl('/console/subscribe', { novelId, chapId })\nif (data.msg) {\n  java.longToast('\\n✅' + data.msg)\n  true\n} else {\n  false\n}"}, "ruleExplore": [], "ruleSearch": {"author": "penName", "bookList": "data[*]", "bookUrl": "BookID||BooksID||id\n@js:\ngetApiUrl('/novel/info', { novelId: result  })", "checkKeyWord": "", "coverUrl": "https://aliossouterendtest.shaoniandream.com{{$.picture}}", "intro": "jianjie", "kind": "{{java.getString('$.isUpdate') == '0' ? '完本' : '连载'}}\n{{java.getString('$.cname')}}\n{{java.getString('$.sortName')}}\n{{java.getString('$.booklabel')}}", "name": "title||BookName", "wordCount": "FontCount"}, "ruleToc": {"chapterList": "@js:\nlet novelId = java.hexDecodeToString(result)\nlet vols = requestApiUrl('/novel/catalog', { novelId })\n\nlet cache = requestApiUrl('/novel/cache', { novelId }) || []\ncache = cache.reduce((acc, d) => {\n  acc[d.chapId] = d\n  return acc\n}, {})\n\nlet loginInfo = JSON.parse(source.getLoginInfo() || '{}')\nloginInfo.书籍ID = novelId\nsource.putLoginInfo(JSON.stringify(loginInfo))\n\nlet chaps = []\n\nfor (let v of vols) {\n  chaps.push({\n    title: v.title,\n    voltype: true\n  })\n  for (let c of v.chapterList) {\n    let cacheChap = cache[c.id]\n    let isShare = !!cacheChap\n    let isBuy = c.lock == 1\n    let isVip = !!c.isFree\n    let tag = isBuy ? '🔑' : isShare ? cacheChap.s ? '🍎' : '🎉' : ''\n    if (tag) tag += '  '\n    let onlineTime = (cacheChap ? cacheChap.onlineTime : getCNTimeString(c.release_time_now * 1000)) || getCNTimeString(c.release_time_now * 1000) || ''\n    let info = `${onlineTime} ┃ 字数：${c.FontCount || 0}`\n    chaps.push({\n      title: (isVip ? tag : '') + c.title,\n      info: info + (isShare ? (cacheChap.s ? '🍎' : '🎉') : tag),\n      isVip,\n      isBuy: isBuy || (cacheChap && cacheChap.s),\n      url: `data:;base64,${java.base64Encode(c.id)},{\"type\":\"SNDapi\",\"novelId\":\"${novelId}\"}`\n    })\n  }\n}\n\nchaps", "chapterName": "title", "chapterUrl": "url", "isPay": "isBuy", "isVip": "isVip", "isVolume": "voltype", "updateTime": "info"}, "searchUrl": "@js:\ngetApiUrl('/novel/search', { keyword: key, page })", "weight": 0},{"bookSourceGroup": "聚合", "bookSourceName": "聚合小说", "bookSourceType": 0, "bookSourceUrl": "https://m.qidian.com", "customButton": false, "customOrder": -2, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>(function(){\nvar _H = (typeof _dpSrv === 'function') ? _dpSrv() : 'http://43.139.147.103:8070';\nvar FALLBACK = [{\"title\":\"请选择平台\",\"type\":\"select\",\"chars\": [\"📖 综合\", \"🌙 得奇小说\", \"圣墟小说网\", \"提书网(tishu)\", \"思兔阅读(sto66)\", \"2K小说\", \"同人小说(trxs123)\", \"黑岩阅读\", \"🍅 番茄小说\", \"思路客\", \"夜伴书屋\", \"篱笆好文学\", \"错层小说\", \"STV镜像\", \"笔下文学网(bxwx9)\", \"笔趣阁小说网(biquguo)\", \"37阅读网(37yue)\", \"大唐小说\", \"小说屋\", \"小说狂人 🌐\", \"笔趣阁(bqgooo.cc)\", \"书旗小说\", \"米读小说\", \"七猫小说\", \"武侠小说网(wuxiayue)\", \"爱下电子书(ixdzs8) ✨优质\", \"甲骨文小说(jgwxs) ✨优质\", \"🌙 顶点小说·APP接口 ✨优质\", \"📖 读知阁\"],\"default\":\"📖 综合\",\"action\":\"show(infoMap['请选择平台'],'dpsrc')\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"≡ 综合分类（多源合并）≡\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"玄幻\",\"url\":_H+\"/api/discover/unified_list/0?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"仙侠\",\"url\":_H+\"/api/discover/unified_list/1?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"都市\",\"url\":_H+\"/api/discover/unified_list/2?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"历史\",\"url\":_H+\"/api/discover/unified_list/3?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"科幻\",\"url\":_H+\"/api/discover/unified_list/4?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"悬疑\",\"url\":_H+\"/api/discover/unified_list/5?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"游戏\",\"url\":_H+\"/api/discover/unified_list/6?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"言情\",\"url\":_H+\"/api/discover/unified_list/7?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"完本\",\"url\":_H+\"/api/discover/unified_list/8?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"最新\",\"url\":_H+\"/api/discover/unified_list/9?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"排行\",\"url\":_H+\"/api/discover/unified_list/10?page={{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"--\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}}];\ntry{\nvar _p=_dpExplorePage(java, cache, FALLBACK);\nif(_p){return _p;}\n}catch(e){}\nreturn JSON.stringify(FALLBACK);\n})()</js>", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; SM-S918B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\", \"Accept-Language\": \"zh-CN,zh;q=0.9\"}", "jsLib": "//        ② 传不进来的（服务器下发的点击串）用 _DP_JV/_DP_BK/_DP_CH 兜底。\nvar _DP_JV = null, _DP_BK = null, _DP_CH = null;\nvar _DP_ILLU_DIAG = '';   // ★ v54 插图链路诊断串\nfunction _dpSetCtx(jv, bk, ch) {\n    try { if (jv) _DP_JV = jv; } catch (e1) {}\n    try { if (bk) _DP_BK = bk; } catch (e2) {}\n    try { if (ch) _DP_CH = ch; } catch (e3) {}\n    return _DP_JV;\n}\n// ★ 2026-09-30：安全取规则作用域的 chapter。\n//   旧写法在 jsLib 内部直接写 `chapter || null` —— 一旦当前作用域没有 chapter\n//   绑定（详情/搜索规则、或引擎换 ctx 后），会抛 ReferenceError。\n//   这条链在 __dpThirdParty / _dpBookIntro 里，被 try 吞掉 → 表现为\n//   「VIP 补章静默返回空」「简介恒空」，极难定位。改为 typeof 守卫。\nfunction _dpScopeChapter() {\n    try { if (typeof chapter !== 'undefined' && chapter) return chapter; } catch (e1) {}\n    try { if (_DP_CH) return _DP_CH; } catch (e2) {}\n    return null;\n}\n// 取 java：显式传的 > 兜底缓存 > 作用域全局（后者一般取不到，留着兼容老上下文）\nfunction _dpJv(jv) {\n    if (jv) return jv;\n    if (_DP_JV) return _DP_JV;\n    try { if (typeof java !== 'undefined' && java) return java; } catch (e1) {}\n    try { if (typeof source !== 'undefined' && source) return source; } catch (e2) {}\n    return null;\n}\n\nvar _DP_UA = 'Mozilla/5.0 (Linux; Android 12; Redmi K40 Build/SKQ1.220213.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/110.0.0.0 Mobile Safari/537.36';\nvar _DP_LANG = 'zh-CN,zh;q=0.9';\n// ★ v42：起点请求最后一次失败的诊断串（HTTP 码 / body 长度 / 非JSON 头部）\nvar _DP_QD_DIAG = '';\nvar _DP_DEBUG = true;          // 失败时弹 toast 显示断点（定位后可改 false）\nvar _DP_DEBUG_OK = false;      // 成功(已注入)时是否也弹 toast；排障时可临时改 true\nvar _DP_NET_ERR = '';          // 最近一次网络异常信息\nvar _DP_CSRF = '';             // 全局缓存：m.qidian.com 任何一页下发的 _csrfToken（实测跨页通用）\nvar _DP_LAST_FAIL = '';        // 通道1最后的失败原因（回退时用于提示）\n// ★ v43（2026-09-21）：直连侧「一条评论都取不到」（典型 = VIP 章，m 站恒空）。\n//   置真后 _dpInjectQd 会把整章让给服务器通道，而不是挂一堆点开是空的气泡。\nvar _DP_HOT_EMPTY = false;\n// ★ v46（2026-09-21）：热评卡「为什么没出来」的诊断串。\n//   旧版 _dpHotCard 的 catch 直接 `return ''`，既不置 _DP_HOT_EMPTY 也不报错\n//   → 气泡照挂在、卡片**静默消失**、还不让位服务器通道（用户报「卡片一个都没有」）。\nvar _DP_HOT_DIAG = '';\n// ★ v44（2026-09-21）：正文配图最高占屏高百分比。起点 VIP 章常带官方插图，\n//   原图是竖版长图，阅读器里一屏放不下 → 用户必须手动缩小（用户报\n//   「段评图片太大了 看不完全 要手动缩小」）。书源变量 dpimgvh 可调（15~100）。\nvar _DP_IMG_VH = 55;\n\nvar _DP_SERVER = 'http://43.139.147.103:8070';   // ★ 2026-10-22：8090 被云平台内容违规处置封禁，迁到 8070   // 仅补章/发现页用；段评不走它\n\n/* ★ 2026-10-16：服务器地址集中解析。\n *   书源变量 agg_server 可覆盖全部服务端入口（聚合搜索/详情/目录/正文/发现页/\n *   段评/补章）；未设置时回落到下面的 _DP_SERVER 默认地址。\n *   换服务器或换域名只需改这一处默认值，或直接在阅读器里设变量。\n *   分段服务（晋江/书旗）另有 jj_server 变量，见 _dpDpSrv()。\n */\nfunction _dpSrv() {\n    try {\n        var sc = _dpSrcOf(_dpJv());\n        if (sc && typeof sc.get === 'function') {\n            var v = String(sc.get('agg_server') || '').replace(/\\/+$/, '');\n            if (v) return v;\n        }\n    } catch (e0) {}\n    return _DP_SERVER;\n}\nvar _dpBidCache = {};          // 书名 -> 起点 bid（一本书只搜一次）\nvar _dpCatCache = {};          // bid -> 目录页 HTML（一本书只抓一次）\n\n// ---- v19.2：Rhino ConsString 扁平化（修「ConsString cannot be cast to String」）----\n// 点击回调从正文 onclick 属性里切出来的参数（csrf/segId 等）在 Rhino 里是 ConsString，\n// 拼接后塞进 headers map 传给 java 桥时抛 ClassCastException → 弹窗永远 0 条。\n// String() 走 ConsString.toString() 扁平化 + split/join 双保险，一次治本。\nfunction _dpFlat(s) {\n    try { s = String(s == null ? '' : s); } catch (e0) { s = ''; }\n    try { s = s.split('').join(''); } catch (e1) {}\n    return s;\n}\nfunction _dpFlatHd(hd) {\n    var out = {};\n    try { for (var k in hd) { out[_dpFlat(k)] = _dpFlat(hd[k]); } } catch (e) { return hd; }\n    return out;\n}\n\nfunction _dpToast(jav, msg) {\n    if (!_DP_DEBUG) return;\n    try { jav.toast(msg); } catch (e) {}\n}\n\n// 繁体站（台湾小说网等）书名/章节名可能是繁体，起点是简体 → 尝试转简体（失败则原样返回）\nfunction _dpT2S(jav, s) {\n    var v = String(s == null ? '' : s);\n    if (!v) return v;\n    try { var r = jav.t2s(v); if (r) return String(r); } catch (e) {}\n    return v;\n}\n// ★★★ v119（2026-10-14）：_dpGrabCsrf 等 m 站段评通道已**整体删除**\n//   （用户明令：段评只走起点 APP + QQ 阅读）。不要再加回来，详见 references/qidian/channel-policy.md\nfunction _dpGetJson(jav, url, headers) {\n    try {\n        var r = jav.get(url, headers);\n        var body = String(r.body() || '');\n        if (!body) return null;\n        return JSON.parse(body);\n    } catch (e) { _DP_NET_ERR = String(e); return null; }\n}\n// ★★★ v119（2026-10-14）：_dpNorm 等 m 站段评通道已**整体删除**\n//   （用户明令：段评只走起点 APP + QQ 阅读）。不要再加回来，详见 references/qidian/channel-policy.md\nfunction _dpIsHtmlBlock(t) {\n    return /<(p|br|div|h[1-6])[\\s>\\/]/i.test(String(t == null ? '' : t));\n}\n\nfunction _dpPlainText(s) {\n    return String(s == null ? '' : s)\n        .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n        .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n        .replace(/<br\\s*\\/?>/gi, '\\n')\n        .replace(/<\\/p>/gi, '\\n')\n        .replace(/<\\/div>/gi, '\\n')\n        .replace(/<[^>]*>/g, '')\n        .replace(/&nbsp;/gi, ' ')\n        .replace(/&ldquo;/gi, '“').replace(/&rdquo;/gi, '”')\n        .replace(/&hellip;/gi, '…').replace(/&mdash;/gi, '—')\n        .replace(/&amp;/gi, '&').replace(/&lt;/gi, '<')\n        .replace(/&gt;/gi, '>').replace(/&quot;/gi, '\"')\n        .replace(/&#\\d+;/g, ' ');\n}\n// ★★★ v119（2026-10-14）：_dpCollectSegs 等 m 站段评通道已**整体删除**\n//   （用户明令：段评只走起点 APP + QQ 阅读）。不要再加回来，详见 references/qidian/channel-policy.md\nfunction _dpInjectServer(t, nm, au, cn, jav) {\n    try {\n        // 服务器通道按 \\n 拆段，HTML 正文先归一化为纯文本（保底通道，可接受丢格式）\n        var plain = _dpIsHtmlBlock(t) ? _dpPlainText(t) : t;\n        var body = 'name=' + encodeURIComponent(nm)\n                 + '&author=' + encodeURIComponent(au)\n                 + '&chapter=' + encodeURIComponent(cn)\n                 + '&text=' + encodeURIComponent(plain)\n                 // ★ v53：细粒度开关 + 主题一并传给服务端（hot= 保留作旧版兼容）\n                 + '&hot=' + ((_dpSegCardOn(jav) || _dpEndCardOn(jav)) ? '1' : '0')\n                 + '&bubble=' + (_dpBubbleOn(jav) ? '1' : '0')\n                 + '&segcard=' + (_dpSegCardOn(jav) ? '1' : '0')\n                 + '&endcard=' + (_dpEndCardOn(jav) ? '1' : '0')\n                 + '&theme=' + _dpTheme(jav);\n        var r = '';\n        try {\n            // legado-E 的 java.post：headers 必须是 JS 对象，返回值要 .body() 取正文\n            var _resp = jav.post(_dpSrv() + '/qqdp/inline', body,\n                {\"Content-Type\": \"application/x-www-form-urlencoded;charset=utf-8\"});\n            r = String(_resp.body() || '');\n        } catch (e4) {\n            try {\n                r = String(jav.post(_dpSrv() + '/qqdp/inline', body, {}).body() || '');\n            } catch (e5) { r = ''; }\n        }\n        if (r.length > 80 && r.indexOf('qqShowCmt(') >= 0) {\n            var n = (r.match(/qqShowCmt\\(/g) || []).length;\n            if (_DP_DEBUG_OK) _dpToast(jav, '段评:服务器通道' + n + '个');\n            return r;\n        }\n        // ★ v46：服务端**失败时仍返回 200 + 原文**（设计如此：段评不能挡正文），\n        //   所以这里必须把「回来了但没注入」和「根本没回来」分开记录，\n        //   否则只能看到一句无从下手的「段评加载失败」。\n        if (!_DP_LAST_FAIL) {\n            _DP_LAST_FAIL = '服务器:未注入(len=' + r.length\n                + (plain && r === plain ? ' 原样返回' : '') + ')';\n        }\n        return '';\n    } catch (e) {\n        if (!_DP_LAST_FAIL) _DP_LAST_FAIL = '服务器:异常 ' + e;\n        return '';\n    }\n}\n\n// ---------- 主入口：通道1失败自动回退通道2 ----------\nfunction __dpInject(txt, nm, au, cn, jav, ck, bko, chapter) {\n    var t = String(txt == null ? '' : txt);\n    // ★★ v66（2026-10-03）：段评注入的两条通道都会把正文「洗一遍」——直连通道走\n    //   `_dpPutIntoLines`（HTML 归一化成纯文本）、服务器通道走 `_dpPlainText` ——\n    //   规则① 已经插好的插图 `<img class=\"dp-illu\">` 会被整段丢掉（用户报的\n    //   「免费章没插图了」）。所以每个返回点前再跑一次 `__dpIllu` 把图补回来：\n    //   它内部有 `indexOf('class=\"dp-illu\"')` 防重复 + `_seen` 缓存，重复调用几乎零成本。\n    function _reIllu(x) {\n        try { return __dpIllu(x, bko, chapter, jav); } catch (eI2) { return x; }\n    }\n    try {\n        t = _dpFitImgs(t);\n        try { t = __dpIllu(t, bko, chapter, jav); } catch (eIllu) {}  // ★ v52 正文插图/彩蛋章          // ★ v44：正文配图限高（放在最前，所有返回路径都吃到）\n        // v14：① 给气泡点击串留上下文（qqShowCmt 在 jsLib 里读不到作用域的 java）\n        _dpSetCtx(jav, bko, _dpScopeChapter());\n        // ★ v51（2026-09-24）：两个开关彻底独立。老版本这里是一行总闸\n        //   `if (!_dpSegOn(jav)) { return t; }` —— 关掉气泡会把热评卡一起带走。\n        //   ★ v53（2026-09-28）：细粒度三开关（气泡/段卡/章末大卡），旧变量自动兼容。\n        var bubbleOn = true, segCardOn = true, endCardOn = true;\n        try { bubbleOn = _dpBubbleOn(jav); } catch (eSO) {}\n        try { segCardOn = _dpSegCardOn(jav); } catch (eSO2) {}\n        try { endCardOn = _dpEndCardOn(jav); } catch (eHO2) {}\n        // v14：② 顺手把「正在读的书」登记进发现页换源面板 → 面板不再出现空列表\n        //   （放在开关判断之前：两个开关都关时，换源面板也要能记住这本书）\n        if (bko && nm) { try { _dpRegBook(_dpSrcOf(jav), nm, bko.bookUrl ? String(bko.bookUrl) : ''); } catch (eR0) {} }\n        if (!bubbleOn && !segCardOn && !endCardOn) { return t; }\n        if (t.length < 80) return t;\n        if (t.indexOf('qqShowCmt(') >= 0) return t;\n        // ★ 起点正文是未闭合 <p>（全程无 </p>），不补全则拆段/插气泡/对齐全失效\n        if (t.indexOf('</p>') < 0 && /<p[\\s>]/i.test(t)) {\n            t = t.replace(/<p([^>]*)>/gi, '</p><p$1>').replace(/^(<\\/p>)+/i, '') + '</p>';\n        }\n        nm = _dpT2S(jav, nm);\n        au = _dpT2S(jav, au);\n        cn = _dpT2S(jav, cn);\n        if (!cn) {\n            try {\n                var mm = t.replace(/^[\\s\\u3000]+/, '').match(/^(第[0-9一二三四五六七八九十百千两零]{1,12}[章节回卷集篇][^\\n]{0,24})/);\n                if (mm) cn = mm[1];\n            } catch (e0) {}\n        }\n        if (!nm || !cn) { _dpToast(jav, '段评:缺名 nm=' + nm + ' cn=' + cn); return t; }\n\n        // ★★★ v119（2026-10-14）：段评**只有服务器通道**\n        //   （服务端内部 = 起点 APP 纯算 + QQ 阅读兜底）。\n        //   用户明令：删除 www / m 站段评通道。原「通道1：起点手机直连 m.qidian.com」\n        //   与「服务器失败时挂裸气泡」两条已**整体删除** —— 不要再加回来。\n        _DP_NET_ERR = '';\n        var srv = _dpInjectServer(t, nm, au, cn, jav);\n        if (srv) return _reIllu(srv);\n\n        _dpToast(jav, '段评:服务器未取到(' + _DP_LAST_FAIL + ')');\n        return _reIllu(t);\n    } catch (e) { _dpToast(jav, '段评:异常 ' + e); return txt; }\n}\n\n// ---------- 弹窗：双模式 ----------\n// 直连气泡：qqShowCmt(bid, cid, segId, csrf)           → 4 参数，本地抓起点评论列表\n// 服务器气泡：qqShowCmt(bid, cid, para, uuid, q, qdBid, qdCid) → 7 参数，走服务器 /qqdp/para\n\n// ==================== 晋江 / 书旗 1:1 段评通道（2026-10-15）====================\n// 正文由各自专用代理装饰（气泡 click 串写死 jjShowCmt / sqShowCmt），弹窗 HTML 由代理端渲染。\n// 与起点 _dpShowServer 同构：先 ajax 取 HTML，再 showBrowser 底部弹出；失败回退全屏。\nvar _JJ_SERVER = 'http://43.139.147.103:8070';  // 同上：晋江/书旗段评代理只走 :8070\nfunction _dpDpSrv(ovr){\n    try {\n        var s = _dpSrcOf(_dpJv());\n        if (s && typeof s.get === 'function') {\n            var v = String(s.get(ovr || 'jj_server') || '');\n            if (v) return v.replace(/\\/+$/, '');\n        }\n    } catch (e) {}\n    return _JJ_SERVER;\n}\nfunction _dpDpShow(jv, url) {\n    var cfg = JSON.stringify({\n        \"expandedCornersRadius\": 20, \"dismissOnTouchOutside\": true, \"isDraggable\": true,\n        \"shouldDimBackground\": true, \"backgroundDimAmount\": 0.5, \"hardwareAccelerated\": true,\n        \"isNestedScrollingEnabled\": true, \"isGestureInsetBottomIgnored\": true,\n        \"setFitToContents\": true, \"isHideable\": true, \"heightPercentage\": 0.8\n    });\n    var html = '';\n    try { html = String(jv.ajax(url) || ''); } catch (eA) {}\n    if (html && html.indexOf('<!DOCTYPE html>') >= 0) {\n        try { jv.showBrowser(url, html, '', cfg); return true; } catch (eB) {}\n    }\n    // ★ 2026-10-15 修：ajax 拿不到 HTML 时**不再**直接 startBrowser —— 那是全屏网页，\n    //   用户看到的就是「点段评弹出网页」。先退回「只给 URL 的底部弹窗」让它自己加载\n    //   （与番茄 fqShowPara / fqShowCmt 同构），只有连 showBrowser 都不可用才全屏兜底。\n    try { jv.showBrowser(url, null, null, cfg); return true; } catch (eB2) {}\n    try { jv.startBrowser(url, '段评'); } catch (eC) {}\n    return false;\n}\n// 晋江：气泡点击串 jjShowCmt('nid','cid','para','cnt','pt64')\n// ★ 2026-10-15 修：原实现调用 **_jjSrv()**，但该函数**从未定义**（只定义了 _dpDpSrv）\n//   ⇒ 点击气泡抛 ReferenceError，Legado 弹「错误提示」。这里补上定义，并给整段兜底，\n//   任何异常都只 toast 一行，绝不把裸异常抛回宿主。\nfunction _jjSrv() {\n    try { return _dpDpSrv('jj_server'); } catch (e) { return _JJ_SERVER; }\n}\nfunction jjShowCmt(nid, cid, para, cnt, pt64) {\n    var jv = null;\n    try { if (this && this.java) jv = this.java; } catch (e) {}\n    if (!jv) jv = _dpJv();\n    if (!jv) return;\n    try {\n        nid = _dpFlat(nid); cid = _dpFlat(cid); para = _dpFlat(para);\n        if (!nid || !cid) { try { jv.toast('段评参数缺失'); } catch (e0) {} return; }\n        if (!para) para = '1';\n        // pt64 = 气泡携带的段落原文（服务端 base64），让弹窗顶部显示「被评论的原文」，\n        // 而不是接口那个截断成「兜里的手机震动了两下......」的 para_content。\n        var tq = '';\n        try { tq = encodeURIComponent(_dpFlat(pt64)); } catch (eT) {}\n        var host = _JJ_SERVER;\n        try { host = _jjSrv(); } catch (eH) {}\n        _dpDpShow(jv, host + '/jj/review?nid=' + encodeURIComponent(nid) +\n                       '&cid=' + encodeURIComponent(cid) +\n                       '&para=' + encodeURIComponent(para) +\n                       '&size=50&fmt=html' + (tq ? '&pt=' + tq : ''));\n    } catch (eAll) {\n        try { jv.toast('段评打开失败：' + eAll); } catch (eT2) {}\n    }\n}\n// 书旗：气泡点击串 sqShowCmt('bid','cid','para','cnt','pt64')\nfunction sqShowCmt(bid, cid, para, cnt, pt64) {\n    var jv = null;\n    try { if (this && this.java) jv = this.java; } catch (e) {}\n    if (!jv) jv = _dpJv();\n    if (!jv) return;\n    bid = _dpFlat(bid); cid = _dpFlat(cid); para = _dpFlat(para);\n    if (!bid || !cid) { try { jv.toast('段评参数缺失'); } catch (e0) {} return; }\n    // para = 书旗 paragraphId（p005 / p00A / hash）；历史正文里可能是十进制 orderId，\n    // 服务端 /shuqi/review 已做 orderId -> paragraphId 兜底，这里原样透传。\n    // pid 与 para 同发，防服务端签名再次漂移（旧版只认 para、新版两个都认）。\n    if (!para) para = 'p001';\n    var pq = encodeURIComponent(para);\n    // pt64 = 气泡携带的段落原文（服务端 base64 编码），让弹窗顶部能显示「被评论的原文」\n    var tq = '';\n    try { tq = encodeURIComponent(_dpFlat(pt64)); } catch (eT) {}\n    _dpDpShow(jv, _JJ_SERVER + '/shuqi/review?bid=' + encodeURIComponent(bid) +\n                   '&cid=' + encodeURIComponent(cid) +\n                   '&pid=' + pq + '&para=' + pq + '&size=50&fmt=html' +\n                   (tq ? '&pt=' + tq : ''));\n}\n\nfunction qqShowCmt(bid, cid, segId, csrf, q, qdBid, qdCid, name, author, ch) {\n    var jv = null;\n    try { if (this && this.java) jv = this.java; } catch (e) {}\n    if (!jv) jv = _dpJv();          // v14：点击串是服务器/正文里写死的，只能靠兜底缓存拿 java\n    if (!jv) return;\n    // ★ v19.2：onclick 属性切出来的参数可能是 Rhino ConsString → 统一扁平化，\n    //   否则拼进 headers/URL 传 java 桥时抛 ClassCastException（弹窗永远 0 条）。\n    bid = _dpFlat(bid); cid = _dpFlat(cid); segId = _dpFlat(segId); csrf = _dpFlat(csrf);\n    q = _dpFlat(q); qdBid = _dpFlat(qdBid); qdCid = _dpFlat(qdCid);\n    name = _dpFlat(name); author = _dpFlat(author); ch = _dpFlat(ch);\n    // ★★★ v119（2026-10-14）：段评弹窗**只有服务器通道**（服务端 = 起点 APP 纯算 + QQ 阅读）。\n    //   10/7 参数：服务器下发的点击串，直接走服务器。\n    //   4 参数：旧版「手机直连 m.qidian.com」的点击串（仅旧缓存正文里可能残留）——\n    //   现在也一律交服务器；起点 bid/cid 放在 qd_bid/qd_cid 上（服务端约定）。\n    if (arguments.length >= 10) { _dpShowServer(jv, bid, cid, segId, csrf, q, qdBid, qdCid, name, author, ch); }\n    else if (arguments.length >= 6) { _dpShowServer(jv, bid, cid, segId, csrf, q, qdBid, qdCid, '', '', ''); }\n    else { _dpShowServer(jv, '0', '0', segId, csrf, '', bid, cid, '', '', ''); }\n}\n\n// ★ v46（2026-09-21）：把干巴巴的「段评加载失败」变成能定位的一句话。\n//   用户报错时只看这一句就能区分「盾/网络」「csrf」「本章真没评论」。\nfunction _dpFailCode() {\n    var d = '';\n    try { d = _dpFlat(_DP_QD_DIAG || ''); } catch (e1) {}\n    if (d) return d.replace(/\\s+/g, ' ').slice(0, 70);\n    try { if (_DP_NET_ERR) return ('网络 ' + _dpFlat(_DP_NET_ERR)).replace(/\\s+/g, ' ').slice(0, 70); } catch (e2) {}\n    try { if (!_DP_CSRF) return '未拿到 csrf'; } catch (e3) {}\n    return '本章无数据返回';\n}\n\nfunction _dpShowServer(jv, bid, cid, para, uuid, q, qdBid, qdCid, name, author, ch) {\n    var url = _dpSrv() + '/qqdp/para?bid=' + bid + '&cid=' + cid + '&offset=' + para;\n    if (uuid) { url += '&uuid=' + uuid; }\n    if (q) { url += '&q=' + encodeURIComponent(q); }\n    if (qdBid && qdCid) { url += '&qd_bid=' + qdBid + '&qd_cid=' + qdCid; }\n    // v36：收费章回退需要书名/作者/章节名，服务器据此反查阅文 bid 走 QQ 热评兜底\n    if (name) { url += '&name=' + name; }\n    if (author) { url += '&author=' + author; }\n    if (ch) { url += '&ch=' + ch; }\n    var html = '';\n    try { html = String(jv.ajax(url) || ''); } catch (eA) {}\n    if (html) {\n        try {\n            // v36：统一底部弹出式（晋江同款），showBrowser 不可用回退全屏\n            var cfg = JSON.stringify({\n                \"expandedCornersRadius\": 20,\n                \"dismissOnTouchOutside\": true,\n                \"isDraggable\": true,\n                \"shouldDimBackground\": true,\n                \"backgroundDimAmount\": 0.5,\n                \"hardwareAccelerated\": true,\n                \"isNestedScrollingEnabled\": true,\n                \"isGestureInsetBottomIgnored\": true,\n                \"setFitToContents\": true,\n                \"isHideable\": true,\n                \"heightPercentage\": 0.8\n            });\n            jv.showBrowser(url, html, '', cfg);\n            return;\n        } catch (eB) {}\n    }\n    try { jv.startBrowser(url, '段评'); } catch (eC) {\n        try { jv.toast('段评加载失败: ' + _dpFailCode()); } catch (eD) {}\n    }\n}\n// ★★★ v119（2026-10-14）：_dpShowChapterEnd 等 m 站段评通道已**整体删除**\n//   （用户明令：段评只走起点 APP + QQ 阅读）。不要再加回来，详见 references/qidian/channel-policy.md\n// Shared server routing for aggregation, discovery, comments and Tomato auth.\n// ★★★ v125（2026-10-14 修复）：v119 瘦身 jsLib 时把本声明区块整体删掉了 ——\n//   连带 _DP3_SRVS / _DP3_SRV_OK / _DP3_CACHE / _DP3_TO_* 一起消失。\n//   后果：_dpExTab 首行 `_DP3_CACHE['dpex']` 抛「_DP3_CACHE is not defined」，\n//   被 _dpExplorePage 的 try 吞掉 → 返回 null → **发现页退化成 FALLBACK 单下拉**\n//   （用户报「发现页没有三个下拉框 / 没有 UAA 小说·漫画·视频」）；\n//   同时拖垮 /api/search|book|toc|chapter 的服务端补章通道（同样被吞，静默失败）。\n//   以下按 v119 前同血脉 client 线原样补回。\nvar _DP3_SRVS = ['http://43.139.147.103:8070', 'http://43.139.147.103'];\ntry {\n    var _dpSrvV = _dpSrv();\n    if (_dpSrvV) {\n        _DP3_SRVS = [_dpSrvV];\n        // ★ 2026-10-20：80 被云安全组封时的兜底（_dp3Try 会自动 failover）\n        if (_dpSrvV.indexOf(':8070') < 0) _DP3_SRVS.push('http://43.139.147.103:8070');\n    }\n} catch (eSrv) {}\nvar _DP3_SRV_OK = '';\nvar _DP3_CACHE = {};\nvar _DP3_BAD = null;\nvar _DP3_TTL = 3600 * 1000;\nvar _DP3_MISS_TTL = 6 * 3600 * 1000;\nvar _DP3_BUDGET = 45000;         // v34：一次补章/换源总预算（服务端最坏 ~26s）\nvar _DP3_MAX_TRY = 3;            // v34：候选源最多试 3 个\nvar _DP3_TO_SEARCH = 20000;      // /api/search（服务端 SEARCH_BUDGET=20s）\nvar _DP3_TO_BOOK = 15000;        // /api/book（BOOK_BUDGET=10s）\nvar _DP3_TO_TOC = 40000;         // /api/toc（TOC_BUDGET=20s，硬上限 40s）\nvar _DP3_TO_CHAPTER = 35000;     // /api/chapter（v26 重试后最坏 ~26s）\n\nfunction _dp3Try(jav, path, src, to) {\n    var order = [], i;\n    if (_DP3_SRV_OK) order.push(_DP3_SRV_OK);\n    for (i = 0; i < _DP3_SRVS.length; i++) {\n        if (_DP3_SRVS[i] !== _DP3_SRV_OK) order.push(_DP3_SRVS[i]);\n    }\n    for (i = 0; i < order.length; i++) {\n        var body = '';\n        try {\n            var r = jav.get(order[i] + path, null, to || 8000);   // v34: 30s -> 8s\n            if (r) body = String(r.body() || '');\n        } catch (e0) { body = ''; }\n        if (!body) { try { body = String(jav.ajax(order[i] + path) || ''); } catch (e1) { body = ''; } }\n        if (!body || body.length < 2) continue;\n        try {\n            var j = JSON.parse(body);\n            if (j) { _DP3_SRV_OK = order[i]; return j; }\n        } catch (e2) { /* 换下一台 */ }\n    }\n    return null;\n}\n\nfunction _dp3TryUrl(jav, url, to) {\n    var body = '';\n    try {\n        var r = jav.get(url, null, to || 8000);   // v34: 45s -> 8s\n        if (r) body = String(r.body() || '');\n    } catch (e0) { body = ''; }\n    if (!body) { try { body = String(jav.ajax(url) || ''); } catch (e1) { body = ''; } }\n    if ((!body || body.length < 3) && _DP3_SRV_OK) {\n        var alt = String(url).replace(/^https?:\\/\\/[^\\/]+/, _DP3_SRV_OK);\n        try { body = String(jav.ajax(alt) || ''); } catch (e2) { body = ''; }\n    }\n    if (!body) return null;\n    try { return JSON.parse(body); } catch (e3) { return null; }\n}\n\n// 归一化：去空白/标点\nfunction _dp3Norm(s) {\n    return String(s == null ? '' : s)\n        .replace(/[\\s\\u3000]+/g, '')\n        .replace(/[：:，,。.、！!？?；;（）()《》〈〉【】\\[\\]\"\"''—\\-_|]/g, '')\n        .toLowerCase();\n}\n\n// 中文数字 -> 整数\nfunction _dp3Cn2int(s) {\n    var D = { '零': 0, '〇': 0, '一': 1, '壹': 1, '二': 2, '两': 2, '贰': 2, '三': 3, '叁': 3,\n              '四': 4, '肆': 4, '五': 5, '伍': 5, '六': 6, '陆': 6, '七': 7, '柒': 7, '八': 8, '捌': 8,\n              '九': 9, '玖': 9 };\n    var U = { '十': 10, '拾': 10, '百': 100, '佰': 100, '千': 1000, '仟': 1000, '万': 10000 };\n    var total = 0, section = 0, num = -1, seen = false;\n    for (var i = 0; i < s.length; i++) {\n        var c = s.charAt(i);\n        if (D[c] !== undefined) { num = D[c]; seen = true; }\n        else if (U[c] !== undefined) {\n            var u = U[c];\n            if (u >= 10000) { section = (section + (num < 0 ? 0 : num)) * u; total += section; section = 0; num = -1; }\n            else { section += (num < 0 ? 1 : num) * u; num = -1; }\n            seen = true;\n        } else { return NaN; }\n    }\n    if (!seen) return NaN;\n    return total + section + (num < 0 ? 0 : num);\n}\n\n// 章节序号：第269章 / 第二百三十章 / 12.\nfunction _dp3Seq(name) {\n    var s = String(name == null ? '' : name).replace(/[\\s\\u3000]+/g, '');\n    // v49i：上限从 6 位放到 10 位 —— _dpNormChapter 会把章号补齐成 8 位\n    //   （「第一章」→「第00000001章」），旧上限 6 位让这些名字的序号恒为 NaN，\n    //   章号比对只能退到字符串近似匹配。\n    var m = s.match(/第\\s*([0-9]{1,10})\\s*[章节回节话]/);\n    if (m) return parseInt(m[1], 10);\n    m = s.match(/第\\s*([零〇一壹二两贰三叁四肆五伍六陆七柒八捌九玖十拾百佰千仟万]{1,12})\\s*[章节回节话]/);\n    if (m) { var v = _dp3Cn2int(m[1]); if (!isNaN(v)) return v; }\n    m = s.match(/^\\s*([0-9]{1,10})[\\.、,，:：]/);\n    if (m) return parseInt(m[1], 10);\n    return NaN;\n}\n\n// 同书的所有子源候选（按匹配度降序）\n\n// ★ v49i：用户在换源界面点了「全部备选源」里的某一个源 —— 那时我们还不知道\n//   这本书在该源的地址（u）。这里用**单源搜索**（/api/search?src=N）把它查出来。\n//   返回 u 字符串；查不到返回 ''。\n\n// 在目录里找对应章\n\n// 正文脏？—— 源站把段落标记写坏成 &1t;/p>、非法 HTML 实体、过多替换字符\n\n// ★ v44（2026-09-21）：第三方源的「占位页」——不是脏源，是**这一章还没手打出来**。\n//   实测 2K 小说第 140 章正文只有 206 字，尾巴是\n//   「正在手打中，请稍等片刻，内容更新后，请重新刷新页面，即可获取最新更新」。\n//   这种必须**换下一个子源**，但**绝不能拉黑该源**（其它章它是好的），\n//   所以单独一个判定，不进 _dp3MarkBad 那条路。\n\n// 广告段落识别（v15）：第三方源常把「本书首发 101 看书网…无错章节…」这类推广插进正文。\n// 只判短段（≤160 字），长段绝不误杀；正则全是推广文案专用词，正常小说正文撞不上。\n// 按段剔除广告（<p> 结构按段切，纯文本按行切；没有广告就原样返回）\n\n// 兜底清洗：删掉垃圾尾巴、还原空格实体、剔除广告段（v15）\n// ★ v15 关键修复：内容规则里调用的名字是 __dp3Clean（v12 起就和 jsLib 的 _dp3Clean 错位），\n//   ReferenceError 被 try/catch 吞掉 → 第三方正文从未清洗过，广告原样进正文。\n\n// 书源级持久变量读写（Legado 原生 API 是 source.put/source.get，\n// 存于 CacheManager 的 v_<源key>_<key>；老式 setVariable/getVariable 为无参版本，仅作兜底）\nfunction _dp3Get(src, k) {\n    if (!src) return null;\n    try { var v = src.get(k); if (v !== undefined && v !== null && String(v) !== '') return String(v); } catch (e) {}\n    // 老式书源把变量存在一个整体 JSON 里。注意 BaseSource.getVariable() 是【无参】方法，\n    // 传参会直接被 Rhino 判为「没有这个方法」抛异常（v14 纠错）。\n    try {\n        var all = src.getVariable();\n        if (all) {\n            var o = JSON.parse(String(all));\n            if (o && o[k] !== undefined && o[k] !== null && String(o[k]) !== '') return String(o[k]);\n        }\n    } catch (e2) {}\n    return null;\n}\nfunction _dp3Put(src, k, v) {\n    if (!src) return;\n    try { src.put(k, String(v)); return; } catch (e) {}\n    try { src.putVariable(k, String(v)); } catch (e2) {}\n}\n\n// 脏子源黑名单\n\n/* ==================================================================\n * v12 ①：正文精准抽取 —— 修「整页被文本化 → 站点栏目文字混进正文」\n * 起点 m 站是 Vue-SSR 页面，本章正文就在\n *   <script id=\"vite-plugin-ssr_pageContext\"> 的\n *   pageContext.pageProps.pageData.chapterInfo.content\n * 里。若直接把整页交给 _dpPlainText，<title>/菜单/书友圈/讨论热烈\n * 会被 HtmlFormatter 原样留下文字，灌进正文。\n * ================================================================== */\nfunction _dpBody(raw) {\n    var h = String(raw == null ? '' : raw);\n    if (!h || h.length < 200) return h;\n    // ① SSR JSON：最干净，且与段评对齐同源\n    try {\n        var mm = h.match(/<script id=\"vite-plugin-ssr_pageContext\"[^>]*>([\\s\\S]*?)<\\/script>/i);\n        if (mm) {\n            var ci = null;\n            try { ci = JSON.parse(mm[1]).pageContext.pageProps.pageData.chapterInfo; } catch (eJ) {}\n            var ct = ci ? String(ci.content == null ? '' : ci.content) : '';\n            if (_dpTxtLen(ct) > 60) return ct;\n        }\n    } catch (e1) {}\n    // ② 正文容器 <div class=\"print ...\">：深度配对截断，去掉容器里的 <h1> 标题\n    try {\n        var pi = h.search(/<div[^>]*class=\"[^\"]*\\bprint\\b[^\"]*\"[^>]*>/i);\n        if (pi >= 0) {\n            var seg = h.slice(pi).replace(/^<div[^>]*>/i, '');\n            seg = _dpCutDiv(seg)\n                    .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n                    .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n                    .replace(/<h1[^>]*>[\\s\\S]*?<\\/h1>/i, '');\n            if (_dpTxtLen(seg) > 60) return seg;\n        }\n    } catch (e2) {}\n    // ③ 兜底：原样返回（宁可脏，不可空）\n    return h;\n}\n\n/* ==================================================================\n * v44（2026-09-21）①：正文配图限高\n *   起点 VIP 章常带官方插图（竖版长图），阅读器里按 100% 宽铺开就会一屏\n *   放不下，用户得手动缩小。这里给每个 <img> 补 max-width/max-height，\n *   高度上限默认 55vh，可用书源变量 dpimgvh 调（15~100）。\n *   对已经带 max-height 的图不重复加；不认 style 的渲染器也无害 —— 一个字\n *   都不会少，最坏就是维持原样。\n * ================================================================== */\nfunction _dpFitImgs(t) {\n    var s = String(t == null ? '' : t);\n    if (!s || s.indexOf('<img') < 0) return s;\n    var vh = _DP_IMG_VH;\n    try {\n        if (!vh) vh = 55;\n        var v = _dp3Get(_dpSrcOf(_dpJv()), 'dpimgvh');\n        if (v) { var n = parseInt(v, 10); if (!isNaN(n) && n >= 15 && n <= 100) vh = n; }\n    } catch (e0) {}\n    var css = 'max-width:100%;height:auto;max-height:' + vh + 'vh;object-fit:contain;';\n    try {\n        return s.replace(/<img\\b([^>]*)>/gi, function (m0, a) {\n            if (/max-height\\s*:/i.test(a)) return m0;\n            if (/\\sstyle\\s*=\\s*\"/i.test(a)) {\n                return '<img' + a.replace(/(\\sstyle\\s*=\\s*\")([^\"]*)\"/i, '$1$2;' + css + '\"') + '>';\n            }\n            return '<img' + a + ' style=\"' + css + '\">';\n        });\n    } catch (e1) { return s; }\n}\n\nfunction _dpTxtLen(s) {\n    try { return String(s == null ? '' : s).replace(/<[^>]*>/g, '').replace(/[\\s\\u3000]/g, '').length; }\n    catch (e) { return 0; }\n}\n\n// div 深度配对：截到与开头 div 配对的 </div>（避开尾部站点页脚/推荐位）\nfunction _dpCutDiv(s) {\n    var d = 0, re = /<div\\b[^>]*>|<\\/div\\s*>/gi, m;\n    while ((m = re.exec(s)) !== null) {\n        if (m[0].charAt(1) === '/') { d--; if (d <= 0) return s.slice(0, m.index); }\n        else d++;\n    }\n    return s;\n}\n\n/* ==================================================================\n * 起点详情与发现页辅助规则\n * ================================================================== */\n\n// 按属性名取 meta content（不依赖属性顺序）\nfunction _dpMeta(h, prop) {\n    try {\n        var re = /<meta\\b[^>]*>/gi, m;\n        while ((m = re.exec(String(h))) !== null) {\n            var tag = m[0];\n            if (tag.indexOf(prop) < 0) continue;\n            var c = tag.match(/content\\s*=\\s*([\"'])([\\s\\S]*?)\\1/i);\n            if (c) return c[2];\n        }\n    } catch (e) {}\n    return '';\n}\n\n// 简介：og:description → p.summary__content → meta[name=description] 去前缀\nfunction _dpBookIntro(h, baseUrl, jav, bko) {\n    _dpSetCtx(jav, bko, _dpScopeChapter());\n    var o = _dpMeta(h, 'og:description');\n    if (!o) {\n        try {\n            var m = String(h).match(/<p[^>]*class=\"[^\"]*summary__content[^\"]*\"[^>]*>([\\s\\S]*?)<\\/p>/i);\n            if (m) o = _dpPlainText(m[1]).replace(/[\\s\\u3000]+/g, ' ').replace(/^ | $/g, '');\n        } catch (e1) {}\n    }\n    if (!o) {\n        o = _dpMeta(h, 'name=\"description\"');\n        if (o) o = o.replace(/^[^,]*?,已更新\\s*\\d+\\s*章[、,：:]?\\s*最新章节[：:]?/, '');\n    }\n    return o;\n}\n\n// ---------------- 补过章的书籍登记表 ----------------\nfunction _dpBooks(src) {\n    try {\n        var v = _dp3Get(src, 'dp3books');\n        if (v) { var a = JSON.parse(String(v)); if (a && a.length) return a; }\n    } catch (e) {}\n    return [];\n}\n\nfunction _dpBid(u) {\n    try { var m = String(u || '').match(/\\/book\\/(\\d+)/); if (m) return m[1]; } catch (e) {}\n    return '';\n}\n\nfunction _dpRegBook(src, name, bookUrl) {\n    if (!src || !name) return;\n    try {\n        var bid = _dpBid(bookUrl), old = _dpBooks(src), out = [{ n: String(name), b: bid }], i;\n        for (i = 0; i < old.length && out.length < 40; i++) {\n            if (String(old[i].n) === String(name)) continue;\n            out.push({ n: String(old[i].n), b: String(old[i].b || '') });\n        }\n        // 已经在首位就不写库：__dpInject 每章都会调一次，别把 CacheManager 写爆\n        if (old.length && String(old[0].n) === String(name) && String(old[0].b || '') === bid) return;\n        _dp3Put(src, 'dp3books', JSON.stringify(out));\n    } catch (e) {}\n}\n\n// ---------------- 发现页列表：分流 + 给每条记录补 dp3q 占位 ----------------\n// 返回 JSON 字符串，交给后一段 $.dp3.records||$.data.records 取数组\n// ★★★ v125（2026-10-14 修复）：v119 瘦身时误删；_dpExploreList 里是活调用，\n//   缺失会被外层 try 吞掉 → 起点榜单条目不补成品 u/c（$.u / $.c 规则取不到）\n//   → 发现页点进去的书直接用搜索名，可能错书/空白。\nfunction _dpExploreFill(r) {\n    try {\n        if (!r || r.u) return r;\n        var bid = String(r.bid == null ? '' : r.bid);\n        var q = String(r.dp3q == null ? '' : r.dp3q);\n        r.u = 'https://m.qidian.com/book/' + bid + '/?dp3q=' + q;\n        r.c = 'https://bookcover.yuewen.com/qdbimg/349573/' + bid + '/180';\n    } catch (e0) {}\n    return r;\n}\n\nfunction _dpExploreList(baseUrl, result, jav) {\n    var body = String(result == null ? '' : result);\n    try { _dpSetCtx(jav, null, null); } catch (eS0) {}\n    // ★ v49h（2026-09-22）：发现页的「VIP 补章源」入口整体下线 ——\n    //   在部分 Legado 版本上点这些条目只会打开普通书籍详情页、动作不执行\n    //   （用户实测「点了没反应」）。换源/正文来源开关全部搬到阅读页\n    //   「换替补书源」界面（那里列出全部备选源，点一行即替换）。\n    try {\n        if (String(baseUrl || '').indexOf('dp3panel') >= 0) {\n            return JSON.stringify({ data: { records: [] } });\n        }\n    } catch (e1) {}\n    // ★ v50（2026-09-23）发现页第三方分类书单（/api/discover/list 的 JSON）。\n    //   服务端已把书名/作者/简介/分类/最新章节和**成品 URL**（u=书、c=封面）\n    //   全部备好，这里只换一层外包装，好让 ruleExplore 的字段规则（$.bName…）\n    //   同时吃起点榜单和第三方书单 —— 两套数据一个形状。\n    try {\n        var jd = JSON.parse(body);\n        if (jd && jd.disc === true) {\n            return JSON.stringify({ data: { records: (jd.records || []) } });\n        }\n    } catch (eD) {}\n    try {\n        var j = JSON.parse(body);\n        var r = j && j.data && j.data.records;\n        if (r && r.length) {\n            var keep = [];\n            for (var i = 0; i < r.length; i++) {\n                if (!r[i]) continue;\n                if (r[i].dp3q === undefined) r[i].dp3q = '';\n                if (String(r[i].bAuth || '') === 'VIP补章源') continue;   // 不展示历史遗留条目\n                _dpExploreFill(r[i]);   // 起点记录补上成品 u/c（$.u / $.c 规则用）\n                keep.push(r[i]);\n            }\n            return JSON.stringify({ data: { records: keep } });\n        }\n    } catch (e2) {}\n    return body;\n}\n\n\n\n// ---------------- 详情页承接动作 ----------------\n// 只在书源自己的「补章源设置」跳过来的详情页上生效，普通书籍页返回 ''\n\n\n/* ==================================================================\n * v13：登录界面里的「换替补书源」\n * 为什么要塞在登录界面：阅读界面右上角菜单（登录/编辑书源/禁用书源）是阅读器原生菜单，\n * 书源改不了；但其中「登录」对应的界面可以用书源的 loginUi 字段自定义。\n * 设了 loginUi 就不再走原来的网页登录页 → 所以这里必须自带一个「打开起点网页登录」按钮。\n *\n * 上下文（源码 SourceLoginDialog）：\n *   · loginUi 可以是 @js: 代码，返回值被当 JSON 解析 → 界面可动态生成\n *   · 按钮 action 的 JS 里绑定：java(SourceLoginJsExtensions) / result(各行当前值) / book(正在读的书) / chapter\n *   · java 可用：toast / reLoginView() / refreshContent() / startBrowser(url,title) / ...\n *   · 行类型：text / password / button / toggle / select；按钮行的 viewName 写 '引号包起来' 就是固定文字，\n *     不包引号则当 JS 表达式求值（用来做动态文字）\n * ================================================================== */\n\n\n// ---------- ★ 内容分级（2026-10-22 起服务端已无成人源：成人内容迁往美国独立入口 161.153.44.211:8082） ----------\n// 唯一真源：书源变量 'dp_adult'（'1'=只看成人，'0'/缺省=只看正常）。\n// 聚合搜索把它透传给服务端 /api/search?adult=1|0：\n//   成人=1 现返回空结果（服务端成人池已清空，分级机制保留作回退安全网）。\n// 成人子源不挂段评（服务端 _NO_DP_SRC 按内容分级判定）。\nfunction _dpGradeIsAdult(src) {\n    // 2026-10-22：成人内容已迁美国独立入口(161.153.44.211:8082)，本源恒正常档。\n    return false;\n}\nfunction _dpGradeSet(jav, on) {\n    // 2026-10-22：恒写 '0'（成人档已迁出），顺带清掉旧设备残留的 dp_adult=1。\n    on = false;\n    try { _dp3Put(_dpSrcOf(jav), 'dp_adult', '0'); } catch (e) {}\n    var upd = {};\n    upd[\"lu_grade_n\"] = (on ? \"○ \" : \"◉ \") + \"📖 正常小说\";\n    upd[\"lu_grade_a\"] = (on ? \"◉ \" : \"○ \") + \"🔞 成人小说\";\n    try { jav.upLoginData(upd); } catch (eU) {}\n    try {\n        jav.toast('📖 已切回正常小说（成人内容已迁至独立入口）');\n    } catch (e2) {}\n    try { jav.refreshExplore(); } catch (e4) {}\n    return '已切换：📖 正常小说（成人内容已迁至独立入口）';\n}\n// 2026-10-22：登录页分级按钮区已删除（成人内容迁往美国独立入口）。\nfunction _dpGradeRows(jav) {\n    return [];\n}\n// 发现页下拉的 action（与登录页共用同一个变量）\nfunction _dpGradePick(v) {\n    var jv = null;\n    try { if (this && this.java) jv = this.java; } catch (e0) {}\n    if (!jv) { try { if (typeof java !== 'undefined' && java) jv = java; } catch (e1) {} }\n    var on = String(v == null ? '' : v).indexOf('成人') >= 0;\n    return _dpGradeSet(jv, on);\n}\n\nfunction _dpLuRow(name, label, action, dynLabel, basis) {\n    var r = {\n        name: name, type: \"button\",\n        style: {\n            layout_flexGrow: 1,\n            layout_flexBasisPercent: (basis == null ? 0.45 : basis)\n        }\n    };\n    r.viewName = dynLabel ? String(label) : (\"'\" + String(label).replace(/'/g, \"\") + \"'\");\n    if (action) r.action = action;\n    return r;\n}\n\n\n\n// ---------- 段评气泡 / 热评卡片 开关（v35 新增；v51 拆两个；v53 细粒度三开关 + 主题） ----------\n// 状态存书源变量（'1'=开，'0'=关；缺省视为开）：\n//   v51 旧变量：dp_seg_on（气泡总闸）/ dp_hot_on（热评卡总闸）—— 仍保留作回退。\n//   ★ v53（2026-09-28）细粒度三开关（照含遇見书源开关模式）：\n//     dp_bubble_on   数字气泡（正文段尾小气泡）\n//     dp_segcard_on  段神评论卡（段内热评大卡）\n//     dp_endcard_on  章末大卡（本章说/神评论）\n//   新变量一旦设置过就完全接管；从未设置时回退旧两开关语义：\n//     bubble ← dp_seg_on；segcard ← dp_seg_on && dp_hot_on；endcard ← dp_hot_on。\nfunction _dpSegOn(jav) {\n    var src = _dpSrcOf(jav);\n    var v = _dp3Get(src, 'dp_seg_on');\n    if (v === null) return true;\n    return v !== '0';\n}\nfunction _dpHotOn(jav) {\n    var src = _dpSrcOf(jav);\n    var v = _dp3Get(src, 'dp_hot_on');\n    if (v === null) return true;\n    return v !== '0';\n}\nfunction _dpFineGet(jav, key, legacy) {\n    var src = _dpSrcOf(jav);\n    var v = _dp3Get(src, key);\n    if (v !== null && v !== '') return v !== '0';\n    return legacy;\n}\nfunction _dpBubbleOn(jav)  { return _dpFineGet(jav, 'dp_bubble_on',  _dpSegOn(jav)); }\nfunction _dpSegCardOn(jav) { return _dpFineGet(jav, 'dp_segcard_on', _dpSegOn(jav) && _dpHotOn(jav)); }\nfunction _dpEndCardOn(jav) { return _dpFineGet(jav, 'dp_endcard_on', _dpHotOn(jav)); }\n\n// ★★ 2026-10-23b（YG）：总闸拆回**三个独立开关，不合在一起**。\n//   YG 反馈：「万一我想关气泡、只看热评卡片呢」——合并成一个总闸就做不到。\n//   现在三个各自独立：段评气泡 / 段神评卡 / 章末大卡，想关哪个关哪个\n//   （例：关气泡 + 留热评卡 = 只看卡片，不受气泡打扰）。\n//   三条注入通道（番茄 /fq/content、第三方 _dp_inject_chapter、独立源 /qqdp/inline）\n//   吃的都是这三个细粒度变量，所以**每一行都是总开关**（全通道生效），\n//   不是回到「只对起点生效」的老三行。\nfunction _dpSwMark(on) { return (on ? \"◉ \" : \"○ \"); }\nfunction _dpBubbleLabel(on)  { return _dpSwMark(on) + \"💬 段评气泡\"; }\nfunction _dpSegCardLabel(on) { return _dpSwMark(on) + \"🔥 段神评卡\"; }\nfunction _dpEndCardLabel(on) { return _dpSwMark(on) + \"📌 章末大卡\"; }\n// ★ 旧总闸解耦迁移：细粒度变量缺失时回退到旧总闸（dp_seg_on / dp_hot_on），\n//   而 _dpSegCardOn 的回退是 (seg_on && hot_on)、章末卡回退是 hot_on ——\n//   老用户若留着 dp_hot_on=0，「只关气泡」会连带把热评卡/章末卡的回退值压成关。\n//   迁移：三者任一缺失时按当前回退值一次性实例化，之后旧总闸永久失效。\nfunction _dpSwMigrate(jav) {\n    try {\n        var src = _dpSrcOf(jav);\n        var b = _dp3Get(src, 'dp_bubble_on'), s = _dp3Get(src, 'dp_segcard_on'), e = _dp3Get(src, 'dp_endcard_on');\n        if (b !== null && b !== '' && s !== null && s !== '' && e !== null && e !== '') return;\n        _dp3Put(src, 'dp_bubble_on',  _dpBubbleOn(jav)  ? '1' : '0');\n        _dp3Put(src, 'dp_segcard_on', _dpSegCardOn(jav) ? '1' : '0');\n        _dp3Put(src, 'dp_endcard_on', _dpEndCardOn(jav) ? '1' : '0');\n    } catch (eM) {}\n}\nfunction _dpSwAllOn(jav) {\n    try { return (_dpBubbleOn(jav) && _dpSegCardOn(jav) && _dpEndCardOn(jav)) ? true : false; }\n    catch (e) { return true; }\n}\n// 三个开关共用的切换实体：key=细粒度变量名，name=UI 行名\nfunction _dpToggleOne(jav, key, name, onGet, labelFn, onMsg, offMsg) {\n    _dpSwMigrate(jav);\n    var src = _dpSrcOf(jav);\n    var on = onGet(jav);\n    _dp3Put(src, key, on ? '0' : '1');\n    var upd = {};\n    upd[name] = labelFn(!on);\n    _dpLuDone(jav, on ? offMsg : onMsg, upd);\n    return String(on ? offMsg : onMsg).split('（')[0];\n}\nfunction _dpToggleBubbleSw(jav) {\n    return _dpToggleOne(jav, 'dp_bubble_on', 'tog_bubble', _dpBubbleOn, _dpBubbleLabel,\n        '已开启段评气泡（正文段尾小气泡），重新打开本章生效',\n        '已关闭段评气泡（热评卡不受影响），重新打开本章生效');\n}\nfunction _dpToggleSegCardSw(jav) {\n    return _dpToggleOne(jav, 'dp_segcard_on', 'tog_segcard', _dpSegCardOn, _dpSegCardLabel,\n        '已开启段神评卡（段内热评大卡），重新打开本章生效',\n        '已关闭段神评卡（气泡不受影响），重新打开本章生效');\n}\nfunction _dpToggleEndCardSw(jav) {\n    return _dpToggleOne(jav, 'dp_endcard_on', 'tog_endcard', _dpEndCardOn, _dpEndCardLabel,\n        '已开启章末大卡（本章说/神评论），重新打开本章生效',\n        '已关闭章末大卡（气泡不受影响），重新打开本章生效');\n}\n// ★ v53 主题适配：dp_theme = light | dark（缺省 light）。Legado 没有 JS 可用的\n//   主题 API（含遇見同款做法是手动变量），切到 dark 后气泡/段卡/章末卡/热评卡\n//   全部换深色配色（重新打开本章生效）。\nfunction _dpTheme(jav) {\n    try {\n        var src = _dpSrcOf(jav);\n        return (String(_dp3Get(src, 'dp_theme') || '').toLowerCase() === 'dark') ? 'dark' : 'light';\n    } catch (eT) { return 'light'; }\n}\nfunction _dpToggleTheme(jav) {\n    var src = _dpSrcOf(jav);\n    var now = _dpTheme(jav);\n    _dp3Put(src, 'dp_theme', now === 'dark' ? 'light' : 'dark');\n    var upd = {};\n    upd[\"tog_theme\"] = (now === 'dark') ? \"◉ ☀️ 浅色卡片\" : \"◉ 🌙 深色卡片\";\n    _dpLuDone(jav, now === 'dark'\n        ? '卡片配色：浅色（重新打开本章生效）'\n        : '卡片配色：深色（夜间模式用，重新打开本章生效）', upd);\n    return now === 'dark' ? '卡片配色：浅色' : '卡片配色：深色';\n}\n// ★ v49h：正文来源开关搬到换源界面（发现页那个入口在部分 Legado 版本上点不开，已下线）。\n//   与 v44 的 dp3mode 同一份书源变量，语义完全一致：auto=起点优先，third=第三方直供。\n\n\n// ══════════════════════════════════════════════════════════════════════════\n// 段评切换（2026-10-18，用户需求）：起点段评 ⇄ QQ阅读段评，只在这两个之间，\n// 默认起点段评。\n//\n//   落点是服务端 /qqdp/dpsrc —— 由 qqdp_inject.dp_prefer() 决定\n//   _hots_concurrent 先查起点还是先查 QQ阅读（先查到的那条独占该段，\n//   所以「先跑 = 更高优先级」）。\n//\n//   ★ 走 /qqdp 不走 /api：本函数在 jsLib 上下文执行，/qqdp/* 已被\n//     _dpSrv() + /qqdp/inline 之类调用在真机验证可达；/api/* 在本部署里带\n//     阅读器会话门，按钮点下去会被 403、表现成「点了没反应」。\n//   ★ 番茄子源不受影响：番茄段评由服务端 `i == _FQ_SRC_IDX` 独占。\n// ══════════════════════════════════════════════════════════════════════════\nfunction _dpDpSrcGet(jav) {\n    try {\n        var s = _dpSrcOf(jav);\n        var v = String(_dp3Get(s, 'dp_dpsrc') || '').toLowerCase();\n        return (v === 'qq') ? 'qq' : 'qd';\n    } catch (e) { return 'qd'; }\n}\nfunction _dpDpSrcLabel(k) {\n    return (String(k) === 'qq') ? 'QQ阅读段评' : '起点段评';\n}\nfunction _dpDpSrcRows(jav) {\n    var cur = _dpDpSrcGet(jav);\n    return [\n        _dpLuRow(\"tog_dp_head\", \"↓   段评通道   ↓\", null, false, 1),\n        _dpLuRow(\"tog_dpsrc\", \"◉ 🔄 段评切换：\" + _dpDpSrcLabel(cur), \"_dpToggleDpSrc(java)\", false, 1)\n    ];\n}\nfunction _dpToggleDpSrc(jav) {\n    var s = _dpSrcOf(jav);\n    var now = _dpDpSrcGet(jav);\n    var next = (now === 'qq') ? 'qd' : 'qq';\n    _dp3Put(s, 'dp_dpsrc', next);\n    var got = next;\n    try {\n        var r = String(jav.ajax(_dpSrv() + '/qqdp/dpsrc?src=' + next) || '');\n        var o = JSON.parse(r);\n        if (o && o.pref) { got = String(o.pref); }\n    } catch (e1) {}\n    if (got !== next) { _dp3Put(s, 'dp_dpsrc', got); }\n    var upd = {};\n    upd[\"tog_dpsrc\"] = \"◉ 🔄 段评切换：\" + _dpDpSrcLabel(got);\n    _dpLuDone(jav, '段评已切换到：' + _dpDpSrcLabel(got), upd);\n    return '';\n}\n\nfunction _dpSegHotRows(jav) {\n    var rows = [];\n    // ★★ 2026-10-23b（YG）：三个开关**各自独立**（不合并）。\n    //   三条注入通道（番茄 /fq/content、第三方 _dp_inject_chapter、独立源\n    //   /qqdp/inline）现在全认这三个细粒度变量，所以**每一行都是总开关**\n    //   （全通道生效），同时又能单独关掉任意一个 —— 比如关气泡、只看热评卡。\n    var themeDark = (_dpTheme(jav) === \"dark\");\n    rows.push(_dpLuRow(\"tog_head\", \"↓   段评   ↓\", null, false, 1));\n    rows.push(_dpLuRow(\"tog_bubble\", _dpBubbleLabel(_dpBubbleOn(jav)), \"_dpToggleBubbleSw(java)\", false, 1));\n    rows.push(_dpLuRow(\"tog_segcard\", _dpSegCardLabel(_dpSegCardOn(jav)), \"_dpToggleSegCardSw(java)\", false, 1));\n    rows.push(_dpLuRow(\"tog_endcard\", _dpEndCardLabel(_dpEndCardOn(jav)), \"_dpToggleEndCardSw(java)\", false, 1));\n    rows.push(_dpLuRow(\"tog_theme\", themeDark ? \"◉ 🌙 深色卡片\" : \"◉ ☀️ 浅色卡片\", \"_dpToggleTheme(java)\", false, 0.5));\n    // ★ 2026-10-18：段评通道切换（起点 ⇄ QQ阅读），与上面几个开关同区显示\n    try {\n        var _dpRows = _dpDpSrcRows(jav);\n        for (var _dpi = 0; _dpi < _dpRows.length; _dpi++) rows.push(_dpRows[_dpi]);\n    } catch (eDP) {}\n    return rows;\n}\n\n// 界面兜底：无论如何都能登录 + 有个说明，绝不出现空白界面\nfunction _dpLuFallback() {\n    try {\n        return JSON.stringify([\n            _dpLuRow(\"lu_hint\", \"↓   账号登录   ↓\", null, false, 1),\n            _dpLuRow(\"lu_fqweb\", \"🍅 番茄账号登录\", \"_dpFqWebLogin(java, (typeof cookie!==\\\"undefined\\\"?cookie:null))\", false, 0.45),\n            _dpLuRow(\"lu_login\", \"📖 起点网页登录\", \"_dpLuLogin(java, \\\"\\\")\", false, 0.45),\n            _dpLuRow(\"lu_tip\", \"部分设置暂不可用，账号登录仍可继续\", null, false, 1)\n        ]);\n    } catch (e) { return \"[]\"; }\n}\n\n// 状态行（viewName 当 JS 表达式求值）\n\n\n// 动作统一收尾：提示 + 重载本章。\n// ★ 2026-10-12 去掉 jav.reLoginView(false)：真机上它重建登录界面时按钮显示文字\n//   取 loginData 空值 → 整个登录页按钮全变「null」（用户实测）。参考源\n//   「☁️云端聚合」的切换按钮同样只 toast 不刷新界面。\nfunction _dpLuDone(jav, msg, upd) {\n    try { jav.toast(msg); } catch (e) {}\n    // ★ 2026-10-12：upLoginData 把新按钮文字写回登录界面（即时更新 ◉/○），\n    //   比重建界面（reLoginView 会把按钮全变 null）安全。\n    if (upd) { try { jav.upLoginData(upd); } catch (e0) {} }\n    try { jav.refreshContent(); } catch (e2) {}\n}\n\n\n// ★★ v49i（2026-09-23）用户要求「换源界面里把所有备选源都列出来，点一行就替换」。\n//   以前只能列「搜到的候选」（没搜过就是空），用户根本看不到有哪些源可用。\n//   现在直接问服务端要全部子源清单（/qqdp/sources，下标与 /api/search?src=N 一致）。\n//   失败回退：拿不到清单 → 返回旧缓存；再没有 → null（调用方退回老的候选列表行为）。\n\n// 点「全部备选源」里的一行：直接锁定该源（不知道书 URL 也没关系，\n// 补章时服务端会用 src=N 的单源搜索把书绑上）。\n\n\n\n// 重新搜候选：不用等读到收费章，现在就能搜\n\n\n// 保留原本的网页登录能力（设了 loginUi 后系统不再自动显示登录页，只能靠这个按钮）\n// 用 JsExtensions.startBrowser → WebViewActivity：它的 onPageFinished 会\n// CookieStore.setCookie(url, cookieManager.getCookie(url))，登录 cookie 才存得下来\n// （源码 SourceLoginDialog/WebViewActivity 实证；showBrowser 走 BottomWebViewDialog，\n//   且只有 SourceLoginJsExtensions 才有，所以作为备选）。\nfunction _dpLuLogin(jav, url) {\n    try {\n        var jv = _dpJv(jav);\n        var u = String(url || '');\n        if (!u) { try { var s = _dpSrcOf(jv); if (s && s.loginUrl) u = String(s.loginUrl); } catch (e0) {} }\n        if (!u) u = 'https://ptlogin.qidian.com/login';\n        try { jv.startBrowser(u, '登录起点'); return ''; } catch (e1) {}\n        try { if (jv && jv.showBrowser) jv.showBrowser(u); } catch (e2) {}\n    } catch (e) { try { jav.toast('打开登录页失败：' + (e && e.message ? e.message : e)); } catch (e3) {} }\n    return '';\n}\n\n// ===========================================================================\n// ★ v54（2026-09-29）番茄登录 / 续期（服务端凭证）\n//   背景：番茄 reader/full 自 2026-09-28 起对匿名请求返回空正文，\n//         必须带登录态（X-Tt-Token + Cookie），否则正文 / 插图全空。\n//   机制：凭证存在服务器 fqauth.json；本按钮打开服务器手机友好登录页，\n//         可在页里看到「是否过期 / 剩余天数」并粘贴新凭证续期。\n// ===========================================================================\nfunction _dpFqAuthBase(jav) {\n    try { if (_DP3_SRV_OK) return String(_DP3_SRV_OK).replace(/\\/+$/, ''); } catch (e0) {}\n    try { if (_DP3_SRVS && _DP3_SRVS.length) return String(_DP3_SRVS[0]).replace(/\\/+$/, ''); } catch (e1) {}\n    return _dpSrv();\n}\n\n// 拉取番茄登录态（短超时，服务端会真连一次 reader/full 探测）；失败返回 null\n\n// 生成按钮文字（跟随当前登录态；拿不到就退回静态文案）\n\n// 打开服务器上的番茄登录页（手机 WebView）\nfunction _dpFqAuthLogin(jav) {\n    try {\n        var jv = _dpJv(jav);\n        var u = _dpFqAuthBase(jv) + '/fq/auth/login';\n        try { jv.startBrowser(u, '番茄登录/续期'); return ''; } catch (e1) {}\n        try { if (jv && jv.showBrowser) jv.showBrowser(u); } catch (e2) {}\n    } catch (e) { try { jav.toast('打开番茄登录页失败：' + (e && e.message ? e.message : e)); } catch (e3) {} }\n    return '';\n}\n\n// ===========================================================================\n// ★ v55（2026-09-29）番茄账号密码登录（官方页）+ 一键回捞凭证\n//   背景：番茄官方登录接口有字节风控签名保护（实测服务端直连 403、App 接口\n//         返回「该应用无权限」），所以不让服务器代填账号密码。\n//   做法：① 用手机内置浏览器打开番茄官方登录页，用户在官方页登录\n//         （账号密码 / 验证码都由官方页处理，我们碰不到密码）；\n//         ② 回到登录页点「一键抓取并保存」，把本机 Cookie 回捞到服务器。\n//   好处：不接触用户密码、无封号风险；凭证自动写入服务器 fqauth.json。\n// ===========================================================================\n\n\n// ★ v58（2026-09-29）番茄凭证链路 —— 抓取 + 上传 + 服务端验号\n//\n// 【抓不到 Cookie 的根因】不是 HttpOnly！\n//   旧版实现：java.getCookieStore().getCookie(url)\n//     Legado 的 JS 里**没有 getCookieStore 这个 API** → if(!ck) return '' 直接空返回\n//     → 表现为「没抓到 Cookie：请先点上面…」。纯粹是 API 用错。\n//   正确姿势（照社区在用的两个番茄源 `🍅番茄专属聚合` / `🍅番茄小说专属`）：\n//     全局 **cookie 对象 + 域名 tag**：  cookie.getCookie('fanqienovel.com')\n//     兜底：                          java.getCookie('fanqienovel.com')\n//   ★ 真机验证（2026-09-29）：cookie.getCookie('fanqienovel.com') 读到 1878 字符 web 登录态；\n//     同时诊断页显示 java.getCookie():true 而 java.getCookieStore():false（该 API 根本不存在）。\n//\n// 【凭证有效性由服务端判定，客户端不用猜】\n//   服务端 v58 用 https://fanqienovel.com/api/user/info/v2 验号（权威判据）：\n//     真 App Cookie   -> code=0  name=春来阁的千妖蝉\n//     真 web 登录态   -> code=0  name=用户29889382\n//     匿名 / 假 sid   -> code=-1 message=请先登录\n//   ★ 注意：「能否解出正文」**不是**凭证判据 —— 番茄 v1 密钥是按 **device_id** 注册的，\n//     与账号无关；免费章任何人（含完全匿名）都能解出同样的正文（实测 20365 字 / free_para_nums=204）。\n//     所以客户端只要把 Cookie 送上去，由服务端验号即可。\nvar _DP_FQ_GRAB_CHAN = '';\n\nfunction _dpFqCookieGet(jv, tag, ckObj) {\n    var v = '';\n    try {\n        if (ckObj && typeof ckObj.getCookie === 'function') v = String(ckObj.getCookie(tag) || '');\n    } catch (e0) { v = ''; }\n    if (!v) {\n        try {\n            if (typeof cookie !== 'undefined' && cookie && typeof cookie.getCookie === 'function') {\n                v = String(cookie.getCookie(tag) || '');\n            }\n        } catch (e1) { v = ''; }\n    }\n    if (!v && jv) {\n        try { if (typeof jv.getCookie === 'function') v = String(jv.getCookie(tag) || ''); } catch (e2) { v = ''; }\n    }\n    if (!v && jv) {\n        try {\n            if (typeof jv.getCookieStore === 'function') {\n                var st = jv.getCookieStore();\n                if (st && typeof st.getCookie === 'function') v = String(st.getCookie('https://' + tag + '/') || '');\n            }\n        } catch (e3) { v = ''; }\n    }\n    return v;\n}\n\n// 抓番茄各域名的 Cookie 并合并（v57：cookie/java.getCookie + 域名 tag）\n// 优先 fanqienovel.com（社区源也是只读这个域）；拿不到再退回 snssdk/字节系。\n// 本地预筛：没看到任何登录态 cookie 名就直接返回 ''（省一次上传；真正判真假由服务端验号）。\n//   install_id / ttreq 匿名也有，不能当登录判据。\nfunction _dpFqGrabCookie(jav, ckObj) {\n    var jv = _dpJv(jav);\n    var PREF = ['fanqienovel.com', 'www.fanqienovel.com', 'm.fanqienovel.com'];\n    var REST = ['fqnovel.com', 'reading.snssdk.com', 'snssdk.com', 'bytedance.com'];\n    var chan = [];\n    var SESS = /(?:^|;\\s*)(?:sessionid|sessionid_ss|sid_guard|sid_tt|sid_ucp_v1|ssid_ucp_v1)=/;\n\n    function merge(list) {\n        var bag = {}, order = [], i, j, m;\n        for (i = 0; i < list.length; i++) {\n            var c = _dpFqCookieGet(jv, list[i], ckObj);\n            if (!c) continue;\n            chan.push(list[i] + '(' + c.length + ')');\n            var parts = c.split(';');\n            for (j = 0; j < parts.length; j++) {\n                var kv = String(parts[j]).replace(/^\\s+|\\s+$/g, '');\n                if (!kv || kv.indexOf('=') < 0) continue;\n                var k = kv.split('=')[0];\n                if (k && !bag[k]) { bag[k] = kv; order.push(k); }\n            }\n        }\n        var out = [];\n        for (m = 0; m < order.length; m++) out.push(bag[order[m]]);\n        return out.join('; ');\n    }\n\n    var s1 = merge(PREF);\n    if (SESS.test(s1)) {\n        try { _DP_FQ_GRAB_CHAN = chan.join(', '); } catch (eA) {}\n        return s1;\n    }\n    var s2 = merge(REST);\n    var all = (s1 && s2) ? (s1 + '; ' + s2) : (s1 || s2);\n    try { _DP_FQ_GRAB_CHAN = chan.join(', ') || '(空)'; } catch (eB) {}\n    return SESS.test(all) ? all : '';\n}\n\n// 抓本机 Cookie → 上传服务器自动保存\n// （只送 Cookie；X-Tt-Token 服务端实测不需要，缺了就沿用上次的值）\n//\n// ★ 上传走三条策略，按「最不依赖 Rhino 类型转换」的顺序试：\n//   S1 GET  /fq/auth/setq?ck=<encodeURIComponent(ck)>\n//        —— java.ajax(url) 只吃 URL，不碰 headers Map，最稳（书源 _dp3Try 也拿它当兜底）\n//   S2 POST /fq/auth/set  body=JSON, headers={...}\n//        —— Legado 的 post 签名是 headers: Map<String,String>，实现体直接 headers.toMutableMap()，\n//           **不做 JSON 解析**；JS 对象字面量能否被 Rhino 转成 Map 不确定，故只作兜底\n//   S3 POST /fq/auth/set  body=JSON, headers={}   —— 空对象，转换失败概率更低\nfunction _dpFqGrabSave(jav, ckObj) {\n    try {\n        var jv = _dpJv(jav);\n        var ck = _dpFqGrabCookie(jv, ckObj);\n        if (!ck) {\n            try { jv.toast('❌ 没抓到登录态 Cookie —— 已打开诊断页'); } catch (e0) {}\n            try { _dpFqDiag(jv); } catch (eD) {}\n            return '';\n        }\n        var base = _dpFqAuthBase(jv);\n        var txt = '', how = '';\n        var tries = [];\n\n        // S1：GET + encodeURIComponent\n        try {\n            var enc = '';\n            try { enc = encodeURIComponent(ck); } catch (eE) { enc = ck; }\n            var u = base + '/fq/auth/setq?ck=' + enc;\n            txt = String(jv.ajax(u, 20000) || '');\n            how = 'S1 GET /fq/auth/setq';\n        } catch (e1) { txt = ''; tries.push('S1:' + (e1 && e1.message ? e1.message : e1)); }\n\n        // S2：POST，headers 传 JS 对象\n        if (!txt) {\n            try {\n                var p2 = JSON.stringify({ Cookie: ck });\n                txt = String(jv.post(base + '/fq/auth/set', p2,\n                    { 'Content-Type': 'application/json;charset=utf-8' }, 20000).body() || '');\n                how = 'S2 POST /fq/auth/set';\n            } catch (e2) { txt = ''; tries.push('S2:' + (e2 && e2.message ? e2.message : e2)); }\n        }\n\n        // S3：POST，headers 传空对象\n        if (!txt) {\n            try {\n                var p3 = JSON.stringify({ Cookie: ck });\n                txt = String(jv.post(base + '/fq/auth/set', p3, {}, 20000).body() || '');\n                how = 'S3 POST(空headers)';\n            } catch (e3) { txt = ''; tries.push('S3:' + (e3 && e3.message ? e3.message : e3)); }\n        }\n\n        var ok = false, msg = '', tail = '';\n        try {\n            var o = JSON.parse(txt);\n            ok = !!o.ok;\n            if (ok) {\n                msg = o.user || o.probe || '';\n                var stt = o.status || {};\n                var dl = (stt.days_left === null || stt.days_left === undefined) ? null : stt.days_left;\n                if (dl !== null) tail = '（剩 ' + dl + ' 天）';\n            } else {\n                msg = o.err || '';\n            }\n        } catch (e4) {}\n        try { jv.toast(ok ? ('✅ 番茄凭证已保存 · ' + msg + tail) : ('❌ 保存失败：' + (msg || '服务器无响应'))); } catch (e5) {}\n        if (ok) {\n            try { if (jv.refreshContent) jv.refreshContent(); } catch (e7) {}\n        } else {\n            try {\n                var d = _dpFqDiagText(jv);\n                d += '\\n\\n--- 本次上传 ---\\n抓取通道: ' + String(_DP_FQ_GRAB_CHAN || '(无)')\n                   + '\\nCookie 长度: ' + ck.length\n                   + '\\n上传策略: ' + (how || '(三条全失败)')\n                   + '\\n策略报错: ' + (tries.join(' | ') || '(无)')\n                   + '\\n服务器返回: ' + (txt || '(空)');\n                _dpFqShowDiag(jv, '❌ 保存失败 · 诊断', d);\n            } catch (e8) {}\n        }\n    } catch (e) { try { jav.toast('抓取失败：' + (e && e.message ? e.message : e)); } catch (e9) {} }\n    return '';\n}\n\n// ★ v57：打开番茄官方页并**等待**用户登录完成（startBrowserAwait），\n//   浏览器一关就立刻抓 Cookie 并保存 —— 一步到位，不用再点第二个按钮。\nfunction _dpFqWebLogin(jav, ckObj) {\n    var jv = _dpJv(jav);\n    var opened = false;\n    try {\n        if (jv && typeof jv.startBrowserAwait === 'function') {\n            jv.startBrowserAwait('https://fanqienovel.com/', '番茄登录（登录完成后返回）');\n            opened = true;\n        }\n    } catch (e1) { opened = false; }\n    if (!opened) {\n        try { return _dpFqAuthLogin(jv); } catch (e2) {}\n        try { if (jv && jv.toast) jv.toast('无法打开番茄登录页，请检查书源服务器连接'); } catch (e3) {}\n        return '';\n    }\n    try { return _dpFqGrabSave(jv, ckObj); } catch (e4) { return ''; }\n}\n\n// ★ v56（2026-09-29）候选域名清单（抓取范围加宽）\nfunction _dpFqCookieHosts() {\n    return [\n        'https://fanqienovel.com', 'https://fanqienovel.com/',\n        'https://www.fanqienovel.com', 'https://www.fanqienovel.com/',\n        'https://m.fanqienovel.com', 'https://m.fanqienovel.com/',\n        'https://reading.snssdk.com', 'https://reading.snssdk.com/',\n        'https://api5-normal-sinfonlineb.fqnovel.com', 'https://api5-normal-sinfonlineb.fqnovel.com/',\n        'https://api.fqnovel.com', 'https://api.fqnovel.com/',\n        'https://fqnovel.com', 'https://fqnovel.com/',\n        'https://sso.snssdk.com', 'https://sso.snssdk.com/',\n        'https://passport.snssdk.com', 'https://passport.snssdk.com/',\n        'https://snssdk.com', 'https://snssdk.com/',\n        'https://sso.bytedance.com', 'https://sso.bytedance.com/',\n        'https://bytedance.com', 'https://bytedance.com/',\n        'https://www.bytedance.com', 'https://www.bytedance.com/'\n    ];\n}\n\n// 诊断文本 → 用内置浏览器展示成可读页面\nfunction _dpFqShowDiag(jav, title, lines) {\n    var jv = _dpJv(jav);\n    var esc = String(lines == null ? '' : lines)\n        .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n    var html = '<!DOCTYPE html><html><head><meta charset=\"utf-8\">'\n        + '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">'\n        + '<style>body{background:#f5f6f8;color:#1f2328;margin:0;padding:14px;'\n        + 'font:14px/1.6 -apple-system,\"PingFang SC\",\"Microsoft YaHei\",sans-serif}'\n        + 'h2{font-size:17px;margin:0 0 10px}pre{background:#1f2328;color:#e8eaed;padding:12px;'\n        + 'border-radius:9px;font-size:11.5px;line-height:1.55;white-space:pre-wrap;word-break:break-all}</style>'\n        + '</head><body><h2>' + title + '</h2><pre>' + esc + '</pre></body></html>';\n    try { jv.startBrowser('https://fanqienovel.com/', title, html); return true; } catch (e0) {}\n    try { if (jv.showBrowser) { jv.showBrowser('https://fanqienovel.com/', html, '', ''); return true; } } catch (e1) {}\n    return false;\n}\n\n// 采集诊断信息（纯文本）\nfunction _dpFqDiagText(jav) {\n    var jv = _dpJv(jav), L = [], ck = null, err = '', i;\n    L.push('java 对象          : ' + (jv ? 'OK' : 'NULL'));\n    L.push('java.getCookieStore: ' + !!(jv && jv.getCookieStore));\n    try { ck = (jv && jv.getCookieStore) ? jv.getCookieStore() : null; } catch (e0) { err = String(e0 && e0.message ? e0.message : e0); }\n    L.push('CookieStore 实例   : ' + (ck ? 'OK' : 'NULL') + (err ? ('  err=' + err) : ''));\n    L.push('java.getCookie()   : ' + !!(jv && typeof jv.getCookie === 'function'));\n    L.push('store.getCookie()  : ' + !!(ck && typeof ck.getCookie === 'function'));\n    L.push('store.getKey()     : ' + !!(ck && typeof ck.getKey === 'function'));\n    L.push('');\n    L.push('--- 各域名 Cookie（最多显示 180 字）---');\n    var hosts = _dpFqCookieHosts(), nonEmpty = 0;\n    for (i = 0; i < hosts.length; i++) {\n        var v = '';\n        try { v = String(ck && ck.getCookie ? (ck.getCookie(hosts[i]) || '') : ''); } catch (e2) { v = 'ERR:' + (e2 && e2.message); }\n        if (v && v.indexOf('ERR:') !== 0) nonEmpty++;\n        L.push((v ? '[有] ' : '[空] ') + hosts[i] + '  =>  ' + (v ? (v.length + ' 字符  ' + v.slice(0, 180)) : ''));\n    }\n    L.push('');\n    L.push('非空域名数: ' + nonEmpty + ' / ' + hosts.length);\n    var merged = _dpFqGrabCookie(jv);\n    L.push('合并后长度: ' + merged.length);\n    L.push('合并内容  : ' + (merged || '(空)'));\n    L.push('');\n    L.push('--- 服务端 ---');\n    var base = _dpFqAuthBase(jv);\n    L.push('base = ' + base);\n    var st = null;\n    try { st = _dp3Try(jv, '/fq/auth/status?test=1', null, 8000); } catch (e3) {}\n    L.push('status = ' + (st ? JSON.stringify(st) : '(取不到)'));\n    return L.join('\\n');\n}\n\nfunction _dpFqDiag(jav) {\n    try {\n        var jv = _dpJv(jav);\n        var txt = _dpFqDiagText(jv);\n        if (!_dpFqShowDiag(jv, '🔍 番茄凭证抓取诊断', txt)) {\n            try { jv.toast(txt.slice(0, 400)); } catch (e1) {}\n        }\n    } catch (e) { try { jav.toast('诊断失败：' + (e && e.message ? e.message : e)); } catch (e2) {} }\n    return '';\n}\n\n// 从 Legado CookieStore 抓番茄 / 字节各域名的 Cookie，合并成一条\n\n\n// 抓本机 Cookie → POST 到服务器 /fq/auth/set 自动保存\n// （只送 Cookie；缺 X-Tt-Token 时服务器会沿用上次的值）\n\n\n// 生成整个界面（返回 JSON 字符串）\nfunction _dpLuList(bko, jav) {\n    var rows = [];\n    jav = _dpJv(jav);\n    try {\n        rows.push(_dpLuRow(\"lu_login_head\", \"↓   账号登录   ↓\", null, false, 1));\n        rows.push(_dpLuRow(\"lu_fqweb\", \"🍅 番茄账号登录\", \"_dpFqWebLogin(java, (typeof cookie!==\\\"undefined\\\"?cookie:null))\", false, 0.45));\n        rows.push(_dpLuRow(\"lu_login\", \"📖 起点网页登录\", \"_dpLuLogin(java, \\\"\\\")\", false, 0.45));\n        try { rows = rows.concat(_dpGradeRows(jav)); } catch (eG0) {}\n        try { rows = rows.concat(_dpSegHotRows(jav)); } catch (eS0) {}\n        return JSON.stringify(rows);\n    } catch (e) {\n        try { return _dpLuFallback(); } catch (e2) { return \"[]\"; }\n    }\n}\n\n// ★★ v44（2026-09-21）用户要的「正文全部用第三方源」开关。\n//   取值：'auto'（默认）= 起点优先，读到收费试读/取不到正文时才补章；\n//         'third'      = 正文**一律**第三方直供，不再先解析起点正文。\n//   取书级 dp3mode（在「⚙ 补章源设置」里切）→ 其次书源级 dp3mode → 都没有就是 auto。\n//   注意：除了正文，目录/封面/书名/段评/热评 **仍然全部来自起点**，\n//   段评对齐用的 bid/cid 也是照旧从起点目录现查（这一层完全没动）。\n\n// ★ v45：手动换源选定的子源下标（「⚙ 补章源设置」里点的那个）。\n//   一站式通道必须把它**转给服务端**（/qqdp/read?i=N），否则手动换源会被\n//   服务端自己的候选打分排序盖掉 —— 表现就是「点了换源没变化」。\n\n// ★ v45：本「章」的起算时刻 —— 让「服务端一站式」和「本地兜底」共用同一个\n//   总预算。否则服务端先花掉 20s，本地兜底还会再跑满一个 _DP3_BUDGET。\n\n// ★★ v45（2026-09-21）：服务端「一站式章节」——**一次 POST** 拿到\n//   「已净化的第三方正文 + 起点段评气泡 + 本章说热评卡」的最终 HTML。\n//\n//   为什么要有它（用户诉求 + 性能）：\n//     ① 用户原话「像魔丸小说那样，服务端做好正文+段评，一次性发给我」；\n//     ② 以前手机端要自己跑 4~5 次 HTTP（search → book → toc → chapter → inline），\n//        每次带 15~40s 预算，最坏加起来一分钟（用户报「替补真的很慢 至少等了一分钟」）。\n//   服务端一次做完，并且**自带跨章缓存**：命中 30~45ms、同书新章 <1s（实测）。\n//\n//   参数：name/author/chapter 走 query；text（起点正文兜底）走 POST body ——\n//   正文可能有几十 KB，放 URL 会被截断。第三方源全挂时服务端仍能用这份起点\n//   正文挂段评，保证「三个通道至少出一个结果」。\n\n// 主入口：起点的书名/作者/章节名 + java + source\n// qdText（v45 新增，可空）= 起点那一版正文，只作为服务端的兜底素材。\n\n\n// ==================== 发现页（majax JSON 接口）用的 _csrfToken ====================\n// 起点 majax 接口必须把 _csrfToken 放 **URL 参数** 里（放 Cookie 请求头无效，实测 code=1 失败）。\n// 该 token 由服务端 Set-Cookie 下发（首页不发，其余页面都发），所以：\n//   ① 先问 Legado 的 CookieStore（用户搜过一次书就有了）\n//   ② 没有就现场抓一个页面拿\n//   ③ 拿到的存进书源变量，12 小时内不再重复取\nfunction __qpCsrf(jav, ck, src) {\n    var K = 'qp_csrf', TTL = 12 * 3600 * 1000, tok = '';\n    var now = 0; try { now = new Date().getTime(); } catch (e) { now = 0; }\n    // 内存缓存\n    try { if (_QP_CSRF && _QP_CSRF.t && (now - _QP_CSRF.t) < TTL) return _QP_CSRF.v; } catch (e0) {}\n    // 书源变量缓存\n    try {\n        var raw = src ? String(src.get(K) || '') : '';\n        if (raw) {\n            var o = JSON.parse(raw);\n            if (o && o.t && (now - o.t) < TTL && o.v) return String(o.v);\n        }\n    } catch (e1) {}\n    // ① CookieStore（社区实践：cookie.getKey(url, key)）\n    try { tok = String(ck.getKey('https://qidian.com', '_csrfToken') || ''); } catch (e2) { tok = ''; }\n    // ② 现场抓（排行榜页会 Set-Cookie）\n    if (!tok) {\n        var urls = ['https://m.qidian.com/rank/', 'https://m.qidian.com/free/', 'https://m.qidian.com/'];\n        for (var i = 0; i < urls.length && !tok; i++) {\n            var r = null;\n            try { r = jav.get(urls[i], null, 15000); } catch (e3) { r = null; }\n            if (!r) continue;\n            try { tok = String(r.cookie('_csrfToken') || ''); } catch (e4) { tok = ''; }\n            if (!tok) {\n                var hh = '';\n                try { hh = String(r.headers() || ''); } catch (e5) { hh = ''; }\n                try { hh += '|' + String(r.headers().values('Set-Cookie').join('|') || ''); } catch (e5b) { hh = ''; }\n                var m1 = hh.match(/_csrfToken=([0-9a-fA-F\\-]{16,})/);\n                if (m1) tok = m1[1];\n            }\n            if (!tok) {\n                var bd = '';\n                try { bd = String(r.body() || ''); } catch (e6) { bd = ''; }\n                var m2 = bd.match(/_csrfToken[\"']?\\s*[:=]\\s*[\"']?([0-9a-fA-F\\-]{16,})/);\n                if (m2) tok = m2[1];\n            }\n        }\n    }\n    if (tok) {\n        try { _QP_CSRF = { t: now, v: tok }; } catch (e7) {}\n        try { if (src) src.put(K, JSON.stringify({ t: now, v: tok })); } catch (e8) {}\n    }\n    return tok;\n}\nvar _QP_CSRF = null;\n\n\n// XML 转义（SVG 文本用）\n\n// 文本显示宽度（中文按 1，西文按 0.56）——用来算按钮宽度\n\n// 取 click/正文里注入的上下文（java / book / chapter）\nfunction _dpCtx() {\n    var o = { java: null, book: null, chapter: null };\n    // ① 作用域全局：规则层直接调本函数时才有效（jsLib 内部调用一般取不到，见文件头铁律）\n    try { if (typeof java !== 'undefined' && java) o.java = java; } catch (e1) {}\n    try { if (typeof book !== 'undefined' && book) o.book = book; } catch (e2) {}\n    try { if (typeof chapter !== 'undefined' && chapter) o.chapter = chapter; } catch (e3) {}\n    // ② this 上挂的（个别上下文会挂）\n    try { if (!o.java && this && this.java) o.java = this.java; } catch (e4) {}\n    try { if (!o.book && this && this.book) o.book = this.book; } catch (e5) {}\n    try { if (!o.chapter && this && this.chapter) o.chapter = this.chapter; } catch (e6) {}\n    // ③ 兜底缓存（v14）：_dpSetCtx 在规则层入口写入\n    if (!o.java) o.java = _dpJv();\n    try { if (!o.book && _DP_BK) o.book = _DP_BK; } catch (e7) {}\n    try { if (!o.chapter && _DP_CH) o.chapter = _DP_CH; } catch (e8) {}\n    return o;\n}\n\nfunction _dpBookName(b) {\n    try { if (b && b.name) return String(b.name).trim(); } catch (e) {}\n    return '';\n}\n\n// 书籍级变量（Book.getVariable / putVariable）\nfunction _dpBGet(b, k) {\n    if (!b || typeof b.getVariable !== 'function') return '';\n    try { var v = b.getVariable(k); return (v === undefined || v === null) ? '' : String(v); } catch (e) {}\n    return '';\n}\nfunction _dpBPut(b, k, v) {\n    if (!b || typeof b.putVariable !== 'function') return;\n    try { b.putVariable(k, String(v == null ? '' : v)); } catch (e) {}\n}\n\n// 从 java(SourceLoginJsExtensions) 拿 source（读持久变量用）\nfunction _dpSrcOf(jv) {\n    try {\n        if (jv) {\n            var s = null;\n            try { if (typeof jv.getSource === 'function') s = jv.getSource(); } catch (e0) {}\n            if (s && typeof s.get === 'function') return s;\n            // 有的上下文里 java 本身就是书源对象（BaseSource.evalJS 把 java 绑成 source）\n            if (typeof jv.get === 'function' && typeof jv.put === 'function') return jv;\n        }\n    } catch (e) {}\n    return null;\n}\n\n// 候选源列表（书源变量，持久；书名作 key）\nfunction _dpCandKey() { return 'dp3cands_'; }\nfunction _dpCandGet(b, src) {\n    var k = _dpCandKey() + _dpBookName(b);\n    var s = src ? (_dp3Get(src, k) || '') : '';\n    if (!s) s = _dpBGet(b, 'dp3cands');\n    if (!s) return null;\n    try { var a = JSON.parse(String(s)); if (a && a.length) return a; } catch (e) {}\n    return null;\n}\nfunction _dpCandSet(b, src, arr) {\n    var s = '';\n    try { s = JSON.stringify(arr); } catch (e1) { return; }\n    _dpBPut(b, 'dp3cands', s);\n    if (src) { try { _dp3Put(src, _dpCandKey() + _dpBookName(b), s); } catch (e2) {} }\n}\n\n// 用户手动选定的源（书籍级，优先于自动锁定）\nfunction _dpPickGet(b) {\n    var s = _dpBGet(b, 'dp3pick');\n    if (!s) return null;\n    // v49i：u 可以为空（用户在换源界面直接点了「全部备选源」里的源，\n    //       书在该源的地址要等补章时用单源搜索补）——只认 i 是否存在。\n    try { var o = JSON.parse(s); if (o && o.i) return o; } catch (e) {}\n    return null;\n}\nfunction _dpPickSave(c, it) {\n    var b = c.book, jv = c.java, k = _dpBookName(b);\n    var o = { i: it.i, u: it.u, n: it.n || '' };\n    _dpBPut(b, 'dp3pick', JSON.stringify(o));\n    _dpBPut(b, 'dp3cur', String(o.n || ''));\n    _dpBPut(b, 'dp3err', '');\n    var s = _dpSrcOf(jv);\n    if (s) { try { _dp3Put(s, 'dp3_' + k, JSON.stringify({ i: o.i, u: o.u })); } catch (e4) {} }\n    // 手动换源必须清掉「上次失败」缓存(dp3miss 默认 6 小时)，否则换了也补不出章\n    _dpBPut(b, 'dp3miss_' + k, '');\n    if (s) { try { _dp3Put(s, 'dp3miss_' + k, ''); } catch (e6) {} }\n    try { delete _DP3_CACHE['dp3miss_' + k]; } catch (e7) {}\n    try { if (k) _DP3_CACHE[k] = { i: o.i, u: o.u }; } catch (e5) {}\n    return o;\n}\nfunction _dpPickClear(c) {\n    var b = c.book, jv = c.java, k = _dpBookName(b);\n    _dpBPut(b, 'dp3pick', '');\n    _dpBPut(b, 'dp3cur', '');\n    _dpBPut(b, 'dp3err', '');\n    var s = _dpSrcOf(jv);\n    if (s) {\n        try { _dp3Put(s, 'dp3_' + k, ''); } catch (e1) {}\n        try { _dp3Put(s, 'dp3miss_' + k, ''); } catch (e2) {}\n    }\n    try { delete _DP3_CACHE['dp3miss_' + k]; } catch (e3) {}\n}\n\n// 子源显示名：搜索结果 intro 里的「[来自:2K小说]」\nfunction _dp3SrcName(r) {\n    try {\n        var t = String(r.intro || '');\n        var m = t.match(/来自\\s*[:：]\\s*([^\\]\\s|]+)/);\n        if (m && m[1]) return String(m[1]).trim();\n        var lc = String(r.lastChapter || '');\n        var p = lc.split(/[:：]/);\n        if (p.length > 1 && p[0] && p[0].length <= 12) return String(p[0]).trim();\n        var bu = String(r.bookUrl || '');\n        var mu = bu.match(/[?&]u=([^&]+)/);\n        if (mu) {\n            var u = decodeURIComponent(mu[1]);\n            var md = u.match(/^https?:\\/\\/([^\\/]+)/);\n            if (md) return md[1];\n        }\n    } catch (e) {}\n    return '';\n}\n\n// 生成一个胶囊按钮（SVG → base64 img）\n\n// 章节顶部按钮条：只在「本章确实是 VIP 补章」时出现\n\n\n// ---- 点击回调（由正文里的图片 click 触发）----\n\n// 选第 idx 个候选源；idx<0 表示恢复「自动」\n\n// 切到下一个源（循环）\n\n// 展开 / 收起源列表\n\n// 清掉锁定与失败缓存，重新搜一遍源\n\n// 供正文规则写「本章用了哪个源」的标记\n\n\n// ==================== v11：补章「换源」小图标 ====================\n// 为什么搬到章节标题行尾：\n//   1) 正文里出现按钮会打断阅读；\n//   2) 正文里并排放多个图标，点击会被「左边的邻居」吃掉 ——\n//      阅读器命中测试是 ImageColumn.isTouch(x) = x > start && x < end + 20dp（向右扩 20dp），\n//      并且 textLine.columns 从左往右取第一个命中的列。于是「换源」的点击区会盖住「选源」，\n//      而左边那个没有 click 的标签图标又会先一步被命中 → 表现就是「点了没反应」。\n//   3) 标题行只有一个图标，右扩的 20dp 落在标题右侧空白里，不会抢；\n//      而且标题图在「文字嵌入(TEXT)」图片样式下依然保留 click（正文图会被丢掉 clickList）。\n\n// 标题规则调用：只有「本章确实走了补章」才返回图标，其余一律返回 ''（标题保持原样、零打扰）\n\n// 点图标：切到下一个可用补章源 → 重载本章\n\n// 纯标签图标被点到时的兜底回应（避免出现「点了完全没反应」）\n\n/* ==================================================================\n * v49i（2026-09-23）第三方聚合直读：起点没有的书，这个源也能搜到、也能读\n *\n *   用户诉求：「起点没有的书，但是服务器上部署的书源上有，用这个 JSON\n *   书源搜索能搜到吗」→ 要能搜到、能读。用户同时要求「做好失败回退，\n *   保证正常使用的版本」，所以：\n *     ① 搜索：起点结果**照旧**（正则逐字段复刻原 CSS 规则，一个字段都不少），\n *        第三方聚合结果追加在后。服务器连不上/超时/返回空 → 只有起点结果，\n *        行为与改版前完全一致。\n *     ② 详情/目录/正文：靠 URL 辨认来源（带 /api/book|toc|chapter 即第三方），\n *        起点书走原逻辑，第三方书走服务器 API。\n *     ③ 段评/热评只对起点书有效 —— 第三方书起点上没有这本书，自然没有段评\n *        （__dpInject 对第三方书直接放行原文）。\n *   服务器地址沿用 _DP3_SRVS/_DP3_SRV_OK，失败自动换台（_dp3TryUrl）。\n * ================================================================== */\nfunction _dpAggHost() {\n    try { if (_DP3_SRV_OK) return _DP3_SRV_OK; } catch (e0) {}\n    try { if (_DP3_SRVS && _DP3_SRVS.length) return _DP3_SRVS[0]; } catch (e1) {}\n    return _dpSrv();\n}\n\n/* ==========================================================================\n * 正文插图 / 彩蛋章（v52，2026-09-25）\n * 起点 APP 章节里的「插图」（图文混排）与「彩蛋章」只在 APP 内下发，网页端\n * 被过滤成纯文本。服务端离线抓取后落成 illu_index.json，这里按 bookId +\n * chapterId 查表，把插图拼进正文末尾（统一走 /api/img 代理）。\n * 命中不到就返回原串 —— 插图只是增量，绝不能影响正文。\n * ======================================================================== */\nfunction __dpIllu(txt, book, chapter, jav) {\n    var t = String(txt == null ? '' : txt);\n    try {\n        function _dec(s) {\n            s = String(s == null ? '' : s);\n            try { return decodeURIComponent(s); } catch (e) { return s; }\n        }\n\n        // ---------- 1) 解析 bookId / chapterId ----------\n        var ch = chapter;\n        if (!ch) { try { ch = _dpCtx().chapter; } catch (eCtx) {} }\n        if (!ch) { try { ch = _DP_CH; } catch (eCh) {} }\n        var bk = book;\n        if (!bk) { try { bk = _dpCtx().book; } catch (eBk) {} }\n\n        var bid = '';\n        try {\n            var bu = _dec(bk && bk.bookUrl ? String(bk.bookUrl) : '');\n            var m0 = bu.match(/book\\/(\\d+)/) || bu.match(/[?&]bid=(\\d+)/)\n                     || bu.match(/bookId=(\\d+)/);\n            if (m0) bid = m0[1];\n        } catch (eB) {}\n        var cid = '';\n        try {\n            var cu = _dec(ch && (ch.url || ch.chapterUrl) ? String(ch.url || ch.chapterUrl) : '');\n            var m1 = cu.match(/chapter\\/(\\d+)\\/(\\d+)/)\n                     || cu.match(/chapterId=(\\d+)/)\n                     || cu.match(/(\\d{6,})\\/?$/)\n                     || cu.match(/\\/(\\d{5,})\\/?$/);\n            if (m1) cid = m1.length > 2 ? m1[2] : m1[1];\n            if (!cid) {\n                var m2 = cu.match(/\\/(\\d{6,})(?:\\/|$)/g);\n                if (m2 && m2.length) {\n                    var last = m2[m2.length - 1].replace(/\\//g, '');\n                    if (last && last !== bid) cid = last;\n                }\n            }\n        } catch (eC) {}\n        if (!cid && t) {\n            try {\n                var m3 = t.match(/chapterId[\"'\\s:=]+(\\d{6,})/);\n                if (m3) cid = m3[1];\n            } catch (eS) {}\n        }\n        // ★★ v66（2026-10-03）：换源 / 第三方（聚合）源章节的 URL 是 `/api/chapter?i=..&u=..`，\n        //   上面几条正则永远抠不出起点 bid/cid ⇒ 直接 `no-cid` 返回、插图全丢\n        //   （用户报的「替补第三方源后插图没有」）。服务端 /api/chapter 现在会回带\n        //   `qd_bid`/`qd_cid`，由 `_dpAggBody` 按同一个 URL 缓存，这里查回来用。\n        if (!bid || !cid) {\n            try {\n                var _aq = (__dpIllu._aggQd || {})[String(_dpAggCur(ch, ''))];\n                if (_aq) { if (!bid) bid = _aq.bid; if (!cid) cid = _aq.cid; }\n            } catch (eAq) {}\n        }\n        if (!cid) {\n            try { _DP_ILLU_DIAG = 'no-cid'; } catch (eD) {}\n            return t;\n        }\n        var kk = (bid || '?') + '_' + cid;\n        try { if (__dpIllu._seen === undefined) __dpIllu._seen = {}; } catch (eInit) {}\n\n        // ruleContent 两条规则都会调到这里：已注入过就跳过\n        if (t.indexOf('class=\"dp-illu\"') >= 0) {\n            try { _DP_ILLU_DIAG = 'skip: already injected'; } catch (eD1) {}\n            return t;\n        }\n\n        // ---------- 2) 取回该章的插图 + 锚点（JSON） ----------\n        var payload = null;\n        if (__dpIllu._seen[kk] !== undefined) {\n            payload = __dpIllu._seen[kk];\n        } else {\n            var host = _dpAggHost();\n            var url = host + '/api/illu?bid=' + encodeURIComponent(bid)\n                            + '&cid=' + encodeURIComponent(cid);\n            var body = '', _netOK = false;\n            // ★★ v66b（2026-10-03）：超时 8s → 25s。**客户端超时必须 ≥ 服务端**。\n            //   服务端 /api/illu 索引未命中时会现打起点 getblockinfo（纯算签名），\n            //   实测冷建 **8.7~8.9s**，正好压过原来的 8s 预算 ⇒ 每个新章首次打开\n            //   **必然超时**：插图、以及挂在「下一章开头」的**彩蛋图**一起丢；\n            //   更糟的是超时后把空 payload 写进了 _seen（下面已改为只缓存真响应），\n            //   该章本次会话内再也不插。给足 25s（命中索引时其实只要 0.1s）。\n            try {\n                var _r1 = jav.get(url, {}, 25000);\n                if (_r1) { body = String(_r1.body() || ''); _netOK = true; }\n            } catch (e0) {\n                try {\n                    var _r2 = jav.get(url, {}, 25000);\n                    if (_r2) { body = String(_r2.body() || ''); _netOK = true; }\n                } catch (e1) { _netOK = false; }\n            }\n            body = String(body || '').replace(/^\\s+|\\s+$/g, '');\n            if (body && body.charAt(0) === '{') {\n                try { payload = JSON.parse(body); } catch (eJ) { payload = null; }\n            }\n            if (!payload) {\n                // 兼容：老服务端返回纯 HTML（无锚点）→ 按规则丢弃，不插\n                payload = { ok: false, hit: false, items: [] };\n            }\n            // ★ v66b：只有**真拿到响应**才写缓存。网络超时/异常不缓存 —— 否则一次抖动\n            //   就把「本章没有插图」钉死一整个会话（插图与彩蛋都要靠这里）。\n            if (_netOK) { try { __dpIllu._seen[kk] = payload; } catch (eS0) {} }\n        }\n        var items = (payload && payload.items) ? payload.items : [];\n        try {\n            _DP_ILLU_DIAG = 'bid=' + bid + ' cid=' + cid + ' items=' + items.length;\n        } catch (eD2) {}\n        if (!items.length) return t;\n\n        // ---------- 3) 正文规范化（用于锚点模糊匹配） ----------\n        // 归一化：去掉所有空白、统一全/半角引号与省略号，方便跨书源比对。\n        function _norm(s) {\n            return String(s == null ? '' : s)\n                .replace(/[\\s\\u3000]+/g, '')\n                .replace(/[\\u2018\\u2019\\u201c\\u201d\\u300c\\u300d\\u300e\\u300f]/g, '\"')\n                .replace(/[\\u2026]+/g, '\\u2026')\n                .replace(/[\\u2014\\u2015]+/g, '\\u2014');\n        }\n        // ★ v62：一次扫描原文，同步产出归一化文本 N 与「归一化字符 → 原文起始下标」S。\n        //   旧版逐字符 _norm(单字) 累加，遇到 `……`/`——` 折叠时会把 mapN 撑长，\n        //   导致插入点整体前移、切断句子（这次就是切在「回味无穷」和「啊。\"」之间）。\n        var txtN = '', srcArr = [];\n        (function () {\n            var i = 0, n = t.length;\n            while (i < n) {\n                var c = t.charAt(i);\n                if (c === '\\u2026') {\n                    var j1 = i; while (j1 < n && t.charAt(j1) === '\\u2026') j1++;\n                    txtN += '\\u2026'; srcArr.push(i); i = j1; continue;\n                }\n                if (c === '\\u2014' || c === '\\u2015') {\n                    var j2 = i; while (j2 < n && (t.charAt(j2) === '\\u2014' || t.charAt(j2) === '\\u2015')) j2++;\n                    txtN += '\\u2014'; srcArr.push(i); i = j2; continue;\n                }\n                if (/[\\s\\u3000]/.test(c)) { i++; continue; }\n                if (/[\\u2018\\u2019\\u201c\\u201d\\u300c\\u300d\\u300e\\u300f]/.test(c)) {\n                    txtN += '\"'; srcArr.push(i); i++; continue;\n                }\n                txtN += c; srcArr.push(i); i++;\n            }\n        })();\n\n        // 归一化下标 -> 原文插入点（末字符之后，并吞掉收尾标点/引号/空白）\n        function _posOf(endNorm) {\n            var posRaw = srcArr[endNorm];\n            if (posRaw === undefined) return -1;\n            // 若末字属于折叠 run（… / —），跳到该 run 在原文中的末尾\n            var ch0 = t.charAt(posRaw);\n            if (ch0 === '\\u2026') {\n                var jj = posRaw; while (jj < t.length && t.charAt(jj) === '\\u2026') jj++;\n                posRaw = jj - 1;\n            } else if (ch0 === '\\u2014' || ch0 === '\\u2015') {\n                var jj2 = posRaw; while (jj2 < t.length && (t.charAt(jj2) === '\\u2014' || t.charAt(jj2) === '\\u2015')) jj2++;\n                posRaw = jj2 - 1;\n            }\n            var pos = posRaw + 1;   // 落锚点末字符之后\n            // ★ v58 吸附：把紧跟其后的收尾标点 / 引号 / 空白一起吞掉，\n            //   让插图落在「整句完全结束」之后（否则 `啊。\\\"` 会被切到图下面）。\n            var TAILCH = '\\u3002\\uff01\\uff1f\\uff1b\\uff0c\\u2026\\u2014\"\\'\\u201d\\u2019)\\uff09]\\u3011\\u300b\\u300d\\u300f}> \\t\\r\\n\\u3000';\n            while (pos < t.length && TAILCH.indexOf(t.charAt(pos)) >= 0) pos++;\n            // ★ v62：若正好停在段尾 `</p>` 之前，则把图放到该段之后（独立成块）\n            if (t.substr(pos, 4) === '</p>') pos += 4;\n            return pos;\n        }\n        // 锚点句在正文里的**所有**落点（归一化后逐次查找）\n        function _endsOf(anchorBefore) {\n            var a = _norm(anchorBefore), res = [], from = 0, guard = 0;\n            if (a.length < 4) return res;          // 太短不可信\n            while (guard++ < 64) {\n                var ip = txtN.indexOf(a, from);\n                if (ip < 0) break;\n                var p = _posOf(ip + a.length - 1);\n                if (p >= 0) res.push(p);\n                from = ip + 1;\n            }\n            if (!res.length) {\n                // 退化：只取锚点句的最后 8 个字（避免中间被改字）\n                var tail = a.slice(-8), tp = txtN.indexOf(tail);\n                if (tp >= 0) { var q1 = _posOf(tp + tail.length - 1); if (q1 >= 0) res.push(q1); }\n            }\n            if (!res.length) {\n                // 再退化：取锚点句的前 8 个字\n                var head = a.slice(0, 8), hp = txtN.indexOf(head);\n                if (hp >= 0) { var q2 = _posOf(hp + head.length - 1); if (q2 >= 0) res.push(q2); }\n            }\n            return res;\n        }\n        // ★ 2026-09-30：锚点句很短且正文里出现多次时（如「那种感觉又来了：」），\n        //   旧的 indexOf 固定取**第一处**——若真正该插图的那处在后面就会错位，\n        //   违反用户硬性要求「宁可不插，绝不错位」。现在用 para 定位点作参考，\n        //   取离它最近的那一处；只有一处命中时与旧版行为完全一致。\n        function _findEnd(anchorBefore, refRaw) {\n            var res = _endsOf(anchorBefore);\n            if (!res.length) return -1;\n            if (refRaw >= 0 && res.length > 1) {\n                var best = res[0], bd = Math.abs(res[0] - refRaw);\n                for (var i = 1; i < res.length; i++) {\n                    var d = Math.abs(res[i] - refRaw);\n                    if (d < bd) { bd = d; best = res[i]; }\n                }\n                return best;\n            }\n            return res[0];\n        }\n\n        // ★ v63（2026-09-29）：按「有效段号」定位。\n        //   VIP 章起点只给开头试读，服务端拿不到第 N 段文本，只能回传\n        //   anchor.para（= BlockInfo.Attach）。而 Attach 恒等于子源有效段号\n        //   （服务端 align_to_qd 的恒等映射，样本 26/61 实测 1:1），\n        //   故照服务端口径数一遍有效段即可定位。\n        //   口径对齐：有效段 = 去标签去空白后非空，且（字数 < 4 或不命中广告模式）\n        //   —— 与 qqdp_inject._is_ad_line 一致。\n        var _AD_RE = /下载本站免费小说阅读器|手机浏览器扫码下载|随时随地免费看小说|本章有错误|推荐本书|加入书架|投推荐票|收藏本站|手机浏览器访问|打开手机阅读|返回书架|最新网址|浏览器打开|点击安装|继续阅读|作者的话|作者有话说|作者感言|先更后改|求月票|求推荐票|求订阅|求票|ps[:：]|PS[:：]/;\n        // 段的边界表：把 <p> 与 \\n 都当分隔符。\n        //   ★ 2026-09-30：起点 m 站 SSR 正文用 `<p>` 分段且**没有换行**，旧版只认 \\n\n        //   会把整章当成 1 段 → para>=2 一律落空。子源正文用 \\n，两者都要成立。\n        //   返回 [{start,end}]，end == 该段最后一个内容字符之后（即分隔符起点），\n        //   \\n 情形与旧版 `end` 完全一致，行为零变化。\n        function _segBounds() {\n            var bs = [], re = /<p[^>]*>|<\\/p\\s*>|\\r?\\n/g, m2;\n            var cur = 0;\n            while ((m2 = re.exec(t)) !== null) {\n                bs.push({ start: cur, end: m2.index });\n                cur = m2.index + m2[0].length;\n            }\n            bs.push({ start: cur, end: t.length });\n            return bs;\n        }\n        function _findByParaEnd(n) {\n            if (!(n > 0)) return -1;\n            var bs = _segBounds(), cnt = 0;\n            for (var i = 0; i < bs.length; i++) {\n                var s = t.slice(bs[i].start, bs[i].end)\n                    .replace(/<[^>]*>/g, '').replace(/&nbsp;/g, ' ');\n                s = s.replace(/^\\s+|\\s+$/g, '');\n                if (!s) continue;\n                // 服务端：len < 4 不算广告（短对白同样算有效段）\n                if (s.length >= 4 && _AD_RE.test(s)) continue;\n                cnt++;\n                if (cnt === n) return bs[i].end;\n            }\n            return -1;\n        }\n\n        // ---------- 4) 逐个锚点定位并插入（从后往前插，避免位移） ----------\n        var plan = [];\n        for (var ii = 0; ii < items.length; ii++) {\n            var it = items[ii] || {};\n            var anc = it.anchor || {};\n            var at = -1;\n            // ★ 2026-09-30：para（= BlockInfo.Attach = 有效段号）先算出来，\n            //   既作最终兜底，也作**文本锚点消歧**的参考点（见 _findEnd）。\n            var paraRef = (anc.para > 0) ? _findByParaEnd(anc.para) : -1;\n            if (anc.before) at = _findEnd(anc.before, paraRef);\n            if (at < 0 && anc.after) {\n                // 没给 before，用 after（图后那句）→ 插在它前面\n                var an = _norm(anc.after), ap = -1, from2 = 0, g2 = 0;\n                while (g2++ < 64) {\n                    var h2 = txtN.indexOf(an, from2);\n                    if (h2 < 0) break;\n                    var p3 = srcArr[h2];\n                    if (p3 !== undefined && (ap < 0\n                            || (paraRef >= 0 && Math.abs(p3 - paraRef) < Math.abs(ap - paraRef)))) {\n                        ap = p3;\n                    }\n                    if (ap >= 0 && paraRef < 0) break;\n                    from2 = h2 + 1;\n                }\n                at = ap;\n            }\n            // ★ v63：文本锚点全部失配 -> 退回「有效段号」定位\n            if (at < 0) at = paraRef;\n            if (at < 0) {\n                // ★ 定位失败：丢弃这张图（用户硬性要求，绝不落章末）\n                try { _DP_ILLU_DIAG += ' drop@' + ii; } catch (eDd) {}\n                continue;\n            }\n            plan.push({ at: at, html: it.html });\n        }\n        if (!plan.length) {\n            return t;\n        }\n\n        plan.sort(function (a, b) { return a.at - b.at; });\n        var out = '', last = 0;\n        for (var pi = 0; pi < plan.length; pi++) {\n            var p = plan[pi];\n            var cut = (p.at < last) ? last : p.at;\n            var seg = t.slice(last, cut);\n            // ★ v59：图片块独立成行，避免与正文粘连\n            if (seg && !/[\\r\\n]$/.test(seg)) seg += '\\n';\n            out += seg;\n            out += '<div class=\"dp-illu\">' + p.html + '</div>';\n            last = cut;\n        }\n        var rest = t.slice(last);\n        if (rest && !/^[\\r\\n]/.test(rest) && !/^\\s*$/.test(rest)) {\n            out += '\\n';\n        }\n        out += rest;\n        return out;\n    } catch (e) {\n        try { _DP_ILLU_DIAG = 'err ' + (e && e.message ? e.message : String(e)); } catch (eD3) {}\n        return t;\n    }\n}\n\nfunction _dpIsAgg(u) {\n    return /\\/api\\/(?:book|toc|chapter)\\?/i.test(String(u == null ? '' : u));\n}\nfunction _dpAggI(u) { var m = String(u == null ? '' : u).match(/[?&]i=(\\d+)/); return m ? m[1] : ''; }\nfunction _dpAggU(u) { var m = String(u == null ? '' : u).match(/[?&]u=([^&]+)/); return m ? decodeURIComponent(m[1]) : ''; }\n// ★ v83（2026-10-05）：判断当前聚合章节是否「番茄子源」（u 参数指向 /fq/*）。\n//   番茄段评是服务端注入，开关（气泡/段卡/章末卡/主题）需客户端传参触发重拉。\n// 给聚合的 /api/chapter 请求追加 bubble/segcard/endcard/theme 开关参数。\n// ★ 2026-10-23：顺手把注释里的「番茄」删掉 —— 服务端现在两条注入路径\n//   （番茄 /fq/content、第三方 _dp_inject_chapter）都按这四个参数裁剪，\n//   参数对任何聚合章节都成立，不再是番茄专属。\nfunction _dpAggSwUrl(url, jav) {\n    var b = true, s = true, e = true, t = 'light';\n    try { b = _dpBubbleOn(jav); } catch (e0) {}\n    try { s = _dpSegCardOn(jav); } catch (e1) {}\n    try { e = _dpEndCardOn(jav); } catch (e2) {}\n    try { t = _dpTheme(jav); } catch (e3) {}\n    return url + (url.indexOf('?') >= 0 ? '&' : '?')\n        + 'bubble=' + (b ? '1' : '0')\n        + '&segcard=' + (s ? '1' : '0')\n        + '&endcard=' + (e ? '1' : '0')\n        + '&theme=' + t;\n}\nfunction _dpAggApi(kind, i, u) {\n    return _dpAggHost() + '/api/' + kind + '?i=' + i + '&u=' + encodeURIComponent(u);\n}\n// 当前章节/书籍是不是第三方（聚合）来源\n// ★ v49j 修 bug：Legado 里 chapter.baseUrl 是**书本**URL，chapter.url 才是**本章**URL。\n//   旧实现读 chapter.baseUrl → 拿到的是 /api/book（或 /api/toc），于是 _dpAggBody 在\n//   需要自己补拉正文时（raw 为空）拿书本页当正文 → 必然「没取到正文」。\n//   离线桩把 baseUrl 当成章节地址喂进去，所以一直没暴露；线上联调一测就现。\nfunction _dpAggCur(chapter, baseUrl) {\n    var a = '';\n    try { a = chapter ? String(chapter.url || '') : ''; } catch (e0) {}\n    if (!_dpIsAgg(a)) { try { a = chapter ? String(chapter.baseUrl || '') : ''; } catch (e1) {} }\n    if (!_dpIsAgg(a)) { try { a = String(baseUrl || ''); } catch (e2) {} }\n    return a;\n}\nfunction _dpAggWant(chapter, baseUrl) { return _dpIsAgg(_dpAggCur(chapter, baseUrl)); }\n// 搜索结果题注里的「[来自:XXX]」标记 → 去掉（来源信息改放 kind 里显示）\nfunction _dpAggStripIntro(s) {\n    return String(s == null ? '' : s).replace(/^\\s*\\[来自\\s*[:：][^\\]]*\\]\\s*/, '').trim();\n}\nfunction _dpStripTags(s) {\n    return String(s == null ? '' : s).replace(/<[^>]*>/g, '').replace(/&nbsp;/g, ' ').trim();\n}\n\n/* ---- ① 起点搜索页解析（复刻原 CSS 规则：.y-list__item / _searchBookName / …） ---- */\nfunction _dpQdSearchItems(h) {\n    var out = [], i, parts = String(h == null ? '' : h).split('<div class=\"y-list__item\"');\n    for (i = 1; i < parts.length; i++) {\n        var seg = parts[i];\n        var mb = seg.match(/data-bid=\"(\\d+)\"/);\n        if (!mb) continue;\n        var mn = seg.match(/<h2[^>]*class=\"[^\"]*_searchBookName[^\"]*\"[^>]*>([\\s\\S]*?)<\\/h2>/i);\n        var name = mn ? _dpStripTags(mn[1]) : '';\n        if (!name) { var mt = seg.match(/\\btitle=\"([^\"]*?)在线阅读\"/); if (mt) name = mt[1]; }\n        if (!name) continue;\n        var ma = seg.match(/<p[^>]*class=\"[^\"]*_searchBookAuthor[^\"]*\"[^>]*>([\\s\\S]*?)<\\/p>/i);\n        var mi = seg.match(/<p[^>]*class=\"[^\"]*_searchBookDesc[^\"]*\"[^>]*>([\\s\\S]*?)<\\/p>/i);\n        var mk = seg.match(/<div[^>]*class=\"[^\"]*_tags[^\"]*\"[^>]*>([\\s\\S]*?)<\\/div>/i);\n        var mc = seg.match(/<img[^>]*class=\"[^\"]*_bookImg[^\"]*\"[^>]*>/i);\n        var cover = '';\n        if (mc) { var md = mc[0].match(/data-src=\"([^\"]+)\"/); if (md) cover = md[1]; }\n        if (cover.indexOf('//') === 0) cover = 'https:' + cover;\n        var kindTxt = mk ? _dpStripTags(mk[1]) : '';\n        var wcTxt = '';\n        // _tags 形如「玄幻 / 完结 / 446.77万字」—— 把字数单独摘出来，\n        // 并从 kind 里剔除，避免 kind 里重复出现「玄幻完结446.77万字」。\n        if (mk) {\n            try {\n                var mws = String(mk[1]).match(/([\\d]+(?:\\.[\\d]+)?)\\s*(万)?字/);\n                if (mws) {\n                    wcTxt = mws[1] + (mws[2] ? '万' : '') + '字';\n                    kindTxt = kindTxt.replace(/[\\d]+(?:\\.[\\d]+)?\\s*万?字/g, '')\n                                     .replace(/\\s{2,}/g, ' ').replace(/^\\s+|\\s+$/g, '');\n                }\n            } catch (eW) { }\n        }\n        out.push({\n            name: name,\n            author: ma ? _dpStripTags(ma[1]) : '',\n            intro: mi ? _dpStripTags(mi[1]) : '',\n            kind: kindTxt,\n            coverUrl: cover,\n            lastChapter: '',\n            wordCount: wcTxt,\n            bookUrl: 'https://m.qidian.com/book/' + mb[1] + '/'\n        });\n    }\n    return out;\n}\n\n/* ---- ② 搜索合并（起点 + 服务器聚合；服务器挂了就只剩起点） ---- */\n/* ★ 2026-09-28：把服务端聚合 JSON 映射成 Legado 搜索结果行。\n   服务端 /api/search 已按「精确书名 → 起点 → 番茄 → 第三方」排好序，\n   这里**只做映射、不再重排**，保证服务端顺序原样下发。\n   起点行 bookUrl = https://m.qidian.com/book/<id>/（服务端原样透传，\n   书页/目录/正文走本源的起点规则）；其余行是 /api/book?i=N&u=... 包装。 */\nfunction _dpAggRows(rows, key) {\n    var agg = [], seen = {}, i;\n    for (i = 0; i < rows.length; i++) {\n        var r = rows[i]; if (!r) continue;\n        var bu = String(r.bookUrl || ''); if (!bu) continue;\n        var isQd = /qidian\\.com\\/book\\//.test(bu);\n        var mi = bu.match(/[?&]i=(\\d+)/);\n        if (!isQd && !mi) continue;\n        var nm = String(r.name || '').replace(/^\\s+|\\s+$/g, ''); if (!nm) continue;\n        /* dpv67（2026-10-03）：用户改主意 —— 由 dpv63c 的「跨子源去重」恢复为\n           **各子源并列**：同一本书在多个子源出现时**每条都列出来**（像魔丸 / 云端\n           聚合那样），每条在 kind 里标注来源 `[第三方·源名]`，用户自己挑最新那本。\n           去重键 = 子源 + 书名 + 作者 —— 只防**同一子源内的重复行**，不跨源合并。 */\n        var _au = String(r.author || '').replace(/^\\s+|\\s+$/g, '');\n        var kk = (isQd ? 'qd' : mi[1]) + '|' + _dp3Norm(nm) + '|' + _dp3Norm(_au);\n        if (seen[kk]) continue;\n        seen[kk] = 1;\n        var kd = String(r.kind || ''), sn = '';\n        if (isQd) {\n            if (kd.indexOf('起点') !== 0) kd = '起点｜' + kd;\n            sn = '起点';\n        } else {\n            try { sn = _dp3SrcName(r); } catch (eS) { }\n            if (!sn) sn = '源' + (mi ? mi[1] : '?');\n            /* ★★ 2026-10-24：服务端已在 kind 最前挂好 `〔源名〕`；同书同作者组\n               的折叠幸存行更是直接带 `〔N源〕,〔源A〕,〔源B〕…`。\n               只在**老服务端**（kind 不带方括号）时补一次，避免双前缀。 */\n            if (kd.indexOf('〔') !== 0) kd = '〔' + sn + '〕' + (kd ? ' ' + kd : '');\n        }\n        /* ★★ 2026-10-24（P0，YG 报「搜一本书只显示 2 个子源」）：\n           **服务端的源名前缀不能剥。**\n           换源列表（`ChangeBookSourceAdapter`）只渲染 originName / author /\n           getDisplayLastChapterTitle() / 字数 / 响应时间 —— 聚合源只有一个\n           bookSourceName，originName 恒为「聚合小说」、**kind 根本不渲染**，\n           `lastChapter` 是唯一能区分子源的字段。\n           换源列表不经过 `SearchModel.mergeItems()`（逐条 searchSuccess），\n           所以 19 个子源会全部列出；剥了前缀就全长一模一样。 */\n        var lc = String(r.lastChapter || '').replace(/^\\s+|\\s+$/g, '');\n        agg.push({\n            name: nm,\n            author: String(r.author || ''),\n            intro: _dpAggStripIntro(r.intro),\n            kind: kd,\n            coverUrl: String(r.coverUrl || ''),\n            lastChapter: lc,\n            wordCount: String(r.wordCount || ''),\n            bookUrl: bu\n        });\n    }\n    return agg.slice(0, 60);\n}\n\n\nfunction _dpSearchRows(raw, key, jav, src) {\n    var out = [], i;\n    var _k0 = '';\n    try { _k0 = (typeof key === 'undefined' || key == null) ? '' : String(key); } catch (eK0) { _k0 = ''; }\n    _k0 = _k0.replace(/^\\s+|\\s+$/g, '');\n    /* ★ 2026-09-28：本源 searchUrl 已直连服务端 /api/search（不再走起点官网）。\n       起点官网对手机侧有风控（页面挂 yw_risk_verify.js），一旦那步失败，\n       Legado 会**中止整次搜索** —— ruleSearch 里的聚合 JS 根本不执行，\n       番茄/第三方结果也一起没了（用户报「搜番茄书没结果」时，服务端日志里\n       连一条 /api/search 都没有，而 book/toc/chapter 全部 200）。\n       现在 raw 就是服务端聚合 JSON（起点+番茄+第三方，已排序），直接映射。 */\n    try {\n        var _j0 = JSON.parse(String(raw == null ? '' : raw));\n        var _a0 = null;\n        if (Object.prototype.toString.call(_j0) === '[object Array]') _a0 = _j0;\n        else if (_j0 && Object.prototype.toString.call(_j0.list) === '[object Array]') _a0 = _j0.list;\n        else if (_j0 && Object.prototype.toString.call(_j0.data) === '[object Array]') _a0 = _j0.data;\n        if (_a0 && _a0.length) return _dpAggRows(_a0, _k0);\n    } catch (eJ0) { }\n    /* 兼容旧路径：raw 是起点官网 HTML → 解析起点 + 再向服务器要一次聚合。 */\n    try { out = _dpQdSearchItems(raw); } catch (eQ) { out = []; }\n    try {\n        if (!_k0) return out;\n        var rows = _dp3Try(jav, '/api/search?key=' + encodeURIComponent(_k0) + '&type=novel', src, _DP3_TO_SEARCH);\n        if (!rows || !rows.length) return out;\n        var agg = _dpAggRows(rows, _k0);\n        for (i = 0; i < agg.length; i++) out.push(agg[i]);\n    } catch (e1) { }\n    return out;\n}\n\n\n/* ---- ③ 详情：起点走 og:* 正则（原 CSS 规则的等价实现），第三方走 /api/book ---- */\n/* 字段为空时的兜底：回落到 Legado 传进来的 book 对象（值来自搜索结果）。\n   为什么需要：/api/book 对某些子源（实测 2K 小说）会**偶发**只回部分字段 ——\n   同一次请求里 author 有值、name 却是空串。name 空 = 书架/阅读页书名变空，\n   所以这里宁可退回搜索时的书名，也绝不放空串出去。 */\nfunction _dpInfoFallback(book, field) {\n    try {\n        if (!book) return '';\n        if (field === 'name') return String(book.name || '');\n        if (field === 'author') return String(book.author || '');\n        if (field === 'coverUrl') return String(book.coverUrl || '');\n        if (field === 'kind') return String(book.kind || '');\n    } catch (e) { }\n    return '';\n}\n/* ★ v53（2026-09-28）EPUB 双保险（照含遇見书源做法）：\n   聚合子源里混进 EPUB 电子书（详情字段带 epub 标记 / 章节直链 .epub 文件）时，\n   正文根本读不出来。两层检测，命中即 throw 拒绝打开（Legado 显示解析失败）：\n     ① 详情层：_dpInfoField 的聚合分支里查 kind/format/intro 等字段；\n     ② 目录层：_dpTocRows 的聚合分支里查章节 URL。\n   返回命中片段（真值）或 ''。 */\nfunction _dpEpubHit() {\n    for (var i = 0; i < arguments.length; i++) {\n        var s = String(arguments[i] == null ? '' : arguments[i]);\n        if (!s) continue;\n        if (/\\.epub([?#]|$)/i.test(s)) return s.slice(0, 60);\n        if (/(^|[\\s,，;；|/])epub([\\s,，;；|/]|$)/i.test(s)) return s.slice(0, 60);\n    }\n    return '';\n}\n/* 起点书页真实「总字数」。\n   页面结构（2026-09 实测 m.qidian.com/book/<bid>/）：\n     <div class=\"item\"><div class=\"rank\">\n       <span class=\"value\">446.77</span><span class=\"unit\">万字</span>\n     </div><div class=\"label\">总字数</div></div>\n   旧实现从 meta[name=description] 抓 `已更新 N 章` —— 那是**章节数**不是字数，\n   且新页 meta 已改版，正则常空。这里直接定位「总字数」标签往回取 value/unit。 */\nfunction _dpQdWordCount(h) {\n    var s = String(h == null ? '' : h);\n    if (!s) return '';\n    try {\n        // ① 就近匹配：`总字数` 前 400 字符内取最后一组 value+unit。\n        //    真实结构（属性顺序不定，中间隔着 </span></div><div class=\"label\">）：\n        //      <span class=\"value\" data-v-xxx>446.77</span>\n        //      <span class=\"unit\"  data-v-xxx>万字</span>\n        //      </div><div class=\"label\" data-v-xxx>总字数</div>\n        var i = s.indexOf('总字数');\n        if (i > 0) {\n            var seg = s.slice(Math.max(0, i - 400), i);\n            var mv = seg.match(/class=\"[^\"]*value[^\"]*\"[^>]*>\\s*([\\d.]+)\\s*</g);\n            if (mv && mv.length) {\n                var lastHtml = mv[mv.length - 1];\n                var mv2 = lastHtml.match(/>\\s*([\\d.]+)\\s*<$/);\n                var val = mv2 ? mv2[1] : '';\n                // unit 取「value 之后」的第一个 unit span\n                var after = seg.slice(seg.lastIndexOf(lastHtml) + lastHtml.length);\n                var mu = after.match(/class=\"[^\"]*unit[^\"]*\"[^>]*>\\s*([^<]*?)\\s*</);\n                var u = mu ? mu[1].replace(/\\s/g, '') : '字';\n                if (val) return val + u;\n            }\n        }\n        // ② 兜底：页面任意处 `\\d+(\\.\\d+)?万?字`\n        var m2 = s.match(/([\\d]+(?:\\.[\\d]+)?)\\s*(万)?字/);\n        if (m2) return m2[1] + (m2[2] ? '万' : '') + '字';\n    } catch (e) { }\n    return '';\n}\n\nfunction _dpInfoField(baseUrl, result, jav, book, field) {\n    var u = String(baseUrl == null ? '' : baseUrl);\n    var s = String(result == null ? '' : result);\n    if (_dpIsAgg(u)) {\n        var j = null;\n        try { j = JSON.parse(s); } catch (e0) { j = null; }\n        if (!j || typeof j !== 'object') { try { j = _dp3TryUrl(jav, u, _DP3_TO_BOOK); } catch (e1) { j = null; } }\n        if (!j) return _dpInfoFallback(book, field);\n        // ★ v53 EPUB 保险①：详情字段带 epub 标记 → 拒绝打开（防不可读书进书架）\n        var ep = '';\n        try {\n            ep = _dpEpubHit(j.kind, j.format, j.intro, j.downloadUrl, j.lastChapter, j.url);\n        } catch (eE) { ep = ''; }\n        if (ep) { throw new Error('该源返回的是 EPUB 电子书（' + ep + '），不支持在线阅读，请换源'); }\n        /* dpv67：详情页简介开头标注来源子源（用户要求「详情页面显示来自哪个子源」）。\n           服务端 /api/book 的 intro 已带 `[来自:源名]`，这里取出源名格式化成\n           「📖 来源：XX」放在简介最前；取不到就不加（不改变原有简介内容）。 */\n        if (field === 'intro') {\n            var _bd = _dpAggStripIntro(j.intro) || _dpInfoFallback(book, field);\n            var _sn = '';\n            try { _sn = _dp3SrcName(j); } catch (eS3) { _sn = ''; }\n            return _sn ? ('📖 来源：' + _sn + '\\n\\n' + _bd) : _bd;\n        }\n        var v0 = (j[field] == null ? '' : String(j[field]));\n        return v0 || _dpInfoFallback(book, field);\n    }\n    try {\n        if (field === 'name') {\n            return _dpMeta(s, 'og:title')\n                || _dpStripTags((s.match(/<h1[^>]*>([\\s\\S]*?)<\\/h1>/i) || [, ''])[1])\n                || _dpInfoFallback(book, 'name');\n        }\n        if (field === 'author') {\n            var a = _dpMeta(s, 'og:novel:author');\n            if (!a) { var m1 = s.match(/<a[^>]*class=\"[^\"]*author-link[^\"]*\"[^>]*>([\\s\\S]*?)<\\/a>/i); a = m1 ? _dpStripTags(m1[1]) : ''; }\n            return a || _dpInfoFallback(book, 'author');\n        }\n        if (field === 'kind') return _dpMeta(s, 'og:novel:category') || _dpInfoFallback(book, 'kind');\n        if (field === 'coverUrl') return _dpMeta(s, 'og:image') || _dpInfoFallback(book, 'coverUrl');\n        if (field === 'lastChapter') return _dpMeta(s, 'og:novel:latest_chapter_name');\n        if (field === 'wordCount') return _dpQdWordCount(s);\n        if (field === 'intro') return _dpBookIntro(s, u, jav, book) || _dpInfoFallback(book, 'intro');\n    } catch (e2) {}\n    return '';\n}\n\n/* ---- ④ 目录 URL + 目录列表（第三方走 /api/toc，起点走逐 <a> 解析） ---- */\nfunction _dpTocUrl(baseUrl, result) {\n    var u = String(baseUrl == null ? '' : baseUrl);\n    if (_dpIsAgg(u)) {\n        /* ★ 2026-09-28：聚合源的书本 URL 底层不一定是目录页 ——\n           番茄是 /fq/detail（详情）与 /fq/catalog（目录）两个接口，\n           从 bookUrl 推导会拿到 /fq/detail，里面没有章节列表\n           → 客户端报「此源目录解析失败」。\n           /api/book 的响应里已带正确的 tocUrl，优先用它。 */\n        try {\n            var j = JSON.parse(String(result == null ? '' : result));\n            var t = (j && j.tocUrl) ? String(j.tocUrl) : '';\n            if (t && /\\/api\\/toc\\?/.test(t)) return t;\n        } catch (eT) { }\n        return _dpAggApi('toc', _dpAggI(u), _dpAggU(u));\n    }\n    try { return u.split('?')[0].split('#')[0].replace(/\\/+$/, '') + '/catalog/'; } catch (e) { return u; }\n}\n// 起点目录页 → [{name,url}]。\n//   ★ 与 _dpCatPairs 的区别：**保留原始章名**（只剥标签）。\n//   _dpCatPairs 会把章名过一遍 _dpNormChapter（「第一章 陨落的天才」→\n//   「第00000001章陨落的天才」），那是内部比对用的，直接拿去当目录显示\n//   用户会看到一坨被洗过的章名 —— 目录必须用原文（＝原 CSS `h2@text` 口径）。\n//   过滤照旧（v46 定论）：置顶「最新章节」快捷条不算章节，否则第 1 章会串到最后一章。\nfunction _dpQdTocItems(html) {\n    var out = [], re = /<a\\b([^>]*)>([\\s\\S]*?)<\\/a>/gi, m, onlyChapter = true, pass;\n    for (pass = 0; pass < 2; pass++) {\n        onlyChapter = (pass === 0);\n        re.lastIndex = 0;\n        out = [];\n        while ((m = re.exec(String(html))) !== null) {\n            var attrs = String(m[1] || ''), inner = String(m[2] || '');\n            var mc = attrs.match(/data-cid=\"(\\d+)\"/);\n            if (!mc) continue;\n            if (/_secondHeader|_lastChapterCN|_lastChapterUT/.test(attrs)) continue;\n            if (/_lastChapterCN/.test(inner)) continue;\n            var cm = attrs.match(/class=\"([^\"]*)\"/);\n            var cls = cm ? cm[1] : '';\n            if (onlyChapter && cls.indexOf('_chapterItem') < 0) continue;\n            var mn = inner.match(/<h([23])[^>]*>([\\s\\S]*?)<\\/h\\1>/i);\n            if (!mn) continue;\n            var n = _dpStripTags(mn[2]);\n            if (!n) continue;\n            out.push({ name: n, cid: mc[1], cls: cls });\n        }\n        if (out.length) break;      // 站点改 class 名时退回不筛 class 的一遍\n    }\n    return out;\n}\nfunction _dpTocRows(baseUrl, raw, jav) {\n    var u = String(baseUrl == null ? '' : baseUrl);\n    var s = String(raw == null ? '' : raw);\n    var out = [], i;\n    if (_dpIsAgg(u)) {\n        var arr = null;\n        try { arr = JSON.parse(s); } catch (e0) { arr = null; }\n        if ((!arr || !arr.length) && jav) { try { arr = _dp3TryUrl(jav, u, _DP3_TO_TOC); } catch (e1) { arr = null; } }\n        if (!arr || !arr.length) return out;\n        // ★ v53 EPUB 保险②：章节直链是 .epub 文件 → 这书读不了，拒绝打开\n        var _epCnt = 0, _epSmp = '';\n        for (var _ei = 0; _ei < arr.length; _ei++) {\n            var _eu = String((arr[_ei] && arr[_ei].url) || '');\n            if (/\\.epub([?#]|$)/i.test(_eu)) { _epCnt++; if (!_epSmp) _epSmp = _eu.slice(0, 60); }\n        }\n        if (_epCnt > 0) { throw new Error('目录含 ' + _epCnt + ' 个 EPUB 文件直链（' + _epSmp + '），不支持在线阅读，请换源'); }\n        for (i = 0; i < arr.length; i++) {\n            if (arr[i] && arr[i].name) out.push({ name: String(arr[i].name), url: String(arr[i].url || '') });\n        }\n        // 有的源目录是**倒序**（最新章节在最前）→ 照读就成了从尾往头读，必须翻正\n        try {\n            var q1 = _dp3Seq(out[0].name), q2 = _dp3Seq(out[out.length - 1].name);\n            if (!isNaN(q1) && !isNaN(q2) && q1 > q2) out.reverse();\n        } catch (e2) {}\n        return out;\n    }\n    var bid = (_dpBid(u) || '');\n    var items = [];\n    try { items = _dpQdTocItems(s); } catch (e3) { items = []; }\n    for (i = 0; i < items.length; i++) {\n        out.push({ name: items[i].name, url: '/chapter/' + bid + '/' + items[i].cid + '/' });\n    }\n    /* ---- v59（2026-10-01）：起点 APP 目录的「彩蛋章」标记 ----\n       起点APP目录里红色小图/小电视标记来自 APP 专有 chapterlist 的\n       BlockChapters（全书带插图/视频块的 chapterId 清单）；m 站目录页\n       完全不带该标记，所以 Legado 目录里看不出哪些章有彩蛋。\n       服务器有纯算签名 → /qqdp/blocks 缓存一份，这里给章名补 📺。\n       失败静默跳过（目录照常，绝不因标记挂掉影响阅读）。 */\n    if (bid && jav && out.length) {\n        try {\n            var _bhost = _dpAggHost();\n            var _burl = _bhost + '/qqdp/blocks?bid=' + encodeURIComponent(bid);\n            var _bb = '';\n            try { _bb = String(jav.get(_burl, null, 8000).body() || ''); }\n            catch (eB1) { try { _bb = String(jav.get(_burl, null, 8000).body() || ''); } catch (eB2) { _bb = ''; } }\n            if (!_bb) { try { _bb = String(jav.ajax(_burl) || ''); } catch (eB3) { _bb = ''; } }\n            var _bj = null;\n            if (_bb && _bb.charAt(0) === '{') { try { _bj = JSON.parse(_bb); } catch (eB4) { _bj = null; } }\n            if (_bj && _bj.blocks && _bj.blocks.length) {\n                var _bs = {}, _bi;\n                for (_bi = 0; _bi < _bj.blocks.length; _bi++) _bs[String(_bj.blocks[_bi])] = 1;\n                for (_bi = 0; _bi < out.length; _bi++) {\n                    var _bm = String(out[_bi].url || '').match(/\\/chapter\\/\\d+\\/(\\d+)\\//);\n                    if (_bm && _bs[_bm[1]] && String(out[_bi].name).indexOf('📺') < 0) {\n                        /* dpv61：📺 放章名**开头**——目录行标题长了会被截断，后缀看不见 */\n                        out[_bi].name = '📺 ' + out[_bi].name;\n                    }\n                }\n            }\n        } catch (eB0) {}\n    }\n    return out;\n}\n\n/* ---- ⑤ 正文（第三方：解析 /api/chapter 的 JSON） ---- */\n\n\nfunction _dpAggBody(raw, chapter, baseUrl, jav) {\n    var url = _dpAggCur(chapter, baseUrl);\n    var s = String(raw == null ? '' : raw);\n    var j = null;\n    try { j = JSON.parse(s); } catch (e0) { j = null; }\n    // ★★ 2026-10-23（YG 报「开关只能开关起点，番茄/别的段评通道关不掉」）：\n    //   旧实现只在 `_dpAggIsFq(url)`（番茄）时才带开关参数重拉。但服务端\n    //   /api/chapter 的段评注入有**两条**：番茄在 /fq/content 里注入，第三方源在\n    //   `_dp_inject_chapter` 里注入（以前它压根没接开关 → 第三方源永远是全开）。\n    //   现在两条都认请求上的 bubble/segcard/endcard/theme，所以判据从\n    //   「是不是番茄」改成「是不是聚合章节 + 有没有开关被关/切深色」。\n    var _isAgg = _dpIsAgg(url);\n    var _swAllOn = (_dpSwAllOn(jav) && _dpTheme(jav) === 'light');\n    if (!j || typeof j !== 'object') {\n        // result 非 JSON（引擎没拿到正文）→ 补拉；聚合源顺带带上开关参数\n        var _u = (_isAgg && !_swAllOn) ? _dpAggSwUrl(url, jav) : url;\n        try { j = _dp3TryUrl(jav, _u, _DP3_TO_CHAPTER); } catch (e1) { j = null; }\n    } else if (_isAgg && !_swAllOn) {\n        // 服务端默认回的是「全开 + 浅色」注入版；只要有关掉的开关或切了深色，\n        // 就带参数重拉一次，取裁剪后的正文（服务端缓存键已剥掉这四个参数，\n        // 所以重拉是命中缓存，不会重复扣额度、也不会重复抓上游）。\n        var _j2 = null;\n        try { _j2 = _dp3TryUrl(jav, _dpAggSwUrl(url, jav), _DP3_TO_CHAPTER); } catch (eSw) { _j2 = null; }\n        if (_j2 && typeof _j2 === 'object' && _j2.content) { j = _j2; }\n    }\n    // ★★ v66（2026-10-03）：服务端 /api/chapter 现在会回带 qd_bid/qd_cid（起点书/章 id）。\n    //   存进 __dpIllu 的聚合缓存，供 __dpIllu 抠不出起点 id 时回退使用 —— 这是\n    //   「换源到第三方源之后也能看到插图」的关键一环。\n    try {\n        if (j && j.qd_bid && j.qd_cid) {\n            if (!__dpIllu._aggQd) __dpIllu._aggQd = {};\n            __dpIllu._aggQd[String(url)] = { bid: String(j.qd_bid), cid: String(j.qd_cid) };\n        }\n    } catch (eQd) {}\n    // ★ 2026-10-15：已删除「抓不到正文就把一句提示文案当正文返回」这个兜底\n    //   （原实现：content 净化后文本长度小于 30 就 return 一句\n    //    『这个第三方源…稍后再翻一次本章』的提示，注释里写的是\n    //    『取不到给可读提示，不白屏』）。\n    //   现在改为如实返回空串，交回 Legado 自己的正文失败提示 / 重试 UI，\n    //   不再把提示文案伪装成正文塞进正文区。\n    //   本函数其余逻辑（原始 result 非 JSON 时的补拉、番茄源按开关重拉、\n    //   qd_bid/qd_cid 写入 __dpIllu._aggQd）一字未动。\n    var ct = (j && j.content) ? String(j.content) : '';\n    return ct;\n}\n/* ==================================================================\n * v50（2026-09-23）发现页 —— 照抄魔丸小说的版式\n *\n * 用户看到的问题：发现页「原样子」—— 198 条全部一行一条平铺，看不出结构。\n * 根因：原 exploreUrl 的静态数组里，**只有分组标题有 style，榜单/分类按钮\n * 一个 style 都没有**，Legado 就按普通列表渲染。\n *\n * 魔丸的做法（其 jsLib 里 create/show 两个函数 + 探索项 type:\"select\"）：\n *   · 顶部一个「平台下拉」：Legado 把选择结果按 infoMap_<标题> 存进 cache，\n *     action 字符串里用 infoMap['请选择平台'] 取回，再 java.refreshExplore()\n *     重刷本页 —— 于是切换平台不用改书源、不用重进发现页。\n *   · 下面「分组标题（整行 flexBasisPercent=1）+ 三列标签（flexBasisPercent\n *     =0.25，行尾用 '--' 补满）」。\n *\n * 我们的加值：平台列表 = 「📖 综合」（跨源合并分类 /api/discover/cats）+ 服务器上\n * **真正有分类数据的**子源（/api/discover/tabs 现算，服务端加分类就自动出现，\n * 不用重导书源）；选到第三方源时，标签按钮指向 /api/discover/list（JSON 书单），\n * 点进去就是那个源那一类的书，可读（v49i 已接好 /api/book、/api/toc、/api/chapter）。\n *\n * ★ dpv67：**不再有「起点中文网」平台** —— 起点网页通道全线封禁（202/403），\n *   发现页整页改走第三方聚合；起点只保留在段评/插图/彩蛋（服务端 APP 纯算通道）。\n * ★ 失败回退：_dpExplorePage 拿不到 /api/discover/tabs 时**返回 null**，\n *   exploreUrl 那段 JS 会原样吐回静态的**第三方分类快照** FALLBACK（不含起点）。\n * ================================================================== */\n\nvar _DP_EX_TTL = 10 * 60 * 1000;      // /api/discover/tabs 客户端缓存\n\nfunction _dpExIn(arr, v) {\n    for (var i = 0; i < (arr ? arr.length : 0); i++) { if (arr[i] === v) return true; }\n    return false;\n}\n\n/* Legado 探索项 type:\"select\" 的 action 回调。\n * ★ 必须优先用 this 取 java/cache —— Legado 是以脚本上下文为 this 调进来的\n *   （魔丸原版就是 `const {java,cache}=this;`）。裸引用在这条调用链上不可靠，\n *   一旦取不到 java，refreshExplore() 不执行，用户就是「选了平台没反应」。*/\nfunction show(k, v) {\n    var jv = null, ck = null;\n    try { if (this && this.java) jv = this.java; } catch (e0) {}\n    try { if (this && this.cache) ck = this.cache; } catch (e1) {}\n    if (!jv) { try { if (typeof java !== 'undefined' && java) jv = java; } catch (e2) {} }\n    if (!ck) { try { if (typeof cache !== 'undefined' && cache) ck = cache; } catch (e3) {} }\n    try { if (ck) ck.put(String(v), String(k)); } catch (e4) {}\n    try { if (jv) jv.refreshExplore(); } catch (e5) {}\n}\n\n/* 探索项：下拉选择器。字段与魔丸的 create() 完全同构：\n * type:\"select\" + chars(选项) + default(当前值) + action(选中后执行的 JS)。*/\nfunction create(k, chars, defaultV, v, size) {\n    return {\n        title: k,\n        type: 'select',\n        chars: chars,\n        default: defaultV,\n        action: \"show(infoMap['\" + k + \"'],'\" + v + \"')\",\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: size }\n    };\n}\n\n/* 平台 / 各平台分类目录（/api/discover/tabs），10 分钟客户端缓存。\n * 拿不到就返回 null（上层据此走纯起点回退），绝不让发现页开天窗。*/\nfunction _dpExTab(jav) {\n    var ck = _DP3_CACHE['dpex'], now = 0;\n    try { now = new Date().getTime(); } catch (eN) { now = 0; }\n    if (ck && ck.v && ck.v.length && (now - ck.t) < _DP_EX_TTL) return ck.v;\n    var j = null;\n    try { j = _dp3Try(jav, '/api/discover/tabs', null, 15000); } catch (e0) { j = null; }\n    var v = (j && j.sources && j.sources.length) ? j.sources : null;\n    if (v) { try { _DP3_CACHE['dpex'] = { t: now, v: v }; } catch (e1) {} return v; }\n    return (ck && ck.v && ck.v.length) ? ck.v : null;\n}\n\n/* 「综合」跨源合并分类目录（/api/discover/cats），10 分钟客户端缓存。\n * ★ 2026-10-12 成人隔离 + 频道下拉：\n *   服务端 /api/discover/cats 现在分四段 —— novel(正常小说统一分类) /\n *   adult(成人小说源自有分类) / comic / video。这里按「分级 + 频道」取其中一段，\n *   不再把 novel+comic+video 平铺成一坨（那正是「综合里混着漫画/视频/成人」的原因）。\n *   原始响应整份缓存（10 分钟），切档位不再重复打网络。拿不到返回 null。\n * ================================================================== */\nfunction _dpExCatsRaw(jav) {\n    var ck = _DP3_CACHE['dpexc_raw'], now = 0;\n    try { now = new Date().getTime(); } catch (eN) { now = 0; }\n    if (ck && ck.v && (now - ck.t) < _DP_EX_TTL) return ck.v;\n    var j = null;\n    try { j = _dp3Try(jav, '/api/discover/cats', null, 15000); } catch (e0) { j = null; }\n    if (j) { try { _DP3_CACHE['dpexc_raw'] = { t: now, v: j }; } catch (e1) {} return j; }\n    return (ck && ck.v) ? ck.v : null;\n}\n\nfunction _dpExCats(jav, adult, chan) {\n    var j = _dpExCatsRaw(jav);\n    if (!j) return null;\n    if (!adult) return (j.novel && j.novel.length) ? j.novel : null;\n    if (chan === '漫画') return (j.comic && j.comic.length) ? j.comic : null;\n    if (chan === '视频') return (j.video && j.video.length) ? j.video : null;\n    return (j.adult && j.adult.length) ? j.adult : null;\n}\n\n/* 生成整个发现页。返回 JSON 字符串；**拿不到服务器目录则返回 null**，\n * 由 exploreUrl 里的 try/catch 退回静态第三方快照。\n *\n * ★ 下拉（2026-10-22 起无成人档）：\n *     行1  内容分级：📖 正常（成人档已迁出）      行1  频道：📖 小说 / 📚 漫画 / 🎬 视频\n *     行2  请选择平台\n *   分级=正常（默认）⇒ 平台列表只列正常源、分类只出正常小说统一分类；\n *   分级=成人       ⇒ 平台列表只列成人源，分类按频道出 成人小说/漫画/视频。\n *   漫画/视频子源目前**全是**成人向，所以正常档下频道锁定小说。*/\n// ★ 2026-10-12 频道切换：平台列表随频道整体换一批，所以必须把「平台」清空，\n// 让它回落到当前档位的「综合」。否则平台仍停在旧频道的一个源上，\n// 下面渲染的还是那个源的自有分类 —— 用户看到的就是\"切了频道没刷新\"。\nfunction _dpChanPick(v) {\n    var jv = null, ck = null;\n    try { if (this && this.java) jv = this.java; } catch (e0) {}\n    try { if (this && this.cache) ck = this.cache; } catch (e1) {}\n    if (!jv) { try { if (typeof java !== 'undefined' && java) jv = java; } catch (e2) {} }\n    if (!ck) { try { if (typeof cache !== 'undefined' && cache) ck = cache; } catch (e3) {} }\n    /* ★ 2026-10-17：选 漫画/视频 但当前是「正常」档 —— 直接说明怎么开，\n       而不是让 _dpExplorePage 里 `if (!ADULT) chan='小说'` 默默弹回。\n       那种静默回退下，用户只会看到列表没变、不知道为什么。 */\n    try {\n        var _wv = String(v == null ? '' : v);\n        if (_wv.indexOf('漫画') >= 0 || _wv.indexOf('视频') >= 0) {\n            var _ad = false;\n            try { _ad = _dpGradeIsAdult(_dpSrcOf(jv)); } catch (eA) { _ad = false; }\n            if (!_ad) {\n                var _mh = (_wv.indexOf('漫画') >= 0);\n                // ★ 2026-10-17：按用户指定措辞 —— 直接告诉用户去编辑页改类型。\n                //   一个书源只能一种 bookSourceType，本聚合源是 0（文本）。\n                try { if (jv) jv.toast(_mh\n                    ? '📚 浏览漫画时请在编辑页切换类型到图片'\n                    : '🎬 浏览视频时请在编辑页切换类型到视频'); } catch (eT) {}\n                try { if (jv) jv.refreshExplore(); } catch (eR) {}\n                return '';   // 不写 dpchan：避免下拉显示漫画而列表仍是小说\n            }\n        }\n    } catch (eG) {}\n    try { if (ck) ck.put('dpchan', String(v)); } catch (e4) {}\n    try { if (ck) ck.put('dpsrc', ''); } catch (e5) {}\n    try { if (jv) jv.refreshExplore(); } catch (e6) {}\n    return '';\n}\n\n/* ==================================================================\n * ★ 2026-10-15：发现页「单源搜索」行 —— 编辑框 + 按钮\n *   需求：最后一个下拉框下面放一个编辑框和一个按钮，对**当前选中的书源**做单源搜索。\n *   机制（已逐行对照 Legado 源码验证，不是猜的）：\n *     · ExploreKind.Type.text —— 元素的 title 就是 Legado InfoMap 的键，\n *       输入框 onChange 即 infoMap[title] = 内容（ExploreAdapter.kt Type.text）。\n *     · ExploreKind.Type.url  —— url 支持 <js>…</js>；AnalyzeUrl.evalJS 里\n *       bindings[\"infoMap\"] 绑的就是同一张 InfoMap（AnalyzeUrl.kt L411），\n *       所以**点击时**能读到刚刚输入的关键词。整串是 <js> 时，analyzeJs() 会把\n *       ruleUrl 直接替换成脚本返回值，随后 replaceKeyPageJs() 再替换 {{page}}。\n *     · 服务端 /api/discover/srcsearch 返回与 /api/discover/list 同形的 records，\n *       于是 ruleExplore 的 $.bName 等规则一个字都不用改。\n *   ⚠ <js> 体里**不要出现 '<' 或 '>'**：AppPattern.JS_PATTERN 会把内嵌规则切错。\n *     需要比较时用 ===/!== 或 Math 函数，别用小于号。\n *   ⚠ 不要用 infoMap['请选择平台'] 去猜下标：Client 侧 map 里就有精确的 s.i。\n * ================================================================== */\nfunction _dpAppendSearchBar(out, cur, map, wantType, ADULT) {\n    var host = '';\n    try { host = _dpAggHost(); } catch (e0) { host = ''; }\n    if (!host) return;\n    var KWKEY = '单源搜索';\n    var idx = -1, nm = cur;\n    try {\n        if (map && map[cur] && typeof map[cur].i === 'number') idx = map[cur].i;\n    } catch (e1) { idx = -1; }\n    /* ★ 2026-10-15 位置修正：单源搜索栏此前 push 到数组末尾（跑到所有分类下面），\n     *   现改为 splice 到「平台下拉」之后、「≡ … 分类 ≡」标题之前（用户指定的版式）。*/\n    var _pos = 0;\n    try {\n        for (var _i = 0; _i < out.length; _i++) {\n            var _it = out[_i] || {};\n            if (String(_it.title || '').indexOf('≡') >= 0 && String(_it.url || '') === '') { _pos = _i; break; }\n        }\n    } catch (eP) { _pos = 0; }\n    var _textItem = {\n        title: KWKEY, type: 'text',\n        viewName: \"'输入关键词'\",\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.62 }\n    };\n    var js = \"(function(){\"\n           + \"var _kw='';try{_kw=String((infoMap&&infoMap['\" + KWKEY + \"'])||'');}catch(eK){}\"\n           + \"var _nm='';try{_nm=String((infoMap&&infoMap['请选择平台'])||'');}catch(eN){}\"\n           + \"return '\" + host + \"/api/discover/srcsearch?src=\" + idx + \"&type=\" + wantType + \"&adult=\" + (ADULT ? 1 : 0) + \"&key='\"\n           + \"+encodeURIComponent(_kw)+'&page={{page}}&name='+encodeURIComponent(_nm);\"\n           + \"})()\";\n    var _urlItem = {\n        title: '🔍 单源搜索', type: 'url',\n        url: '<js>' + js + '</js>',\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.38 }\n    };\n    out.splice(_pos, 0, _textItem, _urlItem);\n}\n\n\nfunction _dpStripCh(t) {\n    // 剥掉开头的频道 emoji（\\uD83D\\uDCD6 / \\uD83D\\uDCDA / \\uD83C\\uDFAC / \\uD83D\\uDD1E）+ 空格，让窄格子显示完整分类名。\n    var s = String(t == null ? '' : t);\n    var pf = ['\\uD83D\\uDCD6 ', '\\uD83D\\uDCDA ', '\\uD83C\\uDFAC ', '\\uD83D\\uDD1E '];\n    for (var i = 0; i < pf.length; i++) {\n        if (s.indexOf(pf[i]) === 0) return s.slice(pf[i].length);\n    }\n    return s;\n}\nfunction _dpExplorePage(jav, cacheObj, fallback) {\n    var srcs = null;\n    try { srcs = _dpExTab(jav); } catch (e0) { srcs = null; }\n    if (!srcs || !srcs.length) return null;\n\n    function _g(k, d) {\n        var v = '';\n        try {\n            v = String(cacheObj && cacheObj.get ? (cacheObj.get(k) || '') : '');\n        } catch (e) { v = ''; }\n        return v || d;\n    }\n    var ADULT = false;\n    try { ADULT = _dpGradeIsAdult(_dpSrcOf(jav)); } catch (eGA) { ADULT = false; }\n    var chanRaw = _g('dpchan', '📖 小说');\n    var chan = (chanRaw.indexOf('漫画') >= 0) ? '漫画'\n             : (chanRaw.indexOf('视频') >= 0) ? '视频' : '小说';\n    if (!ADULT) chan = '小说';        // 漫画/视频源全是成人向 ⇒ 正常档只留小说\n    /* ★ 频道 → 子源类型：小说 0 / 漫画 2 / 视频 4（与 bookSourceType 一致）。\n       平台列表必须按频道过滤，否则选了漫画还会列出小说源。\n       ⚠ 必须写在 chan 算完之后 —— 写在前面 chan 还是 undefined，wantType 恒为 0。*/\n    var wantType = (chan === '漫画') ? 2 : (chan === '视频') ? 4 : 0;\n\n    /* 平台列表按分级过滤（/api/discover/tabs 每个源带 adult 标记）。*/\n    var i, nm, names = [], map = {};\n    for (i = 0; i < srcs.length; i++) {\n        if (!srcs[i]) continue;\n        if (!!srcs[i].adult !== ADULT) continue;\n        if (srcs[i].type !== wantType) continue;   // ★ 按频道过滤\n        nm = String((srcs[i].em || '') + (srcs[i].name || ('源' + srcs[i].i)));\n        if (_dpExIn(names, nm)) nm = nm + '·' + srcs[i].i;   // 同名源消歧\n        names.push(nm);\n        map[nm] = srcs[i];\n    }\n    var AGG = '📖 综合';\n    names.unshift(AGG);\n\n    var cur = '';\n    try { cur = String(cacheObj && cacheObj.get ? (cacheObj.get('dpsrc') || '') : ''); } catch (e1) { cur = ''; }\n    if (!cur || !_dpExIn(names, cur)) cur = AGG;        // 换档/源下线 → 回「综合」\n\n    var out = [];\n    /* ★ 2026-10-15：统一出口 —— 返回前把「单源搜索」行追加到最底下\n     *   （所有分支都走这里，保证它在**最后一个下拉框/最后一个标签下面**）。*/\n    function _fin(o) {\n        try { _dpAppendSearchBar(o, cur, map, wantType, ADULT); } catch (eSB) {}\n        return JSON.stringify(o);\n    }\n    out.push({\n        title: '内容分级', type: 'select',\n        chars: ['📖 正常'],\n        default: '📖 正常',\n        action: \"_dpGradePick(infoMap['内容分级'])\",\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.5 }\n    });\n    out.push({\n        title: '频道', type: 'select',\n        chars: (ADULT ? ['📖 小说', '📚 漫画', '🎬 视频'] : ['📖 小说']),   // ★ 正常档不提供漫画/视频（无对应子源）,\n        default: '📖 ' + chan,\n        action: \"_dpChanPick(infoMap['频道'])\",\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.5 }\n    });\n    out.push(create('请选择平台', names, cur, 'dpsrc', 1));\n\n    if (cur === AGG) {\n        var _cats = null;\n        try { _cats = _dpExCats(jav, ADULT, chan); } catch (eC0) { _cats = null; }\n        if (_cats && _cats.length) {\n            out.push({\n                title: '≡ ' + cur + ' 分类（多源合并）≡', url: '',\n                style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n            });\n            for (var _c2 = 0; _c2 < _cats.length; _c2++) {\n                out.push({\n                    title: _dpStripCh(String(_cats[_c2].title || '')),\n                    url: String(_cats[_c2].url || ''),\n                    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.25 }\n                });\n            }\n            return _fin(out);\n        }\n        /* 服务端目录拿不到 → 静态快照兜底（只有正常档有快照，快照本身不含成人）。*/\n        var fb = [];\n        if (!ADULT && fallback && fallback.length) {\n            for (var fi = 0; fi < fallback.length; fi++) {\n                if (fallback[fi] && fallback[fi].url) fb.push(fallback[fi]);\n            }\n        }\n        return _fin(out.concat(fb));\n    }\n\n    var s = map[cur];\n    if (!s || !s.cats || !s.cats.length) {\n        out.push({\n            title: '「' + cur + '」暂无分类数据', url: '',\n            style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n        });\n        return _fin(out);\n    }\n\n    out.push({\n        title: '≡ ' + cur + ' ≡', url: '',\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n    });\n\n    var base = _dpAggHost(), cnt = 0, one;\n    for (i = 0; i < s.cats.length; i++) {\n        one = String(s.cats[i]);\n        out.push({\n            title: _dpStripCh(one),\n            url: base + '/api/discover/list?i=' + s.i + '&cat='\n                 + encodeURIComponent(one) + '&page={{page}}',\n            style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.25 }\n        });\n        cnt++;\n        if (cnt >= 2) cnt = 0;\n    }\n    while (cnt > 0 && cnt < 2) {                              // 行尾补 '--'（照魔丸）\n        out.push({\n            title: '--', url: '',\n            style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.25 }\n        });\n        cnt++;\n    }\n    return _fin(out);\n}\n\n/* ==================================================================\n * ★ v53a 番茄章末评论弹窗（2026-09-27，纯新增）\n * 番茄子源正文由服务器注入气泡 img，click 调本函数打开 /fq/review 弹窗页。\n * ================================================================== */\nfunction fqShowCmt(a, b, c) {\n    var jv = null, bid = '', iid = '';\n    if (a && typeof a === 'object') { jv = a; bid = String(b || ''); iid = String(c || ''); }\n    else { bid = String(a || ''); iid = String(b || ''); }\n    if (!jv) { try { if (this && this.java) jv = this.java; } catch (e0) {} }\n    if (!jv) { try { jv = _dpJv(); } catch (e1) {} }\n    if (!bid || !iid) { try { jv.toast('fqShowCmt 参数缺失'); } catch (e9) {} return; }\n    var host = '';\n    try { host = _dpAggHost(); } catch (e1) { host = _dpSrv(); }\n    var url = host + '/fq/review?item_id=' + encodeURIComponent(iid)\n            + '&book_id=' + encodeURIComponent(bid);\n    var cfg = '{\"heightPercentage\":0.72}';\n    // ★ 2026-10-18：Legado 的 BottomWebViewDialog 若自己加载 URL，\n    //   其加载协程挂在阅读页 lifecycleScope 上；点气泡触发的\n    //   重排/onResume 会 cancel 它 → 用户看到\n    //   \"JobCancellationException: Job was cancelled; job=s1{Cancelled}\"，\n    //   第二次点又正常。服务端实测冷 0.25~1.9s、热 0s，不是超时。\n    //   对策：先 java.ajax 取回 HTML 再交给弹窗 —— 弹窗不再自己发请求，\n    //   就没有可被取消的加载协程；ajax 失败仍退回原行为。\n    var html = '';\n    try { html = String(jv.ajax(url) || ''); } catch (eA) { html = ''; }\n    var _ok = false;\n    try { if (jv.showBrowser) { jv.showBrowser(url, (html && html.length > 200) ? html : null, null, cfg); _ok = true; } } catch (e2) {}\n    if (_ok) { return; }\n    try { jv.startBrowser(url, '本章评论'); return; } catch (e3) {}\n    try { jv.toast('本章评论：' + url); } catch (e4) {}\n}\n/* ---- v53b 番茄段评弹窗（点击段评气泡） ---- */\nfunction fqShowPara(a, b, c, dd) {\n    var jv = null, bid = '', iid = '', para = '';\n    if (a && typeof a === 'object') { jv = a; bid = String(b || ''); iid = String(c || ''); para = String(dd || ''); }\n    else { bid = String(a || ''); iid = String(b || ''); para = String(c || ''); }\n    if (!jv) { try { if (this && this.java) jv = this.java; } catch (e0) {} }\n    if (!jv) { try { jv = _dpJv(); } catch (e1) {} }\n    if (!bid || !iid || para === '') { try { jv.toast('fqShowPara 参数缺失'); } catch (e9) {} return; }\n    var host = '';\n    try { host = _dpAggHost(); } catch (e1) { host = _dpSrv(); }\n    var url = host + '/fq/review?item_id=' + encodeURIComponent(iid)\n            + '&book_id=' + encodeURIComponent(bid) + '&para=' + encodeURIComponent(para);\n    var cfg = '{\"heightPercentage\":0.72}';\n    // ★ 2026-10-18：Legado 的 BottomWebViewDialog 若自己加载 URL，\n    //   其加载协程挂在阅读页 lifecycleScope 上；点气泡触发的\n    //   重排/onResume 会 cancel 它 → 用户看到\n    //   \"JobCancellationException: Job was cancelled; job=s1{Cancelled}\"，\n    //   第二次点又正常。服务端实测冷 0.25~1.9s、热 0s，不是超时。\n    //   对策：先 java.ajax 取回 HTML 再交给弹窗 —— 弹窗不再自己发请求，\n    //   就没有可被取消的加载协程；ajax 失败仍退回原行为。\n    var html = '';\n    try { html = String(jv.ajax(url) || ''); } catch (eA) { html = ''; }\n    var _ok = false;\n    try { if (jv.showBrowser) { jv.showBrowser(url, (html && html.length > 200) ? html : null, null, cfg); _ok = true; } } catch (e2) {}\n    if (_ok) { return; }\n    try { jv.startBrowser(url, '段评'); return; } catch (e3) {}\n    try { jv.toast('段评：' + url); } catch (e4) {}\n}\n", "lastUpdateTime": "1792938778356", "loginUi": "@js:(function(){try{return _dpAqUi(book, java);}catch(e){return _dpLuFallback();}})()", "loginUrl": "@js:\n// ★ 注册码登录 / 自助领码（authquota）\n// loginUrl 的 @js: 环境**不含 jsLib**，所以全部内联自包含。\n//\n// 平台语义（已查证 rule-syntax/login.md + js-api.md）：\n//   · 按钮 action 可调用本文件内的函数（Legado ≥ 20221113），必须实现 login\n//   · 按钮里取输入：result.get(\"名\")；login 里取：source.getLoginInfoMap().get(\"名\")\n//   · 回填输入框：java.upLoginData({键:值})；文本类需用户打勾保存或靠它更新\n//   · 设备号：优先 java.deviceID()，退化 java.androidId()\n\nvar AQ_DEFAULT_BASE = 'http://43.139.147.103:8070';  // ★ 必须与 jsLib._DP_SERVER 同址：公网 80 被腾讯云拦截，唯一可达入口是 :8070\n\nfunction _aqBase() {\n    var b = '';\n    try { b = String(source.get('agg_server') || ''); } catch (e) {}\n    b = b.replace(/\\/+$/, '');\n    return b || AQ_DEFAULT_BASE;\n}\n\n// 读输入：按钮里走 result，login 里走 getLoginInfoMap，两边都兜\nfunction _aqV(name) {\n    try {\n        if (typeof result !== 'undefined' && result) {\n            if (typeof result.get === 'function') {\n                var g = result.get(name);\n                if (g != null && String(g) !== '') return String(g);\n            } else if (result[name] != null && String(result[name]) !== '') {\n                return String(result[name]);\n            }\n        }\n    } catch (e) {}\n    try {\n        if (typeof source !== 'undefined' && source && source.getLoginInfoMap) {\n            var m = source.getLoginInfoMap();\n            if (m) {\n                var v = (typeof m.get === 'function') ? m.get(name) : m[name];\n                if (v != null) return String(v);\n            }\n        }\n    } catch (e2) {}\n    return '';\n}\n\n// 设备指纹：32 位 hex，存书源变量 aq_dev。\n// 注意：清 App 数据会丢，所以这是「软绑定」——真闸门在 IP + 速率 + 库存。\nfunction aqDev() {\n    var d = '';\n    try { d = String(source.get('aq_dev') || ''); } catch (e) {}\n    d = d.replace(/[^0-9a-f]/gi, '').toLowerCase();\n    if (!/^[a-f0-9]{32}$/.test(d)) {\n        d = '';\n        try { d = String(java.deviceID() || ''); } catch (e1) {}\n        if (!d) { try { d = String(java.androidId() || ''); } catch (e2) {} }\n        d = d.replace(/[^0-9a-f]/gi, '').toLowerCase();\n        if (!/^[a-f0-9]{16,64}$/.test(d)) {\n            d = '';\n            for (var i = 0; i < 32; i++) {\n                d += '0123456789abcdef'.charAt(Math.floor(Math.random() * 16));\n            }\n        }\n        if (d.length > 64) d = d.substring(0, 64);\n        try { source.put('aq_dev', d); } catch (e3) {}\n    }\n    return d;\n}\n\n// 统一 POST JSON。\n// ★ 2026-10-20 修三处（都有 Kotlin 出处，别改回去）：\n//   ① 首选 java.post(url, body, headers, 15000) —— 只有这条**能设超时**；\n//      java.ajax(url + ',{...}') 参数位被 option 占满，设不了 callTimeout，\n//      实测会一直等到 okhttp 默认 15s 才报错。\n//   ② java.ajax 失败**不返回 null**，而是返回 java 堆栈字符串\n//      （JsExtensions.kt:111-118 `.getOrElse { it.stackTraceStr }`）。\n//      旧实现 `if (!resp) return null` 永假 → 把 SocketTimeoutException 当成\n//      服务端业务码弹给用户（用户看到的就是一整串 java.net.…）。\n//   ③ 因此**判据改成「响应首字符是不是 { 或 [」**：非 JSON 一律当网络错误，\n//      交给上层显示「网络错误，请重试」。\nfunction _aqPost(path, obj) {\n    var base = _aqBase();\n    var body = JSON.stringify(obj);\n    var hd = { 'Content-Type': 'application/json' };\n    var resp = '';\n    try {\n        var r = java.post(base + path, body, hd, 15000);\n        if (r) { try { resp = String(r.body ? r.body() : r); } catch (e1) { resp = String(r); } }\n    } catch (e2) { resp = ''; }\n    if (!resp) {\n        var opt = JSON.stringify({ method: 'POST', headers: hd, body: body });\n        try { resp = String(java.ajax(base + path + ',' + opt) || ''); } catch (e3) { resp = ''; }\n    }\n    resp = _aqTidy(resp);\n    var c0 = resp.charAt(0);\n    if (c0 !== '{' && c0 !== '[') { return null; }\n    try { return JSON.parse(resp); } catch (e4) { return null; }\n}\n\nfunction _aqGet(path) {\n    var base = _aqBase();\n    var resp = '';\n    try {\n        var r = java.get(base + path, {}, 12000);\n        if (r) { try { resp = String(r.body ? r.body() : r); } catch (e1) { resp = String(r); } }\n    } catch (e2) { resp = ''; }\n    if (!resp) {\n        try { resp = String(java.ajax(base + path) || ''); } catch (e3) { resp = ''; }\n    }\n    resp = _aqTidy(resp);\n    var c0 = resp.charAt(0);\n    if (c0 !== '{' && c0 !== '[') { return null; }\n    try { return JSON.parse(resp); } catch (e4) { return null; }\n}\n\n// 响应体清洗：去 BOM / 首尾空白。放这里供 _aqPost / _aqGet 共用。\nfunction _aqTidy(s) {\n    s = String(s == null ? '' : s);\n    try { s = s.replace(/^\\uFEFF/, ''); } catch (e) {}\n    return s.replace(/^\\s+|\\s+$/g, '');\n}\n\nfunction _aqToast(s) {\n    try { java.toast(String(s)); } catch (e) {}\n}\n\n// ---------------------------------------------------------------------------\n// 登录（✓ 按钮调用，必须存在）\n// ---------------------------------------------------------------------------\n// ---------------------------------------------------------------------------\n// 书源更新（2026-10-23）：匿名只读检查 /fq/version.json，有新版则唤起\n// legado://import/bookSource?src=... 官方导入深链（OnLineImportActivity，\n// 按 bookSourceUrl 覆盖合并，等价于用户手动「网络导入」一次）。\n// 导入 URL 写死为我们的官方地址，不从 version.json 读 —— 防 version 被篡改。\n// ---------------------------------------------------------------------------\nvar _AQ_IMPORT_URL = 'http://43.139.147.103:8070/fq/bookSource.json';\n\n// ★ 本份书源自带的版本号 —— 与 client-source.version.json 的 version 同步 bump。\n//   它是「本地版本」的权威来源：用户导入成功后 local 天然等于服务端版本，\n//   不需要任何写回动作（写回那条路 2026-10-23 已证伪，见 _dpSrcLocalVer 注释）。\nvar _AQ_SELF_VER = '20261023-18';\n\n// 本地版本号三级取值：\n//   ① 书源变量 aq_src_ver —— 只有 requireImport=false 的纯服务端升级会写它\n//      （那种版本不需要重新导入，写完即算升级完成）。\n//   ② loginUrl 里写死的 _AQ_SELF_VER —— **版本号的载体就是书源 JSON 本身**。\n//      用户导入成功 ⇒ 本地版本自动等于该版本，无需任何写回动作。\n//   ③ 都没有 ⇒ 空串（当成从没更新过，正常提示有新版）。\n// ★ 2026-10-23 老实现把 source.put('aq_src_ver') 挪掉后**没有第 ② 级替代**，\n//   注释里写的「由新版书源首次运行时的版本比对负责写回」从未实现，\n//   于是 local 恒空、每次点按钮都弹更新框。第 ② 级就是补这个洞。\nfunction _dpSrcLocalVer() {\n    var v = '';\n    try { v = String(source.get('aq_src_ver') || ''); } catch (e0) {}\n    if (!v) { v = _AQ_SELF_VER; }\n    return v;\n}\n\nfunction _dpSrcFetchVer() {\n    var base = _aqBase();\n    var resp = '';\n    try {\n        var r = java.get(base + '/fq/version.json', {}, 12000);\n        if (r) { try { resp = String(r.body ? r.body() : r); } catch (e1) { resp = String(r); } }\n    } catch (e2) { resp = ''; }\n    if (!resp) {\n        try { resp = String(java.ajax(base + '/fq/version.json') || ''); } catch (e3) { resp = ''; }\n    }\n    resp = _aqTidy(resp);\n    if (resp.charAt(0) !== '{') { return null; }\n    try { return JSON.parse(resp); } catch (e4) { return null; }\n}\n\n// 版本行文案：本地/远端都有则给对比，否则给引导\nfunction _dpSrcVerText() {\n    var remote = null;\n    try { remote = _dpSrcFetchVer(); } catch (e0) {}\n    var local = _dpSrcLocalVer();\n    if (remote && remote.version) {\n        if (local && local === String(remote.version)) {\n            return '📦 已是最新版 ' + local;\n        }\n        var tip = '📦 本地 ' + (local || '未知') + ' → 最新 ' + remote.version;\n        if (remote.requireImport === false) { tip += '（服务端升级，无需导入）'; }\n        return tip;\n    }\n    if (local) { return '📦 当前版本 ' + local + '（服务端版本未知）'; }\n    return '📦 版本未知（点下方按钮检查）';\n}\n\nfunction _dpSrcUpd() {\n    try {\n        var remote = _dpSrcFetchVer();\n        if (!remote || !remote.version) {\n            _aqToast('检查失败：网络错误，请稍后重试');\n            return '';\n        }\n        var local = _dpSrcLocalVer();\n        var ver = String(remote.version);\n        if (local && local === ver) {\n            // 已是最新版：只给一句提示，并把登录页那行版本文案就地刷成一致，\n            // 不弹任何选择框、不唤起导入确认页。\n            _aqToast('✅ 已是最新版 ' + ver + '，无需更新');\n            try { java.upLoginData({ 'aq_ver': '📦 已是最新版 ' + ver }); } catch (eU) {}\n            return '';\n        }\n        // 检完确实有新版：版本行也同步反映「本地 → 最新」，别停在旧的检查中文案\n        try {\n            java.upLoginData({ 'aq_ver': '📦 本地 ' + (local || '未知') + ' → 最新 ' + ver });\n        } catch (eU2) {}\n        // 分级提示（2026-10-23）：requireImport=false = 纯服务端升级，\n        // 不需要重新导入书源 —— 静默写回版本号，只给一句轻提示，不弹导入页。\n        // 只有 requireImport=true（涉及规则/jsLib 变更，必须重新导入）才唤起导入。\n        var needImport = remote.requireImport !== false;\n        if (!needImport) {\n            try { source.put('aq_src_ver', ver); } catch (eS) {}\n            _aqToast('服务端已升级到 ' + ver + '，无需重新导入，直接使用即可');\n            return '';\n        }\n        var msg = '有新版：' + (local ? local + ' → ' : '') + ver;\n        // 类型归一：畸形 changelog（字符串/数字/null）不允许抛 TypeError ——\n        // 外层 catch 会把 JS 异常当报错文案弹给用户，且不唤起更新（2026-10-23 深度测试 S2）。\n        var ch = [];\n        if (Object.prototype.toString.call(remote.changes) === '[object Array]') { ch = remote.changes; }\n        var shown = ch.slice(0, 5);\n        if (shown.length) { msg += '\\n' + shown.join('\\n'); }\n        if (ch.length > 5) { msg += '\\n…共 ' + ch.length + ' 条，详情可看更新日志页'; }\n        var notice = '';\n        try { if (remote.notice != null) { notice = String(remote.notice); } } catch (eN) {}\n        if (notice) { msg += '\\n📢 ' + notice; }\n        msg += '\\n即将打开导入确认页…';\n        _aqToast(msg);\n        // ★★ 2026-10-23 修：版本号**不能在唤起导入页之前写**。\n        //   Legado 的导入确认页勾选框默认不勾 —— 用户不勾选就点「确认」，书源\n        //   一个字节都不会换；这里若已把 aq_src_ver 写成远端版本，登录页就会显示\n        //   「已是最新版」，用户永远拿不到真更新（假的最新版）。\n        //   书源侧无从得知导入结果，所以这里**完全不写**：由新版书源首次运行时的\n        //   版本比对负责写回。用户取消 → 下次点按钮仍提示有新版，无副作用。\n        var deep = 'legado://import/bookSource?src=' + encodeURIComponent(_AQ_IMPORT_URL);\n        var okDeep = false;\n        try { java.openUrl(deep); okDeep = true; } catch (eO) {}\n        if (!okDeep) {\n            _aqToast('唤起导入页失败\\n请手动：书源管理 → 网络 → 粘贴 ' + _AQ_IMPORT_URL);\n        }\n    } catch (e) {\n        _aqToast('更新出错：' + (e && e.message ? e.message : e));\n    }\n    return '';\n}\n\nfunction aqVer() {\n    try {\n        var t = _dpSrcVerText();\n        try { java.upLoginData({ 'aq_ver': t }); } catch (e0) {}\n        return '';\n    } catch (e) { return ''; }\n}\n\nfunction login(force) {\n    try {\n        var email = _aqV('邮箱');\n        var pw = _aqV('密码');\n        if (!email || !pw) { _aqToast('请填写邮箱和密码'); return ''; }\n        var j = _aqPost('/user/auth/login', {\n            email: email, password: pw, device: aqDev()\n        });\n        if (!j) { _aqToast('网络错误，请重试'); return ''; }\n        if (j.code === 0) {\n            try {\n                var sess = String(j.session || '');\n                if (sess && typeof cookie !== 'undefined' && cookie) {\n                    cookie.setCookie(_aqBase(), 'rq_session=' + sess);\n                }\n            } catch (e1) {}\n            // ★ 登录成功立刻把额度行刷成真实值（否则要等用户手点才更新）\n            try { java.upLoginData({ 'aq_quota_line': _aqQuotaText() }); } catch (eQ) {}\n            // ★ 2026-10-23：记住邮箱（密码不落盘）。Legado 的 loginInfo 是靠\n            //   loginUi 的 default 初始化的空值、用户手填值不回写，所以书源自己存。\n            try { source.put('aq_email', String(email)); } catch (eM) {}\n            _aqToast('登录成功');\n            try { java.refreshContent(); } catch (e2) {}\n        } else if (j.code === 429) {\n            // 设备槽位满：直接把自救路径写进提示，别让用户卡在这\n            _aqToast((j.message || '登录设备数已达上限') + '\\n点「🚪 下线其它设备」可腾出名额');\n        } else {\n            _aqToast(j.message || '登录失败');\n        }\n    } catch (e) {\n        _aqToast('登录出错：' + (e && e.message ? e.message : e));\n    }\n    return '';\n}\n\n// ---------------------------------------------------------------------------\n// 注册（先领码，再填注册码 + 邮箱 + 密码）\n// ---------------------------------------------------------------------------\nfunction register() {\n    try {\n        var code = _aqV('注册码');\n        var email = _aqV('邮箱');\n        var pw = _aqV('密码');\n        if (!code) { _aqToast('请先点「🎫 领取注册码」拿到注册码'); return ''; }\n        if (!email || !pw) { _aqToast('请填写邮箱和密码'); return ''; }\n        var j = _aqPost('/user/auth/register', {\n            code: code, email: email, password: pw, device: aqDev()\n        });\n        if (!j) { _aqToast('网络错误，请重试'); return ''; }\n        if (j.code === 0) {\n            try {\n                var sess = String(j.session || '');\n                if (sess && typeof cookie !== 'undefined' && cookie) {\n                    cookie.setCookie(_aqBase(), 'rq_session=' + sess);\n                }\n            } catch (e1) {}\n            try { source.put('aq_email', String(email)); } catch (eM) {}\n            _aqToast('注册成功');\n            // ★ 2026-10-20：注册成功清空「注册码」栏 —— 否则用户接着点领码会看到\n            //   「本设备已领取过」（真话但绕）。解绑/登录都有对应清理，这条原先漏了。\n            try { java.upLoginData({ '注册码': '' }); } catch (eC) {}\n            try { java.upLoginData({ 'aq_quota_line': _aqQuotaText() }); } catch (eQ) {}\n            try { java.refreshContent(); } catch (e2) {}\n        } else {\n            _aqToast(j.message || '注册失败');\n        }\n    } catch (e) {\n        _aqToast('注册出错：' + (e && e.message ? e.message : e));\n    }\n    return '';\n}\n\n// ---------------------------------------------------------------------------\n// 自助领码：一机一码。成功即把码回填进「注册码」输入框。\n// ---------------------------------------------------------------------------\nfunction aqIssue() {\n    try {\n        // 先读服务端开关，关了就当场告知，不做无谓请求\n        var st = _aqGet('/user/code/state');\n        if (st && st.selfCodeEnabled === false) {\n            _aqToast('管理员已暂停发码');\n            return '';\n        }\n        // ★ 2026-10-17：池空时当场告知，省一次白跑的请求（服务端也会拦）。\n        if (st && st.pool_exhausted === true) {\n            _aqToast('注册码已发完，请等待释放或联系管理员');\n            return '';\n        }\n        var email = _aqV('邮箱');\n        // ★ 2026-10-21 P0（线上反馈「按邮箱找回注册码恒 404」）：\n        //   服务端 /user/code/find 只按 reg_codes.email 查，而「领取注册码」按钮\n        //   排在邮箱输入框**上面** —— 先点领码、后填邮箱是自然操作，于是库里\n        //   12 条自助码的 email 全是空串，找回对所有这类用户恒 404。\n        //   这里先拦一次；服务端另有兜底（有码时补写 email、二次领码继承旧 email）。\n        if (!email) {\n            _aqToast('请先在上方「邮箱」栏填好邮箱，再点「领取注册码」\\n邮箱用于以后找回注册码，务必填对');\n            return '';\n        }\n        var j = _aqPost('/user/code/issue', { device: aqDev(), email: email });\n        if (!j) { _aqToast('网络错误，请重试'); return ''; }\n        if (j.code === 0) {\n            var c = String(j.reg_code || '');\n            // 回填输入框（Legado 会实时刷新登录界面键值）\n            try { java.upLoginData({ '注册码': c }); } catch (e1) {}\n            var left = (j.remaining_today != null) ? ('｜今日还可发 ' + j.remaining_today + ' 个') : '';\n            _aqToast('已领取：' + c + left + '\\n请立即点「📝 注册」完成注册');\n        } else if (j.code_existing) {\n            // 本机已领过：直接把原码还给他，比只报错有用\n            try { java.upLoginData({ '注册码': String(j.code_existing) }); } catch (e2) {}\n            _aqToast('本机已领过：' + j.code_existing + '\\n如需更换请先「♻️ 解绑当前设备」');\n        } else {\n            _aqToast(j.message || '领取失败');\n        }\n    } catch (e) {\n        _aqToast('领码出错：' + (e && e.message ? e.message : e));\n    }\n    return '';\n}\n\n// ---------------------------------------------------------------------------\n// 解绑当前设备：释放名额，换机才能重领。\n// 注意两种结局：码未用过 → 作废归还名额（可立刻重领）；\n//              码已注册过 → 只解绑，名额不还（否则「注册→解绑→再领→再注册」可无限刷号）\n// ---------------------------------------------------------------------------\nfunction aqRelease() {\n    try {\n        var j = _aqPost('/user/code/release', { device: aqDev() });\n        if (!j) { _aqToast('网络错误，请重试'); return ''; }\n        if (j.code === 0) {\n            if (j.already_released) {\n                // ★ 2026-10-21：服务端把「没绑定过 / 已解绑过」改成幂等成功（code=0）。\n                //   这一支**不能**清空「注册码」输入框 —— 用户手上可能正拿着那张码\n                //   要注册（它只是解绑了、并未失效）。\n                _aqToast(j.note || '当前没有生效的注册码，可直接点「🎫 领取注册码」');\n            } else {\n                try { java.upLoginData({ '注册码': '' }); } catch (e1) {}\n                if (j.code_revoked) {\n                    _aqToast('已解绑，可重新领取');\n                } else {\n                    _aqToast('已解绑。该码已用于注册，换机请直接用邮箱密码登录');\n                }\n            }\n        } else {\n            _aqToast(j.message || '解绑失败');\n        }\n    } catch (e) {\n        _aqToast('解绑出错：' + (e && e.message ? e.message : e));\n    }\n    return '';\n}\n\n// ---------------------------------------------------------------------------\n// 用领码邮箱找回注册码\n// ---------------------------------------------------------------------------\nfunction aqFind() {\n    try {\n        var email = _aqV('邮箱');\n        if (!email) { _aqToast('请先填写邮箱（领码时用的那个）'); return ''; }\n        // ★ 2026-10-21：带上 device —— 服务端在「按邮箱查不到」时会按设备兜底，\n        //   救那批领码时邮箱没落库的历史码（线上 101/116 条 email 是空串）。\n        var j = _aqPost('/user/code/find', { email: email, device: aqDev() });\n        if (!j) { _aqToast('网络错误，请重试'); return ''; }\n        if (j.code === 0 && j.codes && j.codes.length) {\n            var unused = null;\n            for (var i = 0; i < j.codes.length; i++) {\n                if (j.codes[i].status === 'unused') { unused = j.codes[i].code; break; }\n            }\n            // ★ 只有 unused 才回填。原实现 `pick = unused || j.codes[0].code`\n            //   会把掩码（RQ-1E****）填进输入框，用户拿它去注册必然失败。\n            if (unused) {\n                try { java.upLoginData({ '注册码': unused }); } catch (e1) {}\n                _aqToast('已找回：' + unused);\n            } else {\n                _aqToast('本机领的码已失效（过期/已作废/已用于注册）\\n直接点「🎫 领取注册码」换一张新码');\n            }\n        } else {\n            _aqToast(j.message || '该邮箱没有领码记录');\n        }\n    } catch (e) {\n        _aqToast('找回出错：' + (e && e.message ? e.message : e));\n    }\n    return '';\n}\n\n// ---------------------------------------------------------------------------\n// 查看额度\n//\n// ★ 2026-10-16 修复「登录界面额度还是 0，没有实时更新」：\n//   以前额度只能靠点按钮弹 toast，界面上根本看不到，用户于是以为永远是 0。\n//   现在界面构建时（_aqQuotaText）就拉一次真实数据写进标签，\n//   点击这一行再拉一次并用 java.upLoginData 就地改写标签 —— 这就是「实时刷新」。\n// ---------------------------------------------------------------------------\n// 额度来源文案：同一个数字可能来自三种完全不同的配置，必须说清\n//   default = 全站默认额度；custom = 单独给这个人设的 N 章；exempt = 真·不限。\n// 服务端 /user/auth/status 的 quota.source 给的就是这三值。\nfunction _aqLimitSrcText(q) {\n    var s = String((q && q.source) || '');\n    if (s === 'exempt') return '豁免·不限';\n    if (s === 'custom') return '单独设的额度';\n    if (s === 'default') return '默认额度';\n    return '来源未知';\n}\n\n// st 可选：调用方已经取过 /user/auth/status 就传进来，省一次网络请求。\nfunction _aqQuotaText(st) {\n    try {\n        var a = st || _aqGet('/user/auth/status');\n        if (a && a.code === 0 && a.loggedIn && a.quota) {\n            var q = a.quota;\n            var lim = (q.limit == null) ? '不限' : q.limit;\n            var t = '📊 今日已读 ' + q.used + ' / ' + lim + ' 章';\n            if (q.remaining != null) { t += '（剩 ' + q.remaining + '）'; }\n            if (q.bypass) { t += ' · 暂不计限'; }\n            t += '｜' + _aqLimitSrcText(q);\n            return t;\n        }\n        if (a && a.loggedIn === false) {\n            return '📊 未登录 · 登录后这里显示今日额度';\n        }\n    } catch (e) {}\n    return '📊 额度获取失败 · 点这里重试';\n}\n\n// 登录态一行文案：打开登录页就能看到「到底登没登录、是谁」。\nfunction _aqWhoText(st) {\n    try {\n        var a = st || _aqGet('/user/auth/status');\n        if (!a) return '🔌 状态未知 · 点这里重试';\n        if (a.code === 0 && a.loggedIn) {\n            var em = '';\n            try { em = String((a.user && a.user.email) || ''); } catch (eE) {}\n            var q = a.quota || {};\n            var lim = (q.limit == null) ? '不限' : (q.limit + ' 章');\n            return '✅ 已登录' + (em ? '：' + em : '') + '｜今日 ' + q.used + ' / ' + lim\n                 + '（' + _aqLimitSrcText(q) + '）';\n        }\n        if (a.code === 401 || a.loggedIn === false) {\n            return '❌ 未登录 · 会话已失效，填邮箱密码再点登录';\n        }\n    } catch (e) {}\n    return '⚠ 登录状态读取失败 · 点这里重试';\n}\n\n// 「检测登录状态」按钮：拉一次 status，就地刷新两行文案。\n// ★ 已登录时顺手把邮箱回填进输入框 —— 用户不用再手打一遍。\nfunction aqCheck() {\n    try {\n        var a = _aqGet('/user/auth/status');\n        if (!a) { _aqToast('网络错误，请重试'); return ''; }\n        var t = _aqWhoText(a);\n        _aqToast(t);\n        try { java.upLoginData({ 'aq_who': t }); } catch (e1) {}\n        try { java.upLoginData({ 'aq_quota_line': _aqQuotaText(a) }); } catch (e2) {}\n        if (a.code === 0 && a.loggedIn) {\n            try {\n                var em = String((a.user && a.user.email) || '');\n                if (em) {\n                    java.upLoginData({ '邮箱': em });\n                    source.put('aq_email', em);   // 顺便持久化，下次打开直接带出来\n                }\n            } catch (e3) {}\n        }\n    } catch (e) {\n        _aqToast('检测出错：' + (e && e.message ? e.message : e));\n    }\n    return '';\n}\n\nfunction aqQuota() {\n    try {\n        var j = _aqGet('/user/api/quota');\n        if (!j) { _aqToast('网络错误，请重试'); return ''; }\n        if (j.code !== 0) {\n            _aqToast(j.message || '未登录');\n            try { java.upLoginData({ 'aq_quota_line': '📊 未登录 · 登录后这里显示今日额度' }); } catch (e0) {}\n            return '';\n        }\n        var lim = (j.limit == null) ? '不限' : j.limit;\n        var t = '📊 今日已读 ' + j.used + ' / ' + lim + ' 章';\n        if (j.remaining != null) { t += '（剩 ' + j.remaining + '）'; }\n        if (j.bypass) { t += ' · 暂不计限'; }\n        try { java.upLoginData({ 'aq_quota_line': t }); } catch (e1) {}\n        _aqToast(t + '\\n重读同一章不重复计 · 每日本地 0 点重置');\n    } catch (e) {\n        _aqToast('查询出错');\n    }\n    return '';\n}\n\n// ---------------------------------------------------------------------------\n// 自助设备管理：看自己的设备，一键下线其它设备\n// （撞上「登录设备数已达上限」时用户能自救，不必等管理员）\n// ---------------------------------------------------------------------------\nfunction aqKickOthers() {\n    try {\n        var d = _aqGet('/user/api/devices');\n        if (!d || d.code !== 0) { _aqToast('请先登录'); return ''; }\n        var list = d.devices || [];\n        var n = 0, names = [];\n        for (var i = 0; i < list.length; i++) {\n            var it = list[i];\n            if (it.current || !it.active) { continue; }\n            if (!it.device) { continue; }   // 空 device 是升级前的脏行，服务端无法按设备定位\n            names.push((it.device_label || '?') + '(' + it.active + ')');\n            var j = _aqPost('/user/api/devices/kick', { device: it.device });\n            if (j && j.code === 0) { n += (j.kicked || 0); }\n        }\n        if (!n) { _aqToast('没有其它在线设备（共 ' + list.length + ' 台）'); return ''; }\n        _aqToast('已下线 ' + n + ' 个会话：' + names.join('、'));\n    } catch (e) {\n        _aqToast('操作出错：' + (e && e.message ? e.message : e));\n    }\n    return '';\n}\n\n// ---------------------------------------------------------------------------\n// 退出登录\n// ---------------------------------------------------------------------------\nfunction aqLogout() {\n    try {\n        _aqPost('/user/auth/logout', {});\n        try { cookie.removeCookie(_aqBase()); } catch (e1) {}\n        // 退出后额度行也要跟着变成「未登录」，否则还留着上一个人的数字\n        try { java.upLoginData({ 'aq_quota_line': _aqQuotaText() }); } catch (e2) {}\n        _aqToast('已退出登录');\n        try { java.refreshContent(); } catch (e3) {}\n    } catch (e) {}\n    return '';\n}\n\n// ---------------------------------------------------------------------------\n// 登录界面构建\n// ---------------------------------------------------------------------------\nfunction _dpLuRow(name, label, action, dynLabel, basis) {\n    var r = {\n        name: name, type: 'button',\n        style: {\n            layout_flexGrow: 1,\n            layout_flexBasisPercent: (basis == null ? 0.45 : basis)\n        }\n    };\n    // ★ 2026-10-20：dynLabel=false 时用 JSON.stringify 生成 JS 字符串字面量。\n    //   旧写法 \"'\" + label + \"'\" 遇到 label 里的反斜杠会转义掉收尾引号 →\n    //   Legado eval viewName 时 SyntaxError → _dpAqUi 的 catch 返回 '[]' → 登录页空白。\n    //   label 可能来自服务端 codeHint（管理员可改），属于可控输入，必须转义。\n    r.viewName = dynLabel ? String(label) : JSON.stringify(String(label));\n    if (action) r.action = action;\n    return r;\n}\n\nfunction _dpLuFallback() {\n    try {\n        return JSON.stringify([\n            _dpLuRow('lu_hint', '↓   账号登录   ↓', null, false, 1),\n            _dpLuRow('lu_login', '🔑 登录', 'login(true)', false, 0.45),\n            _dpLuRow('lu_reg', '📝 注册', 'register()', false, 0.45),\n            _dpLuRow('lu_tip', '每日 100 章 · 重读不重复计 · 未登录无法阅读', null, false, 1)\n        ]);\n    } catch (e) { return '[]'; }\n}\n\nfunction _dpAqRows() {\n    var r = [];\n    // 引导文案由服务端下发；取不到就用兜底一句话\n    var hint = '点「🎫 领取注册码」自助领码：一机一码，换机先解绑';\n    var st = _aqGet('/user/code/state');\n    if (st && st.code === 0) {\n        if (st.codeHint) {\n            var parts = String(st.codeHint).split('\\n');\n            hint = parts[0];\n        }\n        if (st.selfCodeEnabled === false) {\n            r.push(_dpLuRow('aq_off', '⛔ 管理员已暂停发码', null, false, 1));\n        }\n    }\n    // ★ 额度行放最前面：用户打开登录页第一眼就该看到自己今天读了多少。\n    //   文字在构建时由 _aqQuotaText() 拉真实数据生成（不再是硬编码的 0）；\n    //   点它 = 立即重拉并用 upLoginData 就地刷新（这是「实时更新」的入口）。\n    //   注意 dynLabel 必须为 false：true 会让 viewName 变成**待求值的 JS 表达式**，\n    //   传纯文本会生成非法 JS 把整个登录页搞崩。静态引号 + upLoginData 按 name\n    //   改写 —— 就是 _dpGradeSet 改 lu_grade_n 的同款做法。\n    // ★ 2026-10-23：一次 /user/auth/status 供「额度行 + 登录态行」两处用，\n    //   别为了两行文案打两次网络。\n    var _st = null;\n    try { _st = _aqGet('/user/auth/status'); } catch (eSt) {}\n    var qtext = '📊 今日额度加载中…';\n    try { qtext = _aqQuotaText(_st); } catch (eq) {}\n    r.push(_dpLuRow('aq_quota_line', qtext, 'aqQuota()', false, 1));\n    // 登录态常驻一行（点它 = 重新检测）。以前只有按钮、没有常驻显示，\n    //   会话过期时用户看到的仍是\"今日额度\"，误以为自己还登着。\n    var whoText = '🔌 登录状态检测中…';\n    try { whoText = _aqWhoText(_st); } catch (ew) {}\n    r.push(_dpLuRow('aq_who', whoText, 'aqCheck()', false, 1));\n    r.push(_dpLuRow('aq_head', '↓  注册码登录（阅读额度）  ↓', null, false, 1));\n    r.push({ name: '注册码', type: 'text', default: '' });\n    // ★ 邮箱从书源变量带出来（source.put 落在 sourceVariable_<bookSourceUrl>，\n    //   不随「检查书源更新」丢失）。Legado 自己的 loginInfo 是靠 loginUi 的\n    //   default 初始化的空值，且用户手填的值从不回写 —— 所以必须我们存。\n    var _mail = '';\n    try { _mail = String(source.get('aq_email') || ''); } catch (eM) {}\n    r.push({ name: '邮箱', type: 'text', default: _mail });\n    r.push({ name: '密码', type: 'password', default: '' });\n    r.push(_dpLuRow('aq_check', '🔄 检测登录状态', 'aqCheck()', false, 1));\n    r.push(_dpLuRow('aq_login', '🔑 登录', 'login(true)', false, 0.45));\n    r.push(_dpLuRow('aq_reg', '📝 注册', 'register()', false, 0.45));\n    r.push(_dpLuRow('aq_issue', '🎫 领取注册码', 'aqIssue()', false, 0.45));\n    r.push(_dpLuRow('aq_release', '♻️ 解绑当前设备', 'aqRelease()', false, 0.45));\n    r.push(_dpLuRow('aq_find', '🔍 找回注册码', 'aqFind()', false, 0.45));\n    r.push(_dpLuRow('aq_kick', '🚪 下线其它设备', 'aqKickOthers()', false, 0.45));\n    r.push(_dpLuRow('aq_logout', '⏏️ 退出登录', 'aqLogout()', false, 1));\n    r.push(_dpLuRow('aq_ver', '📦 版本检查中…', 'aqVer()', false, 1));\n    r.push(_dpLuRow('aq_upd', '⟳ 检查书源更新', '_dpSrcUpd()', false, 1));\n    var tip = hint;\n    if (st && st.code === 0) {\n        // ★ 2026-10-17：池空时别再说「今日还可发 N 个」—— 那会和\n        //   「注册码已发完」自相矛盾。pool_exhausted 优先。\n        if (st.pool_exhausted === true) {\n            tip += '｜注册码已发完，等待释放';\n        } else if (st.remaining_today != null) {\n            tip += '｜今日还可发 ' + st.remaining_today + ' 个';\n        }\n        tip += '｜每日 ' + (st.dailyLimit == null ? 100 : st.dailyLimit) + ' 章';\n    }\n    r.push(_dpLuRow('aq_tip', tip, null, false, 1));\n    return r;\n}\n\nfunction _dpAqUi(bko, jav) {\n    try {\n        var rows = _dpAqRows();\n        // 叠加原有登录 UI（番茄/起点/段评开关等）\n        try {\n            if (typeof _dpLuList === 'function') {\n                var rest = JSON.parse(_dpLuList(bko, jav));\n                if (rest && rest.length) rows = rows.concat(rest);\n            }\n        } catch (eB) {}\n        return JSON.stringify(rows);\n    } catch (e) { return '[]'; }\n}\n", "respondTime": 180000, "ruleBookInfo": {"author": "@js:_dpInfoField(baseUrl, result, java, book, 'author')", "coverUrl": "@js:_dpInfoField(baseUrl, result, java, book, 'coverUrl')", "intro": "@js:_dpInfoField(baseUrl, result, java, book, 'intro')", "kind": "@js:_dpInfoField(baseUrl, result, java, book, 'kind')", "lastChapter": "@js:_dpInfoField(baseUrl, result, java, book, 'lastChapter')", "name": "@js:_dpInfoField(baseUrl, result, java, book, 'name')", "tocUrl": "@js:_dpTocUrl(baseUrl, result)", "wordCount": "@js:_dpInfoField(baseUrl, result, java, book, 'wordCount')"}, "ruleContent": {"content": "<js>(function(){\nfunction _ILLU(x){try{return __dpIllu(String(x==null?\"\":x),book,chapter,java);}catch(eI){return x;}}\nif((typeof _dpAggWant===\"function\")&&_dpAggWant(chapter,baseUrl)){\n    try{_dpSetCtx(java,book,chapter);}catch(eS){}\n    return _ILLU(_dpAggBody(result,chapter,baseUrl,java));\n}\nreturn _ILLU(_dpBody(String(result==null?\"\":result)));\n})()</js>\n@js:(function(){if((typeof _dpAggWant==='function')&&_dpAggWant(chapter,baseUrl))return result;return __dpInject(result, book ? String(book.name || '') : '', book ? String(book.author || '') : '', chapter ? String(chapter.title || '') : '', java, cookie, book, chapter);})()"}, "ruleExplore": {"author": "$.bAuth", "bookList": "<js>var _h=(typeof src!=='undefined'&&src!=null)?String(src):String(result==null?'':result);result=_dpExploreList(baseUrl,_h,java);</js>\n$.data.records||$.dp3.records", "bookUrl": "$.u", "coverUrl": "$.c", "intro": "$.desc", "kind": "$.subCat||$.cat", "name": "$.bName", "wordCount": "$.cnt"}, "ruleSearch": {"author": "$.author", "bookList": "<js>var _h=(typeof src!=='undefined'&&src!=null)?String(src):String(result==null?'':result);/* ★ 2026-10-24：sid 落盘已删 —— 上拉续搜下线，batch=0 一次收全。 */var _r=[];try{_r=_dpSearchRows(_h,'',java,source)||[];}catch(eS0){_r=[];}result=JSON.stringify({list:_r});</js>\n$.list", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name", "wordCount": "$.wordCount"}, "ruleToc": {"chapterList": "<js>var _h=(typeof src!=='undefined'&&src!=null)?String(src):String(result==null?'':result);var _r=[];try{_r=_dpTocRows(baseUrl,_h,java)||[];}catch(eT0){_r=[];}result=JSON.stringify({list:_r});</js>\n$.list", "chapterName": "$.name", "chapterUrl": "$.url"}, "searchUrl": "@js:\nvar _g='';\ntry { _g=String(source.get('dp_adult')||''); } catch(e1){}\nif(!_g){ try { _g=String(source.get('dpgrade')||''); } catch(e2){} }\nif(!_g){ try { _g=String(cache.get('dpgrade')||''); } catch(e3){} }\nvar _a=((String(_g)==='1')||String(_g).indexOf('成人')>=0)?'1':'0';\n// ★★ 2026-10-24（YG 指令）：**上拉续搜（渐进批次）已去掉**。\n//   原因（实测两个症状）：\n//     ① 上拉过程行数倒退：page3=32 行 → page4=25 行，丢 2 个书名；\n//     ② batch=5 首屏只覆盖 5 个源，搜《夜无疆》服务端有 17 行/16 源，\n//        首屏只看到 1 行，用户以为「只有 5 条」。\n//   新形态：batch=0 + all_src=1 = **一次搜完全部源**再返回，\n//   行的先后由服务端「质量优先」排序决定（优质且 <10s 的源排最前）。\n//   all_src=1 = 服务端禁用 EARLY_SRC/EARLY_SRC_FULL/EARLY_RETURN 三重提前返回，\n//   等**每个**子源都跑完（或到 budget 上限）才返回 —— YG「不点停止就一直搜子源」。\n//   停止 = 取消本请求 = 服务端 worker 一并 cancel。\n// ★ budget=25：Legado SearchModel.startSearch() 用 withTimeout(30000L) 掐单源，\n//   服务端 exhaustive 超过 30s 就被客户端取消（nginx 499、用户看到「加载不出来」）。\n//   显式传 25 让两端预期一致，比 budget=0 落到服务端 45s 默认值安全。\n_dpAggHost() + '/api/search?key={{key}}&page={{page}}&type=novel&adult='+_a+'&all_src=1&batch=0&budget=25&sv=1';\n// all_src=1 = 服务端禁用 EARLY_SRC/EARLY_SRC_FULL/EARLY_RETURN 三重提前返回，\n//   等**每个**子源都跑完（或到 budget 上限）才返回 —— YG「不点停止就一直搜子源」。\n//   停止 = 取消本请求 = 服务端 worker 一并 cancel；传 all_src=0 退回快搜。", "weight": 0},{"bookSourceComment": "霹雳书坊(旧站) ", "bookSourceGroup": "纳兰验证", "bookSourceName": "霹雳书坊", "bookSourceType": 0, "bookSourceUrl": "https://www.pilisf.com", "bookUrlPattern": ".*pilisf\\.com/wapbook/\\d+\\.html.*", "concurrentRate": "1000", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\":\"分类\",\"url\":\"/sort/\"},{\"title\":\"排行\",\"url\":\"/top/\"},{\"title\":\"新书\",\"url\":\"/top/postdate_1/\"},{\"title\":\"完本\",\"url\":\"/full/1/\"}]", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 16; 23113RKC6C Build/BP2A.250605.031.A3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.8010.36 Mobile Safari/537.36\", \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\", \"Accept-Language\": \"zh-CN,zh;q=0.9,en;q=0.8\", \"Accept-Encoding\": \"identity\", \"Referer\": \"https://www.pilisf.com/\", \"Origin\": \"https://www.pilisf.com\"}", "lastUpdateTime": "1792895353758", "loginUi": "[\n  {\n    \"name\": \"🌐 打开浏览器完成验证\",\n    \"type\": \"button\",\n    \"action\": \"openBrowser()\",\n    \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}\n  },\n  {\n    \"name\": \"🍪 查看Cookie状态\",\n    \"type\": \"button\",\n    \"action\": \"checkCookie()\",\n    \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}\n  },\n  {\n    \"name\": \"🗑️ 清除Cookie\",\n    \"type\": \"button\",\n    \"action\": \"clearCookie()\",\n    \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}\n  }\n]", "loginUrl": "openBrowser = () => {\n    java.startBrowser('https://www.pilisf.com', '过完验证后，务必等到首页完全显示，再返回阅读');\n}\n\ncheckCookie = () => {\n    try {\n        var c = java.getCookie('https://www.pilisf.com') || '';\n        var hasClearance = c.indexOf('cf_clearance') !== -1;\n        var hasBm = c.indexOf('__cf_bm') !== -1;\n        java.toast('cf_clearance: ' + (hasClearance ? '✅' : '❌') + '  __cf_bm: ' + (hasBm ? '✅' : '❌'));\n    } catch(e) {\n        java.toast('检查失败: ' + e);\n    }\n}\n\nclearCookie = () => {\n    try {\n        java.clearCookie('https://www.pilisf.com');\n        java.toast('🗑️ Cookie 已清除，需重新过 CF 验证');\n    } catch(e) {\n        java.toast('清 Cookie 失败: ' + e);\n    }\n}", "respondTime": 180000, "ruleBookInfo": {"author": "div.book-info-status a[href*=author]@text || p.book-status@text || span.author a@text || div.bookinfo p@text", "coverUrl": "div.book-cover img@src || img.book-cover@src || div.bookimg img@src || img@src", "intro": "div.book-intro@text || p.book-intro@text || div.intro@text || div.bookinfo div.desc@text", "kind": "a.book-fenlei@text || span.book-fenlei@text || div.cat@text || div.bookinfo span@text", "lastChapter": "a.book-newest@text || a.lastchapter@text || div.bookinfo a.newest@text", "name": "h1@text || h2.book-title@text || div.bookname h1@text || div.bookinfo h1@text", "tocUrl": "@js:\nvar b = String(baseUrl);\nvar m0 = b.match(/wapbook\\/(\\d+)/);\nvar out = b;\nif (m0) {\n  var id = m0[1];\n  try {\n    var html = String(java.ajax(b));\n    var re = new RegExp('href=[\"\\']([^\"\\']*?/\\\\d+/' + id + '/?)[\"\\']');\n    var m = html.match(re);\n    if (m) {\n      out = m[1];\n      if (out.indexOf('http') !== 0) {\n        if (out.charAt(0) !== '/') out = '/' + out;\n        out = 'https://www.pilisf.com' + out;\n      }\n      java.log('TOC_URL=' + out);\n    }\n  } catch(e) { java.log('TOC_ERR=' + e); }\n}\nout;"}, "ruleContent": {"content": "#novelcontent p@text || #novelcontent@text || .novelcontent p@text", "nextContentUrl": "ul.novelbutton a:contains(下一章)@href || a:contains(下一章)@href"}, "ruleExplore": {"author": "span.author a@text || span.book-status@text || div.author@text", "bookList": "div.x-book || div.bookbox || div.novelslist li || ul.list li", "bookUrl": "a[href^=wapbook]@href || div.x-book__coverbox a@href || h4 a@href || a@href", "coverUrl": "img.x-book__cover@src || img@src", "intro": "p.x-book__intro@text || div.intro@text", "kind": "span.book-fenlei@text || div.cat@text", "name": "a[href^=wapbook]@text || p.x-book__info--name@text || h4 a@text || a@text"}, "ruleSearch": {"author": "span.author a@text", "bookList": "div.searchresult p.sone", "bookUrl": "a[href^=wapbook]@href", "checkKeyWord": "我的", "coverUrl": "img@src", "name": "a[href^=wapbook]@text"}, "ruleToc": {"chapterList": "ul.chapters li", "chapterName": "a@text", "chapterUrl": "a@href"}, "searchUrl": "@js:\nvar U = 'https://www.pilisf.com';\nvar out = '';\nvar c = String(java.getCookie(U) || '');\nif (c.indexOf('cf_clearance') === -1) {\n  java.log('CF_CLEARANCE_MISSING');\n  out = '';\n} else {\n  var enc = '';\n  try {\n    var bytes = new Packages.java.lang.String(String(key)).getBytes('GBK');\n    for (var i = 0; i < bytes.length; i++) {\n      var b = bytes[i] & 0xff;\n      if ((b >= 48 && b <= 57) || (b >= 65 && b <= 90) || (b >= 97 && b <= 122)) {\n        enc += String.fromCharCode(b);\n      } else {\n        enc += '%' + (b < 16 ? '0' : '') + b.toString(16).toUpperCase();\n      }\n    }\n  } catch(e) {\n    java.log('GBK_ENC_ERR:' + e);\n  }\n  var body = 's=' + enc + '&type=articlename';\n  out = U + '/s.php,' + JSON.stringify({method:'POST', body:body, headers:{'Content-Type':'application/x-www-form-urlencoded','Accept-Encoding':'identity','Referer':U + '/','Origin':U}});\n}\nout;", "weight": 0},{"bookSourceGroup": "精选测试", "bookSourceName": "八叉书库", "bookSourceType": 0, "bookSourceUrl": "https://bcshuku.com/", "customOrder": -2, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "[\n{\"title\":\"分类\",\"url\":\"\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n{\"title\":\"长篇\",\"url\":\"/booklist1/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"综合\",\"url\":\"/booklist2/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"武侠\",\"url\":\"/booklist3/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"历史\",\"url\":\"/booklist4/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"都市\",\"url\":\"/booklist5/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"玄幻\",\"url\":\"/booklist6/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"女生\",\"url\":\"/booklist7/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"其他\",\"url\":\"/booklist8/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"现代\",\"url\":\"/booklist9/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"排行榜单\",\"url\":\"\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n{\"title\":\"热门排行\",\"url\":\"/popular/{{\n\tvar pjstr = 'index.html';\n\tif(page!=1)  pjstr='index_'+page+'.html';\n\tpjstr}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"最新更新\",\"url\":\"/latest/{{\n\tvar pjstr = 'index.html';\n\tif(page!=1)  pjstr='index_'+page+'.html';\n\tpjstr}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"最新入库\",\"url\":\"/release/{{\n\tvar pjstr = 'index.html';\n\tif(page!=1)  pjstr='index_'+page+'.html';\n\tpjstr}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"完本小说\",\"url\":\"/completed/{{\n\tvar pjstr = 'index.html';\n\tif(page!=1)  pjstr='index_'+page+'.html';\n\tpjstr}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}}\n]", "header": "\"accept\": \"application/json, text/javascript, */*; q=0.01\",\n    \"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\",\n    \"cache-control\": \"no-cache\",\n    \"content-type\": \"application/x-www-form-urlencoded; charset=UTF-8\",\n    \"origin\": \"https://bcshuku.com\",\n    \"pragma\": \"no-cache\",\n    \"priority\": \"u=1, i\",\n    \"sec-ch-ua\": \"\\\"Microsoft Edge\\\";v=\\\"143\\\", \\\"Chromium\\\";v=\\\"143\\\", \\\"Not A(Brand\\\";v=\\\"24\\\"\",\n    \"sec-ch-ua-mobile\": \"?0\",\n    \"sec-ch-ua-platform\": \"\\\"Windows\\\"\",\n    \"sec-fetch-dest\": \"empty\",\n    \"sec-fetch-mode\": \"cors\",\n    \"sec-fetch-site\": \"same-origin\",\n    \"user-agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0\",\n    \"x-requested-with\": \"XMLHttpRequest\"\n", "lastUpdateTime": "1792870206663", "respondTime": 180000, "ruleBookInfo": {"author": "//div[@class=\"info-chitiet\"]/span/a[@itemprop=\"author\"]/text()", "coverUrl": "//div[@class=\"book\"]/img/@src", "intro": "//div[@itemprop=\"description\"]/text()", "kind": "//div[@class=\"info-chitiet\"]/span/a[@itemprop=\"genre\"]/text()", "name": "//div[@class=\"col-xs-12 col-sm-8 col-md-8 desc\"]/h3/text()"}, "ruleContent": {"content": "@js:\nvar out = \"\";\nvar mUrl = result.match(/\"url\"\\s*:\\s*\"([^\"]+)\"/);\nvar mMobile = result.match(/\"mobile\"\\s*:\\s*\"?([^\",}\\s]+)\"?/);\nvar mIsk = result.match(/\"isk\"\\s*:\\s*\"?([^\",}\\s]+)\"?/);\nvar mNovel = result.match(/\"novel\"\\s*:\\s*\"?([^\",}\\s]+)\"?/);\nvar mChapter = result.match(/\"chapter\"\\s*:\\s*\"?([^\",}\\s]+)\"?/);\nvar mt = result.match(/\"t\"\\s*:\\s*\"?([^\",}\\s]+)\"?/);\nvar mn = result.match(/\"n\"\\s*:\\s*\"([^\"]+)\"/);\nvar mSign = result.match(/\"sign\"\\s*:\\s*\"([^\"]+)\"/);\n\nif (!mUrl || !mSign) {\n    out = \"未找到sign参数。页面开头:\" + result.substring(0, 500);\n} else {\n    var url = mUrl[1];\n    var mobile = mMobile ? mMobile[1] : \"1\";\n    var isk = mIsk ? mIsk[1] : \"1\";\n    var novel = mNovel ? mNovel[1] : \"\";\n    var chapter = mChapter ? mChapter[1] : \"\";\n    var t = mt ? mt[1] : \"\";\n    var n = mn ? mn[1] : \"\";\n    var sign = mSign[1];\n\n    var body = \"url=\" + encodeURIComponent(url)\n             + \"&mobile=\" + encodeURIComponent(mobile)\n             + \"&isk=\" + encodeURIComponent(isk)\n             + \"&novel=\" + encodeURIComponent(novel)\n             + \"&chapter=\" + encodeURIComponent(chapter)\n             + \"&t=\" + encodeURIComponent(t)\n             + \"&n=\" + encodeURIComponent(n)\n             + \"&sign=\" + encodeURIComponent(sign);\n\n    // 【关键修正】使用兼容性最好的 Java 底层线程休眠方法\n    var sleepTime = Math.floor(Math.random() * 5500) + 3400;\n    Packages.java.lang.Thread.sleep(sleepTime);\n\n    var resp = java.post(\"https://bcshuku.com/conapi.php\", body, {\n        \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36\",\n        \"Accept\": \"application/json, text/javascript, */*; q=0.01\",\n        \"Accept-Language\": \"zh-CN,zh;q=0.9,en;q=0.8\",\n        \"Content-Type\": \"application/x-www-form-urlencoded; charset=UTF-8\",\n        \"X-Requested-With\": \"XMLHttpRequest\",\n        \"Origin\": \"https://bcshuku.com\",\n        \"Referer\": baseUrl\n    });\n\n    var text = (resp && resp.body) ? resp.body() : String(resp);\n    \n    if (text.indexOf('\"success\":\"1\"') > -1 || text.indexOf('\"success\":true') > -1) {\n        var json = JSON.parse(text);\n        out = json.content;\n    } else if (text.indexOf('访问异常') > -1) {\n        out = \"触发网站风控。请求间隔已随机延迟，若仍提示异常，请去阅读【其他设置】将并发率改为 1，清空缓存，或稍等十分钟再试。\";\n    } else {\n        out = \"请求失败，返回内容:\" + text;\n    }\n}\nout;"}, "ruleExplore": {"author": "//div[@class='caption']/div[@class=\"chi-tiet chuyen-muc\"]//text()", "bookList": "//div[@class=\"one-row\"]/div[@class=\"col-md-3 col-sm-6 col-xs-6 home-truyendecu\"]", "bookUrl": "//div[@class='caption']/a/@href", "coverUrl": "//div[@class='each_truyen']/a/img/@src", "lastChapter": "//div[@class='caption']/div[@class=\"chi-tiet tt-status\"]//small[@class=\"btn-xs label-primary\"]/text()", "name": "//div[@class='caption']/a/@title"}, "ruleReview": [], "ruleSearch": {"bookList": "//div[@class=\"one-row\"]/div[@class=\"col-md-3 col-sm-6 col-xs-6 home-truyendecu\"]", "bookUrl": "//div[@class=\"each_truyen\"]/a/@href", "coverUrl": "//div[@class=\"each_truyen\"]/a/img/@src", "name": "//h3[@itemprop=\"name\"]/text()"}, "ruleToc": {"chapterList": "//div[@id='list-chapter']//ul[@class='list-chapter']//li/a", "chapterName": "//span[@class=\"chapter-text\"]/text()", "chapterUrl": "@js:\nvar doc = org.jsoup.Jsoup.parse(result);\nvar link = doc.select(\"a\").first();\n'https://bcshuku.com' + link.attr(\"href\");", "nextTocUrl": "//div[@id=\"pagination\"]//li[last()-1]/a/@href"}, "searchUrl": "@js:\nlet new_url = java.get('https://bcshuku.com/e/search/index.php?keyboard='+key+'&show=title,writer,byr&searchget=1',{\n    \"accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\",\n    \"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\",\n    \"cache-control\": \"no-cache\",\n    \"pragma\": \"no-cache\",\n    \"referer\": \"https://bcshuku.com\",\n    \"sec-ch-ua\": \"\\\"Microsoft Edge\\\";v=\\\"143\\\", \\\"Chromium\\\";v=\\\"143\\\", \\\"Not A(Brand\\\";v=\\\"24\\\"\",\n    \"sec-ch-ua-mobile\": \"?1\",\n    \"sec-ch-ua-platform\": \"\\\"Android\\\"\",\n    \"sec-fetch-dest\": \"document\",\n    \"sec-fetch-mode\": \"navigate\",\n    \"sec-fetch-site\": \"same-origin\",\n    \"sec-fetch-user\": \"?1\",\n    \"upgrade-insecure-requests\": \"1\",\n    \"user-agent\": \"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Mobile Safari/537.36 Edg/143.0.0.0\"\n});\nlet location = new_url.header(\"location\");\nlet searchid = location.match(/searchid=(\\d+)/)[1];\nlet url;\nif (page == 0) {\n    url = \"https://bcshuku.com/e/search/result/?searchid=\" + searchid;\n} else {\n    url = \"https://bcshuku.com/e/search/result/index.php?page=\" + (page - 1) + \"&searchid=\" + searchid;\n}\nurl;", "weight": 0},{"bookSourceGroup": "精选", "bookSourceName": "八叉书库", "bookSourceType": 0, "bookSourceUrl": "https://bcshuku.com/", "customOrder": -2, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "[\n{\"title\":\"分类\",\"url\":\"\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n{\"title\":\"长篇\",\"url\":\"/booklist1/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"综合\",\"url\":\"/booklist2/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"武侠\",\"url\":\"/booklist3/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"历史\",\"url\":\"/booklist4/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"都市\",\"url\":\"/booklist5/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"玄幻\",\"url\":\"/booklist6/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"女生\",\"url\":\"/booklist7/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"其他\",\"url\":\"/booklist8/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"现代\",\"url\":\"/booklist9/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"排行榜单\",\"url\":\"\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n{\"title\":\"热门排行\",\"url\":\"/popular/{{\n\tvar pjstr = 'index.html';\n\tif(page!=1)  pjstr='index_'+page+'.html';\n\tpjstr}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"最新更新\",\"url\":\"/latest/{{\n\tvar pjstr = 'index.html';\n\tif(page!=1)  pjstr='index_'+page+'.html';\n\tpjstr}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"最新入库\",\"url\":\"/release/{{\n\tvar pjstr = 'index.html';\n\tif(page!=1)  pjstr='index_'+page+'.html';\n\tpjstr}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"完本小说\",\"url\":\"/completed/{{\n\tvar pjstr = 'index.html';\n\tif(page!=1)  pjstr='index_'+page+'.html';\n\tpjstr}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}}\n]", "header": "\"accept\": \"application/json, text/javascript, */*; q=0.01\",\n    \"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\",\n    \"cache-control\": \"no-cache\",\n    \"content-type\": \"application/x-www-form-urlencoded; charset=UTF-8\",\n    \"origin\": \"https://bcshuku.com\",\n    \"pragma\": \"no-cache\",\n    \"priority\": \"u=1, i\",\n    \"sec-ch-ua\": \"\\\"Microsoft Edge\\\";v=\\\"143\\\", \\\"Chromium\\\";v=\\\"143\\\", \\\"Not A(Brand\\\";v=\\\"24\\\"\",\n    \"sec-ch-ua-mobile\": \"?0\",\n    \"sec-ch-ua-platform\": \"\\\"Windows\\\"\",\n    \"sec-fetch-dest\": \"empty\",\n    \"sec-fetch-mode\": \"cors\",\n    \"sec-fetch-site\": \"same-origin\",\n    \"user-agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0\",\n    \"x-requested-with\": \"XMLHttpRequest\"\n", "lastUpdateTime": "1792869933250", "respondTime": 180000, "ruleBookInfo": {"author": "//div[@class=\"info-chitiet\"]/span/a[@itemprop=\"author\"]/text()", "coverUrl": "//div[@class=\"book\"]/img/@src", "intro": "//div[@itemprop=\"description\"]/text()", "kind": "//div[@class=\"info-chitiet\"]/span/a[@itemprop=\"genre\"]/text()", "name": "//div[@class=\"col-xs-12 col-sm-8 col-md-8 desc\"]/h3/text()"}, "ruleContent": {"content": "@js:\nvar out = \"\";\nvar mUrl = result.match(/\"url\"\\s*:\\s*\"([^\"]+)\"/);\nvar mMobile = result.match(/\"mobile\"\\s*:\\s*\"?([^\",}\\s]+)\"?/);\nvar mIsk = result.match(/\"isk\"\\s*:\\s*\"?([^\",}\\s]+)\"?/);\nvar mNovel = result.match(/\"novel\"\\s*:\\s*\"?([^\",}\\s]+)\"?/);\nvar mChapter = result.match(/\"chapter\"\\s*:\\s*\"?([^\",}\\s]+)\"?/);\nvar mt = result.match(/\"t\"\\s*:\\s*\"?([^\",}\\s]+)\"?/);\nvar mn = result.match(/\"n\"\\s*:\\s*\"([^\"]+)\"/);\nvar mSign = result.match(/\"sign\"\\s*:\\s*\"([^\"]+)\"/);\n\nif (!mUrl || !mSign) {\n    out = \"未找到sign参数。页面开头:\" + result.substring(0, 500);\n} else {\n    var url = mUrl[1];\n    var mobile = mMobile ? mMobile[1] : \"1\";\n    var isk = mIsk ? mIsk[1] : \"1\";\n    var novel = mNovel ? mNovel[1] : \"\";\n    var chapter = mChapter ? mChapter[1] : \"\";\n    var t = mt ? mt[1] : \"\";\n    var n = mn ? mn[1] : \"\";\n    var sign = mSign[1];\n\n    var body = \"url=\" + encodeURIComponent(url)\n             + \"&mobile=\" + encodeURIComponent(mobile)\n             + \"&isk=\" + encodeURIComponent(isk)\n             + \"&novel=\" + encodeURIComponent(novel)\n             + \"&chapter=\" + encodeURIComponent(chapter)\n             + \"&t=\" + encodeURIComponent(t)\n             + \"&n=\" + encodeURIComponent(n)\n             + \"&sign=\" + encodeURIComponent(sign);\n\n    // 【修正】使用 legado.sleep 实现 3.4s - 8.9s 随机延时\n    var sleepTime = Math.floor(Math.random() * 5500) + 3400;\n    legado.sleep(sleepTime);\n\n    var resp = java.post(\"https://bcshuku.com/conapi.php\", body, {\n        \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36\",\n        \"Accept\": \"application/json, text/javascript, */*; q=0.01\",\n        \"Accept-Language\": \"zh-CN,zh;q=0.9,en;q=0.8\",\n        \"Content-Type\": \"application/x-www-form-urlencoded; charset=UTF-8\",\n        \"X-Requested-With\": \"XMLHttpRequest\",\n        \"Origin\": \"https://bcshuku.com\",\n        \"Referer\": baseUrl\n    });\n\n    var text = (resp && resp.body) ? resp.body() : String(resp);\n    \n    if (text.indexOf('\"success\":\"1\"') > -1 || text.indexOf('\"success\":true') > -1) {\n        var json = JSON.parse(text);\n        out = json.content;\n    } else if (text.indexOf('访问异常') > -1) {\n        out = \"触发网站风控。请求间隔已随机延迟，若仍提示异常，请去阅读【其他设置】将并发率改为 1，清空缓存，或稍等十分钟再试。\";\n    } else {\n        out = \"请求失败，返回内容:\" + text;\n    }\n}\nout;"}, "ruleExplore": {"author": "//div[@class='caption']/div[@class=\"chi-tiet chuyen-muc\"]//text()", "bookList": "//div[@class=\"one-row\"]/div[@class=\"col-md-3 col-sm-6 col-xs-6 home-truyendecu\"]", "bookUrl": "//div[@class='caption']/a/@href", "coverUrl": "//div[@class='each_truyen']/a/img/@src", "lastChapter": "//div[@class='caption']/div[@class=\"chi-tiet tt-status\"]//small[@class=\"btn-xs label-primary\"]/text()", "name": "//div[@class='caption']/a/@title"}, "ruleReview": [], "ruleSearch": {"bookList": "//div[@class=\"one-row\"]/div[@class=\"col-md-3 col-sm-6 col-xs-6 home-truyendecu\"]", "bookUrl": "//div[@class=\"each_truyen\"]/a/@href", "coverUrl": "//div[@class=\"each_truyen\"]/a/img/@src", "name": "//h3[@itemprop=\"name\"]/text()"}, "ruleToc": {"chapterList": "//div[@id='list-chapter']//ul[@class='list-chapter']//li/a", "chapterName": "//span[@class=\"chapter-text\"]/text()", "chapterUrl": "@js:\nvar doc = org.jsoup.Jsoup.parse(result);\nvar link = doc.select(\"a\").first();\n'https://bcshuku.com' + link.attr(\"href\");", "nextTocUrl": "//div[@id=\"pagination\"]//li[last()-1]/a/@href"}, "searchUrl": "@js:\nlet new_url = java.get('https://bcshuku.com/e/search/index.php?keyboard='+key+'&show=title,writer,byr&searchget=1',{\n    \"accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\",\n    \"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\",\n    \"cache-control\": \"no-cache\",\n    \"pragma\": \"no-cache\",\n    \"referer\": \"https://bcshuku.com\",\n    \"sec-ch-ua\": \"\\\"Microsoft Edge\\\";v=\\\"143\\\", \\\"Chromium\\\";v=\\\"143\\\", \\\"Not A(Brand\\\";v=\\\"24\\\"\",\n    \"sec-ch-ua-mobile\": \"?1\",\n    \"sec-ch-ua-platform\": \"\\\"Android\\\"\",\n    \"sec-fetch-dest\": \"document\",\n    \"sec-fetch-mode\": \"navigate\",\n    \"sec-fetch-site\": \"same-origin\",\n    \"sec-fetch-user\": \"?1\",\n    \"upgrade-insecure-requests\": \"1\",\n    \"user-agent\": \"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Mobile Safari/537.36 Edg/143.0.0.0\"\n});\nlet location = new_url.header(\"location\");\nlet searchid = location.match(/searchid=(\\d+)/)[1];\nlet url;\nif (page == 0) {\n    url = \"https://bcshuku.com/e/search/result/?searchid=\" + searchid;\n} else {\n    url = \"https://bcshuku.com/e/search/result/index.php?page=\" + (page - 1) + \"&searchid=\" + searchid;\n}\nurl;", "weight": 0},{"bookSourceGroup": "精选", "bookSourceName": "八叉书库", "bookSourceType": 0, "bookSourceUrl": "https://bcshuku.com/", "customOrder": -2, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "[\n{\"title\":\"分类\",\"url\":\"\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n{\"title\":\"长篇\",\"url\":\"/booklist1/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"综合\",\"url\":\"/booklist2/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"武侠\",\"url\":\"/booklist3/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"历史\",\"url\":\"/booklist4/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"都市\",\"url\":\"/booklist5/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"玄幻\",\"url\":\"/booklist6/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"女生\",\"url\":\"/booklist7/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"其他\",\"url\":\"/booklist8/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"现代\",\"url\":\"/booklist9/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"排行榜单\",\"url\":\"\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n{\"title\":\"热门排行\",\"url\":\"/popular/{{\n\tvar pjstr = 'index.html';\n\tif(page!=1)  pjstr='index_'+page+'.html';\n\tpjstr}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"最新更新\",\"url\":\"/latest/{{\n\tvar pjstr = 'index.html';\n\tif(page!=1)  pjstr='index_'+page+'.html';\n\tpjstr}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"最新入库\",\"url\":\"/release/{{\n\tvar pjstr = 'index.html';\n\tif(page!=1)  pjstr='index_'+page+'.html';\n\tpjstr}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"完本小说\",\"url\":\"/completed/{{\n\tvar pjstr = 'index.html';\n\tif(page!=1)  pjstr='index_'+page+'.html';\n\tpjstr}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}}\n]", "header": "\"accept\": \"application/json, text/javascript, */*; q=0.01\",\n    \"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\",\n    \"cache-control\": \"no-cache\",\n    \"content-type\": \"application/x-www-form-urlencoded; charset=UTF-8\",\n    \"origin\": \"https://bcshuku.com\",\n    \"pragma\": \"no-cache\",\n    \"priority\": \"u=1, i\",\n    \"sec-ch-ua\": \"\\\"Microsoft Edge\\\";v=\\\"143\\\", \\\"Chromium\\\";v=\\\"143\\\", \\\"Not A(Brand\\\";v=\\\"24\\\"\",\n    \"sec-ch-ua-mobile\": \"?0\",\n    \"sec-ch-ua-platform\": \"\\\"Windows\\\"\",\n    \"sec-fetch-dest\": \"empty\",\n    \"sec-fetch-mode\": \"cors\",\n    \"sec-fetch-site\": \"same-origin\",\n    \"user-agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0\",\n    \"x-requested-with\": \"XMLHttpRequest\"\n", "lastUpdateTime": "1792868919175", "respondTime": 180000, "ruleBookInfo": {"author": "//div[@class=\"info-chitiet\"]/span/a[@itemprop=\"author\"]/text()", "coverUrl": "//div[@class=\"book\"]/img/@src", "intro": "//div[@itemprop=\"description\"]/text()", "kind": "//div[@class=\"info-chitiet\"]/span/a[@itemprop=\"genre\"]/text()", "name": "//div[@class=\"col-xs-12 col-sm-8 col-md-8 desc\"]/h3/text()"}, "ruleContent": {"content": "@js:\nvar out = \"\";\nvar mUrl = result.match(/\"url\"\\s*:\\s*\"([^\"]+)\"/);\nvar mMobile = result.match(/\"mobile\"\\s*:\\s*\"?([^\",}\\s]+)\"?/);\nvar mIsk = result.match(/\"isk\"\\s*:\\s*\"?([^\",}\\s]+)\"?/);\nvar mNovel = result.match(/\"novel\"\\s*:\\s*\"?([^\",}\\s]+)\"?/);\nvar mChapter = result.match(/\"chapter\"\\s*:\\s*\"?([^\",}\\s]+)\"?/);\nvar mt = result.match(/\"t\"\\s*:\\s*\"?([^\",}\\s]+)\"?/);\nvar mn = result.match(/\"n\"\\s*:\\s*\"([^\"]+)\"/);\nvar mSign = result.match(/\"sign\"\\s*:\\s*\"([^\"]+)\"/);\n\nif (!mUrl || !mSign) {\n    out = \"未找到sign参数。页面开头:\" + result.substring(0, 500);\n} else {\n    var url = mUrl[1];\n    var mobile = mMobile ? mMobile[1] : \"1\";\n    var isk = mIsk ? mIsk[1] : \"1\";\n    var novel = mNovel ? mNovel[1] : \"\";\n    var chapter = mChapter ? mChapter[1] : \"\";\n    var t = mt ? mt[1] : \"\";\n    var n = mn ? mn[1] : \"\";\n    var sign = mSign[1];\n\n    var body = \"url=\" + encodeURIComponent(url)\n             + \"&mobile=\" + encodeURIComponent(mobile)\n             + \"&isk=\" + encodeURIComponent(isk)\n             + \"&novel=\" + encodeURIComponent(novel)\n             + \"&chapter=\" + encodeURIComponent(chapter)\n             + \"&t=\" + encodeURIComponent(t)\n             + \"&n=\" + encodeURIComponent(n)\n             + \"&sign=\" + encodeURIComponent(sign);\n\n    var resp = java.post(\"https://bcshuku.com/conapi.php\", body, {\n        \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36\",\n        \"Content-Type\": \"application/x-www-form-urlencoded; charset=UTF-8\",\n        \"X-Requested-With\": \"XMLHttpRequest\",\n        \"Origin\": \"https://bcshuku.com\",\n        \"Referer\": baseUrl\n    });\n\n    var text = (resp && resp.body) ? resp.body() : String(resp);\n    \n    if (text.indexOf('\"success\":\"1\"') > -1 || text.indexOf('\"success\":true') > -1) {\n        var json = JSON.parse(text);\n        out = json.content;\n    } else {\n        out = \"请求失败，返回内容:\" + text;\n    }\n}\nout;"}, "ruleExplore": {"author": "//div[@class='caption']/div[@class=\"chi-tiet chuyen-muc\"]//text()", "bookList": "//div[@class=\"one-row\"]/div[@class=\"col-md-3 col-sm-6 col-xs-6 home-truyendecu\"]", "bookUrl": "//div[@class='caption']/a/@href", "coverUrl": "//div[@class='each_truyen']/a/img/@src", "lastChapter": "//div[@class='caption']/div[@class=\"chi-tiet tt-status\"]//small[@class=\"btn-xs label-primary\"]/text()", "name": "//div[@class='caption']/a/@title"}, "ruleReview": [], "ruleSearch": {"bookList": "//div[@class=\"one-row\"]/div[@class=\"col-md-3 col-sm-6 col-xs-6 home-truyendecu\"]", "bookUrl": "//div[@class=\"each_truyen\"]/a/@href", "coverUrl": "//div[@class=\"each_truyen\"]/a/img/@src", "name": "//h3[@itemprop=\"name\"]/text()"}, "ruleToc": {"chapterList": "//div[@id='list-chapter']//ul[@class='list-chapter']//li/a", "chapterName": "//span[@class=\"chapter-text\"]/text()", "chapterUrl": "@js:\nvar doc = org.jsoup.Jsoup.parse(result);\nvar link = doc.select(\"a\").first();\n'https://bcshuku.com' + link.attr(\"href\");", "nextTocUrl": "//div[@id=\"pagination\"]//li[last()-1]/a/@href"}, "searchUrl": "@js:\nlet new_url = java.get('https://bcshuku.com/e/search/index.php?keyboard='+key+'&show=title,writer,byr&searchget=1',{\n    \"accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\",\n    \"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\",\n    \"cache-control\": \"no-cache\",\n    \"pragma\": \"no-cache\",\n    \"referer\": \"https://bcshuku.com\",\n    \"sec-ch-ua\": \"\\\"Microsoft Edge\\\";v=\\\"143\\\", \\\"Chromium\\\";v=\\\"143\\\", \\\"Not A(Brand\\\";v=\\\"24\\\"\",\n    \"sec-ch-ua-mobile\": \"?1\",\n    \"sec-ch-ua-platform\": \"\\\"Android\\\"\",\n    \"sec-fetch-dest\": \"document\",\n    \"sec-fetch-mode\": \"navigate\",\n    \"sec-fetch-site\": \"same-origin\",\n    \"sec-fetch-user\": \"?1\",\n    \"upgrade-insecure-requests\": \"1\",\n    \"user-agent\": \"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Mobile Safari/537.36 Edg/143.0.0.0\"\n});\nlet location = new_url.header(\"location\");\nlet searchid = location.match(/searchid=(\\d+)/)[1];\nlet url;\nif (page == 0) {\n    url = \"https://bcshuku.com/e/search/result/?searchid=\" + searchid;\n} else {\n    url = \"https://bcshuku.com/e/search/result/index.php?page=\" + (page - 1) + \"&searchid=\" + searchid;\n}\nurl;", "weight": 0},{"bookSourceComment": "紫霞聚合 聚合20平台（番茄小说/听书/短剧/漫剧+听友FM/夜社/量子短剧+迷度/云书斋/漫客栈/小米小说+随心看/九怀/七猫/书旗+搬山人+瓜子漫画+SF神凑+UAA有声[直连]+黄果短剧[直连]） v1.7.42。交流群1126698568 / 友链963153401", "bookSourceGroup": "聚合", "bookSourceName": "紫霞聚合", "bookSourceType": 0, "bookSourceUrl": "http://49.232.34.177:2052", "coverDecodeJs": "// [HG_COVER_V1732] 黄果封面 AES-128-CBC 加密（实测密文头 093de3b1 → 解密 ffd8ffe0 标准 JPEG）\njava.createSymmetricCrypto(\"AES/CBC/NoPadding\",\"f5d965df75336270\",\"97b60394abc2fbe1\").decrypt(result)", "customButton": false, "customOrder": -1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:zxExplore({java:java,source:source,cache:cache})", "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\", \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\", \"Accept-Language\": \"zh-CN,zh;q=0.9\"}", "jsLib": "var SRV_BASES = [\"http://49.232.34.177:2052\"];\nvar SRV_SRC_URL = \"http://49.232.34.177:2052/data/shuyuan/bookSource.json\";\nvar SRV_PLATFORMS = [{\"id\": \"fanqie\", \"name\": \"番茄小说\", \"kind\": \"\"}, {\"id\": \"fqts\", \"name\": \"番茄听书\", \"kind\": \"audio\"}, {\"id\": \"hgds\", \"name\": \"番茄短剧\", \"kind\": \"drama\", \"textMode\": true}, {\"id\": \"hgmd\", \"name\": \"番茄漫剧\", \"kind\": \"video\"}, {\"id\": \"midu\", \"name\": \"迷度看书\", \"kind\": \"\"}, {\"id\": \"yunshu\", \"name\": \"云书斋\", \"kind\": \"\"}, {\"id\": \"mkzhan\", \"name\": \"漫客栈\", \"kind\": \"comic\"}, {\"id\": \"tingyou\", \"name\": \"听友FM\", \"kind\": \"audio\"}, {\"id\": \"suixkan\", \"name\": \"随心看\", \"kind\": \"\"}, {\"id\": \"jiuhuai\", \"name\": \"九怀小说\", \"kind\": \"\"}, {\"id\": \"qimao\", \"name\": \"七猫小说\", \"kind\": \"\"}, {\"id\": \"shuqi\", \"name\": \"书旗小说\", \"kind\": \"\"}, {\"id\": \"banshanren\", \"name\": \"搬山人小说\", \"kind\": \"adult\"}, {\"id\": \"xyshe\", \"name\": \"夜社\", \"kind\": \"adult\"}, {\"id\": \"uaa\", \"name\": \"UAA有声\", \"kind\": \"adult\", \"bkind\": \"audio\", \"direct\": true}, {\"id\": \"xiaomi\", \"name\": \"小米小说\", \"kind\": \"\"}, {\"id\": \"guazi\", \"name\": \"瓜子漫画\", \"kind\": \"comic\"}, {\"id\": \"liangzi\", \"name\": \"量子短剧\", \"kind\": \"drama\"}, {\"id\": \"shencou\", \"name\": \"SF神凑\", \"kind\": \"\"}, {\"id\": \"hg\", \"name\": \"黄果短剧\", \"kind\": \"adult\", \"bkind\": \"video\", \"direct\": true}];\nvar SRV_PLATFORM = \"\";\nvar SRV_KIND = \"\";\nvar SRV_CRED_KEY = \"aggCred\";\n\nvar SRV_CTX = {};\nvar SRV_DIAG = { lastErr: \"\", setOk: 0, setFail: 0, activated: 0, lastVarLen: 0 };\n\n// [v1.7.2] 媒体中转：把上游音频/视频 URL 经服务器 /public/proxy 规整后转发\n// 部分 CDN 对 UA/Referer 有门槛，客户端直连会 ERROR_CODE_FAILED_RUNTIME_CHECK\nfunction srvProxyUrl(raw) {\n    var u = String(raw || \"\");\n    if (!u || u.indexOf(\"http\") !== 0) return u;\n    try { return srvBase() + \"/public/proxy?u=\" + encodeURIComponent(u); } catch (e) { return u; }\n}\nfunction srvBase() {\n    return SRV_BASES[0];\n}\nfunction srvBind(ctx) {\n    if (ctx) {\n        for (var k in ctx) {\n            if (ctx[k] !== undefined && ctx[k] !== null) SRV_CTX[k] = ctx[k];\n        }\n    }\n    return SRV_CTX;\n}\nfunction srvSrc() {\n    try { if (SRV_CTX.source) return SRV_CTX.source; } catch (e) { }\n    try {\n        var j = (SRV_CTX.java) || (typeof java !== \"undefined\" ? java : null);\n        if (j && j.getSource) { var s0 = j.getSource(); if (s0) return s0; }\n    } catch (e) { }\n    try { if (typeof source !== \"undefined\" && source) return source; } catch (e) { }\n    return null;\n}\nfunction srvJav() {\n    if (SRV_CTX.java) return SRV_CTX.java;\n    try { if (java) return java; } catch (e) { }\n    return null;\n}\nfunction srvCache() {\n    if (SRV_CTX.cache) return SRV_CTX.cache;\n    try { if (cache) return cache; } catch (e) { }\n    return null;\n}\nfunction srvCacheGet(k) {\n    var c = srvCache();\n    if (!c) return \"\";\n    try { var v = c.get(k); return (v === null || v === undefined) ? \"\" : String(v); } catch (e) { return \"\"; }\n}\nfunction srvCachePut(k, v) {\n    var c = srvCache();\n    if (!c) return false;\n    try { c.put(String(k), String(v), 31536000); return true; } catch (e) { return false; }\n}\nfunction srvLog(msg) {\n    SRV_DIAG.lastErr = String(msg).substring(0, 200);\n    var j = srvJav();\n    try { if (j && j.log) j.log(\"[服务器版书源] \" + msg); } catch (e) { }\n}\n\nfunction srvVarText() {\n\n    try {\n        var c = srvCache();\n        if (c && c.get) { var v = c.get(\"syState\"); if (v) return String(v); }\n    } catch (e0) { }\n\n    try {\n        var j = srvJav();\n        if (j && j.get) { var w = j.get(\"sy_ui\"); if (w) return String(w); }\n    } catch (e5) { }\n\n    var s1 = srvSrc();\n    if (!s1) { srvLog(\"取不到 source（ctx 没传到？）\"); return \"\"; }\n    try { return String(s1.getVariable() || \"\"); } catch (e) { srvLog(\"getVariable 抛错：\" + e); return \"\"; }\n}\nfunction srvVar() {\n    var o = {};\n    function merge(txt, onlyFill) {\n        if (!txt) return;\n        try {\n            var m = JSON.parse(String(txt)) || {};\n            for (var k in m) {\n                if (m[k] === undefined || m[k] === null) continue;\n\n                if (onlyFill && o[k] !== undefined) continue;\n                o[k] = m[k];\n            }\n        } catch (e) { }\n    }\n\n    try { var s1 = srvSrc(); if (s1) merge(s1.getVariable(), false); } catch (e1) { }\n\n    try { merge(srvCacheGet(\"syState\"), false); } catch (e2) { }\n\n    try { var j = srvJav(); if (j && j.get) merge(j.get(\"sy_ui\"), true); } catch (e3) { }\n    try { SRV_DIAG.lastVarLen = JSON.stringify(o).length; } catch (e4) { }\n    return o;\n}\nfunction srvSet(patch) {\n    var c = srvVar();\n    for (var k in patch) c[k] = patch[k];\n    var str = JSON.stringify(c);\n    try {\n        var cc = srvCache();\n        if (cc && cc.put) { cc.put(\"syState\", str, 31536000); SRV_DIAG.setOk++; return c; }\n    } catch (e1) { }\n\n    var s2 = srvSrc();\n    if (!s2) { SRV_DIAG.setFail++; srvLog(\"没有 source，源变量写不进去\"); return c; }\n    try { s2.setVariable(str); SRV_DIAG.setOk++; } catch (e2) { SRV_DIAG.setFail++; }\n    return c;\n}\nfunction srvCred() {\n    var g = srvCacheGet(SRV_CRED_KEY);\n    if (g) {\n        var o = null;\n        try { o = JSON.parse(g); } catch (e) { }\n        if (o && o.user) return { user: String(o.user), label: String(o.label || o.user), from: \"global\" };\n    }\n    var c = srvVar();\n    var user = String(c[\"账号\"] || \"\");\n    var label = String(c[\"昵称\"] || \"\");\n    if (!user) {\n\n        try {\n            var s0 = srvSrc();\n            var raw = s0 ? String(s0.getLoginInfo() || \"\") : \"\";\n            if (raw) {\n                var o2 = JSON.parse(raw) || {};\n                user = String(o2[\"账号\"] || \"\");\n                label = String(o2[\"昵称\"] || \"\");\n            }\n        } catch (e2) { }\n    }\n    return { user: user, label: label, from: \"local\" };\n}\nfunction srvCredSave(patch) {\n    srvSet(patch);\n    var all = srvVar();\n    try {\n        srvCachePut(SRV_CRED_KEY, JSON.stringify({\n            user: String(all[\"账号\"] || \"\"),\n            label: String(all[\"昵称\"] || \"\")\n        }));\n    } catch (e) { }\n}\n\nfunction srvPost(path, body) {\n    var j = srvJav();\n    if (!j) { srvLog(\"取不到 java（ctx 没传到？）\"); return \"\"; }\n    var payload = JSON.stringify(body);\n    try { return String(j.post(srvBase() + path, payload, { \"Content-Type\": \"application/json\" })); }\n    catch (e) { srvLog(\"java.post 抛错：\" + e); }\n    try {\n        return String(j.ajax(srvBase() + path + \",\" + JSON.stringify({\n            method: \"POST\", body: payload, headers: { \"Content-Type\": \"application/json\" }\n        })));\n    } catch (e2) { srvLog(\"java.ajax 也抛错：\" + e2); return \"\"; }\n}\n\nfunction srvLogin(user, pass) {\n\n    user = String(user || \"\").replace(/^\\s+|\\s+$/g, \"\");\n    pass = String(pass || \"\");\n    if (!user) return { err: \"请填账号（用户名或邮箱）\" };\n    if (!pass) return { err: \"请填密码\" };\n    var r = srvPost(\"/auth/login\", { username: user, password: pass });\n    var j = null;\n    try { j = JSON.parse(r); } catch (e) { }\n    if (!j) {\n        srvLog(\"登录响应不是 JSON：\" + String(r).substring(0, 120));\n        return { err: \"连不上服务器或响应异常，请检查网络后重试\" };\n    }\n    if (j.code !== 0) return { err: String(j.msg || \"登录失败\") };\n    var u = (j.data || {}).user || {};\n    var nick = String(u.nickname || u.username || user);\n    srvCredSave({ \"账号\": user, \"昵称\": nick });\n    return { user: user, label: nick };\n}\nfunction srvEnsure(force, ctx) {\n    srvBind(ctx);\n    var c = srvCred();\n    if (c.user) return { user: c.user, label: c.label };\n    return null;\n}\n\nfunction srvKey() {\n    var k = \"\";\n    try { var c = srvVar(); k = String((c && c[\"APIKey\"]) || \"\"); } catch (e) { k = \"\"; }\n    return String(k).replace(/^\\s+|\\s+$/g, \"\");\n}\n\nfunction srvKeyInCookie() {\n    var k = srvKey();\n    if (!k) return false;\n    try {\n        if (typeof cookie === \"undefined\" || !cookie || !cookie.getCookie) return false;\n        var ck = String(cookie.getCookie(srvBase()) || \"\");\n        var i = ck.indexOf(\"loomproxy_apikey=\");\n        if (i < 0) return false;\n        var v = ck.substring(i + \"loomproxy_apikey=\".length);\n        var j = v.indexOf(\";\");\n        if (j >= 0) v = v.substring(0, j);\n        return String(v).replace(/\\s+$/, \"\") === k;\n    } catch (e) { return false; }\n}\n\nfunction srvKeyQ() {\n    // v1.7.16：服务端只认 ?api_key= / X-API-Key 头，不读 apikey Cookie —— 恒追加。\n    var k = srvKey();\n    if (!k) return \"\";\n    return \"api_key=\" + encodeURIComponent(k);\n}\nfunction srvUrl(act, o) {\n\n    o = o || {};\n    var q = \"\";\n    if (o.key !== undefined) q += (q ? \"&\" : \"\") + \"key=\" + encodeURIComponent(o.key);\n    if (o.page !== undefined) q += (q ? \"&\" : \"\") + \"page=\" + o.page;\n    if (o.id !== undefined) q += (q ? \"&\" : \"\") + \"id=\" + encodeURIComponent(o.id);\n    if (o.url !== undefined) q += (q ? \"&\" : \"\") + \"url=\" + encodeURIComponent(o.url);\n    if (o.kind !== undefined) q += (q ? \"&\" : \"\") + \"kind=\" + encodeURIComponent(o.kind);\n    if (o.bid !== undefined) q += (q ? \"&\" : \"\") + \"bid=\" + encodeURIComponent(o.bid);\n    if (o.vars !== undefined) q += (q ? \"&\" : \"\") + \"vars=\" + encodeURIComponent(JSON.stringify(o.vars));\n    var kq = \"\";\n    try { kq = srvKeyQ(); } catch (eK) { kq = \"\"; }\n    if (kq) q += (q ? \"&\" : \"\") + kq;\n    if (act === \"all\") return srvBase() + \"/public/all/search\" + (q ? \"?\" + q : \"\");\n    var plat = String(o.platform || SRV_PLATFORM || \"\");\n    if (!plat) { srvLog(\"srvUrl 拿不到平台名\"); return \"\"; }\n    // platform 放 query（供 srvPlatOfUrl 提取）；q 里的 id/key 等参数必须保留\n    var pq = \"platform=\" + encodeURIComponent(plat);\n    var full = q ? (q + \"&\" + pq) : pq;\n    return srvBase() + \"/public/\" + encodeURIComponent(plat) + \"/\" + encodeURIComponent(act) + \"?\" + full;\n}\nfunction srvMode() {\n    var c = srvVar();\n    return String(c[\"aggMode\"] || \"\");\n}\nfunction srvModeTargets() {\n    if (SRV_PLATFORM) return [SRV_PLATFORM];\n    try {\n        var _st = String((function(){ var c = srvVar(); return c[\"aggPlatform\"] || \"\"; })() || \"\");\n        if (_st) {\n            var _ok = false;\n            for (var _i = 0; _i < SRV_PLATFORMS.length; _i++) { if (SRV_PLATFORMS[_i].id === _st) { _ok = true; break; } }\n            if (!_ok) { try { var _c2 = srvVar(); delete _c2[\"aggPlatform\"]; var _s = JSON.stringify(_c2); if (typeof cache !== \"undefined\" && cache && cache.put) cache.put(\"syState\", _s, 31536000); if (typeof java !== \"undefined\" && java && java.put) java.put(\"sy_ui\", _s); } catch (eV) { } return null; }\n        }\n    } catch (eS) { }\n    // 发现页/面板选中的平台优先：选了 A 平台就只搜 A（不串别的平台）\n    try {\n        var ap = String(srvVar()[\"aggPlatform\"] || \"\");\n        if (ap) { for (var pi = 0; pi < SRV_PLATFORMS.length; pi++) { if (SRV_PLATFORMS[pi].id === ap) return [ap]; } }\n    } catch (eP) { }\n    var m = srvMode();\n    var kind = srvReadKind();\n    var i, p;\n\n    if (kind === \"adult\") {\n        if (m) {\n            for (i = 0; i < SRV_PLATFORMS.length; i++) {\n                p = SRV_PLATFORMS[i];\n                if (p && String(p.id) === m &&\n                    (String(p.kind || \"\") === \"adult\" || String(p.bkind || \"\") === \"adult\")) {\n                    return [m];\n                }\n            }\n        }\n        for (i = 0; i < SRV_PLATFORMS.length; i++) {\n            p = SRV_PLATFORMS[i];\n            if (p && (String(p.kind || \"\") === \"adult\" || String(p.bkind || \"\") === \"adult\")) {\n                return [String(p.id)];\n            }\n        }\n        return null;\n    }\n    for (i = 0; i < SRV_PLATFORMS.length; i++) {\n        if (SRV_PLATFORMS[i].id === m) return [m];\n    }\n    return null;\n}\nfunction srvExploreVars() {\n    var c = srvVar();\n    var out = {};\n\n    var PRE = [\"tadu\", \"midu\", \"taoxs\", \"dejian\", \"huaben\", \"jhx\", \"qimao\", \"shuqi\", \"yueyou\",\n               \"alice\", \"tts\", \"hg\", \"qm\", \"symai\", \"acfun\", \"uxx\",\n               \"fengdu\", \"cread\", \"mianfei\", \"xigua\", \"zg\", \"vivo\"];\n    for (var k in c) {\n        var hit = (k === \"gender\");\n        if (!hit) {\n            for (var i = 0; i < PRE.length; i++) {\n                if (k.indexOf(PRE[i]) === 0) { hit = true; break; }\n            }\n        }\n        if (hit) out[k] = c[k];\n    }\n    if (!out.gender) out.gender = \"1\";\n    return out;\n}\nfunction srvNeed(j) {\n    // v1.7.17 改为服务端裁决：客户端不再用 JS 层 cookie 探测主动拦截。\n    // （exploreUrl/searchUrl 的 @js: 上下文里 cookie 全局可能缺失/取空，而 Legado HTTP 层\n    // 会自动附带源 Cookie —— JS 层判 \"无 token\" 是假阴性，会把已登录用户拦在本地。）\n    // 现语义：传入响应信封 j，若是 401/凭证类错误 → true，调用方渲染登录引导卡。\n    try {\n        if (j && j.ok === false) {\n            var why = String(j.err || j.msg || \"\");\n            if (/未登录|登录已过期|凭证/.test(why)) return true;\n        }\n    } catch (e) { }\n    return false;\n}\n\nfunction srvNorm(j) {\n    if (!j || typeof j !== \"object\") return j;\n    // 信封平铺：本平台返回 {ok, data:{list/info/toc/content}}，展开 data 到顶层，\n    // 让 srvMapList(读j.list) / srvInfo(读j.info) / srvToc(读j.toc) / srvContent(读j.content) 直接可用\n    if (j.data && typeof j.data === \"object\" && !(j.data instanceof Array)) {\n        for (var _k in j.data) {\n            if (j.data.hasOwnProperty(_k) && j[_k] === undefined) { j[_k] = j.data[_k]; }\n        }\n    }\n    if (j.ok === undefined) {\n        j.ok = !((j.err) || (j.code !== undefined && j.code !== 0));\n    }\n    if (!j.ok && !j.err) {\n        var why = String(j.msg || \"没有响应\");\n        if (/鉴权|凭证|未登录|登录已过期/.test(why)) {\n            why = \"未登录或登录已过期，请到书源「设置」重新登录\";\n        }\n        j.err = why;\n    }\n    return j;\n}\n\nfunction srvJson(url) {\n    if (!url) return { err: \"内部错误：请求地址为空\" };\n    var j = srvJav();\n    var t = \"\";\n    try {\n        t = String(j.ajax(url));\n    } catch (e) {\n        var es = String(e);\n        if (/401|鉴权|凭证|Unauthorized/i.test(es)) return { err: \"未登录或登录已过期：请到书源「设置」重新登录\" };\n        return { err: \"连不上服务器：\" + es };\n    }\n    var o = null;\n    try { o = JSON.parse(t); } catch (e) { return { err: \"服务器返回异常：\" + String(t).substring(0, 80) }; }\n    if (!o) return { err: \"服务器没有返回内容\" };\n    o = srvNorm(o);\n    try { srvSyncLabel(o); } catch (e) { }\n    return o;\n}\nfunction srvSyncLabel(o) {\n    try {\n        var lab = String((o && o.label) || \"\");\n        if (!lab) return;\n        if (lab !== srvCred().label) {\n            srvSet({ \"编号\": lab });\n            SRV_DIAG.labelSynced = (SRV_DIAG.labelSynced || 0) + 1;\n        }\n    } catch (e) { }\n}\n\nfunction srvReadKind() {\n\n    var k = \"\";\n    try { k = String(srvVar()[\"aggKind\"] || \"\"); } catch (e) { return \"\"; }\n    if (k === \"audio\" || k === \"drama\" || k === \"comic\" || k === \"adult\") return k;\n    return \"\";\n}\nfunction srvSearch(key, page, ctx) {\n    try {\n        srvBind(ctx);\n                var t = srvModeTargets();\n        if (t) {\n            // [UAA] 本地直连：该站对数据中心 IP 全阻断，只有设备开代理才通（见文件末 UAA 库）\n            if (String(t[0]) === \"uaa\") {\n                return uaaUrl(\"/api/audio/app/audio/search?category=&keyword=\" + encodeURIComponent(key) +\n                              \"&orderType=0&page=\" + encodeURIComponent(page) + \"&searchType=1&size=42\");\n            }\n            // [黄果] 本地直连（不经服务端；域名池容灾见文件末 HG 库）\n            if (String(t[0]) === \"hg\") {\n                var _hp = (String(page) === \"1\" || !page)\n                    ? \"/search/?keyword=\" + encodeURIComponent(key)\n                    : \"/search/?keyword=\" + encodeURIComponent(key) + \"&page=\" + encodeURIComponent(page);\n                return hgUrl(_hp);\n            }\n            return srvUrl(\"search\", { platform: t[0], key: key, page: page, vars: srvExploreVars() });\n        }\n        return srvUrl(\"all\", { key: key, page: page, kind: srvReadKind(), vars: srvExploreVars() });\n    } catch (e) {\n        srvLog(\"拼搜索地址失败：\" + e);\n        return \"\";\n    }\n}\nfunction srvMapList(j, ctx) {\n    var out = [];\n    // [UAA] 本地直连结果已归一化为数组，直接返回\n    if (Object.prototype.toString.call(j) === \"[object Array]\") return j;\n    if (!j || !j.ok) {\n        return [{ name: \"【紫霞】\" + ((j && j.err) || \"没有响应\"), author: \"\", kind: \"\", wordCount: \"\",\n                  lastChapter: \"\", intro: \"\", coverUrl: \"\", bookUrl: \"\" }];\n    }\n    // 兼容两种信封：ge枚 {ok,list} 或本平台 {ok,data:{list}}\n    var d = (j.data && j.data.list) ? j.data : j;\n    var arr = d.list || (j.data && j.data.list) || [];\n    for (var i = 0; i < arr.length; i++) {\n        var b = arr[i] || {};\n\n        var srcName = String(b.srcName || b.src || b.source || \"\");\n        var kd = String(b.kind || \"\");\n        if (!kd && srcName) kd = \"📕\" + srcName;\n        out.push({\n            name: b.name,\n            author: b.author,\n            kind: kd,\n            wordCount: b.wordCount,\n            lastChapter: srcName ? (\"📕\" + srcName) : kd,\n            intro: b.intro,\n            coverUrl: b.coverUrl,\n            // [HG_URL_V1734] hg/uaa 的 bookUrl 已是真实绝对 URL，直接透传（否则会退回服务端路由）；\n            // 其余平台仍走网关 detail 路由\n            bookUrl: (function(_bu) {\n                _bu = String(_bu == null ? \"\" : _bu);\n                if (_bu.indexOf(\"http\") === 0) return _bu;\n                return srvUrl(\"detail\", { platform: (b.platform || b.srcId || \"fanqie\"), id: (b.bookId || b.u) });\n            })(b.bookUrl)\n        });\n    }\n    return out;\n}\nfunction srvSearchList(result, ctx) {\n    srvBind(ctx);\n    var j = null;\n    try { j = JSON.parse(String(result)); } catch (e) { }\n    // [UAA] 本地直连：搜索/发现结果自己转成数组（服务端不参与）\n    try {\n        var _plat = \"\";\n        try { var _v = srvVar(); _plat = String(_v.aggPlatform || \"\"); } catch (eP0) { _plat = \"\"; }\n        if (!_plat) { var _tt = srvModeTargets(); if (_tt) _plat = String(_tt[0]); }\n        if (_plat === \"uaa\") {\n            var _arr = uaaSearchMap(j);\n            return srvMapList(_arr, ctx);\n        }\n        // [HG_PARSE_V1734] 黄果判定改为**内容特征**，不再依赖设备状态 aggPlatform：\n        // 旧写法在状态不是 hg 时会把 HTML 当 JSON 解析 → 整页「【紫霞】没有响应」。\n        // 判据：显式 hg 平台 或 JSON 解析失败（黄果是唯一返回 HTML 的源）或响应里出现黄果特征类名。\n        var _rawTxt = String(result == null ? \"\" : result);\n        var _isHg = (_plat === \"hg\")\n            || (j === null && _rawTxt.indexOf(\"<\") >= 0)\n            || _rawTxt.indexOf(\"hg-drama-card\") >= 0\n            || _rawTxt.indexOf(\"hg-list-page\") >= 0\n            || _rawTxt.indexOf(\"hg-web-play\") >= 0;\n        if (_isHg) {\n            var _hj2 = null;\n            try { _hj2 = JSON.parse(_rawTxt); } catch (eH1) { _hj2 = null; }\n            var _html = (_hj2 && (_hj2.html || _hj2.__raw)) ? String(_hj2.html || _hj2.__raw) : _rawTxt;\n            return srvMapList(hgList(_html), ctx);\n        }\n    } catch (eU0) { }\n    return srvMapList(srvNorm(j), ctx);\n}\nfunction srvExploreList(result, ctx) { return srvSearchList(result, ctx); }\n\nfunction srvCookieLen() {\n    try {\n        if (typeof cookie === \"undefined\" || !cookie || !cookie.getCookie) return \"无接口\";\n        var ck = \"\";\n        try { ck = String(cookie.getCookie(srvBase()) || \"\"); } catch (e) { return \"读失败\"; }\n        if (!ck) return \"空\";\n        return (ck.indexOf(\"loomproxy_token\") >= 0 ? \"有token \" : \"无token \") + ck.length + \"B\";\n    } catch (e2) { return \"异常\"; }\n}\n\nfunction srvHotSearch(key, page, ctx) {\n    try {\n        srvBind(ctx);\n\n        return srvUrl(\"all\", { key: key, page: page, kind: \"\", vars: srvExploreVars() });\n    } catch (e) {\n        srvLog(\"拼热搜搜索地址失败：\" + e);\n        return \"\";\n    }\n}\n\nfunction srvKinds(ctx) {    try {\n        srvBind(ctx);\n        var bad = srvNeed(ctx);\n        if (bad) return JSON.stringify([{ title: \"❌ \" + bad\n                + \"  ｜Cookie \" + srvCookieLen()\n                + \"  打开本书源「设置」填账号密码点「登录」\", type: \"text\",\n            style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } }]);\n\n        if (String(srvVar()[\"aggHot\"] || \"\") === \"1\") {\n            var hsel = \"keyword\";\n            try { hsel = String(srvVar()[\"aggHotDim\"] || \"keyword\"); } catch (eHA) { hsel = \"keyword\"; }\n            var hj = srvJson(srvBase() + \"/rank/boards?days=1\");\n            if (!hj || !hj.ok) {\n                return JSON.stringify([{ title: \"🔥 今日热搜取不到：\" + ((hj && hj.err) || \"服务器没有响应\"),\n                    url: null, style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } }]);\n            }\n            var hbs = (hj.data && hj.data.boards) || [];\n            var hchars = [], hmap = {}, hcur = null;\n            for (var hb = 0; hb < hbs.length; hb++) {\n\n                var hlab = String(hbs[hb].tab || hbs[hb].dim || \"\");\n                hchars.push(hlab);\n                hmap[hlab] = String(hbs[hb].dim || \"\");\n                if (String(hbs[hb].dim || \"\") === hsel) hcur = hbs[hb];\n            }\n            if (!hcur && hbs.length) { hcur = hbs[0]; hsel = String(hbs[0].dim || \"keyword\"); }\n            var hout = [];\n            hout.push({ title: \"🔥 今日热搜 · 只看今天\", url: null,\n                        style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } });\n            if (hchars.length > 1) {\n                hout.push({\n                    title: \"榜单\", type: \"select\", chars: hchars,\n                    default: String((hcur && (hcur.tab || hcur.dim)) || \"\"),\n\n                    action: \"(function(){var m=\" + JSON.stringify(hmap) + \";\" +\n                        \"var v=String(m[String(infoMap['榜单']||'')]||'\" + hsel + \"');\" +\n                        \"var u={};try{if(typeof cache!=='undefined'&&cache&&cache.get){u=JSON.parse(String(cache.get('syState')||'')||'{}')||{};}}catch(e1){u={};}\" +\n                        \"u.aggHotDim=v;u.aggHot='1';var s=JSON.stringify(u);\" +\n                        \"try{if(typeof cache!=='undefined'&&cache&&cache.put)cache.put('syState',s,31536000);}catch(e2){}\" +\n                        \"try{if(typeof java!=='undefined'&&java&&java.put)java.put('sy_ui',s);}catch(e3){}\" +\n                        \"try{java.refreshExplore();}catch(e4){}\" +\n                        \"try{source.refreshExplore();}catch(e5){}})()\",\n                    style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n                });\n            }\n            var hrows = (hcur && hcur.rows) || [];\n            var hcnt = 0;\n            for (var hr = 0; hr < hrows.length && hr < 20; hr++) {\n                var hn = String(hrows[hr].name || \"\");\n                if (!hn) continue;\n\n                var hu = \"\";\n                try { hu = String(srvHotSearch(hn, \"{{page}}\", ctx)); } catch (eHU) { hu = \"\"; }\n                if (hu.indexOf(\"http\") !== 0) hu = \"\";\n\n                hout.push({ title: hn,\n                            url: hu || null,\n                            style: { layout_flexGrow: 0.45, layout_flexBasisPercent: 0.45 } });\n                hcnt++;\n            }\n            if (!hcnt) hout.push({ title: \"今天这个榜还没有数据\", url: null,\n                style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } });\n\n            hout.push({\n                title: \"← 返回分类\", type: \"button\",\n                action: \"(function(){var u={};try{if(typeof cache!=='undefined'&&cache&&cache.get){u=JSON.parse(String(cache.get('syState')||'')||'{}')||{};}}catch(e1){u={};}\" +\n                    \"u.aggHot='';var s=JSON.stringify(u);\" +\n                    \"try{if(typeof cache!=='undefined'&&cache&&cache.put)cache.put('syState',s,31536000);}catch(e2){}\" +\n                    \"try{if(typeof java!=='undefined'&&java&&java.put)java.put('sy_ui',s);}catch(e3){}\" +\n                    \"try{java.refreshExplore();}catch(e4){}\" +\n                    \"try{source.refreshExplore();}catch(e5){}})()\",\n                style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n            });\n            return JSON.stringify(hout);\n        }\n\n        function srvWrapKindUrls(plat, kinds) {\n            for (var i = 0; i < kinds.length; i++) {\n                var kd = kinds[i];\n                if (!kd || !kd.url) continue;\n                var s = String(kd.url);\n                if (s.indexOf(srvBase()) === 0) continue;\n                // 分类 URL 必须含 {{page}}，否则 Legado 不翻页 → 分类永远只出第 1 页（少书根因）\n                if (s.indexOf(\"{{page}}\") < 0) {\n                    s += (s.indexOf(\"?\") >= 0 ? \"&\" : \"?\") + \"page={{page}}\";\n                }\n\n                var holders = [];\n                var masked = s.replace(/\\{\\{[^{}]*\\}\\}/g, function (m) {\n                    holders.push(m);\n                    return \"\\u0001\" + (holders.length - 1) + \"\\u0001\";\n                });\n                var enc = encodeURIComponent(masked).replace(/%01(\\d+)%01/g, function (_, idx) {\n                    return holders[Number(idx)];\n                });\n                // 用传入的 plat（不用从 url 提取，url 以 /public/ 开头会误得 public）\n                kd.url = srvBase() + \"/public/\" + encodeURIComponent(plat) + \"/list?url=\" + enc;\n            }\n            return kinds;\n        }\n\n        var kind = srvReadKind();\n        var list = [];\n        for (var n0 = 0; n0 < SRV_PLATFORMS.length; n0++) {\n            if (kind && String(SRV_PLATFORMS[n0].kind || \"\") !== kind) continue;\n            list.push(SRV_PLATFORMS[n0]);\n        }\n        if (!list.length) list = SRV_PLATFORMS.slice();\n\n        function srvNoExplore(j) {\n            if (!j) return false;\n            if (j.noExplore) return true;\n            return !!(j.err && String(j.err).indexOf(\"没有发现结构\") >= 0);\n        }\n        function srvPlatRow(pid) {\n            var pn = srvPlatName(pid);\n            if (!pn) return null;\n            return { title: \"📕 \" + pn, url: null,\n                     style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } };\n        }\n\n        var targets = srvModeTargets();\n\n        if (targets) {\n            var j1 = srvJson(srvUrl(\"explore\", { platform: targets[0], vars: srvExploreVars() }));\n            var noExp1 = srvNoExplore(j1);\n            if (j1 && j1.err && !noExp1) return JSON.stringify([{ title: \"【服务器】\" + j1.err, url: null }]);\n            var k1 = srvWrapKindUrls(targets[0], (j1 && j1.kinds) || []);\n            var row1 = srvPlatRow(targets[0]);\n            if (row1) return JSON.stringify([row1].concat(k1));\n            return JSON.stringify(k1);\n        }\n\n        var cfg = srvVar();\n        var plat = String(cfg[\"aggPlatform\"] || \"\");\n        var ok = false;\n        for (var k = 0; k < list.length; k++) if (list[k].id === plat) ok = true;\n        if (!ok) plat = list[0].id;\n        var j2 = srvJson(srvUrl(\"explore\", { platform: plat, vars: srvExploreVars() }));\n        var noExp2 = srvNoExplore(j2);\n        if (j2 && j2.err && !noExp2) return JSON.stringify([{ title: \"【服务器】\" + j2.err, url: null }]);\n\n        var out = [];\n        var names = [], byName = {}, curName = \"\";\n        for (var n = 0; n < list.length; n++) {\n            names.push(list[n].name);\n            byName[list[n].name] = list[n].id;\n            if (list[n].id === plat) curName = list[n].name;\n        }\n        out.push({\n            title: \"平台\", type: \"select\", chars: names, default: curName,\n\n            action: \"(function(){var m=\" + JSON.stringify(byName) + \";\" +\n                \"var v=String(m[String(infoMap['平台']||'')]||'\" + plat + \"');\" +\n                \"var u={};try{if(typeof cache!=='undefined'&&cache&&cache.get){u=JSON.parse(String(cache.get('syState')||'')||'{}')||{};}}catch(e1){u={};}\" +\n                \"u.aggPlatform=v;var s=JSON.stringify(u);\" +\n                \"try{if(typeof cache!=='undefined'&&cache&&cache.put)cache.put('syState',s,31536000);}catch(e2){}\" +\n                \"try{if(typeof java!=='undefined'&&java&&java.put)java.put('sy_ui',s);}catch(e3){}\" +\n                \"try{java.refreshExplore();}catch(e4){}\" +\n                \"try{source.refreshExplore();}catch(e5){}})()\",\n            style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n        });\n        var kinds = srvWrapKindUrls(plat, (j2 && j2.kinds) || []);\n        if (!kinds.length) {\n            var row2 = srvPlatRow(plat);\n            if (row2) out.push(row2);\n        }\n        for (var q = 0; q < kinds.length; q++) out.push(kinds[q]);\n        return JSON.stringify(out);\n    } catch (e) {\n        return JSON.stringify([{ title: \"【服务器版】发现页出错：\" + e, url: null }]);\n    }\n}\n\nfunction srvInfo(result, bookUrl) {\n\n    var j = null;\n    try { j = srvNorm(JSON.parse(String(result))); } catch (e) { }\n    if (!j || !j.ok || !j.info) {\n        return JSON.stringify({ name: \"\", author: \"\", kind: \"\", wordCount: \"\", lastChapter: \"\",\n                                intro: \"【服务器】\" + ((j && j.err) || \"没有取到详情\"), coverUrl: \"\", tocUrl: \"\" });\n    }\n    var i = j.info;\n\n    var srcName = String(j.srcName || j.name || \"\");\n    var tag = srcName ? (\"📕\" + srcName) : \"\";\n    var tt = String(i.toneText || \"\");\n    var tail = tt ? (\"\\n音色ID：\" + tt + \"\\n详情页右上角「书籍变量」填对应ID数字即可切换（如 105）\") : \"\";\n\n    var tocUrl = String(i.tocUrl || \"\");\n    if (tocUrl && tocUrl.indexOf(srvBase()) !== 0) tocUrl = \"\";\n    if (!tocUrl && bookUrl) {\n        tocUrl = String(bookUrl).replace(/\\/detail(\\?|$)/, \"/chapter$1\");\n    }\n\n    return JSON.stringify({\n        name: i.name, author: i.author,\n        kind: (function () {\n            var ps = [];\n            if (srcName) ps.push(\"📕\" + srcName);\n            if (i.kind) ps.push(String(i.kind));\n            return ps.join(\",\");\n        })(),\n        wordCount: i.wordCount,\n        lastChapter: (String(i.lastChapter || \"\") + (tag ? (\" \" + tag) : \"\")).replace(/^\\s+|\\s+$/g, \"\"),\n        intro: String(i.intro || \"\") + tail,\n        coverUrl: i.coverUrl, tocUrl: tocUrl\n    });\n}\nfunction srvToneOf(v) {\n    var s = String(v === undefined || v === null ? \"\" : v).trim();\n    if (!s) return \"\";\n    var SKIP = /^(编号|通行证|签名|token|seq|模式|平台|srvSeq|srvPass|srvSign|srvToken|label|pass|sign)$/i;\n    var tv = null;\n    try {\n        var o = JSON.parse(s);\n        if (o && typeof o === \"object\") {\n            var ks = [], k, i;\n            for (k in o) { if (o.hasOwnProperty(k)) ks.push(k); }\n            for (i = 0; i < ks.length; i++) {\n                if (SKIP.test(ks[i])) continue;\n                if (/音色|tone/i.test(ks[i]) && /^\\d+$/.test(String(o[ks[i]]))) { tv = String(o[ks[i]]); break; }\n            }\n            if (!tv) for (i = 0; i < ks.length; i++) {\n                if (SKIP.test(ks[i])) continue;\n                if (/^\\d+$/.test(String(o[ks[i]]))) { tv = String(o[ks[i]]); break; }\n            }\n            if (!tv) for (i = 0; i < ks.length; i++) {\n                if (/^\\d+$/.test(ks[i])) { tv = ks[i]; break; }\n            }\n        }\n    } catch (e) { }\n    if (!tv) {\n        var m = s.match(/(?:音色|tone)[:：]\\s*(\\d+)/);\n        if (!m) m = s.match(/^\\s*(\\d+)\\s*$/);\n        if (m) tv = m[1];\n    }\n    return tv || \"\";\n}\n\nfunction srvPlatOf(pid) {\n    var p = String(pid || \"\");\n    if (!p) return null;\n    for (var i = 0; i < SRV_PLATFORMS.length; i++) {\n        if (SRV_PLATFORMS[i].id === p) return SRV_PLATFORMS[i];\n    }\n    return null;\n}\nfunction srvPlatName(pid) {\n    var p = srvPlatOf(pid);\n    return p ? String(p.name || \"\") : \"\";\n}\nfunction srvKindOfPlat(pid) {\n    var p = srvPlatOf(pid);\n    return p ? String(p.kind || \"\") : \"\";\n}\nfunction srvBKindOfPlat(pid) {\n    var p = srvPlatOf(pid);\n    if (!p) return \"\";\n    return String(p.bkind || p.kind || \"\");\n}\n\nfunction srvPlatOfUrl(u) {\n    var s = String(u || \"\");\n    var m = /[?&]platform=([^&#]+)/.exec(s);\n    if (m) { try { return decodeURIComponent(m[1]); } catch (e) { return m[1]; } }\n    var m2 = /^https?:\\/\\/[^\\/]+\\/([^\\/?#]+)\\//.exec(s);\n    if (m2) { try { return decodeURIComponent(m2[1]); } catch (e2) { return m2[1]; } }\n    return \"\";\n}\n\nfunction srvBookKind(result, bookUrl, cached) {\n    var k = null;\n    var plat = srvPlatOfUrl(bookUrl);\n    try {\n        if (plat) {\n            var p = srvPlatOf(plat);\n            if (p) {\n                var bk = String(p.bkind || \"\");\n                if (bk) k = bk;\n                else if (String(p.kind || \"\") !== \"adult\") k = String(p.kind || \"\");\n            }\n        }\n    } catch (e0) { k = null; }\n    if (k === null) {\n        try {\n            var o = JSON.parse(String(result));\n            var cand = \"\";\n            if (o && typeof o.kind === \"string\" && o.kind) cand = o.kind;\n            else if (o && o.info && typeof o.info.kind === \"string\" && o.info.kind) cand = o.info.kind;\n\n            cand = String(cand).replace(/^\\s+|\\s+$/g, \"\");\n            if (/^(text|audio|drama|comic|video)$/.test(cand)) k = cand;\n        } catch (e1) { }\n    }\n    if (k === null && plat) {\n\n        var p2 = srvPlatOf(plat);\n        if (p2) {\n            var pk = String(p2.kind || \"\");\n            if (pk && pk !== \"adult\") k = pk;\n        }\n    }\n    if (k === null) {\n        var c = (cached === undefined || cached === null) ? \"\" : String(cached);\n        if (c === \"audio\" || c === \"drama\" || c === \"comic\" || c === \"adult\" ||\n            c === \"text\" || c === \"video\") k = c;\n    }\n    if (k === \"\") k = \"text\";\n    return k;\n}\nfunction srvTypeOfKind(k, textMode) {\n    if (k === \"audio\") return 32;\n    if (k === \"comic\") return 64;\n    if (k === \"drama\") return textMode ? 8 : 4;\n    return 8;\n}\nfunction srvTextModeOf(bookUrl) {\n    try {\n        var pid = srvPlatOfUrl(bookUrl);\n        if (!pid) return false;\n        for (var i = 0; i < SRV_PLATFORMS.length; i++) {\n            if (SRV_PLATFORMS[i].id === pid) return SRV_PLATFORMS[i].textMode === true;\n        }\n    } catch (e) { }\n    return false;\n}\nfunction srvToc(result, bookUrl) {\n    var j = null;\n    try { j = srvNorm(JSON.parse(String(result))); } catch (e) { }\n    if (!j || !j.ok || !j.toc || !j.toc.length) {\n        return [{ chapterName: \"⚠️ \" + ((j && j.err) || \"目录为空\"), chapterUrl: \"\", isVolume: true, updateTime: \"\" }];\n    }\n\n    var plat = \"\";\n    try {\n        // 优先从 query 的 platform= 取（我们 URL 带 platform=fanqie）\n        var mp = /[?&]platform=([^&#]+)/.exec(String(bookUrl || \"\"));\n        if (mp) { try { plat = decodeURIComponent(mp[1]); } catch (e3) { plat = mp[1]; } }\n    } catch (ep) { plat = \"\"; }\n    if (!plat) {\n        try {\n            var mm = /^https?:\\/\\/[^\\/]+\\/([^\\/?#]+)\\//.exec(String(bookUrl || \"\"));\n            if (mm) { try { plat = decodeURIComponent(mm[1]); } catch (e2) { plat = mm[1]; } }\n        } catch (e1) { plat = \"\"; }\n    }\n    if (!plat) plat = String(SRV_PLATFORM || \"\");\n    if (!plat && SRV_PLATFORMS && SRV_PLATFORMS.length) plat = String(SRV_PLATFORMS[0].id || \"\");\n\n    var bidRaw = \"\";\n    try {\n        var mb = /[?&]id=([^&#]+)/.exec(String(bookUrl || \"\"));\n        if (mb) bidRaw = mb[1];\n    } catch (eb) { bidRaw = \"\"; }\n    var out = [];\n    for (var i = 0; i < j.toc.length; i++) {\n        var c = j.toc[i] || {};\n        var cu = String(c.u || \"\");\n\n        if (cu && plat && cu.indexOf(srvBase()) !== 0) {\n\n            if (plat === \"alice\") {\n                out.push({ chapterName: c.n, chapterUrl: cu, isVolume: c.v === true,\n                           updateTime: c.t || \"\", isVip: c.i || \"\" });\n                continue;\n            }\n            var w = srvUrl(\"content\", { platform: plat, id: cu });\n            if (w && bidRaw) w += \"&bid=\" + bidRaw;\n            if (w) cu = w;\n        }\n        out.push({ chapterName: c.n, chapterUrl: cu, isVolume: c.v === true,\n                   updateTime: c.t || \"\", isVip: c.i || \"\" });\n    }\n    return out;\n}\nfunction fqJav() {\n    try { if (typeof java !== \"undefined\" && java) return java; } catch (e) { }\n    try { return srvJav(); } catch (e) { }\n    return null;\n}\nfunction fqEpBase() {\n    var b = \"\";\n    try { if (typeof window !== \"undefined\" && window.__EPB__) b = String(window.__EPB__); } catch (e1) { }\n    if (!b) {\n        var jv = fqJav();\n        if (jv) { try { b = String(jv.get(\"sy_epb\") || \"\"); } catch (e2) { b = \"\"; } }\n    }\n    return b;\n}\nfunction fqVideoStreamJson(itemId, site, tab, bookId) {\n    try {\n        var t = String(tab || \"10\");\n        var id = t + \":\" + String(itemId);\n        var b = fqEpBase();\n        if (b) {\n            var r = srvJson(b + \"&id=\" + encodeURIComponent(id));\n            if (r && r.url) return JSON.stringify({ url: r.url, keyHex: r.keyHex || \"\", size: r.size || 0 });\n            return JSON.stringify({ err: (r && (r.msg || r.err)) || \"没有取到视频流\" });\n        }\n\n        var r2 = srvJson(srvUrl(\"stream\", { platform: (site || \"hgds\"), id: id,\n                                            bid: bookId ? (t + \":\" + String(bookId)) : \"\" }));\n        if (r2 && r2.url) return JSON.stringify({ url: r2.url, keyHex: r2.keyHex || \"\", size: r2.size || 0 });\n        return JSON.stringify({ err: (r2 && (r2.msg || r2.err)) || \"没有取到视频流\" });\n    } catch (e) { return JSON.stringify({ err: \"取流失败：\" + e }); }\n}\nfunction srvVideoBridge(html, epb) {\n    try {\n        var h = String(html || \"\");\n        if (h.indexOf(\"fqVideoStreamJson\") < 0) return h;\n\n        var base = String(epb || \"\");\n        var js = \"<scr\" + \"ipt>(function(){var B=\" + JSON.stringify(base) + \";\"\n            + \"if(!B){try{B=String(window.__EPB__||'');}catch(e){} }B=B?(B+'&'):'';\"\n            + \"function args(code){var m=/fqVideoStreamJson\\\\(([^)]*)\\\\)/.exec(String(code||''));return m?m[1]:'';}\"\n            + \"function unq(s){s=String(s).replace(/^\\\\s+|\\\\s+$/g,'');if(s.length>1&&(s.charAt(0)==='\\\"'||s.charAt(0)===\\\"'\\\")){s=s.substring(1,s.length-1);}return s;}\"\n            + \"window.run=function(code){return new Promise(function(res,rej){\"\n            + \"var raw=args(code);if(!raw){rej('无法解析集号');return;}\"\n            + \"var p=raw.split(',');for(var i=0;i<p.length;i++){p[i]=unq(p[i]);}\"\n            + \"var tab=p[2]||'10';var id=tab+':'+p[0];var bid=p[3]?(tab+':'+p[3]):'';\"\n            + \"if(!B){rej('没有取流入口（书源太旧，请更新书源）');return;}\"\n            + \"var u=B+'id='+encodeURIComponent(id)+(bid?('&bid='+encodeURIComponent(bid)):'');\"\n            + \"var x=new XMLHttpRequest();x.open('GET',u,true);\"\n            + \"x.onload=function(){try{var j=JSON.parse(x.responseText);\"\n            + \"if(j&&j.url){res(JSON.stringify({url:j.url,keyHex:j.keyHex||'',size:j.size||0,kind:'video'}));}\"\n            + \"else{rej((j&&(j.msg||j.err))||'取流失败');}}catch(e){rej(String(e));}};\"\n            + \"x.onerror=function(){rej('连不上服务器');};x.send();});};})();</scr\" + \"ipt>\";\n        return String(html || \"\") + js;\n    } catch (e) { return String(html || \"\"); }\n}\nfunction srvAlicePick(html) {\n    var h = String(html || \"\");\n    var cands = [];\n    var res = [/<div[^>]*class=\"[^\"]*read-content[^\"]*\"[^>]*>([\\s\\S]*)/i,\n               /<div[^>]*class=\"[^\"]*page-read[^\"]*\"[^>]*>([\\s\\S]*)/i];\n    for (var i = 0; i < res.length; i++) {\n        var m = h.match(res[i]);\n        if (!m) continue;\n        var seg = m[1];\n        var cut = seg.length;\n        var stops = [/<div[\\s>]/i, /<footer/i, /<\\/body/i, /<!--\\s*end/i, /<script/i];\n        for (var k = 0; k < stops.length; k++) {\n            var mm = seg.search(stops[k]);\n            if (mm > 200 && mm < cut) cut = mm;\n        }\n        var ps = seg.match(/<p[^>]*>[\\s\\S]*?<\\/p>/gi);\n        var part = (ps && ps.length >= 3) ? ps.join(\"\\n\") : seg.slice(0, cut);\n        var t = part\n            .replace(/<br\\s*\\/?>/gi, \"\\n\").replace(/<\\/p>/gi, \"\\n\")\n            .replace(/<[^>]*>/g, \"\").replace(/&nbsp;/g, \" \").replace(/&amp;/g, \"&\")\n            .replace(/&lt;/g, \"<\").replace(/&gt;/g, \">\").replace(/&quot;/g, '\"');\n        var lines = t.split(\"\\n\").map(function (x) { return x.replace(/[ \\t\\u3000]+/g, \" \").trim(); }).filter(Boolean);\n        cands.push(lines.join(\"\\n\"));\n    }\n    var best = \"\";\n    for (var j = 0; j < cands.length; j++) if (cands[j] && cands[j].length > best.length) best = cands[j];\n    return best.length > 100 ? best : \"\";\n}\nfunction srvAliceLoose(html) {\n    var t = String(html || \"\")\n        .replace(/<script[\\s\\S]*?<\\/script>/gi, \" \")\n        .replace(/<style[\\s\\S]*?<\\/style>/gi, \" \")\n        .replace(/<!--[\\s\\S]*?-->/g, \" \")\n        .replace(/<br\\s*\\/?>/gi, \"\\n\")\n        .replace(/<\\/(p|div|h\\d|li|tr|section|article)>/gi, \"\\n\")\n        .replace(/<[^>]*>/g, \"\")\n        .replace(/&nbsp;/g, \" \").replace(/&amp;/g, \"&\").replace(/&lt;/g, \"<\")\n        .replace(/&gt;/g, \">\").replace(/&quot;/g, '\"');\n    var lines = t.split(\"\\n\").map(function (x) { return x.replace(/[ \\t\\u3000]+/g, \" \").trim(); });\n    var best = \"\", cur = \"\";\n    for (var i = 0; i < lines.length; i++) {\n        var L = lines[i];\n        if (L.length >= 12) { cur += (cur ? \"\\n\" : \"\") + L; }\n        else if (cur) { if (cur.length > best.length) best = cur; cur = \"\"; }\n    }\n    if (cur.length > best.length) best = cur;\n    return best;\n}\nfunction srvAliceClean(text) {\n    var lines = String(text || \"\").split(\"\\n\");\n    var junk = /(爱丽丝|书屋|最新章节|上一章|下一章|返回目录|返回书页|返回顶部|加入书架|加入书签|手机阅读|扫码|二维码|温馨提示|请记住|记住本站|本站|备用网址|域名|收藏本站|推荐阅读|章节报错|内容报错|举报|广告|免责声明|翻页|快捷键|夜间模式|日间模式|字体|听书|www\\.|http|\\.com|\\.net|\\.sbs|\\.space|\\.xyz|\\.cn|点击返回|加载下一章|已经是最后|你刚刚阅读到|返回首页|返回我的书架|书籍详情|反馈|繁体中文|上下滑动|左右滑动|字号|自动订阅|换源)/i;\n    var out = [];\n    for (var i = 0; i < lines.length; i++) {\n        var L = lines[i].replace(/[ \\t\\u3000]+/g, \" \").trim();\n        if (!L) continue;\n        if (L.length <= 30 && junk.test(L)) continue;\n        if (!/[\\u4e00-\\u9fff\\u3400-\\u4dbfA-Za-z0-9]/.test(L)) continue;\n        if (out.length && out[out.length - 1] === L) continue;\n        out.push(L);\n    }\n    return out.join(\"\\n\");\n}\nfunction srvAliceHasBox(html) {\n    return /(read-content|page-read)/i.test(String(html || \"\"));\n}\nvar SRV_ALICE_BLOCK = /VPN|梯子|科学上网|翻墙|加速器|无法访问|访问受限|访问被限制|地区限制|暂不服务|安全验证|验证码|cloudflare|just a moment|cf-browser|access denied/i;\nfunction srvAliceBlocked(html) {\n    var h = String(html || \"\");\n    if (/访问验证|安全验证|captcha|just a moment|cf-browser/i.test(h)) {\n        return \"站点要了「访问验证」（它把这个网络出口盯上了）\";\n    }\n    if (srvAliceHasBox(h)) return \"\";\n    if (SRV_ALICE_BLOCK.test(h) || h.length < 8000) return \"站点返回的是拦截页，不是正文页\";\n    return \"\";\n}\nfunction srvAliceMsg(why, html) {\n    return \"【爱丽丝】\" + why + \"，这一章没取到正文。\\n\\n\" +\n        \"· 上面这句是提示，不是正文 —— 别往下读。\\n\" +\n        \"· 正文会自动改走服务器再取一次；还看到这句话，说明服务器那边也没拿到。\\n\" +\n        \"· 先把这本书的目录重新加载一下（或在书架里删掉重加）：新目录里的章节地址\\n\" +\n        \"  会换成服务器签发的地址，就不再受你本地网络出口的影响。\\n\" +\n        \"· 还不行就长按这一章 → 删除本章缓存，再重新进（不清缓存会一直读到这条提示）。\\n\" +\n        \"· 诊断：拿回来的页面 \" + String(html || \"\").length + \" 字符。\";\n}\nfunction srvAliceFetch(pageUrl) {\n\n    var u = String(pageUrl || \"\");\n    if (!u) return \"\";\n    var j = srvJson(srvBase() + \"/alice/content?url=\" + encodeURIComponent(u));\n    if (!j || j.err) { srvLog(\"服务器代抓失败：\" + ((j && j.err) || \"无响应\")); return \"\"; }\n    try { source.put(\"sy_alice_srv\", \"1\"); } catch (eM) { }\n    return srvAliceClean(j.content) || \"\";\n}\nfunction srvAliceReport(pageUrl) {\n\n    var u = String(pageUrl || \"\");\n    if (!u) return;\n    var up = srvAliceUpstreamOf(u) || u;\n    try {\n        var j = srvJson(srvBase() + \"/alice/content?charge=1&url=\" + encodeURIComponent(up));\n        if (!j || j.err) srvLog(\"爱丽丝计费打点失败：\" + ((j && j.err) || \"无响应\"));\n    } catch (e) { }\n}\nfunction srvAliceUpstreamOf(chUrl) {\n    var m = /[?&]id=([^&#]+)/.exec(String(chUrl || \"\"));\n    if (!m) return \"\";\n    var u = \"\";\n    try { u = decodeURIComponent(m[1]); } catch (e) { }\n    if (!/^https?:\\/\\//i.test(u)) return \"\";\n    return srvIsAliceUrl(u) ? u : \"\";\n}\nfunction srvAlicePage(html, pageUrl, noFetch) {\n    var h = String(html || \"\");\n    if (/^\\s*\\{/.test(h)) {\n        var oj = null;\n        try { oj = JSON.parse(h); } catch (ej) { }\n        if (oj && typeof oj.content === \"string\" && oj.content) return String(oj.content);\n    }\n    var why = h ? srvAliceBlocked(h) : \"这一章什么都没拿到（网络断了）\";\n    var text = \"\";\n    if (h) {\n        if (/java\\.net\\.|java\\.io\\.|java\\.lang\\.|Exception|Connection reset|at java\\.|UnknownHost|SSLException/.test(h.slice(0, 2000))) {\n            why = \"网络把这次请求掐断了\";\n        } else {\n            text = srvAlicePick(h);\n            if (!text && srvAliceHasBox(h)) { text = srvAliceLoose(h); if (text && text.length < 200) text = \"\"; }\n        }\n    }\n    if (text) { srvAliceReport(); return srvAliceClean(text); }\n    try {\n        srvLog(\"爱丽丝客户端这支没切出正文（\" + why + \"，页面 \" + h.length + \" 字符），改走服务器兜底\");\n    } catch (eL) { }\n    if (noFetch) return srvAliceMsg(why, h);\n    var via = srvAliceFetch(pageUrl);\n    if (via) return via;\n    return srvAliceMsg(why, h);\n}\nfunction srvIsAliceUrl(u) {\n\n    var s = String(u || \"\");\n    if (s.indexOf(srvBase()) >= 0) return false;\n    return s.indexOf(\"als1.sbs\") >= 0 || s.indexOf(\"als1010.space\") >= 0 || s.indexOf(\"alicesw\") >= 0;\n}\nfunction srvContent(result, tone, chUrl, bookName, isCurrent) {\n    var j = null;\n    try { j = srvNorm(JSON.parse(String(result))); } catch (e) { }\n    var want = String(tone === undefined || tone === null ? \"\" : tone);\n    if (want) {\n        var raw = String(chUrl || \"\");\n        var base = raw.replace(/[?&]tone=[^&#]*/g, \"\");\n        var m = /[?&]tone=([^&#]*)/.exec(raw);\n        var cur = m ? decodeURIComponent(m[1]) : \"\";\n        if (base && cur !== want) {\n            var j2 = srvJson(base + \"&tone=\" + encodeURIComponent(want));\n            if (j2 && j2.ok && j2.content) return String(j2.content);\n        }\n    }\n    if (!j || !j.ok || !j.content) {\n        var e0 = String((j && j.err) || \"没有取到正文\");\n        var up = srvAliceUpstreamOf(chUrl);\n        if (up) {\n            var pg = \"\";\n            try { pg = String(srvJav().ajax(up, 15000)); } catch (eD) { pg = \"\"; }\n            var tD = pg ? srvAlicePage(pg, up, true) : \"\";\n\n            if (tD && tD.indexOf(\"【爱丽丝】\") !== 0) { srvAliceReport(up); return tD; }\n        }\n        if (/每分钟最多/.test(e0)) {\n            return \"【服务器】翻得太快了 —— \" + e0 + \"\\n\\n等一分钟再往下读就行，书没丢。\";\n        }\n        return \"【服务器】\" + e0;\n    }\n    var vhtml = String(j.html || \"\");\n    var playUrl = String(j.playUrl || \"\");\n\n    var epb = String(j.epBase || \"\");\n    if (epb) { try { srvJav().put(\"sy_epb\", epb); } catch (eEP) { } }\n\n    if ((vhtml || playUrl) && isCurrent) {\n        var isPlayUrl = String(j.kind || \"\") === \"video\" && playUrl;\n        var nm = String(bookName || \"\");\n        var jumpErr = \"\";\n        try {\n            if (isPlayUrl) {\n                srvJav().startBrowser(String(j.playUrl), \"\");\n            } else {\n                vhtml = srvVideoBridge(vhtml, epb);\n                srvJav().startBrowser(\"about:blank\", nm || \"视频\", vhtml);\n            }\n        } catch (eSB) { jumpErr = String(eSB); }\n        if (jumpErr) {\n            return \"【播放器没能打开】\" + jumpErr +\n                (isPlayUrl ? \"\\n\\n播放地址：\\n\" + String(j.playUrl)\n                           : \"\\n\\n（短剧的视频是 CENC 加密的，必须由自制播放页解密播放）\\n\\n视频地址：\\n\" + String(j.content));\n        }\n        try {\n            if (isPlayUrl) srvJav().toast(\"正在打开播放地址…\");\n            else srvJav().toast(\"正在加载并解密视频\\n大文件加载较慢，请耐心等待\");\n        } catch (eT) { }\n    }\n    return String(j.content);\n}\n// ==================== 紫霞聚合 · 自定义发现页（重绘） ====================\nvar ZX_ICON = { '玄幻':'🐉','都市':'🏙','都市生活':'🏙','历史':'🏯','仙侠':'🧙','武侠':'🗡','科幻':'👽','悬疑':'🔍','恐怖':'👻','灵异':'👻','言情':'💕','现代言情':'💑','古代言情':'🎎','古言':'🎎','总裁':'👔','豪门':'👑','校园':'🏫','青春':'🌸','穿越':'⏳','重生':'🔄','系统':'🖥','神豪':'💰','修真':'🧘','种田':'🌾','甜宠':'🍬','虐恋':'💔','游戏':'🎮','体育':'🏅','军事':'🪖','战争':'⚔️','末世':'☢️','冒险':'🧭','搞笑':'😂','生活':'☕','热血':'🔥','恋爱':'❤️','古风':'🏮','宫斗':'👘','逆袭':'💪','职场':'💼','年代':'📻','抗战':'🎖','权谋':'♟','志怪':'👹','喜剧':'🎭','动作':'🥋','脑洞':'💭','都市脑洞':'💭','传统玄幻':'🐉','都市高武':'💥','战神':'🛡','赘婿':'🧧','玄幻脑洞':'🐉','宫闱宅斗':'👘','兵王':'🎖' };\n/* [NO_ICON_V1729] 发现页不再加图标（用户 2026-10-21：删掉所有平台的发现美化，以后也不许再加）。\n   保留函数签名、恒返回空串：各处拼接逻辑无需改，也不会留下占位。 */\nfunction zxIcon(n){ return ''; }\nfunction zxPlatIcon(pid){ return ''; }  /* [NO_ICON_V1729] 平台图标一并去掉 */\nfunction zxExplore(ctx){\n  try {\n    srvBind(ctx);\n\n    var out = [];\n    var cfg = srvVar();\n    var cur = String(cfg['aggPlatform'] || '');\n    var names = [], byName = {}, curName = '', found = false;\n    for (var i = 0; i < SRV_PLATFORMS.length; i++) { var p = SRV_PLATFORMS[i]; names.push(p.name); byName[p.name] = p.id; if (p.id === cur) { found = true; curName = p.name; } }\n    if (!found) { cur = SRV_PLATFORMS[0].id; curName = SRV_PLATFORMS[0].name; }\n    out.push({ title: '紫霞聚合 · ' + SRV_PLATFORMS.length + ' 平台', type: 'text',\n               style: { layout_flexGrow: 1, layout_flexBasisPercent: 1, layout_wrapBefore: true } });\n    out.push({\n      title: '平台', type: 'select', chars: names, default: curName,\n      action: \"(function(){var m=\" + JSON.stringify(byName) + \";var v=String(m[String(infoMap['平台']||'')]||'\" + cur + \"');var u={};try{if(typeof cache!=='undefined'&&cache&&cache.get){u=JSON.parse(String(cache.get('syState')||'')||'{}')||{};}}catch(e1){u={};}u.aggPlatform=v;u.aggGrp='';var s=JSON.stringify(u);try{if(typeof cache!=='undefined'&&cache&&cache.put)cache.put('syState',s,31536000);}catch(e2){}try{if(typeof java!=='undefined'&&java&&java.put)java.put('sy_ui',s);}catch(e3){}try{java.refreshExplore();}catch(e4){}})()\",\n      style: { layout_flexGrow: 1, layout_flexBasisPercent: 1, layout_wrapBefore: true }\n    });\n    function zxIcon(n) {\n      var m = { '玄幻':'🐉','都市':'🚗','都市生活':'🏙','现代言情':'💑','校园':'🏫','古代言情':'🎎','奇幻':'✨','科幻':'👽','科幻末世':'👽','仙侠':'🧙','悬疑':'🔍','乡村':'🌾','历史':'🏯','军事':'🪖','系统':'🖥','神豪':'💰','修真':'🧘','种田':'🌱','快穿':'⏩','赘婿':'🧧','神医':'💉','战神':'🛡','萌宝':'👶','总裁':'👔','甜宠':'🍬','重生':'🔄','穿越':'⏳','娱乐圈':'🎬','游戏动漫':'🎮','武侠':'🗡','脑洞':'🧠','轻小说':'🌼','现实':'🏠','青春':'🌞','职场':'💼','体育':'🏅','小说':'📖','相声评书':'🎤','评书':'🎤','文化':'🏺','学习成长':'🎓','情感':'💞','亲子':'👶','出版':'📚','有声剧':'🎧','广播剧':'🎙','影视小说':'🎥','文学小说':'📖','名著经典':'📕','生活':'☕','社会科学':'📚','经济管理':'📊','成功励志':'🔥','热血':'🔥','恋爱':'❤️','冒险':'🗺','古风':'🏮','搞笑':'😂','悬疑灵异':'🔍' };\n      var k = String(n || '').trim();\n      if (m[k]) return m[k] + ' ' + k;\n      if (k.indexOf('玄幻')>=0) return '🐉 '+k; if (k.indexOf('都市')>=0) return '🚗 '+k;\n      if (k.indexOf('仙侠')>=0) return '🧙 '+k; if (k.indexOf('历史')>=0) return '🏯 '+k;\n      if (k.indexOf('悬疑')>=0) return '🔍 '+k; if (k.indexOf('科幻')>=0) return '👽 '+k;\n      if (k.indexOf('穿越')>=0) return '⏳ '+k; if (k.indexOf('甜宠')>=0) return '🍬 '+k;\n      return '📚 ' + k;\n    }\n    if (cur === 'hg') {\n      // [黄果] 本地直连平台：全部指向上游（带附加头），不走服务器\n      // [hgPlanSwitchFix] 同上：追加到 out 以保留平台选择器。\n      var _hk = hgKinds();\n      for (var _hi = 0; _hi < _hk.length; _hi++) out.push(_hk[_hi]);\n      return JSON.stringify(out);\n    }\n    if (cur === 'uaa') {\n      // [UAA] 本地直连平台：分类格子全部指向上游（带附加头），不走服务器\n      // [hgPlanSwitchFix] 必须**追加到 out**（保留前面的平台选择器），\n      // 否则选中本平台后下拉消失、无法切回别的平台。\n      var _uk = uaaKinds();\n      for (var _ui = 0; _ui < _uk.length; _ui++) out.push(_uk[_ui]);\n      return JSON.stringify(out);\n    }\n    if (cur === 'tingyou') {\n      // 听友FM：频道/排序下拉 + 完整分类表（对齐独立源 听友FM.json，sort 由服务端透传）\n      var TY_CH = { '有声小说': { cid: 2, types: [[46, '玄幻奇幻'], [11, '武侠小说'], [19, '言情通俗'], [21, '相声小品'], [14, '恐怖惊悚'], [17, '官场商战'], [15, '历史军事'], [9, '百家讲坛'], [16, '刑侦反腐'], [10, '有声文学'], [18, '人物纪实'], [36, '广播剧'], [22, '英文读物'], [23, '轻音清心'], [31, '二人转'], [33, '健康养生'], [34, '综艺娱乐'], [40, '头条'], [38, '戏曲'], [41, '脱口秀'], [42, '商业财经'], [43, '亲子教育'], [44, '教育培训'], [45, '时尚生活'], [20, '童话寓言'], [47, '未分类']] },\n                    '评书': { cid: 1, types: [[1, '单田芳'], [2, '刘兰芳'], [3, '田连元'], [4, '袁阔成'], [5, '连丽如'], [8, '孙一'], [30, '王子封臣'], [25, '马长辉'], [26, '昊儒书场'], [27, '王军'], [28, '王玥波'], [29, '石连君'], [12, '粤语评书'], [35, '关永超'], [6, '张少佐'], [7, '田战义'], [13, '其他评书']] } };\n      var TY_SORTS = [['comprehensive', '综合排序'], ['popular', '播放最多'], ['updated', '最近更新'], ['new', '最新发布']];\n      var tyCh = String(cfg['tyCh'] || ''); if (!TY_CH[tyCh]) tyCh = '有声小说';\n      var tySort = String(cfg['tySort'] || ''); var tySortName = '综合排序';\n      for (var ts0 = 0; ts0 < TY_SORTS.length; ts0++) { if (TY_SORTS[ts0][0] === tySort) { tySortName = TY_SORTS[ts0][1]; break; } }\n      var tyChChars = [], tyChMap = {};\n      for (var kc in TY_CH) { tyChChars.push(kc); tyChMap[kc] = kc; }\n      var tySortChars = [], tySortMap = {};\n      for (var ts1 = 0; ts1 < TY_SORTS.length; ts1++) { tySortChars.push(TY_SORTS[ts1][1]); tySortMap[TY_SORTS[ts1][1]] = TY_SORTS[ts1][0]; }\n      out.push({ title: '频道', type: 'select', chars: tyChChars, default: tyCh,\n        action: \"(function(){var m=\" + JSON.stringify(tyChMap) + \";var v=String(m[String(infoMap['频道']||'')]||'\" + tyCh + \"');var u={};try{if(typeof cache!=='undefined'&&cache&&cache.get){u=JSON.parse(String(cache.get('syState')||'')||'{}')||{};}}catch(e1){u={};}u.tyCh=v;var s=JSON.stringify(u);try{if(typeof cache!=='undefined'&&cache&&cache.put)cache.put('syState',s,31536000);}catch(e2){}try{if(typeof java!=='undefined'&&java&&java.put)java.put('sy_ui',s);}catch(e3){}try{java.refreshExplore();}catch(e4){}})()\",\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.5, layout_wrapBefore: true } });\n      out.push({ title: '排序', type: 'select', chars: tySortChars, default: tySortName,\n        action: \"(function(){var m=\" + JSON.stringify(tySortMap) + \";var v=String(m[String(infoMap['排序']||'')]||'\" + tySort + \"');var u={};try{if(typeof cache!=='undefined'&&cache&&cache.get){u=JSON.parse(String(cache.get('syState')||'')||'{}')||{};}}catch(e1){u={};}u.tySort=v;var s=JSON.stringify(u);try{if(typeof cache!=='undefined'&&cache&&cache.put)cache.put('syState',s,31536000);}catch(e2){}try{if(typeof java!=='undefined'&&java&&java.put)java.put('sy_ui',s);}catch(e3){}try{java.refreshExplore();}catch(e4){}})()\",\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.5 } });\n      out.push({ title: '━━ 🎧 ' + tyCh + ' · ' + tySortName + ' ━━', type: 'text',\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 1, layout_wrapBefore: true } });\n      var tyTs = TY_CH[tyCh].types;\n      for (var ty0 = 0; ty0 < tyTs.length; ty0++) {\n        var tyU = srvBase() + '/public/tingyou/list?cat=cat:' + TY_CH[tyCh].cid + ':' + tyTs[ty0][0] + '&sort=' + tySort + '&page={{page}}' + srvKeyQ();\n        out.push({ title: zxIcon(tyTs[ty0][1]), url: tyU, style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.25 } });\n      }\n      out.push({ title: '━━ 🏆 榜单 ━━', type: 'text', style: { layout_flexGrow: 1, layout_flexBasisPercent: 1, layout_wrapBefore: true } });\n      var tyRanks = [['hot', '热门'], ['new', '最新'], ['recommend', '推荐'], ['serial', '连载']];\n      for (var ty1 = 0; ty1 < tyRanks.length; ty1++) {\n        var tyR = srvBase() + '/public/tingyou/list?cat=rank:' + tyRanks[ty1][0] + '&page={{page}}' + srvKeyQ();\n        out.push({ title: zxIcon(tyRanks[ty1][1]), url: tyR, style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.25 } });\n      }\n      return JSON.stringify(out);\n    }\n    // 取分类并按服务端分隔行分组\n    var j = srvJson(srvBase() + '/public/' + encodeURIComponent(cur) + '/explore');\n    var kinds = (j && j.data && j.data.kinds) || (j && j.kinds) || [];\n    if (srvNeed(j)) {\n      // [hgPlanSwitchFix] 登录引导也保留平台下拉，用户仍可切平台/切到本地直连平台\n      out.push({ title: '🔒 ' + String((j && (j.err || j.msg)) || '未登录'), url: null, type: 'text',\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 1, layout_wrapBefore: true } });\n      out.push({ title: '请到书源「设置」填账号密码点「登录」（或填 APIKey），登录后重新打开发现页', url: null, type: 'text',\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 1, layout_wrapBefore: true } });\n      return JSON.stringify(out);\n    }\n    if (!kinds.length && j && (j.err || j.msg)) {\n      // [hgPlanSwitchFix] 异常也保留平台下拉：否则一旦某个平台报错，\n      // 整页只剩一行错误、连平台都切不了（用户实测就是这个现象）。\n      out.push({ title: '【发现异常】' + String(j.err || j.msg), url: null, type: 'text',\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 1, layout_wrapBefore: true } });\n      out.push({ title: '提示：可点上方「平台」下拉切换到其他平台', url: null, type: 'text',\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 1, layout_wrapBefore: true } });\n      return JSON.stringify(out);\n    }\n    var groups = [], gName = '', gi = -1;\n    for (var g0 = 0; g0 < kinds.length; g0++) {\n      var nm = String((kinds[g0] || {}).name || '');\n      if (nm.indexOf('━━━') === 0) { gName = nm.split('━').join('').trim(); groups.push({ name: gName, items: [] }); gi++; continue; }\n      if (gi >= 0 && kinds[g0].url) groups[gi].items.push(kinds[g0]);\n    }\n    if (!groups.length && kinds.length) { groups.push({ name: curName, items: [] }); for (var g1 = 0; g1 < kinds.length; g1++) { if (kinds[g1].url) groups[0].items.push(kinds[g1]); } }\n    // 选组（记住选择）\n    var grpKey = 'aggGrp_' + cur;\n    var grpSel = String(cfg[grpKey] || '');\n    var gIdx = 0;\n    for (var g2 = 0; g2 < groups.length; g2++) { if (groups[g2].name === grpSel) { gIdx = g2; break; } }\n    if (groups.length > 1) {\n      var gChars = [], gMap = {};\n      for (var g3 = 0; g3 < groups.length; g3++) { gChars.push(groups[g3].name); gMap[groups[g3].name] = groups[g3].name; }\n      out.push({\n        title: '分组', type: 'select', chars: gChars, default: (groups[gIdx].name || ''),\n        action: \"(function(){var m=\" + JSON.stringify(gMap) + \";var v=String(m[String(infoMap['分组']||'')]||'\" + groups[gIdx].name + \"');var u={};try{if(typeof cache!=='undefined'&&cache&&cache.get){u=JSON.parse(String(cache.get('syState')||'')||'{}')||{};}}catch(e1){u={};}u.\" + grpKey + \"=v;var s=JSON.stringify(u);try{if(typeof cache!=='undefined'&&cache&&cache.put)cache.put('syState',s,31536000);}catch(e2){}try{if(typeof java!=='undefined'&&java&&java.put)java.put('sy_ui',s);}catch(e3){}try{java.refreshExplore();}catch(e4){}})()\",\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 1, layout_wrapBefore: true }\n      });\n    }\n    var items = (groups[gIdx] && groups[gIdx].items) || [];\n    out.push({ title: '━━ ' + zxPlatIcon(cur) + ' ' + (groups[gIdx] ? groups[gIdx].name : curName) + ' (' + items.length + ') ━━', type: 'text',\n               style: { layout_flexGrow: 1, layout_flexBasisPercent: 1, layout_wrapBefore: true } });\n    var n = 0;\n    for (var k = 0; k < items.length; k++) {\n      var kd = items[k] || {};\n      if (!kd.name) continue;\n      var raw = String(kd.url || '');\n      // 分类格子 URL = 网关 list 地址 + 顶层 page={{page}}（对齐真实可翻页源：顶层带 {{page}}）\n      if (raw.indexOf('{{page}}') < 0) {\n        raw += (raw.indexOf('?') >= 0 ? '&' : '?') + 'page={{page}}';\n      }\n      var u = (raw.indexOf('http') === 0) ? raw : (srvBase() + raw); try { if (u.indexOf('/public/') > 0 && u.indexOf('api_key=') < 0) { var kq0 = srvKeyQ(); if (kq0) u += (u.indexOf('?') >= 0 ? '&' : '?') + kq0; } } catch (eK0) { }\n      out.push({ title: zxIcon(kd.name), url: u,\n                 style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.25 } });\n      n++;\n    }\n    if (!n) out.push({ title: '该分组暂无分类', url: null, type: 'text', style: { layout_flexGrow: 1, layout_flexBasisPercent: 1, layout_wrapBefore: true } });\n    var rem = n % 4;\n    if (rem !== 0) { for (var z = 0; z < (4 - rem); z++) { out.push({ title: '※', url: '', type: 'button', style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.25 } }); } }\n    return JSON.stringify(out);\n  } catch (e) {\n    return JSON.stringify([{ title: '【发现页出错】' + e, url: null }]);\n  }\n}\n\n\nfunction srvPlayerHtml(title, videoUrl, eps, curIdx) {\n  var epJson = \"[]\";\n  try { epJson = JSON.stringify(eps || []); } catch (e0) { }\n  epJson = epJson.replace(/</g, \"\\\\u003c\");\n  var h = \"<!DOCTYPE html><html><head><meta charset=\\\"utf-8\\\">\"\n    + \"<meta name=\\\"viewport\\\" content=\\\"width=device-width,initial-scale=1,user-scalable=no\\\">\"\n    + \"<title>\" + title + \"</title><style>\"\n    + \"body{margin:0;background:#000;color:#fff;font-family:sans-serif;-webkit-user-select:none}\"\n    + \"#wrap{position:relative;width:100%;}\"\n    + \"#v{width:100%;background:#000;display:block}\"\n    + \"#big{position:absolute;left:50%;top:35%;transform:translate(-50%,-50%);width:76px;height:76px;border-radius:50%;background:rgba(232,68,58,.92);border:none;color:#fff;font-size:30px;}\"\n    + \"#bar{padding:10px 14px;font-size:15px;color:#eee}\"\n    + \"#tip{padding:0 14px 10px;font-size:12px;color:#888}\"\n    + \"#eps{padding:4px 8px 20px;display:flex;flex-wrap:wrap;gap:6px}\"\n    + \"#eps button{background:#1a1a1a;color:#fff;border:1px solid #333;border-radius:6px;padding:7px 12px;font-size:13px}\"\n    + \"#eps button.cur{background:#E8443A;border-color:#E8443A}\"\n    + \"</style></head><body>\"\n    + \"<div id=\\'wrap\\'>\"\n    + \"<video id=\\'v\\' src=\\'\" + videoUrl + \"\\' controls playsinline webkit-playsinline preload=\\'metadata\\' x5-playsinline=\\'true\\'></video>\"\n    + \"<button id=\\'big\\' onclick=\\'playNow()\\'>▶</button>\"\n    + \"</div>\"\n    + \"<div id=\\'bar\\'>\" + title + \"</div>\"\n    + \"<div id=\\'tip\\'>若无法播放，点右上角菜单用浏览器打开</div>\"\n    + \"<div id=\\'eps\\'></div>\"\n    + \"<script>\"\n    + \"var V=document.getElementById('v'),B=document.getElementById('big');\"\n    + \"V.addEventListener('playing',function(){B.style.display='none';});\"\n    + \"V.addEventListener('pause',function(){B.style.display='block';});\"\n    + \"V.addEventListener('error',function(){document.getElementById('tip').textContent='视频加载失败：链接可能已过期，回目录重新打开本章';});\"\n    + \"function playNow(){B.style.display='none';try{V.load();V.play();}catch(e){\"\n    + \"document.getElementById('tip').textContent='播放失败('+e+')，请用浏览器打开';}}\"\n    + \"var E=\" + epJson + \",CI=\" + (curIdx || 0) + \";\"\n    + \"var box=document.getElementById('eps');\"\n    + \"for(var i=0;i<E.length;i++){(function(i){var b=document.createElement('button');\"\n    + \"b.textContent=E[i].t;if(i===CI)b.className='cur';\"\n    + \"b.onclick=function(){location.href=E[i].u;};box.appendChild(b);})(i);}\"\n    + \"<\\/script></body></html>\";\n  return h;\n}\n\n// ===== [v9] 番茄max 播放器桥（Max命名 → 聚合实现） =====\nfunction fqUseSource(src) { try { SRV_CTX.source = src; } catch (e) { } }\nfunction fqUseJava(jav) { try { SRV_CTX.java = jav; } catch (e) { } }\nfunction fqUseCache(c) { try { SRV_CTX.cache = c; } catch (e) { } }\nfunction FQ_GET(k) { var c = srvVar(); return String(c[k] === undefined ? \"\" : c[k]); }\nfunction FQ_SET(k, v) { var o = {}; o[k] = v; srvSet(o); }\n// 服务端版取流桥：播放页 run() 调它拿某集的 url+keyHex\nfunction fqVideoStreamJson(itemId, site, tab, bookId) {\n    try {\n        var plat = (tab === \"13\" || tab === \"19\") ? \"hgmd\" : \"hgds\";\n        var u = srvBase() + \"/public/\" + plat + \"/content?url=\" + encodeURIComponent(String(itemId))\n              + \"&platform=\" + plat + (bookId ? (\"&bid=\" + encodeURIComponent(String(bookId))) : \"\");\n        var j = srvJson(u);\n        if (!j || !j.ok) { return JSON.stringify({ err: (j && j.err) || \"取流失败\" }); }\n        var dd = j.data || j;\n        var vu = String(dd.url || dd.content || \"\");\n        if (!vu) { return JSON.stringify({ err: \"空视频地址\" }); }\n        return JSON.stringify({ url: vu, keyHex: String(dd.keyHex || \"\"), size: Number(dd.size) || 0 });\n    } catch (e) {\n        return JSON.stringify({ err: String(e && e.message || e) });\n    }\n}\n\nfunction fqCencPlayerHtml(title, url, keyHex, size, episodes, curIdx, site, tab, bookId, initRate) {\n    var epList = episodes || [];\n    var nEp = epList.length;\n    var cur = typeof curIdx === 'number' ? curIdx : 0;\n    if (cur < 0) { cur = 0; }\n    if (nEp > 0 && cur >= nEp) { cur = nEp - 1; }\n    var curTitle = (nEp > 0 && epList[cur] && epList[cur].t) ? String(epList[cur].t) : '';\n    var rate0 = (typeof initRate === 'number' && initRate >= 0.5 && initRate <= 3) ? initRate : 1;\n\n    // 选集数据（JSON 内嵌；转义 '<' 防 script 截断）\n    var epJson = '[]';\n    try {\n        var tmp = [];\n        for (var ei = 0; ei < nEp; ei++) {\n            tmp.push({ id: String(epList[ei].id || ''), t: String(epList[ei].t || ('第' + (ei + 1) + '集')) });\n        }\n        epJson = JSON.stringify(tmp);\n    } catch (e0) { epJson = '[]'; }\n    epJson = epJson.replace(/</g, '\\\\u003c');\n\n    // ---- 页面脚本（解密核心与原始真机可播实现保持一致）----\n    var jsRun = \"(function(){\"\n        + \"var U=\" + JSON.stringify(String(url))\n        + \",K=\" + JSON.stringify(String(keyHex))\n        + \",Z=\" + String(Number(size) || 0)\n        + \",E=\" + epJson\n        + \",CI=\" + cur\n        + \",SITE=\" + JSON.stringify(String(site || 'hg'))\n        + \",TAB=\" + JSON.stringify(String(tab || '10'))\n        + \",BOOK=\" + JSON.stringify(String(bookId || ''))\n        + \",V=document.getElementById('v')\"\n        + \",S=document.getElementById('s')\"\n        + \",BAR=document.getElementById('ebar')\"\n        + \",CTL=document.getElementById('ctl')\"\n        + \",TAP=document.getElementById('tap')\"\n        + \",PB=document.getElementById('playBtn')\"\n        + \",RB=document.getElementById('rateBtn')\"\n        + \",PRB=document.getElementById('prevBtn')\"\n        + \",NXB=document.getElementById('nextBtn')\"\n        + \",ROTB=document.getElementById('rotateBtn')\"\n        + \",B=null,GEN=0,T=0,LOCKED=false,FS=false;\"\n        + \"var RATES=[1,1.25,1.5,2,0.5,0.75],RATE=\" + String(rate0) + \",RI=Math.max(0,RATES.indexOf(RATE));\"\n        + \"var LB=document.getElementById('lockBtn'),IL=document.getElementById('icLock'),IU=document.getElementById('icUnlock'),ICP=document.getElementById('icPlay'),ICQ=document.getElementById('icPause');\"\n        + \"function msg(t,f){var n=Date.now();if(!f&&n-T<250)return;T=n;t=String(t||'');\"\n        + \"if(t){if(S.textContent!==t)S.textContent=t;if(S.style.display!=='block')S.style.display='block';}\"\n        + \"else{if(S.textContent)S.textContent='';if(S.style.display!=='none')S.style.display='none';}}\"\n        + \"function u16(a,p){return(a[p]<<8)|a[p+1];}\"\n        + \"function u32(a,p){return a[p]*16777216+a[p+1]*65536+a[p+2]*256+a[p+3];}\"\n        + \"function u64(a,p){return u32(a,p)*4294967296+u32(a,p+4);}\"\n        + \"function typ(a,p){return String.fromCharCode(a[p],a[p+1],a[p+2],a[p+3]);}\"\n        + \"function boxes(a,s,e){var r=[],p=s,z,t,h;while(p+8<=e){z=u32(a,p);t=typ(a,p+4);h=8;if(z===1){if(p+16>e)break;z=u64(a,p+8);h=16;}else if(z===0)z=e-p;if(z<h||p+z>e)break;r.push({type:t,start:p,size:z,payload:p+h,end:p+z});p+=z;}return r;}\"\n        + \"function first(a,t){var i;for(i=0;i<a.length;i++)if(a[i].type===t)return a[i];return null;}\"\n        + \"function kids(a,b){return b?boxes(a,b.payload,b.end):[];}\"\n        + \"function putType(a,p,t){var i;for(i=0;i<4;i++)a[p+i]=t.charCodeAt(i);}\"\n        + \"function plan(a){var moov=first(boxes(a,0,a.length),'moov'),traks,samples=[],renames=[],ti;if(!moov)throw Error('加密MP4缺少moov');traks=kids(a,moov);for(ti=0;ti<traks.length;ti++){var trak=traks[ti],mdia,minf,stbl,k,senc,stsz,stsc,stco,co64,stsd,ivSize=8,entry=null,sinf=null,p,count,size,sizes=[],chunks=[],sc=[],offsets=[],ivs=[],i,j,n,cur,si=0,flags,sencCount,box,frma,entries,skip,candidate,iv;if(trak.type!=='trak')continue;mdia=first(kids(a,trak),'mdia');minf=first(kids(a,mdia),'minf');stbl=first(kids(a,minf),'stbl');if(!stbl)continue;k=kids(a,stbl);senc=first(k,'senc');stsz=first(k,'stsz');stsc=first(k,'stsc');stco=first(k,'stco');co64=first(k,'co64');stsd=first(k,'stsd');if(!senc||!stsz||!stsc||(!stco&&!co64))continue;if(stsd&&stsd.payload+8<=stsd.end){entries=boxes(a,stsd.payload+8,stsd.end);for(i=0;i<entries.length;i++){skip=/^(encv|hvc1|hev1|avc1)$/.test(entries[i].type)?78:(/^(enca|mp4a)$/.test(entries[i].type)?28:0);if(!skip||entries[i].payload+skip>entries[i].end)continue;candidate=first(boxes(a,entries[i].payload+skip,entries[i].end),'sinf');if(candidate){entry=entries[i];sinf=candidate;box=first(kids(a,first(kids(a,sinf),'schi')),'tenc');if(box&&box.payload+8<=box.end)ivSize=a[box.payload+7];break;}}}p=stsz.payload;size=u32(a,p+4);count=u32(a,p+8);for(i=0;i<count;i++)sizes.push(size||u32(a,p+12+i*4));box=stco||co64;p=box.payload;n=u32(a,p+4);for(i=0;i<n;i++)chunks.push(stco?u32(a,p+8+i*4):u64(a,p+8+i*8));p=stsc.payload;n=u32(a,p+4);for(i=0;i<n;i++)sc.push([u32(a,p+8+i*12),u32(a,p+12+i*12)]);for(i=0;i<chunks.length;i++){n=0;for(j=0;j<sc.length;j++){if(sc[j][0]<=i+1)n=sc[j][1];else break;}cur=chunks[i];for(j=0;j<n&&si<sizes.length;j++){offsets.push(cur);cur+=sizes[si++];}}p=senc.payload;flags=u32(a,p)&16777215;sencCount=u32(a,p+4);cur=p+8;n=Math.min(sizes.length,sencCount);for(i=0;i<n;i++){if(cur+ivSize>senc.end)break;iv=[];for(j=0;j<ivSize;j++)iv.push(a[cur+j]);ivs.push(iv);cur+=ivSize;if(flags&2){n=u16(a,cur);cur+=2+n*6;n=Math.min(sizes.length,sencCount);}}if(offsets.length!==sizes.length||ivs.length<sizes.length)throw Error('加密MP4 sample表不匹配');for(i=0;i<sizes.length;i++)samples.push({offset:offsets[i],size:sizes[i],iv:ivs[i]});if(entry&&sinf){frma=first(kids(a,sinf),'frma');if(frma)renames.push([entry.start+4,typ(a,frma.payload)]);}if(sinf)renames.push([sinf.start+4,'free']);for(i=0;i<3;i++){box=first(k,['senc','saiz','saio'][i]);if(box)renames.push([box.start+4,'free']);}}if(!samples.length)throw Error('未找到CENC加密轨道');for(ti=0;ti<renames.length;ti++)putType(a,renames[ti][0],renames[ti][1]);samples.sort(function(x,y){return x.offset-y.offset;});return samples;}\"\n        + \"var SB=[99,124,119,123,242,107,111,197,48,1,103,43,254,215,171,118,202,130,201,125,250,89,71,240,173,212,162,175,156,164,114,192,183,253,147,38,54,63,247,204,52,165,229,241,113,216,49,21,4,199,35,195,24,150,5,154,7,18,128,226,235,39,178,117,9,131,44,26,27,110,90,160,82,59,214,179,41,227,47,132,83,209,0,237,32,252,177,91,106,203,190,57,74,76,88,207,208,239,170,251,67,77,51,133,69,249,2,127,80,60,159,168,81,163,64,143,146,157,56,245,188,182,218,33,16,255,243,210,205,12,19,236,95,151,68,23,196,167,126,61,100,93,25,115,96,129,79,220,34,42,144,136,70,238,184,20,222,94,11,219,224,50,58,10,73,6,36,92,194,211,172,98,145,149,228,121,231,200,55,109,141,213,78,169,108,86,244,234,101,122,174,8,186,120,37,46,28,166,180,198,232,221,116,31,75,189,139,138,112,62,181,102,72,3,246,14,97,53,87,185,134,193,29,158,225,248,152,17,105,217,142,148,155,30,135,233,206,85,40,223,140,161,137,13,191,230,66,104,65,153,45,15,176,84,187,22];\"\n        + \"function xt(x){return((x<<1)^((x&128)?27:0))&255;}\"\n        + \"function expand(k){var e=[],r=1,i,t0,t1,t2,t3,t;for(i=0;i<16;i++)e[i]=k[i];for(i=16;i<176;i+=4){t0=e[i-4];t1=e[i-3];t2=e[i-2];t3=e[i-1];if(i%16===0){t=t0;t0=SB[t1]^r;t1=SB[t2];t2=SB[t3];t3=SB[t];r=xt(r);}e[i]=e[i-16]^t0;e[i+1]=e[i-15]^t1;e[i+2]=e[i-14]^t2;e[i+3]=e[i-13]^t3;}return e;}\"\n        + \"function enc(x,e){var s=[],q,m,r,c,i,A,B,C,D;for(i=0;i<16;i++)s[i]=x[i]^e[i];for(r=1;r<=10;r++){for(i=0;i<16;i++)s[i]=SB[s[i]];q=[];for(c=0;c<4;c++)for(i=0;i<4;i++)q[c*4+i]=s[((c+i)%4)*4+i];s=q;if(r!==10){m=[];for(c=0;c<4;c++){A=s[c*4];B=s[c*4+1];C=s[c*4+2];D=s[c*4+3];m[c*4]=xt(A)^(xt(B)^B)^C^D;m[c*4+1]=A^xt(B)^(xt(C)^C)^D;m[c*4+2]=A^B^xt(C)^(xt(D)^D);m[c*4+3]=(xt(A)^A)^B^C^xt(D);}s=m;}for(i=0;i<16;i++)s[i]^=e[r*16+i];}return s;}\"\n        + \"function hex(s){var a=[],i;for(i=0;i<s.length;i+=2)a.push(parseInt(s.substr(i,2),16));return a;}\"\n        + \"function sample(a,s,e){var ctr=[],i,j,n=Math.ceil(s.size/16),ks,p=s.offset;for(i=0;i<16;i++)ctr[i]=i<s.iv.length?s.iv[i]:0;for(i=0;i<n;i++){ks=enc(ctr,e);for(j=0;j<16&&p<s.offset+s.size;j++,p++)a[p]^=ks[j];for(j=15;j>=0;j--){ctr[j]=(ctr[j]+1)&255;if(ctr[j])break;}}}\"\n        + \"function finish(a,gen){if(gen!==GEN)return;if(B){try{URL.revokeObjectURL(B);}catch(e){}B=null;}B=URL.createObjectURL(new Blob([a],{type:'video/mp4'}));V.src=B;V.load();applyRate();msg('',true);var p=V.play();if(p&&p.catch)p.catch(function(){msg('已解密，点播放键开始',true);});}\"\n        + \"function startDecrypt(a,gen){if(gen!==GEN)return;var e=expand(hex(K)),i=0,samplesArr=plan(a);function step(){if(gen!==GEN)return;var t=Date.now();try{while(i<samplesArr.length&&Date.now()-t<32){sample(a,samplesArr[i],e);i++;}msg('正在解密视频 '+Math.floor(i*100/samplesArr.length)+'%');if(i<samplesArr.length){setTimeout(step,0);return;}finish(a,gen);}catch(err){msg('解密失败：'+String(err).substring(0,200),true);}}msg('正在解密视频 0%',true);step();}\"\n        + \"function playStream(u,k,z){GEN++;var gen=GEN;U=u;K=k;Z=Number(z)||0;if(B){try{URL.revokeObjectURL(B);}catch(e){}B=null;}try{V.pause();}catch(e){}try{V.removeAttribute('src');V.load();}catch(e){}msg('正在加载视频 0%',true);doLoad(gen);}\"\n        + \"function showDownload(n,z){if(z>0)msg('正在加载视频 '+Math.min(100,Math.floor(n*100/z))+'%');else msg('正在加载视频');}\"\n        + \"function single(gen){if(gen!==GEN)return;var x=new XMLHttpRequest();msg('正在加载视频 0%',true);x.open('GET',U,true);x.responseType='arraybuffer';x.onprogress=function(e){if(gen!==GEN)return;showDownload(e.loaded,e.lengthComputable?e.total:Z);};x.onerror=function(){if(gen!==GEN)return;msg('视频请求失败',true);};x.onload=function(){if(gen!==GEN)return;if(x.status<200||x.status>=300){msg('视频请求失败：HTTP '+x.status,true);return;}showDownload(x.response.byteLength,x.response.byteLength);try{startDecrypt(new Uint8Array(x.response),gen);}catch(err){msg('解析失败：'+String(err).substring(0,200),true);}};x.send();}\"\n        + \"function doLoad(gen){if(gen!==GEN)return;if(!Z||Z<1048576){single(gen);return;}var count=4,chunk=Math.ceil(Z/count),data=new Uint8Array(Z),loaded=[],done=0,stopped=false,reqs=[],i;function update(){var total=0,j;for(j=0;j<loaded.length;j++)total+=loaded[j]||0;showDownload(total,Z);}\"\n        + \"function fallback(){if(gen!==GEN)return;var j;if(stopped)return;stopped=true;for(j=0;j<reqs.length;j++){try{reqs[j].abort();}catch(e){}}single(gen);}\"\n        + \"function part(index){if(gen!==GEN)return;var start=index*chunk,end=Math.min(Z-1,start+chunk-1),expected=end-start+1,x=new XMLHttpRequest();loaded[index]=0;reqs.push(x);x.open('GET',U,true);x.responseType='arraybuffer';x.setRequestHeader('Range','bytes='+start+'-'+end);x.onprogress=function(e){if(stopped||gen!==GEN)return;loaded[index]=Math.min(expected,e.loaded);update();};x.onerror=function(){if(gen!==GEN)return;fallback();};x.onload=function(){if(gen!==GEN)return;var bytes;if(stopped)return;if(x.status!==206||!x.response||x.response.byteLength!==expected){fallback();return;}bytes=new Uint8Array(x.response);data.set(bytes,start);loaded[index]=expected;done++;update();if(done===count){stopped=true;msg('正在加载视频 100%',true);try{startDecrypt(data,gen);}catch(err){msg('解析失败：'+String(err).substring(0,200),true);}}};x.send();}\"\n        + \"msg('正在加载视频 0%',true);for(i=0;i<count;i++)part(i);}\"\n        + \"function setActive(i,scroll){if(!BAR)return;var ks=BAR.children,j;for(j=0;j<ks.length;j++){ks[j].className=(j===i)?'ep-btn active':'ep-btn';}if(scroll&&ks[i]&&ks[i].scrollIntoView){try{ks[i].scrollIntoView({behavior:'smooth',inline:'center',block:'nearest'});}catch(e){try{ks[i].scrollIntoView();}catch(e2){}}}}\"\n        + \"function switchTo(i){if(i<0||i>=E.length||i===CI)return;if(typeof run!=='function'){msg('无法切换：未连接书源',true);return;}CI=i;setActive(i,true);msg('正在加载 '+E[i].t+' …',true);var code='try{fqUseSource(source);try{fqUseJava(java);}catch(e){}}catch(e){};fqVideoStreamJson('+JSON.stringify(String(E[i].id))+','+JSON.stringify(SITE)+','+JSON.stringify(TAB)+','+JSON.stringify(BOOK)+')';run(code).then(function(txt){var r=null;try{r=JSON.parse(String(txt));}catch(e){r=null;}if(!r||r.err||!r.url){msg('本集加载失败'+(r&&r.err?('：'+r.err):''),true);return;}playStream(r.url,r.keyHex,r.size);}).catch(function(e){msg('本集加载失败：'+String(e).substring(0,120),true);});}\"\n        + \"function buildBar(){if(!BAR)return;if(!E.length){BAR.style.display='none';return;}for(var i=0;i<E.length;i++){(function(ix){var b=document.createElement('span');b.className='ep-btn'+(ix===CI?' active':'');b.textContent=E[ix].t;b.addEventListener('click',function(){switchTo(ix);});BAR.appendChild(b);})(i);}setActive(CI,true);}\"\n        + \"function applyRate(){try{V.playbackRate=RATE;}catch(e){}if(RB)RB.textContent=RATE+'x';try{if(typeof run==='function'){run('try{fqUseSource(source);}catch(e){};FQ_SET(\\\"play_rate\\\",\\\"'+RATE+'\\\")');}}catch(e){}}\"\n        + \"function setPlayIcon(){if(ICP)ICP.style.display=V.paused?'block':'none';if(ICQ)ICQ.style.display=V.paused?'none':'block';}\"\n        + \"function setLockIcon(){if(IL)IL.style.display=LOCKED?'none':'block';if(IU)IU.style.display=LOCKED?'block':'none';}\"\n        + \"function showCtl(){if(CTL)CTL.style.display='flex';if(BAR)BAR.style.display='flex';if(LB)LB.style.display='flex';}\"\n        + \"function hideCtl(){if(CTL)CTL.style.display='none';if(BAR)BAR.style.display='none';if(LB)LB.style.display='none';}\"\n        + \"TAP.addEventListener('click',function(){if(LOCKED)return;if(CTL&&CTL.style.display==='none'){showCtl();}else{hideCtl();}});\"\n        + \"CTL.addEventListener('click',function(e){if(e.target===CTL){hideCtl();}});\"\n        + \"PB.addEventListener('click',function(e){e.stopPropagation();if(V.paused){var p=V.play();if(p&&p.catch)p.catch(function(){});}else{V.pause();}});\"\n        + \"PRB.addEventListener('click',function(e){e.stopPropagation();if(CI<=0){msg('已是第一集',true);setTimeout(function(){msg('');},900);return;}switchTo(CI-1);});\"\n        + \"NXB.addEventListener('click',function(e){e.stopPropagation();if(CI>=E.length-1){msg('已是最后一集',true);setTimeout(function(){msg('');},900);return;}switchTo(CI+1);});\"\n        + \"RB.addEventListener('click',function(e){e.stopPropagation();RI=(RI+1)%RATES.length;RATE=RATES[RI];applyRate();msg('倍速 '+RATE+'x',true);setTimeout(function(){msg('');},700);});\"\n        + \"LB.addEventListener('click',function(e){e.stopPropagation();LOCKED=!LOCKED;setLockIcon();if(LOCKED){if(CTL)CTL.style.display='none';if(BAR)BAR.style.display='none';if(LB)LB.style.display='flex';}else{showCtl();}});\"\n        + \"function lockOrient(o){try{if(screen.orientation&&screen.orientation.lock){var p=screen.orientation.lock(o);if(p&&p.catch)p.catch(function(){});}}catch(e){}}\"\n        + \"function isFsNow(){return !!(document.fullscreenElement||document.webkitFullscreenElement)||FS;}\"\n        + \"function onFsChange(){FS=!!(document.fullscreenElement||document.webkitFullscreenElement);}\"\n        + \"document.addEventListener('fullscreenchange',onFsChange);\"\n        + \"document.addEventListener('webkitfullscreenchange',onFsChange);\"\n        + \"function toggleRotate(){\"\n        + \"if(!isFsNow()){\"\n        + \"var el=document.documentElement;\"\n        + \"try{if(el.requestFullscreen){var p=el.requestFullscreen();if(p&&p.catch)p.catch(function(){});}\"\n        + \"else if(el.webkitRequestFullscreen){el.webkitRequestFullscreen();}\"\n        + \"else if(V.webkitEnterFullscreen){V.webkitEnterFullscreen();FS=true;}}catch(e){}\"\n        + \"setTimeout(function(){lockOrient('landscape');},350);\"\n        + \"msg('横屏播放',true);setTimeout(function(){msg('');},900);\"\n        + \"}else{\"\n        + \"lockOrient('portrait');\"\n        + \"setTimeout(function(){try{if(document.exitFullscreen){var p=document.exitFullscreen();if(p&&p.catch)p.catch(function(){});}else if(document.webkitExitFullscreen){document.webkitExitFullscreen();}else if(V.webkitExitFullscreen){V.webkitExitFullscreen();}FS=false;}catch(e){}},150);\"\n        + \"msg('竖屏播放',true);setTimeout(function(){msg('');},900);\"\n        + \"}}\"\n        + \"if(ROTB)ROTB.addEventListener('click',function(e){e.stopPropagation();toggleRotate();});\"\n        + \"V.addEventListener('play',setPlayIcon);\"\n        + \"V.addEventListener('pause',setPlayIcon);\"\n        + \"V.addEventListener('ended',function(){if(CI<E.length-1){msg('正在加载下一集…',true);switchTo(CI+1);}else{msg('已播放完最后一集',true);setTimeout(function(){msg('');},1500);}});\"\n        + \"V.addEventListener('error',function(){var e=V.error;if(e)msg('播放错误 code='+String(e.code),true);});\"\n        + \"window.addEventListener('keydown',function(e){if(e.key==='ArrowLeft')switchTo(CI-1);else if(e.key==='ArrowRight')switchTo(CI+1);});\"\n        + \"buildBar();setLockIcon();setPlayIcon();\"\n        + \"playStream(U,K,Z);\"\n        + \"window.onunload=function(){if(B)URL.revokeObjectURL(B);};})();\";\n\n    // ---- 页面 HTML ----\n    var html = '<html><head>'\n        + '<meta charset=\"utf-8\">'\n        + '<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, orientation:portrait\">'\n        + '<meta name=\"referrer\" content=\"no-referrer\">'\n        + '<title>' + String(title || '').replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;') + '</title>'\n        + '<style>'\n        + 'html,body{margin:0;width:100%;height:100%;background:#000;overflow:hidden;font-family:-apple-system,sans-serif}'\n        + 'video{position:fixed;top:0;left:0;width:100%;height:100%;object-fit:contain}'\n        + '#s{position:fixed;z-index:6;left:50%;top:50%;transform:translate(-50%,-50%);color:#fff;text-align:center;font:14px sans-serif;text-shadow:0 1px 4px #000;background:rgba(0,0,0,.55);padding:10px 16px;border-radius:8px;display:none;max-width:80%}'\n        + '#tap{position:fixed;z-index:2;left:0;top:0;right:0;bottom:0}'\n        + '#ctl{position:fixed;z-index:4;left:0;top:0;right:0;bottom:56px;display:none;align-items:center;justify-content:center;gap:16px;background:rgba(0,0,0,.25)}'\n        + '.cbtn{width:56px;height:56px;border-radius:50%;background:rgba(0,0,0,.6);border:1px solid rgba(255,255,255,.25);color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;user-select:none}'\n        + '.cbtn:active{transform:scale(.94);background:rgba(255,80,80,.7)}'\n        + '.cbtn svg{width:24px;height:24px;fill:#fff}'\n        + '.cbtn.small{width:50px;height:50px;font-size:13px;font-family:sans-serif}'\n        + '#lockBtn{position:fixed;z-index:4;right:10px;top:calc(50% + 16px);transform:translateY(-50%);width:46px;height:46px;display:none}'\n        + '#lockBtn svg{width:22px;height:22px;fill:#fff}'\n        + '#ebar{position:fixed;z-index:3;left:0;right:0;bottom:8px;height:48px;background:rgba(0,0,0,.75);display:flex;align-items:center;padding:0 8px;gap:6px;overflow-x:auto;overflow-y:hidden;scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;scrollbar-width:none;border-radius:6px}'\n        + '#ebar::-webkit-scrollbar{display:none}'\n        + '.ep-btn{flex:0 0 auto;scroll-snap-align:start;padding:4px 12px;border-radius:16px;font-size:12px;color:#ccc;background:rgba(255,255,255,.1);border:1px solid rgba(255,255,255,.15);white-space:nowrap;cursor:pointer;transition:all .2s}'\n        + '.ep-btn.active{color:#fff;background:rgba(255,80,80,.7);border-color:rgba(255,80,80,.9)}'\n        + '.ep-btn:active{transform:scale(.95)}'\n        + '</style></head><body>'\n        + '<div id=\"s\"></div>'\n        + '<video id=\"v\" playsinline webkit-playsinline></video>'\n        + '<div id=\"tap\"></div>'\n        + '<div id=\"ctl\">'\n        + '<div class=\"cbtn\" id=\"prevBtn\"><svg viewBox=\"0 0 24 24\"><path d=\"M6 6h2v12H6zm3.5 6l8.5 6V6z\"/></svg></div>'\n        + '<div class=\"cbtn\" id=\"playBtn\"><svg id=\"icPlay\" viewBox=\"0 0 24 24\"><path d=\"M8 5v14l11-7z\"/></svg><svg id=\"icPause\" viewBox=\"0 0 24 24\" style=\"display:none\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg></div>'\n        + '<div class=\"cbtn\" id=\"nextBtn\"><svg viewBox=\"0 0 24 24\"><path d=\"M6 18l8.5-6L6 6v12zM16 6v12h2V6h-2z\"/></svg></div>'\n        + '<div class=\"cbtn small\" id=\"rateBtn\">1x</div>'\n        + '<div class=\"cbtn small\" id=\"rotateBtn\"><svg viewBox=\"0 0 24 24\"><path d=\"M16.48 2.52c3.27 1.55 5.61 4.72 5.97 8.48h1.5C23.44 4.84 18.29 0 12 0l-.66.03 3.81 3.81 1.33-1.32zm-6.25-.77c-.59-.59-1.54-.59-2.12 0L1.75 8.11c-.59.59-.59 1.54 0 2.12l12.02 12.02c.59.59 1.54.59 2.12 0l6.36-6.36c.59-.59.59-1.54 0-2.12L10.23 1.75zm4.6 19.44L2.81 9.17l6.36-6.36 12.02 12.02-6.36 6.36zm-7.31.29C4.25 19.94 1.91 16.76 1.55 13H.05C.56 19.16 5.71 24 12 24l.66-.03-3.81-3.81-1.33 1.32z\"/></svg></div>'\n        + '</div>'\n        + '<div class=\"cbtn\" id=\"lockBtn\"><svg id=\"icLock\" viewBox=\"0 0 24 24\"><path d=\"M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zM9 6c0-1.66 1.34-3 3-3s3 1.34 3 3v2H9V6zm3 11c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\"/></svg><svg id=\"icUnlock\" viewBox=\"0 0 24 24\" style=\"display:none\"><path d=\"M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6h2c0-1.66 1.34-3 3-3s3 1.34 3 3v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm-6 11c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\"/></svg></div>'\n        + '<div id=\"ebar\"></div>'\n        + '<script>' + jsRun + '</script>'\n        + '</body></html>';\n\n    return html;\n}\n\n\nfunction srvAudioPlayerHtml(title, audioUrl, eps, curIdx, bookId) {\n  var epJson = \"[]\";\n  try { epJson = JSON.stringify(eps || []); } catch (e0) { }\n  epJson = epJson.replace(/</g, \"\\\\u003c\");\n  var h = \"<!DOCTYPE html><html><head><meta charset=\\\"utf-8\\\">\"\n    + \"<meta name=\\\"viewport\\\" content=\\\"width=device-width,initial-scale=1\\\">\"\n    + \"<title>\" + title + \"</title><style>\"\n    + \"body{margin:0;background:linear-gradient(180deg,#1a1a2e,#16213e);color:#fff;font-family:sans-serif;min-height:100vh}\"\n    + \"#cover{width:140px;height:140px;border-radius:16px;background:linear-gradient(135deg,#E8443A,#ff8a65);margin:30px auto 12px;display:flex;align-items:center;justify-content:center;font-size:60px}\"\n    + \"#tt{text-align:center;font-size:18px;padding:0 16px;font-weight:bold}\"\n    + \"#ct{text-align:center;font-size:13px;color:#9aa;padding:6px 0 10px}\"\n    + \"#v{width:92%;display:block;margin:0 auto}\"\n    + \"#ctl{text-align:center;padding:14px}\"\n    + \"#ctl button{background:#E8443A;border:none;color:#fff;font-size:22px;width:64px;height:64px;border-radius:50%;margin:0 10px}\"\n    + \"#ctl button.sm{background:#333;width:46px;height:46px;font-size:16px}\"\n    + \"#eps{padding:6px 10px 30px;display:flex;flex-wrap:wrap;gap:6px}\"\n    + \"#eps button{background:rgba(255,255,255,.08);color:#fff;border:1px solid rgba(255,255,255,.15);border-radius:8px;padding:8px 12px;font-size:13px}\"\n    + \"#eps button.cur{background:#E8443A;border-color:#E8443A}\"\n    + \"</style></head><body>\"\n    + \"<div id=\\'cover\\'>🎧</div>\"\n    + \"<div id=\\'tt\\'>\" + title + \"</div>\"\n    + \"<div id=\\'ct\\'>加载中…</div>\"\n    + \"<audio id=\\'v\\' src=\\'\" + audioUrl + \"\\' preload=\\'auto\\' playsinline></audio>\"\n    + \"<div id=\\'ctl\\'>\"\n    + \"<button class=\\'sm\\' onclick=\\'prevEp()\\'>⏮</button>\"\n    + \"<button id=\\'pp\\' onclick=\\'toggle()\\'>▶</button>\"\n    + \"<button class=\\'sm\\' onclick=\\'nextEp()\\'>⏭</button>\"\n    + \"</div>\"\n    + \"<div id=\\'eps\\'></div>\"\n    + \"<script>\"\n    + \"var V=document.getElementById('v'),E=\" + epJson + \",CI=\" + (curIdx || 0) + \";\"\n    + \"var pp=document.getElementById('pp'),ct=document.getElementById('ct');\"\n    + \"function fmt(s){if(!isFinite(s))return '00:00';var m=Math.floor(s/60),x=Math.floor(s%60);return (m<10?'0':'')+m+':'+(x<10?'0':'')+x;}\"\n    + \"V.addEventListener('timeupdate',function(){ct.textContent=fmt(V.currentTime)+' / '+fmt(V.duration);});\"\n    + \"V.addEventListener('playing',function(){pp.textContent='⏸';});\"\n    + \"V.addEventListener('pause',function(){pp.textContent='▶';});\"\n    + \"V.addEventListener('error',function(){ct.textContent='音频加载失败：回目录重新打开本章';});\"\n    + \"V.addEventListener('ended',function(){if(CI<E.length-1)go(CI+1);});\"\n    + \"function toggle(){if(V.paused){V.play();}else{V.pause();}}\"\n    + \"function playNow(){try{V.load();V.play();}catch(e){ct.textContent='播放失败:'+e;}}\"\n    + \"function go(i){if(i<0||i>=E.length)return;if(E[i]&&E[i].u){location.href=E[i].u;}else if(E[i]&&E[i].a){location.href=E[i].a;}}\"\n    + \"function nextEp(){go(CI+1);}\"\n    + \"function prevEp(){go(CI-1);}\"\n    + \"var box=document.getElementById('eps');\"\n    + \"for(var i=0;i<E.length;i++){(function(i){var b=document.createElement('button');\"\n    + \"b.textContent=E[i].t;if(i===CI)b.className='cur';\"\n    + \"b.onclick=function(){location.href=E[i].u;};box.appendChild(b);})(i);}\"\n    + \"setTimeout(function(){playNow();},300);\"\n    + \"<\\/script></body></html>\";\n  return h;\n}\n\n\n// ==================== UAA 有声 · 本地直连（不经服务器，用户自开代理） ====================\n// 为什么直连：UAA 是 Cloudflare 站点且对数据中心 IP 做 SNI 阻断 —— 服务器（腾讯云）与\n// 本机终端都连不上，只有用户设备开代理才能访问。所以该平台全部请求由客户端发起。\n// 已实测接口（2026-10-17，代理出口 209.9.200.205）：\n//   搜索 /api/audio/app/audio/search?...            → model.data[]\n//   详情 /api/audio/app/audio/intro?id=             → model（对象本身）\n//   目录 /api/audio/app/audio/catalog/{id}          → model.menus[]\n//   正文 /api/audio/app/audio/chapter?force=false&id={chId}&offset=0&viewId={ts} → model.url（mp3 直链）\n// 注意：正文接口会回 code=1 \"请先登录\"，但 model.url 照样返回（未登录可听）。\n// token 走 Legado 的 URL 附加头语法（\",{\\\"headers\\\":{...}}\"），避免依赖源级统一 header。\nvar UAA_HOSTS = [\"https://www.uaa001.com\", \"https://www.uaa.com\", \"https://www.uaa002.com\",\n                 \"https://www.uaa003.com\", \"https://www.uaa004.com\", \"https://www.uaa005.com\",\n                 \"https://www.uaa202410.com\"];\nfunction uaaHost() {\n    try { var h = String(srvVar()[\"uaaHost\"] || \"\"); if (h) return h.replace(/\\/+$/, \"\"); } catch (e) { }\n    return UAA_HOSTS[0];\n}\nfunction uaaToken() { try { return String(srvVar()[\"uaaToken\"] || \"\"); } catch (e) { return \"\"; } }\nfunction uaaHdr() {\n    var h = { \"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; PFJM10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\",\n              \"Accept\": \"application/json, text/plain, */*\" };\n    var t = uaaToken();\n    if (t) h[\"token\"] = t;\n    return h;\n}\n// uaaUrl: 给 Legado 直连用的 URL（带附加头）\nfunction uaaUrl(path) {\n    var u = uaaHost() + path;\n    try { return u + \",{\\\"headers\\\":\" + JSON.stringify(uaaHdr()) + \"}\"; } catch (e) { return u; }\n}\n// uaaGet: 在 @js: 里取 JSON（同样走附加头）。返回 {model:...} 或 {err:\"...\"}\nfunction uaaGet(path) {\n    var raw = \"\";\n    try { raw = String(srvJav().ajax(uaaUrl(path), 20000)); } catch (e) {\n        return { err: \"UAA 连不上（该站需自开代理）：\" + String(e) };\n    }\n    if (!raw) return { err: \"UAA 没有响应（请确认代理已开启）\" };\n    var o = null;\n    try { o = JSON.parse(raw); } catch (e2) { return { err: \"UAA 返回异常：\" + raw.substring(0, 120) }; }\n    // code=0 正常；code=1 \"请先登录\" 时正文仍可用（model.url 有值），故有 model 就放行\n    if (o && o.model === undefined && o.code !== undefined && o.code !== 0) {\n        return { err: String(o.msg || \"UAA 返回错误(\" + o.code + \")\") };\n    }\n    return o;\n}\n// uaaData: 从响应里抽数组（model.data / model 是数组 / model.menus）\nfunction uaaData(o, key) {\n    if (!o) return [];\n    var m = o.model;\n    if (m === undefined || m === null) m = o.data;\n    var t = Object.prototype.toString;\n    if (t.call(m) === \"[object Array]\") return m;\n    if (m && typeof m === \"object\") {\n        if (key && t.call(m[key]) === \"[object Array]\") return m[key];\n        if (t.call(m.data) === \"[object Array]\") return m.data;\n        if (t.call(m.menus) === \"[object Array]\") return m.menus;\n        if (t.call(m.list) === \"[object Array]\") return m.list;\n    }\n    if (t.call(o.data) === \"[object Array]\") return o.data;\n    return [];\n}\nfunction uaaItemMap(b) {\n    var id = String(b.id || b.audioId || \"\");\n    var fin = String(b.finished);\n    return {\n        name: String(b.title || b.name || \"\"),\n        author: String(b.authors || b.author || \"UAA\"),\n        kind: (fin === \"1\" ? \"完结\" : \"连载\") + (b.categories ? (\",\" + String(b.categories)) : \"\") +\n              (b.chapterCount ? (\" · \" + String(b.chapterCount) + \"集\") : \"\"),\n        wordCount: String(b.durationFormat || \"\"),\n        lastChapter: String(b.latestUpdate || b.updateTimeFormat || \"\"),\n        intro: String(b.brief || b.description || \"\"),\n        coverUrl: String(b.coverUrl || b.cover || \"\"),\n        bookUrl: (function(_id){var _u=uaaHost()+\"/api/audio/app/audio/intro?id=\"+encodeURIComponent(_id);\n                  try{ return _u+\",{\\\"headers\\\":\"+JSON.stringify({\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13; PFJM10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\",\"Accept\":\"application/json, text/plain, */*\"})+\"}\"; }\n                  catch(_e){ return _u; } })(id)\n    };\n}\nfunction uaaSearchMap(o) {\n    var arr = uaaData(o, \"data\");\n    var out = [];\n    for (var i = 0; i < arr.length; i++) {\n        var b = arr[i] || {};\n        if (!b.title && !b.name) continue;\n        out.push(uaaItemMap(b));\n    }\n    return out;\n}\n// ---- 前缀标记（贯穿书源各处路由）----\nfunction uaaIsBook(u) { return String(u || \"\").indexOf(\"uaa:\") === 0; }\nfunction uaaIsToc(u) { return String(u || \"\").indexOf(\"uaa-toc:\") === 0; }\nfunction uaaIsCh(u) { return String(u || \"\").indexOf(\"uaa-c:\") === 0; }\n// uaaInfo 详情：id 形如 \"131...,{\\\"headers\\\":...}\"（带附加头的真实 URL 传进来）\n// raw = Legado 抓到的响应体。result 为空时回退 uaaGet 兜底\nvar uuaP_shown = 0;\nfunction uaaInfoPathArg(arg) {\n    var id = String(arg || \"\");\n    // 去掉尾部的 ,{\"headers\":...} 附加段\n    var m = id.match(/^(.*?),\\s*\\{[\\s\\S]*$/);\n    return m ? m[1] : id;\n}\nfunction uaaInfo(arg, raw) {\n    var id = uaaInfoPathArg(arg);\n    var o = null;\n    if (raw && String(raw).indexOf(\"{\") >= 0) {\n        try { o = JSON.parse(String(raw)); } catch (e0) { o = null; }\n    }\n    if (!o) {\n        o = uaaGet(\"/api/audio/app/audio/intro?id=\" + encodeURIComponent(id));\n        if (o && o.err) return o;\n    }\n    var it = (o && o.model) ? o.model : o;\n    if (!it || (!it.id && !it.title)) return { err: \"UAA 详情为空\" };\n    var fin = String(it.finished);\n    return {\n        name: String(it.title || it.name || \"\"),\n        author: String(it.authors || it.author || \"UAA\"),\n        kind: (fin === \"1\" ? \"完结\" : \"连载\") + (it.categories ? (\",\" + String(it.categories)) : \"\"),\n        wordCount: String(it.durationFormat || it.wordCount || \"\"),\n        lastChapter: String(it.latestUpdate || \"\"),\n        intro: String(it.brief || it.description || \"\").substring(0, 200),\n        coverUrl: String(it.coverUrl || it.cover || \"\"),\n        tocUrl: (function(_tid){var _tu2=uaaHost()+\"/api/audio/app/audio/catalog/\"+encodeURIComponent(_tid);\n                  try{ return _tu2+\",{\\\"headers\\\":\"+JSON.stringify({\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13; PFJM10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\",\"Accept\":\"application/json, text/plain, */*\"})+\"}\"; }\n                  catch(_e2){ return _tu2; } })(String(it.id || id))\n    };\n}\n// uaaToc 目录\nfunction uaaToc(arg, raw) {\n    var id = uaaInfoPathArg(arg);\n    var o = null;\n    if (raw && String(raw).indexOf(\"{\") >= 0) {\n        try { o = JSON.parse(String(raw)); } catch (e0) { o = null; }\n    }\n    if (!o) {\n        o = uaaGet(\"/api/audio/app/audio/catalog/\" + encodeURIComponent(id));\n        if (o && o.err) return o;\n    }\n    var arr = uaaData(o, \"menus\");\n    var out = [];\n    for (var i = 0; i < arr.length; i++) {\n        var c = arr[i] || {};\n        if (!c.title && !c.name) continue;\n        out.push({\n            chapterName: String(c.title || c.name || (\"第\" + (i + 1) + \"集\")),\n            chapterUrl: (function(_cid){var _cu=uaaHost()+\"/api/audio/app/audio/chapter?force=false&id=\"+encodeURIComponent(_cid)+\"&offset=0&viewId=\"+(String(new Date().getTime())+String(Math.round(Math.random()*9000)+1000));\n                       try{ return _cu+\",{\\\"headers\\\":\"+JSON.stringify({\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13; PFJM10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\",\"Accept\":\"application/json, text/plain, */*\"})+\"}\"; }\n                       catch(_e3){ return _cu; } })(String(c.id || \"\")),\n            isVip: (String(c.vip) === \"1\" || c.vip === true || String(c.purchased) === \"true\"),\n            isVolume: false,\n            updateTime: String(c.onlineTime || \"\")\n        });\n    }\n    return out;\n}\n// uaaContent 正文（音频直链）\nfunction uaaContent(arg, raw) {\n    var viewId = String(new Date().getTime()) + String(Math.round(Math.random() * (9999 - 1000) + 1000));\n    var id = uaaInfoPathArg(arg);\n    var o = null;\n    if (raw && String(raw).indexOf(\"{\") >= 0) {\n        try { o = JSON.parse(String(raw)); } catch (e0) { o = null; }\n    }\n    if (!o) {\n        o = uaaGet(\"/api/audio/app/audio/chapter?force=false&id=\" + encodeURIComponent(id) + \"&offset=0&viewId=\" + viewId);\n        if (o && o.err) return o;\n    }\n    var it = (o && o.model) ? o.model : o;\n    var u = String((it && (it.url || it.playUrl)) || \"\");\n    if (!u) return { err: \"UAA 没有取到音频地址\" };\n    return { url: u };\n}\nfunction uaaKinds() {\n    var out = [];\n    out.push({ title: '━━ UAA有声 · 本地直连（需自开代理） ━━', type: 'text',\n               style: { layout_flexGrow: 1, layout_flexBasisPercent: 1, layout_wrapBefore: true } });\n    var cats = [['有声小说', '有声小说'], ['淫词艳曲', '淫词艳曲'], ['激情骚麦', '激情骚麦'], ['寸止训练', '寸止训练']];\n    for (var i = 0; i < cats.length; i++) {\n        out.push({ title: cats[i][1],\n                   url: uaaUrl('/api/audio/app/audio/search?category=' + encodeURIComponent(cats[i][0]) + '&page={{page}}&size=25'),\n                   style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.25 } });\n    }\n    out.push({ title: '━━ 📚 分类 ━━', type: 'text',\n               style: { layout_flexGrow: 1, layout_flexBasisPercent: 1, layout_wrapBefore: true } });\n    var more = [['全部', ''], ['短篇', 'duration=1'], ['中篇', 'duration=2'], ['长篇', 'duration=3']];\n    for (var j = 0; j < more.length; j++) {\n        out.push({ title: more[j][0],\n                   url: uaaUrl('/api/audio/app/audio/search?' + more[j][1] + (more[j][1] ? '&' : '') + 'page={{page}}&size=25'),\n                   style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.25 } });\n    }\n    out.push({ title: '━━ 🏆 榜单 ━━', type: 'text',\n               style: { layout_flexGrow: 1, layout_flexBasisPercent: 1, layout_wrapBefore: true } });\n    var ranks = [['1', '周榜'], ['2', '月榜'], ['3', '年榜'], ['4', '热门']];\n    for (var k = 0; k < ranks.length; k++) {\n        out.push({ title: ranks[k][1],\n                   url: uaaUrl('/api/audio/app/audio/rank?page={{page}}&type=' + ranks[k][0] + '&size=25'),\n                   style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.25 } });\n    }\n    return out;\n}\n\n\n// ==================== 黄果短剧 · 本地直连（不经服务器） ====================\n// [HG_DIRECT_V1734] 2026-10-21 起站点已可直连（服务器实测 3/3 域名 200），**不再需要代理**。\n// 仍保留客户端直连架构：域名池轮换 + 详情/目录/正文全部用真实 URL。\n//\n// 站点为 SSR 直出（无需 WebView），视频为 HLS m3u8（auth_key 时效签名，每集实时取、禁缓存）。\n//\n//\t搜索 /search/?keyword={key}（第1页不带 page）、&page={n}\n//\t分类 /ai-duanju/、/ai-manju/、/ai-huanlian/、/ai-mogai/，第2页起 /xxx/{n}/\n//\t上新 /newest/{n}/  推荐 /recommend/{n}/  榜单 /ranks/hot/  /ranks/recommend/\n//\t标签 /tag/{slug}/  第2页起 /tag/{slug}/page/{n}/\n//\t专题 /topics/{slug}/  第2页起 /topics/{slug}/{n}/\n//\t详情即播放页 /video/{id}/，第N集 /video/{id}/ep-{n}/\n//\t  分集 .hg-web-play__ep-grid a.hg-web-play__ep（data-ep-id=集号）\n//\t  直链 video.hg-web-play__video source[src] → HLS m3u8\n// [HG_POOL_V1732] 站点域名频繁轮换：旧主域 v8dx.ye28r31s.cc 已被 DNS 污染（TCP 全超时），\n// 换用实测可用的 *.ir95e08v.cc 域名池（同 IP），并支持「切换线路」\nvar HG_HOSTS = [\"https://kn3y83.ir95e08v.cc\", \"https://o62zl.ir95e08v.cc\", \"https://hork6.ir95e08v.cc\",\n                \"https://po5gr.ir95e08v.cc\", \"https://a2ccp.ir95e08v.cc\", \"https://rbnvfq.ir95e08v.cc\"];\nfunction hgHost() {\n    try { var h = String(srvVar()[\"hgHost\"] || \"\"); if (h) return h.replace(/\\/+$/, \"\"); } catch (e) { }\n    return HG_HOSTS[0];\n}\n// hgHostAlive: 探测某个域名是否可用（首页含卡片即通过）\nfunction hgHostAlive(h) {\n    try {\n        var r = String(srvJav().ajax(h.replace(/\\/+$/, \"\") + \"/\", 15000));\n        return r.indexOf(\"hg-drama-card\") >= 0 || r.indexOf(\"hg-list-page\") >= 0;\n    } catch (e) { return false; }\n}\n// hgRotate: 轮换到下一个可用域名并写回源变量\nfunction hgRotate() {\n    var cur = hgHost(), i0 = 0;\n    for (var i = 0; i < HG_HOSTS.length; i++) { if (HG_HOSTS[i] === cur) { i0 = i; break; } }\n    for (var k = 1; k <= HG_HOSTS.length; k++) {\n        var h = HG_HOSTS[(i0 + k) % HG_HOSTS.length];\n        if (hgHostAlive(h)) {\n            try { var o = srvVar() || {}; o.hgHost = h; srvSet(o); } catch (e1) { }\n            try { srvTo(\"已切换线路：\" + h.replace(\"https://\", \"\")); } catch (e2) { }\n            return h;\n        }\n    }\n    try { srvTo(\"所有线路都不可用，请稍后再试\"); } catch (e3) { }\n    return cur;\n}\n// hgHostAliveAll: 逐条探测（面板显示用）\nfunction hgHostAliveAll() {\n    var r = [];\n    for (var i = 0; i < HG_HOSTS.length; i++) r.push(hgHostAlive(HG_HOSTS[i]));\n    return r;\n}\nfunction hgHdr() {\n    return { \"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; SM-G998B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\" };\n}\n// hgUrl: Legado 直连 URL（带附加头）\nfunction hgUrl(path) {\n    // [HG_URL_V1734] path 可能是绝对 URL（规则直抓场景），也可能带 ,{headers} 尾巴\n    var p = String(path == null ? \"\" : path);\n    var u = (p.indexOf(\"http\") === 0) ? p : (hgHost() + p);\n    try { return u + \",{\\\"headers\\\":\" + JSON.stringify(hgHdr()) + \"}\"; } catch (e) { return u; }\n}\n// hgGet: @js: 内取 HTML（走附加头）\n// [HG_RAW_V1735] 注意：@js: 上下文里 java.ajax 不可用（java 是 JavaPackage）。\n// 规则侧一律优先用 Legado 直抓的 result（见 hgPage/hgToc/hgContent 的第二个参数）。\nfunction hgGet(path) {\n    var raw = \"\";\n    try { raw = String(srvJav().ajax(hgUrl(path), 20000)); } catch (e) {\n        return { err: \"黄果连不上：\" + String(e) };\n    }\n    if (!raw) return { err: \"黄果没有响应\" };\n    return { html: raw };\n}\n// hgJq: 用 jsoup 解析（Rhino 内 Packages.org.jsoup.Jsoup）\nfunction hgJq(html) {\n    try { return Packages.org.jsoup.Jsoup.parse(String(html)); } catch (e) { return null; }\n}\nfunction hgStrip(s) {\n    return String(s == null ? \"\" : s).replace(/[?&]auth_key=[^&]*/g, \"\").replace(/[?&]$/, \"\");\n}\nfunction hgAbs(u) {\n    u = String(u || \"\");\n    if (!u) return \"\";\n    if (u.indexOf(\"http\") === 0) return u;\n    return hgHost() + u;\n}\n// ==================== [HG_REGEX_V1736] 黄果纯正则解析（不依赖 jsoup/Rhino 包装） ====================\n// Legado 的 Rhino 里 jsoup 的 select() 命中单元素会被解包成 Element（无 .size()），\n// 用户新源那种 @js:+jsoup 写法在 Legado 内核里必崩。这里改成纯字符串正则。\nfunction hgAttr(tag, name) {\n    var re = new RegExp(name + '\\\\s*=\\\\s*\"([^\"]*)\"', 'i');\n    var m = re.exec(String(tag || ''));\n    return m ? m[1] : '';\n}\nfunction hgText(s) {\n    return String(s == null ? '' : s).replace(/<[^>]*>/g, '').replace(/&nbsp;/g, ' ')\n        .replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>')\n        .replace(/\"/g, '\"').replace(/&#39;/g, \"'\").replace(/\\s+/g, ' ').replace(/^\\s+|\\s+$/g, '');\n}\n// 按起始标签切块（对嵌套同名标签做简单深度平衡）\nfunction hgBlocks(html, startRe) {\n    var out = [], h = String(html || ''), re = new RegExp(startRe.source, 'gi'), m;\n    while ((m = re.exec(h)) !== null) {\n        var i = m.index, depth = 1, p = i + m[0].length;\n        var tagRe = new RegExp('<(/?)' + (startRe.tag || 'div') + '\\\\b[^>]*>', 'gi');\n        tagRe.lastIndex = p;\n        var t;\n        while (depth > 0 && (t = tagRe.exec(h)) !== null) {\n            if (t[1] === '/') { depth--; if (depth === 0) { p = t.index + t[0].length; break; } }\n            else depth++;\n        }\n        out.push(h.substring(i, p));\n        re.lastIndex = p;\n    }\n    return out;\n}\n// hgList: 列表页 → BookItem 数组\nfunction hgList(html) {\n    var out = [], h = String(html || '');\n    var cards = h.split(/<div class=\"hg-drama-card\"(?=[\\s>])/);\n    for (var i = 1; i < cards.length; i++) {\n        var seg = cards[i];\n        var nxt = seg.search(/<div class=\"hg-drama-card\"(?=[\\s>])/);\n        if (nxt > 0) seg = seg.substring(0, nxt);\n        var m = /\\/video\\/(\\d+)\\//.exec(seg);\n        if (!m) continue;\n        var nameM = /<(?:div|h3)[^>]*class=\"hg-drama-card__title\"[^>]*>\\s*<a[^>]*>([\\s\\S]*?)<\\/a>/i.exec(seg);\n        var name = nameM ? hgText(nameM[1]) : '';\n        name = name.replace(/全集在线观看|在线观看/g, '').replace(/\\s+/g, ' ').replace(/^\\s+|\\s+$/g, '');\n        if (!name) continue;\n        var imgM = /<img[^>]*>/i.exec(seg);\n        var cover = imgM ? hgAttr(imgM[0], 'data-src') : '';\n        if (!cover && imgM) cover = hgAttr(imgM[0], 'src');\n        var descM = /<p class=\"hg-drama-card__desc\"[^>]*>([\\s\\S]*?)<\\/p>/i.exec(seg);\n        var tags = [], tr = /class=\"hg-tag\"[^>]*>([\\s\\S]*?)<\\/a>/gi, tm;\n        while ((tm = tr.exec(seg)) !== null) {\n            var tv = hgText(tm[1]).replace(/题材短剧.*$/, '').replace(/《.*$/, '');\n            if (tv) tags.push(tv);\n        }\n        var epM = /data-ep-base=\"([^\"]*)\"/i.exec(seg);\n        var last = epM ? epM[1] : '';\n        if (!last) { var t2 = /class=\"hg-drama-card__episode\"[^>]*>([\\s\\S]*?)<\\/span>/i.exec(seg); last = t2 ? hgText(t2[1]) : ''; }\n        out.push({\n            name: name,\n            author: '',\n            kind: tags.join(','),\n            wordCount: '',\n            lastChapter: last,\n            intro: descM ? hgText(descM[1]) : '',\n            coverUrl: cover,\n            bookUrl: hgHost() + '/video/' + m[1] + '/'\n        });\n    }\n    return out;\n}\n// hgPage: 详情页（raw = Legado 直抓 HTML；无则回退 hgGet）\nfunction hgPage(id, raw) {\n    var _html = (raw && String(raw).indexOf('<') >= 0) ? String(raw) : '';\n    var r = _html ? { html: _html } : hgGet('/video/' + id + '/');\n    if (r && r.err) return r;\n    var h = String(r.html || '');\n    var tM = /<h1 class=\"hg-web-play__title\"[^>]*>([\\s\\S]*?)<\\/h1>/i.exec(h);\n    var name = tM ? hgText(tM[1]) : '';\n    var tags = [], tr = /<div class=\"hg-web-play__tags\">([\\s\\S]*?)<\\/div>/i.exec(h);\n    if (tr) {\n        var ta = /<a class=\"hg-tag\"[^>]*>([\\s\\S]*?)<\\/a>/gi, tm;\n        while ((tm = ta.exec(tr[1])) !== null) { var tv = hgText(tm[1]); if (tv) tags.push(tv); }\n    }\n    var sM = /<div class=\"[^\"]*hg-web-play__synopsis-text[^\"]*\"[^>]*>([\\s\\S]*?)<\\/div>/i.exec(h);\n    var intro = '';\n    if (sM) {\n        var ps = sM[1].match(/<p[^>]*>([\\s\\S]*?)<\\/p>/gi) || [];\n        var buf = [];\n        for (var pi = 0; pi < ps.length; pi++) buf.push(hgText(ps[pi]));\n        intro = buf.join(' ').replace(/\\s+/g, ' ').replace(/^\\s+|\\s+$/g, '');\n    }\n    var pM = /<div class=\"hg-web-play__poster\"[^>]*>([\\s\\S]*?)<\\/div>/i.exec(h);\n    var cover = '';\n    if (pM) { var iM = /<img[^>]*>/i.exec(pM[1]); if (iM) { cover = hgAttr(iM[0], 'data-src'); if (!cover) cover = hgAttr(iM[0], 'src'); } }\n    var author = '', status = '';\n    var fRe = /<div class=\"hg-web-play__fact\">([\\s\\S]*?)<\\/div>\\s*<\\/div>/gi, fm;\n    while ((fm = fRe.exec(h)) !== null) {\n        var blk = fm[1];\n        var bM = /<b>([\\s\\S]*?)<\\/b>/i.exec(blk);\n        var key = bM ? hgText(bM[1]) : '';\n        var aM = /<span[^>]*>\\s*<a[^>]*>([\\s\\S]*?)<\\/a>/i.exec(blk);\n        var spM = /<span[^>]*>([\\s\\S]*?)<\\/span>/i.exec(blk);\n        var val = aM ? hgText(aM[1]) : (spM ? hgText(spM[1]) : '');\n        if (key.indexOf('出品') >= 0 && !author) author = val;\n        if ((key.indexOf('更新状态') >= 0 || key.indexOf('发布状态') >= 0) && !status) status = val;\n    }\n    return { name: name, author: author, kind: tags.join(','), lastChapter: status, intro: intro,\n             coverUrl: cover, tocUrl: hgHost() + '/video/' + id + '/' };\n}\n// hgToc: 目录（集数）\nfunction hgToc(id, raw) {\n    var _html2 = (raw && String(raw).indexOf('<') >= 0) ? String(raw) : '';\n    var r = _html2 ? { html: _html2 } : hgGet('/video/' + id + '/');\n    if (r && r.err) return r;\n    var h = String(r.html || ''), out = [];\n    var gM = /<div class=\"hg-web-play__ep-grid\"[^>]*>([\\s\\S]*?)<\\/div>/i.exec(h);\n    var scope = gM ? gM[1] : h;\n    var aRe = /<a class=\"hg-web-play__ep[^\"]*\"[^>]*>[\\s\\S]*?<\\/a>/gi, am;\n    while ((am = aRe.exec(scope)) !== null) {\n        var tag = am[0];\n        var href = hgAttr(tag, 'href');\n        if (!href) continue;\n        var eid = hgAttr(tag, 'data-ep-id');\n        var nm = eid ? ('第' + eid + '集') : hgText(tag);\n        var abs = (href.indexOf('http') === 0) ? href : (hgHost() + href);\n        out.push({ chapterName: nm || ('第' + (out.length + 1) + '集'), chapterUrl: abs, isVip: false, isVolume: false, updateTime: '' });\n    }\n    if (out.length === 0) {\n        out.push({ chapterName: '正片', chapterUrl: hgHost() + '/video/' + id + '/', isVip: false, isVolume: false, updateTime: '' });\n    }\n    return out;\n}\n// hgContent: 正文 = HLS m3u8\nfunction hgContent(path, raw) {\n    var _html3 = (raw && String(raw).indexOf('<') >= 0) ? String(raw) : '';\n    var r = _html3 ? { html: _html3 } : hgGet(path);\n    if (r && r.err) return r;\n    var h = String(r.html || '');\n    var u = '';\n    var sM = /<source[^>]*src=\"([^\"]*\\.m3u8[^\"]*)\"/i.exec(h);\n    if (sM) u = sM[1];\n    if (!u) { var vM = /<video[^>]*src=\"([^\"]*\\.m3u8[^\"]*)\"/i.exec(h); if (vM) u = vM[1]; }\n    if (!u) { var m = /https?:\\/\\/[^\\s\"'<>]+\\.m3u8[^\\s\"'<>]*/.exec(h); if (m) u = m[0]; }\n    u = String(u).replace(/&amp;/g, '&');\n    if (!u) return { err: '黄果未取到 m3u8 直链' };\n    return { url: u };\n}\n\n// hgKinds: 发现页分类（p1 无页码、p2 起 /N/）\nfunction hgKinds() {\n    var out = [];\n    function bar(t) { out.push({ title: t, type: 'text', style: { layout_flexGrow: 1, layout_flexBasisPercent: 1, layout_wrapBefore: true } }); }\n    function cell(t, u, w) { out.push({ title: t, url: u, style: { layout_flexGrow: 1, layout_flexBasisPercent: (w || 0.25) } }); }\n    bar('━━ 黄果短剧 ━━');\n    cell('🔧 切换线路', 'js:hgRotate()', 1);\n    cell('最近上新', hgUrl('/newest<,>/{{page}}/>'), 0.5);\n    cell('热门推荐', hgUrl('/recommend<,>/{{page}}/>'), 0.5);\n    bar('━━ 📺 频道 ━━');\n    var CH = [['AI成人短剧', '/ai-duanju/'], ['AI成人漫剧', '/ai-manju/'], ['AI换脸', '/ai-huanlian/'], ['AI魔改', '/ai-mogai/']];\n    for (var i = 0; i < CH.length; i++) cell(CH[i][0], hgUrl(CH[i][1] + '<,>{{page}}/>'), 0.25);\n    bar('━━ 🏆 榜单 ━━');\n    cell('热播榜', hgUrl('/ranks/hot/'), 0.5);\n    cell('推荐榜', hgUrl('/ranks/recommend/'), 0.5);\n    bar('━━ 🏷 热门标签 ━━');\n    var TAGS = [['都市', 'dushi'], ['母子', 'muzi'], ['熟女', 'shunv'], ['校园', 'xiaoyuan'], ['奇幻', 'qihuan'], ['仙侠', 'xianxia'], ['系统', 'xitong'], ['后宫', 'hougong'], ['绿帽', 'lvmao'], ['古风', 'gufeng'], ['逆袭', 'nixi']];\n    for (var j = 0; j < TAGS.length; j++) cell(TAGS[j][0], hgUrl('/tag/' + TAGS[j][1] + '/</,page/{{page}}/>'), 0.25);\n    return out;\n}\n", "lastUpdateTime": "1792859994676", "loginUi": "@js:(function(){try{return JSON.stringify(srvPanel())||\"[]\";}catch(e){return JSON.stringify([{name:\"面板出错：\"+e,type:\"text\",style:{layout_flexGrow:1,layout_flexBasisPercent:1}}]);}})()", "loginUrl": "\n// ============ [HG_LINE_V1732] 黄果短剧线路容灾（loginUrl 独立作用域，自包含） ============\nvar HGL_HOSTS = [\"kn3y83.ir95e08v.cc\", \"o62zl.ir95e08v.cc\", \"hork6.ir95e08v.cc\",\n                 \"po5gr.ir95e08v.cc\", \"a2ccp.ir95e08v.cc\", \"rbnvfq.ir95e08v.cc\"];\nfunction hglCur() {\n    try { var o = JSON.parse(String(source.getVariable() || \"{}\")); if (o && o.hgHost) return String(o.hgHost).replace(\"https://\", \"\"); } catch (e) { }\n    return HGL_HOSTS[0];\n}\nfunction hglAlive(h) {\n    try { var r = String(java.ajax(\"https://\" + h + \"/\", 15000)); return r.indexOf(\"hg-drama-card\") >= 0 || r.indexOf(\"hg-list-page\") >= 0; } catch (e) { return false; }\n}\nfunction hgRotate() {\n    var cur = hglCur(), i0 = 0;\n    for (var i = 0; i < HGL_HOSTS.length; i++) { if (HGL_HOSTS[i] === cur) { i0 = i; break; } }\n    for (var k = 1; k <= HGL_HOSTS.length; k++) {\n        var h = HGL_HOSTS[(i0 + k) % HGL_HOSTS.length];\n        if (hglAlive(h)) {\n            try { var o = JSON.parse(String(source.getVariable() || \"{}\")); o.hgHost = h; source.setVariable(JSON.stringify(o)); } catch (e1) { }\n            try { java.longToast(\"已切换黄果线路：\" + h); } catch (e2) { }\n            return \"https://\" + h;\n        }\n    }\n    try { java.longToast(\"所有黄果线路都不可用，请稍后再试\"); } catch (e3) { }\n    return \"https://\" + cur;\n}\n\nvar SRV_BASE_P = \"http://49.232.34.177:2052\";\nvar SRV_PLATFORMS_P = [{\"id\": \"fanqie\", \"name\": \"番茄小说\", \"kind\": \"\"}, {\"id\": \"fqts\", \"name\": \"番茄听书\", \"kind\": \"audio\"}, {\"id\": \"hgds\", \"name\": \"番茄短剧\", \"kind\": \"drama\", \"textMode\": true}, {\"id\": \"hgmd\", \"name\": \"番茄漫剧\", \"kind\": \"video\"}, {\"id\": \"midu\", \"name\": \"迷度看书\", \"kind\": \"\"}, {\"id\": \"yunshu\", \"name\": \"云书斋\", \"kind\": \"\"}, {\"id\": \"mkzhan\", \"name\": \"漫客栈\", \"kind\": \"comic\"}, {\"id\": \"tingyou\", \"name\": \"听友FM\", \"kind\": \"audio\"}, {\"id\": \"suixkan\", \"name\": \"随心看\", \"kind\": \"\"}, {\"id\": \"jiuhuai\", \"name\": \"九怀小说\", \"kind\": \"\"}, {\"id\": \"qimao\", \"name\": \"七猫小说\", \"kind\": \"\"}, {\"id\": \"shuqi\", \"name\": \"书旗小说\", \"kind\": \"\"}, {\"id\": \"banshanren\", \"name\": \"搬山人小说\", \"kind\": \"adult\"}, {\"id\": \"xyshe\", \"name\": \"夜社\", \"kind\": \"adult\"}, {\"id\": \"uaa\", \"name\": \"UAA有声\", \"kind\": \"adult\", \"bkind\": \"audio\", \"direct\": true}, {\"id\": \"xiaomi\", \"name\": \"小米小说\", \"kind\": \"\"}, {\"id\": \"guazi\", \"name\": \"瓜子漫画\", \"kind\": \"comic\"}, {\"id\": \"liangzi\", \"name\": \"量子短剧\", \"kind\": \"drama\"}, {\"id\": \"shencou\", \"name\": \"SF神凑\", \"kind\": \"\"}, {\"id\": \"hg\", \"name\": \"黄果短剧\", \"kind\": \"adult\", \"bkind\": \"video\", \"direct\": true}];\nvar SRV_MODE_KEY = \"aggMode\";\nvar SRV_VER_P = \"1.7.42\";\nvar SRV_SRC_URL_P = \"http://49.232.34.177:2052/data/shuyuan/bookSource.json?t=\" + Math.floor(Date.now()/1000);\nvar SRV_P = { lastErr: \"\" };\n\nfunction srvP_src() {\n    try { if (typeof source !== \"undefined\" && source) return source; } catch (e) { }\n    try { if (java && java.getSource) { var s0 = java.getSource(); if (s0) return s0; } } catch (e) { }\n    return null;\n}\nfunction srvP_var() {\n\n    try {\n        var raw = \"\";\n        try { if (typeof cache !== \"undefined\" && cache && cache.get) raw = String(cache.get(\"syState\") || \"\"); } catch (eC) { }\n        if (!raw) {\n            var s1 = srvP_src();\n            if (s1) { try { raw = String(s1.getVariable() || \"\"); } catch (eV) { raw = \"\"; } }\n        }\n        return JSON.parse(raw || \"{}\") || {};\n    } catch (e) { return {}; }\n}\nfunction srvP_set(patch) {\n\n    if (!patch) return false;\n    var cur = {};\n    try { var raw = String(source.getLoginInfo() || \"\"); if (raw) cur = JSON.parse(raw) || {}; } catch (e0) { cur = {}; }\n    var changed = false;\n    var mark = \"\";\n    for (var k in patch) {\n        var v = patch[k];\n        if (v === undefined || v === null || String(v) === \"\") continue;\n        if (k === \"已登录\") { mark = String(v); continue; }\n\n        if (k === \"APIKey\") continue;\n        if (String(cur[k] === undefined ? \"\" : cur[k]) !== String(v)) { cur[k] = String(v); changed = true; }\n    }\n    if (mark) { try { source.put(\"sy_lg\", mark); } catch (eM) { } }\n\n    try {\n        var ui = {};\n        try {\n            var uiCur = \"\";\n            try { if (typeof cache !== \"undefined\" && cache && cache.get) uiCur = String(cache.get(\"syState\") || \"\"); } catch (eC1) { }\n            if (uiCur) ui = JSON.parse(uiCur) || {};\n        } catch (eC2) { ui = {}; }\n        var uiChanged = false;\n        for (var k2 in patch) {\n            if (k2 === \"账号\" || k2 === \"密码\" || k2 === \"昵称\" || k2 === \"已登录\") continue;\n            if (k2 === \"APIKey\") continue;\n            var v2 = patch[k2];\n            if (v2 === undefined || v2 === null) continue;\n            if (String(ui[k2] === undefined ? \"\" : ui[k2]) !== String(v2)) { ui[k2] = v2; uiChanged = true; }\n        }\n        if (uiChanged && typeof cache !== \"undefined\" && cache && cache.put) {\n            cache.put(\"syState\", JSON.stringify(ui), 31536000);\n        }\n    } catch (eU) { }\n\n    try {\n        if (typeof cache !== \"undefined\" && cache && cache.put) {\n            cache.put(\"aggCred\", JSON.stringify({\n                user: String(cur[\"账号\"] || \"\"),\n                label: String(cur[\"昵称\"] || cur[\"账号\"] || \"\")\n            }), 31536000);\n        }\n    } catch (eC) { }\n    if (!changed) return true;\n    try { return !!source.putLoginInfo(JSON.stringify(cur)); } catch (e1) { return false; }\n}\nfunction srvPKv(k, v) {\n\n    try { if (source && source.put) { source.put(\"sy_lg_\" + k, String(v)); return true; } } catch (e) { }\n    return false;\n}\nfunction srvPGv(k) {\n    try { if (source && source.get) { return String(source.get(\"sy_lg_\" + k) || \"\"); } } catch (e) { }\n    return \"\";\n}\nfunction srvP_keep() {\n\n    try { return srvP_set(srvP_inputs()); } catch (e) { }\n    return false;\n}\nfunction srvP_cred() {\n\n    var c = {};\n\n    try { var raw = String(source.getLoginInfo() || \"\"); if (raw) c = JSON.parse(raw) || {}; } catch (e1) { c = {}; }\n\n    try {\n        var g = \"\";\n        try { if (typeof cache !== \"undefined\" && cache && cache.get) g = String(cache.get(\"aggCred\") || \"\"); } catch (eG) { }\n        if (g) {\n            var o = JSON.parse(g) || {};\n            if (!c[\"账号\"] && o.user) c[\"账号\"] = o.user;\n            if (!c[\"昵称\"] && o.label) c[\"昵称\"] = o.label;\n        }\n    } catch (e0) { }\n    var m = {};\n    try { m = srvP_inputs() || {}; } catch (eM) { m = {}; }\n    var lg = \"\";\n    try { lg = String(source.get(\"sy_lg\") || \"\"); } catch (eL) { lg = \"\"; }\n\n    var ck = \"\";\n    try { if (java && java.getCookie) ck = String(java.getCookie(SRV_BASE_P) || \"\"); } catch (eC) { ck = \"\"; }\n    var hasToken = ck.indexOf(\"loomproxy_token\") >= 0;\n    var user = String(c[\"账号\"] || m[\"账号\"] || \"\");\n    var pass = String(c[\"密码\"] || m[\"密码\"] || \"\");\n    var label = String(c[\"昵称\"] || \"\");\n\n    var key = String(c[\"APIKey\"] || \"\");\n    if (!key) { try { key = String((srvP_var() || {})[\"APIKey\"] || \"\"); } catch (eK) { key = \"\"; } }\n    return { user: user, pass: pass, label: label, all: c, key: key,\n             logged: (lg === \"1\") || hasToken, panelLogin: lg === \"1\", cookie: hasToken };\n}\nfunction srvP_inputs() {\n\n    var m = {};\n    try { if (typeof result !== \"undefined\" && result) { for (var k in result) m[k] = result[k]; } } catch (e) { }\n    return m;\n}\n\nfunction srvP_statusText() {\n    var c = srvP_cred();\n\n    if (c.logged && c.user) return \"✅ 已登录：\" + (c.label || c.user) + \"（点此刷新）\";\n    if (c.panelLogin) return \"✅ 已登录（面板）—— 点此刷新\";\n    if (c.cookie) return \"✅ 已登录（用户中心，本机 Cookie 有效）—— 点此刷新\";\n\n    if (c.key) return \"✅ 已用 APIKey 授权（…\" + String(c.key).slice(-6) + \"）—— 点此刷新\";\n    if (c.user) return \"❌ 尚未登录（已记住账号 \" + c.user + \"）—— 点此刷新\";\n    return \"❌ 尚未登录 —— 不登录无法使用本书源（点此刷新）\";\n}\n\nfunction srvP_activateClick() {\n\n    var m = srvP_inputs();\n    var u = String(m[\"账号\"] || \"\").replace(/^\\s+|\\s+$/g, \"\");\n    var p = String(m[\"密码\"] || \"\");\n\n    if (!u) { try { u = String(srvP_cred().user || \"\").replace(/^\\s+|\\s+$/g, \"\"); } catch (eU) { } }\n    if (!p) { try { p = String(srvP_cred().pass || \"\"); } catch (eP) { } }\n    if (!u) { try { java.longToast(\"请先填账号（用户名或邮箱）\"); } catch (e) { } return false; }\n    if (!p) { try { java.longToast(\"请先填密码\"); } catch (e) { } return false; }\n\n    var raw = \"\";\n    var payload = JSON.stringify({ username: u, password: p });\n\n    var tried = [];\n    var opts = JSON.stringify({ method: \"POST\", body: payload,\n                                headers: { \"Content-Type\": \"application/json\" } });\n    var stopped = \"\";\n    function tryPost(fn, tag) {\n        if (stopped) return stopped;\n        try {\n            var r = String(fn());\n            tried.push(tag + \"=\" + r.substring(0, 60));\n            if (r && r.charAt(0) === \"{\") return r;\n        } catch (e) {\n            var mh = String(e).match(/(?:HTTP|status|Status|code)\\D{0,4}(\\d{3})/);\n            tried.push(tag + \"!\" + String(e).substring(0, 40));\n            if (mh && \"401|403|429|500|502|503|504\".indexOf(mh[1]) >= 0) {\n                stopped = \"__HTTP__\" + mh[1];\n                return stopped;\n            }\n        }\n        return \"\";\n    }\n    raw = tryPost(function () { return java.ajax(SRV_BASE_P + \"/auth/login\", opts); }, \"ajax2\");\n    if (!raw) raw = tryPost(function () { return java.post(SRV_BASE_P + \"/auth/login\", payload,\n                                                          { \"Content-Type\": \"application/json\" }); }, \"post\");\n    if (!raw) raw = tryPost(function () { return java.ajax(SRV_BASE_P + \"/auth/login,\" + opts); }, \"ajax1\");\n\n    if (stopped) {\n\n        var sc = stopped.replace(\"__HTTP__\", \"\");\n        var hint = sc === \"429\" ? \"尝试过于频繁（服务端登录防爆破），等提示的时间过后再试\"\n                 : sc === \"403\" ? \"账号已被禁用\"\n                 : sc === \"401\" ? \"账号或密码错误\"\n                 : \"服务器返回 HTTP \" + sc;\n        try { java.longToast(\"登录失败：\" + hint); } catch (eH) { }\n        return false;\n    }\n\n    var j = null;\n    try { j = JSON.parse(raw); } catch (e) { }\n    if (!j) {\n        try { java.longToast(\"登录请求失败，服务器返回：\" + (tried.join(\" | \") || \"(空)\")); } catch (e) { }\n        return false;\n    }\n    if (j.code !== 0) {\n        try { java.longToast(\"登录失败：\" + String(j.msg || \"账号或密码错误\")); } catch (e) { }\n        return false;\n    }\n    var user = ((j.data || {}).user) || {};\n    var nick = String(user.nickname || user.username || u);\n\n    srvP_set({ \"账号\": u, \"昵称\": nick, \"密码\": p, \"已登录\": \"1\" });\n    srvPKv(\"u\", u); srvPKv(\"p\", p); srvPKv(\"n\", nick);\n    try { java.longToast(\"登录成功：\" + nick); } catch (e) { }\n\n    srvP_repaintStatus();\n    return true;\n}\n\nfunction srvPVisWidth(s) {\n    var w = 0, t = String(s == null ? \"\" : s);\n    for (var i = 0; i < t.length; i++) {\n        var c = t.charCodeAt(i);\n        w += (c >= 0x1100 && (c <= 0x115f || c === 0x2329 || c === 0x232a ||\n            (c >= 0x2e80 && c <= 0xa4cf && c !== 0x303f) ||\n            (c >= 0xac00 && c <= 0xd7a3) || (c >= 0xf900 && c <= 0xfaff) ||\n            (c >= 0xfe30 && c <= 0xfe6f) || (c >= 0xff00 && c <= 0xff60) ||\n            (c >= 0xffe0 && c <= 0xffe6))) ? 2 : 1;\n    }\n    return w;\n}\nfunction srvPPadTo(s, width) {\n    var need = width - srvPVisWidth(s), out = \"\";\n    while (need >= 2) { out += \"　\"; need -= 2; }\n    while (need >= 1) { out += \" \"; need -= 1; }\n    return out;\n}\nfunction srvPFmtPlatforms(pl) {\n    if (!pl || !pl.length) return [];\n    var rows = [], i;\n    var nameMax = srvPVisWidth(\"合计\");\n    var numMax = 1;\n    var total = 0;\n    for (i = 0; i < pl.length; i++) {\n        var it = pl[i] || {};\n        var nm = String(it.name || it.id || \"?\");\n        var cnt = it.used || 0;\n        total += cnt;\n        var cn = String(cnt);\n        if (srvPVisWidth(nm) > nameMax) nameMax = srvPVisWidth(nm);\n        if (cn.length > numMax) numMax = cn.length;\n        rows.push({ nm: nm, cn: cn });\n    }\n    var tcn = String(total);\n    if (tcn.length > numMax) numMax = tcn.length;\n    rows.push({ nm: \"合计\", cn: tcn });\n\n    var out = [], r;\n    for (i = 0; i < rows.length; i++) {\n        r = rows[i];\n        out.push(\"　· \" + r.nm + srvPPadTo(r.nm, nameMax) + \"：\" +\n                 srvPPadTo(r.cn, numMax) + r.cn + \" 次\");\n    }\n    return out;\n}\n\nfunction srvP_key() {\n    var k = \"\";\n    try { k = String((srvP_cred() || {}).key || \"\"); } catch (e1) { k = \"\"; }\n    if (!k) { try { k = String((srvP_var() || {})[\"APIKey\"] || \"\"); } catch (e2) { k = \"\"; } }\n    return String(k).replace(/^\\s+|\\s+$/g, \"\");\n}\n\nfunction srvP_setKey(k) {\n    k = String(k || \"\").replace(/^\\s+|\\s+$/g, \"\");\n\n    try {\n        var ui = {};\n        try {\n            if (typeof cache !== \"undefined\" && cache && cache.get) {\n                ui = JSON.parse(String(cache.get(\"syState\") || \"\") || \"{}\") || {};\n            }\n        } catch (e0) { ui = {}; }\n        ui[\"APIKey\"] = k;\n        var s = JSON.stringify(ui);\n        try { if (cache && cache.put) cache.put(\"syState\", s, 31536000); } catch (e1) { }\n        try { if (java && java.put) java.put(\"sy_ui\", s); } catch (e2) { }\n    } catch (e3) { }\n\n    try {\n        var cur = {};\n        try { var raw = String(source.getLoginInfo() || \"\"); if (raw) cur = JSON.parse(raw) || {}; } catch (e4) { cur = {}; }\n        if (k) cur[\"APIKey\"] = k; else { try { delete cur[\"APIKey\"]; } catch (e5) { cur[\"APIKey\"] = \"\"; } }\n        try { source.putLoginInfo(JSON.stringify(cur)); } catch (e6) { }\n    } catch (e7) { }\n\n    try {\n        if (typeof cookie !== \"undefined\" && cookie && cookie.setCookie) {\n            cookie.setCookie(SRV_BASE_P, \"loomproxy_apikey=\" + k + \"; path=/; \" +\n                (k ? \"max-age=31536000\" : \"max-age=0\"));\n            return !!k;\n        }\n    } catch (e8) { }\n    return false;\n}\nfunction srvP_saveKey() {\n    var m = {};\n    try { m = srvP_inputs() || {}; } catch (e0) { m = {}; }\n    var k = String(m[\"APIKey\"] || \"\").replace(/^\\s+|\\s+$/g, \"\");\n    var old = srvP_key();\n    if (!k) {\n        if (!old) { try { java.longToast(\"APIKey 本来就是空的\"); } catch (e1) { } return true; }\n        srvP_setKey(\"\");\n        try { java.longToast(\"已清空 APIKey —— 回落到账号密码登录\"); } catch (e2) { }\n        return true;\n    }\n\n    var raw = \"\";\n    try { raw = String(java.ajax(SRV_BASE_P + \"/quota/dashboard?api_key=\" + k)); } catch (e3) { raw = \"\"; }\n    var j = null;\n    try { j = JSON.parse(raw); } catch (e4) { j = null; }\n    if (!j) { try { java.longToast(\"连不上服务器，密钥没有保存\"); } catch (e5) { } return true; }\n    if (j.code !== undefined && j.code !== 0) {\n        try {\n            java.longToast(\"❌ 密钥无效：\" + String(j.msg || \"服务器拒绝了它\") +\n                \"\\n到 个人中心 → API 密钥 里复制完整的 lp_… 再来\");\n        } catch (e6) { }\n        return true;\n    }\n    var cookieOk = srvP_setKey(k);\n    var q = srvP_quotaText();\n    try {\n        java.longToast(\"✅ APIKey 已保存并通过校验\" + (q ? (\"\\n\" + q) : \"\") +\n            \"\\n取数方式：\" + (cookieOk ? \"Cookie（密钥不进请求地址）\" : \"请求参数（本机阅读器不支持写 Cookie）\"));\n    } catch (e7) { }\n    return true;\n}\nfunction srvP_quotaText() {\n\n    var u = SRV_BASE_P + \"/quota/dashboard\";\n\n    try {\n        var ck0 = \"\";\n        try { if (java && java.getCookie) ck0 = String(java.getCookie(SRV_BASE_P) || \"\"); } catch (eC0) { ck0 = \"\"; }\n        var kk = srvP_key();\n        if (kk && ck0.indexOf(\"loomproxy_token\") < 0) u += \"?api_key=\" + kk;\n    } catch (eK) { }\n    var raw = \"\";\n    try { raw = String(java.ajax(u)); } catch (e) { return \"\"; }\n    if (!raw) return \"\";\n    var j = null;\n    try { j = JSON.parse(raw); } catch (e2) { return \"\"; }\n    if (!j || (j.code !== undefined && j.code !== 0) || !j.data) return \"\";\n    var arr = j.data.sources || [];\n    var me = null;\n    for (var i = 0; i < arr.length; i++) {\n        if (String(arr[i].source_code) === \"all\") { me = arr[i]; break; }\n    }\n    if (!me && arr.length) me = arr[0];\n    if (!me) return \"\";\n    var used = Number(me.used_today || 0);\n    var total = Number(me.effective_total);\n    if (!isFinite(total) || total < 0) return \"额度：\" + used + \" / 不限\";\n    return \"额度：\" + used + \"/\" + total;\n}\nfunction srvP_check() {\n    var c = srvP_cred();\n    var lines = [];\n\n    if (c.logged && c.user) lines.push(\"✅ 已登录：\" + (c.label || c.user));\n    else if (c.user) lines.push(\"❌ 尚未登录：已记住账号 \" + c.user + \"，填密码后点「登录」\");\n    else lines.push(\"❌ 尚未登录：填账号和密码后点「登录」（不登录无法使用本书源）\");\n\n    if (c.key) lines.push(\"🔑 APIKey：\" + String(c.key).slice(-6) + \"（点「保存密钥」可换/清空）\");\n    else lines.push(\"🔑 APIKey：未填（个人中心 → API 密钥 可创建，填了就不必账号密码）\");\n    var q = srvP_quotaText();\n    if (q) lines.push(q);\n    lines.push(\"服务器：\" + SRV_BASE_P);\n    lines.push(\"平台：\" + (typeof SRV_PLATFORMS_P !== \"undefined\" ? SRV_PLATFORMS_P.length : \"?\") + \" 个\");\n    try { java.longToast(lines.join(\"\\n\")); } catch (e) { }\n    return true;\n}\n\nfunction login() {\n    var c = {};\n    try { c = srvP_cred() || {}; } catch (e0) { c = {}; }\n    if (c.logged) return true;\n    var m = {};\n    try { m = srvP_inputs() || {}; } catch (e1) { m = {}; }\n    var u = String(m[\"账号\"] || c.user || \"\").replace(/^\\s+|\\s+$/g, \"\");\n    var p = String(m[\"密码\"] || c.pass || \"\");\n    if (!u || !p) return false;\n    return srvP_activateClick();\n}\n\nfunction srvReadMode() {\n    try { return String(srvP_var()[SRV_MODE_KEY] || \"\"); } catch (e) { return \"\"; }\n}\nfunction srvSetMode(id) {\n    var newId = String(id || \"\");\n    var oldId = \"\";\n    try { oldId = String(srvP_var()[SRV_MODE_KEY] || \"\"); } catch (e0) { oldId = \"\"; }\n\n    srvP_set({ \"aggMode\": newId });\n    try { var sv = JSON.parse(String(source.getVariable() || \"\") || \"{}\") || {}; sv.aggMode = newId; sv.aggPlatform = newId; source.setVariable(JSON.stringify(sv)); } catch (eS) { }\n\n    try {\n        if (java && java.upLoginData) {\n\n            var patch = {};\n            var kindNow = srvReadKindP();\n            var allName = srvKindName(kindNow) + \"（全部）\";\n            patch[\"✅ \" + allName] = allName;\n            for (var i = 0; i < SRV_PLATFORMS_P.length; i++) {\n                var pl = SRV_PLATFORMS_P[i];\n                if (!srvPlatOfKind(pl, kindNow)) continue;\n                patch[\"✅ \" + pl.name] = pl.name;\n            }\n            if (newId) {\n                var nn = srvPlatName(newId);\n                if (nn) patch[nn] = \"✅ \" + nn;\n            } else {\n                patch[allName] = \"✅ \" + allName;\n            }\n            java.upLoginData(patch);\n        }\n    } catch (e1) { }\n\n    try { java.longToast(\"已切到 \" + (srvPlatName(newId) || \"该平台\") + \"，刷新发现页生效\"); } catch (e2) { }\n    try { source.refreshExplore(); } catch (e3) { }\n}\n\nfunction srvP_onlineVer() {\n\n    var u = \"\";\n    try { u = String(typeof SRV_SRC_URL_P !== \"undefined\" && SRV_SRC_URL_P ? SRV_SRC_URL_P : \"\"); } catch (e0) { u = \"\"; }\n    if (!u) return \"\";\n    var raw = \"\";\n    try { raw = String(java.ajax(u)); } catch (e1) { return \"\"; }\n    if (!raw) return \"\";\n    var j = null;\n    try { j = JSON.parse(raw); } catch (e2) { return \"\"; }\n    var s = null;\n    if (j && j.length && j[0]) s = j[0];\nelse if (j && j.bookSourceComment) s = j;\n    if (!s) return \"\";\n    var c = String(s.bookSourceComment || \"\");\n    var i = c.indexOf(\"v1.\");\n    if (i < 0) return \"\";\n    var out = \"\";\n    for (var k = i; k < c.length; k++) {\n        var ch = c.charAt(k);\n        if (ch === \"v\" || ch === \".\" || (ch >= \"0\" && ch <= \"9\")) out += ch; else break;\n    }\n    return out;\n}\nfunction srvP_checkSrc() {\n\n    var mine = \"v\" + (typeof SRV_VER_P !== \"undefined\" ? SRV_VER_P : \"?\");\n    var online = srvP_onlineVer();\n    var tip = \"\";\n    if (!online) tip = \"⚠️ 拿不到线上版本\\n本机：\" + mine + \"\\n（检查网络后再点一次）\";\n    else if (online === mine) tip = \"✅ 已是最新版：\" + mine;\n    else tip = \"⚠️ 不是最新版\\n本机：\" + mine + \"\\n线上：\" + online + \"\\n\\n点「更新书源」重新导入\";\n    try { java.longToast(tip); } catch (e) { }\n    return true;\n}\nfunction srvP_updSrc() {\n\n    var online = srvP_onlineVer();\n    var mine = \"v\" + (typeof SRV_VER_P !== \"undefined\" ? SRV_VER_P : \"?\");\n    var tip = \"更新书源\" + (online ? \"（线上 \" + online + \"，本机 \" + mine + \"）\" : \"\");\n    try { java.longToast(tip); } catch (eT) { }\n    var u = String(typeof SRV_SRC_URL !== \"undefined\" && SRV_SRC_URL ? SRV_SRC_URL : SRV_SRC_URL_P);\n    if (!u) { try { java.longToast(\"没有配置书源更新地址\"); } catch (e) { } return false; }\n    var deep = \"legado://import/bookSource?src=\" + encodeURIComponent(u);\n    try { java.openUrl(deep); return true; } catch (e) { }\n    try { java.startBrowser(u, tip); return true; } catch (e2) {\n        try { java.longToast(\"打不开导入界面，请手动打开：\" + u); } catch (e3) { }\n    }\n    return false;\n}\n\nfunction srvRowsStatic() {\n    var G = 1;\n    var M = 0.4;\n    var K = 0.6;\n    var S = 0.3;\n    var c = srvP_cred();\n\n    var v = {};\n    try { v = srvP_var() || {}; } catch (eV) { v = {}; }\n    return [\n\n        { name: \"👤 用户中心\", type: \"button\", action: \"srvP_keep();srvP_userCenter()\",\n          style: { layout_flexGrow: G, layout_flexBasisPercent: G } },\n\n        { name: \"APIKey\", type: \"password\", default: String(c.key || \"\"),\n          style: { layout_flexGrow: K, layout_flexBasisPercent: K } },\n        { name: \"保存密钥\", type: \"button\", action: \"srvP_keep();srvP_saveKey()\",\n          style: { layout_flexGrow: S, layout_flexBasisPercent: S } },\n        { name: \"账号\", type: \"text\", default: String(c.user || \"\"),\n          style: { layout_flexGrow: G, layout_flexBasisPercent: G } },\n        { name: \"密码\", type: \"password\", default: String(c.pass || \"\"),\n          style: { layout_flexGrow: G, layout_flexBasisPercent: G } },\n        { name: \"登录\", type: \"button\", action: \"srvP_keep();srvP_activateClick()\",\n          style: { layout_flexGrow: M, layout_flexBasisPercent: M } },\n        { name: \"检验\", type: \"button\", action: \"srvP_keep();srvP_check()\",\n          style: { layout_flexGrow: M, layout_flexBasisPercent: M } },\n        { name: \"检验书源\", type: \"button\", action: \"srvP_keep();srvP_checkSrc()\",\n          style: { layout_flexGrow: M, layout_flexBasisPercent: M } },\n        { name: \"更新书源\", type: \"button\", action: \"srvP_keep();srvP_updSrc()\",\n          style: { layout_flexGrow: M, layout_flexBasisPercent: M } },\n\n        { name: \"今日热搜\", type: \"button\", action: \"srvP_keep();srvHotPage()\",\n          style: { layout_flexGrow: G, layout_flexBasisPercent: G } },\n        { name: \"小说模式\", type: \"button\", action: \"srvP_keep();srvKindPage('')\",\n          style: { layout_flexGrow: M, layout_flexBasisPercent: M } },\n        { name: \"听书模式\", type: \"button\", action: \"srvP_keep();srvKindPage('audio')\",\n          style: { layout_flexGrow: M, layout_flexBasisPercent: M } },\n        { name: \"短剧模式\", type: \"button\", action: \"srvP_keep();srvKindPage('drama')\",\n          style: { layout_flexGrow: M, layout_flexBasisPercent: M } },\n        { name: \"漫画模式\", type: \"button\", action: \"srvP_keep();srvKindPage('comic')\",\n          style: { layout_flexGrow: M, layout_flexBasisPercent: M } },\n        { name: \"我要变强\", type: \"button\", action: \"srvP_keep();srvKindPage('adult')\",\n          style: { layout_flexGrow: M, layout_flexBasisPercent: M } }\n    ];\n}\n\nfunction srvP_repaintStatus() {\n\n    try {\n        var oldText = \"\";\n        try { oldText = String(source.get(\"sy_st\") || \"\"); } catch (e0) { oldText = \"\"; }\n        var newText = srvP_statusText();\n        if (newText) { try { source.put(\"sy_st\", newText); } catch (e1) { } }\n        if (!oldText || oldText === newText) return false;\n        if (!java || !java.upLoginData) return false;\n        var patch = {};\n        patch[oldText] = newText;\n        java.upLoginData(patch);\n        return true;\n    } catch (e) { }\n    return false;\n}\nfunction srvHotPage() {\n\n    var on = \"\";\n    try { on = String(srvP_var()[\"aggHot\"] || \"\"); } catch (e0) { on = \"\"; }\n    var next = (on === \"1\") ? \"\" : \"1\";\n    if (next === \"1\") {\n        srvP_set({ \"aggHot\": \"1\" });\n    } else {\n        srvP_set({ \"aggHot\": \"\", \"aggKind\": \"\", \"aggMode\": \"\" });\n    }\n    try {\n        java.longToast(next ? \"已打开今日热搜，刷新发现页查看\"\n                            : \"已退出今日热搜，回到小说模式\");\n    } catch (e1) { }\n    srvP_refresh();\n    return true;\n}\nfunction srvPanel() {\n    srvP_keep();\n    var rows = srvRowsStatic();\n    var out = [];\n    var i;\n    if (rows.length) out.push(rows[0]);\n    /* [HG_LINE_V1732] 黄果短剧线路容灾（打不开就点切换） */\n    try {\n        out.push({ name: \"🔧 黄果线路（打不开就点切换）\", type: \"button\", action: \"hgRotate()\",\n                   style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } });\n        out.push({ name: \"当前黄果线路：\" + hglCur() + \"（共 \" + HGL_HOSTS.length + \" 条）\", type: \"text\",\n                   style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } });\n    } catch (eHG) { }\n    var _st = srvP_statusText();\n\n    try { source.put(\"sy_st\", _st); } catch (eS) { }\n    out.push({ name: _st, type: \"button\", action: \"srvP_check()\",\n               style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } });\n\n    var page = \"\";\n    try { page = String(srvP_var()[\"panelPage\"] || \"\"); } catch (e) { page = \"\"; }\n    if (page === \"plat\") {\n        var kind = srvReadKindP();\n        var mode = srvReadMode();\n        out.push({ name: \"← 返回\", type: \"button\", action: \"srvPage('')\",\n                   style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } });\n        if (kind !== \"adult\") {\n            out.push({ name: (!mode ? \"✅ \" : \"\") + srvKindName(kind) + \"（全部）\", type: \"button\",\n                       action: \"srvKindAll('\" + String(kind || \"\") + \"')\",\n                       style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } });\n        }\n        var n = 0;\n        for (i = 0; i < SRV_PLATFORMS_P.length; i++) {\n            var pl = SRV_PLATFORMS_P[i];\n            if (!srvPlatOfKind(pl, kind)) continue;\n            n++;\n            out.push({ name: (mode === pl.id ? \"✅ \" : \"\") + pl.name, type: \"button\",\n                       action: \"srvSetMode('\" + pl.id + \"')\",\n                       style: { layout_flexGrow: 0.4, layout_flexBasisPercent: 0.4 } });\n        }\n        if (!n) out.push({ name: \"这一类暂时没有平台\", type: \"button\", action: \"\",\n                           style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } });\n        return out;\n    }\n\n    var kindNow = srvReadKindP();\n    var isAudio = (kindNow === \"audio\"), isDrama = (kindNow === \"drama\");\n    var isComic = (kindNow === \"comic\"), isAdult = (kindNow === \"adult\");\n    var isText = (!isAudio && !isDrama && !isComic && !isAdult);\n    for (i = 1; i < rows.length; i++) {\n        var r = rows[i];\n        var hit = false;\n        if (r.type === \"button\") {\n            if (isText && String(r.action || \"\").indexOf(\"srvKindPage('')\") >= 0) hit = true;\n            else if (isAudio && String(r.action || \"\").indexOf(\"srvKindPage('audio')\") >= 0) hit = true;\n            else if (isDrama && String(r.action || \"\").indexOf(\"srvKindPage('drama')\") >= 0) hit = true;\n            else if (isComic && String(r.action || \"\").indexOf(\"srvKindPage('comic')\") >= 0) hit = true;\n            else if (isAdult && String(r.action || \"\").indexOf(\"srvKindPage('adult')\") >= 0) hit = true;\n        }\n        if (hit) out.push({ name: \"✅ \" + r.name, type: r.type, action: r.action, style: r.style });\n        else out.push(r);\n    }\n    return out;\n}\n\nfunction srvP_refresh() {\n    var f = function () {\n        try { java.refreshExplore(); } catch (e) { }\n        try { if (source && source.refreshExplore) source.refreshExplore(); } catch (e) { }\n    };\n    try { if (java.postDelayed) { java.postDelayed(f, 120); return; } } catch (e) { }\n    try { if (typeof setTimeout === \"function\") { setTimeout(f, 120); return; } } catch (e) { }\n    try { f(); } catch (e) { }\n}\n\nfunction srvPage(p) {\n    srvP_set({ \"panelPage\": String(p || \"\") });\n    srvP_refresh();\n}\nfunction srvReadKindP() {\n\n    var k = \"\";\n    try { k = String(srvP_var()[\"aggKind\"] || \"\"); } catch (e) { return \"\"; }\n    if (k === \"audio\" || k === \"drama\" || k === \"comic\" || k === \"adult\") return k;\n    return \"\";\n}\nfunction srvSetKind(k) {\n    srvP_set({ \"aggKind\": String(k || \"\"), \"aggMode\": \"\", \"panelPage\": \"\" });\n    try { java.longToast(\"已切到\" + (k ? \"听书\" : \"小说\") + \"模式，刷新发现页生效\"); } catch (e) { }\n    srvP_refresh();\n    try { source.refreshExplore(); } catch (e) { }\n}\nfunction srvKindName(k) {\n    var s = String(k || \"\");\n    if (s === \"audio\") return \"听书\";\n    if (s === \"drama\") return \"短剧\";\n    if (s === \"comic\") return \"漫画\";\n    if (s === \"adult\") return \"我要变强\";\n    return \"小说\";\n}\nfunction srvKindAll(k) {\n    srvP_set({ \"aggKind\": String(k || \"\"), \"aggMode\": \"\", \"panelPage\": \"plat\" });\n    try { java.longToast(\"已切到\" + srvKindName(k) + \"（全部），刷新发现页生效\"); } catch (e) { }\n    srvP_refresh();\n    try { source.refreshExplore(); } catch (e2) { }\n}\nfunction srvPlatOfKind(pl, kind) {\n    var pk = String((pl && pl.kind) || \"\");\n    return pk === String(kind || \"\");\n}\n\nfunction srvKindPage(k) {\n    srvP_set({ \"aggKind\": String(k || \"\"), \"aggMode\": \"\", \"panelPage\": \"plat\" });\n    srvP_refresh();\n}\n\nfunction srvP_userCenter() {\n    var url = SRV_BASE_P + \"/panel\";\n    try { if (java.startBrowser) { java.startBrowser(url, \"用户中心\"); return true; } } catch (e) { }\n    try { if (java.openUrl) { java.openUrl(url); return true; } } catch (e2) { }\n    try { java.longToast(\"打不开浏览器，请手动访问：\" + url); } catch (e3) { }\n    return false;\n}\n", "respondTime": 180000, "ruleBookInfo": {"author": "$.author", "coverUrl": "$.coverUrl", "init": "@js:(function(){var _bu=String(book.bookUrl||\"\");var _hm=/\\/video\\/(\\d+)/.exec(_bu);\nif(_hm||_bu.indexOf(\"hg:\")===0){var _hid=_hm?_hm[1]:_bu.substring(3);var _hi=hgPage(_hid,result);if(_hi&&_hi.err){return JSON.stringify({intro:\"【黄果】\"+_hi.err});}try{book.type=4;}catch(eT10){}return JSON.stringify({name:_hi.name||\"\",author:_hi.author||\"\",kind:_hi.kind||\"\",wordCount:\"\",lastChapter:_hi.lastChapter||\"\",intro:String(_hi.intro||\"\").substring(0,200),coverUrl:_hi.coverUrl||\"\",tocUrl:_hi.tocUrl||\"\"});}if(_bu.indexOf(\"/api/audio/app/audio/intro?\")>0||_bu.indexOf(\"uaa:\")===0){var _uaI=_bu.indexOf(\"uaa:\") === 0 ? _bu.substring(4) : _bu;var _ui=uaaInfo(_uaI,result);if(_ui&&_ui.err){return JSON.stringify({intro:\"【UAA】\"+_ui.err});}try{book.type=32;}catch(eT8){}return JSON.stringify({name:_ui.name||\"\",author:_ui.author||\"\",kind:_ui.kind||\"\",wordCount:_ui.wordCount||\"\",lastChapter:_ui.lastChapter||\"\",intro:String(_ui.intro||\"\").substring(0,200),coverUrl:_ui.coverUrl||\"\",tocUrl:_ui.tocUrl||\"\"});}if(_bu.indexOf(\"alice:\")===0){var _p=_bu.substring(6);var _inf=aliceInfo(_p);var _kind7=\"\",_t7=false;for(var _p7=0;_p7<SRV_PLATFORMS.length;_p7++){if(SRV_PLATFORMS[_p7].id===\"alice\"){_kind7=String(SRV_PLATFORMS[_p7].kind||\"\");break;}}try{if(_kind7===\"adult\"){book.type=8;}}catch(eT7){}return JSON.stringify({name:_inf.name||\"\",author:_inf.author||\"\",kind:_inf.kind||\"\",wordCount:\"\",lastChapter:\"\",intro:String(_inf.intro||\"\"),coverUrl:_inf.coverUrl||\"\",tocUrl:\"alice-toc:\"+(_inf.tocPath||_p)});}try{var j=JSON.parse(String(result));var d=(j&&j.data)?j.data:(j||{});var i=d.info||{};if(j&&j.ok===false){throw new Error(String(j.err||j.msg||\"未登录\"));}return JSON.stringify({name:i.name||\"\",author:i.author||\"\",kind:i.kind||i.category||\"\",wordCount:i.wordCount||\"\",lastChapter:i.lastChapter||\"\",intro:String(i.intro||\"\").substring(0,200),coverUrl:i.coverUrl||\"\",tocUrl:(function(){var bu=String(book.bookUrl||\"\");var bm=bu.match(/platform=([^&]+)/);var plat=(bm&&bm[1])?bm[1]:\"fanqie\";var kind7=\"\",tmode7=false;for(var p7=0;p7<SRV_PLATFORMS.length;p7++){if(SRV_PLATFORMS[p7].id===plat){kind7=String(SRV_PLATFORMS[p7].kind||\"\");tmode7=(SRV_PLATFORMS[p7].textMode===true);break;}}try{if(kind7===\"audio\"){book.type=32;java.log(\"[info] setType=32 \"+plat);}else if(kind7===\"video\"){book.type=4;java.log(\"[info] setType=4 \"+plat);}else if(kind7===\"drama\"&&!tmode7){book.type=4;java.log(\"[info] setType=4(drama) \"+plat);}else if(kind7===\"comic\"){book.type=64;}\n/* [HG_ADULT_V1733] 同上：黄果短剧媒介=视频 */\nif(String(plat)===\"hg\"){book.type=4;java.log(\"[info] setType=4(hg adult) \"+plat);}}catch(eT){}var im=bu.match(/[?&]id=([^&]+)/);var bid=(im&&im[1])?im[1]:\"\";var kq1=\"\";try{kq1=srvKeyQ();}catch(eK1){}return srvBase()+\"/public/\"+plat+\"/chapter?id=\"+encodeURIComponent(bid)+\"&platform=\"+plat+kq1;})()});}catch(e){return JSON.stringify({intro:\"详情解析失败:\"+e})}})()", "intro": "$.intro", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name", "tocUrl": "$.tocUrl", "wordCount": "$.wordCount"}, "ruleContent": {"content": "@js:(function(){var _cu=\"\";try{_cu=String(chapter.url||\"\");}catch(eC0){}if(/\\/video\\/\\d+\\//.test(_cu)||_cu.indexOf(\"hg-c:\")===0){var _hcPath=(_cu.indexOf(\"hg-c:\")===0)?_cu.substring(5):_cu;var _hc=hgContent(_hcPath,result);if(_hc&&_hc.err){return \"【黄果】\"+_hc.err;}return String(_hc.url||\"\");}if(_cu.indexOf(\"/api/audio/app/audio/chapter?\")>0||_cu.indexOf(\"uaa-c:\")===0){var _ucArg=_cu.indexOf(\"uaa-c:\")===0 ? _cu.substring(6) : _cu;var _uc=uaaContent(_ucArg,result);if(_uc&&_uc.err){return \"【UAA】\"+_uc.err;}return String(_uc.url||\"\");}if(_cu.indexOf(\"alice-c:\")===0){return aliceContent(_cu.substring(8));}try{var j=JSON.parse(String(result));var d=(j&&j.data)?j.data:(j||{});if(j&&j.ok===false&&!d.content&&!d.url){throw new Error(String(j.err||j.msg||\"未登录\"));}var ct=String(d.contentType||\"text\");var bu=String(book.bookUrl||\"\");var bm=bu.match(/platform=([^&]+)/);var plat=(bm&&bm[1])?bm[1]:\"\";/* [LZ_DIRECT_V1730] 量子短剧=苹果CMS m3u8 明文直链（无 keyHex），与本地源同形态：\n   直接交给 Legado 原生播放器。套 fqCencPlayerHtml 弹页是给番茄 CENC 加密 mp4 用的，\n   m3u8 进去必挂（用户报「播放不了」）。判据用平台名 + m3u8 双保险（plat 提取失败也兜住）。 */\nvar _lzU=String(d.url||d.content||\"\");\nif(ct===\"video\"&&!String(d.keyHex||\"\")&&(plat===\"liangzi\"||_lzU.indexOf(\".m3u8\")>=0)){return _lzU;}\n/* [VID_PLATS] 需自定义播放页的平台：番茄短剧/漫剧 + 黄果短剧（CENC 加密 mp4）。 */\nvar VID_PLATS={hgds:1,hgmd:1,hg:1};\nif(ct===\"video\"||VID_PLATS[plat]===1){var vu=String(d.url||d.content||\"\");var kh=String(d.keyHex||\"\");var sz=Number(d.size)||0;if(!vu)return \"视频流解析失败，回目录重开本章\";var isCur=true;try{isCur=(String(book.durChapterUrl||\"\")===String(chapter.url||\"\"))||(book.durChapterIndex===chapter.index);}catch(eG){isCur=false;}if(!isCur)return vu;var bname=String((book&&book.name)||\"视频\");var tab9=(plat===\"hgmd\")?\"13\":((plat===\"hgds\")?\"10\":String(d.tab||\"10\"));var bm9=String((book&&book.bookUrl)||\"\").match(/[?&]id=([^&]+)/);var bid9=(bm9&&bm9[1])?bm9[1]:\"\";var kq3=\"\";try{kq3=srvKeyQ();}catch(eK3){}var curId=String((chapter&&chapter.url)?chapter.url:\"\");var mC=/[?&]id=([^&]+)/.exec(curId);if(mC)curId=decodeURIComponent(mC[1]);var eps=[],curIdx=0;try{var tu=srvBase()+\"/public/\"+plat+\"/chapter?id=\"+encodeURIComponent(bid9)+\"&platform=\"+plat+kq3;var tj=JSON.parse(String(java.ajax(tu)));var tarr=((tj.data||{}).toc)||[];for(var ti=0;ti<tarr.length;ti++){var tc=tarr[ti]||{};var tid=String(tc.itemId||tc.u||\"\");if(!tid)continue;var tt=String(tc.n||tc.title||(\"第\"+(ti+1)+\"集\"));var tw=srvBase()+\"/public/\"+plat+\"/content?url=\"+encodeURIComponent(tid)+\"&platform=\"+plat+(bid9?(\"&bid=\"+encodeURIComponent(bid9)):\"\");if(String(tid)===String(curId))curIdx=eps.length;eps.push({id:tid,t:tt,u:tw});}}catch(eE){eps=[];}try{var html=fqCencPlayerHtml(bname,vu,kh,sz,eps,curIdx,\"\",tab9,bid9,Number(FQ_GET(\"play_rate\"))||1);java.startBrowser(\"about:blank\",bname,html);}catch(eP){return \"播放页启动失败:\"+eP;}return \"▶ 播放中：\"+bname;}var cu9=\"\";try{cu9=String(chapter.url||\"\");}catch(e9){}var isTy=(plat===\"tingyou\")||cu9.indexOf(\"platform=tingyou\")>=0||cu9.indexOf(\"/public/tingyou/\")>=0;if(isTy){var rid9=\"\";try{var mm9=/[?&]url=([^&]+)/.exec(cu9);if(mm9)rid9=decodeURIComponent(mm9[1]);}catch(e10){}var p9=srvProxyUrl(String(d.url||d.content||\"\"));if(rid9)p9+=(p9.indexOf(\"?\")>=0?\"&\":\"?\")+\"r=\"+encodeURIComponent(rid9);return p9;}if(ct===\"audio\"||plat===\"fqts\"){return srvProxyUrl(String(d.url||d.content||\"\"));}var _ct=String(d.content||d.text||\"\");if(plat===\"mkzhan\"){_ct=_ct.replace(/(<img[^>]*src=\")https?:\\/\\/([^\\\"]+)/g,function(m0,p0,rest){return p0+srvProxyUrl(\"https://\"+rest);});}return _ct;}catch(e){return \"正文解析失败:\"+e}})()", "imageStyle": "FULL", "nextContentUrl": "@js:(function(){try{var u=String(chapter&&chapter.url||\"\");var m=/[?&]next=([^&]+)/.exec(u);if(!m)return \"\";var nxt=decodeURIComponent(m[1]);var bm=/platform=([^&]+)/.exec(u);var plat=(bm&&bm[1])?bm[1]:\"fqts\";var bb=/[?&]bid=([^&]+)/.exec(u);var bid=(bb&&bb[1])?bb[1]:\"\";return srvBase()+\"/public/\"+plat+\"/content?url=\"+encodeURIComponent(nxt)+\"&platform=\"+plat+(bid?(\"&bid=\"+encodeURIComponent(bid)):\"\")+\"&next=\";}catch(e){return \"\"}})()"}, "ruleExplore": {"author": "author", "bookList": "@js:srvExploreList(result,{java:java,source:source,cache:cache})", "bookUrl": "bookUrl", "coverUrl": "coverUrl", "intro": "intro", "kind": "kind", "lastChapter": "lastChapter", "name": "name", "wordCount": "wordCount"}, "ruleSearch": {"author": "author", "bookList": "@js:srvSearchList(result,{java:java,source:source,cache:cache})", "bookUrl": "bookUrl", "coverUrl": "coverUrl", "intro": "intro", "kind": "kind", "lastChapter": "lastChapter", "name": "name", "wordCount": "wordCount"}, "ruleToc": {"chapterList": "@js:(function(){var _tu=String(book.tocUrl||\"\");var _ht2=/\\/video\\/(\\d+)/.exec(_tu);\nif(_ht2||_tu.indexOf(\"hg-toc:\")===0){var _htid=_ht2?_ht2[1]:_tu.substring(7);var _ht=hgToc(_htid,result);if(_ht&&_ht.err){return [{chapterName:\"【黄果】\"+_ht.err,chapterUrl:\"\",isVolume:true}];}try{book.type=4;}catch(eT11){}return _ht;}if(_tu.indexOf(\"/api/audio/app/audio/catalog/\")>0||_tu.indexOf(\"uaa-toc:\")===0){var _uaArg=_tu.indexOf(\"uaa-toc:\")===0 ? _tu.substring(8) : _tu;var _ua=uaaToc(_uaArg,result);if(_ua&&_ua.err){return [{chapterName:\"【UAA】\"+_ua.err,chapterUrl:\"\",isVolume:true}];}try{book.type=32;}catch(eT9){}return _ua;}if(_tu.indexOf(\"alice-toc:\")===0){var _arr=aliceToc(_tu.substring(10));try{book.type=8;}catch(e8){}var _out=[];for(var _i=0;_i<_arr.length;_i++){var _c=_arr[_i];_out.push({chapterName:_c.n,chapterUrl:\"alice-c:\"+_c.u,isVip:false,isVolume:false,updateTime:\"\"});}return _out;}try{var j=JSON.parse(String(result));var d=(j&&j.data)?j.data:(j||{});var arr=d.toc||d.chapterList||[];if(!arr.length&&j&&j.ok===false){throw new Error(String(j.err||j.msg||\"未登录\"));}var bm=String(book.bookUrl||\"\").match(/platform=([^&]+)/);var plat=(bm&&bm[1])?bm[1]:\"fanqie\";var bidRaw=\"\";var bm2=String(book.bookUrl||\"\").match(/[?&]id=([^&#]+)/);if(bm2)bidRaw=bm2[1];var kind=\"\",tmode=false;for(var pi=0;pi<SRV_PLATFORMS.length;pi++){if(SRV_PLATFORMS[pi].id===plat){kind=String(SRV_PLATFORMS[pi].kind||\"\");tmode=(SRV_PLATFORMS[pi].textMode===true);break;}}if(kind===\"audio\"){book.type=32;}else if(kind===\"video\"){book.type=4;}else if(kind===\"drama\"&&!tmode){book.type=4;}else if(kind===\"comic\"){book.type=64;}\n/* [HG_ADULT_V1733] 黄果短剧 kind=adult（移入「我要变强」）但媒介是视频，不补这句会落默认 8（文本）→ 裸 URL */\nif(String(plat)===\"hg\"){book.type=4;}var out=[];for(var i=0;i<arr.length;i++){var c=arr[i]||{};var cu=String(c.u||c.itemId||c.url||\"\");if(!cu)continue;var w=srvBase()+\"/public/\"+plat+\"/content?url=\"+encodeURIComponent(cu)+\"&platform=\"+plat+(bidRaw?(\"&bid=\"+encodeURIComponent(bidRaw)):\"\")+(function(){try{return srvKeyQ();}catch(eQ){return \"\";}})();if(kind===\"audio\"||(plat===\"uaa\")){var nx=\"\";for(var nj=i+1;nj<arr.length;nj++){var ncn=String((arr[nj]||{}).u||(arr[nj]||{}).itemId||\"\");if(ncn){nx=ncn;break;}}if(nx)w=w+\"&next=\"+encodeURIComponent(nx);}out.push({chapterName:String(c.n||c.title||\"\"),chapterUrl:w,isVip:c.i===true||c.isVip===true,isVolume:c.v===true,updateTime:String(c.t||\"\")});}return out;}catch(e){return [{chapterName:\"目录解析失败:\"+e,chapterUrl:\"\",isVolume:true}]}})()", "chapterName": "chapterName", "chapterUrl": "chapterUrl", "isVip": "isVip", "isVolume": "isVolume", "updateTime": "updateTime"}, "searchUrl": "@js:srvSearch(key,page,{java:java,source:source,cache:cache})", "weight": 0},{"bookSourceComment": "// ===== 哔咔漫画 自包含书源 v84 =====\n// 官方 App 接口 picaapi.picacomic.com，\n// 签名：HMAC-SHA256(path+time+nonce+method+apiKey, secret)，raw 转小写\n//\n// 【重要】本站已强制登录：未登录时连 categories 都返回 401 error 1005\n// 首次使用：长按书源→登录→填账号密码→点「🔑登录」\n//\n// 【v84 新增 1：封面修复】\n// 根因：封面走 Glide（OkHttpStreamFetcher → AnalyzeUrl.getGlideUrl），\n//      getGlideUrl 只保留 url+header，dnsIp 选项被丢弃，\n//      所以正文能显示而封面全灰；官方 storage-b 域名在部分网络下 IPv6 优先且不可达。\n// 方案：把 tobeimg 的 base64 解出真实 /static/ 路径（避开 302 跳 img.picacomic.com），\n//      再用 http://<CF-IP><path> + {\"headers\":{\"Host\":\"storage-b.picacomic.com\"}} 直连，\n//      Host 头在 Glide/OkHttp 链路中保留（BridgeInterceptor 只在缺失时补 Host），\n//      不依赖系统 DNS；登录头只发给同站，不会外泄。\n// 三种封面模式可切换（登录面板「封面模式」）：\n//      🚀IP直连 = http://<IP>+Host 头（默认，抗 IPv6/DNS 问题）\n//      🌐域名直连 = https://storage-b...（网络正常时用）\n//      🪞镜像站 = 参考源同款 s3.go2778.com\n//\n// 【v84 新增 2：源站更新 + 选源站】\n// 「🔄源站更新」= 拉官方 http://68.183.234.72/init，取 addresses 存 picab_official_ips，\n//      按当前线路重建 IP 池 picab_pool，并刷新发现页签名。\n// 「①官方init / ②Cloudflare / ③系统DNS」= 切换线路：\n//      ①官方init = 官方 init IP 优先 + CF 池兜底\n//      ②Cloudflare = 10 个实测可连通 CF IP\n//      ③系统DNS = 不设 dnsIp，走系统解析（IPv6 正常时用）\n// 「📋查看当前」= 显示当前线路 / IP 池 / 官方 init / 封面模式。\n// 线路存 picab_station（0/1/2），池存 picab_pool（\"none\"=系统DNS），删书源会清空。\n//\n// 【正文图片】src 自带 10 个 Cloudflare IPv4 联合池并按图轮换首选顺序；\n//      Legado 的 retry 只重试非 2xx，对 IOException 无效。\n// 旧书修复：长按书籍 → 删除 → 重新搜索加入（正文缓存按书重建）。\n//\n// 【已知遗留】check_source 的域名可访问性探测与 debug_source 的首次裸请求走系统 DNS，\n//      IPv6 超时会显示「网站失效」——这是校验器/调试器限制，\n//      真实使用（搜索/详情/目录/正文/发现页）走书源规则，正常。\n", "bookSourceGroup": "漫画,AI,R18", "bookSourceName": "哔咔漫画〔自包含〕", "bookSourceType": 2, "bookSourceUrl": "https://picaapi.picacomic.com##防同", "bookUrlPattern": ".*:\\/\\/.*\\/comics\\/[a-z0-9]+", "concurrentRate": "1/1200", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>\nvar _out = [];\nvar _at = String.fromCharCode(64,106,115,58);\nvar _sg = '(function(){ var K=\"C69BAF41DA5ABD1FFEDC6D2FEA56B\"; var S=\"~d}$Q7$eIni=V)9\"+String.fromCharCode(92)+\"RK/P.RM4;9[7|@/CA}b~OW!3?EV\"+String.fromCharCode(96,58,60,62)+\"M7pddUBL5n|0/*Cn\"; var PL=\"\"; try{PL=String(source.get(\"picab_pool\")||\"\");}catch(e0){} if(PL===\"none\"){PL=\"\";}else if(!PL){PL=\"172.67.194.19,172.67.80.1,104.21.235.3,104.21.235.4,104.21.91.145,104.19.53.76,104.21.80.1,104.21.81.1,104.16.0.1,104.17.0.1\";} var pre=String(result); var a=pre.substring(pre.indexOf(\"://\")+3); var p=a.substring(a.indexOf(\"/\")); if(p.charAt(0)===\"/\"){p=p.substring(1);} var ts=String(Math.floor(Date.now()/1000)); var nc=\"\"; for(var i=0;i<32;i++)nc+=\"0123456789abcdef\".charAt(Math.floor(Math.random()*16)); var raw=(p+ts+nc+\"GET\"+K).toLowerCase(); var m=Packages.javax.crypto.Mac.getInstance(\"HmacSHA256\"); m.init(new Packages.javax.crypto.spec.SecretKeySpec(new Packages.java.lang.String(S).getBytes(\"UTF-8\"),\"HmacSHA256\")); var b=m.doFinal(new Packages.java.lang.String(raw).getBytes(\"UTF-8\")); var sg=\"\"; for(var i=0;i<b.length;i++){var x=b[i]&0xff;sg+=(x<16?\"0\":\"\")+x.toString(16);} var h={\"User-Agent\":\"okhttp/3.8.1\",\"accept\":\"application/vnd.picacomic.com.v1+json\",\"api-key\":K,\"app-channel\":\"2\",\"app-version\":\"2.2.1.2.3.3\",\"app-uuid\":\"defaultUuid\",\"app-platform\":\"android\",\"app-build-version\":\"44\",\"image-quality\":\"original\",\"time\":ts,\"nonce\":nc,\"signature\":sg}; var au=\"\"; try{au=String(source.get(\"picab_token\"));}catch(e){} if(au&&au!==\"null\"&&au!==\"\"){h[\"authorization\"]=au;} var opt={method:\"GET\",timeout:25000,retry:0,headers:h}; if(PL){opt.dnsIp=PL;} return \"https://picaapi.picacomic.com/\"+p+\",\"+JSON.stringify(opt); })()';\nfunction _mk(path) {\n  return \"https://picaapi.picacomic.com/\" + path + _at + _sg;\n}\nfunction push(title, path) {\n  var t = title;\n  try {\n    var st = String(source.get(\"picaTC\") || \"1\");\n    if (st === \"1\") { t = java.t2s(t); }\n  } catch (e0) {}\n  _out.push({ title: t, url: _mk(path),\n              style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.25 } });\n}\nfunction group(title) {\n  _out.push({ title: title, url: \"\",\n              style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } });\n}\nfunction sortName() {\n  var o = String(source.get(\"picaSort\") || \"0\");\n  return ({ \"0\": \"dd\", \"1\": \"da\", \"2\": \"ld\", \"3\": \"vd\" })[o] || \"dd\";\n}\nvar _cats = JSON.parse(picac_get(\"categories\", source, java)).data.categories || [];\ngroup(\"▂▂ 分 类 ▂▂\");\n_cats.forEach(function (c) {\n  if (c.isWeb) { return; }\n  push(c.title, \"comics?page=1&c=\" + encodeURIComponent(c.title) + \"&s=\" + sortName());\n});\ngroup(\"▂▂ 排 行 榜 ▂▂\");\npush(\"24小时热榜\", \"comics/leaderboard?tt=H24&ct=VC\");\npush(\"本周热榜\", \"comics/leaderboard?tt=D7&ct=VC\");\npush(\"本月热榜\", \"comics/leaderboard?tt=D30&ct=VC\");\ngroup(\"▂▂ 全 站 排 序 ▂▂\");\npush(\"最新发布\", \"comics?page=1&s=dd\");\npush(\"最早发布\", \"comics?page=1&s=da\");\npush(\"最多爱心\", \"comics?page=1&s=ld\");\npush(\"最多观看\", \"comics?page=1&s=vd\");\ngroup(\"▂▂ 更 多 ▂▂\");\npush(\"🎲随机漫画\", \"comics/random\");\npush(\"❤我的收藏\", \"users/favourite?s=\" + sortName() + \"&page=1\");\npush(\"📚本子馆藏\", \"collections\");\npush(\"👑骑士榜\", \"comics/knight-leaderboard\");\nString(JSON.stringify(_out));\n</js>", "header": "{\n  \"User-Agent\": \"okhttp/3.8.1\",\n  \"accept\": \"application/vnd.picacomic.com.v1+json\",\n  \"api-key\": \"C69BAF41DA5ABD1FFEDC6D2FEA56B\",\n  \"app-channel\": \"2\",\n  \"app-version\": \"2.2.1.2.3.3\",\n  \"app-uuid\": \"defaultUuid\",\n  \"app-platform\": \"android\",\n  \"app-build-version\": \"44\",\n  \"image-quality\": \"original\"\n}", "jsLib": "// ===== 哔咔漫画 自包含库 (v84) =====\n// 作用域铁律：jsLib 在独立 ScriptBindings 求值，只有函数定义被 chainTo 共享；\n// source/java/baseUrl/result 在此不存在 => 一律参数注入 (SRC, JV)，禁止裸引用。\n// 本次全部改名（picab_ -> picac_ / PICAB_ -> PICAC_），规避 Rhino SharedJsScope 编译缓存。\nvar PICA = {\n  API_KEY: \"C69BAF41DA5ABD1FFEDC6D2FEA56B\",\n  SECRET: \"~d}$Q7$eIni=V)9\" + String.fromCharCode(92) + \"RK/P.RM4;9[7|@/CA}b~OW!3?EV\" + String.fromCharCode(96, 58, 60, 62) + \"M7pddUBL5n|0/*Cn\",\n  BASE: \"https://picaapi.picacomic.com/\",\n  DNS_POOL: [\"172.67.194.19\", \"172.67.80.1\", \"104.21.235.3\",\n             \"104.21.235.4\", \"104.21.91.145\", \"104.19.53.76\",\n             \"104.21.80.1\", \"104.21.81.1\", \"104.16.0.1\", \"104.17.0.1\"],\n  INIT_URL: \"http://68.183.234.72/init\",\n  MIRROR: \"https://s3.go2778.com\"\n};\n\nfunction picac_hash(s) {\n  var h = 0;\n  s = String(s || \"\");\n  for (var i = 0; i < s.length; i++) {\n    h = ((h << 5) - h + s.charCodeAt(i)) | 0;\n  }\n  return Math.abs(h);\n}\n\nfunction picac_bytes(str) {\n  return new Packages.java.lang.String(str).getBytes(\"UTF-8\");\n}\n\nfunction picac_hmac(raw, key) {\n  var m = Packages.javax.crypto.Mac.getInstance(\"HmacSHA256\");\n  m.init(new Packages.javax.crypto.spec.SecretKeySpec(picac_bytes(key), \"HmacSHA256\"));\n  var b = m.doFinal(picac_bytes(raw));\n  var s = \"\";\n  for (var i = 0; i < b.length; i++) {\n    var x = b[i] & 0xff;\n    s += (x < 16 ? \"0\" : \"\") + x.toString(16);\n  }\n  return s;\n}\n\nfunction picac_nonce() {\n  var s = \"\";\n  for (var i = 0; i < 32; i++) {\n    s += \"0123456789abcdef\".charAt(Math.floor(Math.random() * 16));\n  }\n  return s;\n}\n\nfunction picac_token(SRC) {\n  try {\n    var h = String(SRC.getLoginHeader() || \"\");\n    if (h && h !== \"null\") {\n      var m = h.match(new RegExp('\"authorization\"\\\\s*:\\\\s*\"([^\"]+)\"'));\n      if (m) { return m[1]; }\n      return h;\n    }\n  } catch (e0) {}\n  try { return String(SRC.get(\"picab_token\") || \"\"); } catch (e1) { return \"\"; }\n}\n\nfunction picac_official(SRC) {\n  try { return String(SRC.get(\"picab_official_ips\") || \"\"); } catch (e0) { return \"\"; }\n}\n\nfunction picac_pool(SRC) {\n  var p = \"\";\n  try { p = String(SRC.get(\"picab_pool\") || \"\"); } catch (e0) {}\n  if (p === \"none\") { return \"\"; }\n  if (p) { return p; }\n  return PICA.DNS_POOL.join(\",\");\n}\n\nfunction picac_stationName(idx) {\n  return ({ \"0\": \"官方init\", \"1\": \"Cloudflare\", \"2\": \"系统DNS直连\" })[String(idx)] || \"未知\";\n}\n\nfunction picac_currentStation(SRC) {\n  try { return String(SRC.get(\"picab_station\") || \"1\"); } catch (e0) { return \"1\"; }\n}\n\nfunction picac_coverMode(SRC) {\n  try {\n    var m = String(SRC.get(\"picab_cover_mode\") || \"ip\");\n    return (m === \"dns\" || m === \"mirror\") ? m : \"ip\";\n  } catch (e0) { return \"ip\"; }\n}\n\nfunction picac_buildPool(station, official) {\n  var out = [];\n  function add(ip) {\n    ip = String(ip || \"\").trim();\n    if (ip && ip.indexOf(\".\") > 0 && out.indexOf(ip) < 0) { out.push(ip); }\n  }\n  if (station === \"0\") {\n    String(official || \"\").split(\",\").forEach(add);\n    PICA.DNS_POOL.forEach(add);\n  } else if (station === \"1\") {\n    PICA.DNS_POOL.forEach(add);\n  } else {\n    return \"none\";\n  }\n  return out.join(\",\");\n}\n\nfunction picac_headers(path, method, SRC, JV) {\n  var ts = String(Math.floor(Date.now() / 1000));\n  var nonce = picac_nonce();\n  var raw = (path + ts + nonce + method + PICA.API_KEY).toLowerCase();\n  var sig = picac_hmac(raw, PICA.SECRET);\n  var h = {\n    \"User-Agent\": \"okhttp/3.8.1\",\n    \"accept\": \"application/vnd.picacomic.com.v1+json\",\n    \"api-key\": PICA.API_KEY,\n    \"app-channel\": \"2\",\n    \"app-version\": \"2.2.1.2.3.3\",\n    \"app-uuid\": \"defaultUuid\",\n    \"app-platform\": \"android\",\n    \"app-build-version\": \"44\",\n    \"image-quality\": \"original\",\n    \"time\": ts,\n    \"nonce\": nonce,\n    \"signature\": sig\n  };\n  var tk = picac_token(SRC);\n  if (tk && tk !== \"null\" && tk !== \"\") { h[\"authorization\"] = tk; }\n  return h;\n}\n\nfunction picac_opt(path, opt, SRC, JV) {\n  opt = opt || {};\n  opt.headers = picac_headers(path, opt.method || \"GET\", SRC, JV);\n  if ((opt.method || \"GET\") === \"POST\") {\n    opt.headers[\"Content-Type\"] = \"application/json; charset=UTF-8\";\n  }\n  var dp = picac_pool(SRC);\n  if (dp && !opt.dnsIp) { opt.dnsIp = dp; }\n  if (!opt.retry) { opt.retry = 4; }\n  if (!opt.timeout) { opt.timeout = 25000; }\n  return PICA.BASE + path + \",\" + JSON.stringify(opt);\n}\n\nfunction picac_get(path, SRC, JV) {\n  var last = \"\";\n  for (var i = 0; i < 3; i++) {\n    last = String(JV.ajax(picac_opt(path, { method: \"GET\" }, SRC, JV)) || \"\");\n    if (last.charAt(0) === \"{\") { return last; }\n    if (i < 2) {\n      try { Packages.java.lang.Thread.sleep(1500); } catch (e0) {}\n    }\n  }\n  return last;\n}\n\nfunction picac_post(path, bodyObj, SRC, JV) {\n  var last = \"\";\n  for (var i = 0; i < 3; i++) {\n    last = String(JV.ajax(picac_opt(path, { method: \"POST\", body: JSON.stringify(bodyObj) }, SRC, JV)) || \"\");\n    if (last.charAt(0) === \"{\") { return last; }\n    if (i < 2) {\n      try { Packages.java.lang.Thread.sleep(1500); } catch (e0) {}\n    }\n  }\n  return last;\n}\n// ---------- 封面 ----------\n/* 解析 thumb：\n   tobeimg/<hash>/rs:fill:W:H:0/g:sm/<base64>[.jpg]  → base64 解出真实图片 URL\n   tobs/<file>                                          → /static/<file>（去掉 tobs/ 前缀）\n   <file>                                               → /static/<file>\n   返回 {host, path, raw, real, isSB} */\nfunction picac_parseThumb(media) {\n  var out = { host: \"\", path: \"\", raw: \"\", real: \"\", isSB: false };\n  if (!media) { return out; }\n  var fs = String(media.fileServer || \"\").replace(new RegExp(\"/$\"), \"\");\n  var path = String(media.path || \"\").replace(new RegExp(\"^/?\"), \"\");\n  out.raw = path;\n  if (!path) { return out; }\n  if (path.indexOf(\"tobeimg/\") === 0) {\n    var idx = path.indexOf(\"/g:sm/\");\n    if (idx >= 0) {\n      var b64 = path.substring(idx + 6);\n      var m = b64.match(new RegExp(\"^([A-Za-z0-9+/=]+)(\\\\.[A-Za-z0-9]+)?$\"));\n      if (m) {\n        try {\n          var pay = m[1];\n          while (pay.length % 4 !== 0) { pay += \"=\"; }\n          var real = String(new Packages.java.lang.String(\n              Packages.android.util.Base64.decode(pay, 0), \"UTF-8\"));\n          var i2 = real.indexOf(\"/static/\");\n          if (i2 >= 0) {\n            out.real = real;\n            out.host = real.substring(0, i2).replace(new RegExp(\"^https?://\"), \"\");\n            out.path = real.substring(i2);\n            out.isSB = out.host.indexOf(\"storage-b\") >= 0;\n            return out;\n          }\n        } catch (e0) {}\n      }\n    }\n  }\n  out.host = fs.replace(new RegExp(\"^https?://\"), \"\");\n  if (path.indexOf(\"tobs/\") === 0) { path = path.substring(5); }\n  out.path = \"/static/\" + path;\n  out.isSB = out.host.indexOf(\"storage-b\") >= 0;\n  return out;\n}\n\n/* 图片 URL（封面与正文共用一套规则）\n   关键：漫画浏览模式走 Glide → AnalyzeUrl.getGlideUrl()，\n        该方法【只保留 url + headerMap，丢弃 dnsIp】⇒\n        域名直连在 IPv6 优先的网络里必然超时。\n        所以图片 URL 必须自带 IP 直连能力：\n        storage-b → http://<CF-IP><path> + {\"headers\":{\"Host\":\"storage-b.picacomic.com\"}}\n        Host 头在 OkHttp BridgeInterceptor 只在缺失时补 ⇒ 保留；\n        同时对普通浏览模式（getByteArrayAwait，dnsIp 生效）也完全兼容。\n   其它域（storage1 等）真机不可达 ⇒ 回退域名直连。 */\nfunction picac_imgUrl(media, SRC) {\n  var t = picac_parseThumb(media);\n  if (!t.path) { return \"\"; }\n  var mode = \"ip\";\n  try { mode = picac_coverMode(SRC); } catch (e0) {}\n  if (mode === \"dns\") {\n    return \"https://\" + t.host + t.path;\n  }\n  if (t.isSB) {\n    var ips = PICA.DNS_POOL;\n    var ip = ips[picac_hash(t.path) % ips.length];\n    return \"http://\" + ip + t.path\n         + ',{\"method\":\"GET\",\"timeout\":30000,\"headers\":{\"Host\":\"' + t.host + '\"}}';\n  }\n  return \"https://\" + t.host + t.path;\n}\n\n/* 封面 URL（三种模式，由 picab_cover_mode 控制）：\n   ip     → storage-b 用 IP+Host 头；其它域域名直连\n   dns    → 全部域名直连\n   mirror → 参考源同款镜像 s3.go2778.com（保留原始 tobeimg 路径） */\nfunction picac_cover(media, SRC) {\n  var t = picac_parseThumb(media);\n  if (!t.raw) { return \"\"; }\n  var mode = picac_coverMode(SRC);\n  if (mode === \"mirror\") {\n    return PICA.MIRROR + \"/static/\" + t.raw;\n  }\n  if (!t.host) { return \"\"; }\n  if (mode === \"dns\") {\n    return \"https://\" + t.host + t.path;\n  }\n  if (t.isSB) {\n    var ips = PICA.DNS_POOL;\n    var ip = ips[picac_hash(t.path) % ips.length];\n    return \"http://\" + ip + t.path\n         + ',{\"method\":\"GET\",\"timeout\":20000,\"headers\":{\"Host\":\"' + t.host + '\"}}';\n  }\n  return \"https://\" + t.host + t.path;\n}\n\n/* 正文图片 URL：与封面同规则（IP+Host 头），保证漫画浏览模式也能加载 */\nfunction picac_img(media, SRC) {\n  return picac_imgUrl(media, SRC);\n}\n\nfunction picac_bookid(u) {\n  var s = String(u || \"\");\n  var c = s.indexOf(\",{\");\n  if (c >= 0) { s = s.substring(0, c); }\n  var m = s.match(new RegExp(\"comics/([0-9a-fA-F]{24})\"));\n  if (m) { return m[1]; }\n  m = s.match(new RegExp(\"^([0-9a-fA-F]{24})$\"));\n  return m ? m[1] : \"\";\n}\n\nfunction picac_item(c, SRC, JV) {\n  if (!c) { return null; }\n  return {\n    name: c.title || \"\",\n    author: c.author || \"\",\n    cover: picac_cover(c.thumb, SRC),\n    intro: \"\",\n    kind: [(c.__group || \"\"),\n           String(c.categories || []).replace(/,/g, \" \"),\n           c.finished ? \"完结\" : \"连载\",\n           c.likesCount ? c.likesCount + \"♥\" : \"\"].filter(Boolean).join(\" · \"),\n    latest: \"\",\n    word: \"\",\n    url: PICA.BASE + \"comics/\" + (c._id || \"\")\n        + ',{\"method\":\"GET\",\"retry\":3,\"timeout\":20000,'\n        + '\"headers\":' + JSON.stringify(picac_headers(\"comics/\" + (c._id || \"\"), \"GET\", SRC))\n        + ',\"dnsIp\":\"' + picac_pool(SRC) + '\"}'\n  };\n}\n\nfunction picac_list(data) {\n  var d = data || {};\n  if (d.collections) {\n    var flat = [];\n    (d.collections || []).forEach(function (g) {\n      (g.comics || []).forEach(function (c) {\n        c.__group = g.title;\n        flat.push(c);\n      });\n    });\n    return flat;\n  }\n  var list = d.comics ? (d.comics.docs || d.comics) : (d.docs || d);\n  if (!Array.isArray(list)) { list = []; }\n  return list;\n}\n\nfunction picac_say(jv, msg) {\n  var stamped = \"[\" + new Date().toTimeString().substring(0, 8) + \"] \" + msg;\n  try { jv.upLoginData({ \"登录状态\": stamped }); } catch (e1) {}\n  try { jv.toast(stamped); } catch (e2) {}\n  try { jv.longToast(stamped); } catch (e3) {}\n  try { jv.reLoginView(false); } catch (e4) {}\n}\nfunction PICAC_checkLogin(jv, SRC) {\n  var msg = \"\";\n  try {\n    var txt = String(jv.ajax(picac_opt(\"users/profile\", { method: \"GET\" }, SRC, jv)) || \"\");\n    if (!txt) { msg = \"检查失败: 无响应\"; }\n    else if (txt.charAt(0) !== \"{\") {\n      msg = \"❌ 检查失败: 网络超时（试试切换源站）\";\n      picac_say(jv, msg); return;\n    } else {\n      var jo = null;\n      try { jo = JSON.parse(txt); } catch (e3) {}\n      if (jo && jo.code === 200 && jo.data && jo.data.user) {\n        var u = jo.data.user;\n        msg = \"✅ 已登录: \" + (u.name || u.email || \"未知\")\n              + \" (Lv.\" + (u.level || \"?\") + \")\"\n              + (u.isPunched ? \" [今日已签到]\" : \" [今日未签到]\");\n      } else if (jo && (jo.code === 401 || jo.code === 403)) {\n        msg = \"❌ 未登录，请填账号密码后点右上角✓登录\";\n      } else {\n        msg = \"⚠️ 状态未知: \" + txt.substring(0, 60);\n      }\n    }\n  } catch (e) { msg = \"检查失败: \" + e; }\n  picac_say(jv, msg);\n}\n\nfunction PICAC_punch(jv, SRC) {\n  var msg = \"\";\n  try {\n    var txt = String(jv.ajax(picac_opt(\"users/punch-in\",\n        { method: \"POST\", body: \"{}\" }, SRC, jv)) || \"\");\n    if (!txt) { msg = \"签到失败: 无响应\"; }\n    else if (txt.charAt(0) !== \"{\") {\n      var why = txt.indexOf(\"SocketTimeout\") >= 0 ? \"网络超时\" : \"网络错误\";\n      msg = \"❌ 签到失败: \" + why + \"（可试「🔄源站更新」或切换源站）\";\n      picac_say(jv, msg); return;\n    }\n    var jo = null;\n    try { jo = JSON.parse(txt); } catch (e0) {}\n    if (jo && jo.code === 200 && jo.data && jo.data.res) {\n      var st = String(jo.data.res.status || \"\");\n      if (st === \"ok\") { msg = \"✅ 签到成功 (最近签到日 \" + (jo.data.res.punchInLastDay || \"?\") + \")\"; }\n      else if (st === \"fail\") { msg = \"📌 今日已签到，无需重复\"; }\n      else { msg = \"签到状态: \" + st; }\n    } else if (jo && (jo.code === 401 || jo.code === 403)) {\n      msg = \"❌ 未登录，请先登录再签到\";\n    } else {\n      msg = \"❌ 签到失败: \" + (jo && jo.message ? jo.message : txt.substring(0, 80));\n    }\n  } catch (e) { msg = \"签到异常: \" + e; }\n  picac_say(jv, msg);\n}\n\nfunction PICAC_logout(jv, SRC) {\n  try { SRC.putLoginHeader(\"\"); } catch (e0) {}\n  try { SRC.put(\"picab_token\", \"\"); } catch (e5) {}\n  picac_say(jv, \"已退出登录（凭据已清除）\");\n}\n\nfunction PICAC_refreshExplore(jv, SRC) {\n  var msg = \"\";\n  try {\n    SRC.refreshExplore();\n    msg = \"✅ 发现页已刷新（重新生成签名，请回到发现页）\";\n  } catch (e) { msg = \"刷新失败: \" + e; }\n  picac_say(jv, msg);\n}\n\n/* 源站更新：拉官方 init 地址 → 写入 IP 池 → 刷新发现页 */\nfunction PICAC_updateStation(jv, SRC) {\n  var msg = \"\";\n  var r = \"\";\n  try {\n    r = String(jv.ajax(PICA.INIT_URL + \"?t=\" + String(Math.floor(Date.now() / 1000))) || \"\");\n  } catch (e) { r = \"\"; }\n  if (!r) {\n    msg = \"❌ init 无响应（官方IP服务器不可达），当前源站未变更\";\n  } else if (r.charAt(0) !== \"{\") {\n    var reason = r.indexOf(\"SocketTimeout\") >= 0 ? \"超时\"\n               : r.indexOf(\"UnknownHost\") >= 0 ? \"域名解析失败\"\n               : r.indexOf(\"ConnectException\") >= 0 ? \"连接被拒\"\n               : \"网络错误\";\n    msg = \"❌ init \" + reason + \"，当前源站未变更\";\n  } else {\n    try {\n      var jo = JSON.parse(r);\n      var ips = (jo && jo.addresses) || [];\n      if (ips.length) {\n        var pool = ips.join(\",\");\n        SRC.put(\"picab_official_ips\", pool);\n        var st = picac_currentStation(SRC);\n        SRC.put(\"picab_pool\", picac_buildPool(st, pool));\n        try { SRC.refreshExplore(); } catch (e2) {}\n        msg = \"✅ 源站更新完成: \" + pool + \"（当前线路 \" + picac_stationName(st) + \"）\";\n      } else {\n        msg = \"⚠️ init 未返回 IP，当前源站未变更\";\n      }\n    } catch (e3) { msg = \"❌ init 返回格式异常，当前源站未变更\"; }\n  }\n  picac_say(jv, msg);\n}\n\n/* 选源站：0=官方init 1=Cloudflare 2=系统DNS直连 */\nfunction PICAC_selectStation(jv, SRC, idx) {\n  idx = String(idx);\n  try {\n    SRC.put(\"picab_station\", idx);\n    SRC.put(\"picab_pool\", picac_buildPool(idx, picac_official(SRC)));\n    try { SRC.refreshExplore(); } catch (e2) {}\n    var pool = picac_pool(SRC);\n    picac_say(jv, \"✅ 已切换源站: \" + picac_stationName(idx)\n                 + (pool ? \"（池 \" + pool.split(\",\").length + \" 个IP）\" : \"（走系统DNS）\"));\n  } catch (e) {\n    picac_say(jv, \"切换失败: \" + e);\n  }\n}\n\nfunction PICAC_showStation(jv, SRC) {\n  var st = picac_currentStation(SRC);\n  var pool = picac_pool(SRC);\n  var off = picac_official(SRC);\n  var mode = picac_coverMode(SRC);\n  var mname = ({ \"ip\": \"IP直连(Host头)\", \"dns\": \"域名直连\", \"mirror\": \"镜像站\" })[mode] || mode;\n  var msg = \"当前源站: \" + picac_stationName(st)\n          + \"\\nIP池: \" + (pool ? pool : \"（系统DNS，不设dnsIp）\")\n          + \"\\n官方init: \" + (off ? off : \"（未更新）\")\n          + \"\\n封面模式: \" + mname;\n  picac_say(jv, msg);\n}\n\n/* 封面模式：ip / dns / mirror */\nfunction PICAC_setCoverMode(jv, SRC, mode) {\n  mode = String(mode);\n  try {\n    if (mode !== \"ip\" && mode !== \"dns\" && mode !== \"mirror\") {\n      picac_say(jv, \"❌ 未知封面模式: \" + mode);\n      return;\n    }\n    SRC.put(\"picab_cover_mode\", mode);\n    var mname = ({ \"ip\": \"IP直连(Host头)\", \"dns\": \"域名直连\", \"mirror\": \"镜像站\" })[mode];\n    picac_say(jv, \"✅ 封面模式已切换: \" + mname + \"（重新搜索/刷新详情后生效）\");\n  } catch (e) {\n    picac_say(jv, \"切换失败: \" + e);\n  }\n}\n\nfunction PICAC_setSort(jv, SRC, idx) {\n  try { SRC.put(\"picaSort\", String(idx)); } catch (e0) {}\n  var names = { \"0\": \"最新发布\", \"1\": \"最早发布\", \"2\": \"最多爱心\", \"3\": \"最多观看\" };\n  picac_say(jv, \"✅ 分类排序已切换: \" + names[String(idx)]);\n}\n\nfunction PICAC_setTC(jv, SRC, on) {\n  try { SRC.put(\"picaTC\", on ? \"1\" : \"0\"); } catch (e0) {}\n  picac_say(jv, on ? \"✅ 分类/标签显示已切换: 简体\" : \"✅ 分类/标签显示已切换: 繁体\");\n}\n\nfunction PICAC_diag(jv, SRC) {\n  var lines = [];\n  try {\n    var t0 = Date.now();\n    var r = String(jv.ajax(picac_opt(\"categories\", { method: \"GET\" }, SRC, jv)) || \"\");\n    var ok1 = r.indexOf('\"code\"') >= 0 && r.indexOf(\"categories\") >= 0 && r.indexOf(\"200\") >= 0;\n    lines.push(\"1.API签名+IP: \" + (ok1 ? \"✅\" : \"❌\") + \" \" + (Date.now() - t0) + \"ms\" + (ok1 ? \"\" : \" \" + r.substring(0, 40).replace(/\\n/g, \" \")));\n  } catch (e) { lines.push(\"1.API签名+IP: ❌ \" + String(e).substring(0, 40)); }\n  var pool = picac_pool(SRC);\n  lines.push(\"2.当前源站: \" + picac_stationName(picac_currentStation(SRC)) + \" 池: \" + (pool ? pool.substring(0, 46) : \"系统DNS\"));\n  try {\n    var t1 = Date.now();\n    var cov = picac_cover({ fileServer: \"https://storage-b.picacomic.com\",\n      path: \"tobeimg/NLrAacfzHYyka85InF9J3kEyr5-kShySh5Ztk5HbIuA/rs:fill:300:400:0/g:sm/aHR0cHM6Ly9zdG9yYWdlLWIucGljYWNvbWljLmNvbS9zdGF0aWMvc3ViX3N0b3JhZ2VfMS9kNC83Mi9kNDcyYmRhYS1iZGFlLTRjNDctYmFlNS03NDM3NmZlNDI3MTIuanBn.jpg\" }, SRC);\n    var r1 = String(jv.ajax(cov) || \"\");\n    lines.push(\"3.封面(\" + picac_coverMode(SRC) + \"): \" + (r1.length > 10000 ? \"✅\" : \"❌\") + \" \" + (Date.now() - t1) + \"ms \" + cov.substring(0, 60));\n  } catch (e) { lines.push(\"3.封面: ❌ \" + String(e).substring(0, 40)); }\n  try {\n    var t2 = Date.now();\n    var u2 = \"https://storage-b.picacomic.com/static/sub_storage_1/b4/b5/b4b5042d-4a5c-4cbb-8a2c-13060b05b990.jpg\";\n    var r2 = String(jv.ajax(u2 + (pool ? ',{\"method\":\"GET\",\"timeout\":15000,\"dnsIp\":\"' + pool + '\"}' : \"\")) || \"\");\n    lines.push(\"4.正文图(带IP): \" + (r2.length > 10000 ? \"✅\" : \"❌\") + \" \" + (Date.now() - t2) + \"ms\");\n  } catch (e) { lines.push(\"4.正文图(带IP): ❌ 超时\"); }\n  var msg = lines.join(\"\\n\");\n  try { jv.upLoginData({ \"登录状态\": msg }); } catch (e1) {}\n  try { jv.toast(msg); } catch (e2) {}\n  try { jv.longToast(msg); } catch (e3) {}\n}\n", "lastUpdateTime": "1792853819944", "loginUi": "[{\"name\":\"账号\",\"type\":\"text\"},{\"name\":\"密码\",\"type\":\"password\"},{\"name\":\"🔑登录\",\"type\":\"button\",\"action\":\"login()\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"name\":\"①检查登录状态\",\"type\":\"button\",\"action\":\"PICAC_checkLogin(java, source)\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.45}},{\"name\":\"②每日签到\",\"type\":\"button\",\"action\":\"PICAC_punch(java, source)\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.45}},{\"name\":\"③退出登录\",\"type\":\"button\",\"action\":\"PICAC_logout(java, source)\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.45}},{\"name\":\"④刷新发现页\",\"type\":\"button\",\"action\":\"PICAC_refreshExplore(java, source)\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.45}},{\"name\":\"分类排序\",\"type\":\"text\"},{\"name\":\"最新\",\"type\":\"button\",\"action\":\"PICAC_setSort(java, source, 0)\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"name\":\"最早\",\"type\":\"button\",\"action\":\"PICAC_setSort(java, source, 1)\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"name\":\"爱心\",\"type\":\"button\",\"action\":\"PICAC_setSort(java, source, 2)\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"name\":\"观看\",\"type\":\"button\",\"action\":\"PICAC_setSort(java, source, 3)\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"name\":\"简繁显示\",\"type\":\"text\"},{\"name\":\"简体\",\"type\":\"button\",\"action\":\"PICAC_setTC(java, source, true)\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.5}},{\"name\":\"繁体\",\"type\":\"button\",\"action\":\"PICAC_setTC(java, source, false)\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.5}},{\"name\":\"源 站 管 理\",\"type\":\"text\"},{\"name\":\"🔄源站更新\",\"type\":\"button\",\"action\":\"PICAC_updateStation(java, source)\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.45}},{\"name\":\"📋查看当前\",\"type\":\"button\",\"action\":\"PICAC_showStation(java, source)\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.45}},{\"name\":\"①官方init\",\"type\":\"button\",\"action\":\"PICAC_selectStation(java, source, 0)\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.33}},{\"name\":\"②Cloudflare\",\"type\":\"button\",\"action\":\"PICAC_selectStation(java, source, 1)\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.34}},{\"name\":\"③系统DNS\",\"type\":\"button\",\"action\":\"PICAC_selectStation(java, source, 2)\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.33}},{\"name\":\"封 面 模 式\",\"type\":\"text\"},{\"name\":\"🚀IP直连\",\"type\":\"button\",\"action\":\"PICAC_setCoverMode(java, source, 'ip')\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.33}},{\"name\":\"🌐域名直连\",\"type\":\"button\",\"action\":\"PICAC_setCoverMode(java, source, 'dns')\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.34}},{\"name\":\"🪞镜像站\",\"type\":\"button\",\"action\":\"PICAC_setCoverMode(java, source, 'mirror')\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.33}},{\"name\":\"🔍一键诊断\",\"type\":\"button\",\"action\":\"PICAC_diag(java, source)\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"name\":\"登录状态\",\"type\":\"text\"}]", "loginUrl": "// 登录：只有 loginUrl 的 login() 绑定 result（= 登录面板各输入）\nfunction login() {\n  var u = String(result[\"账号\"] || \"\").replace(/^\\s+|\\s+$/g, \"\");\n  var p = String(result[\"密码\"] || \"\").replace(/^\\s+|\\s+$/g, \"\");\n  if (!u) { java.longToast(\"请填写账号\"); return; }\n  if (!p) { java.longToast(\"请填写密码\"); return; }\n  var msg = \"\";\n  try {\n    var path = \"auth/sign-in\";\n    var h = picac_headers(path, \"POST\", source, java);\n    h[\"Content-Type\"] = \"application/json; charset=UTF-8\";\n    var opt = { method: \"POST\", body: JSON.stringify({ email: u, password: p }),\n                headers: h, timeout: 30000, retry: 2 };\n    var dp = picac_pool(source);\n    if (dp) { opt.dnsIp = dp; }\n    var resp = java.ajax(\"https://picaapi.picacomic.com/\" + path + \",\" + JSON.stringify(opt));\n    var txt = String(resp || \"\");\n    var jo = null;\n    try { jo = JSON.parse(txt); } catch (e0) {}\n    if (jo && jo.code === 200 && jo.data && jo.data.token) {\n      source.putLoginHeader(jo.data.token);\n      try { source.put(\"picab_token\", jo.data.token); } catch (e5) {}\n      try { source.refreshExplore(); } catch (e6) {}\n      msg = \"✅ 登录成功: \" + u;\n    } else {\n      msg = \"❌ 登录失败: \" + (jo && jo.message ? jo.message : txt.substring(0, 80));\n    }\n  } catch (e) { msg = \"登录异常: \" + e; }\n  try { java.upLoginData({ \"登录状态\": msg }); } catch (e1) {}\n  try { java.toast(msg); } catch (e2) {}\n  try { java.longToast(msg); } catch (e3) {}\n}\n", "respondTime": 180000, "ruleBookInfo": {"author": "author", "coverUrl": "cover", "init": "<js>\nvar _id = picac_bookid(baseUrl);\nif (!_id) { throw new Error(\"invalid baseUrl: \" + baseUrl); }\nvar _j = JSON.parse(picac_get(\"comics/\" + _id, source, java));\nif (_j.code !== 200 || !_j.data || !_j.data.comic) {\n  throw new Error(\"详情获取失败: \" + (_j.message || _j.code));\n}\nvar _c = _j.data.comic;\nvar _it = {\n  name: _c.title || \"\",\n  author: _c.author || \"\",\n  cover: picac_cover(_c.thumb, source),\n  intro: _c.description || \"\",\n  kind: [String(_c.categories || []).replace(/,/g, \" \"),\n         String(_c.tags || []).replace(/,/g, \" \"),\n         _c.chineseTeam ? \"汉化组: \" + _c.chineseTeam : \"\",\n         _c.finished ? \"完结\" : \"连载\",\n         _c.viewsCount ? _c.viewsCount + \"次观看\" : \"\",\n         _c.likesCount ? _c.likesCount + \"人喜欢\" : \"\"].filter(Boolean).join(\"\\n\"),\n  tocUrl: picac_opt(\"comics/\" + _id + \"/eps?page=1\", { method: \"GET\" }, source, java),\n  lastChapter: \"\",\n  wordCount: (_c.pagesCount || \"\") + \"P\"\n};\nbook.putVariable(\"picab_bookid\", _id);\nJSON.stringify(_it);\n</js>", "intro": "intro", "kind": "kind", "lastChapter": "lastChapter", "name": "name", "tocUrl": "tocUrl", "wordCount": "wordCount"}, "ruleContent": {"content": "<js>\nvar _j = JSON.parse(result);\nif (_j.code !== 200) { throw new Error(\"正文获取失败: \" + (_j.message || _j.code)); }\nvar _d = (_j.data && _j.data.pages) ? (_j.data.pages.docs || []) : [];\nvar _contentOut = \"\";\nif (!_d.length) {\n  java.log(\"哔咔正文为空: \" + String(result).substring(0, 200));\n  _contentOut = \"<p>正文获取失败：本书请长按→删除→重新搜索加入。</p>\";\n} else {\nvar _poolBase = [\n  \"172.67.194.19\",\"172.67.80.1\",\"104.21.235.3\",\"104.21.235.4\",\"104.21.91.145\",\n  \"104.19.53.76\",\"104.21.80.1\",\"104.21.81.1\",\"104.16.0.1\",\"104.17.0.1\"\n];\n/* 当前源站 IP 池优先；官方 init IP 追加在前 */\ntry {\n  var _manual = String(source.get(\"picab_pool\") || \"\");\n  if (_manual === \"none\") { _manual = \"\"; }\n  else if (!_manual) {\n    try { _manual = String(source.get(\"picab_official_ips\") || \"\"); } catch (e1) {}\n  }\n  if (_manual) {\n    _manual.split(\",\").forEach(function(ip) {\n      ip = ip.trim(); if (ip && _poolBase.indexOf(ip) < 0) _poolBase.unshift(ip);\n    });\n  }\n} catch(e0) {}\n/* 图片 URL 由 picac_img 统一生成（IP+Host 头直连），\n   不再在外层追加 dnsIp —— 漫画浏览模式走 Glide.getGlideUrl() 会丢弃 dnsIp，\n   只有 URL 里自带 IP + Host 头才能在两种模式下都加载成功。 */\nvar _out = _d.map(function (x, idx) {\n  var u = picac_img(x.media, source);\n  return '<img src=\"' + u + '\">';\n});\nif (_out.length) {\n  java.log(\"PICADIAG v84 图数=\" + _out.length + \" 池数=\" + _poolBase.length + \" 首src=\" + _out[0].substring(9, 260));\n}\nvar _diag = \"<p style=\\\"font-size:11px\\\">[诊断] 图数:\" + _out.length + \" 池:\" + _poolBase.length + \" IP轮换:开</p>\";\n_contentOut = _out.join(\"\\n\") + \"\\n\\u200b\" + String(Math.floor(Date.now() / 60000)) + _diag;\n}\n_contentOut;\n</js>", "imageStyle": "FULL", "nextContentUrl": "<js>\nvar _j = JSON.parse(result);\nvar _p = (_j.data && _j.data.pages) ? _j.data.pages : null;\nvar _next = \"javascript:void(0)\";\nif (_p) {\n  var _cur = (_p.page === null || _p.page === undefined) ? 1 : _p.page;\n  var _total = (_p.pages === null || _p.pages === undefined) ? 1 : _p.pages;\n  if (_total > 1 && _cur < _total) {\n    var _ord = String(baseUrl || \"\").match(new RegExp(\"order/(\\\\d+)\"));\n    if (_ord) {\n      var _bid = picac_bookid(baseUrl);\n      var _at = String.fromCharCode(64,106,115,58);\n      var _sg = '(function(){ var K=\"C69BAF41DA5ABD1FFEDC6D2FEA56B\"; var S=\"~d}$Q7$eIni=V)9\"+String.fromCharCode(92)+\"RK/P.RM4;9[7|@/CA}b~OW!3?EV\"+String.fromCharCode(96,58,60,62)+\"M7pddUBL5n|0/*Cn\"; var PL=\"\"; try{PL=String(source.get(\"picab_pool\")||\"\");}catch(e0){} if(PL===\"none\"){PL=\"\";}else if(!PL){PL=\"172.67.194.19,172.67.80.1,104.21.235.3,104.21.235.4,104.21.91.145,104.19.53.76,104.21.80.1,104.21.81.1,104.16.0.1,104.17.0.1\";} var pre=String(result); var a=pre.substring(pre.indexOf(\"://\")+3); var p=a.substring(a.indexOf(\"/\")); if(p.charAt(0)===\"/\"){p=p.substring(1);} var ts=String(Math.floor(Date.now()/1000)); var nc=\"\"; for(var i=0;i<32;i++)nc+=\"0123456789abcdef\".charAt(Math.floor(Math.random()*16)); var raw=(p+ts+nc+\"GET\"+K).toLowerCase(); var m=Packages.javax.crypto.Mac.getInstance(\"HmacSHA256\"); m.init(new Packages.javax.crypto.spec.SecretKeySpec(new Packages.java.lang.String(S).getBytes(\"UTF-8\"),\"HmacSHA256\")); var b=m.doFinal(new Packages.java.lang.String(raw).getBytes(\"UTF-8\")); var sg=\"\"; for(var i=0;i<b.length;i++){var x=b[i]&0xff;sg+=(x<16?\"0\":\"\")+x.toString(16);} var h={\"User-Agent\":\"okhttp/3.8.1\",\"accept\":\"application/vnd.picacomic.com.v1+json\",\"api-key\":K,\"app-channel\":\"2\",\"app-version\":\"2.2.1.2.3.3\",\"app-uuid\":\"defaultUuid\",\"app-platform\":\"android\",\"app-build-version\":\"44\",\"image-quality\":\"original\",\"time\":ts,\"nonce\":nc,\"signature\":sg}; var au=\"\"; try{au=String(source.get(\"picab_token\"));}catch(e){} if(au&&au!==\"null\"&&au!==\"\"){h[\"authorization\"]=au;} var opt={method:\"GET\",timeout:25000,retry:0,headers:h}; if(PL){opt.dnsIp=PL;} return \"https://picaapi.picacomic.com/\"+p+\",\"+JSON.stringify(opt); })()';\n      _next = \"https://picaapi.picacomic.com/comics/\" + _bid + \"/order/\" + _ord[1] + \"/pages?page=\" + (_cur + 1) + _at + _sg;\n    }\n  }\n}\n_next;\n</js>"}, "ruleExplore": {"author": "author", "bookList": "<js>\n// ============ 发现页解析（完全内联，不调用 jsLib） ============\nvar __API_KEY = \"C69BAF41DA5ABD1FFEDC6D2FEA56B\";\nvar __SECRET = \"~d}$Q7$eIni=V)9\" + String.fromCharCode(92) + \"RK/P.RM4;9[7|@/CA}b~OW!3?EV\" + String.fromCharCode(96, 58, 60, 62) + \"M7pddUBL5n|0/*Cn\";\nvar __BASE = \"https://picaapi.picacomic.com/\";\nvar __POOL = [\"172.67.194.19\", \"172.67.80.1\", \"104.21.235.3\",\n              \"104.21.235.4\", \"104.21.91.145\", \"104.19.53.76\",\n              \"104.21.80.1\", \"104.21.81.1\", \"104.16.0.1\", \"104.17.0.1\"];\nfunction __coverParse(media) {\n  var out = { host: \"\", path: \"\", raw: \"\", isSB: false };\n  if (!media) { return out; }\n  var fs = String(media.fileServer || \"\").replace(/\\/$/, \"\");\n  var path = String(media.path || \"\").replace(/^\\/?/, \"\");\n  out.raw = path;\n  if (!path) { return out; }\n  if (path.indexOf(\"tobeimg/\") === 0) {\n    var idx = path.indexOf(\"/g:sm/\");\n    if (idx >= 0) {\n      var b64 = path.substring(idx + 6);\n      var m = b64.match(/^([A-Za-z0-9+/=]+)(\\.[A-Za-z0-9]+)?$/);\n      if (m) {\n        try {\n          var pay = m[1];\n          while (pay.length % 4 !== 0) { pay += \"=\"; }\n          var real = String(new Packages.java.lang.String(\n              Packages.android.util.Base64.decode(pay, 0), \"UTF-8\"));\n          var i2 = real.indexOf(\"/static/\");\n          if (i2 >= 0) {\n            out.host = real.substring(0, i2).replace(/^https?:\\/\\//, \"\");\n            out.path = real.substring(i2);\n            out.isSB = out.host.indexOf(\"storage-b\") >= 0;\n            return out;\n          }\n        } catch (e0) {}\n      }\n    }\n  }\n  out.host = fs.replace(/^https?:\\/\\//, \"\");\n  if (path.indexOf(\"tobs/\") === 0) { path = path.substring(5); }\n  out.path = \"/static/\" + path;\n  out.isSB = out.host.indexOf(\"storage-b\") >= 0;\n  return out;\n}\nfunction __hash(s) {\n  var h = 0; s = String(s || \"\");\n  for (var i = 0; i < s.length; i++) { h = ((h << 5) - h + s.charCodeAt(i)) | 0; }\n  return Math.abs(h);\n}\nfunction __pool() {\n  var p = \"\";\n  try { p = String(source.get(\"picab_pool\") || \"\"); } catch (e0) {}\n  if (p === \"none\") { return \"\"; }\n  if (p) { return p; }\n  return __POOL.join(\",\");\n}\nfunction __coverMode() {\n  try {\n    var m = String(source.get(\"picab_cover_mode\") || \"ip\");\n    return (m === \"dns\" || m === \"mirror\") ? m : \"ip\";\n  } catch (e0) { return \"ip\"; }\n}\nfunction __cover(media) {\n  var t = __coverParse(media);\n  if (!t.raw) { return \"\"; }\n  var mode = __coverMode();\n  if (mode === \"mirror\") { return \"https://s3.go2778.com/static/\" + t.raw; }\n  if (!t.host) { return \"\"; }\n  if (mode === \"dns\") { return \"https://\" + t.host + t.path; }\n  if (t.isSB) {\n    var ips = __POOL;\n    var ip = ips[__hash(t.path) % ips.length];\n    return \"http://\" + ip + t.path\n         + ',{\"method\":\"GET\",\"timeout\":20000,\"headers\":{\"Host\":\"' + t.host + '\"}}';\n  }\n  return \"https://\" + t.host + t.path;\n}\n\nvar __token = \"\";\ntry {\n  var __lh = String(source.getLoginHeader() || \"\");\n  if (__lh && __lh !== \"null\") {\n    var __m = __lh.match(new RegExp('\"authorization\"\\\\s*:\\\\s*\"([^\"]+)\"'));\n    __token = __m ? __m[1] : __lh;\n  }\n} catch (eT0) {}\nif (!__token) {\n  try { __token = String(source.get(\"picab_token\") || \"\"); } catch (eT1) {}\n}\n\nfunction __hmac(raw, key) {\n  var m = Packages.javax.crypto.Mac.getInstance(\"HmacSHA256\");\n  m.init(new Packages.javax.crypto.spec.SecretKeySpec(\n      new Packages.java.lang.String(key).getBytes(\"UTF-8\"), \"HmacSHA256\"));\n  var b = m.doFinal(new Packages.java.lang.String(raw).getBytes(\"UTF-8\"));\n  var s = \"\";\n  for (var i = 0; i < b.length; i++) {\n    var x = b[i] & 0xff;\n    s += (x < 16 ? \"0\" : \"\") + x.toString(16);\n  }\n  return s;\n}\n\nfunction __hdr(path, method) {\n  var ts = String(Math.floor(Date.now() / 1000));\n  var nc = \"\";\n  for (var i = 0; i < 32; i++) {\n    nc += \"0123456789abcdef\".charAt(Math.floor(Math.random() * 16));\n  }\n  var raw = (path + ts + nc + method + __API_KEY).toLowerCase();\n  var h = {\n    \"User-Agent\": \"okhttp/3.8.1\",\n    \"accept\": \"application/vnd.picacomic.com.v1+json\",\n    \"api-key\": __API_KEY,\n    \"app-channel\": \"2\",\n    \"app-version\": \"2.2.1.2.3.3\",\n    \"app-uuid\": \"defaultUuid\",\n    \"app-platform\": \"android\",\n    \"app-build-version\": \"44\",\n    \"image-quality\": \"original\",\n    \"time\": ts,\n    \"nonce\": nc,\n    \"signature\": __hmac(raw, __SECRET)\n  };\n  if (__token && __token !== \"null\") { h[\"authorization\"] = __token; }\n  return h;\n}\n\nvar _j = JSON.parse(result);\nif (_j.code !== 200) { throw new Error(\"发现页失败: \" + (_j.message || _j.code)); }\n\nvar _list = [];\ntry {\n  if (String(baseUrl).indexOf(\"knight-leaderboard\") >= 0) {\n    var _us = _j.data.users || [];\n    _list = _us.map(function (u) {\n      var __t = \"\";\n      try {\n        __t = String(u.avatar ? (String(u.avatar.fileServer || \"\").replace(/\\/$/, \"\") + \"/static/\" + String(u.avatar.path || \"\")) : \"\");\n      } catch (eA) {}\n      return {\n        name: java.t2s(String(u.name || \"\")),\n        author: \"Lv.\" + (u.level || \"?\") + \" · \" + (u.title || \"\"),\n        cover: __t,\n        intro: (u.slogan || \"\") + \"\\n[骑士档案]\",\n        kind: \"骑士榜\",\n        latest: \"\", word: \"\",\n        url: __BASE + \"comics?page=1&ca=\" + (u._id || \"\")\n            + ',{\"method\":\"GET\",\"retry\":3,\"timeout\":20000,'\n            + '\"headers\":' + JSON.stringify(__hdr(\"comics?page=1&ca=\" + (u._id || \"\"), \"GET\"))\n            + ',\"dnsIp\":\"' + __pool() + '\"}'\n      };\n    });\n  } else {\n    var _d = _j.data || {};\n    var __docs = [];\n    if (_d.collections) {\n      (_d.collections || []).forEach(function (g) {\n        var arr = (g.comics && g.comics.docs) ? g.comics.docs : (g.comics || []);\n        arr.forEach(function (c) { c.__group = g.title; __docs.push(c); });\n      });\n    } else if (_d.comics) {\n      __docs = _d.comics.docs || _d.comics || [];\n    } else if (_d.docs) {\n      __docs = _d.docs;\n    } else if (Array.isArray(_d)) {\n      __docs = _d;\n    }\n    if (!Array.isArray(__docs)) { __docs = []; }\n    _list = __docs.map(function (c) {\n      if (!c) { return null; }\n      return {\n        name: c.title || \"\",\n        author: c.author || \"\",\n        cover: __cover(c.thumb),\n        intro: \"\",\n        kind: [(c.__group || \"\"),\n               String(c.categories || []).replace(/,/g, \" \"),\n               c.finished ? \"完结\" : \"连载\",\n               c.likesCount ? c.likesCount + \"♥\" : \"\"].filter(Boolean).join(\" · \"),\n        latest: \"\", word: \"\",\n        url: __BASE + \"comics/\" + (c._id || \"\")\n            + ',{\"method\":\"GET\",\"retry\":3,\"timeout\":20000,'\n            + '\"headers\":' + JSON.stringify(__hdr(\"comics/\" + (c._id || \"\"), \"GET\"))\n            + ',\"dnsIp\":\"' + __pool() + '\"}'\n      };\n    });\n  }\n} catch (eItem) {\n  _list = [{\n    name: \"[ERR] \" + String(eItem).substring(0, 130),\n    author: \"诊断行\", cover: \"\", intro: \"\", kind: \"err\", latest: \"\", word: \"\", url: \"\"\n  }];\n}\nif (!_list.length) {\n  var _tail = String(baseUrl);\n  _tail = _tail.substring(_tail.lastIndexOf(\"/\") + 1).split(\",\")[0].substring(0, 40);\n  _list = [{ name: \"[空] 此列表暂无内容 (\" + _tail + \")\",\n             author: \"接口返回 code=\" + _j.code + \" 但解析为空\",\n             cover: \"\", intro: \"换个分类试试，或稍后再来\", kind: \"空列表\", latest: \"\", word: \"\", url: \"\" }];\n}\n_list.filter(function (x) { return x; });\n</js>\n", "bookUrl": "url", "coverUrl": "cover", "intro": "intro", "kind": "kind", "lastChapter": "latest", "name": "name"}, "ruleSearch": {"author": "author", "bookList": "<js>\nvar _j = JSON.parse(result);\nif (_j.code !== 200) { throw new Error(\"搜索失败: \" + (_j.message || _j.code)); }\nvar _d = picac_list(_j.data);\n_d.map(function (x) { return picac_item(x, source, java); }).filter(function (x) { return x; });\n</js>", "bookUrl": "url", "coverUrl": "cover", "intro": "intro", "kind": "kind", "lastChapter": "latest", "name": "name"}, "ruleToc": {"chapterList": "<js>\nvar _j = JSON.parse(result);\nif (_j.code !== 200) { throw new Error(\"目录获取失败: \" + (_j.message || _j.code)); }\nvar _e = (_j.data && _j.data.eps) ? (_j.data.eps.docs || []) : [];\nvar _bid = picac_bookid(baseUrl);\nvar _at = String.fromCharCode(64,106,115,58);\nvar _sg = '(function(){ var K=\"C69BAF41DA5ABD1FFEDC6D2FEA56B\"; var S=\"~d}$Q7$eIni=V)9\"+String.fromCharCode(92)+\"RK/P.RM4;9[7|@/CA}b~OW!3?EV\"+String.fromCharCode(96,58,60,62)+\"M7pddUBL5n|0/*Cn\"; var PL=\"\"; try{PL=String(source.get(\"picab_pool\")||\"\");}catch(e0){} if(PL===\"none\"){PL=\"\";}else if(!PL){PL=\"172.67.194.19,172.67.80.1,104.21.235.3,104.21.235.4,104.21.91.145,104.19.53.76,104.21.80.1,104.21.81.1,104.16.0.1,104.17.0.1\";} var pre=String(result); var a=pre.substring(pre.indexOf(\"://\")+3); var p=a.substring(a.indexOf(\"/\")); if(p.charAt(0)===\"/\"){p=p.substring(1);} var ts=String(Math.floor(Date.now()/1000)); var nc=\"\"; for(var i=0;i<32;i++)nc+=\"0123456789abcdef\".charAt(Math.floor(Math.random()*16)); var raw=(p+ts+nc+\"GET\"+K).toLowerCase(); var m=Packages.javax.crypto.Mac.getInstance(\"HmacSHA256\"); m.init(new Packages.javax.crypto.spec.SecretKeySpec(new Packages.java.lang.String(S).getBytes(\"UTF-8\"),\"HmacSHA256\")); var b=m.doFinal(new Packages.java.lang.String(raw).getBytes(\"UTF-8\")); var sg=\"\"; for(var i=0;i<b.length;i++){var x=b[i]&0xff;sg+=(x<16?\"0\":\"\")+x.toString(16);} var h={\"User-Agent\":\"okhttp/3.8.1\",\"accept\":\"application/vnd.picacomic.com.v1+json\",\"api-key\":K,\"app-channel\":\"2\",\"app-version\":\"2.2.1.2.3.3\",\"app-uuid\":\"defaultUuid\",\"app-platform\":\"android\",\"app-build-version\":\"44\",\"image-quality\":\"original\",\"time\":ts,\"nonce\":nc,\"signature\":sg}; var au=\"\"; try{au=String(source.get(\"picab_token\"));}catch(e){} if(au&&au!==\"null\"&&au!==\"\"){h[\"authorization\"]=au;} var opt={method:\"GET\",timeout:25000,retry:0,headers:h}; if(PL){opt.dnsIp=PL;} return \"https://picaapi.picacomic.com/\"+p+\",\"+JSON.stringify(opt); })()';\nvar _out = _e.map(function (x) {\n  return {\n    title: x.title || (\"第\" + x.order + \" 话\"),\n    url: \"https://picaapi.picacomic.com/comics/\" + _bid + \"/order/\" + x.order + \"/pages?page=1\" + _at + _sg\n  };\n});\n_out;\n</js>", "chapterName": "title", "chapterUrl": "url"}, "searchUrl": "<js>\npicac_opt(\"comics/advanced-search?page=\" + (page || 1),\n        { method: \"POST\", body: JSON.stringify({ keyword: key, sort: \"dd\" }),\n          timeout: 60000, retry: 2 },\n        source, java);\n</js>", "variableComment": "picaToken=登录后的 authorization（登录成功后自动写入，也可手动粘贴）", "weight": 0},{"bookSourceComment": "番茄小说网页版。发现：男生/女生/全部 主分类，筛选（状态/字数/排序）在「登录」界面设置后保存。搜索走字节小说频道公开搜索接口。正文为站点字体加密，jsLib 内置两张映射表（正文字体 dc027189e0ba4cd、书库列表字体 e26e946d8b2ccb7，2026-10-24 由字体字形比对生成）。网页端第10章之后需登录番茄账号（登录界面「网页登录」）才返回全文，本源不处理付费内容。", "bookSourceGroup": "番茄", "bookSourceName": "番茄小说", "bookSourceType": 0, "bookSourceUrl": "https://fanqienovel.com", "customOrder": -1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "@js:\nvar C = {\"m\":[[\"西方奇幻\",1141],[\"东方仙侠\",1140],[\"科幻末世\",8],[\"男频衍生\",1016],[\"都市高武\",1014],[\"悬疑灵异\",751],[\"悬疑脑洞\",539],[\"抗战谍战\",504],[\"历史古代\",273],[\"历史脑洞\",272],[\"都市种田\",263],[\"都市脑洞\",262],[\"都市日常\",261],[\"玄幻脑洞\",257],[\"战神赘婿\",27],[\"动漫衍生\",718],[\"游戏体育\",746],[\"传统玄幻\",258],[\"都市修真\",124]],\"f\":[[\"女频悬疑\",747],[\"古风世情\",1139],[\"科幻末世\",8],[\"女频衍生\",1015],[\"民国言情\",1017],[\"悬疑脑洞\",539],[\"青春甜宠\",749],[\"双男主\",275],[\"古言脑洞\",253],[\"现言脑洞\",267],[\"玄幻言情\",248],[\"宫斗宅斗\",246],[\"豪门总裁\",748],[\"动漫衍生\",718],[\"星光璀璨\",745],[\"游戏体育\",746],[\"职场婚恋\",750],[\"双女主\",704],[\"年代\",79],[\"种田\",23],[\"快穿\",24]],\"a\":[[\"女频悬疑\",747],[\"西方奇幻\",1141],[\"东方仙侠\",1140],[\"古风世情\",1139],[\"科幻末世\",8],[\"男频衍生\",1016],[\"女频衍生\",1015],[\"民国言情\",1017],[\"都市高武\",1014],[\"悬疑灵异\",751],[\"悬疑脑洞\",539],[\"抗战谍战\",504],[\"青春甜宠\",749],[\"双男主\",275],[\"古言脑洞\",253],[\"历史古代\",273],[\"历史脑洞\",272],[\"现言脑洞\",267],[\"都市种田\",263],[\"都市脑洞\",262],[\"都市日常\",261],[\"玄幻脑洞\",257],[\"玄幻言情\",248],[\"宫斗宅斗\",246],[\"豪门总裁\",748],[\"战神赘婿\",27],[\"动漫衍生\",718],[\"星光璀璨\",745],[\"游戏体育\",746],[\"职场婚恋\",750],[\"双女主\",704],[\"传统玄幻\",258],[\"都市修真\",124],[\"年代\",79],[\"种田\",23],[\"快穿\",24]]};\nvar groups = [[\"男生\", 1, C.m], [\"女生\", 0, C.f], [\"全部\", -1, C.a]];\nvar api = \"https://fanqienovel.com/api/author/library/book_list/v0/?page_count=18&page_index={{page-1}}\";\nvar opt = JSON.stringify({bodyJs: \"fqDecL(result)\"});\nvar out = [];\nfor (var i = 0; i < groups.length; i++) {\n  var g = groups[i];\n  out.push({title: g[0], url: \"\", style: {layout_flexBasisPercent: 1, layout_flexGrow: 1}});\n  var list = [[\"全部\", -1]].concat(g[2]);\n  for (var j = 0; j < list.length; j++) {\n    out.push({\n      title: list[j][0],\n      url: api + \"&gender=\" + g[1] + \"&category_id=\" + list[j][1] + \"&book_type=-1{{fqFilter(source.getLoginInfo())}},\" + opt,\n      style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}\n    });\n  }\n}\nJSON.stringify(out);", "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36\", \"Referer\": \"https://fanqienovel.com/\"}", "jsLib": "var FQ_BASE = 0xE3E8;\nvar FQ_TC = \"D在主特家军然表场4要只v和#6别还g现儿岁##此象月3出战工相o男直失世F都平文什VO将真T那当#会立些u是十张学气大爱两命全后东性通被1它乐接而感车山公了常以何可话先pi叫轻M士w着变尔快l个说少色里安花远7难师放t报认面道S#克地度I好机U民写把万同水新没书电吃像斯5为y白几日教看但第加候作上拉住有法r事应位利你声身国问马女他Y比父xAHNsX边美对所金活回意到z从j知又内因点Q三定8Rb正或夫向德听更#得告并本q过记L让打f人就者去原满体做经K走如孩cG给使物#最笑部#员等受k行一条果动光门头见往自解成处天能于名其发总母的死手入路进心来h时力多开已许d至由很界n小与Z想代么分生口再妈望次西风种带J#实情才这#E我神格长觉间年眼无不亲关结0友信下却重己老2音字m呢明之前高PB目太e9起棱她也W用方子英每理便四数期中C外样a海们任\";\nvar FQ_TL = \"体y十现快便话却月物水的放知爱万#表风理O老也p常克平几最主她s将法情o光a我呢J员太每望受教w利军已U人如变得要少斯门电m男没AK国时中走么何口小向问轻Td神下间车fG度D又大面远就写j给通起实E#它去S到道数吃们加P是无把事西多界#发新外活解孩只作前Y尔经#u心告父等Q民全这9果安#i母8r说任先和地C张战场g像cq你使#样总目x性处音头#应乐关能花l当名手4重字声力友然生代内里本回真入师象#0点R亲V种动英命ZhX做特边高有B为期自年马认出接至H正方感所明者棱F住学还分意更其n但比觉以由死家让失士L2I金叫身报听W再原山海白很见5直位第工个开岁好用都于可同3次四#日信与女笑满并部什不从或机此#了记三e些bN夫会才儿眼两美被一公来立z长对己看k许因相色后往打结格过世气7子条在书之定v拉成进带着东上想天他妈1文而路那别德6Mt行候难\";\nfunction fqDec(s, t) {\n  if (s == null) return \"\";\n  s = String(s);\n  var out = [], i, c, ch;\n  for (i = 0; i < s.length; i++) {\n    c = s.charCodeAt(i);\n    if (c >= FQ_BASE && c < FQ_BASE + t.length) {\n      ch = t.charAt(c - FQ_BASE);\n      out.push(ch == \"#\" ? s.charAt(i) : ch);\n    } else out.push(s.charAt(i));\n  }\n  return out.join(\"\");\n}\nfunction fqDecC(s) { return fqDec(s, FQ_TC); }\nfunction fqDecL(s) { return fqDec(s, FQ_TL); }\nfunction fqHasPua(s) { return /[\\uE000-\\uF8FF]/.test(String(s)); }\nfunction fqFilter(info) {\n  var m = {};\n  try { if (info != null && String(info) != \"\") m = JSON.parse(String(info)) || {}; } catch (e) { m = {}; }\n  var a = String(m[\"状态\"] || \"\"), b = String(m[\"字数\"] || \"\").replace(/\\s/g, \"\"), c = String(m[\"排序\"] || \"\");\n  var st = /完/.test(a) ? 0 : (/连/.test(a) ? 1 : -1);\n  var wc = -1;\n  if (/^30(万)?(字)?以下/.test(b)) wc = 0;\n  else if (/^30[-~～至]50/.test(b)) wc = 1;\n  else if (/^50[-~～至]100/.test(b)) wc = 2;\n  else if (/^100[-~～至]200/.test(b)) wc = 3;\n  else if (/^200(万)?(字)?以上/.test(b)) wc = 4;\n  var so = /新/.test(c) ? 1 : (/字/.test(c) ? 2 : 0);\n  return \"&creation_status=\" + st + \"&word_count=\" + wc + \"&sort=\" + so;\n}\nfunction fqWan(n) { n = Number(n) || 0; return n >= 10000 ? (n / 10000).toFixed(1) + \"万字\" : n + \"字\"; }\nfunction fqContent(html) {\n  html = String(html);\n  var m = html.match(/__INITIAL_STATE__\\s*=\\s*(\\{[\\s\\S]*?\\});\\s*\\}\\s*\\)\\s*\\(\\s*\\)/);\n  if (!m) return \"【番茄】未找到章节数据（页面结构可能已变化）\";\n  var st = JSON.parse(m[1].replace(/:\\s*undefined/g, \":null\"));\n  var cd = (st.reader && st.reader.chapterData) || {};\n  var raw = String(cd.content || \"\");\n  var paras = [];\n  raw.replace(/<p[^>]*>([\\s\\S]*?)<\\/p>/g, function (a, b) { paras.push(b); return a; });\n  if (!paras.length) paras = raw.split(/<br\\s*\\/?>|\\n/);\n  var lines = [], i, t;\n  for (i = 0; i < paras.length; i++) {\n    t = fqDecC(paras[i]).replace(/<[^>]+>/g, \"\").replace(/&nbsp;/g, \" \").replace(/&lt;/g, \"<\").replace(/&gt;/g, \">\").replace(/&quot;/g, \"\\\"\").replace(/&#39;/g, \"'\").replace(/&amp;/g, \"&\").replace(/^\\s+|\\s+$/g, \"\");\n    if (t) lines.push(t);\n  }\n  var text = lines.join(\"\\n\");\n  var words = Number(cd.chapterWordNumber) || 0;\n  if ((cd.isChapterLock === true || String(cd.isChapterLock) == \"true\") && words > 0 && text.length < words * 0.6) {\n    text += \"\\n\\n【未登录：番茄网页端第10章以后只返回片段。请在书源「登录」界面点「网页登录」登录自己的番茄账号，然后刷新本章。】\";\n  }\n  if (fqHasPua(text)) text += \"\\n\\n【番茄字体映射可能已更新，部分文字无法解码，请反馈更新书源】\";\n  return text;\n}", "lastUpdateTime": "1792825494301", "loginUi": "[{\"name\": \"状态\", \"type\": \"select\", \"chars\": [\"全部\", \"连载中\", \"已完结\"], \"default\": \"全部\"}, {\"name\": \"字数\", \"type\": \"select\", \"chars\": [\"全部\", \"30万以下\", \"30-50万\", \"50-100万\", \"100-200万\", \"200万以上\"], \"default\": \"全部\"}, {\"name\": \"排序\", \"type\": \"select\", \"chars\": [\"最热\", \"最新\", \"字数\"], \"default\": \"最热\"}, {\"name\": \"网页登录（第10章后全文需登录）\", \"type\": \"button\", \"action\": \"webLogin()\"}]", "loginUrl": "function login() {\n  java.toast(\"筛选已保存，回到发现页刷新分类即可生效\");\n}\nfunction webLogin() {\n  java.startBrowserAwait(\"https://fanqienovel.com/main/writer/login\", \"登录番茄账号（完成后点右上角完成/返回）\");\n}", "ruleBookInfo": {"author": "$.data.author", "coverUrl": "$.data.thumbUrl", "intro": "$.data.abstract", "kind": "@js:var d=JSON.parse(String(result)).data;var a=[];try{var c=JSON.parse(d.categoryV2||'[]');for(var i=0;i<c.length;i++)a.push(c[i].Name);}catch(e){}a.push(String(d.creationStatus)=='0'?'已完结':'连载中');a.join(',')", "lastChapter": "$.data.lastChapterTitle", "name": "$.data.bookName", "tocUrl": "https://fanqienovel.com/api/reader/directory/detail?bookId={{$.data.bookId}}", "wordCount": "@js:fqWan(JSON.parse(String(result)).data.wordNumber)"}, "ruleContent": {"content": "@js:fqContent(result)"}, "ruleExplore": {"author": "$.author", "bookList": "$.data.book_list[*]", "bookUrl": "https://fanqienovel.com/api/book/info?bookId={{$.book_id}}", "coverUrl": "$.thumb_url", "intro": "$.abstract", "kind": "$.creation_status@js:String(result)=='0'?'已完结':(String(result)=='1'?'连载中':'')", "name": "$.book_name", "wordCount": "$.word_count"}, "ruleSearch": {"author": "$.author", "bookList": "$.data.ret_data[*]", "bookUrl": "https://fanqienovel.com/api/book/info?bookId={{$.book_id}}", "checkKeyWord": "十日终焉", "coverUrl": "$.thumb_url", "intro": "$.abstract", "kind": "$.category", "name": "$.title##</?em>"}, "ruleToc": {"chapterList": "$.data.chapterListWithVolume[*][*]", "chapterName": "$.title", "chapterUrl": "https://fanqienovel.com/reader/{{$.itemId}}", "isVip": "$.needPay", "updateTime": "$.volume_name"}, "searchUrl": "https://novel.snssdk.com/api/novel/channel/homepage/search/search/v1/?device_platform=android&parent_enterfrom=novel_channel_search.tab.&aid=13&offset={{(page-1)*10}}&q={{key}}", "weight": 0},{"bookSourceComment": "站点自身无搜索入口（/search.html、/search.php、/s.php、/soso.html 均 404，首页/分类/排行榜/书架页均无搜索表单或搜索接口），因此本源 searchUrl 无实际意义，请配合系统「选中文字→顶部搜索」使用（分组：人机搜索）。发现：分类页 /sort/{cat}/{page}/、排行榜 /top/、完本 /full/。目录为 /ls/{前3位}/{id}/{页码}，每页 20 章，自动翻页。正文分页 _2.html/_3.html 由 nextContentUrl 自动续读。", "bookSourceGroup": "人机搜索", "bookSourceName": "希冀小说网", "bookSourceType": 0, "bookSourceUrl": "https://m.xi-ji.com", "bookUrlPattern": "https://m\\.xi-ji\\.com/info/\\d+/?$", "concurrentRate": "500", "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "exploreUrl": "[{\"title\":\"玄幻\",\"url\":\"/sort/xuanhuan/{{page}}/\",\"style\":{\"layout_flexBasisPercent\":0.25}},{\"title\":\"仙侠\",\"url\":\"/sort/xianxia/{{page}}/\",\"style\":{\"layout_flexBasisPercent\":0.25}},{\"title\":\"都市\",\"url\":\"/sort/dushi/{{page}}/\",\"style\":{\"layout_flexBasisPercent\":0.25}},{\"title\":\"历史\",\"url\":\"/sort/lishi/{{page}}/\",\"style\":{\"layout_flexBasisPercent\":0.25}},{\"title\":\"游戏\",\"url\":\"/sort/youxi/{{page}}/\",\"style\":{\"layout_flexBasisPercent\":0.25}},{\"title\":\"科幻\",\"url\":\"/sort/kehuan/{{page}}/\",\"style\":{\"layout_flexBasisPercent\":0.25}},{\"title\":\"其他\",\"url\":\"/sort/qita/{{page}}/\",\"style\":{\"layout_flexBasisPercent\":0.25}},{\"title\":\"排行榜\",\"url\":\"/top/\",\"style\":{\"layout_flexBasisPercent\":0.25}},{\"title\":\"完本\",\"url\":\"/full/\",\"style\":{\"layout_flexBasisPercent\":0.25}}]", "ruleBookInfo": {"author": "meta[property=og:novel:author]@content", "coverUrl": "meta[property=og:image]@content", "intro": "meta[property=og:description]@content", "kind": "meta[property=og:novel:category]@content", "lastChapter": "meta[property=og:novel:latest_chapter_name]@content", "name": "meta[property=og:novel:book_name]@content", "tocUrl": "div.readlink > a.1@href"}, "ruleContent": {"content": "#chaptercontent@html\n<js>\nvar t = String(result);\nt = t.replace(/<br\\s*\\/?>/gi, '\\n');\nt = t.replace(/<\\/p>/gi, '\\n');\nt = t.replace(/<(p|div)[^>]*>/gi, '\\n');\nt = t.replace(/<[^>]+>/g, '');\nt = t.replace(/本文链接[:：]?\\s*\\S*/g, '');\nt = t.replace(/本章还未完[^\\n]*/g, '');\nt = t.replace(/本章未完[^\\n]*/g, '');\nt = t.replace(/\\(\\d+\\/\\d+\\)/g, '');\nt = t.replace(/[ \\t\\u00a0]+/g, ' ');\nt = t.replace(/\\n\\s*\\n/g, '\\n');\nt = t.replace(/^\\s+|\\s+$/g, '');\nt.trim();\n</js>", "nextContentUrl": "a#pb_next@href", "replaceRegex": "##本章还未完.*", "title": "div.header > span.title@text"}, "ruleExplore": {"bookList": "div.hot > div.item, ul.topli > li", "bookUrl": "a@href", "coverUrl": "img@src", "intro": "dd > p@text", "kind": "span.rate@text##类型$##", "name": "a@text"}, "ruleSearch": {"author": "dt > span@text", "bookList": "div.item", "bookUrl": "dt > a@href", "coverUrl": "img@src", "intro": "dd > p@text", "name": "dt > a@text"}, "ruleToc": {"chapterList": "div.book_last > dl > dd", "chapterName": "a@text", "chapterUrl": "a@href", "nextTocUrl": "span.right > a@href"}, "searchUrl": "https://m.xi-ji.com/search.html?keyword={{key}}", "lastUpdateTime": "1792825162719"},{"bookSourceComment": "刺猬书库 (m.ciweiku.com) 书源 v6：全站免登录，搜索/发现/详情/目录/正文均已用真实页面逐步验证（全职法师 3177 章、凡人武圣 104 章；正文自动拼接与净化）。注意：该站对 App 普通请求上 Cloudflare 验证，v5 起搜索、发现、目录、正文、正文分页全部改走 WebView 请求；v6 起正文自动净化掉多页章节里个别失败页带入的 Cloudflare 提示行（整章都失败时仍保留提示）。by斯诺伤", "bookSourceGroup": "小说", "bookSourceName": "刺猬书库", "bookSourceType": 0, "bookSourceUrl": "http://m.ciweiku.com", "bookUrlPattern": "ciweiku\\.com/ciwei/\\d+_\\d+", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\": \"🦔 刺猬书库\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"🔥 热门推荐\", \"url\": \"http://m.ciweiku.com/?board=rec,{\\\"webView\\\":true}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}}, {\"title\": \"━━━  排行榜  ━━━\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"阅读排行\", \"url\": \"http://m.ciweiku.com/?board=read,{\\\"webView\\\":true}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"热赞排行\", \"url\": \"http://m.ciweiku.com/?board=zan,{\\\"webView\\\":true}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"今日更新\", \"url\": \"http://m.ciweiku.com/?board=update,{\\\"webView\\\":true}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"新书入库\", \"url\": \"http://m.ciweiku.com/?board=new,{\\\"webView\\\":true}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"网友热搜\", \"url\": \"http://m.ciweiku.com/?board=hot,{\\\"webView\\\":true}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"━━━  分类  ━━━\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"玄幻\", \"url\": \"http://m.ciweiku.com/ciwei121-{{page}}.html,{\\\"webView\\\":true}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"仙侠\", \"url\": \"http://m.ciweiku.com/ciwei122-{{page}}.html,{\\\"webView\\\":true}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"都市\", \"url\": \"http://m.ciweiku.com/ciwei123-{{page}}.html,{\\\"webView\\\":true}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"历史\", \"url\": \"http://m.ciweiku.com/ciwei124-{{page}}.html,{\\\"webView\\\":true}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"网游\", \"url\": \"http://m.ciweiku.com/ciwei125-{{page}}.html,{\\\"webView\\\":true}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"科幻\", \"url\": \"http://m.ciweiku.com/ciwei126-{{page}}.html,{\\\"webView\\\":true}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"其他\", \"url\": \"http://m.ciweiku.com/ciwei127-{{page}}.html,{\\\"webView\\\":true}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}]", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 12; V2283A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Mobile Safari/537.36\", \"Referer\": \"http://m.ciweiku.com/\"}", "jsLib": "function coverOf(bookUrl) {\nvar m = String(bookUrl || '').match(/ciwei\\/(\\d+)_(\\d+)\\//);\nif (!m) return '';\nreturn 'http://m.ciweiku.com/files/article/image/' + m[1] + '/' + m[2] + '/' + m[2] + 's.jpg';\n}\nfunction cleanIntroText(t) {\nvar s = String(t || '').replace(/\\s+/g, ' ').trim();\ns = s.replace(/\\s*\\.\\.\\.[\\s\\S]*$/, '');\ns = s.replace(/\\[点击阅读\\]/g, '').trim();\nreturn s;\n}\nfunction mkCard(name, author, kind, last, intro, cover, bookUrl, upd) {\nvar div = new org.jsoup.nodes.Element('div');\nvar h3 = new org.jsoup.nodes.Element('h3');\nvar a = new org.jsoup.nodes.Element('a');\na.attr('href', bookUrl);\na.text(name || '');\nh3.appendChild(a);\ndiv.appendChild(h3);\nif (cover) {\nvar im = new org.jsoup.nodes.Element('img');\nim.attr('src', cover);\ndiv.appendChild(im);\n}\nvar fields = [['au', author], ['ki', kind], ['lc', last], ['ut', upd]];\nfor (var i = 0; i < fields.length; i++) {\nvar sp = new org.jsoup.nodes.Element('span');\nsp.attr('class', fields[i][0]);\nsp.text(fields[i][1] || '');\ndiv.appendChild(sp);\n}\nvar p = new org.jsoup.nodes.Element('p');\np.text(intro || '');\ndiv.appendChild(p);\nreturn div;\n}\nfunction mediaCards(scope) {\nvar out = new org.jsoup.select.Elements();\nvar items = scope.select('div.media, li.list-group-item');\nfor (var i = 0; i < items.size(); i++) {\nvar c = items.get(i);\nif (String(c.tagName()) === 'li') {\nvar la = c.select('a[href*=\"/ciwei/\"]').first();\nif (!la) continue;\nvar lname = String(la.text()).replace(/\\s+/g, ' ').trim();\nvar lurl = String(la.attr('abs:href') || la.attr('href') || '');\nif (!lname || !lurl) continue;\nout.add(mkCard(lname, '', '', '', '', coverOf(lurl), lurl, ''));\ncontinue;\n}\nvar a = c.select('h4.book-title a').first();\nif (!a) continue;\nvar name = String(a.text()).replace(/\\s+/g, ' ').trim();\nvar url = String(a.attr('abs:href') || a.attr('href') || '');\nif (!name || !url) continue;\nvar au = c.select('.book_author a').first();\nvar author = au ? String(au.text()).trim() : '';\nvar ip = c.select('p.book-intro-index, p.cat-book-intro').first();\nvar intro = '';\nif (ip) {\nvar clone = ip.clone();\nclone.select('a').remove();\nintro = cleanIntroText(clone.text());\n}\nvar img = c.select('.media-left img, img').first();\nvar cover = img ? String(img.attr('abs:src') || img.attr('src') || '') : '';\nif (!cover) cover = coverOf(url);\nout.add(mkCard(name, author, '', '', intro, cover, url, ''));\n}\nreturn out;\n}\nfunction findPanel(doc, kw) {\nvar panels = doc.select('.panel');\nfor (var i = 0; i < panels.size(); i++) {\nvar hd = panels.get(i).select('.panel-heading').first();\nif (hd && String(hd.text()).indexOf(kw) >= 0) return panels.get(i);\n}\nreturn null;\n}\nfunction tocLis(doc) {\nvar panels = doc.select('.panel');\nfor (var i = 0; i < panels.size(); i++) {\nvar hd = panels.get(i).select('.panel-heading').first();\nif (hd && String(hd.text()).indexOf('全部章节') >= 0) return panels.get(i).select('ul.list-charts li');\n}\nvar firstUl = doc.select('ul.list-charts').first();\nreturn firstUl ? firstUl.select('li') : new org.jsoup.select.Elements();\n}function tipItem(msg, url) {\nvar out = new org.jsoup.select.Elements();\nvar div = new org.jsoup.nodes.Element('div');\nvar h3 = new org.jsoup.nodes.Element('h3');\nvar a = new org.jsoup.nodes.Element('a');\na.attr('href', url);\na.text(msg);\nh3.appendChild(a);\ndiv.appendChild(h3);\nout.add(div);\nreturn out;\n}\n", "lastUpdateTime": "1792764654453", "loginUrl": "http://m.ciweiku.com/", "respondTime": 60000, "ruleBookInfo": {"author": ".info2 h3 a@text", "coverUrl": ".info1 img@src##^##http://m.ciweiku.com", "intro": ".info2 div p@text", "kind": "@js:\n(function () {\nvar doc = org.jsoup.Jsoup.parse(String(result || ''), String(baseUrl || ''));\nvar p = doc.select('.info3 p').first();\nif (!p) return '';\nvar t = String(p.text());\nvar kind = '';\nvar status = '';\nvar mk = t.match(/小说类别[:：]\\s*([^/]+)/);\nif (mk) kind = mk[1].trim();\nvar ms = t.match(/写作状态[:：]\\s*(\\S+)/);\nif (ms) status = ms[1].trim();\nif (kind && status) return kind + ' · ' + status;\nreturn kind || status;\n})()", "lastChapter": "@js:\n(function () {\nvar doc = org.jsoup.Jsoup.parse(String(result || ''), String(baseUrl || ''));\nvar lis = tocLis(doc);\nif (lis.size() > 0) {\nvar la = lis.get(lis.size() - 1).select('a').first();\nif (la) return String(la.text()).replace(/\\s+/g, ' ').trim();\n}\nvar a = doc.select('.info3 a[href*=\"/ciweik/\"]').first();\nreturn a ? String(a.text()).replace(/\\s+/g, ' ').trim() : '';\n})()", "name": ".info2 h1@text", "tocUrl": "@js:\n(function () {\ntry {\nvar u = String(baseUrl || '');\nif (u) return u + ',{\"webView\":true}';\n} catch (e) {}\ntry {\nvar doc = org.jsoup.Jsoup.parse(String(result || ''));\nvar og = doc.select('meta[property=og:url]').first();\nvar u2 = og ? String(og.attr('content') || '') : '';\nif (u2) return u2 + ',{\"webView\":true}';\n} catch (e2) {}\nreturn '';\n})()"}, "ruleContent": {"content": "@js:\n(function () {\nfunction extract(htmlText, url) {\nvar doc = org.jsoup.Jsoup.parse(htmlText, url);\nvar art = doc.select('div.content-body').first();\nif (!art) {\nvar divs = doc.select('div, td');\nvar best = null, bs = -1;\nfor (var i = 0; i < divs.size(); i++) {\nvar el = divs.get(i);\nvar t = String(el.text());\nvar sc = t.length - el.select('a').size() * 60;\nif (sc > bs) { bs = sc; best = el; }\n}\nart = best;\n}\nif (!art) return '';\nart.select('script, style, ins, iframe, #content_tip').remove();\nvar h = String(art.html());\nh = h.replace(/（本章未完，请点击下一页继续阅读）/g, '');\nh = h.replace(/最新网址：m\\.ciweiku\\.com/g, '');\nh = h.replace(/^\\s*(<br\\s*\\/?>\\s*)*[^<]{0,80}?\\(第\\d+\\/\\d+页\\)/, '');\nh = h.replace(/^(\\s|<br\\s*\\/?>)+/, '');\ntry {\nvar cn = String(chapter.name || '').replace(/\\s+/g, ' ').trim();\nif (cn) {\nvar segEnd = h.indexOf('<br');\nvar seg = (segEnd >= 0 ? h.substring(0, segEnd) : h).replace(/<[^>]+>/g, '').replace(/\\s+/g, ' ').trim();\nif (seg === cn) {\nvar rest = segEnd >= 0 ? h.substring(segEnd) : '';\nh = rest.replace(/^(\\s|<br\\s*\\/?>)+/, '');\n}\n}\n} catch (e) {}\nvar _cl = h.replace(/[^<>]*被 Cloudflare 拦截[^<>]*/g, '');\nif (_cl.replace(/<[^>]+>/g, '').replace(/\\s+/g, '')) h = _cl;\nreturn h;\n}\nvar _h = String(result || '');\nif (_h.indexOf('Just a moment') >= 0) return '本章被 Cloudflare 拦截：请先关闭 VPN，或点源菜单『登录』在网页里过一次验证后再读。';\nreturn extract(_h, String(baseUrl || ''));\n})()", "nextContentUrl": "@js:\n(function () {\nvar doc = org.jsoup.Jsoup.parse(String(result || ''), String(baseUrl || ''));\nvar as = doc.select('ul.pager a');\nfor (var i = 0; i < as.size(); i++) {\nif (String(as.get(i).text()).replace(/\\s+/g, '') === '下一页') {\nvar u = String(as.get(i).attr('abs:href') || '');\nreturn u ? u + ',{\"webView\":true}' : '';\n}\n}\nreturn '';\n})()", "replaceRegex": "##本章被 Cloudflare 拦截[^\\n<]*|被 Cloudflare 拦截[^\\n<]*"}, "ruleExplore": {"author": "span.au@text", "bookList": "@js:\n(function () {\nvar _html = String(result || '');\nif (_html.indexOf('Just a moment') >= 0) return tipItem('被 Cloudflare 拦截：请先关闭 VPN 再试；若仍被拦，点源菜单『登录』在网页里过一次验证', String(baseUrl || ''));\nvar doc = org.jsoup.Jsoup.parse(String(result || ''), String(baseUrl || ''));\nvar url = String(baseUrl || '');\nvar bm = url.match(/[?&]board=(\\w+)/);\nvar board = bm ? bm[1] : '';\nif (!board) {\nvar mp = findPanel(doc, '列表');\nreturn mp ? mediaCards(mp) : mediaCards(doc);\n}\nif (board === 'rec') { var p1 = findPanel(doc, '为您推荐'); return p1 ? mediaCards(p1) : mediaCards(doc); }\nif (board === 'new') { var p2 = findPanel(doc, '新书入库'); return p2 ? mediaCards(p2) : new org.jsoup.select.Elements(); }\nif (board === 'read') { var p3 = findPanel(doc, '阅读排行'); return p3 ? mediaCards(p3) : new org.jsoup.select.Elements(); }\nif (board === 'zan') { var p4 = findPanel(doc, '热赞排行'); return p4 ? mediaCards(p4) : new org.jsoup.select.Elements(); }\nif (board === 'hot') {\nvar out = new org.jsoup.select.Elements();\nvar ph = findPanel(doc, '网友热搜');\nif (ph) {\nvar lis = ph.select('li');\nfor (var i = 0; i < lis.size(); i++) {\nvar a = lis.get(i).select('a[href*=\"/ciwei/\"]').first();\nif (!a) continue;\nvar name = String(a.text()).replace(/\\s+/g, ' ').trim();\nvar u = String(a.attr('abs:href') || a.attr('href') || '');\nif (!name || !u) continue;\nvar lt = String(lis.get(i).text());\nvar ma = lt.match(/[(（]([^)）]+)[)）]/);\nout.add(mkCard(name, ma ? ma[1] : '', '', '', '', coverOf(u), u, ''));\n}\n}\nreturn out;\n}\nif (board === 'update') {\nvar out2 = new org.jsoup.select.Elements();\nvar pu = findPanel(doc, '今日更新');\nif (pu) {\nvar rows = pu.select('tr');\nfor (var j = 0; j < rows.size(); j++) {\nvar tr = rows.get(j);\nvar a2 = tr.select('td a[href*=\"/ciwei/\"]').first();\nif (!a2) continue;\nvar name2 = String(a2.text()).replace(/\\s+/g, ' ').trim();\nvar u2 = String(a2.attr('abs:href') || a2.attr('href') || '');\nif (!name2 || !u2) continue;\nvar kind = '';\nvar ka = tr.select('td.book_author a[href*=\"ciwei\"]').first();\nif (ka) kind = String(ka.text()).trim();\nvar lc = '';\nvar la = tr.select('td.index-chapter a').first();\nif (la) lc = String(la.text()).replace(/\\s+/g, ' ').trim();\nvar author2 = '';\nvar aua = tr.select('td.book_author a:not([href])').first();\nif (aua) author2 = String(aua.text()).trim();\nif (!author2) {\nvar aut = tr.select('td.book_author');\nfor (var q = 0; q < aut.size(); q++) {\nvar at = String(aut.get(q).text()).trim();\nif (at && at !== kind && at.charAt(0) !== '[') author2 = at;\n}\n}\nvar upd2 = '';\nvar upe = tr.select('td.book_update').first();\nif (upe) upd2 = String(upe.text()).trim();\nout2.add(mkCard(name2, author2, kind, lc, '', coverOf(u2), u2, upd2));\n}\n}\nreturn out2;\n}\nreturn mediaCards(doc);\n})()", "bookUrl": "h3 a@href", "coverUrl": "img@src", "intro": "p@text", "kind": "span.ki@text", "lastChapter": "span.lc@text", "name": "h3 a@text"}, "ruleSearch": {"author": "span.au@text", "bookList": "@js:\n(function () {\nvar _html = String(result || '');\nif (_html.indexOf('Just a moment') >= 0) return tipItem('被 Cloudflare 拦截：请先关闭 VPN 再试；若仍被拦，点源菜单『登录』在网页里过一次验证', String(baseUrl || ''));\nvar doc = org.jsoup.Jsoup.parse(String(result || ''), String(baseUrl || ''));\nvar out = new org.jsoup.select.Elements();\nvar rows = doc.select('table.bookcon tr');\nfor (var i = 0; i < rows.size(); i++) {\nvar tr = rows.get(i);\nvar a = tr.select('td a[href*=\"/ciwei/\"]').first();\nif (!a) continue;\nvar url = String(a.attr('abs:href') || a.attr('href') || '');\nvar name = String(a.text()).replace(/\\s+/g, ' ').trim();\nif (!name || !url) continue;\nvar tds = tr.select('td');\nvar author = tds.size() > 2 ? String(tds.get(2).text()).trim() : '';\nvar upd = tds.size() > 3 ? String(tds.get(3).text()).trim() : '';\nvar status = tds.size() > 4 ? String(tds.get(4).text()).trim() : '';\nout.add(mkCard(name, author, status, '', '', coverOf(url), url, upd));\n}\nreturn out;\n})()", "bookUrl": "h3 a@href", "coverUrl": "img@src", "intro": "p@text", "kind": "span.ki@text", "lastChapter": "span.lc@text", "name": "h3 a@text"}, "ruleToc": {"chapterList": "@js:\n(function () {\nvar doc = org.jsoup.Jsoup.parse(String(result || ''), String(baseUrl || ''));\nreturn tocLis(doc);\n})()", "chapterName": "a@text", "chapterUrl": "@js:\n(function () {\nvar base = '';\ntry { base = String(baseUrl || ''); } catch (e) {}\nfunction fix(u) {\nif (!u) return '';\nu = String(u);\nif (u.indexOf('http') === 0) return u;\nvar m = base.match(/^(https?:\\/\\/[^\\/]+)/);\nif (m) return m[1] + (u.charAt(0) === '/' ? u : '/' + u);\nreturn u;\n}\nvar u = '';\ntry {\nif (result && result.select) {\nvar els = result.select('a');\nif (els && els.size() > 0) u = String(els.first().attr('abs:href') || els.first().attr('href') || '');\n}\n} catch (e) {}\nif (!u) {\ntry {\nvar doc = org.jsoup.Jsoup.parse(String(result || ''), base);\nvar a = doc.select('a').first();\nif (a) u = String(a.attr('abs:href') || a.attr('href') || '');\n} catch (e2) {}\n}\nif (!u) {\ntry {\nvar mm = String(result || '').match(/href\\s*=\\s*\"([^\"]+)\"/) || String(result || '').match(/href\\s*=\\s*'([^']+)'/);\nif (mm) u = mm[1];\n} catch (e3) {}\n}\nu = fix(u);\nreturn u ? u + ',{\"webView\":true}' : '';\n})()"}, "searchUrl": "@js:\n(function () {\nreturn 'http://m.ciweiku.com/search.html?searchkey=' + encodeURIComponent(String(key || '')) + ',{\"webView\":true}';\n})()", "weight": 0},{"bookSourceGroup": "成人", "bookSourceName": "野果短剧", "bookSourceType": 4, "bookSourceUrl": "API版", "bookUrlPattern": ".*api\\.php\\/playlet\\/detail.*", "coverDecodeJs": "(function(){\n  var bytes = null;\n  try {\n    var isStream = false;\n    try { if (result instanceof Packages.java.io.InputStream) { isStream = true; } } catch(e0) {}\n    if (!isStream && result && typeof result.read === 'function') { isStream = true; }\n    if (isStream) {\n      var out = new Packages.java.io.ByteArrayOutputStream();\n      var b;\n      while ((b = result.read()) != -1) { out.write(b); }\n      bytes = out.toByteArray();\n    } else {\n      bytes = result;\n    }\n  } catch(e) { bytes = result; }\n  if (!bytes) { return result; }\n  try {\n    var keyBytes = java.strToBytes('f5d965df75336270', 'UTF-8');\n    var ivBytes = java.strToBytes('97b60394abc2fbe1', 'UTF-8');\n    var dec = java.createSymmetricCrypto('AES/CBC/PKCS5Padding', keyBytes, ivBytes).decrypt(bytes);\n    if (dec && dec.length > 4) {\n      var b0 = dec[0] & 0xff, b1 = dec[1] & 0xff;\n      if (b0 === 0xff && b1 === 0xd8) { return dec; }\n      if (b0 === 0x89 && b1 === 0x50) { return dec; }\n      if (b0 === 0x47 && b1 === 0x49) { return dec; }\n      if (b0 === 0x52 && b1 === 0x49 && (dec[2] & 0xff) === 0x46 && (dec[3] & 0xff) === 0x46) { return dec; }\n    }\n  } catch(e2) {}\n  return bytes;\n})()", "customButton": false, "customOrder": 12, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreScreen": "", "exploreUrl": "@js:var cats=[\n{name:'最新',p:{}},\n{name:'最热',p:{recommend:2}},\n{name:'野果原创',p:{theme:7}},\n{name:'真人短剧',p:{theme:8}},\n{name:'魔改漫剧',p:{theme:9}},\n{name:'网红改编',p:{theme:10}},\n{name:'PMV裸舞',p:{theme:11}},\n{name:'禁忌伦理',p:{setting:23}},\n{name:'职场反差',p:{setting:24}},\n{name:'改造调教',p:{setting:25}},\n{name:'出轨绿帽',p:{setting:26}},\n{name:'高H剧情',p:{setting:27}},\n{name:'后宫多人',p:{setting:28}},\n{name:'逆袭系统',p:{setting:29}},\n{name:'校园',p:{background:39}},\n{name:'都市',p:{background:40}},\n{name:'年代',p:{background:41}},\n{name:'古代',p:{background:43}},\n{name:'玄幻',p:{background:44}},\n{name:'末世',p:{background:45}},\n{name:'灵异',p:{background:46}},\n{name:'7天内',p:{time:1}},\n{name:'14天内',p:{time:2}},\n{name:'30天内',p:{time:3}},\n{name:'90天内',p:{time:4}}\n];\nvar ui=[];\nvar searchKey='搜索';\nui.push({title:searchKey,type:'text',default:'',style:{layout_flexGrow:1,layout_flexBasisPercent:1}});\nui.push({title:'🔍 搜索',type:'button',action:\"var k=String(infoMap['搜索']||'').trim();if(!k){java.toast('请输入片名/演员关键词');}else{try{java.searchBook(k,source);}catch(e){try{java.searchBook(k);}catch(e2){java.toast('搜索失败:'+String(e2));}}}\",style:{layout_flexGrow:0,layout_flexBasisPercent:1}});\ncats.forEach(function(c){\n  var p={};for(var k in c.p){p[k]=String(c.p[k]);}\n  ui.push({title:c.name,url:'@js:ygExploreUrl(page,'+JSON.stringify(p)+')',style:{layout_flexGrow:1,layout_flexBasisPercent:0.25}});\n});\nJSON.stringify(ui)", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36\"}", "jsLib": "var API='https://yeguodj.com/api.php';\nvar BASE={bundleId:'com.pwa.mater',version:'1.3.2',oauth_type:'web',language:'zh',via:'pwa',oauth_id:'7d05538c4b8a5e74e82f93c0dab0163c',token:'',trace_id:'7d05538c4b8a5e74e82f93c0dab0163c'};\nvar AESKEY='2acf7e91e9864673',AESIV='1c29882d3ddfcfd6';\nfunction ygBody(m){\n  var b=[];\n  for(var k in m){if(m[k]!==null&&m[k]!==undefined){b.push(k+'='+encodeURIComponent(String(m[k])));}}\n  return b.join('&');\n}\nfunction ygUrlCfg(path, body){\n  return API+path+',{\"method\":\"POST\",\"body\":\"'+body+'\",\"headers\":{\"Content-Type\":\"application/x-www-form-urlencoded\"}}';\n}\nfunction ygMerge(extra){\n  var m={};\n  for(var k in BASE){m[k]=BASE[k];}\n  for(var k2 in extra){m[k2]=extra[k2];}\n  return ygBody(m);\n}\nfunction ygExploreUrl(page, filter){\n  var m={};\n  for(var k in BASE){m[k]=BASE[k];}\n  m.page=String(page||1);\n  for(var k2 in filter){m[k2]=String(filter[k2]);}\n  return ygUrlCfg('/theater/exploreList',ygBody(m));\n}\nfunction ygPlayUrlCfg(eid,vid){\n  return ygUrlCfg('/playlet/play',ygMerge({episode_id:String(eid),video_id:String(vid)}));\n}\nfunction ygDecryptData(dataB64){\n  var k=CryptoJS.enc.Utf8.parse(AESKEY);\n  var iv=CryptoJS.enc.Utf8.parse(AESIV);\n  var d=CryptoJS.AES.decrypt({ciphertext:CryptoJS.enc.Base64.parse(String(dataB64))},k,{iv:iv,padding:CryptoJS.pad.Pkcs7});\n  return d.toString(CryptoJS.enc.Utf8);\n}\nfunction ygRespData(respText){\n  var resp=JSON.parse(String(respText));\n  if(!resp.data){return null;}\n  var plain=ygDecryptData(resp.data);\n  var j=JSON.parse(plain);\n  return j.data||j;\n}", "lastUpdateTime": "1792764881971", "respondTime": 180000, "ruleBookInfo": {"canReName": "text", "coverUrl": "$.cover", "init": "@js:(function(){var d=ygRespData(result);if(d&&d.episodes){for(var i=0;i<d.episodes.length;i++){d.episodes[i].video_id=d.video_id;}}return d||null;})()", "intro": "$.description", "kind": "$.tags", "lastChapter": "@js:('更新至'+result.episode_count+'集')", "name": "$.title"}, "ruleContent": {"content": "@js:(function(){var d=ygRespData(result);return d?String(d.video_url||''):'';})()", "sourceRegex": ".*\\.m3u8.*"}, "ruleExplore": {"bookList": "@js:(function(){var d=ygRespData(result);return d?(d.list||[]):[];})()", "bookUrl": "@js:ygUrlCfg('/playlet/detail',ygMerge({id:result.video_id}))", "coverUrl": "$.cover", "kind": "$.tags", "lastChapter": "@js:String(result.episode_id)", "name": "$.title", "wordCount": "@js:(result.play_count_text+'播放')"}, "ruleSearch": {"bookList": "@js:(function(){var d=ygRespData(result);return d?(d.list||[]):[];})()", "bookUrl": "@js:ygUrlCfg('/playlet/detail',ygMerge({id:result.video_id}))", "checkKeyWord": "探花", "coverUrl": "$.cover", "intro": "$.description", "kind": "$.tags", "lastChapter": "@js:(result.episodes+'集')", "name": "$.title", "wordCount": "@js:(result.play_count_text+'播放')"}, "ruleToc": {"chapterList": "@js:(function(){var d=ygRespData(result);if(d&&d.episodes&&d.video_id){for(var i=0;i<d.episodes.length;i++){d.episodes[i].video_id=d.video_id;}}return d?(d.episodes||[]):[];})()", "chapterName": "@js:(result.sort+'.'+result.title)", "chapterUrl": "@js:ygPlayUrlCfg(result.id,result.video_id)"}, "searchUrl": "@js:(function(){return ygUrlCfg('/search/result',ygMerge({keyword:key,page:String(page||1)}));})()", "weight": 0},{"bookSourceComment": "站点：桔纸书屋（m.juzhishuwu.net；.com 会 301 到 .net）。全站 GBK，jieqiCMS 模板。\n【搜索】GET /modules/article/search.php?searchkey=<GBK>&searchtype=articlename。多结果为 <tr id=\"nr\"> 六列表格；单结果站点 302 直跳详情页，靠 bookUrlPattern 走详情兜底。结果链接是 .com 域，用 ##替换 归一成 .net，否则每次详情多等一次 301（实测 +7 秒）。\n★搜索页分页是假的：page=2/3 返回与第 1 页完全相同的内容，故 bookList 对 page>1 直接短路返回空，避免无限翻页。\n★站点限频不稳定：提示「两次搜索的间隔时间不得少于 30 秒」，清 cookie / 换 UA / 伪造时间戳均无效；实测静默 30~45 秒后可恢复，但连续搜索仍会随机报错，属站点侧问题。\n【目录】详情页即第 1 页（45 章/页），后续页 /xs/<id>/<page>/。分页条只显示当前页 ±10 页，故 nextTocUrl 只返回「下一页」1 个 URL（末页 return null）。\n★必须只返回 1 个 URL：源码 BookChapterList 的 when(nextUrlList.size) 中，1→走串行循环（每页再求值一次），其余→走 mapAsync 并发且按「完成顺序」emit（buffer(0)+信号量），章节顺序不可控。只返回 1 个 URL 可强制串行，顺序绝对可控。\n★若一次返回全部页 URL：①并发分支按完成顺序 addAll，长书目录会乱序；②2 页目录的书 page1 只返回 1 个 → 仍走串行 → page2 再求值又返回 page1 → 重复抓取，经 reverse→去重→reverse 后顺序被轮转成「第46章在前、第45章在后」（《我的师父是仙子》实测）。\n【正文】#content 内以 <br> 分行，章内分页由 a.btn-info 标记（href 形如 xxx_2.html，末页该元素消失）。两个坑：①站点按字数硬截断，跨页会切断句子甚至切断 &nbsp; 实体（页尾留 &n、下页开头 bsp;）；②部分书（如《完美世界》）站点把正文重复输出 5 份，每份前有「< \"https:\">提供的《书名》…(第N页)」标记。故正文用 @js 自行按页抓取：以段首 &nbsp; 判续行并无缝粘合、遇到第二个分页标记即截断、整页与已收内容重复则跳过、修复断裂实体、剥掉广告尾巴。\n【发现】7 个分类 /list/<1-7>_<page>.html、完本 /wanben/1_<page>、榜单 /paihangbang.html（8 榜单静态单页，用 ?page= 假参数让第 2 页起返回空以停翻页）。\n★发现页有两种列表结构：分类/完本页用 ul.txt-list-row5（li 含 s1分类/s2书名/s3最新章节/s4作者），榜单页用 ul.txt-list-row3（li 仅含 s1排名/s2书名/s5更新日期，无作者无章节）。bookList 先试 row5、回退 row3，并按 href 去重；榜单页作者与最新章节会留空，进入详情页后由 ruleBookInfo 补齐。", "bookSourceGroup": "AI", "bookSourceName": "📖桔纸书屋", "bookSourceType": 0, "bookSourceUrl": "https://m.juzhishuwu.net", "bookUrlPattern": "https?://m\\.juzhishuwu\\.(?:com|net)/xs/\\d+\\.html", "customButton": false, "customOrder": 2, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\":\"玄幻\",\"url\":\"https://m.juzhishuwu.net/list/1_{{page}}.html\"},{\"title\":\"修真\",\"url\":\"https://m.juzhishuwu.net/list/2_{{page}}.html\"},{\"title\":\"都市\",\"url\":\"https://m.juzhishuwu.net/list/3_{{page}}.html\"},{\"title\":\"穿越\",\"url\":\"https://m.juzhishuwu.net/list/4_{{page}}.html\"},{\"title\":\"网游\",\"url\":\"https://m.juzhishuwu.net/list/5_{{page}}.html\"},{\"title\":\"科幻\",\"url\":\"https://m.juzhishuwu.net/list/6_{{page}}.html\"},{\"title\":\"其他\",\"url\":\"https://m.juzhishuwu.net/list/7_{{page}}.html\"},{\"title\":\"完本\",\"url\":\"https://m.juzhishuwu.net/wanben/1_{{page}}\"},{\"title\":\"榜单\",\"url\":\"https://m.juzhishuwu.net/paihangbang.html?page={{page}}\"}]", "lastUpdateTime": "1792748877528", "respondTime": 2219, "ruleBookInfo": {"author": "div.info div.fix > p:nth-of-type(1)@text##作\\s*者[：:]\\s*", "coverUrl": "div.imgbox img@src", "intro": "div.desc@text||div.m-desc@text##简\\s*介[:：]\\s*", "kind": "div.info div.fix > p:nth-of-type(2)@text##类\\s*别[：:]\\s*", "lastChapter": "div.info div.fix > p:nth-of-type(5) a@text", "name": "div.info h1@text"}, "ruleContent": {"content": "@js:(function(){var J=Packages.org.jsoup.Jsoup;var MARK=/提供的《|\\(第\\d+\\/\\d+页\\)|^<\\/div>|^&lt;\\s*\"https:/;function segs(h){var d=J.parse(h);var box=d.select('#content').first();if(box==null)return null;var c=box.clone();c.select('a,script,style').remove();var parts=String(c.html()).split(/<br\\s*\\/?>/i),arr=[];for(var i=0;i<parts.length;i++){var t=parts[i].replace(/<[^>]+>/g,'').replace(/^[ \\t\\r\\n]+/,'').replace(/[ \\t\\r\\n]+$/,'');if(t.replace(/&nbsp;|&amp;|\\s/g,'')==='')continue;if(MARK.test(t)&&arr.length>0)break;arr.push(t);}return {arr:arr,next:(box.select('a.btn-info').size()>0?box.select('a.btn-info').attr('href'):null)};}function isRepeat(page,out){if(out.length<3||page.length<2)return false;var p0=page[0];var lo=Math.max(0,out.length-60);for(var i=lo;i<out.length;i++){if(out[i]!==p0)continue;var ok=0;for(var j=0;j<page.length&&i+j<out.length;j++){if(out[i+j]!==page[j])break;ok++;}if(ok>=Math.min(3,page.length))return true;}return false;}var cur=segs(result),out=[],guard=0;while(cur!=null&&guard<40){guard++;var a=cur.arr;if(a.length>0&&!isRepeat(a,out)){if(out.length>0&&!/^&nbsp;/.test(a[0])){out[out.length-1]=out[out.length-1]+a[0];a=a.slice(1);}for(var i=0;i<a.length;i++)out.push(a[i]);}if(!cur.next)break;cur=segs(java.ajax(cur.next));}var txt=out.join('\\n').replace(/&(?:amp;)?n\\s*bsp;/g,'&nbsp;');txt=txt.replace(/&nbsp;/g,' ').replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&quot;/g,'\"').replace(/&#39;/g,\"'\").replace(/&amp;/g,'&');var NOISE=/请牢记|免费最快|无防盗|恋上你看书|bookla|收藏本站|请收藏|请大家收藏|全网最快|更新速度|首发起点|支持正版|看清爽的小说就到|您现在阅读的是|天才一秒|记住本站|无弹窗|笔趣阁|最快更新|本章未完|点击下一页/;var DOM=/https?:\\/\\/|https?:\\s*\"|www\\.|\\.com|\\.net|\\.org|bookla|提供的《/;var ls=txt.split('\\n'),res=[];for(var k=0;k<ls.length;k++){var t=ls[k].replace(/^\\s+|\\s+$/g,'');if(!t)continue;t=t.replace(/[,，]\\s*请牢记[:：]?.*$/,'').replace(/^\\s+|\\s+$/g,'');if(!t)continue;if(DOM.test(t)&&t.length<90)continue;if(t.length<=60&&NOISE.test(t))continue;res.push(t);}return res.join('\\n');})()"}, "ruleExplore": {"author": "span.s4@text", "bookList": "@js:(function(){var J=Packages.org.jsoup.Jsoup;var m=String(baseUrl).match(/[?&]page=(\\d+)/);if(m&&parseInt(m[1])>1)return[];var doc=J.parse(result);var lis=doc.select('ul.txt-list-row5 li');if(lis.size()===0){lis=doc.select('div.row-rank div.tab-bd ul.txt-list-row3:not([style*=none]) li');}var seen={},out=[];for(var i=0;i<lis.size();i++){var li=lis.get(i);var a=li.select('span.s2 a').first();if(a==null)continue;var h=a.attr('href');if(!h||seen[h])continue;seen[h]=1;out.push(li);}return out;})()", "bookUrl": "span.s2 a@href", "kind": "@js:(function(){var a=result.select('span.s1');if(a.size()===0)return '';var t=String(a.first().text()).replace(/[\\[\\]]/g,'').replace(/^\\s+|\\s+$/g,'');return /^\\d+$/.test(t)?'':t;})()", "lastChapter": "span.s3@text", "name": "span.s2 a@text"}, "ruleSearch": {"author": "td:nth-of-type(3)@text", "bookList": "@js:(function(){var m=String(baseUrl).match(/[?&]page=(\\d+)/);if(m&&parseInt(m[1])>1)return[];var J=Packages.org.jsoup.Jsoup;var doc=(typeof result==='string')?J.parse(result):result;return doc.select('tr#nr');})()", "bookUrl": "td:nth-of-type(1) a@href##^https?://m\\.juzhishuwu\\.com##https://m.juzhishuwu.net", "lastChapter": "td:nth-of-type(2) a@text", "name": "td:nth-of-type(1) a@text", "wordCount": "td:nth-of-type(4)@text"}, "ruleToc": {"chapterList": "#first + div.section-box ul.section-list li", "chapterName": "a@text", "chapterUrl": "a@href", "nextTocUrl": "@js:(function(){var m=String(result).match(/当前第\\s*(\\d+)\\s*页[，,]\\s*共\\s*(\\d+)\\s*页/);if(!m)return null;var cur=parseInt(m[1]),total=parseInt(m[2]);if(cur>=total)return null;var bm=String(baseUrl).match(/^(https?:\\/\\/[^\\/]+)\\/xs\\/(\\d+)/);if(!bm)return null;return [bm[1]+'/xs/'+bm[2]+'/'+(cur+1)+'/'];})()"}, "searchUrl": "https://m.juzhishuwu.net/modules/article/search.php?searchkey={{key}}&searchtype=articlename&page={{page}},{\"charset\":\"gbk\"}", "weight": 0},{"bookSourceComment": "秀人写真", "bookSourceGroup": "🔞图片", "bookSourceName": "媚色MM", "bookSourceType": 2, "bookSourceUrl": "https://mmrgb.com/", "concurrentRate": "1000", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": true, "exploreUrl": "@js:\nconst list = [];\nconst push = (title, url, size) => list.push({\n  title: title,\n  url: url,\n  style: {layout_flexBasisPercent: size}\n});\n\nconst xiuren = [[\"秀人网\",\"2\"],[\"美媛馆\",\"5\"],[\"波萝社\",\"7\"],[\"魅妍社\",\"4\"],[\"模范学院\",\"3\"],[\"优星馆\",\"9\"],[\"爱蜜社\",\"6\"],[\"嗲囡囡\",\"11\"],[\"顽味生活\",\"13\"],[\"蜜桃社\",\"10\"],[\"尤物馆\",\"8\"],[\"影私荟\",\"12\"],[\"星乐园\",\"14\"],[\"花の颜\",\"15\"],[\"薄荷叶\",\"17\"],[\"御女郎\",\"16\"],[\"糖果画报\",\"19\"],[\"尤蜜荟\",\"18\"],[\"模特联盟\",\"20\"],[\"猫萌榜\",\"21\"],[\"花漾show\",\"22\"],[\"星颜社\",\"23\"],[\"语画界\",\"24\"]];\nconst defaultTPL = \"/forum-$id-{{page}}.html\";\n\nconst orderMap = [[\"默认\"],[\"最新\",\"lastpost\"],[\"推荐\",\"heats\"],[\"月榜\",\"views\",\"2592000\"],[\"年榜\",\"views\",\"31536000\"],[\"总榜\",\"views\"]]\nconst orderTPL = \"/forum.php?mod=forumdisplay&fid=$id&filter=reply&orderby=$orderby&dateline=$dateline&page={{page}}\";\n\nconst chars = orderMap.map(x=>x[0]);\nlist.push({\n  \"title\": \"排序\",\n  \"type\": \"select\",\n  \"action\": \"java.refreshExplore()\",\n  \"chars\": chars,\n  \"default\": chars[0],\n  \"style\": {\"layout_flexBasisPercent\": 1}\n});\nconst order = String(infoMap.get(\"排序\") || \"默认\");\nconst orderItem = orderMap.find(x => x[0] == order);\nconst [ , orderby, dateline] = orderItem;\n\nxiuren.forEach(([title, id]) => {\n  let url = dateline ? orderTPL.replace(\"$dateline\", dateline).replace(\"$orderby\", orderby).replace(\"$id\", id) : orderby ? orderTPL.replace(\"&dateline=$dateline\", \"\").replace(\"$orderby\", orderby).replace(\"$id\", id) : defaultTPL.replace(\"$id\", id);\n  push(title, url, 0.22)\n})\n\ninfoMap.save();\nJSON.stringify(list)", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Linux; U; Android 9; zh-cn; MIX 2S Build/PKQ1.180729.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.127 Mobile Safari/537.36 XiaoMi/MiuiBrowser/16.7.35 swan-mibrowser\",\n  \"Referer\": \"https://mmrgb.com/\"\n}", "lastUpdateTime": "1792738369545", "loginCheckJs": "let url = result.url();\nlet body = result.body();\nif(body.contains(\"Just a moment...\")){\n  cookie.removeCookie(url);\n  result = java.startBrowserAwait(url, \"CF验证\")\n}\nresult", "loginUrl": "/", "respondTime": 180000, "ruleBookInfo": {"kind": "@js:\nlet els = java.getElements(\".ptg.mbm.mtn a\");\ncache.putMemory(\"mmrgb\", els.outerHtml());\nlet tags = [];\nels.forEach(a => tags.push(a.text().trim()));\ntags", "name": "table.0@td@text"}, "ruleContent": {"callBackJs": "let tags = cache.getFromMemory(\"mmrgb\");\nlet doc = org.jsoup.Jsoup.parse(tags);\nlet url = \"\";\nlet tagsEl = doc.select(\"a\");\nfor(let i = 0; i < tagsEl.size(); i++){\n  let a = tagsEl.get(i);\n  if(a.text().trim() == result) {\n    url = a.attr(\"href\");\n    url = source.key + url;\n    break;\n  }\n};\n\nif(event == \"clickBookLabel\"){\n  if(url){\n    java.open(\"explore\", url, result)\n  };\n  true\n}", "content": ".savephotop > img@zoomfile@js:\nresult.split(\"\\n\")\n.map(x => `<img src=\"${x}\">`)\n.join(\"\\n\")"}, "ruleExplore": {"author": "p@ownText##^.*?(?:No|Vol)\\.\\d+", "bookList": ".cards > .card", "bookUrl": "a@href", "coverUrl": "[ui8-image]@ui8-image", "kind": "@js:\nlet tags = java.getString(\"p@textNodes\");\nlet [eye, star] = String(tags).trim().split(\"\\n\").filter(d => +d);\n`浏览：${eye}\n收藏：${star}`;", "name": "p@ownText##^[^\\[]+"}, "ruleSearch": [], "ruleToc": {"chapterList": "table.0", "chapterName": "text"}, "weight": 0},{"bookSourceComment": "番茄小说（fanqienovel.com 公开接口版）。\n· 搜索走番茄 App 搜索接口；详情/目录走网页公开 JSON 接口；正文经私用区字符映射表还原。\n· 仅能读取公开/免费章节，VIP 章节需在官方 App 内阅读。\n· 接口若变更，优先更新 searchUrl 与 ruleContent，映射表见 charset.json。\n· 仅供个人学习研究，请遵守番茄小说用户协议。", "bookSourceGroup": "番茄,小说", "bookSourceName": "番茄ai-deepseek", "bookSourceType": 0, "bookSourceUrl": "https://fanqienovel.com##番茄ai-deepseek", "bookUrlPattern": "https?://(www\\.)?fanqienovel\\.com/(page/|api/book/info\\?bookId=)\\d+", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": false, "exploreUrl": "", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\", \"Accept\": \"application/json, text/plain, */*\", \"Accept-Language\": \"zh-CN,zh;q=0.9\", \"Referer\": \"https://fanqienovel.com/\", \"Cookie\": \"novel_web_id=7294561234567890123\"}", "lastUpdateTime": "1792678167856", "loginUrl": "", "respondTime": 180000, "ruleBookInfo": {"author": "$.data.author", "coverUrl": "$.data.thumbUrl", "init": "{{'https://fanqienovel.com/api/book/info?bookId=' + String(baseUrl).replace(/[^0-9]/g, '')}}", "intro": "$.data.abstract", "kind": "@js:var o = '';\ntry {\n  var j = JSON.parse(result);\n  var d = j.data || {};\n  var n = [];\n  try {\n    var c = JSON.parse(d.categoryV2 || '[]');\n    for (var i = 0; i < c.length; i++) {\n      if (c[i] && c[i].Name) n.push(c[i].Name);\n    }\n  } catch (e1) {}\n  if (String(d.creationStatus) === '0') n.push('完结');\n  else if (String(d.creationStatus) === '1') n.push('连载');\n  o = n.join(',');\n} catch (e) {}\no;", "lastChapter": "$.data.lastChapterTitle", "name": "$.data.bookName", "tocUrl": "", "wordCount": "$.data.wordNumber"}, "ruleContent": {"content": "@js:var A=[\"D\", \"在\", \"主\", \"特\", \"家\", \"军\", \"然\", \"表\", \"场\", \"4\", \"要\", \"只\", \"v\", \"和\", \"?\", \"6\", \"别\", \"还\", \"g\", \"现\", \"儿\", \"岁\", \"?\", \"?\", \"此\", \"象\", \"月\", \"3\", \"出\", \"战\", \"工\", \"相\", \"o\", \"男\", \"直\", \"失\", \"世\", \"F\", \"都\", \"平\", \"文\", \"什\", \"V\", \"O\", \"将\", \"真\", \"T\", \"那\", \"当\", \"?\", \"会\", \"立\", \"些\", \"u\", \"是\", \"十\", \"张\", \"学\", \"气\", \"大\", \"爱\", \"两\", \"命\", \"全\", \"后\", \"东\", \"性\", \"通\", \"被\", \"1\", \"它\", \"乐\", \"接\", \"而\", \"感\", \"车\", \"山\", \"公\", \"了\", \"常\", \"以\", \"何\", \"可\", \"话\", \"先\", \"p\", \"i\", \"叫\", \"轻\", \"M\", \"士\", \"w\", \"着\", \"变\", \"尔\", \"快\", \"l\", \"个\", \"说\", \"少\", \"色\", \"里\", \"安\", \"花\", \"远\", \"7\", \"难\", \"师\", \"放\", \"t\", \"报\", \"认\", \"面\", \"道\", \"S\", \"?\", \"克\", \"地\", \"度\", \"I\", \"好\", \"机\", \"U\", \"民\", \"写\", \"把\", \"万\", \"同\", \"水\", \"新\", \"没\", \"书\", \"电\", \"吃\", \"像\", \"斯\", \"5\", \"为\", \"y\", \"白\", \"几\", \"日\", \"教\", \"看\", \"但\", \"第\", \"加\", \"候\", \"作\", \"上\", \"拉\", \"住\", \"有\", \"法\", \"r\", \"事\", \"应\", \"位\", \"利\", \"你\", \"声\", \"身\", \"国\", \"问\", \"马\", \"女\", \"他\", \"Y\", \"比\", \"父\", \"x\", \"A\", \"H\", \"N\", \"s\", \"X\", \"边\", \"美\", \"对\", \"所\", \"金\", \"活\", \"回\", \"意\", \"到\", \"z\", \"从\", \"j\", \"知\", \"又\", \"内\", \"因\", \"点\", \"Q\", \"三\", \"定\", \"8\", \"R\", \"b\", \"正\", \"或\", \"夫\", \"向\", \"德\", \"听\", \"更\", \"?\", \"得\", \"告\", \"并\", \"本\", \"q\", \"过\", \"记\", \"L\", \"让\", \"打\", \"f\", \"人\", \"就\", \"者\", \"去\", \"原\", \"满\", \"体\", \"做\", \"经\", \"K\", \"走\", \"如\", \"孩\", \"c\", \"G\", \"给\", \"使\", \"物\", \"?\", \"最\", \"笑\", \"部\", \"?\", \"员\", \"等\", \"受\", \"k\", \"行\", \"一\", \"条\", \"果\", \"动\", \"光\", \"门\", \"头\", \"见\", \"往\", \"自\", \"解\", \"成\", \"处\", \"天\", \"能\", \"于\", \"名\", \"其\", \"发\", \"总\", \"母\", \"的\", \"死\", \"手\", \"入\", \"路\", \"进\", \"心\", \"来\", \"h\", \"时\", \"力\", \"多\", \"开\", \"已\", \"许\", \"d\", \"至\", \"由\", \"很\", \"界\", \"n\", \"小\", \"与\", \"Z\", \"想\", \"代\", \"么\", \"分\", \"生\", \"口\", \"再\", \"妈\", \"望\", \"次\", \"西\", \"风\", \"种\", \"带\", \"J\", \"?\", \"实\", \"情\", \"才\", \"这\", \"?\", \"E\", \"我\", \"神\", \"格\", \"长\", \"觉\", \"间\", \"年\", \"眼\", \"无\", \"不\", \"亲\", \"关\", \"结\", \"0\", \"友\", \"信\", \"下\", \"却\", \"重\", \"己\", \"老\", \"2\", \"音\", \"字\", \"m\", \"呢\", \"明\", \"之\", \"前\", \"高\", \"P\", \"B\", \"目\", \"太\", \"e\", \"9\", \"起\", \"稜\", \"她\", \"也\", \"W\", \"用\", \"方\", \"子\", \"英\", \"每\", \"理\", \"便\", \"四\", \"数\", \"期\", \"中\", \"C\", \"外\", \"样\", \"a\", \"海\", \"们\", \"任\"];\nvar B=[\"s\", \"?\", \"作\", \"口\", \"在\", \"他\", \"能\", \"并\", \"B\", \"士\", \"4\", \"U\", \"克\", \"才\", \"正\", \"们\", \"字\", \"声\", \"高\", \"全\", \"尔\", \"活\", \"者\", \"动\", \"其\", \"主\", \"报\", \"多\", \"望\", \"放\", \"h\", \"w\", \"次\", \"年\", \"?\", \"中\", \"3\", \"特\", \"于\", \"十\", \"入\", \"要\", \"男\", \"同\", \"G\", \"面\", \"分\", \"方\", \"K\", \"什\", \"再\", \"教\", \"本\", \"己\", \"结\", \"1\", \"等\", \"世\", \"N\", \"?\", \"说\", \"g\", \"u\", \"期\", \"Z\", \"外\", \"美\", \"M\", \"行\", \"给\", \"9\", \"文\", \"将\", \"两\", \"许\", \"张\", \"友\", \"0\", \"英\", \"应\", \"向\", \"像\", \"此\", \"白\", \"安\", \"少\", \"何\", \"打\", \"气\", \"常\", \"定\", \"间\", \"花\", \"见\", \"孩\", \"它\", \"直\", \"风\", \"数\", \"使\", \"道\", \"第\", \"水\", \"已\", \"女\", \"山\", \"解\", \"d\", \"P\", \"的\", \"通\", \"关\", \"性\", \"叫\", \"儿\", \"L\", \"妈\", \"问\", \"回\", \"神\", \"来\", \"S\", \"\", \"四\", \"望\", \"前\", \"国\", \"些\", \"O\", \"v\", \"l\", \"A\", \"心\", \"平\", \"自\", \"无\", \"军\", \"光\", \"代\", \"是\", \"好\", \"却\", \"c\", \"得\", \"种\", \"就\", \"意\", \"先\", \"立\", \"z\", \"子\", \"过\", \"Y\", \"j\", \"表\", \"\", \"么\", \"所\", \"接\", \"了\", \"名\", \"金\", \"受\", \"J\", \"满\", \"眼\", \"没\", \"部\", \"那\", \"m\", \"每\", \"车\", \"度\", \"可\", \"R\", \"斯\", \"经\", \"现\", \"门\", \"明\", \"V\", \"如\", \"走\", \"命\", \"y\", \"6\", \"E\", \"战\", \"很\", \"上\", \"f\", \"月\", \"西\", \"7\", \"长\", \"夫\", \"想\", \"话\", \"变\", \"海\", \"机\", \"x\", \"到\", \"W\", \"一\", \"成\", \"生\", \"信\", \"笑\", \"但\", \"父\", \"开\", \"内\", \"东\", \"马\", \"日\", \"小\", \"而\", \"后\", \"带\", \"以\", \"三\", \"几\", \"为\", \"认\", \"X\", \"死\", \"员\", \"目\", \"位\", \"之\", \"学\", \"远\", \"人\", \"音\", \"呢\", \"我\", \"q\", \"乐\", \"象\", \"重\", \"对\", \"个\", \"被\", \"别\", \"F\", \"也\", \"书\", \"稜\", \"D\", \"写\", \"还\", \"因\", \"家\", \"发\", \"时\", \"i\", \"或\", \"住\", \"德\", \"当\", \"o\", \"l\", \"比\", \"觉\", \"然\", \"吃\", \"去\", \"公\", \"a\", \"老\", \"亲\", \"情\", \"体\", \"太\", \"b\", \"万\", \"C\", \"电\", \"理\", \"?\", \"失\", \"力\", \"更\", \"拉\", \"物\", \"着\", \"原\", \"她\", \"工\", \"实\", \"色\", \"感\", \"记\", \"看\", \"出\", \"相\", \"路\", \"大\", \"你\", \"候\", \"2\", \"和\", \"?\", \"与\", \"p\", \"样\", \"新\", \"只\", \"便\", \"最\", \"不\", \"进\", \"T\", \"r\", \"做\", \"格\", \"母\", \"总\", \"爱\", \"身\", \"师\", \"轻\", \"知\", \"往\", \"加\", \"从\", \"?\", \"天\", \"e\", \"H\", \"?\", \"听\", \"场\", \"由\", \"快\", \"边\", \"让\", \"把\", \"任\", \"8\", \"条\", \"头\", \"事\", \"至\", \"起\", \"点\", \"真\", \"手\", \"这\", \"难\", \"都\", \"界\", \"用\", \"法\", \"n\", \"处\", \"下\", \"又\", \"Q\", \"告\", \"地\", \"5\", \"k\", \"t\", \"岁\", \"有\", \"会\", \"果\", \"利\", \"民\"];\nfunction dec(s) {\n  var o = '';\n  for (var i = 0; i < s.length; i++) {\n    var c = s.charCodeAt(i);\n    if (c >= 58344 && c <= 58715) {\n      var k = c - 58344;\n      var v = A[k];\n      if (v === undefined || v === '?' || v === '') v = B[k];\n      if (v === undefined || v === '?' || v === '') v = '';\n      o += v;\n    } else {\n      o += s[i];\n    }\n  }\n  return o;\n}\nfunction plain(h) {\n  return String(h)\n    .replace(/<br\\s*\\/?>/gi, '\\n')\n    .replace(/<\\/p>/gi, '\\n\\n')\n    .replace(/<[^>]+>/g, '');\n}\nvar html = '';\ntry {\n  var j = JSON.parse(result);\n  html = ((j.data || {}).chapterData || {}).content || '';\n} catch (e) { html = ''; }\nif (!html) {\n  try {\n    var cid = (String(baseUrl).match(/\\d+/) || [''])[0];\n    var page = java.ajax('https://fanqienovel.com/reader/' + cid);\n    var m = String(page).match(/\"content\":\"((?:[^\"\\\\]|\\\\.)*)\"/);\n    if (m) html = JSON.parse('\"' + m[1] + '\"');\n  } catch (e2) {}\n}\nvar t = dec(plain(html));\nt = t.replace(/&nbsp;/g, ' ')\n     .replace(/&amp;/g, '&')\n     .replace(/&lt;/g, '<')\n     .replace(/&gt;/g, '>')\n     .replace(/&quot;/g, '\"')\n     .replace(/&#39;/g, \"'\");\nt = t.replace(/[ \\t]+\\n/g, '\\n')\n     .replace(/\\n{3,}/g, '\\n\\n')\n     .replace(/^\\s+|\\s+$/g, '');\nt || '【本章正文获取失败：可能是 VIP/付费章节，或接口被风控。可尝试换源，或在番茄小说官方 App 内阅读本章。】';", "nextContentUrl": "", "replaceRegex": "", "title": "", "webJs": ""}, "ruleExplore": {"author": "", "bookList": "", "bookUrl": "", "coverUrl": "", "intro": "", "kind": "", "lastChapter": "", "name": "", "wordCount": ""}, "ruleSearch": {"author": "$.author", "bookList": "@js:var out = [];\ntry {\n  // 书号为 19 位时按数字返回会被 JS 截断，先把裸数字包成字符串再解析\n  var raw = String(result)\n    .replace(/\"book_id\"\\s*:\\s*(\\d{15,})/g, '\"book_id\":\"$1\"')\n    .replace(/\"bookId\"\\s*:\\s*(\\d{15,})/g, '\"bookId\":\"$1\"');\n  var j = JSON.parse(raw);\n  var d = (j && j.data) || {};\n  var rs = d.resp_data || {};\n  var sb = rs.search_book_data || {};\n  var list = sb.book_data || sb.bookData || [];\n  for (var i = 0; i < list.length; i++) {\n    var b = list[i] || {};\n    var id = String(b.book_id || b.bookId || '');\n    if (!id) continue;\n    out.push({\n      book_id: id,\n      book_name: b.book_name || b.bookName || '',\n      author: b.author || b.author_name || b.authorName || '',\n      abstract: b.abstract || b.intro || '',\n      thumb_url: b.thumb_url || b.thumbUrl || b.expand_thumb_url || '',\n      word_number: b.word_number || b.wordNumber || '',\n      category: b.category || b.category_name || '',\n      last_chapter_title: b.last_chapter_title || b.lastChapterTitle || ''\n    });\n  }\n} catch (e) {}\nJSON.stringify(out);", "bookUrl": "@js:var o = (typeof result === 'object' && result) ? result : null;\nif (!o || !(o.book_id || o.bookId)) {\n  try { o = JSON.parse(result); } catch (e) { o = {}; }\n}\nvar id = String((o && (o.book_id || o.bookId)) || '').replace(/[^0-9]/g, '');\n'https://fanqienovel.com/page/' + id;", "checkKeyWord": "", "coverUrl": "$.thumb_url", "intro": "$.abstract", "kind": "$.category", "lastChapter": "$.last_chapter_title", "name": "$.book_name", "wordCount": "$.word_number"}, "ruleToc": {"chapterList": "@js:var out = [];\ntry {\n  var bid = String(baseUrl).replace(/[^0-9]/g, '');\n  var txt = java.ajax('https://fanqienovel.com/api/reader/directory/detail?bookId=' + bid);\n  txt = String(txt).replace(/\"itemId\"\\s*:\\s*(\\d{15,})/g, '\"itemId\":\"$1\"');\n  var j = JSON.parse(txt);\n  var vols = (j.data && j.data.chapterListWithVolume) || [];\n  for (var v = 0; v < vols.length; v++) {\n    var chs = vols[v] || [];\n    for (var i = 0; i < chs.length; i++) {\n      var c = chs[i] || {};\n      if (!c.itemId) continue;\n      out.push({\n        title: String(c.title || ('第' + (out.length + 1) + '章')),\n        url: 'https://fanqienovel.com/api/reader/full?itemId=' + c.itemId,\n        isVip: c.isChapterLock === true\n      });\n    }\n  }\n} catch (e) {}\nJSON.stringify(out);", "chapterName": "", "chapterUrl": "", "formatJs": "", "isVolume": "", "nextTocUrl": "", "updateTime": ""}, "searchUrl": "https://api5-normal-lf.fqnovel.com/reading/bookapi/search/page/v/?query={{key}}&aid=1967&offset={{(page-1)*10}}&count=10&iid=2665637677906061&app_name=novelapp&version_code=495", "weight": 0},{"bookSourceComment": "这是小说下载源", "bookSourceName": "奇书网", "bookSourceType": 3, "bookSourceUrl": "https://m.qishu99.cc/", "customOrder": 2, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "exploreUrl": "[\n  {\n  \t  \"title\":\"🔖书库🔖\",\n    \"url\":\"/all/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":1\n    }\n  },\n  {\n  \t  \"title\":\"男生小说\",\n    \"url\":\"/nansheng/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":0.25\n    }\n  },\n  {\n  \t  \"title\":\"女生言情\",\n    \"url\":\"/yanqing/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":0.25\n    }\n  },\n  {\n  \t  \"title\":\"耽美同人\",\n    \"url\":\"/tongren/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":0.25\n    }\n  },\n  {\n  \t  \"title\":\"都市小说\",\n    \"url\":\"/dushi/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":0.25\n    }\n  },\n  {\n  \t  \"title\":\"玄幻奇幻\",\n    \"url\":\"/xuanhuan/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":0.25\n    }\n  },\n  {\n  \t  \"title\":\"武侠修真\",\n    \"url\":\"/xiuzhen/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":0.25\n    }\n  },\n  {\n  \t  \"title\":\"网游竞技\",\n    \"url\":\"/wangyou/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":0.25\n    }\n  },\n  {\n  \t  \"title\":\"历史军事\",\n    \"url\":\"/lishi/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":0.25\n    }\n  },\n  {\n  \t  \"title\":\"科幻灵异\",\n    \"url\":\"/kehuan/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":0.25\n    }\n  },\n  {\n  \t  \"title\":\"其他小说\",\n    \"url\":\"/qita/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":0.25\n    }\n  },\n  {\n  \t  \"title\":\"🔖排行🔖\",\n    \"url\":\"/hot/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":1\n    }\n  },\n  {\n  \t  \"title\":\"🔖推荐🔖\",\n    \"url\":\"/recommendall/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":1\n    }\n  },\n  {\n  \t  \"title\":\"🔖最新🔖\",\n    \"url\":\"/new/index_{{page}}.html\",\n    \"style\":\n    {\n    \t  \"layout_flexGrow\":1,\n       \"layout_flexBasisPersent\":1\n    }\n  }\n]", "lastUpdateTime": "1792673939657", "respondTime": 180000, "ruleBookInfo": {"author": ".bookcover@.mt10@text##作者：", "coverUrl": ".bookcover@img@src", "downloadUrls": ".bookbutton@a@href", "intro": ".bookintro@.con@text", "kind": ".bookcover@.gray.0@text##分类：", "lastChapter": ".bookcover@.gray.3@text##更新：", "name": ".bookcover@.title@text"}, "ruleContent": [], "ruleExplore": {"author": ".author@text", "bookList": ".imgtextlist@li", "bookUrl": "a@href", "coverUrl": "img@src", "intro": ".intro@text", "name": ".title@text"}, "ruleSearch": {"author": ".author.0@a@text", "bookList": ".imgtextlist@li", "bookUrl": "a@href", "coverUrl": "Img@src", "intro": ".intro@text", "lastChapter": ".author.1@text##更新：", "name": ".title@text"}, "ruleToc": [], "searchUrl": "/e/search/index.php,{\n\t\"method\":\"post\",\n\t\"body\":\"show=title,softsay,softwriter&keyboard={{key}}&tbname=download&tempid=1&Submit22=搜索\"\n\t}", "weight": 0},{"bookSourceComment": "玄幻文学 m.xhwx8.com。搜索 POST /search（GET 无效）。目录 ul.chapter 第2组为正文。正文章内分页 _N.html，以本章未完判断续页。发现页 || 分支禁止带空格。站点分类页 ?page=N 无效（服务端不处理），故分类只出首页20本；热门榜467本、排行榜84本为补充入口。", "bookSourceGroup": "AI", "bookSourceName": "📖玄幻文学", "bookSourceType": 0, "bookSourceUrl": "https://m.xhwx8.com", "bookUrlPattern": "https?://(?:m|www)\\.xhwx8\\.com/(?:book|[a-z]+)/\\d+\\.html$", "concurrentRate": "2/1000", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "全本::https://m.xhwx8.com/quanben.html\n热门榜::https://m.xhwx8.com/hot.html\n玄幻::https://m.xhwx8.com/xuanhuan.html\n仙侠::https://m.xhwx8.com/xianxia.html\n都市::https://m.xhwx8.com/dushi.html\n历史::https://m.xhwx8.com/lishi.html\n科幻::https://m.xhwx8.com/kehuan.html\n恐怖::https://m.xhwx8.com/kongbu.html\n其他::https://m.xhwx8.com/qita.html\n排行榜::https://m.xhwx8.com/paixingbang.html", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13; Pixel 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1792671196755", "respondTime": 8615, "ruleBookInfo": {"author": "meta[property=og:novel:author]@content", "coverUrl": "meta[property=og:image]@content", "intro": "meta[property=og:description]@content@js:(function(){var t=String(result||\"\");t=t.replace(/^\\s*简介[：:]\\s*/,\"\");t=t.replace(/^\\s*书名[：:]\\s*《[^》]*》\\s*/,\"\");t=t.replace(/^\\s*简介[：:]\\s*/,\"\");t=t.replace(/[\\s！!]+$/,\"\");return t;})()", "kind": "meta[property=og:novel:category]@content", "lastChapter": "meta[property=og:novel:latest_chapter_name]@content", "name": "meta[property=og:novel:book_name]@content"}, "ruleContent": {"content": "#nr1@html@js:(function(){var h=String(result||\"\");h=h.replace(/<p[^>]*>[\\s\\S]*?(榴弹怕水提醒您|向你推荐他的其他作品|最新章节网址)[\\s\\S]*?<\\/p>/g,\"\");h=h.replace(/<i\\s*class=\"lb_top2\">[\\s\\S]*?<\\/i>/g,\"\");h=h.replace(/<p class=\"pages\">[\\s\\S]*?<\\/p>/g,\"\");h=h.replace(/<p>\\s*<br\\s*\\/?>\\s*本章未完[\\s\\S]*?<\\/p>/g,\"\");h=h.replace(/<p>[^<]*(xhwx|#中#间#有#缺#失|请退)[^<]*<\\/p>/g,\"\");h=h.replace(/「[^」]*」/g,\"\");h=h.replace(/^<div[^>]*>/,\"\");h=h.replace(/<\\/div>[\\s\\S]*$/,\"\");h=h.replace(/<p>\\s*<\\/p>/g,\"\");h=h.replace(/！\\s*<\\/p>\\s*$/,\"</p>\");return h.trim();})()", "nextContentUrl": "@js:(function(){var h=String(src||\"\");if(h.indexOf(\"本章未完\")<0)return null;var u=String(baseUrl||\"\");var m=u.match(/^(.*?)(?:_(\\d+))?\\.html$/);if(!m)return null;var n=m[2]?parseInt(m[2],10)+1:2;return m[1]+\"_\"+n+\".html\";})()"}, "ruleExplore": {"author": "span.s3@text||span.popular-author@text", "bookList": "ul.lis dl,ol.popular-list li.popular-book,div.block ul > li", "bookUrl": "span.s2 a@href||a.popular-title@href||a.black@href", "kind": "@js:(function(){var t=(result&&result.text)?result.text():String(result);var m=t.match(/\\[([^\\]]+)\\]/);return m?m[1]:\"\";})()", "name": "span.s2 a@text||a.popular-title@text||a.black@text"}, "ruleSearch": {"author": "span.s3@text", "bookList": "ul.lis dl", "bookUrl": "a@href", "kind": "span.s1@text##[\\[\\]]", "name": "a@text"}, "ruleToc": {"chapterList": "ul.chapter:nth-of-type(2) li", "chapterName": "a@text", "chapterUrl": "a@href", "nextTocUrl": "div.listpage span.right a.onclick@href"}, "searchUrl": "https://m.xhwx8.com/search,{\"method\":\"POST\",\"body\":\"kw={{key}}&page={{page}}\"}", "weight": 0},{"bookSourceGroup": "自己使用", "bookSourceName": "八叉书库", "bookSourceType": 0, "bookSourceUrl": "https://bcshuku.com/", "bookUrlPattern": "https://bcshuku.com/novel\\d+/", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[\n{\"title\":\"分类\",\"url\":\"\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n{\"title\":\"长篇\",\"url\":\"/booklist1/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"综合\",\"url\":\"/booklist2/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"武侠\",\"url\":\"/booklist3/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"历史\",\"url\":\"/booklist4/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"都市\",\"url\":\"/booklist5/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"玄幻\",\"url\":\"/booklist6/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},   \n{\"title\":\"女生\",\"url\":\"/booklist7/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},   \n{\"title\":\"其他\",\"url\":\"/booklist8/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"现代\",\"url\":\"/booklist9/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"排行榜单\",\"url\":\"\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n{\"title\":\"热门排行\",\"url\":\"/popular/{{\n\tvar pjstr = 'index.html';\n\tif(page!=1)  pjstr='index_'+page+'.html';\n\tpjstr}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"最新更新\",\"url\":\"/latest/{{\n\tvar pjstr = 'index.html';\n\tif(page!=1)  pjstr='index_'+page+'.html';\n\tpjstr}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"最新入库\",\"url\":\"/release/{{\n\tvar pjstr = 'index.html';\n\tif(page!=1)  pjstr='index_'+page+'.html';\n\tpjstr}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"完本小说\",\"url\":\"/completed/{{\n\tvar pjstr = 'index.html';\n\tif(page!=1)  pjstr='index_'+page+'.html';\n\tpjstr}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}}\n]", "header": "\"accept\": \"application/json, text/javascript, */*; q=0.01\",\n    \"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\",\n    \"cache-control\": \"no-cache\",\n    \"content-type\": \"application/x-www-form-urlencoded; charset=UTF-8\",\n    \"origin\": \"https://bcshuku.com\",\n    \"pragma\": \"no-cache\",\n    \"priority\": \"u=1, i\",\n    \"sec-ch-ua\": \"\\\"Microsoft Edge\\\";v=\\\"143\\\", \\\"Chromium\\\";v=\\\"143\\\", \\\"Not A(Brand\\\";v=\\\"24\\\"\",\n    \"sec-ch-ua-mobile\": \"?0\",\n    \"sec-ch-ua-platform\": \"\\\"Windows\\\"\",\n    \"sec-fetch-dest\": \"empty\",\n    \"sec-fetch-mode\": \"cors\",\n    \"sec-fetch-site\": \"same-origin\",\n    \"user-agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0\",\n    \"x-requested-with\": \"XMLHttpRequest\"\n", "lastUpdateTime": "1792651808408", "respondTime": 180000, "ruleBookInfo": {"author": "[property=\"og:novel:author\"]@content", "coverUrl": "[property=\"og:image\"]@content", "intro": "{{@@div[itemprop=\"description\"]@textNodes}}\n阅读👁：{{@@div.info-chitiet span[7]@text}}\n{{@@span.text-primary@text}}\n{{baseUrl}}", "kind": "div.info-chitiet span[3]@text", "lastChapter": "div[id=\"new-chapter\"] span[class=\"chapter-text\"][0]@text", "name": "[property=\"og:novel:book_name\"]@content"}, "ruleContent": {"content": "@js:\n(() => {\n    let html = String(result || \"\");\n    if (!html) return \"\";\n\n    /* ========== 第2段：通用字段提取（顺序无关 / 带不带引号都行） ========== */\n    let pick = (key) => {\n        let m = html.match(new RegExp('\"' + key + '\"\\\\s*:\\\\s*\"([^\"]*)\"'));\n        if (m) return m[1].trim();\n        m = html.match(new RegExp('\"' + key + '\"\\\\s*:\\\\s*([^,\\\\s}]+)'));\n        return m ? m[1].trim() : \"\";\n    };\n\n    let url     = pick(\"url\");\n    let mobile  = pick(\"mobile\") || \"1\";\n    let isk     = pick(\"isk\")    || \"1\";\n    let novel   = pick(\"novel\");\n    let chapter = pick(\"chapter\");\n    let t       = pick(\"t\");\n    let n       = pick(\"n\");\n    let sign    = pick(\"sign\");\n\n    /* ========== 第2段：保留参数日志 ========== */\n    let paramsObj = { url, mobile, isk, novel, chapter, t, n, sign };\n    java.log(\n        Object.keys(paramsObj).map(k => k + \"=\" + paramsObj[k] + \",\\n\").join(\"\")\n    );\n\n    if (!url || !sign || !novel || !chapter) {\n        java.log(\"参数提取不完整\");\n        return \"\";\n    }\n\n    /* ========== 第1段：请求体用 encodeURIComponent 编码 ========== */\n    let body =\n        \"url=\" + encodeURIComponent(url) +\n        \"&mobile=\" + encodeURIComponent(mobile) +\n        \"&isk=\" + encodeURIComponent(isk) +\n        \"&novel=\" + encodeURIComponent(novel) +\n        \"&chapter=\" + encodeURIComponent(chapter) +\n        \"&t=\" + encodeURIComponent(t) +\n        \"&n=\" + encodeURIComponent(n) +\n        \"&sign=\" + encodeURIComponent(sign);\n\n    java.log(\"body: \" + body);\n\n    let siteurl = \"https://bcshuku.com\";\n    let referer = (typeof baseUrl === \"string\" && baseUrl)\n        ? baseUrl\n        : siteurl + \"/novel/\" + novel + \"/chapter\" + chapter + \".html\";\n\n    /* ========== 第1段：请求头 / java.post ========== */\n    let response = java.post(siteurl + \"/conapi.php\", body, {\n        'User-Agent': 'Mozilla/5.0 (Linux; U; Android 10; zh-CN; MI 9 Build/QKQ1.190828.002) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.58 Quark/10.5.1.1026 Mobile Safari/537.36',\n        'Accept': 'application/json, text/javascript, */*; q=0.01',\n        'x-requested-with': 'XMLHttpRequest',\n        'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',\n        'origin': 'https://www.bcshuku.com',\n        'sec-fetch-site': 'same-origin',\n        'sec-fetch-mode': 'cors',\n        'sec-fetch-dest': 'empty',\n        'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',\n        'referer': referer,\n    });\n\n    /* ========== 第1段：响应处理 ========== */\n    if (response && response.body()) {\n        try {\n            let data = JSON.parse(response.body());\n\n            // 补上第2段的 success 判断，避免把失败响应当正文\n            if (!data || data.success === false || data.success === 0 ||\n                data.success === \"0\" || !data.content) {\n                java.log(\"接口失败：\" + response.body());\n                return \"\";\n            }\n\n            let content = String(data.content);\n            java.log(content);\n\n            // 第2段：内容清洗\n            return content\n                .replace(/<br\\s*\\/?>/gi, \"\\n\")\n                .replace(/&nbsp;/g, \" \")\n                .replace(/&lt;/g, \"<\")\n                .replace(/&gt;/g, \">\")\n                .replace(/&amp;/g, \"&\");\n        } catch (e) {\n            java.log(\"运行异常: \" + e.message);\n            return \"\";\n        }\n    } else {\n        java.log(\"响应体为空\");\n        return \"\";\n    }\n})()"}, "ruleExplore": {"author": "//div[@class='caption']/div[@class=\"chi-tiet chuyen-muc\"]//text()", "bookList": "//div[@class=\"one-row\"]/div[@class=\"col-md-3 col-sm-6 col-xs-6 home-truyendecu\"]", "bookUrl": "//div[@class='caption']/a/@href", "coverUrl": "//div[@class='each_truyen']/a/img/@src", "lastChapter": "//div[@class='caption']/div[@class=\"chi-tiet tt-status\"]//small[@class=\"btn-xs label-primary\"]/text()", "name": "//div[@class='caption']/a/@title"}, "ruleSearch": {"bookList": "div.row div.one-row div.col-md-3", "bookUrl": "a[0]@href", "checkKeyWord": "https://bcshuku.com/novel55078/", "coverUrl": "div.each_truyen a img@src", "intro": "书籍状态📖：{{@@span.hoan-thanh-mau[0]@text}}\n阅读👁：{{@@div.luot-xem@textNodes}}\n更新时间🕰：{{@@div.chuyen-muc@textNodes}}\n{{@@a[0]@href##(.*)##https://bcshuku.com$1###}}", "lastChapter": "small.btn-xs@textNodes", "name": "h3[itemprop=\"name\"]@text"}, "ruleToc": {"chapterList": "div[id=\"list-chapter\"] ul[class=\"list-chapter\"] li a", "chapterName": "span[class=\"chapter-text\"]@text", "chapterUrl": "@js:\nvar doc = org.jsoup.Jsoup.parse(result);\nvar link = doc.select(\"a\").first();\nvar chapterurl= 'https://bcshuku.com' + link.attr(\"href\");\nchapterurl;", "nextTocUrl": "//div[@id=\"pagination\"]//li[last()-1]/a/@href"}, "searchUrl": "@js:\n// 第一步：搜索请求，拿到 searchid\nlet new_url = java.get('https://bcshuku.com/e/search/index.php?keyboard='+key+'&show=title,writer,byr&searchget=1',{\n    \"accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\",\n    \"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\",\n    \"cache-control\": \"no-cache\",\n    \"pragma\": \"no-cache\",\n    \"referer\": \"https://bcshuku.com\",\n    \"sec-ch-ua\": \"\\\"Microsoft Edge\\\";v=\\\"143\\\", \\\"Chromium\\\";v=\\\"143\\\", \\\"Not A(Brand\\\";v=\\\"24\\\"\",\n    \"sec-ch-ua-mobile\": \"?1\",\n    \"sec-ch-ua-platform\": \"\\\"Android\\\"\",\n    \"sec-fetch-dest\": \"document\",\n    \"sec-fetch-mode\": \"navigate\",\n    \"sec-fetch-site\": \"same-origin\",\n    \"sec-fetch-user\": \"?1\",\n    \"upgrade-insecure-requests\": \"1\",\n    \"user-agent\": \"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Mobile Safari/537.36 Edg/143.0.0.0\"\n});\n\nlet location = new_url.header(\"location\");\nlet searchid = location.match(/searchid=(\\d+)/)[1];\n\n// 分页修复（真正从第一页开始）\nlet url;\nif (page == 0) {\n    url = \"https://bcshuku.com/e/search/result/?searchid=\" + searchid;\n} else {\n    url = \"https://bcshuku.com/e/search/result/index.php?page=\" + (page - 1) + \"&searchid=\" + searchid;\n}\n\nurl;", "weight": 0},{"bookSourceComment": "天空书屋 m.tkshuw.com（移动版）书源\n\n【站点结构】\n· 搜索：GET /search.html?nf=关键词（页面表单虽写 method=post name=s，但 POST 返回 404；必须 GET nf）\n· 搜索无分页，单页最多 100 条；无结果输出「没有关于(xxx)的内容」\n· 详情：/nf_{id}/ 与 /nf_{id}.html 均可，内容一致\n· 目录：/nf_{id}/all.html 全量单页（实测 4058 章仍单页，无分页）\n· 正文：/nf_{id}/{章节序号}.html，章内分页为 {序号}_2.html、{序号}_3.html…\n· pb_next 在「章内最后一页」指向下一章、在「全书最后一章」指向详情页，\n  故 nextContentUrl 用 JS 只接受「数字_数字.html」形态，避免串章/把详情页当正文。\n· 目录里存在「无效章节,已被删除」的空章节，正文页为「章节内容加载失败」，属站点自身数据问题。\n\n【风控】\n· Cloudflare 前置（DYNAMIC，无 JS 挑战）；搜索为服务端检索，响应 1~3s。\n· concurrentRate=1/1500：全站每 1.5 秒最多 1 次请求，既压低搜索频率也保护正文抓取。\n  想更快阅读可改 1/800；想更保守可改 1/3000。切勿用脚本高频试探搜索接口。\n\n【登录】\n· 移动站无登录/注册入口（login.html、user/ 均 404），搜索/详情/目录/正文全部免登录。\n· 未写登录 UI，loginCheckJs 留空。\n\n【UA】\n· header 固定 Android Chrome 移动 UA + Referer；桌面 UA 也能取到同样结构，但本站为 m 站，移动 UA 更贴近真实访问。", "bookSourceGroup": "AI", "bookSourceName": "天空书屋(m.tkshuw.com)", "bookSourceType": 0, "bookSourceUrl": "https://m.tkshuw.com", "bookUrlPattern": "https?://(?:m|www)\\.tkshuw\\.com/nf_\\d+(?:/|\\.html)?$", "concurrentRate": "1/1500", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\":\"🔥最近更新\",\"url\":\"https://m.tkshuw.com/hots.html\"},{\"title\":\"🏠首页推荐\",\"url\":\"https://m.tkshuw.com/\"},{\"title\":\"仙侠\",\"url\":\"https://m.tkshuw.com/sort/20_0_0_0/?page={{page}}\"},{\"title\":\"都市\",\"url\":\"https://m.tkshuw.com/sort/21_0_0_0/?page={{page}}\"},{\"title\":\"历史\",\"url\":\"https://m.tkshuw.com/sort/22_0_0_0/?page={{page}}\"},{\"title\":\"言情\",\"url\":\"https://m.tkshuw.com/sort/23_0_0_0/?page={{page}}\"},{\"title\":\"网游\",\"url\":\"https://m.tkshuw.com/sort/24_0_0_0/?page={{page}}\"},{\"title\":\"科幻\",\"url\":\"https://m.tkshuw.com/sort/25_0_0_0/?page={{page}}\"},{\"title\":\"武侠\",\"url\":\"https://m.tkshuw.com/sort/26_0_0_0/?page={{page}}\"},{\"title\":\"侦探\",\"url\":\"https://m.tkshuw.com/sort/62_0_0_0/?page={{page}}\"},{\"title\":\"校园\",\"url\":\"https://m.tkshuw.com/sort/64_0_0_0/?page={{page}}\"},{\"title\":\"综合\",\"url\":\"https://m.tkshuw.com/sort/72_0_0_0/?page={{page}}\"}]", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\",\"Accept\":\"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\",\"Accept-Language\":\"zh-CN,zh;q=0.9\",\"Referer\":\"https://m.tkshuw.com/\"}", "lastUpdateTime": "1792638651891", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=\"og:novel:author\"]@content||div.synopsisArea_detail p.0@text##^作者：", "coverUrl": "meta[property=\"og:image\"]@content||div.synopsisArea_detail img@data-src", "intro": "meta[name=\"description\"]@content||p.review@text##^《[^》]*》简介:?", "kind": "meta[property=\"og:novel:category\"]@content||div.synopsisArea_detail p.1@text##^类别：", "lastChapter": "meta[property=\"og:novel:latest_chapter_name\"]@content||p.lastchapters a@text", "name": "meta[property=\"og:novel:book_name\"]@content||header h1.title@text", "tocUrl": "p.btn a[href*=\"all.html\"]@href"}, "ruleContent": {"content": "#htmlContent@html", "nextContentUrl": "@js:var h=String(result||\"\");var m=h.match(/id=\"pb_next\"[^>]*href=\"([^\"]+)\"/);var u=(m&&/^\\d+_\\d+\\.html$/.test(m[1]))?m[1]:\"\";u?u:null"}, "ruleExplore": {"author": "@js:var t=result.text();var i=t.lastIndexOf('/');i<0?null:t.substring(i+1).trim()", "bookList": "div.s_list", "bookUrl": "a@href", "coverUrl": "a@href##/nf_(\\d+)/.*##https://www.tkshuw.com/image/nf_$1.jpg", "kind": "@js:var t=result.text();var m=t.match(/^\\s*\\[([^\\]]*)\\]/);m?m[1]:null", "lastChapter": "a@title##^最新章节：", "name": "a@text"}, "ruleSearch": {"author": "@js:var t=result.text();var i=t.lastIndexOf('/');i<0?null:t.substring(i+1).trim()", "bookList": "div.wrap-box div.s_list", "bookUrl": "a@href", "coverUrl": "a@href##/nf_(\\d+)/.*##https://www.tkshuw.com/image/nf_$1.jpg", "kind": "@js:var t=result.text();var m=t.match(/^\\s*\\[([^\\]]*)\\]/);m?m[1]:null", "lastChapter": "a@title##^最新章节：", "name": "a@text"}, "ruleToc": {"chapterList": "div.directoryArea p", "chapterName": "a@text", "chapterUrl": "a@href"}, "searchUrl": "https://m.tkshuw.com/search.html?nf={{key}}", "weight": 0},{"bookSourceComment": "蕃茄小说手机站（m.dzrjk.com，PC 站 www.dzrjk.com 同库同模板）。\n\n【搜索】/api/search 需 POST 31 个混淆校验变量 + sign，这些变量每次请求由服务端随机生成，必须先从 /user/search.html?q=关键词 页面正则抓取；其中 bgt 必须去掉最后一位字符（站点 common.js 的 search_before() 在 document.cookie 非空时执行 bgt=bgt.slice(0,len-1)，而浏览器必然带 SID cookie），否则服务端返回 {\"code\":0,\"data\":{\"search\":[]}}，把校验失败伪装成“无结果”而不是报错，极易误判为接口失效。\n【限频】同一 IP 3 秒内二次搜索返回 code=1「搜索太频繁」。concurrentRate 的单位是毫秒，故写作 1/2000（每 2 秒 1 次），不是 1/2。\n【搜索词】站内搜索是分词匹配，超长精确书名（如 11 字全名）会返回空，建议用短关键词，例如搜「无上之境」而不是「斗破苍穹之无上之境」。\n【目录】详情页 ul.chapter 一次性输出全部章节（实测 988 章、217 章、280 章、5461 章均无分页），无需 nextTocUrl；末章偶发重复前一章链接，Legado 会自动去重。\n【正文】#text 内为 <p> 段落，无章内分页，不需要 nextContentUrl。\n【简介】站点自身在 introbar 里截断并加省略号，PC 站同样截断，属站点数据限制。\n【发现】分类页与排行榜 URL 中的数字不是页码（实测 1.html、2.html、100.html 内容完全相同，每个分类固定 30 本），故固定用 1.html；上滑翻页会重复返回同一批书，属站点限制。\n【bookUrlPattern】用于防止搜索 0 结果时 Legado 走“列表为空按详情页解析”造出假书，同时支持粘贴详情页 URL 直接搜。", "bookSourceGroup": "AI", "bookSourceName": "🍅蕃茄小说", "bookSourceType": 0, "bookSourceUrl": "https://m.dzrjk.com", "bookUrlPattern": "https?://(m|www)\\.dzrjk\\.com/html(_wap)?/\\d+/?", "concurrentRate": "1/2000", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "玄幻小说::https://m.dzrjk.com/xuanhuan_wap/1.html&&修真小说::https://m.dzrjk.com/xiuzhen_wap/1.html&&都市小说::https://m.dzrjk.com/dushi_wap/1.html&&穿越小说::https://m.dzrjk.com/chuanyue_wap/1.html&&科幻小说::https://m.dzrjk.com/kehuan_wap/1.html&&网游小说::https://m.dzrjk.com/wangyou_wap/1.html&&周点击榜::https://m.dzrjk.com/paihang_wap/weekvisit/1.html&&月点击榜::https://m.dzrjk.com/paihang_wap/monthvisit/1.html&&总点击榜::https://m.dzrjk.com/paihang_wap/allvisit/1.html&&日推荐榜::https://m.dzrjk.com/paihang_wap/dayvote/1.html&&周推荐榜::https://m.dzrjk.com/paihang_wap/weekvote/1.html&&月推荐榜::https://m.dzrjk.com/paihang_wap/monthvote/1.html&&总推荐榜::https://m.dzrjk.com/paihang_wap/allvote/1.html&&总收藏榜::https://m.dzrjk.com/paihang_wap/goodnum/1.html&&总字数榜::https://m.dzrjk.com/paihang_wap/size/1.html&&最新入库::https://m.dzrjk.com/paihang_wap/postdate/1.html&&全本·周点击榜::https://m.dzrjk.com/quanben_wap/weekvisit/1.html&&全本·月点击榜::https://m.dzrjk.com/quanben_wap/monthvisit/1.html&&全本·总点击榜::https://m.dzrjk.com/quanben_wap/allvisit/1.html&&全本·日推荐榜::https://m.dzrjk.com/quanben_wap/dayvote/1.html&&全本·周推荐榜::https://m.dzrjk.com/quanben_wap/weekvote/1.html&&全本·月推荐榜::https://m.dzrjk.com/quanben_wap/monthvote/1.html&&全本·总推荐榜::https://m.dzrjk.com/quanben_wap/allvote/1.html&&全本·总收藏榜::https://m.dzrjk.com/quanben_wap/goodnum/1.html&&全本·总字数榜::https://m.dzrjk.com/quanben_wap/size/1.html&&全本·最新入库::https://m.dzrjk.com/quanben_wap/postdate/1.html", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 12; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1792582665040", "respondTime": 180000, "ruleBookInfo": {"author": "p.0@text##^作者：", "coverUrl": ".image img@src", "intro": ".introbar@text##^简介：|本站提示.*$", "kind": "p.1@text##^类别：", "lastChapter": ".newest a@text", "name": "h2.title@text"}, "ruleContent": {"content": "#text@html"}, "ruleExplore": {"author": "p.0@text##^作者：", "bookList": "#list article", "bookUrl": "a.0@href", "coverUrl": ".image img@src", "intro": "p.intro@text##^简介：", "name": "h2.title@text"}, "ruleSearch": {"author": "$.author", "bookList": "$.data.search[*]", "bookUrl": "$.book_list_url", "coverUrl": "$.cover", "intro": "$.intro", "kind": "$.cate_name", "lastChapter": "$.latest_chapter_name", "name": "$.book_name"}, "ruleToc": {"chapterList": "ul.chapter li a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "@js:var base = 'https://m.dzrjk.com';\nvar kw = String(key);\nvar page = base + '/user/search.html?q=' + encodeURIComponent(kw);\nvar html = String(java.ajax(page));\nif (html.length < 500) html = String(java.ajax(page));\nvar names = 'vw abw ru jrt van fw cwl gpr uyoo tz euu tsn eju um fp dvm jpk deblkx ht azy sna wqx fpp rup jwj bgt qp yf cw wq'.split(' ');\nvar re = /var\\s+([A-Za-z_]\\w*)\\s*=\\s*\"([^\"]*)\"/g;\nvar map = {};\nvar mm;\nwhile ((mm = re.exec(html)) !== null) { map[mm[1]] = mm[2]; }\nvar pairs = [];\nfor (var i = 0; i < names.length; i++) {\n    var n = names[i];\n    var v = map[n];\n    if (typeof v === 'undefined') continue;\n    if (n === 'bgt' && v.length > 1) v = v.slice(0, v.length - 1);\n    pairs.push(n + '=' + encodeURIComponent(v));\n}\npairs.push('sign=' + encodeURIComponent(map['sign'] || ''));\npairs.push('q=' + encodeURIComponent(kw));\nvar opt = {\n    method: 'POST',\n    body: pairs.join('&'),\n    headers: {\n        'X-Requested-With': 'XMLHttpRequest',\n        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',\n        'Origin': base,\n        'Referer': page\n    }\n};\nbase + '/api/search,' + JSON.stringify(opt)", "weight": 0},{"bookSourceGroup": "AI", "bookSourceName": "趣书吧手机版", "bookSourceType": 0, "bookSourceUrl": "https://wap.39shuwu.com/", "bookUrlPattern": "https?://wap\\.39shuwu\\.com/shu\\d+/?", "concurrentRate": "1/1500", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "分类::/xuanhuanxiaoshuo/&&修真::/xiuzhenxiaoshuo/&&都市::/dushixiaoshuo/&&穿越::/chuanyuexiaoshuo/&&网游::/wangyouxiaoshuo/&&科幻::/kehuanxiaoshuo/&&周点击榜::/paihangbang/weekvisit/&&月点击榜::/paihangbang/monthvisit/&&总点击榜::/paihangbang/allvisit/&&日推荐榜::/paihangbang/dayvote/&&周推荐榜::/paihangbang/weekvote/&&月推荐榜::/paihangbang/monthvote/&&总推荐榜::/paihangbang/allvote/&&总收藏榜::/paihangbang/goodnum/&&总字数榜::/paihangbang/size/&&最新入库::/paihangbang/postdate/&&全本周点击::/full-1/weekvisit/&&全本总点击::/full-1/allvisit/&&全本最新入库::/full-1/postdate/", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36\",\"Referer\":\"https://wap.39shuwu.com/\",\"Accept\":\"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\"Accept-Language\":\"zh-CN,zh;q=0.9\",\"X-Requested-With\":\"XMLHttpRequest\"}", "jsLib": "function FQ_checkLoginState(jv) {\n  var msg = '';\n  try {\n    var s = '';\n    try {\n      s = String(jv.ajax('https://wap.39shuwu.com/user/userinfo.html') || '');\n    } catch (e1) {\n      try {\n        s = String(jv.get('https://wap.39shuwu.com/user/userinfo.html', {}) || '');\n      } catch (e2) {\n        s = '';\n      }\n    }\n    if (!s) {\n      msg = '检查失败: 无响应';\n    } else if (s.indexOf('退出登录') >= 0 || s.indexOf('修改密码') >= 0) {\n      msg = '已登录';\n    } else if (s.indexOf('趣书吧会员登录') >= 0 || s.indexOf('请登录') >= 0) {\n      msg = '未登录';\n    } else {\n      msg = '状态未知(未登录或页面结构变更)';\n    }\n  } catch (e) {\n    msg = '检查失败:' + e;\n  }\n  try { jv.put('fqLoginMsg', msg); } catch (e3) {}\n  try { jv.upLoginData({ '登录状态': msg }); } catch (e4) {}\n  try { jv.toast(msg); } catch (e5) {}\n  try { jv.longToast(msg); } catch (e6) {}\n  try { jv.reLoginView(false); } catch (e7) {}\n}\nfunction FQ_openLoginPage(jv) {\n  try {\n    jv.showBrowser('https://wap.39shuwu.com/user/login.html');\n  } catch (e) {\n    try { jv.toast('打开登录页失败:' + e); } catch (e2) {}\n  }\n}", "lastUpdateTime": "1792522314942", "loginUi": "[{\"type\":\"text\",\"name\":\"用户名\"},{\"type\":\"password\",\"name\":\"密码\"},{\"type\":\"button\",\"name\":\"①检查登录状态\",\"action\":\"FQ_checkLoginState(java)\"},{\"type\":\"button\",\"name\":\"②打开登录页\",\"action\":\"FQ_openLoginPage(java)\"},{\"type\":\"text\",\"name\":\"登录状态\"}]", "loginUrl": "function login() {\n  var u = '';\n  var p = '';\n  try { u = String(result['用户名'] || ''); } catch (e1) {}\n  try { p = String(result['密码'] || ''); } catch (e2) {}\n  u = u.replace(/^\\s+|\\s+$/g, '');\n  p = p.replace(/^\\s+|\\s+$/g, '');\n  if (!u) { try { java.longToast('请填写用户名'); } catch (e) {} return; }\n  if (!p) { try { java.longToast('请填写密码'); } catch (e) {} return; }\n  var resp = null;\n  var txt = '';\n  try {\n    resp = java.post('https://wap.39shuwu.com/api/login',\n      'username=' + encodeURIComponent(u) + '&password=' + encodeURIComponent(p),\n      {\n        'User-Agent': 'Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36',\n        'Referer': 'https://wap.39shuwu.com/user/login.html',\n        'Origin': 'https://wap.39shuwu.com',\n        'X-Requested-With': 'XMLHttpRequest',\n        'Content-Type': 'application/x-www-form-urlencoded'\n      });\n    txt = String(resp.body());\n  } catch (e3) {\n    try { java.longToast('登录请求失败: ' + e3); } catch (e) {}\n    return;\n  }\n  var ok = false;\n  var msg = '';\n  try {\n    var jo = JSON.parse(txt);\n    ok = (String(jo.code) === '0');\n    msg = String(jo.msg || '');\n  } catch (e4) {\n    ok = (txt.indexOf('\\\"code\\\":0') >= 0);\n    msg = ok ? '' : txt.substring(0, 120);\n  }\n  if (ok) {\n    var saved = false;\n    try {\n      if (resp !== null) {\n        var sc = resp.header('Set-Cookie');\n        if (sc) {\n          var sid = '';\n          var arr = String(sc).split(/,\\s*(?=[A-Za-z0-9_]+=)/);\n          for (var i = 0; i < arr.length; i++) {\n            var one = arr[i];\n            var mm = one.match(/(^|;\\s*)SID=([^;]+)/);\n            if (mm) { sid = mm[2]; break; }\n          }\n          if (sid) {\n            cookie.setCookie('https://wap.39shuwu.com/', 'SID=' + sid);\n            saved = true;\n          }\n        }\n      }\n    } catch (e5) {}\n    try { java.put('fqLoginMsg', '登录成功'); } catch (e) {}\n    try { java.upLoginData({ '登录状态': '✅ 登录成功' + (saved ? '' : '(cookie待确认)') }); } catch (e) {}\n    try { java.longToast('✅ 登录成功'); } catch (e) {}\n    try { java.toast('登录成功'); } catch (e) {}\n    try { java.reLoginView(false); } catch (e) {}\n  } else {\n    var em = msg ? msg : '登录失败';\n    try { java.put('fqLoginMsg', em); } catch (e) {}\n    try { java.upLoginData({ '登录状态': '❌ ' + em }); } catch (e) {}\n    try { java.longToast('❌ ' + em); } catch (e) {}\n    try { java.toast(em); } catch (e) {}\n  }\n}", "respondTime": 180000, "ruleBookInfo": {"author": "article .info p:eq(1)@text##作者：##", "canReName": "true", "coverUrl": "article .image img@src", "intro": "article .introbar@text##简介：##", "kind": "article .info p:eq(2) a@text", "lastChapter": "article .info p:eq(5) em@text", "name": "article .info h2.title@text", "tocUrl": "@js:baseUrl + 'mulu.html'"}, "ruleContent": {"content": "#text p@text", "sourceRegex": "https?://wap\\.39shuwu\\.com/shu\\d+/\\d+\\.html", "title": "header h1.title@text"}, "ruleExplore": {"author": "p:eq(1)@text##作者：##", "bookList": "#list article", "bookUrl": "a@href", "coverUrl": ".image img@src", "intro": "p.intro@text##简介：##", "name": "h2.title@text"}, "ruleSearch": {"author": "$.author", "bookList": "$.data.search", "bookUrl": "$.book_detail_url", "coverUrl": "$.cover", "intro": "$.intro", "kind": "$.cate_name", "lastChapter": "$.latest_chapter_name", "name": "$.book_name"}, "ruleToc": {"chapterList": "ul.chapter li a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "https://wap.39shuwu.com/user/search.html?q={{java.encodeURI(key)}},{\"bodyJs\":\"var _ua='Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36';var _page=String(result||'');var _q=java.encodeURI(String(key));var _re=/var\\\\s+([A-Za-z_$][\\\\w$]*)\\\\s*=\\\\s*\\\"([^\\\"]*)\\\"/g;var _m,_tk={};while((_m=_re.exec(_page))!==null){_tk[_m[1]]=_m[2];}if(!_tk['sign']){if(_page.indexOf('趣书吧会员登录')>=0){throw new Error('未登录，请点击菜单「登录」');}throw new Error('搜索令牌(sign)未获取到，站点结构可能已变更');}var _body='q='+_q;for(var _k in _tk){if(_k!=='sign'){_body=_body+'&'+_k+'='+encodeURIComponent(_tk[_k]);}}_body=_body+'&sign='+_tk['sign'];var _resp=java.post('https://wap.39shuwu.com/api/search',_body,{'User-Agent':_ua,'Referer':'https://wap.39shuwu.com/user/search.html?q='+_q,'Origin':'https://wap.39shuwu.com','X-Requested-With':'XMLHttpRequest','Content-Type':'application/x-www-form-urlencoded'});var _txt=String(_resp.body());if(!_txt){throw new Error('搜索接口无响应');}if(_txt.indexOf('搜索太频繁')>=0){throw new Error('⏳站点搜索限频(约3秒/次)，请稍候再试');}if(_txt.indexOf('\\\"code\\\":0')<0&&_txt.indexOf('\\\"code\\\" : 0')<0){throw new Error('搜索失败: '+_txt.substring(0,120));}_txt\"}", "weight": 0},{"bookSourceComment": "作者：姚浅书", "bookSourceGroup": "自制", "bookSourceName": "39书屋", "bookSourceType": 0, "bookSourceUrl": "https://wap.39shuwu.com", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": false, "eventListener": false, "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36\",\"Accept-Encoding\":\"identity\"}", "lastUpdateTime": "1792486489639", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=\"og:novel:author\"]@content", "coverUrl": "meta[property=\"og:image\"]@content", "intro": "meta[property=\"og:description\"]@content", "kind": "meta[property=\"og:novel:category\"]@content", "name": "meta[property=\"og:novel:book_name\"]@content", "tocUrl": "meta[property=\"og:novel:read_url\"]@content"}, "ruleContent": {"content": "id.text@html", "nextContentUrl": "text.下一页@href", "replaceRegex": "##(?m)^(请记住本站.*|手机版阅读网址.*|本章未完.*|喜欢.*?请大家收藏.*|最新网址.*|最新地址.*|广告.*|【.*?】.*|www\\.39shuwu\\.com.*)$"}, "ruleExplore": [], "ruleSearch": {"author": "$.author", "bookList": "$.data.search", "bookUrl": "$.book_list_url", "coverUrl": "$.cover", "intro": "$.intro", "lastChapter": "$.latest_chapter_name", "name": "$.book_name"}, "ruleToc": {"chapterList": "class.chapter@tag.li", "chapterName": "tag.a@text", "chapterUrl": "tag.a@href"}, "searchUrl": "<js>\n(function(){\n  var B = 'https://wap.39shuwu.com';\n  var h = java.ajax(B + '/');\n  var vars = {};\n  var re = /var\\s+(\\w+)\\s*=\\s*[\"']([^\"']*)[\"']/g;\n  var m;\n  while ((m = re.exec(h)) !== null) { vars[m[1]] = m[2]; }\n  var body = 'q=' + java.encodeURI(key);\n  for (var k in vars) { body += '&' + k + '=' + vars[k]; }\n  return B + '/api/search,{\"method\":\"POST\",\"body\":\"' + body + '\",\"headers\":{\"Accept-Encoding\":\"identity\"}}';\n})()\n</js>", "weight": 0},{"bookSourceComment": "//25.9.7 浅夏倒影", "bookSourceName": "速读谷", "bookSourceType": 0, "bookSourceUrl": "https://www.sudugu.org", "customOrder": 31971, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "exploreUrl": "玄幻::/xuanhuan/{{page}}.html\n奇幻::/qihuan/{{page}}.html\n武侠::/wuxia/{{page}}.html\n仙侠::/xianxia/{{page}}.html\n都市::/dushi/{{page}}.html\n历史::/lishi/{{page}}.html\n军事::/junshi/{{page}}.html\n科幻::/kehuan/{{page}}.html\n游戏::/youxi/{{page}}.html\n体育::/tiyu/{{page}}.html\n悬疑::/xuanyi/{{page}}.html\n言情::/yanqing/{{page}}.html\n轻小说::/qing/{{page}}.html\n诸天无限::/zhutianwuxian/{{page}}.html", "header": "{\n\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13; V2148A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/128.0.6613.146 Mobile Safari/537.36\"\n}", "lastUpdateTime": "1792485566704", "respondTime": 180000, "ruleBookInfo": {"author": ".itemtxt@p.1@a@text", "coverUrl": ".item@a.0@img@src", "intro": "&nbsp;更新时间:{{@@.itemtxt@ul@li.0@i@text}}\n简介:{{@@.bb@p@text}}", "kind": ".itemtxt@p.0@span@text", "lastChapter": ".itemtxt@ul@li.0@a@text", "name": ".itemtxt@a.0@text", "wordCount": ".itemtxt@i.0@text"}, "ruleContent": {"content": ".con@p@text", "nextContentUrl": "text.下一页@href"}, "ruleExplore": [], "ruleSearch": {"author": "p.1@a@text", "bookList": ".item", "bookUrl": "a.0@href", "checkKeyWord": "我的", "coverUrl": "a.0@img@src", "kind": "p.0@span@text", "lastChapter": "{{@@ul@li.0@a@text}}_{{@@ul@li.0@i@text}}", "name": "h3@a@text"}, "ruleToc": {"chapterList": "#list@ul@li@a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "https://www.sudugu.org/i/sor.aspx?key={{key}}", "weight": 0},{"bookSourceComment": "不能看完整就登录一下试试。\n备用https://xn--b9-209co42jzck.alicesw6.xyz/", "bookSourceGroup": "H", "bookSourceName": "🐣爱丽丝书屋(极速版）,排版优化", "bookSourceType": 0, "bookSourceUrl": "https://www.alicesw.com", "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "[{'title':'科幻','url':'https://www.alicesw.com/lists/71.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'校园','url':'https://www.alicesw.com/lists/61.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'玄幻','url':'https://www.alicesw.com/lists/62.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'乡村','url':'https://www.alicesw.com/lists/63.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'都市','url':'https://www.alicesw.com/lists/64.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'乱伦','url':'https://www.alicesw.com/lists/65.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'历史','url':'https://www.alicesw.com/lists/67.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'武侠','url':'https://www.alicesw.com/lists/68.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'系统','url':'https://www.alicesw.com/lists/69.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'明星','url':'https://www.alicesw.com/lists/72.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'同人','url':'https://www.alicesw.com/lists/73.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'强奸','url':'https://www.alicesw.com/lists/74.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'奇幻','url':'https://www.alicesw.com/lists/75.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'穿越','url':'https://www.alicesw.com/lists/70.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'凌辱','url':'https://www.alicesw.com/lists/46.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'反差','url':'https://www.alicesw.com/lists/22.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'堕落','url':'https://www.alicesw.com/lists/18.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'纯爱','url':'https://www.alicesw.com/lists/19.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'伪娘','url':'https://www.alicesw.com/lists/52.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'萝莉','url':'https://www.alicesw.com/lists/48.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'熟女','url':'https://www.alicesw.com/lists/56.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'禁忌','url':'https://www.alicesw.com/lists/51.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'NTR','url':'https://www.alicesw.com/lists/54.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'媚黑','url':'https://www.alicesw.com/lists/53.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'绿帽','url':'https://www.alicesw.com/lists/55.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'调教','url':'https://www.alicesw.com/lists/58.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'女主','url':'https://www.alicesw.com/lists/59.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'正太','url':'https://www.alicesw.com/lists/50.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'下克上','url':'https://www.alicesw.com/lists/43.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'百合','url':'https://www.alicesw.com/lists/47.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'重口','url':'https://www.alicesw.com/lists/21.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'其他','url':'https://www.alicesw.com/lists/57.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'完结','url':'https://www.alicesw.com/other/rank_hits/over/1.html','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'原创','url':'https://www.alicesw.com/original.html&page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'最新','url':'https://www.alicesw.com/all/order/update_time+desc.html?page={{page}}','style':{'layout_flexBasisPercent':0.25,'layout_flexGrow':1}},\n{'title':'日排行','url':'https://www.alicesw.com/other/rank_hits/order/hits_day.html','style':{'layout_flexBasisPercent':0.3,'layout_flexGrow':1}},\n{'title':'周排行','url':'https://www.alicesw.com/other/rank_hits/order/hits_week.html','style':{'layout_flexBasisPercent':0.3,'layout_flexGrow':1}},\n{'title':'月排行','url':'https://www.alicesw.com/other/rank_hits/order/hits_month.html','style':{'layout_flexBasisPercent':0.3,'layout_flexGrow':1}},\n{'title':'总排行','url':'https://www.alicesw.com/other/rank_hits/order/hits.html','style':{'layout_flexBasisPercent':0.3,'layout_flexGrow':1}},\n\n]", "header": "{\"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0\",\"Referer\":\"{{baseUrl}}\"}", "lastUpdateTime": "1792483440455", "loginUrl": "https://www.alicesw.com/user/user/login.html", "respondTime": 13494, "ruleBookInfo": {"author": "class.box_info@p.0@a.0@text", "coverUrl": "class.pic@img@src", "intro": "class.intro@text", "kind": "class.box_info@p.1@a@text", "lastChapter": "class.box_info@p.0@a.1@text", "name": "h1@text", "tocUrl": "class.book_newchap@a@href", "wordCount": "class.tLJ.5@text##小说字数："}, "ruleContent": {"content": "@js:\n(function() {\n    // 1. 先尝试静态抓取，保留 HTML 标签，避免正文排版被压扁\n    var doc = org.jsoup.Jsoup.parse(result);\n    var box = doc.select(\"div.read-content\");\n\n    // 去除干扰元素\n    box.select(\"script, style, .ad-block\").remove();\n\n    // 关键点：使用 html()，不要使用 text()\n    // text() 会把 <br>、<p>、<div> 等排版标签全部压成空格，导致正文挤成一团\n    var content = box.html();\n\n    var isInvalid = !content || content.length < 50 ||\n                    content.match(/加载中|正在获取|请稍候|爱丽丝书屋/);\n\n    if (!isInvalid) {\n        return content;\n    }\n\n    // 2. 静态抓取失败时，再使用 WebView 渲染正文区域\n    var html = java.webView(result, \"div.read-content\", \"3000\");\n    var doc2 = org.jsoup.Jsoup.parse(html);\n    var box2 = doc2.select(\"div.read-content\");\n\n    // 去除干扰元素\n    box2.select(\"script, style, .ad-block\").remove();\n\n    // 同样返回 html()，保留段落和换行排版\n    return box2.html();\n})();\n"}, "ruleExplore": {"author": ".four@text", "bookList": ".rec_rullist@ul", "bookUrl": ".two@a@href", "kind": ".sev@text", "lastChapter": ".three@text", "name": ".two@text##全文阅读", "wordCount": ".five@text"}, "ruleSearch": {"author": "class.mb-1@a@text", "bookList": "class.list-group-item", "bookUrl": "a@href", "intro": "class.content-txt@text", "name": "h5@text##\\d\\.|\\[已完结\\]|\\[连载中\\]", "wordCount": "class.mb-1@text##作者：.*字数：|浏览：.*"}, "ruleToc": {"chapterList": "class.mulu_list@li", "chapterName": "text", "chapterUrl": "a@href"}, "searchUrl": "https://www.alicesw.com/search.html?q={{key}}&p={{page}}", "weight": 0},{"bookSourceComment": "📖 素书卷 | www.sushujuan.org\nby 纳兰容若\nv7.5 连续搜索保登录：用WebView加载login.html跑页面JS重置冷却标记，不清Cookie不登录账号；若仍失败见聊天记录方案B", "bookSourceGroup": "纳兰验证", "bookSourceName": "素书卷", "bookSourceType": 0, "bookSourceUrl": "https://www.sushujuan.org", "concurrentRate": "0", "customButton": false, "customOrder": 3, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "玄幻::https://www.sushujuan.org/sort/1/{{page}}.html\n仙侠::https://www.sushujuan.org/sort/2/{{page}}.html\n都市::https://www.sushujuan.org/sort/3/{{page}}.html\n历史::https://www.sushujuan.org/sort/4/{{page}}.html\n网游::https://www.sushujuan.org/sort/5/{{page}}.html\n科幻::https://www.sushujuan.org/sort/6/{{page}}.html\n灵异::https://www.sushujuan.org/sort/7/{{page}}.html\n女频::https://www.sushujuan.org/sort/8/{{page}}.html\n其他::https://www.sushujuan.org/sort/9/{{page}}.html\n日榜::https://www.sushujuan.org/rank/dayvisit_0_0_0_{{page}}.html\n周榜::https://www.sushujuan.org/rank/weekvisit_0_0_0_{{page}}.html\n月榜::https://www.sushujuan.org/rank/monthvisit_0_0_0_{{page}}.html\n总榜::https://www.sushujuan.org/rank/allvisit_0_0_0_{{page}}.html\n新书榜::https://www.sushujuan.org/rank/postdate_0_0_0_{{page}}.html\n更新榜::https://www.sushujuan.org/rank/lastupdate_0_0_0_{{page}}.html", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36\",\"Accept\":\"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\",\"Accept-Language\":\"zh-CN,zh;q=0.9\",\"Referer\":\"https://www.sushujuan.org/\"}", "lastUpdateTime": "1792472388230", "loginUrl": "https://www.sushujuan.org/", "respondTime": 4828, "ruleBookInfo": {"author": "class.qy-book__au@a@text", "coverUrl": "class.qy-book__cover@img@src", "intro": "@css:[class*=qy-intro__text]@html", "kind": "class.qy-book__cat@text", "lastChapter": "class.qy-book__stats@a@text", "name": "class.qy-book__title@text", "tocUrl": "class.qy-toc-all@a@href||text.章节目录@href"}, "ruleContent": {"content": "id.novelcontent@p@text", "nextContentUrl": "id.next@href##^(?!.+_[0-9]+\\.html$).*$##", "replaceRegex": "##(?m)^喜欢.{0,60}请大家收藏.*$", "title": "h1@text"}, "ruleExplore": {"author": "class.qy-bcard__meta@a.0@text", "bookList": "class.qy-bcard", "bookUrl": "class.qy-bcard__title@href", "coverUrl": "class.qy-cover__img@src", "intro": "class.qy-bcard__desc@text", "kind": "class.qy-bcard__meta@span.1@text", "lastChapter": "text.最新@a@text", "name": "class.qy-bcard__title@text"}, "ruleSearch": {"author": "class.qy-bcard__meta@a.0@text", "bookList": "class.qy-bcard", "bookUrl": "class.qy-bcard__title@href", "coverUrl": "class.qy-cover__img@src", "intro": "class.qy-bcard__desc@text", "kind": "class.qy-bcard__meta@span.1@text", "lastChapter": "text.最新@a@text", "name": "class.qy-bcard__title@text"}, "ruleToc": {"chapterList": "<js>\nvar B='https://www.sushujuan.org';\nvar base=String(baseUrl);\nvar m=base.match(/\\/book\\/(\\d+)\\//);\nif(!m){'';}else{\nvar bid=m[1];\nvar h=String(result);\nvar pages=1;\nvar re=/<option[^>]*value=\"\\/book\\/\\d+\\/(\\d+)\\.html\"/g,mm;\nwhile((mm=re.exec(h))!==null){var p=parseInt(mm[1],10);if(p>pages)pages=p;}\nvar chapters=[];\nfunction parse(html){\n  var re2=/<a href=\"(\\/read\\/\\d+\\/(\\d+)\\.html)\">([^<]+)<\\/a>/g,m2;\n  while((m2=re2.exec(html))!==null){\n    chapters.push({url:m2[1],id:parseInt(m2[2],10),name:m2[3]});\n  }\n}\nparse(h);\nfor(var p=2;p<=pages;p++){\n  try{var ph=String(java.ajax(B+'/book/'+bid+'/'+p+'.html'));parse(ph);}catch(e){}\n}\nchapters.sort(function(a,b){return a.id-b.id;});\nvar out='';\nfor(var i=0;i<chapters.length;i++){\n  out+='<a href=\"'+chapters[i].url+'\">'+chapters[i].name+'</a>';\n}\nout;\n}\n</js>a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "<js>\n(function(){\n  var B='https://www.sushujuan.org';\n  // WebView 加载登录页，让页面 JS 执行并重置冷却标记（不登录账号、不清Cookie）\n  try{java.webView('', B+'/login.html', '\"1\"')}catch(e){}\n  return B+'/search.html,{\"method\":\"POST\",\"body\":\"s={{key}}\",\"headers\":{\"Content-Type\":\"application/x-www-form-urlencoded\",\"Referer\":\"'+B+'/search.html\"}}';\n})()\n</js>", "weight": 0},{"bookSourceComment": "八叉书库（杰奇CMS）。①线路：默认 https://8xsk.cc，登录面板有「🚀一键选站」「🌐站点快切」；②年龄确认：已在 gethd/gethdi/loginCheckJs 内置 Cookie age18_ok=1；③正文：手机版是 decodeURIComponent(escape(atob(...))) 加密，源内自动解密；④登录：用 cookie.getCookie() 从 CookieJar 读取（原 headers().values 会抛异常），验证码地址五路兜底，「🔍登录诊断」7 步排障；⑤★书架全部改纯 HTTP（不用浏览器）：「📚加入网站书架」= POST /modules/article/addbookcase.php {bid,ajax_request}；「🗑移出网站书架」= POST /modules/article/delbookcase.php；「♻️同步网站书架」= GET /modules/article/bookcase.php 解析 aid= 逐本深链加入；⑥「🌐打开本书↓」「🌐打开网站」改为优先调系统浏览器（Legado 内置 WebView 可能被墙）；⑦会员章节登录后自动购买（价格0免费）；⑧目录每页20章自动翻页（含3秒反爬延时）。", "bookSourceGroup": "刘备", "bookSourceName": "🌈八叉书库", "bookSourceType": 0, "bookSourceUrl": "https://八叉书库.luoyacheng.ip-ddns.com", "bookUrlPattern": "https://.+/book/\\d+\\.html", "concurrentRate": "1200", "customButton": false, "customOrder": 3, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nlet banben=\"1.8.6\";\neval(String(source.loginUrl));\nlet surl = `{{getsurl()}}`;\nlet jmtxt=java.base64Decode('6YO95biC5r+A5oOFLOaJkueBsOS5seS8pizmg4XoibLmrabkvqAs57u/5bi95oOF5oCALOa3t+S5seS/ruS7mSzosIPmlZnlhbvmiJA=').split(',');\nvar obj = {\n\t最近更: {\n\t\t\"url\": \"/sort/0/{{page}}.html\",\n\t\t\"fg\": 9},\n\t\t'新(肉)':{\n\t\t\"url\": \"/sort/7/{{page}}.html\",\n\t\t\"fg\": 1},\n\t最近入库: {\n\t\t\"url\": \"/top/postdate/{{page}}.html\",\n\t\t\"fg\": 10},\n\t\t\n\t最近完: {\n\t\t\"url\": \"/modules/article/articlelist.php?fullflag=1&page={{page}}\",\n\t\t\"fg\": 9,\n\t\t\"wrap\": true},\n\t\t'结(肉)':{\n\t\t\"url\": \"/modules/article/articlelist.php?sortid=7&fullflag=1&page={{page}}\",\n\t\t\"fg\": 1},\n\t签约新书: {\n\t\t\"url\": \"/top/signtime/{{page}}.html\",\n\t\t\"fg\": 10},\n\t\t\n\t字数榜: {\n\t\t\"url\": \"/top/words/{{page}}.html\",\n\t\t\"wb\": true},\n\t收藏榜: {\n\t\t\"url\": \"/top/goodnum/{{page}}.html\"},\n\t新书榜: {\n\t\t\"url\": \"/top/newhot/{{page}}.html\"},\n\t\t\n\t总点击: {\n\t\t\"url\": \"/top/allvisit/{{page}}.html\",\n\t\t\"wb\": true},\n\t月点击: {\n\t\t\"url\": \"/top/monthvisit/{{page}}.html\"},\n\t周点击: {\n\t\t\"url\": \"/top/weekvisit/{{page}}.html\"},\n\t\t\n\t总推荐: {\n\t\t\"url\": \"/top/allvote/{{page}}.html\",\n\t\t\"wb\": true},\n\t月推荐: {\n\t\t\"url\": \"/top/monthvote/{{page}}.html\"},\n\t周推荐: {\n\t\t\"url\": \"/top/weekvote/{{page}}.html\"},\n\t[jmtxt[0]]: {\n\t\t\"url\": \"/modules/article/articlefilter.php?order=lastupdate&page={{page}}&sortid=7&typeid=701\",\n\t\t\"wb\": true},\n\t[jmtxt[1]]: {\n\t\t\"url\": \"/modules/article/articlefilter.php?order=lastupdate&page={{page}}&sortid=7&typeid=702\"},\n\t[jmtxt[2]]: {\n\t\t\"url\": \"/modules/article/articlefilter.php?order=lastupdate&page={{page}}&sortid=7&typeid=703\"},\n\t[jmtxt[3]]: {\n\t\t\"url\": \"/modules/article/articlefilter.php?order=lastupdate&page={{page}}&sortid=7&typeid=704\",\n\t\t\"wb\": true},\n\t[jmtxt[4]]: {\n\t\t\"url\": \"/modules/article/articlefilter.php?order=lastupdate&page={{page}}&sortid=7&typeid=705\"},\n\t[jmtxt[5]]: {\n\t\t\"url\": \"/modules/article/articlefilter.php?order=lastupdate&page={{page}}&sortid=7&typeid=706\"},\n\t\t玄幻奇幻: {\n\t\t\"url\": \"/sort/1/{{page}}.html\",\n\t\t\"wb\": true},\n\t都市青春: {\n\t\t\"url\": \"/sort/2/{{page}}.html\"},\n\t武侠仙侠: {\n\t\t\"url\": \"/sort/3/{{page}}.html\"},\n\t\t搜索: {\n\t\t\turl: \t`{{\n\t\t\t\tlet surl = getsurl();\n\t\t\t\tif (page == 1) {\n\t\t\t\t\ttry {\n\t\t\t\t\tlet [cb,cf] = colorz();\n\t\t\t\t\tsvg=\\`<svg width=\"990\" height=\"300\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"100%\" height=\"150%\" fill=\"#\\${cb}\"/><text fill=\"#\\${cf}\" text-anchor=\"middle\" dominant-baseline=\"middle\" stroke=\"#000000\" stroke-width=\"1\" font-weight=\"bold\"><tspan x=\"50%\" dy=\"30%\" font-size=\"100\">请输入搜索关键词</tspan><tspan x=\"50%\" dy=\"50%\" font-size=\"50\">此处搜索不支持完整书名</tspan></text></svg>\\`;\n\tsvg=java.base64Encode(svg);\n\tkeyy=java.getVerificationCode('data:image/svg+xml;base64,'+svg);\n\t\t\t\t\t} catch(err) {keyy='系统';\n\t\t\t\t\tPackages.java.lang.Thread.sleep(500);\n\t\t\t\t\tjava.toast('使用默认关键词“系统”');}\n\t\t\t\t\tsource.put('keyy',keyy);\n\t\t\t\t\t\t}\n\t\t\t\telse keyy = source.get('keyy');\n\t\t\t\turl =\tsurl+'/modules/article/search.php?searchkey='+keyy+'&searchtype=all&page='+page;\n\t\t\t\tlet option={};\n\t\t\t\toption[\"headers\"]=gethd();\n\t\t\t\turl+','+JSON.stringify(option);\n\t\t\t}}`,\n\t\t\t\"fb\": 0.3,\n\t\t\t\"wb\": true},\n\t我的书架: {\n\t\t\"url\": `{{\n\t\t\tif (page == 1) {\n\t\tlet surl = getsurl();\n\t\tlet option={};option[\"headers\"]=gethd();\n\t\tlet ck=source.getLoginHeader()||'';\n\t\tif (ck) option[\"headers\"][\"Cookie\"]=ck;\n\t\tck ? surl+'/modules/article/bookcase.php,'+JSON.stringify(option) : (java.longToast('请登录账号'),'data:;base64,QQ,{\"type\":\"fx\"}');\n\t\t} else 'data:;base64,QQ,{\"type\":\"fx\"}';\n\t\t}}`,\n\t\t\"fb\": 0.3}\n\t}\n\nvar sort = [];\npush = (title, url, size, wrap, cc) => sort.push({\n    \"title\": title,\n    \"url\": url.startsWith(\"{{\") ? url : url ? surl + url + `{{',{\"headers\":'+JSON.stringify(gethd())+\"}\"}}`: \"\",\n    \"style\": {\n      layout_flexGrow: size || 1,\n      layout_flexBasisPercent: cc || -1,\n      layout_wrapBefore: wrap ? true : false\n     }\n  });\n\nfor (x in obj) {\npush(x, obj[x].url, obj[x].fg, obj[x].wb, obj[x].fb);\n}\n\n//版本号\npush(\"版本号:\"+banben+\"　点我获取地址\", `{{if (page==1) {webfb();gengxin();}\n'data:;base64,QQ,{\"type\":\"fx\"}'}}`, 1, true);\npush(\"测速/更新\",`{{eval(String(source.loginUrl));gengxin(); Packages.java.lang.Thread.sleep(100); ceshi(); 'data:;base64,QQ,{\"type\":\"fx\"}'}}`, 1);\n\nJSON.stringify(sort);", "jsLib": "var fbyurl='https://8xsk.org'; //发布页链接\n\n// ===== 登录头兼容函数（★putLoginHeader 必须传 JSON 才会进 getHeaderMap(true)）=====\n// 从 getLoginHeader() 提取纯 Cookie 串；兼容三种形态：JSON {\"Cookie\":...} / 纯Cookie串 / 空\nfunction ckget(so){\n\tlet h = '';\n\ttry { h = String(so.getLoginHeader() || ''); } catch(e) {}\n\tif (!h) return '';\n\tif (h.indexOf('{') == 0) {\n\t\ttry {\n\t\t\tlet o = JSON.parse(h);\n\t\t\tif (o && o['Cookie']) return String(o['Cookie']);\n\t\t} catch(e2) {}\n\t}\n\treturn h;\n}\n\nfunction webfb(){\nconst {java, source} = this;\n\tjava.toast('正在打开发布页…');\n\tlet option={};\n\toption[\"headers\"]=gethd();\n\toption['timeout']=15000;\n\tlet htm='';\n\t//★不走 webView（该通道被网络环境阻断），纯 HTTP 即可拿到发布页\n\ttry { htm = String(java.connect(fbyurl+','+JSON.stringify(option)).body() || ''); } catch(e) {\n\t\tjava.longToast('请求发布页失败：' + String(e).substring(0,80)); return;\n\t}\n\tif (/^java\\.net|^error/.test(htm) || htm == '') {\n\t\tjava.log('发布页访问异常：'+htm);\n\t\tjava.longToast('网络连接异常\\n可点「🚀一键选站」自动测速');\n\t\treturn;\n\t}\n\t//★选择器兜底：不同模板可能是 #url-list>li>a 或普通 a[href]\n\tlet urls = [];\n\ttry {\n\t\tlet j = Packages.org.jsoup.Jsoup.parse(htm);\n\t\tlet as = j.select('#url-list>li>a');\n\t\tif (as.size() == 0) as = j.select('a[href^=http]');\n\t\tfor (let i = 0; i < as.size(); i++) {\n\t\t\tlet u = String(as.get(i).attr('href') || '');\n\t\t\tif (u && u.indexOf('8xsk') >= 0 || u.indexOf('bachashuku') >= 0 || u.indexOf('18xsk') >= 0) {\n\t\t\t\tif (urls.indexOf(u) < 0) urls.push(u);\n\t\t\t}\n\t\t}\n\t} catch(e2) {}\n\tjava.log('发布页找到 ' + urls.length + ' 个站点：' + urls.join(' '));\n\n\t// 注入复制按钮 + 当前站点高亮\n\tlet cur = this.getsurl();\n\thtm = htm.replace('</body>', `<script>\nfunction copyt(t) {\n  var texta = document.createElement('textarea');\n  texta.value = t; texta.style.position = 'fixed'; texta.style.left = '-9999px';\n  document.body.appendChild(texta); texta.select();\n  document.execCommand('copy');\n  alert('已复制\\n' + t);\n}\ndocument.querySelectorAll('a[href^=\"http\"]').forEach(function(x){\n  if (x.nextElementSibling && x.nextElementSibling.tagName === 'BUTTON') return;\n  x.insertAdjacentHTML('afterend', '<button style=\"margin:4px;padding:4px 10px;border-radius:4px;border:1px solid #888;background:#2a6;color:#fff\" onclick=\"copyt(\\'' + x.href + '\\')\">复制</button>');\n});\n</script>` + '</body>');\n\n\ttry {\n\t\tjava.startBrowser('data:text/html;base64,' + java.base64Encode(htm), '获取网址');\n\t} catch(e3) {\n\t\tjava.longToast('打开浏览器失败：' + String(e3).substring(0,60));\n\t}\n}\n\nfunction gets(x, r) {\nreturn r==undefined?\nthis.java.getString(x)+'':\nPackages.io.legado.app.model.analyzeRule.AnalyzeRule().getString(x,r)+'';}\nfunction gete(x, r) {\nreturn r==undefined?\nthis.java.getElement(x): Packages.io.legado.app.model.analyzeRule.AnalyzeRule().setContent(r).getElement(x);}\n\nfunction colorz() {\n\tconst {java, source} = this;\n\tlet cb = '151E27', cf = 'dddddd';\n\t//★getLoginInfoMap() 在部分环境返回普通 JS 对象（无 .get），需双通道\n\tfunction pick(m, k) {\n\t\tif (!m) return '';\n\t\ttry { if (typeof m.get == 'function') return String(m.get(k) || ''); } catch(e) {}\n\t\ttry { return String(m[k] || ''); } catch(e2) {}\n\t\treturn '';\n\t}\n\tlet m = {};\n\ttry { m = source.getLoginInfoMap() || {}; } catch(e) {}\n\tlet v1 = pick(m, '封面背景颜色');\n\tlet v2 = pick(m, '封面字体颜色');\n\tif (v1 && v1 != 'null' && v1 != 'undefined') cb = v1;\n\tif (v2 && v2 != 'null' && v2 != 'undefined') cf = v2;\n\treturn [cb, cf];\n}\n\nu_a = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0';\nx_r_w = ''; //com.microsoft.emmx\ns_c_u_p = `\"Windows\"`;\ns_c_u = `\"Microsoft Edge\";v=\"135\", \"Not-A.Brand\";v=\"8\", \"Chromium\";v=\"135\"`;\n\nfunction gethdi(url) {\nconst {java, source, cookie} = this;\n//★空值直接返回，避免拼出 \"undefined,{...}\"\nlet _u = String(url==null?'':url);\nif (!_u || _u=='undefined' || _u=='null') return '';\nif (_u.indexOf(',{') >= 0) return _u;\nlet surl=this.getsurl();\nlet hd={};\n//★年龄确认闸门：不带 age18_ok=1 时全站只返回「年龄确认」页\nhd[\"Cookie\"]=\"age18_ok=1\";\nhd[\"Accept-Language\"]=\"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7\";\nhd[\"Referer\"]=surl;\nif (/http.{4}www/.test(surl))\nhd[\"User-Agent\"]=u_a;\nelse {\nlet ua=java.getWebViewUA()+'';\nhd[\"User-Agent\"]=ua;}\nhd[\"Sec-Fetch-Dest\"]=\"image\";\nhd[\"Sec-Fetch-Mode\"]=\"no-cors\";\nhd[\"Sec-Fetch-Site\"]=\"cross-site\";\nreturn url+','+JSON.stringify({\"headers\":hd});\n}\nfunction gethd() {\nconst {java, source, cookie} = this;\nlet surl=this.getsurl();\nlet hd={};\n//★年龄确认闸门：CookieJar 里必须常驻 age18_ok=1\n//★不能再用 cookie.removeCookie(surl) —— 它会把 age18_ok 一起清掉，\n//★导致 java.ajax 走 CookieJar 时拿不到该 Cookie 而被 302 到 age_verify.php\ntry {\n\tlet ck = String(cookie.getCookie(surl) || '');\n\tif (ck.indexOf('age18_ok') < 0) {\n\t\tcookie.setCookie(surl, ck ? (ck + '; age18_ok=1') : 'age18_ok=1');\n\t}\n} catch(e) { java.log('写 age18_ok 失败：'+e); }\nhd[\"Cookie\"]=\"age18_ok=1\";\nhd[\"Accept-Language\"]=\"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7\";\nhd[\"Referer\"]=surl;\nif (/http.{4}www/.test(surl))\nhd[\"User-Agent\"]=u_a;\nelse {\nlet ua=java.getWebViewUA()+'';\nlet v=(ua.match(/Chrome\\/(\\d+)/)||[,'136'])[1];\nhd[\"User-Agent\"]=ua;\nhd[\"Sec-CH-UA-Platform\"]=`\"Android\"`;\nhd[\"Sec-CH-UA\"]=`\"Chromium\";v=\"${v}\", \"Android WebView\";v=\"${v}\", \"Not.A/Brand\";v=\"99\"`;\nhd[\"Sec-CH-UA-Mobile\"]=\"?1\";}\nreturn hd;\n}\n// ★可用站点池（来自发布页 https://8xsk.org 实测，2026-10-20）\nvar BX_POOL = ['https://8xsk.cc','https://18xsk.com','https://18xsk.cc','https://bachashuku.org','https://bachashuku.com'];\n// ★已失效的旧域名（自动回退，避免用户手填后卡死）\nvar BX_DEAD = ['www.8xbook.org','8xbook.org','luoyacheng.ip-ddns.com','ip-ddns.com'];\n\nfunction bxSiteOk(u){\n\tconst {java} = this;\n\ttry {\n\t\tlet hd={'User-Agent':this.gethd()['User-Agent']||'Mozilla/5.0','Cookie':'age18_ok=1'};\n\t\tlet b=String(java.connect(u+','+JSON.stringify({headers:hd,timeout:9000})).body());\n\t\treturn b.length>3000 && b.indexOf('年龄确认')<0 && b.indexOf('八叉')>=0;\n\t} catch(e) { return false; }\n}\n\nfunction getsurl() {\n\tconst {java, source} = this;\n\tlet surl=String((source.getLoginInfoMap()||{'网址':''})['网址']||'');\n\tsurl=surl.replace(/\\/$/,'');\n\t// 空 → 用默认活站点\n\tif (!surl) return 'https://8xsk.cc';\n\t// 已知死域名 → 自动回退\n\tlet dead = BX_DEAD.some(function(d){ return surl.indexOf(d)>=0; });\n\tif (dead) {\n\t\tfor (let i=0;i<BX_POOL.length;i++) {\n\t\t\tif (this.bxSiteOk(BX_POOL[i])) { java.log('旧域名已失效，自动切换：'+BX_POOL[i]); return BX_POOL[i]; }\n\t\t}\n\t\treturn 'https://8xsk.cc';\n\t}\n\treturn surl;\n}\n\n\nfunction decodeEmail(n, c) {\n\t//★输入非法（非 hex / 空）时返回空串，不要抛异常\n\ttry {\n\t\tfunction hexToInt(e, t) {\n\t\t\tvar r = e.substr(t, 2);\n\t\t\treturn parseInt(r, 16);\n\t\t}\n\t\tlet s = String(n == null ? '' : n);\n\t\tif (!s || s.length < (c + 4)) return '';\n\t\tvar o = '', a = hexToInt(s, c), i = c + 2;\n\t\tif (isNaN(a)) return '';\n\t\tfor (i; i < s.length; i += 2) {\n\t\t\tvar l = hexToInt(s, i) ^ a;\n\t\t\tif (isNaN(l)) break;\n\t\t\to += String.fromCharCode(l);\n\t\t}\n\t\ttry { o = decodeURIComponent(escape(o)); } catch(e1) {}\n\t\treturn o;\n\t} catch(e) { return ''; }\n}\n\n\nfunction gengxin(){\nconst {java, source} = this;\n\tlet url0='https://gitee.com/lyc486/yuedu2/commits/main/书源/八叉/8x.json?browser_history=0&page=1&per=4';\n\tlet rr0=java.get(url0,{'User-Agent': 'Mozilla/5.0 (Linux; Android 14)','X-Requested-With': 'XMLHttpRequest'}).body();\n\tlet gxlrr = [];\n\ttry { gxlrr = com.jayway.jsonpath.JsonPath.read(rr0, '$.list[0:4].title') || []; } catch(e) {}\n\tlet gxlr = gxlrr[0] || '', gxlr2 = gxlrr[1] || '', gxlr3 = gxlrr[2] || '', gxlr4 = gxlrr[3] || '';\n\tlet banben = '0';\n\ttry { banben = String(source.exploreUrl).match(/let banben=\"([\\d\\.]+)\"/)[1]; } catch(e) {}\n\tgxlr=String(gxlr).split(/^([^\\-]+)-/);\n\tgxlr[0]=='' ? '' : gxlr=['','0',gxlr[0]];\n\tlet gxts;\n\tif (gxlr[1]>banben){gxts=['更新','0,140,186'];}\n\telse {gxts= ['导入','76,175,80'];};\n\tlet htm = `<html>\n<head>\n<title>更新</title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n<style>\ntable {\n\ttext-align: center;\n\tmargin: 2em auto 0 auto;\n\t}\nth span{font-size: 1.2em;}\n.ann {\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\theight: 50vh;\n\t}\nbutton {\n\tbackground-color: rgb(${gxts[1]});\n\tcolor: white;\n\tborder: none;\n\tborder-radius: 4px;\n\theight: 6vh;\n\twidth: 30vw;\n\toverflow: hidden;\n\t}\nbutton span {\n  cursor: pointer;\n  display: inline-block;\n  position: relative;\n  transition: 0.4s;\n}\nbutton span:after {\n  content: '>';\n  position: absolute;\n  opacity: 0;\n  top: 0;\n  right: 30px;\n  transition: 0.2s;\n}\nbutton:active span {\n  padding-right: 20px;\n}\nbutton:active span:after {\n  opacity: 1;\n  right: -40px;\n}\n</style>\n</head>\n<body>\n<table border=\"1\" cellspacing=\"0\">\n<th colspan=\"2\">最新日志：<span>${gxlr[2]}</span></th>\n<tr>\n<td>仓库版本：${gxlr[1]}</td>\n<td>本地版本：${banben}</td>\n</tr>\n<tr>\n<td colspan=\"2\" style=\"text-align: left;\">往期日志：${gxlr2}<br>　　　　　${gxlr3}<br>　　　　　${gxlr4}</td>\n</tr>\n</table>\n<div class=\"ann\">\n<a href=\"legado://import/importonline?src=https://gitee.com/lyc486/yuedu2/raw/main/书源/八叉/8x.json\">\n<button><span>${gxts[0]}</span></button>\n</a>\n</div>\n<a href=\"legado://import/importonline?src=https://cdn.jsdelivr.net/gh/Luoyacheng/yuedu@main/书源/八叉/8x.json\" style=\"font-size: 10px;\">备用链接</a>\n</body>\n</html>`;\nif(typeof this.book=='undefined'||gxts[0]=='更新') java.startBrowser(`data:text/html;base64,${java.base64Encode(htm)}`,'更新');\n}\n\nfunction tbshujia(iuu,iid){\nconst {java, source} = this;\nlet iuux=iuu+'/modules/article/addbookcase.php';\nlet iuuy=String(iuu+'/book/'+iid+'.html'); //需要转化否则报错\nlet tm = new Date().getTime();\nlet body = `bid=${iid}&ajax_request=${tm}`;\nlet option={};\noption[\"headers\"]=this.gethd();\noption[\"headers\"][\"Referer\"]=iuuy;\noption[\"method\"]=\"POST\";\noption[\"body\"]=body;\nlet ck=ckget(source);\nif (String(ck).includes(\"jieqiUserInfo\")) {\noption[\"headers\"][\"Cookie\"]=ck;\nlet by = java.connect(iuux+','+JSON.stringify(option));\nlet _bn = '';\ntry { _bn = (typeof this.book != 'undefined' && this.book) ? String(this.book.name || '') : ''; } catch(e) {}\njava.longToast('\\n' + (_bn || '书籍') + '：\\n' + by.body());\nreturn true;}\nreturn false;\n}\n\nfunction hmdjib(id,name){\nconst {java, source, cache} = this;\n\tlet hmd=cache.get('8xhmd')||'{}';\n\thmd=JSON.parse(hmd);\n\tlet i=false;\n\ttry {\n\t\tlet rgstr = source.getLoginInfoMap().get('正则书名黑名单');\n\t\tlet rg = eval(String(rgstr));\n\t\ti=rg.test(name);\n\t\t} catch(err) {}\n\ttry {\n\t\tif (i) {\n\t\tlet rgstr = source.getLoginInfoMap().get('正则书名白名单');\n\t\tlet rg = eval(String(rgstr));\n\t\t i=!rg.test(name);\n\t\t }\n\t\t} catch(err) {}\n\t\ti = i||(id in hmd);\n\t\treturn i;\n\t}\n\nOranges = `<path d=\"M646.4 763.6c150.1-15.8 267.1-142.7 267.1-297 0-164.9-133.7-298.7-298.7-298.7-154.8 0-282.1 117.8-297.2 268.7\" fill=\"#FA9F23\" p-id=\"5624\"></path><path d=\"M648.6 784.8l-4.5-42.4c67.7-7.1 130.3-39 176.3-89.7 46.3-51.1 71.7-117.2 71.7-186.1 0-74.1-28.8-143.7-81.2-196.1-52.4-52.4-122-81.2-196.1-81.2-69.2 0-135.5 25.6-186.6 72.2-50.8 46.3-82.5 109.2-89.3 177.3l-42.5-4.2c7.8-78.6 44.4-151.2 103-204.6 59-53.7 135.5-83.3 215.4-83.3 85.5 0 165.8 33.3 226.3 93.7 60.4 60.4 93.7 140.8 93.7 226.3 0 79.6-29.4 155.9-82.8 214.8-53 58.3-125.2 95.1-203.4 103.3z\" fill=\"#333333\" p-id=\"5625\"></path><path d=\"M161.5 832.4c116.6 116.6 305.7 116.6 422.4 0s116.6-305.7 0-422.4\" fill=\"#FA9F23\" p-id=\"5626\"></path><path d=\"M372.7 941.2c-85.5 0-165.8-33.3-226.3-93.7l30.2-30.2c52.4 52.4 122 81.2 196.1 81.2s143.7-28.8 196.1-81.2c52.4-52.4 81.2-122 81.2-196.1s-28.8-143.7-81.2-196.1l30.2-30.2c60.4 60.4 93.7 140.8 93.7 226.3S659.4 787 599 847.5c-60.5 60.4-140.8 93.7-226.3 93.7z\" fill=\"#333333\" p-id=\"5627\"></path><path d=\"M161.480941 832.416461a170.7 298.7 44.999 1 0 422.418218-422.432964 170.7 298.7 44.999 1 0-422.418218 422.432964Z\" fill=\"#FBE0C3\" p-id=\"5628\"></path><path d=\"M249.1 885.8c-9.3 0-18.4-0.7-27.2-2-30.5-4.6-55.9-16.8-75.5-36.4-19.6-19.6-31.8-45-36.4-75.5-4.2-28-1.7-59 7.4-92.4 18.1-66.2 60.5-135.2 119.5-194.2S364.9 384 431.1 366c33.3-9.1 64.4-11.6 92.4-7.4 30.5 4.6 55.9 16.8 75.5 36.4s31.8 45 36.4 75.5c4.2 28 1.7 59-7.4 92.4C609.9 629 567.5 698 508.5 757s-128 101.4-194.2 119.5c-22.9 6.2-44.7 9.3-65.2 9.3z m18-370.2c-53.8 53.8-92.4 116.1-108.5 175.2-15 55-8.6 99.9 18 126.5s71.5 33 126.5 18c59.2-16.1 121.4-54.7 175.2-108.5 53.8-53.8 92.4-116.1 108.5-175.2 15-55 8.6-99.9-18-126.5s-71.5-33-126.5-18c-59.1 16.2-121.4 54.7-175.2 108.5z\" fill=\"#333333\" p-id=\"5629\"></path><path d=\"M373.3 641.5h148.4c-16.2 23.8-35.8 47.6-58.5 70.2-28.9 28.9-59.7 52.9-90 71.1l0.1-141.3z m187.1-193.4c27 37.3 15.7 103.4-25.2 172.1H388.3l172.1-172.1zM351.9 656.6v138.2c-61.4 31.7-118.7 38.6-152.4 14.2l152.4-152.4z m-152.5-15.1h137.4L184.6 793.8c-24-33.9-16.9-91.1 14.8-152.3z m173.9-182.6c68.5-40.9 134.5-52.4 172-25.9l-172 172V458.9z m-91.1 71.8c22.5-22.5 46.1-42 69.7-58.1v147.6H211.4c17.6-29.1 40.4-58.6 67.8-86.5l3-3z\" fill=\"#F5A74A\" p-id=\"5630\"></path><path d=\"M625.8 266.5l-13.5 9.9c-1.9 1.4-4.6 1-6-0.9-0.6-0.9-0.9-1.9-0.8-3l1.8-16.7L592 249c-2.2-1-3.1-3.5-2.2-5.6 0.4-1 1.2-1.8 2.2-2.2l15.3-6.8-1.8-16.7c-0.3-2.3 1.4-4.4 3.8-4.7 1.1-0.1 2.1 0.2 3 0.8l13.5 9.9 13.5-9.9c1.9-1.4 4.6-1 6 0.9 0.6 0.9 0.9 1.9 0.8 3l-1.8 16.7 15.3 6.8c2.2 1 3.1 3.5 2.2 5.6-0.4 1-1.2 1.8-2.2 2.2l-15.3 6.8 1.8 16.7c0.3 2.3-1.4 4.4-3.8 4.7-1.1 0.1-2.1-0.2-3-0.8l-13.5-9.9z\" fill=\"#333333\" p-id=\"5631\"></path><path d=\"M799.4 313.5m-12.8 0a12.8 12.8 0 1 0 25.6 0 12.8 12.8 0 1 0-25.6 0Z\" fill=\"#333333\" p-id=\"5632\"></path><path d=\"M828.4 348.3m-12.8 0a12.8 12.8 0 1 0 25.6 0 12.8 12.8 0 1 0-25.6 0Z\" fill=\"#333333\" p-id=\"5633\"></path>`;\n\nfunction jinghuafm() {\nconst {java, source} = this;\t\nfunction splitString(str) {\n    const length = str.length;\n    if (length < 15) {\n        return length<9 ? [str] : [\n            str.slice(0, 7),\n            str.slice(7)\n        ].filter(s => s);\n    } else if (length < 20) {\n        return [\n            str.slice(0, 7),\n            str.slice(7,13),\n            str.slice(13)\n        ].filter(s => s);\n    }  else if (length < 24) {\n        return [\n            str.slice(0, 7),\n            str.slice(7,13),\n            str.slice(13,18),\n            str.slice(18)\n        ].filter(s => s);\n    } else {\n        return [\n            str.slice(0, 7),\n            str.slice(7, 13),\n            str.slice(13, 18),\n            str.slice(18, 22),\n            str.slice(22)\n        ].filter(s => s);\n    }\n}\nfunction pingString(ss) {\nlet rr='';\nlet l1=ss.length;\nfor (let i1=0; i1<l1; i1++) {\n\tlet c1=ss[i1], l2=c1.length;\n\tfor (let i2=0; i2<l2; i2++) {\n\t\tlet c2=c1.charAt(i2);\n\t\trr += `<tspan x=\"${100+180*ii}\" y=\"${180+170*(i2+i1)}\">${c2}</tspan>`;\n\t\t}\n\t\tii++;\n\t}\n\treturn rr;\n}\n\nlet [cb,cf] = colorz();\n\n//★登录面板按钮里 this.book 可能为 undefined，需保护\nlet bkName = '';\ntry { bkName = (typeof this.book != 'undefined' && this.book) ? String(this.book.name || '') : ''; } catch(e) {}\nif (!bkName) {\n\ttry { bkName = String(cache.getFromMemory('8xid') ? Object.values(cache.getFromMemory('8xid'))[0] : ''); } catch(e2) {}\n}\nif (!bkName) bkName = '八叉书库';\nlet bknm=String(bkName).replace(/\\.{2,}/,'…');\nbknm=bknm.match(/[a-z][a-z\\+一-ꀀ\\d…]+|[一-ꀀ\\da-z]{2,}(?:\\.\\d+[一-ꀀ]*|[…？])?|[一-ꀀ]/gi);\nlet hz='';\nlet ii=0;\n\nfor (let char of bknm) {\n\thz += pingString(splitString(char) );\n\t}\n\nlet svg = `<svg class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"5623\" width=\"100%\" height=\"100%\">\n<rect width=\"100%\" height=\"150%\" fill=\"#${cb}\"/>\n<g transform=\"scale(0.4) translate(1600,2500)\">${Oranges}</g>\n<text fill=\"#${cf}\" stroke=\"#000000\" stroke-width=\"2\" font-weight=\"bold\" font-size=\"150\" text-anchor=\"middle\" dominant-baseline=\"middle\">\n${hz}\n</text>\n</svg>`;\nsvg=java.base64Encode(svg);\nreturn 'data:image/svg+xml;base64,'+svg;\n}\n", "lastUpdateTime": "1792471864977", "loginCheckJs": "//★年龄确认闸门：保证 CookieJar 里常驻 age18_ok=1\n//★否则详情/目录/正文走 java.ajax 时会被 302 到 age_verify.php\n(function(){\n  try {\n    var u = String(result.url());\n    var m = u.match(/^https?:\\/\\/[^\\/]+/);\n    if (m) {\n      var org = m[0];\n      var ck = String(cookie.getCookie(org) || '');\n      if (ck.indexOf('age18_ok') < 0) {\n        cookie.setCookie(org, ck ? (ck + '; age18_ok=1') : 'age18_ok=1');\n      }\n    }\n  } catch(e) {}\n  // 检测到被年龄确认拦截 → 明确提示\n  try {\n    var b = String(result.body ? (typeof result.body==='function'?result.body():result.body) : '');\n    if (b.indexOf('年龄确认') >= 0 && b.indexOf('已成年') >= 0) {\n      java.log('被年龄确认拦截：' + String(result.url()));\n    }\n  } catch(e2) {}\n})();\n\nvar pres = result.raw().priorResponse();\nvar isRedirect = pres!=null&&pres.isRedirect();\nif (isRedirect) {\n\tlet url=String(result.url()).match(/^https?:\\/\\/[^\\/]+\\//)[0];\n\tif (!/luoyacheng/.test(url)) {\n\t\tlet Info=source.getLoginInfoMap()||{};\n\t\tInfo['网址'] = url;\n\t\tsource.putLoginInfo(JSON.stringify(Info));\t}\n}\nvar code = result.code();\nif (code == 403) {\n\tjava.toast('\\n访问被拒绝');\n\t}\nelse if (code == 520) {\n\tjava.toast('\\nIP被拉黑');\n\t}\nresult\n", "loginUi": "[\n    {\n        name: \"网址\",\n        type: \"text\",\n        default: \"https://8xsk.cc\"\n    },\n    {\n        name: \"🚀一键选站\",\n        type: \"button\",\n        action: \"bxpick()\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"账号\",\n        type: \"text\"\n    },\n    {\n        name: \"密码\",\n        type: \"password\"\n    },\n    {\n        name: \"💍网址\",\n        type: \"button\",\n        action: \"webfb()\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"🌐站点快切\",\n        type: \"button\",\n        action: \"bxs(0)\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"🔍登录诊断\",\n        type: \"button\",\n        action: \"lgdiag()\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"🔺登　录🔺\",\n        type: \"button\",\n        action: \"Login()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"♤登出\",\n        type: \"button\",\n        action: \"re()\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n    \tname: \"💬信息\",\n    \ttype: \"button\",\n    \taction: \"sm()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1,\n            \"layout_wrapBefore\": true\n        }\n    \t},\n    \t{\n        name: \"🧾延迟测试\",\n        type: \"button\",\n        action: \"ceshi()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    \t{\n        name: \"⏭️启用下载\",\n        type: \"button\",\n        action: \"downl()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    \t{\n        name: \"🌐打开本书↓\",\n        type: \"button\",\n        action: \"webb()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1,\n            \"layout_wrapBefore\": true\n        }\n    },\n    {\n        name: \"📚加入网站书架\",\n        type: \"button\",\n        action: \"addsh()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"🗑移出网站书架\",\n        type: \"button\",\n        action: \"delsh()\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    \t{\n        name: \"❌屏蔽\",\n        type: \"button\",\n        action: \"hmd()\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    \t{\n        name: \"🧹清理\",\n        type: \"button\",\n        action: \"hmdre()\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"🗑清缓存\",\n        type: \"button\",\n        action: \"clrc()\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"🔧重置设置\",\n        type: \"button\",\n        action: \"reset()\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"书名\",\n        type: \"text\"\n    },\n    \t{\n        name: \"🆕版本更新\",\n        type: \"button\",\n        action: \"gengxin()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    \t{\n        name: \"🔄自动同步开关\",\n        type: \"button\",\n        action: \"shujia()\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    \t{\n        name: \"♻️同步网站书架\",\n        type: \"button\",\n        action: \"webbs(1)\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"正则书名黑名单\",\n        type: \"text\"\n    },\n    {\n        name: \"正则书名白名单\",\n        type: \"text\"\n    },\n    \t{\n        name: \"🌐更新日志\",\n        type: \"button\",\n        action: \"gitee()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1,\n            \"layout_wrapBefore\": true\n        }\n    },\n    \t{\n        name: \"🌐打开网站\",\n        type: \"button\",\n        action: \"webbs(2)\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    \t{\n        name: \"🔁书名\",\n        type: \"button\",\n        action: \"shuming()\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    \t{\n        name: \"🗻净化封面\",\n        type: \"button\",\n        action: \"jhfm()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    \t{\n        name: \"🌐书源介绍\",\n        type: \"button\",\n        action: \"let option={};option['headers'] = {'User-Agent': java.getWebViewUA()};java.startBrowser('https://luoyacheng.cloudns.ch/#八叉,'+JSON.stringify(option),'介绍');\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    \t{\n        name: \"🤔反馈\",\n        type: \"button\",\n        action: \"let option={};option['headers'] = {'User-Agent': java.getWebViewUA()};java.startBrowser('https://github.com/Luoyacheng/yuedu/discussions/categories/a-八叉?discussions_q=,'+JSON.stringify(option),'8x反馈');\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"封面背景颜色\",\n        type: \"text\"\n    },\n    {\n        name: \"封面字体颜色\",\n        type: \"text\"\n    },\n    \t{\n        name: \"🌐网页登录\",\n        type: \"button\",\n        action: \"weblogin()\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    \t{\n        name: \"⚒️调试模式\",\n        type: \"button\",\n        action: \"bfqfun2('调试模式')\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": -1\n        }\n    }\n]", "loginUrl": "\n// ===== 取表单值：result 优先，退回 getLoginInfoMap（loginUrl 环境可能没有 result）=====\nfunction lgForm(){\n\tconst {java, source} = this;\n\tlet u='', p='';\n\ttry { u = String(result['账号'] || ''); } catch(e) {}\n\ttry { p = String(result['密码'] || ''); } catch(e) {}\n\tif (!u || !p) {\n\t\ttry {\n\t\t\tlet m = source.getLoginInfoMap() || {};\n\t\t\tif (!u) u = String(m['账号'] || '');\n\t\t\tif (!p) p = String(m['密码'] || '');\n\t\t} catch(e2) {}\n\t}\n\treturn {u: u.replace(/^\\s+|\\s+$/g,''), p: p};\n}\n\nfunction login(){}\nfunction Login(){\n\tconst {java, source, cookie} = this;\n\tif (String(source.getLoginHeader()).includes(\"jieqiUserInfo\")) {\n\t\tjava.longToast('已登录\\n如需换号请先点「♤登出」');\n\t\treturn;\n\t}\n\tlet surl = getsurl();\n\t//★先看 CookieJar 里是否已经有登录态（用户可能之前已登录成功，只是登录头没同步）\n\tlet preCk = '';\n\ttry { preCk = String(cookie.getCookie(surl) || ''); } catch(e) {}\n\tif (preCk.indexOf('jieqiUserInfo') >= 0 && preCk.indexOf('jieqiUserInfo=deleted') < 0) {\n\t\tsource.putLoginHeader(JSON.stringify({Cookie: preCk}));\n\t\tjava.longToast('\\n✅ 检测到已登录的 Cookie，已自动同步\\nVIP模式💎');\n\t\treturn;\n\t}\n\tsource.removeLoginHeader();\n\tjava.toast('正在获取验证码…');\n\n\t// ---- 1. 打开登录页，拿验证码地址 ----\n\tlet option = {};\n\toption[\"headers\"] = gethd();\n\tlet lgHtml = '';\n\ttry { lgHtml = String(java.ajax(surl + '/login.php,' + JSON.stringify(option))); } catch(e) {\n\t\tjava.longToast('登录页打不开：' + String(e).substring(0,60)); return;\n\t}\n\tif (!lgHtml || lgHtml.length < 500) {\n\t\tjava.longToast('登录页异常（' + (lgHtml?lgHtml.length:0) + 'B）\\n请先点「🚀一键选站」'); return;\n\t}\n\n\t// ---- 2. 解析验证码地址 ----\n\tlet codeUrl = '';\n\ttry {\n\t\t//★八叉的验证码地址不在 img@src（是空的），而在：\n\t\t//  input#checkcode 的 onfocus = \"this.form.imgccode.src='https://.../checkcode.php?rand=NNN'\"\n\t\t//  img[name=imgccode] 的 onclick = \"this.src='.../checkcode.php?rand='+Math.random()\"\n\t\tlet wj = Packages.org.jsoup.Jsoup.parse(lgHtml);\n\t\tlet cands = [\n\t\t\tString(wj.select('#checkcode').attr('onfocus') || ''),\n\t\t\tString(wj.select('img[name=imgccode]').attr('onclick') || ''),\n\t\t\tString(wj.select('#t_imgccode').attr('onclick') || ''),\n\t\t\tString(wj.select('img[name~=img.*code]').attr('onclick') || ''),\n\t\t\tString(wj.select('img[name~=img.*code]').attr('onfocus') || '')\n\t\t];\n\t\tfor (let ci = 0; ci < cands.length; ci++) {\n\t\t\tlet oc = cands[ci];\n\t\t\tif (!oc) continue;\n\t\t\tlet mm = oc.match(/['\"]([^'\"]*checkcode\\.php[^'\"]*)['\"]/i);\n\t\t\tif (!mm) continue;\n\t\t\tcodeUrl = mm[1];\n\t\t\tif (codeUrl.indexOf('http') != 0) codeUrl = surl + '/' + codeUrl.replace(/^[/]+/, '');\n\t\t\tcodeUrl = codeUrl.replace(/[+].*$/, '');   // 去掉 +Math.random()\n\t\t\tif (codeUrl) break;\n\t\t}\n\t\t// 兜底：直接扫 HTML 里的 checkcode.php?rand=数字\n\t\tif (!codeUrl) {\n\t\t\tlet m2 = lgHtml.match(/checkcode\\.php\\?rand=[0-9]*/i);\n\t\t\tif (m2) codeUrl = surl + '/' + m2[0];\n\t\t}\n\t\t// 再兜底：自己拼（站点固定路径）\n\t\tif (!codeUrl) codeUrl = surl + '/checkcode.php?rand=' + Math.floor(Math.random()*1e9);\n\t} catch(e) { java.log('解析验证码地址失败：' + e); }\n\n\tif (!codeUrl) {\n\t\tjava.longToast('💔 未找到验证码地址\\n请改用「🌐网页登录」'); return;\n\t}\n\tjava.log('验证码地址：' + codeUrl);\n\n\t// ---- 3. 让用户输入验证码 ----\n\tlet code = '';\n\ttry {\n\t\tcode = String(java.getVerificationCode(codeUrl + ',' + JSON.stringify(option)) || '').replace(/^\\s+|\\s+$/g, '');\n\t} catch(e) {\n\t\tjava.longToast('验证码弹窗失败：' + String(e).substring(0,60)); return;\n\t}\n\tif (!code) { java.longToast('未输入验证码，已取消'); return; }\n\n\tlet f = lgForm();\n\tlet un = f.u;\n\tlet pw = f.p;\n\tif (!un || !pw) { java.longToast('💔 账号和密码不能为空'); return; }\n\n\t// ---- 4. POST 登录（表单字段与站点 frmlogin 一致）----\n\tlet body = 'username=' + encodeURIComponent(un)\n\t         + '&password=' + encodeURIComponent(pw)\n\t         + '&checkcode=' + encodeURIComponent(code)\n\t         + '&usecookie=2592000&act=login&submit=';\n\tlet opt2 = {};\n\topt2[\"headers\"] = gethd();\n\topt2[\"headers\"][\"Referer\"] = surl + '/login.php';\n\topt2[\"method\"] = \"POST\";\n\topt2[\"body\"] = body;\n\tjava.toast('登录中…');\n\n\tlet resp = null, respCode = 0, respBody = '';\n\ttry {\n\t\tresp = java.connect(surl + '/login.php?do=submit&jumpurl=' + encodeURIComponent(surl + '/') + ',' + JSON.stringify(opt2));\n\t\trespCode = resp.code();\n\t\trespBody = String(resp.body() || '');\n\t} catch(e) {\n\t\tjava.longToast('登录请求异常：' + String(e).substring(0,80)); return;\n\t}\n\n\t// ---- 5. ★关键：从 CookieJar 读 Cookie（不再用 headers().values(\"Set-Cookie\")）----\n\tlet ck = '';\n\ttry { ck = String(cookie.getCookie(surl) || ''); } catch(e) {}\n\t// CookieJar 为空时，退回从响应头读（兼容旧行为）\n\tif (ck.indexOf('jieqiUserInfo') < 0) {\n\t\ttry {\n\t\t\tlet raw = String(resp.headers().get('Set-Cookie') || '');\n\t\t\tif (raw && raw != 'null') {\n\t\t\t\tlet parts = raw.split(',');\n\t\t\t\tlet buf = [];\n\t\t\t\tfor (let i = 0; i < parts.length; i++) {\n\t\t\t\t\tlet seg = String(parts[i]).replace(/;.*$/, '').replace(/^\\s+|\\s+$/g, '');\n\t\t\t\t\tif (seg && seg.indexOf('=') > 0) buf.push(seg);\n\t\t\t\t}\n\t\t\t\tif (buf.length) {\n\t\t\t\t\tck = buf.join('; ');\n\t\t\t\t\tcookie.setCookie(surl, ck);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch(e2) {}\n\t}\n\n\t// ---- 6. 判定登录结果 ----\n\tlet ok = ck.indexOf('jieqiUserInfo') >= 0 && ck.indexOf('jieqiUserInfo=deleted') < 0;\n\tif (ok) {\n\t\tsource.putLoginHeader(JSON.stringify({Cookie: ck}));\n\t\ttry {\n\t\t\tlet m = source.getLoginInfoMap() || {};\n\t\t\tm['账号'] = un; m['密码'] = pw;\n\t\t\tsource.putLoginInfo(JSON.stringify(m));\n\t\t} catch(e) {}\n\t\tlet nm = '';\n\t\tlet mn = ck.match(/jieqiUserName%3D([^%]+)/) || ck.match(/jieqiUserName=([^;,]+)/);\n\t\tif (mn) { try { nm = decodeURIComponent(mn[1]); } catch(e3) { nm = mn[1]; } }\n\t\tjava.longToast('\\n✅ 登录成功' + (nm ? ('：' + nm) : '') + '\\nVIP模式💎');\n\t\treturn;\n\t}\n\n\t// ---- 7. 失败诊断：给出可操作原因 ----\n\tlet reason = '';\n\tif (respBody.indexOf('验证码错误') >= 0) reason = '验证码错误（请重新点登录，注意区分大小写）';\n\telse if (respBody.indexOf('验证码') >= 0) reason = '验证码错误';\n\telse if (respBody.indexOf('密码错误') >= 0 || respBody.indexOf('密码不正确') >= 0) reason = '账号或密码错误';\n\telse if (respBody.indexOf('不存在') >= 0) reason = '账号不存在';\n\telse if (respBody.indexOf('frmlogin') >= 0) reason = '仍停在登录页（凭据未通过）';\n\telse if (respCode == 403) reason = '访问被拒绝(403)';\n\telse if (respCode >= 500) reason = '服务端错误(' + respCode + ')';\n\telse if (!respBody) reason = '响应为空';\n\telse reason = '未知（响应 ' + respBody.length + 'B）';\n\tjava.longToast('\\n❌ 登录失败\\n原因：' + reason\n\t\t+ '\\n\\n可改用「🌐网页登录」\\n（在浏览器里登录后自动同步 Cookie）');\n\tjava.log('登录失败：code=' + respCode + ' body=' + respBody.substring(0, 400));\n}\n\nfunction weblogin(){\n\tconst {java, source, cookie} = this;\n\tif (String(source.getLoginHeader()).includes(\"jieqiUserInfo\")) {\n\t\tjava.longToast('已登录\\n如需换号请先点「♤登出」');\n\t\treturn;\n\t}\n\tlet nn = getsurl();\n\tsource.removeLoginHeader();\n\tlet option = {};\n\toption[\"headers\"] = gethd();\n\toption[\"headers\"][\"User-Agent\"] = java.getWebViewUA();\n\tjava.toast('正在打开登录页…');\n\ttry {\n\t\tjava.startBrowserAwait(nn + '/login.php,' + JSON.stringify(option), '八叉登录', false);\n\t} catch(e) {\n\t\tjava.longToast('打开浏览器失败：' + String(e).substring(0,60)); return;\n\t}\n\tPackages.java.lang.Thread.sleep(300);\n\t//★关键：从 CookieJar 读，而不是响应头\n\tlet ck = '';\n\ttry { ck = String(cookie.getCookie(nn) || ''); } catch(e) {}\n\tif (ck.indexOf('jieqiUserInfo') >= 0 && ck.indexOf('jieqiUserInfo=deleted') < 0) {\n\t\tsource.putLoginHeader(JSON.stringify({Cookie: ck}));\n\t\tjava.longToast('\\n✅ 网页登录成功\\nVIP模式💎');\n\t} else {\n\t\tjava.longToast('\\n❌ 未检测到登录 Cookie\\n\\n可能原因：\\n1) 浏览器里没登录成功\\n2) 登录后提前返回了\\n\\n可再点一次「🌐网页登录」，登录成功后停留 2 秒再返回');\n\t}\n}\n\nfunction ceshi(){\n\tconst {java, source, cookie} = this;\n\tlet nn = getsurl();\n\tlet option = {};\n\toption[\"headers\"] = gethd();\n\tjava.toast('测试线路：' + nn);\n\tlet lines = [];\n\tlet t0 = new Date().getTime();\n\ttry {\n\t\tlet web = java.connect(nn + ',' + JSON.stringify(option));\n\t\tlet ms = new Date().getTime() - t0;\n\t\tlet body = String(web.body() || '');\n\t\tlet code = web.code();\n\t\tlines.push('线路：' + nn);\n\t\tlines.push('状态码：' + code);\n\t\tlines.push('耗时：' + (ms/1000).toFixed(2) + ' 秒');\n\t\tlines.push('大小：' + body.length + ' B');\n\t\tif (code == 403) lines.push('❌ 访问被拒绝');\n\t\telse if (code == 520) lines.push('❌ IP 被拉黑');\n\t\telse if (body.length < 3000) lines.push('❌ 返回异常（可能被年龄确认拦截）');\n\t\telse if (body.indexOf('年龄确认') >= 0) lines.push('❌ 被年龄确认拦截（Cookie 未生效）');\n\t\telse if (body.indexOf('八叉') >= 0) lines.push('✅ 正常');\n\t\telse lines.push('⚠️ 内容异常');\n\t\t// 顺带报告登录态\n\t\tlet ck = '';\n\t\ttry { ck = String(cookie.getCookie(nn) || ''); } catch(e) {}\n\t\tlines.push('Cookie：' + (ck.indexOf('jieqiUserInfo') >= 0 ? '已登录💎' : '访客🔒'));\n\t} catch(err) {\n\t\tlines.push('❌ 连接失败');\n\t\tlines.push(String(err).substring(0, 100));\n\t}\n\tjava.longToast(lines.join('\\n'));\n}\n\nfunction re(){\n\tconst {java, source, cookie} = this;\n\tlet surl = getsurl();\n\tjava.toast('正在登出…');\n\t// 1. 通知站点登出\n\ttry {\n\t\tlet ck = ckget(source);\n\t\tlet opt = {};\n\t\topt[\"headers\"] = gethd();\n\t\tif (ck) opt[\"headers\"][\"Cookie\"] = ck;\n\t\tlet url = /http.{4}www/.test(surl) ? (surl + '/logout.php') : (surl + '/userdetail.php');\n\t\tjava.ajax(url + ',' + JSON.stringify(opt));\n\t} catch(e) {}\n\t// 2. 清登录头\n\ttry { source.removeLoginHeader(); } catch(e) {}\n\t// 3. 清 CookieJar（只保留 age18_ok）\n\ttry {\n\t\tcookie.setCookie(surl, 'age18_ok=1');\n\t} catch(e) {}\n\t// 4. 清缓存\n\ttry { cache.deleteMemory('8xid'); } catch(e) {}\n\ttry { cache.deleteMemory('8xhmd'); } catch(e) {}\n\t// 5. 清表单\n\ttry {\n\t\tlet m = source.getLoginInfoMap() || {};\n\t\tm['账号'] = ''; m['密码'] = '';\n\t\tsource.putLoginInfo(JSON.stringify(m));\n\t} catch(e) {}\n\tjava.longToast('\\n已登出，回到访客模式🔒');\n}\n\nfunction sm(){\n\tconst {java, source, cookie} = this;\n\tlet surl = getsurl();\n\tlet banben = '?';\n\ttry { banben = String(source.exploreUrl).match(/let banben=\"([\\d\\.]+)\"/)[1]; } catch(e) {}\n\tlet hdr = ckget(source);\n\tlet jar = '';\n\ttry { jar = String(cookie.getCookie(surl) || ''); } catch(e) {}\n\tlet hasH = hdr.indexOf('jieqiUserInfo') >= 0;\n\tlet hasC = jar.indexOf('jieqiUserInfo') >= 0 && jar.indexOf('jieqiUserInfo=deleted') < 0;\n\tlet nm = '';\n\tlet mn = (hasC ? jar : hdr).match(/jieqiUserName%3D([^%]+)/) || (hasC ? jar : hdr).match(/jieqiUserName=([^;,]+)/);\n\tif (mn) { try { nm = decodeURIComponent(mn[1]); } catch(e) { nm = mn[1]; } }\n\tlet mode = (hasH || hasC) ? ('VIP模式💎' + (nm ? ('  ' + nm) : '')) : '访客模式🔒';\n\tlet t = '当前线路：' + surl + '\\n版本：' + banben + '\\n模式：' + mode\n\t\t+ '\\n登录头：' + (hasH ? '已设置' : '未设置')\n\t\t+ '\\nCookie：' + (hasC ? '有登录态' : '无');\n\tjava.longToast(t);\n}\n\nfunction webck(){\n\tconst {java, source, cookie} = this;\n\tlet nn = getsurl();\n\tlet nnm = nn.replace('www.','');\n\tlet ck = ckget(source);\n\t//★关键：cookie.setCookie 是「整体替换」语义，直接写登录头会把 age18_ok 清掉\n\t//★导致浏览器打开后又是「年龄确认」页 → 表现为「打开网站/书架失效」\n\ttry {\n\t\tlet cur = String(cookie.getCookie(nnm) || '');\n\t\tlet merged = '';\n\t\tif (cur && cur.indexOf('age18_ok') >= 0) merged = cur;\n\t\telse merged = cur ? (cur + '; age18_ok=1') : 'age18_ok=1';\n\t\tif (ck && merged.indexOf('jieqiUserInfo') < 0) {\n\t\t\t// 把登录头的键合并进去（保留 age18_ok）\n\t\t\tlet parts = ck.split(';');\n\t\t\tfor (let i = 0; i < parts.length; i++) {\n\t\t\t\tlet kv = String(parts[i]).replace(/^\\s+|\\s+$/g, '');\n\t\t\t\tif (!kv || kv.indexOf('=') <= 0) continue;\n\t\t\t\tlet k = kv.substring(0, kv.indexOf('='));\n\t\t\t\tif (k == 'age18_ok') continue;\n\t\t\t\tif (merged.indexOf(k + '=') >= 0) continue;\n\t\t\t\tmerged += '; ' + kv;\n\t\t\t}\n\t\t}\n\t\tcookie.setCookie(nnm, merged);\n\t\ttry { cache.put('8xbff', source.getLoginInfo()); } catch(e1) {}\n\t\ttry { cache.put('8xbff2', ck); } catch(e1) {}\n\t} catch(e) {}\n\treturn nnm;\n}\n\nfunction webb(){\n\tconst {java, source, cache, cookie} = this;\n\t// 1. 取书籍 id（缓存 → 当前 book）\n\tlet id = '', bkName = '';\n\ttry {\n\t\tlet m = cache.getFromMemory('8xid');\n\t\tif (m) { let k = Object.keys(m)[0]; id = String(k); bkName = String(m[k] || ''); }\n\t} catch(e) {}\n\tif (!id) {\n\t\ttry {\n\t\t\tlet bu = String((typeof book != 'undefined' && book) ? (book.bookUrl || '') : '');\n\t\t\tlet mm = bu.match(/book[/](\\d+)/);\n\t\t\tif (mm) { id = mm[1]; bkName = String(book.name || ''); }\n\t\t} catch(e2) {}\n\t}\n\tif (!id) {\n\t\tjava.longToast('\\n未获取到书籍 ID\\n\\n请先打开一本书的详情页\\n或在书架里点进书籍后重试');\n\t\treturn;\n\t}\n\t// 2. 同步 Cookie（保证 age18_ok 在）\n\tlet site = webck();\n\tlet jar = String(cookie.getCookie(site) || 'age18_ok=1');\n\tlet bkUrl = site + '/book/' + id + '.html';\n\t// 3. 优先系统浏览器（内置 WebView 可能被墙）\n\tlet opened = false;\n\ttry {\n\t\tjava.openUrl(bkUrl);\n\t\topened = true;\n\t\tjava.toast('已用系统浏览器打开《' + (bkName || id) + '》');\n\t} catch(e3) {}\n\tif (!opened) {\n\t\ttry {\n\t\t\tlet ua = java.getWebViewUA();\n\t\t\tjava.startBrowser(bkUrl + ',' + JSON.stringify({headers:{'User-Agent':ua,'Cookie':jar}}), '八叉');\n\t\t\topened = true;\n\t\t} catch(e4) {}\n\t}\n\tif (!opened) java.longToast('打开失败\\n请手动复制网址：\\n' + bkUrl);\n}\n\n// ===== 📚 把当前书籍加入网站书架（纯 HTTP，不用浏览器）=====\nfunction addsh(){\n\tconst {java, source, cache, cookie} = this;\n\t// 取书籍 id\n\tlet id = '', bkName = '';\n\ttry {\n\t\tlet m = cache.getFromMemory('8xid');\n\t\tif (m) { let k = Object.keys(m)[0]; id = String(k); bkName = String(m[k] || ''); }\n\t} catch(e) {}\n\tif (!id) {\n\t\ttry {\n\t\t\tlet bu = String((typeof book != 'undefined' && book) ? (book.bookUrl || '') : '');\n\t\t\tlet mm = bu.match(/book[/](\\d+)/);\n\t\t\tif (mm) { id = mm[1]; bkName = String(book.name || ''); }\n\t\t} catch(e2) {}\n\t}\n\tif (!id) {\n\t\tjava.longToast('\\n未获取到书籍 ID\\n\\n请先打开一本书的详情页'); return;\n\t}\n\tlet site = webck();\n\tlet jar = String(cookie.getCookie(site) || '');\n\tif (jar.indexOf('jieqiUserInfo') < 0) {\n\t\tjava.longToast('\\n❌ 请先登录\\n\\n加入网站书架需要登录账号'); return;\n\t}\n\tjava.toast('正在加入网站书架…');\n\tlet ua = java.getWebViewUA();\n\tlet tm = new Date().getTime();\n\tlet body = 'bid=' + id + '&ajax_request=' + tm;\n\tlet opt = {\n\t\theaders: {'User-Agent': ua, 'Cookie': jar, 'Referer': site + '/book/' + id + '.html'},\n\t\tmethod: 'POST', body: body, timeout: 25000\n\t};\n\tlet msg = '';\n\ttry {\n\t\tlet r = java.connect(site + '/modules/article/addbookcase.php,' + JSON.stringify(opt));\n\t\tmsg = String(r.body() || '').replace(/<[^>]+>/g, '').replace(/\\s+/g, ' ').trim();\n\t} catch(e3) {\n\t\tjava.longToast('加入失败：' + String(e3).substring(0,80)); return;\n\t}\n\tjava.log('addbookcase 返回：' + msg);\n\tif (msg.indexOf('恭喜') >= 0 || msg.indexOf('已经加入') >= 0 || msg.indexOf('已在') >= 0) {\n\t\tjava.longToast('\\n✅ ' + msg + '\\n\\n《' + (bkName || id) + '》');\n\t} else {\n\t\tjava.longToast('\\n⚠️ 返回：' + (msg || '空响应') + '\\n\\n可点「♻️同步书架」核对');\n\t}\n}\n\n// ===== 📚 从网站书架移除当前书籍 =====\nfunction delsh(){\n\tconst {java, source, cache, cookie} = this;\n\tlet id = '';\n\ttry {\n\t\tlet m = cache.getFromMemory('8xid');\n\t\tif (m) { id = String(Object.keys(m)[0]); }\n\t} catch(e) {}\n\tif (!id) {\n\t\ttry {\n\t\t\tlet bu = String((typeof book != 'undefined' && book) ? (book.bookUrl || '') : '');\n\t\t\tlet mm = bu.match(/book[/](\\d+)/);\n\t\t\tif (mm) id = mm[1];\n\t\t} catch(e2) {}\n\t}\n\tif (!id) { java.longToast('未获取到书籍 ID'); return; }\n\tlet site = webck();\n\tlet jar = String(cookie.getCookie(site) || '');\n\tif (jar.indexOf('jieqiUserInfo') < 0) { java.longToast('请先登录'); return; }\n\tlet ua = java.getWebViewUA();\n\tlet tm = new Date().getTime();\n\tlet body = 'bid=' + id + '&ajax_request=' + tm;\n\tlet opt = {\n\t\theaders: {'User-Agent': ua, 'Cookie': jar, 'Referer': site + '/book/' + id + '.html'},\n\t\tmethod: 'POST', body: body, timeout: 25000\n\t};\n\tlet msg = '';\n\ttry {\n\t\tlet r = java.connect(site + '/modules/article/delbookcase.php,' + JSON.stringify(opt));\n\t\tmsg = String(r.body() || '').replace(/<[^>]+>/g, '').replace(/\\s+/g, ' ').trim();\n\t} catch(e3) {\n\t\tjava.longToast('移除失败：' + String(e3).substring(0,80)); return;\n\t}\n\tjava.log('delbookcase 返回：' + msg);\n\tjava.longToast('\\n返回：' + (msg || '空响应'));\n}\n\nfunction webbs(x){\n\tconst {java, source, cookie} = this;\n\tlet nm = webck();\n\tlet jar = String(cookie.getCookie(nm) || 'age18_ok=1');\n\tlet ua = java.getWebViewUA();\n\n\t// ============ x=1：同步网站书架（纯 HTTP，不用浏览器）============\n\tif (x == 1) {\n\t\t// 1. 检查登录\n\t\tif (jar.indexOf('jieqiUserInfo') < 0) {\n\t\t\tjava.longToast('\\n❌ 请先登录\\n\\n同步书架需要登录账号\\n点「🔺登　录🔺」或「🌐网页登录」');\n\t\t\treturn;\n\t\t}\n\t\tjava.toast('正在读取网站书架…');\n\t\tlet b = '';\n\t\ttry {\n\t\t\tb = String(java.connect(nm + '/modules/article/bookcase.php,{\"headers\":{\"User-Agent\":\"' + ua + '\",\"Cookie\":\"' + jar + '\"},\"timeout\":25000}').body() || '');\n\t\t} catch(e) {\n\t\t\tjava.longToast('读取书架失败：' + String(e).substring(0,60)); return;\n\t\t}\n\t\tif (!b || b.length < 1000) {\n\t\t\tjava.longToast('书架页异常（' + (b?b.length:0) + 'B）\\n请检查网络或换线路'); return;\n\t\t}\n\t\tif (b.indexOf('frmlogin') >= 0) {\n\t\t\tjava.longToast('❌ 未登录或登录已失效\\n请重新登录'); return;\n\t\t}\n\t\t// 2. 解析书架里的书\n\t\t//★真实结构：div.c_row.cf 卡片 → div.row_text h4 a 是书名（href 带 aid=N）\n\t\t//★aid 才是书籍 id；bid 是站点内部 id，不能用来拼 /book/\n\t\tlet ids = [], names = [], seen = {};\n\t\ttry {\n\t\t\tlet j = Packages.org.jsoup.Jsoup.parse(b);\n\t\t\tlet cards = j.select('div.c_row.cf');\n\t\t\tif (cards.size() > 0) {\n\t\t\t\tfor (let i = 0; i < cards.size(); i++) {\n\t\t\t\t\tlet c = cards.get(i);\n\t\t\t\t\tlet a = c.select('div.row_text h4 a').first();\n\t\t\t\t\tif (a == null) a = c.select('a[href*=aid=]').first();\n\t\t\t\t\tif (a == null) continue;\n\t\t\t\t\tlet href = String(a.attr('href') || '');\n\t\t\t\t\tlet mm = href.match(/[?&]aid=(\\d+)/);\n\t\t\t\t\tif (!mm) continue;\n\t\t\t\t\tlet id = mm[1];\n\t\t\t\t\tif (seen[id]) continue;\n\t\t\t\t\tseen[id] = 1;\n\t\t\t\t\tids.push(id);\n\t\t\t\t\tnames.push(String(a.text() || '').replace(/^\\s+|\\s+$/g, ''));\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 兜底：没有 c_row 卡片时全页扫\n\t\t\tif (!ids.length) {\n\t\t\t\tlet as = j.select('a[href*=aid=]');\n\t\t\t\tfor (let i2 = 0; i2 < as.size(); i2++) {\n\t\t\t\t\tlet a2 = as.get(i2);\n\t\t\t\t\tlet mm2 = String(a2.attr('href') || '').match(/[?&]aid=(\\d+)/);\n\t\t\t\t\tif (!mm2 || seen[mm2[1]]) continue;\n\t\t\t\t\tseen[mm2[1]] = 1;\n\t\t\t\t\tids.push(mm2[1]);\n\t\t\t\t\tnames.push(String(a2.text() || '').replace(/^\\s+|\\s+$/g, ''));\n\t\t\t\t}\n\t\t\t}\n\t\t} catch(e2) {\n\t\t\tjava.log('解析书架失败：' + e2);\n\t\t}\n\t\t// 兜底：正则扫\n\t\tif (!ids.length) {\n\t\t\tlet re = /[?&]aid=(\\d+)/g, m3;\n\t\t\twhile ((m3 = re.exec(b)) !== null) {\n\t\t\t\tif (!seen[m3[1]]) { seen[m3[1]] = 1; ids.push(m3[1]); names.push(''); }\n\t\t\t}\n\t\t}\n\t\tif (!ids.length) {\n\t\t\tjava.longToast('书架里没有书\\n\\n可先点「🌐打开网站」在网页里加书'); return;\n\t\t}\n\t\t// 3. 逐本加入 Legado 书架\n\t\tlet okN = 0;\n\t\tfor (let k = 0; k < ids.length; k++) {\n\t\t\tlet bkUrl = nm + '/book/' + ids[k] + '.html';\n\t\t\tlet dl = 'legado://import/addToBookshelf?src=' + encodeURIComponent(bkUrl) + ',{\"origin\":\"https://八叉书库.luoyacheng.ip-ddns.com\"}';\n\t\t\ttry { java.openUrl(dl); okN++; } catch(e3) {}\n\t\t\t// 间隔，避免深链连发被系统吞\n\t\t\tif (k < ids.length - 1) { try { Packages.java.lang.Thread.sleep(700); } catch(e4) {} }\n\t\t}\n\t\tlet preview = [];\n\t\tfor (let p = 0; p < Math.min(3, ids.length); p++) {\n\t\t\tpreview.push('· ' + (names[p] || ids[p]));\n\t\t}\n\t\tif (ids.length > 3) preview.push('· …等 ' + ids.length + ' 本');\n\t\tjava.longToast('\\n✅ 网站书架共 ' + ids.length + ' 本\\n已发起加入 ' + okN + ' 本\\n────────\\n'\n\t\t\t+ preview.join('\\n') + '\\n────────\\n若未全部加入，可重复点此按钮');\n\t\treturn;\n\t}\n\n\t// ============ x=2：打开网站（优先系统浏览器）============\n\tlet target = nm;\n\tlet opt = JSON.stringify({headers:{'User-Agent': ua, 'Cookie': jar}});\n\tlet opened = false;\n\t// 优先用系统浏览器（内置 WebView 可能被墙）\n\ttry {\n\t\tjava.openUrl(target);\n\t\topened = true;\n\t\tjava.toast('已用系统浏览器打开');\n\t} catch(e) {}\n\tif (!opened) {\n\t\ttry { java.startBrowser(target + ',' + opt, '八叉'); opened = true; } catch(e2) {}\n\t}\n\tif (!opened) java.longToast('打开失败\\n请手动在浏览器访问：\\n' + target);\n}\n\nfunction hmd(){\n\tlet id = cache.getFromMemory('8xid');\n\tif (id) {\n\tlet hmd = cache.get('8xhmd')||'{}';\n\thmd = JSON.parse(hmd);\n\tlet idd = Object.keys(id)[0];\n\tif (idd in hmd) {\n\t\tdelete hmd[idd];\n\t\tcache.put('8xhmd',JSON.stringify(hmd),0);\n\t\tjava.longToast('\\n已将书籍：'+Object.values(id)[0]+'\\n移除黑名单😅');\n\t\t}\telse {\n\thmd = Object.assign({},hmd,id);\n\tcache.put('8xhmd',JSON.stringify(hmd),0);\n\tjava.longToast('\\n已将书籍：'+Object.values(id)[0]+'\\n加入黑名单😤');}\n\t\n\t} else {java.toast('\\n请在书籍界面点击或刷新书籍');}\n\t\n}\n\nfunction hmdre(){\n\tlet hmd=cache.get('8xhmd')||'{}';\n\thmd=JSON.parse(hmd);\n\tlet ss=Object.entries(hmd);\nlet [cb,cf] = colorz();\nlet svg=`<svg width=\"990\" height=\"300\" xmlns=\"http://www.w3.org/2000/svg\">\n<style>\ntext {\n\twhite-space: pre;\n\tword-wrap: break-word;}\n</style>\n<rect width=\"100%\" height=\"150%\" fill=\"#${cb}\"/>\n<text fill=\"#${cf}\" text-anchor=\"middle\" dominant-baseline=\"middle\" stroke=\"#000000\" stroke-width=\"1\" font-weight=\"bold\">\n<tspan x=\"50%\" dy=\"30%\" font-size=\"100\">\n是否清空黑名单<tspan font-size=\"30\">（${ss.length}）</tspan>\n</tspan>\n<tspan x=\"42%\" dy=\"25%\" font-size=\"60\">输入“确认”进行清空</tspan>\n<tspan x=\"50%\" dy=\"20%\" font-size=\"50\">输入“名单”打印一份名单到日志</tspan>\n<tspan x=\"50%\" dy=\"20%\" font-size=\"50\">输入书籍ID单独移出黑名单<tspan font-size=\"30\">(名单查看)</tspan></tspan>\n</text>\n</svg>`;\nsvg=java.base64Encode(svg);\n\ntry {\n//拦截验证码报错\nlet ysr=java.getVerificationCode('data:image/svg+xml;base64,'+svg);\nPackages.java.lang.Thread.sleep(100);\nif (ysr=='确认') {\n\tcache.delete('8xhmd');\n\tjava.toast('\\n已清空');\n}\nelse if (ysr=='名单') {\n\tjava.log('\\n💔8x黑名单：\\n'+ss.join('\\n'));\n\tcache.put('8xbff',source.getLoginInfo());\n\tcache.put('8xbff2',ckget(source));\n}\nelse if (/\\d{3,}/.test(ysr)) {\n\tif (ysr in hmd) {\n\tjava.toast('\\n已将书籍：'+hmd[ysr]+'\\n移除黑名单');\n\tdelete hmd[ysr];\n\tcache.put('8xhmd',JSON.stringify(hmd),0);\n\t} else {java.toast('移出失败');}\n}\nelse if (ysr=='恢复') {\n\tlet ryr=cache.get('8xbff');\n\tlet ryr2=cache.get('8xbff2');\n\tsource.putLoginInfo(ryr);\n\tsource.putLoginHeader(JSON.stringify({Cookie: ryr2}));\n\tjava.toast('\\n已恢复账号信息');\n}\n\n} catch(err) {\n\tjava.toast('清理面板未打开（可重试）');\n}\n}\n\nfunction downl() {\nlet dn = source.get('8xdn');\nif(dn!=1) {source.put('8xdn',1);java.toast('已支持下载');}\nelse {source.put('8xdn',0);java.toast('已优化加载');}\n\t}\nfunction shujia() {\nlet dn = source.get('8xsj');\nif(dn!=1) {source.put('8xsj',1);java.toast('🟢已启用同步网站书架');}\nelse {source.put('8xsj',0);java.toast('⚫已关闭同步网站书架');}\n\t}\nfunction shuming() {\nlet sm = source.get('8xsm');\nif(sm!=1) {source.put('8xsm',1);java.toast('🟢书名跟随更新');}\nelse {source.put('8xsm',0);java.toast('⚫书名保持初始');}\n\t}\nfunction jhfm() {\nlet jhf = source.get('8xjhf');\nif(jhf!=1) {source.put('8xjhf',1);java.toast('😈净化封面');}\nelse {source.put('8xjhf',0);java.toast('😍显示封面');}\n\t}\n\nfunction gitee() {\nlet option={};\noption[\"headers\"] = {\"User-Agent\": java.getWebViewUA()};\njava.startBrowser('https://gitee.com/lyc486/yuedu2/commits/main/书源/八叉/8x.json'+','+JSON.stringify(option),'日志');\n}\nfunction bfqfun2(x) {\nlet xx = source.get('bx'+x);\n//默认关闭\nif(xx!=1) {source.put('bx'+x,1);java.toast('🟢已开启 '+x);}\nelse {source.put('bx'+x,0);java.toast('⚫已关闭 '+x);}\n\t}\n\n// ===== 🚀一键选站：逐个测速发布页列出的站点，选最快的写入「网址」 =====\nfunction bxpick(){\n\tconst {java, source} = this;\n\tlet pool = ['https://8xsk.cc','https://18xsk.com','https://18xsk.cc','https://bachashuku.org','https://bachashuku.com'];\n\tlet ua = this.gethd()['User-Agent'] || 'Mozilla/5.0';\n\tjava.toast('正在测速 ' + pool.length + ' 个站点…');\n\tlet ok = [], bad = [];\n\tfor (let i = 0; i < pool.length; i++) {\n\t\tlet u = pool[i];\n\t\tlet t0 = new Date().getTime();\n\t\ttry {\n\t\t\tlet hd = {'User-Agent': ua, 'Cookie': 'age18_ok=1'};\n\t\t\tlet b = String(java.connect(u + ',' + JSON.stringify({headers: hd, timeout: 12000})).body());\n\t\t\tlet ms = new Date().getTime() - t0;\n\t\t\tif (b.length > 3000 && b.indexOf('年龄确认') < 0 && b.indexOf('八叉') >= 0) ok.push({u: u, ms: ms});\n\t\t\telse bad.push(u + ' (无效页 ' + b.length + 'B)');\n\t\t} catch (e) { bad.push(u + ' (不通)'); }\n\t}\n\tok.sort(function(a, b){ return a.ms - b.ms; });\n\tif (!ok.length) {\n\t\tjava.longToast('❌ 所有站点都不通\\n' + bad.join('\\n') + '\\n\\n请检查网络，或点「💍网址」从发布页找新域名');\n\t\treturn;\n\t}\n\tlet best = ok[0];\n\t// 写回登录信息（getsurl 读的就是这里）\n\tlet Info = source.getLoginInfoMap() || {};\n\tInfo['网址'] = best.u;\n\tsource.putLoginInfo(JSON.stringify(Info));\n\t// 顺带清掉旧缓存\n\ttry { java.put('8xzx',''); } catch(e) {}\n\tlet lines = ['✅ 已选：' + best.u + '  ' + best.ms + 'ms', '────────'];\n\tfor (let i = 0; i < ok.length; i++) lines.push('✅ ' + ok[i].u + '  ' + ok[i].ms + 'ms');\n\tfor (let j = 0; j < bad.length; j++) lines.push('❌ ' + bad[j]);\n\tlines.push('────────');\n\tlines.push('已写入「网址」，直接返回即可使用');\n\tjava.longToast(lines.join('\\n'));\n}\n\n// ===== 🔍 登录诊断：一步步检查，定位卡在哪 =====\nfunction lgdiag(){\n\tconst {java, source, cookie} = this;\n\tlet out = [];\n\tlet nn = getsurl();\n\tout.push('【1】线路：' + nn);\n\n\t// 2. 登录页可达性\n\tlet lgHtml = '';\n\ttry {\n\t\tlet opt = {}; opt[\"headers\"] = gethd();\n\t\tlgHtml = String(java.ajax(nn + '/login.php,' + JSON.stringify(opt)) || '');\n\t\tout.push('【2】登录页：' + (lgHtml ? (lgHtml.length + ' B') : '失败'));\n\t\tif (lgHtml && lgHtml.indexOf('frmlogin') >= 0) out.push('     ✅ 含登录表单');\n\t\telse if (lgHtml) out.push('     ⚠️ 无登录表单');\n\t} catch(e) { out.push('【2】登录页异常：' + String(e).substring(0,50)); }\n\n\t// 3. 验证码地址\n\tlet codeUrl = '';\n\ttry {\n\t\tlet wj = Packages.org.jsoup.Jsoup.parse(lgHtml);\n\t\tlet cands = [\n\t\t\tString(wj.select('#checkcode').attr('onfocus') || ''),\n\t\t\tString(wj.select('img[name=imgccode]').attr('onclick') || ''),\n\t\t\tString(wj.select('#t_imgccode').attr('onclick') || ''),\n\t\t\tString(wj.select('img[name~=img.*code]').attr('onclick') || '')\n\t\t];\n\t\tfor (let ci = 0; ci < cands.length; ci++) {\n\t\t\tlet oc = cands[ci];\n\t\t\tif (!oc) continue;\n\t\t\tlet mm = oc.match(/['\"]([^'\"]*checkcode\\.php[^'\"]*)['\"]/i);\n\t\t\tif (!mm) continue;\n\t\t\tcodeUrl = mm[1];\n\t\t\tif (codeUrl.indexOf('http') != 0) codeUrl = nn + '/' + codeUrl.replace(/^[/]+/,'');\n\t\t\tcodeUrl = codeUrl.replace(/[+].*$/, '');\n\t\t\tif (codeUrl) break;\n\t\t}\n\t\tif (!codeUrl) { let m2 = lgHtml.match(/checkcode\\.php\\?rand=[0-9]*/i); if (m2) codeUrl = nn + '/' + m2[0]; }\n\t\tout.push('【3】验证码地址：' + (codeUrl || '未找到'));\n\t} catch(e) { out.push('【3】解析失败：' + String(e).substring(0,50)); }\n\n\t// 4. 验证码图片可达性\n\tif (codeUrl) {\n\t\ttry {\n\t\t\tlet r = java.connect(codeUrl + ',{\"type\":\"hex\",\"headers\":{\"Cookie\":\"age18_ok=1\"}}');\n\t\t\tlet hex = String(r.body() || '');\n\t\t\tlet isPng = hex.substring(0,8) == '89504e47';\n\t\t\tlet isJpg = hex.substring(0,6) == 'ffd8ff';\n\t\t\tlet isGif = hex.substring(0,6) == '474946';\n\t\t\tout.push('【4】验证码图片：' + hex.length + ' hex | ' + (isPng?'PNG':isJpg?'JPEG':isGif?'GIF':'未知'));\n\t\t} catch(e) { out.push('【4】验证码图片失败：' + String(e).substring(0,50)); }\n\t}\n\n\t// 5. CookieJar 状态\n\tlet jar = '';\n\ttry { jar = String(cookie.getCookie(nn) || ''); } catch(e) {}\n\tout.push('【5】CookieJar：' + (jar ? (jar.length + ' B') : '空'));\n\tout.push('     age18_ok：' + (jar.indexOf('age18_ok') >= 0 ? '有' : '无'));\n\tout.push('     jieqiUserInfo：' + (jar.indexOf('jieqiUserInfo') >= 0 ? '有（已登录）' : '无（访客）'));\n\n\t// 6. 登录头\n\tlet hdr = ckget(source);\n\tout.push('【6】登录头：' + (hdr ? (hdr.length + ' B') : '空'));\n\tout.push('     含 jieqiUserInfo：' + (hdr.indexOf('jieqiUserInfo') >= 0 ? '是' : '否'));\n\n\t// 7. 表单值\n\tlet df = lgForm();\n\tout.push('【7】账号：' + (df.u || '(空)'));\n\tout.push('     密码：' + (df.p ? '已填' : '(空)'));\n\n\tjava.log(out.join('\\n'));\n\tjava.longToast(out.join('\\n'));\n}\n\n// ===== 🌐 快速切换站点（按钮直接用）=====\nfunction bxs(x){\n\tconst {java, source} = this;\n\tlet pool = ['https://8xsk.cc','https://18xsk.com','https://18xsk.cc','https://bachashuku.org','https://bachashuku.com'];\n\tlet u = pool[x];\n\tif (!u) { java.toast('无效站点序号'); return; }\n\tlet m = source.getLoginInfoMap() || {};\n\tm['网址'] = u;\n\tsource.putLoginInfo(JSON.stringify(m));\n\ttry { java.put('8xzx',''); } catch(e) {}\n\tjava.longToast('已切换到：' + u);\n}\n\n// ===== 🧹 清空缓存（不影响登录）=====\nfunction clrc(){\n\tconst {java, source, cache} = this;\n\tlet keys = ['8xid','8xzx','8xzxt','8xhmd','baxxq','bxvip','baxtime','baxtime2'];\n\tlet n = 0;\n\tfor (let i = 0; i < keys.length; i++) {\n\t\ttry { cache.deleteMemory(keys[i]); n++; } catch(e) {}\n\t\ttry { cache.delete(keys[i]); } catch(e) {}\n\t}\n\t// 清目录缓存（v_{key}_ 前缀）\n\ttry {\n\t\tlet k0 = source.getKey();\n\t\tlet ck = ckget(source);\n\t\tif (ck) source.putLoginHeader(JSON.stringify({Cookie: ck}));   // 保留登录\n\t} catch(e) {}\n\tjava.longToast('已清理 ' + n + ' 项缓存\\n（登录态与设置保留）');\n}\n\n// ===== 🔧 重置全部设置（保留账号密码）=====\nfunction reset(){\n\tconst {java, source} = this;\n\tlet keep = source.getLoginInfoMap() || {};\n\tlet acct = String(keep['账号'] || '');\n\tlet pwd = String(keep['密码'] || '');\n\tlet ks = ['8xdn','8xsj','8xsm','8xjhf','bx调试模式'];\n\t//★保留颜色配置\n\tlet c1 = String(keep['封面背景颜色'] || '');\n\tlet c2 = String(keep['封面字体颜色'] || '');\n\tfor (let i = 0; i < ks.length; i++) {\n\t\ttry { source.put(ks[i], '0'); } catch(e) {}\n\t}\n\t// 清登录头与 Cookie，但保留账号密码与网址\n\ttry { source.removeLoginHeader(); } catch(e) {}\n\ttry {\n\t\tlet site = getsurl();\n\t\tcookie.setCookie(site, 'age18_ok=1');\n\t} catch(e) {}\n\ttry {\n\t\tlet m = { '账号': acct, '密码': pwd, '网址': String(keep['网址'] || '') };\n\t\tif (c1) m['封面背景颜色'] = c1;\n\t\tif (c2) m['封面字体颜色'] = c2;\n\t\tsource.putLoginInfo(JSON.stringify(m));\n\t} catch(e) {}\n\tjava.longToast('已重置：\\n· 所有开关回到默认\\n· 已清除登录态\\n· 账号密码与网址保留');\n}\n", "respondTime": 180000, "ruleBookInfo": {"author": "<js>\nlet r='';\ntry {\n  let j = Packages.org.jsoup.Jsoup.parse(String(result));\n  //★作者链接有两种：authorpage.php?id= / authorarticle.php?author=\n  //★必须排除 newmessage.php（「作者认领本书」「成为本书编辑」）\n  let as = j.select('div.row_textl a[href*=authorpage], div.row_textl a[href*=authorarticle]');\n  for (let i=0;i<as.size();i++) {\n    let a = as.get(i);\n    let href = String(a.attr('href'));\n    if (href.indexOf('newmessage')>=0) continue;\n    let t = String(a.text()).replace(/^\\s+|\\s+$/g,'');\n    if (!t) continue;\n    if (t.indexOf('编辑')>=0 || t.indexOf('认领')>=0 || t.indexOf('>>>')>=0) continue;\n    r = t; break;\n  }\n} catch(err) {}\nif (!r) r = String(java.getString('class.divbox cf@span.1@a@text')||'');\nif (!r) {\n  try {\n    let g = String(java.getString('div.row_textl p.gray@text')||'');\n    let m = g.match(/([^\\s|]+)\\s*著/);\n    if (m) r = m[1];\n  } catch(e2) {}\n}\nr = String(r).replace(/^\\s+|\\s+$/g,'');\nr || String(book.author||'')\n</js>", "coverUrl": "#content img.0@src\n<js>\nlet jhf=source.get('8xjhf');\nresult=gethdi(result);\nif (jhf=='1') result=jinghuafm();\nresult\n</js>", "init": "<js>\n//重定向和导入书架处理\nlet i = String(book.bookUrl).includes('https:/');\nif (i) {\n\tbook.bookUrl = `data:;base64,${java.base64Encode(baseUrl.replace(/,{or.+/,''))},{\"type\":\"bax\"}`;\n\t//注意入库origin\n\t}\n\n//告诉目录是由详情来的\njava.put('sx1',1);\nlet nn=getsurl();\n\n//发书评功能\nlet bkbl = book.getVariable(\"custom\");\n//解书籍地址\nlet ml = String(book.bookUrl).replace(/.+,(.+),.+/,'$1');\nlet mlj = java.base64Decode(ml);\nlet [, bkid=''] = mlj.match(/book\\/(\\d+)/)||[];\n//↑获取书id\njava.put('bkid',bkid);\n\nif (bkbl=='🔒'||bkbl=='') {\n//带🔒或书籍变量为空会经过这里\n//处理加书架功能\nlet sj=java.get('sj');\nlet sj2=source.get('8xsj'); //启用同步的标识\nif (sj=='2'&&sj2=='1') {java.put('sj',3);tbshujia(nn,bkid);}\nelse if (sj=='1') {java.put('sj',2);}\n\n} else if (bkbl=='目录') {\n\t//清空最新章储存强制刷新目录\n\tjava.put('8xzx','');\n\t//清空输入的书籍变量\n\tbook.putCustomVariable('');\n} else {\nlet pfurl = nn+'/modules/article/rating.php';\nlet plurl = nn+'/modules/article/reviews.php';\nlet ck = ckget(source);\nlet cki = ck.match(/UserToken%3D([^%]+)/)||['',''];\ntk = cki[1];\n//↑获取链接和tk\n\nif (bkid != '' && tk != '') {\nlet tm = new Date().getTime();\nlet bkfs = (bkbl.match(/^(\\d|10)分$/) || ['','0'])[1];\nlet pfbody = `score=${bkfs}&id=${bkid}&ajax_request=${tm}`;\nlet plbody = `ptitle=&act=newpost&jieqi_token=${tk}&Submit=&pcontent=${bkbl}&aid=${bkid}&ajax_request=${tm}`;\n\nlet headers = gethd();\nheaders['Referer']=mlj;\nheaders[\"Cookie\"]=ck;\nlet url='',body='';\nif (bkfs != 0) {url=pfurl;body=pfbody;}\nelse {url=plurl;body=plbody;}\n//清空输入的书籍变量\nbook.putCustomVariable('');\nlet by = java.connect(url+','+JSON.stringify(\n    \t{\"method\": \"POST\",\n    \t\"header\":headers,\n    \t\"body\":body})\n    \t).body();\njava.longToast(\"\\n\"+java.htmlFormat(by));\n//随机延时0-1秒\nlet tim = Math.floor(Math.random()*1001);\nPackages.java.lang.Thread.sleep(tim);\ncache.deleteMemory('baxxq'+bkid);\n\t} else if (tk == '') {java.toast('未登录');}\n}\n\n//先发评论再访问刷新\nif (!i) {\n\t//跳转时，src为源码\n\tlet tt = java.hexDecodeToString(src);\n\t//不要直接访问tt\n\ttt=String(tt).replace(/http.{4}[A-z\\d\\.]+/,'');\nlet option={};\noption[\"headers\"]=gethd();\n\tconst startTime=new Date().getTime();\n\tresult = cache.getFromMemory('baxxq'+bkid) || java.ajax(nn+tt+','+JSON.stringify(option))+'';\n\tconst endTime=new Date().getTime();\n\tlet speed = (endTime - startTime)/1000;\n\tif (speed>39) {java.toast('\\n详情页访问延迟过长：'+speed.toFixed()+'秒');}\t\n}\n\tjava.setContent(result);\n\n//内容判断\n//★手机版：h4.mbs 内含 <span class=\"fr fss\">（作者认领/编辑链接）→ 必须用 ownText 排除\n//★PC 版：class.divbox cf 里 span.0/span.1\nlet name='';\ntry {\n\tlet jn = Packages.org.jsoup.Jsoup.parse(String(result));\n\tlet e1 = jn.select('h4.mbs').first();\n\tif (e1 != null) name = String(e1.ownText());\n\tif (!name) name = java.getString('class.divbox cf@span.0@text')+'';\n} catch(e) { name = java.getString('class.divbox cf@span.0@text')+''; }\nname = String(name).replace(/^《|》$/g,'').replace(/^\\s+|\\s+$/g,'');\n\nlet author='';\ntry {\n\tlet ja = Packages.org.jsoup.Jsoup.parse(String(result));\n\tlet as = ja.select('div.row_textl a[href*=authorpage], div.row_textl a[href*=authorarticle]');\n\tfor (let ai=0; ai<as.size(); ai++) {\n\t\tlet ae = as.get(ai);\n\t\tlet ah = String(ae.attr('href'));\n\t\tif (ah.indexOf('newmessage')>=0) continue;\n\t\tlet at = String(ae.text()).replace(/^\\s+|\\s+$/g,'');\n\t\tif (!at) continue;\n\t\tif (at.indexOf('编辑')>=0 || at.indexOf('认领')>=0 || at.indexOf('>>>')>=0) continue;\n\t\tauthor = at; break;\n\t}\n\tif (!author) author = java.getString('class.divbox cf@span.1@a@text')+'';\n} catch(e2) { author = java.getString('class.divbox cf@span.1@a@text')+''; }\nif (String(author)=='' || String(author)=='undefined') {\n\tlet g = gets(\".gray@text\");\n\t[,author] = (String(g).match(/([^\\s|]+)\\s*著/) || ['','']);\n}\nauthor = String(author).replace(/^\\s+|\\s+$/g,'');\nif (name) {\n\tcache.putMemory('baxxq'+bkid,result);\n\tbook.name=String(book.name)||name;\n\tbook.author=String(book.author)||author;\n//放入书名\nlet Info=source.getLoginInfoMap()||{};\nInfo['书名'] = book.name;\nsource.putLoginInfo(JSON.stringify(Info));\n//放入ID和书名。正式版该语法会报错\ncache.putMemory('8xid',{[bkid]: book.name});\n\n\tif (book.name!=name) {\n\t\t\tlet sm=source.get('8xsm'),sm1=java.get('sm1');\n\t\t\t//sm功能标记，sm1判断标记\n\t\t\tif (sm1=='') {\n\t\t\t//书名不同，仅记录\n\t\t\tjava.put('sm1',1);\n\t\t\t} else if (sm=='1') {\n\t\t\t\tbook.name=name;\n\t\t\t\tjava.toast(\"已自动更新书名\");\n\t\t\t} else if (sm1=='1') {\n\t\t\t\tjava.longToast(\"详情页获取的书名：\\n《\"+name+\"》\");\n\t\t\t\tjava.log(\"书名：\"+name);\n\t\t\t\tjava.put('sm1',2);\n\t\t\t}\n\t\t\t\n}\telse if (book.author!=author) {\n\t// book.author=author;\n\t//仅输出日志\njava.log(\"获取的作者不同，作者：\"+author);}\n\t\n\t//书名和作者正常由此过\n\t}\nelse {\n\t//书名加载失败\n\tgengxin();\n\tjava.toast(\"详情页加载失败，请刷新重试\");\n}\n\tresult\n</js>", "intro": "{{\n//书名过长时在简介显示\nlet length = 0;\nlet fuhao = ',.?!:;()[]\"';\nlet tt='&#10;';\nfor (char of String(book.name)) {\n\tif (fuhao.includes(char) ) length += 0.5;\n\telse length += 1;\n\t}\n//大于18个全角字符\nif (length > 18) tt+='📙书名：'+book.name;\n\nlet zx = java.get('8xzxt');\n\nlet rr=[];\nif (/http.{4}www/.test(getsurl())) {\nlet temp=java.getStringList('class.tabcontent@class.tabvalue.1@td[0:3,9,10]@text');\nrr=Object.values(temp);\n//处理rr\n[rr[0], rr[2]] = [rr[2], rr[0]];\nrr[0] = '🕰️最新：' + String(zx).replace(/^正文|^\\s+/,'') + String(rr[0]).replace('最后更新：',' ').replaceAll('-','/') + String(rr[1]).replace(/连载状态：(.+)/,' ($1)');\ndelete rr[1];\nrr[2] = String(rr[2]).replace(/作品分类：\\s*/,'🗂️分类：') + String(rr[3]).replace(/作品性质：(.+)/,' ($1)');\ndelete rr[3];\nrr[4] = String(rr[4]).replace(/总点击数：\\s*/,'🎯点击：') + String(rr[5]).replace(/本月点击：(.+)/,'　$1 (月)');\ndelete rr[5];\n} else {rr[0]='🕰️最新：' + String(zx).replace(/^正文|^\\s+/,'')+'\\n'+'🎯点击：'+(gets(\".gray@ownText\").match(/著 (\\d+)\\s*\\|/)||['',''])[1];}\n\n//评分\nlet pf=java.getString('.ratediv@text');\nlet r0 ='\\n' + rr.join('\\n') + '\\n' + String(pf).replace(/评分：\\s*/,'💡评分：');\n//简介\nlet r1=java.getString('.tabcontent .tabvalue:eq(0) div@html||#introa@textNodes');\nif (r1==\"\") {r1='';}\nelse {\n r1 = '\\n🗨️简介：\\n' + String(r1).replace(/[\\u3000\\u2003]{2}/g,'\\n').replace('「','“').replace('」','”').replace(/\\>\\s*内容简介/,'')\n\t}\n//评论\nlet r2=String(java.getString('#content>.c_row@html||.moretop+.ullist>li@html'));\nlet xi = book.getVariable(\"custom\")==\"🔒\";\nif (r2==''||xi) {r2='';}\nelse {\n\tif (/http.{4}www/.test(getsurl()))\n\tr2 = \"\\u200b\\n📝评论：\"+r2\n\t.replace(/<div class=\"c_subject\"[\\S\\s]+?div>|<span class=\"fr\"[\\S\\s]+?span>|点击：.+(?=回复)/g,' ')\n\t.replace(/回复：.+c_value\">0/g,'')\n\t.replace(/<p[>\\ ].+<\\/p>/g,'\\u200b');\n\telse r2 = \"\\u200b\\n📝评论：\"+r2\n\t.replace(/<li><a/g,'<li><p>\\u200b</p><a')\n\t.replace(/<\\/em><b>/g,'</em>　👨<b>');\n\t}\n\ttt+r0 + r1 + r2\n}}", "kind": "b:contains(标签：)~a@text||div.row_textl a[href*=tagarticle]@text\n<js>\nlet s=String(result);\n//手机版会是「#后宫 #下克上」，PC 版是「标签：#a #b」\nif (/^\\[.*\\]$/.test(s)) s=s.slice(1,-1);\ns=s.replace(/[\\\\#\\\\,]/g,'').replace(/^\\s+|\\s+$/g,'');\ns.split(/\\s+/);\n</js>", "lastChapter": "<js>\nlet zxe=gete(\".divbox h3 a||span:contains(最新：)+a||div.c_row.nw span.note~a\");\nlet zxh=String(zxe.attr(\"href\")||'').replaceAll(\"http.{4}[^\\\\\\\\/]+\",'');\nlet zx = java.get('8xzx');\nif (zx==zxh) java.put('ww',0);\nelse {java.put('8xzx',zxh);java.put('ww',1);}\njava.put(\"8xzxt\",zxe.text())\n</js>", "name": "<js>\nlet r='';\ntry {\n  let j = Packages.org.jsoup.Jsoup.parse(String(result));\n  let e = j.select('h4.mbs').first();\n  if (e != null) r = String(e.ownText());\n} catch(err) {}\nif (!r) r = String(java.getString('class.divbox cf@span.0@text')||'');\nr = String(r).replace(/^《|》$/g,'').replace(/^\\s+|\\s+$/g,'');\nr || String(book.name||'')\n</js>", "tocUrl": "li:matches(^点击阅读$|^目录$) a@href||ul.tabb a:matchesWholeOwnText(目录)@href\n<js>\nif(result.length>3)\n`data:;base64,${java.base64Encode(result)},{\"type\":\"ml\"}`;\nelse {\nlet ml = String(book.bookUrl).replace(/.+,(.+),.+/,'$1');\nlet mlj = java.base64Decode(ml);\n`data:;base64,${java.base64Encode(mlj.replace('.html','_1.html'))},{\"type\":\"ml\"}`;}\n</js>", "wordCount": "<js>\nlet r1=`{{@@.tabcontent .tabvalue.1@html##全文字数：(\\\\d+)##$1###}}`;\nlet r2=`{{@@.gray@ownText##(\\\\d{2,})字##$1###}}`;\nlet r3=`{{@@div.row_textl p.gray@text##(\\\\d{2,})字##$1###}}`;\nr1||r2||r3\n</js>"}, "ruleContent": {"content": "<js>\nconst startTime3=new Date().getTime();\nlet bin = book.durChapterIndex;\nlet cin = chapter.index;\nlet inn = cin - bin;\nlet dn = source.get('8xdn');\nlet sleep = Packages.java.lang.Thread.sleep;\n//java.log(chapter.title+'inn：'+inn);\nif ((inn==-4||inn==4)&&dn!=1) {java.longToast('\\n批量下载需要在书源登录界面点「下载功能」开启\\n（阅读预下载建议设为 2~3）');}\n\nlet nn=getsurl();\n\nlet tim = Math.floor(Math.random()*2001);\n//★正文解密函数（atob+escape，首次访问与购买后共用）\nfunction decContent(r){\n\tif (String(r).indexOf('atob') < 0) return r;\n\tlet b64 = String(r).match(/atob\\(\\s*[^A-Za-z0-9+/]{0,4}([A-Za-z0-9+/=]{100,})/);\n\tif (!b64) return '';\n\ttry {\n\t\tlet dec = String(java.base64Decode(b64[1]));\n\t\ttry { dec = decodeURIComponent(escape(dec)); } catch(e1) {}\n\t\tdec = dec.replace(/<br\\s*\\/?>/gi, '<br>');\n\t\treturn dec;\n\t} catch(e2) { java.log('正文解密失败：'+e2); return ''; }\n}\nlet ii = 1;\n//手动限制并发,下载时(0-2*30秒随机)\n\nfunction delayl(ll){\n\t//★下载模式（8xdn=1）直接放行：批量下载不应有任何排队等待\n\t//  旧版这里 5s全局锁 + 0~10s随机 + while(dn!=1) 死等 → 单章 40 秒\n\tif (dn==1) return;\n\tsleep(tim);\nlet dtm=Date.now()+(3000+tim)*10;\n\twhile (dn!=1) {\nPackages.java.util.concurrent.locks.LockSupport.parkNanos(this,30*1e6);\n\t\tlet innx = cin - book.durChapterIndex;\n\tif (innx==0) return;\n\telse if (innx==-1&&Date.now()<dtm) continue;\n\telse {ii=0;return;}\n\t\t}\n}\n\nlet bkid = java.get('bkid'); //★提前定义：节流与缓存键都要用\n//★节流策略：下载模式(8xdn=1)完全跳过；阅读模式保留预下载保护\n//  旧版把「下载」也当阅读预下载处理，导致每章等 1~7.5s 甚至直接返回空\nif (dn==1) {\n\t//批量下载：只做站点最低限度的礼貌间隔，不做长等待\n\tif (inn>0) sleep(300);\n} else switch(inn) {\n\tcase 0: break;\n\tcase 1: sleep(1000+tim); break;\n\tcase 2: sleep(4500+tim); break;\n\tcase 3: sleep(7500+tim); break;\n\tcase -1: delayl(-1); break;\n\tcase -2: delayl(-2); break;\n\tcase -3: delayl(-3); break;\n\tdefault: ii=0; break;\n}\n\n//延时结束\n\nif (inn==0||inn==1) {\n//放入书名和id\ncache.putMemory('8xid',{[bkid]: book.name});\nlet Info=source.getLoginInfoMap()||{};\nInfo['书名'] = book.name;\nsource.putLoginInfo(JSON.stringify(Info));\n// 本地阅读进度\nlet sjj=source.get('sj'+bkid)+'';\nif (java.get('sj')==3||sjj) {\tsource.put('sj'+bkid,book.author+','+book.durChapterTitle+','+book.durChapterIndex);}\n}\n\nlet tt = /^[0-9a-fA-F]+$/.test(String(result).trim()) ? java.hexDecodeToString(result) : String(result);\ntt=String(tt).replace(/https\\:\\/{2}[A-z\\d\\.]+/,'');\n//java.log('正文地址：'+tt);\nlet ml = String(book.tocUrl).replace(/.+,(.+),.+/,'$1');\nlet mlj = java.base64Decode(ml);\n\nlet [,cid]=tt.match(/(\\d+)\\.html/)||[,''];\n\nif (ii) {\n//↓第一次访问正文\ntry {\n\t\t//★阅读限速锁：下载模式(dn==1)完全跳过——批量下载不做排队/互斥\n\t\tlet baxtime = Number(cache.getFromMemory('baxtime'))||0;\n\t\tif (baxtime<Date.now()) baxtime=Date.now();\n\t\tbaxtime+=2000;\n\tlet dtm=Date.now()+(3000+tim)*10;\n\tcache.putMemory('baxtime',baxtime);\n\tif (dn!=1) {\n\tlet li=(Date.now()<baxtime||cache.getFromMemory('bxvip'+bkid))&&Date.now()<dtm;\n\twhile(li) {\n\t\tPackages.java.lang.Thread.sleep(1000);\n\t\tli=(Date.now()<baxtime||cache.getFromMemory('bxvip'+bkid))&&Date.now()<dtm&&(cin-book.durChapterIndex!=0);\nsource.get('bx调试模式')==1&&java.log(chapter.title+'🍊'+li+'🍊');}\n\tcache.putMemory('bxvip'+bkid,true);\n\t}\n\nlet option={};\noption[\"headers\"]=gethd();\nconst startTime=new Date().getTime();\n\nif (cid) {\n//\tif (bkid < 1000) n = 0;\n//\telse n = bkid.slice(0,-3);\n//\tresult = java.ajax('https://js.8xsk.org/'+n+'/'+bkid+'/'+cid+'.js'+','+JSON.stringify(option)).replaceAll(String.raw`^document.write\\('|'\\);$`,'');\n\t} else {\n\t[,cid]=tt.match(/cid=(\\d+)/)||[,''];\n\tlet ck=ckget(source);\n\tif (ck) option[\"headers\"][\"Cookie\"]=ck;}\n\tresult = java.ajax(nn+tt+','+JSON.stringify(option));\n\t//★手机版正文是 decodeURIComponent(escape(atob(\"...\"))) 加密，需源内解密\n\tif (String(result).indexOf('atob') >= 0) {\n\t\tlet b64 = String(result).match(/atob\\(\\s*[^A-Za-z0-9+/]{0,4}([A-Za-z0-9+/=]{100,})/);\n\t\tif (b64) {\n\t\t\ttry {\n\t\t\t\tlet dec = String(java.base64Decode(b64[1]));\n\t\t\t\t//escape/decodeURIComponent 等价：把 %XX 还原成 UTF-8\n\t\t\t\ttry { dec = decodeURIComponent(escape(dec)); } catch(e1) {}\n\t\t\t\tdec = dec.replace(/<br\\s*\\/?>/gi, '<br>');\n\t\t\t\tresult = dec;\n\t\t\t} catch(e2) { java.log('正文解密失败：'+e2); result = ''; }\n\t\t} else { result = ''; }\n\t} else {\n\t\tresult = java.getString('[id*=\"content\"]@html',result);\n\t}\n\t\nconst endTime=new Date().getTime();\nlet speed = (endTime - startTime)/1000;\nif (dn!=1&&speed>39) java.toast('\\n正文页访问延迟过长：'+speed.toFixed()+'秒');\n//复原手机版链接，干掉字数统计。重新刷新时不为这个链接，不会导致二次加载\n\n//拦截超时报错\n} catch (e) {if (/timeout/.test(e)) java.toast('正文超时'); else {inn==0&&java.toast('正文异常：'+e);}\njava.log('八叉正文出错：'+e);}\n// if ii 结束\n\t} else {result='';}\n//inn>1时为空，软件会自动重新获取\n//★手机版没有 .mt.mb/.tc.mb/.block.mt，补 button 与 #asummary 兜底\nlet rr = java.getString('class.mt mb@a@text||class.tc mb@a@text||class.block mt@button@text||button@text',result);\n//内容识别\nif (rr.includes(\"登录\")) {\n\tif (dn!=1) java.toast(\"💎请重新登录书源账号\");\n\tresult='';}\nelse if (rr.includes(\"充值\")||rr.includes(\"确定订阅\")||rr.includes(\"订阅本章节\")) {\nlet url = nn+'/modules/obook/buychapter.php';\nlet ck = ckget(source)+'';\nlet [,tk] = ck.match(/UserToken%3D([^%]+)/)||[,''];\nlet body = `buytype=0&act=buy&jieqi_token=${tk}&cid=${cid}&submit=`;\n\nlet option={};\noption[\"headers\"]=gethd();\noption[\"headers\"]['Referer']=tt;\noption[\"headers\"][\"Cookie\"]=ck;\noption[\"method\"]=\"POST\";\noption[\"body\"]=body;\nif (tk && nn && cid) {\n\ttry {\n\tsleep(2100-tim);\n\tlet pt = java.connect(url+','+JSON.stringify(option));\n  let lc = pt.url()+'';\n  if (lc.includes('/read/')||lc.includes('/obook/')) {\n  \tif(dn!=1)java.toast(\"已为你自动购买\");\n  \tresult = decContent(pt.body());}\n  \telse if (lc.includes('buychapter')) {\n  \t\tif(dn!=1)java.toast('购买失败\\n检测到未重定向');\n  \t\tlet pb = decContent(pt.body());\n  \t\tresult = pb || java.getString('[id*=\"content\"]@html',pt.body());}\n  \telse if(dn!=1)java.toast('购买异常');\n \t} catch (err) {if(dn!=1)java.longToast(\"💔VIP内容获取失败\"); result='';}\n} else if (!tk) {if(dn!=1)java.toast(\"💎书源未获取到登录信息\"); result='';} else if(dn!=1)java.longToast('nn或cid为空');\n} else {\n//无VIP登录\n}\ncache.deleteMemory('bxvip'+bkid);//不能put(false，java和js转化问题；读模式下若无锁也安全删除\n\nconst endTime3=new Date().getTime();\nsource.get('bx调试模式')==1&&java.toast(nn+tt+\"时间\"+(endTime3-startTime3)/1000);\n//检查\nif ([19,339].includes(cin)&&Math.abs(inn)<4&&dn!=1) gengxin();\nresult\n</js>", "replaceRegex": "##(?:\\s|^)本站发布页.{0,9}8xsk.org|8xsk.org(?=\\s|$)|八叉书库|八叉~书库|八叉书[,~]库|(?:833330|8xsk|八叉)([^\\.])(?:xyz|yxz|org|书库)|八~叉|书~库##$1"}, "ruleExplore": {"author": "<js>\nlet r='';\ntry {\n  if (baseUrl.includes('search.php?')) {\n    r = String(java.getString(String(source.ruleSearch.author))||'');\n  } else if (baseUrl.includes('/bookcase.php')) {\n    java.put('sj',3);\n    let sj = String(source.get('sj'+String(java.get('bkid')))||'');\n    r = sj.split(',')[0]||'';\n  } else {\n    let self = (typeof result.select=='function') ? result : null;\n    let p = self ? self.select('p.gray').first() : null;\n    if (p != null) {\n      let h = String(p.html());\n      let seg = h.split(/<br[ ]*[/]?>/i);\n      let l0 = String(seg[0]||'').replace(/<[^>]+>/g,'').replace(/[ ]+/g,' ').trim();\n      let parts = l0.split('|');\n      r = String(parts[1]||'').trim();\n    }\n    if (!r) r = String(java.getString('td.1@a.-1@span@ownText')||'').replace(/^[/]/,'');\n  }\n  if (String(r) == '[email protected]') {\n    let hex = String(java.getString('.__cf_email__.0@data-cfemail')||'');\n    r = decodeEmail(hex,0);\n  }\n} catch(e) {}\nr\n</js>", "bookList": "<js>\nif (baseUrl.startsWith('http://localhost') ) {\n\t\tresult = [];\n}\nelse if (baseUrl.includes('search.php?') ) {\nlet r1 = java.getString('#content .blockcontent@text');\nif (r1.includes(\"错误原因\")) {java.longToast(r1);result = [];}\nelse {result = java.getElement('#jieqi_page_contents>div');}\n\t}\nelse if (baseUrl.includes('/book/') ){\njava.toast('暂不支持重定向结果');\nresult=[];\n\t}\nelse if (baseUrl.includes('/bookcase.php') ) {\n\t//我的书架\n\t\tlet ts= java.getString('table@caption@ownText||#jieqi_page_contents@ownText');\n\tts=String(ts).replace(/.*(可收藏 .+已收藏[^，。]+).*$/,'\\n$1');\n\tsource.get('sjts')!=ts&&ts&&java.toast('\\n'+ts);\n\tsource.put('sjts',ts);\n\tPackages.java.lang.Thread.sleep(100);\n\tif (/http.{4}www/.test(this.getsurl()))\n\tresult = java.getElement('table tr:has(a)');\n\telse result = java.getElements('#content div[class=\"c_row cf\"]');\n\t}\nelse {\nresult = java.getElements('#jieqi_page_contents>tr||#content div[class=\"c_row cf\"]');\n}\nresult\n</js>", "bookUrl": "@js:book.bookUrl", "coverUrl": "<js>\nlet jhf=source.get('8xjhf'), img;\nif (jhf=='1') img=jinghuafm();\nelse {\n//正常封面\nif (/articlelist|sort\\//.test(baseUrl)) {\n\t//含有封面，注意“sort”\n\timg = java.getString('img@src');\n\t}\nelse if (baseUrl.includes('search.php?') ) {\n\t//搜索\n\timg = java.getString(String(source.ruleSearch.coverUrl));\n\t}\nelse{\n\t//拼接封面\n\tlet id = java.get('bkid')+'', n;\n  if (id < 1000) n = 0;\n  else n = id.slice(0,-3);\nimg = `https://image.8xsk.org/${n}/${id}/${id}s.jpg`;\n}\n\n}\ngethdi(img)\n</js>", "intro": "<js>\nif (baseUrl.includes('search.php?'))\nresult=java.getString(source.ruleSearch.intro+[])+'';\nelse if (/http.{4}www/.test(this.getsurl()))\nresult = gets('td.3@text||.c_description@text');\nelse\nresult = gets('td.2@text')||gets(\".gray@textNodes\").match(/\\n(.+)/)[1];\nif (baseUrl.includes(\"top/words\")) {'⠀\\n字数：'+(result/10000).toFixed(2)+'万'}\nelse if (baseUrl.includes(\"top/goodnum\")) {'⠀\\n收藏数：'+result}\n//新书榜\nelse if (baseUrl.includes(\"top/newhot\")) {\n\tresult = result>9999 ? \t(result/10000).toFixed(2)+'万' : result;\n\t'⠀\\n点击数：'+result}\nelse if (baseUrl.includes(\"top/signtime\")) {\n  let t = parseInt(result)*1000;\n  let time = java.timeFormatUTC(t,\"⠀\\n签约时间：yy/MM/dd HH:mm:ss\",8*60*60*1000);\n  time}\nelse if (baseUrl.includes(\"top/lastupdate\")) {'⠀\\n字数：'+(result/10000).toFixed(2)+'万'}\nelse if (baseUrl.includes(\"top/postdate\")) {'⠀\\n入库时间：'+result}\nelse if (baseUrl.includes(\"top/allvisit\")) {\n\tresult = result>999 ? \t(result/10000).toFixed(2)+'万' : result;\n\t'⠀\\n总点击：'+result}\nelse if (baseUrl.includes(\"top/monthvisit\")) {\n\tresult = result>999 ? \t(result/10000).toFixed(2)+'万' : result;\n\t'⠀\\n月点击：'+result}\nelse if (baseUrl.includes(\"top/weekvisit\")) {\n\tresult = result>9999 ? \t(result/10000).toFixed(2)+'万' : result;\n\t'⠀\\n周点击：'+result}\nelse if (baseUrl.includes(\"top/allvote\")) {'⠀\\n总推荐：'+result}\nelse if (baseUrl.includes(\"top/monthvote\")) {'⠀\\n月推荐：'+result}\nelse if (baseUrl.includes(\"top/weekvote\")) {'⠀\\n周推荐：'+result}\nelse if (/articlelist|sort\\/|search\\.php/.test(baseUrl)) {\n//含简介(搜索会经此)\nresult.replace('「','“').replace('」','”').replace(/\\s+/g,' ')}\nelse if (baseUrl.includes('/bookcase.php') ) {\n\tlet sj=source.get('sj'+java.get('bkid'));\n\tsj=sj.split(',')[1]||'';\n\t(sj==''||sj=='null')?'':'\\u200b\\n当前阅读进度：'+sj;\n\t}\nelse {''}\n</js>", "kind": "<js>\nlet out=[];\ntry {\n  if (baseUrl.includes('search.php?')) {\n    out = java.getStringList(String(source.ruleSearch.kind)) || [];\n  } else if (baseUrl.includes('/bookcase.php')) {\n    out = java.getStringList('td.4@text') || [];\n  } else {\n    //★手机版：卡片 p.gray 第一行是「分类 | 作者」\n    let j = Packages.org.jsoup.Jsoup.parse(String(result));\n    let cards = j.select('#content div.c_row.cf');\n    let idx = -1;\n    //找出当前 result 是第几张卡：result 是单个 Element 时直接用它\n    let self = (typeof result.select=='function') ? result : null;\n    let p = self ? self.select('p.gray').first() : null;\n    if (p == null) p = j.select('p.gray').first();\n    if (p != null) {\n      let h = String(p.html());\n      let seg = h.split(/<br[ ]*[/]?>/i);\n      let l0 = String(seg[0]||'').replace(/<[^>]+>/g,'').replace(/[ ]+/g,' ').trim();\n      let parts = l0.split('|');\n      let k = String(parts[0]||'').trim();\n      if (k) out = [k];\n    }\n    if (out.length == 0) out = java.getStringList('td[4,5]@text||span:contains(更新：)+span@text') || [];\n  }\n} catch(e) {}\nout\n</js>", "lastChapter": "<js>\nif (baseUrl.includes('search.php?') ) {\tjava.getString(String(source.ruleSearch.lastChapter));}\nelse if (baseUrl.includes('/bookcase.php') ) {\ngets('td.2@a.-1@text||h4+.gray:containsOwn(最新：)>a@text');}\nelse if (/http.{4}www/.test(this.getsurl())){\ngets('td.1@a.-1@text||class.c_subject@a.-1@text');}\nelse {}\n</js>", "name": "<js>\nlet rs='';\nif (baseUrl.includes('search.php?') ) {\nresult=String(java.getString('.c_subject@text||h4@text')).replace(/\\\"/g,'');\n//获取id目的\nrs = java.getString('a.0@href');\n}\nelse if (baseUrl.includes('/bookcase.php') ) {\n\tresult =  java.getString('td.1@a.-1@text||h4@a@text');\n\trs = java.getString('td.1@a.-1@href||h4@a@href');\n\t//我的书架需要转化链接\n\trs=getsurl()+'/book/'+rs.match(/aid=(\\d+)/)[1]+'.html';\n}\nelse {\n\t\tresult =  gets('td.0@a.-1@text||class.c_subject@a.1@text||h4@text')||gets('td.1@a.-1@ownText');\n\trs = java.getString('td.0@a.-1@href||class.c_subject@a.1@href||class.db cf@href||td.1@a.-1@href');\n}\n\n//获取id，黑名单时书名为空\nlet id = (rs.match(/book\\/(\\d+)/)||['',''])[1];\njava.put('bkid',id);\nlet i = hmdjib(id,result);\nif (i) result='';\nelse book.bookUrl=`data:;base64,${java.base64Encode(rs)},{\"type\":\"\"}`;\nresult\n</js>", "wordCount": "<js>\nif (/articlelist|sort\\//.test(baseUrl)) {\n  java.getString('span:contains(字数：)+span@text');\n}\nelse if (/articlefilter/.test(baseUrl)) {\n\tif (/http.{4}www/.test(this.getsurl()))\n\tjava.getString('td.3@text');\n\telse java.getString('td.2@text');\n}\nelse if (baseUrl.includes('search.php?') ) {\tjava.getString(String(source.ruleSearch.wordCount));\n\t}\n</js>"}, "ruleSearch": {"author": "<js>\nlet r='';\ntry {\n  let self = (typeof result.select=='function') ? result : null;\n  let p = self ? self.select('p.gray').first() : null;\n  if (p != null) {\n    let h = String(p.html());\n    let seg = h.split(/<br[ ]*[/]?>/i);\n    let l0 = String(seg[0]||'').replace(/<[^>]+>/g,'').replace(/[ ]+/g,' ').trim();\n    r = String(l0.split('|')[0]||'').trim();\n  }\n  if (!r) r = String(java.getString('span:contains(作者：)+span@text')||'');\n} catch(e) {}\nr\n</js>", "bookList": "<js>\nlet r1 = java.getString('#content .blockcontent@text');\nif (r1.includes(\"错误原因\")) {java.longToast(r1);result=[];}\nelse {\n\tresult = java.getElement('#jieqi_page_contents>div');\n}\nresult\n</js>", "bookUrl": "@js:book.bookUrl", "checkKeyWord": "https://8xbook.org/book/22531.html", "coverUrl": "img.0@src\n<js>\nlet jhf=source.get('8xjhf');\nresult=gethdi(result);\nif (jhf=='1') result=jinghuafm();\nresult\n</js>", "intro": "<js>\nlet r='';\ntry {\n  let self = (typeof result.select=='function') ? result : null;\n  let p = self ? self.select('p.gray').first() : null;\n  if (p != null) {\n    let h = String(p.html());\n    let seg = h.split(/<br[ ]*[/]?>/i);\n    if (seg.length > 1) {\n      r = String(seg.slice(1).join(' ')).replace(/<[^>]+>/g,'').replace(/\\s+/g,' ').trim();\n    }\n  }\n  if (!r) r = String(java.getString('.c_description@text')||'');\n  r = String(r).replace('「','“').replace('」','”');\n} catch(e) {}\nr\n</js>", "kind": "<js>\nlet out=[];\ntry {\n  let self = (typeof result.select=='function') ? result : null;\n  let p = self ? self.select('p.gray').first() : null;\n  let k = '';\n  if (p != null) {\n    let h = String(p.html());\n    let seg = h.split(/<br[ ]*[/]?>/i);\n    let l0 = String(seg[0]||'').replace(/<[^>]+>/g,'').replace(/[ ]+/g,' ').trim();\n    let parts = l0.split('|');\n    k = String(parts[1]||'').trim();\n  }\n  if (!k) k = String(java.getString('span:contains(关键字：)+span@text')||'');\n  k = k.replace(/[\\[\\]#,]/g,'').replace(/^\\s+|\\s+$/g,'');\n  if (k) out = k.split(/\\s+/);\n} catch(e) {}\nout\n</js>", "lastChapter": "span:contains(最新章节：)+span@text", "name": ".c_subject@text||h4@text\n<js>\nlet rs=java.getString('a.0@href');\n//获取id，黑名单时书名为空\nlet id = (rs.match(/book\\/(\\d+)/)||['',''])[1];\nlet i = hmdjib(id,result);\nif (i) result='';\nelse book.bookUrl=`data:;base64,${java.base64Encode(rs)},{\"type\":\"\"}`;\nresult\n</js>", "wordCount": "span:contains(字数：)+span@text"}, "ruleToc": {"chapterList": "<js>\nconst startTime3=new Date().getTime();\nconst dyy=baseUrl.endsWith('\"ml\"}');\nlet tim0 = Math.floor(Math.random()*51);\nPackages.java.lang.Thread.sleep(tim0);\nlet nn=getsurl();\nlet sj=java.get('sj');\nif (sj=='') java.put('sj',1); //书架标识\nlet ww = java.get('ww'),\nsx1 = java.get('sx1'); //ww是否有新章，sx刷新标识从目录来(已在书架才会触发)\njava.put('sx1',0); //还原详情到目录标识\nlet sj2=source.get('8xsj'); //启用同步的标识\nlet bkid=java.get('bkid');\nlet tt = java.hexDecodeToString(result);\ntt=String(tt).replace(/https\\:\\/{2}[A-z\\d\\.]+/,'');\nif (sj!='3'&&sx1!='1'&&sj2=='1'&&bkid!=''&&dyy) {tbshujia(nn,bkid)&&java.put('sj',3);}\n//不为3未加书架，不为1不过详情，为1开启功能，且参数不为空\nlet sjj=source.get('sj'+bkid)+'';\nif (sjj&&book.durChapterIndex==0) {\n\t//反向同步进度\n\tlet num=sjj.split(',')[2];\n\tnum>0&&(book.durChapterIndex=num);}\nelse if (java.get('sj')==3&&!sjj) {\n\t//标记进源储存\nsource.put('sj'+bkid,book.author+','+book.durChapterTitle+','+book.durChapterIndex);}\n\nfunction mlurl(){\n\tlet tim=(Math.random()*1001|0)+(dyy?500:0);\n\tPackages.java.lang.Thread.sleep(tim);\nlet option={};\noption[\"headers\"]=gethd();\n\tconst startTime=new Date().getTime();\n\tresult = java.ajax(nn+tt+','+JSON.stringify(option))+'';\n\tconst endTime=new Date().getTime();\n\tlet speed = (endTime - startTime)/1000;\n\tspeed>39&&java.toast(book.name+'\\n目录页访问延迟过长：'+speed.toFixed()+'秒');\n\tif (/^java\\.net|^error/.test(result))\n\tjava.toast(book.name+'目录链接访问出错'+result),java.log('目录访问出错'+result);\n\telse {\n\t\tresult=java.getString('.main@html',result)+'';\n\t\tlet tim1 = Math.floor(Math.random()*13);\n\t\tlet tim11 = Math.floor(Math.random()*5);\n\t\tif (result.length<1339)\n\t\tjava.toast(book.name+'目录内容出错'),java.log('目录内容出错：'+result);\n\t\telse if (result.includes(zx)||zx=='')\n\t\tcache.put(`v_${source.getKey()}_${nn+tt}`,result,60*(30+tim11)*(1+tim1));\n\t\telse\n\t\tcache.put(`v_${source.getKey()}_${nn+tt}`,result,3600*(20+tim11)*(10+tim1));}\n}\nfunction delay(dyt){\n\t\t let baxtime = cache.getFromMemory('baxtime');\n\t if (baxtime<Date.now()) baxtime=Date.now();\n\t baxtime+=dyt;\n\tcache.putMemory('baxtime',baxtime);\n\twhile(Date.now()<baxtime) {\n\tPackages.java.lang.Thread.sleep(1000);}\n\t}\n\nresult=cache.get(`v_${source.getKey()}_${nn+tt}`)+'';\nlet zx='';\nif (result.length>399) {\n\tif (ww==1) {\n\tlet wwz=java.getString('.pages a:contains(下一页)@href',result)+'';\n\tif (wwz.length<3) {\n\tdelay(3000);\n\tmlurl();\n\tjava.put('ww',0);} }\n\n} else {\nlet xqy = cache.getFromMemory('baxxq'+bkid);\nif (!xqy) {\ndelay(3000);\nlet option={};\noption[\"headers\"]=gethd();\nlet xq = String(book.bookUrl).replace(/.+,(.+),.+/,'$1');\nxq = java.base64Decode(xq);\nxq=String(xq).replace(/http.{4}[A-z\\d\\.]+/,'');\n\tconst startTime2=new Date().getTime();\nxqy=java.ajax(nn+xq+','+JSON.stringify(option))+'';\n\tconst endTime2=new Date().getTime();\n\tlet speed2 = (endTime2 - startTime2)/1000;\n\tif (speed2>39) {java.toast(book.name+'\\n详情页访问延迟过长：'+speed2.toFixed()+'秒');}\t\n}\nif (!/^java\\.net|^error/.test(xqy))\nzx=gete(\".divbox h3 a||span:contains(最新：)+a\",xqy).attr(\"href\").replaceAll(\"http.{4}[^\\\\/]+\",'')+''||java.get('8xzx');\n\nif (sx1!='1') {\n\t//从目录\n\tdelay(3000);\n\t}\nmlurl();\n}\njava.setContent(result);\nresult=java.getElement('.index dd, .index dt');\nresult=Array.from(result).map(x=>{\n\tlet a=x.select(\"a,dt\").first();\n\tlet u=java.base64Encode(a.attr(\"href\").replaceAll('^http.{4}[^\\\\/]+',''));\n\treturn {\n\t\"n\":(a.ownText()+'').replace(/\\([01]\\d-[0123]\\d\\)$/,''),\n\t\"u\":`data:;base64,${u},{\"type\":\"zw\"}`,\n\t\"i\":(a.attr(\"title\")+'').replace(/\\d{1,2}\\:\\d{1,2}更新，共(\\d+字).*/,' $1')+(x.select(\"em\")+''?\" 💎\":\"\"),\n\t\"v\":x.select(\"dt\")};\n});\nconst endTime3=new Date().getTime();\nsource.get('bx调试模式')==1&&java.toast(nn+tt+\"时间\"+(endTime3-startTime3)/1000);\nresult\n</js>", "chapterName": "n", "chapterUrl": "u", "nextTocUrl": ".pages a:matchesWholeOwnText(下一页|>)@href\n<js>\nif (result[0]&&result[0].length()>9) `data:;base64,${java.base64Encode(result[0])},{\"type\":\"page\"}`;\nelse [];\n</js>", "updateTime": "i"}, "searchUrl": "<js>\nlet nn = getsurl();\nlet url = `${nn}/modules/article/search.php`;\nif (key.startsWith('书名：'))\nurl += `?searchkey=${key.substr(3)}&searchtype=articlename&page=${page}`;\nelse if (key.startsWith('作者：'))\nurl += `?searchkey=${key.substr(3)}&searchtype=author&page=${page}`;\nelse if (key.startsWith('标签：'))\nurl += `?searchkey=${key.substr(3)}&searchtype=keywords&page=${page}`;\nelse\nurl +=\t`?searchkey=${key}&searchtype=all&page=${page}`;\nlet option={};\noption[\"headers\"]=gethd();\nurl+','+JSON.stringify(option);\n</js>", "variableComment": "\n♦书籍变量：\n　 ①填写  🔒 并刷新，关闭本书评论显示\n　 ②填写“目录”并刷新，强制刷新目录\n　 ③填写分数并刷新，使用分数进行评分\n　 ④填写其它并刷新，内容作为评论发送\n分数格式示意“1分”“2分”…“10分”\n\n㊟默认详情页检测到有更新内容时才会刷新目录\n\n！注意区分源变量和书籍变量\n", "weight": 0},{"bookSourceComment": "全网免费M3U8影视/动漫资源，来源于互联网第三方网站，视频中可能包含不良水印广告！请勿相信。\n已集成去广告AI算法，自动去除插入的广告片段，水印广告的话，没办法╮（╯＿╰）╭，只能支持正版了。\n无发现页，想看什么，自己搜索。\n目前有7个（1～7）可供选择的来源，设置源变量为对应数字时可以切换来源，不填时，默认为3。\nApp版本过低的，建议用订阅源版，功能更丰富。", "bookSourceGroup": "🎬影视", "bookSourceName": "全网高清影视（聚合版）", "bookSourceType": 4, "bookSourceUrl": "api.w-e.vip", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "----------------长按搜索------------------::", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 12) AppleWebKit/537.36 Chrome/120.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": 1792468045208, "respondTime": 180000, "ruleBookInfo": {"author": "$.data.director", "coverUrl": "$.data.pic", "init": "@js:var r=typeof result==='string'?JSON.parse(result):result;var t=(r.data&&r.data.update_time)?r.data.update_time:'';java.put('vt_'+book.bookUrl,t);JSON.stringify(r)", "intro": "$.data.intro", "kind": "$.data.type", "lastChapter": "$.data.remarks", "name": "$.data.name"}, "ruleContent": {"content": "{{chapter.url}}"}, "ruleExplore": {}, "ruleSearch": {"author": "$.director", "bookList": "$.data.list[*]", "bookUrl": "https://api.w-e.vip/api/m3u8?source={{java.get('sid')}}&msg={{java.encodeURI(java.get('sk'))}}&n={{$.n}}", "coverUrl": "$.pic", "intro": "$.content", "kind": "$.type", "lastChapter": "$.remarks", "name": "$.name"}, "ruleToc": {"chapterList": "@js:\nvar r = typeof result === 'string' ? JSON.parse(result) : result;\nvar eps = (r.data && r.data.episodes) ? r.data.episodes : [];\nvar json = [];\nvar n = eps.length;\nvar vt = java.get('vt_' + book.bookUrl) || '';\n\nfunction fmtTime(s) {\n    if (!s) return '';\n    var d = new Date(String(s).replace(/-/g, '/'));\n    if (isNaN(d.getTime())) return '';\n    var diff = new Date() - d;\n    if (diff < 0) diff = 0;\n    if (diff > 86400000) {\n        var y = d.getFullYear(),\n            m = ('0' + (d.getMonth() + 1)).slice(-2),\n            dd = ('0' + d.getDate()).slice(-2);\n        return y + '-' + m + '-' + dd\n    }\n    var mi = Math.floor(diff / 60000);\n    if (mi < 1) return '刚刚';\n    if (mi < 60) return mi + '分钟前';\n    return Math.floor(mi / 60) + '小时前'\n}\nvar ts = fmtTime(vt);\nfor (var i = 0; i < n; i++) {\n    var e = eps[i];\n    var title = e.title || '';\n    if (n > 1 && i === n - 1 && ts) {\n        title += ' [' + ts + ']'\n    }\n    var playUrl = 'https://api.w-e.vip/play.m3u8?url=' + java.encodeURI(String(e.url));\n    json.push(JSON.stringify({\n        name: title,\n        url: playUrl\n    }))\n}\njson", "chapterName": "$.name", "chapterUrl": "$.url"}, "searchUrl": "@js:\nv=String(source.getVariable())\nx=(v.match(/^\\d+$/) && parseInt(v)<'7') ? parseInt(v) : 3\njava.toast('正在搜索：'+key+'\\n当前来源：'+x)\njava.put('sid', x)\njava.put('sk', key); 'https://api.w-e.vip/api/m3u8?source='+x+'&msg=' + java.encodeURI(key)", "weight": 0},{"bookSourceComment": "", "bookSourceGroup": "自动生成", "bookSourceName": "书海阁", "bookSourceType": 0, "bookSourceUrl": "https://book.washai.net", "bookUrlPattern": "", "customOrder": 0, "enabled": true, "enabledExplore": false, "exploreUrl": "", "header": "", "lastUpdateTime": "1792344377979", "loginUrl": "", "ruleBookInfo": {"author": "@css:a#bookAuthor@text", "coverUrl": "@css:img#bookCoverImg@src", "intro": "@css:p#bookDesc@text", "kind": "@css:a#bookCatBadge@text", "lastChapter": "@css:a#lastIndexLink@text", "name": "@css:h1#bookName@text", "tocUrl": "@css:a#allIndexLink@href", "wordCount": "@css:em#bookWordCount@text"}, "ruleContent": {"content": "@css:.readChapterAppendBody>p@text", "nextContentUrl": "", "sourceRegex": "", "webJs": ""}, "ruleExplore": [], "ruleSearch": {"author": "@css:p.classBookAuthor>a@text", "bookList": "@css:#bookList>article", "bookUrl": "@css:h3.classBookTitle>a@href", "coverUrl": "@css:span.classBookCover img@src", "intro": "@css:p.classBookDesc@text", "kind": "@css:a.classCoverCat@text", "lastChapter": "@css:p.classBookChapter>a@text", "name": "@css:h3.classBookTitle>a@text", "wordCount": "@css:p.classBookMeta@text##^[^·]*·\\s*([0-9.]+万字).*##$1###"}, "ruleToc": {"chapterList": "@css:#bookIndexList>li[data-index-id]", "chapterName": "@css:a@ownText", "chapterUrl": "@css:a@href", "isVip": "", "nextTocUrl": "//*[@id=\"indexPager\"]//a[contains(text(),\"下一页\")]/@href", "updateTime": ""}, "searchUrl": "/book/bookclass.html?k={{key}}&page={{page}}", "weight": 0},{"bookSourceComment": "// 159txt 多线路书源：m.159txt.com / m.34kanshu.com / m.43kanshu.com\n// ★ 发现页顶部「域名」下拉切换线路（rrssk 聚合模式），切换后自动清发现缓存\n// 搜索走 sososhu.com 网关：需登录(每日10次)，登录界面可登录/检查登录态/查剩余额度/签到\n// 目录修复：站点每5章会有1章链接id重复前一条，jsLib 用 gap/2 算法自动修正(1658章实测99.7%)\n// UA 必须是移动端，桌面UA会被WAF拦截\n// v20: loginUi select action 改 result[name]（loginUi 上下文 bindings 无 infoMap，用 infoMap 会直接抛错=登录界面切线路完全无反应）；v19: exploreUrl 改纯文本JSON+{{}}模板(域名动态求值，彻底绕开 kinds 缓存)；v18: T9_setvar 改走 java.putVariable（ExploreAdapter.evalButtonClick 不注入 source 全局，原写法静默失效=切换无效的真根因）；v17: 入口URL带 host 指纹；切域名后若入口未变，退出发现页再进（App 的 ExploreAdapter.sourceKinds 进程级缓存规则侧清不到）", "bookSourceGroup": "AI", "bookSourceName": "159txt小说(多线路)", "bookSourceType": 0, "bookSourceUrl": "159txt小说", "bookUrlPattern": "^https?://(?:m[.])?(?:159txt|34kanshu|43kanshu)[.]com/\\d+(/\\d+)*/?", "customButton": false, "customOrder": 8, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>\n(function(){\n  var H = T9_HOST.call(this);\n  var P = T9_base();\n  var res = [];\n  res.push({ title: '域名', url: '', type: 'select',\n             chars: T9_HOSTS, default: H, viewName: \"'域名'\",\n             action: \"var _v=infoMap['域名'];if(!_v||_v=='null')_v='m.159txt.com';T9_SET('server', _v);java.refreshExplore();T9_T(java,'已切到: '+_v)\",\n             style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } });\n  res.push({ title: '当前网址', url: '', type: 'button',\n             viewName: \"'线路: ' + (function(){try{return T9_HOST.call(this);}catch(e){return 'm.159txt.com';}})()\",\n             action: \"java.toast('当前网址: '+T9_base())\",\n             style: { layout_flexGrow: 1, layout_flexBasisPercent: 1, layout_justifySelf: 'flex_start' } });\n  for (var i = 0; i < T9_CATS.length; i++)\n    res.push({ title: T9_CATS[i][0], url: P + '/fenlei/' + T9_CATS[i][1] + '/{{page}}/', style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.32 } });\n  for (var i = 0; i < T9_QBC.length; i++)\n    res.push({ title: T9_QBC[i][0], url: P + '/quanben/fenlei/' + T9_QBC[i][1] + '/{{page}}/', style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.32 } });\n  for (var i = 0; i < T9_RANKS.length; i++)\n    res.push({ title: T9_RANKS[i][0], url: P + '/rank/' + T9_RANKS[i][1] + '/', style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.32 } });\n  return JSON.stringify(res);\n})()\n</js>", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36\", \"Referer\": \"https://m.159txt.com/\"}", "jsLib": "var T9_UA = \"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36\";\nvar T9_HOSTS = [\"m.159txt.com\", \"m.34kanshu.com\", \"m.43kanshu.com\"];\nvar T9_DEFHOST = \"m.159txt.com\";\nvar T9_SOSO = \"https://www.sososhu.com/\";\nvar T9_CATS = [[\"玄幻\",1],[\"奇幻\",2],[\"武侠\",3],[\"仙侠\",4],[\"都市\",5],[\"军事\",6],[\"历史\",7],[\"游戏\",8],[\"竞技\",9],[\"科幻\",10],[\"悬疑\",11],[\"灵异\",12],[\"其他\",13],[\"古代言情\",14],[\"仙侠奇缘\",15],[\"现代言情\",16],[\"浪漫青春\",17],[\"玄幻言情\",18],[\"悬疑灵异\",19],[\"科幻空间\",20],[\"游戏竞技\",21],[\"BL文\",22],[\"GL文\",23],[\"二次元\",24]];\nvar T9_QBC = [[\"完本·玄幻\",1],[\"完本·都市\",5],[\"完本·古代言情\",14]];\nvar T9_RANKS = [[\"总榜\",\"allvisit\"],[\"月榜\",\"monthvisit\"],[\"收藏榜\",\"goodnum\"],[\"周榜\",\"weekvisit\"]];\nfunction T9_T(jv, s) { try { jv.toast(String(s)); return 1; } catch (e) {} try { jv.longToast(String(s)); return 1; } catch (e2) {} return 0; }\nfunction T9_U(s) {\n  var t = String(s);\n  if (t.indexOf(String.fromCharCode(92) + \"u\") < 0) return t;\n  try {\n    var out = \"\", i = 0, BS = String.fromCharCode(92);\n    while (i < t.length) {\n      if (t.charAt(i) === BS && t.charAt(i + 1) === \"u\" && t.charAt(i + 2) >= \"0\" && t.charAt(i + 2) <= \"9\") {\n        var hx = t.substr(i + 2, 4), ok = 1;\n        for (var q = 0; q < 4; q++) {\n          var ch = hx.charAt(q);\n          var isH = (ch >= \"0\" && ch <= \"9\") || (ch >= \"a\" && ch <= \"f\") || (ch >= \"A\" && ch <= \"F\");\n          if (!isH) { ok = 0; break; }\n        }\n        if (ok) { out += String.fromCharCode(parseInt(hx, 16)); i += 6; continue; }\n      }\n      out += t.charAt(i); i++;\n    }\n    return out;\n  } catch (e) { return t; }\n}\nfunction T9_msg(t) {\n  var m = String(t).match(/\"msg\":\"([^\"]*)\"/);\n  if (!m) m = String(t).match(/\"msg\":\\s*\"([^\"]*)\"/);\n  if (!m) m = String(t).match(/msg[\\s:]+\"([^\"]*)\"/);\n  return m ? T9_U(m[1]) : \"\";\n}\nfunction T9_code(t) {\n  var m = String(t).match(/\"(?:code|ret|status)\"\\s*:\\s*(-?[0-9]+)/);\n  return m ? parseInt(m[1], 10) : null;\n}\nvar T9_DEF = 'm.159txt.com';\nfunction T9_SET(k, v) {\n  var java, source;\n  var ctx = this;\n  if (ctx && ctx.source) { source = ctx.source; java = ctx.java; }\n  else { source = (typeof source !== 'undefined') ? source : null; java = (typeof java !== 'undefined') ? java : null; }\n  var d = {};\n  try { d = JSON.parse(source.getVariable() || '{}'); } catch (e) { d = {}; }\n  d[k] = v;\n  try { source.putVariable(JSON.stringify(d)); } catch (e2) {}\n  return d;\n}\nfunction T9_GET(k) {\n  var ctx = this, source = (ctx && ctx.source) ? ctx.source : ((typeof source !== 'undefined') ? source : null);\n  var d = {};\n  try { d = JSON.parse(source.getVariable() || '{}'); } catch (e) { d = {}; }\n  return d[k] || '';\n}\nfunction T9_HOST() {\n  var h = '';\n  try { h = String(T9_GET.call(this, 'server')); } catch (e) { h = ''; }\n  if (!h || h == 'null' || h == 'undefined') h = '';\n  if (h) {\n    var bare = h.toLowerCase().replace(/^https?:\\/\\//, '').replace(/\\/+$/, '');\n    for (var i = 0; i < T9_HOSTS.length; i++) { if (T9_HOSTS[i] === bare) return bare; }\n  }\n  return T9_DEF;\n}\nfunction T9_host_UNUSED(jv) {\n  var h = \"\";\n  try { h = String(T9_var(jv).server || \"\"); } catch (e) { h = \"\"; }\n  if (!h || h == \"null\" || h == \"undefined\") h = \"\";\n  if (h) {\n    var bare = h.toLowerCase().replace(/^https?:\\/\\//, \"\").replace(/\\/+$/, \"\");\n    for (var i = 0; i < T9_HOSTS.length; i++) { if (T9_HOSTS[i] === bare) return bare; }\n  }\n  return T9_DEFHOST;\n}\nfunction T9_host_UNUSED(jv) {\n  var h = \"\";\n  try { h = String(T9_var(jv).server || \"\"); } catch (e) { h = \"\"; }\n  if (!h || h == \"null\" || h == \"undefined\") h = \"\";\n  if (h) {\n    var bare = h.toLowerCase().replace(/^https?:\\/\\//, \"\").replace(/\\/+$/, \"\");\n    for (var i = 0; i < T9_HOSTS.length; i++) { if (T9_HOSTS[i] === bare) return bare; }\n  }\n  return T9_DEFHOST;\n}\nfunction T9_base() { return \"https://\" + T9_HOST.call(this); }\nfunction T9_srv(u) {\n  var m = String(u || \"\").match(/^(https?:\\/\\/[^\\/]+)/i);\n  var g = T9_HOST.call(this);\n  if (m) {\n    var dh = m[1].toLowerCase().replace(/^https?:\\/\\//, \"\").replace(/\\/+$/, \"\");\n    if (g && g === dh) return \"https://\" + g;\n    return m[1];\n  }\n  return \"https://\" + g;\n}\nfunction T9_abs(u) {\n  var s = String(u || \"\");\n  if (s.indexOf(\"http\") === 0) return s;\n  if (s.charAt(0) !== \"/\") s = \"/\" + s;\n  return T9_base();\n}\nfunction T9_fixToc(html) {\n  var s = html.indexOf(\"ul_all_chapters\");\n  if (s < 0) s = 0;\n  var re = /href=\"([^\"]*\\/(\\d+)\\/(\\d+)\\/(\\d+)[.]html)\">/g;\n  var q = String.fromCharCode(34);\n  var arr = [], m;\n  re.lastIndex = s;\n  while ((m = re.exec(html))) {\n    var url = m[1];\n    var slash = url.lastIndexOf(\"/\");\n    arr.push({ pfx: url.substring(0, slash + 1), id: parseInt(m[4], 10), pos: m.index, len: m[0].length });\n  }\n  if (!arr.length) return html;\n  var out = html.substring(0, arr[0].pos), prev = 0;\n  for (var i = 0; i < arr.length; i++) {\n    var fromHere = (i === 0) ? arr[0].pos : (arr[i - 1].pos + arr[i - 1].len);\n    out += html.substring(fromHere, arr[i].pos);\n    var cid = arr[i].id, keep = cid;\n    if (cid <= prev) {\n      var nxt = null;\n      for (var j = i + 1; j < arr.length; j++) { if (arr[j].id > cid) { nxt = arr[j].id; break; } }\n      var gap = (nxt === null) ? 2 : (nxt - cid);\n      var step = Math.floor(gap / 2);\n      if (step < 1) step = 1;\n      keep = cid + step;\n      if (keep <= prev) keep = prev + 1;\n      if (nxt !== null && keep >= nxt) keep = prev + 1;\n    }\n    out += \"href=\" + q + arr[i].pfx + keep + \".html\" + q + \">\";\n    prev = keep;\n  }\n  out += html.substring(arr[arr.length - 1].pos + arr[arr.length - 1].len);\n  return out;\n}\nfunction T9_nextPage(jv, sv, result, baseUrl) {\n  var s = (\"\" + result).indexOf(\"indexselect\");\n  if (s < 0) return \"\";\n  var e = (\"\" + result).indexOf(\"</select>\", s);\n  if (e < 0) return \"\";\n  var seg = (\"\" + result).substring(s, e);\n  var opts = seg.match(/<option value=\"([^\"]+)\"([^>]*)>/g) || [];\n  var cur = 0, vals = [];\n  for (var i = 0; i < opts.length; i++) {\n    var v = opts[i].match(/value=\"([^\"]+)\"/);\n    var sel = /selected/.test(opts[i]);\n    if (v) vals.push(v[1]);\n    if (sel) cur = i;\n  }\n  if (cur + 1 < vals.length) return vals[cur + 1];\n  return \"\";\n}\nfunction T9_search(jv, sv, result) {\n  var html = String(result || \"\");\n  if (html.length < 50) return [];\n  var m = html.match(/var books = JSON[.]parse[(]d[(]\"([^\"]+)\"[)][)]/);\n  if (!m) return [];\n  var txt;\n  try { txt = jv.base64Decode(m[1]); } catch (e) { return []; }\n  var arr;\n  try { arr = JSON.parse(txt); } catch (e) { return []; }\n  var out = [];\n  for (var i = 0; i < arr.length; i++) {\n    var b = arr[i];\n    var u = b.url || \"\";\n    if (!u) continue;\n    out.push(JSON.stringify({\n      name: b.name || \"\",\n      url: T9_abs(u),\n      author: b.author || \"\",\n      intro: b.intro || \"\",\n      kind: b.status || \"\",\n      lastChapter: b.chapter || \"\",\n      cover: b.cover || \"\"\n    }));\n  }\n  return out;\n}\nfunction T9_sign(jv, sv) {\n  var opt = { method: \"POST\",\n    headers: { \"User-Agent\": T9_UA, \"Content-Type\": \"application/x-www-form-urlencoded\",\n               \"Referer\": T9_SOSO + \"?action=member\", \"X-Requested-With\": \"XMLHttpRequest\" } };\n  var r = \"\", tries = 0;\n  while (tries < 3) {\n    tries++;\n    try { var CKs=T9_SCOOKIE(); if(CKs) opt.headers[\"Cookie\"]=CKs; r = String(jv.ajax(T9_SOSO + \"?action=user_api&act=sign_in,\" + JSON.stringify(opt))); } catch (e) { r = \"\"; }\n    if (r.indexOf(\"code\") >= 0) break;\n    try { Packages.java.lang.Thread.sleep(1200); } catch (e2) {}\n  }\n  if (r.indexOf(\"code\") < 0) { T9_T(jv, \"签到请求失败：连不上 soshu 网关（已重试3次）\"); return; }\n  jv.log(\"sign resp:\" + r.substring(0, 200));\n  var c = T9_code(r), msg = T9_msg(r);\n  if (c === 0) { T9_T(jv, \"签到成功\" + (msg ? \"：\" + msg : \"\")); }\n  else if (c === null) { T9_T(jv, \"签到失败：响应无法解析 \" + r.substring(0, 60)); }\n  else { T9_T(jv, \"签到失败(\" + c + \")：\" + (msg || \"可能今日已签到或未登录\")); }\n}\nfunction T9_signinfo(jv, sv) {\n  var r = \"\", tries = 0;\n  while (tries < 3) {\n    tries++;\n    try { var CKs=T9_SCOOKIE(); var HH=CKs?{\"User-Agent\":T9_UA,\"Cookie\":CKs}:{\"User-Agent\":T9_UA}; r = String(jv.ajax(T9_SOSO + \"?action=user_api&act=profile,\" + JSON.stringify({headers:HH}))); } catch (e) { r = \"\"; }\n    if (r.indexOf(\"code\") >= 0) break;\n    try { Packages.java.lang.Thread.sleep(1200); } catch (e2) {}\n  }\n  if (r.indexOf(\"code\") < 0) { T9_T(jv, \"查询失败：连不上 soshu 网关（已重试3次）\"); return; }\n  var c = T9_code(r);\n  if (c !== 0) { T9_T(jv, \"未登录，请先点「登录搜搜书」\"); return; }\n  var pv = function (k) { var m = r.match(new RegExp(\"\\\"\" + k + \"\\\"\\\\s*:\\\\s*([0-9]+|true|false)\")); return m ? String(m[1]) : \"0\"; };\n  var signed = r.indexOf(\"\\\"signedToday\\\":true\") >= 0 || r.indexOf(\"\\\"signedToday\\\": true\") >= 0;\n  var streak = pv(\"signStreak\"), mx = pv(\"maxSignStreak\");\n  var rem = pv(\"searchRemaining\"), smax = pv(\"searchMax\");\n  var lv = pv(\"level\"), title = \"\";\n  var tm = r.match(/\"levelTitle\":\"([^\"]*)\"/);\n  if (tm) title = T9_U(tm[1]);\n  var s1 = signed ? \"今日已签到\" : \"今日未签到\";\n  var s2 = \"连续签到 \" + streak + \" 天 | 最长 \" + mx + \" 天\";\n  var s3 = \"Lv\" + lv + (title ? \" \" + title : \"\");\n  var s4 = \"搜索额度 \" + rem + \"/\" + smax;\n  T9_T(jv, s1 + \"\\n\" + s2 + \"\\n\" + s3 + \"\\n\" + s4);\n}\nfunction T9_SCOOKIE() {\n  var ck = \"\";\n  try { ck = String(java.getCookie(T9_SOSO)); } catch (e) { ck = \"\"; }\n  return ck;\n}\nfunction T9_login() {\n  var tel = \"\", pwd = \"\";\n  try { tel = String(java.get(\"tel\")); } catch (e) {}\n  try { pwd = String(java.get(\"pwd\")); } catch (e) {}\n  if (tel.indexOf(\"tel=\") >= 0 || tel.indexOf(\"{\") === 0) {\n    var mo = tel.match(/tel=([^,}\\s]+)/);\n    tel = mo ? mo[1] : \"\";\n  }\n  if (pwd.indexOf(\"pwd=\") >= 0 || pwd.indexOf(\"{\") === 0) {\n    var mp = pwd.match(/pwd=([^,}\\s]+)/);\n    pwd = mp ? mp[1] : \"\";\n  }\n  if (!tel || !pwd || tel == \"null\" || pwd == \"null\" || tel.indexOf(\"tel=\") >= 0 || pwd.indexOf(\"pwd=\") >= 0) {\n    T9_T(java, \"请先在登录界面的「手机号」「密码」框里填写，再点登录\"); return;\n  }\n  var cap = \"\";\n  try {\n    var t0 = Date.now();\n    var CK = T9_SCOOKIE();\n    var HD = { \"User-Agent\": T9_UA };\n    if (CK) HD[\"Cookie\"] = CK;\n    var hex = String(java.ajax(T9_SOSO + \"?action=captcha_api&t=\" + t0 + \",\" + JSON.stringify({ \"type\": \"hex\", \"headers\": HD })));\n    if (!/^[0-9a-f]+$/i.test(hex.substring(0, 16))) { T9_T(java, \"验证码图下载失败\"); return; }\n    var bytes = java.hexDecodeToByteArray(hex);\n    var b64 = String(Packages.android.util.Base64.encodeToString(bytes, 2));\n    var dataUri = \"data:image/png;base64,\" + b64;\n    cap = String(java.getVerificationCode(dataUri));\n  } catch (e) { T9_T(java, \"获取验证码失败:\" + e); return; }\n  if (!cap || cap == \"null\" || cap.length < 3) { T9_T(java, \"未取到验证码，请重试\"); return; }\n  var CK2 = T9_SCOOKIE();\n  var HD2 = { \"User-Agent\": T9_UA, \"Content-Type\": \"application/x-www-form-urlencoded\",\n              \"Referer\": T9_SOSO + \"?action=login\", \"X-Requested-With\": \"XMLHttpRequest\" };\n  if (CK2) HD2[\"Cookie\"] = CK2;\n  var opt = { method: \"POST\",\n    body: \"mobile=\" + java.encodeURI(tel) + \"&password=\" + java.encodeURI(pwd) + \"&captcha=\" + java.encodeURI(cap),\n    headers: HD2 };\n  var r = \"\", tries = 0;\n  while (tries < 3) {\n    tries++;\n    try { r = String(java.ajax(T9_SOSO + \"?action=user_api&act=login,\" + JSON.stringify(opt))); } catch (e) { r = \"\"; }\n    if (r.indexOf(\"code\") >= 0) break;\n    try { Packages.java.lang.Thread.sleep(1200); } catch (e2) {}\n  }\n  if (r.indexOf(\"code\") < 0) { T9_T(java, \"登录请求失败：连不上 soshu 网关（已重试3次）\"); return; }\n  java.log(\"login resp:\" + r.substring(0, 200));\n  var c = T9_code(r), msg = T9_msg(r);\n  if (c === 0) { T9_T(java, \"登录成功（搜索额度已恢复）\" + (msg ? \"：\" + msg : \"\")); }\n  else if (c === -1) { T9_T(java, \"登录失败：\" + (msg || \"手机号或密码错误\") + \"，若刚刷新过验证码请再试一次\"); }\n  else if (c !== null) { T9_T(java, \"登录失败(\" + c + \")：\" + (msg || r.substring(0, 60))); }\n  else { T9_T(java, \"登录失败：响应无法解析 \" + r.substring(0, 60)); }\n}\nfunction T9_check() {\n  var r = \"\";\n  try { var CKc=T9_SCOOKIE(); var HHc=CKc?{\"User-Agent\":T9_UA,\"Cookie\":CKc}:{\"User-Agent\":T9_UA}; r = String(java.ajax(T9_SOSO + \"?action=user_api&act=me,\" + JSON.stringify({headers:HHc}))); } catch (e) { T9_T(java, \"检查失败:网络错误\"); return; }\n  var c = T9_code(r);\n  if (c === 0 && r.indexOf(\"\\\"data\\\":null\") < 0) {\n    var nm = r.match(/\"name\":\"([^\"]*)\"/);\n    T9_T(java, \"已登录：\" + (nm ? T9_U(nm[1]) : \"账号\"));\n  } else if (c === 0) { T9_T(java, \"未登录，请点「登录搜搜书」\"); }\n  else { T9_T(java, \"检查失败(\" + (c === null ? \"?\" : c) + \")\"); }\n}\nfunction T9_quota() {\n  var r = \"\";\n  try { var CKq=T9_SCOOKIE(); var HHq=CKq?{\"User-Agent\":T9_UA,\"Cookie\":CKq}:{\"User-Agent\":T9_UA}; r = String(java.ajax(T9_SOSO + \"?s=x&web=m159txt,\" + JSON.stringify({headers:HHq}))); } catch (e) { T9_T(java, \"检查失败:网络错误\"); return; }\n  if (r.indexOf(\"今日搜索次数已用完\") >= 0 || T9_U(r).indexOf(\"已用完\") >= 0) { T9_T(java, \"今日搜索次数已用完(10次/天)\"); return; }\n  var q = r.match(/quota-remaining\">(\\d+)</);\n  if (q) T9_T(java, \"今日剩余搜索次数:\" + q[1]);\n  else T9_T(java, \"未获取到额度信息\");\n}", "lastUpdateTime": "1792310465185", "loginCheckJs": "(function(){var t=String(result);if(t.indexOf('search-blocked')>=0||t.indexOf('已用完')>=0){  throw new Error('今日搜索次数已用完(10次/天)。搜索走 soshu 网关，额度每日重置；发现/详情/正文不受影响。');}try{  var ck=String(cookie.getCookie('https://www.sososhu.com/'));  var sid=ck.match(/PHPSESSID=([^;\\s]+)/);  if(sid&&sid[1]){    var cur=String(cookie.getCookie('159txt小说'));    if(cur.indexOf(sid[1])<0){      var keep=cur;      var np=keep?keep+'; ':' ';      cookie.setCookie('159txt小说', np+'PHPSESSID='+sid[1]);      java.log('cookie 桶同步: PHPSESSID='+sid[1].substring(0,8)+'...');    }  }}catch(e){java.log('cookie 同步失败: '+e);}return result;})()", "loginUi": "[{\"name\": \"线路\", \"type\": \"select\", \"chars\": [\"m.159txt.com\", \"m.34kanshu.com\", \"m.43kanshu.com\"], \"default\": \"m.159txt.com\", \"action\": \"var _v=result['线路'];if(!_v||_v=='null')_v='m.159txt.com';T9_SET('server', _v);java.refreshExplore();T9_T(java,'已切到: '+_v)\", \"style\": {\"layout_flexGrow\": 1}}, {\"name\": \"tel\", \"type\": \"text\", \"default\": \"\", \"viewName\": \"'手机号'\", \"action\": \"java.put('tel', (result && result['tel']) ? result['tel'] : result)\", \"style\": {\"layout_flexGrow\": 1}}, {\"name\": \"pwd\", \"type\": \"password\", \"default\": \"\", \"viewName\": \"'密码'\", \"action\": \"java.put('pwd', (result && result['pwd']) ? result['pwd'] : result)\", \"style\": {\"layout_flexGrow\": 1}}, {\"name\": \"登录搜搜书\", \"type\": \"button\", \"action\": \"T9_login()\", \"style\": {\"layout_flexGrow\": 1}}, {\"name\": \"检查登录状态\", \"type\": \"button\", \"action\": \"T9_check()\", \"style\": {\"layout_flexGrow\": 1}}, {\"name\": \"查看搜索额度\", \"type\": \"button\", \"action\": \"T9_quota()\", \"style\": {\"layout_flexGrow\": 1}}, {\"name\": \"立即签到\", \"type\": \"button\", \"action\": \"T9_sign(java,source)\", \"style\": {\"layout_flexGrow\": 1}}, {\"name\": \"签到状态\", \"type\": \"button\", \"action\": \"T9_signinfo(java,source)\", \"style\": {\"layout_flexGrow\": 1}}, {\"name\": \"打开搜搜书\", \"type\": \"button\", \"action\": \"java.startBrowser('https://www.sososhu.com/','搜搜书')\", \"style\": {\"layout_flexGrow\": 1}}]", "loginUrl": "var T9_UA = \"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36\";\nvar T9_HOSTS = [\"m.159txt.com\", \"m.34kanshu.com\", \"m.43kanshu.com\"];\nvar T9_DEFHOST = \"m.159txt.com\";\nvar T9_SOSO = \"https://www.sososhu.com/\";\nvar T9_CATS = [[\"玄幻\",1],[\"奇幻\",2],[\"武侠\",3],[\"仙侠\",4],[\"都市\",5],[\"军事\",6],[\"历史\",7],[\"游戏\",8],[\"竞技\",9],[\"科幻\",10],[\"悬疑\",11],[\"灵异\",12],[\"其他\",13],[\"古代言情\",14],[\"仙侠奇缘\",15],[\"现代言情\",16],[\"浪漫青春\",17],[\"玄幻言情\",18],[\"悬疑灵异\",19],[\"科幻空间\",20],[\"游戏竞技\",21],[\"BL文\",22],[\"GL文\",23],[\"二次元\",24]];\nvar T9_QBC = [[\"完本·玄幻\",1],[\"完本·都市\",5],[\"完本·古代言情\",14]];\nvar T9_RANKS = [[\"总榜\",\"allvisit\"],[\"月榜\",\"monthvisit\"],[\"收藏榜\",\"goodnum\"],[\"周榜\",\"weekvisit\"]];\nfunction T9_T(jv, s) { try { jv.toast(String(s)); return 1; } catch (e) {} try { jv.longToast(String(s)); return 1; } catch (e2) {} return 0; }\nfunction T9_U(s) {\n  var t = String(s);\n  if (t.indexOf(String.fromCharCode(92) + \"u\") < 0) return t;\n  try {\n    var out = \"\", i = 0, BS = String.fromCharCode(92);\n    while (i < t.length) {\n      if (t.charAt(i) === BS && t.charAt(i + 1) === \"u\" && t.charAt(i + 2) >= \"0\" && t.charAt(i + 2) <= \"9\") {\n        var hx = t.substr(i + 2, 4), ok = 1;\n        for (var q = 0; q < 4; q++) {\n          var ch = hx.charAt(q);\n          var isH = (ch >= \"0\" && ch <= \"9\") || (ch >= \"a\" && ch <= \"f\") || (ch >= \"A\" && ch <= \"F\");\n          if (!isH) { ok = 0; break; }\n        }\n        if (ok) { out += String.fromCharCode(parseInt(hx, 16)); i += 6; continue; }\n      }\n      out += t.charAt(i); i++;\n    }\n    return out;\n  } catch (e) { return t; }\n}\nfunction T9_msg(t) {\n  var m = String(t).match(/\"msg\":\"([^\"]*)\"/);\n  if (!m) m = String(t).match(/\"msg\":\\s*\"([^\"]*)\"/);\n  if (!m) m = String(t).match(/msg[\\s:]+\"([^\"]*)\"/);\n  return m ? T9_U(m[1]) : \"\";\n}\nfunction T9_code(t) {\n  var m = String(t).match(/\"(?:code|ret|status)\"\\s*:\\s*(-?[0-9]+)/);\n  return m ? parseInt(m[1], 10) : null;\n}\nvar T9_DEF = 'm.159txt.com';\nfunction T9_SET(k, v) {\n  var java, source;\n  var ctx = this;\n  if (ctx && ctx.source) { source = ctx.source; java = ctx.java; }\n  else { source = (typeof source !== 'undefined') ? source : null; java = (typeof java !== 'undefined') ? java : null; }\n  var d = {};\n  try { d = JSON.parse(source.getVariable() || '{}'); } catch (e) { d = {}; }\n  d[k] = v;\n  try { source.putVariable(JSON.stringify(d)); } catch (e2) {}\n  return d;\n}\nfunction T9_GET(k) {\n  var ctx = this, source = (ctx && ctx.source) ? ctx.source : ((typeof source !== 'undefined') ? source : null);\n  var d = {};\n  try { d = JSON.parse(source.getVariable() || '{}'); } catch (e) { d = {}; }\n  return d[k] || '';\n}\nfunction T9_HOST() {\n  var h = '';\n  try { h = String(T9_GET.call(this, 'server')); } catch (e) { h = ''; }\n  if (!h || h == 'null' || h == 'undefined') h = '';\n  if (h) {\n    var bare = h.toLowerCase().replace(/^https?:\\/\\//, '').replace(/\\/+$/, '');\n    for (var i = 0; i < T9_HOSTS.length; i++) { if (T9_HOSTS[i] === bare) return bare; }\n  }\n  return T9_DEF;\n}\nfunction T9_host_UNUSED(jv) {\n  var h = \"\";\n  try { h = String(T9_var(jv).server || \"\"); } catch (e) { h = \"\"; }\n  if (!h || h == \"null\" || h == \"undefined\") h = \"\";\n  if (h) {\n    var bare = h.toLowerCase().replace(/^https?:\\/\\//, \"\").replace(/\\/+$/, \"\");\n    for (var i = 0; i < T9_HOSTS.length; i++) { if (T9_HOSTS[i] === bare) return bare; }\n  }\n  return T9_DEFHOST;\n}\nfunction T9_host_UNUSED(jv) {\n  var h = \"\";\n  try { h = String(T9_var(jv).server || \"\"); } catch (e) { h = \"\"; }\n  if (!h || h == \"null\" || h == \"undefined\") h = \"\";\n  if (h) {\n    var bare = h.toLowerCase().replace(/^https?:\\/\\//, \"\").replace(/\\/+$/, \"\");\n    for (var i = 0; i < T9_HOSTS.length; i++) { if (T9_HOSTS[i] === bare) return bare; }\n  }\n  return T9_DEFHOST;\n}\nfunction T9_base() { return \"https://\" + T9_HOST.call(this); }\nfunction T9_srv(u) {\n  var m = String(u || \"\").match(/^(https?:\\/\\/[^\\/]+)/i);\n  var g = T9_HOST.call(this);\n  if (m) {\n    var dh = m[1].toLowerCase().replace(/^https?:\\/\\//, \"\").replace(/\\/+$/, \"\");\n    if (g && g === dh) return \"https://\" + g;\n    return m[1];\n  }\n  return \"https://\" + g;\n}\nfunction T9_abs(u) {\n  var s = String(u || \"\");\n  if (s.indexOf(\"http\") === 0) return s;\n  if (s.charAt(0) !== \"/\") s = \"/\" + s;\n  return T9_base();\n}\nfunction T9_fixToc(html) {\n  var s = html.indexOf(\"ul_all_chapters\");\n  if (s < 0) s = 0;\n  var re = /href=\"([^\"]*\\/(\\d+)\\/(\\d+)\\/(\\d+)[.]html)\">/g;\n  var q = String.fromCharCode(34);\n  var arr = [], m;\n  re.lastIndex = s;\n  while ((m = re.exec(html))) {\n    var url = m[1];\n    var slash = url.lastIndexOf(\"/\");\n    arr.push({ pfx: url.substring(0, slash + 1), id: parseInt(m[4], 10), pos: m.index, len: m[0].length });\n  }\n  if (!arr.length) return html;\n  var out = html.substring(0, arr[0].pos), prev = 0;\n  for (var i = 0; i < arr.length; i++) {\n    var fromHere = (i === 0) ? arr[0].pos : (arr[i - 1].pos + arr[i - 1].len);\n    out += html.substring(fromHere, arr[i].pos);\n    var cid = arr[i].id, keep = cid;\n    if (cid <= prev) {\n      var nxt = null;\n      for (var j = i + 1; j < arr.length; j++) { if (arr[j].id > cid) { nxt = arr[j].id; break; } }\n      var gap = (nxt === null) ? 2 : (nxt - cid);\n      var step = Math.floor(gap / 2);\n      if (step < 1) step = 1;\n      keep = cid + step;\n      if (keep <= prev) keep = prev + 1;\n      if (nxt !== null && keep >= nxt) keep = prev + 1;\n    }\n    out += \"href=\" + q + arr[i].pfx + keep + \".html\" + q + \">\";\n    prev = keep;\n  }\n  out += html.substring(arr[arr.length - 1].pos + arr[arr.length - 1].len);\n  return out;\n}\nfunction T9_nextPage(jv, sv, result, baseUrl) {\n  var s = (\"\" + result).indexOf(\"indexselect\");\n  if (s < 0) return \"\";\n  var e = (\"\" + result).indexOf(\"</select>\", s);\n  if (e < 0) return \"\";\n  var seg = (\"\" + result).substring(s, e);\n  var opts = seg.match(/<option value=\"([^\"]+)\"([^>]*)>/g) || [];\n  var cur = 0, vals = [];\n  for (var i = 0; i < opts.length; i++) {\n    var v = opts[i].match(/value=\"([^\"]+)\"/);\n    var sel = /selected/.test(opts[i]);\n    if (v) vals.push(v[1]);\n    if (sel) cur = i;\n  }\n  if (cur + 1 < vals.length) return vals[cur + 1];\n  return \"\";\n}\nfunction T9_search(jv, sv, result) {\n  var html = String(result || \"\");\n  if (html.length < 50) return [];\n  var m = html.match(/var books = JSON[.]parse[(]d[(]\"([^\"]+)\"[)][)]/);\n  if (!m) return [];\n  var txt;\n  try { txt = jv.base64Decode(m[1]); } catch (e) { return []; }\n  var arr;\n  try { arr = JSON.parse(txt); } catch (e) { return []; }\n  var out = [];\n  for (var i = 0; i < arr.length; i++) {\n    var b = arr[i];\n    var u = b.url || \"\";\n    if (!u) continue;\n    out.push(JSON.stringify({\n      name: b.name || \"\",\n      url: T9_abs(u),\n      author: b.author || \"\",\n      intro: b.intro || \"\",\n      kind: b.status || \"\",\n      lastChapter: b.chapter || \"\",\n      cover: b.cover || \"\"\n    }));\n  }\n  return out;\n}\nfunction T9_sign(jv, sv) {\n  var opt = { method: \"POST\",\n    headers: { \"User-Agent\": T9_UA, \"Content-Type\": \"application/x-www-form-urlencoded\",\n               \"Referer\": T9_SOSO + \"?action=member\", \"X-Requested-With\": \"XMLHttpRequest\" } };\n  var r = \"\", tries = 0;\n  while (tries < 3) {\n    tries++;\n    try { var CKs=T9_SCOOKIE(); if(CKs) opt.headers[\"Cookie\"]=CKs; r = String(jv.ajax(T9_SOSO + \"?action=user_api&act=sign_in,\" + JSON.stringify(opt))); } catch (e) { r = \"\"; }\n    if (r.indexOf(\"code\") >= 0) break;\n    try { Packages.java.lang.Thread.sleep(1200); } catch (e2) {}\n  }\n  if (r.indexOf(\"code\") < 0) { T9_T(jv, \"签到请求失败：连不上 soshu 网关（已重试3次）\"); return; }\n  jv.log(\"sign resp:\" + r.substring(0, 200));\n  var c = T9_code(r), msg = T9_msg(r);\n  if (c === 0) { T9_T(jv, \"签到成功\" + (msg ? \"：\" + msg : \"\")); }\n  else if (c === null) { T9_T(jv, \"签到失败：响应无法解析 \" + r.substring(0, 60)); }\n  else { T9_T(jv, \"签到失败(\" + c + \")：\" + (msg || \"可能今日已签到或未登录\")); }\n}\nfunction T9_signinfo(jv, sv) {\n  var r = \"\", tries = 0;\n  while (tries < 3) {\n    tries++;\n    try { var CKs=T9_SCOOKIE(); var HH=CKs?{\"User-Agent\":T9_UA,\"Cookie\":CKs}:{\"User-Agent\":T9_UA}; r = String(jv.ajax(T9_SOSO + \"?action=user_api&act=profile,\" + JSON.stringify({headers:HH}))); } catch (e) { r = \"\"; }\n    if (r.indexOf(\"code\") >= 0) break;\n    try { Packages.java.lang.Thread.sleep(1200); } catch (e2) {}\n  }\n  if (r.indexOf(\"code\") < 0) { T9_T(jv, \"查询失败：连不上 soshu 网关（已重试3次）\"); return; }\n  var c = T9_code(r);\n  if (c !== 0) { T9_T(jv, \"未登录，请先点「登录搜搜书」\"); return; }\n  var pv = function (k) { var m = r.match(new RegExp(\"\\\"\" + k + \"\\\"\\\\s*:\\\\s*([0-9]+|true|false)\")); return m ? String(m[1]) : \"0\"; };\n  var signed = r.indexOf(\"\\\"signedToday\\\":true\") >= 0 || r.indexOf(\"\\\"signedToday\\\": true\") >= 0;\n  var streak = pv(\"signStreak\"), mx = pv(\"maxSignStreak\");\n  var rem = pv(\"searchRemaining\"), smax = pv(\"searchMax\");\n  var lv = pv(\"level\"), title = \"\";\n  var tm = r.match(/\"levelTitle\":\"([^\"]*)\"/);\n  if (tm) title = T9_U(tm[1]);\n  var s1 = signed ? \"今日已签到\" : \"今日未签到\";\n  var s2 = \"连续签到 \" + streak + \" 天 | 最长 \" + mx + \" 天\";\n  var s3 = \"Lv\" + lv + (title ? \" \" + title : \"\");\n  var s4 = \"搜索额度 \" + rem + \"/\" + smax;\n  T9_T(jv, s1 + \"\\n\" + s2 + \"\\n\" + s3 + \"\\n\" + s4);\n}\nfunction T9_SCOOKIE() {\n  var ck = \"\";\n  try { ck = String(java.getCookie(T9_SOSO)); } catch (e) { ck = \"\"; }\n  return ck;\n}\nfunction T9_login() {\n  var tel = \"\", pwd = \"\";\n  try { tel = String(java.get(\"tel\")); } catch (e) {}\n  try { pwd = String(java.get(\"pwd\")); } catch (e) {}\n  if (tel.indexOf(\"tel=\") >= 0 || tel.indexOf(\"{\") === 0) {\n    var mo = tel.match(/tel=([^,}\\s]+)/);\n    tel = mo ? mo[1] : \"\";\n  }\n  if (pwd.indexOf(\"pwd=\") >= 0 || pwd.indexOf(\"{\") === 0) {\n    var mp = pwd.match(/pwd=([^,}\\s]+)/);\n    pwd = mp ? mp[1] : \"\";\n  }\n  if (!tel || !pwd || tel == \"null\" || pwd == \"null\" || tel.indexOf(\"tel=\") >= 0 || pwd.indexOf(\"pwd=\") >= 0) {\n    T9_T(java, \"请先在登录界面的「手机号」「密码」框里填写，再点登录\"); return;\n  }\n  var cap = \"\";\n  try {\n    var t0 = Date.now();\n    var CK = T9_SCOOKIE();\n    var HD = { \"User-Agent\": T9_UA };\n    if (CK) HD[\"Cookie\"] = CK;\n    var hex = String(java.ajax(T9_SOSO + \"?action=captcha_api&t=\" + t0 + \",\" + JSON.stringify({ \"type\": \"hex\", \"headers\": HD })));\n    if (!/^[0-9a-f]+$/i.test(hex.substring(0, 16))) { T9_T(java, \"验证码图下载失败\"); return; }\n    var bytes = java.hexDecodeToByteArray(hex);\n    var b64 = String(Packages.android.util.Base64.encodeToString(bytes, 2));\n    var dataUri = \"data:image/png;base64,\" + b64;\n    cap = String(java.getVerificationCode(dataUri));\n  } catch (e) { T9_T(java, \"获取验证码失败:\" + e); return; }\n  if (!cap || cap == \"null\" || cap.length < 3) { T9_T(java, \"未取到验证码，请重试\"); return; }\n  var CK2 = T9_SCOOKIE();\n  var HD2 = { \"User-Agent\": T9_UA, \"Content-Type\": \"application/x-www-form-urlencoded\",\n              \"Referer\": T9_SOSO + \"?action=login\", \"X-Requested-With\": \"XMLHttpRequest\" };\n  if (CK2) HD2[\"Cookie\"] = CK2;\n  var opt = { method: \"POST\",\n    body: \"mobile=\" + java.encodeURI(tel) + \"&password=\" + java.encodeURI(pwd) + \"&captcha=\" + java.encodeURI(cap),\n    headers: HD2 };\n  var r = \"\", tries = 0;\n  while (tries < 3) {\n    tries++;\n    try { r = String(java.ajax(T9_SOSO + \"?action=user_api&act=login,\" + JSON.stringify(opt))); } catch (e) { r = \"\"; }\n    if (r.indexOf(\"code\") >= 0) break;\n    try { Packages.java.lang.Thread.sleep(1200); } catch (e2) {}\n  }\n  if (r.indexOf(\"code\") < 0) { T9_T(java, \"登录请求失败：连不上 soshu 网关（已重试3次）\"); return; }\n  java.log(\"login resp:\" + r.substring(0, 200));\n  var c = T9_code(r), msg = T9_msg(r);\n  if (c === 0) { T9_T(java, \"登录成功（搜索额度已恢复）\" + (msg ? \"：\" + msg : \"\")); }\n  else if (c === -1) { T9_T(java, \"登录失败：\" + (msg || \"手机号或密码错误\") + \"，若刚刷新过验证码请再试一次\"); }\n  else if (c !== null) { T9_T(java, \"登录失败(\" + c + \")：\" + (msg || r.substring(0, 60))); }\n  else { T9_T(java, \"登录失败：响应无法解析 \" + r.substring(0, 60)); }\n}\nfunction T9_check() {\n  var r = \"\";\n  try { var CKc=T9_SCOOKIE(); var HHc=CKc?{\"User-Agent\":T9_UA,\"Cookie\":CKc}:{\"User-Agent\":T9_UA}; r = String(java.ajax(T9_SOSO + \"?action=user_api&act=me,\" + JSON.stringify({headers:HHc}))); } catch (e) { T9_T(java, \"检查失败:网络错误\"); return; }\n  var c = T9_code(r);\n  if (c === 0 && r.indexOf(\"\\\"data\\\":null\") < 0) {\n    var nm = r.match(/\"name\":\"([^\"]*)\"/);\n    T9_T(java, \"已登录：\" + (nm ? T9_U(nm[1]) : \"账号\"));\n  } else if (c === 0) { T9_T(java, \"未登录，请点「登录搜搜书」\"); }\n  else { T9_T(java, \"检查失败(\" + (c === null ? \"?\" : c) + \")\"); }\n}\nfunction T9_quota() {\n  var r = \"\";\n  try { var CKq=T9_SCOOKIE(); var HHq=CKq?{\"User-Agent\":T9_UA,\"Cookie\":CKq}:{\"User-Agent\":T9_UA}; r = String(java.ajax(T9_SOSO + \"?s=x&web=m159txt,\" + JSON.stringify({headers:HHq}))); } catch (e) { T9_T(java, \"检查失败:网络错误\"); return; }\n  if (r.indexOf(\"今日搜索次数已用完\") >= 0 || T9_U(r).indexOf(\"已用完\") >= 0) { T9_T(java, \"今日搜索次数已用完(10次/天)\"); return; }\n  var q = r.match(/quota-remaining\">(\\d+)</);\n  if (q) T9_T(java, \"今日剩余搜索次数:\" + q[1]);\n  else T9_T(java, \"未获取到额度信息\");\n}\nfunction login(){ T9_login(); }", "respondTime": 180000, "ruleBookInfo": {"author": "$.author", "coverUrl": "$.cover", "init": "@js:(function(){var h=String(result);var WB=h.indexOf('wanbenshenzhan')>=0||h.indexOf('chapter-list')>=0&&h.indexOf('ul_all_chapters')<0;var o={};if(WB){  var n=h.match(/<h1>([\\s\\S]*?)<\\/h1>/);  var nm=n?n[1].replace(/<button[\\s\\S]*/,'').replace(/<[^>]*>/g,'').replace(/\\s+/g,' ').trim():'';  if(nm.indexOf(' ')>0)nm=nm.split(' ')[0];  o.name=nm;  var a=h.match(/作者[：:]\\s*([^<\\s]{1,20})/);  o.author=a?a[1]:'';  var k=h.match(/分类[：:]\\s*([^<\\s]{1,10})/);  o.kind=k?k[1]:'';  var it=h.match(/<meta property=\"og:description\" content=\"([^\"]*)\"/);  o.intro=it?it[1]:'';  var cv=h.match(/<meta property=\"og:image\" content=\"([^\"]*)\"/);  o.cover=cv?cv[1]:'';}else{  var n2=h.match(/<h2>([\\s\\S]*?)<\\/h2>/);  o.name=n2?n2[1].replace(/<[^>]*>/g,'').trim():'';  var a2=h.match(/作者：([^<\\s]{1,20})/);  o.author=a2?a2[1]:'';  var k2=h.match(/分类：([^<\\s]{1,10})/);  o.kind=k2?k2[1]:'';  var im=h.match(/<div class=\"intro str-over-dot\">([\\s\\S]*?)<\\/div>/);  var t=im?im[1].replace(/<[^>]*>/g,'').replace(/\\s+/g,' ').trim():'';  if(!t||t.indexOf('更新')<0){var d=h.match(/<meta name=\"description\" content=\"([^\"]*)\"/);if(d)t=d[1];}  o.intro=t;  var cv2=h.match(/class=\"block_img2\"[^>]*>[\\s\\S]*?<img src=\"([^\"]*)\"/);  o.cover=cv2?cv2[1]:'';}return JSON.stringify(o);})()", "intro": "$.intro", "kind": "$.kind", "lastChapter": "text.最新：@text##最新：", "name": "$.name"}, "ruleContent": {"content": "<js>(function(){var q=String.fromCharCode(34), h=String(result);var LT=String.fromCharCode(60), GT=String.fromCharCode(62);var WB=h.indexOf('chapter-content')>=0;var ps=[];if(WB){  var i=h.indexOf('chapter-content');  var s=h.indexOf('>',i);  var e=h.indexOf('</div>',s);  var seg=h.substring(s+1,e);  ps=seg.split(LT+'p'+GT);}else{  var i2=h.indexOf('id='+q+'nr'+q);  if(i2<0)i2=h.indexOf('nr');  if(i2<0)return h;  var s2=h.indexOf('>',i2);  var e2=h.indexOf('</article>',s2);  var seg2=h.substring(s2+1,e2);  var tm=h.match(/<div class=\"zhong\">([\\s\\S]*?)<\\/div>/);  var ttl=tm?tm[1].replace(/<[^>]*>/g,'').replace(/\\s+/g,' ').trim():'';  ps=seg2.split(LT+'p'+GT);  var tmp=[];  for(var k2=0;k2<ps.length;k2++){    var t2=ps[k2].split(LT+'/p'+GT).join('');    var sq2=t2.replace(/[\\s\\u3000]/g,'');    if(ttl && sq2===ttl.replace(/[\\s\\u3000]/g,''))continue;    tmp.push(t2);  }  ps=tmp;}var out=[];for(var k=0;k<ps.length;k++){  var t=ps[k].split(LT+'/p'+GT).join('');  t=t.split(LT+'br'+GT).join(String.fromCharCode(10));  var sq=t.replace(/[\\s\\u3000]/g,'');  var bad=0;  if(sq.indexOf('完本神站')>=0)bad=1;  if(sq.indexOf('神立占')>=0)bad=1;  if(t.indexOf('wanbentxt')>=0||h.indexOf('wanbentxt')>=0&&t.indexOf('wanben')>=0)bad=1;  if(sq.indexOf('一秒记住')>=0)bad=1;  if(sq.indexOf('永不丢失')>=0)bad=1;  if(sq.indexOf('章节文件读取失败')>=0)bad=1;  if(sq.indexOf('推荐地址')>=0)bad=1;  if(sq.indexOf('浏览器搜索')>=0&&sq.indexOf('快速找到')>=0)bad=1;  if(sq.indexOf('找不到书请留言')>=0)bad=1;  if(sq.indexOf('敬请投资')>=0||sq.indexOf('友友们')>=0)bad=1;  if(sq.indexOf('(本章完)')>=0)bad=1;  if(sq.indexOf('wanbenshenzhan')>=0)bad=1;  if(sq.length<1)continue;  if(bad)continue;  out.push(t);}return out.join(String.fromCharCode(10));})()</js>"}, "ruleExplore": {"author": "span.1@text##作者：", "bookList": "ul.xbk", "bookUrl": "li.tjimg a@href||a@href", "coverUrl": "img@src", "intro": "span.-2@text", "kind": "tag.i@text", "name": ".xsm@text"}, "ruleSearch": {"author": "$.author", "bookList": "@js:T9_search(java,source,result)", "bookUrl": "$.url", "coverUrl": "$.cover", "intro": "$.intro", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name"}, "ruleToc": {"chapterList": "<js>(function(){var h=String(result);var WB=h.indexOf('wanbenshenzhan')>=0||(h.indexOf('chapter-list')>=0&&h.indexOf('ul_all_chapters')<0);if(WB){  var s=h.indexOf('chapter-list');  var e=h.indexOf('chapter-pagination',s);  if(e<0)e=h.length;  return h.substring(s,e);}var h2=T9_fixToc(h);var s2=h2.indexOf('ul_all_chapters');var e2=h2.indexOf('</ul>',s2);return h2.substring(s2,e2);})()</js>div.chapter-list a||li a", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": "@js:(function(){var h=String(result);var WB=h.indexOf('wanbenshenzhan')>=0||(h.indexOf('chapter-pagination')>=0&&h.indexOf('indexselect')<0);if(WB){  var m=h.match(/class=\"next\"[^>]*href=\"([^\"]+)\"/);  if(!m)m=h.match(/href=\"([^\"]+)\"[^>]*class=\"next\"/);  return m?m[1]:'';}return T9_nextPage(java,source,result,baseUrl);})()"}, "searchUrl": "https://www.sososhu.com/?s={{key}}&web=m159txt&page={{page}}&_t={{Date.now()}}", "weight": 0},{"bookSourceComment": "一流小说网 www.yi16.com 书源（GBK 站点，杰奇魔改）。正文与目录都用 CSS 伪元素隐写：真实文字在页面内嵌 <style> 里（正文 #htmlContent .p_N::after、目录 .p_{cid}::after），页面上 span 全为空、目录 dd 的 title 属性是错位假名，故正文/目录规则走 JS 解析 style 映射。目录分页 /yi16book/{aid}_{page}/（每页60章），章节分页 {cid}_2.html。搜索 searchkey 必须 GBK 编码（UTF-8 编码返回0结果），单结果 302 直达书页已兼容。创建于2026-10-18。", "bookSourceGroup": "", "bookSourceName": "一流小说网(yi16.com)20261018", "bookSourceType": 0, "bookSourceUrl": "https://www.yi16.com", "bookUrlPattern": "https?://www\\.yi16\\.com/yi16book/\\d+/?", "checkKeyWord": "重生年代福宝妻", "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": false, "header": "{\"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36\"}", "lastUpdateTime": "1792309014541", "respondTime": 180000, "searchUrl": "https://www.yi16.com/modules/article/search.php?searchkey={{key}},{\"method\":\"GET\",\"charset\":\"gbk\"}", "ruleSearch": {"bookList": "<js>var BASE = 'https://www.yi16.com';\nvar k = String(key);\nvar enc = String(java.encodeURI(k, 'GBK'));\nvar pg = parseInt(String(page), 10);\nif (isNaN(pg) || pg < 1) pg = 1;\nvar su = BASE + '/modules/article/search.php?searchkey=' + enc + (pg > 1 ? '&page=' + pg : '');\nvar html = String(result || '');\nif (html.indexOf('mySearch') < 0 || html.indexOf('class=\"b\"') < 0) {\n    try {\n        html = String(java.ajax(su + ',{\"headers\":{\"Referer\":\"' + BASE + '/\"}}'));\n    } catch (e) {\n        html = '';\n    }\n}\nvar doc = org.jsoup.Jsoup.parse(html, BASE + '/');\nvar rows = doc.select('.mySearch ul:has(a.b)');\nvar out;\nif (rows.size() > 0) {\n    out = rows;\n} else {\n    var name = String(doc.select(\"meta[property='og:novel:book_name']\").attr('content'));\n    if (!name) name = String(doc.select('h1.bookTitle').text());\n    if (!name) {\n        out = doc.select('.no-search-result');\n    } else {\n        var url = String(doc.select(\"meta[property='og:novel:read_url']\").attr('content'));\n        if (!url) url = String(doc.select('link[rel=canonical]').attr('href'));\n        var author = String(doc.select(\"meta[property='og:novel:author']\").attr('content'));\n        var last = String(doc.select(\"meta[property='og:novel:latest_chapter_name']\").attr('content'));\n        var frag = '<div class=\"mySearch\"><ul><li>小说：<a class=\"b\" href=\"' + url + '\">' + name + '</a></li>'\n            + '<li>最新：<a>' + last + '</a></li><li>作者：' + author + '</li>'\n            + '<li></li><li></li><li>状态：</li></ul></div>';\n        out = org.jsoup.Jsoup.parseBodyFragment(frag).select('ul');\n    }\n}\nout;</js>", "name": "@css:li:nth-child(1) a@text", "bookUrl": "@css:li:nth-child(1) a@href", "author": "@css:li:nth-child(3)@text##作者：", "kind": "@css:li:nth-child(6)@text##状态：", "lastChapter": "@css:li:nth-child(2) a@text"}, "ruleBookInfo": {"name": "@css:meta[property='og:novel:book_name']@content", "author": "@css:meta[property='og:novel:author']@content", "kind": "@css:meta[property='og:novel:category']@content", "coverUrl": "@css:meta[property='og:image']@content", "intro": "@css:meta[property='og:description']@content", "lastChapter": "@css:meta[property='og:novel:latest_chapter_name']@content", "tocUrl": ""}, "ruleToc": {"chapterList": "<js>var html = String(result || '');\nif (html.indexOf('list-chapterAll') < 0) {\n    try {\n        html = String(java.ajax(String(baseUrl)));\n    } catch (e) {\n    }\n}\nvar doc = org.jsoup.Jsoup.parse(html, String(baseUrl));\nfunction unesc(s) {\n    return String(s).replace(/\\\\A\\s?/g, '\\n').replace(/\\\\'/g, \"'\").replace(/\\\\\\\\/g, '\\\\');\n}\nvar names = {};\nvar re = /\\.p_(\\d+)::after\\s*\\{\\s*content:'((?:[^'\\\\]|\\\\.)*)'\\s*\\}/g;\nvar m;\nwhile ((m = re.exec(html)) !== null) {\n    names[String(m[1])] = String(m[2]);\n}\nvar pageNo = 1;\nvar pm = String(baseUrl).match(/yi16book\\/\\d+_(\\d+)\\/?$/);\nif (pm) pageNo = parseInt(pm[1], 10);\nvar as = doc.select('#list-chapterAll dd a');\nfor (var i = as.size() - 1; i >= 0; i--) {\n    var a = as.get(i);\n    var href = String(a.attr('href'));\n    var mm = href.match(/\\/(\\d+)\\.html/);\n    if (!mm) {\n        a.remove();\n        continue;\n    }\n    var cid = String(mm[1]);\n    var nm = names[cid];\n    if (nm === undefined) {\n        nm = '第' + ((pageNo - 1) * 60 + i + 1) + '章';\n    } else {\n        nm = unesc(nm);\n        if (!nm) nm = '第' + ((pageNo - 1) * 60 + i + 1) + '章';\n    }\n    a.text(nm);\n    a.attr('href', a.absUrl('href'));\n}\ndoc.select('#list-chapterAll dd a');</js>", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": "@css:span.right a:contains(下一页)@href"}, "ruleContent": {"content": "<js>var BASE = 'https://www.yi16.com';\nfunction unesc(s) {\n    return String(s).replace(/\\\\A\\s?/g, '\\n').replace(/\\\\'/g, \"'\").replace(/\\\\\\\\/g, '\\\\');\n}\nfunction extract(h) {\n    var re = /#htmlContent\\s+\\.p_(\\d+)::after\\s*\\{\\s*content:'((?:[^'\\\\]|\\\\.)*)'\\s*\\}/g;\n    var map = {};\n    var m;\n    while ((m = re.exec(h)) !== null) {\n        map[String(m[1])] = String(m[2]);\n    }\n    var idx = [];\n    for (var k in map) {\n        idx.push(parseInt(k, 10));\n    }\n    idx.sort(function (x, y) { return x - y; });\n    var ps = [];\n    for (var i = 0; i < idx.length; i++) {\n        var s = unesc(map[idx[i]]);\n        if (s.replace(/\\s/g, '').length > 0) ps.push(s);\n    }\n    return ps.join('\\n');\n}\nvar cur = String(baseUrl);\nvar parts = [];\nvar guard = 0;\nwhile (cur && guard < 6) {\n    var h = '';\n    try {\n        h = String(java.ajax(cur + ',{\"headers\":{\"Referer\":\"' + BASE + '/\"}}'));\n    } catch (e) {\n        break;\n    }\n    var t = extract(h);\n    if (t.length > 0) parts.push(t);\n    var m = h.match(/id=\"linkNext\"[^>]*href=\"([^\"]+)\"[^>]*>([\\s\\S]*?)<\\/a>/);\n    if (!m) break;\n    if (String(m[2]).indexOf('下一页') < 0) break;\n    var nxt = String(m[1]);\n    if (nxt.indexOf('http') === 0) {\n        cur = nxt;\n    } else if (nxt.charAt(0) === '/') {\n        cur = BASE + nxt;\n    } else {\n        cur = cur.substring(0, cur.lastIndexOf('/') + 1) + nxt;\n    }\n    guard++;\n}\nvar out = parts.join('\\n').replace(/\\n{3,}/g, '\\n\\n');\nout;</js>", "nextContentUrl": ""}, "weight": 0},{"bookSourceComment": "作者：\n姚浅书", "bookSourceGroup": "自制", "bookSourceName": "爱看吧", "bookSourceType": 0, "bookSourceUrl": "https://ik8.net", "bookUrlPattern": "https://ik8\\.net/book\\d+/?", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "长篇::https://ik8.net/booklist1/{{page}}.html\n综合::https://ik8.net/booklist2/{{page}}.html\n武侠::https://ik8.net/booklist3/{{page}}.html\n历史::https://ik8.net/booklist4/{{page}}.html\n都市::https://ik8.net/booklist5/{{page}}.html\n玄幻::https://ik8.net/booklist6/{{page}}.html\n女生::https://ik8.net/booklist7/{{page}}.html\n其他::https://ik8.net/booklist8/{{page}}.html\n现代::https://ik8.net/booklist9/{{page}}.html", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36\", \"Referer\": \"https://ik8.net/\"}", "lastUpdateTime": "1792305223067", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=og:novel:author]@content", "coverUrl": "meta[property=og:image]@content", "intro": "meta[name=description]@content", "kind": "meta[property=og:novel:category]@content", "lastChapter": "class.options@tag.li.4@tag.a@text", "name": "meta[property=og:novel:book_name]@content"}, "ruleContent": {"content": "<js>\nvar html = String(result);\n// 1. 从 HTML 提取 ch() 里的全部 POST 参数\nvar mu = html.match(/\"url\"\\s*:\\s*\"([^\"]+)\"/);\nvar mn = html.match(/\"novel\"\\s*:\\s*\"([^\"]+)\"/);\nvar mc = html.match(/\"chapter\"\\s*:\\s*\"([^\"]+)\"/);\nvar mt = html.match(/\"t\"\\s*:\\s*(\\d+)/);\nvar mn2 = html.match(/\"n\"\\s*:\\s*\"([^\"]+)\"/);\nvar ms = html.match(/\"sign\"\\s*:\\s*\"([^\"]+)\"/);\nif (!mu || !ms || !mn || !mc || !mt || !mn2) {\n  java.log('参数提取失败');\n  '正文参数提取失败，请刷新重试';\n} else {\n  // 2. 清洗 HTML：只删恶意劫持脚本，保留其他资源让 onPageFinished 正常触发\n  html = html.replace(/<script[^>]*src=\"[^\"]*(comprelu|dsygc)[^\"]*\"[^>]*><\\/script>/gi, '');\n  // 3. 注入 8 秒 window.stop() 兜底，强制触发 onPageFinished\n  var forceStop = '<script>setTimeout(function(){try{if(window.stop)window.stop();}catch(e){}},8000);<\\/script>';\n  html = html.replace(/<head[^>]*>/i, '<head>' + forceStop);\n  // 4. 构造完全同步的注入脚本：原生同步 XHR，不依赖 jQuery，不依赖 Promise\n  var bodyJs = 'url=' + mu[1] + '&mobile=1&isk=1&novel=' + mn[1] + '&chapter=' + mc[1] + '&t=' + mt[1] + '&n=' + mn2[1] + '&sign=' + ms[1];\n  var script = '(function(){try{'\n    + 'var body=\"' + bodyJs.replace(/\"/g, '\\\\\"') + '\";'\n    + 'var xhr=new XMLHttpRequest();'\n    + 'xhr.open(\"POST\",\"/conapi.php\",false);'\n    + 'xhr.setRequestHeader(\"Content-Type\",\"application/x-www-form-urlencoded; charset=UTF-8\");'\n    + 'xhr.setRequestHeader(\"X-Requested-With\",\"XMLHttpRequest\");'\n    + 'xhr.send(body);'\n    + 'if(xhr.status!==200)return \"HTTP:\"+xhr.status;'\n    + 'var r=JSON.parse(xhr.responseText);'\n    + 'if(r.success==1&&r.content)return r.content;'\n    + 'return \"FAIL:\"+String(r.content||\"unknown\");'\n    + '}catch(e){return \"ERR:\"+e.message;}})()';\n  java.log('清洗后 html len=' + html.length + ' bodyJs len=' + bodyJs.length);\n  var res = '';\n  try { res = String(java.webView(html, baseUrl, script)); } catch(e) { java.log('webView err:' + e); res = ''; }\n  java.log('webView res len=' + res.length + ' head=' + res.substring(0, 100));\n  if (res.indexOf('ERR:') === 0 || res.indexOf('FAIL:') === 0 || res.indexOf('HTTP:') === 0 || res.length < 30) {\n    '正文加载失败: ' + res.substring(0, 100);\n  } else {\n    var lines = res.split('\\n');\n    var out = [];\n    for (var i = 0; i < lines.length; i++) {\n      var L = lines[i].trim();\n      if (L.length > 0) { out.push('<p>' + L + '</p>'); }\n    }\n    out.join('\\n');\n  }\n}\n</js>"}, "ruleExplore": {"author": "class.author@text", "bookList": "class.box@tag.li", "bookUrl": "tag.h3@tag.a@href", "coverUrl": "tag.img@src", "kind": "class.sort@text", "lastChapter": "class.update@tag.a@text", "name": "tag.h3@tag.a@text"}, "ruleSearch": {"author": "tag.dd.book_other.0@tag.span@tag.a@text", "bookList": "tag.dl", "bookUrl": "tag.h3@tag.a@href", "coverUrl": "tag.dt@tag.img@src", "lastChapter": "tag.dd.book_other.3@tag.a@text", "name": "tag.h3@tag.a@text"}, "ruleToc": {"chapterList": "class.book_list2@tag.li", "chapterName": "tag.a@text", "chapterUrl": "tag.a@href"}, "searchUrl": "https://ik8.net/e/search/index.php?keyboard={{key}}&show=title,writer,byr&searchget=1", "weight": 0},{"bookSourceComment": "bqg413.cc SPA(极速版)。搜索/分类/详情/目录走 https://apibi.cc 明文 JSON；正文接口需 token，本源用纯 JS AES 现算。发现接口无服务端分页，整类一次性返回，翻页会重复。加书请用搜索，不要贴站点 SPA 链接。", "bookSourceGroup": "⑹笔趣阁", "bookSourceName": "笔趣阁极速版(bqg413系)", "bookSourceType": 0, "bookSourceUrl": "https://apibi.cc", "bookUrlPattern": "https?://(www\\.)?([^/]*\\.)?(bqg413\\.cc|apibi\\.cc)/api/book\\?id=\\d+.*", "customButton": false, "customOrder": 9, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "玄幻::https://apibi.cc/api/sort?sort=xuanhuan\n武侠::https://apibi.cc/api/sort?sort=wuxia\n都市::https://apibi.cc/api/sort?sort=dushi\n历史::https://apibi.cc/api/sort?sort=lishi\n网游::https://apibi.cc/api/sort?sort=wangyou\n科幻::https://apibi.cc/api/sort?sort=kehuan\n女生::https://apibi.cc/api/sort?sort=mm\n排行榜::https://apibi.cc/api/sort?sort=top\n全本::https://apibi.cc/api/sort?sort=finish", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\"\n}", "lastUpdateTime": 1792224555437, "respondTime": 180000, "ruleBookInfo": {"author": "$.author@js:result.replace(/^\\s+|\\s+$/g,'')", "coverUrl": "<js>(function(){function pick(o,k){if(o===null||o===undefined)return null;try{var v=o[k];if(v!==undefined&&v!==null&&v!=='')return v;}catch(e){}try{if(o.get){var w=o.get(k);if(w!==undefined&&w!==null&&w!=='')return w;}}catch(e){}try{var g='get'+k.charAt(0).toUpperCase()+k.slice(1);if(typeof o[g]==='function'){var z=o[g]();if(z!==undefined&&z!==null&&z!=='')return z;}}catch(e){}return null;}function jparse(s){s=String(s);if(s.length&&s.charCodeAt(0)===65279)s=s.slice(1);return JSON.parse(s);}function itemVal(k){var o=null;try{o=(typeof result==='string')?jparse(result):result;}catch(e){o=null;}return pick(o,k);}var id=itemVal('id');if(id===null)return '';return 'https://www.bqg413.cc/bookimg/'+Math.floor(Number(id)/1000)+'/'+id+'.jpg';})()</js>", "intro": "$.intro", "kind": "$.sortname", "lastChapter": "$.lastchapter", "name": "$.title", "tocUrl": "<js>(function(){function pick(o,k){if(o===null||o===undefined)return null;try{var v=o[k];if(v!==undefined&&v!==null&&v!=='')return v;}catch(e){}try{if(o.get){var w=o.get(k);if(w!==undefined&&w!==null&&w!=='')return w;}}catch(e){}try{var g='get'+k.charAt(0).toUpperCase()+k.slice(1);if(typeof o[g]==='function'){var z=o[g]();if(z!==undefined&&z!==null&&z!=='')return z;}}catch(e){}return null;}function jparse(s){s=String(s);if(s.length&&s.charCodeAt(0)===65279)s=s.slice(1);return JSON.parse(s);}function itemVal(k){var o=null;try{o=(typeof result==='string')?jparse(result):result;}catch(e){o=null;}return pick(o,k);}var d=itemVal('dirid');if(d===null)d=itemVal('id');if(d===null)return '';return 'https://apibi.cc/api/booklist?id='+d;})()</js>"}, "ruleContent": {"content": "<js>(function(){var s=String(src);if(s.length&&s.charCodeAt(0)===65279)s=s.slice(1);var o=null;try{o=JSON.parse(s);}catch(e){return '';}if(!o||typeof o.txt!=='string'){return '';}return o.txt.split('\\n').join('<br><br>');})()</js>"}, "ruleExplore": {"author": "$.author@js:result.replace(/^\\s+|\\s+$/g,'')", "bookList": "$.data", "bookUrl": "<js>(function(){function pick(o,k){if(o===null||o===undefined)return null;try{var v=o[k];if(v!==undefined&&v!==null&&v!=='')return v;}catch(e){}try{if(o.get){var w=o.get(k);if(w!==undefined&&w!==null&&w!=='')return w;}}catch(e){}try{var g='get'+k.charAt(0).toUpperCase()+k.slice(1);if(typeof o[g]==='function'){var z=o[g]();if(z!==undefined&&z!==null&&z!=='')return z;}}catch(e){}return null;}function jparse(s){s=String(s);if(s.length&&s.charCodeAt(0)===65279)s=s.slice(1);return JSON.parse(s);}function itemVal(k){var o=null;try{o=(typeof result==='string')?jparse(result):result;}catch(e){o=null;}return pick(o,k);}var id=itemVal('id');if(id===null)return '';return 'https://apibi.cc/api/book?id='+id;})()</js>", "coverUrl": "<js>(function(){function pick(o,k){if(o===null||o===undefined)return null;try{var v=o[k];if(v!==undefined&&v!==null&&v!=='')return v;}catch(e){}try{if(o.get){var w=o.get(k);if(w!==undefined&&w!==null&&w!=='')return w;}}catch(e){}try{var g='get'+k.charAt(0).toUpperCase()+k.slice(1);if(typeof o[g]==='function'){var z=o[g]();if(z!==undefined&&z!==null&&z!=='')return z;}}catch(e){}return null;}function jparse(s){s=String(s);if(s.length&&s.charCodeAt(0)===65279)s=s.slice(1);return JSON.parse(s);}function itemVal(k){var o=null;try{o=(typeof result==='string')?jparse(result):result;}catch(e){o=null;}return pick(o,k);}var id=itemVal('id');if(id===null)return '';return 'https://www.bqg413.cc/bookimg/'+Math.floor(Number(id)/1000)+'/'+id+'.jpg';})()</js>", "intro": "$.intro", "name": "$.title"}, "ruleSearch": {"author": "$.author@js:result.replace(/^\\s+|\\s+$/g,'')", "bookList": "$.data", "bookUrl": "<js>(function(){function pick(o,k){if(o===null||o===undefined)return null;try{var v=o[k];if(v!==undefined&&v!==null&&v!=='')return v;}catch(e){}try{if(o.get){var w=o.get(k);if(w!==undefined&&w!==null&&w!=='')return w;}}catch(e){}try{var g='get'+k.charAt(0).toUpperCase()+k.slice(1);if(typeof o[g]==='function'){var z=o[g]();if(z!==undefined&&z!==null&&z!=='')return z;}}catch(e){}return null;}function jparse(s){s=String(s);if(s.length&&s.charCodeAt(0)===65279)s=s.slice(1);return JSON.parse(s);}function itemVal(k){var o=null;try{o=(typeof result==='string')?jparse(result):result;}catch(e){o=null;}return pick(o,k);}var id=itemVal('id');if(id===null)return '';return 'https://apibi.cc/api/book?id='+id;})()</js>", "coverUrl": "<js>(function(){function pick(o,k){if(o===null||o===undefined)return null;try{var v=o[k];if(v!==undefined&&v!==null&&v!=='')return v;}catch(e){}try{if(o.get){var w=o.get(k);if(w!==undefined&&w!==null&&w!=='')return w;}}catch(e){}try{var g='get'+k.charAt(0).toUpperCase()+k.slice(1);if(typeof o[g]==='function'){var z=o[g]();if(z!==undefined&&z!==null&&z!=='')return z;}}catch(e){}return null;}function jparse(s){s=String(s);if(s.length&&s.charCodeAt(0)===65279)s=s.slice(1);return JSON.parse(s);}function itemVal(k){var o=null;try{o=(typeof result==='string')?jparse(result):result;}catch(e){o=null;}return pick(o,k);}var id=itemVal('id');if(id===null)return '';return 'https://www.bqg413.cc/bookimg/'+Math.floor(Number(id)/1000)+'/'+id+'.jpg';})()</js>", "intro": "$.intro", "name": "$.title"}, "ruleToc": {"chapterList": "<js>(function(){var SB=[0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76,0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0,0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15,0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75,0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84,0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf,0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8,0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2,0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73,0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb,0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79,0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08,0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a,0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e,0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf,0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16];function _xt(a){return ((a<<1)^((a&128)?27:0))&255;}function _ml(a,b){var r=0;while(b){if(b&1)r^=a;a=_xt(a);b>>=1;}return r&255;}function _ek(k){var w=new Array(176);var i;for(i=0;i<16;i++)w[i]=k[i];var rc=1;for(i=16;i<176;i+=4){var t0=w[i-4],t1=w[i-3],t2=w[i-2],t3=w[i-1];if(i%16===0){var tp=t0;t0=SB[t1]^rc;t1=SB[t2];t2=SB[t3];t3=SB[tp];rc=_xt(rc);}w[i]=w[i-16]^t0;w[i+1]=w[i-15]^t1;w[i+2]=w[i-14]^t2;w[i+3]=w[i-13]^t3;}return w;}function _sr(s){var t=s.slice(0);for(var r=0;r<4;r++){for(var q=0;q<4;q++){s[r+4*q]=t[r+4*((q+r)&3)];}}return s;}function _eb(w,s){var i,r,q;for(i=0;i<16;i++)s[i]^=w[i];for(r=1;r<10;r++){for(i=0;i<16;i++)s[i]=SB[s[i]];_sr(s);for(q=0;q<4;q++){var a0=s[4*q],a1=s[4*q+1],a2=s[4*q+2],a3=s[4*q+3];s[4*q]=_ml(a0,2)^_ml(a1,3)^a2^a3;s[4*q+1]=a0^_ml(a1,2)^_ml(a2,3)^a3;s[4*q+2]=a0^a1^_ml(a2,2)^_ml(a3,3);s[4*q+3]=_ml(a0,3)^a1^a2^_ml(a3,2);}for(i=0;i<16;i++)s[i]^=w[16*r+i];}for(i=0;i<16;i++)s[i]=SB[s[i]];_sr(s);for(i=0;i<16;i++)s[i]^=w[160+i];return s;}function _u8(t){var o=[];var s=String(t);for(var i=0;i<s.length;i++){var u=s.charCodeAt(i);if(u<128)o.push(u);else if(u<2048)o.push(192|(u>>6),128|(u&63));else if(u>=55296&&u<=56319&&i+1<s.length){var u2=s.charCodeAt(i+1);var cp=65536+((u-55296)<<10)+(u2-56320);i++;o.push(240|(cp>>18),128|((cp>>12)&63),128|((cp>>6)&63),128|(cp&63));}else o.push(224|(u>>12),128|((u>>6)&63),128|(u&63));}return o;}var _B='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';function _b64(b){var o='';for(var i=0;i<b.length;i+=3){var b0=b[i],b1=b[i+1],b2=b[i+2];var n=(b0<<16)|((b1===undefined?0:b1)<<8)|(b2===undefined?0:b2);o+=_B[(n>>18)&63]+_B[(n>>12)&63];o+=(b1===undefined)?'=':_B[(n>>6)&63];o+=(b2===undefined)?'=':_B[n&63];}return o;}function _enc(plain,kstr,ivstr){var k=_u8(kstr),iv=_u8(ivstr),w=_ek(k),d=_u8(plain),pad=16-(d.length%16),i,j;for(i=0;i<pad;i++)d.push(pad);var pv=iv.slice(0),out=[];for(i=0;i<d.length;i+=16){var blk=new Array(16);for(j=0;j<16;j++)blk[j]=d[i+j]^pv[j];_eb(w,blk);for(j=0;j<16;j++){out.push(blk[j]);pv[j]=blk[j];}}return _b64(out);}var K='a3dc22cf70418a51',V='394c2c3202da6270';function tok(o){return encodeURIComponent(_enc(JSON.stringify(o),K,V));}function pick(o,k){if(o===null||o===undefined)return null;try{var v=o[k];if(v!==undefined&&v!==null&&v!=='')return v;}catch(e){}try{if(o.get){var w=o.get(k);if(w!==undefined&&w!==null&&w!=='')return w;}}catch(e){}try{var g='get'+k.charAt(0).toUpperCase()+k.slice(1);if(typeof o[g]==='function'){var z=o[g]();if(z!==undefined&&z!==null&&z!=='')return z;}}catch(e){}return null;}function jparse(s){s=String(s);if(s.length&&s.charCodeAt(0)===65279)s=s.slice(1);return JSON.parse(s);}function itemVal(k){var o=null;try{o=(typeof result==='string')?jparse(result):result;}catch(e){o=null;}return pick(o,k);}var list=null,bid=null;try{var root=jparse(src);if(root&&root.list&&root.list.length){list=root.list;}}catch(e){}var hunts=[String(baseUrl||'')];try{if(typeof book!=='undefined'&&book){hunts.push(String(book.bookUrl||''));hunts.push(String(book.tocUrl||''));}}catch(e){}for(var h=0;h<hunts.length;h++){var m=hunts[h].match(/[?&]id=(\\d+)/);if(m){bid=m[1];break;}}if(!bid){try{var mm=String(src||'').match(/\"(?:id|dirid)\"\\s*:\\s*\"?\\s*(\\d+)/);if(mm){bid=mm[1];}}catch(e){}}if((!list||!list.length)&&bid){try{var body=java.ajax('https://apibi.cc/api/booklist?id='+bid);var r2=jparse(body);if(r2&&r2.list){list=r2.list;}}catch(e){}}if(!list)list=[];if(!bid)bid='0';var res=[];for(var i=0;i<list.length;i++){res.push('<a href=\"https://apibi.cc/api/chapter?token='+tok({id:Number(bid),chapterid:i+1})+'\">'+list[i]+'</a>');}return res;})()</js>", "chapterName": "@css:a@text", "chapterUrl": "@css:a@href"}, "searchUrl": "https://apibi.cc/api/search?q={{key}}", "weight": 0},{"bookSourceComment": "", "bookSourceGroup": "自制,网页源", "bookSourceName": "顶点小说(m.xiaoshuopu.com)", "bookSourceType": 0, "bookSourceUrl": "https://m.xiaoshuopu.com", "bookUrlPattern": "https?://m[.]xiaoshuopu[.]com/xiaoshuo/\\d+/\\d+/(\\d+/)?", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": false, "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1792127313994", "respondTime": 180000, "ruleBookInfo": {"name": "h1.title@text", "author": ".info p.0@text##作者：", "kind": ".info p.1@text##类别：", "lastChapter": ".newest a@text", "intro": "meta[property=og:description]@content", "coverUrl": "meta[property=og:image]@content", "tocUrl": ".listpage select option.-1@value"}, "ruleToc": {"chapterList": "<js>(function(){var l=java.getElements(\"ul.chapter li a\");var o=[];for(var i=l.size()-1;i>=0;i--){o.push(l.get(i));}return o;})()</js>", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": "span.left a[href]@href"}, "ruleContent": {"content": "div#text@html"}, "ruleExplore": [], "ruleSearch": [], "searchUrl": "", "weight": 0},{"bookSourceComment": "2026.10.16\n🍅番茄小说(APP)2.0版本更新公告 by狼崽儿   \n（基于项目https://github.com/ch6vip/fqapp的开源 APP 接口（x-argus/x-ladon 签名 + CM DH 通道解密）\n\n相比1.0 laizhiyu大佬的版本，本次书源修复与新增如下：\n\n【问题修复】\n1. 搜索类：现搜索页可翻页，同时可以搜索到部分之前无法搜索到的书籍。\n2. 无内容修复：部分书籍点进无内容，现已可获取（但仍无法阅读付费出版书的付费章节，只能试阅免费章节；网文是免费书籍，全面可看）\n\n【功能新增】\n6.⭐拉取段评：在登录处选择开启，默认关闭。开启后点击段落末尾的红色对话框图片查看。懒加载，不用担心卡死。可查看段评用户头像，名称，发布日期，点赞数和回复数。原fqapp未开发回复接口，无法查看具体回复）\n6. 作品ID搜索：知道书号可直接搜书，快速定位目标作品。\n7. 详情页信息补全：展示作品ID、在读数、评分、字数、连载状态与全部标签，书籍档案一目了然。\n8. 目录卷名区分：卷标题作为不可点击的分组标题、下方归组真实章节；兼容多种目录返回结构，更多书（如《我不是戏神》）也能正确分卷。\n9. 可看插图：作品可抓取插图，抓取失败也会自动退回无插图通道。", "bookSourceGroup": "番茄,AI", "bookSourceName": "🍅番茄小说(APP)", "bookSourceType": 0, "bookSourceUrl": "https://fanqienovel.com", "bookUrlPattern": "https?://fanqienovel[.]com/page/[0-9]+", "concurrentRate": "1/1000", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "📊 排行榜::\n🔥 推荐榜::https://fanqienovel.com?t=rank&cat=0&algo=101\n🏆 完本榜::https://fanqienovel.com?t=rank&cat=0&algo=100\n👑 巅峰榜::https://fanqienovel.com?t=rank&cat=0&algo=200\n💬 口碑榜::https://fanqienovel.com?t=rank&cat=0&algo=104\n📚 分类榜::\n🌀 穿越::https://fanqienovel.com?t=rank&cat=37&algo=101\n🎯 系统::https://fanqienovel.com?t=rank&cat=19&algo=101\n🏙 都市::https://fanqienovel.com?t=rank&cat=1&algo=101\n💕 现代言情::https://fanqienovel.com?t=rank&cat=3&algo=101\n⚔️ 玄幻::https://fanqienovel.com?t=rank&cat=7&algo=101\n🏮 古代言情::https://fanqienovel.com?t=rank&cat=5&algo=101\n♻️ 重生::https://fanqienovel.com?t=rank&cat=36&algo=101\n🏛 架空::https://fanqienovel.com?t=rank&cat=452&algo=101\n🌏 东方玄幻::https://fanqienovel.com?t=rank&cat=511&algo=101\n👊 打脸::https://fanqienovel.com?t=rank&cat=522&algo=101\n🧚 奇幻仙侠::https://fanqienovel.com?t=rank&cat=259&algo=101\n🌆 都市脑洞::https://fanqienovel.com?t=rank&cat=262&algo=101\n🚀 科幻末世::https://fanqienovel.com?t=rank&cat=8&algo=101\n🧠 玄幻脑洞::https://fanqienovel.com?t=rank&cat=257&algo=101\n🎭 衍生::https://fanqienovel.com?t=rank&cat=1079&algo=101\n📖 频道::\n✨ 推荐::https://fanqienovel.com?t=tab&tt=2\n📜 经典::https://fanqienovel.com?t=tab&tt=11\n🎓 知识::https://fanqienovel.com?t=tab&tt=12\n📄 短篇::https://fanqienovel.com?t=tab&tt=103\n🏠 首页::\n🎁 首页精选::https://fanqienovel.com", "jsLib": "var FQ_HEIC_DECODER=\"!function(r,H,a,U){\\\"use strict\\\";function o(){return b.isValid()}function k(){function m(r,a,A,e,i){var t,f,n,o,u,l,c;for((n=a-r)<-1&&(n=-1),s<(o=a+r)&&(o=s),t=a+1,f=a-1,l=1;t<o||n<f;){if(u=M[l++],t<o){c=W[t++];try{c[0]-=u*(c[0]-A)/b|0,c[1]-=u*(c[1]-e)/b|0,c[2]-=u*(c[2]-i)/b|0}catch(r){}}if(n<f){c=W[f--];try{c[0]-=u*(c[0]-A)/b|0,c[1]-=u*(c[1]-e)/b|0,c[2]-=u*(c[2]-i)/b|0}catch(r){}}}}function y(r,a,A){var e,i,t,f,n,o,u,l,c,b;for(c=l=~(1<<31),u=o=-1,e=0;e<s;e++)(i=(b=W[e])[0]-r)<0&&(i=-i),(t=b[1]-a)<0&&(t=-t),i+=t,(t=b[2]-A)<0&&(t=-t),(i+=t)<l&&(l=i,o=e),(f=i-(g[e]>>d-F))<c&&(c=f,u=e),n=J[e]>>h,J[e]-=n,g[e]+=n<<k;return J[o]+=v,g[o]-=w,u}var Z,p,E,B,W,s=256,X=499,G=491,I=487,V=503,C=3*V,o=s-1,F=4,R=100,d=16,t=1<<d,k=10,h=10,v=t>>h,w=t<<k-h,_=6,N=(s>>3)*(1<<_),Y=30,D=1024,Q=256,b=1<<18,l=[],g=[],J=[],M=[];(function(r,a,A){var e,i;for(p=r,E=a,B=A,W=new Array(s),e=0;e<s;e++)W[e]=new Array(4),(i=W[e])[0]=i[1]=i[2]=(e<<F+8)/s|0,J[e]=t/s|0,g[e]=0}).apply(this,arguments);var r={map:function(r,a,A){var e,i,t,f,n,o,u;for(n=1e3,u=-1,i=(e=l[a])-1;e<s||0<=i;)e<s&&(n<=(t=(o=W[e])[1]-a)?e=s:(e++,t<0&&(t=-t),(f=o[0]-r)<0&&(f=-f),(t+=f)<n&&((f=o[2]-A)<0&&(f=-f),(t+=f)<n&&(n=t,u=o[3])))),0<=i&&(n<=(t=a-(o=W[i])[1])?i=-1:(i--,t<0&&(t=-t),(f=o[0]-r)<0&&(f=-f),(t+=f)<n&&((f=o[2]-A)<0&&(f=-f),(t+=f)<n&&(n=t,u=o[3]))));return u}};return r.process=function(){return function(){var r,a,A,e,i,t,f,n,o,u,l,c,b,s,d,k,h,v,w,g;for(E<C&&(B=1),Z=30+(B-1)/3,c=p,u=(l=(s=E)/(3*B))/R|(b=0),n=D,(f=(t=N)>>_)<=1&&(f=0),r=0;r<f;r++)M[r]=n*((f*f-r*r)*Q/(f*f));for(o=E<C?3:E%X!=0?3*X:E%G!=0?3*G:E%I!=0?3*I:3*V,r=0;r<l;)if(a=y(A=(255&c[b+0])<<F,e=(255&c[b+1])<<F,i=(255&c[b+2])<<F),d=n,k=A,h=e,v=i,w=void 0,w=W[a],g=d/D,w[0]-=g*(w[0]-k)|0,w[1]-=g*(w[1]-h)|0,w[2]-=g*(w[2]-v)|0,0!==f&&m(f,a,A,e,i),s<=(b+=o)&&(b-=E),0===u&&(u=1),++r%u==0)for(n-=n/Z,(f=(t-=t/Y)>>_)<=1&&(f=0),a=0;a<f;a++)M[a]=n*((f*f-a*a)*Q/(f*f))}(),function(){var r;for(r=0;r<s;r++)W[r][0]>>=F,W[r][1]>>=F,W[r][2]>>=F,W[r][3]=r}(),function(){var r,a,A,e,i,t,f,n;for(r=n=f=0;r<s;r++){for(e=(i=W[A=r])[1],a=r+1;a<s;a++)(t=W[a])[1]<e&&(A=a,e=t[1]);if(t=W[A],r!=A&&(a=t[0],t[0]=i[0],i[0]=a,a=t[1],t[1]=i[1],i[1]=a,a=t[2],t[2]=i[2],i[2]=a,a=t[3],t[3]=i[3],i[3]=a),e!=f){for(l[f]=n+r>>1,a=f+1;a<e;a++)l[a]=r;f=e,n=r}}for(l[f]=n+o>>1,a=f+1;a<256;a++)l[a]=o}(),function(){for(var r=[],a=new Array(s),A=0;A<s;A++)a[W[A][3]]=A;for(var e=0,i=0;i<s;i++){var t=a[i];r[e++]=W[t][0],r[e++]=W[t][1],r[e++]=W[t][2]}return r}()},r}function u(){try{this.onmessage=function(r){var a,A=r.data||{};A.gifshot&&(a=e.run(A),postMessage(a))}}catch(r){}var e={dataToRGB:function(r,a,A){for(var e=a*A*4,i=0,t=[];i<e;)t.push(r[i++]),t.push(r[i++]),t.push(r[i++]),i++;return t},componentizedPaletteToArray:function(r){r=r||[];for(var a=[],A=0;A<r.length;A+=3){var e=r[A],i=r[A+1],t=r[A+2];a.push(e<<16|i<<8|t)}return a},processFrameWithQuantizer:function(r,a,A,e){for(var i=this.dataToRGB(r,a,A),t=new k(i,i.length,e),f=t.process(),n=new Uint32Array(this.componentizedPaletteToArray(f)),o=a*A,u=new Uint8Array(o),l=0,c=0;c<o;c++){var b=i[l++],s=i[l++],d=i[l++];u[c]=t.map(b,s,d)}return{pixels:u,palette:n}},run:function(r){r=r||{};var a=r.height,A=(r.palette,r.sampleInterval),e=r.width,i=r.data;return this.processFrameWithQuantizer(i,e,a,A)}};return e}function d(v,r,a,A){var w=0,e=(A=A===U?{}:A).loop===U?null:A.loop,g=A.palette===U?null:A.palette;if(r<=0||a<=0||65535<r||65535<a)throw\\\"Width/Height invalid.\\\";v[w++]=71,v[w++]=73,v[w++]=70,v[w++]=56,v[w++]=57,v[w++]=97;if(v[w++]=255&r,v[w++]=r>>8&255,v[w++]=255&a,v[w++]=a>>8&255,v[w++]=0|(null!==g?128:0),v[w++]=0,v[w++]=0,null!==e){if(e<0||65535<e)throw\\\"Loop count invalid.\\\";v[w++]=33,v[w++]=255,v[w++]=11,v[w++]=78,v[w++]=69,v[w++]=84,v[w++]=83,v[w++]=67,v[w++]=65,v[w++]=80,v[w++]=69,v[w++]=50,v[w++]=46,v[w++]=48,v[w++]=3,v[w++]=1,v[w++]=255&e,v[w++]=e>>8&255,v[w++]=0}var m=!1;this.addFrame=function(r,a,A,e,i,t){if(!0===m&&(--w,m=!1),t=t===U?{}:t,r<0||a<0||65535<r||65535<a)throw\\\"x/y invalid.\\\";if(A<=0||e<=0||65535<A||65535<e)throw\\\"Width/Height invalid.\\\";if(i.length<A*e)throw\\\"Not enough pixels for the frame size.\\\";var f=!0,n=t.palette;if(n!==U&&null!==n||(f=!1,n=g),n===U||null===n)throw\\\"Must supply either a local or global palette.\\\";for(var o=function(r){var a=r.length;if(a<2||256<a||a&a-1)throw\\\"Invalid code/color length, must be power of 2 and 2 .. 256.\\\";return a}(n),u=0;o>>=1;)++u;o=1<<u;var l=t.delay===U?0:t.delay,c=t.disposal===U?0:t.disposal;if(c<0||3<c)throw\\\"Disposal out of range.\\\";var b=!1,s=0;if(t.transparent!==U&&null!==t.transparent&&(b=!0,(s=t.transparent)<0||o<=s))throw\\\"Transparent color index.\\\";if(0===c&&!b&&0===l||(v[w++]=33,v[w++]=249,v[w++]=4,v[w++]=c<<2|(!0===b?1:0),v[w++]=255&l,v[w++]=l>>8&255,v[w++]=s,v[w++]=0),v[w++]=44,v[w++]=255&r,v[w++]=r>>8&255,v[w++]=255&a,v[w++]=a>>8&255,v[w++]=255&A,v[w++]=A>>8&255,v[w++]=255&e,v[w++]=e>>8&255,v[w++]=!0===f?128|u-1:0,!0===f)for(var d=0,k=n.length;d<k;++d){var h=n[d];v[w++]=h>>16&255,v[w++]=h>>8&255,v[w++]=255&h}w=function(a,A,r,e){function i(r){for(;r<=b;)a[A++]=255&s,s>>=8,b-=8,A===f+256&&(a[f]=255,f=A++)}function t(r){s|=r<<b,b+=c,i(8)}a[A++]=r;var f=A++,n=1<<r,o=n-1,u=1+n,l=1+u,c=r+1,b=0,s=0,d=e[0]&o,k={};t(n);for(var h=1,v=e.length;h<v;++h){var w=e[h]&o,g=d<<8|w,m=k[g];if(m===U){for(s|=d<<b,b+=c;8<=b;)a[A++]=255&s,s>>=8,b-=8,A===f+256&&(a[f]=255,f=A++);4096===l?(t(n),l=1+u,c=r+1,k={}):(1<<c<=l&&++c,k[g]=l++),d=w}else d=m}return t(d),t(u),i(1),f+1===A?a[f]=0:(a[f]=A-f-1,a[A++]=0),A}(v,w,u<2?2:u,i)},this.end=function(){return!1===m&&(v[w++]=59,m=!0),w}}function l(r){function i(){var a;S.each(o,function(r,a){a&&(a.text?c.addFrame(a.img,f,a.text):c.addFrame(a,f))}),a=t,c.getBase64GIF(function(r){a({error:!1,errorCode:\\\"\\\",errorMsg:\\\"\\\",image:r})})}var a=0<arguments.length&&r!==U?r:{},t=a.callback,A=a.images,f=a.options,n=a.imagesLength,e=b.validate({getUserMedia:!0,\\\"window.URL\\\":!0}),o=[],u=0,l=void 0,c=void 0;return e.error?t(e):(c=new P(f),void S.each(A,function(r,a){var A,e=a;a.src&&(e=e.src),S.isElement(e)?(f.crossOrigin&&(e.crossOrigin=f.crossOrigin),o[r]=e,(u+=1)===n&&i()):S.isString(e)&&(l=new Image,f.crossOrigin&&(l.crossOrigin=f.crossOrigin),A=l,a.text&&(A.text=a.text),A.onerror=function(){var r=void 0;return 0===--n?((r={}).error=\\\"None of the requested images was capable of being retrieved\\\",t(r)):void 0},A.onload=function(){o[r]=a.text?{img:A,text:A.text}:A,(u+=1)===n&&i(),S.removeElement(A)},A.src=e,S.setCSSAttr(l,{position:\\\"fixed\\\",opacity:\\\"0\\\"}),H.body.appendChild(l))}))}function s(r){r=S.isObject(r)?r:{},m.stopVideoStreaming(r)}function c(r,a){var A=r.options||{},e=A.images,i=A.video,t=Number(A.gifWidth),f=Number(A.gifHeight),n=(Number(A.numFrames),r.cameraStream),o=r.videoElement,u=r.videoWidth,l=r.videoHeight,c=g.getCropDimensions({videoWidth:u,videoHeight:l,gifHeight:f,gifWidth:t}),b=a;A.crop=c,A.videoElement=o,A.videoWidth=u,A.videoHeight=l,A.cameraStream=n,S.isElement(o)&&(o.width=t+c.width,o.height=f+c.height,A.webcamVideoElement||(S.setCSSAttr(o,{position:\\\"fixed\\\",opacity:\\\"0\\\"}),H.body.appendChild(o)),o.play(),g.getGIF(A,function(r){e&&e.length||i&&i.length||s(r),b(r)}))}function e(r,a){if(a=S.isFunction(r)?r:a,r=S.isObject(r)?r:{},S.isFunction(a)){var A=S.mergeOptions(v,r)||{},e=r.cameraStream,i=A.images,t=i?i.length:0,f=A.video,n=A.webcamVideoElement;A=S.mergeOptions(A,{gifWidth:Math.floor(A.gifWidth),gifHeight:Math.floor(A.gifHeight)}),t?l({images:i,imagesLength:t,callback:a,options:A}):f?function(r){var a=0<arguments.length&&r!==U?r:{},A=a.callback,e=a.existingVideo,i=a.options,t=b.validate({getUserMedia:!0,\\\"window.URL\\\":!0}),f=void 0,n=void 0;if(t.error)return A(t);if(S.isElement(e)&&e.src){if(n=e.src,f=S.getExtension(n),!S.isSupported.videoCodecs[f])return A(b.messages.videoCodecs)}else S.isArray(e)&&S.each(e,function(r,a){return f=a instanceof Blob?a.type.substr(a.type.lastIndexOf(\\\"/\\\")+1,a.length):a.substr(a.lastIndexOf(\\\".\\\")+1,a.length),S.isSupported.videoCodecs[f]?(e=a,!1):void 0});m.startStreaming({completed:function(r){r.options=i||{},c(r,A)},existingVideo:e,crossOrigin:i.crossOrigin,options:i})}({existingVideo:f,callback:a,options:A}):function(r){var a=0<arguments.length&&r!==U?r:{},A=a.callback,e=a.lastCameraStream,i=a.options,t=a.webcamVideoElement;o()?i.savedRenderingContexts.length?g.getGIF(i,function(r){A(r)}):m.startVideoStreaming(function(){var r=0<arguments.length&&arguments[0]!==U?arguments[0]:{};r.options=i||{},c(r,A)},{lastCameraStream:e,callback:A,webcamVideoElement:t,crossOrigin:i.crossOrigin}):A(b.validate())}({lastCameraStream:e,callback:a,webcamVideoElement:n,options:A})}}function A(){}function i(){}var t,f,S={URL:r.URL||r.webkitURL||r.mozURL||r.msURL,getUserMedia:(f=a.getUserMedia||a.webkitGetUserMedia||a.mozGetUserMedia||a.msGetUserMedia)?f.bind(a):f,requestAnimFrame:r.requestAnimationFrame||r.webkitRequestAnimationFrame||r.mozRequestAnimationFrame||r.oRequestAnimationFrame||r.msRequestAnimationFrame,requestTimeout:function(A,e){if(A=A||S.noop,e=e||0,!S.requestAnimFrame)return setTimeout(A,e);var i=(new Date).getTime(),t=new Object,f=S.requestAnimFrame;return t.value=f(function r(){var a=(new Date).getTime();e<=a-i?A.call():t.value=f(r)}),t},Blob:r.Blob||r.BlobBuilder||r.WebKitBlobBuilder||r.MozBlobBuilder||r.MSBlobBuilder,btoa:(t=r.btoa||function(r){for(var a=\\\"\\\",A=0,e=r.length,i=\\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\\",t=void 0,f=void 0,n=void 0,o=void 0,u=void 0,l=void 0,c=void 0;A<e;)o=(t=r.charCodeAt(A++))>>2,u=(3&t)<<4|(f=r.charCodeAt(A++))>>4,l=(15&f)<<2|(n=r.charCodeAt(A++))>>6,c=63&n,isNaN(f)?l=c=64:isNaN(n)&&(c=64),a=a+i.charAt(o)+i.charAt(u)+i.charAt(l)+i.charAt(c);return a})?t.bind(r):S.noop,isObject:function(r){return r&&\\\"[object Object]\\\"===Object.prototype.toString.call(r)},isEmptyObject:function(r){return S.isObject(r)&&!Object.keys(r).length},isArray:function(r){return r&&Array.isArray(r)},isFunction:function(r){return r&&\\\"function\\\"==typeof r},isElement:function(r){return r&&1===r.nodeType},isString:function(r){return\\\"string\\\"==typeof r||\\\"[object String]\\\"===Object.prototype.toString.call(r)},isSupported:{canvas:function(){var r=H.createElement(\\\"canvas\\\");return r&&r.getContext&&r.getContext(\\\"2d\\\")},webworkers:function(){return r.Worker},blob:function(){return S.Blob},Uint8Array:function(){return r.Uint8Array},Uint32Array:function(){return r.Uint32Array},videoCodecs:function(){var r=H.createElement(\\\"video\\\"),a={mp4:!1,h264:!1,ogv:!1,ogg:!1,webm:!1};try{r&&r.canPlayType&&(a.mp4=\\\"\\\"!==r.canPlayType('video/mp4; codecs=\\\"mp4v.20.8\\\"'),a.h264=\\\"\\\"!==(r.canPlayType('video/mp4; codecs=\\\"avc1.42E01E\\\"')||r.canPlayType('video/mp4; codecs=\\\"avc1.42E01E, mp4a.40.2\\\"')),a.ogv=\\\"\\\"!==r.canPlayType('video/ogg; codecs=\\\"theora\\\"'),a.ogg=\\\"\\\"!==r.canPlayType('video/ogg; codecs=\\\"theora\\\"'),a.webm=-1!==r.canPlayType('video/webm; codecs=\\\"vp8, vorbis\\\"'))}catch(r){}return a}()},noop:function(){},each:function(r,a){var A=void 0,e=void 0;if(S.isArray(r))for(A=-1,e=r.length;++A<e&&!1!==a(A,r[A]););else if(S.isObject(r))for(A in r)if(r.hasOwnProperty(A)&&!1===a(A,r[A]))break},mergeOptions:function(A,e){if(S.isObject(A)&&S.isObject(e)&&Object.keys){var i={};return S.each(A,function(r){i[r]=A[r]}),S.each(e,function(r){var a=e[r];i[r]=S.isObject(a)&&A[r]?S.mergeOptions(A[r],a):a}),i}},setCSSAttr:function(A,r,a){S.isElement(A)&&(S.isString(r)&&S.isString(a)?A.style[r]=a:S.isObject(r)&&S.each(r,function(r,a){A.style[r]=a}))},removeElement:function(r){S.isElement(r)&&r.parentNode&&r.parentNode.removeChild(r)},createWebWorker:function(r){if(!S.isString(r))return{};try{var a=new S.Blob([r],{type:\\\"text/javascript\\\"}),A=S.URL.createObjectURL(a);return{objectUrl:A,worker:new Worker(A)}}catch(r){return\\\"\\\"+r}},getExtension:function(r){return r.substr(r.lastIndexOf(\\\".\\\")+1,r.length)},getFontSize:function(){var r=0<arguments.length&&arguments[0]!==U?arguments[0]:{};if(!H.body||!1===r.resizeFont)return r.fontSize;var a=r.text,A=r.gifWidth,e=parseInt(r.fontSize,10),i=parseInt(r.minFontSize,10),t=H.createElement(\\\"div\\\"),f=H.createElement(\\\"span\\\");for(t.setAttribute(\\\"width\\\",A),t.appendChild(f),f.innerHTML=a,f.style.fontSize=e+\\\"px\\\",f.style.textIndent=\\\"-9999px\\\",f.style.visibility=\\\"hidden\\\",H.body.appendChild(f);f.offsetWidth>A&&i<=e;)f.style.fontSize=--e+\\\"px\\\";return H.body.removeChild(f),e+\\\"px\\\"},webWorkerError:!1},n=Object.freeze({default:S}),b={validate:function(e){e=S.isObject(e)?e:{};var i={};return S.each(b.validators,function(r,a){var A=a.errorCode;return e[A]||a.condition?void 0:!((i=a).error=!0)}),delete i.condition,i},isValid:function(r){var a=!0!==b.validate(r).error;return a},validators:[{condition:S.isFunction(S.getUserMedia),errorCode:\\\"getUserMedia\\\",errorMsg:\\\"The getUserMedia API is not supported in your browser\\\"},{condition:S.isSupported.canvas(),errorCode:\\\"canvas\\\",errorMsg:\\\"Canvas elements are not supported in your browser\\\"},{condition:S.isSupported.webworkers(),errorCode:\\\"webworkers\\\",errorMsg:\\\"The Web Workers API is not supported in your browser\\\"},{condition:S.isFunction(S.URL),errorCode:\\\"window.URL\\\",errorMsg:\\\"The window.URL API is not supported in your browser\\\"},{condition:S.isSupported.blob(),errorCode:\\\"window.Blob\\\",errorMsg:\\\"The window.Blob File API is not supported in your browser\\\"},{condition:S.isSupported.Uint8Array(),errorCode:\\\"window.Uint8Array\\\",errorMsg:\\\"The window.Uint8Array function constructor is not supported in your browser\\\"},{condition:S.isSupported.Uint32Array(),errorCode:\\\"window.Uint32Array\\\",errorMsg:\\\"The window.Uint32Array function constructor is not supported in your browser\\\"}],messages:{videoCodecs:{errorCode:\\\"videocodec\\\",errorMsg:\\\"The video codec you are trying to use is not supported in your browser\\\"}}},h=Object.freeze({default:b}),v={sampleInterval:10,numWorkers:2,filter:\\\"\\\",gifWidth:200,gifHeight:200,interval:.1,numFrames:10,frameDuration:1,keepCameraOn:!1,images:[],video:null,webcamVideoElement:null,cameraStream:null,text:\\\"\\\",fontWeight:\\\"normal\\\",fontSize:\\\"16px\\\",minFontSize:\\\"10px\\\",resizeFont:!1,fontFamily:\\\"sans-serif\\\",fontColor:\\\"#ffffff\\\",textAlign:\\\"center\\\",textBaseline:\\\"bottom\\\",textXCoordinate:null,textYCoordinate:null,progressCallback:A,completeCallback:A,saveRenderingContexts:!1,savedRenderingContexts:[],showFrameText:!0,crossOrigin:\\\"Anonymous\\\",waterMark:null,waterMarkHeight:null,waterMarkWidth:null,waterMarkXCoordinate:1,waterMarkYCoordinate:1},w=Object.freeze({default:v}),P=function(r){this.canvas=null,this.ctx=null,this.repeat=0,this.frames=[],this.numRenderedFrames=0,this.onRenderCompleteCallback=i,this.onRenderProgressCallback=i,this.workers=[],this.availableWorkers=[],this.generatingGIF=!1,this.options=r,this.initializeWebWorkers(r)};P.prototype={workerMethods:u(),initializeWebWorkers:function(r){var a,A=k.toString()+\\\"(\\\"+u.toString()+\\\"());\\\",e=void 0,i=void 0,t=void 0,f=-1,n=\\\"\\\";for(a=r.numWorkers;++f<a;)e=S.createWebWorker(A),S.isObject(e)?(i=e.objectUrl,t=e.worker,this.workers.push({worker:t,objectUrl:i}),this.availableWorkers.push(t)):(n=e,S.webWorkerError=!!e);this.workerError=n,this.canvas=H.createElement(\\\"canvas\\\"),this.canvas.width=r.gifWidth,this.canvas.height=r.gifHeight,this.ctx=this.canvas.getContext(\\\"2d\\\"),this.frames=[]},getWorker:function(){return this.availableWorkers.pop()},freeWorker:function(r){this.availableWorkers.push(r)},byteMap:function(){for(var r=[],a=0;a<256;a++)r[a]=String.fromCharCode(a);return r}(),bufferToString:function(r){for(var a=r.length,A=\\\"\\\",e=-1;++e<a;)A+=this.byteMap[r[e]];return A},onFrameFinished:function(r){var a=this,A=a.frames,e=!!(a.options.images||[]).length,i=A.every(function(r){return!r.beingProcessed&&r.done});a.numRenderedFrames++,e&&r(a.numRenderedFrames/A.length),a.onRenderProgressCallback(.75*a.numRenderedFrames/A.length),i?a.generatingGIF||a.generateGIF(A,a.onRenderCompleteCallback):S.requestTimeout(function(){a.processNextFrame()},1)},processFrame:function(r){function a(){var r=(0<arguments.length&&arguments[0]!==U?arguments[0]:{}).data;delete n.data,n.pixels=Array.prototype.slice.call(r.pixels),n.palette=Array.prototype.slice.call(r.palette),n.done=!0,n.beingProcessed=!1,A.freeWorker(o),A.onFrameFinished(i)}var A=this,e=(this.options,this.options),i=e.progressCallback,t=e.sampleInterval,f=this.frames,n=void 0,o=void 0;return(n=f[r]).beingProcessed||n.done?void this.onFrameFinished():(n.sampleInterval=t,n.beingProcessed=!0,n.gifshot=!0,void((o=this.getWorker())?(o.onmessage=a,o.postMessage(n)):a({data:A.workerMethods.run(n)})))},startRendering:function(r){this.onRenderCompleteCallback=r;for(var a=0;a<this.options.numWorkers&&a<this.frames.length;a++)this.processFrame(a)},processNextFrame:function(){for(var r=-1,a=0;a<this.frames.length;a++){var A=this.frames[a];if(!A.done&&!A.beingProcessed){r=a;break}}0<=r&&this.processFrame(r)},generateGIF:function(i,r){var a=[],A={loop:this.repeat},e=this.options,t=e.interval,f=e.frameDuration,n=!!e.images.length,o=e.gifHeight,u=e.gifWidth,l=new d(a,u,o,A),c=this.onRenderProgressCallback,b=n?100*t:0,s=void 0;this.generatingGIF=!0,S.each(i,function(r,a){var A=a.palette;c(.75+.25*a.position*1/i.length);for(var e=0;e<f;e++)l.addFrame(0,0,u,o,a.pixels,{palette:A,delay:b})}),l.end(),c(1),this.frames=[],this.generatingGIF=!1,S.isFunction(r)&&(s=this.bufferToString(a),r(\\\"data:image/gif;base64,\\\"+S.btoa(s)))},setRepeat:function(r){this.repeat=r},addFrame:function(r,a,A){a=S.isObject(a)?a:{};var e=this.ctx,i=this.options,t=i.gifWidth,f=i.gifHeight,n=S.getFontSize(a),o=a.filter,u=a.fontColor,l=a.fontFamily,c=a.fontWeight,b=(a.gifHeight,a.gifWidth,a.text),s=a.textAlign,d=a.textBaseline,k=a.waterMark,h=a.waterMarkHeight,v=a.waterMarkWidth,w=a.waterMarkXCoordinate,g=a.waterMarkYCoordinate,m=a.textXCoordinate?a.textXCoordinate:\\\"left\\\"===s?1:\\\"right\\\"===s?t:t/2,y=a.textYCoordinate?a.textYCoordinate:\\\"top\\\"===d?1:\\\"center\\\"===d?f/2:f,Z=c+\\\" \\\"+n+\\\" \\\"+l,p=A&&a.showFrameText?A:b,E=void 0;try{e.filter=o,e.drawImage(r,0,0,t,f),p&&(e.font=Z,e.fillStyle=u,e.textAlign=s,e.textBaseline=d,e.fillText(p,m,y)),k&&e.drawImage(k,w,g,v,h),E=e.getImageData(0,0,t,f),this.addFrameImageData(E)}catch(r){return\\\"\\\"+r}},addFrameImageData:function(){var r=0<arguments.length&&arguments[0]!==U?arguments[0]:{},a=this.frames,A=r.data;this.frames.push({data:A,width:r.width,height:r.height,palette:null,dithering:null,done:!1,beingProcessed:!1,position:a.length})},onRenderProgress:function(r){this.onRenderProgressCallback=r},isRendering:function(){return this.generatingGIF},getBase64GIF:function(a){var A=this;A.startRendering(function(r){A.destroyWorkers(),S.requestTimeout(function(){a(r)},0)})},destroyWorkers:function(){if(!this.workerError){var r=this.workers;S.each(r,function(r,a){var A=a.worker,e=a.objectUrl;A.terminate(),S.URL.revokeObjectURL(e)})}}};function x(){}var g={getGIF:function(){var r=0<arguments.length&&arguments[0]!==U?arguments[0]:{},e=arguments[1];e=S.isFunction(e)?e:x;var a=H.createElement(\\\"canvas\\\"),i=void 0,A=!!r.images.length,t=r.cameraStream,f=r.crop,n=r.filter,o=r.fontColor,u=r.fontFamily,l=r.fontWeight,c=r.keepCameraOn,b=(r.numWorkers,r.progressCallback),s=r.saveRenderingContexts,d=r.savedRenderingContexts,k=r.text,h=r.textAlign,v=r.textBaseline,w=r.videoElement,g=r.videoHeight,m=r.videoWidth,y=r.webcamVideoElement,Z=r.waterMark,p=r.waterMarkHeight,E=r.waterMarkWidth,B=r.waterMarkXCoordinate,W=r.waterMarkYCoordinate,X=Number(r.gifWidth),G=Number(r.gifHeight),I=Number(r.interval),V=(Number(r.sampleInterval),A?0:1e3*I),C=[],F=d.length?d.length:r.numFrames,R=F,_=new P(r),N=S.getFontSize(r),Y=r.textXCoordinate?r.textXCoordinate:\\\"left\\\"===h?1:\\\"right\\\"===h?X:X/2,D=r.textYCoordinate?r.textYCoordinate:\\\"top\\\"===v?1:\\\"center\\\"===v?G/2:G,Q=l+\\\" \\\"+N+\\\" \\\"+u,J=f?Math.floor(f.scaledWidth/2):0,M=f?m-f.scaledWidth:0,j=f?Math.floor(f.scaledHeight/2):0,T=f?g-f.scaledHeight:0;F=F!==U?F:10,I=I!==U?I:.1,a.width=X,a.height=G,i=a.getContext(\\\"2d\\\"),function r(){return d.length||0!==w.currentTime?void function a(){function r(){var r;s&&C.push(i.getImageData(0,0,X,G)),Z&&i.drawImage(Z,B,W,E,p),k&&(i.font=Q,i.fillStyle=o,i.textAlign=h,i.textBaseline=v,i.fillText(k,Y,D)),r=i.getImageData(0,0,X,G),_.addFrameImageData(r),b((F-(R=A))/F),0<A&&S.requestTimeout(a,V),R||_.getBase64GIF(function(r){e({error:!1,errorCode:\\\"\\\",errorMsg:\\\"\\\",image:r,cameraStream:t,videoElement:w,webcamVideoElement:y,savedRenderingContexts:C,keepCameraOn:c})})}var A=R-1;d.length?(i.putImageData(d[F-R],0,0),r()):function a(){try{m<M&&(M=m),g<T&&(T=g),J<0&&(J=0),j<0&&(j=0),i.filter=n,i.drawImage(w,J,j,M,T,0,0,X,G),r()}catch(r){if(\\\"NS_ERROR_NOT_AVAILABLE\\\"!==r.name)throw r;S.requestTimeout(a,100)}}()}():void S.requestTimeout(r,100)}()},getCropDimensions:function(){var r=0<arguments.length&&arguments[0]!==U?arguments[0]:{},a=r.videoWidth,A=r.videoHeight,e=r.gifWidth,i=r.gifHeight,t={width:0,height:0,scaledWidth:0,scaledHeight:0};return A<a?(t.width=Math.round(a*(i/A))-e,t.scaledWidth=Math.round(t.width*(A/i))):(t.height=Math.round(A*(e/a))-i,t.scaledHeight=Math.round(t.height*(a/e))),t}},m={loadedData:!1,defaultVideoDimensions:{width:640,height:480},findVideoSize:function r(a){r.attempts=r.attempts||0;var A=a.cameraStream,e=a.completedCallback,i=a.videoElement;i&&(0<i.videoWidth&&0<i.videoHeight?(i.removeEventListener(\\\"loadeddata\\\",m.findVideoSize),e({videoElement:i,cameraStream:A,videoWidth:i.videoWidth,videoHeight:i.videoHeight})):r.attempts<10?(r.attempts+=1,S.requestTimeout(function(){m.findVideoSize(a)},400)):e({videoElement:i,cameraStream:A,videoWidth:m.defaultVideoDimensions.width,videoHeight:m.defaultVideoDimensions.height}))},onStreamingTimeout:function(r){S.isFunction(r)&&r({error:!0,errorCode:\\\"getUserMedia\\\",errorMsg:\\\"There was an issue with the getUserMedia API - Timed out while trying to start streaming\\\",image:null,cameraStream:{}})},stream:function(r){var a=S.isArray(r.existingVideo)?r.existingVideo[0]:r.existingVideo,A=r.cameraStream,e=r.completedCallback,i=r.streamedCallback,t=r.videoElement;if(S.isFunction(i)&&i(),a){if(S.isString(a))t.src=a,t.innerHTML='<source src=\\\"'+a+'\\\" type=\\\"video/'+S.getExtension(a)+'\\\" />';else if(a instanceof Blob){try{t.src=S.URL.createObjectURL(a)}catch(r){}t.innerHTML='<source src=\\\"'+a+'\\\" type=\\\"'+a.type+'\\\" />'}}else if(t.mozSrcObject)t.mozSrcObject=A;else if(S.URL)try{t.srcObject=A,t.src=S.URL.createObjectURL(A)}catch(r){t.srcObject=A}t.play(),S.requestTimeout(function r(){r.count=r.count||0,!0===m.loadedData?(m.findVideoSize({videoElement:t,cameraStream:A,completedCallback:e}),m.loadedData=!1):10<(r.count+=1)?m.findVideoSize({videoElement:t,cameraStream:A,completedCallback:e}):r()},0)},startStreaming:function(r){var a=S.isFunction(r.error)?r.error:S.noop,A=S.isFunction(r.streamed)?r.streamed:S.noop,e=S.isFunction(r.completed)?r.completed:S.noop,i=r.crossOrigin,t=r.existingVideo,f=r.lastCameraStream,n=r.options,o=r.webcamVideoElement,u=S.isElement(t)?t:o||H.createElement(\\\"video\\\");i&&(u.crossOrigin=n.crossOrigin),u.autoplay=!0,u.loop=!0,u.muted=!0,u.addEventListener(\\\"loadeddata\\\",function(){m.loadedData=!0,n.offset&&(u.currentTime=n.offset)}),t?m.stream({videoElement:u,existingVideo:t,completedCallback:e}):f?m.stream({videoElement:u,cameraStream:f,streamedCallback:A,completedCallback:e}):S.getUserMedia({video:!0},function(r){m.stream({videoElement:u,cameraStream:r,streamedCallback:A,completedCallback:e})},a)},startVideoStreaming:function(t){var r=1<arguments.length&&arguments[1]!==U?arguments[1]:{},a=r.timeout!==U?r.timeout:0,A=r.callback,e=r.webcamVideoElement,i=void 0;0<a&&(i=S.requestTimeout(function(){m.onStreamingTimeout(A)},1e4)),m.startStreaming({error:function(){A({error:!0,errorCode:\\\"getUserMedia\\\",errorMsg:\\\"There was an issue with the getUserMedia API - the user probably denied permission\\\",image:null,cameraStream:{}})},streamed:function(){clearTimeout(i)},completed:function(){var r=0<arguments.length&&arguments[0]!==U?arguments[0]:{},a=r.cameraStream,A=r.videoElement,e=r.videoHeight,i=r.videoWidth;t({cameraStream:a,videoElement:A,videoHeight:e,videoWidth:i})},lastCameraStream:r.lastCameraStream,webcamVideoElement:e,crossOrigin:r.crossOrigin,options:r})},stopVideoStreaming:function(r){r=S.isObject(r)?r:{};var a=r.keepCameraOn,A=r.videoElement,e=r.webcamVideoElement,i=r.cameraStream||{},t=i.getTracks&&i.getTracks()||[],f=t[0];!a&&t.length&&S.isFunction(f.stop)&&f.stop(),S.isElement(A)&&!e&&(A.pause(),S.isFunction(S.URL.revokeObjectURL)&&!S.webWorkerError&&A.src&&S.URL.revokeObjectURL(A.src),S.removeElement(A))}},y={utils:n,error:h,defaultOptions:w,createGIF:e,takeSnapShot:function(r,a){if(a=S.isFunction(r)?r:a,r=S.isObject(r)?r:{},S.isFunction(a)){var A=S.mergeOptions(v,r);e(S.mergeOptions(A,{interval:.1,numFrames:1,gifWidth:Math.floor(A.gifWidth),gifHeight:Math.floor(A.gifHeight)}),a)}},stopVideoStreaming:s,isSupported:function(){return b.isValid()},isWebCamGIFSupported:o,isExistingVideoGIFSupported:function(r){var A=!1;if(S.isArray(r)&&r.length){if(S.each(r,function(r,a){S.isSupported.videoCodecs[a]&&(A=!0)}),!A)return!1}else if(S.isString(r)&&r.length&&!S.isSupported.videoCodecs[r])return!1;return b.isValid({getUserMedia:!0})},isExistingImagesGIFSupported:function(){return b.isValid({getUserMedia:!0})},VERSION:\\\"0.4.5\\\"};\\\"function\\\"==typeof define&&define.amd?define([],function(){return y}):\\\"undefined\\\"!=typeof exports?module.exports=y:r.gifshot=y}(\\\"undefined\\\"!=typeof window?window:{},\\\"undefined\\\"!=typeof document?document:{createElement:function(){}},\\\"undefined\\\"!=typeof window?window.navigator:{}),function(r,a){\\\"object\\\"==typeof exports&&\\\"undefined\\\"!=typeof module?(module.exports=a(),module.exports.default=a()):\\\"function\\\"==typeof define&&define.amd?define(a):(r=r||self).heic2any=a()}(this,function(){\\\"use strict\\\";var r=new Blob(['\\\\nvar Module=void 0!==Module?Module:{};(function(){var d={print:function(A){A=Array.prototype.slice.call(arguments).join(\\\" \\\"),console.log(A)},printErr:function(A){A=Array.prototype.slice.call(arguments).join(\\\" \\\"),console.error(A)},canvas:{},noInitialRun:!0},A={};for(Sr in d)d.hasOwnProperty(Sr)&&(A[Sr]=d[Sr]);var i,f,e=!1,l=!1,o=!1,r=!1;if(d.ENVIRONMENT)if(\\\"WEB\\\"===d.ENVIRONMENT)e=!0;else if(\\\"WORKER\\\"===d.ENVIRONMENT)l=!0;else if(\\\"NODE\\\"===d.ENVIRONMENT)o=!0;else{if(\\\"SHELL\\\"!==d.ENVIRONMENT)throw new Error(\\\"The provided Module[\\\\'ENVIRONMENT\\\\'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.\\\");r=!0}else e=\\\"object\\\"==typeof window,l=\\\"function\\\"==typeof importScripts,o=\\\"object\\\"==typeof process&&\\\"function\\\"==typeof require&&!e&&!l,r=!e&&!o&&!l;if(o)d.print||(d.print=console.log),d.printErr||(d.printErr=console.warn),d.read=function(A,e){var r;return(r=vr(A))||(i=i||require(\\\"fs\\\"),A=(f=f||require(\\\"path\\\")).normalize(A),r=i.readFileSync(A)),e?r:r.toString()},d.readBinary=function(A){var e=d.read(A,!0);return e.buffer||(e=new Uint8Array(e)),h(e.buffer),e},d.thisProgram||(1<process.argv.length?d.thisProgram=process.argv[1].replace(/\\\\\\\\\\\\\\\\/g,\\\"/\\\"):d.thisProgram=\\\"unknown-program\\\"),d.arguments=process.argv.slice(2),\\\"undefined\\\"!=typeof module&&(module.exports=d),process.on(\\\"uncaughtException\\\",function(A){if(!(A instanceof Yr))throw A}),process.on(\\\"unhandledRejection\\\",function(A,e){process.exit(1)}),d.inspect=function(){return\\\"[Emscripten Module object]\\\"};else if(r)d.print||(d.print=print),\\\"undefined\\\"!=typeof printErr&&(d.printErr=printErr),\\\"undefined\\\"!=typeof read?d.read=function(A){var e=vr(A);return e?kr(e):read(A)}:d.read=function(){throw\\\"no read() available\\\"},d.readBinary=function(A){var e;return(e=vr(A))?e:\\\"function\\\"==typeof readbuffer?new Uint8Array(readbuffer(A)):(h(\\\"object\\\"==typeof(e=read(A,\\\"binary\\\"))),e)},\\\"undefined\\\"!=typeof scriptArgs?d.arguments=scriptArgs:void 0!==arguments&&(d.arguments=arguments),\\\"function\\\"==typeof quit&&(d.quit=function(A,e){quit(A)});else{if(!e&&!l)throw new Error(\\\"Unknown runtime environment. Where are we?\\\");if(d.read=function(e){try{var A=new XMLHttpRequest;return A.open(\\\"GET\\\",e,!1),A.send(null),A.responseText}catch(A){var r=vr(e);if(r)return kr(r);throw A}},l&&(d.readBinary=function(e){try{var A=new XMLHttpRequest;return A.open(\\\"GET\\\",e,!1),A.responseType=\\\"arraybuffer\\\",A.send(null),new Uint8Array(A.response)}catch(A){var r=vr(e);if(r)return r;throw A}}),d.readAsync=function(e,r,i){var f=new XMLHttpRequest;f.open(\\\"GET\\\",e,!0),f.responseType=\\\"arraybuffer\\\",f.onload=function(){if(200==f.status||0==f.status&&f.response)r(f.response);else{var A=vr(e);A?r(A.buffer):i()}},f.onerror=i,f.send(null)},void 0!==arguments&&(d.arguments=arguments),\\\"undefined\\\"!=typeof console)d.print||(d.print=function(A){console.log(A)}),d.printErr||(d.printErr=function(A){console.warn(A)});else{d.print||(d.print=function(A){})}void 0===d.setWindowTitle&&(d.setWindowTitle=function(A){document.title=A})}for(Sr in d.print||(d.print=function(){}),d.printErr||(d.printErr=d.print),d.arguments||(d.arguments=[]),d.thisProgram||(d.thisProgram=\\\"./this.program\\\"),d.quit||(d.quit=function(A,e){throw e}),d.print=d.print,d.printErr=d.printErr,d.preRun=[],d.postRun=[],A)A.hasOwnProperty(Sr)&&(d[Sr]=A[Sr]);A=void 0;var k={setTempRet0:function(A){return tempRet0=A},getTempRet0:function(){return tempRet0},stackSave:function(){return _},stackRestore:function(A){_=A},getNativeTypeSize:function(A){switch(A){case\\\"i1\\\":case\\\"i8\\\":return 1;case\\\"i16\\\":return 2;case\\\"i32\\\":return 4;case\\\"i64\\\":return 8;case\\\"float\\\":return 4;case\\\"double\\\":return 8;default:if(\\\"*\\\"===A[A.length-1])return k.QUANTUM_SIZE;if(\\\"i\\\"!==A[0])return 0;var e=parseInt(A.substr(1));return h(e%8==0),e/8}},getNativeFieldSize:function(A){return Math.max(k.getNativeTypeSize(A),k.QUANTUM_SIZE)},STACK_ALIGN:16,prepVararg:function(A,e){return\\\"double\\\"===e||\\\"i64\\\"===e?7&A&&(h(4==(7&A)),A+=4):h(0==(3&A)),A},getAlignSize:function(A,e,r){return r||\\\"i64\\\"!=A&&\\\"double\\\"!=A?A?Math.min(e||(A?k.getNativeFieldSize(A):0),k.QUANTUM_SIZE):Math.min(e,8):8},dynCall:function(A,e,r){return r&&r.length?d[\\\"dynCall_\\\"+A].apply(null,[e].concat(r)):d[\\\"dynCall_\\\"+A].call(null,e)},functionPointers:[],addFunction:function(A){for(var e=0;e<k.functionPointers.length;e++)if(!k.functionPointers[e])return k.functionPointers[e]=A,2*(1+e);throw\\\"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.\\\"},removeFunction:function(A){k.functionPointers[(A-2)/2]=null},warnOnce:function(A){k.warnOnce.shown||(k.warnOnce.shown={}),k.warnOnce.shown[A]||(k.warnOnce.shown[A]=1,d.printErr(A))},funcWrappers:{},getFuncWrapper:function(e,r){if(e){h(r),k.funcWrappers[r]||(k.funcWrappers[r]={});var A=k.funcWrappers[r];return A[e]||(1===r.length?A[e]=function(){return k.dynCall(r,e)}:2===r.length?A[e]=function(A){return k.dynCall(r,e,[A])}:A[e]=function(){return k.dynCall(r,e,Array.prototype.slice.call(arguments))}),A[e]}},getCompilerSetting:function(A){throw\\\"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work\\\"},stackAlloc:function(A){var e=_;return _=(_=_+A|0)+15&-16,e},staticAlloc:function(A){var e=R;return R=(R=R+A|0)+15&-16,e},dynamicAlloc:function(A){var e=I[D>>2],r=-16&(e+A+15|0);if((I[D>>2]=r,H<=r)&&!z())return I[D>>2]=e,0;return e},alignMemory:function(A,e){return A=Math.ceil(A/(e||16))*(e||16)},makeBigInt:function(A,e,r){return r?+(A>>>0)+4294967296*(e>>>0):+(A>>>0)+4294967296*(0|e)},GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};d.Runtime=k;var n=0;function h(A,e){A||Mr(\\\"Assertion failed: \\\"+e)}function w(A,e,r){switch(\\\"*\\\"===(r=r||\\\"i8\\\").charAt(r.length-1)&&(r=\\\"i32\\\"),r){case\\\"i1\\\":case\\\"i8\\\":B[A>>0]=e;break;case\\\"i16\\\":X[A>>1]=e;break;case\\\"i32\\\":I[A>>2]=e;break;case\\\"i64\\\":tempI64=[e>>>0,(tempDouble=e,1<=+iA(tempDouble)?0<tempDouble?(0|tA(+nA(tempDouble/4294967296),4294967295))>>>0:~~+fA((tempDouble-(~~tempDouble>>>0))/4294967296)>>>0:0)],I[A>>2]=tempI64[0],I[A+4>>2]=tempI64[1];break;case\\\"float\\\":G[A>>2]=e;break;case\\\"double\\\":V[A>>3]=e;break;default:Mr(\\\"invalid type for setValue: \\\"+r)}}var t=0,v=2,m=4;function a(A,e,r,i){var f,n;n=\\\"number\\\"==typeof A?(f=!0,A):(f=!1,A.length);var t,o=\\\"string\\\"==typeof e?e:null;if(t=r==m?i:[\\\"function\\\"==typeof Gr?Gr:k.staticAlloc,k.stackAlloc,k.staticAlloc,k.dynamicAlloc][void 0===r?v:r](Math.max(n,o?1:e.length)),f){var a;for(h(0==(3&(i=t))),a=t+(-4&n);i<a;i+=4)I[i>>2]=0;for(a=t+n;i<a;)B[i++>>0]=0;return t}if(\\\"i8\\\"===o)return A.subarray||A.slice?E.set(A,t):E.set(new Uint8Array(A),t),t;for(var c,l,u,b=0;b<n;){var s=A[b];\\\"function\\\"==typeof s&&(s=k.getFunctionIndex(s)),0!==(c=o||e[b])?(\\\"i64\\\"==c&&(c=\\\"i32\\\"),w(t+b,s,c),u!==c&&(l=k.getNativeTypeSize(c),u=c),b+=l):b++}return t}function g(A,e){if(0===e||!A)return\\\"\\\";for(var r,i=0,f=0;i|=r=E[A+f>>0],(0!=r||e)&&(f++,!e||f!=e););e=e||f;var n=\\\"\\\";if(i<128){for(var t;0<e;)t=String.fromCharCode.apply(String,E.subarray(A,A+Math.min(e,1024))),n=n?n+t:t,A+=1024,e-=1024;return n}return c(E,A)}d.ALLOC_NORMAL=t,d.ALLOC_STACK=1,d.ALLOC_STATIC=v,d.ALLOC_DYNAMIC=3,d.ALLOC_NONE=m,d.getMemory=function(A){return N?AA?Gr(A):k.dynamicAlloc(A):k.staticAlloc(A)};var u=\\\"undefined\\\"!=typeof TextDecoder?new TextDecoder(\\\"utf8\\\"):void 0;function c(A,e){for(var r=e;A[r];)++r;if(16<r-e&&A.subarray&&u)return u.decode(A.subarray(e,r));for(var i,f,n,t,o,a=\\\"\\\";;){if(!(i=A[e++]))return a;if(128&i)if(f=63&A[e++],192!=(224&i))if(n=63&A[e++],(i=224==(240&i)?(15&i)<<12|f<<6|n:(t=63&A[e++],240==(248&i)?(7&i)<<18|f<<12|n<<6|t:(o=63&A[e++],248==(252&i)?(3&i)<<24|f<<18|n<<12|t<<6|o:(1&i)<<30|f<<24|n<<18|t<<12|o<<6|63&A[e++])))<65536)a+=String.fromCharCode(i);else{var c=i-65536;a+=String.fromCharCode(55296|c>>10,56320|1023&c)}else a+=String.fromCharCode((31&i)<<6|f);else a+=String.fromCharCode(i)}}function b(A,e,r,i){if(!(0<i))return 0;for(var f=r,n=r+i-1,t=0;t<A.length;++t){var o=A.charCodeAt(t);if(55296<=o&&o<=57343&&(o=65536+((1023&o)<<10)|1023&A.charCodeAt(++t)),o<=127){if(n<=r)break;e[r++]=o}else if(o<=2047){if(n<=r+1)break;e[r++]=192|o>>6,e[r++]=128|63&o}else if(o<=65535){if(n<=r+2)break;e[r++]=224|o>>12,e[r++]=128|o>>6&63,e[r++]=128|63&o}else if(o<=2097151){if(n<=r+3)break;e[r++]=240|o>>18,e[r++]=128|o>>12&63,e[r++]=128|o>>6&63,e[r++]=128|63&o}else if(o<=67108863){if(n<=r+4)break;e[r++]=248|o>>24,e[r++]=128|o>>18&63,e[r++]=128|o>>12&63,e[r++]=128|o>>6&63,e[r++]=128|63&o}else{if(n<=r+5)break;e[r++]=252|o>>30,e[r++]=128|o>>24&63,e[r++]=128|o>>18&63,e[r++]=128|o>>12&63,e[r++]=128|o>>6&63,e[r++]=128|63&o}}return e[r]=0,r-f}function s(A,e,r){return b(A,E,e,r)}function Z(A){for(var e=0,r=0;r<A.length;++r){var i=A.charCodeAt(r);55296<=i&&i<=57343&&(i=65536+((1023&i)<<10)|1023&A.charCodeAt(++r)),i<=127?++e:e+=i<=2047?2:i<=65535?3:i<=2097151?4:i<=67108863?5:6}return e}\\\"undefined\\\"!=typeof TextDecoder&&new TextDecoder(\\\"utf-16le\\\");function p(){var A=function(){var e=new Error;if(!e.stack){try{throw new Error(0)}catch(A){e=A}if(!e.stack)return\\\"(no stack trace available)\\\"}return e.stack.toString()}();return d.extraStackTrace&&(A+=\\\"\\\\\\\\n\\\"+d.extraStackTrace()),A.replace(/__Z[\\\\\\\\w\\\\\\\\d_]+/g,function(A){var e=A;return A===e?A:A+\\\" [\\\"+e+\\\"]\\\"})}var y,B,E,X,W,I,C,G,V,F,R,N,_,Y,Q,D,J,M=65536,T=16777216,U=16777216;function S(A,e){return 0<A%e&&(A+=e-A%e),A}function O(){d.HEAP8=B=new Int8Array(y),d.HEAP16=X=new Int16Array(y),d.HEAP32=I=new Int32Array(y),d.HEAPU8=E=new Uint8Array(y),d.HEAPU16=W=new Uint16Array(y),d.HEAPU32=C=new Uint32Array(y),d.HEAPF32=G=new Float32Array(y),d.HEAPF64=V=new Float64Array(y)}function z(){var A=d.usingWasm?M:T,e=2147483648-A;if(I[D>>2]>e)return!1;var r=H;for(H=Math.max(H,U);H<I[D>>2];)H=H<=536870912?S(2*H,A):Math.min(S((3*H+2147483648)/4,A),e);var i,f=d.reallocBuffer(H);return f&&f.byteLength==H?(i=f,d.buffer=y=i,O(),!0):(H=r,!1)}R=_=D=0,N=!1,d.reallocBuffer||(d.reallocBuffer=function(A){var e;try{if(ArrayBuffer.transfer)e=ArrayBuffer.transfer(y,A);else{var r=B;e=new ArrayBuffer(A),new Int8Array(e).set(r)}}catch(A){return!1}return!!Ir(e)&&e});try{(J=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,\\\"byteLength\\\").get))(new ArrayBuffer(4))}catch(Or){J=function(A){return A.byteLength}}var j=d.TOTAL_STACK||5242880,H=d.TOTAL_MEMORY||16777216;if(H<j&&d.printErr(\\\"TOTAL_MEMORY should be larger than TOTAL_STACK, was \\\"+H+\\\"! (TOTAL_STACK=\\\"+j+\\\")\\\"),y=d.buffer?d.buffer:new ArrayBuffer(H),O(),I[0]=1668509029,X[1]=25459,115!==E[2]||99!==E[3])throw\\\"Runtime error: expected the system to be little-endian!\\\";function x(A){for(;0<A.length;){var e=A.shift();if(\\\"function\\\"!=typeof e){var r=e.func;\\\"number\\\"==typeof r?void 0===e.arg?d.dynCall_v(r):d.dynCall_vi(r,e.arg):r(void 0===e.arg?null:e.arg)}else e()}}d.HEAP=void 0,d.buffer=y,d.HEAP8=B,d.HEAP16=X,d.HEAP32=I,d.HEAPU8=E,d.HEAPU16=W,d.HEAPU32=C,d.HEAPF32=G,d.HEAPF64=V;var P=[],L=[],K=[],q=[],$=[],AA=!1;function eA(A,e){B.set(A,e)}function rA(A,e,r){for(var i=0;i<A.length;++i)B[e++>>0]=A.charCodeAt(i);r||(B[e>>0]=0)}Math.imul&&-5===Math.imul(4294967295,5)||(Math.imul=function(A,e){var r=65535&A,i=65535&e;return r*i+((A>>>16)*i+r*(e>>>16)<<16)|0}),Math.imul=Math.imul,Math.clz32||(Math.clz32=function(A){A>>>=0;for(var e=0;e<32;e++)if(A&1<<31-e)return e;return 32}),Math.clz32=Math.clz32,Math.trunc||(Math.trunc=function(A){return A<0?Math.ceil(A):Math.floor(A)}),Math.trunc=Math.trunc;var iA=Math.abs,fA=(Math.cos,Math.sin,Math.tan,Math.acos,Math.asin,Math.atan,Math.atan2,Math.exp,Math.log,Math.sqrt,Math.ceil),nA=Math.floor,tA=(Math.pow,Math.imul,Math.fround,Math.round,Math.min),oA=(Math.clz32,Math.trunc,0),aA=null,cA=null;function lA(A){oA++,d.monitorRunDependencies&&d.monitorRunDependencies(oA)}function uA(A){if(oA--,d.monitorRunDependencies&&d.monitorRunDependencies(oA),0==oA&&(null!==aA&&(clearInterval(aA),aA=null),cA)){var e=cA;cA=null,e()}}d.addRunDependency=lA,d.removeRunDependency=uA,d.preloadedImages={},d.preloadedAudios={};var bA=null;F=k.GLOBAL_BASE,R=F+79664,L.push({func:function(){Zr()}},{func:function(){yr()}},{func:function(){Br()}},{func:function(){Er()}},{func:function(){pr()}},{func:function(){Xr()}});var sA=R;function dA(){return!!dA.uncaught_exception}R+=16;var kA={last:0,caught:[],infos:{},deAdjust:function(A){if(!A||kA.infos[A])return A;for(var e in kA.infos){if(kA.infos[e].adjusted===A)return e}return A},addRef:function(A){A&&kA.infos[A].refcount++},decRef:function(A){if(A){var e=kA.infos[A];h(0<e.refcount),e.refcount--,0!==e.refcount||e.rethrown||(e.destructor&&d.dynCall_vi(e.destructor,A),delete kA.infos[A],___cxa_free_exception(A))}},clearRef:function(A){A&&(kA.infos[A].refcount=0)}};var hA={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function wA(A){return d.___errno_location&&(I[d.___errno_location()>>2]=A),A}var vA={0:\\\"Success\\\",1:\\\"Not super-user\\\",2:\\\"No such file or directory\\\",3:\\\"No such process\\\",4:\\\"Interrupted system call\\\",5:\\\"I/O error\\\",6:\\\"No such device or address\\\",7:\\\"Arg list too long\\\",8:\\\"Exec format error\\\",9:\\\"Bad file number\\\",10:\\\"No children\\\",11:\\\"No more processes\\\",12:\\\"Not enough core\\\",13:\\\"Permission denied\\\",14:\\\"Bad address\\\",15:\\\"Block device required\\\",16:\\\"Mount device busy\\\",17:\\\"File exists\\\",18:\\\"Cross-device link\\\",19:\\\"No such device\\\",20:\\\"Not a directory\\\",21:\\\"Is a directory\\\",22:\\\"Invalid argument\\\",23:\\\"Too many open files in system\\\",24:\\\"Too many open files\\\",25:\\\"Not a typewriter\\\",26:\\\"Text file busy\\\",27:\\\"File too large\\\",28:\\\"No space left on device\\\",29:\\\"Illegal seek\\\",30:\\\"Read only file system\\\",31:\\\"Too many links\\\",32:\\\"Broken pipe\\\",33:\\\"Math arg out of domain of func\\\",34:\\\"Math result not representable\\\",35:\\\"File locking deadlock error\\\",36:\\\"File or path name too long\\\",37:\\\"No record locks available\\\",38:\\\"Function not implemented\\\",39:\\\"Directory not empty\\\",40:\\\"Too many symbolic links\\\",42:\\\"No message of desired type\\\",43:\\\"Identifier removed\\\",44:\\\"Channel number out of range\\\",45:\\\"Level 2 not synchronized\\\",46:\\\"Level 3 halted\\\",47:\\\"Level 3 reset\\\",48:\\\"Link number out of range\\\",49:\\\"Protocol driver not attached\\\",50:\\\"No CSI structure available\\\",51:\\\"Level 2 halted\\\",52:\\\"Invalid exchange\\\",53:\\\"Invalid request descriptor\\\",54:\\\"Exchange full\\\",55:\\\"No anode\\\",56:\\\"Invalid request code\\\",57:\\\"Invalid slot\\\",59:\\\"Bad font file fmt\\\",60:\\\"Device not a stream\\\",61:\\\"No data (for no delay io)\\\",62:\\\"Timer expired\\\",63:\\\"Out of streams resources\\\",64:\\\"Machine is not on the network\\\",65:\\\"Package not installed\\\",66:\\\"The object is remote\\\",67:\\\"The link has been severed\\\",68:\\\"Advertise error\\\",69:\\\"Srmount error\\\",70:\\\"Communication error on send\\\",71:\\\"Protocol error\\\",72:\\\"Multihop attempted\\\",73:\\\"Cross mount point (not really error)\\\",74:\\\"Trying to read unreadable message\\\",75:\\\"Value too large for defined data type\\\",76:\\\"Given log. name not unique\\\",77:\\\"f.d. invalid for this operation\\\",78:\\\"Remote address changed\\\",79:\\\"Can   access a needed shared lib\\\",80:\\\"Accessing a corrupted shared lib\\\",81:\\\".lib section in a.out corrupted\\\",82:\\\"Attempting to link in too many libs\\\",83:\\\"Attempting to exec a shared library\\\",84:\\\"Illegal byte sequence\\\",86:\\\"Streams pipe error\\\",87:\\\"Too many users\\\",88:\\\"Socket operation on non-socket\\\",89:\\\"Destination address required\\\",90:\\\"Message too long\\\",91:\\\"Protocol wrong type for socket\\\",92:\\\"Protocol not available\\\",93:\\\"Unknown protocol\\\",94:\\\"Socket type not supported\\\",95:\\\"Not supported\\\",96:\\\"Protocol family not supported\\\",97:\\\"Address family not supported by protocol family\\\",98:\\\"Address already in use\\\",99:\\\"Address not available\\\",100:\\\"Network interface is not configured\\\",101:\\\"Network is unreachable\\\",102:\\\"Connection reset by network\\\",103:\\\"Connection aborted\\\",104:\\\"Connection reset by peer\\\",105:\\\"No buffer space available\\\",106:\\\"Socket is already connected\\\",107:\\\"Socket is not connected\\\",108:\\\"Can\\\\'t send after socket shutdown\\\",109:\\\"Too many references\\\",110:\\\"Connection timed out\\\",111:\\\"Connection refused\\\",112:\\\"Host is down\\\",113:\\\"Host is unreachable\\\",114:\\\"Socket already connected\\\",115:\\\"Connection already in progress\\\",116:\\\"Stale file handle\\\",122:\\\"Quota exceeded\\\",123:\\\"No medium (in tape drive)\\\",125:\\\"Operation canceled\\\",130:\\\"Previous owner died\\\",131:\\\"State not recoverable\\\"},mA={splitPath:function(A){return/^(\\\\\\\\/?|)([\\\\\\\\s\\\\\\\\S]*?)((?:\\\\\\\\.{1,2}|[^\\\\\\\\/]+?|)(\\\\\\\\.[^.\\\\\\\\/]*|))(?:[\\\\\\\\/]*)$/.exec(A).slice(1)},normalizeArray:function(A,e){for(var r=0,i=A.length-1;0<=i;i--){var f=A[i];\\\".\\\"===f?A.splice(i,1):\\\"..\\\"===f?(A.splice(i,1),r++):r&&(A.splice(i,1),r--)}if(e)for(;r;r--)A.unshift(\\\"..\\\");return A},normalize:function(A){var e=\\\"/\\\"===A.charAt(0),r=\\\"/\\\"===A.substr(-1);return(A=mA.normalizeArray(A.split(\\\"/\\\").filter(function(A){return!!A}),!e).join(\\\"/\\\"))||e||(A=\\\".\\\"),A&&r&&(A+=\\\"/\\\"),(e?\\\"/\\\":\\\"\\\")+A},dirname:function(A){var e=mA.splitPath(A),r=e[0],i=e[1];return r||i?r+(i=i&&i.substr(0,i.length-1)):\\\".\\\"},basename:function(A){if(\\\"/\\\"===A)return\\\"/\\\";var e=A.lastIndexOf(\\\"/\\\");return-1===e?A:A.substr(e+1)},extname:function(A){return mA.splitPath(A)[3]},join:function(){var A=Array.prototype.slice.call(arguments,0);return mA.normalize(A.join(\\\"/\\\"))},join2:function(A,e){return mA.normalize(A+\\\"/\\\"+e)},resolve:function(){for(var A=\\\"\\\",e=!1,r=arguments.length-1;-1<=r&&!e;r--){var i=0<=r?arguments[r]:EA.cwd();if(\\\"string\\\"!=typeof i)throw new TypeError(\\\"Arguments to path.resolve must be strings\\\");if(!i)return\\\"\\\";A=i+\\\"/\\\"+A,e=\\\"/\\\"===i.charAt(0)}return(e?\\\"/\\\":\\\"\\\")+(A=mA.normalizeArray(A.split(\\\"/\\\").filter(function(A){return!!A}),!e).join(\\\"/\\\"))||\\\".\\\"},relative:function(A,e){function r(A){for(var e=0;e<A.length&&\\\"\\\"===A[e];e++);for(var r=A.length-1;0<=r&&\\\"\\\"===A[r];r--);return r<e?[]:A.slice(e,r-e+1)}A=mA.resolve(A).substr(1),e=mA.resolve(e).substr(1);for(var i=r(A.split(\\\"/\\\")),f=r(e.split(\\\"/\\\")),n=Math.min(i.length,f.length),t=n,o=0;o<n;o++)if(i[o]!==f[o]){t=o;break}var a=[];for(o=t;o<i.length;o++)a.push(\\\"..\\\");return(a=a.concat(f.slice(t))).join(\\\"/\\\")}},gA={ttys:[],init:function(){},shutdown:function(){},register:function(A,e){gA.ttys[A]={input:[],output:[],ops:e},EA.registerDevice(A,gA.stream_ops)},stream_ops:{open:function(A){var e=gA.ttys[A.node.rdev];if(!e)throw new EA.ErrnoError(hA.ENODEV);A.tty=e,A.seekable=!1},close:function(A){A.tty.ops.flush(A.tty)},flush:function(A){A.tty.ops.flush(A.tty)},read:function(A,e,r,i,f){if(!A.tty||!A.tty.ops.get_char)throw new EA.ErrnoError(hA.ENXIO);for(var n=0,t=0;t<i;t++){var o;try{o=A.tty.ops.get_char(A.tty)}catch(A){throw new EA.ErrnoError(hA.EIO)}if(void 0===o&&0===n)throw new EA.ErrnoError(hA.EAGAIN);if(null==o)break;n++,e[r+t]=o}return n&&(A.node.timestamp=Date.now()),n},write:function(A,e,r,i,f){if(!A.tty||!A.tty.ops.put_char)throw new EA.ErrnoError(hA.ENXIO);for(var n=0;n<i;n++)try{A.tty.ops.put_char(A.tty,e[r+n])}catch(A){throw new EA.ErrnoError(hA.EIO)}return i&&(A.node.timestamp=Date.now()),n}},default_tty_ops:{get_char:function(A){if(!A.input.length){var e=null;if(o){var r=new Buffer(256),i=0,f=\\\"win32\\\"!=process.platform,n=process.stdin.fd;if(f){var t=!1;try{n=ur.openSync(\\\"/dev/stdin\\\",\\\"r\\\"),t=!0}catch(A){}}try{i=ur.readSync(n,r,0,256,null)}catch(A){if(-1==A.toString().indexOf(\\\"EOF\\\"))throw A;i=0}t&&ur.closeSync(n),e=0<i?r.slice(0,i).toString(\\\"utf-8\\\"):null}else\\\"undefined\\\"!=typeof window&&\\\"function\\\"==typeof window.prompt?null!==(e=window.prompt(\\\"Input: \\\"))&&(e+=\\\"\\\\\\\\n\\\"):\\\"function\\\"==typeof readline&&null!==(e=readline())&&(e+=\\\"\\\\\\\\n\\\");if(!e)return null;A.input=dr(e,!0)}return A.input.shift()},put_char:function(A,e){null===e||10===e?(d.print(c(A.output,0)),A.output=[]):0!=e&&A.output.push(e)},flush:function(A){A.output&&0<A.output.length&&(d.print(c(A.output,0)),A.output=[])}},default_tty1_ops:{put_char:function(A,e){null===e||10===e?(d.printErr(c(A.output,0)),A.output=[]):0!=e&&A.output.push(e)},flush:function(A){A.output&&0<A.output.length&&(d.printErr(c(A.output,0)),A.output=[])}}},ZA={ops_table:null,mount:function(A){return ZA.createNode(null,\\\"/\\\",16895,0)},createNode:function(A,e,r,i){if(EA.isBlkdev(r)||EA.isFIFO(r))throw new EA.ErrnoError(hA.EPERM);ZA.ops_table||(ZA.ops_table={dir:{node:{getattr:ZA.node_ops.getattr,setattr:ZA.node_ops.setattr,lookup:ZA.node_ops.lookup,mknod:ZA.node_ops.mknod,rename:ZA.node_ops.rename,unlink:ZA.node_ops.unlink,rmdir:ZA.node_ops.rmdir,readdir:ZA.node_ops.readdir,symlink:ZA.node_ops.symlink},stream:{llseek:ZA.stream_ops.llseek}},file:{node:{getattr:ZA.node_ops.getattr,setattr:ZA.node_ops.setattr},stream:{llseek:ZA.stream_ops.llseek,read:ZA.stream_ops.read,write:ZA.stream_ops.write,allocate:ZA.stream_ops.allocate,mmap:ZA.stream_ops.mmap,msync:ZA.stream_ops.msync}},link:{node:{getattr:ZA.node_ops.getattr,setattr:ZA.node_ops.setattr,readlink:ZA.node_ops.readlink},stream:{}},chrdev:{node:{getattr:ZA.node_ops.getattr,setattr:ZA.node_ops.setattr},stream:EA.chrdev_stream_ops}});var f=EA.createNode(A,e,r,i);return EA.isDir(f.mode)?(f.node_ops=ZA.ops_table.dir.node,f.stream_ops=ZA.ops_table.dir.stream,f.contents={}):EA.isFile(f.mode)?(f.node_ops=ZA.ops_table.file.node,f.stream_ops=ZA.ops_table.file.stream,f.usedBytes=0,f.contents=null):EA.isLink(f.mode)?(f.node_ops=ZA.ops_table.link.node,f.stream_ops=ZA.ops_table.link.stream):EA.isChrdev(f.mode)&&(f.node_ops=ZA.ops_table.chrdev.node,f.stream_ops=ZA.ops_table.chrdev.stream),f.timestamp=Date.now(),A&&(A.contents[e]=f),f},getFileDataAsRegularArray:function(A){if(A.contents&&A.contents.subarray){for(var e=[],r=0;r<A.usedBytes;++r)e.push(A.contents[r]);return e}return A.contents},getFileDataAsTypedArray:function(A){return A.contents?A.contents.subarray?A.contents.subarray(0,A.usedBytes):new Uint8Array(A.contents):new Uint8Array},expandFileStorage:function(A,e){if(A.contents&&A.contents.subarray&&e>A.contents.length&&(A.contents=ZA.getFileDataAsRegularArray(A),A.usedBytes=A.contents.length),!A.contents||A.contents.subarray){var r=A.contents?A.contents.length:0;if(e<=r)return;e=Math.max(e,r*(r<1048576?2:1.125)|0),0!=r&&(e=Math.max(e,256));var i=A.contents;return A.contents=new Uint8Array(e),void(0<A.usedBytes&&A.contents.set(i.subarray(0,A.usedBytes),0))}for(!A.contents&&0<e&&(A.contents=[]);A.contents.length<e;)A.contents.push(0)},resizeFileStorage:function(A,e){if(A.usedBytes!=e){if(0==e)return A.contents=null,void(A.usedBytes=0);if(!A.contents||A.contents.subarray){var r=A.contents;return A.contents=new Uint8Array(new ArrayBuffer(e)),r&&A.contents.set(r.subarray(0,Math.min(e,A.usedBytes))),void(A.usedBytes=e)}if(A.contents||(A.contents=[]),A.contents.length>e)A.contents.length=e;else for(;A.contents.length<e;)A.contents.push(0);A.usedBytes=e}},node_ops:{getattr:function(A){var e={};return e.dev=EA.isChrdev(A.mode)?A.id:1,e.ino=A.id,e.mode=A.mode,e.nlink=1,e.uid=0,e.gid=0,e.rdev=A.rdev,EA.isDir(A.mode)?e.size=4096:EA.isFile(A.mode)?e.size=A.usedBytes:EA.isLink(A.mode)?e.size=A.link.length:e.size=0,e.atime=new Date(A.timestamp),e.mtime=new Date(A.timestamp),e.ctime=new Date(A.timestamp),e.blksize=4096,e.blocks=Math.ceil(e.size/e.blksize),e},setattr:function(A,e){void 0!==e.mode&&(A.mode=e.mode),void 0!==e.timestamp&&(A.timestamp=e.timestamp),void 0!==e.size&&ZA.resizeFileStorage(A,e.size)},lookup:function(A,e){throw EA.genericErrors[hA.ENOENT]},mknod:function(A,e,r,i){return ZA.createNode(A,e,r,i)},rename:function(A,e,r){if(EA.isDir(A.mode)){var i;try{i=EA.lookupNode(e,r)}catch(A){}if(i)for(var f in i.contents)throw new EA.ErrnoError(hA.ENOTEMPTY)}delete A.parent.contents[A.name],A.name=r,(e.contents[r]=A).parent=e},unlink:function(A,e){delete A.contents[e]},rmdir:function(A,e){var r=EA.lookupNode(A,e);for(var i in r.contents)throw new EA.ErrnoError(hA.ENOTEMPTY);delete A.contents[e]},readdir:function(A){var e=[\\\".\\\",\\\"..\\\"];for(var r in A.contents)A.contents.hasOwnProperty(r)&&e.push(r);return e},symlink:function(A,e,r){var i=ZA.createNode(A,e,41471,0);return i.link=r,i},readlink:function(A){if(!EA.isLink(A.mode))throw new EA.ErrnoError(hA.EINVAL);return A.link}},stream_ops:{read:function(A,e,r,i,f){var n=A.node.contents;if(f>=A.node.usedBytes)return 0;var t=Math.min(A.node.usedBytes-f,i);if(h(0<=t),8<t&&n.subarray)e.set(n.subarray(f,f+t),r);else for(var o=0;o<t;o++)e[r+o]=n[f+o];return t},write:function(A,e,r,i,f,n){if(!i)return 0;var t=A.node;if(t.timestamp=Date.now(),e.subarray&&(!t.contents||t.contents.subarray)){if(n)return t.contents=e.subarray(r,r+i),t.usedBytes=i;if(0===t.usedBytes&&0===f)return t.contents=new Uint8Array(e.subarray(r,r+i)),t.usedBytes=i;if(f+i<=t.usedBytes)return t.contents.set(e.subarray(r,r+i),f),i}if(ZA.expandFileStorage(t,f+i),t.contents.subarray&&e.subarray)t.contents.set(e.subarray(r,r+i),f);else for(var o=0;o<i;o++)t.contents[f+o]=e[r+o];return t.usedBytes=Math.max(t.usedBytes,f+i),i},llseek:function(A,e,r){var i=e;if(1===r?i+=A.position:2===r&&EA.isFile(A.node.mode)&&(i+=A.node.usedBytes),i<0)throw new EA.ErrnoError(hA.EINVAL);return i},allocate:function(A,e,r){ZA.expandFileStorage(A.node,e+r),A.node.usedBytes=Math.max(A.node.usedBytes,e+r)},mmap:function(A,e,r,i,f,n,t){if(!EA.isFile(A.node.mode))throw new EA.ErrnoError(hA.ENODEV);var o,a,c=A.node.contents;if(2&t||c.buffer!==e&&c.buffer!==e.buffer){if((0<f||f+i<A.node.usedBytes)&&(c=c.subarray?c.subarray(f,f+i):Array.prototype.slice.call(c,f,f+i)),a=!0,!(o=Gr(i)))throw new EA.ErrnoError(hA.ENOMEM);e.set(c,o)}else a=!1,o=c.byteOffset;return{ptr:o,allocated:a}},msync:function(A,e,r,i,f){if(!EA.isFile(A.node.mode))throw new EA.ErrnoError(hA.ENODEV);if(2&f)return 0;ZA.stream_ops.write(A,e,0,i,r,!1);return 0}}},pA={dbs:{},indexedDB:function(){if(\\\"undefined\\\"!=typeof indexedDB)return indexedDB;var A=null;return\\\"object\\\"==typeof window&&(A=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB),h(A,\\\"IDBFS used, but indexedDB not supported\\\"),A},DB_VERSION:21,DB_STORE_NAME:\\\"FILE_DATA\\\",mount:function(A){return ZA.mount.apply(null,arguments)},syncfs:function(e,n,t){pA.getLocalSet(e,function(A,f){if(A)return t(A);pA.getRemoteSet(e,function(A,e){if(A)return t(A);var r=n?e:f,i=n?f:e;pA.reconcile(r,i,t)})})},getDB:function(A,e){var r,i=pA.dbs[A];if(i)return e(null,i);try{r=pA.indexedDB().open(A,pA.DB_VERSION)}catch(A){return e(A)}if(!r)return e(\\\"Unable to connect to IndexedDB\\\");r.onupgradeneeded=function(A){var e,r=A.target.result,i=A.target.transaction;(e=r.objectStoreNames.contains(pA.DB_STORE_NAME)?i.objectStore(pA.DB_STORE_NAME):r.createObjectStore(pA.DB_STORE_NAME)).indexNames.contains(\\\"timestamp\\\")||e.createIndex(\\\"timestamp\\\",\\\"timestamp\\\",{unique:!1})},r.onsuccess=function(){i=r.result,pA.dbs[A]=i,e(null,i)},r.onerror=function(A){e(this.error),A.preventDefault()}},getLocalSet:function(A,e){var r={};function i(A){return\\\".\\\"!==A&&\\\"..\\\"!==A}function f(e){return function(A){return mA.join2(e,A)}}for(var n=EA.readdir(A.mountpoint).filter(i).map(f(A.mountpoint));n.length;){var t,o=n.pop();try{t=EA.stat(o)}catch(A){return e(A)}EA.isDir(t.mode)&&n.push.apply(n,EA.readdir(o).filter(i).map(f(o))),r[o]={timestamp:t.mtime}}return e(null,{type:\\\"local\\\",entries:r})},getRemoteSet:function(A,i){var f={};pA.getDB(A.mountpoint,function(A,r){if(A)return i(A);try{var e=r.transaction([pA.DB_STORE_NAME],\\\"readonly\\\");e.onerror=function(A){i(this.error),A.preventDefault()},e.objectStore(pA.DB_STORE_NAME).index(\\\"timestamp\\\").openKeyCursor().onsuccess=function(A){var e=A.target.result;if(!e)return i(null,{type:\\\"remote\\\",db:r,entries:f});f[e.primaryKey]={timestamp:e.key},e.continue()}}catch(A){return i(A)}})},loadLocalEntry:function(A,e){var r,i;try{i=EA.lookupPath(A).node,r=EA.stat(A)}catch(A){return e(A)}return EA.isDir(r.mode)?e(null,{timestamp:r.mtime,mode:r.mode}):EA.isFile(r.mode)?(i.contents=ZA.getFileDataAsTypedArray(i),e(null,{timestamp:r.mtime,mode:r.mode,contents:i.contents})):e(new Error(\\\"node type not supported\\\"))},storeLocalEntry:function(A,e,r){try{if(EA.isDir(e.mode))EA.mkdir(A,e.mode);else{if(!EA.isFile(e.mode))return r(new Error(\\\"node type not supported\\\"));EA.writeFile(A,e.contents,{encoding:\\\"binary\\\",canOwn:!0})}EA.chmod(A,e.mode),EA.utime(A,e.timestamp,e.timestamp)}catch(A){return r(A)}r(null)},removeLocalEntry:function(A,e){try{EA.lookupPath(A);var r=EA.stat(A);EA.isDir(r.mode)?EA.rmdir(A):EA.isFile(r.mode)&&EA.unlink(A)}catch(A){return e(A)}e(null)},loadRemoteEntry:function(A,e,r){var i=A.get(e);i.onsuccess=function(A){r(null,A.target.result)},i.onerror=function(A){r(this.error),A.preventDefault()}},storeRemoteEntry:function(A,e,r,i){var f=A.put(r,e);f.onsuccess=function(){i(null)},f.onerror=function(A){i(this.error),A.preventDefault()}},removeRemoteEntry:function(A,e,r){var i=A.delete(e);i.onsuccess=function(){r(null)},i.onerror=function(A){r(this.error),A.preventDefault()}},reconcile:function(i,f,e){var n=0,t=[];Object.keys(i.entries).forEach(function(A){var e=i.entries[A],r=f.entries[A];(!r||e.timestamp>r.timestamp)&&(t.push(A),n++)});var r=[];if(Object.keys(f.entries).forEach(function(A){f.entries[A];i.entries[A]||(r.push(A),n++)}),!n)return e(null);var o=0,A=(\\\"remote\\\"===i.type?i.db:f.db).transaction([pA.DB_STORE_NAME],\\\"readwrite\\\"),a=A.objectStore(pA.DB_STORE_NAME);function c(A){return A?c.errored?void 0:(c.errored=!0,e(A)):++o>=n?e(null):void 0}A.onerror=function(A){c(this.error),A.preventDefault()},t.sort().forEach(function(r){\\\"local\\\"===f.type?pA.loadRemoteEntry(a,r,function(A,e){if(A)return c(A);pA.storeLocalEntry(r,e,c)}):pA.loadLocalEntry(r,function(A,e){if(A)return c(A);pA.storeRemoteEntry(a,r,e,c)})}),r.sort().reverse().forEach(function(A){\\\"local\\\"===f.type?pA.removeLocalEntry(A,c):pA.removeRemoteEntry(a,A,c)})}},yA={isWindows:!(bA=\\\"data:application/octet-stream;base64,AAAAAAAAAAAEAAAAAAAAABgKAAAhAAAAIgAAAPz////8////GAoAACMAAAAkAAAAAAAAAAAAAACYRAAAzEgAAMBEAADiSAAAQAAAAAAAAACYRAAAdUoAAMBEAADtSQAA2AkAAAAAAADARAAAL0oAABgKAAAAAAAAwEQAANNKAABYAAAAAAAAAMBEAAA4SwAAgAAAAAAAAADARAAAplsAAIAAAAAAAAAAQAAAAAAAAADoCQAAFwAAABgAAADA////wP///+gJAAAZAAAAGgAAAEAAAAAAAAAASAoAABsAAAAcAAAAOAAAAPj///9ICgAAHQAAAB4AAADA////wP///0gKAAAfAAAAIAAAAAAAAAA4AAAAAAAAABgKAAAhAAAAIgAAAMj////I////GAoAACMAAAAkAAAAwEQAAHNLAABICgAAAAAAAMBEAAAsTAAAOA8AAAAAAADARAAAhkwAAIAAAAAAAAAAwEQAAJdMAAA4DwAAAAAAAMBEAABbTgAAgAAAAAAAAADARAAA6kwAAKABAAAAAAAAmEQAAAVNAADARAAAHE0AADgPAAAAAAAAwEQAAMBNAACgAQAAAAAAAMBEAADcTQAAOA8AAAAAAADARAAAbE4AADgPAAAAAAAAwEQAALtOAACAAAAAAAAAAMBEAADLTgAAOA8AAAAAAADARAAADk8AAIAAAAAAAAAAwEQAAB9PAAA4DwAAAAAAAMBEAABjTwAAgAAAAAAAAADARAAAdE8AADgPAAAAAAAAwEQAAONPAACAAAAAAAAAAMBEAAD0TwAAOA8AAAAAAADARAAAT1AAAIAAAAAAAAAAwEQAAGBQAAA4DwAAAAAAAMBEAABfUQAAgAAAAAAAAADARAAAcFEAADgPAAAAAAAAwEQAAGFTAACAAAAAAAAAAMBEAAByUwAAOA8AAAAAAADARAAA41MAAIAAAAAAAAAAwEQAAPRTAAA4DwAAAAAAAMBEAABcVAAAgAAAAAAAAADARAAAbVQAADgPAAAAAAAAwEQAANVUAACAAAAAAAAAAMBEAADmVAAAOA8AAAAAAADARAAARVUAAIAAAAAAAAAAwEQAAFZVAAA4DwAAAAAAAMBEAAC0VQAAgAAAAAAAAADARAAAxVUAADgPAAAAAAAAwEQAACZWAACAAAAAAAAAAMBEAAA3VgAAOA8AAAAAAADARAAAtVYAAIAAAAAAAAAAwEQAAMZWAAA4DwAAAAAAAMBEAAAKVwAAgAAAAAAAAADARAAAG1cAADgPAAAAAAAAwEQAAF9XAACAAAAAAAAAAMBEAABwVwAAOA8AAAAAAADARAAAOFgAAIAAAAAAAAAAwEQAAElYAAA4DwAAAAAAAMBEAACNWAAAgAAAAAAAAADARAAAnlgAADgPAAAAAAAAwEQAAMRZAACAAAAAAAAAAMBEAADVWQAAOA8AAAAAAADARAAALVoAAIAAAAAAAAAAwEQAAD5aAAA4DwAAAAAAAMBEAACmWgAAgAAAAAAAAADARAAAt1oAADgPAAAAAAAAwEQAAPtaAAA4DwAAAAAAAMBEAAA/WwAAOA8AAAAAAADARAAAYGMAADgPAAAAAAAAwEQAAN9kAAA4DwAAAAAAAEhFAACfcwAASEUAAIpzAABIRQAAcHMAAEhFAABicwAASEUAAFBzAABIRQAAQXMAAJhEAAAycwAALEUAACJzAAAAAAAA+AQAACxFAAARcwAAAQAAAPgEAACYRAAA/XIAACxFAADocgAAAAAAACAFAAAsRQAA0nIAAAEAAAAgBQAAmEQAAMVyAAAsRQAAt3IAAAAAAABIBQAALEUAAKhyAAABAAAASAUAAJhEAACbcgAAmEQAALFzAABkRQAAlXQAAAAAAAABAAAAmAUAAAAAAACYRAAA1HQAAMBEAAD6dAAAOA8AAAAAAADARAAAFnYAADgPAAAAAAAAmEQAABh6AABkRQAAyXkAAAAAAAACAAAAwAUAAAIAAAD4BQAAAggAAMBEAAB/eQAAOA8AAAAAAACYRAAA93kAAMBEAAAsegAAOA8AAAAAAADARAAAdn0AADgPAAAAAAAAwEQAACN+AAAwBgAAAAAAAJhEAAA4fgAAwEQAAFp+AAAwBgAAAAAAAMBEAABxfgAAMAYAAAAAAADARAAAiH4AADAGAAAAAAAAwEQAAKR+AAAwBgAAAAAAAMBEAAC8fgAAMAYAAAAAAADARAAA2H4AADAGAAAAAAAAwEQAAPZ+AAAwBgAAAAAAAMBEAAAMfwAAMAYAAAAAAADARAAAIn8AADAGAAAAAAAAwEQAAI1/AAAwBgAAAAAAAMBEAACrfwAAMAYAAAAAAADARAAAwX8AADAGAAAAAAAAwEQAANR/AAAwBgAAAAAAAMBEAADnfwAAMAYAAAAAAADARAAABYAAADAGAAAAAAAAwEQAAB+AAAA4DwAAAAAAAMBEAABwgAAAOA8AAAAAAADARAAAtoAAADgPAAAAAAAAwEQAAPyAAAA4DwAAAAAAAMBEAABFgQAAMAYAAAAAAADARAAAWoEAADgPAAAAAAAAwEQAAKKBAAAwBgAAAAAAAMBEAAC3gQAAOA8AAAAAAADARAAA/4EAADgPAAAAAAAAwEQAAFCCAAA4DwAAAAAAAMBEAACaggAAOA8AAAAAAADARAAA6YIAADgPAAAAAAAAwEQAADqDAAA4DwAAAAAAAMBEAACDgwAAOA8AAAAAAADARAAAzIMAADgPAAAAAAAAwEQAABeEAAA4DwAAAAAAAMBEAABmhAAAOA8AAAAAAADARAAAs4QAADgPAAAAAAAAwEQAAP2EAAA4DwAAAAAAAMBEAABHhQAAMAYAAAAAAADARAAAXIUAADgPAAAAAAAAwEQAAKSFAAAwBgAAAAAAAMBEAAC5hQAAOA8AAAAAAADARAAAAYYAADgPAAAAAAAAwEQAAEeHAAC4CAAAAAAAAGRFAABZhwAAAAAAAAEAAADQCAAAAgQAAJhEAABohwAAwEQAAIyYAADoCAAAAAAAAJhEAACemAAAwEQAANWaAADoCAAAAAAAAMBEAAD8mgAA6AgAAAAAAADARAAAhLwAAOgIAAAAAAAAZEUAANvDAAAAAAAAAQAAAJgFAAAAAAAAZEUAAJzDAAAAAAAAAQAAAJgFAAAAAAAAmEQAAH3DAACYRAAAXsMAAJhEAAA/wwAAmEQAACDDAACYRAAAAcMAAJhEAADiwgAAmEQAAMPCAACYRAAApMIAAJhEAACFwgAAmEQAAGbCAACYRAAAR8IAAJhEAAAowgAAwEQAACjPAADACQAAAAAAAJhEAAAWzwAAwEQAAFLPAADACQAAAAAAAJhEAAB8zwAAmEQAAK3PAABkRQAA3s8AAAAAAAABAAAAsAkAAAP0//9kRQAADdAAAAAAAAABAAAAyAkAAAP0//9kRQAAPNAAAAAAAAABAAAAsAkAAAP0//9kRQAAa9AAAAAAAAABAAAAyAkAAAP0//9kRQAAmtAAAAMAAAACAAAA6AkAAAIAAAAYCgAAAggAAAwAAAAAAAAA6AkAABcAAAAYAAAA9P////T////oCQAAGQAAABoAAADARAAAytAAAOAJAAAAAAAAwEQAAOPQAADYCQAAAAAAAMBEAAAi0QAA4AkAAAAAAADARAAAOtEAANgJAAAAAAAAwEQAAFLRAADgCgAAAAAAAMBEAABm0QAAMA8AAAAAAADARAAAfNEAAOAKAAAAAAAAZEUAALbRAAAAAAAAAgAAAOAKAAACAAAAIAsAAAAAAABkRQAA+tEAAAAAAAABAAAAOAsAAAAAAACYRAAAENIAAGRFAAAp0gAAAAAAAAIAAADgCgAAAgAAAGALAAAAAAAAZEUAAG3SAAAAAAAAAQAAADgLAAAAAAAAZEUAAJbSAAAAAAAAAgAAAOAKAAACAAAAmAsAAAAAAABkRQAA2tIAAAAAAAABAAAAsAsAAAAAAACYRAAA8NIAAGRFAAAJ0wAAAAAAAAIAAADgCgAAAgAAANgLAAAAAAAAZEUAAE3TAAAAAAAAAQAAALALAAAAAAAAZEUAAKPUAAAAAAAAAwAAAOAKAAACAAAAGAwAAAIAAAAgDAAAAAgAAJhEAAAK1QAAmEQAAOjUAABkRQAAHdUAAAAAAAADAAAA4AoAAAIAAAAYDAAAAgAAAFAMAAAACAAAmEQAAGLVAABkRQAAhNUAAAAAAAACAAAA4AoAAAIAAAB4DAAAAAgAAJhEAADJ1QAAZEUAAN7VAAAAAAAAAgAAAOAKAAACAAAAeAwAAAAIAABkRQAAI9YAAAAAAAACAAAA4AoAAAIAAADADAAAAgAAAJhEAAA/1gAAZEUAAFTWAAAAAAAAAgAAAOAKAAACAAAAwAwAAAIAAABkRQAAcNYAAAAAAAACAAAA4AoAAAIAAADADAAAAgAAAGRFAACM1gAAAAAAAAIAAADgCgAAAgAAAMAMAAACAAAAZEUAALfWAAAAAAAAAgAAAOAKAAACAAAASA0AAAAAAACYRAAA/dYAAGRFAAAh1wAAAAAAAAIAAADgCgAAAgAAAHANAAAAAAAAmEQAAGfXAABkRQAAhtcAAAAAAAACAAAA4AoAAAIAAACYDQAAAAAAAJhEAADM1wAAZEUAAOXXAAAAAAAAAgAAAOAKAAACAAAAwA0AAAAAAACYRAAAK9gAAGRFAABE2AAAAAAAAAIAAADgCgAAAgAAAOgNAAACAAAAmEQAAFnYAABkRQAA8NgAAAAAAAACAAAA4AoAAAIAAADoDQAAAgAAAMBEAABx2AAAIA4AAAAAAABkRQAAlNgAAAAAAAACAAAA4AoAAAIAAABADgAAAgAAAJhEAAC32AAAwEQAAM7YAAAgDgAAAAAAAGRFAAAF2QAAAAAAAAIAAADgCgAAAgAAAEAOAAACAAAAZEUAACfZAAAAAAAAAgAAAOAKAAACAAAAQA4AAAIAAABkRQAASdkAAAAAAAACAAAA4AoAAAIAAABADgAAAgAAAMBEAABs2QAA4AoAAAAAAABkRQAAgtkAAAAAAAACAAAA4AoAAAIAAADoDgAAAgAAAJhEAACU2QAAZEUAAKnZAAAAAAAAAgAAAOAKAAACAAAA6A4AAAIAAADARAAAxtkAAOAKAAAAAAAAwEQAANvZAADgCgAAAAAAAJhEAADw2QAAZEUAAAnaAAAAAAAAAQAAADAPAAAAAAAAwEQAADTaAABgDwAAAAAAAJhEAADc2gAAwEQAADzbAAB4DwAAAAAAAMBEAADp2gAAiA8AAAAAAACYRAAACtsAAMBEAAAX2wAAaA8AAAAAAADARAAAHtwAAGAPAAAAAAAAwEQAAC7cAACgDwAAAAAAAMBEAABj3AAAeA8AAAAAAADARAAAP9wAAMAPAAAAAAAAwEQAAIXcAAB4DwAAAAAAABBFAACt3AAAEEUAAK/cAAAQRQAAstwAABBFAAC03AAAEEUAALbcAAAQRQAAuNwAABBFAAC63AAAEEUAALzcAAAQRQAAvtwAABBFAADA3AAAEEUAAJTSAAAQRQAAwtwAABBFAADE3AAAEEUAAMbcAADARAAAyNwAAHgPAAAAAAAAwEQAAOncAABoDwAAAAAAAAAAAABIAAAAAQAAAAIAAAABAAAAAQAAAAIAAAADAAAAAAAAAFgAAAADAAAABAAAAAEAAADQEAAAJAEAADgBAADkEAAAOAAAAAAAAABwAAAABQAAAAYAAADI////yP///3AAAAAHAAAACAAAAAAAAABgAAAACQAAAAoAAAABAAAABAAAAAEAAAABAAAAAgAAAAMAAAAFAAAABAAAAAUAAAABAAAABgAAAAIAAAAAAAAAgAAAAAsAAAAMAAAAAgAAAAMAAAANAAAABAAAAAAAAACQAAAADgAAAA8AAAAFAAAABgAAAA0AAAAHAAAAAAAAAKAAAAALAAAAEAAAAAgAAAADAAAADQAAAAkAAABAAAAAAAAAAEABAAARAAAAEgAAADgAAAD4////QAEAABMAAAAUAAAAwP///8D///9AAQAAFQAAABYAAACYEQAA5AAAALwAAADQAAAAJAEAADgBAAAMAQAA+AAAAMARAACsEQAAAAAAAJgEAAAlAAAAJgAAACcAAAADAAAAKAAAAAAAAACIBAAAKQAAACoAAAArAAAAAwAAACwAAAAAAAAAeAQAAC0AAAAuAAAALwAAAAMAAAAwAAAAAAAAAGgEAAAxAAAAMgAAAAoAAAALAAAADQAAAAwAAAAAAAAAWAQAADMAAAA0AAAANQAAAAMAAAA2AAAAAAAAAEgEAAALAAAANwAAAA0AAAAOAAAAOAAAAA8AAAAAAAAAOAQAADkAAAA6AAAAOwAAAAMAAAA8AAAAAAAAACgEAAA9AAAAPgAAABAAAAARAAAAPwAAABIAAAAAAAAAGAQAAEAAAABBAAAAQgAAAAMAAABDAAAAAAAAAAgEAAALAAAARAAAABMAAAAUAAAARQAAABUAAAAAAAAA+AMAAEYAAABHAAAASAAAAAMAAABJAAAAAAAAAOgDAABKAAAASwAAABYAAAAXAAAATAAAABgAAAAAAAAA2AMAAE0AAABOAAAATwAAAAMAAABQAAAAAAAAAMgDAAALAAAAUQAAABkAAAADAAAADQAAABoAAAAAAAAAuAMAAFIAAABTAAAAVAAAAAMAAABVAAAAAAAAAKgDAAALAAAAVgAAABsAAAADAAAADQAAABwAAAAAAAAAmAMAAFcAAABYAAAAWQAAAAMAAABaAAAAAAAAAIgDAABbAAAAXAAAAB0AAAAeAAAAXQAAAB8AAAAAAAAAeAMAAF4AAABfAAAAYAAAAAMAAABhAAAAAAAAAGgDAAALAAAAYgAAACAAAAAhAAAADQAAACIAAAAAAAAAWAMAAGMAAABkAAAAZQAAAAMAAABmAAAAAAAAAEgDAABnAAAAaAAAACMAAAAkAAAADQAAACUAAAAAAAAAOAMAAGkAAABqAAAAawAAAAMAAABsAAAAAAAAACgDAAALAAAAbQAAACYAAAADAAAADQAAACcAAAAAAAAAGAMAAG4AAABvAAAAcAAAAAMAAABxAAAAAAAAAAgDAAALAAAAcgAAACgAAAADAAAADQAAACkAAAAAAAAA+AIAAHMAAAB0AAAAdQAAAAMAAAB2AAAAAAAAAOgCAAALAAAAdwAAACoAAAArAAAADQAAACwAAAAAAAAA2AIAAHgAAAB5AAAAegAAAAMAAAB7AAAAAAAAAMgCAAB8AAAAfQAAAC0AAAAuAAAAfgAAAC8AAAAAAAAAuAIAAH8AAACAAAAAgQAAAAMAAACCAAAAAAAAAKgCAACDAAAAhAAAADAAAAAxAAAADQAAADIAAAAAAAAAmAIAAIUAAACGAAAAhwAAAAMAAACIAAAAAAAAAIgCAACJAAAAigAAADMAAAA0AAAADQAAADUAAAAAAAAAeAIAAIsAAACMAAAAjQAAAAMAAACOAAAAAAAAAGgCAACPAAAAkAAAADYAAAA3AAAADQAAADgAAAAAAAAAWAIAAJEAAACSAAAAkwAAAAMAAACUAAAAAAAAAEgCAACVAAAAlgAAADkAAAADAAAADQAAADoAAAAAAAAAOAIAAJcAAACYAAAAmQAAAAMAAACaAAAAAAAAACgCAAALAAAAmwAAADsAAAADAAAADQAAADwAAAAAAAAAGAIAAJwAAACdAAAAngAAAAMAAACfAAAAAAAAAAgCAAALAAAAoAAAAD0AAAADAAAADQAAAD4AAAAAAAAA+AEAAKEAAACiAAAAowAAAAMAAACkAAAAAAAAAOgBAAClAAAApgAAAD8AAAADAAAADQAAAEAAAAAAAAAA2AEAAKcAAACoAAAAqQAAAAMAAACqAAAAAAAAAIABAACrAAAArAAAAEEAAABCAAAADQAAAEMAAAAAAAAAcAEAAK0AAACuAAAArwAAAAMAAACwAAAAAAAAAGABAACxAAAAsgAAAEQAAABFAAAADQAAAEYAAAAAAAAAUAEAALMAAAC0AAAAtQAAAAMAAAC2AAAAAAAAAMgBAAC3AAAAuAAAALkAAAADAAAAugAAAAAAAAC4AQAAuwAAALwAAAAGAAAARwAAAEgAAAAAAAAAqAEAAL0AAAC+AAAAvwAAAAMAAADAAAAAAAAAAJABAADBAAAAwgAAAAcAAABJAAAASgAAAKNdAAAAAAAAqAQAAMMAAADEAAAAxQAAAAMAAADGAAAAAAAAALgEAADHAAAAyAAAAMkAAAADAAAAygAAAAMAAAAEAAAABQAAAAYAAACABQAAOBAAAAAFAADwDwAAAAUAAHAFAAAABQAAgAUAADAQAAAABQAAeAUAAAAFAAB4BQAAAAUAADgQAAB4BQAAKAUAAOgEAADgBAAA8A8AADgFAAAAAAAAoAUAAMsAAADMAAAAzQAAAAMAAADOAAAAAAAAALAFAADPAAAA0AAAANEAAAADAAAA0gAAAAAAAAAABgAA0wAAANQAAADVAAAAAwAAANYAAAAAAAAA6AUAANcAAADYAAAA2QAAAAMAAADaAAAAAAAAABAGAADbAAAA3AAAAN0AAAADAAAA3gAAAAAAAADIBQAA3wAAAOAAAAAAAAAAIAYAAOEAAADiAAAAAQAAAAIAAAAAAAAAOAYAAOEAAADjAAAAAwAAAAQAAAAAAAAASAYAAOEAAADkAAAABQAAAAYAAAAAAAAAWAYAAOEAAADlAAAABwAAAAgAAAAAAAAAaAYAAOEAAADmAAAACQAAAAoAAAAAAAAAeAYAAOEAAADnAAAACwAAAAwAAAAAAAAAiAYAAOEAAADoAAAADQAAAA4AAAAAAAAAmAYAAOEAAADpAAAADwAAABAAAAAAAAAAqAYAAOEAAADqAAAAEQAAABIAAAAAAAAAuAYAAOEAAADrAAAAEwAAABQAAAAAAAAAyAYAAOEAAADsAAAAFQAAABYAAAAAAAAA2AYAAOEAAADtAAAAFwAAABgAAAAAAAAA6AYAAOEAAADuAAAAGQAAABoAAAAAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAAAAAAAPgGAADhAAAA7wAAABsAAAAcAAAAAAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAAAAAAIBwAA4QAAAPAAAAAdAAAAHgAAAAAAAAAYBwAA4QAAAPEAAAAfAAAAIAAAAAAAAACYCAAA8gAAAPMAAAD0AAAAAwAAAPUAAAAAAAAAiAgAAPYAAAD3AAAA+AAAAAMAAAD5AAAAAAAAAHgIAADhAAAA+gAAACEAAAAiAAAAAAAAAGgIAAD7AAAA/AAAAP0AAAADAAAA/gAAAAAAAABYCAAA4QAAAP8AAAAjAAAAJAAAAAAAAABICAAAAAEAAAEBAAACAQAAAwAAAAMBAAAAAAAAOAgAAAQBAAAFAQAABgEAAAMAAAAHAQAAAAAAACgIAAAIAQAACQEAAAoBAAADAAAACwEAAAAAAAAYCAAADAEAAA0BAAAOAQAAAwAAAA8BAAAAAAAACAgAABABAAARAQAAEgEAAAMAAAATAQAAAAAAAPgHAAAUAQAAFQEAABYBAAADAAAAFwEAAAAAAADoBwAAGAEAABkBAAAaAQAAAwAAABsBAAAAAAAA2AcAABwBAAAdAQAAHgEAAAMAAAAfAQAAAAAAAMgHAAAgAQAAIQEAACIBAAADAAAAIwEAAAAAAAC4BwAAJAEAACUBAAAmAQAAAwAAACcBAAAAAAAAqAcAACgBAAApAQAAKgEAAAMAAAArAQAAAAAAAJgHAAAsAQAALQEAAC4BAAADAAAALwEAAAAAAACIBwAA4QAAADABAAAlAAAAJgAAAAAAAAB4BwAAMQEAADIBAAAzAQAAAwAAADQBAAAAAAAAaAcAAOEAAAA1AQAAJwAAACgAAAAAAAAAWAcAADYBAAA3AQAAOAEAAAMAAAA5AQAAAAAAAEgHAAA6AQAAOwEAADwBAAADAAAAPQEAAAAAAAA4BwAAPgEAAD8BAABAAQAAAwAAAEEBAAAAAAAAKAcAAEIBAABDAQAARAEAAAMAAABFAQAAAQAAAAEAAAABAAAAAgAAAAgAAAACAAAARgEAAAIAAABLAAAAAAAAAAAAAABbhgAAAAAAAAEAAAACAAAABAAAALsLAACKhgAABwAAAIEAAAArNwEABgAAAAAAAABjhgAABwAAAGQAAAArNwEAAAAAAKgIAABHAQAASAEAAAQAAAAFAAAAAAAAALgIAABJAQAASgEAAAMAAAADAAAAAQAAAEwAAAAAAAAA2AgAAEsBAABMAQAATQEAAAMAAAA57wAAiwQBAJMEAQCzBAEAMwUBADMHAQAAAAAAOe8AAOP5AADr+QAAC/oAAIv6AACL/AAAAAAAADnvAAA77wAAQ+8AAGPvAADj7wAA4/EAAAAAAAAAAAAAAAAAADMPAQBTDwEA0w8BANMRAQAAAAAAAAAAANMZAQDzGQEAcxoBAHMcAQAAAAAAAAAAAHMkAQCTJAEAEyUBABMnAQAAAAAA8AgAAEsBAABOAQAATwEAAAQAAAAAAAAAGgAAAAoAAAABAAAAAAAAAAAJAABLAQAAUAEAAFEBAAAFAAAA/////wIAAAACAAAAAQAAAP////8CAAAAAQAAAAEAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACEAAAAiAAAAIgAAACMAAAAjAAAAJAAAACQAAAAlAAAAKAAAAC0AAAAzAAAAOQAAAEAAAABIAAAAxQAAALkAAADJAAAAxQAAALkAAADJAAAAbgAAAJoAAAB6AAAAiQAAAIsAAACNAAAAnQAAAGsAAACLAAAAfgAAAGsAAACLAAAAfgAAAD8AAACYAAAAmAAAAG8AAACNAAAAmQAAAG8AAABbAAAAqwAAAIYAAACNAAAAeQAAAIwAAAA9AAAAmgAAAHkAAACMAAAAPQAAAJoAAABvAAAAbwAAAH0AAABuAAAAbgAAAF4AAAB8AAAAbAAAAHwAAABrAAAAfQAAAI0AAACzAAAAmQAAAH0AAABrAAAAfQAAAI0AAACzAAAAmQAAAH0AAABrAAAAfQAAAI0AAACzAAAAmQAAAH0AAACMAAAAiwAAALYAAAC2AAAAmAAAAIgAAACYAAAAiAAAAJkAAACIAAAAiwAAAG8AAACIAAAAiwAAAG8AAACbAAAAmgAAAIsAAACZAAAAiwAAAHsAAAB7AAAAPwAAAJkAAACmAAAAtwAAAIwAAACIAAAAmQAAAJoAAACmAAAAtwAAAIwAAACIAAAAmQAAAJoAAACmAAAAtwAAAIwAAACIAAAAmQAAAJoAAACqAAAAmQAAAHsAAAB7AAAAawAAAHkAAABrAAAAeQAAAKcAAACXAAAAtwAAAIwAAACXAAAAtwAAAIwAAACqAAAAmgAAAIsAAACZAAAAiwAAAHsAAAB7AAAAPwAAAHwAAACmAAAAtwAAAIwAAACIAAAAmQAAAJoAAACmAAAAtwAAAIwAAACIAAAAmQAAAJoAAACmAAAAtwAAAIwAAACIAAAAmQAAAJoAAACqAAAAmQAAAIoAAACKAAAAegAAAHkAAAB6AAAAeQAAAKcAAACXAAAAtwAAAIwAAACXAAAAtwAAAIwAAACNAAAAbwAAAIwAAACMAAAAjAAAAIwAAACKAAAAmQAAAIgAAACnAAAAmAAAAJgAAABrAAAApwAAAFsAAAB6AAAAawAAAKcAAABrAAAApwAAAFsAAABrAAAAawAAAKcAAACZAAAAmQAAAJkAAADIAAAAuQAAAKAAAACaAAAAmgAAAJoAAACMAAAAXAAAAIkAAACKAAAAjAAAAJgAAACKAAAAiwAAAJkAAABKAAAAlQAAAFwAAACLAAAAawAAAHoAAACYAAAAjAAAALMAAACmAAAAtgAAAIwAAADjAAAAegAAAMUAAACaAAAAxAAAAMQAAACnAAAAmgAAAJgAAACnAAAAtgAAALYAAACGAAAAlQAAAIgAAACZAAAAeQAAAIgAAACJAAAAqQAAAMIAAACmAAAApwAAAJoAAACnAAAAiQAAALYAAACaAAAAxAAAAKcAAACnAAAAmgAAAJgAAACnAAAAtgAAALYAAACGAAAAlQAAAIgAAACZAAAAeQAAAIgAAAB6AAAAqQAAANAAAACmAAAApwAAAJoAAACYAAAApwAAALYAAABuAAAAbgAAAHwAAAB9AAAAjAAAAJkAAAB9AAAAfwAAAIwAAABtAAAAbwAAAI8AAAB/AAAAbwAAAE8AAABsAAAAewAAAD8AAAB9AAAAbgAAAF4AAABuAAAAXwAAAE8AAAB9AAAAbwAAAG4AAABOAAAAbgAAAG8AAABvAAAAXwAAAF4AAABsAAAAewAAAGwAAAB9AAAAbgAAAHwAAABuAAAAXwAAAF4AAAB9AAAAbwAAAG8AAABPAAAAfQAAAH4AAABvAAAAbwAAAE8AAABsAAAAewAAAF0AAACZAAAAigAAAIoAAAB8AAAAigAAAF4AAADgAAAApwAAAHoAAABeAAAAigAAALYAAACaAAAAlQAAAGsAAACnAAAAmgAAAJUAAABcAAAApwAAAJoAAAC4AAAAmgAAALcAAAC4AAAAmgAAAIsAAACaAAAAmgAAAJoAAACLAAAAmgAAAJoAAACMAAAAxgAAAKkAAADGAAAAlQAAAIYAAAAAAAAAEAkAAEsBAABSAQAAUwEAAAYAAAAAAAAAAAAAACAAAAAaAAAAFQAAABEAAAANAAAACQAAAAUAAAACAAAAAAAAAP7////7////9/////P////v////6////+b////g////5v///+v////v////8/////f////7/////v///wAAAAACAAAABQAAAAkAAAANAAAAEQAAABUAAAAaAAAAIAAAAADw//+a+f//cvz//4r9//8e/v//ev7//8X+//8A////xf7//3r+//8e/v//iv3//3L8//+a+f//APD//wAAAAADAAAAAwAAAAIAAAAAAAAAAwAAAAQAAAAEAAAAAAAAAAEAAAAAAAAAAgAAAAEAAAACAAAAAAAAAAMAAAABAAAAAwAAAAIAAAADAAAAAQAAAAAAAAACAAAAAAAAAAIAAAABAAAAAwAAAAAAAAADAAAAAQAAAAMAAAACAAAAAgAAwAMAAMAEAADABQAAwAYAAMAHAADACAAAwAkAAMAKAADACwAAwAwAAMANAADADgAAwA8AAMAQAADAEQAAwBIAAMATAADAFAAAwBUAAMAWAADAFwAAwBgAAMAZAADAGgAAwBsAAMAcAADAHQAAwB4AAMAfAADAAAAAswEAAMMCAADDAwAAwwQAAMMFAADDBgAAwwcAAMMIAADDCQAAwwoAAMMLAADDDAAAww0AANMOAADDDwAAwwAADLsBAAzDAgAMwwMADMMEAAzTkCcAABQAAABDLlVURi04AAAAAAAAAAAAAAAAAN4SBJUAAAAA////////////////dCcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwCcAAAUAAAAAAAAAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAIAAAAGy8BAAAEAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAr/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPjiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwCcAADgpAAAJAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAAAAAACAAAACMzAQAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuCkAAAUAAAAAAAAAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAKzcBAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAP//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzEYAALgsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAABIAAAATAAAAFAAAABUAAAAWAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHQAAAB4AAAAfAAAAIAAAACEAAAAiAAAAIwAAACQAAAAlAAAAJgAAACcAAAAoAAAAKQAAACoAAAArAAAALAAAAC0AAAAuAAAALwAAADAAAAAxAAAAMgAAADMAAAA0AAAANQAAADYAAAA3AAAAOAAAADkAAAA6AAAAOwAAADwAAAA9AAAAPgAAAD8AAABAAAAAQQAAAEIAAABDAAAARAAAAEUAAABGAAAARwAAAEgAAABJAAAASgAAAEsAAABMAAAATQAAAE4AAABPAAAAUAAAAFEAAABSAAAAUwAAAFQAAABVAAAAVgAAAFcAAABYAAAAWQAAAFoAAABbAAAAXAAAAF0AAABeAAAAXwAAAGAAAABBAAAAQgAAAEMAAABEAAAARQAAAEYAAABHAAAASAAAAEkAAABKAAAASwAAAEwAAABNAAAATgAAAE8AAABQAAAAUQAAAFIAAABTAAAAVAAAAFUAAABWAAAAVwAAAFgAAABZAAAAWgAAAHsAAAB8AAAAfQAAAH4AAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8MgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAAHAAAAB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAAnAAAAKAAAACkAAAAqAAAAKwAAACwAAAAtAAAALgAAAC8AAAAwAAAAMQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAAAA5AAAAOgAAADsAAAA8AAAAPQAAAD4AAAA/AAAAQAAAAGEAAABiAAAAYwAAAGQAAABlAAAAZgAAAGcAAABoAAAAaQAAAGoAAABrAAAAbAAAAG0AAABuAAAAbwAAAHAAAABxAAAAcgAAAHMAAAB0AAAAdQAAAHYAAAB3AAAAeAAAAHkAAAB6AAAAWwAAAFwAAABdAAAAXgAAAF8AAABgAAAAYQAAAGIAAABjAAAAZAAAAGUAAABmAAAAZwAAAGgAAABpAAAAagAAAGsAAABsAAAAbQAAAG4AAABvAAAAcAAAAHEAAAByAAAAcwAAAHQAAAB1AAAAdgAAAHcAAAB4AAAAeQAAAHoAAAB7AAAAfAAAAH0AAAB+AAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAGQAAADoAwAAECcAAKCGAQBAQg8AgJaYAADh9QVfcIkA/wkvDwAAAADACQAAVAEAAFUBAAAAAAAA2AkAAFYBAABXAQAAAQAAAAQAAAACAAAAAwAAAAIAAAADAAAABQAAAAoAAAAFAAAABgAAAAYAAAAHAAAAAAAAAOAJAABYAQAAWQEAAAcAAAAMAAAAAwAAAAQAAAALAAAADAAAAA0AAAANAAAADgAAAAgAAAAOAAAACQAAAAgAAAAAAAAA6AkAABcAAAAYAAAA+P////j////oCQAAGQAAABoAAACANwAAlDcAAAgAAAAAAAAAAAoAAFoBAABbAQAA+P////j///8ACgAAXAEAAF0BAACwNwAAxDcAABwAAAAwAAAABAAAAAAAAAAwCgAAXgEAAF8BAAD8/////P///zAKAABgAQAAYQEAAOg3AAD8NwAADAAAAAAAAABICgAAGwAAABwAAAAEAAAA+P///0gKAAAdAAAAHgAAAPT////0////SAoAAB8AAAAgAAAAGDgAAHQKAACICgAAHAAAADAAAABAOAAALDgAAAAAAACQCgAAYgEAAGMBAAAIAAAADAAAAAMAAAAEAAAADwAAAAwAAAANAAAADQAAAA4AAAAIAAAADwAAAAoAAAAAAAAAoAoAAGQBAABlAQAACQAAAAQAAAACAAAAAwAAABAAAAADAAAABQAAAAoAAAAFAAAABgAAABAAAAALAAAAAAAAALAKAABmAQAAZwEAAAoAAAAMAAAAAwAAAAQAAAALAAAADAAAAA0AAAARAAAAEgAAAAwAAAAOAAAACQAAAAAAAADACgAAaAEAAGkBAAALAAAABAAAAAIAAAADAAAAAgAAAAMAAAAFAAAAEwAAABQAAAANAAAABgAAAAcAAAAAAAAA0AoAAGoBAABrAQAAbAEAAAEAAAAFAAAAEQAAAAAAAADwCgAAbQEAAG4BAABsAQAAAgAAAAYAAAASAAAAAAAAAAALAABvAQAAcAEAAGwBAAABAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAAAAABACwAAcQEAAHIBAABsAQAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAAFQAAABYAAAAAAAAAeAsAAHMBAAB0AQAAbAEAAAMAAAAEAAAAFwAAAAUAAAAYAAAAAQAAAAIAAAAGAAAAAAAAALgLAAB1AQAAdgEAAGwBAAAHAAAACAAAABkAAAAJAAAAGgAAAAMAAAAEAAAACgAAAAAAAADwCwAAdwEAAHgBAABsAQAAFQAAABsAAAAcAAAAHQAAAB4AAAAfAAAAAQAAAPj////wCwAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAAHAAAAAAAAAAoDAAAeQEAAHoBAABsAQAAHQAAACAAAAAhAAAAIgAAACMAAAAkAAAAAgAAAPj///8oDAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAJAAAACUAAABIAAAAOgAAACUAAABNAAAAOgAAACUAAABTAAAAAAAAACUAAABtAAAALwAAACUAAABkAAAALwAAACUAAAB5AAAAAAAAACUAAABJAAAAOgAAACUAAABNAAAAOgAAACUAAABTAAAAIAAAACUAAABwAAAAAAAAACUAAABhAAAAIAAAACUAAABiAAAAIAAAACUAAABkAAAAIAAAACUAAABIAAAAOgAAACUAAABNAAAAOgAAACUAAABTAAAAIAAAACUAAABZAAAAAAAAAEEAAABNAAAAAAAAAFAAAABNAAAAAAAAAEoAAABhAAAAbgAAAHUAAABhAAAAcgAAAHkAAAAAAAAARgAAAGUAAABiAAAAcgAAAHUAAABhAAAAcgAAAHkAAAAAAAAATQAAAGEAAAByAAAAYwAAAGgAAAAAAAAAQQAAAHAAAAByAAAAaQAAAGwAAAAAAAAATQAAAGEAAAB5AAAAAAAAAEoAAAB1AAAAbgAAAGUAAAAAAAAASgAAAHUAAABsAAAAeQAAAAAAAABBAAAAdQAAAGcAAAB1AAAAcwAAAHQAAAAAAAAAUwAAAGUAAABwAAAAdAAAAGUAAABtAAAAYgAAAGUAAAByAAAAAAAAAE8AAABjAAAAdAAAAG8AAABiAAAAZQAAAHIAAAAAAAAATgAAAG8AAAB2AAAAZQAAAG0AAABiAAAAZQAAAHIAAAAAAAAARAAAAGUAAABjAAAAZQAAAG0AAABiAAAAZQAAAHIAAAAAAAAASgAAAGEAAABuAAAAAAAAAEYAAABlAAAAYgAAAAAAAABNAAAAYQAAAHIAAAAAAAAAQQAAAHAAAAByAAAAAAAAAEoAAAB1AAAAbgAAAAAAAABKAAAAdQAAAGwAAAAAAAAAQQAAAHUAAABnAAAAAAAAAFMAAABlAAAAcAAAAAAAAABPAAAAYwAAAHQAAAAAAAAATgAAAG8AAAB2AAAAAAAAAEQAAABlAAAAYwAAAAAAAABTAAAAdQAAAG4AAABkAAAAYQAAAHkAAAAAAAAATQAAAG8AAABuAAAAZAAAAGEAAAB5AAAAAAAAAFQAAAB1AAAAZQAAAHMAAABkAAAAYQAAAHkAAAAAAAAAVwAAAGUAAABkAAAAbgAAAGUAAABzAAAAZAAAAGEAAAB5AAAAAAAAAFQAAABoAAAAdQAAAHIAAABzAAAAZAAAAGEAAAB5AAAAAAAAAEYAAAByAAAAaQAAAGQAAABhAAAAeQAAAAAAAABTAAAAYQAAAHQAAAB1AAAAcgAAAGQAAABhAAAAeQAAAAAAAABTAAAAdQAAAG4AAAAAAAAATQAAAG8AAABuAAAAAAAAAFQAAAB1AAAAZQAAAAAAAABXAAAAZQAAAGQAAAAAAAAAVAAAAGgAAAB1AAAAAAAAAEYAAAByAAAAaQAAAAAAAABTAAAAYQAAAHQAAAAAAAAAJQAAAG0AAAAvAAAAJQAAAGQAAAAvAAAAJQAAAHkAAAAlAAAAWQAAAC0AAAAlAAAAbQAAAC0AAAAlAAAAZAAAACUAAABJAAAAOgAAACUAAABNAAAAOgAAACUAAABTAAAAIAAAACUAAABwAAAAJQAAAEgAAAA6AAAAJQAAAE0AAAAlAAAASAAAADoAAAAlAAAATQAAADoAAAAlAAAAUwAAACUAAABIAAAAOgAAACUAAABNAAAAOgAAACUAAABTAAAAAAAAAFgMAAB7AQAAfAEAAGwBAAABAAAAAAAAAIAMAAB9AQAAfgEAAGwBAAACAAAAAAAAAKAMAAB/AQAAgAEAAGwBAAAlAAAAJgAAAAwAAAANAAAADgAAAA8AAAAnAAAAEAAAABEAAAAAAAAAyAwAAIEBAACCAQAAbAEAACgAAAApAAAAEgAAABMAAAAUAAAAFQAAACoAAAAWAAAAFwAAAAAAAADoDAAAgwEAAIQBAABsAQAAKwAAACwAAAAYAAAAGQAAABoAAAAbAAAALQAAABwAAAAdAAAAAAAAAAgNAACFAQAAhgEAAGwBAAAuAAAALwAAAB4AAAAfAAAAIAAAACEAAAAwAAAAIgAAACMAAAAAAAAAKA0AAIcBAACIAQAAbAEAAAMAAAAEAAAAAAAAAFANAACJAQAAigEAAGwBAAAFAAAABgAAAAAAAAB4DQAAiwEAAIwBAABsAQAAAQAAACUAAAAAAAAAoA0AAI0BAACOAQAAbAEAAAIAAAAmAAAAAAAAAMgNAACPAQAAkAEAAGwBAAATAAAABAAAACQAAAAAAAAA8A0AAJEBAACSAQAAbAEAABQAAAAFAAAAJQAAAAAAAABIDgAAkwEAAJQBAABsAQAAAwAAAAQAAAALAAAAMQAAADIAAAAMAAAAMwAAAAAAAAAQDgAAkwEAAJUBAABsAQAAAwAAAAQAAAALAAAAMQAAADIAAAAMAAAAMwAAAAAAAAB4DgAAlgEAAJcBAABsAQAABQAAAAYAAAANAAAANAAAADUAAAAOAAAANgAAAAAAAAC4DgAAmAEAAJkBAABsAQAAAAAAAMgOAACaAQAAmwEAAGwBAAAOAAAAFQAAAA8AAAAWAAAAEAAAAAIAAAAXAAAADwAAAAAAAAAQDwAAnAEAAJ0BAABsAQAANwAAADgAAAAmAAAAJwAAACgAAAAAAAAAIA8AAJ4BAACfAQAAbAEAADkAAAA6AAAAKQAAACoAAAArAAAAZgAAAGEAAABsAAAAcwAAAGUAAAAAAAAAdAAAAHIAAAB1AAAAZQAAAAAAAAAAAAAA4AoAAJMBAACgAQAAbAEAAAAAAADwDgAAkwEAAKEBAABsAQAAGAAAAAMAAAAEAAAABQAAABEAAAAZAAAAEgAAABoAAAATAAAABgAAABsAAAAQAAAAAAAAAFgOAACTAQAAogEAAGwBAAAHAAAACAAAABEAAAA7AAAAPAAAABIAAAA9AAAAAAAAAJgOAACTAQAAowEAAGwBAAAJAAAACgAAABMAAAA+AAAAPwAAABQAAABAAAAAAAAAACAOAACTAQAApAEAAGwBAAADAAAABAAAAAsAAAAxAAAAMgAAAAwAAAAzAAAAAAAAACAMAAAWAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAAAAAAFAMAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAAAAAAFAPAAClAQAApgEAAEEAAAAEAAAAAAAAAGgPAACnAQAAqAEAAKkBAACqAQAAHAAAAAYAAAApAAAABwAAAAAAAACQDwAApwEAAKsBAACpAQAAqgEAABwAAAAHAAAAKgAAAAgAAAAAAAAAoA8AAKwBAACtAQAAQgAAAAAAAACwDwAArAEAAK4BAABCAAAAAAAAAOAPAACnAQAArwEAAKkBAACqAQAAHQAAAAAAAADQDwAApwEAALABAACpAQAAqgEAAB4AAAAAAAAAYBAAAKcBAACxAQAAqQEAAKoBAAAfAAAAAAAAAHAQAACnAQAAsgEAAKkBAACqAQAAHAAAAAgAAAArAAAACQAAAAAAAAABAAEADAALAAoACwAQAAsAKAAhABgACwAUAAsAIAALAFAAIQASAAsADwALAEAAIQCgAGMABAADAAMAAgACAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgADIAIgAiACIAIgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAWAEwATABMAEwATABMAEwATABMAEwATABMAEwATABMAI2AjYCNgI2AjYCNgI2AjYCNgI2ATABMAEwATABMAEwATACNUI1QjVCNUI1QjVCMUIxQjFCMUIxQjFCMUIxQjFCMUIxQjFCMUIxQjFCMUIxQjFCMUIxQTABMAEwATABMAEwAjWCNYI1gjWCNYI1gjGCMYIxgjGCMYIxgjGCMYIxgjGCMYIxgjGCMYIxgjGCMYIxgjGCMYEwATABMAEwAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE40aGVpZjEyU3RyZWFtUmVhZGVyRQBONGhlaWYxOVN0cmVhbVJlYWRlcl9tZW1vcnlFAHByZXBhcmVfcmVhZABuIDw9IG1fcmVtYWluaW5nAHNraXBfd2l0aG91dF9hZHZhbmNpbmdfZmlsZV9wb3MAKnZhbHVlID4gMAB2YWx1ZSA8PSAweEZGAHZhbHVlIDw9IDB4RkZGRgB2YWx1ZSA8PSAweEZGRkZGRkZGAG1fcG9zaXRpb24gPT0gbV9kYXRhLnNpemUoKQBza2lwAG5CeXRlcyA+PSAwAGluc2VydAB8IABCb3g6IAAgLS0tLS0KAHNpemU6IAAgICAoaGVhZGVyIHNpemU6IAApCgB2ZXJzaW9uOiAAZmxhZ3M6IABOU3QzX18yMTViYXNpY19zdHJpbmdidWZJY05TXzExY2hhcl90cmFpdHNJY0VFTlNfOWFsbG9jYXRvckljRUVFRQBOU3QzX18yMTliYXNpY19vc3RyaW5nc3RyZWFtSWNOU18xMWNoYXJfdHJhaXRzSWNFRU5TXzlhbGxvY2F0b3JJY0VFRUUATjRoZWlmOUJveEhlYWRlckUAbV91dWlkX3R5cGUuc2l6ZSgpID09IDE2AGJveC5jYwBwcmVwZW5kX2hlYWRlcgAobV9mbGFncyAmIH4weDAwRkZGRkZGKSA9PSAwAE40aGVpZjNCb3hFAGZ0eXAgYm94IHRvbyBzbWFsbCAobGVzcyB0aGFuIDggYnl0ZXMpAG1ham9yIGJyYW5kOiAAbWlub3IgdmVyc2lvbjogAGNvbXBhdGlibGUgYnJhbmRzOiAATjRoZWlmOEJveF9mdHlwRQBNYXhpbXVtIG51bWJlciBvZiBjaGlsZCBib3hlcyAAIGV4Y2VlZGVkLgBOU3QzX18yMThiYXNpY19zdHJpbmdzdHJlYW1JY05TXzExY2hhcl90cmFpdHNJY0VFTlNfOWFsbG9jYXRvckljRUVFRQBCb3ggc2l6ZSAoACBieXRlcykgc21hbGxlciB0aGFuIGhlYWRlciBzaXplICgAIGJ5dGVzKQBTZWN1cml0eSBsaW1pdCBmb3IgbWF4aW11bSBuZXN0aW5nIG9mIGJveGVzIGhhcyBiZWVuIGV4Y2VlZGVkAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSU40aGVpZjNCb3hFTlNfOWFsbG9jYXRvcklTMl9FRUVFAHdyaXRlAGJpdHNfcGVyX2NoYW5uZWw6IAAsAE40aGVpZjhCb3hfcGl4aUUATlN0M19fMjIwX19zaGFyZWRfcHRyX2VtcGxhY2VJTjRoZWlmOEJveF9waXhpRU5TXzlhbGxvY2F0b3JJUzJfRUVFRQBwcm9maWxlIHNpemU6IABONGhlaWYxN2NvbG9yX3Byb2ZpbGVfcmF3RQBONGhlaWYxM2NvbG9yX3Byb2ZpbGVFAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSU40aGVpZjE3Y29sb3JfcHJvZmlsZV9yYXdFTlNfOWFsbG9jYXRvcklTMl9FRUVFAGNvbG91cl9wcmltYXJpZXM6IAB0cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3M6IABtYXRyaXhfY29lZmZpY2llbnRzOiAAZnVsbF9yYW5nZV9mbGFnOiAATjRoZWlmMThjb2xvcl9wcm9maWxlX25jbHhFAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSU40aGVpZjE4Y29sb3JfcHJvZmlsZV9uY2x4RU5TXzlhbGxvY2F0b3JJUzJfRUVFRQBtX2NvbG9yX3Byb2ZpbGUAY29sb3VyX3R5cGU6IABubyBjb2xvciBwcm9maWxlCgBONGhlaWY4Qm94X2NvbHJFAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSU40aGVpZjhCb3hfY29sckVOU185YWxsb2NhdG9ySVMyX0VFRUUAbG9jYXRpb246IABONGhlaWY3Qm94X3VybEUATlN0M19fMjIwX19zaGFyZWRfcHRyX2VtcGxhY2VJTjRoZWlmN0JveF91cmxFTlNfOWFsbG9jYXRvcklTMl9FRUVFAE40aGVpZjhCb3hfZHJlZkUATlN0M19fMjIwX19zaGFyZWRfcHRyX2VtcGxhY2VJTjRoZWlmOEJveF9kcmVmRU5TXzlhbGxvY2F0b3JJUzJfRUVFRQBONGhlaWY4Qm94X2RpbmZFAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSU40aGVpZjhCb3hfZGluZkVOU185YWxsb2NhdG9ySVMyX0VFRUUAZ3JvdXAgdHlwZTogAHwgZ3JvdXAgaWQ6IAB8IGVudGl0eSBJRHM6IAAgAE40aGVpZjhCb3hfZ3JwbEUATlN0M19fMjIwX19zaGFyZWRfcHRyX2VtcGxhY2VJTjRoZWlmOEJveF9ncnBsRU5TXzlhbGxvY2F0b3JJUzJfRUVFRQBudW1iZXIgb2YgZGF0YSBieXRlczogAE40aGVpZjhCb3hfaWRhdEUATlN0M19fMjIwX19zaGFyZWRfcHRyX2VtcGxhY2VJTjRoZWlmOEJveF9pZGF0RU5TXzlhbGxvY2F0b3JJUzJfRUVFRQBzZXFfcHJvZmlsZTogAHNlcV9sZXZlbF9pZHhfMDogAGhpZ2hfYml0ZGVwdGg6IAB0d2VsdmVfYml0OiAAY2hyb21hX3N1YnNhbXBsaW5nX3g6IABjaHJvbWFfc3Vic2FtcGxpbmdfeTogAGNocm9tYV9zYW1wbGVfcG9zaXRpb246IABpbml0aWFsX3ByZXNlbnRhdGlvbl9kZWxheTogAG5vdCBwcmVzZW50CgBjb25maWcgT0JVczoATjRoZWlmOEJveF9hdjFDRQBOU3QzX18yMjBfX3NoYXJlZF9wdHJfZW1wbGFjZUlONGhlaWY4Qm94X2F2MUNFTlNfOWFsbG9jYXRvcklTMl9FRUVFAGNvbmZpZ3VyYXRpb25fdmVyc2lvbjogAGdlbmVyYWxfcHJvZmlsZV9zcGFjZTogAGdlbmVyYWxfdGllcl9mbGFnOiAAZ2VuZXJhbF9wcm9maWxlX2lkYzogAGdlbmVyYWxfcHJvZmlsZV9jb21wYXRpYmlsaXR5X2ZsYWdzOiAAZ2VuZXJhbF9jb25zdHJhaW50X2luZGljYXRvcl9mbGFnczogAGdlbmVyYWxfbGV2ZWxfaWRjOiAAbWluX3NwYXRpYWxfc2VnbWVudGF0aW9uX2lkYzogAHBhcmFsbGVsaXNtX3R5cGU6IABjaHJvbWFfZm9ybWF0OiAAYml0X2RlcHRoX2x1bWE6IABiaXRfZGVwdGhfY2hyb21hOiAAYXZnX2ZyYW1lX3JhdGU6IABjb25zdGFudF9mcmFtZV9yYXRlOiAAbnVtX3RlbXBvcmFsX2xheWVyczogAHRlbXBvcmFsX2lkX25lc3RlZDogAGxlbmd0aF9zaXplOiAAPGFycmF5PgoAYXJyYXlfY29tcGxldGVuZXNzOiAATkFMX3VuaXRfdHlwZTogAE40aGVpZjhCb3hfaHZjQ0UATlN0M19fMjIwX19zaGFyZWRfcHRyX2VtcGxhY2VJTjRoZWlmOEJveF9odmNDRU5TXzlhbGxvY2F0b3JJUzJfRUVFRQByZWZlcmVuY2Ugd2l0aCB0eXBlICcAJwAgZnJvbSBJRDogACB0byBJRHM6IABONGhlaWY4Qm94X2lyZWZFAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSU40aGVpZjhCb3hfaXJlZkVOU185YWxsb2NhdG9ySVMyX0VFRUUAY2xlYW5fYXBlcnR1cmU6IAAvACB4IABvZmZzZXQ6IAAgOyAATjRoZWlmOEJveF9jbGFwRQBOU3QzX18yMjBfX3NoYXJlZF9wdHJfZW1wbGFjZUlONGhlaWY4Qm94X2NsYXBFTlNfOWFsbG9jYXRvcklTMl9FRUVFAG1pcnJvciBheGlzOiAAdmVydGljYWwKAGhvcml6b250YWwKAE40aGVpZjhCb3hfaW1pckUATlN0M19fMjIwX19zaGFyZWRfcHRyX2VtcGxhY2VJTjRoZWlmOEJveF9pbWlyRU5TXzlhbGxvY2F0b3JJUzJfRUVFRQByb3RhdGlvbjogACBkZWdyZWVzIChDQ1cpCgBONGhlaWY4Qm94X2lyb3RFAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSU40aGVpZjhCb3hfaXJvdEVOU185YWxsb2NhdG9ySVMyX0VFRUUAYXV4IHR5cGU6IABhdXggc3VidHlwZXM6IABONGhlaWY4Qm94X2F1eENFAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSU40aGVpZjhCb3hfYXV4Q0VOU185YWxsb2NhdG9ySVMyX0VFRUUAaW1hZ2Ugd2lkdGg6IABpbWFnZSBoZWlnaHQ6IABONGhlaWY4Qm94X2lzcGVFAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSU40aGVpZjhCb3hfaXNwZUVOU185YWxsb2NhdG9ySVMyX0VFRUUAYXNzb2NpYXRpb25zIGZvciBpdGVtIElEOiAAcHJvcGVydHkgaW5kZXg6IAAgKGVzc2VudGlhbDogAE40aGVpZjhCb3hfaXBtYUUATlN0M19fMjIwX19zaGFyZWRfcHRyX2VtcGxhY2VJTjRoZWlmOEJveF9pcG1hRU5TXzlhbGxvY2F0b3JJUzJfRUVFRQBONGhlaWY4Qm94X2lwY29FAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSU40aGVpZjhCb3hfaXBjb0VOU185YWxsb2NhdG9ySVMyX0VFRUUATjRoZWlmOEJveF9pcHJwRQBOU3QzX18yMjBfX3NoYXJlZF9wdHJfZW1wbGFjZUlONGhlaWY4Qm94X2lwcnBFTlNfOWFsbG9jYXRvcklTMl9FRUVFAG1pbWUAdXJpIABpdGVtX0lEOiAAaXRlbV9wcm90ZWN0aW9uX2luZGV4OiAAaXRlbV90eXBlOiAAaXRlbV9uYW1lOiAAY29udGVudF90eXBlOiAAY29udGVudF9lbmNvZGluZzogAGl0ZW0gdXJpIHR5cGU6IABoaWRkZW4gaXRlbTogAE40aGVpZjhCb3hfaW5mZUUATlN0M19fMjIwX19zaGFyZWRfcHRyX2VtcGxhY2VJTjRoZWlmOEJveF9pbmZlRU5TXzlhbGxvY2F0b3JJUzJfRUVFRQBONGhlaWY4Qm94X2lpbmZFAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSU40aGVpZjhCb3hfaWluZkVOU185YWxsb2NhdG9ySVMyX0VFRUUAaWxvYyBib3ggY29udGFpbnMgACBpdGVtcywgd2hpY2ggZXhjZWVkcyB0aGUgc2VjdXJpdHkgbGltaXQgb2YgACBpdGVtcy4ATnVtYmVyIG9mIGV4dGVudHMgaW4gaWxvYyBib3ggKAApIGV4Y2VlZHMgc2VjdXJpdHkgbGltaXQgKABpdGVtIElEOiAAICBjb25zdHJ1Y3Rpb24gbWV0aG9kOiAAICBkYXRhX3JlZmVyZW5jZV9pbmRleDogACAgYmFzZV9vZmZzZXQ6IAAgIGV4dGVudHM6IAA7aW5kZXg9AE40aGVpZjhCb3hfaWxvY0UATlN0M19fMjIwX19zaGFyZWRfcHRyX2VtcGxhY2VJTjRoZWlmOEJveF9pbG9jRU5TXzlhbGxvY2F0b3JJUzJfRUVFRQBtX2l0ZW1fSUQgPD0gMHhGRkZGAE40aGVpZjhCb3hfcGl0bUUATlN0M19fMjIwX19zaGFyZWRfcHRyX2VtcGxhY2VJTjRoZWlmOEJveF9waXRtRU5TXzlhbGxvY2F0b3JJUzJfRUVFRQBwcmVfZGVmaW5lZDogAGhhbmRsZXJfdHlwZTogAG5hbWU6IABONGhlaWY4Qm94X2hkbHJFAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSU40aGVpZjhCb3hfaGRsckVOU185YWxsb2NhdG9ySVMyX0VFRUUATlN0M19fMjIwX19zaGFyZWRfcHRyX2VtcGxhY2VJTjRoZWlmOEJveF9tZXRhRU5TXzlhbGxvY2F0b3JJUzJfRUVFRQBOU3QzX18yMjBfX3NoYXJlZF9wdHJfZW1wbGFjZUlONGhlaWY4Qm94X2Z0eXBFTlNfOWFsbG9jYXRvcklTMl9FRUVFAEJveCBzaXplIAAgZXhjZWVkcyBzZWN1cml0eSBsaW1pdC4ATjRoZWlmOEJveF9tZXRhRQBpbG9jIGJveCBjb250YWluZWQgACBieXRlcywgdG90YWwgbWVtb3J5IHNpemUgd291bGQgYmUgACBieXRlcywgZXhjZWVkaW5nIHRoZSBzZWN1cml0eSBsaW1pdCBvZiAAIGJ5dGVzAGlsb2MgZGF0YSBwb2ludGVycyBvdXQgb2YgYWxsb3dlZCByYW5nZQBFeHRlbnQgaW4gaWxvYyBib3ggcmVmZXJlbmNlcyBkYXRhIG91dHNpZGUgb2YgZmlsZSBib3VuZHMgAChwb2ludHMgdG8gZmlsZSBwb3NpdGlvbiAAc3VjY2VzcwByZWFkX2RhdGEAaWRhdCBib3ggcmVmZXJlbmNlZCBpbiBpcmVmIGJveCBpcyBub3QgcHJlc2VudCBpbiBmaWxlAEl0ZW0gY29uc3RydWN0aW9uIG1ldGhvZCAAIG5vdCBpbXBsZW1lbnRlZABpZGF0IGJveCBjb250YWluZWQgAEl0ZW0gKElEPQApIGhhcyBubyBwcm9wZXJ0aWVzIGFzc2lnbmVkIHRvIGl0IGluIGlwbWEgYm94AE5vbmV4aXN0aW5nIHByb3BlcnR5IChpbmRleD0AKSBmb3IgaXRlbSAAIElEPQAgcmVmZXJlbmNlZCBpbiBpcG1hIGJveABVbmtub3duIGVycm9yAGVycm9yLmNjAGdldF9lcnJvcl9zdHJpbmcAQ29sb3IgcHJvZmlsZSBkb2VzIG5vdCBleGlzdABFcnJvciBkdXJpbmcgZW5jb2Rpbmcgb3Igd3JpdGluZyBvdXRwdXQgZmlsZQBFbmNvZGVyIHBsdWdpbiBnZW5lcmF0ZWQgYW4gZXJyb3IARGVjb2RlciBwbHVnaW4gZ2VuZXJhdGVkIGFuIGVycm9yAE1lbW9yeSBhbGxvY2F0aW9uIGVycm9yAFVzYWdlIGVycm9yAFVuc3VwcG9ydGVkIGZlYXR1cmUAVW5zdXBwb3J0ZWQgZmlsZS10eXBlAEludmFsaWQgaW5wdXQASW5wdXQgZmlsZSBkb2VzIG5vdCBleGlzdABDYW5ub3Qgd3JpdGUgb3V0cHV0IGRhdGEAVW5zdXBwb3J0ZWQgYml0IGRlcHRoAFVuc3VwcG9ydGVkIGl0ZW0gY29uc3RydWN0aW9uIG1ldGhvZABVbnN1cHBvcnRlZCBjb2xvciBjb252ZXJzaW9uAFVuc3VwcG9ydGVkIGRhdGEgdmVyc2lvbgBVbnN1cHBvcnRlZCBpbWFnZSB0eXBlAFVuc3VwcG9ydGVkIGNvZGVjAEludmFsaWQgcGFyYW1ldGVyIHZhbHVlAFVuc3VwcG9ydGVkIHBhcmFtZXRlcgBUaGUgdmVyc2lvbiBvZiB0aGUgcGFzc2VkIHdyaXRlciBpcyBub3Qgc3VwcG9ydGVkAFRoZSB2ZXJzaW9uIG9mIHRoZSBwYXNzZWQgcGx1Z2luIGlzIG5vdCBzdXBwb3J0ZWQATm9uLWV4aXN0aW5nIGltYWdlIGNoYW5uZWwgcmVmZXJlbmNlZABOVUxMIGFyZ3VtZW50IHJlY2VpdmVkAE5vbi1leGlzdGluZyBpdGVtIElEIHJlZmVyZW5jZWQAU2VjdXJpdHkgbGltaXQgZXhjZWVkZWQASW52YWxpZCBwaXhpIGJveABJbnZhbGlkIGltYWdlIHNpemUASW52YWxpZCBmcmFjdGlvbmFsIG51bWJlcgBXcm9uZyB0aWxlIGltYWdlIGNocm9tYSBmb3JtYXQAVW5rbm93biBjb2xvciBwcm9maWxlIHR5cGUATm8gb3IgaW52YWxpZCBwcmltYXJ5IGl0ZW0AVHlwZSBvZiBhdXhpbGlhcnkgaW1hZ2UgdW5zcGVjaWZpZWQAT3ZlcmxheSBpbWFnZSBvdXRzaWRlIG9mIGNhbnZhcyBhcmVhAEludmFsaWQgb3ZlcmxheSBkYXRhAEludmFsaWQgY2xlYW4tYXBlcnR1cmUgc3BlY2lmaWNhdGlvbgBJdGVtIGhhcyBubyBkYXRhAE5vIHByb3BlcnRpZXMgYXNzaWduZWQgdG8gaXRlbQAnaXBtYScgYm94IHJlZmVyZW5jZXMgYSBub24tZXhpc3RpbmcgcHJvcGVydHkATm90IGEgJ3BpY3QnIGhhbmRsZXIATm8gJ2luZmUnIGJveABObyAnaXJlZicgYm94AE5vICdpcHJwJyBib3gATm8gJ2lpbmYnIGJveABObyAnaWxvYycgYm94AE5vICdpcG1hJyBib3gATm8gJ2lwY28nIGJveABObyAncGl0bScgYm94AE5vICdhdjFDJyBib3gATm8gJ2h2Y0MnIGJveABObyAnaGRscicgYm94AE5vICdtZXRhJyBib3gATm8gJ2lkYXQnIGJveABObyAnZnR5cCcgYm94AE1pc3NpbmcgZ3JpZCBpbWFnZXMASW52YWxpZCBncmlkIGRhdGEASW52YWxpZCBib3ggc2l6ZQBVbmV4cGVjdGVkIGVuZCBvZiBmaWxlAFVuc3BlY2lmaWVkADogAEZpbGUgZG9lcyBub3QgaW5jbHVkZSBhbnkgc3VwcG9ydGVkIGJyYW5kcy4KAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSU40aGVpZjE5U3RyZWFtUmVhZGVyX21lbW9yeUVOU185YWxsb2NhdG9ySVMyX0VFRUUAaGVpZl9maWxlLmNjAEl0ZW0gd2l0aCBJRCAAIGhhcyBubyBjb21wcmVzc2VkIGRhdGEAZ2V0X2NvbXByZXNzZWRfaW1hZ2VfZGF0YQBoZWlmX2ltYWdlLmNjAGNocm9tYV9oX3N1YnNhbXBsaW5nAGNocm9tYV92X3N1YnNhbXBsaW5nAG51bV9pbnRlcmxlYXZlZF9waXhlbHNfcGVyX3BsYW5lAHdpZHRoID49IDAAYWxsb2MAaGVpZ2h0ID49IDAAYml0X2RlcHRoID49IDEAYml0X2RlcHRoIDw9IDMyAG1fYml0X2RlcHRoIDw9IDE2AGJwcCA8PSAyNTUAZ2V0X3N0b3JhZ2VfYml0c19wZXJfcGl4ZWwAaXNfY2hyb21hX3dpdGhfYWxwaGEATlN0M19fMjIwX19zaGFyZWRfcHRyX2VtcGxhY2VJTjRoZWlmMTRIZWlmUGl4ZWxJbWFnZUVOU185YWxsb2NhdG9ySVMyX0VFRUUAQ2FuIGN1cnJlbnRseSBvbmx5IG1pcnJvciBpbWFnZXMgd2l0aCA4IGJpdHMgcGVyIHBpeGVsAENhbiBjdXJyZW50bHkgb25seSBmaWxsIGltYWdlcyB3aXRoIDggYml0cyBwZXIgcGl4ZWwAZmlsbF9SR0JfMTZiaXQAaW5fdyA+PSAwAG92ZXJsYXkAaW5faCA+PSAwAG91dF93ID49IDAAb3V0X2ggPj0gMABPdmVybGF5IGltYWdlIG91dHNpZGUgb2YgcmlnaHQgb3IgYm90dG9tIGNhbnZhcyBib3JkZXIAT3ZlcmxheSBpbWFnZSBvdXRzaWRlIG9mIGxlZnQgb3IgdG9wIGNhbnZhcyBib3JkZXIAaGVpZl9nZXRfdmVyc2lvbgBpaQBoZWlmX2dldF92ZXJzaW9uX251bWJlcgBoZWlmX2NvbnRleHRfYWxsb2MAaGVpZl9jb250ZXh0X2ZyZWUAdmlpAGhlaWZfY29udGV4dF9yZWFkX2Zyb21fbWVtb3J5AGlpaWkAaGVpZl9jb250ZXh0X2dldF9udW1iZXJfb2ZfdG9wX2xldmVsX2ltYWdlcwBpaWkAaGVpZl9qc19jb250ZXh0X2dldF9saXN0X29mX3RvcF9sZXZlbF9pbWFnZV9JRHMAaGVpZl9qc19jb250ZXh0X2dldF9pbWFnZV9oYW5kbGUAaGVpZl9qc19kZWNvZGVfaW1hZ2UAaWlpaWkAaGVpZl9pbWFnZV9oYW5kbGVfcmVsZWFzZQBoZWlmX2Vycm9yX2NvZGUAaGVpZl9lcnJvcl9PawBoZWlmX2Vycm9yX0lucHV0X2RvZXNfbm90X2V4aXN0AGhlaWZfZXJyb3JfSW52YWxpZF9pbnB1dABoZWlmX2Vycm9yX1Vuc3VwcG9ydGVkX2ZpbGV0eXBlAGhlaWZfZXJyb3JfVW5zdXBwb3J0ZWRfZmVhdHVyZQBoZWlmX2Vycm9yX1VzYWdlX2Vycm9yAGhlaWZfZXJyb3JfTWVtb3J5X2FsbG9jYXRpb25fZXJyb3IAaGVpZl9lcnJvcl9EZWNvZGVyX3BsdWdpbl9lcnJvcgBoZWlmX2Vycm9yX0VuY29kZXJfcGx1Z2luX2Vycm9yAGhlaWZfZXJyb3JfRW5jb2RpbmdfZXJyb3IAaGVpZl9lcnJvcl9Db2xvcl9wcm9maWxlX2RvZXNfbm90X2V4aXN0AGhlaWZfc3ViZXJyb3JfY29kZQBoZWlmX3N1YmVycm9yX1Vuc3BlY2lmaWVkAGhlaWZfc3ViZXJyb3JfQ2Fubm90X3dyaXRlX291dHB1dF9kYXRhAGhlaWZfc3ViZXJyb3JfRW5kX29mX2RhdGEAaGVpZl9zdWJlcnJvcl9JbnZhbGlkX2JveF9zaXplAGhlaWZfc3ViZXJyb3JfTm9fZnR5cF9ib3gAaGVpZl9zdWJlcnJvcl9Ob19pZGF0X2JveABoZWlmX3N1YmVycm9yX05vX21ldGFfYm94AGhlaWZfc3ViZXJyb3JfTm9faGRscl9ib3gAaGVpZl9zdWJlcnJvcl9Ob19odmNDX2JveABoZWlmX3N1YmVycm9yX05vX3BpdG1fYm94AGhlaWZfc3ViZXJyb3JfTm9faXBjb19ib3gAaGVpZl9zdWJlcnJvcl9Ob19pcG1hX2JveABoZWlmX3N1YmVycm9yX05vX2lsb2NfYm94AGhlaWZfc3ViZXJyb3JfTm9faWluZl9ib3gAaGVpZl9zdWJlcnJvcl9Ob19pcHJwX2JveABoZWlmX3N1YmVycm9yX05vX2lyZWZfYm94AGhlaWZfc3ViZXJyb3JfTm9fcGljdF9oYW5kbGVyAGhlaWZfc3ViZXJyb3JfSXBtYV9ib3hfcmVmZXJlbmNlc19ub25leGlzdGluZ19wcm9wZXJ0eQBoZWlmX3N1YmVycm9yX05vX3Byb3BlcnRpZXNfYXNzaWduZWRfdG9faXRlbQBoZWlmX3N1YmVycm9yX05vX2l0ZW1fZGF0YQBoZWlmX3N1YmVycm9yX0ludmFsaWRfZ3JpZF9kYXRhAGhlaWZfc3ViZXJyb3JfTWlzc2luZ19ncmlkX2ltYWdlcwBoZWlmX3N1YmVycm9yX05vX2F2MUNfYm94AGhlaWZfc3ViZXJyb3JfSW52YWxpZF9jbGVhbl9hcGVydHVyZQBoZWlmX3N1YmVycm9yX0ludmFsaWRfb3ZlcmxheV9kYXRhAGhlaWZfc3ViZXJyb3JfT3ZlcmxheV9pbWFnZV9vdXRzaWRlX29mX2NhbnZhcwBoZWlmX3N1YmVycm9yX0F1eGlsaWFyeV9pbWFnZV90eXBlX3Vuc3BlY2lmaWVkAGhlaWZfc3ViZXJyb3JfTm9fb3JfaW52YWxpZF9wcmltYXJ5X2l0ZW0AaGVpZl9zdWJlcnJvcl9Ob19pbmZlX2JveABoZWlmX3N1YmVycm9yX1NlY3VyaXR5X2xpbWl0X2V4Y2VlZGVkAGhlaWZfc3ViZXJyb3JfVW5rbm93bl9jb2xvcl9wcm9maWxlX3R5cGUAaGVpZl9zdWJlcnJvcl9Xcm9uZ190aWxlX2ltYWdlX2Nocm9tYV9mb3JtYXQAaGVpZl9zdWJlcnJvcl9JbnZhbGlkX2ZyYWN0aW9uYWxfbnVtYmVyAGhlaWZfc3ViZXJyb3JfSW52YWxpZF9pbWFnZV9zaXplAGhlaWZfc3ViZXJyb3JfTm9uZXhpc3RpbmdfaXRlbV9yZWZlcmVuY2VkAGhlaWZfc3ViZXJyb3JfTnVsbF9wb2ludGVyX2FyZ3VtZW50AGhlaWZfc3ViZXJyb3JfTm9uZXhpc3RpbmdfaW1hZ2VfY2hhbm5lbF9yZWZlcmVuY2VkAGhlaWZfc3ViZXJyb3JfVW5zdXBwb3J0ZWRfcGx1Z2luX3ZlcnNpb24AaGVpZl9zdWJlcnJvcl9VbnN1cHBvcnRlZF93cml0ZXJfdmVyc2lvbgBoZWlmX3N1YmVycm9yX1Vuc3VwcG9ydGVkX3BhcmFtZXRlcgBoZWlmX3N1YmVycm9yX0ludmFsaWRfcGFyYW1ldGVyX3ZhbHVlAGhlaWZfc3ViZXJyb3JfSW52YWxpZF9waXhpX2JveABoZWlmX3N1YmVycm9yX1Vuc3VwcG9ydGVkX2NvZGVjAGhlaWZfc3ViZXJyb3JfVW5zdXBwb3J0ZWRfaW1hZ2VfdHlwZQBoZWlmX3N1YmVycm9yX1Vuc3VwcG9ydGVkX2RhdGFfdmVyc2lvbgBoZWlmX3N1YmVycm9yX1Vuc3VwcG9ydGVkX2NvbG9yX2NvbnZlcnNpb24AaGVpZl9zdWJlcnJvcl9VbnN1cHBvcnRlZF9pdGVtX2NvbnN0cnVjdGlvbl9tZXRob2QAaGVpZl9zdWJlcnJvcl9VbnN1cHBvcnRlZF9iaXRfZGVwdGgAaGVpZl9jb21wcmVzc2lvbl9mb3JtYXQAaGVpZl9jb21wcmVzc2lvbl91bmRlZmluZWQAaGVpZl9jb21wcmVzc2lvbl9IRVZDAGhlaWZfY29tcHJlc3Npb25fQVZDAGhlaWZfY29tcHJlc3Npb25fSlBFRwBoZWlmX2NvbXByZXNzaW9uX0FWMQBoZWlmX2Nocm9tYQBoZWlmX2Nocm9tYV91bmRlZmluZWQAaGVpZl9jaHJvbWFfbW9ub2Nocm9tZQBoZWlmX2Nocm9tYV80MjAAaGVpZl9jaHJvbWFfNDIyAGhlaWZfY2hyb21hXzQ0NABoZWlmX2Nocm9tYV9pbnRlcmxlYXZlZF9SR0IAaGVpZl9jaHJvbWFfaW50ZXJsZWF2ZWRfUkdCQQBoZWlmX2Nocm9tYV9pbnRlcmxlYXZlZF9SUkdHQkJfQkUAaGVpZl9jaHJvbWFfaW50ZXJsZWF2ZWRfUlJHR0JCQUFfQkUAaGVpZl9jaHJvbWFfaW50ZXJsZWF2ZWRfUlJHR0JCX0xFAGhlaWZfY2hyb21hX2ludGVybGVhdmVkX1JSR0dCQkFBX0xFAGhlaWZfY2hyb21hX2ludGVybGVhdmVkXzI0Yml0AGhlaWZfY2hyb21hX2ludGVybGVhdmVkXzMyYml0AGhlaWZfY29sb3JzcGFjZQBoZWlmX2NvbG9yc3BhY2VfdW5kZWZpbmVkAGhlaWZfY29sb3JzcGFjZV9ZQ2JDcgBoZWlmX2NvbG9yc3BhY2VfUkdCAGhlaWZfY29sb3JzcGFjZV9tb25vY2hyb21lAGhlaWZfY2hhbm5lbABoZWlmX2NoYW5uZWxfWQBoZWlmX2NoYW5uZWxfQ3IAaGVpZl9jaGFubmVsX0NiAGhlaWZfY2hhbm5lbF9SAGhlaWZfY2hhbm5lbF9HAGhlaWZfY2hhbm5lbF9CAGhlaWZfY2hhbm5lbF9BbHBoYQBoZWlmX2NoYW5uZWxfaW50ZXJsZWF2ZWQAaGVpZl9jb250ZXh0AHYAdmkAaGVpZl9pbWFnZV9oYW5kbGUAaGVpZl9pbWFnZQBoZWlmX2Vycm9yAGkAY29kZQB2aWlpAHN1YmNvZGUAMTBoZWlmX2Vycm9yAFBLMTBoZWlmX2ltYWdlAFAxMGhlaWZfaW1hZ2UAMTBoZWlmX2ltYWdlAFBLMTdoZWlmX2ltYWdlX2hhbmRsZQBQMTdoZWlmX2ltYWdlX2hhbmRsZQAxN2hlaWZfaW1hZ2VfaGFuZGxlAFBLMTJoZWlmX2NvbnRleHQAUDEyaGVpZl9jb250ZXh0ADEyaGVpZl9jb250ZXh0ADEyaGVpZl9jaGFubmVsADE1aGVpZl9jb2xvcnNwYWNlADExaGVpZl9jaHJvbWEAMjNoZWlmX2NvbXByZXNzaW9uX2Zvcm1hdAAxOGhlaWZfc3ViZXJyb3JfY29kZQAxNWhlaWZfZXJyb3JfY29kZQBOMTBlbXNjcmlwdGVuM3ZhbEUAaXNfcHJpbWFyeQB0aHVtYm5haWxzAHdpZHRoAGhlaWdodABjaHJvbWEAY29sb3JzcGFjZQBoZWlmX2ltYWdlX2dldF9jaHJvbWFfZm9ybWF0KGltYWdlKSA9PSBoZWlmX2Nocm9tYV9pbnRlcmxlYXZlZF8yNGJpdAAuL2hlaWZfZW1zY3JpcHRlbi5oAGhlaWZfaW1hZ2VfZ2V0X2Nocm9tYV9mb3JtYXQoaW1hZ2UpID09IGhlaWZfY2hyb21hX21vbm9jaHJvbWUAZGF0YQBOU3QzX18yMTJiYXNpY19zdHJpbmdJY05TXzExY2hhcl90cmFpdHNJY0VFTlNfOWFsbG9jYXRvckljRUVFRQBOU3QzX18yMjFfX2Jhc2ljX3N0cmluZ19jb21tb25JTGIxRUVFAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSU40aGVpZjExSGVpZkNvbnRleHRFTlNfOWFsbG9jYXRvcklTMl9FRUVFADEuMTAuMABTdWNjZXNzAExlc3MgdGhhbiA4IGJ5dGVzIG9mIGRhdGEAR3JpZCBpbWFnZSBkYXRhIGluY29tcGxldGUACgBPdmVybGF5IGltYWdlIGRhdGEgaW5jb21wbGV0ZQBPdmVybGF5IGltYWdlIGRhdGEgdmVyc2lvbiAAIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQAeABpbWFnZV9pbmRleCA8IG1fb2Zmc2V0cy5zaXplKCkAaGVpZl9jb250ZXh0LmNjAGdldF9vZmZzZXQATlN0M19fMjIwX19zaGFyZWRfcHRyX2VtcGxhY2VJTjRoZWlmOEhlaWZGaWxlRU5TXzlhbGxvY2F0b3JJUzJfRUVFRQBodmMxAGdyaWQAaWRlbgBpb3ZsAGF2MDEAJ3BpdG0nIGJveCByZWZlcmVuY2VzIGEgbm9uLWV4aXN0aW5nIGltYWdlAEltYWdlIHNpemUgACBleGNlZWRzIHRoZSBtYXhpbXVtIGltYWdlIHNpemUgAFRvbyBtYW55IHRodW1ibmFpbCByZWZlcmVuY2VzAFRodW1ibmFpbCByZWZlcmVuY2VzIGEgbm9uLWV4aXN0aW5nIGltYWdlAFRodW1ibmFpbCByZWZlcmVuY2VzIGFub3RoZXIgdGh1bWJuYWlsAFJlY3Vyc2l2ZSB0aHVtYm5haWwgaW1hZ2UgZGV0ZWN0ZWQATm8gYXV4QyBwcm9wZXJ0eSBmb3IgaW1hZ2UgAFRvbyBtYW55IGF1eGlsaWFyeSBpbWFnZSByZWZlcmVuY2VzAHVybjptcGVnOmF2YzoyMDE1OmF1eGlkOjEAdXJuOm1wZWc6aGV2YzoyMDE1OmF1eGlkOjEAdXJuOm1wZWc6bXBlZ0I6Y2ljcDpzeXN0ZW1zOmF1eGlsaWFyeTphbHBoYQBOb24tZXhpc3RpbmcgYWxwaGEgaW1hZ2UgcmVmZXJlbmNlZABSZWN1cnNpdmUgYWxwaGEgaW1hZ2UgZGV0ZWN0ZWQAdXJuOm1wZWc6aGV2YzoyMDE1OmF1eGlkOjIAdXJuOm1wZWc6bXBlZ0I6Y2ljcDpzeXN0ZW1zOmF1eGlsaWFyeTpkZXB0aABOb24tZXhpc3RpbmcgZGVwdGggaW1hZ2UgcmVmZXJlbmNlZABSZWN1cnNpdmUgZGVwdGggaW1hZ2UgZGV0ZWN0ZWQATm9uLWV4aXN0aW5nIGF1eCBpbWFnZSByZWZlcmVuY2VkAFJlY3Vyc2l2ZSBhdXggaW1hZ2UgZGV0ZWN0ZWQATm8gaHZjQyBwcm9wZXJ0eSBpbiBodmMxIHR5cGUgaW1hZ2UATWV0YWRhdGEgbm90IGNvcnJlY3RseSBhc3NpZ25lZCB0byBpbWFnZQBNZXRhZGF0YSBhc3NpZ25lZCB0byBub24tZXhpc3RpbmcgaW1hZ2UATlN0M19fMjIwX19zaGFyZWRfcHRyX2VtcGxhY2VJTjRoZWlmMTNJbWFnZU1ldGFkYXRhRU5TXzlhbGxvY2F0b3JJUzJfRUVFRQBONGhlaWYzNlNFSU1lc3NhZ2VfZGVwdGhfcmVwcmVzZW50YXRpb25faW5mb0UAMzBoZWlmX2RlcHRoX3JlcHJlc2VudGF0aW9uX2luZm8ATjRoZWlmMTBTRUlNZXNzYWdlRQBOU3QzX18yMjBfX3NoYXJlZF9wdHJfZW1wbGFjZUlONGhlaWYxMUhlaWZDb250ZXh0NUltYWdlRU5TXzlhbGxvY2F0b3JJUzNfRUVFRQBpbWdpbmZvAGRlY29kZV9pbWFnZV9wbGFuYXIAaW1nX3dpZHRoID49IDAAaW1nX2hlaWdodCA+PSAwAE5vIGlyZWYgYm94IGF2YWlsYWJsZSwgYnV0IG5lZWRlZCBmb3IgaW92bCBpbWFnZQBOdW1iZXIgb2YgaW1hZ2Ugb2Zmc2V0cyBkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIGltYWdlIHJlZmVyZW5jZXMATm8gaXJlZiBib3ggYXZhaWxhYmxlLCBidXQgbmVlZGVkIGZvciBpZGVuIGltYWdlACdpZGVuJyBpbWFnZSB3aXRoIG1vcmUgdGhhbiBvbmUgcmVmZXJlbmNlIGltYWdlAE5vIGlyZWYgYm94IGF2YWlsYWJsZSwgYnV0IG5lZWRlZCBmb3IgZ3JpZCBpbWFnZQBtX3Jvd3MgPD0gMjU2AGdldF9yb3dzAG1fY29sdW1ucyA8PSAyNTYAZ2V0X2NvbHVtbnMAVGlsZWQgaW1hZ2Ugd2l0aCAAPQAgdGlsZXMsIGJ1dCBvbmx5IAAgdGlsZSBpbWFnZXMgaW4gZmlsZQBUaWxlIGltYWdlIElEPQAgaXMgbm90IGEgcHJvcGVyIGltYWdlLgAhaW1hZ2VfcmVmZXJlbmNlcy5lbXB0eSgpAGRlY29kZV9mdWxsX2dyaWRfaW1hZ2UATm8gcGl4aSBpbmZvcm1hdGlvbiBmb3IgbHVtYSBjaGFubmVsLgBEaWZmZXJlbnQgbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsIGluIGVhY2ggY2hhbm5lbC4AVW5leGlzdGluZyBncmlkIGltYWdlIHJlZmVyZW5jZWQAc3JjX3dpZHRoID49IDAAZGVjb2RlX2FuZF9wYXN0ZV90aWxlX2ltYWdlAHNyY19oZWlnaHQgPj0gMABJbWFnZSB0aWxlIGhhcyBkaWZmZXJlbnQgY2hyb21hIGZvcm1hdCB0aGFuIGNvbWJpbmVkIGltYWdlAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSU40aGVpZjM2U0VJTWVzc2FnZV9kZXB0aF9yZXByZXNlbnRhdGlvbl9pbmZvRU5TXzlhbGxvY2F0b3JJUzJfRUVFRQBTdWNjZXNzAHdhbnRfYWxwaGEgJiYgIWhhc19hbHBoYQBoZWlmX2NvbG9yY29udmVyc2lvbi5jYwBjb252ZXJ0X2NvbG9yc3BhY2UAMThPcF9SR0JfdG9fUkdCMjRfMzIATjRoZWlmMjRDb2xvckNvbnZlcnNpb25PcGVyYXRpb25FADIwT3BfWUNiQ3I0MjBfdG9fUkdCMjQAMjBPcF9ZQ2JDcjQyMF90b19SR0IzMgAyNU9wX1JHQl9IRFJfdG9fUlJHR0JCYWFfQkUAMjFPcF9SR0JfdG9fUlJHR0JCYWFfQkUAMjVPcF9SUkdHQkJhYV9CRV90b19SR0JfSERSADI3T3BfUlJHR0JCYWFfc3dhcF9lbmRpYW5uZXNzADE5T3BfbW9ub190b19ZQ2JDcjQyMAAxOU9wX21vbm9fdG9fUkdCMjRfMzIAMjBPcF9SR0IyNF8zMl90b19ZQ2JDcgB0YXJnZXRfc3RhdGUubmNseF9wcm9maWxlAHRhcmdldF9zdGF0ZS5uY2x4X3Byb2ZpbGUtPmdldF9tYXRyaXhfY29lZmZpY2llbnRzKCkgPT0gMAAyN09wX1JHQjI0XzMyX3RvX1lDYkNyNDQ0X0dCUgAxOU9wX2Ryb3BfYWxwaGFfcGxhbmUAMTZPcF90b19oZHJfcGxhbmVzADE2T3BfdG9fc2RyX3BsYW5lcwAyN09wX1JSR0dCQnh4X0hEUl90b19ZQ2JDcjQyMAAyM09wX1lDYkNyNDIwX3RvX1JSR0dCQmFhAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSTI3T3BfUlJHR0JCeHhfSERSX3RvX1lDYkNyNDIwTlNfOWFsbG9jYXRvcklTMV9FRUVFAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSTE2T3BfdG9fc2RyX3BsYW5lc05TXzlhbGxvY2F0b3JJUzFfRUVFRQBOU3QzX18yMjBfX3NoYXJlZF9wdHJfZW1wbGFjZUkxNk9wX3RvX2hkcl9wbGFuZXNOU185YWxsb2NhdG9ySVMxX0VFRUUATlN0M19fMjIwX19zaGFyZWRfcHRyX2VtcGxhY2VJMTlPcF9kcm9wX2FscGhhX3BsYW5lTlNfOWFsbG9jYXRvcklTMV9FRUVFADE1T3BfUkdCX3RvX1lDYkNySXRFAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSTE1T3BfUkdCX3RvX1lDYkNySXRFTlNfOWFsbG9jYXRvcklTMl9FRUVFADE1T3BfUkdCX3RvX1lDYkNySWhFAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSTE1T3BfUkdCX3RvX1lDYkNySWhFTlNfOWFsbG9jYXRvcklTMl9FRUVFAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSTI3T3BfUkdCMjRfMzJfdG9fWUNiQ3I0NDRfR0JSTlNfOWFsbG9jYXRvcklTMV9FRUVFAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSTIwT3BfUkdCMjRfMzJfdG9fWUNiQ3JOU185YWxsb2NhdG9ySVMxX0VFRUUATlN0M19fMjIwX19zaGFyZWRfcHRyX2VtcGxhY2VJMjVPcF9SUkdHQkJhYV9CRV90b19SR0JfSERSTlNfOWFsbG9jYXRvcklTMV9FRUVFAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSTI3T3BfUlJHR0JCYWFfc3dhcF9lbmRpYW5uZXNzTlNfOWFsbG9jYXRvcklTMV9FRUVFAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSTE5T3BfbW9ub190b19SR0IyNF8zMk5TXzlhbGxvY2F0b3JJUzFfRUVFRQBOU3QzX18yMjBfX3NoYXJlZF9wdHJfZW1wbGFjZUkxOU9wX21vbm9fdG9fWUNiQ3I0MjBOU185YWxsb2NhdG9ySVMxX0VFRUUATlN0M19fMjIwX19zaGFyZWRfcHRyX2VtcGxhY2VJMjFPcF9SR0JfdG9fUlJHR0JCYWFfQkVOU185YWxsb2NhdG9ySVMxX0VFRUUATlN0M19fMjIwX19zaGFyZWRfcHRyX2VtcGxhY2VJMjVPcF9SR0JfSERSX3RvX1JSR0dCQmFhX0JFTlNfOWFsbG9jYXRvcklTMV9FRUVFAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSTIzT3BfWUNiQ3I0MjBfdG9fUlJHR0JCYWFOU185YWxsb2NhdG9ySVMxX0VFRUUATlN0M19fMjIwX19zaGFyZWRfcHRyX2VtcGxhY2VJMjBPcF9ZQ2JDcjQyMF90b19SR0IzMk5TXzlhbGxvY2F0b3JJUzFfRUVFRQBOU3QzX18yMjBfX3NoYXJlZF9wdHJfZW1wbGFjZUkyME9wX1lDYkNyNDIwX3RvX1JHQjI0TlNfOWFsbG9jYXRvcklTMV9FRUVFADE1T3BfWUNiQ3JfdG9fUkdCSWhFAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSTE1T3BfWUNiQ3JfdG9fUkdCSWhFTlNfOWFsbG9jYXRvcklTMl9FRUVFADE1T3BfWUNiQ3JfdG9fUkdCSXRFAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSTE1T3BfWUNiQ3JfdG9fUkdCSXRFTlNfOWFsbG9jYXRvcklTMl9FRUVFAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSTE4T3BfUkdCX3RvX1JHQjI0XzMyTlNfOWFsbG9jYXRvcklTMV9FRUVFACFjaGFubmVscy5lbXB0eSgpAFN1Y2Nlc3MAQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgaW1hZ2UgcGxhbmUAQ2hhbm5lbHMgd2l0aCBkaWZmZXJlbnQgbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsIGFyZSBub3Qgc3VwcG9ydGVkAGxpYmRlMjY1IEhFVkMgZGVjb2RlcgAsIHZlcnNpb24gADEuMC4yAGRlMjY1LmNjAGRlMjY1X3NldF9wYXJhbWV0ZXJfYm9vbABjaGFubmVsPj0wICYmIGNoYW5uZWwgPD0gMgBkZTI2NV9nZXRfaW1hZ2VfcGxhbmUAMTVkZWNvZGVyX2NvbnRleHQAMTJiYXNlX2NvbnRleHQAMTFlcnJvcl9xdWV1ZQB0aHJlYWRfY29udGV4dHM9PU5VTEwAZGVjY3R4LmNjAGFsbG9jYXRlX3RocmVhZF9jb250ZXh0cwBkZWNvZGVfc2xpY2VfdW5pdF9wYXJhbGxlbABpbWctPm51bV90aHJlYWRzX2FjdGl2ZSgpID09IDAAZGVjb2RlX3NsaWNlX3VuaXRfdGlsZXMAbiA8IG5UaHJlYWRDb250ZXh0cwAuL2RlY2N0eC5oAGdldF90aHJlYWRfY29udGV4dABkZWNvZGVfc2xpY2VfdW5pdF9XUFAAUFBTICVkIGhhcyBub3QgYmVlbiByZWFkCgBwcm9jZXNzX3NsaWNlX3NlZ21lbnRfaGVhZGVyAGhkci0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlIDw9IDE2AGNvbnN0cnVjdF9yZWZlcmVuY2VfcGljdHVyZV9saXN0cwBoZHItPm51bV9yZWZfaWR4X2wxX2FjdGl2ZSA8PSAxNgBjdHgtPmRwYi5oYXNfZnJlZV9kcGJfcGljdHVyZSh0cnVlKQBnZW5lcmF0ZV91bmF2YWlsYWJsZV9yZWZlcmVuY2VfcGljdHVyZQBpZHg+PTAAbmFsAGRlY29kZQBmYWxsYmFjay1kY3QuY2MAdHJhbnNmb3JtX3NraXBfOF9mYWxsYmFjawB0cmFuc2Zvcm1fc2tpcF8xNl9mYWxsYmFjawBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFpaWFVSTklDPTYuJh8WDQT88+rh2tLKw723sq6rqKamWldQRjkrGQn359XHurCppqapsLrH1ef3CRkrOUZQV1paUkMuFvzhyrerpqiyw9rzDSY9TlhaVUk2HwTq0r2upllLMhLuzrWnp7XO7hIyS1lZSzIS7s61p6e1zu4SMktZWEMf88quprLS/CZJWlU9FurDq6a32gQuTlpSNg3hvahXOQnVsKa65xlGWlAr98epqcf3K1BaRhnnuqaw1Qk5V1Uu872mt+omUlg2/MOmsuEfTlo9BMqortoWSVpDDdKrUyTcra3cJFNTJNytrdwkU1Mk3K2t3CRTUyTcra3cJFNSFsqmww1OVR/Spr0ESVgm2qi3/ENaLuGrsvM9WjbqrlAJuqnnOVor1abHGVdG97Cw90ZXGcem1StaOeepuglQTvyutw1VQ+qowx9aNtqm0i5aJsqm4T1YFr2r80lSBLJL7qfOMlkStbUSWTLOp+5LS+6nzjJZErW1ElkyzqfuS0nhpupOQ9qm81I90qj8VTbKqwRYLsOuDVomvbIWWh+3RtWpCVoZsMc5UOem91crurorV/em51A5x7AZWgmp1UZDyrImVeqmBFoNqOFSLrfDPUnSrh9Y86b8Whar2k42vUDAwEBAwMBAQMDAQEDAwEBAwMBAQMDAQEDAwEBAwMBAPbfSUh+o81r8phZV2rI2Q73KTiar6loEpg1Y4a4uScM5sOda96krRrrVVwmmGVDHx1AZpglX1bpGK6n3WuewOTar/FjSw1INpiZDsupa4bdJH6YWTr3aWvOuPS6oBFXKMqcSS7XuWc7OWe61SxKnMjKnEku17lnOzlnutUsSpzIupiY2ph89qBZDqw1JrgROsvxSt/NVvepYw+Faytpa0iumORmpRgmwUPe6V+fHWtXVWsfnV7r3ULAJRqkZOaYrJqhJ/L1a0uFVsg09pjYWrlLqylrD806rHy6mQwS3WNokrVPc3FOtJCStU9zcU60kJK1T3NxTrSQkrVPc3FOtJB+yWsMENqhS2upJpkPz0lWrLg29WrcWJq5Yyvw9pk7hGbpasCsJx1epOffVUKZG5+dGplDV9zmpV8cJK7BauhkWw1WmSdr8LrJarjbz4UOoWL0fDcpSpk7SBCa3Wqs96hLOS6dZtTLu7jK1WadLzhISzkunWbUy7u4ytVmnS84SDdo9slimVbc24QQW0kOuWqZSvS7q/B/KSataqE7DJvMJ5yvHRrBXplqpULo51Rn39xnVObpQqVqmV7BGxyvnCQTzFuEm0jbDQ7dOrlWoWqZaplirUrJJvT3KLtof6g38KHdpZHRoJjEpPT0wAGZhbGxiYWNrLW1vdGlvbi5jYwBwdXRfdW53ZWlnaHRlZF9wcmVkXzhfZmFsbGJhY2sAbG9nMldEPj0xAHB1dF93ZWlnaHRlZF9wcmVkXzhfZmFsbGJhY2sAcHV0X3dlaWdodGVkX2JpcHJlZF84X2ZhbGxiYWNrAHB1dF93ZWlnaHRlZF9wcmVkX2F2Z184X2ZhbGxiYWNrAHB1dF91bndlaWdodGVkX3ByZWRfMTZfZmFsbGJhY2sAcHV0X3dlaWdodGVkX3ByZWRfMTZfZmFsbGJhY2sAcHV0X3dlaWdodGVkX2JpcHJlZF8xNl9mYWxsYmFjawBwdXRfd2VpZ2h0ZWRfcHJlZF9hdmdfMTZfZmFsbGJhY2sAIXJlb3JkZXJfb3V0cHV0X3F1ZXVlLmVtcHR5KCkAZHBiLmNjAG91dHB1dF9uZXh0X3BpY3R1cmVfaW5fcmVvcmRlcl9idWZmZXIAbmV3X2ltYWdlAGltZy0+c3BzLkJpdERlcHRoX1kgPj0gOCAmJiBpbWctPnNwcy5CaXREZXB0aF9ZIDw9IDE2AGltYWdlLmNjAGRlMjY1X2ltYWdlX2dldF9idWZmZXIAaW1nLT5zcHMuQml0RGVwdGhfQyA+PSA4ICYmIGltZy0+c3BzLkJpdERlcHRoX0MgPD0gMTYAc3BzAGFsbG9jX2ltYWdlAGZpcnN0ICUgMiA9PSAwAGNvcHlfbGluZXNfZnJvbQBlbmQgJSAyID09IDAAblRocmVhZHNSdW5uaW5nID49IDAAdGhyZWFkX2ZpbmlzaGVzAC4vaW1hZ2UuaABwZW5kaW5nX2lucHV0X05BTCA9PSBOVUxMAG5hbC1wYXJzZXIuY2MAcHVzaF9OQUwALS0tLS0tLS0tLSBQUFMgcmFuZ2UtZXh0ZW5zaW9uIC0tLS0tLS0tLS0KAGxvZzJfbWF4X3RyYW5zZm9ybV9za2lwX2Jsb2NrX3NpemUgICAgICA6ICVkCgBjcm9zc19jb21wb25lbnRfcHJlZGljdGlvbl9lbmFibGVkX2ZsYWcgOiAlZAoAY2hyb21hX3FwX29mZnNldF9saXN0X2VuYWJsZWRfZmxhZyAgICAgIDogJWQKAGRpZmZfY3VfY2hyb21hX3FwX29mZnNldF9kZXB0aCAgICAgICAgICA6ICVkCgBjaHJvbWFfcXBfb2Zmc2V0X2xpc3RfbGVuICAgICAgICAgICAgICAgOiAlZAoAY2JfcXBfb2Zmc2V0X2xpc3RbJWRdICAgICAgICAgICAgICAgICAgICA6ICVkCgBjcl9xcF9vZmZzZXRfbGlzdFslZF0gICAgICAgICAgICAgICAgICAgIDogJWQKAGxvZzJfc2FvX29mZnNldF9zY2FsZV9sdW1hICAgICAgICAgICAgICA6ICVkCgBsb2cyX3Nhb19vZmZzZXRfc2NhbGVfY2hyb21hICAgICAgICAgICAgOiAlZAoAdGlsZVg+PTAgJiYgdGlsZVk+PTAAcHBzLmNjAHNldF9kZXJpdmVkX3ZhbHVlcwAtLS0tLS0tLS0tLS0tLS0tLSBQUFMgLS0tLS0tLS0tLS0tLS0tLS0KAHBpY19wYXJhbWV0ZXJfc2V0X2lkICAgICAgIDogJWQKAHNlcV9wYXJhbWV0ZXJfc2V0X2lkICAgICAgIDogJWQKAGRlcGVuZGVudF9zbGljZV9zZWdtZW50c19lbmFibGVkX2ZsYWcgOiAlZAoAc2lnbl9kYXRhX2hpZGluZ19mbGFnICAgICAgOiAlZAoAY2FiYWNfaW5pdF9wcmVzZW50X2ZsYWcgICAgOiAlZAoAbnVtX3JlZl9pZHhfbDBfZGVmYXVsdF9hY3RpdmUgOiAlZAoAbnVtX3JlZl9pZHhfbDFfZGVmYXVsdF9hY3RpdmUgOiAlZAoAcGljX2luaXRfcXAgICAgICAgICAgICAgICAgOiAlZAoAY29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnOiAlZAoAdHJhbnNmb3JtX3NraXBfZW5hYmxlZF9mbGFnOiAlZAoAY3VfcXBfZGVsdGFfZW5hYmxlZF9mbGFnICAgOiAlZAoAZGlmZl9jdV9xcF9kZWx0YV9kZXB0aCAgICAgOiAlZAoAcGljX2NiX3FwX29mZnNldCAgICAgICAgICAgICA6ICVkCgBwaWNfY3JfcXBfb2Zmc2V0ICAgICAgICAgICAgIDogJWQKAHBwc19zbGljZV9jaHJvbWFfcXBfb2Zmc2V0c19wcmVzZW50X2ZsYWcgOiAlZAoAd2VpZ2h0ZWRfcHJlZF9mbGFnICAgICAgICAgICA6ICVkCgB3ZWlnaHRlZF9iaXByZWRfZmxhZyAgICAgICAgIDogJWQKAG91dHB1dF9mbGFnX3ByZXNlbnRfZmxhZyAgICAgOiAlZAoAdHJhbnNxdWFudF9ieXBhc3NfZW5hYmxlX2ZsYWc6ICVkCgB0aWxlc19lbmFibGVkX2ZsYWcgICAgICAgICAgIDogJWQKAGVudHJvcHlfY29kaW5nX3N5bmNfZW5hYmxlZF9mbGFnOiAlZAoAbnVtX3RpbGVfY29sdW1ucyAgICA6ICVkCgBudW1fdGlsZV9yb3dzICAgICAgIDogJWQKAHVuaWZvcm1fc3BhY2luZ19mbGFnOiAlZAoAdGlsZSBjb2x1bW4gYm91bmRhcmllczogAHRpbGUgcm93IGJvdW5kYXJpZXM6IAAqJWQgAGxvb3BfZmlsdGVyX2Fjcm9zc190aWxlc19lbmFibGVkX2ZsYWcgOiAlZAoAcHBzX2xvb3BfZmlsdGVyX2Fjcm9zc19zbGljZXNfZW5hYmxlZF9mbGFnOiAlZAoAZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWc6ICVkCgBkZWJsb2NraW5nX2ZpbHRlcl9vdmVycmlkZV9lbmFibGVkX2ZsYWc6ICVkCgBwaWNfZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9mbGFnOiAlZAoAYmV0YV9vZmZzZXQ6ICAlZAoAdGNfb2Zmc2V0OiAgICAlZAoAcGljX3NjYWxpbmdfbGlzdF9kYXRhX3ByZXNlbnRfZmxhZzogJWQKAGxpc3RzX21vZGlmaWNhdGlvbl9wcmVzZW50X2ZsYWc6ICVkCgBsb2cyX3BhcmFsbGVsX21lcmdlX2xldmVsICAgICAgOiAlZAoAbnVtX2V4dHJhX3NsaWNlX2hlYWRlcl9iaXRzICAgIDogJWQKAHNsaWNlX3NlZ21lbnRfaGVhZGVyX2V4dGVuc2lvbl9wcmVzZW50X2ZsYWcgOiAlZAoAcHBzX2V4dGVuc2lvbl9mbGFnICAgICAgICAgICAgOiAlZAoAcHBzX3JhbmdlX2V4dGVuc2lvbl9mbGFnICAgICAgOiAlZAoAcHBzX211bHRpbGF5ZXJfZXh0ZW5zaW9uX2ZsYWcgOiAlZAoAcHBzX2V4dGVuc2lvbl82Yml0cyAgICAgICAgICAgOiAlZAoATG9nMk1pbkN1UXBEZWx0YVNpemUgICAgICAgICAgOiAlZAoATG9nMk1pbkN1Q2hyb21hUXBPZmZzZXRTaXplIChSRXh0KSA6ICVkCgBMb2cyTWF4VHJhbnNmb3JtU2tpcFNpemUgICAgKFJFeHQpIDogJWQKAHNhby0lZAAxNXRocmVhZF90YXNrX3NhbwAxMXRocmVhZF90YXNrAFNFSSBkZWNvZGVkIHBpY3R1cmUgTUQ1IG1pc21hdGNoIChQT0M9JWQpCgBTRUkgZGVjb2RlZCBwaWN0dXJlIGhhc2g6ICUwNHgsIGRlY29kZWQgcGljdHVyZTogJTA0eCAoUE9DPSVkKQoAc2xpY2Utc2VnbWVudC0lZDslZABpbml0VHlwZSA+PSAwICYmIGluaXRUeXBlIDw9IDIAc2xpY2UuY2MAaW5pdGlhbGl6ZV9DQUJBQ19tb2RlbHMAZGVjb2RlX3BhcnRfbW9kZQAAAQICAgIDBQcICgwNDxESExQVFhcXGBgZGRobGxwcHR0eH3JlYWRfY29kaW5nX3VuaXQAUHJlZE1vZGUgPT0gY3VQcmVkTW9kZQByZWFkX3RyYW5zZm9ybV90cmVlAGNvbnRleHQgPj0gMCAmJiBjb250ZXh0IDw9IDIAZGVjb2RlX3NwbGl0X3RyYW5zZm9ybV9mbGFnACEodHJhZm9EZXB0aD09MCAmJiBsb2cyVHJhZm9TaXplPT0yKQBjYmZfY2IgIT0gLTEAcmVhZF90cmFuc2Zvcm1fdW5pdABjYmZfY3IgIT0gLTEAY2JmX2x1bWEgIT0gLTEAeDxzcHMuUGljV2lkdGhJbk1pblBVcwBzZXRfSW50cmFQcmVkTW9kZUMAeTxzcHMuUGljSGVpZ2h0SW5NaW5QVXMAaWR4PGludHJhUHJlZE1vZGVDLmRhdGFfc2l6ZQAyNXRocmVhZF90YXNrX3NsaWNlX3NlZ21lbnQAY3RiLXJvdy0lZAAxOXRocmVhZF90YXNrX2N0Yl9yb3cAcHBzLT5wcHNfcmVhZABkdW1wX3NsaWNlX3NlZ21lbnRfaGVhZGVyAHNwcy0+c3BzX3JlYWQALS0tLS0tLS0tLS0tLS0tLS0gU0xJQ0UgLS0tLS0tLS0tLS0tLS0tLS0KAGZpcnN0X3NsaWNlX3NlZ21lbnRfaW5fcGljX2ZsYWcgICAgICA6ICVkCgBub19vdXRwdXRfb2ZfcHJpb3JfcGljc19mbGFnICAgICAgICAgOiAlZAoAc2xpY2VfcGljX3BhcmFtZXRlcl9zZXRfaWQgICAgICAgICAgIDogJWQKAGRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcgICAgICAgICA6ICVkCgBzbGljZV9zZWdtZW50X2FkZHJlc3MgICAgICAgICAgICAgICAgOiAlZAoAc2xpY2VfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJWMKAHBpY19vdXRwdXRfZmxhZyAgICAgICAgICAgICAgICAgICAgICA6ICVkCgBjb2xvdXJfcGxhbmVfaWQgICAgICAgICAgICAgICAgICAgICAgOiAlZAoAc2xpY2VfcGljX29yZGVyX2NudF9sc2IgICAgICAgICAgICAgIDogJWQKAHNob3J0X3Rlcm1fcmVmX3BpY19zZXRfc3BzX2ZsYWcgICAgICA6ICVkCgBzaG9ydF90ZXJtX3JlZl9waWNfc2V0X2lkeCAgICAgICAgICAgOiAlZAoAbnVtX2xvbmdfdGVybV9zcHMgICAgICAgICAgICAgICAgICAgICAgICA6ICVkCgBudW1fbG9uZ190ZXJtX3BpY3MgICAgICAgICAgICAgICAgICAgICAgIDogJWQKAHNsaWNlX3RlbXBvcmFsX212cF9lbmFibGVkX2ZsYWcgOiAlZAoAc2xpY2Vfc2FvX2x1bWFfZmxhZyAgICAgICAgICAgICA6ICVkCgBzbGljZV9zYW9fY2hyb21hX2ZsYWcgICAgICAgICAgIDogJWQKAG51bV9yZWZfaWR4X2FjdGl2ZV9vdmVycmlkZV9mbGFnIDogJWQKAChmcm9tIFBQUykAbnVtX3JlZl9pZHhfbDBfYWN0aXZlICAgICAgICAgIDogJWQgJXMKAG51bV9yZWZfaWR4X2wxX2FjdGl2ZSAgICAgICAgICA6ICVkICVzCgByZWZfcGljX2xpc3RfbW9kaWZpY2F0aW9uX2ZsYWdfbDAgOiAlZAoAICAlZDogJWQKAHJlZl9waWNfbGlzdF9tb2RpZmljYXRpb25fZmxhZ19sMSA6ICVkCgBtdmRfbDFfemVyb19mbGFnICAgICAgICAgICAgICAgOiAlZAoAY2FiYWNfaW5pdF9mbGFnICAgICAgICAgICAgICAgIDogJWQKAGNvbGxvY2F0ZWRfZnJvbV9sMF9mbGFnICAgICAgICA6ICVkCgBjb2xsb2NhdGVkX3JlZl9pZHggICAgICAgICAgICAgOiAlZAoAbHVtYV9sb2cyX3dlaWdodF9kZW5vbSAgICAgICAgIDogJWQKAENocm9tYUxvZzJXZWlnaHREZW5vbSAgICAgICAgICA6ICVkCgBMdW1hV2VpZ2h0X0wlZFslZF0gICAgICAgICAgICAgOiAlZAoAbHVtYV9vZmZzZXRfbCVkWyVkXSAgICAgICAgICAgIDogJWQKAENocm9tYVdlaWdodF9MJWRbJWRdWyVkXSAgICAgICAgOiAlZAoAQ2hyb21hT2Zmc2V0X0wlZFslZF1bJWRdICAgICAgICA6ICVkCgBmaXZlX21pbnVzX21heF9udW1fbWVyZ2VfY2FuZCAgOiAlZAoAc2xpY2VfcXBfZGVsdGEgICAgICAgICA6ICVkCgBzbGljZV9jYl9xcF9vZmZzZXQgICAgIDogJWQKAHNsaWNlX2NyX3FwX29mZnNldCAgICAgOiAlZAoAZGVibG9ja2luZ19maWx0ZXJfb3ZlcnJpZGVfZmxhZyA6ICVkCgAob3ZlcnJpZGUpAChmcm9tIHBwcykAc2xpY2VfZGVibG9ja2luZ19maWx0ZXJfZGlzYWJsZWRfZmxhZyA6ICVkICVzCgBzbGljZV9iZXRhX29mZnNldCAgOiAlZAoAc2xpY2VfdGNfb2Zmc2V0ICAgIDogJWQKAHNsaWNlX2xvb3BfZmlsdGVyX2Fjcm9zc19zbGljZXNfZW5hYmxlZF9mbGFnIDogJWQKAG51bV9lbnRyeV9wb2ludF9vZmZzZXRzICAgIDogJWQKAG9mZnNldF9sZW4gICAgICAgICAgICAgICAgIDogJWQKAGVudHJ5IHBvaW50IFslaV0gOiAlZAoAAAEEBQIDBAUGBggIBwcIY2N0eElkeExvb2t1cFtsb2cydy0yXVtjSWR4XVtzY2FuSWR4XVtwcmV2Q3NiZl1beEMrKHlDPDxsb2cydyldID09IGN0eElkeEluYwBhbGxvY19hbmRfaW5pdF9zaWduaWZpY2FudF9jb2VmZl9jdHhJZHhfbG9va3VwVGFibGUAcmVmPDcAc3BzLmNjABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQERAREBESERISERIVExQVFBMVGBYWGBgWFhgZGRseGxkZHR8jIx8dJCksKSQvNjYvQUZBWFhzEBAQEBAQEBAQEBEREREREhISEhISFBQUFBQUFBgYGBgYGBgYGRkZGRkZGRwcHBwcHCEhISEhKSkpKTY2NkdHW2ZpbGxfc2NhbGluZ19mYWN0b3IAc2NhbGluZ19saXN0X3ByZWRfbWF0cml4X2lkX2RlbHRhPT0xAHJlYWRfc2NhbGluZ19saXN0AC0tLS0tLS0tLS0tLS0tLS0tIFNQUyAtLS0tLS0tLS0tLS0tLS0tLQoAdmlkZW9fcGFyYW1ldGVyX3NldF9pZCAgOiAlZAoAc3BzX21heF9zdWJfbGF5ZXJzICAgICAgOiAlZAoAc3BzX3RlbXBvcmFsX2lkX25lc3RpbmdfZmxhZyA6ICVkCgBzZXFfcGFyYW1ldGVyX3NldF9pZCAgICA6ICVkCgA0OjQ6NAB1bmtub3duAG1vbm9jaHJvbWUANDoyOjAANDoyOjIAY2hyb21hX2Zvcm1hdF9pZGMgICAgICAgOiAlZCAoJXMpCgBzZXBhcmF0ZV9jb2xvdXJfcGxhbmVfZmxhZyA6ICVkCgBwaWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzICA6ICVkCgBwaWNfaGVpZ2h0X2luX2x1bWFfc2FtcGxlcyA6ICVkCgBjb25mb3JtYW5jZV93aW5kb3dfZmxhZyAgICA6ICVkCgBjb25mX3dpbl9sZWZ0X29mZnNldCAgOiAlZAoAY29uZl93aW5fcmlnaHRfb2Zmc2V0IDogJWQKAGNvbmZfd2luX3RvcF9vZmZzZXQgICA6ICVkCgBjb25mX3dpbl9ib3R0b21fb2Zmc2V0OiAlZAoAYml0X2RlcHRoX2x1bWEgICA6ICVkCgBiaXRfZGVwdGhfY2hyb21hIDogJWQKAGxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiIDogJWQKAHNwc19zdWJfbGF5ZXJfb3JkZXJpbmdfaW5mb19wcmVzZW50X2ZsYWcgOiAlZAoAbG9nMl9taW5fbHVtYV9jb2RpbmdfYmxvY2tfc2l6ZSA6ICVkCgBsb2cyX2RpZmZfbWF4X21pbl9sdW1hX2NvZGluZ19ibG9ja19zaXplIDogJWQKAGxvZzJfbWluX3RyYW5zZm9ybV9ibG9ja19zaXplICAgOiAlZAoAbG9nMl9kaWZmX21heF9taW5fdHJhbnNmb3JtX2Jsb2NrX3NpemUgOiAlZAoAbWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50ZXIgOiAlZAoAbWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50cmEgOiAlZAoAc2NhbGluZ19saXN0X2VuYWJsZV9mbGFnIDogJWQKAExheWVyICVkCgAgIHNwc19tYXhfZGVjX3BpY19idWZmZXJpbmcgICAgICA6ICVkCgAgIHNwc19tYXhfbnVtX3Jlb3JkZXJfcGljcyAgICAgICA6ICVkCgAgIHNwc19tYXhfbGF0ZW5jeV9pbmNyZWFzZV9wbHVzMSA6ICVkCgBzcHNfc2NhbGluZ19saXN0X2RhdGFfcHJlc2VudF9mbGFnIDogJWQKAHNjYWxpbmcgbGlzdCBsb2dnaW5nIG91dHB1dCBub3QgaW1wbGVtZW50ZWQAYW1wX2VuYWJsZWRfZmxhZyAgICAgICAgICAgICAgICAgICAgOiAlZAoAc2FtcGxlX2FkYXB0aXZlX29mZnNldF9lbmFibGVkX2ZsYWcgOiAlZAoAcGNtX2VuYWJsZWRfZmxhZyAgICAgICAgICAgICAgICAgICAgOiAlZAoAcGNtX3NhbXBsZV9iaXRfZGVwdGhfbHVtYSAgICAgOiAlZAoAcGNtX3NhbXBsZV9iaXRfZGVwdGhfY2hyb21hICAgOiAlZAoAbG9nMl9taW5fcGNtX2x1bWFfY29kaW5nX2Jsb2NrX3NpemUgOiAlZAoAbG9nMl9kaWZmX21heF9taW5fcGNtX2x1bWFfY29kaW5nX2Jsb2NrX3NpemUgOiAlZAoAcGNtX2xvb3BfZmlsdGVyX2Rpc2FibGVfZmxhZyAgOiAlZAoAbnVtX3Nob3J0X3Rlcm1fcmVmX3BpY19zZXRzIDogJWQKAGxvbmdfdGVybV9yZWZfcGljc19wcmVzZW50X2ZsYWcgOiAlZAoAcmVmX3BpY19zZXRbICUyZCBdOiAAbnVtX2xvbmdfdGVybV9yZWZfcGljc19zcHMgOiAlZAoAbHRfcmVmX3BpY19wb2NfbHNiX3Nwc1slZF0gOiAlZCAgICh1c2VkX2J5X2N1cnJfcGljX2x0X3Nwc19mbGFnPSVkKQoAc3BzX3RlbXBvcmFsX212cF9lbmFibGVkX2ZsYWcgICAgICA6ICVkCgBzdHJvbmdfaW50cmFfc21vb3RoaW5nX2VuYWJsZV9mbGFnIDogJWQKAHZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyAgICAgICAgOiAlZAoAc3BzX2V4dGVuc2lvbl9wcmVzZW50X2ZsYWcgICAgOiAlZAoAc3BzX3JhbmdlX2V4dGVuc2lvbl9mbGFnICAgICAgOiAlZAoAc3BzX211bHRpbGF5ZXJfZXh0ZW5zaW9uX2ZsYWcgOiAlZAoAc3BzX2V4dGVuc2lvbl82Yml0cyAgICAgICAgICAgOiAlZAoAQ3RiU2l6ZVkgICAgIDogJWQKAE1pbkNiU2l6ZVkgICA6ICVkCgBNYXhDYlNpemVZICAgOiAlZAoATWluVEJTaXplWSAgIDogJWQKAE1heFRCU2l6ZVkgICA6ICVkCgBQaWNXaWR0aEluQ3Ric1kgICAgICAgICA6ICVkCgBQaWNIZWlnaHRJbkN0YnNZICAgICAgICA6ICVkCgBTdWJXaWR0aEMgICAgICAgICAgICAgICA6ICVkCgBTdWJIZWlnaHRDICAgICAgICAgICAgICA6ICVkCgAtLS0tLS0tLS0tLS0tLS0tLSBTUFMtcmFuZ2UtZXh0ZW5zaW9uIC0tLS0tLS0tLS0tLS0tLS0tCgB0cmFuc2Zvcm1fc2tpcF9yb3RhdGlvbl9lbmFibGVkX2ZsYWcgICAgOiAlZAoAdHJhbnNmb3JtX3NraXBfY29udGV4dF9lbmFibGVkX2ZsYWcgICAgIDogJWQKAGltcGxpY2l0X3JkcGNtX2VuYWJsZWRfZmxhZyAgICAgICAgICAgICA6ICVkCgBleHBsaWNpdF9yZHBjbV9lbmFibGVkX2ZsYWcgICAgICAgICAgICAgOiAlZAoAZXh0ZW5kZWRfcHJlY2lzaW9uX3Byb2Nlc3NpbmdfZmxhZyAgICAgIDogJWQKAGludHJhX3Ntb290aGluZ19kaXNhYmxlZF9mbGFnICAgICAgICAgICA6ICVkCgBoaWdoX3ByZWNpc2lvbl9vZmZzZXRzX2VuYWJsZWRfZmxhZyAgICAgOiAlZAoAcGVyc2lzdGVudF9yaWNlX2FkYXB0YXRpb25fZW5hYmxlZF9mbGFnIDogJWQKAGNhYmFjX2J5cGFzc19hbGlnbm1lbnRfZW5hYmxlZF9mbGFnICAgICA6ICVkCgB0cmFuc2Zvcm0uY2MAMABzY2FsZV9jb2VmZmljaWVudHNfaW50ZXJuYWwAcmRwY21Nb2RlPT0wAEVSUjogAElORk86IAB2cHMuY2MAYWxsb2NhdG9yPFQ+OjphbGxvY2F0ZShzaXplX3QgbikgJ24nIGV4Y2VlZHMgbWF4aW11bSBzdXBwb3J0ZWQgc2l6ZQBmaXJzdExheWVyUmVhZCA8IE1BWF9URU1QT1JBTF9TVUJMQVlFUlMAcmVhZAAtLS0tLS0tLS0tLS0tLS0tLSBWUFMgLS0tLS0tLS0tLS0tLS0tLS0KAHZpZGVvX3BhcmFtZXRlcl9zZXRfaWQgICAgICAgICAgICAgICAgOiAlZAoAdnBzX21heF9sYXllcnMgICAgICAgICAgICAgICAgICAgICAgICA6ICVkCgB2cHNfbWF4X3N1Yl9sYXllcnMgICAgICAgICAgICAgICAgICAgIDogJWQKAHZwc190ZW1wb3JhbF9pZF9uZXN0aW5nX2ZsYWcgICAgICAgICAgOiAlZAoAICBQcm9maWxlL1RpZXIvTGV2ZWwgW0xheWVyICVkXQoAdnBzX3N1Yl9sYXllcl9vcmRlcmluZ19pbmZvX3ByZXNlbnRfZmxhZyA6ICVkCgBsYXllciAlZDogdnBzX21heF9kZWNfcGljX2J1ZmZlcmluZyA9ICVkCgAgICAgICAgICB2cHNfbWF4X251bV9yZW9yZGVyX3BpY3MgID0gJWQKACAgICAgICAgIHZwc19tYXhfbGF0ZW5jeV9pbmNyZWFzZSAgPSAlZAoAbGF5ZXIgKGFsbCk6IHZwc19tYXhfZGVjX3BpY19idWZmZXJpbmcgPSAlZAoAICAgICAgICAgICAgIHZwc19tYXhfbnVtX3Jlb3JkZXJfcGljcyAgPSAlZAoAICAgICAgICAgICAgIHZwc19tYXhfbGF0ZW5jeV9pbmNyZWFzZSAgPSAlZAoAdnBzX21heF9sYXllcl9pZCAgID0gJWQKAHZwc19udW1fbGF5ZXJfc2V0cyA9ICVkCgB2cHNfdGltaW5nX2luZm9fcHJlc2VudF9mbGFnID0gJWQKAGxheWVyX2lkX2luY2x1ZGVkX2ZsYWdbJWRdWyVkXSA9ICVkCgB2cHNfbnVtX3VuaXRzX2luX3RpY2sgPSAlZAoAdnBzX3RpbWVfc2NhbGUgICAgICAgID0gJWQKAHZwc19wb2NfcHJvcG9ydGlvbmFsX3RvX3RpbWluZ19mbGFnID0gJWQKAHZwc19udW1fdGlja3NfcG9jX2RpZmZfb25lID0gJWQKAHZwc19udW1faHJkX3BhcmFtZXRlcnMgICAgID0gJWQKAGhyZF9sYXllcl9zZXRfaWR4WyVkXSA9ICVkCgB2cHNfZXh0ZW5zaW9uX2ZsYWcgPSAlZAoAZ2VuZXJhbABzdWJfbGF5ZXIAICAlc19wcm9maWxlX3NwYWNlICAgICA6ICVkCgAgICVzX3RpZXJfZmxhZyAgICAgICAgIDogJWQKACh1bmtub3duKQBGb3JtYXRSYW5nZUV4dGVuc2lvbnMATWFpblN0aWxsUGljdHVyZQBNYWluMTAATWFpbgAgICVzX3Byb2ZpbGVfaWRjICAgICAgIDogJXMKACAgJXNfcHJvZmlsZV9jb21wYXRpYmlsaXR5X2ZsYWdzOiAAKgoAICAgICVzX3Byb2dyZXNzaXZlX3NvdXJjZV9mbGFnIDogJWQKACAgICAlc19pbnRlcmxhY2VkX3NvdXJjZV9mbGFnIDogJWQKACAgICAlc19ub25fcGFja2VkX2NvbnN0cmFpbnRfZmxhZyA6ICVkCgAgICAgJXNfZnJhbWVfb25seV9jb25zdHJhaW50X2ZsYWcgOiAlZAoAKiwAKiVkACAgJXNfbGV2ZWxfaWRjICAgICAgICAgOiAlZCAoJTQuMmYpCgB1bnNwZWNpZmllZABNQUMAU0VDQU0ATlRTQwBQQUwAY29tcG9uZW50AC0tLS0tLS0tLS0tLS0tLS0tIFZVSSAtLS0tLS0tLS0tLS0tLS0tLQoAc2FtcGxlIGFzcGVjdCByYXRpbyAgICAgICAgOiAlZDolZAoAb3ZlcnNjYW5faW5mb19wcmVzZW50X2ZsYWcgOiAlZAoAb3ZlcnNjYW5fYXBwcm9wcmlhdGVfZmxhZyAgOiAlZAoAdmlkZW9fc2lnbmFsX3R5cGVfcHJlc2VudF9mbGFnOiAlZAoAICB2aWRlb19mb3JtYXQgICAgICAgICAgICAgICAgOiAlcwoAICB2aWRlb19mdWxsX3JhbmdlX2ZsYWcgICAgICAgOiAlZAoAICBjb2xvdXJfZGVzY3JpcHRpb25fcHJlc2VudF9mbGFnIDogJWQKACAgY29sb3VyX3ByaW1hcmllcyAgICAgICAgICAgIDogJWQKACAgdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzICAgIDogJWQKACAgbWF0cml4X2NvZWZmcyAgICAgICAgICAgICAgIDogJWQKAGNocm9tYV9sb2NfaW5mb19wcmVzZW50X2ZsYWc6ICVkCgAgIGNocm9tYV9zYW1wbGVfbG9jX3R5cGVfdG9wX2ZpZWxkICAgOiAlZAoAICBjaHJvbWFfc2FtcGxlX2xvY190eXBlX2JvdHRvbV9maWVsZDogJWQKAG5ldXRyYWxfY2hyb21hX2luZGljYXRpb25fZmxhZzogJWQKAGZpZWxkX3NlcV9mbGFnICAgICAgICAgICAgICAgIDogJWQKAGZyYW1lX2ZpZWxkX2luZm9fcHJlc2VudF9mbGFnIDogJWQKAGRlZmF1bHRfZGlzcGxheV93aW5kb3dfZmxhZyAgIDogJWQKACAgZGVmX2Rpc3Bfd2luX2xlZnRfb2Zmc2V0ICAgIDogJWQKACAgZGVmX2Rpc3Bfd2luX3JpZ2h0X29mZnNldCAgIDogJWQKACAgZGVmX2Rpc3Bfd2luX3RvcF9vZmZzZXQgICAgIDogJWQKACAgZGVmX2Rpc3Bfd2luX2JvdHRvbV9vZmZzZXQgIDogJWQKAHZ1aV90aW1pbmdfaW5mb19wcmVzZW50X2ZsYWcgIDogJWQKACAgdnVpX251bV91bml0c19pbl90aWNrICAgICAgIDogJWQKACAgdnVpX3RpbWVfc2NhbGUgICAgICAgICAgICAgIDogJWQKAHZ1aV9wb2NfcHJvcG9ydGlvbmFsX3RvX3RpbWluZ19mbGFnIDogJWQKAHZ1aV9udW1fdGlja3NfcG9jX2RpZmZfb25lICAgICAgICAgIDogJWQKAHZ1aV9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgOiAlZAoAYml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcgICAgICAgICA6ICVkCgAgIHRpbGVzX2ZpeGVkX3N0cnVjdHVyZV9mbGFnICAgICAgIDogJWQKACAgbW90aW9uX3ZlY3RvcnNfb3Zlcl9waWNfYm91bmRhcmllc19mbGFnIDogJWQKACAgcmVzdHJpY3RlZF9yZWZfcGljX2xpc3RzX2ZsYWcgICAgOiAlZAoAICBtaW5fc3BhdGlhbF9zZWdtZW50YXRpb25faWRjICAgICA6ICVkCgAgIG1heF9ieXRlc19wZXJfcGljX2Rlbm9tICAgICAgICAgIDogJWQKACAgbWF4X2JpdHNfcGVyX21pbl9jdV9kZW5vbSAgICAgICAgOiAlZAoAICBsb2cyX21heF9tdl9sZW5ndGhfaG9yaXpvbnRhbCAgICA6ICVkCgAgIGxvZzJfbWF4X212X2xlbmd0aF92ZXJ0aWNhbCAgICAgIDogJWQKAGJpdHN0cmVhbS5jYwB2YWx1ZT4wAGdldF91dmxjAICw0PCAp8XjgJ672HuWss10jqnDb4eguWmAmK9kepCmX3SJnlpugpZVaHuOUWN1h01eb4BJWWl6RVVkdEJQX24+TFpoO0hWYzhFUV41QU1ZMz5JVTA7RVAuOEJMKzU/SCkyO0UnMDhBJS02PiMrMzshKTA4ICcuNR4lKzIdIykwGyEnLRofJSsYHiMpFxwhJxYbICUVGh4jFBgdIRMXGx8SFhoeERUZHBAUFxsPExYZDhIVGA4RFBcNEBMWDA8SFQwOERQLDhATCw0PEgoMDxEKDA4QCQsNDwkLDA4ICgwOCAkLDQcJCwwHCQoMBwgKCwYICQsGBwkKBgcICQICAgIGBQQEAwMDAwICAgICAgICAQEBAQEBAQEBAQEBAQEBAQAAAQICBAQFBgcICQkLCwwNDQ8PEBASEhMTFRUWFhcYGBkaGhsbHB0dHh4eHyAgISEhIiIjIyMkJCQlJSUmJj8BAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj4/Y2FiYWMuY2MAbGVuZ3RoID49IDAAaW5pdF9DQUJBQ19kZWNvZGVyACVwIGMndG9yID0gJXAKACVwIGRlc3RydWN0b3IKAG1mcmVlICVwCgAlcCBpbml0CgAqcmVmY250PjEAY29udGV4dG1vZGVsLmNjAGRlY291cGxlX29yX2FsbG9jX3dpdGhfZW1wdHlfZGF0YQAlcCAoYWxsb2MpCgBtb2RlbFtpXS5zdGF0ZSA8PSA2MgBzZXRfaW5pdFZhbHVlACVwIHJlbGVhc2UgJXAKACVwIGRlY291cGxlICglcCkKAHJlZmNudABkZWNvdXBsZQAlcCBhc3NpZ24gPSAlcAoAZGVibG9jay0lZAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQECAgICAwMDAwQEBAUFBgYHCAkKCw0OEBIUFhgAAAAAAAAAAAAAAAAAAAAABgcICQoLDA0ODxAREhQWGBocHiAiJCYoKiwuMDI0Njg6PD5AcmVmUGljUTA9PXJlZlBpY1ExAGRlYmxvY2suY2MAZGVyaXZlX2JvdW5kYXJ5U3RyZW5ndGgAMjZ0aHJlYWRfdGFza19kZWJsb2NrX0NUQlJvdwBpbnRyYXByZWQuY2MAaW50cmFQcmVkTW9kZTwzNQBpbnRyYV9wcmVkaWN0aW9uX2FuZ3VsYXIAaW50cmFQcmVkTW9kZT49MgBpbnRyYV9wcmVkaWN0aW9uX3NhbXBsZV9maWx0ZXJpbmcAc2hkci0+c2xpY2VfdHlwZSA9PSBTTElDRV9UWVBFX0IAbW90aW9uLmNjAGdlbmVyYXRlX2ludGVyX3ByZWRpY3Rpb25fc2FtcGxlcwBtY19jaHJvbWEAdW5pdFggPj0gMCAmJiB1bml0WCA8IHdpZHRoX2luX3VuaXRzAC4uL2xpYmRlMjY1L2ltYWdlLmgAZ2V0AHVuaXRZID49IDAgJiYgdW5pdFkgPCBoZWlnaHRfaW5fdW5pdHMAY3R4LT5oYXNfaW1hZ2UoY29sUGljKQBkZXJpdmVfY29sbG9jYXRlZF9tb3Rpb25fdmVjdG9ycwBkZXJpdmVfY29tYmluZWRfYmlwcmVkaWN0aXZlX21lcmdpbmdfY2FuZGlkYXRlcwByZWZQaWNMaXN0Pj0wAGRlcml2ZV9zcGF0aWFsX2x1bWFfdmVjdG9yX3ByZWRpY3Rpb24AbnVtTVZQQ2FuZExYPT0yAGZpbGxfbHVtYV9tb3Rpb25fdmVjdG9yX3ByZWRpY3RvcnMAUklkeD49MAByZWZwaWMuY2MAcmVhZF9zaG9ydF90ZXJtX3JlZl9waWNfc2V0AFJJZHggPj0gMCAmJiBSSWR4IDwgc2V0cy5zaXplKCkAaj49MCAmJiBqIDwgTUFYX05VTV9SRUZfUElDUwAqJWQlYyAAKiVzCgB2b2lkAGJvb2wAY2hhcgBzaWduZWQgY2hhcgB1bnNpZ25lZCBjaGFyAHNob3J0AHVuc2lnbmVkIHNob3J0AGludAB1bnNpZ25lZCBpbnQAbG9uZwB1bnNpZ25lZCBsb25nAGZsb2F0AGRvdWJsZQBzdGQ6OnN0cmluZwBzdGQ6OmJhc2ljX3N0cmluZzx1bnNpZ25lZCBjaGFyPgBzdGQ6OndzdHJpbmcAZW1zY3JpcHRlbjo6dmFsAGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGNoYXI+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHNpZ25lZCBjaGFyPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBjaGFyPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxzaG9ydD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgc2hvcnQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGludD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgaW50PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxsb25nPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBsb25nPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQ4X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQ4X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGludDE2X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQxNl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQzMl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50MzJfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8ZmxvYXQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGRvdWJsZT4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8bG9uZyBkb3VibGU+AE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SWVFRQBOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0lkRUUATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJZkVFAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SW1FRQBOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0lsRUUATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJakVFAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SWlFRQBOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0l0RUUATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJc0VFAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SWhFRQBOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0lhRUUATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJY0VFAE5TdDNfXzIxMmJhc2ljX3N0cmluZ0l3TlNfMTFjaGFyX3RyYWl0c0l3RUVOU185YWxsb2NhdG9ySXdFRUVFAE5TdDNfXzIxMmJhc2ljX3N0cmluZ0loTlNfMTFjaGFyX3RyYWl0c0loRUVOU185YWxsb2NhdG9ySWhFRUVFABEACgAREREAAAAABQAAAAAAAAkAAAAACwAAAAAAAAAAEQAPChEREQMKBwABEwkLCwAACQYLAAALAAYRAAAAERERAAAAAAAAAAAAAAAAAAAAAAsAAAAAAAAAABEACgoREREACgAAAgAJCwAAAAkACwAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAwAAAAACQwAAAAAAAwAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAADQAAAAQNAAAAAAkOAAAAAAAOAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAA8AAAAADwAAAAAJEAAAAAAAEAAAEAAAEgAAABISEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAEhISAAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAAAAAAAAAACgAAAAAKAAAAAAkLAAAAAAALAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAADAAAAAAJDAAAAAAADAAADAAALSsgICAwWDB4AChudWxsKQAtMFgrMFggMFgtMHgrMHggMHgAaW5mAElORgBOQU4AMDEyMzQ1Njc4OUFCQ0RFRi4AVCEiGQ0BAgMRSxwMEAQLHRIeJ2hub3BxYiAFBg8TFBUaCBYHKCQXGAkKDhsfJSODgn0mKis8PT4/Q0dKTVhZWltcXV5fYGFjZGVmZ2lqa2xyc3R5ent8AElsbGVnYWwgYnl0ZSBzZXF1ZW5jZQBEb21haW4gZXJyb3IAUmVzdWx0IG5vdCByZXByZXNlbnRhYmxlAE5vdCBhIHR0eQBQZXJtaXNzaW9uIGRlbmllZABPcGVyYXRpb24gbm90IHBlcm1pdHRlZABObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5AE5vIHN1Y2ggcHJvY2VzcwBGaWxlIGV4aXN0cwBWYWx1ZSB0b28gbGFyZ2UgZm9yIGRhdGEgdHlwZQBObyBzcGFjZSBsZWZ0IG9uIGRldmljZQBPdXQgb2YgbWVtb3J5AFJlc291cmNlIGJ1c3kASW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwAUmVzb3VyY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUASW52YWxpZCBzZWVrAENyb3NzLWRldmljZSBsaW5rAFJlYWQtb25seSBmaWxlIHN5c3RlbQBEaXJlY3Rvcnkgbm90IGVtcHR5AENvbm5lY3Rpb24gcmVzZXQgYnkgcGVlcgBPcGVyYXRpb24gdGltZWQgb3V0AENvbm5lY3Rpb24gcmVmdXNlZABIb3N0IGlzIGRvd24ASG9zdCBpcyB1bnJlYWNoYWJsZQBBZGRyZXNzIGluIHVzZQBCcm9rZW4gcGlwZQBJL08gZXJyb3IATm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzcwBCbG9jayBkZXZpY2UgcmVxdWlyZWQATm8gc3VjaCBkZXZpY2UATm90IGEgZGlyZWN0b3J5AElzIGEgZGlyZWN0b3J5AFRleHQgZmlsZSBidXN5AEV4ZWMgZm9ybWF0IGVycm9yAEludmFsaWQgYXJndW1lbnQAQXJndW1lbnQgbGlzdCB0b28gbG9uZwBTeW1ib2xpYyBsaW5rIGxvb3AARmlsZW5hbWUgdG9vIGxvbmcAVG9vIG1hbnkgb3BlbiBmaWxlcyBpbiBzeXN0ZW0ATm8gZmlsZSBkZXNjcmlwdG9ycyBhdmFpbGFibGUAQmFkIGZpbGUgZGVzY3JpcHRvcgBObyBjaGlsZCBwcm9jZXNzAEJhZCBhZGRyZXNzAEZpbGUgdG9vIGxhcmdlAFRvbyBtYW55IGxpbmtzAE5vIGxvY2tzIGF2YWlsYWJsZQBSZXNvdXJjZSBkZWFkbG9jayB3b3VsZCBvY2N1cgBTdGF0ZSBub3QgcmVjb3ZlcmFibGUAUHJldmlvdXMgb3duZXIgZGllZABPcGVyYXRpb24gY2FuY2VsZWQARnVuY3Rpb24gbm90IGltcGxlbWVudGVkAE5vIG1lc3NhZ2Ugb2YgZGVzaXJlZCB0eXBlAElkZW50aWZpZXIgcmVtb3ZlZABEZXZpY2Ugbm90IGEgc3RyZWFtAE5vIGRhdGEgYXZhaWxhYmxlAERldmljZSB0aW1lb3V0AE91dCBvZiBzdHJlYW1zIHJlc291cmNlcwBMaW5rIGhhcyBiZWVuIHNldmVyZWQAUHJvdG9jb2wgZXJyb3IAQmFkIG1lc3NhZ2UARmlsZSBkZXNjcmlwdG9yIGluIGJhZCBzdGF0ZQBOb3QgYSBzb2NrZXQARGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZABNZXNzYWdlIHRvbyBsYXJnZQBQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQAUHJvdG9jb2wgbm90IGF2YWlsYWJsZQBQcm90b2NvbCBub3Qgc3VwcG9ydGVkAFNvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQATm90IHN1cHBvcnRlZABQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZABBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sAEFkZHJlc3Mgbm90IGF2YWlsYWJsZQBOZXR3b3JrIGlzIGRvd24ATmV0d29yayB1bnJlYWNoYWJsZQBDb25uZWN0aW9uIHJlc2V0IGJ5IG5ldHdvcmsAQ29ubmVjdGlvbiBhYm9ydGVkAE5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUAU29ja2V0IGlzIGNvbm5lY3RlZABTb2NrZXQgbm90IGNvbm5lY3RlZABDYW5ub3Qgc2VuZCBhZnRlciBzb2NrZXQgc2h1dGRvd24AT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MAT3BlcmF0aW9uIGluIHByb2dyZXNzAFN0YWxlIGZpbGUgaGFuZGxlAFJlbW90ZSBJL08gZXJyb3IAUXVvdGEgZXhjZWVkZWQATm8gbWVkaXVtIGZvdW5kAFdyb25nIG1lZGl1bSB0eXBlAE5vIGVycm9yIGluZm9ybWF0aW9uAAD/////////////////////////////////////////////////////////////////AAECAwQFBgcICf////////8KCwwNDg8QERITFBUWFxgZGhscHR4fICEiI////////woLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIj/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wABAgQHAwYFAGluZmluaXR5AG5hbgBMQ19BTEwATENfQ1RZUEUAAAAATENfTlVNRVJJQwAATENfVElNRQAAAAAATENfQ09MTEFURQAATENfTU9ORVRBUlkATENfTUVTU0FHRVMATEFORwBDLlVURi04AFBPU0lYAE1VU0xfTE9DUEFUSABOU3QzX18yOGlvc19iYXNlRQBOU3QzX18yOWJhc2ljX2lvc0ljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRQBOU3QzX18yOWJhc2ljX2lvc0l3TlNfMTFjaGFyX3RyYWl0c0l3RUVFRQBOU3QzX18yMTViYXNpY19zdHJlYW1idWZJY05TXzExY2hhcl90cmFpdHNJY0VFRUUATlN0M19fMjE1YmFzaWNfc3RyZWFtYnVmSXdOU18xMWNoYXJfdHJhaXRzSXdFRUVFAE5TdDNfXzIxM2Jhc2ljX2lzdHJlYW1JY05TXzExY2hhcl90cmFpdHNJY0VFRUUATlN0M19fMjEzYmFzaWNfaXN0cmVhbUl3TlNfMTFjaGFyX3RyYWl0c0l3RUVFRQBOU3QzX18yMTNiYXNpY19vc3RyZWFtSWNOU18xMWNoYXJfdHJhaXRzSWNFRUVFAE5TdDNfXzIxM2Jhc2ljX29zdHJlYW1Jd05TXzExY2hhcl90cmFpdHNJd0VFRUUATlN0M19fMjE0YmFzaWNfaW9zdHJlYW1JY05TXzExY2hhcl90cmFpdHNJY0VFRUUATlN0M19fMjExX19zdGRvdXRidWZJd0VFAE5TdDNfXzIxMV9fc3Rkb3V0YnVmSWNFRQB1bnN1cHBvcnRlZCBsb2NhbGUgZm9yIHN0YW5kYXJkIGlucHV0AE5TdDNfXzIxMF9fc3RkaW5idWZJd0VFAE5TdDNfXzIxMF9fc3RkaW5idWZJY0VFAE5TdDNfXzI3Y29sbGF0ZUljRUUATlN0M19fMjZsb2NhbGU1ZmFjZXRFAE5TdDNfXzI3Y29sbGF0ZUl3RUUAMDEyMzQ1Njc4OWFiY2RlZkFCQ0RFRnhYKy1wUGlJbk4AJXAAQwBOU3QzX18yN251bV9nZXRJY05TXzE5aXN0cmVhbWJ1Zl9pdGVyYXRvckljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRUVFAE5TdDNfXzI5X19udW1fZ2V0SWNFRQBOU3QzX18yMTRfX251bV9nZXRfYmFzZUUATlN0M19fMjdudW1fZ2V0SXdOU18xOWlzdHJlYW1idWZfaXRlcmF0b3JJd05TXzExY2hhcl90cmFpdHNJd0VFRUVFRQBOU3QzX18yOV9fbnVtX2dldEl3RUUAJXAAAAAATABsbAAlAAAAAABsAE5TdDNfXzI3bnVtX3B1dEljTlNfMTlvc3RyZWFtYnVmX2l0ZXJhdG9ySWNOU18xMWNoYXJfdHJhaXRzSWNFRUVFRUUATlN0M19fMjlfX251bV9wdXRJY0VFAE5TdDNfXzIxNF9fbnVtX3B1dF9iYXNlRQBOU3QzX18yN251bV9wdXRJd05TXzE5b3N0cmVhbWJ1Zl9pdGVyYXRvckl3TlNfMTFjaGFyX3RyYWl0c0l3RUVFRUVFAE5TdDNfXzI5X19udW1fcHV0SXdFRQAlSDolTTolUwAlbS8lZC8leQAlSTolTTolUyAlcAAlYSAlYiAlZCAlSDolTTolUyAlWQBBTQBQTQBKYW51YXJ5AEZlYnJ1YXJ5AE1hcmNoAEFwcmlsAE1heQBKdW5lAEp1bHkAQXVndXN0AFNlcHRlbWJlcgBPY3RvYmVyAE5vdmVtYmVyAERlY2VtYmVyAEphbgBGZWIATWFyAEFwcgBKdW4ASnVsAEF1ZwBTZXAAT2N0AE5vdgBEZWMAU3VuZGF5AE1vbmRheQBUdWVzZGF5AFdlZG5lc2RheQBUaHVyc2RheQBGcmlkYXkAU2F0dXJkYXkAU3VuAE1vbgBUdWUAV2VkAFRodQBGcmkAU2F0ACVtLyVkLyV5JVktJW0tJWQlSTolTTolUyAlcCVIOiVNJUg6JU06JVMlSDolTTolU05TdDNfXzI4dGltZV9nZXRJY05TXzE5aXN0cmVhbWJ1Zl9pdGVyYXRvckljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRUVFAE5TdDNfXzIyMF9fdGltZV9nZXRfY19zdG9yYWdlSWNFRQBOU3QzX18yOXRpbWVfYmFzZUUATlN0M19fMjh0aW1lX2dldEl3TlNfMTlpc3RyZWFtYnVmX2l0ZXJhdG9ySXdOU18xMWNoYXJfdHJhaXRzSXdFRUVFRUUATlN0M19fMjIwX190aW1lX2dldF9jX3N0b3JhZ2VJd0VFAE5TdDNfXzI4dGltZV9wdXRJY05TXzE5b3N0cmVhbWJ1Zl9pdGVyYXRvckljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRUVFAE5TdDNfXzIxMF9fdGltZV9wdXRFAE5TdDNfXzI4dGltZV9wdXRJd05TXzE5b3N0cmVhbWJ1Zl9pdGVyYXRvckl3TlNfMTFjaGFyX3RyYWl0c0l3RUVFRUVFAE5TdDNfXzIxMG1vbmV5cHVuY3RJY0xiMEVFRQBOU3QzX18yMTBtb25leV9iYXNlRQBOU3QzX18yMTBtb25leXB1bmN0SWNMYjFFRUUATlN0M19fMjEwbW9uZXlwdW5jdEl3TGIwRUVFAE5TdDNfXzIxMG1vbmV5cHVuY3RJd0xiMUVFRQAwMTIzNDU2Nzg5ACVMZgBOU3QzX18yOW1vbmV5X2dldEljTlNfMTlpc3RyZWFtYnVmX2l0ZXJhdG9ySWNOU18xMWNoYXJfdHJhaXRzSWNFRUVFRUUATlN0M19fMjExX19tb25leV9nZXRJY0VFADAxMjM0NTY3ODkATlN0M19fMjltb25leV9nZXRJd05TXzE5aXN0cmVhbWJ1Zl9pdGVyYXRvckl3TlNfMTFjaGFyX3RyYWl0c0l3RUVFRUVFAE5TdDNfXzIxMV9fbW9uZXlfZ2V0SXdFRQAlLjBMZgBOU3QzX18yOW1vbmV5X3B1dEljTlNfMTlvc3RyZWFtYnVmX2l0ZXJhdG9ySWNOU18xMWNoYXJfdHJhaXRzSWNFRUVFRUUATlN0M19fMjExX19tb25leV9wdXRJY0VFAE5TdDNfXzI5bW9uZXlfcHV0SXdOU18xOW9zdHJlYW1idWZfaXRlcmF0b3JJd05TXzExY2hhcl90cmFpdHNJd0VFRUVFRQBOU3QzX18yMTFfX21vbmV5X3B1dEl3RUUATlN0M19fMjhtZXNzYWdlc0ljRUUATlN0M19fMjEzbWVzc2FnZXNfYmFzZUUATlN0M19fMjE3X193aWRlbl9mcm9tX3V0ZjhJTGozMkVFRQBOU3QzX18yN2NvZGVjdnRJRGljMTFfX21ic3RhdGVfdEVFAE5TdDNfXzIxMmNvZGVjdnRfYmFzZUUATlN0M19fMjE2X19uYXJyb3dfdG9fdXRmOElMajMyRUVFAE5TdDNfXzI4bWVzc2FnZXNJd0VFAE5TdDNfXzI3Y29kZWN2dEljYzExX19tYnN0YXRlX3RFRQBOU3QzX18yN2NvZGVjdnRJd2MxMV9fbWJzdGF0ZV90RUUATlN0M19fMjdjb2RlY3Z0SURzYzExX19tYnN0YXRlX3RFRQBOU3QzX18yNmxvY2FsZTVfX2ltcEUATlN0M19fMjVjdHlwZUljRUUATlN0M19fMjEwY3R5cGVfYmFzZUUATlN0M19fMjVjdHlwZUl3RUUAZmFsc2UAdHJ1ZQBOU3QzX18yOG51bXB1bmN0SWNFRQBOU3QzX18yOG51bXB1bmN0SXdFRQBOU3QzX18yMTRfX3NoYXJlZF9jb3VudEUATlN0M19fMjE5X19zaGFyZWRfd2Vha19jb3VudEUAYmFkX3dlYWtfcHRyAE5TdDNfXzIxMmJhZF93ZWFrX3B0ckUAdGVybWluYXRpbmcgd2l0aCAlcyBleGNlcHRpb24gb2YgdHlwZSAlczogJXMAdGVybWluYXRpbmcgd2l0aCAlcyBleGNlcHRpb24gb2YgdHlwZSAlcwB0ZXJtaW5hdGluZyB3aXRoICVzIGZvcmVpZ24gZXhjZXB0aW9uAHRlcm1pbmF0aW5nAHVuY2F1Z2h0AFN0OWV4Y2VwdGlvbgBOMTBfX2N4eGFiaXYxMTZfX3NoaW1fdHlwZV9pbmZvRQBTdDl0eXBlX2luZm8ATjEwX19jeHhhYml2MTIwX19zaV9jbGFzc190eXBlX2luZm9FAE4xMF9fY3h4YWJpdjExN19fY2xhc3NfdHlwZV9pbmZvRQBwdGhyZWFkX29uY2UgZmFpbHVyZSBpbiBfX2N4YV9nZXRfZ2xvYmFsc19mYXN0KCkAY2Fubm90IGNyZWF0ZSBwdGhyZWFkIGtleSBmb3IgX19jeGFfZ2V0X2dsb2JhbHMoKQBjYW5ub3QgemVybyBvdXQgdGhyZWFkIHZhbHVlIGZvciBfX2N4YV9nZXRfZ2xvYmFscygpAHRlcm1pbmF0ZV9oYW5kbGVyIHVuZXhwZWN0ZWRseSByZXR1cm5lZABTdDExbG9naWNfZXJyb3IAU3QxMmxlbmd0aF9lcnJvcgBOMTBfX2N4eGFiaXYxMTlfX3BvaW50ZXJfdHlwZV9pbmZvRQBOMTBfX2N4eGFiaXYxMTdfX3BiYXNlX3R5cGVfaW5mb0UATjEwX19jeHhhYml2MTIzX19mdW5kYW1lbnRhbF90eXBlX2luZm9FAHYARG4AYgBjAGgAYQBzAHQAaQBqAG0AZgBkAE4xMF9fY3h4YWJpdjExNl9fZW51bV90eXBlX2luZm9FAE4xMF9fY3h4YWJpdjEyMV9fdm1pX2NsYXNzX3R5cGVfaW5mb0U=\\\"),staticInit:function(){yA.isWindows=!!process.platform.match(/^win/)},mount:function(A){return h(o),yA.createNode(null,\\\"/\\\",yA.getMode(A.opts.root),0)},createNode:function(A,e,r,i){if(!EA.isDir(r)&&!EA.isFile(r)&&!EA.isLink(r))throw new EA.ErrnoError(hA.EINVAL);var f=EA.createNode(A,e,r);return f.node_ops=yA.node_ops,f.stream_ops=yA.stream_ops,f},getMode:function(A){var e;try{e=ur.lstatSync(A),yA.isWindows&&(e.mode=e.mode|(146&e.mode)>>1)}catch(A){if(!A.code)throw A;throw new EA.ErrnoError(hA[A.code])}return e.mode},realPath:function(A){for(var e=[];A.parent!==A;)e.push(A.name),A=A.parent;return e.push(A.mount.opts.root),e.reverse(),mA.join.apply(null,e)},flagsToPermissionStringMap:{0:\\\"r\\\",1:\\\"r+\\\",2:\\\"r+\\\",64:\\\"r\\\",65:\\\"r+\\\",66:\\\"r+\\\",129:\\\"rx+\\\",193:\\\"rx+\\\",514:\\\"w+\\\",577:\\\"w\\\",578:\\\"w+\\\",705:\\\"wx\\\",706:\\\"wx+\\\",1024:\\\"a\\\",1025:\\\"a\\\",1026:\\\"a+\\\",1089:\\\"a\\\",1090:\\\"a+\\\",1153:\\\"ax\\\",1154:\\\"ax+\\\",1217:\\\"ax\\\",1218:\\\"ax+\\\",4096:\\\"rs\\\",4098:\\\"rs+\\\"},flagsToPermissionString:function(A){if(A&=-2097153,A&=-2049,A&=-32769,(A&=-524289)in yA.flagsToPermissionStringMap)return yA.flagsToPermissionStringMap[A];throw new EA.ErrnoError(hA.EINVAL)},node_ops:{getattr:function(A){var e,r=yA.realPath(A);try{e=ur.lstatSync(r)}catch(A){if(!A.code)throw A;throw new EA.ErrnoError(hA[A.code])}return yA.isWindows&&!e.blksize&&(e.blksize=4096),yA.isWindows&&!e.blocks&&(e.blocks=(e.size+e.blksize-1)/e.blksize|0),{dev:e.dev,ino:e.ino,mode:e.mode,nlink:e.nlink,uid:e.uid,gid:e.gid,rdev:e.rdev,size:e.size,atime:e.atime,mtime:e.mtime,ctime:e.ctime,blksize:e.blksize,blocks:e.blocks}},setattr:function(A,e){var r=yA.realPath(A);try{if(void 0!==e.mode&&(ur.chmodSync(r,e.mode),A.mode=e.mode),void 0!==e.timestamp){var i=new Date(e.timestamp);ur.utimesSync(r,i,i)}void 0!==e.size&&ur.truncateSync(r,e.size)}catch(A){if(!A.code)throw A;throw new EA.ErrnoError(hA[A.code])}},lookup:function(A,e){var r=mA.join2(yA.realPath(A),e),i=yA.getMode(r);return yA.createNode(A,e,i)},mknod:function(A,e,r,i){var f=yA.createNode(A,e,r,i),n=yA.realPath(f);try{EA.isDir(f.mode)?ur.mkdirSync(n,f.mode):ur.writeFileSync(n,\\\"\\\",{mode:f.mode})}catch(A){if(!A.code)throw A;throw new EA.ErrnoError(hA[A.code])}return f},rename:function(A,e,r){var i=yA.realPath(A),f=mA.join2(yA.realPath(e),r);try{ur.renameSync(i,f)}catch(A){if(!A.code)throw A;throw new EA.ErrnoError(hA[A.code])}},unlink:function(A,e){var r=mA.join2(yA.realPath(A),e);try{ur.unlinkSync(r)}catch(A){if(!A.code)throw A;throw new EA.ErrnoError(hA[A.code])}},rmdir:function(A,e){var r=mA.join2(yA.realPath(A),e);try{ur.rmdirSync(r)}catch(A){if(!A.code)throw A;throw new EA.ErrnoError(hA[A.code])}},readdir:function(A){var e=yA.realPath(A);try{return ur.readdirSync(e)}catch(A){if(!A.code)throw A;throw new EA.ErrnoError(hA[A.code])}},symlink:function(A,e,r){var i=mA.join2(yA.realPath(A),e);try{ur.symlinkSync(r,i)}catch(A){if(!A.code)throw A;throw new EA.ErrnoError(hA[A.code])}},readlink:function(A){var e=yA.realPath(A);try{return e=ur.readlinkSync(e),e=br.relative(br.resolve(A.mount.opts.root),e)}catch(A){if(!A.code)throw A;throw new EA.ErrnoError(hA[A.code])}}},stream_ops:{open:function(A){var e=yA.realPath(A.node);try{EA.isFile(A.node.mode)&&(A.nfd=ur.openSync(e,yA.flagsToPermissionString(A.flags)))}catch(A){if(!A.code)throw A;throw new EA.ErrnoError(hA[A.code])}},close:function(A){try{EA.isFile(A.node.mode)&&A.nfd&&ur.closeSync(A.nfd)}catch(A){if(!A.code)throw A;throw new EA.ErrnoError(hA[A.code])}},read:function(A,e,r,i,f){if(0===i)return 0;var n,t=new Buffer(i);try{n=ur.readSync(A.nfd,t,0,i,f)}catch(A){throw new EA.ErrnoError(hA[A.code])}if(0<n)for(var o=0;o<n;o++)e[r+o]=t[o];return n},write:function(A,e,r,i,f){var n,t=new Buffer(e.subarray(r,r+i));try{n=ur.writeSync(A.nfd,t,0,i,f)}catch(A){throw new EA.ErrnoError(hA[A.code])}return n},llseek:function(A,e,r){var i=e;if(1===r)i+=A.position;else if(2===r&&EA.isFile(A.node.mode))try{i+=ur.fstatSync(A.nfd).size}catch(A){throw new EA.ErrnoError(hA[A.code])}if(i<0)throw new EA.ErrnoError(hA.EINVAL);return i}}},BA={DIR_MODE:16895,FILE_MODE:33279,reader:null,mount:function(A){h(l),BA.reader||(BA.reader=new FileReaderSync);var n=BA.createNode(null,\\\"/\\\",BA.DIR_MODE,0),t={};function i(A){for(var e=A.split(\\\"/\\\"),r=n,i=0;i<e.length-1;i++){var f=e.slice(0,i+1).join(\\\"/\\\");t[f]||(t[f]=BA.createNode(r,e[i],BA.DIR_MODE,0)),r=t[f]}return r}function f(A){var e=A.split(\\\"/\\\");return e[e.length-1]}return Array.prototype.forEach.call(A.opts.files||[],function(A){BA.createNode(i(A.name),f(A.name),BA.FILE_MODE,0,A,A.lastModifiedDate)}),(A.opts.blobs||[]).forEach(function(A){BA.createNode(i(A.name),f(A.name),BA.FILE_MODE,0,A.data)}),(A.opts.packages||[]).forEach(function(r){r.metadata.files.forEach(function(A){var e=A.filename.substr(1);BA.createNode(i(e),f(e),BA.FILE_MODE,0,r.blob.slice(A.start,A.end))})}),n},createNode:function(A,e,r,i,f,n){var t=EA.createNode(A,e,r);return t.mode=r,t.node_ops=BA.node_ops,t.stream_ops=BA.stream_ops,t.timestamp=(n||new Date).getTime(),h(BA.FILE_MODE!==BA.DIR_MODE),r===BA.FILE_MODE?(t.size=f.size,t.contents=f):(t.size=4096,t.contents={}),A&&(A.contents[e]=t),t},node_ops:{getattr:function(A){return{dev:1,ino:void 0,mode:A.mode,nlink:1,uid:0,gid:0,rdev:void 0,size:A.size,atime:new Date(A.timestamp),mtime:new Date(A.timestamp),ctime:new Date(A.timestamp),blksize:4096,blocks:Math.ceil(A.size/4096)}},setattr:function(A,e){void 0!==e.mode&&(A.mode=e.mode),void 0!==e.timestamp&&(A.timestamp=e.timestamp)},lookup:function(A,e){throw new EA.ErrnoError(hA.ENOENT)},mknod:function(A,e,r,i){throw new EA.ErrnoError(hA.EPERM)},rename:function(A,e,r){throw new EA.ErrnoError(hA.EPERM)},unlink:function(A,e){throw new EA.ErrnoError(hA.EPERM)},rmdir:function(A,e){throw new EA.ErrnoError(hA.EPERM)},readdir:function(A){var e=[\\\".\\\",\\\"..\\\"];for(var r in A.contents)A.contents.hasOwnProperty(r)&&e.push(r);return e},symlink:function(A,e,r){throw new EA.ErrnoError(hA.EPERM)},readlink:function(A){throw new EA.ErrnoError(hA.EPERM)}},stream_ops:{read:function(A,e,r,i,f){if(f>=A.node.size)return 0;var n=A.node.contents.slice(f,f+i),t=BA.reader.readAsArrayBuffer(n);return e.set(new Uint8Array(t),r),n.size},write:function(A,e,r,i,f){throw new EA.ErrnoError(hA.EIO)},llseek:function(A,e,r){var i=e;if(1===r?i+=A.position:2===r&&EA.isFile(A.node.mode)&&(i+=A.node.size),i<0)throw new EA.ErrnoError(hA.EINVAL);return i}}};R+=16,R+=16,R+=16;var EA={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:\\\"/\\\",initialized:!1,ignorePermissions:!0,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,handleFSError:function(A){if(!(A instanceof EA.ErrnoError))throw A+\\\" : \\\"+p();return wA(A.errno)},lookupPath:function(A,e){if(e=e||{},!(A=mA.resolve(EA.cwd(),A)))return{path:\\\"\\\",node:null};var r={follow_mount:!0,recurse_count:0};for(var i in r)void 0===e[i]&&(e[i]=r[i]);if(8<e.recurse_count)throw new EA.ErrnoError(hA.ELOOP);for(var f=mA.normalizeArray(A.split(\\\"/\\\").filter(function(A){return!!A}),!1),n=EA.root,t=\\\"/\\\",o=0;o<f.length;o++){var a=o===f.length-1;if(a&&e.parent)break;if(n=EA.lookupNode(n,f[o]),t=mA.join2(t,f[o]),EA.isMountpoint(n)&&(!a||a&&e.follow_mount)&&(n=n.mounted.root),!a||e.follow)for(var c=0;EA.isLink(n.mode);){var l=EA.readlink(t);if(t=mA.resolve(mA.dirname(t),l),n=EA.lookupPath(t,{recurse_count:e.recurse_count}).node,40<c++)throw new EA.ErrnoError(hA.ELOOP)}}return{path:t,node:n}},getPath:function(A){for(var e;;){if(EA.isRoot(A)){var r=A.mount.mountpoint;return e?\\\"/\\\"!==r[r.length-1]?r+\\\"/\\\"+e:r+e:r}e=e?A.name+\\\"/\\\"+e:A.name,A=A.parent}},hashName:function(A,e){for(var r=0,i=0;i<e.length;i++)r=(r<<5)-r+e.charCodeAt(i)|0;return(A+r>>>0)%EA.nameTable.length},hashAddNode:function(A){var e=EA.hashName(A.parent.id,A.name);A.name_next=EA.nameTable[e],EA.nameTable[e]=A},hashRemoveNode:function(A){var e=EA.hashName(A.parent.id,A.name);if(EA.nameTable[e]===A)EA.nameTable[e]=A.name_next;else for(var r=EA.nameTable[e];r;){if(r.name_next===A){r.name_next=A.name_next;break}r=r.name_next}},lookupNode:function(A,e){var r=EA.mayLookup(A);if(r)throw new EA.ErrnoError(r,A);for(var i=EA.hashName(A.id,e),f=EA.nameTable[i];f;f=f.name_next){var n=f.name;if(f.parent.id===A.id&&n===e)return f}return EA.lookup(A,e)},createNode:function(A,e,r,i){if(!EA.FSNode){EA.FSNode=function(A,e,r,i){A=A||this,this.parent=A,this.mount=A.mount,this.mounted=null,this.id=EA.nextInode++,this.name=e,this.mode=r,this.node_ops={},this.stream_ops={},this.rdev=i},EA.FSNode.prototype={};Object.defineProperties(EA.FSNode.prototype,{read:{get:function(){return 365==(365&this.mode)},set:function(A){A?this.mode|=365:this.mode&=-366}},write:{get:function(){return 146==(146&this.mode)},set:function(A){A?this.mode|=146:this.mode&=-147}},isFolder:{get:function(){return EA.isDir(this.mode)}},isDevice:{get:function(){return EA.isChrdev(this.mode)}}})}var f=new EA.FSNode(A,e,r,i);return EA.hashAddNode(f),f},destroyNode:function(A){EA.hashRemoveNode(A)},isRoot:function(A){return A===A.parent},isMountpoint:function(A){return!!A.mounted},isFile:function(A){return 32768==(61440&A)},isDir:function(A){return 16384==(61440&A)},isLink:function(A){return 40960==(61440&A)},isChrdev:function(A){return 8192==(61440&A)},isBlkdev:function(A){return 24576==(61440&A)},isFIFO:function(A){return 4096==(61440&A)},isSocket:function(A){return 49152==(49152&A)},flagModes:{r:0,rs:1052672,\\\"r+\\\":2,w:577,wx:705,xw:705,\\\"w+\\\":578,\\\"wx+\\\":706,\\\"xw+\\\":706,a:1089,ax:1217,xa:1217,\\\"a+\\\":1090,\\\"ax+\\\":1218,\\\"xa+\\\":1218},modeStringToFlags:function(A){var e=EA.flagModes[A];if(void 0===e)throw new Error(\\\"Unknown file open mode: \\\"+A);return e},flagsToPermissionString:function(A){var e=[\\\"r\\\",\\\"w\\\",\\\"rw\\\"][3&A];return 512&A&&(e+=\\\"w\\\"),e},nodePermissions:function(A,e){return EA.ignorePermissions||(-1===e.indexOf(\\\"r\\\")||292&A.mode)&&(-1===e.indexOf(\\\"w\\\")||146&A.mode)&&(-1===e.indexOf(\\\"x\\\")||73&A.mode)?0:hA.EACCES},mayLookup:function(A){var e=EA.nodePermissions(A,\\\"x\\\");return e||(A.node_ops.lookup?0:hA.EACCES)},mayCreate:function(A,e){try{EA.lookupNode(A,e);return hA.EEXIST}catch(A){}return EA.nodePermissions(A,\\\"wx\\\")},mayDelete:function(A,e,r){var i;try{i=EA.lookupNode(A,e)}catch(A){return A.errno}var f=EA.nodePermissions(A,\\\"wx\\\");if(f)return f;if(r){if(!EA.isDir(i.mode))return hA.ENOTDIR;if(EA.isRoot(i)||EA.getPath(i)===EA.cwd())return hA.EBUSY}else if(EA.isDir(i.mode))return hA.EISDIR;return 0},mayOpen:function(A,e){return A?EA.isLink(A.mode)?hA.ELOOP:EA.isDir(A.mode)&&(\\\"r\\\"!==EA.flagsToPermissionString(e)||512&e)?hA.EISDIR:EA.nodePermissions(A,EA.flagsToPermissionString(e)):hA.ENOENT},MAX_OPEN_FDS:4096,nextfd:function(A,e){A=A||0,e=e||EA.MAX_OPEN_FDS;for(var r=A;r<=e;r++)if(!EA.streams[r])return r;throw new EA.ErrnoError(hA.EMFILE)},getStream:function(A){return EA.streams[A]},createStream:function(A,e,r){EA.FSStream||(EA.FSStream=function(){},EA.FSStream.prototype={},Object.defineProperties(EA.FSStream.prototype,{object:{get:function(){return this.node},set:function(A){this.node=A}},isRead:{get:function(){return 1!=(2097155&this.flags)}},isWrite:{get:function(){return 0!=(2097155&this.flags)}},isAppend:{get:function(){return 1024&this.flags}}}));var i=new EA.FSStream;for(var f in A)i[f]=A[f];A=i;var n=EA.nextfd(e,r);return A.fd=n,EA.streams[n]=A},closeStream:function(A){EA.streams[A]=null},chrdev_stream_ops:{open:function(A){var e=EA.getDevice(A.node.rdev);A.stream_ops=e.stream_ops,A.stream_ops.open&&A.stream_ops.open(A)},llseek:function(){throw new EA.ErrnoError(hA.ESPIPE)}},major:function(A){return A>>8},minor:function(A){return 255&A},makedev:function(A,e){return A<<8|e},registerDevice:function(A,e){EA.devices[A]={stream_ops:e}},getDevice:function(A){return EA.devices[A]},getMounts:function(A){for(var e=[],r=[A];r.length;){var i=r.pop();e.push(i),r.push.apply(r,i.mounts)}return e},syncfs:function(e,r){\\\"function\\\"==typeof e&&(r=e,e=!1),EA.syncFSRequests++,1<EA.syncFSRequests&&console.log(\\\"warning: \\\"+EA.syncFSRequests+\\\" FS.syncfs operations in flight at once, probably just doing extra work\\\");var i=EA.getMounts(EA.root.mount),f=0;function n(A){return h(0<EA.syncFSRequests),EA.syncFSRequests--,r(A)}function t(A){if(A)return t.errored?void 0:(t.errored=!0,n(A));++f>=i.length&&n(null)}i.forEach(function(A){if(!A.type.syncfs)return t(null);A.type.syncfs(A,e,t)})},mount:function(A,e,r){var i,f=\\\"/\\\"===r,n=!r;if(f&&EA.root)throw new EA.ErrnoError(hA.EBUSY);if(!f&&!n){var t=EA.lookupPath(r,{follow_mount:!1});if(r=t.path,i=t.node,EA.isMountpoint(i))throw new EA.ErrnoError(hA.EBUSY);if(!EA.isDir(i.mode))throw new EA.ErrnoError(hA.ENOTDIR)}var o={type:A,opts:e,mountpoint:r,mounts:[]},a=A.mount(o);return(a.mount=o).root=a,f?EA.root=a:i&&(i.mounted=o,i.mount&&i.mount.mounts.push(o)),a},unmount:function(A){var e=EA.lookupPath(A,{follow_mount:!1});if(!EA.isMountpoint(e.node))throw new EA.ErrnoError(hA.EINVAL);var r=e.node,i=r.mounted,f=EA.getMounts(i);Object.keys(EA.nameTable).forEach(function(A){for(var e=EA.nameTable[A];e;){var r=e.name_next;-1!==f.indexOf(e.mount)&&EA.destroyNode(e),e=r}}),r.mounted=null;var n=r.mount.mounts.indexOf(i);h(-1!==n),r.mount.mounts.splice(n,1)},lookup:function(A,e){return A.node_ops.lookup(A,e)},mknod:function(A,e,r){var i=EA.lookupPath(A,{parent:!0}).node,f=mA.basename(A);if(!f||\\\".\\\"===f||\\\"..\\\"===f)throw new EA.ErrnoError(hA.EINVAL);var n=EA.mayCreate(i,f);if(n)throw new EA.ErrnoError(n);if(!i.node_ops.mknod)throw new EA.ErrnoError(hA.EPERM);return i.node_ops.mknod(i,f,e,r)},create:function(A,e){return e=void 0!==e?e:438,e&=4095,e|=32768,EA.mknod(A,e,0)},mkdir:function(A,e){return e=void 0!==e?e:511,e&=1023,e|=16384,EA.mknod(A,e,0)},mkdirTree:function(A,e){for(var r=A.split(\\\"/\\\"),i=\\\"\\\",f=0;f<r.length;++f)if(r[f]){i+=\\\"/\\\"+r[f];try{EA.mkdir(i,e)}catch(A){if(A.errno!=hA.EEXIST)throw A}}},mkdev:function(A,e,r){return void 0===r&&(r=e,e=438),e|=8192,EA.mknod(A,e,r)},symlink:function(A,e){if(!mA.resolve(A))throw new EA.ErrnoError(hA.ENOENT);var r=EA.lookupPath(e,{parent:!0}).node;if(!r)throw new EA.ErrnoError(hA.ENOENT);var i=mA.basename(e),f=EA.mayCreate(r,i);if(f)throw new EA.ErrnoError(f);if(!r.node_ops.symlink)throw new EA.ErrnoError(hA.EPERM);return r.node_ops.symlink(r,i,A)},rename:function(e,r){var A,i,f=mA.dirname(e),n=mA.dirname(r),t=mA.basename(e),o=mA.basename(r);try{A=EA.lookupPath(e,{parent:!0}).node,i=EA.lookupPath(r,{parent:!0}).node}catch(A){throw new EA.ErrnoError(hA.EBUSY)}if(!A||!i)throw new EA.ErrnoError(hA.ENOENT);if(A.mount!==i.mount)throw new EA.ErrnoError(hA.EXDEV);var a,c=EA.lookupNode(A,t),l=mA.relative(e,n);if(\\\".\\\"!==l.charAt(0))throw new EA.ErrnoError(hA.EINVAL);if(\\\".\\\"!==(l=mA.relative(r,f)).charAt(0))throw new EA.ErrnoError(hA.ENOTEMPTY);try{a=EA.lookupNode(i,o)}catch(A){}if(c!==a){var u=EA.isDir(c.mode),b=EA.mayDelete(A,t,u);if(b)throw new EA.ErrnoError(b);if(b=a?EA.mayDelete(i,o,u):EA.mayCreate(i,o))throw new EA.ErrnoError(b);if(!A.node_ops.rename)throw new EA.ErrnoError(hA.EPERM);if(EA.isMountpoint(c)||a&&EA.isMountpoint(a))throw new EA.ErrnoError(hA.EBUSY);if(i!==A&&(b=EA.nodePermissions(A,\\\"w\\\")))throw new EA.ErrnoError(b);try{EA.trackingDelegate.willMovePath&&EA.trackingDelegate.willMovePath(e,r)}catch(A){console.log(\\\"FS.trackingDelegate[\\\\'willMovePath\\\\'](\\\\'\\\"+e+\\\"\\\\', \\\\'\\\"+r+\\\"\\\\') threw an exception: \\\"+A.message)}EA.hashRemoveNode(c);try{A.node_ops.rename(c,i,o)}catch(A){throw A}finally{EA.hashAddNode(c)}try{EA.trackingDelegate.onMovePath&&EA.trackingDelegate.onMovePath(e,r)}catch(A){console.log(\\\"FS.trackingDelegate[\\\\'onMovePath\\\\'](\\\\'\\\"+e+\\\"\\\\', \\\\'\\\"+r+\\\"\\\\') threw an exception: \\\"+A.message)}}},rmdir:function(e){var A=EA.lookupPath(e,{parent:!0}).node,r=mA.basename(e),i=EA.lookupNode(A,r),f=EA.mayDelete(A,r,!0);if(f)throw new EA.ErrnoError(f);if(!A.node_ops.rmdir)throw new EA.ErrnoError(hA.EPERM);if(EA.isMountpoint(i))throw new EA.ErrnoError(hA.EBUSY);try{EA.trackingDelegate.willDeletePath&&EA.trackingDelegate.willDeletePath(e)}catch(A){console.log(\\\"FS.trackingDelegate[\\\\'willDeletePath\\\\'](\\\\'\\\"+e+\\\"\\\\') threw an exception: \\\"+A.message)}A.node_ops.rmdir(A,r),EA.destroyNode(i);try{EA.trackingDelegate.onDeletePath&&EA.trackingDelegate.onDeletePath(e)}catch(A){console.log(\\\"FS.trackingDelegate[\\\\'onDeletePath\\\\'](\\\\'\\\"+e+\\\"\\\\') threw an exception: \\\"+A.message)}},readdir:function(A){var e=EA.lookupPath(A,{follow:!0}).node;if(!e.node_ops.readdir)throw new EA.ErrnoError(hA.ENOTDIR);return e.node_ops.readdir(e)},unlink:function(e){var A=EA.lookupPath(e,{parent:!0}).node,r=mA.basename(e),i=EA.lookupNode(A,r),f=EA.mayDelete(A,r,!1);if(f)throw new EA.ErrnoError(f);if(!A.node_ops.unlink)throw new EA.ErrnoError(hA.EPERM);if(EA.isMountpoint(i))throw new EA.ErrnoError(hA.EBUSY);try{EA.trackingDelegate.willDeletePath&&EA.trackingDelegate.willDeletePath(e)}catch(A){console.log(\\\"FS.trackingDelegate[\\\\'willDeletePath\\\\'](\\\\'\\\"+e+\\\"\\\\') threw an exception: \\\"+A.message)}A.node_ops.unlink(A,r),EA.destroyNode(i);try{EA.trackingDelegate.onDeletePath&&EA.trackingDelegate.onDeletePath(e)}catch(A){console.log(\\\"FS.trackingDelegate[\\\\'onDeletePath\\\\'](\\\\'\\\"+e+\\\"\\\\') threw an exception: \\\"+A.message)}},readlink:function(A){var e=EA.lookupPath(A).node;if(!e)throw new EA.ErrnoError(hA.ENOENT);if(!e.node_ops.readlink)throw new EA.ErrnoError(hA.EINVAL);return mA.resolve(EA.getPath(e.parent),e.node_ops.readlink(e))},stat:function(A,e){var r=EA.lookupPath(A,{follow:!e}).node;if(!r)throw new EA.ErrnoError(hA.ENOENT);if(!r.node_ops.getattr)throw new EA.ErrnoError(hA.EPERM);return r.node_ops.getattr(r)},lstat:function(A){return EA.stat(A,!0)},chmod:function(A,e,r){var i;\\\"string\\\"==typeof A?i=EA.lookupPath(A,{follow:!r}).node:i=A;if(!i.node_ops.setattr)throw new EA.ErrnoError(hA.EPERM);i.node_ops.setattr(i,{mode:4095&e|-4096&i.mode,timestamp:Date.now()})},lchmod:function(A,e){EA.chmod(A,e,!0)},fchmod:function(A,e){var r=EA.getStream(A);if(!r)throw new EA.ErrnoError(hA.EBADF);EA.chmod(r.node,e)},chown:function(A,e,r,i){var f;\\\"string\\\"==typeof A?f=EA.lookupPath(A,{follow:!i}).node:f=A;if(!f.node_ops.setattr)throw new EA.ErrnoError(hA.EPERM);f.node_ops.setattr(f,{timestamp:Date.now()})},lchown:function(A,e,r){EA.chown(A,e,r,!0)},fchown:function(A,e,r){var i=EA.getStream(A);if(!i)throw new EA.ErrnoError(hA.EBADF);EA.chown(i.node,e,r)},truncate:function(A,e){if(e<0)throw new EA.ErrnoError(hA.EINVAL);var r;\\\"string\\\"==typeof A?r=EA.lookupPath(A,{follow:!0}).node:r=A;if(!r.node_ops.setattr)throw new EA.ErrnoError(hA.EPERM);if(EA.isDir(r.mode))throw new EA.ErrnoError(hA.EISDIR);if(!EA.isFile(r.mode))throw new EA.ErrnoError(hA.EINVAL);var i=EA.nodePermissions(r,\\\"w\\\");if(i)throw new EA.ErrnoError(i);r.node_ops.setattr(r,{size:e,timestamp:Date.now()})},ftruncate:function(A,e){var r=EA.getStream(A);if(!r)throw new EA.ErrnoError(hA.EBADF);if(0==(2097155&r.flags))throw new EA.ErrnoError(hA.EINVAL);EA.truncate(r.node,e)},utime:function(A,e,r){var i=EA.lookupPath(A,{follow:!0}).node;i.node_ops.setattr(i,{timestamp:Math.max(e,r)})},open:function(e,A,r,i,f){if(\\\"\\\"===e)throw new EA.ErrnoError(hA.ENOENT);var n;if(r=void 0===r?438:r,r=64&(A=\\\"string\\\"==typeof A?EA.modeStringToFlags(A):A)?4095&r|32768:0,\\\"object\\\"==typeof e)n=e;else{e=mA.normalize(e);try{n=EA.lookupPath(e,{follow:!(131072&A)}).node}catch(A){}}var t=!1;if(64&A)if(n){if(128&A)throw new EA.ErrnoError(hA.EEXIST)}else n=EA.mknod(e,r,0),t=!0;if(!n)throw new EA.ErrnoError(hA.ENOENT);if(EA.isChrdev(n.mode)&&(A&=-513),65536&A&&!EA.isDir(n.mode))throw new EA.ErrnoError(hA.ENOTDIR);if(!t){var o=EA.mayOpen(n,A);if(o)throw new EA.ErrnoError(o)}512&A&&EA.truncate(n,0),A&=-641;var a=EA.createStream({node:n,path:EA.getPath(n),flags:A,seekable:!0,position:0,stream_ops:n.stream_ops,ungotten:[],error:!1},i,f);a.stream_ops.open&&a.stream_ops.open(a),!d.logReadFiles||1&A||(EA.readFiles||(EA.readFiles={}),e in EA.readFiles||(EA.readFiles[e]=1,d.printErr(\\\"read file: \\\"+e)));try{if(EA.trackingDelegate.onOpenFile){var c=0;1!=(2097155&A)&&(c|=EA.tracking.openFlags.READ),0!=(2097155&A)&&(c|=EA.tracking.openFlags.WRITE),EA.trackingDelegate.onOpenFile(e,c)}}catch(A){console.log(\\\"FS.trackingDelegate[\\\\'onOpenFile\\\\'](\\\\'\\\"+e+\\\"\\\\', flags) threw an exception: \\\"+A.message)}return a},close:function(A){A.getdents&&(A.getdents=null);try{A.stream_ops.close&&A.stream_ops.close(A)}catch(A){throw A}finally{EA.closeStream(A.fd)}},llseek:function(A,e,r){if(!A.seekable||!A.stream_ops.llseek)throw new EA.ErrnoError(hA.ESPIPE);return A.position=A.stream_ops.llseek(A,e,r),A.ungotten=[],A.position},read:function(A,e,r,i,f){if(i<0||f<0)throw new EA.ErrnoError(hA.EINVAL);if(1==(2097155&A.flags))throw new EA.ErrnoError(hA.EBADF);if(EA.isDir(A.node.mode))throw new EA.ErrnoError(hA.EISDIR);if(!A.stream_ops.read)throw new EA.ErrnoError(hA.EINVAL);var n=!0;if(void 0===f)f=A.position,n=!1;else if(!A.seekable)throw new EA.ErrnoError(hA.ESPIPE);var t=A.stream_ops.read(A,e,r,i,f);return n||(A.position+=t),t},write:function(A,e,r,i,f,n){if(i<0||f<0)throw new EA.ErrnoError(hA.EINVAL);if(0==(2097155&A.flags))throw new EA.ErrnoError(hA.EBADF);if(EA.isDir(A.node.mode))throw new EA.ErrnoError(hA.EISDIR);if(!A.stream_ops.write)throw new EA.ErrnoError(hA.EINVAL);1024&A.flags&&EA.llseek(A,0,2);var t=!0;if(void 0===f)f=A.position,t=!1;else if(!A.seekable)throw new EA.ErrnoError(hA.ESPIPE);var o=A.stream_ops.write(A,e,r,i,f,n);t||(A.position+=o);try{A.path&&EA.trackingDelegate.onWriteToFile&&EA.trackingDelegate.onWriteToFile(A.path)}catch(A){console.log(\\\"FS.trackingDelegate[\\\\'onWriteToFile\\\\'](\\\\'\\\"+path+\\\"\\\\') threw an exception: \\\"+A.message)}return o},allocate:function(A,e,r){if(e<0||r<=0)throw new EA.ErrnoError(hA.EINVAL);if(0==(2097155&A.flags))throw new EA.ErrnoError(hA.EBADF);if(!EA.isFile(A.node.mode)&&!EA.isDir(A.node.mode))throw new EA.ErrnoError(hA.ENODEV);if(!A.stream_ops.allocate)throw new EA.ErrnoError(hA.EOPNOTSUPP);A.stream_ops.allocate(A,e,r)},mmap:function(A,e,r,i,f,n,t){if(1==(2097155&A.flags))throw new EA.ErrnoError(hA.EACCES);if(!A.stream_ops.mmap)throw new EA.ErrnoError(hA.ENODEV);return A.stream_ops.mmap(A,e,r,i,f,n,t)},msync:function(A,e,r,i,f){return A&&A.stream_ops.msync?A.stream_ops.msync(A,e,r,i,f):0},munmap:function(A){return 0},ioctl:function(A,e,r){if(!A.stream_ops.ioctl)throw new EA.ErrnoError(hA.ENOTTY);return A.stream_ops.ioctl(A,e,r)},readFile:function(A,e){if((e=e||{}).flags=e.flags||\\\"r\\\",e.encoding=e.encoding||\\\"binary\\\",\\\"utf8\\\"!==e.encoding&&\\\"binary\\\"!==e.encoding)throw new Error(\\\\'Invalid encoding type \\\"\\\\'+e.encoding+\\\\'\\\"\\\\');var r,i=EA.open(A,e.flags),f=EA.stat(A).size,n=new Uint8Array(f);return EA.read(i,n,0,f,0),\\\"utf8\\\"===e.encoding?r=c(n,0):\\\"binary\\\"===e.encoding&&(r=n),EA.close(i),r},writeFile:function(A,e,r){if((r=r||{}).flags=r.flags||\\\"w\\\",r.encoding=r.encoding||\\\"utf8\\\",\\\"utf8\\\"!==r.encoding&&\\\"binary\\\"!==r.encoding)throw new Error(\\\\'Invalid encoding type \\\"\\\\'+r.encoding+\\\\'\\\"\\\\');var i=EA.open(A,r.flags,r.mode);if(\\\"utf8\\\"===r.encoding){var f=new Uint8Array(Z(e)+1),n=b(e,f,0,f.length);EA.write(i,f,0,n,0,r.canOwn)}else\\\"binary\\\"===r.encoding&&EA.write(i,e,0,e.length,0,r.canOwn);EA.close(i)},cwd:function(){return EA.currentPath},chdir:function(A){var e=EA.lookupPath(A,{follow:!0});if(null===e.node)throw new EA.ErrnoError(hA.ENOENT);if(!EA.isDir(e.node.mode))throw new EA.ErrnoError(hA.ENOTDIR);var r=EA.nodePermissions(e.node,\\\"x\\\");if(r)throw new EA.ErrnoError(r);EA.currentPath=e.path},createDefaultDirectories:function(){EA.mkdir(\\\"/tmp\\\"),EA.mkdir(\\\"/home\\\"),EA.mkdir(\\\"/home/web_user\\\")},createDefaultDevices:function(){var A;if(EA.mkdir(\\\"/dev\\\"),EA.registerDevice(EA.makedev(1,3),{read:function(){return 0},write:function(A,e,r,i,f){return i}}),EA.mkdev(\\\"/dev/null\\\",EA.makedev(1,3)),gA.register(EA.makedev(5,0),gA.default_tty_ops),gA.register(EA.makedev(6,0),gA.default_tty1_ops),EA.mkdev(\\\"/dev/tty\\\",EA.makedev(5,0)),EA.mkdev(\\\"/dev/tty1\\\",EA.makedev(6,0)),\\\"undefined\\\"!=typeof crypto){var e=new Uint8Array(1);A=function(){return crypto.getRandomValues(e),e[0]}}else A=o?function(){return require(\\\"crypto\\\").randomBytes(1)[0]}:function(){return 256*Math.random()|0};EA.createDevice(\\\"/dev\\\",\\\"random\\\",A),EA.createDevice(\\\"/dev\\\",\\\"urandom\\\",A),EA.mkdir(\\\"/dev/shm\\\"),EA.mkdir(\\\"/dev/shm/tmp\\\")},createSpecialDirectories:function(){EA.mkdir(\\\"/proc\\\"),EA.mkdir(\\\"/proc/self\\\"),EA.mkdir(\\\"/proc/self/fd\\\"),EA.mount({mount:function(){var A=EA.createNode(\\\"/proc/self\\\",\\\"fd\\\",16895,73);return A.node_ops={lookup:function(A,e){var r=+e,i=EA.getStream(r);if(!i)throw new EA.ErrnoError(hA.EBADF);var f={parent:null,mount:{mountpoint:\\\"fake\\\"},node_ops:{readlink:function(){return i.path}}};return f.parent=f}},A}},{},\\\"/proc/self/fd\\\")},createStandardStreams:function(){d.stdin?EA.createDevice(\\\"/dev\\\",\\\"stdin\\\",d.stdin):EA.symlink(\\\"/dev/tty\\\",\\\"/dev/stdin\\\"),d.stdout?EA.createDevice(\\\"/dev\\\",\\\"stdout\\\",null,d.stdout):EA.symlink(\\\"/dev/tty\\\",\\\"/dev/stdout\\\"),d.stderr?EA.createDevice(\\\"/dev\\\",\\\"stderr\\\",null,d.stderr):EA.symlink(\\\"/dev/tty1\\\",\\\"/dev/stderr\\\");var A=EA.open(\\\"/dev/stdin\\\",\\\"r\\\");h(0===A.fd,\\\"invalid handle for stdin (\\\"+A.fd+\\\")\\\");var e=EA.open(\\\"/dev/stdout\\\",\\\"w\\\");h(1===e.fd,\\\"invalid handle for stdout (\\\"+e.fd+\\\")\\\");var r=EA.open(\\\"/dev/stderr\\\",\\\"w\\\");h(2===r.fd,\\\"invalid handle for stderr (\\\"+r.fd+\\\")\\\")},ensureErrnoError:function(){EA.ErrnoError||(EA.ErrnoError=function(A,e){this.node=e,this.setErrno=function(A){for(var e in this.errno=A,hA)if(hA[e]===A){this.code=e;break}},this.setErrno(A),this.message=vA[A],this.stack&&Object.defineProperty(this,\\\"stack\\\",{value:(new Error).stack})},EA.ErrnoError.prototype=new Error,EA.ErrnoError.prototype.constructor=EA.ErrnoError,[hA.ENOENT].forEach(function(A){EA.genericErrors[A]=new EA.ErrnoError(A),EA.genericErrors[A].stack=\\\"<generic error, no stack>\\\"}))},staticInit:function(){EA.ensureErrnoError(),EA.nameTable=new Array(4096),EA.mount(ZA,{},\\\"/\\\"),EA.createDefaultDirectories(),EA.createDefaultDevices(),EA.createSpecialDirectories(),EA.filesystems={MEMFS:ZA,IDBFS:pA,NODEFS:yA,WORKERFS:BA}},init:function(A,e,r){h(!EA.init.initialized,\\\"FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)\\\"),EA.init.initialized=!0,EA.ensureErrnoError(),d.stdin=A||d.stdin,d.stdout=e||d.stdout,d.stderr=r||d.stderr,EA.createStandardStreams()},quit:function(){EA.init.initialized=!1;var A=d._fflush;A&&A(0);for(var e=0;e<EA.streams.length;e++){var r=EA.streams[e];r&&EA.close(r)}},getMode:function(A,e){var r=0;return A&&(r|=365),e&&(r|=146),r},joinPath:function(A,e){var r=mA.join.apply(null,A);return e&&\\\"/\\\"==r[0]&&(r=r.substr(1)),r},absolutePath:function(A,e){return mA.resolve(e,A)},standardizePath:function(A){return mA.normalize(A)},findObject:function(A,e){var r=EA.analyzePath(A,e);return r.exists?r.object:(wA(r.error),null)},analyzePath:function(A,e){try{A=(i=EA.lookupPath(A,{follow:!e})).path}catch(A){}var r={isRoot:!1,exists:!1,error:0,name:null,path:null,object:null,parentExists:!1,parentPath:null,parentObject:null};try{var i=EA.lookupPath(A,{parent:!0});r.parentExists=!0,r.parentPath=i.path,r.parentObject=i.node,r.name=mA.basename(A),i=EA.lookupPath(A,{follow:!e}),r.exists=!0,r.path=i.path,r.object=i.node,r.name=i.node.name,r.isRoot=\\\"/\\\"===i.path}catch(A){r.error=A.errno}return r},createFolder:function(A,e,r,i){var f=mA.join2(\\\"string\\\"==typeof A?A:EA.getPath(A),e),n=EA.getMode(r,i);return EA.mkdir(f,n)},createPath:function(A,e,r,i){A=\\\"string\\\"==typeof A?A:EA.getPath(A);for(var f=e.split(\\\"/\\\").reverse();f.length;){var n=f.pop();if(n){var t=mA.join2(A,n);try{EA.mkdir(t)}catch(A){}A=t}}return t},createFile:function(A,e,r,i,f){var n=mA.join2(\\\"string\\\"==typeof A?A:EA.getPath(A),e),t=EA.getMode(i,f);return EA.create(n,t)},createDataFile:function(A,e,r,i,f,n){var t=e?mA.join2(\\\"string\\\"==typeof A?A:EA.getPath(A),e):A,o=EA.getMode(i,f),a=EA.create(t,o);if(r){if(\\\"string\\\"==typeof r){for(var c=new Array(r.length),l=0,u=r.length;l<u;++l)c[l]=r.charCodeAt(l);r=c}EA.chmod(a,146|o);var b=EA.open(a,\\\"w\\\");EA.write(b,r,0,r.length,0,n),EA.close(b),EA.chmod(a,o)}return a},createDevice:function(A,e,a,t){var r=mA.join2(\\\"string\\\"==typeof A?A:EA.getPath(A),e),i=EA.getMode(!!a,!!t);EA.createDevice.major||(EA.createDevice.major=64);var f=EA.makedev(EA.createDevice.major++,0);return EA.registerDevice(f,{open:function(A){A.seekable=!1},close:function(A){t&&t.buffer&&t.buffer.length&&t(10)},read:function(A,e,r,i,f){for(var n=0,t=0;t<i;t++){var o;try{o=a()}catch(A){throw new EA.ErrnoError(hA.EIO)}if(void 0===o&&0===n)throw new EA.ErrnoError(hA.EAGAIN);if(null==o)break;n++,e[r+t]=o}return n&&(A.node.timestamp=Date.now()),n},write:function(A,e,r,i,f){for(var n=0;n<i;n++)try{t(e[r+n])}catch(A){throw new EA.ErrnoError(hA.EIO)}return i&&(A.node.timestamp=Date.now()),n}}),EA.mkdev(r,i,f)},createLink:function(A,e,r,i,f){var n=mA.join2(\\\"string\\\"==typeof A?A:EA.getPath(A),e);return EA.symlink(r,n)},forceLoadFile:function(A){if(A.isDevice||A.isFolder||A.link||A.contents)return!0;var e=!0;if(\\\"undefined\\\"!=typeof XMLHttpRequest)throw new Error(\\\"Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.\\\");if(!d.read)throw new Error(\\\"Cannot load without read() or XMLHttpRequest.\\\");try{A.contents=dr(d.read(A.url),!0),A.usedBytes=A.contents.length}catch(A){e=!1}return e||wA(hA.EIO),e},createLazyFile:function(A,e,o,r,i){function f(){this.lengthKnown=!1,this.chunks=[]}if(f.prototype.get=function(A){if(!(A>this.length-1||A<0)){var e=A%this.chunkSize,r=A/this.chunkSize|0;return this.getter(r)[e]}},f.prototype.setDataGetter=function(A){this.getter=A},f.prototype.cacheLength=function(){var A=new XMLHttpRequest;if(A.open(\\\"HEAD\\\",o,!1),A.send(null),!(200<=A.status&&A.status<300||304===A.status))throw new Error(\\\"Couldn\\\\'t load \\\"+o+\\\". Status: \\\"+A.status);var e,i=Number(A.getResponseHeader(\\\"Content-length\\\")),r=(e=A.getResponseHeader(\\\"Accept-Ranges\\\"))&&\\\"bytes\\\"===e,f=(e=A.getResponseHeader(\\\"Content-Encoding\\\"))&&\\\"gzip\\\"===e,n=1048576;r||(n=i);var t=this;t.setDataGetter(function(A){var e=A*n,r=(A+1)*n-1;if(r=Math.min(r,i-1),void 0===t.chunks[A]&&(t.chunks[A]=function(A,e){if(e<A)throw new Error(\\\"invalid range (\\\"+A+\\\", \\\"+e+\\\") or no bytes requested!\\\");if(i-1<e)throw new Error(\\\"only \\\"+i+\\\" bytes available! programmer error!\\\");var r=new XMLHttpRequest;if(r.open(\\\"GET\\\",o,!1),i!==n&&r.setRequestHeader(\\\"Range\\\",\\\"bytes=\\\"+A+\\\"-\\\"+e),\\\"undefined\\\"!=typeof Uint8Array&&(r.responseType=\\\"arraybuffer\\\"),r.overrideMimeType&&r.overrideMimeType(\\\"text/plain; charset=x-user-defined\\\"),r.send(null),!(200<=r.status&&r.status<300||304===r.status))throw new Error(\\\"Couldn\\\\'t load \\\"+o+\\\". Status: \\\"+r.status);return void 0!==r.response?new Uint8Array(r.response||[]):dr(r.responseText||\\\"\\\",!0)}(e,r)),void 0===t.chunks[A])throw new Error(\\\"doXHR failed!\\\");return t.chunks[A]}),!f&&i||(n=i=1,i=this.getter(0).length,n=i,console.log(\\\"LazyFiles on gzip forces download of the whole file when length is accessed\\\")),this._length=i,this._chunkSize=n,this.lengthKnown=!0},\\\"undefined\\\"!=typeof XMLHttpRequest){if(!l)throw\\\"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc\\\";var n=new f;Object.defineProperties(n,{length:{get:function(){return this.lengthKnown||this.cacheLength(),this._length}},chunkSize:{get:function(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}});var t={isDevice:!1,contents:n}}else t={isDevice:!1,url:o};var a=EA.createFile(A,e,t,r,i);t.contents?a.contents=t.contents:t.url&&(a.contents=null,a.url=t.url),Object.defineProperties(a,{usedBytes:{get:function(){return this.contents.length}}});var c={};return Object.keys(a.stream_ops).forEach(function(A){var e=a.stream_ops[A];c[A]=function(){if(!EA.forceLoadFile(a))throw new EA.ErrnoError(hA.EIO);return e.apply(null,arguments)}}),c.read=function(A,e,r,i,f){if(!EA.forceLoadFile(a))throw new EA.ErrnoError(hA.EIO);var n=A.node.contents;if(f>=n.length)return 0;var t=Math.min(n.length-f,i);if(h(0<=t),n.slice)for(var o=0;o<t;o++)e[r+o]=n[f+o];else for(o=0;o<t;o++)e[r+o]=n.get(f+o);return t},a.stream_ops=c,a},createPreloadedFile:function(f,n,A,t,o,a,c,l,u,b){Browser.init();var s=n?mA.resolve(mA.join2(f,n)):f;function e(e){function r(A){b&&b(),l||EA.createDataFile(f,n,A,t,o,u),a&&a(),uA()}var i=!1;d.preloadPlugins.forEach(function(A){i||A.canHandle(s)&&(A.handle(e,s,r,function(){c&&c(),uA()}),i=!0)}),i||r(e)}lA(),\\\"string\\\"==typeof A?Browser.asyncLoad(A,function(A){e(A)},c):e(A)},indexedDB:function(){return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},DB_NAME:function(){return\\\"EM_FS_\\\"+window.location.pathname},DB_VERSION:20,DB_STORE_NAME:\\\"FILE_DATA\\\",saveFilesToDB:function(e,o,a){o=o||function(){},a=a||function(){};var A=EA.indexedDB();try{var c=A.open(EA.DB_NAME(),EA.DB_VERSION)}catch(A){return a(A)}c.onupgradeneeded=function(){console.log(\\\"creating db\\\"),c.result.createObjectStore(EA.DB_STORE_NAME)},c.onsuccess=function(){var A=c.result.transaction([EA.DB_STORE_NAME],\\\"readwrite\\\"),r=A.objectStore(EA.DB_STORE_NAME),i=0,f=0,n=e.length;function t(){(0==f?o:a)()}e.forEach(function(A){var e=r.put(EA.analyzePath(A).object.contents,A);e.onsuccess=function(){++i+f==n&&t()},e.onerror=function(){i+ ++f==n&&t()}}),A.onerror=a},c.onerror=a},loadFilesFromDB:function(o,a,c){a=a||function(){},c=c||function(){};var A=EA.indexedDB();try{var l=A.open(EA.DB_NAME(),EA.DB_VERSION)}catch(A){return c(A)}l.onupgradeneeded=c,l.onsuccess=function(){var A=l.result;try{var e=A.transaction([EA.DB_STORE_NAME],\\\"readonly\\\")}catch(A){return void c(A)}var r=e.objectStore(EA.DB_STORE_NAME),i=0,f=0,n=o.length;function t(){(0==f?a:c)()}o.forEach(function(A){var e=r.get(A);e.onsuccess=function(){EA.analyzePath(A).exists&&EA.unlink(A),EA.createDataFile(mA.dirname(A),mA.basename(A),e.result,!0,!0,!0),++i+f==n&&t()},e.onerror=function(){i+ ++f==n&&t()}}),e.onerror=c},l.onerror=c}},XA={DEFAULT_POLLMASK:5,mappings:{},umask:511,calculateAt:function(A,e){if(\\\"/\\\"!==e[0]){var r;if(-100===A)r=EA.cwd();else{var i=EA.getStream(A);if(!i)throw new EA.ErrnoError(hA.EBADF);r=i.path}e=mA.join2(r,e)}return e},doStat:function(A,e,r){try{var i=A(e)}catch(A){if(A&&A.node&&mA.normalize(e)!==mA.normalize(EA.getPath(A.node)))return-hA.ENOTDIR;throw A}return I[r>>2]=i.dev,I[r+4>>2]=0,I[r+8>>2]=i.ino,I[r+12>>2]=i.mode,I[r+16>>2]=i.nlink,I[r+20>>2]=i.uid,I[r+24>>2]=i.gid,I[r+28>>2]=i.rdev,I[r+32>>2]=0,I[r+36>>2]=i.size,I[r+40>>2]=4096,I[r+44>>2]=i.blocks,I[r+48>>2]=i.atime.getTime()/1e3|0,I[r+52>>2]=0,I[r+56>>2]=i.mtime.getTime()/1e3|0,I[r+60>>2]=0,I[r+64>>2]=i.ctime.getTime()/1e3|0,I[r+68>>2]=0,I[r+72>>2]=i.ino,0},doMsync:function(A,e,r,i){var f=new Uint8Array(E.subarray(A,A+r));EA.msync(e,f,0,r,i)},doMkdir:function(A,e){return\\\"/\\\"===(A=mA.normalize(A))[A.length-1]&&(A=A.substr(0,A.length-1)),EA.mkdir(A,e,0),0},doMknod:function(A,e,r){switch(61440&e){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-hA.EINVAL}return EA.mknod(A,e,r),0},doReadlink:function(A,e,r){if(r<=0)return-hA.EINVAL;var i=EA.readlink(A),f=Math.min(r,Z(i)),n=B[e+f];return s(i,e,r+1),B[e+f]=n,f},doAccess:function(A,e){if(-8&e)return-hA.EINVAL;var r;r=EA.lookupPath(A,{follow:!0}).node;var i=\\\"\\\";return 4&e&&(i+=\\\"r\\\"),2&e&&(i+=\\\"w\\\"),1&e&&(i+=\\\"x\\\"),i&&EA.nodePermissions(r,i)?-hA.EACCES:0},doDup:function(A,e,r){var i=EA.getStream(r);return i&&EA.close(i),EA.open(A,e,0,r,r).fd},doReadv:function(A,e,r,i){for(var f=0,n=0;n<r;n++){var t=I[e+8*n>>2],o=I[e+(8*n+4)>>2],a=EA.read(A,B,t,o,i);if(a<0)return-1;if(f+=a,a<o)break}return f},doWritev:function(A,e,r,i){for(var f=0,n=0;n<r;n++){var t=I[e+8*n>>2],o=I[e+(8*n+4)>>2],a=EA.write(A,B,t,o,i);if(a<0)return-1;f+=a}return f},varargs:0,get:function(A){return XA.varargs+=4,I[XA.varargs-4>>2]},getStr:function(){return g(XA.get())},getStreamFromFD:function(){var A=EA.getStream(XA.get());if(!A)throw new EA.ErrnoError(hA.EBADF);return A},getSocketFromFD:function(){var A=SOCKFS.getSocket(XA.get());if(!A)throw new EA.ErrnoError(hA.EBADF);return A},getSocketAddress:function(A){var e=XA.get(),r=XA.get();if(A&&0===e)return null;var i=__read_sockaddr(e,r);if(i.errno)throw new EA.ErrnoError(i.errno);return i.addr=DNS.lookup_addr(i.addr)||i.addr,i},get64:function(){var A=XA.get(),e=XA.get();return h(0<=A?0===e:-1===e),A},getZero:function(){h(0===XA.get())}};var WA=a([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0],\\\"i8\\\",v);var IA={};function CA(A){for(;A.length;){var e=A.pop();A.pop()(e)}}function GA(A){return this.fromWireType(C[A>>2])}var VA={},FA={},RA={},NA=48,_A=57;function YA(A){if(void 0===A)return\\\"_unknown\\\";var e=(A=A.replace(/[^a-zA-Z0-9_]/g,\\\"$\\\")).charCodeAt(0);return NA<=e&&e<=_A?\\\"_\\\"+A:A}function QA(A,e){return A=YA(A),new Function(\\\"body\\\",\\\"return function \\\"+A+\\\\'() {\\\\\\\\n    \\\"use strict\\\";    return body.apply(this, arguments);\\\\\\\\n};\\\\\\\\n\\\\')(e)}function DA(A,r){var e=QA(r,function(A){this.name=r,this.message=A;var e=new Error(A).stack;void 0!==e&&(this.stack=this.toString()+\\\"\\\\\\\\n\\\"+e.replace(/^Error(:[^\\\\\\\\n]*)?\\\\\\\\n/,\\\"\\\"))});return e.prototype=Object.create(A.prototype),(e.prototype.constructor=e).prototype.toString=function(){return void 0===this.message?this.name:this.name+\\\": \\\"+this.message},e}var JA=void 0;function MA(A){throw new JA(A)}function TA(i,e,f){function r(A){var e=f(A);e.length!==i.length&&MA(\\\"Mismatched type converter count\\\");for(var r=0;r<i.length;++r)xA(i[r],e[r])}i.forEach(function(A){RA[A]=e});var n=new Array(e.length),t=[],o=0;e.forEach(function(A,e){FA.hasOwnProperty(A)?n[e]=FA[A]:(t.push(A),VA.hasOwnProperty(A)||(VA[A]=[]),VA[A].push(function(){n[e]=FA[A],++o===t.length&&r(n)}))}),0===t.length&&r(n)}function UA(A){switch(A){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError(\\\"Unknown type size: \\\"+A)}}function SA(){for(var A=new Array(256),e=0;e<256;++e)A[e]=String.fromCharCode(e);OA=A}var OA=void 0;function zA(A){for(var e=\\\"\\\",r=A;E[r];)e+=OA[E[r++]];return e}var jA=void 0;function HA(A){throw new jA(A)}function xA(A,e,r){if(r=r||{},!(\\\"argPackAdvance\\\"in e))throw new TypeError(\\\"registerType registeredInstance requires argPackAdvance\\\");var i=e.name;if(A||HA(\\\\'type \\\"\\\\'+i+\\\\'\\\" must have a positive integer typeid pointer\\\\'),FA.hasOwnProperty(A)){if(r.ignoreDuplicateRegistrations)return;HA(\\\"Cannot register type \\\\'\\\"+i+\\\"\\\\' twice\\\")}if(FA[A]=e,delete RA[A],VA.hasOwnProperty(A)){var f=VA[A];delete VA[A],f.forEach(function(A){A()})}}function PA(A){if(!(this instanceof oe))return!1;if(!(A instanceof oe))return!1;for(var e=this.$$.ptrType.registeredClass,r=this.$$.ptr,i=A.$$.ptrType.registeredClass,f=A.$$.ptr;e.baseClass;)r=e.upcast(r),e=e.baseClass;for(;i.baseClass;)f=i.upcast(f),i=i.baseClass;return e===i&&r===f}function LA(A){return{count:A.count,deleteScheduled:A.deleteScheduled,preservePointerOnDelete:A.preservePointerOnDelete,ptr:A.ptr,ptrType:A.ptrType,smartPtr:A.smartPtr,smartPtrType:A.smartPtrType}}function KA(A){HA(A.$$.ptrType.registeredClass.name+\\\" instance already deleted\\\")}function qA(){if(this.$$.ptr||KA(this),this.$$.preservePointerOnDelete)return this.$$.count.value+=1,this;var A=Object.create(Object.getPrototypeOf(this),{$$:{value:LA(this.$$)}});return A.$$.count.value+=1,A.$$.deleteScheduled=!1,A}function $A(A){var e=A.$$;e.smartPtr?e.smartPtrType.rawDestructor(e.smartPtr):e.ptrType.registeredClass.rawDestructor(e.ptr)}function Ae(){this.$$.ptr||KA(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&HA(\\\"Object already scheduled for deletion\\\"),--this.$$.count.value,0===this.$$.count.value&&$A(this),this.$$.preservePointerOnDelete||(this.$$.smartPtr=void 0,this.$$.ptr=void 0)}function ee(){return!this.$$.ptr}var re=void 0,ie=[];function fe(){for(;ie.length;){var A=ie.pop();A.$$.deleteScheduled=!1,A.delete()}}function ne(){return this.$$.ptr||KA(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&HA(\\\"Object already scheduled for deletion\\\"),ie.push(this),1===ie.length&&re&&re(fe),this.$$.deleteScheduled=!0,this}function te(){oe.prototype.isAliasOf=PA,oe.prototype.clone=qA,oe.prototype.delete=Ae,oe.prototype.isDeleted=ee,oe.prototype.deleteLater=ne}function oe(){}var ae={};function ce(A,e,r){if(void 0===A[e].overloadTable){var i=A[e];A[e]=function(){return A[e].overloadTable.hasOwnProperty(arguments.length)||HA(\\\"Function \\\\'\\\"+r+\\\"\\\\' called with an invalid number of arguments (\\\"+arguments.length+\\\") - expects one of (\\\"+A[e].overloadTable+\\\")!\\\"),A[e].overloadTable[arguments.length].apply(this,arguments)},A[e].overloadTable=[],A[e].overloadTable[i.argCount]=i}}function le(A,e,r){d.hasOwnProperty(A)?((void 0===r||void 0!==d[A].overloadTable&&void 0!==d[A].overloadTable[r])&&HA(\\\"Cannot register public name \\\\'\\\"+A+\\\"\\\\' twice\\\"),ce(d,A,A),d.hasOwnProperty(r)&&HA(\\\"Cannot register multiple overloads of a function with the same number of arguments (\\\"+r+\\\")!\\\"),d[A].overloadTable[r]=e):(d[A]=e,void 0!==r&&(d[A].numArguments=r))}function ue(A,e,r,i,f,n,t,o){this.name=A,this.constructor=e,this.instancePrototype=r,this.rawDestructor=i,this.baseClass=f,this.getActualType=n,this.upcast=t,this.downcast=o,this.pureVirtualFunctions=[]}function be(A,e,r){for(;e!==r;)e.upcast||HA(\\\"Expected null or instance of \\\"+r.name+\\\", got an instance of \\\"+e.name),A=e.upcast(A),e=e.baseClass;return A}function se(A,e){if(null===e)return this.isReference&&HA(\\\"null is not a valid \\\"+this.name),0;e.$$||HA(\\\\'Cannot pass \\\"\\\\'+ze(e)+\\\\'\\\" as a \\\\'+this.name),e.$$.ptr||HA(\\\"Cannot pass deleted object as a pointer of type \\\"+this.name);var r=e.$$.ptrType.registeredClass;return be(e.$$.ptr,r,this.registeredClass)}function de(A,e){var r;if(null===e)return this.isReference&&HA(\\\"null is not a valid \\\"+this.name),this.isSmartPointer?(r=this.rawConstructor(),null!==A&&A.push(this.rawDestructor,r),r):0;e.$$||HA(\\\\'Cannot pass \\\"\\\\'+ze(e)+\\\\'\\\" as a \\\\'+this.name),e.$$.ptr||HA(\\\"Cannot pass deleted object as a pointer of type \\\"+this.name),!this.isConst&&e.$$.ptrType.isConst&&HA(\\\"Cannot convert argument of type \\\"+(e.$$.smartPtrType?e.$$.smartPtrType.name:e.$$.ptrType.name)+\\\" to parameter type \\\"+this.name);var i=e.$$.ptrType.registeredClass;if(r=be(e.$$.ptr,i,this.registeredClass),this.isSmartPointer)switch(void 0===e.$$.smartPtr&&HA(\\\"Passing raw pointer to smart pointer is illegal\\\"),this.sharingPolicy){case 0:e.$$.smartPtrType===this?r=e.$$.smartPtr:HA(\\\"Cannot convert argument of type \\\"+(e.$$.smartPtrType?e.$$.smartPtrType.name:e.$$.ptrType.name)+\\\" to parameter type \\\"+this.name);break;case 1:r=e.$$.smartPtr;break;case 2:if(e.$$.smartPtrType===this)r=e.$$.smartPtr;else{var f=e.clone();r=this.rawShare(r,Ue(function(){f.delete()})),null!==A&&A.push(this.rawDestructor,r)}break;default:HA(\\\"Unsupporting sharing policy\\\")}return r}function ke(A,e){if(null===e)return this.isReference&&HA(\\\"null is not a valid \\\"+this.name),0;e.$$||HA(\\\\'Cannot pass \\\"\\\\'+ze(e)+\\\\'\\\" as a \\\\'+this.name),e.$$.ptr||HA(\\\"Cannot pass deleted object as a pointer of type \\\"+this.name),e.$$.ptrType.isConst&&HA(\\\"Cannot convert argument of type \\\"+e.$$.ptrType.name+\\\" to parameter type \\\"+this.name);var r=e.$$.ptrType.registeredClass;return be(e.$$.ptr,r,this.registeredClass)}function he(A){return this.rawGetPointee&&(A=this.rawGetPointee(A)),A}function we(A){this.rawDestructor&&this.rawDestructor(A)}function ve(A){null!==A&&A.delete()}function me(A,e,r){if(e===r)return A;if(void 0===r.baseClass)return null;var i=me(A,e,r.baseClass);return null===i?null:r.downcast(i)}function ge(){return Object.keys(Be).length}function Ze(){var A=[];for(var e in Be)Be.hasOwnProperty(e)&&A.push(Be[e]);return A}function pe(A){re=A,ie.length&&re&&re(fe)}function ye(){d.getInheritedInstanceCount=ge,d.getLiveInheritedInstances=Ze,d.flushPendingDeletes=fe,d.setDelayFunction=pe}var Be={};function Ee(A,e){for(void 0===e&&HA(\\\"ptr should not be undefined\\\");A.baseClass;)e=A.upcast(e),A=A.baseClass;return e}function Xe(A,e){return e=Ee(A,e),Be[e]}function We(A,e){return e.ptrType&&e.ptr||MA(\\\"makeClassHandle requires ptr and ptrType\\\"),!!e.smartPtrType!=!!e.smartPtr&&MA(\\\"Both smartPtrType and smartPtr must be specified\\\"),e.count={value:1},Object.create(A,{$$:{value:e}})}function Ie(A){var e=this.getPointee(A);if(!e)return this.destructor(A),null;var r=Xe(this.registeredClass,e);if(void 0!==r){if(0===r.$$.count.value)return r.$$.ptr=e,r.$$.smartPtr=A,r.clone();var i=r.clone();return this.destructor(A),i}function f(){return this.isSmartPointer?We(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:e,smartPtrType:this,smartPtr:A}):We(this.registeredClass.instancePrototype,{ptrType:this,ptr:A})}var n,t=this.registeredClass.getActualType(e),o=ae[t];if(!o)return f.call(this);n=this.isConst?o.constPointerType:o.pointerType;var a=me(e,this.registeredClass,n.registeredClass);return null===a?f.call(this):this.isSmartPointer?We(n.registeredClass.instancePrototype,{ptrType:n,ptr:a,smartPtrType:this,smartPtr:A}):We(n.registeredClass.instancePrototype,{ptrType:n,ptr:a})}function Ce(){Ge.prototype.getPointee=he,Ge.prototype.destructor=we,Ge.prototype.argPackAdvance=8,Ge.prototype.readValueFromPointer=GA,Ge.prototype.deleteObject=ve,Ge.prototype.fromWireType=Ie}function Ge(A,e,r,i,f,n,t,o,a,c,l){this.name=A,this.registeredClass=e,this.isReference=r,this.isConst=i,this.isSmartPointer=f,this.pointeeType=n,this.sharingPolicy=t,this.rawGetPointee=o,this.rawConstructor=a,this.rawShare=c,this.rawDestructor=l,f||void 0!==e.baseClass?this.toWireType=de:(this.toWireType=i?se:ke,this.destructorFunction=null)}function Ve(A,e,r){d.hasOwnProperty(A)||MA(\\\"Replacing nonexistant public symbol\\\"),void 0!==d[A].overloadTable&&void 0!==r?d[A].overloadTable[r]=e:(d[A]=e,d[A].argCount=r)}function Fe(f,n){var A;if(f=zA(f),void 0!==d[\\\"FUNCTION_TABLE_\\\"+f])A=d[\\\"FUNCTION_TABLE_\\\"+f][n];else if(\\\"undefined\\\"!=typeof FUNCTION_TABLE)A=FUNCTION_TABLE[n];else{var e=d.asm[\\\"dynCall_\\\"+f];void 0===e&&void 0===(e=d.asm[\\\"dynCall_\\\"+f.replace(/f/g,\\\"d\\\")])&&HA(\\\"No dynCall invoker for signature: \\\"+f),A=function(A){for(var e=[],r=1;r<f.length;++r)e.push(\\\"a\\\"+r);var i=\\\"return function \\\"+(\\\"dynCall_\\\"+f+\\\"_\\\"+n)+\\\"(\\\"+e.join(\\\", \\\")+\\\") {\\\\\\\\n\\\";return i+=\\\"    return dynCall(rawFunction\\\"+(e.length?\\\", \\\":\\\"\\\")+e.join(\\\", \\\")+\\\");\\\\\\\\n\\\",i+=\\\"};\\\\\\\\n\\\",new Function(\\\"dynCall\\\",\\\"rawFunction\\\",i)(A,n)}(e)}return\\\"function\\\"!=typeof A&&HA(\\\"unknown function pointer with signature \\\"+f+\\\": \\\"+n),A}var Re=void 0;function Ne(A){var e=Wr(A),r=zA(e);return Cr(e),r}function _e(A,e){var r=[],i={};throw e.forEach(function A(e){i[e]||FA[e]||(RA[e]?RA[e].forEach(A):(r.push(e),i[e]=!0))}),new Re(A+\\\": \\\"+r.map(Ne).join([\\\", \\\"]))}var Ye=[],Qe=[{},{value:void 0},{value:null},{value:!0},{value:!1}];function De(A){4<A&&0==--Qe[A].refcount&&(Qe[A]=void 0,Ye.push(A))}function Je(){for(var A=0,e=5;e<Qe.length;++e)void 0!==Qe[e]&&++A;return A}function Me(){for(var A=5;A<Qe.length;++A)if(void 0!==Qe[A])return Qe[A];return null}function Te(){d.count_emval_handles=Je,d.get_first_emval=Me}function Ue(A){switch(A){case void 0:return 1;case null:return 2;case!0:return 3;case!1:return 4;default:var e=Ye.length?Ye.pop():Qe.length;return Qe[e]={refcount:1,value:A},e}}function Se(A,e,r){switch(e){case 0:return function(A){var e=r?B:E;return this.fromWireType(e[A])};case 1:return function(A){var e=r?X:W;return this.fromWireType(e[A>>1])};case 2:return function(A){var e=r?I:C;return this.fromWireType(e[A>>2])};default:throw new TypeError(\\\"Unknown integer type: \\\"+A)}}function Oe(A,e){var r=FA[A];return void 0===r&&HA(e+\\\" has unknown type \\\"+Ne(A)),r}function ze(A){if(null===A)return\\\"null\\\";var e=typeof A;return\\\"object\\\"==e||\\\"array\\\"==e||\\\"function\\\"==e?A.toString():\\\"\\\"+A}function je(A,e){switch(e){case 2:return function(A){return this.fromWireType(G[A>>2])};case 3:return function(A){return this.fromWireType(V[A>>3])};default:throw new TypeError(\\\"Unknown float type: \\\"+A)}}function He(A,e){if(!(A instanceof Function))throw new TypeError(\\\"new_ called with constructor type \\\"+typeof A+\\\" which is not a function\\\");var r=QA(A.name||\\\"unknownFunctionName\\\",function(){});r.prototype=A.prototype;var i=new r,f=A.apply(i,e);return f instanceof Object?f:i}function xe(A,e,r,i,f){var n=e.length;n<2&&HA(\\\"argTypes array size mismatch! Must at least get return value and \\\\'this\\\\' types!\\\");for(var t=null!==e[1]&&null!==r,o=!1,a=1;a<e.length;++a)if(null!==e[a]&&void 0===e[a].destructorFunction){o=!0;break}var c=\\\"void\\\"!==e[0].name,l=\\\"\\\",u=\\\"\\\";for(a=0;a<n-2;++a)l+=(0!==a?\\\", \\\":\\\"\\\")+\\\"arg\\\"+a,u+=(0!==a?\\\", \\\":\\\"\\\")+\\\"arg\\\"+a+\\\"Wired\\\";var b=\\\"return function \\\"+YA(A)+\\\"(\\\"+l+\\\") {\\\\\\\\nif (arguments.length !== \\\"+(n-2)+\\\") {\\\\\\\\nthrowBindingError(\\\\'function \\\"+A+\\\" called with \\\\' + arguments.length + \\\\' arguments, expected \\\"+(n-2)+\\\" args!\\\\');\\\\\\\\n}\\\\\\\\n\\\";o&&(b+=\\\"var destructors = [];\\\\\\\\n\\\");var s=o?\\\"destructors\\\":\\\"null\\\",d=[\\\"throwBindingError\\\",\\\"invoker\\\",\\\"fn\\\",\\\"runDestructors\\\",\\\"retType\\\",\\\"classParam\\\"],k=[HA,i,f,CA,e[0],e[1]];t&&(b+=\\\"var thisWired = classParam.toWireType(\\\"+s+\\\", this);\\\\\\\\n\\\");for(a=0;a<n-2;++a)b+=\\\"var arg\\\"+a+\\\"Wired = argType\\\"+a+\\\".toWireType(\\\"+s+\\\", arg\\\"+a+\\\"); // \\\"+e[a+2].name+\\\"\\\\\\\\n\\\",d.push(\\\"argType\\\"+a),k.push(e[a+2]);if(t&&(u=\\\"thisWired\\\"+(0<u.length?\\\", \\\":\\\"\\\")+u),b+=(c?\\\"var rv = \\\":\\\"\\\")+\\\"invoker(fn\\\"+(0<u.length?\\\", \\\":\\\"\\\")+u+\\\");\\\\\\\\n\\\",o)b+=\\\"runDestructors(destructors);\\\\\\\\n\\\";else for(a=t?1:2;a<e.length;++a){var h=1===a?\\\"thisWired\\\":\\\"arg\\\"+(a-2)+\\\"Wired\\\";null!==e[a].destructorFunction&&(b+=h+\\\"_dtor(\\\"+h+\\\"); // \\\"+e[a].name+\\\"\\\\\\\\n\\\",d.push(h+\\\"_dtor\\\"),k.push(e[a].destructorFunction))}return c&&(b+=\\\"var ret = retType.fromWireType(rv);\\\\\\\\nreturn ret;\\\\\\\\n\\\"),b+=\\\"}\\\\\\\\n\\\",d.push(b),He(Function,d).apply(null,k)}function Pe(A,e){for(var r=[],i=0;i<A;i++)r.push(I[(e>>2)+i]);return r}function Le(A,e,r){switch(e){case 0:return r?function(A){return B[A]}:function(A){return E[A]};case 1:return r?function(A){return X[A>>1]}:function(A){return W[A>>1]};case 2:return r?function(A){return I[A>>2]}:function(A){return C[A>>2]};default:throw new TypeError(\\\"Unknown integer type: \\\"+A)}}var Ke={};function qe(A){var e=Ke[A];return void 0===e?zA(A):e}function $e(A){return A||HA(\\\"Cannot use deleted val. handle = \\\"+A),Qe[A].value}var Ar=R;function er(A){var e,r;er.called?(r=I[Ar>>2],e=I[r>>2]):(er.called=!0,rr.USER=rr.LOGNAME=\\\"web_user\\\",rr.PATH=\\\"/\\\",rr.PWD=\\\"/\\\",rr.HOME=\\\"/home/web_user\\\",rr.LANG=\\\"C.UTF-8\\\",rr._=d.thisProgram,e=a(1024,\\\"i8\\\",v),r=a(256,\\\"i8*\\\",v),I[r>>2]=e,I[Ar>>2]=r);var i=[],f=0;for(var n in A)if(\\\"string\\\"==typeof A[n]){var t=n+\\\"=\\\"+A[n];i.push(t),f+=t.length}if(1024<f)throw new Error(\\\"Environment size exceeded TOTAL_ENV_SIZE!\\\");for(var o=0;o<i.length;o++){rA(t=i[o],e),I[r+4*o>>2]=e,e+=t.length+1}I[r+4*i.length>>2]=0}R+=16;var rr={};var ir={};var fr=1;function nr(A){return A%4==0&&(A%100!=0||A%400==0)}function tr(A,e){for(var r=0,i=0;i<=e;r+=A[i++]);return r}var or=[31,29,31,30,31,30,31,31,30,31,30,31],ar=[31,28,31,30,31,30,31,31,30,31,30,31];function cr(A,e){for(var r=new Date(A.getTime());0<e;){var i=nr(r.getFullYear()),f=r.getMonth(),n=(i?or:ar)[f];if(!(e>n-r.getDate()))return r.setDate(r.getDate()+e),r;e-=n-r.getDate()+1,r.setDate(1),f<11?r.setMonth(f+1):(r.setMonth(0),r.setFullYear(r.getFullYear()+1))}return r}function lr(A,e,r,i){var f=I[i+40>>2],n={tm_sec:I[i>>2],tm_min:I[i+4>>2],tm_hour:I[i+8>>2],tm_mday:I[i+12>>2],tm_mon:I[i+16>>2],tm_year:I[i+20>>2],tm_wday:I[i+24>>2],tm_yday:I[i+28>>2],tm_isdst:I[i+32>>2],tm_gmtoff:I[i+36>>2],tm_zone:f?g(f):\\\"\\\"},t=g(r),o={\\\"%c\\\":\\\"%a %b %d %H:%M:%S %Y\\\",\\\"%D\\\":\\\"%m/%d/%y\\\",\\\"%F\\\":\\\"%Y-%m-%d\\\",\\\"%h\\\":\\\"%b\\\",\\\"%r\\\":\\\"%I:%M:%S %p\\\",\\\"%R\\\":\\\"%H:%M\\\",\\\"%T\\\":\\\"%H:%M:%S\\\",\\\"%x\\\":\\\"%m/%d/%y\\\",\\\"%X\\\":\\\"%H:%M:%S\\\"};for(var a in o)t=t.replace(new RegExp(a,\\\"g\\\"),o[a]);var c=[\\\"Sunday\\\",\\\"Monday\\\",\\\"Tuesday\\\",\\\"Wednesday\\\",\\\"Thursday\\\",\\\"Friday\\\",\\\"Saturday\\\"],l=[\\\"January\\\",\\\"February\\\",\\\"March\\\",\\\"April\\\",\\\"May\\\",\\\"June\\\",\\\"July\\\",\\\"August\\\",\\\"September\\\",\\\"October\\\",\\\"November\\\",\\\"December\\\"];function u(A,e,r){for(var i=\\\"number\\\"==typeof A?A.toString():A||\\\"\\\";i.length<e;)i=r[0]+i;return i}function b(A,e){return u(A,e,\\\"0\\\")}function s(A,e){function r(A){return A<0?-1:0<A?1:0}var i;return 0===(i=r(A.getFullYear()-e.getFullYear()))&&0===(i=r(A.getMonth()-e.getMonth()))&&(i=r(A.getDate()-e.getDate())),i}function d(A){switch(A.getDay()){case 0:return new Date(A.getFullYear()-1,11,29);case 1:return A;case 2:return new Date(A.getFullYear(),0,3);case 3:return new Date(A.getFullYear(),0,2);case 4:return new Date(A.getFullYear(),0,1);case 5:return new Date(A.getFullYear()-1,11,31);case 6:return new Date(A.getFullYear()-1,11,30)}}function k(A){var e=cr(new Date(A.tm_year+1900,0,1),A.tm_yday),r=new Date(e.getFullYear(),0,4),i=new Date(e.getFullYear()+1,0,4),f=d(r),n=d(i);return s(f,e)<=0?s(n,e)<=0?e.getFullYear()+1:e.getFullYear():e.getFullYear()-1}var h={\\\"%a\\\":function(A){return c[A.tm_wday].substring(0,3)},\\\"%A\\\":function(A){return c[A.tm_wday]},\\\"%b\\\":function(A){return l[A.tm_mon].substring(0,3)},\\\"%B\\\":function(A){return l[A.tm_mon]},\\\"%C\\\":function(A){return b((A.tm_year+1900)/100|0,2)},\\\"%d\\\":function(A){return b(A.tm_mday,2)},\\\"%e\\\":function(A){return u(A.tm_mday,2,\\\" \\\")},\\\"%g\\\":function(A){return k(A).toString().substring(2)},\\\"%G\\\":function(A){return k(A)},\\\"%H\\\":function(A){return b(A.tm_hour,2)},\\\"%I\\\":function(A){var e=A.tm_hour;return 0==e?e=12:12<e&&(e-=12),b(e,2)},\\\"%j\\\":function(A){return b(A.tm_mday+tr(nr(A.tm_year+1900)?or:ar,A.tm_mon-1),3)},\\\"%m\\\":function(A){return b(A.tm_mon+1,2)},\\\"%M\\\":function(A){return b(A.tm_min,2)},\\\"%n\\\":function(){return\\\"\\\\\\\\n\\\"},\\\"%p\\\":function(A){return 0<=A.tm_hour&&A.tm_hour<12?\\\"AM\\\":\\\"PM\\\"},\\\"%S\\\":function(A){return b(A.tm_sec,2)},\\\"%t\\\":function(){return\\\"\\\\\\\\t\\\"},\\\"%u\\\":function(A){return new Date(A.tm_year+1900,A.tm_mon+1,A.tm_mday,0,0,0,0).getDay()||7},\\\"%U\\\":function(A){var e=new Date(A.tm_year+1900,0,1),r=0===e.getDay()?e:cr(e,7-e.getDay()),i=new Date(A.tm_year+1900,A.tm_mon,A.tm_mday);if(s(r,i)<0){var f=tr(nr(i.getFullYear())?or:ar,i.getMonth()-1)-31,n=31-r.getDate()+f+i.getDate();return b(Math.ceil(n/7),2)}return 0===s(r,e)?\\\"01\\\":\\\"00\\\"},\\\"%V\\\":function(A){var e,r=new Date(A.tm_year+1900,0,4),i=new Date(A.tm_year+1901,0,4),f=d(r),n=d(i),t=cr(new Date(A.tm_year+1900,0,1),A.tm_yday);return s(t,f)<0?\\\"53\\\":s(n,t)<=0?\\\"01\\\":(e=f.getFullYear()<A.tm_year+1900?A.tm_yday+32-f.getDate():A.tm_yday+1-f.getDate(),b(Math.ceil(e/7),2))},\\\"%w\\\":function(A){return new Date(A.tm_year+1900,A.tm_mon+1,A.tm_mday,0,0,0,0).getDay()},\\\"%W\\\":function(A){var e=new Date(A.tm_year,0,1),r=1===e.getDay()?e:cr(e,0===e.getDay()?1:7-e.getDay()+1),i=new Date(A.tm_year+1900,A.tm_mon,A.tm_mday);if(s(r,i)<0){var f=tr(nr(i.getFullYear())?or:ar,i.getMonth()-1)-31,n=31-r.getDate()+f+i.getDate();return b(Math.ceil(n/7),2)}return 0===s(r,e)?\\\"01\\\":\\\"00\\\"},\\\"%y\\\":function(A){return(A.tm_year+1900).toString().substring(2)},\\\"%Y\\\":function(A){return A.tm_year+1900},\\\"%z\\\":function(A){var e=A.tm_gmtoff,r=0<=e;return e=(e=Math.abs(e)/60)/60*100+e%60,(r?\\\"+\\\":\\\"-\\\")+String(\\\"0000\\\"+e).slice(-4)},\\\"%Z\\\":function(A){return A.tm_zone},\\\"%%\\\":function(){return\\\"%\\\"}};for(var a in h)0<=t.indexOf(a)&&(t=t.replace(new RegExp(a,\\\"g\\\"),h[a](n)));var w=dr(t,!1);return w.length>e?0:(eA(w,A),w.length-1)}if(EA.staticInit(),L.unshift(function(){d.noFSInit||EA.init.initialized||EA.init()}),K.push(function(){EA.ignorePermissions=!1}),q.push(function(){EA.quit()}),d.FS_createFolder=EA.createFolder,d.FS_createPath=EA.createPath,d.FS_createDataFile=EA.createDataFile,d.FS_createPreloadedFile=EA.createPreloadedFile,d.FS_createLazyFile=EA.createLazyFile,d.FS_createLink=EA.createLink,d.FS_createDevice=EA.createDevice,d.FS_unlink=EA.unlink,L.unshift(function(){gA.init()}),q.push(function(){gA.shutdown()}),o){var ur=require(\\\"fs\\\"),br=require(\\\"path\\\");yA.staticInit()}JA=d.InternalError=DA(Error,\\\"InternalError\\\"),SA(),jA=d.BindingError=DA(Error,\\\"BindingError\\\"),te(),Ce(),ye(),Re=d.UnboundTypeError=DA(Error,\\\"UnboundTypeError\\\"),Te(),er(rr),D=k.staticAlloc(4),Y=(_=k.alignMemory(R))+j,Q=k.alignMemory(Y),I[D>>2]=Q;var sr=!(N=!0);function dr(A,e,r){var i=0<r?r:Z(A)+1,f=new Array(i),n=b(A,f,0,f.length);return e&&(f.length=n),f}function kr(A){for(var e=[],r=0;r<A.length;r++){var i=A[r];255<i&&(sr&&h(!1,\\\"Character code \\\"+i+\\\" (\\\"+String.fromCharCode(i)+\\\")  at offset \\\"+r+\\\" not in 0x00-0xFF.\\\"),i&=255),e.push(String.fromCharCode(i))}return e.join(\\\"\\\")}var hr=\\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\\",wr=\\\"function\\\"==typeof atob?atob:function(A){var e,r,i,f,n,t,o=\\\"\\\",a=0;for(A=A.replace(/[^A-Za-z0-9\\\\\\\\+\\\\\\\\/\\\\\\\\=]/g,\\\"\\\");e=hr.indexOf(A.charAt(a++))<<2|(f=hr.indexOf(A.charAt(a++)))>>4,r=(15&f)<<4|(n=hr.indexOf(A.charAt(a++)))>>2,i=(3&n)<<6|(t=hr.indexOf(A.charAt(a++))),o+=String.fromCharCode(e),64!==n&&(o+=String.fromCharCode(r)),64!==t&&(o+=String.fromCharCode(i)),a<A.length;);return o};function vr(A){var e=\\\"data:application/octet-stream;base64,\\\";if(String.prototype.startsWith?A.startsWith(e):0===A.indexOf(e))return function(e){if(\\\"boolean\\\"==typeof o&&o){var r;try{r=Buffer.from(e,\\\"base64\\\")}catch(A){r=new Buffer(e,\\\"base64\\\")}return new Uint8Array(r.buffer,r.byteOffset,r.byteLength)}try{for(var A=wr(e),i=new Uint8Array(A.length),f=0;f<A.length;++f)i[f]=A.charCodeAt(f);return i}catch(A){throw new Error(\\\"Converting base64 string to bytes failed.\\\")}}(A.slice(e.length))}d.asmGlobalArg={Math:Math,Int8Array:Int8Array,Int16Array:Int16Array,Int32Array:Int32Array,Uint8Array:Uint8Array,Uint16Array:Uint16Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array,NaN:NaN,Infinity:1/0,byteLength:J},d.asmLibraryArg={abort:Mr,assert:h,enlargeMemory:z,getTotalMemory:function(){return H},abortOnCannotGrowMemory:function(){Mr(\\\"Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value \\\"+H+\\\", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 \\\")},invoke_i:function(A){try{return d.dynCall_i(A)}catch(A){if(\\\"number\\\"!=typeof A&&\\\"longjmp\\\"!==A)throw A;d.setThrew(1,0)}},invoke_ii:function(A,e){try{return d.dynCall_ii(A,e)}catch(A){if(\\\"number\\\"!=typeof A&&\\\"longjmp\\\"!==A)throw A;d.setThrew(1,0)}},invoke_iii:function(A,e,r){try{return d.dynCall_iii(A,e,r)}catch(A){if(\\\"number\\\"!=typeof A&&\\\"longjmp\\\"!==A)throw A;d.setThrew(1,0)}},invoke_iiii:function(A,e,r,i){try{return d.dynCall_iiii(A,e,r,i)}catch(A){if(\\\"number\\\"!=typeof A&&\\\"longjmp\\\"!==A)throw A;d.setThrew(1,0)}},invoke_iiiii:function(A,e,r,i,f){try{return d.dynCall_iiiii(A,e,r,i,f)}catch(A){if(\\\"number\\\"!=typeof A&&\\\"longjmp\\\"!==A)throw A;d.setThrew(1,0)}},invoke_iiiiid:function(A,e,r,i,f,n){try{return d.dynCall_iiiiid(A,e,r,i,f,n)}catch(A){if(\\\"number\\\"!=typeof A&&\\\"longjmp\\\"!==A)throw A;d.setThrew(1,0)}},invoke_iiiiii:function(A,e,r,i,f,n){try{return d.dynCall_iiiiii(A,e,r,i,f,n)}catch(A){if(\\\"number\\\"!=typeof A&&\\\"longjmp\\\"!==A)throw A;d.setThrew(1,0)}},invoke_iiiiiid:function(A,e,r,i,f,n,t){try{return d.dynCall_iiiiiid(A,e,r,i,f,n,t)}catch(A){if(\\\"number\\\"!=typeof A&&\\\"longjmp\\\"!==A)throw A;d.setThrew(1,0)}},invoke_iiiiiii:function(A,e,r,i,f,n,t){try{return d.dynCall_iiiiiii(A,e,r,i,f,n,t)}catch(A){if(\\\"number\\\"!=typeof A&&\\\"longjmp\\\"!==A)throw A;d.setThrew(1,0)}},invoke_iiiiiiii:function(A,e,r,i,f,n,t,o){try{return d.dynCall_iiiiiiii(A,e,r,i,f,n,t,o)}catch(A){if(\\\"number\\\"!=typeof A&&\\\"longjmp\\\"!==A)throw A;d.setThrew(1,0)}},invoke_iiiiiiiii:function(A,e,r,i,f,n,t,o,a){try{return d.dynCall_iiiiiiiii(A,e,r,i,f,n,t,o,a)}catch(A){if(\\\"number\\\"!=typeof A&&\\\"longjmp\\\"!==A)throw A;d.setThrew(1,0)}},invoke_v:function(A){try{d.dynCall_v(A)}catch(A){if(\\\"number\\\"!=typeof A&&\\\"longjmp\\\"!==A)throw A;d.setThrew(1,0)}},invoke_vi:function(A,e){try{d.dynCall_vi(A,e)}catch(A){if(\\\"number\\\"!=typeof A&&\\\"longjmp\\\"!==A)throw A;d.setThrew(1,0)}},invoke_vii:function(A,e,r){try{d.dynCall_vii(A,e,r)}catch(A){if(\\\"number\\\"!=typeof A&&\\\"longjmp\\\"!==A)throw A;d.setThrew(1,0)}},invoke_viii:function(A,e,r,i){try{d.dynCall_viii(A,e,r,i)}catch(A){if(\\\"number\\\"!=typeof A&&\\\"longjmp\\\"!==A)throw A;d.setThrew(1,0)}},invoke_viiii:function(A,e,r,i,f){try{d.dynCall_viiii(A,e,r,i,f)}catch(A){if(\\\"number\\\"!=typeof A&&\\\"longjmp\\\"!==A)throw A;d.setThrew(1,0)}},invoke_viiiii:function(A,e,r,i,f,n){try{d.dynCall_viiiii(A,e,r,i,f,n)}catch(A){if(\\\"number\\\"!=typeof A&&\\\"longjmp\\\"!==A)throw A;d.setThrew(1,0)}},invoke_viiiiii:function(A,e,r,i,f,n,t){try{d.dynCall_viiiiii(A,e,r,i,f,n,t)}catch(A){if(\\\"number\\\"!=typeof A&&\\\"longjmp\\\"!==A)throw A;d.setThrew(1,0)}},invoke_viiiiiii:function(A,e,r,i,f,n,t,o){try{d.dynCall_viiiiiii(A,e,r,i,f,n,t,o)}catch(A){if(\\\"number\\\"!=typeof A&&\\\"longjmp\\\"!==A)throw A;d.setThrew(1,0)}},invoke_viiiiiiii:function(A,e,r,i,f,n,t,o,a){try{d.dynCall_viiiiiiii(A,e,r,i,f,n,t,o,a)}catch(A){if(\\\"number\\\"!=typeof A&&\\\"longjmp\\\"!==A)throw A;d.setThrew(1,0)}},invoke_viiiiiiiii:function(A,e,r,i,f,n,t,o,a,c){try{d.dynCall_viiiiiiiii(A,e,r,i,f,n,t,o,a,c)}catch(A){if(\\\"number\\\"!=typeof A&&\\\"longjmp\\\"!==A)throw A;d.setThrew(1,0)}},invoke_viiiiiiiiii:function(A,e,r,i,f,n,t,o,a,c,l){try{d.dynCall_viiiiiiiiii(A,e,r,i,f,n,t,o,a,c,l)}catch(A){if(\\\"number\\\"!=typeof A&&\\\"longjmp\\\"!==A)throw A;d.setThrew(1,0)}},invoke_viiiiiiiiiiii:function(A,e,r,i,f,n,t,o,a,c,l,u,b){try{d.dynCall_viiiiiiiiiiii(A,e,r,i,f,n,t,o,a,c,l,u,b)}catch(A){if(\\\"number\\\"!=typeof A&&\\\"longjmp\\\"!==A)throw A;d.setThrew(1,0)}},invoke_viiiiiiiiiiiii:function(A,e,r,i,f,n,t,o,a,c,l,u,b,s){try{d.dynCall_viiiiiiiiiiiii(A,e,r,i,f,n,t,o,a,c,l,u,b,s)}catch(A){if(\\\"number\\\"!=typeof A&&\\\"longjmp\\\"!==A)throw A;d.setThrew(1,0)}},ClassHandle:oe,ClassHandle_clone:qA,ClassHandle_delete:Ae,ClassHandle_deleteLater:ne,ClassHandle_isAliasOf:PA,ClassHandle_isDeleted:ee,RegisteredClass:ue,RegisteredPointer:Ge,RegisteredPointer_deleteObject:ve,RegisteredPointer_destructor:we,RegisteredPointer_fromWireType:Ie,RegisteredPointer_getPointee:he,__ZSt18uncaught_exceptionv:dA,___assert_fail:function(A,e,r,i){throw n=!0,\\\"Assertion failed: \\\"+g(A)+\\\", at: \\\"+[e?g(e):\\\"unknown filename\\\",r,i?g(i):\\\"unknown function\\\"]+\\\" at \\\"+p()},___buildEnvironment:er,___cxa_allocate_exception:function(A){return Gr(A)},___cxa_begin_catch:function(A){var e=kA.infos[A];return e&&!e.caught&&(e.caught=!0,dA.uncaught_exception--),e&&(e.rethrown=!1),kA.caught.push(A),kA.addRef(kA.deAdjust(A)),A},___cxa_find_matching_catch:function A(){var e=kA.last;if(!e)return 0|(k.setTempRet0(0),0);var r=kA.infos[e],i=r.type;if(!i)return 0|(k.setTempRet0(0),e);var f=Array.prototype.slice.call(arguments);d.___cxa_is_pointer_type(i);A.buffer||(A.buffer=Gr(4)),I[A.buffer>>2]=e,e=A.buffer;for(var n=0;n<f.length;n++)if(f[n]&&d.___cxa_can_catch(f[n],i,e))return e=I[e>>2],r.adjusted=e,0|(k.setTempRet0(f[n]),e);return e=I[e>>2],0|(k.setTempRet0(i),e)},___cxa_pure_virtual:function(){throw n=!0,\\\"Pure virtual function called!\\\"},___cxa_throw:function(A,e,r){throw kA.infos[A]={ptr:A,adjusted:A,type:e,destructor:r,refcount:0,caught:!1,rethrown:!1},kA.last=A,\\\"uncaught_exception\\\"in dA?dA.uncaught_exception++:dA.uncaught_exception=1,A+\\\" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.\\\"},___gxx_personality_v0:function(){},___lock:function(){},___map_file:function(A,e){return wA(hA.EPERM),-1},___resumeException:function(A){throw kA.last||(kA.last=A),A+\\\" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.\\\"},___setErrNo:wA,___syscall140:function(A,e){XA.varargs=e;try{var r=XA.getStreamFromFD(),i=(XA.get(),XA.get()),f=XA.get(),n=XA.get(),t=i;return EA.llseek(r,t,n),I[f>>2]=r.position,r.getdents&&0===t&&0===n&&(r.getdents=null),0}catch(A){return void 0!==EA&&A instanceof EA.ErrnoError||Mr(A),-A.errno}},___syscall145:function(A,e){XA.varargs=e;try{var r=XA.getStreamFromFD(),i=XA.get(),f=XA.get();return XA.doReadv(r,i,f)}catch(A){return void 0!==EA&&A instanceof EA.ErrnoError||Mr(A),-A.errno}},___syscall146:function(A,e){XA.varargs=e;try{var r=XA.getStreamFromFD(),i=XA.get(),f=XA.get();return XA.doWritev(r,i,f)}catch(A){return void 0!==EA&&A instanceof EA.ErrnoError||Mr(A),-A.errno}},___syscall54:function(A,e){XA.varargs=e;try{var r=XA.getStreamFromFD(),i=XA.get();switch(i){case 21505:case 21506:return r.tty?0:-hA.ENOTTY;case 21519:if(!r.tty)return-hA.ENOTTY;var f=XA.get();return I[f>>2]=0;case 21520:return r.tty?-hA.EINVAL:-hA.ENOTTY;case 21531:f=XA.get();return EA.ioctl(r,i,f);case 21523:return r.tty?0:-hA.ENOTTY;default:Mr(\\\"bad ioctl syscall \\\"+i)}}catch(A){return void 0!==EA&&A instanceof EA.ErrnoError||Mr(A),-A.errno}},___syscall6:function(A,e){XA.varargs=e;try{var r=XA.getStreamFromFD();return EA.close(r),0}catch(A){return void 0!==EA&&A instanceof EA.ErrnoError||Mr(A),-A.errno}},___syscall91:function(A,e){XA.varargs=e;try{var r=XA.get(),i=XA.get(),f=XA.mappings[r];if(!f)return 0;if(i===f.len){var n=EA.getStream(f.fd);XA.doMsync(r,n,i,f.flags),EA.munmap(n),XA.mappings[r]=null,f.allocated&&Cr(f.malloc)}return 0}catch(A){return void 0!==EA&&A instanceof EA.ErrnoError||Mr(A),-A.errno}},___unlock:function(){},__addDays:cr,__arraySum:tr,__embind_finalize_value_object:function(A){var e=IA[A];delete IA[A];var f=e.rawConstructor,n=e.rawDestructor,u=e.fields;TA([A],u.map(function(A){return A.getterReturnType}).concat(u.map(function(A){return A.setterArgumentType})),function(c){var l={};return u.forEach(function(A,e){var r=A.fieldName,i=c[e],f=A.getter,n=A.getterContext,t=c[e+u.length],o=A.setter,a=A.setterContext;l[r]={read:function(A){return i.fromWireType(f(n,A))},write:function(A,e){var r=[];o(a,A,t.toWireType(r,e)),CA(r)}}}),[{name:e.name,fromWireType:function(A){var e={};for(var r in l)e[r]=l[r].read(A);return n(A),e},toWireType:function(A,e){for(var r in l)if(!(r in e))throw new TypeError(\\\"Missing field\\\");var i=f();for(r in l)l[r].write(i,e[r]);return null!==A&&A.push(n,i),i},argPackAdvance:8,readValueFromPointer:GA,destructorFunction:n}]})},__embind_register_bool:function(A,r,i,f,n){var t=UA(i);xA(A,{name:r=zA(r),fromWireType:function(A){return!!A},toWireType:function(A,e){return e?f:n},argPackAdvance:8,readValueFromPointer:function(A){var e;if(1===i)e=B;else if(2===i)e=X;else{if(4!==i)throw new TypeError(\\\"Unknown boolean type size: \\\"+r);e=I}return this.fromWireType(e[A>>t])},destructorFunction:null})},__embind_register_class:function(c,A,e,l,r,u,i,b,f,s,d,n,k){d=zA(d),u=Fe(r,u),b=b&&Fe(i,b),s=s&&Fe(f,s),k=Fe(n,k);var h=YA(d);le(h,function(){_e(\\\"Cannot construct \\\"+d+\\\" due to unbound types\\\",[l])}),TA([c,A,e],l?[l]:[],function(A){var e,r;A=A[0],r=l?(e=A.registeredClass).instancePrototype:oe.prototype;var i=QA(h,function(){if(Object.getPrototypeOf(this)!==f)throw new jA(\\\"Use \\\\'new\\\\' to construct \\\"+d);if(void 0===n.constructor_body)throw new jA(d+\\\" has no accessible constructor\\\");var A=n.constructor_body[arguments.length];if(void 0===A)throw new jA(\\\"Tried to invoke ctor of \\\"+d+\\\" with invalid number of parameters (\\\"+arguments.length+\\\") - expected (\\\"+Object.keys(n.constructor_body).toString()+\\\") parameters instead!\\\");return A.apply(this,arguments)}),f=Object.create(r,{constructor:{value:i}});i.prototype=f;var n=new ue(d,i,f,k,e,u,b,s),t=new Ge(d,n,!0,!1,!1),o=new Ge(d+\\\"*\\\",n,!1,!1,!1),a=new Ge(d+\\\" const*\\\",n,!1,!0,!1);return ae[c]={pointerType:o,constPointerType:a},Ve(h,i),[t,o,a]})},__embind_register_emval:function(A,e){xA(A,{name:e=zA(e),fromWireType:function(A){var e=Qe[A].value;return De(A),e},toWireType:function(A,e){return Ue(e)},argPackAdvance:8,readValueFromPointer:GA,destructorFunction:null})},__embind_register_enum:function(A,e,r,i){var f=UA(r);function n(){}e=zA(e),n.values={},xA(A,{name:e,constructor:n,fromWireType:function(A){return this.constructor.values[A]},toWireType:function(A,e){return e.value},argPackAdvance:8,readValueFromPointer:Se(e,f,i),destructorFunction:null}),le(e,n)},__embind_register_enum_value:function(A,e,r){var i=Oe(A,\\\"enum\\\");e=zA(e);var f=i.constructor,n=Object.create(i.constructor.prototype,{value:{value:r},constructor:{value:QA(i.name+\\\"_\\\"+e,function(){})}});f.values[r]=n,f[e]=n},__embind_register_float:function(A,e,r){var i=UA(r);xA(A,{name:e=zA(e),fromWireType:function(A){return A},toWireType:function(A,e){if(\\\"number\\\"!=typeof e&&\\\"boolean\\\"!=typeof e)throw new TypeError(\\\\'Cannot convert \\\"\\\\'+ze(e)+\\\\'\\\" to \\\\'+this.name);return e},argPackAdvance:8,readValueFromPointer:je(e,i),destructorFunction:null})},__embind_register_function:function(r,i,A,e,f,n){var t=Pe(i,A);r=zA(r),f=Fe(e,f),le(r,function(){_e(\\\"Cannot call \\\"+r+\\\" due to unbound types\\\",t)},i-1),TA([],t,function(A){var e=[A[0],null].concat(A.slice(1));return Ve(r,xe(r,e,null,f,n),i-1),[]})},__embind_register_integer:function(A,r,e,i,f){r=zA(r),-1===f&&(f=4294967295);var n=UA(e),t=function(A){return A};if(0===i){var o=32-8*e;t=function(A){return A<<o>>>o}}var a=-1!=r.indexOf(\\\"unsigned\\\");xA(A,{name:r,fromWireType:t,toWireType:function(A,e){if(\\\"number\\\"!=typeof e&&\\\"boolean\\\"!=typeof e)throw new TypeError(\\\\'Cannot convert \\\"\\\\'+ze(e)+\\\\'\\\" to \\\\'+this.name);if(e<i||f<e)throw new TypeError(\\\\'Passing a number \\\"\\\\'+ze(e)+\\\\'\\\" from JS side to C/C++ side to an argument of type \\\"\\\\'+r+\\\\'\\\", which is outside the valid range [\\\\'+i+\\\", \\\"+f+\\\"]!\\\");return a?e>>>0:0|e},argPackAdvance:8,readValueFromPointer:Le(r,n,0!==i),destructorFunction:null})},__embind_register_memory_view:function(A,e,r){var i=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][e];function f(A){var e=C[A>>=2],r=C[A+1];return new i(C.buffer,r,e)}xA(A,{name:r=zA(r),fromWireType:f,argPackAdvance:8,readValueFromPointer:f},{ignoreDuplicateRegistrations:!0})},__embind_register_std_string:function(A,e){xA(A,{name:e=zA(e),fromWireType:function(A){for(var e=C[A>>2],r=new Array(e),i=0;i<e;++i)r[i]=String.fromCharCode(E[A+4+i]);return Cr(A),r.join(\\\"\\\")},toWireType:function(A,e){function r(A,e){return A[e]}var i;e instanceof ArrayBuffer&&(e=new Uint8Array(e)),e instanceof Uint8Array||e instanceof Uint8ClampedArray||e instanceof Int8Array?i=r:\\\"string\\\"==typeof e?i=function(A,e){return A.charCodeAt(e)}:HA(\\\"Cannot pass non-string to std::string\\\");var f=e.length,n=Gr(4+f);C[n>>2]=f;for(var t=0;t<f;++t){var o=i(e,t);255<o&&(Cr(n),HA(\\\"String has UTF-16 code units that do not fit in 8 bits\\\")),E[n+4+t]=o}return null!==A&&A.push(Cr,n),n},argPackAdvance:8,readValueFromPointer:GA,destructorFunction:function(A){Cr(A)}})},__embind_register_std_wstring:function(A,o,e){var a,c;e=zA(e),2===o?(a=function(){return W},c=1):4===o&&(a=function(){return C},c=2),xA(A,{name:e,fromWireType:function(A){for(var e=a(),r=C[A>>2],i=new Array(r),f=A+4>>c,n=0;n<r;++n)i[n]=String.fromCharCode(e[f+n]);return Cr(A),i.join(\\\"\\\")},toWireType:function(A,e){var r=a(),i=e.length,f=Gr(4+i*o);C[f>>2]=i;for(var n=f+4>>c,t=0;t<i;++t)r[n+t]=e.charCodeAt(t);return null!==A&&A.push(Cr,f),f},argPackAdvance:8,readValueFromPointer:GA,destructorFunction:function(A){Cr(A)}})},__embind_register_value_object:function(A,e,r,i,f,n){IA[A]={name:zA(e),rawConstructor:Fe(r,i),rawDestructor:Fe(f,n),fields:[]}},__embind_register_value_object_field:function(A,e,r,i,f,n,t,o,a,c){IA[A].fields.push({fieldName:zA(e),getterReturnType:r,getter:Fe(i,f),getterContext:n,setterArgumentType:t,setter:Fe(o,a),setterContext:c})},__embind_register_void:function(A,e){xA(A,{isVoid:!0,name:e=zA(e),argPackAdvance:0,fromWireType:function(){},toWireType:function(A,e){}})},__emval_decref:De,__emval_incref:function(A){4<A&&(Qe[A].refcount+=1)},__emval_new_array:function(){return Ue([])},__emval_new_cstring:function(A){return Ue(qe(A))},__emval_new_object:function(){return Ue({})},__emval_register:Ue,__emval_set_property:function(A,e,r){A=$e(A),e=$e(e),r=$e(r),A[e]=r},__emval_take_value:function(A,e){return Ue((A=Oe(A,\\\"_emval_take_value\\\")).readValueFromPointer(e))},__isLeapYear:nr,_abort:function(){d.abort()},_embind_repr:ze,_emscripten_memcpy_big:function(A,e,r){return E.set(E.subarray(e,e+r),A),A},_getenv:function A(e){return 0===e?0:(e=g(e),rr.hasOwnProperty(e)?(A.ret&&Cr(A.ret),A.ret=a(dr(rr[e]),\\\"i8\\\",t)):0)},_pthread_cond_destroy:function(){return 0},_pthread_cond_init:function(){return 0},_pthread_cond_signal:function(){return 0},_pthread_cond_wait:function(){return 0},_pthread_getspecific:function(A){return ir[A]||0},_pthread_join:function(){},_pthread_key_create:function(A,e){return 0==A?hA.EINVAL:(I[A>>2]=fr,ir[fr]=0,fr++,0)},_pthread_mutex_destroy:function(){},_pthread_mutex_init:function(){},_pthread_once:function A(e,r){A.seen||(A.seen={}),e in A.seen||(d.dynCall_v(r),A.seen[e]=1)},_pthread_setspecific:function(A,e){return A in ir?(ir[A]=e,0):hA.EINVAL},_strftime:lr,_strftime_l:function(A,e,r,i){return lr(A,e,r,i)},constNoSmartPtrRawPointerToWireType:se,count_emval_handles:Je,craftInvokerFunction:xe,createNamedFunction:QA,downcastPointer:me,embind_init_charCodes:SA,ensureOverloadTable:ce,enumReadValueFromPointer:Se,exposePublicSymbol:le,extendError:DA,floatReadValueFromPointer:je,flushPendingDeletes:fe,genericPointerToWireType:de,getBasestPointer:Ee,getInheritedInstance:Xe,getInheritedInstanceCount:ge,getLiveInheritedInstances:Ze,getShiftFromSize:UA,getStringOrSymbol:qe,getTypeName:Ne,get_first_emval:Me,heap32VectorToArray:Pe,init_ClassHandle:te,init_RegisteredPointer:Ce,init_embind:ye,init_emval:Te,integerReadValueFromPointer:Le,makeClassHandle:We,makeLegalFunctionName:YA,new_:He,nonConstNoSmartPtrRawPointerToWireType:ke,readLatin1String:zA,registerType:xA,replacePublicSymbol:Ve,requireFunction:Fe,requireHandle:$e,requireRegisteredType:Oe,runDestructor:$A,runDestructors:CA,setDelayFunction:pe,shallowCopyInternalPointer:LA,simpleReadValueFromPointer:GA,throwBindingError:HA,throwInstanceAlreadyDeleted:KA,throwInternalError:MA,throwUnboundTypeError:_e,upcastPointer:be,whenDependentTypesAreResolved:TA,DYNAMICTOP_PTR:D,tempDoublePtr:sA,ABORT:n,STACKTOP:_,STACK_MAX:Y,cttz_i8:WA};var mr,gr=function(A,e,r){var i=A.Int8Array,tr=new i(r),f=A.Int16Array,or=new f(r),n=A.Int32Array,ar=new n(r),t=A.Uint8Array,cr=new t(r),o=A.Uint16Array,lr=new o(r),a=A.Uint32Array,c=(new a(r),A.Float32Array),gA=new c(r),l=A.Float64Array,Q=new l(r),u=A.byteLength,b=0|e.DYNAMICTOP_PTR,d=0|e.tempDoublePtr,ur=(e.ABORT,0|e.STACKTOP),s=(e.STACK_MAX,0|e.cttz_i8),k=0,h=A.NaN,w=A.Infinity,D=0,v=A.Math.floor,V=A.Math.abs,m=(A.Math.sqrt,A.Math.pow,A.Math.cos,A.Math.sin,A.Math.tan,A.Math.acos,A.Math.asin,A.Math.atan,A.Math.atan2,A.Math.exp,A.Math.log,A.Math.ceil),br=A.Math.imul,g=(A.Math.min,A.Math.max,A.Math.clz32),Z=e.abort,p=(e.assert,e.enlargeMemory),y=e.getTotalMemory,B=e.abortOnCannotGrowMemory,E=(e.invoke_i,e.invoke_ii,e.invoke_iii,e.invoke_iiii,e.invoke_iiiii,e.invoke_iiiiid,e.invoke_iiiiii,e.invoke_iiiiiid,e.invoke_iiiiiii,e.invoke_iiiiiiii,e.invoke_iiiiiiiii,e.invoke_v,e.invoke_vi,e.invoke_vii,e.invoke_viii,e.invoke_viiii,e.invoke_viiiii,e.invoke_viiiiii,e.invoke_viiiiiii,e.invoke_viiiiiiii,e.invoke_viiiiiiiii,e.invoke_viiiiiiiiii,e.invoke_viiiiiiiiiiii,e.invoke_viiiiiiiiiiiii,e.ClassHandle,e.ClassHandle_clone,e.ClassHandle_delete,e.ClassHandle_deleteLater,e.ClassHandle_isAliasOf,e.ClassHandle_isDeleted,e.RegisteredClass,e.RegisteredPointer,e.RegisteredPointer_deleteObject,e.RegisteredPointer_destructor,e.RegisteredPointer_fromWireType,e.RegisteredPointer_getPointee,e.__ZSt18uncaught_exceptionv),sr=e.___assert_fail,X=(e.___buildEnvironment,e.___cxa_allocate_exception),W=(e.___cxa_begin_catch,e.___cxa_find_matching_catch,e.___cxa_pure_virtual),I=e.___cxa_throw,C=(e.___gxx_personality_v0,e.___lock),G=e.___map_file,F=(e.___resumeException,e.___setErrNo),R=e.___syscall140,N=e.___syscall145,_=e.___syscall146,Y=e.___syscall54,J=e.___syscall6,M=e.___syscall91,T=e.___unlock,U=(e.__addDays,e.__arraySum,e.__embind_finalize_value_object),S=e.__embind_register_bool,O=e.__embind_register_class,z=e.__embind_register_emval,j=e.__embind_register_enum,H=e.__embind_register_enum_value,x=e.__embind_register_float,P=e.__embind_register_function,L=e.__embind_register_integer,K=e.__embind_register_memory_view,q=e.__embind_register_std_string,$=e.__embind_register_std_wstring,AA=e.__embind_register_value_object,eA=e.__embind_register_value_object_field,rA=e.__embind_register_void,iA=e.__emval_decref,fA=e.__emval_incref,nA=e.__emval_new_array,tA=e.__emval_new_cstring,oA=e.__emval_new_object,aA=(e.__emval_register,e.__emval_set_property),cA=e.__emval_take_value,lA=(e.__isLeapYear,e._abort),uA=(e._embind_repr,e._emscripten_memcpy_big),bA=e._getenv,sA=e._pthread_cond_destroy,dA=e._pthread_cond_init,kA=e._pthread_cond_signal,hA=e._pthread_cond_wait,wA=e._pthread_getspecific,vA=e._pthread_join,mA=e._pthread_key_create,ZA=e._pthread_mutex_destroy,pA=e._pthread_mutex_init,yA=e._pthread_once,BA=e._pthread_setspecific,EA=(e._strftime,e._strftime_l);e.constNoSmartPtrRawPointerToWireType,e.count_emval_handles,e.craftInvokerFunction,e.createNamedFunction,e.downcastPointer,e.embind_init_charCodes,e.ensureOverloadTable,e.enumReadValueFromPointer,e.exposePublicSymbol,e.extendError,e.floatReadValueFromPointer,e.flushPendingDeletes,e.genericPointerToWireType,e.getBasestPointer,e.getInheritedInstance,e.getInheritedInstanceCount,e.getLiveInheritedInstances,e.getShiftFromSize,e.getStringOrSymbol,e.getTypeName,e.get_first_emval,e.heap32VectorToArray,e.init_ClassHandle,e.init_RegisteredPointer,e.init_embind,e.init_emval,e.integerReadValueFromPointer,e.makeClassHandle,e.makeLegalFunctionName,e.new_,e.nonConstNoSmartPtrRawPointerToWireType,e.readLatin1String,e.registerType,e.replacePublicSymbol,e.requireFunction,e.requireHandle,e.requireRegisteredType,e.runDestructor,e.runDestructors,e.setDelayFunction,e.shallowCopyInternalPointer,e.simpleReadValueFromPointer,e.throwBindingError,e.throwInstanceAlreadyDeleted,e.throwInternalError,e.throwUnboundTypeError,e.upcastPointer,e.whenDependentTypesAreResolved;function XA(A){ar[(A|=0)>>2]=4232,(A=0|ar[A+24>>2])&&mu(A)}function WA(A,e,r,i,f){e|=0,r|=0,i|=0,f|=0;var n,t,o,a=0;n=(A|=0)+4|0,t=A+8|0,o=A+12|0,tr[A+24>>0]=0,ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,ar[A+12>>2]=0,ar[(a=A+16|0)>>2]=r,ar[a+4>>2]=i,a=0|ar[e>>2],(i=r=0|ar[e+4>>2])?(bu(r),r=0|ar[n>>2],ar[A>>2]=a,ar[n>>2]=i,0|r&&du(r)):(ar[A>>2]=a,ar[n>>2]=i),(ar[t>>2]=f)&&(ar[o>>2]=1+(0|ar[f+12>>2]))}function IA(A){var e,r,i,f,n=0;return ur=(f=ur)+16|0,e=f,0|CA(A|=0,1,0)?(r=0|ar[A>>2],(n=0==(0|(i=0|ar[A+4>>2])))||bu(i),A=0|xb[63&ar[16+(0|ar[r>>2])>>2]](r,e,1)?0|tr[e>>0]:(GA(A),0),n||du(i),ur=f,0|(n=A)):(ur=f,(n=0)|n)}function CA(A,e,r){A|=0,e|=0;var i=0,f=0,n=0,t=0,o=0,a=0,c=0;if((0|(r|=0))<0&&sr(55739,47382,290,18687),a=0|ar[(i=c=A+16|0)>>2],!((0|(i=0|ar[i+4>>2]))<(0|r)|(0|i)==(0|r)&a>>>0<e>>>0)){f=0|ar[A+8>>2];do{if(f){if(0|CA(f,e,r)){f=0|ar[(i=c)>>2],i=0|ar[i+4>>2];break}return(c=0)|c}f=a}while(0);return a=0|ob(0|f,0|i,0|e,0|r),ar[c>>2]=a,ar[c+4>>2]=D,0|(c=1)}if(0<(0|i)|0==(0|i)&0<a>>>0){f=0|ar[A+8>>2];do{if(f){for(;;){if(r=0|ar[(n=e=f+16|0)>>2],(0|(n=0|ar[n+4>>2]))<(0|i)|(0|n)==(0|i)&r>>>0<a>>>0){i=7;break}if(r=0|ob(0|r,0|n,0|a,0|i),ar[(n=e)>>2]=r,ar[n+4>>2]=D,!(f=0|ar[f+8>>2])){i=9;break}}if(7==(0|i))sr(18700,47382,327,18717);else if(9==(0|i)){t=0|ar[(o=c)>>2],o=0|ar[o+4>>2];break}}else t=a,o=i}while(0);n=0|ar[A>>2],a=0|ar[n>>2],r=0|ar[a+20>>2],a=0|tb(0|(a=0|jb[127&ar[a+8>>2]](n)),0|D,0|t,0|o),xb[63&r](n,a,D),ar[c>>2]=0,ar[c+4>>2]=0}return tr[A+24>>0]=1,(c=0)|c}function GA(A){var e=0;ar[(e=(A|=0)+16|0)>>2]=0,(e=(ar[e+4>>2]=0)|ar[A+8>>2])&&GA(e),tr[(e=A+24|0)>>0]=1}function VA(A){var e,r,i,f,n=0;return ur=(f=ur)+16|0,e=f,0|CA(A|=0,2,0)?(r=0|ar[A>>2],(n=0==(0|(i=0|ar[A+4>>2])))||bu(i),A=0|xb[63&ar[16+(0|ar[r>>2])>>2]](r,e,2)?65535&((0|cr[e>>0])<<8|0|cr[e+1>>0]):(GA(A),0),n||du(i),ur=f,0|(n=A)):(ur=f,(n=0)|n)}function FA(A){var e,r,i,f,n=0;return ur=(f=ur)+16|0,e=f,0|CA(A|=0,4,0)?(r=0|ar[A>>2],(n=0==(0|(i=0|ar[A+4>>2])))||bu(i),A=0|xb[63&ar[16+(0|ar[r>>2])>>2]](r,e,4)?(0|cr[e+1>>0])<<16|(0|cr[e>>0])<<24|(0|cr[e+2>>0])<<8|0|cr[e+3>>0]:(GA(A),0),n||du(i),ur=f,0|(n=A)):(ur=f,(n=0)|n)}function RA(A,e){A|=0,e|=0;var r,i,f,n=0,t=0,o=0,a=0;ur=(f=ur)+16|0,r=(i=f)+12|0,ar[i>>2]=0,ar[i+4>>2]=0,a=e+16|(ar[i+8>>2]=0);A:do{if(0==(0|ar[a>>2])&0==(0|ar[a+4>>2]))ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0;else{t=e+4|0;e:for(;;){if(!(0|CA(e,1,0))){n=5;break}switch(n=0|ar[e>>2],(a=0==(0|(o=0|ar[t>>2])))||bu(o),n=0|xb[63&ar[16+(0|ar[n>>2])>>2]](n,r,1)?(n=0|tr[r>>0])<<24>>24?(_u(i,n),0):2:(GA(e),ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,1),a||du(o),3&n){case 0:break;case 2:n=15;break e;default:break A}}if(5==(0|n)){ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0;break}if(15==(0|n)){ar[A>>2]=ar[i>>2],ar[A+4>>2]=ar[i+4>>2],ar[A+8>>2]=ar[i+8>>2],ar[i>>2]=0,ar[i+4>>2]=0,ar[i+8>>2]=0;break}}}while(0);ur=(0<=(0|tr[i+11>>0])||vu(0|ar[i>>2]),f)}function NA(A,e,r){e|=0,r|=0;var i=0;return i=0|ar[(A|=0)>>2],r=0|tb(0|(i=0|jb[127&ar[8+(0|ar[i>>2])>>2]](i)),0|D,0|e,0|r),e=0|ar[A>>2],0|xb[63&ar[12+(0|ar[e>>2])>>2]](e,r,D)}function _A(A,e,r){A|=0,e|=0,r|=0;for(var i=0,f=0,n=0;;){if(f=0|ar[(n=i=A+16|0)>>2],(0|(n=0|ar[n+4>>2]))<(0|r)|(0|n)==(0|r)&f>>>0<e>>>0){A=3;break}if(f=0|ob(0|f,0|n,0|e,0|r),ar[(n=i)>>2]=f,ar[n+4>>2]=D,!(A=0|ar[A+8>>2])){A=5;break}}if(3==(0|A))sr(18700,47382,327,18717);else if(5==(0|A))return}function YA(A,e,r){e|=0,r|=0;var i,f=0,n=0,t=0,o=0,a=0,c=0,l=0;return ar[(A|=0)>>2]=e,ar[A+4>>2]=r,ar[(i=A+8|0)>>2]=r,ar[(a=c=A+16|0)>>2]=0,ar[a+4>>2]=0,ar[(a=A+24|0)>>2]=0,r?(f=e+1|0,ar[A>>2]=f,n=0|cr[e>>0],o=r+-1|0,ar[i>>2]=o,n=0|db(0|n,0,56),t=D,ar[(l=c)>>2]=n,ar[l+4>>2]=t,o?(o=e+2|0,ar[A>>2]=o,f=0|cr[f>>0],l=r+-2|0,ar[i>>2]=l,f=0|db(0|f,0,48),f|=n,n=t|D,ar[(t=c)>>2]=f,ar[t+4>>2]=n,l?(t=e+3|0,ar[A>>2]=t,o=0|cr[o>>0],l=r+-3|0,ar[i>>2]=l,o=0|db(0|o,0,40),o|=f,f=n|D,ar[(n=c)>>2]=o,ar[n+4>>2]=f,l?(n=e+4|0,ar[A>>2]=n,t=0|cr[t>>0],l=r+-4|0,ar[i>>2]=l,f|=t,ar[(t=c)>>2]=o,ar[t+4>>2]=f,l?(t=e+5|0,ar[A>>2]=t,n=0|cr[n>>0],l=r+-5|0,ar[i>>2]=l,n=0|db(0|n,0,24),n|=o,f|=D,ar[(o=c)>>2]=n,ar[o+4>>2]=f,l?(o=e+6|0,ar[A>>2]=o,t=0|cr[t>>0],l=r+-6|0,ar[i>>2]=l,n|=t=0|db(0|t,0,16),f|=D,ar[(t=c)>>2]=n,ar[t+4>>2]=f,l?(t=e+7|0,ar[A>>2]=t,o=0|cr[o>>0],l=r+-7|0,ar[i>>2]=l,n|=o=0|db(0|o,0,8),f|=D,ar[(o=c)>>2]=n,ar[o+4>>2]=f,l=l?(ar[A>>2]=e+8,e=0|cr[t>>0],ar[i>>2]=r+-8,ar[(l=c)>>2]=n|e,ar[l+4>>2]=f,64-(l=0)|0):64-(l=8)|0,void(ar[a>>2]=l)):(l=64-(l=16)|0,void(ar[a>>2]=l))):(l=64-(l=24)|0,void(ar[a>>2]=l))):(l=64-(l=32)|0,void(ar[a>>2]=l))):(l=64-(l=40)|0,void(ar[a>>2]=l))):(l=64-(l=48)|0,void(ar[a>>2]=l))):(l=64-(l=56)|0,void(ar[a>>2]=l))):(c=(c=64)-c|0,void(ar[a>>2]=c))}function QA(A,e){e|=0;var r,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0;if((0|(i=0|ar[(r=(A|=0)+24|0)>>2]))<(0|e)){i=64-i|0,n=A+8|0;A:do{if(7<(0|i)){t=A+16|0,f=0|ar[n>>2];do{if(!f)break A;c=0|ar[A>>2],ar[A>>2]=c+1,c=0|cr[c>>0],f=f+-1|0,ar[n>>2]=f,c=0|db(0|c,0,0|(i=i+-8|0)),a=ar[(l=t)+4>>2]|D,ar[(o=t)>>2]=ar[l>>2]|c,ar[o+4>>2]=a}while(7<(0|i))}}while(0);i=64-i|0,ar[r>>2]=i}return l=0|sb(0|(o=0|ar[(a=c=A+16|0)>>2]),0|(a=0|ar[a+4>>2]),64-e|0),a=0|db(0|o,0|a,0|e),ar[c>>2]=a,ar[c+4>>2]=D,ar[r>>2]=i-e,0|l}function DA(A,e){e|=0;var r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0;for(c=(A|=0)+8|0,i=A+16|0,f=(l=0)|ar[(r=A+24|0)>>2];;){if((0|f)<1){f=64-f|0;A:do{if(7<(0|f)){n=0|ar[c>>2];do{if(!n)break A;u=0|ar[A>>2],ar[A>>2]=u+1,u=0|cr[u>>0],n=n+-1|0,ar[c>>2]=n,u=0|db(0|u,0,0|(f=f+-8|0)),t=ar[(b=i)+4>>2]|D,ar[(o=i)>>2]=ar[b>>2]|u,ar[o+4>>2]=t}while(7<(0|f))}}while(0);o=64-f|0,ar[r>>2]=o}else o=f;if(t=0|db(0|(b=0|ar[(u=i)>>2]),0|(u=0|ar[u+4>>2]),1),n=D,ar[(f=i)>>2]=t,ar[f+4>>2]=n,f=o+-1|0,ar[r>>2]=f,!(-1<(0|u)|-1==(0|u)&4294967295<b>>>0))break;if(19<(0|l)){f=0,a=20;break}l=l+1|0}if(20==(0|a))return 0|f;if(!l)return(ar[e>>2]=0)|(b=1);if((0|o)<=(0|l)){f=65-o|0;A:do{if(7<(0|f)){o=0|ar[c>>2];do{if(!o)break A;b=0|ar[A>>2],ar[A>>2]=b+1,b=0|cr[b>>0],o=o+-1|0,ar[c>>2]=o,t|=b=0|db(0|b,0,0|(f=f+-8|0)),n|=D,ar[(b=i)>>2]=t,ar[b+4>>2]=n}while(7<(0|f))}}while(0);f=64-f|0,ar[r>>2]=f}return b=0|sb(0|t,0|n,64-l|0),c=0|db(0|t,0|n,0|l),ar[(u=i)>>2]=c,ar[u+4>>2]=D,ar[r>>2]=f-l,b=b+(1<<l)|0,ar[e>>2]=b+-1,1<(0|b)?0|(b=1):(sr(18749,47382,427,47403),0)}function JA(A,e){e|=0;var r,i,f,n,t=0,o=0,a=0,c=0,l=0,u=0;if((0|(t=0|ar[(r=(A|=0)+12|0)>>2]))!=((o=u=0|ar[(i=A+4|0)>>2])-(n=f=0|ar[A>>2])|0))return ar[r>>2]=t+1,void(tr[n+t>>0]=e);(0|o)==(0|(t=0|ar[(u=A+8|0)>>2]))?((0|(t=(l=t-f|0)+1|0))<0&&zl(),o=l<<1,c=(o=l>>>0<1073741823?o>>>0<t>>>0?t:o:2147483647)?0|hu(o):0,tr[(a=c+l|0)>>0]=e,t=a+(0-l)|0,0<(0|l)&&hb(0|t,0|n,0|l),ar[A>>2]=t,ar[i>>2]=a+1,ar[u>>2]=c+o,0|f&&vu(n)):(tr[o>>0]=e,ar[i>>2]=1+(0|ar[i>>2])),ar[r>>2]=1+(0|ar[r>>2])}function MA(A,e){e|=0;var r,i,f=0,n=0,t=0;t=(n=0|ar[(i=(A|=0)+12|0)>>2])+2|0,f=0|ar[A>>2],(r=(0|ar[A+4>>2])-f|0)>>>0<t>>>0?(TA(A,t-r|0),t=A,n=0|ar[i>>2],f=0|ar[A>>2]):t=A,ar[i>>2]=n+1,tr[f+n>>0]=(65535&e)>>>8,A=0|ar[i>>2],ar[i>>2]=A+1,tr[(0|ar[t>>2])+A>>0]=e}function TA(A,e){var r,i,f=0,n=0,t=0,o=0,a=0;if((e|=0)>>>0<=((t=0|ar[(r=(A|=0)+8|0)>>2])-(f=0|ar[(i=A+4|0)>>2])|0)>>>0)for(;f=1+((tr[f>>0]=0)|ar[i>>2])|0,ar[i>>2]=f,0!=(0|(e=e+-1|0)););else{for((0|(f=(o=f-(n=0|ar[A>>2])|0)+e|0))<0&&zl(),a=(t=t-n|0)<<1,a=(n=(f=t>>>0<1073741823?a>>>0<f>>>0?f:a:2147483647)?0|hu(f):0)+o|0,o=n+f|0,f=t=a;t=f=t+1|(tr[f>>0]=0),0!=(0|(e=e+-1|0)););e=0|ar[A>>2],f=a+(0-(n=(0|ar[i>>2])-e|0))|0,0<(0|n)&&hb(0|f,0|e,0|n),ar[A>>2]=f,ar[i>>2]=t,ar[r>>2]=o,e&&vu(e)}}function UA(A,e){e|=0;var r,i,f=0,n=0,t=0;t=(n=0|ar[(i=(A|=0)+12|0)>>2])+4|0,f=0|ar[A>>2],(r=(0|ar[A+4>>2])-f|0)>>>0<t>>>0?(TA(A,t-r|0),t=A,n=0|ar[i>>2],f=0|ar[A>>2]):t=A,ar[i>>2]=n+1,tr[f+n>>0]=e>>>24,A=0|ar[i>>2],ar[i>>2]=A+1,tr[(0|ar[t>>2])+A>>0]=e>>>16,A=0|ar[i>>2],ar[i>>2]=A+1,tr[(0|ar[t>>2])+A>>0]=e>>>8,A=0|ar[i>>2],ar[i>>2]=A+1,tr[(0|ar[t>>2])+A>>0]=e}function SA(A,e,r,i){A|=0,r|=0,i|=0;var f=0,n=0,t=0;switch(0|(e|=0)){case 1:return i>>>0<0|0==(0|i)&r>>>0<256||sr(18760,47382,543,19563),void JA(A,255&r);case 2:return i>>>0<0|0==(0|i)&r>>>0<65536||sr(18774,47382,547,19563),i=(n=0|ar[(t=A+12|0)>>2])+2|0,e=0|ar[A>>2],(f=(0|ar[A+4>>2])-e|0)>>>0<i>>>0?(TA(A,i-f|0),f=A,i=0|ar[t>>2],e=0|ar[A>>2]):(f=A,i=n),ar[t>>2]=i+1,tr[e+i>>0]=(65535&r)>>>8,A=0|ar[t>>2],ar[t>>2]=A+1,void(tr[(0|ar[f>>2])+A>>0]=r);case 4:return i>>>0<1|1==(0|i)&r>>>0<0||sr(18790,47382,551,19563),i=(n=0|ar[(t=A+12|0)>>2])+4|0,e=0|ar[A>>2],(f=(0|ar[A+4>>2])-e|0)>>>0<i>>>0?(TA(A,i-f|0),f=A,i=0|ar[t>>2],e=0|ar[A>>2]):(f=A,i=n),ar[t>>2]=i+1,tr[e+i>>0]=r>>>24,A=0|ar[t>>2],ar[t>>2]=A+1,tr[(0|ar[f>>2])+A>>0]=r>>>16,A=0|ar[t>>2],ar[t>>2]=A+1,tr[(0|ar[f>>2])+A>>0]=r>>>8,A=0|ar[t>>2],ar[t>>2]=A+1,void(tr[(0|ar[f>>2])+A>>0]=r);case 8:return void function(A,e,r){e|=0,r|=0;var i,f=0,n=0,t=0,o=0;t=(n=0|ar[(i=(A|=0)+12|0)>>2])+8|0,f=0|ar[A>>2],(o=(0|ar[A+4>>2])-f|0)>>>0<t>>>0?(TA(A,t-o|0),t=A,n=0|ar[i>>2],f=0|ar[A>>2]):t=A,A=0|sb(0|e,0|r,56),ar[i>>2]=n+1,tr[f+n>>0]=A,A=0|sb(0|e,0|r,48),o=0|ar[i>>2],ar[i>>2]=o+1,tr[(0|ar[t>>2])+o>>0]=A,o=0|sb(0|e,0|r,40),A=0|ar[i>>2],ar[i>>2]=A+1,tr[(0|ar[t>>2])+A>>0]=o,A=0|ar[i>>2],ar[i>>2]=A+1,A=0|sb(0|e,0|(tr[(0|ar[t>>2])+A>>0]=r),24),o=0|ar[i>>2],ar[i>>2]=o+1,tr[(0|ar[t>>2])+o>>0]=A,o=0|sb(0|e,0|r,16),A=0|ar[i>>2],ar[i>>2]=A+1,tr[(0|ar[t>>2])+A>>0]=o,A=0|sb(0|e,0|r,8),r=0|ar[i>>2],ar[i>>2]=r+1,tr[(0|ar[t>>2])+r>>0]=A,r=0|ar[i>>2],ar[i>>2]=r+1,tr[(0|ar[t>>2])+r>>0]=e}(A,r,i);default:sr(55739,47382,558,19563)}}function OA(A,e){var r=0,i=0,f=0,n=0,t=0,o=0,a=0;if(a=(A|=0)+12|0,n=0|tr[(t=(e|=0)+11|0)>>0],r=0|ar[(o=e+4|0)>>2],i=1+(0|ar[a>>2])+(n<<24>>24<0?r:255&n)|0,(f=(0|ar[A+4>>2])-(0|ar[A>>2])|0)>>>0<i>>>0?(TA(A,i-f|0),f=0|tr[t>>0],r=0|ar[o>>2]):f=n,!(0|(f<<24>>24<0?r:255&f)))return t=A,e=(o=0|ar[a>>2])+1|0,ar[a>>2]=e,a=0|ar[t>>2],void(tr[(a=a+o|0)>>0]=0);for(i=0,r=f;f=0|tr[(r<<24>>24<0?0|ar[e>>2]:e)+i>>0],n=0|ar[a>>2],ar[a>>2]=n+1,tr[(0|ar[A>>2])+n>>0]=f,(i=i+1|0)>>>0<((r=0|tr[t>>0])<<24>>24<0?0|ar[o>>2]:255&r)>>>0;);t=(o=0|ar[a>>2])+1|0,ar[a>>2]=t,a=0|ar[A>>2],tr[(a=a+o|0)>>0]=0}function zA(A,e){e|=0;var r,i,f,n,t=0,o=0,a=0,c=0;a=0|ar[(f=(A|=0)+12|0)>>2],i=(t=0|ar[(n=e+4|0)>>2])-(o=0|ar[e>>2])+a|0,c=0|ar[A>>2],(r=(0|ar[A+4>>2])-c|0)>>>0<i>>>0&&(TA(A,i-r|0),c=0|ar[A>>2],a=0|ar[f>>2],o=0|ar[e>>2],t=0|ar[n>>2]),hb(c+a|0,0|o,t-o|0),ar[f>>2]=(0|ar[n>>2])-(0|ar[e>>2])+(0|ar[f>>2])}function jA(A,e){e|=0;var r,i,f,n,t,o=0,a=0;(0|(o=0|ar[(t=(A|=0)+12|0)>>2]))!=((r=0|ar[(f=A+4|0)>>2])-(i=0|ar[A>>2])|0)&&sr(18810,47382,610,18838),(n=o+e|0)>>>0<=o>>>0?n>>>0<o>>>0&&(0|r)!=(0|(a=i+n|0))&&(ar[f>>2]=a):(TA(A,e),o=0|ar[t>>2]),ar[t>>2]=o+e}function HA(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a,c=0,l=0,u=0,b=0;if(ur=(o=ur)+160|0,l=o+136|0,n=(f=o)+56|0,t=f+4|0,ar[f>>2]=292,ar[n>>2]=312,Jf(f+56|0,t),ar[f+128>>2]=0,ar[f+132>>2]=-1,ar[f>>2]=4304,ar[n>>2]=4324,Sf(t),ar[t>>2]=4340,ar[(i=f+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[f+52>>2]=16,ar[l>>2]=0,ar[l+4>>2]=0,ar[l+8>>2]=0,Xe(t,l),(0|tr[l+11>>0])<0&&vu(0|ar[l>>2]),0<(0|ar[r>>2]))for(c=0;We(f,18862,2),(0|(c=c+1|0))<(0|ar[r>>2]););if(b=0|We(f,18865,5),xA(l,e),We(0|We(b,(u=(a=0|tr[(c=l+11|0)>>0])<<24>>24<0)?0|ar[l>>2]:l,u?0|ar[l+4>>2]:255&a),18871,7),(0|tr[c>>0])<0&&vu(0|ar[l>>2]),0<(0|ar[r>>2]))for(c=0;We(f,18862,2),(0|(c=c+1|0))<(0|ar[r>>2]););if(u=0|We(f,18879,6),b=0|We(0|Kf(u,0|ar[(b=e+8|0)>>2],0|ar[b+4>>2]),18886,17),We(0|Lf(b,0|ar[e+16>>2]),18904,2),0|tr[e+36>>0]){if(0<(0|ar[r>>2]))for(c=0;We(f,18862,2),(0|(c=c+1|0))<(0|ar[r>>2]););if(l=0|We(f,18907,9),l=0|We(0|Pf(l,0|cr[e+37>>0]),30086,1),0<(0|ar[r>>2]))for(c=0;We(l,18862,2),(0|(c=c+1|0))<(0|ar[r>>2]););u=(b=0|We(l,18917,7))+(0|ar[(0|ar[b>>2])-12>>2])+4|0,ar[u>>2]=-75&ar[u>>2]|8,We(0|Lf(b,0|ar[e+40>>2]),30086,1)}if(Ie(A,t),ar[f>>2]=4304,ar[n>>2]=4324,ar[t>>2]=4340,0<=(0|tr[11+i>>0]))return kf(t),Gf(),bf(n),void(ur=o);vu(0|ar[i>>2]),kf(t),Gf(),bf(n),ur=o}function Xe(A,e){var r,i,f=0,n=0,t=0,o=0;Eu(r=(A|=0)+32|0,e|=0),8&(t=(ar[(o=A+44|0)>>2]=0)|ar[(i=A+48|0)>>2])|0&&(e=(e=0|tr[11+r>>0])<<24>>24<0?(n=f=e=0|ar[r>>2])+(0|ar[A+36>>2])|0:(n=f=r)+(255&e)|0,ar[o>>2]=e,ar[A+8>>2]=f,ar[A+12>>2]=n,ar[A+16>>2]=e),16&t&&(o=(e=(e=0|tr[(f=11+r|0)>>0])<<24>>24<0?(t=0|ar[A+36>>2],ar[o>>2]=(0|ar[r>>2])+t,(2147483647&ar[A+40>>2])-1|0):(t=255&e,ar[o>>2]=r+t,10),t),Vu(r,e,0),(e=0|tr[f>>0])<<24>>24<0?(t=f=0|ar[r>>2],n=0|ar[A+36>>2]):(n=255&e,f=t=r),ar[(e=A+24|0)>>2]=f,ar[A+20>>2]=f,ar[A+28>>2]=t+n,3&ar[i>>2]&&(ar[e>>2]=f+o))}function We(A,e,r){e|=0,r|=0;var i,f,n,t,o,a,c=0,l=0;return ur=(a=ur)+16|0,n=a+12|0,l=(o=a)+8|0,zf(o,A|=0),0|tr[o>>0]?(c=(0|ar[A>>2])-12|0,ar[l>>2]=ar[A+(0|ar[c>>2])+24>>2],c=A+(0|ar[c>>2])|0,t=0|ar[c+4>>2],f=e+r|0,-1==(0|(r=0|ar[(i=c+76|0)>>2]))&&(Tf(n,c),r=0|un(n,59232),r=0|Hb[31&ar[28+(0|ar[r>>2])>>2]](r,32),bn(n),r=r<<24>>24,ar[i>>2]=r),ar[n>>2]=ar[l>>2],ur=(0|PA(n,e,32==(176&t|0)?f:e,f,c,255&r)||Df(l=A+(0|ar[(0|ar[A>>2])-12>>2])|0,5|ar[l+16>>2]),jf(o),a),0|A):(jf(o),ur=a,0|A)}function xA(A,e){A|=0;var r,i,f,n,t,o,a=0;if(ur=(o=ur)+160|0,n=o+136|0,t=o,1970628964!=(0|(a=0|ar[(e|=0)+20>>2])))return ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,tr[A+11>>0]=4,tr[A+4>>0]=0,tr[A>>0]=a>>>24,tr[A+1>>0]=a>>>16,tr[A+2>>0]=a>>>8,tr[A+3>>0]=a,void(ur=o);i=t+56|0,f=t+4|0,ar[t>>2]=292,ar[i>>2]=312,Jf(t+56|0,f),ar[t+128>>2]=0,ar[t+132>>2]=-1,ar[t>>2]=4304,ar[i>>2]=4324,Sf(f),ar[f>>2]=4340,ar[(r=t+36|0)>>2]=0,ar[4+r>>2]=0,ar[8+r>>2]=0,ar[12+r>>2]=0,ar[t+52>>2]=16,ar[n>>2]=0,ar[4+n>>2]=0,ar[8+n>>2]=0,Xe(f,n),(0|tr[11+n>>0])<0&&vu(0|ar[n>>2]),a=t+(0|ar[(0|ar[t>>2])-12>>2])+4|0,ar[a>>2]=-75&ar[a>>2]|8,ar[t+(0|ar[(0|ar[t>>2])-12>>2])+76>>2]=48,ar[t+(0|ar[(0|ar[t>>2])-12>>2])+12>>2]=2,e=e+24|0,a=0;do{switch(0|a){case 4:case 6:case 8:case 10:tr[n>>0]=45,We(t,n,1)}Pf(t,0|cr[(0|ar[e>>2])+a>>0]),a=a+1|0}while((0|a)<16);Ie(A,f),ar[t>>2]=4304,ar[i>>2]=4324,ar[f>>2]=4340,(0|tr[11+r>>0])<0&&vu(0|ar[r>>2]),kf(f),Gf(),bf(i),ur=o}function Ie(A,e){A|=0;var r=0,i=0,f=0,n=0;if(16&(r=0|ar[(e|=0)+48>>2])|0){if((i=0|ar[(r=e+44|0)>>2])>>>0<(f=0|ar[e+24>>2])>>>0&&(i=ar[r>>2]=f),r=0|ar[e+20>>2],ar[A>>2]=0,ar[A+4>>2]=0,4294967279<(e=i-r|(ar[A+8>>2]=0))>>>0&&pu(),e>>>0<11?tr[A+11>>0]=e:(f=0|hu(n=e+16&-16),ar[A>>2]=f,ar[A+8>>2]=-2147483648|n,ar[A+4>>2]=e,A=f),(0|r)!=(0|i)){for(f=A;tr[f>>0]=0|tr[r>>0],(0|(r=r+1|0))!=(0|i);)f=f+1|0;A=A+e|0}tr[A>>0]=0}else{if(!(8&r))return ar[A>>2]=0,ar[A+4>>2]=0,void(ar[A+8>>2]=0);if(r=0|ar[e+8>>2],f=0|ar[e+16>>2],ar[A>>2]=0,ar[A+4>>2]=0,4294967279<(e=f-r|(ar[A+8>>2]=0))>>>0&&pu(),e>>>0<11?tr[A+11>>0]=e:(n=0|hu(i=e+16&-16),ar[A>>2]=n,ar[A+8>>2]=-2147483648|i,ar[A+4>>2]=e,A=n),(0|r)!=(0|f)){for(i=A;tr[i>>0]=0|tr[r>>0],(0|(r=r+1|0))!=(0|f);)i=i+1|0;A=A+e|0}tr[A>>0]=0}}function PA(A,e,r,i,f,n){e|=0,r|=0,i|=0,f|=0,n|=0;var t,o,a,c=0,l=0,u=0,b=0;if(ur=(a=ur)+16|0,o=a,!(b=0|ar[(A|=0)>>2]))return ur=a,(b=0)|b;if(l=(0|(l=i-(c=e)|0))<(0|(u=0|ar[(t=f+12|0)>>2]))?u-l|0:0,0<(0|(f=(u=r)-c|0))&&(0|xb[63&ar[48+(0|ar[b>>2])>>2]](b,e,f))!=(0|f))return ar[A>>2]=0,ur=a,(b=0)|b;do{if(0<(0|l)){if(ar[o>>2]=0,ar[o+4>>2]=0,c=l>>>(ar[o+8>>2]=0)<11?(tr[(e=o+11|0)>>0]=l,f=o):(f=0|hu(e=l+16&-16),ar[o>>2]=f,ar[o+8>>2]=-2147483648|e,ar[o+4>>2]=l,e=o+11|0,o),vb(0|f,0|n,0|l),((tr[f+l>>0]=0)|xb[63&ar[48+(0|ar[b>>2])>>2]](b,(0|tr[e>>0])<0?0|ar[c>>2]:o,l))!=(0|l))return((ar[A>>2]=0)|tr[e>>0])<0&&vu(0|ar[c>>2]),ur=a,(b=0)|b;(0|tr[e>>0])<0&&vu(0|ar[c>>2]);break}}while(0);return 0<(0|(i=i-u|0))&&(0|xb[63&ar[48+(0|ar[b>>2])>>2]](b,r,i))!=(0|i)?(ar[A>>2]=0,ur=a,(b=0)|b):(ar[t>>2]=0,ur=a,0|b)}function LA(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a,c;if(ur=(a=ur)+160|0,f=a+136|0,t=(n=a)+56|0,o=n+4|0,ar[n>>2]=292,ar[t>>2]=312,Jf(n+56|0,o),ar[n+128>>2]=0,ar[n+132>>2]=-1,ar[n>>2]=4304,ar[t>>2]=4324,Sf(o),ar[o>>2]=4340,ar[(i=n+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[n+52>>2]=16,ar[f>>2]=0,ar[4+f>>2]=0,ar[8+f>>2]=0,Xe(o,f),(0|tr[11+f>>0])<0&&vu(0|ar[f>>2]),HA(f,e,r),We(n,(c=(e=0|tr[(r=11+f|0)>>0])<<24>>24<0)?0|ar[f>>2]:f,c?0|ar[4+f>>2]:255&e),(0|tr[r>>0])<0&&vu(0|ar[f>>2]),Ie(A,o),ar[n>>2]=4304,ar[t>>2]=4324,ar[o>>2]=4340,0<=(0|tr[11+i>>0]))return kf(o),Gf(),bf(t),void(ur=a);vu(0|ar[i>>2]),kf(o),Gf(),bf(t),ur=a}function KA(A,e,r,i){A|=0,r|=0,i|=0;var f,n,t,o,a=0,c=0,l=0;c=0|tr[(f=(e|=0)+36|0)>>0]?12:8,l=1970628964==(0|ar[(o=e+20|0)>>2])?16|c:c,a=(0|ar[(n=r+4|0)>>2])-i-c-(0|ar[r>>2])+l|0,ar[(t=r+12|0)>>2]=i,function(A,e){A|=0;var r,i,f,n,t=0,o=0,a=0,c=0;(0|(e|=0))<=-1&&sr(18843,47382,618,18855),e&&(n=0|ar[(f=A+4|0)>>2],a=c=0|ar[A>>2],(i=(r=(o=n)-c|0)+e|0)>>>0<=r>>>0?i>>>0<r>>>0&&(0|o)!=(0|(t=a+i|0))?ar[f>>2]=t:t=n:(TA(A,e),c=a=0|ar[A>>2],t=0|ar[f>>2]),(t=t-c-e|0)>>>0<=(o=0|ar[A+12>>2])>>>0||wb((A=a+o|0)+e|0,0|A,t-o|0))}(r,l-c|0),UA(r,a),UA(r,0|ar[o>>2]);do{if(1970628964==(0|ar[o>>2])){if(i=e+24|0,16==((0|ar[e+28>>2])-(0|ar[i>>2])|0)){zA(r,i);break}sr(19079,19104,309,19111)}}while(0);do{if(0|tr[f>>0]){if((i=0|ar[e+40>>2])>>>0<16777216){UA(r,cr[e+37>>0]<<24|i);break}sr(19126,19104,314,19111)}}while(0);ar[t>>2]=(0|ar[n>>2])-(0|ar[r>>2]),c=0|ar[(a=56592)+4>>2],ar[(l=A)>>2]=ar[a>>2],ar[l+4>>2]=c,yu(A+8|0,56600)}function Ce(A,e){e|=0;var r,i,f,n,t,o=0,a=0,c=0,l=0;f=(A|=0)+4|0,n=0|ar[A>>2],1073741823<(o=1+(i=(t=(0|ar[f>>2])-n|0)>>2)|0)>>>0&&zl(),a=(c=(0|ar[(l=A+8|0)>>2])-n|0)>>1,a=c>>2>>>0<536870911?a>>>0<o>>>0?o:a:1073741823;do{if(a){if(!(1073741823<a>>>0)){c=0|hu(a<<2);break}Zu(l=0|X(8),44519),ar[l>>2]=17660,I(0|l,4016,428)}else c=0}while(0);ar[(r=c+(i<<2)|0)>>2]=ar[e>>2],o=r+(0-i<<2)|0,0<(0|t)&&hb(0|o,0|n,0|t),ar[A>>2]=o,ar[f>>2]=4+r,ar[l>>2]=c+(a<<2),n&&vu(n)}function qA(A,e,r){A|=0,e|=0;var i,f=0,n=0;if(ur=(i=ur)+16|0,f=i,n=0|FA(r|=0),tr[e+37>>0]=n>>>24,ar[e+40>>2]=16777215&n,tr[e+36>>0]=1,ar[(e=e+16|0)>>2]=4+(0|ar[e>>2]),!(0|tr[r+24>>0]))return f=0|ar[(r=56592)+4>>2],ar[(n=A)>>2]=ar[r>>2],ar[n+4>>2]=f,yu(A+8|0,56600),void(ur=i);ar[f>>2]=0,ar[f+4>>2]=0,ar[f+8>>2]=0,oo(A,2,100,f),ur=(0<=(0|tr[f+11>>0])||vu(0|ar[f>>2]),i)}function $A(A,e,r,i){var f,n,t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p,y,B,E,X,W,I,C,G,V,F=0,R=0,N=0,_=0,Y=0;ur=(V=ur)+208|0,N=(r|=0)+16|0,c=r+24|0,l=4+(W=V+184|0)|0,u=(e|=0)+44|0,b=e+48|0,k=12+(C=(I=V)+24|0)|0,h=4+C|0,w=s=64+C|0,v=136+C|0,m=140+C|0,Z=60+C|0,p=11+(X=V+192|0)|0,y=d=8+C|0,B=11+(G=V+168|0)|0,E=11+(g=44+C|0)|0,f=e+52|0,n=-1!=(0|(i|=0)),o=11+(t=I+8|0)|0,a=(A|=0)+8|0,e=0;A:for(;!(0==(0|ar[(R=N)>>2])&0==(0|ar[R+4>>2])||0|tr[c>>0]);){ar[W>>2]=0,ar[l>>2]=0,Ae(I,r,W);do{if((0|ar[I>>2])==(0|ar[14148])){if((R=F=0|ar[b>>2])-(0|ar[u>>2])>>3>>>0<=2e4){R>>>0<(0|ar[f>>2])>>>0?(ar[F>>2]=ar[W>>2],ar[R+4>>2]=ar[l>>2],ar[W>>2]=0,ar[l>>2]=0,ar[b>>2]=R+8):ee(u,W),R=(n&(0|(e=e+1|0))==(0|i))<<31>>31;break}ar[d>>2]=4524,ar[C>>2]=188,ar[s>>2]=208,ar[h>>2]=0,Jf(w,k),ar[v>>2]=0,ar[m>>2]=-1,ar[C>>2]=4504,ar[s>>2]=4544,ar[d>>2]=4524,Sf(k),ar[k>>2]=4340,ar[g>>2]=0,ar[4+g>>2]=0,ar[8+g>>2]=0,ar[12+g>>2]=0,ar[Z>>2]=24,ar[X>>2]=0,ar[4+X>>2]=0,ar[8+X>>2]=0,Xe(k,X),(0|tr[p>>0])<0&&vu(0|ar[X>>2]),We(0|Lf(0|We(y,19273,30),2e4),19304,10),Ie(G,k),oo(A,6,1e3,G),(0|tr[B>>0])<0&&vu(0|ar[G>>2]),ar[C>>2]=4504,ar[s>>2]=4544,ar[y>>2]=4524,ar[k>>2]=4340,(0|tr[E>>0])<0&&vu(0|ar[g>>2]),kf(k),_f(),bf(s),R=1}else F=0|ar[(Y=I)+4>>2],ar[(R=A)>>2]=ar[Y>>2],ar[R+4>>2]=F,ar[a>>2]=ar[t>>2],ar[4+a>>2]=ar[4+t>>2],ar[8+a>>2]=ar[8+t>>2],ar[t>>2]=0,ar[4+t>>2]=0,ar[8+t>>2]=0,R=1}while(0);switch((0|tr[o>>0])<0&&vu(0|ar[t>>2]),0|(F=0|ar[l>>2])&&du(F),3&R){case 0:break;case 3:break A;default:_=28;break A}}ur=(28!=(0|_)&&(0|tr[c>>0]?(ar[X>>2]=0,ar[4+X>>2]=0,ar[8+X>>2]=0,oo(A,2,100,X),(0|tr[11+X>>0])<0&&vu(0|ar[X>>2])):(_=0|ar[(N=56592)+4>>2],ar[(Y=A)>>2]=ar[N>>2],ar[Y+4>>2]=_,yu(a,56600))),V)}function Ae(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a,c,l,u,b,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0;ur=(b=ur)+320|0,p=b+216|0,l=b+144|0,a=(Z=b)+304|0,n=b+292|0,i=b+280|0,f=b+268|0,t=b+256|0,c=b+248|0,ar[(u=b+168|0)>>2]=4264,o=8+u|0,ar[40+u>>2]=0,ar[o>>2]=0,ar[4+o>>2]=0,ar[8+o>>2]=0,ar[12+o>>2]=0,ar[16+o>>2]=0,ar[20+o>>2]=0,ar[24+o>>2]=0,or[28+o>>1]=0,re(l,u,e);A:do{if(0|ar[l>>2])B=0|ar[(p=l)+4>>2],ar[(y=A)>>2]=ar[p>>2],ar[y+4>>2]=B,B=8+l|0,ar[(y=A+8|0)>>2]=ar[B>>2],ar[y+4>>2]=ar[B+4>>2],ar[y+8>>2]=ar[B+8>>2],ar[B>>2]=0,ar[B+4>>2]=0,ar[B+8>>2]=0;else{if(0|tr[e+24>>0]){ar[p>>2]=0,ar[p+4>>2]=0,ar[p+8>>2]=0,oo(A,2,100,p),(0|tr[p+11>>0])<0&&vu(0|ar[p>>2]);break}s=0|ar[20+u>>2];e:do{if((0|s)<1768714083){if((0|s)<1718909296){if((0|s)<1668246642){if((0|s)<1635135811){switch(0|s){case 1635088451:break;default:g=133;break e}s=0|hu(96),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=5196,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,d=(ar[d>>2]=y)+w|0,ar[h>>2]=d,hb(0|y,0|v,0|w),ar[k>>2]=d;break}zl()}}while(0);v=0|ar[(w=36+u|0)+4>>2],ar[(y=s+52|0)>>2]=ar[w>>2],ar[y+4>>2]=v,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=5224,ar[(y=s+72|0)>>2]=0,ar[y+4>>2]=0,ar[y+8>>2]=0,ar[y+12>>2]=0,ar[y+16>>2]=0,ar[y+20>>2]=0;break}if((0|s)<1668047216){switch(0|s){case 1635135811:break;default:g=133;break e}s=0|hu(96),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=5556,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){B=0|hu(w),ar[k>>2]=B,y=(ar[d>>2]=B)+w|0,ar[h>>2]=y,hb(0|B,0|v,0|w),ar[k>>2]=y;break}zl()}}while(0);for(w=0|ar[(B=36+u|0)+4>>2],ar[(h=s+52|0)>>2]=ar[B>>2],ar[h+4>>2]=w,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=5584,tr[s+72>>0]=1,w=(h=s+73|0)+23|0;(0|(h=h+1|(tr[h>>0]=0)))<(0|w););break}switch(0|s){case 1668047216:break;default:g=133;break e}s=0|hu(104),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=5376,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,B=(ar[d>>2]=y)+w|0,ar[h>>2]=B,hb(0|y,0|v,0|w),ar[k>>2]=B;break}zl()}}while(0);y=0|ar[(v=36+u|0)+4>>2],ar[(B=s+52|0)>>2]=ar[v>>2],ar[B+4>>2]=y,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=5404,ar[s+72>>2]=0,ar[s+76>>2]=1,ar[s+80>>2]=0,ar[s+84>>2]=1,ar[s+88>>2]=0,ar[s+92>>2]=1,ar[s+96>>2]=0,ar[s+100>>2]=1;break}if((0|s)<1684631142){switch(0|s){case 1668246642:break;default:g=133;break e}s=0|hu(80),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=5916,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,B=(ar[d>>2]=y)+w|0,ar[h>>2]=B,hb(0|y,0|v,0|w),ar[k>>2]=B;break}zl()}}while(0);y=0|ar[(v=36+u|0)+4>>2],ar[(B=s+52|0)>>2]=ar[v>>2],ar[B+4>>2]=y,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=5944,ar[s+72>>2]=0,ar[s+76>>2]=0;break}if((0|s)<1685218662){switch(0|s){case 1684631142:break;default:g=133;break e}s=0|hu(72),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=5736,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,B=(ar[d>>2]=y)+w|0,ar[h>>2]=B,hb(0|y,0|v,0|w),ar[k>>2]=B;break}zl()}}while(0);y=0|ar[(v=36+u|0)+4>>2],ar[(B=s+52|0)>>2]=ar[v>>2],ar[B+4>>2]=y,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=5764;break}switch(0|s){case 1685218662:break;default:g=133;break e}s=0|hu(72),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=5796,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,B=(ar[d>>2]=y)+w|0,ar[h>>2]=B,hb(0|y,0|v,0|w),ar[k>>2]=B;break}zl()}}while(0);y=0|ar[(v=36+u|0)+4>>2],ar[(B=s+52|0)>>2]=ar[v>>2],ar[B+4>>2]=y,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=5824;break}if((0|s)<1752589123){if((0|s)<1735553132){switch(0|s){case 1718909296:break;default:g=133;break e}s=0|hu(96),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=4600,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,B=(ar[d>>2]=y)+w|0,ar[h>>2]=B,hb(0|y,0|v,0|w),ar[k>>2]=B;break}zl()}}while(0);y=0|ar[(v=36+u|0)+4>>2],ar[(B=s+52|0)>>2]=ar[v>>2],ar[B+4>>2]=y,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=4436,ar[(B=s+72|0)>>2]=0,ar[B+4>>2]=0,ar[B+8>>2]=0,ar[B+12>>2]=0,ar[B+16>>2]=0;break}if((0|s)<1751411826){switch(0|s){case 1735553132:break;default:g=133;break e}s=0|hu(88),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=5676,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,B=(ar[d>>2]=y)+w|0,ar[h>>2]=B,hb(0|y,0|v,0|w),ar[k>>2]=B;break}zl()}}while(0);y=0|ar[(v=36+u|0)+4>>2],ar[(B=s+52|0)>>2]=ar[v>>2],ar[B+4>>2]=y,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=5704,ar[s+72>>2]=0,ar[s+76>>2]=0,ar[s+80>>2]=0;break}switch(0|s){case 1751411826:break;default:g=133;break e}s=0|hu(104),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=4656,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,B=(ar[d>>2]=y)+w|0,ar[h>>2]=B,hb(0|y,0|v,0|w),ar[k>>2]=B;break}zl()}}while(0);y=0|ar[(v=36+u|0)+4>>2],ar[(B=s+52|0)>>2]=ar[v>>2],ar[B+4>>2]=y,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=4684,ar[s+72>>2]=0,ar[s+76>>2]=1885954932,ar[(B=s+80|0)>>2]=0,ar[B+4>>2]=0,ar[B+8>>2]=0,ar[B+12>>2]=0,ar[B+16>>2]=0,ar[B+20>>2]=0;break}if((0|s)<1768186228){switch(0|s){case 1752589123:break;default:g=133;break e}s=0|hu(120),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=5496,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,B=(ar[d>>2]=y)+w|0,ar[h>>2]=B,hb(0|y,0|v,0|w),ar[k>>2]=B;break}zl()}}while(0);y=0|ar[(v=36+u|0)+4>>2],ar[(B=s+52|0)>>2]=ar[v>>2],ar[B+4>>2]=y,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=5524,ar[s+80>>2]=0,ar[s+84>>2]=0,tr[s+104>>0]=4,ar[s+108>>2]=0,ar[s+112>>2]=0,ar[s+116>>2]=0;break}if((0|s)<1768517222){switch(0|s){case 1768186228:break;default:g=133;break e}s=0|hu(104),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=5616,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,B=(ar[d>>2]=y)+w|0,ar[h>>2]=B,hb(0|y,0|v,0|w),ar[k>>2]=B;break}zl()}}while(0);y=0|ar[(v=36+u|0)+4>>2],ar[(B=s+52|0)>>2]=ar[v>>2],ar[B+4>>2]=y,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=5644,ar[(B=s+72|0)>>2]=0,ar[B+4>>2]=0,ar[B+8>>2]=0,ar[B+12>>2]=0,ar[B+16>>2]=0,ar[B+20>>2]=0,ar[B+24>>2]=0;break}switch(0|s){case 1768517222:break;default:g=133;break e}s=0|hu(72),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=4836,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,B=(ar[d>>2]=y)+w|0,ar[h>>2]=B,hb(0|y,0|v,0|w),ar[k>>2]=B;break}zl()}}while(0);y=0|ar[(v=36+u|0)+4>>2],ar[(B=s+52|0)>>2]=ar[v>>2],ar[B+4>>2]=y,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=4864;break}if((0|s)<1769104742){if(1768973167<=(0|s)){if((0|s)<1768975713){switch(0|s){case 1768973167:break;default:g=133;break e}s=0|hu(72),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=5016,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,B=(ar[d>>2]=y)+w|0,ar[h>>2]=B,hb(0|y,0|v,0|w),ar[k>>2]=B;break}zl()}}while(0);y=0|ar[(v=36+u|0)+4>>2],ar[(B=s+52|0)>>2]=ar[v>>2],ar[B+4>>2]=y,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=5044;break}switch(0|s){case 1768977008:s=0|hu(72),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=4956,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,B=(ar[d>>2]=y)+w|0,ar[h>>2]=B,hb(0|y,0|v,0|w),ar[k>>2]=B;break}zl()}}while(0);y=0|ar[(v=36+u|0)+4>>2],ar[(B=s+52|0)>>2]=ar[v>>2],ar[B+4>>2]=y,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=4984;break e;case 1768975713:s=0|hu(88),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=5076,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,B=(ar[d>>2]=y)+w|0,ar[h>>2]=B,hb(0|y,0|v,0|w),ar[k>>2]=B;break}zl()}}while(0);y=0|ar[(v=36+u|0)+4>>2],ar[(B=s+52|0)>>2]=ar[v>>2],ar[B+4>>2]=y,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=5104,ar[s+72>>2]=0,ar[s+76>>2]=0,ar[s+80>>2]=0;break e;default:g=133;break e}}if((0|s)<1768778098){switch(0|s){case 1768714083:break;default:g=133;break e}s=0|hu(104),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=4776,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,B=(ar[d>>2]=y)+w|0,ar[h>>2]=B,hb(0|y,0|v,0|w),ar[k>>2]=B;break}zl()}}while(0);y=0|ar[(v=36+u|0)+4>>2],ar[(B=s+52|0)>>2]=ar[v>>2],ar[B+4>>2]=y,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=4804,B=s+72|0,ar[s+96>>2]=0,ar[B>>2]=0,ar[B+4>>2]=0,ar[B+8>>2]=0,ar[B+12>>2]=0,ar[B+16>>2]=0,tr[B+20>>0]=0;break}if((0|s)<1768842853){switch(0|s){case 1768778098:break;default:g=133;break e}s=0|hu(80),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=5316,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,B=(ar[d>>2]=y)+w|0,ar[h>>2]=B,hb(0|y,0|v,0|w),ar[k>>2]=B;break}zl()}}while(0);y=0|ar[(v=36+u|0)+4>>2],ar[(B=s+52|0)>>2]=ar[v>>2],ar[B+4>>2]=y,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=5344,tr[s+72>>0]=0;break}switch(0|s){case 1768842853:break;default:g=133;break e}s=0|hu(144),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=4896,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,B=(ar[d>>2]=y)+w|0,ar[h>>2]=B,hb(0|y,0|v,0|w),ar[k>>2]=B;break}zl()}}while(0);for(h=0|ar[(w=36+u|0)+4>>2],ar[(d=s+52|0)>>2]=ar[w>>2],ar[d+4>>2]=h,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=4924,ar[s+72>>2]=0,w=(h=d=s+80|(or[s+76>>1]=0))+60|0;(0|(h=h+4|(ar[h>>2]=0)))<(0|w););tr[d+60>>0]=0;break}if((0|s)<1835365473){if((0|s)<1769107316){switch(0|s){case 1769104742:break;default:g=133;break e}s=0|hu(88),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=5436,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,B=(ar[d>>2]=y)+w|0,ar[h>>2]=B,hb(0|y,0|v,0|w),ar[k>>2]=B;break}zl()}}while(0);y=0|ar[(v=36+u|0)+4>>2],ar[(B=s+52|0)>>2]=ar[v>>2],ar[B+4>>2]=y,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=5464,ar[s+72>>2]=0,ar[s+76>>2]=0,ar[s+80>>2]=0;break}if((0|s)<1769173093){switch(0|s){case 1769107316:break;default:g=133;break e}s=0|hu(80),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=5256,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,B=(ar[d>>2]=y)+w|0,ar[h>>2]=B,hb(0|y,0|v,0|w),ar[k>>2]=B;break}zl()}}while(0);y=0|ar[(v=36+u|0)+4>>2],ar[(B=s+52|0)>>2]=ar[v>>2],ar[B+4>>2]=y,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=5284,ar[s+72>>2]=0;break}switch(0|s){case 1769173093:break;default:g=133;break e}s=0|hu(80),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=5136,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,B=(ar[d>>2]=y)+w|0,ar[h>>2]=B,hb(0|y,0|v,0|w),ar[k>>2]=B;break}zl()}}while(0);y=0|ar[(v=36+u|0)+4>>2],ar[(B=s+52|0)>>2]=ar[v>>2],ar[B+4>>2]=y,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=5164,ar[s+72>>2]=0,ar[s+76>>2]=0;break}if((0|s)<1885960297){if((0|s)<1885959277){switch(0|s){case 1835365473:break;default:g=133;break e}s=0|hu(72),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=4628,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,B=(ar[d>>2]=y)+w|0,ar[h>>2]=B,hb(0|y,0|v,0|w),ar[k>>2]=B;break}zl()}}while(0);y=0|ar[(v=36+u|0)+4>>2],ar[(B=s+52|0)>>2]=ar[v>>2],ar[B+4>>2]=y,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=4468;break}switch(0|s){case 1885959277:break;default:g=133;break e}s=0|hu(80),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=4716,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,B=(ar[d>>2]=y)+w|0,ar[h>>2]=B,hb(0|y,0|v,0|w),ar[k>>2]=B;break}zl()}}while(0);y=0|ar[(v=36+u|0)+4>>2],ar[(B=s+52|0)>>2]=ar[v>>2],ar[B+4>>2]=y,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=4744,ar[s+72>>2]=0;break}if((0|s)<1970433056){switch(0|s){case 1885960297:break;default:g=133;break e}s=0|hu(88),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=5976,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,B=(ar[d>>2]=y)+w|0,ar[h>>2]=B,hb(0|y,0|v,0|w),ar[k>>2]=B;break}zl()}}while(0);y=0|ar[(v=36+u|0)+4>>2],ar[(B=s+52|0)>>2]=ar[v>>2],ar[B+4>>2]=y,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=6004,ar[s+72>>2]=0,ar[s+76>>2]=0,ar[s+80>>2]=0;break}switch(0|s){case 1970433056:break;default:g=133;break e}s=0|hu(88),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=5856,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,B=(ar[d>>2]=y)+w|0,ar[h>>2]=B,hb(0|y,0|v,0|w),ar[k>>2]=B;break}zl()}}while(0);y=0|ar[(v=36+u|0)+4>>2],ar[(B=s+52|0)>>2]=ar[v>>2],ar[B+4>>2]=y,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0,ar[m>>2]=5884,ar[(B=s+72|0)>>2]=0,ar[B+4>>2]=0,ar[B+8>>2]=0;break}while(0);if(133==(0|g)){s=0|hu(72),ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s>>2]=6036,ar[(m=s+16|0)>>2]=4264,ar[(d=s+24|0)>>2]=ar[o>>2],ar[d+4>>2]=ar[4+o>>2],ar[d+8>>2]=ar[8+o>>2],ar[d+12>>2]=ar[12+o>>2],ar[(d=s+40|0)>>2]=0,ar[(k=s+44|0)>>2]=0,v=(ar[(h=s+48|0)>>2]=0)|ar[24+u>>2],w=(0|ar[28+u>>2])-v|0;do{if(0|w){if(!((0|w)<0)){y=0|hu(w),ar[k>>2]=y,B=(ar[d>>2]=y)+w|0,ar[h>>2]=B,hb(0|y,0|v,0|w),ar[k>>2]=B;break}zl()}}while(0);y=0|ar[(g=36+u|0)+4>>2],ar[(B=s+52|0)>>2]=ar[g>>2],ar[B+4>>2]=y,ar[m>>2]=4404,ar[s+60>>2]=0,ar[s+64>>2]=0,ar[s+68>>2]=0}g=m,d=0|ar[(k=o)>>2],k=0|ar[k+4>>2],h=0|ar[(v=16+u|0)>>2];do{if(k>>>0<0|0==(0|k)&d>>>0<h>>>0)k=Z+64|0,ar[(w=Z+8|0)>>2]=4524,h=Z+12|0,ar[Z>>2]=188,ar[k>>2]=208,Jf(Z+64|(ar[Z+4>>2]=0),h),ar[Z+136>>2]=0,ar[Z+140>>2]=-1,ar[Z>>2]=4504,ar[k>>2]=4544,ar[w>>2]=4524,Sf(h),ar[h>>2]=4340,ar[(w=Z+44|0)>>2]=0,ar[w+4>>2]=0,ar[w+8>>2]=0,ar[w+12>>2]=0,ar[Z+60>>2]=24,ar[p>>2]=0,ar[p+4>>2]=0,ar[p+8>>2]=0,Xe(h,p),(0|tr[p+11>>0])<0&&vu(0|ar[p>>2]),y=0|We(d=Z+8|0,19384,10),B=0|We(0|Kf(y,0|ar[(B=o)>>2],0|ar[B+4>>2]),19395,34),We(0|Lf(B,0|ar[v>>2]),19430,7),Ie(a,h),oo(A,2,101,a),(0|tr[11+a>>0])<0&&vu(0|ar[a>>2]),ar[Z>>2]=4504,ar[k>>2]=4544,ar[d>>2]=4524,ar[h>>2]=4340,(0|tr[w+11>>0])<0&&vu(0|ar[w>>2]),kf(h),_f(),bf(k);else{if(20<(0|ar[e+12>>2])){for(ar[n>>2]=0,ar[4+n>>2]=0,d=(ar[8+n>>2]=0)|hu(64),ar[n>>2]=d,ar[8+n>>2]=-2147483584,k=19438,w=(h=d)+(ar[4+n>>2]=61)|0;tr[h>>0]=0|tr[k>>0],k=k+1|0,(0|(h=h+1|0))<(0|w););if(tr[d+61>>0]=0,oo(A,6,1e3,n),0<=(0|tr[11+n>>0]))break;vu(0|ar[n>>2]);break}if(0|NA(e,B=0|ob(0|d,0|k,0|h,0),D)){if(ar[i>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,oo(A,2,100,i),0<=(0|tr[11+i>>0]))break;vu(0|ar[i>>2]);break}if(d=0|ar[(k=o)>>2],(0|(k=0|ar[k+4>>2]))<0){if(ar[f>>2]=0,ar[4+f>>2]=0,ar[8+f>>2]=0,oo(A,2,101,f),0<=(0|tr[11+f>>0]))break;vu(0|ar[f>>2]);break}if(h=0|ob(0|d,0|k,0|ar[v>>2],0),w=D,(0|(y=0|ar[(B=e+16|0)+4>>2]))<(0|w)|((0|y)==(0|w)?(0|ar[B>>2])>>>0<h>>>0:0)){if(ar[t>>2]=0,ar[4+t>>2]=0,ar[8+t>>2]=0,oo(A,2,101,t),0<=(0|tr[11+t>>0]))break;vu(0|ar[t>>2]);break}if(ar[c>>2]=ar[e>>2],d=4+c|0,k=0|ar[e+4>>2],0|(ar[d>>2]=k)&&bu(k),WA(p,c,h,w,e),0|(d=0|ar[d>>2])&&du(d),ns[127&ar[20+(0|ar[m>>2])>>2]](Z,m,p),d=0|ar[(k=Z)+4>>2],ar[(v=l)>>2]=ar[k>>2],ar[v+4>>2]=d,d=Z+8|0,(0|tr[(k=(v=8+l|0)+11|0)>>0])<0?(tr[ar[v>>2]>>0]=0,ar[12+l>>2]=0):(tr[v>>0]=0,tr[k>>0]=0),Cu(v,0),ar[v>>2]=ar[d>>2],ar[v+4>>2]=ar[d+4>>2],ar[v+8>>2]=ar[d+8>>2],(0|ar[l>>2])==(0|ar[14148])&&(ar[r>>2]=g,d=0|ar[(B=r+4|0)>>2],ar[B>>2]=s,s=(d&&du(d),0)),k=0|ar[(d=w=p+16|0)>>2],0<(0|(d=0|ar[d+4>>2]))|0==(0|d)&0<k>>>0&&((h=0|ar[p+8>>2])&&(_A(h,k,d),k=0|ar[(d=w)>>2],d=0|ar[d+4>>2]),y=0|ar[p>>2],B=0|ar[y>>2],Z=0|ar[B+20>>2],B=0|tb(0|(B=0|jb[127&ar[B+8>>2]](y)),0|D,0|k,0|d),xb[63&Z](y,B,D),ar[(B=w)>>2]=0,ar[B+4>>2]=0),B=0|ar[(y=l)+4>>2],ar[(d=A)>>2]=ar[y>>2],ar[d+4>>2]=B,ar[(d=A+8|0)>>2]=ar[v>>2],ar[d+4>>2]=ar[v+4>>2],ar[d+8>>2]=ar[v+8>>2],ar[v>>2]=0,ar[v+4>>2]=0,(ar[v+8>>2]=0)|(d=0|ar[p+4>>2])&&du(d),!s)break A}}while(0);du(s)}}while(0);(0|tr[(s=8+l|0)+11>>0])<0&&vu(0|ar[s>>2]),ar[u>>2]=4264,ur=((d=0|ar[24+u>>2])&&((0|ar[(s=28+u|0)>>2])!=(0|d)&&(ar[s>>2]=d),vu(d)),b)}function ee(A,e){e|=0;var r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0;t=0|ar[(b=(A|=0)+4|0)>>2],r=o=0|ar[A>>2],536870911<(f=(l=t-o>>3)+1|0)>>>0&&zl(),a=(u=(0|ar[(i=A+8|0)>>2])-o|0)>>2,a=u>>3>>>0<268435455?a>>>0<f>>>0?f:a:536870911;do{if(a){if(!(536870911<a>>>0)){c=0|hu(a<<3);break}Zu(b=0|X(8),44519),ar[b>>2]=17660,I(0|b,4016,428)}else c=0}while(0);if(u=c+(a<<3)|0,ar[(f=n=c+(l<<3)|0)>>2]=ar[e>>2],a=e+4|0,ar[c+(l<<3)+4>>2]=ar[a>>2],ar[e>>2]=0,a=n+8|(ar[a>>2]=0),(0|t)!=(0|r)){for(;t=(l=t)+-8|0,ar[n+-8>>2]=ar[t>>2],l=l+-4|0,ar[n+-4>>2]=ar[l>>2],ar[t>>2]=0,f=n=f+-8|(ar[l>>2]=0),(0|t)!=(0|r););o=0|ar[A>>2]}if(ar[A>>2]=f,f=0|ar[b>>2],ar[b>>2]=a,ar[i>>2]=u,(0|f)!=(0|(t=o)))for(;n=0|ar[f+-4>>2],f=f+-8|0,0|n&&du(n),(0|f)!=(0|t););o&&vu(o)}function re(A,e,r){A|=0,e|=0;var i,f,n,t,o,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0;if(ur=(o=ur)+208|0,k=o+196|0,a=o+184|0,c=o+24|0,i=o+40|0,f=o+12|0,n=o,0|NA(r|=0,8,0))return ar[a>>2]=0,ar[a+4>>2]=0,ar[a+8>>2]=0,oo(A,2,100,a),0<=(0|tr[a+11>>0])||vu(0|ar[a>>2]),void(ur=o);s=0|FA(r),ar[(a=b=e+8|0)>>2]=s,a=(ar[a+4>>2]=0)|FA(r),ar[(s=e+20|0)>>2]=a,ar[(t=e+16|0)>>2]=8,u=b;do{if(1==(0|ar[u>>2])&0==(0|ar[u+4>>2])){if(0|NA(r,8,0))return ar[c>>2]=0,ar[c+4>>2]=0,ar[c+8>>2]=0,oo(A,2,100,c),0<=(0|tr[c+11>>0])||vu(0|ar[c>>2]),void(ur=o);if(l=0|FA(r),c=0|FA(r),ar[(a=b)>>2]=c,ar[a+4>>2]=l,ar[t>>2]=8+(0|ar[t>>2]),a=64+i|0,ar[(l=8+i|0)>>2]=4524,c=12+i|0,ar[i>>2]=188,ar[a>>2]=208,Jf(64+i|(ar[4+i>>2]=0),c),ar[136+i>>2]=0,ar[140+i>>2]=-1,ar[i>>2]=4504,ar[a>>2]=4544,ar[l>>2]=4524,Sf(c),ar[c>>2]=4340,ar[(l=44+i|0)>>2]=0,ar[l+4>>2]=0,ar[l+8>>2]=0,ar[l+12>>2]=0,ar[60+i>>2]=24,ar[k>>2]=0,ar[k+4>>2]=0,ar[k+8>>2]=0,Xe(c,k),(0|tr[k+11>>0])<0&&vu(0|ar[k>>2]),w=0|We(u=8+i|0,23427,9),We(0|Kf(w,0|ar[(h=b)>>2],0|ar[h+4>>2]),23437,24),268435455<(h=0|ar[b+4>>2])>>>0|268435455==(0|h)&4294967295<(0|ar[b>>2])>>>0)return Ie(f,c),oo(A,6,1e3,f),(0|tr[11+f>>0])<0&&vu(0|ar[f>>2]),ar[i>>2]=4504,ar[a>>2]=4544,ar[u>>2]=4524,ar[c>>2]=4340,(0|tr[l+11>>0])<0&&vu(0|ar[l>>2]),kf(c),_f(),bf(a),void(ur=o);ar[i>>2]=4504,ar[a>>2]=4544,ar[u>>2]=4524,ar[c>>2]=4340,(0|tr[l+11>>0])<0&&vu(0|ar[l>>2]),kf(c),_f(),bf(a),a=0|ar[s>>2];break}}while(0);if(1970628964==(0|a)){if(0|NA(r,16,0))return ar[n>>2]=0,ar[n+4>>2]=0,ar[n+8>>2]=0,oo(A,2,100,n),0<=(0|tr[n+11>>0])||vu(0|ar[n>>2]),void(ur=o);do{if(0|CA(r,16,0)){if(b=e+24|0,16<=(c=(u=0|ar[(a=e+28|0)>>2])-(l=0|ar[b>>2])|0)>>>0?16!=(0|c)&&(0|u)!=(0|(d=l+16|0))&&(ar[a>>2]=d):TA(b,16-c|0),a=0|ar[r>>2],c=0|ar[r+4>>2]){bu(c),xb[63&ar[16+(0|ar[a>>2])>>2]](a,0|ar[b>>2],16),du(c);break}xb[63&ar[16+(0|ar[a>>2])>>2]](a,0|ar[b>>2],16);break}}while(0);ar[t>>2]=16+(0|ar[t>>2])}0|tr[r+24>>0]?(ar[k>>2]=0,ar[k+4>>2]=0,ar[k+8>>2]=0,oo(A,2,100,k),(0|tr[k+11>>0])<0&&vu(0|ar[k>>2])):(h=0|ar[(k=56592)+4>>2],ar[(w=A)>>2]=ar[k>>2],ar[w+4>>2]=h,yu(A+8|0,56600)),ur=o}function ie(A,e,r){A|=0,e|=0;var i,f=0;if(ur=(i=ur)+16|0,f=i,!(0|NA(r|=0,7,0)))return f=0|VA(r),or[e+4>>1]=f,f=0|VA(r),or[e+6>>1]=f,f=0|VA(r),or[e+8>>1]=f,r=(255&(0|IA(r)))>>>7,tr[e+10>>0]=r,r=0|ar[(e=56592)+4>>2],ar[(f=A)>>2]=ar[e>>2],ar[f+4>>2]=r,yu(A+8|0,56600),void(ur=i);ar[f>>2]=0,ar[f+4>>2]=0,ar[f+8>>2]=0,oo(A,2,100,f),ur=(0<=(0|tr[f+11>>0])||vu(0|ar[f>>2]),i)}function fe(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o=0,a=0,c=0,l=0,u=0,b=0,s=0;ur=(t=ur)+16|0,o=t,n=0|hu(32),ar[4+n>>2]=0,ar[8+n>>2]=0,ar[n>>2]=6120,a=0|ar[e>>2],ar[o>>2]=0,ar[(f=o+4|0)>>2]=0,c=(ar[o+8>>2]=0)|ar[r>>2],e=(0|ar[r+4>>2])-c|0,r=c;do{if(e){if(!((0|e)<0)){b=0|hu(e),s=(ar[o>>2]=b)+e|0,ar[o+8>>2]=s,hb(0|b,0|r,0|e),l=b,u=ar[f>>2]=s;break}zl()}else s=b=u=l=0}while(0);if(ar[(c=12+n|0)>>2]=6148,ar[16+n>>2]=a,ar[(r=20+n|0)>>2]=0,ar[(i=24+n|0)>>2]=0,(ar[(o=28+n|0)>>2]=0)|(e=u-l|0)&&((0|e)<0&&zl(),a=0|hu(e),ar[i>>2]=a,ar[r>>2]=a,ar[o>>2]=a+e,0<(0|(e=u-b|0))&&(hb(0|a,0|b,0|e),ar[i>>2]=a+e)),!b)return s=A+4|0,ar[A>>2]=c,ar[s>>2]=n,void(ur=t);(0|s)!=(0|b)&&(ar[f>>2]=b),vu(b),s=A+4|0,ar[A>>2]=c,ar[s>>2]=n,ur=t}function ne(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a,c,l=0,u=0,b=0,s=0;if(ur=(c=ur)+160|0,f=c+136|0,o=(t=c)+56|0,a=t+4|0,ar[t>>2]=292,ar[o>>2]=312,Jf(t+56|0,a),ar[t+128>>2]=0,ar[t+132>>2]=-1,ar[t>>2]=4304,ar[o>>2]=4324,Sf(a),ar[a>>2]=4340,ar[(n=t+36|0)>>2]=0,ar[4+n>>2]=0,ar[8+n>>2]=0,ar[12+n>>2]=0,ar[t+52>>2]=16,ar[f>>2]=0,ar[4+f>>2]=0,ar[8+f>>2]=0,Xe(a,f),(0|tr[11+f>>0])<0&&vu(0|ar[f>>2]),l=1+(0|ar[r>>2])|0,ar[r>>2]=l,(0|(u=0|ar[e+44>>2]))!=(0|(i=0|ar[e+48>>2]))){for(b=11+f|0,s=4+f|0,l=1,e=u;;){if(!l){if(0<(0|ar[r>>2]))for(l=0;We(t,18862,2),(0|(l=l+1|0))<(0|ar[r>>2]););We(t,30086,1)}if(u=0|ar[e>>2],ns[127&ar[8+(0|ar[u>>2])>>2]](f,u,r),We(t,(l=(u=0|tr[b>>0])<<24>>24<0)?0|ar[f>>2]:f,l?0|ar[s>>2]:255&u),(0|tr[b>>0])<0&&vu(0|ar[f>>2]),(0|(e=e+8|0))==(0|i))break;l=0}l=0|ar[r>>2]}if(ar[r>>2]=(0|l)<1?0:l+-1|0,Ie(A,a),ar[t>>2]=4304,ar[o>>2]=4324,ar[a>>2]=4340,0<=(0|tr[11+n>>0]))return kf(a),Gf(),bf(o),void(ur=c);vu(0|ar[n>>2]),kf(a),Gf(),bf(o),ur=c}function te(A){var e,r=0,i=0,f=0,n=0,t=0,o=0,a=0;if(ar[(A|=0)>>2]=5704,0|(r=0|ar[(e=A+56|0)>>2])){if((0|(i=0|ar[(a=A+60|0)>>2]))!=(0|r)){for(;o=i+-64|0,ar[a>>2]=o,0|(f=0|ar[i+-12>>2])&&((0|(t=0|ar[(n=i+-8|0)>>2]))!=(0|f)&&(ar[n>>2]=t+(~((t+-4-f|0)>>>2)<<2)),vu(f)),ar[o>>2]=4264,0|(f=0|ar[i+-40>>2])&&((0|ar[(i=i+-36|0)>>2])!=(0|f)&&(ar[i>>2]=f),vu(f)),(0|(i=0|ar[a>>2]))!=(0|r););r=0|ar[e>>2]}vu(r)}if(ar[A>>2]=4404,0|(r=0|ar[(n=A+44|0)>>2])){if((0|(i=0|ar[(t=A+48|0)>>2]))!=(0|r)){for(;f=i+-8|0,ar[t>>2]=f,(0|(i=(i=0|ar[i+-4>>2])?(du(i),0|ar[t>>2]):f))!=(0|r););r=0|ar[n>>2]}vu(r)}ar[A>>2]=4264,(i=0|ar[A+24>>2])&&((0|ar[(r=A+28|0)>>2])!=(0|i)&&(ar[r>>2]=i),vu(i))}function oe(A,e){e|=0;var r=0,i=0,f=0,n=0,t=0,o=0;ar[(A|=0)>>2]=4264,f=e+8|0,ar[(i=A+8|0)>>2]=ar[f>>2],ar[i+4>>2]=ar[f+4>>2],ar[i+8>>2]=ar[f+8>>2],ar[i+12>>2]=ar[f+12>>2],f=e+24|0,ar[(i=A+24|0)>>2]=0,ar[(o=A+28|0)>>2]=0,(ar[A+32>>2]=0)|(r=(0|ar[(n=e+28|0)>>2])-(0|ar[f>>2])|0)&&((0|r)<0&&zl(),t=0|hu(r),ar[o>>2]=t,ar[i>>2]=t,ar[A+32>>2]=t+r,i=0|ar[f>>2],0<(0|(r=(0|ar[n>>2])-i|0))&&(hb(0|t,0|i,0|r),ar[o>>2]=t+r)),t=0|ar[(n=e+36|0)+4>>2],ar[(o=A+36|0)>>2]=ar[n>>2],ar[o+4>>2]=t,ar[A+48>>2]=ar[e+48>>2],Ge(A+52|0,e+52|0)}function ae(A,e){e|=0;var r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0;i=(A|=0)+4|0,f=0|ar[A>>2],67108863<(n=(t=(0|ar[i>>2])-f>>6)+1|0)>>>0&&zl(),f=(c=(0|ar[(l=A+8|0)>>2])-f|0)>>5,f=c>>6>>>0<33554431?f>>>0<n>>>0?n:f:67108863;do{if(f){if(!(67108863<f>>>0)){n=0|hu(f<<6);break}Zu(l=0|X(8),44519),ar[l>>2]=17660,I(0|l,4016,428)}else n=0}while(0);if(r=n+(f<<6)|0,oe(t=o=n+(t<<6)|0,e),a=o+64|0,e=0|ar[A>>2],(0|(f=0|ar[i>>2]))==(0|e))f=t,n=c=e;else{for(n=o;oe(n+-64|0,f=f+-64|0),t=n=t+-64|0,(0|f)!=(0|e););f=t,c=0|ar[A>>2],n=0|ar[i>>2]}if(ar[A>>2]=f,ar[i>>2]=a,ar[l>>2]=r,(0|n)!=(0|(a=c)))for(o=n;o=(e=o)+-64|0,0|(f=0|ar[e+-12>>2])&&((0|(t=0|ar[(n=e+-8|0)>>2]))!=(0|f)&&(ar[n>>2]=t+(~((t+-4-f|0)>>>2)<<2)),vu(f)),ar[o>>2]=4264,0|(n=0|ar[e+-40>>2])&&((0|ar[(f=e+-36|0)>>2])!=(0|n)&&(ar[f>>2]=n),vu(n)),(0|o)!=(0|a););c&&vu(c)}function Ge(A,e){e|=0;var r,i,f,n,t=0;ar[(A|=0)>>2]=0,ar[(n=A+4|0)>>2]=0,(r=(t=((ar[A+8>>2]=0)|ar[(f=e+4|0)>>2])-(0|ar[e>>2])|0)>>2)&&(1073741823<r>>>0&&zl(),i=0|hu(t),ar[n>>2]=i,ar[A>>2]=i,ar[A+8>>2]=i+(r<<2),A=0|ar[e>>2],(0|(t=(0|ar[f>>2])-A|0))<=0||(hb(0|i,0|A,0|t),ar[n>>2]=i+(t>>>2<<2)))}function ce(A){var e,r=0,i=0,f=0,n=0,t=0,o=0,a=0,c=0;if(ar[(A|=0)>>2]=5524,0|(r=0|ar[(e=A+92|0)>>2])){if((0|(i=0|ar[(c=A+96|0)>>2]))!=(0|r)){for(f=i;;){if(i=f+-16|0,ar[c>>2]=i,o=0|ar[(a=f+-12|0)>>2]){if((0|(i=0|ar[(t=f+-8|0)>>2]))==(0|o))i=o;else{for(;f=i+-12|0,ar[t>>2]=f,(0|(i=(n=0|ar[f>>2])?((0|ar[(i=i+-8|0)>>2])!=(0|n)&&(ar[i>>2]=n),vu(n),0|ar[t>>2]):f))!=(0|o););i=0|ar[a>>2]}vu(i),i=0|ar[c>>2]}if((0|i)==(0|r))break;f=i}r=0|ar[e>>2]}vu(r)}if(ar[A>>2]=4404,0|(r=0|ar[(n=A+44|0)>>2])){if((0|(i=0|ar[(t=A+48|0)>>2]))!=(0|r)){for(;f=i+-8|0,ar[t>>2]=f,(0|(i=(i=0|ar[i+-4>>2])?(du(i),0|ar[t>>2]):f))!=(0|r););r=0|ar[n>>2]}vu(r)}ar[A>>2]=4264,(i=0|ar[A+24>>2])&&((0|ar[(r=A+28|0)>>2])!=(0|i)&&(ar[r>>2]=i),vu(i))}function le(A,e){e|=0;var r,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0;r=(A|=0)+4|0,i=0|ar[A>>2],268435455<(f=(o=(0|ar[r>>2])-i>>4)+1|0)>>>0&&zl(),i=(c=(0|ar[(l=A+8|0)>>2])-i|0)>>3,i=c>>4>>>0<134217727?i>>>0<f>>>0?f:i:268435455;do{if(i){if(!(268435455<i>>>0)){t=0|hu(i<<4);break}Zu(l=0|X(8),44519),ar[l>>2]=17660,I(0|l,4016,428)}else t=0}while(0);if(a=t+(i<<4)|0,or[(n=f=t+(o<<4)|0)>>1]=0|or[e>>1],i=e+4|0,ar[t+(o<<4)+12>>2]=0,ar[t+(o<<4)+4>>2]=ar[i>>2],c=e+8|0,ar[t+(o<<4)+8>>2]=ar[c>>2],e=e+12|0,ar[t+(o<<4)+12>>2]=ar[e>>2],ar[e>>2]=0,ar[c>>2]=0,e=f+16|(ar[i>>2]=0),t=0|ar[A>>2],(0|(i=0|ar[r>>2]))==(0|t))i=n,f=c=t;else{for(;i=(u=i)+-16|0,or[f+-16>>1]=0|or[i>>1],c=u+-12|0,ar[(o=f+-12|0)>>2]=0,ar[(b=f+-8|0)>>2]=0,ar[f+-4>>2]=0,ar[o>>2]=ar[c>>2],o=u+-8|0,ar[b>>2]=ar[o>>2],u=u+-4|0,ar[f+-4>>2]=ar[u>>2],ar[u>>2]=0,ar[o>>2]=0,n=f=n+-16|(ar[c>>2]=0),(0|i)!=(0|t););i=n,c=0|ar[A>>2],f=0|ar[r>>2]}if(ar[A>>2]=i,ar[r>>2]=e,ar[l>>2]=a,(0|f)!=(0|(A=c))){a=f;do{if(0|(i=0|ar[(e=a+-12|0)>>2])){if((0|(f=0|ar[(o=a+-8|0)>>2]))!=(0|i)){for(;n=f+-12|0,ar[o>>2]=n,(0|(f=(t=0|ar[n>>2])?((0|ar[(f=f+-8|0)>>2])!=(0|t)&&(ar[f>>2]=t),vu(t),0|ar[o>>2]):n))!=(0|i););i=0|ar[e>>2]}vu(i)}a=a+-16|0}while((0|a)!=(0|A))}c&&vu(A)}function ue(A,e){e|=0;var r,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0;r=(A|=0)+4|0,i=0|ar[A>>2],357913941<(f=(o=((0|ar[r>>2])-i|0)/12|0)+1|0)>>>0&&zl(),i=(a=((0|ar[(c=A+8|0)>>2])-i|0)/12|0)<<1,i=a>>>0<178956970?i>>>0<f>>>0?f:i:357913941;do{if(i){if(!(357913941<i>>>0)){t=0|hu(12*i|0);break}Zu(c=0|X(8),44519),ar[c>>2]=17660,I(0|c,4016,428)}else t=0}while(0);if(n=f=t+(12*o|0)|0,a=t+(12*i|0)|0,ar[t+(12*o|0)+8>>2]=0,ar[f>>2]=ar[e>>2],i=e+4|0,ar[t+(12*o|0)+4>>2]=ar[i>>2],l=e+8|0,ar[t+(12*o|0)+8>>2]=ar[l>>2],ar[l>>2]=0,ar[i>>2]=0,o=f+12|(ar[e>>2]=0),t=0|ar[A>>2],(0|(i=0|ar[r>>2]))==(0|t))i=n,f=e=t;else{for(;i=(e=i)+-12|0,ar[(l=f+-12|0)>>2]=0,ar[(u=f+-8|0)>>2]=0,ar[f+-4>>2]=0,ar[l>>2]=ar[i>>2],l=e+-8|0,ar[u>>2]=ar[l>>2],e=e+-4|0,ar[f+-4>>2]=ar[e>>2],ar[e>>2]=0,ar[l>>2]=0,n=f=n+-12|(ar[i>>2]=0),(0|i)!=(0|t););i=n,e=0|ar[A>>2],f=0|ar[r>>2]}if(ar[A>>2]=i,ar[r>>2]=o,ar[c>>2]=a,(0|f)!=(0|(t=e)))for(;0|(n=0|ar[(f=(i=f)+-12|0)>>2])&&((0|ar[(i=i+-8|0)>>2])!=(0|n)&&(ar[i>>2]=n),vu(n)),(0|f)!=(0|t););e&&vu(e)}function be(A){var e,r=0,i=0,f=0,n=0,t=0,o=0,a=0;if(ar[(A|=0)>>2]=5464,0|(r=0|ar[(e=A+56|0)>>2])){if((0|(i=0|ar[(a=A+60|0)>>2]))!=(0|r)){for(;o=i+-64|0,ar[a>>2]=o,0|(f=0|ar[i+-12>>2])&&((0|(t=0|ar[(n=i+-8|0)>>2]))!=(0|f)&&(ar[n>>2]=t+(~((t+-4-f|0)>>>2)<<2)),vu(f)),ar[o>>2]=4264,0|(f=0|ar[i+-40>>2])&&((0|ar[(i=i+-36|0)>>2])!=(0|f)&&(ar[i>>2]=f),vu(f)),(0|(i=0|ar[a>>2]))!=(0|r););r=0|ar[e>>2]}vu(r)}if(ar[A>>2]=4404,0|(r=0|ar[(n=A+44|0)>>2])){if((0|(i=0|ar[(t=A+48|0)>>2]))!=(0|r)){for(;f=i+-8|0,ar[t>>2]=f,(0|(i=(i=0|ar[i+-4>>2])?(du(i),0|ar[t>>2]):f))!=(0|r););r=0|ar[n>>2]}vu(r)}ar[A>>2]=4264,(i=0|ar[A+24>>2])&&((0|ar[(r=A+28|0)>>2])!=(0|i)&&(ar[r>>2]=i),vu(i))}function se(A,e){e|=0;var r=0,i=0,f=0,n=0,t=0,o=0;ar[(A|=0)>>2]=4264,f=e+8|0,ar[(i=A+8|0)>>2]=ar[f>>2],ar[i+4>>2]=ar[f+4>>2],ar[i+8>>2]=ar[f+8>>2],ar[i+12>>2]=ar[f+12>>2],f=e+24|0,ar[(i=A+24|0)>>2]=0,ar[(o=A+28|0)>>2]=0,(ar[A+32>>2]=0)|(r=(0|ar[(n=e+28|0)>>2])-(0|ar[f>>2])|0)&&((0|r)<0&&zl(),t=0|hu(r),ar[o>>2]=t,ar[i>>2]=t,ar[A+32>>2]=t+r,i=0|ar[f>>2],0<(0|(r=(0|ar[n>>2])-i|0))&&(hb(0|t,0|i,0|r),ar[o>>2]=t+r)),t=0|ar[(n=e+36|0)+4>>2],ar[(o=A+36|0)>>2]=ar[n>>2],ar[o+4>>2]=t,ar[A+48>>2]=ar[e+48>>2],Ge(A+52|0,e+52|0)}function de(A,e){e|=0;var r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0;i=(A|=0)+4|0,f=0|ar[A>>2],67108863<(n=(t=(0|ar[i>>2])-f>>6)+1|0)>>>0&&zl(),f=(c=(0|ar[(l=A+8|0)>>2])-f|0)>>5,f=c>>6>>>0<33554431?f>>>0<n>>>0?n:f:67108863;do{if(f){if(!(67108863<f>>>0)){n=0|hu(f<<6);break}Zu(l=0|X(8),44519),ar[l>>2]=17660,I(0|l,4016,428)}else n=0}while(0);if(r=n+(f<<6)|0,se(t=o=n+(t<<6)|0,e),a=o+64|0,e=0|ar[A>>2],(0|(f=0|ar[i>>2]))==(0|e))f=t,n=c=e;else{for(n=o;se(n+-64|0,f=f+-64|0),t=n=t+-64|0,(0|f)!=(0|e););f=t,c=0|ar[A>>2],n=0|ar[i>>2]}if(ar[A>>2]=f,ar[i>>2]=a,ar[l>>2]=r,(0|n)!=(0|(a=c)))for(o=n;o=(e=o)+-64|0,0|(f=0|ar[e+-12>>2])&&((0|(t=0|ar[(n=e+-8|0)>>2]))!=(0|f)&&(ar[n>>2]=t+(~((t+-4-f|0)>>>2)<<2)),vu(f)),ar[o>>2]=4264,0|(n=0|ar[e+-40>>2])&&((0|ar[(f=e+-36|0)>>2])!=(0|n)&&(ar[f>>2]=n),vu(n)),(0|o)!=(0|a););c&&vu(c)}function ke(A,e){e|=0;var r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0;t=0|ar[(b=(A|=0)+4|0)>>2],r=o=0|ar[A>>2],536870911<(f=(l=t-o>>3)+1|0)>>>0&&zl(),a=(u=(0|ar[(i=A+8|0)>>2])-o|0)>>2,a=u>>3>>>0<268435455?a>>>0<f>>>0?f:a:536870911;do{if(a){if(!(536870911<a>>>0)){c=0|hu(a<<3);break}Zu(b=0|X(8),44519),ar[b>>2]=17660,I(0|b,4016,428)}else c=0}while(0);if(u=c+(a<<3)|0,ar[(f=n=c+(l<<3)|0)>>2]=ar[e>>2],a=e+4|0,ar[c+(l<<3)+4>>2]=ar[a>>2],ar[e>>2]=0,a=n+8|(ar[a>>2]=0),(0|t)!=(0|r)){for(;t=(l=t)+-8|0,ar[n+-8>>2]=ar[t>>2],l=l+-4|0,ar[n+-4>>2]=ar[l>>2],ar[t>>2]=0,f=n=f+-8|(ar[l>>2]=0),(0|t)!=(0|r););o=0|ar[A>>2]}if(ar[A>>2]=f,f=0|ar[b>>2],ar[b>>2]=a,ar[i>>2]=u,(0|f)!=(0|(t=o)))for(;n=0|ar[f+-4>>2],f=f+-8|0,0|n&&du(n),(0|f)!=(0|t););o&&vu(o)}function he(A,e){e|=0;var r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;l=0|ar[(b=(A|=0)+4|0)>>2],r=f=0|ar[A>>2],89478485<(n=(c=((t=l)-f|0)/48|0)+1|0)>>>0&&zl(),o=(u=((0|ar[(i=A+8|0)>>2])-f|0)/48|0)<<1,o=u>>>0<44739242?o>>>0<n>>>0?n:o:89478485;do{if(o){if(!(89478485<o>>>0)){a=0|hu(48*o|0);break}Zu(b=0|X(8),44519),ar[b>>2]=17660,I(0|b,4016,428)}else a=0}while(0);if(u=a+(48*o|0)|0,ar[(f=n=a+(48*c|0)|0)>>2]=ar[e>>2],o=e+4|0,ar[a+(48*c|0)+4>>2]=ar[o>>2],s=e+8|0,ar[a+(48*c|0)+8>>2]=ar[s>>2],ar[o>>2]=0,o=e+12|(ar[s>>2]=0),ar[(s=a+(48*c|0)+12|0)>>2]=ar[o>>2],ar[s+4>>2]=ar[o+4>>2],ar[s+8>>2]=ar[o+8>>2],ar[s+12>>2]=ar[o+12>>2],s=e+28|0,ar[a+(48*c|0)+28>>2]=ar[s>>2],o=e+32|0,ar[a+(48*c|0)+32>>2]=ar[o>>2],ar[s>>2]=0,a=a+(48*c|(ar[o>>2]=0))+36|0,c=e+36|0,ar[a>>2]=ar[c>>2],ar[a+4>>2]=ar[c+4>>2],ar[a+8>>2]=ar[c+8>>2],a=n+48|0,(0|t)==(0|r))o=l;else{for(;t=(l=t)+-48|0,ar[n+-48>>2]=ar[t>>2],s=l+-44|0,ar[n+-44>>2]=ar[s>>2],c=l+-40|0,ar[n+-40>>2]=ar[c>>2],ar[s>>2]=0,s=l+-36|(ar[c>>2]=0),ar[(c=n+-36|0)>>2]=ar[s>>2],ar[c+4>>2]=ar[s+4>>2],ar[c+8>>2]=ar[s+8>>2],ar[c+12>>2]=ar[s+12>>2],c=l+-20|0,ar[n+-20>>2]=ar[c>>2],s=l+-16|0,ar[n+-16>>2]=ar[s>>2],ar[c>>2]=0,l=l+-12|(ar[s>>2]=0),ar[(s=n+-12|0)>>2]=ar[l>>2],ar[s+4>>2]=ar[l+4>>2],ar[s+8>>2]=ar[l+8>>2],f=n=f+-48|0,(0|t)!=(0|r););o=0|ar[A>>2]}if(ar[A>>2]=f,n=0|ar[b>>2],ar[b>>2]=a,ar[i>>2]=u,(0|n)!=(0|(t=o)))for(;0|(f=0|ar[n+-16>>2])&&du(f),f=0|ar[n+-40>>2],n=n+-48|0,0|f&&du(f),(0|n)!=(0|t););o&&vu(o)}function we(A,e){e|=0;var r,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0;r=(A|=0)+4|0,i=0|ar[A>>2],89478485<(f=(o=((0|ar[r>>2])-i|0)/48|0)+1|0)>>>0&&zl(),i=(a=((0|ar[(c=A+8|0)>>2])-i|0)/48|0)<<1,i=a>>>0<44739242?i>>>0<f>>>0?f:i:89478485;do{if(i){if(!(89478485<i>>>0)){t=0|hu(48*i|0);break}Zu(c=0|X(8),44519),ar[c>>2]=17660,I(0|c,4016,428)}else t=0}while(0);if(a=t+(48*i|0)|0,ar[(n=f=t+(48*o|0)|0)>>2]=ar[e>>2],ar[t+(48*o|0)+4>>2]=ar[e+4>>2],i=0|ar[e+8>>2],0|(ar[t+(48*o|0)+8>>2]=i)&&bu(i),l=e+12|0,ar[(i=t+(48*o|0)+12|0)>>2]=ar[l>>2],ar[i+4>>2]=ar[l+4>>2],ar[i+8>>2]=ar[l+8>>2],ar[i+12>>2]=ar[l+12>>2],ar[t+(48*o|0)+28>>2]=ar[e+28>>2],i=0|ar[e+32>>2],0|(ar[t+(48*o|0)+32>>2]=i)&&bu(i),e=e+36|0,ar[(o=t+(48*o|0)+36|0)>>2]=ar[e>>2],ar[o+4>>2]=ar[e+4>>2],ar[o+8>>2]=ar[e+8>>2],o=f+48|0,e=0|ar[A>>2],(0|(i=0|ar[r>>2]))==(0|e))i=n,f=t=e;else{for(;i=(t=i)+-48|0,ar[f+-48>>2]=ar[i>>2],l=t+-44|0,ar[f+-44>>2]=ar[l>>2],u=t+-40|0,ar[f+-40>>2]=ar[u>>2],ar[l>>2]=0,l=t+-36|(ar[u>>2]=0),ar[(u=f+-36|0)>>2]=ar[l>>2],ar[u+4>>2]=ar[l+4>>2],ar[u+8>>2]=ar[l+8>>2],ar[u+12>>2]=ar[l+12>>2],u=t+-20|0,ar[f+-20>>2]=ar[u>>2],l=t+-16|0,ar[f+-16>>2]=ar[l>>2],ar[u>>2]=0,t=t+-12|(ar[l>>2]=0),ar[(l=f+-12|0)>>2]=ar[t>>2],ar[l+4>>2]=ar[t+4>>2],ar[l+8>>2]=ar[t+8>>2],n=f=n+-48|0,(0|i)!=(0|e););i=n,t=0|ar[A>>2],f=0|ar[r>>2]}if(ar[A>>2]=i,ar[r>>2]=o,ar[c>>2]=a,(0|f)!=(0|(n=t)))for(;0|(i=0|ar[f+-16>>2])&&du(i),i=0|ar[f+-40>>2],f=f+-48|0,0|i&&du(i),(0|f)!=(0|n););t&&vu(t)}function ve(A,e){var r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0;if((e|=0)>>>0<=(t=0|ar[(i=(A|=0)+8|0)>>2])-(f=n=0|ar[(u=A+4|0)>>2])>>3>>>0)return vb(0|n,0,e<<3|0),void(ar[u>>2]=f+(e<<3));r=l=0|ar[A>>2],536870911<(n=(a=n-l>>3)+e|0)>>>0&&zl(),o=(c=t-l|0)>>2,o=c>>3>>>0<268435455?o>>>0<n>>>0?n:o:536870911;do{if(o){if(!(536870911<o>>>0)){c=0|hu(o<<3);break}Zu(u=0|X(8),44519),ar[u>>2]=17660,I(0|u,4016,428)}else c=0}while(0);if(n=c+(a<<3)|0,c=c+(o<<3)|0,vb(0|(t=n),0,e<<3|0),a=n+(e<<3)|0,(0|f)==(0|r))o=l;else{for(;f=(l=f)+-8|0,ar[n+-8>>2]=ar[f>>2],l=l+-4|0,ar[n+-4>>2]=ar[l>>2],ar[f>>2]=0,t=n=t+-8|(ar[l>>2]=0),(0|f)!=(0|r););o=0|ar[A>>2],f=0|ar[u>>2]}if(ar[A>>2]=t,ar[u>>2]=a,ar[i>>2]=c,(0|f)!=(0|(t=o)))for(;n=0|ar[f+-4>>2],f=f+-8|0,0|n&&du(n),(0|f)!=(0|t););o&&vu(o)}function me(A,e,r,i,f,n){A|=0,r|=0,i|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p,y=0,B=0,E=0,X=0;ur=(p=ur)+128|0,u=p+108|0,b=p+115|0,Z=p+96|0,s=p+112|0,g=p+56|0,k=p+32|0,h=p+8|0,d=p,X=0|ar[(e|=0)>>2],y=0|ar[X+24>>2],B=0|ar[X+28>>2];do{if(0|Eo(X,6)){if((0|Xo(0|ar[e>>2],6))==(0|y)&&(0|Wo(0|ar[e>>2],6))==(0|B))break;return ar[A>>2]=0,ar[A+4>>2]=0,void(ur=p)}}while(0);if(0==(0|r)&3<i>>>0)return ar[A>>2]=0,ar[A+4>>2]=0,void(ur=p);if(X=0|ar[e>>2],a=0|ar[X+32>>2],c=0|ar[X+36>>2],E=0|Eo(X,6)?1:0|tl(0|ar[36+(0|ar[e>>2])>>2]),y=0|ar[e>>2],l=0|ar[y+40>>2],(X=0==(0|(m=0|ar[y+44>>2])))||(bu(m),y=0|ar[e>>2]),Io(Z,y),0|ar[8+Z>>2]||sr(34377,32248,3067,32272),t=255&(0|Vo(0|ar[e>>2],0|ar[16+(0|ar[Z>>2])>>2])),tr[s>>0]=0|tr[b>>0],tr[1+s>>0]=0|tr[1+b>>0],tr[2+s>>0]=0|tr[2+b>>0],X||bu(m),o=0|ar[f>>2],(v=0==(0|(w=0|ar[f+4>>2])))||bu(w),X||du(m),B=1<(0|function(A){var e=0;switch(0|(A|=0)){case 3:case 2:case 1:case 0:case 99:e=1;break;case 14:case 12:case 10:e=3;break;case 15:case 13:case 11:e=4;break;default:sr(55739,25597,118,25653)}return 0|e}(i))?0|tl(i):E,y=11==(1|i)?8:0==(0|n)?t:n,ar[g>>2]=0,ar[(n=4+g|0)>>2]=0,ar[8+g>>2]=0,ar[12+g>>2]=99,ar[16+g>>2]=99,tr[20+g>>0]=0,ar[24+g>>2]=8,ar[28+g>>2]=0,ar[(f=32+g|0)>>2]=0,ar[36+g>>2]=3,ar[k>>2]=a,ar[4+k>>2]=c,tr[8+k>>0]=1&E,tr[(E=9+k|0)>>0]=0|tr[b>>0],tr[E+1>>0]=0|tr[1+b>>0],tr[E+2>>0]=0|tr[2+b>>0],ar[12+k>>2]=t,ar[16+k>>2]=l,ar[20+k>>2]=m,X||bu(m),ar[h>>2]=r,ar[4+h>>2]=i,tr[8+h>>0]=1&B,tr[(r=9+h|0)>>0]=0|tr[s>>0],tr[r+1>>0]=0|tr[1+s>>0],tr[r+2>>0]=0|tr[2+s>>0],ar[12+h>>2]=12==(-4&i|0)&(0|y)<9?10:y,ar[16+h>>2]=o,ar[20+h>>2]=w,v||bu(w),ar[d>>2]=3,ar[u>>2]=ar[d>>2],y=0|function(A,e,r,i){e|=0,r|=0,i|=0;var f,n,t,o,a,c,l,u,b,s,d,k,h,w,v,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0,R=0,N=0,_=0,Y=0,Q=0,D=0,J=0,M=0,T=0,U=0,S=0,O=0,z=0,j=0,H=0,x=0,P=0,L=0,K=0,q=0,$=0,AA=0,eA=0,rA=0,iA=0,fA=0,nA=0,tA=0,oA=0,aA=0,cA=0,lA=0,uA=0,bA=0,sA=0,dA=0,kA=0,hA=0,wA=0,vA=0,mA=0;if(ur=(v=ur)+256|0,o=v+96|0,mA=v+232|0,w=v+168|0,h=v+156|0,R=v+80|0,s=v+144|0,d=v+208|0,k=v+184|0,b=v+180|0,c=(l=v)+244|0,u=v+64|0,a=v+48|0,Z=0|ar[(A|=0)>>2],(0|(m=0|ar[(wA=A+4|0)>>2]))!=(0|Z))for(;g=m+-8|0,ar[wA>>2]=g,(0|(m=(m=0|ar[m+-4>>2])?(du(m),0|ar[wA>>2]):g))!=(0|Z););if(ar[(kA=A+12|0)>>2]=ar[r>>2],ar[kA+4>>2]=ar[r+4>>2],ar[kA+8>>2]=ar[r+8>>2],ar[kA+12>>2]=ar[r+12>>2],m=0|ar[(kA=r+16|0)>>2],0|(g=0|ar[(t=r+20|0)>>2])&&bu(g),ar[A+28>>2]=m,m=0|ar[(vA=A+32|0)>>2],ar[vA>>2]=g,0|m&&du(m),ar[A+36>>2]=ar[i>>2],(0|ar[e>>2])==(0|ar[r>>2])&&(0|ar[e+4>>2])==(0|ar[r+4>>2])&&(0|tr[e+8>>0])==(0|tr[r+8>>0])&&(0|ar[e+12>>2])==(0|ar[r+12>>2]))return ur=v,0|(mA=1);ar[mA>>2]=0,ar[(vA=mA+4|0)>>2]=0,y=(ar[mA+8>>2]=0)|hu(16),ar[y+4>>2]=0,ar[y+8>>2]=0,ar[y>>2]=6932,ar[(m=y+12|0)>>2]=6492,ar[o>>2]=m,ar[(m=4+o|0)>>2]=y,y=mA+8|0,ke(mA,o),0|(m=0|ar[m>>2])&&du(m),g=0|hu(16),ar[g+4>>2]=0,ar[g+8>>2]=0,ar[g>>2]=6960,ar[(m=g+12|0)>>2]=6988,ar[o>>2]=m,ar[(Z=4+o|0)>>2]=g,(p=0|ar[vA>>2])>>>0>=(0|ar[y>>2])>>>0?(ke(mA,o),0|(m=0|ar[Z>>2])&&du(m)):(ar[p>>2]=m,ar[p+4>>2]=g,ar[o>>2]=0,ar[Z>>2]=0,ar[vA>>2]=p+8),g=0|hu(16),ar[g+4>>2]=0,ar[g+8>>2]=0,ar[g>>2]=7012,ar[(m=g+12|0)>>2]=7040,ar[o>>2]=m,ar[(Z=4+o|0)>>2]=g,(p=0|ar[vA>>2])>>>0>=(0|ar[y>>2])>>>0?(ke(mA,o),0|(m=0|ar[Z>>2])&&du(m)):(ar[p>>2]=m,ar[p+4>>2]=g,ar[o>>2]=0,ar[Z>>2]=0,ar[vA>>2]=p+8),g=0|hu(16),ar[g+4>>2]=0,ar[g+8>>2]=0,ar[g>>2]=7064,ar[(m=g+12|0)>>2]=6516,ar[o>>2]=m,ar[(Z=4+o|0)>>2]=g,(p=0|ar[vA>>2])>>>0>=(0|ar[y>>2])>>>0?(ke(mA,o),0|(m=0|ar[Z>>2])&&du(m)):(ar[p>>2]=m,ar[p+4>>2]=g,ar[o>>2]=0,ar[Z>>2]=0,ar[vA>>2]=p+8),g=0|hu(16),ar[g+4>>2]=0,ar[g+8>>2]=0,ar[g>>2]=7092,ar[(m=g+12|0)>>2]=6540,ar[o>>2]=m,ar[(Z=4+o|0)>>2]=g,(p=0|ar[vA>>2])>>>0>=(0|ar[y>>2])>>>0?(ke(mA,o),0|(m=0|ar[Z>>2])&&du(m)):(ar[p>>2]=m,ar[p+4>>2]=g,ar[o>>2]=0,ar[Z>>2]=0,ar[vA>>2]=p+8),g=0|hu(16),ar[g+4>>2]=0,ar[g+8>>2]=0,ar[g>>2]=7120,ar[(m=g+12|0)>>2]=6908,ar[o>>2]=m,ar[(Z=4+o|0)>>2]=g,(p=0|ar[vA>>2])>>>0>=(0|ar[y>>2])>>>0?(ke(mA,o),0|(m=0|ar[Z>>2])&&du(m)):(ar[p>>2]=m,ar[p+4>>2]=g,ar[o>>2]=0,ar[Z>>2]=0,ar[vA>>2]=p+8),g=0|hu(16),ar[g+4>>2]=0,ar[g+8>>2]=0,ar[g>>2]=7148,ar[(m=g+12|0)>>2]=6564,ar[o>>2]=m,ar[(Z=4+o|0)>>2]=g,(p=0|ar[vA>>2])>>>0>=(0|ar[y>>2])>>>0?(ke(mA,o),0|(m=0|ar[Z>>2])&&du(m)):(ar[p>>2]=m,ar[p+4>>2]=g,ar[o>>2]=0,ar[Z>>2]=0,ar[vA>>2]=p+8),g=0|hu(16),ar[g+4>>2]=0,ar[g+8>>2]=0,ar[g>>2]=7176,ar[(m=g+12|0)>>2]=6588,ar[o>>2]=m,ar[(Z=4+o|0)>>2]=g,(p=0|ar[vA>>2])>>>0>=(0|ar[y>>2])>>>0?(ke(mA,o),0|(m=0|ar[Z>>2])&&du(m)):(ar[p>>2]=m,ar[p+4>>2]=g,ar[o>>2]=0,ar[Z>>2]=0,ar[vA>>2]=p+8),g=0|hu(16),ar[g+4>>2]=0,ar[g+8>>2]=0,ar[g>>2]=7204,ar[(m=g+12|0)>>2]=6660,ar[o>>2]=m,ar[(Z=4+o|0)>>2]=g,(p=0|ar[vA>>2])>>>0>=(0|ar[y>>2])>>>0?(ke(mA,o),0|(m=0|ar[Z>>2])&&du(m)):(ar[p>>2]=m,ar[p+4>>2]=g,ar[o>>2]=0,ar[Z>>2]=0,ar[vA>>2]=p+8),g=0|hu(16),ar[g+4>>2]=0,ar[g+8>>2]=0,ar[g>>2]=7232,ar[(m=g+12|0)>>2]=6684,ar[o>>2]=m,ar[(Z=4+o|0)>>2]=g,(p=0|ar[vA>>2])>>>0>=(0|ar[y>>2])>>>0?(ke(mA,o),0|(m=0|ar[Z>>2])&&du(m)):(ar[p>>2]=m,ar[p+4>>2]=g,ar[o>>2]=0,ar[Z>>2]=0,ar[vA>>2]=p+8),g=0|hu(16),ar[g+4>>2]=0,ar[g+8>>2]=0,ar[g>>2]=7260,ar[(m=g+12|0)>>2]=6636,ar[o>>2]=m,ar[(Z=4+o|0)>>2]=g,(p=0|ar[vA>>2])>>>0>=(0|ar[y>>2])>>>0?(ke(mA,o),0|(m=0|ar[Z>>2])&&du(m)):(ar[p>>2]=m,ar[p+4>>2]=g,ar[o>>2]=0,ar[Z>>2]=0,ar[vA>>2]=p+8),g=0|hu(16),ar[g+4>>2]=0,ar[g+8>>2]=0,ar[g>>2]=7288,ar[(m=g+12|0)>>2]=6612,ar[o>>2]=m,ar[(Z=4+o|0)>>2]=g,(p=0|ar[vA>>2])>>>0>=(0|ar[y>>2])>>>0?(ke(mA,o),0|(m=0|ar[Z>>2])&&du(m)):(ar[p>>2]=m,ar[p+4>>2]=g,ar[o>>2]=0,ar[Z>>2]=0,ar[vA>>2]=p+8),g=0|hu(16),ar[g+4>>2]=0,ar[g+8>>2]=0,ar[g>>2]=7316,ar[(m=g+12|0)>>2]=6708,ar[o>>2]=m,ar[(Z=4+o|0)>>2]=g,(p=0|ar[vA>>2])>>>0>=(0|ar[y>>2])>>>0?(ke(mA,o),0|(m=0|ar[Z>>2])&&du(m)):(ar[p>>2]=m,ar[p+4>>2]=g,ar[o>>2]=0,ar[Z>>2]=0,ar[vA>>2]=p+8),g=0|hu(16),ar[g+4>>2]=0,ar[g+8>>2]=0,ar[g>>2]=7344,ar[(m=g+12|0)>>2]=6732,ar[o>>2]=m,ar[(Z=4+o|0)>>2]=g,(p=0|ar[vA>>2])>>>0>=(0|ar[y>>2])>>>0?(ke(mA,o),0|(m=0|ar[Z>>2])&&du(m)):(ar[p>>2]=m,ar[p+4>>2]=g,ar[o>>2]=0,ar[Z>>2]=0,ar[vA>>2]=p+8),g=0|hu(16),ar[g+4>>2]=0,ar[g+8>>2]=0,ar[g>>2]=7372,ar[(m=g+12|0)>>2]=7400,ar[o>>2]=m,ar[(Z=4+o|0)>>2]=g,p=0|ar[vA>>2];do{if(p>>>0<(0|ar[y>>2])>>>0)ar[p>>2]=m,ar[p+4>>2]=g,ar[o>>2]=0,ar[Z>>2]=0,ar[vA>>2]=p+8;else{if(ke(mA,o),!(m=0|ar[Z>>2]))break;du(m)}}while(0);g=0|hu(16),ar[g+4>>2]=0,ar[g+8>>2]=0,ar[g>>2]=7424,ar[(m=g+12|0)>>2]=7452,ar[o>>2]=m,ar[(Z=4+o|0)>>2]=g,p=0|ar[vA>>2];do{if(p>>>0<(0|ar[y>>2])>>>0)ar[p>>2]=m,ar[p+4>>2]=g,ar[o>>2]=0,ar[Z>>2]=0,ar[vA>>2]=p+8;else{if(ke(mA,o),!(m=0|ar[Z>>2]))break;du(m)}}while(0);g=0|hu(16),ar[g+4>>2]=0,ar[g+8>>2]=0,ar[g>>2]=7476,ar[(m=g+12|0)>>2]=6756,ar[o>>2]=m,ar[(Z=4+o|0)>>2]=g,p=0|ar[vA>>2];do{if(p>>>0<(0|ar[y>>2])>>>0)ar[p>>2]=m,ar[p+4>>2]=g,ar[o>>2]=0,ar[Z>>2]=0,ar[vA>>2]=p+8;else{if(ke(mA,o),!(m=0|ar[Z>>2]))break;du(m)}}while(0);g=0|hu(16),ar[g+4>>2]=0,ar[g+8>>2]=0,ar[g>>2]=7504,ar[(m=g+12|0)>>2]=6780,ar[o>>2]=m,ar[(Z=4+o|0)>>2]=g,p=0|ar[vA>>2];do{if(p>>>0<(0|ar[y>>2])>>>0)ar[p>>2]=m,ar[p+4>>2]=g,ar[o>>2]=0,ar[Z>>2]=0,ar[vA>>2]=p+8;else{if(ke(mA,o),!(m=0|ar[Z>>2]))break;du(m)}}while(0);g=0|hu(16),ar[g+4>>2]=0,ar[g+8>>2]=0,ar[g>>2]=7532,ar[(m=g+12|0)>>2]=6832,ar[o>>2]=m,ar[(Z=4+o|0)>>2]=g,p=0|ar[vA>>2];do{if(p>>>0<(0|ar[y>>2])>>>0)ar[p>>2]=m,ar[p+4>>2]=g,ar[o>>2]=0,ar[Z>>2]=0,ar[vA>>2]=p+8;else{if(ke(mA,o),!(m=0|ar[Z>>2]))break;du(m)}}while(0);g=0|hu(16),ar[g+4>>2]=0,ar[g+8>>2]=0,ar[g>>2]=7560,ar[(m=g+12|0)>>2]=6884,ar[o>>2]=m,ar[(Z=4+o|0)>>2]=g,p=0|ar[vA>>2];do{if(p>>>0<(0|ar[y>>2])>>>0)ar[p>>2]=m,ar[p+4>>2]=g,ar[o>>2]=0,ar[Z>>2]=0,ar[vA>>2]=p+8;else{if(ke(mA,o),!(m=0|ar[Z>>2]))break;du(m)}}while(0);ar[w>>2]=0,ar[(n=4+w|0)>>2]=0,ar[8+w>>2]=0,ar[h>>2]=0,ar[(f=4+h|0)>>2]=0,ar[8+h>>2]=0,ar[R>>2]=ar[e>>2],ar[R+4>>2]=ar[e+4>>2],ar[R+8>>2]=ar[e+8>>2],ar[R+12>>2]=ar[e+12>>2],p=0|ar[e+16>>2],(I=0==(0|(W=0|ar[e+20>>2])))||bu(W),B=4+o|0,X=8+o|0,E=12+o|0,ar[(e=28+o|0)>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[e+16>>2]=0,ar[o>>2]=-1,ar[B>>2]=0,ar[X>>2]=0,ar[E>>2]=ar[R>>2],ar[E+4>>2]=ar[R+4>>2],ar[E+8>>2]=ar[R+8>>2],ar[E+12>>2]=ar[R+12>>2],e=28+o|0,g=W;do{if(I)dA=32+o|0,ar[e>>2]=p,ar[dA>>2]=g,y=e,g=p=dA;else{if(bu(W),m=0|ar[(Z=32+o|0)>>2],ar[e>>2]=p,ar[Z>>2]=g,!m){y=e,g=p=Z;break}du(m),y=e,g=p=Z}}while(0);gA[36+o>>2]=0,gA[40+o>>2]=0,m=(gA[44+o>>2]=0)|ar[f>>2],dA=8+h|0;do{if(m>>>0<(0|ar[dA>>2])>>>0)ar[m>>2]=ar[o>>2],ar[m+4>>2]=ar[B>>2],ar[m+8>>2]=ar[X>>2],ar[B>>2]=0,ar[X>>2]=0,ar[(sA=m+12|0)>>2]=ar[E>>2],ar[sA+4>>2]=ar[E+4>>2],ar[sA+8>>2]=ar[E+8>>2],ar[sA+12>>2]=ar[E+12>>2],ar[m+28>>2]=ar[y>>2],ar[m+32>>2]=ar[g>>2],ar[e>>2]=0,bA=36+o|(ar[p>>2]=0),ar[(sA=m+36|0)>>2]=ar[bA>>2],ar[sA+4>>2]=ar[bA+4>>2],ar[sA+8>>2]=ar[bA+8>>2],ar[f>>2]=m+48;else{if(he(h,o),!(m=0|ar[p>>2]))break;du(m)}}while(0);0|(m=0|ar[X>>2])&&du(m),I||du(W),m=0|ar[h>>2],g=0|ar[f>>2];A:do{if((0|m)==(0|g))p=0;else{P=8+w|0,L=r+4|0,K=r+8|0,q=r+12|0,$=16+d|0,AA=20+d|0,eA=16+k|0,rA=20+k|0,iA=4+s|0,fA=l+4|0,nA=l+8|0,tA=l+12|0,oA=l+16|0,aA=l+20|0,cA=l+24|0,uA=lA=l+28|0,bA=l+32|0,H=l+40|0,x=l+44|0,sA=j=l+36|0,C=0;e:for(;;){if((0|g)==(0|m))g=-1;else for(p=(g-m|0)/48|0,g=-1,Z=0;C=(z=0==(0|Z)|(F=.30000001192092896*gA[m+(48*Z|0)+36>>2]+.6000000238418579*gA[m+(48*Z|0)+40>>2]+.10000000149011612*gA[m+(48*Z|0)+44>>2])<C)?F:C,g=z?Z:g,(Z=Z+1|0)>>>0<p>>>0;);for(Z=m+(48*g|0)|0,(0|(p=0|ar[n>>2]))==(0|ar[P>>2])?we(w,Z):(ar[p>>2]=ar[Z>>2],ar[p+4>>2]=ar[m+(48*g|0)+4>>2],Z=0|ar[m+(48*g|0)+8>>2],0|(ar[p+8>>2]=Z)&&bu(Z),z=m+(48*g|0)+12|0,ar[(Z=p+12|0)>>2]=ar[z>>2],ar[Z+4>>2]=ar[z+4>>2],ar[Z+8>>2]=ar[z+8>>2],ar[Z+12>>2]=ar[z+12>>2],ar[p+28>>2]=ar[m+(48*g|0)+28>>2],Z=0|ar[m+(48*g|0)+32>>2],0|(ar[p+32>>2]=Z)&&bu(Z),O=m+(48*g|0)+36|0,ar[(z=p+36|0)>>2]=ar[O>>2],ar[z+4>>2]=ar[O+4>>2],ar[z+8>>2]=ar[O+8>>2],ar[n>>2]=48+(0|ar[n>>2])),p=0|ar[f>>2],y=0|ar[h>>2],ar[y+(48*g|0)>>2]=ar[p+-48>>2],m=0|ar[p+-44>>2],0|(Z=0|ar[p+-40>>2])&&bu(Z),ar[y+(48*g|0)+4>>2]=m,m=0|ar[(z=y+(48*g|0)+8|0)>>2],ar[z>>2]=Z,0|m&&du(m),Z=p+-36|0,ar[(m=y+(48*g|0)+12|0)>>2]=ar[Z>>2],ar[m+4>>2]=ar[Z+4>>2],ar[m+8>>2]=ar[Z+8>>2],ar[m+12>>2]=ar[Z+12>>2],m=0|ar[p+-20>>2],0|(Z=0|ar[p+-16>>2])&&bu(Z),ar[y+(48*g|0)+28>>2]=m,m=0|ar[(z=y+(48*g|0)+32|0)>>2],ar[z>>2]=Z,0|m&&du(m),m=y+(48*g|0)+36|0,g=p+-12|0,ar[m>>2]=ar[g>>2],ar[m+4>>2]=ar[g+4>>2],ar[m+8>>2]=ar[g+8>>2],g=(m=0|ar[f>>2])+-48|0;ar[f>>2]=m+-48,0|(Z=0|ar[m+-16>>2])&&du(Z),0|(m=0|ar[m+-40>>2])&&du(m),(0|(m=0|ar[f>>2]))!=(0|g););Z=0|ar[n>>2];do{if((0|ar[Z+-36>>2])==(0|ar[r>>2])){if((0|ar[Z+-32>>2])!=(0|ar[L>>2]))break;if((0|tr[Z+-28>>0])!=(0|tr[K>>0]))break;if((0|ar[Z+-24>>2])==(0|ar[q>>2]))break e}}while(0);if((0|(m=0|ar[mA>>2]))!=(0|(z=0|ar[vA>>2]))){for(;;){if(p=0|ar[m>>2],y=0|ar[8+(0|ar[p>>2])>>2],g=Z+-36|0,ar[d>>2]=ar[g>>2],ar[4+d>>2]=ar[g+4>>2],ar[8+d>>2]=ar[g+8>>2],ar[12+d>>2]=ar[g+12>>2],ar[$>>2]=ar[Z+-20>>2],g=0|ar[Z+-16>>2],0|(ar[AA>>2]=g)&&bu(g),ar[k>>2]=ar[r>>2],ar[4+k>>2]=ar[r+4>>2],ar[8+k>>2]=ar[r+8>>2],ar[12+k>>2]=ar[r+12>>2],ar[eA>>2]=ar[kA>>2],g=0|ar[t>>2],0|(ar[rA>>2]=g)&&bu(g),ar[b>>2]=ar[i>>2],ar[o>>2]=ar[b>>2],os[63&y](s,p,d,k,o),0|(g=0|ar[rA>>2])&&du(g),0|(g=0|ar[AA>>2])&&du(g),(0|(g=0|ar[s>>2]))!=(0|(S=0|ar[iA>>2]))){O=m+4|0;do{if((0|(y=p=0|ar[w>>2]))!=(0|(U=W=0|ar[n>>2]))){e=0|ar[g>>2],B=g+4|0,E=g+8|0,X=g+12|0,Z=0;r:do{do{if((0|ar[p+12>>2])==(0|e)){if((0|ar[p+16>>2])!=(0|ar[B>>2]))break;if((0|tr[p+20>>0])!=(0|tr[E>>0]))break;if(Z|=T=(0|ar[p+24>>2])==(0|ar[X>>2]),T)break r}}while(0);p=p+48|0}while((0|p)!=(0|W));Z||(hA=182)}else hA=182;r:do{if(182==(0|hA)){Z=(hA=0)|ar[h>>2],p=0|ar[f>>2];i:do{if((0|Z)!=(0|p)){T=0|ar[g>>2],e=g+4|0,B=g+8|0,E=g+12|0;f:for(;;){N=Z+12|0;do{if((0|ar[N>>2])==(0|T)){if((0|(Y=0|ar[(_=Z+16|0)>>2]))!=(0|ar[e>>2]))break;if((D=0|tr[(Q=Z+20|0)>>0])<<24>>24!=(0|tr[B>>0]))break;if((0|(M=0|ar[(J=Z+24|0)>>2]))==(0|ar[E>>2]))break f}}while(0);if((0|(Z=Z+48|0))==(0|p))break i}if(V=+gA[(p=g+24|0)>>2]+ +gA[W+-12>>2],F=+gA[g+28>>2]+ +gA[W+-8>>2],G=+gA[g+32>>2]+ +gA[W+-4>>2],X=Z+40|0,W=Z+44|0,!(.30000001192092896*gA[(E=Z+36|0)>>2]+.6000000238418579*gA[X>>2]+.10000000149011612*gA[W>>2]>.30000001192092896*V+.6000000238418579*F+.10000000149011612*G))break r;B=g+9|0,tr[c>>0]=0|tr[B>>0],tr[1+c>>0]=0|tr[B+1>>0],tr[2+c>>0]=0|tr[B+2>>0],B=0|ar[g+16>>2],(R=0==(0|(I=0|ar[g+20>>2])))||bu(I),ar[u>>2]=ar[p>>2],ar[4+u>>2]=ar[p+4>>2],ar[8+u>>2]=ar[p+8>>2],ar[l>>2]=0,ar[l+4>>2]=0,p=(ar[l+8>>2]=0)|ar[m>>2],0|(e=0|ar[O>>2])&&bu(e),tr[o>>0]=0|tr[c>>0],tr[1+o>>0]=0|tr[1+c>>0],tr[2+o>>0]=0|tr[2+c>>0],R||bu(I),ar[l>>2]=ar[u>>2],ar[l+4>>2]=ar[4+u>>2],ar[l+8>>2]=ar[8+u>>2],ar[Z>>2]=((U-y|0)/48|0)-1,ar[Z+4>>2]=p,p=0|ar[(U=Z+8|0)>>2],ar[U>>2]=e,0|p&&du(p),ar[N>>2]=T,ar[_>>2]=Y,tr[Q>>0]=D,tr[(U=Z+21|0)>>0]=0|tr[o>>0],tr[U+1>>0]=0|tr[1+o>>0],tr[U+2>>0]=0|tr[2+o>>0],ar[J>>2]=M,ar[Z+28>>2]=B,p=0|ar[(U=Z+32|0)>>2],ar[U>>2]=I,0|p&&du(p),ar[E>>2]=ar[l>>2],ar[E+4>>2]=ar[l+4>>2],ar[E+8>>2]=ar[l+8>>2],R||du(I),gA[Z+36>>2]=V,gA[X>>2]=F,gA[W>>2]=G;break r}}while(0);ar[o>>2]=ar[g>>2],ar[4+o>>2]=ar[g+4>>2],ar[8+o>>2]=ar[g+8>>2],ar[12+o>>2]=ar[g+12>>2],e=0|ar[g+16>>2],(E=0==(0|(B=0|ar[g+20>>2])))?(p=W,Z=U):(bu(B),p=Z=0|ar[n>>2],y=0|ar[w>>2]),V=+gA[g+24>>2]+ +gA[p+-12>>2],F=+gA[g+28>>2]+ +gA[p+-8>>2],G=+gA[g+32>>2]+ +gA[p+-4>>2],ar[a>>2]=ar[o>>2],ar[4+a>>2]=ar[4+o>>2],ar[8+a>>2]=ar[8+o>>2],ar[12+a>>2]=ar[12+o>>2],E||bu(B),ar[fA>>2]=0,ar[nA>>2]=0,ar[tA>>2]=99,ar[oA>>2]=99,tr[aA>>0]=0,ar[cA>>2]=8,ar[lA>>2]=0,ar[lA+4>>2]=0,ar[lA+8>>2]=0,ar[lA+12>>2]=0,ar[lA+16>>2]=0,ar[l>>2]=((Z-y|0)/48|0)-1,p=0|ar[m>>2],y=Z=0|ar[O>>2];do{if(Z){if(bu(Z),Z=0|ar[nA>>2],ar[fA>>2]=p,ar[nA>>2]=y,!Z)break;du(Z)}else ar[fA>>2]=p,ar[nA>>2]=y}while(0);ar[tA>>2]=ar[a>>2],ar[tA+4>>2]=ar[4+a>>2],ar[tA+8>>2]=ar[8+a>>2],ar[tA+12>>2]=ar[12+a>>2],E||bu(B),ar[uA>>2]=e,Z=0|ar[bA>>2],ar[bA>>2]=B,0|Z&&du(Z),gA[j>>2]=V,gA[H>>2]=F,gA[x>>2]=G,Z=0|ar[f>>2];do{if(Z>>>0<(0|ar[dA>>2])>>>0)ar[Z>>2]=ar[l>>2],ar[Z+4>>2]=ar[fA>>2],ar[Z+8>>2]=ar[nA>>2],ar[fA>>2]=0,ar[nA>>2]=0,ar[(U=Z+12|0)>>2]=ar[tA>>2],ar[U+4>>2]=ar[tA+4>>2],ar[U+8>>2]=ar[tA+8>>2],ar[U+12>>2]=ar[tA+12>>2],ar[Z+28>>2]=ar[uA>>2],ar[Z+32>>2]=ar[bA>>2],ar[uA>>2]=0,ar[bA>>2]=0,ar[(U=Z+36|0)>>2]=ar[sA>>2],ar[U+4>>2]=ar[sA+4>>2],ar[U+8>>2]=ar[sA+8>>2],ar[f>>2]=Z+48;else{if(he(h,l),!(Z=0|ar[bA>>2]))break;du(Z)}}while(0);0|(Z=0|ar[nA>>2])&&du(Z),E||(du(B),du(B))}}while(0);g=g+36|0}while((0|g)!=(0|S));g=0|ar[s>>2]}if(0|g){if((0|(Z=0|ar[iA>>2]))!=(0|g)){for(;p=Z+-36|0,ar[iA>>2]=p,(0|(Z=(Z=0|ar[Z+-16>>2])?(du(Z),0|ar[iA>>2]):p))!=(0|g););g=0|ar[s>>2]}vu(g)}if((0|(m=m+8|0))==(0|z))break;Z=0|ar[n>>2]}g=0|ar[f>>2]}if((0|(m=0|ar[h>>2]))==(0|g)){p=0;break A}}if(m=((Z-(hA=0|ar[w>>2])|0)/48|0)-1|0,Z=hA,m)for(g=0;g=g+1|0,0!=(0|(m=0|ar[Z+(48*m|0)>>2])););else g=0;m=(p=0|ar[wA>>2])-(Z=0|ar[A>>2])>>3;do{if(m>>>0<g>>>0)ve(A,g-m|0);else{if(m>>>0<=g>>>0)break;if((0|p)==(0|(y=Z+(g<<3)|0)))break;for(Z=p;m=Z+-8|0,ar[wA>>2]=m,(Z=0|ar[Z+-4>>2])&&(du(Z),m=0|ar[wA>>2]),(0|m)!=(0|y);)Z=m}}while(0);if(Z=0|ar[w>>2],0|(m=(((0|ar[n>>2])-Z|0)/48|0)-1|0))for(B=g+-1|0,e=0;g=B-e|0,p=0|ar[A>>2],y=0|ar[Z+(48*m|0)+4>>2],0|(Z=0|ar[Z+(48*m|0)+8>>2])&&bu(Z),ar[p+(g<<3)>>2]=y,g=0|ar[(wA=p+(g<<3)+4|0)>>2],ar[wA>>2]=Z,0|g&&du(g),Z=0|ar[w>>2],m=0|ar[Z+(48*m|0)>>2];)e=e+1|0;p=1,m=0|ar[h>>2]}}while(0);if(0|m){if((0|(g=0|ar[f>>2]))!=(0|m)){for(;ar[f>>2]=g+-48,0|(Z=0|ar[g+-16>>2])&&du(Z),0|(g=0|ar[g+-40>>2])&&du(g),(0|(g=0|ar[f>>2]))!=(0|m););m=0|ar[h>>2]}vu(m)}if(0|(m=0|ar[w>>2])){if((0|(g=0|ar[n>>2]))!=(0|m)){for(;ar[n>>2]=g+-48,0|(Z=0|ar[g+-16>>2])&&du(Z),0|(g=0|ar[g+-40>>2])&&du(g),(0|(g=0|ar[n>>2]))!=(0|m););m=0|ar[w>>2]}vu(m)}if(0|(m=0|ar[mA>>2])){if((0|(g=0|ar[vA>>2]))!=(0|m)){for(;Z=g+-8|0,ar[vA>>2]=Z,(0|(g=(g=0|ar[g+-4>>2])?(du(g),0|ar[vA>>2]):Z))!=(0|m););m=0|ar[mA>>2]}vu(m)}return ur=v,0|(mA=p)}(g,k,h,u),v||du(w),X||du(m),y?function(A,e,r){A|=0,e|=0;var i,f,n,t,o,a,c,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0;ur=(c=ur)+64|0,f=c+48|0,n=c+40|0,t=c+32|0,o=c+8|0,a=c,l=0|ar[(r|=0)>>2],0|(r=u=0|ar[r+4>>2])&&(bu(u),bu(u)),u=0|ar[e>>2],i=0|ar[e+4>>2];A:do{if((0|u)!=(0|i)){for(g=4+t|0,Z=e+12|0,p=16+o|0,y=e+28|0,B=20+o|0,E=e+32|0,v=e+36|0,m=4+n|0,d=l;l=0|ar[u>>2],e=0|ar[12+(0|ar[l>>2])>>2],ar[t>>2]=d,h=r,ar[g>>2]=h,(w=0==(0|r))||bu(h),ar[o>>2]=ar[Z>>2],ar[4+o>>2]=ar[Z+4>>2],ar[8+o>>2]=ar[Z+8>>2],ar[12+o>>2]=ar[Z+12>>2],ar[p>>2]=ar[y>>2],b=0|ar[E>>2],0|(ar[B>>2]=b)&&bu(b),ar[a>>2]=ar[v>>2],ar[f>>2]=ar[a>>2],os[63&e](n,l,t,o,f),l=0|ar[n>>2],k=0|ar[m>>2],ar[n>>2]=0,ar[m>>2]=0,!w&&(du(h),0|(X=0|ar[m>>2]))&&du(X),0|(e=0|ar[B>>2])&&du(e),0|(e=0|ar[g>>2])&&du(e),s=l;){if(r=0|ar[y>>2],(b=0==(0|(e=0|ar[E>>2])))||(bu(e),bu(e)),ar[s+40>>2]=r,r=0|ar[(I=s+44|0)>>2],ar[I>>2]=e,0|r&&du(r),b||du(e),r=0|ar[(e=d)+48>>2],(b=0==(0|(e=0|ar[e+52>>2])))||(bu(e),bu(e)),ar[s+48>>2]=r,r=0|ar[(I=s+52|0)>>2],ar[I>>2]=e,0|r&&du(r),b||du(e),0|k&&bu(k),w||du(h),(0|(u=u+8|0))==(0|i)){r=k,W=34;break A}d=l,r=k}ar[A>>2]=0,ar[A+4>>2]=0,k&&du(k)}else W=34}while(0);34==(0|W)&&(ar[A>>2]=l,ar[A+4>>2]=r),ur=(r&&du(r),c)}(A,g,e):(ar[A>>2]=0,ar[A+4>>2]=0),0|(y=0|ar[f>>2])&&du(y),0|(y=0|ar[g>>2])){if((0|(B=0|ar[n>>2]))!=(0|y)){for(;f=B+-8|0,ar[n>>2]=f,(0|(B=(B=0|ar[B+-4>>2])?(du(B),0|ar[n>>2]):f))!=(0|y););y=0|ar[g>>2]}vu(y)}v||du(w),Co(Z,0|ar[4+Z>>2]),X||du(m),ur=p}function ge(A,e,r){e|=0,r|=0;var i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0;switch(gA[(A|=0)>>2]=0,gA[(i=A+4|0)>>2]=0,e<<16>>16){case 13:case 12:switch(r<<16>>16){case 1:f=.30000001192092896,n=.6000000238418579,t=.15000000596046448,o=.05999999865889549,a=.6399999856948853,c=.33000001311302185,l=.3127000033855438,u=.32899999618530273;break;case 4:f=.20999999344348907,n=.7099999785423279,t=.14000000059604645,o=.07999999821186066,a=.6700000166893005,c=.33000001311302185,l=.3100000023841858,u=.3160000145435333;break;case 5:f=.28999999165534973,n=.6000000238418579,t=.15000000596046448,o=.05999999865889549,a=.6399999856948853,c=.33000001311302185,l=.3127000033855438,u=.32899999618530273;break;case 7:case 6:f=.3100000023841858,n=.5950000286102295,t=.1550000011920929,o=.07000000029802322,a=.6299999952316284,c=.3400000035762787,l=.3127000033855438,u=.32899999618530273;break;case 8:f=.24300000071525574,n=.6919999718666077,t=.14499999582767487,o=.04899999871850014,a=.6809999942779541,c=.3190000057220459,l=.3100000023841858,u=.3160000145435333;break;case 9:f=.17000000178813934,n=.796999990940094,t=.13099999725818634,o=.04600000008940697,a=.7080000042915344,c=.2919999957084656,l=.3127000033855438,u=.32899999618530273;break;case 10:a=n=1,c=o=t=f=0,l=.33333298563957214,u=.3333300054073334;break;case 11:f=.26499998569488525,n=.6899999976158142,t=.15000000596046448,o=.05999999865889549,a=.6800000071525574,c=.3199999928474426,l=.3140000104904175,u=.35100001096725464;break;case 12:f=.26499998569488525,n=.6899999976158142,t=.15000000596046448,o=.05999999865889549,a=.6800000071525574,c=.3199999928474426,l=.3127000033855438,u=.32899999618530273;break;case 22:f=.29499998688697815,n=.6050000190734863,t=.1550000011920929,o=.07699999958276749,a=.6299999952316284,c=.3400000035762787,l=.3127000033855438,u=.32899999618530273;break;default:u=l=c=a=o=t=n=f=0}h=1-(u+l),b=u*(t*(k=c*(s=1-(n+f))-(d=1-(c+a))*n)+(f*(o*d-c*(w=1-(o+t)))+a*(v=n*w-o*s))),gA[A>>2]=c*(h*(o*f-t*n)+(l*v+u*(t*s-f*w)))/b,f=o*(h*(a*n-c*f)+(l*k+u*(d*f-a*s)))/b;break;case 1:gA[A>>2]=.2125999927520752,f=.0722000002861023;break;case 4:gA[A>>2]=.30000001192092896,f=.10999999940395355;break;case 6:case 5:gA[A>>2]=.29899999499320984,f=.11400000005960464;break;case 7:gA[A>>2]=.21199999749660492,f=.08699999749660492;break;case 10:case 9:gA[A>>2]=.26269999146461487,f=.059300001710653305;break;default:return}gA[i>>2]=f}function Ze(A){tr[(A|=0)>>0]=1,gA[A+4>>2]=1.4019999504089355,gA[A+8>>2]=-.34413599967956543,gA[A+12>>2]=-.714136004447937,gA[A+16>>2]=1.7719999551773071}function pe(A,e,r){e|=0,r|=0;var i,f,n,t,o=0,a=0,c=0,l=0,u=0;ur=(n=ur)+16|0,t=n,tr[(A|=0)>>0]=0,ar[(i=A+4|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ge(t,e,r),f=+gA[t+4>>2],o=+gA[t>>2],tr[A>>0]=1,o=0!=f|0!=o?(a=1-o,gA[i>>2]=2*a,c=2*(u=1-f),a=2*o*a/(l=o+f+-1),2*f*u/l):(gA[i>>2]=1.4019999504089355,c=1.7719999551773071,a=-.714136004447937,-.34413599967956543),gA[A+8>>2]=o,gA[A+12>>2]=a,gA[A+16>>2]=c,ur=n}function ye(A,e,r){e|=0,r|=0;var i,f,n,t,o=0,a=0,c=0,l=0,u=0,b=0,s=0;for(ur=(t=ur)+16|0,f=t,i=(c=n=(A|=0)+4|(tr[A>>0]=0))+36|0;(0|(c=c+4|(ar[c>>2]=0)))<(0|i););ge(f,e,r),o=+gA[f+4>>2],a=+gA[f>>2],tr[A>>0]=1,0!=o|0!=a?(b=(u=1-(gA[n>>2]=a))-o,l=-o/u*.5,u=(b=-(gA[A+8>>2]=b))/u*.5,b=b/(s=1-o)*.5,a=-a/s*.5):(gA[n>>2]=.29899999499320984,gA[A+8>>2]=.5870000123977661,l=-.08131200075149536,u=-.41868799924850464,b=-.3312639892101288,a=-.16873499751091003,o=.11400000005960464),gA[A+12>>2]=o,gA[A+16>>2]=a,gA[A+20>>2]=b,gA[A+24>>2]=.5,gA[A+28>>2]=.5,gA[A+32>>2]=u,gA[A+36>>2]=l,ur=t}function Be(A){tr[(A|=0)>>0]=1,gA[A+4>>2]=.29899999499320984,gA[A+8>>2]=.5870000123977661,gA[A+12>>2]=.11400000005960464,gA[A+16>>2]=-.16873499751091003,gA[A+20>>2]=-.3312639892101288,gA[A+24>>2]=.5,gA[A+28>>2]=.5,gA[A+32>>2]=-.41868799924850464,gA[A+36>>2]=-.08131200075149536}function Ee(A,e){return 0|function(A,e){e|=0;var r,i,f,n,t,o=0,a=0,c=0;ur=(t=ur)+16|0,n=t,a=548+(A|=0)|0,i=0==(0|ar[(r=A+580|0)>>2]),f=0|tr[a>>0];do{if(i){if(f<<24>>24==0&&0==(0|tr[A+549>>0])){c=8;break}if((0|ar[A+377216>>2])==(0|ar[A+377220>>2]))return ra(A+376148|0),ur=(e&&(ar[e>>2]=ar[A+376200>>2]),t),(c=0)|c;c=7}else c=7}while(0);7==(0|c)&&f<<24>>24==0&&(c=8);if(8==(0|c)&&!(0!=(0|tr[A+549>>0])|1^i))return ur=(e&&(ar[e>>2]=1),t),0|(c=13);if(!(0|Lo(A+376148|0,0)))return ur=(e&&(ar[e>>2]=1),t),0|(c=9);tr[n>>0]=0;do{if(0|ar[r>>2]){if(a=0|ya(a)){o=0|Uo(A,a),tr[n>>0]=1,c=23;break}sr(35126,34700,1314,35130)}else{if(0|tr[A+549>>0]&&(0|ar[A+377216>>2])==(0|ar[A+377220>>2])){if(!e){o=13;break}ar[e>>2]=1,o=13;break}o=0|Yo(A,n),c=23}}while(0);23==(0|c)&&e&&(ar[e>>2]=0==(0|o)&0!=(1&tr[n>>0])&1);return ur=t,0|(c=o)}(A|=0,e|=0)}function Ve(A,e,r,i,f,n){return 0|function(A,e,r,i,f,n){e|=0,r|=0,i|=0,f|=0,n|=0;var t,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0;ur=(t=ur)+16|0,d=t,0|ar[8+(A|=0)>>2]&&sr(36856,36882,375,36896);tr[A+1>>0]=0,k=0|function(A,e){e|=0;var r,i,f,n,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;if(ur=(n=ur)+16|0,i=n,f=40+(A|=0)|0,(0|(t=0|ar[(s=A+44|0)>>2]))==(0|ar[f>>2])){for(t=0|hu(48),tr[t>>0]=0,tr[t+1>>0]=0,tr[t+2>>0]=0,ar[(a=t+32|0)>>2]=0,ar[(o=t+36|0)>>2]=0,ar[(l=t+40|0)>>2]=0,c=0|hu(64),ar[a>>2]=c,a=c+64|0,ar[l>>2]=a,l=c+64|0;((ar[c>>2]=0)|(c=c+4|0))<(0|l););ar[o>>2]=a,ar[(b=t+8|0)>>2]=0,ar[b+4>>2]=0,ar[b+8>>2]=0,ar[b+12>>2]=0,ar[b+16>>2]=0,ar[b+20>>2]=0,b=t}else b=0|ar[(u=t+-4|0)>>2],ar[s>>2]=u;tr[b>>0]=0,tr[b+1>>0]=0,tr[b+2>>0]=0,ar[(l=b+8|0)>>2]=0,ar[l+4>>2]=0,ar[b+16>>2]=0,ar[(l=b+24|0)>>2]=0,t=0|ar[(r=b+32|0)>>2],(0|(o=0|ar[(u=b+36|0)>>2]))!=(0|t)&&(ar[u>>2]=o+(~((o+-4-t|0)>>>2)<<2));if((0|ar[(a=b+28|0)>>2])>=(0|e))return ur=n,0|(s=b);if(0|(c=0|yc(e)))return 0|(o=0|ar[(t=b+20|0)>>2])&&(hb(0|c,0|o,0|ar[l>>2]),Bc(o)),ar[t>>2]=c,ar[a>>2]=e,ur=n,0|(s=b);ar[i>>2]=b,t=b,o=0|ar[s>>2];do{if(o-(0|ar[f>>2])>>2>>>0<16){if((0|o)==(0|ar[A+48>>2])){pa(f,i);break}ar[o>>2]=t,ar[s>>2]=4+(0|ar[s>>2]);break}Bc(0|ar[b+20>>2]),0|(t=0|ar[r>>2])&&((0|(o=0|ar[u>>2]))!=(0|t)&&(ar[u>>2]=o+(~((o+-4-t|0)>>>2)<<2)),vu(t)),vu(b)}while(0);return ur=n,(s=0)|s}(A,r);A:do{if(k){a=k+28|0;do{if((0|ar[a>>2])<(0|r)){if(0|(o=0|yc(r))){0|(l=0|ar[(c=k+20|0)>>2])&&(hb(0|o,0|l,0|ar[k+24>>2]),Bc(l)),ar[c>>2]=o,ar[a>>2]=r;break}if(ar[d>>2]=k,o=k,a=A+40|0,(l=0|ar[(c=A+44|0)>>2])-(0|ar[a>>2])>>2>>>0<16){if((0|l)==(0|ar[A+48>>2])){pa(a,d);break A}ar[l>>2]=o,ar[c>>2]=4+(0|ar[c>>2]);break A}Bc(0|ar[k+20>>2]),0|(o=0|ar[k+32>>2])&&((0|(c=0|ar[(a=k+36|0)>>2]))!=(0|o)&&(ar[a>>2]=c+(~((c+-4-o|0)>>>2)<<2)),vu(o)),vu(k);break A}o=0|ar[k+20>>2]}while(0);hb(0|o,0|e,0|r),ar[(s=k+24|0)>>2]=r,ar[(u=k+8|0)>>2]=i,ar[u+4>>2]=f,ar[k+16>>2]=n;e:do{if(2<(0|r))for(f=k+32|0,n=k+36|0,u=k+40|0,o=0|ar[k+20>>2],i=0,l=r;;){switch((a=0|tr[(e=o+2|0)>>0])<<24>>24){case 0:case 3:0==(0|tr[o>>0])&&a<<24>>24==3&0==(0|tr[(b=o+1|0)>>0])?(c=0|ar[n>>2],a=i+2+(c-(0|ar[f>>2])>>2)|0,ar[d>>2]=a,(0|c)==(0|ar[u>>2])?ga(f,d):(ar[c>>2]=a,ar[n>>2]=c+4),wb(0|e,o+3|0,-3-i+(0|ar[s>>2])|0),a=(0|ar[s>>2])-1|0,ar[s>>2]=a,c=i+1|0,o=b):(c=i,a=l);break;default:c=i+2|0,o=e,a=l}if((a+-2|0)<=(0|(i=c+1|0)))break e;o=o+1|0,l=a}}while(0);return o=0|ar[(e=A+16|0)>>2],d=(0|ar[A+20>>2])-o|0,c=0|ar[(a=A+28|0)>>2],l=0|ar[(i=A+32|0)>>2],(0|(0==(0|d)?0:(d<<8)-1|0))==(l+c|0)?(Ea(A+12|0),c=0|ar[a>>2],a=0|ar[i>>2],o=0|ar[e>>2]):a=l,ar[(0|ar[o+((d=a+c|0)>>>10<<2)>>2])+((1023&d)<<2)>>2]=k,ar[i>>2]=a+1,ar[(k=A+36|0)>>2]=(0|ar[k>>2])+(0|ar[s>>2]),ur=t,(k=0)|k}ar[d>>2]=0}while(0);return ur=t,0|(k=7)}((A|=0)+548|0,e|=0,r|=0,i|=0,f|=0,n|=0)}function Fe(A){var e=0;return(0|ar[(A|=0)+376200>>2])<=0?(e=0)|e:(e=0|ar[A+376196>>2],(e=0|ar[(0|ar[(0|ar[A+376184>>2])+(e>>>10<<2)>>2])+((1023&e)<<2)>>2])?(fa(A+376148|(tr[e+100>>0]=0)),0|e):(e=0)|e)}function Re(A){var e;0|ar[(A|=0)+376200>>2]&&(e=0|ar[A+376196>>2],fa(A+376148|(tr[100+(0|ar[(0|ar[(0|ar[A+376184>>2])+(e>>>10<<2)>>2])+((1023&e)<<2)>>2])>>0]=0)))}function Ne(A,e,r){switch(A|=0,r|=0,0|(e|=0)){case 0:return void(tr[A+512>>0]=0!=(0|r)&1);case 6:return void(tr[A+514>>0]=0!=(0|r)&1);case 7:return void(tr[A+532>>0]=0!=(0|r)&1);case 8:return void(tr[A+533>>0]=0!=(0|r)&1);default:sr(55739,34548,503,34557)}}function _e(A,e){switch(A|=0,0|(e|=0)){case 0:A=A+72|0;break;case 2:case 1:A=A+80|0;break;default:return(e=0)|e}return 0|(e=0|ar[A>>2])}function Ye(A,e){switch(A|=0,0|(e|=0)){case 0:A=A+76|0;break;case 2:case 1:A=A+84|0;break;default:return(e=0)|e}return 0|(e=0|ar[A>>2])}function Qe(A,e){switch(A|=0,0|(e|=0)){case 0:A=A+5760|0;break;case 2:case 1:A=A+5768|0;break;default:return(e=0)|e}return 0|(e=0|ar[A>>2])}function De(A){return 0|ar[(A|=0)+20>>2]}function Je(A,e,r){A|=0,r|=0;var i,f,n=0;if(3<=(e|=0)>>>0&&sr(34582,34548,639,34609),f=0|ar[A+60+(e<<2)>>2],!r)return 0|f;switch(i=0|ar[(0==(0|e)?A+40|0:A+44|0)>>2],0|e){case 0:A=A+5760|0,n=7;break;case 2:case 1:A=A+5768|0,n=7;break;default:A=0}return 7==(0|n)&&(A=(7+(0|ar[A>>2])|0)/8|0),n=0|br(A,i),ar[r>>2]=n,0|f}function Me(A){var e,r=0,i=0,f=0,n=0,t=0,o=0;if(ar[(A|=0)>>2]=7696,(0|(r=0|ar[(n=A+377216|0)>>2]))!=(0|(i=0|ar[(t=A+377220|0)>>2])))for(;(f=0|ar[i+-4>>2])&&(Te(f),vu(f),i=0|ar[t>>2],r=0|ar[n>>2]),i=i+-4|0,(0|r)!=(0|(ar[t>>2]=i)););0|r&&vu(r),function(A){var e,r,i,f,n,t,o=0,a=0,c=0,l=0,u=0,b=0,s=0;if(n=8+(A|=0)|0,a=0|ar[(t=A+12|0)>>2],o=0|ar[n>>2],(0|a)!=(0|o))for(l=0;(c=0|ar[o+(l<<2)>>2])&&(aa(c),vu(c),o=0|ar[n>>2],a=0|ar[t>>2]),(l=l+1|0)>>>0<a-o>>2>>>0;);a=0|ar[(i=A+36|0)>>2],o=0|ar[(r=A+48|0)>>2],c=a+(o>>>10<<2)|0,b=0|ar[(f=A+40|0)>>2],o=(0|(l=b))==(0|(e=a))?(b=A+52|(u=0),0):(u=(0|ar[(b=A+52|0)>>2])+o|0,u=(0|ar[a+(u>>>10<<2)>>2])+((1023&u)<<2)|0,(0|ar[c>>2])+((1023&o)<<2)|0);A:for(;;){do{if((0|o)==(0|u))break A;o=o+4|0}while(4096!=(o-(0|ar[c>>2])|0));o=0|ar[(c=o=c+4|0)>>2]}if(ar[b>>2]=0,2<(o=l-e>>2)>>>0)for(;vu(0|ar[a>>2]),a=4+(0|ar[i>>2])|0,ar[i>>2]=a,o=(0|ar[f>>2])-a>>2,2<o>>>0;);switch(0|o){case 1:o=512,s=14;break;case 2:o=1024,s=14}14==(0|s)&&(ar[r>>2]=o);if(o=0|ar[i>>2],a=0|ar[f>>2],(0|o)!=(0|a)){for(;vu(0|ar[o>>2]),(0|(o=o+4|0))!=(0|a););o=0|ar[i>>2],(0|(a=0|ar[f>>2]))!=(0|o)&&(ar[f>>2]=a+(~((a+-4-o|0)>>>2)<<2))}0|(o=0|ar[A+32>>2])&&vu(o);0|(c=0|ar[A+20>>2])&&((0|(a=0|ar[(o=A+24|0)>>2]))!=(0|c)&&(ar[o>>2]=a+(~((a+-4-c|0)>>>2)<<2)),vu(c));if(!(o=0|ar[n>>2]))return;(0|(a=0|ar[t>>2]))!=(0|o)&&(ar[t>>2]=a+(~((a+-4-o|0)>>>2)<<2));vu(o)}(A+376148|0),function(A){var e,r,i,f,n,t=0,o=0,a=0,c=0,l=0,u=0;o=0|ar[(f=8+(A|=0)|0)>>2],t=0|ar[(i=A+20|0)>>2],a=o+(t>>>10<<2)|0,l=0|ar[(n=A+12|0)>>2],t=(0|(e=l))==(0|(r=o))?(l=A+24|(c=0),0):(c=(0|ar[(l=A+24|0)>>2])+t|0,c=(0|ar[o+(c>>>10<<2)>>2])+((1023&c)<<2)|0,(0|ar[a>>2])+((1023&t)<<2)|0);A:for(;;){do{if((0|t)==(0|c))break A;t=t+4|0}while(4096!=(t-(0|ar[a>>2])|0));t=0|ar[(a=t=a+4|0)>>2]}if(ar[l>>2]=0,2<(t=e-r>>2)>>>0)for(;vu(0|ar[o>>2]),o=4+(0|ar[f>>2])|0,ar[f>>2]=o,t=(0|ar[n>>2])-o>>2,2<t>>>0;);switch(0|t){case 1:t=512,u=13;break;case 2:t=1024,u=13}13==(0|u)&&(ar[i>>2]=t);if(t=0|ar[f>>2],o=0|ar[n>>2],(0|t)!=(0|o)){for(;vu(0|ar[t>>2]),(0|(t=t+4|0))!=(0|o););t=0|ar[f>>2],(0|(o=0|ar[n>>2]))!=(0|t)&&(ar[n>>2]=o+(~((o+-4-t|0)>>>2)<<2))}if(!(t=0|ar[A+4>>2]))return;vu(t)}(A+375396|0),Ga(A+370984|0),Ga(A+366584|0),Ga(A+362184|0),Ga(A+357784|0),Ga(A+353384|0),Ga(A+348984|0),Ga(A+344584|0),Ga(A+340184|0),Ga(A+335784|0),Ga(A+331384|0),Ga(A+326984|0),Ga(A+322584|0),Ga(A+318184|0),Ga(A+313784|0),Ga(A+309384|0),Ga(A+304984|0),Ga(A+300584|0),Ga(A+296184|0),Ga(A+291784|0),Ga(A+287384|0),Ga(A+282984|0),Ga(A+278584|0),Ga(A+274184|0),Ga(A+269784|0),Ga(A+265384|0),Ga(A+260984|0),Ga(A+256584|0),Ga(A+252184|0),Ga(A+247784|0),Ga(A+243384|0),Ga(A+238984|0),Ga(A+234584|0),Ga(A+230184|0),Ga(A+225784|0),Ga(A+221384|0),Ga(A+216984|0),Ga(A+212584|0),Ga(A+208184|0),Ga(A+203784|0),Ga(A+199384|0),Ga(A+194984|0),Ga(A+190584|0),Ga(A+186184|0),Ga(A+181784|0),Ga(A+177384|0),Ga(A+172984|0),Ga(A+168584|0),Ga(A+164184|0),Ga(A+159784|0),Ga(A+155384|0),Ga(A+150984|0),Ga(A+146584|0),Ga(A+142184|0),Ga(A+137784|0),Ga(A+133384|0),Ga(A+128984|0),Ga(A+124584|0),Ga(A+120184|0),Ga(A+115784|0),Ga(A+111384|0),Ga(A+106984|0),Ga(A+102584|0),Ga(A+98184|0),Ga(A+93784|0),Ac(A+88616|0),Ac(A+83448|0),Ac(A+78280|0),Ac(A+73112|0),Ac(A+67944|0),Ac(A+62776|0),Ac(A+57608|0),Ac(A+52440|0),Ac(A+47272|0),Ac(A+42104|0),Ac(A+36936|0),Ac(A+31768|0),Ac(A+26600|0),Ac(A+21432|0),Ac(A+16264|0),Ac(A+11096|0),e=A+600|0,o=A+11096|0;do{if(0|(r=0|ar[o+-16>>2])&&((0|ar[(i=o+-12|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),0|(r=0|ar[o+-28>>2])&&((0|(f=0|ar[(i=o+-24|0)>>2]))!=(0|r)&&(ar[i>>2]=f+(~((f+-2-r|0)>>>1)<<1)),vu(r)),0|(r=0|ar[(n=o+-64|0)>>2])){if((0|(i=0|ar[(t=o+-60|0)>>2]))!=(0|r)){for(;i=i+-12|0,ar[t>>2]=i,(f=0|ar[i>>2])&&(vu(f),i=0|ar[t>>2]),(0|i)!=(0|r););r=0|ar[n>>2]}vu(r)}o=o+-656|0}while((0|o)!=(0|e));!function(A){var e,r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0;ur=(i=ur)+16|0,e=i,f=0|ar[(r=32+(A|=0)|0)>>2];A:do{if(0|f){c=A+16|0,l=A+28|0,u=A+36|0,b=A+40|0,s=A+44|0,a=A+48|0;do{if(n=0|ar[c>>2],t=0|ar[l>>2],o=0|ar[(0|ar[n+(t>>>10<<2)>>2])+((1023&t)<<2)>>2],ar[r>>2]=f+-1,t=t+1|0,2047<(ar[l>>2]=t)>>>0&&(vu(0|ar[n>>2]),ar[c>>2]=4+(0|ar[c>>2]),ar[l>>2]=(0|ar[l>>2])-1024),ar[u>>2]=(0|ar[u>>2])-(0|ar[o+24>>2]),!o)break A;ar[e>>2]=o,f=o,n=0|ar[s>>2];do{if(n-(0|ar[b>>2])>>2>>>0<16){if((0|n)==(0|ar[a>>2])){pa(b,e);break}ar[n>>2]=f,ar[s>>2]=4+(0|ar[s>>2]);break}Bc(0|ar[o+20>>2]),0|(f=0|ar[o+32>>2])&&((0|(t=0|ar[(n=o+36|0)>>2]))!=(0|f)&&(ar[n>>2]=t+(~((t+-4-f|0)>>>2)<<2)),vu(f)),vu(o)}while(0);f=0|ar[r>>2]}while(0!=(0|f))}}while(0);if(o=0|ar[A+8>>2]){ar[e>>2]=o,f=o,c=A+40|0,n=0|ar[(a=A+44|0)>>2];do{if(n-(0|ar[c>>2])>>2>>>0<16){if((0|n)==(0|ar[A+48>>2])){pa(c,e);break}ar[n>>2]=f,ar[a>>2]=4+(0|ar[a>>2]);break}Bc(0|ar[o+20>>2]),0|(f=0|ar[o+32>>2])&&((0|(t=0|ar[(n=o+36|0)>>2]))!=(0|f)&&(ar[n>>2]=t+(~((t+-4-f|0)>>>2)<<2)),vu(f)),vu(o)}while(0);u=b=a}else b=u=A+44|0,c=A+40|0;if(t=0|ar[u>>2],o=0|ar[c>>2],(0|(f=t))!=(0|(n=o)))for(l=0;(a=0|ar[n+(l<<2)>>2])&&(Bc(0|ar[a+20>>2]),0|(f=0|ar[a+32>>2])&&((0|(t=0|ar[(n=a+36|0)>>2]))!=(0|f)&&(ar[n>>2]=t+(~((t+-4-f|0)>>>2)<<2)),vu(f)),vu(a),f=0|ar[u>>2],o=0|ar[c>>2],t=f),(l=l+1|0)>>>0<t-(n=o)>>2>>>0;);0|n&&((0|f)!=(0|n)&&(ar[b>>2]=f+(~((f+-4-n|0)>>>2)<<2)),vu(n));f=0|ar[(b=A+16|0)>>2],n=0|ar[(u=A+28|0)>>2],o=f+(n>>>10<<2)|0,t=0|ar[(s=A+20|0)>>2],n=(0|(a=t))==(0|(c=f))?l=0:(l=(0|ar[r>>2])+n|0,l=(0|ar[f+(l>>>10<<2)>>2])+((1023&l)<<2)|0,(0|ar[o>>2])+((1023&n)<<2)|0);A:for(;;){do{if((0|n)==(0|l))break A;n=n+4|0}while(4096!=(n-(0|ar[o>>2])|0));n=0|ar[(o=n=o+4|0)>>2]}if(ar[r>>2]=0,2<(n=a-c>>2)>>>0)for(;vu(0|ar[f>>2]),f=4+(0|ar[b>>2])|0,ar[b>>2]=f,t=0|ar[s>>2],n=t-f>>2,2<n>>>0;);switch(0|n){case 1:n=512,d=45;break;case 2:n=1024,d=45}45==(0|d)&&(ar[u>>2]=n);if((0|f)!=(0|t)){for(;vu(0|ar[f>>2]),(0|(f=f+4|0))!=(0|t););f=0|ar[b>>2],(0|(n=0|ar[s>>2]))!=(0|f)&&(ar[s>>2]=n+(~((n+-4-f|0)>>>2)<<2))}(f=0|ar[A+12>>2])&&vu(f),ur=i}(A+548|0)}function Te(A){var e,r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0;if(i=(A|=0)+10632|0,(0|(n=0|ar[(l=A+10636|0)>>2]))!=(0|(f=0|ar[i>>2]))){a=0;do{if(o=0|ar[f+(a<<2)>>2]){if(Ba(548+(0|ar[o+144>>2])|0,0|ar[o>>2]),0|(n=0|ar[o+136>>2])){if(0|(f=0|ar[(t=n+-16|0)+12>>2]))for(f=n+(18624*f|0)|0;kt(f+-44|0),(0|(f=f+-18624|0))!=(0|n););mu(t)}Jn(o+44|0),vu(o),f=0|ar[i>>2],n=0|ar[l>>2]}a=a+1|0}while(a>>>0<n-f>>2>>>0)}if(e=A+10664|0,(0|(f=0|ar[(r=A+10668|0)>>2]))!=(0|(n=t=0|ar[e>>2])))for(c=0,a=n,o=t;(t=0|ar[a+(c<<2)>>2])?(is[511&ar[4+(0|ar[t>>2])>>2]](t),n=t=0|ar[e>>2],f=0|ar[r>>2]):t=o,!(f-t>>2>>>0<=(c=c+1|0)>>>0);)o=a=t;if(f=0|ar[(o=A+10676|0)>>2]){if((0|(n=0|ar[(t=A+10680|0)>>2]))!=(0|f)){for(;c=n+-8|0,kt(ar[t>>2]=c),(0|(n=0|ar[t>>2]))!=(0|f););f=0|ar[o>>2]}vu(f),f=0|ar[e>>2]}else f=n;0|f&&((0|(n=0|ar[r>>2]))!=(0|f)&&(ar[r>>2]=n+(~((n+-4-f|0)>>>2)<<2)),vu(f)),0|(f=0|ar[A+10644>>2])&&((0|(t=0|ar[(n=A+10648|0)>>2]))!=(0|f)&&(ar[n>>2]=t+(80*~(((t+-80-f|0)>>>0)/80|0)|0)),vu(f)),(f=0|ar[i>>2])&&((0|(n=0|ar[l>>2]))!=(0|f)&&(ar[l>>2]=n+(~((n+-4-f|0)>>>2)<<2)),vu(f)),aa(l=A+8|0)}function Ue(A,e){e|=0;var r,i,f=0,n=0,t=0,o=0,a=0,c=0;if(0|ar[(i=(A|=0)+136|0)>>2]&&sr(34678,34700,169,34710),n=0|wu(230614<e>>>0|4294967279<(n=18624*e|0)>>>0?-1:n+16|0),ar[n+12>>2]=e,n=n+16|0,!e)return ar[i>>2]=n,void(ar[(n=A+140|0)>>2]=e);for(r=n+(18624*e|0)|0,f=n;st(f+18580|0),o=f+18592|0,t=0==(0|(t=15&(c=f+48|0)))?c:c+(16-t)|0,ar[(a=f+18508|0)>>2]=0,ar[a+4>>2]=0,ar[a+8>>2]=0,ar[a+12>>2]=0,ar[a+16>>2]=0,ar[o>>2]=0,ar[o+4>>2]=0,ar[o+8>>2]=0,ar[o+12>>2]=0,vb((ar[o+16>>2]=0)|(ar[f+2112>>2]=t),0,2048),(0|(f=f+18624|0))!=(0|r););ar[i>>2]=n,ar[(c=A+140|0)>>2]=e}function Se(A,e){A|=0;var r,i=0,f=0,n=0,t=0;vb((e|=0)+48|0,0,2064),ar[e+18532>>2]=-1,ar[e+18536>>2]=-1,r=0|ar[e+18596>>2],(0|(A=0|ar[16+(0|ar[e+18600>>2])>>2]))<=0||(A=(1+((0|(n=0|ar[(0|ar[10284+r>>2])+((0|ar[(0|ar[10272+r>>2])+(A<<2)>>2])-1<<2)>>2]))%(0|(t=0|ar[5820+r>>2]))|0)<<(f=0|ar[5804+r>>2]))-1|0,f=(1+((0|n)/(0|t)|0)<<f)-1|0,t=(0|ar[1248+r>>2])-1|0,n=(0|ar[1252+r>>2])-1|0,A=((0|t)<(0|A)?t:A)>>(i=0|ar[10368+r>>2]),i=((0|n)<(0|f)?n:f)>>i,(0|A)<=-1&&sr(48482,48519,118,48539),(0|(f=0|ar[10372+r>>2]))<=(0|A)&&sr(48482,48519,118,48539),(0|i)<=-1&&sr(48543,48519,119,48539),(0|i)>=(0|ar[10376+r>>2])&&sr(48543,48519,119,48539),t=(0|ar[10360+r>>2])+(3*((0|br(f,i))+A|0)|0)+2|0,ar[e+18528>>2]=tr[t>>0])}function Oe(A,e){e|=0;var r,i,f,n,t,o=0,a=0,c=0,l=0;f=(A|=0)+4|0,n=0|ar[A>>2],1073741823<(o=1+(i=(t=(0|ar[f>>2])-n|0)>>2)|0)>>>0&&zl(),a=(c=(0|ar[(l=A+8|0)>>2])-n|0)>>1,a=c>>2>>>0<536870911?a>>>0<o>>>0?o:a:1073741823;do{if(a){if(!(1073741823<a>>>0)){c=0|hu(a<<2);break}Zu(l=0|X(8),44519),ar[l>>2]=17660,I(0|l,4016,428)}else c=0}while(0);ar[(r=c+(i<<2)|0)>>2]=ar[e>>2],o=r+(0-i<<2)|0,0<(0|t)&&hb(0|o,0|n,0|t),ar[A>>2]=o,ar[f>>2]=4+r,ar[l>>2]=c+(a<<2),n&&vu(n)}function ze(A,e){A|=0,e|=0;var r,i,f,n=0,t=0,o=0;if(ur=(f=ur)+656|0,ar[(n=(r=f)+592|0)>>2]=0,ar[(i=r+596|0)>>2]=0,ar[r+600>>2]=0,ar[(t=r+628|0)>>2]=0,ar[t+4>>2]=0,ar[t+8>>2]=0,ar[t+12>>2]=0,ar[t+16>>2]=0,o=(e=(ar[t+20>>2]=0)|function(A,e,r){A|=0,e|=0;var i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;if(l=0|At(r|=0,4),15<(0|(ar[A>>2]=l)))return 0|(r=8);if(et(r,2),l=0|At(r,6),ar[A+4>>2]=l+1,62<(0|l))return 0|(r=8);if(l=0|At(r,3),ar[(t=A+8|0)>>2]=l+1,6<(0|l))return 0|(r=8);l=0|At(r,1),ar[A+12>>2]=l,et(r,16),Ln(A+16|0,r,0|ar[t>>2]),l=0|At(r,1),ar[(o=A+484|0)>>2]=l,i=0|ar[t>>2],l?0<(0|i)&&(a=0,f=7):(a=i+-1|0,f=7);do{if(7==(0|f)){for(i=a;;){if(n=0|it(r),ar[(l=A+488+(12*i|0)|0)>>2]=n,n=0|it(r),ar[(f=A+488+(12*i|0)+4|0)>>2]=n,n=0|it(r),ar[A+488+(12*i|0)+8>>2]=n,-99999==(0|ar[l>>2])){i=8,f=48;break}if(i=i+1|0,-99999==(0|n)|-99999==(0|ar[f>>2])){i=8,f=48;break}if((0|i)>=(0|ar[t>>2])){f=11;break}}if(11==(0|f)){if(0|ar[o>>2])break;if(8<=(0|a)&&sr(44587,44512,144,44627),(0|a)<=0)break;for(f=A+488+(12*a|0)|0,n=A+488+(12*a|0)+4|0,t=A+488+(12*a|0)+8|0,i=0;ar[A+488+(12*i|0)>>2]=ar[f>>2],ar[A+488+(12*i|0)+4>>2]=ar[n>>2],ar[A+488+(12*i|0)+8>>2]=ar[t>>2],(0|(i=i+1|0))!=(0|a););}else if(48==(0|f))return 0|i}}while(0);if(a=255&(0|At(r,6)),tr[(c=A+584|0)>>0]=a,a=0|it(r),-99999==(0|(ar[(l=A+588|0)>>2]=a))|1023<(t=a+1|0)>>>0)return er(e,8,0),0|(r=8);if(ar[l>>2]=t,a=A+592|0,i=0|ar[(o=A+596|0)>>2],n=0|ar[a>>2],t>>>0<=(f=(i-n|0)/12|0)>>>0){if(t>>>0<f>>>0&&(0|i)!=(0|(u=n+(12*t|0)|0)))for(;i=i+-12|0,ar[o>>2]=i,(f=0|ar[i>>2])&&(vu(f),i=0|ar[o>>2]),(0|i)!=(0|u););}else!function(A,e){e|=0;var r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0;if(t=0|ar[(i=8+(A|=0)|0)>>2],n=0|ar[(u=A+4|0)>>2],((t-(f=n)|0)/12|0)>>>0>=e>>>0)return vb(0|n,0,12*e|0),ar[u>>2]=f+(12*e|0);l=0|ar[A>>2],357913941<(n=(a=(n-(r=l)|0)/12|0)+e|0)>>>0&&zl();o=(c=(t-l|0)/12|0)<<1,o=c>>>0<178956970?o>>>0<n>>>0?n:o:357913941;do{if(o){if(!(357913941<o>>>0)){c=0|hu(12*o|0);break}Zu(u=0|X(8),44519),ar[u>>2]=17660,I(0|u,4016,428)}else c=0}while(0);if(n=c+(12*a|0)|0,c=c+(12*o|0)|0,vb(0|(t=n),0,12*e|0),a=n+(12*e|0)|0,(0|f)==(0|r))o=l;else{for(;f=(l=f)+-12|0,ar[n+-12>>2]=ar[f>>2],e=l+-8|0,ar[n+-8>>2]=ar[e>>2],l=l+-4|0,ar[n+-4>>2]=ar[l>>2],ar[f>>2]=0,ar[e>>2]=0,ar[l>>2]=0,t=n=t+-12|0,(0|f)!=(0|r););o=0|ar[A>>2],f=0|ar[u>>2]}if(ar[A>>2]=t,ar[u>>2]=a,ar[i>>2]=c,(0|f)!=(0|(t=o)))for(;0|(n=0|ar[(f=f+-12|0)>>2])&&vu(n),(0|f)!=(0|t););if(!o)return;vu(o)}(a,t-f|0);if(1<(0|ar[l>>2]))for(f=1,n=0|ar[a>>2],i=0|tr[c>>0];;){for(Kn(n+(12*f|0)|0,1+(255&i)|0,0),n=0;o=0!=(0|At(r,1)),t=0|ar[a>>2],i=(0|ar[t+(12*f|0)>>2])+(n>>>5<<2)|0,u=1<<(31&n),e=0|ar[i>>2],ar[i>>2]=o?e|u:e&~u,i=0|tr[c>>0],(0|n)<(255&i|0);)n=n+1|0;if(!((0|(f=f+1|0))<(0|ar[l>>2])))break;n=t}if(u=255&(0|At(r,1)),(tr[A+604>>0]=u)<<24>>24&&(u=0|At(r,32),ar[A+608>>2]=u,u=0|At(r,32),ar[A+612>>2]=u,u=255&(0|At(r,1)),(tr[A+616>>0]=u)<<24>>24)&&(i=1+(0|it(r))|0,ar[A+620>>2]=i,i=0|it(r),1023<(0|(ar[(e=A+624|0)>>2]=i))&&sr(55739,44512,189,44627),c=A+628|0,o=0|ar[(f=A+632|0)>>2],t=0|ar[c>>2],i>>>0<=(n=o-t>>1)>>>0?i>>>0<n>>>0&&(0|o)!=(0|(b=t+(i<<1)|0))&&(ar[f>>2]=o+(~((o+-2-b|0)>>>1)<<1)):(function(A,e){e|=0;var r,i,f,n,t,o=0,a=0,c=0,l=0;if(a=0|ar[(t=8+(A|=0)|0)>>2],o=0|ar[(l=A+4|0)>>2],e>>>0<=a-o>>1>>>0)return vb(0|o,0,e<<1|0),ar[l>>2]=o+(e<<1);n=0|ar[A>>2],(0|(o=(i=(f=o-n|0)>>1)+e|0))<0&&zl();a=(a=a-n|0)>>1>>>0<1073741823?a>>>0<o>>>0?o:a:2147483647;do{if(a){if(!((0|a)<0)){c=0|hu(a<<1);break}Zu(l=0|X(8),44519),ar[l>>2]=17660,I(0|l,4016,428)}else c=0}while(0);vb(0|(r=c+(i<<1)|0),0,e<<1|0),o=r+(0-i<<1)|0,0<(0|f)&&hb(0|o,0|n,0|f);if(ar[A>>2]=o,ar[l>>2]=r+(e<<1),ar[t>>2]=c+(a<<1),!n)return;vu(n)}(c,i-n|0),i=0|ar[e>>2]),f=A+640|0,a=0|ar[(n=A+644|0)>>2],o=0|ar[f>>2],i>>>0<=(t=a-o|0)>>>0?i>>>0<t>>>0&&(0|a)!=(0|(s=o+i|0))&&(ar[n>>2]=s):(function(A,e){e|=0;var r,i,f=0,n=0,t=0,o=0,a=0;if(t=0|ar[(r=8+(A|=0)|0)>>2],f=0|ar[(i=A+4|0)>>2],e>>>0<=(t-f|0)>>>0){for(;tr[f>>0]=0,f=1+(0|ar[i>>2])|0,ar[i>>2]=f,0!=(0|(e=e+-1|0)););return}n=0|ar[A>>2],(0|(f=(o=f-n|0)+e|0))<0&&zl();a=(t=t-n|0)<<1,n=(f=t>>>0<1073741823?a>>>0<f>>>0?f:a:2147483647)?0|hu(f):0;a=n+o|0,o=n+f|0,f=t=a;for(;tr[f>>0]=0,t=f=t+1|0,e=e+-1|0,0!=(0|e););e=0|ar[A>>2],n=(0|ar[i>>2])-e|0,f=a+(0-n)|0,0<(0|n)&&hb(0|f,0|e,0|n);if(ar[A>>2]=f,ar[i>>2]=t,ar[r>>2]=o,!e)return;vu(e)}(f,i-t|0),i=0|ar[e>>2]),0<(0|i)))return r=65535&(0|it(r)),or[ar[c>>2]>>1]=r,(r=0)|r;return r=255&(0|At(r,1)),tr[A+652>>0]=r,(r=0)|r}(r,A+4|0,e))||(-1<(0|(e=0|ar[A+520>>2]))&&function(A,e){A|=0;var r,i,f,n,t,o,a,c,l,u,b,s,d,k,h,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0;switch(ur=(h=ur)+208|0,I=h+192|0,k=h+184|0,d=h+176|0,W=h+168|0,s=h+160|0,X=h+152|0,b=h+144|0,E=h+128|0,u=h+120|0,B=h+112|0,a=h+104|0,y=h+96|0,f=h+88|0,i=h+80|0,o=h+72|0,t=h+64|0,n=h+56|0,r=h+48|0,p=h+40|0,Z=h+32|0,g=h+24|0,m=h+16|0,v=h+8|0,l=(w=h)+200|0,0|(e|=0)){case 1:e=10172;break;case 2:e=10676;break;default:return ur=h}if(Pn(c=0|ar[e>>2],44632,w),ar[v>>2]=ar[A>>2],Pn(c,44673,v),ar[m>>2]=ar[A+4>>2],Pn(c,44717,m),v=A+8|0,ar[g>>2]=ar[v>>2],Pn(c,44761,g),ar[Z>>2]=ar[A+12>>2],Pn(c,44805,Z),Z=0|ar[v>>2],$n(A+16|0,1,c),w=Z+-1|0,1<(0|Z))for(e=0;ar[p>>2]=e,Pn(c,44849,p),$n(A+68+(52*e|0)|0,0,c),(0|(e=e+1|0))!=(0|w););if(p=A+484|0,ar[r>>2]=ar[p>>2],Pn(c,44882,r),0|ar[p>>2]){if(0<(0|ar[v>>2]))for(e=0;y=0|ar[A+488+(12*e|0)>>2],ar[n>>2]=e,ar[4+n>>2]=y,Pn(c,44929,n),ar[t>>2]=ar[A+488+(12*e|0)+4>>2],Pn(c,44971,t),ar[o>>2]=ar[A+488+(12*e|0)+8>>2],Pn(c,45012,o),(0|(e=e+1|0))<(0|ar[v>>2]););}else ar[i>>2]=ar[A+488>>2],Pn(c,45053,i),ar[f>>2]=ar[A+492>>2],Pn(c,45098,f),ar[y>>2]=ar[A+496>>2],Pn(c,45143,y);if(Z=A+584|0,ar[a>>2]=cr[Z>>0],Pn(c,45188,a),g=A+588|0,ar[B>>2]=ar[g>>2],Pn(c,45213,B),1<(0|ar[g>>2])){v=A+592|0,m=4+l|0,w=1;do{for(e=0;ar[l>>2]=(0|ar[(0|ar[v>>2])+(12*w|0)>>2])+(e>>>5<<2),ar[m>>2]=1<<(31&e),ar[E>>2]=w,ar[E+4>>2]=e,tr[(B=E+8|0)>>0]=0|tr[l>>0],tr[B+1>>0]=0|tr[1+l>>0],tr[B+2>>0]=0|tr[2+l>>0],tr[B+3>>0]=0|tr[3+l>>0],tr[B+4>>0]=0|tr[4+l>>0],tr[B+5>>0]=0|tr[5+l>>0],tr[B+6>>0]=0|tr[6+l>>0],tr[B+7>>0]=0|tr[7+l>>0],Pn(c,45273,E),(0|e)<(0|cr[Z>>0]);)e=e+1|0;w=w+1|0}while((0|w)<(0|ar[g>>2]))}if(E=A+604|0,ar[u>>2]=tr[E>>0],Pn(c,45238,u),0|tr[E>>0]&&(ar[b>>2]=ar[A+608>>2],Pn(c,45310,b),ar[X>>2]=ar[A+612>>2],Pn(c,45338,X),X=A+616|0,ar[s>>2]=tr[X>>0],Pn(c,45366,s),0|tr[X>>0])&&(ar[W>>2]=ar[A+620>>2],Pn(c,45408,W),W=A+624|0,ar[d>>2]=ar[W>>2],Pn(c,45441,d),0<(0|ar[W>>2])))return I=0|lr[ar[A+628>>2]>>1],ar[k>>2]=0,ar[4+k>>2]=I,Pn(c,45474,k),ur=h;ar[I>>2]=tr[A+652>>0],Pn(c,45502,I),ur=h}(r,e),hb(0|(o=A+600+(656*(e=0|ar[r>>2])|0)|0),0|r,592),(0|o)==(0|r)?(n=r+604|0,ar[(o=A+600+(656*e|0)+604|0)>>2]=ar[n>>2],ar[o+4>>2]=ar[n+4>>2],ar[o+8>>2]=ar[n+8>>2],ar[o+12>>2]=ar[n+12>>2],ar[o+16>>2]=ar[n+16>>2],ar[o+20>>2]=ar[n+20>>2]):(je(A+600+(656*e|0)+592|0,0|ar[n>>2],0|ar[i>>2]),n=r+604|0,ar[(o=A+600+(656*e|0)+604|0)>>2]=ar[n>>2],ar[o+4>>2]=ar[n+4>>2],ar[o+8>>2]=ar[n+8>>2],ar[o+12>>2]=ar[n+12>>2],ar[o+16>>2]=ar[n+16>>2],ar[o+20>>2]=ar[n+20>>2],He(A+600+(656*e|0)+628|0,0|ar[t>>2],0|ar[r+632>>2]),xe(A+600+(656*e|0)+640|0,0|ar[r+640>>2],0|ar[r+644>>2])),tr[A+600+(656*e|0)+652>>0]=0|tr[r+652>>0],0),0|(e=0|ar[r+640>>2])&&((0|ar[(A=r+644|0)>>2])!=(0|e)&&(ar[A>>2]=e),vu(e)),0|(e=0|ar[t>>2])&&((0|(n=0|ar[(A=r+632|0)>>2]))!=(0|e)&&(ar[A>>2]=n+(~((n+-2-e|0)>>>1)<<1)),vu(e)),!(e=0|ar[(t=r+592|0)>>2]))return ur=f,0|o;if((0|(A=0|ar[i>>2]))!=(0|e)){for(;A=A+-12|0,ar[i>>2]=A,(n=0|ar[A>>2])&&(vu(n),A=0|ar[i>>2]),(0|A)!=(0|e););e=0|ar[t>>2]}return vu(e),ur=f,0|o}function je(A,e,r){var i,f,n,t,o,a,c,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0;if(ur=(c=ur)+32|0,t=c+24|0,n=c+16|0,o=c+8|0,a=c,f=((r|=0)-(e|=0)|0)/12|0,(((u=0|ar[(d=(A|=0)+8|0)>>2])-(l=i=0|ar[A>>2])|0)/12|0)>>>0<f>>>0){if(i){if((0|(u=0|ar[(s=A+4|0)>>2]))==(0|l))u=i;else{for(;u=u+-12|0,ar[s>>2]=u,(b=0|ar[u>>2])&&(vu(b),u=0|ar[s>>2]),(0|u)!=(0|l););u=0|ar[A>>2]}vu(u),ar[d>>2]=0,ar[s>>2]=0,u=ar[A>>2]=0}if(357913941<f>>>0&&zl(),u=(m=(0|u)/12|0)<<1,357913941<(u=m>>>0<178956970?u>>>0<f>>>0?f:u:357913941)>>>0&&zl(),b=0|hu(12*u|0),ar[(m=A+4|0)>>2]=b,ar[A>>2]=b,ar[d>>2]=b+(12*u|0),(0|e)==(0|r))return void(ur=c);for(w=4+o|0,v=a+4|0,h=e;;){if(ar[b>>2]=0,ar[(u=b+4|0)>>2]=0,(ar[(s=b+8|0)>>2]=0)|(k=0|ar[(d=h+4|0)>>2])){if((0|k)<0){u=42;break}Z=0|hu((k=1+((k+-1|0)>>>5)|0)<<2),ar[b>>2]=Z,ar[u>>2]=0,ar[s>>2]=k,s=0|ar[h>>2],ar[o>>2]=s,k=(ar[w>>2]=0)|ar[d>>2],ar[a>>2]=s+(k>>>5<<2),ar[v>>2]=31&k,ar[n>>2]=ar[o>>2],ar[4+n>>2]=ar[4+o>>2],ar[t>>2]=ar[a>>2],ar[4+t>>2]=ar[a+4>>2],Pe(b,n,t)}if(h=h+12|0,u=12+(0|ar[m>>2])|0,ar[m>>2]=u,(0|h)==(0|r)){u=45;break}b=u}if(42==(0|u))zl();else if(45==(0|u))return void(ur=c)}w=(d=((0|ar[(v=A+4|0)>>2])-i|0)/12|0)>>>0<f>>>0,d=e+(12*d|0)|0,h=w?d:r;A:do{if((0|h)==(0|e))g=l;else{for(;;){if((0|l)!=(0|e)){if(u=0|ar[(k=e+4|0)>>2]){if(u>>>0>ar[(s=l+8|0)>>2]<<5>>>0){if((b=0|ar[l>>2])&&(vu(b),ar[l>>2]=0,ar[s>>2]=0,u=(ar[l+4>>2]=0)|ar[k>>2]),(0|u)<0)break;b=0|hu((u=1+((u+-1|0)>>>5)|0)<<2),ar[l>>2]=b,ar[l+4>>2]=0,ar[s>>2]=u,u=0|ar[k>>2]}else b=0|ar[l>>2];wb(0|b,0|ar[e>>2],4+((u+-1|0)>>>5<<2)|0),u=0|ar[k>>2]}else u=0;ar[l+4>>2]=u}if(l=l+12|0,(0|(e=e+12|0))==(0|h)){g=l;break A}}zl()}}while(0);if(w)if((0|h)!=(0|r)){for(k=4+o|0,e=a+4|0,h=0|ar[v>>2];;){if(ar[h>>2]=0,ar[(l=h+4|0)>>2]=0,(ar[(u=h+8|0)>>2]=0)|(s=0|ar[(b=d+4|0)>>2])){if((0|s)<0){u=20;break}Z=0|hu((g=1+((s+-1|0)>>>5)|0)<<2),ar[h>>2]=Z,ar[l>>2]=0,ar[u>>2]=g,g=0|ar[d>>2],ar[o>>2]=g,Z=(ar[k>>2]=0)|ar[b>>2],ar[a>>2]=g+(Z>>>5<<2),ar[e>>2]=31&Z,ar[n>>2]=ar[o>>2],ar[4+n>>2]=ar[4+o>>2],ar[t>>2]=ar[a>>2],ar[4+t>>2]=ar[a+4>>2],Pe(h,n,t)}if(d=d+12|0,l=12+(0|ar[v>>2])|0,ar[v>>2]=l,(0|d)==(0|r)){u=45;break}h=l}if(20==(0|u))zl();else if(45==(0|u))return void(ur=c)}else ur=c;else{if((0|(l=0|ar[v>>2]))==(0|g))return void(ur=c);for(;l=l+-12|0,ar[v>>2]=l,(u=0|ar[l>>2])&&(vu(u),l=0|ar[v>>2]),(0|l)!=(0|g););ur=c}}function He(A,e,r){var i,f,n,t,o=0,a=0,c=0,l=0;if((c=(l=(i=r|=0)-(e|=0)|0)>>1)>>>0<=(o=0|ar[(f=(A|=0)+8|0)>>2])-(n=t=0|ar[A>>2])>>1>>>0)return 0|(r=(o=(a=c=(A=(a=(0|ar[(l=A+4|0)>>2])-t>>1)>>>0<c>>>0)?e+(a<<1)|0:r)-e|0)>>1)&&wb(0|t,0|e,0|o),r=n+(r<<1)|0,A?!((0|(o=i-a|0))<=0)&&(hb(0|ar[l>>2],0|c,0|o),void(ar[l>>2]=(0|ar[l>>2])+(o>>>1<<1))):(0|(o=0|ar[l>>2]))!=(0|r)&&void(ar[l>>2]=o+(~((o+-2-r|0)>>>1)<<1));(a=t)&&((0|(r=0|ar[(o=A+4|0)>>2]))!=(0|n)&&(ar[o>>2]=r+(~((r+-2-t|0)>>>1)<<1)),vu(a),ar[f>>2]=0,ar[o>>2]=0,o=ar[A>>2]=0),(0|l)<0&&zl(),(0|(o=o>>1>>>0<1073741823?o>>>0<c>>>0?c:o:2147483647))<0&&zl(),r=0|hu(o<<1),ar[(a=A+4|0)>>2]=r,ar[A>>2]=r,ar[f>>2]=r+(o<<1),(0|l)<=0||(hb(0|r,0|e,0|l),ar[a>>2]=r+(l>>>1<<1))}function xe(A,e,r){var i,f,n=0,t=0,o=0,a=0,c=0;return f=(c=r|=0)-(i=e|=0)|0,((n=0|ar[(o=(A|=0)+8|0)>>2])-(a=t=0|ar[A>>2])|0)>>>0<f>>>0?(t&&((0|ar[(n=A+4|0)>>2])!=(0|a)&&(ar[n>>2]=a),vu(a),ar[o>>2]=0,ar[n>>2]=0,n=ar[A>>2]=0),(0|f)<0&&zl(),c=n<<1,(0|(n=n>>>0<1073741823?c>>>0<f>>>0?f:c:2147483647))<0&&zl(),a=0|hu(n),ar[(c=A+4|0)>>2]=a,ar[A>>2]=a,ar[o>>2]=a+n,hb(0|a,0|e,0|f),void(ar[c>>2]=a+f)):(0|(n=(t=r=(A=(t=(0|ar[(o=A+4|0)>>2])-t|0)>>>0<f>>>0)?e+t|0:r)-i|0)&&wb(0|a,0|e,0|n),n=a+n|0,A?!((0|(n=c-t|0))<=0)&&(hb(0|ar[o>>2],0|r,0|n),void(ar[o>>2]=(0|ar[o>>2])+n)):(0|ar[o>>2])!=(0|n)&&void(ar[o>>2]=n))}function Pe(A,e,r){e|=0,r|=0;var i,f,n,t,o,a,c,l,u,b=0,s=0,d=0,k=0,h=0;if(ur=(u=ur)+48|0,a=u+40|0,o=u+32|0,f=u+8|0,t=(n=u)+24|0,l=u+16|0,h=0|ar[(d=(A|=0)+4|0)>>2],c=0|ar[(b=e)>>2],b=0|ar[b+4>>2],s=0|ar[(k=r)>>2],k=0|ar[k+4>>2],i=s-c<<3,ar[d>>2]=h-b+k+i,e=d=(0|ar[A>>2])+(h>>>5<<2)|0,(0|b)!=(0|(r=31&h)))return ar[(h=f)>>2]=c,ar[h+4>>2]=b,ar[(h=n)>>2]=s,ar[h+4>>2]=k,ar[t>>2]=e,ar[4+t>>2]=r,ar[o>>2]=ar[f>>2],ar[4+o>>2]=ar[4+f>>2],ar[a>>2]=ar[n>>2],ar[4+a>>2]=ar[n+4>>2],function(A,e,r,i){A|=0,r|=0,i|=0;var f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0;if(d=0|ar[(e|=0)>>2],u=0|ar[e+4>>2],o=((0|ar[r>>2])-d<<3)+(0|ar[r+4>>2])-u|0,r=d,(0|o)<=0)return e=i+4|0,i=0|ar[i>>2],ar[A>>2]=i,i=A+4|0,A=0|ar[e>>2],ar[i>>2]=A;u?(t=-1>>>((t=32-u|0)-(l=(0|o)<(0|t)?o:t)|0)&-1<<u&ar[r>>2],f=0|ar[(b=i+4|0)>>2],n=(c=32-f|0)>>>0<l>>>0?c:l,a=0|ar[i>>2],f=ar[a>>2]&~(-1>>>(c-n|0)&-1<<f),ar[a>>2]=f,c=0|ar[b>>2],ar[a>>2]=(u>>>0<c>>>0?t<<c-u:t>>>(u-c|0))|f,f=(0|ar[b>>2])+n|0,a=a+(f>>>5<<2)|0,ar[i>>2]=a,f&=31,ar[b>>2]=f,0<(0|(c=l-n|0))&&(ar[a>>2]=t>>>(u+n|0)|ar[a>>2]&~(-1>>>(32-c|0)),ar[b>>2]=c,f=c),r=r+4|0,ar[e>>2]=r,o=o-l|0):f=0|ar[(b=f=i+4|0)>>2];if(d=32-f|0,c=-1<<f,31<(0|o)){for(l=~c,a=0|ar[i>>2],u=(s=(f=o+-32|0)>>>5)+1|0,s=f-(s<<5)|0,f=r,n=0|ar[a>>2],t=a;k=0|ar[f>>2],h=n&l,ar[t>>2]=h,ar[t>>2]=k<<ar[b>>2]|h,n=ar[(t=t+4|0)>>2]&c|k>>>d,ar[t>>2]=n,!((0|(o=o+-32|0))<=31);)f=f+4|0;r=r+(u<<2)|0,ar[e>>2]=r,ar[i>>2]=a+(u<<2),o=s}if((0|o)<=0)return k=b,h=0|ar[i>>2],ar[A>>2]=h,h=A+4|0,k=0|ar[k>>2],ar[h>>2]=k;if(t=ar[r>>2]&-1>>>(32-o|0),n=(0|d)<(0|o)?d:o,f=0|ar[i>>2],r=ar[f>>2]&~(-1<<ar[b>>2]&-1>>>(d-n|0)),ar[f>>2]=r,ar[f>>2]=r|t<<ar[b>>2],r=(0|ar[b>>2])+n|0,f=f+(r>>>5<<2)|0,ar[i>>2]=f,ar[b>>2]=31&r,(0|(r=o-n|0))<=0)return k=b,h=0|ar[i>>2],ar[A>>2]=h,h=A+4|0,k=0|ar[k>>2],ar[h>>2]=k;ar[f>>2]=ar[f>>2]&~(-1>>>(32-r|0))|t>>>n,ar[b>>2]=r,k=b,h=0|ar[i>>2],ar[A>>2]=h,h=A+4|0,k=0|ar[k>>2],ar[h>>2]=k}(l,o,a,t),void(ur=u);r=k-b+i|0,k=c,0<(0|r)&&(e=b?(e=-1>>>((e=32-b|0)-(h=(0|r)<(0|e)?r:e)|0)&-1<<b,ar[d>>2]=ar[d>>2]&~e|ar[k>>2]&e,r=r-h|0,b=31&(e=h+b|0),d=d+(e>>>5<<2)|0,k=k+4|0):(b=0,c),wb(0|d,0|e,(s=(0|r)/32|0)<<2|0),A=r-(s<<5)|0,e=r=d+(s<<2)|0,0<(0|A)&&(b=-1>>>(32-A|0),ar[r>>2]=ar[r>>2]&~b|ar[k+(s<<2)>>2]&b,b=A)),ar[l>>2]=e,ar[4+l>>2]=b,ur=u}function Le(A,e){A|=0,e|=0;var r,i,f=0;return ur=(i=ur)+5168|0,$a(r=i),0|(e=0|function(A,e,r){A|=0,e|=0;var i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0;if(c=255&(0|At(r|=0,4)),tr[A+1>>0]=c,c=1+(0|At(r,3))|0,117440512<((tr[(o=A+2|0)>>0]=c)<<24|0))return 0|(A=8);if(i=255&(0|At(r,1)),tr[A+3>>0]=i,Ln(A+4|0,r,0|tr[o>>0]),-99999==(0|(i=0|it(r))))return er(e,8,0),0|(A=8);if(15<(0|(ar[A+472>>2]=i)))return 0|(A=8);if(-99999==(0|(i=0|it(r))))return er(e,8,0),0|(A=8);3==(0|(ar[(f=A+476|0)>>2]=i))?(n=255&(0|At(r,1)),i=0|ar[f>>2]):n=0;if(tr[A+480>>0]=n,ar[A+5012>>2]=n<<24>>24==0?i:0,3<i>>>0)return er(e,1019,0),0|(A=8);if(-99999==(0|(i=0|it(r))))return er(e,8,0),0|(A=8);if(ar[(f=A+484|0)>>2]=i,-99999==(0|(n=0|it(r))))return er(e,8,0),0|(A=8);if(ar[A+488>>2]=n,i=0|ar[f>>2],0==(0|n)|0==(0|i))return 0|(A=8);if(7e4<(0|n)|7e4<(0|i))return 0|(A=8);if(c=255&(0|At(r,1)),(tr[A+492>>0]=c)<<24>>24){if(-99999==(0|(i=0|it(r))))return er(e,8,0),0|(A=8);if(ar[A+496>>2]=i,-99999==(0|(i=0|it(r))))return er(e,8,0),0|(A=8);if(ar[A+500>>2]=i,-99999==(0|(i=0|it(r))))return er(e,8,0),0|(A=8);if(ar[A+504>>2]=i,-99999==(0|(i=0|it(r))))return er(e,8,0),0|(A=8)}else ar[A+496>>2]=0,ar[A+500>>2]=0,ar[A+504>>2]=0,i=0;if(ar[A+508>>2]=i,-99999==(0|(i=0|it(r))))return er(e,8,0),0|(A=8);if(ar[A+512>>2]=i+8,-99999==(0|(i=0|it(r))))return er(e,8,0),0|(A=8);if(ar[A+516>>2]=i+8,-99999==(0|(i=0|it(r))))return er(e,8,0),0|(A=8);a=i+4|0,ar[(c=A+520|0)>>2]=a,ar[A+5032>>2]=1<<a,a=255&(0|At(r,1)),(tr[(t=A+524|0)>>0]=a)<<24>>24?(i=0,l=35):(n=0|tr[o>>0],i=(n<<24>>24)-1|0);for(;;){if(35==(0|l)&&(n=0|tr[o>>0]),(0|(f=n<<24>>24))<=(0|i)){l=44;break}if(-99999==(0|(f=0|it(r)))|15<(0|f)){l=38;break}if(ar[A+528+(i<<2)>>2]=f+1,-99999==(0|(f=0|it(r)))){l=40;break}if(ar[(n=A+556+(i<<2)|0)>>2]=f,-99999==(0|(f=0|it(r)))){l=42;break}ar[A+584+(i<<2)>>2]=f,ar[A+5128+(i<<2)>>2]=f+-1+(0|ar[n>>2]),i=i+1|0,l=35}{if(38==(0|l))return er(e,8,0),0|(A=8);if(40==(0|l))return er(e,8,0),0|(A=8);if(42==(0|l))return er(e,8,0),0|(A=8);if(44==(0|l)){if(0|tr[t>>0]&&(i=f+-1|0,8<=n<<24>>24&&sr(41633,41639,317,44627),1<n<<24>>24))for(n=A+528+(i<<2)|0,t=A+556+(i<<2)|0,f=A+584+(i<<2)|0,i=0;ar[A+528+(i<<2)>>2]=ar[n>>2],ar[A+556+(i<<2)>>2]=ar[t>>2],ar[A+584+(i<<2)>>2]=ar[f>>2],(0|(i=i+1|0))<((0|tr[o>>0])-1|0););if(-99999==(0|(i=0|it(r))))return er(e,8,0),0|(A=8);if(ar[(t=A+612|0)>>2]=i+3,-99999==(0|(i=0|it(r))))return er(e,8,0),0|(A=8);if(ar[(o=A+616|0)>>2]=i,-99999==(0|(i=0|it(r))))return er(e,8,0),0|(A=8);if(ar[(f=A+620|0)>>2]=i+2,-99999==(0|(i=0|it(r))))return er(e,8,0),0|(A=8);if(ar[(n=A+624|0)>>2]=i,-99999==(0|(i=0|it(r))))return er(e,8,0),0|(A=8);if(ar[A+628>>2]=i,-99999==(0|(i=0|it(r))))return er(e,8,0),0|(A=8);if(ar[A+632>>2]=i,6<(0|(i=0|ar[t>>2])))return 0|(A=8);if(6<((0|ar[o>>2])+i|0))return 0|(A=8);if(5<(0|(i=0|ar[f>>2])))return 0|(A=8);if(5<((0|ar[n>>2])+i|0))return 0|(A=8);a=255&(0|At(r,1)),tr[A+636>>0]=a;do{if(a<<24>>24){if(a=255&(0|At(r,1)),tr[A+637>>0]=a,i=A+638|0,!(a<<24>>24)){rc(i);break}if(!(i=0|ec(r,0,i,0)))break;return 0|i}}while(0);a=255&(0|At(r,1)),tr[A+4702>>0]=a,a=255&(0|At(r,1)),tr[A+4703>>0]=a,a=255&(0|At(r,1)),tr[A+4704>>0]=a;do{if(a<<24>>24){if(i=1+(0|At(r,4))&255,tr[A+4705>>0]=i,i=1+(0|At(r,4))&255,tr[A+4706>>0]=i,-99999==(0|(i=0|it(r))))return er(e,8,0),0|(A=8);if(ar[A+4708>>2]=i+3,-99999==(0|(i=0|it(r))))return er(e,8,0),0|(A=8);ar[A+4712>>2]=i,i=255&(0|At(r,1));break}tr[A+4705>>0]=0,tr[A+4706>>0]=0,ar[A+4708>>2]=0,ar[A+4712>>2]=0,i=0}while(0);if(tr[A+4716>>0]=i,-99999==(0|(o=0|it(r))))return er(e,8,0),0|(A=8);if(64<o>>>0)return er(e,1014,0),0|(A=8);if(a=A+4720|0,t=0|ar[(n=A+4724|0)>>2],f=0|ar[a>>2],o>>>0<=(i=(t-f|0)/100|0)>>>0){do{if(o>>>0<i>>>0){if((0|t)==(0|(i=f+(100*o|0)|0)))break;ar[n>>2]=t+(100*~(((t+-100-i|0)>>>0)/100|0)|0)}}while(0);0<(0|o)&&(l=87)}else!function(A,e){e|=0;var r,i=0,f=0,n=0,t=0,o=0,a=0;if(n=0|ar[(r=8+(A|=0)|0)>>2],i=0|ar[(a=A+4|0)>>2],e>>>0<=((n-i|0)/100|0)>>>0){do{for(f=i+100|0;((or[i>>1]=0)|(i=i+2|0))<(0|f););i=100+(0|ar[a>>2])|0,ar[a>>2]=i,e=e+-1|0}while(0!=(0|e));return}f=0|ar[A>>2],42949672<(i=(t=(i-f|0)/100|0)+e|0)>>>0&&zl();o=(n=(n-f|0)/100|0)<<1,i=n>>>0<21474836?o>>>0<i>>>0?i:o:42949672;do{if(i){if(!(42949672<i>>>0)){f=0|hu(100*i|0);break}Zu(a=0|X(8),44519),ar[a>>2]=17660,I(0|a,4016,428)}else f=0}while(0);o=f+(100*t|0)|0,t=f+(100*i|0)|0,n=i=o;do{for(f=i+100|0;((or[i>>1]=0)|(i=i+2|0))<(0|f););n=i=n+100|0,e=e+-1|0}while(0!=(0|e));e=0|ar[A>>2],f=(0|ar[a>>2])-e|0,i=o+(100*((0|f)/-100|0)|0)|0,0<(0|f)&&hb(0|i,0|e,0|f);if(ar[A>>2]=i,ar[a>>2]=n,ar[r>>2]=t,!e)return;vu(e)}(a,o-i|0),l=87;A:do{if(87==(0|l)){for(i=0;;){if(!(0|Zc(e,A,r,(0|ar[a>>2])+(100*i|0)|0,i,a,0))){i=1005;break}if((0|o)<=(0|(i=i+1|0)))break A}return 0|i}}while(0);l=255&(0|At(r,1)),tr[A+4732>>0]=l;do{if(l<<24>>24){if(-99999==(0|(i=0|it(r))))return er(e,8,0),0|(A=8);if(32<(0|(ar[(f=A+4736|0)>>2]=i)))return 0|(A=8);if(!(0<(0|i)))break;for(i=0;l=0|At(r,0|ar[c>>2]),ar[A+4740+(i<<2)>>2]=l,l=255&(0|At(r,1)),tr[A+4868+i>>0]=l,(0|(i=i+1|0))<(0|ar[f>>2]););}else ar[A+4736>>2]=0}while(0);l=255&(0|At(r,1)),tr[A+4900>>0]=l,l=255&(0|At(r,1)),tr[A+4901>>0]=l,l=255&(0|At(r,1)),(tr[A+4902>>0]=l)<<24>>24&&function(A,e,r,i){A|=0,e|=0,i|=0;var f,n,t=0,o=0,a=0,c=0;o=0!=(0|At(r|=0,1)),tr[A>>0]=1&o;do{if(o){if((0|(i=0|At(r,8)))<18){or[A+2>>1]=0|or[17796+(i<<2)>>1],i=0|or[17796+(i<<2)+2>>1];break}if(255==(0|i)){i=65535&(0|At(r,16)),or[A+2>>1]=i,i=65535&(0|At(r,16));break}or[A+2>>1]=0,i=0;break}or[A+2>>1]=0,i=0}while(0);or[A+4>>1]=i,o=0!=(0|At(r,1)),tr[A+6>>0]=1&o,o&&(o=0!=(0|At(r,1))&1,tr[A+7>>0]=o);if(ar[(i=A+12|0)>>2]=5,tr[(t=A+16|0)>>0]=0,tr[(f=A+18|0)>>0]=2,tr[(n=A+19|0)>>0]=2,tr[(o=A+20|0)>>0]=2,c=0!=(0|At(r,1)),tr[A+8>>0]=1&c,c&&(c=0|At(r,3),ar[i>>2]=(0|c)<5?c:5,c=0!=(0|At(r,1))&1,tr[t>>0]=c,c=0!=(0|At(r,1)),tr[A+17>>0]=1&c,c)){switch(i=0|At(r,8),c=255&i,(tr[f>>0]=c)<<24>>24){case 3:case 0:a=14;break;default:10<(255&i)>>>0&&(a=14)}switch(14==(0|a)&&(tr[f>>0]=2),i=0|At(r,8),c=255&i,(tr[n>>0]=c)<<24>>24){case 3:case 0:a=17;break;default:17<(254&i)>>>0&&(a=17)}17==(0|a)&&(tr[n>>0]=2),c=0|At(r,8),tr[o>>0]=9<((255&c)-1|0)>>>0?2:255&c}c=0!=(0|At(r,1)),tr[A+21>>0]=1&c;do{if(c){if(-99999==(0|(i=0|it(r))))return er(e,8,0),c=8;if(tr[A+22>>0]=i,-99999==(0|(i=0|it(r))))return er(e,8,0),c=8;i&=255;break}tr[A+22>>0]=0,i=0}while(0);if(tr[A+23>>0]=i,c=0!=(0|At(r,1))&1,tr[A+24>>0]=c,c=0!=(0|At(r,1))&1,tr[A+25>>0]=c,c=0!=(0|At(r,1))&1,tr[A+26>>0]=c,c=0!=(0|At(r,1)),tr[A+27>>0]=1&c,c){if(-99999==(0|(i=0|it(r))))return er(e,8,0),c=8;if(ar[A+28>>2]=i,-99999==(0|(i=0|it(r))))return er(e,8,0),c=8;if(ar[A+32>>2]=i,-99999==(0|(i=0|it(r))))return er(e,8,0),c=8;if(ar[A+36>>2]=i,-99999==(0|(i=0|it(r))))return er(e,8,0),c=8}else ar[A+28>>2]=0,ar[A+32>>2]=0,ar[A+36>>2]=0,i=0;ar[A+40>>2]=i,c=0!=(0|At(r,1)),tr[A+44>>0]=1&c,c&&(c=0|At(r,32),ar[A+48>>2]=c,c=0|At(r,32),ar[A+52>>2]=c);if(i=0!=(0|At(r,1))&1,tr[A+56>>0]=i,-99999==(0|(i=0|it(r))))return er(e,8,0),c=8;if(ar[A+60>>2]=i+1,c=0!=(0|At(r,1)),tr[A+64>>0]=1&c,c)return c=502;c=0!=(0|At(r,1)),tr[A+65>>0]=1&c;do{if(c){if(i=0!=(0|At(r,1))&1,tr[A+66>>0]=i,i=0!=(0|At(r,1))&1,tr[A+67>>0]=i,i=0!=(0|At(r,1))&1,tr[A+68>>0]=i,-99999==(0|(i=0|it(r))))return er(e,8,0),c=8;if(4095<(61440&(or[(t=A+70|0)>>1]=i))>>>0&&(er(e,8,0),or[t>>1]=0),-99999==(0|(i=0|it(r))))return er(e,8,0),c=8;if(16<(255&(tr[(t=A+72|0)>>0]=i))>>>0&&(er(e,8,0),tr[t>>0]=2),-99999==(0|(i=0|it(r))))return er(e,8,0),c=8;if(16<(255&(tr[(t=A+73|0)>>0]=i))>>>0&&(er(e,8,0),tr[t>>0]=1),-99999==(0|(i=0|it(r))))return er(e,8,0),c=8;if(15<(240&(tr[(t=A+74|0)>>0]=i))>>>0&&(er(e,8,0),tr[t>>0]=15),-99999==(0|(t=0|it(r))))return er(e,8,0),c=8;if(15<(240&(tr[(i=A+75|0)>>0]=t))>>>0){er(e,8,0);break}return c=0}tr[A+66>>0]=0,tr[A+67>>0]=1,tr[A+68>>0]=0,or[A+70>>1]=0,tr[A+72>>0]=2,tr[A+73>>0]=1,tr[A+74>>0]=15,i=A+75|0}while(0);tr[i>>0]=15,c=0}(A+4904|0,e,r,A),e=255&(0|At(r,1)),tr[A+4980>>0]=e;do{if(e<<24>>24){if(l=255&(0|At(r,1)),tr[(e=A+4981|0)>>0]=l,l=255&(0|At(r,1)),tr[A+4982>>0]=l,l=255&(0|At(r,6)),tr[A+4983>>0]=l,!(0|tr[e>>0]))break;ic(A+4984|0,0,r)}else tr[A+4981>>0]=0}while(0);return 0|(i=0|function(A){var e,r,i,f,n,t,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0;s=0|ar[476+(A|=0)>>2],a=0|ar[7988+(s<<2)>>2],ar[A+5016>>2]=a,c=0|ar[8004+(s<<2)>>2],ar[A+5020>>2]=c,d=0==(0|ar[A+5012>>2]),ar[A+5024>>2]=d?1:a,ar[A+5028>>2]=d?1:c,d=0|ar[A+512>>2],ar[A+4996>>2]=d,ar[A+5e3>>2]=(6*d|0)-48,e=0|ar[A+516>>2],ar[A+5004>>2]=e,ar[A+5008>>2]=(6*e|0)-48,r=0|ar[A+612>>2],ar[A+5036>>2]=r,i=(0|ar[A+616>>2])+r|0,ar[A+5040>>2]=i,f=1<<r,ar[A+5044>>2]=f,o=1<<i,ar[A+5048>>2]=o,n=0|ar[A+484>>2],b=(f-1+n|0)/(0|f)|0,ar[A+5052>>2]=b,l=(n-1+o|0)/(0|o)|0,ar[A+5056>>2]=l,t=0|ar[A+488>>2],k=((u=t-1|0)+f|0)/(0|f)|0,ar[A+5060>>2]=k,u=(u+o|0)/(0|o)|0,ar[A+5064>>2]=u,b=0|br(k,b),ar[A+5068>>2]=b,b=0|br(u,l),ar[A+5072>>2]=b,b=0|br(t,n),ar[A+5076>>2]=b,o=0!=(0|s)&&0==(0|tr[A+480>>0])?(ar[A+5080>>2]=(0|o)/(0|a)|0,(0|o)/(0|c)|0):(ar[A+5080>>2]=0,0);if(ar[A+5084>>2]=o,b=0|ar[A+620>>2],ar[A+5100>>2]=b,s=(0|ar[A+624>>2])+b|0,ar[A+5104>>2]=s,o=i-b|0,(0|ar[A+628>>2])>(0|o))return 0|(k=8);if((0|ar[A+632>>2])>(0|o))return 0|(k=8);k=r-1|0,ar[A+5108>>2]=k,k=i-k|0,ar[A+5112>>2]=l<<k,ar[A+5116>>2]=u<<k,k=0|ar[A+4708>>2],ar[A+5120>>2]=k,ar[A+5124>>2]=(0|ar[A+4712>>2])+k,k=l<<o,ar[A+5088>>2]=k,u<<=o,ar[A+5092>>2]=u,k=0|br(u,k),ar[A+5096>>2]=k,l=0|tr[A+4990>>0]?(a=o=0,c=1<<e-1,1<<d+-1):(o=248+e&255,a=d+248&255,c=128);if(tr[A+5156>>0]=a,tr[A+5157>>0]=o,ar[A+5160>>2]=l,ar[A+5164>>2]=c,(0|n)%(0|f)|0)return 0|(k=8);if(0!=((0|t)%(0|f)|0)|(0|r)<(0|b))return 0|(k=8);if((0|((0|i)<5?i:5))<(0|s)|8<(d+-8|0)>>>0|8<(e-8|0)>>>0)return 0|(k=8);return tr[A>>0]=1,(k=0)|k}(A))?0|(A=i):(tr[A>>0]=1,(A=0)|A)}}return 0}(r,A+4|0,e))?(A=e,Ac(r),ur=i,0|A):(-1<(0|(e=0|ar[A+516>>2]))&&function(A,e){A|=0;var r,i,f,n,t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p,y,B,E,X,W,I,C,G,V,F,R,N,_,Y,Q,D,J,M,T,U,S,O,z,j,H,x,P,L,K=0,q=0,$=0,AA=0,eA=0,rA=0,iA=0,fA=0,nA=0,tA=0,oA=0,aA=0,cA=0,lA=0,uA=0,bA=0;switch(ur=(L=ur)+496|0,P=L+480|0,x=L+472|0,H=L+464|0,j=L+456|0,z=L+448|0,O=L+440|0,S=L+432|0,U=L+424|0,T=L+416|0,M=L+408|0,J=L+400|0,D=L+392|0,bA=L+384|0,Q=L+376|0,Y=L+368|0,_=L+360|0,N=L+344|0,lA=L+336|0,cA=L+328|0,F=L+320|0,V=L+312|0,y=L+304|0,p=L+296|0,Z=L+288|0,g=L+280|0,G=L+272|0,C=L+264|0,aA=L+256|0,I=L+248|0,W=L+240|0,X=L+232|0,h=L+224|0,k=L+216|0,d=L+208|0,s=L+200|0,oA=L+192|0,tA=L+184|0,E=L+176|0,B=L+168|0,m=L+160|0,v=L+152|0,w=L+144|0,nA=L+136|0,b=L+128|0,u=L+120|0,l=L+112|0,c=L+104|0,a=L+96|0,o=L+88|0,t=L+80|0,n=L+72|0,fA=L+64|0,f=L+56|0,i=L+48|0,r=L+40|0,rA=L+32|0,eA=L+24|0,AA=L+16|0,$=L+8|0,q=L,0|(e|=0)){case 1:K=10172;break;case 2:K=10676;break;default:return ur=L}switch(Pn(R=0|ar[K>>2],41865,q),ar[$>>2]=tr[A+1>>0],Pn(R,41906,$),iA=A+2|0,ar[AA>>2]=tr[iA>>0],Pn(R,41936,AA),ar[eA>>2]=tr[A+3>>0],Pn(R,41966,eA),function(A,e,r){e|=0;var i,f,n;{if(ur=(n=ur)+16|0,f=n,$n(A|=0,1,r|=0),i=e+-1|0,!(1<(0|e)))return ur=n;e=0}for(;ar[f>>2]=e,Pn(r,44849,f),$n(A+52+(52*e|0)|0,0,r),e=e+1|0,(0|e)!=(0|i););ur=n}(A+4|0,0|tr[iA>>0],R),ar[rA>>2]=ar[A+472>>2],Pn(R,42001,rA),0|(q=0|ar[(K=A+476|0)>>2])){case 0:$=42045;break;case 1:$=42056;break;case 2:$=42062;break;default:$=3==(0|q)?42031:42037}ar[r>>2]=q,ar[4+r>>2]=$,Pn(R,42068,r),3==(0|ar[K>>2])&&(ar[i>>2]=tr[A+480>>0],Pn(R,42103,i));ar[f>>2]=ar[A+484>>2],Pn(R,42136,f),ar[fA>>2]=ar[A+488>>2],Pn(R,42169,fA),fA=A+492|0,ar[n>>2]=tr[fA>>0],Pn(R,42202,n),0|tr[fA>>0]&&(ar[t>>2]=ar[A+496>>2],Pn(R,42235,t),ar[o>>2]=ar[A+500>>2],Pn(R,42263,o),ar[a>>2]=ar[A+504>>2],Pn(R,42291,a),ar[c>>2]=ar[A+508>>2],Pn(R,42319,c));if(ar[l>>2]=ar[A+512>>2],Pn(R,42347,l),ar[u>>2]=ar[A+516>>2],Pn(R,42370,u),ar[b>>2]=ar[A+520>>2],Pn(R,42393,b),K=A+524|0,ar[nA>>2]=tr[K>>0],Pn(R,42426,nA),nA=0|tr[iA>>0],(0|(K=0==(0|tr[K>>0])?(nA<<24>>24)-1|0:0))<(nA<<24>>24|0))for(;ar[s>>2]=K,Pn(R,42756,s),ar[d>>2]=ar[A+528+(K<<2)>>2],Pn(R,42766,d),ar[k>>2]=ar[A+556+(K<<2)>>2],Pn(R,42805,k),ar[h>>2]=ar[A+584+(K<<2)>>2],Pn(R,42844,h),K=K+1|0,(0|K)<(0|tr[iA>>0]););iA=A+612|0,ar[w>>2]=ar[iA>>2],Pn(R,42473,w),rA=A+616|0,ar[v>>2]=ar[rA>>2],Pn(R,42511,v),eA=A+620|0,ar[m>>2]=ar[eA>>2],Pn(R,42558,m),AA=A+624|0,ar[B>>2]=ar[AA>>2],Pn(R,42596,B),ar[E>>2]=ar[A+628>>2],Pn(R,42641,E),ar[tA>>2]=ar[A+632>>2],Pn(R,42683,tA),tA=A+636|0,ar[oA>>2]=tr[tA>>0],Pn(R,42725,oA),0|tr[tA>>0]&&(oA=A+637|0,ar[X>>2]=tr[oA>>0],Pn(R,42883,X),0|tr[oA>>0])&&Pn(R,42924,W);ar[I>>2]=tr[A+4702>>0],Pn(R,42968,I),ar[aA>>2]=tr[A+4703>>0],Pn(R,43010,aA),aA=A+4704|0,ar[C>>2]=tr[aA>>0],Pn(R,43052,C),0|tr[aA>>0]&&(ar[G>>2]=tr[A+4705>>0],Pn(R,43094,G),ar[g>>2]=tr[A+4706>>0],Pn(R,43130,g),ar[Z>>2]=ar[A+4708>>2],Pn(R,43166,Z),ar[p>>2]=ar[A+4712>>2],Pn(R,43208,p),ar[y>>2]=tr[A+4716>>0],Pn(R,43259,y));if(q=A+4720|0,$=A+4724|0,ar[V>>2]=((0|ar[$>>2])-(0|ar[q>>2])|0)/100|0,Pn(R,43295,V),(0|ar[$>>2])!=(0|ar[q>>2]))for(K=0;ar[cA>>2]=K,Pn(R,43367,cA),pc((0|ar[q>>2])+(100*K|0)|0,16,R),(K=K+1|0)>>>0<(((0|ar[$>>2])-(0|ar[q>>2])|0)/100|0)>>>0;);if(cA=A+4732|0,ar[F>>2]=tr[cA>>0],Pn(R,43329,F),0|tr[cA>>0]&&(uA=A+4736|0,ar[lA>>2]=ar[uA>>2],Pn(R,43388,lA),0<(0|ar[uA>>2])))for(K=0;cA=0|ar[A+4740+(K<<2)>>2],lA=0|tr[A+4868+K>>0],ar[N>>2]=K,ar[4+N>>2]=cA,ar[8+N>>2]=lA,Pn(R,43421,N),(0|(K=K+1|0))<(0|ar[uA>>2]););ar[_>>2]=tr[A+4900>>0],Pn(R,43490,_),ar[Y>>2]=tr[A+4901>>0],Pn(R,43531,Y),K=A+4902|0,ar[Q>>2]=tr[K>>0],Pn(R,43572,Q),ar[bA>>2]=tr[A+4980>>0],Pn(R,43613,bA),bA=A+4981|0,ar[D>>2]=tr[bA>>0],Pn(R,43649,D),ar[J>>2]=tr[A+4982>>0],Pn(R,43685,J),ar[M>>2]=tr[A+4983>>0],Pn(R,43721,M),ar[T>>2]=ar[A+5048>>2],Pn(R,43757,T),ar[U>>2]=ar[A+5044>>2],Pn(R,43776,U),ar[S>>2]=1<<(0|ar[rA>>2])+(0|ar[iA>>2]),Pn(R,43795,S),ar[O>>2]=1<<ar[eA>>2],Pn(R,43814,O),ar[z>>2]=1<<(0|ar[AA>>2])+(0|ar[eA>>2]),Pn(R,43833,z),ar[j>>2]=ar[A+5056>>2],Pn(R,43852,j),ar[H>>2]=ar[A+5064>>2],Pn(R,43882,H),ar[x>>2]=ar[A+5016>>2],Pn(R,43912,x),ar[P>>2]=ar[A+5020>>2],Pn(R,43942,P),0|tr[bA>>0]&&function(A,e){A|=0;var r,i,f,n,t,o,a,c,l,u,b;switch(ur=(b=ur)+80|0,a=b+72|0,o=b+64|0,t=b+56|0,n=b+48|0,f=b+40|0,u=b+32|0,l=b+24|0,c=b+16|0,i=b+8|0,r=b,0|(e|=0)){case 1:e=10172;break;case 2:e=10676;break;default:return ur=b}Pn(e=0|ar[e>>2],43972,r),ar[i>>2]=cr[A>>0],Pn(e,44029,i),ar[c>>2]=cr[A+1>>0],Pn(e,44075,c),ar[l>>2]=cr[A+2>>0],Pn(e,44121,l),ar[u>>2]=cr[A+3>>0],Pn(e,44167,u),ar[f>>2]=cr[A+4>>0],Pn(e,44213,f),ar[n>>2]=cr[A+5>>0],Pn(e,44259,n),ar[t>>2]=cr[A+6>>0],Pn(e,44305,t),ar[o>>2]=cr[A+7>>0],Pn(e,44351,o),ar[a>>2]=cr[A+8>>0],Pn(e,44397,a),ur=b}(A+4984|0,e);0|tr[K>>0]&&function(A,e){A|=0;var r,i,f,n,t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p,y,B,E,X,W,I,C,G,V,F,R,N,_,Y=0,Q=0,D=0,J=0,M=0;switch(ur=(_=ur)+304|0,a=_+288|0,o=_+280|0,t=_+272|0,N=_+264|0,R=_+256|0,F=_+248|0,V=_+240|0,G=_+232|0,C=_+224|0,M=_+216|0,I=_+208|0,W=_+200|0,X=_+192|0,E=_+184|0,B=_+176|0,J=_+168|0,y=_+160|0,p=_+152|0,Z=_+144|0,g=_+136|0,m=_+128|0,v=_+120|0,w=_+112|0,h=_+104|0,k=_+96|0,d=_+88|0,D=_+80|0,s=_+72|0,b=_+64|0,u=_+56|0,l=_+48|0,c=_+40|0,f=_+32|0,Q=_+24|0,n=_+16|0,i=_+8|0,Y=_,0|(e|=0)){case 1:e=10172;break;case 2:e=10676;break;default:return ur=_}if(Pn(r=0|ar[e>>2],45969,Y),Y=0|lr[A+4>>1],ar[i>>2]=lr[A+2>>1],ar[4+i>>2]=Y,Pn(r,46010,i),ar[n>>2]=cr[A+6>>0],Pn(r,46046,n),ar[Q>>2]=cr[A+7>>0],Pn(r,46079,Q),Q=A+8|0,ar[f>>2]=cr[Q>>0],Pn(r,46112,f),0|tr[Q>>0]){switch(0|ar[A+12>>2]){case 0:e=45959;break;case 1:e=45955;break;case 2:e=45950;break;case 3:e=45944;break;case 4:e=45940;break;default:e=45928}ar[c>>2]=e,Pn(r,46148,c),ar[l>>2]=cr[A+16>>0],Pn(r,46184,l),ar[u>>2]=cr[A+17>>0],Pn(r,46220,u),ar[b>>2]=cr[A+18>>0],Pn(r,46260,b),ar[s>>2]=cr[A+19>>0],Pn(r,46296,s),ar[D>>2]=cr[A+20>>0],Pn(r,46332,D)}D=A+21|0,ar[d>>2]=cr[D>>0],Pn(r,46368,d),0|tr[D>>0]&&(ar[k>>2]=cr[A+22>>0],Pn(r,46402,k),ar[h>>2]=cr[A+23>>0],Pn(r,46445,h));ar[w>>2]=cr[A+24>>0],Pn(r,46488,w),ar[v>>2]=cr[A+25>>0],Pn(r,46524,v),ar[m>>2]=cr[A+26>>0],Pn(r,46560,m),ar[g>>2]=cr[A+27>>0],Pn(r,46596,g),ar[Z>>2]=ar[A+28>>2],Pn(r,46632,Z),ar[p>>2]=ar[A+32>>2],Pn(r,46668,p),ar[y>>2]=ar[A+36>>2],Pn(r,46704,y),ar[J>>2]=ar[A+40>>2],Pn(r,46740,J),J=A+44|0,ar[B>>2]=cr[J>>0],Pn(r,46776,B),0|tr[J>>0]&&(ar[E>>2]=ar[A+48>>2],Pn(r,46812,E),ar[X>>2]=ar[A+52>>2],Pn(r,46848,X));ar[W>>2]=cr[A+56>>0],Pn(r,46884,W),ar[I>>2]=ar[A+60>>2],Pn(r,46926,I),ar[M>>2]=cr[A+64>>0],Pn(r,46968,M),M=A+65|0,ar[C>>2]=cr[M>>0],Pn(r,47006,C),0|tr[M>>0]&&(ar[G>>2]=cr[A+66>>0],Pn(r,47047,G),ar[V>>2]=cr[A+67>>0],Pn(r,47088,V),ar[F>>2]=cr[A+68>>0],Pn(r,47136,F),ar[R>>2]=lr[A+70>>1],Pn(r,47177,R),ar[N>>2]=cr[A+72>>0],Pn(r,47218,N),ar[t>>2]=cr[A+73>>0],Pn(r,47259,t),ar[o>>2]=cr[A+74>>0],Pn(r,47300,o),ar[a>>2]=cr[A+75>>0],Pn(r,47341,a)),ur=_}(A+4904|0,e),ur=L}(r,e),hb(0|(f=A+11096+(5168*(e=0|ar[r+472>>2])|0)|0),0|r,4717),(0|f)!=(0|r)&&Ke(A+11096+(5168*e|0)+4720|0,0|ar[r+4720>>2],0|ar[r+4724>>2]),hb(A+11096+(5168*e|0)+4732|0,r+4732|0,436),f=0,Ac(r),ur=i,0|f)}function Ke(A,e,r){var i,f,n,t=0,o=0,a=0,c=0,l=0;if((a=(0|(c=(i=r|=0)-(e|=0)|0))/100|0)>>>0<=(((t=0|ar[(f=(A|=0)+8|0)>>2])-(n=l=0|ar[A>>2])|0)/100|0)>>>0)return 0|(t=(o=a=(A=(o=((0|ar[(c=A+4|0)>>2])-l|0)/100|0)>>>0<a>>>0)?e+(100*o|0)|0:r)-e|0)&&wb(0|l,0|e,0|t),r=n+(100*((0|t)/100|0)|0)|0,A?!((0|(t=i-o|0))<=0)&&(hb(0|ar[c>>2],0|a,0|t),void(ar[c>>2]=(0|ar[c>>2])+(100*((t>>>0)/100|0)|0))):(0|(t=0|ar[c>>2]))!=(0|r)&&void(ar[c>>2]=t+(100*~(((t+-100-r|0)>>>0)/100|0)|0));(o=l)&&((0|(r=0|ar[(t=A+4|0)>>2]))!=(0|n)&&(ar[t>>2]=r+(100*~(((r+-100-l|0)>>>0)/100|0)|0)),vu(o),ar[f>>2]=0,ar[t>>2]=0,t=ar[A>>2]=0),42949672<a>>>0&&zl(),t=(l=(0|t)/100|0)<<1,42949672<(t=l>>>0<21474836?t>>>0<a>>>0?a:t:42949672)>>>0&&zl(),r=0|hu(100*t|0),ar[(o=A+4|0)>>2]=r,ar[A>>2]=r,ar[f>>2]=r+(100*t|0),(0|c)<=0||(hb(0|r,0|e,0|c),ar[o>>2]=r+(100*((c>>>0)/100|0)|0))}function qe(A,e){A|=0,e|=0;var r,i,f,n=0;return ur=(f=ur)+4400|0,Ia(i=f),r=0|function(A,e,r){e|=0,r|=0;var i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0;if(Ca(A|=0,0),u=0|it(e),63<(0|(tr[A+1>>0]=u))|-99999==(0|u))return er(r+4|0,1009,0),(r=0)|r;if(u=0|it(e),63<(0|(tr[(n=A+2|0)>>0]=u))|-99999==(0|u))return er(r+4|0,1010,0),(r=0)|r;if(u=255&(0|At(e,1)),tr[A+3>>0]=u,u=255&(0|At(e,1)),tr[A+31>>0]=u,u=255&(0|At(e,3)),tr[A+4132>>0]=u,u=255&(0|At(e,1)),tr[A+4>>0]=u,u=255&(0|At(e,1)),tr[A+5>>0]=u,u=0|it(e),i=255&u,tr[(f=A+6|0)>>0]=i,-99999==(0|u))return er(r+4|0,1006,0),(r=0)|r;if(tr[f>>0]=i+1<<24>>24,u=0|it(e),i=255&u,tr[(f=A+7|0)>>0]=i,-99999==(0|u))return er(r+4|0,1006,0),(r=0)|r;if(tr[f>>0]=i+1<<24>>24,l=0|tr[n>>0],!(0|tr[(u=r+11096+(5168*l|0)|0)>>0]))return er(r+4|0,1010,0),(r=0)|r;if(i=0|ft(e),-99999==(0|(ar[(f=A+8|0)>>2]=i)))return er(r+4|0,1006,0),(r=0)|r;if(ar[f>>2]=i+26,c=255&(0|At(e,1)),tr[A+12>>0]=c,c=255&(0|At(e,1)),tr[A+13>>0]=c,c=255&(0|At(e,1)),(tr[A+14>>0]=c)<<24>>24){if(c=0|it(e),-99999==(0|(ar[A+16>>2]=c)))return er(r+4|0,1006,0),(r=0)|r}else ar[A+16>>2]=0;if(c=0|ft(e),-99999==(0|(ar[A+20>>2]=c)))return er(r+4|0,1006,0),(r=0)|r;if(c=0|ft(e),-99999==(0|(ar[A+24>>2]=c)))return er(r+4|0,1006,0),(r=0)|r;if(a=255&(0|At(e,1)),tr[A+28>>0]=a,a=255&(0|At(e,1)),tr[A+29>>0]=a,a=255&(0|At(e,1)),tr[A+30>>0]=a,a=255&(0|At(e,1)),tr[A+32>>0]=a,a=255&(0|At(e,1)),tr[(c=A+34|0)>>0]=a,a=255&(0|At(e,1)),tr[A+33>>0]=a,0|tr[c>>0]){if(i=0|it(e),-99999==(0|(ar[(a=A+36|0)>>2]=i))|9<(0|i))return er(r+4|0,1006,0),(r=0)|r;if(ar[a>>2]=i+1,i=0|it(e),-99999==(0|(ar[(c=A+40|0)>>2]=i))|9<(0|i))return er(r+4|0,1006,0),(r=0)|r;ar[c>>2]=i+1,o=0|At(e,1),tr[A+44>>0]=o;do{if(!(255&o)){n=0|ar[r+11096+(5168*l|0)+5056>>2],f=0|ar[r+11096+(5168*l|0)+5064>>2],o=0|ar[a>>2],i=o+-1|0;A:do{if(1<(0|o)){for(o=0;i=0|it(e),-99999!=(0|(ar[(t=A+4172+(o<<2)|0)>>2]=i));)if(i=i+1|0,ar[t>>2]=i,n=n-i|0,o=o+1|0,(0|(i=(0|ar[a>>2])-1|0))<=(0|o))break A;return er(r+4|0,1006,0),(r=0)|r}}while(0);if((0|n)<1)return(r=0)|r;ar[A+4172+(i<<2)>>2]=n,a=0|ar[c>>2],i=a+-1|0;A:do{if(1<(0|a)){for(t=0;i=0|it(e),-99999!=(0|(ar[(n=A+4212+(t<<2)|0)>>2]=i));)if(i=i+1|0,ar[n>>2]=i,f=f-i|0,t=t+1|0,(0|(i=(0|ar[c>>2])-1|0))<=(0|t))break A;return er(r+4|0,1006,0),(r=0)|r}}while(0);if((0|f)<1)return(r=0)|r;ar[A+4212+(i<<2)>>2]=f;break}}while(0);i=255&(0|At(e,1))}else ar[A+36>>2]=1,ar[A+40>>2]=1,tr[A+44>>0]=1,i=0;tr[A+45>>0]=i,ar[(i=A+52|0)>>2]=0,ar[(n=A+56|0)>>2]=0,c=255&(0|At(e,1)),tr[A+46>>0]=c,c=255&(0|At(e,1)),tr[A+47>>0]=c;do{if(c<<24>>24){if(c=255&(0|At(e,1)),tr[A+48>>0]=c,c=255&(0|At(e,1)),!((tr[A+49>>0]=c)<<24>>24)){if(f=0|ft(e),-99999==(0|(ar[i>>2]=f)))return er(r+4|0,1006,0),(r=0)|r;if(ar[i>>2]=f<<1,i=0|ft(e),-99999==(0|(ar[n>>2]=i)))return er(r+4|0,1006,0),(r=0)|r;ar[n>>2]=i<<1;break}}else tr[A+48>>0]=0,tr[A+49>>0]=0}while(0);if(c=0|At(e,1),i=255&c,tr[A+60>>0]=i,0!=(255&c|0)&&0==(0|tr[r+11096+(5168*l|0)+636>>0]))return er(r+4|0,1006,0),(r=0)|r;if(i<<24>>24){if(0|(i=0|ec(e,u,A+61|0,1)))return er(r+4|0,i,0),(r=0)|r}else hb(A+61|0,r+11096+(5168*l|0)+638|0,4064);if(i=255&(0|At(e,1)),tr[A+4125>>0]=i,i=0|it(e),-99999==(0|(ar[(f=A+4128|0)>>2]=i)))return er(r+4|0,1006,0),(r=0)|r;if(ar[f>>2]=i+2,(0|i)>((0|ar[r+11096+(5168*l|0)+612>>2])-2+(0|ar[r+11096+(5168*l|0)+616>>2])|0))return(r=0)|r;return l=255&(0|At(e,1)),tr[A+4133>>0]=l,l=255&(0|At(e,1)),!((tr[A+4134>>0]=l)<<24>>24&&(c=255&(0|At(e,1)),tr[(l=A+4135|0)>>0]=c,c=255&(0|At(e,1)),tr[A+4136>>0]=c,c=255&(0|At(e,6)),tr[A+4137>>0]=c,0|tr[l>>0]))||0|function(A,e,r,i){A|=0,e|=0,r|=0;var f,n=0,t=0,o=0;f=0|tr[2+(i|=0)>>0],0|tr[i+13>>0]&&(t=2+(0|it(e))&255,tr[A>>0]=t);t=0!=(0|At(e,1)),tr[A+1>>0]=1&t,3==(0|ar[(n=r+11096+(5168*f|0)+5012|0)>>2])|1^t||er(r+4|0,1006,0);o=0!=(0|At(e,1)),i=1&o,tr[(t=A+2|0)>>0]=i,0!=(0|ar[n>>2])|1^o||(er(r+4|0,1006,0),i=0|tr[t>>0]);A:do{if(i<<24>>24){if(-99999!=(0|(i=0|it(e)))&&(0|i)<=(0|ar[r+11096+(5168*f|0)+616>>2])){if(tr[A+3>>0]=i,-99999==(0|(i=0|it(e)))|5<(0|i))return er(r+4|0,1006,0),(o=0)|o;if(o=i+1|0,!(255&(tr[(t=A+4|0)>>0]=o)))break;for(n=0;;){if(24<((i=0|ft(e))+12|0)>>>0){i=15;break}if(tr[A+5+n>>0]=i,24<((i=0|ft(e))+12|0)>>>0){i=17;break}if(tr[A+11+n>>0]=i,(0|(n=n+1|0))>=(0|cr[t>>0]))break A}if(15==(0|i))return er(r+4|0,1006,0),(o=0)|o;if(17==(0|i))return er(r+4|0,1006,0),(o=0)|o}return er(r+4|0,1006,0),(o=0)|o}}while(0);if(-99999!=(0|(i=0|it(e)))&&(o=0|ar[r+11096+(5168*f|0)+4996>>2],(0|i)<=(0|((0|o)<10?0:o+-10|0))))return tr[A+17>>0]=i,-99999!=(0|(i=0|it(e)))&&(o=0|ar[r+11096+(5168*f|0)+5004>>2],(0|i)<=(0|((0|o)<10?0:o+-10|0)))?(tr[A+18>>0]=i,0|(o=1)):(er(r+4|0,1006,0),(o=0)|o);return er(r+4|0,1006,0),(o=0)|o}(A+4138|0,e,r,A)?(function(A,e){A|=0;var r,i,f,n,t,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0;if(t=ur,y=0|ar[(n=5040+(e|=0)|0)>>2],ar[A+4160>>2]=y-(0|ar[A+16>>2]),ar[A+4164>>2]=y-(0|cr[A+4141>>0]),ar[A+4168>>2]=cr[A+4138>>0],y=A+36|0,0|tr[A+44>>0]){if(a=0|ar[y>>2],ur=(l=ur)+(15+(4+(a<<2)|0)&-16)|0,0<=(0|a)){for(c=0|ar[e+5056>>2],o=0;B=(0|br(c,o))/(0|a)|0,ar[l+(o<<2)>>2]=B,(0|o)!=(0|a);)o=o+1|0;if(0<(0|a))for(a=(o=0)|ar[l>>2];p=a,a=0|ar[l+((o=(B=o)+1|0)<<2)>>2],ar[A+4172+(B<<2)>>2]=a-p,(0|o)<(0|ar[y>>2]););}if(a=0|ar[(l=A+40|0)>>2],ur=(u=ur)+(15+(4+(a<<2)|0)&-16)|0,0<=(0|a)){for(c=0|ar[e+5064>>2],o=0;B=(0|br(c,o))/(0|a)|0,ar[u+(o<<2)>>2]=B,(0|o)!=(0|a);)o=o+1|0;if(0<(0|a))for(a=(o=0)|ar[u>>2];p=a,a=0|ar[u+((o=(B=o)+1|0)<<2)>>2],ar[A+4212+(B<<2)>>2]=a-p,(0|o)<(0|ar[l>>2]););}}if(ar[A+4252>>2]=0,0<(0|ar[y>>2]))for(a=o=0;a=(0|ar[A+4172+(o<<2)>>2])+a|0,ar[A+4252+((o=o+1|0)<<2)>>2]=a,(0|o)<(0|ar[y>>2]););if(ar[A+4296>>2]=0,0<(0|ar[(p=A+40|0)>>2]))for(a=o=0;o=(0|ar[A+4212+(a<<2)>>2])+o|0,ar[A+4296+((a=a+1|0)<<2)>>2]=o,(0|a)<(0|ar[p>>2]););B=A+4340|0,a=0|ar[(v=e+5072|0)>>2],u=0|ar[(o=A+4344|0)>>2],l=0|ar[B>>2],a>>>0<=(c=u-l>>2)>>>0?a>>>0<c>>>0&&(0|u)!=(0|(b=l+(a<<2)|0))&&(ar[o>>2]=u+(~((u+-4-b|0)>>>2)<<2)):(Va(B,a-c|0),a=0|ar[v>>2]);w=A+4352|0,l=0|ar[(u=A+4356|0)>>2],c=0|ar[w>>2],a>>>0<=(o=l-c>>2)>>>0?a>>>0<o>>>0&&(0|l)!=(0|(s=c+(a<<2)|0))&&(ar[u>>2]=l+(~((l+-4-s|0)>>>2)<<2)):(Va(w,a-o|0),a=0|ar[v>>2]);i=A+4364|0,u=0|ar[(o=A+4368|0)>>2],l=0|ar[i>>2],a>>>0<=(c=u-l>>2)>>>0?a>>>0<c>>>0&&(0|u)!=(0|(d=l+(a<<2)|0))&&(ar[o>>2]=u+(~((u+-4-d|0)>>>2)<<2)):(Va(i,a-c|0),a=0|ar[v>>2]);r=A+4376|0,u=0|ar[(o=A+4380|0)>>2],l=0|ar[r>>2],a>>>0<=(c=u-l>>2)>>>0?a>>>0<c>>>0&&(0|u)!=(0|(k=l+(a<<2)|0))&&(ar[o>>2]=u+(~((u+-4-k|0)>>>2)<<2)):Va(r,a-c|0);f=A+4388|0,o=0|ar[e+5096>>2],u=0|ar[(a=A+4392|0)>>2],l=0|ar[f>>2],o>>>0<=(c=u-l>>2)>>>0?o>>>0<c>>>0&&(0|u)!=(0|(h=l+(o<<2)|0))&&(ar[a>>2]=u+(~((u+-4-h|0)>>>2)<<2)):Va(f,o-c|0);A:do{if(0<(0|ar[v>>2])){for(d=e+5056|0,s=0;;){if(h=0|ar[d>>2],k=(0|s)%(0|h)|0,h=(0|s)/(0|h)|0,0<(0|(c=0|ar[y>>2])))for(a=0,o=-1;o=(0|k)<(0|ar[A+4252+(a<<2)>>2])?o:a,(0|(a=a+1|0))<(0|c););else o=-1;if(0<(0|(l=0|ar[p>>2])))for(c=0,a=-1;a=(0|h)<(0|ar[A+4296+(c<<2)>>2])?a:c,(0|(c=c+1|0))<(0|l););else a=-1;if(b=(0|ar[B>>2])+(s<<2)|0,(ar[b>>2]=0)<(0|o))for(u=A+4212+(a<<2)|0,c=l=0;c=c+(0|br(0|ar[A+4172+(l<<2)>>2],0|ar[u>>2]))|0,ar[b>>2]=c,(0|(l=l+1|0))!=(0|o););else c=0;if(0<(0|a))for(l=0;c=c+(0|br(0|ar[A+4212+(l<<2)>>2],0|ar[d>>2]))|0,ar[b>>2]=c,(0|(l=l+1|0))!=(0|a););if((a|o|0)<=-1)break;if(Z=c+(0|br(h-(0|ar[A+4296+(a<<2)>>2])|0,0|ar[A+4172+(o<<2)>>2]))|0,ar[b>>2]=Z,Z=k-(0|ar[A+4252+(o<<2)>>2])+Z|0,ar[b>>2]=Z,(0|(s=(ar[(0|ar[w>>2])+(Z<<2)>>2]=s)+1|0))>=(0|ar[v>>2]))break A}sr(37364,37385,618,37392)}}while(0);if(0<(0|(o=0|ar[p>>2]))){Z=e+5056|0,a=(c=l=0)|ar[y>>2];do{if(0<(0|a)){g=A+4296+(c<<2)|0,w=l,o=(v=0)|ar[(m=A+4296+((c=c+1|0)<<2)|0)>>2];do{if(u=0|ar[g>>2],v=(l=v)+1|0,(0|u)<(0|o)){k=A+4252+(l<<2)|0,a=0|ar[(h=A+4252+(v<<2)|0)>>2];do{if((0|(d=0|ar[k>>2]))<(0|a)){for(l=0|ar[B>>2],b=0|ar[i>>2],s=0|ar[r>>2],o=d;a=l+((0|br(0|ar[Z>>2],u))+o<<2)|0,ar[b+(ar[a>>2]<<2)>>2]=w,a=s+((0|br(0|ar[Z>>2],u))+o<<2)|0,ar[a>>2]=w,o=o+1|0,a=0|ar[h>>2],(0|o)<(0|a););o=0|ar[m>>2]}u=u+1|0}while((0|u)<(0|o));a=0|ar[y>>2]}w=w+1|0}while((0|v)<(0|a));l=w,o=0|ar[p>>2]}else c=c+1|0}while((0|c)<(0|o))}if((0|(o=0|ar[(k=e+5092|0)>>2]))<=0)return ur=t;w=e+5100|0,d=e+5056|0,a=0|ar[(h=e+5088|(s=0))>>2];do{if(0<(0|a)){u=0|ar[B>>2],b=0|ar[f>>2],l=0;do{if(e=0|ar[w>>2],A=0|ar[n>>2],y=u+((0|br(0|ar[d>>2],s<<e>>A))+(l<<e>>A)<<2)|0,o=b+((0|br(a,s))+l<<2)|0,ar[o>>2]=ar[y>>2]<<(A-e<<1),o=0|ar[n>>2],(0|(a=0|ar[w>>2]))<(0|o))for(c=o-a|0,o=a=0;o=(0==((e=1<<a)&s|0)?0:e<<1<<a)+o+(0==(e&l|0)?0:e<<a)|0,(0|(a=a+1|0))<(0|c););else o=0;a=b+((0|br(0|ar[h>>2],s))+l<<2)|0,ar[a>>2]=(0|ar[a>>2])+o,l=l+1|0,a=0|ar[h>>2]}while((0|l)<(0|a));o=0|ar[k>>2]}s=s+1|0}while((0|s)<(0|o));ur=t}(A,u),tr[A>>0]=1,0|(r=1)):(r=0)|r}(i,e,A),-1<(0|(e=0|ar[A+524>>2]))&&function(A,e){A|=0;var r,i,f,n,t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p,y,B,E,X,W,I,C,G,V,F,R,N,_,Y,Q,D,J,M,T,U,S,O,z,j,H,x,P=0,L=0,K=0,q=0,$=0,AA=0;switch(ur=(x=ur)+400|0,U=x+392|0,T=x+384|0,M=x+376|0,J=x+368|0,D=x+360|0,Q=x+352|0,Y=x+344|0,_=x+336|0,N=x+328|0,R=x+320|0,F=x+312|0,V=x+304|0,G=x+296|0,C=x+288|0,AA=x+280|0,H=x+272|0,j=x+264|0,$=x+256|0,z=x+248|0,O=x+240|0,S=x+232|0,I=x+224|0,W=x+216|0,X=x+208|0,B=x+200|0,y=x+192|0,p=x+184|0,Z=x+176|0,g=x+168|0,v=x+160|0,w=x+152|0,h=x+144|0,k=x+136|0,d=x+128|0,s=x+120|0,b=x+112|0,u=x+104|0,l=x+96|0,c=x+88|0,o=x+80|0,t=x+72|0,n=x+64|0,f=x+56|0,i=x+48|0,r=x+40|0,q=x+32|0,m=x+24|0,a=x+16|0,K=x+8|0,L=x,0|(e|=0)){case 1:P=10172;break;case 2:P=10676;break;default:return ur=x}Pn(E=0|ar[P>>2],37411,L),ar[K>>2]=tr[A+1>>0],Pn(E,37452,K),ar[a>>2]=tr[A+2>>0],Pn(E,37485,a),ar[m>>2]=tr[A+3>>0],Pn(E,37518,m),ar[q>>2]=tr[A+4>>0],Pn(E,37562,q),ar[r>>2]=tr[A+5>>0],Pn(E,37595,r),ar[i>>2]=tr[A+6>>0],Pn(E,37628,i),ar[f>>2]=tr[A+7>>0],Pn(E,37664,f),ar[n>>2]=ar[A+8>>2],Pn(E,37700,n),ar[t>>2]=tr[A+12>>0],Pn(E,37733,t),ar[o>>2]=tr[A+13>>0],Pn(E,37766,o),q=A+14|0,ar[c>>2]=tr[q>>0],Pn(E,37799,c),0|tr[q>>0]&&(ar[l>>2]=ar[A+16>>2],Pn(E,37832,l));if(ar[u>>2]=ar[A+20>>2],Pn(E,37865,u),ar[b>>2]=ar[A+24>>2],Pn(E,37900,b),ar[s>>2]=tr[A+28>>0],Pn(E,37935,s),ar[d>>2]=tr[A+29>>0],Pn(E,37982,d),ar[k>>2]=tr[A+30>>0],Pn(E,38017,k),ar[h>>2]=tr[A+31>>0],Pn(E,38052,h),ar[w>>2]=tr[A+32>>0],Pn(E,38087,w),q=A+34|0,ar[v>>2]=tr[q>>0],Pn(E,38122,v),ar[g>>2]=tr[A+33>>0],Pn(E,38157,g),0|tr[q>>0]){if(L=A+36|0,ar[Z>>2]=ar[L>>2],Pn(E,38195,Z),K=A+40|0,ar[p>>2]=ar[K>>2],Pn(E,38221,p),ar[y>>2]=tr[A+44>>0],Pn(E,38247,y),Pn(E,38273,B),0<=(0|ar[L>>2]))for(P=0;ar[I>>2]=ar[A+4252+(P<<2)>>2],Pn(E,38320,I),(0|P)<(0|ar[L>>2]);)P=P+1|0;if(Pn(E,45728,X),Pn(E,38298,W),0<=(0|ar[K>>2]))for(P=0;ar[z>>2]=ar[A+4296+(P<<2)>>2],Pn(E,38320,z),(0|P)<(0|ar[K>>2]);)P=P+1|0;Pn(E,45728,S),ar[O>>2]=tr[A+45>>0],Pn(E,38325,O)}ar[$>>2]=tr[A+46>>0],Pn(E,38369,$),$=A+47|0,ar[j>>2]=tr[$>>0],Pn(E,38417,j),0|tr[$>>0]&&(ar[H>>2]=tr[A+48>>0],Pn(E,38461,H),ar[AA>>2]=tr[A+49>>0],Pn(E,38506,AA),ar[C>>2]=ar[A+52>>2],Pn(E,38546,C),ar[G>>2]=ar[A+56>>2],Pn(E,38564,G));ar[V>>2]=tr[A+60>>0],Pn(E,38582,V),ar[F>>2]=tr[A+4125>>0],Pn(E,38622,F),ar[R>>2]=ar[A+4128>>2],Pn(E,38659,R),ar[N>>2]=tr[A+4132>>0],Pn(E,38696,N),ar[_>>2]=tr[A+4133>>0],Pn(E,38733,_),ar[Y>>2]=tr[A+4134>>0],Pn(E,38783,Y),AA=A+4135|0,ar[Q>>2]=tr[AA>>0],Pn(E,38819,Q),ar[D>>2]=tr[A+4136>>0],Pn(E,38855,D),ar[J>>2]=tr[A+4137>>0],Pn(E,38891,J),ar[M>>2]=ar[A+4160>>2],Pn(E,38927,M),ar[T>>2]=ar[A+4164>>2],Pn(E,38963,T),ar[U>>2]=ar[A+4168>>2],Pn(E,39004,U),0|tr[AA>>0]&&function(A,e){A|=0;var r,i,f,n,t,o,a,c,l,u,b=0,s=0,d=0;switch(ur=(u=ur)+80|0,l=u+72|0,c=u+64|0,a=u+56|0,o=u+48|0,n=u+40|0,s=u+32|0,t=u+24|0,b=u+16|0,f=u+8|0,i=u,0|(e|=0)){case 1:e=10172;break;case 2:e=10676;break;default:return ur=u}if(Pn(r=0|ar[e>>2],36905,i),ar[f>>2]=cr[A>>0],Pn(r,36948,f),ar[b>>2]=cr[A+1>>0],Pn(r,36994,b),b=A+2|0,ar[t>>2]=cr[b>>0],Pn(r,37040,t),0|tr[b>>0]&&(ar[s>>2]=cr[A+3>>0],Pn(r,37086,s),d=A+4|0,ar[n>>2]=cr[d>>0],Pn(r,37132,n),0|tr[d>>0]))for(e=0;s=0|tr[A+5+e>>0],ar[o>>2]=e,ar[4+o>>2]=s,Pn(r,37178,o),s=0|tr[A+11+e>>0],ar[a>>2]=e,ar[4+a>>2]=s,Pn(r,37225,a),(0|(e=e+1|0))<(0|cr[d>>0]););ar[c>>2]=cr[A+17>>0],Pn(r,37272,c),ar[l>>2]=cr[A+18>>0],Pn(r,37318,l),ur=u}(A+4138|0,e),ur=x}(i,e),r?(hb(0|(n=A+93784+(4400*(e=0|tr[i+1>>0])|0)|0),0|i,4340),ur=(n=((0|n)==(0|i)||($e(A+93784+(4400*e|0)+4340|0,0|ar[i+4340>>2],0|ar[i+4344>>2]),$e(A+93784+(4400*e|0)+4352|0,0|ar[i+4352>>2],0|ar[i+4356>>2]),$e(A+93784+(4400*e|0)+4364|0,0|ar[i+4364>>2],0|ar[i+4368>>2]),$e(A+93784+(4400*e|0)+4376|0,0|ar[i+4376>>2],0|ar[i+4380>>2]),$e(A+93784+(4400*e|0)+4388|0,0|ar[i+4388>>2],0|ar[i+4392>>2])),r?0:1006),Ga(i),f),0|n):(A=r?0:1006,Ga(i),ur=f,0|A)}function $e(A,e,r){var i,f,n,t=0,o=0,a=0,c=0,l=0;if((a=(c=(i=r|=0)-(e|=0)|0)>>2)>>>0<=(t=0|ar[(f=(A|=0)+8|0)>>2])-(n=l=0|ar[A>>2])>>2>>>0)return 0|(r=(t=(o=a=(A=(o=(0|ar[(c=A+4|0)>>2])-l>>2)>>>0<a>>>0)?e+(o<<2)|0:r)-e|0)>>2)&&wb(0|l,0|e,0|t),r=n+(r<<2)|0,A?!((0|(t=i-o|0))<=0)&&(hb(0|ar[c>>2],0|a,0|t),void(ar[c>>2]=(0|ar[c>>2])+(t>>>2<<2))):(0|(t=0|ar[c>>2]))!=(0|r)&&void(ar[c>>2]=t+(~((t+-4-r|0)>>>2)<<2));(o=l)&&((0|(r=0|ar[(t=A+4|0)>>2]))!=(0|n)&&(ar[t>>2]=r+(~((r+-4-l|0)>>>2)<<2)),vu(o),ar[f>>2]=0,ar[t>>2]=0,t=ar[A>>2]=0),1073741823<a>>>0&&zl(),l=t>>1,1073741823<(t=t>>2>>>0<536870911?l>>>0<a>>>0?a:l:1073741823)>>>0&&zl(),r=0|hu(t<<2),ar[(o=A+4|0)>>2]=r,ar[A>>2]=r,ar[f>>2]=r+(t<<2),(0|c)<=0||(hb(0|r,0|e,0|c),ar[o>>2]=r+(c>>>2<<2))}function Ar(A,e){e|=0;var r,i,f,n=0,t=0,o=0,a=0,c=0,l=0;r=(A|=0)+4|0,i=0|ar[A>>2],53687091<(n=(o=(0|(f=(0|ar[r>>2])-i|0))/80|0)+1|0)>>>0&&zl(),c=(a=((0|ar[(l=A+8|0)>>2])-i|0)/80|0)<<1,n=a>>>0<26843545?c>>>0<n>>>0?n:c:53687091;do{if(n){if(!(53687091<n>>>0)){t=0|hu(80*n|0);break}Zu(l=0|X(8),44519),ar[l>>2]=17660,I(0|l,4016,428)}else t=0}while(0);for(a=t+(80*n|0)|0,n=e,t=(o=c=t+(80*o|0)|0)+80|0;ar[o>>2]=ar[n>>2],n=n+4|0,(0|(o=o+4|0))<(0|t););n=c+(80*((0|f)/-80|0)|0)|0,0<(0|f)&&hb(0|n,0|i,0|f),ar[A>>2]=n,ar[r>>2]=c+80,ar[l>>2]=a,i&&vu(i)}function er(A,e,r){A|=0,e|=0,r|=0;var i=0,f=0;A:do{if(r){f=0|ar[(i=A+164|0)>>2];do{if(0<(0|f)){for(r=0;;){if((0|ar[A+84+(r<<2)>>2])==(0|e)){r=10;break}if((0|f)<=(0|(r=r+1|0))){r=5;break}}if(5==(0|r)){if((0|f)<20)break;break A}if(10==(0|r))return}}while(0);ar[i>>2]=f+1,ar[A+84+(f<<2)>>2]=e}}while(0);20==(0|(r=0|ar[(i=A+80|0)>>2]))?(e=1001,r=19):ar[i>>2]=r+1,ar[A+(r<<2)>>2]=e}function rr(A,e,r,i){A|=0,e|=0,r|=0,i|=0;var f,n,t,o,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0;if(ur=(t=ur)+16|0,f=t+4|0,b=t+8|0,n=t,s=0|hu(1356),o=s,ar[776+(o|=0)>>2]=0,ar[o+780>>2]=0,ar[o+784>>2]=0,st(o+1332|0),ar[o+1344>>2]=0,ar[o+1348>>2]=0,ar[o+1352>>2]=0,La(o),l=0|function(A,e,r,i){A|=0,e|=0,r|=0;var f,n,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0;tr[(i|=0)>>0]=0,La(A),tr[(l=A+12|0)>>0]=0,w=255&(0|At(e,1)),tr[(c=A+4|0)>>0]=w,0|tr[r+377214>>0]&&(w=255&(0|At(e,1)),tr[A+5>>0]=w);if(w=0|it(e),64<(0|(ar[A+8>>2]=w))|-99999==(0|w))return er(r+4|0,1009,0),(i=0)|i;if(!(0|tr[r+93784+(4400*w|0)>>0]))return er(r+4|0,1009,0),(i=0)|i;if(n=0|tr[r+93784+(4400*w|0)+2>>0],!(0|tr[(u=r+11096+(5168*n|0)|0)>>0]))return er(r+4|0,1010,0),tr[i>>0]=0,(i=0)|i;if(0|tr[c>>0])o=t=0,h=23;else{for(t=0|tr[r+93784+(4400*w|0)+3>>0]?255&(0|At(e,1)):0,tr[l>>0]=t,o=0|ar[r+11096+(5168*n|0)+5072>>2],t=0;(1<<t|0)<(0|o);)t=t+1|0;if(t=0|At(e,t),0|tr[l>>0]){if(!t)return tr[i>>0]=0,er(r+4|0,1021,0),(i=0)|i;if(!(o=0|ar[r+376228>>2]))return 0|(i=16);hb(0|A,0|o,776),(a=(0|o)==(0|A))||$e(A+776|0,0|ar[o+776>>2],0|ar[o+780>>2]),hb(A+788|0,o+788|0,544),gt(A+1332|0,o+1332|0),tr[A+1340>>0]=0|tr[o+1340>>0],a||$e(A+1344|0,0|ar[o+1344>>2],0|ar[o+1348>>2]),tr[c>>0]=0,o=1,h=23}else o=0}23==(0|h)&&(tr[l>>0]=o);if(0<=(0|(ar[(f=A+16|0)>>2]=t))&&(0|t)<(0|ar[r+11096+(5168*n|0)+5072>>2])){if(!(o<<24>>24)){if(0<(0|tr[(o=r+93784+(4400*w|0)+4132|0)>>0]))for(t=0;et(e,1),(0|(t=t+1|0))<(0|tr[o>>0]););if(s=0|it(e),2<(0|(ar[(d=A+20|0)>>2]=s))|-99999==(0|s))return er(r+4|0,1007,0),tr[i>>0]=0,(i=0)|i;if(t=0|tr[r+93784+(4400*w|0)+31>>0]?255&(0|At(e,1)):1,tr[A+24>>0]=t,1==(0|tr[r+11096+(5168*n|0)+480>>0])&&(s=255&(0|At(e,2)),tr[A+25>>0]=s),ar[(t=A+28|0)>>2]=0,(((tr[(o=A+32|0)>>0]=0)|tr[r+377212>>0])-19&255)<2)ar[t>>2]=0,ar[A+140>>2]=0,ar[A+144>>2]=0,t=0;else{b=0|At(e,0|ar[(s=r+11096+(5168*n|0)+520|0)>>2]),ar[t>>2]=b,b=255&(0|At(e,1)),tr[o>>0]=b;do{if(b<<24>>24){for(a=r+11096+(5168*n|0)+4720|0,t=0|ar[(u=r+11096+(5168*n|0)+4724|0)>>2],c=0|ar[a>>2],l=(t-c|0)/100|0,o=0;(1<<o|0)<(0|l);)o=o+1|0;if(0<(0|o)?(c=0|At(e,o),o=0|ar[a>>2],t=0|ar[u>>2]):(o=c,c=0),(0|(ar[A+136>>2]=c))<((t-o|0)/100|0)){for(ar[A+808>>2]=c,t=o+(100*c|0)|0,o=(a=A+812|0)+100|0;or[a>>1]=0|or[t>>1],t=t+2|0,(0|(a=a+2|0))<(0|o););break}return er(r+4|0,1015,0),0|(i=8)}for(a=r+11096+(5168*n|0)+4720|0,Zc(r+4|0,u,e,t=A+34|0,((0|ar[(o=r+11096+(5168*n|0)+4724|0)>>2])-(0|ar[a>>2])|0)/100|0,a,1),ar[A+808>>2]=((0|ar[o>>2])-(0|ar[a>>2])|0)/100|0,o=(a=A+812|0)+100|0;or[a>>1]=0|or[t>>1],t=t+2|0,(0|(a=a+2|0))<(0|o););}while(0);A:do{if(0|tr[r+11096+(5168*n|0)+4732>>0]){l=r+11096+(5168*n|0)+4736|0;do{if(0<(0|ar[l>>2])){if(b=0|it(e),-99999!=(0|(ar[A+140>>2]=b)))break;return 0|(t=8)}ar[A+140>>2]=0}while(0);if(t=0|it(e),-99999==(0|(ar[(u=A+144|0)>>2]=t)))return 0|(i=8);if(o=0|ar[(b=A+140|0)>>2],((t=o+t|0)+(0|cr[A+908>>0])+(0|cr[A+909>>0])|0)>(0|ar[r+11096+(5168*n|0)+528+((0|tr[r+11096+(5168*n|0)+2>>0])-1<<2)>>2]))return er(r+4|0,1018,0),tr[i>>0]=0,(i=0)|i;if(!(0<(0|t))){t=0;break}for(c=t=0;;){if((0|c)<(0|o)){for(a=0|ar[l>>2],o=0;(1<<o|0)<(0|a);)o=o+1|0;if(a=0|At(e,o),tr[(o=A+148+c|0)>>0]=a,(0|(a&=255))>=(0|ar[l>>2]))break;ar[r+376232+(c<<2)>>2]=ar[r+11096+(5168*n|0)+4740+(a<<2)>>2],o=(0|cr[o>>0])+(r+11096+(5168*n|0)+4868)|0}else v=0|At(e,0|ar[s>>2]),ar[(a=A+164+(c<<2)|0)>>2]=v,v=255&(0|At(e,1)),tr[(o=A+228+c|0)>>0]=v,ar[r+376232+(c<<2)>>2]=ar[a>>2];if(v=0|tr[o>>0],ar[r+376296+(c<<2)>>2]=v<<24>>24,t=(v<<24>>24!=0&1)+t|0,v=255&(0|At(e,1)),(tr[A+244+c>>0]=v)<<24>>24){if(o=0|it(e),-99999==(0|(ar[A+260+(c<<2)>>2]=o))){t=8,h=189;break}}else ar[A+260+(c<<2)>>2]=0,o=0;do{if(c){if((0|c)==(0|ar[b>>2]))break;o=(0|ar[r+376360+(c+-1<<2)>>2])+o|0}}while(0);if(ar[r+376360+(c<<2)>>2]=o,c=c+1|0,o=0|ar[b>>2],(0|c)>=((0|ar[u>>2])+o|0))break A}return 189==(0|h)?0|t:(er(r+4|0,1023,0),tr[i>>0]=0,(v=0)|v)}ar[A+140>>2]=0,ar[A+144>>2]=0,t=0}while(0);o=0|tr[r+11096+(5168*n|0)+4900>>0]?255&(0|At(e,1)):0,tr[A+324>>0]=o}o=0|tr[r+11096+(5168*n|0)+4703>>0]?(v=255&(0|At(e,1)),tr[A+325>>0]=v,0|ar[r+11096+(5168*n|0)+5012>>2]?255&(0|At(e,1)):0):tr[A+325>>0]=0,tr[(u=A+326|0)>>0]=o,ar[(c=A+328|0)>>2]=0,ar[(l=A+332|0)>>2]=0;do{if((0|ar[d>>2])>>>0<2){v=255&(0|At(e,1)),tr[A+327>>0]=v;do{if(v<<24>>24){if(o=0|it(e),-99999==(0|(ar[c>>2]=o)))return er(r+4|0,1007,0),0|(v=8);if(o=o+1|0,ar[c>>2]=o,0|ar[d>>2])break;if(a=0|it(e),-99999==(0|(ar[l>>2]=a)))return er(r+4|0,1007,0),0|(v=8);o=0|ar[c>>2],a=a+1|0,h=86;break}o=0|tr[r+93784+(4400*w|0)+6>>0],ar[c>>2]=o,a=0|tr[r+93784+(4400*w|0)+7>>0],h=86}while(0);if(86==(0|h)&&(ar[l>>2]=a),16<(0|o))return 0|(v=8);if(16<(0|ar[l>>2]))return 0|(v=8);t=(0|cr[A+911>>0])+t|0,ar[A+912>>2]=t;do{if(1<(0|t)&&0!=(0|tr[r+93784+(4400*w|0)+4125>>0])){for(o=0;(1<<o|0)<(0|t);)o=o+1|0;v=255&(0|At(e,1)),tr[A+336>>0]=v;do{if(v<<24>>24){if(!(0<(0|ar[c>>2])))break;for(t=0;v=255&(0|At(e,o)),tr[A+338+t>>0]=v,(0|(t=t+1|0))<(0|ar[c>>2]););}}while(0);if(0|ar[d>>2]){tr[A+337>>0]=0;break}if(v=255&(0|At(e,1)),!((tr[A+337>>0]=v)<<24>>24))break;if(!(0<(0|ar[l>>2])))break;for(t=0;v=255&(0|At(e,o)),tr[A+354+t>>0]=v,(0|(t=t+1|0))<(0|ar[l>>2]););}else tr[A+336>>0]=0,tr[A+337>>0]=0}while(0);0|ar[d>>2]||(v=255&(0|At(e,1)),tr[A+370>>0]=v),t=0|tr[r+93784+(4400*w|0)+5>>0]?255&(0|At(e,1)):0,tr[A+371>>0]=t;do{if(0|tr[A+324>>0]){do{if(0|ar[d>>2])tr[(o=A+372|0)>>0]=1,t=1,h=108;else{if(t=255&(0|At(e,1)),(tr[(o=A+372|0)>>0]=t)<<24>>24){h=108;break}h=1<(0|ar[l>>2])?110:(t=0,113)}}while(0);108==(0|h)&&(h=1<(0|ar[c>>2])?110:113);do{if(110==(0|h)){if(a=0|it(e),-99999==(0|(ar[A+376>>2]=a)))return er(r+4|0,1007,0),0|(v=8);t=0|tr[o>>0];break}113==(0|h)&&(ar[A+376>>2]=0,a=0)}while(0);if(t<<24>>24){if((0|a)<(0|ar[c>>2]))break}else if((0|a)<(0|ar[l>>2]))break;return er(r+4|0,8,0),0|(v=8)}}while(0);h=0!=(0|tr[r+93784+(4400*w|0)+29>>0])&&1==(0|ar[d>>2])?122:120;do{if(120==(0|h)){if(!(0|tr[r+93784+(4400*w|0)+30>>0]))break;0|ar[d>>2]||(h=122)}}while(0);do{if(122==(0|h)){if(0|Pa(e,A,r))break;return er(r+4|0,8,0),0|(v=8)}}while(0);if(t=0|it(e),-99999==(0|(ar[A+736>>2]=t)))return er(r+4|0,1007,0),0|(v=8);ar[A+804>>2]=5-t;break}}while(0);if(v=0|ft(e),-99999==(0|(ar[A+740>>2]=v)))return er(r+4|0,1007,0),0|(v=8);do{if(0|tr[r+93784+(4400*w|0)+28>>0]){if(v=0|ft(e),-99999==(0|(ar[A+744>>2]=v)))return er(r+4|0,1007,0),0|(v=8);if(v=0|ft(e),-99999!=(0|(ar[A+748>>2]=v)))break;return er(r+4|0,1007,0),0|(v=8)}ar[A+744>>2]=0,ar[A+748>>2]=0}while(0);0|tr[r+93784+(4400*w|0)+4140>>0]&&(v=255&(0|At(e,1)),tr[A+752>>0]=v),t=0|tr[r+93784+(4400*w|0)+48>>0]?255&(0|At(e,1)):0,tr[A+753>>0]=t,ar[(o=A+756|0)>>2]=ar[r+93784+(4400*w|0)+52>>2],ar[(a=A+760|0)>>2]=ar[r+93784+(4400*w|0)+56>>2];do{if(t<<24>>24){if(v=255&(0|At(e,1)),(tr[A+754>>0]=v)<<24>>24)break;if(t=0|ft(e),-99999==(0|(ar[o>>2]=t)))return er(r+4|0,1007,0),0|(v=8);if(ar[o>>2]=t<<1,t=0|ft(e),-99999==(0|(ar[a>>2]=t)))return er(r+4|0,1007,0),0|(v=8);ar[a>>2]=t<<1;break}tr[A+754>>0]=0|tr[r+93784+(4400*w|0)+49>>0]}while(0);t=0|tr[r+93784+(4400*w|0)+46>>0];A:do{if(t<<24>>24){do{if(!(0|tr[A+325>>0])){if(0|tr[u>>0])break;if(0|tr[A+754>>0])break A}}while(0);t=255&(0|At(e,1))}else t=0}while(0);tr[A+764>>0]=t}0==(0|tr[(o=r+93784+(4400*w|0)+34|0)>>0])&&0==(0|tr[r+93784+(4400*w|0)+33>>0])?ar[A+768>>2]=0:h=155;A:do{if(155==(0|h)){if(t=0|it(e),-99999==(0|(ar[(b=A+768|0)>>2]=t)))return er(r+4|0,1007,0),0|(v=8);if(0|tr[r+93784+(4400*w|0)+33>>0]&&(((0|ar[f>>2])/(0|ar[r+11096+(5168*n|0)+5056>>2])|0)+t|0)>=(0|ar[r+11096+(5168*n|0)+5064>>2]))return er(r+4|0,1007,0),0|(v=8);if(0|tr[o>>0]&&(0|t)>(0|br(0|ar[r+93784+(4400*w|0)+40>>2],0|ar[r+93784+(4400*w|0)+36>>2])))return er(r+4|0,1007,0),0|(v=8);if(u=A+776|0,l=0|ar[(o=A+780|0)>>2],c=0|ar[u>>2],t>>>0<=(a=l-c>>2)>>>0?t>>>0<a>>>0&&(0|l)!=(0|(k=c+(t<<2)|0))&&(ar[o>>2]=l+(~((l+-4-k|0)>>>2)<<2)):(Va(u,t-a|0),t=0|ar[b>>2]),0<(0|t)){if(t=0|it(e),-99999==(0|(ar[(l=A+772|0)>>2]=t)))return er(r+4|0,1007,0),0|(v=8);if(o=t+1|0,ar[l>>2]=o,31<(0|t))return 0|(v=8);if(0<(0|ar[b>>2]))for(t=0;;){if(o=1+(0|At(e,o))|0,a=0|ar[u>>2],ar[(c=a+(t<<2)|0)>>2]=o,0<(0|t)&&(ar[c>>2]=o+(0|ar[a+(t+-1<<2)>>2])),(0|(t=t+1|0))>=(0|ar[b>>2]))break A;o=0|ar[l>>2]}}}}while(0);do{if(0|tr[r+93784+(4400*w|0)+4133>>0]){if(t=0|it(e),-99999==(0|(ar[(o=A+788|0)>>2]=t))|1e3<(0|t))return er(r+4|0,1007,0),0|(v=8);if(!(0<(0|t)))break;for(t=0;At(e,8),(0|(t=t+1|0))<(0|ar[o>>2]););}}while(0);switch(ar[A+792>>2]=(0|ar[A+740>>2])+(0|ar[r+93784+(4400*w|0)+8>>2]),0|ar[A+20>>2]){case 2:t=0,h=187;break;case 1:t=1+(0|tr[A+371>>0])|0,h=187;break;case 0:t=2-(0|tr[A+371>>0])|0,h=187}return 187==(0|h)&&(ar[A+796>>2]=t),ar[A+804>>2]=5-(0|ar[A+736>>2]),tr[i>>0]=1,(v=0)|v}return er(r+4|0,1020,0),0|(v=8)}(s,e,A,b),ar[n>>2]=l,!(0|tr[b>>0]))return 0|(a=0|ar[A+376224>>2])&&(tr[a+10516>>0]=2),Ba(A+548|0,r),0|(a=0|ar[s+1344>>2])&&((0|(c=0|ar[(i=s+1348|0)>>2]))!=(0|a)&&(ar[i>>2]=c+(~((c+-4-a|0)>>>2)<<2)),vu(a)),kt(s+1332|0),0|(a=0|ar[s+776>>2])&&((0|(c=0|ar[(i=s+780|0)>>2]))!=(0|a)&&(ar[i>>2]=c+(~((c+-4-a|0)>>>2)<<2)),vu(a)),vu(s),ur=t,0|(s=l);if(-1<(0|(a=0|ar[A+528>>2]))&&function(A,e,r){A|=0,e|=0;var i,f,n,t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p,y,B,E,X,W,I,C,G,V,F,R,N,_,Y,Q,D,J=0,M=0,T=0,U=0,S=0,O=0,z=0,j=0,H=0,x=0,P=0,L=0,K=0,q=0,$=0,AA=0,eA=0,rA=0,iA=0;switch(ur=(D=ur)+448|0,Q=D+432|0,iA=D+424|0,Y=D+416|0,N=D+408|0,R=D+400|0,F=D+392|0,V=D+384|0,rA=D+376|0,I=D+368|0,W=D+360|0,X=D+352|0,E=D+344|0,B=D+328|0,y=D+312|0,p=D+296|0,Z=D+280|0,G=D+264|0,C=D+248|0,eA=D+240|0,m=D+232|0,v=D+224|0,w=D+216|0,h=D+208|0,k=D+200|0,d=D+192|0,$=D+184|0,q=D+176|0,K=D+168|0,L=D+160|0,P=D+152|0,x=D+144|0,b=D+136|0,u=D+128|0,l=D+120|0,c=D+112|0,a=D+104|0,o=D+96|0,H=D+88|0,t=D+80|0,j=D+72|0,n=D+64|0,f=D+56|0,i=D+48|0,U=D+40|0,z=D+32|0,O=D+24|0,S=D+16|0,T=D+8|0,J=D,0|(r|=0)){case 1:r=10172;break;case 2:r=10676;break;default:return ur=D}_=0|ar[r>>2],g=0|ar[(M=A+8|0)>>2],0|tr[e+93784+(4400*g|0)>>0]||sr(39698,39242,1278,39712);s=0|tr[e+93784+(4400*g|0)+2>>0],0|tr[e+11096+(5168*s|0)>>0]||sr(39738,39242,1281,39712);Pn(_,39752,J),r=A+4|0,ar[T>>2]=tr[r>>0],Pn(_,39795,T),(-8&tr[(J=e+377212|0)>>0])<<24>>24==16&&(ar[S>>2]=tr[A+5>>0],Pn(_,39838,S));ar[O>>2]=ar[M>>2],Pn(_,39881,O),0|tr[r>>0]||(ar[z>>2]=tr[A+12>>0],Pn(_,39924,z),ar[U>>2]=ar[A+16>>2],Pn(_,39967,U));z=0|ar[(O=A+20|0)>>2],ar[i>>2]=0==(0|z)?66:1==(0|z)?80:73,Pn(_,40010,i),0|tr[e+93784+(4400*g|0)+31>>0]&&(ar[f>>2]=tr[A+24>>0],Pn(_,40053,f));1==(0|tr[e+11096+(5168*s|0)+480>>0])&&(ar[n>>2]=tr[A+25>>0],Pn(_,40096,n));ar[j>>2]=ar[A+28>>2],Pn(_,40139,j),2<=((0|tr[J>>0])-19&255)&&(j=A+32|0,ar[t>>2]=tr[j>>0],Pn(_,40182,t),r=e+11096+(5168*s|0)+4720|0,J=(0|ar[e+11096+(5168*s|0)+4724>>2])-(0|ar[r>>2])|0,0|tr[j>>0]?100<(0|J)&&(H=A+136|0,ar[o>>2]=ar[H>>2],Pn(_,40225,o),pc((0|ar[r>>2])+(100*(0|ar[H>>2])|0)|0,16,_)):(ar[H>>2]=(0|J)/100|0,Pn(_,43367,H),pc(A+34|0,16,_)),0|tr[e+11096+(5168*s|0)+4732>>0]&&(0<(0|ar[e+11096+(5168*s|0)+4736>>2])&&(ar[a>>2]=ar[A+140>>2],Pn(_,40268,a)),ar[c>>2]=ar[A+144>>2],Pn(_,40315,c)),0|tr[e+11096+(5168*s|0)+4900>>0]&&(ar[l>>2]=tr[A+324>>0],Pn(_,40362,l)));0|tr[e+11096+(5168*s|0)+4703>>0]&&(ar[u>>2]=tr[A+325>>0],Pn(_,40400,u),ar[b>>2]=tr[A+326>>0],Pn(_,40438,b));if((0|ar[O>>2])>>>0<2){if(r=A+327|0,ar[x>>2]=tr[r>>0],Pn(_,40476,x),S=A+328|0,x=0|tr[r>>0]?79659:40515,ar[P>>2]=ar[S>>2],ar[P+4>>2]=x,Pn(_,40526,P),0|ar[O>>2]||(P=0|tr[r>>0]?79659:40515,ar[L>>2]=ar[A+332>>2],ar[L+4>>2]=P,Pn(_,40566,L)),0|tr[e+93784+(4400*g|0)+4125>>0]&&1<(0|ar[A+912>>2])){if(L=A+336|0,ar[K>>2]=tr[L>>0],Pn(_,40606,K),0|tr[L>>0]&&0<(0|ar[S>>2]))for(r=0;K=0|cr[A+338+r>>0],ar[q>>2]=r,ar[q+4>>2]=K,Pn(_,40646,q),(0|(r=r+1|0))<(0|ar[S>>2]););if(q=A+337|0,ar[$>>2]=tr[q>>0],Pn(_,40656,$),0|tr[q>>0]&&0<(0|ar[(AA=A+332|0)>>2]))for(r=0;$=0|cr[A+354+r>>0],ar[d>>2]=r,ar[4+d>>2]=$,Pn(_,40646,d),(0|(r=r+1|0))<(0|ar[AA>>2]););}0|ar[O>>2]||(ar[k>>2]=tr[A+370>>0],Pn(_,40696,k)),ar[h>>2]=tr[A+371>>0],Pn(_,40733,h),0|tr[A+324>>0]&&(ar[w>>2]=tr[A+372>>0],Pn(_,40770,w),ar[v>>2]=ar[A+376>>2],Pn(_,40807,v)),45==(0|(U=0!=(0|tr[e+93784+(4400*g|0)+29>>0])&&1==(0|ar[O>>2])?47:45))&&0|tr[e+93784+(4400*g|0)+30>>0]&&0==(0|ar[O>>2])&&(U=47);A:do{if(47==(0|U)){ar[m>>2]=cr[A+380>>0],Pn(_,40844,m),0|ar[e+11096+(5168*s|0)+476>>2]&&(ar[eA>>2]=cr[A+381>>0],Pn(_,40881,eA)),T=A+332|0,M=0;do{r=0==(0|M);do{if(r)U=53;else{if(1!=(0|M))break;if(0|ar[O>>2])break A;U=53}}while(0);do{if(53==(0|U)){if(!((U=0)<(0|(J=0|ar[(r?S:T)>>2]))))break;for(r=0;eA=0|or[A+446+(M<<5)+(r<<1)>>1],ar[C>>2]=M,ar[4+C>>2]=r,ar[8+C>>2]=eA,Pn(_,40918,C),eA=0|tr[A+510+(M<<4)+r>>0],ar[G>>2]=M,ar[4+G>>2]=r,ar[8+G>>2]=eA,Pn(_,40955,G),eA=0|or[A+542+(M<<6)+(r<<2)>>1],ar[Z>>2]=M,ar[4+Z>>2]=r,ar[8+Z>>2]=0,ar[12+Z>>2]=eA,Pn(_,40992,Z),eA=0|tr[A+670+(M<<5)+(r<<1)>>0],ar[p>>2]=M,ar[4+p>>2]=r,ar[8+p>>2]=0,ar[12+p>>2]=eA,Pn(_,41030,p),eA=0|or[A+542+(M<<6)+(r<<2)+2>>1],ar[y>>2]=M,ar[4+y>>2]=r,ar[8+y>>2]=1,ar[12+y>>2]=eA,Pn(_,40992,y),eA=0|tr[A+670+(M<<5)+(r<<1)+1>>0],ar[B>>2]=M,ar[4+B>>2]=r,ar[8+B>>2]=1,ar[12+B>>2]=eA,Pn(_,41030,B),(0|(r=r+1|0))!=(0|J););}}while(0);M=M+1|0}while(2!=(0|M))}}while(0);ar[E>>2]=ar[A+736>>2],Pn(_,41068,E)}ar[X>>2]=ar[A+740>>2],Pn(_,41105,X),0|tr[e+93784+(4400*g|0)+28>>0]&&(ar[W>>2]=ar[A+744>>2],Pn(_,41134,W),ar[I>>2]=ar[A+748>>2],Pn(_,41163,I));J=A+753|0,0|tr[e+93784+(4400*g|0)+48>>0]&&(ar[rA>>2]=tr[J>>0],Pn(_,41192,rA));r=A+754|0,rA=0|tr[J>>0]?41230:41241,ar[V>>2]=tr[r>>0],ar[4+V>>2]=rA,Pn(_,41252,V),0|tr[J>>0]&&0==(0|tr[r>>0])&&(ar[F>>2]=ar[A+756>>2],Pn(_,41299,F),ar[R>>2]=ar[A+760>>2],Pn(_,41324,R));do{if(0|tr[e+93784+(4400*g|0)+46>>0]){if(0==(0|tr[A+325>>0])&&0==(0|tr[A+326>>0])&&0|tr[r>>0])break;ar[N>>2]=tr[A+764>>0],Pn(_,41349,N)}}while(0);if(0==(0|tr[e+93784+(4400*g|0)+34>>0])&&0==(0|tr[e+93784+(4400*g|0)+33>>0]))return ur=D;if(M=A+768|0,ar[Y>>2]=ar[M>>2],Pn(_,41400,Y),(0|ar[M>>2])<=0)return ur=D;if(ar[iA>>2]=ar[A+772>>2],Pn(_,41433,iA),(0|ar[M>>2])<=0)return ur=D;J=A+776|0,r=0;for(;iA=0|ar[(0|ar[J>>2])+(r<<2)>>2],ar[Q>>2]=r,ar[4+Q>>2]=iA,Pn(_,41466,Q),r=r+1|0,(0|r)<(0|ar[M>>2]););ur=D}(s,A,a),u=0|function(A,e,r,i,f,n,t,o){A|=0,e|=0,r|=0,f|=0,n|=0,t|=0,o|=0;var a,c,l=0,u=0,b=0,s=0,d=0;ur=(c=ur)+16|0,l=c,ar[(i|=0)>>2]=0,tr[A+377228>>0]=0,u=0|ar[r+8>>2],0|tr[(b=e+93784+(4400*u|0)|0)>>0]||(ar[l>>2]=u,function(A,e,r){A|=0,e|=0,r|=0;var i,f,n;if(ur=(n=ur)+16|0,i=n,!(-9999<=(0|ar[14391])&!0))return ur=n;f=42==(0|tr[e>>0]),A=0|ar[2543],f||Ui(44499,5,1,A);ar[i>>2]=r,Qc(A,e+(1&f)|0,i),Oi(A),ur=n}(1,34889,l),sr(55739,34700,1987,34915));if(ar[(s=e+375392|0)>>2]=b,d=0|tr[e+93784+(4400*u|0)+2>>0],ar[(l=e+375388|0)>>2]=e+11096+(5168*d|0),ar[(a=e+375384|0)>>2]=e+600+(656*(0|tr[e+11096+(5168*d|0)+1>>0])|0),function(A){var e=0,r=0,i=0,f=0,n=0,t=0,o=0,a=0,c=0;r=0|ar[375388+(A|=0)>>2],e=(i=0==(0|r))?(e=0|ar[A+375384>>2])?(0|ar[e+8>>2])-1|0:6:(0|tr[r+2>>0])-1|0;do{if((0|tr[A+376116>>0])!=(0|e)){if(i?(e=0|ar[A+375384>>2])?(e=0|ar[e+8>>2],f=10):e=6:(e=0|tr[r+2>>0],f=10),10==(0|f)){if(!(0<(0|e)))break;e=e+-1|0}for(t=e+1|0,o=A+375896|0;;){if((0|(i=(0|(n=100*e|0))/(0|t)|0))<=(0|(n=(n+100|0)/(0|t)|0)))for(f=n-i|0,r=i;c=0|ar[o>>2],e=(a=(0|c)<(0|e))?c:e,tr[A+375916+(r<<1)>>0]=e,tr[A+375916+(r<<1)+1>>0]=a?100:255&((100*(r-i|0)|0)/(0|f)|0),(0|r)<(0|n);)r=r+1|0;if(ar[A+376120+(e<<2)>>2]=n,!(0<(0|e)))break;e=e+-1|0}}}while(0);a=0|ar[A+375900>>2],c=0|tr[A+375916+(a<<1)>>0],ar[A+375904>>2]=c,ar[A+375908>>2]=tr[A+375916+(a<<1)+1>>0],ar[A+375912>>2]=c}(A),0|tr[(d=r+4|0)>>0]){if(ar[e+376204>>2]=ar[r+28>>2],l=0|ar[l>>2],u=0|tr[l+4703>>0]?0!=(0|tr[e+533>>0]):1,-1==(0|(u=0|ia(e+376148|0,l,A,f,n,o,u))))return ar[i>>2]=9,ur=c,(r=0)|r;l=0|ar[e+376156>>2],u=(0|ar[e+376160>>2])-l>>2>>>0>u>>>0?0|ar[l+(u<<2)>>2]:0,tr[(b=u+10518|0)>>0]=0|tr[t>>0],tr[b+1>>0]=0|tr[t+1>>0],tr[b+2>>0]=0|tr[t+2>>0],ar[(b=e+376224|0)>>2]=u,l=0|ar[a>>2],hb(0|(t=u+108|0),0|l,592),(0|t)==(0|l)?(i=l+604|0,ar[(t=u+712|0)>>2]=ar[i>>2],ar[t+4>>2]=ar[i+4>>2],ar[t+8>>2]=ar[i+8>>2],ar[t+12>>2]=ar[i+12>>2],ar[t+16>>2]=ar[i+16>>2],ar[t+20>>2]=ar[i+20>>2]):(je(u+700|0,0|ar[l+592>>2],0|ar[l+596>>2]),i=l+604|0,ar[(t=u+712|0)>>2]=ar[i>>2],ar[t+4>>2]=ar[i+4>>2],ar[t+8>>2]=ar[i+8>>2],ar[t+12>>2]=ar[i+12>>2],ar[t+16>>2]=ar[i+16>>2],ar[t+20>>2]=ar[i+20>>2],He(u+736|0,0|ar[l+628>>2],0|ar[l+632>>2]),xe(u+748|0,0|ar[l+640>>2],0|ar[l+644>>2])),tr[u+760>>0]=0|tr[l+652>>0],l=0|ar[s>>2],hb(0|(s=u+5932|0),0|l,4340),(0|s)!=(0|l)&&($e(u+10272|0,0|ar[l+4340>>2],0|ar[l+4344>>2]),$e(u+10284|0,0|ar[l+4352>>2],0|ar[l+4356>>2]),$e(u+10296|0,0|ar[l+4364>>2],0|ar[l+4368>>2]),$e(u+10308|0,0|ar[l+4376>>2],0|ar[l+4380>>2]),$e(u+10320|0,0|ar[l+4388>>2],0|ar[l+4392>>2])),ar[u+10332>>2]=e,function(A){var e,r=0;0|(r=0|ar[10360+(A|=0)>>2])&&vb(0|r,0,3*(0|ar[A+10364>>2])|0);0|(r=0|ar[A+10340>>2])&&vb(0|r,0,24*(0|ar[A+10344>>2])|0);0|(r=0|ar[A+10460>>2])&&vb(0|r,0,0|ar[A+10464>>2]);if((0|(e=0|ar[A+10344>>2]))<=0)return;A=0|ar[A+10524>>2],r=0;for(;ar[A+(80*r|0)>>2]=0,r=r+1|0,(0|r)<(0|e););}(u),l=e+377212|0;do{if(0|ma(0|tr[l>>0])){if(!(0|ha(0|tr[l>>0])||0|wa(0|tr[l>>0])||0!=(0|tr[e+376208>>0]))&&0==(0|tr[e+376211>>0])){tr[e+376209>>0]=0,tr[e+376210>>0]=0;break}tr[e+376209>>0]=1,tr[e+376211>>0]=0}}while(0);0|va(0|tr[l>>0])&&0!=(0|tr[e+376209>>0])?tr[100+(0|ar[b>>2])>>0]=0:tr[100+(0|ar[b>>2])>>0]=0!=(0|tr[r+24>>0])&1,function(A,e,r){A|=0,r|=0;var i,f=0,n=0,t=0;0|ma(0|tr[(i=377212+(e|=0)|0)>>0])&&0!=(0|tr[e+376209>>0])?(ar[(n=e+376212|0)>>2]=0,tr[A+377228>>0]=1,A=r+28|0,A=(r=0)|ar[(f=A)>>2]):(n=0|ar[5032+(0|ar[e+375388>>2])>>2],A=0|ar[(t=r+28|0)>>2],f=0|ar[e+376216>>2],r=0|ar[e+376220>>2],(0|A)<(0|f)&&((0|n)/2|0)<=(f-A|0)?r=r+n|0:(0|f)<(0|A)&&(r=r-(((0|n)/2|0)<(A-f|0)?n:0)|0),ar[(n=e+376212|0)>>2]=r,f=t);if(t=0|ar[e+376224>>2],ar[t+92>>2]=A+r,ar[t+88>>2]=A,0|tr[t+10520>>0])return;if(0|function(A){return(255&(A|=0))<15?0==(1&A)|0:0}(0|tr[i>>0]))return;if(0|va(0|tr[i>>0]))return;if(0|function(A){return(1|(A|=0))<<24>>24==7|0}(0|tr[i>>0]))return;ar[e+376216>>2]=ar[f>>2],ar[e+376220>>2]=ar[n>>2]}(A,e,r),l=u+96|0,0|tr[d>>0]&&(ar[l>>2]=1,function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a,c,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0;if(ur=(c=ur)+32|0,t=c+4|0,ar[(o=(f=c)+16|0)>>2]=0,ar[(a=4+o|0)>>2]=0,ar[8+o>>2]=0,i=0|ar[ar[(n=e+376224|0)>>2]>>2],0|ma(0|tr[(h=e+377212|0)>>0])&&0|tr[e+376209>>0]&&(u=0|ar[n>>2],w=0|ar[u+92>>2],v=A+376156|0,b=0|ar[(m=A+376160|0)>>2],l=0|ar[v>>2],0<(b-l|0)))for(g=e+376156|0,Z=e+376160|0,p=8+o|0,k=0,d=b;b=0|ar[g>>2],b=(0|ar[Z>>2])-b>>2>>>0>k>>>0?0|ar[b+(k<<2)>>2]:0,0!=(0|ar[b+96>>2])&&(0|ar[b+92>>2])<(0|w)&&(0|ar[(y=b+104|0)>>2])>>>0>(0|ar[u>>2])>>>0?(b=0|ar[b>>2],ar[t>>2]=b,(s=0|ar[a>>2])>>>0<(0|ar[p>>2])>>>0?(ar[s>>2]=b,ar[a>>2]=s+4,b=d):(Mo(o,t),b=0|ar[m>>2],l=0|ar[v>>2],u=0|ar[n>>2]),ar[y>>2]=ar[u>>2]):b=d,!((b-l>>2|0)<=(0|(k=k+1|0)));)d=b;if(0|ha(0|tr[h>>0]))ar[e+376552>>2]=0,ar[e+376556>>2]=0,ar[e+376560>>2]=0,u=l=0;else{if((l=0|tr[r+908>>0])<<24>>24)for(k=255&l,d=s=b=0;y=0==(0|tr[r+876+b>>0]),l=(1&y)+d|0,u=(1&(1^y))+s|0,ar[(y?e+376700+(d<<2)|0:e+376572+(s<<2)|0)>>2]=(0|or[r+812+(b<<1)>>1])+(0|ar[92+(0|ar[n>>2])>>2]),!((0|k)<=(0|(b=b+1|0)));)s=u,d=l;else l=u=0;if(ar[e+376552>>2]=u,(u=0|tr[r+909>>0])<<24>>24)for(k=255&u,s=b=0;;){if(y=0==(0|tr[r+892+b>>0]),d=(1&y)+l|0,u=(1&(1^y))+s|0,ar[(y?e+376700+(l<<2)|0:e+376636+(s<<2)|0)>>2]=(0|or[r+844+(b<<1)>>1])+(0|ar[92+(0|ar[n>>2])>>2]),(0|k)<=(0|(b=b+1|0))){l=d;break}s=u,l=d}else u=0;if(ar[e+376556>>2]=u,ar[e+376560>>2]=l,k=r+140|0,0<((0|ar[(h=r+144|0)>>2])+(0|ar[k>>2])|0))for(w=r+28|0,v=e+375388|0,u=l=d=0;b=0|ar[e+376232+(d<<2)>>2],0|tr[(s=r+244+d|0)>>0]&&(b=(0|ar[92+(0|ar[n>>2])>>2])+b-(0|ar[w>>2])-(0|br(0|ar[5032+(0|ar[v>>2])>>2],0|ar[e+376360+(d<<2)>>2]))|0),0|ar[e+376296+(d<<2)>>2]?(ar[e+376764+(l<<2)>>2]=b,ar[e+376424+(l<<2)>>2]=tr[s>>0],l=l+1|0):(ar[e+376828+(u<<2)>>2]=b,ar[e+376488+(u<<2)>>2]=tr[s>>0],u=u+1|0),(0|(d=d+1|0))<((0|ar[h>>2])+(0|ar[k>>2])|0););else u=l=0}ar[(v=e+376564|0)>>2]=l,ar[(w=e+376568|0)>>2]=u,m=A+376156|0,l=(0|ar[(g=A+376160|0)>>2])-(0|ar[m>>2])|0,u=l>>2,ar[t>>2]=0,ar[(b=4+t|0)>>2]=0,ar[(s=8+t|0)>>2]=0,0|u&&((0|l)<0&&zl(),p=0|hu((y=1+((u+-1|0)>>>5)|0)<<2),ar[t>>2]=p,ar[s>>2]=y,ar[b>>2]=u,vb(0|p,0,(y=u>>>5)<<2|0),l=u-(y<<5)|0,u=p+(y<<2)|0,0|l&&(ar[u>>2]=ar[u>>2]&~(-1>>>(32-l|0))));if(0<(0|(l=0|ar[v>>2])))for(d=e+376148|0,k=e+376156|0,h=e+375388|0,s=0;l=0|ar[(b=e+376764+(s<<2)|0)>>2],l=0|ar[e+376424+(s<<2)>>2]?0|Ko(d,l,i,1):0|qo(d,l,i,1),(0|(ar[(u=e+377084+(s<<2)|0)>>2]=l))<=-1&&(l=0|To(A,e,0|ar[h>>2],0|ar[b>>2],1),ar[u>>2]=l),y=(0|ar[t>>2])+(l>>>5<<2)|0,ar[y>>2]=ar[y>>2]|1<<(31&l),0|tr[10516+(0|ar[(0|ar[k>>2])+(l<<2)>>2])>>0]&&(tr[10516+(0|ar[n>>2])>>0]=4),s=s+1|0,l=0|ar[v>>2],(0|s)<(0|l););if(0<(0|(u=0|ar[w>>2]))){for(k=e+376148|0,h=e+375388|0,d=0;l=0|ar[(b=e+376828+(d<<2)|0)>>2],l=0|ar[e+376488+(d<<2)>>2]?0|Ko(k,l,i,1):0|qo(k,l,i,1),(0|(ar[(u=e+377148+(d<<2)|0)>>2]=l))<=-1&&(l=0|To(A,e,0|ar[h>>2],0|ar[b>>2],1),ar[u>>2]=l),s=(0|ar[t>>2])+(l>>>5<<2)|0,ar[s>>2]=ar[s>>2]|1<<(31&l),d=d+1|0,s=0|ar[w>>2],(0|d)<(0|s););l=0|ar[v>>2]}else s=u;if(0<(0|l))for(b=0|ar[e+376156>>2],u=0;ar[96+(0|ar[b+(ar[e+377084+(u<<2)>>2]<<2)>>2])>>2]=2,(0|(u=u+1|0))<(0|l););if(0<(0|s))for(u=0|ar[e+376156>>2],l=0;ar[96+(0|ar[u+(ar[e+377148+(l<<2)>>2]<<2)>>2])>>2]=2,(0|(l=l+1|0))<(0|s););if(0<(0|ar[(d=e+376552|0)>>2]))for(k=e+376148|0,h=e+376156|0,w=e+375388|0,s=0;l=0|Ko(k,0|ar[(u=e+376572+(s<<2)|0)>>2],i,0),(0|(ar[(b=e+376892+(s<<2)|0)>>2]=l))<=-1&&(l=0|To(A,e,0|ar[w>>2],0|ar[u>>2],0),ar[b>>2]=l),y=(0|ar[t>>2])+(l>>>5<<2)|0,ar[y>>2]=ar[y>>2]|1<<(31&l),0|tr[10516+(0|ar[(0|ar[h>>2])+(l<<2)>>2])>>0]&&(tr[10516+(0|ar[n>>2])>>0]=4),(0|(s=s+1|0))<(0|ar[d>>2]););if(0<(0|ar[(d=e+376556|0)>>2]))for(k=e+376148|0,h=e+376156|0,w=e+375388|0,s=0;l=0|Ko(k,0|ar[(u=e+376636+(s<<2)|0)>>2],i,0),(0|(ar[(b=e+376956+(s<<2)|0)>>2]=l))<=-1&&(l=0|To(A,e,0|ar[w>>2],0|ar[u>>2],0),ar[b>>2]=l),y=(0|ar[t>>2])+(l>>>5<<2)|0,ar[y>>2]=ar[y>>2]|1<<(31&l),0|tr[10516+(0|ar[(0|ar[h>>2])+(l<<2)>>2])>>0]&&(tr[10516+(0|ar[n>>2])>>0]=4),(0|(s=s+1|0))<(0|ar[d>>2]););if(0<(0|ar[(u=e+376560|0)>>2]))for(b=e+376148|0,l=0;s=0|Ko(b,0|ar[e+376700+(l<<2)>>2],i,0),-1<(0|(ar[e+377020+(l<<2)>>2]=s))&&(A=(0|ar[t>>2])+(s>>>5<<2)|0,ar[A>>2]=ar[A>>2]|1<<(31&s)),(0|(l=l+1|0))<(0|ar[u>>2]););if(u=0|ar[g>>2],l=0|ar[m>>2],0<(u-l|0))for(v=e+376156|0,h=e+376160|0,w=8+o|0,k=0,d=u;!(((u=ar[(0|ar[t>>2])+(k>>>5<<2)>>2]&1<<(31&k)?d:(u=0|ar[v>>2],b=(0|ar[h>>2])-u>>2>>>0>k>>>0?0|ar[u+(k<<2)>>2]:0,u=0|ar[n>>2],(0|b)!=(0|u)&&(0|ar[(B=b+104|0)>>2])>>>0>(0|ar[u>>2])>>>0&&0!=(0|ar[b+96>>2])?(b=0|ar[b>>2],ar[f>>2]=b,(s=0|ar[a>>2])>>>0<(0|ar[w>>2])>>>0?(ar[s>>2]=b,ar[a>>2]=s+4,b=d):(Mo(o,f),b=0|ar[g>>2],l=0|ar[m>>2],u=0|ar[n>>2]),ar[B>>2]=ar[u>>2],b):d))-l>>2|0)<=(0|(k=k+1|0)));)d=u;(0|(l=r+1344|0))!=(0|o)&&$e(l,0|ar[o>>2],0|ar[a>>2]);0|(l=0|ar[t>>2])&&vu(l);if(!(l=0|ar[o>>2]))return ur=c;(0|(u=0|ar[a>>2]))!=(0|l)&&(ar[a>>2]=u+(~((u+-4-l|0)>>>2)<<2));vu(l),ur=c}(A,e,r)),ar[l>>2]=1,function(A){A|=0,ar[14391]=A}(0|ar[92+(0|ar[b>>2])>>2]),tr[A+376208>>0]=0}else if(!(0|ar[e+376224>>2]))return ur=c,(r=0)|r;if((0|ar[r+20>>2])>>>0<2&&!(0|function(A,e,r){A|=0,e|=0;var i,f,n,t,o,a,c,l,u,b,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0;ur=(b=ur)+480|0,v=b+192|0,u=(l=b)+384|0,m=0|ar[912+(r|=0)>>2],h=0|ar[(i=r+328|0)>>2],k=(0|m)<(0|h)?h:m,s=96+(A=u)|0;for(;tr[A>>0]=0,A=A+1|0,(0|A)<(0|s););f=e+376552|0,n=e+376556|0,t=e+376564|0,o=e+376892|0,a=e+376956|0,c=e+377084|0,A=0;for(;!((0|k)<=(0|A));){if(0<(0|(d=0|ar[f>>2])))for(hb(v+(A<<2)|0,0|o,0|br((s=A-k|0)>>>0<(w=0-d|0)>>>0?w:s,-4)),s=0;(0|(A=A+1|0))<(0|k)&(0|(s=s+1|0))<(0|d););if(d=0|ar[n>>2],(0|A)<(0|k)&0<(0|d))for(hb(v+(A<<2)|0,0|a,0|br((s=A-k|0)>>>0<(w=0-(1<(0|d)?d:1)|0)>>>0?w:s,-4)),s=0;(0|(A=A+1|0))<(0|k)&(0|(s=s+1|0))<(0|d););if(d=0|ar[t>>2],(0|A)<(0|k)&0<(0|d))for(vb(u+A|0,1,0-(s=(s=A-k|0)>>>0<(w=0-(1<(0|d)?d:1)|0)>>>0?w:s)|0),hb(v+(A<<2)|0,0|c,0|br(s,-4)),s=0;(0|(A=A+1|0))<(0|k)&(0|(s=s+1|0))<(0|d););if(!A){Z=13;break}}if(13==(0|Z))return 20==(0|(A=0|ar[(s=e+84|0)>>2]))?(s=1001,A=19):(ar[s>>2]=A+1,s=1016),ar[e+4+(A<<2)>>2]=s,ur=b,(e=0)|e;17<=(0|h)&&sr(34944,34700,1781,34977);A:do{if(0<(0|h)){for(k=r+336|0,h=e+376156|0,w=e+376160|0,d=0;;){if(A=0|tr[k>>0]?0|cr[r+338+d>>0]:d,ar[(s=r+916+(d<<2)|0)>>2]=ar[v+(A<<2)>>2],tr[r+1300+d>>0]=0|tr[u+A>>0],A=0|ar[s>>2],s=0|ar[h>>2],(0|ar[w>>2])-s>>2>>>0<=A>>>0){A=0,Z=54;break}if(!(A=0|ar[s+(A<<2)>>2])){A=0,Z=54;break}if(ar[r+1044+(d<<2)>>2]=ar[A+92>>2],ar[r+1172+(d<<2)>>2]=ar[A+96>>2],d=d+1|0,(0|(A=0|ar[i>>2]))<=(0|d)){g=A;break A}}if(54==(0|Z))return ur=b,0|A}else g=h}while(0);if(0|ar[r+20>>2])return ur=b,0|(e=1);h=0|ar[(v=r+332|0)>>2],k=(0|m)<(0|h)?h:m,A=0;for(;!((0|k)<=(0|A));){if(0<(0|(d=0|ar[n>>2])))for(hb(l+(A<<2)|0,0|a,0|br((s=A-k|0)>>>0<(m=0-d|0)>>>0?m:s,-4)),s=0;(0|(A=A+1|0))<(0|k)&(0|(s=s+1|0))<(0|d););if(d=0|ar[f>>2],(0|A)<(0|k)&0<(0|d))for(hb(l+(A<<2)|0,0|o,0|br((s=A-k|0)>>>0<(m=0-(1<(0|d)?d:1)|0)>>>0?m:s,-4)),s=0;(0|(A=A+1|0))<(0|k)&(0|(s=s+1|0))<(0|d););if(d=0|ar[t>>2],(0|A)<(0|k)&0<(0|d))for(vb(48+u+A|0,1,0-(s=(s=A-k|0)>>>0<(m=0-(1<(0|d)?d:1)|0)>>>0?m:s)|0),hb(l+(A<<2)|0,0|c,0|br(s,-4)),s=0;(0|(A=A+1|0))<(0|k)&(0|(s=s+1|0))<(0|d););if(!A){Z=38;break}}if(38==(0|Z))return 20==(0|(A=0|ar[(s=e+84|0)>>2]))?(s=1001,A=19):(ar[s>>2]=A+1,s=1016),ar[e+4+(A<<2)>>2]=s,ur=b,(e=0)|e;if(16<(0|g))return 20==(0|(A=0|ar[(s=e+84|0)>>2]))?(s=1001,A=19):(ar[s>>2]=A+1,s=1012),ar[e+4+(A<<2)>>2]=s,ur=b,(e=0)|e;17<=(0|h)&&sr(35011,34700,1834,34977);if((0|h)<=0)return ur=b,0|(e=1);h=r+337|0,w=e+376156|0,k=e+376160|0,d=0;for(;;){if(A=0|tr[h>>0]?0|cr[r+354+d>>0]:d,ar[(s=r+980+(d<<2)|0)>>2]=ar[l+(A<<2)>>2],tr[r+1316+d>>0]=0|tr[48+u+A>>0],A=0|ar[s>>2],s=0|ar[w>>2],(0|ar[k>>2])-s>>2>>>0<=A>>>0){A=0,Z=54;break}if(!(A=0|ar[s+(A<<2)>>2])){A=0,Z=54;break}if(ar[r+1108+(d<<2)>>2]=ar[A+92>>2],ar[r+1236+(d<<2)>>2]=ar[A+96>>2],(0|(d=d+1|0))>=(0|ar[v>>2])){A=1,Z=54;break}}return 54!=(0|Z)?0:(ur=b,0|A)}(0,e,r)))return ur=c,(r=0)|r;u=0|tr[r+12>>0]?800+(0|ar[(l=u=e+376228|0)>>2])|0:(l=e+376228|0,r+16|0);return ar[r+800>>2]=ar[u>>2],ar[l>>2]=r,ur=c,0|(r=1)}(A,A,s,n,0|ar[(u=r+8|0)>>2],0|ar[u+4>>2],i,0|ar[r+16>>2]),a=0|ar[(b=A+376224|0)>>2],!u)return 0|a&&(tr[a+10516>>0]=2),Ba(A+548|0,r),0|(a=0|ar[s+1344>>2])&&((0|(c=0|ar[(i=s+1348|0)>>2]))!=(0|a)&&(ar[i>>2]=c+(~((c+-4-a|0)>>>2)<<2)),vu(a)),kt(s+1332|0),0|(a=0|ar[s+776>>2])&&((0|(c=0|ar[(i=s+780|0)>>2]))!=(0|a)&&(ar[i>>2]=c+(~((c+-4-a|0)>>>2)<<2)),vu(a)),vu(s),s=0|ar[n>>2],ur=t,0|s;if(ar[f>>2]=s,i=a+48|0,l=0|ar[(c=a+52|0)>>2],ar[s>>2]=l-(0|ar[i>>2])>>2,(0|l)==(0|ar[a+56>>2])?function(A,e){e|=0;var r,i,f,n,t,o=0,a=0,c=0,l=0;f=4+(A|=0)|0,n=0|ar[A>>2],t=(0|ar[f>>2])-n|0,1073741823<(o=1+(i=t>>2)|0)>>>0&&zl();c=(0|ar[(l=A+8|0)>>2])-n|0,a=c>>1,a=c>>2>>>0<536870911?a>>>0<o>>>0?o:a:1073741823;do{if(a){if(!(1073741823<a>>>0)){c=0|hu(a<<2);break}Zu(l=0|X(8),44519),ar[l>>2]=17660,I(0|l,4016,428)}else c=0}while(0);ar[(r=c+(i<<2)|0)>>2]=ar[e>>2],o=r+(0-i<<2)|0,0<(0|t)&&hb(0|o,0|n,0|t);if(ar[A>>2]=o,ar[f>>2]=4+r,ar[l>>2]=c+(a<<2),!n)return;vu(n)}(i,f):(ar[l>>2]=s,ar[c>>2]=4+(0|ar[c>>2])),et(e,1),rt(e),l=(0|ar[e>>2])-(0|ar[r+20>>2])|0,0<(0|ar[(u=s+768|0)>>2]))for(c=(a=0)|ar[(i=s+776|0)>>2];k=0|Za(r,0|ar[c+(a<<2)>>2],l),c=0|ar[i>>2],ar[(d=c+(a<<2)|0)>>2]=(0|ar[d>>2])-k,(0|(a=a+1|0))<(0|ar[u>>2]););if(0|tr[s+4>>0]){for(na((c=0|hu(10688))+8|0),i=(a=c+10632|0)+56|0;(0|(a=a+4|(ar[a>>2]=0)))<(0|i););ar[f>>2]=c,ar[c>>2]=ar[b>>2],(0|(i=0|ar[(a=A+377220|0)>>2]))==(0|ar[A+377224>>2])?function(A,e){e|=0;var r,i,f,n,t,o=0,a=0,c=0,l=0;f=4+(A|=0)|0,n=0|ar[A>>2],t=(0|ar[f>>2])-n|0,1073741823<(o=1+(i=t>>2)|0)>>>0&&zl();c=(0|ar[(l=A+8|0)>>2])-n|0,a=c>>1,a=c>>2>>>0<536870911?a>>>0<o>>>0?o:a:1073741823;do{if(a){if(!(1073741823<a>>>0)){c=0|hu(a<<2);break}Zu(l=0|X(8),44519),ar[l>>2]=17660,I(0|l,4016,428)}else c=0}while(0);ar[(r=c+(i<<2)|0)>>2]=ar[e>>2],o=r+(0-i<<2)|0,0<(0|t)&&hb(0|o,0|n,0|t);if(ar[A>>2]=o,ar[f>>2]=4+r,ar[l>>2]=c+(a<<2),!n)return;vu(n)}(A+377216|0,f):(ar[i>>2]=c,ar[a>>2]=4+(0|ar[a>>2]))}else a=A+377220|0;return(0|ar[A+377216>>2])!=(0|ar[a>>2])&&(l=0|hu(152),ar[l>>2]=0,ar[(i=l+4|0)>>2]=0,ar[l+32>>2]=0,Dn(l+44|(tr[l+36>>0]=0)),ar[l+124>>2]=0,ar[l+128>>2]=-1,ar[l+132>>2]=-1,ar[l+136>>2]=0,ar[l+144>>2]=A,ar[l+40>>2]=0,ar[l+140>>2]=0,ar[f>>2]=l,ar[l>>2]=r,ar[i>>2]=s,ar[(i=l+8|0)>>2]=ar[e>>2],ar[i+4>>2]=ar[e+4>>2],ar[i+8>>2]=ar[e+8>>2],ar[i+12>>2]=ar[e+12>>2],ar[i+16>>2]=ar[e+16>>2],ar[i+20>>2]=ar[e+20>>2],tr[l+36>>0]=0|tr[A+377228>>0],a=0|ar[(0|ar[a>>2])-4>>2],(0|(c=0|ar[(i=a+10636|0)>>2]))==(0|ar[a+10640>>2])?function(A,e){e|=0;var r,i,f,n,t,o=0,a=0,c=0,l=0;f=4+(A|=0)|0,n=0|ar[A>>2],t=(0|ar[f>>2])-n|0,1073741823<(o=1+(i=t>>2)|0)>>>0&&zl();c=(0|ar[(l=A+8|0)>>2])-n|0,a=c>>1,a=c>>2>>>0<536870911?a>>>0<o>>>0?o:a:1073741823;do{if(a){if(!(1073741823<a>>>0)){c=0|hu(a<<2);break}Zu(l=0|X(8),44519),ar[l>>2]=17660,I(0|l,4016,428)}else c=0}while(0);ar[(r=c+(i<<2)|0)>>2]=ar[e>>2],o=r+(0-i<<2)|0,0<(0|t)&&hb(0|o,0|n,0|t);if(ar[A>>2]=o,ar[f>>2]=4+r,ar[l>>2]=c+(a<<2),!n)return;vu(n)}(a+10632|0,f):(ar[c>>2]=l,ar[i>>2]=4+(0|ar[i>>2]))),k=0|Yo(A,f),ar[n>>2]=k,ur=t,(k=0)|k}function ir(A,e,r,i,f,n,t){A|=0,e|=0,f|=0,n|=0,t|=0;var o,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0;for(c=ur=(o=ur)+31&-32,ur=ur+112|0,100<(l=((i|=0)-(r|=0)|0)/12|0)>>>0?(c=0|yc(l))?g=a=c:gu():(a=c,g=0),c=0,b=r,s=a;(0|b)!=(0|i);)(u=0|tr[b+8+3>>0])<<24>>24<0?u=0|ar[b+4>>2]:u&=255,u?tr[s>>0]=1:(tr[s>>0]=2,c=c+1|0,l=l+-1|0),b=b+12|0,s=s+1|0;m=0,w=c;A:for(;;){c=0|ar[A>>2];do{if(c){if(0|Uf(c=(0|(u=0|ar[c+12>>2]))==(0|ar[c+16>>2])?0|jb[127&ar[36+(0|ar[c>>2])>>2]](c):0|gf(0|ar[u>>2]),-1)){ar[A>>2]=0,s=1;break}s=0==(0|ar[A>>2]);break}s=1}while(0);if(c=(u=0|ar[e>>2])?0|Uf(c=(0|(c=0|ar[u+12>>2]))==(0|ar[u+16>>2])?0|jb[127&ar[36+(0|ar[u>>2])>>2]](u):0|gf(0|ar[c>>2]),-1)?(u=ar[e>>2]=0,1):0:(u=0,1),b=0|ar[A>>2],!(0!=(0|l)&(s^c)))break;for(c=(0|(c=0|ar[b+12>>2]))==(0|ar[b+16>>2])?0|jb[127&ar[36+(0|ar[b>>2])>>2]](b):0|gf(0|ar[c>>2]),t||(c=0|Hb[31&ar[28+(0|ar[f>>2])>>2]](f,c)),v=m+1|0,k=r,d=0,h=a;(0|k)!=(0|i);){do{if(1==(0|tr[h>>0])){if(u=(0|tr[(b=k+8+3|0)>>0])<0?0|ar[k>>2]:k,u=0|ar[u+(m<<2)>>2],t||(u=0|Hb[31&ar[28+(0|ar[f>>2])>>2]](f,u)),s=l+-1|0,(0|c)!=(0|u)){tr[h>>0]=0,u=d,b=w,l=s;break}(u=0|tr[b>>0])<<24>>24<0?u=0|ar[k+4>>2]:u&=255,(0|u)==(0|v)?(tr[h>>0]=2,b=w+(u=1)|0,l=s):(u=1,b=w)}else u=d,b=w}while(0);k=k+12|0,d=u,h=h+1|0,w=b}if(d)if(c=0|ar[A>>2],(0|(b=0|ar[(u=c+12|0)>>2]))==(0|ar[c+16>>2])?jb[127&ar[40+(0|ar[c>>2])>>2]](c):(ar[u>>2]=b+4,gf(0|ar[b>>2])),1<(w+l|0)>>>0)for(b=r,s=a,c=w;;){if((0|b)==(0|i)){m=v,w=c;continue A}2==(0|tr[s>>0])&&((u=0|tr[b+8+3>>0])<<24>>24<0?u=0|ar[b+4>>2]:u&=255,(0|u)!=(0|v)&&(c=c+-1|(tr[s>>0]=0))),b=b+12|0,s=s+1|0}else m=v;else m=v}do{if(b){if(0|Uf(c=(0|(c=0|ar[b+12>>2]))==(0|ar[b+16>>2])?0|jb[127&ar[36+(0|ar[b>>2])>>2]](b):0|gf(0|ar[c>>2]),-1)){ar[A>>2]=0,l=1;break}l=0==(0|ar[A>>2]);break}l=1}while(0);do{if(u){if(0|Uf(c=(0|(c=0|ar[u+12>>2]))==(0|ar[u+16>>2])?0|jb[127&ar[36+(0|ar[u>>2])>>2]](u):0|gf(0|ar[c>>2]),-1)){ar[e>>2]=0,Z=41;break}if(l)break;Z=77;break}Z=41}while(0);for(41==(0|Z)&&l&&(Z=77),77==(0|Z)&&(ar[n>>2]=2|ar[n>>2]);;){if((0|r)==(0|i)){Z=81;break}if(2==(0|tr[a>>0]))break;r=r+12|0,a=a+1|0}return 81==(0|Z)&&(ar[n>>2]=4|ar[n>>2],r=i),Bc(g),ur=o,0|r}function fr(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f|=0;var n,t;return t=ur=(n=ur)+31&-32,ur=ur+16|0,ar[t>>2]=f,f=0|rf(r),r=0|Yc(A,e,i,t),0|f&&rf(f),ur=n,0|r}function nr(A,e,r){A|=0,e|=0,r|=0;var i=0;A:do{switch((176&ar[r+4>>2])<<24>>24){case 16:switch(i=A+1|0,(r=0|tr[A>>0])<<24>>24){case 43:case 45:A=i;break A}if(1<(e-A|0)&r<<24>>24==48){switch(0|tr[i>>0]){case 88:case 120:break;default:0;break A}A=A+2|0}else 0;break;case 32:A=e;break;default:0}}while(0);return 0|A}function dr(A,e,r){A|=0,e|=0;var i,f,n,t=0;for(2048&(r|=0)&&(tr[A>>0]=43,A=A+1|0),1024&r&&(tr[A>>0]=35,A=A+1|0),i=0!=(16384&r|0),(f=260==(0|(n=260&r)))?t=0:(tr[A>>0]=46,tr[A+1>>0]=42,t=1,A=A+2|0);(r=0|tr[e>>0])<<24>>24;)tr[A>>0]=r,e=e+1|0,A=A+1|0;A:do{switch(511&n){case 4:r=i?70:102;break;case 256:r=i?69:101;break;default:if(f){r=i?65:97;break A}r=i?71:103;break A}}while(0);return tr[A>>0]=r,0|t}function kr(A,e,r,i){A|=0,e|=0,r|=0,i|=0;var f,n;return n=ur=(f=ur)+31&-32,ur=ur+16|0,ar[n>>2]=i,i=0|rf(e),e=0|function(A,e,r){A|=0,e|=0,r|=0;var i,f=0,n=0,t=0;f=ur=(i=ur)+31&-32,ur=ur+16|0,ar[f>>2]=ar[r>>2],A=0<=(0|(f=0|Yc(0,0,e,f)))&&(t=0|yc(n=f+1|0),0!=(0|(ar[A>>2]=t)))?0|Yc(t,n,e,r):-1;return ur=i,0|A}(A,r,n),0|i&&rf(i),ur=f,0|e}function hr(A,e,r,i,f,n,t){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var o,a,c,l,u,b,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0;switch(l=ur=(b=ur)+31&-32,ur=ur+16|0,u=0|un(t|=0,59232),c=0|un(t,59248),fs[63&ar[20+(0|ar[c>>2])>>2]](l,c),ar[n>>2]=i,(t=0|tr[A>>0])<<24>>24){case 43:case 45:v=0|Hb[31&ar[28+(0|ar[u>>2])>>2]](u,t),s=0|ar[n>>2],ar[n>>2]=s+1,tr[s>>0]=v,s=A+1|0;break;default:s=A}v=r;A:do{if(1<(v-s|0)&&48==(0|tr[s>>0])){switch(0|tr[(t=s+1|0)>>0]){case 88:case 120:break;default:t=s,m=10;break A}for(h=0|Hb[31&ar[28+(0|ar[u>>2])>>2]](u,48),w=0|ar[n>>2],ar[n>>2]=w+1,tr[w>>0]=h,s=s+2|0,w=0|Hb[31&ar[28+(0|ar[u>>2])>>2]](u,0|tr[t>>0]),t=0|ar[n>>2],ar[n>>2]=t+1,tr[t>>0]=w,t=s;;){if(r>>>0<=t>>>0)break A;if(!(0|lf(w=0|tr[t>>0],dn())))break A;t=t+1|0}}else t=s,m=10}while(0);A:do{if(10==(0|m))for(;;){if(r>>>(m=0)<=t>>>0)break A;if(!(0|af(w=0|tr[t>>0],dn())))break A;t=t+1|0,m=10}}while(0);k=0|tr[(o=11+l|0)>>0],a=4+l|0,h=s,w=A;A:do{if(0|(k<<24>>24<0?0|ar[a>>2]:255&k)){e:do{if((0|s)!=(0|t))for(A=t,d=s;;){if((A=A+-1|0)>>>0<=d>>>0)break e;k=0|tr[d>>0],tr[d>>0]=0|tr[A>>0],tr[A>>0]=k,d=d+1|0}}while(0);for(k=0|jb[127&ar[16+(0|ar[c>>2])>>2]](c),A=d=0;!(t>>>0<=s>>>0);)0<(g=0|tr[((0|tr[o>>0])<0?0|ar[l>>2]:l)+A>>0])<<24>>24&(0|d)==(g<<24>>24|0)&&(d=0|ar[n>>2],ar[n>>2]=d+1,tr[d>>0]=k,A=(A>>>0<(((d=0|tr[o>>0])<<24>>24<0?0|ar[a>>2]:255&d)-1|0)>>>0&1)+A|0,d=0),Z=0|Hb[31&ar[28+(0|ar[u>>2])>>2]](u,0|tr[s>>0]),g=0|ar[n>>2],ar[n>>2]=g+1,tr[g>>0]=Z,s=s+1|0,d=d+1|0;if((0|(A=i+(h-w)|0))==(0|(s=0|ar[n>>2])))A=u;else for(;;){if((s=s+-1|0)>>>0<=A>>>0){A=u;break A}Z=0|tr[A>>0],tr[A>>0]=0|tr[s>>0],tr[s>>0]=Z,A=A+1|0}}else Pb[7&ar[32+(0|ar[u>>2])>>2]](u,s,t,0|ar[n>>2]),ar[n>>2]=(0|ar[n>>2])+(t-h),A=u}while(0);for(;!(r>>>0<=t>>>0);){if(s=0|tr[t>>0],t=t+1|0,s<<24>>24==46){m=29;break}g=0|Hb[31&ar[28+(0|ar[A>>2])>>2]](u,s),Z=0|ar[n>>2],ar[n>>2]=Z+1,tr[Z>>0]=g}29==(0|m)&&(g=0|jb[127&ar[12+(0|ar[c>>2])>>2]](c),Z=0|ar[n>>2],ar[n>>2]=Z+1,tr[Z>>0]=g),Pb[7&ar[32+(0|ar[u>>2])>>2]](u,t,r,0|ar[n>>2]),Z=(0|ar[n>>2])+(v-t)|0,ar[n>>2]=Z,ar[f>>2]=(0|e)==(0|r)?Z:i+(e-w)|0,Bu(l),ur=b}function wr(A,e,r,i){A|=0,e|=0,r|=0;var f=0;for(2048&(i|=0)&&(tr[A>>0]=43,A=A+1|0),f=512&i?(tr[A>>0]=35,A+1|0):A;(A=0|tr[e>>0])<<24>>24;)tr[f>>0]=A,e=e+1|0,f=f+1|0;switch(74&i){case 64:A=111;break;case 8:A=16384&i|0?88:120;break;default:A=r?100:117}tr[f>>0]=A}function vr(A,e,r,i,f,n,t){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var o,a,c,l,u,b,s=0,d=0,k=0,h=0,w=0;if(u=ur=(b=ur)+31&-32,ur=ur+16|0,c=0|un(t|=0,59232),d=0|un(t,59248),fs[63&ar[20+(0|ar[d>>2])>>2]](u,d),a=4+u|0,l=A,s=r,0|((k=0|tr[(o=11+u|0)>>0])<<24>>24<0?0|ar[a>>2]:255&k)){switch(ar[n>>2]=i,(t=0|tr[A>>0])<<24>>24){case 43:case 45:t=0|Hb[31&ar[28+(0|ar[c>>2])>>2]](c,t),k=0|ar[n>>2],ar[n>>2]=k+1,tr[k>>0]=t,A=A+1|0}A:do{if(1<(s-A|0)&&48==(0|tr[A>>0])){switch(0|tr[(t=A+1|0)>>0]){case 88:case 120:break;default:break A}k=0|Hb[31&ar[28+(0|ar[c>>2])>>2]](c,48),s=0|ar[n>>2],ar[n>>2]=s+1,tr[s>>0]=k,s=0|Hb[31&ar[28+(0|ar[c>>2])>>2]](c,0|tr[t>>0]),k=0|ar[n>>2],ar[n>>2]=k+1,tr[k>>0]=s,A=A+2|0}}while(0);A:do{if((0|A)!=(0|r))for(t=r,s=A;;){if((t=t+-1|0)>>>0<=s>>>0)break A;k=0|tr[s>>0],tr[s>>0]=0|tr[t>>0],tr[t>>0]=k,s=s+1|0}}while(0);for(k=0|jb[127&ar[16+(0|ar[d>>2])>>2]](d),d=A,s=t=0;!(r>>>0<=d>>>0);)(h=0|tr[((0|tr[o>>0])<0?0|ar[u>>2]:u)+t>>0])<<24>>24!=0&(0|s)==(h<<24>>24|0)&&(s=0|ar[n>>2],ar[n>>2]=s+1,tr[s>>0]=k,t=(t>>>0<(((s=0|tr[o>>0])<<24>>24<0?0|ar[a>>2]:255&s)-1|0)>>>0&1)+t|0,s=0),w=0|Hb[31&ar[28+(0|ar[c>>2])>>2]](c,0|tr[d>>0]),h=0|ar[n>>2],ar[n>>2]=h+1,tr[h>>0]=w,d=d+1|0,s=s+1|0;if((0|(t=i+(A-l)|0))!=(0|(A=0|ar[n>>2]))){for(;!((A=A+-1|0)>>>0<=t>>>0);)w=0|tr[t>>0],tr[t>>0]=0|tr[A>>0],tr[A>>0]=w,t=t+1|0;t=0|ar[n>>2]}}else Pb[7&ar[32+(0|ar[c>>2])>>2]](c,A,r,i),t=i+(s-l)|0,ar[n>>2]=t;ar[f>>2]=(0|e)==(0|r)?t:i+(e-l)|0,Bu(u),ur=b}function mr(A,e,r,i,f,n){e|=0,r|=0,i|=0,f|=0,n|=0;var t,o,a,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0;o=ur=(a=ur)+31&-32,ur=ur+16|0,t=12+o|0,c=0|ar[(A|=0)>>2];A:do{if(c){if(l=(0|(l=i-(h=e)>>2))<(0|(u=0|ar[(b=f+12|0)>>2]))?u-l|0:0,f=(h=(u=r)-h|0)>>2,0<(0|h)&&(0|xb[63&ar[48+(0|ar[c>>2])>>2]](c,e,f))!=(0|f)){c=ar[A>>2]=0;break}do{if(0<(0|l)){ar[o>>2]=0,ar[4+o>>2]=0,1073741807<l>>>(ar[8+o>>2]=0)&&pu();do{if(2<=l>>>0){if(!(1073741823<(f=l+4&2147483644)>>>0)){s=0|hu(f<<2),ar[o>>2]=s,ar[(d=8+o|0)>>2]=-2147483648|f,ar[4+o>>2]=l,d=d+3|0,k=o;break}lA()}else tr[(d=8+o+3|0)>>0]=l,k=s=o}while(0);if(gr(s,l,n),ln(s+(l<<2)|(ar[t>>2]=0),t),(0|xb[63&ar[48+(0|ar[c>>2])>>2]](c,(0|tr[d>>0])<0?0|ar[o>>2]:k,l))==(0|l)){Qu(o);break}ar[A>>2]=0,Qu(o),c=0;break A}}while(0);if(i=(h=i-u|0)>>2,0<(0|h)&&(0|xb[63&ar[48+(0|ar[c>>2])>>2]](c,r,i))!=(0|i)){c=ar[A>>2]=0;break}ar[b>>2]=0}else c=0}while(0);return ur=a,0|c}function gr(A,e,r){return A|=0,r|=0,(e|=0)&&function(A,e,r){A|=0,e|=0;var i=0;if(0|(r|=0))for(i=A;r=r+-1|0,ar[i>>2]=e,r;)i=i+4|0}(A,r,e),0|A}function Zr(A,e,r,i,f,n,t){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var o,a,c,l,u,b,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0;switch(l=ur=(b=ur)+31&-32,ur=ur+16|0,u=0|un(t|=0,59264),c=0|un(t,59272),fs[63&ar[20+(0|ar[c>>2])>>2]](l,c),ar[n>>2]=i,(t=0|tr[A>>0])<<24>>24){case 43:case 45:g=0|Hb[31&ar[44+(0|ar[u>>2])>>2]](u,t),t=0|ar[n>>2],ar[n>>2]=t+4,ar[t>>2]=g,t=A+1|0;break;default:t=A}g=r;A:do{if(1<(g-t|0)&&48==(0|tr[t>>0])){switch(0|tr[(s=t+1|0)>>0]){case 88:case 120:break;default:s=t,Z=10;break A}for(v=0|Hb[31&ar[44+(0|ar[u>>2])>>2]](u,48),m=0|ar[n>>2],ar[n>>2]=m+4,ar[m>>2]=v,t=t+2|0,m=0|Hb[31&ar[44+(0|ar[u>>2])>>2]](u,0|tr[s>>0]),s=0|ar[n>>2],ar[n>>2]=s+4,ar[s>>2]=m,s=t;;){if(r>>>0<=s>>>0)break A;if(!(0|lf(m=0|tr[s>>0],dn())))break A;s=s+1|0}}else s=t,Z=10}while(0);A:do{if(10==(0|Z))for(;;){if(r>>>(Z=0)<=s>>>0)break A;if(!(0|af(m=0|tr[s>>0],dn())))break A;s=s+1|0,Z=10}}while(0);w=0|tr[(o=11+l|0)>>0],a=4+l|0,v=t,m=A;A:do{if(0|(w<<24>>24<0?0|ar[a>>2]:255&w)){e:do{if((0|t)!=(0|s))for(A=s,d=t;;){if((A=A+-1|0)>>>0<=d>>>0)break e;w=0|tr[d>>0],tr[d>>0]=0|tr[A>>0],tr[A>>0]=w,d=d+1|0}}while(0);for(w=0|jb[127&ar[16+(0|ar[c>>2])>>2]](c),d=A=0;!(s>>>0<=t>>>0);)k=0|tr[o>>0],0<(p=0|tr[((h=k<<24>>24<0)?0|ar[l>>2]:l)+A>>0])<<24>>24&(0|d)==(p<<24>>24|0)&&(d=0|ar[n>>2],ar[n>>2]=d+4,ar[d>>2]=w,A=(A>>>0<((h?0|ar[a>>2]:255&k)-1|0)>>>0&1)+A|0,d=0),h=0|Hb[31&ar[44+(0|ar[u>>2])>>2]](u,0|tr[t>>0]),p=0|ar[n>>2],ar[n>>2]=p+4,ar[p>>2]=h,t=t+1|0,d=d+1|0;if((0|(t=i+(v-m<<2)|0))==(0|(d=0|ar[n>>2])))A=u;else for(A=d;;){if((A=A+-4|0)>>>0<=t>>>0){A=u,t=d;break A}p=0|ar[t>>2],ar[t>>2]=ar[A>>2],ar[A>>2]=p,t=t+4|0}}else Pb[7&ar[48+(0|ar[u>>2])>>2]](u,t,s,0|ar[n>>2]),t=(0|ar[n>>2])+(s-v<<2)|0,ar[n>>2]=t,A=u}while(0);for(;!(r>>>0<=s>>>0);){if(t=0|tr[s>>0],s=s+1|0,t<<24>>24==46){Z=29;break}v=0|Hb[31&ar[44+(0|ar[A>>2])>>2]](u,t),t=(p=0|ar[n>>2])+4|0,ar[n>>2]=t,ar[p>>2]=v}29==(0|Z)&&(Z=0|jb[127&ar[12+(0|ar[c>>2])>>2]](c),t=(p=0|ar[n>>2])+4|0,ar[n>>2]=t,ar[p>>2]=Z),Pb[7&ar[48+(0|ar[u>>2])>>2]](u,s,r,t),p=(0|ar[n>>2])+(g-s<<2)|0,ar[n>>2]=p,ar[f>>2]=(0|e)==(0|r)?p:i+(e-m<<2)|0,Bu(l),ur=b}function pr(A,e,r,i,f,n,t){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var o,a,c,l,u,b,s=0,d=0,k=0,h=0,w=0,v=0;if(u=ur=(b=ur)+31&-32,ur=ur+16|0,c=0|un(t|=0,59264),d=0|un(t,59272),fs[63&ar[20+(0|ar[d>>2])>>2]](u,d),a=4+u|0,l=A,s=r,0|((w=0|tr[(o=11+u|0)>>0])<<24>>24<0?0|ar[a>>2]:255&w)){switch(ar[n>>2]=i,(t=0|tr[A>>0])<<24>>24){case 43:case 45:h=0|Hb[31&ar[44+(0|ar[c>>2])>>2]](c,t),w=0|ar[n>>2],ar[n>>2]=w+4,ar[w>>2]=h,A=A+1|0}A:do{if(1<(s-A|0)&&48==(0|tr[A>>0])){switch(0|tr[(t=A+1|0)>>0]){case 88:case 120:break;default:break A}w=0|Hb[31&ar[44+(0|ar[c>>2])>>2]](c,48),h=0|ar[n>>2],ar[n>>2]=h+4,ar[h>>2]=w,h=0|Hb[31&ar[44+(0|ar[c>>2])>>2]](c,0|tr[t>>0]),w=0|ar[n>>2],ar[n>>2]=w+4,ar[w>>2]=h,A=A+2|0}}while(0);A:do{if((0|A)!=(0|r))for(t=r,s=A;;){if((t=t+-1|0)>>>0<=s>>>0)break A;w=0|tr[s>>0],tr[s>>0]=0|tr[t>>0],tr[t>>0]=w,s=s+1|0}}while(0);for(w=0|jb[127&ar[16+(0|ar[d>>2])>>2]](d),h=A,s=t=0;!(r>>>0<=h>>>0);)d=0|tr[o>>0],(v=0|tr[((k=d<<24>>24<0)?0|ar[u>>2]:u)+t>>0])<<24>>24!=0&(0|s)==(v<<24>>24|0)&&(s=0|ar[n>>2],ar[n>>2]=s+4,ar[s>>2]=w,t=(t>>>0<((k?0|ar[a>>2]:255&d)-1|0)>>>0&1)+t|0,s=0),k=0|Hb[31&ar[44+(0|ar[c>>2])>>2]](c,0|tr[h>>0]),v=0|ar[n>>2],ar[n>>2]=v+4,ar[v>>2]=k,h=h+1|0,s=s+1|0;if((0|(t=i+(A-l<<2)|0))!=(0|(A=0|ar[n>>2]))){for(;!((A=A+-4|0)>>>0<=t>>>0);)v=0|ar[t>>2],ar[t>>2]=ar[A>>2],ar[A>>2]=v,t=t+4|0;t=0|ar[n>>2]}}else Pb[7&ar[48+(0|ar[c>>2])>>2]](c,A,r,i),t=i+(s-l<<2)|0,ar[n>>2]=t;ar[f>>2]=(0|e)==(0|r)?t:i+(e-l<<2)|0,Bu(u),ur=b}function yr(A,e,r,i,f,n){e|=0,r|=0,i|=0,f|=0,n|=0;var t,o,a;a=ur=(t=ur)+31&-32,ur=ur+16|0,o=4+a|0,A=0|jb[127&ar[ar[(A=(A|=0)+8|0)>>2]>>2]](A),ar[a>>2]=ar[i>>2],ar[o>>2]=ar[a>>2],(0|(A=(0|Vn(r,o,A,A+168|0,n,f,0))-A|0))<168&&(ar[e>>2]=((0|A)/12|0)%7|0),ur=t}function Br(A,e,r,i,f,n){e|=0,r|=0,i|=0,f|=0,n|=0;var t,o,a;a=ur=(t=ur)+31&-32,ur=ur+16|0,o=4+a|0,A=0|jb[127&ar[4+(0|ar[(A=(A|=0)+8|0)>>2])>>2]](A),ar[a>>2]=ar[i>>2],ar[o>>2]=ar[a>>2],(0|(A=(0|Vn(r,o,A,A+288|0,n,f,0))-A|0))<288&&(ar[e>>2]=((0|A)/12|0)%12|0),ur=t}function Er(A,e,r,i,f,n,t,o){A|=0,e|=0,r|=0,f|=0,n|=0,t|=0,o|=0;var a,c,l,u,b,s,d,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0;s=ur=(d=ur)+31&-32,ur=ur+16|0,a=8+s|0,b=4+s|0,Tf(c=12+s|0,i|=0),l=0|un(c,59232),bn(c),u=8+l|(ar[f>>2]=0),k=0;A:for(;;){for(Z=(0|t)!=(0|o),h=k;;){if(k=0|ar[e>>2],!(Z&0==(0|h)))break A;g=(w=k)?0|Mf(h=(0|(h=0|ar[k+12>>2]))==(0|ar[k+16>>2])?0|jb[127&ar[36+(0|ar[k>>2])>>2]](k):0|hf(0|tr[h>>0]),-1)?(m=1,k=ar[e>>2]=0):(m=0,w):(k=0,m=1,w),h=v=0|ar[r>>2];do{if(v){if(0|Mf(w=(0|(w=0|ar[v+12>>2]))==(0|ar[v+16>>2])?0|jb[127&ar[36+(0|ar[v>>2])>>2]](v):0|hf(0|tr[w>>0]),-1)){h=ar[r>>2]=0,y=16;break}if(m)break;y=61;break A}y=16}while(0);if(16==(0|y)){if(y=0,m){y=61;break A}v=0}if((0|xb[63&ar[36+(0|ar[l>>2])>>2]](l,0|tr[t>>0],0))<<24>>24==37){y=19;break}if(-1<(h=0|tr[t>>0])<<24>>24&&(p=0|ar[u>>2],8192&or[p+(h<<24>>24<<1)>>1])){y=27;break}if(h=(0|(h=0|ar[(w=k+12|0)>>2]))==(0|ar[(v=k+16|0)>>2])?0|jb[127&ar[36+(0|ar[k>>2])>>2]](k):0|hf(0|tr[h>>0]),(g=0|Hb[31&ar[12+(0|ar[l>>2])>>2]](l,255&h))<<24>>24==(0|Hb[31&ar[12+(0|ar[l>>2])>>2]](l,0|tr[t>>0]))<<24>>24){y=57;break}h=ar[f>>2]=4}e:do{if(19==(0|y)){if(((y=0)|(m=t+1|0))==(0|o)){y=61;break A}switch((w=0|xb[63&ar[36+(0|ar[l>>2])>>2]](l,0|tr[m>>0],0))<<24>>24){case 48:case 69:if((0|(t=t+2|0))==(0|o)){y=61;break A}v=w,k=0|xb[63&ar[36+(0|ar[l>>2])>>2]](l,0|tr[t>>0],0),t=m;break;default:v=0,k=w}Z=0|ar[36+(0|ar[A>>2])>>2],ar[b>>2]=g,ar[s>>2]=h,ar[a>>2]=ar[b>>2],ar[c>>2]=ar[s>>2],Z=0|es[15&Z](A,a,c,i,f,n,k,v),ar[e>>2]=Z,t=t+2|0}else if(27==(0|y)){for(;;){if(((y=0)|(t=t+1|0))==(0|o)){t=o;break}if((h=0|tr[t>>0])<<24>>24<=-1)break;if(!(8192&or[p+(h<<24>>24<<1)>>1]))break;y=27}for(h=v;;){k?0|Mf(w=(0|(w=0|ar[k+12>>2]))==(0|ar[k+16>>2])?0|jb[127&ar[36+(0|ar[k>>2])>>2]](k):0|hf(0|tr[w>>0]),-1)?(m=1,k=ar[e>>2]=0):m=0:(m=1,k=0);do{if(v){if(0|Mf(w=(0|(w=0|ar[v+12>>2]))==(0|ar[v+16>>2])?0|jb[127&ar[36+(0|ar[v>>2])>>2]](v):0|hf(0|tr[w>>0]),-1)){h=ar[r>>2]=0,y=43;break}if(m^0==(0|h)){v=g=h;break}break e}y=43}while(0);if(43==(0|y)){if(y=0,m)break e;g=h,v=0}if((255&(h=(0|(h=0|ar[(w=k+12|0)>>2]))==(0|ar[(m=k+16|0)>>2])?0|jb[127&ar[36+(0|ar[k>>2])>>2]](k):0|hf(0|tr[h>>0])))<<24>>24<=-1)break e;if(!(8192&or[(0|ar[u>>2])+(h<<24>>24<<1)>>1]))break e;(0|(h=0|ar[w>>2]))!=(0|ar[m>>2])?(ar[w>>2]=h+1,hf(0|tr[h>>0]),h=g):(jb[127&ar[40+(0|ar[k>>2])>>2]](k),h=g)}}else if(57==(0|y)){if(t=t+1|(y=0),(0|(h=0|ar[w>>2]))==(0|ar[v>>2])){jb[127&ar[40+(0|ar[k>>2])>>2]](k);break}ar[w>>2]=h+1,hf(0|tr[h>>0]);break}}while(0);k=0|ar[f>>2]}61==(0|y)&&(ar[f>>2]=4),w=k?0|Mf(t=(0|(t=0|ar[k+12>>2]))==(0|ar[k+16>>2])?0|jb[127&ar[36+(0|ar[k>>2])>>2]](k):0|hf(0|tr[t>>0]),-1)?(k=ar[e>>2]=0,1):0:(k=0,1),t=0|ar[r>>2];do{if(t){if(0|Mf(t=(0|(h=0|ar[t+12>>2]))==(0|ar[t+16>>2])?0|jb[127&ar[36+(0|ar[t>>2])>>2]](t):0|hf(0|tr[h>>0]),-1)){ar[r>>2]=0,y=74;break}if(w)break;y=76;break}y=74}while(0);return 74==(0|y)&&w&&(y=76),76==(0|y)&&(ar[f>>2]=2|ar[f>>2]),ur=d,0|k}function Xr(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o;o=ur=(t=ur)+31&-32,ur=ur+16|0,A=4+o|0,ar[o>>2]=ar[i>>2],ar[A>>2]=ar[o>>2],((A=0|Jr(r,A,f,n,2))+-1|0)>>>0<31&0==(4&(r=0|ar[f>>2])|0)?ar[e>>2]=A:ar[f>>2]=4|r,ur=t}function Wr(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o;o=ur=(t=ur)+31&-32,ur=ur+16|0,A=4+o|0,ar[o>>2]=ar[i>>2],ar[A>>2]=ar[o>>2],(0|(A=0|Jr(r,A,f,n,2)))<24&0==(4&(r=0|ar[f>>2])|0)?ar[e>>2]=A:ar[f>>2]=4|r,ur=t}function Ir(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o;o=ur=(t=ur)+31&-32,ur=ur+16|0,A=4+o|0,ar[o>>2]=ar[i>>2],ar[A>>2]=ar[o>>2],((A=0|Jr(r,A,f,n,2))+-1|0)>>>0<12&0==(4&(r=0|ar[f>>2])|0)?ar[e>>2]=A:ar[f>>2]=4|r,ur=t}function Cr(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o;o=ur=(t=ur)+31&-32,ur=ur+16|0,A=4+o|0,ar[o>>2]=ar[i>>2],ar[A>>2]=ar[o>>2],(0|(A=0|Jr(r,A,f,n,3)))<366&0==(4&(r=0|ar[f>>2])|0)?ar[e>>2]=A:ar[f>>2]=4|r,ur=t}function Gr(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o;o=ur=(t=ur)+31&-32,ur=ur+16|0,A=4+o|0,ar[o>>2]=ar[i>>2],ar[A>>2]=ar[o>>2],(0|(A=0|Jr(r,A,f,n,2)))<13&0==(4&(r=0|ar[f>>2])|0)?ar[e>>2]=A+-1:ar[f>>2]=4|r,ur=t}function Vr(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o;o=ur=(t=ur)+31&-32,ur=ur+16|0,A=4+o|0,ar[o>>2]=ar[i>>2],ar[A>>2]=ar[o>>2],(0|(A=0|Jr(r,A,f,n,2)))<60&0==(4&(r=0|ar[f>>2])|0)?ar[e>>2]=A:ar[f>>2]=4|r,ur=t}function Fr(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0;var n,t=0,o=0;n=(f|=0)+8|0;A:for(;;){A=0|ar[e>>2];do{if(A){if(0|Mf(A=(0|(f=0|ar[A+12>>2]))==(0|ar[A+16>>2])?0|jb[127&ar[36+(0|ar[A>>2])>>2]](A):0|hf(0|tr[f>>0]),-1)){ar[e>>2]=0,t=1;break}t=0==(0|ar[e>>2]);break}t=1}while(0);f=0|ar[r>>2];do{if(f){if(0|Mf(A=(0|(A=0|ar[f+12>>2]))==(0|ar[f+16>>2])?0|jb[127&ar[36+(0|ar[f>>2])>>2]](f):0|hf(0|tr[A>>0]),-1)){ar[r>>2]=0,o=15;break}if(t){t=f;break}t=f;break A}o=15}while(0);if(15==(0|o)){if(o=0,t){t=0;break}t=0}if(A=0|ar[e>>2],(255&(A=(0|(f=0|ar[A+12>>2]))==(0|ar[A+16>>2])?0|jb[127&ar[36+(0|ar[A>>2])>>2]](A):0|hf(0|tr[f>>0])))<<24>>24<=-1)break;if(!(8192&or[(0|ar[n>>2])+(A<<24>>24<<1)>>1]))break;A=0|ar[e>>2],(0|(t=0|ar[(f=A+12|0)>>2]))!=(0|ar[A+16>>2])?(ar[f>>2]=t+1,hf(0|tr[t>>0])):jb[127&ar[40+(0|ar[A>>2])>>2]](A)}A=0|ar[e>>2];do{if(A){if(0|Mf(A=(0|(f=0|ar[A+12>>2]))==(0|ar[A+16>>2])?0|jb[127&ar[36+(0|ar[A>>2])>>2]](A):0|hf(0|tr[f>>0]),-1)){ar[e>>2]=0,f=1;break}f=0==(0|ar[e>>2]);break}f=1}while(0);do{if(t){if(0|Mf(A=(0|(A=0|ar[t+12>>2]))==(0|ar[t+16>>2])?0|jb[127&ar[36+(0|ar[t>>2])>>2]](t):0|hf(0|tr[A>>0]),-1)){ar[r>>2]=0,o=38;break}if(f)break;o=40;break}o=38}while(0);38==(0|o)&&f&&(o=40),40==(0|o)&&(ar[i>>2]=2|ar[i>>2])}function Rr(A,e,r,i,f,n){e|=0,r|=0,i|=0,f|=0,n|=0;var t,o,a,c=0,l=0;o=ur=(a=ur)+31&-32,ur=ur+16|0,t=4+o|0,l=0|jb[127&ar[8+(0|ar[(l=(A|=0)+8|0)>>2])>>2]](l),c=(A=0|tr[l+11>>0])<<24>>24<0?0|ar[l+4>>2]:255&A,(A=0|tr[l+12+11>>0])<<24>>24<0?A=0|ar[l+16>>2]:A&=255;do{if((0|c)!=(0-A|0)){if(ar[o>>2]=ar[i>>2],ar[t>>2]=ar[o>>2],A=(0|Vn(r,t,l,l+24|0,n,f,0))-l|0,12==(0|(c=0|ar[e>>2]))&0==(0|A)){ar[e>>2]=0;break}(0|c)<12&12==(0|A)&&(ar[e>>2]=c+12)}else ar[f>>2]=4|ar[f>>2]}while(0);ur=a}function Nr(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o;o=ur=(t=ur)+31&-32,ur=ur+16|0,A=4+o|0,ar[o>>2]=ar[i>>2],ar[A>>2]=ar[o>>2],(0|(A=0|Jr(r,A,f,n,2)))<61&0==(4&(r=0|ar[f>>2])|0)?ar[e>>2]=A:ar[f>>2]=4|r,ur=t}function _r(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o;o=ur=(t=ur)+31&-32,ur=ur+16|0,A=4+o|0,ar[o>>2]=ar[i>>2],ar[A>>2]=ar[o>>2],(0|(A=0|Jr(r,A,f,n,1)))<7&0==(4&(r=0|ar[f>>2])|0)?ar[e>>2]=A:ar[f>>2]=4|r,ur=t}function Yr(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o;o=ur=(t=ur)+31&-32,ur=ur+16|0,A=4+o|0,ar[o>>2]=ar[i>>2],ar[A>>2]=ar[o>>2],A=0|Jr(r,A,f,n,4),4&ar[f>>2]||(A=(0|A)<69?A+2e3|0:(0|A)<100?A+1900|0:A,ar[e>>2]=A+-1900),ur=t}function Qr(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o;o=ur=(t=ur)+31&-32,ur=ur+16|0,A=4+o|0,ar[o>>2]=ar[i>>2],ar[A>>2]=ar[o>>2],A=0|Jr(r,A,f,n,4),4&ar[f>>2]||(ar[e>>2]=A+-1900),ur=t}function Dr(A,e,r,i,f){A|=0,r|=0,i|=0,f|=0;var n=0,t=0,o=0,a=0;A=0|ar[(e|=0)>>2];do{if(A){if(0|Mf(A=(0|(n=0|ar[A+12>>2]))==(0|ar[A+16>>2])?0|jb[127&ar[36+(0|ar[A>>2])>>2]](A):0|hf(0|tr[n>>0]),-1)){ar[e>>2]=0,t=1;break}t=0==(0|ar[e>>2]);break}t=1}while(0);n=0|ar[r>>2];do{if(n){if(0|Mf(A=(0|(A=0|ar[n+12>>2]))==(0|ar[n+16>>2])?0|jb[127&ar[36+(0|ar[n>>2])>>2]](n):0|hf(0|tr[A>>0]),-1)){ar[r>>2]=0,a=14;break}if(t){o=n,a=16;break}A=6,a=38;break}a=14}while(0);14==(0|a)&&(a=t?(A=6,38):(o=0,16));A:do{if(16==(0|a))if(A=0|ar[e>>2],A=(0|(n=0|ar[A+12>>2]))==(0|ar[A+16>>2])?0|jb[127&ar[36+(0|ar[A>>2])>>2]](A):0|hf(0|tr[n>>0]),(0|xb[63&ar[36+(0|ar[f>>2])>>2]](f,255&A,0))<<24>>24==37){A=0|ar[e>>2],(0|(t=0|ar[(n=A+12|0)>>2]))==(0|ar[A+16>>2])?jb[127&ar[40+(0|ar[A>>2])>>2]](A):(ar[n>>2]=t+1,hf(0|tr[t>>0])),A=0|ar[e>>2];do{if(A){if(0|Mf(A=(0|(n=0|ar[A+12>>2]))==(0|ar[A+16>>2])?0|jb[127&ar[36+(0|ar[A>>2])>>2]](A):0|hf(0|tr[n>>0]),-1)){ar[e>>2]=0,n=1;break}n=0==(0|ar[e>>2]);break}n=1}while(0);do{if(0|o){if(0|Mf(A=(0|(A=0|ar[o+12>>2]))==(0|ar[o+16>>2])?0|jb[127&ar[36+(0|ar[o>>2])>>2]](o):0|hf(0|tr[A>>0]),-1)){ar[r>>2]=0;break}if(n)break A;A=2,a=38;break A}}while(0);n&&(A=2,a=38)}else A=4,a=38}while(0);38==(0|a)&&(ar[i>>2]=ar[i>>2]|A)}function Jr(A,e,r,i,f){e|=0,r|=0,i|=0,f|=0;var n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0;n=0|ar[(A|=0)>>2];do{if(n){if(0|Mf(n=(0|(t=0|ar[n+12>>2]))==(0|ar[n+16>>2])?0|jb[127&ar[36+(0|ar[n>>2])>>2]](n):0|hf(0|tr[t>>0]),-1)){ar[A>>2]=0,o=1;break}o=0==(0|ar[A>>2]);break}o=1}while(0);t=0|ar[e>>2];do{if(t){if(0|Mf(n=(0|(n=0|ar[t+12>>2]))==(0|ar[t+16>>2])?0|jb[127&ar[36+(0|ar[t>>2])>>2]](t):0|hf(0|tr[n>>0]),-1)){ar[e>>2]=0,k=14;break}if(o){k=17;break}k=16;break}k=14}while(0);14==(0|k)&&(k=o?16:(t=0,17));A:do{if(16==(0|k))ar[r>>2]=6|ar[r>>2],n=0;else if(17==(0|k)){if(n=0|ar[A>>2],-1<(o=255&(n=(0|(o=0|ar[n+12>>2]))==(0|ar[n+16>>2])?0|jb[127&ar[36+(0|ar[n>>2])>>2]](n):0|hf(0|tr[o>>0])))<<24>>24&&2048&or[(0|ar[(d=i+8|0)>>2])+(n<<24>>24<<1)>>1]){for(n=(0|xb[63&ar[36+(0|ar[i>>2])>>2]](i,o,0))<<24>>24,o=0|ar[A>>2],a=l=((0|(c=0|ar[(a=o+12|0)>>2]))==(0|ar[o+16>>2])?jb[127&ar[40+(0|ar[o>>2])>>2]](o):(ar[a>>2]=c+1,hf(0|tr[c>>0])),t);;){n=n+-48|0,s=f+-1|0,t=0|ar[A>>2];do{if(t){if(0|Mf(t=(0|(o=0|ar[t+12>>2]))==(0|ar[t+16>>2])?0|jb[127&ar[36+(0|ar[t>>2])>>2]](t):0|hf(0|tr[o>>0]),-1)){ar[A>>2]=0,c=1;break}c=0==(0|ar[A>>2]);break}c=1}while(0);do{if(a){if(0|Mf(t=(0|(t=0|ar[a+12>>2]))==(0|ar[a+16>>2])?0|jb[127&ar[36+(0|ar[a>>2])>>2]](a):0|hf(0|tr[t>>0]),-1)){t=1,u=b=ar[e>>2]=0;break}t=0==(0|(b=l)),u=l;break}b=l,t=1,u=0}while(0);if(o=0|ar[A>>2],!(1<(0|f)&(c^t)))break;if((o=255&(t=(0|(t=0|ar[o+12>>2]))==(0|ar[o+16>>2])?0|jb[127&ar[36+(0|ar[o>>2])>>2]](o):0|hf(0|tr[t>>0])))<<24>>24<=-1)break A;if(!(2048&or[(0|ar[d>>2])+(t<<24>>24<<1)>>1]))break A;n=((0|xb[63&ar[36+(0|ar[i>>2])>>2]](i,o,0))<<24>>24)+(10*n|0)|0,t=0|ar[A>>2],(0|(a=0|ar[(o=t+12|0)>>2]))!=(0|ar[t+16>>2])?(ar[o>>2]=a+1,hf(0|tr[a>>0]),f=s,l=b,a=u):(jb[127&ar[40+(0|ar[t>>2])>>2]](t),f=s,l=b,a=u)}do{if(o){if(0|Mf(t=(0|(t=0|ar[o+12>>2]))==(0|ar[o+16>>2])?0|jb[127&ar[36+(0|ar[o>>2])>>2]](o):0|hf(0|tr[t>>0]),-1)){ar[A>>2]=0,o=1;break}o=0==(0|ar[A>>2]);break}o=1}while(0);do{if(b){if(0|Mf(t=(0|(t=0|ar[b+12>>2]))==(0|ar[b+16>>2])?0|jb[127&ar[36+(0|ar[b>>2])>>2]](b):0|hf(0|tr[t>>0]),-1)){ar[e>>2]=0,k=62;break}if(o)break A;break}k=62}while(0);if(62==(0|k)&&!o)break;ar[r>>2]=2|ar[r>>2];break}ar[r>>2]=4|ar[r>>2],n=0}}while(0);return 0|n}function Mr(A){return 0|function(A){var e=0;e=A|=0;for(;0|ar[e>>2];)e=e+4|0;return e-A>>2|0}(A|=0)}function Tr(A,e,r,i,f,n){e|=0,r|=0,i|=0,f|=0,n|=0;var t,o,a;a=ur=(t=ur)+31&-32,ur=ur+16|0,o=4+a|0,A=0|jb[127&ar[ar[(A=(A|=0)+8|0)>>2]>>2]](A),ar[a>>2]=ar[i>>2],ar[o>>2]=ar[a>>2],(0|(A=(0|ir(r,o,A,A+168|0,n,f,0))-A|0))<168&&(ar[e>>2]=((0|A)/12|0)%7|0),ur=t}function Ur(A,e,r,i,f,n){e|=0,r|=0,i|=0,f|=0,n|=0;var t,o,a;a=ur=(t=ur)+31&-32,ur=ur+16|0,o=4+a|0,A=0|jb[127&ar[4+(0|ar[(A=(A|=0)+8|0)>>2])>>2]](A),ar[a>>2]=ar[i>>2],ar[o>>2]=ar[a>>2],(0|(A=(0|ir(r,o,A,A+288|0,n,f,0))-A|0))<288&&(ar[e>>2]=((0|A)/12|0)%12|0),ur=t}function Sr(A,e,r,i,f,n,t,o){A|=0,e|=0,r|=0,f|=0,n|=0,t|=0,o|=0;var a,c,l,u,b,s,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0;b=ur=(s=ur)+31&-32,ur=ur+16|0,a=8+b|0,u=4+b|0,Tf(c=12+b|0,i|=0),l=0|un(c,59264),bn(c),d=ar[f>>2]=0;A:for(;;){for(g=(0|t)!=(0|o),k=d;;){if(d=0|ar[e>>2],!(g&0==(0|k)))break A;m=(h=d)?0|Uf(k=(0|(k=0|ar[d+12>>2]))==(0|ar[d+16>>2])?0|jb[127&ar[36+(0|ar[d>>2])>>2]](d):0|gf(0|ar[k>>2]),-1)?(v=1,d=ar[e>>2]=0):(v=0,h):(d=0,v=1,h),k=w=0|ar[r>>2];do{if(w){if(0|Uf(h=(0|(h=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|gf(0|ar[h>>2]),-1)){k=ar[r>>2]=0,Z=16;break}if(v)break;Z=58;break A}Z=16}while(0);if(16==(0|Z)){if(Z=0,v){Z=58;break A}w=0}if((0|xb[63&ar[52+(0|ar[l>>2])>>2]](l,0|ar[t>>2],0))<<24>>24==37){Z=19;break}if(0|xb[63&ar[12+(0|ar[l>>2])>>2]](l,8192,0|ar[t>>2])){Z=26;break}if(k=(0|(k=0|ar[(h=d+12|0)>>2]))==(0|ar[(w=d+16|0)>>2])?0|jb[127&ar[36+(0|ar[d>>2])>>2]](d):0|gf(0|ar[k>>2]),(0|(m=0|Hb[31&ar[28+(0|ar[l>>2])>>2]](l,k)))==(0|Hb[31&ar[28+(0|ar[l>>2])>>2]](l,0|ar[t>>2]))){Z=54;break}k=ar[f>>2]=4}e:do{if(19==(0|Z)){if(((Z=0)|(v=t+4|0))==(0|o)){Z=58;break A}switch((h=0|xb[63&ar[52+(0|ar[l>>2])>>2]](l,0|ar[v>>2],0))<<24>>24){case 48:case 69:if((0|(t=t+8|0))==(0|o)){Z=58;break A}w=h,d=0|xb[63&ar[52+(0|ar[l>>2])>>2]](l,0|ar[t>>2],0),t=v;break;default:w=0,d=h}g=0|ar[36+(0|ar[A>>2])>>2],ar[u>>2]=m,ar[b>>2]=k,ar[a>>2]=ar[u>>2],ar[c>>2]=ar[b>>2],g=0|es[15&g](A,a,c,i,f,n,d,w),ar[e>>2]=g,t=t+8|0}else if(26==(0|Z)){for(;;){if(((Z=0)|(t=t+4|0))==(0|o)){t=o;break}if(!(0|xb[63&ar[12+(0|ar[l>>2])>>2]](l,8192,0|ar[t>>2])))break;Z=26}for(k=w;;){d?0|Uf(h=(0|(h=0|ar[d+12>>2]))==(0|ar[d+16>>2])?0|jb[127&ar[36+(0|ar[d>>2])>>2]](d):0|gf(0|ar[h>>2]),-1)?(v=1,d=ar[e>>2]=0):v=0:(v=1,d=0);do{if(w){if(0|Uf(h=(0|(h=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|gf(0|ar[h>>2]),-1)){k=ar[r>>2]=0,Z=41;break}if(v^0==(0|k)){w=m=k;break}break e}Z=41}while(0);if(41==(0|Z)){if(Z=0,v)break e;m=k,w=0}if(k=(0|(k=0|ar[(h=d+12|0)>>2]))==(0|ar[(v=d+16|0)>>2])?0|jb[127&ar[36+(0|ar[d>>2])>>2]](d):0|gf(0|ar[k>>2]),!(0|xb[63&ar[12+(0|ar[l>>2])>>2]](l,8192,k)))break e;(0|(k=0|ar[h>>2]))!=(0|ar[v>>2])?(ar[h>>2]=k+4,gf(0|ar[k>>2]),k=m):(jb[127&ar[40+(0|ar[d>>2])>>2]](d),k=m)}}else if(54==(0|Z)){if(t=t+4|(Z=0),(0|(k=0|ar[h>>2]))==(0|ar[w>>2])){jb[127&ar[40+(0|ar[d>>2])>>2]](d);break}ar[h>>2]=k+4,gf(0|ar[k>>2]);break}}while(0);d=0|ar[f>>2]}58==(0|Z)&&(ar[f>>2]=4),h=d?0|Uf(t=(0|(t=0|ar[d+12>>2]))==(0|ar[d+16>>2])?0|jb[127&ar[36+(0|ar[d>>2])>>2]](d):0|gf(0|ar[t>>2]),-1)?(d=ar[e>>2]=0,1):0:(d=0,1),t=0|ar[r>>2];do{if(t){if(0|Uf(t=(0|(k=0|ar[t+12>>2]))==(0|ar[t+16>>2])?0|jb[127&ar[36+(0|ar[t>>2])>>2]](t):0|gf(0|ar[k>>2]),-1)){ar[r>>2]=0,Z=71;break}if(h)break;Z=73;break}Z=71}while(0);return 71==(0|Z)&&h&&(Z=73),73==(0|Z)&&(ar[f>>2]=2|ar[f>>2]),ur=s,0|d}function Or(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o;o=ur=(t=ur)+31&-32,ur=ur+16|0,A=4+o|0,ar[o>>2]=ar[i>>2],ar[A>>2]=ar[o>>2],((A=0|ii(r,A,f,n,2))+-1|0)>>>0<31&0==(4&(r=0|ar[f>>2])|0)?ar[e>>2]=A:ar[f>>2]=4|r,ur=t}function zr(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o;o=ur=(t=ur)+31&-32,ur=ur+16|0,A=4+o|0,ar[o>>2]=ar[i>>2],ar[A>>2]=ar[o>>2],(0|(A=0|ii(r,A,f,n,2)))<24&0==(4&(r=0|ar[f>>2])|0)?ar[e>>2]=A:ar[f>>2]=4|r,ur=t}function jr(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o;o=ur=(t=ur)+31&-32,ur=ur+16|0,A=4+o|0,ar[o>>2]=ar[i>>2],ar[A>>2]=ar[o>>2],((A=0|ii(r,A,f,n,2))+-1|0)>>>0<12&0==(4&(r=0|ar[f>>2])|0)?ar[e>>2]=A:ar[f>>2]=4|r,ur=t}function Hr(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o;o=ur=(t=ur)+31&-32,ur=ur+16|0,A=4+o|0,ar[o>>2]=ar[i>>2],ar[A>>2]=ar[o>>2],(0|(A=0|ii(r,A,f,n,3)))<366&0==(4&(r=0|ar[f>>2])|0)?ar[e>>2]=A:ar[f>>2]=4|r,ur=t}function xr(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o;o=ur=(t=ur)+31&-32,ur=ur+16|0,A=4+o|0,ar[o>>2]=ar[i>>2],ar[A>>2]=ar[o>>2],(0|(A=0|ii(r,A,f,n,2)))<13&0==(4&(r=0|ar[f>>2])|0)?ar[e>>2]=A+-1:ar[f>>2]=4|r,ur=t}function Pr(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o;o=ur=(t=ur)+31&-32,ur=ur+16|0,A=4+o|0,ar[o>>2]=ar[i>>2],ar[A>>2]=ar[o>>2],(0|(A=0|ii(r,A,f,n,2)))<60&0==(4&(r=0|ar[f>>2])|0)?ar[e>>2]=A:ar[f>>2]=4|r,ur=t}function Lr(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f|=0;var n=0,t=0,o=0;A:for(;;){A=0|ar[e>>2];do{if(A){if(0|Uf(A=(0|(n=0|ar[A+12>>2]))==(0|ar[A+16>>2])?0|jb[127&ar[36+(0|ar[A>>2])>>2]](A):0|gf(0|ar[n>>2]),-1)){ar[e>>2]=0,t=1;break}t=0==(0|ar[e>>2]);break}t=1}while(0);n=0|ar[r>>2];do{if(n){if(0|Uf(A=(0|(A=0|ar[n+12>>2]))==(0|ar[n+16>>2])?0|jb[127&ar[36+(0|ar[n>>2])>>2]](n):0|gf(0|ar[A>>2]),-1)){ar[r>>2]=0,o=15;break}if(t){t=n;break}t=n;break A}o=15}while(0);if(15==(0|o)){if(o=0,t){t=0;break}t=0}if(A=0|ar[e>>2],A=(0|(n=0|ar[A+12>>2]))==(0|ar[A+16>>2])?0|jb[127&ar[36+(0|ar[A>>2])>>2]](A):0|gf(0|ar[n>>2]),!(0|xb[63&ar[12+(0|ar[f>>2])>>2]](f,8192,A)))break;A=0|ar[e>>2],(0|(t=0|ar[(n=A+12|0)>>2]))!=(0|ar[A+16>>2])?(ar[n>>2]=t+4,gf(0|ar[t>>2])):jb[127&ar[40+(0|ar[A>>2])>>2]](A)}A=0|ar[e>>2];do{if(A){if(0|Uf(A=(0|(n=0|ar[A+12>>2]))==(0|ar[A+16>>2])?0|jb[127&ar[36+(0|ar[A>>2])>>2]](A):0|gf(0|ar[n>>2]),-1)){ar[e>>2]=0,n=1;break}n=0==(0|ar[e>>2]);break}n=1}while(0);do{if(t){if(0|Uf(A=(0|(A=0|ar[t+12>>2]))==(0|ar[t+16>>2])?0|jb[127&ar[36+(0|ar[t>>2])>>2]](t):0|gf(0|ar[A>>2]),-1)){ar[r>>2]=0,o=37;break}if(n)break;o=39;break}o=37}while(0);37==(0|o)&&n&&(o=39),39==(0|o)&&(ar[i>>2]=2|ar[i>>2])}function Kr(A,e,r,i,f,n){e|=0,r|=0,i|=0,f|=0,n|=0;var t,o,a,c=0,l=0;o=ur=(a=ur)+31&-32,ur=ur+16|0,t=4+o|0,l=0|jb[127&ar[8+(0|ar[(l=(A|=0)+8|0)>>2])>>2]](l),c=(A=0|tr[l+8+3>>0])<<24>>24<0?0|ar[l+4>>2]:255&A,(A=0|tr[l+20+3>>0])<<24>>24<0?A=0|ar[l+16>>2]:A&=255;do{if((0|c)!=(0-A|0)){if(ar[o>>2]=ar[i>>2],ar[t>>2]=ar[o>>2],A=(0|ir(r,t,l,l+24|0,n,f,0))-l|0,12==(0|(c=0|ar[e>>2]))&0==(0|A)){ar[e>>2]=0;break}(0|c)<12&12==(0|A)&&(ar[e>>2]=c+12)}else ar[f>>2]=4|ar[f>>2]}while(0);ur=a}function qr(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o;o=ur=(t=ur)+31&-32,ur=ur+16|0,A=4+o|0,ar[o>>2]=ar[i>>2],ar[A>>2]=ar[o>>2],(0|(A=0|ii(r,A,f,n,2)))<61&0==(4&(r=0|ar[f>>2])|0)?ar[e>>2]=A:ar[f>>2]=4|r,ur=t}function $r(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o;o=ur=(t=ur)+31&-32,ur=ur+16|0,A=4+o|0,ar[o>>2]=ar[i>>2],ar[A>>2]=ar[o>>2],(0|(A=0|ii(r,A,f,n,1)))<7&0==(4&(r=0|ar[f>>2])|0)?ar[e>>2]=A:ar[f>>2]=4|r,ur=t}function Ai(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o;o=ur=(t=ur)+31&-32,ur=ur+16|0,A=4+o|0,ar[o>>2]=ar[i>>2],ar[A>>2]=ar[o>>2],A=0|ii(r,A,f,n,4),4&ar[f>>2]||(A=(0|A)<69?A+2e3|0:(0|A)<100?A+1900|0:A,ar[e>>2]=A+-1900),ur=t}function ei(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o;o=ur=(t=ur)+31&-32,ur=ur+16|0,A=4+o|0,ar[o>>2]=ar[i>>2],ar[A>>2]=ar[o>>2],A=0|ii(r,A,f,n,4),4&ar[f>>2]||(ar[e>>2]=A+-1900),ur=t}function ri(A,e,r,i,f){A|=0,r|=0,i|=0,f|=0;var n=0,t=0,o=0,a=0;A=0|ar[(e|=0)>>2];do{if(A){if(0|Uf(A=(0|(n=0|ar[A+12>>2]))==(0|ar[A+16>>2])?0|jb[127&ar[36+(0|ar[A>>2])>>2]](A):0|gf(0|ar[n>>2]),-1)){ar[e>>2]=0,t=1;break}t=0==(0|ar[e>>2]);break}t=1}while(0);n=0|ar[r>>2];do{if(n){if(0|Uf(A=(0|(A=0|ar[n+12>>2]))==(0|ar[n+16>>2])?0|jb[127&ar[36+(0|ar[n>>2])>>2]](n):0|gf(0|ar[A>>2]),-1)){ar[r>>2]=0,a=14;break}if(t){o=n,a=16;break}A=6,a=38;break}a=14}while(0);14==(0|a)&&(a=t?(A=6,38):(o=0,16));A:do{if(16==(0|a))if(A=0|ar[e>>2],A=(0|(n=0|ar[A+12>>2]))==(0|ar[A+16>>2])?0|jb[127&ar[36+(0|ar[A>>2])>>2]](A):0|gf(0|ar[n>>2]),(0|xb[63&ar[52+(0|ar[f>>2])>>2]](f,A,0))<<24>>24==37){A=0|ar[e>>2],(0|(t=0|ar[(n=A+12|0)>>2]))==(0|ar[A+16>>2])?jb[127&ar[40+(0|ar[A>>2])>>2]](A):(ar[n>>2]=t+4,gf(0|ar[t>>2])),A=0|ar[e>>2];do{if(A){if(0|Uf(A=(0|(n=0|ar[A+12>>2]))==(0|ar[A+16>>2])?0|jb[127&ar[36+(0|ar[A>>2])>>2]](A):0|gf(0|ar[n>>2]),-1)){ar[e>>2]=0,n=1;break}n=0==(0|ar[e>>2]);break}n=1}while(0);do{if(0|o){if(0|Uf(A=(0|(A=0|ar[o+12>>2]))==(0|ar[o+16>>2])?0|jb[127&ar[36+(0|ar[o>>2])>>2]](o):0|gf(0|ar[A>>2]),-1)){ar[r>>2]=0;break}if(n)break A;A=2,a=38;break A}}while(0);n&&(A=2,a=38)}else A=4,a=38}while(0);38==(0|a)&&(ar[i>>2]=ar[i>>2]|A)}function ii(A,e,r,i,f){e|=0,r|=0,i|=0,f|=0;var n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0;n=0|ar[(A|=0)>>2];do{if(n){if(0|Uf(n=(0|(t=0|ar[n+12>>2]))==(0|ar[n+16>>2])?0|jb[127&ar[36+(0|ar[n>>2])>>2]](n):0|gf(0|ar[t>>2]),-1)){ar[A>>2]=0,o=1;break}o=0==(0|ar[A>>2]);break}o=1}while(0);t=0|ar[e>>2];do{if(t){if(0|Uf(n=(0|(n=0|ar[t+12>>2]))==(0|ar[t+16>>2])?0|jb[127&ar[36+(0|ar[t>>2])>>2]](t):0|gf(0|ar[n>>2]),-1)){ar[e>>2]=0,d=14;break}if(o){d=17;break}d=16;break}d=14}while(0);14==(0|d)&&(d=o?16:(t=0,17));A:do{if(16==(0|d))ar[r>>2]=6|ar[r>>2],n=0;else if(17==(0|d)){if(n=0|ar[A>>2],n=(0|(o=0|ar[n+12>>2]))==(0|ar[n+16>>2])?0|jb[127&ar[36+(0|ar[n>>2])>>2]](n):0|gf(0|ar[o>>2]),!(0|xb[63&ar[12+(0|ar[i>>2])>>2]](i,2048,n))){ar[r>>2]=4|ar[r>>2],n=0;break}for(n=(0|xb[63&ar[52+(0|ar[i>>2])>>2]](i,n,0))<<24>>24,o=0|ar[A>>2],a=l=((0|(c=0|ar[(a=o+12|0)>>2]))==(0|ar[o+16>>2])?jb[127&ar[40+(0|ar[o>>2])>>2]](o):(ar[a>>2]=c+4,gf(0|ar[c>>2])),t);;){n=n+-48|0,s=f+-1|0,t=0|ar[A>>2];do{if(t){if(0|Uf(t=(0|(o=0|ar[t+12>>2]))==(0|ar[t+16>>2])?0|jb[127&ar[36+(0|ar[t>>2])>>2]](t):0|gf(0|ar[o>>2]),-1)){ar[A>>2]=0,c=1;break}c=0==(0|ar[A>>2]);break}c=1}while(0);do{if(a){if(0|Uf(t=(0|(t=0|ar[a+12>>2]))==(0|ar[a+16>>2])?0|jb[127&ar[36+(0|ar[a>>2])>>2]](a):0|gf(0|ar[t>>2]),-1)){t=1,u=b=ar[e>>2]=0;break}t=0==(0|(b=l)),u=l;break}b=l,t=1,u=0}while(0);if(o=0|ar[A>>2],!(1<(0|f)&(c^t)))break;if(t=(0|(t=0|ar[o+12>>2]))==(0|ar[o+16>>2])?0|jb[127&ar[36+(0|ar[o>>2])>>2]](o):0|gf(0|ar[t>>2]),!(0|xb[63&ar[12+(0|ar[i>>2])>>2]](i,2048,t)))break A;n=((0|xb[63&ar[52+(0|ar[i>>2])>>2]](i,t,0))<<24>>24)+(10*n|0)|0,t=0|ar[A>>2],(0|(a=0|ar[(o=t+12|0)>>2]))!=(0|ar[t+16>>2])?(ar[o>>2]=a+4,gf(0|ar[a>>2]),f=s,l=b,a=u):(jb[127&ar[40+(0|ar[t>>2])>>2]](t),f=s,l=b,a=u)}do{if(o){if(0|Uf(t=(0|(t=0|ar[o+12>>2]))==(0|ar[o+16>>2])?0|jb[127&ar[36+(0|ar[o>>2])>>2]](o):0|gf(0|ar[t>>2]),-1)){ar[A>>2]=0,o=1;break}o=0==(0|ar[A>>2]);break}o=1}while(0);do{if(b){if(0|Uf(t=(0|(t=0|ar[b+12>>2]))==(0|ar[b+16>>2])?0|jb[127&ar[36+(0|ar[b>>2])>>2]](b):0|gf(0|ar[t>>2]),-1)){ar[e>>2]=0,d=60;break}if(o)break A;break}d=60}while(0);if(60==(0|d)&&!o)break;ar[r>>2]=2|ar[r>>2]}}while(0);return 0|n}function fi(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o,a,c,l,u=0;t=ur=(a=ur)+31&-32,ur=ur+16|0,tr[t>>0]=37,tr[(o=1+t|0)>>0]=f,tr[(u=2+t|0)>>0]=n,tr[3+t>>0]=0,n<<24>>24&&(tr[o>>0]=n,tr[u>>0]=f),u=0|(c=e,l=0|ar[r>>2],(l|=0)-(c|=0)|0),u=e+(0|EA(0|e,0|u,0|t,0|i,0|ar[A>>2]))|0,ar[r>>2]=u,ur=a}function ni(A){(0|(0|ar[(A|=0)>>2]))!=(0|dn())&&of(0|ar[A>>2])}function ti(){lA()}function oi(A,e,r){return A|=0,r|=0,0|(e|=0)&&vb(0|A,255&(0|hf(r))|0,0|e),0|A}function ai(A,e,r,i,f,n,t,o,a,c,l){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0,l|=0;var u,b,s,d,k,h,w,v,m,g,Z,p,y,B,E,X,W,I,C,G,V,F,R,N,_,Y,Q,D,J,M=0,T=0,U=0,S=0,O=0,z=0,j=0,H=0;for(V=ur=(J=ur)+31&-32,ur=ur+512|0,j=96+V|0,D=80+V|0,G=72+V|0,E=68+V|0,X=500+V|0,W=497+V|0,I=496+V|0,F=56+V|0,R=44+V|0,N=32+V|0,_=20+V|0,Y=8+V|0,C=4+V|0,ar[(B=88+V|0)>>2]=l,ar[D>>2]=j,ar[(Q=4+D|0)>>2]=444,ar[G>>2]=j,ar[E>>2]=j+400,ar[F>>2]=0,ar[4+F>>2]=0,l=ar[8+F>>2]=0;3!=(0|l);)l=l+1|(ar[F+(l<<2)>>2]=0);for(ar[R>>2]=0,ar[4+R>>2]=0,l=ar[8+R>>2]=0;3!=(0|l);)l=l+1|(ar[R+(l<<2)>>2]=0);for(ar[N>>2]=0,ar[4+N>>2]=0,l=ar[8+N>>2]=0;3!=(0|l);)l=l+1|(ar[N+(l<<2)>>2]=0);for(ar[_>>2]=0,ar[4+_>>2]=0,l=ar[8+_>>2]=0;3!=(0|l);)l=l+1|(ar[_+(l<<2)>>2]=0);for(ar[Y>>2]=0,ar[4+Y>>2]=0,l=ar[8+Y>>2]=0;3!=(0|l);)l=l+1|(ar[Y+(l<<2)>>2]=0);!function(A,e,r,i,f,n,t,o,a,c){e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0;var l,u,b;if(u=ur=(b=ur)+31&-32,ur=ur+16|0,l=12+u|0,A|=0){for(e=0|un(e,60952),fs[63&ar[44+(0|ar[e>>2])>>2]](l,e),A=0|ar[l>>2],tr[r>>0]=A,tr[r+1>>0]=A>>8,tr[r+2>>0]=A>>16,tr[r+3>>0]=A>>24,fs[63&ar[32+(0|ar[e>>2])>>2]](u,e),A=((0|tr[(A=a+11|0)>>0])<0?(A=0|ar[a>>2],tr[l>>0]=0,Qf(A,l),ar[a+4>>2]=0):(tr[l>>0]=0,Qf(a,l),tr[A>>0]=0),a),Cu(a,0),ar[A>>2]=ar[u>>2],ar[A+4>>2]=ar[4+u>>2],ar[A+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)ar[u+(A<<2)>>2]=0,A=A+1|0;for(Bu(u),fs[63&ar[28+(0|ar[e>>2])>>2]](u,e),A=((0|tr[(A=o+11|0)>>0])<0?(A=0|ar[o>>2],tr[l>>0]=0,Qf(A,l),ar[o+4>>2]=0):(tr[l>>0]=0,Qf(o,l),tr[A>>0]=0),o),Cu(o,0),ar[A>>2]=ar[u>>2],ar[A+4>>2]=ar[4+u>>2],ar[A+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)ar[u+(A<<2)>>2]=0,A=A+1|0;for(Bu(u),A=0|jb[127&ar[12+(0|ar[e>>2])>>2]](e),tr[i>>0]=A,A=0|jb[127&ar[16+(0|ar[e>>2])>>2]](e),tr[f>>0]=A,fs[63&ar[20+(0|ar[e>>2])>>2]](u,e),A=((0|tr[(A=n+11|0)>>0])<0?(A=0|ar[n>>2],tr[l>>0]=0,Qf(A,l),ar[n+4>>2]=0):(tr[l>>0]=0,Qf(n,l),tr[A>>0]=0),n),Cu(n,0),ar[A>>2]=ar[u>>2],ar[A+4>>2]=ar[4+u>>2],ar[A+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)ar[u+(A<<2)>>2]=0,A=A+1|0;for(Bu(u),fs[63&ar[24+(0|ar[e>>2])>>2]](u,e),A=((0|tr[(A=t+11|0)>>0])<0?(A=0|ar[t>>2],tr[l>>0]=0,Qf(A,l),ar[t+4>>2]=0):(tr[l>>0]=0,Qf(t,l),tr[A>>0]=0),t),Cu(t,0),ar[A>>2]=ar[u>>2],ar[A+4>>2]=ar[4+u>>2],ar[A+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)ar[u+(A<<2)>>2]=0,A=A+1|0;Bu(u),A=0|jb[127&ar[36+(0|ar[e>>2])>>2]](e)}else{for(e=0|un(e,60944),fs[63&ar[44+(0|ar[e>>2])>>2]](l,e),A=0|ar[l>>2],tr[r>>0]=A,tr[r+1>>0]=A>>8,tr[r+2>>0]=A>>16,tr[r+3>>0]=A>>24,fs[63&ar[32+(0|ar[e>>2])>>2]](u,e),A=((0|tr[(A=a+11|0)>>0])<0?(A=0|ar[a>>2],tr[l>>0]=0,Qf(A,l),ar[a+4>>2]=0):(tr[l>>0]=0,Qf(a,l),tr[A>>0]=0),a),Cu(a,0),ar[A>>2]=ar[u>>2],ar[A+4>>2]=ar[4+u>>2],ar[A+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)ar[u+(A<<2)>>2]=0,A=A+1|0;for(Bu(u),fs[63&ar[28+(0|ar[e>>2])>>2]](u,e),A=((0|tr[(A=o+11|0)>>0])<0?(A=0|ar[o>>2],tr[l>>0]=0,Qf(A,l),ar[o+4>>2]=0):(tr[l>>0]=0,Qf(o,l),tr[A>>0]=0),o),Cu(o,0),ar[A>>2]=ar[u>>2],ar[A+4>>2]=ar[4+u>>2],ar[A+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)ar[u+(A<<2)>>2]=0,A=A+1|0;for(Bu(u),A=0|jb[127&ar[12+(0|ar[e>>2])>>2]](e),tr[i>>0]=A,A=0|jb[127&ar[16+(0|ar[e>>2])>>2]](e),tr[f>>0]=A,fs[63&ar[20+(0|ar[e>>2])>>2]](u,e),A=((0|tr[(A=n+11|0)>>0])<0?(A=0|ar[n>>2],tr[l>>0]=0,Qf(A,l),ar[n+4>>2]=0):(tr[l>>0]=0,Qf(n,l),tr[A>>0]=0),n),Cu(n,0),ar[A>>2]=ar[u>>2],ar[A+4>>2]=ar[4+u>>2],ar[A+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)ar[u+(A<<2)>>2]=0,A=A+1|0;for(Bu(u),fs[63&ar[24+(0|ar[e>>2])>>2]](u,e),A=((0|tr[(A=t+11|0)>>0])<0?(A=0|ar[t>>2],tr[l>>0]=0,Qf(A,l),ar[t+4>>2]=0):(tr[l>>0]=0,Qf(t,l),tr[A>>0]=0),t),Cu(t,0),ar[A>>2]=ar[u>>2],ar[A+4>>2]=ar[4+u>>2],ar[A+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)ar[u+(A<<2)>>2]=0,A=A+1|0;Bu(u),A=0|jb[127&ar[36+(0|ar[e>>2])>>2]](e)}ar[c>>2]=A,ur=b}(r,i,X,W,I,F,R,N,_,C),ar[c>>2]=ar[a>>2],m=o+8|0,g=11+N|0,Z=4+N|0,p=11+_|0,y=4+_|0,u=0!=(512&f|0),b=11+R|0,s=4+R|0,d=11+Y|0,k=4+Y|0,h=3+X|0,w=11+F|0,v=4+F|0,z=j=0;A:for(;;){if(o=0!=(0|j),4<=z>>>0){H=234;break}l=0|ar[A>>2];do{if(l){if(0|Mf(l=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|hf(0|tr[r>>0]),-1)){ar[A>>2]=0,i=1;break}i=0==(0|ar[A>>2]);break}i=1}while(0);r=0|ar[e>>2];do{if(r){if(0|Mf(l=(0|(l=0|ar[r+12>>2]))==(0|ar[r+16>>2])?0|jb[127&ar[36+(0|ar[r>>2])>>2]](r):0|hf(0|tr[l>>0]),-1)){ar[e>>2]=0,H=31;break}if(i){O=r;break}H=234;break A}H=31}while(0);if(31==(0|H)){if(H=0,i){H=234;break}O=0}l=3!=(0|z);e:do{switch(0|tr[X+z>>0]){case 1:if(l){if(l=0|ar[A>>2],(255&(l=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|hf(0|tr[r>>0])))<<24>>24<=-1){H=44;break A}if(!(8192&or[(0|ar[m>>2])+(l<<24>>24<<1)>>1])){H=44;break A}l=0|ar[A>>2],_u(Y,255&(l=(0|(i=0|ar[(r=l+12|0)>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[40+(0|ar[l>>2])>>2]](l):(ar[r>>2]=i+1,0|hf(0|tr[i>>0])))),o=l=O,H=46}else l=j;break;case 0:l?(o=l=O,H=46):l=j;break;case 3:if((0|(l=(l=0|tr[g>>0])<<24>>24<0?0|ar[Z>>2]:255&l))==(0-(o=(o=0|tr[p>>0])<<24>>24<0?0|ar[y>>2]:255&o)|0))l=j;else{if(f=0==(0|l),l=0|ar[A>>2],i=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2]),f|0==(0|o)){if(l=i?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|hf(0|tr[r>>0]),l&=255,f){if(l<<24>>24!=(0|tr[((0|tr[p>>0])<0?0|ar[_>>2]:_)>>0])){l=j;break e}l=0|ar[A>>2],(0|(i=0|ar[(r=l+12|0)>>2]))==(0|ar[l+16>>2])?jb[127&ar[40+(0|ar[l>>2])>>2]](l):(ar[r>>2]=i+1,hf(0|tr[i>>0])),l=(tr[t>>0]=1)<((l=0|tr[p>>0])<<24>>24<0?0|ar[y>>2]:255&l)>>>0?_:j;break e}if(l<<24>>24!=(0|tr[((0|tr[g>>0])<0?0|ar[N>>2]:N)>>0])){tr[t>>0]=1,l=j;break e}l=0|ar[A>>2],(0|(i=0|ar[(r=l+12|0)>>2]))==(0|ar[l+16>>2])?jb[127&ar[40+(0|ar[l>>2])>>2]](l):(ar[r>>2]=i+1,hf(0|tr[i>>0])),l=1<((l=0|tr[g>>0])<<24>>24<0?0|ar[Z>>2]:255&l)>>>0?N:j;break e}if(l=i?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|hf(0|tr[r>>0]),r=0|ar[A>>2],f=(0|(o=0|ar[(i=r+12|0)>>2]))==(0|ar[r+16>>2]),(255&l)<<24>>24==(0|tr[((0|tr[g>>0])<0?0|ar[N>>2]:N)>>0])){f?jb[127&ar[40+(0|ar[r>>2])>>2]](r):(ar[i>>2]=o+1,hf(0|tr[o>>0])),l=1<((l=0|tr[g>>0])<<24>>24<0?0|ar[Z>>2]:255&l)>>>0?N:j;break e}if((255&(l=f?0|jb[127&ar[36+(0|ar[r>>2])>>2]](r):0|hf(0|tr[o>>0])))<<24>>24!=(0|tr[((0|tr[p>>0])<0?0|ar[_>>2]:_)>>0])){H=103;break A}l=0|ar[A>>2],(0|(i=0|ar[(r=l+12|0)>>2]))==(0|ar[l+16>>2])?jb[127&ar[40+(0|ar[l>>2])>>2]](l):(ar[r>>2]=i+1,hf(0|tr[i>>0])),l=(tr[t>>0]=1)<((l=0|tr[p>>0])<<24>>24<0?0|ar[y>>2]:255&l)>>>0?_:j}break;case 2:if(!(z>>>0<2|o)&&!(u|2==(0|z)&0!=(0|tr[h>>0]))){l=0;break e}l=(r=0|tr[b>>0])<<24>>24<0,U=0|ar[R>>2],T=i=l?U:R;r:do{if(0!=(0|z)&&(0|cr[X+(z+-1)>>0])<2){for(l=i+(l?0|ar[s>>2]:255&r)|0,M=T;(0|(o=M))!=(0|l)&&!((f=0|tr[o>>0])<<24>>24<=-1)&&8192&or[(0|ar[m>>2])+(f<<24>>24<<1)>>1];)M=o+1|0;if((f=M-T|0)>>>0<=(o=(l=(o=0|tr[d>>0])<<24>>24<0)?0|ar[k>>2]:255&o)>>>0)for(l=(o=(l?0|ar[Y>>2]:Y)+o|0)+(0-f)|0;;){if((0|l)==(0|o)){i=M,l=U,o=S=O;break r}if((0|tr[l>>0])!=(0|tr[i>>0])){i=T,l=U,o=S=O;break r}i=i+1|0,l=l+1|0}else i=T,l=U,o=S=O}else i=T,l=U,o=S=O}while(0);r:for(;l=((M=r<<24>>24<0)?l:R)+(M?0|ar[s>>2]:255&r)|0,(0|(M=i))!=(0|l);){l=0|ar[A>>2];do{if(l){if(0|Mf(l=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|hf(0|tr[r>>0]),-1)){ar[A>>2]=0,r=1;break}r=0==(0|ar[A>>2]);break}r=1}while(0);do{if(o){if(0|Mf(l=(0|(l=0|ar[o+12>>2]))==(0|ar[o+16>>2])?0|jb[127&ar[36+(0|ar[o>>2])>>2]](o):0|hf(0|tr[l>>0]),-1)){l=ar[e>>2]=0,H=132;break}if(r^0==(0|S)){f=l=S;break}l=M;break r}l=S,H=132}while(0);if(132==(0|H)){if(H=0,r){l=M;break}f=0}if(r=0|ar[A>>2],(255&(r=(0|(i=0|ar[r+12>>2]))==(0|ar[r+16>>2])?0|jb[127&ar[36+(0|ar[r>>2])>>2]](r):0|hf(0|tr[i>>0])))<<24>>24!=(0|tr[M>>0])){l=M;break}r=0|ar[A>>2],(0|(o=0|ar[(i=r+12|0)>>2]))==(0|ar[r+16>>2])?jb[127&ar[40+(0|ar[r>>2])>>2]](r):(ar[i>>2]=o+1,hf(0|tr[o>>0])),S=l,i=M+1|0,r=0|tr[b>>0],l=0|ar[R>>2],o=f}if(u&&(0|l)!=(((S=(O=0|tr[b>>0])<<24>>24<0)?0|ar[R>>2]:R)+(S?0|ar[s>>2]:255&O)|0)){H=144;break A}l=j;break;case 4:T=0,o=l=O;r:for(;;){r=0|ar[A>>2];do{if(r){if(0|Mf(r=(0|(i=0|ar[r+12>>2]))==(0|ar[r+16>>2])?0|jb[127&ar[36+(0|ar[r>>2])>>2]](r):0|hf(0|tr[i>>0]),-1)){ar[A>>2]=0,i=1;break}i=0==(0|ar[A>>2]);break}i=1}while(0);do{if(o){if(0|Mf(r=(0|(r=0|ar[o+12>>2]))==(0|ar[o+16>>2])?0|jb[127&ar[36+(0|ar[o>>2])>>2]](o):0|hf(0|tr[r>>0]),-1)){l=ar[e>>2]=0,H=158;break}if(i^0==(0|l)){M=f=l;break}o=l;break r}H=158}while(0);if(158==(0|H)){if(H=0,i){o=l;break}f=l,M=0}if(l=0|ar[A>>2],-1<(r=255&(l=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|hf(0|tr[r>>0])))<<24>>24&&0!=(2048&or[(0|ar[m>>2])+(l<<24>>24<<1)>>1]))(0|(l=0|ar[c>>2]))==(0|ar[B>>2])&&(li(a,c,B),l=0|ar[c>>2]),ar[c>>2]=l+1,tr[l>>0]=r,l=T+1|0;else{if(O=0|tr[w>>0],!(r<<24>>24==(0|tr[I>>0])&(0|T?0!=(0|(O<<24>>24<0?0|ar[v>>2]:255&O)):0))){o=f;break}(0|(l=0|ar[G>>2]))==(0|ar[E>>2])&&(ui(D,G,E),l=0|ar[G>>2]),ar[G>>2]=l+4,ar[l>>2]=T,l=0}r=0|ar[A>>2],(0|(o=0|ar[(i=r+12|0)>>2]))!=(0|ar[r+16>>2])?(ar[i>>2]=o+1,hf(0|tr[o>>0]),T=l,l=f,o=M):(jb[127&ar[40+(0|ar[r>>2])>>2]](r),T=l,l=f,o=M)}l=0|ar[G>>2],0|T&&(0|ar[D>>2])!=(0|l)&&((0|l)==(0|ar[E>>2])&&(ui(D,G,E),l=0|ar[G>>2]),ar[G>>2]=l+4,ar[l>>2]=T);r:do{if(0<(0|ar[C>>2])){l=0|ar[A>>2];do{if(l){if(0|Mf(l=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|hf(0|tr[r>>0]),-1)){ar[A>>2]=0,r=1;break}r=0==(0|ar[A>>2]);break}r=1}while(0);do{if(o){if(0|Mf(l=(0|(l=0|ar[o+12>>2]))==(0|ar[o+16>>2])?0|jb[127&ar[36+(0|ar[o>>2])>>2]](o):0|hf(0|tr[l>>0]),-1)){ar[e>>2]=0,H=193;break}if(r)break;H=232;break A}H=193}while(0);if(193==(0|H)){if(H=0,r){H=232;break A}o=0}if(l=0|ar[A>>2],(255&(l=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|hf(0|tr[r>>0])))<<24>>24!=(0|tr[W>>0])){H=232;break A}for(l=0|ar[A>>2],l=((0|(i=0|ar[(r=l+12|0)>>2]))==(0|ar[l+16>>2])?jb[127&ar[40+(0|ar[l>>2])>>2]](l):(ar[r>>2]=i+1,hf(0|tr[i>>0])),o);;){if((0|ar[C>>2])<=0)break r;r=0|ar[A>>2];do{if(r){if(0|Mf(r=(0|(i=0|ar[r+12>>2]))==(0|ar[r+16>>2])?0|jb[127&ar[36+(0|ar[r>>2])>>2]](r):0|hf(0|tr[i>>0]),-1)){ar[A>>2]=0,i=1;break}i=0==(0|ar[A>>2]);break}i=1}while(0);do{if(o){if(0|Mf(r=(0|(r=0|ar[o+12>>2]))==(0|ar[o+16>>2])?0|jb[127&ar[36+(0|ar[o>>2])>>2]](o):0|hf(0|tr[r>>0]),-1)){l=ar[e>>2]=0,H=216;break}if(i^0==(0|l)){o=f=l;break}H=232;break A}H=216}while(0);if(216==(0|H)){if(H=0,i){H=232;break A}f=l,o=0}if(l=0|ar[A>>2],(255&(l=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|hf(0|tr[r>>0])))<<24>>24<=-1){H=232;break A}if(!(2048&or[(0|ar[m>>2])+(l<<24>>24<<1)>>1])){H=232;break A}(0|ar[c>>2])==(0|ar[B>>2])&&li(a,c,B),l=0|ar[A>>2],l=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|hf(0|tr[r>>0]),r=0|ar[c>>2],ar[c>>2]=r+1,tr[r>>0]=l,ar[C>>2]=(0|ar[C>>2])-1,l=0|ar[A>>2],(0|(i=0|ar[(r=l+12|0)>>2]))!=(0|ar[l+16>>2])?(ar[r>>2]=i+1,hf(0|tr[i>>0]),l=f):(jb[127&ar[40+(0|ar[l>>2])>>2]](l),l=f)}}}while(0);if((0|ar[c>>2])==(0|ar[a>>2])){H=232;break A}l=j;break;default:l=j}}while(0);e:do{if(46==(0|H))for(;;){r=(H=0)|ar[A>>2];do{if(r){if(0|Mf(r=(0|(i=0|ar[r+12>>2]))==(0|ar[r+16>>2])?0|jb[127&ar[36+(0|ar[r>>2])>>2]](r):0|hf(0|tr[i>>0]),-1)){ar[A>>2]=0,i=1;break}i=0==(0|ar[A>>2]);break}i=1}while(0);do{if(o){if(0|Mf(r=(0|(r=0|ar[o+12>>2]))==(0|ar[o+16>>2])?0|jb[127&ar[36+(0|ar[o>>2])>>2]](o):0|hf(0|tr[r>>0]),-1)){l=ar[e>>2]=0,H=59;break}if(i^0==(0|l)){o=f=l;break}l=j;break e}H=59}while(0);if(59==(0|H)){if(H=0,i){l=j;break e}f=l,o=0}if(l=0|ar[A>>2],(255&(l=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|hf(0|tr[r>>0])))<<24>>24<=-1){l=j;break e}if(!(8192&or[(0|ar[m>>2])+(l<<24>>24<<1)>>1])){l=j;break e}l=0|ar[A>>2],_u(Y,255&(l=(0|(i=0|ar[(r=l+12|0)>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[40+(0|ar[l>>2])>>2]](l):(ar[r>>2]=i+1,0|hf(0|tr[i>>0])))),l=f,H=46}}while(0);j=l,z=z+1|0}A:do{if(44==(0|H))ar[n>>2]=4|ar[n>>2],r=0;else if(103==(0|H))ar[n>>2]=4|ar[n>>2],r=0;else if(144==(0|H))ar[n>>2]=4|ar[n>>2],r=0;else if(232==(0|H))ar[n>>2]=4|ar[n>>2],r=0;else if(234==(0|H)){e:do{if(o){f=j+11|0,M=j+4|0,o=1;r:for(;;){if((l=0|tr[f>>0])<<24>>24<0?l=0|ar[M>>2]:l&=255,l>>>0<=o>>>0)break e;l=0|ar[A>>2];do{if(l){if(0|Mf(l=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|hf(0|tr[r>>0]),-1)){ar[A>>2]=0,i=1;break}i=0==(0|ar[A>>2]);break}i=1}while(0);l=0|ar[e>>2];do{if(l){if(0|Mf(l=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|hf(0|tr[r>>0]),-1)){ar[e>>2]=0,H=253;break}if(i)break;break r}H=253}while(0);if(253==(0|H)&&(H=0,i))break;if(l=0|ar[A>>2],l=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|hf(0|tr[r>>0]),r=(0|tr[f>>0])<0?0|ar[j>>2]:j,(255&l)<<24>>24!=(0|tr[r+o>>0]))break;l=o+1|0,r=0|ar[A>>2],(0|(o=0|ar[(i=r+12|0)>>2]))!=(0|ar[r+16>>2])?(ar[i>>2]=o+1,hf(0|tr[o>>0]),o=l):(jb[127&ar[40+(0|ar[r>>2])>>2]](r),o=l)}ar[n>>2]=4|ar[n>>2],r=0;break A}}while(0);if((0|(r=0|ar[D>>2]))!=(0|(l=0|ar[G>>2]))){if(ar[V>>2]=0,gn(F,r,l,V),0|ar[V>>2]){ar[n>>2]=4|ar[n>>2],r=0;break}r=1;break}r=1}}while(0);return Bu(Y),Bu(_),Bu(N),Bu(R),Bu(F),l=0|ar[D>>2],(ar[D>>2]=0)|l&&is[511&ar[Q>>2]](l),ur=J,0|r}function ci(A,e,r){return(e|=0)>>>0<=(A|=0)>>>0&A>>>0<(r|=0)>>>0|0}function li(A,e,r){e|=0,r|=0;var i,f,n=0,t=0,o=0;t=444!=(0|ar[(f=(A|=0)+4|0)>>2]),n=0|ar[A>>2],o=0==(0|(o=(o=(0|ar[r>>2])-n|0)>>>0<2147483647?o<<1:-1))?1:o,i=(0|ar[e>>2])-n|0,(n=0|Ec(t?n:0,o))||gu(),t?ar[A>>2]=n:(t=0|ar[A>>2],ar[A>>2]=n,t&&(is[511&ar[f>>2]](t),n=0|ar[A>>2])),ar[f>>2]=445,ar[e>>2]=n+i,ar[r>>2]=(0|ar[A>>2])+o}function ui(A,e,r){e|=0,r|=0;var i,f,n=0,t=0,o=0;t=444!=(0|ar[(f=(A|=0)+4|0)>>2]),n=0|ar[A>>2],o=0==(0|(o=(o=(0|ar[r>>2])-n|0)>>>0<2147483647?o<<1:-1))?4:o,i=(0|ar[e>>2])-n>>2,(n=0|Ec(t?n:0,o))||gu(),t?ar[A>>2]=n:(t=0|ar[A>>2],ar[A>>2]=n,t&&(is[511&ar[f>>2]](t),n=0|ar[A>>2])),ar[f>>2]=445,ar[e>>2]=n+(i<<2),ar[r>>2]=(0|ar[A>>2])+(o>>>2<<2)}function bi(A,e,r,i,f,n,t,o,a,c,l){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0,l|=0;var u,b,s,d,k,h,w,v,m,g,Z,p,y,B,E,X,W,I,C,G,V,F,R,N,_,Y,Q,D,J=0,M=0,T=0,U=0,S=0,O=0,z=0,j=0;for(G=ur=(D=ur)+31&-32,ur=ur+512|0,z=104+G|0,Q=88+G|0,C=80+G|0,B=76+G|0,E=504+G|0,X=72+G|0,W=68+G|0,V=56+G|0,F=44+G|0,R=32+G|0,N=20+G|0,_=8+G|0,I=4+G|0,ar[(y=96+G|0)>>2]=l,ar[Q>>2]=z,ar[(Y=4+Q|0)>>2]=444,ar[C>>2]=z,ar[B>>2]=z+400,ar[V>>2]=0,ar[4+V>>2]=0,l=ar[8+V>>2]=0;3!=(0|l);)l=l+1|(ar[V+(l<<2)>>2]=0);for(ar[F>>2]=0,ar[4+F>>2]=0,l=ar[8+F>>2]=0;3!=(0|l);)l=l+1|(ar[F+(l<<2)>>2]=0);for(ar[R>>2]=0,ar[4+R>>2]=0,l=ar[8+R>>2]=0;3!=(0|l);)l=l+1|(ar[R+(l<<2)>>2]=0);for(ar[N>>2]=0,ar[4+N>>2]=0,l=ar[8+N>>2]=0;3!=(0|l);)l=l+1|(ar[N+(l<<2)>>2]=0);for(ar[_>>2]=0,ar[4+_>>2]=0,l=ar[8+_>>2]=0;3!=(0|l);)l=l+1|(ar[_+(l<<2)>>2]=0);!function(A,e,r,i,f,n,t,o,a,c){e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0;var l,u,b;if(u=ur=(b=ur)+31&-32,ur=ur+16|0,l=12+u|0,A|=0){for(e=0|un(e,60968),fs[63&ar[44+(0|ar[e>>2])>>2]](l,e),A=0|ar[l>>2],tr[r>>0]=A,tr[r+1>>0]=A>>8,tr[r+2>>0]=A>>16,tr[r+3>>0]=A>>24,fs[63&ar[32+(0|ar[e>>2])>>2]](u,e),(0|tr[(A=a+8+3|0)>>0])<0?(r=0|ar[a>>2],ar[l>>2]=0,ln(r,l),ar[a+4>>2]=0):(ar[l>>2]=0,ln(a,l),tr[A>>0]=0),Mu(a,0),ar[a>>2]=ar[u>>2],ar[a+4>>2]=ar[4+u>>2],ar[a+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)ar[u+(A<<2)>>2]=0,A=A+1|0;for(Qu(u),fs[63&ar[28+(0|ar[e>>2])>>2]](u,e),(0|tr[(A=o+8+3|0)>>0])<0?(a=0|ar[o>>2],ar[l>>2]=0,ln(a,l),ar[o+4>>2]=0):(ar[l>>2]=0,ln(o,l),tr[A>>0]=0),Mu(o,0),ar[o>>2]=ar[u>>2],ar[o+4>>2]=ar[4+u>>2],ar[o+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)ar[u+(A<<2)>>2]=0,A=A+1|0;for(Qu(u),A=0|jb[127&ar[12+(0|ar[e>>2])>>2]](e),ar[i>>2]=A,A=0|jb[127&ar[16+(0|ar[e>>2])>>2]](e),ar[f>>2]=A,fs[63&ar[20+(0|ar[e>>2])>>2]](u,e),A=((0|tr[(A=n+11|0)>>0])<0?(A=0|ar[n>>2],tr[l>>0]=0,Qf(A,l),ar[n+4>>2]=0):(tr[l>>0]=0,Qf(n,l),tr[A>>0]=0),n),Cu(n,0),ar[A>>2]=ar[u>>2],ar[A+4>>2]=ar[4+u>>2],ar[A+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)ar[u+(A<<2)>>2]=0,A=A+1|0;for(Bu(u),fs[63&ar[24+(0|ar[e>>2])>>2]](u,e),(0|tr[(A=t+8+3|0)>>0])<0?(n=0|ar[t>>2],ar[l>>2]=0,ln(n,l),ar[t+4>>2]=0):(ar[l>>2]=0,ln(t,l),tr[A>>0]=0),Mu(t,0),ar[t>>2]=ar[u>>2],ar[t+4>>2]=ar[4+u>>2],ar[t+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)ar[u+(A<<2)>>2]=0,A=A+1|0;Qu(u),A=0|jb[127&ar[36+(0|ar[e>>2])>>2]](e)}else{for(e=0|un(e,60960),fs[63&ar[44+(0|ar[e>>2])>>2]](l,e),A=0|ar[l>>2],tr[r>>0]=A,tr[r+1>>0]=A>>8,tr[r+2>>0]=A>>16,tr[r+3>>0]=A>>24,fs[63&ar[32+(0|ar[e>>2])>>2]](u,e),(0|tr[(A=a+8+3|0)>>0])<0?(r=0|ar[a>>2],ar[l>>2]=0,ln(r,l),ar[a+4>>2]=0):(ar[l>>2]=0,ln(a,l),tr[A>>0]=0),Mu(a,0),ar[a>>2]=ar[u>>2],ar[a+4>>2]=ar[4+u>>2],ar[a+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)ar[u+(A<<2)>>2]=0,A=A+1|0;for(Qu(u),fs[63&ar[28+(0|ar[e>>2])>>2]](u,e),(0|tr[(A=o+8+3|0)>>0])<0?(a=0|ar[o>>2],ar[l>>2]=0,ln(a,l),ar[o+4>>2]=0):(ar[l>>2]=0,ln(o,l),tr[A>>0]=0),Mu(o,0),ar[o>>2]=ar[u>>2],ar[o+4>>2]=ar[4+u>>2],ar[o+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)ar[u+(A<<2)>>2]=0,A=A+1|0;for(Qu(u),A=0|jb[127&ar[12+(0|ar[e>>2])>>2]](e),ar[i>>2]=A,A=0|jb[127&ar[16+(0|ar[e>>2])>>2]](e),ar[f>>2]=A,fs[63&ar[20+(0|ar[e>>2])>>2]](u,e),A=((0|tr[(A=n+11|0)>>0])<0?(A=0|ar[n>>2],tr[l>>0]=0,Qf(A,l),ar[n+4>>2]=0):(tr[l>>0]=0,Qf(n,l),tr[A>>0]=0),n),Cu(n,0),ar[A>>2]=ar[u>>2],ar[A+4>>2]=ar[4+u>>2],ar[A+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)ar[u+(A<<2)>>2]=0,A=A+1|0;for(Bu(u),fs[63&ar[24+(0|ar[e>>2])>>2]](u,e),(0|tr[(A=t+8+3|0)>>0])<0?(n=0|ar[t>>2],ar[l>>2]=0,ln(n,l),ar[t+4>>2]=0):(ar[l>>2]=0,ln(t,l),tr[A>>0]=0),Mu(t,0),ar[t>>2]=ar[u>>2],ar[t+4>>2]=ar[4+u>>2],ar[t+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)ar[u+(A<<2)>>2]=0,A=A+1|0;Qu(u),A=0|jb[127&ar[36+(0|ar[e>>2])>>2]](e)}ar[c>>2]=A,ur=b}(r,i,E,X,W,V,F,R,N,I),ar[c>>2]=ar[a>>2],m=8+R+3|0,g=4+R|0,Z=8+N+3|0,p=4+N|0,u=0!=(512&f|0),b=8+F+3|0,s=4+F|0,d=8+_+3|0,k=4+_|0,h=3+E|0,w=11+V|0,v=4+V|0,O=z=0;A:for(;;){if(f=0!=(0|z),4<=O>>>0){j=229;break}l=0|ar[A>>2];do{if(l){if(0|Uf(l=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|gf(0|ar[r>>2]),-1)){ar[A>>2]=0,i=1;break}i=0==(0|ar[A>>2]);break}i=1}while(0);r=0|ar[e>>2];do{if(r){if(0|Uf(l=(0|(l=0|ar[r+12>>2]))==(0|ar[r+16>>2])?0|jb[127&ar[36+(0|ar[r>>2])>>2]](r):0|gf(0|ar[l>>2]),-1)){ar[e>>2]=0,j=31;break}if(i){S=r;break}j=229;break A}j=31}while(0);if(31==(0|j)){if(j=0,i){j=229;break}S=0}l=3!=(0|O);e:do{switch(0|tr[E+O>>0]){case 1:if(l){if(l=0|ar[A>>2],l=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|gf(0|ar[r>>2]),!(0|xb[63&ar[12+(0|ar[o>>2])>>2]](o,8192,l))){j=43;break A}l=0|ar[A>>2],Ou(_,l=(0|(i=0|ar[(r=l+12|0)>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[40+(0|ar[l>>2])>>2]](l):(ar[r>>2]=i+4,0|gf(0|ar[i>>2]))),f=l=S,j=45}else l=z;break;case 0:l?(f=l=S,j=45):l=z;break;case 3:if((0|(l=(l=0|tr[m>>0])<<24>>24<0?0|ar[g>>2]:255&l))==(0-(f=(f=0|tr[Z>>0])<<24>>24<0?0|ar[p>>2]:255&f)|0))l=z;else{if(J=0==(0|l),l=0|ar[A>>2],i=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2]),J|0==(0|f)){if(l=i?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|gf(0|ar[r>>2]),J){if((0|l)!=(0|ar[((0|tr[Z>>0])<0?0|ar[N>>2]:N)>>2])){l=z;break e}l=0|ar[A>>2],(0|(i=0|ar[(r=l+12|0)>>2]))==(0|ar[l+16>>2])?jb[127&ar[40+(0|ar[l>>2])>>2]](l):(ar[r>>2]=i+4,gf(0|ar[i>>2])),l=(tr[t>>0]=1)<((l=0|tr[Z>>0])<<24>>24<0?0|ar[p>>2]:255&l)>>>0?N:z;break e}if((0|l)!=(0|ar[((0|tr[m>>0])<0?0|ar[R>>2]:R)>>2])){tr[t>>0]=1,l=z;break e}l=0|ar[A>>2],(0|(i=0|ar[(r=l+12|0)>>2]))==(0|ar[l+16>>2])?jb[127&ar[40+(0|ar[l>>2])>>2]](l):(ar[r>>2]=i+4,gf(0|ar[i>>2])),l=1<((l=0|tr[m>>0])<<24>>24<0?0|ar[g>>2]:255&l)>>>0?R:z;break e}if(l=i?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|gf(0|ar[r>>2]),r=0|ar[A>>2],J=(0|(f=0|ar[(i=r+12|0)>>2]))==(0|ar[r+16>>2]),(0|l)==(0|ar[((0|tr[m>>0])<0?0|ar[R>>2]:R)>>2])){J?jb[127&ar[40+(0|ar[r>>2])>>2]](r):(ar[i>>2]=f+4,gf(0|ar[f>>2])),l=1<((l=0|tr[m>>0])<<24>>24<0?0|ar[g>>2]:255&l)>>>0?R:z;break e}if((0|(l=J?0|jb[127&ar[36+(0|ar[r>>2])>>2]](r):0|gf(0|ar[f>>2])))!=(0|ar[((0|tr[Z>>0])<0?0|ar[N>>2]:N)>>2])){j=101;break A}l=0|ar[A>>2],(0|(i=0|ar[(r=l+12|0)>>2]))==(0|ar[l+16>>2])?jb[127&ar[40+(0|ar[l>>2])>>2]](l):(ar[r>>2]=i+4,gf(0|ar[i>>2])),l=(tr[t>>0]=1)<((l=0|tr[Z>>0])<<24>>24<0?0|ar[p>>2]:255&l)>>>0?N:z}break;case 2:if(!(O>>>0<2|f)&&!(u|2==(0|O)&0!=(0|tr[h>>0]))){l=0;break e}i=0|tr[b>>0],f=0|ar[F>>2],l=i<<24>>24<0?f:F;r:do{if(0!=(0|O)&&(0|cr[E+(O+-1)>>0])<2){for(;(0|(r=l))!=(((U=i<<24>>24<0)?f:F)+((U?0|ar[s>>2]:255&i)<<2)|0);){if(!(0|xb[63&ar[12+(0|ar[o>>2])>>2]](o,8192,0|ar[r>>2]))){j=108;break}l=r+4|0,i=0|tr[b>>0],f=0|ar[F>>2]}if(108==(0|j)&&(i=(j=0)|tr[b>>0],f=0|ar[F>>2]),T=l-(U=J=i<<24>>24<0?f:F)>>2,(M=(r=(M=0|tr[d>>0])<<24>>24<0)?0|ar[k>>2]:255&M)>>>0<T>>>0)r=U,J=T=S;else for(r=(M=(r?0|ar[_>>2]:_)+(M<<2)|0)+(0-T<<2)|0;;){if((0|r)==(0|M)){r=l,J=T=S;break r}if((0|ar[r>>2])!=(0|ar[J>>2])){r=U,J=T=S;break r}J=J+4|0,r=r+4|0}}else r=l,J=T=S}while(0);r:for(;(0|(M=r))!=(0|(l=((l=i<<24>>24<0)?f:F)+((l?0|ar[s>>2]:255&i)<<2)|0));){l=0|ar[A>>2];do{if(l){if(0|Uf(l=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|gf(0|ar[r>>2]),-1)){ar[A>>2]=0,r=1;break}r=0==(0|ar[A>>2]);break}r=1}while(0);do{if(J){if(0|Uf(l=(0|(l=0|ar[J+12>>2]))==(0|ar[J+16>>2])?0|jb[127&ar[36+(0|ar[J>>2])>>2]](J):0|gf(0|ar[l>>2]),-1)){l=ar[e>>2]=0,j=129;break}if(r^0==(0|T)){J=l=T;break}l=M;break r}l=T,j=129}while(0);if(129==(0|j)){if(j=0,r){l=M;break}J=0}if(r=0|ar[A>>2],(0|(r=(0|(i=0|ar[r+12>>2]))==(0|ar[r+16>>2])?0|jb[127&ar[36+(0|ar[r>>2])>>2]](r):0|gf(0|ar[i>>2])))!=(0|ar[M>>2])){l=M;break}r=0|ar[A>>2],(0|(f=0|ar[(i=r+12|0)>>2]))==(0|ar[r+16>>2])?jb[127&ar[40+(0|ar[r>>2])>>2]](r):(ar[i>>2]=f+4,gf(0|ar[f>>2])),T=l,r=M+4|0,i=0|tr[b>>0],f=0|ar[F>>2]}if(u&&(0|l)!=(((U=(S=0|tr[b>>0])<<24>>24<0)?0|ar[F>>2]:F)+((U?0|ar[s>>2]:255&S)<<2)|0)){j=141;break A}l=z;break;case 4:T=0,f=l=S;r:for(;;){r=0|ar[A>>2];do{if(r){if(0|Uf(r=(0|(i=0|ar[r+12>>2]))==(0|ar[r+16>>2])?0|jb[127&ar[36+(0|ar[r>>2])>>2]](r):0|gf(0|ar[i>>2]),-1)){ar[A>>2]=0,i=1;break}i=0==(0|ar[A>>2]);break}i=1}while(0);do{if(f){if(0|Uf(r=(0|(r=0|ar[f+12>>2]))==(0|ar[f+16>>2])?0|jb[127&ar[36+(0|ar[f>>2])>>2]](f):0|gf(0|ar[r>>2]),-1)){l=ar[e>>2]=0,j=155;break}if(i^0==(0|l)){M=J=l;break}f=l;break r}j=155}while(0);if(155==(0|j)){if(j=0,i){f=l;break}J=l,M=0}if(l=0|ar[A>>2],r=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|gf(0|ar[r>>2]),0|xb[63&ar[12+(0|ar[o>>2])>>2]](o,2048,r))(0|(l=0|ar[c>>2]))==(0|ar[y>>2])&&(di(a,c,y),l=0|ar[c>>2]),ar[c>>2]=l+4,ar[l>>2]=r,l=T+1|0;else{if(S=0|tr[w>>0],!((0|r)==(0|ar[W>>2])&(0|T?0!=(0|(S<<24>>24<0?0|ar[v>>2]:255&S)):0))){f=J;break}(0|(l=0|ar[C>>2]))==(0|ar[B>>2])&&(ui(Q,C,B),l=0|ar[C>>2]),ar[C>>2]=l+4,ar[l>>2]=T,l=0}r=0|ar[A>>2],(0|(f=0|ar[(i=r+12|0)>>2]))!=(0|ar[r+16>>2])?(ar[i>>2]=f+4,gf(0|ar[f>>2]),T=l,l=J,f=M):(jb[127&ar[40+(0|ar[r>>2])>>2]](r),T=l,l=J,f=M)}l=0|ar[C>>2],0|T&&(0|ar[Q>>2])!=(0|l)&&((0|l)==(0|ar[B>>2])&&(ui(Q,C,B),l=0|ar[C>>2]),ar[C>>2]=l+4,ar[l>>2]=T);r:do{if(0<(0|ar[I>>2])){l=0|ar[A>>2];do{if(l){if(0|Uf(l=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|gf(0|ar[r>>2]),-1)){ar[A>>2]=0,r=1;break}r=0==(0|ar[A>>2]);break}r=1}while(0);do{if(f){if(0|Uf(l=(0|(l=0|ar[f+12>>2]))==(0|ar[f+16>>2])?0|jb[127&ar[36+(0|ar[f>>2])>>2]](f):0|gf(0|ar[l>>2]),-1)){ar[e>>2]=0,j=189;break}if(r)break;j=227;break A}j=189}while(0);if(189==(0|j)){if(j=0,r){j=227;break A}f=0}if(l=0|ar[A>>2],(0|(l=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|gf(0|ar[r>>2])))!=(0|ar[X>>2])){j=227;break A}for(l=0|ar[A>>2],l=((0|(i=0|ar[(r=l+12|0)>>2]))==(0|ar[l+16>>2])?jb[127&ar[40+(0|ar[l>>2])>>2]](l):(ar[r>>2]=i+4,gf(0|ar[i>>2])),f);;){if((0|ar[I>>2])<=0)break r;r=0|ar[A>>2];do{if(r){if(0|Uf(r=(0|(i=0|ar[r+12>>2]))==(0|ar[r+16>>2])?0|jb[127&ar[36+(0|ar[r>>2])>>2]](r):0|gf(0|ar[i>>2]),-1)){ar[A>>2]=0,i=1;break}i=0==(0|ar[A>>2]);break}i=1}while(0);do{if(f){if(0|Uf(r=(0|(r=0|ar[f+12>>2]))==(0|ar[f+16>>2])?0|jb[127&ar[36+(0|ar[f>>2])>>2]](f):0|gf(0|ar[r>>2]),-1)){l=ar[e>>2]=0,j=212;break}if(i^0==(0|l)){f=J=l;break}j=227;break A}j=212}while(0);if(212==(0|j)){if(j=0,i){j=227;break A}J=l,f=0}if(l=0|ar[A>>2],l=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|gf(0|ar[r>>2]),!(0|xb[63&ar[12+(0|ar[o>>2])>>2]](o,2048,l))){j=227;break A}(0|ar[c>>2])==(0|ar[y>>2])&&di(a,c,y),l=0|ar[A>>2],l=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|gf(0|ar[r>>2]),r=0|ar[c>>2],ar[c>>2]=r+4,ar[r>>2]=l,ar[I>>2]=(0|ar[I>>2])-1,l=0|ar[A>>2],(0|(i=0|ar[(r=l+12|0)>>2]))!=(0|ar[l+16>>2])?(ar[r>>2]=i+4,gf(0|ar[i>>2]),l=J):(jb[127&ar[40+(0|ar[l>>2])>>2]](l),l=J)}}}while(0);if((0|ar[c>>2])==(0|ar[a>>2])){j=227;break A}l=z;break;default:l=z}}while(0);e:do{if(45==(0|j))for(;;){r=(j=0)|ar[A>>2];do{if(r){if(0|Uf(r=(0|(i=0|ar[r+12>>2]))==(0|ar[r+16>>2])?0|jb[127&ar[36+(0|ar[r>>2])>>2]](r):0|gf(0|ar[i>>2]),-1)){ar[A>>2]=0,i=1;break}i=0==(0|ar[A>>2]);break}i=1}while(0);do{if(f){if(0|Uf(r=(0|(r=0|ar[f+12>>2]))==(0|ar[f+16>>2])?0|jb[127&ar[36+(0|ar[f>>2])>>2]](f):0|gf(0|ar[r>>2]),-1)){l=ar[e>>2]=0,j=58;break}if(i^0==(0|l)){f=J=l;break}l=z;break e}j=58}while(0);if(58==(0|j)){if(j=0,i){l=z;break e}J=l,f=0}if(l=0|ar[A>>2],l=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|gf(0|ar[r>>2]),!(0|xb[63&ar[12+(0|ar[o>>2])>>2]](o,8192,l))){l=z;break e}l=0|ar[A>>2],Ou(_,l=(0|(i=0|ar[(r=l+12|0)>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[40+(0|ar[l>>2])>>2]](l):(ar[r>>2]=i+4,0|gf(0|ar[i>>2]))),l=J,j=45}}while(0);z=l,O=O+1|0}A:do{if(43==(0|j))ar[n>>2]=4|ar[n>>2],r=0;else if(101==(0|j))ar[n>>2]=4|ar[n>>2],r=0;else if(141==(0|j))ar[n>>2]=4|ar[n>>2],r=0;else if(227==(0|j))ar[n>>2]=4|ar[n>>2],r=0;else if(229==(0|j)){e:do{if(f){J=z+8+3|0,M=z+4|0,f=1;r:for(;;){if((l=0|tr[J>>0])<<24>>24<0?l=0|ar[M>>2]:l&=255,l>>>0<=f>>>0)break e;l=0|ar[A>>2];do{if(l){if(0|Uf(l=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|gf(0|ar[r>>2]),-1)){ar[A>>2]=0,i=1;break}i=0==(0|ar[A>>2]);break}i=1}while(0);l=0|ar[e>>2];do{if(l){if(0|Uf(l=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|gf(0|ar[r>>2]),-1)){ar[e>>2]=0,j=248;break}if(i)break;break r}j=248}while(0);if(248==(0|j)&&(j=0,i))break;if(l=0|ar[A>>2],l=(0|(r=0|ar[l+12>>2]))==(0|ar[l+16>>2])?0|jb[127&ar[36+(0|ar[l>>2])>>2]](l):0|gf(0|ar[r>>2]),r=(0|tr[J>>0])<0?0|ar[z>>2]:z,(0|l)!=(0|ar[r+(f<<2)>>2]))break;l=f+1|0,r=0|ar[A>>2],(0|(f=0|ar[(i=r+12|0)>>2]))!=(0|ar[r+16>>2])?(ar[i>>2]=f+4,gf(0|ar[f>>2]),f=l):(jb[127&ar[40+(0|ar[r>>2])>>2]](r),f=l)}ar[n>>2]=4|ar[n>>2],r=0;break A}}while(0);if((0|(r=0|ar[Q>>2]))!=(0|(l=0|ar[C>>2]))){if(ar[G>>2]=0,gn(V,r,l,G),0|ar[G>>2]){ar[n>>2]=4|ar[n>>2],r=0;break}r=1;break}r=1}}while(0);return Qu(_),Qu(N),Qu(R),Qu(F),Bu(V),l=0|ar[Q>>2],(ar[Q>>2]=0)|l&&is[511&ar[Y>>2]](l),ur=D,0|r}function si(A,e,r){return(e|=0)>>>0<=(A|=0)>>>0&A>>>0<(r|=0)>>>0|0}function di(A,e,r){e|=0,r|=0;var i,f,n=0,t=0,o=0;t=444!=(0|ar[(f=(A|=0)+4|0)>>2]),n=0|ar[A>>2],o=0==(0|(o=(o=(0|ar[r>>2])-n|0)>>>0<2147483647?o<<1:-1))?4:o,i=(0|ar[e>>2])-n>>2,(n=0|Ec(t?n:0,o))||gu(),t?ar[A>>2]=n:(t=0|ar[A>>2],ar[A>>2]=n,t&&(is[511&ar[f>>2]](t),n=0|ar[A>>2])),ar[f>>2]=445,ar[e>>2]=n+(i<<2),ar[r>>2]=(0|ar[A>>2])+(o>>>2<<2)}function ki(A,e,r,i,f,n,t,o,a,c){e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0;var l,u,b,s=0;if(u=ur=(b=ur)+31&-32,ur=ur+16|0,l=12+u|0,A|=0){if(s=0|un(r,60952),e){for(fs[63&ar[44+(0|ar[s>>2])>>2]](l,s),A=0|ar[l>>2],tr[i>>0]=A,tr[i+1>>0]=A>>8,tr[i+2>>0]=A>>16,tr[i+3>>0]=A>>24,fs[63&ar[32+(0|ar[s>>2])>>2]](u,s),A=((0|tr[(A=a+11|0)>>0])<0?(A=0|ar[a>>2],tr[l>>0]=0,Qf(A,l),ar[a+4>>2]=0):(tr[l>>0]=0,Qf(a,l),tr[A>>0]=0),a),Cu(a,0),ar[A>>2]=ar[u>>2],ar[A+4>>2]=ar[4+u>>2],ar[A+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)A=A+1|(ar[u+(A<<2)>>2]=0);Bu(u),r=s}else{for(fs[63&ar[40+(0|ar[s>>2])>>2]](l,s),A=0|ar[l>>2],tr[i>>0]=A,tr[i+1>>0]=A>>8,tr[i+2>>0]=A>>16,tr[i+3>>0]=A>>24,fs[63&ar[28+(0|ar[s>>2])>>2]](u,s),A=((0|tr[(A=a+11|0)>>0])<0?(A=0|ar[a>>2],tr[l>>0]=0,Qf(A,l),ar[a+4>>2]=0):(tr[l>>0]=0,Qf(a,l),tr[A>>0]=0),a),Cu(a,0),ar[A>>2]=ar[u>>2],ar[A+4>>2]=ar[4+u>>2],ar[A+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)A=A+1|(ar[u+(A<<2)>>2]=0);Bu(u),r=s}for(A=0|jb[127&ar[12+(0|ar[s>>2])>>2]](s),tr[f>>0]=A,A=0|jb[127&ar[16+(0|ar[s>>2])>>2]](s),tr[n>>0]=A,fs[63&ar[20+(0|ar[r>>2])>>2]](u,s),A=((0|tr[(A=t+11|0)>>0])<0?(A=0|ar[t>>2],tr[l>>0]=0,Qf(A,l),ar[t+4>>2]=0):(tr[l>>0]=0,Qf(t,l),tr[A>>0]=0),t),Cu(t,0),ar[A>>2]=ar[u>>2],ar[A+4>>2]=ar[4+u>>2],ar[A+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)A=A+1|(ar[u+(A<<2)>>2]=0);for(Bu(u),fs[63&ar[24+(0|ar[r>>2])>>2]](u,s),A=((0|tr[(A=o+11|0)>>0])<0?(A=0|ar[o>>2],tr[l>>0]=0,Qf(A,l),ar[o+4>>2]=0):(tr[l>>0]=0,Qf(o,l),tr[A>>0]=0),o),Cu(o,0),ar[A>>2]=ar[u>>2],ar[A+4>>2]=ar[4+u>>2],ar[A+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)A=A+1|(ar[u+(A<<2)>>2]=0);Bu(u),A=0|jb[127&ar[36+(0|ar[s>>2])>>2]](s)}else{if(s=0|un(r,60944),e){for(fs[63&ar[44+(0|ar[s>>2])>>2]](l,s),A=0|ar[l>>2],tr[i>>0]=A,tr[i+1>>0]=A>>8,tr[i+2>>0]=A>>16,tr[i+3>>0]=A>>24,fs[63&ar[32+(0|ar[s>>2])>>2]](u,s),A=((0|tr[(A=a+11|0)>>0])<0?(A=0|ar[a>>2],tr[l>>0]=0,Qf(A,l),ar[a+4>>2]=0):(tr[l>>0]=0,Qf(a,l),tr[A>>0]=0),a),Cu(a,0),ar[A>>2]=ar[u>>2],ar[A+4>>2]=ar[4+u>>2],ar[A+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)A=A+1|(ar[u+(A<<2)>>2]=0);Bu(u),r=s}else{for(fs[63&ar[40+(0|ar[s>>2])>>2]](l,s),A=0|ar[l>>2],tr[i>>0]=A,tr[i+1>>0]=A>>8,tr[i+2>>0]=A>>16,tr[i+3>>0]=A>>24,fs[63&ar[28+(0|ar[s>>2])>>2]](u,s),A=((0|tr[(A=a+11|0)>>0])<0?(A=0|ar[a>>2],tr[l>>0]=0,Qf(A,l),ar[a+4>>2]=0):(tr[l>>0]=0,Qf(a,l),tr[A>>0]=0),a),Cu(a,0),ar[A>>2]=ar[u>>2],ar[A+4>>2]=ar[4+u>>2],ar[A+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)A=A+1|(ar[u+(A<<2)>>2]=0);Bu(u),r=s}for(A=0|jb[127&ar[12+(0|ar[s>>2])>>2]](s),tr[f>>0]=A,A=0|jb[127&ar[16+(0|ar[s>>2])>>2]](s),tr[n>>0]=A,fs[63&ar[20+(0|ar[r>>2])>>2]](u,s),A=((0|tr[(A=t+11|0)>>0])<0?(A=0|ar[t>>2],tr[l>>0]=0,Qf(A,l),ar[t+4>>2]=0):(tr[l>>0]=0,Qf(t,l),tr[A>>0]=0),t),Cu(t,0),ar[A>>2]=ar[u>>2],ar[A+4>>2]=ar[4+u>>2],ar[A+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)A=A+1|(ar[u+(A<<2)>>2]=0);for(Bu(u),fs[63&ar[24+(0|ar[r>>2])>>2]](u,s),A=((0|tr[(A=o+11|0)>>0])<0?(A=0|ar[o>>2],tr[l>>0]=0,Qf(A,l),ar[o+4>>2]=0):(tr[l>>0]=0,Qf(o,l),tr[A>>0]=0),o),Cu(o,0),ar[A>>2]=ar[u>>2],ar[A+4>>2]=ar[4+u>>2],ar[A+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)A=A+1|(ar[u+(A<<2)>>2]=0);Bu(u),A=0|jb[127&ar[36+(0|ar[s>>2])>>2]](s)}ar[c>>2]=A,ur=b}function hi(A,e,r,i,f,n,t,o,a,c,l,u,b,s,d){A|=0,e|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0,l|=0,u|=0,b|=0,s|=0,d|=0;var k,h,w,v,m,g,Z,p,y,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0;for(ar[(r|=0)>>2]=A,k=s+11|0,y=s+4|0,h=b+11|0,w=b+4|0,v=0==(512&i|0),m=t+8|0,g=0<(0|d),Z=u+11|0,p=u+4|0,G=0;4!=(0|G);){A:do{switch(0|tr[a+G>>0]){case 0:ar[e>>2]=ar[r>>2];break;case 1:ar[e>>2]=ar[r>>2],I=0|Hb[31&ar[28+(0|ar[t>>2])>>2]](t,32),C=0|ar[r>>2],ar[r>>2]=C+1,tr[C>>0]=I;break;case 3:0|((B=(C=0|tr[k>>0])<<24>>24<0)?0|ar[y>>2]:255&C)&&(I=0|tr[(B?0|ar[s>>2]:s)>>0],C=0|ar[r>>2],ar[r>>2]=C+1,tr[C>>0]=I);break;case 2:if(!(v|0==(0|(E=(B=(E=0|tr[h>>0])<<24>>24<0)?0|ar[w>>2]:255&E)))){for(X=(C=B?0|ar[b>>2]:b)+E|0,B=0|ar[r>>2],E=C;(0|E)!=(0|X);)tr[B>>0]=0|tr[E>>0],B=B+1|0,E=E+1|0;ar[r>>2]=B}break;case 4:for(E=0|ar[r>>2],X=f=o?f+1|0:f;!(n>>>0<=X>>>0)&&!((B=0|tr[X>>0])<<24>>24<=-1)&&2048&or[(0|ar[m>>2])+(B<<24>>24<<1)>>1];)X=X+1|0;if(g){for(W=d;f>>>0<X>>>0&(B=0<(0|W));)B=0|tr[(C=X+-1|0)>>0],I=0|ar[r>>2],ar[r>>2]=I+1,tr[I>>0]=B,W=W+-1|0,X=C;for(I=B?0|Hb[31&ar[28+(0|ar[t>>2])>>2]](t,48):0,B=W;W=0|ar[r>>2],ar[r>>2]=W+1,!((0|B)<=0);)tr[W>>0]=I,B=B+-1|0;tr[W>>0]=c}e:do{if((0|X)==(0|f))I=0|Hb[31&ar[28+(0|ar[t>>2])>>2]](t,48),C=0|ar[r>>2],ar[r>>2]=C+1,tr[C>>0]=I;else for(C=W=(I=0|((B=(C=0|tr[Z>>0])<<24>>24<0)?0|ar[p>>2]:255&C)?0|tr[(B?0|ar[u>>2]:u)>>0]:-1,0);;){if((0|X)==(0|f))break e;B=(0|C)==(0|I)?(I=0|ar[r>>2],ar[r>>2]=I+1,tr[I>>0]=l,I=(W=W+1|0)>>>0<((B=(I=0|tr[Z>>0])<<24>>24<0)?0|ar[p>>2]:255&I)>>>0?(I=0|tr[(B?0|ar[u>>2]:u)+W>>0])<<24>>24==127?-1:I<<24>>24:C,0):C,F=0|tr[(V=X+-1|0)>>0],C=0|ar[r>>2],ar[r>>2]=C+1,tr[C>>0]=F,C=B+1|0,X=V}}while(0);if((0|E)!=(0|(B=0|ar[r>>2])))for(;;){if((B=B+-1|0)>>>0<=E>>>0)break A;F=0|tr[E>>0],tr[E>>0]=0|tr[B>>0],tr[B>>0]=F,E=E+1|0}}}while(0);G=G+1|0}if(1<(f=(B=(f=0|tr[k>>0])<<24>>24<0)?0|ar[y>>2]:255&f)>>>0){for(E=(F=B?0|ar[s>>2]:s)+f|0,B=0|ar[r>>2],f=F;(0|(f=f+1|0))!=(0|E);)tr[B>>0]=0|tr[f>>0],B=B+1|0;ar[r>>2]=B}switch((176&i)<<24>>24){case 32:ar[e>>2]=ar[r>>2];break;case 16:break;default:ar[e>>2]=A}}function wi(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f|=0;var n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0;A:do{if(36<e>>>0)ar[(f=10364)>>2]=22,i=f=0;else{for(d=A+4|0,s=A+100|0;0!=(0|mi(n=(n=0|ar[d>>2])>>>0<(0|ar[s>>2])>>>0?(ar[d>>2]=n+1,0|cr[n>>0]):0|vi(A))););e:do{switch(0|n){case 43:case 45:if(n=(45==(0|n))<<31>>31,(t=0|ar[d>>2])>>>0<(0|ar[s>>2])>>>0){ar[d>>2]=t+1,b=n,n=0|cr[t>>0];break e}b=n,n=0|vi(A);break e;default:b=0}}while(0);t=0==(0|e);do{if(16==(16|e)&48==(0|n)){if(120!=(32|(n=(n=0|ar[d>>2])>>>0<(0|ar[s>>2])>>>0?(ar[d>>2]=n+1,0|cr[n>>0]):0|vi(A)))){if(t){e=8,l=46;break}l=32;break}if(n=(n=0|ar[d>>2])>>>0<(0|ar[s>>2])>>>0?(ar[d>>2]=n+1,0|cr[n>>0]):0|vi(A),15<(0|cr[52625+n>>0])){if((i=0!=(0|ar[s>>2]))&&(ar[d>>2]=(0|ar[d>>2])-1),!r){nl(A,0),i=f=0;break A}if(!i){i=f=0;break A}ar[d>>2]=(0|ar[d>>2])-1,i=f=0;break A}e=16,l=46}else{if(e=t?10:e,!((0|cr[52625+n>>0])>>>0<e>>>0)){0|ar[s>>2]&&(ar[d>>2]=(0|ar[d>>2])-1),nl(A,0),ar[(f=10364)>>2]=22,i=f=0;break A}l=32}}while(0);e:do{if(32==(0|l))if(10==(0|e)){if((e=n+-48|0)>>>0<10){for(n=0,t=e;n=(10*n|0)+t|0,(t=(e=(e=0|ar[d>>2])>>>0<(0|ar[s>>2])>>>0?(ar[d>>2]=e+1,0|cr[e>>0]):0|vi(A))+-48|0)>>>0<10&n>>>0<429496729;);r=0}else e=n,r=n=0;if((o=e+-48|0)>>>0<10){t=e;do{if(e=0|nb(0|n,0|r,10,0),(u=~(c=((0|o)<0)<<31>>31))>>>0<(a=D)>>>0|(0|a)==(0|u)&~o>>>0<e>>>0){e=10,l=72;break e}n=0|tb(0|e,0|a,0|o,0|c),r=D,o=(t=(e=0|ar[d>>2])>>>0<(0|ar[s>>2])>>>0?(ar[d>>2]=e+1,0|cr[e>>0]):0|vi(A))+-48|0}while(o>>>0<10&(r>>>0<429496729|429496729==(0|r)&n>>>0<2576980378));9<o>>>0?(t=b,e=r):(e=10,l=72)}else t=b,e=r}else l=46}while(0);e:do{if(46==(0|l)){if(!(e+-1&e)){if(l=0|tr[52881+((23*e|0)>>>5&7)>>0],(t=255&(r=0|tr[52625+n>>0]))>>>0<e>>>0){for(n=0,o=t;n=o|n<<l,t=(t=0|ar[d>>2])>>>0<(0|ar[s>>2])>>>0?(ar[d>>2]=t+1,0|cr[t>>0]):0|vi(A),n>>>0<134217728&(o=255&(r=0|tr[52625+t>>0]))>>>0<e>>>0;);o=0}else t=n,n=o=0;if(a=0|sb(-1,-1,0|l),e>>>0<=(255&r)>>>0|(c=D)>>>0<o>>>0|(0|o)==(0|c)&a>>>0<n>>>0){r=o,l=72;break}for(t=o;;){if(n=0|db(0|n,0|t,0|l),o=D,n|=255&r,t=(t=0|ar[d>>2])>>>0<(0|ar[s>>2])>>>0?(ar[d>>2]=t+1,0|cr[t>>0]):0|vi(A),e>>>0<=(255&(r=0|tr[52625+t>>0]))>>>0|c>>>0<o>>>0|(0|o)==(0|c)&a>>>0<n>>>0){r=o,l=72;break e}t=o}}if((t=255&(r=0|tr[52625+n>>0]))>>>0<e>>>0){for(n=0,o=t;n=o+(0|br(n,e))|0,t=(t=0|ar[d>>2])>>>0<(0|ar[s>>2])>>>0?(ar[d>>2]=t+1,0|cr[t>>0]):0|vi(A),n>>>0<119304647&(o=255&(r=0|tr[52625+t>>0]))>>>0<e>>>0;);o=0}else t=n,o=n=0;if((255&r)>>>0<e>>>0)for(l=0|lb(-1,-1,0|e,0),u=D,c=o;;){if(u>>>0<c>>>0|(0|c)==(0|u)&l>>>0<n>>>0){r=c,l=72;break e}if(o=0|nb(0|n,0|c,0|e,0),4294967295<(a=D)>>>0|-1==(0|a)&~(r&=255)>>>0<o>>>0){r=c,l=72;break e}if(n=0|tb(0|r,0,0|o,0|a),o=D,t=(t=0|ar[d>>2])>>>0<(0|ar[s>>2])>>>0?(ar[d>>2]=t+1,0|cr[t>>0]):0|vi(A),e>>>0<=(255&(r=0|tr[52625+t>>0]))>>>0){r=o,l=72;break}c=o}else r=o,l=72}}while(0);if(72==(0|l))if((0|cr[52625+t>>0])>>>0<e>>>0){for(;n=(n=0|ar[d>>2])>>>0<(0|ar[s>>2])>>>0?(ar[d>>2]=n+1,0|cr[n>>0]):0|vi(A),(0|cr[52625+n>>0])>>>0<e>>>0;);ar[(t=10364)>>2]=34,t=0==(1&i|0)&!0?b:0,e=f,n=i}else t=b,e=r;if(0|ar[s>>2]&&(ar[d>>2]=(0|ar[d>>2])-1),!(e>>>0<f>>>0|(0|e)==(0|f)&n>>>0<i>>>0)){if(!(0!=(1&i|0)|!1|0!=(0|t))){ar[(d=10364)>>2]=34,i=0|tb(0|i,0|f,-1,-1),f=D;break}if(f>>>0<e>>>0|(0|e)==(0|f)&i>>>0<n>>>0){ar[(d=10364)>>2]=34;break}}i=0|ob(n^t|0,e^(i=((0|t)<0)<<31>>31)|0,0|t,0|i),f=D}}while(0);return D=f,0|i}function vi(A){var e=0,r=0,i=0,f=0,n=0,t=0,o=0;return!(0!=(0|(t=0|ar[(r=(A|=0)+104|0)>>2]))&&(0|ar[A+108>>2])>=(0|t))&&0<=(0|(e=0|gi(A)))?(i=0|ar[r>>2],r=A+8|0,i?i=((t=n=0|ar[r>>2])-(r=0|ar[A+4>>2])|0)<(0|(i=i-(0|ar[(f=A+108|0)>>2])|0))?n=t:(n=r+(i+-1)|0,t):(f=A+108|0,n=i=0|ar[r>>2],r=0|ar[A+4>>2]),ar[A+100>>2]=n,0|i&&(ar[f>>2]=i+1-r+(0|ar[f>>2])),(0|cr[(r=r+-1|0)>>0])!=(0|e)&&(tr[r>>0]=e)):o=4,4==(0|o)&&(ar[A+100>>2]=0,e=-1),0|e}function mi(A){return 1&(32==(0|(A|=0))|(A+-9|0)>>>0<5)|0}function gi(A){var e,r;return e=ur=(r=ur)+31&-32,ur=ur+16|0,A=0==(0|Zi(A|=0))&&1==(0|xb[63&ar[A+32>>2]](A,e,1))?0|cr[e>>0]:-1,ur=r,0|A}function Zi(A){var e=0,r=0;return r=0|tr[(e=(A|=0)+74|0)>>0],tr[e>>0]=r+255|r,r=A+28|0,(0|ar[(e=A+20|0)>>2])>>>0>(0|ar[r>>2])>>>0&&xb[63&ar[A+36>>2]](A,0,0),ar[A+16>>2]=0,ar[r>>2]=0,(ar[e>>2]=0)|(e=4&(e=0|ar[A>>2])?(ar[A>>2]=32|e,-1):(r=(0|ar[A+44>>2])+(0|ar[A+48>>2])|0,ar[A+8>>2]=r,ar[A+4>>2]=r,e<<27>>31))}function pi(A,e,r){var i,f,n;return 0|(0|(i=A|=0,f=e|=0,n=r|=0,0|(n=0|fl(i|=0,f|=0,n|=0,0,-2147483648))))}function yi(){return 0|(0|ar[ar[2622]>>2]?4:1)}function Bi(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o;return f=ur=(i=ur)+31&-32,ur=ur+16|0,ar[f>>2]=r,r=0|(n=A,t=e,o=f,0|Yc(n|=0,2147483647,t|=0,o|=0)),ur=i,0|r}function Ei(A,e){A|=0,e|=0;var r,i;return i=ur=(r=ur)+31&-32,ur=ur+16|0,ar[i>>2]=A,ar[4+i>>2]=e,e=0|Ic(0|M(91,0|i)),ur=r,0|e}function Xi(A,e,r,i){A|=0,r|=0,i|=0;var f=0,n=0,t=0,o=0,a=0;f=0|ar[(e|=0)>>2],a=0!=(0|i)&&0!=(0|(n=0|ar[i>>2]))?A?(ar[i>>2]=0,o=r,t=f,43):(t=f,i=r,25):5;A:do{if(5==(0|a)){if(i=0!=(0|A),0|ar[ar[(a=10488)>>2]>>2]){if(i){i=r,a=15;break}i=r,a=14;break}if(!i){r=0|Vc(f),a=59;break}e:do{if(r){for(i=r;(n=0|tr[f>>0])<<24>>24;){if(f=f+1|0,ar[A>>2]=n<<24>>24&57343,!(i=i+-1|0))break e;A=A+4|0}ar[A>>2]=0,r=r-i|(ar[e>>2]=0),a=59;break A}}while(0);ar[e>>2]=f,a=59}}while(0);A:for(;;){e:do{if(14==(0|a)){for(;;){if(((255&(n=0|tr[f>>0]))-1|0)>>>0<127&&0==(3&f|0)&&(n=255&(a=0|ar[f>>2]),!(-2139062144&(a+-16843009|a)))){for(;i=i+-4|0,!(-2139062144&((n=0|ar[(f=f+4|0)>>2])+-16843009|n)|0););n&=255}if(127<=((n&=255)+-1|0)>>>0)break;f=f+1|0,i=i+-1|0}if(!(50<(n=n+-194|0)>>>0)){n=0|ar[9896+(n<<2)>>2],t=f+1|0,a=25;continue A}a=53}else{if(15==(0|a)){r:do{if(i){for(;;){n=0|tr[f>>0];do{if(((255&n)-1|0)>>>0<127&&4<i>>>0&0==(3&f|0)){for(;;){if(-2139062144&((n=0|ar[f>>2])+-16843009|n)|0){a=38;break}if(ar[A>>2]=255&n,ar[A+4>>2]=cr[f+1>>0],ar[A+8>>2]=cr[f+2>>0],t=f+4|0,n=A+16|0,ar[A+12>>2]=cr[f+3>>0],!(4<(i=i+-4|0)>>>0)){a=37;break}A=n,f=t}if(37==(0|a)){A=n,n=0|tr[(f=t)>>0];break}if(38==(0|a)){n&=255;break}}}while(0);if(127<=((n&=255)+-1|0)>>>0)break;if(f=f+1|0,ar[A>>2]=n,!(i=i+-1|0))break r;A=A+4|0}if(50<(n=n+-194|0)>>>0){a=53;break e}n=0|ar[9896+(n<<2)>>2],o=i,t=f+1|0,a=43;continue A}}while(0);ar[e>>2]=f,a=59;continue A}if(25==(0|a)){if(!(7<((a=(0|cr[t>>0])>>>3)+-16|a+(n>>26))>>>0)){if(f=t+1|0,33554432&n){if((-64&tr[f>>0])<<24>>24!=-128){f=t,a=52;break}if(f=t+2|0,524288&n){if((-64&tr[f>>0])<<24>>24!=-128){f=t,a=52;break}f=t+3|0}}i=i+-1|0,a=14;continue A}f=t,a=52}else if(43==(0|a)){if(!(7<((f=(i=(a=0)|cr[t>>0])>>>3)+-16|f+(n>>26))>>>0)){f=t+1|0,i=i+-128|n<<6;do{if((0|i)<0){if(63<(n=(0|cr[f>>0])-128|0)>>>0){f=t+-1|0,r=A;break e}if(f=t+2|0,(0|(i=n|i<<6))<0){if(63<(n=(0|cr[f>>0])-128|0)>>>0){f=t+-1|0,r=A;break e}f=t+3|0,i=n|i<<6;break}}}while(0);ar[A>>2]=i,A=A+4|0,i=o+-1|0,a=15;continue A}f=t,i=o,a=52}else if(59==(0|a))return 0|r}}while(0);if(52==(0|a)&&(f=f+-1|(a=0),n?r=A:a=53),53==(0|a)){if(!(0|tr[f>>0])){0|A&&(ar[A>>2]=0,ar[e>>2]=0),r=r-i|0,a=59;continue}r=A}ar[(a=10364)>>2]=84,r?(ar[e>>2]=f,r=-1,a=59):(r=-1,a=59)}return 0}function Wi(A){var e=0,r=0,i=0;0<=(0|ar[(A|=0)+76>>2])&&0!=(0|Jc())?e=(r=0|ar[(e=A+4|0)>>2])>>>0<(0|ar[A+8>>2])>>>0?(ar[e>>2]=r+1,0|cr[r>>0]):0|gi(A):i=3;do{if(3==(0|i)){if((r=0|ar[(e=A+4|0)>>2])>>>0<(0|ar[A+8>>2])>>>0){ar[e>>2]=r+1,e=0|cr[r>>0];break}e=0|gi(A);break}}while(0);return 0|e}function Ii(A,e,r){A|=0,e|=0,r|=0;var i,f;return f=ur=(i=ur)+31&-32,ur=ur+16|0,ar[f>>2]=r,r=0|Qc(A,e,f),ur=i,0|r}function Ci(A,e,r,i){A|=0,e|=0,r|=0,i|=0;var f,n,t=0,o=0;f=ur=(n=ur)+31&-32,ur=ur+16|0;A:do{if(A){e:do{if(3<r>>>0){for(i=r,t=0|ar[e>>2];;){if(126<((o=0|ar[t>>2])+-1|0)>>>0){if(!o)break;if(-1==(0|(o=0|$c(A,o)))){r=-1;break A}A=A+o|0,i=i-o|0}else tr[A>>0]=o,A=A+1|0,i=i+-1|0,t=0|ar[e>>2];if(t=t+4|0,ar[e>>2]=t,i>>>0<=3)break e}tr[A>>0]=0,r=r-i|(ar[e>>2]=0);break A}i=r}while(0);if(i){for(t=0|ar[e>>2];;){if(126<((o=0|ar[t>>2])+-1|0)>>>0){if(!o){t=19;break}if(-1==(0|(o=0|$c(f,o)))){r=-1;break A}if(i>>>0<o>>>0){t=22;break}$c(A,0|ar[t>>2]),A=A+o|0,i=i-o|0}else tr[A>>0]=o,A=A+1|0,i=i+-1|0,t=0|ar[e>>2];if(t=t+4|0,ar[e>>2]=t,!i)break A}if(19==(0|t)){tr[A>>0]=0,r=r-i|(ar[e>>2]=0);break}if(22==(0|t)){r=r-i|0;break}}}else if(r=0|ar[e>>2],i=0|ar[r>>2]){A=r,r=0;do{if(127<i>>>0){if(-1==(0|(i=0|$c(f,i)))){r=-1;break A}}else i=1;r=i+r|0,i=0|ar[(A=A+4|0)>>2]}while(0!=(0|i))}else r=0}while(0);return ur=n,0|r}function Gi(A,e,r,i){A|=0,e|=0,r|=0;var f,n,t=0,o=0,a=0,c=0;t=ur=(n=ur)+31&-32,ur=ur+16|0,i=0|ar[(f=0==(0|(i|=0))?58152:i)>>2];A:do{if(e)if(o=0==(0|A)?t:A,r){if(i)t=r,a=11;else{if(-1<(i=0|tr[e>>0])<<24>>24){ar[o>>2]=255&i,i=i<<24>>24!=0&1;break}if(t=10488,i=0|tr[e>>0],!(0|ar[ar[t>>2]>>2])){ar[o>>2]=i<<24>>24&57343,i=1;break}if(50<(i=(255&i)-194|0)>>>0){a=17;break}i=0|ar[9896+(i<<2)>>2],(t=r+-1|0)&&(e=e+1|0,a=11)}e:do{if(11==(0|a)){if(7<((c=(255&(A=0|tr[e>>0]))>>>3)+-16|c+(i>>26))>>>0){a=17;break A}for(;e=e+1|0,t=t+-1|0,!(0<=(0|(i=(255&A)-128|i<<6)));){if(!t)break e;if((-64&(A=0|tr[e>>0]))<<24>>24!=-128){a=17;break A}}ar[f>>2]=0,ar[o>>2]=i,i=r-t|0;break A}}while(0);ar[f>>2]=i,i=-2}else i=-2;else i?a=17:i=0}while(0);return 17==(0|a)&&(ar[f>>2]=0,ar[(i=10364)>>2]=84,i=-1),ur=n,0|i}function Vi(A,e,r,i,f){A|=0,r|=0,i|=0,f|=0;var n,t,o,a,c=0,l=0,u=0,b=0;t=ur=(a=ur)+31&-32,ur=ur+1040|0,n=8+t|0,b=0|ar[(e|=0)>>2],l=(o=0!=(0|A))?i:256,A=o?A:n,c=ar[t>>2]=b;A:do{if(0!=(0|l)&0!=(0|b)){for(i=0,b=r;;){if(!(131<b>>>0|(r=l>>>0<=(u=b>>>2)>>>0))){r=b;break A}if(r=b-(c=r?l:u)|0,-1==(0|(c=0|Xi(A,t,c,f))))break;if(A=(b=(0|A)==(0|n))?A:A+(c<<2)|0,i=c+i|0,!(0!=(0|(l=l-(b?0:c)|0))&0!=(0|(c=0|ar[t>>2]))))break A;b=r}i=-1,c=(l=0)|ar[t>>2]}else i=0}while(0);A:do{if(0!=(0|c)&&0!=(0|l)&0!=(0|r)){for(u=A;!(((A=0|Gi(u,c,r,f))+2|0)>>>0<3);){if(c=(0|ar[t>>2])+A|0,ar[t>>2]=c,i=i+1|0,!(0!=(0|(l=l+-1|0))&0!=(0|(r=r-A|0))))break A;u=u+4|0}switch(0|A){case-1:i=-1;break A;case 0:ar[t>>2]=0;break A;default:ar[f>>2]=0;break A}}}while(0);return o&&(ar[e>>2]=ar[t>>2]),ur=a,0|i}function Fi(A,e,r,i,f){A|=0,r|=0,i|=0,f|=0;var n,t,o,a,c=0,l=0;t=ur=(a=ur)+31&-32,ur=ur+272|0,n=8+t|0,l=0|ar[(e|=0)>>2],c=(o=0!=(0|A))?i:256,A=o?A:n,i=ar[t>>2]=l;A:do{if(0!=(0|c)&0!=(0|l)){for(f=0,l=i;;){if(!((i=c>>>0<=r>>>0)|32<r>>>0)){i=l;break A}if(r=r-(i=i?c:r)|0,-1==(0|(i=0|Ci(A,t,i,0))))break;if(A=(l=(0|A)==(0|n))?A:A+i|0,f=i+f|0,!(0!=(0|(c=c-(l?0:i)|0))&0!=(0|(i=0|ar[t>>2]))))break A;l=i}f=-1,i=(c=0)|ar[t>>2]}else f=0}while(0);A:do{if(0!=(0|i)&&0!=(0|c)&0!=(0|r)){for(l=A;!(((A=0|$c(l,0|ar[i>>2]))+1|0)>>>0<2);){if(i=4+(0|ar[t>>2])|0,ar[t>>2]=i,f=A+f|0,!(0!=(0|(c=c-A|0))&0!=(0|(r=r+-1|0))))break A;l=l+A|0}A?f=-1:ar[t>>2]=0}}while(0);return o&&(ar[e>>2]=ar[t>>2]),ur=a,0|f}function Ri(A,e,r){A|=0,r|=0;var i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0;switch(0|(e|=0)){case 0:a=-149,c=24,t=4;break;case 1:case 2:a=-1074,c=53,t=4;break;default:i=0}A:do{if(4==(0|t)){for(u=A+4|0,l=A+100|0;0!=(0|mi(e=(e=0|ar[u>>2])>>>0<(0|ar[l>>2])>>>0?(ar[u>>2]=e+1,0|cr[e>>0]):0|vi(A))););e:do{switch(0|e){case 43:case 45:if(n=1-((45==(0|e)&1)<<1)|0,(e=0|ar[u>>2])>>>0<(0|ar[l>>2])>>>0){ar[u>>2]=e+1,f=0|cr[e>>0];break e}f=0|vi(A);break e;default:f=e,n=1}}while(0);e=0;do{if((32|f)!=(0|tr[52890+e>>0]))break;do{if(e>>>0<7){if((f=0|ar[u>>2])>>>0<(0|ar[l>>2])>>>0){ar[u>>2]=f+1,f=0|cr[f>>0];break}f=0|vi(A);break}}while(0);e=e+1|0}while(e>>>0<8);e:do{switch(0|e){case 8:break;case 3:t=23;break;default:if((o=0!=(0|r))&3<e>>>0){if(8==(0|e))break e;t=23;break e}r:do{if(!e){e=0;do{if((32|f)!=(0|tr[52899+e>>0]))break r;do{if(e>>>0<2){if((f=0|ar[u>>2])>>>0<(0|ar[l>>2])>>>0){ar[u>>2]=f+1,f=0|cr[f>>0];break}f=0|vi(A);break}}while(0);e=e+1|0}while(e>>>0<3)}}while(0);switch(0|e){case 3:if(40!=(0|(e=(e=0|ar[u>>2])>>>0<(0|ar[l>>2])>>>0?(ar[u>>2]=e+1,0|cr[e>>0]):0|vi(A)))){if(!(0|ar[l>>2])){i=h;break A}ar[u>>2]=(0|ar[u>>2])-1,i=h;break A}for(e=1;((f=(f=0|ar[u>>2])>>>0<(0|ar[l>>2])>>>0?(ar[u>>2]=f+1,0|cr[f>>0]):0|vi(A))+-48|0)>>>0<10|(f+-65|0)>>>0<26||95==(0|f)|(f+-97|0)>>>0<26;)e=e+1|0;if(41==(0|f)){i=h;break A}if((f=0==(0|ar[l>>2]))||(ar[u>>2]=(0|ar[u>>2])-1),!o){ar[(u=10364)>>2]=22,nl(A,0),i=0;break A}if(!e){i=h;break A}for(;;)if(e=e+-1|0,f||(ar[u>>2]=(0|ar[u>>2])-1),!e){i=h;break A}case 0:if(48==(0|f)){if(120==(32|(e=(e=0|ar[u>>2])>>>0<(0|ar[l>>2])>>>0?(ar[u>>2]=e+1,0|cr[e>>0]):0|vi(A)))){i=+Ni(A,c,a,n,r);break A}e=(0|ar[l>>2]&&(ar[u>>2]=(0|ar[u>>2])-1),48)}else e=f;i=+_i(A,e,c,a,n,r);break A;default:0|ar[l>>2]&&(ar[u>>2]=(0|ar[u>>2])-1),ar[(u=10364)>>2]=22,nl(A,0),i=0;break A}}}while(0);if(23==(0|t)&&((f=0==(0|ar[l>>2]))||(ar[u>>2]=(0|ar[u>>2])-1),0!=(0|r)&3<e>>>0))for(;f||(ar[u>>2]=(0|ar[u>>2])-1),3<(e=e+-1|0)>>>0;);i=(0|n)*w}}while(0);return+i}function Ni(A,e,r,i,f){e|=0,r|=0,i|=0,f|=0;var n,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0;a=(o=(o=0|ar[(g=(A|=0)+4|0)>>2])>>>0<(0|ar[(n=A+100|0)>>2])>>>0?(ar[g>>2]=o+1,0|cr[o>>0]):0|vi(A),0);A:for(;;){switch(0|o){case 46:b=8;break A;case 48:break;default:d=1,h=a,l=u=k=a=m=t=v=w=0;break A}(o=0|ar[g>>2])>>>0<(0|ar[n>>2])>>>0?(ar[g>>2]=o+1,o=0|cr[o>>0],a=1):(o=0|vi(A),a=1)}if(8==(0|b))if(48==(0|(o=(o=0|ar[g>>2])>>>0<(0|ar[n>>2])>>>0?(ar[g>>2]=o+1,0|cr[o>>0]):0|vi(A)))){for(a=l=0;o=(o=0|ar[g>>2])>>>0<(0|ar[n>>2])>>>0?(ar[g>>2]=o+1,0|cr[o>>0]):0|vi(A),l=0|tb(0|l,0|a,-1,-1),a=D,48==(0|o););h=d=w=1,u=k=m=t=v=0}else d=w=1,h=a,l=u=k=a=m=t=v=0;for(;s=46==(0|o),!(10<=(b=o+-48|0)>>>0)||s|((32|o)-97|0)>>>0<6;){if(s){if(w){o=46;break}w=1,b=v,c=d,o=m,l=u,a=k}else{o=57<(0|o)?(32|o)-87|0:b;do{if(!((0|k)<0|0==(0|k)&u>>>0<8)){if((0|k)<0|0==(0|k)&u>>>0<14){b=v,t+=(c=d*=.0625)*(0|o),o=m;break}b=(o=0!=(0|v)|0==(0|o))?v:1,c=d,t=o?t:t+.5*d,o=m;break}b=v,c=d,o=o+(m<<4)|0}while(0);u=0|tb(0|u,0|k,1,0),h=1,k=D}o=(s=0|ar[g>>2])>>>0<(0|ar[n>>2])>>>0?(ar[g>>2]=s+1,v=b,d=c,m=o,0|cr[s>>0]):(v=b,d=c,m=o,0|vi(A))}do{if(h){if(s=(b=0==(0|w))?u:l,b=b?k:a,(0|k)<0|0==(0|k)&u>>>0<8){for(a=m,l=k;a<<=4,u=0|tb(0|u,0|l,1,0),(0|(l=D))<0|0==(0|l)&u>>>0<8;);u=a}else u=m;if(112==(32|o)){if(0==(0|(a=0|Yi(A,f)))&-2147483648==(0|(o=D))){if(!f){nl(A,0),t=0;break}o=a=(0|ar[n>>2]&&(ar[g>>2]=(0|ar[g>>2])-1),0)}}else o=a=(0|ar[n>>2]&&(ar[g>>2]=(0|ar[g>>2])-1),0);if(l=0|tb(0|(l=0|db(0|s,0|b,2)),0|D,-32,-1),l=0|tb(0|l,0|D,0|a,0|o),o=D,!u){t=0*(0|i);break}if((0|(f=((0|(g=0-r|0))<0)<<31>>31))<(0|o)|(0|o)==(0|f)&g>>>0<l>>>0){ar[(e=10364)>>2]=34,t=17976931348623157e292*(0|i)*17976931348623157e292;break}if((0|o)<(0|(f=((0|(g=r+-106|0))<0)<<31>>31))|(0|o)==(0|f)&l>>>0<g>>>0){ar[(e=10364)>>2]=34,t=22250738585072014e-324*(0|i)*22250738585072014e-324;break}if(-1<(0|u)){for(a=u;a=a<<1|1&(1^(g=!(.5<=t))),t+=g?t:t+-1,l=0|tb(0|l,0|o,-1,-1),o=D,-1<(0|a););d=t,u=a}else d=t;o=0|tb(0|(r=0|ob(32,0,0|r,((0|r)<0)<<31>>31|0)),0|D,0|l,0|o),59==(0|(b=(0|(r=D))<(0|(g=((0|e)<0)<<31>>31))|(0|g)==(0|r)&o>>>0<e>>>0?0<(0|o)?59:(a=0,o=84,61):(o=e,59)))&&((0|o)<53?(o=84-(a=o)|0,b=61):t=+((c=0)|i)),61==(0|b)&&(t=+(0|i),c=+Di(+Qi(1,o),t),o=a),0==(t=t*((i=0==(1&u|0)&0!=d&(0|o)<32)?0:d)+(c+t*(((1&i)+u|0)>>>0))-c)&&(ar[(i=10364)>>2]=34),t=+Mi(t,l)}else(a=0!=(0|(o=0|ar[n>>2])))&&(ar[g>>2]=(0|ar[g>>2])-1),f?(a&&(ar[g>>2]=(0|ar[g>>2])-1),0==(0|w)|0==(0|o)||(ar[g>>2]=(0|ar[g>>2])-1)):nl(A,0),t=0*(0|i)}while(0);return+t}function _i(A,e,r,i,f,n){e|=0,f|=0,n|=0;var t,o,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0;t=ur=(o=ur)+31&-32,ur=ur+512|0,G=0-(C=(i|=0)+(r|=0)|0)|0,X=(A|=0)+4|0,W=A+100|0,l=0;A:for(;;){switch(0|e){case 46:B=6;break A;case 48:break;default:d=l,s=k=g=0;break A}(e=0|ar[X>>2])>>>0<(0|ar[W>>2])>>>0?(ar[X>>2]=e+1,e=0|cr[e>>0],l=1):(e=0|vi(A),l=1)}if(6==(0|B))if(48==(0|(e=(e=0|ar[X>>2])>>>0<(0|ar[W>>2])>>>0?(ar[X>>2]=e+1,0|cr[e>>0]):0|vi(A))))for(e=l=0;;){if(l=0|tb(0|l,0|e,-1,-1),s=D,48!=(0|(e=(e=0|ar[X>>2])>>>0<(0|ar[W>>2])>>>0?(ar[X>>2]=e+1,0|cr[e>>0]):0|vi(A)))){d=g=1,k=l;break}e=s}else g=1,d=l,s=k=0;b=e+-48|(ar[t>>2]=0),u=46==(0|e);A:do{if(u|b>>>0<10){E=496+t|0,p=g,y=d,B=b,b=d=m=l=Z=0;e:for(;;){do{if(u){if(p)break e;p=1,k=d,s=b}else{if(d=0|tb(0|d,0|b,1,0),b=D,g=48!=(0|e),125<=(0|l)){if(!g)break;ar[E>>2]=1|ar[E>>2];break}u=t+(l<<2)|0,e=Z?e+-48+(10*(0|ar[u>>2])|0)|0:B,ar[u>>2]=e,Z=(y=9==(0|(Z=Z+1|0)))?0:Z,l=(1&y)+l|0,m=g?d:m,y=1}}while(0);if(!((u=46==(0|(e=(e=0|ar[X>>2])>>>0<(0|ar[W>>2])>>>0?(ar[X>>2]=e+1,0|cr[e>>0]):0|vi(A))))|(B=e+-48|0)>>>0<10)){g=p,u=y,B=29;break A}}e=Z,u=0!=(0|y),B=37}else u=d,b=d=m=l=Z=0,B=29}while(0);do{if(29==(0|B)){if(k=(E=0==(0|g))?d:k,s=E?b:s,!((u=0!=(0|u))&101==(32|e))){if(-1<(0|e)){e=Z,B=37;break}e=Z,B=39;break}if(0==(0|(u=0|Yi(A,n)))&-2147483648==(0|(e=D))){if(!n){nl(A,0),a=0;break}e=u=(0|ar[W>>2]&&(ar[X>>2]=(0|ar[X>>2])-1),0)}y=0|tb(0|u,0|e,0|k,0|s),e=Z,s=D,B=41}}while(0);37==(0|B)&&(B=0|ar[W>>2]?(ar[X>>2]=(0|ar[X>>2])-1,u?(y=k,41):40):39),39==(0|B)&&(B=u?(y=k,41):40);do{if(40==(0|B))ar[(G=10364)>>2]=22,nl(A,0),a=0;else if(41==(0|B)){if(!(u=0|ar[t>>2])){a=0*(0|f);break}if((0|y)==(0|d)&(0|s)==(0|b)&((0|b)<0|0==(0|b)&d>>>0<10)&&30<(0|r)|0==(u>>>r|0)){a=(0|f)*(u>>>0);break}if((0|(W=((0|(A=(0|i)/-2|0))<0)<<31>>31))<(0|s)|(0|s)==(0|W)&A>>>0<y>>>0){ar[(G=10364)>>2]=34,a=17976931348623157e292*(0|f)*17976931348623157e292;break}if((0|s)<(0|(W=((0|(A=i+-106|0))<0)<<31>>31))|(0|s)==(0|W)&y>>>0<A>>>0){ar[(G=10364)>>2]=34,a=22250738585072014e-324*(0|f)*22250738585072014e-324;break}if(e){if((0|e)<9){for(u=0|ar[(b=t+(l<<2)|0)>>2];u=10*u|0,9!=(0|(e=e+1|0)););ar[b>>2]=u}l=l+1|0}if((0|m)<9&&(0|m)<=(0|y)&(0|y)<18){if(e=0|ar[t>>2],9==(0|y)){a=(0|f)*(e>>>0);break}if((0|y)<9){a=(0|f)*(e>>>0)/(0|ar[14012+(8-y<<2)>>2]);break}if(30<(0|(A=r+27+(0|br(y,-3))|0))|0==(e>>>A|0)){a=(0|f)*(e>>>0)*(0|ar[14012+(y+-10<<2)>>2]);break}}if(e=(0|y)%9|0){if(d=0|ar[14012+(8-(m=-1<(0|y)?e:e+9|0)<<2)>>2],l){for(k=1e9/(0|d)|0,u=y,e=s=b=0;A=(((W=0|ar[(X=t+(e<<2)|0)>>2])>>>0)/(d>>>0)|0)+b|0,ar[X>>2]=A,b=0|br(k,(W>>>0)%(d>>>0)|0),u=(A=(0|e)==(0|s)&0==(0|A))?u+-9|0:u,s=A?s+1&127:s,(0|(e=e+1|0))!=(0|l););b?(ar[t+(l<<2)>>2]=b,b=s,l=l+1|0):b=s}else l=b=0,u=y;y=9-m+u|(e=0)}else b=e=0;A:for(;;){for(m=(0|y)<18,g=18==(0|y),Z=t+(b<<2)|0;;){if(!m){if(!g){u=y;break A}if(9007199<=(0|ar[Z>>2])>>>0){u=18;break A}}for(l=(p=l)+127|(u=0);l=0|tb(0|(l=0|db(0|ar[(d=t+((s=127&l)<<2)|0)>>2],0,29)),0|D,0|u,0),0<(u=D)>>>0|0==(0|u)&1e9<l>>>0?(k=0|lb(0|l,0|u,1e9,0),l=0|ub(0|l,0|u,1e9,0)):k=0,p=0==(0|(ar[d>>2]=l))&(1^((0|s)!=(p+127&127|0)|(A=(0|s)==(0|b))))?s:p,!A;)u=k,l=s+-1|0;if(e=e+-29|0,0|k)break;l=p}l=p+127&127,u=t+((p+126&127)<<2)|0,(0|(b=b+127&127))==(0|p)?ar[u>>2]=ar[u>>2]|ar[t+(l<<2)>>2]:l=p,ar[t+(b<<2)>>2]=k,y=y+9|0}A:for(;;){for(Z=l+1&127,p=t+((l+127&127)<<2)|0;;){for(k=18==(0|u),g=27<(0|u)?9:1,y=b;;){for(b=0;;){if((0|(s=b+y&127))==(0|l)){I=2,B=88;break}if((s=0|ar[t+(s<<2)>>2])>>>0<(d=0|ar[14044+(b<<2)>>2])>>>0){I=2,B=88;break}if(d>>>0<s>>>0)break;if(2<=(0|(b=b+1|0))){I=b,B=88;break}}if(88==(0|B)&&k&2==((B=0)|I)){s=a=0;break A}if(e=g+e|0,(0|y)!=(0|l))break;y=l}for(k=(1<<g)-1|0,m=1e9>>>g,d=0,s=b=y;A=((W=0|ar[(X=t+(s<<2)|0)>>2])>>>g)+d|0,ar[X>>2]=A,d=0|br(W&k,m),u=(A=(0|s)==(0|b)&0==(0|A))?u+-9|0:u,b=A?b+1&127:b,(0|(s=s+1&127))!=(0|l););if(d){if((0|Z)!=(0|b))break;ar[p>>2]=1|ar[p>>2]}}ar[t+(l<<2)>>2]=d,l=Z}for(;u=l+1&127,(0|(b=s+y&127))==(0|l)&&(ar[t+(u+-1<<2)>>2]=0,l=u),a=1e9*a+ +((0|ar[t+(b<<2)>>2])>>>0),2!=(0|(s=s+1|0)););if(c=(v=+(0|f))*a,h=(0|(b=(k=(0|(d=(s=e+53|0)-i|0))<(0|r))?0<(0|d)?d:0:r))<53?(w=+Di(+Qi(1,105-b|0),c))+(c-(a=h=+Ji(c,+Qi(1,53-b|0)))):(a=w=0,c),(0|(u=y+2&127))!=(0|l)){u=0|ar[t+(u<<2)>>2];do{if(5e8<=u>>>0){if(5e8!=(0|u)){a=.75*v+a;break}if((y+3&127|0)==(0|l)){a=.5*v+a;break}a=.75*v+a;break}if(0==(0|u)&&(y+3&127|0)==(0|l))break;a=.25*v+a}while(0);c=1<(53-b|0)&&0==+Ji(a,1)?a+1:a}else c=a;a=h+c-w;do{if((-2-C|0)<(2147483647&s|0)){if(a=(C=!(9007199254740992<=+V(+a)))?a:.5*a,((e=(1&(1^C))+e|0)+50|0)<=(0|G)&&!(0!=c&k&((0|b)!=(0|d)|C)))break;ar[(G=10364)>>2]=34}}while(0);a=+Mi(a,e)}}while(0);return ur=o,+a}function Yi(A,e){e|=0;var r,i=0,f=0,n=0,t=0,o=0,a=0;switch(0|(i=(i=0|ar[(a=(A|=0)+4|0)>>2])>>>0<(0|ar[(r=A+100|0)>>2])>>>0?(ar[a>>2]=i+1,0|cr[i>>0]):0|vi(A))){case 43:case 45:f=45==(0|i)&1,0!=(0|e)&9<((i=(i=0|ar[a>>2])>>>0<(0|ar[r>>2])>>>0?(ar[a>>2]=i+1,0|cr[i>>0]):0|vi(A))+-48|0)>>>0&&0!=(0|ar[r>>2])&&(ar[a>>2]=(0|ar[a>>2])-1);break;default:f=0}if(9<(i+-48|0)>>>0)i=(f=(0|ar[r>>2]&&(ar[a>>2]=(0|ar[a>>2])-1),-2147483648),0);else{for(n=0;n=i+-48+(10*n|0)|0,((i=(i=0|ar[a>>2])>>>0<(0|ar[r>>2])>>>0?(ar[a>>2]=i+1,0|cr[i>>0]):0|vi(A))+-48|0)>>>0<10&(0|n)<214748364;);if(e=((0|n)<0)<<31>>31,(i+-48|0)>>>0<10){for(;e=0|nb(0|n,0|e,10,0),n=D,i=0|tb(0|i,((0|i)<0)<<31>>31|0,-48,-1),n=0|tb(0|i,0|D,0|e,0|n),e=D,((i=(i=0|ar[a>>2])>>>0<(0|ar[r>>2])>>>0?(ar[a>>2]=i+1,0|cr[i>>0]):0|vi(A))+-48|0)>>>0<10&((0|e)<21474836|21474836==(0|e)&n>>>0<2061584302););t=i,o=n}else t=i,o=n;if(i=0|ar[r>>2],(t+-48|0)>>>0<10)for(;(n=0|ar[a>>2])>>>0<i>>>0?(ar[a>>2]=n+1,n=0|cr[n>>0]):(n=0|vi(A),i=0|ar[r>>2]),(n+-48|0)>>>0<10;);0|i&&(ar[a>>2]=(0|ar[a>>2])-1),i=0|ob(0,0,0|o,0|e),f=(a=0!=(0|f))?D:e,i=a?i:o}return D=f,0|i}function Qi(A,e){A=+A;var r=0,i=0;return(0|(e|=0))<=1023?(0|e)<-1022&&(A*=22250738585072014e-324,r=e+1022|0,e=e+2044|0,A=(i=(0|r)<-1022)?22250738585072014e-324*A:A,e=i?-1022<(0|e)?e:-1022:r):(A*=898846567431158e293,i=e+-1023|0,e=e+-2046|0,A=(r=1023<(0|i))?898846567431158e293*A:A,e=r?(0|e)<1023?e:1023:i),r=0|db(e+1023|0,0,52),i=D,ar[d>>2]=r,ar[d+4>>2]=i,+(A*Q[d>>3])}function Di(A,e){return+ +function(A,e){A=+A,e=+e;var r,i=0;return Q[d>>3]=A,r=0|ar[d>>2],i=0|ar[d+4>>2],Q[d>>3]=e,i=-2147483648&ar[d+4>>2]|2147483647&i,ar[d>>2]=r,ar[d+4>>2]=i,+ +Q[d>>3]}(A=+A,e=+e)}function Ji(A,e){return+ +function(A,e){A=+A,e=+e;var r,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;Q[d>>3]=A,o=0|ar[d>>2],c=0|ar[d+4>>2],Q[d>>3]=e,u=0|ar[d>>2],b=0|ar[d+4>>2],f=2047&(f=0|sb(0|o,0|c,52)),l=2047&(l=0|sb(0|u,0|b,52)),r=-2147483648&c,t=0|db(0|u,0|b,1),a=D;A:do{if(0==(0|t)&0==(0|a)||(n=0|Ti(e),i=2147483647&D,2047==(0|f)|2146435072<i>>>0|2146435072==(0|i)&0<n>>>0))s=3;else{if(i=0|db(0|o,0|c,1),!(a>>>0<(n=D)>>>0|(0|n)==(0|a)&t>>>0<i>>>0))return+((0|i)==(0|t)&(0|n)==(0|a)?0*A:A);if(f)t=1048575&c|1048576;else{if(i=0|db(0|o,0|c,12),-1<(0|(n=D))|-1==(0|n)&4294967295<i>>>0)for(f=0;f=f+-1|0,i=0|db(0|i,0|n,1),-1<(0|(n=D))|-1==(0|n)&4294967295<i>>>0;);else f=0;o=0|db(0|o,0|c,1-f|0),t=D}if(l)c=1048575&b|1048576;else{if(n=0|db(0|u,0|b,12),-1<(0|(a=D))|-1==(0|a)&4294967295<n>>>0)for(i=0;i=i+-1|0,n=0|db(0|n,0|a,1),-1<(0|(a=D))|-1==(0|a)&4294967295<n>>>0;);else i=0;u=0|db(0|u,0|b,1-i|0),l=i,c=D}n=0|ob(0|o,0|t,0|u,0|c),a=-1<(0|(i=D))|-1==(0|i)&4294967295<n>>>0;e:do{if((0|l)<(0|f)){for(;;){if(a){if(0==(0|n)&0==(0|i))break}else n=o,i=t;if(o=0|db(0|n,0|i,1),n=0|ob(0|o,0|(t=D),0|u,0|c),a=-1<(0|(i=D))|-1==(0|i)&4294967295<n>>>0,(0|(f=f+-1|0))<=(0|l))break e}e=0*A;break A}}while(0);if(a){if(0==(0|n)&0==(0|i)){e=0*A;break}}else i=t,n=o;if(i>>>0<1048576|1048576==(0|i)&n>>>0<0)for(;n=0|db(0|n,0|i,1),f=f+-1|0,(i=D)>>>0<1048576|1048576==(0|i)&n>>>0<0;);0<(0|f)?(b=0|tb(0|n,0|i,0,-1048576),i=D,f=0|db(0|f,0,52),i|=D,f|=b):(f=0|sb(0|n,0|i,1-f|0),i=D),ar[d>>2]=f,ar[d+4>>2]=i|r,e=+Q[d>>3]}}while(0);3==(0|s)&&(e*=A,e/=e);return+e}(A=+A,e=+e)}function Mi(A,e){return+ +Qi(A=+A,e|=0)}function Ti(A){A=+A;var e;return Q[d>>3]=A,e=0|ar[d>>2],D=0|ar[d+4>>2],0|e}function Ui(A,e,r,i){A|=0,i|=0;var f,n=0;return f=0|br(r|=0,e|=0),r=0==(0|e)?0:r,-1<(0|ar[i+76>>2])?(n=0==(0|Jc()),A=0|el(A,f,i),n||Mc()):A=0|el(A,f,i),(0|A)!=(0|f)&&(r=(A>>>0)/(e>>>0)|0),0|r}function Si(A,e){A|=0;var r,i,f,n=0,t=0,o=0,a=0;r=ur=(f=ur)+31&-32,ur=ur+16|0,i=255&(e|=0),tr[r>>0]=i,(o=0|ar[(t=A+16|0)>>2])?a=4:0|rl(A)?n=-1:(o=0|ar[t>>2],a=4);do{if(4==(0|a)){if((t=0|ar[(a=A+20|0)>>2])>>>0<o>>>0&&(0|(n=255&e))!=(0|tr[A+75>>0])){ar[a>>2]=t+1,tr[t>>0]=i;break}n=1==(0|xb[63&ar[A+36>>2]](A,r,1))?0|cr[r>>0]:-1}}while(0);return ur=f,0|n}function Oi(A){A|=0;var e=0,r=0;do{if(A){if((0|ar[A+76>>2])<=-1){e=0|zi(A);break}r=0==(0|Jc()),e=0|zi(A),r||Mc()}else{if(e=0|ar[2636]?0|Oi(0|ar[2636]):0,A=0|(C(58160),58168),A=0|ar[A>>2])for(;r=-1<(0|ar[A+76>>2])?0|Jc():0,(0|ar[A+20>>2])>>>0>(0|ar[A+28>>2])>>>0&&(e=0|zi(A)|e),0|r&&Mc(),0!=(0|(A=0|ar[A+56>>2])););T(58160)}}while(0);return 0|e}function zi(A){var e,r,i=0,f=0,n=0,t=0;return r=(A|=0)+28|0,0|(A=(0|ar[(e=A+20|0)>>2])>>>0>(0|ar[r>>2])>>>0&&(xb[63&ar[A+36>>2]](A,0,0),0==(0|ar[e>>2]))?-1:((f=0|ar[(i=A+4|0)>>2])>>>0<(t=0|ar[(n=A+8|0)>>2])>>>0&&xb[63&ar[A+40>>2]](A,f-t|0,1),ar[A+16>>2]=0,ar[r>>2]=0,ar[e>>2]=0,ar[n>>2]=0,ar[i>>2]=0))}function ji(A,e,r){A|=0,e|=0,r|=0;var i,f;return f=ur=(i=ur)+31&-32,ur=ur+16|0,ar[f>>2]=r,r=0|Hi(A,e,f),ur=i,0|r}function Hi(A,e,r){A|=0,e|=0,r|=0;var i,f,n=0,t=0;for(i=ur=(f=ur)+31&-32,ur=ur+128|0,t=(n=i)+124|0;(0|(n=n+4|(ar[n>>2]=0)))<(0|t););return ar[32+i>>2]=34,ar[44+i>>2]=A,ar[76+i>>2]=-1,ar[84+i>>2]=A,t=0|function(A,e,r){e|=0,r|=0;var i,f,n,t,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0,R=0,N=0,_=0;R=ur=(t=ur)+31&-32,ur=ur+288|0,i=R+8|0,f=R+17|0,R=(n=R)+16|0,_=-1<(0|ar[76+(A|=0)>>2])?0|Jc():0;o=0|tr[e>>0];A:do{if(o<<24>>24){y=A+4|0,B=A+100|0,E=A+108|0,X=A+8|0,W=10+f|0,I=33+f|0,p=4+i|0,C=46+f|0,G=94+f|0,F=V=1+f|0,l=e,a=c=e=v=0;e:for(;;){r:do{if(0|mi(255&o)){for(;0|mi(0|cr[(o=l+1|0)>>0]);)l=o;for(nl(A,0);0!=(0|mi(o=(o=0|ar[y>>2])>>>0<(0|ar[B>>2])>>>0?(ar[y>>2]=o+1,0|cr[o>>0]):0|vi(A))););0|ar[B>>2]?(o=(0|ar[y>>2])-1|0,ar[y>>2]=o):o=0|ar[y>>2],u=(0|ar[E>>2])+v+o-(0|ar[X>>2])|0}else{o=o<<24>>24==37;i:do{if(o){u=0|tr[(s=l+1|0)>>0];f:do{switch(u<<24>>24){case 37:break i;case 42:l=l+2|(Z=0);break;default:if((o=(255&u)-48|0)>>>0<10&&36==(0|tr[l+2>>0])){Z=0|xi(r,o),l=l+3|0;break f}l=3+(0|ar[r>>2])&-4,Z=0|ar[l>>2],ar[r>>2]=l+4,l=s}}while(0);if(o=0|tr[l>>0],((u=255&o)+-48|0)>>>0<10)for(s=0;s=(10*s|0)-48+u|0,o=0|tr[(l=l+1|0)>>0],((u=255&o)+-48|0)>>>0<10;);else s=0;switch(c=(o=o<<24>>24==109)?0:c,a=o?0:a,l=o?l+1|0:l,o&=g=0!=(0|Z),u=l+1|0,0|tr[l>>0]){case 104:m=104==(0|tr[u>>0]),d=m?-2:-1,l=m?l+2|0:u;break;case 108:m=108==(0|tr[u>>0]),d=m?3:1,l=m?l+2|0:u;break;case 106:d=3,l=u;break;case 116:case 122:d=1,l=u;break;case 76:d=2,l=u;break;case 110:case 112:case 67:case 83:case 91:case 99:case 115:case 88:case 71:case 70:case 69:case 65:case 103:case 102:case 101:case 97:case 120:case 117:case 111:case 105:case 100:d=0;break;default:N=137;break e}switch(h=0|cr[l>>0],h=(w=3==(47&h|0))?32|h:h,w=w?1:d,(k=255&h)<<24>>24){case 99:s=1<(0|s)?s:1;break;case 91:break;case 110:Pi(Z,w,v,((0|v)<0)<<31>>31),u=v;break r;default:for(nl(A,0);0!=(0|mi(u=(u=0|ar[y>>2])>>>0<(0|ar[B>>2])>>>0?(ar[y>>2]=u+1,0|cr[u>>0]):0|vi(A))););0|ar[B>>2]?(u=(0|ar[y>>2])-1|0,ar[y>>2]=u):u=0|ar[y>>2],v=(0|ar[E>>2])+v+u-(0|ar[X>>2])|0}if(nl(A,s),u=0|ar[y>>2],d=0|ar[B>>2],u>>>0<d>>>0)ar[y>>2]=u+1;else{if((0|vi(A))<0){N=137;break e}d=0|ar[B>>2]}0|d&&(ar[y>>2]=(0|ar[y>>2])-1);f:do{switch(k<<24>>24){case 91:case 99:case 115:m=99==(0|h);n:do{if(115==(16|h))vb(0|V,-1,256),115==((tr[f>>0]=0)|h)&&(tr[I>>0]=0,tr[W>>0]=0,tr[W+1>>0]=0,tr[W+2>>0]=0,tr[W+3>>0]=0,tr[W+4>>0]=0);else{switch(h=94==(0|tr[(u=l+1|0)>>0]),l=h?l+2|0:u,vb(0|F,(k=1&h)|0,256),(tr[f>>0]=0)|tr[l>>0]){case 45:u=C,N=64;break;case 93:u=G,N=64;break;default:h=255&(1^k)}for(64==(0|N)&&(h=255&(1^k),tr[u>>(N=0)]=h,l=l+1|0);;){u=0|tr[l>>0];t:do{switch(u<<24>>24){case 0:N=137;break e;case 93:break n;case 45:switch((u=0|tr[(k=l+1|0)>>0])<<24>>24){case 93:case 0:u=45;break t}if((255&(l=0|tr[l+-1>>0]))<(255&u)){for(l&=255;tr[f+(l=l+1|0)>>0]=h,u=0|tr[k>>0],(0|l)<(255&u|0););l=k}else l=k}}while(0);tr[1+(255&u)+f>>0]=h,l=l+1|0}}}while(0);u=m?s+1|0:31,h=1==(0|w);n:do{if(h){if(o){if(!(a=0|yc(u<<2))){a=c=0,o=1,N=137;break e}}else a=Z;ar[i>>2]=0,ar[p>>2]=0,k=u,c=0;t:for(;;){d=0==(0|a);do{o:for(;;){if(u=(u=0|ar[y>>2])>>>0<(0|ar[B>>2])>>>0?(ar[y>>2]=u+1,0|cr[u>>0]):0|vi(A),!(0|tr[f+(u+1)>>0]))break t;switch(tr[R>>0]=u,0|Gi(n,R,1,i)){case-1:c=0,N=137;break e;case-2:break;default:break o}}d||(ar[a+(c<<2)>>2]=ar[n>>2],c=c+1|0)}while(!(o&(0|c)==(0|k)));if(!(u=0|Ec(a,(c=k<<1|1)<<2))){c=0,o=1,N=137;break e}w=k,k=c,a=u,c=w}if(!(0|(Y=i,1&(Y=(Y|=0)?0==(0|ar[Y>>2]):1)|0))){c=0,N=137;break e}u=c,c=0,k=a}else{if(o){if(!(c=0|yc(u))){a=c=0,o=1,N=137;break e}for(d=u,a=0;;){do{if(u=(u=0|ar[y>>2])>>>0<(0|ar[B>>2])>>>0?(ar[y>>2]=u+1,0|cr[u>>0]):0|vi(A),!(0|tr[f+(u+1)>>0])){u=a,a=k=0;break n}tr[c+a>>0]=u,a=a+1|0}while((0|a)!=(0|d));if(!(u=0|Ec(c,a=d<<1|1))){a=0,o=1,N=137;break e}w=d,d=a,c=u,a=w}}if(Z)for(u=0,c=d;;){if(a=(a=0|ar[y>>2])>>>0<c>>>0?(ar[y>>2]=a+1,0|cr[a>>0]):0|vi(A),!(0|tr[f+(a+1)>>0])){c=Z,a=k=0;break n}tr[Z+u>>0]=a,u=u+1|0,c=0|ar[B>>2]}else for(c=d;;){if(a=(a=0|ar[y>>2])>>>0<c>>>0?(ar[y>>2]=a+1,0|cr[a>>0]):0|vi(A),!(0|tr[f+(a+1)>>0])){a=k=c=u=0;break n}c=0|ar[B>>2]}}}while(0);if(0|ar[B>>2]?(d=(0|ar[y>>2])-1|0,ar[y>>2]=d):d=0|ar[y>>2],!(d=d-(0|ar[X>>2])+(0|ar[E>>2])|0)){N=139;break e}if(!((0|d)==(0|s)|1^m)){N=139;break e}do{if(o){if(h){ar[Z>>2]=k;break}ar[Z>>2]=c;break}}while(0);if(!m){if(0|k&&(ar[k+(u<<2)>>2]=0),!c){c=0;break f}tr[c+u>>0]=0}break;case 120:case 88:case 112:u=16,N=125;break;case 111:u=8,N=125;break;case 117:case 100:u=10,N=125;break;case 105:u=0,N=125;break;case 71:case 103:case 70:case 102:case 69:case 101:case 65:case 97:if(b=+Ri(A,w,0),(0|ar[E>>2])==((0|ar[X>>2])-(0|ar[y>>2])|0)){N=139;break e}if(Z)switch(0|w){case 0:gA[Z>>2]=b;break f;case 1:case 2:Q[Z>>3]=b;break f;default:break f}}}while(0);do{if(125==(0|N)){if(u=(N=0)|wi(A,u,0,-1,-1),(0|ar[E>>2])==((0|ar[X>>2])-(0|ar[y>>2])|0)){N=139;break e}if(g&112==(0|h)){ar[Z>>2]=u;break}Pi(Z,w,u,D);break}}while(0);e=(1&g)+e|0,u=(0|ar[E>>2])+v+(0|ar[y>>2])-(0|ar[X>>2])|0;break r}}while(0);if(l=l+(1&o)|0,nl(A,0),(0|(o=(o=0|ar[y>>2])>>>0<(0|ar[B>>2])>>>0?(ar[y>>2]=o+1,0|cr[o>>0]):0|vi(A)))!=(0|cr[l>>0])){N=22;break e}u=v+1|0}}while(0);if(!((o=0|tr[(l=l+1|0)>>0])<<24>>24))break A;v=u}if(22==(0|N)){if(0|ar[B>>2]&&(ar[y>>2]=(0|ar[y>>2])-1),0!=(0|e)|-1<(0|o))break;o=0,N=138}else 137==(0|N)?(o&=1,e||(N=138)):139==(0|N)&&(o&=1);138==(0|N)&&(e=-1),o&&(Bc(c),Bc(a))}else e=0}while(0);var Y;0|_&&Mc();return ur=t,0|e}(i,e,r),ur=f,0|t}function xi(A,e){A|=0,e|=0;var r,i,f=0;for(r=ur=(i=ur)+31&-32,ur=ur+16|0,ar[r>>2]=ar[A>>2];f=3+(0|ar[r>>2])&-4,A=0|ar[f>>2],ar[r>>2]=f+4,1<e>>>0;)e=e+-1|0;return ur=i,0|A}function Pi(A,e,r,i){A|=0,e|=0,r|=0,i|=0;A:do{if(0|A)switch(0|e){case-2:tr[A>>0]=r;break A;case-1:or[A>>1]=r;break A;case 0:case 1:ar[A>>2]=r;break A;case 3:ar[(e=A)>>2]=r,ar[e+4>>2]=i;break A;default:break A}}while(0)}function Li(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t=0,o=0;for(f=ur=(n=ur)+31&-32,ur=ur+128|0,o=(t=f)+124|0;(0|(t=t+4|(ar[t>>2]=0)))<(0|o););return ar[(t=4+f|0)>>2]=A,ar[(o=8+f|0)>>2]=-1,ar[44+f>>2]=A,ar[76+f>>2]=-1,nl(f,0),i=+Ri(f,r,1),r=(0|ar[t>>2])-(0|ar[o>>2])+(0|ar[108+f>>2])|0,0|e&&(ar[e>>2]=0|r?A+r|0:A),ur=n,+i}function Ki(A,e){return r=A|=0,i=e|=0,+ + + +Li(r|=0,i|=0,0);var r,i}function qi(A,e){return r=A|=0,i=e|=0,+ + + +Li(r|=0,i|=0,1);var r,i}function $i(A,e){return r=A|=0,i=e|=0,+ + + +Li(r|=0,i|=0,2);var r,i}function Af(A,e){return+ +Qi(A=+A,e|=0)}function ef(A){return 0|~~+pb(+(A=+A))}function rf(A){A|=0;var e;return e=0|ar[2622],0|A&&(ar[2622]=-1==(0|A)?58104:A),0|(58104==(0|e)?-1:e)}function ff(A,e){A|=0,e|=0;var r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0;b=ur=(i=ur)+31&-32,ur=ur+272|0,r=b+8|0;do{if(!(0|tr[e>>0])){if(0|(e=0|bA(52903))&&0|tr[e>>0])break;if(0|(e=0|bA(52910+(12*A|0)|0))&&0|tr[e>>0])break;if(0|(e=0|bA(52982))&&0|tr[e>>0])break;e=52987}}while(0);f=0;A:do{switch(0|tr[e+f>>0]){case 47:case 0:break A}f=f+1|0}while(f>>>0<15);15==(0|(u=(n=0|tr[e>>0])<<24>>24!=46&&0==(0|tr[e+f>>0])?n<<24>>24==67?15:(l=e,16):(e=52987,15)))&&(u=0|tr[e+1>>0]?(l=e,16):18);A:do{if(16==(0|u))if(0!=(0|Fc(l,52987))&&0!=(0|Fc(l,52995))){if(0|(e=0|ar[14543]))do{if(!(0|Fc(l,e+8|0)))break A;e=0|ar[e+24>>2]}while(0!=(0|e));C(58176),e=0|ar[14543];e:do{if(0|e){for(;0|Fc(l,e+8|0);)if(!(e=0|ar[e+24>>2]))break e;T(58176);break A}}while(0);e:do{if(0==(0|ar[14518])&&0!=(0|(t=0|bA(53001)))&&0!=(0|tr[t>>0])){for(a=254-f|0,c=f+1|0,n=t;;){if((t=(o=0|Nc(n,58))-n+(((e=0|tr[o>>0])<<24>>24!=0)<<31>>31)|0)>>>0<a>>>0){if(hb(0|r,0|n,0|t),tr[(n=r+t|0)>>0]=47,hb(n+1|0,0|l,0|f),(tr[r+(c+t)>>0]=0)|(t=0|G(0|r,0|b)))break;e=0|tr[o>>0]}if(!(0|tr[(n=o+(e<<24>>24!=0&1)|0)>>0])){u=41;break e}}if(e=0|yc(28),n=0|ar[b>>2],e){ar[e>>2]=t,ar[e+4>>2]=n,hb(0|(b=e+8|0),0|l,0|f),tr[b+f>>0]=0,ar[e+24>>2]=ar[14543],ar[14543]=e;break}Ei(t,n),u=41;break}u=41}while(0);41==(0|u)&&(e=0|yc(28))&&(ar[e>>2]=ar[2525],ar[e+4>>2]=ar[2526],hb(0|(b=e+8|0),0|l,0|f),tr[b+f>>0]=0,ar[e+24>>2]=ar[14543],ar[14543]=e),T(58176),e=0==(0|A)&0==(0|e)?10100:e}else e=l,u=18}while(0);do{if(18==(0|u)){if(0==(0|A)&&46==(0|tr[e+1>>0])){e=10100;break}e=0}}while(0);return ur=i,0|e}function nf(A){return 10148!=(0|(A|=0))&0!=(0|A)&58128!=(0|A)&1|0}function tf(A,e,r,i){return 0|(i|=0)}function of(A){0|nf(A|=0)&&Bc(A)}function af(A){return((A|=0)+-48|0)>>>0<10|0}function cf(){return-1}function lf(A){return 0|(e=A|=0,1&(((e|=0)-48|0)>>>0<10|((32|e)-97|0)>>>0<6)|0);var e}function uf(A,e){A|=0,e|=0;var r=0,i=0,f=0,n=0,t=0;do{if(-1!=(0|A)){if(f=-1<(0|ar[e+76>>2])?0|Jc():0,(r=0|ar[(n=e+4|0)>>2])?(i=r,r=0!=(0|f),t=7):(Zi(e),r=0!=(0|f),(i=0|ar[n>>2])?t=7:A=r),7==(0|t)){if(i>>>0>((0|ar[e+44>>2])-8|0)>>>0){if(t=i+-1|0,ar[n>>2]=t,tr[t>>0]=A,ar[e>>2]=-17&ar[e>>2],!r)break;Mc();break}A=r}A=(A&&Mc(),-1)}else A=-1}while(0);return 0|A}function bf(A){sf(A|=0)}function sf(A){ar[(A|=0)>>2]=14060,function(A,e){e|=0;var r,i,f=0,n=0;r=32+(A|=0)|0,i=A+36|0,f=0|ar[A+40>>2];for(;f;)n=f+-1|0,ns[127&ar[(0|ar[r>>2])+(n<<2)>>2]](e,A,0|ar[(0|ar[i>>2])+(n<<2)>>2]),f=n}(A,0),bn(A+28|0),Bc(0|ar[A+32>>2]),Bc(0|ar[A+36>>2]),Bc(0|ar[A+48>>2]),Bc(0|ar[A+60>>2])}function df(A){sf(A|=0)}function kf(A){ar[(A|=0)>>2]=14076,bn(A+4|0)}function hf(A){return 255&(A|=0)|0}function wf(A,e,r){return A|=0,e|=0,0|(r|=0)&&hb(0|A,0|e,0|r),0|A}function vf(A){return 255&(A|=0)|0}function mf(A){ar[(A|=0)>>2]=14140,bn(A+4|0)}function gf(A){return 0|(A|=0)}function Zf(A,e,r){return A|=0,e|=0,(r|=0)&&function(A,e,r){A|=0,e|=0;var i=0;if(0|(r|=0))for(i=A;r=r+-1|0,ar[i>>2]=ar[e>>2],r;)e=e+4|0,i=i+4|0}(A,e,r),0|A}function pf(A){return 0|(A|=0)}function yf(A){Ef(A|=0),bf(A+8|0)}function Bf(A){yf(A|=0),vu(A)}function Ef(){}function Xf(A){df((A|=0)+8|0)}function Wf(A){Xf(A|=0),vu(A)}function If(A){Gf(A|=0),bf(A+4|0)}function Cf(A){If(A|=0),vu(A)}function Gf(){}function Vf(A){df((A|=0)+4|0)}function Ff(A){Vf(A|=0),vu(A)}function Rf(A){_f(A|=0),bf(A+12|0)}function Nf(A){Rf(A|=0),vu(A)}function _f(){}function Yf(A){return 0|Vc(A|=0)}function Qf(A,e){e|=0,tr[(A|=0)>>0]=0|tr[e>>0]}function Df(A,e){e|=0,ar[(A|=0)+16>>2]=0==(0|ar[A+24>>2])|e}function Jf(A,e){e|=0;var r;for(ar[(A|=0)+24>>2]=e,ar[A+16>>2]=0==(0|e)&1,ar[A+20>>2]=0,ar[A+4>>2]=4098,ar[A+12>>2]=0,ar[A+8>>2]=6,r=A+28|0,A=(e=A+32|0)+40|0;(0|(e=e+4|(ar[e>>2]=0)))<(0|A););fu(r)}function Mf(A,e){return(0|(A|=0))==(0|(e|=0))|0}function Tf(A,e){ru(A|=0,(e|=0)+28|0)}function Uf(A,e){return(0|(A|=0))==(0|(e|=0))|0}function Sf(A){ar[(A|=0)>>2]=14076,fu(A+4|0),ar[(A=A+8|0)>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,ar[A+12>>2]=0,ar[A+16>>2]=0,ar[A+20>>2]=0}function Of(A){ar[(A|=0)>>2]=14140,fu(A+4|0),ar[(A=A+8|0)>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,ar[A+12>>2]=0,ar[A+16>>2]=0,ar[A+20>>2]=0}function zf(A,e){var r,i,f,n;e|=0,tr[(A|=0)>>0]=0,e=(ar[A+4>>2]=e)+(0|ar[(0|ar[e>>2])-12>>2])|0,0|ar[e+16>>2]||(0|(e=0|ar[e+72>>2])&&(r=e,i=ur=(f=ur)+31&-32,ur=ur+16|(n=0),0|ar[(r|=0)+(0|ar[(0|ar[r>>2])-12>>2])+24>>2]&&(zf(i,r),0|tr[i>>0]&&(n=0|ar[r+(0|ar[(0|ar[r>>2])-12>>2])+24>>2],-1==(0|jb[127&ar[24+(0|ar[n>>2])>>2]](n)))&&Df(n=r+(0|ar[(0|ar[r>>2])-12>>2])|0,1|ar[n+16>>2]),jf(i)),ur=f),tr[A>>0]=1)}function jf(A){var e=0;e=(e=0|ar[(A=(A|=0)+4|0)>>2])+(0|ar[(0|ar[e>>2])-12>>2])|0,0|ar[e+24>>2]&&0==(0|ar[e+16>>2])&&8192&ar[e+4>>2]|0&&!(0|E())&&(e=0|ar[A>>2],e=0|ar[e+(0|ar[(0|ar[e>>2])-12>>2])+24>>2],-1==(0|jb[127&ar[24+(0|ar[e>>2])>>2]](e)))&&Df(e=(e=0|ar[A>>2])+(0|ar[(0|ar[e>>2])-12>>2])|0,1|ar[e+16>>2])}function Hf(A,e){e|=0;var r,i,f,n,t=0,o=0,a=0,c=0,l=0;return f=ur=(n=ur)+31&-32,ur=ur+16|0,r=12+f|0,i=8+f|0,zf(f,A|=0),0|tr[f>>0]&&(Tf(r,A+(0|ar[(0|ar[A>>2])-12>>2])|0),o=0|un(r,59288),bn(r),a=A+(0|ar[(0|ar[A>>2])-12>>2])|0,c=0|ar[a+24>>2],t=0|Mf(l=-1,0|ar[(t=a+76|0)>>2])?(Tf(r,a),l=0|un(r,59232),l=0|Hb[31&ar[28+(0|ar[l>>2])>>2]](l,32),bn(r),l=l<<24>>24,ar[t>>2]=l):0|ar[t>>2],l=0|ar[12+(0|ar[o>>2])>>2],ar[i>>2]=c,ar[r>>2]=ar[i>>2],0|Kb[31&l](o,r,a,255&t,e)||Df(l=A+(0|ar[(0|ar[A>>2])-12>>2])|0,5|ar[l+16>>2])),jf(f),ur=n,0|A}function xf(A,e){e|=0;var r,i,f,n,t=0,o=0,a=0,c=0,l=0;return f=ur=(n=ur)+31&-32,ur=ur+16|0,r=12+f|0,i=8+f|0,zf(f,A|=0),0|tr[f>>0]&&(Tf(r,A+(0|ar[(0|ar[A>>2])-12>>2])|0),o=0|un(r,59288),bn(r),a=A+(0|ar[(0|ar[A>>2])-12>>2])|0,c=0|ar[a+24>>2],t=0|Mf(l=-1,0|ar[(t=a+76|0)>>2])?(Tf(r,a),l=0|un(r,59232),l=0|Hb[31&ar[28+(0|ar[l>>2])>>2]](l,32),bn(r),l=l<<24>>24,ar[t>>2]=l):0|ar[t>>2],l=0|ar[24+(0|ar[o>>2])>>2],ar[i>>2]=c,ar[r>>2]=ar[i>>2],0|Kb[31&l](o,r,a,255&t,65535&e)||Df(l=A+(0|ar[(0|ar[A>>2])-12>>2])|0,5|ar[l+16>>2])),jf(f),ur=n,0|A}function Pf(A,e){e|=0;var r,i,f,n,t=0,o=0,a=0,c=0,l=0;return f=ur=(n=ur)+31&-32,ur=ur+16|0,r=12+f|0,i=8+f|0,zf(f,A|=0),0|tr[f>>0]&&(Tf(r,A+(0|ar[(0|ar[A>>2])-12>>2])|0),o=0|un(r,59288),bn(r),a=A+(0|ar[(0|ar[A>>2])-12>>2])|0,c=0|ar[a+24>>2],t=0|Mf(l=-1,0|ar[(t=a+76|0)>>2])?(Tf(r,a),l=0|un(r,59232),l=0|Hb[31&ar[28+(0|ar[l>>2])>>2]](l,32),bn(r),l=l<<24>>24,ar[t>>2]=l):0|ar[t>>2],l=0|ar[16+(0|ar[o>>2])>>2],ar[i>>2]=c,ar[r>>2]=ar[i>>2],0|Kb[31&l](o,r,a,255&t,e)||Df(l=A+(0|ar[(0|ar[A>>2])-12>>2])|0,5|ar[l+16>>2])),jf(f),ur=n,0|A}function Lf(A,e){e|=0;var r,i,f,n,t=0,o=0,a=0,c=0,l=0;return f=ur=(n=ur)+31&-32,ur=ur+16|0,r=12+f|0,i=8+f|0,zf(f,A|=0),0|tr[f>>0]&&(Tf(r,A+(0|ar[(0|ar[A>>2])-12>>2])|0),o=0|un(r,59288),bn(r),a=A+(0|ar[(0|ar[A>>2])-12>>2])|0,c=0|ar[a+24>>2],t=0|Mf(l=-1,0|ar[(t=a+76|0)>>2])?(Tf(r,a),l=0|un(r,59232),l=0|Hb[31&ar[28+(0|ar[l>>2])>>2]](l,32),bn(r),l=l<<24>>24,ar[t>>2]=l):0|ar[t>>2],l=0|ar[24+(0|ar[o>>2])>>2],ar[i>>2]=c,ar[r>>2]=ar[i>>2],0|Kb[31&l](o,r,a,255&t,e)||Df(l=A+(0|ar[(0|ar[A>>2])-12>>2])|0,5|ar[l+16>>2])),jf(f),ur=n,0|A}function Kf(A,e,r){e|=0,r|=0;var i,f,n,t,o=0,a=0,c=0,l=0,u=0;return n=ur=(t=ur)+31&-32,ur=ur+16|0,i=12+n|0,f=8+n|0,zf(n,A|=0),0|tr[n>>0]&&(Tf(i,A+(0|ar[(0|ar[A>>2])-12>>2])|0),a=0|un(i,59288),bn(i),c=A+(0|ar[(0|ar[A>>2])-12>>2])|0,l=0|ar[c+24>>2],o=0|Mf(u=-1,0|ar[(o=c+76|0)>>2])?(Tf(i,c),u=0|un(i,59232),u=0|Hb[31&ar[28+(0|ar[u>>2])>>2]](u,32),bn(i),u=u<<24>>24,ar[o>>2]=u):0|ar[o>>2],u=0|ar[28+(0|ar[a>>2])>>2],ar[f>>2]=l,ar[i>>2]=ar[f>>2],0|$b[63&u](a,i,c,255&o,e,r)||Df(u=A+(0|ar[(0|ar[A>>2])-12>>2])|0,5|ar[u+16>>2])),jf(n),ur=t,0|A}function qf(A,e,r){e|=0,r|=0;var i,f;f=ur=(i=ur)+31&-32,ur=ur+16|0,Sf(A|=0),ar[A>>2]=14508,ar[A+32>>2]=e,ru(f,A+4|0),e=0|un(f,61024),bn(f),ar[A+36>>2]=e,ar[A+40>>2]=r,r=1&(0|jb[127&ar[28+(0|ar[e>>2])>>2]](e)),tr[A+44>>0]=r,ur=i}function $f(A,e,r){e|=0,r|=0;var i,f;f=ur=(i=ur)+31&-32,ur=ur+16|0,Of(A|=0),ar[A>>2]=14444,ar[A+32>>2]=e,ru(f,A+4|0),e=0|un(f,61032),bn(f),ar[A+36>>2]=e,ar[A+40>>2]=r,r=1&(0|jb[127&ar[28+(0|ar[e>>2])>>2]](e)),tr[A+44>>0]=r,ur=i}function An(A){mf(A|=0)}function en(A){kf(A|=0)}function rn(A){mf(A|=0)}function fn(A,e){e|=0;var r,i,f,n,t,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0;if(i=ur=(t=ur)+31&-32,ur=ur+32|0,f=16+i|0,k=8+i|0,r=4+i|0,n=(A|=0)+48|0,0|tr[(a=A+52|0)>>0])o=0|ar[n>>2],e&&(k=-1,ar[n>>2]=k,tr[a>>0]=0);else{for(o=1<(0|(o=0|ar[A+44>>2]))?o:1,d=A+32|0,a=0;;){if((0|o)<=(0|a)){s=9;break}if(-1==(0|(c=0|Wi(0|ar[d>>2])))){s=8;break}tr[f+a>>0]=c,a=a+1|0}if(8==(0|s))o=-1;else if(9==(0|s)){do{if(0|tr[A+53>>0])ar[k>>2]=tr[f>>0],s=19;else{b=A+40|0,l=A+36|0,u=k+4|0;A:for(;;){switch(h=0|ar[b>>2],a=0|ar[(c=h)>>2],c=0|ar[c+4>>2],w=0|ar[l>>2],A=f+o|0,0|es[15&ar[16+(0|ar[w>>2])>>2]](w,h,f,A,r,k,u,i)){case 3:s=16;break A;case 2:s=18;break A;case 1:break;default:break A}if(w=0|ar[b>>2],ar[w>>2]=a,ar[w+4>>2]=c,8==(0|o)){s=18;break}if(-1==(0|(a=0|Wi(0|ar[d>>2])))){s=18;break}tr[A>>0]=a,o=o+1|0}if(16==(0|s))ar[k>>2]=tr[f>>0];else if(18==(0|s)){o=-1;break}s=19}}while(0);A:do{if(19==(0|s)){e:do{if(!e){do{if((0|o)<=0)break e;w=0|gf(0|tr[f+(o=o+-1|0)>>0])}while(-1!=(0|uf(w,0|ar[d>>2])));o=-1;break A}w=0|gf(0|ar[k>>2]),ar[n>>2]=w}while(0);o=0|gf(0|ar[k>>2])}}while(0)}}return ur=t,0|o}function nn(A){kf(A|=0)}function tn(A,e){e|=0;var r,i,f,n,t,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0;if(i=ur=(t=ur)+31&-32,ur=ur+32|0,f=16+i|0,k=8+i|0,r=4+i|0,n=(A|=0)+48|0,0|tr[(a=A+52|0)>>0])o=0|ar[n>>2],e&&(k=-1,ar[n>>2]=k,tr[a>>0]=0);else{for(o=1<(0|(o=0|ar[A+44>>2]))?o:1,d=A+32|0,a=0;;){if((0|o)<=(0|a)){s=9;break}if(-1==(0|(c=0|Wi(0|ar[d>>2])))){s=8;break}tr[f+a>>0]=c,a=a+1|0}if(8==(0|s))o=-1;else if(9==(0|s)){do{if(0|tr[A+53>>0])tr[k>>0]=0|tr[f>>0],s=19;else{b=A+40|0,l=A+36|0,u=k+1|0;A:for(;;){switch(h=0|ar[b>>2],a=0|ar[(c=h)>>2],c=0|ar[c+4>>2],w=0|ar[l>>2],A=f+o|0,0|es[15&ar[16+(0|ar[w>>2])>>2]](w,h,f,A,r,k,u,i)){case 3:s=16;break A;case 2:s=18;break A;case 1:break;default:break A}if(w=0|ar[b>>2],ar[w>>2]=a,ar[w+4>>2]=c,8==(0|o)){s=18;break}if(-1==(0|(a=0|Wi(0|ar[d>>2])))){s=18;break}tr[A>>0]=a,o=o+1|0}if(16==(0|s))tr[k>>0]=0|tr[f>>0];else if(18==(0|s)){o=-1;break}s=19}}while(0);A:do{if(19==(0|s)){e:do{if(!e){do{if((0|o)<=0)break e;w=0|hf(0|tr[f+(o=o+-1|0)>>0])}while(-1!=(0|uf(w,0|ar[d>>2])));o=-1;break A}w=0|hf(0|tr[k>>0]),ar[n>>2]=w}while(0);o=0|hf(0|tr[k>>0])}}while(0)}}return ur=t,0|o}function on(A){an(A|=0)}function an(A){0}function cn(A){an()}function ln(A,e){e|=0,ar[(A|=0)>>2]=ar[e>>2]}function un(A,e){return e|=0,A=0|ar[(A|=0)>>2],0|(r=A,i=0|hn(e),i|=0,0|ar[(0|ar[8+(r|=0)>>2])+(i<<2)>>2]);var r,i}function bn(A){lu(0|ar[(A|=0)>>2])}function sn(A,e,r,i,f,n,t,o,a,c){A|=0,e|=0,r|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0;var l,u,b=0,s=0;u=(0|(l=0|ar[(i|=0)>>2]))==(0|r);do{if(u){if(!(b=(0|tr[c+24>>0])==A<<24>>24)&&(0|tr[c+25>>0])!=A<<24>>24){s=5;break}ar[i>>2]=r+1,tr[r>>0]=b?43:45,b=ar[f>>2]=0}else s=5}while(0);A:do{if(5==(0|s)){if(s=0|tr[t+11>>0],A<<24>>24==n<<24>>24&&0!=(0|(s<<24>>24<0?0|ar[t+4>>2]:255&s))){if(160<=((b=0|ar[a>>2])-o|0)){b=0;break}i=0|ar[f>>2],ar[a>>2]=b+4,ar[b>>2]=i,b=ar[f>>2]=0;break}for(t=c+26|0,n=0;;){if(b=c+n|0,26==(0|n)){b=t;break}if((0|tr[b>>0])==A<<24>>24)break;n=n+1|0}if(23<(0|(b=b-c|0)))b=-1;else{switch(n=53648+b|0,0|e){case 10:case 8:if((0|e)<=(0|b)){b=-1;break A}break;case 16:if(22<=(0|b)){if(u){b=-1;break A}if(3<=(l-r|0)){b=-1;break A}if(48!=(0|tr[l-1>>0])){b=-1;break A}b=(ar[f>>2]=0)|tr[n>>0],ar[i>>2]=1+l,tr[l>>0]=b,b=0;break A}}b=0|tr[n>>0],ar[i>>2]=1+l,tr[l>>0]=b,ar[f>>2]=1+(0|ar[f>>2]),b=0}}}while(0);return 0|b}function dn(){var A=0;return 0==(0|tr[56624])&&0|ib(56624)&&(A=0|function(A,e,r){A|=0,e|=0,r|=0;var i,f,n=0,t=0,o=0,a=0;i=ur=(f=ur)+31&-32,ur=ur+32|0;A:do{if(0|nf(r))for(n=0;1<<n&A|0&&(a=0|ff(n,e),ar[r+(n<<2)>>2]=a),6!=(0|(n=n+1|0)););else{for(a=0==(0|r),o=t=0;t=(0!=(0|(n=a|(n=0!=(1<<o&A|0))?0|ff(o,n?e:79659):0|ar[r+(o<<2)>>2]))&1)+t|0,ar[i+(o<<2)>>2]=n,6!=(0|(o=o+1|0)););switch(0|t){case 0:r=58128;break A;case 1:if(10100!=(0|ar[i>>2]))break;r=10148;break A}}}while(0);return ur=f,0|r}(2147483647,53684,0),ar[14810]=A),0|ar[14810]}function kn(A,e,r,i){A|=0,e|=0,r|=0,i|=0;var f,n;return n=ur=(f=ur)+31&-32,ur=ur+16|0,ar[n>>2]=i,i=0|rf(e),e=0|Hi(A,r,n),0|i&&rf(i),ur=f,0|e}function hn(A){A|=0;var e,r,i,f,n=0;return n=ur=(f=ur)+31&-32,ur=ur+48|0,e=n+32|0,r=n+24|0,ar[(n=(i=n)+16|0)>>2]=442,ar[n+4>>2]=0,ar[e>>2]=ar[n>>2],ar[4+e>>2]=ar[n+4>>2],function(A,e,r){A|=0,r|=0;var i;i=0|ar[(e=e|0)>>2],e=0|ar[e+4>>2],ar[A>>2]=r,ar[A+4>>2]=i,ar[A+8>>2]=e}(i,e,A),-1!=(0|ar[A>>2])&&(ar[e>>2]=i,ar[r>>2]=e,function(A,e,r){A|=0,e|=0,r|=0,gb();for(;1==(0|ar[A>>2]);)hA(61100,61072);0|ar[A>>2]?Zb():(ar[A>>2]=1,Zb(),is[511&r](e),gb(),ar[A>>2]=-1,Zb(),mb())}(A,r,443)),ur=f,(0|ar[A+4>>2])-1|0}function wn(A,e,r,i,f){A|=0,r|=0,i|=0,f|=0;var n,t;t=ur=(n=ur)+31&-32,ur=ur+16|0,Tf(t,e|=0),e=0|un(t,59232),Pb[7&ar[32+(0|ar[e>>2])>>2]](e,53648,53680,r),r=0|un(t,59248),e=0|jb[127&ar[12+(0|ar[r>>2])>>2]](r),tr[i>>0]=e,i=0|jb[127&ar[16+(0|ar[r>>2])>>2]](r),tr[f>>0]=i,fs[63&ar[20+(0|ar[r>>2])>>2]](A,r),bn(t),ur=n}function vn(A,e,r,i,f,n,t,o,a,c,l,u){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,c|=0,l|=0,u|=0;var b,s=0,d=0;b=a|=0;A:do{if(A<<24>>24==n<<24>>24)a=0|tr[e>>0]?(r=(tr[e>>0]=0)|ar[f>>2],ar[f>>2]=r+1,tr[r>>0]=46,0!=(0|((f=0|tr[o+11>>0])<<24>>24<0?0|ar[o+4>>2]:255&f))&&((s=0|ar[c>>2])-b|0)<160&&(a=0|ar[l>>2],ar[c>>2]=s+4,ar[s>>2]=a),0):-1;else{if(A<<24>>24==t<<24>>24&&0|((t=0|tr[o+11>>0])<<24>>24<0?0|ar[o+4>>2]:255&t)){if(!(0|tr[e>>0])){a=-1;break}if(160<=((a=0|ar[c>>2])-b|0)){a=0;break}f=0|ar[l>>2],ar[c>>2]=a+4,ar[a>>2]=f,a=ar[l>>2]=0;break}for(n=u+32|0,s=0;;){if(a=u+s|0,32==(0|s)){a=n;break}if((0|tr[a>>0])==A<<24>>24)break;s=s+1|0}if(31<(0|(s=a-u|0)))a=-1;else switch(n=0|tr[53648+s>>0],0|s){case 24:case 25:if((0|(a=0|ar[f>>2]))!=(0|i)&&(95&tr[a+-1>>0])!=(127&tr[r>>0])){a=-1;break A}ar[f>>2]=a+1,tr[a>>0]=n,a=0;break A;case 23:case 22:tr[r>>0]=80,a=0|ar[f>>2],ar[f>>2]=a+1,tr[a>>0]=n,a=0;break A;default:if((0|(a=95&n))==(0|tr[r>>0])&&(tr[r>>0]=128|a,0|tr[e>>0])&&(tr[e>>0]=0)|((r=0|tr[o+11>>0])<<24>>24<0?0|ar[o+4>>2]:255&r)&&((d=0|ar[c>>2])-b|0)<160&&(r=0|ar[l>>2],ar[c>>2]=d+4,ar[d>>2]=r),c=0|ar[f>>2],ar[f>>2]=c+1,tr[c>>0]=n,21<(0|s)){a=0;break A}ar[l>>2]=1+(0|ar[l>>2]),a=0;break A}}}while(0);return 0|a}function mn(A,e,r){r|=0;var i,f,n=0,t=0,o=0;return i=ur=(f=ur)+31&-32,ur=ur+16|0,(0|(A|=0))==(0|(e|=0))?(ar[r>>2]=4,n=0):(t=0|ar[(t=10364)>>2],ar[10364>>2]=0,n=+$i(A,i,dn()),(A=0|ar[(A=10364)>>2])||(ar[10364>>2]=t),(0|ar[i>>2])==(0|e)?34==(0|A)&&(o=6):(n=0,o=6),6==(0|o)&&(ar[r>>2]=4)),ur=f,+n}function gn(A,e,r,i){e|=0,r|=0,i|=0;var f,n=0,t=0,o=0,a=0,c=0,l=0;f=(a=0|tr[(A|=0)+11>>0])<<24>>24<0,n=0|ar[(o=A+4|0)>>2],a&=255;do{if(0|(f?n:a)){if((0|e)!=(0|r)){for(n=r,t=e;!((n=n+-4|0)>>>0<=t>>>0);)l=0|ar[t>>2],ar[t>>2]=ar[n>>2],ar[n>>2]=l,t=t+4|0;n=0|ar[o>>2]}for(r=r+-4|0,A=(l=f?0|ar[A>>2]:A)+(f?n:a)|0,n=l;o=0<(t=0|tr[n>>0])<<24>>24&t<<24>>24!=127,!(r>>>0<=e>>>0);){if(o&&(t<<24>>24|0)!=(0|ar[e>>2])){c=10;break}e=e+4|0,n=1<(A-n|0)?n+1|0:n}if(10==(0|c)){ar[i>>2]=4;break}o&&((0|ar[r>>2])-1|0)>>>0>=t<<24>>24>>>0&&(ar[i>>2]=4)}}while(0)}function Zn(A,e,r){r|=0;var i,f,n=0,t=0,o=0;return i=ur=(f=ur)+31&-32,ur=ur+16|0,(0|(A|=0))==(0|(e|=0))?(ar[r>>2]=4,n=0):(t=0|ar[(t=10364)>>2],ar[10364>>2]=0,n=+qi(A,i,dn()),(A=0|ar[(A=10364)>>2])||(ar[10364>>2]=t),(0|ar[i>>2])==(0|e)?34==(0|A)&&(o=6):(n=0,o=6),6==(0|o)&&(ar[r>>2]=4)),ur=f,+n}function pn(A,e,r){r|=0;var i,f,n=0,t=0,o=0;return i=ur=(f=ur)+31&-32,ur=ur+16|0,(0|(A|=0))==(0|(e|=0))?(ar[r>>2]=4,n=0):(t=0|ar[(t=10364)>>2],ar[10364>>2]=0,n=+Ki(A,i,dn()),(A=0|ar[(A=10364)>>2])||(ar[10364>>2]=t),(0|ar[i>>2])==(0|e)?34==(0|A)&&(o=6):(n=0,o=6),6==(0|o)&&(ar[r>>2]=4)),ur=f,+n}function yn(A){switch(74&ar[(A|=0)+4>>2]){case 64:A=8;break;case 8:A=16;break;case 0:A=0;break;default:A=10}return 0|A}function Bn(A,e,r,i){A|=0,r|=0,i|=0;var f,n;n=ur=(f=ur)+31&-32,ur=ur+16|0,Tf(n,e|=0),e=0|un(n,59232),Pb[7&ar[32+(0|ar[e>>2])>>2]](e,53648,53674,r),r=0|un(n,59248),e=0|jb[127&ar[16+(0|ar[r>>2])>>2]](r),tr[i>>0]=e,fs[63&ar[20+(0|ar[r>>2])>>2]](A,r),bn(n),ur=f}function En(A,e,r,i){A|=0,e|=0,r|=0,i|=0;var f,n,t=0,o=0,a=0;f=ur=(n=ur)+31&-32,ur=ur+16|0;do{if((0|A)==(0|e))ar[r>>2]=4,A=i=0;else{if(45==(0|tr[A>>0])){ar[r>>2]=4,A=i=0;break}o=0|ar[(o=10364)>>2],A=(ar[(t=10364)>>2]=0)|il(A,f,i,dn()),i=D,(t=0|ar[(t=10364)>>2])||(ar[10364>>2]=o),(0|ar[f>>2])==(0|e)?34==(0|t)&&(i=A=-1,a=8):(i=A=0,a=8),8==(0|a)&&(ar[r>>2]=4)}}while(0);return D=i,ur=n,0|A}function Xn(A,e,r,i){A|=0,e|=0,r|=0,i|=0;var f,n,t=0,o=0;f=ur=(n=ur)+31&-32,ur=ur+16|0;do{if((0|A)==(0|e))ar[r>>2]=4,A=0;else{if(45==(0|tr[A>>0])){ar[r>>2]=4,A=0;break}o=0|ar[(o=10364)>>2],A=(ar[(t=10364)>>2]=0)|il(A,f,i,dn()),i=D,(t=0|ar[(t=10364)>>2])||(ar[10364>>2]=o);do{if((0|ar[f>>2])==(0|e)){if(0<i>>>0|0==(0|i)&4294967295<A>>>0|34==(0|t)){ar[r>>2]=4,A=-1;break}break}ar[r>>2]=4,A=0}while(0)}}while(0);return ur=n,0|A}function Wn(A,e,r,i){A|=0,e|=0,r|=0,i|=0;var f,n,t=0,o=0;f=ur=(n=ur)+31&-32,ur=ur+16|0;do{if((0|A)==(0|e))ar[r>>2]=4,A=0;else{if(45==(0|tr[A>>0])){ar[r>>2]=4,A=0;break}o=0|ar[(o=10364)>>2],A=(ar[(t=10364)>>2]=0)|il(A,f,i,dn()),i=D,(t=0|ar[(t=10364)>>2])||(ar[10364>>2]=o);do{if((0|ar[f>>2])==(0|e)){if(0<i>>>0|0==(0|i)&4294967295<A>>>0|34==(0|t)){ar[r>>2]=4,A=-1;break}break}ar[r>>2]=4,A=0}while(0)}}while(0);return ur=n,0|A}function In(A,e,r,i){A|=0,e|=0,r|=0,i|=0;var f,n,t=0,o=0;f=ur=(n=ur)+31&-32,ur=ur+16|0;do{if((0|A)==(0|e))ar[r>>2]=4,A=0;else{if(45==(0|tr[A>>0])){ar[r>>2]=4,A=0;break}o=0|ar[(o=10364)>>2],A=(ar[(t=10364)>>2]=0)|il(A,f,i,dn()),i=D,(t=0|ar[(t=10364)>>2])||(ar[10364>>2]=o);do{if((0|ar[f>>2])==(0|e)){if(0<i>>>0|0==(0|i)&65535<A>>>0|34==(0|t)){ar[r>>2]=4,A=-1;break}A&=65535;break}ar[r>>2]=4,A=0}while(0)}}while(0);return ur=n,0|A}function Cn(A,e,r,i){r|=0,i|=0;var f,n,t=0,o=0;return f=ur=(n=ur)+31&-32,ur=ur+16|0,(0|(A|=0))==(0|(e|=0))?(ar[r>>2]=4,A=i=0):(o=0|ar[(o=10364)>>2],A=(ar[(t=10364)>>2]=0)|pi(A,f,i,dn()),i=D,(t=0|ar[(t=10364)>>2])||(ar[10364>>2]=o),(0|ar[f>>2])==(0|e)?34==(0|t)&&(ar[r>>2]=4,A=(i=0<(0|i)|0==(0|i)&0<A>>>0)?-1:0,i=i?2147483647:-2147483648):(ar[r>>2]=4,i=A=0)),D=i,ur=n,0|A}function Gn(A,e,r,i){r|=0,i|=0;var f,n,t=0,o=0;if(f=ur=(n=ur)+31&-32,ur=ur+16|0,(0|(A|=0))==(0|(e|=0)))ar[r>>2]=4,A=0;else{o=0|ar[(o=10364)>>2],A=(ar[(t=10364)>>2]=0)|pi(A,f,i,dn()),i=D,(t=0|ar[(t=10364)>>2])||(ar[10364>>2]=o);A:do{if((0|ar[f>>2])==(0|e)){do{if(34!=(0|t)){if((0|i)<-1|-1==(0|i)&A>>>0<2147483648){ar[r>>2]=4;break}if(0<(0|i)|0==(0|i)&2147483647<A>>>0){ar[r>>2]=4,A=2147483647;break A}break A}if(ar[r>>2]=4,0<(0|i)|0==(0|i)&0<A>>>0){A=2147483647;break A}}while(0);A=-2147483648}else ar[r>>2]=4,A=0}while(0)}return ur=n,0|A}function Vn(A,e,r,i,f,n,t){A|=0,e|=0,f|=0,n|=0,t|=0;var o,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0;for(c=ur=(o=ur)+31&-32,ur=ur+112|0,100<(l=((i|=0)-(r|=0)|0)/12|0)>>>0?(c=0|yc(l))?g=a=c:gu():(a=c,g=0),b=r,s=a,c=0;(0|b)!=(0|i);)(u=0|tr[b+11>>0])<<24>>24<0?u=0|ar[b+4>>2]:u&=255,u?tr[s>>0]=1:(tr[s>>0]=2,l=l+-1|0,c=c+1|0),b=b+12|0,s=s+1|0;m=0,w=c;A:for(;;){c=0|ar[A>>2];do{if(c){if(0|Mf(c=(0|(u=0|ar[c+12>>2]))==(0|ar[c+16>>2])?0|jb[127&ar[36+(0|ar[c>>2])>>2]](c):0|hf(0|tr[u>>0]),-1)){ar[A>>2]=0,s=1;break}s=0==(0|ar[A>>2]);break}s=1}while(0);if(c=(u=0|ar[e>>2])?0|Mf(c=(0|(c=0|ar[u+12>>2]))==(0|ar[u+16>>2])?0|jb[127&ar[36+(0|ar[u>>2])>>2]](u):0|hf(0|tr[c>>0]),-1)?(u=ar[e>>2]=0,1):0:(u=0,1),b=0|ar[A>>2],!(0!=(0|l)&(s^c)))break;for(c=(0|(c=0|ar[b+12>>2]))==(0|ar[b+16>>2])?0|jb[127&ar[36+(0|ar[b>>2])>>2]](b):0|hf(0|tr[c>>0]),c&=255,t||(c=0|Hb[31&ar[12+(0|ar[f>>2])>>2]](f,c)),v=m+1|0,k=r,d=0,h=a;(0|k)!=(0|i);){do{if(1==(0|tr[h>>0])){if(u=(0|tr[(b=k+11|0)>>0])<0?0|ar[k>>2]:k,u=0|tr[u+m>>0],t||(u=0|Hb[31&ar[12+(0|ar[f>>2])>>2]](f,u)),s=l+-1|0,c<<24>>24!=u<<24>>24){tr[h>>0]=0,u=d,b=w,l=s;break}(u=0|tr[b>>0])<<24>>24<0?u=0|ar[k+4>>2]:u&=255,(0|u)==(0|v)?(tr[h>>0]=2,b=w+(u=1)|0,l=s):(u=1,b=w)}else u=d,b=w}while(0);k=k+12|0,d=u,h=h+1|0,w=b}if(d)if(c=0|ar[A>>2],(0|(b=0|ar[(u=c+12|0)>>2]))==(0|ar[c+16>>2])?jb[127&ar[40+(0|ar[c>>2])>>2]](c):(ar[u>>2]=b+1,hf(0|tr[b>>0])),1<(w+l|0)>>>0)for(b=r,s=a,c=w;;){if((0|b)==(0|i)){m=v,w=c;continue A}2==(0|tr[s>>0])&&((u=0|tr[b+11>>0])<<24>>24<0?u=0|ar[b+4>>2]:u&=255,(0|u)!=(0|v)&&(c=c+-1|(tr[s>>0]=0))),b=b+12|0,s=s+1|0}else m=v;else m=v}do{if(b){if(0|Mf(c=(0|(c=0|ar[b+12>>2]))==(0|ar[b+16>>2])?0|jb[127&ar[36+(0|ar[b>>2])>>2]](b):0|hf(0|tr[c>>0]),-1)){ar[A>>2]=0,l=1;break}l=0==(0|ar[A>>2]);break}l=1}while(0);do{if(u){if(0|Mf(c=(0|(c=0|ar[u+12>>2]))==(0|ar[u+16>>2])?0|jb[127&ar[36+(0|ar[u>>2])>>2]](u):0|hf(0|tr[c>>0]),-1)){ar[e>>2]=0,Z=41;break}if(l)break;Z=77;break}Z=41}while(0);for(41==(0|Z)&&l&&(Z=77),77==(0|Z)&&(ar[n>>2]=2|ar[n>>2]);;){if((0|r)==(0|i)){Z=81;break}if(2==(0|tr[a>>0]))break;r=r+12|0,a=a+1|0}return 81==(0|Z)&&(ar[n>>2]=4|ar[n>>2],r=i),Bc(g),ur=o,0|r}function Fn(A,e,r,i,f,n,t,o,a,c){A|=0,e|=0,r|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0;var l,u,b=0,s=0;u=(0|(l=0|ar[(i|=0)>>2]))==(0|r);do{if(u){if(!(b=(0|ar[c+96>>2])==(0|A))&&(0|ar[c+100>>2])!=(0|A)){s=5;break}ar[i>>2]=r+1,tr[r>>0]=b?43:45,b=ar[f>>2]=0}else s=5}while(0);A:do{if(5==(0|s)){if(s=0|tr[t+11>>0],(0|A)==(0|n)&&0!=(0|(s<<24>>24<0?0|ar[t+4>>2]:255&s))){if(160<=((b=0|ar[a>>2])-o|0)){b=0;break}i=0|ar[f>>2],ar[a>>2]=b+4,ar[b>>2]=i,b=ar[f>>2]=0;break}for(t=c+104|0,n=0;;){if(b=c+(n<<2)|0,26==(0|n)){b=t;break}if((0|ar[b>>2])==(0|A))break;n=n+1|0}if(n=(b=b-c|0)>>2,92<(0|b))b=-1;else{switch(t=53648+n|0,0|e){case 10:case 8:if((0|e)<=(0|n)){b=-1;break A}break;case 16:if(88<=(0|b)){if(u){b=-1;break A}if(3<=(l-r|0)){b=-1;break A}if(48!=(0|tr[l-1>>0])){b=-1;break A}b=(ar[f>>2]=0)|tr[t>>0],ar[i>>2]=1+l,tr[l>>0]=b,b=0;break A}}b=0|tr[t>>0],ar[i>>2]=1+l,tr[l>>0]=b,ar[f>>2]=1+(0|ar[f>>2]),b=0}}}while(0);return 0|b}function Rn(A,e,r,i,f){A|=0,r|=0,i|=0,f|=0;var n,t;t=ur=(n=ur)+31&-32,ur=ur+16|0,Tf(t,e|=0),e=0|un(t,59264),Pb[7&ar[48+(0|ar[e>>2])>>2]](e,53648,53680,r),r=0|un(t,59272),e=0|jb[127&ar[12+(0|ar[r>>2])>>2]](r),ar[i>>2]=e,i=0|jb[127&ar[16+(0|ar[r>>2])>>2]](r),ar[f>>2]=i,fs[63&ar[20+(0|ar[r>>2])>>2]](A,r),bn(t),ur=n}function Nn(A,e,r,i,f,n,t,o,a,c,l,u){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,c|=0,l|=0,u|=0;var b,s=0,d=0;b=a|=0;A:do{if((0|A)==(0|n))a=0|tr[e>>0]?(r=(tr[e>>0]=0)|ar[f>>2],ar[f>>2]=r+1,tr[r>>0]=46,0!=(0|((f=0|tr[o+11>>0])<<24>>24<0?0|ar[o+4>>2]:255&f))&&((s=0|ar[c>>2])-b|0)<160&&(a=0|ar[l>>2],ar[c>>2]=s+4,ar[s>>2]=a),0):-1;else{if((0|A)==(0|t)&&0|((t=0|tr[o+11>>0])<<24>>24<0?0|ar[o+4>>2]:255&t)){if(!(0|tr[e>>0])){a=-1;break}if(160<=((a=0|ar[c>>2])-b|0)){a=0;break}f=0|ar[l>>2],ar[c>>2]=a+4,ar[a>>2]=f,a=ar[l>>2]=0;break}for(n=u+128|0,s=0;;){if(a=u+(s<<2)|0,32==(0|s)){a=n;break}if((0|ar[a>>2])==(0|A))break;s=s+1|0}if(a=(s=a-u|0)>>2,(0|s)<=124){switch(n=0|tr[53648+a>>0],0|a){case 24:case 25:if((0|(a=0|ar[f>>2]))!=(0|i)&&(95&tr[a+-1>>0])!=(127&tr[r>>0])){a=-1;break A}ar[f>>2]=a+1,tr[a>>0]=n,a=0;break A;case 23:case 22:tr[r>>0]=80;break;default:(0|(a=95&n))==(0|tr[r>>0])&&(tr[r>>0]=128|a,0|tr[e>>0])&&(tr[e>>0]=0)|((r=0|tr[o+11>>0])<<24>>24<0?0|ar[o+4>>2]:255&r)&&((d=0|ar[c>>2])-b|0)<160&&(r=0|ar[l>>2],ar[c>>2]=d+4,ar[d>>2]=r)}c=0|ar[f>>2],ar[f>>2]=c+1,tr[c>>0]=n,a=(84<(0|s)||(ar[l>>2]=1+(0|ar[l>>2])),0)}else a=-1}}while(0);return 0|a}function _n(A,e,r,i){A|=0,r|=0,i|=0;var f,n;n=ur=(f=ur)+31&-32,ur=ur+16|0,Tf(n,e|=0),e=0|un(n,59264),Pb[7&ar[48+(0|ar[e>>2])>>2]](e,53648,53674,r),r=0|un(n,59272),e=0|jb[127&ar[16+(0|ar[r>>2])>>2]](r),ar[i>>2]=e,fs[63&ar[20+(0|ar[r>>2])>>2]](A,r),bn(n),ur=f}function Yn(A){gb(A|=0)}function Qn(A){Zb(A|=0)}function Dn(A){ar[(A|=0)>>2]=0,pA(A+4|0,0),dA(A+32|0,0)}function Jn(A){ZA((A|=0)+4|0),sA(A+32|0)}function Mn(A,e){e|=0;var r,i=0;if(!((0|ar[(A|=0)>>2])>=(0|e))){if(gb(r=A+4|0),(0|ar[A>>2])<(0|e))for(i=A+32|0;hA(0|i,0|r),(0|ar[A>>2])<(0|e););Zb()}}function Tn(A,e){e|=0;var r;gb(r=(A|=0)+4|0),(0|ar[A>>2])>=(0|e)||(ar[A>>2]=e,mb()),Zb()}function Un(A,e){e|=0;var r;gb(r=(A|=0)+4|0),ar[A>>2]=(0|ar[A>>2])+e,mb(),Zb()}function Sn(A,e){e|=0;var r,i,f,n,t=0,o=0,a=0,c=0;gb(n=(A|=0)+420|0),0|tr[A>>0]||(t=0|ar[(i=A+8|0)>>2],c=(0|ar[A+12>>2])-t|0,a=0|ar[(o=A+20|0)>>2],(0|(0==(0|c)?0:(c<<8)-1|0))==((r=0|ar[(f=A+24|0)>>2])+a|0)?(function(A){var e=0,r=0,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;if(ur=(s=ur)+32|0,c=s+4|0,a=s,1023<(r=0|ar[(e=16+(A|=0)|0)>>2])>>>0){ar[e>>2]=r+-1024,c=0|ar[(l=A+4|0)>>2],b=0|ar[c>>2],c=c+4|0,ar[l>>2]=c,o=0|ar[(u=A+8|0)>>2],t=0|ar[(a=A+12|0)>>2],e=t,n=o;do{if((0|o)==(0|t)){if(r=0|ar[A>>2],(i=r)>>>0<c>>>0){f=(e=c)+((i=(1+(e-i>>2)|0)/-2|0)<<2)|0,e=(r=(e=n-e|0)>>2)?(wb(0|f,0|c,0|e),0|ar[l>>2]):c,A=f+(r<<2)|0,ar[u>>2]=A,ar[l>>2]=e+(i<<2),e=A;break}if(1073741823<(e=0==(0|(e=e-i>>1))?1:e)>>>0&&(Zu(s=0|X(8),44519),ar[s>>2]=17660,I(0|s,4016,428)),f=0|hu(e<<2),t=i=(n=f)+(e>>>2<<2)|0,f=f+(e<<2)|0,(0|c)==(0|o))e=t;else{for(e=t,r=c;ar[i>>2]=ar[r>>2],e=i=e+4|0,(0|(r=r+4|0))!=(0|o););r=0|ar[A>>2]}ar[A>>2]=n,ar[l>>2]=t,ar[u>>2]=e,ar[a>>2]=f,r&&(vu(r),e=0|ar[u>>2])}else e=o}while(0);return ar[e>>2]=b,ar[u>>2]=4+(0|ar[u>>2]),ur=s}if(e=0|ar[(b=A+8|0)>>2],f=e-(0|ar[(u=A+4|0)>>2])|0,r=0|ar[(l=A+12|0)>>2],i=r-(0|ar[A>>2])|0,i>>>0<=f>>>0){for(e=0==(0|(e=i>>1))?1:e,ar[c+12>>2]=0,ar[c+16>>2]=A+12,1073741823<e>>>0&&(Zu(s=0|X(8),44519),ar[s>>2]=17660,I(0|s,4016,428)),i=0|hu(e<<2),ar[c>>2]=i,t=i+(f>>2<<2)|0,ar[(o=c+8|0)>>2]=t,ar[(n=c+4|0)>>2]=t,ar[(t=c+12|0)>>2]=i+(e<<2),f=0|hu(4096),ar[a>>2]=f,function(A,e){e|=0;var r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0;r=0|ar[(b=8+(A|=0)|0)>>2],u=0|ar[(i=A+12|0)>>2],t=u,a=r;do{if((0|r)==(0|u)){if(l=0|ar[(u=A+4|0)>>2],n=0|ar[A>>2],(f=n)>>>0<l>>>0){o=(n=l)+((t=(1+(n-f>>2)|0)/-2|0)<<2)|0,f=(n=(f=a-n|0)>>2)?(wb(0|o,0|l,0|f),0|ar[u>>2]):l,l=o+(n<<2)|0,ar[b>>2]=l,ar[u>>2]=f+(t<<2),f=l;break}if(1073741823<(f=0==(0|(f=t-f>>1))?1:f)>>>0&&(Zu(b=0|X(8),44519),ar[b>>2]=17660,I(0|b,4016,428)),o=0|hu(f<<2),c=t=(a=o)+(f>>>2<<2)|0,o=o+(f<<2)|0,(0|l)==(0|r))f=c;else{for(f=c,n=l;ar[t>>2]=ar[n>>2],f=t=f+4|0,(0|(n=n+4|0))!=(0|r););n=0|ar[A>>2]}ar[A>>2]=a,ar[u>>2]=c,ar[b>>2]=f,ar[i>>2]=o,n&&(vu(n),f=0|ar[b>>2])}else f=r}while(0);ar[f>>2]=ar[e>>2],ar[b>>2]=4+(0|ar[b>>2])}(c,a),f=0|ar[b>>2];e=0|ar[u>>2],(0|f)!=(0|e);)On(c,a=f+-4|0),f=a;return r=e,i=0|ar[A>>2],ar[A>>2]=ar[c>>2],ar[c>>2]=i,ar[u>>2]=ar[n>>2],ar[n>>2]=r,e=0|ar[b>>2],ar[b>>2]=ar[o>>2],ar[o>>2]=e,A=0|ar[l>>2],ar[l>>2]=ar[t>>2],ar[t>>2]=A,(0|e)!=(0|f)&&(ar[o>>2]=e+(~((e+-4-r|0)>>>2)<<2)),0|i&&vu(i),ur=s}if((0|r)!=(0|e))return b=0|hu(4096),ar[c>>2]=b,function(A,e){e|=0;var r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0;r=0|ar[(b=8+(A|=0)|0)>>2],u=0|ar[(i=A+12|0)>>2],t=u,a=r;do{if((0|r)==(0|u)){if(l=0|ar[(u=A+4|0)>>2],n=0|ar[A>>2],(f=n)>>>0<l>>>0){o=(n=l)+((t=(1+(n-f>>2)|0)/-2|0)<<2)|0,f=(n=(f=a-n|0)>>2)?(wb(0|o,0|l,0|f),0|ar[u>>2]):l,l=o+(n<<2)|0,ar[b>>2]=l,ar[u>>2]=f+(t<<2),f=l;break}if(1073741823<(f=0==(0|(f=t-f>>1))?1:f)>>>0&&(Zu(b=0|X(8),44519),ar[b>>2]=17660,I(0|b,4016,428)),o=0|hu(f<<2),c=t=(a=o)+(f>>>2<<2)|0,o=o+(f<<2)|0,(0|l)==(0|r))f=c;else{for(f=c,n=l;ar[t>>2]=ar[n>>2],f=t=f+4|0,(0|(n=n+4|0))!=(0|r););n=0|ar[A>>2]}ar[A>>2]=a,ar[u>>2]=c,ar[b>>2]=f,ar[i>>2]=o,n&&(vu(n),f=0|ar[b>>2])}else f=r}while(0);ar[f>>2]=ar[e>>2],ar[b>>2]=4+(0|ar[b>>2])}(A,c),ur=s;a=0|hu(4096),ar[c>>2]=a,function(A,e){e|=0;var r,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;r=0|ar[(s=4+(A|=0)|0)>>2],b=0|ar[A>>2],n=b;do{if((0|r)==(0|b)){if(f=0|ar[(b=A+8|0)>>2],l=0|ar[(u=A+12|0)>>2],f>>>0<(i=l)>>>0){t=(i=(n=f)+((o=(1+(i-n>>2)|0)/2|0)<<2)|0)+(0-(u=(n=n-r|0)>>2)<<2)|0,u&&(wb(0|t,0|r,0|n),i=t,f=0|ar[b>>2]),ar[s>>2]=i,ar[b>>2]=f+(o<<2);break}if(1073741823<(n=0==(0|(n=i-n>>1))?1:n)>>>0&&(Zu(s=0|X(8),44519),ar[s>>2]=17660,I(0|s,4016,428)),a=0|hu(n<<2),l=i=(c=a)+((n+3|0)>>>2<<2)|0,a=a+(n<<2)|0,(0|r)==(0|f))n=l,f=r;else{for(o=i,n=l,t=r;ar[o>>2]=ar[t>>2],n=o=n+4|0,(0|(t=t+4|0))!=(0|f););f=0|ar[A>>2]}ar[A>>2]=c,ar[s>>2]=l,ar[b>>2]=n,ar[u>>2]=a,f&&(vu(f),i=0|ar[s>>2])}else i=r}while(0);ar[i+-4>>2]=ar[e>>2],ar[s>>2]=(0|ar[s>>2])-4}(A,c),a=0|ar[u>>2],c=0|ar[a>>2],a=a+4|0,ar[u>>2]=a,o=0|ar[b>>2],t=0|ar[l>>2],e=t,n=o;do{if((0|o)==(0|t)){if(r=0|ar[A>>2],(i=r)>>>0<a>>>0){f=(e=a)+((i=(1+(e-i>>2)|0)/-2|0)<<2)|0,e=(r=(e=n-e|0)>>2)?(wb(0|f,0|a,0|e),0|ar[u>>2]):a,A=f+(r<<2)|0,ar[b>>2]=A,ar[u>>2]=e+(i<<2),e=A;break}if(1073741823<(e=0==(0|(e=e-i>>1))?1:e)>>>0&&(Zu(s=0|X(8),44519),ar[s>>2]=17660,I(0|s,4016,428)),f=0|hu(e<<2),t=i=(n=f)+(e>>>2<<2)|0,f=f+(e<<2)|0,(0|a)==(0|o))e=t;else{for(e=t,r=a;ar[i>>2]=ar[r>>2],e=i=e+4|0,(0|(r=r+4|0))!=(0|o););r=0|ar[A>>2]}ar[A>>2]=n,ar[u>>2]=t,ar[b>>2]=e,ar[l>>2]=f,r&&(vu(r),e=0|ar[b>>2])}else e=o}while(0);ar[e>>2]=c,ar[b>>2]=4+(0|ar[b>>2]),ur=s}(A+4|0),a=0|ar[o>>2],o=0|ar[f>>2],t=0|ar[i>>2]):o=r,ar[(0|ar[t+((c=o+a|0)>>>10<<2)>>2])+((1023&c)<<2)>>2]=e,ar[f>>2]=o+1,kA(A+448|0)),Zb()}function On(A,e){e|=0;var r,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;r=0|ar[(s=(A|=0)+4|0)>>2],n=b=0|ar[A>>2];do{if((0|r)==(0|b)){if((f=0|ar[(b=A+8|0)>>2])>>>0<(i=l=0|ar[(u=A+12|0)>>2])>>>0){t=(i=(n=f)+((o=(1+(i-n>>2)|0)/2|0)<<2)|0)+(0-(u=(n=n-r|0)>>2)<<2)|0,u&&(wb(0|t,0|r,0|n),i=t,f=0|ar[b>>2]),ar[s>>2]=i,ar[b>>2]=f+(o<<2);break}if(1073741823<(n=0==(0|(n=i-n>>1))?1:n)>>>0&&(Zu(s=0|X(8),44519),ar[s>>2]=17660,I(0|s,4016,428)),l=i=(c=a=0|hu(n<<2))+((n+3|0)>>>2<<2)|0,a=a+(n<<2)|0,(0|r)==(0|f))n=l,f=r;else{for(o=i,n=l,t=r;ar[o>>2]=ar[t>>2],n=o=n+4|0,(0|(t=t+4|0))!=(0|f););f=0|ar[A>>2]}ar[A>>2]=c,ar[s>>2]=l,ar[b>>2]=n,ar[u>>2]=a,f&&(vu(f),i=0|ar[s>>2])}else i=r}while(0);ar[i+-4>>2]=ar[e>>2],ar[s>>2]=(0|ar[s>>2])-4}function zn(A,e,r,i,f){e|=0,r|=0,i|=0,f|=0;var n,t,o,a,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0;u=5932+(o=0|ar[(a=(A|=0)+18596|0)>>2])|0,t=0|ar[(b=A+18600|0)>>2],n=(h=-1<<ar[10092+o>>2])&i,h&=f,r=A+18536|0,(0|n)==(0|ar[(e=A+18532|0)>>2])&&(0|h)==(0|ar[r>>2])||(ar[A+18540>>2]=ar[A+18528>>2],ar[e>>2]=n,ar[r>>2]=h),k=5804+o|0,l=n?0:0==((1<<ar[k>>2])-1&h|0),e=0|ar[800+t>>2],r=0|ar[5820+o>>2],c=0|ar[5812+o>>2],r=(0|br(c,(0|e)%(0|r)|0))==(0|n)?(0|br((0|e)/(0|r)|0,c))==(0|h):0,e=0!=(0|tr[5966+o>>0])&&0==((1<<(s=0|ar[k>>2]))-1&(n|h)|0)?0|Fa(u,n>>s,h>>s):0;do{if(r|e)d=14;else{if(l&&0|tr[5965+o>>0]){d=14;break}e=A+18540|0}}while(0);14==(0|d)&&(e=792+(0|ar[b>>2])|0),u=0|ar[e>>2],e=n-1|0;do{if(0|da(0|ar[a>>2],n,h,e,h)&&(d=0|ar[5864+o>>2],s=(0|br(h>>d,0|ar[5852+o>>2]))+(e>>d)|0,(ar[(0|ar[10320+o>>2])+(s<<2)>>2]>>((0|ar[k>>2])-d<<1)|0)==(0|ar[A+4>>2]))){if(l=0|ar[a>>2],e>>=r=0|ar[l+10368>>2],r=h>>r,(0|e)<=-1&&sr(48482,48519,118,48539),(0|(c=0|ar[l+10372>>2]))<=(0|e)&&sr(48482,48519,118,48539),(0|r)<=-1&&sr(48543,48519,119,48539),(0|r)<(0|ar[l+10376>>2])){w=(0|ar[l+10360>>2])+(3*((0|br(c,r))+e|0)|0)+2|0,w=0|tr[w>>0];break}sr(48543,48519,119,48539)}else w=u}while(0);e=h+-1|0;do{if(0|da(0|ar[a>>2],n,h,n,e)&&(h=0|ar[5864+o>>2],d=(0|br(e>>h,0|ar[5852+o>>2]))+(n>>h)|0,(ar[(0|ar[10320+o>>2])+(d<<2)>>2]>>((0|ar[k>>2])-h<<1)|0)==(0|ar[A+4>>2]))){if(l=0|ar[a>>2],e>>=h=0|ar[l+10368>>2],(0|(c=n>>h))<=-1&&sr(48482,48519,118,48539),(0|(r=0|ar[l+10372>>2]))<=(0|c)&&sr(48482,48519,118,48539),(0|e)<=-1&&sr(48543,48519,119,48539),(0|e)<(0|ar[l+10376>>2])){v=(0|ar[l+10360>>2])+(3*((0|br(r,e))+c|0)|0)+2|0,v=0|tr[v>>0];break}sr(48543,48519,119,48539)}else v=u}while(0);h=0|ar[5764+o>>2],h=(e=(52+(0|ar[A+18512>>2])+(w+1+v>>1)+(h<<1)|0)%(h+52|0)|0)-h|0,ar[A+18544>>2]=e,e=(0|(e=(0|ar[5952+o>>2])+h+(0|ar[744+t>>2])+(0|ar[A+18520>>2])|0))<(0|(v=0-(c=0|ar[5772+o>>2])|0))?v:(0|e)<57?e:57,r=(0|(r=(0|ar[5956+o>>2])+h+(0|ar[748+t>>2])+(0|ar[A+18524>>2])|0))<(0|v)?v:(0|r)<57?r:57;do{if(1==(0|ar[5776+o>>2])){do{if(30<=(0|e)){if(42<(0|e)){e=e+-6|0;break}e=0|ar[8020+(e+-30<<2)>>2];break}}while(0);if(30<=(0|r)){if(42<(0|r)){r=r+-6|0;break}r=0|ar[8020+(r+-30<<2)>>2];break}}}while(0);if(ar[A+18548>>2]=c+e,ar[A+18552>>2]=c+r,e=0|ar[a>>2],c=f>>(r=0|ar[e+10368>>2]),(0|(k=i>>r))<=-1&&sr(48482,48519,118,48539),(0|(d=0|ar[e+10372>>2]))<=(0|k)&&sr(48482,48519,118,48539),(0|c)<=-1&&sr(48543,48519,119,48539),(0|c)>=(0|ar[e+10376>>2])&&sr(48543,48519,119,48539),f=(s=0|ar[e+10360>>2])+(3*((0|br(d,c))+k|0)|0)|0,b=(e=1<<(f=(3<(f=7&(cr[f>>0]|cr[f+1>>0]<<8))>>>0?f:3)-r|0))+c|0,31!=(0|f)){l=e+k|0,u=255&h,e=c;do{for(c=0|br(e,d),r=k;tr[s+(3*(r+c|0)|0)+2>>0]=u,(0|(r=r+1|0))<(0|l););e=e+1|0}while((0|e)<(0|b));ar[(A=A+18528|0)>>2]=h}else ar[(A=A+18528|0)>>2]=h}function jn(A,e,r,i,f,n,t,o,a,c){e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0;var l;return l=0|ar[(A|=0)+18596>>2],8<(0|ar[(0==(0|t)?5760+l|0:5768+l|0)>>2])?void function(A,e,r,i,f,n,t,o,a,c){e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0;var l,u,b,s,d,k,h,w,v,m,g,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0,R=0,N=0;switch(ur=(g=ur)+4096|0,s=g,b=0|ar[(k=18596+(A|=0)|0)>>2],0|t){case 0:Z=A+18544|0;break;case 1:Z=A+18548|0;break;case 2:Z=A+18552|0;break;default:sr(44456,44443,367,44458)}X=0|ar[Z>>2],i=0|ar[(m=A+2112|0)>>2],h=0|ar[((d=0==(0|t))?40+b|0:44+b|0)>>2],v=(0|ar[4+b+(t<<2)>>2])+((0|br(h,r))+e<<1)|0,w=0|ar[(d?5760+b|0:5768+b|0)>>2],f=0|ar[10368+b>>2],e>>=f,f=r>>f,(0|e)<=-1&&sr(48482,48519,118,48539);Z=0|ar[10372+b>>2],(0|Z)<=(0|e)&&sr(48482,48519,118,48539);(0|f)<=-1&&sr(48543,48519,119,48539);(0|f)>=(0|ar[10376+b>>2])&&sr(48543,48519,119,48539);I=(0|ar[10360+b>>2])+(3*((0|br(Z,f))+e|0)|0)|0,I=(65535&(cr[I>>0]|cr[I+1>>0]<<8))>>>8&3,l=65535&I,I=(u=4==(0|n))&0!=(0|tr[5748+b>>0])&I<<16>>16==0;A:do{if(0|tr[A+32>>0]){if(r=d?A+14412|0:s,0<(0|or[(Z=A+14404+(t<<1)|0)>>1]))for(f=0;or[i+(or[A+8260+(t<<11)+(f<<1)>>1]<<1)>>1]=0|or[A+2116+(t<<11)+(f<<1)>>1],(0|(f=f+1|0))<(0|or[Z>>1]););I&&fs[63&ar[432+(0|ar[A+18592>>2])>>2]](i,4);do{if(c){if(f=0|ar[A+18592>>2],2==(0|c)){ns[127&ar[f+368>>2]](r,i,n);break}ns[127&ar[f+372>>2]](r,i,n);break}ns[127&ar[364+(0|ar[A+18592>>2])>>2]](r,i,n)}while(0);if(!d&&0|ar[(p=A+28|0)>>2]&&(B=0|ar[k>>2],y=0|ar[B+5768>>2],B=0|ar[B+5760>>2],0<(0|n))){f=0;do{for(e=0|br(f,n),Z=0;R=(0|br(ar[A+14412+((N=Z+e|0)<<2)>>2]<<y>>B,0|ar[p>>2]))>>3,ar[(N=r+(N<<2)|0)>>2]=R+(0|ar[N>>2]),(0|(Z=Z+1|0))!=(0|n););f=f+1|0}while((0|f)!=(0|n))}if(os[63&ar[460+(0|ar[A+18592>>2])>>2]](v,h,r,n,w),I)for(f=i+32|0;((or[i>>1]=0)|(i=i+2|0))<(0|f););}else{if(E=1<(0|n))for(Z=n,f=0;f=f+1|0,3<Z>>>0;)Z>>>=1;else f=0;if(B=(f=f+w|0)+-5|0,0|tr[1400+b>>0]){y=1<<f+-6;do{if(!a){if((0|n)<32){f=t+3|0;break}f=t+1|0;break}f=t}while(0);switch((a=n+-4|0)>>>2|a<<30|0){case 0:W=5993+b+(f<<4)|0;break;case 1:W=6089+b+(f<<6)|0;break;case 3:W=6473+b+(f<<8)|0;break;case 7:W=8009+b+(f<<10)|0;break;default:sr(44456,44443,492,44458)}if(0<(0|or[(r=A+14404+(t<<1)|0)>>1]))for(p=0|ar[8072+(((0|X)%6|0)<<2)>>2],Z=(0|X)/6|0,e=((0|y)<0)<<31>>31,f=0;X=0|or[A+8260+(t<<11)+(f<<1)>>1],R=(0|br(0|cr[W+X>>0],p))<<Z,a=0|or[A+2116+(t<<11)+(f<<1)>>1],a=0|bb(0|(a=0|tb(0|(a=0|nb(0|R,((0|R)<0)<<31>>31|0,0|a,((0|a)<0)<<31>>31|0)),0|D,0|y,0|e)),0|D,0|B),F=(0|(R=D))<-1|-1==(0|R)&a>>>0<4294934528,a=(N=(0|R)<0|0==(0|R)&a>>>0<32767)?a:32767,or[i+(X<<1)>>1]=F?-32768:65535&a,(0|(f=f+1|0))<(0|or[r>>1]););}else if(p=f+-9|0,r=1<<f+-10,Z=ar[8072+(((0|X)%6|0)<<2)>>2]<<((0|X)/6|0),0<(0|or[(e=A+14404+(t<<1)|0)>>1]))for(f=0;W=(0|br(0|or[A+2116+(t<<11)+(f<<1)>>1],Z))+r>>p,or[i+(or[A+8260+(t<<11)+(f<<1)>>1]<<1)>>1]=(0|W)<-32768?-32768:65535&((0|W)<32767?W:32767),(0|(f=f+1|0))<(0|or[e>>1]););if(p=0<(0|n),!o){if(Z=u&0==(l|t|0),0|c&&sr(44486,44443,591,44458),0|tr[10071+b>>0]){xn(A,i,n,n,1&Z,v,h,w,t);break}if(f=0|ar[A+18592>>2],Z){ts[31&ar[f+412>>2]](v,i,h,w);break}switch(0|n){case 4:ts[31&ar[f+416>>2]](v,i,h,w);break A;case 8:ts[31&ar[f+420>>2]](v,i,h,w);break A;case 16:ts[31&ar[f+424>>2]](v,i,h,w);break A;default:ts[31&ar[f+428>>2]](v,i,h,w);break A}}if(E){for(f=n,Z=0;3<f>>>0;)f>>>=1,Z=Z+1|0;Z=Z+6|0}else Z=5;e=0<(0|(e=20-w|0))?e:0,I&&fs[63&ar[432+(0|ar[A+18592>>2])>>2]](i,4),r=d?A+14412|0:s;do{if(c){if(f=0|ar[A+18592>>2],2==(0|c)){os[63&ar[f+464>>2]](r,i,n,Z,e);break}os[63&ar[f+468>>2]](r,i,n,Z,e);break}os[63&ar[472+(0|ar[A+18592>>2])>>2]](r,i,n,Z,e)}while(0);if(!d&&0|ar[(C=A+28|0)>>2]&&(V=0|ar[k>>2],G=0|ar[V+5768>>2],V=0|ar[V+5760>>2],p)){f=0;do{for(e=0|br(f,n),Z=0;R=(0|br(ar[A+14412+((N=Z+e|0)<<2)>>2]<<G>>V,0|ar[C>>2]))>>3,ar[(N=r+(N<<2)|0)>>2]=R+(0|ar[N>>2]),(0|(Z=Z+1|0))!=(0|n););f=f+1|0}while((0|f)!=(0|n))}if(os[63&ar[460+(0|ar[A+18592>>2])>>2]](v,h,r,n,w),I)for(f=i+32|0;((or[i>>1]=0)|(i=i+2|0))<(0|f););}}while(0);if((0|or[(Z=A+14404+(t<<1)|0)>>1])<=0)return ur=g;f=0|ar[m>>2],i=0;for(;or[f+(or[A+8260+(t<<11)+(i<<1)>>1]<<1)>>1]=0,i=i+1|0,(0|i)<(0|or[Z>>1]););ur=g}(A,e,r,i,f,n,t,o,a,c):void function(A,e,r,i,f,n,t,o,a,c){e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0;var l,u,b,s,d,k,h,w,v,m,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0,R=0;switch(ur=(m=ur)+4096|0,s=m,b=0|ar[(k=18596+(A|=0)|0)>>2],0|t){case 0:g=A+18544|0;break;case 1:g=A+18548|0;break;case 2:g=A+18552|0;break;default:sr(44456,44443,367,44458)}E=0|ar[g>>2],i=0|ar[(v=A+2112|0)>>2],h=0|ar[((d=0==(0|t))?40+b|0:44+b|0)>>2],w=(0|ar[4+b+(t<<2)>>2])+((0|br(h,r))+e)|0,f=0|ar[10368+b>>2],e>>=f,f=r>>f,(0|e)<=-1&&sr(48482,48519,118,48539);g=0|ar[10372+b>>2],(0|g)<=(0|e)&&sr(48482,48519,118,48539);(0|f)<=-1&&sr(48543,48519,119,48539);(0|f)>=(0|ar[10376+b>>2])&&sr(48543,48519,119,48539);W=(0|ar[10360+b>>2])+(3*((0|br(g,f))+e|0)|0)|0,W=(65535&(cr[W>>0]|cr[W+1>>0]<<8))>>>8&3,l=65535&W,W=(u=4==(0|n))&0!=(0|tr[5748+b>>0])&W<<16>>16==0;A:do{if(0|tr[A+32>>0]){if(r=d?A+14412|0:s,0<(0|or[(g=A+14404+(t<<1)|0)>>1]))for(f=0;or[i+(or[A+8260+(t<<11)+(f<<1)>>1]<<1)>>1]=0|or[A+2116+(t<<11)+(f<<1)>>1],(0|(f=f+1|0))<(0|or[g>>1]););W&&fs[63&ar[432+(0|ar[A+18592>>2])>>2]](i,4);do{if(c){if(f=0|ar[A+18592>>2],2==(0|c)){ns[127&ar[f+368>>2]](r,i,n);break}ns[127&ar[f+372>>2]](r,i,n);break}ns[127&ar[364+(0|ar[A+18592>>2])>>2]](r,i,n)}while(0);if(!d&&0|ar[(Z=A+28|0)>>2]&&(y=0|ar[k>>2],p=0|ar[y+5768>>2],y=0|ar[y+5760>>2],0<(0|n))){f=0;do{for(e=0|br(f,n),g=0;F=(0|br(ar[A+14412+((R=g+e|0)<<2)>>2]<<p>>y,0|ar[Z>>2]))>>3,ar[(R=r+(R<<2)|0)>>2]=F+(0|ar[R>>2]),(0|(g=g+1|0))!=(0|n););f=f+1|0}while((0|f)!=(0|n))}if(os[63&ar[456+(0|ar[A+18592>>2])>>2]](w,h,r,n,8),W)for(f=i+32|0;((or[i>>1]=0)|(i=i+2|0))<(0|f););}else{if(e=0|ar[(d?5760+b|0:5768+b|0)>>2],B=1<(0|n))for(g=n,f=0;f=f+1|0,3<g>>>0;)g>>>=1;else f=0;if(y=(f=f+e|0)+-5|0,0|tr[1400+b>>0]){p=1<<f+-6;do{if(!a){if((0|n)<32){f=t+3|0;break}f=t+1|0;break}f=t}while(0);switch((a=n+-4|0)>>>2|a<<30|0){case 0:X=5993+b+(f<<4)|0;break;case 1:X=6089+b+(f<<6)|0;break;case 3:X=6473+b+(f<<8)|0;break;case 7:X=8009+b+(f<<10)|0;break;default:sr(44456,44443,492,44458)}if(0<(0|or[(r=A+14404+(t<<1)|0)>>1]))for(Z=0|ar[8072+(((0|E)%6|0)<<2)>>2],g=(0|E)/6|0,e=((0|p)<0)<<31>>31,f=0;E=0|or[A+8260+(t<<11)+(f<<1)>>1],F=(0|br(0|cr[X+E>>0],Z))<<g,a=0|or[A+2116+(t<<11)+(f<<1)>>1],a=0|bb(0|(a=0|tb(0|(a=0|nb(0|F,((0|F)<0)<<31>>31|0,0|a,((0|a)<0)<<31>>31|0)),0|D,0|p,0|e)),0|D,0|y),V=(0|(F=D))<-1|-1==(0|F)&a>>>0<4294934528,a=(R=(0|F)<0|0==(0|F)&a>>>0<32767)?a:32767,or[i+(E<<1)>>1]=V?-32768:65535&a,(0|(f=f+1|0))<(0|or[r>>1]););}else if(Z=f+-9|0,r=1<<f+-10,g=ar[8072+(((0|E)%6|0)<<2)>>2]<<((0|E)/6|0),0<(0|or[(e=A+14404+(t<<1)|0)>>1]))for(f=0;X=(0|br(0|or[A+2116+(t<<11)+(f<<1)>>1],g))+r>>Z,or[i+(or[A+8260+(t<<11)+(f<<1)>>1]<<1)>>1]=(0|X)<-32768?-32768:65535&((0|X)<32767?X:32767),(0|(f=f+1|0))<(0|or[e>>1]););if(e=0<(0|n),!o){if(g=u&0==(l|t|0),0|c&&sr(44486,44443,591,44458),0|tr[10071+b>>0]){Hn(A,i,n,n,1&g,w,h,8,t);break}if(f=0|ar[A+18592>>2],g){ns[127&ar[f+388>>2]](w,i,h);break}switch(0|n){case 4:ns[127&ar[f+392>>2]](w,i,h);break A;case 8:ns[127&ar[f+396>>2]](w,i,h);break A;case 16:ns[127&ar[f+400>>2]](w,i,h);break A;default:ns[127&ar[f+404>>2]](w,i,h);break A}}if(B){for(f=n,g=0;3<f>>>0;)f>>>=1,g=g+1|0;g=g+6|0}else g=5;W&&fs[63&ar[432+(0|ar[A+18592>>2])>>2]](i,4),r=d?A+14412|0:s;do{if(c){if(f=0|ar[A+18592>>2],2==(0|c)){os[63&ar[f+464>>2]](r,i,n,g,12);break}os[63&ar[f+468>>2]](r,i,n,g,12);break}os[63&ar[472+(0|ar[A+18592>>2])>>2]](r,i,n,g,12)}while(0);if(!d&&0|ar[(I=A+28|0)>>2]&&(G=0|ar[k>>2],C=0|ar[G+5768>>2],G=0|ar[G+5760>>2],e)){f=0;do{for(e=0|br(f,n),g=0;F=(0|br(ar[A+14412+((R=g+e|0)<<2)>>2]<<C>>G,0|ar[I>>2]))>>3,ar[(R=r+(R<<2)|0)>>2]=F+(0|ar[R>>2]),(0|(g=g+1|0))!=(0|n););f=f+1|0}while((0|f)!=(0|n))}if(os[63&ar[456+(0|ar[A+18592>>2])>>2]](w,h,r,n,8),W)for(f=i+32|0;((or[i>>1]=0)|(i=i+2|0))<(0|f););}}while(0);if((0|or[(g=A+14404+(t<<1)|0)>>1])<=0)return ur=m;f=0|ar[v>>2],i=0;for(;or[f+(or[A+8260+(t<<11)+(i<<1)>>1]<<1)>>1]=0,i=i+1|0,(0|i)<(0|or[g>>1]););ur=m}(A,e,r,i,f,n,t,o,a,c)}function Hn(A,e,r,i,f,n,t,o,a){e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0;var c,l,u,b=0,s=0,d=0,k=0;ur=(u=ur)+4096|0,l=0|ar[(A|=0)+18592>>2],c=(r=0==(0|a))?A+14412|0:u,a=20-o|0;A:do{if(1==(0|f))ts[31&ar[436+l>>2]](c,e,a,15);else switch(0|i){case 4:ts[31&ar[440+l>>2]](c,e,a,15);break A;case 8:ts[31&ar[444+l>>2]](c,e,a,15);break A;case 16:ts[31&ar[448+l>>2]](c,e,a,15);break A;default:ts[31&ar[452+l>>2]](c,e,a,15);break A}}while(0);if(!r&&0|ar[(b=A+28|0)>>2]&&(d=0|ar[A+18596>>2],s=0|ar[d+5768>>2],d=0|ar[d+5760>>2],0<(0|i))){r=0;do{for(e=0|br(r,i),a=0;k=(0|br(ar[A+14412+((f=a+e|0)<<2)>>2]<<s>>d,0|ar[b>>2]))>>3,ar[(f=c+(f<<2)|0)>>2]=k+(0|ar[f>>2]),(0|(a=a+1|0))!=(0|i););r=r+1|0}while((0|r)!=(0|i))}os[63&ar[456+l>>2]](n,t,c,i,o),ur=u}function xn(A,e,r,i,f,n,t,o,a){e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0;var c,l,u,b=0,s=0,d=0,k=0;ur=(u=ur)+4096|0,l=0|ar[(A|=0)+18592>>2],c=(r=0==(0|a))?A+14412|0:u,a=20-o|0;A:do{if(1==(0|f))ts[31&ar[436+l>>2]](c,e,a,15);else switch(0|i){case 4:ts[31&ar[440+l>>2]](c,e,a,15);break A;case 8:ts[31&ar[444+l>>2]](c,e,a,15);break A;case 16:ts[31&ar[448+l>>2]](c,e,a,15);break A;default:ts[31&ar[452+l>>2]](c,e,a,15);break A}}while(0);if(!r&&0|ar[(b=A+28|0)>>2]&&(d=0|ar[A+18596>>2],s=0|ar[d+5768>>2],d=0|ar[d+5760>>2],0<(0|i))){r=0;do{for(e=0|br(r,i),a=0;k=(0|br(ar[A+14412+((f=a+e|0)<<2)>>2]<<s>>d,0|ar[b>>2]))>>3,ar[(f=c+(f<<2)|0)>>2]=k+(0|ar[f>>2]),(0|(a=a+1|0))!=(0|i););r=r+1|0}while((0|r)!=(0|i))}os[63&ar[460+l>>2]](n,t,c,i,o),ur=u}function Pn(A,e,r){A|=0,r|=0;var i,f,n,t;ur=(t=ur)+16|0,f=t,n=42==(0|tr[(e|=0)>>0]),i=0|ar[2543],n||Ui(44505,6,1,i),ar[f>>2]=r,Qc(A,e+(1&n)|0,f),Oi(i),ur=t}function Ln(A,e,r){e|=0,r|=0;var i,f,n=0,t=0;if(tr[(A|=0)>>0]=1,tr[A+44>>0]=1,qn(A,e),f=r+-1|0,i=1<(0|r))for(n=0;t=255&(0|At(e,1)),tr[A+52+(52*n|0)>>0]=t,t=255&(0|At(e,1)),tr[A+52+(52*n|0)+44>>0]=t,(0|(n=n+1|0))!=(0|f););if((r+-2|0)>>>0<7)for(n=f;et(e,2),(0|(n=n+1|0))<8;);if(i)for(n=0;qn(A+52+(52*n|0)|0,e),(0|(n=n+1|0))!=(0|f););}function Kn(A,e,r){r|=0;var i,f,n,t,o,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0;return ur=(o=ur)+32|0,f=o+8|0,i=o,(e|=0)>>>0<=(c=0|ar[(n=(A|=0)+4|0)>>2])>>>0?(ar[n>>2]=e,void(ur=o)):((l=(u=0|ar[(t=A+8|0)>>2])<<5)>>>0<(a=e-c|0)>>>0|(l-a|0)>>>0<c>>>0?(ar[f>>2]=0,ar[(s=4+f|0)>>2]=0,((ar[(d=8+f|0)>>2]=0)|e)<0&&zl(),c=u<<6,u=e+31&-32,function(A,e){e|=0;var r,i,f,n,t,o=0,a=0,c=0,l=0;if(ur=(t=ur)+32|0,o=t+16|0,r=t+8|0,i=t,ar[(n=8+(A|=0)|0)>>2]<<5>>>0>=e>>>0)return ur=t;ar[o>>2]=0,ar[(a=o+4|0)>>2]=0,ar[(f=o+8|0)>>2]=0,(0|e)<0&&zl();c=0|hu((l=1+((e+-1|0)>>>5)|0)<<2),ar[o>>2]=c,ar[a>>2]=0,ar[f>>2]=l,l=0|ar[A>>2],ar[r>>2]=l,ar[4+r>>2]=0,e=0|ar[(c=A+4|0)>>2],ar[i>>2]=l+(e>>>5<<2),ar[i+4>>2]=31&e,function(A,e,r){e|=0,r|=0;var i,f,n,t,o,a,c,l=0,u=0,b=0,s=0,d=0;if(ur=(c=ur)+32|0,f=c+24|0,n=c+16|0,t=c+8|0,a=c,d=0|ar[(u=4+(A|=0)|0)>>2],o=0|ar[e>>2],l=0|ar[e+4>>2],i=0|ar[r>>2],b=0|ar[r+4>>2],s=i-o<<3,ar[u>>2]=d-l+b+s,u=(0|ar[A>>2])+(d>>>5<<2)|0,e=u,(0|l)!=(0|(r=31&d)))return ar[f>>2]=o,ar[4+f>>2]=l,ar[n>>2]=i,ar[4+n>>2]=b,ar[t>>2]=e,ar[4+t>>2]=r,function(A,e,r,i){A|=0,r|=0,i|=0;var f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0;if(l=0|ar[(e|=0)>>2],f=0|ar[(u=e+4|0)>>2],o=((0|ar[r>>2])-l<<3)+(0|ar[r+4>>2])-f|0,r=l,(0|o)<=0)return e=i+4|0,i=0|ar[i>>2],ar[A>>2]=i,i=A+4|0,A=0|ar[e>>2],ar[i>>2]=A;f?(n=-1>>>((n=32-f|0)-(l=(0|o)<(0|n)?o:n)|0)&-1<<f&ar[r>>2],f=0|ar[(c=i+4|0)>>2],r=(a=32-f|0)>>>0<l>>>0?a:l,t=0|ar[i>>2],f=ar[t>>2]&~(-1>>>(a-r|0)&-1<<f),ar[t>>2]=f,a=0|ar[c>>2],b=0|ar[u>>2],ar[t>>2]=(b>>>0<a>>>0?n<<a-b:n>>>(b-a|0))|f,f=(0|ar[c>>2])+r|0,t=t+(f>>>5<<2)|0,ar[i>>2]=t,f&=31,ar[c>>2]=f,0<(0|(a=l-r|0))&&(f=ar[t>>2]&~(-1>>>(32-a|0)),ar[t>>2]=f,ar[t>>2]=n>>>((0|ar[u>>2])+r|0)|f,ar[c>>2]=a,f=a),r=4+(0|ar[e>>2])|0,ar[e>>2]=r,o=o-l|0):f=0|ar[(c=f=i+4|0)>>2];if(a=32-f|0,n=-1<<f,31<(0|o)){for(t=~n,f=o;u=0|ar[r>>2],b=0|ar[i>>2],l=ar[b>>2]&t,ar[b>>2]=l,ar[b>>2]=u<<ar[c>>2]|l,b=b+4|0,ar[i>>2]=b,ar[b>>2]=ar[b>>2]&n|u>>>a,f=f+-32|0,r=4+(0|ar[e>>2])|0,ar[e>>2]=r,31<(0|f););o&=31}if((0|o)<=0)return e=c,b=0|ar[i>>2],ar[A>>2]=b,b=A+4|0,i=0|ar[e>>2],ar[b>>2]=i;if(t=ar[r>>2]&-1>>>(32-o|0),n=(0|a)<(0|o)?a:o,f=0|ar[i>>2],r=ar[f>>2]&~(-1<<ar[c>>2]&-1>>>(a-n|0)),ar[f>>2]=r,ar[f>>2]=r|t<<ar[c>>2],r=(0|ar[c>>2])+n|0,f=f+(r>>>5<<2)|0,ar[i>>2]=f,ar[c>>2]=31&r,(0|(r=o-n|0))<=0)return e=c,b=0|ar[i>>2],ar[A>>2]=b,b=A+4|0,i=0|ar[e>>2],ar[b>>2]=i;ar[f>>2]=ar[f>>2]&~(-1>>>(32-r|0))|t>>>n,ar[c>>2]=r,e=c,b=0|ar[i>>2],ar[A>>2]=b,b=A+4|0,i=0|ar[e>>2],ar[b>>2]=i}(a,f,n,t),ur=c;r=b-l+s|0,s=o,0<(0|r)&&(e=l?(d=-1>>>((d=32-l|0)-(e=(0|r)<(0|d)?r:d)|0)&-1<<l,ar[u>>2]=ar[u>>2]&~d|ar[s>>2]&d,r=r-e|0,u=u+((l=e+l|0)>>>5<<2)|0,l&=31,s=s+4|0):(l=0,o),wb(0|u,0|e,(b=(0|r)/32|0)<<2|0),A=r-(b<<5)|0,e=r=u+(b<<2)|0,0<(0|A)&&(l=-1>>>(32-A|0),ar[r>>2]=ar[r>>2]&~l|ar[s+(b<<2)>>2]&l,l=A));ar[a>>2]=e,ar[a+4>>2]=l,ur=c}(o,r,i),e=0|ar[A>>2],ar[A>>2]=ar[o>>2],ar[o>>2]=e,o=0|ar[c>>2],ar[c>>2]=ar[a>>2],ar[a>>2]=o,a=0|ar[n>>2],ar[n>>2]=ar[f>>2],ar[f>>2]=a,0|e&&vu(e);ur=t}(f,l>>>0<1073741823?c>>>0<u>>>0?u:c:2147483647),l=0|ar[n>>2],ar[s>>2]=l+a,u=c=0|ar[A>>2],e=0|ar[f>>2],0<(0|(l=(u+(l>>>5<<2)-c<<3)+(31&l)|0))?(wb(0|e,0|c,(b=l>>>5)<<2|0),c=l-(b<<5)|0,e=l=e+(b<<2)|0,0<(0|c)?(k=-1>>>(32-c|0),ar[l>>2]=ar[l>>2]&~k|ar[u+(b<<2)>>2]&k):c=0):c=0,ar[i>>2]=e,ar[i+4>>2]=c,e=0|ar[(l=i)>>2],l=0|ar[l+4>>2],c=0|ar[A>>2],ar[A>>2]=ar[f>>2],ar[f>>2]=c,k=0|ar[n>>2],ar[n>>2]=ar[s>>2],ar[s>>2]=k,k=0|ar[t>>2],ar[t>>2]=ar[d>>2],ar[d>>2]=k,0|c&&vu(c)):(l=(0|ar[A>>2])+(c>>>5<<2)|0,ar[n>>2]=e,e=l,l=31&c),a?(u=0==(0|l),c=e,r?(u||(e=a>>>0<(k=32-l|0)>>>0?a:k,ar[c>>2]=ar[c>>2]|-1>>>(k-e|0)&-1<<l,a=a-e|0,e=c=c+4|0),vb(0|e,-1,(k=a>>>5)<<2|0),(a=a-(k<<5)|0)&&(ar[(e=c+(k<<2)|0)>>2]=ar[e>>2]|-1>>>(32-a|0)),void(ur=o)):(u||(e=a>>>0<(k=32-l|0)>>>0?a:k,ar[c>>2]=ar[c>>2]&~(-1>>>(k-e|0)&-1<<l),a=a-e|0,e=c=c+4|0),vb(0|e,0,(k=a>>>5)<<2|0),(a=a-(k<<5)|0)&&(ar[(e=c+(k<<2)|0)>>2]=ar[e>>2]&~(-1>>>(32-a|0))),void(ur=o))):void(ur=o))}function qn(A,e){e|=0;var r=0,i=0;if(0|tr[(A|=0)>>0]){for(r=255&(0|At(e,2)),tr[A+1>>0]=r,r=255&(0|At(e,1)),tr[A+2>>0]=r,r=0|At(e,5),ar[A+4>>2]=r,i=255&((r=0)|At(e,1));tr[A+8+r>>0]=i,r=r+1|0,i=255&(0|At(e,1)),32!=(0|r););tr[A+40>>0]=i,i=255&(0|At(e,1)),tr[A+41>>0]=i,i=255&(0|At(e,1)),tr[A+42>>0]=i,i=255&(0|At(e,1)),tr[A+43>>0]=i,et(e,44)}0|tr[A+44>>0]&&(i=0|At(e,8),ar[A+48>>2]=i)}function $n(A,e,r){r|=0;var i,f,n,t,o,a,c,l,u,b,s,d,k=0,h=0;if(ur=(d=ur)+112|0,s=d+88|0,h=d+80|0,b=d+72|0,u=d+64|0,l=d+56|0,c=d+48|0,a=d+40|0,o=d+32|0,n=d+24|0,t=d+16|0,i=d+8|0,k=d,f=(e|=0)?45527:45535,0|tr[(A|=0)>>0]){switch(e=0|tr[A+1>>0],ar[k>>2]=f,ar[k+4>>2]=e,Pn(r,45545,k),k=0|tr[A+2>>0],ar[i>>2]=f,ar[4+i>>2]=k,Pn(r,45574,i),0|ar[A+4>>2]){case 1:e=45659;break;case 2:e=45652;break;case 3:e=45635;break;case 4:e=45613;break;default:e=45603}for(ar[t>>2]=f,ar[4+t>>2]=e,Pn(r,45664,t),ar[n>>2]=f,Pn(r,45693,n),e=0;0|e&&Pn(r,45884,b),ar[h>>2]=tr[A+8+e>>0],Pn(r,45887,h),32!=(0|(e=e+1|0)););Pn(r,45728,o),h=0|tr[A+40>>0],ar[a>>2]=f,ar[4+a>>2]=h,Pn(r,45731,a),h=0|tr[A+41>>0],ar[c>>2]=f,ar[4+c>>2]=h,Pn(r,45768,c),h=0|tr[A+42>>0],ar[l>>2]=f,ar[4+l>>2]=h,Pn(r,45804,l),h=0|tr[A+43>>0],ar[u>>2]=f,ar[4+u>>2]=h,Pn(r,45844,u)}ur=(0|tr[A+44>>0]&&(h=0|ar[A+48>>2],ar[s>>2]=f,ar[4+s>>2]=h,Q[8+s>>3]=(0|h)/30,Pn(r,45891,s)),d)}function At(A,e){e|=0;var r,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0;if((0|(i=0|ar[(r=(A|=0)+16|0)>>2]))<(0|e)){i=64-i|0,n=A+4|0;A:do{if(7<(0|i)){t=A+8|0,f=0|ar[n>>2];do{if(!f)break A;c=0|ar[A>>2],ar[A>>2]=c+1,c=0|cr[c>>0],f=f+-1|0,ar[n>>2]=f,c=0|db(0|c,0,0|(i=i+-8|0)),a=ar[(l=t)+4>>2]|D,ar[(o=t)>>2]=ar[l>>2]|c,ar[o+4>>2]=a}while(7<(0|i))}}while(0);i=64-i|0,ar[r>>2]=i}return l=0|sb(0|(o=0|ar[(a=c=A+8|0)>>2]),0|(a=0|ar[a+4>>2]),64-e|0),a=0|db(0|o,0|a,0|e),ar[c>>2]=a,ar[c+4>>2]=D,ar[r>>2]=i-e,0|l}function et(A,e){e|=0;var r,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0;if((0|(i=0|ar[(r=(A|=0)+16|0)>>2]))<(0|e)){i=64-i|0,n=A+4|0;A:do{if(7<(0|i)){t=A+8|0,f=0|ar[n>>2];do{if(!f)break A;c=0|ar[A>>2],ar[A>>2]=c+1,c=0|cr[c>>0],f=f+-1|0,ar[n>>2]=f,c=0|db(0|c,0,0|(i=i+-8|0)),a=ar[(l=t)+4>>2]|D,ar[(o=t)>>2]=ar[l>>2]|c,ar[o+4>>2]=a}while(7<(0|i))}}while(0);i=64-i|0,ar[r>>2]=i}c=0|db(0|ar[(c=l=A+8|0)>>2],0|ar[c+4>>2],0|e),ar[l>>2]=c,ar[l+4>>2]=D,ar[r>>2]=i-e}function rt(A){var e,r,i;i=(-8&ar[(e=(A|=0)+16|0)>>2]|0)/8|0,ar[A>>2]=(0|ar[A>>2])+(0-i),ar[(r=A+4|0)>>2]=(0|ar[r>>2])+i,ar[(A=A+8|0)>>2]=0,ar[A+4>>2]=0,ar[e>>2]=0}function it(A){var e,r,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0;for(a=(A|=0)+4|0,r=A+8|0,i=(c=0)|ar[(e=A+16|0)>>2];;){if((0|i)<1){i=64-i|0;A:do{if(7<(0|i)){f=0|ar[a>>2];do{if(!f)break A;l=0|ar[A>>2],ar[A>>2]=l+1,l=0|cr[l>>0],f=f+-1|0,ar[a>>2]=f,l=0|db(0|l,0,0|(i=i+-8|0)),n=ar[(u=r)+4>>2]|D,ar[(t=r)>>2]=ar[u>>2]|l,ar[t+4>>2]=n}while(7<(0|i))}}while(0);t=64-i|0,ar[e>>2]=t}else t=i;if(n=0|db(0|(u=0|ar[(l=r)>>2]),0|(l=0|ar[l+4>>2]),1),f=D,ar[(i=r)>>2]=n,ar[i+4>>2]=f,i=t+-1|0,ar[e>>2]=i,!(-1<(0|l)|-1==(0|l)&4294967295<u>>>0))break;if(19<(0|c)){i=-99999,o=20;break}c=c+1|0}if(20==(0|o))return 0|i;if(!c)return(u=0)|u;if((0|t)<=(0|c)){i=65-t|0;A:do{if(7<(0|i)){t=0|ar[a>>2];do{if(!t)break A;u=0|ar[A>>2],ar[A>>2]=u+1,u=0|cr[u>>0],t=t+-1|0,ar[a>>2]=t,n|=u=0|db(0|u,0,0|(i=i+-8|0)),f|=D,ar[(u=r)>>2]=n,ar[u+4>>2]=f}while(7<(0|i))}}while(0);i=64-i|0,ar[e>>2]=i}return u=0|sb(0|n,0|f,64-c|0),a=0|db(0|n,0|f,0|c),ar[(l=r)>>2]=a,ar[l+4>>2]=D,ar[e>>2]=i-c,(0|(i=u+(1<<c)|0))<=1&&sr(47395,47382,146,47403),0|(u=i+-1|0)}function ft(A){A=0|it(A|=0);A:do{if((0|A)<0){switch(0|A){case-99999:break;default:break A}return 0|(A=-99999)}switch(0|A){case 0:A=0;break;default:break A}return 0|A}while(0);return 0|(A=(0|(0==(1&A|0)?0-A|0:A+1|0))/2|0)}function nt(A,e,r){if(A|=0,e|=0,-1<(0|(r|=0)))return ar[A>>2]=e,ar[A+4>>2]=e,void(ar[A+8>>2]=e+r);sr(47837,47828,138,47849)}function tt(A){var e,r,i,f,n,t;f=0|ar[(i=(A|=0)+4|0)>>2],n=(0|ar[A+8>>2])-f|0,ar[A+12>>2]=510,or[(t=A+20|0)>>1]=8,((ar[(r=A+16|0)>>2]=0)|n)<=0||(A=1+f|0,ar[i>>2]=A,e=(0|cr[f>>0])<<8,ar[r>>2]=e,1!=((or[t>>1]=0)|n)&&(ar[i>>2]=2+f,ar[r>>2]=0|e|cr[A>>0],or[t>>1]=-8))}function ot(A,e){e|=0;var r=0,i=0,f=0,n=0,t=0,o=0,a=0;return i=(i=0|ar[(t=(A|=0)+12|0)>>2])-(r=0|cr[(i>>>6)-4+(47412+(((0|cr[e>>0])>>>1&255)<<2))>>0])|0,n=(ar[t>>2]=i)<<7,(f=0|ar[(a=A+16|0)>>2])>>>0<n>>>0?(o=255&(f=1&(r=0|tr[e>>0])),tr[e>>0]=tr[47764+((255&r)>>>1&255)>>0]<<1&255|f,32768<=n>>>0?0|(a=o):(ar[t>>2]=i<<1&67108862,f=ar[a>>2]<<1,ar[a>>2]=f,e=1+(0|or[(r=A+20|0)>>1])<<16>>16,(or[r>>1]=e)<<16>>16?0|(a=o):(or[r>>1]=-8,(i=0|ar[(r=A+4|0)>>2])>>>0>=(0|ar[A+8>>2])>>>0||(ar[r>>2]=i+1,ar[a>>2]=0|f|cr[i>>0]),0|(a=o)))):(o=0|cr[47668+(r>>>3)>>0],ar[a>>2]=f-n<<o,ar[t>>2]=r<<o,t=255&(i=1&(r=0|tr[e>>0])^1),(255&r)<2&&(r=i|-2&r,tr[e>>0]=r),tr[e>>0]=tr[47700+((255&r)>>>1&255)>>0]<<1&255|1&r,r=(0|lr[(n=A+20|0)>>1])+o|0,32768&(or[n>>1]=r)|0||(r=r<<16>>16,(f=0|ar[(i=A+4|0)>>2])>>>0<(0|ar[A+8>>2])>>>0&&(ar[i>>2]=f+1,ar[a>>2]=(0|cr[f>>0])<<r|ar[a>>2]),or[n>>1]=r+65528),0|(a=t))}function at(A){var e=0,r=0,i=0,f=0,n=0;return r=(0|ar[(e=(A|=0)+12|0)>>2])-2|0,(i=(ar[e>>2]=r)<<7)>>>0<=(f=0|ar[(n=A+16|0)>>2])>>>0?0|(n=1):32768<=i>>>0?(n=0)|n:(ar[e>>2]=r<<1&67108862,i=f<<1,ar[n>>2]=i,f=1+(0|or[(e=A+20|0)>>1])<<16>>16,(or[e>>1]=f)<<16>>16?(n=0)|n:(or[e>>1]=-8,(r=0|ar[(e=A+4|0)>>2])>>>0>=(0|ar[A+8>>2])>>>0||(ar[e>>2]=r+1,ar[n>>2]=i+(0|cr[r>>0])),(n=0)|n))}function ct(A){var e,r,i=0,f=0,n=0,t=0;return f=ar[(r=(A|=0)+16|0)>>2]<<1,ar[r>>2]=f,t=1+(0|or[(e=A+20|0)>>1])<<16>>16,-1<(or[e>>1]=t)<<16>>16&&(n=0|ar[(i=A+4|0)>>2],(0|ar[A+8>>2])>>>0>n>>>0)&&(or[e>>1]=-8,ar[i>>2]=n+1,f=0|f|cr[n>>0],ar[r>>2]=f),f>>>0<(i=ar[A+12>>2]<<7)>>>0?(t=0)|t:(ar[r>>2]=f-i,0|(t=1))}function lt(A,e){var r,i,f,n,t=0,o=0,a=0,c=0,l=0;if((0|(e|=0))<=0)return 0|(l=e);for(i=(A|=0)+16|0,f=A+20|0,n=A+8|0,l=A+4|0,r=A+12|0,t=(A=0)|or[f>>1],o=0|ar[i>>2];;){if(o<<=1,ar[i>>2]=o,t=t+1<<16>>16,-1<(or[f>>1]=t)<<16>>16&&(c=0|ar[l>>2],(0|ar[n>>2])>>>0>c>>>0)?(or[f>>1]=-8,ar[l>>2]=c+1,a=0|cr[c>>0]|o,ar[i>>2]=a,t=-8):a=o,a>>>0<(o=ar[r>>2]<<7)>>>0){t=8;break}if(o=a-o|0,ar[i>>2]=o,(0|e)<=(0|(A=A+1|0))){A=e,t=8;break}}return 8==(0|t)?0|A:0}function ut(A,e){A|=0;var r,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0;if((0|(e|=0))<9)return e?(i=ar[(t=A+16|0)>>2]<<e,ar[t>>2]=i,f=(0|lr[(n=A+20|0)>>1])+e|0,0==(32768&(or[n>>1]=f)|0)&&(a=0|ar[(o=A+4|0)>>2],(0|ar[A+8>>2])>>>0>a>>>0)&&(ar[o>>2]=a+1,u=f<<16>>16,b=(0|cr[a>>0])<<u,or[n>>1]=u+65528,i|=b,ar[t>>2]=i),u=ar[A+12>>2]<<7,u=i-(0|br(b=(0|(l=(i>>>0)/(u>>>0)|0))<(0|(b=1<<e))?l:b+-1|0,u))|0,ar[t>>2]=u,0|b):(b=0)|b;if(i=ar[(l=A+16|0)>>2]<<8,ar[l>>2]=i,n=65535&(f=8+(0|lr[(u=A+20|0)>>1])|0),or[u>>1]=n,0==(32768&f|0)&&(c=0|ar[(t=A+4|0)>>2],(0|ar[A+8>>2])>>>0>c>>>0)?(ar[t>>2]=c+1,n=f<<16>>16,f=(0|cr[c>>0])<<n,n=n+65528&65535,or[u>>1]=n,f|=i,ar[l>>2]=f):f=i,r=ar[A+12>>2]<<7,t=f-(0|br(i=(0|(i=(f>>>0)/(r>>>0)|0))<255?i:255,r))|0,ar[l>>2]=t,!(f=e+-8|0))return 0|(b=i);for(e=A+8|0,c=A+4|0;f=f+-1|0,a=i<<1,i=t<<1,ar[l>>2]=i,n=n+1<<16>>16,-1<(or[u>>1]=n)<<16>>16&&(b=0|ar[c>>2],(0|ar[e>>2])>>>0>b>>>0)&&(or[u>>1]=-8,ar[c>>2]=b+1,i=0|cr[b>>0]|i,ar[l>>2]=i,n=-8),i>>>0<r>>>0?(t=0,o=i):(o=i-r|0,ar[l>>2]=o,t=1),i=t|a,f;)t=o;return 0|i}function bt(A,e){var r,i,f,n,t,o,a=0,c=0,l=0,u=0,b=0,s=0;for(r=(A|=0)+16|0,f=A+8|0,n=A+4|0,t=A+12|0,o=(e|=0)+31|0,a=(u=0)|or[(i=A+20|0)>>1],c=0|ar[r>>2];c<<=1,ar[r>>2]=c,a=a+1<<16>>16,-1<(or[i>>1]=a)<<16>>16&&(b=0|ar[n>>2],(0|ar[f>>2])>>>0>b>>>0)?(or[i>>1]=-8,ar[n>>2]=b+1,l=0|cr[b>>0]|c,ar[r>>2]=l,a=-8):l=c,!(l>>>0<(c=ar[t>>2]<<7)>>>0);){if(c=l-c|0,ar[r>>2]=c,(0|e)==(0|o)){e=0,s=8;break}u=u+(1<<e)|0,e=e+1|0}return 8==(0|s)?0|e:0|(s=(0|ut(A,e))+u|0)}function st(A){ar[(A|=0)>>2]=0,ar[A+4>>2]=0}function dt(A,e){A|=0;var r,i=0;ur=(r=ur)+16|0,i=r,0|(i=0|ar[(e|=0)+4>>2])&&(ar[i>>2]=1+(0|ar[i>>2])),ar[A+4>>2]=i,ar[A>>2]=ar[e>>2],ur=r}function kt(A){var e,r,i,f=0;ur=(r=ur)+16|0,f=r,ur=((f=0|ar[(e=(A|=0)+4|0)>>2])&&(i=(0|ar[f>>2])-1|0,ar[f>>2]=i,0|i||(0|(f=0|ar[A>>2])&&mu(f),(f=0|ar[e>>2])&&vu(f))),r)}function ht(A,e,r){e|=0,r|=0;var i,f,n=0,t=0,o=0;ur=(f=ur)+16|0,o=f+8|0,n=f,i=0|ar[(n=(A|=0)+4|0)>>2];do{if(0|i){if(1==(0|(t=0|ar[i>>2])))return wt(o=0|ar[A>>2],e,r),void(ur=f);if(1<(0|t)){ar[i>>2]=t+-1;break}sr(47917,47927,177,47943)}}while(0);o=0|wu(172),ar[A>>2]=o,A=0|hu(4),ar[n>>2]=A,ar[A>>2]=1,wt(o,e,r),ur=f}function wt(A,e,r){A|=0,e|=0,r|=0;var i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0;do{if(0<(0|e)){if(o=(0|r)<0?0:(0|r)<51?r:51,i=A+5|0,f=(255&(a=(f=63<(0|(a=(0|(a=((a=0|ar[8096+(12*(n=e+-1|0)|0)>>2])<<3&120)-16+((0|br((5*(a>>4)|0)-45|0,o))>>4)|0))<1?1:(0|a)<126?a:126)))?a+64|0:63-a|0))<<1&255|1&f,63<=(127&a)>>>0&&(t=f,tr[(a=i)>>0]=t,sr(47989,47927,210,48010)),vb(0|i,0|f,1),i=A+6|0,f=(255&(a=(f=63<(0|(a=(0|(a=((a=0|ar[8096+(12*n|0)+4>>2])<<3&120)-16+((0|br((5*(a>>4)|0)-45|0,o))>>4)|0))<1?1:(0|a)<126?a:126)))?a+64|0:63-a|0))<<1&255|1&f,63<=(127&a)>>>0&&(t=f,tr[(a=i)>>0]=t,sr(47989,47927,210,48010)),vb(0|i,0|f,1),i=A+7|0,f=(255&(a=(f=63<(0|(a=(0|(a=((a=0|ar[8096+(12*n|0)+8>>2])<<3&120)-16+((0|br((5*(a>>4)|0)-45|0,o))>>4)|0))<1?1:(0|a)<126?a:126)))?a+64|0:63-a|0))<<1&255|1&f,63<=(127&a)>>>0&&(t=f,tr[(a=i)>>0]=t,sr(47989,47927,210,48010)),vb(0|i,0|f,1),f=A+149|0,i=(255&(a=(i=63<(0|(a=(0|(a=((a=0|ar[9536+(n<<2)>>2])<<3&120)-16+((0|br((5*(a>>4)|0)-45|0,o))>>4)|0))<1?1:(0|a)<126?a:126)))?a+64|0:63-a|0))<<1&255|1&i,63<=(127&a)>>>0&&(tr[f>>0]=i,sr(47989,47927,210,48010)),vb(0|f,0|i,1),i=A+147|0,f=(255&(a=(f=63<(0|(a=(0|(a=((a=0|ar[8120+(n<<2)>>2])<<3&120)-16+((0|br((5*(a>>4)|0)-45|0,o))>>4)|0))<1?1:(0|a)<126?a:126)))?a+64|0:63-a|0))<<1&255|1&f,63<=(127&a)>>>0&&(tr[i>>0]=f,sr(47989,47927,210,48010)),vb(0|i,0|f,1),f=A+148|0,i=(255&(a=(i=63<(0|(a=(0|(a=((a=0|ar[8128+(n<<2)>>2])<<3&120)-16+((0|br((5*(a>>4)|0)-45|0,o))>>4)|0))<1?1:(0|a)<126?a:126)))?a+64|0:63-a|0))<<1&255|1&i,63<=(127&a)>>>0&&(tr[f>>0]=i,sr(47989,47927,210,48010)),vb(0|f,0|i,1),i=A+156|0,f=(255&(a=(f=63<(0|(a=(0|(a=104+((0|br(o,-20))>>4)|0))<1?1:(0|a)<126?a:126)))?a+64|0:63-a|0))<<1&255|1&f,63<=(127&a)>>>0&&(t=f,tr[(a=i)>>0]=t,sr(47989,47927,210,48010)),vb(0|i,0|f,1),i=A+157|0,t=(255&(a=(t=63<(0|(a=(0|(a=104+((0|br(o,-25))>>4)|0))<1?1:(0|a)<126?a:126)))?a+64|0:63-a|0))<<1&255|1&t,63<=(127&a)>>>0&&(n=t,tr[(a=i)>>0]=n,sr(47989,47927,210,48010)),vb(0|i,0|t,1),i=A+158|0,f=(255&(a=(f=63<(0|(a=(0|(a=104+((0|br(o,-30))>>4)|0))<1?1:(0|a)<126?a:126)))?a+64|0:63-a|0))<<1&255|1&f,63<=(127&a)>>>0&&(n=f,tr[(a=i)>>0]=n,sr(47989,47927,210,48010)),vb(0|i,0|f,1),i=A+159|0,f=(255&(a=(f=63<(0|(a=(0|(a=104+((0|br(o,-40))>>4)|0))<1?1:(0|a)<126?a:126)))?a+64|0:63-a|0))<<1&255|1&f,63<=(127&a)>>>0&&(n=f,tr[(a=i)>>0]=n,sr(47989,47927,210,48010)),vb(0|i,0|f,1),vb(A+160|0,0|f,1),tr[A+154>>0]=14,tr[A+155>>0]=14,i=A+150|0,f=(255&(a=(f=63<(0|(a=(0|(a=((a=0|ar[(n=9520+((1==(0|e)?0:2)<<2)|0)>>2])<<3&120)-16+((0|br((5*(a>>4)|0)-45|0,o))>>4)|0))<1?1:(0|a)<126?a:126)))?a+64|0:63-a|0))<<1&255|1&f,63<=(127&a)>>>0&&(l=f,tr[(a=i)>>0]=l,sr(47989,47927,210,48010)),vb(0|i,0|f,1),i=A+151|0,f=(255&(l=(f=63<(0|(l=(0|(l=((l=0|ar[n+4>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,o))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&f,63<=(127&l)>>>0&&(a=f,tr[(l=i)>>0]=a,sr(47989,47927,210,48010)),vb(0|i,0|f,1),i=(255&(l=(i=63<(0|(l=(0|(l=48+(5*o>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&i,f=A+152|0,63<=(127&l)>>>0&&(tr[f>>0]=i,sr(47989,47927,210,48010)),vb(0|f,0|i,1),vb(A+153|0,0|t,1),f=A+143|0,i=(255&(l=(i=63<(0|(l=(0|(l=72+((0|br(o,-5))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&i,(127&l)>>>0<63){vb(0|f,0|i,4);break}tr[f>>0]=i,sr(47989,47927,210,48010)}}while(0);a=(0|r)<0?0:(0|r)<51?r:51,i=A+2|0,f=(255&(l=(f=63<(0|(l=(0|(l=((l=0|ar[8136+(12*e|0)>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&f,63<=(127&l)>>>0&&(r=f,tr[(l=i)>>0]=r,sr(47989,47927,210,48010)),vb(0|i,0|f,1),i=A+3|0,f=(255&(l=(f=63<(0|(l=(0|(l=((l=0|ar[8136+(12*e|0)+4>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&f,63<=(127&l)>>>0&&(r=f,tr[(l=i)>>0]=r,sr(47989,47927,210,48010)),vb(0|i,0|f,1),i=A+4|0,f=(255&(l=(f=63<(0|(l=(0|(l=((l=0|ar[8136+(12*e|0)+8>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&f,63<=(127&l)>>>0&&(r=f,tr[(l=i)>>0]=r,sr(47989,47927,210,48010)),vb(0|i,0|f,1),i=A+8|0,f=(255&(l=(f=63<(0|(l=(0|(l=((l=0|ar[(n=9484+((2!=(0|e)?e:5)<<2)|0)>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&f,63<=(127&l)>>>0&&(r=f,tr[(l=i)>>0]=r,sr(47989,47927,210,48010)),vb(0|i,0|f,1),i=A+9|0,f=(255&(l=(f=63<(0|(l=(0|(l=((l=0|ar[n+4>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&f,63<=(127&l)>>>0&&(r=f,tr[(l=i)>>0]=r,sr(47989,47927,210,48010)),vb(0|i,0|f,1),i=A+10|0,f=(255&(l=(f=63<(0|(l=(0|(l=((l=0|ar[n+8>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&f,63<=(127&l)>>>0&&(r=f,tr[(l=i)>>0]=r,sr(47989,47927,210,48010)),vb(0|i,0|f,1),i=A+11|0,f=(255&(l=(f=63<(0|(l=(0|(l=((l=0|ar[n+12>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&f,63<=(127&l)>>>0&&(r=f,tr[(l=i)>>0]=r,sr(47989,47927,210,48010)),vb(0|i,0|f,1),f=A+12|0,i=(255&(l=(i=63<(0|(l=(0|(l=((l=0|ar[9472+(e<<2)>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&i,63<=(127&l)>>>0&&(tr[f>>0]=i,sr(47989,47927,210,48010)),vb(0|f,0|i,1),i=A+13|0,f=(255&(l=(f=63<(0|(l=(0|(l=((l=0|ar[8172+(e<<2)>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&f,63<=(127&l)>>>0&&(tr[i>>0]=f,sr(47989,47927,210,48010)),vb(0|i,0|f,1),f=A+14|0,n=(255&(l=(n=63<(0|(l=(0|(l=((l=0|ar[(i=8184+((0==(0|e)?0:2)<<2)|0)>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&n,63<=(127&l)>>>0&&(r=n,tr[(l=f)>>0]=r,sr(47989,47927,210,48010)),vb(0|f,0|n,1),l=0|ar[i+4>>2],i=A+15|0,f=(255&(l=(f=63<(0|(l=(0|(l=(l<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&f,63<=(127&l)>>>0&&(r=f,tr[(l=i)>>0]=r,sr(47989,47927,210,48010)),vb(0|i,0|f,1),i=A+16|0,f=(255&(l=(f=63<(0|(l=(0|(l=((l=0|ar[(n=9424+((r=e<<2)<<2)|0)>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&f,63<=(127&l)>>>0&&(o=f,tr[(l=i)>>0]=o,sr(47989,47927,210,48010)),vb(0|i,0|f,1),i=A+17|0,f=(255&(l=(f=63<(0|(l=(0|(l=((l=0|ar[n+4>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&f,63<=(127&l)>>>0&&(o=f,tr[(l=i)>>0]=o,sr(47989,47927,210,48010)),vb(0|i,0|f,1),i=A+18|0,f=(255&(l=(f=63<(0|(l=(0|(l=((l=0|ar[n+8>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&f,63<=(127&l)>>>0&&(o=f,tr[(l=i)>>0]=o,sr(47989,47927,210,48010)),vb(0|i,0|f,1),i=A+19|0,f=(255&(l=(f=63<(0|(l=(0|(l=((l=0|ar[n+12>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&f,63<=(127&l)>>>0&&(o=f,tr[(l=i)>>0]=o,sr(47989,47927,210,48010)),vb(0|i,0|f,1),i=A+20|0,f=(255&(l=(f=63<(0|(l=(0|(l=((l=0|ar[(n=9388+(3*e<<2)|0)>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&f,63<=(127&l)>>>0&&(o=f,tr[(l=i)>>0]=o,sr(47989,47927,210,48010)),vb(0|i,0|f,1),i=A+21|0,f=(255&(l=(f=63<(0|(l=(0|(l=((l=0|ar[n+4>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&f,63<=(127&l)>>>0&&(o=f,tr[(l=i)>>0]=o,sr(47989,47927,210,48010)),vb(0|i,0|f,1),i=A+22|0,f=(255&(l=(f=63<(0|(l=(0|(l=((l=0|ar[n+8>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&f,63<=(127&l)>>>0&&(o=f,tr[(l=i)>>0]=o,sr(47989,47927,210,48010)),vb(0|i,0|f,1),n=A+25|0,o=9172+(18*e<<2)|0,i=0;do{if(f=n+i|0,t=(255&(l=(t=63<(0|(l=(0|(l=((l=0|ar[o+(i<<2)>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&t,63<=(127&l)>>>0){c=35;break}vb(0|f,0|t,1),i=i+1|0}while((0|i)<18);35==(0|c)&&(tr[f>>0]=t,sr(47989,47927,210,48010)),f=A+43|0,i=0;do{if(n=f+i|0,t=(255&(l=(t=63<(0|(l=(0|(l=((l=0|ar[o+(i<<2)>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&t,63<=(127&l)>>>0){c=39;break}vb(0|n,0|t,1),i=i+1|0}while((0|i)<18);39==(0|c)&&(tr[n>>0]=t,sr(47989,47927,210,48010)),i=A+61|0,f=(255&(l=(f=63<(0|(l=(0|(l=((l=0|ar[(n=8200+(r<<2)|0)>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&f,63<=(127&l)>>>0&&(r=f,tr[(l=i)>>0]=r,sr(47989,47927,210,48010)),vb(0|i,0|f,1),i=A+62|0,f=(255&(l=(f=63<(0|(l=(0|(l=((l=0|ar[n+4>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&f,63<=(127&l)>>>0&&(r=f,tr[(l=i)>>0]=r,sr(47989,47927,210,48010)),vb(0|i,0|f,1),i=A+63|0,f=(255&(l=(f=63<(0|(l=(0|(l=((l=0|ar[n+8>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&f,63<=(127&l)>>>0&&(r=f,tr[(l=i)>>0]=r,sr(47989,47927,210,48010)),vb(0|i,0|f,1),i=A+64|0,f=(255&(l=(f=63<(0|(l=(0|(l=((l=0|ar[n+12>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&f,63<=(127&l)>>>0&&(r=f,tr[(l=i)>>0]=r,sr(47989,47927,210,48010)),vb(0|i,0|f,1),n=A+65|0,i=0;do{if(f=n+i|0,t=(255&(l=(t=63<(0|(l=(0|(l=((l=0|ar[8248+(168*e|0)+(i<<2)>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&t,63<=(127&l)>>>0){c=45;break}vb(0|f,0|t,1),i=i+1|0}while((0|i)<42);45==(0|c)&&(tr[f>>0]=t,sr(47989,47927,210,48010)),i=A+107|0,f=(255&(l=(f=63<(0|(l=(0|(l=((l=0|ar[8752+(e<<3)>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&f,63<=(127&l)>>>0&&(r=f,tr[(l=i)>>0]=r,sr(47989,47927,210,48010)),vb(0|i,0|f,1),i=A+108|0,f=(255&(l=(f=63<(0|(l=(0|(l=((l=0|ar[8752+(e<<3)+4>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&f,63<=(127&l)>>>0&&(r=f,tr[(l=i)>>0]=r,sr(47989,47927,210,48010)),vb(0|i,0|f,1),t=A+109|0,f=8884+(24*e<<2)|0,i=0;do{if(n=t+i|0,o=(255&(l=(o=63<(0|(l=(0|(l=((l=0|ar[f+(i<<2)>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&o,63<=(127&l)>>>0){c=51;break}vb(0|n,0|o,1),i=i+1|0}while((0|i)<24);51==(0|c)&&(tr[n>>0]=o,sr(47989,47927,210,48010)),f=A+133|0,n=8776+(6*e<<2)|0,i=0;do{if(t=f+i|0,o=(255&(l=(o=63<(0|(l=(0|(l=((l=0|ar[n+(i<<2)>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&o,63<=(127&l)>>>0){c=55;break}vb(0|t,0|o,1),i=i+1|0}while((0|i)<6);if(55==(0|c)&&(tr[t>>0]=o,sr(47989,47927,210,48010)),i=(255&(l=(i=63<(0|(l=(0|(l=((l=0|ar[8848+(e<<2)>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&i,63<=(127&l)>>>0&&(tr[A>>0]=i,sr(47989,47927,210,48010)),vb(0|A,0|i,1),i=A+1|0,f=(255&(l=(f=63<(0|(l=(0|(l=((l=0|ar[8860+(e<<2)>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&f,63<=(127&l)>>>0&&(tr[i>>0]=f,sr(47989,47927,210,48010)),vb(0|i,0|f,1),tr[A+139>>0]=1,tr[A+140>>0]=1,f=A+141|0,i=(255&(l=(i=63<(0|(l=(0|(l=72+((0|br(a,-5))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&i,63<=(127&l)>>>0&&(tr[f>>0]=i,sr(47989,47927,210,48010)),vb(0|f,0|i,1),vb(A+142|0,0|i,1),f=A+161|0,i=(255&(l=(i=63<(0|(l=(0|(l=((l=0|ar[8872+(e<<2)>>2])<<3&120)-16+((0|br((5*(l>>4)|0)-45|0,a))>>4)|0))<1?1:(0|l)<126?l:126)))?l+64|0:63-l|0))<<1&255|1&i,(127&l)>>>0<63)return vb(0|f,0|i,1),tr[(e=l=A+162|0)>>0]=1,tr[e+1>>0]=1,tr[e+2>>0]=1,tr[e+3>>0]=1,tr[(l=l+4|0)>>0]=1,tr[l+1>>0]=1,tr[l+2>>0]=1,tr[l+3>>0]=1,tr[(l=A+170|0)>>0]=1,tr[l+1>>0]=1,tr[A+23>>0]=1,void(tr[A+24>>0]=1);tr[f>>0]=i,sr(47989,47927,210,48010)}function vt(A){var e,r,i=0;ur=(r=ur)+16|0,i=r,ur=((i=0|ar[(e=(A|=0)+4|0)>>2])&&(ar[i>>2]=(0|ar[i>>2])-1,ar[A>>2]=0,ar[e>>2]=0),r)}function mt(A){var e,r,i=0,f=0;ur=(r=ur)+16|0,i=r,(i=0|ar[(e=(A|=0)+4|0)>>2])||sr(48057,47927,95,48064),ur=((0|(f=0|ar[i>>2]))<=1||(ar[i>>2]=f+-1,f=0|ar[A>>2],i=0|wu(172),ar[A>>2]=i,A=0|hu(4),ar[e>>2]=A,ar[A>>2]=1,hb(0|i,0|f,172)),r)}function gt(A,e){A|=0;var r,i,f=0,n=0;return ur=(i=ur)+32|0,f=i,f=0|ar[(r=(e|=0)+4|0)>>2],ur=(f?(ar[f>>2]=1+(0|ar[f>>2]),0|(f=0|ar[(n=A+4|0)>>2])&&(ar[f>>2]=(0|ar[f>>2])-1,ar[A>>2]=0,ar[n>>2]=0),ar[A>>2]=ar[e>>2],ar[n>>2]=ar[r>>2]):(f=0|ar[(n=A+4|0)>>2])&&(ar[f>>2]=(0|ar[f>>2])-1,ar[A>>2]=0,ar[n>>2]=0),i),0|A}function Zt(A,e){e|=0;var r,i,f,n,t,o,a,c,l,u,b,s,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0,R=0,N=0,_=0,Y=0,Q=0,D=0,J=0,M=0;if(b=0|ar[(A|=0)+5808>>2],J=(1<<(s=0|ar[A+5804>>2]))-1|0,M=0|ar[A+5820>>2],d=e<<s>>(Q=0|ar[A+5800>>2]),Q=e+1<<s>>Q,(0|(Q=(0|(D=0|ar[A+5824>>2]))<(0|Q)?D:Q))<=(0|d))return(M=0)|(M&=J=1);i=A+10372|0,f=A+10360|0,n=A+10348|0,t=A+10352|0,o=A+10356|0,a=A+10340|0,c=A+48|0,l=A+52|0,u=A+5977|0,D=A+10308|0,k=(e=0)|ar[(r=A+5816|0)>>2];A:for(;;){if(0<(0|k)){G=0==(0|(F=0|br(d,b)))?0:32,R=0|br(F>>s,M),Y=0!=(0|F)&0==(F&J|0),_=0|br((N=F+-1|0)>>s,M),V=0;do{if(C=(0|br(0|ar[i>>2],d))+V|0,C=(0|ar[f>>2])+(3*C|0)|0,I=65535&(C=7&(cr[C>>0]|cr[C+1>>0]<<8)),C<<16>>16){if(y=(C=0|br(V,b))>>s,h=F>>(Z=0|ar[n>>2]),(0|(B=C>>Z))<=-1){d=8;break A}if((0|(E=0|ar[t>>2]))<=(0|B)){d=8;break A}if((0|h)<=-1){d=11;break A}if((0|(X=0|ar[o>>2]))<=(0|h)){d=11;break A}if(W=0|ar[a>>2],v=0|br(E,h),w=0|lr[W+(24*(v+B|0)|0)+2>>1],h=0|ar[c>>2],(p=(0|ar[l>>2])-h>>2)>>>0<=w>>>0){k=0,d=33;break A}g=0|ar[(m=h)+(w<<2)>>2],h=0==(0|C)?0:16;do{if(0!=(0|C)&0==(C&J|0)){if(!(0|tr[g+764>>0])){if(!(-1<(0|(w=C+-1>>Z))&(0|w)<(0|E))){d=16;break A}if((v=0|lr[W+(24*(v+w|0)|0)+2>>1])>>>0<p>>>0&&(0|ar[g+800>>2])!=(0|ar[800+(0|ar[m+(v<<2)>>2])>>2])){w=0;break}}w=0|tr[u>>0]?h:(w=0|ar[D>>2],(0|ar[w+(y+R<<2)>>2])==(0|ar[w+((C+-1>>s)+R<<2)>>2])?h:0)}else w=h}while(0);do{if(Y){if(!(0|tr[g+764>>0])){if(!(-1<(0|(h=N>>Z))&(0|h)<(0|X))){d=24;break A}if(W=W+(24*((0|br(E,h))+B|0)|0)+2|0,(W=0|lr[W>>1])>>>0<p>>>0&&(0|ar[g+800>>2])!=(0|ar[800+(0|ar[m+(W<<2)>>2])>>2])){h=0;break}}h=0|tr[u>>0]?G:(h=0|ar[D>>2],(0|ar[h+(y+R<<2)>>2])==(0|ar[h+(y+_<<2)>>2])?G:0)}else h=G}while(0);0|tr[g+754>>0]||(Wt(A,C,F,I,0,255&w,255&h),It(A,C,F,I,0,0),e=1,k=0|ar[r>>2])}V=V+1|0}while((0|V)<(0|k))}if((0|Q)<=(0|(d=d+1|0))){k=1,d=33;break}}if(8==(0|d))sr(48482,48519,118,48539);else if(11==(0|d))sr(48543,48519,119,48539);else if(16==(0|d))sr(48482,48519,118,48539);else if(24==(0|d))sr(48543,48519,119,48539);else if(33==(0|d))return 0|(M=k&e);return 0}function pt(A,e,r,i,f,n){r|=0,i|=0,f|=0;var t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p,y,B,E,X,W,I,C,G,V,F,R,N,_=0,Y=0,Q=0,D=0,J=0,M=0,T=0,U=0,S=0,O=0,z=0,j=0,H=0,x=0,P=0,L=0,K=0,q=0,$=0,AA=0,eA=0,rA=0,iA=0,fA=0,nA=0;if(V=(e|=0)?2:1,F=e?1:2,R=1&e,N=1&(1^e),G=e?80:160,I=e?16:32,nA=(0|(n|=0))<(0|(nA=0|ar[(C=(A|=0)+10472|0)>>2]))?n:nA,!((0|(fA=(0|i)<(0|(fA=0|ar[A+10476>>2]))?i:fA))<=(0|r))){o=(0|f)<(0|nA),a=A+10460|0,c=A+10368|0,l=A+10372|0,u=A+10376|0,b=A+10360|0,s=A+10388|0,d=A+10392|0,k=A+10396|0,h=A+10380|0,w=A+10348|0,v=A+10352|0,m=A+10356|0,g=A+10340|0,Z=A+48|0,p=A+52|0,y=A+10332|0,B=A+10516|0,E=A+10448|0,X=A+10452|0,W=A+10456|0,t=A+10440|0;A:for(;;){if(o){eA=(0|(AA=r<<2))/4|0,rA=AA-N|0,$=f;do{if(iA=(0|(M=$<<2))/4|0,e=(0|br(0|ar[C>>2],eA))+iA|0,e=(0|ar[a>>2])+e|0,(D=255&(n=0|tr[e>>0]))&G){if(J=M-R|0,n=rA>>(A=0|ar[c>>2]),(0|(e=J>>A))<=-1){e=10;break A}if((0|(_=0|ar[l>>2]))<=(0|e)){e=10;break A}if((0|n)<=-1){e=13;break A}if((0|(Y=0|ar[u>>2]))<=(0|n)){e=13;break A}if(n=(Q=0|ar[b>>2])+(3*((0|br(_,n))+e|0)|0)|0,e=AA>>A,!(-1<(0|(i=M>>A))&(0|i)<(0|_))){e=15;break A}if(!(-1<(0|e)&(0|e)<(0|Y))){e=17;break A}q=Q+(3*((0|br(_,e))+i|0)|0)|0;e:do{if(0!=(768&(cr[n>>0]|cr[n+1>>0]<<8))&&0!=(768&(cr[q>>0]|cr[q+1>>0]<<8))){if(D&I|0){if(n=AA>>(i=0|ar[E>>2]),(0|(e=M>>i))<=-1){e=22;break A}if((0|(A=0|ar[X>>2]))<=(0|e)){e=22;break A}if((0|n)<=-1){e=25;break A}if((0|(_=0|ar[W>>2]))<=(0|n)){e=25;break A}if(q=(Y=0|ar[t>>2])+((0|br(A,n))+e)|0,(0|tr[q>>0])<=-1){e=1;break}if(e=rA>>i,!(-1<(0|(n=J>>i))&(0|n)<(0|A))){e=28;break A}if(!(-1<(0|e)&(0|e)<(0|_))){e=30;break A}if(q=Y+((0|br(A,e))+n)|0,(0|tr[q>>0])<=-1){e=1;break}}if(n=rA>>(i=0|ar[s>>2]),(0|(e=J>>i))<=-1){e=34;break A}if((0|(A=0|ar[d>>2]))<=(0|e)){e=34;break A}if((0|n)<=-1){e=37;break A}if((0|(_=0|ar[k>>2]))<=(0|n)){e=37;break A}if(q=0|ar[h>>2],K=(0|br(A,n))+e|0,e=AA>>i,!(-1<(0|(n=M>>i))&(0|n)<(0|A))){e=39;break A}if(!(-1<(0|e)&(0|e)<(0|_))){e=41;break A}if(L=(0|br(A,e))+n|0,n=rA>>(_=0|ar[w>>2]),(0|(e=J>>_))<=-1){e=44;break A}if((0|(Y=0|ar[v>>2]))<=(0|e)){e=44;break A}if((0|n)<=-1){e=47;break A}if((0|(Q=0|ar[m>>2]))<=(0|n)){e=47;break A}if(e=(D=0|ar[g>>2])+(24*((0|br(Y,n))+e|0)|0)+2|0,e=0|lr[e>>1],i=0|ar[Z>>2],J=e>>>0<(A=(0|ar[p>>2])-i>>2)>>>0?0|ar[i+(e<<2)>>2]:0,e=AA>>_,!(-1<(0|(n=M>>_))&(0|n)<(0|Y))){e=51;break A}if(!(-1<(0|e)&(0|e)<(0|Q))){e=53;break A}if(e=D+(24*((0|br(Y,e))+n|0)|0)+2|0,e=(e=0|lr[e>>1])>>>0<A>>>0?0|ar[i+(e<<2)>>2]:0,x=(n=(j=0|tr[q+(12*K|0)>>0])<<24>>24==0)?-1:0|ar[J+916+(tr[q+(12*K|0)+2>>0]<<2)>>2],O=(i=(H=0|tr[q+(12*K|0)+1>>0])<<24>>24==0)?-1:0|ar[J+980+(tr[q+(12*K|0)+3>>0]<<2)>>2],!((U=(0|x)==(0|(S=(A=(M=0|tr[q+(12*L|0)>>0])<<24>>24==0)?-1:0|ar[e+916+(tr[q+(12*L|0)+2>>0]<<2)>>2])))&(0|O)==(0|(J=(D=(T=0|tr[q+(12*L|0)+1>>0])<<24>>24==0)?-1:0|ar[e+980+(tr[q+(12*L|0)+3>>0]<<2)>>2])))&&!((0|O)==(0|S)&(0|x)==(0|J))){e=1;break}if(P=n?0:0|or[q+(12*K|0)+6>>1],e=n?0:0|or[q+(12*K|0)+4>>1],z=i?0:0|or[q+(12*K|0)+10>>1],Q=i?0:0|or[q+(12*K|0)+8>>1],Y=A?0:0|or[q+(12*L|0)+6>>1],A=A?0:0|or[q+(12*L|0)+4>>1],_=D?0:0|or[q+(12*L|0)+10>>1],i=D?0:0|or[q+(12*L|0)+8>>1],((255&H)+(255&j)|0)!=((255&T)+(255&M)|0)&&(er(4+(0|ar[y>>2])|0,1013,0),tr[B>>0]=3),(0|x)==(0|O)){if((0|S)!=(0|J)){e=81;break A}q=(n=e<<16>>16)-(e=A<<16>>16)|0;do{if((0|((0|q)<0?0-q|0:q))<=3){if(3<(0|((0|(q=(P<<16>>16)-(Y<<16>>16)|0))<0?0-q|0:q)))break;if(3<(0|((0|(q=(Q<<16>>16)-(i<<16>>16)|0))<0?0-q|0:q)))break;if((0|((0|(q=(z<<16>>16)-(_<<16>>16)|0))<0?0-q|0:q))<=3){e=0;break e}}}while(0);q=n-(i<<16>>16)|0;do{if((0|((0|q)<0?0-q|0:q))<=3){if(3<(0|((0|(q=(P<<16>>16)-(_<<16>>16)|0))<0?0-q|0:q)))break;if(3<(0|((0|(q=(Q<<16>>16)-e|0))<0?0-q|0:q)))break;if((0|((0|(q=(z<<16>>16)-(Y<<16>>16)|0))<0?0-q|0:q))<=3){e=0;break e}}}while(0);e=1;break}if(e=e<<16>>16,U){q=e-(A<<16>>16)|0;do{if((0|((0|q)<0?0-q|0:q))<=3){if(3<(0|((0|(q=(P<<16>>16)-(Y<<16>>16)|0))<0?0-q|0:q)))break;if(3<(0|((0|(q=(Q<<16>>16)-(i<<16>>16)|0))<0?0-q|0:q)))break;if((0|((0|(q=(z<<16>>16)-(_<<16>>16)|0))<0?0-q|0:q))<=3){e=0;break e}}}while(0);e=1;break}q=e-(i<<16>>16)|0;do{if((0|((0|q)<0?0-q|0:q))<=3){if(3<(0|((0|(q=(P<<16>>16)-(_<<16>>16)|0))<0?0-q|0:q)))break;if(3<(0|((0|(q=(Q<<16>>16)-(A<<16>>16)|0))<0?0-q|0:q)))break;if((0|((0|(q=(z<<16>>16)-(Y<<16>>16)|0))<0?0-q|0:q))<=3){e=0;break e}}}while(0);e=1;break}e=2}while(0);iA=(0|br(0|ar[C>>2],eA))+iA|0,iA=(0|ar[a>>2])+iA|0,tr[iA>>0]=-4&tr[iA>>0]|e}else tr[e>>0]=-4&n;$=$+V|0}while((0|$)<(0|nA))}if((0|fA)<=(0|(r=r+F|0))){e=5;break}}switch(0|e){case 5:return;case 10:sr(48482,48519,118,48539);break;case 13:sr(48543,48519,119,48539);break;case 15:sr(48482,48519,118,48539);break;case 17:sr(48543,48519,119,48539);break;case 22:sr(48482,48519,118,48539);break;case 25:sr(48543,48519,119,48539);break;case 28:sr(48482,48519,118,48539);break;case 30:sr(48543,48519,119,48539);break;case 34:sr(48482,48519,118,48539);break;case 37:sr(48543,48519,119,48539);break;case 39:sr(48482,48519,118,48539);break;case 41:sr(48543,48519,119,48539);break;case 44:sr(48482,48519,118,48539);break;case 47:sr(48543,48519,119,48539);break;case 51:sr(48482,48519,118,48539);break;case 53:sr(48543,48519,119,48539);break;case 81:sr(48206,48225,343,48236)}}}function yt(A,e,r,i,f,n){r|=0,i|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p,y,B,E,X,W,I,C,G,V,F,R,N,_,Y,Q,D,J,M,T,U,S,O,z,j,H,x,P,L,K,q,$,AA,eA,rA,iA,fA,nA,tA,oA,aA,cA,lA,uA,bA,sA,dA,kA,hA,wA,vA,mA,gA,ZA,pA,yA,BA,EA,XA,WA,IA,CA,GA,VA,FA,RA,NA,_A,YA,QA,DA,JA,MA,TA,UA,SA,OA,zA,jA,HA,xA,PA,LA,KA,qA,$A,Ae,ee,re,ie,fe,ne,te,oe,ae,ce,le,ue,be,se,de,ke,he,we,ve,me,ge,Ze,pe,ye=0,Be=0,Ee=0,Xe=0,We=0,Ie=0,Ce=0,Ge=0,Ve=0,Fe=0,Re=0,Ne=0,_e=0,Ye=0,Qe=0,De=0,Je=0,Me=0,Te=0,Ue=0,Se=0,Oe=0,ze=0,je=0,He=0,xe=0,Pe=0,Le=0,Ke=0,qe=0,$e=0,Ar=0,er=0,rr=0,ir=0,fr=0,nr=0;if(ur=(pe=ur)+80|0,me=(ve=pe)+40|0,ge=pe+32|0,Ze=(e|=0)?2:1,ke=e?1:2,de=0|ar[(he=(A|=0)+40|0)>>2],ye=0|ar[A+5760>>2],nr=(0|n)<(0|(nr=0|ar[(we=A+10472|0)>>2]))?n:nr,(0|(fr=(0|i)<(0|(fr=0|ar[A+10476>>2]))?i:fr))<=(0|r))ur=pe;else{TA=(0|f)<(0|nr),UA=A+10460|0,SA=A+4|0,OA=A+10368|0,zA=A+10372|0,jA=A+10376|0,HA=A+10360|0,xA=A+10348|0,PA=A+10352|0,LA=A+10356|0,KA=A+10340|0,qA=A+48|0,$A=ye+-8|0,Ae=4+me|0,ee=2+me|0,re=28+me|0,ie=26+me|0,fe=24+me|0,ne=ve+4|0,te=ve+2|0,oe=ve+28|0,ae=ve+26|0,ce=ve+24|0,le=6+me|0,ue=ve+6|0,be=30+me|0,se=ve+30|0,DA=A+5480|0,JA=2+ge|0,MA=4+ge|0,x=65535+(H=1<<ye)|0,YA=ve+8|0,L=de-1|0,y=8+me|0,K=de-2|0,Z=10+me|0,q=de-3|0,B=12+me|0,$=de-4|0,W=14+me|0,QA=ve+16|0,AA=de<<2,eA=(rr=P=de<<1)+-1|0,X=16+me|0,rA=rr+-2|0,p=18+me|0,iA=rr+-3|0,E=20+me|0,rr=rr+-4|0,I=22+me|0,fA=6*de|0,nA=(ir=3*de|0)+-1|0,tA=ir+-2|0,oA=ir+-3|0,ir=ir+-4|0,aA=de<<1,cA=0|br(de,-3),lA=de<<1,uA=0|br(de,-3),kA=0-de|0,hA=ve+2|0,wA=0-(sA=bA=de<<1)|0,t=2+me|0,vA=ve+4|0,mA=0-(dA=3*de|0)|0,u=4+me|0,gA=ve+6|0,ZA=0-(er=de<<2)|0,h=6+me|0,pA=ve+8|0,yA=1-de|0,l=8+me|0,BA=1+de|0,EA=ve+10|0,XA=1-sA|0,o=10+me|0,WA=1|sA,IA=ve+12|0,CA=1-dA|0,b=12+me|0,GA=1+dA|0,VA=ve+14|0,FA=1-er|0,w=14+me|0,RA=ve+16|0,NA=2-de|0,k=16+me|0,_A=2+de|0,C=ve+18|0,G=2-sA|0,a=18+me|0,V=2+sA|0,F=ve+20|0,R=2-dA|0,s=20+me|0,N=2+dA|0,_=ve+22|0,Y=2-er|0,v=22+me|0,Q=ve+24|0,D=3-de|0,g=24+me|0,J=3+de|0,M=ve+26|0,T=3-sA|0,c=26+me|0,U=3+sA|0,S=ve+28|0,O=3-dA|0,d=28+me|0,z=3+dA|0,j=ve+30|0,er=3-er|0,m=30+me|0;A:for(;;){if(TA){Le=(0|(Pe=r<<2))/4|0,Ke=Pe+-1|0,xe=e?Pe:Ke,He=f;do{if(Xe=He<<2,We=(0|br(0|ar[we>>2],Le))+((0|Xe)/4|0)|0,(We=3&tr[(0|ar[UA>>2])+We>>0])<<24>>24){if(Ar=(qe=0|ar[SA>>2])+($e=(0|br(0|ar[he>>2],Pe))+Xe<<1)|0,Ee=e?(i=lr[(i=(A=i=Ar)+4|0)>>1]|lr[i+2>>1]<<16,ar[(n=ve)>>2]=lr[A>>1]|lr[A+2>>1]<<16,ar[n+4>>2]=i,or[me>>1]=0|or[Ar+-2>>1],or[ee>>1]=0|or[Ar+-4>>1],or[Ae>>1]=0|or[Ar+-6>>1],or[le>>1]=0|or[Ar+-8>>1],n=lr[(n=(i=n=qe+($e+P)|0)+4|0)>>1]|lr[n+2>>1]<<16,ar[(A=YA)>>2]=lr[i>>1]|lr[i+2>>1]<<16,ar[A+4>>2]=n,or[y>>1]=0|or[Ar+(L<<1)>>1],or[Z>>1]=0|or[Ar+(K<<1)>>1],or[B>>1]=0|or[Ar+(q<<1)>>1],or[W>>1]=0|or[Ar+($<<1)>>1],A=lr[(A=(n=A=qe+($e+AA)|0)+4|0)>>1]|lr[A+2>>1]<<16,ar[(i=QA)>>2]=lr[n>>1]|lr[n+2>>1]<<16,ar[i+4>>2]=A,or[X>>1]=0|or[Ar+(eA<<1)>>1],or[p>>1]=0|or[Ar+(rA<<1)>>1],or[E>>1]=0|or[Ar+(iA<<1)>>1],or[I>>1]=0|or[Ar+(rr<<1)>>1],i=lr[(i=(A=i=qe+($e+fA)|0)+4|0)>>1]|lr[i+2>>1]<<16,ar[(n=ce)>>2]=lr[A>>1]|lr[A+2>>1]<<16,ar[n+4>>2]=i,or[fe>>1]=0|or[Ar+(nA<<1)>>1],n=ie,i=be,A=tA,ye=ir,Be=re,oA):(or[ve>>1]=0|or[Ar>>1],or[me>>1]=0|or[Ar+(kA<<1)>>1],or[hA>>1]=0|or[Ar+(de<<1)>>1],or[t>>1]=0|or[Ar+(wA<<1)>>1],or[vA>>1]=0|or[Ar+(sA<<1)>>1],or[u>>1]=0|or[Ar+(mA<<1)>>1],or[gA>>1]=0|or[Ar+(dA<<1)>>1],or[h>>1]=0|or[Ar+(ZA<<1)>>1],or[pA>>1]=0|or[Ar+2>>1],or[l>>1]=0|or[Ar+(yA<<1)>>1],or[EA>>1]=0|or[Ar+(BA<<1)>>1],or[o>>1]=0|or[Ar+(XA<<1)>>1],or[IA>>1]=0|or[Ar+(WA<<1)>>1],or[b>>1]=0|or[Ar+(CA<<1)>>1],or[VA>>1]=0|or[Ar+(GA<<1)>>1],or[w>>1]=0|or[Ar+(FA<<1)>>1],or[RA>>1]=0|or[Ar+4>>1],or[k>>1]=0|or[Ar+(NA<<1)>>1],or[C>>1]=0|or[Ar+(_A<<1)>>1],or[a>>1]=0|or[Ar+(G<<1)>>1],or[F>>1]=0|or[Ar+(V<<1)>>1],or[s>>1]=0|or[Ar+(R<<1)>>1],or[_>>1]=0|or[Ar+(N<<1)>>1],or[v>>1]=0|or[Ar+(Y<<1)>>1],or[Q>>1]=0|or[Ar+6>>1],or[g>>1]=0|or[Ar+(D<<1)>>1],or[M>>1]=0|or[Ar+(J<<1)>>1],or[c>>1]=0|or[Ar+(T<<1)>>1],or[S>>1]=0|or[Ar+(U<<1)>>1],n=d,i=m,A=O,ye=er,Be=j,z),or[n>>1]=0|or[Ar+(A<<1)>>1],or[Be>>1]=0|or[Ar+(Ee<<1)>>1],or[i>>1]=0|or[Ar+(ye<<1)>>1],n=Pe>>(Ve=0|ar[OA>>2]),(0|(Re=Xe>>Ve))<=-1){n=13;break A}if((0|(_e=0|ar[zA>>2]))<=(0|Re)){n=13;break A}if((0|n)<=-1){n=16;break A}if((0|(Ne=0|ar[jA>>2]))<=(0|n)){n=16;break A}if(Qe=0|ar[HA>>2],Ye=(Fe=0|br(_e,n))+Re|0,Ge=Xe+-1|0,i=xe>>Ve,!(-1<(0|(n=(e?Ge:Xe)>>Ve))&(0|n)<(0|_e))){n=18;break A}if(!(-1<(0|i)&(0|i)<(0|Ne))){n=20;break A}if(ye=Qe+(3*((0|br(_e,i))+n|0)|0)+2|0,ye=1+(0|tr[Qe+(3*Ye|0)+2>>0])+(0|tr[ye>>0])>>1,n=Xe>>(i=0|ar[xA>>2]),i=Pe>>i,(0|n)<=-1){n=23;break A}if((0|(A=0|ar[PA>>2]))<=(0|n)){n=23;break A}if((0|i)<=-1){n=26;break A}if((0|i)>=(0|ar[LA>>2])){n=26;break A}je=(0|ar[KA>>2])+(24*((0|br(A,i))+n|0)|0)+2|0,je=0|ar[(0|ar[qA>>2])+(lr[je>>1]<<2)>>2],Ce=(0|ar[je+756>>2])+ye|0,Ce=cr[48154+((0|Ce)<0?0:(0|Ce)<51?Ce:51)>>0]<<$A,je=(We<<1&255)-2+ye+(0|ar[je+760>>2])|0,je=cr[48100+((0|je)<0?0:(0|je)<53?je:53)>>0]<<$A,Je=(0|(Je=(65535&(Te=0|or[Ae>>1]))-((65535&(Ue=0|or[ee>>1]))<<1)+(n=65535&(ye=0|or[me>>1]))|0))<0?0-Je|0:Je,Be=0|lr[fe>>1],De=(0|(De=(0|lr[re>>1])-(lr[ie>>1]<<1)+Be|0))<0?0-De|0:De,Me=(0|(Me=(65535&(Ie=0|or[ne>>1]))-((65535&(Oe=0|or[te>>1]))<<1)+(i=65535&(Se=0|or[ve>>1]))|0))<0?0-Me|0:Me,Ee=0|lr[ce>>1],A=Me+Je|0,Xe=(ze=(0|(ze=(0|lr[oe>>1])-(lr[ae>>1]<<1)+Ee|0))<0?0-ze|0:ze)+De|0,Je=De+Je|0,Me=ze+Me|0;e:do{if((Xe+A|0)<(0|Ce)){We=Ce>>2;do{if((A<<1|0)<(0|We)){if(ze=(0|lr[le>>1])-n|0,(Ce>>3|0)<=(((0|(De=i-(0|lr[ue>>1])|0))<0?0-De|0:De)+((0|ze)<0?0-ze|0:ze)|0)){i=0;break}i=(0|((0|(i=n-i|0))<0?0-i|0:i))<(1+(5*je|0)>>1|0)}else i=0}while(0);do{if((Xe<<1|0)<(0|We)){if(ze=(0|lr[be>>1])-Be|0,(Ce>>3|0)<=(((0|(De=Ee-(0|lr[se>>1])|0))<0?0-De|0:De)+((0|ze)<0?0-ze|0:ze)|0)){n=0;break}n=(0|((0|(n=Be-Ee|0))<0?0-n|0:n))<(1+(5*je|0)>>1|0)}else n=0}while(0);if(ze=i&n,Ee=(Ce>>1)+Ce>>3,A=(Be=0|tr[DA>>0])<<24>>24!=0,e){if(n=-1<(0|(i=Ge>>Ve)),A){if(!(n&(0|i)<(0|_e))){n=37;break A}A=(65535&(cr[(A=Qe+(3*(Fe+i|0)|0)|0)>>0]|cr[A+1>>0]<<8))>>>10&1^1}else{if(!n){n=41;break A}A=1}if((0|_e)<=(0|i)){n=41;break A}i=Qe+(3*(Fe+i|0)|0)|0,De=(n=Be<<24>>24?0==(1024&(cr[(n=Qe+(3*Ye|0)|0)>>0]|cr[n+1>>0]<<8)):1)&0==(2048&(cr[(De=Qe+(3*Ye|0)|0)>>0]|cr[De+1>>0]<<8)),Ne=A<<24>>24?0==(2048&(cr[i>>0]|cr[i+1>>0]<<8)):0}else{if(n=-1<(0|(i=Ke>>Ve)),A){if(!(n&(0|i)<(0|Ne))){n=47;break A}A=Qe+(3*((0|br(_e,i))+Re|0)|0)|0,A=0==(1024&(cr[A>>0]|cr[A+1>>0]<<8))}else{if(!n){n=51;break A}A=1}if((0|Ne)<=(0|i)){n=51;break A}i=Qe+(3*((0|br(_e,i))+Re|0)|0)|0,De=(n=Be<<24>>24?0==(1024&(cr[(n=Qe+(3*Ye|0)|0)>>0]|cr[n+1>>0]<<8)):1)&0==(2048&(cr[(De=Qe+(3*Ye|0)|0)>>0]|cr[De+1>>0]<<8)),Ne=A&0==(2048&(cr[i>>0]|cr[i+1>>0]<<8))}for(_e=je<<1,Ye=10*je|0,Qe=0-je|0,Re=(0|Ee)<=(0|Je)|1^Ne,Fe=(0|Ee)<=(0|Me)|1^De,Ve=0-(Ge=je>>1)|0,Ce=0,Xe=Te,Ee=Ue,i=Se,A=Oe;;){We=qe+($e+(0|br(P,Ce)))|0;do{if(ze){Se=0|or[ve+(Ce<<3)+6>>1],Me=65535&Ee,Ue=65535&A,Ee=(Te=65535&ye)+_e|0,Be=65535&((0|(Be=(A=4+(Te<<1)|0)+(Me<<1)+(Oe=65535&Xe)+(n=(i&=65535)<<1)+Ue>>3))<(0|(Je=Te-_e|0))?Je:(0|Ee)<(0|Be)?Ee:Be),Xe=Me+_e|0,Ee=65535&((0|(Ee=(Te+2+Me+Oe+i|0)>>>2))<(0|(Je=Me-_e|0))?Je:(0|Xe)<(0|Ee)?Xe:Ee),Xe=(Te+4+Me+(3*Oe|0)+i+(lr[me+(Ce<<3)+6>>1]<<1)|0)>>>3,Je=Oe-_e|0,Oe=Oe+_e|0,Xe=65535&((0|Xe)<(0|Je)?Je:(0|Oe)<(0|Xe)?Oe:Xe),n=A+Me+n+(Ue<<1)+(Oe=65535&Ie)>>3,A=i+_e|0,n=65535&((0|n)<(0|(Me=i-_e|0))?Me:(0|A)<(0|n)?A:n),or[ge>>1]=n,A=i+Te+Ue|0,Te=Ue-_e|0,Ue=Ue+_e|0,i=65535&((0|(i=(Oe+2+A|0)>>>2))<(0|Te)?Te:(0|Ue)<(0|i)?Ue:i),or[JA>>1]=i,A=(A+4+(3*Oe|0)+((65535&Se)<<1)|0)>>>3,Se=Oe-_e|0,Oe=Oe+_e|0,A=65535&((0|A)<(0|Se)?Se:(0|Oe)<(0|A)?Oe:A),or[MA>>1]=A;do{if(e){if(ye=0|br(Ce,de),!Ne){if(!De)break;or[We>>1]=0|or[ge>>1],or[We+2>>1]=0|or[2+ge>>1],or[We+4>>1]=0|or[4+ge>>1];break}if(or[Ar+(ye+-1<<1)>>1]=Be,De){or[Ar+(ye<<1)>>1]=n,or[Ar+(ye+-2<<1)>>1]=Ee,or[Ar+(ye+1<<1)>>1]=i,or[Ar+(ye+-3<<1)>>1]=Xe,or[Ar+(ye+2<<1)>>1]=A;break}or[Ar+(ye+-2<<1)>>1]=Ee,or[Ar+(ye+-3<<1)>>1]=Xe;break}if(!Ne){if(!De)break;or[Ar+(Ce<<1)>>1]=n,or[Ar+(de+Ce<<1)>>1]=i,or[Ar+(bA+Ce<<1)>>1]=A;break}if(or[Ar+(Ce-de<<1)>>1]=Be,De){or[Ar+(Ce<<1)>>1]=n,or[Ar+(Ce-aA<<1)>>1]=Ee,or[Ar+(de+Ce<<1)>>1]=i,or[Ar+(Ce+cA<<1)>>1]=Xe,or[Ar+(aA+Ce<<1)>>1]=A;break}or[Ar+(Ce-lA<<1)>>1]=Ee,or[Ar+(Ce+uA<<1)>>1]=Xe;break}while(0)}else{if((0|Ye)<=(0|((0|(n=8+(9*((Be=65535&i)-(ye&=65535)|0)|0)+(0|br((A&=65535)-(i=65535&Ee)|0,-3))>>4))<0?0-n|0:n)))break;n=(0|n)<(0|Qe)?Qe:(0|je)<(0|n)?je:n;do{if(e){if(Ne&&(Se=n+ye|0,Oe=Ar+((0|br(Ce,de))-1<<1)|0,or[Oe>>1]=(0|Se)<0?0:65535&((0|Se)<(0|H)?Se:x)),!De)break;Se=Be-n|0,Oe=Ar+((0|br(Ce,de))<<1)|0,or[Oe>>1]=(0|Se)<0?0:65535&((0|Se)<(0|H)?Se:x)}else{if(Ne&&(Oe=n+ye|0,or[Ar+(Ce-de<<1)>>1]=(0|Oe)<0?0:65535&((0|Oe)<(0|H)?Oe:x)),!De)break;Oe=Be-n|0,or[Ar+(Ce<<1)>>1]=(0|Oe)<0?0:65535&((0|Oe)<(0|H)?Oe:x)}}while(0);if(Re||(Se=((0|(Oe=(Se=n+(((ye+1+(65535&Xe)|0)>>>1)-i)|0)>>1))<(0|Ve)?Ve:((0|Ge)<(0|Oe)?je:Se)>>1)+i|0,Oe=(0|br(Ce,de))-2|0,or[Ar+((e?Oe:Ce-P|0)<<1)>>1]=(0|Se)<0?0:65535&((0|Se)<(0|H)?Se:x)),Fe)break;Se=((0|(Oe=(Se=((Be+1+(65535&Ie)|0)>>>1)-A-n|0)>>1))<(0|Ve)?Ve:((0|Ge)<(0|Oe)?je:Se)>>1)+A|0,Oe=0|br(e?Ce:1,de),or[Ar+(Oe+(e?1:Ce)<<1)>>1]=(0|Se)<0?0:65535&((0|Se)<(0|H)?Se:x)}}while(0);if(4==(0|(n=Ce+1|0)))break e;Xe=0|or[me+((Ce=n)<<3)+4>>1],Ee=0|or[me+(n<<3)+2>>1],ye=0|or[me+(n<<3)>>1],i=0|or[ve+(n<<3)>>1],A=0|or[ve+(n<<3)+2>>1],Ie=0|or[ve+(n<<3)+4>>1]}}}while(0)}He=He+Ze|0}while((0|He)<(0|nr))}if((0|fr)<=(0|(r=r+ke|0))){n=5;break}}switch(0|n){case 5:return void(ur=pe);case 13:sr(48482,48519,118,48539);break;case 16:sr(48543,48519,119,48539);break;case 18:sr(48482,48519,118,48539);break;case 20:sr(48543,48519,119,48539);break;case 23:sr(48482,48519,118,48539);break;case 26:sr(48543,48519,119,48539);break;case 37:case 41:sr(48482,48519,118,48539);break;case 47:case 51:sr(48543,48519,119,48539)}}}function Bt(A,e,r,i,f,n){r|=0,i|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p,y,B,E,X,W,I,C,G,V,F,R,N,_,Y,Q,D,J,M,T,U,S,O,z,j,H,x,P,L,K,q,$,AA,eA,rA,iA,fA,nA,tA,oA,aA,cA,lA,uA,bA,sA,dA,kA,hA,wA,vA,mA,gA,ZA,pA,yA,BA,EA,XA,WA,IA,CA,GA,VA,FA,RA,NA,_A,YA,QA,DA,JA,MA,TA,UA=0,SA=0,OA=0,zA=0,jA=0,HA=0,xA=0,PA=0,LA=0,KA=0,qA=0,$A=0,Ae=0,ee=0,re=0,ie=0,fe=0,ne=0,te=0,oe=0,ae=0,ce=0,le=0,ue=0,be=0,se=0,de=0,ke=0,he=0,we=0,ve=0,me=0,ge=0,Ze=0,pe=0,ye=0,Be=0,Ee=0,Xe=0,We=0,Ie=0;if(ur=(TA=ur)+48|0,QA=TA+24|0,DA=TA+8|0,JA=TA,MA=(e|=0)?2:1,NA=e?1:2,RA=0|ar[(_A=(A|=0)+40|0)>>2],UA=0|ar[A+5760>>2],Ie=(0|n)<(0|(Ie=0|ar[(YA=A+10472|0)>>2]))?n:Ie,(0|(We=(0|i)<(0|(We=0|ar[A+10476>>2]))?i:We))<=(0|r))ur=TA;else{tA=(0|f)<(0|Ie),oA=A+10460|0,aA=A+4|0,cA=A+10368|0,lA=A+10372|0,uA=A+10376|0,bA=A+10360|0,sA=A+10348|0,dA=A+10352|0,kA=A+10356|0,hA=A+10340|0,wA=A+48|0,vA=UA+-8|0,mA=2+DA|0,gA=1+DA|0,ZA=14+DA|0,pA=13+DA|0,yA=12+DA|0,BA=2+QA|0,EA=1+QA|0,XA=14+QA|0,WA=13+QA|0,IA=12+QA|0,CA=3+DA|0,GA=3+QA|0,VA=15+DA|0,FA=15+QA|0,iA=A+5480|0,fA=JA+1|0,nA=JA+2|0,L=255+(P=1<<UA)|0,pe=3*RA|0,q=ye=K=RA<<1,$=0|br(RA,-3),AA=RA<<1,eA=0|br(RA,-3),Be=rA=RA<<1,Ee=3*RA|0,Xe=RA<<2,a=e?-1:0-RA|0,t=e?1:RA,c=e?-2:0-Be|0,l=e?2:Be,u=e?-3:0-Ee|0,b=e?3:Ee,s=e?-4:0-Xe|0,o=e?RA:1,d=4+QA|0,k=e?RA-1|0:1-RA|0,S=4+DA|0,h=1+RA|0,w=5+QA|0,v=e?RA-2|0:1-Be|0,T=5+DA|0,m=e?2+RA|0:1|Be,g=6+QA|0,Z=e?RA-3|0:1-Ee|0,O=6+DA|0,p=e?3+RA|0:Ee+1|0,y=7+QA|0,B=e?RA-4|0:1-Xe|0,H=7+DA|0,E=e?ye:2,X=8+QA|0,W=e?ye+-1|0:2-RA|0,j=8+DA|0,I=e?1|ye:2+RA|0,C=9+QA|0,G=e?ye+-2|0:2-Be|0,U=9+DA|0,V=(e?ye:Be)+2|0,F=10+QA|0,R=e?ye+-3|0:2-Ee|0,z=10+DA|0,N=e?ye+3|0:Ee+2|0,_=11+QA|0,ye=e?ye+-4|0:2-Xe|0,x=11+DA|0,Y=e?pe:3,Q=e?pe+-1|0:3-RA|0,D=e?pe+1|0:3+RA|0,J=e?pe+-2|0:3-Be|0,Be=e?pe+2|0:Be+3|0,M=e?pe+-3|0:3-Ee|0,Ee=(e?pe:Ee)+3|0,Xe=e?pe+-4|0:3-Xe|0;A:for(;;){if(tA){ve=(0|(we=r<<2))/4|0,me=we+-1|0,he=e?we:me,ke=f;do{if(A=ke<<2,SA=(0|br(0|ar[YA>>2],ve))+((0|A)/4|0)|0,(SA=3&tr[(0|ar[oA>>2])+SA>>0])<<24>>24){if(pe=(ge=0|ar[aA>>2])+(Ze=(0|br(0|ar[_A>>2],we))+A|0)|0,tr[QA>>0]=0|tr[pe>>0],tr[DA>>0]=0|tr[pe+a>>0],tr[EA>>0]=0|tr[pe+t>>0],tr[gA>>0]=0|tr[pe+c>>0],tr[BA>>0]=0|tr[pe+l>>0],tr[mA>>0]=0|tr[pe+u>>0],tr[GA>>0]=0|tr[pe+b>>0],tr[CA>>0]=0|tr[pe+s>>0],tr[d>>0]=0|tr[pe+o>>0],tr[S>>0]=0|tr[pe+k>>0],tr[w>>0]=0|tr[pe+h>>0],tr[T>>0]=0|tr[pe+v>>0],tr[g>>0]=0|tr[pe+m>>0],tr[O>>0]=0|tr[pe+Z>>0],tr[y>>0]=0|tr[pe+p>>0],tr[H>>0]=0|tr[pe+B>>0],tr[X>>0]=0|tr[pe+E>>0],tr[j>>0]=0|tr[pe+W>>0],tr[C>>0]=0|tr[pe+I>>0],tr[U>>0]=0|tr[pe+G>>0],tr[F>>0]=0|tr[pe+V>>0],tr[z>>0]=0|tr[pe+R>>0],tr[_>>0]=0|tr[pe+N>>0],tr[x>>0]=0|tr[pe+ye>>0],KA=0|tr[pe+Y>>0],tr[IA>>0]=KA,zA=0|tr[pe+Q>>0],tr[yA>>0]=zA,qA=0|tr[pe+D>>0],tr[WA>>0]=qA,jA=0|tr[pe+J>>0],tr[pA>>0]=jA,$A=0|tr[pe+Be>>0],tr[XA>>0]=$A,HA=0|tr[pe+M>>0],tr[ZA>>0]=HA,re=0|tr[pe+Ee>>0],tr[FA>>0]=re,ee=0|tr[pe+Xe>>0],tr[VA>>0]=ee,n=we>>(fe=0|ar[cA>>2]),(0|(te=A>>fe))<=-1){n=10;break A}if((0|(ae=0|ar[lA>>2]))<=(0|te)){n=10;break A}if((0|n)<=-1){n=13;break A}if((0|(oe=0|ar[uA>>2]))<=(0|n)){n=13;break A}if(le=0|ar[bA>>2],ce=(ne=0|br(ae,n))+te|0,ie=A+-1|0,i=he>>fe,!(-1<(0|(n=(e?ie:A)>>fe))&(0|n)<(0|ae))){n=15;break A}if(!(-1<(0|i)&(0|i)<(0|oe))){n=17;break A}if(UA=le+(3*((0|br(ae,i))+n|0)|0)+2|0,UA=1+(0|tr[le+(3*ce|0)+2>>0])+(0|tr[UA>>0])>>1,n=A>>(i=0|ar[sA>>2]),i=we>>i,(0|n)<=-1){n=20;break A}if((0|(A=0|ar[dA>>2]))<=(0|n)){n=20;break A}if((0|i)<=-1){n=23;break A}if((0|i)>=(0|ar[kA>>2])){n=23;break A}de=(0|ar[hA>>2])+(24*((0|br(A,i))+n|0)|0)+2|0,de=0|ar[(0|ar[wA>>2])+(lr[de>>1]<<2)>>2],Ae=(0|ar[de+756>>2])+UA|0,Ae=cr[48154+((0|Ae)<0?0:(0|Ae)<51?Ae:51)>>0]<<vA,de=(SA<<1&255)-2+UA+(0|ar[de+760>>2])|0,de=cr[48100+((0|de)<0?0:(0|de)<53?de:53)>>0]<<vA,SA=(0|(SA=(255&(xA=0|tr[mA>>0]))-((255&(OA=0|tr[gA>>0]))<<1)+(PA=255&(UA=0|tr[DA>>0]))|0))<0?0-SA|0:SA,HA=(0|(HA=(255&HA)-((255&jA)<<1)+(LA=255&zA)|0))<0?0-HA|0:HA,n=(se=(0|(se=(255&(jA=0|tr[BA>>0]))-((255&(be=0|tr[EA>>0]))<<1)+(i=255&(ue=0|tr[QA>>0]))|0))<0?0-se|0:se)+SA|0,A=(KA=(0|(KA=(255&$A)-((255&qA)<<1)+(zA=255&KA)|0))<0?0-KA|0:KA)+HA|0,HA=HA+SA|0,KA=KA+se|0;e:do{if((A+n|0)<(0|Ae)){SA=Ae>>2;do{if((n<<1|0)<(0|SA)){if(se=(0|cr[CA>>0])-PA|0,(Ae>>3|0)<=(((0|($A=i-(0|cr[GA>>0])|0))<0?0-$A|0:$A)+((0|se)<0?0-se|0:se)|0)){i=0;break}i=(0|((0|(i=PA-i|0))<0?0-i|0:i))<(1+(5*de|0)>>1|0)}else i=0}while(0);do{if((A<<1|0)<(0|SA)){if((Ae>>3|0)<=(((0|(re=zA-(255&re)|0))<0?0-re|0:re)+((0|(se=(255&ee)-LA|0))<0?0-se|0:se)|0)){n=0;break}n=(0|((0|(n=LA-zA|0))<0?0-n|0:n))<(1+(5*de|0)>>1|0)}else n=0}while(0);if(se=i&n,zA=(Ae>>1)+Ae>>3,A=(SA=0|tr[iA>>0])<<24>>24!=0,e){if(n=-1<(0|(i=ie>>fe)),A){if(!(n&(0|i)<(0|ae))){n=34;break A}A=(65535&(cr[(A=le+(3*(ne+i|0)|0)|0)>>0]|cr[A+1>>0]<<8))>>>10&1^1}else{if(!n){n=38;break A}A=1}if((0|ae)<=(0|i)){n=38;break A}i=le+(3*(ne+i|0)|0)|0,fe=(n=SA<<24>>24?0==(1024&(cr[(n=le+(3*ce|0)|0)>>0]|cr[n+1>>0]<<8)):1)&0==(2048&(cr[(fe=le+(3*ce|0)|0)>>0]|cr[fe+1>>0]<<8)),Ae=A<<24>>24?0==(2048&(cr[i>>0]|cr[i+1>>0]<<8)):0}else{if(n=-1<(0|(i=me>>fe)),A){if(!(n&(0|i)<(0|oe))){n=44;break A}A=le+(3*((0|br(ae,i))+te|0)|0)|0,A=0==(1024&(cr[A>>0]|cr[A+1>>0]<<8))}else{if(!n){n=48;break A}A=1}if((0|oe)<=(0|i)){n=48;break A}i=le+(3*((0|br(ae,i))+te|0)|0)|0,fe=(n=SA<<24>>24?0==(1024&(cr[(n=le+(3*ce|0)|0)>>0]|cr[n+1>>0]<<8)):1)&0==(2048&(cr[(fe=le+(3*ce|0)|0)>>0]|cr[fe+1>>0]<<8)),Ae=A&0==(2048&(cr[i>>0]|cr[i+1>>0]<<8))}for(ee=de<<1,re=10*de|0,ie=0-de|0,$A=(0|zA)<=(0|HA)|1^Ae,qA=(0|zA)<=(0|KA)|1^fe,KA=0-(LA=de>>1)|0,PA=0,i=ue,A=be;;){zA=ge+(Ze+(HA=0|br(RA,PA)))|0;do{if(se){ue=0|tr[QA+(PA<<2)+3>>0],le=255&A,SA=(ce=255&UA)+ee|0,UA=255&((0|(UA=(A=4+(ce<<1)|0)+((ae=255&OA)<<1)+(be=255&xA)+(n=(i&=255)<<1)+le>>3))<(0|(oe=ce-ee|0))?oe:(0|SA)<(0|UA)?SA:UA),OA=ae+ee|0,SA=255&((0|(SA=(ce+2+ae+be+i|0)>>>2))<(0|(oe=ae-ee|0))?oe:(0|OA)<(0|SA)?OA:SA),OA=(ce+4+ae+(3*be|0)+i+(cr[DA+(PA<<2)+3>>0]<<1)|0)>>>3,oe=be-ee|0,be=be+ee|0,OA=255&((0|OA)<(0|oe)?oe:(0|be)<(0|OA)?be:OA),n=A+ae+n+(le<<1)+(be=255&jA)>>3,A=i+ee|0,n=255&((0|n)<(0|(ae=i-ee|0))?ae:(0|A)<(0|n)?A:n),tr[JA>>0]=n,A=i+ce+le|0,ce=le-ee|0,le=le+ee|0,i=255&((0|(i=(be+2+A|0)>>>2))<(0|ce)?ce:(0|le)<(0|i)?le:i),tr[fA>>0]=i,A=(A+4+(3*be|0)+((255&ue)<<1)|0)>>>3,ue=be-ee|0,be=be+ee|0,A=255&((0|A)<(0|ue)?ue:(0|be)<(0|A)?be:A),tr[nA>>0]=A;do{if(e){if(!Ae){if(!fe)break;tr[zA>>0]=0|tr[JA>>0],tr[zA+1>>0]=0|tr[JA+1>>0],tr[zA+2>>0]=0|tr[JA+2>>0];break}if(tr[pe+(HA+-1)>>0]=UA,fe){tr[pe+HA>>0]=n,tr[pe+(HA+-2)>>0]=SA,tr[pe+(HA+1)>>0]=i,tr[pe+(HA+-3)>>0]=OA,tr[pe+(HA+2)>>0]=A;break}tr[pe+(HA+-2)>>0]=SA,tr[pe+(HA+-3)>>0]=OA;break}if(!Ae){if(!fe)break;tr[pe+PA>>0]=n,tr[pe+(RA+PA)>>0]=i,tr[pe+(rA+PA)>>0]=A;break}if(tr[pe+(PA-RA)>>0]=UA,fe){tr[pe+PA>>0]=n,tr[pe+(PA-q)>>0]=SA,tr[pe+(RA+PA)>>0]=i,tr[pe+(PA+$)>>0]=OA,tr[pe+(q+PA)>>0]=A;break}tr[pe+(PA-AA)>>0]=SA,tr[pe+(PA+eA)>>0]=OA;break}while(0)}else{if((0|re)<=(0|((0|(n=8+(9*((SA=255&i)-(UA&=255)|0)|0)+(0|br((A&=255)-(i=255&OA)|0,-3))>>4))<0?0-n|0:n)))break;n=(0|n)<(0|ie)?ie:(0|de)<(0|n)?de:n;do{if(e){if(Ae&&(be=n+UA|0,tr[pe+(HA+-1)>>0]=(0|be)<0?0:255&((0|be)<(0|P)?be:L)),!fe)break;be=SA-n|0,tr[pe+HA>>0]=(0|be)<0?0:255&((0|be)<(0|P)?be:L)}else{if(Ae&&(be=n+UA|0,tr[pe+(PA-RA)>>0]=(0|be)<0?0:255&((0|be)<(0|P)?be:L)),!fe)break;be=SA-n|0,tr[pe+PA>>0]=(0|be)<0?0:255&((0|be)<(0|P)?be:L)}}while(0);if($A||(be=((0|(ue=(be=n+(((UA+1+(255&xA)|0)>>>1)-i)|0)>>1))<(0|KA)?KA:((0|LA)<(0|ue)?de:be)>>1)+i|0,tr[pe+(e?HA+-2|0:PA-K|0)>>0]=(0|be)<0?0:255&((0|be)<(0|P)?be:L)),qA)break;ue=((0|(be=(ue=((SA+1+(255&jA)|0)>>>1)-A-n|0)>>1))<(0|KA)?KA:((0|LA)<(0|be)?de:ue)>>1)+A|0,be=0|br(e?PA:1,RA),tr[pe+(be+(e?1:PA))>>0]=(0|ue)<0?0:255&((0|ue)<(0|P)?ue:L)}}while(0);if(4==(0|(n=PA+1|0)))break e;xA=0|tr[DA+((PA=n)<<2)+2>>0],OA=0|tr[DA+(n<<2)+1>>0],UA=0|tr[DA+(n<<2)>>0],i=0|tr[QA+(n<<2)>>0],A=0|tr[QA+(n<<2)+1>>0],jA=0|tr[QA+(n<<2)+2>>0]}}}while(0)}ke=ke+MA|0}while((0|ke)<(0|Ie))}if((0|We)<=(0|(r=r+NA|0))){n=5;break}}switch(0|n){case 5:return void(ur=TA);case 10:sr(48482,48519,118,48539);break;case 13:sr(48543,48519,119,48539);break;case 15:sr(48482,48519,118,48539);break;case 17:sr(48543,48519,119,48539);break;case 20:sr(48482,48519,118,48539);break;case 23:sr(48543,48519,119,48539);break;case 34:case 38:sr(48482,48519,118,48539);break;case 44:case 48:sr(48543,48519,119,48539)}}}function Et(A,e,r,i,f,n){e|=0,r|=0,i|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p,y,B,E,X,W,I,C,G,V,F,R,N,_,Y,Q,D,J,M,T,U,S,O,z,j,H,x,P,L,K,q,$,AA,eA,rA,iA,fA,nA,tA,oA,aA,cA,lA,uA,bA,sA,dA,kA,hA,wA,vA,mA,gA,ZA,pA,yA,BA,EA,XA,WA,IA,CA,GA,VA,FA,RA,NA,_A,YA,QA,DA,JA,MA,TA=0,UA=0,SA=0,OA=0,zA=0,jA=0,HA=0,xA=0,PA=0,LA=0,KA=0,qA=0,$A=0,Ae=0,ee=0,re=0,ie=0,fe=0,ne=0,te=0,oe=0,ae=0,ce=0,le=0,ue=0;if(ur=(MA=ur)+32|0,QA=MA+16|0,DA=MA,JA=0|ar[(A|=0)+5780>>2],FA=0|ar[A+5784>>2],RA=0|br(JA,e?2:1),NA=0|br(FA,e?1:2),VA=0|ar[(_A=A+44|0)>>2],ue=(0|n)<(0|(ue=0|ar[(YA=A+10472|0)>>2]))?n:ue,s=A+5768|0,(0|(le=(0|i)<(0|(le=0|ar[A+10476>>2]))?i:le))<=(0|r))ur=MA;else{d=(0|f)<(0|ue),k=3-JA|0,h=3-FA|0,w=A+10460|0,v=A+5956|0,m=A+5952|0,g=A+10368|0,Z=A+10372|0,p=A+10376|0,y=A+10360|0,B=A+5776|0,E=A+10348|0,X=A+10352|0,W=A+10356|0,I=A+10340|0,C=A+48|0,G=A+5480|0,F=65535+(V=1<<ar[s>>2])|0,R=VA<<1,N=0|br(VA,-2),Y=VA-1|0,J=(Q=VA<<1)-1|0,U=(M=3*VA|0)-1|0,O=1+VA|0,j=VA-2|0,H=1|Q,P=Q-2|0,L=1+M|0,q=M-2|0,cA=VA<<1,dA=3*VA|0,wA=eA=_=DA+2|0,vA=rA=t=2+QA|0,mA=iA=o=10+QA|0,gA=fA=z=DA+10|0,ZA=nA=D=DA+4|0,pA=tA=c=4+QA|0,yA=oA=l=12+QA|0,BA=aA=x=DA+12|0,EA=lA=T=DA+6|0,XA=uA=u=6+QA|0,WA=bA=b=14+QA|0,IA=sA=K=DA+14|0,GA=kA=$=a=8+QA|0,CA=hA=AA=S=DA+8|0;A:for(;;){if(d){ae=(0|(oe=0|br(te=r<<h,FA)))/4|0,ce=oe+-1|0,re=e?oe:ce,Ae=f;do{if(fe=0|br(ie=Ae<<k,JA),n=(0|br(0|ar[YA>>2],ae))+((0|fe)/4|0)|0,1<(255&(n=3&tr[(0|ar[w>>2])+n>>0]))){ne=fe+-1|0,ee=e?ne:fe,qA=(n<<1&255)-2|0,KA=0;do{if(TA=0|ar[(0==(0|KA)?m:v)>>2],$A=(n=0|ar[A+4+((KA=KA+1|0)<<2)>>2])+(i=(0|br(0|ar[_A>>2],te))+ie<<1)|0,e?(or[DA>>1]=0|or[$A>>1],or[QA>>1]=0|or[$A+-2>>1],or[_>>1]=0|or[$A+(VA<<1)>>1],or[t>>1]=0|or[$A+(Y<<1)>>1],or[D>>1]=0|or[$A+(Q<<1)>>1],or[c>>1]=0|or[$A+(J<<1)>>1],or[T>>1]=0|or[$A+(M<<1)>>1],or[u>>1]=0|or[$A+(U<<1)>>1],or[S>>1]=0|or[$A+2>>1],or[a>>1]=0|or[$A+-4>>1],or[z>>1]=0|or[$A+(O<<1)>>1],or[o>>1]=0|or[$A+(j<<1)>>1],or[x>>1]=0|or[$A+(H<<1)>>1],or[l>>1]=0|or[$A+(P<<1)>>1],or[K>>1]=0|or[$A+(L<<1)>>1],or[b>>1]=0|or[$A+(q<<1)>>1]):(PA=N+i|0,xA=lr[(xA=(LA=xA=$A)+4|0)>>1]|lr[xA+2>>1]<<16,ar[(HA=DA)>>2]=lr[LA>>1]|lr[LA+2>>1]<<16,ar[HA+4>>2]=xA,HA=lr[(HA=(xA=HA=n+PA|0)+4|0)>>1]|lr[HA+2>>1]<<16,ar[(LA=QA)>>2]=lr[xA>>1]|lr[xA+2>>1]<<16,ar[LA+4>>2]=HA,LA=lr[(LA=(HA=LA=n+(i+R)|0)+4|0)>>1]|lr[LA+2>>1]<<16,ar[(xA=CA)>>2]=lr[HA>>1]|lr[HA+2>>1]<<16,ar[xA+4>>2]=LA,PA=lr[(PA=(xA=PA=n+(PA+N)|0)+4|0)>>1]|lr[PA+2>>1]<<16,ar[(LA=GA)>>2]=lr[xA>>1]|lr[xA+2>>1]<<16,ar[LA+4>>2]=PA),n=oe>>(SA=0|ar[g>>2]),(0|(zA=fe>>SA))<=-1){n=14;break A}if((0|(HA=0|ar[Z>>2]))<=(0|zA)){n=14;break A}if((0|n)<=-1){n=17;break A}if((0|(jA=0|ar[p>>2]))<=(0|n)){n=17;break A}if(PA=0|ar[y>>2],xA=(OA=0|br(HA,n))+zA|0,i=re>>SA,!(-1<(0|(n=ee>>SA))&(0|n)<(0|HA))){n=19;break A}if(!(-1<(0|i)&(0|i)<(0|jA))){n=21;break A}n=PA+(3*((0|br(HA,i))+n|0)|0)+2|0,n=(1+(0|tr[PA+(3*xA|0)+2>>0])+(0|tr[n>>0])>>1)+TA|0;do{if(1==(0|ar[B>>2])){if(30<=(0|n)){if(42<(0|n)){n=n+-6|0;break}n=0|ar[8020+(n+-30<<2)>>2];break}}else n=(0|n)<51?n:51}while(0);if(i=fe>>(TA=0|ar[E>>2]),TA=oe>>TA,(0|i)<=-1){n=30;break A}if((0|(UA=0|ar[X>>2]))<=(0|i)){n=30;break A}if((0|TA)<=-1){n=33;break A}if((0|TA)>=(0|ar[W>>2])){n=33;break A}LA=(0|ar[I>>2])+(24*((0|br(UA,TA))+i|0)|0)+2|0,LA=qA+n+(0|ar[760+(0|ar[(0|ar[C>>2])+(lr[LA>>1]<<2)>>2])>>2])|0,LA=cr[48100+((0|LA)<0?0:(0|LA)<53?LA:53)>>0]<<(0|ar[s>>2])-8,UA=0==(0|tr[G>>0]);e:do{if(e){if(n=-1<(0|(i=ne>>SA)),UA){if(!n){n=41;break A}TA=1}else{if(!(n&(0|i)<(0|HA))){n=37;break A}TA=0==(1024&(cr[(TA=PA+(3*(OA+i|0)|0)|0)>>0]|cr[TA+1>>0]<<8))}if((0|HA)<=(0|i)){n=41;break A}if(i=PA+(3*(OA+i|0)|0)|0,SA=(n=UA?1:0==(1024&(cr[(n=PA+(3*xA|0)|0)>>0]|cr[n+1>>0]<<8)))&0==(2048&(cr[(SA=PA+(3*xA|0)|0)>>0]|cr[SA+1>>0]<<8)),OA=0-LA|0,TA&0==(2048&(cr[i>>0]|cr[i+1>>0]<<8)))for(n=0;;)if(i=DA+(n<<1)|0,PA=0|lr[QA+(n<<1)>>1],PA=(TA=(0|(TA=4+(0|lr[8+QA+(n<<1)>>1])+((0|lr[i>>1])-PA<<2)-(0|lr[DA+8+(n<<1)>>1])>>3))<(0|OA)?OA:(0|LA)<(0|TA)?LA:TA)+PA|0,UA=0|br(n,VA),or[$A+(UA+-1<<1)>>1]=(0|PA)<0?0:65535&((0|PA)<(0|V)?PA:F),SA&&(PA=(0|lr[i>>1])-TA|0,or[$A+(UA<<1)>>1]=(0|PA)<0?0:65535&((0|PA)<(0|V)?PA:F)),4==(0|(n=n+1|0)))break e;if(n=0|lr[DA>>1],i=4+(0|lr[$>>1])+(n-(0|lr[QA>>1])<<2)-(0|lr[AA>>1])>>3,SA&&(PA=n-((0|i)<(0|OA)?OA:(0|LA)<(0|i)?LA:i)|0,or[$A>>1]=(0|PA)<0?0:65535&((0|PA)<(0|V)?PA:F)),n=0|lr[eA>>1],i=4+(0|lr[iA>>1])+(n-(0|lr[rA>>1])<<2)-(0|lr[fA>>1])>>3,SA&&(PA=n-((0|i)<(0|OA)?OA:(0|LA)<(0|i)?LA:i)|0,or[$A+(VA<<1)>>1]=(0|PA)<0?0:65535&((0|PA)<(0|V)?PA:F)),n=0|lr[nA>>1],i=4+(0|lr[oA>>1])+(n-(0|lr[tA>>1])<<2)-(0|lr[aA>>1])>>3,SA&&(PA=n-((0|i)<(0|OA)?OA:(0|LA)<(0|i)?LA:i)|0,or[$A+(cA<<1)>>1]=(0|PA)<0?0:65535&((0|PA)<(0|V)?PA:F)),n=0|lr[lA>>1],i=4+(0|lr[bA>>1])+(n-(0|lr[uA>>1])<<2)-(0|lr[sA>>1])>>3,!SA)break;LA=n-((0|i)<(0|OA)?OA:(0|LA)<(0|i)?LA:i)|0,or[$A+(dA<<1)>>1]=(0|LA)<0?0:65535&((0|LA)<(0|V)?LA:F)}else{if(n=-1<(0|(i=ce>>SA)),UA){if(!n){n=57;break A}TA=1}else{if(!(n&(0|i)<(0|jA))){n=53;break A}TA=PA+(3*((0|br(HA,i))+zA|0)|0)|0,TA=0==(1024&(cr[TA>>0]|cr[TA+1>>0]<<8))}if((0|jA)<=(0|i)){n=57;break A}if(i=PA+(3*((0|br(HA,i))+zA|0)|0)|0,UA=(n=UA?1:0==(1024&(cr[(n=PA+(3*xA|0)|0)>>0]|cr[n+1>>0]<<8)))&0==(2048&(cr[(UA=PA+(3*xA|0)|0)>>0]|cr[UA+1>>0]<<8)),SA=0-LA|0,!(TA&0==(2048&(cr[i>>0]|cr[i+1>>0]<<8)))){if(!UA)break;xA=(PA=0|lr[DA>>1])-((0|(xA=4+(0|lr[kA>>1])+(PA-(0|lr[QA>>1])<<2)-(0|lr[hA>>1])>>3))<(0|SA)?SA:(0|LA)<(0|xA)?LA:xA)|0,or[$A>>1]=(0|xA)<0?0:65535&((0|xA)<(0|V)?xA:F),PA=(xA=0|lr[wA>>1])-((0|(PA=4+(0|lr[mA>>1])+(xA-(0|lr[vA>>1])<<2)-(0|lr[gA>>1])>>3))<(0|SA)?SA:(0|LA)<(0|PA)?LA:PA)|0,or[$A+2>>1]=(0|PA)<0?0:65535&((0|PA)<(0|V)?PA:F),xA=(PA=0|lr[ZA>>1])-((0|(xA=4+(0|lr[yA>>1])+(PA-(0|lr[pA>>1])<<2)-(0|lr[BA>>1])>>3))<(0|SA)?SA:(0|LA)<(0|xA)?LA:xA)|0,or[$A+4>>1]=(0|xA)<0?0:65535&((0|xA)<(0|V)?xA:F),LA=(xA=0|lr[EA>>1])-((0|(PA=4+(0|lr[WA>>1])+(xA-(0|lr[XA>>1])<<2)-(0|lr[IA>>1])>>3))<(0|SA)?SA:(0|LA)<(0|PA)?LA:PA)|0,or[$A+6>>1]=(0|LA)<0?0:65535&((0|LA)<(0|V)?LA:F);break}for(n=0;i=DA+(n<<1)|0,PA=0|lr[QA+(n<<1)>>1],PA=(TA=(0|(TA=4+(0|lr[8+QA+(n<<1)>>1])+((0|lr[i>>1])-PA<<2)-(0|lr[DA+8+(n<<1)>>1])>>3))<(0|SA)?SA:(0|LA)<(0|TA)?LA:TA)+PA|0,or[$A+(n-VA<<1)>>1]=(0|PA)<0?0:65535&((0|PA)<(0|V)?PA:F),UA&&(PA=(0|lr[i>>1])-TA|0,or[$A+(n<<1)>>1]=(0|PA)<0?0:65535&((0|PA)<(0|V)?PA:F)),4!=(0|(n=n+1|0)););}}while(0)}while((0|KA)<2)}Ae=Ae+RA|0}while((0|Ae)<(0|ue))}if((0|le)<=(0|(r=r+NA|0))){n=5;break}}switch(0|n){case 5:return void(ur=MA);case 14:sr(48482,48519,118,48539);break;case 17:sr(48543,48519,119,48539);break;case 19:sr(48482,48519,118,48539);break;case 21:sr(48543,48519,119,48539);break;case 30:sr(48482,48519,118,48539);break;case 33:sr(48543,48519,119,48539);break;case 37:case 41:sr(48482,48519,118,48539);break;case 53:case 57:sr(48543,48519,119,48539)}}}function Xt(A,e,r,i,f,n){e|=0,r|=0,i|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p,y,B,E,X,W,I,C,G,V,F,R,N,_,Y,Q,D,J,M,T,U,S,O,z,j,H,x,P,L,K,q,$,AA,eA,rA,iA,fA,nA,tA,oA,aA,cA,lA,uA,bA,sA,dA,kA,hA,wA,vA,mA,gA,ZA,pA,yA,BA,EA,XA,WA,IA,CA,GA,VA,FA,RA,NA,_A,YA,QA,DA,JA,MA,TA,UA,SA,OA,zA,jA,HA,xA,PA,LA,KA,qA,$A,Ae,ee,re,ie,fe,ne,te,oe,ae,ce,le,ue,be,se,de,ke,he,we,ve,me,ge,Ze,pe=0,ye=0,Be=0,Ee=0,Xe=0,We=0,Ie=0,Ce=0,Ge=0,Ve=0,Fe=0,Re=0,Ne=0,_e=0,Ye=0,Qe=0,De=0,Je=0,Me=0,Te=0,Ue=0,Se=0,Oe=0,ze=0,je=0,He=0;if(ur=(Ze=ur)+16|0,ve=Ze+8|0,me=Ze,ge=0|ar[(A|=0)+5780>>2],se=0|ar[A+5784>>2],de=0|br(ge,e?2:1),ke=0|br(se,e?1:2),be=0|ar[(he=A+44|0)>>2],He=(0|n)<(0|(He=0|ar[(we=A+10472|0)>>2]))?n:He,O=A+5768|0,(0|(je=(0|i)<(0|(je=0|ar[A+10476>>2]))?i:je))<=(0|r))ur=Ze;else{z=(0|f)<(0|He),j=3-ge|0,H=3-se|0,x=A+10460|0,P=A+5956|0,L=A+5952|0,K=A+10368|0,q=A+10372|0,$=A+10376|0,AA=A+10360|0,eA=A+5776|0,rA=A+10348|0,iA=A+10352|0,fA=A+10356|0,nA=A+10340|0,tA=A+48|0,oA=A+5480|0,cA=255+(aA=1<<ar[O>>2])|0,lA=0-be|0,kA=(sA=be<<1)-1|0,vA=(hA=3*be|0)-1|0,gA=1+be|0,pA=be-2|0,yA=1|sA,EA=sA-2|0,XA=1+hA|0,IA=hA-2|0,_A=bA=be-1|0,TA=(MA=be<<1)-1|0,HA=(jA=3*be|0)-1|0,fe=be<<1,ce=3*be|0,m=1-be|0,B=2-be|0,C=3-be|0,F=k=LA=VA=uA=me+1|0,R=h=KA=FA=t=1+ve|0,N=w=qA=RA=o=5+ve|0,_=v=$A=NA=ZA=me+5|0,Y=g=Ae=YA=dA=me+2|0,Q=Z=ee=QA=c=2+ve|0,D=p=re=DA=l=6+ve|0,J=y=ie=JA=BA=me+6|0,M=E=ne=UA=wA=me+3|0,T=X=te=SA=u=3+ve|0,U=W=oe=OA=b=7+ve|0,S=I=ae=zA=WA=me+7|0,ue=G=s=xA=CA=a=4+ve|0,le=V=d=PA=GA=mA=me+4|0;A:for(;;){if(z){Te=(0|(Me=0|br(Je=r<<H,se)))/4|0,Ue=Me+-1|0,De=e?Me:Ue,Ye=f;do{if(Oe=0|br(Se=Ye<<j,ge),n=(0|br(0|ar[we>>2],Te))+((0|Oe)/4|0)|0,1<(255&(n=3&tr[(0|ar[x>>2])+n>>0]))){ze=Oe+-1|0,Qe=e?ze:Oe,Re=(n<<1&255)-2|0,Ne=Se-be|0,Fe=0;do{if(ye=0|ar[(0==(0|Fe)?L:P)>>2],_e=(n=0|ar[A+4+((Fe=Fe+1|0)<<2)>>2])+(pe=(i=0|br(0|ar[he>>2],Je))+Se|0)|0,e?(tr[me>>0]=0|tr[_e>>0],tr[ve>>0]=0|tr[_e+-1>>0],tr[uA>>0]=0|tr[_e+be>>0],tr[t>>0]=0|tr[_e+bA>>0],tr[dA>>0]=0|tr[_e+sA>>0],tr[c>>0]=0|tr[_e+kA>>0],tr[wA>>0]=0|tr[_e+hA>>0],tr[u>>0]=0|tr[_e+vA>>0],tr[mA>>0]=0|tr[_e+1>>0],tr[a>>0]=0|tr[_e+-2>>0],tr[ZA>>0]=0|tr[_e+gA>>0],tr[o>>0]=0|tr[_e+pA>>0],tr[BA>>0]=0|tr[_e+yA>>0],tr[l>>0]=0|tr[_e+EA>>0],tr[WA>>0]=0|tr[_e+XA>>0],tr[b>>0]=0|tr[_e+IA>>0]):(Ge=n+(Ve=Ne+i|0)|0,ar[me>>2]=cr[_e>>0]|cr[_e+1>>0]<<8|cr[_e+2>>0]<<16|cr[_e+3>>0]<<24,ar[ve>>2]=cr[Ge>>0]|cr[Ge+1>>0]<<8|cr[Ge+2>>0]<<16|cr[Ge+3>>0]<<24,Ve=n+(Ve-be)|0,Ge=n+(pe+be)|0,ar[le>>2]=cr[Ge>>0]|cr[Ge+1>>0]<<8|cr[Ge+2>>0]<<16|cr[Ge+3>>0]<<24,ar[ue>>2]=cr[Ve>>0]|cr[Ve+1>>0]<<8|cr[Ve+2>>0]<<16|cr[Ve+3>>0]<<24),n=Me>>(Be=0|ar[K>>2]),(0|(Xe=Oe>>Be))<=-1){n=14;break A}if((0|(Ie=0|ar[q>>2]))<=(0|Xe)){n=14;break A}if((0|n)<=-1){n=17;break A}if((0|(We=0|ar[$>>2]))<=(0|n)){n=17;break A}if(Ge=0|ar[AA>>2],Ce=(Ee=0|br(Ie,n))+Xe|0,i=De>>Be,!(-1<(0|(n=Qe>>Be))&(0|n)<(0|Ie))){n=19;break A}if(!(-1<(0|i)&(0|i)<(0|We))){n=21;break A}n=Ge+(3*((0|br(Ie,i))+n|0)|0)+2|0,n=(1+(0|tr[Ge+(3*Ce|0)+2>>0])+(0|tr[n>>0])>>1)+ye|0;do{if(1==(0|ar[eA>>2])){if(30<=(0|n)){if(42<(0|n)){n=n+-6|0;break}n=0|ar[8020+(n+-30<<2)>>2];break}}else n=(0|n)<51?n:51}while(0);if(i=Oe>>(pe=0|ar[rA>>2]),pe=Me>>pe,(0|i)<=-1){n=30;break A}if((0|(ye=0|ar[iA>>2]))<=(0|i)){n=30;break A}if((0|pe)<=-1){n=33;break A}if((0|pe)>=(0|ar[fA>>2])){n=33;break A}Ve=(0|ar[nA>>2])+(24*((0|br(ye,pe))+i|0)|0)+2|0,Ve=Re+n+(0|ar[760+(0|ar[(0|ar[tA>>2])+(lr[Ve>>1]<<2)>>2])>>2])|0,Ve=cr[48100+((0|Ve)<0?0:(0|Ve)<53?Ve:53)>>0]<<(0|ar[O>>2])-8,pe=0==(0|tr[oA>>0]);do{if(e){if(n=-1<(0|(i=ze>>Be)),pe){if(!n){n=41;break A}Be=1}else{if(!(n&(0|i)<(0|Ie))){n=37;break A}Be=0==(1024&(cr[(Be=Ge+(3*(Ee+i|0)|0)|0)>>0]|cr[Be+1>>0]<<8))}if((0|Ie)<=(0|i)){n=41;break A}if(ye=Ge+(3*(Ee+i|0)|0)|0,pe=(n=pe?1:0==(1024&(cr[(n=Ge+(3*Ce|0)|0)>>0]|cr[n+1>>0]<<8)))&0==(2048&(cr[(pe=Ge+(3*Ce|0)|0)>>0]|cr[pe+1>>0]<<8)),i=0-Ve|0,!(Be&0==(2048&(cr[ye>>0]|cr[ye+1>>0]<<8)))){if(!pe)break;Ce=(Ge=0|cr[me>>0])-((0|(Ce=4+(0|cr[xA>>0])+(Ge-(0|cr[ve>>0])<<2)-(0|cr[PA>>0])>>3))<(0|i)?i:(0|Ve)<(0|Ce)?Ve:Ce)|0,tr[_e>>0]=(0|Ce)<0?0:255&((0|Ce)<(0|aA)?Ce:cA),Ge=(Ce=0|cr[LA>>0])-((0|(Ge=4+(0|cr[qA>>0])+(Ce-(0|cr[KA>>0])<<2)-(0|cr[$A>>0])>>3))<(0|i)?i:(0|Ve)<(0|Ge)?Ve:Ge)|0,tr[_e+be>>0]=(0|Ge)<0?0:255&((0|Ge)<(0|aA)?Ge:cA),Ce=(Ge=0|cr[Ae>>0])-((0|(Ce=4+(0|cr[re>>0])+(Ge-(0|cr[ee>>0])<<2)-(0|cr[ie>>0])>>3))<(0|i)?i:(0|Ve)<(0|Ce)?Ve:Ce)|0,tr[_e+fe>>0]=(0|Ce)<0?0:255&((0|Ce)<(0|aA)?Ce:cA),Ve=(Ce=0|cr[ne>>0])-((0|(Ge=4+(0|cr[oe>>0])+(Ce-(0|cr[te>>0])<<2)-(0|cr[ae>>0])>>3))<(0|i)?i:(0|Ve)<(0|Ge)?Ve:Ge)|0,tr[_e+ce>>0]=(0|Ve)<0?0:255&((0|Ve)<(0|aA)?Ve:cA);break}if(Ge=0|cr[ve>>0],Ge=(n=(0|(n=4+(0|cr[CA>>0])+((0|cr[me>>0])-Ge<<2)-(0|cr[GA>>0])>>3))<(0|i)?i:(0|Ve)<(0|n)?Ve:n)+Ge|0,tr[_e+-1>>0]=(0|Ge)<0?0:255&((0|Ge)<(0|aA)?Ge:cA),pe&&(Ge=(0|cr[me>>0])-n|0,tr[_e>>0]=(0|Ge)<0?0:255&((0|Ge)<(0|aA)?Ge:cA)),Ge=0|cr[FA>>0],Ge=(n=(0|(n=4+(0|cr[RA>>0])+((0|cr[VA>>0])-Ge<<2)-(0|cr[NA>>0])>>3))<(0|i)?i:(0|Ve)<(0|n)?Ve:n)+Ge|0,tr[_e+_A>>0]=(0|Ge)<0?0:255&((0|Ge)<(0|aA)?Ge:cA),pe&&(Ge=(0|cr[VA>>0])-n|0,tr[_e+be>>0]=(0|Ge)<0?0:255&((0|Ge)<(0|aA)?Ge:cA)),Ge=0|cr[QA>>0],Ge=(n=(0|(n=4+(0|cr[DA>>0])+((0|cr[YA>>0])-Ge<<2)-(0|cr[JA>>0])>>3))<(0|i)?i:(0|Ve)<(0|n)?Ve:n)+Ge|0,tr[_e+TA>>0]=(0|Ge)<0?0:255&((0|Ge)<(0|aA)?Ge:cA),pe&&(Ge=(0|cr[YA>>0])-n|0,tr[_e+MA>>0]=(0|Ge)<0?0:255&((0|Ge)<(0|aA)?Ge:cA)),Ge=0|cr[SA>>0],Ve=(n=(0|(n=4+(0|cr[OA>>0])+((0|cr[UA>>0])-Ge<<2)-(0|cr[zA>>0])>>3))<(0|i)?i:(0|Ve)<(0|n)?Ve:n)+Ge|0,tr[_e+HA>>0]=(0|Ve)<0?0:255&((0|Ve)<(0|aA)?Ve:cA),!pe)break;Ve=(0|cr[UA>>0])-n|0,tr[_e+jA>>0]=(0|Ve)<0?0:255&((0|Ve)<(0|aA)?Ve:cA)}else{if(n=-1<(0|(i=Ue>>Be)),pe){if(!n){n=56;break A}Be=1}else{if(!(n&(0|i)<(0|We))){n=52;break A}Be=Ge+(3*((0|br(Ie,i))+Xe|0)|0)|0,Be=0==(1024&(cr[Be>>0]|cr[Be+1>>0]<<8))}if((0|We)<=(0|i)){n=56;break A}if(ye=Ge+(3*((0|br(Ie,i))+Xe|0)|0)|0,pe=(n=pe?1:0==(1024&(cr[(n=Ge+(3*Ce|0)|0)>>0]|cr[n+1>>0]<<8)))&0==(2048&(cr[(pe=Ge+(3*Ce|0)|0)>>0]|cr[pe+1>>0]<<8)),i=0-Ve|0,!(Be&0==(2048&(cr[ye>>0]|cr[ye+1>>0]<<8)))){if(!pe)break;Ce=(Ge=0|cr[me>>0])-((0|(Ce=4+(0|cr[G>>0])+(Ge-(0|cr[ve>>0])<<2)-(0|cr[V>>0])>>3))<(0|i)?i:(0|Ve)<(0|Ce)?Ve:Ce)|0,tr[_e>>0]=(0|Ce)<0?0:255&((0|Ce)<(0|aA)?Ce:cA),Ge=(Ce=0|cr[F>>0])-((0|(Ge=4+(0|cr[N>>0])+(Ce-(0|cr[R>>0])<<2)-(0|cr[_>>0])>>3))<(0|i)?i:(0|Ve)<(0|Ge)?Ve:Ge)|0,tr[_e+1>>0]=(0|Ge)<0?0:255&((0|Ge)<(0|aA)?Ge:cA),Ce=(Ge=0|cr[Y>>0])-((0|(Ce=4+(0|cr[D>>0])+(Ge-(0|cr[Q>>0])<<2)-(0|cr[J>>0])>>3))<(0|i)?i:(0|Ve)<(0|Ce)?Ve:Ce)|0,tr[_e+2>>0]=(0|Ce)<0?0:255&((0|Ce)<(0|aA)?Ce:cA),Ve=(Ce=0|cr[M>>0])-((0|(Ge=4+(0|cr[U>>0])+(Ce-(0|cr[T>>0])<<2)-(0|cr[S>>0])>>3))<(0|i)?i:(0|Ve)<(0|Ge)?Ve:Ge)|0,tr[_e+3>>0]=(0|Ve)<0?0:255&((0|Ve)<(0|aA)?Ve:cA);break}if(Ge=0|cr[ve>>0],Ge=(n=(0|(n=4+(0|cr[s>>0])+((0|cr[me>>0])-Ge<<2)-(0|cr[d>>0])>>3))<(0|i)?i:(0|Ve)<(0|n)?Ve:n)+Ge|0,tr[_e+lA>>0]=(0|Ge)<0?0:255&((0|Ge)<(0|aA)?Ge:cA),pe&&(Ge=(0|cr[me>>0])-n|0,tr[_e>>0]=(0|Ge)<0?0:255&((0|Ge)<(0|aA)?Ge:cA)),Ge=0|cr[h>>0],Ge=(n=(0|(n=4+(0|cr[w>>0])+((0|cr[k>>0])-Ge<<2)-(0|cr[v>>0])>>3))<(0|i)?i:(0|Ve)<(0|n)?Ve:n)+Ge|0,tr[_e+m>>0]=(0|Ge)<0?0:255&((0|Ge)<(0|aA)?Ge:cA),pe&&(Ge=(0|cr[k>>0])-n|0,tr[_e+1>>0]=(0|Ge)<0?0:255&((0|Ge)<(0|aA)?Ge:cA)),Ge=0|cr[Z>>0],Ge=(n=(0|(n=4+(0|cr[p>>0])+((0|cr[g>>0])-Ge<<2)-(0|cr[y>>0])>>3))<(0|i)?i:(0|Ve)<(0|n)?Ve:n)+Ge|0,tr[_e+B>>0]=(0|Ge)<0?0:255&((0|Ge)<(0|aA)?Ge:cA),pe&&(Ge=(0|cr[g>>0])-n|0,tr[_e+2>>0]=(0|Ge)<0?0:255&((0|Ge)<(0|aA)?Ge:cA)),Ge=0|cr[X>>0],Ve=(n=(0|(n=4+(0|cr[W>>0])+((0|cr[E>>0])-Ge<<2)-(0|cr[I>>0])>>3))<(0|i)?i:(0|Ve)<(0|n)?Ve:n)+Ge|0,tr[_e+C>>0]=(0|Ve)<0?0:255&((0|Ve)<(0|aA)?Ve:cA),!pe)break;Ve=(0|cr[E>>0])-n|0,tr[_e+3>>0]=(0|Ve)<0?0:255&((0|Ve)<(0|aA)?Ve:cA)}}while(0)}while((0|Fe)<2)}Ye=Ye+de|0}while((0|Ye)<(0|He))}if((0|je)<=(0|(r=r+ke|0))){n=5;break}}switch(0|n){case 5:return void(ur=Ze);case 14:sr(48482,48519,118,48539);break;case 17:sr(48543,48519,119,48539);break;case 19:sr(48482,48519,118,48539);break;case 21:sr(48543,48519,119,48539);break;case 30:sr(48482,48519,118,48539);break;case 33:sr(48543,48519,119,48539);break;case 37:case 41:sr(48482,48519,118,48539);break;case 52:case 56:sr(48543,48519,119,48539)}}}function Wt(A,e,r,i,f,n,t){r|=0,i|=0,f|=0,n|=0,t|=0;var o,a,c,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0;for((0|(l=(e|=0)>>(u=0|ar[(d=(A|=0)+10448|0)>>2])))<=-1&&sr(48482,48519,118,48539),o=A+10452|0,a=A+10456|0,c=A+10440|0,v=e,b=i,s=n,h=t,i=(w=r)>>u;;){if((0|(e=0|ar[o>>2]))<=(0|l)){e=4;break}if((0|i)<=-1){e=7;break}if((0|i)>=(0|ar[a>>2])){e=7;break}if(u=(0|ar[c>>2])+((0|br(e,i))+l)|0,k=1<<b,!((0|cr[u>>0])&1<<f)){e=9;break}if(i=(n=k>>1)+v|0,n=n+w|0,Wt(A,v,w,e=b+-1|0,f=f+1|0,s,h),Wt(A,i,w,e,f,16,h),Wt(A,v,n,e,f,s,32),(0|(l=i>>(t=0|ar[d>>2])))<=-1){e=4;break}v=i,b=e,s=16,h=32,i=(w=n)>>t}if(4==(0|e))sr(48482,48519,118,48539);else if(7==(0|e))sr(48543,48519,119,48539);else if(9==(0|e)){if(b=31==(0|b))return;for(i=255&s,f=(0|v)/4|0,n=A+10472|0,t=A+10476|0,l=A+10460|0,e=0;r=(e+w|0)/4|0,(0|f)<(0|(u=0|ar[n>>2]))&&(0|r)<(0|ar[t>>2])&&(d=(0|br(u,r))+f|0,d=(0|ar[l>>2])+d|0,tr[d>>0]=tr[d>>0]|i),(0|(e=e+4|0))<(0|k););if(b)return;for(u=255&h,t=(0|w)/4|0,l=A+10472|0,r=A+10476|0,i=A+10460|0,e=0;(0|(f=(e+v|0)/4|0))<(0|(n=0|ar[l>>2]))&&(0|t)<(0|ar[r>>2])&&(A=(0|br(n,t))+f|0,A=(0|ar[i>>2])+A|0,tr[A>>0]=tr[A>>0]|u),(0|(e=e+4|0))<(0|k););return}}function It(A,e,r,i,f,n){r|=0,i|=0,f|=0,n|=0;var t,o=0,a=0,c=0,l=0,u=0;switch(n=(e|=0)>>(o=0|ar[(A|=0)+10368>>2]),o=r>>o,(0|n)<=-1&&sr(48482,48519,118,48539),(0|(f=0|ar[A+10372>>2]))<=(0|n)&&sr(48482,48519,118,48539),(0|o)<=-1&&sr(48543,48519,119,48539),(0|o)>=(0|ar[A+10376>>2])&&sr(48543,48519,119,48539),u=(0|ar[A+10360>>2])+(3*((0|br(f,o))+n|0)|0)|0,t=1<<i,n=1<<i+-1,f=1<<i+-2,(65535&(cr[u>>0]|cr[u+1>>0]<<8))>>>3&7){case 3:if(31==(0|i))return;for(c=(n+e|0)/4|0,l=A+10472|0,u=A+10476|0,a=A+10460|0,i=(n+r|0)/4|0,o=0;f=(o+r|0)/4|0,(0|c)<(0|(n=0|ar[l>>2]))&&(0|f)<(0|ar[u>>2])&&(n=(0|br(n,f))+c|0,n=(0|ar[a>>2])+n|0,tr[n>>0]=64|tr[n>>0],n=0|ar[l>>2]),(0|(f=(o+e|0)/4|0))<(0|n)&&(0|i)<(0|ar[u>>2])&&(A=(0|br(n,i))+f|0,A=(0|ar[a>>2])+A|0,tr[A>>0]=-128|tr[A>>0]),(0|(o=o+1|0))<(0|t););return;case 2:if(31==(0|i))return;for(a=(n+e|0)/4|0,c=A+10472|0,l=A+10476|0,i=A+10460|0,f=0;n=(f+r|0)/4|0,(0|a)<(0|(o=0|ar[c>>2]))&&(0|n)<(0|ar[l>>2])&&(e=(0|br(o,n))+a|0,e=(0|ar[i>>2])+e|0,tr[e>>0]=64|tr[e>>0]),(0|(f=f+1|0))<(0|t););return;case 1:if(31==(0|i))return;for(a=(n+r|0)/4|0,c=A+10472|0,l=A+10476|0,i=A+10460|0,f=0;(0|(n=(f+e|0)/4|0))<(0|(o=0|ar[c>>2]))&&(0|a)<(0|ar[l>>2])&&(r=(0|br(o,a))+n|0,r=(0|ar[i>>2])+r|0,tr[r>>0]=-128|tr[r>>0]),(0|(f=f+1|0))<(0|t););return;case 6:if(31==(0|i))return;for(a=(f+e|0)/4|0,c=A+10472|0,l=A+10476|0,i=A+10460|0,f=0;n=(f+r|0)/4|0,(0|a)<(0|(o=0|ar[c>>2]))&&(0|n)<(0|ar[l>>2])&&(e=(0|br(o,n))+a|0,e=(0|ar[i>>2])+e|0,tr[e>>0]=64|tr[e>>0]),(0|(f=f+1|0))<(0|t););return;case 7:if(31==(0|i))return;for(a=(n+e+f|0)/4|0,c=A+10472|0,l=A+10476|0,i=A+10460|0,f=0;n=(f+r|0)/4|0,(0|a)<(0|(o=0|ar[c>>2]))&&(0|n)<(0|ar[l>>2])&&(e=(0|br(o,n))+a|0,e=(0|ar[i>>2])+e|0,tr[e>>0]=64|tr[e>>0]),(0|(f=f+1|0))<(0|t););return;case 4:if(31==(0|i))return;for(a=(f+r|0)/4|0,c=A+10472|0,l=A+10476|0,i=A+10460|0,f=0;(0|(n=(f+e|0)/4|0))<(0|(o=0|ar[c>>2]))&&(0|a)<(0|ar[l>>2])&&(r=(0|br(o,a))+n|0,r=(0|ar[i>>2])+r|0,tr[r>>0]=-128|tr[r>>0]),(0|(f=f+1|0))<(0|t););return;case 5:if(31==(0|i))return;for(a=(n+r+f|0)/4|0,c=A+10472|0,l=A+10476|0,i=A+10460|0,f=0;(0|(n=(f+e|0)/4|0))<(0|(o=0|ar[c>>2]))&&(0|a)<(0|ar[l>>2])&&(r=(0|br(o,a))+n|0,r=(0|ar[i>>2])+r|0,tr[r>>0]=-128|tr[r>>0]),(0|(f=f+1|0))<(0|t););return;default:return}}function Ct(A,e,r,i,f,n,t){A|=0,e|=0,r|=0,i|=0,n|=0,t|=0;var o=0,a=0,c=0;return t=(0|(c=(f|=0)?(f=e+-1>>(o=0|ar[t+10368>>2]),o=r>>o,(0|f)<=-1&&sr(48482,48519,118,48539),(0|(a=0|ar[t+10372>>2]))<=(0|f)&&sr(48482,48519,118,48539),(0|o)<=-1&&sr(48543,48519,119,48539),(0|o)>=(0|ar[t+10376>>2])&&sr(48543,48519,119,48539),c=(0|ar[t+10360>>2])+(3*((0|br(a,o))+f|0)|0)|0,1792&(cr[c>>0]|cr[c+1>>0]<<8)?1:0|cr[(0|ar[t+10400>>2])+(i+-1)>>0]):1))!=(0|(f=n?(f=e>>(o=0|ar[t+10368>>2]),o=r+-1>>o,(0|f)<=-1&&sr(48482,48519,118,48539),(0|(a=0|ar[t+10372>>2]))<=(0|f)&&sr(48482,48519,118,48539),(0|o)<=-1&&sr(48543,48519,119,48539),(0|o)>=(0|ar[t+10376>>2])&&sr(48543,48519,119,48539),n=(0|ar[t+10360>>2])+(3*((0|br(a,o))+f|0)|0)|0,0==(1792&(cr[n>>0]|cr[n+1>>0]<<8))&&(r>>(n=0|ar[t+5804>>2])<<n|0)<(0|r)?0|cr[(0|ar[t+10400>>2])+(i-(0|ar[t+5876>>2]))>>0]:1):1))?0!=(0|(ar[A>>2]=c))&0!=(0|(ar[A+4>>2]=f))?0:1!=(0|c)&1!=(0|f)?1:26:c>>>0<2?(ar[A>>2]=0,ar[A+4>>2]=1,26):(ar[A>>2]=c,ar[A+4>>2]=2+(c+29&31),2+((c+-1|0)%32|0)|0),void(ar[(A=A+8|0)>>2]=t)}function Gt(A,e,r,i,f,n){return A|=0,e|=0,r|=0,i|=0,f|=0,8<(0|ar[(0==(0|(n|=0))?A+5760|0:A+5768|0)>>2])?void function(A,e,r,i,f,n){i|=0;var t,o,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0;ur=(o=ur)+272|0,function(A,e,r,i,f,n){e|=0,r|=0,i|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w,v,m,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0,R=0,N=0,_=0,Y=0,Q=0,D=0,J=0,M=0,T=0,U=0,S=0,O=0,z=0,j=0,H=0,x=0,P=0,L=0,K=0,q=0,$=0,AA=0;ur=(m=ur)+144|0,v=(h=m)+64|0,w=0|ar[4+(A|=0)+((f|=0)<<2)>>2],c=0|ar[((f=0==(0|f))?A+40|0:A+44|0)>>2],L=f?q=1:(q=0|ar[A+5780>>2],0|ar[A+5784>>2]);k=0|ar[(f?A+5760|0:A+5768|0)>>2],Q=0|br(q,e),Y=0|br(L,r),C=0|ar[A+5804>>2],W=0|ar[A+5820>>2],F=(M=0!=(0|Q))&(V=1^(y=0==(0|Y))),I=Q+(0|br(q,i))|0,D=0|ar[A+1248>>2],N=(0|I)<(0|D)&V,B=Q>>C,p=Y>>C,E=Q+-1>>C,I>>=C,C=Y+-1>>C,g=0|ar[A+10352>>2],f=0|br(g,p),Z=0|ar[A+10340>>2],o=0|lr[Z+(24*(f+B|0)|0)>>1],J=M?0|lr[Z+(24*(f+E|0)|0)>>1]:-1;G=y?-1:(G=Z+(24*((0|br(g,C))+B|0)|0)|0,0|lr[G>>1]);R=N?(R=Z+(24*((0|br(g,C))+I|0)|0)|0,0|lr[R>>1]):-1;X=F?(X=Z+(24*((0|br(g,C))+E|0)|0)|0,0|lr[X>>1]):-1;f=0|br(p,W),p=0|ar[A+10308>>2],t=0|ar[p+(f+B<<2)>>2],_=M?0|ar[p+(f+E<<2)>>2]:-1;g=y?-1:(g=p+((0|br(C,W))+B<<2)|0,0|ar[g>>2]);Z=F?(Z=p+((0|br(C,W))+E<<2)|0,0|ar[Z>>2]):-1;f=N?(f=p+((0|br(C,W))+I<<2)|0,0|ar[f>>2]):-1;d=(0|G)==(0|o)&(0|g)==(0|t)&V,F=F&(0|X)==(0|o)&(0|Z)==(0|t),l=N&(0|R)==(0|o)&(0|f)==(0|t),u=0|ar[A+5864>>2],a=0|ar[A+5852>>2],K=(0|br(Y>>u,a))+(Q>>u)|0,b=0|ar[A+10320>>2],K=0|ar[b+(K<<2)>>2],f=(L+-1-Y+(0|ar[A+1252>>2])|0)/(0|L)|0,Y=(0|f)>(0|(s=i<<1))?s:f,Q=(0|(Q=(q+-1-Q+D|0)/(0|q)|0))>(0|s)?s:Q,vb(0-s+v|0,0,0|(D=i<<2|1)),g=Y+-1|0;A:do{if(0<(0|Y)&&(T=e+-1|0,U=0|br(q,T),S=A+10368|0,O=A+10372|0,z=A+10376|0,j=A+10360|0,M&(0|J)==(0|o)&(0|_)==(0|t))){for(C=64-((0|f)<(0|s)?f:s)|0,G=U>>u,V=0==(0|tr[A+5944>>0]),W=g,I=g=f=0;;){if(X=h+(C+(I<<2))|0,Z=0|br(E=W+r|0,L),y=b+((0|br(Z>>u,a))+G<<2)|0,y=(0|ar[y>>2])<=(0|K),V)y&&(H=29);else{if(M=0|ar[S>>2],Z>>=M,(0|(B=U>>M))<=-1){H=34;break}if((0|(p=0|ar[O>>2]))<=(0|B)){H=34;break}if((0|Z)<=-1){H=35;break}if((0|Z)>=(0|ar[z>>2])){H=35;break}M=(0|ar[j>>2])+(3*((0|br(p,Z))+B|0)|0)|0,y&0==(768&(cr[M>>0]|cr[M+1>>0]<<8))&&(H=29)}if(29==(0|H)&&(Z=w+(((H=0)|br(E,c))+T<<1)|0,g||(f=0|or[Z>>1]),tr[X>>0]=1,tr[X+1>>0]=1,tr[X+2>>0]=1,tr[X+3>>0]=1,or[n+(~W<<1)>>1]=0|or[Z>>1],M=w+((0|br(E+-1|0,c))+T<<1)|0,or[n+(1-W-1<<1)>>1]=0|or[M>>1],M=w+((0|br(E+-2|0,c))+T<<1)|0,or[n+(2-W-1<<1)>>1]=0|or[M>>1],M=w+((0|br(E+-3|0,c))+T<<1)|0,or[n+(3-W-1<<1)>>1]=0|or[M>>1],g=g+4|0),(0|(W=W+-4|0))<=-1){x=f,P=g;break A}I=I+1|0}34==(0|H)?sr(48482,48519,118,48539):35==(0|H)&&sr(48543,48519,119,48539)}else P=x=0}while(0);A:do{if(F){f=0|br(q,p=e+-1|0),g=0|br(L,y=r+-1|0),B=b+((0|br(g>>u,a))+(f>>u)<<2)|0,B=(0|ar[B>>2])<=(0|K);do{if(0|tr[A+5944>>0]){if(H=0|ar[A+10368>>2],Z=f>>H,f=g>>H,(0|Z)<=-1&&sr(48482,48519,118,48539),(0|(g=0|ar[A+10372>>2]))<=(0|Z)&&sr(48482,48519,118,48539),(0|f)<=-1&&sr(48543,48519,119,48539),(0|f)<(0|ar[A+10376>>2])){if(H=(0|ar[A+10360>>2])+(3*((0|br(g,f))+Z|0)|0)|0,B&0==(768&(cr[H>>0]|cr[H+1>>0]<<8)))break;g=P,f=x;break A}sr(48543,48519,119,48539)}else if(!B){g=P,f=x;break A}}while(0);g=w+((0|br(c,y))+p<<1)|0,f=P?x:0|or[g>>1],or[n>>1]=0|or[g>>1],tr[v>>0]=1,g=P+1|0}else g=P,f=x}while(0);A:do{if(0<(0|Q)){_=0|br(L,V=r+-1|0),Y=A+5944|0,V=0|br(c,V),F=A+10368|0,R=A+10372|0,N=A+10376|0,G=A+10360|0,C=0|br(_>>u,a),W=I=0;e:for(;;){X=h+(65+(W<<2))|0;do{if((0|I)<(0|i)?d:l){if(Z=0|br(B=I+e|0,q),E=(0|ar[b+(C+(Z>>u)<<2)>>2])<=(0|K),0|tr[Y>>0]){if(p=0|ar[F>>2],Z>>=p,p=_>>p,(0|Z)<=-1){H=55;break e}if((0|(y=0|ar[R>>2]))<=(0|Z)){H=55;break e}if((0|p)<=-1){H=58;break e}if((0|p)>=(0|ar[N>>2])){H=58;break e}if(A=(0|ar[G>>2])+(3*((0|br(y,p))+Z|0)|0)|0,!(E&0==(768&(cr[A>>0]|cr[A+1>>0]<<8))))break}else if(!E)break;p=w+((Z=B+V|0)<<1)|0,g||(f=0|or[p>>1]),A=1|I,tr[X>>0]=1,tr[X+1>>0]=1,tr[X+2>>0]=1,tr[X+3>>0]=1,or[n+(A<<1)>>1]=0|or[p>>1],or[n+(A+1<<1)>>1]=0|or[w+(Z+1<<1)>>1],or[n+((3|I)<<1)>>1]=0|or[w+(Z+2<<1)>>1],or[n+(A+3<<1)>>1]=0|or[w+(Z+3<<1)>>1],g=g+4|0}}while(0);if((0|Q)<=(0|(I=I+4|0))){$=g,AA=f;break A}W=W+1|0}55==(0|H)?sr(48482,48519,118,48539):58==(0|H)&&sr(48543,48519,119,48539)}else $=g,AA=f}while(0);if((0|$)==(0|D))return ur=m;if(f=0|br(i,-2),!$){if((0|s)<(0|f))return ur=m;for(g=1<<k-1&65535;or[n+(f<<1)>>1]=g,(0|f)<(0|s);)f=f+1|0;return ur=m}0|tr[v+f>>0]||(or[n+(f<<1)>>1]=AA);if((0|(f|=1))>(0|s))return ur=m;for(;0|tr[v+f>>0]||(or[n+(f<<1)>>1]=0|or[n+(f+-1<<1)>>1]),(0|f)<(0|s);)f=f+1|0;ur=m}(A|=0,e|=0,r|=0,f|=0,n|=0,t=o+128|0);do{if(!(0|tr[A+5753>>0])){if(0|n&&3!=(0|ar[A+5776>>2]))break;tc(A,t,f,n,i)}}while(0);switch(0|i){case 0:if(s=0|ar[(0==(0|n)?A+40|0:A+44|0)>>2],b=(0|ar[A+4+(n<<2)>>2])+((0|br(s,r))+e<<1)|0,1<(0|f)){for(i=f,A=0;3<i>>>0;)i>>>=1,A=A+1|0;i=A+2|0}else i=1;if((0|f)<=0)return ur=o;r=f+-1|0,n=t+(f+1<<1)|0,a=t+(~f<<1)|0,e=0;do{for(c=t+(~e<<1)|0,l=r-e|0,u=0|br(e,s),e=e+1|0,A=0;w=0|br(0|lr[c>>1],r-A|0),A=(d=A)+1|0,h=0|br(0|lr[n>>1],A),k=0|br(0|lr[t+(A<<1)>>1],l),k=w+f+h+k+(0|br(0|lr[a>>1],e))>>i&65535,or[b+(d+u<<1)>>1]=k,(0|A)!=(0|f););}while((0|e)!=(0|f));return ur=o;case 1:return function(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,n|=0;var t,o,a,c,l=0;if(c=0|ar[((o=0==(0|(f|=0)))?A+40|0:A+44|0)>>2],a=(0|ar[A+4+(f<<2)>>2])+((0|br(c,r))+e<<1)|0,t=1<(0|i)){for(A=i,e=0;3<A>>>0;)A>>>=1,e=e+1|0;r=e+2|0}else r=1;if(f=0<(0|i))for(A=e=0;A=(0|lr[n+((e=(l=e)+1|0)<<1)>>1])+A+(0|lr[n+(~l<<1)>>1])|0,(0|e)!=(0|i););else A=0;if(r=A+i>>r,!((0|i)<32&o)){if(!f)return;r&=65535,e=0;do{for(f=0|br(e,c),A=0;or[a+(A+f<<1)>>1]=r,(0|(A=A+1|0))!=(0|i););e=e+1|0}while((0|e)!=(0|i));return}if(or[a>>1]=(2+(r<<1)+(0|lr[n+-2>>1])+(0|lr[n+2>>1])|0)>>>2,!t)return;e=2+(3*r|0)|0,A=1;for(;A=(l=A)+1|0,or[a+(l<<1)>>1]=(e+(0|lr[n+(A<<1)>>1])|0)>>>2,(0|A)!=(0|i););if(!t)return;e=2+(3*r|0)|0,A=1;for(;l=a+((0|br(A,c))<<1)|0,or[l>>1]=(e+(0|lr[n+(~A<<1)>>1])|0)>>>2,A=A+1|0,(0|A)!=(0|i););if(!t)return;r&=65535,A=1;do{for(f=0|br(A,c),e=1;or[a+(e+f<<1)>>1]=r,(0|(e=e+1|0))!=(0|i););A=A+1|0}while((0|A)!=(0|i))}(A,e,r,f,n,t),ur=o;default:(function(A,e,r,i,f,n,t){A|=0,e|=0,r|=0,i|=0,f|=0,t|=0;var o,a,c,l,u,b,s,d,k,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0;ur=(k=ur)+272|0,l=(w=k)+128|0,s=0|ar[((u=0==(0|(n|=0)))?A+40|0:A+44|0)>>2],o=0|ar[A+4+(n<<2)>>2],a=(0|br(s,r))+e<<1,d=o+a|0,b=0|ar[(u?A+5760|0:A+5768|0)>>2],35<=(0|i)&&sr(48302,48289,596,48319);(0|i)<=1&&sr(48344,48289,597,48319);c=0|ar[9568+(i<<2)>>2];do{if(0|tr[A+5750>>0]){if(n=0|ar[A+10368>>2],h=e>>n,n=r>>n,(0|h)<=-1&&sr(48482,48519,118,48539),(0|(e=0|ar[A+10372>>2]))<=(0|h)&&sr(48482,48519,118,48539),(0|n)<=-1&&sr(48543,48519,119,48539),(0|n)<(0|ar[A+10376>>2])){p=(0|ar[A+10360>>2])+(3*((0|br(e,n))+h|0)|0)|0,p=0==(2048&(cr[p>>0]|cr[p+1>>0]<<8));break}sr(48543,48519,119,48539)}else p=1}while(0);{if(n=(0|f)<0,17<(0|i)){if(n||hb(0|l,0|t,2+(f<<1)|0),(n=i+-11|0)>>>0<15){if(e=0|ar[9708+(n<<2)>>2],(0|(n=(0|br(c,f))>>5))<-1)for(;Z=t+(0-(128+(0|br(n,e))>>8)<<1)|0,or[l+(n<<1)>>1]=0|or[Z>>1],(0|n)<-1;)n=n+1|0}else(0|f)<(0|(n=f<<1))&&hb(w+(f+65<<1)|0,t+(f+1<<1)|0,0|n);if(!(g=0<(0|f)))return ur=k;Z=s<<1,m=w+130|0,r=f<<1,e=0;do{if(A=0|br(e=(n=e)+1|0,c),h=A>>5,A&=31,w=0|br(n,s),v=32-A|0,A)for(n=0;y=((B=0|br(0|lr[l+((y=n+h|0)+1<<1)>>1],v))+16+(0|br(0|lr[l+(y+2<<1)>>1],A))|0)>>>5&65535,or[d+(n+w<<1)>>1]=y,(0|(n=n+1|0))!=(0|f););else hb(o+(a+(0|br(Z,n)))|0,m+(h<<1)|0,0|r)}while((0|e)!=(0|f));if(!((0|f)<32&26==(0|i)&u&p&g))return ur=k;for(h=t+2|0,r=(e=1<<b)+65535|0,n=0;y=((0|lr[t+(~n<<1)>>1])-(0|lr[t>>1])>>1)+(0|lr[h>>1])|0,B=d+((0|br(n,s))<<1)|0,or[B>>1]=(0|y)<0?0:65535&((0|y)<(0|e)?y:r),(0|(n=n+1|0))!=(0|f););return ur=k}if(!n)for(n=0;or[l+(n<<1)>>1]=0|or[t+(0-n<<1)>>1],(0|n)!=(0|f);)n=n+1|0;if((n=i+-11|0)>>>0<15){if(e=0|ar[9708+(n<<2)>>2],(0|(n=(0|br(c,f))>>5))<-1)for(;B=t+(128+(0|br(n,e))>>8<<1)|0,or[l+(n<<1)>>1]=0|or[B>>1],(0|n)<-1;)n=n+1|0}else if((0|f)<(0|(e=f<<1)))for(n=f;or[l+((n=(B=n)+1|0)<<1)>>1]=0|or[t+(~B<<1)>>1],(0|n)!=(0|e););if(!(v=0<(0|f)))return ur=k;w=0;do{for(m=0|br(w,s),h=0;r=0|br(h=(A=h)+1|0,c),e=31&r,n=0|or[l+((r=(r>>5)+w|0)+1<<1)>>1],e&&(n=((n=0|br(65535&n,32-e|0))+16+(0|br(0|lr[l+(r+2<<1)>>1],e))|0)>>>5&65535),or[d+(A+m<<1)>>1]=n,(0|h)!=(0|f););w=w+1|0}while((0|w)!=(0|f));if(!((0|f)<32&10==(0|i)&u&p&v))return ur=k;for(h=t+-2|0,r=(e=1<<b)+65535|0,n=0;y=((0|lr[t+((n=(B=n)+1|0)<<1)>>1])-(0|lr[t>>1])>>1)+(0|lr[h>>1])|0,or[d+(B<<1)>>1]=(0|y)<0?0:65535&((0|y)<(0|e)?y:r),(0|n)!=(0|f););ur=k}})(A,e,r,i,f,n,t),ur=o}}(A,e,r,i,f,n):void function(A,e,r,i,f,n){i|=0;var t,o,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0;ur=(o=ur)+144|0,function(A,e,r,i,f,n){e|=0,r|=0,i|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0,R=0,N=0,_=0,Y=0,Q=0,D=0,J=0,M=0,T=0,U=0,S=0,O=0,z=0,j=0,H=0,x=0,P=0,L=0,K=0,q=0,$=0,AA=0,eA=0,rA=0;ur=(g=ur)+144|0,m=(w=g)+64|0,v=0|ar[4+(A|=0)+((f|=0)<<2)>>2],s=0|ar[((f=0==(0|f))?A+40|0:A+44|0)>>2],q=f?AA=1:(AA=0|ar[A+5780>>2],0|ar[A+5784>>2]);h=0|ar[(f?A+5760|0:A+5768|0)>>2],D=0|br(AA,e),Y=0|br(q,r),G=0|ar[A+5804>>2],I=0|ar[A+5820>>2],R=(T=0!=(0|D))&(F=1^(B=0==(0|Y))),C=D+(0|br(AA,i))|0,J=0|ar[A+1248>>2],_=(0|C)<(0|J)&F,E=D>>G,y=Y>>G,X=D+-1>>G,C>>=G,G=Y+-1>>G,Z=0|ar[A+10352>>2],f=0|br(Z,y),p=0|ar[A+10340>>2],o=0|lr[p+(24*(f+E|0)|0)>>1],M=T?0|lr[p+(24*(f+X|0)|0)>>1]:-1;V=B?-1:(V=p+(24*((0|br(Z,G))+E|0)|0)|0,0|lr[V>>1]);N=_?(N=p+(24*((0|br(Z,G))+C|0)|0)|0,0|lr[N>>1]):-1;W=R?(W=p+(24*((0|br(Z,G))+X|0)|0)|0,0|lr[W>>1]):-1;f=0|br(y,I),y=0|ar[A+10308>>2],t=0|ar[y+(f+E<<2)>>2],Q=T?0|ar[y+(f+X<<2)>>2]:-1;Z=B?-1:(Z=y+((0|br(G,I))+E<<2)|0,0|ar[Z>>2]);p=R?(p=y+((0|br(G,I))+X<<2)|0,0|ar[p>>2]):-1;f=_?(f=y+((0|br(G,I))+C<<2)|0,0|ar[f>>2]):-1;k=(0|V)==(0|o)&(0|Z)==(0|t)&F,F=R&(0|W)==(0|o)&(0|p)==(0|t),c=_&(0|N)==(0|o)&(0|f)==(0|t),E=0|ar[(l=A+5864|0)>>2],B=0|ar[(u=A+5852|0)>>2],$=(0|br(Y>>E,B))+(D>>E)|0,y=0|ar[(b=A+10320|0)>>2],$=0|ar[y+($<<2)>>2],Z=(q+-1-Y+(0|ar[A+1252>>2])|0)/(0|q)|0,Y=(0|Z)>(0|(d=i<<1))?d:Z,D=(0|(D=(AA+-1-D+J|0)/(0|AA)|0))>(0|d)?d:D,vb(m+(J=0-d|0)|0,0,0|(a=i<<2|1)),f=Y+-1|0;A:do{if(0<(0|Y)&&(U=e+-1|0,S=0|br(AA,U),O=A+5944|0,z=A+10368|0,j=A+10372|0,H=A+10376|0,x=A+10360|0,T&(0|M)==(0|o)&(0|Q)==(0|t))){for(V=64-((0|Z)<(0|d)?Z:d)|0,G=p=Z=0;;){if(C=w+(V+(G<<2))|0,W=0|br(I=f+r|0,q),E=y+((0|br(W>>E,B))+(S>>E)<<2)|0,E=(0|ar[E>>2])<=(0|$),0|tr[O>>0]){if(y=0|ar[z>>2],X=S>>y,y=W>>y,(0|X)<=-1){P=35;break}if((0|(B=0|ar[j>>2]))<=(0|X)){P=35;break}if((0|y)<=-1){P=36;break}if((0|y)>=(0|ar[H>>2])){P=36;break}T=(0|ar[x>>2])+(3*((0|br(B,y))+X|0)|0)|0,E&0==(768&(cr[T>>0]|cr[T+1>>0]<<8))&&(P=29)}else E&&(P=29);if(29==(0|P)&&(y=v+(((P=0)|br(I,s))+U)|0,p||(Z=0|tr[y>>0]),tr[C>>0]=1,tr[C+1>>0]=1,tr[C+2>>0]=1,tr[C+3>>0]=1,tr[n+~f>>0]=0|tr[y>>0],T=v+((0|br(I+-1|0,s))+U)|0,tr[n+(1-f-1)>>0]=0|tr[T>>0],T=v+((0|br(I+-2|0,s))+U)|0,tr[n+(2-f-1)>>0]=0|tr[T>>0],T=v+((0|br(I+-3|0,s))+U)|0,tr[n+(3-f-1)>>0]=0|tr[T>>0],p=p+4|0),(0|(f=f+-4|0))<=-1){L=Z,K=p;break A}E=0|ar[l>>2],B=0|ar[u>>2],y=0|ar[b>>2],G=G+1|0}35==(0|P)?sr(48482,48519,118,48539):36==(0|P)&&sr(48543,48519,119,48539)}else K=L=0}while(0);A:do{if(F){f=0|br(AA,y=e+-1|0),E=0|ar[l>>2],Z=0|br(q,B=r+-1|0),E=(0|br(Z>>E,0|ar[u>>2]))+(f>>E)|0,E=(0|ar[(0|ar[b>>2])+(E<<2)>>2])<=(0|$);do{if(0|tr[A+5944>>0]){if(P=0|ar[A+10368>>2],p=f>>P,f=Z>>P,(0|p)<=-1&&sr(48482,48519,118,48539),(0|(Z=0|ar[A+10372>>2]))<=(0|p)&&sr(48482,48519,118,48539),(0|f)<=-1&&sr(48543,48519,119,48539),(0|f)<(0|ar[A+10376>>2])){if(P=(0|ar[A+10360>>2])+(3*((0|br(Z,f))+p|0)|0)|0,E&0==(768&(cr[P>>0]|cr[P+1>>0]<<8)))break;Z=K,f=L;break A}sr(48543,48519,119,48539)}else if(!E){Z=K,f=L;break A}}while(0);Z=v+((0|br(s,B))+y)|0,f=K?L:0|tr[Z>>0],tr[n>>0]=0|tr[Z>>0],tr[m>>0]=1,Z=K+1|0}else Z=K,f=L}while(0);A:do{if(0<(0|D)){_=0|br(q,V=r+-1|0),Y=A+5944|0,V=0|br(s,V),F=A+10368|0,R=A+10372|0,N=A+10376|0,G=A+10360|0,I=C=0;e:for(;;){W=w+(65+(I<<2))|0;do{if((0|C)<(0|i)?k:c){if(p=0|br(E=C+e|0,AA),X=0|ar[l>>2],X=(0|br(_>>X,0|ar[u>>2]))+(p>>X)|0,X=(0|ar[(0|ar[b>>2])+(X<<2)>>2])<=(0|$),0|tr[Y>>0]){if(y=0|ar[F>>2],p>>=y,y=_>>y,(0|p)<=-1){P=56;break e}if((0|(B=0|ar[R>>2]))<=(0|p)){P=56;break e}if((0|y)<=-1){P=59;break e}if((0|y)>=(0|ar[N>>2])){P=59;break e}if(A=(0|ar[G>>2])+(3*((0|br(B,y))+p|0)|0)|0,!(X&0==(768&(cr[A>>0]|cr[A+1>>0]<<8))))break}else if(!X)break;y=v+(p=E+V|0)|0,Z||(f=0|tr[y>>0]),A=1|C,tr[W>>0]=1,tr[W+1>>0]=1,tr[W+2>>0]=1,tr[W+3>>0]=1,tr[n+A>>0]=0|tr[y>>0],tr[n+(A+1)>>0]=0|tr[v+(p+1)>>0],tr[n+(3|C)>>0]=0|tr[v+(p+2)>>0],tr[n+(A+3)>>0]=0|tr[v+(p+3)>>0],Z=Z+4|0}}while(0);if((0|D)<=(0|(C=C+4|0))){eA=Z,rA=f;break A}I=I+1|0}56==(0|P)?sr(48482,48519,118,48539):59==(0|P)&&sr(48543,48519,119,48539)}else eA=Z,rA=f}while(0);if((0|eA)==(0|a))return ur=g;if(!eA)return vb(n+J|0,1<<h-1&255|0,0|a),ur=g;f=0|br(i,-2),0|tr[m+f>>0]||(tr[n+f>>0]=rA);if((0|(f|=1))>(0|d))return ur=g;for(;0|tr[m+f>>0]||(tr[n+f>>0]=0|tr[n+(f+-1)>>0]),(0|f)<(0|d);)f=f+1|0;ur=g}(A|=0,e|=0,r|=0,f|=0,n|=0,t=o+64|0);do{if(!(0|tr[A+5753>>0])){if(0|n&&3!=(0|ar[A+5776>>2]))break;nc(A,t,f,n,i)}}while(0);switch(0|i){case 0:if(s=0|ar[(0==(0|n)?A+40|0:A+44|0)>>2],b=(0|ar[A+4+(n<<2)>>2])+((0|br(s,r))+e)|0,1<(0|f)){for(i=f,A=0;3<i>>>0;)i>>>=1,A=A+1|0;i=A+2|0}else i=1;if((0|f)<=0)return ur=o;r=f+-1|0,n=t+(f+1)|0,a=t+~f|0,e=0;do{for(c=t+~e|0,l=r-e|0,u=0|br(e,s),e=e+1|0,A=0;w=0|br(0|cr[c>>0],r-A|0),A=(d=A)+1|0,h=0|br(0|cr[n>>0],A),k=0|br(0|cr[t+A>>0],l),k=w+f+h+k+(0|br(0|cr[a>>0],e))>>i&255,tr[b+(d+u)>>0]=k,(0|A)!=(0|f););}while((0|e)!=(0|f));return ur=o;case 1:return function(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,n|=0;var t,o,a,c,l,u,b=0,s=0,d=0;if(u=0|ar[((o=0==(0|(f|=0)))?A+40|0:A+44|0)>>2],l=0|ar[A+4+(f<<2)>>2],t=(0|br(u,r))+e|0,a=l+t|0,c=1<(0|i)){for(A=i,f=0;3<A>>>0;)A>>>=1,f=f+1|0;b=f+2|0}else b=1;if(s=0<(0|i))for(A=f=0;A=(0|cr[n+(f=(d=f)+1|0)>>0])+A+(0|cr[n+~d>>0])|0,(0|f)!=(0|i););else A=0;if(b=A+i>>b,!((0|i)<32&o)){if(!s)return;for(f=255&b,A=0;vb(l+(t+(0|br(u,A)))|0,0|f,0|i),(0|(A=A+1|0))!=(0|i););return}if(tr[a>>0]=(2+(b<<1)+(0|cr[n+-1>>0])+(0|cr[n+1>>0])|0)>>>2,!c)return;f=2+(3*b|0)|0,A=1;for(;A=(d=A)+1|0,tr[a+d>>0]=(f+(0|cr[n+A>>0])|0)>>>2,(0|A)!=(0|i););if(!c)return;f=2+(3*b|0)|0,A=1;for(;d=a+(0|br(A,u))|0,tr[d>>0]=(f+(0|cr[n+~A>>0])|0)>>>2,A=A+1|0,(0|A)!=(0|i););if(!c)return;s=255&b,b=(0|br(u,r+1|0))+e+1|0,A=i+-1|0,f=0;for(;vb(l+(b+(0|br(u,f)))|0,0|s,0|A),f=f+1|0,(0|f)!=(0|A););}(A,e,r,f,n,t),ur=o;default:(function(A,e,r,i,f,n,t){A|=0,e|=0,r|=0,i|=0,f|=0,t|=0;var o,a,c,l,u,b,s,d,k,h=0,w=0,v=0,m=0,g=0,Z=0,p=0;ur=(k=ur)+144|0,l=(w=k)+64|0,s=0|ar[((u=0==(0|(n|=0)))?A+40|0:A+44|0)>>2],o=0|ar[A+4+(n<<2)>>2],a=(0|br(s,r))+e|0,d=o+a|0,b=0|ar[(u?A+5760|0:A+5768|0)>>2],35<=(0|i)&&sr(48302,48289,596,48319);(0|i)<=1&&sr(48344,48289,597,48319);c=0|ar[9568+(i<<2)>>2];do{if(0|tr[A+5750>>0]){if(n=0|ar[A+10368>>2],h=e>>n,n=r>>n,(0|h)<=-1&&sr(48482,48519,118,48539),(0|(e=0|ar[A+10372>>2]))<=(0|h)&&sr(48482,48519,118,48539),(0|n)<=-1&&sr(48543,48519,119,48539),(0|n)<(0|ar[A+10376>>2])){g=(0|ar[A+10360>>2])+(3*((0|br(e,n))+h|0)|0)|0,g=0==(2048&(cr[g>>0]|cr[g+1>>0]<<8));break}sr(48543,48519,119,48539)}else g=1}while(0);{if(n=(0|f)<0,17<(0|i)){if(n||hb(0|l,0|t,f+1|0),(n=i+-11|0)>>>0<15){if(e=0|ar[9708+(n<<2)>>2],(0|(n=(0|br(c,f))>>5))<-1)for(;m=t+(0-(128+(0|br(n,e))>>8))|0,tr[l+n>>0]=0|tr[m>>0],(0|n)<-1;)n=n+1|0}else(0|f)<(f<<1|0)&&hb(w+(f+65)|0,t+(f+1)|0,0|f);if(!(m=0<(0|f)))return ur=k;v=w+65|0,n=0;do{if(r=0|br(s,n),A=0|br(n=n+1|0,c),h=A>>5,w=32-(A&=31)|0,A)for(e=0;Z=((p=0|br(0|cr[l+((Z=e+h|0)+1)>>0],w))+16+(0|br(0|cr[l+(Z+2)>>0],A))|0)>>>5&255,tr[d+(e+r)>>0]=Z,(0|(e=e+1|0))!=(0|f););else hb(o+(a+r)|0,v+h|0,0|f)}while((0|n)!=(0|f));if(!((0|f)<32&26==(0|i)&u&g&m))return ur=k;for(h=t+1|0,e=(r=1<<b)+255|0,n=0;Z=((0|cr[t+~n>>0])-(0|cr[t>>0])>>1)+(0|cr[h>>0])|0,p=d+(0|br(n,s))|0,tr[p>>0]=(0|Z)<0?0:255&((0|Z)<(0|r)?Z:e),(0|(n=n+1|0))!=(0|f););return ur=k}if(!n)for(n=0;tr[l+n>>0]=0|tr[t+(0-n)>>0],(0|n)!=(0|f);)n=n+1|0;if((n=i+-11|0)>>>0<15){if(e=0|ar[9708+(n<<2)>>2],(0|(n=(0|br(c,f))>>5))<-1)for(;p=t+(128+(0|br(n,e))>>8)|0,tr[l+n>>0]=0|tr[p>>0],(0|n)<-1;)n=n+1|0}else if((0|f)<(0|(e=f<<1)))for(n=f;tr[l+(n=(p=n)+1|0)>>0]=0|tr[t+~p>>0],(0|n)!=(0|e););if(!(v=0<(0|f)))return ur=k;w=0;do{for(m=0|br(w,s),h=0;r=0|br(h=(A=h)+1|0,c),e=31&r,n=0|tr[l+((r=(r>>5)+w|0)+1)>>0],e&&(n=((n=0|br(255&n,32-e|0))+16+(0|br(0|cr[l+(r+2)>>0],e))|0)>>>5&255),tr[d+(A+m)>>0]=n,(0|h)!=(0|f););w=w+1|0}while((0|w)!=(0|f));if(!((0|f)<32&10==(0|i)&u&g&v))return ur=k;for(h=t+-1|0,r=(e=1<<b)+255|0,n=0;Z=((0|cr[t+(n=(p=n)+1|0)>>0])-(0|cr[t>>0])>>1)+(0|cr[h>>0])|0,tr[d+p>>0]=(0|Z)<0?0:255&((0|Z)<(0|e)?Z:r),(0|n)!=(0|f););ur=k}})(A,e,r,i,f,n,t),ur=o}}(A,e,r,i,f,n)}function Vt(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5196,ar[(r=A+16|0)>>2]=5224,0|(i=0|ar[A+84>>2])&&((0|ar[(f=A+88|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),(0|tr[(i=A+72|0)+11>>0])<0&&vu(0|ar[i>>2]),ar[r>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(;n=f+-8|0,ar[t>>2]=n,(0|(f=(f=0|ar[f+-4>>2])?(du(f),0|ar[t>>2]):n))!=(0|i););i=0|ar[e>>2]}vu(i)}ar[r>>2]=4264,(i=0|ar[A+40>>2])&&((0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),tu()}function Ft(A){var e=0,r=0,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5104,0|(e=0|ar[(n=A+56|0)>>2])){if((0|(r=0|ar[(t=A+60|0)>>2]))!=(0|e)){for(i=r;r=i+-16|0,ar[t>>2]=r,(f=0|ar[i+-12>>2])&&((0|(i=0|ar[(r=i+-8|0)>>2]))!=(0|f)&&(ar[r>>2]=i+(~((i+-4-f|0)>>>2)<<2)),vu(f),r=0|ar[t>>2]),(0|r)!=(0|e);)i=r;e=0|ar[n>>2]}vu(e)}if(ar[A>>2]=4404,0|(e=0|ar[(f=A+44|0)>>2])){if((0|(r=0|ar[(n=A+48|0)>>2]))!=(0|e)){for(;i=r+-8|0,ar[n>>2]=i,(0|(r=(r=0|ar[r+-4>>2])?(du(r),0|ar[n>>2]):i))!=(0|e););e=0|ar[f>>2]}vu(e)}ar[A>>2]=4264,(r=0|ar[A+24>>2])&&((0|ar[(e=A+28|0)>>2])!=(0|r)&&(ar[e>>2]=r),vu(r))}function Rt(A,e){e|=0;var r,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0;r=(A|=0)+4|0,i=0|ar[A>>2],268435455<(f=(o=(0|ar[r>>2])-i>>4)+1|0)>>>0&&zl(),i=(a=(0|ar[(c=A+8|0)>>2])-i|0)>>3,i=a>>4>>>0<134217727?i>>>0<f>>>0?f:i:268435455;do{if(i){if(!(268435455<i>>>0)){t=0|hu(i<<4);break}Zu(c=0|X(8),44519),ar[c>>2]=17660,I(0|c,4016,428)}else t=0}while(0);if(a=t+(i<<4)|0,ar[(n=f=t+(o<<4)|0)>>2]=ar[e>>2],function(A,e){e|=0;var r,i,f,n,t=0;if(ar[(A|=0)>>2]=0,ar[(n=A+4|0)>>2]=0,ar[A+8>>2]=0,t=(0|ar[(f=e+4|0)>>2])-(0|ar[e>>2])|0,!(r=t>>2))return;1073741823<r>>>0&&zl();if(i=0|hu(t),ar[n>>2]=i,ar[A>>2]=i,ar[A+8>>2]=i+(r<<2),A=0|ar[e>>2],(0|(t=(0|ar[f>>2])-A|0))<=0)return;hb(0|i,0|A,0|t),ar[n>>2]=i+(t>>>2<<2)}(t+(o<<4)+4|0,e+4|0),e=f+16|0,t=0|ar[A>>2],(0|(i=0|ar[r>>2]))==(0|t))f=n,i=o=t;else{for(;i=(u=i)+-16|0,ar[f+-16>>2]=ar[i>>2],o=u+-12|0,ar[(l=f+-12|0)>>2]=0,ar[(b=f+-8|0)>>2]=0,ar[f+-4>>2]=0,ar[l>>2]=ar[o>>2],l=u+-8|0,ar[b>>2]=ar[l>>2],u=u+-4|0,ar[f+-4>>2]=ar[u>>2],ar[u>>2]=0,ar[l>>2]=0,n=f=n+-16|(ar[o>>2]=0),(0|i)!=(0|t););f=n,o=0|ar[A>>2],i=0|ar[r>>2]}if(ar[A>>2]=f,ar[r>>2]=e,ar[c>>2]=a,(0|i)!=(0|(e=o)))for(;0|(f=0|ar[i+-12>>2])&&((0|(t=0|ar[(n=i+-8|0)>>2]))!=(0|f)&&(ar[n>>2]=t+(~((t+-4-f|0)>>>2)<<2)),vu(f)),(0|(i=i+-16|0))!=(0|e););o&&vu(o)}function Nt(A,e){e|=0;var r,i,f,n,t,o,a=0,c=0,l=0,u=0;n=(A|=0)+4|0,u=t=0|ar[A>>2],1073741823<(a=1+(i=(o=(0|ar[n>>2])-t|0)>>2)|0)>>>0&&zl(),c=(l=(0|ar[(f=A+8|0)>>2])-t|0)>>1,c=l>>2>>>0<536870911?c>>>0<a>>>0?a:c:1073741823;do{if(c){if(!(1073741823<c>>>0)){l=0|hu(c<<2);break}Zu(u=0|X(8),44519),ar[u>>2]=17660,I(0|u,4016,428)}else l=0}while(0);r=l+(i<<2)|0,a=lr[e>>1]|lr[e+2>>1]<<16,or[r>>1]=a,or[2+r>>1]=a>>>16,a=r+(0-i<<2)|0,0<(0|o)&&hb(0|a,0|u,0|o),ar[A>>2]=a,ar[n>>2]=4+r,ar[f>>2]=l+(c<<2),t&&vu(u)}function _t(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=4924,(0|tr[(r=A+112|0)+11>>0])<0&&vu(0|ar[r>>2]),(0|tr[(r=A+100|0)+11>>0])<0&&vu(0|ar[r>>2]),(0|tr[(r=A+88|0)+11>>0])<0&&vu(0|ar[r>>2]),(0|tr[(r=A+76|0)+11>>0])<0&&vu(0|ar[r>>2]),(0|tr[(r=A+64|0)+11>>0])<0&&vu(0|ar[r>>2]),ar[A>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(;f=i+-8|0,ar[n>>2]=f,(0|(i=(i=0|ar[i+-4>>2])?(du(i),0|ar[n>>2]):f))!=(0|r););r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(i=0|ar[A+24>>2])&&((0|ar[(r=A+28|0)>>2])!=(0|i)&&(ar[r>>2]=i),vu(i))}function Yt(A){var e,r=0,i=0,f=0,n=0,t=0,o=0,a=0,c=0;if(ar[(A|=0)>>2]=4804,0|(r=0|ar[(e=A+56|0)>>2])){if((0|(i=0|ar[(c=A+60|0)>>2]))!=(0|r)){for(f=i;;){if(i=f+-32|0,ar[c>>2]=i,o=0|ar[(a=f+-16|0)>>2]){if((0|(i=0|ar[(t=f+-12|0)>>2]))==(0|o))i=o;else{for(;f=i+-40|0,ar[t>>2]=f,(0|(i=(n=0|ar[i+-16>>2])?((0|ar[(i=i+-12|0)>>2])!=(0|n)&&(ar[i>>2]=n),vu(n),0|ar[t>>2]):f))!=(0|o););i=0|ar[a>>2]}vu(i),i=0|ar[c>>2]}if((0|i)==(0|r))break;f=i}r=0|ar[e>>2]}vu(r)}if(ar[A>>2]=4404,0|(r=0|ar[(n=A+44|0)>>2])){if((0|(i=0|ar[(t=A+48|0)>>2]))!=(0|r)){for(;f=i+-8|0,ar[t>>2]=f,(0|(i=(i=0|ar[i+-4>>2])?(du(i),0|ar[t>>2]):f))!=(0|r););r=0|ar[n>>2]}vu(r)}ar[A>>2]=4264,(i=0|ar[A+24>>2])&&((0|ar[(r=A+28|0)>>2])!=(0|i)&&(ar[r>>2]=i),vu(i))}function Qt(A,e){e|=0;var r,i,f,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0;b=0|ar[(d=(A|=0)+4|0)>>2],n=t=0|ar[A>>2],107374182<(o=(u=((a=b)-t|0)/40|0)+1|0)>>>0&&zl(),c=(s=((0|ar[(f=A+8|0)>>2])-t|0)/40|0)<<1,c=s>>>0<53687091?c>>>0<o>>>0?o:c:107374182;do{if(c){if(!(107374182<c>>>0)){l=0|hu(40*c|0);break}Zu(d=0|X(8),44519),ar[d>>2]=17660,I(0|d,4016,428)}else l=0}while(0);s=l+(40*c|0)|0,ar[(o=t=l+(40*u|0)|0)>>2]=ar[e>>2],ar[t+4>>2]=ar[e+4>>2],ar[t+8>>2]=ar[e+8>>2],ar[t+12>>2]=ar[e+12>>2],ar[t+16>>2]=ar[e+16>>2],ar[t+20>>2]=ar[e+20>>2],ar[(r=l+(40*u|0)+24|0)>>2]=0,ar[(i=l+(40*u|0)+28|0)>>2]=0,k=(ar[l+(40*u|0)+32>>2]=0)|ar[e+24>>2],c=(0|ar[e+28>>2])-k|0,e=k;do{if(0|c){if(!((0|c)<0)){h=0|hu(c),ar[i>>2]=h,k=(ar[r>>2]=h)+c|0,ar[l+(40*u|0)+32>>2]=k,hb(0|h,0|e,0|c),ar[i>>2]=k;break}zl()}}while(0);if(e=t+40|0,(0|a)==(0|n))c=b;else{for(;a=(b=a)+-40|0,ar[(k=t+-40|0)>>2]=ar[a>>2],ar[k+4>>2]=ar[a+4>>2],ar[k+8>>2]=ar[a+8>>2],ar[k+12>>2]=ar[a+12>>2],ar[k+16>>2]=ar[a+16>>2],ar[k+20>>2]=ar[a+20>>2],h=b+-16|0,ar[(k=t+-16|0)>>2]=0,ar[(u=t+-12|0)>>2]=0,ar[t+-8>>2]=0,ar[k>>2]=ar[h>>2],k=b+-12|0,ar[u>>2]=ar[k>>2],b=b+-8|0,ar[t+-8>>2]=ar[b>>2],ar[b>>2]=0,ar[k>>2]=0,o=t=o+-40|(ar[h>>2]=0),(0|a)!=(0|n););c=0|ar[A>>2],n=0|ar[d>>2]}if(ar[A>>2]=o,ar[d>>2]=e,ar[f>>2]=s,(0|n)!=(0|(a=c)))for(;0|(t=0|ar[n+-16>>2])&&((0|ar[(o=n+-12|0)>>2])!=(0|t)&&(ar[o>>2]=t),vu(t)),(0|(n=n+-40|0))!=(0|a););c&&vu(c)}function Dt(A,e){e|=0;var r,i,f,n=0;ar[(A|=0)>>2]=0,ar[(r=A+4|0)>>2]=0,f=((ar[A+8>>2]=0)|(n=(0|ar[(i=e+4|0)>>2])-(0|ar[e>>2])|0))/40|0,n&&(107374182<f>>>0&&zl(),n=0|hu(n),ar[r>>2]=n,ar[A>>2]=n,ar[A+8>>2]=n+(40*f|0),function(A,e,r,i){i|=0;var f,n=0,t=0,o=0,a=0,c=0;if(f=4+(A|=0)|0,(0|(e|=0))==(0|(r|=0)))return;i=0|ar[f>>2];for(;;){if(ar[i>>2]=ar[e>>2],ar[i+4>>2]=ar[e+4>>2],ar[i+8>>2]=ar[e+8>>2],ar[i+12>>2]=ar[e+12>>2],ar[i+16>>2]=ar[e+16>>2],ar[i+20>>2]=ar[e+20>>2],n=e+24|0,ar[(o=i+24|0)>>2]=0,ar[(c=i+28|0)>>2]=0,(ar[i+32>>2]=0)|(A=(0|ar[(t=e+28|0)>>2])-(0|ar[n>>2])|0)){if((0|A)<0){A=5;break}a=0|hu(A),ar[c>>2]=a,ar[o>>2]=a,ar[i+32>>2]=a+A,i=0|ar[n>>2],0<(0|(A=(0|ar[t>>2])-i|0))&&(hb(0|a,0|i,0|A),ar[c>>2]=a+A)}if(e=e+40|0,i=40+(0|ar[f>>2])|0,ar[f>>2]=i,(0|e)==(0|r)){A=9;break}}if(5==(0|A))zl();else if(9==(0|A));}(A,0|ar[e>>2],0|ar[i>>2],f))}function Jt(A,e){e|=0;var r,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0;r=(A|=0)+4|0,i=0|ar[A>>2],134217727<(f=(o=(0|ar[r>>2])-i>>5)+1|0)>>>0&&zl(),i=(c=(0|ar[(l=A+8|0)>>2])-i|0)>>4,i=c>>5>>>0<67108863?i>>>0<f>>>0?f:i:134217727;do{if(i){if(!(134217727<i>>>0)){t=0|hu(i<<5);break}Zu(l=0|X(8),44519),ar[l>>2]=17660,I(0|l,4016,428)}else t=0}while(0);if(a=t+(i<<5)|0,ar[(n=f=t+(o<<5)|0)>>2]=ar[e>>2],ar[f+4>>2]=ar[e+4>>2],ar[f+8>>2]=ar[e+8>>2],ar[f+12>>2]=ar[e+12>>2],Dt(t+(o<<5)+16|0,e+16|0),e=f+32|0,t=0|ar[A>>2],(0|(i=0|ar[r>>2]))==(0|t))i=n,f=c=t;else{for(;i=(u=i)+-32|0,ar[(o=f+-32|0)>>2]=ar[i>>2],ar[o+4>>2]=ar[i+4>>2],ar[o+8>>2]=ar[i+8>>2],ar[o+12>>2]=ar[i+12>>2],c=u+-16|0,ar[(o=f+-16|0)>>2]=0,ar[(b=f+-12|0)>>2]=0,ar[f+-8>>2]=0,ar[o>>2]=ar[c>>2],o=u+-12|0,ar[b>>2]=ar[o>>2],u=u+-8|0,ar[f+-8>>2]=ar[u>>2],ar[u>>2]=0,ar[o>>2]=0,n=f=n+-32|(ar[c>>2]=0),(0|i)!=(0|t););i=n,c=0|ar[A>>2],f=0|ar[r>>2]}if(ar[A>>2]=i,ar[r>>2]=e,ar[l>>2]=a,(0|f)!=(0|(A=c))){a=f;do{if(0|(i=0|ar[(e=a+-16|0)>>2])){if((0|(f=0|ar[(o=a+-12|0)>>2]))!=(0|i)){for(;n=f+-40|0,ar[o>>2]=n,(0|(f=(t=0|ar[f+-16>>2])?((0|ar[(f=f+-12|0)>>2])!=(0|t)&&(ar[f>>2]=t),vu(t),0|ar[o>>2]):n))!=(0|i););i=0|ar[e>>2]}vu(i)}a=a+-32|0}while((0|a)!=(0|A))}c&&vu(c)}function Mt(A){var e;ar[(A|=0)>>2]=4264,e=A+8|0,ar[A+40>>2]=0,ar[e>>2]=0,ar[4+e>>2]=0,ar[8+e>>2]=0,ar[12+e>>2]=0,ar[16+e>>2]=0,ar[20+e>>2]=0,ar[24+e>>2]=0,or[28+e>>1]=0}function Tt(A,e,r){A|=0,r|=0;var i,f=0;f=0|ar[(e|=0)+44>>2],i=0|ar[e+48>>2];A:do{if((0|f)!=(0|i)){for(e=f;f=0|ar[e>>2],(0|ar[f+20>>2])!=(0|r);)if((0|(e=e+8|0))==(0|i))break A;return(ar[A>>2]=f,e=0|ar[e+4>>2],ar[A+4>>2]=e)?void bu(e):void 0}}while(0);ar[A>>2]=0,ar[A+4>>2]=0}function Ut(A,e){e|=0;var r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0;f=0|ar[(u=(A|=0)+4|0)>>2],c=n=0|ar[A>>2],536870911<(t=1+(r=f-n>>3)|0)>>>0&&zl(),o=(l=(0|ar[(i=A+8|0)>>2])-n|0)>>2,o=l>>3>>>0<268435455?o>>>0<t>>>0?t:o:536870911;do{if(o){if(!(536870911<o>>>0)){a=0|hu(o<<3);break}Zu(u=0|X(8),44519),ar[u>>2]=17660,I(0|u,4016,428)}else a=0}while(0);if(l=a+(o<<3)|0,ar[(t=n=a+(r<<3)|0)>>2]=ar[e>>2],o=0|ar[e+4>>2],o=(ar[a+(r<<3)+4>>2]=o)?(bu(o),f=0|ar[u>>2],0|ar[A>>2]):c,a=n+8|0,(0|f)!=(0|o)){for(;f=(c=f)+-8|0,ar[n+-8>>2]=ar[f>>2],c=c+-4|0,ar[n+-4>>2]=ar[c>>2],ar[f>>2]=0,t=n=t+-8|(ar[c>>2]=0),(0|f)!=(0|o););o=0|ar[A>>2],f=0|ar[u>>2]}if(ar[A>>2]=t,ar[u>>2]=a,ar[i>>2]=l,(0|f)!=(0|(t=o)))for(;n=0|ar[f+-4>>2],f=f+-8|0,0|n&&du(n),(0|f)!=(0|t););o&&vu(o)}function St(A,e){e|=0;var r=0;if((0|(r=0|ar[(A|=0)+64>>2]))==(0|(A=0|ar[A+68>>2])))return(e=0)|e;for(;;){if((0|ar[r>>2])==(0|e)){r=1,A=4;break}if((0|(r=r+4|0))==(0|A)){r=0,A=4;break}}return 4==(0|A)?0|r:0}function Ot(A,e,r,i,f,n){A|=0,e|=0,i|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0,R=0,N=0,_=0,Y=0;ur=(w=ur)+272|0,k=w+252|0,h=w+72|0,b=w+240|0,s=w+228|0,d=w+216|0,c=w+56|0,l=w+44|0,t=w+24|0,o=w+16|0,u=w,e=0|ar[(r|=0)+16>>2],a=0|ar[r+20>>2];A:do{if((0|e)!=(0|a)){F=r+4|0,V=n+4|0,R=r+8|0,E=4+o|0,X=i+4|0,I=(W=8+t|0)+11|0;e:for(;;){switch(0|tr[F>>0]){case 0:if(C=(0|ar[V>>2])-(0|ar[n>>2])|0,m=0|ar[(g=B=e+16|0)>>2],0<(g=0|ar[g+4>>2])>>>0|0==(0|g)&(536870912-C|0)>>>0<m>>>0){e=5;break e}if(Z=0|ar[(p=y=e+8|0)>>2],8388607<(p=0|ar[p+4>>2])>>>0|8388607==(0|p)&4294967295<Z>>>0){e=14;break e}if(r=0|ar[(v=R)>>2],8388607<(N=(v=0|ar[v+4>>2])|g)>>>0|8388607==(0|N)&4294967295<(r|m)>>>0){e=14;break e}switch(_=0|ar[i>>2],Y=0|ar[12+(0|ar[_>>2])>>2],N=0|tb(0|tb(0|Z,0|p,0|m,0|g),0|D,0|r,0|v),0|xb[63&Y](_,N,D)){case 2:e=17;break e;case 1:e=26;break e}if(_=0|ar[i>>2],N=0|ar[20+(0|ar[_>>2])>>2],Y=y,Y=0|tb(0|ar[(y=R)>>2],0|ar[y+4>>2],0|ar[Y>>2],0|ar[Y+4>>2]),!(0|xb[63&N](_,Y,D))){e=29;break e}if((m=0|tb(0|(v=0|ar[(m=B)>>2]),0|ar[m+4>>2],0|C,0))>>>0<=(g=(Z=0|ar[V>>2])-(r=0|ar[n>>2])|0)>>>0?m>>>0<g>>>0&&(0|Z)!=(0|(G=r+m|0))&&(ar[V>>2]=G):(TA(n,m-g|0),v=0|ar[B>>2],r=0|ar[n>>2]),Y=0|ar[i>>2],0|xb[63&ar[16+(0|ar[Y>>2])>>2]](Y,r+C|0,v))break;e=36;break e;case 1:if(!(r=0|ar[f>>2])){e=38;break e}ar[o>>2]=ar[i>>2],v=0|ar[X>>2],(m=0==(0|(ar[E>>2]=v)))||bu(v),_=e+8|0,Y=e+16|0,zt(t,r,o,0|tb(0|ar[(N=R)>>2],0|ar[N+4>>2],0|ar[_>>2],0|ar[_+4>>2]),D,0|ar[Y>>2],0|ar[Y+4>>2],n),(0|tr[I>>0])<0&&vu(0|ar[W>>2]),m||du(v);break;default:e=46;break e}if((0|(e=e+40|0))==(0|a))break A}if(5==(0|e))return r=64+h|0,ar[(m=8+h|0)>>2]=4524,v=12+h|0,ar[h>>2]=188,ar[r>>2]=208,Jf(64+h|(ar[4+h>>2]=0),v),ar[136+h>>2]=0,ar[140+h>>2]=-1,ar[h>>2]=4504,ar[r>>2]=4544,ar[m>>2]=4524,Sf(v),ar[v>>2]=4340,ar[(m=44+h|0)>>2]=0,ar[m+4>>2]=0,ar[m+8>>2]=0,ar[m+12>>2]=0,ar[60+h>>2]=24,ar[k>>2]=0,ar[4+k>>2]=0,ar[8+k>>2]=0,Xe(v,k),(0|tr[11+k>>0])<0&&vu(0|ar[k>>2]),Y=0|We(e=8+h|0,23479,19),_=0|We(0|Kf(Y,0|ar[(_=B)>>2],0|ar[_+4>>2]),23499,35),We(0|Pf(0|We(0|Kf(_,Y=0|tb(0|ar[(Y=B)>>2],0|ar[Y+4>>2],0|C,0),D),23535,40),536870912),23576,6),Ie(b,v),oo(A,6,1e3,b),(0|tr[11+b>>0])<0&&vu(0|ar[b>>2]),ar[h>>2]=4504,ar[r>>2]=4544,ar[e>>2]=4524,ar[v>>2]=4340,(0|tr[m+11>>0])<0&&vu(0|ar[m>>2]),kf(v),bf(r),void(ur=w);if(14==(0|e)){for(e=0|hu(48),ar[s>>2]=e,ar[8+s>>2]=-2147483600,v=23583,m=(r=e)+(ar[4+s>>2]=39)|0;tr[r>>0]=0|tr[v>>0],v=v+1|0,(0|(r=r+1|0))<(0|m););return(tr[e+39>>0]=0,oo(A,2,1e3,s),0<=(0|tr[11+s>>0]))?void(ur=w):(vu(0|ar[s>>2]),void(ur=w))}if(17==(0|e))return e=0|ar[n>>2],(0|ar[V>>2])!=(0|e)&&(ar[V>>2]=e),r=64+h|0,ar[(m=8+h|0)>>2]=4524,v=12+h|0,ar[h>>2]=188,ar[r>>2]=208,Jf(64+h|(ar[4+h>>2]=0),v),ar[136+h>>2]=0,ar[140+h>>2]=-1,ar[h>>2]=4504,ar[r>>2]=4544,ar[m>>2]=4524,Sf(v),ar[v>>2]=4340,ar[(m=44+h|0)>>2]=0,ar[m+4>>2]=0,ar[m+8>>2]=0,ar[m+12>>2]=0,ar[60+h>>2]=24,ar[k>>2]=0,ar[4+k>>2]=0,ar[8+k>>2]=0,Xe(v,k),(0|tr[11+k>>0])<0&&vu(0|ar[k>>2]),_=0|We(0|We(e=8+h|0,23623,58),23682,25),Y=y,We(0|Kf(_,Y=0|tb(0|ar[(N=R)>>2],0|ar[N+4>>2],0|ar[Y>>2],0|ar[Y+4>>2]),D),18904,2),Ie(d,v),oo(A,2,100,d),(0|tr[11+d>>0])<0&&vu(0|ar[d>>2]),ar[h>>2]=4504,ar[r>>2]=4544,ar[e>>2]=4524,ar[v>>2]=4340,(0|tr[m+11>>0])<0&&vu(0|ar[m>>2]),kf(v),bf(r),void(ur=w);if(26==(0|e))return ar[c>>2]=0,ar[4+c>>2]=0,ar[8+c>>2]=0,oo(A,2,100,c),0<=(0|tr[11+c>>0])||vu(0|ar[c>>2]),void(ur=w);if(29==(0|e))sr(23708,19104,1114,23716);else if(36==(0|e))sr(23708,19104,1122,23716);else{if(38==(0|e)){for(e=0|hu(64),ar[l>>2]=e,ar[8+l>>2]=-2147483584,v=23726,m=(r=e)+(ar[4+l>>2]=54)|0;tr[r>>0]=0|tr[v>>0],v=v+1|0,(0|(r=r+1|0))<(0|m););return(tr[e+54>>0]=0,oo(A,2,103,l),0<=(0|tr[11+l>>0]))?void(ur=w):(vu(0|ar[l>>2]),void(ur=w))}if(46==(0|e))return e=64+h|0,ar[(v=8+h|0)>>2]=4524,r=12+h|0,ar[h>>2]=188,ar[e>>2]=208,Jf(64+h|(ar[4+h>>2]=0),r),ar[136+h>>2]=0,ar[140+h>>2]=-1,ar[h>>2]=4504,ar[e>>2]=4544,ar[v>>2]=4524,Sf(r),ar[r>>2]=4340,ar[(v=44+h|0)>>2]=0,ar[v+4>>2]=0,ar[v+8>>2]=0,ar[v+12>>2]=0,ar[60+h>>2]=24,ar[k>>2]=0,ar[4+k>>2]=0,ar[8+k>>2]=0,Xe(r,k),(0|tr[11+k>>0])<0&&vu(0|ar[k>>2]),Y=0|We(m=8+h|0,23781,25),tr[k>>0]=0|tr[F>>0],We(0|We(Y,k,1),23807,16),Ie(u,r),oo(A,4,103,u),(0|tr[u+11>>0])<0&&vu(0|ar[u>>2]),ar[h>>2]=4504,ar[e>>2]=4544,ar[m>>2]=4524,ar[r>>2]=4340,(0|tr[v+11>>0])<0&&vu(0|ar[v>>2]),kf(r),bf(e),void(ur=w)}}}while(0);_=0|ar[(N=56592)+4>>2],ar[(Y=A)>>2]=ar[N>>2],ar[Y+4>>2]=_,yu(A+8|0,56600),ur=w}function zt(A,e,r,i,f,n,t,o){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var a,c,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0;return ur=(c=ur)+208|0,s=c+192|0,k=c+48|0,d=c+36|0,l=c+24|0,h=c+12|0,w=c,0<(t|=0)>>>0|0==(0|t)&(536870912-(m=(0|ar[(a=(o|=0)+4|0)>>2])-(0|ar[o>>2])|0)|0)>>>0<n>>>0?(l=k+64|0,ar[(b=k+8|0)>>2]=4524,u=k+12|0,ar[k>>2]=188,ar[l>>2]=208,Jf(k+64|(ar[k+4>>2]=0),u),ar[k+136>>2]=0,ar[k+140>>2]=-1,ar[k>>2]=4504,ar[l>>2]=4544,ar[b>>2]=4524,Sf(u),ar[u>>2]=4340,ar[(b=k+44|0)>>2]=0,ar[b+4>>2]=0,ar[b+8>>2]=0,ar[b+12>>2]=0,ar[k+60>>2]=24,ar[s>>2]=0,ar[s+4>>2]=0,ar[s+8>>2]=0,Xe(u,s),(0|tr[s+11>>0])<0&&vu(0|ar[s>>2]),r=0|We(0|Kf(0|We(e=k+8|0,23824,19),n,t),23499,35),We(0|Pf(0|We(0|Kf(r,n=0|tb(0|m,0,0|n,0|t),D),23535,40),536870912),23576,6),Ie(d,u),oo(A,6,1e3,d),(0|tr[d+11>>0])<0&&vu(0|ar[d>>2]),ar[k>>2]=4504,ar[l>>2]=4544,ar[e>>2]=4524,ar[u>>2]=4340,(0|tr[b+11>>0])<0&&vu(0|ar[b>>2]),kf(u),bf(l),void(ur=c)):(d=0|ar[(k=s=e+64|0)>>2],k=0|ar[k+4>>2],e=0|tb(0|(u=0|ar[(b=e+8|0)>>2]),0|(b=0|ar[b+4>>2]),0|d,0|k),(g=D)>>>0<f>>>0|(0|g)==(0|f)&e>>>0<i>>>0?(ar[l>>2]=0,ar[l+4>>2]=0,ar[l+8>>2]=0,oo(A,2,100,l),0<=(0|tr[l+11>>0])||vu(0|ar[l>>2]),void(ur=c)):(e=0|tb(0|n,0|t,0|i,0|f),b>>>0<t>>>0|(0|b)==(0|t)&u>>>0<n>>>0|b>>>0<(l=D)>>>0|(0|l)==(0|b)&u>>>0<e>>>0?(ar[h>>2]=0,ar[h+4>>2]=0,ar[h+8>>2]=0,oo(A,2,100,h),0<=(0|tr[h+11>>0])||vu(0|ar[h>>2]),void(ur=c)):(h=0|ar[r>>2],b=0|ar[12+(0|ar[h>>2])>>2],g=0|tb(0|e,0|l,0|d,0|k),((0|xb[63&b](h,g,D))-1|0)>>>0<2?(ar[w>>2]=0,ar[w+4>>2]=0,ar[w+8>>2]=0,oo(A,2,100,w),0<=(0|tr[w+11>>0])||vu(0|ar[w>>2]),void(ur=c)):(w=0|ar[r>>2],h=0|ar[20+(0|ar[w>>2])>>2],g=0|tb(0|ar[(g=s)>>2],0|ar[g+4>>2],0|i,0|f),0|xb[63&h](w,g,D)||sr(23708,19104,3031,23716),0==(0|n)&0==(0|t)||((l=0|tb(0|m,0,0|n,0|t))>>>0<=(u=(b=0|ar[a>>2])-(e=0|ar[o>>2])|0)>>>0?l>>>0<u>>>0&&(0|b)!=(0|(v=e+l|0))&&(ar[a>>2]=v):(TA(o,l-u|0),e=0|ar[o>>2]),g=0|ar[r>>2],0|xb[63&ar[16+(0|ar[g>>2])>>2]](g,e+m|0,n)||sr(23708,19104,3040,23716)),n=0|ar[(m=56592)+4>>2],ar[(g=A)>>2]=ar[m>>2],ar[g+4>>2]=n,yu(A+8|0,56600),void(ur=c)))))}function jt(A){or[(A|=0)+4>>1]=2,or[A+6>>1]=2,or[A+8>>1]=6,tr[A+10>>0]=1}function Ht(A,e,r,i,f){A|=0,e|=0,r|=0,f|=0;var n,t,o,a,c,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0;ur=(c=ur)+336|0,o=c+316|0,a=c+160|0,b=c+304|0,t=(n=c)+144|0,u=0|ar[(i|=0)>>2],i=0|ar[u+56>>2],u=0|ar[u+60>>2];A:do{if((0|i)!=(0|u)){for(;l=i+16|0,(0|ar[i>>2])!=(0|r);){if((0|l)==(0|u))break A;i=l}xt(a,e+44|0),l=0|ar[i+4>>2],s=0|ar[i+8>>2];e:do{if((0|l)==(0|s))g=34;else{for(d=4+a|0,h=8+o|0,w=k=4+o|0,v=f+4|0,m=f+8|0;u=65535&(i=0|or[(b=l+2|0)>>1]),e=Z=0|ar[a>>2],!(u>>>0>(0|ar[d>>2])-Z>>3>>>0);){ar[k>>2]=0,ar[h>>2]=0,tr[o>>0]=0|tr[l>>0];do{if(i<<16>>16){if(b=0|ar[e+((i=u+-1|0)<<3)>>2],(u=i=0|ar[e+(i<<3)+4>>2])?(bu(i),i=0|ar[h>>2],ar[w>>2]=b,ar[h>>2]=u,0|i&&du(i)):(ar[w>>2]=b,ar[h>>2]=u),(0|(i=0|ar[v>>2]))==(0|ar[m>>2])){Pt(f,o);break}tr[i>>0]=0|tr[o>>0],ar[i+4>>2]=ar[w>>2],u=0|ar[h>>2],(ar[i+8>>2]=u)&&(bu(u),i=0|ar[v>>2]),ar[v>>2]=i+12}}while(0);if(0|(i=0|ar[h>>2])&&du(i),(0|(l=l+4|0))==(0|s)){g=34;break e}}l=n+64|0,ar[(e=n+8|0)>>2]=4524,u=n+12|0,ar[n>>2]=188,ar[l>>2]=208,Jf(n+64|(ar[n+4>>2]=0),u),ar[n+136>>2]=0,ar[n+140>>2]=-1,ar[n>>2]=4504,ar[l>>2]=4544,ar[e>>2]=4524,Sf(u),ar[u>>2]=4340,ar[(e=n+44|0)>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[n+60>>2]=24,ar[o>>2]=0,ar[4+o>>2]=0,ar[8+o>>2]=0,Xe(u,o),(0|tr[11+o>>0])<0&&vu(0|ar[o>>2]),Z=0|We(i=n+8|0,23901,28),We(0|Lf(0|We(0|We(0|xf(Z,0|or[b>>1]),23930,11),23942,4),r),23947,23),Ie(t,u),oo(A,2,115,t),(0|tr[11+t>>0])<0&&vu(0|ar[t>>2]),ar[n>>2]=4504,ar[l>>2]=4544,ar[i>>2]=4524,ar[u>>2]=4340,(0|tr[e+11>>0])<0&&vu(0|ar[e>>2]),kf(u),bf(l),i=a}}while(0);if(34==(0|g)&&(Z=0|ar[(r=56592)+4>>2],ar[(i=A)>>2]=ar[r>>2],ar[i+4>>2]=Z,yu(A+8|0,56600),i=a),0|(i=0|ar[i>>2])){if((0|(l=0|ar[(e=4+a|0)>>2]))!=(0|i)){for(;u=l+-8|0,ar[e>>2]=u,(0|(l=(l=0|ar[l+-4>>2])?(du(l),0|ar[e>>2]):u))!=(0|i););i=0|ar[a>>2]}vu(i)}return void(ur=c)}}while(0);l=64+a|0,ar[(e=8+a|0)>>2]=4524,u=12+a|0,ar[a>>2]=188,ar[l>>2]=208,Jf(64+a|(ar[4+a>>2]=0),u),ar[136+a>>2]=0,ar[140+a>>2]=-1,ar[a>>2]=4504,ar[l>>2]=4544,ar[e>>2]=4524,Sf(u),ar[u>>2]=4340,ar[(e=44+a|0)>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[60+a>>2]=24,ar[o>>2]=0,ar[4+o>>2]=0,ar[8+o>>2]=0,Xe(u,o),(0|tr[11+o>>0])<0&&vu(0|ar[o>>2]),We(0|Lf(0|We(i=8+a|0,23844,9),r),23854,46),Ie(b,u),oo(A,2,116,b),(0|tr[b+11>>0])<0&&vu(0|ar[b>>2]),ar[a>>2]=4504,ar[l>>2]=4544,ar[i>>2]=4524,ar[u>>2]=4340,(0|tr[e+11>>0])<0&&vu(0|ar[e>>2]),kf(u),bf(l),ur=c}function xt(A,e){e|=0;var r,i,f,n=0,t=0;if(ar[(A|=0)>>2]=0,ar[(f=A+4|0)>>2]=0,(r=(n=((ar[A+8>>2]=0)|ar[(i=e+4|0)>>2])-(0|ar[e>>2])|0)>>3)&&(536870911<r>>>0&&zl(),t=0|hu(n),ar[f>>2]=t,ar[A>>2]=t,ar[A+8>>2]=t+(r<<3),(0|(n=0|ar[e>>2]))!=(0|(e=0|ar[i>>2]))))for(;ar[t>>2]=ar[n>>2],A=0|ar[n+4>>2],0|(ar[t+4>>2]=A)&&bu(A),n=n+8|0,t=8+(0|ar[f>>2])|0,ar[f>>2]=t,(0|n)!=(0|e););}function Pt(A,e){e|=0;var r,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0;n=0|ar[(u=(A|=0)+4|0)>>2],c=i=0|ar[A>>2],357913941<(f=(a=(n-i|0)/12|0)+1|0)>>>0&&zl(),t=(l=((0|ar[(r=A+8|0)>>2])-i|0)/12|0)<<1,t=l>>>0<178956970?t>>>0<f>>>0?f:t:357913941;do{if(t){if(!(357913941<t>>>0)){o=0|hu(12*t|0);break}Zu(u=0|X(8),44519),ar[u>>2]=17660,I(0|u,4016,428)}else o=0}while(0);if(l=o+(12*t|0)|0,tr[(f=i=o+(12*a|0)|0)>>0]=0|tr[e>>0],ar[o+(12*a|0)+4>>2]=ar[e+4>>2],t=0|ar[e+8>>2],t=(ar[o+(12*a|0)+8>>2]=t)?(bu(t),n=0|ar[u>>2],0|ar[A>>2]):c,o=i+12|0,(0|n)==(0|t))i=t=n;else{for(;n=(c=n)+-12|0,tr[i+-12>>0]=0|tr[n>>0],a=c+-8|0,ar[i+-8>>2]=ar[a>>2],c=c+-4|0,ar[i+-4>>2]=ar[c>>2],ar[a>>2]=0,f=i=f+-12|(ar[c>>2]=0),(0|n)!=(0|t););t=0|ar[A>>2],i=0|ar[u>>2]}if(ar[A>>2]=f,ar[u>>2]=o,ar[r>>2]=l,(0|i)!=(0|(n=t)))for(;f=0|ar[i+-4>>2],i=i+-12|0,0|f&&du(f),(0|i)!=(0|n););t&&vu(n)}function Lt(A,e,r,i,f){A|=0,e|=0,r|=0,f|=0;var n,t,o=0,a=0,c=0,l=0,u=0,b=0;ur=(t=ur)+16|0,n=t,a=0|ar[(i|=0)>>2],i=0|ar[a+56>>2],a=0|ar[a+60>>2];A:do{if((0|i)!=(0|a)){for(;o=i+16|0,(0|ar[i>>2])!=(0|r);){if((0|o)==(0|a))break A;i=o}xt(n,e+44|0),a=0|ar[i+4>>2],c=0|ar[i+8>>2];e:do{if((0|a)==(0|c))o=A+4|0,i=n,u=15;else{for(l=n+4|0,o=A+4|0;;){if(i=65535&(b=0|or[a+2>>1]),e=r=0|ar[n>>2],b<<16>>16==0||i>>>0>(0|ar[l>>2])-r>>3>>>0){i=n,u=15;break e}if(r=0|ar[e+((i=i+-1|0)<<3)>>2],0|(i=0|ar[e+(i<<3)+4>>2])&&bu(i),(0|ar[r+20>>2])==(0|f))break;if(0|i&&du(i),(0|(a=a+4|0))==(0|c)){i=n,u=15;break e}}ar[A>>2]=r,ar[o>>2]=i,i=n}}while(0);if(15==(0|u)&&(ar[A>>2]=0,ar[o>>2]=0),0|(i=0|ar[i>>2])){if((0|(o=0|ar[(e=n+4|0)>>2]))!=(0|i)){for(;a=o+-8|0,ar[e>>2]=a,(0|(o=(o=0|ar[o+-4>>2])?(du(o),0|ar[e>>2]):a))!=(0|i););i=0|ar[n>>2]}vu(i)}return void(ur=t)}}while(0);ar[A>>2]=0,ar[A+4>>2]=0,ur=t}function Kt(A,e){A|=0;var r=0,i=0,f=0;if(r=(e|=0)+-1|0,131072<(e+65535|0)>>>0)for(e=2;e=(0|e)/2|0,131072<((r=(0|r)/2|0)+65536|0)>>>0;);else e=2;if(f=0|ar[A+76>>2],i=0|ar[A+72>>2],(0|f)==(0|e)){if(r=i+r|0,131072<(e+65536|0)>>>0)for(;r=(0|r)/2|0,131072<((e=(0|e)/2|0)+65536|0)>>>0;);if(131072<(r+65536|0)>>>0)for(;e=(0|e)/2|0,131072<((r=(0|r)/2|0)+65536|0)>>>0;);}else{if(r=(0|br(i,e))+(0|br(f,r))|0,131072<((e=0|br(f,e))+65536|0)>>>0)for(;r=(0|r)/2|0,131072<((e=(0|e)/2|0)+65536|0)>>>0;);if(131072<(r+65536|0)>>>0)for(;e=(0|e)/2|0,131072<((r=(0|r)/2|0)+65536|0)>>>0;);}if(i=0|ar[A+60>>2],f=(0|ar[A+56>>2])-i|0,131072<(i+65536|0)>>>0)for(;f=(0|f)/2|0,131072<((i=(0|i)/2|0)+65536|0)>>>0;);if(131072<(f+65536|0)>>>0)for(;i=(0|i)/2|0,131072<((f=(0|f)/2|0)+65536|0)>>>0;);if(131072<((i<<=1)+65536|0)>>>0)for(;f=(0|f)/2|0,131072<((i=(0|i)/2|0)+65536|0)>>>0;);if(131072<(f+65536|0)>>>0)for(;i=(0|i)/2|0,131072<((f=(0|f)/2|0)+65536|0)>>>0;);if((0|e)==(0|i)){if(r=r-f|0,131072<(e+65536|0)>>>0)for(;r=(0|r)/2|0,131072<((e=(0|e)/2|0)+65536|0)>>>0;);if((r+65536|0)>>>0<=131072)return 0|(A=(0|(f=r))/(0|(A=e))|0);for(;e=(0|e)/2|0,131072<((r=(0|r)/2|0)+65536|0)>>>0;);return 0|(A=(0|r)/(0|e)|0)}if(r=(0|br(i,r))-(0|br(f,e))|0,131072<((e=0|br(i,e))+65536|0)>>>0)for(;r=(0|r)/2|0,131072<((e=(0|e)/2|0)+65536|0)>>>0;);if((r+65536|0)>>>0<=131072)return 0|(A=(0|(f=r))/(0|(A=e))|0);for(;e=(0|e)/2|0,131072<((r=(0|r)/2|0)+65536|0)>>>0;);return 0|(A=(0|r)/(0|e)|0)}function qt(A,e){e|=0;var r=0,i=0;if(r=0|ar[(A|=0)+60>>2],i=(0|ar[A+56>>2])-r|0,131072<(r+65536|0)>>>0)for(;i=(0|i)/2|0,131072<((r=(0|r)/2|0)+65536|0)>>>0;);if(131072<(i+65536|0)>>>0)for(;r=(0|r)/2|0,131072<((i=(0|i)/2|0)+65536|0)>>>0;);if(i=(0|br(0|Kt(A,e),r))+i|0,131072<(r+65536|0)>>>0)for(;i=(0|i)/2|0,131072<((r=(0|r)/2|0)+65536|0)>>>0;);if((i+65536|0)>>>0<=131072)return A=i,0|(e=(0|(A=(i=(0|(e=r))/2|0)+A|0))/(0|e)|0);for(;r=(0|r)/2|0,131072<((i=(0|i)/2|0)+65536|0)>>>0;);return 0|(e=(0|(e=(e=(0|r)/2|0)+i|0))/(0|r)|0)}function $t(A,e){A|=0;var r=0,i=0,f=0;if(r=(e|=0)+-1|0,131072<(e+65535|0)>>>0)for(e=2;e=(0|e)/2|0,131072<((r=(0|r)/2|0)+65536|0)>>>0;);else e=2;if(f=0|ar[A+84>>2],i=0|ar[A+80>>2],(0|f)==(0|e)){if(r=i+r|0,131072<(e+65536|0)>>>0)for(;r=(0|r)/2|0,131072<((e=(0|e)/2|0)+65536|0)>>>0;);if(131072<(r+65536|0)>>>0)for(;e=(0|e)/2|0,131072<((r=(0|r)/2|0)+65536|0)>>>0;);}else{if(r=(0|br(i,e))+(0|br(f,r))|0,131072<((e=0|br(f,e))+65536|0)>>>0)for(;r=(0|r)/2|0,131072<((e=(0|e)/2|0)+65536|0)>>>0;);if(131072<(r+65536|0)>>>0)for(;e=(0|e)/2|0,131072<((r=(0|r)/2|0)+65536|0)>>>0;);}if(i=0|ar[A+68>>2],f=(0|ar[A+64>>2])-i|0,131072<(i+65536|0)>>>0)for(;f=(0|f)/2|0,131072<((i=(0|i)/2|0)+65536|0)>>>0;);if(131072<(f+65536|0)>>>0)for(;i=(0|i)/2|0,131072<((f=(0|f)/2|0)+65536|0)>>>0;);if(131072<((i<<=1)+65536|0)>>>0)for(;f=(0|f)/2|0,131072<((i=(0|i)/2|0)+65536|0)>>>0;);if(131072<(f+65536|0)>>>0)for(;i=(0|i)/2|0,131072<((f=(0|f)/2|0)+65536|0)>>>0;);if((0|e)==(0|i)){if(r=r-f|0,131072<(e+65536|0)>>>0)for(;r=(0|r)/2|0,131072<((e=(0|e)/2|0)+65536|0)>>>0;);if((r+65536|0)>>>0<=131072)return 0|(A=(0|(f=(i=(0|(A=e))/2|0)+(f=r)|0))/(0|A)|0);for(;e=(0|e)/2|0,131072<((r=(0|r)/2|0)+65536|0)>>>0;);return 0|(A=(0|(A=(A=(0|e)/2|0)+r|0))/(0|e)|0)}if(r=(0|br(i,r))-(0|br(f,e))|0,131072<((e=0|br(i,e))+65536|0)>>>0)for(;r=(0|r)/2|0,131072<((e=(0|e)/2|0)+65536|0)>>>0;);if((r+65536|0)>>>0<=131072)return 0|(A=(0|(f=(i=(0|(A=e))/2|0)+(f=r)|0))/(0|A)|0);for(;e=(0|e)/2|0,131072<((r=(0|r)/2|0)+65536|0)>>>0;);return 0|(A=(0|(A=(A=(0|e)/2|0)+r|0))/(0|e)|0)}function Ao(A,e){e|=0;var r=0,i=0;if(r=0|ar[(A|=0)+68>>2],i=(0|ar[A+64>>2])-r|0,131072<(r+65536|0)>>>0)for(;i=(0|i)/2|0,131072<((r=(0|r)/2|0)+65536|0)>>>0;);if(131072<(i+65536|0)>>>0)for(;r=(0|r)/2|0,131072<((i=(0|i)/2|0)+65536|0)>>>0;);if(i=(0|br(0|$t(A,e),r))+i|0,131072<(r+65536|0)>>>0)for(;i=(0|i)/2|0,131072<((r=(0|r)/2|0)+65536|0)>>>0;);if((i+65536|0)>>>0<=131072)return A=i,0|(e=(0|(A=(i=(0|(e=r))/2|0)+A|0))/(0|e)|0);for(;r=(0|r)/2|0,131072<((i=(0|i)/2|0)+65536|0)>>>0;);return 0|(e=(0|(e=(e=(0|r)/2|0)+i|0))/(0|r)|0)}function eo(A){var e=0,r=0,i=0,f=0,n=0;if(n=0|ar[(A|=0)+60>>2],e=(0|ar[A+56>>2])-n|0,f=131072<(n+65536|0)>>>0)for(r=e,A=n;r=(0|r)/2|0,131072<((A=(0|A)/2|0)+65536|0)>>>0;);else r=e,A=n;if(131072<(r+65536|0)>>>0)for(;A=(0|A)/2|0,131072<((r=(0|r)/2|0)+65536|0)>>>0;);if(131072<((A<<=1)+65536|0)>>>0)for(;r=(0|r)/2|0,131072<((A=(0|A)/2|0)+65536|0)>>>0;);if(131072<(r+65536|0)>>>0)for(;A=(0|A)/2|0,131072<((r=(0|r)/2|0)+65536|0)>>>0;);if(i=0-r|0,1==(0|A))if(131072<(65536-r|0)>>>0)for(A=1;A=(0|A)/2|0,131072<((i=(0|i)/2|0)+65536|0)>>>0;);else A=1;else{if(131072<(A+65536|0)>>>0)for(;i=(0|i)/2|0,131072<((A=(0|A)/2|0)+65536|0)>>>0;);if(131072<(i+65536|0)>>>0)for(;A=(0|A)/2|0,131072<((i=(0|i)/2|0)+65536|0)>>>0;);}if(r=(((0|A)/2|0)+i|0)/(0|A)|0,f)for(A=n;e=(0|e)/2|0,131072<((A=(0|A)/2|0)+65536|0)>>>0;);else A=n;if(131072<(e+65536|0)>>>0)for(;A=(0|A)/2|0,131072<((e=(0|e)/2|0)+65536|0)>>>0;);if(131072<((A<<=1)+65536|0)>>>0)for(;e=(0|e)/2|0,131072<((A=(0|A)/2|0)+65536|0)>>>0;);if((e+65536|0)>>>0<=131072)return n=(0|(f=(i=(0|(n=A))/2|0)+(f=e)|0))/(0|n)|0,0|(n=(f=1-r|0)+n|0);for(;A=(0|A)/2|0,131072<((e=(0|e)/2|0)+65536|0)>>>0;);return 0|(n=(f=1-r|0)+(n=(0|(n=(n=(0|A)/2|0)+e|0))/(0|A)|0)|0)}function ro(A){var e=0,r=0,i=0,f=0,n=0;if(n=0|ar[(A|=0)+68>>2],e=(0|ar[A+64>>2])-n|0,f=131072<(n+65536|0)>>>0)for(r=e,A=n;r=(0|r)/2|0,131072<((A=(0|A)/2|0)+65536|0)>>>0;);else r=e,A=n;if(131072<(r+65536|0)>>>0)for(;A=(0|A)/2|0,131072<((r=(0|r)/2|0)+65536|0)>>>0;);if(131072<((A<<=1)+65536|0)>>>0)for(;r=(0|r)/2|0,131072<((A=(0|A)/2|0)+65536|0)>>>0;);if(131072<(r+65536|0)>>>0)for(;A=(0|A)/2|0,131072<((r=(0|r)/2|0)+65536|0)>>>0;);if(i=0-r|0,1==(0|A))if(131072<(65536-r|0)>>>0)for(A=1;A=(0|A)/2|0,131072<((i=(0|i)/2|0)+65536|0)>>>0;);else A=1;else{if(131072<(A+65536|0)>>>0)for(;i=(0|i)/2|0,131072<((A=(0|A)/2|0)+65536|0)>>>0;);if(131072<(i+65536|0)>>>0)for(;A=(0|A)/2|0,131072<((i=(0|i)/2|0)+65536|0)>>>0;);}if(r=(((0|A)/2|0)+i|0)/(0|A)|0,f)for(A=n;e=(0|e)/2|0,131072<((A=(0|A)/2|0)+65536|0)>>>0;);else A=n;if(131072<(e+65536|0)>>>0)for(;A=(0|A)/2|0,131072<((e=(0|e)/2|0)+65536|0)>>>0;);if(131072<((A<<=1)+65536|0)>>>0)for(;e=(0|e)/2|0,131072<((A=(0|A)/2|0)+65536|0)>>>0;);if((e+65536|0)>>>0<=131072)return n=(0|(f=(i=(0|(n=A))/2|0)+(f=e)|0))/(0|n)|0,0|(n=(f=1-r|0)+n|0);for(;A=(0|A)/2|0,131072<((e=(0|e)/2|0)+65536|0)>>>0;);return 0|(n=(f=1-r|0)+(n=(0|(n=(n=(0|A)/2|0)+e|0))/(0|A)|0)|0)}function io(A,e,r){e|=0,r|=0;var i,f,n,t=0;if(ar[(A|=0)>>2]=0,ar[(n=A+4|0)>>2]=0,((ar[A+8>>2]=0)|(t=0|ar[e+56>>2]))!=(0|(f=0|ar[e+60>>2]))){i=A+8|0,e=t;do{do{if((0|ar[e+48>>2])==(0|r)){if((0|(t=0|ar[n>>2]))==(0|ar[i>>2])){de(A,e);break}se(t,e),ar[n>>2]=64+(0|ar[n>>2]);break}}while(0);e=e+64|0}while((0|e)!=(0|f))}}function fo(A,e,r,i){A|=0,r|=0,i|=0;var f=0;f=0|ar[(e|=0)+56>>2],e=0|ar[e+60>>2];A:do{if((0|f)!=(0|e)){for(;(0|ar[f+48>>2])!=(0|r)||(0|ar[f+20>>2])!=(0|i);)if((0|(f=f+64|0))==(0|e))break A;return void Ge(A,f+52|0)}}while(0);ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0}function no(A,e){e|=0;var r,i,f,n,t,o,a,c,l,u,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0;if(ur=(u=ur)+32|0,o=u+20|0,t=u+16|0,n=u+12|0,a=u+8|0,c=u+4|0,l=u,(0|(b=0|ar[(A|=0)+92>>2]))==(0|(f=0|ar[A+96>>2])))return ur=u,1;r=e+4|0,i=e+8|0;A:for(;;){if((0|(A=0|ar[b+4>>2]))!=(0|(p=0|ar[b+8>>2])))do{if(w=((0|ar[(Z=A+4|0)>>2])-(0|ar[A>>2])|0)>>>24&255,s=0|ar[r>>2],(d=g=0|ar[i>>2])>>>0<=s>>>0){if(m=g=0|ar[e>>2],(0|(s=(v=s-g|0)+1|0))<0){A=9;break A}k=(h=d-g|0)<<1,h=(k=h>>>0<1073741823?k>>>0<s>>>0?s:k:2147483647)?0|hu(k):0,tr[(d=h+v|0)>>0]=w,s=d+1|0,d=d+(0-v)|0,0<(0|v)&&hb(0|d,0|m,0|v),ar[e>>2]=d,ar[r>>2]=s,ar[i>>2]=h+k,g&&(vu(m),s=0|ar[r>>2])}else tr[s>>0]=w,s=1+(0|ar[r>>2])|0,ar[r>>2]=s;if(w=((0|ar[Z>>2])-(0|ar[A>>2])|0)>>>16&255,(d=g=0|ar[i>>2])>>>0<=s>>>0){if(m=g=0|ar[e>>2],(0|(s=(v=s-g|0)+1|0))<0){A=19;break A}k=(h=d-g|0)<<1,h=(k=h>>>0<1073741823?k>>>0<s>>>0?s:k:2147483647)?0|hu(k):0,tr[(d=h+v|0)>>0]=w,s=d+1|0,d=d+(0-v)|0,0<(0|v)&&hb(0|d,0|m,0|v),ar[e>>2]=d,ar[r>>2]=s,ar[i>>2]=h+k,g&&(vu(m),s=0|ar[r>>2])}else tr[s>>0]=w,s=1+(0|ar[r>>2])|0,ar[r>>2]=s;if(w=((0|ar[Z>>2])-(0|ar[A>>2])|0)>>>8&255,(d=g=0|ar[i>>2])>>>0<=s>>>0){if(m=g=0|ar[e>>2],(0|(s=(v=s-g|0)+1|0))<0){A=29;break A}k=(h=d-g|0)<<1,h=(k=h>>>0<1073741823?k>>>0<s>>>0?s:k:2147483647)?0|hu(k):0,tr[(d=h+v|0)>>0]=w,s=d+1|0,d=d+(0-v)|0,0<(0|v)&&hb(0|d,0|m,0|v),ar[e>>2]=d,ar[r>>2]=s,ar[i>>2]=h+k,g&&(vu(m),s=0|ar[r>>2])}else tr[s>>0]=w,s=1+(0|ar[r>>2])|0,ar[r>>2]=s;if(w=(0|ar[Z>>2])-(0|ar[A>>2])&255,(d=g=0|ar[i>>2])>>>0<=s>>>0){if(m=g=0|ar[e>>2],(0|(s=(v=s-g|0)+1|0))<0){A=39;break A}k=(h=d-g|0)<<1,h=(k=h>>>0<1073741823?k>>>0<s>>>0?s:k:2147483647)?0|hu(k):0,tr[(d=h+v|0)>>0]=w,s=d+1|0,d=d+(0-v)|0,0<(0|v)&&hb(0|d,0|m,0|v),ar[e>>2]=d,ar[r>>2]=s,ar[i>>2]=h+k,g&&(vu(m),s=0|ar[r>>2])}else tr[s>>0]=w,s=1+(0|ar[r>>2])|0,ar[r>>2]=s;ar[a>>2]=s,ar[c>>2]=ar[A>>2],ar[l>>2]=ar[Z>>2],ar[n>>2]=ar[a>>2],ar[t>>2]=ar[c>>2],ar[o>>2]=ar[l>>2],to(e,n,t,o),A=A+12|0}while((0|A)!=(0|p));if((0|(b=b+16|0))==(0|f)){A=3;break}}return 3==(0|A)?(ur=u,1):(9!=(0|A)&&19!=(0|A)&&29!=(0|A)&&39!=(0|A)||zl(),0)}function to(A,e,r,i){e|=0,r|=0,i|=0;var f,n,t,o,a=0,c=0,l=0,u=0,b=0,s=0,d=0;if(e=(u=f=0|ar[(A|=0)>>2])+(b=(0|ar[e>>2])-u|0)|0,a=0|ar[r>>2],t=c=0|ar[i>>2],(0|(s=c-a|0))<=0)return 0|(d=e);if((0|s)<=((l=0|ar[(o=A+8|0)>>2])-(i=n=0|ar[(d=A+4|0)>>2])|0)){if((0|(l=i-e|0))<(0|s)){if((0|(c=i=a+l|0))==(0|t))i=n;else{for(a=n;tr[a>>0]=0|tr[i>>0],i=i+1|0,a=1+(0|ar[d>>2])|0,ar[d>>2]=a,(0|i)!=(0|t););i=a}if(!(0<(0|l)))return 0|(d=e);u=i}else u=n;if((i=e+(l=u-(e+s)|0)|0)>>>0<n>>>0)for(a=u;tr[a>>0]=0|tr[i>>0],i=i+1|0,a=1+(0|ar[d>>2])|0,ar[d>>2]=a,(0|i)!=(0|n););if(0|l&&wb(u+(0-l)|0,0|e,0|l),(0|(i=0|ar[r>>2]))==(0|c))return 0|(d=e);for(a=e;tr[a>>0]=0|tr[i>>0],(0|(i=i+1|0))!=(0|c);)a=a+1|0;return 0|e}if((0|(i=i-u+s|0))<0&&zl(),c=(u=l-u|0)<<1,c=u>>>0<1073741823?c>>>0<i>>>0?i:c:2147483647,u=e,i=s=(l=c?0|hu(c):0)+b|0,b=l+c|0,(0|a)==(0|t))c=f;else{for(c=s;tr[c>>0]=0|tr[a>>0],i=c=i+1|0,(0|(a=a+1|0))!=(0|t););c=0|ar[A>>2]}return l=s+(0-(a=u-c|0))|0,0<(0|a)&&hb(0|l,0|c,0|a),e=0<(0|(a=(0|ar[d>>2])-u|0))?(hb(0|i,0|e,0|a),i=i+a|0,0|ar[A>>2]):c,ar[A>>2]=l,ar[d>>2]=i,ar[o>>2]=b,e&&vu(e),0|(d=s)}function oo(A,e,r,i){e|=0,r|=0,i|=0,ar[(A|=0)>>2]=e,ar[A+4>>2]=r,yu(A+8|0,i)}function ao(A,e,r){A|=0,r|=0;var i,f,n,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0;if(ur=(n=ur)+176|0,o=n+160|0,i=n+16|0,f=n,t=0|ar[(e|=0)>>2],!r)return ar[A>>2]=t,ar[A+4>>2]=ar[e+4>>2],e=0|ar[(e=6168)>>2],ar[(A=A+8|0)>>2]=e,void(ur=n);if(t){switch(u=64+i|0,ar[(s=8+i|0)>>2]=4524,b=12+i|0,ar[i>>2]=188,ar[u>>2]=208,Jf(64+i|(ar[4+i>>2]=0),b),ar[136+i>>2]=0,ar[140+i>>2]=-1,ar[i>>2]=4504,ar[u>>2]=4544,ar[s>>2]=4524,Sf(b),ar[b>>2]=4340,ar[(s=44+i|0)>>2]=0,ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s+12>>2]=0,ar[60+i>>2]=24,ar[o>>2]=0,ar[o+4>>2]=0,ar[o+8>>2]=0,Xe(b,o),(0|tr[o+11>>0])<0&&vu(0|ar[o>>2]),l=8+i|0,0|ar[e>>2]){case 0:a=32215;break;case 1:a=24245;break;case 2:a=24231;break;case 3:a=24209;break;case 4:a=24189;break;case 5:a=24177;break;case 6:a=24153;break;case 7:a=24119;break;case 8:a=24085;break;case 9:a=24040;break;case 10:a=24011;break;default:sr(55739,23985,74,23994)}c=0|We(0|We(l,a,0|Vc(a)),25392,2),We(c,a=0|function(A){var e=0;switch(0|(A|=0)){case 0:e=25380;break;case 100:e=25357;break;case 101:e=25340;break;case 118:e=25322;break;case 119:e=25302;break;case 102:e=25288;break;case 103:e=25274;break;case 104:e=25260;break;case 105:e=25246;break;case 106:e=25232;break;case 131:e=25218;break;case 107:e=25204;break;case 108:e=25190;break;case 109:e=25176;break;case 110:e=25162;break;case 111:e=25148;break;case 112:e=25134;break;case 113:e=25120;break;case 125:e=25106;break;case 114:e=25085;break;case 115:e=25039;break;case 116:e=25008;break;case 117:e=24991;break;case 120:e=24954;break;case 121:e=24933;break;case 122:e=24896;break;case 123:e=24860;break;case 124:e=24833;break;case 126:e=24806;break;case 127:e=24775;break;case 128:e=24749;break;case 129:e=24730;break;case 130:e=24713;break;case 1e3:e=24689;break;case 2e3:e=24657;break;case 2001:e=24634;break;case 2002:e=24596;break;case 2003:e=24546;break;case 2004:e=24496;break;case 2005:e=24474;break;case 2006:e=24450;break;case 3e3:e=24432;break;case 3001:e=24409;break;case 3002:e=24384;break;case 3003:e=24355;break;case 3004:e=24318;break;case 4e3:e=24296;break;case 5e3:e=24271;break;default:sr(55739,23985,198,23994)}return 0|e}(0|ar[(o=e+4|0)>>2]),0|Vc(a)),(t=0|tr[(c=(a=e+8|0)+11|0)>>0])<<24>>24<0?t=0|ar[e+12>>2]:t&=255,0|t&&(d=0|We(l,25392,2),We(d,(t=(c=0|tr[c>>0])<<24>>24<0)?0|ar[a>>2]:a,t?0|ar[e+12>>2]:255&c)),Ie(f,b),Eu(r,f),t=(0|tr[r+11>>0])<0?0|ar[r>>2]:r,ar[(a=r+12|0)>>2]=t,(0|tr[f+11>>0])<0&&vu(0|ar[f>>2]),ar[i>>2]=4504,ar[u>>2]=4544,ar[l>>2]=4524,ar[b>>2]=4340,(0|tr[s+11>>0])<0&&vu(0|ar[s>>2]),kf(b),bf(u),t=0|ar[e>>2]}else ar[(a=r+12|0)>>2]=32215,o=e+4|0,t=0;ar[A>>2]=t,ar[A+4>>2]=ar[o>>2],e=0|ar[(e=a)>>2],ar[(d=A+8|0)>>2]=e,ur=n}function co(A){var e,r,i;for(ar[(A|=0)+112>>2]=0,r=A+112|(ar[A+116>>2]=0),e=i=A+108|0;(0|(A=A+4|(ar[A>>2]=0)))<(0|e););ar[i>>2]=r}function lo(A){var e,r=0,i=0,f=0,n=0;if(uo((A|=0)+108|0,0|ar[A+112>>2]),0|(r=0|ar[A+104>>2])&&du(r),0|(r=0|ar[A+96>>2])&&du(r),0|(r=0|ar[A+88>>2])&&du(r),0|(r=0|ar[A+80>>2])&&du(r),0|(r=0|ar[A+72>>2])&&du(r),0|(r=0|ar[A+64>>2])&&du(r),0|(r=0|ar[A+56>>2])&&du(r),0|(r=0|ar[A+48>>2])&&du(r),0|(r=0|ar[A+40>>2])&&du(r),0|(r=0|ar[A+32>>2])&&du(r),0|(r=0|ar[A+24>>2])&&du(r),0|(r=0|ar[(e=A+8|0)>>2])){if((0|(i=0|ar[(n=A+12|0)>>2]))!=(0|r)){for(;f=i+-8|0,ar[n>>2]=f,(0|(i=(i=0|ar[i+-4>>2])?(du(i),0|ar[n>>2]):f))!=(0|r););r=0|ar[e>>2]}vu(r)}(r=0|ar[A+4>>2])&&du(r)}function uo(A,e){A|=0,(e|=0)&&(uo(A,0|ar[e>>2]),uo(A,0|ar[e+4>>2]),0|(A=0|ar[e+24>>2])&&du(A),vu(e))}function bo(A,e,r){A|=0,e|=0;var i,f,n,t,o,a=0;ur=(o=ur)+48|0,n=(t=o)+32|0,f=0|ar[(r|=0)>>2],0|(a=0|ar[r+4>>2])&&bu(a),ar[e>>2]=f,r=0|ar[(i=e+4|0)>>2],ar[i>>2]=a,r?(du(r),r=0|ar[e>>2],a=0|ar[i>>2]):r=f,ar[n>>2]=r,0|(ar[(r=4+n|0)>>2]=a)&&bu(a),WA(t,n,-1,2147483647,0),0|(r=0|ar[r>>2])&&du(r),function(A,e,r){A|=0;var i,f,n,t,o,a,c,l,u,b,s,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0,R=0,N=0,_=0,Y=0,Q=0,D=0;ur=(s=ur)+288|0,t=s+264|0,C=s+108|0,o=s+96|0,c=s+84|0,l=s+72|0,u=s+60|0,R=s+48|0,N=s+36|0,_=s+24|0,Q=s+12|0,i=4+(b=(D=s)+276|0)|0,w=24+(r|=0)|0,v=r+16|0,m=12+(e|=0)|0,g=e+16|0,Z=e+8|0,p=e+36|0,y=e+40|0,B=e+20|0,E=e+24|0,n=11+(f=8+(a=s+120|0)|0)|0;for(;;){if(ar[b>>2]=0,ar[i>>2]=0,Ae(a,r,b),(0|ar[a>>2])!=(0|ar[14148])){Y=40;break}if(0|tr[w>>0]){Y=35;break}if(0==(0|ar[(Y=v)>>2])&0==(0|ar[Y+4>>2])){Y=30;break}(0|(d=0|ar[m>>2]))==(0|ar[g>>2])?Ut(Z,b):(ar[d>>2]=ar[b>>2],k=0|ar[i>>2],(ar[d+4>>2]=k)&&(bu(k),d=0|ar[m>>2]),ar[m>>2]=d+8),k=0|ar[b>>2],1835365473==(0|(d=0|ar[k+20>>2]))&&(0!=(0|k)&&0!=(0|(X=0|qu(k,128,160,0)))?(d=X,h=0|ar[i>>2],(k=h)&&bu(h)):k=d=0,ar[p>>2]=d,d=0|ar[y>>2],ar[y>>2]=k,0|d&&du(d),k=0|ar[b>>2],d=0|ar[k+20>>2]),1718909296==(0|d)&&(0!=(0|k)&&0!=(0|(W=0|qu(k,128,144,0)))?(d=W,h=0|ar[i>>2],(k=h)&&bu(h)):k=d=0,ar[B>>2]=d,d=0|ar[E>>2],ar[E>>2]=k,0|d&&du(d)),(0|tr[n>>0])<0&&vu(0|ar[f>>2]),0|(d=0|ar[i>>2])&&du(d)}30!=(0|Y)&&35!=(0|Y)&&40!=(0|Y)||((0|tr[n>>0])<0&&vu(0|ar[f>>2]),0|(d=0|ar[i>>2])&&du(d));if(!(k=0|ar[(d=e+20|0)>>2]))return ar[t>>2]=0,ar[4+t>>2]=0,ar[8+t>>2]=0,oo(A,2,102,t),0<=(0|tr[11+t>>0])||vu(0|ar[t>>2]),ur=s;if(!(0|St(k,1751476579)||0|St(0|ar[d>>2],1751476600)||0|St(0|ar[d>>2],1835623985))&&!(0|St(0|ar[d>>2],1635150182)))return k=64+a|0,ar[(w=8+a|0)>>2]=4524,h=12+a|0,ar[a>>2]=188,ar[k>>2]=208,ar[4+a>>2]=0,Jf(64+a|0,h),ar[136+a>>2]=0,ar[140+a>>2]=-1,ar[a>>2]=4504,ar[k>>2]=4544,ar[w>>2]=4524,Sf(h),ar[h>>2]=4340,ar[(w=44+a|0)>>2]=0,ar[w+4>>2]=0,ar[w+8>>2]=0,ar[w+12>>2]=0,ar[60+a>>2]=24,ar[b>>2]=0,ar[4+b>>2]=0,ar[8+b>>2]=0,Xe(h,b),(0|tr[11+b>>0])<0&&vu(0|ar[b>>2]),We(d=8+a|0,25395,44),Ie(C,h),oo(A,3,0,C),(0|tr[C+11>>0])<0&&vu(0|ar[C>>2]),ar[a>>2]=4504,ar[k>>2]=4544,ar[d>>2]=4524,ar[h>>2]=4340,(0|tr[w+11>>0])<0&&vu(0|ar[w>>2]),kf(h),bf(k),ur=s;if(!(d=0|ar[(v=e+36|0)>>2]))return ar[o>>2]=0,ar[4+o>>2]=0,ar[8+o>>2]=0,oo(A,2,104,o),0<=(0|tr[11+o>>0])||vu(0|ar[o>>2]),ur=s;Tt(b,d,1751411826),k=0!=(0|(d=0|ar[b>>2]))&&0!=(0|(I=0|qu(d,128,1128,0)))?(d=I,k=0|ar[4+b>>2],(h=k)&&bu(k),h):d=0;ar[(h=e+28|0)>>2]=d,d=0|ar[(C=e+32|0)>>2],ar[C>>2]=k,0|d&&du(d);0|(d=0|ar[4+b>>2])&&du(d);if(0|(C=0|ar[h>>2])&&1885954932!=(0|ar[C+60>>2]))return ar[c>>2]=0,ar[4+c>>2]=0,ar[8+c>>2]=0,oo(A,2,114,c),0<=(0|tr[11+c>>0])||vu(0|ar[c>>2]),ur=s;Tt(b,0|ar[v>>2],1885959277),k=0!=(0|(d=0|ar[b>>2]))&&0!=(0|(G=0|qu(d,128,1096,0)))?(d=G,k=0|ar[4+b>>2],(h=k)&&bu(k),h):d=0;ar[(h=e+84|0)>>2]=d,d=0|ar[(G=e+88|0)>>2],ar[G>>2]=k,0|d&&du(d);0|(d=0|ar[4+b>>2])&&du(d);if(!(0|ar[h>>2]))return ar[l>>2]=0,ar[4+l>>2]=0,ar[8+l>>2]=0,oo(A,2,107,l),0<=(0|tr[11+l>>0])||vu(0|ar[l>>2]),ur=s;Tt(b,0|ar[v>>2],1768977008),k=0!=(0|(d=0|ar[b>>2]))&&0!=(0|(V=0|qu(d,128,968,0)))?(d=V,k=0|ar[4+b>>2],(h=k)&&bu(k),h):d=0;ar[(w=e+100|0)>>2]=d,d=0|ar[(V=e+104|0)>>2],ar[V>>2]=k,0|d&&du(d);0|(d=0|ar[4+b>>2])&&du(d);if(!(d=0|ar[w>>2]))return ar[u>>2]=0,ar[4+u>>2]=0,ar[8+u>>2]=0,oo(A,2,112,u),0<=(0|tr[11+u>>0])||vu(0|ar[u>>2]),ur=s;Tt(b,d,1768973167),k=0!=(0|(d=0|ar[b>>2]))&&0!=(0|(F=0|qu(d,128,936,0)))?(d=F,k=0|ar[4+b>>2],(h=k)&&bu(k),h):d=0;ar[(h=e+44|0)>>2]=d,d=0|ar[(F=e+48|0)>>2],ar[F>>2]=k,0|d&&du(d);0|(d=0|ar[4+b>>2])&&du(d);if(!(0|ar[h>>2]))return ar[R>>2]=0,ar[R+4>>2]=0,ar[R+8>>2]=0,oo(A,2,108,R),0<=(0|tr[R+11>>0])||vu(0|ar[R>>2]),ur=s;Tt(b,0|ar[w>>2],1768975713),d=0|ar[b>>2];do{if(d){if(!(d=0|qu(d,128,904,0))){k=d=0;break}if(k=0|ar[4+b>>2],!(h=k)){k=h;break}bu(k),k=h}else k=d=0}while(0);ar[(h=e+52|0)>>2]=d,d=0|ar[(R=e+56|0)>>2],ar[R>>2]=k,0|d&&du(d);0|(d=0|ar[4+b>>2])&&du(d);if(!(0|ar[h>>2]))return ar[N>>2]=0,ar[N+4>>2]=0,ar[N+8>>2]=0,oo(A,2,109,N),0<=(0|tr[N+11>>0])||vu(0|ar[N>>2]),ur=s;Tt(b,0|ar[v>>2],1768714083),d=0|ar[b>>2];do{if(d){if(!(d=0|qu(d,128,1064,0))){k=d=0;break}if(k=0|ar[4+b>>2],!(h=k)){k=h;break}bu(k),k=h}else k=d=0}while(0);ar[(h=e+60|0)>>2]=d,d=0|ar[(N=e+64|0)>>2],ar[N>>2]=k,0|d&&du(d);0|(d=0|ar[4+b>>2])&&du(d);if(!(0|ar[h>>2]))return ar[_>>2]=0,ar[_+4>>2]=0,ar[_+8>>2]=0,oo(A,2,110,_),0<=(0|tr[_+11>>0])||vu(0|ar[_>>2]),ur=s;Tt(b,0|ar[v>>2],1768186228),d=0|ar[b>>2];do{if(d){if(!(d=0|qu(d,128,616,0))){k=d=0;break}if(h=0|ar[4+b>>2],!(k=h))break;bu(h)}else k=d=0}while(0);ar[e+68>>2]=d,d=0|ar[(_=e+72|0)>>2],ar[_>>2]=k,0|d&&du(d);0|(d=0|ar[4+b>>2])&&du(d);Tt(b,0|ar[v>>2],1769104742),d=0|ar[b>>2];do{if(d){if(!(d=0|qu(d,128,712,0))){k=d=0;break}if(h=0|ar[4+b>>2],!(k=h))break;bu(h)}else k=d=0}while(0);ar[e+76>>2]=d,d=0|ar[(_=e+80|0)>>2],ar[_>>2]=k,0|d&&du(d);0|(d=0|ar[4+b>>2])&&du(d);Tt(b,0|ar[v>>2],1768517222),d=0|ar[b>>2];do{if(d){if(!(d=0|qu(d,128,1032,0))){k=d=0;break}if(k=0|ar[4+b>>2],!(h=k)){k=h;break}bu(k),k=h}else k=d=0}while(0);ar[(h=e+92|0)>>2]=d,d=0|ar[(_=e+96|0)>>2],ar[_>>2]=k,0|d&&du(d);0|(d=0|ar[4+b>>2])&&du(d);if(!(d=0|ar[h>>2]))return ar[Q>>2]=0,ar[Q+4>>2]=0,ar[Q+8>>2]=0,oo(A,2,111,Q),0<=(0|tr[Q+11>>0])||vu(0|ar[Q>>2]),ur=s;(function(A,e,r){e|=0,r|=0;var i,f,n,t=0,o=0;if(ar[(A|=0)>>2]=0,ar[(n=A+4|0)>>2]=0,((ar[A+8>>2]=0)|(t=0|ar[e+44>>2]))!=(0|(f=0|ar[e+48>>2]))){i=A+8|0;do{o=e=0|ar[t>>2];do{if((0|ar[e+20>>2])==(0|r)){if((0|(e=0|ar[n>>2]))==(0|ar[i>>2])){Ut(A,t);break}ar[e>>2]=o,o=0|ar[t+4>>2],(ar[e+4>>2]=o)&&(bu(o),e=0|ar[n>>2]),ar[n>>2]=e+8}}while(0);t=t+8|0}while((0|t)!=(0|f))}})(b,d,1768842853),d=0|ar[b>>2],p=0|ar[(W=4+b|0)>>2];A:do{if((0|d)==(0|p))Y=186;else for(y=D+11|0,B=e+108|0,X=E=e+112|0,Z=e+116|0;;){k=0|ar[d>>2];do{if(k){if(!(h=0|qu(k,128,1e3,0))){k=0,Y=164;break}if(g=h,(k=0|ar[d+4>>2])?bu(k):k=0,!h){Y=164;break}m=0|ar[h+56>>2],0|(r=k)&&bu(k),h=0|ar[E>>2];do{if(h){for(v=X;;)if(w=0|ar[h+16>>2],m>>>0<w>>>0){if(!(w=0|ar[h>>2])){Y=172;break}v=h,h=w}else{if(m>>>0<=w>>>0){Y=176;break}if(!(w=0|ar[(v=h+4|0)>>2])){Y=175;break}h=w}if(172==(0|Y)){Y=0,v=w=h;break}if(175==(0|Y)){Y=0,w=h;break}if(176==(0|Y)){Y=0,w=h;break}}else v=w=E}while(0);if(0|ar[v>>2]){if(!k){h=0;break}du(k),h=0;break}h=0|hu(28),ar[h+16>>2]=m,ar[h+20>>2]=g,ar[h+24>>2]=r,ar[h>>2]=0,ar[h+4>>2]=0,ar[h+8>>2]=w,ar[v>>2]=h,(w=0|ar[ar[B>>2]>>2])&&(ar[B>>2]=w,h=0|ar[v>>2]),so(0|ar[X>>2],h),ar[Z>>2]=1+(0|ar[Z>>2]),h=0}else k=0,Y=164}while(0);do{if(164==(0|Y)){if(Y=0,ar[D>>2]=0,ar[D+4>>2]=0,ar[D+8>>2]=0,oo(A,2,125,D),0<=(0|tr[y>>0])){h=1;break}vu(0|ar[D>>2]),h=1}}while(0);if(0|k&&du(k),d=d+8|0,0|h)break A;if((0|d)==(0|p)){Y=186;break}}}while(0);186==(0|Y)&&(e=0|ar[(Q=56592)+4>>2],ar[(D=A)>>2]=ar[Q>>2],ar[D+4>>2]=e,yu(A+8|0,56600));if(0|(d=0|ar[b>>2])){if((0|(k=0|ar[W>>2]))!=(0|d)){for(;h=k+-8|0,ar[W>>2]=h,(0|(k=(k=0|ar[k+-4>>2])?(du(k),0|ar[W>>2]):h))!=(0|d););d=0|ar[b>>2]}vu(d)}ur=s}(A,e,t),ur=((r=0|ar[t+4>>2])&&du(r),o)}function so(A,e){var r=0,i=0,f=0,n=0,t=0;if(t=(0|(e|=0))==(0|(A|=0)),tr[e+12>>0]=1&t,!t){for(;;){if(t=0|ar[e+8>>2],0|tr[(f=t+12|0)>>0]){r=23;break}if(i=0|ar[(n=t+8|0)>>2],(0|(r=0|ar[i>>2]))==(0|t)){if(!(r=0|ar[i+4>>2])){r=7;break}if(0|tr[(r=r+12|0)>>0]){r=7;break}e=r}else{if(!r){r=16;break}if(0|tr[(r=r+12|0)>>0]){r=16;break}e=r}if(tr[f>>0]=1,t=(0|i)==(0|A),tr[i+12>>0]=1&t,tr[e>>0]=1,t){r=23;break}e=i}if(7==(0|r))return f=(0|ar[t>>2])==(0|e)?(e=t,i):(r=0|ar[(A=t+4|0)>>2],e=0|ar[r>>2],e=(ar[A>>2]=e)?(ar[e+8>>2]=t,0|ar[n>>2]):i,ar[r+8>>2]=e,e=0|ar[n>>2],ar[((0|ar[e>>2])==(0|t)?e:e+4|0)>>2]=r,ar[r>>2]=t,ar[n>>2]=r,0|ar[(e=r)+8>>2]),tr[e+12>>0]=1,e=(tr[f+12>>0]=0)|ar[f>>2],i=0|ar[(r=e+4|0)>>2],0|(ar[f>>2]=i)&&(ar[i+8>>2]=f),t=f+8|0,ar[e+8>>2]=ar[t>>2],n=0|ar[t>>2],ar[((0|ar[n>>2])==(0|f)?n:n+4|0)>>2]=e,ar[r>>2]=f,void(ar[t>>2]=e);if(16==(0|r))return(0|ar[t>>2])==(0|e)?(f=0|ar[t>>2],e=0|ar[(r=f+4|0)>>2],(ar[t>>2]=e)&&(ar[e+8>>2]=t,i=0|ar[n>>2]),ar[f+8>>2]=i,e=0|ar[n>>2],ar[((0|ar[e>>2])==(0|t)?e:e+4|0)>>2]=f,ar[r>>2]=t,ar[n>>2]=f,i=0|ar[(e=f)+8>>2]):e=t,tr[e+12>>0]=1,e=(tr[i+12>>0]=0)|ar[(t=i+4|0)>>2],r=0|ar[e>>2],0|(ar[t>>2]=r)&&(ar[r+8>>2]=i),t=i+8|0,ar[e+8>>2]=ar[t>>2],n=0|ar[t>>2],ar[((0|ar[n>>2])==(0|i)?n:n+4|0)>>2]=e,ar[e>>2]=i,void(ar[t>>2]=e)}}function ko(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f|=0;var n,t,o,a;ur=(n=ur)+16|0,o=n,t=0|hu(48),ar[4+t>>2]=0,ar[8+t>>2]=0,ar[t>>2]=6180,function(A,e,r,i,f){e|=0,r|=0,i|=0,f|=0;var n=0;if(ar[(A|=0)>>2]=4232,ar[(n=A+8|0)>>2]=r,ar[n+4>>2]=i,ar[(n=A+16|0)>>2]=0,ar[n+4>>2]=0,ar[(n=A+24|0)>>2]=0,!f)return i=e,ar[(f=A+4|0)>>2]=i;i=0|wu(f=i>>>0<0|0==(0|i)&r>>>0<4294967295?r:-1),hb(0|(ar[n>>2]=i),0|e,0|r),ar[(f=A+4|0)>>2]=i}(a=16+t|0,r,i,0,f),ar[o>>2]=a,bu(ar[o+4>>2]=t),bo(A,e,o),du(t),du(t),ur=n}function ho(A,e,r){A|=0,r|=0;var i,f=0,n=0,t=0;if(f=0|ar[(i=(e|=0)+112|0)>>2]){e=i,n=f;A:for(;;){for(f=n;!((0|ar[f+16>>2])>>>0>=r>>>0);)if(!(f=0|ar[f+4>>2]))break A;if(!(n=0|ar[f>>2])){e=f;break}e=f}(0|e)!=(0|i)&&(0|ar[e+16>>2])>>>0<=r>>>0?(f=0|ar[e+20>>2],(e=0|ar[e+24>>2])?bu(e):e=0,f?yu(A,f+64|0):t=11):(e=0,t=11)}else e=0,t=11;11==(0|t)&&(ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0),e&&du(e)}function wo(A,e,r){A|=0,r|=0;var i,f=0,n=0,t=0;if(f=0|ar[(i=(e|=0)+112|0)>>2]){e=i,n=f;A:for(;;){for(f=n;!((0|ar[f+16>>2])>>>0>=r>>>0);)if(!(f=0|ar[f+4>>2]))break A;if(!(n=0|ar[f>>2])){e=f;break}e=f}(0|e)!=(0|i)&&(0|ar[e+16>>2])>>>0<=r>>>0?(f=0|ar[e+20>>2],(e=0|ar[e+24>>2])?bu(e):e=0,f?yu(A,f+88|0):t=11):(e=0,t=11)}else e=0,t=11;11==(0|t)&&(ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0),e&&du(e)}function vo(A,e,r,i){A|=0,r|=0,i|=0;var f,n,t,o;return ur=(o=ur)+32|0,f=o+12|0,n=o,(t=0|ar[(e|=0)+44>>2])?0|ar[(e=e+52|0)>>2]?(Ht(A,t,r,e,i),void(ur=o)):(ar[n>>2]=0,ar[n+4>>2]=0,ar[n+8>>2]=0,oo(A,2,109,n),void(ur=(0<=(0|tr[n+11>>0])||vu(0|ar[n>>2]),o))):(ar[f>>2]=0,ar[4+f>>2]=0,ar[8+f>>2]=0,oo(A,2,108,f),0<=(0|tr[11+f>>0])||vu(0|ar[f>>2]),void(ur=o))}function mo(A,e,r,i){A|=0,r|=0,i|=0;var f,n,t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p,y,B,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0,R=0,N=0,_=0,Y=0,Q=0,D=0,J=0,M=0,T=0,U=0,S=0;if(ur=(d=ur)+352|0,l=d+192|0,C=d+328|0,V=d+304|0,b=d+340|0,s=d+316|0,u=d+292|0,T=d+48|0,R=d+280|0,F=d+268|0,M=d+24|0,n=d+256|0,t=(c=d)+248|0,o=d+232|0,a=d+224|0,f=d+216|0,0|(W=0|ar[(G=(e|=0)+112|0)>>2])){E=G,I=W;A:for(;;){for(X=I;!((0|ar[X+16>>2])>>>0>=r>>>0);)if(!(X=0|ar[X+4>>2]))break A;if(!(I=0|ar[X>>2])){E=X;break}E=X}if((0|E)!=(0|G)&&(0|ar[E+16>>2])>>>0<=r>>>0){E=G;A:for(;;){for(X=W;!((0|ar[X+16>>2])>>>0>=r>>>0);)if(!(X=0|ar[X+4>>2]))break A;if(!(W=0|ar[X>>2])){E=X;break}E=X}if((0|E)!=(0|G)&&(0|ar[E+16>>2])>>>0<=r>>>0)if(W=0|ar[E+20>>2],(E=0|ar[E+24>>2])?bu(E):E=0,X=W){if(yu(b,X+64|0),yu(s,X+88|0),function(A,e){e|=0;var r,i,f,n=0;if(ar[(A|=0)>>2]=0,ar[(f=A+4|0)>>2]=0,ar[A+8>>2]=0,n=(0|ar[(i=e+4|0)>>2])-(0|ar[e>>2])|0,!(r=n>>5))return;134217727<r>>>0&&zl();if(n=0|hu(n),ar[f>>2]=n,ar[A>>2]=n,ar[A+8>>2]=n+(r<<5),A=0|ar[e>>2],e=0|ar[i>>2],(0|A)==(0|e))return;for(;ar[n>>2]=ar[A>>2],ar[n+4>>2]=ar[A+4>>2],ar[n+8>>2]=ar[A+8>>2],ar[n+12>>2]=ar[A+12>>2],Dt(n+16|0,A+16|0),A=A+32|0,n=32+(0|ar[f>>2])|0,ar[f>>2]=n,(0|A)!=(0|e););}(u,56+(0|ar[(Q=e+60|0)>>2])|0),(0|(X=0|ar[u>>2]))!=(0|(W=0|ar[(U=4+u|0)>>2]))){for(J=0;J=(V=(0|ar[X>>2])==(0|r))?X:J,!(V|(0|(X=X+32|0))==(0|W)););if(J){ar[F>>2]=0,ar[F+4>>2]=0,ar[F+8>>2]=0,oo(l,4,3e3,F),(0|tr[F+11>>0])<0&&vu(0|ar[F>>2]),W=0|tr[(I=11+b|0)>>0],X=0|ar[(C=4+b|0)>>2];do{if(4==(0|(W<<24>>24<0?X:255&W))){if(0|Yu(b,0,-1,30298,4)){W=0|tr[I>>0],X=0|ar[C>>2],S=72;break}ar[T>>2]=0,ar[(G=T+4|0)>>2]=0,Ht(M,(ar[T+8>>2]=0)|ar[e+44>>2],r,e+52|0,T);do{if(0|ar[M>>2])C=0|ar[(e=M)+4>>2],ar[(i=A)>>2]=ar[e>>2],ar[i+4>>2]=C,C=M+8|0,ar[(i=A+8|0)>>2]=ar[C>>2],ar[i+4>>2]=ar[C+4>>2],ar[i+8>>2]=ar[C+8>>2],ar[C>>2]=0,ar[C+4>>2]=0,ar[C+8>>2]=0,C=1;else{for((0|(X=0|ar[T>>2]))==(0|(C=0|ar[G>>2]))?sr(55739,25520,565,25571):(Y=X,_=0);;){if(X=0|ar[Y+4>>2],1752589123==(0|ar[X+20>>2])){do{if(X){if(!(X=0|qu(X,128,680,0))){D=N=0;break}if(!(I=W=0|ar[Y+8>>2])){N=X,D=I;break}bu(W),N=X,D=I}else D=N=0}while(0);if(0|_&&du(_),N)break;X=D}else X=_;if((0|(Y=Y+12|0))==(0|C)){S=48;break}_=X}48==(0|S)&&sr(55739,25520,565,25571);do{if(0|no(N,i))X=0|ar[Q>>2],ar[t>>2]=ar[e>>2],C=4+t|0,W=0|ar[e+4>>2],0|(ar[C>>2]=W)&&bu(W),Ot(c,X,J,t,e+68|0,i),X=0|ar[(W=c)+4>>2],ar[(I=l)>>2]=ar[W>>2],ar[I+4>>2]=X,X=c+8|0,(0|tr[(W=(I=8+l|0)+11|0)>>0])<0?(tr[ar[I>>2]>>0]=0,ar[12+l>>2]=0):(tr[I>>0]=0,tr[W>>0]=0),Cu(I,0),ar[I>>2]=ar[X>>2],ar[I+4>>2]=ar[X+4>>2],ar[I+8>>2]=ar[X+8>>2],ar[X>>2]=0,ar[X+4>>2]=0,(ar[X+8>>2]=0)|(X=0|ar[C>>2])&&du(X),X=0;else{if(ar[n>>2]=0,ar[4+n>>2]=0,ar[8+n>>2]=0,oo(A,2,117,n),0<=(0|tr[11+n>>0])){X=1;break}vu(0|ar[n>>2]),X=1}}while(0);if(!D){C=X;break}du(D),C=X}}while(0);if((0|tr[(X=M+8|0)+11>>0])<0&&vu(0|ar[X>>2]),0|(X=0|ar[T>>2])){if((0|(W=0|ar[G>>2]))!=(0|X)){for(;I=W+-12|0,ar[G>>2]=I,(0|(W=(W=0|ar[W+-4>>2])?(du(W),0|ar[G>>2]):I))!=(0|X););X=0|ar[T>>2]}vu(X)}C||(S=118)}else S=72}while(0);do{if(72==(0|S)){if(4==(0|(W<<24>>24<0?X:255&W))&&0==(0|Yu(b,0,-1,30318,4))){ar[T>>2]=0,ar[(R=T+4|0)>>2]=0,Ht(M,(ar[T+8>>2]=0)|ar[e+44>>2],r,e+52|0,T);do{if(0|ar[M>>2])C=0|ar[(e=M)+4>>2],ar[(i=A)>>2]=ar[e>>2],ar[i+4>>2]=C,C=M+8|0,ar[(i=A+8|0)>>2]=ar[C>>2],ar[i+4>>2]=ar[C+4>>2],ar[i+8>>2]=ar[C+8>>2],ar[C>>2]=0,ar[C+4>>2]=0,ar[C+8>>2]=0,C=1;else{X=0|ar[T>>2],V=0|ar[R>>2];A:do{if((0|X)==(0|V))X=0,S=86;else{for(G=X,X=0;;){if(W=0|ar[G+4>>2],1635135811==(0|ar[W+20>>2])){do{if(W){if(!(W=0|qu(W,128,648,0))){F=W=0;break}if(!(C=I=0|ar[G+8>>2])){F=C;break}bu(I),F=C}else F=W=0}while(0);if(0|X&&du(X),W)break;X=F}if((0|(G=G+12|0))==(0|V)){S=86;break A}}(0|(W=(X=W)+68|0))!=(0|i)&&(k=i,h=0|ar[W>>2],w=0|ar[X+72>>2],B=y=p=Z=g=m=v=void 0,m=(B=w|=B=y=p=Z=g=0)-(v=h|=0)|0,((g=0|ar[(p=8+(k|=0)|0)>>2])-(y=Z=0|ar[k>>2])|0)>>>0<m>>>0?(Z&&((0|ar[(g=k+4|0)>>2])!=(0|y)&&(ar[g>>2]=y),vu(y),ar[p>>2]=0,ar[g>>2]=0,g=ar[k>>2]=0),(0|m)<0&&zl(),B=g<<1,(0|(g=g>>>0<1073741823?B>>>0<m>>>0?m:B:2147483647))<0&&zl(),y=0|hu(g),ar[(B=k+4|0)>>2]=y,ar[k>>2]=y,ar[p>>2]=y+g,hb(0|y,0|h,0|m),ar[B>>2]=y+m):(0|(g=(Z=w=(k=(Z=(0|ar[(p=k+4|0)>>2])-Z|0)>>>0<m>>>0)?h+Z|0:w)-v|0)&&wb(0|y,0|h,0|g),g=y+g|0,k?(0|(g=B-Z|0))<=0||(hb(0|ar[p>>2],0|w,0|g),ar[p>>2]=(0|ar[p>>2])+g):(0|ar[p>>2])!=(0|g)&&(ar[p>>2]=g))),X=0|ar[Q>>2],ar[a>>2]=ar[e>>2],C=4+a|0,W=0|ar[e+4>>2],0|(ar[C>>2]=W)&&bu(W),Ot(c,X,J,a,e+68|0,i),X=0|ar[(W=c)+4>>2],ar[(I=l)>>2]=ar[W>>2],ar[I+4>>2]=X,X=c+8|0,(0|tr[(W=(I=8+l|0)+11|0)>>0])<0?(tr[ar[I>>2]>>0]=0,ar[12+l>>2]=0):(tr[I>>0]=0,tr[W>>0]=0),Cu(I,0),ar[I>>2]=ar[X>>2],ar[I+4>>2]=ar[X+4>>2],ar[I+8>>2]=ar[X+8>>2],ar[X>>2]=0,ar[X+4>>2]=0,(ar[X+8>>2]=0)|(X=0|ar[C>>2])&&du(X),W=0,X=F}}while(0);do{if(86==(0|S)){if(ar[o>>2]=0,ar[4+o>>2]=0,ar[8+o>>2]=0,oo(A,2,131,o),0<=(0|tr[11+o>>0])){W=1;break}vu(0|ar[o>>2]),W=1}}while(0);if(!X){C=W;break}du(X),C=W}}while(0);if((0|tr[(X=M+8|0)+11>>0])<0&&vu(0|ar[X>>2]),0|(X=0|ar[T>>2])){if((0|(W=0|ar[R>>2]))!=(0|X)){for(;I=W+-12|0,ar[R>>2]=I,(0|(W=(W=0|ar[W+-4>>2])?(du(W),0|ar[R>>2]):I))!=(0|X););X=0|ar[T>>2]}vu(X)}if(C)break;S=118;break}X=0|ar[Q>>2],ar[f>>2]=ar[e>>2],C=4+f|0,W=0|ar[e+4>>2],0|(ar[C>>2]=W)&&bu(W),Ot(T,X,J,f,e+68|0,i),X=0|ar[(W=T)+4>>2],ar[(I=l)>>2]=ar[W>>2],ar[I+4>>2]=X,X=T+8|0,(0|tr[(W=(I=8+l|0)+11|0)>>0])<0?(tr[ar[I>>2]>>0]=0,ar[12+l>>2]=0):(tr[I>>0]=0,tr[W>>0]=0),Cu(I,0),ar[I>>2]=ar[X>>2],ar[I+4>>2]=ar[X+4>>2],ar[I+8>>2]=ar[X+8>>2],ar[X>>2]=0,ar[X+4>>2]=0,(ar[X+8>>2]=0)|(X=0|ar[C>>2])&&du(X),S=118}}while(0);do{if(118==(0|S)){if((0|ar[l>>2])==(0|ar[14148])){M=0|ar[(i=56592)+4>>2],ar[(T=A)>>2]=ar[i>>2],ar[T+4>>2]=M,yu(A+8|0,56600);break}M=0|ar[(i=l)+4>>2],ar[(T=A)>>2]=ar[i>>2],ar[T+4>>2]=M,T=A+8|0,A=8+l|0,ar[T>>2]=ar[A>>2],ar[T+4>>2]=ar[A+4>>2],ar[T+8>>2]=ar[A+8>>2],ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0;break}}while(0);(0|tr[(X=8+l|0)+11>>0])<0&&vu(0|ar[X>>2])}else S=24}else S=24;if(24==(0|S)&&(W=T+64|0,ar[(C=T+8|0)>>2]=4524,I=T+12|0,ar[T>>2]=188,ar[W>>2]=208,Jf(T+64|(ar[T+4>>2]=0),I),ar[T+136>>2]=0,ar[T+140>>2]=-1,ar[T>>2]=4504,ar[W>>2]=4544,ar[C>>2]=4524,Sf(I),ar[I>>2]=4340,ar[(C=T+44|0)>>2]=0,ar[C+4>>2]=0,ar[C+8>>2]=0,ar[C+12>>2]=0,ar[T+60>>2]=24,ar[l>>2]=0,ar[4+l>>2]=0,ar[8+l>>2]=0,Xe(I,l),(0|tr[11+l>>0])<0&&vu(0|ar[l>>2]),We(0|Lf(0|We(X=T+8|0,25533,13),r),25547,23),Ie(R,I),oo(A,2,117,R),(0|tr[R+11>>0])<0&&vu(0|ar[R>>2]),ar[T>>2]=4504,ar[W>>2]=4544,ar[X>>2]=4524,ar[I>>2]=4340,(0|tr[C+11>>0])<0&&vu(0|ar[C>>2]),kf(I),bf(W)),0|(X=0|ar[u>>2])){if((0|(W=0|ar[U>>2]))!=(0|X)){do{if(I=W+-32|0,ar[U>>2]=I,F=0|ar[(V=W+-16|0)>>2]){if((0|(W=0|ar[(G=W+-12|0)>>2]))==(0|F))W=F;else{for(;I=W+-40|0,ar[G>>2]=I,(0|(W=(C=0|ar[W+-16>>2])?((0|ar[(W=W+-12|0)>>2])!=(0|C)&&(ar[W>>2]=C),vu(C),0|ar[G>>2]):I))!=(0|F););W=0|ar[V>>2]}vu(W),W=0|ar[U>>2]}else W=I}while((0|W)!=(0|X));X=0|ar[u>>2]}vu(X)}(0|tr[11+s>>0])<0&&vu(0|ar[s>>2]),(0|tr[11+b>>0])<0&&vu(0|ar[b>>2])}else S=19;else E=0,S=19;return(19==(0|S)&&(ar[V>>2]=0,ar[V+4>>2]=0,ar[V+8>>2]=0,oo(A,5,2e3,V),(0|tr[V+11>>0])<0&&vu(0|ar[V>>2])),E)?(du(E),void(ur=d)):void(ur=d)}}ar[C>>2]=0,ar[C+4>>2]=0,ar[C+8>>2]=0,oo(A,5,2e3,C),ur=(0<=(0|tr[C+11>>0])||vu(0|ar[C>>2]),d)}function go(A){return(A|=0)>>>0<4?16908801>>>(A<<3)&255|0:(sr(55739,25597,47,25611),0)}function Zo(A){return(A|=0)>>>0<4?16843265>>>(A<<3)&255|0:(sr(55739,25597,66,25632),0)}function po(A){var e,r,i=0,f=0,n=0;if((0|(i=0|ar[(e=(A|=0)+56|0)>>2]))!=(0|(r=A+60|0)))for(n=i;;){if(0|(i=0|ar[n+44>>2])&&mu(i),i=0|ar[n+4>>2])for(;f=0|ar[i>>2];)i=f;else if(i=0|ar[(f=n+8|0)>>2],(0|ar[i>>2])!=(0|n))for(;n=0|ar[f>>2],i=0|ar[(f=n+8|0)>>2],(0|ar[i>>2])!=(0|n););if((0|i)==(0|r))break;n=i}!function A(e,r){e|=0;r|=0;return r?(A(e,0|ar[r>>2]),A(e,0|ar[r+4>>2]),void vu(r)):void 0}(e,0|ar[r>>2]),0|(i=0|ar[A+52>>2])&&du(i),0|(i=0|ar[A+44>>2])&&du(i),(0|tr[(i=A+8|0)+11>>0])<0&&vu(0|ar[i>>2]),(i=0|ar[A+4>>2])&&ku(i)}function yo(A,e,r,i,f){e|=0,r|=0,i|=0,f|=0,ar[(A|=0)+24>>2]=e,ar[A+28>>2]=r,ar[A+32>>2]=i,ar[A+36>>2]=f}function Bo(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f|=0;var n,t,o=0,a=0;if(ur=(t=ur)+64|0,tr[(o=(n=t)+32|0)>>0]=0,ar[(a=o+4|0)>>2]=0,ar[a+4>>2]=0,ar[a+8>>2]=0,ar[a+12>>2]=0,ar[a+16>>2]=0,ar[a+20>>2]=0,!((ar[a+24>>2]=0)|function(A,e,r,i,f){A|=0,r|=0,i|=0,f|=0;var n=0,t=0;(0|(e|=0))<=-1&&sr(25686,25597,157,25697);(0|r)<=-1&&sr(25703,25597,158,25697);(0|i)<=0&&sr(25715,25597,159,25697);33<=(0|i)&&sr(25730,25597,160,25697);ar[A+4>>2]=e,ar[A+8>>2]=r,n=64<(n=e+1&-2)>>>0?n:64,ar[A+12>>2]=n,r=64<(r=r+1&-2)>>>0?r:64,ar[A+16>>2]=r,e=11==(0|f)&32==(0|(e=24==(0|i)&10==(0|f)?8:i))?8:e,17<=(0|cr[A>>0])&&sr(25746,25597,181,25697);switch(e=(7+(255&(tr[A>>0]=e))|0)>>>3,0|f){case 3:case 2:case 1:case 0:case 99:t=1;break;case 14:case 12:case 10:t=3;break;case 15:case 13:case 11:t=4;break;default:sr(55739,25597,118,25653)}return t=15+(0|br(0|br(t,e),n))&-16,ar[A+28>>2]=t,t=0|wu(15|br(t,r)),ar[A+24>>2]=t,f=15&t,ar[A+20>>2]=0==(0|f)?t:t+(16-f)|0,1}(o,r,i,f,0|ar[A+36>>2])))return ur=t,(A=0)|A;a=A+56|0,ar[n>>2]=ar[o>>2],ar[n+4>>2]=ar[o+4>>2],ar[n+8>>2]=ar[o+8>>2],ar[n+12>>2]=ar[o+12>>2],ar[n+16>>2]=ar[o+16>>2],ar[n+20>>2]=ar[o+20>>2],ar[n+24>>2]=ar[o+24>>2],ar[n+28>>2]=ar[o+28>>2],r=0|ar[(i=A+60|0)>>2];do{if(r){for(f=A+60|0;;)if((0|e)<(0|(i=0|ar[r+16>>2]))){if(!(i=0|ar[r>>2])){i=7;break}f=r,r=i}else{if((0|e)<=(0|i)){i=11;break}if(!(i=0|ar[(f=r+4|0)>>2])){i=10;break}r=i}if(7==(0|i)){f=o=r;break}if(10==(0|i)){o=r;break}if(11==(0|i)){o=r;break}}else f=o=i}while(0);return 0|ar[f>>2]||(r=0|hu(52),ar[r+16>>2]=e,ar[(i=r+20|0)>>2]=ar[n>>2],ar[i+4>>2]=ar[n+4>>2],ar[i+8>>2]=ar[n+8>>2],ar[i+12>>2]=ar[n+12>>2],ar[i+16>>2]=ar[n+16>>2],ar[i+20>>2]=ar[n+20>>2],ar[i+24>>2]=ar[n+24>>2],ar[i+28>>2]=ar[n+28>>2],ar[r>>2]=0,ar[r+4>>2]=0,ar[r+8>>2]=o,ar[f>>2]=r,(i=0|ar[ar[a>>2]>>2])&&(ar[a>>2]=i,r=0|ar[f>>2]),so(0|ar[A+60>>2],r),ar[(A=A+64|0)>>2]=1+(0|ar[A>>2])),ur=t,0|(A=1)}function Eo(A,e){e|=0;var r,i=0,f=0;if(0|(i=0|ar[(r=(A|=0)+60|0)>>2])){A=r,f=i;A:for(;;){for(i=f;!((0|ar[i+16>>2])>=(0|e));)if(!(i=0|ar[i+4>>2]))break A;if(!(f=0|ar[i>>2])){A=i;break}A=i}if((0|A)!=(0|r)&&(0|ar[A+16>>2])<=(0|e))return 0|(e=(0|(e=A))!=(0|r))}return 0|(e=(0|(e=r))!=(0|r))}function Xo(A,e){e|=0;var r,i=0,f=0;if(!(i=0|ar[(r=(A|=0)+60|0)>>2]))return 0|(e=-1);A=r,f=i;A:for(;;){for(i=f;!((0|ar[i+16>>2])>=(0|e));)if(!(i=0|ar[i+4>>2]))break A;if(!(f=0|ar[i>>2])){A=i;break}A=i}return(0|A)==(0|r)||(0|ar[A+16>>2])>(0|e)?0|(e=-1):0|(e=0|ar[A+24>>2])}function Wo(A,e){e|=0;var r,i=0,f=0;if(!(i=0|ar[(r=(A|=0)+60|0)>>2]))return 0|(e=-1);A=r,f=i;A:for(;;){for(i=f;!((0|ar[i+16>>2])>=(0|e));)if(!(i=0|ar[i+4>>2]))break A;if(!(f=0|ar[i>>2])){A=i;break}A=i}return(0|A)==(0|r)||(0|ar[A+16>>2])>(0|e)?0|(e=-1):0|(e=0|ar[A+28>>2])}function Io(A,e){e|=0;var r,i,f,n,t=0,o=0,a=0,c=0,l=0;if(ar[(i=(A|=0)+4|0)>>2]=0,n=A+4|(ar[(f=A+8|0)>>2]=0),ar[A>>2]=n,(0|(t=0|ar[e+56>>2]))!=(0|(r=e+60|0)))for(l=t,e=0;;){c=l+16|0;do{if(e){for(a=0|ar[c>>2],o=i;;){if((0|a)<(0|(t=0|ar[e+16>>2]))){if(!(t=0|ar[e>>2])){t=9;break}}else{if((0|a)<=(0|t)){t=13;break}if(!(t=0|ar[(o=e+4|0)>>2])){t=12;break}e=o}o=e,e=t}if(9==(0|t)){o=a=e;break}if(12==(0|t)){a=e;break}if(13==(0|t)){a=e;break}}else o=a=n}while(0);if(0|ar[o>>2]||(e=0|hu(20),ar[e+16>>2]=ar[c>>2],ar[e>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=a,ar[o>>2]=e,(t=0|ar[ar[A>>2]>>2])&&(ar[A>>2]=t,e=0|ar[o>>2]),so(0|ar[i>>2],e),ar[f>>2]=1+(0|ar[f>>2])),e=0|ar[l+4>>2])for(;t=0|ar[e>>2];)e=t;else if(e=0|ar[(t=l+8|0)>>2],(0|ar[e>>2])!=(0|l))for(;l=0|ar[t>>2],e=0|ar[(t=l+8|0)>>2],(0|ar[e>>2])!=(0|l););if((0|e)==(0|r))break;l=e,e=0|ar[n>>2]}}function Co(A,e){return A|=0,(e|=0)&&(Co(A,0|ar[e>>2]),Co(A,0|ar[e+4>>2]),void vu(e))}function Go(A,e){A|=0;var r,i=0,f=0;if(10==(0|(e|=0)))switch(0|ar[A+36>>2]){case 11:return 0|(e=32);case 14:case 12:return 0|(e=48);case 15:case 13:return 0|(e=64);case 10:return 0|(e=24);default:return 0|(e=-1)}if(i=0|ar[(r=A+60|0)>>2]){A=r,f=i;A:for(;;){for(i=f;!((0|ar[i+16>>2])>=(0|e));)if(!(i=0|ar[i+4>>2]))break A;if(!(f=0|ar[i>>2])){A=i;break}A=i}A=(0|A)!=(0|r)&&(0|ar[A+16>>2])<=(0|e)?0|tr[A+20>>0]:-1}else A=-1;return 256<=(A=7+(255&A)&504)>>>0&&sr(25764,25597,362,25775),0|(e=255&A)}function Vo(A,e){e|=0;var r,i=0,f=0;if(!(i=0|ar[(r=(A|=0)+60|0)>>2]))return 0|(e=-1);A=r,f=i;A:for(;;){for(i=f;!((0|ar[i+16>>2])>=(0|e));)if(!(i=0|ar[i+4>>2]))break A;if(!(f=0|ar[i>>2])){A=i;break}A=i}return(0|A)==(0|r)||(0|ar[A+16>>2])>(0|e)?0|(e=-1):0|(e=0|tr[A+20>>0])}function Fo(A,e,r){e|=0,r|=0;var i,f=0,n=0;if(!(f=0|ar[(i=(A|=0)+60|0)>>2]))return(r=0)|r;A=i,n=f;A:for(;;){for(f=n;!((0|ar[f+16>>2])>=(0|e));)if(!(f=0|ar[f+4>>2]))break A;if(!(n=0|ar[f>>2])){A=f;break}A=f}return(0|A)==(0|i)||(0|ar[A+16>>2])>(0|e)?(r=0)|r:(0|r&&(ar[r>>2]=ar[A+48>>2]),0|(r=0|ar[A+40>>2]))}function Ro(A,e,r){e|=0,r|=0;var i,f=0,n=0;if(!(f=0|ar[(i=(A|=0)+60|0)>>2]))return(r=0)|r;A=i,n=f;A:for(;;){for(f=n;!((0|ar[f+16>>2])>=(0|e));)if(!(f=0|ar[f+4>>2]))break A;if(!(n=0|ar[f>>2])){A=f;break}A=f}return(0|A)==(0|i)||(0|ar[A+16>>2])>(0|e)?(r=0)|r:(0|r&&(ar[r>>2]=ar[A+48>>2]),0|(r=0|ar[A+40>>2]))}function No(A,e,r,i){A|=0,r|=0,i|=0;var f,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0;if(b=60+(0|ar[(e|=0)>>2])|0,l=0==(0|(u=0|ar[b>>2])))d=n=s=-1;else{n=b,o=u;A:for(;;){for(t=o;!((0|ar[t+16>>2])>=(0|r));)if(!(t=0|ar[t+4>>2]))break A;if(!(o=0|ar[t>>2])){n=t;break}n=t}if(c=(0|n)!=(0|b)&&(0|ar[n+16>>2])<=(0|r)?0|ar[n+24>>2]:-1,l)s=c,d=n=-1;else{n=b,o=u;A:for(;;){for(t=o;!((0|ar[t+16>>2])>=(0|r));)if(!(t=0|ar[t+4>>2]))break A;if(!(o=0|ar[t>>2])){n=t;break}n=t}if(a=(0|n)!=(0|b)&&(0|ar[n+16>>2])<=(0|r)?0|ar[n+28>>2]:-1,l)s=c,n=-1,d=a;else{n=b,o=u;A:for(;;){for(t=o;!((0|ar[t+16>>2])>=(0|r));)if(!(t=0|ar[t+4>>2]))break A;if(!(o=0|ar[t>>2])){n=t;break}n=t}d=(n=(0|n)!=(0|b)&&(0|ar[n+16>>2])<=(0|r)?(s=c,0|tr[n+20>>0]):(s=c,-1),a)}}}if(Bo(A,i,s,d,255&n),l=0|ar[e>>2],u=0==(0|(o=0|ar[(f=l+60|0)>>2])))b=e=0;else{n=f,a=o;A:for(;;){for(t=a;!((0|ar[t+16>>2])>=(0|r));)if(!(t=0|ar[t+4>>2]))break A;if(!(a=0|ar[t>>2])){n=t;break}n=t}b=(0|n)!=(0|f)&&(0|ar[n+16>>2])<=(0|r)?(e=0|ar[n+40>>2],0|ar[n+48>>2]):e=0}if(t=0|ar[(c=A+60|0)>>2]){n=c;A:for(;;){for(a=t;!((0|ar[a+16>>2])>=(0|i));){if(!(t=0|ar[a+4>>2]))break A;a=t}if(!(t=0|ar[a>>2])){n=a;break}n=a}a=(0|n)!=(0|c)&&(0|ar[n+16>>2])<=(0|i)?(c=0|ar[n+40>>2],0|ar[n+48>>2]):c=0}else a=c=0;A:do{if(10!=(0|r)){if(u)n=-1;else{n=f;e:for(;;){for(t=o;!((0|ar[t+16>>2])>=(0|r));)if(!(t=0|ar[t+4>>2]))break e;if(!(o=0|ar[t>>2])){n=t;break}n=t}n=(0|n)!=(0|f)&&(0|ar[n+16>>2])<=(0|r)?0|tr[n+20>>0]:-1}if((n=7+(255&n)|0)>>>0<256){k=(255&n)>>>3;break}sr(25764,25597,362,25775)}else switch(0|ar[l+36>>2]){case 10:k=3;break A;case 11:k=4;break A;case 14:case 12:k=6;break A;case 15:case 13:k=8;break A;default:k=31;break A}}while(0);if(t=0|br(255&k,s),0<(0|d))for(n=0;hb(c+(0|br(n,a))|0,e+(0|br(n,b))|0,0|t),(0|(n=n+1|0))!=(0|d););}function _o(A,e,r,i){A|=0,r|=0,i|=0;var f,n,t,o=0,a=0,c=0,l=0,u=0,b=0,s=0;ur=(t=ur)+64|0,f=t+32|0,n=t,u=(s=0|ar[(e|=0)>>2])+56|0,b=0|ar[(o=s+60|0)>>2];do{if(b){for(c=s+60|0,o=b;;)if((0|r)<(0|(a=0|ar[o+16>>2]))){if(!(a=0|ar[o>>2])){a=6;break}c=o,o=a}else{if((0|r)<=(0|a)){a=10;break}if(!(a=0|ar[(c=o+4|0)>>2])){a=9;break}o=a}if(6==(0|a)){c=l=o;break}if(9==(0|a)){l=o;break}if(10==(0|a)){l=o;break}}else c=l=o}while(0);if((o=0|ar[c>>2])||(a=0|hu(52),ar[a+16>>2]=r,ar[(o=a+20|0)>>2]=0,ar[o+4>>2]=0,ar[o+8>>2]=0,ar[o+12>>2]=0,ar[o+16>>2]=0,ar[o+20>>2]=0,ar[o+24>>2]=0,ar[o+28>>2]=0,ar[a>>2]=0,ar[a+4>>2]=0,ar[a+8>>2]=l,ar[c>>2]=a,o=(o=0|ar[ar[u>>2]>>2])?(ar[u>>2]=o,0|ar[c>>2]):a,so(0|ar[s+60>>2],o),ar[(b=s+64|0)>>2]=1+(0|ar[b>>2]),b=0|ar[e>>2],o=a,b=0|ar[(s=b)+60>>2]),u=o+20|0,ar[f>>2]=ar[u>>2],ar[4+f>>2]=ar[u+4>>2],ar[8+f>>2]=ar[u+8>>2],ar[12+f>>2]=ar[u+12>>2],ar[16+f>>2]=ar[u+16>>2],ar[20+f>>2]=ar[u+20>>2],ar[24+f>>2]=ar[u+24>>2],ar[28+f>>2]=ar[u+28>>2],u=s+56|0,l=s+60|0,0|b){c=l,a=b;A:for(;;){for(o=a;!((0|ar[o+16>>2])>=(0|r));)if(!(o=0|ar[o+4>>2]))break A;if(!(a=0|ar[o>>2])){c=o;break}c=o}if((0|c)!=(0|l)&&(0|ar[c+16>>2])<=(0|r)){if(o=0|ar[c+4>>2])for(;a=0|ar[o>>2];)o=a;else if(o=0|ar[(a=c+8|0)>>2],(0|ar[o>>2])!=(0|c))for(;r=0|ar[a>>2],o=0|ar[(a=r+8|0)>>2],(0|ar[o>>2])!=(0|r););(0|ar[u>>2])==(0|c)&&(ar[u>>2]=o),ar[(r=s+64|0)>>2]=(0|ar[r>>2])-1,function(A,e){A|=0;var r,i,f,n=0,t=0,o=0,a=0,c=0,l=0,u=0;if(t=0|ar[(e|=0)>>2])if(n=0|ar[e+4>>2])for(;;){if(!(t=0|ar[n>>2])){t=0;break}n=t}else n=e;else n=e,t=0;r=n+4|0,i=0|ar[(0|t?n:r)>>2],l=n+8|0,(f=0!=(0|i))&&(ar[8+i>>2]=ar[l>>2]);t=0|ar[l>>2],(0|ar[t>>2])==(0|n)?(ar[t>>2]=i,(0|n)==(0|A)?(A=i,c=0):(t=t+4|0,u=10)):(ar[t+4>>2]=i,u=10);10==(0|u)&&(c=0|ar[t>>2]);a=0!=(0|tr[(o=n+12|0)>>0]),(0|n)!=(0|e)&&(t=0|ar[(u=e+8|0)>>2],ar[l>>2]=t,ar[((0|ar[ar[u>>2]>>2])==(0|e)?t:t+4|0)>>2]=n,t=0|ar[e>>2],ar[n>>2]=t,ar[t+8>>2]=n,t=0|ar[e+4>>2],0|(ar[r>>2]=t)&&(ar[t+8>>2]=n),tr[o>>0]=0|tr[e+12>>0],A=(0|A)==(0|e)?n:A);if(!(a&0!=(0|A)))return;if(f)return tr[12+i>>0]=1;for(;;){if(a=0|ar[c+8>>2],t=0!=(0|tr[(n=c+12|0)>>0]),(0|ar[a>>2])==(0|c)){if(t?l=c:(tr[n>>0]=1,tr[a+12>>0]=0,n=0|ar[a>>2],o=0|ar[(t=n+4|0)>>2],0|(ar[a>>2]=o)&&(ar[o+8>>2]=a),u=a+8|0,ar[n+8>>2]=ar[u>>2],l=0|ar[u>>2],ar[((0|ar[l>>2])==(0|a)?l:l+4|0)>>2]=n,ar[t>>2]=a,ar[u>>2]=n,u=0|ar[c+4>>2],l=0|ar[u>>2],A=(0|A)==(0|u)?c:A),n=0|ar[l>>2],!(o=0==(0|n))&&0==(0|tr[n+12>>0])){A=l,u=55;break}if(0|(a=0|ar[(t=l+4|0)>>2])&&0==(0|tr[a+12>>0])){u=49;break}if(((tr[l+12>>0]=0)|(n=0|ar[l+8>>2]))==(0|A)|0==(0|tr[(t=n+12|0)>>0])){u=48;break}}else{if(t?o=c:(tr[n>>0]=1,tr[a+12>>0]=0,n=0|ar[(u=a+4|0)>>2],t=0|ar[n>>2],0|(ar[u>>2]=t)&&(ar[t+8>>2]=a),u=a+8|0,ar[n+8>>2]=ar[u>>2],o=0|ar[u>>2],ar[((0|ar[o>>2])==(0|a)?o:o+4|0)>>2]=n,ar[n>>2]=a,ar[u>>2]=n,u=0|ar[c>>2],o=0|ar[u+4>>2],A=(0|A)==(0|u)?c:A),0|(t=0|ar[o>>2])&&0==(0|tr[t+12>>0])){u=31;break}if(0|(n=0|ar[o+4>>2])&&0==(0|tr[n+12>>0])){A=n,u=32;break}if(((tr[o+12>>0]=0)|(n=0|ar[o+8>>2]))==(0|A)){u=30;break}if(!(0|tr[n+12>>0])){A=n,u=30;break}}c=0|ar[n+8>>2],c=0|ar[((0|ar[c>>2])==(0|n)?c+4|0:c)>>2]}do{if(30==(0|u))return tr[A+12>>0]=1;if(31==(0|u))A=0|ar[o+4>>2],u=A?32:33;else{if(48==(0|u))return tr[t>>0]=1;if(49==(0|u)){if(o)A=a;else{if(!(0|tr[n+12>>0])){A=l,u=55;break}A=0|ar[(t=A=l+4|0)>>2]}tr[A+12>>0]=1,tr[l+12>>0]=0,n=0|ar[A>>2],0|(ar[t>>2]=n)&&(ar[n+8>>2]=l),n=l+8|0,ar[A+8>>2]=ar[n>>2],u=0|ar[n>>2],ar[((0|ar[u>>2])==(0|l)?u:u+4|0)>>2]=A,ar[A>>2]=l,ar[n>>2]=A,n=l,u=55}}}while(0);if(32==(0|u))0|tr[A+12>>0]?u=33:n=o;else if(55==(0|u))return o=0|ar[A+8>>2],t=o+12|0,tr[A+12>>0]=0|tr[t>>0],tr[t>>0]=1,tr[n+12>>0]=1,A=0|ar[o>>2],t=0|ar[(n=A+4|0)>>2],0|(ar[o>>2]=t)&&(ar[t+8>>2]=o),u=o+8|0,ar[A+8>>2]=ar[u>>2],e=0|ar[u>>2],ar[((0|ar[e>>2])==(0|o)?e:e+4|0)>>2]=A,ar[n>>2]=o,ar[u>>2]=A;33==(0|u)&&(tr[t+12>>0]=1,tr[o+12>>0]=0,n=0|ar[(A=t+4|0)>>2],0|(ar[o>>2]=n)&&(ar[n+8>>2]=o),n=o+8|0,ar[t+8>>2]=ar[n>>2],u=0|ar[n>>2],ar[((0|ar[u>>2])==(0|o)?u:u+4|0)>>2]=t,ar[A>>2]=o,ar[n>>2]=t,n=t,A=o);t=0|ar[n+8>>2],u=t+12|0,tr[n+12>>0]=0|tr[u>>0],tr[u>>0]=1,tr[A+12>>0]=1,A=0|ar[(u=t+4|0)>>2],n=0|ar[A>>2],0|(ar[u>>2]=n)&&(ar[n+8>>2]=t);u=t+8|0,ar[A+8>>2]=ar[u>>2],e=0|ar[u>>2],ar[((0|ar[e>>2])==(0|t)?e:e+4|0)>>2]=A,ar[A>>2]=t,ar[u>>2]=A}(b,c),vu(c)}}u=A+56|0,ar[n>>2]=ar[f>>2],ar[n+4>>2]=ar[4+f>>2],ar[n+8>>2]=ar[8+f>>2],ar[n+12>>2]=ar[12+f>>2],ar[n+16>>2]=ar[16+f>>2],ar[n+20>>2]=ar[20+f>>2],ar[n+24>>2]=ar[24+f>>2],ar[n+28>>2]=ar[28+f>>2],o=0|ar[(a=A+60|0)>>2];do{if(o){for(c=A+60|0;;)if((0|i)<(0|(a=0|ar[o+16>>2]))){if(!(a=0|ar[o>>2])){a=36;break}c=o,o=a}else{if((0|i)<=(0|a)){a=40;break}if(!(a=0|ar[(c=o+4|0)>>2])){a=39;break}o=a}if(36==(0|a)){c=l=o;break}if(39==(0|a)){l=o;break}if(40==(0|a)){l=o;break}}else c=l=a}while(0);ur=(0|ar[c>>2]||(o=0|hu(52),ar[o+16>>2]=i,ar[(a=o+20|0)>>2]=ar[n>>2],ar[a+4>>2]=ar[n+4>>2],ar[a+8>>2]=ar[n+8>>2],ar[a+12>>2]=ar[n+12>>2],ar[a+16>>2]=ar[n+16>>2],ar[a+20>>2]=ar[n+20>>2],ar[a+24>>2]=ar[n+24>>2],ar[a+28>>2]=ar[n+28>>2],ar[o>>2]=0,ar[o+4>>2]=0,ar[o+8>>2]=l,ar[c>>2]=o,(a=0|ar[ar[u>>2]>>2])&&(ar[u>>2]=a,o=0|ar[c>>2]),so(0|ar[A+60>>2],o),ar[(A=A+64|0)>>2]=1+(0|ar[A>>2])),t)}function Yo(A,e){A|=0;var r,i,f,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0;if(ur=(f=ur)+16|0,r=f,((tr[(e|=0)>>0]=0)|(t=n=0|ar[(i=A+377216|0)>>2]))==(0|(o=b=0|ar[(d=A+377220|0)>>2])))return ur=f,(d=0)|d;u=0|ar[n>>2],a=0|ar[u+10636>>2],b=c=0|ar[u+10632>>2];A:do{if((0|a)!=(0|c)){for(c=a-c>>2,a=0;l=0|ar[b+(a<<2)>>2],a=a+1|0,0|ar[l+40>>2];)if(c>>>0<=a>>>0)break A;if(l){if(0|tr[l+36>>0]&&ra(A+376148|0),tr[e>>0]=1,n=0|Qo(A,u,l))return ur=f,0|(d=n);t=n=0|ar[i>>2],o=0|ar[d>>2];break}}}while(0);if(1<o-t>>2>>>0?(u=0|ar[n>>2],(0|(b=0|ar[u+10636>>2]))!=(0|ar[u+10632>>2])&&0==(0|ar[40+(0|ar[b+-4>>2])>>2])&&(s=14)):s=14,14==(0|s)){if((0|o)==(0|(n=s=0|ar[i>>2])))return ur=f,(d=0)|d;if(b=0|ar[n>>2],(0|(s=0|ar[b+10636>>2]))!=(0|ar[b+10632>>2])&&0==(0|ar[40+(0|ar[s+-4>>2])>>2]))return ur=f,(d=0)|d;if((0!=(0|ar[A+556>>2])|0)!=(0-(0|ar[A+580>>2])|0))return ur=f,(d=0)|d;if(0==(0|tr[A+548>>0])&&0==(0|tr[A+549>>0]))return ur=f,(d=0)|d}if(c=0|ar[n>>2],tr[e>>0]=1,n=0|ar[c>>2],0<(0|ar[(o=n+10344|0)>>2])){for(t=n+10524|0,n=0;Tn((0|ar[t>>2])+(80*n|0)|0,1),(0|(n=n+1|0))<(0|ar[o>>2]););a=0|ar[c>>2]}else a=n;n=0|ar[(o=a+10332|0)>>2],t=0==(0|tr[n+532>>0]),0|ar[375892+(0|ar[10332+(0|ar[A+376224>>2])>>2])>>2]?(t?(function(A){var e,r,i,f,n,t,o,a=0,c=0,l=0;if(ur=(o=ur)+16|0,r=o,i=0|ar[(A|=0)>>2],l=0|ar[10332+i>>2],ca(i,ar[(f=5828+i|0)>>2]<<1),n=A+10668|0,t=A+10672|0,l=l+375396|0,e=A+10664|0,0<(0|ar[f>>2])){for(c=0;A=0|hu(20),ar[A+4>>2]=0,ar[A>>2]=9552,ar[A+8>>2]=i,ar[A+12>>2]=c,tr[A+16>>0]=1,ar[r>>2]=A,(a=0|ar[n>>2])>>>0<(0|ar[t>>2])>>>0?(ar[a>>2]=A,ar[n>>2]=4+(0|ar[n>>2])):Oe(e,r),Sn(l,A),(0|(c=c+1|0))<(0|(A=0|ar[f>>2])););if(0<(0|A)){for(A=0;a=0|hu(20),ar[a+4>>2]=0,ar[a>>2]=9552,ar[a+8>>2]=i,ar[a+12>>2]=A,tr[a+16>>0]=0,ar[r>>2]=a,(c=0|ar[n>>2])>>>0<(0|ar[t>>2])>>>0?(ar[c>>2]=a,ar[n>>2]=4+(0|ar[n>>2])):Oe(e,r),Sn(l,a),(0|(A=A+1|0))<(0|ar[f>>2]););ur=o}else ur=o}else ur=o}(c),t=3,n=0|ar[o>>2]):t=1,0|tr[n+533>>0]||function(A,e){e|=0;var r,i,f,n,t=0,o=0,a=0,c=0,l=0,u=0,b=0;if(ur=(n=ur)+16|0,f=n,b=0|ar[(A|=0)>>2],!(0|tr[b+5467>>0]))return ur=n,b=0;if(o=0|ar[(t=b+10332|0)>>2],u=b+10480|0,0|ta(i=A+8|0,0|ar[b+24>>2],0|ar[b+28>>2],0|ar[b+20>>2],b+764|0,0,o,0|ar[b+10336>>2],0|ar[u>>2],0|ar[u+4>>2],0|ar[b+10488>>2],1))return er(4+(0|ar[t>>2])|0,1024,0),ur=n,b=0;if(r=0|ar[b+5828>>2],ca(b,r),0<(0|r))for(l=A+10668|0,u=A+10672|0,c=o+375396|0,o=A+10664|0,t=0;A=0|hu(28),ar[A+4>>2]=0,ar[A>>2]=7752,ar[A+16>>2]=b,ar[A+20>>2]=i,ar[A+12>>2]=b,ar[A+8>>2]=t,ar[A+24>>2]=e,ar[f>>2]=A,(a=0|ar[l>>2])>>>0<(0|ar[u>>2])>>>0?(ar[a>>2]=A,ar[l>>2]=4+(0|ar[l>>2])):Oe(o,f),Sn(c,A),(0|(t=t+1|0))!=(0|r););sa(b),function(A,e){var r,i=0,f=0,n=0;n=(e=e|0)+4|0,f=0|ar[(i=(A=A|0)+4|0)>>2],ar[i>>2]=ar[n>>2],ar[n>>2]=f,f=e+60|0,i=0|ar[(n=A+60|0)>>2],ar[n>>2]=ar[f>>2],ar[f>>2]=i,i=e+10492|0,n=0|ar[(f=A+10492|0)>>2],ar[f>>2]=ar[i>>2],ar[i>>2]=n,n=e+8|0,f=0|ar[(i=A+8|0)>>2],ar[i>>2]=ar[n>>2],ar[n>>2]=f,f=e+64|0,i=0|ar[(n=A+64|0)>>2],ar[n>>2]=ar[f>>2],ar[f>>2]=i,i=e+10496|0,n=0|ar[(f=A+10496|0)>>2],ar[f>>2]=ar[i>>2],ar[i>>2]=n,n=e+12|0,f=0|ar[(i=A+12|0)>>2],ar[i>>2]=ar[n>>2],ar[n>>2]=f,f=e+68|0,i=0|ar[(n=A+68|0)>>2],ar[n>>2]=ar[f>>2],ar[f>>2]=i,i=e+10500|0,n=0|ar[(f=A+10500|0)>>2],ar[f>>2]=ar[i>>2],ar[i>>2]=n,n=e+40|0,f=0|ar[(i=A+40|0)>>2],ar[i>>2]=ar[n>>2],ar[n>>2]=f,f=e+44|0,i=0|ar[(n=A+44|0)>>2],ar[n>>2]=ar[f>>2],ar[f>>2]=i,e=e+10504|0,i=0|ar[(A=f=A+10504|0)>>2],A=0|ar[A+4>>2],r=0|ar[(n=e)+4>>2],ar[f>>2]=ar[n>>2],ar[f+4>>2]=r,ar[e>>2]=i,ar[e+4>>2]=A}(b,i),ur=n,b=1}(c,t),sa(a)):(t&&(function(A){var e,r,i,f=0,n=0,t=0;if(0<(0|ar[(t=(A|=0)+5828|0)>>2])){for(n=f=0;f=0|f|Zt(A,n),(0|(n=n+1|0))<(0|ar[t>>2]););if(f){i=A+10472|0,pt(A,1,0,0|ar[(r=A+10476|0)>>2],0,0|ar[i>>2]),f=0|ar[r>>2],n=0|ar[i>>2],(8<(0|ar[(e=A+5760|0)>>2])?yt:Bt)(A,1,0,f,0,n),t=A+5776|0;do{if(0|ar[t>>2]){if(f=0|ar[r>>2],n=0|ar[i>>2],8<(0|ar[A+5768>>2])){Et(A,1,0,f,0,n);break}Xt(A,1,0,f,0,n);break}}while(0);if(pt(A,0,0,0|ar[r>>2],0,0|ar[i>>2]),f=0|ar[r>>2],n=0|ar[i>>2],(8<(0|ar[e>>2])?yt:Bt)(A,0,0,f,0,n),0|ar[t>>2])n=0|ar[r>>2],f=0|ar[i>>2],8<(0|ar[A+5768>>2])?Et(A,0,0,n,0,f):Xt(A,0,0,n,0,f)}}}(a),n=0|ar[o>>2]),0|tr[n+533>>0]||function(A){var e,r,i,f,n,t,o,a,c,l,u,b,s,d,k,h,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0;if(!(0|tr[5467+(A|=0)>>0]))return;d=A+40|0,C=0|br(0|ar[(k=A+28|0)>>2],0|ar[d>>2]),C=0|br(C,(7+(0|ar[(h=A+5760|0)>>2])|0)/8|0),e=A+44|0,V=0|br(0|ar[(r=A+36|0)>>2],0|ar[e>>2]),V=0|br(V,(7+(0|ar[(i=A+5768|0)>>2])|0)/8|0),V=0|wu(-1<(0|(V=(0|V)<(0|C)?C:V))?V:-1),C=0==(0|ar[A+5776>>2])?1:3,n=A+5820|0,t=A+10352|0,o=A+10340|0,a=A+48|0,c=A+52|0,l=A+5804|0,u=A+4|0,b=A+5780|0,s=A+5784|0,w=0|ar[(f=A+5828|(G=0))>>2];A:for(;;){if(B=0|ar[(X=(W=0==(0|G))?d:e)>>2],I=A+4+(G<<2)|0,y=0|br(0|ar[(W?k:r)>>2],B),E=W?h:i,hb(0|V,0|ar[I>>2],0|br(y,(7+(0|ar[E>>2])|0)/8|0)),0<(0|w))for(w=(y=0)|ar[n>>2];;){if(0<(0|w))for(p=0;;){if(w=(0|br(0|ar[t>>2],y))+p|0,w=0|lr[(0|ar[o>>2])+(24*w|0)+2>>1],v=0|ar[a>>2],w>>>0>=(0|ar[c>>2])-v>>2>>>0){w=21;break A}if(!(Z=0|ar[v+(w<<2)>>2])){w=21;break A}do{if(W){if(0|tr[Z+325>>0]){if(v=1<<ar[l>>2],m=0|ar[u>>2],w=0|ar[d>>2],8<(0|ar[h>>2])){Ra(A,p,y,Z,0,v,v,V,B,m,w);break}Na(A,p,y,Z,0,v,v,V,B,m,w);break}}else if(0|tr[Z+326>>0]){if(m=1<<ar[l>>2],v=(0|m)/(0|ar[b>>2])|0,m=(0|m)/(0|ar[s>>2])|0,g=0|ar[I>>2],w=0|ar[X>>2],8<(0|ar[E>>2])){Ra(A,p,y,Z,G,v,m,V,B,g,w);break}Na(A,p,y,Z,G,v,m,V,B,g,w);break}}while(0);if(p=p+1|0,(0|(w=0|ar[n>>2]))<=(0|p)){v=w;break}}else v=w;if(y=y+1|0,(0|(w=0|ar[f>>2]))<=(0|y))break;w=v}if((0|C)<=(0|(G=G+1|0))){w=20;break}}{if(20==(0|w))return mu(V);if(21==(0|w));}}(a)),a=c+10648|0,n=0|ar[(o=c+10644|0)>>2];A:do{if((0|ar[a>>2])==(0|n))a=0;else for(t=0;;){if(n=0|Qa(n+(80*t|0)|0,0|ar[c>>2]),t=t+1|0,0|n){a=n;break A}if(n=0|ar[o>>2],t>>>0>=(((0|ar[a>>2])-n|0)/80|0)>>>0){a=0;break}}}while(0);if(0|(n=0|ar[c>>2])){do{if(0|tr[n+100>>0]){if(0|tr[n+10516>>0]&&0|tr[A+514>>0])break;ar[r>>2]=n,(0|(o=0|ar[(t=A+376172|0)>>2]))==(0|ar[A+376176>>2])?Do(A+376168|0,r):(ar[o>>2]=n,ar[t>>2]=4+(0|ar[t>>2]))}}while(0);((0|ar[A+376172>>2])-(0|ar[A+376168>>2])>>2|0)>(0|ar[n+596+(12*((0|ar[n+116>>2])-1|0)|0)+4>>2])&&Aa(A+376148|0)}if(Te(c),vu(c),1<(n=0|ar[d>>2])-(t=0|ar[i>>2])>>2>>>0)for(o=1;ar[(n=t)+(o+-1<<2)>>2]=ar[n+(o<<2)>>2],(o=o+1|0)>>>0<(n=0|ar[d>>2])-(t=0|ar[i>>2])>>2>>>0;);return ar[d>>2]=n+-4,ur=f,0|(d=a)}function Qo(A,e,r){A|=0,e|=0;var i,f,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0;if(l=(u=0|ar[(f=(r|=0)+4|0)>>2])+1344|0,u=u+1348|0,t=0|ar[l>>2],(0|ar[u>>2])!=(0|t))for(a=A+376148|0,c=A+376156|0,o=0;-1<(0|(t=0|$o(a,0|ar[t+(o<<2)>>2])))&&(ar[96+(0|ar[(0|ar[c>>2])+(t<<2)>>2])>>2]=0),o=o+1|0,t=0|ar[l>>2],o>>>0<(0|ar[u>>2])-t>>2>>>0;);u=0|ar[e>>2],ar[(i=r+40|0)>>2]=1,c=0|ar[u+10332>>2];A:do{if(0<(0|ar[c+375892>>2]))if(l=(k=0|tr[u+5965>>0])<<24>>24!=0,t=(h=0|tr[u+5966>>0])<<24>>24!=0,(k|h)<<24>>24)d=t;else{if(0<(0|(a=0|ar[(o=c+168|0)>>2]))){t=0;do{if(1e3==(0|ar[c+88+(t<<2)>>2])){d=0;break A}t=t+1|0}while((0|t)<(0|a));(0|a)<20&&(v=12)}else v=12;12==(0|v)&&(ar[o>>2]=a+1,ar[c+88+(a<<2)>>2]=1e3),20==(0|(t=0|ar[(o=c+84|0)>>2]))?(o=1001,t=19):(ar[o>>2]=t+1,o=1e3),ar[c+4+(t<<2)>>2]=o,d=0}else l=d=0}while(0);if(k=e+10632|0,(0|(t=0|ar[(h=e+10636|0)>>2]))!=(0|(o=0|ar[k>>2]))){if((0|ar[o>>2])==(0|r)&&0<(0|(b=0|ar[16+(0|ar[f>>2])>>2]))){for(o=u+10524|0,t=0;Tn((0|ar[o>>2])+(80*t|0)|0,1),(0|(t=t+1|0))!=(0|b););o=0|ar[k>>2],t=0|ar[h>>2]}}else o=t;a=t-o>>2;A:do{if(1<a>>>0){for(t=1;(0|ar[o+(t<<2)>>2])!=(0|r);)if(a>>>0<=(t=t+1|0)>>>0)break A;if(0|(c=0|ar[o+(t+-1<<2)>>2])&&2==(0|ar[c+40>>2])){a=a+-1|0,t=0;do{if(a>>>0<=t>>>0)break A;t=(b=t)+1|0}while((0|ar[o+(b<<2)>>2])!=(0|c));if(0|(t=0|ar[o+(t<<2)>>2])&&(0|(n=0|ar[16+(0|ar[c+4>>2])>>2]))<(0|ar[16+(0|ar[(s=t+4|0)>>2])>>2]))do{if(t=0|ar[e>>2],(0|n)>=(0|ar[t+10344>>2]))break A;Tn((0|ar[t+10524>>2])+(80*n|0)|0,1),n=n+1|0}while((0|n)<(0|ar[16+(0|ar[s>>2])>>2]))}}}while(0);if(!(l|d)){a=0|function(A,e,r){A|=0,e|=0;var i,f,n,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;if(ur=(n=ur)+18624|0,f=n,t=0|ar[(i=4+(r|=0)|0)>>2],b=t+1348|0,o=0|ar[(u=t+1344|0)>>2],(0|ar[b>>2])!=(0|o)){for(c=A+376148|0,l=A+376156|0,a=0,t=o;-1<(0|(t=0|$o(c,0|ar[t+(a<<2)>>2])))&&(ar[96+(0|ar[(0|ar[l>>2])+(t<<2)>>2])>>2]=0),a=a+1|0,t=0|ar[u>>2],a>>>0<(0|ar[b>>2])-t>>2>>>0;);t=0|ar[i>>2]}if(b=0|ar[e>>2],(0|ar[t+16>>2])>>>0>=(0|ar[b+10276>>2])-(0|ar[b+10272>>2])>>2>>>0)return ur=n,0|(s=6);if(st(b=f+18580|0),t=f+48|0,ar[(u=f+18508|0)>>2]=0,ar[u+4>>2]=0,ar[u+8>>2]=0,ar[u+12>>2]=0,ar[u+16>>2]=0,vb(0|(ar[f+2112>>2]=t),0,2048),t=0|ar[i>>2],ar[f+18600>>2]=t,u=0|ar[e>>2],ar[f+18596>>2]=u,ar[f+18592>>2]=A,ar[f+18604>>2]=e,ar[f+18608>>2]=r,ar[f+4>>2]=ar[(0|ar[u+10272>>2])+(ar[t+16>>2]<<2)>>2],Se(ar[f+18612>>2]=0,f),(0|(t=0|ar[r+12>>2]))<1)t=17;else{nt(f+18556|0,0|ar[r+8>>2],t);do{if(0|tr[A+93817>>0]&&0|tr[4+(0|ar[i>>2])>>0]){if(u=e+10676|0,c=(0|ar[5828+(0|ar[A+376224>>2])>>2])-1|0,t=0|ar[(l=e+10680|0)>>2],o=0|ar[u>>2],(a=t-o>>3)>>>0<c>>>0){Jo(u,c-a|0);break}if(c>>>0<a>>>0&&(0|t)!=(0|(s=o+(c<<3)|0)))for(;e=t+-8|0,kt(ar[l>>2]=e),(0|(t=0|ar[l>>2]))!=(0|s););}}while(0);ar[r+124>>2]=1,t=0|function(A){var e,r,i,f,n,t,o=0,a=0,c=0,l=0,u=0,b=0;l=0|ar[18596+(A|=0)>>2],a=0|ar[A+4>>2],o=0|ar[l+5836>>2],c=0|ar[l+5820>>2],(0|a)<(0|o)&&(o=0|ar[(0|ar[l+10284>>2])+(a<<2)>>2]);if(ar[A>>2]=o,ar[A+8>>2]=(0|o)%(0|c)|0,ar[A+12>>2]=(0|o)/(0|c)|0,a=0|ar[(i=A+18600|0)>>2],!(0|Da(A)))return 0|(A=18);tt(f=A+18556|0),n=A+18560|0,t=A+18592|0,l=l+5966|0,e=A+18580|0,r=A+18588|0,a=0==(0|tr[a+12>>(o=0)]);for(;;){do{if(0<(0|o)){if(c=o+-1|0,b=0|ar[i>>2],u=0|ar[b+776>>2],c>>>0<(0|ar[b+780>>2])-u>>2>>>0&&((0|ar[n>>2])-2-(0|ar[f>>2])|0)==(0|ar[u+(c<<2)>>2]))break;er(4+(0|ar[t>>2])|0,1003,1)}}while(0);if(o=o+1|0,2==(2|Ja(A,0,a))){o=0,a=14;break}if(0|tr[l>>0]){if(a=0|ar[i>>2],3<=(c=0|ar[a+796>>2])>>>0){a=12;break}ht(e,c,0|ar[a+792>>2]),tr[r>>0]=0,tr[1+r>>0]=0,tr[2+r>>0]=0,tr[3+r>>0]=0,a=0}else a=0}if(12==(0|a))sr(39211,39242,1508,39251);else if(14==(0|a))return 0|o;return 0}(f),Tn(r+44|0,1)}return kt(b),ur=n,0|(s=t)}(A,e,r),ar[i>>2]=2,o=0|ar[k>>2],t=((0|ar[h>>2])-o>>2)-1|0,n=0;do{if(t>>>0<=n>>>0){w=a,v=60;break}n=(s=n)+1|0}while((0|ar[o+(s<<2)>>2])!=(0|r));if(60==(0|v))return 0|w;if(!(n=0|ar[o+(n<<2)>>2]))return 0|(e=a);if(!((0|(t=0|ar[16+(0|ar[f>>2])>>2]))<(0|ar[16+(0|ar[(o=n+4|0)>>2])>>2])))return 0|(e=a);for(n=t;;){if(t=0|ar[e>>2],(0|n)>=(0|ar[t+10344>>2])){w=a,v=60;break}if(Tn((0|ar[t+10524>>2])+(80*n|0)|0,1),(0|(n=n+1|0))>=(0|ar[16+(0|ar[o>>2])>>2])){w=a,v=60;break}}if(60==(0|v))return 0|w}if(l&d)return 0|(e=1006);if(l){!function(A,e,r){A|=0,r|=0;var i,f,n,t,o,a,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0;ur=(a=ur)+16|0,t=a,o=0|ar[(e|=0)>>2],n=0|ar[r+4>>2],f=0|ar[768+n>>2],h=1+f|0,i=0|ar[5820+o>>2],(0|ar[10536+o>>2])!=(0-(0|ar[10532+o>>2])|0)&&sr(34762,34700,989,34867);do{if(0|tr[4+n>>0]){if(l=e+10676|0,u=(0|ar[5828+o>>2])-1|0,c=0|ar[(d=e+10680|0)>>2],b=0|ar[l>>2],(s=c-b>>3)>>>0<u>>>0){Jo(l,u-s|0);break}if(u>>>0<s>>>0&&(0|c)!=(0|(k=b+(u<<3)|0)))for(;X=c+-8|0,kt(ar[d>>2]=X),(0|(c=0|ar[d>>2]))!=(0|k););}}while(0);Ue(r,h),c=0|ar[16+n>>2],s=(0|c)/(0|i)|0;A:do{if(0<=(0|f)){if(m=r+140|0,g=r+136|0,Z=10332+o|0,p=10272+o|0,y=r+12|0,B=r+8|0,E=r+124|0,X=A+375396|0,v=776+n|0,!f){if((0|ar[m>>2])<=0&&sr(34817,34837,170,34848),u=0|ar[g>>2],ar[u+18600>>2]=n,ar[u+18592>>2]=ar[Z>>2],ar[u+18596>>2]=o,ar[(l=u+18604|0)>>2]=e,ar[u+18608>>2]=r,ar[u+4>>2]=ar[(0|ar[p>>2])+(c<<2)>>2],Se(0,u),(0|(c=0|ar[y>>2]))<=0)break;nt(u+18556|0,0|ar[B>>2],c),ca(o,1),ar[E>>2]=1+(0|ar[E>>2]),b=0|hu(20),ar[b+4>>2]=0,ar[b>>2]=7972,tr[b+8>>0]=1,ar[b+16>>2]=u,ar[b+12>>2]=s,ar[u+18612>>2]=b,Sn(X,b),c=0|ar[l>>2],ar[t>>2]=b,(u=0|ar[(l=c+10668|0)>>2])>>>0<(0|ar[c+10672>>2])>>>0?(ar[u>>2]=b,ar[l>>2]=4+(0|ar[l>>2])):Oe(c+10664|0,t);break}for(l=s,w=0;;){if((0|w)<=0){if((0|c)%(0|i)|0)break A}else c=0|br(l=c=l+1|0,i);if((0|ar[m>>2])<=(0|w))break;if(s=0|ar[g>>2],d=s+(18624*w|0)|0,ar[s+(18624*w|0)+18600>>2]=n,ar[s+(18624*w|0)+18592>>2]=ar[Z>>2],ar[s+(18624*w|0)+18596>>2]=o,ar[(k=s+(18624*w|0)+18604|0)>>2]=e,ar[s+(18624*w|0)+18608>>2]=r,ar[s+(18624*w|0)+4>>2]=ar[(0|ar[p>>2])+(c<<2)>>2],Se(0,d),b=(h=0==(0|w))?0:0|ar[(0|ar[v>>2])+(w+-1<<2)>>2],u=(0|w)==(0|f)?y:(0|ar[v>>2])+(w<<2)|0,u=0|ar[u>>2],(0|b)<0)break A;if(!((0|b)<(0|u)&&(0|u)<=(0|ar[y>>2])))break A;if(nt(s+(18624*w|0)+18556|0,(0|ar[B>>2])+b|0,u-b|0),ca(o,1),ar[E>>2]=1+(0|ar[E>>2]),A=0|hu(20),ar[A+4>>2]=0,ar[A>>2]=7972,tr[A+8>>0]=1&h,ar[A+16>>2]=d,ar[A+12>>2]=l,ar[s+(18624*w|0)+18612>>2]=A,Sn(X,A),s=0|ar[k>>2],ar[t>>2]=A,(b=0|ar[(u=s+10668|0)>>2])>>>0<(0|ar[s+10672>>2])>>>0?(ar[b>>2]=A,ar[u>>2]=4+(0|ar[u>>2])):Oe(s+10664|0,t),!((0|w)<(0|f)))break A;w=w+1|0}sr(34817,34837,170,34848)}}while(0);if(sa(o),d=e+10664|0,l=0|ar[(k=e+10668|0)>>2],b=0|ar[d>>2],(0|(c=l))!=(0|(u=b))){for(s=0;(u=0|ar[u+(s<<2)>>2])&&(is[511&ar[4+(0|ar[u>>2])>>2]](u),c=0|ar[k>>2],b=0|ar[d>>2],l=c),(s=s+1|0)>>>0<l-(u=b)>>2>>>0;);l=b}ur=((0|c)!=(0|u)&&(ar[k>>2]=c+(~((c+-4-l|0)>>>2)<<2)),a)}(A,e,r),ar[i>>2]=2,o=0|ar[k>>2],t=((0|ar[h>>2])-o>>2)-1|0,n=0;do{if(t>>>0<=n>>>0){w=0,v=60;break}n=(s=n)+1|0}while((0|ar[o+(s<<2)>>2])!=(0|r));if(60==(0|v))return 0|w;if(!(n=0|ar[o+(n<<2)>>2]))return(e=0)|e;if(!((0|(t=0|ar[16+(0|ar[f>>2])>>2]))<(0|ar[16+(0|ar[(o=n+4|0)>>2])>>2])))return(e=0)|e;for(n=t;;){if(t=0|ar[e>>2],(0|n)>=(0|ar[t+10344>>2])){w=0,v=60;break}if(Tn((0|ar[t+10524>>2])+(80*n|0)|0,1),(0|(n=n+1|0))>=(0|ar[16+(0|ar[o>>2])>>2])){w=0,v=60;break}}if(60==(0|v))return 0|w}d||sr(55739,34700,971,34735),a=0|function(A,e,r){A|=0,r|=0;var i,f,n,t,o,a,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0;ur=(a=ur)+16|0,f=a,n=0|ar[(e|=0)>>2],t=0|ar[r+4>>2],o=0|ar[768+t>>2],i=0|ar[5820+n>>2],(0|ar[10536+n>>2])!=(0-(0|ar[10532+n>>2])|0)&&sr(34762,34700,1103,34793);Ue(r,1+o|0),c=0|ar[16+t>>2];A:do{if((0|o)<0)C=0;else{for(g=5968+n|0,Z=5972+n|0,p=r+140|0,y=r+136|0,B=10332+n|0,E=10272+n|0,X=r+12|0,W=r+8|0,I=r+124|0,v=A+375396|0,m=776+t|0,l=c,A=0|ar[(0|ar[10308+n>>2])+(c<<2)>>2],w=0;;){if(0<(0|w)){if(c=A+1|0,A=0|ar[g>>2],(0|c)>=(0|br(0|ar[Z>>2],A))){C=1007;break A}l=(0|br(0|ar[10228+n+(((0|c)/(0|A)|0)<<2)>>2],i))+(0|ar[10184+n+(((0|c)%(0|A)|0)<<2)>>2])|0,A=c}if((0|ar[p>>2])<=(0|w))break;if(b=0|ar[y>>2],s=b+(18624*w|0)|0,ar[b+(18624*w|0)+18600>>2]=t,ar[b+(18624*w|0)+18592>>2]=ar[B>>2],ar[b+(18624*w|0)+18596>>2]=n,ar[(d=b+(18624*w|0)+18604|0)>>2]=e,ar[b+(18624*w|0)+18608>>2]=r,ar[b+(18624*w|0)+4>>2]=ar[(0|ar[E>>2])+(l<<2)>>2],Se(0,s),u=(k=0==(0|w))?0:0|ar[(0|ar[m>>2])+(w+-1<<2)>>2],c=(0|w)==(0|o)?X:(0|ar[m>>2])+(w<<2)|0,c=0|ar[c>>2],(0|u)<0){C=17;break A}if(!((0|u)<(0|c)&&(0|c)<=(0|ar[X>>2]))){C=17;break A}if(nt(b+(18624*w|0)+18556|0,(0|ar[W>>2])+u|0,c-u|0),ca(n,1),ar[I>>2]=1+(0|ar[I>>2]),h=0|hu(24),ar[h+4>>2]=0,ar[h>>2]=7932,tr[h+8>>0]=1&k,ar[h+20>>2]=s,ar[h+12>>2]=(0|l)%(0|i)|0,ar[h+16>>2]=(0|l)/(0|i)|0,ar[b+(18624*w|0)+18612>>2]=h,Sn(v,h),c=0|ar[d>>2],ar[f>>2]=h,(b=0|ar[(u=c+10668|0)>>2])>>>0<(0|ar[c+10672>>2])>>>0?(ar[b>>2]=h,ar[u>>2]=4+(0|ar[u>>2])):Oe(c+10664|0,f),!((0|w)<(0|o))){C=0;break A}w=w+1|0}sr(34817,34837,170,34848)}}while(0);if(sa(n),s=e+10664|0,c=0|ar[(d=e+10668|0)>>2],u=0|ar[s>>2],(0|(A=c))!=(0|(l=u))){for(b=0;(l=0|ar[l+(b<<2)>>2])&&(is[511&ar[4+(0|ar[l>>2])>>2]](l),A=0|ar[d>>2],u=0|ar[s>>2],c=A),(b=b+1|0)>>>0<c-(l=u)>>2>>>0;);c=u}return ur=((0|A)!=(0|l)&&(ar[d>>2]=A+(~((A+-4-c|0)>>>2)<<2)),a),0|C}(A,e,r),ar[i>>2]=2,o=0|ar[k>>2],t=((0|ar[h>>2])-o>>2)-1|0,n=0;do{if(t>>>0<=n>>>0){w=a,v=60;break}n=(A=n)+1|0}while((0|ar[o+(A<<2)>>2])!=(0|r));if(60==(0|v))return 0|w;if(!(t=0|ar[o+(n<<2)>>2]))return 0|(e=a);if((0|(n=0|ar[16+(0|ar[f>>2])>>2]))>=(0|ar[16+(0|ar[(o=t+4|0)>>2])>>2]))return 0|(e=a);for(;;){if(t=0|ar[e>>2],(0|n)>=(0|ar[t+10344>>2])){w=a,v=60;break}if(Tn((0|ar[t+10524>>2])+(80*n|0)|0,1),(0|(n=n+1|0))>=(0|ar[16+(0|ar[o>>2])>>2])){w=a,v=60;break}}return 60==(0|v)?0|w:0}function Do(A,e){e|=0;var r,i,f,n,t,o=0,a=0,c=0,l=0;f=(A|=0)+4|0,n=0|ar[A>>2],1073741823<(o=1+(i=(t=(0|ar[f>>2])-n|0)>>2)|0)>>>0&&zl(),a=(c=(0|ar[(l=A+8|0)>>2])-n|0)>>1,a=c>>2>>>0<536870911?a>>>0<o>>>0?o:a:1073741823;do{if(a){if(!(1073741823<a>>>0)){c=0|hu(a<<2);break}Zu(l=0|X(8),44519),ar[l>>2]=17660,I(0|l,4016,428)}else c=0}while(0);ar[(r=c+(i<<2)|0)>>2]=ar[e>>2],o=r+(0-i<<2)|0,0<(0|t)&&hb(0|o,0|n,0|t),ar[A>>2]=o,ar[f>>2]=4+r,ar[l>>2]=c+(a<<2),n&&vu(n)}function Jo(A,e){var r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0;if((e|=0)>>>0<=(t=0|ar[(i=(A|=0)+8|0)>>2])-(f=0|ar[(l=A+4|0)>>2])>>3>>>0)for(;st(f),f=8+(0|ar[l>>2])|0,ar[l>>2]=f,0!=(0|(e=e+-1|0)););else{536870911<(f=(o=f-(n=0|ar[A>>2])>>3)+e|0)>>>0&&zl(),c=(a=t-n|0)>>2,f=a>>3>>>0<268435455?c>>>0<f>>>0?f:c:536870911;do{if(f){if(!(536870911<f>>>0)){n=0|hu(f<<3);break}Zu(l=0|X(8),44519),ar[l>>2]=17660,I(0|l,4016,428)}else n=0}while(0);for(c=n+(f<<3)|0,a=o=r=n+(o<<3)|0,f=r;st(f),a=f=a+8|0,0!=(0|(e=e+-1|0)););if(t=0|ar[A>>2],(0|(f=0|ar[l>>2]))==(0|t))e=o,f=n=t;else{for(n=o,e=r;dt(e+-8|0,f=f+-8|0),n=e=n+-8|0,(0|f)!=(0|t););e=n,n=0|ar[A>>2],f=0|ar[l>>2]}if(ar[A>>2]=e,ar[l>>2]=a,ar[i>>2]=c,(0|f)!=(0|(e=n)))for(;kt(f=f+-8|0),(0|f)!=(0|e););n&&vu(n)}}function Mo(A,e){e|=0;var r,i,f,n,t,o=0,a=0,c=0,l=0;f=(A|=0)+4|0,n=0|ar[A>>2],1073741823<(o=1+(i=(t=(0|ar[f>>2])-n|0)>>2)|0)>>>0&&zl(),a=(c=(0|ar[(l=A+8|0)>>2])-n|0)>>1,a=c>>2>>>0<536870911?a>>>0<o>>>0?o:a:1073741823;do{if(a){if(!(1073741823<a>>>0)){c=0|hu(a<<2);break}Zu(l=0|X(8),44519),ar[l>>2]=17660,I(0|l,4016,428)}else c=0}while(0);ar[(r=c+(i<<2)|0)>>2]=ar[e>>2],o=r+(0-i<<2)|0,0<(0|t)&&hb(0|o,0|n,0|t),ar[A>>2]=o,ar[f>>2]=4+r,ar[l>>2]=c+(a<<2),n&&vu(n)}function To(A,e,r,i,f){A|=0,r|=0,i|=0,f|=0;var n,t=0,o=0,a=0,c=0;if(0|Lo(t=(e|=0)+376148|0,1)||sr(35044,34700,1433,35080),(0|(n=0|ia(t,0|ar[e+375388>>2],A,0,0,0,0)))<=-1&&sr(35119,34700,1436,35080),A=0|ar[e+376156>>2],A=(0|ar[e+376160>>2])-A>>2>>>0>n>>>0?0|ar[A+(n<<2)>>2]:0,e=1<<(0|ar[r+5004>>2])-1,function(A,e,r,i){A|=0,r|=0,i|=0,-1<(0|(e|=0))&&vb(0|ar[A+4>>2],255&e|0,0|br(0|ar[A+28>>2],0|ar[A+40>>2]));-1<(0|r)&&vb(0|ar[A+8>>2],255&r|0,0|br(0|ar[A+36>>2],0|ar[A+44>>2]));if((0|i)<=-1)return;vb(0|ar[A+12>>2],255&i|0,0|br(0|ar[A+36>>2],0|ar[A+44>>2]))}(A,1<<(0|ar[r+4996>>2])-1,e,e),0<(0|ar[(e=A+10364|0)>>2]))for(o=A+10360|0,t=0;a=(0|ar[o>>2])+(3*t|0)|0,c=-769&(cr[a>>0]|cr[a+1>>0]<<8),tr[a>>0]=c,tr[a+1>>0]=c>>8,(0|(t=t+1|0))<(0|ar[e>>2]););return ar[A+92>>2]=i,ar[A+88>>2]=(0|ar[r+5032>>2])-1&i,tr[A+100>>0]=0,ar[A+96>>2]=f?2:1,tr[A+10516>>0]=1,0|n}function Uo(A,e){A|=0;var r,i,f=0,n=0,t=0,o=0,a=0;if(ur=(i=ur)+112|0,r=i+24|0,t=(o=i)+104|0,function(A,e,r){e|=0,r|=0;var i,f=0,n=0,t=0,o=0,a=0,c=0,l=0;ar[(A|=0)>>2]=e,ar[(i=A+4|0)>>2]=r,ar[(c=a=A+8|0)>>2]=0,ar[c+4>>2]=0,ar[(c=A+16|0)>>2]=0,r?(f=e+1|0,ar[A>>2]=f,n=0|cr[e>>0],o=r+-1|0,ar[i>>2]=o,n=0|db(0|n,0,56),t=D,ar[(l=a)>>2]=n,ar[l+4>>2]=t,o?(o=e+2|0,ar[A>>2]=o,f=0|cr[f>>0],l=r+-2|0,ar[i>>2]=l,f=0|db(0|f,0,48),f|=n,n=t|D,ar[(t=a)>>2]=f,ar[t+4>>2]=n,l?(t=e+3|0,ar[A>>2]=t,o=0|cr[o>>0],l=r+-3|0,ar[i>>2]=l,o=0|db(0|o,0,40),o|=f,f=n|D,ar[(n=a)>>2]=o,ar[n+4>>2]=f,l?(n=e+4|0,ar[A>>2]=n,t=0|cr[t>>0],l=r+-4|0,ar[i>>2]=l,f|=t,ar[(t=a)>>2]=o,ar[t+4>>2]=f,l?(t=e+5|0,ar[A>>2]=t,n=0|cr[n>>0],l=r+-5|0,ar[i>>2]=l,n=0|db(0|n,0,24),n|=o,f|=D,ar[(o=a)>>2]=n,ar[o+4>>2]=f,l?(o=e+6|0,ar[A>>2]=o,t=0|cr[t>>0],l=r+-6|0,ar[i>>2]=l,n|=t=0|db(0|t,0,16),f|=D,ar[(t=a)>>2]=n,ar[t+4>>2]=f,l?(t=e+7|0,ar[A>>2]=t,o=0|cr[o>>0],l=r+-7|0,ar[i>>2]=l,n|=o=0|db(0|o,0,8),f|=D,ar[(o=a)>>2]=n,ar[o+4>>2]=f,l=l?(ar[A>>2]=e+8,e=0|cr[t>>0],ar[i>>2]=r+-8,ar[(l=a)>>2]=n|e,ar[l+4>>2]=f,64-(l=0)|0):64-(l=8)|0,ar[c>>2]=l):(l=64-(l=16)|0,ar[c>>2]=l)):(l=64-(l=24)|0,ar[c>>2]=l)):(l=64-(l=32)|0,ar[c>>2]=l)):(l=64-(l=40)|0,ar[c>>2]=l)):(l=64-(l=48)|0,ar[c>>2]=l)):(l=64-(l=56)|0,ar[c>>2]=l)):(a=(a=64)-a|0,ar[c>>2]=a)}(o,0|ar[(e|=0)+20>>2],0|ar[e+24>>2]),tr[t>>0]=0,tr[(a=t+1|0)>>0]=0,tr[(f=t+2|0)>>0]=0,function(A,e){A|=0;var r=0;et(e=e|0,1),r=255&(0|At(e,6)),tr[A>>0]=r,r=255&(0|At(e,6)),tr[A+1>>0]=r,e=255+(0|At(e,3))&255,tr[A+2>>0]=e}(t,o),n=0|tr[t>>0],tr[A+377212>>0]=n,tr[A+377213>>0]=(n+-19&255)<2&1,tr[A+377214>>0]=(-8&n)<<24>>24==16&1,0|tr[a>>0])return Ba(A+548|0,e),ur=i,(e=0)|e;if((0|cr[f>>0])>(0|ar[A+375912>>2]))return Ba(A+548|0,e),ur=i,(e=0)|e;if((255&n)<32)return e=0|rr(A,o,e,t),ur=i,0|e;switch(n<<24>>24){case 32:return a=0|ze(A,o),Ba(A+548|0,e),ur=i,0|(e=a);case 33:return a=0|Le(A,o),Ba(A+548|0,e),ur=i,0|(e=a);case 34:return a=0|qe(A,o),Ba(A+548|0,e),ur=i,0|(e=a);case 40:case 39:a=0|function(A,e,r,i){A|=0,e|=0,r|=0,i|=0;var f=0,n=0;r=0;for(;n=0|At(A,8),r=n+r|0,255==(0|n););f=0;for(;n=0|At(A,8),f=n+f|0,255==(0|n););if(ar[e>>2]=r,ar[e+4>>2]=f,132!=(0|r))return(e=0)|e;if(f=0|At(A,8),ar[(n=e+8|0)>>2]=f,!i)return 0|(e=1025);i=0==(0|ar[i+476>>2])?1:3,r=0;for(;;){switch(0|f){case 0:f=255&(0|At(A,8)),tr[e+12+(r<<4)>>0]=f,f=255&(0|At(A,8)),tr[e+12+(r<<4)+1>>0]=f,f=255&(0|At(A,8)),tr[e+12+(r<<4)+2>>0]=f,f=255&(0|At(A,8)),tr[e+12+(r<<4)+3>>0]=f,f=255&(0|At(A,8)),tr[e+12+(r<<4)+4>>0]=f,f=255&(0|At(A,8)),tr[e+12+(r<<4)+5>>0]=f,f=255&(0|At(A,8)),tr[e+12+(r<<4)+6>>0]=f,f=255&(0|At(A,8)),tr[e+12+(r<<4)+7>>0]=f,f=255&(0|At(A,8)),tr[e+12+(r<<4)+8>>0]=f,f=255&(0|At(A,8)),tr[e+12+(r<<4)+9>>0]=f,f=255&(0|At(A,8)),tr[e+12+(r<<4)+10>>0]=f,f=255&(0|At(A,8)),tr[e+12+(r<<4)+11>>0]=f,f=255&(0|At(A,8)),tr[e+12+(r<<4)+12>>0]=f,f=255&(0|At(A,8)),tr[e+12+(r<<4)+13>>0]=f,f=255&(0|At(A,8)),tr[e+12+(r<<4)+14>>0]=f,f=255&(0|At(A,8)),tr[e+12+(r<<4)+15>>0]=f;break;case 1:f=65535&(0|At(A,16)),or[e+60+(r<<1)>>1]=f;break;case 2:f=0|At(A,32),ar[e+68+(r<<2)>>2]=f}if((0|i)<=(0|(r=r+1|0))){r=0;break}f=0|ar[n>>2]}return 0|r}(o,r,n=n<<24>>24==40,0|ar[A+375388>>2]);do{if(a)20==(0|(f=0|ar[(n=A+84|0)>>2]))?(n=1001,f=19):(ar[n>>2]=f+1,n=a),ar[A+4+(f<<2)>>2]=n;else if(f=0|ar[A+377220>>2],!((0|ar[A+377216>>2])==(0|f)|1^n)){if(f=0|ar[f+-4>>2],(0|(n=0|ar[(o=f+10648|0)>>2]))==(0|ar[f+10652>>2])){Ar(f+10644|0,r);break}for(f=r,t=n+80|0;ar[n>>2]=ar[f>>2],f=f+4|0,(0|(n=n+4|0))<(0|t););ar[o>>2]=80+(0|ar[o>>2]);break}}while(0);return Ba(A+548|0,e),ur=i,0|(e=a);case 36:return tr[A+376211>>0]=1,Ba(A+548|0,e),ur=i,(e=0)|e;default:return Ba(A+548|0,e),ur=i,(e=0)|e}return 0}function So(A,e,r,i,f){A|=0,r|=0,i|=0,f|=0;var n,t,o,a,c,l,u,b=0,s=0,d=0,k=0,h=0,w=0,v=0;if(ur=(u=ur)+2048|0,l=u,1<(0|(e|=0)))for(s=e,b=0;b=b+1|0,3<s>>>0;)s>>>=1;else b=0;if(a=5-b|0,c=1<<i+-1,n=(w=1<<f)+65535|0,t=0-w|0,o=0<(0|e)){h=65535&(31==(0|f)?t:31!=(0|f)?0:n),k=0;do{for(d=e;;){if(b=d+-1|0,(0|d)<=0){b=0,s=8;break}if(f=r+((0|br(b,e))+k<<1)|0,0|or[f>>1]){f=0,s=10;break}d=b}if(8==(0|s))for(;d=l+((0|br(b,e))+k<<1)|0,or[d>>1]=h,(0|(b=b+1|0))!=(0|e);)s=8;else if(10==(0|s))for(;;){for(s=b=0;v=r+((0|br(b,e))+k<<1)|0,s=(0|br(0|or[v>>1],0|tr[35206+(b<<a<<5)+f>>0]))+s|0,(0|(b=b+1|0))!=(0|d););if(s=s+64>>7,v=l+((0|br(f,e))+k<<1)|0,or[v>>1]=(0|s)<(0|t)?t:(0|s)<(0|w)?s:n,(0|(f=f+1|0))==(0|e))break;s=10}k=k+1|0}while((0|k)!=(0|e));if(o){h=c>>i,k=0;do{for(w=0|br(k,e),d=e;;){if(b=d+-1|0,(0|d)<=0){b=0,s=18;break}if(0|or[l+(b+w<<1)>>1]){f=0,s=20;break}d=b}if(18==(0|s))for(;ar[A+(b+w<<2)>>2]=h,(0|(b=b+1|0))!=(0|e);)s=18;else if(20==(0|s))for(;;){for(s=b=0;s=(0|br(0|or[l+(b+w<<1)>>1],0|tr[35206+(b<<a<<5)+f>>0]))+s|0,(0|(b=b+1|0))!=(0|d););if(ar[A+(f+w<<2)>>2]=s+c>>i,(0|(f=f+1|0))==(0|e))break;s=20}k=k+1|0}while((0|k)!=(0|e));ur=u}else ur=u}else ur=u}function Oo(A,e,r,i,f){A|=0,e|=0,i|=0;var n,t,o,a,c,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0;if(ur=(c=ur)+2048|0,t=c,a=1<<(o=20-(f|=0)|0)-1,1<(0|(r|=0)))for(u=r,l=0;l=l+1|0,3<u>>>0;)u>>>=1;else l=0;if(n=5-l|0,k=0<(0|r)){d=0;do{for(s=r;;){if(l=s+-1|0,(0|s)<=0){l=0,u=7;break}if(w=i+((0|br(l,r))+d<<1)|0,0|or[w>>1]){b=0,u=9;break}s=l}if(7==(0|u))for(;w=t+((0|br(l,r))+d<<1)|0,((or[w>>1]=0)|(l=l+1|0))!=(0|r);)u=7;else if(9==(0|u))for(;;){for(u=l=0;w=i+((0|br(l,r))+d<<1)|0,u=(0|br(0|or[w>>1],0|tr[35206+(l<<n<<5)+b>>0]))+u|0,(0|(l=l+1|0))!=(0|s););if(h=u+64>>7,w=t+((0|br(b,r))+d<<1)|0,or[w>>1]=(0|h)<-32768?-32768:65535&((0|h)<32767?h:32767),(0|(b=b+1|0))==(0|r))break;u=9}d=d+1|0}while((0|d)!=(0|r));if(k){h=(f=1<<f)+255|0,w=a>>o,i=0;do{for(k=0|br(i,r),d=r;;){if(l=d+-1|0,(0|d)<=0){u=18;break}if(0|or[t+(l+k<<1)>>1]){u=19;break}d=l}if(18==(0|u))for(u=0|br(i,e),l=0;d=(0|cr[(k=A+(l+u)|0)>>0])+w|0,tr[k>>0]=(0|d)<0?0:255&((0|d)<(0|f)?d:h),(0|(l=l+1|0))!=(0|r););else if(19==(0|u)){s=0|br(i,e),b=0;do{for(u=l=0;u=(0|br(0|or[t+(l+k<<1)>>1],0|tr[35206+(l<<n<<5)+b>>0]))+u|0,(0|(l=l+1|0))!=(0|d););u=(0|cr[(l=A+(b+s)|0)>>0])+(u+a>>o)|0,tr[l>>0]=(0|u)<0?0:255&((0|u)<(0|f)?u:h),b=b+1|0}while((0|b)!=(0|r))}i=i+1|0}while((0|i)!=(0|r));ur=c}else ur=c}else ur=c}function zo(A,e,r,i,f){A|=0,e|=0,i|=0;var n,t,o,a,c,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0;if(ur=(c=ur)+2048|0,t=c,a=1<<(o=20-(f|=0)|0)-1,1<(0|(r|=0)))for(u=r,l=0;l=l+1|0,3<u>>>0;)u>>>=1;else l=0;if(n=5-l|0,k=0<(0|r)){d=0;do{for(s=r;;){if(l=s+-1|0,(0|s)<=0){l=0,u=7;break}if(w=i+((0|br(l,r))+d<<1)|0,0|or[w>>1]){b=0,u=9;break}s=l}if(7==(0|u))for(;w=t+((0|br(l,r))+d<<1)|0,((or[w>>1]=0)|(l=l+1|0))!=(0|r);)u=7;else if(9==(0|u))for(;;){for(u=l=0;w=i+((0|br(l,r))+d<<1)|0,u=(0|br(0|or[w>>1],0|tr[35206+(l<<n<<5)+b>>0]))+u|0,(0|(l=l+1|0))!=(0|s););if(h=u+64>>7,w=t+((0|br(b,r))+d<<1)|0,or[w>>1]=(0|h)<-32768?-32768:65535&((0|h)<32767?h:32767),(0|(b=b+1|0))==(0|r))break;u=9}d=d+1|0}while((0|d)!=(0|r));if(k){h=(f=1<<f)+65535|0,w=a>>o,i=0;do{for(k=0|br(i,r),d=r;;){if(l=d+-1|0,(0|d)<=0){u=18;break}if(0|or[t+(l+k<<1)>>1]){u=19;break}d=l}if(18==(0|u))for(u=0|br(i,e),l=0;d=(0|lr[(k=A+(l+u<<1)|0)>>1])+w|0,or[k>>1]=(0|d)<0?0:65535&((0|d)<(0|f)?d:h),(0|(l=l+1|0))!=(0|r););else if(19==(0|u)){s=0|br(i,e),b=0;do{for(u=l=0;u=(0|br(0|or[t+(l+k<<1)>>1],0|tr[35206+(l<<n<<5)+b>>0]))+u|0,(0|(l=l+1|0))!=(0|d););u=(0|lr[(l=A+(b+s<<1)|0)>>1])+(u+a>>o)|0,or[l>>1]=(0|u)<0?0:65535&((0|u)<(0|f)?u:h),b=b+1|0}while((0|b)!=(0|r))}i=i+1|0}while((0|i)!=(0|r));ur=c}else ur=c}else ur=c}function jo(A,e,r,i){A|=0,r|=0,i|=0;var f,n,t,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0;if(ur=(t=ur)+2048|0,n=t,1<(0|(e|=0))){for(o=e,u=0;;){if(!(3<o>>>0)){o=e,a=0;break}o>>>=1,u=u+1|0}for(;3<o>>>0;)o>>>=1,a=a+1|0;for(b=a+7|0,c=1<<u+-1,l=1<<a+6,a=e,o=0;;){if(o=o+1|0,!(3<a>>>0)){d=u,h=l,k=b;break}a>>>=1}}else c=o=0,d=-1,h=32,k=6;if(f=5-o|0,b=0<(0|e)){o=0;do{u=0;do{for(s=u<<f,l=a=0;w=r+((0|br(a,i))+o<<1)|0,l=(0|br(0|or[w>>1],0|tr[35206+(s<<5)+a>>0]))+l|0,(0|(a=a+1|0))!=(0|e););w=n+((0|br(u,e))+o<<1)|0,or[w>>1]=l+c>>d,u=u+1|0}while((0|u)!=(0|e));o=o+1|0}while((0|o)!=(0|e));if(b){l=0;do{u=0|br(l,e),c=0;do{for(b=c<<f,a=o=0;a=(0|br(0|or[n+(o+u<<1)>>1],0|tr[35206+(b<<5)+o>>0]))+a|0,(0|(o=o+1|0))!=(0|e););or[A+(c+u<<1)>>1]=a+h>>k,c=c+1|0}while((0|c)!=(0|e));l=l+1|0}while((0|l)!=(0|e));ur=t}else ur=t}else ur=t}function Ho(A,e,r,i){A|=0,r|=0,i|=0;var f,n,t,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0;if(ur=(t=ur)+2176|0,n=t+128|0,f=0<(0|(e|=0))){for(w=0==(0|(h=e>>>1)),v=e>>>2,m=7<e>>>0,b=(l=t)+64|(k=0);;){if(a=0|br(k,i),!w)for(c=b,o=0;u=r+(o+a<<1)|0,s=r+((d=o+h|0)+a<<1)|0,or[c+(o<<1)>>1]=(0|lr[s>>1])+(0|lr[u>>1]),or[c+(d<<1)>>1]=(0|lr[u>>1])-(0|lr[s>>1]),(0|(o=o+1|0))!=(0|h););if(m)for(s=v,d=h,u=l,l=b;;){c=l,b=u,a=0;do{for(o=0;p=c+((y=o+a|0)<<1)|0,Z=c+((g=y+s|0)<<1)|0,or[b+(y<<1)>>1]=(0|lr[Z>>1])+(0|lr[p>>1]),or[b+(g<<1)>>1]=(0|lr[p>>1])-(0|lr[Z>>1]),(0|(o=o+1|0))!=(0|s););a=a+d|0}while((0|a)<(0|e));if((0|(s>>=1))<=1)break;y=l,d>>=1,l=u,u=y}else u=b;for(a=u,c=0|br(k,e),o=0;Z=0|or[a+(o<<1)>>1],p=0|or[a+((y=1|o)<<1)>>1],or[n+(o+c<<1)>>1]=p+Z,or[n+(y+c<<1)>>1]=Z-p,(0|(o=o+2|0))<(0|e););if((0|(k=k+1|0))==(0|e))break;b=u}if(f){for(w=0==(0|(h=e>>>1)),v=e>>>2,m=7<e>>>0,k=0;;){if(!w)for(a=u,o=0;Z=n+((0|br(o,e))+k<<1)|0,Z=0|or[Z>>1],p=n+((0|br(y=o+h|0,e))+k<<1)|0,p=0|or[p>>1],or[a+(o<<1)>>1]=p+Z,or[a+(y<<1)>>1]=Z-p,(0|(o=o+1|0))!=(0|h););if(m)for(s=v,d=h,c=l,l=u;;){u=l,b=c,a=0;do{for(o=0;Z=u+((g=o+a|0)<<1)|0,p=u+((y=g+s|0)<<1)|0,or[b+(g<<1)>>1]=(0|lr[p>>1])+(0|lr[Z>>1]),or[b+(y<<1)>>1]=(0|lr[Z>>1])-(0|lr[p>>1]),(0|(o=o+1|0))!=(0|s););a=a+d|0}while((0|a)<(0|e));if((0|(s>>=1))<=1)break;y=l,d>>=1,l=c,c=y}else c=u;for(a=c,o=0;Z=a+(o<<1)|0,p=a+((y=1|o)<<1)|0,g=A+((0|br(o,e))+k<<1)|0,or[g>>1]=(0|lr[p>>1])+(0|lr[Z>>1]),y=A+((0|br(y,e))+k<<1)|0,or[y>>1]=(0|lr[Z>>1])-(0|lr[p>>1]),(0|(o=o+2|0))<(0|e););if((0|(k=k+1|0))==(0|e))break;u=c}ur=t}else ur=t}else ur=t}function xo(A,e,r,i,f,n,t,o,a,c){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,a|=0,c|=0;var l,u,b,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0;switch(d=0|ar[9768+((o|=0)<<2)>>2],b=(u=0|ar[9768+(a<<2)>>2])+n+(s=0|ar[9784+(a<<2)>>2])|0,l=c+-8|0,0|o){case 0:if((0|(c=0-u|0))<(0|(h=s+n|0))&&(v=0-d|0,0<(0|f)))do{for(d=t+(c+u<<1)|(s=0),k=r+(0|br(c,i))+v|0;or[d>>1]=0|cr[k>>0],(0|(s=s+1|0))!=(0|f);)d=d+(b<<1)|0,k=k+1|0;c=c+1|0}while((0|c)!=(0|h));break;case 1:if((0|(c=0-u|0))<(0|(h=s+n|0))&&(m=0-d|0,0<(0|f)))do{for(d=t+(c+u<<1)|(s=0),k=r+(0|br(c,i))+m|0;v=(v=(cr[(k=(g=k)+1|0)>>0]<<2)-(0|cr[g>>0])+(0|br(0|cr[g+2>>0],-10))|0)+(58*(0|cr[g+3>>0])|0)+(17*(0|cr[g+4>>0])|0)+(0|br(0|cr[g+5>>0],-5))|0,or[d>>1]=v+(0|cr[g+6>>0])>>l,(0|(s=s+1|0))!=(0|f);)d=d+(b<<1)|0;c=c+1|0}while((0|c)!=(0|h));break;case 2:if((0|(c=0-u|0))<(0|(h=s+n|0))&&(g=0-d|0,0<(0|f)))do{for(d=t+(c+u<<1)|(s=0),k=r+(0|br(c,i))+g|0;m=(cr[(k=(m=k)+1|0)>>0]<<2)-(0|cr[m>>0])+(40*((0|cr[m+4>>0])+(0|cr[m+3>>0])|0)|0)+(cr[m+6>>0]<<2)-(0|cr[m+7>>0])+(0|br((0|cr[m+5>>0])+(0|cr[m+2>>0])|0,-11))>>l&65535,or[d>>1]=m,(0|(s=s+1|0))!=(0|f);)d=d+(b<<1)|0;c=c+1|0}while((0|c)!=(0|h));break;case 3:if((0|(c=0-u|0))<(0|(h=s+n|0))&&(w=0-d|0,0<(0|f)))do{for(d=t+(c+u<<1)|(s=0),k=r+(0|br(c,i))+w|0;m=(m=(0|br(0|cr[(k=(g=k)+1|0)>>0],-5))+(0|cr[g>>0])|0)+(17*(0|cr[g+2>>0])|0)+(58*(0|cr[g+3>>0])|0)+(0|br(0|cr[g+4>>0],-10))|0,or[d>>1]=m+(cr[g+5>>0]<<2)-(0|cr[g+6>>0])>>l,(0|(s=s+1|0))!=(0|f);)d=d+(b<<1)|0;c=c+1|0}while((0|c)!=(0|h))}switch(h=0==(0|o)?l:6,0|a){case 0:if(!(0<(0|f)&0<(0|n)))return;k=0;do{for(s=A+(k<<1)|(c=0),d=t+((0|br(k,b))<<1)|0;or[s>>1]=0|or[d>>1],(0|(c=c+1|0))!=(0|n);)s=s+(e<<1)|0,d=d+2|0;k=k+1|0}while((0|k)!=(0|f));return;case 1:if(!(0<(0|f)&0<(0|n)))return;k=0;do{for(s=A+(k<<1)|(c=0),d=t+((0|br(k,b))<<1)|0;o=(o=(or[(d=(a=d)+2|0)>>1]<<2)-(0|or[a>>1])+(0|br(0|or[a+4>>1],-10))|0)+(58*(0|or[a+6>>1])|0)+(17*(0|or[a+8>>1])|0)+(0|br(0|or[a+10>>1],-5))|0,or[s>>1]=o+(0|or[a+12>>1])>>h,(0|(c=c+1|0))!=(0|n);)s=s+(e<<1)|0;k=k+1|0}while((0|k)!=(0|f));return;case 2:if(!(0<(0|f)&0<(0|n)))return;k=0;do{for(s=A+(k<<1)|(c=0),d=t+((0|br(k,b))<<1)|0;a=(or[(d=(a=d)+2|0)>>1]<<2)-(0|or[a>>1])+(40*((0|or[a+8>>1])+(0|or[a+6>>1])|0)|0)+(or[a+12>>1]<<2)-(0|or[a+14>>1])+(0|br((0|or[a+10>>1])+(0|or[a+4>>1])|0,-11))>>h&65535,or[s>>1]=a,(0|(c=c+1|0))!=(0|n);)s=s+(e<<1)|0;k=k+1|0}while((0|k)!=(0|f));return;case 3:if(!(0<(0|f)&0<(0|n)))return;k=0;do{for(s=A+(k<<1)|(c=0),d=t+((0|br(k,b))<<1)|0;o=(o=(0|br(0|or[(d=(a=d)+2|0)>>1],-5))+(0|or[a>>1])|0)+(17*(0|or[a+4>>1])|0)+(58*(0|or[a+6>>1])|0)+(0|br(0|or[a+8>>1],-10))|0,or[s>>1]=o+(or[a+10>>1]<<2)-(0|or[a+12>>1])>>h,(0|(c=c+1|0))!=(0|n);)s=s+(e<<1)|0;k=k+1|0}while((0|k)!=(0|f));return;default:return}}function Po(A,e,r,i,f,n,t,o,a,c){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,a|=0,c|=0;var l,u,b,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0;switch(d=0|ar[9768+((o|=0)<<2)>>2],b=(u=0|ar[9768+(a<<2)>>2])+n+(s=0|ar[9784+(a<<2)>>2])|0,l=c+-8|0,0|o){case 0:if((0|(c=0-u|0))<(0|(h=s+n|0))&&(v=0-d|0,0<(0|f)))do{for(d=t+(c+u<<1)|(s=0),k=r+((0|br(c,i))<<1)+(v<<1)|0;or[d>>1]=0|or[k>>1],(0|(s=s+1|0))!=(0|f);)d=d+(b<<1)|0,k=k+2|0;c=c+1|0}while((0|c)!=(0|h));break;case 1:if((0|(c=0-u|0))<(0|(h=s+n|0))&&(m=0-d|0,0<(0|f)))do{for(d=t+(c+u<<1)|(s=0),k=r+((0|br(c,i))<<1)+(m<<1)|0;v=(v=(lr[(k=(g=k)+2|0)>>1]<<2)-(0|lr[g>>1])+(0|br(0|lr[g+4>>1],-10))|0)+(58*(0|lr[g+6>>1])|0)+(17*(0|lr[g+8>>1])|0)+(0|br(0|lr[g+10>>1],-5))|0,or[d>>1]=v+(0|lr[g+12>>1])>>l,(0|(s=s+1|0))!=(0|f);)d=d+(b<<1)|0;c=c+1|0}while((0|c)!=(0|h));break;case 2:if((0|(c=0-u|0))<(0|(h=s+n|0))&&(g=0-d|0,0<(0|f)))do{for(d=t+(c+u<<1)|(s=0),k=r+((0|br(c,i))<<1)+(g<<1)|0;m=(lr[(k=(m=k)+2|0)>>1]<<2)-(0|lr[m>>1])+(40*((0|lr[m+8>>1])+(0|lr[m+6>>1])|0)|0)+(lr[m+12>>1]<<2)-(0|lr[m+14>>1])+(0|br((0|lr[m+10>>1])+(0|lr[m+4>>1])|0,-11))>>l&65535,or[d>>1]=m,(0|(s=s+1|0))!=(0|f);)d=d+(b<<1)|0;c=c+1|0}while((0|c)!=(0|h));break;case 3:if((0|(c=0-u|0))<(0|(h=s+n|0))&&(w=0-d|0,0<(0|f)))do{for(d=t+(c+u<<1)|(s=0),k=r+((0|br(c,i))<<1)+(w<<1)|0;m=(m=(0|br(0|lr[(k=(g=k)+2|0)>>1],-5))+(0|lr[g>>1])|0)+(17*(0|lr[g+4>>1])|0)+(58*(0|lr[g+6>>1])|0)+(0|br(0|lr[g+8>>1],-10))|0,or[d>>1]=m+(lr[g+10>>1]<<2)-(0|lr[g+12>>1])>>l,(0|(s=s+1|0))!=(0|f);)d=d+(b<<1)|0;c=c+1|0}while((0|c)!=(0|h))}switch(h=0==(0|o)?l:6,0|a){case 0:if(!(0<(0|f)&0<(0|n)))return;k=0;do{for(s=A+(k<<1)|(c=0),d=t+((0|br(k,b))<<1)|0;or[s>>1]=0|or[d>>1],(0|(c=c+1|0))!=(0|n);)s=s+(e<<1)|0,d=d+2|0;k=k+1|0}while((0|k)!=(0|f));return;case 1:if(!(0<(0|f)&0<(0|n)))return;k=0;do{for(s=A+(k<<1)|(c=0),d=t+((0|br(k,b))<<1)|0;o=(o=(or[(d=(a=d)+2|0)>>1]<<2)-(0|or[a>>1])+(0|br(0|or[a+4>>1],-10))|0)+(58*(0|or[a+6>>1])|0)+(17*(0|or[a+8>>1])|0)+(0|br(0|or[a+10>>1],-5))|0,or[s>>1]=o+(0|or[a+12>>1])>>h,(0|(c=c+1|0))!=(0|n);)s=s+(e<<1)|0;k=k+1|0}while((0|k)!=(0|f));return;case 2:if(!(0<(0|f)&0<(0|n)))return;k=0;do{for(s=A+(k<<1)|(c=0),d=t+((0|br(k,b))<<1)|0;a=(or[(d=(a=d)+2|0)>>1]<<2)-(0|or[a>>1])+(40*((0|or[a+8>>1])+(0|or[a+6>>1])|0)|0)+(or[a+12>>1]<<2)-(0|or[a+14>>1])+(0|br((0|or[a+10>>1])+(0|or[a+4>>1])|0,-11))>>h&65535,or[s>>1]=a,(0|(c=c+1|0))!=(0|n);)s=s+(e<<1)|0;k=k+1|0}while((0|k)!=(0|f));return;case 3:if(!(0<(0|f)&0<(0|n)))return;k=0;do{for(s=A+(k<<1)|(c=0),d=t+((0|br(k,b))<<1)|0;o=(o=(0|br(0|or[(d=(a=d)+2|0)>>1],-5))+(0|or[a>>1])|0)+(17*(0|or[a+4>>1])|0)+(58*(0|or[a+6>>1])|0)+(0|br(0|or[a+8>>1],-10))|0,or[s>>1]=o+(or[a+10>>1]<<2)-(0|or[a+12>>1])>>h,(0|(c=c+1|0))!=(0|n);)s=s+(e<<1)|0;k=k+1|0}while((0|k)!=(0|f));return;default:return}}function Lo(A,e){var r,i=0,f=0;if(e|=0)return 0|(f=1);if(e=0|ar[(A|=0)+12>>2],r=i=0|ar[A+8>>2],(f=e-i>>2)>>>0<(0|ar[A>>2])>>>0)return 0|(f=1);if((0|e)==(0|i))return(f=0)|f;for(e=0;;){if(A=0|ar[r+(e<<2)>>2],0==(0|tr[A+100>>0])&&0==(0|ar[A+96>>2])){e=1,i=7;break}if(f>>>0<=(e=e+1|0)>>>0){e=0,i=7;break}}return 7==(0|i)?0|e:0}function Ko(A,e,r,i){A|=0,e|=0,r|=0,i|=0;var f=0,n=0,t=0,o=0,a=0;A:do{if(i){if(n=A+8|0,(0|(t=0|ar[A+12>>2]))==(0|(A=o=0|ar[n>>2])))return 0|(r=-1);for(f=t-o>>2,i=0;a=0|ar[A+(i<<2)>>2],!((0|ar[a+92>>2])==(0|e)&&(0|ar[a+104>>2])>(0|r)&&2==(0|ar[a+96>>2]));)if(f>>>0<=(i=i+1|0)>>>0){f=t,i=o;break A}return 0|i}a=0|ar[(n=A+8|0)>>2],f=0|ar[A+12>>2],A=i=a}while(0);if((0|f)==(0|i))return 0|(a=-1);for(i=0;;){if(a=0|ar[A+(i<<2)>>2],(0|ar[a+92>>2])==(0|e)&&(0|ar[a+104>>2])>(0|r)&&0|ar[a+96>>2]){A=14;break}if((i=i+1|0)>>>0>=f-(0|ar[n>>2])>>2>>>0){i=-1,A=14;break}}return 14==(0|A)?0|i:0}function qo(A,e,r,i){A|=0,e|=0,r|=0,i|=0;var f=0,n=0,t=0,o=0,a=0;A:do{if(i){if(n=A+8|0,(0|(t=0|ar[A+12>>2]))==(0|(A=o=0|ar[n>>2])))return 0|(r=-1);for(f=t-o>>2,i=0;a=0|ar[A+(i<<2)>>2],!((0|ar[a+88>>2])==(0|e)&&(0|ar[a+104>>2])>(0|r)&&2==(0|ar[a+96>>2]));)if(f>>>0<=(i=i+1|0)>>>0){f=t,i=o;break A}return 0|i}a=0|ar[(n=A+8|0)>>2],f=0|ar[A+12>>2],A=i=a}while(0);if((0|f)==(0|i))return 0|(a=-1);for(i=0;;){if(a=0|ar[A+(i<<2)>>2],(0|ar[a+88>>2])==(0|e)&&(0|ar[a+104>>2])>(0|r)&&0|ar[a+96>>2]){A=14;break}if((i=i+1|0)>>>0>=f-(0|ar[n>>2])>>2>>>0){i=-1,A=14;break}}return 14==(0|A)?0|i:0}function $o(A,e){e|=0;var r,i=0;if((0|(i=0|ar[(A|=0)+12>>2]))==(0|(r=A=0|ar[A+8>>2])))return 0|(e=-1);for(i=i-A>>2,A=0;;){if((0|ar[ar[r+(A<<2)>>2]>>2])==(0|e)){i=5;break}if(i>>>0<=(A=A+1|0)>>>0){A=-1,i=5;break}}return 5==(0|i)?0|A:0}function Aa(A){var e,r,i,f,n=0,t=0,o=0,a=0,c=0,l=0,u=0;if((0|(i=0|ar[(r=(A|=0)+20|0)>>2]))==(0|(n=0|ar[(f=A+24|0)>>2]))&&sr(36524,36554,147,36561),1<(l=n-i>>2)>>>0)for(t=(n=0)|ar[92+(0|ar[i>>2])>>2],o=1;;){if(n=(c=(0|(a=0|ar[92+(0|ar[i+(o<<2)>>2])>>2]))<(0|t))?o:n,l>>>0<=(o=o+1|0)>>>0){l=n;break}t=c?a:t}else l=0;n=0|ar[(c=A+36|0)>>2],u=(0|ar[A+40>>2])-n|0,a=0|ar[(o=A+48|0)>>2],(0|(0==(0|u)?0:(u<<8)-1|0))==((t=0|ar[(e=A+52|0)>>2])+a|0)&&(function(A){var e=0,r=0,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;if(ur=(s=ur)+32|0,c=s+4|0,a=s,1023<(r=0|ar[(e=16+(A|=0)|0)>>2])>>>0){ar[e>>2]=r+-1024,c=0|ar[(l=A+4|0)>>2],b=0|ar[c>>2],c=c+4|0,ar[l>>2]=c,o=0|ar[(u=A+8|0)>>2],t=0|ar[(a=A+12|0)>>2],e=t,n=o;do{if((0|o)==(0|t)){if(r=0|ar[A>>2],(i=r)>>>0<c>>>0){f=(e=c)+((i=(1+(e-i>>2)|0)/-2|0)<<2)|0,e=(r=(e=n-e|0)>>2)?(wb(0|f,0|c,0|e),0|ar[l>>2]):c,A=f+(r<<2)|0,ar[u>>2]=A,ar[l>>2]=e+(i<<2),e=A;break}if(1073741823<(e=0==(0|(e=e-i>>1))?1:e)>>>0&&(Zu(s=0|X(8),44519),ar[s>>2]=17660,I(0|s,4016,428)),f=0|hu(e<<2),t=i=(n=f)+(e>>>2<<2)|0,f=f+(e<<2)|0,(0|c)==(0|o))e=t;else{for(e=t,r=c;ar[i>>2]=ar[r>>2],e=i=e+4|0,(0|(r=r+4|0))!=(0|o););r=0|ar[A>>2]}ar[A>>2]=n,ar[l>>2]=t,ar[u>>2]=e,ar[a>>2]=f,r&&(vu(r),e=0|ar[u>>2])}else e=o}while(0);return ar[e>>2]=b,ar[u>>2]=4+(0|ar[u>>2]),ur=s}if(e=0|ar[(b=A+8|0)>>2],f=e-(0|ar[(u=A+4|0)>>2])|0,r=0|ar[(l=A+12|0)>>2],i=r-(0|ar[A>>2])|0,i>>>0<=f>>>0){for(e=0==(0|(e=i>>1))?1:e,ar[c+12>>2]=0,ar[c+16>>2]=A+12,1073741823<e>>>0&&(Zu(s=0|X(8),44519),ar[s>>2]=17660,I(0|s,4016,428)),i=0|hu(e<<2),ar[c>>2]=i,t=i+(f>>2<<2)|0,ar[(o=c+8|0)>>2]=t,ar[(n=c+4|0)>>2]=t,ar[(t=c+12|0)>>2]=i+(e<<2),f=0|hu(4096),ar[a>>2]=f,function(A,e){e|=0;var r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0;r=0|ar[(b=8+(A|=0)|0)>>2],u=0|ar[(i=A+12|0)>>2],t=u,a=r;do{if((0|r)==(0|u)){if(l=0|ar[(u=A+4|0)>>2],n=0|ar[A>>2],(f=n)>>>0<l>>>0){o=(n=l)+((t=(1+(n-f>>2)|0)/-2|0)<<2)|0,f=(n=(f=a-n|0)>>2)?(wb(0|o,0|l,0|f),0|ar[u>>2]):l,l=o+(n<<2)|0,ar[b>>2]=l,ar[u>>2]=f+(t<<2),f=l;break}if(1073741823<(f=0==(0|(f=t-f>>1))?1:f)>>>0&&(Zu(b=0|X(8),44519),ar[b>>2]=17660,I(0|b,4016,428)),o=0|hu(f<<2),c=t=(a=o)+(f>>>2<<2)|0,o=o+(f<<2)|0,(0|l)==(0|r))f=c;else{for(f=c,n=l;ar[t>>2]=ar[n>>2],f=t=f+4|0,(0|(n=n+4|0))!=(0|r););n=0|ar[A>>2]}ar[A>>2]=a,ar[u>>2]=c,ar[b>>2]=f,ar[i>>2]=o,n&&(vu(n),f=0|ar[b>>2])}else f=r}while(0);ar[f>>2]=ar[e>>2],ar[b>>2]=4+(0|ar[b>>2])}(c,a),f=0|ar[b>>2];e=0|ar[u>>2],(0|f)!=(0|e);)ea(c,a=f+-4|0),f=a;return r=e,i=0|ar[A>>2],ar[A>>2]=ar[c>>2],ar[c>>2]=i,ar[u>>2]=ar[n>>2],ar[n>>2]=r,e=0|ar[b>>2],ar[b>>2]=ar[o>>2],ar[o>>2]=e,A=0|ar[l>>2],ar[l>>2]=ar[t>>2],ar[t>>2]=A,(0|e)!=(0|f)&&(ar[o>>2]=e+(~((e+-4-r|0)>>>2)<<2)),0|i&&vu(i),ur=s}if((0|r)!=(0|e))return b=0|hu(4096),ar[c>>2]=b,function(A,e){e|=0;var r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0;r=0|ar[(b=8+(A|=0)|0)>>2],u=0|ar[(i=A+12|0)>>2],t=u,a=r;do{if((0|r)==(0|u)){if(l=0|ar[(u=A+4|0)>>2],n=0|ar[A>>2],(f=n)>>>0<l>>>0){o=(n=l)+((t=(1+(n-f>>2)|0)/-2|0)<<2)|0,f=(n=(f=a-n|0)>>2)?(wb(0|o,0|l,0|f),0|ar[u>>2]):l,l=o+(n<<2)|0,ar[b>>2]=l,ar[u>>2]=f+(t<<2),f=l;break}if(1073741823<(f=0==(0|(f=t-f>>1))?1:f)>>>0&&(Zu(b=0|X(8),44519),ar[b>>2]=17660,I(0|b,4016,428)),o=0|hu(f<<2),c=t=(a=o)+(f>>>2<<2)|0,o=o+(f<<2)|0,(0|l)==(0|r))f=c;else{for(f=c,n=l;ar[t>>2]=ar[n>>2],f=t=f+4|0,(0|(n=n+4|0))!=(0|r););n=0|ar[A>>2]}ar[A>>2]=a,ar[u>>2]=c,ar[b>>2]=f,ar[i>>2]=o,n&&(vu(n),f=0|ar[b>>2])}else f=r}while(0);ar[f>>2]=ar[e>>2],ar[b>>2]=4+(0|ar[b>>2])}(A,c),ur=s;a=0|hu(4096),ar[c>>2]=a,function(A,e){e|=0;var r,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;r=0|ar[(s=4+(A|=0)|0)>>2],b=0|ar[A>>2],n=b;do{if((0|r)==(0|b)){if(f=0|ar[(b=A+8|0)>>2],l=0|ar[(u=A+12|0)>>2],f>>>0<(i=l)>>>0){t=(i=(n=f)+((o=(1+(i-n>>2)|0)/2|0)<<2)|0)+(0-(u=(n=n-r|0)>>2)<<2)|0,u&&(wb(0|t,0|r,0|n),i=t,f=0|ar[b>>2]),ar[s>>2]=i,ar[b>>2]=f+(o<<2);break}if(1073741823<(n=0==(0|(n=i-n>>1))?1:n)>>>0&&(Zu(s=0|X(8),44519),ar[s>>2]=17660,I(0|s,4016,428)),a=0|hu(n<<2),l=i=(c=a)+((n+3|0)>>>2<<2)|0,a=a+(n<<2)|0,(0|r)==(0|f))n=l,f=r;else{for(o=i,n=l,t=r;ar[o>>2]=ar[t>>2],n=o=n+4|0,(0|(t=t+4|0))!=(0|f););f=0|ar[A>>2]}ar[A>>2]=c,ar[s>>2]=l,ar[b>>2]=n,ar[u>>2]=a,f&&(vu(f),i=0|ar[s>>2])}else i=r}while(0);ar[i+-4>>2]=ar[e>>2],ar[s>>2]=(0|ar[s>>2])-4}(A,c),a=0|ar[u>>2],c=0|ar[a>>2],a=a+4|0,ar[u>>2]=a,o=0|ar[b>>2],t=0|ar[l>>2],e=t,n=o;do{if((0|o)==(0|t)){if(r=0|ar[A>>2],(i=r)>>>0<a>>>0){f=(e=a)+((i=(1+(e-i>>2)|0)/-2|0)<<2)|0,e=(r=(e=n-e|0)>>2)?(wb(0|f,0|a,0|e),0|ar[u>>2]):a,A=f+(r<<2)|0,ar[b>>2]=A,ar[u>>2]=e+(i<<2),e=A;break}if(1073741823<(e=0==(0|(e=e-i>>1))?1:e)>>>0&&(Zu(s=0|X(8),44519),ar[s>>2]=17660,I(0|s,4016,428)),f=0|hu(e<<2),t=i=(n=f)+(e>>>2<<2)|0,f=f+(e<<2)|0,(0|a)==(0|o))e=t;else{for(e=t,r=a;ar[i>>2]=ar[r>>2],e=i=e+4|0,(0|(r=r+4|0))!=(0|o););r=0|ar[A>>2]}ar[A>>2]=n,ar[u>>2]=t,ar[b>>2]=e,ar[l>>2]=f,r&&(vu(r),e=0|ar[b>>2])}else e=o}while(0);ar[e>>2]=c,ar[b>>2]=4+(0|ar[b>>2]),ur=s}(A+32|0),a=0|ar[o>>2],t=0|ar[e>>2],n=0|ar[c>>2]),ar[(0|ar[n+((u=t+a|0)>>>10<<2)>>2])+((1023&u)<<2)>>2]=ar[i+(l<<2)>>2],ar[e>>2]=t+1,ar[(0|ar[r>>2])+(l<<2)>>2]=ar[(0|ar[f>>2])-4>>2],ar[f>>2]=(0|ar[f>>2])-4}function ea(A,e){e|=0;var r,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;r=0|ar[(s=(A|=0)+4|0)>>2],n=b=0|ar[A>>2];do{if((0|r)==(0|b)){if((f=0|ar[(b=A+8|0)>>2])>>>0<(i=l=0|ar[(u=A+12|0)>>2])>>>0){t=(i=(n=f)+((o=(1+(i-n>>2)|0)/2|0)<<2)|0)+(0-(u=(n=n-r|0)>>2)<<2)|0,u&&(wb(0|t,0|r,0|n),i=t,f=0|ar[b>>2]),ar[s>>2]=i,ar[b>>2]=f+(o<<2);break}if(1073741823<(n=0==(0|(n=i-n>>1))?1:n)>>>0&&(Zu(s=0|X(8),44519),ar[s>>2]=17660,I(0|s,4016,428)),l=i=(c=a=0|hu(n<<2))+((n+3|0)>>>2<<2)|0,a=a+(n<<2)|0,(0|r)==(0|f))n=l,f=r;else{for(o=i,n=l,t=r;ar[o>>2]=ar[t>>2],n=o=n+4|0,(0|(t=t+4|0))!=(0|f););f=0|ar[A>>2]}ar[A>>2]=c,ar[s>>2]=l,ar[b>>2]=n,ar[u>>2]=a,f&&(vu(f),i=0|ar[s>>2])}else i=r}while(0);ar[i+-4>>2]=ar[e>>2],ar[s>>2]=(0|ar[s>>2])-4}function ra(A){var e,r=0;if(r=(A|=0)+24|0,(0|ar[(e=A+20|0)>>2])==(0|ar[r>>2]))return(r=0)|r;for(;Aa(A),(0|ar[e>>2])!=(0|ar[r>>2]););return 0|(A=1)}function ia(A,e,r,i,f,n,t){e|=0,r|=0,i|=0,f|=0,n|=0,t|=0;var o,a,c,l,u,b=0,s=0,d=0,k=0,h=0,w=0,v=0;ur=(u=ur)+16|0,a=u,l=(A|=0)+8|0,s=0|ar[(c=A+12|0)>>2],o=k=0|ar[l>>2],b=s;A:do{if((0|s)==(0|k))d=-1,k=s;else{for(w=s-k>>2,d=0;h=0|ar[o+(d<<2)>>2],0!=(0|tr[h+100>>0])||0!=(0|ar[h+96>>2]);)if(w>>>0<=(d=d+1|0)>>>0){d=-1;break A}oa(h),b=0|ar[c>>2],k=0|ar[l>>2],s=b}}while(0);return(0|d)==((w=s-k>>2)+-1|0)||w>>>0<=(0|ar[A+4>>2])>>>0||(v=0|ar[b+-4>>2],0!=(0|tr[v+100>>0]))||0!=(0|ar[v+96>>2])?b=s:((s=0|ar[b+-4>>2])&&(aa(s),vu(s),b=0|ar[c>>2]),b=b+-4|0,ar[c>>2]=b),-1==(0|d)&&(d=b-(0|ar[l>>2])>>2,na(b=0|hu(10624)),ar[a>>2]=b,(s=0|ar[c>>2])>>>0<(0|ar[A+16>>2])>>>0?(ar[s>>2]=b,ar[c>>2]=4+(0|ar[c>>2])):function(A,e){e|=0;var r,i,f,n,t,o=0,a=0,c=0,l=0;f=4+(A|=0)|0,n=0|ar[A>>2],t=(0|ar[f>>2])-n|0,1073741823<(o=1+(i=t>>2)|0)>>>0&&zl();c=(0|ar[(l=A+8|0)>>2])-n|0,a=c>>1,a=c>>2>>>0<536870911?a>>>0<o>>>0?o:a:1073741823;do{if(a){if(!(1073741823<a>>>0)){c=0|hu(a<<2);break}Zu(l=0|X(8),44519),ar[l>>2]=17660,I(0|l,4016,428)}else c=0}while(0);ar[(r=c+(i<<2)|0)>>2]=ar[e>>2],o=r+(0-i<<2)|0,0<(0|t)&&hb(0|o,0|n,0|t);if(ar[A>>2]=o,ar[f>>2]=4+r,ar[l>>2]=c+(a<<2),!n)return;vu(n)}(l,a)),b=0|ar[(0|ar[l>>2])+(d<<2)>>2],(s=0|ar[e+476>>2])>>>0<4?(ta(b,0|ar[e+484>>2],0|ar[e+488>>2],s,e,1,r,0,i,f,n,t),tr[b+10516>>0]=0,ur=u,0|d):(sr(44456,36554,259,36599),0)}function fa(A){var e,r;e=(A|=0)+36|0,r=A+48|0,ar[(A=A+52|0)>>2]=(0|ar[A>>2])-1,A=1+(0|ar[r>>2])|0,(ar[r>>2]=A)>>>0<=2047||(vu(0|ar[ar[e>>2]>>2]),ar[e>>2]=4+(0|ar[e>>2]),ar[r>>2]=(0|ar[r>>2])-1024)}function na(A){var e,r,i=0;ar[(A|=0)+48>>2]=0,ar[A+52>>2]=0,ar[A+56>>2]=0,ar[A+700>>2]=0,ar[A+704>>2]=0,ar[A+708>>2]=0,ar[(i=A+736|0)>>2]=0,ar[i+4>>2]=0,ar[i+8>>2]=0,ar[i+12>>2]=0,ar[i+16>>2]=0,$a(A+764|(ar[i+20>>2]=0)),Ia(A+5932|0),tr[A+10518>>0]=0,tr[A+10519>>0]=0,vb(A+10340|(tr[A+10520>>0]=0),0,140),ar[A>>2]=-1,ar[A+104>>2]=0,ar[A+10332>>2]=0,ar[A+10336>>2]=0,ar[A+10512>>2]=0,ar[A+4>>2]=0,ar[A+60>>2]=0,ar[A+8>>2]=0,ar[A+64>>2]=0,ar[A+12>>2]=0,ar[A+68>>2]=0,ar[A+28>>2]=0,i=A+10480|(ar[A+24>>2]=0),ar[A+10524>>2]=0,ar[i>>2]=0,ar[i+4>>2]=0,ar[i+8>>2]=0,ar[i+12>>2]=0,ar[i+16>>2]=0,ar[i+20>>2]=0,tr[A+10516>>0]=2,ar[A+88>>2]=-1,ar[A+92>>2]=-1,ar[A+96>>2]=0,tr[A+100>>0]=0,ar[(i=A+10528|0)>>2]=0,ar[i+4>>2]=0,ar[i+8>>2]=0,ar[i+12>>2]=0,ar[i+16>>2]=0,e=A+10548|0,pA(0|(e|=0),0),r=A+10576|0,dA(0|(r|=0),0)}function ta(A,e,r,i,f,n,t,o,a,c,l,u){A|=0,e|=0,r|=0,i|=0,n|=0,t|=0,o|=0,a|=0,c|=0,l|=0,u|=0;var b,s,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0;switch(ur=(s=ur)+48|0,b=s,(f|=0)||sr(36749,36663,240,36753),hb(0|(h=A+764|0),0|f,4717),(0|h)!=(0|f)&&Ke(A+5484|0,0|ar[f+4720>>2],0|ar[f+4724>>2]),hb(A+5496|0,f+4732|0,436),oa(A),k=0|ar[14326],ar[14326]=k+1,ar[A>>2]=k,ar[A+104>>2]=2147483647,ar[A+10332>>2]=t,ar[A+10336>>2]=o,ar[A+20>>2]=i,ar[A+24>>2]=e,ar[A+28>>2]=r,ar[(k=A+32|0)>>2]=e,ar[(h=A+36|0)>>2]=r,ar[A+10488>>2]=l,ar[(l=A+10480|0)>>2]=a,ar[l+4>>2]=c,0|i){case 3:case 0:d=m=1;break;case 1:d=2,p=8;break;case 2:d=1,p=8;break;default:sr(44456,36663,276,36753)}switch(8==(0|p)&&(m=2),0|i){case 1:w=(e+1|0)/(ar[b>>2]=2)|0,ar[k>>2]=w,v=(r+1|0)/2|0,ar[h>>2]=v;break;case 2:ar[b>>2]=3,w=(e+1|0)/2|0,ar[k>>2]=w,v=r;break;case 3:ar[b>>2]=4,w=e,v=r;break;case 0:ar[b>>2]=1,ar[k>>2]=0,v=w=ar[h>>2]=0;break;default:sr(55739,36663,302,36753)}ar[b+4>>2]=e,ar[b+8>>2]=r,ar[b+12>>2]=16,i=0|ar[f+496>>2],a=0|ar[f+500>>2],k=0|ar[f+504>>2],h=0|ar[f+508>>2],e=e-(0|br(y=a+i|0,m))|0,ar[A+72>>2]=e,l=r-(0|br(c=h+k|0,d))|0,ar[A+76>>2]=l,ar[A+80>>2]=w-y,ar[A+84>>2]=v-c,c=0|br(i,m),ar[b+16>>2]=c,a=0|br(a,m),ar[b+20>>2]=a,a=0|br(k,d),ar[b+24>>2]=a,m=0|br(h,d),ar[b+28>>2]=m,ar[b+32>>2]=e,ar[b+36>>2]=l,tr[A+16>>0]=8<(0|ar[f+4996>>2])&1,l=8<(0|ar[f+5004>>2])&1,tr[A+17>>0]=l,tr[A+18>>0]=l,d=(l=0==(0|t))?0:0|ar[t+544>>2];do{if(o){if(d=0|ar[o+3060>>2],u){if(y=0|ar[o+3064>>2],l=A+10504|0,ar[A+10512>>2]=y){ar[l>>2]=0,ar[A+10508>>2]=0;break}Z=0|ar[(p=7736)>>2],p=0|ar[p+4>>2],ar[(g=l)>>2]=Z,ar[g+4>>2]=p,g=d,p=25;break}p=24}else p=l|1^u?24:(Z=0|ar[(p=t+536|0)>>2],p=0|ar[p+4>>2],ar[(g=A+10504|0)>>2]=Z,ar[g+4>>2]=p,g=d,25)}while(0);if(24==(0|p)&&(Z=0|ar[(y=7736)>>2],y=0|ar[y+4>>2],ar[(g=A+10504|0)>>2]=Z,ar[g+4>>2]=y,g=d,p=25),25==(0|p)&&0|Z&&(y=0==(0|Pb[7&Z](t,b,A,g)),t=(0|ar[A+4>>2])+c+(0|br(0|ar[A+40>>2],a))|0,ar[A+60>>2]=t,t=0|br(0|ar[A+44>>2],k),ar[A+64>>2]=(0|ar[A+8>>2])+i+t,ar[A+68>>2]=(0|ar[A+12>>2])+i+t,y))return ur=s,0|(y=7);do{if(n){i=0|ar[(e=f+5112|0)>>2],k=0|ar[(w=f+5116|0)>>2],h=0|ar[(v=f+5108|0)>>2],a=0|br(k,i),c=A+10404|0,d=0|ar[(l=A+10400|0)>>2];do{if((0|a)!=(0|ar[c>>2])){if(Bc(d),d=0|yc(a),ar[l>>2]=d){ar[c>>2]=a,p=32;break}r=ar[c>>2]=0;break}p=32}while(0);32==(0|p)&&(ar[A+10412>>2]=i,ar[A+10416>>2]=k,ar[A+10408>>2]=h,r=0!=(0|d)),h=0|ar[e>>2],k=0|ar[w>>2],i=0|ar[v>>2],a=0|br(k,h),c=A+10424|0,d=0|ar[(l=A+10420|0)>>2];do{if((0|a)!=(0|ar[c>>2])){if(Bc(d),d=0|yc(a),ar[l>>2]=d){ar[c>>2]=a,p=37;break}d=ar[c>>2]=0;break}p=37}while(0);37==(0|p)&&(ar[A+10432>>2]=h,ar[A+10436>>2]=k,ar[A+10428>>2]=i,d=0!=(0|d)),e=r&d,l=A+10360|0,i=0|ar[(r=f+5052|0)>>2],k=0|ar[(v=f+5060|0)>>2],h=0|ar[(w=f+5036|0)>>2],a=0|br(k,i),c=A+10364|0;do{if((0|a)!=(0|ar[c>>2])){if(Bc(0|ar[l>>2]),d=0|yc(3*a|0),ar[l>>2]=d){ar[c>>2]=a,p=43;break}d=ar[c>>2]=0;break}d=0|ar[l>>2],p=43}while(0);43==(0|p)&&(ar[A+10372>>2]=i,ar[A+10376>>2]=k,ar[A+10368>>2]=h,d=0!=(0|d)),h=e&d,i=(0|ar[w>>2])-2|0,k=ar[r>>2]<<i,i=ar[v>>2]<<i,l=A+10380|0,a=0|br(i,k),c=A+10384|0;do{if((0|a)!=(0|ar[c>>2])){if(Bc(0|ar[l>>2]),d=0|yc(12*a|0),ar[l>>2]=d){ar[c>>2]=a,p=49;break}d=ar[c>>2]=0;break}d=0|ar[l>>2],p=49}while(0);49==(0|p)&&(ar[A+10392>>2]=k,ar[A+10396>>2]=i,ar[A+10388>>2]=2,d=0!=(0|d)),e=h&d,i=0|ar[f+5088>>2],k=0|ar[f+5092>>2],h=0|ar[f+5100>>2],a=0|br(k,i),c=A+10444|0,d=0|ar[(l=A+10440|0)>>2];do{if((0|a)!=(0|ar[c>>2])){if(Bc(d),d=0|yc(a),ar[l>>2]=d){ar[c>>2]=a,p=54;break}d=ar[c>>2]=0;break}p=54}while(0);54==(0|p)&&(ar[A+10452>>2]=i,ar[A+10456>>2]=k,ar[A+10448>>2]=h,d=0!=(0|d)),h=e&d,i=(3+(0|ar[f+484>>2])|0)/4|0,k=(3+(0|ar[f+488>>2])|0)/4|0,a=0|br(k,i),c=A+10464|0,d=0|ar[(l=A+10460|0)>>2];do{if((0|a)!=(0|ar[c>>2])){if(Bc(d),d=0|yc(a),ar[l>>2]=d){ar[c>>2]=a,p=59;break}d=ar[c>>2]=0;break}p=59}while(0);if(59==(0|p)&&(ar[A+10472>>2]=i,ar[A+10476>>2]=k,ar[A+10468>>2]=2,d=0!=(0|d)),r=h&d,h=A+10340|0,(0|(d=0|ar[(e=A+10344|0)>>2]))==(0|ar[f+5072>>2])){if(r)break;return ur=s,0|(d=7)}if(a=0|ar[(w=A+10524|0)>>2]){if(0|(d=0|ar[(l=a+-4|0)>>2]))for(d=a+(80*d|0)|0;Jn(d=d+-80|0),(0|d)!=(0|a););mu(l),d=0|ar[e>>2]}i=0|ar[f+5056>>2],k=0|ar[f+5064>>2],c=0|ar[f+5040>>2],l=0|br(k,i);do{if((0|l)!=(0|d)){if(Bc(0|ar[h>>2]),d=0|yc(24*l|0),ar[h>>2]=d){ar[e>>2]=l,a=d,p=71;break}l=d=ar[e>>2]=0;break}a=0|ar[h>>2],l=d,p=71}while(0);if(71==(0|p)&&(ar[A+10352>>2]=i,ar[A+10356>>2]=k,ar[A+10348>>2]=c,d=0!=(0|a)),a=r&d,c=0|wu(53687091<l>>>0|4294967291<(c=80*l|0)>>>0?-1:c+4|0),ar[c>>2]=l,c=c+4|0,0|l)for(d=c+(80*l|0)|0,l=c;Dn(l),(0|(l=l+80|0))!=(0|d););if(ar[w>>2]=c,!a)return ur=s,0|(y=7)}}while(0);return ur=s,(y=0)|y}function oa(A){var e,r=0,i=0,f=0,n=0,t=0,o=0;if(0|ar[(f=(A|=0)+4|0)>>2]&&((r=0|ar[A+10512>>2])?(o=0|ar[A+10336>>2],ns[127&r](o,A,0|ar[o+3060>>2])):(i=(r=0|ar[A+10332>>2])?0|ar[r+544>>2]:0,ns[127&ar[A+10508>>2]](r,A,i)),ar[f>>2]=0,ar[A+60>>2]=0,ar[A+8>>2]=0,ar[A+64>>2]=0,ar[A+12>>2]=0,ar[A+68>>2]=0),e=A+48|0,(0|(r=i=0|ar[(o=A+52|0)>>2]))!=(0|(f=A=0|ar[e>>2]))){for(t=0;(n=0|ar[f+(t<<2)>>2])&&(0|(r=0|ar[n+1344>>2])&&((0|(f=0|ar[(i=n+1348|0)>>2]))!=(0|r)&&(ar[i>>2]=f+(~((f+-4-r|0)>>>2)<<2)),vu(r)),kt(n+1332|0),0|(r=0|ar[n+776>>2])&&((0|(f=0|ar[(i=n+780|0)>>2]))!=(0|r)&&(ar[i>>2]=f+(~((f+-4-r|0)>>>2)<<2)),vu(r)),vu(n),r=0|ar[o>>2],A=0|ar[e>>2],i=r),(t=t+1|0)>>>0<i-(f=A)>>2>>>0;);i=A}(0|r)!=(0|f)&&(ar[o>>2]=r+(~((r+-4-i|0)>>>2)<<2))}function aa(A){var e,r,i,f=0,n=0,t=0,o=0;if(oa(A|=0),0|(n=0|ar[A+10524>>2])){if(0|(f=0|ar[(t=n+-4|0)>>2]))for(f=n+(80*f|0)|0;Jn(f=f+-80|0),(0|f)!=(0|n););mu(t)}if(r=A+10576|0,sA(0|(r|=0)),i=A+10548|0,ZA(0|(i|=0)),Bc(0|ar[A+10460>>2]),Bc(0|ar[A+10440>>2]),Bc(0|ar[A+10420>>2]),Bc(0|ar[A+10400>>2]),Bc(0|ar[A+10380>>2]),Bc(0|ar[A+10360>>2]),Bc(0|ar[A+10340>>2]),Ga(A+5932|0),Ac(A+764|0),0|(f=0|ar[A+748>>2])&&((0|ar[(n=A+752|0)>>2])!=(0|f)&&(ar[n>>2]=f),vu(f)),0|(f=0|ar[A+736>>2])&&((0|(t=0|ar[(n=A+740|0)>>2]))!=(0|f)&&(ar[n>>2]=t+(~((t+-2-f|0)>>>1)<<1)),vu(f)),0|(f=0|ar[(e=A+700|0)>>2])){if((0|(n=0|ar[(o=A+704|0)>>2]))!=(0|f)){for(;n=n+-12|0,ar[o>>2]=n,(t=0|ar[n>>2])&&(vu(t),n=0|ar[o>>2]),(0|n)!=(0|f););f=0|ar[e>>2]}vu(f)}(t=0|ar[A+48>>2])&&((0|(n=0|ar[(f=A+52|0)>>2]))!=(0|t)&&(ar[f>>2]=n+(~((n+-4-t|0)>>>2)<<2)),vu(t))}function ca(A,e){e|=0;var r,i;Yn(r=(A|=0)+10548|0),ar[(i=A+10528|0)>>2]=(0|ar[i>>2])+e,ar[(A=A+10544|0)>>2]=(0|ar[A>>2])+e,Qn(r)}function la(A,e){e|=0;var r;Yn(e=(A|=0)+10548|0),ar[(r=A+10528|0)>>2]=(0|ar[r>>2])-1,ar[(A=A+10532|0)>>2]=1+(0|ar[A>>2]),Qn(e)}function ua(A,e){e|=0;var r,i,f,n=0;(Yn(e=(A|=0)+10548|0),i=0|ar[(n=A+10532|0)>>2],ar[n>>2]=i-1,r=1+(0|ar[(n=A+10540|0)>>2])|0,ar[n>>2]=r,(0|i)<=0&&sr(36809,36663,642,36830),(0|r)==(0|ar[A+10544>>2]))?(f=A+10576|0,mb(f|=0),Qn(e)):Qn(e)}function ba(A,e,r,i,f){r|=0,i|=0,f|=0,function(A,e,r,i){A|=0,r|=0,i|=0;var f,n;if(!(e|=0))return;if((0|function(A){return 0|ar[(A|=0)>>2]}(r=(0|ar[A+10524>>2])+(80*r|0)|0))>=(0|i))return;Yn(f=A+10548|0),ar[(n=A+10532|0)>>2]=(0|ar[n>>2])-1,ar[(A=A+10536|0)>>2]=1+(0|ar[A>>2]),Qn(f),ar[(e=e+4|0)>>2]=2,Mn(r,i),ar[e>>2]=1,Yn(f),ar[A>>2]=(0|ar[A>>2])-1,ar[n>>2]=1+(0|ar[n>>2]),Qn(f)}(A|=0,e|=0,(0|br(0|ar[A+5820>>2],i))+r|0,f)}function sa(A){var e,r,i;if(Yn(e=(A|=0)+10548|0),i=A+10544|0,(0|ar[(r=A+10540|0)>>2])!=(0|ar[i>>2])){for(A=A+10576|0;f=A,n=e,hA(0|(f|=0),0|(n|=0)),(0|ar[r>>2])!=(0|ar[i>>2]););var f,n;Qn(e)}else Qn(e)}function da(A,e,r,i,f){A|=0,e|=0,r|=0;var n=0,t=0,o=0,a=0;return((f|=0)|(i|=0)|0)<0||(0|ar[A+1248>>2])<=(0|i)||(0|ar[A+1252>>2])<=(0|f)?(A=0)|A:(t=0|ar[A+5864>>2],a=0|ar[A+5852>>2],n=(0|br(f>>t,a))+(i>>t)|0,t=(o=0|ar[A+10320>>2])+((0|br(r>>t,a))+(e>>t)<<2)|0,(0|ar[o+(n<<2)>>2])>(0|ar[t>>2])?(a=0)|a:(t=e>>(a=0|ar[A+5804>>2]),n=r>>a,r=i>>a,e=f>>a,a=0|ar[A+10352>>2],o=(0|br(a,n))+t|0,a=(f=0|ar[A+10340>>2])+(24*((0|br(a,e))+r|0)|0)|0,(0|or[f+(24*o|0)>>1])!=(0|or[a>>1])?(a=0)|a:(a=0|ar[A+5820>>2],o=(0|br(a,n))+t|0,a=(A=0|ar[A+10308>>2])+((0|br(a,e))+r<<2)|0,0|(a=(0|ar[A+(o<<2)>>2])==(0|ar[a>>2])))))}function ka(A,e,r,i,f,n,t,o,a,c,l){if(A|=0,f|=0,n|=0,t|=0,o|=0,a|=0,(0|(l|=0))<((i|=0)+(r|=0)|0)&(1^((i+(e|=0)|0)<=(0|(c|=0))|(0|c)<(0|e)|(0|l)<(0|r)))){if((t<<1|0)==(0|i)&&!((t+e|0)<=(0|c)|1!=(0|a)|(o<<1|0)!=(0|i)|(0|l)<(o+r|0)))return 0}else{if((l|c|0)<0)return 0;if((0|ar[A+1248>>2])<=(0|c))return 0;if((0|ar[A+1252>>2])<=(0|l))return 0;if(a=0|ar[A+5864>>2],i=0|ar[A+5852>>2],o=(0|br(l>>a,i))+(c>>a)|0,a=(t=0|ar[A+10320>>2])+((0|br(n>>a,i))+(f>>a)<<2)|0,(0|ar[t+(o<<2)>>2])>(0|ar[a>>2]))return 0;if(f>>=i=0|ar[A+5804>>2],e=n>>i,r=c>>i,i=l>>i,n=0|ar[A+10352>>2],a=(0|br(n,e))+f|0,n=(o=0|ar[A+10340>>2])+(24*((0|br(n,i))+r|0)|0)|0,(0|or[o+(24*a|0)>>1])!=(0|or[n>>1]))return 0;if(n=0|ar[A+5820>>2],a=(0|br(n,e))+f|0,n=(o=0|ar[A+10308>>2])+((0|br(n,i))+r<<2)|0,(0|ar[o+(a<<2)>>2])!=(0|ar[n>>2]))return 0}return i=c>>(e=0|ar[A+10368>>2]),e=l>>e,(0|i)<=-1&&sr(48482,36846,118,48539),(0|(r=0|ar[A+10372>>2]))<=(0|i)&&sr(48482,36846,118,48539),(0|e)<=-1&&sr(48543,36846,119,48539),(0|e)<(0|ar[A+10376>>2])?(A=(0|ar[A+10360>>2])+(3*((0|br(r,e))+i|0)|0)|0,0!=(768&(cr[A>>0]|cr[A+1>>0]<<8))|0):(sr(48543,36846,119,48539),0)}function ha(A){return((A|=0)+-19&255)<2|0}function wa(A){return((A|=0)+-16&255)<3|0}function va(A){return(1|(A|=0))<<24>>24==9|0}function ma(A){return(-8&(A|=0))<<24>>24==16|0}function ga(A,e){e|=0;var r,i,f,n,t,o=0,a=0,c=0,l=0;f=(A|=0)+4|0,n=0|ar[A>>2],1073741823<(o=1+(i=(t=(0|ar[f>>2])-n|0)>>2)|0)>>>0&&zl(),a=(c=(0|ar[(l=A+8|0)>>2])-n|0)>>1,a=c>>2>>>0<536870911?a>>>0<o>>>0?o:a:1073741823;do{if(a){if(!(1073741823<a>>>0)){c=0|hu(a<<2);break}Zu(l=0|X(8),44519),ar[l>>2]=17660,I(0|l,4016,428)}else c=0}while(0);ar[(r=c+(i<<2)|0)>>2]=ar[e>>2],o=r+(0-i<<2)|0,0<(0|t)&&hb(0|o,0|n,0|t),ar[A>>2]=o,ar[f>>2]=4+r,ar[l>>2]=c+(a<<2),n&&vu(n)}function Za(A,e,r){e|=0,r|=0;var i,f=0;for(i=f=0|ar[(A|=0)+32>>2],A=(0|ar[A+36>>2])-f>>2;;){if(f=A+-1|0,(0|A)<=0){A=0,f=4;break}if(!(((0|ar[i+(f<<2)>>2])-r|0)>(0|e))){f=4;break}A=f}return 4==(0|f)?0|A:0}function pa(A,e){e|=0;var r,i,f,n,t,o=0,a=0,c=0,l=0;f=(A|=0)+4|0,n=0|ar[A>>2],1073741823<(o=1+(i=(t=(0|ar[f>>2])-n|0)>>2)|0)>>>0&&zl(),a=(c=(0|ar[(l=A+8|0)>>2])-n|0)>>1,a=c>>2>>>0<536870911?a>>>0<o>>>0?o:a:1073741823;do{if(a){if(!(1073741823<a>>>0)){c=0|hu(a<<2);break}Zu(l=0|X(8),44519),ar[l>>2]=17660,I(0|l,4016,428)}else c=0}while(0);ar[(r=c+(i<<2)|0)>>2]=ar[e>>2],o=r+(0-i<<2)|0,0<(0|t)&&hb(0|o,0|n,0|t),ar[A>>2]=o,ar[f>>2]=4+r,ar[l>>2]=c+(a<<2),n&&vu(n)}function ya(A){var e,r,i,f,n=0,t=0,o=0;return(n=0|ar[(e=(A|=0)+32|0)>>2])?(f=0|ar[(i=A+16|0)>>2],o=0|ar[(t=A+28|0)>>2],r=0|ar[(0|ar[f+(o>>>10<<2)>>2])+((1023&o)<<2)>>2],ar[e>>2]=n+-1,n=o+1|0,2047<(ar[t>>2]=n)>>>0&&(vu(0|ar[f>>2]),ar[i>>2]=4+(0|ar[i>>2]),ar[t>>2]=(0|ar[t>>2])-1024),ar[(o=A+36|0)>>2]=(0|ar[o>>2])-(0|ar[24+r>>2]),0|(o=r)):(t=0)|t}function Ba(A,e){A|=0,e|=0;var r,i,f,n,t=0,o=0;if(ur=(n=ur)+16|0,o=ar[(t=n)>>2]=e){if(r=A+40|0,(f=0|ar[(i=A+44|0)>>2])-(0|ar[r>>2])>>2>>>0<16)return(0|f)==(0|ar[A+48>>2])?pa(r,t):(ar[f>>2]=o,ar[i>>2]=4+(0|ar[i>>2])),void(ur=n);Bc(0|ar[e+20>>2]),0|(A=0|ar[e+32>>2])&&((0|(o=0|ar[(t=e+36|0)>>2]))!=(0|A)&&(ar[t>>2]=o+(~((o+-4-A|0)>>>2)<<2)),vu(A)),vu(e),ur=n}else ur=n}function Ea(A){var e=0,r=0,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;if(ur=(s=ur)+32|0,c=s+4|0,a=s,1023<(r=0|ar[(e=(A|=0)+16|0)>>2])>>>0){ar[e>>2]=r+-1024,c=0|ar[(l=A+4|0)>>2],b=0|ar[c>>2],c=c+4|0,ar[l>>2]=c,o=0|ar[(u=A+8|0)>>2],e=t=0|ar[(a=A+12|0)>>2],n=o;do{if((0|o)==(0|t)){if((i=r=0|ar[A>>2])>>>0<c>>>0){f=(e=c)+((i=(1+(e-i>>2)|0)/-2|0)<<2)|0,e=(r=(e=n-e|0)>>2)?(wb(0|f,0|c,0|e),0|ar[l>>2]):c,A=f+(r<<2)|0,ar[u>>2]=A,ar[l>>2]=e+(i<<2),e=A;break}if(1073741823<(e=0==(0|(e=e-i>>1))?1:e)>>>0&&(Zu(s=0|X(8),44519),ar[s>>2]=17660,I(0|s,4016,428)),t=i=(n=f=0|hu(e<<2))+(e>>>2<<2)|0,f=f+(e<<2)|0,(0|c)==(0|o))e=t;else{for(e=t,r=c;ar[i>>2]=ar[r>>2],e=i=e+4|0,(0|(r=r+4|0))!=(0|o););r=0|ar[A>>2]}ar[A>>2]=n,ar[l>>2]=t,ar[u>>2]=e,ar[a>>2]=f,r&&(vu(r),e=0|ar[u>>2])}else e=o}while(0);return ar[e>>2]=b,ar[u>>2]=4+(0|ar[u>>2]),void(ur=s)}if(f=(e=0|ar[(b=A+8|0)>>2])-(0|ar[(u=A+4|0)>>2])|0,(i=(r=0|ar[(l=A+12|0)>>2])-(0|ar[A>>2])|0)>>>0<=f>>>0){for(e=0==(0|(e=i>>1))?1:e,ar[c+12>>2]=0,ar[c+16>>2]=A+12,1073741823<e>>>0&&(Zu(s=0|X(8),44519),ar[s>>2]=17660,I(0|s,4016,428)),i=0|hu(e<<2),t=(ar[c>>2]=i)+(f>>2<<2)|0,ar[(o=c+8|0)>>2]=t,ar[(n=c+4|0)>>2]=t,ar[(t=c+12|0)>>2]=i+(e<<2),f=0|hu(4096),ar[a>>2]=f,function(A,e){e|=0;var r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0;r=0|ar[(b=8+(A|=0)|0)>>2],u=0|ar[(i=A+12|0)>>2],t=u,a=r;do{if((0|r)==(0|u)){if(l=0|ar[(u=A+4|0)>>2],n=0|ar[A>>2],(f=n)>>>0<l>>>0){o=(n=l)+((t=(1+(n-f>>2)|0)/-2|0)<<2)|0,f=(n=(f=a-n|0)>>2)?(wb(0|o,0|l,0|f),0|ar[u>>2]):l,l=o+(n<<2)|0,ar[b>>2]=l,ar[u>>2]=f+(t<<2),f=l;break}if(1073741823<(f=0==(0|(f=t-f>>1))?1:f)>>>0&&(Zu(b=0|X(8),44519),ar[b>>2]=17660,I(0|b,4016,428)),o=0|hu(f<<2),c=t=(a=o)+(f>>>2<<2)|0,o=o+(f<<2)|0,(0|l)==(0|r))f=c;else{for(f=c,n=l;ar[t>>2]=ar[n>>2],f=t=f+4|0,(0|(n=n+4|0))!=(0|r););n=0|ar[A>>2]}ar[A>>2]=a,ar[u>>2]=c,ar[b>>2]=f,ar[i>>2]=o,n&&(vu(n),f=0|ar[b>>2])}else f=r}while(0);ar[f>>2]=ar[e>>2],ar[b>>2]=4+(0|ar[b>>2])}(c,a),f=0|ar[b>>2];(0|f)!=(0|(e=0|ar[u>>2]));)Xa(c,a=f+-4|0),f=a;return r=e,i=0|ar[A>>2],ar[A>>2]=ar[c>>2],ar[c>>2]=i,ar[u>>2]=ar[n>>2],ar[n>>2]=r,e=0|ar[b>>2],ar[b>>2]=ar[o>>2],ar[o>>2]=e,A=0|ar[l>>2],ar[l>>2]=ar[t>>2],ar[t>>2]=A,(0|e)!=(0|f)&&(ar[o>>2]=e+(~((e+-4-r|0)>>>2)<<2)),0|i&&vu(i),void(ur=s)}if((0|r)!=(0|e))return b=0|hu(4096),ar[c>>2]=b,function(A,e){e|=0;var r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0;r=0|ar[(b=8+(A|=0)|0)>>2],u=0|ar[(i=A+12|0)>>2],t=u,a=r;do{if((0|r)==(0|u)){if(l=0|ar[(u=A+4|0)>>2],n=0|ar[A>>2],(f=n)>>>0<l>>>0){o=(n=l)+((t=(1+(n-f>>2)|0)/-2|0)<<2)|0,f=(n=(f=a-n|0)>>2)?(wb(0|o,0|l,0|f),0|ar[u>>2]):l,l=o+(n<<2)|0,ar[b>>2]=l,ar[u>>2]=f+(t<<2),f=l;break}if(1073741823<(f=0==(0|(f=t-f>>1))?1:f)>>>0&&(Zu(b=0|X(8),44519),ar[b>>2]=17660,I(0|b,4016,428)),o=0|hu(f<<2),c=t=(a=o)+(f>>>2<<2)|0,o=o+(f<<2)|0,(0|l)==(0|r))f=c;else{for(f=c,n=l;ar[t>>2]=ar[n>>2],f=t=f+4|0,(0|(n=n+4|0))!=(0|r););n=0|ar[A>>2]}ar[A>>2]=a,ar[u>>2]=c,ar[b>>2]=f,ar[i>>2]=o,n&&(vu(n),f=0|ar[b>>2])}else f=r}while(0);ar[f>>2]=ar[e>>2],ar[b>>2]=4+(0|ar[b>>2])}(A,c),void(ur=s);a=0|hu(4096),ar[c>>2]=a,function(A,e){e|=0;var r,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;r=0|ar[(s=4+(A|=0)|0)>>2],b=0|ar[A>>2],n=b;do{if((0|r)==(0|b)){if(f=0|ar[(b=A+8|0)>>2],l=0|ar[(u=A+12|0)>>2],f>>>0<(i=l)>>>0){t=(i=(n=f)+((o=(1+(i-n>>2)|0)/2|0)<<2)|0)+(0-(u=(n=n-r|0)>>2)<<2)|0,u&&(wb(0|t,0|r,0|n),i=t,f=0|ar[b>>2]),ar[s>>2]=i,ar[b>>2]=f+(o<<2);break}if(1073741823<(n=0==(0|(n=i-n>>1))?1:n)>>>0&&(Zu(s=0|X(8),44519),ar[s>>2]=17660,I(0|s,4016,428)),a=0|hu(n<<2),l=i=(c=a)+((n+3|0)>>>2<<2)|0,a=a+(n<<2)|0,(0|r)==(0|f))n=l,f=r;else{for(o=i,n=l,t=r;ar[o>>2]=ar[t>>2],n=o=n+4|0,(0|(t=t+4|0))!=(0|f););f=0|ar[A>>2]}ar[A>>2]=c,ar[s>>2]=l,ar[b>>2]=n,ar[u>>2]=a,f&&(vu(f),i=0|ar[s>>2])}else i=r}while(0);ar[i+-4>>2]=ar[e>>2],ar[s>>2]=(0|ar[s>>2])-4}(A,c),a=0|ar[u>>2],c=0|ar[a>>2],a=a+4|0,ar[u>>2]=a,o=0|ar[b>>2],e=t=0|ar[l>>2],n=o;do{if((0|o)==(0|t)){if((i=r=0|ar[A>>2])>>>0<a>>>0){f=(e=a)+((i=(1+(e-i>>2)|0)/-2|0)<<2)|0,e=(r=(e=n-e|0)>>2)?(wb(0|f,0|a,0|e),0|ar[u>>2]):a,A=f+(r<<2)|0,ar[b>>2]=A,ar[u>>2]=e+(i<<2),e=A;break}if(1073741823<(e=0==(0|(e=e-i>>1))?1:e)>>>0&&(Zu(s=0|X(8),44519),ar[s>>2]=17660,I(0|s,4016,428)),t=i=(n=f=0|hu(e<<2))+(e>>>2<<2)|0,f=f+(e<<2)|0,(0|a)==(0|o))e=t;else{for(e=t,r=a;ar[i>>2]=ar[r>>2],e=i=e+4|0,(0|(r=r+4|0))!=(0|o););r=0|ar[A>>2]}ar[A>>2]=n,ar[u>>2]=t,ar[b>>2]=e,ar[l>>2]=f,r&&(vu(r),e=0|ar[b>>2])}else e=o}while(0);ar[e>>2]=c,ar[b>>2]=4+(0|ar[b>>2]),ur=s}function Xa(A,e){e|=0;var r,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;r=0|ar[(s=(A|=0)+4|0)>>2],n=b=0|ar[A>>2];do{if((0|r)==(0|b)){if((f=0|ar[(b=A+8|0)>>2])>>>0<(i=l=0|ar[(u=A+12|0)>>2])>>>0){t=(i=(n=f)+((o=(1+(i-n>>2)|0)/2|0)<<2)|0)+(0-(u=(n=n-r|0)>>2)<<2)|0,u&&(wb(0|t,0|r,0|n),i=t,f=0|ar[b>>2]),ar[s>>2]=i,ar[b>>2]=f+(o<<2);break}if(1073741823<(n=0==(0|(n=i-n>>1))?1:n)>>>0&&(Zu(s=0|X(8),44519),ar[s>>2]=17660,I(0|s,4016,428)),l=i=(c=a=0|hu(n<<2))+((n+3|0)>>>2<<2)|0,a=a+(n<<2)|0,(0|r)==(0|f))n=l,f=r;else{for(o=i,n=l,t=r;ar[o>>2]=ar[t>>2],n=o=n+4|0,(0|(t=t+4|0))!=(0|f););f=0|ar[A>>2]}ar[A>>2]=c,ar[s>>2]=l,ar[b>>2]=n,ar[u>>2]=a,f&&(vu(f),i=0|ar[s>>2])}else i=r}while(0);ar[i+-4>>2]=ar[e>>2],ar[s>>2]=(0|ar[s>>2])-4}function Wa(A){var e,r,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0;if(!(r=0|ar[(e=(A|=0)+8|0)>>2]))return(l=0)|l;if(6==(0|(i=0|ar[(l=A+4|0)>>2]))){if(a=(i=0|ar[(c=24+r|0)>>2])+1|0,(0|ar[(t=28+r|0)>>2])>(0|i))f=0|ar[20+r>>2];else{if(!(f=0|yc(a)))return 0|(l=7);(n=0|ar[(o=20+r|0)>>2])&&(hb(0|f,0|n,0|i),Bc(n),i=0|ar[c>>2]),ar[o>>2]=f,ar[t>>2]=a}tr[f+i>>0]=0,ar[c>>2]=1+(0|ar[c>>2]),i=0|ar[l>>2]}if(7==(0|i)){if(t=(i=0|ar[(c=24+r|0)>>2])+2|0,(0|ar[(o=28+r|0)>>2])<(0|t)){if(!(f=0|yc(t)))return 0|(l=7);(n=0|ar[(a=20+r|0)>>2])&&(hb(0|f,0|n,0|i),Bc(n),i=0|ar[c>>2]),ar[a>>2]=f,ar[o>>2]=t}else f=0|ar[20+r>>2];tr[(i=f+i|0)>>0]=0,tr[i+1>>0]=0,ar[c>>2]=2+(0|ar[c>>2]),i=0|ar[l>>2]}return 4<(0|i)&&(i=0|ar[(o=A+16|0)>>2],c=(0|ar[A+20>>2])-i|0,n=0|ar[(f=A+28|0)>>2],(0|(0==(0|c)?0:(c<<8)-1|0))==((t=0|ar[(a=A+32|0)>>2])+n|0)?(Ea(A+12|0),n=0|ar[f>>2],f=0|ar[a>>2],i=0|ar[o>>2]):f=t,ar[(0|ar[i+((c=f+n|0)>>>10<<2)>>2])+((1023&c)<<2)>>2]=r,ar[a>>2]=f+1,ar[(A=A+36|0)>>2]=(0|ar[A>>2])+(0|ar[24+r>>2]),ar[e>>2]=0),(l=ar[l>>2]=0)|l}function Ia(A){var e,r=0;for(tr[(A|=0)+4138>>0]=2,r=A+4139|0,tr[A+4155>>0]=0,tr[A+4156>>0]=0,tr[r>>0]=0,tr[r+1>>0]=0,tr[r+2>>0]=0,e=(r=A+4340|(tr[r+3>>0]=0))+60|0;(0|(r=r+4|(ar[r>>2]=0)))<(0|e););Ca(A,0)}function Ca(A,e){e|=0;var r=0,i=0;if(ar[(A|=0)>>2]=0,or[A+4>>1]=0,tr[A+6>>0]=1,tr[A+7>>0]=1,ar[A+8>>2]=27,tr[A+12>>0]=0,tr[A+13>>0]=0,tr[A+14>>0]=0,ar[(e=A+16|0)>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,or[e+16>>1]=0,tr[e+18>>0]=0,ar[A+36>>2]=1,ar[A+40>>2]=1,tr[A+44>>0]=1,tr[A+45>>0]=1,tr[A+46>>0]=1,vb(A+4172|0,0,168),e=0|ar[A+4340>>2],(0|(i=0|ar[(r=A+4344|0)>>2]))!=(0|e)&&(ar[r>>2]=i+(~((i+-4-e|0)>>>2)<<2)),e=0|ar[A+4352>>2],(0|(i=0|ar[(r=A+4356|0)>>2]))!=(0|e)&&(ar[r>>2]=i+(~((i+-4-e|0)>>>2)<<2)),e=0|ar[A+4364>>2],(0|(i=0|ar[(r=A+4368|0)>>2]))!=(0|e)&&(ar[r>>2]=i+(~((i+-4-e|0)>>>2)<<2)),e=0|ar[A+4376>>2],(0|(i=0|ar[(r=A+4380|0)>>2]))!=(0|e)&&(ar[r>>2]=i+(~((i+-4-e|0)>>>2)<<2)),e=0|ar[A+4388>>2],(0|(i=0|ar[(r=A+4392|0)>>2]))==(0|e))return ar[(i=A+4160|0)>>2]=0,tr[(i=A+47|0)>>0]=0,tr[(i=A+48|0)>>0]=0,tr[(i=A+49|0)>>0]=0,ar[(i=A+52|0)>>2]=0,ar[(i=A+56|0)>>2]=0,tr[(i=A+60|0)>>0]=0,tr[(i=A+4125|0)>>0]=0,ar[(i=A+4128|0)>>2]=2,ar[(A=A+4132|0)>>2]=0,void(or[A+4>>1]=0);ar[r>>2]=i+(~((i+-4-e|0)>>>2)<<2),ar[(i=A+4160|0)>>2]=0,tr[(i=A+47|0)>>0]=0,tr[(i=A+48|0)>>0]=0,tr[(i=A+49|0)>>0]=0,ar[(i=A+52|0)>>2]=0,ar[(i=A+56|0)>>2]=0,tr[(i=A+60|0)>>0]=0,tr[(i=A+4125|0)>>0]=0,ar[(i=A+4128|0)>>2]=2,ar[(A=A+4132|0)>>2]=0,or[A+4>>1]=0}function Ga(A){var e=0,r=0,i=0;0|(e=0|ar[(A|=0)+4388>>2])&&((0|(i=0|ar[(r=A+4392|0)>>2]))!=(0|e)&&(ar[r>>2]=i+(~((i+-4-e|0)>>>2)<<2)),vu(e)),0|(e=0|ar[A+4376>>2])&&((0|(i=0|ar[(r=A+4380|0)>>2]))!=(0|e)&&(ar[r>>2]=i+(~((i+-4-e|0)>>>2)<<2)),vu(e)),0|(e=0|ar[A+4364>>2])&&((0|(i=0|ar[(r=A+4368|0)>>2]))!=(0|e)&&(ar[r>>2]=i+(~((i+-4-e|0)>>>2)<<2)),vu(e)),0|(e=0|ar[A+4352>>2])&&((0|(i=0|ar[(r=A+4356|0)>>2]))!=(0|e)&&(ar[r>>2]=i+(~((i+-4-e|0)>>>2)<<2)),vu(e)),(i=0|ar[A+4340>>2])&&((0|(r=0|ar[(e=A+4344|0)>>2]))!=(0|i)&&(ar[e>>2]=r+(~((r+-4-i|0)>>>2)<<2)),vu(i))}function Va(A,e){var r,i,f,n,t,o=0,a=0,c=0,l=0;if((e|=0)>>>0<=(a=0|ar[(t=(A|=0)+8|0)>>2])-(o=0|ar[(l=A+4|0)>>2])>>2>>>0)return vb(0|o,0,e<<2|0),void(ar[l>>2]=o+(e<<2));1073741823<(o=(i=(f=o-(n=0|ar[A>>2])|0)>>2)+e|0)>>>0&&zl(),a=(c=a-n|0)>>1,a=c>>2>>>0<536870911?a>>>0<o>>>0?o:a:1073741823;do{if(a){if(!(1073741823<a>>>0)){c=0|hu(a<<2);break}Zu(l=0|X(8),44519),ar[l>>2]=17660,I(0|l,4016,428)}else c=0}while(0);vb(0|(r=c+(i<<2)|0),0,e<<2|0),o=r+(0-i<<2)|0,0<(0|f)&&hb(0|o,0|n,0|f),ar[A>>2]=o,ar[l>>2]=r+(e<<2),ar[t>>2]=c+(a<<2),n&&vu(n)}function Fa(A,e,r){e|=0,r|=0;var i,f=0;if(!(0|tr[(A|=0)+34>>0]))return 0==(r|e|0)|0;i=0|ar[A+36>>2];A:do{if(0<(0|i)){for(f=0;(0|ar[A+4252+(f<<2)>>2])!=(0|e);)if((0|i)<=(0|(f=f+1|0))){e=f=0;break A}if(0<(0|(e=0|ar[A+40>>2])))for(f=0;;){if((0|ar[A+4296+(f<<2)>>2])==(0|r)){e=f=1;break A}if((0|e)<=(0|(f=f+1|0))){f=1,e=0;break}}else f=1,e=0}else e=f=0}while(0);return e&f|0}function Ra(A,e,r,i,f,n,t,o,a,c,l){e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0,l|=0;var u,b,s,d,k,h,w,v,m,g,Z,p,y,B,E,X,W,I,C,G,V,F,R,N,_,Y,Q,D,J,M,T,U,S=0,O=0,z=0,j=0,H=0,x=0,P=0,L=0,K=0,q=0,$=0,AA=0,eA=0,rA=0,iA=0,fA=0,nA=0,tA=0,oA=0,aA=0,cA=0,lA=0;if(ur=(U=ur)+144|0,D=U+8|0,F=(V=U)+136|0,S=0|ar[(R=(A|=0)+10352|0)>>2],iA=(0|br(S,r))+e|0,J=0|ar[A+10340>>2],z=f<<1,j=(0|cr[J+(24*iA|0)+4>>0])>>>z&3)if(T=(M=1<<(P=0|ar[((O=0==(0|f))?A+5760|0:A+5768|0)>>2]))-1|0,Q=0|br(n,e),Y=0|br(t,r),W=0|ar[(O?A+24|0:A+32|0)>>2],I=0|ar[(O?A+28|0:A+36|0)>>2],e=Y>>(C=0|ar[A+10348>>2]),-1<(0|(i=Q>>C))&(0|i)<(0|S)||sr(48482,48519,118,48539),(0|e)<=-1&&sr(48543,48519,119,48539),(0|(G=0|ar[A+10356>>2]))<=(0|e)&&sr(48543,48519,119,48539),nA=J+(24*((0|br(e,S))+i|0)|0)+2|0,p=A+52|0,y=0|ar[A+48>>2],nA=0|ar[800+(0|ar[y+(lr[nA>>1]<<2)>>2])>>2],B=0|ar[A+5820>>2],E=y,cA=O?aA=0:(aA=(0|ar[A+5780>>2])-1|0,(0|ar[A+5784>>2])-1|0),Z=(fA=0|ar[A+5804>>2])-aA|0,fA=fA-cA|0,_=(0|W)<(Q+n|0)?W-Q|0:n,N=(0|I)<(Y+t|0)?I-Y|0:t,X=0!=(0|tr[J+(24*iA|0)+22>>0]),2==(0|j)){switch((0|cr[J+(24*iA|0)+5>>0])>>>z&3){case 0:H=x=0,tA=-1,oA=1;break;case 1:H=-(x=1),oA=tA=0;break;case 2:tA=H=-(x=1),oA=1;break;case 3:H=-(x=1),oA=-(tA=1)}if(ar[D>>2]=tA,ar[4+D>>2]=oA,ar[V>>2]=H,ar[V+4>>2]=x,g=0|br(H,a),m=0-x&a,tr[F>>0]=0|tr[J+(24*iA|0)+9+(f<<2)>>0],tr[1+F>>0]=0|tr[J+(24*iA|0)+9+(f<<2)+1>>0],tr[2+F>>0]=0,tr[3+F>>0]=0|tr[J+(24*iA|0)+9+(f<<2)+2>>0],tr[4+F>>0]=0|tr[J+(24*iA|0)+9+(f<<2)+3>>0],(0|N)<=0)ur=U;else{f=0<(0|_),u=A+5480|0,b=A+10368|0,s=A+10372|0,d=A+10376|0,k=A+10360|0,h=_+-1|0,w=N+-1|0,v=A+5977|0,P=A+10308|0,L=(0|br(Y>>fA,B))+(Q>>Z)|0,H=0;A:for(;;){if(K=o+((0|br(A=H+Y|0,a))+Q<<1)|0,q=c+((0|br(A,l))+Q<<1)|0,f){AA=0==(0|H),eA=(0|H)==(0|w),iA=(0|(rA=($=A<<cA)>>C))<0|(0|G)<=(0|rA),x=0;do{if(X&&0!=(0|tr[u>>0])){if(i=x+Q<<aA>>(e=0|ar[b>>2]),e=$>>e,(0|i)<=-1){lA=23;break A}if((0|(r=0|ar[s>>2]))<=(0|i)){lA=23;break A}if((0|e)<=-1){lA=26;break A}if((0|e)>=(0|ar[d>>2])){lA=26;break A}j=(0|ar[k>>2])+(3*((0|br(r,e))+i|0)|0)|0,1024&(cr[j>>0]|cr[j+1>>0]<<8)||(lA=28)}else lA=28;e:do{if(28==(0|lA)){if(e=(i=(j=x+Q|(lA=0))<<aA)>>(r=0|ar[b>>2]),r=$>>r,(0|e)<=-1){lA=30;break A}if((0|(S=0|ar[s>>2]))<=(0|e)){lA=30;break A}if((0|r)<=-1){lA=33;break A}if((0|r)>=(0|ar[d>>2])){lA=33;break A}if(z=(0|ar[k>>2])+(3*((0|br(S,r))+e|0)|0)|0,!(2048&(cr[z>>0]|cr[z+1>>0]<<8))){if(eA|(0|x)==(0|h)|AA|0==(0|x)){O=-1<(0|(S=i>>C)),r=0;do{if(n=(0|ar[D+(r<<2)>>2])+j|0,!((0|(t=(0|ar[V+(r<<2)>>2])+A|0))<(0|I)&(0|n)<(0|W)&-1<(t|n|0)))break e;if(e=t<<cA>>C,(0|(i=n<<aA>>C))<=-1){lA=40;break A}if((0|(z=0|ar[R>>2]))<=(0|i)){lA=40;break A}if(!(-1<(0|e)&(0|e)<(0|G))){lA=42;break A}if(e=J+(24*((0|br(z,e))+i|0)|0)+2|0,(e=0|lr[e>>1])>>>0>=(0|ar[p>>2])-E>>2>>>0){lA=59;break A}if(!(i=0|ar[y+(e<<2)>>2])){lA=59;break A}if((0|(i=0|ar[i+800>>2]))<(0|nA)){if(!(O&(0|S)<(0|z))){lA=47;break A}if(iA){lA=49;break A}if(z=J+(24*((0|br(z,rA))+S|0)|0)+2|0,!(0|tr[764+(0|ar[y+(lr[z>>1]<<2)>>2])>>0]))break e}if((0|nA)<(0|i)&&0==(0|tr[764+(0|ar[y+(e<<2)>>2])>>0]))break e;if(0==(0|tr[v>>0])&&(t=(0|br(t>>fA,B))+(n>>Z)|0,z=0|ar[P>>2],(0|ar[z+(t<<2)>>2])!=(0|ar[z+(L<<2)>>2])))break e;r=r+1|0}while((0|r)<2)}t=(j=0|lr[K+(x<<1)>>1])-(0|lr[K+(x+g+tA<<1)>>1])|0,z=j-(0|lr[K+(x+m+oA<<1)>>1])|0,j=(0|tr[((0|t)<0?1:0|t?3:2)+((0|z)<0?-1:0!=(0|z)&1)+F>>0])+j|0,or[q+(x<<1)>>1]=(0|j)<0?0:65535&((0|j)<(0|M)?j:T)}}}while(0);x=x+1|0}while((0|x)<(0|_))}if((0|N)<=(0|(H=H+1|0))){lA=59;break}}if(23==(0|lA))sr(48482,48519,118,48539);else if(26==(0|lA))sr(48543,48519,119,48539);else if(30==(0|lA))sr(48482,48519,118,48539);else if(33==(0|lA))sr(48543,48519,119,48539);else if(40==(0|lA))sr(48482,48519,118,48539);else if(42==(0|lA))sr(48543,48519,119,48539);else if(47==(0|lA))sr(48482,48519,118,48539);else if(49==(0|lA))sr(48543,48519,119,48539);else if(59==(0|lA))return void(ur=U)}}else{for(i=0|cr[J+(24*iA|0)+6+f>>0],r=(e=D)+128|0;(0|(e=e+4|(ar[e>>2]=0)))<(0|r););ar[D+((31&i)<<2)>>2]=1,ar[D+((i+1&31)<<2)>>2]=2,ar[D+((i+2&31)<<2)>>2]=3,ar[D+((i+3&31)<<2)>>2]=4,rA=P+-5|0,i=0<(0|N);A:do{if(X){if(i){K=0<(0|_),q=A+5480|0,$=A+10368|0,AA=A+10372|0,eA=A+10376|0,P=A+10360|0,L=7<(0|rA),x=0;e:for(;;){r:do{if(K){if(H=(z=x+Y|0)<<cA,t=0|br(z,a),z=0|br(z,l),A=0==(0|tr[q>>0]),L)for(j=-1<(0|(z=H>>(t=0|ar[$>>2]))),n=-1<(0|(O=H>>t)),S=0;;){if(i=S+Q<<aA,A)lA=79;else{if((0|(e=i>>t))<=-1){lA=88;break e}if((0|(r=0|ar[AA>>2]))<=(0|e)){lA=88;break e}if(!n){lA=91;break e}if((0|O)>=(0|ar[eA>>2])){lA=91;break e}oA=(0|ar[P>>2])+(3*((0|br(r,O))+e|0)|0)|0,1024&(cr[oA>>0]|cr[oA+1>>0]<<8)||(lA=79)}if(79==(0|lA)){if(((lA=0)|(i>>=t))<=-1){lA=95;break e}if((0|i)>=(0|ar[AA>>2])){lA=95;break e}if(!j){lA=98;break e}if((0|z)>=(0|ar[eA>>2])){lA=98;break e}}if((0|_)<=(0|(S=S+1|0)))break r}else n=0;do{if(i=(j=n+Q|0)<<aA,O=0|ar[$>>2],A)lA=93;else{if(r=H>>O,(0|(e=i>>O))<=-1){lA=88;break e}if((0|(S=0|ar[AA>>2]))<=(0|e)){lA=88;break e}if((0|r)<=-1){lA=91;break e}if((0|r)>=(0|ar[eA>>2])){lA=91;break e}oA=(0|ar[P>>2])+(3*((0|br(S,r))+e|0)|0)|0,1024&(cr[oA>>0]|cr[oA+1>>0]<<8)||(lA=93)}do{if(93==(0|lA)){if(r=i>>O,i=H>>O,((lA=0)|r)<=-1){lA=95;break e}if((0|(e=0|ar[AA>>2]))<=(0|r)){lA=95;break e}if((0|i)<=-1){lA=98;break e}if((0|i)>=(0|ar[eA>>2])){lA=98;break e}if(oA=(0|ar[P>>2])+(3*((0|br(e,i))+r|0)|0)|0,2048&(cr[oA>>0]|cr[oA+1>>0]<<8))break;if(i=0|lr[o+(j+t<<1)>>1],(0|(e=0|ar[D+(i>>>rA<<2)>>2]))<=0)break;oA=(0|tr[e+-1+(J+(24*iA|0)+9+(f<<2))>>0])+i|0,or[c+(j+z<<1)>>1]=(0|oA)<0?0:65535&((0|oA)<(0|M)?oA:T)}}while(0);n=n+1|0}while((0|n)<(0|_))}}while(0);if((0|N)<=(0|(x=x+1|0)))break A}88==(0|lA)?sr(48482,48519,118,48539):91==(0|lA)?sr(48543,48519,119,48539):95==(0|lA)?sr(48482,48519,118,48539):98==(0|lA)&&sr(48543,48519,119,48539)}}else if(i&&(L=7<(0|rA),0<(0|_))){e=0;do{if(r=0|br(S=e+Y|0,a),S=0|br(S,l),!L)for(i=0;n=0|lr[o+((O=i+Q|0)+r<<1)>>1],0<(0|(t=0|ar[D+(n>>>rA<<2)>>2]))&&(lA=(0|tr[t+-1+(J+(24*iA|0)+9+(f<<2))>>0])+n|0,or[c+(O+S<<1)>>1]=(0|lA)<0?0:65535&((0|lA)<(0|M)?lA:T)),(0|(i=i+1|0))<(0|_););e=e+1|0}while((0|e)<(0|N))}}while(0);ur=U}else ur=U}function Na(A,e,r,i,f,n,t,o,a,c,l){e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0,l|=0;var u,b,s,d,k,h,w,v,m,g,Z,p,y,B,E,X,W,I,C,G,V,F,R,N,_,Y,Q,D,J,M,T,U,S=0,O=0,z=0,j=0,H=0,x=0,P=0,L=0,K=0,q=0,$=0,AA=0,eA=0,rA=0,iA=0,fA=0,nA=0,tA=0,oA=0,aA=0,cA=0,lA=0,uA=0,bA=0;if(ur=(U=ur)+144|0,J=U+8|0,F=(V=U)+136|0,S=0|ar[(R=(A|=0)+10352|0)>>2],iA=(0|br(S,r))+e|0,fA=0|ar[(N=A+10340|0)>>2],z=f<<1,j=(0|cr[fA+(24*iA|0)+4>>0])>>>z&3)if(T=(M=1<<(P=0|ar[((O=0==(0|f))?A+5760|0:A+5768|0)>>2]))-1|0,D=0|br(n,e),Q=0|br(t,r),W=0|ar[(O?A+24|0:A+32|0)>>2],I=0|ar[(O?A+28|0:A+36|0)>>2],i=D>>(e=0|ar[(C=A+10348|0)>>2]),e=Q>>e,-1<(0|i)&(0|i)<(0|S)||sr(48482,48519,118,48539),(0|e)<=-1&&sr(48543,48519,119,48539),(0|e)>=(0|ar[(G=A+10356|0)>>2])&&sr(48543,48519,119,48539),oA=fA+(24*((0|br(e,S))+i|0)|0)+2|0,B=A+52|0,oA=0|ar[800+(0|ar[(0|ar[(y=A+48|0)>>2])+(lr[oA>>1]<<2)>>2])>>2],E=0|ar[A+5820>>2],uA=O?lA=0:(lA=(0|ar[A+5780>>2])-1|0,(0|ar[A+5784>>2])-1|0),p=(tA=0|ar[A+5804>>2])-lA|0,tA=tA-uA|0,Y=(0|W)<(D+n|0)?W-D|0:n,_=(0|I)<(Q+t|0)?I-Q|0:t,X=0!=(0|tr[fA+(24*iA|0)+22>>0]),2==(0|j)){switch((0|cr[fA+(24*iA|0)+5>>0])>>>z&3){case 0:H=x=0,aA=-1,cA=1;break;case 1:H=-(x=1),cA=aA=0;break;case 2:aA=H=-(x=1),cA=1;break;case 3:H=-(x=1),cA=-(aA=1)}if(ar[J>>2]=aA,ar[4+J>>2]=cA,ar[V>>2]=H,ar[V+4>>2]=x,Z=0|br(H,a),g=0-x&a,tr[F>>0]=0|tr[fA+(24*iA|0)+9+(f<<2)>>0],tr[1+F>>0]=0|tr[fA+(24*iA|0)+9+(f<<2)+1>>0],tr[2+F>>0]=0,tr[3+F>>0]=0|tr[fA+(24*iA|0)+9+(f<<2)+2>>0],tr[4+F>>0]=0|tr[fA+(24*iA|0)+9+(f<<2)+3>>0],(0|_)<=0)ur=U;else{u=0<(0|Y),b=A+5480|0,s=A+10368|0,d=A+10372|0,k=A+10376|0,h=A+10360|0,w=Y+-1|0,v=_+-1|0,m=A+5977|0,$=A+10308|0,AA=(0|br(Q>>tA,E))+(D>>p)|0,K=0;A:for(;;){if(rA=o+((0|br(eA=K+Q|0,a))+D)|0,iA=c+((0|br(eA,l))+D)|0,u){fA=eA<<uA,f=0==(0|K),nA=(0|K)==(0|v),q=0;do{if(X&&0!=(0|tr[b>>0])){if(i=q+D<<lA>>(e=0|ar[s>>2]),e=fA>>e,(0|i)<=-1){bA=23;break A}if((0|(r=0|ar[d>>2]))<=(0|i)){bA=23;break A}if((0|e)<=-1){bA=26;break A}if((0|e)>=(0|ar[k>>2])){bA=26;break A}A=(0|ar[h>>2])+(3*((0|br(r,e))+i|0)|0)|0,1024&(cr[A>>0]|cr[A+1>>0]<<8)||(bA=28)}else bA=28;e:do{if(28==(0|bA)){if(i=(A=(L=q+D|(bA=0))<<lA)>>(e=0|ar[s>>2]),e=fA>>e,(0|i)<=-1){bA=30;break A}if((0|(r=0|ar[d>>2]))<=(0|i)){bA=30;break A}if((0|e)<=-1){bA=33;break A}if((0|e)>=(0|ar[k>>2])){bA=33;break A}if(P=(0|ar[h>>2])+(3*((0|br(r,e))+i|0)|0)|0,!(2048&(cr[P>>0]|cr[P+1>>0]<<8))){if(nA|(0|q)==(0|w)|f|0==(0|q)){t=0;do{if(z=(0|ar[J+(t<<2)>>2])+L|0,!((0|(j=(0|ar[V+(t<<2)>>2])+eA|0))<(0|I)&(0|z)<(0|W)&-1<(j|z|0)))break e;if(e=j<<uA>>(n=0|ar[C>>2]),(0|(i=z<<lA>>n))<=-1){bA=39;break A}if((0|(H=0|ar[R>>2]))<=(0|i)){bA=39;break A}if((0|e)<=-1){bA=42;break A}if((0|(x=0|ar[G>>2]))<=(0|e)){bA=42;break A}if(i=(P=0|ar[N>>2])+(24*((0|br(H,e))+i|0)|0)+2|0,i=0|lr[i>>1],O=S=0|ar[y>>2],i>>>0>=(0|ar[B>>2])-S>>2>>>0){bA=59;break A}if(!(e=0|ar[O+(i<<2)>>2])){bA=59;break A}if((0|(r=0|ar[e+800>>2]))<(0|oA)){if(i=fA>>n,!(-1<(0|(S=A>>n))&(0|S)<(0|H))){bA=47;break A}if(!(-1<(0|i)&(0|i)<(0|x))){bA=49;break A}if(P=P+(24*((0|br(H,i))+S|0)|0)+2|0,!(0|tr[764+(0|ar[O+(lr[P>>1]<<2)>>2])>>0]))break e}if((0|oA)<(0|r)&&0==(0|tr[e+764>>0]))break e;if(0==(0|tr[m>>0])&&(x=(0|br(j>>tA,E))+(z>>p)|0,P=0|ar[$>>2],(0|ar[P+(x<<2)>>2])!=(0|ar[P+(AA<<2)>>2])))break e;t=t+1|0}while((0|t)<2)}P=(A=0|cr[rA+q>>0])-(0|cr[rA+(q+Z+aA)>>0])|0,L=A-(0|cr[rA+(q+g+cA)>>0])|0,A=(0|tr[((0|P)<0?1:0|P?3:2)+((0|L)<0?-1:0!=(0|L)&1)+F>>0])+A|0,tr[iA+q>>0]=(0|A)<0?0:255&((0|A)<(0|M)?A:T)}}}while(0);q=q+1|0}while((0|q)<(0|Y))}if((0|_)<=(0|(K=K+1|0))){bA=59;break}}if(23==(0|bA))sr(48482,48519,118,48539);else if(26==(0|bA))sr(48543,48519,119,48539);else if(30==(0|bA))sr(48482,48519,118,48539);else if(33==(0|bA))sr(48543,48519,119,48539);else if(39==(0|bA))sr(48482,48519,118,48539);else if(42==(0|bA))sr(48543,48519,119,48539);else if(47==(0|bA))sr(48482,48519,118,48539);else if(49==(0|bA))sr(48543,48519,119,48539);else if(59==(0|bA))return void(ur=U)}}else{for(i=0|cr[fA+(24*iA|0)+6+f>>0],r=(e=J)+128|0;(0|(e=e+4|(ar[e>>2]=0)))<(0|r););ar[J+((31&i)<<2)>>2]=1,ar[J+((i+1&31)<<2)>>2]=2,ar[J+((i+2&31)<<2)>>2]=3,ar[J+((i+3&31)<<2)>>2]=4,rA=P+-5|0,i=0<(0|_);A:do{if(X){if(i){K=0<(0|Y),q=A+5480|0,$=A+10368|0,AA=A+10372|0,eA=A+10376|0,L=A+10360|0,A=7<(0|rA),P=0;e:for(;;){r:do{if(K){if(x=(z=P+Q|0)<<uA,t=0|br(z,a),z=0|br(z,l),A)for(z=0==(0|tr[q>>0]),H=-1<(0|(j=x>>(t=0|ar[$>>2]))),n=-1<(0|(O=x>>t)),S=0;;){if(i=S+D<<lA,z)bA=79;else{if((0|(e=i>>t))<=-1){bA=88;break e}if((0|(r=0|ar[AA>>2]))<=(0|e)){bA=88;break e}if(!n){bA=91;break e}if((0|O)>=(0|ar[eA>>2])){bA=91;break e}cA=(0|ar[L>>2])+(3*((0|br(r,O))+e|0)|0)|0,1024&(cr[cA>>0]|cr[cA+1>>0]<<8)||(bA=79)}if(79==(0|bA)){if(((bA=0)|(i>>=t))<=-1){bA=95;break e}if((0|i)>=(0|ar[AA>>2])){bA=95;break e}if(!H){bA=98;break e}if((0|j)>=(0|ar[eA>>2])){bA=98;break e}}if((0|Y)<=(0|(S=S+1|0)))break r}else n=0;do{if(i=(j=n+D|0)<<lA,O=0|ar[$>>2],0|tr[q>>0]){if(r=x>>O,(0|(e=i>>O))<=-1){bA=88;break e}if((0|(S=0|ar[AA>>2]))<=(0|e)){bA=88;break e}if((0|r)<=-1){bA=91;break e}if((0|r)>=(0|ar[eA>>2])){bA=91;break e}cA=(0|ar[L>>2])+(3*((0|br(S,r))+e|0)|0)|0,1024&(cr[cA>>0]|cr[cA+1>>0]<<8)||(bA=93)}else bA=93;do{if(93==(0|bA)){if(r=i>>O,i=x>>O,((bA=0)|r)<=-1){bA=95;break e}if((0|(e=0|ar[AA>>2]))<=(0|r)){bA=95;break e}if((0|i)<=-1){bA=98;break e}if((0|i)>=(0|ar[eA>>2])){bA=98;break e}if(cA=(0|ar[L>>2])+(3*((0|br(e,i))+r|0)|0)|0,2048&(cr[cA>>0]|cr[cA+1>>0]<<8))break;if(i=0|cr[o+(j+t)>>0],(0|(e=0|ar[J+(i>>>rA<<2)>>2]))<=0)break;cA=(0|tr[e+-1+(fA+(24*iA|0)+9+(f<<2))>>0])+i|0,tr[c+(j+z)>>0]=(0|cA)<0?0:255&((0|cA)<(0|M)?cA:T)}}while(0);n=n+1|0}while((0|n)<(0|Y))}}while(0);if((0|_)<=(0|(P=P+1|0)))break A}88==(0|bA)?sr(48482,48519,118,48539):91==(0|bA)?sr(48543,48519,119,48539):95==(0|bA)?sr(48482,48519,118,48539):98==(0|bA)&&sr(48543,48519,119,48539)}}else if(i&&(L=7<(0|rA),0<(0|Y))){e=0;do{if(r=0|br(S=e+Q|0,a),S=0|br(S,l),!L)for(i=0;n=0|cr[o+((O=i+D|0)+r)>>0],0<(0|(t=0|ar[J+(n>>>rA<<2)>>2]))&&(bA=(0|tr[t+-1+(fA+(24*iA|0)+9+(f<<2))>>0])+n|0,tr[c+(O+S)>>0]=(0|bA)<0?0:255&((0|bA)<(0|M)?bA:T)),(0|(i=i+1|0))<(0|Y););e=e+1|0}while((0|e)<(0|_))}}while(0);ur=U}else ur=U}function _a(A,e){A|=0;var r=0;switch(0|(e|=0)){case 0:e=7796,r=4;break;case 1:e=7824,r=4;break;case 2:e=7768,r=4;break;default:e=0}return 4==(0|r)&&(e=0|ar[e+(A<<2)>>2]),0|e}function Ya(){var A=0,e=0,r=0,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0;t=1;do{for(f=0|ar[7824+(t<<2)>>2],o=1<<t,e=A=0;;){for(n=255&A,r=0,i=e;tr[f+(i<<1)>>0]=r,tr[f+(i<<1)+1>>0]=n,(0|(r=r+1|0))!=(0|o);)i=i+1|0;if((0|(A=A+1|0))==(0|o))break;e=e+o|0}for(f=0|ar[7768+(t<<2)>>2],e=A=0;;){for(n=255&A,r=0,i=e;tr[f+(i<<1)>>0]=n,(0|(r=(tr[f+(i<<1)+1>>0]=r)+1|0))!=(0|o);)i=i+1|0;if((0|(A=A+1|0))==(0|o))break;e=e+o|0}f=0|ar[7796+(t<<2)>>2],n=o<<t,A=e=0;do{if(-1<(0|e))for(i=0,r=e;(0|r)<(0|o)&(0|i)<(0|o)&&(tr[f+(A<<1)>>0]=i,tr[f+(A<<1)+1>>0]=r,A=A+1|0),e=i+1|0,0<(0|r);)i=e,r=r+-1|0;else e=0}while((0|A)<(0|n));t=t+1|0}while(6!=(0|t));a=2;do{c=1<<a,l=(1<<(s=a+-2|0)<<s)-1|0,u=7768+(s<<2)|0,b=7796+(s<<2)|0,s=7824+(s<<2)|0,o=0;do{d=0|ar[7852+(24*o|0)+(a<<2)>>2],n=(h=2==(0|o))?66707:0,t=0;do{switch(k=t<<a,0|o){case 0:i=0|ar[b>>2],r=0;do{for(A=16,e=l;A=(f=0==(0|A))?15:A+-1|0,(((0|cr[i+((e=(f<<31>>31)+e|0)<<1)>>0])<<2)+(0|cr[63979+(A<<1)>>0])|0)!=(0|r)||(((0|cr[i+(e<<1)+1>>0])<<2)+(0|cr[63979+(A<<1)+1>>0])|0)!=(0|t););tr[d+((f=r+k|0)<<1)>>0]=e,tr[d+(f<<1)+1>>0]=A,r=r+1|0}while((0|r)<(0|c));break;case 1:i=0|ar[s>>2],r=0;do{for(A=16,e=l;A=(f=0==(0|A))?15:A+-1|0,(((0|cr[i+((e=(f<<31>>31)+e|0)<<1)>>0])<<2)+(0|cr[61251+(A<<1)>>0])|0)!=(0|r)||(((0|cr[i+(e<<1)+1>>0])<<2)+(0|cr[61251+(A<<1)+1>>0])|0)!=(0|t););tr[d+((f=r+k|0)<<1)>>0]=e,tr[d+(f<<1)+1>>0]=A,r=r+1|0}while((0|r)<(0|c));break;default:i=0;do{for(f=i+k|0,e=h?0|ar[u>>2]:0,A=16,r=l;A=(w=0==(0|A))?15:A+-1|0,(((0|cr[e+((r=(w<<31>>31)+r|0)<<1)>>0])<<2)+(0|cr[n+(A<<1)>>0])|0)!=(0|i)||(((0|cr[e+(r<<1)+1>>0])<<2)+(0|cr[n+(A<<1)+1>>0])|0)!=(0|t););tr[d+(f<<1)>>0]=r,tr[d+(f<<1)+1>>0]=A,i=i+1|0}while((0|i)<(0|c))}t=t+1|0}while((0|t)<(0|c));o=o+1|0}while(3!=(0|o));a=a+1|0}while(6!=(0|a))}function Qa(A,e){e|=0;var r,i,f,n,t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p,y,B,E,X,W,I,C,G,V,F=0,R=0,N=0,_=0,Y=0,Q=0,D=0,J=0,M=0,T=0,U=0,S=0,O=0,z=0,j=0,H=0,x=0,P=0;if(ur=(V=ur)+208|0,H=V+24|0,G=V+8|0,t=(C=V)+40|0,w=V+192|0,132!=(0|ar[(A|=0)>>2]))return ur=V,(H=0)|H;if(!(0|tr[512+(0|ar[e+10332>>2])>>0]))return ur=V,(H=0)|H;if(!(0|tr[e+100>>0]))return ur=V,(H=0)|H;r=0==(0|ar[e+1240>>2])?1:3,i=e+32|0,f=e+24|0,n=e+36|0,o=e+28|0,a=e+40|0,c=e+44|0,l=A+8|0,u=e+5760|0,b=e+5768|0,s=1+w|0,d=2+w|0,k=3+w|0,h=4+w|0,v=5+w|0,m=6+w|0,g=7+w|0,Z=8+w|0,p=9+w|0,y=10+w|0,B=11+w|0,E=12+w|0,X=13+w|0,W=14+w|0,I=15+w|0,j=0;A:for(;;){switch(U=0|ar[((R=0==(0|j))?f:i)>>2],O=0|ar[(R?o:n)>>2],S=0|ar[e+4+(j<<2)>>2],T=0|ar[(R?a:c)>>2],0|ar[l>>2]){case 0:F=0|ar[(R?u:b)>>2],oc(t);e:do{if(0<(0|O)){if(D=U<<1,J=(0|U)<0?-1:D,(0|F)<=8)for(F=0;;)if(ac(t,S+(0|br(F,T))|0,U),(0|O)<=(0|(F=F+1|0))){F=0;break e}if(0<(0|U))F=Q=0;else for(F=R=0;;)if(ac(t,N=F||(F=0|wu(J)),D),(0|O)<=(0|(R=R+1|0)))break e;do{for(N=F||(F=0|wu(J)),_=0|br(Q,T),Y=F,R=0;x=S+(R+_<<1)|0,tr[N+(M=R<<1)>>0]=or[x>>1],tr[Y+(1|M)>>0]=(0|lr[x>>1])>>>8,(0|(R=R+1|0))!=(0|U);)N=Y;ac(t,Y,D),Q=Q+1|0}while((0|Q)<(0|O))}else F=0}while(0);if(lc(w,t),0|F&&mu(F),(0|tr[w>>0])!=(0|tr[A+12+(j<<4)>>0])){z=22;break A}if((0|tr[s>>0])!=(0|tr[A+12+(j<<4)+1>>0])){z=22;break A}if((0|tr[d>>0])!=(0|tr[A+12+(j<<4)+2>>0])){z=22;break A}if((0|tr[k>>0])!=(0|tr[A+12+(j<<4)+3>>0])){z=22;break A}if((0|tr[h>>0])!=(0|tr[A+12+(j<<4)+4>>0])){z=22;break A}if((0|tr[v>>0])!=(0|tr[A+12+(j<<4)+5>>0])){z=22;break A}if((0|tr[m>>0])!=(0|tr[A+12+(j<<4)+6>>0])){z=22;break A}if((0|tr[g>>0])!=(0|tr[A+12+(j<<4)+7>>0])){z=22;break A}if((0|tr[Z>>0])!=(0|tr[A+12+(j<<4)+8>>0])){z=22;break A}if((0|tr[p>>0])!=(0|tr[A+12+(j<<4)+9>>0])){z=22;break A}if((0|tr[y>>0])!=(0|tr[A+12+(j<<4)+10>>0])){z=22;break A}if((0|tr[B>>0])!=(0|tr[A+12+(j<<4)+11>>0])){z=22;break A}if((0|tr[E>>0])!=(0|tr[A+12+(j<<4)+12>>0])){z=22;break A}if((0|tr[X>>0])!=(0|tr[A+12+(j<<4)+13>>0])){z=22;break A}if((0|tr[W>>0])!=(0|tr[A+12+(j<<4)+14>>0])){z=22;break A}if((0|tr[I>>0])==(0|tr[A+12+(j<<4)+15>>0]))break;z=22;break A;case 1:e:do{if(0<(0|O)){if(J=U<<1,M=(0|U)<0?-1:J,F=0<(0|U),(0|ar[(R?u:b)>>2])<=8){if(!F){F=7439,z=39;break}for(R=0,F=7439;;){for(_=S+(0|br(R,T))|0,N=0;z=65535&F,x=cr[_+N>>0]^z>>>8,F=((x^=x>>>4)|z<<8)^x<<5^x<<12,(0|(N=N+1|0))!=(0|U););if((0|(R=R+1|0))==(0|O)){z=39;break e}}}if(F){F=7439,R=D=0;do{for(_=R||(R=0|wu(M)),Y=0|br(D,T),Q=R,N=0;;){if(P=S+(N+Y<<1)|0,tr[_+(x=N<<1)>>0]=or[P>>1],tr[Q+(1|x)>>0]=(0|lr[P>>1])>>>8,(0|(N=N+1|0))==(0|U)){N=0;break}_=Q}for(;x=65535&F,P=cr[Q+N>>0]^x>>>8,F=((P^=P>>>4)|x<<8)^P<<5^P<<12,(0|(N=N+1|0))<(0|J););D=D+1|0}while((0|D)!=(0|O))}else{for(R=F=0;R=R||0|wu(M),(0|(F=F+1|0))!=(0|O););F=7439}F&=65535,R&&mu(R)}else F=7439,z=39}while(0);if(39==(0|z)&&(z=0,F&=65535),(0|F)==(0|(R=0|lr[A+60+(j<<1)>>1])))break;z=43;break A;case 2:if(F=0<(0|U)&0<(0|O),(0|ar[(R?u:b)>>2])<9)if(F){F=R=0;do{for(_=R>>>8^R,Y=0|br(R,T),N=0;F=(255&(_^N^N>>>8)^cr[S+(N+Y)>>0])+F|0,(0|(N=N+1|0))!=(0|U););R=R+1|0}while((0|R)!=(0|O))}else F=0;else if(F){F=N=0;do{for(_=N>>>8^N,Y=0|br(N,T),R=0;F=(P=255&(_^R^R>>>8))+F+(P^cr[S+(R+Y)>>0])|0,(0|(R=R+1|0))!=(0|U););N=N+1|0}while((0|N)!=(0|O))}else F=0;if((0|F)==(0|(R=0|ar[A+68+(j<<2)>>2])))break;z=54;break A}if((0|r)<=(0|(j=j+1|0))){F=0,z=71;break}}return 22==(0|z)?(P=0|ar[2669],ar[C>>2]=ar[e+92>>2],Ii(P,39084,C),ur=V,0|(P=5)):43==(0|z)?(P=0|ar[2669],x=0|ar[e+92>>2],ar[G>>2]=R,ar[4+G>>2]=F,ar[8+G>>2]=x,Ii(P,39127,G),ur=V,0|(P=5)):54==(0|z)?(P=0|ar[2669],x=0|ar[e+92>>2],ar[H>>2]=R,ar[H+4>>2]=F,ar[H+8>>2]=x,Ii(P,39127,H),ur=V,0|(P=5)):71==(0|z)?(ur=V,0|F):0}function Da(A){var e,r,i,f=0,n=0,t=0,o=0,a=0;if(e=(o=0|ar[(A|=0)+18596>>2])+5932|0,n=0|ar[(r=A+18600|0)>>2],!(0|tr[n+12>>0]))return 3<=(f=0|ar[n+796>>2])>>>0&&sr(39211,39242,1508,39251),ht(A+18580|0,f,0|ar[n+792>>2]),tr[(A=A+18588|0)>>0]=0,tr[A+1>>0]=0,tr[A+2>>0]=0,(tr[A+3>>0]=0)|(A=1);if(t=0|ar[n+16>>2],f=0|lr[(0|ar[o+10340>>2])+(24*(0|ar[(0|ar[o+10284>>2])+((0|ar[(0|ar[o+10272>>2])+(t<<2)>>2])-1<<2)>>2])|0)+2>>1],n=0|ar[o+48>>2],f>>>0>=(0|ar[o+52>>2])-n>>2>>>0)return(A=0)|A;if(i=0|ar[n+(f<<2)>>2],0|Fa(e,(0|t)%(0|(o=0|ar[o+5820>>2]))|0,(0|t)/(0|o)|0))return f=0|ar[r>>2],3<=(n=0|ar[f+796>>2])>>>0&&sr(39211,39242,1508,39251),ht(A+18580|0,n,0|ar[f+792>>2]),tr[(A=A+18588|0)>>0]=0,tr[A+1>>0]=0,tr[A+2>>0]=0,(tr[A+3>>0]=0)|(A=1);if(t=0|ar[A+18604>>2],n=0|ar[A+18608>>2],o=0|ar[t+10632>>2],!(1<(t=(0|ar[t+10636>>2])-o>>2)>>>0))return(A=0)|A;for(f=1;(0|ar[o+(f<<2)>>2])!=(0|n);)if(t>>>0<=(f=f+1|0)>>>0){f=0,a=16;break}return 16==(0|a)?0|f:(f=0|ar[o+(f+-1<<2)>>2])?(Mn(f+44|0,0|ar[f+124>>2]),0|tr[1340+i>>0]?(gt(A+18580|0,a=1332+i|0),vt(a),0|(A=1)):(A=0)|A):(A=0)|A}function Ja(A,e,r){e|=0,r|=0;var i,f,n,t,o,a,c,l,u,b,s,d,k,h,w,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0;m=0|ar[(C=(A|=0)+18596|0)>>2],h=0|ar[m+5820>>2],v=0|ar[(w=A+12|0)>>2],k=m+5965|0;do{if(!r&&0<(0|v)&0!=(0|tr[k>>0])&&0==(0|ar[A+8>>2])){if(r=v+-1|0,1<(0|h)){if(I=0|ar[(v=A+18604|0)>>2],r>>>0<(0|ar[I+10680>>2])-(0|ar[I+10676>>2])>>3>>>0){ba(m,0|ar[A+18612>>2],1,r,1),gt(A+18580|0,(0|ar[10676+(0|ar[v>>2])>>2])+((0|ar[w>>2])-1<<3)|0),vt((0|ar[10676+(0|ar[v>>2])>>2])+((0|ar[w>>2])-1<<3)|0);break}return 0|(C=2)}if(ba(m,0|ar[A+18612>>2],0,r,1),r=0|ar[A+18600>>2],(v=0|ar[r+796>>2])>>>0<3){ht(A+18580|0,v,0|ar[r+792>>2]),tr[(I=A+18588|0)>>0]=0,tr[I+1>>0]=0,tr[I+2>>0]=0,tr[I+3>>0]=0;break}sr(39211,39242,1508,39251)}}while(0);for(f=A+8|0,n=h-1|0,t=A+18612|0,o=A+18580|0,a=A+18584|0,c=m+5828|0,l=A+18604|0,I=A+18556|0,u=m+5935|0,b=A+18600|0,s=A+4|0,d=m+5966|0,i=m+10296|0,X=0|ar[w>>2],p=0|ar[f>>2],W=0|ar[C>>2];;){if((v=(0|br(X,h))+p|0)>>>0>=(0|ar[W+10276>>2])-(0|ar[W+10272>>2])>>2>>>0){r=2,v=35;break}if((0|p)>=(0|ar[W+5820>>2])){r=2,v=35;break}if((0|X)>=(0|ar[W+5828>>2])){r=2,v=35;break}if((0|p)<(0|n)&0<(0|X)&e&&ba(W,0|ar[t>>2],p+1|0,X+-1|0,1),!(0|ar[a>>2])){r=2,v=35;break}if(Ma(A),1==(0|p)&0!=(0|tr[k>>0])&&(0|X)<((0|ar[c>>2])-1|0)){if(W=0|ar[l>>2],r=0|ar[W+10676>>2],(0|ar[W+10680>>2])-r>>3>>>0<=X>>>0){r=2,v=35;break}gt(r+(X<<3)|0,o),mt((0|ar[10676+(0|ar[l>>2])>>2])+(X<<3)|0)}if((B=0!=(0|(y=0|at(I))))&&0|tr[u>>0]&&(gt(1332+(0|ar[b>>2])|0,o),mt(1332+(0|ar[b>>2])|0),tr[1340+(0|ar[b>>2])>>0]=1),Tn((0|ar[10524+(0|ar[C>>2])>>2])+(80*v|0)|0,1),E=0|ar[w>>2],Z=(g=0|ar[s>>2])+1|0,ar[s>>2]=Z,W=0|ar[C>>2],r=0|ar[W+5836>>2],v=0|ar[W+5820>>2],(0|Z)<(0|r)?r=(m=0)|ar[(0|ar[W+10284>>2])+(Z<<2)>>2]:m=1,X=(0|r)/(0|v)|0,p=(0|r)%(0|v)|0,ar[A>>2]=r,ar[f>>2]=p,ar[w>>2]=X,0==(0|y)&m){v=27;break}if(B){r=0,v=35;break}if((r=0|tr[d>>0]?(r=0|ar[i>>2],(0|ar[r+(Z<<2)>>2])!=(0|ar[r+(g<<2)>>2])):0)|(0|E)!=(0|X)&0!=(0|tr[k>>0])){v=32;break}}return 27==(0|v)?(er(4+(0|ar[A+18592>>2])|0,1004,0),tr[10516+(0|ar[C>>2])>>0]=3,0|(C=2)):32==(0|v)?0|at(I)?(tt(I),0|(C=1)):(er(4+(0|ar[A+18592>>2])|0,1017,0),tr[10516+(0|ar[C>>2])>>0]=3,0|(C=2)):35==(0|v)?0|r:0}function Ma(A){var e,r,i,f,n,t,o,a,c=0,l=0,u=0,b=0,s=0;n=0|ar[(A|=0)+18600>>2],b=0|ar[A+18596>>2],a=(0|(c=0|ar[A>>2]))%(0|(s=0|ar[b+5820>>2]))|0,s=(0|c)/(0|s)|0,r=a<<(e=0|ar[(c=b+5804|0)>>2]),i=s<<e,f=0|ar[b+10352>>2],l=(0|br(f,s))+a|0,t=0|ar[b+10340>>2],or[t+(24*l|0)>>1]=ar[800+n>>2],l=65535&ar[n>>2],o=r>>(u=0|ar[b+10348>>2]),u=i>>u,-1<(0|o)&(0|o)<(0|f)||sr(48482,48519,128,48539),(0|u)<=-1&&sr(48543,48519,129,48539),(0|u)>=(0|ar[b+10356>>2])&&sr(48543,48519,129,48539),b=t+(24*((0|br(f,u))+o|0)|0)+2|0,or[b>>1]=l,0!=(0|tr[325+n>>0])||0!=(0|tr[326+n>>0])?(function(A,e,r,i){e|=0,r|=0,i|=0;var f,n,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0;ur=(n=ur)+32|0,i=n,a=0|ar[18600+(A|=0)>>2],f=0|ar[A+18596>>2],o=(t=i)+17|0;for(;tr[t>>0]=0,t=t+1|0,(0|t)<(0|o););t=0<(0|e)&&(C=0|br(0|ar[5820+f>>2],r),I=0|ar[10308+f>>2],(0|ar[A>>2])>(0|ar[a+800>>2])&&(0|ar[I+(C+e<<2)>>2])==(0|ar[I+(e+-1+C<<2)>>2]))?255&(0|ot(A+18556|0,0|ar[A+18580>>2])):0;o=0<(0|r)&(I=t<<24>>24==0)&&(E=0|ar[5820+f>>2],W=(0|br(E,r))+e|0,X=0|ar[10308+f>>2],C=X+((0|br(E,r+-1|0))+e<<2)|0,((0|ar[A>>2])-E|0)>=(0|ar[a+800>>2])&&(0|ar[X+(W<<2)>>2])==(0|ar[C>>2]))?255&(0|ot(A+18556|0,0|ar[A+18580>>2])):0;if(C=o<<24>>24==0,!((o|t)<<24>>24)){E=0==(0|ar[5776+f>>2])?1:3,X=a+325|0,W=A+18556|0,m=A+18580|0,g=5760+f|0,Z=5768+f|0,p=10087+f|0,y=10088+f|0,B=i+1|0,v=a+326|0,t=o=w=0;do{if((b=0==(0|w))&0!=(0|tr[X>>0])||0<(0|w)&0!=(0|tr[v>>0])){do{if(b)o=0|ot(W,1+(0|ar[m>>2])|0)?(o=0==(0|ct(W)))?1:2:0,a=o,o&=255;else{if(1!=(0|w)){a=(255&o)>>>(w<<1)&3;break}A=0|ot(W,1+(0|ar[m>>2])|0)?(A=0==(0|ct(W)))?1:2:0,o=255&((a=A)<<4|A<<2|255&o)}}while(0);if(A=255&a){a=0|ar[(u=b?g:Z)>>2],a=255&(0|lt(W,(1<<((0|a)<10?a:10)+-5)-1|0)),tr[(s=i+5+(w<<2)|0)>>0]=a,c=0|ar[u>>2],c=255&(0|lt(W,(1<<((0|c)<10?c:10)+-5)-1|0)),tr[(d=i+5+(w<<2)+1|0)>>0]=c,l=0|ar[u>>2],l=255&(0|lt(W,(1<<((0|l)<10?l:10)+-5)-1|0)),tr[(k=i+5+(w<<2)+2|0)>>0]=l,u=0|ar[u>>2],u=255&(0|lt(W,(1<<((0|u)<10?u:10)+-5)-1|0)),tr[(h=i+5+(w<<2)+3|0)>>0]=u;do{if(1==(0|A))A=a<<24>>24?(A=0!=(0|ct(W)))?-1:1:0,c=c<<24>>24?(c=0!=(0|ct(W)))?-1:1:0,l=l<<24>>24?(l=0!=(0|ct(W)))?-1:1:0,a=u<<24>>24?(a=0!=(0|ct(W)))?-1:1:0,u=255&(0|ut(W,5)),tr[i+2+w>>0]=u,b?u=p:G=30;else{if(b){u=p,a=l=-(c=A=1),t=255&(0|ut(W,2));break}G=(1==(0|w)?(G=255&(0|ut(W,2)),l=a=-1,A=c=1,t=255&(255&t|G<<2|G<<4)):(l=a=-1,A=c=1),30)}}while(0);30==(0|G)&&(G=0,u=y),b=0|cr[u>>0],u=255&(0|br(tr[s>>0]<<b,A)),tr[s>>0]=u,s=255&(0|br(tr[d>>0]<<b,c)),tr[d>>0]=s,d=255&(0|br(tr[k>>0]<<b,l)),tr[k>>0]=d,k=255&(0|br(tr[h>>0]<<b,a)),tr[h>>0]=k}}w=w+1|0}while((0|w)<(0|E));for(tr[i>>0]=o,tr[B>>0]=t,t=(0|br(0|ar[10352+f>>2],r))+e|0,t=(0|ar[10340+f>>2])+(24*t|0)+4|0,o=t+17|0;tr[t>>0]=0|tr[i>>0],i=i+1|0,(0|(t=t+1|0))<(0|o););}if(!I)for(i=0|br(0|ar[10352+f>>2],r),o=0|ar[10340+f>>2],t=o+(24*(i+e|0)|0)+4|0,i=o+(24*(e+-1+i|0)|0)+4|0,o=t+17|0;tr[t>>0]=0|tr[i>>0],i=i+1|0,(0|(t=t+1|0))<(0|o););if(C)return ur=n;t=0|ar[10352+f>>2],i=(0|br(t,r+-1|0))+e|0,o=0|ar[10340+f>>2],t=o+(24*((0|br(t,r))+e|0)|0)+4|0,i=o+(24*i|0)+4|0,o=t+17|0;for(;tr[t>>0]=0|tr[i>>0],t=t+1|0,i=i+1|0,(0|t)<(0|o););ur=n}(A,a,s,0),Ta(A,r,i,s=0|ar[c>>2],0)):Ta(A,r,i,s=e,0)}function Ta(A,e,r,i,f){var n,t,o,a,c,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0;for(t=(A|=0)+18596|0,o=A+18600|0,a=A+18516|0,c=A+18508|0,m=A+18512|0,s=A+18556|0,n=A+18580|0,B=e|=0,y=r|=0,Z=i|=0,p=f|=0;;){if(g=0|ar[t>>2],((e=1<<Z)+B|0)<=(0|(r=0|ar[(b=g+1248|0)>>2]))&&(e+y|0)<=(0|(d=0|ar[g+1252>>2]))&&(0|ar[g+5800>>2])<(0|Z)){if(e=-1<((i=B+-1|0)|y|0)&(0|B)<=(0|r)&(0|y)<(0|d)&&(h=0|ar[g+5804>>2],k=(u=0|br(y>>h,0|ar[g+5820>>2]))+(B>>h)|0,h=u+(i>>h)|0,u=0|ar[g+10340>>2],(0|or[u+(24*k|0)>>1])==(0|or[u+(24*h|0)>>1]))?(e=0|ar[g+10308>>2],(0|ar[e+(k<<2)>>2])==(0|ar[e+(h<<2)>>2])&1):0,l=(0|r)<=(0|B)|((u=y+-1|0)|B|0)<0|(0|d)<(0|y)||(f=0|ar[g+5804>>2],l=0|ar[g+5820>>2],v=B>>f,w=(0|br(y>>f,l))+v|0,v=(0|br(u>>f,l))+v|0,l=0|ar[g+10340>>2],(0|or[l+(24*w|0)>>1])!=(0|or[l+(24*v|0)>>1]))?0:(l=0|ar[g+10308>>2],(0|ar[l+(w<<2)>>2])==(0|ar[l+(v<<2)>>2])&1),e){if(e=i>>(r=0|ar[g+10368>>2]),r=y>>r,(0|e)<=-1){e=14;break}if((0|(i=0|ar[g+10372>>2]))<=(0|e)){e=14;break}if((0|r)<=-1){e=17;break}if((0|r)>=(0|ar[g+10376>>2])){e=17;break}f=(0|ar[g+10360>>2])+(3*((0|br(i,r))+e|0)|0)|0,f=((65535&(cr[f>>0]|cr[f+1>>0]<<8))>>>6&3|0)>(0|p)?3:2}else f=2;if(l){if(i=B>>(r=0|ar[g+10368>>2]),r=u>>r,(0|i)<=-1){e=22;break}if((0|(e=0|ar[g+10372>>2]))<=(0|i)){e=22;break}if((0|r)<=-1){e=25;break}if((0|r)>=(0|ar[g+10376>>2])){e=25;break}e=(0|ar[g+10360>>2])+(3*((0|br(e,r))+i|0)|0)|0,e=((65535&(cr[e>>0]|cr[e+1>>0]<<8))>>>6&3|0)>(0|p)&1}else e=0;e=0|ot(s,(0|ar[n>>2])+(e+f)|0)}else e=(0|ar[g+5800>>2])<(0|Z)&1;if(0|tr[g+5946>>0]&&(0|ar[g+10092>>2])<=(0|Z)&&(ar[c>>2]=0,ar[m>>2]=0),0|tr[752+(0|ar[o>>2])>>0]&&(0|ar[g+10096>>2])<=(0|Z)&&(ar[a>>2]=0),!e){e=42;break}if(i=(f=1<<(r=Z+-1|0))+B|0,f=f+y|0,Ta(A,B,y,r,l=p+1|0),(0|i)<(0|ar[b>>2])&&Ta(A,i,y,r,l),(0|f)<(0|ar[(e=g+1252|0)>>2])&&Ta(A,B,f,r,l),(0|i)>=(0|ar[b>>2])){e=48;break}if(!((0|f)<(0|ar[e>>2]))){e=48;break}B=i,y=f,Z=r,p=l}if(14==(0|e))sr(48482,48519,118,48539);else if(17==(0|e))sr(48543,48519,119,48539);else if(22==(0|e))sr(48482,48519,118,48539);else if(25==(0|e))sr(48543,48519,119,48539);else{if(42==(0|e)){if(b=B>>(m=0|ar[g+10368>>2]),r=y>>m,s=(e=1<<(m=Z-m|0))+r|0,31!=(0|m)){l=e+b|0,u=g+10372|0,i=g+10360|0,f=(65535&p)<<6&192,e=r;do{for(r=b;g=(0|br(0|ar[u>>2],e))+r|0,g=(0|ar[i>>2])+(3*g|0)|0,m=-193&(cr[g>>0]|cr[g+1>>0]<<8)|f,tr[g>>0]=m,tr[g+1>>0]=m>>8,(0|(r=r+1|0))<(0|l););e=e+1|0}while((0|e)<(0|s))}return void function(A,e,r,i,f){e|=0,r|=0,i|=0,f|=0;var n,t,o,a,c,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0,R=0,N=0,_=0,Y=0,Q=0,D=0,J=0;if(ur=(c=ur)+80|0,n=(D=c)+56|0,t=c+40|0,o=c+24|0,a=0|ar[(C=18596+(A|=0)|0)>>2],v=0|ar[(E=A+18600|0)>>2],function(A,e,r,i,f){e|=0,r|=0,i|=0;var n,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;if(n=10368+(A|=0)|0,(f|=0)&&(c=0|ar[n>>2],b=e>>c,l=r>>c,u=(t=1<<(c=i-c|0))+l|0,31!=(0|c))){o=t+b|0,a=A+10372|0,c=A+10360|0,t=l;do{for(f=b;l=(0|br(0|ar[a>>2],t))+f|0,l=(0|ar[c>>2])+(3*l|0)|0,s=-8&(cr[l>>0]|cr[l+1>>0]<<8),tr[l>>0]=s,tr[l+1>>0]=s>>8,(0|(f=f+1|0))<(0|o););t=t+1|0}while((0|t)<(0|u))}t=0|ar[n>>2],o=e>>t,t=r>>t,(0|o)<=-1&&sr(48482,48519,128,48539);f=0|ar[A+10372>>2],(0|f)<=(0|o)&&sr(48482,48519,128,48539);(0|t)<=-1&&sr(48543,48519,129,48539);{if((0|t)<(0|ar[A+10376>>2]))return s=(0|ar[A+10360>>2])+(3*((0|br(f,t))+o|0)|0)|0,i=-8&(cr[s>>0]|cr[s+1>>0]<<8)|7&i,tr[s>>0]=i,tr[s+1>>0]=i>>8;sr(48543,48519,129,48539)}}(a,e,r,i,1),J=0|ar[10448+a>>2],h=e>>J,u=r>>J,w=(l=1<<(J=i-J|0))+u|0,31!=(0|J)){b=l+h|0,d=10452+a|0,k=10440+a|0,l=u;do{for(u=h;J=(0|br(0|ar[d>>2],l))+u|0,((tr[(0|ar[k>>2])+J>>0]=0)|(u=u+1|0))<(0|b););l=l+1|0}while((0|l)<(0|w))}J=1<<i,zn(A,e,r,e,r),0|tr[5964+a>>0]?(Q=0|ot(A+18556|0,161+(0|ar[A+18580>>2])|0),0|(tr[A+32>>0]=Q)&&function(A,e,r,i,f){e|=0,r|=0,i|=0,f|=0;var n,t,o=0,a=0,c=0,l=0,u=0,b=0;if(l=0|ar[10368+(A|=0)>>2],t=e>>l,u=r>>l,n=(i=1<<(l=i-l|0))+u|0,31!=(0|l)){a=i+t|0,c=A+10372|0,l=A+10360|0,o=(1&f)<<11&65535,i=u;do{for(f=t;u=(0|br(0|ar[c>>2],i))+f|0,u=(0|ar[l>>2])+(3*u|0)|0,b=-2049&(cr[u>>0]|cr[u+1>>0]<<8)|o,tr[u>>0]=b,tr[u+1>>0]=b>>8,(0|(f=f+1|0))<(0|a););i=i+1|0}while((0|i)<(0|n))}i=0|ar[A+10348>>2],o=e>>i,i=r>>i,(0|o)<=-1&&sr(48482,48519,128,48539);f=0|ar[A+10352>>2],(0|f)<=(0|o)&&sr(48482,48519,128,48539);(0|i)<=-1&&sr(48543,48519,129,48539);{if((0|i)<(0|ar[A+10356>>2]))return b=(0|ar[A+10340>>2])+(24*((0|br(f,i))+o|0)|0)+22|0,tr[b>>0]=1;sr(48543,48519,129,48539)}}(a,e,r,i,1)):tr[A+32>>0]=0;w=v+20|0;do{if(2!=(0|ar[w>>2])){h=0|ar[C>>2],l=0<=((u=e+-1|0)|r|0)&&(0|ar[h+1248>>2])>=(0|e)&&(0|ar[h+1252>>2])>(0|r)&&(g=0|ar[h+5804>>2],Q=0|br(r>>g,0|ar[h+5820>>2]),m=Q+(e>>g)|0,g=Q+(u>>g)|0,Q=0|ar[h+10340>>2],(0|or[Q+(24*m|0)>>1])==(0|or[Q+(24*g|0)>>1]))?(l=0|ar[h+10308>>2],(0|ar[l+(m<<2)>>2])==(0|ar[l+(g<<2)>>2])&1):0,d=0<=((k=r+-1|0)|e|0)&&(0|ar[h+1248>>2])>(0|e)&&(0|ar[h+1252>>2])>=(0|r)&&(Y=0|ar[h+5804>>2],Q=0|ar[h+5820>>2],p=e>>Y,Z=(0|br(r>>Y,Q))+p|0,p=(0|br(k>>Y,Q))+p|0,Q=0|ar[h+10340>>2],(0|or[Q+(24*Z|0)>>1])==(0|or[Q+(24*p|0)>>1]))?(d=0|ar[h+10308>>2],(0|ar[d+(Z<<2)>>2])==(0|ar[d+(p<<2)>>2])&1):0;do{if(l){if(Q=0|ar[h+10368>>2],l=u>>Q,u=r>>Q,(0|l)<=-1&&sr(48482,48519,118,48539),(0|(b=0|ar[h+10372>>2]))<=(0|l)&&sr(48482,48519,118,48539),(0|u)<=-1&&sr(48543,48519,119,48539),(0|u)<(0|ar[h+10376>>2])){y=(0|ar[h+10360>>2])+(3*((0|br(b,u))+l|0)|0)|0,y=512==(768&(cr[y>>0]|cr[y+1>>0]<<8))?6:5;break}sr(48543,48519,119,48539)}else y=5}while(0);do{if(d){if(l=0|ar[h+10368>>2],b=e>>l,l=k>>l,(0|b)<=-1&&sr(48482,48519,118,48539),(0|(u=0|ar[h+10372>>2]))<=(0|b)&&sr(48482,48519,118,48539),(0|l)<=-1&&sr(48543,48519,119,48539),(0|l)<(0|ar[h+10376>>2])){B=(0|ar[h+10360>>2])+(3*((0|br(u,l))+b|0)|0)|0,B=512==(768&(cr[B>>0]|cr[B+1>>0]<<8))&1;break}sr(48543,48519,119,48539)}else B=0}while(0);if(!((255&(0|ot(u=A+18556|0,(0|ar[(l=A+18580|0)>>2])+(B+y)|0)))<<24>>24)){if(2==(0|ar[w>>2])){Q=0;break}Q=0==(0|ot(u,149+(0|ar[l>>2])|0))&1;break}A:do{if(2<=(0|ar[804+(0|ar[E>>2])>>2])&&0!=(0|ot(u,148+(0|ar[l>>2])|0)))if(1<((0|ar[804+(0|ar[E>>2])>>2])-1|0)){l=1;do{if(!(0|ct(u)))break A;l=l+1|0}while((0|l)<((0|ar[804+(0|ar[E>>2])>>2])-1|0))}else l=1;else l=0}while(0);if(tr[(b=A+26|0)>>0]=15&tr[b>>0]|(255&l)<<5&255|16,b=0|ar[(l=10368+a|0)>>2],u=e>>b,b=r>>b,(0|u)<=-1&&sr(48482,48519,128,48539),(0|(s=0|ar[(h=10372+a|0)>>2]))<=(0|u)&&sr(48482,48519,128,48539),(0|b)<=-1&&sr(48543,48519,129,48539),(0|b)>=(0|ar[10376+a>>2])&&sr(48543,48519,129,48539),D=(0|ar[(k=10360+a|0)>>2])+(3*((0|br(s,b))+u|0)|0)|0,d=-57&(cr[D>>0]|cr[D+1>>0]<<8),tr[D>>0]=d,tr[D+1>>0]=d>>8,D=0|ar[l>>2],d=e>>D,u=r>>D,s=(l=1<<(D=i-D|0))+u|0,31!=(0|D)){b=l+d|0,l=u;do{for(u=d;D=(0|br(0|ar[h>>2],l))+u|0,D=(0|ar[k>>2])+(3*D|0)|0,i=-769&(cr[D>>0]|cr[D+1>>0]<<8)|512,tr[D>>0]=i,tr[D+1>>0]=i>>8,(0|(u=u+1|0))<(0|b););l=l+1|0}while((0|l)<(0|s))}return mc(0|ar[A+18592>>2],0|ar[E>>2],0|ar[C>>2],A+16|0,e,r,0,0,J,J,J,0),ur=c}Q=0}while(0);if(Y=0|ar[(m=10368+a|0)>>2],w=e>>Y,u=r>>Y,v=(l=1<<(Y=i-Y|0))+u|0,31!=(0|Y)){b=l+w|0,d=10372+a|0,k=10360+a|0,h=(65535&Q)<<8&65535,l=u;do{for(u=w;Y=(0|br(0|ar[d>>2],l))+u|0,Y=(0|ar[k>>2])+(3*Y|0)|0,_=-769&(cr[Y>>0]|cr[Y+1>>0]<<8)|h,tr[Y>>0]=_,tr[Y+1>>0]=_>>8,(0|(u=u+1|0))<(0|b););l=l+1|0}while((0|l)<(0|v))}if((Y=0!=(0|Q))||(0|ar[5800+a>>2])==(0|i)){u=0|ar[C>>2],h=0==(0|Q),l=0|ot(b=A+18556|0,8+(0|ar[(d=A+18580|0)>>2])|0);do{if(h)s=0|l?0:3;else if(l)s=0;else{if(k=0|ot(b,9+(0|ar[d>>2])|0),(0|ar[u+5800>>2])>=(0|i)){if(0|k){s=1;break}if(3==(0|i)){s=2;break}s=3-(0|ot(b,10+(0|ar[d>>2])|0))|0;break}if(!(0|tr[u+5466>>0])){s=0|k?1:2;break}if(0|ot(b,11+(0|ar[d>>2])|0)){s=0|k?1:2;break}l=0|ct(b),0!=(0|k)&(u=0!=(0|l))?s=5:(b=0==(0|k))|u?l|k?b&u?s=7:sr(55739,39242,1760,39275):s=6:s=4}}while(0);_=h&3==(0|s)&1}else s=_=0;u=0|ar[m>>2],l=e>>u,u=r>>u,(0|l)<=-1&&sr(48482,48519,128,48539);b=0|ar[10372+a>>2],(0|b)<=(0|l)&&sr(48482,48519,128,48539);(0|u)<=-1&&sr(48543,48519,129,48539);(0|u)>=(0|ar[10376+a>>2])&&sr(48543,48519,129,48539);R=(0|ar[10360+a>>2])+(3*((0|br(b,u))+l|0)|0)|0,N=-57&(cr[R>>0]|cr[R+1>>0]<<8)|(65535&s)<<3&56,tr[R>>0]=N,tr[R+1>>0]=N>>8,R=0==(0|Q),N=0==(0|s);A:do{if(R){if(N&&0|tr[5468+a>>0]&&(0|ar[5884+a>>2])<=(0|i)&&(0|ar[5888+a>>2])>=(0|i)&&0|at(G=A+18556|0)){if(Ua(a,e,r,i,1),l=0|ar[(Z=A+18560|0)>>2],ar[D>>2]=l,ar[D+4>>2]=(0|ar[A+18564>>2])-l,ar[(l=D+8|0)>>2]=0,ar[l+4>>2]=0,ar[D+16>>2]=0,l=0|ar[C>>2],b=0|ar[l+5760>>2],h=0|tr[l+5469>>0],k=0|ar[l+40>>2],l=0|ar[l+4>>2],u=(0|br(k,r))+e|0,8<(0|b)){if(d=l+(u<<1)|0,s=b-h|0,31!=(0|i)){u=0;do{for(b=0|br(u,k),l=0;i=(0|At(D,h))<<s&65535,or[d+(l+b<<1)>>1]=i,(0|(l=l+1|0))!=(0|J););u=u+1|0}while((0|u)!=(0|J))}}else if(d=l+u|0,s=b-h|0,31!=(0|i)){u=0;do{for(b=0|br(u,k),l=0;i=(0|At(D,h))<<s&255,tr[d+(l+b)>>0]=i,(0|(l=l+1|0))!=(0|J););u=u+1|0}while((0|u)!=(0|J))}u=0|ar[C>>2];do{if(0|ar[u+5776>>2])if(w=0|ar[u+5768>>2],k=0|ar[u+5780>>2],h=(0|J)/(0|k)|0,b=0|ar[u+5784>>2],v=(0|J)/(0|b)|0,l=0|tr[u+5470>>0],g=l<<24>>24,m=0|ar[u+44>>2],s=0|ar[u+8>>2],d=(0|br(m,(0|r)/(0|b)|0))+((0|e)/(0|k)|0)|0,8<(0|w)){if(s=s+(d<<1)|0,d=w-g|0,0<(0|h)&0<(0|v)){u=0;do{for(b=0|br(u,m),l=0;i=(0|At(D,g))<<d&65535,or[s+(l+b<<1)>>1]=i,(0|(l=l+1|0))!=(0|h););u=u+1|0}while((0|u)!=(0|v));u=0|ar[C>>2],m=0|ar[u+44>>2],w=0|ar[u+5768>>2],s=0|ar[u+5780>>2],b=0|ar[u+5784>>2],l=0|tr[u+5470>>0]}else s=k;if(v=(0|J)/(0|s)|0,h=(0|J)/(0|b)|0,k=l<<24>>24,d=(0|ar[u+12>>2])+((0|br((0|r)/(0|b)|0,m))+((0|e)/(0|s)|0)<<1)|0,b=w-k|0,!(0<(0|v)&0<(0|h)))break;u=0;do{for(s=0|br(u,m),l=0;r=(0|At(D,k))<<b&65535,or[d+(l+s<<1)>>1]=r,(0|(l=l+1|0))!=(0|v););u=u+1|0}while((0|u)!=(0|h))}else{if(s=s+d|0,d=w-g|0,0<(0|h)&0<(0|v)){u=0;do{for(b=0|br(u,m),l=0;i=(0|At(D,g))<<d&255,tr[s+(l+b)>>0]=i,(0|(l=l+1|0))!=(0|h););u=u+1|0}while((0|u)!=(0|v));u=0|ar[C>>2],m=0|ar[u+44>>2],w=0|ar[u+5768>>2],s=0|ar[u+5780>>2],b=0|ar[u+5784>>2],l=0|tr[u+5470>>0]}else s=k;if(v=(0|J)/(0|s)|0,h=(0|J)/(0|b)|0,k=l<<24>>24,d=(0|ar[u+12>>2])+((0|br((0|r)/(0|b)|0,m))+((0|e)/(0|s)|0))|0,b=w-k|0,!(0<(0|v)&0<(0|h)))break;u=0;do{for(s=0|br(u,m),l=0;r=(0|At(D,k))<<b&255,tr[d+(l+s)>>0]=r,(0|(l=l+1|0))!=(0|v););u=u+1|0}while((0|u)!=(0|h))}}while(0);return rt(D),ar[Z>>2]=ar[D>>2],tt(G),ur=c}if(G=(V=3==(0|s))?(0|J)/2|0:J,V=(V<<31>>31)+i|0,!(C=31==(0|i))){s=A+18556|0,d=A+18580|0,u=l=0;do{for(b=0;E=0|ot(s,12+(0|ar[d>>2])|0),l=(f=l)+1|0,ar[D+(f<<2)>>2]=E,(0|(b=b+G|0))<(0|J););u=u+G|0}while((0|u)<(0|J))}if(u=0<=((l=e+-1|0)|r|0)&&(0|ar[1248+a>>2])>=(0|e)&&(0|ar[1252+a>>2])>(0|r)&&(W=0|ar[5804+a>>2],f=0|br(r>>W,0|ar[5820+a>>2]),X=f+(e>>W)|0,W=f+(l>>W)|0,f=0|ar[10340+a>>2],(0|or[f+(24*X|0)>>1])==(0|or[f+(24*W|0)>>1]))?(u=0|ar[10308+a>>2],(0|ar[u+(X<<2)>>2])==(0|ar[u+(W<<2)>>2])&1):0,l=0<=((l=r+-1|0)|e|0)&&(0|ar[1248+a>>2])>(0|e)&&(0|ar[1252+a>>2])>=(0|r)&&(X=0|ar[5804+a>>2],W=0|ar[5820+a>>2],F=e>>X,I=(0|br(r>>X,W))+F|0,F=(0|br(l>>X,W))+F|0,W=0|ar[10340+a>>2],(0|or[W+(24*I|0)>>1])==(0|or[W+(24*F|0)>>1]))?(l=0|ar[10308+a>>2],(0|ar[l+(I<<2)>>2])==(0|ar[l+(F<<2)>>2])&1):0,!C){I=A+18556|0,W=0!=(0|u),v=0!=(0|l),m=5872+a|0,g=5876+a|0,Z=10408+a|0,p=10412+a|0,y=10400+a|0,B=4+o|0,E=8+o|0,l=h=0;do{f=h+r|0,X=v|0<(0|h),w=0;do{if(s=0|ar[D+(l<<2)>>2],b=s?(u=n,0|lt(I,2)):(u=t,0|ut(I,5)),ar[u+(l<<2)>>2]=b,F=w+e|0,k=0|ar[m>>2],k=(0|br(f>>k,0|ar[g>>2]))+(F>>k)|0,Ct(o,F,f,k,W|0<(0|w),X,a),u=1==(0|s)?0|ar[o+(ar[n+(l<<2)>>2]<<2)>>2]:(u=0|ar[o>>2],(0|(b=0|ar[B>>2]))<(0|u)?(ar[o>>2]=b,ar[B>>2]=u,s=b):(s=u,u=b),(0|(b=0|ar[E>>2]))<(0|s)?(ar[o>>2]=b,ar[E>>2]=s,d=s):(d=b,b=s),(0|d)<(0|u)?(ar[B>>2]=d,ar[E>>2]=u,s=d):(s=u,u=d),F=0|ar[t+(l<<2)>>2],((0|u)<=(0|(F=((0|s)<=(0|(F=((0|b)<=(0|F)&1)+F|0))&1)+F|0))&1)+F|0),F=V-(0|ar[Z>>2])|0,d=1<<F,31!=(0|F)){s=255&u,u=0;do{for(b=0;F=b+k+(0|br(0|ar[p>>2],u))|0,tr[(0|ar[y>>2])+F>>0]=s,(0|(b=b+1|0))<(0|d););u=u+1|0}while((0|u)<(0|d))}l=l+1|0,w=w+G|0}while((0|w)<(0|J));h=h+G|0}while((0|h)<(0|J))}d=5776+a|0;e:do{switch(0|ar[d>>2]){case 3:if(!C){h=A+18556|0,w=A+18580|0,v=10408+a|0,m=10412+a|0,g=10416+a|0,Z=10400+a|0,k=0;r:for(;;){p=k+r|0,d=0;do{if(y=d+e|0,s=0|ot(h,13+(0|ar[w>>2])|0)?0|ut(h,2):4,u=0|ar[v>>2],l=y>>u,u=p>>u,(0|l)<=-1){l=174;break r}if((0|(b=0|ar[m>>2]))<=(0|l)){l=174;break r}if((0|u)<=-1){l=175;break r}if((0|u)>=(0|ar[g>>2])){l=175;break r}l=(0|ar[Z>>2])+((0|br(b,u))+l)|0,l=0|cr[l>>0],(u=4==(0|s))||(D=0|ar[7948+(s<<2)>>2],l=(0|D)==(0|l)?34:D),Sa(a,y,p,V,l,u),d=d+G|0}while((0|d)<(0|J));if((0|J)<=(0|(k=k+G|0)))break e}174==(0|l)?sr(48482,48519,118,48539):175==(0|l)&&sr(48543,48519,119,48539)}break;case 0:break;default:s=0|ot(l=A+18556|0,13+(0|ar[A+18580>>2])|0)?0|ut(l,2):4,u=0|ar[10408+a>>2],l=e>>u,u=r>>u,(0|l)<=-1&&sr(48482,48519,118,48539),(0|(b=0|ar[10412+a>>2]))<=(0|l)&&sr(48482,48519,118,48539),(0|u)<=-1&&sr(48543,48519,119,48539),(0|u)>=(0|ar[10416+a>>2])&&sr(48543,48519,119,48539),l=(0|ar[10400+a>>2])+((0|br(b,u))+l)|0,l=0|cr[l>>0],(u=4==(0|s))||(J=0|ar[7948+(s<<2)>>2],l=(0|J)==(0|l)?34:J),2==(0|ar[d>>2])&&(l=0|cr[39292+l>>0]),Sa(a,e,r,i,l,u)}}while(0)}else{if(N){Oa(A,e,r,0,0,J,J,f,J,0);break}switch(0|s){case 1:Oa(A,e,r,0,0,J,D=(0|J)/2|0,f,J,0),Oa(A,e,r,0,D,J,D,f,J,1);break A;case 2:Oa(A,e,r,0,0,D=(0|J)/2|0,J,f,J,0),Oa(A,e,r,D,0,D,J,f,J,1);break A;case 4:Oa(A,e,r,0,0,J,D=(0|J)/4|0,f,J,0),Oa(A,e,r,0,D,J,(3<<i|0)/4|0,f,J,1);break A;case 5:Oa(A,e,r,0,0,J,D=(3<<i|0)/4|0,f,J,0),Oa(A,e,r,0,D,J,(0|J)/4|0,f,J,1);break A;case 6:Oa(A,e,r,0,0,D=(0|J)/4|0,J,f,J,0),Oa(A,e,r,D,0,(3<<i|0)/4|0,J,f,J,1);break A;case 7:Oa(A,e,r,0,0,D=(3<<i|0)/4|0,J,f,J,0),Oa(A,e,r,D,0,(0|J)/4|0,J,f,J,1);break A;case 3:Oa(A,e,r,0,0,D=(0|J)/2|0,D,f,J,0),Oa(A,e,r,D,0,D,D,f,J,1),Oa(A,e,r,0,D,D,D,f,J,2),Oa(A,e,r,D,D,D,D,f,J,3);break A;default:sr(44456,39242,4511,39327)}}}while(0);if(Y&&!(N&0!=(16&tr[A+26>>0]))&&0==(0|ot(A+18556|0,153+(0|ar[A+18580>>2])|0)))return ur=c;l=R?(0|ar[1396+a>>2])+_|0:0|ar[1392+a>>2];J=0!=(0|ar[5776+a>>2])&1,function A(e,r,i,f,n,t,o,a,c,l,u,b,s,d,k){e|=0;r|=0;i|=0;f|=0;n|=0;t|=0;o|=0;a|=0;c|=0;l|=0;u|=0;b|=0;s|=0;d|=0;k|=0;var h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0;X=e+18596|0;w=0|ar[X>>2];h=0|ar[w+10368>>2];v=r>>h;(0|v)<=-1&&sr(48482,48519,118,48539);W=1==(0|b);I=e+18556|0;C=e+18580|0;G=0!=(0|b);E=i;y=f;p=n;B=a;Z=l;g=w;m=v;f=i>>h;for(;;){if((0|(l=0|ar[g+10372>>2]))<=(0|m)){V=4;break}if((0|f)<=-1){V=7;break}if((0|(w=0|ar[g+10376>>2]))<=(0|f)){V=7;break}if(v=0|ar[g+10360>>2],i=v+(3*((0|br(l,f))+m|0)|0)|0,(65535&(i=(65535&(cr[i>>0]|cr[i+1>>0]<<8))>>>8&3)|0)!=(0|s)){V=9;break}if((n=(0|ar[g+5868>>2])<(0|B))||((0|u)<=(0|c)?1:(0|ar[g+5864>>2])>=(0|B))|G&0==(0|c)){if(f=E>>h,!(-1<(0|(a=r>>h))&(0|a)<(0|l))){V=16;break}if(!(-1<(0|f)&(0|f)<(0|w))){V=18;break}l=v+(3*((0|br(l,f))+a|0)|0)|0,l=1&(W&0==(0|c)|n|0!=(56&(cr[l>>0]|cr[l+1>>0]<<8))&(i<<16>>16==1?0==(ar[g+1392>>2]|c|0):0))}else{if(3<=(f=5-B|0)>>>0){V=13;break}l=0|ot(I,(0|ar[C>>2])+(f+20)|0)}if(w=0!=(0|l)){if(n=0|ar[g+10448>>2],f=r>>n,n=E>>n,(0|f)<=-1){V=23;break}if((0|(h=0|ar[g+10452>>2]))<=(0|f)){V=23;break}if((0|n)<=-1){V=26;break}if((0|n)>=(0|ar[g+10456>>2])){V=26;break}m=(0|ar[g+10440>>2])+((0|br(h,n))+f)|0,tr[m>>0]=0|cr[m>>0]|1<<c}if(3==(0|(g=0|ar[(a=g+5776|0)>>2]))|2<(0|B)&0!=(0|g)?(d<<24>>24?(f=c+16|0,n=0|ot(I,(0|ar[C>>2])+f|0),2==(0|ar[a>>2])&&3==(0|B)|0==(0|l)&&(n=(0|ot(I,(0|ar[C>>2])+f|0))<<1|n)):n=-1,k<<24>>24?(h=c+16|0,f=0|ot(I,(0|ar[C>>2])+h|0),2==(0|ar[a>>2])&&3==(0|B)|0==(0|l)&&(f=(0|ot(I,(0|ar[C>>2])+h|0))<<1|f)):f=-1,(0|n)<0?V=38:l=n):(f=-1,V=38),38==(0|V)){if((n=2==((V=0)|B))&0==(0|c)){V=39;break}l=n&0<(0|c)?255&d:0}if(h=(0|f)<0?2==(0|B)&0<(0|c)?255&k:0:f,!w){V=43;break}if(n=(a=1<<(f=B+-1|0))+r|0,a=a+E|0,A(e,r,E,r,E,t,o,f,c=c+1|0,0,u,b,s,d=255&l,k=255&h),A(e,n,E,r,E,t,o,f,c,1,u,b,s,d,k),A(e,r,a,r,E,t,o,f,c,2,u,b,s,d,k),g=0|ar[X>>2],h=0|ar[g+10368>>2],(0|(m=n>>h))<=-1){V=4;break}p=E,y=r,r=n,B=f,Z=3,f=(E=a)>>h}switch(0|V){case 4:sr(48482,48519,118,48539);break;case 7:sr(48543,48519,119,48539);break;case 9:sr(39344,39242,3827,39367);break;case 13:sr(39387,39242,1820,39416);break;case 16:sr(48482,48519,118,48539);break;case 18:sr(48543,48519,119,48539);break;case 23:sr(48482,48519,128,48539);break;case 26:sr(48543,48519,129,48539);break;case 39:sr(39444,39242,3894,39367);break;case 43:return i<<16>>16==0|0!=(l|c|h|0)?(V=0|ot(I,(0|ar[C>>2])+(0==(0|c)?15:14)|0),void za(e,r,E,y,p,t,o,B,0,Z,V,l,h)):void za(e,r,E,y,p,t,o,B,0,Z,V=1,l,h)}}(A,e,r,e,r,e,r,i,0,0,l,_,Q,J,J),ur=c}(A,B,y,Z,p)}if(48==(0|e))return}}function Ua(A,e,r,i,f){r|=0,i|=0,f|=0;var n,t,o=0,a=0,c=0,l=0,u=0,b=0;if(t=(e|=0)>>(l=0|ar[(A|=0)+10368>>2]),u=r>>l,n=(i=1<<(l=i-l|0))+u|0,31!=(0|l)){a=i+t|0,c=A+10372|0,l=A+10360|0,o=(1&f)<<10&65535,i=u;do{for(f=t;u=(0|br(0|ar[c>>2],i))+f|0,u=(0|ar[l>>2])+(3*u|0)|0,b=-1025&(cr[u>>0]|cr[u+1>>0]<<8)|o,tr[u>>0]=b,tr[u+1>>0]=b>>8,(0|(f=f+1|0))<(0|a););i=i+1|0}while((0|i)<(0|n))}if(o=e>>(i=0|ar[A+10348>>2]),i=r>>i,(0|o)<=-1&&sr(48482,48519,128,48539),(0|(f=0|ar[A+10352>>2]))<=(0|o)&&sr(48482,48519,128,48539),(0|i)<=-1&&sr(48543,48519,129,48539),(0|i)<(0|ar[A+10356>>2]))return b=(0|ar[A+10340>>2])+(24*((0|br(f,i))+o|0)|0)+22|0,void(tr[b>>0]=1);sr(48543,48519,129,48539)}function Sa(A,e,r,i,f,n){e|=0,r|=0,f|=0;var t,o,a,c,l=0,u=0;if(c=255&((n|=0)?128|f:f),o=1<<(u=(i|=0)-(0|ar[(A|=0)+10408>>2])|0),l=0|ar[A+5872>>2],r=(0|br(r>>l,0|ar[(a=A+5876|0)>>2]))+(e>>l)|0,31!=(0|u)){t=A+5880|0,l=A+10432|0,u=A+10424|0,i=A+10420|0,n=0;A:for(;;){f=0;do{if((0|f)>=(0|ar[a>>2])){f=10;break A}if((0|n)>=(0|ar[t>>2])){f=11;break A}if((0|(e=r+f+(0|br(0|ar[l>>2],n))|0))>=(0|ar[u>>2])){f=12;break A}tr[(0|ar[i>>2])+e>>0]=c,f=f+1|0}while((0|f)<(0|o));if((0|o)<=(0|(n=n+1|0))){f=9;break}}9!=(0|f)&&(10==(0|f)?sr(39542,48519,659,39565):11==(0|f)?sr(39584,48519,660,39565):12==(0|f)&&sr(39608,48519,663,39565))}}function Oa(A,e,r,i,f,n,t,o,a,c){e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0;var l,u,b,s=0,d=0,k=0,h=0,w=0,v=0;if(l=0|ar[(w=(A|=0)+18600|0)>>2],k=0|ot(h=A+18556|0,147+(0|ar[(u=A+18580|0)>>2])|0),b=A+16|0,tr[(v=A+26|0)>>0]=(255&k)<<4&16|-17&tr[v>>0],k){A:do{if(2<=(0|ar[804+(0|ar[w>>2])>>2])&&0!=(0|ot(h,148+(0|ar[u>>2])|0)))if(1<((0|ar[804+(0|ar[w>>2])>>2])-1|0)){s=1;do{if(!(0|ct(h)))break A;s=s+1|0}while((0|s)<((0|ar[804+(0|ar[w>>2])>>2])-1|0))}else s=1;else s=0}while(0);o=31&tr[v>>0],s=(255&s)<<5&255}else{do{if(0|ar[20+l>>2])k=1;else{if(s=0|ar[u>>2],12!=(t+n|0)&&0|ot(h,s+156+o|0)){k=3;break}k=1+(0|ot(h,s+160|0))|0}}while(0);if(tr[v>>0]=-4&tr[v>>0]|3&k,2!=(0|k)){s=(0|ar[328+l>>2])-1|0;A:do{if(0!=(0|s)&&0!=(0|ot(h,154+(0|ar[u>>2])|0)))for(o=0;;){if((0|(d=o+1|0))==(0|s))break A;if(!(o=o?0|ct(h):0|ot(h,155+(0|ar[u>>2])|0))){s=d;break}o=d}else s=0}while(0);if(tr[b>>0]=s,xa(A,0,0,0),d=255&(0|ot(h,152+(0|ar[u>>2])|0)),tr[v>>0]=d<<2&4|-5&tr[v>>0],1==(0|k))return void mc(h=0|ar[(h=A+18592|0)>>2],w=0|ar[w>>2],v=0|ar[(v=A+18596|0)>>2],b,e,r,i,f,a,n,t,c)}d=(0|ar[332+l>>2])-1|0;A:do{if(0!=(0|d)&&0!=(0|ot(h,154+(0|ar[u>>2])|0)))for(o=0;;){if((0|(s=o+1|0))==(0|d)){s=d;break A}if(!(o=o?0|ct(h):0|ot(h,155+(0|ar[u>>2])|0)))break;o=s}else s=0}while(0);tr[A+17>>0]=s,3==(0|k)&0!=(0|tr[370+l>>0])?(or[A+22>>1]=0,or[A+24>>1]=0):xa(A,0,0,1),s=255&(0|ot(h,152+(0|ar[u>>2])|0)),o=-9&tr[v>>0],s=s<<3&8}tr[v>>0]=o|s,mc(h=0|ar[(h=A+18592|0)>>2],w=0|ar[w>>2],v=0|ar[(v=A+18596|0)>>2],b,e,r,i,f,a,n,t,c)}function za(A,e,r,i,f,n,t,o,a,c,l,u,b){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0,l|=0,b|=0;var s,d,k,h,w,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0;-1==(0|(u|=0))&&sr(39481,39242,3547,39494),-1==(0|b)&&sr(39514,39242,3548,39494),-1==(0|l)&&sr(39527,39242,3549,39494),g=0|ar[(w=A+18596|0)>>2],X=2<(0|(X=((1^(d=3==(0|(k=0|ar[g+5776>>2]))))<<31>>31)+o|0))?X:2,Z=b|u,tr[(v=A+33|0)>>0]=0,tr[v+1>>0]=0,tr[v+2>>0]=0,a=e>>(v=(tr[v+3>>0]=0)|ar[g+10368>>2]),v=r>>v,(0|a)<=-1&&sr(48482,48519,118,48539),(0|(m=0|ar[g+10372>>2]))<=(0|a)&&sr(48482,48519,118,48539),(0|v)<=-1&&sr(48543,48519,119,48539),(0|v)>=(0|ar[g+10376>>2])&&sr(48543,48519,119,48539),E=(0|ar[g+10360>>2])+(3*((0|br(m,v))+a|0)|0)|0,h=65535&(E=(65535&(cr[E>>0]|cr[E+1>>0]<<8))>>>8&3),s=0!=(0|l),m=0!=(0|Z);do{if(Z|l|0){if(0!=(0|tr[g+5946>>0])&&0==(0|ar[(p=A+18508|0)>>2])){v=A+18556|0,a=A+18580|0;do{if(0|ot(v,139+(0|ar[a>>2])|0)){if(0|ot(v,140+(0|ar[a>>2])|0))if(0|ot(v,140+(0|ar[a>>2])|0))if(0|ot(v,140+(0|ar[a>>2])|0))if(0|ot(v,140+(0|ar[a>>2])|0)){if(!(a=5+(0|bt(v,0))|0)){a=v=0;break}}else a=4;else a=3;else a=2;else a=1;v=0|ct(v)}else a=v=0}while(0);ar[p>>2]=1,g=0|br(1-(v<<1)|0,a),ar[A+18512>>2]=g,g=1}else g=0;if(m&0!=(0|tr[752+(0|ar[A+18600>>2])>>0])&&0==(0|tr[A+32>>0])&&0==(0|ar[(y=A+18516|0)>>2])?(p=0|ot(v=A+18556|0,23+(0|ar[(a=A+18580|0)>>2])|0),m=0|ar[w>>2],a=p?(a=1<(0|cr[m+10074>>0])?0|ot(v,24+(0|ar[a>>2])|0):0,ar[y>>2]=1,ar[A+18520>>2]=tr[m+10075+a>>0],0|tr[m+10081+a>>0]):(ar[y>>2]=1,ar[A+18520>>2]=0),ar[A+18524>>2]=a):B=33,33==(0|B)&&!g)break;zn(A,e,r,n,t)}}while(0);if(m=1<<o,p=1<<X,B=0|ar[w>>2],y=0|ar[B+5780>>2],B=0|ar[B+5784>>2],ar[(l=A+28|0)>>2]=0,s&&ja(A,e,r,o,0),Ha(A,e,r,n,t,m,0,h,s),!(2<(0|o)|d))return 3!=(0|c)?0:((a=0!=(1&u|0))&&ja(A,i,f,o,1),0|ar[5776+(0|ar[w>>2])>>2]&&Ha(A,(0|i)/(0|y)|0,(0|f)/(0|B)|0,(0|n)/(0|y)|0,(0|t)/(0|B)|0,m,1,h,a),(a=0!=(2&u|0))&&ja(A,i,m+f|0,o,1),(v=2==(0|k))&&Ha(A,(0|i)/(0|y)|0,((0|f)/(0|B)|0)+m|0,(0|n)/(0|y)|0,(0|t)/(0|B)|0,m,1,h,a),(a=0!=(1&b|0))&&ja(A,i,f,o,2),0|ar[5776+(0|ar[w>>2])>>2]&&Ha(A,(0|i)/(0|y)|0,(0|f)/(0|B)|0,(0|n)/(0|y)|0,(0|t)/(0|B)|0,m,2,h,a),(a=0!=(2&b|0))&&ja(A,i,p+f|0,o,2),v&&Ha(A,(0|i)/(0|y)|0,((0|f)/(0|B)|0)+m|0,(0|n)/(0|y)|0,(0|t)/(0|B)|0,m,2,h,a),0);g=0|ar[w>>2];A:do{if(s&0!=(0|tr[g+10071>>0])){do{if(E<<16>>16!=1){if(a=e>>(v=0|ar[g+10428>>2]),v=r>>v,(0|a)<=-1&&sr(48482,48519,118,48539),(0|(m=0|ar[g+10432>>2]))<=(0|a)&&sr(48482,48519,118,48539),(0|v)<=-1&&sr(48543,48519,119,48539),(0|v)<(0|ar[g+10436>>2])){if(o=(0|ar[g+10420>>2])+((0|br(m,v))+a)|0,(0|tr[o>>0])<0)break;v=a=0;break A}sr(48543,48519,119,48539)}}while(0);for(m=A+18556|0,g=A+18580|0,v=a=0;v=(1&(o=0!=(0|ot(m,(0|ar[g>>2])+(a+162)|0))))+v|0,(0|(a=a+1|0))<4&o;);v=(a=v?1-((0|ot(m,170+(0|ar[g>>2])|0))<<1)<<v+-1:0,1)}else v=a=0}while(0);if(ar[l>>2]=a,(a=0!=(1&u|0))&&ja(A,e,r,X,1),0|ar[5776+(0|ar[w>>2])>>2]&&Ha(A,(0|e)/(0|y)|0,(0|r)/(0|B)|0,(0|n)/(0|y)|0,(0|t)/(0|B)|0,p,1,h,a),(Z=2==(0|k))&&((a=0!=(2&u|0))&&ja(A,e,(B<<X)+r|0,X,1),Ha(A,(0|e)/(0|y)|0,((0|r)/(0|B)|0)+p|0,(0|n)/(0|y)|0,((0|t)/(0|B)|0)+p|0,p,1,h,a)),v){for(m=A+18556|0,g=A+18580|0,v=a=0;v=(1&(u=0!=(0|ot(m,(0|ar[g>>2])+(a+166)|0))))+v|0,(0|(a=a+1|0))<4&u;);a=v?1-((0|ot(m,171+(0|ar[g>>2])|0))<<1)<<v+-1:0}else a=0;return ar[l>>2]=a,(a=0!=(1&b|0))&&ja(A,e,r,X,2),0|ar[5776+(0|ar[w>>2])>>2]&&Ha(A,(0|e)/(0|y)|0,(0|r)/(0|B)|0,(0|n)/(0|y)|0,(0|t)/(0|B)|0,p,2,h,a),Z&&((a=0!=(2&b|0))&&ja(A,e,(B<<X)+r|0,X,2),Ha(A,(0|e)/(0|y)|0,((0|r)/(0|B)|0)+p|0,(0|n)/(0|y)|0,((0|t)/(0|B)|0)+p|0,p,2,h,a)),0}function ja(A,e,r,i,f){e|=0,r|=0,i|=0,f|=0;var n,t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p,y,B,E,X,W,I,C,G,V,F,R,N,_,Y,Q,D,J,M,T,U,S,O,z=0,j=0,H=0,x=0,P=0,L=0,K=0,q=0,$=0,AA=0,eA=0,rA=0,iA=0,fA=0,nA=0,tA=0,oA=0,aA=0,cA=0,lA=0,uA=0,bA=0;if(ur=(J=ur)+160|0,iA=J+144|0,_=J+80|0,Q=(Y=J)+64|0,D=J+48|0,N=J+32|0,rA=(fA=0|ar[(A|=0)+18596>>2])+764|0,z=e>>(j=0|ar[fA+10368>>2]),j=r>>j,(0|z)<=-1&&sr(48482,48519,118,48539),(0|(H=0|ar[fA+10372>>2]))<=(0|z)&&sr(48482,48519,118,48539),(0|j)<=-1&&sr(48543,48519,119,48539),(0|j)>=(0|ar[fA+10376>>2])&&sr(48543,48519,119,48539),AA=(0|ar[fA+10360>>2])+(3*((0|br(H,j))+z|0)|0)|0,AA=(65535&(cr[AA>>0]|cr[AA+1>>0]<<8))>>>8&3,(R=0==(0|f))&&(K=e>>(uA=0|ar[fA+10448>>2]),L=r>>uA,q=(x=1<<(uA=i-uA|0))+L|0,31!=(0|uA))){H=x+K|0,x=fA+10452|0,P=fA+10440|0,z=L;do{for(j=K;uA=(0|br(0|ar[x>>2],z))+j|0,uA=(0|ar[P>>2])+uA|0,tr[uA>>0]=-128|tr[uA>>0],(0|(j=j+1|0))<(0|H););z=z+1|0}while((0|z)<(0|q))}z=0!=(0|tr[fA+5945>>0])&&0==(0|tr[A+32>>0])&&(0|ar[fA+10100>>2])>=(0|i)?255&(0|ot(A+18556|0,(0|ar[A+18580>>2])+(0|f?142:141)|0)):0,tr[(uA=A+33+f|0)>>0]=z,tr[(F=A+36|0)>>0]=0;do{if(AA<<16>>16==1&&0!=(0|tr[fA+5751>>0])){if(0==(0|tr[uA>>0])&&0==(0|tr[A+32>>0])){bA=23;break}H=0!=(0|f)&1,lA=255&(0|ot(j=A+18556|0,143+(0|ar[(z=A+18580|0)>>2])+H|0)),(tr[F>>0]=lA)<<24>>24&&(lA=255&(0|ot(j,145+(0|ar[z>>2])+H|0)),tr[A+37>>0]=lA)}else bA=23}while(0);if(23==(0|bA)&&(tr[F>>0]=0),z=R?2:0,0==(0|tr[uA>>0])&&0==(0|tr[A+32>>0])||(z|=1),x=25+(0|ar[(V=A+18580|0)>>2])|0,$=(cA=i<<1)+-1|0,lA=i+-2|0,L=R?i+1>>2:lA,K=R?(3*lA|0)+(i+-1>>2)|0:15,1<(0|cA)){for(q=A+18556|0,j=$,H=0;j=(cA=0==(0|ot(q,x+((H>>L)+K)|0)))?H:j,(0|(H=H+1|0))<(0|$)&(1^cA););for(P=43+(0|ar[V>>2])|0,x=$,H=0;x=(cA=0==(0|ot(q,P+((H>>L)+K)|0)))?H:x,(0|(H=H+1|0))<(0|$)&(1^cA););}else j=x=$;if(H=(j>>1)-1|0,3<(0|j)&&(j=(0|ut(A+18556|0,H))+((1&j|2)<<H)|0),H=(x>>1)-1|0,L=3<(0|x)?(0|ut(A+18556|0,H))+((1&x|2)<<H)|0:x,cA=AA<<16>>16==0){do{if(R){if(H=e>>(x=0|ar[fA+10408>>2]),x=r>>x,(0|H)<=-1&&sr(48482,48519,118,48539),(0|(P=0|ar[fA+10412>>2]))<=(0|H)&&sr(48482,48519,118,48539),(0|x)<=-1&&sr(48543,48519,119,48539),(0|x)<(0|ar[fA+10416>>2])){eA=(0|ar[fA+10400>>2])+((0|br(P,x))+H)|0,eA=0|tr[eA>>0];break}sr(48543,48519,119,48539)}else{if(H=e>>(x=0|ar[fA+10428>>2]),x=r>>x,(0|H)<=-1&&sr(48482,48519,118,48539),(0|(P=0|ar[fA+10432>>2]))<=(0|H)&&sr(48482,48519,118,48539),(0|x)<=-1&&sr(48543,48519,119,48539),(0|x)<(0|ar[fA+10436>>2])){eA=(0|ar[fA+10420>>2])+((0|br(P,x))+H)|0,eA=63&tr[eA>>0];break}sr(48543,48519,119,48539)}}while(0);H=(aA=2==(0|(x=0|function(A,e,r,i){e|=0,r|=0,i|=0;var f=0;switch(0|(A|=0)){case 2:break;case 3:f=2;break;default:return 0}return 2==(0|f)&&0|r&&3!=(0|ar[i+5012>>2])?0:0|((e+-6|0)>>>0<9?2:(e+-22|0)>>>0<9&1)}(i,255&eA,f,rA))))?j:L,j=aA?L:j}else x=0,H=L;G=0|_a(lA,x),aA=0|_a(2,x),M=iA,T=j,U=H,S=x,O=i,M|=0,T|=0,U|=0,O=(0|ar[7852+(24*(S|=0)|0)+((O|=0)<<2)>>2])+((U<<O)+T<<1)|0,O=cr[O>>0]|cr[O+1>>0]<<8,tr[M>>0]=O,tr[M+1>>0]=O>>8,C=0|tr[iA+1>>0],E=0|cr[iA>>0],vb(0|_,0,1<<lA<<lA|0),W=A+18556|(or[(X=A+14404+(f<<1)|0)>>1]=0),I=0!=(0|f)&1,u=0!=(0|x)&1,b=(255&C)-1|0,s=fA+5749|0,d=A+32|0,k=R?42:43,h=C<<24>>24!=0,w=0<(0|f),v=fA+10408|0,m=fA+10412|0,g=fA+10416|0,Z=fA+10400|0,p=fA+5750|0,y=fA+5936|0,B=fA+5755|0,o=A+18588+z|0,a=fA+10428|0,c=fA+10432|0,l=fA+10436|0,n=fA+10420|0,t=1<(255&C),z=1,oA=E,j=AA=0;A:for(;;){K=0|tr[G+(oA<<1)>>0],q=0|tr[G+(oA<<1)+1>>0],(0|oA)<(0|E)&0!=(0|oA)?(tA=1&(tA=0|cr[_+((x=(H=255&q)<<lA)+(P=255&K))>>0])|tA>>>1,0|ot(W,(0|ar[V>>2])+((R?tA:tA+2|0)+61)|0)?(L=1,bA=59):(x=1,H=0)):0==(0|oA)|(0|oA)==(0|E)?(L=0,H=x=255&q,x<<=lA,P=255&K,bA=59):H=x=0,59==(0|bA)&&(x=_+(P+-1+x)|(bA=0),K<<24>>24&&(tr[x>>0]=1|tr[x>>0]),H=_+((H+-1<<lA)+P)|0,H=(x=(q<<24>>24&&(tr[H>>0]=2|tr[H>>0]),L),1));do{if(H){if(tA=($=255&K)<<2,nA=(q&=255)<<2,q=0|ar[57308+(lA<<6)+(I<<5)+(u<<4)+(cr[_+((q<<lA)+$)>>0]<<2)>>2],($=(0|oA)==(0|E))?(or[Y>>1]=1,tr[N>>0]=1,tr[Q>>0]=C,t?(K=b,H=x,x=1,bA=67):(H=x,x=1)):(K=15,H=x,x=0,bA=67),67==(0|bA))for(;;){P=((bA=0)|cr[aA+(K<<1)>>0])+tA|0,L=(0|cr[aA+(K<<1)+1>>0])+nA|0;do{if(0|tr[s>>0]){if(0|tr[d>>0]){P=k;break}0|tr[uA>>0]?P=k:bA=70}else bA=70}while(0);if(70==(0|bA)&&(P=(bA=0)|cr[q+(P+(L<<i))>>0]),0|ot(W,(0|ar[V>>2])+(P+65)|0)&&(or[Y+(x<<1)>>1]=1,tr[N+x>>0]=1,tr[Q+x>>0]=K,x=x+1|(H=0)),!(1<(0|K)))break;K=K+-1|0,bA=67}do{if(h|1^$){if(0|H){or[Y+(x<<1)>>1]=1,fA=x+(tr[N+x>>0]=1)|(tr[Q+x>>0]=0);break}do{if(0|tr[s>>0]){if(0|tr[d>>0]){H=k;break}0|tr[uA>>0]?H=k:bA=78}else bA=78}while(0);if(78==(0|bA)&&(H=(bA=0)|cr[q+((nA<<i)+tA)>>0]),!(0|ot(W,(0|ar[V>>2])+(H+65)|0))){fA=x;break}or[Y+(x<<1)>>1]=1,fA=x+(tr[N+x>>0]=1)|(tr[Q+x>>0]=0)}else fA=x}while(0);if(fA){q=0==(0|z)|(w|0==(0|oA)?0:2),L=(0|fA)<8?fA:8,$=0<(0|fA);do{if($){if(K=q<<2,w)for(P=0,x=-1,z=1,H=AA;j=P?0<(0|j)?1==(0|H)?0:j+1|0:j:1,z=(H=0|ot(W,(0|ar[V>>2])+(((0|j)<3?j:3)+K+125)|0))?(or[(z=Y+(P<<1)|0)>>1]=1+(0|or[z>>1])<<16>>16,x=-1==(0|x)?P:x,0):((z+-1|(tr[N+P>>0]=0))>>>0<2&1)+z|0,(0|(P=P+1|0))<(0|L););else for(P=0,x=-1,z=1,H=AA;j=P?0<(0|j)?1==(0|H)?0:j+1|0:j:1,z=(H=0|ot(W,(0|ar[V>>2])+(((0|j)<3?j:3)+K+109)|0))?(or[(z=Y+(P<<1)|0)>>1]=1+(0|or[z>>1])<<16>>16,x=-1==(0|x)?P:x,0):((z+-1|(tr[N+P>>0]=0))>>>0<2&1)+z|0,(0|(P=P+1|0))<(0|L););if(-1==(0|x))break;iA=0|ot(W,(0|ar[V>>2])+((w?4|q:q)+133)|0),or[(rA=Y+(x<<1)|0)>>1]=(0|lr[rA>>1])+iA,tr[N+x>>0]=iA}else z=1,H=AA}while(0);if(R){if(x=e>>(P=0|ar[v>>2]),P=r>>P,(0|x)<=-1){bA=102;break A}if((0|(L=0|ar[m>>2]))<=(0|x)){bA=102;break A}if((0|P)<=-1){bA=105;break A}if((0|P)>=(0|ar[g>>2])){bA=105;break A}x=(0|ar[Z>>2])+((0|br(L,P))+x)|0,x=0|tr[x>>0]}else{if(x=e>>(P=0|ar[a>>2]),P=r>>P,(0|x)<=-1){bA=109;break A}if((0|(L=0|ar[c>>2]))<=(0|x)){bA=109;break A}if((0|P)<=-1){bA=112;break A}if((0|P)>=(0|ar[l>>2])){bA=112;break A}x=(0|ar[n>>2])+((0|br(L,P))+x)|0,x=63&tr[x>>0]}e:do{if(0|tr[d>>0])P=0;else{do{if(cA){if(!(0|tr[p>>0]))break;if((16|x)<<24>>24==26&0!=(0|tr[uA>>0])){P=0;break e}}}while(0);if(0|tr[F>>0]){P=0;break}P=3<((0|tr[Q>>0])-(0|tr[Q+(fA+-1)>>0])|0)&1}}while(0);if(iA=fA+-1|0,1<(0|fA))for(x=0;rA=255&(0|ct(W)),tr[D+x>>0]=rA,(0|(x=x+1|0))!=(0|iA););if(x=(rA=0!=(0|P))&0!=(0|tr[y>>0])?0:255&(0|ct(W)),tr[D+iA>>0]=x,x=0|tr[B>>0]?(0|cr[o>>0])>>>2&255:0,!$)break;$=1,P=eA=0;do{AA=0|or[Y+(eA<<1)>>1];do{if(0|tr[N+eA>>0]){for(K=-1;;){if(L=K+1|0,q=0|ct(W),63<(0|K)){q=0;break}if(!q){bA=130;break}K=L}if(130==(0|bA)&&(((bA=0)|L)<4?K=0|ut(W,x):(K=0|ut(W,(L=K+-2|0)+x|0),L=2+(1<<L)|0),q=(L<<x)+K|0),K=0==(0|tr[B>>0]),L=x+1|0,x=(3<<x|0)<(q+AA|0)?!K||(0|L)<4?L:4:x,K|1^$){$=0;break}if((3<<(K=(255&(L=0|tr[o>>0]))>>>2&255)|0)<=(0|q)){tr[o>>0]=L+1<<24>>24,$=0;break}if(L<<24>>24==0|(1<<K|0)<=(q<<1|0)){$=0;break}tr[o>>0]=L+-1<<24>>24,$=0}else q=0}while(0);K=q+AA|0,L=65535&(q=0==(0|tr[D+eA>>0])?K:0-(65535&K)|0);do{if(rA&0!=(0|tr[y>>0])){if((0|eA)!=(0|iA)|0==(1&(P=K+P|0)|0))break;L=0-q&65535}}while(0);AA=0|tr[Q+eA>>0],q=(0|cr[aA+(AA<<1)>>0])+tA|0,AA=(0|cr[aA+(AA<<1)+1>>0])+nA|0,or[A+2116+(f<<11)+(or[X>>1]<<1)>>1]=L,or[A+8260+(f<<11)+(or[X>>1]<<1)>>1]=q+(AA<<i),or[X>>1]=1+(0|or[X>>1])<<16>>16,eA=eA+1|0}while((0|eA)!=(0|fA))}else H=AA}else H=AA}while(0);if(!(0<(0|oA))){bA=54;break}oA=oA+-1|0,AA=H}return 54==(0|bA)?ur=J:102==(0|bA)?sr(48482,48519,118,48539):105==(0|bA)?sr(48543,48519,119,48539):109==(0|bA)?sr(48482,48519,118,48539):112==(0|bA)&&sr(48543,48519,119,48539),0}function Ha(A,e,r,i,f,n,t,o,a){e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0;var c,l,u,b=0,s=0,d=0;if(c=0|ar[(l=(A|=0)+18596|0)>>2],u=0==(0|o)){do{if(t){if(o=0|br(0|ar[5780+c>>2],e),s=0|br(0|ar[5784+c>>2],r),o>>=b=0|ar[10428+c>>2],b=s>>b,(0|o)<=-1&&sr(48482,48519,118,48539),(0|(s=0|ar[10432+c>>2]))<=(0|o)&&sr(48482,48519,118,48539),(0|b)<=-1&&sr(48543,48519,119,48539),(0|b)<(0|ar[10436+c>>2])){d=(0|ar[10420+c>>2])+((0|br(s,b))+o)|0,d=63&tr[d>>0];break}sr(48543,48519,119,48539)}else{if(o=e>>(b=0|ar[10408+c>>2]),b=r>>b,(0|o)<=-1&&sr(48482,48519,118,48539),(0|(s=0|ar[10412+c>>2]))<=(0|o)&&sr(48482,48519,118,48539),(0|b)<=-1&&sr(48543,48519,119,48539),(0|b)<(0|ar[10416+c>>2])){d=(0|ar[10400+c>>2])+((0|br(s,b))+o)|0,d=0|tr[d>>0];break}sr(48543,48519,119,48539)}}while(0);Gt(c,e,r,b=34<(255&d)?1:255&d,n,t);do{if(0|tr[5750+(0|ar[l>>2])>>0]){if(0==(0|tr[A+32>>0])&&0==(0|tr[A+33+t>>0])){o=0;break}o=26==(16|b)}else o=0}while(0);o=26==(0|b)&o?2:1&o}else o=0|tr[A+36>>0]?0|tr[A+37>>0]?2:1:0;a?jn(A,e,r,i,f,n,t,0!=(0|tr[A+33+t>>0]),u,o):t&&0|ar[A+28>>2]&&jn(A,e,r,i,f,n,t,(or[A+14404+(t<<1)>>1]=0)!=(0|tr[A+33+t>>0]),u,0)}function xa(A,e,r,i){e|=0,r|=0,i|=0;var f,n,t=0,o=0,a=0,c=0,l=0,u=0;ur=(n=ur)+16|0,l=n,t=0|ot(c=(A|=0)+18556|0,150+(0|ar[(r=A+18580|0)>>2])|0),e=0|ot(c,150+(0|ar[r>>2])|0),o=(t=0==(0|t))?0:0|ot(c,151+(0|ar[r>>2])|0),a=(f=0==(0|e))?0:0|ot(c,151+(0|ar[r>>2])|0),t?(r=l,e=0,u=11):(t=o?0|bt(c,1):-1,o=0|ct(c),e=t+2|0,ar[l>>2]=e,o?(r=l,e=-2-t|0,u=11):o=e),11==(0|u)&&(o=ar[r>>2]=e);do{if(!f){if(t=a?0|bt(c,1):-1,u=0|ct(c),e=t+2|0,ar[(r=l+4|0)>>2]=e,u){e=-2-t|0;break}return u=e,c=65535&o,or[(l=A+18+(i<<2)|0)>>1]=c,u&=65535,or[(i=A+18+(i<<2)+2|0)>>1]=u,void(ur=n)}r=l+4|0,e=0}while(0);u=ar[r>>2]=e,c=65535&o,or[(l=A+18+(i<<2)|0)>>1]=c,u&=65535,or[(i=A+18+(i<<2)+2|0)>>1]=u,ur=n}function Pa(A,e,r){A|=0;var i,f,n,t,o,a,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0;if(l=0|tr[(r|=0)+93784+(4400*(0|ar[(e|=0)+8>>2])|0)+2>>0],d=0|it(A),7<(tr[(a=e+380|0)>>0]=d)>>>0)return(w=0)|w;d=r+11096+(5168*l|0)+476|0;do{if(0|ar[d>>2]){if(c=0|ft(A),7<(c=(0|cr[a>>0])+c|0)>>>0)return(w=0)|w;tr[(s=e+381|0)>>0]=c;break}s=e+381|0}while(0);n=e+332|0,t=e+328|0,o=r+11096+(5168*l|0)+5164|0,i=r+11096+(5168*l|0)+5160|0,f=e+20|0,b=0;A:for(;;){if(c=0==(0|b))w=10;else if(1==(0|b)){if(0|ar[f>>2]){c=1,w=27;break}w=10}if(10==(0|w)&&(h=(w=0)<(0|(k=0|ar[(c?t:n)>>2])))){for(c=0;u=255&(0|At(A,1)),tr[e+382+(b<<4)+c>>0]=u,(0|(c=c+1|0))!=(0|k););if(0!=(0|ar[d>>2])&h)for(c=0;u=255&(0|At(A,1)),tr[e+414+(b<<4)+c>>0]=u,(0|(c=c+1|0))!=(0|k););if(h){u=0;do{if(0|tr[e+382+(b<<4)+u>>0]){if(255<((c=0|ft(A))+128|0)>>>0){c=0,w=27;break A}if(or[e+446+(b<<5)+(u<<1)>>1]=(1<<cr[a>>0])+c,c=0|ft(A),!((0-(l=0|ar[i>>2])|0)<=(0|c)&(0|c)<(0|l))){c=0,w=27;break A}c&=255}else or[e+446+(b<<5)+(u<<1)>>1]=1<<cr[a>>0],c=0;if(tr[e+510+(b<<4)+u>>0]=c,0|tr[e+414+(b<<4)+u>>0]){if(255<((c=0|ft(A))+128|0)>>>0){c=0,w=27;break A}if(or[(l=e+542+(b<<6)+(u<<2)|0)>>1]=(1<<cr[s>>0])+c,c=0|ft(A),r=0|ar[o>>2],!((0|c)>=(0|br(r,-4))&(0|c)<(r<<2|0))){c=0,w=27;break A}if(c=r+c-((l=0|br(0|or[l>>1],r))>>cr[s>>0])|0,l=0-r|0,tr[e+670+(b<<5)+(u<<1)>>0]=(0|c)<(0|l)?l:(0|c)<(0|r)?c:r+255|0,255<((c=0|ft(A))+128|0)>>>0){c=0,w=27;break A}if(or[(l=e+542+(b<<6)+(u<<2)+2|0)>>1]=(1<<cr[s>>0])+c,c=0|ft(A),r=0|ar[o>>2],!((0|c)>=(0|br(r,-4))&(0|c)<(r<<2|0))){c=0,w=27;break A}c=255&((0|(c=r+c-((l=0|br(0|or[l>>1],r))>>cr[s>>0])|0))<(0|(l=0-r|0))?l:(0|c)<(0|r)?c:r+255|0)}else c=1<<cr[s>>0]&65535,or[e+542+(b<<6)+(u<<2)>>1]=c,tr[e+670+(b<<5)+(u<<1)>>0]=0,or[e+542+(b<<6)+(u<<2)+2>>1]=c,c=0;tr[e+670+(b<<5)+(u<<1)+1>>0]=c,u=u+1|0}while((0|u)<(0|k))}}if(2<=(0|(b=b+1|0))){c=1,w=27;break}}return 27==(0|w)?0|c:0}function La(A){var e=0,r=0,i=0;for(ar[(A|=0)>>2]=0,tr[A+4>>0]=0,tr[A+5>>0]=0,ar[A+8>>2]=0,e=A+16|(tr[A+12>>0]=0),ar[A+28>>2]=0,tr[A+32>>0]=0,ar[e>>2]=0,ar[e+4>>2]=0,gc(A+34|(or[e+8>>1]=0)),ar[A+136>>2]=0,ar[A+140>>2]=0,e=ar[A+144>>2]=0;tr[A+148+e>>0]=0,ar[A+164+(e<<2)>>2]=0,tr[A+228+e>>0]=0,16!=((tr[A+244+e>>0]=0)|(e=e+1|(ar[A+260+(e<<2)>>2]=0))););for(e=A+324|0,ar[A+376>>2]=0,tr[A+380>>0]=0,i=(r=e)+48|(tr[A+381>>0]=0);(0|(r=r+4|(ar[r>>2]=0)))<(0|i););for(e=tr[e+48>>0]=0;tr[A+382+e>>0]=0,tr[A+414+e>>0]=0,or[A+446+(e<<1)>>1]=0,tr[A+510+e>>0]=0,or[A+542+(e<<2)+2>>1]=0,or[A+542+(e<<2)>>1]=0,16!=((tr[A+670+(e<<1)+1>>0]=0)|(e=e+1|(tr[A+670+(e<<1)>>0]=0))););for(e=0;tr[A+398+e>>0]=0,tr[A+430+e>>0]=0,or[A+478+(e<<1)>>1]=0,tr[A+526+e>>0]=0,or[A+606+(e<<2)+2>>1]=0,or[A+606+(e<<2)>>1]=0,16!=((tr[A+702+(e<<1)+1>>0]=0)|(e=e+1|(tr[A+702+(e<<1)>>0]=0))););for(r=A+736|0,ar[A+756>>2]=0,ar[A+760>>2]=0,tr[A+764>>0]=0,ar[A+768>>2]=0,ar[A+772>>2]=0,ar[r>>2]=0,ar[r+4>>2]=0,ar[r+8>>2]=0,ar[r+12>>2]=0,or[r+16>>1]=0,r=(tr[r+18>>0]=0)|ar[A+776>>2],(0|(e=0|ar[(i=A+780|0)>>2]))!=(0|r)&&(ar[i>>2]=e+(~((e+-4-r|0)>>>2)<<2)),ar[(e=A+788|0)>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[e+16>>2]=0,gc(A+812|(ar[e+20>>2]=0)),e=ar[A+912>>2]=0;ar[A+916+(e<<6)>>2]=0,ar[A+1044+(e<<6)>>2]=0,ar[A+1172+(e<<6)>>2]=0,tr[A+1300+(e<<4)>>0]=0,ar[A+916+(e<<6)+4>>2]=0,ar[A+1044+(e<<6)+4>>2]=0,ar[A+1172+(e<<6)+4>>2]=0,tr[A+1300+(e<<4)+1>>0]=0,ar[A+916+(e<<6)+8>>2]=0,ar[A+1044+(e<<6)+8>>2]=0,ar[A+1172+(e<<6)+8>>2]=0,tr[A+1300+(e<<4)+2>>0]=0,ar[A+916+(e<<6)+12>>2]=0,ar[A+1044+(e<<6)+12>>2]=0,ar[A+1172+(e<<6)+12>>2]=0,tr[A+1300+(e<<4)+3>>0]=0,ar[A+916+(e<<6)+16>>2]=0,ar[A+1044+(e<<6)+16>>2]=0,ar[A+1172+(e<<6)+16>>2]=0,tr[A+1300+(e<<4)+4>>0]=0,ar[A+916+(e<<6)+20>>2]=0,ar[A+1044+(e<<6)+20>>2]=0,ar[A+1172+(e<<6)+20>>2]=0,tr[A+1300+(e<<4)+5>>0]=0,ar[A+916+(e<<6)+24>>2]=0,ar[A+1044+(e<<6)+24>>2]=0,ar[A+1172+(e<<6)+24>>2]=0,tr[A+1300+(e<<4)+6>>0]=0,ar[A+916+(e<<6)+28>>2]=0,ar[A+1044+(e<<6)+28>>2]=0,ar[A+1172+(e<<6)+28>>2]=0,tr[A+1300+(e<<4)+7>>0]=0,ar[A+916+(e<<6)+32>>2]=0,ar[A+1044+(e<<6)+32>>2]=0,ar[A+1172+(e<<6)+32>>2]=0,tr[A+1300+(e<<4)+8>>0]=0,ar[A+916+(e<<6)+36>>2]=0,ar[A+1044+(e<<6)+36>>2]=0,ar[A+1172+(e<<6)+36>>2]=0,tr[A+1300+(e<<4)+9>>0]=0,ar[A+916+(e<<6)+40>>2]=0,ar[A+1044+(e<<6)+40>>2]=0,ar[A+1172+(e<<6)+40>>2]=0,tr[A+1300+(e<<4)+10>>0]=0,ar[A+916+(e<<6)+44>>2]=0,ar[A+1044+(e<<6)+44>>2]=0,ar[A+1172+(e<<6)+44>>2]=0,tr[A+1300+(e<<4)+11>>0]=0,ar[A+916+(e<<6)+48>>2]=0,ar[A+1044+(e<<6)+48>>2]=0,ar[A+1172+(e<<6)+48>>2]=0,tr[A+1300+(e<<4)+12>>0]=0,ar[A+916+(e<<6)+52>>2]=0,ar[A+1044+(e<<6)+52>>2]=0,ar[A+1172+(e<<6)+52>>2]=0,tr[A+1300+(e<<4)+13>>0]=0,ar[A+916+(e<<6)+56>>2]=0,ar[A+1044+(e<<6)+56>>2]=0,ar[A+1172+(e<<6)+56>>2]=0,tr[A+1300+(e<<4)+14>>0]=0,ar[A+916+(e<<6)+60>>2]=0,ar[A+1044+(e<<6)+60>>2]=0,2!=((ar[A+1172+(e<<6)+60>>2]=0)|(e=e+1|(tr[A+1300+(e<<4)+15>>0]=0))););e=0|ar[A+1344>>2],(0|(i=0|ar[(r=A+1348|0)>>2]))!=(0|e)&&(ar[r>>2]=i+(~((i+-4-e|0)>>>2)<<2)),tr[(A=A+1340|0)>>0]=0}function Ka(){var A=0,e=0,r=0,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0;if(!(A=0|yc(11296)))return(g=0)|g;vb(0|A,-1,11296),ar[14327]=A,ar[14328]=A,ar[14329]=A,ar[14330]=A,ar[14331]=A,ar[14332]=A,ar[14333]=A,b=(ar[14334]=A)+16|0,ar[14335]=b,ar[14336]=b,ar[14337]=b,ar[14338]=b,ar[14339]=b,ar[14340]=b,ar[14341]=b,ar[14342]=b,ar[14343]=A+32,ar[14344]=A+96,ar[14345]=A+160,ar[14346]=A+224,ar[14347]=A+288,ar[14348]=A+352,ar[14349]=A+416,ar[14350]=A+480,ar[14351]=A+544,ar[14352]=A+608,ar[14353]=A+672,ar[14354]=A+736,ar[14355]=A+800,ar[14356]=A+864,ar[14357]=A+928,ar[14358]=A+992,b=A+1056|0,ar[14359]=b,ar[14363]=b,b=A+1312|0,ar[14360]=b,ar[14364]=b,b=A+1568|0,ar[14361]=b,ar[14365]=b,b=A+1824|0,ar[14362]=b,ar[14366]=b,b=A+2080|0,ar[14367]=b,ar[14371]=b,b=A+2336|0,ar[14368]=b,ar[14372]=b,b=A+2592|0,ar[14369]=b,ar[14373]=b,b=A+2848|0,ar[14370]=b,ar[14374]=b,b=A+3104|0,ar[14375]=b,ar[14379]=b,b=A+4128|0,ar[14376]=b,ar[14380]=b,b=A+5152|0,ar[14377]=b,ar[14381]=b,b=A+6176|0,ar[14378]=b,ar[14382]=b,b=A+7200|0,ar[14383]=b,ar[14387]=b,b=A+8224|0,ar[14384]=b,ar[14388]=b,b=A+9248|0,ar[14385]=b,ar[14389]=b,b=A+10272|0,ar[14386]=b,ar[14390]=b,b=2;A:for(;;){d=1==(0|(h=(s=1<<b)>>2)),k=b+-2|0,h=2==(0|h),u=0;do{w=0==(0|u),l=0;do{v=0==(0|l)?9:15,c=0;do{m=57308+(k<<6)+(u<<5)+(l<<4)+(c<<2)|0,a=0;do{if(i=a<<2,g=a<<b,f=0-a|0,n=a>>2,o=0==(0|(t=3&a))?2:1==(0|t)&1,d){e=0;do{if(A=0|cr[41489+(e+i)>>0],A=w?A:A+27|0,r=(0|ar[m>>2])+(e+g)|0,!((o=0|tr[r>>0])<<24>>24==-1|(255&o|0)==(0|A))){e=28;break A}tr[r>>0]=A,e=e+1|0}while((0|e)<(0|s))}else{r=0;do{do{if((0|r)!=(0|f)){switch(e=r>>2,A=3&r,0|c){case 0:A=2<(A=A+t|0)>>>0?0:0|A?1:2;break;case 1:A=o;break;case 2:A=0==(0|A)?2:1==(0|A)&1;break;default:A=2}if(w){if(A=0<(e+n|0)?A+3|0:A,h){A=A+v|0;break}A=A+21|0;break}if(h){A=A+9|0;break}A=A+12|0;break}A=0}while(0);if(A=w?A:A+27|0,e=(0|ar[m>>2])+(r+g)|0,!((i=0|tr[e>>0])<<24>>24==-1|(255&i|0)==(0|A))){e=28;break A}tr[e>>0]=A,r=r+1|0}while((0|r)<(0|s))}a=a+1|0}while((0|a)<(0|s));c=c+1|0}while((0|c)<4);l=l+1|0}while((0|l)<2);u=u+1|0}while((0|u)<2);if(6<=(0|(b=b+1|0))){A=1,e=30;break}}if(28==(0|e))sr(41505,39242,2100,41581);else if(30==(0|e))return 0|A;return 0}function qa(){Bc(0|ar[14327]),ar[14327]=0}function $a(A){var e,r=0;for(ar[(A|=0)+4720>>2]=0,ar[A+4724>>2]=0,function(A){var e,r=0,i=0;for(tr[(A|=0)>>0]=0,or[(r=A+2|0)>>1]=0,or[r+2>>1]=0,or[r+4>>1]=0,tr[r+6>>0]=0,ar[A+12>>2]=5,tr[A+16>>0]=0,tr[A+17>>0]=0,tr[A+18>>0]=2,tr[A+19>>0]=2,tr[A+20>>0]=2,ar[A+48>>2]=0,ar[A+52>>2]=0,r=A+60|(tr[A+56>>0]=0),e=(i=A+21|0)+24|0;(0|(i=i+1|(tr[i>>0]=0)))<(0|e););ar[r>>2]=1,tr[A+64>>0]=0,tr[A+65>>0]=0,tr[A+66>>0]=0,tr[A+67>>0]=1,tr[A+68>>0]=0,or[A+70>>1]=0,tr[A+72>>0]=2,tr[A+73>>0]=1,tr[A+74>>0]=15,tr[A+75>>0]=15}(A+4904|(ar[A+4728>>2]=0)),e=(r=A+4984|0)+9|0;(0|(r=r+1|(tr[r>>0]=0)))<(0|e););tr[A>>0]=0}function Ac(A){var e,r;(r=0|ar[(A|=0)+4720>>2])&&((0|(e=0|ar[(A=A+4724|0)>>2]))!=(0|r)&&(ar[A>>2]=e+(100*~(((e-100-r|0)>>>0)/100|0)|0)),vu(r))}function ec(A,e,r,i){A|=0,e|=0,r|=0,i|=0;var f,n,t,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0;ur=(t=ur)+6240|0,n=(f=t)+96|0,l=0;A:for(;;){k=(d=3==(0|l))?2:6,w=3!=(0|l),b=(h=0==(0|l))?16:64,s=1<(0|l),u=0;do{c=n+(u<<10)|0,o=d&1==(0|u);do{if(!((255&(0|At(A,1)))<<24>>24)){if(-99999==(0|(e=0|it(A)))|(0|u)<(0|e)){a=31;break A}if(ar[(i=f+(24*l|0)+(u<<2)|0)>>2]=16,0|e){if(!(w|1==(0|e))){a=13;break A}hb(0|c,n+((o=u-e|0)<<10)|0,0|b),o=0|ar[f+(24*l|0)+(o<<2)>>2],ar[i>>2]=o,a=21;break}if(h){for(i=41646,o=(e=c)+16|0;tr[e>>0]=0|tr[i>>0],i=i+1|0,(0|(e=e+1|0))<(0|o););a=22;break}if((0|u)<3&(1^o)){for(i=41662,o=(e=c)+64|0;tr[e>>0]=0|tr[i>>0],i=i+1|0,(0|(e=e+1|0))<(0|o););o=16,a=21;break}for(i=41726,o=(e=c)+64|0;tr[e>>0]=0|tr[i>>0],i=i+1|0,(0|(e=e+1|0))<(0|o););o=16,a=21;break}if(s){if(254<((e=0|ft(A))+7|0)>>>0){a=31;break A}o=e+8|0,e=ar[f+(24*l|0)+(u<<2)>>2]=o}else e=8,o=16;for(a=0;;){if(255<((i=0|ft(A))+128|0)>>>0){a=31;break A}if(e=(e+256+i|0)%256|0,tr[n+(u<<10)+a>>0]=e,(0|b)<=(0|(a=a+1|0))){a=21;break}}}while(0);e:do{if(21==(0|a))switch((a=0)|l){case 0:a=22;break e;case 1:for(i=0|_a(3,0),e=0;tr[((0|cr[i+(e<<1)+1>>0])<<3)+(0|cr[i+(e<<1)>>0])+(r+96+(u<<6))>>0]=0|tr[n+(u<<10)+e>>0],64!=(0|(e=e+1|0)););break;case 2:for(i=0|_a(3,0),e=0;c=i+(e<<1)|0,v=i+(e<<1)+1|0,m=0|tr[n+(u<<10)+e>>0],tr[((0|cr[v>>0])<<5)+((0|cr[c>>0])<<1)+(r+480+(u<<8))>>0]=m,tr[((0|cr[c>>0])<<1|1)+((0|cr[v>>0])<<5)+(r+480+(u<<8))>>0]=m,tr[((0|cr[v>>0])<<5|16)+((0|cr[c>>0])<<1)+(r+480+(u<<8))>>0]=m,tr[((0|cr[v>>0])<<5|16)+((0|cr[c>>0])<<1|1)+(r+480+(u<<8))>>0]=m,64!=(0|(e=e+1|0)););tr[r+480+(u<<8)>>0]=o;break e;case 3:fc(m=r+2016+(u<<10)|0,c,3),tr[m>>0]=o;break e;default:break e}}while(0);if(22==(0|a))for(i=0|_a(2,0),e=0;tr[((0|cr[i+(e<<1)+1>>0])<<2)+(0|cr[i+(e<<1)>>0])+(r+(u<<4))>>0]=0|tr[n+(u<<10)+e>>0],16!=(0|(e=e+1|0)););u=u+1|0}while((0|u)<(0|k));if(4<=(0|(l=l+1|0))){e=0,a=32;break}}if(13==(0|a))sr(41810,41639,873,41847);else{if(31==(0|a))return ur=t,0|(m=8);if(32==(0|a))return ur=t,0|e}return 0}function rc(A){A|=0;var e=0,r=0,i=0,f=0,n=0,t=0,o=0;for(r=0|_a(2,0),e=0;tr[A+(((0|cr[r+(e<<1)+1>>0])<<2)+(0|cr[r+(e<<1)>>0]))>>0]=0|tr[41646+e>>0],16!=(0|(e=e+1|0)););for(r=0|_a(2,0),e=0;tr[((0|cr[r+(e<<1)+1>>0])<<2)+(0|cr[r+(e<<1)>>0])+(A+16)>>0]=0|tr[41646+e>>0],16!=(0|(e=e+1|0)););for(r=0|_a(2,0),e=0;tr[((0|cr[r+(e<<1)+1>>0])<<2)+(0|cr[r+(e<<1)>>0])+(A+32)>>0]=0|tr[41646+e>>0],16!=(0|(e=e+1|0)););for(r=0|_a(2,0),e=0;tr[((0|cr[r+(e<<1)+1>>0])<<2)+(0|cr[r+(e<<1)>>0])+(A+48)>>0]=0|tr[41646+e>>0],16!=(0|(e=e+1|0)););for(r=0|_a(2,0),e=0;tr[((0|cr[r+(e<<1)+1>>0])<<2)+(0|cr[r+(e<<1)>>0])+(A+64)>>0]=0|tr[41646+e>>0],16!=(0|(e=e+1|0)););for(r=0|_a(2,0),e=0;tr[((0|cr[r+(e<<1)+1>>0])<<2)+(0|cr[r+(e<<1)>>0])+(A+80)>>0]=0|tr[41646+e>>0],16!=(0|(e=e+1|0)););for(r=0|_a(3,0),e=0;tr[((0|cr[r+(e<<1)+1>>0])<<3)+(0|cr[r+(e<<1)>>0])+(A+96)>>0]=0|tr[41662+e>>0],64!=(0|(e=e+1|0)););for(r=0|_a(3,0),e=0;tr[((0|cr[r+(e<<1)+1>>0])<<3)+(0|cr[r+(e<<1)>>0])+(A+288)>>0]=0|tr[41726+e>>0],64!=(0|(e=e+1|0)););for(r=0|_a(3,0),e=0;tr[((0|cr[r+(e<<1)+1>>0])<<3)+(0|cr[r+(e<<1)>>0])+(A+160)>>0]=0|tr[41662+e>>0],64!=(0|(e=e+1|0)););for(r=0|_a(3,0),e=0;tr[((0|cr[r+(e<<1)+1>>0])<<3)+(0|cr[r+(e<<1)>>0])+(A+352)>>0]=0|tr[41726+e>>0],64!=(0|(e=e+1|0)););for(r=0|_a(3,0),e=0;tr[((0|cr[r+(e<<1)+1>>0])<<3)+(0|cr[r+(e<<1)>>0])+(A+224)>>0]=0|tr[41662+e>>0],64!=(0|(e=e+1|0)););for(r=0|_a(3,0),e=0;tr[((0|cr[r+(e<<1)+1>>0])<<3)+(0|cr[r+(e<<1)>>0])+(A+416)>>0]=0|tr[41726+e>>0],64!=(0|(e=e+1|0)););f=0;do{for(r=0|_a(3,0),e=0;i=r+(e<<1)|0,t=41662+e|0,tr[((0|cr[(n=r+(e<<1)+1|0)>>0])<<5)+((0|cr[i>>0])<<1)+(A+480+(f<<8))>>0]=0|tr[t>>0],tr[((0|cr[i>>0])<<1|1)+((0|cr[n>>0])<<5)+(A+480+(f<<8))>>0]=0|tr[t>>0],tr[((0|cr[n>>0])<<5|16)+((0|cr[i>>0])<<1)+(A+480+(f<<8))>>0]=0|tr[t>>0],tr[((0|cr[n>>0])<<5|16)+((0|cr[i>>0])<<1|1)+(A+480+(f<<8))>>0]=0|tr[t>>0],64!=(0|(e=e+1|0)););for(r=f+3|0,i=0|_a(3,0),e=0;t=i+(e<<1)|0,o=41726+e|0,tr[((0|cr[(n=i+(e<<1)+1|0)>>0])<<5)+((0|cr[t>>0])<<1)+(A+480+(r<<8))>>0]=0|tr[o>>0],tr[((0|cr[t>>0])<<1|1)+((0|cr[n>>0])<<5)+(A+480+(r<<8))>>0]=0|tr[o>>0],tr[((0|cr[n>>0])<<5|16)+((0|cr[t>>0])<<1)+(A+480+(r<<8))>>0]=0|tr[o>>0],tr[((0|cr[n>>0])<<5|16)+((0|cr[t>>0])<<1|1)+(A+480+(r<<8))>>0]=0|tr[o>>0],64!=(0|(e=e+1|0)););f=f+1|0}while(3!=(0|f));fc(A+2016|0,41662,3),fc(A+3040|0,41726,3)}function ic(A,e,r){return A|=0,e|=0,e=255&(0|At(r|=0,1)),tr[A>>0]=e,e=255&(0|At(r,1)),tr[A+1>>0]=e,e=255&(0|At(r,1)),tr[A+2>>0]=e,e=255&(0|At(r,1)),tr[A+3>>0]=e,e=255&(0|At(r,1)),tr[A+4>>0]=e,e=255&(0|At(r,1)),tr[A+5>>0]=e,e=255&(0|At(r,1)),tr[A+6>>0]=e,e=255&(0|At(r,1)),tr[A+7>>0]=e,r=255&(0|At(r,1)),tr[A+8>>0]=r,0}function fc(A,e,r){A|=0,e|=0;var i=0,f=0,n=0,t=0,o=0;switch(0|(r|=0)){case 0:for(i=0|_a(2,0),r=0;tr[A+(((0|cr[i+(r<<1)+1>>0])<<2)+(0|cr[i+(r<<1)>>0]))>>0]=0|tr[e+r>>0],16!=(0|(r=r+1|0)););return;case 1:for(i=0|_a(3,0),r=0;tr[A+(((0|cr[i+(r<<1)+1>>0])<<3)+(0|cr[i+(r<<1)>>0]))>>0]=0|tr[e+r>>0],64!=(0|(r=r+1|0)););return;case 2:for(i=0|_a(3,0),r=0;o=i+(r<<1)+1|0,n=e+r|0,tr[A+(((0|cr[(t=i+(r<<1)|0)>>0])<<1)+((0|cr[o>>0])<<5))>>0]=0|tr[n>>0],tr[A+(((0|cr[t>>0])<<1|1)+((0|cr[o>>0])<<5))>>0]=0|tr[n>>0],tr[A+(((0|cr[t>>0])<<1)+((0|cr[o>>0])<<5|16))>>0]=0|tr[n>>0],tr[A+(((0|cr[t>>0])<<1|1)+((0|cr[o>>0])<<5|16))>>0]=0|tr[n>>0],64!=(0|(r=r+1|0)););return;case 3:f=0|_a(3,0),i=0;do{for(n=f+(i<<1)|0,t=f+(i<<1)+1|0,o=e+i|0,r=0;tr[A+(((0|cr[n>>0])<<2)+(((0|cr[t>>0])<<2)+r<<5))>>0]=0|tr[o>>0],tr[A+(((0|cr[n>>0])<<2|1)+(((0|cr[t>>0])<<2)+r<<5))>>0]=0|tr[o>>0],tr[A+(((0|cr[n>>0])<<2|2)+(((0|cr[t>>0])<<2)+r<<5))>>0]=0|tr[o>>0],tr[A+(((0|cr[n>>0])<<2|3)+(((0|cr[t>>0])<<2)+r<<5))>>0]=0|tr[o>>0],4!=(0|(r=r+1|0)););i=i+1|0}while(64!=(0|i));return;default:sr(44456,41639,810,41790)}}function nc(A,e,r,i,f){A|=0,e|=0,i|=0;var n,t=0,o=0,a=0,c=0,l=0;if(ur=(n=ur)+144|0,c=n,4==(0|(r|=0))|1==(0|(f|=0)))ur=n;else{switch(f=(0|(l=(0|f)<26?26-f|0:f+-26|0))<(0|(f=(0|f)<10?10-f|0:f+-10|0))?l:f,0|r){case 8:t=7;break;case 16:t=1;break;case 32:t=0;break;default:sr(55739,48289,518,48361)}if((0|f)<=(0|t))ur=n;else{if(f=32==(0|r)&(0==(0|i)&0!=(0|tr[A+5665>>0]))&&(o=0|cr[e>>0],(0|((0|(l=(0|cr[e+64>>0])+o-(cr[e+32>>0]<<1)|0))<0?0-l|0:l))<(0|(a=1<<(0|ar[A+1276>>2])-5)))?(0|((0|(f=(0|cr[e+-64>>0])+o-(cr[e+-32>>0]<<1)|0))<0?0-f|0:f))<(0|a):0,i=c+64|0,a=0|br(r,-2),tr[i+a>>0]=0|tr[e+a>>0],tr[i+(a=r<<1)>>0]=0|tr[e+a>>0],f)for(t=0|tr[e>>0],tr[i>>0]=t,t&=255,A=(0|cr[e+-64>>0])-t|0,o=(0|cr[e+64>>0])-t|0,f=1;l=((32+(0|br(A,f))|0)>>>6)+t&255,tr[i+(0-f)>>0]=l,l=((32+(0|br(o,f))|0)>>>6)+t&255,tr[i+f>>0]=l,64!=(0|(f=f+1|0)););else if((0|(f=1-a|0))<(0|a))for(f=0|tr[e+(t=f)>>0];c=f,f=0|tr[e+(t=(l=t)+1|0)>>0],tr[i+l>>0]=(2+(255&f)+((255&c)<<1)+(0|cr[e+(l+-1)>>0])|0)>>>2,(0|t)!=(0|a););hb(e+(l=0-a|0)|0,i+l|0,r<<2|1),ur=n}}}function tc(A,e,r,i,f){A|=0,e|=0,i|=0;var n,t=0,o=0,a=0,c=0,l=0;if(ur=(n=ur)+272|0,c=n,4==(0|(r|=0))|1==(0|(f|=0)))ur=n;else{switch(f=(0|(l=(0|f)<26?26-f|0:f+-26|0))<(0|(f=(0|f)<10?10-f|0:f+-10|0))?l:f,0|r){case 8:t=7;break;case 16:t=1;break;case 32:t=0;break;default:sr(55739,48289,518,48361)}if((0|f)<=(0|t))ur=n;else{if(f=32==(0|r)&(0==(0|i)&0!=(0|tr[A+5665>>0]))&&(o=0|lr[e>>1],(0|((0|(l=(0|lr[e+128>>1])+o-(lr[e+64>>1]<<1)|0))<0?0-l|0:l))<(0|(a=1<<(0|ar[A+1276>>2])-5)))?(0|((0|(f=(0|lr[e+-128>>1])+o-(lr[e+-64>>1]<<1)|0))<0?0-f|0:f))<(0|a):0,i=c+128|0,a=0|br(r,-2),or[i+(a<<1)>>1]=0|or[e+(a<<1)>>1],or[i+((a=r<<1)<<1)>>1]=0|or[e+(a<<1)>>1],f)for(t=0|or[e>>1],or[i>>1]=t,t&=65535,A=(0|lr[e+-128>>1])-t|0,o=(0|lr[e+128>>1])-t|0,f=1;l=((32+(0|br(A,f))|0)>>>6)+t&65535,or[i+(0-f<<1)>>1]=l,l=((32+(0|br(o,f))|0)>>>6)+t&65535,or[i+(f<<1)>>1]=l,64!=(0|(f=f+1|0)););else if((0|(f=1-a|0))<(0|a))for(f=0|or[e+((t=f)<<1)>>1];c=f,f=0|or[e+((t=(l=t)+1|0)<<1)>>1],or[i+(l<<1)>>1]=(2+(65535&f)+((65535&c)<<1)+(0|lr[e+(l+-1<<1)>>1])|0)>>>2,(0|t)!=(0|a););hb(e+((l=0-a|0)<<1)|0,i+(l<<1)|0,r<<3|2),ur=n}}}function oc(A){ar[(A|=0)+8>>2]=1732584193,ar[A+12>>2]=-271733879,ar[A+16>>2]=-1732584194,ar[A+20>>2]=271733878,ar[A>>2]=0,ar[A+4>>2]=0}function ac(A,e,r){e|=0,r|=0;var i,f,n=0,t=0;f=(t=0|ar[(A|=0)>>2])+r&536870911,ar[A>>2]=f,n=0|ar[(i=A+4|0)>>2],f>>>0<t>>>0&&(n=n+1|0,ar[i>>2]=n),ar[i>>2]=n+(r>>>29),n=63&t;do{if(n){if(t=64-n|0,n=A+24+n|0,t>>>0<=r>>>0){hb(0|n,0|e,0|t),cc(A,A+24|0,64),e=e+t|0,r=r-t|0;break}return void hb(0|n,0|e,0|r)}}while(0);63<r>>>0&&(e=0|cc(A,e,-64&r),r&=63),hb(A+24|0,0|e,0|r)}function cc(A,e,r){e|=0,r|=0;var i,f,n,t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0,R=0,N=0,_=0,Y=0,Q=0,D=0,J=0,M=0,T=0,U=0,S=0,O=0,z=0,j=0;for(g=(A|=0)+12|0,Z=A+16|0,p=A+20|0,f=A+88|0,n=A+92|0,t=A+96|0,o=A+100|0,a=A+104|0,c=A+108|0,l=A+112|0,u=A+116|0,b=A+120|0,s=A+124|0,d=A+128|0,k=A+132|0,h=A+136|0,w=A+140|0,v=A+144|0,i=A+148|0,A=0|ar[(m=A+8|0)>>2],y=0|ar[g>>2],B=0|ar[p>>2],E=0|ar[Z>>2];X=(0|cr[e+1>>0])<<8|0|cr[e>>0]|(0|cr[e+2>>0])<<16|(0|cr[e+3>>0])<<24,X=((X=A+-680876936+(y&(B^E)^B)+(ar[f>>2]=X)|0)<<7|X>>>25)+y|0,W=(0|cr[e+5>>0])<<8|0|cr[e+4>>0]|(0|cr[e+6>>0])<<16|(0|cr[e+7>>0])<<24,W=((W=B+-389564586+(ar[n>>2]=W)+(X&(y^E)^E)|0)<<12|W>>>20)+X|0,I=(0|cr[e+9>>0])<<8|0|cr[e+8>>0]|(0|cr[e+10>>0])<<16|(0|cr[e+11>>0])<<24,I=((I=E+606105819+(ar[t>>2]=I)+(W&(X^y)^y)|0)<<17|I>>>15)+W|0,j=(0|cr[e+13>>0])<<8|0|cr[e+12>>0]|(0|cr[e+14>>0])<<16|(0|cr[e+15>>0])<<24,j=((j=y+-1044525330+(ar[o>>2]=j)+(I&(W^X)^X)|0)<<22|j>>>10)+I|0,Y=(0|cr[e+17>>0])<<8|0|cr[e+16>>0]|(0|cr[e+18>>0])<<16|(0|cr[e+19>>0])<<24,Y=((Y=X+-176418897+(ar[a>>2]=Y)+(j&(I^W)^W)|0)<<7|Y>>>25)+j|0,X=(0|cr[e+21>>0])<<8|0|cr[e+20>>0]|(0|cr[e+22>>0])<<16|(0|cr[e+23>>0])<<24,X=((X=W+1200080426+(ar[c>>2]=X)+(Y&(j^I)^I)|0)<<12|X>>>20)+Y|0,W=(0|cr[e+25>>0])<<8|0|cr[e+24>>0]|(0|cr[e+26>>0])<<16|(0|cr[e+27>>0])<<24,W=((W=I+-1473231341+(ar[l>>2]=W)+(X&(Y^j)^j)|0)<<17|W>>>15)+X|0,I=(0|cr[e+29>>0])<<8|0|cr[e+28>>0]|(0|cr[e+30>>0])<<16|(0|cr[e+31>>0])<<24,I=((I=j+-45705983+(ar[u>>2]=I)+(W&(X^Y)^Y)|0)<<22|I>>>10)+W|0,j=(0|cr[e+33>>0])<<8|0|cr[e+32>>0]|(0|cr[e+34>>0])<<16|(0|cr[e+35>>0])<<24,j=((j=Y+1770035416+(ar[b>>2]=j)+(I&(W^X)^X)|0)<<7|j>>>25)+I|0,Y=(0|cr[e+37>>0])<<8|0|cr[e+36>>0]|(0|cr[e+38>>0])<<16|(0|cr[e+39>>0])<<24,X=((X=(ar[s>>2]=Y)+-1958414417+X+(j&(I^W)^W)|0)<<12|X>>>20)+j|0,Y=(0|cr[e+41>>0])<<8|0|cr[e+40>>0]|(0|cr[e+42>>0])<<16|(0|cr[e+43>>0])<<24,W=((W=(ar[d>>2]=Y)+-42063+W+(X&(j^I)^I)|0)<<17|W>>>15)+X|0,Y=(0|cr[e+45>>0])<<8|0|cr[e+44>>0]|(0|cr[e+46>>0])<<16|(0|cr[e+47>>0])<<24,I=((I=(ar[k>>2]=Y)+-1990404162+I+(W&(X^j)^j)|0)<<22|I>>>10)+W|0,Y=(0|cr[e+49>>0])<<8|0|cr[e+48>>0]|(0|cr[e+50>>0])<<16|(0|cr[e+51>>0])<<24,j=((j=(ar[h>>2]=Y)+1804603682+j+(I&(W^X)^X)|0)<<7|j>>>25)+I|0,Y=(0|cr[e+53>>0])<<8|0|cr[e+52>>0]|(0|cr[e+54>>0])<<16|(0|cr[e+55>>0])<<24,X=((X=(ar[w>>2]=Y)+-40341101+X+(j&(I^W)^W)|0)<<12|X>>>20)+j|0,Y=(0|cr[e+57>>0])<<8|0|cr[e+56>>0]|(0|cr[e+58>>0])<<16|(0|cr[e+59>>0])<<24,W=((W=(ar[v>>2]=Y)+-1502002290+W+(X&(j^I)^I)|0)<<17|W>>>15)+X|0,Y=(0|cr[e+61>>0])<<8|0|cr[e+60>>0]|(0|cr[e+62>>0])<<16|(0|cr[e+63>>0])<<24,I=((I=(ar[i>>2]=Y)+1236535329+I+(W&(X^j)^j)|0)<<22|I>>>10)+W|0,j=((j=(D=0|ar[n>>2])+-165796510+j+((I^W)&X^W)|0)<<5|j>>>27)+I|0,X=((X=(_=0|ar[l>>2])+-1069501632+X+((j^I)&W^I)|0)<<9|X>>>23)+j|0,W=((W=(F=0|ar[k>>2])+643717713+W+((X^j)&I^j)|0)<<14|W>>>18)+X|0,I=((I=(z=0|ar[f>>2])+-373897302+I+((W^X)&j^X)|0)<<20|I>>>12)+W|0,j=((j=(U=0|ar[c>>2])+-701558691+j+((I^W)&X^W)|0)<<5|j>>>27)+I|0,W=((W=Y+-660478335+W+(((X=((X=(J=0|ar[d>>2])+38016083+X+((j^I)&W^I)|0)<<9|X>>>23)+j|0)^j)&I^j)|0)<<14|W>>>18)+X|0,I=((I=(R=0|ar[a>>2])+-405537848+I+((W^X)&j^X)|0)<<20|I>>>12)+W|0,j=((j=(G=0|ar[s>>2])+568446438+j+((I^W)&X^W)|0)<<5|j>>>27)+I|0,X=((X=(S=0|ar[v>>2])+-1019803690+X+((j^I)&W^I)|0)<<9|X>>>23)+j|0,W=((W=(M=0|ar[o>>2])+-187363961+W+((X^j)&I^j)|0)<<14|W>>>18)+X|0,I=((I=(Q=0|ar[b>>2])+1163531501+I+((W^X)&j^X)|0)<<20|I>>>12)+W|0,j=((j=(N=0|ar[w>>2])+-1444681467+j+((I^W)&X^W)|0)<<5|j>>>27)+I|0,X=((X=(V=0|ar[t>>2])+-51403784+X+((j^I)&W^I)|0)<<9|X>>>23)+j|0,C=(W=((W=(O=0|ar[u>>2])+1735328473+W+((X^j)&I^j)|0)<<14|W>>>18)+X|0)^X,A=(C=((C=R+-145523070+(C=((C=Q+1873313359+(C=((C=(T=0|ar[h>>2])+1700485571+(C=((C=z+-198630844+(C=((C=G+-640364487+(C=((C=N+681279174+(C=((C=D+-1530992060+(C=((C=U+-378558+j+(C^(I=((I=T+-1926607734+I+(C&j^X)|0)<<20|I>>>12)+W|0))|0)<<4|C>>>28)+I|0)+((W=((W=F+1839030562+W+(C^I^(X=((X=Q+-2022574463+X+(I^W^C)|0)<<11|X>>>21)+C|0))|0)<<16|W>>>16)+X|0)^X^(I=((I=S+-35309556+I+(X^C^W)|0)<<23|I>>>9)+W|0))|0)<<4|C>>>28)+I|0)+((W=((W=O+-155497632+W+(C^I^(X=((X=R+1272893353+X+(I^W^C)|0)<<11|X>>>21)+C|0))|0)<<16|W>>>16)+X|0)^X^(I=((I=J+-1094730640+I+(X^C^W)|0)<<23|I>>>9)+W|0))|0)<<4|C>>>28)+I|0)+((W=((W=M+-722521979+W+(C^I^(X=((X=z+-358537222+X+(I^W^C)|0)<<11|X>>>21)+C|0))|0)<<16|W>>>16)+X|0)^X^(I=((I=_+76029189+I+(X^C^W)|0)<<23|I>>>9)+W|0))|0)<<4|C>>>28)+I|0)+(((I=((I=V+-995338651+I+((X=((X=T+-421815835+X+(I^W^C)|0)<<11|X>>>21)+C|0)^C^(W=((W=Y+530742520+W+(C^I^X)|0)<<16|W>>>16)+X|0))|0)<<23|I>>>9)+W|0)|~X)^W)|0)<<6|C>>>26)+I|0)+(((I=((I=U+-57434055+I+(((W=((W=S+-1416354905+W+(((X=((X=O+1126891415+X+((C|~W)^I)|0)<<10|X>>>22)+C|0)|~I)^C)|0)<<15|W>>>17)+X|0)|~C)^X)|0)<<21|I>>>11)+W|0)|~X)^W)|0)<<6|C>>>26)+I|0)+(((I=((I=D+-2054922799+I+(((W=((W=J+-1051523+W+(((X=((X=M+-1894986606+X+((C|~W)^I)|0)<<10|X>>>22)+C|0)|~I)^C)|0)<<15|W>>>17)+X|0)|~C)^X)|0)<<21|I>>>11)+W|0)|~X)^W)|0)<<6|C>>>26)+I|0)+(((I=((I=N+1309151649+I+(((W=((W=_+-1560198380+W+(((X=((X=Y+-30611744+X+((C|~W)^I)|0)<<10|X>>>22)+C|0)|~I)^C)|0)<<15|W>>>17)+X|0)|~C)^X)|0)<<21|I>>>11)+W|0)|~X)^W)|0)<<6|C>>>26)+I|0)+A|0,y=(W=((W=V+718787259+W+(((X=((X=F+-1120210379+X+((C|~W)^I)|0)<<10|X>>>22)+C|0)|~I)^C)|0)<<15|W>>>17)+X|0)+y+((I=G+-343485551+I+((W|~C)^X)|0)<<21|I>>>11)|0,E=W+E|0,B=X+B|0,e=e+64|0,0!=(0|(r=r+-64|0)););return ar[m>>2]=A,ar[g>>2]=y,ar[Z>>2]=E,ar[p>>2]=B,0|e}function lc(A,e){A|=0;var r=0,i=0,f=0;r=(i=63&ar[(e|=0)>>2])+1|0,tr[e+24+i>>0]=-128,f=e+24|0,(i^=63)>>>0<8?(vb(e+24+r|0,0,0|i),cc(e,f,64),i=56,r=0):i=i+-8|0,vb(e+24+r|0,0,0|i),r=(i=0|ar[e>>2])<<3,ar[e>>2]=r,tr[e+80>>0]=r,tr[e+81>>0]=i>>>5,tr[e+82>>0]=i>>>13,tr[e+83>>0]=i>>>21,i=0|ar[e+4>>2],tr[e+84>>0]=i,tr[e+85>>0]=i>>>8,tr[e+86>>0]=i>>>16,tr[e+87>>0]=i>>>24,cc(e,f,64),f=e+8|0,tr[A>>0]=ar[f>>2],tr[A+1>>0]=(0|ar[f>>2])>>>8,tr[A+2>>0]=(0|ar[f>>2])>>>16,tr[A+3>>0]=(0|ar[f>>2])>>>24,f=e+12|0,tr[A+4>>0]=ar[f>>2],tr[A+5>>0]=(0|ar[f>>2])>>>8,tr[A+6>>0]=(0|ar[f>>2])>>>16,tr[A+7>>0]=(0|ar[f>>2])>>>24,f=e+16|0,tr[A+8>>0]=ar[f>>2],tr[A+9>>0]=(0|ar[f>>2])>>>8,tr[A+10>>0]=(0|ar[f>>2])>>>16,tr[A+11>>0]=(0|ar[f>>2])>>>24,f=e+20|0,tr[A+12>>0]=ar[f>>2],tr[A+13>>0]=(0|ar[f>>2])>>>8,tr[A+14>>0]=(0|ar[f>>2])>>>16,tr[A+15>>0]=(0|ar[f>>2])>>>24,vb(0|e,0,152)}function uc(A,e,r,i,f,n,t,o,a,c,l,u,b){A|=0,t|=0,o|=0,a|=0,c|=0,l|=0,u|=0,b|=0;var s,d,k,h,w,v,m,g,Z,p=0,y=0,B=0,E=0,X=0,W=0,I=0;if(ur=(Z=ur)+20448|0,d=(W=Z)+9088|0,k=3&(r|=0),h=3&(i|=0),g=(r>>2)+(f|=0)|0,m=(i>>2)+(n|=0)|0,y=14-(0|ar[(e|=0)+4996>>2])|0,v=0|ar[e+484>>2],w=0|ar[e+488>>2],3&(i|r)){if(y=0|ar[9768+(k<<2)>>2],n=0|ar[9784+(k<<2)>>2],s=0|ar[9768+(h<<2)>>2],f=0|ar[9784+(h<<2)>>2],p=0-y|0,-1<(m-s|g-y|0)&&(g+l+n|0)<(0|v)&&(m+u+f|0)<(0|w))f=a+((0|br(m,n=c))+g<<1)|0;else{if((0|(e=0-s|0))<(0|(i=f+u|0))&&(E=v-1|0,X=w-1|0,(0|p)<(0|(B=n+l|0))))do{for(n=0|br((0|(n=e+m|0))<0?0:(0|n)<(0|w)?n:X,c),r=(80*(e+s|0)|0)+y|0,f=p;I=f+g|0,or[d+(r+f<<1)>>1]=0|or[a+(((0|I)<0?0:(0|I)<(0|v)?I:E)+n<<1)>>1],(0|(f=f+1|0))!=(0|B););e=e+1|0}while((0|e)!=(0|i));f=d+(((n=80)*s|0)+y<<1)|0}(0|b)<9?cs[31&ar[A+220+(k<<4)+(h<<2)>>2]](t,o,f,n,l,u,W):ls[31&ar[A+300+(k<<4)+(h<<2)>>2]](t,o,f,n,l,u,W,b),ur=Z}else{if(!((m|g|0)<0|(0|v)<(g+l|0)|(0|w)<(m+u|0)))return f=a+((0|br(m,c))+g<<1)|0,(0|b)<9?cs[31&ar[A+220>>2]](t,o,f,c,l,u,W):ls[31&ar[A+300>>2]](t,o,f,c,l,u,W,b),void(ur=Z);if((0|u)<=0)return void(ur=Z);if(e=v-1|0,r=w-1|0,!(0<(0|l)))return void(ur=Z);f=0;do{for(i=0|br((0|(i=f+m|0))<0?0:(0|i)<(0|w)?i:r,c),p=0|br(f,o),n=0;W=n+g|0,or[t+(n+p<<1)>>1]=(0|lr[a+(((0|W)<0?0:(0|W)<(0|v)?W:e)+i<<1)>>1])<<y,(0|(n=n+1|0))!=(0|l););f=f+1|0}while((0|f)!=(0|u));ur=Z}}function bc(A,e,r,i,f,n,t,o,a,c,l,u,b){A|=0,t|=0,o|=0,a|=0,c|=0,l|=0,u|=0,b|=0;var s,d,k,h,w,v,m,g,Z,p=0,y=0,B=0,E=0,X=0,W=0,I=0;if(ur=(Z=ur)+14768|0,d=(W=Z)+9088|0,k=3&(r|=0),h=3&(i|=0),g=(r>>2)+(f|=0)|0,m=(i>>2)+(n|=0)|0,y=14-(0|ar[(e|=0)+4996>>2])|0,v=0|ar[e+484>>2],w=0|ar[e+488>>2],3&(i|r)){if(y=0|ar[9768+(k<<2)>>2],n=0|ar[9784+(k<<2)>>2],s=0|ar[9768+(h<<2)>>2],f=0|ar[9784+(h<<2)>>2],p=0-y|0,-1<(m-s|g-y|0)&&(g+l+n|0)<(0|v)&&(m+u+f|0)<(0|w))f=a+((0|br(m,n=c))+g)|0;else{if((0|(e=0-s|0))<(0|(i=f+u|0))&&(E=v-1|0,X=w-1|0,(0|p)<(0|(B=n+l|0))))do{for(n=0|br((0|(n=e+m|0))<0?0:(0|n)<(0|w)?n:X,c),r=(80*(e+s|0)|0)+y|0,f=p;I=f+g|0,tr[d+(r+f)>>0]=0|tr[a+(((0|I)<0?0:(0|I)<(0|v)?I:E)+n)>>0],(0|(f=f+1|0))!=(0|B););e=e+1|0}while((0|e)!=(0|i));f=d+(((n=80)*s|0)+y)|0}(0|b)<9?cs[31&ar[A+220+(k<<4)+(h<<2)>>2]](t,o,f,n,l,u,W):ls[31&ar[A+300+(k<<4)+(h<<2)>>2]](t,o,f,n,l,u,W,b),ur=Z}else{if(!((m|g|0)<0|(0|v)<(g+l|0)|(0|w)<(m+u|0)))return f=a+((0|br(m,c))+g)|0,(0|b)<9?cs[31&ar[A+220>>2]](t,o,f,c,l,u,W):ls[31&ar[A+300>>2]](t,o,f,c,l,u,W,b),void(ur=Z);if((0|u)<=0)return void(ur=Z);if(e=v-1|0,r=w-1|0,!(0<(0|l)))return void(ur=Z);f=0;do{for(i=0|br((0|(i=f+m|0))<0?0:(0|i)<(0|w)?i:r,c),p=0|br(f,o),n=0;W=n+g|0,or[t+(n+p<<1)>>1]=(0|cr[a+(((0|W)<0?0:(0|W)<(0|v)?W:e)+i)>>0])<<y,(0|(n=n+1|0))!=(0|l););f=f+1|0}while((0|f)!=(0|u));ur=Z}}function sc(A,e,r,i,f,n,t,o,a,c,l,u,b){A|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0,l|=0,u|=0,b|=0;var s,d,k,h,w,v,m=0,g=0,Z=0,p=0,y=0,B=0,E=0;if(m=ur=(v=ur)+31&-32,ur=ur+19808|0,m=(k=m)+9088|0,y=14-(0|ar[(e|=0)+5004>>2])|0,E=0|ar[e+5016>>2],w=(0|ar[e+484>>2])/(0|E)|0,B=0|ar[e+5020>>2],h=(0|ar[e+488>>2])/(0|B)|0,s=7&(r=0|br(2/(0|E)|0,r)),d=7&(i=0|br(2/(0|B)|0,i)),E=((0|f)/(0|E)|0)+(r>>3)|0,B=((0|n)/(0|B)|0)+(i>>3)|0,7&(i|r)){if(0<(0|E)&&(E+l|0)<=(w-2|0)&0<(0|B)&&(B+u|0)<=(h-2|0))f=a+((0|br(B,c))+E<<1)|0,e=c;else{if(-1<(0|(i=u+2|0))&&(Z=w-1|0,p=h-1|0,-1<(0|(g=l+2|0)))){r=-1;do{for(f=0|br((0|(f=r+B|0))<0?0:(0|f)<(0|h)?f:p,c),n=80+(80*r|0)|0,e=-1;y=e+E|0,or[m+(n+(e=e+1|0)<<1)>>1]=0|or[a+(((0|y)<0?0:(0|y)<(0|w)?y:Z)+f<<1)>>1],(0|e)!=(0|g););r=r+1|0}while((0|r)!=(0|i))}f=m+162|0,e=80}r=0!=(0|s),i=0!=(0|d);do{if(r&i){if((0|b)<9){bs[7&ar[A+216>>2]](t,o,f,e,l,u,s,d,k,b);break}bs[7&ar[A+296>>2]](t,o,f,e,l,u,s,d,k,b);break}if(r){if((0|b)<9){bs[7&ar[A+208>>2]](t,o,f,e,l,u,s,d,k,b);break}bs[7&ar[A+288>>2]](t,o,f,e,l,u,s,d,k,b);break}if(i||sr(55739,48428,268,48472),(0|b)<9){bs[7&ar[A+212>>2]](t,o,f,e,l,u,0,d,k,b);break}bs[7&ar[A+292>>2]](t,o,f,e,l,u,0,d,k,b);break}while(0);ur=v}else{if(-1<(0|E)&&!((0|B)<0|(0|w)<(E+l|0)|(0|h)<(B+u|0)))return e=a+((0|br(B,c))+E<<1)|0,(0|b)<9?us[3&ar[A+204>>2]](t,o,e,c,l,u,0,0,0):bs[7&ar[A+284>>2]](t,o,e,c,l,u,0,0,0,b),void(ur=v);if((0|u)<=0)return void(ur=v);if(i=w-1|0,f=h-1|0,!(0<(0|l)))return void(ur=v);r=0;do{for(n=0|br((0|(n=r+B|0))<0?0:(0|n)<(0|h)?n:f,c),m=0|br(r,o),e=0;b=e+E|0,or[t+(e+m<<1)>>1]=(0|lr[a+(((0|b)<0?0:(0|b)<(0|w)?b:i)+n<<1)>>1])<<y,(0|(e=e+1|0))!=(0|l););r=r+1|0}while((0|r)!=(0|u));ur=v}}function dc(A,e,r,i,f,n,t,o,a,c,l,u,b){A|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0,l|=0,u|=0,b|=0;var s,d,k,h,w,v,m=0,g=0,Z=0,p=0,y=0,B=0,E=0;if(m=ur=(v=ur)+31&-32,ur=ur+14448|0,m=(k=m)+9088|0,y=14-(0|ar[(e|=0)+5004>>2])|0,E=0|ar[e+5016>>2],w=(0|ar[e+484>>2])/(0|E)|0,B=0|ar[e+5020>>2],h=(0|ar[e+488>>2])/(0|B)|0,s=7&(r=0|br(2/(0|E)|0,r)),d=7&(i=0|br(2/(0|B)|0,i)),E=((0|f)/(0|E)|0)+(r>>3)|0,B=((0|n)/(0|B)|0)+(i>>3)|0,7&(i|r)){if(0<(0|E)&&(E+l|0)<=(w-2|0)&0<(0|B)&&(B+u|0)<=(h-2|0))f=a+((0|br(B,c))+E)|0,e=c;else{if(-1<(0|(i=u+2|0))&&(Z=w-1|0,p=h-1|0,-1<(0|(g=l+2|0)))){r=-1;do{for(f=0|br((0|(f=r+B|0))<0?0:(0|f)<(0|h)?f:p,c),n=80+(80*r|0)|0,e=-1;y=e+E|0,tr[m+(n+(e=e+1|0))>>0]=0|tr[a+(((0|y)<0?0:(0|y)<(0|w)?y:Z)+f)>>0],(0|e)!=(0|g););r=r+1|0}while((0|r)!=(0|i))}f=m+81|0,e=80}r=0!=(0|s),i=0!=(0|d);do{if(r&i){if((0|b)<9){bs[7&ar[A+216>>2]](t,o,f,e,l,u,s,d,k,b);break}bs[7&ar[A+296>>2]](t,o,f,e,l,u,s,d,k,b);break}if(r){if((0|b)<9){bs[7&ar[A+208>>2]](t,o,f,e,l,u,s,d,k,b);break}bs[7&ar[A+288>>2]](t,o,f,e,l,u,s,d,k,b);break}if(i||sr(55739,48428,268,48472),(0|b)<9){bs[7&ar[A+212>>2]](t,o,f,e,l,u,0,d,k,b);break}bs[7&ar[A+292>>2]](t,o,f,e,l,u,0,d,k,b);break}while(0);ur=v}else{if(-1<(0|E)&&!((0|B)<0|(0|w)<(E+l|0)|(0|h)<(B+u|0)))return e=a+((0|br(B,c))+E)|0,(0|b)<9?us[3&ar[A+204>>2]](t,o,e,c,l,u,0,0,0):bs[7&ar[A+284>>2]](t,o,e,c,l,u,0,0,0,b),void(ur=v);if((0|u)<=0)return void(ur=v);if(i=w-1|0,f=h-1|0,!(0<(0|l)))return void(ur=v);r=0;do{for(n=0|br((0|(n=r+B|0))<0?0:(0|n)<(0|h)?n:f,c),m=0|br(r,o),e=0;b=e+E|0,or[t+(e+m<<1)>>1]=(0|cr[a+(((0|b)<0?0:(0|b)<(0|w)?b:i)+n)>>0])<<y,(0|(e=e+1|0))!=(0|l););r=r+1|0}while((0|r)!=(0|u));ur=v}}function kc(A,e,r,i,f,n,t,o,a,c,l,u){e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0,l|=0,u|=0;var b,s=0,d=0,k=0,h=0,w=0;if(0|Hb[31&ar[12+(0|ar[(A|=0)>>2])>>2]](A,n)||sr(48581,48428,1074,48604),b=0|Hb[31&ar[8+(0|ar[A>>2])>>2]](A,n),(0|ar[24+b>>2])>(0|t)&&(0|ar[28+b>>2])>(0|o)){if(i=t>>(f=0|ar[10368+b>>2]),f=o>>f,(0|i)<=-1&&sr(48482,48519,118,48539),(0|(n=0|ar[10372+b>>2]))<=(0|i)&&sr(48482,48519,118,48539),(0|f)<=-1&&sr(48543,48519,119,48539),(0|f)>=(0|ar[10376+b>>2])&&sr(48543,48519,119,48539),w=(0|ar[10360+b>>2])+(3*((0|br(n,f))+i|0)|0)|0,!(768&(cr[w>>0]|cr[w+1>>0]<<8)))return or[l>>1]=0,or[l+2>>1]=0,void(tr[u>>0]=0);if(1==(0|tr[10516+b>>0]))return or[l>>1]=0,or[l+2>>1]=0,void(tr[u>>0]=0);if(i=t>>(f=0|ar[10388+b>>2]),f=o>>f,(0|i)<=-1&&sr(48482,48519,118,48539),(0|(n=0|ar[10392+b>>2]))<=(0|i)&&sr(48482,48519,118,48539),(0|f)<=-1&&sr(48543,48519,119,48539),(0|f)>=(0|ar[10396+b>>2])&&sr(48543,48519,119,48539),w=0|ar[10380+b>>2],h=(0|br(n,f))+i|0,0|tr[w+(12*h|0)>>0])if(0|tr[w+(12*h|0)+1>>0]){if(s=0|ar[e+92>>2],0<(0|ar[(n=r+332|0)>>2]))for(f=0;i=92+(0|Hb[31&ar[8+(0|ar[A>>2])>>2]](A,0|ar[r+980+(f<<2)>>2]))|0,(i=(0|ar[i>>2])<=(0|s))&(0|(f=f+1|0))<(0|ar[n>>2]););else i=1;if(i&0<(0|ar[(n=r+328|0)>>2]))for(f=0;i=92+(0|Hb[31&ar[8+(0|ar[A>>2])>>2]](A,0|ar[r+916+(f<<2)>>2]))|0,(i=(0|ar[i>>2])<=(0|s))&(0|(f=f+1|0))<(0|ar[n>>2]););d=i?c:0|tr[r+372>>0]}else d=0;else d=1;return(k=lr[(k=w+(12*h|0)+4+(d<<2)|0)>>1]|lr[k+2>>1]<<16,s=0|tr[w+(12*h|0)+2+d>>0],n=t>>(i=0|ar[10348+b>>2]),i=o>>i,(0|n)<=-1&&sr(48482,48519,118,48539),(0|(f=0|ar[10352+b>>2]))<=(0|n)&&sr(48482,48519,118,48539),(0|i)<=-1&&sr(48543,48519,119,48539),(0|i)>=(0|ar[10356+b>>2])&&sr(48543,48519,119,48539),i=(0|ar[10340+b>>2])+(24*((0|br(f,i))+n|0)|0)+2|0,i=0|ar[(0|ar[48+b>>2])+(lr[i>>1]<<2)>>2],(0|tr[(n=r+1300+(c<<4)+a|0)>>0])!=(0|tr[i+1300+(d<<4)+s>>0]))?(tr[u>>0]=0,or[l>>1]=0,void(or[l+2>>1]=0)):(tr[u>>0]=1,i=(0|ar[92+b>>2])-(0|ar[i+1044+(d<<6)+(s<<2)>>2])|0,f=(0|ar[e+92>>2])-(0|ar[r+1044+(c<<6)+(a<<2)>>2])|0,0!=(0|tr[n>>0])|(0|i)==(0|f)?(or[l>>1]=k,void(or[l+2>>1]=k>>>16)):(i=(0|i)<-128?-128:(0|i)<127?i:127)?(e=32+(0|br((16384+(((0|i)<0?0-i|0:i)>>1)|0)/(0|i)|0,(0|f)<-128?-128:(0|f)<127?f:127))>>6,A=0|br(e=(0|e)<-4096?-4096:(0|e)<4095?e:4095,k<<16>>16),A=0|br(((c=(0|A)<0)?0-A|0:A)+127>>8,c?-1:0!=(0|A)&1),or[l>>1]=(0|A)<-32768?-32768:65535&((0|A)<32767?A:32767),e=0|br(e,k>>16),e=0|br(((A=(0|e)<0)?0-e|0:e)+127>>8,A?-1:0!=(0|e)&1),void(or[l+2>>1]=(0|e)<-32768?-32768:65535&((0|e)<32767?e:32767))):(or[l>>1]=k,or[l+2>>1]=k>>>16,er(A+4|0,1008,0),void(tr[e+10516>>0]=3)))}er(A+4|0,1026,0),tr[u>>0]=0}function hc(A,e,r,i,f,n,t,o,a,c,l){A|=0,e|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0,l|=0;var u,b,s,d=0;if(!(0|tr[(r|=0)+324>>0]))return or[c>>1]=0,or[c+2>>1]=0,void(tr[l>>0]=0);if(s=0|ar[e+5804>>2],d=0|ar[r+20>>2]?0:0==(0|tr[r+372>>0])&1,d=0|ar[r+916+(d<<6)+(ar[r+376>>2]<<2)>>2],!(0|Hb[31&ar[12+(0|ar[A>>2])>>2]](A,d)))return or[c>>1]=0,or[c+2>>1]=0,void er(A+4|(tr[l>>0]=0),1012,0);if(b=n+i|0,(f>>s|0)==((u=t+f|0)>>s|0)&&(0|b)<(0|ar[e+1248>>2])&&(0|u)<(0|ar[e+1252>>2])){if(kc(A,e,r,0,0,d,-16&b,-16&u,o,a,c,l),0|tr[l>>0])return}else or[c>>1]=0,or[c+2>>1]=0,tr[l>>0]=0;kc(A,e,r,0,0,d,(n>>1)+i&-16,(t>>1)+f&-16,o,a,c,l)}function wc(A,e,r,i,f,n,t,o,a,c,l,u,b){A|=0,e|=0,n|=0,t|=0,a|=0,c|=0,l|=0,u|=0,b|=0;var s,d,k,h,w,v,m=0,g=0,Z=0;if(g=ur=(v=ur)+31&-32,ur=ur+16|0,w=g+8|0,g=(m=g)+12|0,t=0|function(A,e,r,i,f,n,t,o,a,c,l,u){e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0,l|=0,u|=0;var b,s,d,k,h,w,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0;w=0|ar[(A|=0)+10060>>2],t=e>>(m=0|ar[A+10368>>2]),m=r>>m,(0|t)<=-1&&sr(48482,48519,118,48539),(0|(g=0|ar[A+10372>>2]))<=(0|t)&&sr(48482,48519,118,48539),(0|m)<=-1&&sr(48543,48519,119,48539),(0|m)>=(0|ar[A+10376>>2])&&sr(48543,48519,119,48539),Z=(0|ar[A+10360>>2])+(3*((0|br(g,m))+t|0)|0)|0,Z=(65535&(cr[Z>>0]|cr[Z+1>>0]<<8))>>>3,t=(d=a+n|0)-1|0,(h=(0|(s=f>>w))==((k=f+-1|0)>>w|0))&&(n>>w|0)==(t>>w|0)?v=I=0:E=9;A:do{if(9==(0|E)){if(1==(0|c))switch(7&Z){case 2:case 6:case 7:v=I=0;break A}if(0|ka(A,e,r,i,f,n,o,a,c,k,t)){if(t>>=X=0|ar[A+10388>>2],(0|(g=k>>X))<=-1&&sr(48482,48519,118,48539),(0|(m=0|ar[A+10392>>2]))<=(0|g)&&sr(48482,48519,118,48539),(0|t)<=-1&&sr(48543,48519,119,48539),(0|t)<(0|ar[A+10396>>2])){I=(0|ar[A+10380>>2])+(12*((0|br(m,t))+g|0)|0)|0,or[l>>1]=0|or[I>>1],or[l+2>>1]=0|or[I+2>>1],or[l+4>>1]=0|or[I+4>>1],or[l+6>>1]=0|or[I+6>>1],or[l+8>>1]=0|or[I+8>>1],or[l+10>>1]=0|or[I+10>>1],v=I=1;break}sr(48543,48519,119,48539)}else v=I=0}}while(0);if((0|u)<=(0|v))return 0|(l=v);X=n+-1|0,(0|s)==((t=(b=o+f|0)-1|0)>>w|0)&&(n>>w|0)==(X>>w|0)?B=p=0:E=22;A:do{if(22==(0|E)){if(1==(0|c))switch(7&Z){case 1:case 4:case 5:B=p=0;break A}if(0|ka(A,e,r,i,f,n,o,a,c,t,X)){t>>=m=0|ar[A+10388>>2],m=X>>m,(0|t)<=-1&&sr(48482,48519,118,48539),(0|(g=0|ar[A+10392>>2]))<=(0|t)&&sr(48482,48519,118,48539),(0|m)<=-1&&sr(48543,48519,119,48539),(0|m)>=(0|ar[A+10396>>2])&&sr(48543,48519,119,48539),t=(Z=0|ar[A+10380>>2])+(12*(g=(0|br(g,m))+t|0)|0)|0;do{if(I&&(p=0|tr[l>>0])<<24>>24==(0|tr[t>>0])){if(p<<24>>24){if((0|or[l+4>>1])!=(0|or[Z+(12*g|0)+4>>1]))break;if((0|or[l+6>>1])!=(0|or[Z+(12*g|0)+6>>1]))break;if((0|tr[l+2>>0])!=(0|tr[Z+(12*g|0)+2>>0]))break}if((m=0|tr[l+1>>0])<<24>>24==(0|tr[Z+(12*g|0)+1>>0])){if(!(m<<24>>24)){p=1,B=0;break A}if((0|or[l+8>>1])!=(0|or[Z+(12*g|0)+8>>1]))break;if((0|or[l+10>>1])!=(0|or[Z+(12*g|0)+10>>1]))break;if((0|tr[l+3>>0])==(0|tr[Z+(12*g|0)+3>>0])){p=1,B=0;break A}}}}while(0);or[(p=l+(12*v|0)|0)>>1]=0|or[t>>1],or[p+2>>1]=0|or[t+2>>1],or[p+4>>1]=0|or[t+4>>1],or[p+6>>1]=0|or[t+6>>1],or[p+8>>1]=0|or[t+8>>1],or[p+10>>1]=0|or[t+10>>1],v=(B=v)+(p=1)|0}else B=p=0}}while(0);if((0|u)<=(0|v))return 0|(l=v);(0|s)==(b>>w|0)&&(n>>w|0)==(X>>w|0)||(E=47);A:do{if(47==(0|E)&&0|ka(A,e,r,i,f,n,o,a,c,b,X)){t=b>>(m=0|ar[A+10388>>2]),m=X>>m,(0|t)<=-1&&sr(48482,48519,118,48539),(0|(g=0|ar[A+10392>>2]))<=(0|t)&&sr(48482,48519,118,48539),(0|m)<=-1&&sr(48543,48519,119,48539),(0|m)>=(0|ar[A+10396>>2])&&sr(48543,48519,119,48539),t=(Z=0|ar[A+10380>>2])+(12*(g=(0|br(g,m))+t|0)|0)|0;do{if(p&&(y=0|tr[l+(12*B|0)>>0])<<24>>24==(0|tr[t>>0])){if(y<<24>>24){if((0|or[l+(12*B|0)+4>>1])!=(0|or[Z+(12*g|0)+4>>1]))break;if((0|or[l+(12*B|0)+6>>1])!=(0|or[Z+(12*g|0)+6>>1]))break;if((0|tr[l+(12*B|0)+2>>0])!=(0|tr[Z+(12*g|0)+2>>0]))break}if((m=0|tr[l+(12*B|0)+1>>0])<<24>>24==(0|tr[Z+(12*g|0)+1>>0])){if(!(m<<24>>24))break A;if((0|or[l+(12*B|0)+8>>1])!=(0|or[Z+(12*g|0)+8>>1]))break;if((0|or[l+(12*B|0)+10>>1])!=(0|or[Z+(12*g|0)+10>>1]))break;if((0|tr[l+(12*B|0)+3>>0])==(0|tr[Z+(12*g|0)+3>>0]))break A}}}while(0);or[(y=l+(12*v|0)|0)>>1]=0|or[t>>1],or[y+2>>1]=0|or[t+2>>1],or[y+4>>1]=0|or[t+4>>1],or[y+6>>1]=0|or[t+6>>1],or[y+8>>1]=0|or[t+8>>1],or[y+10>>1]=0|or[t+10>>1],v=v+1|0}}while(0);if((0|u)<=(0|v))return 0|(l=v);h&&(n>>w|0)==(d>>w|0)||(E=70);A:do{if(70==(0|E)&&0|ka(A,e,r,i,f,n,o,a,c,k,d)){g=k>>(t=0|ar[A+10388>>2]),t=d>>t,(0|g)<=-1&&sr(48482,48519,118,48539),(0|(m=0|ar[A+10392>>2]))<=(0|g)&&sr(48482,48519,118,48539),(0|t)<=-1&&sr(48543,48519,119,48539),(0|t)>=(0|ar[A+10396>>2])&&sr(48543,48519,119,48539),t=(Z=0|ar[A+10380>>2])+(12*(g=(0|br(m,t))+g|0)|0)|0;do{if(I&&(W=0|tr[l>>0])<<24>>24==(0|tr[t>>0])){if(W<<24>>24){if((0|or[l+4>>1])!=(0|or[Z+(12*g|0)+4>>1]))break;if((0|or[l+6>>1])!=(0|or[Z+(12*g|0)+6>>1]))break;if((0|tr[l+2>>0])!=(0|tr[Z+(12*g|0)+2>>0]))break}if((m=0|tr[l+1>>0])<<24>>24!=(0|tr[Z+(12*g|0)+1>>0]))break;if(!(m<<24>>24))break A;if((0|or[l+8>>1])!=(0|or[Z+(12*g|0)+8>>1]))break;if((0|or[l+10>>1])!=(0|or[Z+(12*g|0)+10>>1]))break;if((0|tr[l+3>>0])==(0|tr[Z+(12*g|0)+3>>0]))break A}}while(0);or[(W=l+(12*v|0)|0)>>1]=0|or[t>>1],or[W+2>>1]=0|or[t+2>>1],or[W+4>>1]=0|or[t+4>>1],or[W+6>>1]=0|or[t+6>>1],or[W+8>>1]=0|or[t+8>>1],or[W+10>>1]=0|or[t+10>>1],v=v+1|0}}while(0);if((0|u)<=(0|v)|4==(0|v))return 0|(l=v);if(h&&(n>>w|0)==(X>>w|0))return 0|(l=v);if(!(0|ka(A,e,r,i,f,n,o,a,c,k,X)))return 0|(l=v);g=k>>(t=0|ar[A+10388>>2]),t=X>>t,(0|g)<=-1&&sr(48482,48519,118,48539),(0|(m=0|ar[A+10392>>2]))<=(0|g)&&sr(48482,48519,118,48539),(0|t)<=-1&&sr(48543,48519,119,48539),(0|t)>=(0|ar[A+10396>>2])&&sr(48543,48519,119,48539),t=(Z=0|ar[A+10380>>2])+(12*(g=(0|br(m,t))+g|0)|0)|0;do{if(p){if((m=0|tr[l+(12*B|0)>>0])<<24>>24!=(0|tr[t>>0]))break;if(m<<24>>24){if((0|or[l+(12*B|0)+4>>1])!=(0|or[Z+(12*g|0)+4>>1]))break;if((0|or[l+(12*B|0)+6>>1])!=(0|or[Z+(12*g|0)+6>>1]))break;if((0|tr[l+(12*B|0)+2>>0])!=(0|tr[Z+(12*g|0)+2>>0]))break}if((m=0|tr[l+(12*B|0)+1>>0])<<24>>24!=(0|tr[Z+(12*g|0)+1>>0]))break;if(!(m<<24>>24))return 0|(l=v);if((0|or[l+(12*B|0)+8>>1])!=(0|or[Z+(12*g|0)+8>>1]))break;if((0|or[l+(12*B|0)+10>>1])!=(0|or[Z+(12*g|0)+10>>1]))break;if((0|tr[l+(12*B|0)+3>>0])!=(0|tr[Z+(12*g|0)+3>>0]))break;return 0|v}}while(0);do{if(I){if((m=0|tr[l>>0])<<24>>24!=(0|tr[t>>0]))break;if(m<<24>>24){if((0|or[l+4>>1])!=(0|or[Z+(12*g|0)+4>>1]))break;if((0|or[l+6>>1])!=(0|or[Z+(12*g|0)+6>>1]))break;if((0|tr[l+2>>0])!=(0|tr[Z+(12*g|0)+2>>0]))break}if((m=0|tr[l+1>>0])<<24>>24!=(0|tr[Z+(12*g|0)+1>>0]))break;if(!(m<<24>>24))return 0|(l=v);if((0|or[l+8>>1])!=(0|or[Z+(12*g|0)+8>>1]))break;if((0|or[l+10>>1])!=(0|or[Z+(12*g|0)+10>>1]))break;if((0|tr[l+3>>0])!=(0|tr[Z+(12*g|0)+3>>0]))break;return 0|v}}while(0);return or[(l=l+(12*v|0)|0)>>1]=0|or[t>>1],or[l+2>>1]=0|or[t+2>>1],or[l+4>>1]=0|or[t+4>>1],or[l+6>>1]=0|or[t+6>>1],or[l+8>>1]=0|or[t+8>>1],or[l+10>>1]=0|or[t+10>>1],0|(l=v+1|0)}(r|=0,i|=0,f|=0,o|=0,n=(Z=8==(0|o)?2<(0|ar[r+10060>>2]):0)?i:n,s=Z?f:t,0,d=Z?o:a,k=Z?o:c,Z?0:l,b,h=u+1|0),(0|u)<(0|(ar[w>>2]=t))?i=e+20|0:(hc(A,r,e,n,s,d,k,0,0,m,g),c=0|tr[g>>0],(tr[(a=g+1|0)>>0]=0)|ar[(i=e+20|0)>>2]?a=0:(hc(A,r,e,n,s,d,k,0,1,m+4|0,a),c|=a=0|tr[a>>0]),c<<24>>24&&(ar[w>>2]=t+1,Z=b+(12*t|0)+4|0,r=0|ar[m>>2],or[Z>>1]=r,or[Z+2>>1]=r>>>16,Z=b+(12*t|0)+8|0,m=0|ar[m+4>>2],or[Z>>1]=m,or[Z+2>>1]=m>>>16,tr[b+(12*t|0)>>0]=0|tr[g>>0],tr[b+(12*t|0)+1>>0]=a,tr[b+(12*t|0)+2>>0]=0,tr[b+(12*t|0)+3>>0]=0)),(c=0|ar[i>>2])||(function(A,e,r,i,f){A|=0,e|=0,r|=0,f|=0;var n,t,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0;if(1<(0|(n=0|ar[(i|=0)>>2]))&(0|n)<(0|f)){for(t=0|br(n-1|0,n),u=0;;){if(!((0|(b=0|ar[9800+(u<<2)>>2]))<(0|n)&(0|(s=0|ar[9848+(u<<2)>>2]))<(0|n))){o=4;break}if(d=0|tr[(o=r+(12*b|0)|0)>>0]?0|Hb[31&ar[8+(0|ar[A>>2])>>2]](A,0|ar[e+916+(tr[r+(12*b|0)+2>>0]<<2)>>2]):0,k=0|tr[(a=r+(12*s|0)+1|0)>>0]?0|Hb[31&ar[8+(0|ar[A>>2])>>2]](A,0|ar[e+980+(tr[r+(12*s|0)+3>>0]<<2)>>2]):0,!(0!=(0|d)|(l=(c=0|tr[o>>0])<<24>>24==0))){o=18;break}if(!(0!=(0|k)|(a=(o=0|tr[a>>0])<<24>>24==0))){o=18;break}do{if(!(l|a)){if((0|ar[d+92>>2])==(0|ar[k+92>>2])&&(0|or[r+(12*b|0)+4>>1])==(0|or[r+(12*s|0)+8>>1])&&(0|or[r+(12*b|0)+6>>1])==(0|or[r+(12*s|0)+10>>1]))break;k=0|ar[i>>2],tr[r+(12*k|0)+2>>0]=0|tr[r+(12*b|0)+2>>0],tr[r+(12*k|0)+3>>0]=0|tr[r+(12*s|0)+3>>0],tr[r+(12*k|0)>>0]=c,tr[r+(12*k|0)+1>>0]=o,d=r+(12*k|0)+4|0,b=lr[(b=r+(12*b|0)+4|0)>>1]|lr[b+2>>1]<<16,or[d>>1]=b,or[d+2>>1]=b>>>16,k=r+(12*k|0)+8|0,d=lr[(d=r+(12*s|0)+8|0)>>1]|lr[d+2>>1]<<16,or[k>>1]=d,or[k+2>>1]=d>>>16,ar[i>>2]=1+(0|ar[i>>2])}}while(0);if((0|(u=u+1|0))==(0|t)){o=18;break}if((0|ar[i>>2])==(0|f)){o=18;break}}if(4==(0|o))sr(55739,48428,1360,48637);else if(18==(0|o));}}(A,e,b,w,h),c=0|ar[i>>2]),t=0|ar[(a=e+328|0)>>2],1!=(0|c)&&(t=0|ar[((0|t)<(0|ar[(Z=e+332|0)>>2])?a:Z)>>2]),(0|u)<(0|(a=0|ar[w>>2])))ur=v;else{for(l=0;n=1==(0|c),Z=(0|l)<(0|t)?255&l:0,tr[b+(12*a|0)+2>>0]=Z,tr[b+(12*a|0)+3>>0]=n?-1:Z,tr[b+(12*a|0)>>0]=1,tr[b+(12*a|0)+1>>0]=1&(1^n),or[(Z=n=b+(12*a|0)+4|0)>>1]=0,or[Z+2>>1]=0,or[(n=n+4|0)>>1]=0,n=a+1|(or[n+2>>1]=0),!((0|u)<=(0|a));)l=l+1|0,c=0|ar[i>>2],a=n;ar[w>>2]=n,ur=v}}function vc(A,e,r,i,f,n,t,o,a,c,l,u,b,s){s|=0;var d,k=0,h=0,w=0,v=0,m=0;if(m=ur=(d=ur)+31&-32,ur=ur+32|0,v=m+16|0,function(A,e,r,i,f,n,t,o,a,c,l,u,b,s,d){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,o|=0,a|=0,c|=0,l|=0,u|=0,b|=0,d|=0;var k,h,w,v,m,g,Z,p,y,B,E,X,W,I,C,G,V,F=0,R=0,N=0,_=0,Y=0,Q=0,D=0,J=0,M=0,T=0,U=0,S=0,O=0,z=0,j=0,H=0,x=0,P=0,L=0,K=0,q=0;if(P=ur=(V=ur)+31&-32,ur=ur+48|0,v=P+32|0,m=P+24|0,g=P+44|0,I=P+12|0,P=(C=P)+40|0,Z=(t|=0)+-1|(tr[(G=(s|=0)+1|0)>>0]=0),ar[v>>2]=Z,x=c+o|0,ar[m>>2]=x,ar[4+v>>2]=Z,L=x+-1|0,ar[4+m>>2]=L,tr[s>>0]=0,or[d>>1]=0,R=1&(x=(or[(S=d+2|0)>>1]=0)|ka(e,i,f,n,t,o,a,c,b,Z,x)),tr[g>>0]=R,L=0|ka(e,i,f,n,t,o,a,c,b,Z,L),tr[1+g>>0]=1&L,x|=L,L=r+916+(l<<6)+(u<<2)|0,F=0|Hb[31&ar[8+(0|ar[A>>2])>>2]](A,0|ar[L>>2])){p=0|ar[F+92>>2],M=e+10368|0,k=e+10372|0,h=e+10376|0,w=e+10360|0,y=1-l|0,B=e+10388|0,E=e+10392|0,X=e+10396|0,W=e+10380|0,D=-1,J=0,F=R;A:for(;;){do{if(F<<24>>24!=0&&0==(0|tr[s>>0])){if(F=0|ar[v+(J<<2)>>2],Y=0|ar[m+(J<<2)>>2],R=F>>(N=0|ar[M>>2]),N=Y>>N,(0|R)<=-1){F=8;break A}if((0|(_=0|ar[k>>2]))<=(0|R)){F=8;break A}if((0|N)<=-1){F=11;break A}if((0|N)>=(0|ar[h>>2])){F=11;break A}if(H=(0|ar[w>>2])+(3*((0|br(_,N))+R|0)|0)|0,768&(cr[H>>0]|cr[H+1>>0]<<8)){if(N=F>>(H=0|ar[B>>2]),F=Y>>H,(0|N)<=-1){F=15;break A}if((0|(R=0|ar[E>>2]))<=(0|N)){F=15;break A}if((0|F)<=-1){F=18;break A}if((0|F)>=(0|ar[X>>2])){F=18;break A}if(Q=0|ar[W>>2],_=(0|br(R,F))+N|0,F=0|tr[(Y=Q+(12*_|0)+l|0)>>0]?0|Hb[31&ar[8+(0|ar[A>>2])>>2]](A,0|ar[r+916+(l<<6)+(tr[Q+(12*_|0)+2+l>>0]<<2)>>2]):0,R=0|tr[(N=Q+(12*_|0)+y|0)>>0]?0|Hb[31&ar[8+(0|ar[A>>2])>>2]](A,0|ar[r+916+(y<<6)+(tr[Q+(12*_|0)+2+y>>0]<<2)>>2]):0,0!=(0|F)&0!=(0|tr[Y>>0])&&(0|ar[F+92>>2])==(0|p)){tr[s>>0]=1,R=lr[(R=Q+(12*_|0)+4+(l<<2)|0)>>1]|lr[R+2>>1]<<16,or[d>>1]=R,or[d+2>>1]=R>>>16,R=0|tr[Q+(12*_|0)+2+l>>0];break}R=0!=(0|R)&0!=(0|tr[N>>0])&&(0|ar[R+92>>2])==(0|p)?(tr[s>>0]=1,R=lr[(R=Q+(12*_|0)+4+(y<<2)|0)>>1]|lr[R+2>>1]<<16,or[d>>1]=R,or[d+2>>1]=R>>>16,0|tr[Q+(12*_|0)+2+y>>0]):D}else R=D}else R=D}while(0);if(2<=(0|(F=J+1|0))){F=3;break}D=R,F=0|tr[g+(J=F)>>0]}if(3==(0|F)){O=r+1300+(l<<4)+u|0,z=e+92|0,j=A+4|0,H=e+10516|0,D=0,_=R;A:for(;;){if(0|tr[s>>0]){F=62;break}do{if(0|tr[g+D>>0]){if(F=0|ar[v+(D<<2)>>2],Q=0|ar[m+(D<<2)>>2],R=F>>(N=0|ar[M>>2]),N=Q>>N,(0|R)<=-1){F=35;break A}if((0|(Y=0|ar[k>>2]))<=(0|R)){F=35;break A}if((0|N)<=-1){F=38;break A}if((0|N)>=(0|ar[h>>2])){F=38;break A}if(u=(0|ar[w>>2])+(3*((0|br(Y,N))+R|0)|0)|0,768&(cr[u>>0]|cr[u+1>>0]<<8)){if(N=F>>(u=0|ar[B>>2]),F=Q>>u,(0|N)<=-1){F=42;break A}if((0|(R=0|ar[E>>2]))<=(0|N)){F=42;break A}if((0|F)<=-1){F=45;break A}if((0|F)>=(0|ar[X>>2])){F=45;break A}if(Y=0|ar[W>>2],F=(0|br(R,F))+N|0,1==(0|tr[Y+(12*F|0)+l>>0])&&(T=Y+(12*F|0)+2+l|0,(0|tr[O>>0])==(0|tr[(0|tr[T>>0])+(r+1300+(l<<4))>>0]))){tr[s>>0]=1,R=lr[(R=Y+(12*F|0)+4+(l<<2)|0)>>1]|lr[R+2>>1]<<16,or[d>>1]=R,or[d+2>>1]=R>>>16,R=l,_=0|tr[T>>0];break}1==(0|tr[Y+(12*F|0)+y>>0])&&(U=Y+(12*F|0)+2+y|0,(0|tr[O>>0])==(0|tr[(0|tr[U>>0])+(r+1300+(y<<4))>>0]))?(tr[s>>0]=1,R=lr[(R=Y+(12*F|0)+4+(y<<2)|0)>>1]|lr[R+2>>1]<<16,or[d>>1]=R,or[d+2>>1]=R>>>16,R=y,_=0|tr[U>>0]):R=-1}else R=-1}else R=-1}while(0);do{if(1==(0|tr[s>>0])){if((0|_)<0){F=61;break A}if((0|R)<=-1){F=55;break A}if(F=0|Hb[31&ar[8+(0|ar[A>>2])>>2]](A,0|ar[r+916+(R<<6)+(_<<2)>>2]),Hb[31&ar[8+(0|ar[A>>2])>>2]](A,0|ar[L>>2]),!((tr[O>>0]|tr[r+1300+(R<<4)+_>>0])<<24>>24)){if(N=(R=0|ar[z>>2])-(0|ar[F+92>>2])|0,F=R-p|0,R=lr[d>>1]|lr[d+2>>1]<<16,N=(0|N)<-128?-128:(0|N)<127?N:127){u=32+(0|br((16384+(((0|N)<0?0-N|0:N)>>1)|0)/(0|N)|0,(0|F)<-128?-128:(0|F)<127?F:127))>>6,J=0|br(u=(0|u)<-4096?-4096:(0|u)<4095?u:4095,R<<16>>16),J=0|br(((Q=(0|J)<0)?0-J|0:J)+127>>8,Q?-1:0!=(0|J)&1),or[d>>1]=(0|J)<-32768?-32768:65535&((0|J)<32767?J:32767),u=0|br(u,R>>16),u=0|br(((J=(0|u)<0)?0-u|0:u)+127>>8,J?-1:0!=(0|u)&1),or[S>>1]=(0|u)<-32768?-32768:65535&((0|u)<32767?u:32767);break}er(j,1008,0),tr[H>>0]=3;break}}}while(0);if(2<=(0|(D=D+1|0))){F=62;break}}if(35==(0|F))sr(48482,48519,118,48539);else if(38==(0|F))sr(48543,48519,119,48539);else if(42==(0|F))sr(48482,48519,118,48539);else if(45==(0|F))sr(48543,48519,119,48539);else if(55==(0|F))sr(48685,48428,1698,48699);else{if(61==(0|F))return tr[G>>0]=0,tr[s>>0]=0,ur=V;if(62==(0|F)){F=a+t|0,ar[I>>2]=F,R=o+-1|0,ar[C>>2]=R,ar[4+I>>2]=F+-1,ar[C+4>>2]=R,ar[8+I>>2]=Z,ar[C+8>>2]=R,tr[G>>0]=0,or[(u=d+4|0)>>1]=0,Y=-1,J=or[(M=d+6|0)>>1]=0;A:for(;;){S=0|ka(e,i,f,n,t,o,a,c,b,F,R),tr[P+J>>0]=1&S;do{if(S&&0==(0|tr[G>>0])){if(N=F>>(S=0|ar[B>>2]),F=R>>S,(0|N)<=-1){F=68;break A}if((0|(R=0|ar[E>>2]))<=(0|N)){F=68;break A}if((0|F)<=-1){F=71;break A}if((0|F)>=(0|ar[X>>2])){F=71;break A}if(D=0|ar[W>>2],N=(0|br(R,F))+N|0,R=0|tr[(_=D+(12*N|0)+l|0)>>0]?0|Hb[31&ar[8+(0|ar[A>>2])>>2]](A,0|ar[r+916+(l<<6)+(tr[D+(12*N|0)+2+l>>0]<<2)>>2]):0,F=0|tr[(Q=D+(12*N|0)+y|0)>>0]?0|Hb[31&ar[8+(0|ar[A>>2])>>2]](A,0|ar[r+916+(y<<6)+(tr[D+(12*N|0)+2+y>>0]<<2)>>2]):0,0!=(0|R)&0!=(0|tr[_>>0])&&(0|ar[R+92>>2])==(0|p)){tr[G>>0]=1,Y=lr[(Y=D+(12*N|0)+4+(l<<2)|0)>>1]|lr[Y+2>>1]<<16,or[u>>1]=Y,or[u+2>>1]=Y>>>16,Y=0|tr[D+(12*N|0)+2+l>>0];break}0!=(0|F)&0!=(0|tr[Q>>0])&&(0|ar[F+92>>2])==(0|p)&&(tr[G>>0]=1,Y=lr[(Y=D+(12*N|0)+4+(y<<2)|0)>>1]|lr[Y+2>>1]<<16,or[u>>1]=Y,or[u+2>>1]=Y>>>16,Y=0|tr[D+(12*N|0)+2+y>>0])}}while(0);if(3<=(0|(R=J+1|0))){F=63;break}F=0|ar[I+((J=R)<<2)>>2],R=0|ar[C+(R<<2)>>2]}if(63==(0|F)){A:do{if(!x){0|tr[G>>0]&&(tr[s>>0]=1,x=lr[u>>1]|lr[u+2>>1]<<16,or[d>>1]=x,or[d+2>>1]=x>>>16),D=e+10332|(tr[G>>0]=0),Q=0;e:for(;;){do{if(0|tr[P+Q>>0]){if(R=0|ar[B>>2],F=ar[I+(Q<<2)>>2]>>R,R=ar[C+(Q<<2)>>2]>>R,(0|F)<=-1){F=90;break e}if((0|(N=0|ar[E>>2]))<=(0|F)){F=90;break e}if((0|R)<=-1){F=93;break e}if((0|R)>=(0|ar[X>>2])){F=93;break e}if(_=0|ar[W>>2],F=(0|br(N,R))+F|0,1==(0|tr[_+(12*F|0)+l>>0])&&(K=_+(12*F|0)+2+l|0,(0|tr[O>>0])==(0|tr[(0|tr[K>>0])+(r+1300+(l<<4))>>0]))){tr[G>>0]=1,N=lr[(N=_+(12*F|0)+4+(l<<2)|0)>>1]|lr[N+2>>1]<<16,or[u>>1]=N,or[u+2>>1]=N>>>16,N=l,Y=0|tr[K>>0];break}1==(0|tr[_+(12*F|0)+y>>0])&&(q=_+(12*F|0)+2+y|0,(0|tr[O>>0])==(0|tr[(0|tr[q>>0])+(r+1300+(y<<4))>>0]))?(tr[G>>0]=1,N=lr[(N=_+(12*F|0)+4+(y<<2)|0)>>1]|lr[N+2>>1]<<16,or[u>>1]=N,or[u+2>>1]=N>>>16,N=y,Y=0|tr[q>>0]):N=-1}else N=-1}while(0);do{if(1==(0|tr[G>>0])){if((0|Y)<0){F=110;break e}if((0|N)<=-1){F=103;break e}if(0==(0|(F=0|Hb[31&ar[8+(0|ar[A>>2])>>2]](A,0|ar[r+916+(N<<6)+(Y<<2)>>2])))|0==(0|(R=0|Hb[31&ar[8+(0|ar[A>>2])>>2]](A,0|ar[L>>2])))){er(4+(0|ar[D>>2])|0,1012,0),tr[H>>0]=3;break}if((0|(F=0|ar[F+92>>2]))!=(0|ar[R+92>>2])&&(tr[r+1300+(N<<4)+Y>>0]|tr[O>>0])<<24>>24==0){if(N=(R=0|ar[z>>2])-F|0,F=R-p|0,R=lr[u>>1]|lr[u+2>>1]<<16,N=(0|N)<-128?-128:(0|N)<127?N:127){x=32+(0|br((16384+(((0|N)<0?0-N|0:N)>>1)|0)/(0|N)|0,(0|F)<-128?-128:(0|F)<127?F:127))>>6,c=0|br(x=(0|x)<-4096?-4096:(0|x)<4095?x:4095,R<<16>>16),c=0|br(((a=(0|c)<0)?0-c|0:c)+127>>8,a?-1:0!=(0|c)&1),or[u>>1]=(0|c)<-32768?-32768:65535&((0|c)<32767?c:32767),x=0|br(x,R>>16),x=0|br(((c=(0|x)<0)?0-x|0:x)+127>>8,c?-1:0!=(0|x)&1),or[M>>1]=(0|x)<-32768?-32768:65535&((0|x)<32767?x:32767);break}er(j,1008,0),tr[H>>0]=3;break}}}while(0);if(3<=(0|(Q=Q+1|0)))break A;if(0|tr[G>>0])break A}if(90==(0|F))sr(48482,48519,118,48539);else if(93==(0|F))sr(48543,48519,119,48539);else if(103==(0|F))sr(48685,48428,1839,48699);else if(110==(0|F)){tr[G>>0]=0,tr[s>>0]=0;break}}}while(0);return ur=V}68==(0|F)?sr(48482,48519,118,48539):71==(0|F)&&sr(48543,48519,119,48539)}}}else 8==(0|F)?sr(48482,48519,118,48539):11==(0|F)?sr(48543,48519,119,48539):15==(0|F)?sr(48482,48519,118,48539):18==(0|F)&&sr(48543,48519,119,48539)}else ur=V}(A|=0,r|=0,e|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0,l|=0,u|=0,b|=0,h=m+18|0,w=m+8|0),0|tr[h>>0]){do{if(0|tr[h+1>>0]){if((0|or[w>>1])==(0|or[w+4>>1])&&(0|or[w+2>>1])==(0|or[w+6>>1])){k=6;break}tr[v>>0]=0}else k=6}while(0);6==(0|k)&&hc(A,r,e,t,o,a,c,u,l,m,v),A=0|ar[w>>2],or[s>>1]=A,or[s+2>>1]=A>>>16,e=A=1}else hc(A,r,e,t,o,a,c,u,l,m,v),e=A=0;do{if(0|tr[h+1>>0]){if(e&&(0|or[w>>1])==(0|or[w+4>>1])&&(0|or[w+2>>1])==(0|or[w+6>>1]))break;h=s+(A<<2)|0,w=0|ar[w+4>>2],or[h>>1]=w,or[h+2>>1]=w>>>16,A=A+1|0}}while(0);if(0|tr[v>>0]&&(v=s+(A<<2)|0,m=0|ar[m>>2],or[v>>1]=m,or[v+2>>1]=m>>>16,A=A+1|0),(0|A)<2)return vb(s+(A<<2)|0,0,8-(A<<2)|0),void(ur=d);2!=(0|A)?sr(48737,48428,1943,48753):ur=d}function mc(A,e,r,i,f,n,t,o,a,c,l,u){var b,s;s=ur=(b=ur)+31&-32,ur=ur+16|0,function(A,e,r,i,f,n,t,o,a,c,l,u,b){A|=0,e|=0,i|=0,a|=0,c|=0,l|=0,u|=0,b|=0;var s,d,k,h,w,v=0,m=0,g=0;switch(d=ur=(w=ur)+31&-32,ur=ur+80|0,h=8+d|0,k=(t|=0)+(f|=0)|0,s=(o|=0)+(n|=0)|0,t=f>>(o=0|ar[(r|=0)+10368>>2]),o=n>>o,(0|t)<=-1&&sr(48482,48519,118,48539),(0|(v=0|ar[r+10372>>2]))<=(0|t)&&sr(48482,48519,118,48539),(0|o)<=-1&&sr(48543,48519,119,48539),(0|o)>=(0|ar[r+10376>>2])&&sr(48543,48519,119,48539),v=(0|ar[r+10360>>2])+(3*((0|br(v,o))+t|0)|0)|0,(65535&(cr[v>>0]|cr[v+1>>0]<<8))>>>8&3){case 2:t=0|tr[i+10>>0],g=11;break;case 1:16&(t=0|tr[(o=i+10|0)>>0])?g=11:t=o;break;default:t=i+10|0}if(11==(0|g))return wc(A,e,r,f,n,k,s,a,c,l,u,g=(255&t)>>>5&255,h),g=h+(12*g|0)|0,or[b>>1]=0|or[g>>1],or[b+2>>1]=0|or[g+2>>1],or[b+4>>1]=0|or[g+4>>1],or[b+6>>1]=0|or[g+6>>1],or[b+8>>1]=0|or[g+8>>1],or[b+10>>1]=0|or[g+10>>1],0|tr[b>>0]&&12==(l+c|0)&0!=(0|tr[(m=b+1|0)>>0])&&(tr[b+3>>0]=-1,tr[m>>0]=0),ur=w;switch(3&tr[t>>0]){case 1:case 3:v=0|tr[i>>0],tr[b+2>>0]=v,tr[b>>0]=1,g=0|lr[i+4>>1],m=0|lr[i+2>>1],vc(A,e,r,f,n,a,k,s,c,l,0,v<<24>>24,u,h),v=h+(((0|cr[t>>0])>>>2&1)<<2)|0,v=lr[v>>1]|lr[v+2>>1]<<16,ar[d>>2]=v,g=(0|lr[2+d>>1])+g|0,or[b+4>>1]=v+m,or[b+6>>1]=g;break;default:tr[b+2>>0]=-1,tr[b>>0]=0}((3&tr[t>>0])-2&255)<2?(v=0|tr[i+1>>0],tr[b+3>>0]=v,tr[b+1>>0]=1,g=0|lr[i+8>>1],m=0|lr[i+6>>1],vc(A,e,r,f,n,a,k,s,c,l,1,v<<24>>24,u,h),c=h+(((0|cr[t>>0])>>>3&1)<<2)|0,c=lr[c>>1]|lr[c+2>>1]<<16,ar[4+d>>2]=c,g=(0|lr[6+d>>1])+g|0,or[b+8>>1]=c+m,or[b+10>>1]=g):(tr[b+3>>0]=-1,tr[b+1>>0]=0),ur=w}(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0,l|=0,u|=0,s),function(A,e,r,i,f,n,t,o,a,c,l){A|=0,e|=0,o|=0,a|=0,c|=0,l|=0;var u,b,s,d,k,h,w,v,m,g,Z,p,y,B,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0,R=0,N=0,_=0,Y=0,Q=0,D=0,J=0,M=0,T=0,U=0;ur=(B=ur)+49168|0,w=B+32768|0,Y=(y=B)+49152|0,N=(n|=0)+(i|=0)|0,V=(t|=0)+(f|=0)|0,F=(r|=0)+764|0,v=0|ar[r+5780>>2],m=0|ar[r+5784>>2],k=0|ar[r+40>>2],J=(0|br(k,V))+N|0,J=(0|ar[r+4>>2])+(J<<cr[r+16>>0])|0,g=0|ar[r+44>>2],M=(0|br(g,(0|V)/(0|m)|0))+((0|N)/(0|v)|0)|0,Z=(0|ar[r+8>>2])+(M<<cr[r+17>>0])|0,M=(0|ar[r+12>>2])+(M<<cr[r+18>>0])|0,f=255&(u=0|tr[l>>0]),ar[Y>>2]=f,i=255&(D=0|tr[l+1>>0]),ar[(n=Y+4|0)>>2]=i,h=0|ar[(R=r+5760|0)>>2],p=0|ar[(_=r+5768|0)>>2],d=u<<24>>24==0,D<<24>>24==0|0!=(0|tr[(b=r+5961|0)>>0])|d||(0|or[l+4>>1])!=(0|or[l+8>>1])||(0|or[l+6>>1])!=(0|or[l+10>>1])||(0|ar[e+916+(tr[l+2>>0]<<2)>>2])!=(0|ar[e+980+(tr[l+3>>0]<<2)>>2])||(i=ar[n>>2]=0),s=r+10516|0,D=A+4|0,G=0,n=f;A:for(;;){do{if(0|n){if(15<(n=0|tr[l+2+G>>0])<<24>>24){Q=9;break A}if(C=0|Hb[31&ar[8+(0|ar[A>>2])>>2]](A,0|ar[e+916+(G<<6)+(n<<24>>24<<2)>>2]),!(0|ar[C+96>>2])){tr[s>>0]=3,er(D,1012,0);break}if(n=0|or[(W=l+4+(G<<2)|0)>>1],f=0|or[(I=l+4+(G<<2)+2|0)>>1],t=w+(G<<13)|0,E=0|ar[C+4>>2],X=0|ar[C+40>>2],(8<(0|ar[R>>2])?uc:bc)(A,F,n,f,N,V,t,o,E,X,a,c,h),n=0|or[W>>1],f=0|or[I>>1],t=y+(G<<13)|0,E=0|ar[C+8>>2],8<(0|ar[R>>2])){T=(0|a)/(0|v)|0,X=(0|c)/(0|m)|0,sc(A,F,n,f,N,V,t,o,E,0|ar[(U=C+44|0)>>2],T,X,p),sc(A,F,0|or[W>>1],0|or[I>>1],N,V,y+16384+(G<<13)|0,o,0|ar[C+12>>2],0|ar[U>>2],T,X,p);break}T=(0|a)/(0|v)|0,U=(0|c)/(0|m)|0,dc(A,F,n,f,N,V,t,o,E,0|ar[(X=C+44|0)>>2],T,U,p),dc(A,F,0|or[W>>1],0|or[I>>1],N,V,y+16384+(G<<13)|0,o,0|ar[C+12>>2],0|ar[X>>2],T,U,p);break}}while(0);if(2<=(0|(n=G+1|0)))break;n=0|ar[Y+((G=n)<<2)>>2]}if(9==(0|Q))return tr[s>>0]=3,er(D,1012,0),ur=B;switch(f=2<(0|(f=14-(0|ar[R>>2])|0))?f:2,V=0|cr[r+5920>>0],W=2<(0|(W=14-(0|ar[_>>2])|0))?W:2,Y=0|cr[r+5921>>0],0|ar[e+20>>2]){case 1:return i=u<<24>>24==1&0==(0|i),0|tr[b>>0]?i?(U=0|tr[l+2>>0],t=(0|cr[e+380>>0])+f|0,I=(0|cr[e+381>>0])+W|0,n=0|or[e+446+(U<<1)>>1],i=tr[e+510+U>>0]<<V,E=0|or[e+542+(U<<2)>>1],X=tr[e+670+(U<<1)>>0]<<Y,W=0|or[e+542+(U<<2)+2>>1],f=tr[e+670+(U<<1)+1>>0]<<Y,(0|h)<9?us[3&ar[A+180>>2]](J,k,w,o,a,c,n,i,t):bs[7&ar[A+196>>2]](J,k,w,o,a,c,n,i,t,h),n=(0|a)/(0|v)|0,i=(0|c)/(0|m)|0,(0|p)<9?(us[3&ar[(U=A+180|0)>>2]](Z,g,y,o,n,i,E,X,I),us[3&ar[U>>2]](M,g,y+16384|0,o,n,i,W,f,I)):(bs[7&ar[(U=A+196|0)>>2]](Z,g,y,o,n,i,E,X,I,p),bs[7&ar[U>>2]](M,g,y+16384|0,o,n,i,W,f,I,p))):(er(D,1011,0),tr[s>>0]=3):i?((0|h)<9?as[15&ar[A+176>>2]](J,k,w,o,a,c):cs[31&ar[A+192>>2]](J,k,w,o,a,c,h),n=(0|a)/(0|v)|0,i=(0|c)/(0|m)|0,(0|p)<9?(as[15&ar[(U=A+176|0)>>2]](Z,g,y,o,n,i),as[15&ar[U>>2]](M,g,y+16384|0,o,n,i)):(cs[31&ar[(U=A+192|0)>>2]](Z,g,y,o,n,i,p),cs[31&ar[U>>2]](M,g,y+16384|0,o,n,i,p))):(er(D,1011,0),tr[s>>0]=3),ur=B;case 0:return(n=u<<24>>24==1)&(i=1==(0|i))?0|tr[r+5962>>0]?(F=0|tr[l+2>>0],i=0|tr[l+3>>0],X=(0|cr[e+380>>0])+f|0,_=(0|cr[e+381>>0])+W|0,f=0|or[e+446+(F<<1)>>1],t=tr[e+510+F>>0]<<V,E=0|or[e+478+(i<<1)>>1],n=tr[e+526+i>>0]<<V,I=0|or[e+542+(F<<2)>>1],C=tr[e+670+(F<<1)>>0]<<Y,G=0|or[e+542+(F<<2)+2>>1],V=tr[e+670+(F<<1)+1>>0]<<Y,F=0|or[e+606+(i<<2)>>1],R=tr[e+702+(i<<1)>>0]<<Y,N=0|or[e+606+(i<<2)+2>>1],W=tr[e+702+(i<<1)+1>>0]<<Y,i=8192+w|0,(0|h)<9?ss[1&ar[A+184>>2]](J,k,w,i,o,a,c,f,t,E,n,X):ds[1&ar[A+200>>2]](J,k,w,i,o,a,c,f,t,E,n,X,h),f=y+8192|0,t=y+16384|0,E=y+24576|0,n=(0|a)/(0|v)|0,i=(0|c)/(0|m)|0,(0|p)<9?(ss[1&ar[(U=A+184|0)>>2]](Z,g,y,f,o,n,i,I,C,F,R,_),ss[1&ar[U>>2]](M,g,t,E,o,n,i,G,V,N,W,_)):(ds[1&ar[(U=A+200|0)>>2]](Z,g,y,f,o,n,i,I,C,F,R,_,p),ds[1&ar[U>>2]](M,g,t,E,o,n,i,G,V,N,W,_,p))):(i=8192+w|0,X=A+172|0,(0|h)<9?cs[31&ar[X>>2]](J,k,w,i,o,a,c):ls[31&ar[A+188>>2]](J,k,w,i,o,a,c,h),f=y+8192|0,t=y+16384|0,E=y+24576|0,n=(0|a)/(0|v)|0,i=(0|c)/(0|m)|0,(0|p)<9?(cs[31&ar[X>>2]](Z,g,y,f,o,n,i),cs[31&ar[X>>2]](M,g,t,E,o,n,i)):(ls[31&ar[(U=A+188|0)>>2]](Z,g,y,f,o,n,i,p),ls[31&ar[U>>2]](M,g,t,E,o,n,i,p))):n|i?(G=1&d,0|tr[r+5962>>0]?(t=0|tr[l+2+G>>0],E=(0|cr[e+380>>0])+f|0,C=(0|cr[e+381>>0])+W|0,f=0|or[e+446+(G<<5)+(t<<1)>>1],n=tr[e+510+(G<<4)+t>>0]<<V,X=0|or[e+542+(G<<6)+(t<<2)>>1],W=tr[e+670+(G<<5)+(t<<1)>>0]<<Y,I=0|or[e+542+(G<<6)+(t<<2)+2>>1],t=tr[e+670+(G<<5)+(t<<1)+1>>0]<<Y,i=w+(G<<13)|0,(0|h)<9?us[3&ar[A+180>>2]](J,k,i,o,a,c,f,n,E):bs[7&ar[A+196>>2]](J,k,i,o,a,c,f,n,E,h),f=y+(G<<13)|0,n=(0|a)/(0|v)|0,i=(0|c)/(0|m)|0,(0|p)<9?(us[3&ar[(U=A+180|0)>>2]](Z,g,f,o,n,i,X,W,C),us[3&ar[U>>2]](M,g,y+16384+(G<<13)|0,o,n,i,I,t,C)):(bs[7&ar[(U=A+196|0)>>2]](Z,g,f,o,n,i,X,W,C,p),bs[7&ar[U>>2]](M,g,y+16384+(G<<13)|0,o,n,i,I,t,C,p))):(i=w+(G<<13)|0,(0|h)<9?as[15&ar[A+176>>2]](J,k,i,o,a,c):cs[31&ar[A+192>>2]](J,k,i,o,a,c,h),f=y+(G<<13)|0,n=(0|a)/(0|v)|0,i=(0|c)/(0|m)|0,(0|p)<9?(as[15&ar[(U=A+176|0)>>2]](Z,g,f,o,n,i),as[15&ar[U>>2]](M,g,y+16384+(G<<13)|0,o,n,i)):(cs[31&ar[(U=A+192|0)>>2]](Z,g,f,o,n,i,p),cs[31&ar[U>>2]](M,g,y+16384+(G<<13)|0,o,n,i,p)))):(er(D,1011,0),tr[s>>0]=3),ur=B;default:sr(48395,48428,489,48438)}}(A,e,r,f,n,t,o,a,c,l,s),function(A,e,r,i,f,n){var t,o,a,c,l;if(n|=0,l=(e|=0)>>2,c=(r|=0)>>2,a=(i|=0)>>2,o=(f|=0)>>2,t=0|ar[(A|=0)+10392>>2],!((0|o)<=0)&&(i=A+10380|0,0<(0|a))){e=0;do{for(f=(0|br(e+c|0,t))+l|0,r=0;A=(0|ar[i>>2])+(12*(f+r|0)|0)|0,or[A>>1]=0|or[n>>1],or[A+2>>1]=0|or[n+2>>1],or[A+4>>1]=0|or[n+4>>1],or[A+6>>1]=0|or[n+6>>1],or[A+8>>1]=0|or[n+8>>1],or[A+10>>1]=0|or[n+10>>1],(0|(r=r+1|0))!=(0|a););e=e+1|0}while((0|e)!=(0|o))}}(r,t+f|0,o+n|0,c,l,s),ur=b}function gc(A){var e;for(e=(A|=0)+100|0;(0|(A=A+2|(or[A>>1]=0)))<(0|e););}function Zc(A,e,r,i,f,n,t){A|=0,e|=0,r|=0,i|=0,n|=0,t|=0;var o,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0;if(o=ur,0!=(0|(f|=0))&&(255&(0|At(r,1)))<<24>>24!=0){do{if(t){if(-99999!=(0|(t=0|it(r)))&(0|t)<(0|f)){t=t+1|0;break}return ur=o,(i=0)|i}t=1}while(0);if((0|(X=f-t|0))<=-1&&sr(48788,48796,129,48806),l=0|At(r,1),-99999==(0|(t=0|it(r))))return ur=o,(i=0)|i;for(u=t+1|0,a=~t,y=0|cr[(0|ar[n>>2])+(100*X|0)+98>>0],ur=(E=ur=(B=ur)+(15+(0|+(c=y+1|0))&-16)|0)+(15+(0|+c)&-16)|0,t=0;p=255&(0|At(r,1)),f=(tr[B+t>>0]=p)<<24>>24?1:255&(0|At(r,1)),tr[E+t>>0]=f,(0|(t=t+1|0))!=(0|c););g=0|l?a:u,t=0|ar[n>>2],Z=255&(u=0|tr[t+(100*X|0)+96>>0]),p=255&(w=0|tr[t+(100*X|0)+97>>0]),w=w<<24>>24==0;A:do{if(w)d=0;else{X>>>0<(((0|ar[(l=n+4|0)>>2])-t|0)/100|0)>>>0?(b=p,k=0,s=t):sr(48834,48796,174,48806);e:for(;;){for(t=b;;){if(a=t+-1|0,17<=(0|t)){I=18;break e}if((0|(f=(0|or[s+(100*X|0)+32+(a<<1)>>1])+g|0))<0&&0|tr[E+(h=a+Z|0)>>0])break;if(!(1<(0|t))){d=k;break A}t=a}if(15<(0|k)){v=0,I=74;break}if(c=k+1|0,or[i+(k<<1)>>1]=f,tr[i+64+k>>0]=0|tr[B+h>>0],(0|t)<=1){d=c;break A}if(t=0|ar[n>>2],!(X>>>0<(((0|ar[l>>2])-t|0)/100|0)>>>0)){I=17;break}b=a,k=c,s=t}if(17==(0|I))sr(48834,48796,174,48806);else if(18==(0|I))sr(48866,48796,175,48806);else if(74==(0|I))return ur=o,0|v}}while(0);do{if((0|g)<0&&0!=(0|tr[E+y>>0])){if(15<(0|d))return ur=o,(i=0)|i;or[i+(d<<1)>>1]=g,tr[i+64+d>>0]=0|tr[B+y>>0],t=d+1|0;break}t=d}while(0);c=u<<24>>24==0;A:do{if(c)tr[(u=i+96|0)>>0]=t,t=0;else{for(a=0;;){if((0|(f=(0|or[(0|ar[n>>2])+(100*X|0)+(a<<1)>>1])+g|0))<0&&0!=(0|tr[E+a>>0])){if(15<(0|t)){v=0,I=74;break}or[i+(t<<1)>>1]=f,tr[i+64+t>>0]=0|tr[B+a>>0],m=t+1|0}else m=t;if((0|Z)<=(0|(a=a+1|0)))break;t=m}if(74==(0|I))return ur=o,0|v;if(tr[(u=i+96|0)>>0]=m,!c){for(f=Z,t=0;;){for(c=0|ar[n>>2],a=f;!(0<(0|(l=(0|or[c+(100*X|0)+((f=a+-1|0)<<1)>>1])+g|0))&&0|tr[E+f>>0]);){if(!(1<(0|a)))break A;a=f}if(15<(0|t)){v=0;break}if(c=t+1|0,or[i+32+(t<<1)>>1]=l,tr[i+80+t>>0]=0|tr[B+f>>0],!(1<(0|a))){t=c;break A}t=c}return ur=o,0|v}t=0}}while(0);do{if(0<(0|g)&&0!=(0|tr[E+y>>0])){if(15<(0|t))return ur=o,(i=0)|i;or[i+32+(t<<1)>>1]=g,tr[i+80+t>>0]=0|tr[B+y>>0],t=t+1|0;break}}while(0);A:do{if(!w){for(a=0;;){if(0<(0|(f=(0|or[(0|ar[n>>2])+(100*X|0)+32+(a<<1)>>1])+g|0))&&0!=(0|tr[E+(W=a+Z|0)>>0])){if(15<(0|t)){v=0;break}or[i+32+(t<<1)>>1]=f,tr[i+80+t>>0]=0|tr[B+W>>0],t=t+1|0}if((0|p)<=(0|(a=a+1|0)))break A}return ur=o,0|v}}while(0);tr[i+97>>0]=t}else I=54;A:do{if(54==(0|I)){if(l=0|it(r),((b=0|it(r))+l|0)>(0|ar[e+528+((0|tr[e+2>>0])-1<<2)>>2]))return or[(i=i+96|0)>>1]=0,er(A,1018,or[i+2>>1]=0),ur=o,(i=0)|i;if(16<(0|l)|16<(0|b))return er(A,1018,0),ur=o,(i=0)|i;tr[(u=i+96|0)>>0]=l,tr[i+97>>0]=b;e:do{if(0<(0|l)){for(f=t=0;;){if(-99999==(0|(a=0|it(r)))){v=0;break}if(e=255&(0|At(r,1)),or[(c=i+(t<<1)|0)>>1]=f+65535-a,tr[i+64+t>>0]=e,(0|l)<=(0|(t=t+1|0)))break e;f=0|or[c>>1]}return ur=o,0|v}}while(0);if(0<(0|b)){for(f=t=0;;){if(-99999==(0|(a=0|it(r)))){v=0;break}if(e=255&(0|At(r,1)),or[(c=i+32+(t<<1)|0)>>1]=f+1+a,tr[i+80+t>>0]=e,(0|b)<=(0|(t=t+1|0)))break A;f=0|or[c>>1]}return ur=o,0|v}}}while(0);if((l=(tr[(b=i+99|0)>>0]=0)|tr[u>>0])<<24>>24)for(c=255&l,f=a=0;t=f+1<<24>>24,0|tr[i+64+a>>0]?tr[b>>0]=t:t=f,(0|(a=a+1|0))!=(0|c);)f=t;else t=0;if(c=255&(r=0|tr[i+97>>0]),r<<24>>24)for(a=0;f=t+1<<24>>24,0|tr[i+80+a>>0]&&(t=tr[b>>0]=f),(0|(a=a+1|0))!=(0|c););return tr[i+98>>0]=c+(255&l),ur=o,0|(i=1)}function pc(A,e,r){A|=0,r|=0;var i,f,n,t,o,a=0,c=0,l=0,u=0,b=0;if(t=16+(i=ur=(o=ur)+31&-32)|0,n=8+i|0,ur=(f=ur=ur+32|0)+(15+((a=(e|=0)<<1)+2|0)&-16)|0,(tr[f+(a|=1)>>0]=0)<(0|a)&&vb(0|f,46,0|a),tr[f+e>>0]=124,(a=0|tr[A+96>>0])<<24>>24)for(b=0-e|0,a&=255;u=0|or[A+((a=(c=a)+-1|0)<<1)>>1],l=0|tr[A+64+a>>0]?88:111,(0|u)<(0|b)?(ar[i>>2]=u,ar[4+i>>2]=255&l,Pn(r,48895,i)):tr[f+(u+e)>>0]=l,1<(0|c););if(!((a=0|tr[A+97>>0])<<24>>24))return ar[n>>2]=f,Pn(r,48902,n),void(ur=o);for(a&=255;u=0|or[A+32+((a=(c=a)+-1|0)<<1)>>1],l=0|tr[A+80+a>>0]?88:111,(0|e)<(0|u)?(ar[t>>2]=u,ar[4+t>>2]=255&l,Pn(r,48895,t)):tr[f+(u+e)>>0]=l,1<(0|c););ar[n>>2]=f,Pn(r,48902,n),ur=o}function yc(A){A|=0;var e,r=0,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0;s=ur=(e=ur)+31&-32,ur=ur+16|0;do{if(A>>>0<245){if(A=(l=A>>>0<11?16:A+11&-8)>>>3,3&(i=(b=0|ar[14392])>>>A)|0)return f=0|ar[(i=(A=57608+((r=(1&i^1)+A|0)<<1<<2)|0)+8|0)>>2],(0|A)==(0|(t=0|ar[(n=f+8|0)>>2]))?ar[14392]=b&~(1<<r):(ar[t+12>>2]=A,ar[i>>2]=t),Z=r<<3,ar[f+4>>2]=3|Z,ar[(Z=f+Z+4|0)>>2]=1|ar[Z>>2],ur=e,0|(Z=n);if((u=0|ar[14394])>>>0<l>>>0){if(0|i)return r=((r=i<<A&((r=2<<A)|0-r))&0-r)-1|0,n=0|ar[(A=(r=57608+((f=((i=(r>>>=o=r>>>12&16)>>>5&8)|o|(n=(r>>>=i)>>>2&4)|(A=(r>>>=n)>>>1&2)|(f=(r>>>=A)>>>1&1))+(r>>>f)|0)<<1<<2)|0)+8|0)>>2],(0|r)==(0|(i=0|ar[(o=n+8|0)>>2]))?(A=b&~(1<<f),ar[14392]=A):(ar[i+12>>2]=r,ar[A>>2]=i,A=b),t=(f<<3)-l|0,ar[n+4>>2]=3|l,ar[(f=n+l|0)+4>>2]=1|t,ar[f+t>>2]=t,0|u&&(n=0|ar[14397],i=57608+((r=u>>>3)<<1<<2)|0,A&(r=1<<r)?r=0|ar[(A=i+8|0)>>2]:(ar[14392]=A|r,A=(r=i)+8|0),ar[A>>2]=n,ar[r+12>>2]=n,ar[n+8>>2]=r,ar[n+12>>2]=i),ar[14394]=t,ar[14397]=f,ur=e,0|(Z=o);if(a=0|ar[14393]){if(i=(a&0-a)-1|0,A=0|ar[57872+(((t=(i>>>=o=i>>>12&16)>>>5&8)|o|(c=(i>>>=t)>>>2&4)|(f=(i>>>=c)>>>1&2)|(A=(i>>>=f)>>>1&1))+(i>>>A)<<2)>>2],i=(-8&ar[A+4>>2])-l|0,f=0|ar[A+16+((0==(0|ar[A+16>>2])&1)<<2)>>2]){for(;i=(c=(o=(-8&ar[f+4>>2])-l|0)>>>0<i>>>0)?o:i,A=c?f:A,0!=(0|(f=0|ar[f+16+((0==(0|ar[f+16>>2])&1)<<2)>>2])););c=A,t=i}else c=A,t=i;if(c>>>0<(o=c+l|0)>>>0){n=0|ar[c+24>>2],r=0|ar[c+12>>2];do{if((0|r)==(0|c)){if(!(r=0|ar[(A=c+20|0)>>2])&&!(r=0|ar[(A=c+16|0)>>2])){i=0;break}for(;;)if(0|(f=0|ar[(i=r+20|0)>>2]))r=f,A=i;else{if(!(f=0|ar[(i=r+16|0)>>2]))break;r=f,A=i}ar[A>>2]=0,i=r}else i=0|ar[c+8>>2],ar[i+12>>2]=r,ar[r+8>>2]=i,i=r}while(0);do{if(0|n){if(r=0|ar[c+28>>2],(0|c)==(0|ar[(A=57872+(r<<2)|0)>>2])){if(!(ar[A>>2]=i)){ar[14393]=a&~(1<<r);break}}else if(!(ar[n+16+(((0|ar[n+16>>2])!=(0|c)&1)<<2)>>2]=i))break;ar[i+24>>2]=n,0|(r=0|ar[c+16>>2])&&(ar[i+16>>2]=r,ar[r+24>>2]=i),0|(r=0|ar[c+20>>2])&&(ar[i+20>>2]=r,ar[r+24>>2]=i)}}while(0);return t>>>0<16?(Z=t+l|0,ar[c+4>>2]=3|Z,ar[(Z=c+Z+4|0)>>2]=1|ar[Z>>2]):(ar[c+4>>2]=3|l,ar[o+4>>2]=1|t,ar[o+t>>2]=t,0|u&&(f=0|ar[14397],i=57608+((r=u>>>3)<<1<<2)|0,b&(r=1<<r)?r=0|ar[(A=i+8|0)>>2]:(ar[14392]=b|r,A=(r=i)+8|0),ar[A>>2]=f,ar[r+12>>2]=f,ar[f+8>>2]=r,ar[f+12>>2]=i),ar[14394]=t,ar[14397]=o),ur=e,0|(Z=c+8|0)}b=l}else b=l}else b=l}else if(A>>>0<=4294967231)if(l=-8&(A=A+11|0),c=0|ar[14393]){f=0-l|0,a=(A>>>=8)?16777215<l>>>0?31:l>>>((a=14-((u=((g=A<<(b=(A+1048320|0)>>>16&8))+520192|0)>>>16&4)|b|(a=((g<<=u)+245760|0)>>>16&2))+(g<<a>>>15)|0)+7|0)&1|a<<1:0,i=0|ar[57872+(a<<2)>>2];A:do{if(i)for(o=l<<(31==((A=0)|a)?0:25-(a>>>1)|0),t=0;;){if((n=(-8&ar[i+4>>2])-l|0)>>>0<f>>>0){if(!n){f=0,n=A=i,g=61;break A}A=i,f=n}if(t=0==(0|(n=0|ar[i+20>>2]))|(0|n)==(0|(i=0|ar[i+16+(o>>>31<<2)>>2]))?t:n,n=0==(0|i)){i=t,g=57;break}o<<=1&(1^n)}else A=i=0,g=57}while(0);if(57==(0|g)){if(0==(0|i)&0==(0|A)){if(!(A=c&((A=2<<a)|0-A))){b=l;break}b=(A&0-A)-1|0,i=(A=0)|ar[57872+(((t=(b>>>=o=b>>>12&16)>>>5&8)|o|(a=(b>>>=t)>>>2&4)|(u=(b>>>=a)>>>1&2)|(i=(b>>>=u)>>>1&1))+(b>>>i)<<2)>>2]}i?(n=i,g=61):(a=A,o=f)}if(61==(0|g))for(;;){if(g=0,i=(b=(i=(-8&ar[n+4>>2])-l|0)>>>0<f>>>0)?i:f,A=b?n:A,!(n=0|ar[n+16+((0==(0|ar[n+16>>2])&1)<<2)>>2])){a=A,o=i;break}f=i,g=61}if(0!=(0|a)&&o>>>0<((0|ar[14394])-l|0)>>>0){if((t=a+l|0)>>>0<=a>>>0)return ur=e,(Z=0)|Z;n=0|ar[a+24>>2],r=0|ar[a+12>>2];do{if((0|r)==(0|a)){if(!(r=0|ar[(A=a+20|0)>>2])&&!(r=0|ar[(A=a+16|0)>>2])){r=0;break}for(;;)if(0|(f=0|ar[(i=r+20|0)>>2]))r=f,A=i;else{if(!(f=0|ar[(i=r+16|0)>>2]))break;r=f,A=i}ar[A>>2]=0}else Z=0|ar[a+8>>2],ar[Z+12>>2]=r,ar[r+8>>2]=Z}while(0);do{if(n){if(A=0|ar[a+28>>2],(0|a)==(0|ar[(i=57872+(A<<2)|0)>>2])){if(!(ar[i>>2]=r)){f=c&~(1<<A),ar[14393]=f;break}}else if(!(ar[n+16+(((0|ar[n+16>>2])!=(0|a)&1)<<2)>>2]=r)){f=c;break}ar[r+24>>2]=n,0|(A=0|ar[a+16>>2])&&(ar[r+16>>2]=A,ar[A+24>>2]=r),f=((A=0|ar[a+20>>2])&&(ar[r+20>>2]=A,ar[A+24>>2]=r),c)}else f=c}while(0);do{if(16<=o>>>0){if(ar[a+4>>2]=3|l,ar[t+4>>2]=1|o,r=(ar[t+o>>2]=o)>>>3,o>>>0<256){i=57608+(r<<1<<2)|0,(A=0|ar[14392])&(r=1<<r)?r=0|ar[(A=i+8|0)>>2]:(ar[14392]=A|r,A=(r=i)+8|0),ar[A>>2]=t,ar[r+12>>2]=t,ar[t+8>>2]=r,ar[t+12>>2]=i;break}if(i=57872+((r=(r=o>>>8)?16777215<o>>>0?31:o>>>((r=14-((m=((Z=r<<(g=(r+1048320|0)>>>16&8))+520192|0)>>>16&4)|g|(r=((Z<<=m)+245760|0)>>>16&2))+(Z<<r>>>15)|0)+7|0)&1|r<<1:0)<<2)|0,ar[t+28>>2]=r,ar[(A=t+16|0)+4>>2]=0,ar[A>>2]=0,!(f&(A=1<<r))){ar[14393]=f|A,ar[i>>2]=t,ar[t+24>>2]=i,ar[t+12>>2]=t,ar[t+8>>2]=t;break}for(A=o<<(31==(0|r)?0:25-(r>>>1)|0),i=0|ar[i>>2];;){if((-8&ar[i+4>>2]|0)==(0|o)){g=97;break}if(!(r=0|ar[(f=i+16+(A>>>31<<2)|0)>>2])){g=96;break}A<<=1,i=r}if(96==(0|g)){ar[f>>2]=t,ar[t+24>>2]=i,ar[t+12>>2]=t,ar[t+8>>2]=t;break}if(97==(0|g)){Z=0|ar[(g=i+8|0)>>2],ar[Z+12>>2]=t,ar[g>>2]=t,ar[t+8>>2]=Z,ar[t+12>>2]=i,ar[t+24>>2]=0;break}}else Z=o+l|0,ar[a+4>>2]=3|Z,ar[(Z=a+Z+4|0)>>2]=1|ar[Z>>2]}while(0);return ur=e,0|(Z=a+8|0)}b=l}else b=l;else b=-1}while(0);if(b>>>0<=(i=0|ar[14394])>>>0)return r=i-b|0,A=0|ar[14397],15<r>>>0?(Z=A+b|0,ar[14397]=Z,ar[14394]=r,ar[Z+4>>2]=1|r,ar[Z+r>>2]=r,ar[A+4>>2]=3|b):(ar[14394]=0,ar[14397]=0,ar[A+4>>2]=3|i,ar[(Z=A+i+4|0)>>2]=1|ar[Z>>2]),ur=e,0|(Z=A+8|0);if(b>>>0<(o=0|ar[14395])>>>0)return m=o-b|0,ar[14395]=m,g=(Z=0|ar[14398])+b|0,ar[14398]=g,ar[g+4>>2]=1|m,ar[Z+4>>2]=3|b,ur=e,0|(Z=Z+8|0);if(a=b+48|0,(l=(t=(A=0|ar[14510]?0|ar[14512]:(ar[14512]=4096,ar[14511]=4096,ar[14513]=-1,ar[14514]=-1,ar[14515]=0,ar[14503]=0,A=-16&s^1431655768,ar[s>>2]=A,ar[14510]=A,4096))+(c=b+47|0)|0)&(n=0-A|0))>>>0<=b>>>0)return ur=e,(Z=0)|Z;if(0|(A=0|ar[14502])&&(s=(u=0|ar[14500])+l|0)>>>0<=u>>>0|A>>>0<s>>>0)return ur=e,(Z=0)|Z;A:do{if(4&ar[14503])r=0,g=133;else{i=0|ar[14398];e:do{if(i){for(f=58016;!((A=0|ar[f>>2])>>>0<=i>>>0&&(A+(0|ar[(h=f+4|0)>>2])|0)>>>0>i>>>0);){if(!(A=0|ar[f+8>>2])){g=118;break e}f=A}if((r=t-o&n)>>>0<2147483647)if((0|(A=0|yb(0|r)))==((0|ar[f>>2])+(0|ar[h>>2])|0)){if(-1!=(0|A)){o=r,t=A,g=135;break A}}else f=A,g=126;else r=0}else g=118}while(0);do{if(118==(0|g))if(-1!=(0|(i=0|yb(0)))&&(r=i,k=(r=(0==((k=(d=0|ar[14511])+-1|0)&r|0)?0:(k+r&0-d)-r|0)+l|0)+(d=0|ar[14500])|0,b>>>0<r>>>0&r>>>0<2147483647)){if(0|(h=0|ar[14502])&&k>>>0<=d>>>0|h>>>0<k>>>0){r=0;break}if((0|(A=0|yb(0|r)))==(0|i)){o=r,t=i,g=135;break A}f=A,g=126}else r=0}while(0);do{if(126==(0|g)){if(i=0-r|0,!(r>>>0<a>>>0&r>>>0<2147483647&-1!=(0|f))){if(-1==(0|f)){r=0;break}o=r,t=f,g=135;break A}if(2147483647<=(A=c-r+(A=0|ar[14512])&0-A)>>>0){o=r,t=f,g=135;break A}if(-1==(0|yb(0|A))){yb(0|i),r=0;break}o=A+r|0,t=f,g=135;break A}}while(0);ar[14503]=4|ar[14503],g=133}}while(0);if(133==(0|g)&&l>>>0<2147483647&&!(-1==(0|(m=0|yb(0|l)))|1^(v=(b+40|0)>>>0<(w=(h=0|yb(0))-m|0)>>>0)|m>>>0<h>>>0&-1!=(0|m)&-1!=(0|h)^1)&&(o=v?w:r,t=m,g=135),135==(0|g)){r=(0|ar[14500])+o|0,(ar[14500]=r)>>>0>(0|ar[14501])>>>0&&(ar[14501]=r),c=0|ar[14398];do{if(c){for(r=58016;;){if((0|t)==((A=0|ar[r>>2])+(f=0|ar[(i=r+4|0)>>2])|0)){g=145;break}if(!(n=0|ar[r+8>>2]))break;r=n}if(145==(0|g)&&0==(8&ar[r+12>>2]|0)&&c>>>0<t>>>0&A>>>0<=c>>>0){ar[i>>2]=f+o,g=c+(Z=0==(7&(Z=c+8|0)|0)?0:0-Z&7)|0,Z=(0|ar[14395])+(o-Z)|0,ar[14398]=g,ar[14395]=Z,ar[g+4>>2]=1|Z,ar[g+Z+4>>2]=40,ar[14399]=ar[14514];break}for(t>>>0<(0|ar[14396])>>>0&&(ar[14396]=t),i=t+o|0,r=58016;;){if((0|ar[r>>2])==(0|i)){g=153;break}if(!(A=0|ar[r+8>>2]))break;r=A}if(153==(0|g)&&0==(8&ar[r+12>>2]|0)){ar[r>>2]=t,ar[(u=r+4|0)>>2]=(0|ar[u>>2])+o,l=(u=t+(0==(7&(u=t+8|0)|0)?0:0-u&7)|0)+b|0,a=(r=i+(0==(7&(r=i+8|0)|0)?0:0-r&7)|0)-u-b|0,ar[u+4>>2]=3|b;do{if((0|r)!=(0|c)){if((0|r)==(0|ar[14397])){Z=(0|ar[14394])+a|0,ar[14394]=Z,ar[14397]=l,ar[l+4>>2]=1|Z,ar[l+Z>>2]=Z;break}if(1==(3&(A=0|ar[r+4>>2])|0)){o=-8&A,f=A>>>3;A:do{if(A>>>0<256){if(A=0|ar[r+8>>2],(0|(i=0|ar[r+12>>2]))==(0|A)){ar[14392]=ar[14392]&~(1<<f);break}ar[A+12>>2]=i,ar[i+8>>2]=A;break}t=0|ar[r+24>>2],A=0|ar[r+12>>2];do{if((0|A)==(0|r)){if(!(A=0|ar[(i=(f=r+16|0)+4|0)>>2])){if(!(A=0|ar[f>>2])){A=0;break}i=f}for(;;)if(0|(n=0|ar[(f=A+20|0)>>2]))A=n,i=f;else{if(!(n=0|ar[(f=A+16|0)>>2]))break;A=n,i=f}ar[i>>2]=0}else Z=0|ar[r+8>>2],ar[Z+12>>2]=A,ar[A+8>>2]=Z}while(0);if(!t)break;f=57872+((i=0|ar[r+28>>2])<<2)|0;do{if((0|r)==(0|ar[f>>2])){if(0|(ar[f>>2]=A))break;ar[14393]=ar[14393]&~(1<<i);break A}if(!(ar[t+16+(((0|ar[t+16>>2])!=(0|r)&1)<<2)>>2]=A))break A}while(0);if(ar[A+24>>2]=t,0|(f=0|ar[(i=r+16|0)>>2])&&(ar[A+16>>2]=f,ar[f+24>>2]=A),!(i=0|ar[i+4>>2]))break;ar[A+20>>2]=i,ar[i+24>>2]=A}while(0);r=r+o|0,n=o+a|0}else n=a;if(ar[(r=r+4|0)>>2]=-2&ar[r>>2],ar[l+4>>2]=1|n,r=(ar[l+n>>2]=n)>>>3,n>>>0<256){i=57608+(r<<1<<2)|0,(A=0|ar[14392])&(r=1<<r)?r=0|ar[(A=i+8|0)>>2]:(ar[14392]=A|r,A=(r=i)+8|0),ar[A>>2]=l,ar[r+12>>2]=l,ar[l+8>>2]=r,ar[l+12>>2]=i;break}r=n>>>8;do{if(r){if(16777215<n>>>0){r=31;break}r=n>>>((r=14-((m=((Z=r<<(g=(r+1048320|0)>>>16&8))+520192|0)>>>16&4)|g|(r=((Z<<=m)+245760|0)>>>16&2))+(Z<<r>>>15)|0)+7|0)&1|r<<1}else r=0}while(0);if(f=57872+(r<<2)|0,ar[l+28>>2]=r,ar[(A=l+16|0)+4>>2]=0,!((A=(ar[A>>2]=0)|ar[14393])&(i=1<<r))){ar[14393]=A|i,ar[f>>2]=l,ar[l+24>>2]=f,ar[l+12>>2]=l,ar[l+8>>2]=l;break}for(A=n<<(31==(0|r)?0:25-(r>>>1)|0),i=0|ar[f>>2];;){if((-8&ar[i+4>>2]|0)==(0|n)){g=194;break}if(!(r=0|ar[(f=i+16+(A>>>31<<2)|0)>>2])){g=193;break}A<<=1,i=r}if(193==(0|g)){ar[f>>2]=l,ar[l+24>>2]=i,ar[l+12>>2]=l,ar[l+8>>2]=l;break}if(194==(0|g)){Z=0|ar[(g=i+8|0)>>2],ar[Z+12>>2]=l,ar[g>>2]=l,ar[l+8>>2]=Z,ar[l+12>>2]=i,ar[l+24>>2]=0;break}}else Z=(0|ar[14395])+a|0,ar[14395]=Z,ar[14398]=l,ar[l+4>>2]=1|Z}while(0);return ur=e,0|(Z=u+8|0)}for(r=58016;!((A=0|ar[r>>2])>>>0<=c>>>0&&c>>>0<(Z=A+(0|ar[r+4>>2])|0)>>>0);)r=0|ar[r+8>>2];for(r=(A=(A=(n=Z+-47|0)+(0==(7&(A=n+8|0)|0)?0:0-A&7)|0)>>>0<(n=c+16|0)>>>0?c:A)+8|0,g=t+(i=0==(7&(i=t+8|0)|0)?0:0-i&7)|0,i=o+-40-i|0,ar[14398]=g,ar[14395]=i,ar[g+4>>2]=1|i,ar[g+i+4>>2]=40,ar[14399]=ar[14514],ar[(i=A+4|0)>>2]=27,ar[r>>2]=ar[14504],ar[r+4>>2]=ar[14505],ar[r+8>>2]=ar[14506],ar[r+12>>2]=ar[14507],ar[14504]=t,ar[14505]=o,ar[14507]=0,ar[14506]=r,r=A+24|0;ar[(r=(g=r)+4|0)>>2]=7,(g+8|0)>>>0<Z>>>0;);if((0|A)!=(0|c)){if(t=A-c|0,ar[i>>2]=-2&ar[i>>2],ar[c+4>>2]=1|t,r=(ar[A>>2]=t)>>>3,t>>>0<256){i=57608+(r<<1<<2)|0,(A=0|ar[14392])&(r=1<<r)?r=0|ar[(A=i+8|0)>>2]:(ar[14392]=A|r,A=(r=i)+8|0),ar[A>>2]=c,ar[r+12>>2]=c,ar[c+8>>2]=r,ar[c+12>>2]=i;break}if(f=57872+((i=(r=t>>>8)?16777215<t>>>0?31:t>>>((i=14-((m=((Z=r<<(g=(r+1048320|0)>>>16&8))+520192|0)>>>16&4)|g|(i=((Z<<=m)+245760|0)>>>16&2))+(Z<<i>>>15)|0)+7|0)&1|i<<1:0)<<2)|0,ar[c+28>>2]=i,ar[c+20>>2]=0,!((r=(ar[n>>2]=0)|ar[14393])&(A=1<<i))){ar[14393]=r|A,ar[f>>2]=c,ar[c+24>>2]=f,ar[c+12>>2]=c,ar[c+8>>2]=c;break}for(A=t<<(31==(0|i)?0:25-(i>>>1)|0),i=0|ar[f>>2];;){if((-8&ar[i+4>>2]|0)==(0|t)){g=216;break}if(!(r=0|ar[(f=i+16+(A>>>31<<2)|0)>>2])){g=215;break}A<<=1,i=r}if(215==(0|g)){ar[f>>2]=c,ar[c+24>>2]=i,ar[c+12>>2]=c,ar[c+8>>2]=c;break}if(216==(0|g)){Z=0|ar[(g=i+8|0)>>2],ar[Z+12>>2]=c,ar[g>>2]=c,ar[c+8>>2]=Z,ar[c+12>>2]=i,ar[c+24>>2]=0;break}}}else{for(0==(0|(Z=0|ar[14396]))|t>>>0<Z>>>0&&(ar[14396]=t),ar[14504]=t,ar[14505]=o,ar[14507]=0,ar[14401]=ar[14510],ar[14400]=-1,r=0;ar[(Z=57608+(r<<1<<2)|0)+12>>2]=Z,ar[Z+8>>2]=Z,32!=(0|(r=r+1|0)););g=t+(Z=0==(7&(Z=t+8|0)|0)?0:0-Z&7)|0,Z=o+-40-Z|0,ar[14398]=g,ar[14395]=Z,ar[g+4>>2]=1|Z,ar[g+Z+4>>2]=40,ar[14399]=ar[14514]}}while(0);if(b>>>0<(r=0|ar[14395])>>>0)return m=r-b|0,ar[14395]=m,g=(Z=0|ar[14398])+b|0,ar[14398]=g,ar[g+4>>2]=1|m,ar[Z+4>>2]=3|b,ur=e,0|(Z=Z+8|0)}return ar[(Z=10364)>>2]=12,ur=e,(Z=0)|Z}function Bc(A){var e=0,r=0,i=0,f=0,n=0,t=0,o=0,a=0;if(A|=0){r=A+-8|0,f=0|ar[14396],a=r+(e=-8&(A=0|ar[A+-4>>2]))|0;do{if(1&A)t=o=r;else{if(i=0|ar[r>>2],!(3&A))return;if(n=i+e|0,(t=r+(0-i)|0)>>>0<f>>>0)return;if((0|t)==(0|ar[14397])){if(3==(3&(e=0|ar[(A=a+4|0)>>2])|0))return ar[14394]=n,ar[A>>2]=-2&e,ar[t+4>>2]=1|n,void(ar[t+n>>2]=n);o=t,e=n;break}if(r=i>>>3,i>>>0<256){if(A=0|ar[t+8>>2],(0|(e=0|ar[t+12>>2]))==(0|A)){ar[14392]=ar[14392]&~(1<<r),o=t,e=n;break}ar[A+12>>2]=e,ar[e+8>>2]=A,o=t,e=n;break}f=0|ar[t+24>>2],A=0|ar[t+12>>2];do{if((0|A)==(0|t)){if(!(A=0|ar[(e=(r=t+16|0)+4|0)>>2])){if(!(A=0|ar[r>>2])){A=0;break}e=r}for(;;)if(0|(i=0|ar[(r=A+20|0)>>2]))A=i,e=r;else{if(!(i=0|ar[(r=A+16|0)>>2]))break;A=i,e=r}ar[e>>2]=0}else o=0|ar[t+8>>2],ar[o+12>>2]=A,ar[A+8>>2]=o}while(0);if(f){if(e=0|ar[t+28>>2],(0|t)==(0|ar[(r=57872+(e<<2)|0)>>2])){if(!(ar[r>>2]=A)){ar[14393]=ar[14393]&~(1<<e),o=t,e=n;break}}else if(!(ar[f+16+(((0|ar[f+16>>2])!=(0|t)&1)<<2)>>2]=A)){o=t,e=n;break}ar[A+24>>2]=f,0|(r=0|ar[(e=t+16|0)>>2])&&(ar[A+16>>2]=r,ar[r+24>>2]=A),e=(o=((e=0|ar[e+4>>2])&&(ar[A+20>>2]=e,ar[e+24>>2]=A),t),n)}else o=t,e=n}}while(0);if(!(a>>>0<=t>>>0)&&1&(i=0|ar[(A=a+4|0)>>2])){if(2&i)ar[A>>2]=-2&i,ar[o+4>>2]=1|e,f=ar[t+e>>2]=e;else{if(A=0|ar[14397],(0|a)==(0|ar[14398])){if(a=(0|ar[14395])+e|0,ar[14395]=a,ar[14398]=o,ar[o+4>>2]=1|a,(0|o)!=(0|A))return;return ar[14397]=0,void(ar[14394]=0)}if((0|a)==(0|A))return a=(0|ar[14394])+e|0,ar[14394]=a,ar[14397]=t,ar[o+4>>2]=1|a,void(ar[t+a>>2]=a);f=(-8&i)+e|0,r=i>>>3;do{if(i>>>0<256){if(e=0|ar[a+8>>2],(0|(A=0|ar[a+12>>2]))==(0|e)){ar[14392]=ar[14392]&~(1<<r);break}ar[e+12>>2]=A,ar[A+8>>2]=e;break}n=0|ar[a+24>>2],A=0|ar[a+12>>2];do{if((0|A)==(0|a)){if(!(A=0|ar[(e=(r=a+16|0)+4|0)>>2])){if(!(A=0|ar[r>>2])){r=0;break}e=r}for(;;)if(0|(i=0|ar[(r=A+20|0)>>2]))A=i,e=r;else{if(!(i=0|ar[(r=A+16|0)>>2]))break;A=i,e=r}ar[e>>2]=0,r=A}else r=0|ar[a+8>>2],ar[r+12>>2]=A,ar[A+8>>2]=r,r=A}while(0);if(0|n){if(A=0|ar[a+28>>2],(0|a)==(0|ar[(e=57872+(A<<2)|0)>>2])){if(!(ar[e>>2]=r)){ar[14393]=ar[14393]&~(1<<A);break}}else if(!(ar[n+16+(((0|ar[n+16>>2])!=(0|a)&1)<<2)>>2]=r))break;ar[r+24>>2]=n,0|(e=0|ar[(A=a+16|0)>>2])&&(ar[r+16>>2]=e,ar[e+24>>2]=r),0|(A=0|ar[A+4>>2])&&(ar[r+20>>2]=A,ar[A+24>>2]=r)}}while(0);if(ar[o+4>>2]=1|f,ar[t+f>>2]=f,(0|o)==(0|ar[14397]))return void(ar[14394]=f)}if(A=f>>>3,f>>>0<256)return r=57608+(A<<1<<2)|0,(e=0|ar[14392])&(A=1<<A)?A=0|ar[(e=r+8|0)>>2]:(ar[14392]=e|A,e=(A=r)+8|0),ar[e>>2]=o,ar[A+12>>2]=o,ar[o+8>>2]=A,void(ar[o+12>>2]=r);i=57872+((A=(A=f>>>8)?16777215<f>>>0?31:f>>>((A=14-((n=((a=A<<(t=(A+1048320|0)>>>16&8))+520192|0)>>>16&4)|t|(A=((a<<=n)+245760|0)>>>16&2))+(a<<A>>>15)|0)+7|0)&1|A<<1:0)<<2)|0,ar[o+28>>2]=A,ar[o+20>>2]=0,e=(ar[o+16>>2]=0)|ar[14393],r=1<<A;do{if(e&r){for(e=f<<(31==(0|A)?0:25-(A>>>1)|0),r=0|ar[i>>2];;){if((-8&ar[r+4>>2]|0)==(0|f)){A=73;break}if(!(A=0|ar[(i=r+16+(e>>>31<<2)|0)>>2])){A=72;break}e<<=1,r=A}if(72==(0|A)){ar[i>>2]=o,ar[o+24>>2]=r,ar[o+12>>2]=o,ar[o+8>>2]=o;break}if(73==(0|A)){a=0|ar[(t=r+8|0)>>2],ar[a+12>>2]=o,ar[t>>2]=o,ar[o+8>>2]=a,ar[o+12>>2]=r,ar[o+24>>2]=0;break}}else ar[14393]=e|r,ar[i>>2]=o,ar[o+24>>2]=i,ar[o+12>>2]=o,ar[o+8>>2]=o}while(0);if(a=(0|ar[14400])-1|0,!(ar[14400]=a)){for(A=58024;A=0|ar[A>>2];)A=A+8|0;ar[14400]=-1}}}}function Ec(A,e){e|=0;var r=0,i=0;return(A|=0)?4294967231<e>>>0?(ar[(e=10364)>>2]=12,(e=0)|e):0|(r=0|function(A,e){e|=0;var r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0;if(l=0|ar[(u=4+(A|=0)|0)>>2],r=A+(f=-8&l)|0,!(3&l))return!(e>>>0<256)&&(e+4|0)>>>0<=f>>>0&&(f-e|0)>>>0<=ar[14512]<<1>>>0?0|A:(A=0)|A;if(e>>>0<=f>>>0)return(f=f-e|0)>>>0<=15||(c=A+e|0,ar[u>>2]=1&l|e|2,ar[c+4>>2]=3|f,ar[(u=c+f+4|0)>>2]=1|ar[u>>2],Xc(c,f)),0|A;if((0|r)==(0|ar[14398]))return c=(0|ar[14395])+f|0,f=c-e|0,n=A+e|0,c>>>0<=e>>>0?(A=0)|A:(ar[u>>2]=1&l|e|2,ar[n+4>>2]=1|f,ar[14398]=n,ar[14395]=f,0|A);if((0|r)==(0|ar[14397]))return(t=(0|ar[14394])+f|0)>>>0<e>>>0?(A=0)|A:(n=1&l,15<(f=t-e|0)>>>0?(c=(l=A+e|0)+f|0,ar[u>>2]=n|e|2,ar[l+4>>2]=1|f,ar[c>>2]=f,ar[(n=c+4|0)>>2]=-2&ar[n>>2],n=l):(ar[u>>2]=n|t|2,ar[(n=A+t+4|0)>>2]=1|ar[n>>2],f=n=0),ar[14394]=f,ar[14397]=n,0|A);if(2&(n=0|ar[4+r>>2])|0)return(A=0)|A;if((i=(-8&n)+f|0)>>>0<e>>>0)return(A=0)|A;c=i-e|0,t=n>>>3;do{if(n>>>0<256){if(n=0|ar[8+r>>2],(0|(f=0|ar[12+r>>2]))==(0|n)){ar[14392]=ar[14392]&~(1<<t);break}ar[n+12>>2]=f,ar[f+8>>2]=n;break}a=0|ar[24+r>>2],f=0|ar[12+r>>2];do{if((0|f)==(0|r)){if(f=0|ar[(n=(t=16+r|0)+4|0)>>2])o=n;else{if(!(f=0|ar[t>>2])){t=0;break}o=t}for(;;)if(0|(n=0|ar[(t=f+20|0)>>2]))f=n,o=t;else{if(!(t=0|ar[(n=f+16|0)>>2]))break;f=t,o=n}ar[o>>2]=0,t=f}else t=0|ar[8+r>>2],ar[t+12>>2]=f,ar[f+8>>2]=t,t=f}while(0);if(0|a){if(f=0|ar[28+r>>2],(0|r)==(0|ar[(n=57872+(f<<2)|0)>>2])){if(!(ar[n>>2]=t)){ar[14393]=ar[14393]&~(1<<f);break}}else if(!(ar[a+16+(((0|ar[a+16>>2])!=(0|r)&1)<<2)>>2]=t))break;ar[t+24>>2]=a,0|(n=0|ar[(f=16+r|0)>>2])&&(ar[t+16>>2]=n,ar[n+24>>2]=t),0|(f=0|ar[f+4>>2])&&(ar[t+20>>2]=f,ar[f+24>>2]=t)}}while(0);return f=1&l,c>>>0<16?(ar[u>>2]=i|f|2,ar[(u=A+i+4|0)>>2]=1|ar[u>>2]):(l=A+e|0,ar[u>>2]=f|e|2,ar[l+4>>2]=3|c,ar[(u=l+c+4|0)>>2]=1|ar[u>>2],Xc(l,c)),0|A}(A+-8|0,e>>>0<11?16:e+11&-8))?0|(e=r+8|0):(r=0|yc(e))?(hb(0|r,0|A,0|((i=(-8&(i=0|ar[A+-4>>2]))-(0==(3&i|0)?8:4)|0)>>>0<e>>>0?i:e)),Bc(A),0|(e=r)):(e=0)|e:0|(e=0|yc(e))}function Xc(A,e){var r=0,i=0,f=0,n=0,t=0,o=0,a=0;a=(A|=0)+(e|=0)|0,r=0|ar[A+4>>2];do{if(1&r)o=A,r=e;else{if(i=0|ar[A>>2],!(3&r))return;if(t=i+e|0,(0|(n=A+(0-i)|0))==(0|ar[14397])){if(3==(3&(r=0|ar[(A=a+4|0)>>2])|0))return ar[14394]=t,ar[A>>2]=-2&r,ar[n+4>>2]=1|t,void(ar[n+t>>2]=t);o=n,r=t;break}if(e=i>>>3,i>>>0<256){if(A=0|ar[n+8>>2],(0|(r=0|ar[n+12>>2]))==(0|A)){ar[14392]=ar[14392]&~(1<<e),o=n,r=t;break}ar[A+12>>2]=r,ar[r+8>>2]=A,o=n,r=t;break}f=0|ar[n+24>>2],A=0|ar[n+12>>2];do{if((0|A)==(0|n)){if(!(A=0|ar[(r=(e=n+16|0)+4|0)>>2])){if(!(A=0|ar[e>>2])){A=0;break}r=e}for(;;)if(0|(i=0|ar[(e=A+20|0)>>2]))A=i,r=e;else{if(!(i=0|ar[(e=A+16|0)>>2]))break;A=i,r=e}ar[r>>2]=0}else o=0|ar[n+8>>2],ar[o+12>>2]=A,ar[A+8>>2]=o}while(0);if(f){if(r=0|ar[n+28>>2],(0|n)==(0|ar[(e=57872+(r<<2)|0)>>2])){if(!(ar[e>>2]=A)){ar[14393]=ar[14393]&~(1<<r),o=n,r=t;break}}else if(!(ar[f+16+(((0|ar[f+16>>2])!=(0|n)&1)<<2)>>2]=A)){o=n,r=t;break}ar[A+24>>2]=f,0|(e=0|ar[(r=n+16|0)>>2])&&(ar[A+16>>2]=e,ar[e+24>>2]=A),r=(o=((r=0|ar[r+4>>2])&&(ar[A+20>>2]=r,ar[r+24>>2]=A),n),t)}else o=n,r=t}}while(0);if(2&(i=0|ar[(A=a+4|0)>>2]))ar[A>>2]=-2&i,ar[o+4>>2]=1|r,ar[o+r>>2]=r;else{if(A=0|ar[14397],(0|a)==(0|ar[14398]))return a=(0|ar[14395])+r|0,ar[14395]=a,ar[14398]=o,ar[o+4>>2]=1|a,(0|o)==(0|A)&&(ar[14397]=0,void(ar[14394]=0));if((0|a)==(0|A))return a=(0|ar[14394])+r|0,ar[14394]=a,ar[14397]=o,ar[o+4>>2]=1|a,void(ar[o+a>>2]=a);n=(-8&i)+r|0,e=i>>>3;do{if(i>>>0<256){if(r=0|ar[a+8>>2],(0|(A=0|ar[a+12>>2]))==(0|r)){ar[14392]=ar[14392]&~(1<<e);break}ar[r+12>>2]=A,ar[A+8>>2]=r;break}f=0|ar[a+24>>2],A=0|ar[a+12>>2];do{if((0|A)==(0|a)){if(!(A=0|ar[(r=(e=a+16|0)+4|0)>>2])){if(!(A=0|ar[e>>2])){e=0;break}r=e}for(;;)if(0|(i=0|ar[(e=A+20|0)>>2]))A=i,r=e;else{if(!(i=0|ar[(e=A+16|0)>>2]))break;A=i,r=e}ar[r>>2]=0,e=A}else e=0|ar[a+8>>2],ar[e+12>>2]=A,ar[A+8>>2]=e,e=A}while(0);if(0|f){if(A=0|ar[a+28>>2],(0|a)==(0|ar[(r=57872+(A<<2)|0)>>2])){if(!(ar[r>>2]=e)){ar[14393]=ar[14393]&~(1<<A);break}}else if(!(ar[f+16+(((0|ar[f+16>>2])!=(0|a)&1)<<2)>>2]=e))break;ar[e+24>>2]=f,0|(r=0|ar[(A=a+16|0)>>2])&&(ar[e+16>>2]=r,ar[r+24>>2]=e),0|(A=0|ar[A+4>>2])&&(ar[e+20>>2]=A,ar[A+24>>2]=e)}}while(0);if(ar[o+4>>2]=1|n,ar[o+n>>2]=n,(0|o)==(0|ar[14397]))return void(ar[14394]=n);r=n}if(A=r>>>3,r>>>0<256)return e=57608+(A<<1<<2)|0,(r=0|ar[14392])&(A=1<<A)?A=0|ar[(r=e+8|0)>>2]:(ar[14392]=r|A,r=(A=e)+8|0),ar[r>>2]=o,ar[A+12>>2]=o,ar[o+8>>2]=A,void(ar[o+12>>2]=e);if(f=57872+((A=(A=r>>>8)?16777215<r>>>0?31:r>>>((A=14-((n=((a=A<<(t=(A+1048320|0)>>>16&8))+520192|0)>>>16&4)|t|(A=((a<<=n)+245760|0)>>>16&2))+(a<<A>>>15)|0)+7|0)&1|A<<1:0)<<2)|0,ar[o+28>>2]=A,ar[o+20>>2]=0,!((e=(ar[o+16>>2]=0)|ar[14393])&(i=1<<A)))return ar[14393]=e|i,ar[f>>2]=o,ar[o+24>>2]=f,ar[o+12>>2]=o,void(ar[o+8>>2]=o);for(e=r<<(31==(0|A)?0:25-(A>>>1)|0),i=0|ar[f>>2];;){if((-8&ar[i+4>>2]|0)==(0|r)){A=69;break}if(!(A=0|ar[(f=i+16+(e>>>31<<2)|0)>>2])){A=68;break}e<<=1,i=A}return 68==(0|A)?(ar[f>>2]=o,ar[o+24>>2]=i,ar[o+12>>2]=o,void(ar[o+8>>2]=o)):69==(0|A)&&(a=0|ar[(t=i+8|0)>>2],ar[a+12>>2]=o,ar[t>>2]=o,ar[o+8>>2]=a,ar[o+12>>2]=i,void(ar[o+24>>2]=0))}function Wc(A,e){return e|=0,(A|=0)>>>0<9?0|(e=0|yc(e)):0|(e=0|function(A,e){e|=0;var r,i=0,f=0,n=0,t=0,o=0;if((A=16<(A|=0)>>>0?A:16)+-1&A)for(i=16;;){if(!(i>>>0<A>>>0)){A=i;break}i<<=1}if((-64-A|0)>>>0<=e>>>0)return ar[(t=10364)>>2]=12,(t=0)|t;if(!(i=0|yc(12+(n=e>>>0<11?16:e+11&-8)+A|0)))return(t=0)|t;r=i+-8|0;do{if(i&A+-1){if(e=(f=15<((f=(i+A+-1&0-A)-8|0)-(e=r)|0)>>>0?f:f+A|0)-e|0,o=0|ar[(A=i+-4|0)>>2],i=(-8&o)-e|0,3&o){ar[(o=f+4|0)>>2]=i|1&ar[o>>2]|2,ar[(i=f+i+4|0)>>2]=1|ar[i>>2],ar[A>>2]=e|1&ar[A>>2]|2,ar[o>>2]=1|ar[o>>2],Xc(r,e),e=A=f;break}ar[f>>2]=(0|ar[r>>2])+e,ar[f+4>>2]=i,e=A=f;break}e=A=r}while(0);3&(i=0|ar[(A=A+4|0)>>2])|0&&(t=-8&i)>>>0>(n+16|0)>>>0&&(o=t-n|0,t=e+n|0,ar[A>>2]=n|1&i|2,ar[t+4>>2]=3|o,ar[(n=t+o+4|0)>>2]=1|ar[n>>2],Xc(t,o));return 0|(o=e+8|0)}(A,e))}function Ic(A){return 4294963200<(A|=0)>>>0&&(ar[10364>>2]=0-A,A=-1),0|A}function Cc(){return 10364}function Gc(A,e,r){e|=0,r|=0;var i,f,n,t,o,a=0,c=0,l=0,u=0,b=0,s=0;c=ur=(o=ur)+31&-32,ur=ur+48|0,t=c+16|0,c=(l=c)+32|0,a=0|ar[(f=(A|=0)+28|0)>>2],ar[c>>2]=a,a=(0|ar[(n=A+20|0)>>2])-a|0,ar[c+4>>2]=a,ar[c+8>>2]=e,a=a+(ar[c+12>>2]=r)|0,i=A+60|0,ar[l>>2]=ar[i>>2],ar[l+4>>2]=c,ar[l+8>>2]=2,l=0|Ic(0|_(146,0|l));A:do{if((0|a)!=(0|l)){for(e=2;!((0|l)<0);)if(a=a-l|0,e=((b=(s=0|ar[c+4>>2])>>>0<l>>>0)<<31>>31)+e|0,s=l-(b?s:0)|0,ar[(c=b?c+8|0:c)>>2]=(0|ar[c>>2])+s,ar[(b=c+4|0)>>2]=(0|ar[b>>2])-s,ar[t>>2]=ar[i>>2],ar[4+t>>2]=c,ar[8+t>>2]=e,(0|a)==(0|(l=0|Ic(0|_(146,0|t))))){u=3;break A}ar[A+16>>2]=0,ar[f>>2]=0,ar[n>>2]=0,ar[A>>2]=32|ar[A>>2],r=2==(0|e)?0:r-(0|ar[c+4>>2])|0}else u=3}while(0);return 3==(0|u)&&(s=0|ar[A+44>>2],ar[A+16>>2]=s+(0|ar[A+48>>2]),ar[f>>2]=s,ar[n>>2]=s),ur=o,0|r}function Vc(A){var e,r=0,i=0;e=A|=0;A:do{if(3&e)for(r=e;;){if(!(0|tr[A>>0])){A=r;break A}if(!(3&(r=A=A+1|0))){i=4;break}}else i=4}while(0);if(4==(0|i)){for(;!((-2139062144&(r=0|ar[A>>2])^-2139062144)&r+-16843009);)A=A+4|0;if((255&r)<<24>>24)for(;0!=(0|tr[(A=A+1|0)>>0]););}return A-e|0}function Fc(A,e){e|=0;var r=0,i=0;if(r=0|tr[(A|=0)>>0],i=0|tr[e>>0],r<<24>>24==0||r<<24>>24!=i<<24>>24)A=i;else{for(;e=e+1|0,r=0|tr[(A=A+1|0)>>0],i=0|tr[e>>0],r<<24>>24!=0&&r<<24>>24==i<<24>>24;);A=i}return(255&r)-(255&A)|0}function Rc(A,e,r){A|=0;var i=0,f=0,n=0,t=0;n=255&(e|=0),i=0!=(0|(r|=0));A:do{if(i&0!=(3&A|0))for(f=255&e;;){if((0|tr[A>>0])==f<<24>>24){t=6;break A}if(!((i=0!=(0|(r=r+-1|0)))&0!=(3&(A=A+1|0)|0))){t=5;break}}else t=5}while(0);5==(0|t)&&(i?t=6:r=0);A:do{if(6==(0|t)&&(f=255&e,(0|tr[A>>0])!=f<<24>>24)){i=0|br(n,16843009);e:do{if(3<r>>>0){for(;!((-2139062144&(n=ar[A>>2]^i)^-2139062144)&n+-16843009|0);)if(A=A+4|0,(r=r+-4|0)>>>0<=3){t=11;break e}}else t=11}while(0);if(11==(0|t)&&!r){r=0;break}for(;;){if((0|tr[A>>0])==f<<24>>24)break A;if(A=A+1|0,!(r=r+-1|0)){r=0;break}}}}while(0);return 0|(0|r?A:0)}function Nc(A,e){A|=0;var r=0,i=0,f=0;i=255&(e|=0);A:do{if(i){if(3&A){r=255&e;do{if((f=0|tr[A>>0])<<24>>24==0||f<<24>>24==r<<24>>24)break A;A=A+1|0}while(0!=(3&A|0))}i=0|br(i,16843009),r=0|ar[A>>2];e:do{if(!((-2139062144&r^-2139062144)&r+-16843009))do{if((-2139062144&(f=r^i)^-2139062144)&f+-16843009|0)break e;r=0|ar[(A=A+4|0)>>2]}while(!((-2139062144&r^-2139062144)&r+-16843009|0))}while(0);for(r=255&e;(f=0|tr[A>>0])<<24>>24!=0&&f<<24>>24!=r<<24>>24;)A=A+1|0}else A=A+(0|Vc(A))|0}while(0);return 0|A}function _c(A,e,r,i){A|=0,e|=0,r|=0,i|=0;var f,n;return n=ur=(f=ur)+31&-32,ur=ur+16|0,ar[n>>2]=i,i=0|Yc(A,e,r,n),ur=f,0|i}function Yc(A,e,r,i){A|=0,e|=0,r|=0,i|=0;var f,n,t=0,o=0,a=0,c=0,l=0;for(l=ur=(n=ur)+31&-32,ur=ur+128|0,t=l+124|0,a=10804,f=(o=l)+124|0;ar[o>>2]=ar[a>>2],a=a+4|0,(0|(o=o+4|0))<(0|f););return 2147483646<(e+-1|0)>>>0?e?(ar[(e=10364)>>2]=75,e=-1):(A=t,e=1,c=4):c=4,4==(0|c)&&(c=(c=-2-A|0)>>>0<e>>>0?c:e,ar[l+48>>2]=c,ar[(t=l+20|0)>>2]=A,e=(ar[l+44>>2]=A)+c|0,ar[(A=l+16|0)>>2]=e,ar[l+28>>2]=e,e=0|Qc(l,r,i),c&&(l=0|ar[t>>2],tr[l+(((0|l)==(0|ar[A>>2]))<<31>>31)>>0]=0)),ur=n,0|e}function Qc(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0;for(k=ur=(t=ur)+31&-32,ur=ur+224|0,i=k+120|0,f=k+80|0,k=(n=k)+136|0,a=(o=f)+40|0;(0|(o=o+4|(ar[o>>2]=0)))<(0|a););return ar[i>>2]=ar[r>>2],r=(0|Dc(0,e,i,n,f))<0?-1:(d=-1<(0|ar[A+76>>2])?0|Jc():0,s=32&(r=0|ar[A>>2]),(0|tr[A+74>>0])<1&&(ar[A>>2]=-33&r),0|ar[(o=A+48|0)>>2]?r=0|Dc(A,e,i,n,f):(c=0|ar[(a=A+44|0)>>2],ar[a>>2]=k,ar[(l=A+28|0)>>2]=k,ar[(u=A+20|0)>>2]=k,ar[o>>2]=80,ar[(b=A+16|0)>>2]=k+80,r=0|Dc(A,e,i,n,f),c&&(xb[63&ar[A+36>>2]](A,0,0),r=0==(0|ar[u>>2])?-1:r,ar[a>>2]=c,ar[o>>2]=0,ar[b>>2]=0,ar[l>>2]=0,ar[u>>2]=0)),o=0|ar[A>>2],ar[A>>2]=o|s,0|d&&Mc(),0==(32&o|0)?r:-1),ur=t,0|r}function Dc(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f|=0;var n,t,o,a,c,l,u,b,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0;W=ur=(b=ur)+31&-32,ur=ur+64|0,c=W+16|0,X=(l=W)+24|0,u=W+8|0,W=W+20|0,ar[c>>2]=e,n=0!=(0|A),o=t=X+40|0,X=X+39|0,a=4+u|0,v=s=d=0;A:for(;;){do{if(-1<(0|s)){if((2147483647-s|0)<(0|d)){ar[(s=10364)>>2]=75,s=-1;break}s=d+s|0;break}}while(0);if(!((d=0|tr[e>>0])<<24>>24)){E=87;break}k=e;e:for(;;){switch(d<<24>>24){case 37:d=k,E=9;break e;case 0:d=k;break e}B=k+1|0,ar[c>>2]=B,d=0|tr[B>>0],k=B}e:do{if(9==(0|E))for(;;){if(37!=((E=0)|tr[k+1>>0]))break e;if(d=d+1|0,k=k+2|0,ar[c>>2]=k,37!=(0|tr[k>>0]))break;E=9}}while(0);if(d=d-e|0,n&&Tc(A,e,d),0|d)e=k;else{(d=(0|tr[(h=k+1|0)>>0])-48|0)>>>0<10?(y=(B=36==(0|tr[k+2>>0]))?d:-1,v=B?1:v,h=B?k+3|0:h):y=-1,ar[c>>2]=h,k=((d=0|tr[h>>0])<<24>>24)-32|0;e:do{if(k>>>0<32)for(w=0,m=d;;){if(!(75913&(d=1<<k))){d=m;break e}if(w|=d,h=h+1|0,ar[c>>2]=h,32<=(k=((d=0|tr[h>>0])<<24>>24)-32|0)>>>0)break;m=d}else w=0}while(0);if(d<<24>>24==42){if((d=(0|tr[(k=h+1|0)>>0])-48|0)>>>0<10&&36==(0|tr[h+2>>0]))ar[f+(d<<2)>>2]=10,d=0|ar[i+((0|tr[k>>0])-48<<3)>>2],v=1,h=h+3|0;else{if(0|v){s=-1;break}h=(v=n?(v=3+(0|ar[r>>2])&-4,d=0|ar[v>>2],ar[r>>2]=v+4,0):d=0,k)}ar[c>>2]=h,d=(B=(0|d)<0)?0-d|0:d,w=B?8192|w:w}else{if((0|(d=0|Uc(c)))<0){s=-1;break}h=0|ar[c>>2]}do{if(46==(0|tr[h>>0])){if(42!=(0|tr[h+1>>0])){ar[c>>2]=h+1,k=0|Uc(c),h=0|ar[c>>2];break}if((k=(0|tr[(m=h+2|0)>>0])-48|0)>>>0<10&&36==(0|tr[h+3>>0])){ar[f+(k<<2)>>2]=10,k=0|ar[i+((0|tr[m>>0])-48<<3)>>2],h=h+4|0,ar[c>>2]=h;break}if(0|v){s=-1;break A}n?(B=3+(0|ar[r>>2])&-4,k=0|ar[B>>2],ar[r>>2]=B+4):k=0,h=ar[c>>2]=m}else k=-1}while(0);for(p=0;;){if(57<((0|tr[h>>0])-65|0)>>>0){s=-1;break A}if(B=h+1|0,ar[c>>2]=B,!(((g=255&(m=0|tr[(0|tr[h>>0])-65+(50202+(58*p|0))>>0]))+-1|0)>>>0<8))break;p=g,h=B}if(!(m<<24>>24)){s=-1;break}Z=-1<(0|y);do{if(m<<24>>24==19){if(Z){s=-1;break A}E=49}else{if(Z){ar[f+(y<<2)>>2]=g,y=0|ar[(Z=i+(y<<3)|0)+4>>2],ar[(E=l)>>2]=ar[Z>>2],ar[E+4>>2]=y,E=49;break}if(!n){s=0;break A}Sc(l,g,r)}}while(0);if(49!=(0|E)||(E=0,n)){h=0!=(0|p)&3==(15&(h=0|tr[h>>0])|0)?-33&h:h,Z=-65537&w,y=0==(8192&w|0)?w:Z;e:do{switch(0|h){case 110:switch((255&p)<<24>>24){case 0:case 1:ar[ar[l>>2]>>2]=s,d=0,e=B;continue A;case 2:d=0|ar[l>>2],ar[d>>2]=s,ar[d+4>>2]=((0|s)<0)<<31>>31,d=0,e=B;continue A;case 3:or[ar[l>>2]>>1]=s,d=0,e=B;continue A;case 4:tr[ar[l>>2]>>0]=s,d=0,e=B;continue A;case 6:ar[ar[l>>2]>>2]=s,d=0,e=B;continue A;case 7:d=0|ar[l>>2],ar[d>>2]=s,ar[d+4>>2]=((0|s)<0)<<31>>31,d=0,e=B;continue A;default:d=0,e=B;continue A}case 112:h=120,k=8<k>>>0?k:8,e=8|y,E=61;break;case 88:case 120:e=y,E=61;break;case 111:m=50666,k=(w=0)==(8&y|0)|(0|(Z=o-(g=0|zc(e=0|ar[(h=l)>>2],h=0|ar[h+4>>2],t))|0))<(0|k)?k:Z+1|0,Z=y,E=67;break;case 105:case 100:if(e=0|ar[(h=l)>>2],(0|(h=0|ar[h+4>>2]))<0){e=0|ob(0,0,0|e,0|h),h=D,ar[(w=l)>>2]=e,ar[w+4>>2]=h,w=1,m=50666,E=66;break e}w=0!=(2049&y|0)&1,m=0==(2048&y|0)?0==(1&y|0)?50666:50668:50667,E=66;break e;case 117:m=50666,e=(w=0)|ar[(h=l)>>2],h=0|ar[h+4>>2],E=66;break;case 99:tr[X>>0]=ar[l>>2],e=X,w=0,m=50666,g=t,h=1,k=Z;break;case 109:h=0|Hc(0|ar[(h=10364)>>2]),E=71;break;case 115:h=0|(h=0|ar[l>>2])?h:50676,E=71;break;case 67:ar[u>>2]=ar[l>>2],ar[a>>2]=0,g=-1,h=ar[l>>2]=u,E=75;break;case 83:e=0|ar[l>>2],E=k?(g=k,h=e,75):(xc(A,32,d,0,y),e=0,84);break;case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:d=0|Lc(A,+Q[l>>3],d,k,y,h),e=B;continue A;default:w=0,m=50666,g=t,h=k,k=y}}while(0);e:do{if(61==(0|E))g=0|Oc(p=0|ar[(y=l)>>2],y=0|ar[y+4>>2],t,32&h),w=(m=0==(8&e|0)|0==(0|p)&0==(0|y))?0:2,m=m?50666:50666+(h>>4)|0,Z=e,e=p,h=y,E=67;else if(66==(0|E))g=0|jc(e,h,t),Z=y,E=67;else if(71==(0|E))w=E=0,m=50666,g=(p=0==(0|(y=0|Rc(e=h,0,k))))?h+k|0:y,h=p?k:y-h|0,k=Z;else if(75==(0|E)){for(m=h,k=e=E=0;(w=0|ar[m>>2])&&!((0|(k=0|Pc(W,w)))<0|(g-e|0)>>>0<k>>>0)&&(e=k+e|0)>>>0<g>>>0;)m=m+4|0;if((0|k)<0){s=-1;break A}if(xc(A,32,d,e,y),e)for(w=0;;){if(!(k=0|ar[h>>2])){E=84;break e}if((0|e)<(0|(w=(k=0|Pc(W,k))+w|0))){E=84;break e}if(Tc(A,W,k),e>>>0<=w>>>0){E=84;break}h=h+4|0}else e=0,E=84}}while(0);if(67==(0|E))y=(E=0)!=(0|k)|(h=0!=(0|e)|0!=(0|h)),h=o-g+(1&(1^h))|0,e=y?g:t,g=t,h=!y||(0|h)<(0|k)?k:h,k=-1<(0|k)?-65537&Z:Z;else if(84==(0|E)){E=0,xc(A,32,d,e,8192^y),d=(0|e)<(0|d)?d:e,e=B;continue}xc(A,32,d=(0|d)<(0|(y=(Z=(0|h)<(0|(p=g-e|0))?p:h)+w|0))?y:d,y,k),Tc(A,m,w),xc(A,48,d,y,65536^k),xc(A,48,Z,p,0),Tc(A,e,p),xc(A,32,d,y,8192^k),e=B}else d=0,e=B}}A:do{if(87==(0|E)&&!A)if(v){for(s=1;e=0|ar[f+(s<<2)>>2];)if(Sc(i+(s<<3)|0,e,r),10<=(0|(s=s+1|0))){s=1;break A}for(;;){if(0|ar[f+(s<<2)>>2]){s=-1;break A}if(10<=(0|(s=s+1|0))){s=1;break}}}else s=0}while(0);return ur=b,0|s}function Jc(){return 0}function Mc(){0}function Tc(A,e,r){e|=0,r|=0,32&ar[(A|=0)>>2]||el(e,r,A)}function Uc(A){var e=0,r=0,i=0;if(r=0|ar[(A|=0)>>2],(i=(0|tr[r>>0])-48|0)>>>0<10)for(e=0;e=i+(10*e|0)|0,r=r+1|0,ar[A>>2]=r,(i=(0|tr[r>>0])-48|0)>>>0<10;);else e=0;return 0|e}function Sc(A,e,r){A|=0,e|=0,r|=0;var i=0,f=0,n=0;A:do{if(e>>>0<=20){switch(0|e){case 9:i=3+(0|ar[r>>2])&-4,e=0|ar[i>>2],ar[r>>2]=i+4,ar[A>>2]=e;break A;case 10:i=3+(0|ar[r>>2])&-4,e=0|ar[i>>2],ar[r>>2]=i+4,ar[(i=A)>>2]=e,ar[i+4>>2]=((0|e)<0)<<31>>31;break A;case 11:i=3+(0|ar[r>>2])&-4,e=0|ar[i>>2],ar[r>>2]=i+4,ar[(i=A)>>2]=e,ar[i+4>>2]=0;break A;case 12:i=7+(0|ar[r>>2])&-8,f=0|ar[(e=i)>>2],e=0|ar[e+4>>2],ar[r>>2]=i+8,ar[(i=A)>>2]=f,ar[i+4>>2]=e;break A;case 13:f=3+(0|ar[r>>2])&-4,i=0|ar[f>>2],ar[r>>2]=f+4,i=(65535&i)<<16>>16,ar[(f=A)>>2]=i,ar[f+4>>2]=((0|i)<0)<<31>>31;break A;case 14:f=3+(0|ar[r>>2])&-4,i=0|ar[f>>2],ar[r>>2]=f+4,ar[(f=A)>>2]=65535&i,ar[f+4>>2]=0;break A;case 15:f=3+(0|ar[r>>2])&-4,i=0|ar[f>>2],ar[r>>2]=f+4,i=(255&i)<<24>>24,ar[(f=A)>>2]=i,ar[f+4>>2]=((0|i)<0)<<31>>31;break A;case 16:f=3+(0|ar[r>>2])&-4,i=0|ar[f>>2],ar[r>>2]=f+4,ar[(f=A)>>2]=255&i,ar[f+4>>2]=0;break A;case 17:case 18:f=7+(0|ar[r>>2])&-8,n=+Q[f>>3],ar[r>>2]=f+8,Q[A>>3]=n;break A;default:break A}}}while(0)}function Oc(A,e,r,i){if(r|=0,i|=0,!(0==(0|(A|=0))&0==(0|(e|=0))))for(;tr[(r=r+-1|0)>>0]=0|cr[50714+(15&A)>>0]|i,!(0==(0|(A=0|sb(0|A,0|e,4)))&0==(0|(e=D))););return 0|r}function zc(A,e,r){if(r|=0,!(0==(0|(A|=0))&0==(0|(e|=0))))for(;tr[(r=r+-1|0)>>0]=7&A|48,!(0==(0|(A=0|sb(0|A,0|e,3)))&0==(0|(e=D))););return 0|r}function jc(A,e,r){r|=0;var i=0;if(0<(e|=0)>>>0|0==(0|e)&4294967295<(A|=0)>>>0){for(;i=0|ub(0|A,0|e,10,0),tr[(r=r+-1|0)>>0]=255&i|48,A=0|lb(0|(i=A),0|e,10,0),9<e>>>0|9==(0|e)&4294967295<i>>>0;)e=D;e=A}else e=A;if(e)for(;tr[(r=r+-1|0)>>0]=(e>>>0)%10|48,!(e>>>0<10);)e=(e>>>0)/10|0;return 0|r}function Hc(A){return 0|function(A,e){A|=0,e|=0;var r=0,i=0;i=0;for(;;){if((0|cr[50732+i>>0])==(0|A)){A=2;break}if(87==(0|(r=i+1|0))){r=50820,i=87,A=5;break}i=r}2==(0|A)&&(i?(r=50820,A=5):r=50820);if(5==(0|A))for(;;){for(;r=(A=r)+1|0,0!=(0|tr[A>>0]););if(!(i=i+-1|0))break;A=5}return 0|function(A,e){return 0|function(A,e){A|=0,e=(e|=0)?0|function(A,e,r){e|=0,r|=0;var i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0;i=1794895138+(0|ar[(A|=0)>>2])|0,t=0|Al(0|ar[A+8>>2],i),f=0|Al(0|ar[A+12>>2],i),n=0|Al(0|ar[A+16>>2],i);A:do{if(t>>>0<e>>>2>>>0&&(b=e-(t<<2)|0,f>>>0<b>>>0&n>>>0<b>>>0)&&0==(3&(n|f)|0)){for(b=f>>>2,u=n>>>2,l=0;;){if(f=0|Al(0|ar[A+((n=(o=(c=l+(a=t>>>1)|0)<<1)+b|0)<<2)>>2],i),!((n=0|Al(0|ar[A+(n+1<<2)>>2],i))>>>0<e>>>0&f>>>0<(e-n|0)>>>0)){f=0;break A}if(0|tr[A+(n+f)>>0]){f=0;break A}if(!(f=0|Fc(r,A+n|0)))break;if(f=(0|f)<0,1==(0|t)){f=0;break A}l=f?l:c,t=f?a:t-a|0}n=0|Al(0|ar[A+((f=o+u|0)<<2)>>2],i),f=(f=0|Al(0|ar[A+(f+1<<2)>>2],i))>>>0<e>>>0&n>>>0<(e-f|0)>>>0&&0==(0|tr[A+(f+n)>>0])?A+f|0:0}else f=0}while(0);return 0|f}(0|ar[e>>2],0|ar[e+4>>2],A):0;return 0|(0|e?e:A)}(A|=0,e|=0)}(r,0|ar[e+20>>2])}(A|=0,0|ar[2622])}function xc(A,e,r,i,f){A|=0,e|=0;var n,t;if(n=ur=(t=ur)+31&-32,ur=ur+256|0,(0|(i|=0))<(0|(r|=0))&0==(73728&(f|=0)|0)){if(vb(0|n,0|e,0|((f=r-i|0)>>>0<256?f:256)),255<f>>>0){for(e=r-i|0;Tc(A,n,256),255<(f=f+-256|0)>>>0;);f=255&e}Tc(A,n,f)}ur=t}function Pc(A,e){return e|=0,0|(A=(A|=0)?0|$c(A,e):0)}function Lc(A,e,r,i,f,n){A|=0,e=+e,r|=0,i|=0,f|=0,n|=0;var t,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0;l=ur=(t=ur)+31&-32,ur=ur+560|0,c=l+8|0,W=I=(w=l)+524|0,X=(l=l+512|0)+12|(ar[w>>2]=0),Kc(e),y=(0|D)<0?(e=-e,B=1,50683):(B=0!=(2049&f|0)&1,0==(2048&f|0)?0==(1&f|0)?50684:50689:50686),Kc(e),E=2146435072&D;do{if(E>>>0<2146435072|2146435072==(0|E)&!1){if((o=0!=(d=2*qc(e,w)))&&(ar[w>>2]=(0|ar[w>>2])-1),97==(0|(m=32|n))){s=0==(0|(k=32&n))?y:y+9|0,b=2|B,o=12-i|0;do{if(!(11<i>>>0|0==(0|o))){for(e=8;e*=16,0!=(0|(o=o+-1|0)););if(45==(0|tr[s>>0])){e=-(e+(-d-e));break}e=d+e-e;break}e=d}while(0);for((0|(o=0|jc(o=(0|(a=0|ar[w>>2]))<0?0-a|0:a,((0|o)<0)<<31>>31,X)))==(0|X)&&(tr[(o=l+11|0)>>0]=48),tr[o+-1>>0]=43+(a>>31&2),tr[(u=o+-2|0)>>0]=n+15,l=(0|i)<1,c=0==(8&f|0),o=I;E=~~e,a=o+1|0,tr[o>>0]=cr[50714+E>>0]|k,e=16*(e-(0|E)),o=1!=(a-W|0)||c&l&0==e?a:(tr[a>>0]=46,o+2|0),0!=e;);E=o-W|0,xc(A,32,r,o=(W=X-u|0)+b+(X=0!=(0|i)&(E+-2|0)<(0|i)?i+2|0:E)|0,f),Tc(A,s,b),xc(A,48,r,o,65536^f),Tc(A,I,E),xc(A,48,X-E|0,0,0),Tc(A,u,W),xc(A,32,r,o,8192^f);break}for(a=(0|i)<0?6:i,o?(o=(0|ar[w>>2])-28|0,ar[w>>2]=o,e=268435456*d):(e=d,o=0|ar[w>>2]),c=E=(0|o)<0?c:c+288|0;Z=~~e>>>0,ar[c>>2]=Z,c=c+4|0,0!=(e=1e9*(e-(Z>>>0))););if(0<(0|o))for(l=E,b=c;;){if(u=(0|o)<29?o:29,l>>>0<=(o=b+-4|0)>>>0){for(c=0;v=0|ub(0|(g=0|tb(0|(g=0|db(0|ar[o>>2],0,0|u)),0|D,0|c,0)),0|(Z=D),1e9,0),ar[o>>2]=v,c=0|lb(0|g,0|Z,1e9,0),l>>>0<=(o=o+-4|0)>>>0;);c&&(ar[(l=l+-4|0)>>2]=c)}for(c=b;!(c>>>0<=l>>>0||0|ar[(o=c+-4|0)>>2]);)c=o;if(o=(0|ar[w>>2])-u|0,!(0<(0|(ar[w>>2]=o))))break;b=c}else l=E;if((0|o)<0){i=1+((a+25|0)/9|0)|0,h=102==(0|m);do{if(k=(0|(k=0-o|0))<9?k:9,l>>>0<c>>>0){for(u=(1<<k)-1|0,b=1e9>>>k,s=0,o=l;Z=0|ar[o>>2],ar[o>>2]=(Z>>>k)+s,s=0|br(Z&u,b),(o=o+4|0)>>>0<c>>>0;);o=0==(0|ar[l>>2])?l+4|0:l,o=s?(ar[c>>2]=s,l=o,c+4|0):(l=o,c)}else l=0==(0|ar[l>>2])?l+4|0:l,o=c;c=(0|i)<(o-(c=h?E:l)>>2|0)?c+(i<<2)|0:o,o=(0|ar[w>>2])+k|0,ar[w>>2]=o}while((0|o)<0);o=l,i=c}else o=l,i=c;if(Z=E,o>>>0<i>>>0){if(c=9*(Z-o>>2)|0,10<=(u=0|ar[o>>2])>>>0)for(l=10;c=c+1|0,(l=10*l|0)>>>0<=u>>>0;);}else c=0;if((0|(l=a-(102!=(0|m)?c:0)+(((v=0!=(0|a))&(h=103==(0|m)))<<31>>31)|0))<((9*(i-Z>>2)|0)-9|0)){if(k=E+4+(((0|(l=l+9216|0))/9|0)-1024<<2)|0,(0|(l=1+((0|l)%9|0)|0))<9)for(u=10;u=10*u|0,9!=(0|(l=l+1|0)););else u=10;if((l=(k+4|0)==(0|i))&0==(0|(s=((b=0|ar[k>>2])>>>0)%(u>>>0)|0)))l=k;else if(d=0==(1&((b>>>0)/(u>>>0)|0)|0)?9007199254740992:9007199254740994,e=s>>>0<(g=(0|u)/2|0)>>>0?.5:l&(0|s)==(0|g)?1:1.5,B&&(e=(g=45==(0|tr[y>>0]))?-e:e,d=g?-d:d),l=b-s|0,ar[k>>2]=l,d+e!=d){if(g=l+u|0,999999999<(ar[k>>2]=g)>>>0)for(c=k;(l=c+-4|0)>>>(ar[c>>2]=0)<o>>>0&&(ar[(o=o+-4|0)>>2]=0),g=1+(0|ar[l>>2])|0,999999999<(ar[l>>2]=g)>>>0;)c=l;else l=k;if(c=9*(Z-o>>2)|0,10<=(b=0|ar[o>>2])>>>0)for(u=10;c=c+1|0,(u=10*u|0)>>>0<=b>>>0;);}else l=k;l=(l=l+4|0)>>>0<i>>>0?l:i,g=o}else l=i,g=o;for(m=l;;){if(m>>>0<=g>>>0){w=0;break}if(0|ar[(o=m+-4|0)>>2]){w=1;break}m=o}i=0-c|0;do{if(h){if(a=(0|c)<(0|(o=(1&(1^v))+a|0))&-5<(0|c)?(u=n+-1|0,o+-1-c|0):(u=n+-2|0,o+-1|0),!(o=8&f)){if(w&&0!=(0|(p=0|ar[m+-4>>2])))if((p>>>0)%10|0)l=0;else for(l=0,o=10;l=l+1|0,!((p>>>0)%((o=10*o|0)>>>0)|0););else l=9;if(o=(9*(m-Z>>2)|0)-9|0,102==(32|u)){a=(0|a)<(0|(k=0<(0|(k=o-l|0))?k:0))?a:k,k=0;break}a=(0|a)<(0|(k=0<(0|(k=o+c-l|0))?k:0))?a:k,k=0;break}k=o}else u=n,k=8&f}while(0);if(b=0!=(0|(h=a|k))&1,s=102==(32|u))o=(v=0)<(0|c)?c:0;else{if(((l=X)-(o=0|jc(o=(0|c)<0?i:c,((0|o)<0)<<31>>31,X))|0)<2)for(;tr[(o=o+-1|0)>>0]=48,(l-o|0)<2;);tr[o+-1>>0]=43+(c>>31&2),tr[(o=o+-2|0)>>0]=u,o=l-(v=o)|0}if(xc(A,32,r,o=B+1+a+b+o|0,f),Tc(A,y,B),xc(A,48,r,o,65536^f),s){b=k=I+9|0,s=I+8|0,l=u=E>>>0<g>>>0?E:g;do{if(c=0|jc(0|ar[l>>2],0,k),(0|l)==(0|u))(0|c)==(0|k)&&(tr[s>>0]=48,c=s);else if(I>>>0<c>>>0)for(vb(0|I,48,c-W|0);I>>>0<(c=c+-1|0)>>>0;);Tc(A,c,b-c|0),l=l+4|0}while(l>>>0<=E>>>0);if(0|h&&Tc(A,50730,1),l>>>0<m>>>0&0<(0|a))for(;;){if(I>>>0<(c=0|jc(0|ar[l>>2],0,k))>>>0)for(vb(0|I,48,c-W|0);I>>>0<(c=c+-1|0)>>>0;);if(Tc(A,c,(0|a)<9?a:9),c=a+-9|0,!((l=l+4|0)>>>0<m>>>0&9<(0|a))){a=c;break}a=c}xc(A,48,a+9|0,9,0)}else{if(h=w?m:g+4|0,-1<(0|a)){k=0==(0|k),i=w=I+9|0,b=0-W|0,s=I+8|0,u=g;do{(0|(c=0|jc(0|ar[u>>2],0,w)))==(0|w)&&(tr[s>>0]=48,c=s);do{if((0|u)==(0|g)){if(l=c+1|0,Tc(A,c,1),k&(0|a)<1){c=l;break}Tc(A,50730,1),c=l}else{if(c>>>0<=I>>>0)break;for(vb(0|I,48,c+b|0);I>>>0<(c=c+-1|0)>>>0;);}}while(0);Tc(A,c,(0|(W=i-c|0))<(0|a)?W:a),a=a-W|0,u=u+4|0}while(u>>>0<h>>>0&-1<(0|a))}xc(A,48,a+18|0,18,0),Tc(A,v,X-v|0)}xc(A,32,r,o,8192^f)}else I=0!=(32&n|0),xc(A,32,r,o=B+3|0,-65537&f),Tc(A,y,B),Tc(A,e!=e|!1?I?52899:50710:I?50702:50706,3),xc(A,32,r,o,8192^f)}while(0);return ur=t,0|((0|o)<(0|r)?r:o)}function Kc(A){A=+A;var e;return Q[d>>3]=A,e=0|ar[d>>2],D=0|ar[d+4>>2],0|e}function qc(A,e){return+ +function A(e,r){e=+e;r|=0;var i=0,f=0,n=0;Q[d>>3]=e;i=0|ar[d>>2];f=0|ar[d+4>>2];n=0|sb(0|i,0|f,52);switch(2047&n){case 0:i=0!=e?(e=+A(0x10000000000000000*e,r),(0|ar[r>>2])-64|0):0,ar[r>>2]=i;break;case 2047:break;default:ar[r>>2]=(2047&n)-1022,ar[d>>2]=i,ar[d+4>>2]=-2146435073&f|1071644672,e=+Q[d>>3]}return+e}(A=+A,e|=0)}function $c(A,e){A|=0,e|=0;do{if(A){if(e>>>0<128){tr[A>>0]=e,A=1;break}if(!(0|ar[ar[10488>>2]>>2])){if(57216==(-128&e|0)){tr[A>>0]=e,A=1;break}ar[(A=10364)>>2]=84,A=-1;break}if(e>>>0<2048){tr[A>>0]=e>>>6|192,tr[A+1>>0]=63&e|128,A=2;break}if(e>>>0<55296|57344==(-8192&e|0)){tr[A>>0]=e>>>12|224,tr[A+1>>0]=e>>>6&63|128,tr[A+2>>0]=63&e|128,A=3;break}if((e+-65536|0)>>>0<1048576){tr[A>>0]=e>>>18|240,tr[A+1>>0]=e>>>12&63|128,tr[A+2>>0]=e>>>6&63|128,tr[A+3>>0]=63&e|128,A=4;break}ar[(A=10364)>>2]=84,A=-1;break}A=1}while(0);return 0|A}function Al(A,e){var r;return r=0|kb(0|(A|=0)),0|(0==(0|(e|=0))?A:r)}function el(A,e,r){A|=0,e|=0;var i=0,f=0,n=0,t=0,o=0;(f=0|ar[(i=(r|=0)+16|0)>>2])?n=5:0|rl(r)?i=0:(f=0|ar[i>>2],n=5);A:do{if(5==(0|n)){if((f-(i=t=0|ar[(o=r+20|0)>>2])|0)>>>0<e>>>0){i=0|xb[63&ar[r+36>>2]](r,A,e);break}e:do{if(-1<(0|tr[r+75>>0])){for(t=e;;){if(!t){n=0,f=A;break e}if(10==(0|tr[A+(f=t+-1|0)>>0]))break;t=f}if((i=0|xb[63&ar[r+36>>2]](r,A,t))>>>0<t>>>0)break A;f=A+(n=t)|0,e=e-t|0,i=0|ar[o>>2]}else n=0,f=A}while(0);hb(0|i,0|f,0|e),ar[o>>2]=(0|ar[o>>2])+e,i=n+e|0}}while(0);return 0|i}function rl(A){var e=0,r=0;return r=0|tr[(e=(A|=0)+74|0)>>0],tr[e>>0]=r+255|r,0|(A=8&(e=0|ar[A>>2])?(ar[A>>2]=32|e,-1):(ar[A+8>>2]=0,r=(ar[A+4>>2]=0)|ar[A+44>>2],ar[A+28>>2]=r,ar[A+20>>2]=r,ar[A+16>>2]=r+(0|ar[A+48>>2]),0))}function il(A,e,r){var i,f,n;return 0|(0|(i=A|=0,f=e|=0,n=r|=0,0|(n=0|fl(i|=0,f|=0,n|=0,-1,-1))))}function fl(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f|=0;var n,t,o,a;return t=ur=(a=ur)+31&-32,ur=ur+128|0,ar[t>>2]=0,ar[(o=4+t|0)>>2]=A,ar[44+t>>2]=A,ar[(n=8+t|0)>>2]=(0|A)<0?-1:A+2147483647|0,ar[76+t>>2]=-1,nl(t,0),r=0|wi(t,r,1,i,f),0|e&&(ar[e>>2]=A+((0|ar[o>>2])+(0|ar[108+t>>2])-(0|ar[n>>2]))),ur=a,0|r}function nl(A,e){e|=0;var r,i,f;ar[(A|=0)+104>>2]=e,f=(r=0|ar[A+8>>2])-(i=0|ar[A+4>>2])|0,ar[A+108>>2]=f,ar[A+100>>2]=0!=(0|e)&(0|e)<(0|f)?i+e|0:r}function tl(A){switch(0|(A|=0)){case 15:case 13:case 11:return 0|(A=1);case 14:case 12:case 10:case 3:case 2:case 1:case 0:case 99:return(A=0)|A;default:sr(55739,25597,495,25802)}return 0}function ol(A,e,r,i){A|=0,e|=0,i|=0;var f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0;if(!(r|=0))return t=0|ar[e>>2],(f=0|ar[e+4>>2])||(A=0|X(4),ar[A>>2]=17536,I(0|A,3920,421)),(n=0|function(A){var e,r=0,i=0;r=0|ar[(e=4+(A|=0)|0)>>2];for(;;){if(-1==(0|r)){A=0;break}if((0|(i=0|ar[e>>2]))==(0|r)&&(ar[e>>2]=r+1),(0|i)==(0|r))break;r=i}return 0|A}(f))||(A=0|X(4),ar[A>>2]=17536,I(0|A,3920,421)),ar[i>>2]=t,f=0|ar[(e=i+4|0)>>2],ar[e>>2]=n,0|f&&du(f),Z=0|ar[(g=56592)+4>>2],ar[(e=A)>>2]=ar[g>>2],ar[e+4>>2]=Z,void yu(A+8|0,56600);switch(f=0|ar[e+24>>2],n=0|ar[e+28>>2],g=90==(0|r),Z=270==(0|r),0|r){case 90:case 270:l=n;break;default:l=f,f=n}o=0|hu(80),ar[o+4>>2]=0,ar[o+8>>2]=0,ar[o>>2]=6208,ar[(n=o+12|0)>>2]=0,ar[n+4>>2]=0,ar[n+8>>2]=0,ar[n+12>>2]=0,ar[n+16>>2]=0,ar[o+32>>2]=32215,ar[o+36>>2]=0,ar[o+40>>2]=0,ar[o+44>>2]=99,ar[o+48>>2]=99,c=o+52|0,ar[(a=o+72|0)>>2]=0,ar[o+76>>2]=0,ar[c>>2]=0,ar[c+4>>2]=0,ar[c+8>>2]=0,ar[c+12>>2]=0,ar[o+68>>2]=a,a=n,m=(c=o)+16|0,bu(o),su(o),t=0|ar[m>>2],ar[n>>2]=a,ar[m>>2]=c,0|t&&ku(t),du(o),ar[i>>2]=a,t=0|ar[(m=i+4|0)>>2],ar[m>>2]=c,t?(du(t),n=0|ar[(m=i)>>2]):m=i,v=0|ar[e+32>>2],w=0|ar[e+36>>2],ar[n+24>>2]=l,ar[n+28>>2]=f,ar[n+32>>2]=v,ar[n+36>>2]=w,f=0|ar[e+56>>2],w=e+60|0;A:do{if((0|f)!=(0|w))for(v=180==(0|r),h=f;;){switch(c=0|ar[h+16>>2],f=0|ar[(o=h+24|0)>>2],n=0|ar[(a=h+28|0)>>2],0|r){case 90:case 270:t=f,f=n;break;default:t=n}if(l=h+20|0,Bo(0|ar[m>>2],c,f,t,0|cr[l>>0]),k=0|ar[o>>2],b=0|ar[a>>2],s=0|ar[h+48>>2],d=0|ar[h+40>>2],o=60+(0|ar[m>>2])|0,n=0|ar[o>>2]){f=o;e:for(;;){for(t=n;!((0|ar[t+16>>2])>=(0|c));){if(!(n=0|ar[t+4>>2]))break e;t=n}if(!(n=0|ar[t>>2])){f=t;break}f=t}i=(0|f)!=(0|o)&&(0|ar[f+16>>2])<=(0|c)?(u=0|ar[f+40>>2],0|ar[f+48>>2]):u=0}else i=u=0;f=0<(0|b);e:do{if(8==(0|tr[l>>0])){if(Z){if(!f)break;if(t=b+-1|0,!(0<(0|k)))break;for(n=0;;){for(o=0|br(t-n|0,s),f=0;l=u+((0|br(f,i))+n)|0,tr[l>>0]=0|tr[d+(f+o)>>0],(0|(f=f+1|0))!=(0|k););if((0|(n=n+1|0))==(0|b))break e}}if(v){if(!f)break;if(t=b+-1|0,o=k+-1|0,!(0<(0|k)))break;n=0;do{for(a=o+(0|br(t-n|0,s))|0,c=0|br(n,i),f=0;tr[u+(f+c)>>0]=0|tr[d+(a-f)>>0],(0|(f=f+1|0))!=(0|k););n=n+1|0}while((0|n)!=(0|b))}else{if(!(g&f))break;if(t=k+-1|0,!(0<(0|k)))break;n=0;do{for(o=t+(0|br(n,s))|0,f=0;l=u+((0|br(f,i))+n)|0,tr[l>>0]=0|tr[d+(o-f)>>0],(0|(f=f+1|0))!=(0|k););n=n+1|0}while((0|n)!=(0|b))}}else{if(Z){if(!f)break;if(t=b+-1|0,!(0<(0|k)))break;for(n=0;;){for(o=0|br(t-n|0,s),a=n<<1,f=0;c=(f<<1)+o|0,l=(0|br(f,i))+a|0,tr[u+l>>0]=0|tr[d+c>>0],tr[u+(l+1)>>0]=0|tr[d+(c+1)>>0],(0|(f=f+1|0))!=(0|k););if((0|(n=n+1|0))==(0|b))break e}}if(v){if(!f)break;if(t=b+-1|0,o=k+-1|0,!(0<(0|k)))break;n=0;do{for(a=0|br(t-n|0,s),c=0|br(n,i),f=0;p=(o-f<<1)+a|0,tr[u+(l=(f<<1)+c|0)>>0]=0|tr[d+p>>0],tr[u+(l+1)>>0]=0|tr[d+(p+1)>>0],(0|(f=f+1|0))!=(0|k););n=n+1|0}while((0|n)!=(0|b))}else{if(!(g&f))break;if(t=k+-1|0,!(0<(0|k)))break;f=0;do{for(o=0|br(f,s),a=f<<1,n=0;l=(t-n<<1)+o|0,p=(0|br(n,i))+a|0,tr[u+p>>0]=0|tr[d+l>>0],tr[u+(p+1)>>0]=0|tr[d+(l+1)>>0],(0|(n=n+1|0))!=(0|k););f=f+1|0}while((0|f)!=(0|b))}}}while(0);if(f=0|ar[h+4>>2])for(;n=0|ar[f>>2];)f=n;else if(f=0|ar[(n=h+8|0)>>2],(0|ar[f>>2])!=(0|h))for(;p=0|ar[n>>2],f=0|ar[(n=p+8|0)>>2],(0|ar[f>>2])!=(0|p););if((0|f)==(0|w))break A;h=f}}while(0);f=0|ar[m>>2],n=0|ar[e+40>>2],(o=0==(0|(t=0|ar[e+44>>2])))||(bu(t),bu(t)),ar[f+40>>2]=n,f=0|ar[(p=f+44|0)>>2],ar[p>>2]=t,0|f&&du(f),o||du(t),f=0|ar[m>>2],n=0|ar[e+48>>2],(o=0==(0|(t=0|ar[e+52>>2])))||(bu(t),bu(t)),ar[f+48>>2]=n,f=0|ar[(p=f+52|0)>>2],ar[p>>2]=t,0|f&&du(f),o||du(t),e=0|ar[(Z=56592)+4>>2],ar[(p=A)>>2]=ar[Z>>2],ar[p+4>>2]=e,yu(A+8|0,56600)}function al(A,e,r){A|=0,r|=0;var i,f,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0;ur=(f=ur)+16|0,w=f,n=0|ar[(e|=0)+56>>2],i=e+60|0;A:do{if((0|n)!=(0|i)){for(;8==(0|tr[n+20>>0]);){if(c=0|ar[n+24>>2],l=0|ar[n+28>>2],b=0|ar[n+48>>2],s=0|ar[n+40>>2],r){if(0<(0|l)&&(k=(0|c)/2|0,h=c+-1|0,1<(0|c))){t=0;do{for(a=h+(o=0|br(t,b))|0,e=0;u=s+(a-e)|0,c=0|tr[(v=s+(e+o)|0)>>0],tr[v>>0]=0|tr[u>>0],tr[u>>0]=c,(0|(e=e+1|0))<(0|k););t=t+1|0}while((0|t)!=(0|l))}}else if(u=(0|l)/2|0,1<(0|l)&&(d=l+-1|0,0<(0|c))){e=0;do{for(o=0|br(e,b),a=0|br(d-e|0,b),t=0;v=s+(t+a)|0,l=0|tr[(m=s+(t+o)|0)>>0],tr[m>>0]=0|tr[v>>0],tr[v>>0]=l,(0|(t=t+1|0))!=(0|c););e=e+1|0}while((0|e)<(0|u))}if(e=0|ar[n+4>>2])for(;n=0|ar[e>>2];)e=n;else if(e=0|ar[(t=n+8|0)>>2],(0|ar[e>>2])!=(0|n))for(n=t;m=0|ar[n>>2],e=0|ar[(n=m+8|0)>>2],(0|ar[e>>2])!=(0|m););if((0|e)==(0|i))break A;n=e}for(e=0|hu(64),ar[w>>2]=e,ar[w+8>>2]=-2147483584,t=25898,o=(n=e)+(ar[w+4>>2]=54)|0;tr[n>>0]=0|tr[t>>0],t=t+1|0,(0|(n=n+1|0))<(0|o););return(oo(A,4,tr[e+54>>0]=0,w),0<=(0|tr[w+11>>0]))?void(ur=f):(vu(0|ar[w>>2]),void(ur=f))}}while(0);v=0|ar[(w=56592)+4>>2],ar[(m=A)>>2]=ar[w>>2],ar[m+4>>2]=v,yu(A+8|0,56600),ur=f}function cl(A,e,r,i,f,n,t){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0;var o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0;if(l=0|hu(80),ar[l+4>>2]=0,ar[l+8>>2]=0,ar[l>>2]=6208,ar[(o=l+12|0)>>2]=0,ar[o+4>>2]=0,ar[o+8>>2]=0,ar[o+12>>2]=0,ar[o+16>>2]=0,ar[l+32>>2]=32215,ar[l+36>>2]=0,ar[l+40>>2]=0,ar[l+44>>2]=99,ar[l+48>>2]=99,u=l+52|0,ar[(c=l+72|0)>>2]=0,ar[l+76>>2]=0,ar[u>>2]=0,ar[u+4>>2]=0,ar[u+8>>2]=0,ar[u+12>>2]=0,ar[l+68>>2]=c,c=o,p=(u=l)+16|0,bu(l),su(l),a=0|ar[p>>2],ar[o>>2]=c,ar[p>>2]=u,0|a&&ku(a),du(l),ar[t>>2]=c,a=0|ar[(p=t+4|0)>>2],ar[p>>2]=u,a?(du(a),o=0|ar[(p=t)>>2]):p=t,Z=0|ar[e+32>>2],m=0|ar[e+36>>2],ar[o+24>>2]=1-r+i,ar[o+28>>2]=1-f+n,ar[o+32>>2]=Z,ar[o+36>>2]=m,(0|(o=0|ar[e+56>>2]))!=(0|(m=e+60|0)))for(g=e+24|0,Z=e+28|0,v=o;;){if(u=0|ar[v+16>>2],h=0|ar[v+24>>2],t=0|ar[v+28>>2],b=(0|(b=0|br(h,r)))/(0|(s=0|ar[g>>2]))|0,s=(0|br(h,i))/(0|s)|0,h=(0|(h=0|br(t,f)))/(0|(w=0|ar[Z>>2]))|0,w=(0|br(t,n))/(0|w)|0,s=s-b+1|0,t=v+20|0,Bo(0|ar[p>>2],u,s,1-h+w|0,0|cr[t>>0]),d=0|ar[v+48>>2],k=0|ar[v+40>>2],l=60+(0|ar[p>>2])|0,a=0|ar[l>>2]){o=l;A:for(;;){for(c=a;!((0|ar[c+16>>2])>=(0|u));){if(!(a=0|ar[c+4>>2]))break A;c=a}if(!(a=0|ar[c>>2])){o=c;break}o=c}l=(0|o)!=(0|l)&&(0|ar[o+16>>2])<=(0|u)?(u=0|ar[o+40>>2],0|ar[o+48>>2]):u=0}else l=u=0;if(o=(0|w)<(0|h),8==(0|tr[t>>0])){if(!o)for(o=h;hb(u+(0|br(o-h|0,l))|0,k+((0|br(o,d))+b)|0,0|s),(0|o)<(0|w);)o=o+1|0}else if(!o)for(c=b<<1,a=s<<1,o=h;hb(u+(0|br(o-h|0,l))|0,k+((0|br(o,d))+c)|0,0|a),(0|o)<(0|w);)o=o+1|0;if(o=0|ar[v+4>>2])for(;a=0|ar[o>>2];)o=a;else if(o=0|ar[(a=v+8|0)>>2],(0|ar[o>>2])!=(0|v))for(;v=0|ar[a>>2],o=0|ar[(a=v+8|0)>>2],(0|ar[o>>2])!=(0|v););if((0|o)==(0|m))break;v=o}if(o=0|ar[p>>2],a=0|ar[e+40>>2],(l=0==(0|(c=0|ar[e+44>>2])))||(bu(c),bu(c)),ar[o+40>>2]=a,o=0|ar[(n=o+44|0)>>2],ar[n>>2]=c,0|o&&du(o),l||du(c),o=0|ar[p>>2],a=0|ar[e+48>>2],(l=0==(0|(c=0|ar[e+52>>2])))||(bu(c),bu(c)),ar[o+48>>2]=a,o=0|ar[(e=o+52|0)>>2],ar[e>>2]=c,0|o&&du(o),l)return i=0|ar[(i=n=56592)>>2],n=0|ar[(n=n+4|0)>>2],ar[(f=e=A)>>2]=i,ar[(e=e+4|0)>>2]=n,void yu(A=A+8|0,56600);du(c),i=0|ar[(i=n=56592)>>2],n=0|ar[(n=n+4|0)>>2],ar[(f=e=A)>>2]=i,ar[(e=e+4|0)>>2]=n,yu(A=A+8|0,56600)}function ll(A,e,r,i,f,n){A|=0;var t,o,a,c,l,u,b=0,s=0,d=0,k=0;ur=(u=ur)+32|0,s=u+12|0,k=u,l=(e|=0)+60|0,c=(65535&(i|=0))>>>8&255,a=(65535&(r|=0))>>>8&255,o=(65535&(f|=0))>>>8&255,t=(65535&(n|=0))>>>8&255,n=6228;A:for(;;){if(e=0|ar[l>>2],b=0|ar[n>>2],e){r=l,i=e;e:for(;;){for(e=i;!((0|ar[e+16>>2])>=(0|b));)if(!(e=0|ar[e+4>>2])){e=r;break e}if(!(i=0|ar[e>>2]))break;r=e}if((0|e)!=(0|l)&&(0|b)>=(0|ar[e+16>>2])){if(8!=(0|tr[e+20>>0])){d=13;break}switch(r=0|ar[e+28>>2],f=0|ar[e+48>>2],i=0|ar[e+40>>2],0|b){case 3:e=a;break;case 4:e=c;break;case 5:e=o;break;case 6:e=t;break;default:d=19;break A}vb(0|i,0|e,0|br(f,r))}else d=9}else d=9;if(9==(0|d)&&6!=((d=0)|b)){d=10;break}if(6244==(0|(n=n+4|0))){d=22;break}}if(10==(0|d))return ar[s>>2]=0,ar[s+4>>2]=0,ar[s+8>>2]=0,oo(A,5,2002,s),0<=(0|tr[s+11>>0])||vu(0|ar[s>>2]),void(ur=u);if(13==(0|d)){for(e=0|hu(64),ar[k>>2]=e,ar[k+8>>2]=-2147483584,r=25953,f=(i=e)+(ar[k+4>>2]=52)|0;tr[i>>0]=0|tr[r>>0],r=r+1|0,(0|(i=i+1|0))<(0|f););return(oo(A,4,tr[e+52>>0]=0,k),0<=(0|tr[k+11>>0]))?void(ur=u):(vu(0|ar[k>>2]),void(ur=u))}if(19==(0|d))sr(55739,25597,756,26006);else if(22==(0|d))return d=0|ar[(s=56592)+4>>2],ar[(k=A)>>2]=ar[s>>2],ar[k+4>>2]=d,yu(A+8|0,56600),void(ur=u)}function ul(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o,a,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0;if(ur=(a=ur)+48|0,W=a+12|0,Io(o=(I=a)+24|0,0|ar[(r|=0)>>2]),k=60+(0|ar[r>>2])|0,s=0==(0|(u=0|ar[k>>2])))d=8;else{c=k,b=u;A:for(;;){for(l=b;!(6<=(0|ar[l+16>>2]));)if(!(l=0|ar[l+4>>2]))break A;if(!(b=0|ar[l>>2])){c=l;break}c=l}(0|c)!=(0|k)&&(0|ar[c+16>>2])<=6||(d=8)}if(8==(0|d)&&(c=k),t=(0|c)==(0|k),s)X=0;else{c=k;A:for(;;){for(l=u;!(6<=(0|ar[l+16>>2]));)if(!(l=0|ar[l+4>>2]))break A;if(!(u=0|ar[l>>2])){c=l;break}c=l}X=(0|c)!=(0|k)&&(0|ar[c+16>>2])<=6?0|ar[c+40>>2]:0}c=0|ar[o>>2],n=4+o|0;A:do{if((0|c)!=(0|n)){E=e+60|0,y=(B=(0|i)<0)?0-i|0:0,B=B?0:i,p=(0|f)<0?0-f|0:0,Z=c;e:for(;;){v=0|ar[Z+16>>2],h=0|ar[E>>2];r:do{if(0|h){c=E,u=h;i:for(;;){for(l=u;!((0|ar[l+16>>2])>=(0|v));)if(!(l=0|ar[l+4>>2]))break i;if(!(u=0|ar[l>>2])){c=l;break}c=l}if((0|c)!=(0|E)&&(0|ar[c+16>>2])<=(0|v)){if(k=60+(0|ar[r>>2])|0,b=0==(0|(s=0|ar[k>>2])))g=m=0;else{c=k,u=s;i:for(;;){for(l=u;!((0|ar[l+16>>2])>=(0|v));)if(!(l=0|ar[l+4>>2]))break i;if(!(u=0|ar[l>>2])){c=l;break}c=l}g=(0|c)!=(0|k)&&(0|ar[c+16>>2])<=(0|v)?(m=0|ar[c+40>>2],0|ar[c+48>>2]):m=0}c=E,u=h;i:for(;;){for(l=u;!((0|ar[l+16>>2])>=(0|v));)if(!(l=0|ar[l+4>>2]))break i;if(!(u=0|ar[l>>2])){c=l;break}c=l}if(e=(0|c)!=(0|E)&&(0|ar[c+16>>2])<=(0|v)?(w=0|ar[c+48>>2],0|ar[c+40>>2]):w=0,b){d=59;break e}c=k,u=s;i:for(;;){for(l=u;!((0|ar[l+16>>2])>=(0|v));)if(!(l=0|ar[l+4>>2]))break i;if(!(u=0|ar[l>>2])){c=l;break}c=l}if(d=(0|c)!=(0|k)&&(0|ar[c+16>>2])<=(0|v)?0|ar[c+24>>2]:-1,b)s=-1;else{c=k,u=s;i:for(;;){for(l=u;!((0|ar[l+16>>2])>=(0|v));)if(!(l=0|ar[l+4>>2]))break i;if(!(u=0|ar[l>>2])){c=l;break}c=l}s=(0|c)!=(0|k)&&(0|ar[c+16>>2])<=(0|v)?0|ar[c+28>>2]:-1}if((0|d)<=-1){d=59;break e}if(!(-1<(0|s))){d=61;break e}c=E,u=h;i:for(;;){for(l=u;!((0|ar[l+16>>2])>=(0|v));)if(!(l=0|ar[l+4>>2]))break i;if(!(u=0|ar[l>>2])){c=l;break}c=l}b=(0|c)!=(0|E)&&(0|ar[c+16>>2])<=(0|v)?0|ar[c+24>>2]:-1,c=E,u=h;i:for(;;){for(l=u;!((0|ar[l+16>>2])>=(0|v));)if(!(l=0|ar[l+4>>2]))break i;if(!(u=0|ar[l>>2])){c=l;break}c=l}if(c=(0|c)!=(0|E)&&(0|ar[c+16>>2])<=(0|v)?0|ar[c+28>>2]:-1,(0|b)<=-1){d=78;break e}if((0|c)<=-1){d=80;break e}if(((s=(0|c)<(s+f|0)?c-f|0:s)|(d=(0|b)<(d+i|0)?b-i|0:d)|0)<0){d=82;break e}if(!((0|y)<(0|d)&(0|p)<(0|s))){d=90;break e}if(l=e+B|0,u=m+y|0,b=d-y|0,t){for(c=p;;)if(hb(l+(0|br(c+f|0,w))|0,u+(0|br(c,g))|0,0|b),(0|s)<=(0|(c=c+1|0)))break r}else l=p;do{for(u=(0|br(l+f|0,w))+B|0,b=(0|br(l,g))+y|0,c=y;v=e+(u+c)|0,k=0|cr[X+(h=b+c|0)>>0],h=0|br(k,0|cr[m+h>>0]),h=255&((((0|br(0|cr[v>>0],255^k))+h|0)>>>0)/255|0),tr[v>>0]=h,(0|(c=c+1|0))<(0|d););l=l+1|0}while((0|l)<(0|s))}}}while(0);if(c=0|ar[Z+4>>2])for(;l=0|ar[c>>2];)c=l;else if(c=0|ar[(l=Z+8|0)>>2],(0|ar[c>>2])!=(0|Z))for(;Z=0|ar[l>>2],c=0|ar[(l=Z+8|0)>>2],(0|ar[c>>2])!=(0|Z););if((0|c)==(0|n))break A;Z=c}if(59==(0|d))sr(26021,25597,795,26031);else if(61==(0|d))sr(26039,25597,796,26031);else if(78==(0|d))sr(26049,25597,800,26031);else if(80==(0|d))sr(26060,25597,801,26031);else{if(82==(0|d)){for(ar[W>>2]=0,ar[W+4>>2]=0,c=(ar[W+8>>2]=0)|hu(64),ar[W>>2]=c,ar[W+8>>2]=-2147483584,u=26071,b=(l=c)+(ar[W+4>>2]=54)|0;tr[l>>0]=0|tr[u>>0],u=u+1|0,(0|(l=l+1|0))<(0|b););return(tr[c+54>>0]=0,oo(A,2,122,W),0<=(0|tr[W+11>>0]))?(Co(o,A=0|ar[n>>2]),void(ur=a)):(vu(0|ar[W>>2]),Co(o,A=0|ar[n>>2]),void(ur=a))}if(90==(0|d)){for(ar[I>>2]=0,ar[I+4>>2]=0,c=(ar[I+8>>2]=0)|hu(64),ar[I>>2]=c,ar[I+8>>2]=-2147483584,u=26126,b=(l=c)+(ar[I+4>>2]=50)|0;tr[l>>0]=0|tr[u>>0],u=u+1|0,(0|(l=l+1|0))<(0|b););return(tr[c+50>>0]=0,oo(A,2,122,I),0<=(0|tr[I+11>>0]))?(Co(o,A=0|ar[n>>2]),void(ur=a)):(vu(0|ar[I>>2]),Co(o,A=0|ar[n>>2]),void(ur=a))}}}}while(0);W=0|ar[(f=56592)+4>>2],ar[(I=A)>>2]=ar[f>>2],ar[I+4>>2]=W,yu(A+8|0,56600),Co(o,A=0|ar[n>>2]),ur=a}function bl(A,e,r){e|=0,r|=0;var i,f;ur=(i=ur)+16|0,f=i,A=0|ar[(A|=0)>>2],e=0|tA(0|e),ar[f>>2]=ar[r>>2],r=0|cA(4144,0|f),aA(0|A,0|e,0|r),iA(0|r),iA(0|e),ur=i}function sl(A,e){e|=0;var r,i,f,n=0,t=0;if(ar[(A|=0)>>2]=0,ar[(f=A+4|0)>>2]=0,(r=(n=((ar[A+8>>2]=0)|ar[(i=e+4|0)>>2])-(0|ar[e>>2])|0)>>3)&&(536870911<r>>>0&&zl(),t=0|hu(n),ar[f>>2]=t,ar[A>>2]=t,ar[A+8>>2]=t+(r<<3),(0|(n=0|ar[e>>2]))!=(0|(e=0|ar[i>>2]))))for(;ar[t>>2]=ar[n>>2],A=0|ar[n+4>>2],0|(ar[t+4>>2]=A)&&bu(A),n=n+8|0,t=8+(0|ar[f>>2])|0,ar[f>>2]=t,(0|n)!=(0|e););}function dl(A,e,r){e|=0,r|=0;var i,f;ur=(i=ur)+16|0,f=i,A=0|ar[(A|=0)>>2],ar[f>>2]=ar[e>>2],e=0|cA(4144,0|f),ar[f>>2]=ar[r>>2],r=0|cA(4152,0|f),aA(0|A,0|e,0|r),iA(0|r),iA(0|e),ur=i}function kl(A,e){e|=0;var r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0;f=0|ar[(u=(A|=0)+4|0)>>2],c=n=0|ar[A>>2],536870911<(t=1+(r=f-n>>3)|0)>>>0&&zl(),o=(l=(0|ar[(i=A+8|0)>>2])-n|0)>>2,o=l>>3>>>0<268435455?o>>>0<t>>>0?t:o:536870911;do{if(o){if(!(536870911<o>>>0)){a=0|hu(o<<3);break}Zu(u=0|X(8),44519),ar[u>>2]=17660,I(0|u,4016,428)}else a=0}while(0);if(l=a+(o<<3)|0,ar[(t=n=a+(r<<3)|0)>>2]=ar[e>>2],o=0|ar[e+4>>2],o=(ar[a+(r<<3)+4>>2]=o)?(bu(o),f=0|ar[u>>2],0|ar[A>>2]):c,a=n+8|0,(0|f)!=(0|o)){for(;f=(c=f)+-8|0,ar[n+-8>>2]=ar[f>>2],c=c+-4|0,ar[n+-4>>2]=ar[c>>2],ar[f>>2]=0,t=n=t+-8|(ar[c>>2]=0),(0|f)!=(0|o););o=0|ar[A>>2],f=0|ar[u>>2]}if(ar[A>>2]=t,ar[u>>2]=a,ar[i>>2]=l,(0|f)!=(0|(t=o)))for(;n=0|ar[f+-4>>2],f=f+-8|0,0|n&&du(n),(0|f)!=(0|t););o&&vu(o)}function hl(A){var e;(A|=0)&&(0|(e=0|ar[A+4>>2])&&du(e),vu(A))}function wl(A,e){var r=0,i=0,f=0,n=0,t=0,o=0,a=0;if((e|=0)>>>0<=(f=0|ar[(o=(A|=0)+8|0)>>2])-(r=0|ar[(a=A+4|0)>>2])>>3>>>0)for(;ar[(o=r)>>2]=0,r=8+((ar[o+4>>2]=0)|ar[a>>2])|0,ar[a>>2]=r,0!=(0|(e=e+-1|0)););else{536870911<(r=(n=r-(i=0|ar[A>>2])>>3)+e|0)>>>0&&zl(),t=(f=f-i|0)>>2,r=f>>3>>>0<268435455?t>>>0<r>>>0?r:t:536870911;do{if(r){if(!(536870911<r>>>0)){i=0|hu(r<<3);break}Zu(a=0|X(8),44519),ar[a>>2]=17660,I(0|a,4016,428)}else i=0}while(0);for(t=i+(n<<3)|0,n=i+(r<<3)|0,f=r=t;ar[(i=r)>>2]=0,f=r=f+8|(ar[i+4>>2]=0),0!=(0|(e=e+-1|0)););e=0|ar[A>>2],r=t+(0-((i=(0|ar[a>>2])-e|0)>>3)<<3)|0,0<(0|i)&&hb(0|r,0|e,0|i),ar[A>>2]=r,ar[a>>2]=f,ar[o>>2]=n,e&&vu(e)}}function vl(A,e){A|=0,(e|=0)&&(vl(A,0|ar[e>>2]),vl(A,0|ar[e+4>>2]),0|(A=0|ar[e+24>>2])&&du(A),vu(e))}function ml(A,e){return A|=0,(e|=0)&&(ml(A,0|ar[e>>2]),ml(A,0|ar[e+4>>2]),void vu(e))}function gl(A){var e,r,i,f,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;if(ur=(f=ur)+16|0,e=f,(0|(n=0|ar[(r=(A|=0)+28|0)>>2]))!=(0|(i=A+32|0)))for(s=b=e+4|0,u=n;;){if(a=0|ar[u+20>>2],(l=0==(0|(c=0|ar[u+24>>2])))||bu(c),sl(e,a+48|0),o=0|ar[e>>2],(0|(n=0|ar[b>>2]))==(0|o))n=o;else{for(;t=n+-8|0,ar[b>>2]=t,(0|(n=(n=0|ar[n+-4>>2])?(du(n),0|ar[b>>2]):t))!=(0|o););n=0|ar[e>>2]}if(0|n){if((0|o)!=(0|n)){for(;t=o+-8|0,ar[b>>2]=t,(o=0|ar[o+-4>>2])&&(du(o),t=0|ar[b>>2]),(0|t)!=(0|n);)o=t;n=0|ar[e>>2]}vu(n)}if(n=(ar[a+68>>2]=0)|ar[(o=a+72|0)>>2],(ar[o>>2]=0)|n&&du(n),n=(ar[a+84>>2]=0)|ar[(o=a+88|0)>>2],(ar[o>>2]=0)|n&&du(n),sl(e,a+172|0),o=0|ar[e>>2],(0|(n=0|ar[s>>2]))==(0|o))n=o;else{for(;t=n+-8|0,ar[s>>2]=t,(0|(n=(n=0|ar[n+-4>>2])?(du(n),0|ar[s>>2]):t))!=(0|o););n=0|ar[e>>2]}if(0|n){if((0|o)!=(0|n)){for(;t=o+-8|0,ar[s>>2]=t,(o=0|ar[o+-4>>2])&&(du(o),t=0|ar[s>>2]),(0|t)!=(0|n);)o=t;n=0|ar[e>>2]}vu(n)}if(l||du(c),n=0|ar[u+4>>2])for(;t=0|ar[n>>2];)n=t;else if(n=0|ar[(t=u+8|0)>>2],(0|ar[n>>2])!=(0|u))for(;u=0|ar[t>>2],n=0|ar[(t=u+8|0)>>2],(0|ar[n>>2])!=(0|u););if((0|n)==(0|i))break;u=n}if(0|(n=0|ar[A+64>>2])&&du(n),0|(n=0|ar[A+56>>2])&&du(n),0|(n=0|ar[(a=A+40|0)>>2])){if((0|(t=0|ar[(c=A+44|0)>>2]))!=(0|n)){for(;o=t+-8|0,ar[c>>2]=o,(0|(t=(t=0|ar[t+-4>>2])?(du(t),0|ar[c>>2]):o))!=(0|n););n=0|ar[a>>2]}vu(n)}vl(r,0|ar[i>>2]),ml(A+16|0,0|ar[A+20>>2]),ur=(0<=(0|tr[A+11>>0])||vu(0|ar[A>>2]),f)}function Zl(A,e){A|=0;var r=0,i=0,f=0,n=0,t=0;if(r=0|ar[(e|=0)>>2]){n=(r=0|qu(r,416,400,0))?(0|(f=i=0|ar[e+4>>2])&&bu(i),r?(ar[A+204>>2]=r,r=0|ar[(n=A+208|0)>>2],ar[n>>2]=f,r&&du(r),0):f):0,r=0|ar[e>>2];do{if(0|r&&0|(t=0|qu(r,416,440,0))){if(i=t,0|(f=r=0|ar[e+4>>2])&&bu(r),t){if(ar[A+196>>2]=i,r=0|ar[(t=A+200|0)>>2],ar[t>>2]=f,!r)break;du(r);break}if(!r)break;du(r);break}}while(0);n&&du(n)}}function pl(A,e){A|=0,e|=0;var r,i,f,n,t,o,a=0,c=0,l=0,u=0;if(ur=(o=ur)+32|0,ar[(n=(i=o)+8|0)>>2]=0,ar[(t=4+n|0)>>2]=0,((ar[8+n>>2]=0)|(a=0|ar[(f=A+40|0)>>2]))!=(0|(r=0|ar[A+44>>2]))){l=i+4|0,u=8+n|0;do{c=0|ar[a>>2],ar[i>>2]=c,A=0|ar[a+4>>2],A=(ar[l>>2]=A)?(bu(A),c=0|ar[i>>2]):c;do{if((0|A)!=(0|ar[e>>2])){if((0|(A=0|ar[t>>2]))==(0|ar[u>>2])){kl(n,i);break}ar[A>>2]=c,c=0|ar[l>>2],(ar[A+4>>2]=c)&&(bu(c),A=0|ar[t>>2]),ar[t>>2]=A+8}}while(0);0|(A=0|ar[l>>2])&&du(A),a=a+8|0}while((0|a)!=(0|r))}if((0|f)!=(0|n)&&function(A,e,r){var i=0,f=0,n=0,t=0,o=0,a=0,c=0;if(o=(r|=0)-(e|=0)>>3,i=0|ar[(a=8+(A|=0)|0)>>2],n=0|ar[A>>2],o>>>0>i-(f=n)>>3>>>0){if(n){if((0|(i=0|ar[(t=A+4|0)>>2]))==(0|f))i=n;else{for(n=i;i=n+-8|0,ar[t>>2]=i,(n=0|ar[n+-4>>2])&&(du(n),i=0|ar[t>>2]),(0|i)!=(0|f);)n=i;i=0|ar[A>>2]}vu(i),ar[a>>2]=0,ar[t>>2]=0,ar[A>>2]=0,i=0}if(536870911<o>>>0&&zl(),f=i>>2,536870911<(f=i>>3>>>0<268435455?f>>>0<o>>>0?o:f:536870911)>>>0&&zl(),i=0|hu(f<<3),ar[(n=A+4|0)>>2]=i,ar[A>>2]=i,ar[a>>2]=i+(f<<3),(0|e)==(0|r))return;for(;ar[i>>2]=ar[e>>2],f=0|ar[e+4>>2],0|(ar[i+4>>2]=f)&&bu(f),e=e+8|0,i=8+(0|ar[n>>2])|0,ar[n>>2]=i,(0|e)!=(0|r););return}if(i=(0|ar[(a=A+4|0)>>2])-n>>3,A=i>>>0<o>>>0,i=e+(i<<3)|0,(0|(o=A?i:r))==(0|e))e=f;else{for(;n=0|ar[e>>2],0|(t=0|ar[e+4>>2])&&bu(t),ar[f>>2]=n,n=0|ar[(c=f+4|0)>>2],ar[c>>2]=t,0|n&&du(n),f=f+8|0,(0|(e=e+8|0))!=(0|o););e=f}if(!A){if((0|(i=0|ar[a>>2]))==(0|e))return;for(;f=i+-8|0,ar[a>>2]=f,(0|(i=(i=0|ar[i+-4>>2])?(du(i),0|ar[a>>2]):f))!=(0|e););return}if((0|o)==(0|r))return;f=0|ar[a>>2];for(;ar[f>>2]=ar[i>>2],e=0|ar[i+4>>2],0|(ar[f+4>>2]=e)&&bu(e),i=i+8|0,f=8+(0|ar[a>>2])|0,ar[a>>2]=f,(0|i)!=(0|r););}(f,0|ar[n>>2],0|ar[t>>2]),A=0|ar[n>>2]){if((0|(a=0|ar[t>>2]))!=(0|A)){for(;c=a+-8|0,ar[t>>2]=c,(0|(a=(a=0|ar[a+-4>>2])?(du(a),0|ar[t>>2]):c))!=(0|A););A=0|ar[n>>2]}vu(A),ur=o}else ur=o}function yl(A,e){e|=0;var r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0;t=0|ar[(b=(A|=0)+4|0)>>2],r=o=0|ar[A>>2],536870911<(f=(l=t-o>>3)+1|0)>>>0&&zl(),a=(u=(0|ar[(i=A+8|0)>>2])-o|0)>>2,a=u>>3>>>0<268435455?a>>>0<f>>>0?f:a:536870911;do{if(a){if(!(536870911<a>>>0)){c=0|hu(a<<3);break}Zu(b=0|X(8),44519),ar[b>>2]=17660,I(0|b,4016,428)}else c=0}while(0);if(u=c+(a<<3)|0,ar[(f=n=c+(l<<3)|0)>>2]=ar[e>>2],a=e+4|0,ar[c+(l<<3)+4>>2]=ar[a>>2],ar[e>>2]=0,a=n+8|(ar[a>>2]=0),(0|t)!=(0|r)){for(;t=(l=t)+-8|0,ar[n+-8>>2]=ar[t>>2],l=l+-4|0,ar[n+-4>>2]=ar[l>>2],ar[t>>2]=0,f=n=f+-8|(ar[l>>2]=0),(0|t)!=(0|r););o=0|ar[A>>2]}if(ar[A>>2]=f,f=0|ar[b>>2],ar[b>>2]=a,ar[i>>2]=u,(0|f)!=(0|(t=o)))for(;n=0|ar[f+-4>>2],f=f+-8|0,0|n&&du(n),(0|f)!=(0|t););o&&vu(o)}function Bl(A,e){e|=0;var r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0;t=0|ar[(b=(A|=0)+4|0)>>2],r=o=0|ar[A>>2],536870911<(f=(l=t-o>>3)+1|0)>>>0&&zl(),a=(u=(0|ar[(i=A+8|0)>>2])-o|0)>>2,a=u>>3>>>0<268435455?a>>>0<f>>>0?f:a:536870911;do{if(a){if(!(536870911<a>>>0)){c=0|hu(a<<3);break}Zu(b=0|X(8),44519),ar[b>>2]=17660,I(0|b,4016,428)}else c=0}while(0);if(u=c+(a<<3)|0,ar[(f=n=c+(l<<3)|0)>>2]=ar[e>>2],a=e+4|0,ar[c+(l<<3)+4>>2]=ar[a>>2],ar[e>>2]=0,a=n+8|(ar[a>>2]=0),(0|t)!=(0|r)){for(;t=(l=t)+-8|0,ar[n+-8>>2]=ar[t>>2],l=l+-4|0,ar[n+-4>>2]=ar[l>>2],ar[t>>2]=0,f=n=f+-8|(ar[l>>2]=0),(0|t)!=(0|r););o=0|ar[A>>2]}if(ar[A>>2]=f,f=0|ar[b>>2],ar[b>>2]=a,ar[i>>2]=u,(0|f)!=(0|(t=o)))for(;n=0|ar[f+-4>>2],f=f+-8|0,0|n&&du(n),(0|f)!=(0|t););o&&vu(o)}function El(A){var e=0,r=0,i=0,f=0,n=0;if(0|(e=0|ar[(A|=0)+208>>2])&&du(e),0|(e=0|ar[A+200>>2])&&du(e),0|(e=0|ar[(n=A+184|0)>>2])){if((0|(r=0|ar[(f=A+188|0)>>2]))!=(0|e)){for(;i=r+-8|0,ar[f>>2]=i,(0|(r=(r=0|ar[r+-4>>2])?(du(r),0|ar[f>>2]):i))!=(0|e););e=0|ar[n>>2]}vu(e)}if(0|(e=0|ar[(f=A+172|0)>>2])){if((0|(r=0|ar[(n=A+176|0)>>2]))!=(0|e)){for(;i=r+-8|0,ar[n>>2]=i,(0|(r=(r=0|ar[r+-4>>2])?(du(r),0|ar[n>>2]):i))!=(0|e););e=0|ar[f>>2]}vu(e)}if((0|tr[(e=A+160|0)+11>>0])<0&&vu(0|ar[e>>2]),0|(e=0|ar[A+88>>2])&&du(e),0|(e=0|ar[A+72>>2])&&du(e),0|(e=0|ar[(f=A+48|0)>>2])){if((0|(r=0|ar[(n=A+52|0)>>2]))!=(0|e)){for(;i=r+-8|0,ar[n>>2]=i,(0|(r=(r=0|ar[r+-4>>2])?(du(r),0|ar[n>>2]):i))!=(0|e););e=0|ar[f>>2]}vu(e)}0<=(0|tr[A+11>>0])||vu(0|ar[A>>2])}function Xl(A,e,r,i,f,n){A|=0,r|=0,i|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0,R=0,N=0,_=0,Y=0,Q=0,D=0,J=0,M=0,T=0,U=0,S=0;ur=(k=ur)+272|0,s=k+96|0,B=k+236|0,U=k+72|0,S=k+48|0,t=k+24|0,I=k+224|0,C=(o=k)+200|0,F=k+212|0,G=k+188|0,W=k+176|0,V=k+168|0,R=k+152|0,y=k+140|0,a=k+128|0,b=k+116|0,ho(d=k+248|0,0|ar[(N=(e|=0)+60|0)>>2],r),(Z=0|ar[(c=e+32|0)>>2])?(v=c,g=Z):sr(31354,30203,1047,31362);A:for(;;){for(m=g;!((0|ar[m+16>>2])>>>0>=r>>>0);)if(!(m=0|ar[m+4>>2]))break A;if(!(g=0|ar[m>>2])){v=m;break}v=m}(0|v)==(0|c)&&sr(31354,30203,1047,31362),(0|ar[v+16>>2])>>>0>r>>>0?sr(31354,30203,1047,31362):(w=c,p=Z);A:for(;;){for(v=p;!((0|ar[v+16>>2])>>>0>=r>>>0);)if(!(v=0|ar[v+4>>2]))break A;if(!(p=0|ar[v>>2])){w=v;break}w=v}(0|w)!=(0|c)&&(0|ar[w+16>>2])>>>0<=r>>>0||(w=c),v=0|ar[w+20>>2],0|(u=0|ar[w+24>>2])&&bu(u),(E=v)||sr(31354,30203,1047,31362),h=s,ar[(h|=0)>>2]=0,ar[h+4>>2]=0,ar[h+8>>2]=0,ar[h+12>>2]=0,v=(ar[h+16>>2]=0)|tr[(l=11+d|0)>>0],w=0|ar[(m=4+d|0)>>2],M=4==(0|(v<<24>>24<0?w:255&v))?0|Yu(d,0,-1,30298,4)?(v=0|tr[l>>0],w=0|ar[m>>2],22):25:22;A:do{if(22==(0|M)){if(4==(0|(v<<24>>24<0?w:255&v))){if(!(0|Yu(d,0,-1,30318,4))){M=25;break}v=0|tr[l>>0],w=0|ar[m>>2]}do{if(4==(0|(v<<24>>24<0?w:255&v))){if(0|Yu(d,0,-1,30303,4)){v=0|tr[l>>0],w=0|ar[m>>2];break}if(ar[U>>2]=0,ar[(g=U+4|0)>>2]=0,mo(S,(ar[U+8>>2]=0)|ar[N>>2],r,U),w=0|ar[(m=S)+4>>2],ar[(v=s)>>2]=ar[m>>2],ar[v+4>>2]=w,w=S+8|0,(0|tr[(m=(v=8+s|0)+11|0)>>0])<0?(tr[ar[v>>2]>>0]=0,ar[12+s>>2]=0):(tr[v>>0]=0,tr[m>>0]=0),Cu(v,0),ar[v>>2]=ar[w>>2],ar[v+4>>2]=ar[w+4>>2],ar[v+8>>2]=ar[w+8>>2],0|ar[s>>2]){S=0|ar[(i=s)+4>>2],ar[(w=A)>>2]=ar[i>>2],ar[w+4>>2]=S,ar[(w=A+8|0)>>2]=ar[v>>2],ar[w+4>>2]=ar[v+4>>2],ar[w+8>>2]=ar[v+8>>2],ar[v>>2]=0,ar[v+4>>2]=0,(ar[v+8>>2]=0)|(w=0|ar[U>>2])&&((0|ar[g>>2])!=(0|w)&&(ar[g>>2]=w),vu(w));break A}if(Wl(S,e,r,i,U),J=0|ar[(D=S)+4>>2],ar[(w=s)>>2]=ar[D>>2],ar[w+4>>2]=J,w=S+8|0,(0|tr[m>>0])<0?(tr[ar[v>>2]>>0]=0,ar[12+s>>2]=0):(tr[v>>0]=0,tr[m>>0]=0),Cu(v,0),ar[v>>2]=ar[w>>2],ar[v+4>>2]=ar[w+4>>2],ar[v+8>>2]=ar[w+8>>2],0|ar[s>>2]){S=0|ar[(i=s)+4>>2],ar[(w=A)>>2]=ar[i>>2],ar[w+4>>2]=S,ar[(w=A+8|0)>>2]=ar[v>>2],ar[w+4>>2]=ar[v+4>>2],ar[w+8>>2]=ar[v+8>>2],ar[v>>2]=0,ar[v+4>>2]=0,(ar[v+8>>2]=0)|(w=0|ar[U>>2])&&((0|ar[g>>2])!=(0|w)&&(ar[g>>2]=w),vu(w));break A}0|(w=0|ar[U>>2])&&((0|ar[g>>2])!=(0|w)&&(ar[g>>2]=w),vu(w)),M=178;break A}}while(0);do{if(4==(0|(v<<24>>24<0?w:255&v))){if(0|Yu(d,0,-1,30308,4)){v=0|tr[l>>0],w=0|ar[m>>2];break}if(Il(U,e,r,i),v=0|ar[(m=U)+4>>2],ar[(w=s)>>2]=ar[m>>2],ar[w+4>>2]=v,v=U+8|0,(0|tr[(m=(w=8+s|0)+11|0)>>0])<0?(tr[ar[w>>2]>>0]=0,ar[12+s>>2]=0):(tr[w>>0]=0,tr[m>>0]=0),Cu(w,0),ar[w>>2]=ar[v>>2],ar[w+4>>2]=ar[v+4>>2],ar[w+8>>2]=ar[v+8>>2],!(0|ar[s>>2])){M=178;break A}U=0|ar[(i=s)+4>>2],ar[(S=A)>>2]=ar[i>>2],ar[S+4>>2]=U,ar[(A=A+8|0)>>2]=ar[w>>2],ar[A+4>>2]=ar[w+4>>2],ar[A+8>>2]=ar[w+8>>2],ar[w>>2]=0,ar[w+4>>2]=0,ar[w+8>>2]=0;break A}}while(0);if(4==(0|(v<<24>>24<0?w:255&v))&&0==(0|Yu(d,0,-1,30313,4))){if(ar[U>>2]=0,ar[(g=U+4|0)>>2]=0,mo(S,(ar[U+8>>2]=0)|ar[N>>2],r,U),w=0|ar[(m=S)+4>>2],ar[(v=s)>>2]=ar[m>>2],ar[v+4>>2]=w,w=S+8|0,(0|tr[(m=(v=8+s|0)+11|0)>>0])<0?(tr[ar[v>>2]>>0]=0,ar[12+s>>2]=0):(tr[v>>0]=0,tr[m>>0]=0),Cu(v,0),ar[v>>2]=ar[w>>2],ar[v+4>>2]=ar[w+4>>2],ar[v+8>>2]=ar[w+8>>2],0|ar[s>>2]){S=0|ar[(i=s)+4>>2],ar[(w=A)>>2]=ar[i>>2],ar[w+4>>2]=S,ar[(w=A+8|0)>>2]=ar[v>>2],ar[w+4>>2]=ar[v+4>>2],ar[w+8>>2]=ar[v+8>>2],ar[v>>2]=0,ar[v+4>>2]=0,(ar[v+8>>2]=0)|(w=0|ar[U>>2])&&((0|ar[g>>2])!=(0|w)&&(ar[g>>2]=w),vu(w));break}if(Cl(S,e,r,i,U),J=0|ar[(D=S)+4>>2],ar[(w=s)>>2]=ar[D>>2],ar[w+4>>2]=J,w=S+8|0,(0|tr[m>>0])<0?(tr[ar[v>>2]>>0]=0,ar[12+s>>2]=0):(tr[v>>0]=0,tr[m>>0]=0),Cu(v,0),ar[v>>2]=ar[w>>2],ar[v+4>>2]=ar[w+4>>2],ar[v+8>>2]=ar[w+8>>2],0|ar[s>>2]){S=0|ar[(i=s)+4>>2],ar[(w=A)>>2]=ar[i>>2],ar[w+4>>2]=S,ar[(w=A+8|0)>>2]=ar[v>>2],ar[w+4>>2]=ar[v+4>>2],ar[w+8>>2]=ar[v+8>>2],ar[v>>2]=0,ar[v+4>>2]=0,(ar[v+8>>2]=0)|(w=0|ar[U>>2])&&((0|ar[g>>2])!=(0|w)&&(ar[g>>2]=w),vu(w));break}0|(w=0|ar[U>>2])&&((0|ar[g>>2])!=(0|w)&&(ar[g>>2]=w),vu(w)),M=178;break}ar[y>>2]=0,ar[y+4>>2]=0,ar[y+8>>2]=0,oo(A,4,3001,y),(0|tr[y+11>>0])<0&&vu(0|ar[y>>2])}}while(0);do{if(25==(0|M)){if(v=0|tr[l>>0],w=0|ar[m>>2],4==(0|(v<<24>>24<0?w:255&v))?0|Yu(d,0,-1,30298,4)?(v=0|tr[l>>0],w=0|ar[m>>2],M=28):p=1:M=28,28==(0|M)&&(p=4==(0|(v<<24>>24<0?w:255&v))&&(p=0==(0|Yu(d,0,-1,30318,4)))?4:0),m=(w=0|Rl(p))?0|jb[127&ar[w+16>>2]](p):0,(0|(v=0|ar[e+16>>2]))==(0|(y=e+20|0)))g=w;else{do{if(D=0|ar[v+16>>2],w=(J=(0|m)<(0|(g=0|jb[127&ar[D+16>>2]](p))))?D:w,m=J?g:m,g=0|ar[v+4>>2])for(v=g;g=0|ar[v>>2];)v=g;else if(Z=0|ar[(g=v+8|0)>>2],(0|ar[Z>>2])==(0|v))v=Z;else for(;J=0|ar[g>>2],v=0|ar[(g=J+8|0)>>2],(0|ar[v>>2])!=(0|J););}while((0|v)!=(0|y));g=w}if(!g){if(ar[B>>2]=0,ar[B+4>>2]=0,ar[B+8>>2]=0,oo(A,4,3e3,B),0<=(0|tr[B+11>>0]))break;vu(0|ar[B>>2]);break}if(ar[U>>2]=0,ar[(X=U+4|0)>>2]=0,mo(S,(ar[U+8>>2]=0)|ar[N>>2],r,U),v=0|ar[(m=S)+4>>2],ar[(w=s)>>2]=ar[m>>2],ar[w+4>>2]=v,v=S+8|0,(0|tr[(m=(w=8+s|0)+11|0)>>0])<0?(tr[ar[w>>2]>>0]=0,ar[12+s>>2]=0):(tr[w>>0]=0,tr[m>>0]=0),Cu(w,0),ar[w>>2]=ar[v>>2],ar[w+4>>2]=ar[v+4>>2],ar[w+8>>2]=ar[v+8>>2],0|ar[s>>2])D=0|ar[(Q=s)+4>>2],ar[(J=A)>>2]=ar[Q>>2],ar[J+4>>2]=D,ar[(J=A+8|0)>>2]=ar[w>>2],ar[J+4>>2]=ar[w+4>>2],ar[J+8>>2]=ar[w+8>>2],ar[w>>2]=0,ar[w+4>>2]=0,ar[w+8>>2]=0,w=1;else{fs[63&ar[g+20>>2]](t,S),Z=0|ar[t>>2];do{if(Z)m=0|ar[4+t>>2],v=0|ar[8+t>>2],ar[I>>2]=0,ar[I+4>>2]=0,4294967279<(g=(ar[I+8>>2]=0)|Vc(v))>>>0&&pu(),g>>>0<11?(tr[I+11>>0]=g)?(w=I,M=53):w=I:(w=0|hu(M=g+16&-16),ar[I>>2]=w,ar[I+8>>2]=-2147483648|M,ar[I+4>>2]=g,M=53),53==(0|M)&&hb(0|w,0|v,0|g),tr[w+g>>0]=0,oo(A,Z,m,I),w=((0|tr[I+11>>0])<0&&vu(0|ar[I>>2]),1);else{if(J=0|ar[U>>2],ts[31&ar[g+28>>2]](o,0|ar[S>>2],J,(0|ar[X>>2])-J|0),ar[t>>2]=ar[o>>2],ar[4+t>>2]=ar[o+4>>2],ar[8+t>>2]=ar[o+8>>2],0|ar[t>>2]){if(is[511&ar[g+24>>2]](0|ar[S>>2]),m=0|ar[t>>2],g=0|ar[4+t>>2],v=0|ar[8+t>>2],ar[C>>2]=0,ar[C+4>>2]=0,4294967279<(Z=(ar[C+8>>2]=0)|Vc(v))>>>0&&pu(),Z>>>0<11?(tr[C+11>>0]=Z)?(w=C,M=62):w=C:(w=0|hu(M=Z+16&-16),ar[C>>2]=w,ar[C+8>>2]=-2147483648|M,ar[C+4>>2]=Z,M=62),62==(0|M)&&hb(0|w,0|v,0|Z),tr[w+Z>>0]=0,oo(A,m,g,C),0<=(0|tr[C+11>>0])){w=1;break}vu(0|ar[C>>2]),w=1;break}ar[o>>2]=0,ns[127&ar[g+32>>2]](F,0|ar[S>>2],o),ar[t>>2]=ar[F>>2],ar[4+t>>2]=ar[F+4>>2],ar[8+t>>2]=ar[F+8>>2];do{if(0|ar[t>>2]){if(is[511&ar[g+24>>2]](0|ar[S>>2]),m=0|ar[t>>2],g=0|ar[4+t>>2],v=0|ar[8+t>>2],ar[G>>2]=0,ar[G+4>>2]=0,4294967279<(Z=(ar[G+8>>2]=0)|Vc(v))>>>0&&pu(),Z>>>0<11?(tr[G+11>>0]=Z)?(w=G,M=71):w=G:(w=0|hu(M=Z+16&-16),ar[G>>2]=w,ar[G+8>>2]=-2147483648|M,ar[G+4>>2]=Z,M=71),71==(0|M)&&hb(0|w,0|v,0|Z),tr[w+Z>>0]=0,oo(A,m,g,G),0<=(0|tr[G+11>>0])){w=1;break}vu(0|ar[G>>2]),w=1}else{if(!(w=0|ar[o>>2])){if(is[511&ar[g+24>>2]](0|ar[S>>2]),ar[W>>2]=0,ar[W+4>>2]=0,oo(A,7,ar[W+8>>2]=0,W),0<=(0|tr[W+11>>0])){w=1;break}vu(0|ar[W>>2]),w=1;break}p=0|ar[w>>2],J=0|ar[(D=w+4|0)>>2],ar[w>>2]=0,ar[D>>2]=0,ar[i>>2]=p,w=0|ar[(p=i+4|0)>>2],ar[p>>2]=J,0|w&&du(w),hl(0|ar[o>>2]),is[511&ar[g+24>>2]](0|ar[S>>2]),w=0|ar[E+196>>2],(B=0==(0|(y=0|ar[E+200>>2])))||bu(y);do{if(0|w){if(v=0|ar[i>>2],B||(bu(y),bu(y)),ar[v+40>>2]=w,w=0|ar[(J=v+44|0)>>2],ar[J>>2]=y,0|w&&du(w),B)break;du(y)}}while(0);v=0|ar[E+204>>2],(Z=0==(0|(g=0|ar[E+208>>2])))||bu(g);do{if(0|v){if(w=0|ar[i>>2],Z||(bu(g),bu(g)),ar[w+48>>2]=v,w=0|ar[(J=w+52|0)>>2],ar[J>>2]=g,0|w&&du(w),Z)break;du(g)}}while(0);J=0|ar[i>>2],D=0|ar[J+32>>2],v=2==(0|(w=0==(0|(w=99==(0|f)?D:f))?1:w))?0:3;do{if((0|w)==(0|D)&&(0|v)==(0|ar[J+36>>2]))w=0;else{ar[V>>2]=0,me(F,i,w,v,V,ar[(m=V+4|0)>>2]=0),w=0|ar[F>>2],J=0|ar[(v=F+4|0)>>2],ar[F>>2]=0,ar[v>>2]=0,ar[i>>2]=w,w=0|ar[p>>2],ar[p>>2]=J;do{if(0|w){if(du(w),!(w=0|ar[v>>2]))break;du(w)}}while(0);if(0|(w=0|ar[m>>2])&&du(w),0|ar[i>>2]){w=0;break}if(ar[R>>2]=0,ar[R+4>>2]=0,ar[R+8>>2]=0,oo(A,4,3003,R),0<=(0|tr[R+11>>0])){w=1;break}vu(0|ar[R>>2]),w=1}}while(0);if(Z||du(g),B)break;du(y)}}while(0)}}while(0)}0|(v=0|ar[U>>2])&&((0|ar[X>>2])!=(0|v)&&(ar[X>>2]=v),vu(v)),w||(M=178)}}while(0);do{if(178==(0|M)){if(0==(0|n)||0==(0|tr[n+1>>0])){ar[U>>2]=0,ar[(J=U+4|0)>>2]=0,w=(ar[U+8>>2]=0)|ar[N>>2],v=0|ar[w+44>>2],(D=0==(0|(Q=0|ar[w+48>>2])))||(bu(Q),w=0|ar[N>>2]),ar[S>>2]=ar[w+52>>2],Y=S+4|0,w=0|ar[w+56>>2],0|(ar[Y>>2]=w)&&bu(w),Ht(t,v,r,S,U),w=0|ar[(_=t)+4>>2],ar[(N=s)>>2]=ar[_>>2],ar[N+4>>2]=w,w=8+t|0,(0|tr[(_=(N=8+s|0)+11|0)>>0])<0?(tr[ar[N>>2]>>0]=0,ar[12+s>>2]=0):(tr[N>>0]=0,tr[_>>0]=0),Cu(N,0),ar[N>>2]=ar[w>>2],ar[N+4>>2]=ar[w+4>>2],ar[N+8>>2]=ar[w+8>>2],w=0|ar[U>>2],X=0|ar[J>>2];A:do{if((0|w)!=(0|X)){W=11+a|0,G=12+s|0,f=i+4|0,V=A+8|0,F=8+t|0,R=I=4+t|0,n=C=o+8|0;e:for(;;){v=0|ar[(Z=w+4|0)>>2];r:do{if(v){if(m=0|qu(v,128,808,0)){(v=0|ar[w+8>>2])?bu(v):v=0,ar[t>>2]=0,ol(o,(ar[R>>2]=0)|ar[i>>2],0|ar[m+56>>2],t),B=0|ar[(y=o)+4>>2],ar[(E=s)>>2]=ar[y>>2],ar[E+4>>2]=B,(0|tr[_>>0])<0?(tr[ar[N>>2]>>0]=0,ar[G>>2]=0):(tr[N>>0]=0,tr[_>>0]=0),Cu(N,0),ar[N>>2]=ar[n>>2],ar[N+4>>2]=ar[n+4>>2],ar[N+8>>2]=ar[n+8>>2];do{if(0|ar[s>>2])E=0|ar[(B=s)+4>>2],ar[(m=A)>>2]=ar[B>>2],ar[m+4>>2]=E,ar[V>>2]=ar[N>>2],ar[V+4>>2]=ar[N+4>>2],ar[V+8>>2]=ar[N+8>>2],ar[N>>2]=0,ar[N+4>>2]=0,ar[N+8>>2]=0,m=1;else{if(m=0|ar[t>>2],0|(g=0|ar[R>>2])&&bu(g),ar[i>>2]=m,m=0|ar[f>>2],ar[f>>2]=g,!m){m=0;break}du(m),m=0}}while(0);if(0|(g=0|ar[R>>2])&&du(g),m){m=1;break}E=v}else E=0;if(v=0|ar[Z>>2]){m=0|qu(v,128,776,0);do{if(m){if((v=0|ar[w+8>>2])?bu(v):v=0,al(t,0|ar[i>>2],1==(0|tr[m+56>>0])),B=0|ar[(y=t)+4>>2],ar[(M=s)>>2]=ar[y>>2],ar[M+4>>2]=B,(0|tr[_>>0])<0?(tr[ar[N>>2]>>0]=0,ar[G>>2]=0):(tr[N>>0]=0,tr[_>>0]=0),Cu(N,0),ar[N>>2]=ar[F>>2],ar[N+4>>2]=ar[F+4>>2],ar[N+8>>2]=ar[F+8>>2],!(0|ar[s>>2])){B=v;break}g=0|ar[(M=s)+4>>2],ar[(m=A)>>2]=ar[M>>2],ar[m+4>>2]=g,ar[V>>2]=ar[N>>2],ar[V+4>>2]=ar[N+4>>2],ar[V+8>>2]=ar[N+8>>2],ar[N>>2]=0,ar[N+4>>2]=0,ar[N+8>>2]=0,m=1,g=v,v=E,M=241;break r}B=0}while(0);if(!(v=0|ar[Z>>2])){Z=0,g=B,v=E,M=238;break}if(!(m=0|qu(v,128,744,0))){Z=0,g=B,v=E,M=238;break}if((v=0|ar[w+8>>2])?bu(v):v=0,y=0|ar[i>>2],g=0|ar[y+24>>2],y=0|ar[y+28>>2],(0|g)<=-1){M=220;break e}if((0|y)<=-1){M=222;break e}if(p=0|Kt(m,g),M=0|qt(m,g),Z=0|$t(m,y),(0|(g=(0|M)<(0|g)?M:g+-1|0))<(0|(p=0<(0|p)?p:0))|(0|(m=(0|(m=0|Ao(m,y)))<(0|y)?m:y+-1|0))<(0|(Z=0<(0|Z)?Z:0))){if(ar[a>>2]=0,ar[4+a>>2]=0,ar[8+a>>2]=0,oo(A,2,120,a),0<=(0|tr[W>>0])){m=1,Z=v,g=B,v=E,M=239;break}vu(0|ar[a>>2]),m=1,Z=v,g=B,v=E,M=239;break}ar[t>>2]=0,cl(o,(ar[I>>2]=0)|ar[i>>2],p,g,Z,m,t),y=0|ar[(p=o)+4>>2],ar[(M=s)>>2]=ar[p>>2],ar[M+4>>2]=y,(0|tr[_>>0])<0?(tr[ar[N>>2]>>0]=0,ar[G>>2]=0):(tr[N>>0]=0,tr[_>>0]=0),Cu(N,0),ar[N>>2]=ar[C>>2],ar[N+4>>2]=ar[C+4>>2],ar[N+8>>2]=ar[C+8>>2];do{if(0|ar[s>>2])M=0|ar[(y=s)+4>>2],ar[(m=A)>>2]=ar[y>>2],ar[m+4>>2]=M,ar[V>>2]=ar[N>>2],ar[V+4>>2]=ar[N+4>>2],ar[V+8>>2]=ar[N+8>>2],ar[N>>2]=0,ar[N+4>>2]=0,ar[N+8>>2]=0,m=1;else{if(m=0|ar[t>>2],0|(g=0|ar[I>>2])&&bu(g),ar[i>>2]=m,m=0|ar[f>>2],ar[f>>2]=g,!m){m=0;break}du(m),m=0}}while(0);0|(g=0|ar[I>>2])&&du(g),M=m?(m=1,Z=v,g=B,v=E,239):(Z=v,g=B,v=E,238)}else g=Z=0,v=E,M=238}else v=g=Z=0,M=238}while(0);if(238==(0|M)&&(m=0,M=239),239==(0|M)&&(M=(Z&&du(Z),241)),241==(0|M)&&(M=0,g&&du(g)),0|v&&du(v),w=w+12|0,0|m){T=m;break A}if((0|w)==(0|X)){T=2;break A}}220==(0|M)?sr(31382,30203,1221,31362):222==(0|M)&&sr(31397,30203,1222,31362)}else T=2}while(0);if(0|(w=0|ar[Y>>2])&&du(w),D||du(Q),0|(w=0|ar[U>>2])){if((0|(v=0|ar[J>>2]))!=(0|w)){for(;m=v+-12|0,ar[J>>2]=m,(0|(v=(v=0|ar[v+-4>>2])?(du(v),0|ar[J>>2]):m))!=(0|w););w=0|ar[U>>2]}vu(w)}if(2!=(2|T))break}if(0|(m=0|ar[c>>2])){w=c,g=m;A:for(;;){for(v=g;!((0|ar[v+16>>2])>>>0>=r>>>0);)if(!(v=0|ar[v+4>>2]))break A;if(!(g=0|ar[v>>2])){w=v;break}w=v}if((0|w)!=(0|c)&&(0|ar[w+16>>2])>>>0<=r>>>0){w=c;A:for(;;){for(v=m;!((0|ar[v+16>>2])>>>0>=r>>>0);)if(!(v=0|ar[v+4>>2]))break A;if(!(m=0|ar[v>>2])){w=v;break}w=v}if((0|w)!=(0|c)&&(0|ar[w+16>>2])>>>0<=r>>>0||(w=c),v=0|ar[w+20>>2],(y=0==(0|(p=0|ar[w+24>>2])))||bu(p),w=0|ar[v+68>>2],(Z=0==(0|(g=0|ar[v+72>>2])))||bu(g),w){ar[U>>2]=0,Xl(S,e,(ar[(m=U+4|0)>>2]=0)|ar[w+20>>2],U,99,0);A:do{if(0|ar[S>>2])w=0|ar[(i=S)+4>>2],ar[(U=A)>>2]=ar[i>>2],ar[U+4>>2]=w,w=S+8|0,ar[(U=A+8|0)>>2]=ar[w>>2],ar[U+4>>2]=ar[w+4>>2],ar[U+8>>2]=ar[w+8>>2],ar[w>>2]=0,ar[w+4>>2]=0,ar[w+8>>2]=0,w=1;else{switch(0|ar[32+(0|ar[U>>2])>>2]){case 2:case 0:w=0;break;case 1:w=3;break;default:if(ar[b>>2]=0,ar[4+b>>2]=0,ar[8+b>>2]=0,oo(A,2,3003,b),0<=(0|tr[11+b>>0])){w=1;break A}vu(0|ar[b>>2]),w=1;break A}_o(0|ar[i>>2],U,w,6),w=0}}while(0);(0|tr[(v=S+8|0)+11>>0])<0&&vu(0|ar[v>>2]),0|(v=0|ar[m>>2])&&du(v),w||(M=289)}else M=289;if(289==(0|M)&&(w=0),Z||du(g),y||du(p),0|w)break}}U=0|ar[(i=56592)+4>>2],ar[(S=A)>>2]=ar[i>>2],ar[S+4>>2]=U,yu(A+8|0,56600)}}while(0);(0|tr[(w=8+s|0)+11>>0])<0&&vu(0|ar[w>>2]),0|u&&du(u),ur=(0<=(0|tr[l>>0])||vu(0|ar[d>>2]),k)}function Wl(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f|=0;var n,t,o,a,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0,R=0,N=0,_=0,Y=0,Q=0,D=0,J=0,M=0,T=0,U=0;if(ur=(a=ur)+480|0,J=a+24|0,s=(o=a)+460|0,c=a+436|0,Z=a+280|0,k=a+424|0,v=a+264|0,t=a+256|0,p=a+96|0,y=a+240|0,B=a+80|0,E=a+68|0,Q=a+56|0,n=a+48|0,ar[(g=a+448|0)>>2]=0,ar[g+4>>2]=0,ar[g+8>>2]=0,function(A,e,r){A|=0,e|=0;var i,f=0,n=0,t=0,o=0;if(ur=(i=ur)+32|0,t=i+12|0,o=i,n=0|ar[(r|=0)>>2],(r=(0|ar[r+4>>2])-n|0)>>>0<8){for(r=0|hu(32),ar[t>>2]=r,ar[t+8>>2]=-2147483616,n=30033,e=(f=r)+(ar[t+4>>2]=25)|0;tr[f>>0]=0|tr[n>>0],n=n+1|0,(0|(f=f+1|0))<(0|e););return(tr[r+25>>0]=0,oo(A,2,118,t),0<=(0|tr[t+11>>0]))?ur=i:(vu(0|ar[t>>2]),ur=i)}t=0==(1&tr[n+1>>0]),or[e>>1]=1+(0|cr[n+2>>0]),or[e+2>>1]=1+(0|cr[n+3>>0]);do{if(!t){if(12<=r>>>0){ar[e+4>>2]=cr[n+5>>0]<<16|cr[n+4>>0]<<24|cr[n+6>>0]<<8|cr[n+7>>0],r=11,f=cr[n+9>>0]<<16|cr[n+8>>0]<<24|cr[n+10>>0]<<8;break}for(r=0|hu(32),ar[o>>2]=r,ar[o+8>>2]=-2147483616,n=30059,e=(f=r)+(ar[o+4>>2]=26)|0;tr[f>>0]=0|tr[n>>0],n=n+1|0,(0|(f=f+1|0))<(0|e););return(tr[r+26>>0]=0,oo(A,2,118,o),0<=(0|tr[o+11>>0]))?ur=i:(vu(0|ar[o>>2]),ur=i)}ar[e+4>>2]=cr[n+4>>0]<<8|cr[n+5>>0],r=7,f=cr[n+6>>0]<<8}while(0);ar[e+8>>2]=cr[n+r>>0]|f,t=0|ar[(e=56592)+4>>2],ar[(o=A)>>2]=ar[e>>2],ar[o+4>>2]=t,yu(A+8|0,56600),ur=i}(o,g,f),0|ar[o>>2])U=0|ar[(M=o)+4>>2],ar[(T=A)>>2]=ar[M>>2],ar[T+4>>2]=U,U=o+8|0,ar[(T=A+8|0)>>2]=ar[U>>2],ar[T+4>>2]=ar[U+4>>2],ar[T+8>>2]=ar[U+8>>2],ar[U>>2]=0,ar[U+4>>2]=0,ar[U+8>>2]=0;else{if(T=0|ar[(w=e+60|0)>>2],f=0|ar[T+76>>2],(U=0==(0|(T=0|ar[T+80>>2])))||bu(T),f){fo(c,f,r,1684630887),f=0|ar[(M=c+4|0)>>2],u=l=0|ar[c>>2],h=f,257<=(65535&(G=0|or[g>>1]))&&sr(31678,30203,133,31692),257<=(65535&(s=0|or[g+2>>1]))&&sr(31701,30203,139,31718),d=0|br(Y=65535&s,_=65535&G);A:do{if((f-l>>2|0)==(0|d)){e:do{if((0|u)!=(0|h)){d=0|ar[e+28>>2],k=e+32|0;r:do{if((0|d)==(0|k))s=0|ar[u>>2];else for(b=u;;){for(s=0|ar[b>>2],u=d;(0|ar[u+16>>2])!=(0|s);){if(f=0|ar[u+4>>2])for(;l=0|ar[f>>2];)f=l;else if(f=0|ar[(l=u+8|0)>>2],(0|ar[f>>2])!=(0|u))for(;N=0|ar[l>>2],f=0|ar[(l=N+8|0)>>2],(0|ar[f>>2])!=(0|N););if((0|f)==(0|k))break r;u=f}if((0|(b=b+4|0))==(0|h))break e}}while(0);l=Z+64|0,ar[(b=Z+8|0)>>2]=4524,u=Z+12|0,ar[Z>>2]=188,ar[l>>2]=208,Jf(Z+64|(ar[Z+4>>2]=0),u),ar[Z+136>>2]=0,ar[Z+140>>2]=-1,ar[Z>>2]=4504,ar[l>>2]=4544,ar[b>>2]=4524,Sf(u),ar[u>>2]=4340,ar[(b=Z+44|0)>>2]=0,ar[b+4>>2]=0,ar[b+8>>2]=0,ar[b+12>>2]=0,ar[Z+60>>2]=24,ar[J>>2]=0,ar[J+4>>2]=0,ar[J+8>>2]=0,Xe(u,J),(0|tr[J+11>>0])<0&&vu(0|ar[J>>2]),We(0|Lf(0|We(f=Z+8|0,31789,14),s),31804,23),Ie(v,u),oo(A,2,119,v),(0|tr[v+11>>0])<0&&vu(0|ar[v>>2]),ar[Z>>2]=4504,ar[l>>2]=4544,ar[f>>2]=4524,ar[u>>2]=4340,(0|tr[b+11>>0])<0&&vu(0|ar[b>>2]),kf(u),bf(l);break A}}while(0);f=0|ar[w>>2],ar[Z>>2]=ar[f+52>>2],N=Z+4|0,l=0|ar[f+56>>2],(ar[N>>2]=l)&&(bu(l),f=0|ar[w>>2]),l=0|ar[f+44>>2],(R=0==(0|(F=0|ar[f+48>>2])))||bu(F),Lt(t,l,r,Z,1885960297),V=0!=(0|(f=0|ar[t>>2]))&&0!=(0|(m=0|qu(f,128,352,0)))?(f=0|ar[4+t>>2])?(bu(f),d=m,f):(d=m,0):d=0,h=0|ar[g+4>>2],k=0|ar[g+8>>2],(0|ar[c>>2])==(0|ar[M>>2])&&sr(31828,30203,1359,31854),s=e+72|0;e:do{if(h>>>0<(0|ar[s>>2])>>>0&&k>>>0<(0|ar[e+76>>2])>>>0){u=0|hu(80),ar[u+4>>2]=0,ar[u+8>>2]=0,ar[u>>2]=6208,ar[(f=u+12|0)>>2]=0,ar[f+4>>2]=0,ar[f+8>>2]=0,ar[f+12>>2]=0,ar[f+16>>2]=0,ar[u+32>>2]=30025,ar[u+36>>2]=0,ar[u+40>>2]=0,ar[u+44>>2]=99,ar[u+48>>2]=99,s=u+52|0,ar[(b=u+72|0)>>2]=0,ar[u+76>>2]=0,ar[s>>2]=0,ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s+12>>2]=0,ar[u+68>>2]=b,b=f,C=(s=u)+16|0,bu(u),su(u),l=0|ar[C>>2],ar[f>>2]=b,ar[C>>2]=s,0|l&&ku(l),du(u),ar[i>>2]=b,l=0|ar[(C=i+4|0)>>2],ar[C>>2]=s,l?(du(l),f=0|ar[(b=i)>>2]):b=i,yo(f,h,k,1,3),u=0!=(0|d);do{if(u){if(f=0|ar[d+56>>2],1<=((0|ar[d+60>>2])-f|0)){l=0|cr[f>>0];break}for(ar[B>>2]=0,ar[B+4>>2]=0,f=(ar[B+8>>2]=0)|hu(48),ar[B>>2]=f,ar[B+8>>2]=-2147483600,u=31877,b=(l=f)+(ar[B+4>>2]=37)|0;tr[l>>0]=0|tr[u>>0],u=u+1|0,(0|(l=l+1|0))<(0|b););if(tr[f+37>>0]=0,oo(A,2,130,B),0<=(0|tr[B+11>>0]))break e;vu(0|ar[B>>2]);break e}l=8}while(0);Bo(0|ar[b>>2],3,h,k,l);do{if(u){if(f=I=0|ar[d+56>>2],3!=((0|ar[d+60>>2])-I|0))break;if((0|cr[f+1>>0])==(0|l)&&(0|cr[f+2>>0])==(0|l))break;for(ar[E>>2]=0,ar[E+4>>2]=0,f=(ar[E+8>>2]=0)|hu(64),ar[E>>2]=f,ar[E+8>>2]=-2147483584,u=31915,b=(l=f)+(ar[E+4>>2]=51)|0;tr[l>>0]=0|tr[u>>0],u=u+1|0,(0|(l=l+1|0))<(0|b););if(tr[f+51>>0]=0,oo(A,2,130,E),0<=(0|tr[E+11>>0]))break e;vu(0|ar[E>>2]);break e}}while(0);Bo(0|ar[b>>2],4,h,k,l),Bo(0|ar[b>>2],5,h,k,l),Z=e+32|0,p=4+n|0,B=(y=J+8|0)+11|0,E=A+8|0,X=Q+8|0,W=Q+4|0,I=Q+11|0;r:do{if(G<<16>>16){g=f=m=0;i:for(;;){for(v=w=r=0;!((0|Y)<=(0|r));){if(d=0|ar[(0|ar[c>>2])+(f<<2)>>2],!(u=0|ar[Z>>2]))break i;l=Z;f:for(;;){for(b=u;!((0|ar[b+16>>2])>>>0>=d>>>0);){if(!(u=0|ar[b+4>>2]))break f;b=u}if(!(u=0|ar[b>>2])){l=b;break}l=b}if((0|l)==(0|Z))break i;if(d>>>0<(0|ar[l+16>>2])>>>0)break i;u=0|ar[l+20>>2],(h=0==(0|(k=0|ar[l+24>>2])))||bu(k),s=0|ar[u+24>>2],b=0|ar[u+28>>2],ar[n>>2]=ar[i>>2],l=0|ar[C>>2],(ar[p>>2]=l)?(bu(l),Gl(J,e,d,n,v,g),du(l)):Gl(J,e,d,n,v,g);do{if(0|ar[J>>2])u=0|ar[(l=J)+4>>2],ar[(b=A)>>2]=ar[l>>2],ar[b+4>>2]=u,ar[E>>2]=ar[y>>2],ar[E+4>>2]=ar[y+4>>2],ar[E+8>>2]=ar[y+8>>2],ar[y>>2]=0,ar[y+4>>2]=0,ar[y+8>>2]=0,b=w,u=v,l=1;else{if(l=s+v|0,f=f+1|0,0<=(0|tr[B>>0])){u=l,l=0;break}vu(0|ar[y>>2]),u=l,l=0}}while(0);if(h||du(k),l)break e;r=r+1|0,w=b,v=u}if((0|_)<=(0|(m=m+1|0)))break r;g=w+g|0}for(ar[Q>>2]=0,ar[Q+4>>2]=0,f=(ar[Q+8>>2]=0)|hu(48),ar[Q>>2]=f,ar[X>>2]=-2147483600,u=31967,b=(l=f)+(ar[W>>2]=32)|0;tr[l>>0]=0|tr[u>>0],u=u+1|0,(0|(l=l+1|0))<(0|b););if(tr[f+32>>0]=0,oo(A,2,119,Q),0<=(0|tr[I>>0]))break e;vu(0|ar[Q>>2]);break e}}while(0);J=0|ar[(Q=56592)+4>>2],ar[A>>2]=ar[Q>>2],ar[A+4>>2]=J,yu(E,56600)}else D=51}while(0);51==(0|D)&&(l=p+64|0,ar[(b=p+8|0)>>2]=4524,u=p+12|0,ar[p>>2]=188,ar[l>>2]=208,Jf(p+64|(ar[p+4>>2]=0),u),ar[p+136>>2]=0,ar[p+140>>2]=-1,ar[p>>2]=4504,ar[l>>2]=4544,ar[b>>2]=4524,Sf(u),ar[u>>2]=4340,ar[(b=p+44|0)>>2]=0,ar[b+4>>2]=0,ar[b+8>>2]=0,ar[b+12>>2]=0,ar[p+60>>2]=24,ar[J>>2]=0,ar[J+4>>2]=0,ar[J+8>>2]=0,Xe(u,J),(0|tr[J+11>>0])<0&&vu(0|ar[J>>2]),J=0|We(0|Lf(0|We(0|Lf(0|We(f=p+8|0,30366,11),h),30170,1),k),30378,32),J=0|We(0|Lf(J,0|ar[s>>2]),30170,1),We(0|Lf(J,0|ar[e+76>>2]),30086,1),Ie(y,u),oo(A,6,1e3,y),(0|tr[y+11>>0])<0&&vu(0|ar[y>>2]),ar[p>>2]=4504,ar[l>>2]=4544,ar[f>>2]=4524,ar[u>>2]=4340,(0|tr[b+11>>0])<0&&vu(0|ar[b>>2]),kf(u),bf(l)),0|V&&du(V),0|(f=0|ar[4+t>>2])&&du(f),R||du(F),0|(f=0|ar[N>>2])&&du(f)}else l=Z+64|0,ar[(b=Z+8|0)>>2]=4524,u=Z+12|0,ar[Z>>2]=188,ar[l>>2]=208,Jf(Z+64|(ar[Z+4>>2]=0),u),ar[Z+136>>2]=0,ar[Z+140>>2]=-1,ar[Z>>2]=4504,ar[l>>2]=4544,ar[b>>2]=4524,Sf(u),ar[u>>2]=4340,ar[(b=Z+44|0)>>2]=0,ar[b+4>>2]=0,ar[b+8>>2]=0,ar[b+12>>2]=0,ar[Z+60>>2]=24,ar[J>>2]=0,ar[J+4>>2]=0,ar[J+8>>2]=0,Xe(u,J),(0|tr[J+11>>0])<0&&vu(0|ar[J>>2]),J=0|We(0|Pf(0|We(0|xf(0|We(0|xf(0|We(f=Z+8|0,31730,17),G),30170,1),s),31748,1),d),31750,17),We(0|Lf(J,(0|ar[M>>2])-(0|ar[c>>2])>>2),31768,20),Ie(k,u),oo(A,2,119,k),(0|tr[k+11>>0])<0&&vu(0|ar[k>>2]),ar[Z>>2]=4504,ar[l>>2]=4544,ar[f>>2]=4524,ar[u>>2]=4340,(0|tr[b+11>>0])<0&&vu(0|ar[b>>2]),kf(u),bf(l)}while(0);0|(c=0|ar[c>>2])&&((0|(f=0|ar[M>>2]))!=(0|c)&&(ar[M>>2]=f+(~((f+-4-c|0)>>>2)<<2)),vu(c))}else{for(ar[s>>2]=0,ar[s+4>>2]=0,c=(ar[s+8>>2]=0)|hu(64),ar[s>>2]=c,ar[s+8>>2]=-2147483584,u=31629,b=(l=c)+(ar[s+4>>2]=48)|0;tr[l>>0]=0|tr[u>>0],u=u+1|0,(0|(l=l+1|0))<(0|b););tr[c+48>>0]=0,oo(A,2,113,s),(0|tr[s+11>>0])<0&&vu(0|ar[s>>2])}U||du(T)}ur=(0<=(0|tr[(c=o+8|0)+11>>0])||vu(0|ar[c>>2]),a)}function Il(A,e,r,i){A|=0,r|=0,i|=0;var f,n,t,o,a=0,c=0,l=0,u=0;if(ur=(o=ur)+64|0,c=o+32|0,n=o+44|0,l=o+20|0,f=o,u=0|ar[(e|=0)+60>>2],a=0|ar[u+76>>2],(t=0==(0|(u=0|ar[u+80>>2])))||bu(u),a){if(fo(n,a,r,1684630887),c=4+n|0,a=0|ar[n>>2],4!=((0|ar[c>>2])-a|0)){for(ar[l>>2]=0,ar[l+4>>2]=0,a=(ar[l+8>>2]=0)|hu(48),ar[l>>2]=a,ar[l+8>>2]=-2147483600,e=31581,i=(r=a)+(ar[l+4>>2]=47)|0;tr[r>>0]=0|tr[e>>0],e=e+1|0,(0|(r=r+1|0))<(0|i););tr[a+47>>0]=0,oo(A,2,119,l),(0|tr[l+11>>0])<0&&vu(0|ar[l>>2])}else Xl(f,e,0|ar[a>>2],i,1,0),i=0|ar[(e=f)+4>>2],ar[(l=A)>>2]=ar[e>>2],ar[l+4>>2]=i,l=f+8|0,ar[(A=A+8|0)>>2]=ar[l>>2],ar[A+4>>2]=ar[l+4>>2],ar[A+8>>2]=ar[l+8>>2];0|(a=0|ar[n>>2])&&((0|(r=0|ar[c>>2]))!=(0|a)&&(ar[c>>2]=r+(~((r+-4-a|0)>>>2)<<2)),vu(a))}else{for(ar[c>>2]=0,ar[c+4>>2]=0,a=(ar[c+8>>2]=0)|hu(64),ar[c>>2]=a,ar[c+8>>2]=-2147483584,e=31532,i=(r=a)+(ar[c+4>>2]=48)|0;tr[r>>0]=0|tr[e>>0],e=e+1|0,(0|(r=r+1|0))<(0|i););tr[a+48>>0]=0,oo(A,2,113,c),(0|tr[c+11>>0])<0&&vu(0|ar[c>>2])}ur=(t||du(u),o)}function Cl(A,e,r,i,f){A|=0,r|=0,i|=0,f|=0;var n,t,o,a,c,l,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0;if(ur=(l=ur)+288|0,X=l+168|0,s=l+264|0,a=l+276|0,w=l+232|0,o=l+144|0,d=l+220|0,k=(W=l)+208|0,n=l+200|0,t=l+188|0,V=0|ar[(e|=0)+60>>2],u=0|ar[V+76>>2],(c=0==(0|(V=0|ar[V+80>>2])))||bu(V),u){fo(a,u,r,1684630887),ar[(I=w+20|0)>>2]=0,ar[(C=w+24|0)>>2]=0,function(A,e,r,i){A|=0,e|=0,r|=0,i|=0;var f,n,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0;for(ur=(n=ur)+208|0,u=n+192|0,t=(f=n)+32|0,b=n+48|0,s=n+20|0,o=0|hu(32),ar[t>>2]=o,ar[t+8>>2]=-2147483616,c=30088,l=(a=o)+(ar[t+4>>2]=29)|0;tr[a>>0]=0|tr[c>>0],c=c+1|0,(0|(a=a+1|0))<(0|l););tr[o+29>>0]=0,oo(f,2,118,t),(0|tr[t+11>>0])<0&&vu(0|ar[t>>2]),l=0|ar[i>>2],o=(0|ar[i+4>>2])-l|0;do{if(o>>>0<10)w=0|ar[(i=f)+4>>2],ar[(r=A)>>2]=ar[i>>2],ar[r+4>>2]=w,r=A+8|0,A=f+8|0,ar[r>>2]=ar[A>>2],ar[r+4>>2]=ar[A+4>>2],ar[r+8>>2]=ar[A+8>>2],ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0;else{if(w=0|tr[l>>0],tr[e>>0]=w,t=0|tr[l+1>>0],tr[e+1>>0]=t,w<<24>>24){o=b+64|0,ar[(c=b+8|0)>>2]=4524,a=b+12|0,ar[b>>2]=188,ar[o>>2]=208,Jf(b+64|(ar[b+4>>2]=0),a),ar[b+136>>2]=0,ar[b+140>>2]=-1,ar[b>>2]=4504,ar[o>>2]=4544,ar[c>>2]=4524,Sf(a),ar[a>>2]=4340,ar[(c=b+44|0)>>2]=0,ar[c+4>>2]=0,ar[c+8>>2]=0,ar[c+12>>2]=0,ar[b+60>>2]=24,ar[u>>2]=0,ar[u+4>>2]=0,ar[u+8>>2]=0,Xe(a,u),(0|tr[u+11>>0])<0&&vu(0|ar[u>>2]),r=0|We(t=b+8|0,30118,27),We(0|Pf(r,0|cr[e>>0]),30146,23),Ie(s,a),oo(A,4,3002,s),(0|tr[s+11>>0])<0&&vu(0|ar[s>>2]),ar[b>>2]=4504,ar[o>>2]=4544,ar[t>>2]=4524,ar[a>>2]=4340,(0|tr[c+11>>0])<0&&vu(0|ar[c>>2]),kf(a),bf(o);break}if(((10+((u=(b=t<<1&2)+2<<24>>24)<<1&255)&255)+(0|br(r<<1,w=255&u))|0)>>>0>o>>>0){w=0|ar[(i=f)+4>>2],ar[(r=A)>>2]=ar[i>>2],ar[r+4>>2]=w,r=A+8|0,A=f+8|0,ar[r>>2]=ar[A>>2],ar[r+4>>2]=ar[A+4>>2],ar[r+8>>2]=ar[A+8>>2],ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0;break}for(or[e+2>>1]=cr[l+3>>0]|cr[l+2>>0]<<8,or[e+4>>1]=cr[l+5>>0]|cr[l+4>>0]<<8,or[e+6>>1]=cr[l+7>>0]|cr[l+6>>0]<<8,or[e+8>>1]=cr[l+9>>0]|cr[l+8>>0]<<8,a=255&b,t=0,o=w,c=10;o=o+-1|0,t=cr[l+c>>0]|t<<8,o;)c=c+1|0;for(k=12|a,ar[e+12>>2]=t,o=k+a|0,c=0,t=w,a=k;t=t+-1|0,c=cr[l+a>>0]|c<<8,t;)a=a+1|0;if(l=o+2|0,ar[e+16>>2]=c,k=e+20|0,r>>>0<=(o=(c=0|ar[(t=e+24|0)>>2])-(a=0|ar[k>>2])>>3)>>>0?(r>>>0<o>>>0&&(0|c)!=(0|(d=a+(r<<3)|0))&&(ar[t>>2]=c+(~((c+-8-d|0)>>>3)<<3)),0|r&&(h=25)):(wl(k,r-o|0),h=25),25==(0|h))for(d=~(e=128<<(u<<3&255)-8),s=4+(b<<1&255)&255,b=0|ar[i>>2],u=0;;){for(a=0,t=w,o=l;t=t+-1|0,a=cr[b+o>>0]|a<<8,t;)o=o+1|0;for(c=0|ar[k>>2],ar[c+(u<<3)>>2]=(a&d)-(0==(a&e|0)?0:e),a=(o=w)+l|(t=0);o=o+-1|0,t=cr[b+a>>0]|t<<8,o;)a=a+1|0;if(ar[c+(u<<3)+4>>2]=(t&d)-(0==(t&e|0)?0:e),(0|(u=u+1|0))==(0|r))break;l=s+l|0}w=0|ar[(i=56592)+4>>2],ar[(r=A)>>2]=ar[i>>2],ar[r+4>>2]=w,yu(A+8|0,56600)}}while(0);ur=(0<=(0|tr[(t=f+8|0)+11>>0])||vu(0|ar[t>>2]),n)}(o,w,((ar[w+28>>2]=0)|ar[(G=4+a|0)>>2])-(0|ar[a>>2])>>2,f);A:do{if(0|ar[o>>2])W=0|ar[(e=o)+4>>2],ar[(F=A)>>2]=ar[e>>2],ar[F+4>>2]=W,F=8+o|0,ar[(A=A+8|0)>>2]=ar[F>>2],ar[A+4>>2]=ar[F+4>>2],ar[A+8>>2]=ar[F+8>>2],ar[F>>2]=0,ar[F+4>>2]=0,ar[F+8>>2]=0;else{if(y=w+20|0,((0|ar[G>>2])-(0|ar[a>>2])>>2|0)!=((0|ar[C>>2])-(0|ar[y>>2])>>3|0)){for(ar[d>>2]=0,ar[d+4>>2]=0,u=(ar[d+8>>2]=0)|hu(80),ar[d>>2]=u,ar[d+8>>2]=-2147483568,f=31462,b=(r=u)+(ar[d+4>>2]=69)|0;tr[r>>0]=0|tr[f>>0],f=f+1|0,(0|(r=r+1|0))<(0|b););if(tr[u+69>>0]=0,oo(A,2,121,d),0<=(0|tr[d+11>>0]))break;vu(0|ar[d>>2]);break}if(d=0|ar[w+12>>2],h=0|ar[w+16>>2],d>>>0<(0|ar[(s=e+72|0)>>2])>>>0&&h>>>0<(0|ar[e+76>>2])>>>0){if(f=0|hu(80),ar[f+4>>2]=0,ar[f+8>>2]=0,ar[f>>2]=6208,ar[(u=f+12|0)>>2]=0,ar[u+4>>2]=0,ar[u+8>>2]=0,ar[u+12>>2]=0,ar[u+16>>2]=0,ar[f+32>>2]=30025,ar[f+36>>2]=0,ar[f+40>>2]=0,ar[f+44>>2]=99,ar[f+48>>2]=99,s=f+52|0,ar[(b=f+72|0)>>2]=0,ar[f+76>>2]=0,ar[s>>2]=0,ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s+12>>2]=0,ar[f+68>>2]=b,b=u,p=(s=f)+16|0,bu(f),su(f),r=0|ar[p>>2],ar[u>>2]=b,ar[p>>2]=s,0|r&&ku(r),du(f),ar[i>>2]=b,r=0|ar[(p=i+4|0)>>2],ar[p>>2]=s,r?(du(r),u=0|ar[(p=i)>>2]):p=i,yo(u,d,h,1,3),Bo(0|ar[p>>2],3,d,h,8),Bo(0|ar[p>>2],4,d,h,8),Bo(0|ar[p>>2],5,d,h,8),ll(X,0|ar[p>>2],0|or[w+2>>1],0|or[w+4>>1],0|or[w+6>>1],0|or[w+8>>1]),u=0|ar[(Z=X)+4>>2],ar[(g=o)>>2]=ar[Z>>2],ar[g+4>>2]=u,u=X+8|0,(0|tr[(Z=(g=8+o|0)+11|0)>>0])<0?(tr[ar[g>>2]>>0]=0,ar[12+o>>2]=0):(tr[g>>0]=0,tr[Z>>0]=0),Cu(g,0),ar[g>>2]=ar[u>>2],ar[g+4>>2]=ar[u+4>>2],ar[g+8>>2]=ar[u+8>>2],0|ar[o>>2]){e=0|ar[(X=o)+4>>2],ar[(W=A)>>2]=ar[X>>2],ar[W+4>>2]=e,ar[(A=A+8|0)>>2]=ar[g>>2],ar[A+4>>2]=ar[g+4>>2],ar[A+8>>2]=ar[g+8>>2],ar[g>>2]=0,ar[g+4>>2]=0,ar[g+8>>2]=0;break}u=0|ar[a>>2];e:do{if((0|ar[G>>2])==(0|u))E=(B=A)+8|0;else{b=X+4|0,d=12+o|0,k=4+n|0,i=W+4|0,h=11+t|0,w=s=W+8|0,v=A+8|0,m=4+o|0,f=0;r:for(;;){ar[X>>2]=0,Xl(W,e,(ar[b>>2]=0)|ar[u+(f<<2)>>2],X,1,0),u=0|ar[(F=W)+4>>2],ar[(r=o)>>2]=ar[F>>2],ar[r+4>>2]=u,(0|tr[Z>>0])<0?(tr[ar[g>>2]>>0]=0,ar[d>>2]=0):(tr[g>>0]=0,tr[Z>>0]=0),Cu(g,0),ar[g>>2]=ar[s>>2],ar[g+4>>2]=ar[s+4>>2],ar[g+8>>2]=ar[s+8>>2];i:do{if((0|ar[o>>2])==(0|ar[14148])){ar[n>>2]=0,me(W,X,1,3,n,ar[k>>2]=0),u=0|ar[W>>2],F=0|ar[i>>2],ar[W>>2]=0,ar[i>>2]=0,ar[X>>2]=u,u=0|ar[b>>2],ar[b>>2]=F;do{if(0|u){if(du(u),!(u=0|ar[i>>2]))break;du(u)}}while(0);if(0|(u=0|ar[k>>2])&&du(u),!(0|ar[X>>2])){if(ar[t>>2]=0,ar[4+t>>2]=0,ar[8+t>>2]=0,oo(A,4,3003,t),0<=(0|tr[h>>0])){u=1;break}vu(0|ar[t>>2]),u=1;break}if(u=F=0|ar[y>>2],(0|ar[C>>2])-F>>3>>>0<=f>>>0)break r;ul(W,0|ar[p>>2],X,0|ar[u+(f<<3)>>2],0|ar[u+(f<<3)+4>>2]),r=0|ar[(u=W)+4>>2],ar[(F=o)>>2]=ar[u>>2],ar[F+4>>2]=r,(0|tr[Z>>0])<0?(tr[ar[g>>2]>>0]=0,ar[d>>2]=0):(tr[g>>0]=0,tr[Z>>0]=0),Cu(g,0),ar[g>>2]=ar[w>>2],ar[g+4>>2]=ar[w+4>>2],ar[g+8>>2]=ar[w+8>>2];f:do{switch(0|ar[o>>2]){case 0:u=0;break i;case 2:if(122!=(0|ar[m>>2]))break f;F=0|ar[(r=56592)+4>>2],ar[(u=o)>>2]=ar[r>>2],ar[u+4>>2]=F,Eu(g,56600),u=0;break i}}while(0);F=0|ar[(r=o)+4>>2],ar[(u=A)>>2]=ar[r>>2],ar[u+4>>2]=F,ar[v>>2]=ar[g>>2],ar[v+4>>2]=ar[g+4>>2],ar[v+8>>2]=ar[g+8>>2],ar[g>>2]=0,ar[g+4>>2]=0,ar[g+8>>2]=0,u=1}else F=0|ar[(r=o)+4>>2],ar[(u=A)>>2]=ar[r>>2],ar[u+4>>2]=F,ar[v>>2]=ar[g>>2],ar[v+4>>2]=ar[g+4>>2],ar[v+8>>2]=ar[g+8>>2],ar[g>>2]=0,ar[g+4>>2]=0,ar[g+8>>2]=0,u=1}while(0);if(0|(r=0|ar[b>>2])&&du(r),f=f+1|0,0|u)break A;if(u=0|ar[a>>2],f>>>0>=(0|ar[G>>2])-u>>2>>>0){B=A,E=v;break e}}sr(30172,30203,382,30219)}}while(0);A=0|ar[(W=o)+4>>2],ar[(F=B)>>2]=ar[W>>2],ar[F+4>>2]=A,ar[E>>2]=ar[g>>2],ar[E+4>>2]=ar[g+4>>2],ar[E+8>>2]=ar[g+8>>2],ar[g>>2]=0,ar[g+4>>2]=0,ar[g+8>>2]=0;break}r=W+64|0,ar[(b=W+8|0)>>2]=4524,f=W+12|0,ar[W>>2]=188,ar[r>>2]=208,Jf(W+64|(ar[W+4>>2]=0),f),ar[W+136>>2]=0,ar[W+140>>2]=-1,ar[W>>2]=4504,ar[r>>2]=4544,ar[b>>2]=4524,Sf(f),ar[f>>2]=4340,ar[(b=W+44|0)>>2]=0,ar[b+4>>2]=0,ar[b+8>>2]=0,ar[b+12>>2]=0,ar[W+60>>2]=24,ar[X>>2]=0,ar[X+4>>2]=0,ar[X+8>>2]=0,Xe(f,X),(0|tr[X+11>>0])<0&&vu(0|ar[X>>2]),F=0|We(0|Lf(0|We(0|Lf(0|We(u=W+8|0,30366,11),d),30170,1),h),30378,32),F=0|We(0|Lf(F,0|ar[s>>2]),30170,1),We(0|Lf(F,0|ar[e+76>>2]),30086,1),Ie(k,f),oo(A,6,1e3,k),(0|tr[k+11>>0])<0&&vu(0|ar[k>>2]),ar[W>>2]=4504,ar[r>>2]=4544,ar[u>>2]=4524,ar[f>>2]=4340,(0|tr[b+11>>0])<0&&vu(0|ar[b>>2]),kf(f),bf(r)}}while(0);(0|tr[(u=8+o|0)+11>>0])<0&&vu(0|ar[u>>2]),0|(u=0|ar[I>>2])&&((0|(r=0|ar[C>>2]))!=(0|u)&&(ar[C>>2]=r+(~((r+-8-u|0)>>>3)<<3)),vu(u)),0|(u=0|ar[a>>2])&&((0|(r=0|ar[G>>2]))!=(0|u)&&(ar[G>>2]=r+(~((r+-4-u|0)>>>2)<<2)),vu(u))}else{for(ar[s>>2]=0,ar[s+4>>2]=0,u=(ar[s+8>>2]=0)|hu(64),ar[s>>2]=u,ar[s+8>>2]=-2147483584,f=31413,b=(r=u)+(ar[s+4>>2]=48)|0;tr[r>>0]=0|tr[f>>0],f=f+1|0,(0|(r=r+1|0))<(0|b););tr[u+48>>0]=0,oo(A,2,113,s),(0|tr[s+11>>0])<0&&vu(0|ar[s>>2])}ur=(c||du(V),l)}function Gl(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o,a,c,l,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0;if(ur=(l=ur)+80|0,Z=(c=l)+52|0,k=l+36|0,t=l+48|0,o=l+32|0,h=l+20|0,ar[(g=l+64|0)>>2]=0,Xl(c,e,r,g,(ar[(a=g+4|0)>>2]=0)|ar[32+(0|ar[i>>2])>>2],0),(0|ar[c>>2])==(0|ar[14148])){e=0|ar[i>>2],s=0|ar[e+24>>2],d=0|ar[e+28>>2],r=0|ar[g>>2],u=0|ar[r+24>>2],r=0|ar[r+28>>2],(0|u)<=-1&&sr(32e3,30203,1540,32015),(0|r)<=-1&&sr(32043,30203,1541,32015),m=0|ar[e+36>>2],Io(Z,e),e=0|ar[g>>2];A:do{if((0|m)!=(0|ar[e+36>>2])){for(ar[k>>2]=0,ar[k+4>>2]=0,e=(ar[k+8>>2]=0)|hu(64),ar[k>>2]=e,ar[k+8>>2]=-2147483584,u=32059,b=(r=e)+(ar[k+4>>2]=58)|0;tr[r>>0]=0|tr[u>>0],u=u+1|0,(0|(r=r+1|0))<(0|b););tr[e+58>>0]=0,oo(A,2,127,k),(0|tr[k+11>>0])<0&&vu(0|ar[k>>2])}else{b=0|ar[Z>>2],m=Z+4|0;e:do{if((0|b)!=(0|m)){if(k=(0|(k=s-f|0))<(0|u)?k:u,w=0<(0|(v=(0|(v=d-n|0))<(0|r)?v:r)),!((0|f)<(0|s)&(0|n)<(0|d))){Fo(e,g=0|ar[b+16>>2],t),Fo(0|ar[i>>2],g,o),ar[h>>2]=0,ar[h+4>>2]=0,ar[h+8>>2]=0,oo(A,2,118,h),(0|tr[h+11>>0])<0&&vu(0|ar[h>>2]);break A}for(;;){if(u=0|Fo(e,s=0|ar[b+16>>2],t),e=0|Fo(0|ar[i>>2],s,o),s=0|br((255&(0|Go(0|ar[g>>2],3)))>>>3&255,k),r=0|Go(0|ar[g>>2],3),w)for(r=e+(0|br((255&r)>>>3&255,f))|0,e=0;hb(0|(h=r+(0|br(0|ar[o>>2],e+n|0))|0),u+(0|br(0|ar[t>>2],e))|0,0|s),(0|(e=e+1|0))<(0|v););if(e=0|ar[b+4>>2])for(;r=0|ar[e>>2];)e=r;else if(e=0|ar[(r=b+8|0)>>2],(0|ar[e>>2])!=(0|b))for(;h=0|ar[r>>2],e=0|ar[(r=h+8|0)>>2],(0|ar[e>>2])!=(0|h););if((0|e)==(0|m))break e;b=e,e=0|ar[g>>2]}}}while(0);n=0|ar[(f=56592)+4>>2],ar[(g=A)>>2]=ar[f>>2],ar[g+4>>2]=n,yu(A+8|0,56600)}}while(0);Co(Z,0|ar[Z+4>>2]),(0|tr[c+8+11>>0])<0&&vu(0|ar[c+8>>2])}else g=0|ar[(n=c)+4>>2],ar[(Z=A)>>2]=ar[n>>2],ar[Z+4>>2]=g,Z=c+8|0,ar[(A=A+8|0)>>2]=ar[Z>>2],ar[A+4>>2]=ar[Z+4>>2],ar[A+8>>2]=ar[Z+8>>2],ar[Z>>2]=0,ar[Z+4>>2]=0,ar[Z+8>>2]=0;ur=((e=0|ar[a>>2])&&du(e),l)}function Vl(A,e,r){A|=0,r|=0;var i,f,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0;if(ur=(f=ur)+80|0,i=f+76|0,b=f+72|0,d=(s=f)+64|0,YA(n=f+32|0,u=0|ar[(e|=0)>>2],(0|ar[(t=e+4|0)>>2])-u|0),(0|(u=0|QA(n,32)))<=(0|(n=((0|ar[n+24>>2])/-8|0)+((0|ar[n+4>>2])-(0|ar[n+8>>2]))|0)))return b=0|ar[(b=r=56592)>>2],r=0|ar[(r=r+4|0)>>2],ar[(s=d=A)>>2]=b,ar[(d=d+4|0)>>2]=r,yu(A=A+8|0,56600),void(ur=f);if(YA(s,(u=0|ar[e>>2])+n|0,(0|ar[t>>2])-(u+n)|0),QA(s,32),u=(0|QA(s,8))>>>1,function(A,e){e|=0;var r,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0;if((0|(i=0|ar[(r=(A|=0)+24|0)>>2]))<(0|e)){i=64-i|0,n=A+8|0;A:do{if(7<(0|i)){t=A+16|0,f=0|ar[n>>2];do{if(!f)break A;c=0|ar[A>>2],ar[A>>2]=c+1,c=0|cr[c>>0],f=f+-1|0,ar[n>>2]=f,c=0|db(0|c,0,0|(i=i+-8|0)),a=ar[(l=t)+4>>2]|D,ar[(o=t)>>2]=ar[l>>2]|c,ar[o+4>>2]=a}while(7<(0|i))}}while(0);i=64-i|0,ar[r>>2]=i}c=0|db(0|ar[(c=l=A+16|0)>>2],0|ar[c+4>>2],0|e),ar[l>>2]=c,ar[l+4>>2]=D,ar[r>>2]=i-e}(s,8),((255&u)-39|0)>>>0<2&&(u=0|QA(s,8),QA(s,8),177==(255&u|0))){for(u=0|hu(80),ar[u+4>>2]=0,ar[u+8>>2]=0,ar[u>>2]=6448,t=(n=e=u+16|0)+64|0;(0|(n=n+4|(ar[n>>2]=0)))<(0|t););ar[e>>2]=6476,l=e,tr[(c=u)+24>>0]=1,ar[(e=u+68|0)>>2]=0,ar[u+72>>2]=0,k=255&((ar[u+76>>2]=0)|QA(s,1)),tr[(n=u+25|0)>>0]=k,k=255&(0|QA(s,1)),tr[(t=u+26|0)>>0]=k,k=255&(0|QA(s,1)),tr[(o=u+27|0)>>0]=k,k=255&(0|QA(s,1)),tr[(a=u+28|0)>>0]=k,DA(s,i),ar[u+64>>2]=ar[i>>2],(0!=(0|tr[o>>0])||0|tr[a>>0])&&(DA(s,b),ar[e>>2]=ar[b>>2]),0|tr[n>>0]&&(h=+Fl(s),Q[u+32>>3]=h),0|tr[t>>0]&&(h=+Fl(s),Q[u+40>>3]=h),0|tr[o>>0]&&(h=+Fl(s),Q[u+48>>3]=h),0|tr[a>>0]&&(h=+Fl(s),Q[u+56>>3]=h),ar[d>>2]=l,ar[(t=d+4|0)>>2]=c,(0|(n=0|ar[(e=r+4|0)>>2]))==(0|ar[r+8>>2])?function(A,e){e|=0;var r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0;f=0|ar[(u=4+(A|=0)|0)>>2],n=0|ar[A>>2],536870911<(t=1+(r=f-(c=n)>>3)|0)>>>0&&zl();l=(0|ar[(i=A+8|0)>>2])-n|0,o=l>>2,o=l>>3>>>0<268435455?o>>>0<t>>>0?t:o:536870911;do{if(o){if(!(536870911<o>>>0)){a=0|hu(o<<3);break}Zu(u=0|X(8),44519),ar[u>>2]=17660,I(0|u,4016,428)}else a=0}while(0);l=a+(o<<3)|0,ar[(t=n=a+(r<<3)|0)>>2]=ar[e>>2],o=0|ar[e+4>>2],o=(ar[a+(r<<3)+4>>2]=o)?(bu(o),f=0|ar[u>>2],0|ar[A>>2]):c;if(a=n+8|0,(0|f)!=(0|o)){for(;f=(c=f)+-8|0,ar[n+-8>>2]=ar[f>>2],c=c+-4|0,ar[n+-4>>2]=ar[c>>2],ar[f>>2]=0,ar[c>>2]=0,t=n=t+-8|0,(0|f)!=(0|o););o=0|ar[A>>2],f=0|ar[u>>2]}if(ar[A>>2]=t,ar[u>>2]=a,ar[i>>2]=l,(0|f)!=(0|(t=o)))for(;n=0|ar[f+-4>>2],f=f+-8|0,0|n&&du(n),(0|f)!=(0|t););if(!o)return;vu(o)}(r,d):(ar[n>>2]=l,bu(ar[n+4>>2]=u),ar[e>>2]=8+(0|ar[e>>2])),0|(e=0|ar[t>>2])&&du(e)}s=0|ar[(s=d=56592)>>2],d=0|ar[(d=d+4|0)>>2],ar[(r=k=A)>>2]=s,ar[(k=k+4|0)>>2]=d,yu(k=A+8|0,56600),ur=f}function Fl(A){var e,r,i,f=0,n=0,t=0;return e=0|QA(A|=0,1),r=0|QA(A,7),i=0|QA(A,5),A=0|QA(A,f=1+i|0),0<(0|r)?(t=+Af(1,r-31|0),n=-(t*=(0|A)/Af(1,f)+1),+(n=(f=0==(0|e))?t:n)):(t=-(n=(0|A)*Af(1,-31-i|0)),+(t=(f=0==(0|e))?n:t))}function Rl(A){A|=0;var e=0,r=0,i=0,f=0,n=0,t=0;if(57284==(0|(r=0|ar[14320])))return(A=0)|A;n=e=0;do{if(t=0|ar[r+16>>2],e=(f=(0|n)<(0|(i=0|jb[127&ar[t+16>>2]](A))))?t:e,n=f?i:n,i=0|ar[r+4>>2])for(r=i;i=0|ar[r>>2];)r=i;else if(f=0|ar[(i=r+8|0)>>2],(0|ar[f>>2])==(0|r))r=f;else for(;t=0|ar[i>>2],r=0|ar[(i=t+8|0)>>2],(0|ar[r>>2])!=(0|t););}while(57284!=(0|r));return 0|e}function Nl(A,e){e|=0;var r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;o=0|ar[(b=(A|=0)+4|0)>>2],r=f=0|ar[A>>2],119304647<(n=(l=((t=o)-f|0)/36|0)+1|0)>>>0&&zl(),a=(u=((0|ar[(i=A+8|0)>>2])-f|0)/36|0)<<1,a=u>>>0<59652323?a>>>0<n>>>0?n:a:119304647;do{if(a){if(!(119304647<a>>>0)){c=0|hu(36*a|0);break}Zu(b=0|X(8),44519),ar[b>>2]=17660,I(0|b,4016,428)}else c=0}while(0);if(u=c+(36*a|0)|0,ar[(f=n=c+(36*l|0)|0)>>2]=ar[e>>2],ar[n+4>>2]=ar[e+4>>2],ar[n+8>>2]=ar[e+8>>2],ar[n+12>>2]=ar[e+12>>2],s=e+16|0,ar[c+(36*l|0)+16>>2]=ar[s>>2],a=e+20|0,ar[c+(36*l|0)+20>>2]=ar[a>>2],ar[s>>2]=0,a=c+(36*l|(ar[a>>2]=0))+24|0,l=e+24|0,ar[a>>2]=ar[l>>2],ar[a+4>>2]=ar[l+4>>2],ar[a+8>>2]=ar[l+8>>2],a=n+36|0,(0|t)!=(0|r)){for(;t=(l=t)+-36|0,ar[(e=n+-36|0)>>2]=ar[t>>2],ar[e+4>>2]=ar[t+4>>2],ar[e+8>>2]=ar[t+8>>2],ar[e+12>>2]=ar[t+12>>2],e=l+-20|0,ar[n+-20>>2]=ar[e>>2],s=l+-16|0,ar[n+-16>>2]=ar[s>>2],ar[e>>2]=0,l=l+-12|(ar[s>>2]=0),ar[(s=n+-12|0)>>2]=ar[l>>2],ar[s+4>>2]=ar[l+4>>2],ar[s+8>>2]=ar[l+8>>2],f=n=f+-36|0,(0|t)!=(0|r););o=0|ar[A>>2]}if(ar[A>>2]=f,f=0|ar[b>>2],ar[b>>2]=a,ar[i>>2]=u,(0|f)!=(0|(t=o)))for(;n=0|ar[f+-16>>2],f=f+-36|0,0|n&&du(n),(0|f)!=(0|t););o&&vu(o)}function _l(A,e,r,i,f,n,t,o,a,c){e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0;var l,u,b;if(u=ur=(b=ur)+31&-32,ur=ur+16|0,l=12+u|0,A|=0){if(r=0|un(r,60968),e){for(fs[63&ar[44+(0|ar[r>>2])>>2]](l,r),A=0|ar[l>>2],tr[i>>0]=A,tr[i+1>>0]=A>>8,tr[i+2>>0]=A>>16,tr[i+3>>0]=A>>24,fs[63&ar[32+(0|ar[r>>2])>>2]](u,r),(0|tr[(A=a+8+3|0)>>0])<0?(i=0|ar[a>>2],ar[l>>2]=0,ln(i,l),ar[a+4>>2]=0):(ar[l>>2]=0,ln(a,l),tr[A>>0]=0),Mu(a,0),ar[a>>2]=ar[u>>2],ar[a+4>>2]=ar[4+u>>2],ar[a+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)A=A+1|(ar[u+(A<<2)>>2]=0);Qu(u)}else{for(fs[63&ar[40+(0|ar[r>>2])>>2]](l,r),A=0|ar[l>>2],tr[i>>0]=A,tr[i+1>>0]=A>>8,tr[i+2>>0]=A>>16,tr[i+3>>0]=A>>24,fs[63&ar[28+(0|ar[r>>2])>>2]](u,r),(0|tr[(A=a+8+3|0)>>0])<0?(i=0|ar[a>>2],ar[l>>2]=0,ln(i,l),ar[a+4>>2]=0):(ar[l>>2]=0,ln(a,l),tr[A>>0]=0),Mu(a,0),ar[a>>2]=ar[u>>2],ar[a+4>>2]=ar[4+u>>2],ar[a+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)A=A+1|(ar[u+(A<<2)>>2]=0);Qu(u)}for(A=0|jb[127&ar[12+(0|ar[r>>2])>>2]](r),ar[f>>2]=A,A=0|jb[127&ar[16+(0|ar[r>>2])>>2]](r),ar[n>>2]=A,fs[63&ar[20+(0|ar[r>>2])>>2]](u,r),A=((0|tr[(A=t+11|0)>>0])<0?(A=0|ar[t>>2],tr[l>>0]=0,Qf(A,l),ar[t+4>>2]=0):(tr[l>>0]=0,Qf(t,l),tr[A>>0]=0),t),Cu(t,0),ar[A>>2]=ar[u>>2],ar[A+4>>2]=ar[4+u>>2],ar[A+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)A=A+1|(ar[u+(A<<2)>>2]=0);for(Bu(u),fs[63&ar[24+(0|ar[r>>2])>>2]](u,r),(0|tr[(A=o+8+3|0)>>0])<0?(t=0|ar[o>>2],ar[l>>2]=0,ln(t,l),ar[o+4>>2]=0):(ar[l>>2]=0,ln(o,l),tr[A>>0]=0),Mu(o,0),ar[o>>2]=ar[u>>2],ar[o+4>>2]=ar[4+u>>2],ar[o+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)A=A+1|(ar[u+(A<<2)>>2]=0);Qu(u),A=0|jb[127&ar[36+(0|ar[r>>2])>>2]](r)}else{if(r=0|un(r,60960),e){for(fs[63&ar[44+(0|ar[r>>2])>>2]](l,r),A=0|ar[l>>2],tr[i>>0]=A,tr[i+1>>0]=A>>8,tr[i+2>>0]=A>>16,tr[i+3>>0]=A>>24,fs[63&ar[32+(0|ar[r>>2])>>2]](u,r),(0|tr[(A=a+8+3|0)>>0])<0?(i=0|ar[a>>2],ar[l>>2]=0,ln(i,l),ar[a+4>>2]=0):(ar[l>>2]=0,ln(a,l),tr[A>>0]=0),Mu(a,0),ar[a>>2]=ar[u>>2],ar[a+4>>2]=ar[4+u>>2],ar[a+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)A=A+1|(ar[u+(A<<2)>>2]=0);Qu(u)}else{for(fs[63&ar[40+(0|ar[r>>2])>>2]](l,r),A=0|ar[l>>2],tr[i>>0]=A,tr[i+1>>0]=A>>8,tr[i+2>>0]=A>>16,tr[i+3>>0]=A>>24,fs[63&ar[28+(0|ar[r>>2])>>2]](u,r),(0|tr[(A=a+8+3|0)>>0])<0?(i=0|ar[a>>2],ar[l>>2]=0,ln(i,l),ar[a+4>>2]=0):(ar[l>>2]=0,ln(a,l),tr[A>>0]=0),Mu(a,0),ar[a>>2]=ar[u>>2],ar[a+4>>2]=ar[4+u>>2],ar[a+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)A=A+1|(ar[u+(A<<2)>>2]=0);Qu(u)}for(A=0|jb[127&ar[12+(0|ar[r>>2])>>2]](r),ar[f>>2]=A,A=0|jb[127&ar[16+(0|ar[r>>2])>>2]](r),ar[n>>2]=A,fs[63&ar[20+(0|ar[r>>2])>>2]](u,r),A=((0|tr[(A=t+11|0)>>0])<0?(A=0|ar[t>>2],tr[l>>0]=0,Qf(A,l),ar[t+4>>2]=0):(tr[l>>0]=0,Qf(t,l),tr[A>>0]=0),t),Cu(t,0),ar[A>>2]=ar[u>>2],ar[A+4>>2]=ar[4+u>>2],ar[A+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)A=A+1|(ar[u+(A<<2)>>2]=0);for(Bu(u),fs[63&ar[24+(0|ar[r>>2])>>2]](u,r),(0|tr[(A=o+8+3|0)>>0])<0?(t=0|ar[o>>2],ar[l>>2]=0,ln(t,l),ar[o+4>>2]=0):(ar[l>>2]=0,ln(o,l),tr[A>>0]=0),Mu(o,0),ar[o>>2]=ar[u>>2],ar[o+4>>2]=ar[4+u>>2],ar[o+8>>2]=ar[8+u>>2],A=0;3!=(0|A);)A=A+1|(ar[u+(A<<2)>>2]=0);Qu(u),A=0|jb[127&ar[36+(0|ar[r>>2])>>2]](r)}ar[c>>2]=A,ur=b}function Yl(A,e,r,i,f,n,t,o,a,c,l,u,b,s,d){A|=0,e|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0,l|=0,u|=0,b|=0,s|=0,d|=0;var k,h,w,v,m,g,Z,p,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0,R=0;for(ar[(r|=0)>>2]=A,k=s+8+3|0,p=s+4|0,h=b+8+3|0,w=b+4|0,v=0==(512&i|0),m=0<(0|d),g=u+11|0,Z=u+4|0,F=0;4!=(0|F);){A:do{switch(0|tr[a+F>>0]){case 0:ar[e>>2]=ar[r>>2];break;case 1:ar[e>>2]=ar[r>>2],G=0|Hb[31&ar[44+(0|ar[t>>2])>>2]](t,32),V=0|ar[r>>2],ar[r>>2]=V+4,ar[V>>2]=G;break;case 3:0|((y=(V=0|tr[k>>0])<<24>>24<0)?0|ar[p>>2]:255&V)&&(G=0|ar[(y?0|ar[s>>2]:s)>>2],V=0|ar[r>>2],ar[r>>2]=V+4,ar[V>>2]=G);break;case 2:if(!(v|0==(0|(W=(y=(W=0|tr[h>>0])<<24>>24<0)?0|ar[w>>2]:255&W)))){for(B=(X=y?0|ar[b>>2]:b)+(W<<2)|0,y=E=0|ar[r>>2];(0|X)!=(0|B);)ar[y>>2]=ar[X>>2],y=y+4|0,X=X+4|0;ar[r>>2]=E+(W<<2)}break;case 4:for(B=0|ar[r>>2],y=f=o?f+4|0:f;!(n>>>0<=y>>>0)&&0|xb[63&ar[12+(0|ar[t>>2])>>2]](t,2048,0|ar[y>>2]);)y=y+4|0;if(m){for(X=d;f>>>0<y>>>0&(E=0<(0|X));)C=0|ar[(V=y+-4|0)>>2],G=0|ar[r>>2],ar[r>>2]=G+4,ar[G>>2]=C,X=X+-1|0,y=V;for(I=E?0|Hb[31&ar[44+(0|ar[t>>2])>>2]](t,48):0,W=0|ar[r>>2];E=W+4|0,!((0|X)<=0);)ar[W>>2]=I,X=X+-1|0,W=E;ar[r>>2]=E,ar[W>>2]=c}if((0|y)==(0|f))G=0|Hb[31&ar[44+(0|ar[t>>2])>>2]](t,48),y=(V=0|ar[r>>2])+4|0,ar[r>>2]=y,ar[V>>2]=G;else{for(G=(V=0|tr[g>>0])<<24>>24<0,V&=255,I=E=(W=0|(G?0|ar[Z>>2]:V)?0|tr[(G?0|ar[u>>2]:u)>>0]:-1,0);(0|y)!=(0|f);)X=0|ar[r>>2],(0|I)==(0|W)&&(C=X+4|0,ar[r>>2]=C,ar[X>>2]=l,X=(I=(W=(E=E+1|0)>>>0<(G?0|ar[Z>>2]:V)>>>0?(W=0|tr[(G?0|ar[u>>2]:u)+E>>0])<<24>>24==127?-1:W<<24>>24:I,0),C)),R=0|ar[(C=y+-4|0)>>2],ar[r>>2]=X+4,ar[X>>2]=R,I=I+1|0,y=C;y=0|ar[r>>2]}if((0|B)!=(0|y))for(;;){if((y=y+-4|0)>>>0<=B>>>0)break A;R=0|ar[B>>2],ar[B>>2]=ar[y>>2],ar[y>>2]=R,B=B+4|0}}}while(0);F=F+1|0}if(1<(f=(y=(f=0|tr[k>>0])<<24>>24<0)?0|ar[p>>2]:255&f)>>>0){for(X=(y=y?0|ar[s>>2]:s)+4|0,E=(y=y+(f<<2)|0)-X|0,f=B=0|ar[r>>2];(0|X)!=(0|y);)ar[f>>2]=ar[X>>2],f=f+4|0,X=X+4|0;ar[r>>2]=B+(E>>>2<<2)}switch((176&i)<<24>>24){case 32:ar[e>>2]=ar[r>>2];break;case 16:break;default:ar[e>>2]=A}}function Ql(A){var e;ar[(A|=0)>>2]=16988,(0|(0|ar[(e=A+8|0)>>2]))!=(0|dn())&&of(0|ar[e>>2]),an()}function Dl(A){var e,r,i=0,f=0;for(ar[(A|=0)>>2]=17036,e=A+8|0,r=A+12|0,f=0;i=0|ar[e>>2],!(f>>>0>=(0|ar[r>>2])-i>>2>>>0);)0|(i=0|ar[i+(f<<2)>>2])&&lu(i),f=f+1|0;Bu(A+144|0),function(A){var e,r=0,i=0,f=0;e=0|ar[(A|=0)>>2];do{if(0|e){for(i=0|ar[(r=A+4|0)>>2];(0|i)!=(0|e);)f=i+-4|0,ar[r>>2]=f,i=f;if((A+16|0)==(0|e)){tr[A+128>>0]=0;break}vu(e);break}}while(0)}(e),an()}function Jl(A){var e;ar[(A|=0)>>2]=17056,0|(e=0|ar[A+8>>2])&&0|tr[A+12>>0]&&mu(e),an()}function Ml(){return 0|ar[3118]}function Tl(){return 0|ar[2733]}function Ul(){return 0|ar[2732]}function Sl(A){ar[(A|=0)>>2]=17108,Bu(A+12|0),an()}function Ol(A){ar[(A|=0)>>2]=17148,Bu(A+16|0),an()}function zl(){lA()}function jl(A,e){e|=0;var r,i,f,n,t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p,y,B,E,X,W,I,C,G,V,F,R,N,_,Y,Q,D,J,M,T,U,S,O,z,j,H,x,P,L,K,q,$,AA,eA,rA,iA,fA,nA,tA,oA,aA,cA,lA=0,uA=0,bA=0,sA=0;for(r=ur=(i=ur)+31&-32,ur=ur+16|0,ar[(A|=0)+4>>2]=e+-1,ar[A>>2]=17036,f=lA=A+8|0,n=28,n|=0,ar[(f|=0)>>2]=0,ar[f+4>>2]=0,ar[f+8>>2]=0,(tr[f+128>>0]=0)|n&&(function(A,e){var r=0;(0|Ll(A|=0))>>>0<(e|=0)>>>0&&zl();r=e>>>0<29&0==(0|tr[(r=A+128|0)>>0])?(tr[r>>0]=1,A+16|0):0|hu(e<<2);ar[A+4>>2]=r,ar[A>>2]=r,ar[A+8>>2]=r+(e<<2)}(f,n),Pl(f,n)),ar[(e=A+144|0)>>2]=0,ar[e+4>>2]=0,4294967279<(uA=(ar[e+8>>2]=0)|Yf(53684))>>>0&&pu(),uA>>>0<11?tr[e+11>>0]=uA:(bA=0|hu(sA=uA+16&-16),ar[e>>2]=bA,ar[A+152>>2]=-2147483648|sA,ar[A+148>>2]=uA,e=bA),wf(e,53684,uA),Qf(e+uA|(tr[r>>0]=0),r),e=0|ar[lA>>2],uA=0|ar[(lA=A+12|0)>>2];(0|uA)!=(0|e);)sA=uA+-4|0,uA=ar[lA>>2]=sA;ar[14199]=0,ar[14198]=14700,t=A,o=56792,Hl(t|=0,o|=0,0|hn(59216)),ar[14201]=0,ar[14200]=14732,a=A,c=56800,Hl(a|=0,c|=0,0|hn(59224)),function(A,e,r,i){e|=0,r|=0,i|=0,ar[4+(A|=0)>>2]=i+-1,ar[A>>2]=17056,ar[(i=A+8|0)>>2]=e,tr[A+12>>0]=1&r,e||(r=0|Ul(),ar[i>>2]=r)}(56808,0,0,1),l=A,u=56808,Hl(l|=0,u|=0,0|hn(59232)),ar[14207]=0,ar[14206]=17252,b=A,s=56824,Hl(b|=0,s|=0,0|hn(59264)),ar[14209]=0,ar[14208]=17320,d=A,k=56832,Hl(d|=0,k|=0,0|hn(61024)),function(A,e){e|=0,ar[4+(A|=0)>>2]=e+-1,ar[A>>2]=16988,e=0|dn(),ar[A+8>>2]=e}(56840,1),h=A,w=56840,Hl(h|=0,w|=0,0|hn(61032)),ar[14215]=0,ar[14214]=17368,v=A,m=56856,Hl(v|=0,m|=0,0|hn(61040)),ar[14217]=0,ar[14216]=17416,g=A,Z=56864,Hl(g|=0,Z|=0,0|hn(61048)),function(A,e){for(e|=0,ar[4+(A|=0)>>2]=e+-1,ar[A>>2]=17108,tr[A+8>>0]=46,tr[A+9>>0]=44,ar[(e=A+12|0)>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,A=0;3!=(0|A);)ar[e+(A<<2)>>2]=0,A=A+1|0}(56872,1),p=A,y=56872,Hl(p|=0,y|=0,0|hn(59248)),function(A,e){for(e|=0,ar[4+(A|=0)>>2]=e+-1,ar[A>>2]=17148,ar[A+8>>2]=46,ar[A+12>>2]=44,ar[(e=A+16|0)>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,A=0;3!=(0|A);)ar[e+(A<<2)>>2]=0,A=A+1|0}(56896,1),B=A,E=56896,Hl(B|=0,E|=0,0|hn(59272)),ar[14233]=0,ar[14232]=14764,X=A,W=56928,Hl(X|=0,W|=0,0|hn(59256)),ar[14235]=0,ar[14234]=14828,I=A,C=56936,Hl(I|=0,C|=0,0|hn(59280)),ar[14237]=0,ar[14236]=14892,G=A,V=56944,Hl(G|=0,V|=0,0|hn(59288)),ar[14239]=0,ar[14238]=14944,F=A,R=56952,Hl(F|=0,R|=0,0|hn(59296)),ar[14241]=0,ar[14240]=16492,N=A,_=56960,Hl(N|=0,_|=0,0|hn(60944)),ar[14243]=0,ar[14242]=16548,Y=A,Q=56968,Hl(Y|=0,Q|=0,0|hn(60952)),ar[14245]=0,ar[14244]=16604,D=A,J=56976,Hl(D|=0,J|=0,0|hn(60960)),ar[14247]=0,ar[14246]=16660,M=A,T=56984,Hl(M|=0,T|=0,0|hn(60968)),ar[14249]=0,ar[14248]=16716,U=A,S=56992,Hl(U|=0,S|=0,0|hn(60976)),ar[14251]=0,ar[14250]=16744,O=A,z=57e3,Hl(O|=0,z|=0,0|hn(60984)),ar[14253]=0,ar[14252]=16772,j=A,H=57008,Hl(j|=0,H|=0,0|hn(60992)),ar[14255]=0,ar[14254]=16800,x=A,P=57016,Hl(x|=0,P|=0,0|hn(61e3)),ar[14257]=0,ar[14256]=17232,function(A){ar[(A|=0)>>2]=17464}(57032),ar[14256]=14996,ar[14258]=15044,L=A,K=57024,Hl(L|=0,K|=0,0|hn(60108)),ar[14261]=0,ar[14260]=17232,function(A){ar[(A|=0)>>2]=17500}(57048),ar[14260]=15080,ar[14262]=15128,q=A,$=57040,Hl(q|=0,$|=0,0|hn(60920)),ar[14265]=0,ar[14264]=17232,AA=0|dn(),ar[14266]=AA,ar[14264]=16444,eA=A,rA=57056,Hl(eA|=0,rA|=0,0|hn(60928)),ar[14269]=0,ar[14268]=17232,iA=0|dn(),ar[14270]=iA,ar[14268]=16468,fA=A,nA=57072,Hl(fA|=0,nA|=0,0|hn(60936)),ar[14273]=0,ar[14272]=16828,tA=A,oA=57088,Hl(tA|=0,oA|=0,0|hn(61008)),ar[14275]=0,ar[14274]=16860,aA=A,cA=57096,Hl(aA|=0,cA|=0,0|hn(61016)),ur=i}function Hl(A,e,r){A|=0,r|=0;var i,f=0;au(e|=0),f=0|ar[(i=A+8|0)>>2],(0|ar[A+12>>2])-f>>2>>>0>r>>>0?A=i:(function(A,e){e|=0;var r,i,f=0,n=0;f=0|ar[(i=4+(A|=0)|0)>>2],n=0|ar[A>>2],r=f-n>>2;A:do{if(e>>>0<=r>>>0){if(e>>>0<r>>>0)for(A=n+(e<<2)|0;;){if((0|f)==(0|A))break A;n=f+-4|0,ar[i>>2]=n,f=n}}else xl(A,e-r|0)}while(0)}(i,r+1|0),f=0|ar[(A=i)>>2]),0|(f=0|ar[f+(r<<2)>>2])&&lu(f),ar[(0|ar[A>>2])+(r<<2)>>2]=e}function xl(A,e){e|=0;var r,i,f,n=0,t=0,o=0,a=0,c=0;r=ur=(f=ur)+31&-32,ur=ur+32|0,o=(A|=0)+8|0,n=0|ar[(i=A+4|0)>>2];do{if((0|ar[o>>2])-n>>2>>>0<e>>>0){if(n=(n-(0|ar[A>>2])>>2)+e|0,!((t=0|Ll())>>>0<n>>>0)){a=0|ar[A>>2],o=(c=(0|ar[o>>2])-a|0)>>1,Kl(r,c>>2>>>0<t>>>1>>>0?o>>>0<n>>>0?n:o:t,(0|ar[i>>2])-a>>2,A+16|0),ql(r,e),$l(A,r),Au(r);break}zl()}else Pl(A,e)}while(0);ur=f}function Pl(A,e){var r;for(r=(A|=0)+4|0,A=e|=0,e=0|ar[r>>2];e=4+((ar[e>>2]=0)|ar[r>>2])|0,ar[r>>2]=e,0!=(0|(A=A+-1|0)););}function Ll(){return 1073741823}function Kl(A,e,r,i){e|=0,r|=0,i|=0;var f=0;ar[(A|=0)+12>>2]=0,ar[A+16>>2]=i;do{if(e){if(e>>>0<29&0==(0|tr[(f=i+112|0)>>0])){tr[f>>0]=1;break}i=0|hu(e<<2);break}i=0}while(0);r=(ar[A>>2]=i)+(r<<2)|0,ar[A+8>>2]=r,ar[A+4>>2]=r,ar[A+12>>2]=i+(e<<2)}function ql(A,e){var r;for(r=(A|=0)+8|0,A=e|=0,e=0|ar[r>>2];e=4+((ar[e>>2]=0)|ar[r>>2])|0,ar[r>>2]=e,0!=(0|(A=A+-1|0)););}function $l(A,e){e|=0;var r=0,i=0,f=0,n=0,t=0;i=0|ar[(A|=0)>>2],n=e+4|0,f=(0|ar[(t=A+4|0)>>2])-i|0,r=(0|ar[n>>2])+(0-(f>>2)<<2)|0,ar[n>>2]=r,0<(0|f)?(hb(0|r,0|i,0|f),r=0|ar[(i=n)>>2]):i=n,n=0|ar[A>>2],ar[A>>2]=r,ar[i>>2]=n,n=e+8|0,f=0|ar[t>>2],ar[t>>2]=ar[n>>2],ar[n>>2]=f,t=e+12|0,A=0|ar[(n=A+8|0)>>2],ar[n>>2]=ar[t>>2],ar[t>>2]=A,ar[e>>2]=ar[i>>2]}function Au(A){var e=0,r=0,i=0,f=0;for(e=0|ar[(A|=0)+4>>2],i=0|ar[(r=A+8|0)>>2];(0|i)!=(0|e);)f=i+-4|0,i=ar[r>>2]=f;r=0|ar[A>>2];do{if(0|r){if((0|(e=0|ar[A+16>>2]))==(0|r)){tr[e+112>>0]=0;break}vu(r);break}}while(0)}function eu(){return 0==(0|tr[57104])&&0|ib(57104)&&(jl(57112,1),ar[15264]=57112,ar[15265]=61056),0|ar[15265]}function ru(A,e){A|=0,e=0|ar[(e|=0)>>2],au(ar[A>>2]=e)}function iu(){return 0==(0|tr[57272])&&0|ib(57272)&&(ru(61064,0|eu()),ar[15267]=61064),0|ar[15267]}function fu(A){A|=0;var e=0;e=0|iu(),e=0|ar[e>>2],au(ar[A>>2]=e)}function nu(A,e,r){return A|=0,e|=0,0|(A=(r|=0)?0|function(A,e,r){A|=0,e|=0,r|=0;var i=0,f=0;A:do{if(r){for(;(i=0|tr[A>>0])<<24>>24==(f=0|tr[e>>0])<<24>>24;){if(!(r=r+-1|0)){A=0;break A}A=A+1|0,e=e+1|0}A=(255&i)-(255&f)|0}else A=0}while(0);return 0|A}(A,e,r):0)}function tu(){0}function ou(A){0}function au(A){cu((A|=0)+4|0)}function cu(A){ar[(A|=0)>>2]=1+(0|ar[A>>2])}function lu(A){return 0|(A=-1==(0|uu((A|=0)+4|0))?(is[511&ar[8+(0|ar[A>>2])>>2]](A),1):0)}function uu(A){var e;return e=0|ar[(A|=0)>>2],ar[A>>2]=e-1,e-1|0}function bu(A){au(A|=0)}function su(A){cu((A|=0)+8|0)}function du(A){0|lu(A|=0)&&ku(A)}function ku(A){var e;0!=(0|ar[(e=(A|=0)+8|0)>>2])&&-1!=(0|uu(e))||is[511&ar[16+(0|ar[A>>2])>>2]](A)}function hu(A){var e;for(e=0==(0|(A|=0))?1:A;!(0|(A=0|yc(e)));){if(!(A=0|fb())){A=0;break}rs[7&A]()}return 0|A}function wu(A){return 0|hu(A|=0)}function vu(A){Bc(A|=0)}function mu(A){vu(A|=0)}function gu(){lA()}function Zu(A,e){e|=0,ar[(A|=0)>>2]=17640,function(A,e){A|=0;var r,i,f=0;f=0|hu(13+(r=0|Vc(e|=0))|0),ar[f>>2]=r,ar[f+4>>2]=r,hb((ar[f+8>>2]=0)|(f=0|(i=f,12+(i|=0)|0)),0|e,1+r|0),ar[A>>2]=f}(A+4|0,e)}function pu(){lA()}function yu(A,e){e|=0;var r,i,f=0,n=0,t=0;r=ur=(i=ur)+31&-32,ur=ur+16|0,ar[(A|=0)>>2]=0,ar[A+4>>2]=0,((ar[A+8>>2]=0)|tr[e+11>>0])<0?(f=0|ar[e>>2],4294967279<(e=0|ar[e+4>>2])>>>0&&pu(),e>>>0<11?tr[A+11>>0]=e:(n=0|hu(t=e+16&-16),ar[A>>2]=n,ar[A+8>>2]=-2147483648|t,ar[A+4>>2]=e,A=n),wf(A,f,e),Qf(A+e|(tr[r>>0]=0),r)):(ar[A>>2]=ar[e>>2],ar[A+4>>2]=ar[e+4>>2],ar[A+8>>2]=ar[e+8>>2]),ur=i}function Bu(A){(0|tr[(A|=0)+11>>0])<0&&vu(0|ar[A>>2])}function Eu(A,e){var r=0,i=0;return(0|(A|=0))!=(0|(e|=0))&&Xu(A,(i=(r=0|tr[e+11>>0])<<24>>24<0)?0|ar[e>>2]:e,i?0|ar[e+4>>2]:255&r),0|A}function Xu(A,e,r){e|=0,r|=0;var i,f,n,t,o=0,a=0;f=ur=(t=ur)+31&-32,ur=ur+16|0,a=(i=(o=0|tr[(n=(A|=0)+11|0)>>0])<<24>>24<0)?(2147483647&ar[A+8>>2])-1|0:10;do{if(r>>>0<=a>>>0){if(Wu(o=i?0|ar[A>>2]:A,e,r),Qf(o+r|(tr[f>>0]=0),f),(0|tr[n>>0])<0){ar[A+4>>2]=r;break}tr[n>>0]=r;break}i?o=0|ar[A+4>>2]:o&=255,Iu(A,a,r-a|0,o,0,o,r,e)}while(0);return ur=t,0|A}function Wu(A,e,r){return A|=0,e|=0,0|(r|=0)&&wb(0|A,0|e,0|r),0|A}function Iu(A,e,r,i,f,n,t,o){A|=0,i|=0,f|=0,n|=0,t|=0,o|=0;var a,c,l=0,u=0,b=0;a=ur=(c=ur)+31&-32,ur=ur+16|0,(-18-(e|=0)|0)>>>0<(r|=0)>>>0&&pu(),b=(0|tr[A+11>>0])<0?0|ar[A>>2]:A,u=0|hu(l=e>>>0<2147483623?(l=(l=r+e|0)>>>0<(u=e<<1)>>>0?u:l)>>>0<11?11:l+16&-16:-17),0|f&&wf(u,b,f),0|t&&wf(u+f|0,o,t),0|(i=(r=i-n|0)-f|0)&&wf(u+f+t|0,b+f+n|0,i),10!=(0|e)&&vu(b),ar[A>>2]=u,ar[A+8>>2]=-2147483648|l,t=r+t|0,Qf(u+(ar[A+4>>2]=t)|(tr[a>>0]=0),a),ur=c}function Cu(A,e){A|=0;var r,i=0,f=0,n=0,t=0,o=0;4294967279<(e|=0)>>>0&&pu(),i=(n=(f=0|tr[(r=A+11|0)>>0])<<24>>24<0)?(o=0|ar[A+4>>2],(2147483647&ar[A+8>>2])-1|0):(o=255&f,10),t=(e=(t=e>>>0<o>>>0?o:e)>>>0<11)?10:(t+16&-16)-1|0;do{if((0|t)!=(0|i)){do{if(!e){if(e=0|hu(t+1|0),n){n=1,i=0|ar[A>>2],f=13;break}wf(e,A,1+(255&f)|0),f=14;break}e=0|ar[A>>2],f=n?(n=0,i=e,e=A,13):(wf(A,e,1+(255&f)|0),vu(e),15)}while(0);if(13==(0|f)&&(wf(e,i,1+(0|ar[A+4>>2])|0),vu(i),f=n?14:15),14==(0|f)){ar[A+8>>2]=t+1|-2147483648,ar[A+4>>2]=o,ar[A>>2]=e;break}if(15==(0|f)){tr[r>>0]=o;break}}}while(0)}function Gu(A,e){return 0|Xu(A|=0,e|=0,0|Yf(e))}function Vu(A,e,r){e|=0,r|=0;var i,f,n,t=0,o=0;i=ur=(n=ur)+31&-32,ur=ur+16|0,(o=(t=0|tr[(f=(A|=0)+11|0)>>0])<<24>>24<0)?t=0|ar[A+4>>2]:t&=255;do{if(e>>>0<=t>>>0){if(o){o=(0|ar[A>>2])+e|0,tr[i>>0]=0,Qf(o,i),ar[A+4>>2]=e;break}Qf(A+e|(tr[i>>0]=0),i),tr[f>>0]=e;break}Fu(A,e-t|0,r)}while(0);ur=n}function Fu(A,e,r){A|=0,r|=0;var i,f,n=0,t=0,o=0,a=0,c=0;return i=ur=(f=ur)+31&-32,ur=ur+16|0,0|(e|=0)&&(t=(n=0|tr[(c=A+11|0)>>0])<<24>>24<0?(o=0|ar[A+4>>2],(2147483647&ar[A+8>>2])-1|0):(o=255&n,10),a=o+e|0,(t-o|0)>>>0<e>>>0&&(Ru(A,t,a-t|0,o,o,0,0),n=0|tr[c>>0]),oi((n=n<<24>>24<0?0|ar[A>>2]:A)+o|0,e,r),(0|tr[c>>0])<0?ar[A+4>>2]=a:tr[c>>0]=a,Qf(n+a|(tr[i>>0]=0),i)),ur=f,0|A}function Ru(A,e,r,i,f,n,t){A|=0,i|=0,f|=0,n|=0,t|=0;var o=0,a=0,c=0;(-17-(e|=0)|0)>>>0<(r|=0)>>>0&&pu(),c=(0|tr[A+11>>0])<0?0|ar[A>>2]:A,a=0|hu(o=e>>>0<2147483623?(o=(o=r+e|0)>>>0<(a=e<<1)>>>0?a:o)>>>0<11?11:o+16&-16:-17),0|f&&wf(a,c,f),0|(r=i-n-f|0)&&wf(a+f+t|0,c+f+n|0,r),10!=(0|e)&&vu(c),ar[A>>2]=a,ar[A+8>>2]=-2147483648|o}function Nu(A,e,r){e|=0,r|=0;var i,f,n,t,o,a=0,c=0;return n=ur=(o=ur)+31&-32,ur=ur+16|0,a=(f=(a=0|tr[(t=(A|=0)+11|0)>>0])<<24>>24<0)?(c=0|ar[A+4>>2],(2147483647&ar[A+8>>2])-1|0):(c=255&a,10),i=c+r|0,r>>>0<=(a-c|0)>>>0?0|r&&(wf((a=f?0|ar[A>>2]:A)+c|0,e,r),(0|tr[t>>0])<0?ar[A+4>>2]=i:tr[t>>0]=i,Qf(a+i|(tr[n>>0]=0),n)):Iu(A,a,i-a|0,c,c,0,r,e),ur=o,0|A}function _u(A,e){A|=0,e|=0;var r,i,f=0,n=0,t=0,o=0;o=ur=(i=ur)+31&-32,ur=ur+16|0,o=(r=o)+1|0,tr[r>>0]=e,e=(f=(e=0|tr[(n=A+11|0)>>0])<<24>>24<0)?(t=0|ar[A+4>>2],(2147483647&ar[A+8>>2])-1|0):(t=255&e,10),7==(0|(f=(0|t)==(0|e)?(Ru(A,e,1,e,e,0,0),e=e+1|0,(0|tr[n>>0])<0?8:7):(e=t+1|0,f?8:7)))?(tr[n>>0]=e,e=A):8==(0|f)&&(n=0|ar[A>>2],ar[A+4>>2]=e,e=n),Qf(A=e+t|0,r),Qf(A+1|(tr[o>>0]=0),o),ur=i}function Yu(A,e,r,i,f){e|=0,r|=0,i|=0,f|=0;var n,t=0;return(n=(t=0|tr[(A|=0)+11>>0])<<24>>24<0)?t=0|ar[A+4>>2]:t&=255,-1==(0|f)|t>>>0<e>>>0&&lA(),r=(t=t-e|0)>>>0<r>>>0?t:r,n&&(A=0|ar[A>>2]),(A=0|nu(A+e|0,i,(t=f>>>0<r>>>0)?f:r))?0|A:0|(r>>>0<f>>>0?-1:1&t)}function Qu(A){(0|tr[(A|=0)+8+3>>0])<0&&vu(0|ar[A>>2])}function Du(A,e,r){return A|=0,e|=0,(r|=0)&&function(A,e,r){var i=0;if((r|=0)>>>0<=(A|=0)-(e|=0)>>2>>>0){if(0|r)for(i=A;r=r+-1|0,ar[i>>2]=ar[e>>2],r;)e=e+4|0,i=i+4|0}else for(;ar[A+((r=r+-1|0)<<2)>>2]=ar[e+(r<<2)>>2],0!=(0|r););}(A,e,r),0|A}function Ju(A,e,r,i,f,n,t,o){A|=0,i|=0,f|=0,n|=0,t|=0,o|=0;var a,c,l,u=0,b=0,s=0;c=ur=(l=ur)+31&-32,ur=ur+16|0,(1073741806-(e|=0)|0)>>>0<(r|=0)>>>0&&pu(),s=(0|tr[3+(a=A+8|0)>>0])<0?0|ar[A>>2]:A,e>>>0<536870887?1073741823<(r=(r=(r=r+e|0)>>>0<(u=e<<1)>>>0?u:r)>>>0<2?2:r+4&-4)>>>0?lA():b=r:b=1073741807,u=0|hu(b<<2),0|f&&Zf(u,s,f),0|t&&Zf(u+(f<<2)|0,o,t),0|(i=(r=i-n|0)-f|0)&&Zf(u+(f<<2)+(t<<2)|0,s+(f<<2)+(n<<2)|0,i),1!=(0|e)&&vu(s),ar[A>>2]=u,ar[a>>2]=-2147483648|b,t=r+t|0,ln(u+((ar[A+4>>2]=t)<<2)|(ar[c>>2]=0),c),ur=l}function Mu(A,e){A|=0;var r,i,f=0,n=0,t=0,o=0,a=0;1073741807<(e|=0)>>>0&&pu(),f=(t=(n=0|tr[(r=3+(i=A+8|0)|0)>>0])<<24>>24<0)?(a=0|ar[A+4>>2],(2147483647&ar[i>>2])-1|0):(a=255&n,1),o=(e=(o=e>>>0<a>>>0?a:e)>>>0<2)?1:(o+4&-4)-1|0;do{if((0|o)!=(0|f)){do{if(!e){if(1073741823<(e=o+1|0)>>>0&&lA(),e=0|hu(e<<2),t){t=1,f=0|ar[A>>2],n=15;break}Zf(e,A,1+(255&n)|0),n=16;break}e=0|ar[A>>2],n=t?(t=0,f=e,e=A,15):(Zf(A,e,1+(255&n)|0),vu(e),17)}while(0);if(15==(0|n)&&(Zf(e,f,1+(0|ar[A+4>>2])|0),vu(f),n=t?16:17),16==(0|n)){ar[i>>2]=o+1|-2147483648,ar[A+4>>2]=a,ar[A>>2]=e;break}if(17==(0|n)){tr[r>>0]=a;break}}}while(0)}function Tu(A,e){return 0|function(A,e,r){e|=0,r|=0;var i,f,n,t,o,a=0,c=0;n=ur=(o=ur)+31&-32,ur=ur+16|0,c=(f=(i=0|tr[(t=(a=(A|=0)+8|0)+3|0)>>0])<<24>>24<0)?(2147483647&ar[a>>2])-1|0:1;do{if(r>>>0<=c>>>0){if(Du(a=f?0|ar[A>>2]:A,e,r),ln(a+(r<<2)|(ar[n>>2]=0),n),(0|tr[t>>0])<0){ar[A+4>>2]=r;break}tr[t>>0]=r;break}Ju(A,c,r-c|0,a=f?0|ar[A+4>>2]:255&i,0,a,r,e)}while(0);return ur=o,0|A}(A|=0,e|=0,0|Mr(e))}function Uu(A,e,r,i,f,n,t){A|=0,i|=0,f|=0,n|=0,t|=0;var o,a=0,c=0,l=0;(1073741807-(e|=0)|0)>>>0<(r|=0)>>>0&&pu(),l=(0|tr[3+(o=A+8|0)>>0])<0?0|ar[A>>2]:A,e>>>0<536870887?1073741823<(r=(r=(r=r+e|0)>>>0<(a=e<<1)>>>0?a:r)>>>0<2?2:r+4&-4)>>>0?lA():c=r:c=1073741807,a=0|hu(c<<2),0|f&&Zf(a,l,f),0|(r=i-n-f|0)&&Zf(a+(f<<2)+(t<<2)|0,l+(f<<2)+(n<<2)|0,r),1!=(0|e)&&vu(l),ar[A>>2]=a,ar[o>>2]=-2147483648|c}function Su(A,e,r){e|=0,r|=0;var i,f,n,t,o=0,a=0,c=0;return f=ur=(t=ur)+31&-32,ur=ur+16|0,o=(i=(o=0|tr[(n=(a=(A|=0)+8|0)+3|0)>>0])<<24>>24<0)?(c=0|ar[A+4>>2],(2147483647&ar[a>>2])-1|0):(c=255&o,1),a=c+r|0,r>>>0<=(o-c|0)>>>0?0|r&&(Zf((o=i?0|ar[A>>2]:A)+(c<<2)|0,e,r),(0|tr[n>>0])<0?ar[A+4>>2]=a:tr[n>>0]=a,ln(o+(a<<2)|(ar[f>>2]=0),f)):Ju(A,o,a-o|0,c,c,0,r,e),ur=t,0|A}function Ou(A,e){A|=0,e|=0;var r,i,f,n=0,t=0,o=0,a=0;a=ur=(f=ur)+31&-32,ur=ur+16|0,a=(i=a)+4|0,ar[i>>2]=e,e=(r=(e=0|tr[(t=(n=A+8|0)+3|0)>>0])<<24>>24<0)?(o=0|ar[A+4>>2],(2147483647&ar[n>>2])-1|0):(o=255&e,1),7==(0|(n=(0|o)==(0|e)?(Uu(A,e,1,e,e,0,0),e=e+1|0,(0|tr[t>>0])<0?8:7):(e=o+1|0,r?8:7)))?(tr[t>>0]=e,e=A):8==(0|n)&&(t=0|ar[A>>2],ar[A+4>>2]=e,e=t),ln(A=e+(o<<2)|0,i),ln(A+4|(ar[a>>2]=0),a),ur=f}function zu(){var A,e=0;return e=ur=(A=ur)+31&-32,ur=ur+16|0,0|yA(61148,5)?(ju(56158,e),0):(e=0|wA(0|ar[15288]),ur=A,0|e)}function ju(A,e){A|=0,e|=0;var r;r=ur=ur+31&-32,ur=ur+16|0,ar[r>>2]=e,Qc(e=0|ar[2669],A,r),function(A,e){var r,i=0,f=0,n=0,t=0,o=0,a=0;i=r=255&(A|=0),0<=(0|ar[(e|=0)+76>>2])&&0!=(0|Jc())?((0|i)!=(0|tr[e+75>>0])&&(o=0|ar[(t=e+20|0)>>2])>>>0<(0|ar[e+16>>2])>>>0?(ar[t>>2]=o+1,tr[o>>0]=r):i=0|Si(e,A),Mc()):a=3;do{if(3==(0|a)){if((0|i)!=(0|tr[e+75>>0])&&(n=0|ar[(f=e+20|0)>>2])>>>0<(0|ar[e+16>>2])>>>0){ar[f>>2]=n+1,tr[n>>0]=r;break}i=0|Si(e,A)}}while(0)}(10,e),lA()}function Hu(A){0}function xu(A,e){return(0|(A|=0))==(0|(e|=0))|0}function Pu(A,e,r,i){A|=0,r|=0,i|=0;var f,n,t;f=0|ar[(A=(e|=0)+16|0)>>2],n=e+36|0,t=e+24|0;do{if(f){if((0|f)!=(0|r)){ar[n>>2]=1+(0|ar[n>>2]),ar[t>>2]=2,tr[e+54>>0]=1;break}2==(0|ar[t>>2])&&(ar[t>>2]=i)}else ar[A>>2]=r,ar[t>>2]=i,ar[n>>2]=1}while(0)}function Lu(A,e,r,i){r|=0,i|=0;var f=0;(0|ar[(e|=0)+4>>2])==(0|r)&&1!=(0|ar[(f=e+28|0)>>2])&&(ar[f>>2]=i)}function Ku(A,e,r,i,f){A|=0,r|=0,i|=0,f|=0;var n=0,t=0,o=0,a=0;tr[(e|=0)+53>>0]=1;do{if((0|ar[e+4>>2])==(0|i)){if(tr[e+52>>0]=1,o=e+54|0,a=e+48|0,t=e+24|0,A=e+36|0,!(n=0|ar[(i=e+16|0)>>2])){if(ar[i>>2]=r,ar[t>>2]=f,!((ar[A>>2]=1)==(0|ar[a>>2])&1==(0|f)))break;tr[o>>0]=1;break}if((0|n)!=(0|r)){ar[A>>2]=1+(0|ar[A>>2]),tr[o>>0]=1;break}2==(0|(A=0|ar[t>>2]))&&(A=ar[t>>2]=f),1==(0|ar[a>>2])&1==(0|A)&&(tr[o>>0]=1)}}while(0)}function qu(A,e,r,i){e|=0,r|=0,i|=0;var f,n,t,o,a,c,l,u=0,b=0;for(a=ur=(l=ur)+31&-32,ur=ur+64|0,b=0|ar[(A|=0)>>2],c=A+(0|ar[b+-8>>2])|0,b=0|ar[b+-4>>2],ar[a>>2]=r,ar[4+a>>2]=A,ar[8+a>>2]=e,ar[12+a>>2]=i,e=20+a|0,i=24+a|0,f=28+a|0,n=32+a|0,t=40+a|0,o=(u=A=16+a|0)+36|0;(0|(u=u+4|(ar[u>>2]=0)))<(0|o););or[A+36>>1]=0,tr[A+38>>0]=0;A:do{if(0|xu(b,r))ar[48+a>>2]=1,as[15&ar[20+(0|ar[b>>2])>>2]](b,a,c,c,1,0),A=1==(0|ar[i>>2])?c:0;else{switch(os[63&ar[24+(0|ar[b>>2])>>2]](b,a,c,1,0),0|ar[36+a>>2]){case 0:A=1==(0|ar[t>>2])&1==(0|ar[f>>2])&1==(0|ar[n>>2])?0|ar[e>>2]:0;break A;case 1:break;default:A=0;break A}if(1!=(0|ar[i>>2])&&!(0==(0|ar[t>>2])&1==(0|ar[f>>2])&1==(0|ar[n>>2]))){A=0;break}A=0|ar[A>>2]}}while(0);return ur=l,0|A}function $u(A){var e,r,i;ar[(A|=0)>>2]=17640,e=A+4|0,(i=r=0)|(e|=0,1)&&(r=0|function(A){return(A|=0)+-12|0}(0|ar[e>>2]),e=0|ar[(i=r+8|0)>>2],ar[i>>2]=e+-1,(e+-1|0)<0)&&vu(r)}function Ab(A,e,r,i){e|=0,r|=0,i|=0;var f,n=0;n=(f=0|ar[(A|=0)+4>>2])>>8,1&f&&(n=0|ar[(0|ar[r>>2])+n>>2]),A=0|ar[A>>2],ts[31&ar[28+(0|ar[A>>2])>>2]](A,e,r+n|0,2&f|0?i:2)}function eb(A,e,r,i,f,n){e|=0,r|=0,i|=0,f|=0,n|=0;var t,o=0;o=(t=0|ar[(A|=0)+4>>2])>>8,1&t&&(o=0|ar[(0|ar[i>>2])+o>>2]),A=0|ar[A>>2],as[15&ar[20+(0|ar[A>>2])>>2]](A,e,r,i+o|0,2&t|0?f:2,n)}function rb(A,e,r,i,f){e|=0,r|=0,i|=0,f|=0;var n,t=0;t=(n=0|ar[(A|=0)+4>>2])>>8,1&n&&(t=0|ar[(0|ar[r>>2])+t>>2]),A=0|ar[A>>2],os[63&ar[24+(0|ar[A>>2])>>2]](A,e,r+t|0,2&n|0?i:2,f)}function ib(A){return 0|(A=1==(0|tr[(A|=0)>>0])?0:tr[A>>0]=1)}function fb(){var A;return A=0|ar[15289],0|(ar[15289]=A)}function nb(A,e,r,i){e|=0,i|=0;var f,n,t,o,a,c,l,u;return r=0|(t=f=A|=0,o=n=r|=0,t=((a=(u=0)|br(u=65535&(o|=0),l=65535&(t|=0)))>>>16)+(0|br(u,c=t>>>16))|0,o=0|br(u=o>>>16,l),0|(D=(t>>>16)+(0|br(u,c))+(((65535&t)+o|0)>>>16)|0,t+o<<16|65535&a|0)),A=D,0|(D=(0|br(e,n))+(0|br(i,f))+A|0&A,0|r)}function tb(A,e,r,i){return 0|(D=(e|=0)+(i|=0)+((r=(A|=0)+(r|=0)>>>0)>>>0<A>>>0|0)>>>0,0|r)}function ob(A,e,r,i){return 0|(D=i=(e|=0)-(i|=0)-((A|=0)>>>0<(r|=0)>>>0|0)>>>0,A-r>>>0|0)}function ab(A){var e=0;return(0|(e=0|tr[s+(255&(A|=0))>>0]))<8?0|e:(0|(e=0|tr[s+(A>>8&255)>>0]))<8?e+8|0:(0|(e=0|tr[s+(A>>16&255)>>0]))<8?e+16|0:24+(0|tr[s+(A>>>24)>>0])|0}function cb(A,e,r,i,f){f|=0;var n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0;if(l=A|=0,t=r|=0,o=b=i|=0,!(c=a=e|=0))return n=0!=(0|f),o?(n&&(ar[f>>2]=0|A,ar[f+4>>2]=0&e),(f=b=0)|(D=b,f)):(n&&(ar[f>>2]=(l>>>0)%(t>>>0),ar[f+4>>2]=0),(b=0)|(D=b,f=(l>>>0)/(t>>>0)>>>0));n=0==(0|o);do{if(t){if(!n){if((n=(0|g(0|o))-(0|g(0|c))|0)>>>0<=31){A=l>>>((t=u=n+1|0)>>>0)&(e=n-31>>31)|c<<(o=31-n|0),e&=c>>>(u>>>0),n=0,o=l<<o;break}return f?(ar[f>>2]=0|A,ar[f+4>>2]=a|0&e,(f=b=0)|(D=b,f)):(f=b=0)|(D=b,f)}if((n=t-1|0)&t|0){A=(u=32-(o=33+(0|g(0|t))-(0|g(0|c))|0)|0)-1>>31&c>>>((s=o-32|0)>>>0)|(c<<u|l>>>((t=o)>>>0))&(e=s>>31),e&=c>>>(o>>>0),n=l<<(d=64-o|0)&(a=u>>31),o=(c<<d|l>>>(s>>>0))&a|l<<u&o-33>>31;break}return 0|f&&(ar[f>>2]=n&l,ar[f+4>>2]=0),1==(0|t)?0|(D=s=a|0&e,d=0|A):(d=0|ab(0|t),0|(D=s=c>>>(d>>>0)|0,d=c<<32-d|l>>>(d>>>0)|0))}if(n)return 0|f&&(ar[f>>2]=(c>>>0)%(t>>>0),ar[f+4>>2]=0),(s=0)|(D=s,d=(c>>>0)/(t>>>0)>>>0);if(!l)return 0|f&&(ar[f>>2]=0,ar[f+4>>2]=(c>>>0)%(o>>>0)),(s=0)|(D=s,d=(c>>>0)/(o>>>0)>>>0);if(!((n=o-1|0)&o))return 0|f&&(ar[f>>2]=0|A,ar[f+4>>2]=n&c|0&e),d=c>>>(((s=0)|ab(0|o))>>>0),0|(D=s,d);if((n=(0|g(0|o))-(0|g(0|c))|0)>>>0<=30){A=c<<(o=31-n|0)|l>>>((t=e=n+1|0)>>>0),e=c>>>(e>>>0),n=0,o=l<<o;break}return f&&(ar[f>>2]=0|A,ar[f+4>>2]=a|0&e),(d=s=0)|(D=s,d)}while(0);if(t){for(c=0|tb(0|(u=0|r),0|(l=b|0&i),-1,-1),r=D,a=o,o=0;a=n>>>31|(i=a)<<1,n=o|n<<1,ob(0|c,0|r,0|(i=A<<1|i>>>31|0),0|(b=A>>>31|e<<1|0)),o=1&(s=(d=D)>>31|((0|d)<0?-1:0)<<1),A=0|ob(0|i,0|b,s&u|0,(((0|d)<0?-1:0)>>31|((0|d)<0?-1:0)<<1)&l|0),e=D,0!=(0|(t=t-1|0)););c=a,a=0}else c=o,o=a=0;return(t=0)|f&&(ar[f>>2]=A,ar[f+4>>2]=e),0|(D=s=(0|n)>>>31|(c|t)<<1|0&(t<<1|n>>>31)|a,d=-2&(n<<1|0)|o)}function lb(A,e,r,i){return 0|cb(A|=0,e|=0,r|=0,i|=0,0)}function ub(A,e,r,i){var f,n;return ur=(n=ur)+16|0,cb(A|=0,e|=0,r|=0,i|=0,f=0|n),ur=n,0|(D=0|ar[4+f>>2],0|ar[f>>2])}function bb(A,e,r){return A|=0,e|=0,(0|(r|=0))<32?(D=e>>r,A>>>r|(e&(1<<r)-1)<<32-r):(D=(0|e)<0?-1:0,e>>r-32|0)}function sb(A,e,r){return A|=0,e|=0,(0|(r|=0))<32?(D=e>>>r,A>>>r|(e&(1<<r)-1)<<32-r):e>>>r-32|(D=0)}function db(A,e,r){return A|=0,e|=0,(0|(r|=0))<32?(D=e<<r|(A&(1<<r)-1<<32-r)>>>32-r,A<<r):(D=A<<r-32,0)}function kb(A){return(255&(A|=0))<<24|(A>>8&255)<<16|(A>>16&255)<<8|A>>>24|0}function hb(A,e,r){A|=0,e|=0;var i,f,n=0;if(8192<=(0|(r|=0)))return 0|uA(0|A,0|e,0|r);if(f=0|A,i=A+r|0,(3&A)==(3&e)){for(;3&A;){if(!r)return 0|f;tr[A>>0]=0|tr[e>>0],A=A+1|0,e=e+1|0,r=r-1|0}for(n=(r=-4&i|0)-64|0;(0|A)<=(0|n);)ar[A>>2]=ar[e>>2],ar[A+4>>2]=ar[e+4>>2],ar[A+8>>2]=ar[e+8>>2],ar[A+12>>2]=ar[e+12>>2],ar[A+16>>2]=ar[e+16>>2],ar[A+20>>2]=ar[e+20>>2],ar[A+24>>2]=ar[e+24>>2],ar[A+28>>2]=ar[e+28>>2],ar[A+32>>2]=ar[e+32>>2],ar[A+36>>2]=ar[e+36>>2],ar[A+40>>2]=ar[e+40>>2],ar[A+44>>2]=ar[e+44>>2],ar[A+48>>2]=ar[e+48>>2],ar[A+52>>2]=ar[e+52>>2],ar[A+56>>2]=ar[e+56>>2],ar[A+60>>2]=ar[e+60>>2],A=A+64|0,e=e+64|0;for(;(0|A)<(0|r);)ar[A>>2]=ar[e>>2],A=A+4|0,e=e+4|0}else for(r=i-4|0;(0|A)<(0|r);)tr[A>>0]=0|tr[e>>0],tr[A+1>>0]=0|tr[e+1>>0],tr[A+2>>0]=0|tr[e+2>>0],tr[A+3>>0]=0|tr[e+3>>0],A=A+4|0,e=e+4|0;for(;(0|A)<(0|i);)tr[A>>0]=0|tr[e>>0],A=A+1|0,e=e+1|0;return 0|f}function wb(A,e,r){var i=0;if((0|(e|=0))<(0|(A|=0))&(0|A)<(e+(r|=0)|0)){for(e=e+r|0,A=(i=A)+r|0;0<(0|r);)e=e-1|0,r=r-1|0,tr[(A=A-1|0)>>0]=0|tr[e>>0];A=i}else hb(A,e,r);return 0|A}function vb(A,e,r){e|=0;var i,f=0,n=0,t=0;if(i=(A|=0)+(r|=0)|0,e&=255,67<=(0|r)){for(;3&A;)tr[A>>0]=e,A=A+1|0;for(n=(f=-4&i|0)-64|0,t=e|e<<8|e<<16|e<<24;(0|A)<=(0|n);)ar[A>>2]=t,ar[A+4>>2]=t,ar[A+8>>2]=t,ar[A+12>>2]=t,ar[A+16>>2]=t,ar[A+20>>2]=t,ar[A+24>>2]=t,ar[A+28>>2]=t,ar[A+32>>2]=t,ar[A+36>>2]=t,ar[A+40>>2]=t,ar[A+44>>2]=t,ar[A+48>>2]=t,ar[A+52>>2]=t,ar[A+56>>2]=t,ar[A+60>>2]=t,A=A+64|0;for(;(0|A)<(0|f);)ar[A>>2]=t,A=A+4|0}for(;(0|A)<(0|i);)tr[A>>0]=e,A=A+1|0;return i-r|0}function mb(A){return 0}function gb(A){return 0}function Zb(A){return 0}function pb(A){return 0<=(A=+A)?+v(A+.5):+m(A-.5)}function yb(A){var e,r;return 0<(0|(r=(A|=0)+15&-16|0))&(0|(A=(e=0|ar[b>>2])+r|0))<(0|e)|(0|A)<0?(B(),F(12),-1):(0|(ar[b>>2]=A))>(0|y())&&0==(0|p())?(ar[b>>2]=e,F(12),-1):0|e}function Bb(){return Z(0),0}function Eb(A){return Z(1),0}function Xb(A,e){return Z(2),0}function Wb(A,e,r){return Z(3),0}function Ib(A,e,r,i,f){return Z(5),0}function Cb(A,e,r,i,f){return Z(6),0}function Gb(A,e,r,i,f,n){return Z(7),0}function Vb(A,e,r,i,f,n){return Z(8),0}function Fb(A,e,r,i,f,n,t){return Z(9),0}function Rb(A,e,r,i,f,n,t,o){return Z(10),0}function Nb(){Z(11)}function _b(A){Z(12)}function Yb(A,e){Z(13)}function Qb(A,e,r){Z(14)}function Db(A,e,r,i){Z(15)}function Jb(A,e,r,i,f){Z(16)}function Mb(A,e,r,i,f,n){Z(17)}function Tb(A,e,r,i,f,n,t){Z(18)}function Ub(A,e,r,i,f,n,t,o){Z(19)}function Sb(A,e,r,i,f,n,t,o,a){Z(20)}function Ob(A,e,r,i,f,n,t,o,a,c){Z(21)}var zb=[Bb,function(){var A,e,r=0,i=0,f=0;for(i=34509,f=(r=61161)+22|0;tr[r>>0]=0|tr[i>>0],i=i+1|0,(0|(r=r+1|0))<(0|f););if(80<=(10+(0|Vc(34542))|0)>>>0)return 61161;for(i=34531,f=(r=61161+(0|Vc(61161))|0)+11|0;tr[r>>0]=0|tr[i>>0],i=i+1|0,(0|(r=r+1|0))<(0|f););return A=61161,e=34542,e|=0,function(A,e){!function(A,e){A|=0;var r=0,i=0;r=e|=0;A:do{if(3&(r^A))i=8;else{if(3&r)do{if(r=0|tr[e>>0],!((tr[A>>0]=r)<<24>>24))break A;e=e+1|0,A=A+1|0}while(0!=(3&e|0));if(!((-2139062144&(r=0|ar[e>>2])^-2139062144)&r+-16843009))for(i=A;e=e+4|0,A=i+4|0,ar[i>>2]=r,!((-2139062144&(r=0|ar[e>>2])^-2139062144)&r+-16843009|0);)i=A;i=8}}while(0);if(8==(0|i)&&(i=0|tr[e>>0],(tr[A>>0]=i)<<24>>24))for(;A=A+1|0,i=0|tr[(e=e+1|0)>>0],(tr[A>>0]=i)<<24>>24!=0;);}(A|=0,e|=0)}((A|=0)+(0|Vc(A))|0,e),61161},function(){return 17432576},function(){var A,e,r,i,f,n;return A=0|hu(8),ar[A>>2]=0,r=(ar[(e=4+A|0)>>2]=0)|hu(92),ar[4+r>>2]=0,ar[8+r>>2]=0,ar[r>>2]=6336,f=i=12+r|0,ar[(f|=0)>>2]=0,ar[f+4>>2]=0,ar[f+8>>2]=0,ar[f+12>>2]=30025,ar[f+20>>2]=0,ar[f+24>>2]=0,ar[f+16>>2]=f+20,ar[f+32>>2]=0,ar[f+36>>2]=0,ar[f+28>>2]=f+32,ar[(n=f+40|0)>>2]=0,ar[4+n>>2]=0,ar[8+n>>2]=0,ar[12+n>>2]=0,ar[16+n>>2]=0,ar[20+n>>2]=0,ar[24+n>>2]=0,ar[f+68>>2]=4,ar[f+72>>2]=32768,ar[f+76>>2]=32768,function(A){A|=0;var e=0,r=0,i=0,f=0,n=0;if(n=0|hu(132),ar[n+4>>2]=0,ar[n+8>>2]=0,ar[n>>2]=6364,co(e=n+12|0),ar[(r=A+60|0)>>2]=e,i=0|ar[(f=A+64|0)>>2],ar[f>>2]=n,i&&(du(i),e=0|ar[r>>2]),function(A){var e,r,i,f,n,t,o,a,c,l,u,b,s,d,k,h,w,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0,R=0,N=0;if(ur=(w=ur)+64|0,f=w+48|0,t=w+40|0,o=w+32|0,a=w+24|0,l=w+16|0,b=w+8|0,h=(d=w)+56|0,v=(ar[(A|=0)>>2]=0)|ar[(N=A+4|0)>>2],(ar[N>>2]=0)|v&&du(v),g=0|ar[(k=A+8|0)>>2],(0|(v=0|ar[(N=A+12|0)>>2]))!=(0|g))for(;m=v+-8|0,ar[N>>2]=m,(0|(v=(v=0|ar[v+-4>>2])?(du(v),0|ar[N>>2]):m))!=(0|g););R=0|hu(96),ar[R+4>>2]=0,ar[R+8>>2]=0,ar[R>>2]=4600,Mt(F=R+16|0),ar[R+60>>2]=0,ar[R+64>>2]=0,ar[R+68>>2]=0,ar[F>>2]=4436,ar[(V=R+72|0)>>2]=0,ar[V+4>>2]=0,ar[V+8>>2]=0,ar[V+12>>2]=0,ar[V+16>>2]=0,ar[R+36>>2]=1718909296,tr[R+52>>0]=0,ar[(V=A+20|0)>>2]=F,v=0|ar[(F=A+24|0)>>2],ar[F>>2]=R,0|v&&du(v),R=0|hu(104),ar[R+4>>2]=0,ar[R+8>>2]=0,ar[R>>2]=4656,Mt(g=R+16|0),ar[R+60>>2]=0,ar[R+64>>2]=0,ar[R+68>>2]=0,ar[g>>2]=4684,ar[R+72>>2]=0,ar[R+76>>2]=1885954932,ar[(m=R+80|0)>>2]=0,ar[m+4>>2]=0,ar[m+8>>2]=0,ar[m+12>>2]=0,ar[m+16>>2]=0,ar[m+20>>2]=0,ar[R+36>>2]=1751411826,tr[R+52>>0]=1,ar[(m=A+28|0)>>2]=g,v=0|ar[(g=A+32|0)>>2],ar[g>>2]=R,0|v&&du(v),G=0|hu(72),ar[G+4>>2]=0,ar[G+8>>2]=0,ar[G>>2]=4628,Mt(R=G+16|0),ar[G+60>>2]=0,ar[G+64>>2]=0,ar[G+68>>2]=0,ar[R>>2]=4468,ar[G+36>>2]=1835365473,tr[G+52>>0]=1,ar[(s=A+36|0)>>2]=R,v=0|ar[(R=A+40|0)>>2],ar[R>>2]=G,0|v&&du(v),G=0|hu(72),ar[G+4>>2]=0,ar[G+8>>2]=0,ar[G>>2]=5016,Mt(I=G+16|0),ar[G+60>>2]=0,ar[G+64>>2]=0,ar[G+68>>2]=0,ar[I>>2]=5044,ar[G+36>>2]=1768973167,tr[G+52>>0]=0,ar[(c=A+44|0)>>2]=I,v=0|ar[(I=A+48|0)>>2],ar[I>>2]=G,0|v&&du(v),C=0|hu(88),ar[C+4>>2]=0,ar[C+8>>2]=0,ar[C>>2]=5076,Mt(G=C+16|0),ar[C+60>>2]=0,ar[C+64>>2]=0,ar[C+68>>2]=0,ar[G>>2]=5104,ar[C+72>>2]=0,ar[C+76>>2]=0,ar[C+80>>2]=0,ar[C+36>>2]=1768975713,tr[C+52>>0]=1,ar[(u=A+52|0)>>2]=G,v=0|ar[(G=A+56|0)>>2],ar[G>>2]=C,0|v&&du(v),C=0|hu(104),ar[C+4>>2]=0,ar[C+8>>2]=0,ar[C>>2]=4776,Mt(E=C+16|0),ar[C+60>>2]=0,ar[C+64>>2]=0,ar[C+68>>2]=0,ar[E>>2]=4804,B=C+72|0,ar[C+96>>2]=0,ar[B>>2]=0,ar[B+4>>2]=0,ar[B+8>>2]=0,ar[B+12>>2]=0,ar[B+16>>2]=0,tr[B+20>>0]=0,ar[C+36>>2]=1768714083,tr[C+52>>0]=1,ar[(B=A+60|0)>>2]=E,v=0|ar[(E=A+64|0)>>2],ar[E>>2]=C,0|v&&du(v),C=0|hu(72),ar[C+4>>2]=0,ar[C+8>>2]=0,ar[C>>2]=4836,Mt(X=C+16|0),ar[C+60>>2]=0,ar[C+64>>2]=0,ar[C+68>>2]=0,ar[X>>2]=4864,ar[C+36>>2]=1768517222,tr[C+52>>0]=1,ar[(n=A+92|0)>>2]=X,v=0|ar[(X=A+96|0)>>2],ar[X>>2]=C,0|v&&du(v),y=0|hu(72),ar[y+4>>2]=0,ar[y+8>>2]=0,ar[y>>2]=4956,Mt(W=y+16|0),ar[y+60>>2]=0,ar[y+64>>2]=0,ar[y+68>>2]=0,ar[W>>2]=4984,ar[y+36>>2]=1768977008,tr[y+52>>0]=0,ar[(C=A+100|0)>>2]=W,v=0|ar[(W=A+104|0)>>2],ar[W>>2]=y,0|v&&du(v),p=0|hu(80),ar[p+4>>2]=0,ar[p+8>>2]=0,ar[p>>2]=4716,Mt(y=p+16|0),ar[p+60>>2]=0,ar[p+64>>2]=0,ar[p+68>>2]=0,ar[y>>2]=4744,ar[p+72>>2]=0,ar[p+36>>2]=1885959277,tr[p+52>>0]=1,ar[(i=A+84|0)>>2]=y,v=0|ar[(y=A+88|0)>>2],ar[y>>2]=p,0|v&&du(v),r=0|ar[s>>2],Z=0|ar[m>>2],ar[f>>2]=Z,p=4+f|0,m=0|ar[g>>2],(g=0==(0|(ar[p>>2]=m)))||bu(m),(0|(v=0|ar[(e=48+r|0)>>2]))==(0|ar[52+r>>2])?Ut(44+r|0,f):(ar[v>>2]=Z,ar[v+4>>2]=m,g||(bu(m),v=0|ar[e>>2]),ar[e>>2]=v+8),0|(v=0|ar[p>>2])&&du(v),m=0|ar[s>>2],ar[t>>2]=ar[i>>2],Z=4+t|0,v=0|ar[y>>2],0|(ar[Z>>2]=v)&&bu(v),(0|(v=0|ar[(g=m+48|0)>>2]))==(0|ar[m+52>>2])?Ut(m+44|0,t):(ar[v>>2]=ar[t>>2],m=0|ar[Z>>2],(ar[v+4>>2]=m)&&(bu(m),v=0|ar[g>>2]),ar[g>>2]=v+8),0|(v=0|ar[Z>>2])&&du(v),m=0|ar[s>>2],ar[o>>2]=ar[B>>2],Z=4+o|0,v=0|ar[E>>2],0|(ar[Z>>2]=v)&&bu(v),(0|(v=0|ar[(g=m+48|0)>>2]))==(0|ar[m+52>>2])?Ut(m+44|0,o):(ar[v>>2]=ar[o>>2],m=0|ar[Z>>2],(ar[v+4>>2]=m)&&(bu(m),v=0|ar[g>>2]),ar[g>>2]=v+8),0|(v=0|ar[Z>>2])&&du(v),m=0|ar[s>>2],ar[a>>2]=ar[n>>2],Z=4+a|0,v=0|ar[X>>2],0|(ar[Z>>2]=v)&&bu(v),(0|(v=0|ar[(g=m+48|0)>>2]))==(0|ar[m+52>>2])?Ut(m+44|0,a):(ar[v>>2]=ar[a>>2],m=0|ar[Z>>2],(ar[v+4>>2]=m)&&(bu(m),v=0|ar[g>>2]),ar[g>>2]=v+8),0|(v=0|ar[Z>>2])&&du(v),m=0|ar[s>>2],ar[l>>2]=ar[C>>2],Z=4+l|0,v=0|ar[W>>2],0|(ar[Z>>2]=v)&&bu(v),(0|(v=0|ar[(g=m+48|0)>>2]))==(0|ar[m+52>>2])?Ut(m+44|0,l):(ar[v>>2]=ar[l>>2],m=0|ar[Z>>2],(ar[v+4>>2]=m)&&(bu(m),v=0|ar[g>>2]),ar[g>>2]=v+8),0|(v=0|ar[Z>>2])&&du(v),m=0|ar[C>>2],ar[b>>2]=ar[c>>2],Z=4+b|0,v=0|ar[I>>2],0|(ar[Z>>2]=v)&&bu(v),(0|(v=0|ar[(g=m+48|0)>>2]))==(0|ar[m+52>>2])?Ut(m+44|0,b):(ar[v>>2]=ar[b>>2],m=0|ar[Z>>2],(ar[v+4>>2]=m)&&(bu(m),v=0|ar[g>>2]),ar[g>>2]=v+8),0|(v=0|ar[Z>>2])&&du(v),m=0|ar[C>>2],ar[d>>2]=ar[u>>2],Z=d+4|0,v=0|ar[G>>2],0|(ar[Z>>2]=v)&&bu(v),(0|(v=0|ar[(g=m+48|0)>>2]))==(0|ar[m+52>>2])?Ut(m+44|0,d):(ar[v>>2]=ar[d>>2],m=0|ar[Z>>2],(ar[v+4>>2]=m)&&(bu(m),v=0|ar[g>>2]),ar[g>>2]=v+8),0|(v=0|ar[Z>>2])&&du(v),uo(v=A+108|0,0|ar[(m=A+112|0)>>2]),ar[A+116>>2]=0,ar[v>>2]=m,ar[m>>2]=0,ar[h>>2]=ar[V>>2],m=4+h|0,v=0|ar[F>>2],0|(ar[m>>2]=v)&&bu(v),v=0|ar[N>>2],g=A+16|0;do{if(v>>>0<(0|ar[g>>2])>>>0)ar[v>>2]=ar[h>>2],ar[v+4>>2]=ar[m>>2],ar[h>>2]=0,ar[m>>2]=0,ar[N>>2]=v+8;else{if(ee(k,h),!(v=0|ar[m>>2]))break;du(v)}}while(0);if(ar[h>>2]=ar[s>>2],m=4+h|0,v=0|ar[R>>2],0|(ar[m>>2]=v)&&bu(v),(v=0|ar[N>>2])>>>0<(0|ar[g>>2])>>>0)return ar[v>>2]=ar[h>>2],ar[v+4>>2]=ar[m>>2],ar[h>>2]=0,ar[m>>2]=0,ar[N>>2]=v+8,ur=w;ee(k,h),(v=0|ar[m>>2])&&du(v),ur=w}(e),vl(f=A+28|0,0|ar[(i=A+32|0)>>2]),ar[A+36>>2]=0,ar[f>>2]=i,ar[i>>2]=0,i=0|ar[A+40>>2],(0|(e=0|ar[(f=A+44|0)>>2]))!=(0|i))for(;r=e+-8|0,ar[f>>2]=r,(0|(e=(e=0|ar[e+-4>>2])?(du(e),0|ar[f>>2]):r))!=(0|i););ar[A+52>>2]=0,e=0|ar[(n=A+56|0)>>2],ar[n>>2]=0,e&&du(e)}(f),ar[A>>2]=i,ar[e>>2]=r,0|A},function(){var A;return A=0|hu(12),ar[A>>2]=0,ar[4+A>>2]=0,(ar[8+A>>2]=0)|A},Bb,Bb,Bb],jb=[Eb,function(A){return D=0|ar[(A=(A|=0)+16|0)+4>>2],0|ar[A>>2]},function(A){return 0},function(A){return 0},function(A){var e=0,r=0,i=0;return(i=0|ar[(e=(A|=0)+44|0)>>2])>>>0<(r=0|ar[A+24>>2])>>>0&&(i=ar[e>>2]=r),8&ar[A+48>>2]?((r=0|ar[(e=A+16|0)>>2])>>>0<i>>>0&&(r=ar[e>>2]=i),r>>>0<=(e=0|ar[A+12>>2])>>>0?0|(A=-1):0|(A=0|cr[e>>0])):0|(A=-1)},function(A){var e=0;return 0|(A=-1==(0|(e=0|jb[127&ar[36+(0|ar[(A|=0)>>2])>>2]](A)))?-1:(A=0|ar[(e=A+12|0)>>2],ar[e>>2]=A+1,0|hf(0|tr[A>>0])))},function(A){return 1852009592},function(A){return 0|ar[(A|=0)+4>>2]},function(A){return 0|(1==(0|(A|=0))?100:0)},function(A){var e,r,i;return r=ur=(e=ur)+31&-32,ur=ur+16|0,A=0|(i=0|ar[(A|=0)+60>>2],0|(i|=0)),ar[r>>2]=A,A=0|Ic(0|J(6,0|r)),ur=e,0|A},function(A){return-1},function(A){return 0},function(A){return 0},function(A){return-1},function(A){var e=0;return 0|(A=-1==(0|(e=0|jb[127&ar[36+(0|ar[(A|=0)>>2])>>2]](A)))?-1:(A=0|ar[(e=A+12|0)>>2],ar[e>>2]=A+4,0|gf(0|ar[A>>2])))},function(A){var e,r,i,f,n,t,o,a,c=0,l=0;i=ur=(a=ur)+31&-32,ur=ur+16|0,f=(A|=0)+36|0,n=A+40|0,t=8+(r=8+i|0)|0,o=r,e=A+32|0;A:for(;;){if(A=0|ar[f>>2],A=0|Kb[31&ar[20+(0|ar[A>>2])>>2]](A,0|ar[n>>2],r,t,i),(0|Ui(r,1,l=(0|ar[i>>2])-o|0,0|ar[e>>2]))!=(0|l)){A=-1;break}switch(0|A){case 1:break;case 2:A=-1;break A;default:c=4;break A}}return 4==(0|c)&&(A=(0!=(0|Oi(0|ar[e>>2])))<<31>>31),ur=a,0|A},function(A){var e,r,i,f,n,t,o,a,c=0,l=0;i=ur=(a=ur)+31&-32,ur=ur+16|0,f=(A|=0)+36|0,n=A+40|0,t=8+(r=8+i|0)|0,o=r,e=A+32|0;A:for(;;){if(A=0|ar[f>>2],A=0|Kb[31&ar[20+(0|ar[A>>2])>>2]](A,0|ar[n>>2],r,t,i),(0|Ui(r,1,l=(0|ar[i>>2])-o|0,0|ar[e>>2]))!=(0|l)){A=-1;break}switch(0|A){case 1:break;case 2:A=-1;break A;default:c=4;break A}}return 4==(0|c)&&(A=(0!=(0|Oi(0|ar[e>>2])))<<31>>31),ur=a,0|A},function(A){return 0|fn(A|=0,0)},function(A){return 0|fn(A|=0,1)},function(A){return 0|tn(A|=0,0)},function(A){return 0|tn(A|=0,1)},function(A){return 2},function(A){return 0==(0|tr[56696])&&0|ib(56696)&&(function(){var A=0,e=0;if(0==(0|tr[56704])&&0|ib(56704)){e=59936;do{for(ar[e>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,A=0;3!=(0|A);)ar[e+(A<<2)>>2]=0,A=A+1|0;e=e+12|0}while(60104!=(0|e))}Gu(59936,54302),Gu(59948,54309),Gu(59960,54316),Gu(59972,54324),Gu(59984,54334),Gu(59996,54343),Gu(60008,54350),Gu(60020,54359),Gu(60032,54363),Gu(60044,54367),Gu(60056,54371),Gu(60068,54375),Gu(60080,54379),Gu(60092,54383)}(),ar[15026]=59936),0|ar[15026]},function(A){return 0==(0|tr[56680])&&0|ib(56680)&&(function(){var A=0,e=0;if(0==(0|tr[56688])&&0|ib(56688)){e=59644;do{for(ar[e>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,A=0;3!=(0|A);)ar[e+(A<<2)>>2]=0,A=A+1|0;e=e+12|0}while(59932!=(0|e))}Gu(59644,54172),Gu(59656,54180),Gu(59668,54189),Gu(59680,54195),Gu(59692,54201),Gu(59704,54205),Gu(59716,54210),Gu(59728,54215),Gu(59740,54222),Gu(59752,54232),Gu(59764,54240),Gu(59776,54249),Gu(59788,54258),Gu(59800,54262),Gu(59812,54266),Gu(59824,54270),Gu(59836,54201),Gu(59848,54274),Gu(59860,54278),Gu(59872,54282),Gu(59884,54286),Gu(59896,54290),Gu(59908,54294),Gu(59920,54298)}(),ar[14983]=59644),0|ar[14983]},function(A){return 0==(0|tr[56664])&&0|ib(56664)&&(function(){var A=0,e=0;if(0==(0|tr[56672])&&0|ib(56672)){e=59352;do{for(ar[e>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,A=0;3!=(0|A);)ar[e+(A<<2)>>2]=0,A=A+1|0;e=e+12|0}while(59640!=(0|e))}Gu(59352,54166),Gu(59364,54169)}(),ar[14910]=59352),0|ar[14910]},function(A){A|=0;var e,r,i=0,f=0;return e=ur=(r=ur)+31&-32,ur=ur+16|0,0==(0|tr[56656])&&0|ib(56656)&&(ar[14835]=0,ar[14836]=0,4294967279<(i=(ar[14837]=0)|Yf(54145))>>>0&&pu(),i>>>0<11?(tr[59351]=i,A=59340):(A=0|hu(f=i+16&-16),ar[14835]=A,ar[14837]=-2147483648|f,ar[14836]=i),wf(A,54145,i),Qf(A+i|(tr[e>>0]=0),e)),ur=r,59340},function(A){A|=0;var e,r,i=0,f=0;return e=ur=(r=ur)+31&-32,ur=ur+16|0,0==(0|tr[56648])&&0|ib(56648)&&(ar[14832]=0,ar[14833]=0,4294967279<(i=(ar[14834]=0)|Yf(54133))>>>0&&pu(),i>>>0<11?(tr[59339]=i,A=59328):(A=0|hu(f=i+16&-16),ar[14832]=A,ar[14834]=-2147483648|f,ar[14833]=i),wf(A,54133,i),Qf(A+i|(tr[e>>0]=0),e)),ur=r,59328},function(A){A|=0;var e,r,i=0,f=0;return e=ur=(r=ur)+31&-32,ur=ur+16|0,0==(0|tr[56640])&&0|ib(56640)&&(ar[14829]=0,ar[14830]=0,4294967279<(i=(ar[14831]=0)|Yf(54124))>>>0&&pu(),i>>>0<11?(tr[59327]=i,A=59316):(A=0|hu(f=i+16&-16),ar[14829]=A,ar[14831]=-2147483648|f,ar[14830]=i),wf(A,54124,i),Qf(A+i|(tr[e>>0]=0),e)),ur=r,59316},function(A){A|=0;var e,r,i=0,f=0;return e=ur=(r=ur)+31&-32,ur=ur+16|0,0==(0|tr[56632])&&0|ib(56632)&&(ar[14826]=0,ar[14827]=0,4294967279<(i=(ar[14828]=0)|Yf(54115))>>>0&&pu(),i>>>0<11?(tr[59315]=i,A=59304):(A=0|hu(f=i+16&-16),ar[14826]=A,ar[14828]=-2147483648|f,ar[14827]=i),wf(A,54115,i),Qf(A+i|(tr[e>>0]=0),e)),ur=r,59304},function(A){return 2},function(A){return 0==(0|tr[56776])&&0|ib(56776)&&(function(){var A=0,e=0;if(0==(0|tr[56784])&&0|ib(56784)){e=60748;do{for(ar[e>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,A=0;3!=(0|A);)ar[e+(A<<2)>>2]=0,A=A+1|0;e=e+12|0}while(60916!=(0|e))}Tu(60748,15904),Tu(60760,15932),Tu(60772,15960),Tu(60784,15992),Tu(60796,16032),Tu(60808,16068),Tu(60820,16096),Tu(60832,16132),Tu(60844,16148),Tu(60856,16164),Tu(60868,16180),Tu(60880,16196),Tu(60892,16212),Tu(60904,16228)}(),ar[15229]=60748),0|ar[15229]},function(A){return 0==(0|tr[56760])&&0|ib(56760)&&(function(){var A=0,e=0;if(0==(0|tr[56768])&&0|ib(56768)){e=60456;do{for(ar[e>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,A=0;3!=(0|A);)ar[e+(A<<2)>>2]=0,A=A+1|0;e=e+12|0}while(60744!=(0|e))}Tu(60456,15384),Tu(60468,15416),Tu(60480,15452),Tu(60492,15476),Tu(60504,15500),Tu(60516,15516),Tu(60528,15536),Tu(60540,15556),Tu(60552,15584),Tu(60564,15624),Tu(60576,15656),Tu(60588,15692),Tu(60600,15728),Tu(60612,15744),Tu(60624,15760),Tu(60636,15776),Tu(60648,15500),Tu(60660,15792),Tu(60672,15808),Tu(60684,15824),Tu(60696,15840),Tu(60708,15856),Tu(60720,15872),Tu(60732,15888)}(),ar[15186]=60456),0|ar[15186]},function(A){return 0==(0|tr[56744])&&0|ib(56744)&&(function(){var A=0,e=0;if(0==(0|tr[56752])&&0|ib(56752)){e=60164;do{for(ar[e>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,A=0;3!=(0|A);)ar[e+(A<<2)>>2]=0,A=A+1|0;e=e+12|0}while(60452!=(0|e))}Tu(60164,15360),Tu(60176,15372)}(),ar[15113]=60164),0|ar[15113]},function(A){A|=0;var e,r=0,i=0,f=0;if(A=ur=(e=ur)+31&-32,ur=ur+16|0,0==(0|tr[56736])&&0|ib(56736)){ar[15038]=0,ar[15039]=0,1073741807<(i=(ar[15040]=0)|Mr(15276))>>>0&&pu();do{if(2<=i>>>0){if(!(1073741823<(r=i+4&-4)>>>0)){f=0|hu(r<<2),ar[15038]=f,ar[15040]=-2147483648|r,ar[15039]=i;break}lA()}else tr[60163]=i,f=60152}while(0);Zf(f,15276,i),ln(f+(i<<2)|(ar[A>>2]=0),A)}return ur=e,60152},function(A){A|=0;var e,r=0,i=0,f=0;if(A=ur=(e=ur)+31&-32,ur=ur+16|0,0==(0|tr[56728])&&0|ib(56728)){ar[15035]=0,ar[15036]=0,1073741807<(i=(ar[15037]=0)|Mr(15228))>>>0&&pu();do{if(2<=i>>>0){if(!(1073741823<(r=i+4&-4)>>>0)){f=0|hu(r<<2),ar[15035]=f,ar[15037]=-2147483648|r,ar[15036]=i;break}lA()}else tr[60151]=i,f=60140}while(0);Zf(f,15228,i),ln(f+(i<<2)|(ar[A>>2]=0),A)}return ur=e,60140},function(A){A|=0;var e,r=0,i=0,f=0;if(A=ur=(e=ur)+31&-32,ur=ur+16|0,0==(0|tr[56720])&&0|ib(56720)){ar[15032]=0,ar[15033]=0,1073741807<(i=(ar[15034]=0)|Mr(15192))>>>0&&pu();do{if(2<=i>>>0){if(!(1073741823<(r=i+4&-4)>>>0)){f=0|hu(r<<2),ar[15032]=f,ar[15034]=-2147483648|r,ar[15033]=i;break}lA()}else tr[60139]=i,f=60128}while(0);Zf(f,15192,i),ln(f+(i<<2)|(ar[A>>2]=0),A)}return ur=e,60128},function(A){A|=0;var e,r=0,i=0,f=0;if(A=ur=(e=ur)+31&-32,ur=ur+16|0,0==(0|tr[56712])&&0|ib(56712)){ar[15029]=0,ar[15030]=0,1073741807<(i=(ar[15031]=0)|Mr(15156))>>>0&&pu();do{if(2<=i>>>0){if(!(1073741823<(r=i+4&-4)>>>0)){f=0|hu(r<<2),ar[15029]=f,ar[15031]=-2147483648|r,ar[15030]=i;break}lA()}else tr[60127]=i,f=60116}while(0);Zf(f,15156,i),ln(f+(i<<2)|(ar[A>>2]=0),A)}return ur=e,60116},function(A){return 127},function(A){return 127},function(A){return 0},function(A){return 127},function(A){return 127},function(A){return 0},function(A){return 2147483647},function(A){return 2147483647},function(A){return 0},function(A){return 2147483647},function(A){return 2147483647},function(A){return 0},function(A){return 0},function(A){return 0},function(A){return 4},function(A){var e,r=0;if(r=0|rf(0|ar[(A=(A|=0)+8|0)>>2]),e=0|function(A,e,r){A|=0,e|=0,r|=0;var i,f=0,n=0,t=0;f=ur=(i=ur)+31&-32,ur=ur+16|0;A:do{if(e){do{if(0|r){if(t=0==(0|A)?f:A,-1<(A=0|tr[e>>0])<<24>>24){ar[t>>2]=255&A,A=A<<24>>24!=0&1;break A}if(n=10488,A=0|tr[e>>0],!(0|ar[ar[n>>2]>>2])){ar[t>>2]=A<<24>>24&57343,A=1;break A}if((A=(255&A)-194|0)>>>0<=50){if(f=e+1|0,n=0|ar[9896+(A<<2)>>2],r>>>0<4&&n&-2147483648>>>((6*r|0)-6|0)|0)break;if(((r=(A=0|cr[f>>0])>>>3)+-16|r+(n>>26))>>>0<=7){if(0<=(0|(A=A+-128|n<<6))){ar[t>>2]=A,A=2;break A}if((f=(0|cr[e+2>>0])-128|0)>>>0<=63){if(0<=(0|(f|=A<<6))){ar[t>>2]=f,A=3;break A}if((A=(0|cr[e+3>>0])-128|0)>>>0<=63){ar[t>>2]=A|f<<6,A=4;break A}}}}}}while(0);ar[(A=10364)>>2]=84,A=-1}else A=0}while(0);return ur=i,0|A}(0,0,4),0|r&&rf(r),e)A=-1;else{if(A=0|ar[A>>2])return r=0|rf(A),A=0|yi(),0|r&&rf(r),1==(0|A)|0;A=1}return 0|A},function(A){return 0},function(A){var e=0;return(A=0|ar[(A|=0)+8>>2])?(e=0|rf(A),A=0|yi(),e&&rf(e)):A=1,0|A},function(A){return 0|tr[(A|=0)+8>>0]},function(A){return 0|tr[(A|=0)+9>>0]},function(A){return 0|ar[(A|=0)+8>>2]},function(A){return 0|ar[(A|=0)+12>>2]},function(A){return 1},function(A){return 1},function(A){return 1},function(A){return 0},function(A){return 0},function(A){return 4},function(A){return 55847},function(A){return 0|(e=(A|=0)+4|0,0|ar[(e|=0)>>2]);var e},function(A){var e,r,i,f,n=0;return ur=(r=ur)+16|0,f=r,is[511&(A|=0)](f),A=0|yc((n=(i=(n=0|tr[f+11>>0])<<24>>24<0)?0|ar[f+4>>2]:255&n)+4|0),ar[A>>2]=n,e=0|ar[f>>2],hb(A+4|0,0|(i?e:f),0|n),ur=(i&&vu(e),r),0|A},function(A){return 0|zb[7&(A|=0)]()},function(A){return 0|zb[7&(A|=0)]()},function(A){var e,r,i,f,n,t=0;if(ur=(n=ur)+16|0,sl(i=n,40+(0|ar[(A|=0)>>2])|0),f=(t=0|ar[(r=i+4|0)>>2])-(A=0|ar[i>>2])>>3,!(e=A))return ur=n,0|f;if((0|t)!=(0|e)){for(;A=t+-8|0,ar[r>>2]=A,(t=0|ar[t+-4>>2])&&(du(t),A=0|ar[r>>2]),(0|A)!=(0|e);)t=A;A=0|ar[i>>2]}return vu(A),ur=n,0|f},function(A){return 1272},function(A){return 1312},function(A){return 1352},Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb,Eb],Hb=[Xb,function(A,e){e|=0;var r,i=0,f=0,n=0;if((i=0|ar[(f=(A|=0)+44|0)>>2])>>>0<(n=0|ar[A+24>>2])>>>0&&(i=ar[f>>2]=n),f=0|ar[(r=A+12|0)>>2],(0|ar[A+8>>2])>>>0>=f>>>0)return 0|(e=-1);if(-1==(0|e))return ar[r>>2]=f+-1,ar[A+16>>2]=i,(e=0)|e;if(16&ar[A+48>>2])n=255&e,f=f+-1|0;else if((n=255&e)<<24>>24!=(0|tr[(f=f+-1|0)>>0]))return 0|(e=-1);return ar[r>>2]=f,ar[A+16>>2]=i,tr[f>>0]=n,0|e},function(A,e){var r,i,f,n,t,o,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0;if(ur=(o=ur)+16|0,i=o,-1==(0|(e|=0)))return ur=o,(w=0)|w;if(n=(A|=0)+8|0,t=(0|ar[(f=A+12|0)>>2])-(0|ar[n>>2])|0,(0|(d=0|ar[(w=A+24|0)>>2]))==(0|(a=0|ar[(r=A+28|0)>>2]))){if(!(16&ar[(s=A+48|0)>>2]))return ur=o,0|(w=-1);b=0|ar[(u=A+20|0)>>2],k=(0|ar[(h=A+44|0)>>2])-b|0,_u(l=A+32|0,0),Vu(l,c=(0|tr[(a=l+11|0)>>0])<0?(2147483647&ar[A+40>>2])-1|0:10,0),(a=0|tr[a>>0])<<24>>24<0?(c=0|ar[l>>2],a=0|ar[A+36>>2]):(c=l,a&=255),a=c+a|0,ar[u>>2]=c,ar[r>>2]=a,d=c+(d-b)|0,ar[w>>2]=d,c=c+k|0,ar[h>>2]=c,l=k=h,b=a}else s=A+48|0,c=0|ar[(l=k=c=A+44|0)>>2],b=a;return u=d+1|0,ar[i>>2]=u,c=0|ar[(u>>>0<c>>>0?l:i)>>2],ar[k>>2]=c,8&ar[s>>2]|0&&((0|tr[(a=A+32|0)+11>>0])<0&&(a=0|ar[a>>2]),ar[n>>2]=a,ar[f>>2]=a+t,ar[A+16>>2]=c),(0|d)==(0|b)?(w=0|Hb[31&ar[52+(0|ar[A>>2])>>2]](A,255&e),ur=o,0|w):(ar[w>>2]=u,tr[d>>0]=e,ur=o,0|(w=255&e))},function(A,e){return 0},function(A,e){e|=0;var r=0;return r=0|ar[(A|=0)+376156>>2],(0|ar[A+376160>>2])-r>>2>>>0<=e>>>0?(r=0)|r:0|(r=0|ar[r+(e<<2)>>2])},function(A,e){return(0|(e|=0))<=-1?(e=0)|e:0|(e=((0|ar[(A|=0)+376160>>2])-(0|ar[A+376156>>2])>>2|0)>(0|e))},function(A,e){return-1},function(A,e){return-1},function(A,e){return-1},function(A,e){return-1},function(A,e){A|=0,e|=0;var r,i,f,n,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;f=ur=(n=ur)+31&-32,ur=ur+32|0,r=16+f|0,o=8+f|0,i=4+f|0;do{if(0|Uf(e,-1))t=15;else{if(s=0|pf(e),ar[o>>2]=s,s=A+32|0,0|tr[A+44>>0]){if(1==(0|Ui(o,4,1,0|ar[s>>2]))){t=15;break}A=-1;break}for(u=o+4|0,b=A+36|0,a=A+40|0,c=8+(ar[i>>2]=r)|0,l=r,A=o;;){if(t=0|ar[b>>2],o=1==(0|(t=0|es[15&ar[12+(0|ar[t>>2])>>2]](t,0|ar[a>>2],A,u,f,r,c,i))),(0|ar[f>>2])==(0|A)){t=14;break}if(3==(0|t)){if(1!=(0|Ui(A,1,1,0|ar[s>>2]))){t=14;break}}else{if(1!=(1|t)){t=14;break}if((0|Ui(r,1,t=(0|ar[i>>2])-l|0,0|ar[s>>2]))!=(0|t)){t=14;break}A=o?0|ar[f>>2]:A}if(!o){t=13;break}}if(13==(0|t)){t=15;break}if(14==(0|t)){A=-1;break}}}while(0);return 15==(0|t)&&(A=0|function(A){0|Uf(A|=0,-1)&&(A=0);return 0|A}(e)),ur=n,0|A},function(A,e){A|=0,e|=0;var r,i,f,n,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;f=ur=(n=ur)+31&-32,ur=ur+32|0,r=16+f|0,o=8+f|0,i=4+f|0;do{if(0|Mf(e,-1))t=15;else{if(s=0|vf(e),tr[o>>0]=s,s=A+32|0,0|tr[A+44>>0]){if(1==(0|Ui(o,1,1,0|ar[s>>2]))){t=15;break}A=-1;break}for(u=o+1|0,b=A+36|0,a=A+40|0,c=8+(ar[i>>2]=r)|0,l=r,A=o;;){if(t=0|ar[b>>2],o=1==(0|(t=0|es[15&ar[12+(0|ar[t>>2])>>2]](t,0|ar[a>>2],A,u,f,r,c,i))),(0|ar[f>>2])==(0|A)){t=14;break}if(3==(0|t)){if(1!=(0|Ui(A,1,1,0|ar[s>>2]))){t=14;break}}else{if(1!=(1|t)){t=14;break}if((0|Ui(r,1,t=(0|ar[i>>2])-l|0,0|ar[s>>2]))!=(0|t)){t=14;break}A=o?0|ar[f>>2]:A}if(!o){t=13;break}}if(13==(0|t)){t=15;break}if(14==(0|t)){A=-1;break}}}while(0);return 15==(0|t)&&(A=0|function(A){0|Mf(A|=0,-1)&&(A=0);return 0|A}(e)),ur=n,0|A},function(A,e){var r,i,f,n,t,o=0,a=0,c=0,l=0;c=ur=(t=ur)+31&-32,ur=ur+32|0,r=c+16|0,i=c+8|0,a=c+4|0,l=0|Uf(e|=0,-1),o=0!=(0|tr[(n=(A|=0)+52|0)>>0]),f=A+48|0;do{if(l)o?o=e:(l=1&(1^(0|Uf(o=0|ar[f>>2],-1))),tr[n>>0]=l);else{if(o){switch(l=0|pf(0|ar[f>>2]),ar[a>>2]=l,l=0|ar[A+36>>2],0|es[15&ar[12+(0|ar[l>>2])>>2]](l,0|ar[A+40>>2],a,a+4|0,c,r,8+r|0,i)){case 1:case 2:c=10;break;case 3:tr[r>>0]=ar[f>>2],ar[i>>2]=1+r,c=7;break;default:c=7}A:do{if(7==(0|c))for(o=A+32|0;;){if((a=0|ar[i>>2])>>>0<=r>>>0){a=1,o=0;break A}if(l=a+-1|0,ar[i>>2]=l,-1==(0|uf(0|tr[l>>0],0|ar[o>>2]))){c=10;break}}}while(0);if(10==(0|c)&&(a=0,o=-1),!a)break}ar[f>>2]=e,tr[n>>0]=1,o=e}}while(0);return ur=t,0|o},function(A,e){var r,i,f,n,t,o=0,a=0,c=0,l=0;c=ur=(t=ur)+31&-32,ur=ur+32|0,r=c+16|0,i=c+4|0,a=c+8|0,l=0|Mf(e|=0,-1),o=0!=(0|tr[(n=(A|=0)+52|0)>>0]),f=A+48|0;do{if(l)o?o=e:(l=1&(1^(0|Mf(o=0|ar[f>>2],-1))),tr[n>>0]=l);else{if(o){switch(l=0|vf(0|ar[f>>2]),tr[a>>0]=l,l=0|ar[A+36>>2],0|es[15&ar[12+(0|ar[l>>2])>>2]](l,0|ar[A+40>>2],a,a+1|0,c,r,8+r|0,i)){case 1:case 2:c=10;break;case 3:tr[r>>0]=ar[f>>2],ar[i>>2]=1+r,c=7;break;default:c=7}A:do{if(7==(0|c))for(o=A+32|0;;){if((a=0|ar[i>>2])>>>0<=r>>>0){a=1,o=0;break A}if(l=a+-1|0,ar[i>>2]=l,-1==(0|uf(0|tr[l>>0],0|ar[o>>2]))){c=10;break}}}while(0);if(10==(0|c)&&(a=0,o=-1),!a)break}ar[f>>2]=e,tr[n>>0]=1,o=e}}while(0);return ur=t,0|o},function(A,e){return-1<(e|=0)<<24>>24&&(e=(0|Tl())+((255&e)<<2)|0,e=255&ar[e>>2]),0|e},function(A,e){return-1<(e|=0)<<24>>24&&(e=(0|Ml())+(e<<24>>24<<2)|0,e=255&ar[e>>2]),0|e},function(A,e){return 0|(e|=0)},function(A,e){return(e|=0)>>>0<128&&(e=(0|Tl())+(e<<2)|0,e=0|ar[e>>2]),0|e},function(A,e){return(e|=0)>>>0<128&&(e=(0|Ml())+(e<<2)|0,e=0|ar[e>>2]),0|e},function(A,e){return(e|=0)<<24>>24|0},function(A,e){return e|=0,0|jb[127&(A|=0)](e)},function(A,e){var r,i;return e|=0,ur=(r=ur)+16|0,i=r,fs[63&(A|=0)](i,e),fA(0|ar[i>>2]),e=0|ar[i>>2],iA(0|e),ur=r,0|e},function(A,e){return 0|ar[(e|=0)+(0|ar[(A|=0)>>2])>>2]},function(A,e){return 0|ar[(e|=0)+(0|ar[(A|=0)>>2])>>2]},Xb,Xb,Xb,Xb,Xb,Xb,Xb,Xb],xb=[Wb,function(A,e,r){var i;return e|=0,r|=0,0|((0|(i=0|ar[(A=(A|=0)+8|0)+4>>2]))<(0|r)|((0|i)==(0|r)?(0|ar[A>>2])>>>0<e>>>0:0)?2:0)},function(A,e,r){e|=0,r|=0;var i,f,n,t=0,o=0,a=0;return t=0|tb(0|(f=0|ar[(t=i=(A|=0)+16|0)>>2]),0|ar[t+4>>2],0|r,0),a=D,(0|(o=0|ar[4+(n=A+8|0)>>2]))<(0|a)|((0|a)==(0|o)?t>>>0>(0|ar[n>>2])>>>0:0)?(a=0)|a:(hb(0|e,(0|ar[A+4>>2])+f|0,0|r),o=0|tb(0|ar[(o=i)>>2],0|ar[o+4>>2],0|r,0),ar[(a=i)>>2]=o,ar[a+4>>2]=D,0|(a=1))},function(A,e,r){e|=0;var i,f=0;return(0|(r|=0))<0|((0|(f=0|ar[4+(i=(A|=0)+8|0)>>2]))<(0|r)|((0|f)==(0|r)?(0|ar[i>>2])>>>0<e>>>0:0))?(f=0)|f:(ar[(f=A+16|0)>>2]=e,ar[f+4>>2]=r,0|(f=1))},function(A,e,r){return 0|(A|=0)},function(A,e,r){e|=0,r|=0;var i,f,n=0,t=0,o=0,a=0;for(i=(A|=0)+12|0,f=A+16|0,o=0;!((0|r)<=(0|o));)if((n=0|ar[i>>2])>>>0<(t=0|ar[f>>2])>>>0)wf(e,n,t=(0|(a=r-o|0))<(0|(t=t-n|0))?a:t),ar[i>>2]=(0|ar[i>>2])+t,e=e+t|0,o=t+o|0;else{if(-1==(0|(n=0|jb[127&ar[40+(0|ar[A>>2])>>2]](A))))break;a=0|vf(n),tr[e>>0]=a,e=e+1|0,o=o+1|0}return 0|o},function(A,e,r){e|=0,r|=0;var i,f,n=0,t=0,o=0,a=0;for(i=(A|=0)+24|0,f=A+28|0,n=0;!((0|r)<=(0|n));)if((t=0|ar[i>>2])>>>0<(o=0|ar[f>>2])>>>0)wf(t,e,o=(0|(a=r-n|0))<(0|(o=o-t|0))?a:o),ar[i>>2]=(0|ar[i>>2])+o,e=e+o|0,n=o+n|0;else{if(o=0|ar[52+(0|ar[A>>2])>>2],a=0|hf(0|tr[e>>0]),-1==(0|Hb[31&o](A,a)))break;e=e+1|0,n=n+1|0}return 0|n},function(A,e,r){e|=0,r|=0;var i,f,n=0;return n=ur=(f=ur)+31&-32,ur=ur+32|0,i=n,ar[(A|=0)+36>>2]=10,0==(64&ar[A>>2]|0)&&(ar[i>>2]=ar[A+60>>2],ar[i+4>>2]=21523,ar[i+8>>2]=n+16,0|Y(54,0|i))&&(tr[A+75>>0]=-1),n=0|Gc(A,e,r),ur=f,0|n},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n=0;return n=ur=(i=ur)+31&-32,ur=ur+32|0,n=(f=n)+20|0,ar[f>>2]=ar[A+60>>2],ar[f+4>>2]=0,ar[f+8>>2]=e,ar[f+12>>2]=n,ar[f+16>>2]=r,A=(0|Ic(0|R(140,0|f)))<0?ar[n>>2]=-1:0|ar[n>>2],ur=i,0|A},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t=0,o=0,a=0,c=0;return c=ur=(f=ur)+31&-32,ur=ur+32|0,ar[(c=(t=c)+16|0)>>2]=e,o=c+4|0,n=0|ar[(i=A+48|0)>>2],ar[o>>2]=r-(0!=(0|n)&1),a=A+44|0,ar[c+8>>2]=ar[a>>2],ar[c+12>>2]=n,ar[t>>2]=ar[A+60>>2],ar[t+4>>2]=c,ar[t+8>>2]=2,1<=(0|(t=0|Ic(0|N(145,0|t))))?(c=0|ar[o>>2])>>>0<t>>>0&&(o=0|ar[a>>2],ar[(a=A+4|0)>>2]=o,ar[A+8>>2]=o+(t-c),t=(0|ar[i>>2]&&(ar[a>>2]=o+1,tr[e+(r+-1)>>0]=0|tr[o>>0]),r)):ar[A>>2]=ar[A>>2]|48&t^16,ur=f,0|t},Gc,function(A,e,r){var i,f;return e|=0,r|=0,hb(0|(f=0|ar[(i=(A|=0)+20|0)>>2]),0|e,0|(A=r>>>0<(A=(0|ar[A+16>>2])-f|0)>>>0?r:A)),ar[i>>2]=(0|ar[i>>2])+A,0|r},function(A,e,r){return 0|(A|=0)},function(A,e,r){e|=0,r|=0;var i,f,n=0,t=0,o=0,a=0;for(i=(A|=0)+12|0,f=A+16|0,o=0;!((0|r)<=(0|o));)if((n=0|ar[i>>2])>>>0<(t=0|ar[f>>2])>>>0)Zf(e,n,t=(0|(a=r-o|0))<(0|(t=t-n>>2))?a:t),ar[i>>2]=(0|ar[i>>2])+(t<<2),e=e+(t<<2)|0,o=t+o|0;else{if(-1==(0|(n=0|jb[127&ar[40+(0|ar[A>>2])>>2]](A))))break;a=0|pf(n),ar[e>>2]=a,e=e+4|0,o=o+1|0}return 0|o},function(A,e,r){e|=0,r|=0;var i,f,n=0,t=0,o=0,a=0;for(i=(A|=0)+24|0,f=A+28|0,n=0;!((0|r)<=(0|n));)if((t=0|ar[i>>2])>>>0<(o=0|ar[f>>2])>>>0)Zf(t,e,o=(0|(a=r-n|0))<(0|(o=o-t>>2))?a:o),ar[i>>2]=(0|ar[i>>2])+(o<<2),e=e+(o<<2)|0,n=o+n|0;else{if(o=0|ar[52+(0|ar[A>>2])>>2],a=0|gf(0|ar[e>>2]),-1==(0|Hb[31&o](A,a)))break;e=e+4|0,n=n+1|0}return 0|n},function(A,e,r){A|=0,e|=0,r|=0;var i=0,f=0,n=0;A:do{if(0|tr[A+44>>0])i=0|Ui(e,4,r,0|ar[A+32>>2]);else for(i=0;;){if((0|r)<=(0|i))break A;if(n=0|ar[52+(0|ar[A>>2])>>2],f=0|gf(0|ar[e>>2]),-1==(0|(f=0|Hb[31&n](A,f))))break A;i=i+1|0,e=e+4|0}}while(0);return 0|i},function(A,e,r){A|=0,e|=0,r|=0;var i=0,f=0,n=0;A:do{if(0|tr[A+44>>0])i=0|Ui(e,1,r,0|ar[A+32>>2]);else for(i=0;;){if((0|r)<=(0|i))break A;if(n=0|ar[52+(0|ar[A>>2])>>2],f=0|hf(0|tr[e>>0]),-1==(0|(f=0|Hb[31&n](A,f))))break A;i=i+1|0,e=e+1|0}}while(0);return 0|i},function(A,e,r){A|=0,e|=0,r|=0;var i=0,f=0;for(A=0;(0|e)!=(0|r);)A=((f=-268435456&(i=(0|tr[e>>0])+(A<<4)|0))>>>24|f)^i,e=e+1|0;return 0|A},function(A,e,r){A|=0,e|=0,r|=0;var i=0,f=0;for(A=0;(0|e)!=(0|r);)A=((f=-268435456&(i=(0|ar[e>>2])+(A<<4)|0))>>>24|f)^i,e=e+4|0;return 0|A},function(A,e,r){return r|=0,(r=0|cf((0|tr[(e|=0)+11>>0])<0&&ar[e>>2]))>>>(-1!=(0|r)&1)|0},function(A,e,r){return r|=0,(r=0|cf((0|tr[(e|=0)+11>>0])<0&&ar[e>>2]))>>>(-1!=(0|r)&1)|0},function(A,e,r){for(A|=0,e|=0,r|=0;(0|e)!=(0|r);)-1<(A=0|tr[e>>0])<<24>>24&&(A=0|Tl(),A=255&ar[A+(tr[e>>0]<<2)>>2]),tr[e>>0]=A,e=e+1|0;return 0|r},function(A,e,r){for(A|=0,e|=0,r|=0;(0|e)!=(0|r);)-1<(A=0|tr[e>>0])<<24>>24&&(A=0|Ml(),A=255&ar[A+(tr[e>>0]<<2)>>2]),tr[e>>0]=A,e=e+1|0;return 0|r},function(A,e,r){return r|=0,0|(-1<(e|=0)<<24>>24?e:r)},function(A,e,r){return A|=0,e|=0,0|(A=(r|=0)>>>0<128?(A=(0|Ul())+(r<<1)|0,(or[A>>1]&e)<<16>>16!=0):0)},function(A,e,r){for(A|=0,e|=0,r|=0;(0|e)!=(0|r);)(A=0|ar[e>>2])>>>0<128&&(A=0|Tl(),A=0|ar[A+(ar[e>>2]<<2)>>2]),ar[e>>2]=A,e=e+4|0;return 0|r},function(A,e,r){for(A|=0,e|=0,r|=0;(0|e)!=(0|r);)(A=0|ar[e>>2])>>>0<128&&(A=0|Ml(),A=0|ar[A+(ar[e>>2]<<2)>>2]),ar[e>>2]=A,e=e+4|0;return 0|r},function(A,e,r){return r|=0,0|((e|=0)>>>0<128?255&e:r)},function(A,e,r){r|=0;var i,f,n=0,t=0;if(i=ur=(f=ur)+31&-32,ur=ur+64|0,0|xu(A|=0,e|=0))e=1;else if(0!=(0|e)&&0!=(0|(t=0|qu(e,3960,3944,0)))){for(n=(e=4+i|0)+52|0;(0|(e=e+4|(ar[e>>2]=0)))<(0|n););ar[i>>2]=t,ar[8+i>>2]=A,ar[12+i>>2]=-1,ar[48+i>>2]=1,ts[31&ar[28+(0|ar[t>>2])>>2]](t,i,0|ar[r>>2],1),e=1==(0|ar[24+i>>2])?(ar[r>>2]=ar[16+i>>2],1):0}else e=0;return ur=f,0|e},function(A,e,r){return 0|xu(A|=0,e|=0)},function(A,e,r){A|=0,e|=0;var i,f,n=0,t=0,o=0,a=0;if(i=ur=(f=ur)+31&-32,ur=ur+64|0,ar[(r|=0)>>2]=ar[ar[r>>2]>>2],0|function(A,e){A=0|xu(A|=0,e|=0)?1:0|xu(e,4088);return 0|A}(A,e))A=1;else if(0!=(0|e)&&0!=(0|(n=0|qu(e,3960,4048,0)))&&0==(ar[n+8>>2]&~ar[A+8>>2]|0))if(e=n+12|0,0|xu(0|ar[(A=A+12|0)>>2],0|ar[e>>2])||0|xu(0|ar[A>>2],4080))A=1;else if(0!=(0|(A=0|ar[A>>2]))&&0!=(0|(o=0|qu(A,3960,3944,0)))&&0!=(0|(t=0|ar[e>>2]))&&0!=(0|(a=0|qu(t,3960,3944,0)))){for(e=(A=4+i|0)+52|0;(0|(A=A+4|(ar[A>>2]=0)))<(0|e););ar[i>>2]=a,ar[8+i>>2]=o,ar[12+i>>2]=-1,ar[48+i>>2]=1,ts[31&ar[28+(0|ar[a>>2])>>2]](a,i,0|ar[r>>2],1),A=1==(0|ar[24+i>>2])?(ar[r>>2]=ar[16+i>>2],1):0}else A=0;else A=0;return ur=f,0|A},function(A,e,r){return 0|xu(A|=0,e|=0)},function(A,e,r){A|=0,e|=0;var i,f,n,t,o,a=0;return ur=(o=ur)+32|0,n=o+12|0,t=o,i=(r|=0)+4|0,f=0|ar[r>>2],ar[t>>2]=0,ar[t+4>>2]=0,4294967279<f>>>(ar[t+8>>2]=0)&&pu(),f>>>0<11?(tr[t+11>>0]=f)?(r=t,a=6):r=t:(r=0|hu(a=16+f&-16),ar[t>>2]=r,ar[t+8>>2]=-2147483648|a,ar[t+4>>2]=f,a=6),6==(0|a)&&hb(0|r,0|i,0|f),tr[r+f>>0]=0,ns[127&A](n,e,t),r=0|hu(12),ar[r>>2]=ar[n>>2],ar[r+4>>2]=ar[4+n>>2],ar[r+8>>2]=ar[8+n>>2],ur=(0<=(0|tr[t+11>>0])||vu(0|ar[t>>2]),o),0|r},function(A,e,r){var i,f;return e|=0,r|=0,ur=(i=ur)+16|0,f=i,ns[127&(A|=0)](f,e,r),fA(0|ar[f>>2]),r=0|ar[f>>2],iA(0|r),ur=i,0|r},function(A,e,r){return 0|function(A,e,r){e|=0,r|=0;var i,f,n,t=0;return f=0|ar[(i=(A=A|0)+84|0)>>2],t=0|Rc(f,0,n=r+256|0),hb(0|e,0|f,0|(r=(t=0==(0|t)?n:t-f|0)>>>0<r>>>0?t:r)),ar[A+4>>2]=f+r,e=f+t|0,ar[A+8>>2]=e,ar[i>>2]=e,0|r}(A|=0,e|=0,r|=0)},Wb,Wb,Wb,Wb,Wb,Wb,Wb,Wb,Wb,Wb,Wb,Wb,Wb,Wb,Wb,Wb,Wb,Wb,Wb,Wb,Wb,Wb,Wb,Wb,Wb,Wb,Wb,Wb,Wb],Pb=[function(A,e,r,i){return Z(4),0},function(A,e,r,i){A|=0,r|=0,i|=0;var f,n,t,o=0,a=0,c=0;if(A=0|ar[(e|=0)+4>>2],a=(0|(i=0|ar[e+8>>2]))/(0|ar[r+5784>>2])|0,c=(c=A+-1+(e=0|ar[e+12>>2])|0)-((0|c)%(0|e)|0)|0,e=(A=((0|A)/(0|ar[r+5780>>2])|0)-1+e|0)-((0|A)%(0|e)|0)|0,9<=((A=0|ar[r+5760>>2])+-8|0)>>>0&&sr(36609,36663,115,36672),9<=((o=0|ar[r+5768>>2])+-8|0)>>>0&&sr(36695,36663,116,36672),n=0==(0|(f=0|Wc(16,0|br(0|br(c,i),(A+7|0)/8|0)))),t=f,0|ar[r+20>>2]){if(0==(0|(i=o=0|Wc(16,a=0|br(0|br(e,a),(o+7|0)/8|0))))|0==(0|(A=a=0|Wc(16,a)))|n)return n||Bc(f),0|o&&Bc(o),a&&Bc(a),(r=0)|r}else{if(n)return(r=0)|r;A=i=e=0}return ar[r+4>>2]=t,ar[r+10492>>2]=0,ar[r+40>>2]=c,ar[r+8>>2]=i,ar[r+10496>>2]=0,ar[r+12>>2]=A,ar[r+10500>>2]=0,ar[r+44>>2]=e,0|(r=1)},function(A,e,r,i){for(e|=0,r|=0,i|=0;(0|e)!=(0|r);)tr[i>>0]=0|tr[e>>0],i=i+1|0,e=e+1|0;return 0|r},function(A,e,r,i){for(A|=0,e|=0,r|=0,i|=0;(0|e)!=(0|r);)A=(0|ar[e>>2])>>>0<128?(A=0|Ul(),0|lr[A+(ar[e>>2]<<1)>>1]):0,or[i>>1]=A,i=i+2|0,e=e+4|0;return 0|r},function(A,e,r,i){for(A|=0,e|=0,r|=0,i|=0;;){if((0|r)==(0|i)){r=i;break}if((0|ar[r>>2])>>>0<128&&(A=0|Ul(),(or[A+(ar[r>>2]<<1)>>1]&e)<<16>>16))break;r=r+4|0}return 0|r},function(A,e,r,i){for(A|=0,e|=0,r|=0,i|=0;;){if((0|r)==(0|i)){r=i;break}if(128<=(0|ar[r>>2])>>>0)break;if(A=0|Ul(),!((or[A+(ar[r>>2]<<1)>>1]&e)<<16>>16))break;r=r+4|0}return 0|r},function(A,e,r,i){for(e|=0,r|=0,i|=0;(0|e)!=(0|r);)ar[i>>2]=tr[e>>0],i=i+4|0,e=e+1|0;return 0|r},function(A,e,r,i){var f,n;return e|=0,r|=0,i|=0,ur=(f=ur)+16|0,n=f,ts[31&(A|=0)](n,e,r,i),fA(0|ar[n>>2]),i=0|ar[n>>2],iA(0|i),ur=f,0|i}],Lb=[Ib,function(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f=+f;var n,t,o,a,c,l,u,b,s,d,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0;return m=ur=(d=ur)+31&-32,ur=ur+176|0,u=m+72|0,o=m+48|0,t=m+32|0,h=m+24|0,k=m+8|0,c=(n=m)+134|0,a=m+68|0,l=m+76|0,s=m+64|0,b=m+60|0,m=m+56|0,ar[(w=n)>>2]=37,w=(ar[w+4>>2]=0)|dr(n+1|0,79659,0|ar[r+4>>2]),ar[a>>2]=c,A=0|dn(),29<(0|(A=w?(ar[k>>2]=ar[r+8>>2],Q[k+8>>3]=f,0|fr(c,30,A,n,k)):(Q[h>>3]=f,0|fr(c,30,A,n,h))))?(A=0|dn(),k=w?(ar[t>>2]=ar[r+8>>2],Q[8+t>>3]=f,0|kr(a,A,n,t)):(Q[o>>3]=f,0|kr(a,A,n,o)),(A=0|ar[a>>2])?(v=k,y=p=A):gu()):(v=A,y=(p=0)|ar[a>>2]),h=0|nr(y,k=y+v|0,r),(0|y)!=(0|c)?(A=0|yc(v<<1))?Z=g=A:gu():(g=l,Z=0),Tf(u,r),hr(y,h,k,g,s,b,u),bn(u),ar[m>>2]=ar[e>>2],e=0|ar[s>>2],y=0|ar[b>>2],ar[u>>2]=ar[m>>2],y=0|PA(u,g,e,y,r,i),Bc(Z),Bc(p),ur=d,0|y},function(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f=+f;var n,t,o,a,c,l,u,b,s,d,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0;return m=ur=(d=ur)+31&-32,ur=ur+176|0,u=m+72|0,o=m+48|0,t=m+32|0,h=m+24|0,k=m+8|0,c=(n=m)+134|0,a=m+68|0,l=m+76|0,s=m+64|0,b=m+60|0,m=m+56|0,ar[(w=n)>>2]=37,w=(ar[w+4>>2]=0)|dr(n+1|0,53897,0|ar[r+4>>2]),ar[a>>2]=c,A=0|dn(),29<(0|(A=w?(ar[k>>2]=ar[r+8>>2],Q[k+8>>3]=f,0|fr(c,30,A,n,k)):(Q[h>>3]=f,0|fr(c,30,A,n,h))))?(A=0|dn(),k=w?(ar[t>>2]=ar[r+8>>2],Q[8+t>>3]=f,0|kr(a,A,n,t)):(Q[o>>3]=f,0|kr(a,A,n,o)),(A=0|ar[a>>2])?(v=k,y=p=A):gu()):(v=A,y=(p=0)|ar[a>>2]),h=0|nr(y,k=y+v|0,r),(0|y)!=(0|c)?(A=0|yc(v<<1))?Z=g=A:gu():(g=l,Z=0),Tf(u,r),hr(y,h,k,g,s,b,u),bn(u),ar[m>>2]=ar[e>>2],e=0|ar[s>>2],y=0|ar[b>>2],ar[u>>2]=ar[m>>2],y=0|PA(u,g,e,y,r,i),Bc(Z),Bc(p),ur=d,0|y},function(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f=+f;var n,t,o,a,c,l,u,b,s,d,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0;m=ur=(d=ur)+31&-32,ur=ur+336|0,u=m+300|0,o=m+48|0,t=m+32|0,h=m+24|0,k=m+8|0,c=(n=m)+304|0,a=m+296|0,l=m+68|0,s=m+64|0,b=m+60|0,m=m+56|0,ar[(w=n)>>2]=37,w=(ar[w+4>>2]=0)|dr(n+1|0,79659,0|ar[r+4>>2]),ar[a>>2]=c,A=0|dn(),29<(0|(A=w?(ar[k>>2]=ar[r+8>>2],Q[k+8>>3]=f,0|fr(c,30,A,n,k)):(Q[h>>3]=f,0|fr(c,30,A,n,h))))?(A=0|dn(),k=w?(ar[t>>2]=ar[r+8>>2],Q[8+t>>3]=f,0|kr(a,A,n,t)):(Q[o>>3]=f,0|kr(a,A,n,o)),(A=0|ar[a>>2])?(v=k,Z=y=A):gu()):(v=A,Z=(y=0)|ar[a>>2]),h=0|nr(Z,k=Z+v|0,r);do{if((0|Z)!=(0|c)){if(A=0|yc(v<<3)){p=0,B=g=A;break}gu()}else g=l,p=1,B=0}while(0);return Tf(u,r),Zr(Z,h,k,g,s,b,u),bn(u),ar[m>>2]=ar[e>>2],Z=0|ar[s>>2],A=0|ar[b>>2],ar[u>>2]=ar[m>>2],A=0|mr(u,g,Z,A,r,i),ar[e>>2]=A,p||Bc(B),Bc(y),ur=d,0|A},function(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f=+f;var n,t,o,a,c,l,u,b,s,d,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0;m=ur=(d=ur)+31&-32,ur=ur+336|0,u=m+300|0,o=m+48|0,t=m+32|0,h=m+24|0,k=m+8|0,c=(n=m)+304|0,a=m+296|0,l=m+68|0,s=m+64|0,b=m+60|0,m=m+56|0,ar[(w=n)>>2]=37,w=(ar[w+4>>2]=0)|dr(n+1|0,53897,0|ar[r+4>>2]),ar[a>>2]=c,A=0|dn(),29<(0|(A=w?(ar[k>>2]=ar[r+8>>2],Q[k+8>>3]=f,0|fr(c,30,A,n,k)):(Q[h>>3]=f,0|fr(c,30,A,n,h))))?(A=0|dn(),k=w?(ar[t>>2]=ar[r+8>>2],Q[8+t>>3]=f,0|kr(a,A,n,t)):(Q[o>>3]=f,0|kr(a,A,n,o)),(A=0|ar[a>>2])?(v=k,Z=y=A):gu()):(v=A,Z=(y=0)|ar[a>>2]),h=0|nr(Z,k=Z+v|0,r);do{if((0|Z)!=(0|c)){if(A=0|yc(v<<3)){p=0,B=g=A;break}gu()}else g=l,p=1,B=0}while(0);return Tf(u,r),Zr(Z,h,k,g,s,b,u),bn(u),ar[m>>2]=ar[e>>2],Z=0|ar[s>>2],A=0|ar[b>>2],ar[u>>2]=ar[m>>2],A=0|mr(u,g,Z,A,r,i),ar[e>>2]=A,p||Bc(B),Bc(y),ur=d,0|A},Ib,Ib,Ib],Kb=[Cb,function(A,e,r,i,f){A|=0,r|=0,i|=0,f|=0;var n=0,t=0;for(A=e|=0;;){if((0|i)==(0|f)){t=7;break}if((0|A)==(0|r)){A=-1;break}if((e=0|tr[A>>0])<<24>>24<(n=0|tr[i>>0])<<24>>24){A=-1;break}if(n<<24>>24<e<<24>>24){A=1;break}i=i+1|0,A=A+1|0}return 7==(0|t)&&(A=(0|A)!=(0|r)&1),0|A},function(A,e,r,i,f){A|=0,r|=0,i|=0,f|=0;var n=0,t=0;for(A=e|=0;;){if((0|i)==(0|f)){t=7;break}if((0|A)==(0|r)){A=-1;break}if((0|(e=0|ar[A>>2]))<(0|(n=0|ar[i>>2]))){A=-1;break}if((0|n)<(0|e)){A=1;break}i=i+4|0,A=A+4|0}return 7==(0|t)&&(A=(0|A)!=(0|r)&1),0|A},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o=0,a=0,c=0;if(o=ur=(t=ur)+31&-32,ur=ur+16|0,n=o+4|0,1&ar[(r|=0)+4>>2]){for(Tf(n,r),A=0|un(n,59248),bn(n),r=0|ar[A>>2],f?fs[63&ar[r+24>>2]](n,A):fs[63&ar[r+28>>2]](n,A),(A=0|tr[(a=11+n|0)>>0])<<24>>24<0?(r=A,A=0|ar[n>>2],c=8):f=n;8==(0|c)&&(f=A,A=r),(0|f)!=(((c=A<<24>>24<0)?0|ar[n>>2]:n)+(c?0|ar[4+n>>2]:255&A)|0);)A=0|tr[f>>0],0|(r=0|ar[e>>2])&&0|Mf(A=(0|(o=0|ar[(i=r+24|0)>>2]))==(0|ar[r+28>>2])?(c=0|ar[52+(0|ar[r>>2])>>2],A=0|hf(A),0|Hb[31&c](r,A)):(ar[i>>2]=o+1,0|hf(tr[o>>0]=A)),-1)&&(ar[e>>2]=0),r=0|tr[a>>0],A=f+1|0,c=8;A=0|ar[e>>2],Bu(n)}else c=0|ar[24+(0|ar[A>>2])>>2],ar[o>>2]=ar[e>>2],ar[n>>2]=ar[o>>2],A=0|Kb[31&c](A,n,r,i,1&f);return ur=t,0|A},function(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f|=0;var n,t,o,a,c,l,u=0,b=0;return u=ur=(A=ur)+31&-32,ur=ur+64|0,b=(t=u)+52|0,c=u+39|0,n=u+16|0,a=u+12|0,o=u+4|0,u=u+8|0,tr[b>>0]=0|tr[53902],tr[b+1>>0]=0|tr[53903],tr[b+2>>0]=0|tr[53904],tr[b+3>>0]=0|tr[53905],tr[b+4>>0]=0|tr[53906],tr[b+5>>0]=0|tr[53907],wr(b+1|0,53908,1,0|ar[r+4>>2]),l=0|dn(),ar[t>>2]=f,b=0|nr(c,f=c+(0|fr(c,13,l,b,t))|0,r),Tf(t,r),vr(c,b,f,n,a,o,t),bn(t),ar[u>>2]=ar[e>>2],e=0|ar[a>>2],f=0|ar[o>>2],ar[t>>2]=ar[u>>2],f=0|PA(t,n,e,f,r,i),ur=A,0|f},function(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f|=0;var n,t,o,a,c,l,u=0,b=0;return u=ur=(A=ur)+31&-32,ur=ur+64|0,b=(t=u)+52|0,c=u+40|0,n=u+16|0,a=u+12|0,o=u+4|0,u=u+8|0,tr[b>>0]=0|tr[53902],tr[b+1>>0]=0|tr[53903],tr[b+2>>0]=0|tr[53904],tr[b+3>>0]=0|tr[53905],tr[b+4>>0]=0|tr[53906],tr[b+5>>0]=0|tr[53907],wr(b+1|0,53908,0,0|ar[r+4>>2]),l=0|dn(),ar[t>>2]=f,b=0|nr(c,f=c+(0|fr(c,12,l,b,t))|0,r),Tf(t,r),vr(c,b,f,n,a,o,t),bn(t),ar[u>>2]=ar[e>>2],e=0|ar[a>>2],f=0|ar[o>>2],ar[t>>2]=ar[u>>2],f=0|PA(t,n,e,f,r,i),ur=A,0|f},function(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f|=0;var n,t,o,a,c=0,l=0,u=0;return u=ur=(A=ur)+31&-32,ur=ur+80|0,l=(o=u)+68|0,n=u+48|0,t=u+8|0,u=u+4|0,tr[l>>0]=0|tr[53891],tr[l+1>>0]=0|tr[53892],tr[l+2>>0]=0|tr[53893],tr[l+3>>0]=0|tr[53894],tr[l+4>>0]=0|tr[53895],tr[l+5>>0]=0|tr[53896],c=0|dn(),ar[o>>2]=f,c=0|nr(n,l=n+(f=0|fr(n,20,c,l,o))|0,r),Tf(o,r),a=0|un(o,59232),bn(o),Pb[7&ar[32+(0|ar[a>>2])>>2]](a,n,l,t),f=t+f|0,ar[u>>2]=ar[e>>2],ar[o>>2]=ar[u>>2],f=0|PA(o,t,(0|c)==(0|l)?f:c-n+t|0,f,r,i),ur=A,0|f},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o=0,a=0,c=0;if(o=ur=(t=ur)+31&-32,ur=ur+16|0,n=o+4|0,1&ar[(r|=0)+4>>2]){for(Tf(n,r),A=0|un(n,59272),bn(n),r=0|ar[A>>2],f?fs[63&ar[r+24>>2]](n,A):fs[63&ar[r+28>>2]](n,A),A=0|tr[(a=8+n+3|0)>>0],r=0|ar[n>>2],c=4+n|0,f=A<<24>>24<0?r:n;(0|f)!=(((o=A<<24>>24<0)?r:n)+((o?0|ar[c>>2]:255&A)<<2)|0);)A=0|ar[f>>2],0|(r=0|ar[e>>2])&&0|Uf(A=(0|(o=0|ar[(i=r+24|0)>>2]))==(0|ar[r+28>>2])?(o=0|ar[52+(0|ar[r>>2])>>2],A=0|gf(A),0|Hb[31&o](r,A)):(ar[i>>2]=o+4,0|gf(ar[o>>2]=A)),-1)&&(ar[e>>2]=0),f=f+4|0,A=0|tr[a>>0],r=0|ar[n>>2];A=0|ar[e>>2],Qu(n)}else c=0|ar[24+(0|ar[A>>2])>>2],ar[o>>2]=ar[e>>2],ar[n>>2]=ar[o>>2],A=0|Kb[31&c](A,n,r,i,1&f);return ur=t,0|A},function(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f|=0;var n,t,o,a,c,l,u=0,b=0;return u=ur=(A=ur)+31&-32,ur=ur+128|0,b=(t=u)+122|0,c=u+108|0,n=u+16|0,a=u+12|0,o=u+4|0,u=u+8|0,tr[b>>0]=0|tr[53902],tr[b+1>>0]=0|tr[53903],tr[b+2>>0]=0|tr[53904],tr[b+3>>0]=0|tr[53905],tr[b+4>>0]=0|tr[53906],tr[b+5>>0]=0|tr[53907],wr(b+1|0,53908,1,0|ar[r+4>>2]),l=0|dn(),ar[t>>2]=f,b=0|nr(c,f=c+(0|fr(c,13,l,b,t))|0,r),Tf(t,r),pr(c,b,f,n,a,o,t),bn(t),ar[u>>2]=ar[e>>2],e=0|ar[a>>2],f=0|ar[o>>2],ar[t>>2]=ar[u>>2],f=0|mr(t,n,e,f,r,i),ur=A,0|f},function(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f|=0;var n,t,o,a,c,l,u=0,b=0;return u=ur=(A=ur)+31&-32,ur=ur+128|0,b=(t=u)+112|0,c=u+100|0,n=u+16|0,a=u+12|0,o=u+4|0,u=u+8|0,tr[b>>0]=0|tr[53902],tr[b+1>>0]=0|tr[53903],tr[b+2>>0]=0|tr[53904],tr[b+3>>0]=0|tr[53905],tr[b+4>>0]=0|tr[53906],tr[b+5>>0]=0|tr[53907],wr(b+1|0,53908,0,0|ar[r+4>>2]),l=0|dn(),ar[t>>2]=f,b=0|nr(c,f=c+(0|fr(c,12,l,b,t))|0,r),Tf(t,r),pr(c,b,f,n,a,o,t),bn(t),ar[u>>2]=ar[e>>2],e=0|ar[a>>2],f=0|ar[o>>2],ar[t>>2]=ar[u>>2],f=0|mr(t,n,e,f,r,i),ur=A,0|f},function(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f|=0;var n,t,o,a,c=0,l=0,u=0;return u=ur=(A=ur)+31&-32,ur=ur+192|0,l=(o=u)+176|0,n=u+156|0,t=u+4|0,u=u+152|0,tr[l>>0]=0|tr[53891],tr[l+1>>0]=0|tr[53892],tr[l+2>>0]=0|tr[53893],tr[l+3>>0]=0|tr[53894],tr[l+4>>0]=0|tr[53895],tr[l+5>>0]=0|tr[53896],c=0|dn(),ar[o>>2]=f,c=0|nr(n,l=n+(f=0|fr(n,20,c,l,o))|0,r),Tf(o,r),a=0|un(o,59264),bn(o),Pb[7&ar[48+(0|ar[a>>2])>>2]](a,n,l,t),f=t+(f<<2)|0,ar[u>>2]=ar[e>>2],ar[o>>2]=ar[u>>2],f=0|mr(o,t,(0|c)==(0|l)?f:t+(c-n<<2)|0,f,r,i),ur=A,0|f},function(A,e,r,i,f){return r|=0,ar[(f|=0)>>2]=r,3},function(A,e,r,i,f){return 0|function(A,e,r,i,f){r|=0,i|=0;var n,t,o=0,a=0,c=0,l=0,u=0,b=0,s=0;2<((n=e|=0)-(t=A|=0)|0)&0!=(4&(f|=0)|0)&&-17==(0|tr[A>>0])&&-69==(0|tr[A+1>>0])?A=-65==((s=0)|tr[A+2>>0])?A+3|0:A:s=0;A:for(;;){if(!(s>>>0<r>>>0&A>>>0<e>>>0)){0;break}l=0|tr[A>>0],b=255&l,o=A+1|0;do{if(-1<l<<24>>24){if(i>>>0<b>>>0){0;break A}A=o}else{if((255&l)<194){0;break A}if(a=A+2|0,f=n-(u=A)|0,(255&l)<224){if((0|f)<2){0;break A}if(128!=(192&(f=0|cr[o>>0])|0)){0;break A}if(i>>>0<(63&f|b<<6&1984)>>>0){0;break A}A=a;break}if(c=A+3|0,(255&l)<240){if((0|f)<3){0;break A}switch(a=0|tr[a>>0],o=0|cr[o>>0],f=224&o,l<<24>>24){case-32:if(160==(0|f))break;A=u;break A;case-19:if(128==(0|f))break;A=u;break A;default:if(128!=(192&o|0)){A=u;break A}}if(128!=(192&(f=255&a)|0)){0;break A}if(i>>>0<(o<<6&4032|b<<12&61440|63&f)>>>0){0;break A}A=c;break}if((0|f)<4|244<(255&l)){0;break A}switch(o=0|tr[o>>0],f=0|tr[a>>0],a=0|tr[c>>0],c=255&o,l<<24>>24){case-16:if(48<=(o+112&255)){A=u;break A}break;case-12:if(128==(240&c|0))break;A=u;break A;default:if(128!=(192&c|0)){A=u;break A}}if(128!=(192&(o=255&f)|0)){0;break A}if(128!=(192&(f=255&a)|0)){0;break A}if(i>>>0<(c<<12&258048|b<<18&1835008|o<<6&4032|63&f)>>>0){0;break A}A=A+4|0}}while(0);s=s+1|0}return A-t|0}(r|=0,i|=0,f|=0,1114111,0)},function(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0;var n,t=0;t=ur=(n=ur)+31&-32,ur=ur+16|0,ar[(f|=0)>>2]=r,r=0|rf(0|ar[A+8>>2]),A=0|$c(t,0),0|r&&rf(r);A:do{switch(0|A){case 0:case-1:A=2;break;default:if((A=A+-1|0)>>>0>(i-(0|ar[f>>2])|0)>>>0)A=1;else for(;;){if(!A){A=0;break A}e=0|tr[t>>0],i=0|ar[f>>2],ar[f>>2]=i+1,tr[i>>0]=e,t=t+1|0,A=A+-1|0}}}while(0);return ur=n,0|A},function(A,e,r,i,f){e|=0,r|=0,f|=0;var n,t,o,a,c,l=0,u=0,b=0;t=i|=0,n=(A|=0)+8|0,b=u=0;A:for(;!((0|r)==(0|i)|f>>>0<=u>>>0);){switch(l=0|rf(0|ar[n>>2]),A=0|(a=t-(o=r)|0,c=e,0|Gi(0,o|=0,a|=0,0|(c|=0)?c:58156)),0|l&&rf(l),0|A){case-2:case-1:break A;case 0:A=1}u=u+1|0,b=A+b|0,r=r+A|0}return 0|b},function(A,e,r,i,f){for(A|=0,e|=0,r|=0,i|=0,f|=0;(0|e)!=(0|r);)A=0|tr[e>>0],tr[f>>0]=-1<A<<24>>24?A:i,f=f+1|0,e=e+1|0;return 0|r},function(A,e,r,i,f){A|=0,i|=0;var n,t=0;for(n=((r|=0)-(e|=0)|0)>>>2,A=f|=0,f=e;(0|f)!=(0|r);)t=0|ar[f>>2],tr[A>>0]=t>>>0<128?255&t:i,A=A+1|0,f=f+4|0;return e+(n<<2)|0},function(A,e,r,i,f){return r|=0,ar[(f|=0)>>2]=r,3},function(A,e,r,i,f){return 0|((i=(i|=0)-(r|=0)|0)>>>0<(f|=0)>>>0?i:f)},function(A,e,r,i,f){return r|=0,ar[(f|=0)>>2]=r,3},function(A,e,r,i,f){return 0|function(A,e,r,i,f){r|=0,i|=0;var n,t,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0;2<((n=e|=0)-(t=A|=0)|0)&0!=(4&(f|=0)|0)&&-17==(0|tr[A>>0])&&-69==(0|tr[A+1>>0])?A=-65==((d=0)|tr[A+2>>0])?A+3|0:A:d=0;A:for(;;){if(!(d>>>0<r>>>0&A>>>0<e>>>0)){0;break}if(l=0|tr[A>>0],i>>>0<(s=255&l)>>>0){0;break}a=A+1|0;do{if(l<<24>>24<=-1){if((255&l)<194){0;break A}if(c=A+2|0,f=n-(u=A)|0,(255&l)<224){if((0|f)<2){0;break A}if(128!=(192&(f=0|cr[a>>0])|0)){0;break A}if(i>>>0<(63&f|s<<6&1984)>>>0){0;break A}f=d,A=c;break}if(b=A+3|0,(255&l)<240){if((0|f)<3){0;break A}switch(o=0|tr[c>>0],a=0|cr[a>>0],f=224&a,l<<24>>24){case-32:if(160==(0|f))break;A=u;break A;case-19:if(128==(0|f))break;A=u;break A;default:if(128!=(192&a|0)){A=u;break A}}if(128!=(192&(f=255&o)|0)){0;break A}if(i>>>0<(a<<6&4032|s<<12&61440|63&f)>>>0){0;break A}f=d,A=b;break}if(245<=(255&l)){0;break A}if((r-d|0)>>>0<2|(0|f)<4){0;break A}switch(o=0|tr[a>>0],f=0|tr[c>>0],a=0|tr[b>>0],c=255&o,l<<24>>24){case-16:if(48<=(o+112&255)){A=u;break A}break;case-12:if(128==(240&c|0))break;A=u;break A;default:if(128!=(192&c|0)){A=u;break A}}if(128!=(192&(o=255&f)|0)){0;break A}if(128!=(192&(f=255&a)|0)){0;break A}if(i>>>0<(c<<12&258048|s<<18&1835008|o<<6&4032|63&f)>>>0){0;break A}f=d+1|0,A=A+4|0}else f=d,A=a}while(0);d=f+1|0}return A-t|0}(r|=0,i|=0,f|=0,1114111,0)},Cb,Cb,Cb,Cb,Cb,Cb,Cb,Cb,Cb,Cb,Cb],qb=[Gb,function(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n=+n;var t,o,a,c,l,u,b,s,d,k,h,w,v,m,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0;for(B=ur=(m=ur)+31&-32,ur=ur+384|0,c=B+8|0,A=(Z=B)+284|0,p=B+72|0,g=B+184|0,v=B+68|0,l=B+180|0,u=B+177|0,b=B+176|0,k=B+56|0,h=B+44|0,w=B+32|0,o=B+28|0,a=B+76|0,s=B+24|0,d=B+16|0,B=B+20|0,ar[p>>2]=A,Q[c>>3]=n,99<(A=0|_c(A,100,55168,c))>>>0?(A=0|dn(),Q[Z>>3]=n,A=0|kr(p,A,55168,Z),(g=0|ar[p>>2])||gu(),(Z=0|yc(A))?(W=A,C=E=Z,G=g):gu()):(E=g,W=A,G=C=0),Tf(v,i),t=0|un(v,59232),y=0|ar[p>>2],Pb[7&ar[32+(0|ar[t>>2])>>2]](t,y,y+W|0,E),y=W?45==(0|tr[ar[p>>2]>>0]):0,ar[k>>2]=0,ar[4+k>>2]=0,A=ar[8+k>>2]=0;3!=(0|A);)A=A+1|(ar[k+(A<<2)>>2]=0);for(ar[h>>2]=0,ar[4+h>>2]=0,A=ar[8+h>>2]=0;3!=(0|A);)A=A+1|(ar[h+(A<<2)>>2]=0);for(ar[w>>2]=0,ar[4+w>>2]=0,A=ar[8+w>>2]=0;3!=(0|A);)A=A+1|(ar[w+(A<<2)>>2]=0);return ki(r,y,v,l,u,b,k,h,w,o),100<(A=(Z=(0|(p=0|ar[o>>2]))<(0|W)?(g=0|tr[11+w>>0],Z=0|tr[11+h>>0],A=1,g=(g<<24>>24<0?0|ar[4+w>>2]:255&g)+(W-p<<1)|0,Z<<24>>24<0?0|ar[4+h>>2]:255&Z):(Z=0|tr[11+w>>0],A=2,g=(g=0|tr[11+h>>0])<<24>>24<0?0|ar[4+h>>2]:255&g,Z<<24>>24<0?0|ar[4+w>>2]:255&Z))+p+g+A|0)>>>0?(A=0|yc(A))?I=X=A:gu():(X=a,I=0),hi(X,s,d,0|ar[i+4>>2],E,E+W|0,t,y,l,0|tr[u>>0],0|tr[b>>0],k,h,w,p),ar[B>>2]=ar[e>>2],e=0|ar[s>>2],A=0|ar[d>>2],ar[c>>2]=ar[B>>2],A=0|PA(c,X,e,A,i,f),0|I&&Bc(I),Bu(w),Bu(h),Bu(k),bn(v),0|C&&Bc(C),0|G&&Bc(G),ur=m,0|A},function(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n=+n;var t,o,a,c,l,u,b,s,d,k,h,w,v,m,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0;for(B=ur=(m=ur)+31&-32,ur=ur+1008|0,c=B+8|0,A=(Z=B)+896|0,p=B+888|0,g=B+488|0,v=B+480|0,l=B+892|0,u=B+476|0,b=B+472|0,k=B+460|0,h=B+448|0,w=B+436|0,o=B+432|0,a=B+32|0,s=B+24|0,d=B+16|0,B=B+20|0,ar[p>>2]=A,Q[c>>3]=n,99<(A=0|_c(A,100,55168,c))>>>0?(A=0|dn(),Q[Z>>3]=n,A=0|kr(p,A,55168,Z),(g=0|ar[p>>2])||gu(),(Z=0|yc(A<<2))?(W=A,C=E=Z,G=g):gu()):(E=g,W=A,G=C=0),Tf(v,i),t=0|un(v,59264),y=0|ar[p>>2],Pb[7&ar[48+(0|ar[t>>2])>>2]](t,y,y+W|0,E),y=W?45==(0|tr[ar[p>>2]>>0]):0,ar[k>>2]=0,ar[4+k>>2]=0,A=ar[8+k>>2]=0;3!=(0|A);)A=A+1|(ar[k+(A<<2)>>2]=0);for(ar[h>>2]=0,ar[4+h>>2]=0,A=ar[8+h>>2]=0;3!=(0|A);)A=A+1|(ar[h+(A<<2)>>2]=0);for(ar[w>>2]=0,ar[4+w>>2]=0,A=ar[8+w>>2]=0;3!=(0|A);)A=A+1|(ar[w+(A<<2)>>2]=0);return _l(r,y,v,l,u,b,k,h,w,o),100<(A=(Z=(0|(p=0|ar[o>>2]))<(0|W)?(g=0|tr[8+w+3>>0],Z=0|tr[8+h+3>>0],A=1,g=(g<<24>>24<0?0|ar[4+w>>2]:255&g)+(W-p<<1)|0,Z<<24>>24<0?0|ar[4+h>>2]:255&Z):(Z=0|tr[8+w+3>>0],A=2,g=(g=0|tr[8+h+3>>0])<<24>>24<0?0|ar[4+h>>2]:255&g,Z<<24>>24<0?0|ar[4+w>>2]:255&Z))+p+g+A|0)>>>0?(A=0|yc(A<<2))?I=X=A:gu():(X=a,I=0),Yl(X,s,d,0|ar[i+4>>2],E,E+(W<<2)|0,t,y,l,0|ar[u>>2],0|ar[b>>2],k,h,w,p),ar[B>>2]=ar[e>>2],e=0|ar[s>>2],A=0|ar[d>>2],ar[c>>2]=ar[B>>2],A=0|mr(c,X,e,A,i,f),0|I&&Bc(I),Qu(w),Qu(h),Bu(k),bn(v),0|C&&Bc(C),0|G&&Bc(G),ur=m,0|A},Gb],$b=[Vb,function(A,e,r,i,f,n){A|=0,e|=0,r|=0,f|=0,n|=0;var t,o,a,c=0,l=0,u=0,b=0;if(u=ur=(a=ur)+31&-32,ur=ur+48|0,c=u+40|0,b=u+16|0,t=u+8|0,o=u+12|0,l=u+4|0,1&ar[(i|=0)+4>>2])for(Tf(c,i),l=0|un(c,59232),bn(c),Tf(c,i),A=0|un(c,59248),bn(c),fs[63&ar[24+(0|ar[A>>2])>>2]](b,A),fs[63&ar[28+(0|ar[A>>2])>>2]](b+12|0,A),ar[u>>2]=ar[r>>2],A=b+24|0,ar[c>>2]=ar[u>>2],c=(0|Vn(e,c,b,A,l,f,1))==(0|b)&1,tr[n>>0]=c,c=0|ar[e>>2];Bu(A=A+-12|0),(0|A)!=(0|b););else{switch(ar[t>>2]=-1,u=0|ar[16+(0|ar[A>>2])>>2],ar[o>>2]=ar[e>>2],ar[l>>2]=ar[r>>2],ar[b>>2]=ar[o>>2],ar[c>>2]=ar[l>>2],b=0|$b[63&u](A,b,c,i,f,t),ar[e>>2]=b,0|ar[t>>2]){case 0:tr[n>>0]=0;break;case 1:tr[n>>0]=1;break;default:tr[n>>0]=1,ar[f>>2]=4}c=0|ar[e>>2]}return ur=a,0|c},function(A,e,r,i,f,n){var t,o,a,c,l;return A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,c=ur=(t=ur)+31&-32,ur=ur+16|0,o=12+c|0,a=8+c|0,ar[(l=4+c|0)>>2]=ar[e>>2],ar[c>>2]=ar[r>>2],ar[a>>2]=ar[l>>2],ar[o>>2]=ar[c>>2],n=0|function(A,e,r,i,f,n){A|=0,e|=0,r|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0;y=ur=(h=ur)+31&-32,ur=ur+224|0,c=y+198|0,p=y+196|0,d=y+184|0,k=y+172|0,l=y+168|0,u=y+8|0,b=y+4|0,s=0|yn(i|=0),Bn(d,i,c,p),ar[k>>2]=0,ar[4+k>>2]=0,ar[8+k>>2]=0,A=0;for(;3!=(0|A);)ar[k+(A<<2)>>2]=0,A=A+1|0;a=8+k|0,A=(0|tr[(o=11+k|0)>>0])<0?(2147483647&ar[a>>2])-1|0:10;Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[l>>2]=A,ar[b>>2]=u,ar[y>>2]=0,t=4+k|0,v=0|ar[e>>2],w=v;A:for(;;){m=w?0|Mf(i=(0|(i=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|hf(0|tr[i>>0]),-1)?(ar[e>>2]=0,v=Z=0,1):(Z=w,0):(v=Z=0,1),w=0|ar[r>>2];do{if(w){if(0|Mf(i=(0|(i=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|hf(0|tr[i>>0]),-1)){ar[r>>2]=0,E=19;break}if(m)break;break A}E=19}while(0);if(19==(0|E)){if(E=0,m){w=0;break}w=0}if(i=(i=0|tr[o>>0])<<24>>24<0?0|ar[t>>2]:255&i,(0|ar[l>>2])==(A+i|0)&&(Vu(k,i<<1,0),A=(0|tr[o>>0])<0?(2147483647&ar[a>>2])-1|0:10,Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[l>>2]=A+i),0|sn(255&(i=(0|(i=0|ar[(m=Z+12|0)>>2]))==(0|ar[(g=Z+16|0)>>2])?0|jb[127&ar[36+(0|ar[Z>>2])>>2]](Z):0|hf(0|tr[i>>0])),s,A,l,y,0|tr[p>>0],d,u,b,c))break;(0|(i=0|ar[m>>2]))!=(0|ar[g>>2])?(ar[m>>2]=i+1,hf(0|tr[i>>0]),w=Z):(jb[127&ar[40+(0|ar[Z>>2])>>2]](Z),w=Z)}0|((p=0|tr[11+d>>0])<<24>>24<0?0|ar[4+d>>2]:255&p)&&((B=0|ar[b>>2])-u|0)<160&&(y=0|ar[y>>2],ar[b>>2]=B+4,ar[B>>2]=y);B=0|Gn(A,0|ar[l>>2],f,s),ar[n>>2]=B,gn(d,u,0|ar[b>>2],f),i=Z?(A=(0|(A=0|ar[Z+12>>2]))==(0|ar[Z+16>>2])?0|jb[127&ar[36+(0|ar[v>>2])>>2]](Z):0|hf(0|tr[A>>0]),0|Mf(A,-1)?(ar[e>>2]=0,1):0):1;do{if(w){if(0|Mf(A=(0|(A=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|hf(0|tr[A>>0]),-1)){ar[r>>2]=0,E=47;break}if(i)break;E=49;break}E=47}while(0);47==(0|E)&&i&&(E=49);49==(0|E)&&(ar[f>>2]=2|ar[f>>2]);return E=0|ar[e>>2],Bu(k),Bu(d),ur=h,0|E}(A,a,o,i,f,n),ur=t,0|n},function(A,e,r,i,f,n){var t,o,a,c,l;return A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,c=ur=(t=ur)+31&-32,ur=ur+16|0,o=12+c|0,a=8+c|0,ar[(l=4+c|0)>>2]=ar[e>>2],ar[c>>2]=ar[r>>2],ar[a>>2]=ar[l>>2],ar[o>>2]=ar[c>>2],n=0|function(A,e,r,i,f,n){A|=0,e|=0,r|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0;y=ur=(h=ur)+31&-32,ur=ur+224|0,c=y+198|0,p=y+196|0,d=y+184|0,k=y+172|0,l=y+168|0,u=y+8|0,b=y+4|0,s=0|yn(i|=0),Bn(d,i,c,p),ar[k>>2]=0,ar[4+k>>2]=0,ar[8+k>>2]=0,A=0;for(;3!=(0|A);)ar[k+(A<<2)>>2]=0,A=A+1|0;a=8+k|0,A=(0|tr[(o=11+k|0)>>0])<0?(2147483647&ar[a>>2])-1|0:10;Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[l>>2]=A,ar[b>>2]=u,ar[y>>2]=0,t=4+k|0,v=0|ar[e>>2],w=v;A:for(;;){m=w?0|Mf(i=(0|(i=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|hf(0|tr[i>>0]),-1)?(ar[e>>2]=0,v=Z=0,1):(Z=w,0):(v=Z=0,1),w=0|ar[r>>2];do{if(w){if(0|Mf(i=(0|(i=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|hf(0|tr[i>>0]),-1)){ar[r>>2]=0,E=19;break}if(m)break;break A}E=19}while(0);if(19==(0|E)){if(E=0,m){w=0;break}w=0}if(i=(i=0|tr[o>>0])<<24>>24<0?0|ar[t>>2]:255&i,(0|ar[l>>2])==(A+i|0)&&(Vu(k,i<<1,0),A=(0|tr[o>>0])<0?(2147483647&ar[a>>2])-1|0:10,Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[l>>2]=A+i),0|sn(255&(i=(0|(i=0|ar[(m=Z+12|0)>>2]))==(0|ar[(g=Z+16|0)>>2])?0|jb[127&ar[36+(0|ar[Z>>2])>>2]](Z):0|hf(0|tr[i>>0])),s,A,l,y,0|tr[p>>0],d,u,b,c))break;(0|(i=0|ar[m>>2]))!=(0|ar[g>>2])?(ar[m>>2]=i+1,hf(0|tr[i>>0]),w=Z):(jb[127&ar[40+(0|ar[Z>>2])>>2]](Z),w=Z)}0|((p=0|tr[11+d>>0])<<24>>24<0?0|ar[4+d>>2]:255&p)&&((B=0|ar[b>>2])-u|0)<160&&(y=0|ar[y>>2],ar[b>>2]=B+4,ar[B>>2]=y);B=0|Cn(A,0|ar[l>>2],f,s),ar[n>>2]=B,ar[n+4>>2]=D,gn(d,u,0|ar[b>>2],f),i=Z?(A=(0|(A=0|ar[Z+12>>2]))==(0|ar[Z+16>>2])?0|jb[127&ar[36+(0|ar[v>>2])>>2]](Z):0|hf(0|tr[A>>0]),0|Mf(A,-1)?(ar[e>>2]=0,1):0):1;do{if(w){if(0|Mf(A=(0|(A=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|hf(0|tr[A>>0]),-1)){ar[r>>2]=0,E=47;break}if(i)break;E=49;break}E=47}while(0);47==(0|E)&&i&&(E=49);49==(0|E)&&(ar[f>>2]=2|ar[f>>2]);return E=0|ar[e>>2],Bu(k),Bu(d),ur=h,0|E}(A,a,o,i,f,n),ur=t,0|n},function(A,e,r,i,f,n){var t,o,a,c,l;return A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,c=ur=(t=ur)+31&-32,ur=ur+16|0,o=12+c|0,a=8+c|0,ar[(l=4+c|0)>>2]=ar[e>>2],ar[c>>2]=ar[r>>2],ar[a>>2]=ar[l>>2],ar[o>>2]=ar[c>>2],n=0|function(A,e,r,i,f,n){A|=0,e|=0,r|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0;y=ur=(h=ur)+31&-32,ur=ur+224|0,c=y+198|0,p=y+196|0,d=y+184|0,k=y+172|0,l=y+168|0,u=y+8|0,b=y+4|0,s=0|yn(i|=0),Bn(d,i,c,p),ar[k>>2]=0,ar[4+k>>2]=0,ar[8+k>>2]=0,A=0;for(;3!=(0|A);)ar[k+(A<<2)>>2]=0,A=A+1|0;a=8+k|0,A=(0|tr[(o=11+k|0)>>0])<0?(2147483647&ar[a>>2])-1|0:10;Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[l>>2]=A,ar[b>>2]=u,ar[y>>2]=0,t=4+k|0,v=0|ar[e>>2],w=v;A:for(;;){m=w?0|Mf(i=(0|(i=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|hf(0|tr[i>>0]),-1)?(ar[e>>2]=0,v=Z=0,1):(Z=w,0):(v=Z=0,1),w=0|ar[r>>2];do{if(w){if(0|Mf(i=(0|(i=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|hf(0|tr[i>>0]),-1)){ar[r>>2]=0,E=19;break}if(m)break;break A}E=19}while(0);if(19==(0|E)){if(E=0,m){w=0;break}w=0}if(i=(i=0|tr[o>>0])<<24>>24<0?0|ar[t>>2]:255&i,(0|ar[l>>2])==(A+i|0)&&(Vu(k,i<<1,0),A=(0|tr[o>>0])<0?(2147483647&ar[a>>2])-1|0:10,Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[l>>2]=A+i),0|sn(255&(i=(0|(i=0|ar[(m=Z+12|0)>>2]))==(0|ar[(g=Z+16|0)>>2])?0|jb[127&ar[36+(0|ar[Z>>2])>>2]](Z):0|hf(0|tr[i>>0])),s,A,l,y,0|tr[p>>0],d,u,b,c))break;(0|(i=0|ar[m>>2]))!=(0|ar[g>>2])?(ar[m>>2]=i+1,hf(0|tr[i>>0]),w=Z):(jb[127&ar[40+(0|ar[Z>>2])>>2]](Z),w=Z)}0|((p=0|tr[11+d>>0])<<24>>24<0?0|ar[4+d>>2]:255&p)&&((B=0|ar[b>>2])-u|0)<160&&(y=0|ar[y>>2],ar[b>>2]=B+4,ar[B>>2]=y);B=0|In(A,0|ar[l>>2],f,s),or[n>>1]=B,gn(d,u,0|ar[b>>2],f),i=Z?(A=(0|(A=0|ar[Z+12>>2]))==(0|ar[Z+16>>2])?0|jb[127&ar[36+(0|ar[v>>2])>>2]](Z):0|hf(0|tr[A>>0]),0|Mf(A,-1)?(ar[e>>2]=0,1):0):1;do{if(w){if(0|Mf(A=(0|(A=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|hf(0|tr[A>>0]),-1)){ar[r>>2]=0,E=47;break}if(i)break;E=49;break}E=47}while(0);47==(0|E)&&i&&(E=49);49==(0|E)&&(ar[f>>2]=2|ar[f>>2]);return E=0|ar[e>>2],Bu(k),Bu(d),ur=h,0|E}(A,a,o,i,f,n),ur=t,0|n},function(A,e,r,i,f,n){var t,o,a,c,l;return A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,c=ur=(t=ur)+31&-32,ur=ur+16|0,o=12+c|0,a=8+c|0,ar[(l=4+c|0)>>2]=ar[e>>2],ar[c>>2]=ar[r>>2],ar[a>>2]=ar[l>>2],ar[o>>2]=ar[c>>2],n=0|function(A,e,r,i,f,n){A|=0,e|=0,r|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0;y=ur=(h=ur)+31&-32,ur=ur+224|0,c=y+198|0,p=y+196|0,d=y+184|0,k=y+172|0,l=y+168|0,u=y+8|0,b=y+4|0,s=0|yn(i|=0),Bn(d,i,c,p),ar[k>>2]=0,ar[4+k>>2]=0,ar[8+k>>2]=0,A=0;for(;3!=(0|A);)ar[k+(A<<2)>>2]=0,A=A+1|0;a=8+k|0,A=(0|tr[(o=11+k|0)>>0])<0?(2147483647&ar[a>>2])-1|0:10;Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[l>>2]=A,ar[b>>2]=u,ar[y>>2]=0,t=4+k|0,v=0|ar[e>>2],w=v;A:for(;;){m=w?0|Mf(i=(0|(i=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|hf(0|tr[i>>0]),-1)?(ar[e>>2]=0,v=Z=0,1):(Z=w,0):(v=Z=0,1),w=0|ar[r>>2];do{if(w){if(0|Mf(i=(0|(i=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|hf(0|tr[i>>0]),-1)){ar[r>>2]=0,E=19;break}if(m)break;break A}E=19}while(0);if(19==(0|E)){if(E=0,m){w=0;break}w=0}if(i=(i=0|tr[o>>0])<<24>>24<0?0|ar[t>>2]:255&i,(0|ar[l>>2])==(A+i|0)&&(Vu(k,i<<1,0),A=(0|tr[o>>0])<0?(2147483647&ar[a>>2])-1|0:10,Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[l>>2]=A+i),0|sn(255&(i=(0|(i=0|ar[(m=Z+12|0)>>2]))==(0|ar[(g=Z+16|0)>>2])?0|jb[127&ar[36+(0|ar[Z>>2])>>2]](Z):0|hf(0|tr[i>>0])),s,A,l,y,0|tr[p>>0],d,u,b,c))break;(0|(i=0|ar[m>>2]))!=(0|ar[g>>2])?(ar[m>>2]=i+1,hf(0|tr[i>>0]),w=Z):(jb[127&ar[40+(0|ar[Z>>2])>>2]](Z),w=Z)}0|((p=0|tr[11+d>>0])<<24>>24<0?0|ar[4+d>>2]:255&p)&&((B=0|ar[b>>2])-u|0)<160&&(y=0|ar[y>>2],ar[b>>2]=B+4,ar[B>>2]=y);B=0|Wn(A,0|ar[l>>2],f,s),ar[n>>2]=B,gn(d,u,0|ar[b>>2],f),i=Z?(A=(0|(A=0|ar[Z+12>>2]))==(0|ar[Z+16>>2])?0|jb[127&ar[36+(0|ar[v>>2])>>2]](Z):0|hf(0|tr[A>>0]),0|Mf(A,-1)?(ar[e>>2]=0,1):0):1;do{if(w){if(0|Mf(A=(0|(A=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|hf(0|tr[A>>0]),-1)){ar[r>>2]=0,E=47;break}if(i)break;E=49;break}E=47}while(0);47==(0|E)&&i&&(E=49);49==(0|E)&&(ar[f>>2]=2|ar[f>>2]);return E=0|ar[e>>2],Bu(k),Bu(d),ur=h,0|E}(A,a,o,i,f,n),ur=t,0|n},function(A,e,r,i,f,n){var t,o,a,c,l;return A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,c=ur=(t=ur)+31&-32,ur=ur+16|0,o=12+c|0,a=8+c|0,ar[(l=4+c|0)>>2]=ar[e>>2],ar[c>>2]=ar[r>>2],ar[a>>2]=ar[l>>2],ar[o>>2]=ar[c>>2],n=0|function(A,e,r,i,f,n){A|=0,e|=0,r|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0;y=ur=(h=ur)+31&-32,ur=ur+224|0,c=y+198|0,p=y+196|0,d=y+184|0,k=y+172|0,l=y+168|0,u=y+8|0,b=y+4|0,s=0|yn(i|=0),Bn(d,i,c,p),ar[k>>2]=0,ar[4+k>>2]=0,ar[8+k>>2]=0,A=0;for(;3!=(0|A);)ar[k+(A<<2)>>2]=0,A=A+1|0;a=8+k|0,A=(0|tr[(o=11+k|0)>>0])<0?(2147483647&ar[a>>2])-1|0:10;Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[l>>2]=A,ar[b>>2]=u,ar[y>>2]=0,t=4+k|0,v=0|ar[e>>2],w=v;A:for(;;){m=w?0|Mf(i=(0|(i=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|hf(0|tr[i>>0]),-1)?(ar[e>>2]=0,v=Z=0,1):(Z=w,0):(v=Z=0,1),w=0|ar[r>>2];do{if(w){if(0|Mf(i=(0|(i=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|hf(0|tr[i>>0]),-1)){ar[r>>2]=0,E=19;break}if(m)break;break A}E=19}while(0);if(19==(0|E)){if(E=0,m){w=0;break}w=0}if(i=(i=0|tr[o>>0])<<24>>24<0?0|ar[t>>2]:255&i,(0|ar[l>>2])==(A+i|0)&&(Vu(k,i<<1,0),A=(0|tr[o>>0])<0?(2147483647&ar[a>>2])-1|0:10,Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[l>>2]=A+i),0|sn(255&(i=(0|(i=0|ar[(m=Z+12|0)>>2]))==(0|ar[(g=Z+16|0)>>2])?0|jb[127&ar[36+(0|ar[Z>>2])>>2]](Z):0|hf(0|tr[i>>0])),s,A,l,y,0|tr[p>>0],d,u,b,c))break;(0|(i=0|ar[m>>2]))!=(0|ar[g>>2])?(ar[m>>2]=i+1,hf(0|tr[i>>0]),w=Z):(jb[127&ar[40+(0|ar[Z>>2])>>2]](Z),w=Z)}0|((p=0|tr[11+d>>0])<<24>>24<0?0|ar[4+d>>2]:255&p)&&((B=0|ar[b>>2])-u|0)<160&&(y=0|ar[y>>2],ar[b>>2]=B+4,ar[B>>2]=y);B=0|Xn(A,0|ar[l>>2],f,s),ar[n>>2]=B,gn(d,u,0|ar[b>>2],f),i=Z?(A=(0|(A=0|ar[Z+12>>2]))==(0|ar[Z+16>>2])?0|jb[127&ar[36+(0|ar[v>>2])>>2]](Z):0|hf(0|tr[A>>0]),0|Mf(A,-1)?(ar[e>>2]=0,1):0):1;do{if(w){if(0|Mf(A=(0|(A=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|hf(0|tr[A>>0]),-1)){ar[r>>2]=0,E=47;break}if(i)break;E=49;break}E=47}while(0);47==(0|E)&&i&&(E=49);49==(0|E)&&(ar[f>>2]=2|ar[f>>2]);return E=0|ar[e>>2],Bu(k),Bu(d),ur=h,0|E}(A,a,o,i,f,n),ur=t,0|n},function(A,e,r,i,f,n){var t,o,a,c,l;return A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,c=ur=(t=ur)+31&-32,ur=ur+16|0,o=12+c|0,a=8+c|0,ar[(l=4+c|0)>>2]=ar[e>>2],ar[c>>2]=ar[r>>2],ar[a>>2]=ar[l>>2],ar[o>>2]=ar[c>>2],n=0|function(A,e,r,i,f,n){A|=0,e|=0,r|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0;y=ur=(h=ur)+31&-32,ur=ur+224|0,c=y+198|0,p=y+196|0,d=y+184|0,k=y+172|0,l=y+168|0,u=y+8|0,b=y+4|0,s=0|yn(i|=0),Bn(d,i,c,p),ar[k>>2]=0,ar[4+k>>2]=0,ar[8+k>>2]=0,A=0;for(;3!=(0|A);)ar[k+(A<<2)>>2]=0,A=A+1|0;a=8+k|0,A=(0|tr[(o=11+k|0)>>0])<0?(2147483647&ar[a>>2])-1|0:10;Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[l>>2]=A,ar[b>>2]=u,ar[y>>2]=0,t=4+k|0,v=0|ar[e>>2],w=v;A:for(;;){m=w?0|Mf(i=(0|(i=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|hf(0|tr[i>>0]),-1)?(ar[e>>2]=0,v=Z=0,1):(Z=w,0):(v=Z=0,1),w=0|ar[r>>2];do{if(w){if(0|Mf(i=(0|(i=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|hf(0|tr[i>>0]),-1)){ar[r>>2]=0,E=19;break}if(m)break;break A}E=19}while(0);if(19==(0|E)){if(E=0,m){w=0;break}w=0}if(i=(i=0|tr[o>>0])<<24>>24<0?0|ar[t>>2]:255&i,(0|ar[l>>2])==(A+i|0)&&(Vu(k,i<<1,0),A=(0|tr[o>>0])<0?(2147483647&ar[a>>2])-1|0:10,Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[l>>2]=A+i),0|sn(255&(i=(0|(i=0|ar[(m=Z+12|0)>>2]))==(0|ar[(g=Z+16|0)>>2])?0|jb[127&ar[36+(0|ar[Z>>2])>>2]](Z):0|hf(0|tr[i>>0])),s,A,l,y,0|tr[p>>0],d,u,b,c))break;(0|(i=0|ar[m>>2]))!=(0|ar[g>>2])?(ar[m>>2]=i+1,hf(0|tr[i>>0]),w=Z):(jb[127&ar[40+(0|ar[Z>>2])>>2]](Z),w=Z)}0|((p=0|tr[11+d>>0])<<24>>24<0?0|ar[4+d>>2]:255&p)&&((B=0|ar[b>>2])-u|0)<160&&(y=0|ar[y>>2],ar[b>>2]=B+4,ar[B>>2]=y);B=0|En(A,0|ar[l>>2],f,s),ar[n>>2]=B,ar[n+4>>2]=D,gn(d,u,0|ar[b>>2],f),i=Z?(A=(0|(A=0|ar[Z+12>>2]))==(0|ar[Z+16>>2])?0|jb[127&ar[36+(0|ar[v>>2])>>2]](Z):0|hf(0|tr[A>>0]),0|Mf(A,-1)?(ar[e>>2]=0,1):0):1;do{if(w){if(0|Mf(A=(0|(A=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|hf(0|tr[A>>0]),-1)){ar[r>>2]=0,E=47;break}if(i)break;E=49;break}E=47}while(0);47==(0|E)&&i&&(E=49);49==(0|E)&&(ar[f>>2]=2|ar[f>>2]);return E=0|ar[e>>2],Bu(k),Bu(d),ur=h,0|E}(A,a,o,i,f,n),ur=t,0|n},function(A,e,r,i,f,n){var t,o,a,c,l;return A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,c=ur=(t=ur)+31&-32,ur=ur+16|0,o=12+c|0,a=8+c|0,ar[(l=4+c|0)>>2]=ar[e>>2],ar[c>>2]=ar[r>>2],ar[a>>2]=ar[l>>2],ar[o>>2]=ar[c>>2],n=0|function(A,e,r,i,f,n){A|=0,e|=0,r|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w,v,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0;B=ur=(w=ur)+31&-32,ur=ur+240|0,c=B+200|0,l=B+199|0,E=B+198|0,h=B+184|0,k=B+172|0,u=B+168|0,b=B+8|0,s=B+4|0,X=(d=B)+197|0,B=B+196|0,wn(h,i|=0,c,l,E),ar[k>>2]=0,ar[4+k>>2]=0,ar[8+k>>2]=0,A=0;for(;3!=(0|A);)ar[k+(A<<2)>>2]=0,A=A+1|0;a=8+k|0,A=(0|tr[(o=11+k|0)>>0])<0?(2147483647&ar[a>>2])-1|0:10;Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[u>>2]=A,ar[s>>2]=b,ar[d>>2]=0,tr[X>>0]=1,tr[B>>0]=69,t=4+k|0,g=0|ar[e>>2],m=g;A:for(;;){Z=m?0|Mf(i=(0|(i=0|ar[m+12>>2]))==(0|ar[m+16>>2])?0|jb[127&ar[36+(0|ar[m>>2])>>2]](m):0|hf(0|tr[i>>0]),-1)?(ar[e>>2]=0,g=y=0,1):(y=m,0):(g=y=0,1),m=0|ar[r>>2];do{if(m){if(0|Mf(i=(0|(i=0|ar[m+12>>2]))==(0|ar[m+16>>2])?0|jb[127&ar[36+(0|ar[m>>2])>>2]](m):0|hf(0|tr[i>>0]),-1)){ar[r>>2]=0,I=19;break}if(Z)break;break A}I=19}while(0);if(19==(0|I)){if(I=0,Z){m=0;break}m=0}if(i=(i=0|tr[o>>0])<<24>>24<0?0|ar[t>>2]:255&i,(0|ar[u>>2])==(A+i|0)&&(Vu(k,i<<1,0),A=(0|tr[o>>0])<0?(2147483647&ar[a>>2])-1|0:10,Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[u>>2]=A+i),0|vn(255&(i=(0|(i=0|ar[(Z=y+12|0)>>2]))==(0|ar[(p=y+16|0)>>2])?0|jb[127&ar[36+(0|ar[y>>2])>>2]](y):0|hf(0|tr[i>>0])),X,B,A,u,0|tr[l>>0],0|tr[E>>0],h,b,s,d,c))break;(0|(i=0|ar[Z>>2]))!=(0|ar[p>>2])?(ar[Z>>2]=i+1,hf(0|tr[i>>0]),m=y):(jb[127&ar[40+(0|ar[y>>2])>>2]](y),m=y)}E=0|tr[11+h>>0],0!=(0|tr[X>>0])&&0!=(0|(E<<24>>24<0?0|ar[4+h>>2]:255&E))&&((W=0|ar[s>>2])-b|0)<160&&(X=0|ar[d>>2],ar[s>>2]=W+4,ar[W>>2]=X);v=+pn(A,0|ar[u>>2],f),gA[n>>2]=v,gn(h,b,0|ar[s>>2],f),i=y?(A=(0|(A=0|ar[y+12>>2]))==(0|ar[y+16>>2])?0|jb[127&ar[36+(0|ar[g>>2])>>2]](y):0|hf(0|tr[A>>0]),0|Mf(A,-1)?(ar[e>>2]=0,1):0):1;do{if(m){if(0|Mf(A=(0|(A=0|ar[m+12>>2]))==(0|ar[m+16>>2])?0|jb[127&ar[36+(0|ar[m>>2])>>2]](m):0|hf(0|tr[A>>0]),-1)){ar[r>>2]=0,I=47;break}if(i)break;I=49;break}I=47}while(0);47==(0|I)&&i&&(I=49);49==(0|I)&&(ar[f>>2]=2|ar[f>>2]);return I=0|ar[e>>2],Bu(k),Bu(h),ur=w,0|I}(A,a,o,i,f,n),ur=t,0|n},function(A,e,r,i,f,n){var t,o,a,c,l;return A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,c=ur=(t=ur)+31&-32,ur=ur+16|0,o=12+c|0,a=8+c|0,ar[(l=4+c|0)>>2]=ar[e>>2],ar[c>>2]=ar[r>>2],ar[a>>2]=ar[l>>2],ar[o>>2]=ar[c>>2],n=0|function(A,e,r,i,f,n){A|=0,e|=0,r|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w,v,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0;B=ur=(w=ur)+31&-32,ur=ur+240|0,c=B+200|0,l=B+199|0,E=B+198|0,h=B+184|0,k=B+172|0,u=B+168|0,b=B+8|0,s=B+4|0,X=(d=B)+197|0,B=B+196|0,wn(h,i|=0,c,l,E),ar[k>>2]=0,ar[4+k>>2]=0,ar[8+k>>2]=0,A=0;for(;3!=(0|A);)ar[k+(A<<2)>>2]=0,A=A+1|0;a=8+k|0,A=(0|tr[(o=11+k|0)>>0])<0?(2147483647&ar[a>>2])-1|0:10;Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[u>>2]=A,ar[s>>2]=b,ar[d>>2]=0,tr[X>>0]=1,tr[B>>0]=69,t=4+k|0,g=0|ar[e>>2],m=g;A:for(;;){Z=m?0|Mf(i=(0|(i=0|ar[m+12>>2]))==(0|ar[m+16>>2])?0|jb[127&ar[36+(0|ar[m>>2])>>2]](m):0|hf(0|tr[i>>0]),-1)?(ar[e>>2]=0,g=y=0,1):(y=m,0):(g=y=0,1),m=0|ar[r>>2];do{if(m){if(0|Mf(i=(0|(i=0|ar[m+12>>2]))==(0|ar[m+16>>2])?0|jb[127&ar[36+(0|ar[m>>2])>>2]](m):0|hf(0|tr[i>>0]),-1)){ar[r>>2]=0,I=19;break}if(Z)break;break A}I=19}while(0);if(19==(0|I)){if(I=0,Z){m=0;break}m=0}if(i=(i=0|tr[o>>0])<<24>>24<0?0|ar[t>>2]:255&i,(0|ar[u>>2])==(A+i|0)&&(Vu(k,i<<1,0),A=(0|tr[o>>0])<0?(2147483647&ar[a>>2])-1|0:10,Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[u>>2]=A+i),0|vn(255&(i=(0|(i=0|ar[(Z=y+12|0)>>2]))==(0|ar[(p=y+16|0)>>2])?0|jb[127&ar[36+(0|ar[y>>2])>>2]](y):0|hf(0|tr[i>>0])),X,B,A,u,0|tr[l>>0],0|tr[E>>0],h,b,s,d,c))break;(0|(i=0|ar[Z>>2]))!=(0|ar[p>>2])?(ar[Z>>2]=i+1,hf(0|tr[i>>0]),m=y):(jb[127&ar[40+(0|ar[y>>2])>>2]](y),m=y)}E=0|tr[11+h>>0],0!=(0|tr[X>>0])&&0!=(0|(E<<24>>24<0?0|ar[4+h>>2]:255&E))&&((W=0|ar[s>>2])-b|0)<160&&(X=0|ar[d>>2],ar[s>>2]=W+4,ar[W>>2]=X);v=+Zn(A,0|ar[u>>2],f),Q[n>>3]=v,gn(h,b,0|ar[s>>2],f),i=y?(A=(0|(A=0|ar[y+12>>2]))==(0|ar[y+16>>2])?0|jb[127&ar[36+(0|ar[g>>2])>>2]](y):0|hf(0|tr[A>>0]),0|Mf(A,-1)?(ar[e>>2]=0,1):0):1;do{if(m){if(0|Mf(A=(0|(A=0|ar[m+12>>2]))==(0|ar[m+16>>2])?0|jb[127&ar[36+(0|ar[m>>2])>>2]](m):0|hf(0|tr[A>>0]),-1)){ar[r>>2]=0,I=47;break}if(i)break;I=49;break}I=47}while(0);47==(0|I)&&i&&(I=49);49==(0|I)&&(ar[f>>2]=2|ar[f>>2]);return I=0|ar[e>>2],Bu(k),Bu(h),ur=w,0|I}(A,a,o,i,f,n),ur=t,0|n},function(A,e,r,i,f,n){var t,o,a,c,l;return A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,c=ur=(t=ur)+31&-32,ur=ur+16|0,o=12+c|0,a=8+c|0,ar[(l=4+c|0)>>2]=ar[e>>2],ar[c>>2]=ar[r>>2],ar[a>>2]=ar[l>>2],ar[o>>2]=ar[c>>2],n=0|function(A,e,r,i,f,n){A|=0,e|=0,r|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w,v,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0;B=ur=(w=ur)+31&-32,ur=ur+240|0,c=B+200|0,l=B+199|0,E=B+198|0,h=B+184|0,k=B+172|0,u=B+168|0,b=B+8|0,s=B+4|0,X=(d=B)+197|0,B=B+196|0,wn(h,i|=0,c,l,E),ar[k>>2]=0,ar[4+k>>2]=0,ar[8+k>>2]=0,A=0;for(;3!=(0|A);)ar[k+(A<<2)>>2]=0,A=A+1|0;a=8+k|0,A=(0|tr[(o=11+k|0)>>0])<0?(2147483647&ar[a>>2])-1|0:10;Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[u>>2]=A,ar[s>>2]=b,ar[d>>2]=0,tr[X>>0]=1,tr[B>>0]=69,t=4+k|0,g=0|ar[e>>2],m=g;A:for(;;){Z=m?0|Mf(i=(0|(i=0|ar[m+12>>2]))==(0|ar[m+16>>2])?0|jb[127&ar[36+(0|ar[m>>2])>>2]](m):0|hf(0|tr[i>>0]),-1)?(ar[e>>2]=0,g=y=0,1):(y=m,0):(g=y=0,1),m=0|ar[r>>2];do{if(m){if(0|Mf(i=(0|(i=0|ar[m+12>>2]))==(0|ar[m+16>>2])?0|jb[127&ar[36+(0|ar[m>>2])>>2]](m):0|hf(0|tr[i>>0]),-1)){ar[r>>2]=0,I=19;break}if(Z)break;break A}I=19}while(0);if(19==(0|I)){if(I=0,Z){m=0;break}m=0}if(i=(i=0|tr[o>>0])<<24>>24<0?0|ar[t>>2]:255&i,(0|ar[u>>2])==(A+i|0)&&(Vu(k,i<<1,0),A=(0|tr[o>>0])<0?(2147483647&ar[a>>2])-1|0:10,Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[u>>2]=A+i),0|vn(255&(i=(0|(i=0|ar[(Z=y+12|0)>>2]))==(0|ar[(p=y+16|0)>>2])?0|jb[127&ar[36+(0|ar[y>>2])>>2]](y):0|hf(0|tr[i>>0])),X,B,A,u,0|tr[l>>0],0|tr[E>>0],h,b,s,d,c))break;(0|(i=0|ar[Z>>2]))!=(0|ar[p>>2])?(ar[Z>>2]=i+1,hf(0|tr[i>>0]),m=y):(jb[127&ar[40+(0|ar[y>>2])>>2]](y),m=y)}E=0|tr[11+h>>0],0!=(0|tr[X>>0])&&0!=(0|(E<<24>>24<0?0|ar[4+h>>2]:255&E))&&((W=0|ar[s>>2])-b|0)<160&&(X=0|ar[d>>2],ar[s>>2]=W+4,ar[W>>2]=X);v=+mn(A,0|ar[u>>2],f),Q[n>>3]=v,gn(h,b,0|ar[s>>2],f),i=y?(A=(0|(A=0|ar[y+12>>2]))==(0|ar[y+16>>2])?0|jb[127&ar[36+(0|ar[g>>2])>>2]](y):0|hf(0|tr[A>>0]),0|Mf(A,-1)?(ar[e>>2]=0,1):0):1;do{if(m){if(0|Mf(A=(0|(A=0|ar[m+12>>2]))==(0|ar[m+16>>2])?0|jb[127&ar[36+(0|ar[m>>2])>>2]](m):0|hf(0|tr[A>>0]),-1)){ar[r>>2]=0,I=47;break}if(i)break;I=49;break}I=47}while(0);47==(0|I)&&i&&(I=49);49==(0|I)&&(ar[f>>2]=2|ar[f>>2]);return I=0|ar[e>>2],Bu(k),Bu(h),ur=w,0|I}(A,a,o,i,f,n),ur=t,0|n},function(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0;for(g=ur=(d=ur)+31&-32,ur=ur+240|0,Z=(u=g)+204|0,b=g+192|0,s=g+180|0,p=g+176|0,c=g+16|0,l=g+8|0,g=g+4|0,ar[b>>2]=0,ar[4+b>>2]=0,A=ar[8+b>>2]=0;3!=(0|A);)A=A+1|(ar[b+(A<<2)>>2]=0);for(Tf(s,i),A=0|un(s,59232),Pb[7&ar[32+(0|ar[A>>2])>>2]](A,53648,53674,Z),bn(s),ar[s>>2]=0,ar[4+s>>2]=0,A=ar[8+s>>2]=0;3!=(0|A);)A=A+1|(ar[s+(A<<2)>>2]=0);o=8+s|0,Vu(s,A=(0|tr[(a=11+s|0)>>0])<0?(2147483647&ar[o>>2])-1|0:10,0),A=(0|tr[a>>0])<0?0|ar[s>>2]:s,ar[p>>2]=A,ar[l>>2]=c,t=4+s|(ar[g>>2]=0),k=h=0|ar[e>>2];A:for(;;){w=k?0|Mf(i=(0|(i=0|ar[k+12>>2]))==(0|ar[k+16>>2])?0|jb[127&ar[36+(0|ar[k>>2])>>2]](k):0|hf(0|tr[i>>0]),-1)?(h=m=ar[e>>2]=0,1):(m=k,0):(h=m=0,1),k=0|ar[r>>2];do{if(k){if(0|Mf(i=(0|(i=0|ar[k+12>>2]))==(0|ar[k+16>>2])?0|jb[127&ar[36+(0|ar[k>>2])>>2]](k):0|hf(0|tr[i>>0]),-1)){ar[r>>2]=0,y=22;break}if(w)break;break A}y=22}while(0);if(22==(0|y)){if(y=0,w){k=0;break}k=0}if(i=(i=0|tr[a>>0])<<24>>24<0?0|ar[t>>2]:255&i,(0|ar[p>>2])==(A+i|0)&&(Vu(s,i<<1,0),Vu(s,A=(0|tr[a>>0])<0?(2147483647&ar[o>>2])-1|0:10,0),A=(0|tr[a>>0])<0?0|ar[s>>2]:s,ar[p>>2]=A+i),0|sn(255&(i=(0|(i=0|ar[(w=m+12|0)>>2]))==(0|ar[(v=m+16|0)>>2])?0|jb[127&ar[36+(0|ar[m>>2])>>2]](m):0|hf(0|tr[i>>0])),16,A,p,g,0,b,c,l,Z))break;(0|(i=0|ar[w>>2]))!=(0|ar[v>>2])?(ar[w>>2]=i+1,hf(0|tr[i>>0]),k=m):(jb[127&ar[40+(0|ar[m>>2])>>2]](m),k=m)}Vu(s,(0|ar[p>>2])-A|0,0),Z=(0|tr[a>>0])<0?0|ar[s>>2]:s,p=0|dn(),ar[u>>2]=n,1!=(0|kn(Z,p,53681,u))&&(ar[f>>2]=4),i=m?0|Mf(A=(0|(A=0|ar[m+12>>2]))==(0|ar[m+16>>2])?0|jb[127&ar[36+(0|ar[h>>2])>>2]](m):0|hf(0|tr[A>>0]),-1)?(ar[e>>2]=0,1):0:1;do{if(k){if(0|Mf(A=(0|(A=0|ar[k+12>>2]))==(0|ar[k+16>>2])?0|jb[127&ar[36+(0|ar[k>>2])>>2]](k):0|hf(0|tr[A>>0]),-1)){ar[r>>2]=0,y=49;break}if(i)break;y=51;break}y=49}while(0);return 49==(0|y)&&i&&(y=51),51==(0|y)&&(ar[f>>2]=2|ar[f>>2]),y=0|ar[e>>2],Bu(s),Bu(b),ur=d,0|y},function(A,e,r,i,f,n){A|=0,e|=0,r|=0,f|=0,n|=0;var t,o,a,c=0,l=0,u=0,b=0;if(u=ur=(a=ur)+31&-32,ur=ur+48|0,c=u+40|0,b=u+16|0,t=u+8|0,o=u+12|0,l=u+4|0,1&ar[(i|=0)+4>>2])for(Tf(c,i),l=0|un(c,59264),bn(c),Tf(c,i),A=0|un(c,59272),bn(c),fs[63&ar[24+(0|ar[A>>2])>>2]](b,A),fs[63&ar[28+(0|ar[A>>2])>>2]](b+12|0,A),ar[u>>2]=ar[r>>2],A=b+24|0,ar[c>>2]=ar[u>>2],c=(0|ir(e,c,b,A,l,f,1))==(0|b)&1,tr[n>>0]=c,c=0|ar[e>>2];Qu(A=A+-12|0),(0|A)!=(0|b););else{switch(ar[t>>2]=-1,u=0|ar[16+(0|ar[A>>2])>>2],ar[o>>2]=ar[e>>2],ar[l>>2]=ar[r>>2],ar[b>>2]=ar[o>>2],ar[c>>2]=ar[l>>2],b=0|$b[63&u](A,b,c,i,f,t),ar[e>>2]=b,0|ar[t>>2]){case 0:tr[n>>0]=0;break;case 1:tr[n>>0]=1;break;default:tr[n>>0]=1,ar[f>>2]=4}c=0|ar[e>>2]}return ur=a,0|c},function(A,e,r,i,f,n){var t,o,a,c,l;return A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,c=ur=(t=ur)+31&-32,ur=ur+16|0,o=12+c|0,a=8+c|0,ar[(l=4+c|0)>>2]=ar[e>>2],ar[c>>2]=ar[r>>2],ar[a>>2]=ar[l>>2],ar[o>>2]=ar[c>>2],n=0|function(A,e,r,i,f,n){A|=0,e|=0,r|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0;for(y=ur=(h=ur)+31&-32,ur=ur+304|0,c=y+200|0,p=y+196|0,d=y+184|0,k=y+172|0,l=y+168|0,u=y+8|0,b=y+4|0,s=0|yn(i|=0),_n(d,i,c,p),ar[k>>2]=0,ar[4+k>>2]=0,A=ar[8+k>>2]=0;3!=(0|A);)A=A+1|(ar[k+(A<<2)>>2]=0);a=8+k|0,Vu(k,A=(0|tr[(o=11+k|0)>>0])<0?(2147483647&ar[a>>2])-1|0:10,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[l>>2]=A,ar[b>>2]=u,t=4+k|(ar[y>>2]=0),w=v=0|ar[e>>2];A:for(;;){m=w?0|Uf(i=(0|(i=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|gf(0|ar[i>>2]),-1)?(v=Z=ar[e>>2]=0,1):(Z=w,0):(v=Z=0,1),w=0|ar[r>>2];do{if(w){if(0|Uf(i=(0|(i=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|gf(0|ar[i>>2]),-1)){ar[r>>2]=0,E=19;break}if(m)break;break A}E=19}while(0);if(19==(0|E)){if(E=0,m){w=0;break}w=0}if(i=(i=0|tr[o>>0])<<24>>24<0?0|ar[t>>2]:255&i,(0|ar[l>>2])==(A+i|0)&&(Vu(k,i<<1,0),Vu(k,A=(0|tr[o>>0])<0?(2147483647&ar[a>>2])-1|0:10,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[l>>2]=A+i),0|Fn(i=(0|(i=0|ar[(m=Z+12|0)>>2]))==(0|ar[(g=Z+16|0)>>2])?0|jb[127&ar[36+(0|ar[Z>>2])>>2]](Z):0|gf(0|ar[i>>2]),s,A,l,y,0|ar[p>>2],d,u,b,c))break;(0|(i=0|ar[m>>2]))!=(0|ar[g>>2])?(ar[m>>2]=i+4,gf(0|ar[i>>2]),w=Z):(jb[127&ar[40+(0|ar[Z>>2])>>2]](Z),w=Z)}0|((p=0|tr[11+d>>0])<<24>>24<0?0|ar[4+d>>2]:255&p)&&((B=0|ar[b>>2])-u|0)<160&&(y=0|ar[y>>2],ar[b>>2]=B+4,ar[B>>2]=y),B=0|Gn(A,0|ar[l>>2],f,s),ar[n>>2]=B,gn(d,u,0|ar[b>>2],f),i=Z?0|Uf(A=(0|(A=0|ar[Z+12>>2]))==(0|ar[Z+16>>2])?0|jb[127&ar[36+(0|ar[v>>2])>>2]](Z):0|gf(0|ar[A>>2]),-1)?(ar[e>>2]=0,1):0:1;do{if(w){if(0|Uf(A=(0|(A=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|gf(0|ar[A>>2]),-1)){ar[r>>2]=0,E=47;break}if(i)break;E=49;break}E=47}while(0);return 47==(0|E)&&i&&(E=49),49==(0|E)&&(ar[f>>2]=2|ar[f>>2]),E=0|ar[e>>2],Bu(k),Bu(d),ur=h,0|E}(A,a,o,i,f,n),ur=t,0|n},function(A,e,r,i,f,n){var t,o,a,c,l;return A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,c=ur=(t=ur)+31&-32,ur=ur+16|0,o=12+c|0,a=8+c|0,ar[(l=4+c|0)>>2]=ar[e>>2],ar[c>>2]=ar[r>>2],ar[a>>2]=ar[l>>2],ar[o>>2]=ar[c>>2],n=0|function(A,e,r,i,f,n){A|=0,e|=0,r|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0;for(y=ur=(h=ur)+31&-32,ur=ur+304|0,c=y+200|0,p=y+196|0,d=y+184|0,k=y+172|0,l=y+168|0,u=y+8|0,b=y+4|0,s=0|yn(i|=0),_n(d,i,c,p),ar[k>>2]=0,ar[4+k>>2]=0,A=ar[8+k>>2]=0;3!=(0|A);)A=A+1|(ar[k+(A<<2)>>2]=0);a=8+k|0,Vu(k,A=(0|tr[(o=11+k|0)>>0])<0?(2147483647&ar[a>>2])-1|0:10,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[l>>2]=A,ar[b>>2]=u,t=4+k|(ar[y>>2]=0),w=v=0|ar[e>>2];A:for(;;){m=w?0|Uf(i=(0|(i=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|gf(0|ar[i>>2]),-1)?(v=Z=ar[e>>2]=0,1):(Z=w,0):(v=Z=0,1),w=0|ar[r>>2];do{if(w){if(0|Uf(i=(0|(i=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|gf(0|ar[i>>2]),-1)){ar[r>>2]=0,E=19;break}if(m)break;break A}E=19}while(0);if(19==(0|E)){if(E=0,m){w=0;break}w=0}if(i=(i=0|tr[o>>0])<<24>>24<0?0|ar[t>>2]:255&i,(0|ar[l>>2])==(A+i|0)&&(Vu(k,i<<1,0),Vu(k,A=(0|tr[o>>0])<0?(2147483647&ar[a>>2])-1|0:10,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[l>>2]=A+i),0|Fn(i=(0|(i=0|ar[(m=Z+12|0)>>2]))==(0|ar[(g=Z+16|0)>>2])?0|jb[127&ar[36+(0|ar[Z>>2])>>2]](Z):0|gf(0|ar[i>>2]),s,A,l,y,0|ar[p>>2],d,u,b,c))break;(0|(i=0|ar[m>>2]))!=(0|ar[g>>2])?(ar[m>>2]=i+4,gf(0|ar[i>>2]),w=Z):(jb[127&ar[40+(0|ar[Z>>2])>>2]](Z),w=Z)}0|((p=0|tr[11+d>>0])<<24>>24<0?0|ar[4+d>>2]:255&p)&&((B=0|ar[b>>2])-u|0)<160&&(y=0|ar[y>>2],ar[b>>2]=B+4,ar[B>>2]=y),B=0|Cn(A,0|ar[l>>2],f,s),ar[n>>2]=B,ar[n+4>>2]=D,gn(d,u,0|ar[b>>2],f),i=Z?0|Uf(A=(0|(A=0|ar[Z+12>>2]))==(0|ar[Z+16>>2])?0|jb[127&ar[36+(0|ar[v>>2])>>2]](Z):0|gf(0|ar[A>>2]),-1)?(ar[e>>2]=0,1):0:1;do{if(w){if(0|Uf(A=(0|(A=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|gf(0|ar[A>>2]),-1)){ar[r>>2]=0,E=47;break}if(i)break;E=49;break}E=47}while(0);return 47==(0|E)&&i&&(E=49),49==(0|E)&&(ar[f>>2]=2|ar[f>>2]),E=0|ar[e>>2],Bu(k),Bu(d),ur=h,0|E}(A,a,o,i,f,n),ur=t,0|n},function(A,e,r,i,f,n){var t,o,a,c,l;return A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,c=ur=(t=ur)+31&-32,ur=ur+16|0,o=12+c|0,a=8+c|0,ar[(l=4+c|0)>>2]=ar[e>>2],ar[c>>2]=ar[r>>2],ar[a>>2]=ar[l>>2],ar[o>>2]=ar[c>>2],n=0|function(A,e,r,i,f,n){A|=0,e|=0,r|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0;for(y=ur=(h=ur)+31&-32,ur=ur+304|0,c=y+200|0,p=y+196|0,d=y+184|0,k=y+172|0,l=y+168|0,u=y+8|0,b=y+4|0,s=0|yn(i|=0),_n(d,i,c,p),ar[k>>2]=0,ar[4+k>>2]=0,A=ar[8+k>>2]=0;3!=(0|A);)A=A+1|(ar[k+(A<<2)>>2]=0);a=8+k|0,Vu(k,A=(0|tr[(o=11+k|0)>>0])<0?(2147483647&ar[a>>2])-1|0:10,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[l>>2]=A,ar[b>>2]=u,t=4+k|(ar[y>>2]=0),w=v=0|ar[e>>2];A:for(;;){m=w?0|Uf(i=(0|(i=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|gf(0|ar[i>>2]),-1)?(v=Z=ar[e>>2]=0,1):(Z=w,0):(v=Z=0,1),w=0|ar[r>>2];do{if(w){if(0|Uf(i=(0|(i=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|gf(0|ar[i>>2]),-1)){ar[r>>2]=0,E=19;break}if(m)break;break A}E=19}while(0);if(19==(0|E)){if(E=0,m){w=0;break}w=0}if(i=(i=0|tr[o>>0])<<24>>24<0?0|ar[t>>2]:255&i,(0|ar[l>>2])==(A+i|0)&&(Vu(k,i<<1,0),Vu(k,A=(0|tr[o>>0])<0?(2147483647&ar[a>>2])-1|0:10,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[l>>2]=A+i),0|Fn(i=(0|(i=0|ar[(m=Z+12|0)>>2]))==(0|ar[(g=Z+16|0)>>2])?0|jb[127&ar[36+(0|ar[Z>>2])>>2]](Z):0|gf(0|ar[i>>2]),s,A,l,y,0|ar[p>>2],d,u,b,c))break;(0|(i=0|ar[m>>2]))!=(0|ar[g>>2])?(ar[m>>2]=i+4,gf(0|ar[i>>2]),w=Z):(jb[127&ar[40+(0|ar[Z>>2])>>2]](Z),w=Z)}0|((p=0|tr[11+d>>0])<<24>>24<0?0|ar[4+d>>2]:255&p)&&((B=0|ar[b>>2])-u|0)<160&&(y=0|ar[y>>2],ar[b>>2]=B+4,ar[B>>2]=y),B=0|In(A,0|ar[l>>2],f,s),or[n>>1]=B,gn(d,u,0|ar[b>>2],f),i=Z?0|Uf(A=(0|(A=0|ar[Z+12>>2]))==(0|ar[Z+16>>2])?0|jb[127&ar[36+(0|ar[v>>2])>>2]](Z):0|gf(0|ar[A>>2]),-1)?(ar[e>>2]=0,1):0:1;do{if(w){if(0|Uf(A=(0|(A=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|gf(0|ar[A>>2]),-1)){ar[r>>2]=0,E=47;break}if(i)break;E=49;break}E=47}while(0);return 47==(0|E)&&i&&(E=49),49==(0|E)&&(ar[f>>2]=2|ar[f>>2]),E=0|ar[e>>2],Bu(k),Bu(d),ur=h,0|E}(A,a,o,i,f,n),ur=t,0|n},function(A,e,r,i,f,n){var t,o,a,c,l;return A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,c=ur=(t=ur)+31&-32,ur=ur+16|0,o=12+c|0,a=8+c|0,ar[(l=4+c|0)>>2]=ar[e>>2],ar[c>>2]=ar[r>>2],ar[a>>2]=ar[l>>2],ar[o>>2]=ar[c>>2],n=0|function(A,e,r,i,f,n){A|=0,e|=0,r|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0;y=ur=(h=ur)+31&-32,ur=ur+304|0,c=y+200|0,p=y+196|0,d=y+184|0,k=y+172|0,l=y+168|0,u=y+8|0,b=y+4|0,s=0|yn(i|=0),_n(d,i,c,p),ar[k>>2]=0,ar[4+k>>2]=0,ar[8+k>>2]=0,A=0;for(;3!=(0|A);)ar[k+(A<<2)>>2]=0,A=A+1|0;a=8+k|0,A=(0|tr[(o=11+k|0)>>0])<0?(2147483647&ar[a>>2])-1|0:10;Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[l>>2]=A,ar[b>>2]=u,ar[y>>2]=0,t=4+k|0,v=0|ar[e>>2],w=v;A:for(;;){m=w?0|Uf(i=(0|(i=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|gf(0|ar[i>>2]),-1)?(ar[e>>2]=0,v=Z=0,1):(Z=w,0):(v=Z=0,1),w=0|ar[r>>2];do{if(w){if(0|Uf(i=(0|(i=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|gf(0|ar[i>>2]),-1)){ar[r>>2]=0,E=19;break}if(m)break;break A}E=19}while(0);if(19==(0|E)){if(E=0,m){w=0;break}w=0}if(i=(i=0|tr[o>>0])<<24>>24<0?0|ar[t>>2]:255&i,(0|ar[l>>2])==(A+i|0)&&(Vu(k,i<<1,0),A=(0|tr[o>>0])<0?(2147483647&ar[a>>2])-1|0:10,Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[l>>2]=A+i),0|Fn(i=(0|(i=0|ar[(m=Z+12|0)>>2]))==(0|ar[(g=Z+16|0)>>2])?0|jb[127&ar[36+(0|ar[Z>>2])>>2]](Z):0|gf(0|ar[i>>2]),s,A,l,y,0|ar[p>>2],d,u,b,c))break;(0|(i=0|ar[m>>2]))!=(0|ar[g>>2])?(ar[m>>2]=i+4,gf(0|ar[i>>2]),w=Z):(jb[127&ar[40+(0|ar[Z>>2])>>2]](Z),w=Z)}0|((p=0|tr[11+d>>0])<<24>>24<0?0|ar[4+d>>2]:255&p)&&((B=0|ar[b>>2])-u|0)<160&&(y=0|ar[y>>2],ar[b>>2]=B+4,ar[B>>2]=y);B=0|Wn(A,0|ar[l>>2],f,s),ar[n>>2]=B,gn(d,u,0|ar[b>>2],f),i=Z?(A=(0|(A=0|ar[Z+12>>2]))==(0|ar[Z+16>>2])?0|jb[127&ar[36+(0|ar[v>>2])>>2]](Z):0|gf(0|ar[A>>2]),0|Uf(A,-1)?(ar[e>>2]=0,1):0):1;do{if(w){if(0|Uf(A=(0|(A=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|gf(0|ar[A>>2]),-1)){ar[r>>2]=0,E=47;break}if(i)break;E=49;break}E=47}while(0);47==(0|E)&&i&&(E=49);49==(0|E)&&(ar[f>>2]=2|ar[f>>2]);return E=0|ar[e>>2],Bu(k),Bu(d),ur=h,0|E}(A,a,o,i,f,n),ur=t,0|n},function(A,e,r,i,f,n){var t,o,a,c,l;return A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,c=ur=(t=ur)+31&-32,ur=ur+16|0,o=12+c|0,a=8+c|0,ar[(l=4+c|0)>>2]=ar[e>>2],ar[c>>2]=ar[r>>2],ar[a>>2]=ar[l>>2],ar[o>>2]=ar[c>>2],n=0|function(A,e,r,i,f,n){A|=0,e|=0,r|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0;y=ur=(h=ur)+31&-32,ur=ur+304|0,c=y+200|0,p=y+196|0,d=y+184|0,k=y+172|0,l=y+168|0,u=y+8|0,b=y+4|0,s=0|yn(i|=0),_n(d,i,c,p),ar[k>>2]=0,ar[4+k>>2]=0,ar[8+k>>2]=0,A=0;for(;3!=(0|A);)ar[k+(A<<2)>>2]=0,A=A+1|0;a=8+k|0,A=(0|tr[(o=11+k|0)>>0])<0?(2147483647&ar[a>>2])-1|0:10;Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[l>>2]=A,ar[b>>2]=u,ar[y>>2]=0,t=4+k|0,v=0|ar[e>>2],w=v;A:for(;;){m=w?0|Uf(i=(0|(i=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|gf(0|ar[i>>2]),-1)?(ar[e>>2]=0,v=Z=0,1):(Z=w,0):(v=Z=0,1),w=0|ar[r>>2];do{if(w){if(0|Uf(i=(0|(i=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|gf(0|ar[i>>2]),-1)){ar[r>>2]=0,E=19;break}if(m)break;break A}E=19}while(0);if(19==(0|E)){if(E=0,m){w=0;break}w=0}if(i=(i=0|tr[o>>0])<<24>>24<0?0|ar[t>>2]:255&i,(0|ar[l>>2])==(A+i|0)&&(Vu(k,i<<1,0),A=(0|tr[o>>0])<0?(2147483647&ar[a>>2])-1|0:10,Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[l>>2]=A+i),0|Fn(i=(0|(i=0|ar[(m=Z+12|0)>>2]))==(0|ar[(g=Z+16|0)>>2])?0|jb[127&ar[36+(0|ar[Z>>2])>>2]](Z):0|gf(0|ar[i>>2]),s,A,l,y,0|ar[p>>2],d,u,b,c))break;(0|(i=0|ar[m>>2]))!=(0|ar[g>>2])?(ar[m>>2]=i+4,gf(0|ar[i>>2]),w=Z):(jb[127&ar[40+(0|ar[Z>>2])>>2]](Z),w=Z)}0|((p=0|tr[11+d>>0])<<24>>24<0?0|ar[4+d>>2]:255&p)&&((B=0|ar[b>>2])-u|0)<160&&(y=0|ar[y>>2],ar[b>>2]=B+4,ar[B>>2]=y);B=0|Xn(A,0|ar[l>>2],f,s),ar[n>>2]=B,gn(d,u,0|ar[b>>2],f),i=Z?(A=(0|(A=0|ar[Z+12>>2]))==(0|ar[Z+16>>2])?0|jb[127&ar[36+(0|ar[v>>2])>>2]](Z):0|gf(0|ar[A>>2]),0|Uf(A,-1)?(ar[e>>2]=0,1):0):1;do{if(w){if(0|Uf(A=(0|(A=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|gf(0|ar[A>>2]),-1)){ar[r>>2]=0,E=47;break}if(i)break;E=49;break}E=47}while(0);47==(0|E)&&i&&(E=49);49==(0|E)&&(ar[f>>2]=2|ar[f>>2]);return E=0|ar[e>>2],Bu(k),Bu(d),ur=h,0|E}(A,a,o,i,f,n),ur=t,0|n},function(A,e,r,i,f,n){var t,o,a,c,l;return A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,c=ur=(t=ur)+31&-32,ur=ur+16|0,o=12+c|0,a=8+c|0,ar[(l=4+c|0)>>2]=ar[e>>2],ar[c>>2]=ar[r>>2],ar[a>>2]=ar[l>>2],ar[o>>2]=ar[c>>2],n=0|function(A,e,r,i,f,n){A|=0,e|=0,r|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0;y=ur=(h=ur)+31&-32,ur=ur+304|0,c=y+200|0,p=y+196|0,d=y+184|0,k=y+172|0,l=y+168|0,u=y+8|0,b=y+4|0,s=0|yn(i|=0),_n(d,i,c,p),ar[k>>2]=0,ar[4+k>>2]=0,ar[8+k>>2]=0,A=0;for(;3!=(0|A);)ar[k+(A<<2)>>2]=0,A=A+1|0;a=8+k|0,A=(0|tr[(o=11+k|0)>>0])<0?(2147483647&ar[a>>2])-1|0:10;Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[l>>2]=A,ar[b>>2]=u,ar[y>>2]=0,t=4+k|0,v=0|ar[e>>2],w=v;A:for(;;){m=w?0|Uf(i=(0|(i=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|gf(0|ar[i>>2]),-1)?(ar[e>>2]=0,v=Z=0,1):(Z=w,0):(v=Z=0,1),w=0|ar[r>>2];do{if(w){if(0|Uf(i=(0|(i=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|gf(0|ar[i>>2]),-1)){ar[r>>2]=0,E=19;break}if(m)break;break A}E=19}while(0);if(19==(0|E)){if(E=0,m){w=0;break}w=0}if(i=(i=0|tr[o>>0])<<24>>24<0?0|ar[t>>2]:255&i,(0|ar[l>>2])==(A+i|0)&&(Vu(k,i<<1,0),A=(0|tr[o>>0])<0?(2147483647&ar[a>>2])-1|0:10,Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[l>>2]=A+i),0|Fn(i=(0|(i=0|ar[(m=Z+12|0)>>2]))==(0|ar[(g=Z+16|0)>>2])?0|jb[127&ar[36+(0|ar[Z>>2])>>2]](Z):0|gf(0|ar[i>>2]),s,A,l,y,0|ar[p>>2],d,u,b,c))break;(0|(i=0|ar[m>>2]))!=(0|ar[g>>2])?(ar[m>>2]=i+4,gf(0|ar[i>>2]),w=Z):(jb[127&ar[40+(0|ar[Z>>2])>>2]](Z),w=Z)}0|((p=0|tr[11+d>>0])<<24>>24<0?0|ar[4+d>>2]:255&p)&&((B=0|ar[b>>2])-u|0)<160&&(y=0|ar[y>>2],ar[b>>2]=B+4,ar[B>>2]=y);B=0|En(A,0|ar[l>>2],f,s),ar[n>>2]=B,ar[n+4>>2]=D,gn(d,u,0|ar[b>>2],f),i=Z?(A=(0|(A=0|ar[Z+12>>2]))==(0|ar[Z+16>>2])?0|jb[127&ar[36+(0|ar[v>>2])>>2]](Z):0|gf(0|ar[A>>2]),0|Uf(A,-1)?(ar[e>>2]=0,1):0):1;do{if(w){if(0|Uf(A=(0|(A=0|ar[w+12>>2]))==(0|ar[w+16>>2])?0|jb[127&ar[36+(0|ar[w>>2])>>2]](w):0|gf(0|ar[A>>2]),-1)){ar[r>>2]=0,E=47;break}if(i)break;E=49;break}E=47}while(0);47==(0|E)&&i&&(E=49);49==(0|E)&&(ar[f>>2]=2|ar[f>>2]);return E=0|ar[e>>2],Bu(k),Bu(d),ur=h,0|E}(A,a,o,i,f,n),ur=t,0|n},function(A,e,r,i,f,n){var t,o,a,c,l;return A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,c=ur=(t=ur)+31&-32,ur=ur+16|0,o=12+c|0,a=8+c|0,ar[(l=4+c|0)>>2]=ar[e>>2],ar[c>>2]=ar[r>>2],ar[a>>2]=ar[l>>2],ar[o>>2]=ar[c>>2],n=0|function(A,e,r,i,f,n){A|=0,e|=0,r|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w,v,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0;B=ur=(w=ur)+31&-32,ur=ur+352|0,c=B+208|0,l=B+200|0,E=B+196|0,h=B+184|0,k=B+172|0,u=B+168|0,b=B+8|0,s=B+4|0,X=(d=B)+337|0,B=B+336|0,Rn(h,i|=0,c,l,E),ar[k>>2]=0,ar[4+k>>2]=0,ar[8+k>>2]=0,A=0;for(;3!=(0|A);)ar[k+(A<<2)>>2]=0,A=A+1|0;a=8+k|0,A=(0|tr[(o=11+k|0)>>0])<0?(2147483647&ar[a>>2])-1|0:10;Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[u>>2]=A,ar[s>>2]=b,ar[d>>2]=0,tr[X>>0]=1,tr[B>>0]=69,t=4+k|0,g=0|ar[e>>2],m=g;A:for(;;){Z=m?0|Uf(i=(0|(i=0|ar[m+12>>2]))==(0|ar[m+16>>2])?0|jb[127&ar[36+(0|ar[m>>2])>>2]](m):0|gf(0|ar[i>>2]),-1)?(ar[e>>2]=0,g=y=0,1):(y=m,0):(g=y=0,1),m=0|ar[r>>2];do{if(m){if(0|Uf(i=(0|(i=0|ar[m+12>>2]))==(0|ar[m+16>>2])?0|jb[127&ar[36+(0|ar[m>>2])>>2]](m):0|gf(0|ar[i>>2]),-1)){ar[r>>2]=0,I=19;break}if(Z)break;break A}I=19}while(0);if(19==(0|I)){if(I=0,Z){m=0;break}m=0}if(i=(i=0|tr[o>>0])<<24>>24<0?0|ar[t>>2]:255&i,(0|ar[u>>2])==(A+i|0)&&(Vu(k,i<<1,0),A=(0|tr[o>>0])<0?(2147483647&ar[a>>2])-1|0:10,Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[u>>2]=A+i),0|Nn(i=(0|(i=0|ar[(Z=y+12|0)>>2]))==(0|ar[(p=y+16|0)>>2])?0|jb[127&ar[36+(0|ar[y>>2])>>2]](y):0|gf(0|ar[i>>2]),X,B,A,u,0|ar[l>>2],0|ar[E>>2],h,b,s,d,c))break;(0|(i=0|ar[Z>>2]))!=(0|ar[p>>2])?(ar[Z>>2]=i+4,gf(0|ar[i>>2]),m=y):(jb[127&ar[40+(0|ar[y>>2])>>2]](y),m=y)}E=0|tr[11+h>>0],0!=(0|tr[X>>0])&&0!=(0|(E<<24>>24<0?0|ar[4+h>>2]:255&E))&&((W=0|ar[s>>2])-b|0)<160&&(X=0|ar[d>>2],ar[s>>2]=W+4,ar[W>>2]=X);v=+pn(A,0|ar[u>>2],f),gA[n>>2]=v,gn(h,b,0|ar[s>>2],f),i=y?(A=(0|(A=0|ar[y+12>>2]))==(0|ar[y+16>>2])?0|jb[127&ar[36+(0|ar[g>>2])>>2]](y):0|gf(0|ar[A>>2]),0|Uf(A,-1)?(ar[e>>2]=0,1):0):1;do{if(m){if(0|Uf(A=(0|(A=0|ar[m+12>>2]))==(0|ar[m+16>>2])?0|jb[127&ar[36+(0|ar[m>>2])>>2]](m):0|gf(0|ar[A>>2]),-1)){ar[r>>2]=0,I=47;break}if(i)break;I=49;break}I=47}while(0);47==(0|I)&&i&&(I=49);49==(0|I)&&(ar[f>>2]=2|ar[f>>2]);return I=0|ar[e>>2],Bu(k),Bu(h),ur=w,0|I}(A,a,o,i,f,n),ur=t,0|n},function(A,e,r,i,f,n){var t,o,a,c,l;return A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,c=ur=(t=ur)+31&-32,ur=ur+16|0,o=12+c|0,a=8+c|0,ar[(l=4+c|0)>>2]=ar[e>>2],ar[c>>2]=ar[r>>2],ar[a>>2]=ar[l>>2],ar[o>>2]=ar[c>>2],n=0|function(A,e,r,i,f,n){A|=0,e|=0,r|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w,v,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0;B=ur=(w=ur)+31&-32,ur=ur+352|0,c=B+208|0,l=B+200|0,E=B+196|0,h=B+184|0,k=B+172|0,u=B+168|0,b=B+8|0,s=B+4|0,X=(d=B)+337|0,B=B+336|0,Rn(h,i|=0,c,l,E),ar[k>>2]=0,ar[4+k>>2]=0,ar[8+k>>2]=0,A=0;for(;3!=(0|A);)ar[k+(A<<2)>>2]=0,A=A+1|0;a=8+k|0,A=(0|tr[(o=11+k|0)>>0])<0?(2147483647&ar[a>>2])-1|0:10;Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[u>>2]=A,ar[s>>2]=b,ar[d>>2]=0,tr[X>>0]=1,tr[B>>0]=69,t=4+k|0,g=0|ar[e>>2],m=g;A:for(;;){Z=m?0|Uf(i=(0|(i=0|ar[m+12>>2]))==(0|ar[m+16>>2])?0|jb[127&ar[36+(0|ar[m>>2])>>2]](m):0|gf(0|ar[i>>2]),-1)?(ar[e>>2]=0,g=y=0,1):(y=m,0):(g=y=0,1),m=0|ar[r>>2];do{if(m){if(0|Uf(i=(0|(i=0|ar[m+12>>2]))==(0|ar[m+16>>2])?0|jb[127&ar[36+(0|ar[m>>2])>>2]](m):0|gf(0|ar[i>>2]),-1)){ar[r>>2]=0,I=19;break}if(Z)break;break A}I=19}while(0);if(19==(0|I)){if(I=0,Z){m=0;break}m=0}if(i=(i=0|tr[o>>0])<<24>>24<0?0|ar[t>>2]:255&i,(0|ar[u>>2])==(A+i|0)&&(Vu(k,i<<1,0),A=(0|tr[o>>0])<0?(2147483647&ar[a>>2])-1|0:10,Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[u>>2]=A+i),0|Nn(i=(0|(i=0|ar[(Z=y+12|0)>>2]))==(0|ar[(p=y+16|0)>>2])?0|jb[127&ar[36+(0|ar[y>>2])>>2]](y):0|gf(0|ar[i>>2]),X,B,A,u,0|ar[l>>2],0|ar[E>>2],h,b,s,d,c))break;(0|(i=0|ar[Z>>2]))!=(0|ar[p>>2])?(ar[Z>>2]=i+4,gf(0|ar[i>>2]),m=y):(jb[127&ar[40+(0|ar[y>>2])>>2]](y),m=y)}E=0|tr[11+h>>0],0!=(0|tr[X>>0])&&0!=(0|(E<<24>>24<0?0|ar[4+h>>2]:255&E))&&((W=0|ar[s>>2])-b|0)<160&&(X=0|ar[d>>2],ar[s>>2]=W+4,ar[W>>2]=X);v=+Zn(A,0|ar[u>>2],f),Q[n>>3]=v,gn(h,b,0|ar[s>>2],f),i=y?(A=(0|(A=0|ar[y+12>>2]))==(0|ar[y+16>>2])?0|jb[127&ar[36+(0|ar[g>>2])>>2]](y):0|gf(0|ar[A>>2]),0|Uf(A,-1)?(ar[e>>2]=0,1):0):1;do{if(m){if(0|Uf(A=(0|(A=0|ar[m+12>>2]))==(0|ar[m+16>>2])?0|jb[127&ar[36+(0|ar[m>>2])>>2]](m):0|gf(0|ar[A>>2]),-1)){ar[r>>2]=0,I=47;break}if(i)break;I=49;break}I=47}while(0);47==(0|I)&&i&&(I=49);49==(0|I)&&(ar[f>>2]=2|ar[f>>2]);return I=0|ar[e>>2],Bu(k),Bu(h),ur=w,0|I}(A,a,o,i,f,n),ur=t,0|n},function(A,e,r,i,f,n){var t,o,a,c,l;return A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,c=ur=(t=ur)+31&-32,ur=ur+16|0,o=12+c|0,a=8+c|0,ar[(l=4+c|0)>>2]=ar[e>>2],ar[c>>2]=ar[r>>2],ar[a>>2]=ar[l>>2],ar[o>>2]=ar[c>>2],n=0|function(A,e,r,i,f,n){A|=0,e|=0,r|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w,v,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0;B=ur=(w=ur)+31&-32,ur=ur+352|0,c=B+208|0,l=B+200|0,E=B+196|0,h=B+184|0,k=B+172|0,u=B+168|0,b=B+8|0,s=B+4|0,X=(d=B)+337|0,B=B+336|0,Rn(h,i|=0,c,l,E),ar[k>>2]=0,ar[4+k>>2]=0,ar[8+k>>2]=0,A=0;for(;3!=(0|A);)ar[k+(A<<2)>>2]=0,A=A+1|0;a=8+k|0,A=(0|tr[(o=11+k|0)>>0])<0?(2147483647&ar[a>>2])-1|0:10;Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[u>>2]=A,ar[s>>2]=b,ar[d>>2]=0,tr[X>>0]=1,tr[B>>0]=69,t=4+k|0,g=0|ar[e>>2],m=g;A:for(;;){Z=m?0|Uf(i=(0|(i=0|ar[m+12>>2]))==(0|ar[m+16>>2])?0|jb[127&ar[36+(0|ar[m>>2])>>2]](m):0|gf(0|ar[i>>2]),-1)?(ar[e>>2]=0,g=y=0,1):(y=m,0):(g=y=0,1),m=0|ar[r>>2];do{if(m){if(0|Uf(i=(0|(i=0|ar[m+12>>2]))==(0|ar[m+16>>2])?0|jb[127&ar[36+(0|ar[m>>2])>>2]](m):0|gf(0|ar[i>>2]),-1)){ar[r>>2]=0,I=19;break}if(Z)break;break A}I=19}while(0);if(19==(0|I)){if(I=0,Z){m=0;break}m=0}if(i=(i=0|tr[o>>0])<<24>>24<0?0|ar[t>>2]:255&i,(0|ar[u>>2])==(A+i|0)&&(Vu(k,i<<1,0),A=(0|tr[o>>0])<0?(2147483647&ar[a>>2])-1|0:10,Vu(k,A,0),A=(0|tr[o>>0])<0?0|ar[k>>2]:k,ar[u>>2]=A+i),0|Nn(i=(0|(i=0|ar[(Z=y+12|0)>>2]))==(0|ar[(p=y+16|0)>>2])?0|jb[127&ar[36+(0|ar[y>>2])>>2]](y):0|gf(0|ar[i>>2]),X,B,A,u,0|ar[l>>2],0|ar[E>>2],h,b,s,d,c))break;(0|(i=0|ar[Z>>2]))!=(0|ar[p>>2])?(ar[Z>>2]=i+4,gf(0|ar[i>>2]),m=y):(jb[127&ar[40+(0|ar[y>>2])>>2]](y),m=y)}E=0|tr[11+h>>0],0!=(0|tr[X>>0])&&0!=(0|(E<<24>>24<0?0|ar[4+h>>2]:255&E))&&((W=0|ar[s>>2])-b|0)<160&&(X=0|ar[d>>2],ar[s>>2]=W+4,ar[W>>2]=X);v=+mn(A,0|ar[u>>2],f),Q[n>>3]=v,gn(h,b,0|ar[s>>2],f),i=y?(A=(0|(A=0|ar[y+12>>2]))==(0|ar[y+16>>2])?0|jb[127&ar[36+(0|ar[g>>2])>>2]](y):0|gf(0|ar[A>>2]),0|Uf(A,-1)?(ar[e>>2]=0,1):0):1;do{if(m){if(0|Uf(A=(0|(A=0|ar[m+12>>2]))==(0|ar[m+16>>2])?0|jb[127&ar[36+(0|ar[m>>2])>>2]](m):0|gf(0|ar[A>>2]),-1)){ar[r>>2]=0,I=47;break}if(i)break;I=49;break}I=47}while(0);47==(0|I)&&i&&(I=49);49==(0|I)&&(ar[f>>2]=2|ar[f>>2]);return I=0|ar[e>>2],Bu(k),Bu(h),ur=w,0|I}(A,a,o,i,f,n),ur=t,0|n},function(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0;for(g=ur=(d=ur)+31&-32,ur=ur+320|0,Z=(u=g)+208|0,b=g+192|0,s=g+180|0,p=g+176|0,c=g+16|0,l=g+8|0,g=g+4|0,ar[b>>2]=0,ar[4+b>>2]=0,A=ar[8+b>>2]=0;3!=(0|A);)A=A+1|(ar[b+(A<<2)>>2]=0);for(Tf(s,i),A=0|un(s,59264),Pb[7&ar[48+(0|ar[A>>2])>>2]](A,53648,53674,Z),bn(s),ar[s>>2]=0,ar[4+s>>2]=0,A=ar[8+s>>2]=0;3!=(0|A);)A=A+1|(ar[s+(A<<2)>>2]=0);o=8+s|0,Vu(s,A=(0|tr[(a=11+s|0)>>0])<0?(2147483647&ar[o>>2])-1|0:10,0),A=(0|tr[a>>0])<0?0|ar[s>>2]:s,ar[p>>2]=A,ar[l>>2]=c,t=4+s|(ar[g>>2]=0),k=h=0|ar[e>>2];A:for(;;){w=k?0|Uf(i=(0|(i=0|ar[k+12>>2]))==(0|ar[k+16>>2])?0|jb[127&ar[36+(0|ar[k>>2])>>2]](k):0|gf(0|ar[i>>2]),-1)?(h=m=ar[e>>2]=0,1):(m=k,0):(h=m=0,1),k=0|ar[r>>2];do{if(k){if(0|Uf(i=(0|(i=0|ar[k+12>>2]))==(0|ar[k+16>>2])?0|jb[127&ar[36+(0|ar[k>>2])>>2]](k):0|gf(0|ar[i>>2]),-1)){ar[r>>2]=0,y=22;break}if(w)break;break A}y=22}while(0);if(22==(0|y)){if(y=0,w){k=0;break}k=0}if(i=(i=0|tr[a>>0])<<24>>24<0?0|ar[t>>2]:255&i,(0|ar[p>>2])==(A+i|0)&&(Vu(s,i<<1,0),Vu(s,A=(0|tr[a>>0])<0?(2147483647&ar[o>>2])-1|0:10,0),A=(0|tr[a>>0])<0?0|ar[s>>2]:s,ar[p>>2]=A+i),0|Fn(i=(0|(i=0|ar[(w=m+12|0)>>2]))==(0|ar[(v=m+16|0)>>2])?0|jb[127&ar[36+(0|ar[m>>2])>>2]](m):0|gf(0|ar[i>>2]),16,A,p,g,0,b,c,l,Z))break;(0|(i=0|ar[w>>2]))!=(0|ar[v>>2])?(ar[w>>2]=i+4,gf(0|ar[i>>2]),k=m):(jb[127&ar[40+(0|ar[m>>2])>>2]](m),k=m)}Vu(s,(0|ar[p>>2])-A|0,0),Z=(0|tr[a>>0])<0?0|ar[s>>2]:s,p=0|dn(),ar[u>>2]=n,1!=(0|kn(Z,p,53681,u))&&(ar[f>>2]=4),i=m?0|Uf(A=(0|(A=0|ar[m+12>>2]))==(0|ar[m+16>>2])?0|jb[127&ar[36+(0|ar[h>>2])>>2]](m):0|gf(0|ar[A>>2]),-1)?(ar[e>>2]=0,1):0:1;do{if(k){if(0|Uf(A=(0|(A=0|ar[k+12>>2]))==(0|ar[k+16>>2])?0|jb[127&ar[36+(0|ar[k>>2])>>2]](k):0|gf(0|ar[A>>2]),-1)){ar[r>>2]=0,y=49;break}if(i)break;y=51;break}y=49}while(0);return 49==(0|y)&&i&&(y=51),51==(0|y)&&(ar[f>>2]=2|ar[f>>2]),y=0|ar[e>>2],Bu(s),Bu(b),ur=d,0|y},function(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s=0,d=0;return s=ur=(A=ur)+31&-32,ur=ur+96|0,o=s+8|0,l=(u=s)+71|0,t=s+28|0,c=s+24|0,a=s+16|0,s=s+20|0,ar[(d=u)>>2]=37,wr(u+1|(ar[d+4>>2]=0),53899,1,0|ar[r+4>>2]),d=0|dn(),ar[(b=o)>>2]=f,ar[4+b>>2]=n,n=0|nr(l,f=l+(0|fr(l,23,d,u,o))|0,r),Tf(o,r),vr(l,n,f,t,c,a,o),bn(o),ar[s>>2]=ar[e>>2],f=0|ar[c>>2],n=0|ar[a>>2],ar[o>>2]=ar[s>>2],n=0|PA(o,t,f,n,r,i),ur=A,0|n},function(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s=0,d=0;return s=ur=(A=ur)+31&-32,ur=ur+96|0,o=s+8|0,l=(u=s)+71|0,t=s+28|0,c=s+24|0,a=s+16|0,s=s+20|0,ar[(d=u)>>2]=37,wr(u+1|(ar[d+4>>2]=0),53899,0,0|ar[r+4>>2]),d=0|dn(),ar[(b=o)>>2]=f,ar[4+b>>2]=n,n=0|nr(l,f=l+(0|fr(l,23,d,u,o))|0,r),Tf(o,r),vr(l,n,f,t,c,a,o),bn(o),ar[s>>2]=ar[e>>2],f=0|ar[c>>2],n=0|ar[a>>2],ar[o>>2]=ar[s>>2],n=0|PA(o,t,f,n,r,i),ur=A,0|n},function(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s=0,d=0;return s=ur=(A=ur)+31&-32,ur=ur+224|0,o=s+8|0,l=(u=s)+200|0,t=s+28|0,c=s+24|0,a=s+16|0,s=s+20|0,ar[(d=u)>>2]=37,wr(u+1|(ar[d+4>>2]=0),53899,1,0|ar[r+4>>2]),d=0|dn(),ar[(b=o)>>2]=f,ar[4+b>>2]=n,n=0|nr(l,f=l+(0|fr(l,23,d,u,o))|0,r),Tf(o,r),pr(l,n,f,t,c,a,o),bn(o),ar[s>>2]=ar[e>>2],f=0|ar[c>>2],n=0|ar[a>>2],ar[o>>2]=ar[s>>2],n=0|mr(o,t,f,n,r,i),ur=A,0|n},function(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s=0,d=0;return s=ur=(A=ur)+31&-32,ur=ur+224|0,o=s+8|0,l=(u=s)+200|0,t=s+28|0,c=s+24|0,a=s+16|0,s=s+20|0,ar[(d=u)>>2]=37,wr(u+1|(ar[d+4>>2]=0),53899,0,0|ar[r+4>>2]),d=0|dn(),ar[(b=o)>>2]=f,ar[4+b>>2]=n,n=0|nr(l,f=l+(0|fr(l,23,d,u,o))|0,r),Tf(o,r),pr(l,n,f,t,c,a,o),bn(o),ar[s>>2]=ar[e>>2],f=0|ar[c>>2],n=0|ar[a>>2],ar[o>>2]=ar[s>>2],n=0|mr(o,t,f,n,r,i),ur=A,0|n},function(A,e,r,i,f,n){var t,o,a,c,l;return A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,c=ur=(t=ur)+31&-32,ur=ur+16|0,o=12+c|0,a=8+c|0,ar[(l=4+c|0)>>2]=ar[e>>2],ar[c>>2]=ar[r>>2],ar[a>>2]=ar[l>>2],ar[o>>2]=ar[c>>2],n=0|Er(A,a,o,i,f,n,54427,54435),ur=t,0|n},function(A,e,r,i,f,n){e|=0,r|=0,i|=0,f|=0,n|=0;var t,o,a,c,l,u,b=0;return c=ur=(t=ur)+31&-32,ur=ur+16|0,o=12+c|0,a=8+c|0,l=4+c|0,b=0|jb[127&ar[20+(0|ar[(b=(A|=0)+8|0)>>2])>>2]](b),ar[l>>2]=ar[e>>2],ar[c>>2]=ar[r>>2],r=(e=(u=(r=0|tr[b+11>>0])<<24>>24<0)?0|ar[b>>2]:b)+(u?0|ar[b+4>>2]:255&r)|0,ar[a>>2]=ar[l>>2],ar[o>>2]=ar[c>>2],n=0|Er(A,a,o,i,f,n,e,r),ur=t,0|n},function(A,e,r,i,f,n){var t,o,a;return A|=0,e|=0,r|=0,f|=0,n|=0,a=ur=(t=ur)+31&-32,ur=ur+16|0,Tf(o=4+a|0,i|=0),i=0|un(o,59232),bn(o),ar[a>>2]=ar[r>>2],ar[o>>2]=ar[a>>2],yr(A,n+24|0,e,o,f,i),ur=t,0|ar[e>>2]},function(A,e,r,i,f,n){var t,o,a;return A|=0,e|=0,r|=0,f|=0,n|=0,a=ur=(t=ur)+31&-32,ur=ur+16|0,Tf(o=4+a|0,i|=0),i=0|un(o,59232),bn(o),ar[a>>2]=ar[r>>2],ar[o>>2]=ar[a>>2],Br(A,n+16|0,e,o,f,i),ur=t,0|ar[e>>2]},function(A,e,r,i,f,n){var t,o,a;return A|=0,e|=0,r|=0,f|=0,n|=0,a=ur=(t=ur)+31&-32,ur=ur+16|0,Tf(o=4+a|0,i|=0),i=0|un(o,59232),bn(o),ar[a>>2]=ar[r>>2],ar[o>>2]=ar[a>>2],Yr(A,n+20|0,e,o,f,i),ur=t,0|ar[e>>2]},function(A,e,r,i,f,n){var t,o,a,c,l;return A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,c=ur=(t=ur)+31&-32,ur=ur+16|0,o=12+c|0,a=8+c|0,ar[(l=4+c|0)>>2]=ar[e>>2],ar[c>>2]=ar[r>>2],ar[a>>2]=ar[l>>2],ar[o>>2]=ar[c>>2],n=0|Sr(A,a,o,i,f,n,16404,16436),ur=t,0|n},function(A,e,r,i,f,n){e|=0,r|=0,i|=0,f|=0,n|=0;var t,o,a,c,l,u,b=0;return c=ur=(t=ur)+31&-32,ur=ur+16|0,o=12+c|0,a=8+c|0,l=4+c|0,b=0|jb[127&ar[20+(0|ar[(b=(A|=0)+8|0)>>2])>>2]](b),ar[l>>2]=ar[e>>2],ar[c>>2]=ar[r>>2],r=(e=(u=(r=0|tr[b+8+3>>0])<<24>>24<0)?0|ar[b>>2]:b)+((u?0|ar[b+4>>2]:255&r)<<2)|0,ar[a>>2]=ar[l>>2],ar[o>>2]=ar[c>>2],n=0|Sr(A,a,o,i,f,n,e,r),ur=t,0|n},function(A,e,r,i,f,n){var t,o,a;return A|=0,e|=0,r|=0,f|=0,n|=0,a=ur=(t=ur)+31&-32,ur=ur+16|0,Tf(o=4+a|0,i|=0),i=0|un(o,59264),bn(o),ar[a>>2]=ar[r>>2],ar[o>>2]=ar[a>>2],Tr(A,n+24|0,e,o,f,i),ur=t,0|ar[e>>2]},function(A,e,r,i,f,n){var t,o,a;return A|=0,e|=0,r|=0,f|=0,n|=0,a=ur=(t=ur)+31&-32,ur=ur+16|0,Tf(o=4+a|0,i|=0),i=0|un(o,59264),bn(o),ar[a>>2]=ar[r>>2],ar[o>>2]=ar[a>>2],Ur(A,n+16|0,e,o,f,i),ur=t,0|ar[e>>2]},function(A,e,r,i,f,n){var t,o,a;return A|=0,e|=0,r|=0,f|=0,n|=0,a=ur=(t=ur)+31&-32,ur=ur+16|0,Tf(o=4+a|0,i|=0),i=0|un(o,59264),bn(o),ar[a>>2]=ar[r>>2],ar[o>>2]=ar[a>>2],Ai(A,n+20|0,e,o,f,i),ur=t,0|ar[e>>2]},function(A,e,r,i,f,n){A|=0,e|=0,r|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p=0,y=0,B=0,E=0,X=0,W=0;for(b=ur=(Z=ur)+31&-32,ur=ur+176|0,c=56+b|0,d=164+b|0,k=161+b|0,h=160+b|0,w=40+b|0,v=28+b|0,m=16+b|0,t=12+b|0,a=60+b|0,l=8+b|0,u=4+b|0,Tf(g=52+b|0,i|=0),s=0|un(g,59232),y=n+4|0,E=0|((A=(E=0|tr[(p=n+11|0)>>0])<<24>>24<0)?0|ar[y>>2]:255&E)?(E=0|tr[(A?0|ar[n>>2]:n)>>0])<<24>>24==(0|Hb[31&ar[28+(0|ar[s>>2])>>2]](s,45))<<24>>24:0,ar[w>>2]=0,ar[4+w>>2]=0,A=ar[8+w>>2]=0;3!=(0|A);)A=A+1|(ar[w+(A<<2)>>2]=0);for(ar[v>>2]=0,ar[4+v>>2]=0,A=ar[8+v>>2]=0;3!=(0|A);)A=A+1|(ar[v+(A<<2)>>2]=0);for(ar[m>>2]=0,ar[4+m>>2]=0,A=ar[8+m>>2]=0;3!=(0|A);)A=A+1|(ar[m+(A<<2)>>2]=0);return ki(r,E,g,d,k,h,w,v,m,t),B=(o=(B=0|tr[p>>0])<<24>>24<0)?0|ar[y>>2]:255&B,100<(A=(r=(0|(y=0|ar[t>>2]))<(0|B)?(p=0|tr[11+m>>0],r=0|tr[11+v>>0],A=1,p=(p<<24>>24<0?0|ar[4+m>>2]:255&p)+(B-y<<1)|0,r<<24>>24<0?0|ar[4+v>>2]:255&r):(r=0|tr[11+m>>0],A=2,p=(p=0|tr[11+v>>0])<<24>>24<0?0|ar[4+v>>2]:255&p,r<<24>>24<0?0|ar[4+m>>2]:255&r))+y+p+A|0)>>>0?(A=0|yc(A))?W=X=A:gu():(X=a,W=0),n=o?0|ar[n>>2]:n,hi(X,l,u,0|ar[i+4>>2],n,n+B|0,s,E,d,0|tr[k>>0],0|tr[h>>0],w,v,m,y),ar[b>>2]=ar[e>>2],n=0|ar[l>>2],A=0|ar[u>>2],ar[c>>2]=ar[b>>2],A=0|PA(c,X,n,A,i,f),0|W&&Bc(W),Bu(m),Bu(v),Bu(w),bn(g),ur=Z,0|A},function(A,e,r,i,f,n){A|=0,e|=0,r|=0,f|=0,n|=0;var t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p=0,y=0,B=0,E=0,X=0,W=0;for(b=ur=(Z=ur)+31&-32,ur=ur+480|0,c=468+b|0,d=472+b|0,k=460+b|0,h=456+b|0,w=444+b|0,v=432+b|0,m=420+b|0,t=416+b|0,a=16+b|0,l=8+b|0,u=4+b|0,Tf(g=464+b|0,i|=0),s=0|un(g,59264),y=n+4|0,E=0|((A=(E=0|tr[(p=n+8+3|0)>>0])<<24>>24<0)?0|ar[y>>2]:255&E)?(0|(E=0|ar[(A?0|ar[n>>2]:n)>>2]))==(0|Hb[31&ar[44+(0|ar[s>>2])>>2]](s,45)):0,ar[w>>2]=0,ar[4+w>>2]=0,A=ar[8+w>>2]=0;3!=(0|A);)A=A+1|(ar[w+(A<<2)>>2]=0);for(ar[v>>2]=0,ar[4+v>>2]=0,A=ar[8+v>>2]=0;3!=(0|A);)A=A+1|(ar[v+(A<<2)>>2]=0);for(ar[m>>2]=0,ar[4+m>>2]=0,A=ar[8+m>>2]=0;3!=(0|A);)A=A+1|(ar[m+(A<<2)>>2]=0);return _l(r,E,g,d,k,h,w,v,m,t),B=(o=(B=0|tr[p>>0])<<24>>24<0)?0|ar[y>>2]:255&B,100<(A=(r=(0|(y=0|ar[t>>2]))<(0|B)?(p=0|tr[8+m+3>>0],r=0|tr[8+v+3>>0],A=1,p=(p<<24>>24<0?0|ar[4+m>>2]:255&p)+(B-y<<1)|0,r<<24>>24<0?0|ar[4+v>>2]:255&r):(r=0|tr[8+m+3>>0],A=2,p=(p=0|tr[8+v+3>>0])<<24>>24<0?0|ar[4+v>>2]:255&p,r<<24>>24<0?0|ar[4+m>>2]:255&r))+y+p+A|0)>>>0?(A=0|yc(A<<2))?W=X=A:gu():(X=a,W=0),n=o?0|ar[n>>2]:n,Yl(X,l,u,0|ar[i+4>>2],n,n+(B<<2)|0,s,E,d,0|ar[k>>2],0|ar[h>>2],w,v,m,y),ar[b>>2]=ar[e>>2],n=0|ar[l>>2],A=0|ar[u>>2],ar[c>>2]=ar[b>>2],A=0|mr(c,X,n,A,i,f),0|W&&Bc(W),Qu(m),Qu(v),Bu(w),bn(g),ur=Z,0|A},Vb,Vb,Vb,Vb,Vb,Vb,Vb,Vb,Vb,Vb,Vb,Vb,Vb,Vb,Vb,Vb,Vb,Vb,Vb,Vb,Vb,Vb,Vb,Vb,Vb],As=[Fb,function(A,e,r,i,f,n,t){var o;for(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,i=ur=(o=ur)+31&-32,ur=ur+112|0,r=i+4|0,ar[i>>2]=r+100,fi(A+8|0,r,i,f,n,t),t=0|ar[i>>2],n=r,r=0|ar[e>>2];(0|n)!=(0|t);)i=0|tr[n>>0],r=!r||(e=0|Mf(i=(0|(f=0|ar[(A=r+24|0)>>2]))==(0|ar[r+28>>2])?(e=0|ar[52+(0|ar[r>>2])>>2],i=0|hf(i),0|Hb[31&e](r,i)):(ar[A>>2]=f+1,0|hf(tr[f>>0]=i)),-1))?0:r,n=n+1|0;return ur=o,0|r},function(A,e,r,i,f,n,t){var o;for(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,i=ur=(o=ur)+31&-32,ur=ur+416|0,r=i+8|0,ar[i>>2]=r+400,function(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o,a,c,l=0;l=ur=(t=ur)+31&-32,ur=ur+128|0,a=l+16|0,c=l+12|0,l=(o=l)+8|0,ar[c>>2]=100+a,fi(A,a,c,i,f,n),ar[(i=o)>>2]=0,ar[i+4>>2]=0,ar[l>>2]=a,i=0|function(A,e){return(e|=0)-(A|=0)>>2|0}(e,0|ar[r>>2]),A=0|rf(0|ar[A>>2]),i=0|Xi(e,l,i,o),0|A&&rf(A);{if(-1!=(0|i))return ar[r>>2]=e+(i<<2),ur=t;ti()}}(A+8|0,r,i,f,n,t),t=0|ar[i>>2],n=r,r=0|ar[e>>2];(0|n)!=(0|t);)i=0|ar[n>>2],r=!r||(e=0|Uf(i=(0|(f=0|ar[(A=r+24|0)>>2]))==(0|ar[r+28>>2])?(e=0|ar[52+(0|ar[r>>2])>>2],i=0|gf(i),0|Hb[31&e](r,i)):(ar[A>>2]=f+4,0|gf(ar[f>>2]=i)),-1))?0:r,n=n+4|0;return ur=o,0|r},function(A,e,r,i,f,n,t){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0;var o,a,c,l,u,b,s,d,k=0,h=0,w=0,v=0,m=0,g=0,Z=0;if(m=ur=(s=ur)+31&-32,ur=ur+240|0,o=m+24|0,v=(c=m)+140|0,b=m+16|0,a=m+12|0,l=m+8|0,k=m+136|0,d=m+4|0,m=m+36|0,ar[b>>2]=v,ar[(u=4+b|0)>>2]=444,Tf(l,f),A=0|un(l,59232),tr[k>>0]=0,ar[d>>2]=ar[r>>2],w=0|ar[f+4>>2],ar[o>>2]=ar[d>>2],0|ai(e,o,i,l,w,n,k,A,b,a,v+100|0)){for(Pb[7&ar[32+(0|ar[A>>2])>>2]](A,54952,54962,o),98<(0|(A=(w=0|ar[a>>2])-(i=0|ar[b>>2])|0))?(A=0|yc(A+2|0))?g=h=A:gu():(h=m,g=0),A=0|tr[k>>0]?(tr[h>>0]=45,h+1|0):h,h=10+o|0,v=o,k=i,f=A,A=w;!(A>>>0<=k>>>0);){for(i=0|tr[k>>0],A=o;;){if((0|A)==(0|h)){A=h;break}if((0|tr[A>>0])==i<<24>>24)break;A=A+1|0}tr[f>>0]=0|tr[A-v+54952>>0],k=k+1|0,f=f+1|0,A=0|ar[a>>2]}tr[f>>0]=0,ar[c>>2]=t,1!=(0|ji(m,54963,c))&&ti(),0|g&&Bc(g)}A=0|ar[e>>2];do{if(A){if(0|Mf(A=(0|(i=0|ar[A+12>>2]))==(0|ar[A+16>>2])?0|jb[127&ar[36+(0|ar[A>>2])>>2]](A):0|hf(0|tr[i>>0]),-1)){ar[e>>2]=0,f=1;break}f=0==(0|ar[e>>2]);break}f=1}while(0);A=0|ar[r>>2];do{if(A){if(0|Mf(A=(0|(i=0|ar[A+12>>2]))==(0|ar[A+16>>2])?0|jb[127&ar[36+(0|ar[A>>2])>>2]](A):0|hf(0|tr[i>>0]),-1)){ar[r>>2]=0,Z=32;break}if(f)break;Z=34;break}Z=32}while(0);return 32==(0|Z)&&f&&(Z=34),34==(0|Z)&&(ar[n>>2]=2|ar[n>>2]),i=0|ar[e>>2],bn(l),A=0|ar[b>>2],(ar[b>>2]=0)|A&&is[511&ar[u>>2]](A),ur=s,0|i},function(A,e,r,i,f,n,t){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0;var o,a,c,l,u,b,s,d=0,k=0,h=0,w=0;if(h=ur=(s=ur)+31&-32,ur=ur+144|0,d=h+24|0,A=h+32|0,b=h+16|0,a=h+8|0,k=(l=h)+28|0,h=h+4|0,ar[b>>2]=A,ar[(u=4+b|0)>>2]=444,Tf(l,f),o=0|un(l,59232),c=(tr[k>>0]=0)|ar[r>>2],ar[h>>2]=c,f=0|ar[f+4>>2],ar[d>>2]=ar[h>>2],h=c,0|ai(e,d,i,l,f,n,k,o,b,a,A+100|0)){for((0|tr[(A=t+11|0)>>0])<0?(i=0|ar[t>>2],tr[d>>0]=0,Qf(i,d),ar[t+4>>2]=0):(tr[d>>0]=0,Qf(t,d),tr[A>>0]=0),0|tr[k>>0]&&_u(t,0|Hb[31&ar[28+(0|ar[o>>2])>>2]](o,45)),k=0|Hb[31&ar[28+(0|ar[o>>2])>>2]](o,48),d=(f=0|ar[a>>2])+-1|0,A=0|ar[b>>2];!(d>>>0<=A>>>0)&&(0|tr[A>>0])==k<<24>>24;)A=A+1|0;!function(A,e,r){r|=0;var i,f,n,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;c=ur=(n=ur)+31&-32,ur=ur+16|0,i=e|=0,s=c+12|0,o=0|tr[(b=11+(A|=0)|0)>>0],l=(t=o<<24>>24<0)?(u=0|ar[A+4>>2],(2147483647&ar[A+8>>2])-1|0):(u=255&o,10);f=r-i|0;do{if(0|f){if(t?(o=0|ar[A>>2],a=o,t=0|ar[A+4>>2]):(t=255&o,o=a=A),0|ci(e,o,a+t|0)){for(ar[c>>2]=0,ar[c+4>>2]=0,ar[c+8>>2]=0,4294967279<f>>>0&&pu(),f>>>0<11?(tr[c+11>>0]=f,o=c):(o=0|hu(b=16+f&-16),ar[c>>2]=o,ar[c+8>>2]=-2147483648|b,ar[c+4>>2]=f),t=o;(0|e)!=(0|r);)Qf(t,e),e=e+1|0,t=t+1|0;tr[s>>0]=0,Qf(o+f|0,s),s=0|tr[c+11>>0],Nu(A,(r=s<<24>>24<0)?0|ar[c>>2]:c,r?0|ar[c+4>>2]:255&s),Bu(c);break}for(c=u+f|0,(l-u|0)>>>0<f>>>0&&Ru(A,l,c-l|0,u,u,0,0),a=(0|tr[b>>0])<0?0|ar[A>>2]:A,o=r+(u-i)|0,t=a+u|0;(0|e)!=(0|r);)Qf(t,e),t=t+1|0,e=e+1|0;if(tr[s>>0]=0,Qf(a+o|0,s),(0|tr[b>>0])<0){ar[A+4>>2]=c;break}tr[b>>0]=c;break}}while(0);ur=n}(t,A,f)}A=0|ar[e>>2];do{if(A){if(0|Mf(A=(0|(f=0|ar[A+12>>2]))==(0|ar[A+16>>2])?0|jb[127&ar[36+(0|ar[A>>2])>>2]](A):0|hf(0|tr[f>>0]),-1)){ar[e>>2]=0,f=1;break}f=0==(0|ar[e>>2]);break}f=1}while(0);do{if(c){if(0|Mf(A=(0|(A=0|ar[h+12>>2]))==(0|ar[h+16>>2])?0|jb[127&ar[36+(0|ar[c>>2])>>2]](h):0|hf(0|tr[A>>0]),-1)){ar[r>>2]=0,w=25;break}if(f)break;w=27;break}w=25}while(0);return 25==(0|w)&&f&&(w=27),27==(0|w)&&(ar[n>>2]=2|ar[n>>2]),f=0|ar[e>>2],bn(l),A=0|ar[b>>2],(ar[b>>2]=0)|A&&is[511&ar[u>>2]](A),ur=s,0|f},function(A,e,r,i,f,n,t){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0;var o,a,c,l,u,b,s,d,k=0,h=0,w=0,v=0,m=0,g=0,Z=0;if(m=ur=(s=ur)+31&-32,ur=ur+576|0,o=m+424|0,v=(c=m)+24|0,b=m+16|0,a=m+12|0,l=m+8|0,k=m+564|0,d=m+4|0,m=m+464|0,ar[b>>2]=v,ar[(u=4+b|0)>>2]=444,Tf(l,f),A=0|un(l,59264),tr[k>>0]=0,ar[d>>2]=ar[r>>2],w=0|ar[f+4>>2],ar[o>>2]=ar[d>>2],0|bi(e,o,i,l,w,n,k,A,b,a,v+400|0)){for(Pb[7&ar[48+(0|ar[A>>2])>>2]](A,55062,55072,o),392<(0|(A=(w=0|ar[a>>2])-(i=0|ar[b>>2])|0))?(A=0|yc(2+(A>>>2)|0))?g=h=A:gu():(h=m,g=0),A=0|tr[k>>0]?(tr[h>>0]=45,h+1|0):h,h=40+o|0,v=o,k=i,f=A,A=w;!(A>>>0<=k>>>0);){for(i=0|ar[k>>2],A=o;;){if((0|A)==(0|h)){A=h;break}if((0|ar[A>>2])==(0|i))break;A=A+4|0}tr[f>>0]=0|tr[55062+(A-v>>2)>>0],k=k+4|0,f=f+1|0,A=0|ar[a>>2]}tr[f>>0]=0,ar[c>>2]=t,1!=(0|ji(m,54963,c))&&ti(),0|g&&Bc(g)}A=0|ar[e>>2];do{if(A){if(0|Uf(A=(0|(i=0|ar[A+12>>2]))==(0|ar[A+16>>2])?0|jb[127&ar[36+(0|ar[A>>2])>>2]](A):0|gf(0|ar[i>>2]),-1)){ar[e>>2]=0,f=1;break}f=0==(0|ar[e>>2]);break}f=1}while(0);A=0|ar[r>>2];do{if(A){if(0|Uf(A=(0|(i=0|ar[A+12>>2]))==(0|ar[A+16>>2])?0|jb[127&ar[36+(0|ar[A>>2])>>2]](A):0|gf(0|ar[i>>2]),-1)){ar[r>>2]=0,Z=32;break}if(f)break;Z=34;break}Z=32}while(0);return 32==(0|Z)&&f&&(Z=34),34==(0|Z)&&(ar[n>>2]=2|ar[n>>2]),i=0|ar[e>>2],bn(l),A=0|ar[b>>2],(ar[b>>2]=0)|A&&is[511&ar[u>>2]](A),ur=s,0|i},function(A,e,r,i,f,n,t){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0;var o,a,c,l,u,b,s,d=0,k=0,h=0,w=0;if(h=ur=(s=ur)+31&-32,ur=ur+432|0,d=h+424|0,A=h+24|0,b=h+16|0,a=h+8|0,k=(l=h)+428|0,h=h+4|0,ar[b>>2]=A,ar[(u=4+b|0)>>2]=444,Tf(l,f),o=0|un(l,59264),c=(tr[k>>0]=0)|ar[r>>2],ar[h>>2]=c,f=0|ar[f+4>>2],ar[d>>2]=ar[h>>2],h=c,0|bi(e,d,i,l,f,n,k,o,b,a,A+400|0)){for((0|tr[(A=t+8+3|0)>>0])<0?(i=0|ar[t>>2],ar[d>>2]=0,ln(i,d),ar[t+4>>2]=0):(ar[d>>2]=0,ln(t,d),tr[A>>0]=0),0|tr[k>>0]&&Ou(t,0|Hb[31&ar[44+(0|ar[o>>2])>>2]](o,45)),k=0|Hb[31&ar[44+(0|ar[o>>2])>>2]](o,48),d=(f=0|ar[a>>2])+-4|0,A=0|ar[b>>2];!(d>>>0<=A>>>0)&&(0|ar[A>>2])==(0|k);)A=A+4|0;!function(A,e,r){e|=0,r|=0;var i,f,n,t,o,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0;n=ur=(o=ur)+31&-32,ur=ur+16|0,k=12+n|0,i=0|tr[(t=3+(a=8+(A|=0)|0)|0)>>0],u=(c=i<<24>>24<0)?(d=0|ar[A+4>>2],(2147483647&ar[a>>2])-1|0):(d=255&i,1);f=r-e>>2;do{if(0|f){if(c?(c=0|ar[A>>2],l=c,a=0|ar[A+4>>2]):(a=255&i,c=l=A),0|si(e,c,l+(a<<2)|0)){ar[n>>2]=0,ar[4+n>>2]=0,ar[8+n>>2]=0,1073741807<f>>>0&&pu();do{if(2<=f>>>0){if(!(1073741823<(a=4+f&-4)>>>0)){s=0|hu(a<<2),ar[n>>2]=s,ar[8+n>>2]=-2147483648|a,ar[4+n>>2]=f,b=e;break}lA()}else tr[8+n+3>>0]=f,b=e,s=n}while(0);for(;(0|b)!=(0|r);)ln(s,b),b=b+4|0,s=s+4|0;ar[k>>2]=0,ln(s,k),k=0|tr[8+n+3>>0],Su(A,(r=k<<24>>24<0)?0|ar[n>>2]:n,r?0|ar[4+n>>2]:255&k),Qu(n);break}for(c=d+f|0,(u-d|0)>>>0<f>>>0&&Uu(A,u,c-u|0,d,d,0,0),a=(a=(0|tr[t>>0])<0?0|ar[A>>2]:A)+(d<<2)|0;(0|e)!=(0|r);)ln(a,e),a=a+4|0,e=e+4|0;if(ar[k>>2]=0,ln(a,k),(0|tr[t>>0])<0){ar[A+4>>2]=c;break}tr[t>>0]=c;break}}while(0);ur=o}(t,A,f)}A=0|ar[e>>2];do{if(A){if(0|Uf(A=(0|(f=0|ar[A+12>>2]))==(0|ar[A+16>>2])?0|jb[127&ar[36+(0|ar[A>>2])>>2]](A):0|gf(0|ar[f>>2]),-1)){ar[e>>2]=0,f=1;break}f=0==(0|ar[e>>2]);break}f=1}while(0);do{if(c){if(0|Uf(A=(0|(A=0|ar[h+12>>2]))==(0|ar[h+16>>2])?0|jb[127&ar[36+(0|ar[c>>2])>>2]](h):0|gf(0|ar[A>>2]),-1)){ar[r>>2]=0,w=25;break}if(f)break;w=27;break}w=25}while(0);return 25==(0|w)&&f&&(w=27),27==(0|w)&&(ar[n>>2]=2|ar[n>>2]),f=0|ar[e>>2],bn(l),A=0|ar[b>>2],(ar[b>>2]=0)|A&&is[511&ar[u>>2]](A),ur=s,0|f},Fb],es=[Rb,function(A,e,r,i,f,n,t,o){A|=0,e|=0,r|=0,i|=0,n|=0,t|=0,o|=0;var a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p,y,B,E,X,W,I,C,G,V,F,R,N,_,Y,Q,D,J,M,T,U,S,O,z,j=0,H=0;switch(Q=ur=(z=ur)+31&-32,ur=ur+144|0,a=128+Q|0,o=112+Q|0,O=124+Q|0,j=120+Q|0,c=116+Q|0,l=108+Q|0,u=104+Q|0,b=100+Q|0,s=96+Q|0,d=92+Q|0,k=88+Q|0,h=84+Q|0,w=80+Q|0,v=76+Q|0,m=72+Q|0,g=68+Q|0,Z=64+Q|0,p=60+Q|0,y=56+Q|0,B=52+Q|0,E=48+Q|0,X=44+Q|0,W=40+Q|0,I=36+Q|0,C=32+Q|0,G=28+Q|0,V=24+Q|0,F=20+Q|0,R=16+Q|0,N=12+Q|0,_=8+Q|0,Y=4+Q|0,ar[(f|=0)>>2]=0,Tf(a,i),D=0|un(a,59232),bn(a),J=n+8|0,M=n+20|0,T=n+16|0,U=n+24|0,S=A+8|0,t<<24>>24|0){case 65:case 97:ar[O>>2]=ar[r>>2],ar[a>>2]=ar[O>>2],yr(A,U,e,a,f,D),H=26;break;case 104:case 66:case 98:ar[j>>2]=ar[r>>2],ar[a>>2]=ar[j>>2],Br(A,T,e,a,f,D),H=26;break;case 99:j=0|jb[127&ar[12+(0|ar[S>>2])>>2]](S),ar[c>>2]=ar[e>>2],ar[l>>2]=ar[r>>2],H=(t=(r=(H=0|tr[j+11>>0])<<24>>24<0)?0|ar[j>>2]:j)+(r?0|ar[j+4>>2]:255&H)|0,ar[o>>2]=ar[c>>2],ar[a>>2]=ar[l>>2],H=0|Er(A,o,a,i,f,n,t,H),ar[e>>2]=H,H=26;break;case 101:case 100:ar[u>>2]=ar[r>>2],ar[a>>2]=ar[u>>2],Xr(A,n+12|0,e,a,f,D),H=26;break;case 68:ar[b>>2]=ar[e>>2],ar[s>>2]=ar[r>>2],ar[o>>2]=ar[b>>2],ar[a>>2]=ar[s>>2],H=0|Er(A,o,a,i,f,n,54387,54395),ar[e>>2]=H,H=26;break;case 70:ar[d>>2]=ar[e>>2],ar[k>>2]=ar[r>>2],ar[o>>2]=ar[d>>2],ar[a>>2]=ar[k>>2],H=0|Er(A,o,a,i,f,n,54395,54403),ar[e>>2]=H,H=26;break;case 72:ar[h>>2]=ar[r>>2],ar[a>>2]=ar[h>>2],Wr(A,J,e,a,f,D),H=26;break;case 73:ar[w>>2]=ar[r>>2],ar[a>>2]=ar[w>>2],Ir(A,J,e,a,f,D),H=26;break;case 106:ar[v>>2]=ar[r>>2],ar[a>>2]=ar[v>>2],Cr(A,n+28|0,e,a,f,D),H=26;break;case 109:ar[m>>2]=ar[r>>2],ar[a>>2]=ar[m>>2],Gr(A,T,e,a,f,D),H=26;break;case 77:ar[g>>2]=ar[r>>2],ar[a>>2]=ar[g>>2],Vr(A,n+4|0,e,a,f,D),H=26;break;case 116:case 110:ar[Z>>2]=ar[r>>2],ar[a>>2]=ar[Z>>2],Fr(A,e,a,f,D),H=26;break;case 112:ar[p>>2]=ar[r>>2],ar[a>>2]=ar[p>>2],Rr(A,J,e,a,f,D),H=26;break;case 114:ar[y>>2]=ar[e>>2],ar[B>>2]=ar[r>>2],ar[o>>2]=ar[y>>2],ar[a>>2]=ar[B>>2],H=0|Er(A,o,a,i,f,n,54403,54414),ar[e>>2]=H,H=26;break;case 82:ar[E>>2]=ar[e>>2],ar[X>>2]=ar[r>>2],ar[o>>2]=ar[E>>2],ar[a>>2]=ar[X>>2],H=0|Er(A,o,a,i,f,n,54414,54419),ar[e>>2]=H,H=26;break;case 83:ar[W>>2]=ar[r>>2],ar[a>>2]=ar[W>>2],Nr(A,n,e,a,f,D),H=26;break;case 84:ar[I>>2]=ar[e>>2],ar[C>>2]=ar[r>>2],ar[o>>2]=ar[I>>2],ar[a>>2]=ar[C>>2],H=0|Er(A,o,a,i,f,n,54419,54427),ar[e>>2]=H,H=26;break;case 119:ar[G>>2]=ar[r>>2],ar[a>>2]=ar[G>>2],_r(A,U,e,a,f,D),H=26;break;case 120:t=0|ar[20+(0|ar[A>>2])>>2],ar[V>>2]=ar[e>>2],ar[F>>2]=ar[r>>2],ar[o>>2]=ar[V>>2],ar[a>>2]=ar[F>>2],o=0|$b[63&t](A,o,a,i,f,n);break;case 88:j=0|jb[127&ar[24+(0|ar[S>>2])>>2]](S),ar[R>>2]=ar[e>>2],ar[N>>2]=ar[r>>2],H=(t=(r=(H=0|tr[j+11>>0])<<24>>24<0)?0|ar[j>>2]:j)+(r?0|ar[j+4>>2]:255&H)|0,ar[o>>2]=ar[R>>2],ar[a>>2]=ar[N>>2],H=0|Er(A,o,a,i,f,n,t,H),ar[e>>2]=H,H=26;break;case 121:ar[_>>2]=ar[r>>2],ar[a>>2]=ar[_>>2],Yr(A,M,e,a,f,D),H=26;break;case 89:ar[Y>>2]=ar[r>>2],ar[a>>2]=ar[Y>>2],Qr(A,M,e,a,f,D),H=26;break;case 37:ar[Q>>2]=ar[r>>2],ar[a>>2]=ar[Q>>2],Dr(A,e,a,f,D),H=26;break;default:ar[f>>2]=4|ar[f>>2],H=26}return 26==(0|H)&&(o=0|ar[e>>2]),ur=z,0|o},function(A,e,r,i,f,n,t,o){A|=0,e|=0,r|=0,i|=0,n|=0,t|=0,o|=0;var a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p,y,B,E,X,W,I,C,G,V,F,R,N,_,Y,Q,D,J,M,T,U,S,O,z,j=0,H=0;switch(Q=ur=(z=ur)+31&-32,ur=ur+144|0,a=128+Q|0,o=112+Q|0,O=124+Q|0,j=120+Q|0,c=116+Q|0,l=108+Q|0,u=104+Q|0,b=100+Q|0,s=96+Q|0,d=92+Q|0,k=88+Q|0,h=84+Q|0,w=80+Q|0,v=76+Q|0,m=72+Q|0,g=68+Q|0,Z=64+Q|0,p=60+Q|0,y=56+Q|0,B=52+Q|0,E=48+Q|0,X=44+Q|0,W=40+Q|0,I=36+Q|0,C=32+Q|0,G=28+Q|0,V=24+Q|0,F=20+Q|0,R=16+Q|0,N=12+Q|0,_=8+Q|0,Y=4+Q|0,ar[(f|=0)>>2]=0,Tf(a,i),D=0|un(a,59264),bn(a),J=n+8|0,M=n+20|0,T=n+16|0,U=n+24|0,S=A+8|0,t<<24>>24|0){case 65:case 97:ar[O>>2]=ar[r>>2],ar[a>>2]=ar[O>>2],Tr(A,U,e,a,f,D),H=26;break;case 104:case 66:case 98:ar[j>>2]=ar[r>>2],ar[a>>2]=ar[j>>2],Ur(A,T,e,a,f,D),H=26;break;case 99:j=0|jb[127&ar[12+(0|ar[S>>2])>>2]](S),ar[c>>2]=ar[e>>2],ar[l>>2]=ar[r>>2],H=(t=(r=(H=0|tr[j+8+3>>0])<<24>>24<0)?0|ar[j>>2]:j)+((r?0|ar[j+4>>2]:255&H)<<2)|0,ar[o>>2]=ar[c>>2],ar[a>>2]=ar[l>>2],H=0|Sr(A,o,a,i,f,n,t,H),ar[e>>2]=H,H=26;break;case 101:case 100:ar[u>>2]=ar[r>>2],ar[a>>2]=ar[u>>2],Or(A,n+12|0,e,a,f,D),H=26;break;case 68:ar[b>>2]=ar[e>>2],ar[s>>2]=ar[r>>2],ar[o>>2]=ar[b>>2],ar[a>>2]=ar[s>>2],H=0|Sr(A,o,a,i,f,n,16244,16276),ar[e>>2]=H,H=26;break;case 70:ar[d>>2]=ar[e>>2],ar[k>>2]=ar[r>>2],ar[o>>2]=ar[d>>2],ar[a>>2]=ar[k>>2],H=0|Sr(A,o,a,i,f,n,16276,16308),ar[e>>2]=H,H=26;break;case 72:ar[h>>2]=ar[r>>2],ar[a>>2]=ar[h>>2],zr(A,J,e,a,f,D),H=26;break;case 73:ar[w>>2]=ar[r>>2],ar[a>>2]=ar[w>>2],jr(A,J,e,a,f,D),H=26;break;case 106:ar[v>>2]=ar[r>>2],ar[a>>2]=ar[v>>2],Hr(A,n+28|0,e,a,f,D),H=26;break;case 109:ar[m>>2]=ar[r>>2],ar[a>>2]=ar[m>>2],xr(A,T,e,a,f,D),H=26;break;case 77:ar[g>>2]=ar[r>>2],ar[a>>2]=ar[g>>2],Pr(A,n+4|0,e,a,f,D),H=26;break;case 116:case 110:ar[Z>>2]=ar[r>>2],ar[a>>2]=ar[Z>>2],Lr(A,e,a,f,D),H=26;break;case 112:ar[p>>2]=ar[r>>2],ar[a>>2]=ar[p>>2],Kr(A,J,e,a,f,D),H=26;break;case 114:ar[y>>2]=ar[e>>2],ar[B>>2]=ar[r>>2],ar[o>>2]=ar[y>>2],ar[a>>2]=ar[B>>2],H=0|Sr(A,o,a,i,f,n,16308,16352),ar[e>>2]=H,H=26;break;case 82:ar[E>>2]=ar[e>>2],ar[X>>2]=ar[r>>2],ar[o>>2]=ar[E>>2],ar[a>>2]=ar[X>>2],H=0|Sr(A,o,a,i,f,n,16352,16372),ar[e>>2]=H,H=26;break;case 83:ar[W>>2]=ar[r>>2],ar[a>>2]=ar[W>>2],qr(A,n,e,a,f,D),H=26;break;case 84:ar[I>>2]=ar[e>>2],ar[C>>2]=ar[r>>2],ar[o>>2]=ar[I>>2],ar[a>>2]=ar[C>>2],H=0|Sr(A,o,a,i,f,n,16372,16404),ar[e>>2]=H,H=26;break;case 119:ar[G>>2]=ar[r>>2],ar[a>>2]=ar[G>>2],$r(A,U,e,a,f,D),H=26;break;case 120:t=0|ar[20+(0|ar[A>>2])>>2],ar[V>>2]=ar[e>>2],ar[F>>2]=ar[r>>2],ar[o>>2]=ar[V>>2],ar[a>>2]=ar[F>>2],o=0|$b[63&t](A,o,a,i,f,n);break;case 88:j=0|jb[127&ar[24+(0|ar[S>>2])>>2]](S),ar[R>>2]=ar[e>>2],ar[N>>2]=ar[r>>2],H=(t=(r=(H=0|tr[j+8+3>>0])<<24>>24<0)?0|ar[j>>2]:j)+((r?0|ar[j+4>>2]:255&H)<<2)|0,ar[o>>2]=ar[R>>2],ar[a>>2]=ar[N>>2],H=0|Sr(A,o,a,i,f,n,t,H),ar[e>>2]=H,H=26;break;case 121:ar[_>>2]=ar[r>>2],ar[a>>2]=ar[_>>2],Ai(A,M,e,a,f,D),H=26;break;case 89:ar[Y>>2]=ar[r>>2],ar[a>>2]=ar[Y>>2],ei(A,M,e,a,f,D),H=26;break;case 37:ar[Q>>2]=ar[r>>2],ar[a>>2]=ar[Q>>2],ri(A,e,a,f,D),H=26;break;default:ar[f>>2]=4|ar[f>>2],H=26}return 26==(0|H)&&(o=0|ar[e>>2]),ur=z,0|o},function(A,e,r,i,f,n,t,o){var a;return A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,A=ur=(e=ur)+31&-32,ur=ur+16|0,t=0|function(A,e,r,i,f,n,t,o){A|=0,e|=0,i|=0,f|=0,n|=0,t|=0,o|=0;var a=0,c=0,l=0;ar[(r|=0)>>2]=A,ar[n>>2]=i,2&o?(f-i|0)<3?A=1:(ar[n>>2]=i+1,tr[i>>0]=-17,a=0|ar[n>>2],ar[n>>2]=a+1,tr[a>>0]=-69,a=0|ar[n>>2],ar[n>>2]=a+1,tr[a>>0]=-65,a=4):a=4;A:do{if(4==(0|a))for(A=0|ar[r>>2];;){if(e>>>0<=A>>>0){A=0;break A}if(l=0|ar[A>>2],t>>>0<l>>>0|55296==(-2048&l|0)){A=2;break A}do{if(128<=l>>>0){if(c=255&(63&l|128),l>>>0<2048){if(A=0|ar[n>>2],(f-A|0)<2){A=1;break A}ar[n>>2]=A+1,tr[A>>0]=l>>>6|192,l=0|ar[n>>2],ar[n>>2]=l+1,tr[l>>0]=c;break}if(A=0|ar[n>>2],i=f-A|0,o=A+1|0,a=255&(l>>>6&63|128),l>>>0<65536){if((0|i)<3){A=1;break A}ar[n>>2]=o,tr[A>>0]=l>>>12|224,l=0|ar[n>>2],ar[n>>2]=l+1,tr[l>>0]=a,l=0|ar[n>>2],ar[n>>2]=l+1,tr[l>>0]=c;break}if((0|i)<4){A=1;break A}ar[n>>2]=o,tr[A>>0]=l>>>18|240,o=0|ar[n>>2],ar[n>>2]=o+1,tr[o>>0]=l>>>12&63|128,l=0|ar[n>>2],ar[n>>2]=l+1,tr[l>>0]=a,l=0|ar[n>>2],ar[n>>2]=l+1,tr[l>>0]=c;break}if(A=0|ar[n>>2],(f-A|0)<1){A=1;break A}ar[n>>2]=A+1,tr[A>>0]=l}while(0);A=4+(0|ar[r>>2])|0,ar[r>>2]=A}}while(0);return 0|A}(ar[(a=A+4|0)>>2]=r,i,a,ar[A>>2]=n,t,A,1114111,0),ar[f>>2]=ar[a>>2],ar[o>>2]=ar[A>>2],ur=e,0|t},function(A,e,r,i,f,n,t,o){var a;return A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,A=ur=(e=ur)+31&-32,ur=ur+16|0,t=0|function(A,e,r,i,f,n,t,o){A|=0,e|=0,i|=0,f|=0,n|=0,t|=0,o|=0;var a,c=0,l=0,u=0,b=0,s=0;ar[(r|=0)>>2]=A,ar[n>>2]=i,a=e,4&o|0&&(c=0|ar[r>>2],2<(a-c|0))&&-17==(0|tr[c>>0])&&-69==(0|tr[c+1>>0])&&-65==(0|tr[c+2>>0])&&(ar[r>>2]=c+3);A:for(;;){if(l=0|ar[r>>2],e>>>0<=l>>>0){A=0;break}if(s=0|ar[n>>2],f>>>0<=s>>>0){A=1;break}u=0|tr[l>>0],b=255&u,A=l+1|0;do{if(-1<u<<24>>24){if(t>>>0<b>>>0){A=2;break A}ar[s>>2]=b}else{if((255&u)<194){A=2;break A}if(c=l+2|0,i=a-l|0,(255&u)<224){if((0|i)<2){A=1;break A}if(128!=(192&(A=0|cr[A>>0])|0)){A=2;break A}if(t>>>0<(A=63&A|b<<6&1984)>>>0){A=2;break A}ar[s>>2]=A,A=c;break}if(o=l+3|0,(255&u)<240){if((0|i)<3){A=1;break A}switch(i=0|tr[c>>0],c=0|cr[A>>0],A=224&c,u<<24>>24){case-32:if(160==(0|A))break;A=2;break A;case-19:if(128==(0|A))break;A=2;break A;default:if(128!=(192&c|0)){A=2;break A}}if(128!=(192&(A=255&i)|0)){A=2;break A}if(t>>>0<(A=c<<6&4032|b<<12&61440|63&A)>>>0){A=2;break A}ar[s>>2]=A,A=o;break}if(245<=(255&u)){A=2;break A}if((0|i)<4){A=1;break A}switch(i=0|tr[A>>0],A=0|tr[c>>0],c=0|tr[o>>0],o=255&i,u<<24>>24){case-16:if(48<=(i+112&255)){A=2;break A}break;case-12:if(128==(240&o|0))break;A=2;break A;default:if(128!=(192&o|0)){A=2;break A}}if(128!=(192&(i=255&A)|0)){A=2;break A}if(128!=(192&(A=255&c)|0)){A=2;break A}if(t>>>0<(A=o<<12&258048|b<<18&1835008|i<<6&4032|63&A)>>>0){A=2;break A}ar[s>>2]=A,A=l+4|0}}while(0);ar[r>>2]=A,ar[n>>2]=4+(0|ar[n>>2])}return 0|A}(ar[(a=A+4|0)>>2]=r,i,a,ar[A>>2]=n,t,A,1114111,0),ar[f>>2]=ar[a>>2],ar[o>>2]=ar[A>>2],ur=e,0|t},function(A,e,r,i,f,n,t,o){A|=0,e|=0,i|=0,f|=0,n|=0,t|=0,o|=0;var a,c,l,u,b=0,s=0,d=0,k=0;for(d=ur=(u=ur)+31&-32,ur=ur+16|0,d=(l=d)+8|0,b=r|=0;;){if((0|b)==(0|i)){b=i;break}if(!(0|ar[b>>2]))break;b=b+4|0}ar[o>>2]=n,ar[f>>2]=r,a=t,c=A+8|0;A:for(;;){if((0|n)==(0|t)|(0|r)==(0|i)){b=35;break}switch(s=0|ar[(k=e)+4>>2],ar[(A=l)>>2]=ar[k>>2],ar[A+4>>2]=s,A=0|rf(0|ar[c>>2]),s=0|Fi(n,f,b-r>>2,a-n|0,e),0|A&&rf(A),0|s){case-1:b=10;break A;case 0:r=1,b=32;break A}if(n=(0|ar[o>>2])+s|0,(0|(ar[o>>2]=n))==(0|t)){b=33;break}if((0|b)==(0|i))b=i,r=0|ar[f>>2];else{if(n=0|rf(0|ar[c>>2]),r=0|$c(d,0),0|n&&rf(n),-1==(0|r)){r=2,b=31;break}if(r>>>0>(a-(0|ar[o>>2])|0)>>>0){r=1,b=31;break}for(n=d;r;)s=0|tr[n>>0],k=0|ar[o>>2],ar[o>>2]=k+1,tr[k>>0]=s,n=n+1|0,r=r+-1|0;for(r=4+(0|ar[f>>2])|0,b=ar[f>>2]=r;;){if((0|b)==(0|i)){b=i;break}if(!(0|ar[b>>2]))break;b=b+4|0}n=0|ar[o>>2]}}if(10==(0|b)){for(ar[o>>2]=n;(0|r)!=(0|ar[f>>2])&&(k=0|ar[r>>2],b=0|rf(0|ar[c>>2]),n=0|$c(n,k),0|b&&rf(b),-1!=(0|n));)n=(0|ar[o>>2])+n|0,ar[o>>2]=n,r=r+4|0;ar[f>>2]=r,r=2,b=32}else 31==(0|b)?b=32:33==(0|b)&&(r=0|ar[f>>2],b=35);return 32!=(0|b)&&35==(0|b)&&(r=(0|r)!=(0|i)&1),ur=u,0|r},function(A,e,r,i,f,n,t,o){A|=0,e|=0,i|=0,f|=0,n|=0,t|=0,o|=0;var a,c,l,u,b=0,s=0,d=0;for(l=ur=(u=ur)+31&-32,ur=ur+16|0,b=r|=0;;){if((0|b)==(0|i)){b=i;break}if(!(0|tr[b>>0]))break;b=b+1|0}for(ar[o>>2]=n,ar[f>>2]=r,a=t,c=A+8|0,A=n;;){if((0|A)==(0|t)|(0|r)==(0|i)){A=32;break}if(n=0|ar[(s=e)+4>>2],ar[(d=l)>>2]=ar[s>>2],ar[d+4>>2]=n,d=b,n=0|rf(0|ar[c>>2]),s=0|Vi(A,f,d-r|0,a-A>>2,e),0|n&&rf(n),-1==(0|s)){b=A,A=10;break}if(A=(0|ar[o>>2])+(s<<2)|0,(0|(ar[o>>2]=A))==(0|t)){A=29;break}if(r=0|ar[f>>2],(0|b)==(0|i))b=i;else{if(b=0|rf(0|ar[c>>2]),r=0|Gi(A,r,1,e),0|b&&rf(b),0|r){r=2,A=28;break}for(ar[o>>2]=4+(0|ar[o>>2]),r=1+(0|ar[f>>2])|0,b=ar[f>>2]=r;;){if((0|b)==(0|i)){b=i;break}if(!(0|tr[b>>0]))break;b=b+1|0}A=0|ar[o>>2]}}do{if(10==(0|A)){A:for(;;){if(ar[o>>2]=b,(0|r)==(0|ar[f>>2])){A=18;break}switch(A=0|rf(0|ar[c>>2]),b=0|Gi(b,r,d-r|0,l),0|A&&rf(A),0|b){case-1:A=15;break A;case-2:A=16;break A;case 0:b=1}r=r+b|0,b=4+(0|ar[o>>2])|0,A=10}if(15==(0|A)){ar[f>>2]=r,r=2,A=28;break}if(16==(0|A)){ar[f>>2]=r,r=1,A=28;break}if(18==(0|A)){r=(0|(ar[f>>2]=r))!=(0|i)&1,A=28;break}}else 29==(0|A)&&(r=0|ar[f>>2],A=32)}while(0);return 28!=(0|A)&&32==(0|A)&&(r=(0|r)!=(0|i)&1),ur=u,0|r},function(A,e,r,i,f,n,t,o){return r|=0,n|=0,o|=0,ar[(f|=0)>>2]=r,ar[o>>2]=n,3},function(A,e,r,i,f,n,t,o){return r|=0,n|=0,o|=0,ar[(f|=0)>>2]=r,ar[o>>2]=n,3},function(A,e,r,i,f,n,t,o){var a;return A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,A=ur=(e=ur)+31&-32,ur=ur+16|0,t=0|function(A,e,r,i,f,n,t,o){A|=0,e|=0,i|=0,f|=0,n|=0,t|=0,o|=0;var a=0,c=0,l=0,u=0,b=0;ar[(r|=0)>>2]=A,ar[n>>2]=i,2&o?(f-i|0)<3?A=1:(ar[n>>2]=i+1,tr[i>>0]=-17,a=0|ar[n>>2],ar[n>>2]=a+1,tr[a>>0]=-69,a=0|ar[n>>2],ar[n>>2]=a+1,tr[a>>0]=-65,a=4):a=4;A:do{if(4==(0|a))for(b=e,A=0|ar[r>>2];;){if(e>>>0<=A>>>0){A=0;break A}if(i=0|or[A>>1],t>>>0<(u=65535&i)>>>0){A=2;break A}do{if((65535&i)<128){if(A=0|ar[n>>2],(f-A|0)<1){A=1;break A}ar[n>>2]=A+1,tr[A>>0]=i}else{if(l=255&(128|(c=63&u)),(65535&i)<2048){if(A=0|ar[n>>2],(f-A|0)<2){A=1;break A}ar[n>>2]=A+1,tr[A>>0]=u>>>6|192,u=0|ar[n>>2],ar[n>>2]=u+1,tr[u>>0]=l;break}if(o=255&(u>>>12|224),a=255&(u>>>6&63|128),(65535&i)<55296){if(A=0|ar[n>>2],(f-A|0)<3){A=1;break A}ar[n>>2]=A+1,tr[A>>0]=o,u=0|ar[n>>2],ar[n>>2]=u+1,tr[u>>0]=a,u=0|ar[n>>2],ar[n>>2]=u+1,tr[u>>0]=l;break}if(56320<=(65535&i)){if((65535&i)<57344){A=2;break A}if(A=0|ar[n>>2],(f-A|0)<3){A=1;break A}ar[n>>2]=A+1,tr[A>>0]=o,u=0|ar[n>>2],ar[n>>2]=u+1,tr[u>>0]=a,u=0|ar[n>>2],ar[n>>2]=u+1,tr[u>>0]=l;break}if((b-A|0)<4){A=1;break A}if(56320!=(64512&(i=0|lr[(A=A+2|0)>>1])|0)){A=2;break A}if((f-(0|ar[n>>2])|0)<4){A=1;break A}if(t>>>0<(65536+((o=960&u)<<10)|c<<10|1023&i)>>>0){A=2;break A}ar[r>>2]=A,c=1+(o>>>6)|0,l=0|ar[n>>2],ar[n>>2]=l+1,tr[l>>0]=c>>>2|240,l=0|ar[n>>2],ar[n>>2]=l+1,tr[l>>0]=u>>>2&15|c<<4&48|128,l=0|ar[n>>2],ar[n>>2]=l+1,tr[l>>0]=u<<4&48|i>>>6&15|128,u=0|ar[n>>2],ar[n>>2]=u+1,tr[u>>0]=63&i|128}}while(0);A=2+(0|ar[r>>2])|0,ar[r>>2]=A}}while(0);return 0|A}(ar[(a=A+4|0)>>2]=r,i,a,ar[A>>2]=n,t,A,1114111,0),ar[f>>2]=ar[a>>2],ar[o>>2]=ar[A>>2],ur=e,0|t},function(A,e,r,i,f,n,t,o){var a;return A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,A=ur=(e=ur)+31&-32,ur=ur+16|0,t=0|function(A,e,r,i,f,n,t,o){A|=0,e|=0,i|=0,f|=0,n|=0,t|=0,o|=0;var a,c,l=0,u=0,b=0,s=0,d=0,k=0;ar[(r|=0)>>2]=A,ar[n>>2]=i,c=e,4&o|0&&(l=0|ar[r>>2],2<(c-l|0))&&-17==(0|tr[l>>0])&&-69==(0|tr[l+1>>0])&&-65==(0|tr[l+2>>0])&&(ar[r>>2]=l+3);a=f;A:for(;;){if(i=0|ar[r>>2],!(A=i>>>0<e>>>0)){k=40;break}if(d=0|ar[n>>2],f>>>0<=d>>>0){k=40;break}if(b=0|tr[i>>0],t>>>0<(s=255&b)>>>0){A=2;break}A=i+1|0;do{if(-1<b<<24>>24)or[d>>1]=255&b;else{if((255&b)<194){A=2;break A}if(l=c-i|0,o=i+2|0,(255&b)<224){if((0|l)<2){A=1;break A}if(128!=(192&(A=0|cr[A>>0])|0)){A=2;break A}if(t>>>0<(A=63&A|s<<6&1984)>>>0){A=2;break A}or[d>>1]=A,A=o;break}if(u=i+3|0,(255&b)<240){if((0|l)<3){A=1;break A}switch(i=0|tr[o>>0],l=0|cr[A>>0],A=224&l,b<<24>>24){case-32:if(160==(0|A))break;A=2;break A;case-19:if(128==(0|A))break;A=2;break A;default:if(128!=(192&l|0)){A=2;break A}}if(128!=(192&(A=255&i)|0)){A=2;break A}if(t>>>0<(65535&(A=l<<6&4032|s<<12|63&A))>>>0){A=2;break A}or[d>>1]=A,A=u;break}if(245<=(255&b)){A=2;break A}if((0|l)<4){A=1;break A}switch(l=0|tr[A>>0],A=0|tr[o>>0],i=0|tr[u>>0],u=255&l,b<<24>>24){case-16:if(48<=(l+112&255)){A=2;break A}break;case-12:if(128==(240&u|0))break;A=2;break A;default:if(128!=(192&u|0)){A=2;break A}}if(128!=(192&(o=255&A)|0)){A=2;break A}if(128!=(192&(A=255&i)|0)){A=2;break A}if((a-d|0)<4){A=1;break A}if(t>>>0<(u<<12&258048|(i=7&s)<<18|4032&(l=o<<6)|(A&=63))>>>0){A=2;break A}or[d>>1]=u<<2&60|o>>>4&3|16320+((u>>>4&3|i<<2)<<6)|55296,d=d+2|0,ar[n>>2]=d,or[d>>1]=A|960&l|56320,A=4+(0|ar[r>>2])|0}}while(0);ar[r>>2]=A,ar[n>>2]=2+(0|ar[n>>2])}40==(0|k)&&(A&=1);return 0|A}(ar[(a=A+4|0)>>2]=r,i,a,ar[A>>2]=n,t,A,1114111,0),ar[f>>2]=ar[a>>2],ar[o>>2]=ar[A>>2],ur=e,0|t},Rb,Rb,Rb,Rb,Rb],rs=[Nb,function(){!function(){var A=0;if(A=0|ar[14154],ar[14154]=A+1,1<(A+1|0))return A=0;if(Ya(),0|Ka())return A=0;ar[14154]=(0|ar[14154])-1,A=11}()},function(){!function(){var A=0;if(A=0|ar[14154],ar[14154]=A-1,(0|(A=A+-1|0))<0)return ar[14154]=1+(0|ar[14154]),A=12;if(0|A)return A=0;qa(),A=0}()},function(){W()},function(){var A,e,r,i=0,f=0,n=0,t=0,o=0;t=ur=ur+31&-32,ur=ur+48|0,r=t+32|0,A=t+24|0,o=t+16|0,t=(e=t)+36|0,0|(i=0|zu())&&0|(n=0|ar[i>>2])&&(1126902528==(-256&(f=0|ar[(i=n+48|0)>>2])|0)&1129074247==(0|(i=0|ar[i+4>>2]))||(ar[A>>2]=56019,ju(55969,A)),i=1126902529==(0|f)&1129074247==(0|i)?0|ar[n+44>>2]:n+80|0,ar[t>>2]=i,n=0|ar[n>>2],i=0|ar[n+4>>2],0|xb[63&ar[16+(0|ar[984])>>2]](3936,n,t)?(o=0|ar[t>>2],o=0|jb[127&ar[8+(0|ar[o>>2])>>2]](o),ar[e>>2]=56019,ar[e+4>>2]=i,ar[e+8>>2]=o,ju(55883,e)):(ar[o>>2]=56019,ar[o+4>>2]=i,ju(55928,o))),ju(56007,r)},function(){var A,e;e=ur=(A=ur)+31&-32,ur=ur+16|0,0|mA(61152,446)?ju(56207,e):ur=A},Nb,Nb],is=[_b,XA,function(A){var e;ar[(A|=0)>>2]=4232,(e=0|ar[A+24>>2])&&mu(e),vu(A)},function(A){var e;ar[(A|=0)>>2]=4264,(e=0|ar[A+24>>2])&&((0|ar[(A=A+28|0)>>2])!=(0|e)&&(ar[A>>2]=e),vu(e))},function(A){var e,r;ar[(A|=0)>>2]=4264,(e=0|ar[A+24>>2])&&((0|ar[(r=A+28|0)>>2])!=(0|e)&&(ar[r>>2]=e),vu(e)),vu(A)},function(A){var e,r,i;ar[(A|=0)>>2]=4304,ar[(e=A+56|0)>>2]=4324,ar[(r=A+4|0)>>2]=4340,(0|tr[11+(i=A+36|0)>>0])<0&&vu(0|ar[i>>2]),kf(r),Gf(),bf(e)},function(A){var e,r,i;ar[(A|=0)>>2]=4304,ar[(e=A+56|0)>>2]=4324,ar[(r=A+4|0)>>2]=4340,(0|tr[11+(i=A+36|0)>>0])<0&&vu(0|ar[i>>2]),kf(r),Gf(),bf(e),vu(A)},function(A){var e,r,i;A=(A|=0)+(0|ar[(0|ar[A>>2])-12>>2])|0,ar[A>>2]=4304,ar[(e=A+56|0)>>2]=4324,ar[(r=A+4|0)>>2]=4340,(0|tr[11+(i=A+36|0)>>0])<0&&vu(0|ar[i>>2]),kf(r),Gf(),bf(e)},function(A){var e,r,i;A=(A|=0)+(0|ar[(0|ar[A>>2])-12>>2])|0,ar[A>>2]=4304,ar[(e=A+56|0)>>2]=4324,ar[(r=A+4|0)>>2]=4340,(0|tr[11+(i=A+36|0)>>0])<0&&vu(0|ar[i>>2]),kf(r),Gf(),bf(e),vu(A)},function(A){var e;ar[(A|=0)>>2]=4340,(0|tr[11+(e=A+32|0)>>0])<0&&vu(0|ar[e>>2]),kf(A)},function(A){var e;ar[(A|=0)>>2]=4340,(0|tr[11+(e=A+32|0)>>0])<0&&vu(0|ar[e>>2]),kf(A),vu(A)},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(f=i;i=f+-8|0,ar[n>>2]=i,(f=0|ar[f+-4>>2])&&(du(f),i=0|ar[n>>2]),(0|i)!=(0|r);)f=i;r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(i=0|ar[A+24>>2])&&((0|ar[(r=A+28|0)>>2])!=(0|i)&&(ar[r>>2]=i),vu(i))},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(f=i;i=f+-8|0,ar[n>>2]=i,(f=0|ar[f+-4>>2])&&(du(f),i=0|ar[n>>2]),(0|i)!=(0|r);)f=i;r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(r=0|ar[A+24>>2])&&((0|ar[(i=A+28|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),vu(A)},function(A){tr[(A|=0)+37>>0]=0},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=4436,0|(r=0|ar[A+64>>2])&&((0|(f=0|ar[(i=A+68|0)>>2]))!=(0|r)&&(ar[i>>2]=f+(~((f+-4-r|0)>>>2)<<2)),vu(r)),ar[A>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(;f=i+-8|0,ar[n>>2]=f,(0|(i=(i=0|ar[i+-4>>2])?(du(i),0|ar[n>>2]):f))!=(0|r););r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(i=0|ar[A+24>>2])&&((0|ar[(r=A+28|0)>>2])!=(0|i)&&(ar[r>>2]=i),vu(i))},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=4436,0|(r=0|ar[A+64>>2])&&((0|(f=0|ar[(i=A+68|0)>>2]))!=(0|r)&&(ar[i>>2]=f+(~((f+-4-r|0)>>>2)<<2)),vu(r)),ar[A>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(;f=i+-8|0,ar[n>>2]=f,(0|(i=(i=0|ar[i+-4>>2])?(du(i),0|ar[n>>2]):f))!=(0|r););r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(r=0|ar[A+24>>2])&&((0|ar[(i=A+28|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),vu(A)},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(f=i;i=f+-8|0,ar[n>>2]=i,(f=0|ar[f+-4>>2])&&(du(f),i=0|ar[n>>2]),(0|i)!=(0|r);)f=i;r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(r=0|ar[A+24>>2])&&((0|ar[(i=A+28|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),vu(A)},function(A){var e,r,i;ar[(A|=0)>>2]=4504,ar[(e=A+64|0)>>2]=4544,ar[A+8>>2]=4524,ar[(r=A+12|0)>>2]=4340,(0|tr[11+(i=A+44|0)>>0])<0&&vu(0|ar[i>>2]),kf(r),_f(),bf(e)},function(A){var e,r,i;ar[(A|=0)>>2]=4504,ar[(e=A+64|0)>>2]=4544,ar[A+8>>2]=4524,ar[(r=A+12|0)>>2]=4340,(0|tr[11+(i=A+44|0)>>0])<0&&vu(0|ar[i>>2]),kf(r),_f(),bf(e),vu(A)},function(A){var e,r,i;ar[(A=(A|=0)+-8|0)>>2]=4504,ar[(e=A+64|0)>>2]=4544,ar[A+8>>2]=4524,ar[(r=A+12|0)>>2]=4340,(0|tr[11+(i=A+44|0)>>0])<0&&vu(0|ar[i>>2]),kf(r),_f(),bf(e)},function(A){var e,r,i;ar[(A=(A|=0)+-8|0)>>2]=4504,ar[(e=A+64|0)>>2]=4544,ar[A+8>>2]=4524,ar[(r=A+12|0)>>2]=4340,(0|tr[11+(i=A+44|0)>>0])<0&&vu(0|ar[i>>2]),kf(r),_f(),bf(e),vu(A)},function(A){var e,r,i;A=(A|=0)+(0|ar[(0|ar[A>>2])-12>>2])|0,ar[A>>2]=4504,ar[(e=A+64|0)>>2]=4544,ar[A+8>>2]=4524,ar[(r=A+12|0)>>2]=4340,(0|tr[11+(i=A+44|0)>>0])<0&&vu(0|ar[i>>2]),kf(r),_f(),bf(e)},function(A){var e,r,i;A=(A|=0)+(0|ar[(0|ar[A>>2])-12>>2])|0,ar[A>>2]=4504,ar[(e=A+64|0)>>2]=4544,ar[A+8>>2]=4524,ar[(r=A+12|0)>>2]=4340,(0|tr[11+(i=A+44|0)>>0])<0&&vu(0|ar[i>>2]),kf(r),_f(),bf(e),vu(A)},yf,Bf,function(A){yf((A|=0)+(0|ar[(0|ar[A>>2])-12>>2])|0)},function(A){Bf((A|=0)+(0|ar[(0|ar[A>>2])-12>>2])|0)},Rf,Nf,function(A){Rf((A|=0)+-8|0)},function(A){Nf((A|=0)+-8|0)},function(A){Rf((A|=0)+(0|ar[(0|ar[A>>2])-12>>2])|0)},function(A){Nf((A|=0)+(0|ar[(0|ar[A>>2])-12>>2])|0)},If,Cf,function(A){If((A|=0)+(0|ar[(0|ar[A>>2])-12>>2])|0)},function(A){Cf((A|=0)+(0|ar[(0|ar[A>>2])-12>>2])|0)},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=4600,ar[(r=A+16|0)>>2]=4436,0|(i=0|ar[A+80>>2])&&((0|(n=0|ar[(f=A+84|0)>>2]))!=(0|i)&&(ar[f>>2]=n+(~((n+-4-i|0)>>>2)<<2)),vu(i)),ar[r>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(;n=f+-8|0,ar[t>>2]=n,(0|(f=(f=0|ar[f+-4>>2])?(du(f),0|ar[t>>2]):n))!=(0|i););i=0|ar[e>>2]}vu(i)}ar[r>>2]=4264,(i=0|ar[A+40>>2])&&((0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),tu()},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=4600,ar[(r=A+16|0)>>2]=4436,0|(i=0|ar[A+80>>2])&&((0|(n=0|ar[(f=A+84|0)>>2]))!=(0|i)&&(ar[f>>2]=n+(~((n+-4-i|0)>>>2)<<2)),vu(i)),ar[r>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(;n=f+-8|0,ar[t>>2]=n,(0|(f=(f=0|ar[f+-4>>2])?(du(f),0|ar[t>>2]):n))!=(0|i););i=0|ar[e>>2]}vu(i)}if(ar[r>>2]=4264,!(i=0|ar[A+40>>2]))return tu(),void vu(A);(0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=4628,ar[(r=A+16|0)>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}ar[r>>2]=4264,(i=0|ar[A+40>>2])&&((0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),tu()},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=4628,ar[(r=A+16|0)>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}if(ar[r>>2]=4264,!(i=0|ar[A+40>>2]))return tu(),void vu(A);(0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=4656,ar[(r=A+16|0)>>2]=4684,(0|tr[(i=A+92|0)+11>>0])<0&&vu(0|ar[i>>2]),ar[r>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(;n=f+-8|0,ar[t>>2]=n,(0|(f=(f=0|ar[f+-4>>2])?(du(f),0|ar[t>>2]):n))!=(0|i););i=0|ar[e>>2]}vu(i)}ar[r>>2]=4264,(i=0|ar[A+40>>2])&&((0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),tu()},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=4656,ar[(r=A+16|0)>>2]=4684,(0|tr[(i=A+92|0)+11>>0])<0&&vu(0|ar[i>>2]),ar[r>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(;n=f+-8|0,ar[t>>2]=n,(0|(f=(f=0|ar[f+-4>>2])?(du(f),0|ar[t>>2]):n))!=(0|i););i=0|ar[e>>2]}vu(i)}if(ar[r>>2]=4264,!(i=0|ar[A+40>>2]))return tu(),void vu(A);(0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=4684,(0|tr[(r=A+76|0)+11>>0])<0&&vu(0|ar[r>>2]),ar[A>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(;f=i+-8|0,ar[n>>2]=f,(0|(i=(i=0|ar[i+-4>>2])?(du(i),0|ar[n>>2]):f))!=(0|r););r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(i=0|ar[A+24>>2])&&((0|ar[(r=A+28|0)>>2])!=(0|i)&&(ar[r>>2]=i),vu(i))},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=4684,(0|tr[(r=A+76|0)+11>>0])<0&&vu(0|ar[r>>2]),ar[A>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(;f=i+-8|0,ar[n>>2]=f,(0|(i=(i=0|ar[i+-4>>2])?(du(i),0|ar[n>>2]):f))!=(0|r););r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(r=0|ar[A+24>>2])&&((0|ar[(i=A+28|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),vu(A)},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=4716,ar[(r=A+16|0)>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}ar[r>>2]=4264,(i=0|ar[A+40>>2])&&((0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),tu()},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=4716,ar[(r=A+16|0)>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}if(ar[r>>2]=4264,!(i=0|ar[A+40>>2]))return tu(),void vu(A);(0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(f=i;i=f+-8|0,ar[n>>2]=i,(f=0|ar[f+-4>>2])&&(du(f),i=0|ar[n>>2]),(0|i)!=(0|r);)f=i;r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(r=0|ar[A+24>>2])&&((0|ar[(i=A+28|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),vu(A)},function(A){tr[(A|=0)+37>>0]=65535<(0|ar[A+56>>2])>>>0&1},function(A){ar[(A|=0)>>2]=4776,Yt(A+16|0),tu()},function(A){ar[(A|=0)>>2]=4776,Yt(A+16|0),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},Yt,function(A){Yt(A|=0),vu(A)},function(A){var e,r,i=0,f=0,n=0,t=0,o=0;if(i=0|cr[(A|=0)+72>>0],i=!(65535<(n=0|ar[A+60>>2])-(f=0|ar[A+56>>2])>>5>>>0)||2<i>>>0?i:2,r=A+74|0,t=A+75|0,o=A+76|0,tr[(e=A+73|0)>>0]=0,tr[1+e>>0]=0,tr[2+e>>0]=0,((tr[3+e>>0]=0)|f)==(0|n))return n=i,tr[e>>0]=4,tr[r>>0]=4,tr[t>>0]=4,tr[o>>0]=0,t=255&n,void(tr[(o=A+37|0)>>0]=t);for(;i=!(65535<(0|ar[f>>2])>>>0)||2<(0|i)?i:2,i=0==(0|tr[f+4>>0])|1<(0|i)?i:1,(0|(f=f+32|0))!=(0|n););tr[e>>0]=4,tr[r>>0]=4,tr[t>>0]=4,tr[o>>0]=0,t=255&i,tr[(o=A+37|0)>>0]=t},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=4836,ar[(r=A+16|0)>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}ar[r>>2]=4264,(i=0|ar[A+40>>2])&&((0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),tu()},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=4836,ar[(r=A+16|0)>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}if(ar[r>>2]=4264,!(i=0|ar[A+40>>2]))return tu(),void vu(A);(0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(f=i;i=f+-8|0,ar[n>>2]=i,(f=0|ar[f+-4>>2])&&(du(f),i=0|ar[n>>2]),(0|i)!=(0|r);)f=i;r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(r=0|ar[A+24>>2])&&((0|ar[(i=A+28|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),vu(A)},function(A){tr[(A|=0)+37>>0]=65535<(0|ar[A+48>>2])-(0|ar[A+44>>2])>>3>>>0&1},function(A){ar[(A|=0)>>2]=4896,_t(A+16|0),tu()},function(A){ar[(A|=0)>>2]=4896,_t(A+16|0),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},_t,function(A){_t(A|=0),vu(A)},function(A){var e,r=0,i=0,f=0;if(r=(e=65535<(0|ar[(A|=0)+56>>2])>>>0)?3:0==(0|tr[A+124>>0])?0:2,0==(0|((f=0|tr[(i=A+64|0)+11>>0])<<24>>24<0?0|ar[A+68>>2]:255&f))&&(f=0==(0|Yu(i,0,-1,79659,0))))return i=r,i&=255,void(tr[(f=A+37|0)>>0]=i);i=r=e?3:2,i&=255,tr[(f=A+37|0)>>0]=i},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=4956,ar[(r=A+16|0)>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}ar[r>>2]=4264,(i=0|ar[A+40>>2])&&((0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),tu()},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=4956,ar[(r=A+16|0)>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}if(ar[r>>2]=4264,!(i=0|ar[A+40>>2]))return tu(),void vu(A);(0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(f=i;i=f+-8|0,ar[n>>2]=i,(f=0|ar[f+-4>>2])&&(du(f),i=0|ar[n>>2]),(0|i)!=(0|r);)f=i;r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(r=0|ar[A+24>>2])&&((0|ar[(i=A+28|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),vu(A)},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5016,ar[(r=A+16|0)>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}ar[r>>2]=4264,(i=0|ar[A+40>>2])&&((0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),tu()},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5016,ar[(r=A+16|0)>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}if(ar[r>>2]=4264,!(i=0|ar[A+40>>2]))return tu(),void vu(A);(0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(f=i;i=f+-8|0,ar[n>>2]=i,(f=0|ar[f+-4>>2])&&(du(f),i=0|ar[n>>2]),(0|i)!=(0|r);)f=i;r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(r=0|ar[A+24>>2])&&((0|ar[(i=A+28|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),vu(A)},function(A){ar[(A|=0)>>2]=5076,Ft(A+16|0),tu()},function(A){ar[(A|=0)>>2]=5076,Ft(A+16|0),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},Ft,function(A){Ft(A|=0),vu(A)},function(A){var e=0,r=0,i=0,f=0,n=0,t=0;if((0|(r=0|ar[(A|=0)+56>>2]))==(0|(t=0|ar[A+60>>2])))return tr[(t=A+37|(n=f=0))>>0]=f,n&=1,void(ar[(t=A+40|0)>>2]=n);n=e=0;do{if(n=65535<(0|ar[r>>2])>>>0?1:n,(0|(i=0|ar[r+4>>2]))!=(0|(f=0|ar[r+8>>2])))for(;e|=127<(0|lr[i+2>>1]),(0|(i=i+4|0))!=(0|f););r=r+16|0}while((0|r)!=(0|t));f=255&n,n=e,tr[(t=A+37|0)>>0]=f,n&=1,ar[(t=A+40|0)>>2]=n},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5136,ar[(r=A+16|0)>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}ar[r>>2]=4264,(i=0|ar[A+40>>2])&&((0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),tu()},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5136,ar[(r=A+16|0)>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}if(ar[r>>2]=4264,!(i=0|ar[A+40>>2]))return tu(),void vu(A);(0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(f=i;i=f+-8|0,ar[n>>2]=i,(f=0|ar[f+-4>>2])&&(du(f),i=0|ar[n>>2]),(0|i)!=(0|r);)f=i;r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(r=0|ar[A+24>>2])&&((0|ar[(i=A+28|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),vu(A)},Vt,function(A){Vt(A|=0),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=5224,0|(r=0|ar[A+68>>2])&&((0|ar[(i=A+72|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),(0|tr[(r=A+56|0)+11>>0])<0&&vu(0|ar[r>>2]),ar[A>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(;f=i+-8|0,ar[n>>2]=f,(0|(i=(i=0|ar[i+-4>>2])?(du(i),0|ar[n>>2]):f))!=(0|r););r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(i=0|ar[A+24>>2])&&((0|ar[(r=A+28|0)>>2])!=(0|i)&&(ar[r>>2]=i),vu(i))},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=5224,0|(r=0|ar[A+68>>2])&&((0|ar[(i=A+72|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),(0|tr[(r=A+56|0)+11>>0])<0&&vu(0|ar[r>>2]),ar[A>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(;f=i+-8|0,ar[n>>2]=f,(0|(i=(i=0|ar[i+-4>>2])?(du(i),0|ar[n>>2]):f))!=(0|r););r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(r=0|ar[A+24>>2])&&((0|ar[(i=A+28|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),vu(A)},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5256,ar[(r=A+16|0)>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}ar[r>>2]=4264,(i=0|ar[A+40>>2])&&((0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),tu()},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5256,ar[(r=A+16|0)>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}if(ar[r>>2]=4264,!(i=0|ar[A+40>>2]))return tu(),void vu(A);(0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(f=i;i=f+-8|0,ar[n>>2]=i,(f=0|ar[f+-4>>2])&&(du(f),i=0|ar[n>>2]),(0|i)!=(0|r);)f=i;r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(r=0|ar[A+24>>2])&&((0|ar[(i=A+28|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),vu(A)},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5316,ar[(r=A+16|0)>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}ar[r>>2]=4264,(i=0|ar[A+40>>2])&&((0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),tu()},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5316,ar[(r=A+16|0)>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}if(ar[r>>2]=4264,!(i=0|ar[A+40>>2]))return tu(),void vu(A);(0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(f=i;i=f+-8|0,ar[n>>2]=i,(f=0|ar[f+-4>>2])&&(du(f),i=0|ar[n>>2]),(0|i)!=(0|r);)f=i;r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(r=0|ar[A+24>>2])&&((0|ar[(i=A+28|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),vu(A)},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5376,ar[(r=A+16|0)>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}ar[r>>2]=4264,(i=0|ar[A+40>>2])&&((0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),tu()},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5376,ar[(r=A+16|0)>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}if(ar[r>>2]=4264,!(i=0|ar[A+40>>2]))return tu(),void vu(A);(0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(f=i;i=f+-8|0,ar[n>>2]=i,(f=0|ar[f+-4>>2])&&(du(f),i=0|ar[n>>2]),(0|i)!=(0|r);)f=i;r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(r=0|ar[A+24>>2])&&((0|ar[(i=A+28|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),vu(A)},function(A){ar[(A|=0)>>2]=5436,be(A+16|0),tu()},function(A){ar[(A|=0)>>2]=5436,be(A+16|0),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},be,function(A){be(A|=0),vu(A)},function(A){var e=0,r=0,i=0,f=0,n=0,t=0;if((0|(r=0|ar[(A|=0)+56>>2]))!=(0|(n=0|ar[A+60>>2]))){for(e=0;;){if(65535<(0|ar[r+48>>2])>>>0){e=1,r=6;break}if((0|(i=0|ar[r+52>>2]))!=(0|(f=0|ar[r+56>>2])))for(;e=(t=65535<(0|ar[i>>2])>>>0)?1:e,!(t|(0|(i=i+4|0))==(0|f)););if((0|(r=r+64|0))==(0|n)){r=6;break}}6!=(0|r)||(tr[(t=A+37|0)>>0]=e)}else tr[(A=A+37|(n=0))>>0]=n},function(A){ar[(A|=0)>>2]=5496,ce(A+16|0),tu()},function(A){ar[(A|=0)>>2]=5496,ce(A+16|0),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},ce,function(A){ce(A|=0),vu(A)},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5556,ar[(r=A+16|0)>>2]=5584,0|(i=0|ar[A+84>>2])&&((0|ar[(f=A+88|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),ar[r>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(;n=f+-8|0,ar[t>>2]=n,(0|(f=(f=0|ar[f+-4>>2])?(du(f),0|ar[t>>2]):n))!=(0|i););i=0|ar[e>>2]}vu(i)}ar[r>>2]=4264,(i=0|ar[A+40>>2])&&((0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),tu()},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5556,ar[(r=A+16|0)>>2]=5584,0|(i=0|ar[A+84>>2])&&((0|ar[(f=A+88|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),ar[r>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(;n=f+-8|0,ar[t>>2]=n,(0|(f=(f=0|ar[f+-4>>2])?(du(f),0|ar[t>>2]):n))!=(0|i););i=0|ar[e>>2]}vu(i)}if(ar[r>>2]=4264,!(i=0|ar[A+40>>2]))return tu(),void vu(A);(0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=5584,0|(r=0|ar[A+68>>2])&&((0|ar[(i=A+72|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),ar[A>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(;f=i+-8|0,ar[n>>2]=f,(0|(i=(i=0|ar[i+-4>>2])?(du(i),0|ar[n>>2]):f))!=(0|r););r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(i=0|ar[A+24>>2])&&((0|ar[(r=A+28|0)>>2])!=(0|i)&&(ar[r>>2]=i),vu(i))},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=5584,0|(r=0|ar[A+68>>2])&&((0|ar[(i=A+72|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),ar[A>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(;f=i+-8|0,ar[n>>2]=f,(0|(i=(i=0|ar[i+-4>>2])?(du(i),0|ar[n>>2]):f))!=(0|r););r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(r=0|ar[A+24>>2])&&((0|ar[(i=A+28|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),vu(A)},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5616,ar[(r=A+16|0)>>2]=5644,0|(i=0|ar[A+88>>2])&&((0|ar[(f=A+92|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),ar[r>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(;n=f+-8|0,ar[t>>2]=n,(0|(f=(f=0|ar[f+-4>>2])?(du(f),0|ar[t>>2]):n))!=(0|i););i=0|ar[e>>2]}vu(i)}ar[r>>2]=4264,(i=0|ar[A+40>>2])&&((0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),tu()},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5616,ar[(r=A+16|0)>>2]=5644,0|(i=0|ar[A+88>>2])&&((0|ar[(f=A+92|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),ar[r>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(;n=f+-8|0,ar[t>>2]=n,(0|(f=(f=0|ar[f+-4>>2])?(du(f),0|ar[t>>2]):n))!=(0|i););i=0|ar[e>>2]}vu(i)}if(ar[r>>2]=4264,!(i=0|ar[A+40>>2]))return tu(),void vu(A);(0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=5644,0|(r=0|ar[A+72>>2])&&((0|ar[(i=A+76|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),ar[A>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(;f=i+-8|0,ar[n>>2]=f,(0|(i=(i=0|ar[i+-4>>2])?(du(i),0|ar[n>>2]):f))!=(0|r););r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(i=0|ar[A+24>>2])&&((0|ar[(r=A+28|0)>>2])!=(0|i)&&(ar[r>>2]=i),vu(i))},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=5644,0|(r=0|ar[A+72>>2])&&((0|ar[(i=A+76|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),ar[A>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(;f=i+-8|0,ar[n>>2]=f,(0|(i=(i=0|ar[i+-4>>2])?(du(i),0|ar[n>>2]):f))!=(0|r););r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(r=0|ar[A+24>>2])&&((0|ar[(i=A+28|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),vu(A)},function(A){ar[(A|=0)>>2]=5676,te(A+16|0),tu()},function(A){ar[(A|=0)>>2]=5676,te(A+16|0),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},te,function(A){te(A|=0),vu(A)},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5736,ar[(r=A+16|0)>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}ar[r>>2]=4264,(i=0|ar[A+40>>2])&&((0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),tu()},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5736,ar[(r=A+16|0)>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}if(ar[r>>2]=4264,!(i=0|ar[A+40>>2]))return tu(),void vu(A);(0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(f=i;i=f+-8|0,ar[n>>2]=i,(f=0|ar[f+-4>>2])&&(du(f),i=0|ar[n>>2]),(0|i)!=(0|r);)f=i;r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(r=0|ar[A+24>>2])&&((0|ar[(i=A+28|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),vu(A)},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5796,ar[(r=A+16|0)>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}ar[r>>2]=4264,(i=0|ar[A+40>>2])&&((0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),tu()},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5796,ar[(r=A+16|0)>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}if(ar[r>>2]=4264,!(i=0|ar[A+40>>2]))return tu(),void vu(A);(0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(f=i;i=f+-8|0,ar[n>>2]=i,(f=0|ar[f+-4>>2])&&(du(f),i=0|ar[n>>2]),(0|i)!=(0|r);)f=i;r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(r=0|ar[A+24>>2])&&((0|ar[(i=A+28|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),vu(A)},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5856,ar[(r=A+16|0)>>2]=5884,(0|tr[(i=A+72|0)+11>>0])<0&&vu(0|ar[i>>2]),ar[r>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(;n=f+-8|0,ar[t>>2]=n,(0|(f=(f=0|ar[f+-4>>2])?(du(f),0|ar[t>>2]):n))!=(0|i););i=0|ar[e>>2]}vu(i)}ar[r>>2]=4264,(i=0|ar[A+40>>2])&&((0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),tu()},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5856,ar[(r=A+16|0)>>2]=5884,(0|tr[(i=A+72|0)+11>>0])<0&&vu(0|ar[i>>2]),ar[r>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(;n=f+-8|0,ar[t>>2]=n,(0|(f=(f=0|ar[f+-4>>2])?(du(f),0|ar[t>>2]):n))!=(0|i););i=0|ar[e>>2]}vu(i)}if(ar[r>>2]=4264,!(i=0|ar[A+40>>2]))return tu(),void vu(A);(0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=5884,(0|tr[(r=A+56|0)+11>>0])<0&&vu(0|ar[r>>2]),ar[A>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(;f=i+-8|0,ar[n>>2]=f,(0|(i=(i=0|ar[i+-4>>2])?(du(i),0|ar[n>>2]):f))!=(0|r););r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(i=0|ar[A+24>>2])&&((0|ar[(r=A+28|0)>>2])!=(0|i)&&(ar[r>>2]=i),vu(i))},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=5884,(0|tr[(r=A+56|0)+11>>0])<0&&vu(0|ar[r>>2]),ar[A>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(;f=i+-8|0,ar[n>>2]=f,(0|(i=(i=0|ar[i+-4>>2])?(du(i),0|ar[n>>2]):f))!=(0|r););r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(r=0|ar[A+24>>2])&&((0|ar[(i=A+28|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),vu(A)},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5916,ar[(r=A+16|0)>>2]=5944,0|(i=0|ar[A+76>>2])&&du(i),ar[r>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}ar[r>>2]=4264,(i=0|ar[A+40>>2])&&((0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),tu()},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5916,ar[(r=A+16|0)>>2]=5944,0|(i=0|ar[A+76>>2])&&du(i),ar[r>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}if(ar[r>>2]=4264,!(i=0|ar[A+40>>2]))return tu(),void vu(A);(0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=5944,0|(r=0|ar[A+60>>2])&&du(r),ar[A>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(f=i;i=f+-8|0,ar[n>>2]=i,(f=0|ar[f+-4>>2])&&(du(f),i=0|ar[n>>2]),(0|i)!=(0|r);)f=i;r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(i=0|ar[A+24>>2])&&((0|ar[(r=A+28|0)>>2])!=(0|i)&&(ar[r>>2]=i),vu(i))},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=5944,0|(r=0|ar[A+60>>2])&&du(r),ar[A>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(f=i;i=f+-8|0,ar[n>>2]=i,(f=0|ar[f+-4>>2])&&(du(f),i=0|ar[n>>2]),(0|i)!=(0|r);)f=i;r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(r=0|ar[A+24>>2])&&((0|ar[(i=A+28|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),vu(A)},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5976,ar[(r=A+16|0)>>2]=6004,0|(i=0|ar[A+72>>2])&&((0|ar[(f=A+76|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),ar[r>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(;n=f+-8|0,ar[t>>2]=n,(0|(f=(f=0|ar[f+-4>>2])?(du(f),0|ar[t>>2]):n))!=(0|i););i=0|ar[e>>2]}vu(i)}ar[r>>2]=4264,(i=0|ar[A+40>>2])&&((0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),tu()},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=5976,ar[(r=A+16|0)>>2]=6004,0|(i=0|ar[A+72>>2])&&((0|ar[(f=A+76|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),ar[r>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(;n=f+-8|0,ar[t>>2]=n,(0|(f=(f=0|ar[f+-4>>2])?(du(f),0|ar[t>>2]):n))!=(0|i););i=0|ar[e>>2]}vu(i)}if(ar[r>>2]=4264,!(i=0|ar[A+40>>2]))return tu(),void vu(A);(0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=6004,0|(r=0|ar[A+56>>2])&&((0|ar[(i=A+60|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),ar[A>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(;f=i+-8|0,ar[n>>2]=f,(0|(i=(i=0|ar[i+-4>>2])?(du(i),0|ar[n>>2]):f))!=(0|r););r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(i=0|ar[A+24>>2])&&((0|ar[(r=A+28|0)>>2])!=(0|i)&&(ar[r>>2]=i),vu(i))},function(A){var e,r=0,i=0,f=0,n=0;if(ar[(A|=0)>>2]=6004,0|(r=0|ar[A+56>>2])&&((0|ar[(i=A+60|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),ar[A>>2]=4404,0|(r=0|ar[(e=A+44|0)>>2])){if((0|(i=0|ar[(n=A+48|0)>>2]))!=(0|r)){for(;f=i+-8|0,ar[n>>2]=f,(0|(i=(i=0|ar[i+-4>>2])?(du(i),0|ar[n>>2]):f))!=(0|r););r=0|ar[e>>2]}vu(r)}ar[A>>2]=4264,(r=0|ar[A+24>>2])&&((0|ar[(i=A+28|0)>>2])!=(0|r)&&(ar[i>>2]=r),vu(r)),vu(A)},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=6036,ar[(r=A+16|0)>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}ar[r>>2]=4264,(i=0|ar[A+40>>2])&&((0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i)),tu()},function(A){var e,r,i=0,f=0,n=0,t=0;if(ar[(A|=0)>>2]=6036,ar[(r=A+16|0)>>2]=4404,0|(i=0|ar[(e=A+60|0)>>2])){if((0|(f=0|ar[(t=A+64|0)>>2]))!=(0|i)){for(n=f;f=n+-8|0,ar[t>>2]=f,(n=0|ar[n+-4>>2])&&(du(n),f=0|ar[t>>2]),(0|f)!=(0|i);)n=f;i=0|ar[e>>2]}vu(i)}if(ar[r>>2]=4264,!(i=0|ar[A+40>>2]))return tu(),void vu(A);(0|ar[(f=A+44|0)>>2])!=(0|i)&&(ar[f>>2]=i),vu(i),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){tu(A|=0)},function(A){tu(A|=0),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+12|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){0},function(A){vu(A|=0)},function(A){var e,r;ar[(A|=0)>>2]=6120,ar[A+12>>2]=6148,(e=0|ar[A+20>>2])&&((0|ar[(r=A+24|0)>>2])!=(0|e)&&(ar[r>>2]=e),vu(e)),tu()},function(A){var e,r;if(ar[(A|=0)>>2]=6120,ar[A+12>>2]=6148,!(e=0|ar[A+20>>2]))return tu(),void vu(A);(0|ar[(r=A+24|0)>>2])!=(0|e)&&(ar[r>>2]=e),vu(e),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+12|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){var e;ar[(A|=0)>>2]=6148,(e=0|ar[A+8>>2])&&((0|ar[(A=A+12|0)>>2])!=(0|e)&&(ar[A>>2]=e),vu(e))},function(A){var e,r;ar[(A|=0)>>2]=6148,(e=0|ar[A+8>>2])&&((0|ar[(r=A+12|0)>>2])!=(0|e)&&(ar[r>>2]=e),vu(e)),vu(A)},function(A){ar[(A|=0)>>2]=6180,XA(A+16|0),tu()},function(A){ar[(A|=0)>>2]=6180,XA(A+16|0),tu(),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){ar[(A|=0)>>2]=6208,po(A+12|0),tu()},function(A){ar[(A|=0)>>2]=6208,po(A+12|0),tu(),vu(A)},function(A){po((A|=0)+12|0)},function(A){vu(A|=0)},function(A){ar[(A|=0)>>2]=6336,gl(A+12|0),tu()},function(A){ar[(A|=0)>>2]=6336,gl(A+12|0),tu(),vu(A)},function(A){gl((A|=0)+12|0)},function(A){vu(A|=0)},function(A){ar[(A|=0)>>2]=6364,lo(A+12|0),tu()},function(A){ar[(A|=0)>>2]=6364,lo(A+12|0),tu(),vu(A)},function(A){lo((A|=0)+12|0)},function(A){vu(A|=0)},function(A){ar[(A|=0)>>2]=6392,El(A+16|0),tu()},function(A){ar[(A|=0)>>2]=6392,El(A+16|0),tu(),vu(A)},function(A){El((A|=0)+16|0)},function(A){vu(A|=0)},function(A){var e=0,r=0;ar[(A|=0)>>2]=6420,0|(e=0|ar[A+40>>2])&&((0|ar[(r=A+44|0)>>2])!=(0|e)&&(ar[r>>2]=e),vu(e)),(0|tr[(e=A+28|0)+11>>0])<0&&vu(0|ar[e>>2]),0<=(0|tr[(e=A+16|0)+11>>0])||vu(0|ar[e>>2]),tu()},function(A){var e=0,r=0;if(ar[(A|=0)>>2]=6420,0|(e=0|ar[A+40>>2])&&((0|ar[(r=A+44|0)>>2])!=(0|e)&&(ar[r>>2]=e),vu(e)),(0|tr[(e=A+28|0)+11>>0])<0&&vu(0|ar[e>>2]),0<=(0|tr[(e=A+16|0)+11>>0]))return tu(),void vu(A);vu(0|ar[e>>2]),tu(),vu(A)},function(A){var e=0,r=0;0|(e=0|ar[(A|=0)+40>>2])&&((0|ar[(r=A+44|0)>>2])!=(0|e)&&(ar[r>>2]=e),vu(e)),(0|tr[(e=A+28|0)+11>>0])<0&&vu(0|ar[e>>2]),0<=(0|tr[(e=A+16|0)+11>>0])||vu(0|ar[e>>2])},function(A){vu(A|=0)},function(A){tu(A|=0)},function(A){tu(A|=0),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+16|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){0},function(A){vu(A|=0)},function(A){0},function(A){vu(A|=0)},function(A){vu(A|=0)},function(A){vu(A|=0)},function(A){vu(A|=0)},function(A){vu(A|=0)},function(A){vu(A|=0)},function(A){vu(A|=0)},function(A){vu(A|=0)},function(A){vu(A|=0)},function(A){vu(A|=0)},function(A){vu(A|=0)},function(A){vu(A|=0)},function(A){vu(A|=0)},function(A){vu(A|=0)},function(A){vu(A|=0)},function(A){vu(A|=0)},function(A){tu(A|=0)},function(A){tu(A|=0),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+12|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){tu(A|=0)},function(A){tu(A|=0),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+12|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){vu(A|=0)},function(A){tu(A|=0)},function(A){tu(A|=0),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+12|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){vu(A|=0)},function(A){tu(A|=0)},function(A){tu(A|=0),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+12|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){tu(A|=0)},function(A){tu(A|=0),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+12|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){tu(A|=0)},function(A){tu(A|=0),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+12|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){tu(A|=0)},function(A){tu(A|=0),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+12|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){tu(A|=0)},function(A){tu(A|=0),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+12|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){tu(A|=0)},function(A){tu(A|=0),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+12|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){tu(A|=0)},function(A){tu(A|=0),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+12|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){tu(A|=0)},function(A){tu(A|=0),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+12|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){tu(A|=0)},function(A){tu(A|=0),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+12|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){tu(A|=0)},function(A){tu(A|=0),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+12|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){tu(A|=0)},function(A){tu(A|=0),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+12|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){tu(A|=0)},function(A){tu(A|=0),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+12|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){vu(A|=0)},function(A){tu(A|=0)},function(A){tu(A|=0),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+12|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){vu(A|=0)},function(A){tu(A|=0)},function(A){tu(A|=0),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+12|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){tu(A|=0)},function(A){tu(A|=0),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+12|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){tu(A|=0)},function(A){tu(A|=0),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+12|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){tu(A|=0)},function(A){tu(A|=0),vu(A)},function(A){is[511&ar[ar[(A=(A|=0)+12|0)>>2]>>2]](A)},function(A){vu(A|=0)},function(A){(function(A){(function(A){if((0|ar[375892+(A|=0)>>2])<=0)return;!function(A){var e,r,i,f=0;{if(gb(e=420+(A|=0)|0),tr[A>>0]=1,Zb(),mb(r=A+448|0),!(0<(0|ar[(i=A+156|0)>>2])))return ZA(0|e),sA(0|r);f=0}for(;vA(0|ar[A+28+(f<<2)>>2],0),f=f+1|0,(0|f)<(0|ar[i>>2]););ZA(0|e),sA(0|r)}(A+375396|0)})(A|=0),0|A&&is[511&ar[4+(0|ar[A>>2])>>2]](A);if(A=0|ar[14154],ar[14154]=A-1,(0|(A=A+-1|0))<0)return ar[14154]=1+(0|ar[14154]),A=12;if(0|A)return A=0;qa(),A=0})(0|ar[(A|=0)>>2]),A&&vu(A)},Me,function(A){Me(A|=0),vu(A)},function(A){0},function(A){vu(A|=0)},function(A){0},function(A){vu(A|=0)},function(A){var e,r,i,f,n,t,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0;ar[(t=(A|=0)+4|0)>>2]=1,la(0|ar[(n=A+12|0)>>2],A),o=0|ar[n>>2],u=(w=0|ar[o+5820>>2])+-1|0,i=1<<(b=0|ar[o+5804>>2]),l=A+24|0,ba(o,A,u,0|ar[(f=A+8|0)>>2],0|ar[l>>2]),0<(0|(o=0|ar[f>>2]))&&(ba(0|ar[n>>2],A,u,o+-1|0,0|ar[l>>2]),o=0|ar[f>>2]),a=o+1|0,c=0|ar[n>>2],(0|a)<(0|ar[c+5828>>2])&&(ba(c,A,u,a,0|ar[l>>2]),o=0|ar[f>>2]),r=A+16|0,function(A,e,r,i){A|=0,r|=0,i|=0;var f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;if(c=(0|(c=0|ar[(e|=0)+28>>2]))<(0|i)?c:i,1&r|0&&sr(36765,36663,535,36780),1&c|0&&sr(36796,36663,536,36780),n=(7+(0|ar[A+5760>>2])|0)/8|0,s=(7+(0|ar[A+5768>>2])|0)/8|0,(0|(i=0|ar[(t=e+40|0)>>2]))!=(0|(f=0|ar[(o=A+40|0)>>2]))){if((0|r)<(0|c)&&(l=A+4|0,u=e+4|0,b=e+24|0,a=0|br(n,r),hb(0|(f=(0|ar[l>>2])+(0|br(a,f))|0),0|(a=(0|ar[u>>2])+(0|br(a,i))|0),0|br(0|ar[b>>2],n)),(0|(a=r+1|0))<(0|c)))for(i=a;a=0|br(i,n),hb(0|(f=(0|ar[l>>2])+(0|br(a,0|ar[o>>2]))|0),0|(a=(0|ar[u>>2])+(0|br(a,0|ar[t>>2]))|0),0|br(0|ar[b>>2],n)),(0|(i=i+1|0))<(0|c););}else hb(0|(b=(0|ar[A+4>>2])+(0|br(0|br(n,r),i))|0),(0|ar[e+4>>2])+(0|br(0|br(i,r),n))|0,0|br(0|br(n,c-r|0),i));if(i=(0|r)/(0|(a=0|ar[e+5784>>2]))|0,a=(0|c)/(0|a)|0,0|ar[e+20>>2]){if((0|(f=0|ar[(c=e+44|0)>>2]))==(0|(n=0|ar[(r=A+44|0)>>2])))return u=0|br(i,s),l=0|br(u,f),b=0|br(a-i|0,s),hb((0|ar[A+8>>2])+l|0,(0|ar[e+8>>2])+l|0,0|br(b,f)),s=0|ar[r>>2],u=0|br(u,s),hb((0|ar[A+12>>2])+u|0,(0|ar[e+12>>2])+u|0,0|br(b,s));if(!((0|a)<=(0|i)))for(l=A+8|0,u=e+8|0,b=e+32|0,o=A+12|0,t=e+12|0;e=0|br(i,s),hb(0|(n=(0|ar[l>>2])+(0|br(e,n))|0),0|(A=(0|ar[u>>2])+(0|br(e,f))|0),0|br(0|ar[b>>2],s)),hb(0|(A=(0|ar[o>>2])+(0|br(e,0|ar[r>>2]))|0),0|(e=(0|ar[t>>2])+(0|br(e,0|ar[c>>2]))|0),0|br(0|ar[b>>2],s)),(0|(i=i+1|0))!=(0|a);)n=0|ar[r>>2],f=0|ar[c>>2]}}(0|ar[(e=A+20|0)>>2],0|ar[r>>2],o<<b,o+1<<b),o=0|ar[n>>2];A:do{if(0<(0|ar[o+5820>>2])){h=0;do{if(b=0|ar[f>>2],a=(0|br(0|ar[o+10352>>2],b))+h|0,a=0|lr[(0|ar[o+10340>>2])+(24*a|0)+2>>1],c=0|ar[o+48>>2],a>>>0>=(0|ar[o+52>>2])-c>>2>>>0)break A;if(!(k=0|ar[c+(a<<2)>>2]))break A;do{if(0|tr[k+325>>0]){if(a=0|ar[r>>2],l=0|ar[a+4>>2],a=0|ar[a+40>>2],c=0|ar[e>>2],u=0|ar[c+4>>2],c=0|ar[c+40>>2],8<(0|ar[o+5760>>2])){Ra(o,h,b,k,0,i,i,l,a,u,c);break}Na(o,h,b,k,0,i,i,l,a,u,c);break}}while(0);do{if(0|tr[k+326>>0]){if(c=0|ar[n>>2],s=(0|i)/(0|ar[c+5780>>2])|0,d=(0|i)/(0|ar[c+5784>>2])|0,l=0|ar[f>>2],a=0|ar[r>>2],u=0|ar[a+8>>2],a=0|ar[a+44>>2],o=0|ar[e>>2],b=0|ar[o+8>>2],o=0|ar[o+44>>2],(8<(0|ar[c+5768>>2])?Ra:Na)(c,h,l,k,1,s,d,u,a,b,o),u=0|ar[n>>2],b=0|ar[f>>2],a=0|ar[r>>2],c=0|ar[a+12>>2],a=0|ar[a+44>>2],o=0|ar[e>>2],l=0|ar[o+12>>2],o=0|ar[o+44>>2],8<(0|ar[u+5768>>2])){Ra(u,h,b,k,2,s,d,c,a,l,o);break}Na(u,h,b,k,2,s,d,c,a,l,o);break}}while(0);h=h+1|0,o=0|ar[n>>2]}while((0|h)<(0|ar[o+5820>>2]))}}while(0);if(!(0<(0|w)))return w=o,ar[t>>2]=3,void ua(w,A);for(a=0;Tn((0|ar[o+10524>>2])+(80*((0|br(0|ar[f>>2],0|ar[o+5820>>2]))+a|0)|0)|0,4),a=a+1|0,o=0|ar[n>>2],(0|a)!=(0|w););ar[t>>2]=3,ua(o,A)},function(A){vu(A|=0)},function(A){var e,r,i,f=0,n=0,t=0,o=0;e=0|ar[(A|=0)+20>>2],r=0|ar[(n=18596+e|0)>>2],ar[(i=A+4|0)>>2]=1,la(r,A),n=0|ar[n>>2],t=0|ar[4+e>>2],f=0|ar[n+5836>>2],o=0|ar[n+5820>>2],(0|t)<(0|f)&&(f=0|ar[(0|ar[n+10284>>2])+(t<<2)>>2]),ar[e>>2]=f,ar[8+e>>2]=(0|f)%(0|o)|0,ar[12+e>>2]=(0|f)/(0|o)|0,f=A+8|0;do{if(0|tr[f>>0]){if(!(0|Da(e)))return ar[i>>2]=3,Un(44+(0|ar[18608+e>>2])|0,1),void ua(r,A)}else{if(n=0|ar[18600+e>>2],(t=0|ar[n+796>>2])>>>0<3){ht(18580+e|0,t,0|ar[n+792>>2]),tr[(o=18588+e|0)>>0]=0,tr[o+1>>0]=0,tr[o+2>>0]=0,tr[o+3>>0]=0;break}sr(39211,39242,1508,39251)}}while(0);tt(18556+e|0),Ja(e,0,0!=(0|tr[f>>0])),ar[i>>2]=3,Un(44+(0|ar[18608+e>>2])|0,1),ua(r,A)},function(A){vu(A|=0)},function(A){var e,r,i,f,n,t,o=0,a=0,c=0,l=0,u=0,b=0;if(f=0|ar[(A|=0)+16>>2],n=0|ar[(l=18596+f|0)>>2],r=0|ar[(i=5820+n|0)>>2],ar[(t=A+4|0)>>2]=1,la(n,A),l=0|ar[l>>2],c=0|ar[4+f>>2],a=0|ar[l+5836>>2],u=0|ar[l+5820>>2],(0|c)<(0|a)&&(a=0|ar[(0|ar[l+10284>>2])+(c<<2)>>2]),ar[f>>2]=a,ar[(c=8+f|0)>>2]=(0|a)%(0|u)|0,ar[(l=12+f|0)>>2]=(0|a)/(0|u)|0,e=(0|a)/(0|r)|0,0|tr[(a=A+8|0)>>0]&&!(0|Da(f))){if(0<(0|r))for(c=10524+n|0,a=0|br(e,r),o=0;Tn((0|ar[c>>2])+(80*(o+a|0)|0)|0,1),(0|(o=o+1|0))!=(0|r););return ar[t>>2]=3,Un(44+(0|ar[18608+f>>2])|0,1),void ua(n,A)}tt(18556+f|0),Ja(f,1,a=0|tr[a>>0]?0==(0|tr[12+(0|ar[18600+f>>2])>>0]):0);A:do{if((0|ar[l>>2])==(0|e)&&(b=0|ar[i>>2],o=0|ar[c>>2],(0|o)<(0|b)))for(u=5828+n|0,c=0|br(e,r),l=10524+n|0,a=b;;){if((0|o)<(0|a)&&(0|e)<(0|ar[u>>2])&&Tn((0|ar[l>>2])+(80*(o+c|0)|0)|0,1),(0|(o=o+1|0))==(0|b))break A;a=0|ar[i>>2]}}while(0);ar[t>>2]=3,Un(44+(0|ar[18608+f>>2])|0,1),ua(n,A)},function(A){vu(A|=0)},function(A){var e,r,i,f,n,t,o,a,c=0,l=0,u=0,b=0,s=0,d=0,k=0;ar[(a=(A|=0)+4|0)>>2]=1,la(0|ar[(t=A+8|0)>>2],A),e=0|ar[t>>2],i=0|ar[10472+e>>2],d=(0|ar[5812+e>>2])/4|0,c=0|ar[(n=A+12|0)>>2],r=0|br(c,d),d=0|br(l=c+1|0,d),d=(0|(s=0|ar[10476+e>>2]))<(0|d)?s:d,f=(k=0!=(0|tr[(s=A+16|0)>>0]))?2:3,u=(o=0|ar[5820+e>>2])-1|0,k?ba(e,A,u,(0|(k=(0|ar[5828+e>>2])-1|0))<(0|l)?k:l,1):(0<(0|c)?(ba(e,A,u,c+-1|0,2),l=0|ar[t>>2],c=0|ar[n>>2]):l=e,ba(l,A,u,c,2),c=1+(0|ar[n>>2])|0,l=0|ar[t>>2],(0|c)<(0|ar[l+5828>>2])&&ba(l,A,u,c,2)),c=0|ar[t>>2],l=0|ar[n>>2],0|tr[s>>0]?(k=0|Zt(c,l),c=0|ar[t>>2],u=0|br(0|ar[c+10352>>2],0|ar[n>>2]),tr[(0|ar[c+10340>>2])+(24*u|0)+21>>0]=1&k,k&&(l=0!=(0|tr[s>>0]),b=11)):(k=0|br(0|ar[c+10352>>2],l),0|tr[(0|ar[c+10340>>2])+(24*k|0)+21>>0]&&(l=0,b=11));do{if(11==(0|b)&&(pt(c,l,r,d,0,i),c=0|ar[t>>2],l=0!=(0|tr[s>>0]),(8<(0|ar[c+5760>>2])?yt:Bt)(c,l,r,d,0,i),l=0|ar[t>>2],0|ar[l+5776>>2])){if(c=0!=(0|tr[s>>0]),8<(0|ar[l+5768>>2])){Et(l,c,r,d,0,i);break}Xt(l,c,r,d,0,i);break}}while(0);if(c=0|ar[t>>2],!(0<(0|o)))return k=c,ar[a>>2]=3,void ua(k,A);for(l=0;Tn((0|ar[c+10524>>2])+(80*((0|br(0|ar[n>>2],0|ar[c+5820>>2]))+l|0)|0)|0,f),l=l+1|0,c=0|ar[t>>2],(0|l)!=(0|o););ar[a>>2]=3,ua(c,A)},sf,function(A){sf(A|=0),vu(A)},kf,function(A){kf(A|=0),vu(A)},mf,function(A){mf(A|=0),vu(A)},Xf,Wf,function(A){Xf((A|=0)+(0|ar[(0|ar[A>>2])-12>>2])|0)},function(A){Wf((A|=0)+(0|ar[(0|ar[A>>2])-12>>2])|0)},Vf,Ff,function(A){Vf((A|=0)+(0|ar[(0|ar[A>>2])-12>>2])|0)},function(A){Ff((A|=0)+(0|ar[(0|ar[A>>2])-12>>2])|0)},An,function(A){An(A|=0),vu(A)},en,function(A){en(A|=0),vu(A)},rn,function(A){rn(A|=0),vu(A)},nn,function(A){nn(A|=0),vu(A)},on,function(A){on(A|=0),vu(A)},function(A){0|(A|=0)&&is[511&ar[4+(0|ar[A>>2])>>2]](A)},cn,function(A){cn(),vu(A|=0)},function(A){an()},function(A){an(),vu(A|=0)},function(A){an()},function(A){an(),vu(A|=0)},function(A){an(A|=0)},function(A){an(A|=0),vu(A)},function(A){an(A|=0)},function(A){an(A|=0),vu(A)},function(A){an(A|=0)},function(A){an(A|=0),vu(A)},function(A){an(A|=0)},function(A){an(A|=0),vu(A)},function(A){ni((A|=0)+8|0),an()},function(A){ni((A|=0)+8|0),an(),vu(A)},function(A){ni((A|=0)+8|0),an()},function(A){ni((A|=0)+8|0),an(),vu(A)},function(A){an(A|=0)},function(A){an(A|=0),vu(A)},function(A){an(A|=0)},function(A){an(A|=0),vu(A)},function(A){an(A|=0)},function(A){an(A|=0),vu(A)},function(A){an(A|=0)},function(A){an(A|=0),vu(A)},function(A){an(A|=0)},function(A){an(A|=0),vu(A)},function(A){an(A|=0)},function(A){an(A|=0),vu(A)},function(A){an(A|=0)},function(A){an(A|=0),vu(A)},function(A){an(A|=0)},function(A){an(A|=0),vu(A)},function(A){an()},function(A){an(),vu(A|=0)},function(A){an()},function(A){an(),vu(A|=0)},an,function(A){an(),vu(A|=0)},function(A){an(),vu(A|=0)},Ql,function(A){Ql(A|=0),vu(A)},Dl,function(A){Dl(A|=0),vu(A)},Jl,function(A){Jl(A|=0),vu(A)},Sl,function(A){Sl(A|=0),vu(A)},Ol,function(A){Ol(A|=0),vu(A)},function(A){an(),vu(A|=0)},function(A){an(),vu(A|=0)},function(A){an(),vu(A|=0)},function(A){an(),vu(A|=0)},function(A){an(),vu(A|=0)},ou,function(A){ou(),vu(A|=0)},Hu,function(A){Hu(),vu(A|=0)},function(A){0},function(A){0},function(A){Hu(),vu(A|=0)},$u,function(A){$u(A|=0),vu(A)},function(A){$u(A|=0),vu(A)},function(A){Hu(),vu(A|=0)},function(A){Hu(),vu(A|=0)},function(A){Hu(),vu(A|=0)},function(A){Hu(),vu(A|=0)},function(A){ar[(A|=0)>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,tr[A+11>>0]=6,tr[A>>0]=0|tr[30018],tr[A+1>>0]=0|tr[30019],tr[A+2>>0]=0|tr[30020],tr[A+3>>0]=0|tr[30021],tr[A+4>>0]=0|tr[30022],tr[A+5>>0]=0|tr[30023],tr[A+6>>0]=0},function(A){var e;(A|=0)&&(0|(e=0|ar[A+4>>2])&&du(e),vu(A))},function(A){var e=0;(A|=0)&&(0|(e=0|ar[A+12>>2])&&du(e),0|(e=0|ar[A+4>>2])&&du(e),vu(A))},function(A){var e;(A|=0)&&(0|(e=0|ar[A+4>>2])&&du(e),vu(A))},function(A){var e=0;(A|=0)&&(0|(e=0|ar[A+12>>2])&&du(e),0|(e=0|ar[A+4>>2])&&du(e),vu(A))},function(A){var e;(A|=0)&&(0|(e=0|ar[A+4>>2])&&du(e),vu(A))},function(A){(A|=0)&&vu(A)},function(A){var e;A|=0,e=0|ar[14811],ar[14811]=1+e,ar[A+4>>2]=1+e},function(A){!function(A){var e,r,i;e=0|ar[4+(A|=0)>>2],i=0|ar[A+8>>2],r=(0|ar[A>>2])+(i>>1)|0,A=1&i?0|ar[(0|ar[r>>2])+e>>2]:e;is[511&A](r)}(0|ar[ar[(A|=0)>>2]>>2])},function(A){0},Bc,function(A){var e,r;r=ur=(e=ur)+31&-32,ur=ur+16|0,Bc(A|=0),0|BA(0|ar[15288],0)?ju(56257,r):ur=e},_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b,_b],fs=[Yb,function(A,e){},function(A,e){var r,i;A|=0,e|=0,r=0|hu(4),ar[r>>2]=0,ar[A>>2]=ar[1904],ar[A+4>>2]=ar[1905],ar[A+8>>2]=ar[1906],A=0|(i=(i=0)|ar[14154],ar[14154]=i+1,!((i+1|0)<=1)||(Ya(),0|Ka())?(function(A){var e=0,r=0,i=0,f=0,n=0,t=0,o=0,a=0;for(ar[84+(A|=0)>>2]=0,ar[A+168>>2]=0,ar[A>>2]=7720,function(A){ar[(A|=0)>>2]=1,ar[A+4>>2]=9,ar[A+8>>2]=1,ar[A+12>>2]=1,ar[A+16>>2]=1,ar[A+20>>2]=2,ar[A+24>>2]=1,ar[A+28>>2]=1,ar[A+32>>2]=2,ar[A+36>>2]=2,ar[A+40>>2]=2,ar[A+44>>2]=2,ar[A+48>>2]=3,ar[A+52>>2]=4,ar[A+56>>2]=5,ar[A+60>>2]=6,ar[A+64>>2]=7,ar[A+68>>2]=8,ar[A+72>>2]=9,ar[A+76>>2]=10,ar[A+80>>2]=11,ar[A+84>>2]=12,ar[A+88>>2]=13,ar[A+92>>2]=14,ar[A+96>>2]=15,ar[A+100>>2]=16,ar[A+104>>2]=17,ar[A+108>>2]=18,ar[A+112>>2]=3,ar[A+116>>2]=4,ar[A+120>>2]=4,ar[A+124>>2]=4,ar[A+128>>2]=2,ar[A+132>>2]=3,ar[A+136>>2]=4,ar[A+140>>2]=5,ar[A+144>>2]=6,ar[A+148>>2]=7,ar[A+152>>2]=8,ar[A+156>>2]=9,ar[A+160>>2]=10,ar[A+164>>2]=11,ar[A+168>>2]=12,ar[A+172>>2]=13,ar[A+176>>2]=14,ar[A+180>>2]=15,ar[A+184>>2]=16,ar[A+188>>2]=17,ar[A+204>>2]=81,ar[A+212>>2]=11,ar[A+208>>2]=12,ar[A+192>>2]=82,ar[A+200>>2]=83,ar[A+196>>2]=84,ar[A+216>>2]=85,ar[A+220>>2]=86,ar[A+224>>2]=87,ar[A+228>>2]=88,ar[A+232>>2]=89,ar[A+236>>2]=13,ar[A+240>>2]=14,ar[A+244>>2]=15,ar[A+248>>2]=16,ar[A+252>>2]=17,ar[A+256>>2]=18,ar[A+260>>2]=47,ar[A+284>>2]=44,ar[A+288>>2]=45,ar[A+296>>2]=46,ar[A+292>>2]=47,ar[A+300>>2]=48,ar[A+264>>2]=19,ar[A+268>>2]=20,ar[A+272>>2]=21,ar[A+276>>2]=22,ar[A+280>>2]=23,ar[A+304>>2]=90,ar[A+308>>2]=91,ar[A+312>>2]=92,ar[A+316>>2]=93,ar[A+320>>2]=94,ar[A+324>>2]=95,ar[A+328>>2]=96,ar[A+332>>2]=97,ar[A+336>>2]=98}(A+172|0),ar[A>>2]=7696,function(A){var e;for(tr[(A|=0)>>0]=0,tr[A+1>>0]=0,e=48+(A=A+4|0)|0;((ar[A>>2]=0)|(A=A+4|0))<(0|e););}(A+548|0),ar[A+1192>>2]=0,ar[A+1196>>2]=0,ar[A+1200>>2]=0,ar[(e=A+1228|0)>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[e+16>>2]=0,ar[e+20>>2]=0,ar[A+1848>>2]=0,ar[A+1852>>2]=0,ar[A+1856>>2]=0,ar[(e=A+1884|0)>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[e+16>>2]=0,ar[e+20>>2]=0,ar[A+2504>>2]=0,ar[A+2508>>2]=0,ar[A+2512>>2]=0,ar[(e=A+2540|0)>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[e+16>>2]=0,ar[e+20>>2]=0,ar[A+3160>>2]=0,ar[A+3164>>2]=0,ar[A+3168>>2]=0,ar[(e=A+3196|0)>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[e+16>>2]=0,ar[e+20>>2]=0,ar[A+3816>>2]=0,ar[A+3820>>2]=0,ar[A+3824>>2]=0,ar[(e=A+3852|0)>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[e+16>>2]=0,ar[e+20>>2]=0,ar[A+4472>>2]=0,ar[A+4476>>2]=0,ar[A+4480>>2]=0,ar[(e=A+4508|0)>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[e+16>>2]=0,ar[e+20>>2]=0,ar[A+5128>>2]=0,ar[A+5132>>2]=0,ar[A+5136>>2]=0,ar[(e=A+5164|0)>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[e+16>>2]=0,ar[e+20>>2]=0,ar[A+5784>>2]=0,ar[A+5788>>2]=0,ar[A+5792>>2]=0,ar[(e=A+5820|0)>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[e+16>>2]=0,ar[e+20>>2]=0,ar[A+6440>>2]=0,ar[A+6444>>2]=0,ar[A+6448>>2]=0,ar[(e=A+6476|0)>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[e+16>>2]=0,ar[e+20>>2]=0,ar[A+7096>>2]=0,ar[A+7100>>2]=0,ar[A+7104>>2]=0,ar[(e=A+7132|0)>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[e+16>>2]=0,ar[e+20>>2]=0,ar[A+7752>>2]=0,ar[A+7756>>2]=0,ar[A+7760>>2]=0,ar[(e=A+7788|0)>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[e+16>>2]=0,ar[e+20>>2]=0,ar[A+8408>>2]=0,ar[A+8412>>2]=0,ar[A+8416>>2]=0,ar[(e=A+8444|0)>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[e+16>>2]=0,ar[e+20>>2]=0,ar[A+9064>>2]=0,ar[A+9068>>2]=0,ar[A+9072>>2]=0,ar[(e=A+9100|0)>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[e+16>>2]=0,ar[e+20>>2]=0,ar[A+9720>>2]=0,ar[A+9724>>2]=0,ar[A+9728>>2]=0,ar[(e=A+9756|0)>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[e+16>>2]=0,ar[e+20>>2]=0,ar[A+10376>>2]=0,ar[A+10380>>2]=0,ar[A+10384>>2]=0,ar[(e=A+10412|0)>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[e+16>>2]=0,ar[e+20>>2]=0,ar[A+11032>>2]=0,ar[A+11036>>2]=0,ar[A+11040>>2]=0,ar[(e=A+11068|0)>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[e+16>>2]=0,ar[e+20>>2]=0,$a(A+11096|0),$a(A+16264|0),$a(A+21432|0),$a(A+26600|0),$a(A+31768|0),$a(A+36936|0),$a(A+42104|0),$a(A+47272|0),$a(A+52440|0),$a(A+57608|0),$a(A+62776|0),$a(A+67944|0),$a(A+73112|0),$a(A+78280|0),$a(A+83448|0),$a(A+88616|0),e=0;Ia(A+93784+(4400*e|0)|0),64!=(0|(e=e+1|0)););for(ar[(n=A+375400|0)>>2]=0,ar[n+4>>2]=0,ar[n+8>>2]=0,ar[n+12>>2]=0,ar[n+16>>2]=0,ar[n+20>>2]=0,function(A){var e,r=0;for(e=48+(r=8+(A|=0)|0)|0;((ar[r>>2]=0)|(r=r+4|0))<(0|e););ar[A>>2]=30,ar[A+4>>2]=30}(A+376148|0),ar[A+377216>>2]=0,ar[A+377220>>2]=0,ar[A+377224>>2]=0,tr[A+512>>0]=0,tr[A+513>>0]=1,tr[A+514>>0]=0,tr[A+532>>0]=0,tr[A+533>>0]=0,ar[(n=A+516|0)>>2]=-1,ar[n+4>>2]=-1,ar[n+8>>2]=-1,ar[n+12>>2]=-1,e=0|ar[4+(n=7736)>>2],ar[(t=A+536|0)>>2]=ar[n>>2],ar[t+4>>2]=e,ar[A+544>>2]=0,ar[A+375384>>2]=0,ar[A+375388>>2]=0,ar[A+375392>>2]=0,ar[A+375892>>2]=0,ar[(t=A+375896|0)>>2]=6,ar[A+375900>>2]=100,ar[A+375904>>2]=6,ar[A+375912>>2]=6,ar[A+375908>>2]=100,e=6;;){if((0|(i=(0|(n=100*e|0))/7|0))<=(0|(n=(n+100|0)/7|0)))for(f=n-i|0,r=i;a=0|ar[t>>2],e=(o=(0|a)<(0|e))?a:e,tr[A+375916+(r<<1)>>0]=e,tr[A+375916+(r<<1)+1>>0]=o?100:255&((100*(r-i|0)|0)/(0|f)|0),(0|r)<(0|n);)r=r+1|0;if(ar[A+376120+(e<<2)>>2]=n,!(0<(0|e)))break;e=e+-1|0}ar[(a=A+376204|0)>>2]=0,ar[a+4>>2]=0,ar[a+8>>2]=0,ar[a+12>>2]=0,ar[a+16>>2]=0,ar[a+20>>2]=0,tr[A+376208>>0]=1,ar[a>>2]=-1}(i=0|hu(377232)),0|i):(ar[14154]=(0|ar[14154])-1,(i=0)|i)),Ne(ar[r>>2]=A,7,1),Ne(A,8,1),ar[e>>2]=r},function(A,e){A|=0,e|=0;var r,i,f=0,n=0;if(ur=(i=ur)+112|0,r=(f=i)+4|0,ar[f>>2]=ar[e+8>>2],Bi(r,39045,f),ar[A>>2]=0,ar[A+4>>2]=0,4294967279<(e=(ar[A+8>>2]=0)|Vc(r))>>>0&&pu(),e>>>0<11){if(!(tr[A+11>>0]=e))return tr[(f=(f=A)+e|0)>>0]=0,void(ur=i)}else f=0|hu(n=e+16&-16),ar[A>>2]=f,ar[A+8>>2]=-2147483648|n,ar[A+4>>2]=e,A=f;hb(0|A,0|r,0|e),tr[(n=(n=A)+e|0)>>0]=0,ur=i},function(A,e){A|=0;var r,i,f=0,n=0;if(ur=(i=ur)+112|0,r=(f=i)+8|0,n=0|ar[(e|=0)+16>>2],ar[f>>2]=ar[e+12>>2],ar[f+4>>2]=n,Bi(r,39191,f),ar[A>>2]=0,ar[A+4>>2]=0,4294967279<(e=(ar[A+8>>2]=0)|Vc(r))>>>0&&pu(),e>>>0<11){if(!(tr[A+11>>0]=e))return tr[(n=(n=A)+e|0)>>0]=0,void(ur=i)}else n=0|hu(f=e+16&-16),ar[A>>2]=n,ar[A+8>>2]=-2147483648|f,ar[A+4>>2]=e,A=n;hb(0|A,0|r,0|e),tr[(n=(n=A)+e|0)>>0]=0,ur=i},function(A,e){A|=0,e|=0;var r,i,f=0,n=0;if(ur=(i=ur)+112|0,r=(f=i)+4|0,ar[f>>2]=ar[e+12>>2],Bi(r,39665,f),ar[A>>2]=0,ar[A+4>>2]=0,4294967279<(e=(ar[A+8>>2]=0)|Vc(r))>>>0&&pu(),e>>>0<11){if(!(tr[A+11>>0]=e))return tr[(f=(f=A)+e|0)>>0]=0,void(ur=i)}else f=0|hu(n=e+16&-16),ar[A>>2]=f,ar[A+8>>2]=-2147483648|n,ar[A+4>>2]=e,A=f;hb(0|A,0|r,0|e),tr[(n=(n=A)+e|0)>>0]=0,ur=i},function(A,e){A|=0,e|=0;var r,i,f=0,n=0;if(ur=(i=ur)+112|0,r=(f=i)+4|0,ar[f>>2]=ar[e+12>>2],Bi(r,48089,f),ar[A>>2]=0,ar[A+4>>2]=0,4294967279<(e=(ar[A+8>>2]=0)|Vc(r))>>>0&&pu(),e>>>0<11){if(!(tr[A+11>>0]=e))return tr[(f=(f=A)+e|0)>>0]=0,void(ur=i)}else f=0|hu(n=e+16&-16),ar[A>>2]=f,ar[A+8>>2]=-2147483648|n,ar[A+4>>2]=e,A=f;hb(0|A,0|r,0|e),tr[(n=(n=A)+e|0)>>0]=0,ur=i},function(A,e){},function(A,e){e|=0,jb[127&ar[24+(0|ar[(A|=0)>>2])>>2]](A),e=0|un(e,61032),ar[A+36>>2]=e,e=1&(0|jb[127&ar[28+(0|ar[e>>2])>>2]](e)),tr[A+44>>0]=e},function(A,e){e|=0,jb[127&ar[24+(0|ar[(A|=0)>>2])>>2]](A),e=0|un(e,61024),ar[A+36>>2]=e,e=1&(0|jb[127&ar[28+(0|ar[e>>2])>>2]](e)),tr[A+44>>0]=e},function(A,e){A|=0;var r=0,i=0;i=0|un(e|=0,61032),ar[(r=A+36|0)>>2]=i,i=0|jb[127&ar[24+(0|ar[i>>2])>>2]](i),ar[(e=A+44|0)>>2]=i,r=0|ar[r>>2],r=1&(0|jb[127&ar[28+(0|ar[r>>2])>>2]](r)),tr[A+53>>0]=r,8<(0|ar[e>>2])&&ti()},function(A,e){A|=0;var r=0,i=0;i=0|un(e|=0,61024),ar[(r=A+36|0)>>2]=i,i=0|jb[127&ar[24+(0|ar[i>>2])>>2]](i),ar[(e=A+44|0)>>2]=i,r=0|ar[r>>2],r=1&(0|jb[127&ar[28+(0|ar[r>>2])>>2]](r)),tr[A+53>>0]=r,8<(0|ar[e>>2])&&ti()},function(A,e){for(e|=0,ar[(A|=0)>>2]=0,ar[A+4>>2]=0,e=ar[A+8>>2]=0;3!=(0|e);)e=e+1|(ar[A+(e<<2)>>2]=0)},function(A,e){for(e|=0,ar[(A|=0)>>2]=0,ar[A+4>>2]=0,e=ar[A+8>>2]=0;3!=(0|e);)e=e+1|(ar[A+(e<<2)>>2]=0)},function(A,e){for(e|=0,ar[(A|=0)>>2]=0,ar[A+4>>2]=0,e=ar[A+8>>2]=0;3!=(0|e);)e=e+1|(ar[A+(e<<2)>>2]=0)},function(A,e){var r;e|=0,r=ur=(e=ur)+31&-32,ur=ur+16|0,ar[(A|=0)>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,oi(A,tr[A+11>>0]=1,45),Qf(A+1|(tr[r>>0]=0),r),ur=e},function(A,e){tr[(A|=0)>>0]=2,tr[A+1>>0]=3,tr[A+2>>0]=0,tr[A+3>>0]=4},function(A,e){tr[(A|=0)>>0]=2,tr[A+1>>0]=3,tr[A+2>>0]=0,tr[A+3>>0]=4},function(A,e){for(e|=0,ar[(A|=0)>>2]=0,ar[A+4>>2]=0,e=ar[A+8>>2]=0;3!=(0|e);)e=e+1|(ar[A+(e<<2)>>2]=0)},function(A,e){for(e|=0,ar[(A|=0)>>2]=0,ar[A+4>>2]=0,e=ar[A+8>>2]=0;3!=(0|e);)e=e+1|(ar[A+(e<<2)>>2]=0)},function(A,e){for(e|=0,ar[(A|=0)>>2]=0,ar[A+4>>2]=0,e=ar[A+8>>2]=0;3!=(0|e);)e=e+1|(ar[A+(e<<2)>>2]=0)},function(A,e){var r;e|=0,r=ur=(e=ur)+31&-32,ur=ur+16|0,ar[(A|=0)>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,oi(A,tr[A+11>>0]=1,45),Qf(A+1|(tr[r>>0]=0),r),ur=e},function(A,e){tr[(A|=0)>>0]=2,tr[A+1>>0]=3,tr[A+2>>0]=0,tr[A+3>>0]=4},function(A,e){tr[(A|=0)>>0]=2,tr[A+1>>0]=3,tr[A+2>>0]=0,tr[A+3>>0]=4},function(A,e){for(e|=0,ar[(A|=0)>>2]=0,ar[A+4>>2]=0,e=ar[A+8>>2]=0;3!=(0|e);)e=e+1|(ar[A+(e<<2)>>2]=0)},function(A,e){for(e|=0,ar[(A|=0)>>2]=0,ar[A+4>>2]=0,e=ar[A+8>>2]=0;3!=(0|e);)e=e+1|(ar[A+(e<<2)>>2]=0)},function(A,e){for(e|=0,ar[(A|=0)>>2]=0,ar[A+4>>2]=0,e=ar[A+8>>2]=0;3!=(0|e);)e=e+1|(ar[A+(e<<2)>>2]=0)},function(A,e){var r;e|=0,r=ur=(e=ur)+31&-32,ur=ur+16|0,ar[(A|=0)>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,gr(A,tr[A+8+3>>0]=1,45),ln(A+4|(ar[r>>2]=0),r),ur=e},function(A,e){tr[(A|=0)>>0]=2,tr[A+1>>0]=3,tr[A+2>>0]=0,tr[A+3>>0]=4},function(A,e){tr[(A|=0)>>0]=2,tr[A+1>>0]=3,tr[A+2>>0]=0,tr[A+3>>0]=4},function(A,e){for(e|=0,ar[(A|=0)>>2]=0,ar[A+4>>2]=0,e=ar[A+8>>2]=0;3!=(0|e);)e=e+1|(ar[A+(e<<2)>>2]=0)},function(A,e){for(e|=0,ar[(A|=0)>>2]=0,ar[A+4>>2]=0,e=ar[A+8>>2]=0;3!=(0|e);)e=e+1|(ar[A+(e<<2)>>2]=0)},function(A,e){for(e|=0,ar[(A|=0)>>2]=0,ar[A+4>>2]=0,e=ar[A+8>>2]=0;3!=(0|e);)e=e+1|(ar[A+(e<<2)>>2]=0)},function(A,e){var r;e|=0,r=ur=(e=ur)+31&-32,ur=ur+16|0,ar[(A|=0)>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,gr(A,tr[A+8+3>>0]=1,45),ln(A+4|(ar[r>>2]=0),r),ur=e},function(A,e){tr[(A|=0)>>0]=2,tr[A+1>>0]=3,tr[A+2>>0]=0,tr[A+3>>0]=4},function(A,e){tr[(A|=0)>>0]=2,tr[A+1>>0]=3,tr[A+2>>0]=0,tr[A+3>>0]=4},function(A,e){},function(A,e){},function(A,e){yu(A|=0,(e|=0)+12|0)},function(A,e){e|=0;var r,i,f,n=0;r=ur=(f=ur)+31&-32,ur=ur+16|0,ar[(A|=0)>>2]=0,ar[A+4>>2]=0,4294967279<(i=(ar[A+8>>2]=0)|Yf(55745))>>>0&&pu(),i>>>0<11?(tr[A+11>>0]=i,e=A):(e=0|hu(n=16+i&-16),ar[A>>2]=e,ar[A+8>>2]=-2147483648|n,ar[A+4>>2]=i),wf(e,55745,i),Qf(e+i|(tr[r>>0]=0),r),ur=f},function(A,e){e|=0;var r,i,f,n=0;r=ur=(f=ur)+31&-32,ur=ur+16|0,ar[(A|=0)>>2]=0,ar[A+4>>2]=0,4294967279<(i=(ar[A+8>>2]=0)|Yf(55739))>>>0&&pu(),i>>>0<11?(tr[A+11>>0]=i,e=A):(e=0|hu(n=16+i&-16),ar[A>>2]=e,ar[A+8>>2]=-2147483648|n,ar[A+4>>2]=i),wf(e,55739,i),Qf(e+i|(tr[r>>0]=0),r),ur=f},function(A,e){yu(A|=0,(e|=0)+16|0)},function(A,e){e|=0;var r,i,f,n=0;r=ur=(f=ur)+31&-32,ur=ur+16|0,ar[(A|=0)>>2]=0,ar[A+4>>2]=0,1073741807<(i=(ar[A+8>>2]=0)|Mr(17204))>>>0&&pu();do{if(2<=i>>>0){if(!(1073741823<(e=4+i&-4)>>>0)){n=0|hu(e<<2),ar[A>>2]=n,ar[A+8>>2]=-2147483648|e,ar[A+4>>2]=i;break}lA()}else tr[A+8+3>>0]=i,n=A}while(0);Zf(n,17204,i),ln(n+(i<<2)|(ar[r>>2]=0),r),ur=f},function(A,e){e|=0;var r,i,f,n=0;r=ur=(f=ur)+31&-32,ur=ur+16|0,ar[(A|=0)>>2]=0,ar[A+4>>2]=0,1073741807<(i=(ar[A+8>>2]=0)|Mr(17180))>>>0&&pu();do{if(2<=i>>>0){if(!(1073741823<(e=4+i&-4)>>>0)){n=0|hu(e<<2),ar[A>>2]=n,ar[A+8>>2]=-2147483648|e,ar[A+4>>2]=i;break}lA()}else tr[A+8+3>>0]=i,n=A}while(0);Zf(n,17180,i),ln(n+(i<<2)|(ar[r>>2]=0),r),ur=f},function(A,e){e|=0,is[511&(A|=0)](e)},function(A,e){A|=0,e|=0;var r,i=0,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0;if(ur=(r=ur)+16|0,u=(l=r)+12|0,i=0|nA(),ar[u>>2]=i,!e)return ar[A>>2]=i,ar[u>>2]=0,iA((u=0)|u),void(ur=r);if(sl(l,40+(0|ar[e>>2])|0),a=(o=(f=0|ar[(t=l+4|0)>>2])-(i=0|ar[l>>2])|0)>>3,0|(n=i)){if((0|f)!=(0|n)){for(;i=f+-8|0,ar[t>>2]=i,(f=0|ar[f+-4>>2])&&(du(f),i=0|ar[t>>2]),(0|i)!=(0|n);)f=i;i=0|ar[l>>2]}vu(i)}if((0|o)<8)return ar[A>>2]=ar[u>>2],ar[u>>2]=0,iA((u=0)|u),void(ur=r);if(!(c=0|yc(o>>>1)))return c=0|hu(12),ar[c>>2]=6,ar[c+4>>2]=1e3,ar[l>>2]=c,l=0|cA(1392,0|l),ar[A>>2]=l,u=0|ar[u>>2],iA(0|u),void(ur=r);if(sl(l,40+(0|ar[e>>2])|0),f=0|ar[(o=l+4|0)>>2],t=i=0|ar[l>>2],e=0<(0|(a=(0|(e=f-i>>3))<(0|a)?e:a)))for(n=0;ar[c+(n<<2)>>2]=ar[20+(0|ar[t+(n<<3)>>2])>>2],(0|(n=n+1|0))<(0|a););if(0|i){if((0|f)!=(0|t)){for(;i=f+-8|0,ar[o>>2]=i,(f=0|ar[f+-4>>2])&&(du(f),i=0|ar[o>>2]),(0|i)!=(0|t);)f=i;i=0|ar[l>>2]}vu(i)}if(!a)return Bc(c),ar[A>>2]=ar[u>>2],ar[u>>2]=0,iA((u=0)|u),void(ur=r);if(ar[l>>2]=0,e)for(i=0;dl(u,l,c+(i<<2)|0),i=1+(0|ar[l>>2])|0,(0|(ar[l>>2]=i))<(0|a););Bc(c),ar[A>>2]=ar[u>>2],ar[u>>2]=0,iA((u=0)|u),ur=r},function(A,e){e|=0,is[511&(A|=0)](e)},function(A,e){A|=0;var r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=0;if(r=(0|(e|=0))/2|0,!((0|e)<=1)){i=e+-1|0,f=0;do{for(t=0|br(f,e),o=i+(0|br(i-f|0,e))|0,n=0;a=A+(o-n<<1)|0,c=0|or[(l=A+(n+t<<1)|0)>>1],or[l>>1]=0|or[a>>1],or[a>>1]=c,(0|(n=n+1|0))!=(0|e););f=f+1|0}while((0|f)<(0|r))}},Yb,Yb,Yb,Yb,Yb,Yb,Yb,Yb,Yb,Yb,Yb,Yb,Yb,Yb,Yb,Yb],ns=[Qb,HA,LA,function(A,e,r){A|=0,e|=0;var i,f,n,t,o=0,a=0,c=0,l=0,u=0;ur=(t=ur)+32|0,f=t,n=0|ar[(r|=0)+12>>2],jA(r,0|tr[e+36>>0]?12:8),a=0|ar[e+44>>2],i=0|ar[e+48>>2];A:do{if((0|a)==(0|i))o=A+8|0,l=8;else for(c=(o=A+8|0)+11|0;;){if(u=0|ar[a>>2],ns[127&ar[12+(0|ar[u>>2])>>2]](A,u,r),0|ar[A>>2])break A;if((0|tr[c>>0])<0&&vu(0|ar[o>>2]),(0|(a=a+8|0))==(0|i)){l=8;break}}}while(0);8==(0|l)&&(l=0|ar[(c=56592)+4>>2],ar[(u=A)>>2]=ar[c>>2],ar[u+4>>2]=l,yu(o,56600)),KA(f,e,r,n),ur=(0<=(0|tr[(o=f+8|0)+11>>0])||vu(0|ar[o>>2]),t)},function(A,e,r){A|=0,r|=0;var i,f,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0;ur=(f=ur)+32|0,i=f+12|0,o=f,t=0|ar[(n=c=(e|=0)+8|0)>>2],n=0|ar[n+4>>2];do{if(0==(0|t)&0==(0|n))for(e=r;(ar[(b=e+16|0)>>2]=0)!=(0|(e=(ar[b+4>>2]=0)|ar[e+8>>2])););else if(0|CA(r,e=0|ob(0|t,0|n,0|ar[(a=e+16|0)>>2],0),n=D)){if(0<n>>>0|0==(0|n)&2147483647<e>>>0)return ar[o>>2]=0,ar[o+4>>2]=0,ar[o+8>>2]=0,oo(A,2,101,o),0<=(0|tr[o+11>>0])||vu(0|ar[o>>2]),void(ur=f);if(e=0|ar[r>>2],(t=0==(0|(n=0|ar[r+4>>2])))||bu(n),b=0|ar[(u=c)>>2],u=0|ar[u+4>>2],l=0|ar[a>>2],o=0|ar[e>>2],a=0|ar[o+20>>2],o=0|jb[127&ar[o+8>>2]](e),c=D,c=0|tb(0|(l=0|ob(0|b,0|u,0|l,0)),0|D,0|o,0|c),xb[63&a](e,c,D),t)break;du(n);break}}while(0);0|tr[r+24>>0]?(ar[i>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,oo(A,2,100,i),(0|tr[11+i>>0])<0&&vu(0|ar[i>>2])):(u=0|ar[(l=56592)+4>>2],ar[(b=A)>>2]=ar[l>>2],ar[b+4>>2]=u,yu(A+8|0,56600)),ur=f},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a,c=0,l=0,u=0,b=0,s=0,d=0,k=0;if(ur=(a=ur)+160|0,f=a+136|0,t=(n=a)+56|0,o=n+4|0,ar[n>>2]=292,ar[t>>2]=312,Jf(n+56|0,o),ar[n+128>>2]=0,ar[n+132>>2]=-1,ar[n>>2]=4304,ar[t>>2]=4324,Sf(o),ar[o>>2]=4340,ar[(i=n+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[n+52>>2]=16,ar[f>>2]=0,ar[4+f>>2]=0,ar[8+f>>2]=0,Xe(o,f),(0|tr[11+f>>0])<0&&vu(0|ar[f>>2]),HA(f,e,r),We(n,(s=(d=0|tr[(k=11+f|0)>>0])<<24>>24<0)?0|ar[f>>2]:f,s?0|ar[4+f>>2]:255&d),(0|tr[k>>0])<0&&vu(0|ar[f>>2]),0<(0|ar[r>>2]))for(c=0;We(n,18862,2),(0|(c=c+1|0))<(0|ar[r>>2]););if(l=0|We(n,19206,13),k=0|ar[e+56>>2],ar[f>>2]=0,ar[4+f>>2]=0,ar[8+f>>2]=0,tr[(u=11+f|0)>>0]=4,tr[4+f>>0]=0,tr[f>>0]=k>>>24,tr[1+f>>0]=k>>>16,tr[2+f>>0]=k>>>8,tr[3+f>>0]=k,l=0|We(0|We(l,f,4),30086,1),0<(0|ar[r>>2]))for(c=0;We(l,18862,2),(0|(c=c+1|0))<(0|ar[r>>2]););if(l=0|We(l,19220,15),l=0|We(0|Lf(l,0|ar[e+60>>2]),30086,1),0<(0|ar[r>>2]))for(c=0;We(l,18862,2),(0|(c=c+1|0))<(0|ar[r>>2]););if(We(l,19236,19),(0|tr[u>>0])<0&&vu(0|ar[f>>2]),(0|(c=0|ar[e+64>>2]))!=(0|(r=0|ar[e+68>>2])))for(e=11+f|0,b=4+f|0,s=1+f|0,d=2+f|0,k=3+f|0,u=1;l=0|ar[c>>2],u||(tr[f>>0]=44,We(n,f,1)),ar[f>>2]=0,ar[4+f>>2]=0,ar[8+f>>2]=0,tr[e>>0]=4,tr[b>>0]=0,tr[f>>0]=l>>>24,tr[s>>0]=l>>>16,tr[d>>0]=l>>>8,tr[k>>0]=l,We(n,f,4),(0|tr[e>>0])<0&&vu(0|ar[f>>2]),(0|(c=c+4|0))!=(0|r);)u=0;if(We(n,30086,1),Ie(A,o),ar[n>>2]=4304,ar[t>>2]=4324,ar[o>>2]=4340,0<=(0|tr[11+i>>0]))return kf(o),Gf(),bf(t),void(ur=a);vu(0|ar[i>>2]),kf(o),Gf(),bf(t),ur=a},function(A,e,r){A|=0,e|=0;var i,f,n=0,t=0,o=0;if(ur=(f=ur)+32|0,t=f,o=0|ar[(r|=0)+12>>2],jA(r,0|tr[e+36>>0]?12:8),UA(r,0|ar[e+56>>2]),UA(r,0|ar[e+60>>2]),(0|(n=0|ar[e+64>>2]))!=(0|(i=0|ar[e+68>>2])))for(;UA(r,0|ar[n>>2]),(0|(n=n+4|0))!=(0|i););KA(t,e,r,o),(0|tr[(n=t+8|0)+11>>0])<0&&vu(0|ar[n>>2]),t=0|ar[(r=56592)+4>>2],ar[(o=A)>>2]=ar[r>>2],ar[o+4>>2]=t,yu(A+8|0,56600),ur=f},function(A,e,r){A|=0,e|=0;var i,f,n,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;if(ur=(n=ur)+32|0,s=n+12|0,c=n,o=0|FA(r|=0),ar[e+56>>2]=o,o=0|FA(r),ar[e+60>>2]=o,t=0|ar[(o=e+8|0)>>2],!(0<(o=0|ar[o+4>>2])>>>0|0==(0|o)&((a=0|ar[e+16>>2])+8|0)>>>0<t>>>0)){for(t=0|hu(48),ar[c>>2]=t,ar[c+8>>2]=-2147483600,a=19167,e=(o=t)+(ar[c+4>>2]=38)|0;tr[o>>0]=0|tr[a>>0],a=a+1|0,(0|(o=o+1|0))<(0|e););return(tr[t+38>>0]=0,oo(A,2,101,c),0<=(0|tr[c+11>>0]))?void(ur=n):(vu(0|ar[c>>2]),void(ur=n))}l=0|sb(0|(l=0|ob(0|(l=0|tb(0|t,0|o,-8,-1)),0|D,0|a,0)),0|D,2),i=D,f=r+24|0;A:do{if(!(0==(0|l)&0==(0|i))){u=e+68|0,b=e+72|0,t=e+64|0,c=e=0;do{if(0|tr[f>>0])break A;o=0|FA(r),ar[s>>2]=o,(a=0|ar[u>>2])>>>0<(0|ar[b>>2])>>>0?(ar[a>>2]=o,ar[u>>2]=a+4):Ce(t,s),e=0|tb(0|e,0|c,1,0),c=D}while(c>>>0<i>>>0|(0|c)==(0|i)&e>>>0<l>>>0)}}while(0);0|tr[f>>0]?(ar[s>>2]=0,ar[s+4>>2]=0,ar[s+8>>2]=0,oo(A,2,100,s),(0|tr[s+11>>0])<0&&vu(0|ar[s>>2])):(r=0|ar[(b=56592)+4>>2],ar[(s=A)>>2]=ar[b>>2],ar[s+4>>2]=r,yu(A+8|0,56600)),ur=n},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a,c=0,l=0,u=0;if(ur=(a=ur)+160|0,f=a+136|0,t=(n=a)+56|0,o=n+4|0,ar[n>>2]=292,ar[t>>2]=312,Jf(n+56|0,o),ar[n+128>>2]=0,ar[n+132>>2]=-1,ar[n>>2]=4304,ar[t>>2]=4324,Sf(o),ar[o>>2]=4340,ar[(i=n+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[n+52>>2]=16,ar[f>>2]=0,ar[4+f>>2]=0,ar[8+f>>2]=0,Xe(o,f),(0|tr[11+f>>0])<0&&vu(0|ar[f>>2]),LA(f,e,r),We(n,(u=(l=0|tr[(c=11+f|0)>>0])<<24>>24<0)?0|ar[f>>2]:f,u?0|ar[4+f>>2]:255&l),(0|tr[c>>0])<0&&vu(0|ar[f>>2]),ne(f,e,r),We(n,(c=(l=0|tr[(u=11+f|0)>>0])<<24>>24<0)?0|ar[f>>2]:f,c?0|ar[4+f>>2]:255&l),(0|tr[u>>0])<0&&vu(0|ar[f>>2]),Ie(A,o),ar[n>>2]=4304,ar[t>>2]=4324,ar[o>>2]=4340,0<=(0|tr[11+i>>0]))return kf(o),Gf(),bf(t),void(ur=a);vu(0|ar[i>>2]),kf(o),Gf(),bf(t),ur=a},function(A,e,r){A|=0;var i,f=0;ur=(i=ur)+32|0,qA(f=i,e|=0,r|=0),(0|tr[(f=f+8|0)+11>>0])<0&&vu(0|ar[f>>2]),$A(A,e,r,-1),ur=i},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a,c,l=0,u=0,b=0;if(ur=(a=ur)+160|0,f=a+136|0,t=(n=a)+56|0,o=n+4|0,ar[n>>2]=292,ar[t>>2]=312,Jf(n+56|0,o),ar[n+128>>2]=0,ar[n+132>>2]=-1,ar[n>>2]=4304,ar[t>>2]=4324,Sf(o),ar[o>>2]=4340,ar[(i=n+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[n+52>>2]=16,ar[f>>2]=0,ar[4+f>>2]=0,ar[8+f>>2]=0,Xe(o,f),(0|tr[11+f>>0])<0&&vu(0|ar[f>>2]),LA(f,e,r),We(n,(l=(u=0|tr[(b=11+f|0)>>0])<<24>>24<0)?0|ar[f>>2]:f,l?0|ar[4+f>>2]:255&u),(0|tr[b>>0])<0&&vu(0|ar[f>>2]),0<(0|ar[r>>2]))for(l=0;We(n,18862,2),(0|(l=l+1|0))<(0|ar[r>>2]););if(u=0|We(n,23170,13),u=0|We(0|Lf(u,0|ar[e+56>>2]),30086,1),0<(0|ar[r>>2]))for(l=0;We(u,18862,2),(0|(l=l+1|0))<(0|ar[r>>2]););if(b=0|We(u,23184,14),l=0|ar[e+60>>2],ar[f>>2]=0,ar[4+f>>2]=0,ar[8+f>>2]=0,tr[(u=11+f|0)>>0]=4,tr[4+f>>0]=0,tr[f>>0]=l>>>24,tr[1+f>>0]=l>>>16,tr[2+f>>0]=l>>>8,tr[3+f>>0]=l,b=0|We(0|We(b,f,4),30086,1),0<(0|ar[r>>2]))for(l=0;We(b,18862,2),(0|(l=l+1|0))<(0|ar[r>>2]););if(c=0|We(b,23199,6),We(0|We(c,(b=(r=0|tr[(l=e+76|0)+11>>0])<<24>>24<0)?0|ar[l>>2]:l,b?0|ar[e+80>>2]:255&r),30086,1),(0|tr[u>>0])<0&&vu(0|ar[f>>2]),Ie(A,o),ar[n>>2]=4304,ar[t>>2]=4324,ar[o>>2]=4340,0<=(0|tr[11+i>>0]))return kf(o),bf(t),void(ur=a);vu(0|ar[i>>2]),kf(o),bf(t),ur=a},function(A,e,r){A|=0,e|=0;var i,f=0,n=0;ur=(i=ur)+32|0,f=i,n=0|ar[(r|=0)+12>>2],jA(r,0|tr[e+36>>0]?12:8),UA(r,0|ar[e+56>>2]),UA(r,0|ar[e+60>>2]),UA(r,0|ar[e+64>>2]),UA(r,0|ar[e+68>>2]),UA(r,0|ar[e+72>>2]),OA(r,e+76|0),KA(f,e,r,n),(0|tr[(e=f+8|0)+11>>0])<0&&vu(0|ar[e>>2]),f=0|ar[(r=56592)+4>>2],ar[(n=A)>>2]=ar[r>>2],ar[n+4>>2]=f,yu(A+8|0,56600),ur=i},function(A,e,r){A|=0;var i,f,n=0,t=0;if(ur=(f=ur)+32|0,t=f+20|0,qA(n=f,e|=0,r|=0),(0|tr[(n=n+8|0)+11>>0])<0&&vu(0|ar[n>>2]),n=0|FA(r),ar[e+56>>2]=n,n=0|FA(r),ar[e+60>>2]=n,n=0|FA(r),ar[e+64>>2]=n,n=0|FA(r),ar[e+68>>2]=n,n=0|FA(r),ar[e+72>>2]=n,RA(t,r),(0|tr[(i=(n=e+76|0)+11|0)>>0])<0?(tr[ar[n>>2]>>0]=0,ar[e+80>>2]=0):(tr[n>>0]=0,tr[i>>0]=0),Cu(n,0),ar[n>>2]=ar[t>>2],ar[n+4>>2]=ar[t+4>>2],ar[n+8>>2]=ar[t+8>>2],!(0|tr[r+24>>0]))return r=0|ar[(e=56592)+4>>2],ar[(t=A)>>2]=ar[e>>2],ar[t+4>>2]=r,yu(A+8|0,56600),void(ur=f);ar[t>>2]=0,ar[t+4>>2]=0,ar[t+8>>2]=0,oo(A,2,100,t),ur=(0<=(0|tr[t+11>>0])||vu(0|ar[t>>2]),f)},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a,c,l=0,u=0;if(ur=(o=ur)+160|0,l=o+136|0,n=(f=o)+56|0,t=f+4|0,ar[f>>2]=292,ar[n>>2]=312,Jf(f+56|0,t),ar[f+128>>2]=0,ar[f+132>>2]=-1,ar[f>>2]=4304,ar[n>>2]=4324,Sf(t),ar[t>>2]=4340,ar[(i=f+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[f+52>>2]=16,ar[l>>2]=0,ar[l+4>>2]=0,ar[l+8>>2]=0,Xe(t,l),(0|tr[l+11>>0])<0&&vu(0|ar[l>>2]),LA(l,e,r),We(f,(u=(c=0|tr[(a=l+11|0)>>0])<<24>>24<0)?0|ar[l>>2]:l,u?0|ar[l+4>>2]:255&c),(0|tr[a>>0])<0&&vu(0|ar[l>>2]),0<(0|ar[r>>2]))for(l=0;We(f,18862,2),(0|(l=l+1|0))<(0|ar[r>>2]););if(u=0|We(f,22462,9),We(0|Lf(u,0|ar[e+56>>2]),30086,1),Ie(A,t),ar[f>>2]=4304,ar[n>>2]=4324,ar[t>>2]=4340,0<=(0|tr[11+i>>0]))return kf(t),bf(n),void(ur=o);vu(0|ar[i>>2]),kf(t),bf(n),ur=o},function(A,e,r){A|=0,e|=0;var i,f,n=0,t=0;ur=(f=ur)+32|0,n=f,t=0|ar[(r|=0)+12>>2],jA(r,0|tr[e+36>>0]?12:8),i=0|ar[e+56>>2];do{if(0|tr[e+37>>0])UA(r,i);else{if(i>>>0<65536){MA(r,65535&i);break}sr(23065,19104,891,19563)}}while(0);KA(n,e,r,t),(0|tr[(e=n+8|0)+11>>0])<0&&vu(0|ar[e>>2]),n=0|ar[(r=56592)+4>>2],ar[(t=A)>>2]=ar[r>>2],ar[t+4>>2]=n,yu(A+8|0,56600),ur=f},function(A,e,r){A|=0;var i,f=0,n=0;if(ur=(i=ur)+32|0,n=i+20|0,qA(f=i,e|=0,r|=0),(0|tr[(f=f+8|0)+11>>0])<0&&vu(0|ar[f>>2]),f=0|tr[e+37>>0]?0|FA(r):65535&(0|VA(r)),ar[e+56>>2]=f,!(0|tr[r+24>>0]))return r=0|ar[(e=56592)+4>>2],ar[(n=A)>>2]=ar[e>>2],ar[n+4>>2]=r,yu(A+8|0,56600),void(ur=i);ar[n>>2]=0,ar[n+4>>2]=0,ar[n+8>>2]=0,oo(A,2,100,n),ur=(0<=(0|tr[n+11>>0])||vu(0|ar[n>>2]),i)},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a=0,c=0,l=0,u=0,b=0;if(ur=(o=ur)+160|0,a=o+136|0,n=(f=o)+56|0,t=f+4|0,ar[f>>2]=292,ar[n>>2]=312,Jf(f+56|0,t),ar[f+128>>2]=0,ar[f+132>>2]=-1,ar[f>>2]=4304,ar[n>>2]=4324,Sf(t),ar[t>>2]=4340,ar[(i=f+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[f+52>>2]=16,ar[a>>2]=0,ar[a+4>>2]=0,ar[a+8>>2]=0,Xe(t,a),(0|tr[a+11>>0])<0&&vu(0|ar[a>>2]),LA(a,e,r),We(f,(u=(c=0|tr[(l=a+11|0)>>0])<<24>>24<0)?0|ar[a>>2]:a,u?0|ar[a+4>>2]:255&c),(0|tr[l>>0])<0&&vu(0|ar[a>>2]),(0|(a=0|ar[e+56>>2]))!=(0|(l=0|ar[e+60>>2]))){c=a;do{if(0<(0|ar[r>>2]))for(a=0;We(f,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(e=0|We(f,22885,9),e=0|We(0|Lf(e,0|ar[c>>2]),30086,1),0<(0|ar[r>>2]))for(a=0;We(e,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(e=0|We(e,22895,23),e=0|We(0|Pf(e,0|cr[c+4>>0]),30086,1),0<(0|ar[r>>2]))for(a=0;We(e,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(u=(e=0|We(e,22919,24))+(0|ar[(0|ar[e>>2])-12>>2])+4|0,ar[u>>2]=-75&ar[u>>2]|8,u=(e=0|xf(e,0|or[c+6>>1]))+(0|ar[(0|ar[e>>2])-12>>2])+4|0,ar[u>>2]=-75&ar[u>>2]|2,e=0|We(e,30086,1),0<(0|ar[r>>2]))for(a=0;We(e,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(e=0|We(e,22944,15),We(0|Kf(e,0|ar[(u=c+8|0)>>2],0|ar[u+4>>2]),30086,1),0<(0|ar[r>>2]))for(a=0;We(f,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(We(f,22960,11),(0|(a=0|ar[c+16>>2]))!=(0|(e=0|ar[c+20>>2])))for(;b=0|We(0|Kf(f,0|ar[(b=a+8|0)>>2],0|ar[b+4>>2]),19588,1),Kf(b,0|ar[(u=a+16|0)>>2],0|ar[u+4>>2]),0==(0|ar[(u=a)>>2])&0==(0|ar[u+4>>2])||Kf(u=0|We(f,22972,7),0|ar[(b=a)>>2],0|ar[b+4>>2]),We(f,20449,1),(0|(a=a+40|0))!=(0|e););We(f,30086,1),c=c+32|0}while((0|c)!=(0|l))}if(Ie(A,t),ar[f>>2]=4304,ar[n>>2]=4324,ar[t>>2]=4340,0<=(0|tr[11+i>>0]))return kf(t),bf(n),void(ur=o);vu(0|ar[i>>2]),kf(t),bf(n),ur=o},function(A,e,r){A|=0,r|=0;var i,f,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0;if(ur=(f=ur)+32|0,p=f,(0|(o=0|ar[(k=(e|=0)+56|0)>>2]))!=(0|(u=0|ar[(h=e+60|0)>>2]))){n=0;do{if(1==(0|tr[o+4>>0])&&(0|(c=0|ar[o+16>>2]))!=(0|(l=0|ar[o+20>>2])))for(a=c;n=(0|ar[a+28>>2])+n-(0|ar[a+24>>2])|0,(0|(a=a+40|0))!=(0|l););o=o+32|0}while((0|o)!=(0|u));if(0|n&&(UA(r,n+8|0),UA(r,1768186228),(0|(t=0|ar[k>>2]))!=(0|(b=0|ar[h>>2]))))do{if(1==(0|tr[t+4>>0])&&(0|(s=0|ar[t+16>>2]))!=(0|(d=0|ar[t+20>>2])))for(n=s;zA(r,n+24|0),(0|(n=n+40|0))!=(0|d););t=t+32|0}while((0|t)!=(0|b))}if(Z=0|ar[(a=r+12|0)>>2],jA(r,0|tr[e+36>>0]?12:8),ar[e+68>>2]=ar[a>>2],n=(t=(255&(a=0|tr[e+37>>0]))<2)?4:6,(0|(o=0|ar[k>>2]))!=(0|(i=0|ar[h>>2]))){w=e+73|0,v=e+74|0,m=e+76|0,g=(d=t?2:4)+(k=a<<24>>24?2:0)+(h=0|cr[e+75>>0])+4|0,t=a;do{l=n+4+h+d+k|0,c=a=0|ar[o+16>>2],s=0|ar[o+20>>2];do{if((0|a)==(0|s))n=l;else{if(u=0|cr[w>>0],b=0|cr[v>>0],!(t<<24>>24)){n=g+n+(0|br(((s+-40-c|0)>>>0)/40|0,u+b|0))+u+b|0,t=0;break}for(c=0|cr[m>>0],n=l;n=u+(c+n)+b|0,(0|(a=a+40|0))!=(0|s););}}while(0);o=o+32|0}while((0|o)!=(0|i))}if(jA(r,n),KA(p,e,r,Z),0<=(0|tr[(n=p+8|0)+11>>0]))return Z=0|ar[(Z=r=56592)>>2],r=0|ar[(r=r+4|0)>>2],ar[(e=p=A)>>2]=Z,ar[(p=p+4|0)>>2]=r,yu(A=A+8|0,56600),void(ur=f);vu(0|ar[n>>2]),Z=0|ar[(Z=r=56592)>>2],r=0|ar[(r=r+4|0)>>2],ar[(e=p=A)>>2]=Z,ar[(p=p+4|0)>>2]=r,yu(A=A+8|0,56600),ur=f},function(A,e,r){A|=0;var i,f,n,t,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0,R=0,N=0,_=0,Y=0,Q=0,D=0,J=0,M=0,T=0,U=0,S=0,O=0,z=0,j=0,H=0,x=0,P=0,L=0,K=0,q=0,$=0;if(ur=(t=ur)+384|0,q=t+144|0,l=($=t)+340|0,f=t+184|0,n=t+328|0,qA(o=t+352|0,e|=0,r|=0),(0|tr[(o=o+8|0)+11>>0])<0&&vu(0|ar[o>>2]),a=0|VA(r),o=1<(255&(K=0|tr[(i=e+37|0)>>0]))?15&a:0,2e4<(0|(K=(255&K)<2?65535&(0|VA(r)):0|FA(r))))return e=$+64|0,ar[(c=$+8|0)>>2]=4524,a=$+12|0,ar[$>>2]=188,ar[e>>2]=208,Jf($+64|(ar[$+4>>2]=0),a),ar[$+136>>2]=0,ar[$+140>>2]=-1,ar[$>>2]=4504,ar[e>>2]=4544,ar[c>>2]=4524,Sf(a),ar[a>>2]=4340,ar[(c=$+44|0)>>2]=0,ar[c+4>>2]=0,ar[c+8>>2]=0,ar[c+12>>2]=0,ar[$+60>>2]=24,ar[q>>2]=0,ar[q+4>>2]=0,ar[q+8>>2]=0,Xe(a,q),(0|tr[q+11>>0])<0&&vu(0|ar[q>>2]),We(0|Pf(0|We(0|Pf(0|We(o=$+8|0,22754,18),K),22773,44),2e4),22818,7),Ie(l,a),oo(A,6,1e3,l),(0|tr[l+11>>0])<0&&vu(0|ar[l>>2]),ar[$>>2]=4504,ar[e>>2]=4544,ar[o>>2]=4524,ar[a>>2]=4340,(0|tr[c+11>>0])<0&&vu(0|ar[c>>2]),kf(a),bf(e),void(ur=t);A:do{if(0<(0|K)){W=$+4|0,I=$+6|0,C=$+8|0,x=(65535&a)>>>4&255,F=12+f|0,R=4+f|0,N=G=64+f|0,_=136+f|0,Y=140+f|0,D=60+f|0,J=q+11|0,M=V=8+f|0,T=11+n|0,U=(Q=44+f|0)+11|0,O=$+20|0,z=r+24|0,j=e+60|0,H=e+64|0,B=e+56|0,E=S=$+16|0,X=0!=(0|o),y=255&o,g=q+8|0,p=(65535&a)>>>12&255,Z=q+16|0,m=(65535&a)>>>8&255,k=$+24|0,w=q+28|0,v=h=q+24|0,d=0;e:for(;;){for(ar[$>>2]=0,e=(o=I)+22|(tr[W>>0]=0);(0|(o=o+2|(or[o>>1]=0)))<(0|e););switch(o=(0|cr[i>>0])<2?65535&(0|VA(r)):0|FA(r),ar[$>>2]=o,0|tr[i>>0]&&(s=15&(0|VA(r)),tr[W>>0]=s),s=0|VA(r),or[I>>1]=s,ar[(s=C)>>2]=0,ar[s+4>>2]=0,15&x){case 4:o=0|FA(r),e=0,L=26;break;case 8:o=0|FA(r),ar[(e=C)>>2]=0,ar[e+4>>2]=o,e=C,o=0|FA(r)|ar[e>>2],e=0|ar[e+4>>2],L=26}26==(0|L)&&(L=0,ar[(s=C)>>2]=o,ar[s+4>>2]=e),s=65535&(o=0|VA(r));do{if((65535&o)<=32){r:do{if(o<<16>>16)for(b=0;;){for(e=(o=q)+36|0;(0|(o=o+4|(ar[o>>2]=0)))<(0|e););i:do{if(X&1<(0|cr[i>>0]))switch(15&y){case 4:l=0|FA(r),ar[(u=q)>>2]=l,ar[u+4>>2]=0;break i;case 8:a=0|FA(r),ar[(c=q)>>2]=0,ar[c+4>>2]=a,c=0|FA(r),l=0|ar[(a=q)+4>>2],ar[(u=q)>>2]=ar[a>>2]|c,ar[u+4>>2]=l;break i;default:break i}}while(0);switch(ar[(u=g)>>2]=0,ar[u+4>>2]=0,15&p){case 4:o=0|FA(r),e=0,L=44;break;case 8:o=0|FA(r),ar[(e=g)>>2]=0,ar[e+4>>2]=o,e=g,o=0|FA(r)|ar[e>>2],e=0|ar[e+4>>2],L=44}switch(44==(0|L)&&(L=0,ar[(u=g)>>2]=o,ar[u+4>>2]=e),ar[(u=Z)>>2]=0,ar[u+4>>2]=0,15&m){case 4:o=0|FA(r),e=0,L=48;break;case 8:o=0|FA(r),ar[(e=Z)>>2]=0,ar[e+4>>2]=o,e=Z,o=0|FA(r)|ar[e>>2],e=0|ar[e+4>>2],L=48}if(48==(0|L)&&(L=0,ar[(u=Z)>>2]=o,ar[u+4>>2]=e),(0|(e=0|ar[O>>2]))==(0|ar[k>>2]))Qt(E,q),o=0|ar[h>>2];else{if(ar[e>>2]=ar[q>>2],ar[e+4>>2]=ar[q+4>>2],ar[e+8>>2]=ar[q+8>>2],ar[e+12>>2]=ar[q+12>>2],ar[e+16>>2]=ar[q+16>>2],ar[e+20>>2]=ar[q+20>>2],ar[(a=e+24|0)>>2]=0,ar[(u=e+28|0)>>2]=0,o=(ar[e+32>>2]=0)|ar[v>>2],c=(0|ar[w>>2])-o|0){if((0|c)<0){L=52;break e}l=0|hu(c),ar[u>>2]=l,ar[a>>2]=l,ar[e+32>>2]=l+c,o=0|ar[v>>2],0<(0|(e=(0|ar[w>>2])-o|0))&&(hb(0|l,0|o,0|e),ar[u>>2]=l+e)}ar[O>>2]=40+(0|ar[O>>2])}if(0|o&&((0|ar[w>>2])!=(0|o)&&(ar[w>>2]=o),vu(o)),(0|s)<=(0|(b=b+1|0)))break r}}while(0);if(!(0|tr[z>>0])){if((0|(o=0|ar[j>>2]))==(0|ar[H>>2])){Jt(B,$),l=0;break}ar[o>>2]=ar[$>>2],ar[o+4>>2]=ar[$+4>>2],ar[o+8>>2]=ar[$+8>>2],ar[o+12>>2]=ar[$+12>>2],Dt(o+16|0,E),ar[j>>2]=32+(0|ar[j>>2]),l=0;break}l=0}else ar[V>>2]=4524,ar[f>>2]=188,ar[G>>2]=208,ar[R>>2]=0,Jf(N,F),ar[_>>2]=0,ar[Y>>2]=-1,ar[f>>2]=4504,ar[G>>2]=4544,ar[V>>2]=4524,Sf(F),ar[F>>2]=4340,ar[Q>>2]=0,ar[Q+4>>2]=0,ar[Q+8>>2]=0,ar[Q+12>>2]=0,ar[D>>2]=24,ar[q>>2]=0,ar[q+4>>2]=0,ar[q+8>>2]=0,Xe(F,q),(0|tr[J>>0])<0&&vu(0|ar[q>>2]),We(0|Pf(0|We(0|Pf(0|We(M,22826,31),s),22858,26),32),18904,2),Ie(n,F),oo(A,6,1e3,n),(0|tr[T>>0])<0&&vu(0|ar[n>>2]),ar[f>>2]=4504,ar[G>>2]=4544,ar[M>>2]=4524,ar[F>>2]=4340,(0|tr[U>>0])<0&&vu(0|ar[Q>>2]),kf(F),bf(G),l=1}while(0);if(0|(o=0|ar[S>>2])){if((0|(e=0|ar[O>>2]))!=(0|o)){for(;a=e+-40|0,ar[O>>2]=a,(0|(e=(c=0|ar[e+-16>>2])?((0|ar[(e=e+-12|0)>>2])!=(0|c)&&(ar[e>>2]=c),vu(c),0|ar[O>>2]):a))!=(0|o););o=0|ar[S>>2]}vu(o)}if(d=d+1|0,0|l){L=80;break}if((0|K)<=(0|d)){P=z;break A}}if(52==(0|L))zl();else if(80==(0|L))return void(ur=t)}else P=r+24|0}while(0);0|tr[P>>0]?(ar[q>>2]=0,ar[q+4>>2]=0,ar[q+8>>2]=0,oo(A,2,100,q),(0|tr[q+11>>0])<0&&vu(0|ar[q>>2])):(q=0|ar[(K=56592)+4>>2],ar[($=A)>>2]=ar[K>>2],ar[$+4>>2]=q,yu(A+8|0,56600)),ur=t},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a,c=0,l=0,u=0;if(ur=(a=ur)+160|0,f=a+136|0,t=(n=a)+56|0,o=n+4|0,ar[n>>2]=292,ar[t>>2]=312,Jf(n+56|0,o),ar[n+128>>2]=0,ar[n+132>>2]=-1,ar[n>>2]=4304,ar[t>>2]=4324,Sf(o),ar[o>>2]=4340,ar[(i=n+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[n+52>>2]=16,ar[f>>2]=0,ar[4+f>>2]=0,ar[8+f>>2]=0,Xe(o,f),(0|tr[11+f>>0])<0&&vu(0|ar[f>>2]),LA(f,e,r),We(n,(u=(l=0|tr[(c=11+f|0)>>0])<<24>>24<0)?0|ar[f>>2]:f,u?0|ar[4+f>>2]:255&l),(0|tr[c>>0])<0&&vu(0|ar[f>>2]),ne(f,e,r),We(n,(c=(l=0|tr[(u=11+f|0)>>0])<<24>>24<0)?0|ar[f>>2]:f,c?0|ar[4+f>>2]:255&l),(0|tr[u>>0])<0&&vu(0|ar[f>>2]),Ie(A,o),ar[n>>2]=4304,ar[t>>2]=4324,ar[o>>2]=4340,0<=(0|tr[11+i>>0]))return kf(o),bf(t),void(ur=a);vu(0|ar[i>>2]),kf(o),bf(t),ur=a},function(A,e,r){A|=0,e|=0;var i,f,n,t=0,o=0,a=0,c=0,l=0,u=0;ur=(n=ur)+32|0,i=n,f=0|ar[(r|=0)+12>>2],jA(r,0|tr[e+36>>0]?12:8),a=e+48|0,SA(r,0|tr[e+37>>0]?4:2,(0|ar[a>>2])-(0|ar[e+44>>2])>>3,0),o=0|ar[e+44>>2],a=0|ar[a>>2];A:do{if((0|o)==(0|a))t=A+8|0,l=8;else for(c=(t=A+8|0)+11|0;;){if(u=0|ar[o>>2],ns[127&ar[12+(0|ar[u>>2])>>2]](A,u,r),0|ar[A>>2])break A;if((0|tr[c>>0])<0&&vu(0|ar[t>>2]),(0|(o=o+8|0))==(0|a)){l=8;break}}}while(0);8==(0|l)&&(l=0|ar[(c=56592)+4>>2],ar[(u=A)>>2]=ar[c>>2],ar[u+4>>2]=l,yu(t,56600)),KA(i,e,r,f),ur=(0<=(0|tr[(t=i+8|0)+11>>0])||vu(0|ar[t>>2]),n)},function(A,e,r){A|=0;var i,f=0;return ur=(i=ur)+32|0,qA(f=i,e|=0,r|=0),(0|tr[(f=f+8|0)+11>>0])<0&&vu(0|ar[f>>2]),(f=0|tr[e+37>>0]?0|FA(r):65535&(0|VA(r)))?$A(A,e,r,-1):(e=0|ar[(f=56592)+4>>2],ar[(r=A)>>2]=ar[f>>2],ar[r+4>>2]=e,yu(A+8|0,56600)),void(ur=i)},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a=0,c=0,l=0,u=0;if(ur=(o=ur)+160|0,a=o+136|0,n=(f=o)+56|0,t=f+4|0,ar[f>>2]=292,ar[n>>2]=312,Jf(f+56|0,t),ar[f+128>>2]=0,ar[f+132>>2]=-1,ar[f>>2]=4304,ar[n>>2]=4324,Sf(t),ar[t>>2]=4340,ar[(i=f+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[f+52>>2]=16,ar[a>>2]=0,ar[a+4>>2]=0,ar[a+8>>2]=0,Xe(t,a),(0|tr[a+11>>0])<0&&vu(0|ar[a>>2]),LA(a,e,r),We(f,(u=(l=0|tr[(c=a+11|0)>>0])<<24>>24<0)?0|ar[a>>2]:a,u?0|ar[a+4>>2]:255&l),(0|tr[c>>0])<0&&vu(0|ar[a>>2]),0<(0|ar[r>>2]))for(a=0;We(f,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(f,22462,9),c=0|We(0|Lf(c,0|ar[e+56>>2]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(c,22472,23),c=0|We(0|xf(c,0|or[e+60>>1]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(a=0|We(c,22496,11),c=0|We(0|We(a,(u=(c=0|tr[(l=e+64|0)+11>>0])<<24>>24<0)?0|ar[l>>2]:l,u?0|ar[e+68>>2]:255&c),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(a=0|We(c,22508,11),c=0|We(0|We(a,(u=(c=0|tr[(l=e+76|0)+11>>0])<<24>>24<0)?0|ar[l>>2]:l,u?0|ar[e+80>>2]:255&c),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(a=0|We(c,22520,14),c=0|We(0|We(a,(u=(c=0|tr[(l=e+88|0)+11>>0])<<24>>24<0)?0|ar[l>>2]:l,u?0|ar[e+92>>2]:255&c),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(a=0|We(c,22535,18),c=0|We(0|We(a,(u=(c=0|tr[(l=e+100|0)+11>>0])<<24>>24<0)?0|ar[l>>2]:l,u?0|ar[e+104>>2]:255&c),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(a=0|We(c,22554,15),c=0|We(0|We(a,(u=(c=0|tr[(l=e+112|0)+11>>0])<<24>>24<0)?0|ar[l>>2]:l,u?0|ar[e+116>>2]:255&c),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(l=(u=0|We(c,22570,13))+(0|ar[(0|ar[u>>2])-12>>2])+4|0,ar[l>>2]=1|ar[l>>2],We(0|Hf(u,0!=(0|tr[e+124>>0])),30086,1),Ie(A,t),ar[f>>2]=4304,ar[n>>2]=4324,ar[t>>2]=4340,0<=(0|tr[11+i>>0]))return kf(t),bf(n),void(ur=o);vu(0|ar[i>>2]),kf(t),bf(n),ur=o},function(A,e,r){A|=0,e|=0;var i,f=0,n=0,t=0,o=0,a=0,c=0,l=0;ur=(i=ur)+32|0,c=i,l=0|ar[(r|=0)+12>>2],jA(r,0|tr[e+36>>0]?12:8),(255&(f=0|tr[(n=e+37|0)>>0]))<2?(MA(r,65535&ar[e+56>>2]),MA(r,0|or[e+60>>1]),OA(r,e+76|0),OA(r,e+88|0),OA(r,e+100|0),1<(255&(f=0|tr[n>>0]))&&(t=3)):t=3;A:do{if(3==(0|t)){switch(f<<24>>24){case 2:MA(r,65535&ar[e+56>>2]);break;case 3:UA(r,0|ar[e+56>>2])}MA(r,0|or[e+60>>1]),(n=(f=0|tr[(o=(a=e+64|0)+11|0)>>0])<<24>>24<0)?f=0|ar[e+68>>2]:f&=255,f?(f=n?0|ar[a>>2]:a,UA(r,tr[f+1>>0]<<16|cr[f>>0]<<24|tr[f+2>>0]<<8|tr[f+3>>0])):UA(r,0),OA(r,e+76|0),n=0|tr[o>>0],f=0|ar[(t=e+68|0)>>2];do{if(4==(0|(n<<24>>24<0?f:255&n))){if(0|Yu(a,0,-1,22452,4)){n=0|tr[o>>0],f=0|ar[t>>2];break}OA(r,e+88|0),OA(r,e+100|0);break A}}while(0);4==(0|(n<<24>>24<0?f:255&n))&&0==(0|Yu(a,0,-1,22457,4))&&OA(r,e+112|0)}}while(0);if(KA(c,e,r,l),0<=(0|tr[(f=c+8|0)+11>>0]))return e=0|ar[(e=c=56592)>>2],c=0|ar[(c=c+4|0)>>2],ar[(r=l=A)>>2]=e,ar[(l=l+4|0)>>2]=c,yu(A=A+8|0,56600),void(ur=i);vu(0|ar[f>>2]),e=0|ar[(e=c=56592)>>2],c=0|ar[(c=c+4|0)>>2],ar[(r=l=A)>>2]=e,ar[(l=l+4|0)>>2]=c,yu(A=A+8|0,56600),ur=i},function(A,e,r){A|=0;var i,f=0,n=0,t=0,o=0,a=0;ur=(i=ur)+32|0,a=i+20|0,qA(f=i,e|=0,r|=0),(0|tr[(f=f+8|0)+11>>0])<0&&vu(0|ar[f>>2]),(255&(f=0|tr[(t=e+37|0)>>0]))<2?(f=65535&(0|VA(r)),ar[e+56>>2]=f,f=0|VA(r),or[e+60>>1]=f,RA(a,r),(0|tr[(n=(f=e+76|0)+11|0)>>0])<0?(tr[ar[f>>2]>>0]=0,ar[e+80>>2]=0):(tr[f>>0]=0,tr[n>>0]=0),Cu(f,0),ar[f>>2]=ar[a>>2],ar[f+4>>2]=ar[a+4>>2],ar[f+8>>2]=ar[a+8>>2],RA(a,r),(0|tr[(n=(f=e+88|0)+11|0)>>0])<0?(tr[ar[f>>2]>>0]=0,ar[e+92>>2]=0):(tr[f>>0]=0,tr[n>>0]=0),Cu(f,0),ar[f>>2]=ar[a>>2],ar[f+4>>2]=ar[a+4>>2],ar[f+8>>2]=ar[a+8>>2],RA(a,r),(0|tr[(n=(f=e+100|0)+11|0)>>0])<0?(tr[ar[f>>2]>>0]=0,ar[e+104>>2]=0):(tr[f>>0]=0,tr[n>>0]=0),Cu(f,0),ar[f>>2]=ar[a>>2],ar[f+4>>2]=ar[a+4>>2],ar[f+8>>2]=ar[a+8>>2],1<(255&(f=0|tr[t>>0]))&&(o=14)):o=14;A:do{if(14==(0|o)){if(tr[e+124>>0]=1&ar[e+40>>2],f=f<<24>>24==2?65535&(0|VA(r)):0|FA(r),ar[e+56>>2]=f,o=0|VA(r),or[e+60>>1]=o,0|(o=0|FA(r))&&(tr[a>>0]=0,tr[a+1>>0]=0,tr[a+2>>0]=0,tr[a+3>>0]=0,tr[a+4>>0]=0,f=(tr[a+5>>0]=0)|kb(0|o),(0|tr[(t=(n=e+64|0)+11|0)>>0])<0?(tr[ar[n>>2]>>0]=0,ar[e+68>>2]=0):(tr[n>>0]=0,tr[t>>0]=0),Cu(n,0),ar[e+64>>2]=f,tr[e+68>>0]=0,tr[(t=e+69|0)>>0]=0|tr[a>>0],tr[t+1>>0]=0|tr[a+1>>0],tr[t+2>>0]=0|tr[a+2>>0],tr[t+3>>0]=0|tr[a+3>>0],tr[t+4>>0]=0|tr[a+4>>0],tr[t+5>>0]=0|tr[a+5>>0],tr[e+75>>0]=4),RA(a,r),(0|tr[(n=(f=e+76|0)+11|0)>>0])<0?(tr[ar[f>>2]>>0]=0,ar[e+80>>2]=0):(tr[f>>0]=0,tr[n>>0]=0),Cu(f,0),ar[f>>2]=ar[a>>2],ar[f+4>>2]=ar[a+4>>2],ar[f+8>>2]=ar[a+8>>2],1970432288<=(0|o)){switch(0|o){case 1970432288:break;default:break A}RA(a,r),(0|tr[(n=(f=e+112|0)+11|0)>>0])<0?(tr[ar[f>>2]>>0]=0,ar[e+116>>2]=0):(tr[f>>0]=0,tr[n>>0]=0),Cu(f,0),ar[f>>2]=ar[a>>2],ar[f+4>>2]=ar[a+4>>2],ar[f+8>>2]=ar[a+8>>2];break}switch(0|o){case 1835625829:break;default:break A}RA(a,r),(0|tr[(n=(f=e+88|0)+11|0)>>0])<0?(tr[ar[f>>2]>>0]=0,ar[e+92>>2]=0):(tr[f>>0]=0,tr[n>>0]=0),Cu(f,0),ar[f>>2]=ar[a>>2],ar[f+4>>2]=ar[a+4>>2],ar[f+8>>2]=ar[a+8>>2],RA(a,r),(0|tr[(n=(f=e+100|0)+11|0)>>0])<0?(tr[ar[f>>2]>>0]=0,ar[e+104>>2]=0):(tr[f>>0]=0,tr[n>>0]=0),Cu(f,0),ar[f>>2]=ar[a>>2],ar[f+4>>2]=ar[a+4>>2],ar[f+8>>2]=ar[a+8>>2]}}while(0);if(!(0|tr[r+24>>0]))return r=0|ar[(e=56592)+4>>2],ar[(a=A)>>2]=ar[e>>2],ar[a+4>>2]=r,yu(A+8|0,56600),void(ur=i);ar[a>>2]=0,ar[a+4>>2]=0,ar[a+8>>2]=0,oo(A,2,100,a),ur=(0<=(0|tr[a+11>>0])||vu(0|ar[a>>2]),i)},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a,c=0,l=0,u=0;if(ur=(a=ur)+160|0,f=a+136|0,t=(n=a)+56|0,o=n+4|0,ar[n>>2]=292,ar[t>>2]=312,Jf(n+56|0,o),ar[n+128>>2]=0,ar[n+132>>2]=-1,ar[n>>2]=4304,ar[t>>2]=4324,Sf(o),ar[o>>2]=4340,ar[(i=n+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[n+52>>2]=16,ar[f>>2]=0,ar[4+f>>2]=0,ar[8+f>>2]=0,Xe(o,f),(0|tr[11+f>>0])<0&&vu(0|ar[f>>2]),LA(f,e,r),We(n,(u=(l=0|tr[(c=11+f|0)>>0])<<24>>24<0)?0|ar[f>>2]:f,u?0|ar[4+f>>2]:255&l),(0|tr[c>>0])<0&&vu(0|ar[f>>2]),ne(f,e,r),We(n,(c=(l=0|tr[(u=11+f|0)>>0])<<24>>24<0)?0|ar[f>>2]:f,c?0|ar[4+f>>2]:255&l),(0|tr[u>>0])<0&&vu(0|ar[f>>2]),Ie(A,o),ar[n>>2]=4304,ar[t>>2]=4324,ar[o>>2]=4340,0<=(0|tr[11+i>>0]))return kf(o),bf(t),void(ur=a);vu(0|ar[i>>2]),kf(o),bf(t),ur=a},function(A,e,r){$A(A|=0,e|=0,r|=0,-1)},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a,c=0,l=0,u=0;if(ur=(a=ur)+160|0,f=a+136|0,t=(n=a)+56|0,o=n+4|0,ar[n>>2]=292,ar[t>>2]=312,Jf(n+56|0,o),ar[n+128>>2]=0,ar[n+132>>2]=-1,ar[n>>2]=4304,ar[t>>2]=4324,Sf(o),ar[o>>2]=4340,ar[(i=n+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[n+52>>2]=16,ar[f>>2]=0,ar[4+f>>2]=0,ar[8+f>>2]=0,Xe(o,f),(0|tr[11+f>>0])<0&&vu(0|ar[f>>2]),LA(f,e,r),We(n,(u=(l=0|tr[(c=11+f|0)>>0])<<24>>24<0)?0|ar[f>>2]:f,u?0|ar[4+f>>2]:255&l),(0|tr[c>>0])<0&&vu(0|ar[f>>2]),ne(f,e,r),We(n,(c=(l=0|tr[(u=11+f|0)>>0])<<24>>24<0)?0|ar[f>>2]:f,c?0|ar[4+f>>2]:255&l),(0|tr[u>>0])<0&&vu(0|ar[f>>2]),Ie(A,o),ar[n>>2]=4304,ar[t>>2]=4324,ar[o>>2]=4340,0<=(0|tr[11+i>>0]))return kf(o),bf(t),void(ur=a);vu(0|ar[i>>2]),kf(o),bf(t),ur=a},function(A,e,r){$A(A|=0,e|=0,r|=0,-1)},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a=0,c=0,l=0,u=0,b=0;if(ur=(o=ur)+160|0,a=o+136|0,n=(f=o)+56|0,t=f+4|0,ar[f>>2]=292,ar[n>>2]=312,Jf(f+56|0,t),ar[f+128>>2]=0,ar[f+132>>2]=-1,ar[f>>2]=4304,ar[n>>2]=4324,Sf(t),ar[t>>2]=4340,ar[(i=f+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[f+52>>2]=16,ar[a>>2]=0,ar[a+4>>2]=0,ar[a+8>>2]=0,Xe(t,a),(0|tr[a+11>>0])<0&&vu(0|ar[a>>2]),LA(a,e,r),We(f,(c=(l=0|tr[(u=a+11|0)>>0])<<24>>24<0)?0|ar[a>>2]:a,c?0|ar[a+4>>2]:255&l),(0|tr[u>>0])<0&&vu(0|ar[a>>2]),(0|(a=0|ar[e+56>>2]))!=(0|(u=0|ar[e+60>>2]))){l=a,a=0|ar[r>>2];do{if(0<(0|a))for(a=0;We(f,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(a=0|We(f,22139,26),We(0|Lf(a,0|ar[l>>2]),30086,1),a=1+(0|ar[r>>2])|0,ar[r>>2]=a,(0|(e=0|ar[l+4>>2]))!=(0|(c=0|ar[l+8>>2])))do{if(0<(0|a))for(a=0;We(f,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););a=0|We(f,22166,16),b=(a=0|We(0|xf(a,0|or[e+2>>1]),22183,13))+(0|ar[(0|ar[a>>2])-12>>2])+4|0,ar[b>>2]=1|ar[b>>2],We(0|Hf(a,0!=(0|tr[e>>0])),18904,2),e=e+4|0,a=0|ar[r>>2]}while((0|e)!=(0|c));a=(0|a)<1?0:a+-1|0,ar[r>>2]=a,l=l+16|0}while((0|l)!=(0|u))}if(Ie(A,t),ar[f>>2]=4304,ar[n>>2]=4324,ar[t>>2]=4340,0<=(0|tr[11+i>>0]))return kf(t),bf(n),void(ur=o);vu(0|ar[i>>2]),kf(t),bf(n),ur=o},function(A,e,r){A|=0,e|=0;var i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;if(ur=(i=ur)+32|0,b=i,s=0|ar[(r|=0)+12>>2],jA(r,0|tr[e+36>>0]?12:8),f=e+56|0,UA(r,(0|ar[(c=e+60|0)>>2])-(0|ar[f>>2])>>4),(0|(f=0|ar[f>>2]))!=(0|(c=0|ar[c>>2]))){l=e+37|0,u=e+40|0;do{if(n=0|ar[f>>2],0|tr[l>>0]?UA(r,n):MA(r,65535&n),n=f+4|0,JA(r,((0|ar[(a=f+8|0)>>2])-(0|ar[n>>2])|0)>>>2&255),(0|(n=0|ar[n>>2]))!=(0|(a=0|ar[a>>2])))for(;t=0!=(0|tr[n>>0]),o=0|lr[n+2>>1],1&ar[u>>2]?MA(r,65535&(32767&o|(t?32768:0))):JA(r,255&(127&o|(t?128:0))),(0|(n=n+4|0))!=(0|a););f=f+16|0}while((0|f)!=(0|c))}if(KA(b,e,r,s),0<=(0|tr[(f=b+8|0)+11>>0]))return r=0|ar[(r=b=56592)>>2],b=0|ar[(b=b+4|0)>>2],ar[(u=s=A)>>2]=r,ar[(s=s+4|0)>>2]=b,yu(A=A+8|0,56600),void(ur=i);vu(0|ar[f>>2]),r=0|ar[(r=b=56592)>>2],b=0|ar[(b=b+4|0)>>2],ar[(u=s=A)>>2]=r,ar[(s=s+4|0)>>2]=b,yu(A=A+8|0,56600),ur=i},function(A,e,r){A|=0;var i,f,n,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0;ur=(n=ur)+48|0,E=n+24|0,qA(t=(X=n)+4|0,e|=0,r|=0),(0|tr[(t=t+8|0)+11>>0])<0&&vu(0|ar[t>>2]),i=0|FA(r),f=r+24|0;A:do{if(0<(0|i)){for(h=r+16|0,v=E+8|0,g=e+37|0,Z=e+60|0,p=e+64|0,y=e+56|0,B=w=E+4|0,s=e+40|0,d=X+2|0,k=m=E+12|0,b=0;;){if(0|tr[f>>0])break A;if(0==(0|ar[(u=h)>>2])&0==(0|ar[u+4>>2]))break A;if(ar[w>>2]=0,ar[v>>2]=0,t=(ar[m>>2]=0)|tr[g>>0]?0|FA(r):65535&(0|VA(r)),ar[E>>2]=t,c=255&(u=0|IA(r)),u<<24>>24)for(a=0;1&ar[s>>2]?(t=(65535&(o=0|VA(r)))>>>15&255,e=32767):(t=(255&(o=0|IA(r)))>>>7,e=127,o&=255),tr[X>>0]=t,or[d>>1]=65535&o&e,(0|(t=0|ar[v>>2]))==(0|ar[k>>2])?Nt(B,X):(u=0|ar[X>>2],or[t>>1]=u,or[t+2>>1]=u>>>16,ar[v>>2]=4+(0|ar[v>>2])),(0|(a=a+1|0))<(0|c););if((0|(o=0|ar[Z>>2]))==(0|ar[p>>2]))Rt(y,E),t=0|ar[w>>2];else{if(ar[o>>2]=ar[E>>2],ar[(a=o+4|0)>>2]=0,ar[(u=o+8|0)>>2]=0,t=(ar[o+12>>2]=0)|ar[B>>2],c=(e=(0|ar[v>>2])-t|0)>>2){if(1073741823<c>>>0)break;l=0|hu(e),ar[u>>2]=l,ar[a>>2]=l,ar[o+12>>2]=l+(c<<2),t=0|ar[B>>2],0<(0|(e=(0|ar[v>>2])-t|0))&&(hb(0|l,0|t,0|e),ar[u>>2]=l+(e>>>2<<2))}ar[Z>>2]=16+(0|ar[Z>>2])}if(0|t&&((0|(e=0|ar[v>>2]))!=(0|t)&&(ar[v>>2]=e+(~((e+-4-t|0)>>>2)<<2)),vu(t)),(0|i)<=(0|(b=b+1|0)))break A}zl()}}while(0);if(!(0|tr[f>>0]))return E=0|ar[(r=56592)+4>>2],ar[(X=A)>>2]=ar[r>>2],ar[X+4>>2]=E,yu(A+8|0,56600),void(ur=n);ar[E>>2]=0,ar[E+4>>2]=0,ar[E+8>>2]=0,oo(A,2,100,E),ur=(0<=(0|tr[E+11>>0])||vu(0|ar[E>>2]),n)},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a,c=0,l=0,u=0;if(ur=(o=ur)+160|0,c=o+136|0,n=(f=o)+56|0,t=f+4|0,ar[f>>2]=292,ar[n>>2]=312,Jf(f+56|0,t),ar[f+128>>2]=0,ar[f+132>>2]=-1,ar[f>>2]=4304,ar[n>>2]=4324,Sf(t),ar[t>>2]=4340,ar[(i=f+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[f+52>>2]=16,ar[c>>2]=0,ar[c+4>>2]=0,ar[c+8>>2]=0,Xe(t,c),(0|tr[c+11>>0])<0&&vu(0|ar[c>>2]),LA(c,e,r),We(f,(u=(a=0|tr[(l=c+11|0)>>0])<<24>>24<0)?0|ar[c>>2]:c,u?0|ar[c+4>>2]:255&a),(0|tr[l>>0])<0&&vu(0|ar[c>>2]),0<(0|ar[r>>2]))for(c=0;We(f,18862,2),(0|(c=c+1|0))<(0|ar[r>>2]););if(l=0|We(f,22025,13),l=0|We(0|Lf(l,0|ar[e+56>>2]),30086,1),0<(0|ar[r>>2]))for(c=0;We(l,18862,2),(0|(c=c+1|0))<(0|ar[r>>2]););if(u=0|We(l,22039,14),We(0|Lf(u,0|ar[e+60>>2]),30086,1),Ie(A,t),ar[f>>2]=4304,ar[n>>2]=4324,ar[t>>2]=4340,0<=(0|tr[11+i>>0]))return kf(t),bf(n),void(ur=o);vu(0|ar[i>>2]),kf(t),bf(n),ur=o},function(A,e,r){A|=0,e|=0;var i,f=0,n=0;ur=(i=ur)+32|0,f=i,n=0|ar[(r|=0)+12>>2],jA(r,0|tr[e+36>>0]?12:8),UA(r,0|ar[e+56>>2]),UA(r,0|ar[e+60>>2]),KA(f,e,r,n),(0|tr[(e=f+8|0)+11>>0])<0&&vu(0|ar[e>>2]),f=0|ar[(r=56592)+4>>2],ar[(n=A)>>2]=ar[r>>2],ar[n+4>>2]=f,yu(A+8|0,56600),ur=i},function(A,e,r){A|=0;var i,f=0,n=0;if(ur=(i=ur)+32|0,f=i+20|0,qA(n=i,e|=0,r|=0),(0|tr[(n=n+8|0)+11>>0])<0&&vu(0|ar[n>>2]),n=0|FA(r),ar[e+56>>2]=n,n=0|FA(r),ar[e+60>>2]=n,!(0|tr[r+24>>0]))return f=0|ar[(r=56592)+4>>2],ar[(n=A)>>2]=ar[r>>2],ar[n+4>>2]=f,yu(A+8|0,56600),void(ur=i);ar[f>>2]=0,ar[f+4>>2]=0,ar[f+8>>2]=0,oo(A,2,100,f),ur=(0<=(0|tr[f+11>>0])||vu(0|ar[f>>2]),i)},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a=0,c=0,l=0,u=0;if(ur=(o=ur)+160|0,a=o+136|0,n=(f=o)+56|0,t=f+4|0,ar[f>>2]=292,ar[n>>2]=312,Jf(f+56|0,t),ar[f+128>>2]=0,ar[f+132>>2]=-1,ar[f>>2]=4304,ar[n>>2]=4324,Sf(t),ar[t>>2]=4340,ar[(i=f+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[f+52>>2]=16,ar[a>>2]=0,ar[a+4>>2]=0,ar[a+8>>2]=0,Xe(t,a),(0|tr[a+11>>0])<0&&vu(0|ar[a>>2]),LA(a,e,r),We(f,(u=(l=0|tr[(c=a+11|0)>>0])<<24>>24<0)?0|ar[a>>2]:a,u?0|ar[a+4>>2]:255&l),(0|tr[c>>0])<0&&vu(0|ar[a>>2]),0<(0|ar[r>>2]))for(a=0;We(f,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(a=0|We(f,21914,10),c=0|We(0|We(a,(u=(c=0|tr[(l=e+56|0)+11>>0])<<24>>24<0)?0|ar[l>>2]:l,u?0|ar[e+60>>2]:255&c),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(We(c,21925,14),(0|(a=0|ar[e+68>>2]))!=(0|(c=0|ar[e+72>>2])))for(;u=0|tr[a>>0],l=f+(0|ar[(0|ar[f>>2])-12>>2])+4|0,ar[l>>2]=-75&ar[l>>2]|8,ar[f+(0|ar[(0|ar[f>>2])-12>>2])+12>>2]=2,ar[f+(0|ar[(0|ar[f>>2])-12>>2])+76>>2]=48,We(0|Pf(f,255&u),20449,1),(0|(a=a+1|0))!=(0|c););if(We(f,30086,1),Ie(A,t),ar[f>>2]=4304,ar[n>>2]=4324,ar[t>>2]=4340,0<=(0|tr[11+i>>0]))return kf(t),bf(n),void(ur=o);vu(0|ar[i>>2]),kf(t),bf(n),ur=o},function(A,e,r){A|=0,e|=0;var i,f,n=0,t=0,o=0;if(ur=(f=ur)+32|0,t=f,o=0|ar[(r|=0)+12>>2],jA(r,0|tr[e+36>>0]?12:8),OA(r,e+56|0),(0|(n=0|ar[e+68>>2]))!=(0|(i=0|ar[e+72>>2])))for(;JA(r,0|tr[n>>0]),(0|(n=n+1|0))!=(0|i););KA(t,e,r,o),(0|tr[(n=t+8|0)+11>>0])<0&&vu(0|ar[n>>2]),t=0|ar[(r=56592)+4>>2],ar[(o=A)>>2]=ar[r>>2],ar[o+4>>2]=t,yu(A+8|0,56600),ur=f},function(A,e,r){A|=0;var i,f,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0;ur=(f=ur)+32|0,k=f+20|0,qA(n=f,e|=0,r|=0),(0|tr[(n=n+8|0)+11>>0])<0&&vu(0|ar[n>>2]),RA(k,r),(0|tr[(t=(n=e+56|0)+11|0)>>0])<0?(tr[ar[n>>2]>>0]=0,ar[e+60>>2]=0):(tr[n>>0]=0,tr[t>>0]=0),Cu(n,0),ar[n>>2]=ar[k>>2],ar[n+4>>2]=ar[k+4>>2],ar[n+8>>2]=ar[k+8>>2],d=i=r+16|0;A:do{if(!(0==(0|ar[d>>2])&0==(0|ar[d+4>>2]))){for(s=e+68|0,d=e+72|0,u=e+76|0;;){if(a=0|IA(r),n=0|ar[d>>2],(t=b=0|ar[u>>2])>>>0<=n>>>0){if(l=b=0|ar[s>>2],(0|(n=(c=n-b|0)+1|0))<0)break;t=(o=t-b|0)<<1,o=(t=o>>>0<1073741823?t>>>0<n>>>0?n:t:2147483647)?0|hu(t):0,tr[(e=o+c|0)>>0]=a,n=e+(0-c)|0,0<(0|c)&&hb(0|n,0|l,0|c),ar[s>>2]=n,ar[d>>2]=e+1,ar[u>>2]=o+t,0|b&&vu(l)}else tr[n>>0]=a,ar[d>>2]=1+(0|ar[d>>2]);if(0==(0|ar[(b=i)>>2])&0==(0|ar[b+4>>2]))break A}zl()}}while(0);if(!(0|tr[r+24>>0]))return r=0|ar[(d=56592)+4>>2],ar[(k=A)>>2]=ar[d>>2],ar[k+4>>2]=r,yu(A+8|0,56600),void(ur=f);ar[k>>2]=0,ar[k+4>>2]=0,ar[k+8>>2]=0,oo(A,2,100,k),ur=(0<=(0|tr[k+11>>0])||vu(0|ar[k>>2]),f)},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a,c,l=0,u=0;if(ur=(o=ur)+160|0,l=o+136|0,n=(f=o)+56|0,t=f+4|0,ar[f>>2]=292,ar[n>>2]=312,Jf(f+56|0,t),ar[f+128>>2]=0,ar[f+132>>2]=-1,ar[f>>2]=4304,ar[n>>2]=4324,Sf(t),ar[t>>2]=4340,ar[(i=f+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[f+52>>2]=16,ar[l>>2]=0,ar[l+4>>2]=0,ar[l+8>>2]=0,Xe(t,l),(0|tr[l+11>>0])<0&&vu(0|ar[l>>2]),LA(l,e,r),We(f,(u=(c=0|tr[(a=l+11|0)>>0])<<24>>24<0)?0|ar[l>>2]:l,u?0|ar[l+4>>2]:255&c),(0|tr[a>>0])<0&&vu(0|ar[l>>2]),0<(0|ar[r>>2]))for(l=0;We(f,18862,2),(0|(l=l+1|0))<(0|ar[r>>2]););if(u=0|We(f,21802,10),We(0|Pf(u,0|ar[e+56>>2]),21813,15),Ie(A,t),ar[f>>2]=4304,ar[n>>2]=4324,ar[t>>2]=4340,0<=(0|tr[11+i>>0]))return kf(t),bf(n),void(ur=o);vu(0|ar[i>>2]),kf(t),bf(n),ur=o},function(A,e,r){A|=0,e|=0;var i,f=0,n=0;if(ur=(i=ur)+16|0,f=i,n=90*(3&(0|IA(r|=0)))|0,ar[e+56>>2]=n,!(0|tr[r+24>>0]))return f=0|ar[(r=56592)+4>>2],ar[(n=A)>>2]=ar[r>>2],ar[n+4>>2]=f,yu(A+8|0,56600),void(ur=i);ar[f>>2]=0,ar[f+4>>2]=0,ar[f+8>>2]=0,oo(A,2,100,f),ur=(0<=(0|tr[f+11>>0])||vu(0|ar[f>>2]),i)},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a,c,l,u=0;if(ur=(o=ur)+160|0,u=o+136|0,n=(f=o)+56|0,t=f+4|0,ar[f>>2]=292,ar[n>>2]=312,Jf(f+56|0,t),ar[f+128>>2]=0,ar[f+132>>2]=-1,ar[f>>2]=4304,ar[n>>2]=4324,Sf(t),ar[t>>2]=4340,ar[(i=f+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[f+52>>2]=16,ar[u>>2]=0,ar[u+4>>2]=0,ar[u+8>>2]=0,Xe(t,u),(0|tr[u+11>>0])<0&&vu(0|ar[u>>2]),LA(u,e,r),We(f,(l=(c=0|tr[(a=u+11|0)>>0])<<24>>24<0)?0|ar[u>>2]:u,l?0|ar[u+4>>2]:255&c),(0|tr[a>>0])<0&&vu(0|ar[u>>2]),0<(0|ar[r>>2]))for(u=0;We(f,18862,2),(0|(u=u+1|0))<(0|ar[r>>2]););switch(We(f,21681,13),0|tr[e+56>>0]){case 0:We(f,21695,9);break;case 1:We(f,21705,11)}if(Ie(A,t),ar[f>>2]=4304,ar[n>>2]=4324,ar[t>>2]=4340,0<=(0|tr[11+i>>0]))return kf(t),Gf(),bf(n),void(ur=o);vu(0|ar[i>>2]),kf(t),Gf(),bf(n),ur=o},function(A,e,r){A|=0,e|=0;var i,f=0,n=0;if(ur=(i=ur)+16|0,f=i,n=1&(0|IA(r|=0)),tr[e+56>>0]=n,!(0|tr[r+24>>0]))return f=0|ar[(r=56592)+4>>2],ar[(n=A)>>2]=ar[r>>2],ar[n+4>>2]=f,yu(A+8|0,56600),void(ur=i);ar[f>>2]=0,ar[f+4>>2]=0,ar[f+8>>2]=0,oo(A,2,100,f),ur=(0<=(0|tr[f+11>>0])||vu(0|ar[f>>2]),i)},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a,c,l=0,u=0;if(ur=(o=ur)+160|0,l=o+136|0,n=(f=o)+56|0,t=f+4|0,ar[f>>2]=292,ar[n>>2]=312,Jf(f+56|0,t),ar[f+128>>2]=0,ar[f+132>>2]=-1,ar[f>>2]=4304,ar[n>>2]=4324,Sf(t),ar[t>>2]=4340,ar[(i=f+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[f+52>>2]=16,ar[l>>2]=0,ar[l+4>>2]=0,ar[l+8>>2]=0,Xe(t,l),(0|tr[l+11>>0])<0&&vu(0|ar[l>>2]),LA(l,e,r),We(f,(u=(c=0|tr[(a=l+11|0)>>0])<<24>>24<0)?0|ar[l>>2]:l,u?0|ar[l+4>>2]:255&c),(0|tr[a>>0])<0&&vu(0|ar[l>>2]),0<(0|ar[r>>2]))for(l=0;We(f,18862,2),(0|(l=l+1|0))<(0|ar[r>>2]););if(u=0|We(f,21560,16),u=0|We(0|Pf(u,0|ar[e+56>>2]),21577,1),u=0|We(0|Pf(u,0|ar[e+60>>2]),21579,3),u=0|We(0|Pf(u,0|ar[e+64>>2]),21577,1),We(0|Pf(u,0|ar[e+68>>2]),30086,1),0<(0|ar[r>>2]))for(l=0;We(f,18862,2),(0|(l=l+1|0))<(0|ar[r>>2]););if(u=0|We(f,21583,8),u=0|We(0|Pf(u,0|ar[e+72>>2]),21577,1),u=0|We(0|Pf(u,0|ar[e+76>>2]),21592,3),u=0|We(0|Pf(u,0|ar[e+80>>2]),21577,1),We(0|Pf(u,0|ar[e+84>>2]),30086,1),Ie(A,t),ar[f>>2]=4304,ar[n>>2]=4324,ar[t>>2]=4340,0<=(0|tr[11+i>>0]))return kf(t),Gf(),bf(n),void(ur=o);vu(0|ar[i>>2]),kf(t),Gf(),bf(n),ur=o},function(A,e,r){A|=0,e|=0;var i,f=0,n=0;ur=(i=ur)+32|0,f=i,n=0|ar[(r|=0)+12>>2],jA(r,0|tr[e+36>>0]?12:8),UA(r,0|ar[e+56>>2]),UA(r,0|ar[e+60>>2]),UA(r,0|ar[e+64>>2]),UA(r,0|ar[e+68>>2]),UA(r,0|ar[e+72>>2]),UA(r,0|ar[e+76>>2]),UA(r,0|ar[e+80>>2]),UA(r,0|ar[e+84>>2]),KA(f,e,r,n),(0|tr[(e=f+8|0)+11>>0])<0&&vu(0|ar[e>>2]),f=0|ar[(r=56592)+4>>2],ar[(n=A)>>2]=ar[r>>2],ar[n+4>>2]=f,yu(A+8|0,56600),ur=i},function(A,e,r){A|=0,e|=0;var i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0;if(ur=(i=ur)+32|0,b=i+12|0,s=i,l=0|FA(r|=0),u=0|FA(r),a=0|FA(r),c=0|FA(r),t=0|FA(r),o=0|FA(r),n=0|FA(r),f=0|FA(r),131072<(u+65536|0)>>>0)for(;l=(0|l)/2|0,131072<((u=(0|u)/2|0)+65536|0)>>>0;);if(131072<(l+65536|0)>>>0)for(;u=(0|u)/2|0,131072<((l=(0|l)/2|0)+65536|0)>>>0;);if(ar[(d=e+56|0)>>2]=l,ar[d+4>>2]=u,131072<(c+65536|0)>>>0)for(;a=(0|a)/2|0,131072<((c=(0|c)/2|0)+65536|0)>>>0;);if(131072<(a+65536|0)>>>0)for(;c=(0|c)/2|0,131072<((a=(0|a)/2|0)+65536|0)>>>0;);if(ar[(d=e+64|0)>>2]=a,ar[d+4>>2]=c,131072<(o+65536|0)>>>0)for(;t=(0|t)/2|0,131072<((o=(0|o)/2|0)+65536|0)>>>0;);if(131072<(t+65536|0)>>>0)for(;o=(0|o)/2|0,131072<((t=(0|t)/2|0)+65536|0)>>>0;);if(ar[(d=e+72|0)>>2]=t,ar[d+4>>2]=o,131072<(f+65536|0)>>>0)for(;n=(0|n)/2|0,131072<((f=(0|f)/2|0)+65536|0)>>>0;);if(131072<(n+65536|0)>>>0)for(;f=(0|f)/2|0,131072<((n=(0|n)/2|0)+65536|0)>>>0;);if(ar[(d=e+80|0)>>2]=n,0==(0|u)|0==(0|c)|0==(0|o)|0==(0|(ar[d+4>>2]=f)))return ar[s>>2]=0,ar[s+4>>2]=0,ar[s+8>>2]=0,oo(A,2,128,s),0<=(0|tr[s+11>>0])||vu(0|ar[s>>2]),void(ur=i);0|tr[r+24>>0]?(ar[b>>2]=0,ar[b+4>>2]=0,ar[b+8>>2]=0,oo(A,2,100,b),(0|tr[b+11>>0])<0&&vu(0|ar[b>>2])):(s=0|ar[(b=56592)+4>>2],ar[(d=A)>>2]=ar[b>>2],ar[d+4>>2]=s,yu(A+8|0,56600)),ur=i},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a,c=0,l=0,u=0,b=0,s=0,d=0;if(ur=(a=ur)+160|0,f=a+136|0,t=(n=a)+56|0,o=n+4|0,ar[n>>2]=292,ar[t>>2]=312,Jf(n+56|0,o),ar[n+128>>2]=0,ar[n+132>>2]=-1,ar[n>>2]=4304,ar[t>>2]=4324,Sf(o),ar[o>>2]=4340,ar[(i=n+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[n+52>>2]=16,ar[f>>2]=0,ar[4+f>>2]=0,ar[8+f>>2]=0,Xe(o,f),(0|tr[11+f>>0])<0&&vu(0|ar[f>>2]),LA(f,e,r),We(n,(u=(b=0|tr[(s=11+f|0)>>0])<<24>>24<0)?0|ar[f>>2]:f,u?0|ar[4+f>>2]:255&b),(0|tr[s>>0])<0&&vu(0|ar[f>>2]),(0|(c=0|ar[e+56>>2]))!=(0|(u=0|ar[e+60>>2]))){b=11+f|0,s=4+f|0;do{if(0<(0|ar[r>>2]))for(e=0;We(n,18862,2),(0|(e=e+1|0))<(0|ar[r>>2]););if(d=0|We(n,21430,21),xA(f,c),l=0|We(0|We(0|We(d,(e=(l=0|tr[b>>0])<<24>>24<0)?0|ar[f>>2]:f,e?0|ar[s>>2]:255&l),21452,1),21454,10),We(0|Lf(l,0|ar[c+48>>2]),21465,9),(0|tr[b>>0])<0&&vu(0|ar[f>>2]),(0|(e=0|ar[c+52>>2]))!=(0|(l=0|ar[c+56>>2])))for(;We(0|Lf(n,0|ar[e>>2]),20449,1),(0|(e=e+4|0))!=(0|l););We(n,30086,1),c=c+64|0}while((0|c)!=(0|u))}if(Ie(A,o),ar[n>>2]=4304,ar[t>>2]=4324,ar[o>>2]=4340,0<=(0|tr[11+i>>0]))return kf(o),Gf(),bf(t),void(ur=a);vu(0|ar[i>>2]),kf(o),Gf(),bf(t),ur=a},function(A,e,r){A|=0,e|=0;var i,f,n=0,t=0,o=0,a=0,c=0,l=0;if(ur=(f=ur)+32|0,c=f,l=0|ar[(r|=0)+12>>2],jA(r,0|tr[e+36>>0]?12:8),i=0==(0|tr[e+37>>0])?2:4,(0|(n=0|ar[e+56>>2]))!=(0|(a=0|ar[e+60>>2])))do{if(t=n+52|0,UA(r,10+(0|br(1+((0|ar[(o=n+56|0)>>2])-(0|ar[t>>2])>>2)|0,i))|0),UA(r,0|ar[n+20>>2]),SA(r,i,0|ar[n+48>>2],0),MA(r,((0|ar[o>>2])-(0|ar[t>>2])|0)>>>2&65535),(0|(t=0|ar[t>>2]))!=(0|(o=0|ar[o>>2])))for(;SA(r,i,0|ar[t>>2],0),(0|(t=t+4|0))!=(0|o););n=n+64|0}while((0|n)!=(0|a));if(KA(c,e,r,l),0<=(0|tr[(n=c+8|0)+11>>0]))return a=0|ar[(a=c=56592)>>2],c=0|ar[(c=c+4|0)>>2],ar[(r=l=A)>>2]=a,ar[(l=l+4|0)>>2]=c,yu(A=A+8|0,56600),void(ur=f);vu(0|ar[n>>2]),a=0|ar[(a=c=56592)>>2],c=0|ar[(c=c+4|0)>>2],ar[(r=l=A)>>2]=a,ar[(l=l+4|0)>>2]=c,yu(A=A+8|0,56600),ur=f},function(A,e,r){A|=0;var i,f,n,t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z=0,p=0,y=0,B=0,E=0,X=0;for(ur=(g=ur)+96|0,E=(B=g)+64|0,qA(Z=g+68|0,e|=0,r|=0),(0|tr[(Z=Z+8|0)+11>>0])<0&&vu(0|ar[Z>>2]),a=r+16|0,c=B+8|0,l=B+40|0,b=B+56|0,d=e+37|0,k=B+48|0,h=s=B+60|0,w=u=B+52|0,v=e+60|0,m=e+64|0,i=e+56|0,n=11+(f=A+8|0)|0,t=B+24|0,o=B+28|0;!(0==(0|ar[(y=a)>>2])&0==(0|ar[y+4>>2]));){if(ar[B>>2]=4264,ar[l>>2]=0,ar[c>>2]=0,ar[4+c>>2]=0,ar[8+c>>2]=0,ar[12+c>>2]=0,ar[16+c>>2]=0,ar[20+c>>2]=0,ar[24+c>>2]=0,or[28+c>>1]=0,ar[u>>2]=0,ar[b>>2]=0,ar[s>>2]=0,re(A,B,r),(0|ar[A>>2])==(0|ar[14148])){if(0|tr[d>>0]){if(y=0|FA(r),ar[k>>2]=y,e=65535&(y=0|VA(r)),y<<16>>16)for(Z=0;p=0|FA(r),ar[E>>2]=p,(y=0|ar[b>>2])>>>0<(0|ar[h>>2])>>>0?(ar[y>>2]=p,ar[b>>2]=y+4):Ce(w,E),Z=Z+1|0,(0!=(0|ar[(y=a)>>2])|0!=(0|ar[y+4>>2]))&(0|Z)<(0|e););}else if(y=65535&(0|VA(r)),ar[k>>2]=y,e=65535&(y=0|VA(r)),y<<16>>16)for(Z=0;p=65535&(0|VA(r)),ar[E>>2]=p,(y=0|ar[b>>2])>>>0<(0|ar[h>>2])>>>0?(ar[y>>2]=p,ar[b>>2]=y+4):Ce(w,E),Z=Z+1|0,(0!=(0|ar[(y=a)>>2])|0!=(0|ar[y+4>>2]))&(0|Z)<(0|e););(0|(Z=0|ar[v>>2]))==(0|ar[m>>2])?de(i,B):(se(Z,B),ar[v>>2]=64+(0|ar[v>>2])),p=((0|tr[n>>0])<0&&vu(0|ar[f>>2]),0)}else p=1;if(0|(Z=0|ar[u>>2])&&((0|(e=0|ar[b>>2]))!=(0|Z)&&(ar[b>>2]=e+(~((e+-4-Z|0)>>>2)<<2)),vu(Z)),ar[B>>2]=4264,0|(Z=0|ar[t>>2])&&((0|ar[o>>2])!=(0|Z)&&(ar[o>>2]=Z),vu(Z)),1==(0|p)){X=36;break}}ur=(36!=(0|X)&&(0|tr[r+24>>0]?(ar[B>>2]=0,ar[B+4>>2]=0,ar[B+8>>2]=0,oo(A,2,100,B),(0|tr[B+11>>0])<0&&vu(0|ar[B>>2])):(E=0|ar[(B=56592)+4>>2],ar[(X=A)>>2]=ar[B>>2],ar[X+4>>2]=E,yu(f,56600))),g)},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a=0,c=0,l=0,u=0,b=0,s=0,d=0;if(ur=(o=ur)+160|0,l=o+136|0,n=(f=o)+56|0,t=f+4|0,ar[f>>2]=292,ar[n>>2]=312,Jf(f+56|0,t),ar[f+128>>2]=0,ar[f+132>>2]=-1,ar[f>>2]=4304,ar[n>>2]=4324,Sf(t),ar[t>>2]=4340,ar[(i=f+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[f+52>>2]=16,ar[l>>2]=0,ar[l+4>>2]=0,ar[l+8>>2]=0,Xe(t,l),(0|tr[l+11>>0])<0&&vu(0|ar[l>>2]),LA(l,e,r),We(f,(c=(u=0|tr[(b=l+11|0)>>0])<<24>>24<0)?0|ar[l>>2]:l,c?0|ar[l+4>>2]:255&u),(0|tr[b>>0])<0&&vu(0|ar[l>>2]),0<(0|ar[r>>2]))for(a=0;We(f,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(f,20916,23),c=0|We(0|Pf(c,0|cr[e+56>>0]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(c,20940,23),c=0|We(0|Pf(c,0|cr[e+57>>0]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(c,20964,19),c=0|We(0|Hf(c,0!=(0|tr[e+58>>0])),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(b=0|We(c,20984,21),We(0|Pf(b,0|cr[e+59>>0]),30086,1),0<(0|ar[r>>2]))for(a=0;We(f,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););for(We(f,21006,37),c=e+60|0,a=0;Lf(f,(0|ar[c>>2])>>>(31-a|0)&1),7!=((0|a)%8|0)?3==((0|a)%4|0)&&(tr[l>>0]=46,We(f,l,1)):(tr[l>>0]=32,We(f,l,1)),(0|(a=a+1|0))<32;);if(We(f,30086,1),0<(0|ar[r>>2]))for(a=0;We(f,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););for(We(f,21044,36),a=0;Pf(f,0!=(ar[e+64+(a>>>5<<2)>>2]&1<<(31&a)|0)&1),7&(a=a+1|0)||(tr[l>>0]=32,We(f,l,1)),(0|a)<48;);if(We(f,30086,1),0<(0|ar[r>>2]))for(a=0;We(f,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(f,21081,19),c=0|We(0|Pf(c,0|cr[e+72>>0]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(c,21101,30),c=0|We(0|xf(c,0|or[e+74>>1]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(c,21132,18),c=0|We(0|Pf(c,0|cr[e+76>>0]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(c,21151,15),c=0|We(0|Pf(c,0|cr[e+77>>0]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(c,21167,16),c=0|We(0|Pf(c,0|cr[e+78>>0]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(c,21184,18),c=0|We(0|Pf(c,0|cr[e+79>>0]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(c,21203,16),c=0|We(0|xf(c,0|or[e+80>>1]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(c,21220,21),c=0|We(0|Pf(c,0|cr[e+82>>0]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(c,21242,21),c=0|We(0|Pf(c,0|cr[e+83>>0]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(c,21264,20),c=0|We(0|Pf(c,0|cr[e+84>>0]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(a=0|We(c,21285,13),We(0|Pf(a,0|cr[e+88>>0]),30086,1),(0|(a=0|ar[e+92>>2]))!=(0|(b=0|ar[e+96>>2]))){u=a,a=0|ar[r>>2];do{if(0<(0|a))for(a=0;We(f,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(We(f,21299,8),e=0|ar[r>>2],ar[r>>2]=e+1,-1<(0|e))for(a=0;We(f,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(f,21308,20),c=0|We(0|Pf(c,0|cr[u>>0]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(c,21329,15),We(0|Pf(c,0|cr[u+1>>0]),30086,1),c=0|ar[u+4>>2],e=0|ar[u+8>>2],a=0|ar[r>>2],(0|c)!=(0|e))do{if(0<(0|a))for(a=0;We(f,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if((0|(a=0|ar[c>>2]))!=(0|(l=0|ar[c+4>>2])))for(;s=0|tr[a>>0],ar[f+(0|ar[(0|ar[f>>2])-12>>2])+76>>2]=48,ar[f+(0|ar[(0|ar[f>>2])-12>>2])+12>>2]=2,d=f+(0|ar[(0|ar[f>>2])-12>>2])+4|0,ar[d>>2]=-75&ar[d>>2]|8,We(0|Pf(f,255&s),20449,1),(0|(a=a+1|0))!=(0|l););We(f,30086,1),a=f+(0|ar[(0|ar[f>>2])-12>>2])+4|0,ar[a>>2]=-75&ar[a>>2]|2,c=c+12|0,a=0|ar[r>>2]}while((0|c)!=(0|e));a=(0|a)<1?0:a+-1|0,ar[r>>2]=a,u=u+16|0}while((0|u)!=(0|b))}if(Ie(A,t),ar[f>>2]=4304,ar[n>>2]=4324,ar[t>>2]=4340,0<=(0|tr[11+i>>0]))return kf(t),Gf(),bf(n),void(ur=o);vu(0|ar[i>>2]),kf(t),Gf(),bf(n),ur=o},function(A,e,r){A|=0,e|=0;var i,f=0,n=0,t=0,o=0,a=0,c=0;for(ur=(i=ur)+32|0,a=i,c=0|ar[(r|=0)+12>>2],jA(r,0|tr[e+36>>0]?12:8),JA(r,0|tr[e+56>>0]),JA(r,tr[e+58>>0]<<5&255|tr[e+57>>0]<<6&255|31&tr[e+59>>0]),UA(r,0|ar[e+60>>2]),f=0;o=f<<3,JA(r,(0!=(ar[e+64+((f>>>2&134217727)<<2)>>2]&1<<(24&o|7)|0)|(0!=(ar[e+64+((f>>>2&134217727)<<2)>>2]&1<<(24&o|6)|0)|(0!=(ar[e+64+((f>>>2&134217727)<<2)>>2]&1<<(24&o|5)|0)|(0!=(ar[e+64+((f>>>2&134217727)<<2)>>2]&1<<(24&o|4)|0)|(0!=(ar[e+64+((f>>>2&134217727)<<2)>>2]&1<<(24&o|3)|0)|(0!=(ar[e+64+((f>>>2&134217727)<<2)>>2]&1<<(24&o|2)|0)|(0!=(ar[e+64+((f>>>2&134217727)<<2)>>2]&1<<(24&o|1)|0)&1)<<1)<<1)<<1&14)<<1&30)<<1&62)<<1&126)<<1&255),6!=(0|(f=f+1|0)););if(JA(r,0|tr[e+72>>0]),MA(r,-4096|or[e+74>>1]),JA(r,-4|tr[e+76>>0]),JA(r,-4|tr[e+77>>0]),JA(r,-8|tr[e+78>>0]),JA(r,-8|tr[e+79>>0]),MA(r,0|or[e+80>>1]),JA(r,255&(255&(tr[e+83>>0]<<3&56|tr[e+82>>0]<<6&255|tr[e+84>>0]<<2&4)|3+(0|cr[e+88>>0])&3)),f=e+92|0,JA(r,((0|ar[(o=e+96|0)>>2])-(0|ar[f>>2])|0)>>>4&255),(0|(f=0|ar[f>>2]))!=(0|(o=0|ar[o>>2])))do{if(JA(r,tr[f>>0]<<6&64|63&tr[f+1>>0]),n=f+4|0,MA(r,65535&(((0|ar[(t=f+8|0)>>2])-(0|ar[n>>2])|0)/12|0)),(0|(n=0|ar[n>>2]))!=(0|(t=0|ar[t>>2])))for(;MA(r,(0|ar[n+4>>2])-(0|ar[n>>2])&65535),zA(r,n),(0|(n=n+12|0))!=(0|t););f=f+16|0}while((0|f)!=(0|o));if(KA(a,e,r,c),0<=(0|tr[(f=a+8|0)+11>>0]))return e=0|ar[(e=a=56592)>>2],a=0|ar[(a=a+4|0)>>2],ar[(r=c=A)>>2]=e,ar[(c=c+4|0)>>2]=a,yu(A=A+8|0,56600),void(ur=i);vu(0|ar[f>>2]),e=0|ar[(e=a=56592)>>2],a=0|ar[(a=a+4|0)>>2],ar[(r=c=A)>>2]=e,ar[(c=c+4|0)>>2]=a,yu(A=A+8|0,56600),ur=i},function(A,e,r){A|=0,e|=0;var i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0;for(ur=(i=ur)+32|0,I=i+16|0,W=i,n=0|IA(r|=0),tr[e+56>>0]=n,f=255&(n=0|IA(r)),tr[e+57>>0]=(255&n)>>>6,tr[e+58>>0]=f>>>5&1,tr[e+59>>0]=31&f,f=0|FA(r),ar[e+60>>2]=f,n=(f=0)|IA(r);p=255&n,y=1<<(24&(B=f<<3)),Z=0|ar[(E=e+64+((f>>>2&134217727)<<2)|0)>>2],ar[E>>2]=128&p|0?Z|y:Z&~y,y=1<<(24&B|1),Z=0|ar[(E=e+64+((f>>>2&134217727)<<2)|0)>>2],ar[E>>2]=64&p|0?Z|y:Z&~y,y=1<<(24&B|2),Z=0|ar[(E=e+64+((f>>>2&134217727)<<2)|0)>>2],ar[E>>2]=32&p|0?Z|y:Z&~y,y=1<<(24&B|3),Z=0|ar[(E=e+64+((f>>>2&134217727)<<2)|0)>>2],ar[E>>2]=16&p|0?Z|y:Z&~y,y=1<<(24&B|4),Z=0|ar[(E=e+64+((f>>>2&134217727)<<2)|0)>>2],ar[E>>2]=8&p|0?Z|y:Z&~y,y=1<<(24&B|5),Z=0|ar[(E=e+64+((f>>>2&134217727)<<2)|0)>>2],ar[E>>2]=4&p|0?Z|y:Z&~y,y=1<<(24&B|6),Z=0|ar[(E=e+64+((f>>>2&134217727)<<2)|0)>>2],ar[E>>2]=2&p|0?Z|y:Z&~y,B=1<<(24&B|7),y=0|ar[(E=e+64+((f>>>2&134217727)<<2)|0)>>2],ar[E>>2]=1&p|0?y|B:y&~B,f=f+1|0,n=0|IA(r),6!=(0|f););tr[e+72>>0]=n,k=4095&(0|VA(r)),or[e+74>>1]=k,k=3&(0|IA(r)),tr[e+76>>0]=k,k=3&(0|IA(r)),tr[e+77>>0]=k,k=7&(0|IA(r))|8,tr[e+78>>0]=k,k=7&(0|IA(r))|8,tr[e+79>>0]=k,k=0|VA(r),or[e+80>>1]=k,E=255&(k=0|IA(r)),tr[e+82>>0]=(255&k)>>>6,tr[e+83>>0]=E>>>3&7,tr[e+84>>0]=E>>>2&1,tr[e+88>>0]=1+(3&E),k=255&(E=0|IA(r));A:do{if(E<<24>>24){h=r+24|0,v=I+8|0,g=I+1|0,Z=e+96|0,p=e+100|0,B=m=I+12|0,E=y=w=I+4|0,l=e+92|0,u=W+4|0,s=r+4|0,d=b=W+8|0,c=0;do{if(0|tr[h>>0])break A;o=0|IA(r),ar[w>>2]=0,ar[v>>2]=0,ar[m>>2]=0,o&=255,tr[I>>0]=o>>>6&1,tr[g>>0]=63&o,a=65535&(o=0|VA(r));e:do{if(o<<16>>16){o=0;do{if(0|tr[h>>0])break e;ar[W>>2]=0,ar[u>>2]=0,t=65535&(f=(ar[b>>2]=0)|VA(r));do{if(f<<16>>16){do{if(0|CA(r,65535&f,0)){if(t>>>0<=(f=(e=0|ar[u>>2])-(n=0|ar[W>>2])|0)>>>0?t>>>0<f>>>0&&(0|e)!=(0|(X=n+t|0))&&(ar[u>>2]=X):TA(W,t-f|0),f=0|ar[r>>2],n=0|ar[s>>2]){bu(n),xb[63&ar[16+(0|ar[f>>2])>>2]](f,0|ar[W>>2],t),du(n);break}xb[63&ar[16+(0|ar[f>>2])>>2]](f,0|ar[W>>2],t);break}}while(0);if((f=0|ar[v>>2])>>>0<(0|ar[B>>2])>>>0){ar[f>>2]=0,ar[(t=f+4|0)>>2]=0,ar[f+8>>2]=0,ar[f>>2]=ar[W>>2],ar[t>>2]=ar[u>>2],ar[f+8>>2]=ar[d>>2],ar[d>>2]=0,ar[u>>2]=0,ar[W>>2]=0,ar[v>>2]=12+(0|ar[v>>2]);break}ue(y,W);break}}while(0);0|(f=0|ar[W>>2])&&((0|ar[u>>2])!=(0|f)&&(ar[u>>2]=f),vu(f)),o=o+1|0}while((0|o)<(0|a))}}while(0);if((f=0|ar[Z>>2])>>>0>=(0|ar[p>>2])>>>0){if(le(l,I),0|(f=0|ar[E>>2])){if((0|(n=0|ar[v>>2]))!=(0|f)){for(;e=n+-12|0,ar[v>>2]=e,(0|(n=(t=0|ar[e>>2])?((0|ar[(n=n+-8|0)>>2])!=(0|t)&&(ar[n>>2]=t),vu(t),0|ar[v>>2]):e))!=(0|f););f=0|ar[E>>2]}vu(f)}}else or[f>>1]=0|or[I>>1],ar[(o=f+4|0)>>2]=0,ar[(a=f+8|0)>>2]=0,ar[f+12>>2]=0,ar[o>>2]=ar[y>>2],ar[a>>2]=ar[v>>2],ar[f+12>>2]=ar[B>>2],ar[B>>2]=0,ar[v>>2]=0,ar[y>>2]=0,ar[Z>>2]=16+(0|ar[Z>>2]);c=c+1|0}while((0|c)<(0|k))}}while(0);if(n=0|ar[(f=t=r+16|0)>>2],0<(0|(f=0|ar[f+4>>2]))|0==(0|f)&0<n>>>0&&((e=0|ar[r+8>>2])&&(_A(e,n,f),n=0|ar[(f=t)>>2],f=0|ar[f+4>>2]),X=0|ar[r>>2],W=0|ar[X>>2],E=0|ar[W+20>>2],W=0|tb(0|(W=0|jb[127&ar[W+8>>2]](X)),0|D,0|n,0|f),xb[63&E](X,W,D),ar[(W=t)>>2]=0,ar[W+4>>2]=0),!(0|tr[r+24>>0]))return r=0|ar[(W=56592)+4>>2],ar[(I=A)>>2]=ar[W>>2],ar[I+4>>2]=r,yu(A+8|0,56600),void(ur=i);ar[I>>2]=0,ar[I+4>>2]=0,ar[I+8>>2]=0,oo(A,2,100,I),ur=(0<=(0|tr[I+11>>0])||vu(0|ar[I>>2]),i)},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a=0,c=0,l=0,u=0;if(ur=(o=ur)+160|0,a=o+136|0,n=(f=o)+56|0,t=f+4|0,ar[f>>2]=292,ar[n>>2]=312,Jf(f+56|0,t),ar[f+128>>2]=0,ar[f+132>>2]=-1,ar[f>>2]=4304,ar[n>>2]=4324,Sf(t),ar[t>>2]=4340,ar[(i=f+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[f+52>>2]=16,ar[a>>2]=0,ar[a+4>>2]=0,ar[a+8>>2]=0,Xe(t,a),(0|tr[a+11>>0])<0&&vu(0|ar[a>>2]),LA(a,e,r),We(f,(u=(l=0|tr[(c=a+11|0)>>0])<<24>>24<0)?0|ar[a>>2]:a,u?0|ar[a+4>>2]:255&l),(0|tr[c>>0])<0&&vu(0|ar[a>>2]),0<(0|ar[r>>2]))for(a=0;We(f,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(f,18907,9),c=0|We(0|Pf(c,0|cr[e+56>>0]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(c,20644,13),c=0|We(0|Pf(c,0|cr[e+57>>0]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(c,20658,17),c=0|We(0|Pf(c,0|cr[e+58>>0]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(c,20676,15),c=0|We(0|Pf(c,0|cr[e+60>>0]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(c,20692,12),c=0|We(0|Pf(c,0|cr[e+61>>0]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(c,20705,22),c=0|We(0|Pf(c,0|cr[e+63>>0]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(c,20728,22),c=0|We(0|Pf(c,0|cr[e+64>>0]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(c,20751,24),c=0|We(0|Pf(c,0|cr[e+65>>0]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(We(c,20776,28),0|tr[e+66>>0]?We(0|Pf(f,1+(0|cr[e+67>>0])|0),30086,1):We(f,20805,12),0<(0|ar[r>>2]))for(a=0;We(f,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(We(f,20818,12),r=e+68|0,(0|ar[(c=e+72|0)>>2])!=(0|ar[r>>2]))for(a=0;l=(u=0|We(f,20449,1))+(0|ar[(0|ar[u>>2])-12>>2])+4|0,ar[l>>2]=-75&ar[l>>2]|8,ar[u+(0|ar[(0|ar[u>>2])-12>>2])+76>>2]=48,ar[u+(0|ar[(0|ar[u>>2])-12>>2])+12>>2]=2,Pf(u,0|cr[(0|ar[r>>2])+a>>0]),(a=a+1|0)>>>0<((0|ar[c>>2])-(0|ar[r>>2])|0)>>>0;);if(u=f+(0|ar[(0|ar[f>>2])-12>>2])+4|0,ar[u>>2]=-75&ar[u>>2]|2,We(f,30086,1),Ie(A,t),ar[f>>2]=4304,ar[n>>2]=4324,ar[t>>2]=4340,0<=(0|tr[11+i>>0]))return kf(t),Gf(),bf(n),void(ur=o);vu(0|ar[i>>2]),kf(t),Gf(),bf(n),ur=o},function(A,e,r){A|=0,e|=0;var i,f=0,n=0;if(ur=(i=ur)+32|0,f=i,n=0|ar[(r|=0)+12>>2],jA(r,0|tr[e+36>>0]?12:8),JA(r,-128|tr[e+56>>0]),JA(r,31&tr[e+58>>0]|tr[e+57>>0]<<5&255),JA(r,255&((0|tr[e+60>>0]?64:0)|(0|tr[e+59>>0]?128:0)|(0|tr[e+61>>0]?32:0)|(0|tr[e+62>>0]?16:0)|(0|tr[e+63>>0]?8:0)|(0|tr[e+64>>0]?4:0)|3&tr[e+65>>0])),JA(r,0),KA(f,e,r,n),0<=(0|tr[(e=f+8|0)+11>>0]))return e=0|ar[(e=f=56592)>>2],f=0|ar[(f=f+4|0)>>2],ar[(r=n=A)>>2]=e,ar[(n=n+4|0)>>2]=f,yu(n=A+8|0,56600),void(ur=i);vu(0|ar[e>>2]),e=0|ar[(e=f=56592)>>2],f=0|ar[(f=f+4|0)>>2],ar[(r=n=A)>>2]=e,ar[(n=n+4|0)>>2]=f,yu(n=A+8|0,56600),ur=i},function(A,e,r){A|=0,e|=0;var i,f,n,t,o,a,c,l,u,b,s,d=0,k=0,h=0,w=0;if(ur=(o=ur)+16|0,w=o,k=127&(0|IA(r|=0)),tr[e+56>>0]=k,k=0|IA(r),tr[e+57>>0]=(255&k)>>>5,tr[e+58>>0]=31&k,d=255&(k=0|IA(r)),tr[e+59>>0]=(255&k)>>>7,tr[e+60>>0]=d>>>6&1,tr[e+61>>0]=d>>>5&1,tr[e+62>>0]=d>>>4&1,tr[e+63>>0]=d>>>3&1,tr[e+64>>0]=d>>>2&1,tr[e+65>>0]=3&d,k=(d=255&(0|IA(r)))>>>4&1,(tr[e+66>>0]=k)<<24>>24&&(tr[e+67>>0]=15&d),t=0|ar[(k=r+16|0)>>2],k=0|ar[k+4>>2],n=e+68|0,t>>>0<=(i=(f=0|ar[(e=e+72|0)>>2])-(d=0|ar[n>>2])|0)>>>0?t>>>0<i>>>0&&(0|f)!=(0|(h=d+t|0))&&(ar[e>>2]=h):(TA(n,t-i|0),d=0|ar[n>>2]),a=r,c=d,l=t,u=k,c|=0,a=0|CA(a|=0,l|=0,u|=0)?(u=0|ar[a>>2],(s=0==(0|(b=0|ar[a+4>>2])))||bu(b),(u=0|xb[63&ar[16+(0|ar[u>>2])>>2]](u,c,l))||GA(a),s||du(b),u):0,!(0|tr[r+24>>0]))return r=0|ar[(h=56592)+4>>2],ar[(w=A)>>2]=ar[h>>2],ar[w+4>>2]=r,yu(A+8|0,56600),void(ur=o);ar[w>>2]=0,ar[w+4>>2]=0,ar[w+8>>2]=0,oo(A,2,100,w),ur=(0<=(0|tr[w+11>>0])||vu(0|ar[w>>2]),o)},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a,c=0,l=0,u=0;if(ur=(o=ur)+160|0,c=o+136|0,n=(f=o)+56|0,t=f+4|0,ar[f>>2]=292,ar[n>>2]=312,Jf(f+56|0,t),ar[f+128>>2]=0,ar[f+132>>2]=-1,ar[f>>2]=4304,ar[n>>2]=4324,Sf(t),ar[t>>2]=4340,ar[(i=f+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[f+52>>2]=16,ar[c>>2]=0,ar[c+4>>2]=0,ar[c+8>>2]=0,Xe(t,c),(0|tr[c+11>>0])<0&&vu(0|ar[c>>2]),LA(c,e,r),We(f,(u=(l=0|tr[(a=c+11|0)>>0])<<24>>24<0)?0|ar[c>>2]:c,u?0|ar[c+4>>2]:255&l),(0|tr[a>>0])<0&&vu(0|ar[c>>2]),0<(0|ar[r>>2]))for(c=0;We(f,18862,2),(0|(c=c+1|0))<(0|ar[r>>2]););if(l=0|We(f,20536,22),We(0|Kf(l,u=0|ob(0|ar[(u=e+8|0)>>2],0|ar[u+4>>2],0|ar[e+16>>2],0),D),30086,1),Ie(A,t),ar[f>>2]=4304,ar[n>>2]=4324,ar[t>>2]=4340,0<=(0|tr[11+i>>0]))return kf(t),Gf(),bf(n),void(ur=o);vu(0|ar[i>>2]),kf(t),Gf(),bf(n),ur=o},function(A,e,r){A|=0,e|=0;var i,f=0,n=0;ur=(i=ur)+32|0,f=i,n=0|ar[(r|=0)+12>>2],jA(r,0|tr[e+36>>0]?12:8),zA(r,e+72|0),KA(f,e,r,n),(0|tr[(e=f+8|0)+11>>0])<0&&vu(0|ar[e>>2]),f=0|ar[(r=56592)+4>>2],ar[(n=A)>>2]=ar[r>>2],ar[n+4>>2]=f,yu(A+8|0,56600),ur=i},function(A,e,r){A|=0,e|=0;var i,f,n=0,t=0,o=0;if(ur=(f=ur)+16|0,i=f,n=0|ar[(r|=0)>>2],(t=0|ar[r+4>>2])?(bu(t),o=0|jb[127&ar[8+(0|ar[n>>2])>>2]](n),ar[(n=e+56|0)>>2]=0,ar[n+4>>2]=0,ar[(n=e+64|0)>>2]=o,ar[n+4>>2]=D,du(t)):(n=0|jb[127&ar[8+(0|ar[n>>2])>>2]](n),ar[(t=e+56|0)>>2]=0,ar[t+4>>2]=0,ar[(t=e+64|0)>>2]=n,ar[t+4>>2]=D),!(0|tr[r+24>>0]))return t=0|ar[(n=56592)+4>>2],ar[(o=A)>>2]=ar[n>>2],ar[o+4>>2]=t,yu(A+8|0,56600),void(ur=f);ar[i>>2]=0,ar[i+4>>2]=0,ar[i+8>>2]=0,oo(A,2,100,i),ur=(0<=(0|tr[i+11>>0])||vu(0|ar[i>>2]),f)},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a,c=0,l=0,u=0,b=0,s=0,d=0;if(ur=(a=ur)+160|0,f=a+136|0,t=(n=a)+56|0,o=n+4|0,ar[n>>2]=292,ar[t>>2]=312,Jf(n+56|0,o),ar[n+128>>2]=0,ar[n+132>>2]=-1,ar[n>>2]=4304,ar[t>>2]=4324,Sf(o),ar[o>>2]=4340,ar[(i=n+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[n+52>>2]=16,ar[f>>2]=0,ar[4+f>>2]=0,ar[8+f>>2]=0,Xe(o,f),(0|tr[11+f>>0])<0&&vu(0|ar[f>>2]),LA(f,e,r),We(n,(u=(b=0|tr[(s=11+f|0)>>0])<<24>>24<0)?0|ar[f>>2]:f,u?0|ar[4+f>>2]:255&b),(0|tr[s>>0])<0&&vu(0|ar[f>>2]),(0|(c=0|ar[e+56>>2]))!=(0|(u=0|ar[e+60>>2]))){b=11+f|0,s=4+f|0;do{if(0<(0|ar[r>>2]))for(e=0;We(n,18862,2),(0|(e=e+1|0))<(0|ar[r>>2]););if(d=0|We(n,20408,12),xA(f,c),l=0|We(0|We(d,(e=(l=0|tr[b>>0])<<24>>24<0)?0|ar[f>>2]:f,e?0|ar[s>>2]:255&l),30086,1),0<(0|ar[r>>2]))for(e=0;We(l,18862,2),(0|(e=e+1|0))<(0|ar[r>>2]););if(l=0|We(l,20421,12),l=0|We(0|Lf(l,0|ar[c+48>>2]),30086,1),0<(0|ar[r>>2]))for(e=0;We(l,18862,2),(0|(e=e+1|0))<(0|ar[r>>2]););if(We(l,20434,14),(0|tr[b>>0])<0&&vu(0|ar[f>>2]),(0|(e=0|ar[c+52>>2]))!=(0|(l=0|ar[c+56>>2])))for(;We(0|Lf(n,0|ar[e>>2]),20449,1),(0|(e=e+4|0))!=(0|l););We(n,30086,1),c=c+64|0}while((0|c)!=(0|u))}if(Ie(A,o),ar[n>>2]=4304,ar[t>>2]=4324,ar[o>>2]=4340,0<=(0|tr[11+i>>0]))return kf(o),Gf(),bf(t),void(ur=a);vu(0|ar[i>>2]),kf(o),Gf(),bf(t),ur=a},function(A,e,r){var i,f,n,t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p=0,y=0,B=0,E=0,X=0,W=0;for(ur=(Z=ur)+96|0,v=(r|=0)+16|0,m=8+(h=Z+24|0)|0,g=40+h|0,X=56+h|0,l=(w=Z)+8|0,u=11+(c=(A|=0)+8|0)|0,b=A+12|0,s=48+h|0,d=(e|=0)+60|0,k=e+64|0,i=e+56|0,f=a=60+h|0,n=E=52+h|0,t=24+h|0,o=28+h|0;!(0==(0|ar[(B=v)>>2])&0==(0|ar[B+4>>2]));){if(ar[h>>2]=4264,ar[g>>2]=0,ar[m>>2]=0,ar[4+m>>2]=0,ar[8+m>>2]=0,ar[12+m>>2]=0,ar[16+m>>2]=0,ar[20+m>>2]=0,ar[24+m>>2]=0,or[28+m>>1]=0,ar[E>>2]=0,ar[X>>2]=0,ar[a>>2]=0,re(A,h,r),(0|ar[A>>2])==(0|ar[14148]))if(qA(w,h,r),y=0|ar[(p=w)+4>>2],ar[(B=A)>>2]=ar[p>>2],ar[B+4>>2]=y,(0|tr[u>>0])<0?(tr[ar[c>>2]>>0]=0,ar[b>>2]=0):(tr[c>>0]=0,tr[u>>0]=0),Cu(c,0),ar[c>>2]=ar[l>>2],ar[4+c>>2]=ar[4+l>>2],ar[8+c>>2]=ar[8+l>>2],(0|ar[A>>2])==(0|ar[14148])){p=0|FA(r),ar[s>>2]=p,p=0|FA(r);A:do{if(0<(0|p)){e=0;do{if(0==(0|ar[(B=v)>>2])&0==(0|ar[B+4>>2]))break A;y=0|FA(r),ar[w>>2]=y,(B=0|ar[X>>2])>>>0<(0|ar[f>>2])>>>0?(ar[B>>2]=y,ar[X>>2]=B+4):Ce(n,w),e=e+1|0}while((0|e)<(0|p))}}while(0);(0|(e=0|ar[d>>2]))==(0|ar[k>>2])?ae(i,h):(oe(e,h),ar[d>>2]=64+(0|ar[d>>2])),y=((0|tr[u>>0])<0&&vu(0|ar[c>>2]),0)}else y=1;else y=1;if(0|(e=0|ar[E>>2])&&((0|(p=0|ar[X>>2]))!=(0|e)&&(ar[X>>2]=p+(~((p+-4-e|0)>>>2)<<2)),vu(e)),ar[h>>2]=4264,0|(e=0|ar[t>>2])&&((0|ar[o>>2])!=(0|e)&&(ar[o>>2]=e),vu(e)),1==(0|y)){W=33;break}}ur=(33!=(0|W)&&(0|tr[r+24>>0]?(ar[h>>2]=0,ar[4+h>>2]=0,ar[8+h>>2]=0,oo(A,2,100,h),(0|tr[11+h>>0])<0&&vu(0|ar[h>>2])):(X=0|ar[(E=56592)+4>>2],ar[(W=A)>>2]=ar[E>>2],ar[W+4>>2]=X,yu(c,56600))),Z)},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a,c=0,l=0,u=0;if(ur=(a=ur)+160|0,f=a+136|0,t=(n=a)+56|0,o=n+4|0,ar[n>>2]=292,ar[t>>2]=312,Jf(n+56|0,o),ar[n+128>>2]=0,ar[n+132>>2]=-1,ar[n>>2]=4304,ar[t>>2]=4324,Sf(o),ar[o>>2]=4340,ar[(i=n+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[n+52>>2]=16,ar[f>>2]=0,ar[4+f>>2]=0,ar[8+f>>2]=0,Xe(o,f),(0|tr[11+f>>0])<0&&vu(0|ar[f>>2]),LA(f,e,r),We(n,(u=(l=0|tr[(c=11+f|0)>>0])<<24>>24<0)?0|ar[f>>2]:f,u?0|ar[4+f>>2]:255&l),(0|tr[c>>0])<0&&vu(0|ar[f>>2]),ne(f,e,r),We(n,(c=(l=0|tr[(u=11+f|0)>>0])<<24>>24<0)?0|ar[f>>2]:f,c?0|ar[4+f>>2]:255&l),(0|tr[u>>0])<0&&vu(0|ar[f>>2]),Ie(A,o),ar[n>>2]=4304,ar[t>>2]=4324,ar[o>>2]=4340,0<=(0|tr[11+i>>0]))return kf(o),Gf(),bf(t),void(ur=a);vu(0|ar[i>>2]),kf(o),Gf(),bf(t),ur=a},function(A,e,r){$A(A|=0,e|=0,r|=0,-1)},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a,c=0,l=0,u=0;if(ur=(a=ur)+160|0,f=a+136|0,t=(n=a)+56|0,o=n+4|0,ar[n>>2]=292,ar[t>>2]=312,Jf(n+56|0,o),ar[n+128>>2]=0,ar[n+132>>2]=-1,ar[n>>2]=4304,ar[t>>2]=4324,Sf(o),ar[o>>2]=4340,ar[(i=n+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[n+52>>2]=16,ar[f>>2]=0,ar[4+f>>2]=0,ar[8+f>>2]=0,Xe(o,f),(0|tr[11+f>>0])<0&&vu(0|ar[f>>2]),LA(f,e,r),We(n,(u=(l=0|tr[(c=11+f|0)>>0])<<24>>24<0)?0|ar[f>>2]:f,u?0|ar[4+f>>2]:255&l),(0|tr[c>>0])<0&&vu(0|ar[f>>2]),ne(f,e,r),We(n,(c=(l=0|tr[(u=11+f|0)>>0])<<24>>24<0)?0|ar[f>>2]:f,c?0|ar[4+f>>2]:255&l),(0|tr[u>>0])<0&&vu(0|ar[f>>2]),Ie(A,o),ar[n>>2]=4304,ar[t>>2]=4324,ar[o>>2]=4340,0<=(0|tr[11+i>>0]))return kf(o),Gf(),bf(t),void(ur=a);vu(0|ar[i>>2]),kf(o),Gf(),bf(t),ur=a},function(A,e,r){A|=0;var i,f=0;ur=(i=ur)+32|0,qA(f=i,e|=0,r|=0),(0|tr[(f=f+8|0)+11>>0])<0&&vu(0|ar[f>>2]),$A(A,e,r,0|FA(r)),ur=i},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a=0,c=0,l=0,u=0;if(ur=(o=ur)+160|0,a=o+136|0,n=(f=o)+56|0,t=f+4|0,ar[f>>2]=292,ar[n>>2]=312,Jf(f+56|0,t),ar[f+128>>2]=0,ar[f+132>>2]=-1,ar[f>>2]=4304,ar[n>>2]=4324,Sf(t),ar[t>>2]=4340,ar[(i=f+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[f+52>>2]=16,ar[a>>2]=0,ar[a+4>>2]=0,ar[a+8>>2]=0,Xe(t,a),(0|tr[a+11>>0])<0&&vu(0|ar[a>>2]),LA(a,e,r),We(f,(u=(l=0|tr[(c=a+11|0)>>0])<<24>>24<0)?0|ar[a>>2]:a,u?0|ar[a+4>>2]:255&l),(0|tr[c>>0])<0&&vu(0|ar[a>>2]),0<(0|ar[r>>2]))for(a=0;We(f,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(r=0|We(f,20144,10),We(0|We(r,(l=(u=0|tr[(c=e+56|0)+11>>0])<<24>>24<0)?0|ar[c>>2]:c,l?0|ar[e+60>>2]:255&u),30086,1),Ie(A,t),ar[f>>2]=4304,ar[n>>2]=4324,ar[t>>2]=4340,0<=(0|tr[11+i>>0]))return kf(t),Gf(),bf(n),void(ur=o);vu(0|ar[i>>2]),kf(t),Gf(),bf(n),ur=o},function(A,e,r){A|=0;var i,f,n=0,t=0;if(ur=(f=ur)+32|0,t=f+20|0,qA(n=f,e|=0,r|=0),(0|tr[(n=n+8|0)+11>>0])<0&&vu(0|ar[n>>2]),RA(t,r),(0|tr[(i=(n=e+56|0)+11|0)>>0])<0?(tr[ar[n>>2]>>0]=0,ar[e+60>>2]=0):(tr[n>>0]=0,tr[i>>0]=0),Cu(n,0),ar[n>>2]=ar[t>>2],ar[n+4>>2]=ar[t+4>>2],ar[n+8>>2]=ar[t+8>>2],!(0|tr[r+24>>0]))return r=0|ar[(e=56592)+4>>2],ar[(t=A)>>2]=ar[e>>2],ar[t+4>>2]=r,yu(A+8|0,56600),void(ur=f);ar[t>>2]=0,ar[t+4>>2]=0,ar[t+8>>2]=0,oo(A,2,100,t),ur=(0<=(0|tr[t+11>>0])||vu(0|ar[t>>2]),f)},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a,c=0,l=0,u=0;if(ur=(a=ur)+160|0,f=a+136|0,t=(n=a)+56|0,o=n+4|0,ar[n>>2]=292,ar[t>>2]=312,Jf(n+56|0,o),ar[n+128>>2]=0,ar[n+132>>2]=-1,ar[n>>2]=4304,ar[t>>2]=4324,Sf(o),ar[o>>2]=4340,ar[(i=n+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[n+52>>2]=16,ar[f>>2]=0,ar[4+f>>2]=0,ar[8+f>>2]=0,Xe(o,f),(0|tr[11+f>>0])<0&&vu(0|ar[f>>2]),LA(f,e,r),We(n,(u=(l=0|tr[(c=11+f|0)>>0])<<24>>24<0)?0|ar[f>>2]:f,u?0|ar[4+f>>2]:255&l),(0|tr[c>>0])<0&&vu(0|ar[f>>2]),0<(0|ar[r>>2]))for(c=0;We(n,18862,2),(0|(c=c+1|0))<(0|ar[r>>2]););if(l=0|We(n,20027,13),e=0|ar[(c=e+56|0)>>2],e=0|jb[127&ar[8+(0|ar[e>>2])>>2]](e),ar[f>>2]=0,ar[4+f>>2]=0,ar[8+f>>2]=0,tr[(u=11+f|0)>>0]=4,tr[4+f>>0]=0,tr[f>>0]=e>>>24,tr[1+f>>0]=e>>>16,tr[2+f>>0]=e>>>8,tr[3+f>>0]=e,We(0|We(l,f,4),30086,1),(0|tr[u>>0])<0&&vu(0|ar[f>>2]),(c=0|ar[c>>2])?(ns[127&ar[12+(0|ar[c>>2])>>2]](f,c,r),We(n,(r=(l=0|tr[(u=11+f|0)>>0])<<24>>24<0)?0|ar[f>>2]:f,r?0|ar[4+f>>2]:255&l),(0|tr[u>>0])<0&&vu(0|ar[f>>2])):We(n,20041,17),Ie(A,o),ar[n>>2]=4304,ar[t>>2]=4324,ar[o>>2]=4340,0<=(0|tr[11+i>>0]))return kf(o),Gf(),bf(t),void(ur=a);vu(0|ar[i>>2]),kf(o),Gf(),bf(t),ur=a},function(A,e,r){A|=0,e|=0;var i,f,n=0,t=0,o=0,a=0;if(ur=(f=ur)+48|0,t=(a=f)+20|0,o=0|ar[(r|=0)+12>>2],jA(r,0|tr[e+36>>0]?12:8),(n=0|ar[(i=e+56|0)>>2])||sr(20011,19104,1857,19563),UA(r,0|jb[127&ar[8+(0|ar[n>>2])>>2]](n)),n=0|ar[i>>2],ns[127&ar[16+(0|ar[n>>2])>>2]](a,n,r),0|ar[a>>2])return t=0|ar[(r=a)+4>>2],ar[(o=A)>>2]=ar[r>>2],ar[o+4>>2]=t,a=a+8|0,ar[(A=A+8|0)>>2]=ar[a>>2],ar[A+4>>2]=ar[a+4>>2],ar[A+8>>2]=ar[a+8>>2],ar[a>>2]=0,ar[a+4>>2]=0,ar[a+8>>2]=0,void(ur=f);KA(t,e,r,o),(0|tr[(e=t+8|0)+11>>0])<0&&vu(0|ar[e>>2]),t=0|ar[(r=56592)+4>>2],ar[(o=A)>>2]=ar[r>>2],ar[o+4>>2]=t,yu(A+8|0,56600),ur=(0<=(0|tr[a+8+11>>0])||vu(0|ar[a+8>>2]),f)},function(A,e,r){A|=0,e|=0;var i,f,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;ur=(f=ur)+64|0,b=f+40|0,l=f+36|0,o=f+24|0,i=f+16|0,n=f,t=0|FA(r|=0),ar[l>>2]=t;A:do{if(1886547814<=(0|t)){if((0|t)<1917403971)switch(0|t){case 1886547814:break;default:s=26;break A}else switch(0|t){case 1917403971:break;default:s=26;break A}if(0|NA(r,a=0|tb(0|(a=0|ob(0|ar[(a=e+8|0)>>2],0|ar[a+4>>2],0|ar[e+16>>2],0)),0|D,-4,-1),c=D))return ar[o>>2]=0,ar[o+4>>2]=0,ar[o+8>>2]=0,oo(A,2,100,o),0<=(0|tr[o+11>>0])||vu(0|ar[o>>2]),void(ur=f);if(ar[b>>2]=0,ar[(o=b+4|0)>>2]=0,(ar[b+8>>2]=0)|a)for((0|a)<0&&zl(),t=0|hu(a),ar[o>>2]=t,ar[b>>2]=t,ar[b+8>>2]=t+a,n=a;t=1+((tr[t>>0]=0)|ar[o>>2])|0,ar[o>>2]=t,0!=(0|(n=n+-1|0)););if(!(0==(0|a)&0==(0|c)))for(n=0;t=0|IA(r),tr[(0|ar[b>>2])+n>>0]=t,0<c>>>0|0==(0|c)&(n=n+1|0)>>>0<a>>>0;);fe(i,l,b),n=0|ar[i>>2],l=0|ar[(t=4+i|0)>>2],ar[i>>2]=0,ar[t>>2]=0,ar[e+56>>2]=n,n=0|ar[(e=e+60|0)>>2],ar[e>>2]=l,0|n&&(du(n),0|(u=0|ar[t>>2]))&&du(u),0|(n=0|ar[b>>2])&&((0|ar[o>>2])!=(0|n)&&(ar[o>>2]=n),vu(n))}else{switch(0|t){case 1852009592:break;default:s=26;break A}if(o=0|hu(24),ar[o+4>>2]=0,ar[o+8>>2]=0,ar[o>>2]=6064,ar[(t=o+12|0)>>2]=6092,or[o+16>>1]=2,or[o+18>>1]=2,or[o+20>>1]=6,tr[o+22>>0]=1,bu(o),ar[e+56>>2]=t,n=0|ar[(e=e+60|0)>>2],ar[e>>2]=o,0|n&&du(n),ie(A,t,r),0|ar[A>>2])return du(o),void(ur=f);(0|tr[(n=A+8|0)+11>>0])<0&&vu(0|ar[n>>2]),du(o)}}while(0);if(26==(0|s))return ar[n>>2]=0,ar[n+4>>2]=0,ar[n+8>>2]=0,oo(A,2,126,n),0<=(0|tr[n+11>>0])||vu(0|ar[n>>2]),void(ur=f);0|tr[r+24>>0]?(ar[b>>2]=0,ar[b+4>>2]=0,ar[b+8>>2]=0,oo(A,2,100,b),(0|tr[b+11>>0])<0&&vu(0|ar[b>>2])):(b=0|ar[(r=56592)+4>>2],ar[(s=A)>>2]=ar[r>>2],ar[s+4>>2]=b,yu(A+8|0,56600)),ur=f},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a,c,l=0,u=0;if(ur=(o=ur)+160|0,l=o+136|0,n=(f=o)+56|0,t=f+4|0,ar[f>>2]=292,ar[n>>2]=312,Jf(f+56|0,t),ar[f+128>>2]=0,ar[f+132>>2]=-1,ar[f>>2]=4304,ar[n>>2]=4324,Sf(t),ar[t>>2]=4340,ar[(i=f+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[f+52>>2]=16,ar[l>>2]=0,ar[l+4>>2]=0,ar[l+8>>2]=0,Xe(t,l),(0|tr[l+11>>0])<0&&vu(0|ar[l>>2]),LA(l,e,r),We(f,(c=(a=0|tr[(u=l+11|0)>>0])<<24>>24<0)?0|ar[l>>2]:l,c?0|ar[l+4>>2]:255&a),(0|tr[u>>0])<0&&vu(0|ar[l>>2]),0<(0|ar[r>>2]))for(l=0;We(f,18862,2),(0|(l=l+1|0))<(0|ar[r>>2]););if(We(f,19569,18),u=e+56|0,e=e+60|0,l=0|ar[u>>2],(0|ar[e>>2])!=(0|l))for(r=0;r&&(We(f,19588,1),l=0|ar[u>>2]),Pf(f,0|cr[l+r>>0]),r=r+1|0,l=0|ar[u>>2],r>>>0<((0|ar[e>>2])-l|0)>>>0;);if(We(f,30086,1),Ie(A,t),ar[f>>2]=4304,ar[n>>2]=4324,ar[t>>2]=4340,0<=(0|tr[11+i>>0]))return kf(t),Gf(),bf(n),void(ur=o);vu(0|ar[i>>2]),kf(t),Gf(),bf(n),ur=o},function(A,e,r){A|=0,e|=0;var i,f,n,t,o=0,a=0,c=0,l=0;if(ur=(t=ur)+32|0,c=t,l=0|ar[(r|=0)+12>>2],jA(r,0|tr[e+36>>0]?12:8),f=e+56|0,255<(i=(o=0|ar[(n=e+60|0)>>2])-(a=0|ar[f>>2])|0)>>>0&&sr(55739,19104,1919,19563),(0|a)==(0|o)&&sr(55739,19104,1919,19563),JA(r,255&i),o=0|ar[f>>2],(0|ar[n>>2])!=(0|o))for(a=0;JA(r,0|tr[o+a>>0]),a=a+1|0,o=0|ar[f>>2],a>>>0<((0|ar[n>>2])-o|0)>>>0;);KA(c,e,r,l),(0|tr[(o=c+8|0)+11>>0])<0&&vu(0|ar[o>>2]),c=0|ar[(r=56592)+4>>2],ar[(l=A)>>2]=ar[r>>2],ar[l+4>>2]=c,yu(A+8|0,56600),ur=t},function(A,e,r){A|=0;var i,f,n,t,o,a=0,c=0,l=0,u=0;if(ur=(o=ur)+48|0,u=o+32|0,qA(a=(c=o)+12|0,e|=0,r|=0),(0|tr[(a=a+8|0)+11>>0])<0&&vu(0|ar[a>>2]),0|NA(r,255&(f=0|IA(r)),0))return ar[c>>2]=0,ar[c+4>>2]=0,ar[c+8>>2]=0,oo(A,2,100,c),0<=(0|tr[c+11>>0])||vu(0|ar[c>>2]),void(ur=o);if(n=e+56|0,(t=255&f)>>>0<=(c=(i=0|ar[(a=e+60|0)>>2])-(e=0|ar[n>>2])|0)>>>0?t>>>0<c>>>0&&(0|i)!=(0|(l=e+t|0))&&(ar[a>>2]=l):TA(n,t-c|0),f<<24>>24)for(a=0;l=0|IA(r),tr[(0|ar[n>>2])+a>>0]=l,(0|(a=a+1|0))!=(0|t););0|tr[r+24>>0]?(ar[u>>2]=0,ar[u+4>>2]=0,ar[u+8>>2]=0,oo(A,2,100,u),(0|tr[u+11>>0])<0&&vu(0|ar[u>>2])):(r=0|ar[(l=56592)+4>>2],ar[(u=A)>>2]=ar[l>>2],ar[u+4>>2]=r,yu(A+8|0,56600)),ur=o},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a=0,c=0;if(ur=(o=ur)+160|0,a=o+136|0,n=(f=o)+56|0,t=f+4|0,ar[f>>2]=292,ar[n>>2]=312,Jf(f+56|0,t),ar[f+128>>2]=0,ar[f+132>>2]=-1,ar[f>>2]=4304,ar[n>>2]=4324,Sf(t),ar[t>>2]=4340,ar[(i=f+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[f+52>>2]=16,ar[a>>2]=0,ar[a+4>>2]=0,ar[a+8>>2]=0,Xe(t,a),(0|tr[a+11>>0])<0&&vu(0|ar[a>>2]),0<(0|ar[r>>2]))for(a=0;We(f,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(f,19818,18),c=0|We(0|xf(c,0|or[e+4>>1]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(c,19837,26),c=0|We(0|xf(c,0|or[e+6>>1]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(c=0|We(c,19864,21),c=0|We(0|xf(c,0|or[e+8>>1]),30086,1),0<(0|ar[r>>2]))for(a=0;We(c,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(r=0|We(c,19886,17),We(0|Hf(r,0!=(0|tr[e+10>>0])),30086,1),Ie(A,t),ar[f>>2]=4304,ar[n>>2]=4324,ar[t>>2]=4340,0<=(0|tr[11+i>>0]))return kf(t),Gf(),bf(n),void(ur=o);vu(0|ar[i>>2]),kf(t),Gf(),bf(n),ur=o},function(A,e,r){A|=0,MA(r|=0,0|or[(e|=0)+4>>1]),MA(r,0|or[e+6>>1]),MA(r,0|or[e+8>>1]),JA(r,0|tr[e+10>>0]?-128:0),e=0|ar[14149],ar[(r=A)>>2]=ar[14148],ar[r+4>>2]=e,yu(A+8|0,56600)},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n,t,o,a=0;if(ur=(o=ur)+160|0,a=o+136|0,n=(f=o)+56|0,t=f+4|0,ar[f>>2]=292,ar[n>>2]=312,Jf(f+56|0,t),ar[f+128>>2]=0,ar[f+132>>2]=-1,ar[f>>2]=4304,ar[n>>2]=4324,Sf(t),ar[t>>2]=4340,ar[(i=f+36|0)>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,ar[12+i>>2]=0,ar[f+52>>2]=16,ar[a>>2]=0,ar[a+4>>2]=0,ar[a+8>>2]=0,Xe(t,a),(0|tr[a+11>>0])<0&&vu(0|ar[a>>2]),0<(0|ar[r>>2]))for(a=0;We(f,18862,2),(0|(a=a+1|0))<(0|ar[r>>2]););if(r=0|We(f,19675,14),We(0|Lf(r,(0|ar[e+12>>2])-(0|ar[e+8>>2])|0),30086,1),Ie(A,t),ar[f>>2]=4304,ar[n>>2]=4324,ar[t>>2]=4340,0<=(0|tr[11+i>>0]))return kf(t),Gf(),bf(n),void(ur=o);vu(0|ar[i>>2]),kf(t),Gf(),bf(n),ur=o},function(A,e,r){A|=0,zA(r|=0,(e|=0)+8|0),e=0|ar[14149],ar[(r=A)>>2]=ar[14148],ar[r+4>>2]=e,yu(A+8|0,56600)},function(A,e,r){e|=0,r|=0;var i,f,n,t,o,a,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0;for(ur=(o=ur)+32|0,i=o+20|0,f=o+16|0,n=o+12|0,t=o,ar[(A|=0)>>2]=ar[1904],ar[A+4>>2]=ar[1905],ar[A+8>>2]=ar[1906],a=0|ar[e>>2],Wa(a=548+(a|=0)|0),Wa(a),tr[a>>0]=1,ar[r>>2]=0;;){if((ar[n>>2]=0)|Ee(0|ar[e>>2],n)){l=28;break}if(0|(m=0|Fe(0|ar[e>>2]))){for(0|(c=0|ar[r>>2])&&hl(c),l=0==(0|De(m)),Z=0|hu(80),ar[Z+4>>2]=0,ar[Z+8>>2]=0,ar[Z>>2]=6208,ar[(v=Z+12|0)>>2]=0,ar[v+4>>2]=0,ar[v+8>>2]=0,ar[v+12>>2]=0,ar[v+16>>2]=0,ar[Z+32>>2]=34395,ar[Z+36>>2]=0,ar[Z+40>>2]=0,ar[Z+44>>2]=99,ar[Z+48>>2]=99,w=Z+52|0,ar[(g=Z+72|0)>>2]=0,ar[Z+76>>2]=0,ar[w>>2]=0,ar[w+4>>2]=0,ar[w+8>>2]=0,ar[w+12>>2]=0,ar[Z+68>>2]=g,g=v,w=Z+16|0,bu(p=Z),su(Z),c=0|ar[w>>2],ar[v>>2]=g,ar[w>>2]=p,0|c&&ku(c),du(Z),yo(v,d=0|_e(m,0),s=0|Ye(m,0),l?2:0,w=0|De(m)),s=l?1:3,d=((w=0|Qe(m,0))+7|0)/8|0,b=0;;){if((0|Qe(m,b))!=(0|w)){l=10;break}if(k=0|Je(m,b,i),(0|(l=0|_e(m,b)))<1|(0|(h=0|Ye(m,b)))<1){l=12;break}if(!(0|Bo(v,c=0|ar[7628+(b<<2)>>2],l,h,w))){l=14;break}if(u=0|Fo(v,c,f),0<(0|h))for(l=0|br(l,d),c=0;hb(0|(y=u+(0|br(0|ar[f>>2],c))|0),k+(0|br(0|ar[i>>2],c))|0,0|l),(0|(c=c+1|0))!=(0|h););if((0|s)<=(0|(b=b+1|0))){l=20;break}}if(10==(0|l)?(l=0,ar[t>>2]=ar[1910],ar[t+4>>2]=ar[1911],ar[t+8>>2]=ar[1912]):12==(0|l)?(ar[t>>2]=ar[1913],ar[t+4>>2]=ar[1914],ar[t+8>>2]=ar[1915],l=18):14==(0|l)?(ar[t>>2]=ar[1916],ar[t+4>>2]=ar[1917],ar[t+8>>2]=ar[1918],l=18):20==(0|l)&&(c=(l=0)|hu(8),ar[c>>2]=0,ar[(y=c+4|0)>>2]=0,ar[r>>2]=c,bu(Z),ar[c>>2]=g,c=0|ar[y>>2],ar[y>>2]=p,0|c&&du(c),ar[t>>2]=ar[1904],ar[t+4>>2]=ar[1905],ar[t+8>>2]=ar[1906]),du(Z),ar[A>>2]=ar[t>>2],ar[A+4>>2]=ar[t+4>>2],ar[A+8>>2]=ar[t+8>>2],0|ar[A>>2]){l=28;break}c=0|hu(24),ar[c+4>>2]=0,ar[c+8>>2]=0,ar[c>>2]=6064,ar[(l=c+12|0)>>2]=6092,or[c+16>>1]=0,or[c+18>>1]=0,or[c+20>>1]=0,tr[c+22>>0]=1,jt(l),y=0|ar[ar[r>>2]>>2],bu(c),bu(c),ar[y+40>>2]=l,l=0|ar[(y=y+44|0)>>2],ar[y>>2]=c,0|l&&du(l),du(c),Re(0|ar[e>>2]),du(c)}if(!(0|ar[n>>2])){l=28;break}}28!=(0|l)||(ur=o)},function(A,e,r){A|=0,0|(A=0|ar[(e|=0)+4>>2])&&Bc(A),0|(A=0|ar[e+8>>2])&&Bc(A),(A=0|ar[e+12>>2])&&Bc(A)},function(A,e,r){var i,f,n,t;A|=0,e|=0,ur=(i=ur)+32|0,f=i,t=(n=0|tr[(r|=0)+11>>0])<<24>>24<0,function(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f|=0;var n,t,o,a,c=0,l=0,u=0;ur=(a=ur)+32|0,o=a,u=0|hu(132),ar[u+4>>2]=0,ar[u+8>>2]=0,ar[u>>2]=6364,co(c=u+12|0),ar[(n=e+60|0)>>2]=c,t=0|ar[(l=e+64|0)>>2],ar[l>>2]=u,t&&(du(t),c=0|ar[n>>2]);if(ko(o,c,r,i,f),0|ar[o>>2])return u=0|ar[(f=o)+4>>2],ar[(l=A)>>2]=ar[f>>2],ar[l+4>>2]=u,u=o+8|0,ar[(l=A+8|0)>>2]=ar[u>>2],ar[l+4>>2]=ar[u+4>>2],ar[l+8>>2]=ar[u+8>>2],ar[u>>2]=0,ar[u+4>>2]=0,ar[u+8>>2]=0,ur=a;if(function(A,e){A|=0;var r,i,f,n,t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p,y,B,E,X,W,I,C,G=0,V=0,F=0,R=0,N=0,_=0,Y=0,Q=0,D=0,J=0,M=0,T=0,U=0,S=0,O=0,z=0,j=0,H=0,x=0,P=0,L=0,K=0,q=0,$=0,AA=0,eA=0,rA=0,iA=0,fA=0,nA=0,tA=0,oA=0,aA=0,cA=0,lA=0,uA=0,bA=0,sA=0,dA=0,kA=0,hA=0,wA=0,vA=0,mA=0,gA=0,ZA=0,pA=0,yA=0,BA=0,EA=0,XA=0,WA=0,IA=0,CA=0,GA=0,VA=0,FA=0,RA=0,NA=0,_A=0,YA=0,QA=0,DA=0,JA=0,MA=0,TA=0,UA=0,SA=0,OA=0,zA=0,jA=0,HA=0,xA=0,PA=0,LA=0,KA=0,qA=0,$A=0,Ae=0,ee=0,re=0,ie=0,fe=0,ne=0,te=0,oe=0,ae=0,ce=0,le=0,ue=0,be=0,se=0,de=0,ke=0,he=0,we=0,ve=0,me=0,ge=0,Ze=0,pe=0,ye=0,Be=0,Ee=0;if(ur=(C=ur)+656|0,y=C+640|0,I=C+616|0,q=C+628|0,ye=C+604|0,Be=C+144|0,lA=(Ee=C)+592|0,uA=C+584|0,r=C+572|0,i=C+560|0,f=C+548|0,n=C+536|0,t=C+384|0,p=C+392|0,o=C+372|0,a=C+348|0,c=C+360|0,l=C+328|0,u=C+316|0,b=C+304|0,s=C+292|0,d=C+280|0,k=C+268|0,h=C+256|0,w=C+248|0,de=C+240|0,v=C+232|0,m=C+216|0,Ze=C+208|0,pe=C+200|0,B=C+188|0,E=C+176|0,X=C+168|0,vl(ge=28+(e|=0)|0,0|ar[(W=e+32|0)>>2]),ar[(P=e+36|0)>>2]=0,ar[ge>>2]=W,ar[W>>2]=0,F=0|ar[(L=e+40|0)>>2],(0|(G=0|ar[(K=e+44|0)>>2]))!=(0|F))for(;V=G+-8|0,ar[K>>2]=V,G=(G=0|ar[G+-4>>2])?(du(G),0|ar[K>>2]):V,(0|G)!=(0|F););ar[(H=e+52|0)>>2]=0,G=0|ar[(x=e+56|0)>>2],ar[x>>2]=0,0|G&&du(G);if(function(A,e){e|=0;var r,i,f,n,t,o=0,a=0,c=0;if(ur=(t=ur)+16|0,f=t,ar[(A|=0)>>2]=0,ar[(n=A+4|0)>>2]=0,((ar[A+8>>2]=0)|(o=0|ar[e+108>>2]))!=(0|(r=e+112|0))){for(i=A+8|0,c=o,a=o=0;;){if(e=0|ar[56+(0|ar[c+20>>2])>>2],ar[f>>2]=e,o>>>0<a>>>0?(ar[o>>2]=e,ar[n>>2]=o+4):Ce(A,f),e=0|ar[c+4>>2])for(;o=0|ar[e>>2];)e=o;else if(e=0|ar[(o=c+8|0)>>2],(0|ar[e>>2])!=(0|c))for(;c=0|ar[o>>2],e=0|ar[(o=c+8|0)>>2],(0|ar[e>>2])!=(0|c););if((0|e)==(0|r))break;c=e,o=0|ar[n>>2],a=0|ar[i>>2]}ur=t}else ur=t}(I,0|ar[(g=e+60|0)>>2]),G=0|ar[I>>2],M=0|ar[(Z=4+I|0)>>2],(0|G)!=(0|M)){T=11+y|0,O=U=4+y|0,z=(S=e)+32|0,j=e+48|0;do{J=0|ar[G>>2],N=112+(0|ar[g>>2])|0,F=0|ar[N>>2];do{if(0|F){V=N;A:for(;;){for(R=F;!((0|ar[R+16>>2])>>>0>=J>>>0);){if(!(F=0|ar[R+4>>2]))break A;R=F}if(!(F=0|ar[R>>2])){V=R;break}V=R}if((0|V)!=(0|N)&&(0|ar[V+16>>2])>>>0<=J>>>0){if(F=0|ar[V+20>>2],V=0|ar[V+24>>2],D=V?(bu(V),V):0,!(Q=F)){if(!D)break;du(D);break}yu(y,Q+64|0),F=0|tr[T>>0],V=0|ar[U>>2],4==(0|(F<<24>>24<0?V:255&F))?0|Yu(y,0,-1,30298,4)?(F=0|tr[T>>0],V=0|ar[U>>2],me=23):V=1:me=23;do{if(23==(0|me)){if(4==((me=0)|(F<<24>>24<0?V:255&F))){if(!(0|Yu(y,0,-1,30303,4))){V=1;break}F=0|tr[T>>0],V=0|ar[U>>2]}if(4==(0|(F<<24>>24<0?V:255&F))){if(!(0|Yu(y,0,-1,30308,4))){V=1;break}F=0|tr[T>>0],V=0|ar[U>>2]}if(4==(0|(F<<24>>24<0?V:255&F))){if(!(0|Yu(y,0,-1,30313,4))){V=1;break}F=0|tr[T>>0],V=0|ar[U>>2]}V=4==(0|(F<<24>>24<0?V:255&F))?0==(0|Yu(y,0,-1,30318,4)):0}}while(0);if((0|tr[T>>0])<0&&vu(0|ar[y>>2]),V){for(Y=0|hu(232),ar[Y+4>>2]=0,ar[Y+8>>2]=0,ar[Y>>2]=6392,ar[(V=Y+16|0)>>2]=0,ar[V+4>>2]=0,ar[V+8>>2]=0,ar[Y+28>>2]=30025,ar[Y+32>>2]=S,ar[Y+36>>2]=J,ve=Y+60|0,rA=Y+80|0,iA=Y+96|0,F=Y+176|0,R=Y+112|0,ar[(we=Y+40|0)>>2]=0,ar[we+4>>2]=0,ar[we+8>>2]=0,ar[we+12>>2]=0,or[we+16>>1]=0,ar[ve>>2]=0,ar[ve+4>>2]=0,ar[ve+8>>2]=0,ar[ve+12>>2]=0,or[ve+16>>1]=0,ar[rA>>2]=0,ar[rA+4>>2]=0,ar[rA+8>>2]=0,tr[rA+12>>0]=0,ar[iA>>2]=0,ar[iA+4>>2]=0,ar[iA+8>>2]=0,tr[iA+12>>0]=0,rA=(iA=R)+60|0;((ar[iA>>2]=0)|(iA=iA+4|0))<(0|rA););for(tr[R+60>>0]=0,rA=(iA=F)+52|0;((ar[iA>>2]=0)|(iA=iA+4|0))<(0|rA););ar[y>>2]=V,ar[O>>2]=Y,N=V,bu(_=Y),V=0|ar[W>>2];do{if(V){for(R=z;;)if(F=0|ar[V+16>>2],J>>>0<F>>>0){if(!(F=0|ar[V>>2])){me=41;break}R=V,V=F}else{if(J>>>0<=F>>>0){me=45;break}if(!(F=0|ar[(R=V+4|0)>>2])){me=44;break}V=F}if(41==(0|me)){me=0,R=F=V;break}if(44==(0|me)){me=0,F=V;break}if(45==(0|me)){me=0,F=V;break}}else R=F=W}while(0);0|ar[R>>2]?du(Y):(V=0|hu(28),ar[V+16>>2]=J,ar[V+20>>2]=N,ar[V+24>>2]=_,ar[V>>2]=0,ar[V+4>>2]=0,ar[V+8>>2]=F,ar[R>>2]=V,(F=0|ar[ar[ge>>2]>>2])&&(ar[ge>>2]=F,V=0|ar[R>>2]),so(0|ar[z>>2],V),ar[P>>2]=1+(0|ar[P>>2]));do{if(!(0|tr[Q+124>>0])){do{if((0|J)==(0|ar[56+(0|ar[84+(0|ar[g>>2])>>2])>>2])){if(V=0|ar[y>>2],tr[V+40>>0]=1,0|(F=0|ar[O>>2])&&bu(F),ar[H>>2]=V,V=0|ar[x>>2],ar[x>>2]=F,!V)break;du(V)}}while(0);if((0|(V=0|ar[K>>2]))==(0|ar[j>>2])){kl(L,y);break}ar[V>>2]=ar[y>>2],F=0|ar[O>>2],(ar[V+4>>2]=F)&&(bu(F),V=0|ar[K>>2]),ar[K>>2]=V+8}}while(0);0|(V=0|ar[O>>2])&&du(V)}0|D&&du(D)}}}while(0);G=G+4|0}while((0|G)!=(0|M))}A:do{if(0|ar[H>>2]){if((0|(G=0|ar[ge>>2]))!=(0|W))for(M=ye+4|0,T=ye+8|0,U=uA+4|0,S=e+72|0,j=Ee+12|0,H=Ee+4|0,x=O=Ee+64|0,P=Ee+136|0,L=Ee+140|0,q=Ee+60|0,$=11+y|0,AA=z=Ee+8|0,eA=e+76|0,rA=lA+11|0,iA=(K=Ee+44|0)+11|0,nA=(fA=Be+8|0)+11|0,tA=A+8|0,J=G;;){if(Q=J+20|0,ar[ye>>2]=0,ar[M>>2]=0,ar[T>>2]=0,vo(Be,0|ar[g>>2],0|ar[J+16>>2],ye),0|ar[Be>>2])ve=0|ar[(we=Be)+4>>2],ar[(G=A)>>2]=ar[we>>2],ar[G+4>>2]=ve,ar[tA>>2]=ar[fA>>2],ar[tA+4>>2]=ar[fA+4>>2],ar[tA+8>>2]=ar[fA+8>>2],ar[fA>>2]=0,ar[fA+4>>2]=0,ar[fA+8>>2]=0,G=1;else{G=0|ar[ye>>2],D=0|ar[M>>2];e:do{if((0|G)==(0|D))G=6;else for(N=0;;){V=0|ar[(_=G+4|0)>>2];do{if(0!=(0|V)&&0!=(0|(oA=0|qu(V,128,872,0)))){if((V=0|ar[G+8>>2])?bu(V):V=0,F=0|ar[oA+56>>2],R=0|ar[oA+60>>2],F>>>0<=(0|ar[S>>2])>>>0&&R>>>0<=(0|ar[eA>>2])>>>0){Y=0|ar[Q>>2],ar[Y+24>>2]=F,ar[Y+28>>2]=R,ar[Y+32>>2]=F,ar[Y+36>>2]=R,Y=V,me=94;break}ar[z>>2]=4524,ar[Ee>>2]=188,ar[O>>2]=208,ar[H>>2]=0,Jf(x,j),ar[P>>2]=0,ar[L>>2]=-1,ar[Ee>>2]=4504,ar[O>>2]=4544,ar[z>>2]=4524,Sf(j),ar[j>>2]=4340,ar[K>>2]=0,ar[K+4>>2]=0,ar[K+8>>2]=0,ar[K+12>>2]=0,ar[q>>2]=24,ar[y>>2]=0,ar[4+y>>2]=0,ar[8+y>>2]=0,Xe(j,y),(0|tr[$>>0])<0&&vu(0|ar[y>>2]),ve=0|We(0|Lf(0|We(0|Lf(0|We(AA,30366,11),F),30170,1),R),30378,32),ve=0|We(0|Lf(ve,0|ar[S>>2]),30170,1),We(0|Lf(ve,0|ar[eA>>2]),30086,1),Ie(lA,j),oo(A,6,1e3,lA),(0|tr[rA>>0])<0&&vu(0|ar[lA>>2]),ar[Ee>>2]=4504,ar[O>>2]=4544,ar[AA>>2]=4524,ar[j>>2]=4340,(0|tr[iA>>0])<0&&vu(0|ar[K>>2]),kf(j),bf(O),R=1,F=N}else me=83}while(0);if(83==(0|me)&&(me=N?(Y=0,94):(Y=F=0,109)),94==(0|me))if(V=(me=0)|ar[_>>2]){F=(F=0|qu(V,128,744,0))?((V=0|ar[G+8>>2])?bu(V):V=0,me=0|ar[Q>>2],ve=0|eo(F),F=0|ro(F),ar[me+24>>2]=ve,ar[me+28>>2]=F,V):0,V=0|ar[_>>2];do{if(0|V&&0|(aA=0|qu(V,128,808,0))){switch((V=0|ar[G+8>>2])?bu(V):V=0,0|ar[aA+56>>2]){case 270:case 90:we=0|ar[Q>>2],me=we+28|0,ve=0|ar[(we=we+24|0)>>2],ar[we>>2]=ar[me>>2],ar[me>>2]=ve}if(!V)break;du(V)}}while(0);me=(F=(F&&du(F),1),109)}else R=0,F=1,V=Y;do{if(109==(0|me))if((me=0)!=(0|(V=0|ar[_>>2]))&&0!=(0|(cA=0|qu(V,128,384,0)))){if((V=0|ar[G+8>>2])?bu(V):V=0,R=0|ar[cA+56>>2],N=0|ar[cA+60>>2],Zl(R=((_=0==(0|N))?(ve=0|ar[Q>>2],ar[uA>>2]=R,ar[U>>2]=0):(bu(N),ve=0|ar[Q>>2],ar[uA>>2]=R,bu(ar[U>>2]=N)),ve),uA),0|(R=0|ar[U>>2])&&du(R),_||du(N),!V){R=0,V=Y;break}du(V),R=0,V=Y}else R=0,V=Y}while(0);if(0|V&&du(V),G=G+12|0,0|R){G=1;break e}if((0|G)==(0|D)){G=6;break}N=F}}while(0);G=6==(0|G)?0:G,(0|tr[nA>>0])<0&&vu(0|ar[fA>>2])}if(0|(V=0|ar[ye>>2])){if((0|(F=0|ar[M>>2]))!=(0|V)){for(;R=F+-12|0,ar[M>>2]=R,(0|(F=(F=0|ar[F+-4>>2])?(du(F),0|ar[M>>2]):R))!=(0|V););V=0|ar[ye>>2]}vu(V)}if(0|G)break A;if(G=0|ar[J+4>>2])for(;V=0|ar[G>>2];)G=V;else if(G=0|ar[(V=J+8|0)>>2],(0|ar[G>>2])!=(0|J))for(;ve=0|ar[V>>2],G=0|ar[(V=ve+8|0)>>2],(0|ar[G>>2])!=(0|ve););if((0|G)==(0|W))break;J=G}we=0|ar[g>>2],ke=0|ar[we+76>>2],we=0|ar[we+80>>2],(ve=0==(0|we))||bu(we),he=0!=(0|ke);e:do{if(he&&(bA=0|ar[ge>>2],(0|bA)!=(0|W))){S=ye+4|0,z=8+i|0,j=4+i|0,H=11+i|0,x=8+n|0,P=4+n|0,L=11+n|0,K=4+t|0,q=8+f|0,$=4+f|0,AA=11+f|0,fA=8+r|0,nA=4+r|0,tA=11+r|0,oA=Be+4|0,aA=Be+8|0,uA=12+p|0,dA=cA=64+p|0,kA=136+p|0,hA=140+p|0,vA=60+p|0,mA=11+y|0,ZA=11+o|0,pA=(wA=44+p|0)+11|0,yA=O=4+y|0,XA=8+u|0,WA=4+u|0,IA=11+u|0,CA=8+b|0,GA=4+b|0,VA=11+b|0,NA=8+s|0,_A=4+s|0,YA=11+s|0,QA=8+d|0,DA=4+d|0,JA=11+d|0,MA=RA=EA=sA=4+p|0,SA=8+c|0,zA=(OA=8+l|0)+11|0,jA=TA=gA=lA=8+p|0,HA=FA=BA=11+p|0,xA=8+k|0,PA=4+k|0,LA=11+k|0,KA=8+h|0,qA=4+h|0,$A=11+h|0,Ae=4+w|0,ee=de+4|0,fe=re=11+c|0,ne=ie=UA=4+c|0,te=11+l|0,oe=4+l|0,ae=8+a|0,ce=4+a|0,le=11+a|0,be=(ue=Ee+8|0)+11|0,se=A+8|0;r:for(;;){if(io(ye,ke,0|ar[20+(0|ar[(M=bA+20|0)>>2])>>2]),V=0|ar[ye>>2],T=0|ar[S>>2],(0|V)==(0|T))G=10;else{U=bA+24|0;i:for(;;){G=0|ar[V+20>>2];f:do{if((0|G)<1953000802){switch(0|G){case 1635088492:break;default:break f}if(ar[Be>>2]=0,ar[oA>>2]=0,ar[aA>>2]=0,vo(Ee,0|ar[g>>2],0|ar[20+(0|ar[M>>2])>>2],Be),0|ar[Ee>>2])iA=0|ar[(rA=Ee)+4>>2],ar[(G=A)>>2]=ar[rA>>2],ar[G+4>>2]=iA,ar[se>>2]=ar[ue>>2],ar[se+4>>2]=ar[ue+4>>2],ar[se+8>>2]=ar[ue+8>>2],ar[ue>>2]=0,ar[ue+4>>2]=0,ar[ue+8>>2]=0,G=1;else{G=0|ar[Be>>2],Q=0|ar[oA>>2];do{if((0|G)==(0|Q))F=0,me=197;else{for(F=Y=0;;){R=0|ar[G+4>>2];do{if(R){if(!(_=0|qu(R,128,840,0))){R=Y;break}R=_,(N=0|ar[G+8>>2])?bu(N):N=0;do{if(_){if(0|(_=N)&&bu(N),!F){F=_;break}du(F),F=_}else R=Y}while(0);if(!N)break;du(N)}else R=Y}while(0);if((0|(G=G+12|0))==(0|Q))break;Y=R}if(!(D=R)){me=197;break}Ge(y,V+52|0);n:do{if(4==((0|ar[yA>>2])-(0|ar[y>>2])|0)){yu(p,J=D+56|0),25==(0|((iA=0|tr[BA>>0])<<24>>24<0?0|ar[EA>>2]:255&iA))&&0==(0|Yu(p,0,-1,30621,25))?G=1:(yu(c,J),26==(0|((iA=0|tr[fe>>0])<<24>>24<0?0|ar[ne>>2]:255&iA))&&0==(0|Yu(c,0,-1,30647,26))?G=1:(yu(l,J),43==(0|((R=0|tr[te>>0])<<24>>24<0?0|ar[oe>>2]:255&R))?(G=0==(0|Yu(l,0,-1,30674,43)),R=0|tr[te>>0]):G=0,R<<24>>24<0&&vu(0|ar[l>>2])),(0|tr[fe>>0])<0&&vu(0|ar[c>>2])),(0|tr[BA>>0])<0&&vu(0|ar[p>>2]);t:do{if(G){R=0|ar[W>>2];do{if(0|R){_=0|ar[ar[y>>2]>>2],G=W;o:for(;;){for(N=R;!((0|ar[N+16>>2])>>>0>=_>>>0);){if(!(R=0|ar[N+4>>2]))break o;N=R}if(!(R=0|ar[N>>2])){G=N;break}G=N}if((0|G)==(0|W))break;if(_>>>0<(0|ar[G+16>>2])>>>0)break;_=0|ar[G+20>>2],Y=0|ar[G+24>>2],(Q=0==(0|Y))||bu(Y),G=0|ar[M>>2],R=G;do{if((0|G)==(0|_)){for(ar[b>>2]=0,ar[4+b>>2]=0,ar[8+b>>2]=0,G=0|hu(32),ar[b>>2]=G,ar[CA>>2]=-2147483616,ar[GA>>2]=30,eA=30754,rA=(iA=G)+30|0;tr[iA>>0]=0|tr[eA>>0],eA=eA+1|0,(0|(iA=iA+1|0))<(0|rA););if(tr[G+30>>0]=0,oo(A,2,2e3,b),0<=(0|tr[VA>>0])){G=1;break}vu(0|ar[b>>2]),G=1}else{if((0|ar[G+24>>2])!=(0|ar[_+24>>2])){G=0;break}if((0|ar[G+28>>2])!=(0|ar[_+28>>2])){G=0;break}if(N=0|ar[ar[y>>2]>>2],tr[G+60>>0]=1,ar[G+64>>2]=N,tr[G+61>>0]=1,0|(N=0|ar[U>>2])&&bu(N),ar[_+68>>2]=R,G=0|ar[(iA=_+72|0)>>2],ar[iA>>2]=N,!G){G=0;break}du(G),G=0}}while(0);if(Q||du(Y),G){G=1;break n}break t}}while(0);for(ar[u>>2]=0,ar[4+u>>2]=0,ar[8+u>>2]=0,G=0|hu(48),ar[u>>2]=G,ar[XA>>2]=-2147483600,ar[WA>>2]=35,eA=30718,rA=(iA=G)+35|0;tr[iA>>0]=0|tr[eA>>0],eA=eA+1|0,(0|(iA=iA+1|0))<(0|rA););if(tr[G+35>>0]=0,oo(A,2,2e3,u),0<=(0|tr[IA>>0])){G=1;break n}vu(0|ar[u>>2]),G=1;break n}}while(0);yu(p,J),26==(0|((iA=0|tr[FA>>0])<<24>>24<0?0|ar[RA>>2]:255&iA))&&0==(0|Yu(p,0,-1,30785,26))?G=1:(yu(c,J),43==(0|((R=0|tr[re>>0])<<24>>24<0?0|ar[ie>>2]:255&R))?(G=0==(0|Yu(c,0,-1,30812,43)),R=0|tr[re>>0]):G=0,R<<24>>24<0&&vu(0|ar[c>>2])),(0|tr[FA>>0])<0&&vu(0|ar[p>>2]);t:do{if(G){Y=0|ar[M>>2],G=0|ar[y>>2],N=0|ar[G>>2],tr[Y+76>>0]=1,ar[Y+80>>2]=N,N=0|ar[W>>2],Q=Y;do{if(0|N){_=0|ar[G>>2],G=W;o:for(;;){for(R=N;!((0|ar[R+16>>2])>>>0>=_>>>0);)if(!(R=0|ar[R+4>>2]))break o;if(!(N=0|ar[R>>2])){G=R;break}G=R}if((0|G)==(0|W))break;if(_>>>0<(0|ar[G+16>>2])>>>0)break;if(G=0|ar[G+20>>2],(0|Y)==(0|G)){for(ar[d>>2]=0,ar[4+d>>2]=0,ar[8+d>>2]=0,G=0|hu(32),ar[d>>2]=G,ar[QA>>2]=-2147483616,ar[DA>>2]=30,eA=30892,rA=(iA=G)+30|0;tr[iA>>0]=0|tr[eA>>0],eA=eA+1|0,(0|(iA=iA+1|0))<(0|rA););if(tr[G+30>>0]=0,oo(A,2,2e3,d),0<=(0|tr[JA>>0])){G=1;break n}vu(0|ar[d>>2]),G=1;break n}if(0|(R=0|ar[U>>2])&&bu(R),ar[G+84>>2]=Q,G=0|ar[(iA=G+88|0)>>2],ar[iA>>2]=R,0|G&&du(G),ar[p>>2]=0,ar[MA>>2]=0,ar[TA>>2]=0,R=0|ar[D+68>>2],0|(G=(0|ar[D+72>>2])-R|0)){if((0|G)<0)break r;rA=0|hu(G),ar[MA>>2]=rA,ar[p>>2]=rA,iA=rA+G|0,ar[jA>>2]=iA,hb(0|rA,0|R,0|G),ar[MA>>2]=iA}if(ar[c>>2]=0,ar[UA>>2]=0,ar[SA>>2]=0,Vl(l,p,c),G=0|ar[c>>2],_=0|ar[UA>>2],(0|G)!=(0|_))do{R=0|ar[G>>2];do{if(0|R){if(!(N=0|qu(R,1472,1480,0)))break;for((R=0|ar[G+4>>2])?bu(R):R=0,iA=0|ar[M>>2],tr[iA+92>>0]=1,eA=N+8|0,rA=(iA=iA+96|0)+56|0;ar[iA>>2]=ar[eA>>2],eA=eA+4|0,(0|(iA=iA+4|0))<(0|rA););if(!R)break;du(R)}}while(0);G=G+8|0}while((0|G)!=(0|_));if((0|tr[zA>>0])<0&&vu(0|ar[OA>>2]),0|(G=0|ar[c>>2])){if((0|(R=0|ar[UA>>2]))!=(0|G)){for(;N=R+-8|0,ar[UA>>2]=N,(0|(R=(R=0|ar[R+-4>>2])?(du(R),0|ar[UA>>2]):N))!=(0|G););G=0|ar[c>>2]}vu(G)}0|(G=0|ar[p>>2])&&((0|ar[MA>>2])!=(0|G)&&(ar[MA>>2]=G),vu(G));break t}}while(0);for(ar[s>>2]=0,ar[4+s>>2]=0,ar[8+s>>2]=0,G=0|hu(48),ar[s>>2]=G,ar[NA>>2]=-2147483600,ar[_A>>2]=35,eA=30856,rA=(iA=G)+35|0;tr[iA>>0]=0|tr[eA>>0],eA=eA+1|0,(0|(iA=iA+1|0))<(0|rA););if(tr[G+35>>0]=0,oo(A,2,2e3,s),0<=(0|tr[YA>>0])){G=1;break n}vu(0|ar[s>>2]),G=1;break n}}while(0);iA=0|ar[M>>2],rA=0|ar[ar[y>>2]>>2],yu(p,J),tr[iA+156>>0]=1,ar[iA+152>>2]=rA,Eu(iA+160|0,p),(0|tr[HA>>0])<0&&vu(0|ar[p>>2]),R=0|ar[W>>2];do{if(0|R){_=0|ar[ar[y>>2]>>2],G=W;t:for(;;){for(N=R;!((0|ar[N+16>>2])>>>0>=_>>>0);){if(!(R=0|ar[N+4>>2]))break t;N=R}if(!(R=0|ar[N>>2])){G=N;break}G=N}if((0|G)==(0|W))break;if(_>>>0<(0|ar[G+16>>2])>>>0)break;if(R=0|ar[M>>2],N=0|ar[G+20>>2],(0|R)==(0|N)){for(ar[h>>2]=0,ar[4+h>>2]=0,ar[8+h>>2]=0,G=0|hu(32),ar[h>>2]=G,ar[KA>>2]=-2147483616,ar[qA>>2]=28,eA=30957,rA=(iA=G)+28|0;tr[iA>>0]=0|tr[eA>>0],eA=eA+1|0,(0|(iA=iA+1|0))<(0|rA););if(tr[G+28>>0]=0,oo(A,2,2e3,h),0<=(0|tr[$A>>0])){G=1;break n}vu(0|ar[h>>2]),G=1;break n}ar[w>>2]=R,G=0|ar[U>>2],0|(ar[Ae>>2]=G)&&bu(G),R=0|ar[(G=N+176|0)>>2];do{if(R>>>0<(0|ar[N+180>>2])>>>0)ar[R>>2]=ar[w>>2],ar[R+4>>2]=ar[Ae>>2],ar[w>>2]=0,ar[Ae>>2]=0,ar[G>>2]=R+8;else{if(yl(N+172|0,w),!(G=0|ar[Ae>>2]))break;du(G)}}while(0);if(ar[de>>2]=ar[M>>2],G=0|ar[U>>2],ar[ee>>2]=G){bu(G),pl(e,de),du(G),G=0;break n}pl(e,de),G=0;break n}}while(0);for(ar[k>>2]=0,ar[4+k>>2]=0,ar[8+k>>2]=0,G=0|hu(48),ar[k>>2]=G,ar[xA>>2]=-2147483600,ar[PA>>2]=33,eA=30923,rA=(iA=G)+33|0;tr[iA>>0]=0|tr[eA>>0],eA=eA+1|0,(0|(iA=iA+1|0))<(0|rA););if(tr[G+33>>0]=0,oo(A,2,2e3,k),0<=(0|tr[LA>>0])){G=1;break}vu(0|ar[k>>2]),G=1}else{for(ar[a>>2]=0,ar[4+a>>2]=0,ar[8+a>>2]=0,G=0|hu(48),ar[a>>2]=G,ar[ae>>2]=-2147483600,ar[ce>>2]=35,eA=30585,rA=(iA=G)+35|0;tr[iA>>0]=0|tr[eA>>0],eA=eA+1|0,(0|(iA=iA+1|0))<(0|rA););if(tr[G+35>>0]=0,oo(A,2,0,a),0<=(0|tr[le>>0])){G=1;break}vu(0|ar[a>>2]),G=1}}while(0);0|(R=0|ar[y>>2])&&((0|(N=0|ar[yA>>2]))!=(0|R)&&(ar[yA>>2]=N+(~((N+-4-R|0)>>>2)<<2)),vu(R))}}while(0);197==(0|me)&&(me=0,ar[lA>>2]=4524,ar[p>>2]=188,ar[cA>>2]=208,ar[sA>>2]=0,Jf(dA,uA),ar[kA>>2]=0,ar[hA>>2]=-1,ar[p>>2]=4504,ar[cA>>2]=4544,ar[lA>>2]=4524,Sf(uA),ar[uA>>2]=4340,ar[wA>>2]=0,ar[wA+4>>2]=0,ar[wA+8>>2]=0,ar[wA+12>>2]=0,ar[vA>>2]=24,ar[y>>2]=0,ar[4+y>>2]=0,ar[8+y>>2]=0,Xe(uA,y),(0|tr[mA>>0])<0&&vu(0|ar[y>>2]),Lf(iA=0|We(gA,30557,27),0|ar[20+(0|ar[M>>2])>>2]),Ie(o,uA),oo(A,2,123,o),(0|tr[ZA>>0])<0&&vu(0|ar[o>>2]),ar[p>>2]=4504,ar[cA>>2]=4544,ar[gA>>2]=4524,ar[uA>>2]=4340,(0|tr[pA>>0])<0&&vu(0|ar[wA>>2]),kf(uA),bf(cA),G=1),F&&du(F)}if((0|tr[be>>0])<0&&vu(0|ar[ue>>2]),0|(F=0|ar[Be>>2])){if((0|(R=0|ar[oA>>2]))!=(0|F)){for(;N=R+-12|0,ar[oA>>2]=N,(0|(R=(R=0|ar[R+-4>>2])?(du(R),0|ar[oA>>2]):N))!=(0|F););F=0|ar[Be>>2]}vu(F)}if(0|G)break i}else{switch(0|G){case 1953000802:break;default:break f}Ge(y,V+52|0),iA=0|ar[y>>2],G=iA;n:do{if(4==((0|ar[O>>2])-iA|0)){_=0|ar[M>>2],R=0|ar[G>>2],tr[_+41>>0]=1,ar[_+44>>2]=R,R=0|ar[W>>2],Y=_;do{if(0|R){N=0|ar[G>>2],G=W;t:for(;;){for(F=R;!((0|ar[F+16>>2])>>>0>=N>>>0);)if(!(F=0|ar[F+4>>2]))break t;if(!(R=0|ar[F>>2])){G=F;break}G=F}if((0|G)==(0|W))break;if(N>>>0<(0|ar[G+16>>2])>>>0)break;if(F=0|ar[G+20>>2],0|tr[F+41>>0]){for(ar[f>>2]=0,ar[4+f>>2]=0,ar[8+f>>2]=0,G=0|hu(48),ar[f>>2]=G,ar[q>>2]=-2147483600,ar[$>>2]=38,eA=30483,rA=(iA=G)+38|0;tr[iA>>0]=0|tr[eA>>0],eA=eA+1|0,(0|(iA=iA+1|0))<(0|rA););if(tr[G+38>>0]=0,oo(A,2,2e3,f),0<=(0|tr[AA>>0])){G=1;break n}vu(0|ar[f>>2]),G=1;break n}if((0|_)==(0|F)){for(ar[n>>2]=0,ar[4+n>>2]=0,ar[8+n>>2]=0,G=0|hu(48),ar[n>>2]=G,ar[x>>2]=-2147483600,ar[P>>2]=34,eA=30522,rA=(iA=G)+34|0;tr[iA>>0]=0|tr[eA>>0],eA=eA+1|0,(0|(iA=iA+1|0))<(0|rA););if(tr[G+34>>0]=0,oo(A,2,2e3,n),0<=(0|tr[L>>0])){G=1;break n}vu(0|ar[n>>2]),G=1;break n}if((0|(G=0|ar[(R=F+52|0)>>2]))==(0|ar[F+56>>2])?kl(F+48|0,M):(ar[G>>2]=Y,F=0|ar[U>>2],(ar[G+4>>2]=F)&&(bu(F),G=0|ar[R>>2]),ar[R>>2]=G+8),ar[t>>2]=ar[M>>2],G=0|ar[U>>2],ar[K>>2]=G){bu(G),pl(e,t),du(G),G=0;break n}pl(e,t),G=0;break n}}while(0);for(ar[i>>2]=0,ar[4+i>>2]=0,ar[8+i>>2]=0,G=0|hu(48),ar[i>>2]=G,ar[z>>2]=-2147483600,ar[j>>2]=41,eA=30441,rA=(iA=G)+41|0;tr[iA>>0]=0|tr[eA>>0],eA=eA+1|0,(0|(iA=iA+1|0))<(0|rA););tr[G+41>>0]=0,oo(A,2,2e3,i),G=((0|tr[H>>0])<0&&vu(0|ar[i>>2]),1)}else{for(ar[r>>2]=0,ar[4+r>>2]=0,ar[8+r>>2]=0,G=0|hu(32),ar[r>>2]=G,ar[fA>>2]=-2147483616,ar[nA>>2]=29,eA=30411,rA=(iA=G)+29|0;tr[iA>>0]=0|tr[eA>>0],eA=eA+1|0,(0|(iA=iA+1|0))<(0|rA););tr[G+29>>0]=0,oo(A,2,0,r),G=((0|tr[tA>>0])<0&&vu(0|ar[r>>2]),1)}}while(0);if(0|(F=0|ar[y>>2])&&((0|(R=0|ar[O>>2]))!=(0|F)&&(ar[O>>2]=R+(~((R+-4-F|0)>>>2)<<2)),vu(F)),0|G){G=1;break i}}}while(0);if((0|(V=V+64|0))==(0|T)){G=10;break}}V=0|ar[ye>>2]}if(Y=10==(0|G)?0:G,0|V){if((0|(G=0|ar[S>>2]))==(0|V))G=V;else{for(;F=G+-64|0,ar[S>>2]=F,0|(R=0|ar[G+-12>>2])&&((0|(_=0|ar[(N=G+-8|0)>>2]))!=(0|R)&&(ar[N>>2]=_+(~((_+-4-R|0)>>>2)<<2)),vu(R)),ar[F>>2]=4264,0|(F=0|ar[G+-40>>2])&&((0|ar[(G=G+-36|0)>>2])!=(0|F)&&(ar[G>>2]=F),vu(F)),(0|(G=0|ar[S>>2]))!=(0|V););G=0|ar[ye>>2]}vu(G)}switch(0|Y){case 8:me=362;break e;case 0:break;default:break e}if(G=0|ar[bA+4>>2])for(;V=0|ar[G>>2];)G=V;else if(G=0|ar[(V=bA+8|0)>>2],(0|ar[G>>2])!=(0|bA))for(;bA=0|ar[V>>2],G=0|ar[(V=bA+8|0)>>2],(0|ar[G>>2])!=(0|bA););if((0|G)==(0|W)){me=362;break e}bA=G}zl()}else me=362}while(0);e:do{if(362==(0|me)){G=0|ar[ge>>2];r:do{if((0|G)!=(0|W)){for(Q=11+y|0,J=D=4+y|0,M=4+v|0,T=8+m|0,U=4+m|0,S=11+m|0,Y=G;;){if(R=0|ar[20+(0|ar[(_=Y+20|0)>>2])>>2],N=112+(0|ar[g>>2])|0,G=0|ar[N>>2]){V=N;i:for(;;){for(F=G;!((0|ar[F+16>>2])>>>0>=R>>>0);){if(!(G=0|ar[F+4>>2]))break i;F=G}if(!(G=0|ar[F>>2])){V=F;break}V=F}N=(0|V)!=(0|N)&&(0|ar[V+16>>2])>>>0<=R>>>0?(G=0|ar[V+20>>2],(V=0|ar[V+24>>2])?(bu(V),V):0):G=0}else N=G=0;if(yu(y,G+64|0),4==(0|((G=0|tr[Q>>0])<<24>>24<0?0|ar[D>>2]:255&G))?(V=0==(0|Yu(y,0,-1,30298,4)),G=0|tr[Q>>0]):V=0,G<<24>>24<0&&vu(0|ar[y>>2]),V){G=0|ar[g>>2],ar[y>>2]=ar[G+52>>2],V=0|ar[G+56>>2],(ar[J>>2]=V)&&(bu(V),G=0|ar[g>>2]),V=0|ar[G+44>>2],F=0|ar[G+48>>2],(R=0==(0|F))||bu(F),Lt(v,V,0|ar[20+(0|ar[_>>2])>>2],y,1752589123),G=0==(0|ar[v>>2]),0|(V=0|ar[M>>2])&&du(V);do{if(G){for(ar[m>>2]=0,ar[4+m>>2]=0,ar[8+m>>2]=0,G=0|hu(48),ar[m>>2]=G,ar[T>>2]=-2147483600,ar[U>>2]=35,eA=30986,rA=(iA=G)+35|0;tr[iA>>0]=0|tr[eA>>0],eA=eA+1|0,(0|(iA=iA+1|0))<(0|rA););if(tr[G+35>>0]=0,oo(A,2,106,m),0<=(0|tr[S>>0])){G=1;break}vu(0|ar[m>>2]),G=1}else G=0}while(0);R||du(F),0|(V=0|ar[J>>2])&&du(V),G||(me=392)}else me=392;if(392==(0|me)&&(G=me=0),0|N&&du(N),0|G)break e;G=0|ar[Y+4>>2];do{if(G)for(;V=0|ar[G>>2];)G=V;else{if(G=0|ar[(V=Y+8|0)>>2],(0|ar[G>>2])==(0|Y))break;for(;de=0|ar[V>>2],G=0|ar[(V=de+8|0)>>2],(0|ar[G>>2])!=(0|de););}}while(0);if((0|G)==(0|W))break;Y=G}if((0|(G=0|ar[ge>>2]))!=(0|W)){M=1^he,T=11+y|0,S=U=4+y|0,O=Ze+4|0,z=pe+4|0;do{if(D=G+20|0,_=0|ar[G+16>>2],N=112+(0|ar[g>>2])|0,0|(F=0|ar[N>>2])){V=N;i:for(;;){for(R=F;!((0|ar[R+16>>2])>>>0>=_>>>0);){if(!(F=0|ar[R+4>>2]))break i;R=F}if(!(F=0|ar[R>>2])){V=R;break}V=R}if((0|V)!=(0|N)&&(0|ar[V+16>>2])>>>0<=_>>>0){F=0|ar[V+20>>2],V=0|ar[V+24>>2],J=V?(bu(V),V):0,V=0==(0|F);do{if(V|M)V=V?19:18;else{if(yu(y,F+64|0),4==(0|((V=0|tr[T>>0])<<24>>24<0?0|ar[U>>2]:255&V))?(F=0==(0|Yu(y,0,-1,30303,4)),V=0|tr[T>>0]):F=0,V<<24>>24<0&&vu(0|ar[y>>2]),F){if(fo(y,ke,_,1684630887),(0|(F=0|ar[y>>2]))==(0|ar[S>>2]))V=19;else{N=0|ar[F>>2],F=0|ar[W>>2];do{if(F){V=W;i:for(;;){for(R=F;!((0|ar[R+16>>2])>>>0>=N>>>0);){if(!(F=0|ar[R+4>>2]))break i;R=F}if(!(F=0|ar[R>>2])){V=R;break}V=R}if((0|V)==(0|W)){V=19;break}if(N>>>0<(0|ar[V+16>>2])>>>0){V=19;break}_=0|ar[V+20>>2],Y=0|ar[V+24>>2],(Q=0==(0|Y))||bu(Y),R=0|ar[D>>2],V=0|ar[R+204>>2],R=0|ar[R+208>>2],(N=0==(0|R))||bu(R);do{if(!V){if(V=0|ar[(F=_)+204>>2],F=0|ar[F+208>>2]){bu(F),du(F),V=0!=(0|V);break}V=0!=(0|V);break}V=0}while(0);N||du(R);do{if(V){if(V=0|ar[D>>2],F=0|ar[(R=_)+204>>2],0|(R=0|ar[R+208>>2])&&bu(R),ar[Ze>>2]=F,ar[O>>2]=R,Zl(V,Ze),!(V=0|ar[O>>2]))break;du(V)}}while(0);R=0|ar[D>>2],V=0|ar[R+196>>2],R=0|ar[R+200>>2],(N=0==(0|R))||bu(R);do{if(!V){if(V=0|ar[(F=_)+196>>2],F=0|ar[F+200>>2]){bu(F),du(F),V=0!=(0|V);break}V=0!=(0|V);break}V=0}while(0);N||du(R);do{if(V){if(R=0|ar[D>>2],V=0|ar[(F=_)+196>>2],0|(F=0|ar[F+200>>2])&&bu(F),ar[pe>>2]=V,ar[z>>2]=F,Zl(R,pe),!(V=0|ar[z>>2]))break;du(V)}}while(0);if(Q){V=0;break}du(Y),V=0}else V=19}while(0);F=0|ar[y>>2]}if(0|F&&((0|(R=0|ar[S>>2]))!=(0|F)&&(ar[S>>2]=R+(~((R+-4-F|0)>>>2)<<2)),vu(F)),0|V)break}V=0}}while(0);switch(0|J&&du(J),0|V){case 19:case 0:break;default:break r}}}if(V=0|ar[G+4>>2])for(G=V;V=0|ar[G>>2];)G=V;else if(F=0|ar[(V=G+8|0)>>2],(0|ar[F>>2])==(0|G))G=F;else for(;ge=0|ar[V>>2],G=0|ar[(V=ge+8|0)>>2],(0|ar[G>>2])!=(0|ge););}while((0|G)!=(0|W))}}}while(0);if(V=0|ar[I>>2],T=0|ar[Z>>2],(0|V)==(0|T))G=A+8|0;else{U=Ee+4|0,S=4+p|0,O=8+E|0,z=4+E|0,j=11+E|0,H=4+X|0,x=8+B|0,P=4+B|0,L=11+B|0,q=(K=Be+8|0)+11|0,$=ye+11|0,AA=11+y|0,G=A+8|0;do{for(F=0|ar[V>>2],ho(y,0|ar[g>>2],F),wo(ye,0|ar[g>>2],F),M=0|hu(52),ar[M+4>>2]=0,ar[M+8>>2]=0,ar[M>>2]=6420,R=M+12|0,rA=(iA=M+16|0)+36|0;((ar[iA>>2]=0)|(iA=iA+4|0))<(0|rA););ar[(D=R)>>2]=F,Eu(M+16|0,y),Eu(M+28|0,ye),mo(Be,0|ar[g>>2],F,M+40|0);do{if(0|ar[Be>>2])pe=0|ar[(Ze=Be)+4>>2],ar[(F=A)>>2]=ar[Ze>>2],ar[F+4>>2]=pe,ar[G>>2]=ar[K>>2],ar[G+4>>2]=ar[K+4>>2],ar[G+8>>2]=ar[K+8>>2],ar[K>>2]=0,ar[K+4>>2]=0,ar[K+8>>2]=0,F=1;else{if(he){if(io(Ee,ke,F),R=0|ar[Ee>>2],Q=0|ar[U>>2],(0|R)==(0|Q))F=22;else{for(;;){if(1667527523==(0|ar[R+20>>2])){Ge(p,R+52|0),F=0|ar[p>>2];r:do{if(4==((0|ar[S>>2])-F|0)){Y=0|ar[F>>2],N=0|ar[W>>2];do{if(0|N){F=W;i:for(;;){for(_=N;!((0|ar[_+16>>2])>>>0>=Y>>>0);){if(!(N=0|ar[_+4>>2]))break i;_=N}if(!(N=0|ar[_>>2])){F=_;break}F=_}if((0|F)==(0|W))break;if(Y>>>0<(0|ar[F+16>>2])>>>0)break;if(F=0|ar[F+20>>2],ar[X>>2]=D,bu(ar[H>>2]=M),(_=0|ar[(N=F+188|0)>>2])>>>0<(0|ar[F+192>>2])>>>0){ar[_>>2]=ar[X>>2],ar[_+4>>2]=ar[H>>2],ar[X>>2]=0,ar[H>>2]=0,ar[N>>2]=_+8,F=0;break r}if(Bl(F+184|0,X),!(F=0|ar[H>>2])){F=0;break r}du(F),F=0;break r}}while(0);for(ar[E>>2]=0,ar[4+E>>2]=0,ar[8+E>>2]=0,F=0|hu(48),ar[E>>2]=F,ar[O>>2]=-2147483600,ar[z>>2]=39,eA=31063,rA=(iA=F)+39|0;tr[iA>>0]=0|tr[eA>>0],eA=eA+1|0,(0|(iA=iA+1|0))<(0|rA););if(tr[F+39>>0]=0,oo(A,2,2e3,E),0<=(0|tr[j>>0])){F=1;break}vu(0|ar[E>>2]),F=1}else{for(ar[B>>2]=0,ar[4+B>>2]=0,ar[8+B>>2]=0,F=0|hu(48),ar[B>>2]=F,ar[x>>2]=-2147483600,ar[P>>2]=40,eA=31022,rA=(iA=F)+40|0;tr[iA>>0]=0|tr[eA>>0],eA=eA+1|0,(0|(iA=iA+1|0))<(0|rA););if(tr[F+40>>0]=0,oo(A,2,0,B),0<=(0|tr[L>>0])){F=1;break}vu(0|ar[B>>2]),F=1}}while(0);if(0|(N=0|ar[p>>2])&&((0|(_=0|ar[S>>2]))!=(0|N)&&(ar[S>>2]=_+(~((_+-4-N|0)>>>2)<<2)),vu(N)),0|F){F=1;break}}if((0|(R=R+64|0))==(0|Q)){F=22;break}}R=0|ar[Ee>>2]}if(J=22==(0|F),0|R){if((0|(N=0|ar[U>>2]))!=(0|R)){for(;_=N+-64|0,ar[U>>2]=_,0|(Y=0|ar[N+-12>>2])&&((0|(D=0|ar[(Q=N+-8|0)>>2]))!=(0|Y)&&(ar[Q>>2]=D+(~((D+-4-Y|0)>>>2)<<2)),vu(Y)),ar[_>>2]=4264,0|(_=0|ar[N+-40>>2])&&((0|ar[(N=N+-36|0)>>2])!=(0|_)&&(ar[N>>2]=_),vu(_)),(0|(N=0|ar[U>>2]))!=(0|R););R=0|ar[Ee>>2]}vu(R)}if(!J)break}F=0}}while(0);if((0|tr[q>>0])<0&&vu(0|ar[K>>2]),du(M),(0|tr[$>>0])<0&&vu(0|ar[ye>>2]),(0|tr[AA>>0])<0&&vu(0|ar[y>>2]),V=V+4|0,0|F)break e}while((0|V)!=(0|T))}Be=0|ar[(ye=56592)+4>>2],ar[(Ee=A)>>2]=ar[ye>>2],ar[Ee+4>>2]=Be,yu(G,56600)}}while(0);ve||du(we)}else{for(ar[q>>2]=0,ar[q+4>>2]=0,ar[q+8>>2]=0,G=0|hu(48),ar[q>>2]=G,ar[q+8>>2]=-2147483600,ar[q+4>>2]=42,eA=30323,rA=(iA=G)+42|0;tr[iA>>0]=0|tr[eA>>0],eA=eA+1|0,(0|(iA=iA+1|0))<(0|rA););tr[G+42>>0]=0,oo(A,2,2e3,q),(0|tr[q+11>>0])<0&&vu(0|ar[q>>2])}}while(0);if(!(A=0|ar[I>>2]))return ur=C;(0|(G=0|ar[Z>>2]))!=(0|A)&&(ar[Z>>2]=G+(~((G+-4-A|0)>>>2)<<2));vu(A),ur=C}(A,e),0<=(0|tr[o+8+11>>0]))return ur=a;vu(0|ar[o+8>>2]),ur=a}(f,0|ar[e>>2],t?0|ar[r>>2]:r,t?0|ar[r+4>>2]:255&n,1),ao(A,f,0|ar[e>>2]),ur=(0<=(0|tr[(A=f+8|0)+11>>0])||vu(0|ar[A>>2]),i)},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n=0,t=0,o=0;if(ur=(f=ur)+32|0,n=(i=f)+20|0,t=f+8|0,o=0|oA(),!e)return ar[A>>2]=o,iA((o=0)|o),void(ur=f);!function(A,e,r,i){A|=0,e|=0,r|=0;var f,n,t,o,a=0,c=0,l=0,u=0,b=0,s=0;if(ur=(o=ur)+64|0,t=o+44|0,a=o+32|0,f=o+12|0,b=o,!(i|=0))return ar[a>>2]=0,ar[a+4>>2]=0,ar[a+8>>2]=0,oo(t,5,2001,a),(0|tr[a+11>>0])<0&&vu(0|ar[a>>2]),ao(A,t,0|ar[e>>2]),(0|tr[(a=8+t|0)+11>>0])<0&&vu(0|ar[a>>2]),ur=o;sl(t,40+(0|ar[e>>2])|0),a=0|ar[t>>2],c=0|ar[(n=4+t|0)>>2];A:do{if((0|a)!=(0|c)){for(;l=0|ar[a>>2],(0|ar[l+20>>2])!=(0|r);)if((0|(a=a+8|0))==(0|c)){a=0,s=13;break A}u=l,c=0|ar[a+4>>2],0|(a=c)&&bu(c),l?(r=0|hu(16),ar[r>>2]=0,ar[r+4>>2]=0,ar[r+8>>2]=0,ar[r+12>>2]=0,ar[i>>2]=r,c?(bu(c),c=0|ar[(b=r+4|0)>>2],ar[r>>2]=u,ar[b>>2]=a,0|c&&du(c)):(ar[r>>2]=u,ar[r+4>>2]=a),c=0|ar[i>>2],r=0|ar[e>>2],0|(l=0|ar[e+4>>2])&&bu(l),ar[c+8>>2]=r,c=0|ar[(i=c+12|0)>>2],ar[i>>2]=l,0|c&&du(c),ao(A,56592,0|ar[e>>2])):s=13}else a=0,s=13}while(0);13==(0|s)&&(ar[b>>2]=0,ar[b+4>>2]=0,ar[b+8>>2]=0,oo(f,5,2e3,b),(0|tr[b+11>>0])<0&&vu(0|ar[b>>2]),ao(A,f,0|ar[e>>2]),(0|tr[(c=8+f|0)+11>>0])<0&&vu(0|ar[c>>2]));0|a&&du(a);if(0|(a=0|ar[t>>2])){if((0|(c=0|ar[n>>2]))!=(0|a)){for(;r=c+-8|0,ar[n>>2]=r,(0|(c=(c=0|ar[c+-4>>2])?(du(c),0|ar[n>>2]):r))!=(0|a););a=0|ar[t>>2]}vu(a)}ur=o}(t,e,r,n),t=0|ar[t>>2]?(n=0|hu(12),ar[n>>2]=ar[t>>2],ar[n+4>>2]=ar[t+4>>2],ar[n+8>>2]=ar[t+8>>2],ar[i>>2]=n,0|cA(1392,0|i)):(ar[i>>2]=ar[n>>2],0|cA(1320,0|i)),ar[A>>2]=t,iA(0|o),ur=f},function(A,e,r){r|=0,ar[(e|=0)+(0|ar[(A|=0)>>2])>>2]=r},function(A,e,r){r|=0,ar[(e|=0)+(0|ar[(A|=0)>>2])>>2]=r},function(A,e,r){sr(44456,35137,51,35153)},function(A,e,r){A|=0,e|=0;var i=0,f=0,n=0,t=0;if(0<(0|(r|=0))){f=0;do{for(n=0|br(f,r),i=0;ar[A+((t=i+n|0)<<2)>>2]=or[e+(t<<1)>>1],(0|(i=i+1|0))!=(0|r););f=f+1|0}while((0|f)!=(0|r))}},function(A,e,r){A|=0,e|=0;var i=0,f=0,n=0,t=0,o=0;if(0<(0|(r|=0))){f=0;do{for(t=0|br(f,r),n=i=0;i=(0|or[e+((o=n+t|0)<<1)>>1])+i|0,ar[A+(o<<2)>>2]=i,(0|(n=n+1|0))!=(0|r););f=f+1|0}while((0|f)!=(0|r))}},function(A,e,r){A|=0,e|=0;var i=0,f=0,n=0,t=0;if(0<(0|(r|=0))){f=0;do{for(n=i=0;t=(0|br(n,r))+f|0,i=(0|or[e+(t<<1)>>1])+i|0,ar[A+(t<<2)>>2]=i,(0|(n=n+1|0))!=(0|r););f=f+1|0}while((0|f)!=(0|r))}},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n=0,t=0,o=0,a=0,c=0,l=0,u=0;for(ur=(f=ur)+32|0,i=f,n=0;t=0|or[e+(n<<1)>>1],l=(74*(o=0|or[e+(n+4<<1)>>1])|0)+(29*t|0)+(84*(a=0|or[e+(n+8<<1)>>1])|0)+(55*(c=0|or[e+(n+12<<1)>>1])|0)+64>>7,or[i+(n<<1)>>1]=(0|l)<-32768?-32768:65535&((0|l)<32767?l:32767),l=(0|br(c,-84))+((0|br(a,-29))+((74*o|0)+(55*t|0)))+64>>7,or[i+8+(n<<1)>>1]=(0|l)<-32768?-32768:65535&((0|l)<32767?l:32767),l=(74*c|0)+((0|br(a,-74))+(74*t|0))+64>>7,or[i+16+(n<<1)>>1]=(0|l)<-32768?-32768:65535&((0|l)<32767?l:32767),t=(0|br(c,-29))+((55*a|0)+((0|br(o,-74))+(84*t|0)))+64>>7,or[i+24+(n<<1)>>1]=(0|t)<-32768?-32768:65535&((0|t)<32767?t:32767),4!=(0|(n=n+1|0)););for(n=0;l=0|br(n,r),c=0|or[i+(n<<3)>>1],u=(74*(a=0|or[i+(n<<3)+2>>1])|0)+(29*c|0)+(84*(o=0|or[i+(n<<3)+4>>1])|0)+(55*(t=0|or[i+(n<<3)+6>>1])|0)+2048>>12,u=(0|cr[(e=A+l|0)>>0])+((0|u)<-32768?-32768:(0|u)<32767?u:32767)|0,tr[e>>0]=(0|u)<0?0:255&((0|u)<255?u:255),e=(0|br(t,-84))+((0|br(o,-29))+((74*a|0)+(55*c|0)))+2048>>12,e=(0|cr[(u=A+(l+1)|0)>>0])+((0|e)<-32768?-32768:(0|e)<32767?e:32767)|0,tr[u>>0]=(0|e)<0?0:255&((0|e)<255?e:255),u=(74*t|0)+((0|br(o,-74))+(74*c|0))+2048>>12,u=(0|cr[(e=A+(l+2)|0)>>0])+((0|u)<-32768?-32768:(0|u)<32767?u:32767)|0,tr[e>>0]=(0|u)<0?0:255&((0|u)<255?u:255),c=(0|br(t,-29))+((55*o|0)+((0|br(a,-74))+(84*c|0)))+2048>>12,c=(0|cr[(l=A+(l+3)|0)>>0])+((0|c)<-32768?-32768:(0|c)<32767?c:32767)|0,tr[l>>0]=(0|c)<0?0:255&((0|c)<255?c:255),4!=(0|(n=n+1|0)););ur=f},function(A,e,r){Oo(A|=0,r|=0,4,e|=0,8)},function(A,e,r){Oo(A|=0,r|=0,8,e|=0,8)},function(A,e,r){Oo(A|=0,r|=0,16,e|=0,8)},function(A,e,r){Oo(A|=0,r|=0,32,e|=0,8)},function(A,e,r){A|=0,e|=0;var i,f,n,t,o=0,a=0,c=0,l=0,u=0,b=0,s=0;for(ur=(t=ur)+32|0,n=t,i=(r|=0)<<1,f=3*r|0,o=0;a=0|or[e+(o<<1)>>1],s=(55*(c=0|or[e+(o+r<<1)>>1])|0)+(29*a|0)+(74*(l=0|or[e+(i+o<<1)>>1])|0)+(84*(u=0|or[e+(f+o<<1)>>1])|0)+1>>1,or[n+(o<<1)>>1]=(0|s)<-32768?-32768:65535&((0|s)<32767?s:32767),b=(s=(0|br(u,-74))+(74*(c+a|0)|0)|0)>>1,or[n+(o+4<<1)>>1]=(0|s)<-65536?-32768:65535&((0|b)<32767?b:32767),b=(55*u|0)+((0|br(l,-74))+((0|br(c,-29))+(84*a|0)))+1>>1,or[n+(o+8<<1)>>1]=(0|b)<-32768?-32768:65535&((0|b)<32767?b:32767),a=(0|br(u,-29))+((74*l|0)+((0|br(c,-84))+(55*a|0)))+1>>1,or[n+(o+12<<1)>>1]=(0|a)<-32768?-32768:65535&((0|a)<32767?a:32767),4!=(0|(o=o+1|0)););for(o=0;b=0|or[n+((s=o<<2)<<1)>>1],u=0|or[n+((1|s)<<1)>>1],l=0|or[n+((2|s)<<1)>>1],c=0|or[n+((3|s)<<1)>>1],or[A+(s<<1)>>1]=((55*u|0)+(29*b|0)+(74*l|0)+(84*c|0)+128|0)>>>8,a=((0|br(c,-74))+(74*(u+b|0)|0)+128|0)>>>8&65535,or[A+((1|s)<<1)>>1]=a,a=((55*c|0)+((0|br(l,-74))+((0|br(u,-29))+(84*b|0)))+128|0)>>>8&65535,or[A+((2|s)<<1)>>1]=a,b=((0|br(c,-29))+((74*l|0)+((0|br(u,-84))+(55*b|0)))+128|0)>>>8&65535,or[A+((3|s)<<1)>>1]=b,4!=(0|(o=o+1|0)););ur=t},function(A,e,r){jo(A|=0,4,e|=0,r|=0)},function(A,e,r){jo(A|=0,8,e|=0,r|=0)},function(A,e,r){jo(A|=0,16,e|=0,r|=0)},function(A,e,r){jo(A|=0,32,e|=0,r|=0)},function(A,e,r){A|=0,r|=0;var i,f=0,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0;ur=(i=ur)+32|0,w=i,n=0|or[(e|=0)>>1],o=0|or[e+4>>1],c=0|or[e+2>>1],m=o+n<<16>>16,a=(f=0|or[e+6>>1])+c<<16>>16,or[w>>1]=a+m,or[(s=w+2|0)>>1]=m-a,o=n-o<<16>>16,f=c-f<<16>>16,or[(c=w+4|0)>>1]=f+o,or[(n=w+6|0)>>1]=o-f,f=0|or[e+(r<<1)>>1],o=0|or[e+(r+2<<1)>>1],a=0|or[e+(r+1<<1)>>1],t=o+f<<16>>16,g=(m=0|or[e+(r+3<<1)>>1])+a<<16>>16,or[(h=w+8|0)>>1]=g+t,or[(b=w+10|0)>>1]=t-g,o=f-o<<16>>16,m=a-m<<16>>16,or[(a=w+12|0)>>1]=m+o,or[(f=w+14|0)>>1]=o-m,o=0|or[e+((m=r<<1)<<1)>>1],g=0|or[e+(m+2<<1)>>1],t=0|or[e+((1|m)<<1)>>1],d=(l=(m=0|or[e+(m+3<<1)>>1])+t<<16>>16)+(v=g+o<<16>>16)|0,or[w+16>>1]=d,l=v-l|0,or[w+18>>1]=l,g=o-g<<16>>16,m=t-m<<16>>16,or[(t=w+20|0)>>1]=m+g,or[(o=w+22|0)>>1]=g-m,g=0|or[e+((m=3*r|0)<<1)>>1],v=0|or[e+(m+2<<1)>>1],r=0|or[e+(m+1<<1)>>1],k=(u=(m=0|or[e+(m+3<<1)>>1])+r<<16>>16)+(e=v+g<<16>>16)|0,or[w+24>>1]=k,u=e-u|0,or[w+26>>1]=u,e=(m=r-m<<16>>16)+(v=g-v<<16>>16)|0,or[w+28>>1]=e,or[(r=w+30|0)>>1]=v-m,m=(d=d<<16>>16)+(w=0|or[w>>1])<<16>>16,v=(k=k<<16>>16)+(h=0|or[h>>1])<<16>>16,or[A>>1]=v+m,or[A+8>>1]=m-v,d=w-d<<16>>16,k=h-k<<16>>16,or[A+16>>1]=k+d,or[A+24>>1]=d-k,k=(l=l<<16>>16)+(s=0|or[s>>1])<<16>>16,d=(u=u<<16>>16)+(b=0|or[b>>1])<<16>>16,or[A+2>>1]=d+k,or[A+10>>1]=k-d,l=s-l<<16>>16,u=b-u<<16>>16,or[A+18>>1]=u+l,or[A+26>>1]=l-u,c=0|or[c>>1],u=(t=0|or[t>>1])+c<<16>>16,l=(e=e<<16>>16)+(a=0|or[a>>1])<<16>>16,or[A+4>>1]=l+u,or[A+12>>1]=u-l,t=c-t<<16>>16,e=a-e<<16>>16,or[A+20>>1]=e+t,or[A+28>>1]=t-e,n=0|or[n>>1],e=0|or[o>>1],f=0|or[f>>1],o=e+n<<16>>16,t=(r=0|or[r>>1])+f<<16>>16,or[A+6>>1]=t+o,or[A+14>>1]=o-t,e=n-e<<16>>16,r=f-r<<16>>16,or[A+22>>1]=r+e,or[A+30>>1]=e-r,ur=i},function(A,e,r){A|=0,e|=0,r|=0;var i,f,n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0;for(ur=(f=ur)+128|0,i=f,n=0;o=0|br(n,r),w=0|or[e+(o<<1)>>1],l=0|or[e+(o+4<<1)>>1],k=0|or[e+(o+1<<1)>>1],c=0|or[e+(o+5<<1)>>1],t=0|or[e+(o+2<<1)>>1],a=0|or[e+(o+6<<1)>>1],h=0|or[e+(o+3<<1)>>1],d=l+w<<16>>16,u=a+t<<16>>16,s=c+k<<16>>16,b=(o=0|or[e+(o+7<<1)>>1])+h<<16>>16,l=w-l<<16>>16,a=t-a<<16>>16,c=k-c<<16>>16,o=h-o<<16>>16,h=u+d<<16>>16,k=b+s<<16>>16,or[i+((t=n<<3)<<1)>>1]=k+h,or[i+((1|t)<<1)>>1]=h-k,u=d-u<<16>>16,b=s-b<<16>>16,or[i+((2|t)<<1)>>1]=b+u,or[i+((3|t)<<1)>>1]=u-b,b=a+l<<16>>16,u=o+c<<16>>16,or[i+((4|t)<<1)>>1]=u+b,or[i+((5|t)<<1)>>1]=b-u,a=l-a<<16>>16,o=c-o<<16>>16,or[i+((6|t)<<1)>>1]=o+a,or[i+((7|t)<<1)>>1]=a-o,8!=(0|(n=n+1|0)););for(n=0;p=0|or[i+(n<<1)>>1],b=0|or[i+((a=n+32|0)<<1)>>1],m=0|or[i+((v=n+8|0)<<1)>>1],s=0|or[i+((u=n+40|0)<<1)>>1],Z=0|or[i+((t=n+16|0)<<1)>>1],k=0|or[i+((d=n+48|0)<<1)>>1],g=0|or[i+((c=n+24|0)<<1)>>1],e=b+p<<16>>16,o=k+Z<<16>>16,r=s+m<<16>>16,l=(h=0|or[i+((w=n+56|0)<<1)>>1])+g<<16>>16,b=p-b<<16>>16,k=Z-k<<16>>16,s=m-s<<16>>16,h=g-h<<16>>16,g=o+e<<16>>16,m=l+r<<16>>16,or[A+(n<<1)>>1]=m+g,or[A+(v<<1)>>1]=g-m,o=e-o<<16>>16,l=r-l<<16>>16,or[A+(t<<1)>>1]=l+o,or[A+(c<<1)>>1]=o-l,c=k+b<<16>>16,l=h+s<<16>>16,or[A+(a<<1)>>1]=l+c,or[A+(u<<1)>>1]=c-l,k=b-k<<16>>16,h=s-h<<16>>16,or[A+(d<<1)>>1]=h+k,or[A+(w<<1)>>1]=k-h,8!=(0|(n=n+1|0)););ur=f},function(A,e,r){Ho(A|=0,16,e|=0,r|=0)},function(A,e,r){Ho(A|=0,32,e|=0,r|=0)},Qb,Qb,Qb,Qb,Qb,Qb,Qb,Qb,Qb,Qb,Qb,Qb,Qb,Qb,Qb,Qb,Qb,Qb,Qb,Qb,Qb,Qb,Qb,Qb,Qb,Qb,Qb,Qb,Qb],ts=[Db,function(A,e,r,i){A|=0,i|=0,r=(r|=0)+8|0,as[15&ar[16+(0|ar[(e|=0)>>2])>>2]](A,e,0|ar[r>>2],0|ar[r+4>>2],0,i)},function(A,e,r,i){A|=0,e|=0,r|=0,i|=0;var f=0,n=0;A:do{if(0|i){for(f=0;;){if((i-f|0)>>>0<4){f=4;break}if(n=(0|cr[r+(f+1)>>0])<<16|(0|cr[r+f>>0])<<24|(0|cr[r+(f+2)>>0])<<8|0|cr[r+(f+3)>>0],(i-(f=f+4|0)|0)>>>0<n>>>0){f=7;break}if(Ve(0|ar[e>>2],r+f|0,n,0,0,0),i>>>0<=(f=n+f|0)>>>0)break A}if(4==(0|f))return ar[A>>2]=ar[1919],ar[A+4>>2]=ar[1920],void(ar[A+8>>2]=ar[1921]);if(7==(0|f))return ar[A>>2]=ar[1919],ar[A+4>>2]=ar[1920],void(ar[A+8>>2]=ar[1921])}}while(0);ar[A>>2]=ar[1904],ar[A+4>>2]=ar[1905],ar[A+8>>2]=ar[1906]},function(A,e,r,i){i|=0,ar[(i=A|=0)>>2]=0,ar[i+4>>2]=0,ar[(i=A+8|0)>>2]=-1,ar[i+4>>2]=-1},function(A,e,r,i){i|=0,ar[(i=A|=0)>>2]=0,ar[i+4>>2]=0,ar[(i=A+8|0)>>2]=-1,ar[i+4>>2]=-1},function(A,e,r,i){e|=0,r|=0,i|=0;var f,n,t,o=0;for(f=ur=(t=ur)+31&-32,ur=ur+16|0,ar[(A|=0)>>2]=0,ar[A+4>>2]=0,4294967279<(n=i-r|(ar[A+8>>2]=0))>>>0&&pu(),n>>>0<11?(tr[A+11>>0]=n,o=A):(o=0|hu(e=16+n&-16),ar[A>>2]=o,ar[A+8>>2]=-2147483648|e,ar[A+4>>2]=n),e=r,A=o;(0|e)!=(0|i);)Qf(A,e),e=e+1|0,A=A+1|0;Qf(o+n|(tr[f>>0]=0),f),ur=t},function(A,e,r,i){e|=0,r|=0,i|=0;var f,n,t,o=0,a=0;f=ur=(t=ur)+31&-32,ur=ur+16|0,ar[(A|=0)>>2]=0,ar[A+4>>2]=0,1073741807<(n=i-r>>2)>>>(ar[A+8>>2]=0)&&pu();do{if(2<=n>>>0){if(!(1073741823<(e=4+n&-4)>>>0)){a=0|hu(e<<2),ar[A>>2]=a,ar[A+8>>2]=-2147483648|e,ar[A+4>>2]=n,o=r;break}lA()}else tr[A+8+3>>0]=n,o=r,a=A}while(0);for(;(0|o)!=(0|i);)ln(a,o),o=o+4|0,a=a+4|0;ar[f>>2]=0,ln(a,f),ur=t},function(A,e,r,i){r|=0,i|=0,0|xu(A|=0,0|ar[(e|=0)+8>>2])&&Pu(0,e,r,i)},function(A,e,r,i){r|=0,i|=0,0|xu(A|=0,0|ar[(e|=0)+8>>2])?Pu(0,e,r,i):(A=0|ar[A+8>>2],ts[31&ar[28+(0|ar[A>>2])>>2]](A,e,r,i))},function(A,e,r,i){A|=0,e|=0,r|=0,i|=0;var f=0,n=0;A:do{if(0|xu(A,0|ar[e+8>>2]))Pu(0,e,r,i);else if(f=A+16+((n=0|ar[A+12>>2])<<3)|0,Ab(A+16|0,e,r,i),1<(0|n)){n=e+54|0,A=A+24|0;do{if(Ab(A,e,r,i),0|tr[n>>0])break A;A=A+8|0}while(A>>>0<f>>>0)}}while(0)},function(A,e,r,i){A|=0,e|=0,r|=0,i|=0;var f,n,t,o,a,c,l,u,b=0,s=0,d=0,k=0,h=0,w=0,v=0;if(ur=(u=ur)+64|0,l=(o=u)+56|0,c=u+52|0,s=u+40|0,a=u+36|0,v=u+24|0,n=u+20|0,f=u+16|0,t=u+12|0,b=0|oA(),ar[l>>2]=b,!e)return ar[A>>2]=b,ar[l>>2]=0,iA((v=0)|v),void(ur=u);if(!function(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0;var t,o,a,c;ur=(c=ur)+32|0,ar[(t=(o=c)+24|0)>>2]=0,ar[(a=4+t|0)>>2]=0,function(A,e,r,i,f,n,t){A|=0,n|=0,t|=0;var o,a,c=0,l=0,u=0,b=0,s=0,d=0;ur=(a=ur)+48|0,b=(o=a)+40|0,u=a+32|0,d=a+20|0,Xl(o,e|=0,r|=0,i|=0,f|=0,0);do{if(0|ar[o>>2])i=0|ar[(s=o)+4>>2],ar[(d=A)>>2]=ar[s>>2],ar[d+4>>2]=i,i=o+8|0,ar[(d=A+8|0)>>2]=ar[i>>2],ar[d+4>>2]=ar[i+4>>2],ar[d+8>>2]=ar[i+8>>2],ar[i>>2]=0,ar[i+4>>2]=0,ar[i+8>>2]=0;else{if(99==(0|f)&&(f=0|ar[32+(0|ar[i>>2])>>2]),c=0|ar[i>>2],l=0|ar[c+36>>2],r=99==(0|n)?l:n,e=t&&0|tr[t+20>>0]?8:0,!((0|r)==(0|l)&&(0|f)==(0|ar[c+32>>2])||(ar[u>>2]=0,ar[(c=u+4|0)>>2]=0,me(b,i,f,r,u,e),e=0|ar[b>>2],u=0|ar[(r=b+4|0)>>2],ar[b>>2]=0,ar[r>>2]=0,ar[i>>2]=e,e=0|ar[(b=i+4|0)>>2],ar[b>>2]=u,0|e&&(du(e),0|(s=0|ar[r>>2]))&&du(s),0|(e=0|ar[c>>2])&&du(e),0|ar[i>>2]))){if(ar[d>>2]=0,ar[d+4>>2]=0,ar[d+8>>2]=0,oo(A,4,3003,d),0<=(0|tr[d+11>>0]))break;vu(0|ar[d>>2]);break}d=0|ar[(s=56592)+4>>2],ar[(i=A)>>2]=ar[s>>2],ar[i+4>>2]=d,yu(A+8|0,56600)}}while(0);if(0<=(0|tr[11+(e=o+8|0)>>0]))return ur=a;vu(0|ar[e>>2]),ur=a}(o,0|ar[e+8>>2],0|ar[20+(0|ar[e>>2])>>2],t,i,f,n),0|ar[o>>2]?ao(A,o,0|ar[e>>2]):(n=0|hu(8),ar[r>>2]=n,i=0|ar[t>>2],f=0|ar[a>>2],ar[t>>2]=0,ar[a>>2]=0,ar[n>>2]=i,ar[n+4>>2]=f,ao(A,56592,0|ar[e>>2]));(0|tr[11+(A=o+8|0)>>0])<0&&vu(0|ar[A>>2]);(A=0|ar[a>>2])&&du(A),ur=c}(s,e,c,r,i,0),0|ar[s>>2])v=0|hu(12),ar[v>>2]=ar[s>>2],ar[v+4>>2]=ar[s+4>>2],ar[v+8>>2]=ar[s+8>>2],ar[o>>2]=v,v=0|cA(1392,0|o),ar[A>>2]=v;else{if(ar[o>>2]=cr[40+(0|ar[e>>2])>>0],bl(l,29636,o),sl(o,48+(0|ar[e>>2])|0),s=(b=0|ar[(i=o+4|0)>>2])-(e=0|ar[o>>2])>>3,0|(r=e)){if((0|b)!=(0|r)){for(;e=b+-8|0,ar[i>>2]=e,(b=0|ar[b+-4>>2])&&(du(b),e=0|ar[i>>2]),(0|e)!=(0|r);)b=e;e=0|ar[o>>2]}vu(e)}switch(ar[a>>2]=s,bl(l,29647,a),b=0|ar[c>>2],e=0|Xo(0|ar[b>>2],0),ar[o>>2]=e,function(A,e,r){e|=0,r|=0;var i,f;ur=(i=ur)+16|0,f=i,A=0|ar[(A=A|0)>>2],e=0|tA(0|e),ar[f>>2]=ar[r>>2],r=0|cA(4144,0|f),aA(0|A,0|e,0|r),iA(0|r),iA(0|e),ur=i}(l,29658,o),e=0|Wo(0|ar[b>>2],0),ar[a>>2]=e,function(A,e,r){e|=0,r|=0;var i,f;ur=(i=ur)+16|0,f=i,A=0|ar[(A=A|0)>>2],e=0|tA(0|e),ar[f>>2]=ar[r>>2],r=0|cA(4144,0|f),aA(0|A,0|e,0|r),iA(0|r),iA(0|e),ur=i}(l,29664,a),ar[v>>2]=0,ar[v+4>>2]=0,ar[v+8>>2]=0,ar[n>>2]=ar[36+(0|ar[b>>2])>>2],function(A,e,r){e|=0,r|=0;var i,f;ur=(i=ur)+16|0,f=i,A=0|ar[(A=A|0)>>2],e=0|tA(0|e),ar[f>>2]=ar[r>>2],r=0|cA(1248,0|f),aA(0|A,0|e,0|r),iA(0|r),iA(0|e),ur=i}(l,29671,n),ar[n>>2]=ar[32+(0|ar[b>>2])>>2],function(A,e,r){e|=0,r|=0;var i,f;ur=(i=ur)+16|0,f=i,A=0|ar[(A=A|0)>>2],e=0|tA(0|e),ar[f>>2]=ar[r>>2],r=0|cA(1256,0|f),aA(0|A,0|e,0|r),iA(0|r),iA(0|e),ur=i}(l,29678,n),e=0|ar[b>>2],0|ar[e+32>>2]){case 0:if(r=e?0|Fo(e,0,n):ar[n>>2]=0,h=(e=0|ar[b>>2])?0|Fo(e,1,f):ar[f>>2]=0,e=(e=0|ar[b>>2])?0|Fo(e,2,t):ar[t>>2]=0,w=0|ar[o>>2],d=0|ar[a>>2],Vu(v,(0|br(~~(.5*(0|w)+.5)<<1,~~(.5*(0|d)+.5)))+(0|br(d,w))|0,0),w=(0|tr[v+11>>0])<0?0|ar[v>>2]:v,d=0|ar[o>>2],k=0|ar[a>>2],(0|d)!=(0|(s=0|ar[n>>2]))){if(0<(0|k))for(i=w,b=r,r=0;hb(0|i,0|b,0|s),(0|(r=r+1|0))!=(0|k);)i=i+d|0,b=b+s|0}else hb(0|w,0|r,0|br(k,d));if(d=0|ar[o>>2],k=0|ar[a>>2],b=w+(0|br(k,d))|0,k=~~(.5*(0|k)+.5),(0|(d=~~(.5*(0|d)+.5)))!=(0|(s=0|ar[f>>2]))){if(0<(0|k))for(i=b,b=h,r=0;hb(0|i,0|b,0|s),(0|(r=r+1|0))!=(0|k);)i=i+d|0,b=b+s|0}else hb(0|b,0|h,0|br(k,d));if(r=0|ar[o>>2],i=0|ar[a>>2],b=0|br(d=~~(.5*(0|i)+.5),s=~~(.5*(0|r)+.5)),r=w+(0|br(i,r))+b|0,(0|s)!=(0|(i=0|ar[t>>2]))){if(0<(0|d))for(b=0;hb(0|r,0|e,0|i),(0|(b=b+1|0))!=(0|d);)r=r+s|0,e=e+i|0}else hb(0|r,0|e,0|b);break;case 1:if(10!=(0|ar[e+36>>2])&&sr(29689,29758,140,26426),e=0|Fo(e,10,n),Vu(v,0|br(3*(0|ar[o>>2])|0,0|ar[a>>2]),0),r=(0|tr[v+11>>0])<0?0|ar[v>>2]:v,d=3*(0|ar[o>>2])|0,s=0|ar[a>>2],(0|d)!=(0|(i=0|ar[n>>2]))){if(0<(0|s))for(b=0;hb(0|r,0|e,0|i),(0|(b=b+1|0))!=(0|s);)r=r+d|0,e=e+i|0}else hb(0|r,0|e,0|br(s,d));break;case 2:if(0|ar[e+36>>2]&&sr(29778,29758,151,26426),e=0|Fo(e,0,n),Vu(v,0|br(0|ar[a>>2],0|ar[o>>2]),0),r=(0|tr[v+11>>0])<0?0|ar[v>>2]:v,d=0|ar[o>>2],s=0|ar[a>>2],(0|d)!=(0|(i=0|ar[n>>2]))){if(0<(0|s))for(b=0;hb(0|r,0|e,0|i),(0|(b=b+1|0))!=(0|s);)r=r+d|0,e=e+i|0}else hb(0|r,0|e,0|br(s,d))}!function(A,e,r){e|=0,r|=0;var i,f,n,t,o=0;ur=(i=ur)+16|0,f=i,A=0|ar[(A=A|0)>>2],e=0|tA(0|e),o=0|tr[r+11>>0],o=(t=o<<24>>24<0)?0|ar[r+4>>2]:255&o,n=0|yc(o+4|0),ar[n>>2]=o,hb(4+n|0,0|(t?0|ar[r>>2]:r),0|o),ar[f>>2]=n,r=0|cA(1408,0|f),aA(0|A,0|e,0|r),iA(0|r),iA(0|e),ur=i}(l,29840,v),0|(e=0|ar[c>>2])&&(0|(b=0|ar[e+4>>2])&&du(b),vu(e)),ar[A>>2]=ar[l>>2],((ar[l>>2]=0)|tr[v+11>>0])<0&&vu(0|ar[v>>2])}v=0|ar[l>>2],iA(0|v),ur=u},function(A,e,r,i){A|=0,e|=0,i|=0;var f,n,t=0,o=0,a=0,c=0,l=0,u=0,b=0;if(f=(r|=0)+5|0,n=1<<r,31!=(0|r)){a=0;do{for(c=a<<r,l=0|br(a,i),o=t=0;b=(o=(2048+(or[e+(t+c<<1)>>1]<<f)>>12)+o|0)+(0|cr[(u=A+(t+l)|0)>>0])|0,tr[u>>0]=(0|b)<0?0:255&((0|b)<255?b:255),(0|(t=t+1|0))<(0|n););a=a+1|0}while((0|a)<(0|n))}},function(A,e,r,i){A|=0,e|=0,i|=0;var f,n,t=0,o=0,a=0,c=0,l=0;if(f=(r|=0)+5|0,n=1<<r,31!=(0|r)){a=0;do{for(o=t=0;o=(2048+(or[e+((t<<r)+a<<1)>>1]<<f)>>12)+o|0,c=A+((0|br(t,i))+a)|0,l=o+(0|cr[c>>0])|0,tr[c>>0]=(0|l)<0?0:255&((0|l)<255?l:255),(0|(t=t+1|0))<(0|n););a=a+1|0}while((0|a)<(0|n))}},function(A,e,r,i){sr(44456,35137,68,35179)},function(A,e,r,i){A|=0,e|=0,r|=0;var f,n,t,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0;for(ur=(t=ur)+32|0,f=t,a=(n=20-(i|=0)|0)-1|0,o=0;c=0|or[e+(o<<1)>>1],s=(74*(l=0|or[e+(o+4<<1)>>1])|0)+(29*c|0)+(84*(u=0|or[e+(o+8<<1)>>1])|0)+(55*(b=0|or[e+(o+12<<1)>>1])|0)+64>>7,or[f+(o<<1)>>1]=(0|s)<-32768?-32768:65535&((0|s)<32767?s:32767),s=(0|br(b,-84))+((0|br(u,-29))+((74*l|0)+(55*c|0)))+64>>7,or[f+8+(o<<1)>>1]=(0|s)<-32768?-32768:65535&((0|s)<32767?s:32767),s=(74*b|0)+((0|br(u,-74))+(74*c|0))+64>>7,or[f+16+(o<<1)>>1]=(0|s)<-32768?-32768:65535&((0|s)<32767?s:32767),c=(0|br(b,-29))+((55*u|0)+((0|br(l,-74))+(84*c|0)))+64>>7,or[f+24+(o<<1)>>1]=(0|c)<-32768?-32768:65535&((0|c)<32767?c:32767),4!=(0|(o=o+1|0)););for(c=1<<a,a=(e=1<<i)+65535|0,o=0;s=0|br(o,r),b=0|or[f+(o<<3)>>1],k=(74*(u=0|or[f+(o<<3)+2>>1])|0)+(29*b|0)+(84*(l=0|or[f+(o<<3)+4>>1])|0)+(55*(i=0|or[f+(o<<3)+6>>1])|0)+c>>n,k=(0|lr[(d=A+(s<<1)|0)>>1])+((0|k)<-32768?-32768:(0|k)<32767?k:32767)|0,or[d>>1]=(0|k)<0?0:65535&((0|k)<(0|e)?k:a),d=(0|br(i,-84))+((0|br(l,-29))+((74*u|0)+(55*b|0)))+c>>n,d=(0|lr[(k=A+(s+1<<1)|0)>>1])+((0|d)<-32768?-32768:(0|d)<32767?d:32767)|0,or[k>>1]=(0|d)<0?0:65535&((0|d)<(0|e)?d:a),k=(74*i|0)+((0|br(l,-74))+(74*b|0))+c>>n,k=(0|lr[(d=A+(s+2<<1)|0)>>1])+((0|k)<-32768?-32768:(0|k)<32767?k:32767)|0,or[d>>1]=(0|k)<0?0:65535&((0|k)<(0|e)?k:a),b=(0|br(i,-29))+((55*l|0)+((0|br(u,-74))+(84*b|0)))+c>>n,b=(0|lr[(s=A+(s+3<<1)|0)>>1])+((0|b)<-32768?-32768:(0|b)<32767?b:32767)|0,or[s>>1]=(0|b)<0?0:65535&((0|b)<(0|e)?b:a),4!=(0|(o=o+1|0)););ur=t},function(A,e,r,i){zo(A|=0,r|=0,4,e|=0,i|=0)},function(A,e,r,i){zo(A|=0,r|=0,8,e|=0,i|=0)},function(A,e,r,i){zo(A|=0,r|=0,16,e|=0,i|=0)},function(A,e,r,i){zo(A|=0,r|=0,32,e|=0,i|=0)},function(A,e,r,i){A|=0,e|=0;var f,n,t,o,a=0,c=0,l=0,u=0,b=0,s=0,d=0;for(ur=(o=ur)+32|0,t=o,c=(r|=0)+-1|0,f=(a=1<<(i|=0))+65535|0,n=0-a|0,i=0;l=0|or[e+(i<<1)>>1],d=(74*(u=0|or[e+(i+4<<1)>>1])|0)+(29*l|0)+(84*(b=0|or[e+(i+8<<1)>>1])|0)+(55*(s=0|or[e+(i+12<<1)>>1])|0)+64>>7,or[t+(i<<1)>>1]=(0|d)<(0|n)?n:(0|d)<(0|a)?d:f,d=(0|br(s,-84))+((0|br(b,-29))+((74*u|0)+(55*l|0)))+64>>7,or[t+8+(i<<1)>>1]=(0|d)<(0|n)?n:(0|d)<(0|a)?d:f,d=(74*s|0)+((0|br(b,-74))+(74*l|0))+64>>7,or[t+16+(i<<1)>>1]=(0|d)<(0|n)?n:(0|d)<(0|a)?d:f,l=(0|br(s,-29))+((55*b|0)+((0|br(u,-74))+(84*l|0)))+64>>7,or[t+24+(i<<1)>>1]=(0|l)<(0|n)?n:(0|l)<(0|a)?l:f,4!=(0|(i=i+1|0)););for(a=1<<c,i=0;d=i<<2,s=0|or[t+(i<<3)>>1],c=74*(b=0|or[t+(i<<3)+2>>1])|0,u=0|or[t+(i<<3)+4>>1],l=0|or[t+(i<<3)+6>>1],ar[A+(d<<2)>>2]=(55*l|0)+((84*u|0)+(c+(29*s|0)))+a>>r,c=(0|br(l,-84))+((0|br(u,-29))+(c+(55*s|0)))+a>>r,ar[A+((1|d)<<2)>>2]=c,c=(74*l|0)+((0|br(u,-74))+(74*s|0))+a>>r,ar[A+((2|d)<<2)>>2]=c,s=(0|br(l,-29))+((55*u|0)+((0|br(b,-74))+(84*s|0)))+a>>r,ar[A+((3|d)<<2)>>2]=s,4!=(0|(i=i+1|0)););ur=o},function(A,e,r,i){So(A|=0,4,e|=0,r|=0,i|=0)},function(A,e,r,i){So(A|=0,8,e|=0,r|=0,i|=0)},function(A,e,r,i){So(A|=0,16,e|=0,r|=0,i|=0)},function(A,e,r,i){So(A|=0,32,e|=0,r|=0,i|=0)},Db,Db,Db,Db,Db,Db,Db,Db],os=[Jb,function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o,a=0,c=0,l=0,u=0,b=0;if(ur=(o=ur)+64|0,t=o+36|0,n=o+48|0,u=o,1==(0|ar[(r|=0)>>2])&&3==(0|ar[r+4>>2])&&8==(0|ar[r+12>>2]))return ar[t>>2]=0,ar[(b=4+t|0)>>2]=0,a=(ar[8+t>>2]=0)==(0|tr[(f=r+8|0)>>0])&&0==(0|tr[i+8>>0])?.25:0,ar[u>>2]=1,ar[u+4>>2]=11,tr[u+8>>0]=1,tr[(e=u+9|0)>>0]=0|tr[n>>0],tr[e+1>>0]=0|tr[1+n>>0],tr[e+2>>0]=0|tr[2+n>>0],ar[u+12>>2]=8,ar[u+16>>2]=0,ar[(e=u+20|0)>>2]=0,gA[u+24>>2]=.10000000149011612,gA[u+28>>2]=0,gA[u+32>>2]=a,l=8+t|0,Nl(t,u),0|(e=0|ar[e>>2])&&du(e),0!=(0|tr[f>>0])&&0!=(0|tr[i+8>>0])?c=.10000000149011612:(c=.20000000298023224,a=0),ar[u>>2]=1,ar[u+4>>2]=10,tr[u+8>>0]=0,tr[(f=u+9|0)>>0]=0|tr[n>>0],tr[f+1>>0]=0|tr[1+n>>0],tr[f+2>>0]=0|tr[2+n>>0],ar[u+12>>2]=8,ar[(f=u+16|0)>>2]=0,ar[(r=u+20|0)>>2]=0,gA[u+24>>2]=c,gA[u+28>>2]=0,gA[u+32>>2]=a,(e=0|ar[b>>2])>>>0>=(0|ar[l>>2])>>>0?(Nl(t,u),0|(e=0|ar[r>>2])&&du(e)):(ar[e>>2]=ar[u>>2],ar[e+4>>2]=ar[u+4>>2],ar[e+8>>2]=ar[u+8>>2],ar[e+12>>2]=ar[u+12>>2],ar[e+16>>2]=ar[f>>2],ar[e+20>>2]=ar[r>>2],ar[f>>2]=0,u=u+24|(ar[r>>2]=0),ar[(i=e+24|0)>>2]=ar[u>>2],ar[i+4>>2]=ar[u+4>>2],ar[i+8>>2]=ar[u+8>>2],ar[b>>2]=e+36),ar[A>>2]=ar[t>>2],ar[A+4>>2]=ar[b>>2],ar[A+8>>2]=ar[l>>2],void(ur=o);ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,ur=o},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o,a,c,l,u,b,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0;if(ur=(b=ur)+32|0,o=b+16|0,a=b+12|0,c=b+8|0,l=b+4|0,u=b,t=0|Eo(0|ar[(r|=0)>>2],6),n=0!=(0|tr[i+8>>0]),(0|Vo(0|ar[r>>2],3))<<24>>24==8&&(0|Vo(0|ar[r>>2],4))<<24>>24==8&&(0|Vo(0|ar[r>>2],5))<<24>>24==8){if(t&&(0|Vo(0|ar[r>>2],6))<<24>>24!=8)return ar[A>>2]=0,ar[A+4>>2]=0,void(ur=b);f=0|hu(80),ar[f+4>>2]=0,ar[f+8>>2]=0,ar[f>>2]=6208,ar[(i=f+12|0)>>2]=0,ar[i+4>>2]=0,ar[i+8>>2]=0,ar[i+12>>2]=0,ar[i+16>>2]=0,ar[f+32>>2]=32215,ar[f+36>>2]=0,ar[f+40>>2]=0,ar[f+44>>2]=99,ar[f+48>>2]=99,Z=f+52|0,ar[(g=f+72|0)>>2]=0,ar[f+76>>2]=0,ar[Z>>2]=0,ar[Z+4>>2]=0,ar[Z+8>>2]=0,ar[Z+12>>2]=0,ar[f+68>>2]=g,g=i,m=(Z=f)+16|0,bu(f),su(f),e=0|ar[m>>2],ar[i>>2]=g,ar[m>>2]=Z,0|e&&ku(e),du(f),h=0|ar[r>>2],yo(i,k=0|ar[h+24>>2],h=0|ar[h+28>>2],1,n?11:10),Bo(i,10,k,h,8),ar[o>>2]=0,ar[a>>2]=0,ar[c>>2]=0,ar[l>>2]=0,w=(ar[u>>2]=0)|Ro(0|ar[r>>2],3,o),v=0|Ro(0|ar[r>>2],4,a),m=0|Ro(0|ar[r>>2],5,c),d=0|Fo(i,10,u),f=t?0|Ro(0|ar[r>>2],6,l):0;A:do{if(0<(0|h)){s=t&n,r=0<(0|k),i=0;e:for(;;){r:do{if(s){if(r)for(e=0;B=w+((0|br(0|ar[o>>2],i))+e)|0,p=e<<2,y=d+((0|br(0|ar[u>>2],i))+p)|0,tr[y>>0]=0|tr[B>>0],y=v+((0|br(0|ar[a>>2],i))+e)|0,B=d+((1|p)+(0|br(0|ar[u>>2],i)))|0,tr[B>>0]=0|tr[y>>0],B=m+((0|br(0|ar[c>>2],i))+e)|0,y=d+((2|p)+(0|br(0|ar[u>>2],i)))|0,tr[y>>0]=0|tr[B>>0],y=f+((0|br(0|ar[l>>2],i))+e)|0,p=d+((3|p)+(0|br(0|ar[u>>2],i)))|0,tr[p>>0]=0|tr[y>>0],(0|(e=e+1|0))!=(0|k););}else{if(!n){if(!r)break;for(e=0;;)if(y=w+((0|br(0|ar[o>>2],i))+e)|0,B=3*e|0,p=d+((0|br(0|ar[u>>2],i))+B)|0,tr[p>>0]=0|tr[y>>0],p=v+((0|br(0|ar[a>>2],i))+e)|0,y=d+(B+1+(0|br(0|ar[u>>2],i)))|0,tr[y>>0]=0|tr[p>>0],y=m+((0|br(0|ar[c>>2],i))+e)|0,B=d+(B+2+(0|br(0|ar[u>>2],i)))|0,tr[B>>0]=0|tr[y>>0],(0|(e=e+1|0))==(0|k))break r}if(t)break e;if(r)for(e=0;p=w+((0|br(0|ar[o>>2],i))+e)|0,B=e<<2,y=d+((0|br(0|ar[u>>2],i))+B)|0,tr[y>>0]=0|tr[p>>0],y=v+((0|br(0|ar[a>>2],i))+e)|0,p=d+((1|B)+(0|br(0|ar[u>>2],i)))|0,tr[p>>0]=0|tr[y>>0],p=m+((0|br(0|ar[c>>2],i))+e)|0,y=d+((2|B)+(0|br(0|ar[u>>2],i)))|0,tr[y>>0]=0|tr[p>>0],B=d+((3|B)+(0|br(0|ar[u>>2],i)))|0,tr[B>>0]=-1,(0|(e=e+1|0))!=(0|k););}}while(0);if((0|h)<=(0|(i=i+1|0)))break A}sr(32223,32248,281,32272)}}while(0);return ar[A>>2]=g,ar[A+4>>2]=Z,void(ur=b)}ar[A>>2]=0,ar[A+4>>2]=0,ur=b},function(A,e,r,i,f){var n,t;if(A|=0,e|=0,i|=0,f|=0,ur=(t=ur)+48|0,n=t+36|0,f=t,0==(0|ar[(r|=0)>>2])&&1==(0|ar[r+4>>2])&&8==(0|ar[r+12>>2])&&0==(0|tr[r+8>>0])){if(0|(e=0|ar[r+16>>2])){switch(0|or[e+8>>1]){case 0:case 8:case 11:case 14:return ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,void(ur=t)}if(!(0|tr[e+10>>0]))return ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,void(ur=t)}return ar[n>>2]=0,ar[(i=4+n|0)>>2]=0,ar[8+n>>2]=0,ar[f>>2]=1,ar[f+4>>2]=10,tr[f+8>>0]=0,ar[f+12>>2]=8,ar[f+16>>2]=0,ar[(e=f+20|0)>>2]=0,gA[f+24>>2]=.5,gA[f+28>>2]=0,gA[f+32>>2]=0,Nl(n,f),0|(e=0|ar[e>>2])&&du(e),ar[A>>2]=ar[n>>2],ar[A+4>>2]=ar[i>>2],ar[A+8>>2]=ar[8+n>>2],void(ur=t)}ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,ur=t},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o,a,c,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0;if(ur=(c=ur)+64|0,f=c+32|0,n=c+12|0,t=c+8|0,o=c+4|0,a=c,(0|Vo(0|ar[(r|=0)>>2],0))<<24>>24==8&&(0|Vo(0|ar[r>>2],1))<<24>>24==8&&(0|Vo(0|ar[r>>2],2))<<24>>24==8){if(i=0|hu(80),ar[i+4>>2]=0,ar[i+8>>2]=0,ar[i>>2]=6208,ar[(l=i+12|0)>>2]=0,ar[l+4>>2]=0,ar[l+8>>2]=0,ar[l+12>>2]=0,ar[l+16>>2]=0,ar[i+32>>2]=32215,ar[i+36>>2]=0,ar[i+40>>2]=0,ar[i+44>>2]=99,ar[i+48>>2]=99,p=i+52|0,ar[(Z=i+72|0)>>2]=0,ar[i+76>>2]=0,ar[p>>2]=0,ar[p+4>>2]=0,ar[p+8>>2]=0,ar[p+12>>2]=0,ar[i+68>>2]=Z,Z=l,g=(p=i)+16|0,bu(i),su(i),e=0|ar[g>>2],ar[l>>2]=Z,ar[g>>2]=p,0|e&&ku(e),du(i),v=0|ar[r>>2],yo(l,w=0|ar[v+24>>2],v=0|ar[v+28>>2],1,10),Bo(l,10,w,v,8),m=0|ar[r>>2],e=0|ar[m+40>>2],(g=0==(0|(m=0|ar[m+44>>2])))||bu(m),Ze(f),0|e&&(pe(n,0|or[e+8>>1],0|or[e+4>>1]),ar[f>>2]=ar[n>>2],ar[f+4>>2]=ar[4+n>>2],ar[f+8>>2]=ar[8+n>>2],ar[f+12>>2]=ar[12+n>>2],ar[f+16>>2]=ar[16+n>>2]),d=0|ef(256*gA[f+4>>2]),k=0|ef(256*gA[f+12>>2]),h=0|ef(256*gA[f+8>>2]),u=0|ef(256*gA[f+16>>2]),ar[n>>2]=0,ar[t>>2]=0,ar[o>>2]=0,b=(ar[a>>2]=0)|Ro(0|ar[r>>2],0,n),s=0|Ro(0|ar[r>>2],1,t),r=0|Ro(0|ar[r>>2],2,o),f=0|Fo(l,10,a),0<(0|v)&0<(0|w)){i=0;do{for(l=(0|i)/2|0,e=0;B=b+((0|br(0|ar[n>>2],i))+e)|0,B=0|cr[B>>0],W=(0|e)/2|0,E=s+((0|br(0|ar[t>>2],l))+W)|0,E=(0|cr[E>>0])-128|0,W=r+((0|br(0|ar[o>>2],l))+W)|0,W=(0|cr[W>>0])-128|0,I=(128+(0|br(W,d))>>8)+B|0,y=3*e|0,X=f+((0|br(0|ar[a>>2],i))+y)|0,tr[X>>0]=(0|I)<0?0:255<(0|I)?-1:255&I,W=(128+(0|br(E,h))+(0|br(W,k))>>8)+B|0,X=f+(y+1+(0|br(0|ar[a>>2],i)))|0,tr[X>>0]=(0|W)<0?0:255<(0|W)?-1:255&W,B=(128+(0|br(E,u))>>8)+B|0,y=f+(y+2+(0|br(0|ar[a>>2],i)))|0,tr[y>>0]=(0|B)<0?0:255<(0|B)?-1:255&B,(0|(e=e+1|0))!=(0|w););i=i+1|0}while((0|i)!=(0|v))}return(ar[A>>2]=Z,ar[A+4>>2]=p,g)?void(ur=c):(du(m),void(ur=c))}ar[A>>2]=0,ar[A+4>>2]=0,ur=c},function(A,e,r,i,f){var n,t;if(A|=0,e|=0,i|=0,f|=0,ur=(t=ur)+48|0,n=t+36|0,f=t,0==(0|ar[(r|=0)>>2])&&1==(0|ar[r+4>>2])&&8==(0|ar[r+12>>2])){if(0|(e=0|ar[r+16>>2])){switch(0|or[e+8>>1]){case 0:case 8:case 11:case 14:return ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,void(ur=t)}if(!(0|tr[e+10>>0]))return ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,void(ur=t)}return ar[n>>2]=0,ar[(i=4+n|0)>>2]=0,ar[8+n>>2]=0,ar[f>>2]=1,ar[f+4>>2]=11,tr[f+8>>0]=1,ar[f+12>>2]=8,ar[f+16>>2]=0,ar[(e=f+20|0)>>2]=0,gA[f+24>>2]=.5,gA[f+28>>2]=0,gA[f+32>>2]=0,Nl(n,f),0|(e=0|ar[e>>2])&&du(e),ar[A>>2]=ar[n>>2],ar[A+4>>2]=ar[i>>2],ar[A+8>>2]=ar[8+n>>2],void(ur=t)}ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,ur=t},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o,a,c,l,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0;if(ur=(l=ur)+64|0,f=l+36|0,t=l+16|0,o=l+12|0,a=l+8|0,c=l+4|0,n=l,(0|Vo(0|ar[(r|=0)>>2],0))<<24>>24==8&&(0|Vo(0|ar[r>>2],1))<<24>>24==8&&(0|Vo(0|ar[r>>2],2))<<24>>24==8){if(i=0|hu(80),ar[i+4>>2]=0,ar[i+8>>2]=0,ar[i>>2]=6208,ar[(u=i+12|0)>>2]=0,ar[u+4>>2]=0,ar[u+8>>2]=0,ar[u+12>>2]=0,ar[u+16>>2]=0,ar[i+32>>2]=32215,ar[i+36>>2]=0,ar[i+40>>2]=0,ar[i+44>>2]=99,ar[i+48>>2]=99,X=i+52|0,ar[(E=i+72|0)>>2]=0,ar[i+76>>2]=0,ar[X>>2]=0,ar[X+4>>2]=0,ar[X+8>>2]=0,ar[X+12>>2]=0,ar[i+68>>2]=E,E=u,B=(X=i)+16|0,bu(i),su(i),e=0|ar[B>>2],ar[u>>2]=E,ar[B>>2]=X,0|e&&ku(e),du(i),p=0|ar[r>>2],yo(u,Z=0|ar[p+24>>2],p=0|ar[p+28>>2],1,11),Bo(u,10,Z,p,8),y=0|ar[r>>2],e=0|ar[y+40>>2],(B=0==(0|(y=0|ar[y+44>>2])))||bu(y),Ze(f),0|e&&(pe(t,0|or[e+8>>1],0|or[e+4>>1]),ar[f>>2]=ar[t>>2],ar[f+4>>2]=ar[4+t>>2],ar[f+8>>2]=ar[8+t>>2],ar[f+12>>2]=ar[12+t>>2],ar[f+16>>2]=ar[16+t>>2]),v=0|ef(256*gA[f+4>>2]),m=0|ef(256*gA[f+12>>2]),g=0|ef(256*gA[f+8>>2]),s=0|ef(256*gA[f+16>>2]),d=0|Eo(0|ar[r>>2],6),ar[t>>2]=0,ar[o>>2]=0,ar[a>>2]=0,ar[c>>2]=0,k=(ar[n>>2]=0)|Ro(0|ar[r>>2],0,t),h=0|Ro(0|ar[r>>2],1,o),w=0|Ro(0|ar[r>>2],2,a),b=d?0|Ro(0|ar[r>>2],6,c):0,f=0|Fo(u,10,n),0<(0|p)){u=0<(0|Z),i=0;do{if(u)if(r=(0|i)/2|0,d)for(e=0;C=k+((0|br(0|ar[t>>2],i))+e)|0,C=0|cr[C>>0],V=(0|e)/2|0,W=h+((0|br(0|ar[o>>2],r))+V)|0,W=(0|cr[W>>0])-128|0,V=w+((0|br(0|ar[a>>2],r))+V)|0,V=(0|cr[V>>0])-128|0,F=(128+(0|br(V,v))>>8)+C|0,I=e<<2,G=f+((0|br(0|ar[n>>2],i))+I)|0,tr[G>>0]=(0|F)<0?0:255<(0|F)?-1:255&F,V=(128+(0|br(W,g))+(0|br(V,m))>>8)+C|0,G=f+((1|I)+(0|br(0|ar[n>>2],i)))|0,tr[G>>0]=(0|V)<0?0:255<(0|V)?-1:255&V,C=(128+(0|br(W,s))>>8)+C|0,W=f+((2|I)+(0|br(0|ar[n>>2],i)))|0,tr[W>>0]=(0|C)<0?0:255<(0|C)?-1:255&C,W=0|br(0|ar[n>>2],i),C=b+((0|br(0|ar[c>>2],i))+e)|0,tr[f+((3|I)+W)>>0]=0|tr[C>>0],(0|(e=e+1|0))!=(0|Z););else for(e=0;G=k+((0|br(0|ar[t>>2],i))+e)|0,G=0|cr[G>>0],I=(0|e)/2|0,V=h+((0|br(0|ar[o>>2],r))+I)|0,V=(0|cr[V>>0])-128|0,I=w+((0|br(0|ar[a>>2],r))+I)|0,I=(0|cr[I>>0])-128|0,W=(128+(0|br(I,v))>>8)+G|0,F=e<<2,C=f+((0|br(0|ar[n>>2],i))+F)|0,tr[C>>0]=(0|W)<0?0:255<(0|W)?-1:255&W,I=(128+(0|br(V,g))+(0|br(I,m))>>8)+G|0,C=f+((1|F)+(0|br(0|ar[n>>2],i)))|0,tr[C>>0]=(0|I)<0?0:255<(0|I)?-1:255&I,G=(128+(0|br(V,s))>>8)+G|0,V=f+((2|F)+(0|br(0|ar[n>>2],i)))|0,tr[V>>0]=(0|G)<0?0:255<(0|G)?-1:255&G,F=f+((3|F)+(0|br(0|ar[n>>2],i)))|0,tr[F>>0]=-1,(0|(e=e+1|0))!=(0|Z););i=i+1|0}while((0|i)!=(0|p))}return(ar[A>>2]=E,ar[A+4>>2]=X,B)?void(ur=l):(du(y),void(ur=l))}ar[A>>2]=0,ar[A+4>>2]=0,ur=l},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o=0,a=0,c=0,l=0,u=0,b=0;if(ur=(t=ur)+64|0,n=t+36|0,c=t+48|0,u=t,1==(0|ar[(r|=0)>>2])&&3==(0|ar[r+4>>2])&&8!=(0|(o=0|ar[(a=r+12|0)>>2])))return ar[n>>2]=0,ar[(b=4+n|0)>>2]=0,(ar[8+n>>2]=0)|tr[r+8>>0]?(l=8+n|0,e=o,r=f=o=0):(ar[u>>2]=1,ar[u+4>>2]=12,tr[u+8>>0]=0,tr[(e=u+9|0)>>0]=0|tr[c>>0],tr[e+1>>0]=0|tr[c+1>>0],tr[e+2>>0]=0|tr[c+2>>0],ar[u+12>>2]=o,ar[u+16>>2]=0,ar[(e=u+20|0)>>2]=0,gA[u+24>>2]=.5,gA[u+28>>2]=0,i=8+n|(gA[u+32>>2]=0),Nl(n,u),0|(e=0|ar[e>>2])&&du(e),r=0|ar[b>>2],l=i,e=0|ar[a>>2],o=r,f=0|ar[i>>2]),ar[u>>2]=1,ar[u+4>>2]=13,tr[u+8>>0]=1,tr[(i=u+9|0)>>0]=0|tr[c>>0],tr[i+1>>0]=0|tr[c+1>>0],tr[i+2>>0]=0|tr[c+2>>0],ar[u+12>>2]=e,ar[(e=u+16|0)>>2]=0,ar[(i=u+20|0)>>2]=0,gA[u+24>>2]=.5,gA[u+28>>2]=0,f>>>(gA[u+32>>2]=0)<=o>>>0?(Nl(n,u),0|(e=0|ar[i>>2])&&du(e)):(ar[r>>2]=ar[u>>2],ar[r+4>>2]=ar[u+4>>2],ar[r+8>>2]=ar[u+8>>2],ar[r+12>>2]=ar[u+12>>2],ar[o+16>>2]=ar[e>>2],ar[o+20>>2]=ar[i>>2],ar[e>>2]=0,u=u+24|(ar[i>>2]=0),ar[(c=o+24|0)>>2]=ar[u>>2],ar[c+4>>2]=ar[u+4>>2],ar[c+8>>2]=ar[u+8>>2],ar[b>>2]=o+36),ar[A>>2]=ar[n>>2],ar[A+4>>2]=ar[b>>2],ar[A+8>>2]=ar[l>>2],ar[l>>2]=0,void(ur=t);ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,ur=t},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o,a,c,l,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0;if(ur=(l=ur)+32|0,n=l+16|0,t=l+12|0,o=l+8|0,a=l+4|0,c=l,(0|Vo(0|ar[(r|=0)>>2],3))<<24>>24!=8&&(0|Vo(0|ar[r>>2],4))<<24>>24!=8&&(0|Vo(0|ar[r>>2],5))<<24>>24!=8){v=0|Eo(0|ar[r>>2],6);do{if(v){if((0|Vo(0|ar[r>>2],6))<<24>>24==8)return ar[A>>2]=0,ar[A+4>>2]=0,void(ur=l);if((0|(g=0|Xo(0|ar[r>>2],6)))==(0|Xo(0|ar[r>>2],4))&&(0|(g=0|Wo(0|ar[r>>2],6)))==(0|Wo(0|ar[r>>2],4)))break;return ar[A>>2]=0,ar[A+4>>2]=0,void(ur=l)}}while(0);if(f=0|hu(80),ar[f+4>>2]=0,ar[f+8>>2]=0,ar[f>>2]=6208,ar[(u=f+12|0)>>2]=0,ar[u+4>>2]=0,ar[u+8>>2]=0,ar[u+12>>2]=0,ar[u+16>>2]=0,ar[f+32>>2]=32215,ar[f+36>>2]=0,ar[f+40>>2]=0,ar[f+44>>2]=99,ar[f+48>>2]=99,g=f+52|0,ar[(m=f+72|0)>>2]=0,ar[f+76>>2]=0,ar[g>>2]=0,ar[g+4>>2]=0,ar[g+8>>2]=0,ar[g+12>>2]=0,ar[f+68>>2]=m,m=u,w=(g=f)+16|0,bu(f),su(f),e=0|ar[w>>2],ar[u>>2]=m,ar[w>>2]=g,0|e&&ku(e),du(f),w=0|ar[r>>2],yo(u,h=0|ar[w+24>>2],w=0|ar[w+28>>2],1,0|tr[i+8>>0]?13:12),Bo(u,10,h,w,255&(0|Vo(0|ar[r>>2],3))),ar[n>>2]=0,ar[t>>2]=0,ar[o>>2]=0,ar[a>>2]=0,s=(ar[c>>2]=0)|Ro(0|ar[r>>2],3,n),d=0|Ro(0|ar[r>>2],4,t),k=0|Ro(0|ar[r>>2],5,o),b=0|Fo(u,10,c),e=v?(u=0|Ro(0|ar[r>>2],6,a),(0|ar[a>>2])/2|0):u=0,ar[n>>2]=(0|ar[n>>2])/2|0,ar[t>>2]=(0|ar[t>>2])/2|0,ar[o>>2]=(0|ar[o>>2])/2|0,ar[a>>2]=e,0<(0|w)){i=0<(0|h),f=0;do{if(v){if(i)for(e=0;E=s+((0|br(0|ar[n>>2],f))+e<<1)|0,E=0|or[E>>1],B=d+((0|br(0|ar[t>>2],f))+e<<1)|0,B=0|or[B>>1],y=k+((0|br(0|ar[o>>2],f))+e<<1)|0,y=0|or[y>>1],Z=u+((0|br(0|ar[a>>2],f))+e<<1)|0,Z=0|or[Z>>1],r=e<<3,p=b+((0|br(0|ar[c>>2],f))+r)|0,tr[p>>0]=(65535&E)>>>8,p=b+((1|r)+(0|br(0|ar[c>>2],f)))|0,tr[p>>0]=E,p=b+((2|r)+(0|br(0|ar[c>>2],f)))|0,tr[p>>0]=(65535&B)>>>8,p=b+((3|r)+(0|br(0|ar[c>>2],f)))|0,tr[p>>0]=B,p=b+((4|r)+(0|br(0|ar[c>>2],f)))|0,tr[p>>0]=(65535&y)>>>8,p=b+((5|r)+(0|br(0|ar[c>>2],f)))|0,tr[p>>0]=y,p=b+((6|r)+(0|br(0|ar[c>>2],f)))|0,tr[p>>0]=(65535&Z)>>>8,r=b+((7|r)+(0|br(0|ar[c>>2],f)))|0,tr[r>>0]=Z,(0|(e=e+1|0))!=(0|h););}else if(i)for(e=0;Z=s+((0|br(0|ar[n>>2],f))+e<<1)|0,Z=0|or[Z>>1],p=d+((0|br(0|ar[t>>2],f))+e<<1)|0,p=0|or[p>>1],B=k+((0|br(0|ar[o>>2],f))+e<<1)|0,B=0|or[B>>1],E=6*e|0,y=b+((0|br(0|ar[c>>2],f))+E)|0,tr[y>>0]=(65535&Z)>>>8,y=b+((1|E)+(0|br(0|ar[c>>2],f)))|0,tr[y>>0]=Z,y=b+(E+2+(0|br(0|ar[c>>2],f)))|0,tr[y>>0]=(65535&p)>>>8,y=b+(E+3+(0|br(0|ar[c>>2],f)))|0,tr[y>>0]=p,y=b+(E+4+(0|br(0|ar[c>>2],f)))|0,tr[y>>0]=(65535&B)>>>8,E=b+(E+5+(0|br(0|ar[c>>2],f)))|0,tr[E>>0]=B,(0|(e=e+1|0))!=(0|h););f=f+1|0}while((0|f)!=(0|w))}return ar[A>>2]=m,ar[A+4>>2]=g,void(ur=l)}ar[A>>2]=0,ar[A+4>>2]=0,ur=l},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o=0,a=0,c=0,l=0,u=0;if(ur=(t=ur)+64|0,n=t+36|0,a=t+48|0,l=t,1==(0|ar[(r|=0)>>2])&&3==(0|ar[r+4>>2])&&8==(0|ar[(o=r+12|0)>>2]))return ar[n>>2]=0,ar[(u=4+n|0)>>2]=0,(ar[8+n>>2]=0)|tr[r+8>>0]?(c=8+n|0,e=8,r=f=o=0):(ar[l>>2]=1,ar[l+4>>2]=12,tr[l+8>>0]=0,tr[(e=l+9|0)>>0]=0|tr[a>>0],tr[e+1>>0]=0|tr[a+1>>0],tr[e+2>>0]=0|tr[a+2>>0],ar[l+12>>2]=8,ar[l+16>>2]=0,ar[(e=l+20|0)>>2]=0,gA[l+24>>2]=.5,gA[l+28>>2]=0,i=8+n|(gA[l+32>>2]=0),Nl(n,l),0|(e=0|ar[e>>2])&&du(e),r=0|ar[u>>2],c=i,e=0|ar[o>>2],o=r,f=0|ar[i>>2]),ar[l>>2]=1,ar[l+4>>2]=13,tr[l+8>>0]=1,tr[(i=l+9|0)>>0]=0|tr[a>>0],tr[i+1>>0]=0|tr[a+1>>0],tr[i+2>>0]=0|tr[a+2>>0],ar[l+12>>2]=e,ar[(e=l+16|0)>>2]=0,ar[(i=l+20|0)>>2]=0,gA[l+24>>2]=.5,gA[l+28>>2]=0,f>>>(gA[l+32>>2]=0)<=o>>>0?(Nl(n,l),0|(e=0|ar[i>>2])&&du(e)):(ar[r>>2]=ar[l>>2],ar[r+4>>2]=ar[l+4>>2],ar[r+8>>2]=ar[l+8>>2],ar[r+12>>2]=ar[l+12>>2],ar[o+16>>2]=ar[e>>2],ar[o+20>>2]=ar[i>>2],ar[e>>2]=0,l=l+24|(ar[i>>2]=0),ar[(a=o+24|0)>>2]=ar[l>>2],ar[a+4>>2]=ar[l+4>>2],ar[a+8>>2]=ar[l+8>>2],ar[u>>2]=o+36),ar[A>>2]=ar[n>>2],ar[A+4>>2]=ar[u>>2],ar[A+8>>2]=ar[c>>2],ar[c>>2]=0,void(ur=t);ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,ur=t},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o,a,c,l,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0;if(ur=(l=ur)+32|0,n=l+16|0,t=l+12|0,o=l+8|0,a=l+4|0,c=l,(0|Vo(0|ar[(r|=0)>>2],3))<<24>>24==8&&(0|Vo(0|ar[r>>2],4))<<24>>24==8&&(0|Vo(0|ar[r>>2],5))<<24>>24==8){if((v=0|Eo(0|ar[r>>2],6))&&(0|Vo(0|ar[r>>2],6))<<24>>24!=8)return ar[A>>2]=0,ar[A+4>>2]=0,void(ur=l);if(f=0|hu(80),ar[f+4>>2]=0,ar[f+8>>2]=0,ar[f>>2]=6208,ar[(u=f+12|0)>>2]=0,ar[u+4>>2]=0,ar[u+8>>2]=0,ar[u+12>>2]=0,ar[u+16>>2]=0,ar[f+32>>2]=32215,ar[f+36>>2]=0,ar[f+40>>2]=0,ar[f+44>>2]=99,ar[f+48>>2]=99,g=f+52|0,ar[(m=f+72|0)>>2]=0,ar[f+76>>2]=0,ar[g>>2]=0,ar[g+4>>2]=0,ar[g+8>>2]=0,ar[g+12>>2]=0,ar[f+68>>2]=m,m=u,w=(g=f)+16|0,bu(f),su(f),e=0|ar[w>>2],ar[u>>2]=m,ar[w>>2]=g,0|e&&ku(e),du(f),w=0|ar[r>>2],yo(u,h=0|ar[w+24>>2],w=0|ar[w+28>>2],1,0|tr[i+8>>0]?13:12),Bo(u,10,h,w,255&(0|Vo(0|ar[r>>2],3))),ar[n>>2]=0,ar[t>>2]=0,ar[o>>2]=0,ar[a>>2]=0,s=(ar[c>>2]=0)|Ro(0|ar[r>>2],3,n),d=0|Ro(0|ar[r>>2],4,t),k=0|Ro(0|ar[r>>2],5,o),b=0|Fo(u,10,c),f=v?0|Ro(0|ar[r>>2],6,a):0,0<(0|w)){u=0<(0|h),i=0;do{if(v){if(u)for(e=0;r=e<<3,p=b+((0|br(0|ar[c>>2],i))+r)|0,p=s+(((tr[p>>0]=0)|br(0|ar[n>>2],i))+e)|0,Z=b+((1|r)+(0|br(0|ar[c>>2],i)))|0,tr[Z>>0]=0|tr[p>>0],Z=b+((2|r)+(0|br(0|ar[c>>2],i)))|0,Z=d+(((tr[Z>>0]=0)|br(0|ar[t>>2],i))+e)|0,p=b+((3|r)+(0|br(0|ar[c>>2],i)))|0,tr[p>>0]=0|tr[Z>>0],p=b+((4|r)+(0|br(0|ar[c>>2],i)))|0,p=k+(((tr[p>>0]=0)|br(0|ar[o>>2],i))+e)|0,Z=b+((5|r)+(0|br(0|ar[c>>2],i)))|0,tr[Z>>0]=0|tr[p>>0],Z=b+((6|r)+(0|br(0|ar[c>>2],i)))|0,Z=f+(((tr[Z>>0]=0)|br(0|ar[a>>2],i))+e)|0,r=b+((7|r)+(0|br(0|ar[c>>2],i)))|0,tr[r>>0]=0|tr[Z>>0],(0|(e=e+1|0))!=(0|h););}else if(u)for(e=0;p=e<<3,Z=b+((0|br(0|ar[c>>2],i))+p)|0,Z=s+(((tr[Z>>0]=0)|br(0|ar[n>>2],i))+e)|0,r=b+((1|p)+(0|br(0|ar[c>>2],i)))|0,tr[r>>0]=0|tr[Z>>0],r=b+((2|p)+(0|br(0|ar[c>>2],i)))|0,r=d+(((tr[r>>0]=0)|br(0|ar[t>>2],i))+e)|0,Z=b+((3|p)+(0|br(0|ar[c>>2],i)))|0,tr[Z>>0]=0|tr[r>>0],Z=b+((4|p)+(0|br(0|ar[c>>2],i)))|0,Z=k+(((tr[Z>>0]=0)|br(0|ar[o>>2],i))+e)|0,p=b+((5|p)+(0|br(0|ar[c>>2],i)))|0,tr[p>>0]=0|tr[Z>>0],(0|(e=e+1|0))!=(0|h););i=i+1|0}while((0|i)!=(0|w))}return ar[A>>2]=m,ar[A+4>>2]=g,void(ur=l)}ar[A>>2]=0,ar[A+4>>2]=0,ur=l},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t=0,o=0;if(ur=(n=ur)+48|0,f=n+36|0,e=n,1==(0|ar[(r|=0)>>2])&&12==(-2&(t=0|ar[r+4>>2])|0)&&8!=(0|(o=0|ar[r+12>>2])))return ar[f>>2]=0,ar[(i=f+4|0)>>2]=0,ar[f+8>>2]=0,ar[e>>2]=1,ar[e+4>>2]=3,tr[e+8>>0]=15==(2|t)&1,ar[e+12>>2]=o,ar[e+16>>2]=0,ar[(o=e+20|0)>>2]=0,gA[e+24>>2]=.20000000298023224,gA[e+28>>2]=0,gA[e+32>>2]=0,Nl(f,e),0|(e=0|ar[o>>2])&&du(e),ar[A>>2]=ar[f>>2],ar[A+4>>2]=ar[i>>2],ar[A+8>>2]=ar[f+8>>2],void(ur=n);ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,ur=n},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o,a,c,l,u,b,s,d,k,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0;if(ur=(k=ur)+32|0,d=k+16|0,h=k+12|0,w=k+8|0,v=k+4|0,m=k,s=15==(2|ar[36+(0|ar[(r|=0)>>2])>>2]),i=0|hu(80),ar[i+4>>2]=0,ar[i+8>>2]=0,ar[i>>2]=6208,ar[(f=i+12|0)>>2]=0,ar[f+4>>2]=0,ar[f+8>>2]=0,ar[f+12>>2]=0,ar[f+16>>2]=0,ar[i+32>>2]=32215,ar[i+36>>2]=0,ar[i+40>>2]=0,ar[i+44>>2]=99,ar[i+48>>2]=99,e=i+52|0,ar[(y=i+72|0)>>2]=0,ar[i+76>>2]=0,ar[e>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[i+68>>2]=y,ar[A>>2]=f,y=(ar[A+4>>2]=i)+16|0,bu(i),su(i),e=0|ar[y>>2],ar[f>>2]=f,ar[y>>2]=i,0|e&&ku(e),du(i),p=0|ar[r>>2],yo(f,b=0|ar[p+24>>2],p=0|ar[p+28>>2],1,3),Bo(f,3,b,p,255&(0|Vo(0|ar[r>>2],10))),Bo(f,4,b,p,255&(0|Vo(0|ar[r>>2],10))),Bo(f,5,b,p,255&(0|Vo(0|ar[r>>2],10))),s&&Bo(f,6,b,p,255&(0|Vo(0|ar[r>>2],10))),ar[d>>2]=0,y=s?8:6,ar[h>>2]=0,ar[w>>2]=0,ar[v>>2]=0,a=(ar[m>>2]=0)|Ro(0|ar[r>>2],10,d),c=0|Fo(f,3,h),l=0|Fo(f,4,w),u=0|Fo(f,5,v),Z=s?(g=0|Fo(f,6,m),(0|ar[m>>2])/2|0):g=0,o=(0|ar[h>>2])/2|0,ar[h>>2]=o,t=(0|ar[w>>2])/2|0,ar[w>>2]=t,n=(0|ar[v>>2])/2|0,ar[v>>2]=n,ar[m>>2]=Z,(0|p)<=0)ur=k;else{A=0<(0|b),f=0;do{A:do{if(A){if(r=0|br(0|ar[d>>2],f),h=0|br(o,f),w=0|br(t,f),v=0|br(n,f),!s)for(e=0;;)if(B=r+(0|br(e,y))|0,i=65535&((0|cr[a+(B+2)>>0])<<8|0|cr[a+(B+3)>>0]),m=65535&((0|cr[a+(B+4)>>0])<<8|0|cr[a+(B+5)>>0]),or[c+(h+e<<1)>>1]=(0|cr[a+B>>0])<<8|0|cr[a+(B+1)>>0],or[l+(w+e<<1)>>1]=i,or[u+(v+e<<1)>>1]=m,(0|(e=e+1|0))==(0|b))break A;for(i=0|br(Z,f),e=0;E=r+(0|br(e,y))|0,m=65535&((0|cr[a+(E+2)>>0])<<8|0|cr[a+(E+3)>>0]),B=65535&((0|cr[a+(E+4)>>0])<<8|0|cr[a+(E+5)>>0]),or[c+(h+e<<1)>>1]=(0|cr[a+E>>0])<<8|0|cr[a+(E+1)>>0],or[l+(w+e<<1)>>1]=m,or[u+(v+e<<1)>>1]=B,B=r+(e<<3)|0,or[g+(i+e<<1)>>1]=(0|cr[a+(B+6)>>0])<<8|0|cr[a+(B+7)>>0],(0|(e=e+1|0))!=(0|b););}}while(0);f=f+1|0}while((0|f)!=(0|p));ur=k}},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o=0,a=0,c=0,l=0;if(ur=(t=ur)+64|0,n=t+36|0,i=t+48|0,c=t,1==(0|ar[(r|=0)>>2])&&12==(-4&(o=0|ar[(a=r+4|0)>>2])|0)){switch(ar[n>>2]=0,ar[(l=4+n|0)>>2]=0,(ar[8+n>>2]=0)|o){case 12:case 14:e=0|ar[r+12>>2],ar[c>>2]=1,ar[c+4>>2]=14==(0|o)?12:14,tr[c+8>>0]=0,tr[(o=c+9|0)>>0]=0|tr[i>>0],tr[o+1>>0]=0|tr[i+1>>0],tr[o+2>>0]=0|tr[i+2>>0],ar[c+12>>2]=e,ar[c+16>>2]=0,ar[(e=c+20|0)>>2]=0,gA[c+24>>2]=.10000000149011612,gA[c+28>>2]=0,gA[c+32>>2]=0,Nl(n,c),0|(e=0|ar[e>>2])&&du(e),e=0|ar[a>>2];break;default:e=o}switch(0|e){case 13:case 15:f=0|ar[r+12>>2],ar[c>>2]=1,ar[c+4>>2]=15==(0|e)?13:15,tr[c+8>>0]=1,tr[(o=c+9|0)>>0]=0|tr[i>>0],tr[o+1>>0]=0|tr[i+1>>0],tr[o+2>>0]=0|tr[i+2>>0],ar[c+12>>2]=f,ar[(i=c+16|0)>>2]=0,ar[(f=c+20|0)>>2]=0,gA[c+24>>2]=.10000000149011612,gA[c+28>>2]=0,(o=(gA[c+32>>2]=0)|ar[l>>2])>>>0>=(0|ar[(e=8+n|0)>>2])>>>0?(Nl(n,c),0|(i=0|ar[f>>2])&&du(i)):(ar[o>>2]=ar[c>>2],ar[o+4>>2]=ar[c+4>>2],ar[o+8>>2]=ar[c+8>>2],ar[o+12>>2]=ar[c+12>>2],ar[o+16>>2]=ar[i>>2],ar[o+20>>2]=ar[f>>2],ar[i>>2]=0,c=c+24|(ar[f>>2]=0),ar[(r=o+24|0)>>2]=ar[c>>2],ar[r+4>>2]=ar[c+4>>2],ar[r+8>>2]=ar[c+8>>2],ar[l>>2]=o+36);break;default:e=8+n|0}return ar[A>>2]=ar[n>>2],ar[A+4>>2]=ar[l>>2],ar[A+8>>2]=ar[e>>2],ar[e>>2]=0,void(ur=t)}ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,ur=t},function(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f|=0;var n,t,o,a=0,c=0,l=0,u=0,b=0,s=0,d=0;switch(ur=(o=ur)+16|0,n=o+4|0,t=o,a=0|hu(80),ar[a+4>>2]=0,ar[a+8>>2]=0,ar[a>>2]=6208,ar[(i=a+12|0)>>2]=0,ar[i+4>>2]=0,ar[i+8>>2]=0,ar[i+12>>2]=0,ar[i+16>>2]=0,ar[a+32>>2]=32215,ar[a+36>>2]=0,ar[a+40>>2]=0,ar[a+44>>2]=99,ar[a+48>>2]=99,u=a+52|0,ar[(l=a+72|0)>>2]=0,ar[a+76>>2]=0,ar[u>>2]=0,ar[u+4>>2]=0,ar[u+8>>2]=0,ar[u+12>>2]=0,ar[a+68>>2]=l,l=i,c=(u=a)+16|0,bu(a),su(a),e=0|ar[c>>2],ar[i>>2]=l,ar[c>>2]=u,0|e&&ku(e),du(a),e=0|ar[r>>2],f=0|ar[e+24>>2],c=0|ar[e+28>>2],0|ar[e+36>>2]){case 14:yo(i,f,c,1,12),e=i;break;case 12:yo(i,f,c,1,14),e=i;break;case 15:yo(i,f,c,1,13),e=i;break;case 13:yo(i,f,c,1,15),e=i;break;default:return ar[A>>2]=0,ar[A+4>>2]=0,du(a),void(ur=o)}if(Bo(e,10,f,c,255&(0|Vo(0|ar[r>>2],10))),ar[n>>2]=0,r=(ar[t>>2]=0)|Ro(0|ar[r>>2],10,n),f=0|Fo(e,10,t),0<(0|c)&0<(0|(a=(0|(i=0|ar[t>>2]))<(0|(a=0|ar[n>>2]))?i:a))){i=0;do{for(e=0;d=r+((b=1|e)+(0|br(0|ar[n>>2],i)))|0,s=f+((0|br(0|ar[t>>2],i))+e)|0,tr[s>>0]=0|tr[d>>0],s=r+((0|br(0|ar[n>>2],i))+e)|0,b=f+(b+(0|br(0|ar[t>>2],i)))|0,tr[b>>0]=0|tr[s>>0],(0|(e=e+2|0))<(0|a););i=i+1|0}while((0|i)!=(0|c))}ar[A>>2]=l,ar[A+4>>2]=u,ur=o},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t=0;if(ur=(n=ur)+48|0,f=n+36|0,e=n,2==(0|ar[(r|=0)>>2])&&0==(0|ar[r+4>>2]))return ar[f>>2]=0,ar[(i=f+4|0)>>2]=0,t=(ar[f+8>>2]=0)|tr[r+8>>0],r=0|ar[r+12>>2],ar[e>>2]=0,ar[e+4>>2]=1,tr[e+8>>0]=t,ar[e+12>>2]=r,ar[e+16>>2]=0,ar[(r=e+20|0)>>2]=0,gA[e+24>>2]=.10000000149011612,gA[e+28>>2]=0,gA[e+32>>2]=0,Nl(f,e),0|(e=0|ar[r>>2])&&du(e),ar[A>>2]=ar[f>>2],ar[A+4>>2]=ar[i>>2],ar[A+8>>2]=ar[f+8>>2],void(ur=n);ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,ur=n},function(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f|=0;var n,t,o,a,c,l,u,b,s,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0;if(ur=(s=ur)+16|0,u=s+12|0,b=s+8|0,a=s+4|0,c=s,i=0|hu(80),ar[i+4>>2]=0,ar[i+8>>2]=0,ar[i>>2]=6208,ar[(l=i+12|0)>>2]=0,ar[4+l>>2]=0,ar[8+l>>2]=0,ar[12+l>>2]=0,ar[16+l>>2]=0,ar[i+32>>2]=32215,ar[i+36>>2]=0,ar[i+40>>2]=0,ar[i+44>>2]=99,ar[i+48>>2]=99,e=i+52|0,ar[(B=i+72|0)>>2]=0,ar[i+76>>2]=0,ar[e>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[i+68>>2]=B,ar[A>>2]=l,B=(ar[A+4>>2]=i)+16|0,bu(i),su(i),e=0|ar[B>>2],ar[l>>2]=l,ar[B>>2]=i,0|e&&ku(e),du(i),B=0|ar[r>>2],yo(l,o=0|ar[B+24>>2],B=0|ar[B+28>>2],0,1),n=(1+o|0)/2|0,p=(B+1|0)/2|0,Bo(l,0,o,B,i=255&(e=0|Vo(0|ar[r>>2],0))),Bo(l,1,n,p,i),Bo(l,2,n,p,i),(t=0|Eo(0|ar[r>>2],6))?Bo(l,6,o,B,y=255&(0|Vo(0|ar[r>>2],6))):y=0,e<<24>>24==8){if(ar[u>>2]=0,ar[b>>2]=0,ar[a>>2]=0,i=(ar[c>>2]=0)|Ro(0|ar[r>>2],0,c),f=0|Fo(l,0,a),g=0|Fo(l,1,u),Z=0|Fo(l,2,b),vb(0|g,-128,0|br(0|ar[u>>2],p)),vb(0|Z,-128,0|br(0|ar[b>>2],p)),0<(0|B))for(e=0;hb(0|(p=f+(0|br(0|ar[a>>2],e))|0),i+(0|br(0|ar[c>>2],e))|0,0|o),(0|(e=e+1|0))!=(0|B););}else{ar[u>>2]=0,ar[b>>2]=0,ar[a>>2]=0,g=(ar[c>>2]=0)|Ro(0|ar[r>>2],0,c),Z=0|Fo(l,0,a),k=0|Fo(l,1,u),h=0|Fo(l,2,b),ar[c>>2]=(0|ar[c>>2])/2|0,ar[a>>2]=(0|ar[a>>2])/2|0,w=(0|ar[u>>2])/2|0,ar[u>>2]=w,v=(0|ar[b>>2])/2|0,ar[b>>2]=v,m=0<(0|B);do{if(m){if(f=128<<i+-8&65535,0<(0|o)){i=0;do{for(A=0|br(w,i),d=0|br(v,i),e=0;or[k+(A+e<<1)>>1]=f,or[h+(d+e<<1)>>1]=f,(0|(e=e+1|0))<(0|n););i=i+1|0}while((0|i)<(0|p));if(!m)break}if(hb(0|Z,0|g,0|(e=o<<1)),1!=(0|B))for(i=1;hb(Z+((0|br(0|ar[a>>2],i))<<1)|0,g+((0|br(0|ar[c>>2],i))<<1)|0,0|e),(0|(i=i+1|0))!=(0|B););}}while(0)}if(t){if(ar[u>>2]=0,A=(ar[b>>2]=0)|Ro(0|ar[r>>2],6,u),f=0|Fo(l,6,b),i=o<<(8<y>>>0&1),0<(0|B))for(e=0;hb(0|(r=f+(0|br(0|ar[b>>2],e))|0),A+(0|br(0|ar[u>>2],e))|0,0|i),(0|(e=e+1|0))!=(0|B););ur=s}else ur=s},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o=0,a=0,c=0,l=0,u=0;switch(ur=(t=ur)+64|0,n=t+36|0,o=t+48|0,l=t,0|ar[(r|=0)>>2]){case 0:case 2:if(0==(0|ar[r+4>>2])&&8==(0|ar[r+12>>2]))return ar[n>>2]=0,ar[(u=4+n|0)>>2]=0,(ar[8+n>>2]=0)|tr[r+8>>0]?(c=8+n|0,r=f=a=0):(ar[l>>2]=1,ar[l+4>>2]=10,tr[l+8>>0]=0,tr[(e=l+9|0)>>0]=0|tr[o>>0],tr[e+1>>0]=0|tr[o+1>>0],tr[e+2>>0]=0|tr[o+2>>0],ar[l+12>>2]=8,ar[l+16>>2]=0,ar[(e=l+20|0)>>2]=0,gA[l+24>>2]=.10000000149011612,gA[l+28>>2]=0,i=8+n|(gA[l+32>>2]=0),Nl(n,l),0|(e=0|ar[e>>2])&&du(e),a=r=0|ar[u>>2],f=0|ar[(c=i)>>2]),ar[l>>2]=1,ar[l+4>>2]=11,tr[l+8>>0]=1,tr[(e=l+9|0)>>0]=0|tr[o>>0],tr[e+1>>0]=0|tr[o+1>>0],tr[e+2>>0]=0|tr[o+2>>0],ar[l+12>>2]=8,ar[(e=l+16|0)>>2]=0,ar[(i=l+20|0)>>2]=0,gA[l+24>>2]=.15000000596046448,gA[l+28>>2]=0,f>>>(gA[l+32>>2]=0)<=a>>>0?(Nl(n,l),0|(e=0|ar[i>>2])&&du(e)):(ar[r>>2]=ar[l>>2],ar[r+4>>2]=ar[l+4>>2],ar[r+8>>2]=ar[l+8>>2],ar[r+12>>2]=ar[l+12>>2],ar[a+16>>2]=ar[e>>2],ar[a+20>>2]=ar[i>>2],ar[e>>2]=0,l=l+24|(ar[i>>2]=0),ar[(o=a+24|0)>>2]=ar[l>>2],ar[o+4>>2]=ar[l+4>>2],ar[o+8>>2]=ar[l+8>>2],ar[u>>2]=a+36),ar[A>>2]=ar[n>>2],ar[A+4>>2]=ar[u>>2],ar[A+8>>2]=ar[c>>2],ar[c>>2]=0,void(ur=t)}ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,ur=t},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o,a,c,l,u,b=0,s=0,d=0,k=0,h=0,w=0,v=0;if(ur=(u=ur)+16|0,c=u+8|0,t=u+4|0,l=u,k=0|ar[(r|=0)>>2],o=0|ar[k+24>>2],a=0|ar[k+28>>2],(0|Vo(k,0))<<24>>24!=8)return ar[A>>2]=0,ar[A+4>>2]=0,void(ur=u);if(f=0|hu(80),ar[f+4>>2]=0,ar[f+8>>2]=0,ar[f>>2]=6208,ar[(b=f+12|0)>>2]=0,ar[b+4>>2]=0,ar[b+8>>2]=0,ar[b+12>>2]=0,ar[b+16>>2]=0,ar[f+32>>2]=32215,ar[f+36>>2]=0,ar[f+40>>2]=0,ar[f+44>>2]=99,ar[f+48>>2]=99,k=f+52|0,ar[(d=f+72|0)>>2]=0,ar[f+76>>2]=0,ar[k>>2]=0,ar[k+4>>2]=0,ar[k+8>>2]=0,ar[k+12>>2]=0,ar[f+68>>2]=d,d=b,s=(k=f)+16|0,bu(f),su(f),e=0|ar[s>>2],ar[b>>2]=d,ar[s>>2]=k,0|e&&ku(e),du(f),e=0|Eo(0|ar[r>>2],6),0|tr[(n=i+8|0)>>0]?yo(b,o,a,1,11):yo(b,o,a,1,10),Bo(b,10,o,a,8),ar[c>>2]=0,s=(ar[l>>2]=0)|Ro(0|ar[r>>2],0,c),i=e?0|Ro(0|ar[r>>2],6,t):0,b=0|Fo(b,10,l),0<(0|a))if(r=0<(0|o),e){f=0;do{if(0|tr[n>>0]){if(r)for(e=0;h=s+((0|br(0|ar[c>>2],f))+e)|0,h=0|tr[h>>0],v=e<<2,w=b+((0|br(0|ar[l>>2],f))+v)|0,tr[w>>0]=h,w=b+((1|v)+(0|br(0|ar[l>>2],f)))|0,tr[w>>0]=h,w=b+((2|v)+(0|br(0|ar[l>>2],f)))|0,tr[w>>0]=h,w=i+((0|br(0|ar[t>>2],f))+e)|0,v=b+((3|v)+(0|br(0|ar[l>>2],f)))|0,tr[v>>0]=0|tr[w>>0],(0|(e=e+1|0))!=(0|o););}else if(r)for(e=0;w=s+((0|br(0|ar[c>>2],f))+e)|0,w=0|tr[w>>0],h=3*e|0,v=b+((0|br(0|ar[l>>2],f))+h)|0,tr[v>>0]=w,v=b+(h+1+(0|br(0|ar[l>>2],f)))|0,tr[v>>0]=w,h=b+(h+2+(0|br(0|ar[l>>2],f)))|0,tr[h>>0]=w,(0|(e=e+1|0))!=(0|o););f=f+1|0}while((0|f)!=(0|a))}else{f=0;do{if(0|tr[n>>0]){if(r)for(e=0;h=s+((0|br(0|ar[c>>2],f))+e)|0,h=0|tr[h>>0],v=e<<2,w=b+((0|br(0|ar[l>>2],f))+v)|0,tr[w>>0]=h,w=b+((1|v)+(0|br(0|ar[l>>2],f)))|0,tr[w>>0]=h,w=b+((2|v)+(0|br(0|ar[l>>2],f)))|0,tr[w>>0]=h,v=b+((3|v)+(0|br(0|ar[l>>2],f)))|0,tr[v>>0]=-1,(0|(e=e+1|0))!=(0|o););}else if(r)for(e=0;w=s+((0|br(0|ar[c>>2],f))+e)|0,w=0|tr[w>>0],v=3*e|0,h=b+((0|br(0|ar[l>>2],f))+v)|0,tr[h>>0]=w,h=b+(v+1+(0|br(0|ar[l>>2],f)))|0,tr[h>>0]=w,v=b+(v+2+(0|br(0|ar[l>>2],f)))|0,tr[v>>0]=w,(0|(e=e+1|0))!=(0|o););f=f+1|0}while((0|f)!=(0|a))}ar[A>>2]=d,ar[A+4>>2]=k,ur=u},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o,a=0,c=0,l=0,u=0;if(ur=(o=ur)+64|0,t=o+36|0,n=o+48|0,u=o,1==(0|ar[(r|=0)>>2])&&10==(-2&(a=0|ar[(c=r+4|0)>>2])|0))return 3<=((e=0|ar[(f=i+4|0)>>2])+-1|0)>>>0||0|(l=0|ar[i+16>>2])&&0==(0|or[l+8>>1])?(ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0):(ar[t>>2]=0,ar[(l=4+t|0)>>2]=0,11==((ar[8+t>>2]=0)|(e=10==(0|a)?(ar[u>>2]=0,ar[u+4>>2]=e,tr[u+8>>0]=0,tr[(e=u+9|0)>>0]=0|tr[n>>0],tr[e+1>>0]=0|tr[1+n>>0],tr[e+2>>0]=0|tr[2+n>>0],ar[u+12>>2]=8,ar[u+16>>2]=0,ar[(e=u+20|0)>>2]=0,gA[u+24>>2]=.75,gA[u+28>>2]=.5,gA[u+32>>2]=0,Nl(t,u),0|(e=0|ar[e>>2])&&du(e),0|ar[c>>2]):a))?(f=0|ar[f>>2],ar[u>>2]=0,ar[u+4>>2]=f,tr[u+8>>0]=1,tr[(f=u+9|0)>>0]=0|tr[n>>0],tr[f+1>>0]=0|tr[1+n>>0],tr[f+2>>0]=0|tr[2+n>>0],ar[u+12>>2]=8,ar[(f=u+16|0)>>2]=0,ar[(r=u+20|0)>>2]=0,gA[u+24>>2]=.75,gA[u+28>>2]=.5,(i=(gA[u+32>>2]=0)|ar[l>>2])>>>0>=(0|ar[(e=8+t|0)>>2])>>>0?(Nl(t,u),0|(f=0|ar[r>>2])&&du(f)):(ar[i>>2]=ar[u>>2],ar[i+4>>2]=ar[u+4>>2],ar[i+8>>2]=ar[u+8>>2],ar[i+12>>2]=ar[u+12>>2],ar[i+16>>2]=ar[f>>2],ar[i+20>>2]=ar[r>>2],ar[f>>2]=0,u=u+24|(ar[r>>2]=0),ar[(c=i+24|0)>>2]=ar[u>>2],ar[c+4>>2]=ar[u+4>>2],ar[c+8>>2]=ar[u+8>>2],ar[l>>2]=i+36)):e=8+t|0,ar[A>>2]=ar[t>>2],ar[A+4>>2]=ar[l>>2],ar[A+8>>2]=ar[e>>2],ar[e>>2]=0),void(ur=o);ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,ur=o},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o,a,c,l,u,b,s,d=0,k=0,h=0,w=0,v=0,m=0,g=0,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0,R=0,N=0;if(ur=(s=ur)+112|0,G=s+96|0,V=s+92|0,p=s+88|0,u=s+84|0,b=s+80|0,E=s+40|0,k=s,F=0|ar[(r|=0)>>2],l=0|ar[F+24>>2],F=0|ar[F+28>>2],f=0|hu(80),ar[f+4>>2]=0,ar[f+8>>2]=0,ar[f>>2]=6208,ar[(d=f+12|0)>>2]=0,ar[d+4>>2]=0,ar[d+8>>2]=0,ar[d+12>>2]=0,ar[d+16>>2]=0,ar[f+32>>2]=32215,ar[f+36>>2]=0,ar[f+40>>2]=0,ar[f+44>>2]=99,ar[f+48>>2]=99,e=f+52|0,ar[(C=f+72|0)>>2]=0,ar[f+76>>2]=0,ar[e>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[f+68>>2]=C,ar[A>>2]=d,C=(ar[A+4>>2]=f)+16|0,bu(f),su(f),e=0|ar[C>>2],ar[d>>2]=d,ar[C>>2]=f,0|e&&ku(e),du(f),W=0|go(X=0|ar[i+4>>2]),I=0|Zo(X),yo(d,l,F,0,X),X=(l-1+(W&=255)|0)/(0|W)|0,C=(F+-1+(I&=255)|0)/(0|I)|0,c=11==(0|ar[36+(0|ar[r>>2])>>2]),Bo(d,0,l,F,8),Bo(d,1,X,C,8),Bo(d,2,X,C,8),c&&Bo(d,6,l,F,8),ar[G>>2]=0,ar[V>>2]=0,ar[p>>2]=0,ar[u>>2]=0,C=(ar[b>>2]=0)|Ro(0|ar[r>>2],10,b),Z=0|Fo(d,0,p),o=0|Fo(d,1,G),a=0|Fo(d,2,V),X=c?0|Fo(d,6,u):0,Be(E),e=0|ar[i+16>>2])for(A=0|tr[e+10>>0],ye(k,0|or[e+8>>1],0|or[e+4>>1]),A=A<<24>>24!=0,e=k,f=(r=E)+40|0;ar[r>>2]=ar[e>>2],e=e+4|0,(0|(r=r+4|0))<(0|f););else A=1;if(g=c?4:3,t=0<(0|F)){i=0<(0|l),k=E+4|0,v=E+8|0,m=E+12|0,d=0;do{e=C+(0|br(0|ar[b>>2],d))|0;A:do{if(i){if(A)r=0;else for(f=0;;){if(y=0|ef(.8554700016975403*((0|cr[e>>0])*gA[k>>2]+(0|cr[e+1>>0])*gA[v>>2]+(0|cr[e+2>>0])*gA[m>>2])),B=Z+((0|br(0|ar[p>>2],d))+f)|0,tr[B>>0]=(0|y)<0?16:((0|y)<219?y:219)+16&255,(0|(f=f+1|0))==(0|l))break A;e=e+g|0}for(;f=(0|(f=0|ef((0|cr[e>>0])*gA[k>>2]+(0|cr[e+1>>0])*gA[v>>2]+(0|cr[e+2>>0])*gA[m>>2])))<0?0:255<(0|f)?-1:255&f,B=Z+((0|br(0|ar[p>>2],d))+r)|0,tr[B>>0]=f,(0|(r=r+1|0))!=(0|l);)e=e+g|0}}while(0);d=d+1|0}while((0|d)!=(0|F));if(t){B=0<(0|l),m=0|br(g,W),g=E+16|0,Z=E+20|0,p=E+24|0,n=E+28|0,y=E+32|0,v=E+36|0,k=0;do{if(B)for(i=C+((d=0)|br(0|ar[b>>2],k))|0;N=+(0|cr[i>>0]),R=+(0|cr[i+1>>0]),w=+(0|cr[i+2>>0]),h=N*gA[g>>2]+R*gA[Z>>2]+w*gA[p>>2],w=N*gA[n>>2]+R*gA[y>>2]+w*gA[v>>2],r=(f=A?(E=0|ef(h+128),r=(0|k)/(0|I)|0,e=(0|d)/(0|W)|0,f=o+((0|br(0|ar[G>>2],r))+e)|0,tr[f>>0]=(0|E)<0?0:255<(0|E)?-1:255&E,(0|(f=0|ef(w+128)))<0?0:255<(0|f)?-1:255&f):(E=0|ef(.875*h+128),r=(0|k)/(0|I)|0,e=(0|d)/(0|W)|0,f=o+((0|br(0|ar[G>>2],r))+e)|0,tr[f>>0]=(0|E)<0?0:255<(0|E)?-1:255&E,(0|(f=0|ef(.875*w+128)))<0?0:255<(0|f)?-1:255&f),0|br(0|ar[V>>2],r)),tr[a+(e+r)>>0]=f,!((0|l)<=(0|(d=d+W|0)));)i=i+m|0;k=k+I|0}while((0|k)<(0|F));if(c&t&0<(0|l)){e=0;do{for(f=0;G=C+((f<<2|3)+(0|br(0|ar[b>>2],e)))|0,V=X+((0|br(0|ar[u>>2],e))+f)|0,tr[V>>0]=0|tr[G>>0],(0|(f=f+1|0))!=(0|l););e=e+1|0}while((0|e)!=(0|F));ur=s}else ur=s}else ur=s}else ur=s},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o=0,a=0,c=0,l=0;if(ur=(t=ur)+64|0,n=t+36|0,f=t+48|0,l=t,1==(0|ar[(r|=0)>>2])&&10==(-2&(o=0|ar[(a=r+4|0)>>2])|0))return!(e=0|ar[i+16>>2])||0|or[e+8>>1]||0|(c=0|ar[r+16>>2])&&0==(0|tr[c+10>>0])?(ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0):(ar[n>>2]=0,ar[(c=4+n|0)>>2]=0,11==((ar[8+n>>2]=0)|(e=10==(0|o)?(ar[l>>2]=0,ar[l+4>>2]=3,tr[l+8>>0]=0,tr[(e=l+9|0)>>0]=0|tr[f>>0],tr[e+1>>0]=0|tr[f+1>>0],tr[e+2>>0]=0|tr[f+2>>0],ar[l+12>>2]=8,ar[l+16>>2]=0,ar[(e=l+20|0)>>2]=0,gA[l+24>>2]=.75,gA[l+28>>2]=.5,gA[l+32>>2]=0,Nl(n,l),0|(e=0|ar[e>>2])&&du(e),0|ar[a>>2]):o))?(ar[l>>2]=0,ar[l+4>>2]=3,tr[l+8>>0]=1,tr[(i=l+9|0)>>0]=0|tr[f>>0],tr[i+1>>0]=0|tr[f+1>>0],tr[i+2>>0]=0|tr[f+2>>0],ar[l+12>>2]=8,ar[(f=l+16|0)>>2]=0,ar[(i=l+20|0)>>2]=0,gA[l+24>>2]=.75,gA[l+28>>2]=.5,(r=(gA[l+32>>2]=0)|ar[c>>2])>>>0>=(0|ar[(e=8+n|0)>>2])>>>0?(Nl(n,l),0|(f=0|ar[i>>2])&&du(f)):(ar[r>>2]=ar[l>>2],ar[r+4>>2]=ar[l+4>>2],ar[r+8>>2]=ar[l+8>>2],ar[r+12>>2]=ar[l+12>>2],ar[r+16>>2]=ar[f>>2],ar[r+20>>2]=ar[i>>2],ar[f>>2]=0,l=l+24|(ar[i>>2]=0),ar[(a=r+24|0)>>2]=ar[l>>2],ar[a+4>>2]=ar[l+4>>2],ar[a+8>>2]=ar[l+8>>2],ar[c>>2]=r+36)):e=8+n|0,ar[A>>2]=ar[n>>2],ar[A+4>>2]=ar[c>>2],ar[A+8>>2]=ar[e>>2],ar[e>>2]=0),void(ur=t);ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,ur=t},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o,a,c,l,u,b,s=0,d=0,k=0,h=0,w=0,v=0,m=0;if(ur=(b=ur)+32|0,a=b+16|0,c=b+12|0,l=b+8|0,k=b+4|0,u=b,h=0|ar[(r|=0)>>2],o=0|ar[h+24>>2],h=0|ar[h+28>>2],f=0|hu(80),ar[f+4>>2]=0,ar[f+8>>2]=0,ar[f>>2]=6208,ar[(s=f+12|0)>>2]=0,ar[s+4>>2]=0,ar[s+8>>2]=0,ar[s+12>>2]=0,ar[s+16>>2]=0,ar[f+32>>2]=32215,ar[f+36>>2]=0,ar[f+40>>2]=0,ar[f+44>>2]=99,ar[f+48>>2]=99,e=f+52|0,ar[(d=f+72|0)>>2]=0,ar[f+76>>2]=0,ar[e>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[f+68>>2]=d,ar[A>>2]=s,d=(ar[A+4>>2]=f)+16|0,bu(f),su(f),e=0|ar[d>>2],ar[s>>2]=s,ar[d>>2]=f,0|e&&ku(e),du(f),yo(s,o,h,0,3),f=11==(0|ar[36+(0|ar[r>>2])>>2]),Bo(s,0,o,h,8),Bo(s,1,o,h,8),Bo(s,2,o,h,8),f&&Bo(s,6,o,h,8),ar[a>>2]=0,ar[c>>2]=0,ar[l>>2]=0,ar[k>>2]=0,r=(ar[u>>2]=0)|Ro(0|ar[r>>2],10,u),n=0|Fo(s,0,l),t=0|Fo(s,1,a),d=0|Fo(s,2,c),A=f?0|Fo(s,6,k):0,(e=0|ar[i+16>>2])||sr(32569,32248,2161,32272),0|or[e+8>>1]&&sr(32595,32248,2162,32272),e=0<(0|h)&0<(0|o),f){if(!e)return void(ur=b);f=0;do{for(e=0;m=(0|br(0|ar[u>>2],f))+(e<<2)|0,w=0|tr[r+m>>0],v=0|tr[r+(m+2)>>0],s=0|tr[r+(m+3)>>0],i=n+((0|br(0|ar[l>>2],f))+e)|0,tr[i>>0]=0|tr[r+(m+1)>>0],i=t+((0|br(0|ar[a>>2],f))+e)|0,tr[i>>0]=v,i=d+((0|br(0|ar[c>>2],f))+e)|0,tr[i>>0]=w,i=A+((0|br(0|ar[k>>2],f))+e)|0,tr[i>>0]=s,(0|(e=e+1|0))!=(0|o););f=f+1|0}while((0|f)!=(0|h));ur=b}else if(e){e=0;do{for(f=0;k=(0|br(0|ar[u>>2],e))+(3*f|0)|0,v=0|tr[r+k>>0],w=0|tr[r+(k+2)>>0],m=n+((0|br(0|ar[l>>2],e))+f)|0,tr[m>>0]=0|tr[r+(k+1)>>0],m=t+((0|br(0|ar[a>>2],e))+f)|0,tr[m>>0]=w,m=d+((0|br(0|ar[c>>2],e))+f)|0,tr[m>>0]=v,(0|(f=f+1|0))!=(0|o););e=e+1|0}while((0|e)!=(0|h));ur=b}else ur=b},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o,a,c,l=0,u=0;if(ur=(c=ur)+64|0,a=c+36|0,n=c+48|0,o=c,(t=0|ar[(r|=0)+4>>2])>>>0<4&&0|tr[r+8>>0]&&0==(0|tr[i+8>>0])){if(ar[a>>2]=0,ar[(u=4+a|0)>>2]=0,e=(ar[8+a>>2]=0)|ar[r>>2],f=r+9|0,tr[n>>0]=0|tr[f>>0],tr[1+n>>0]=0|tr[f+1>>0],tr[2+n>>0]=0|tr[f+2>>0],f=0|ar[r+12>>2],i=0|ar[r+16>>2],(l=0==(0|(r=0|ar[r+20>>2])))||bu(r),ar[o>>2]=e,ar[o+4>>2]=t,tr[o+8>>0]=0,tr[(e=o+9|0)>>0]=0|tr[n>>0],tr[e+1>>0]=0|tr[1+n>>0],tr[e+2>>0]=0|tr[2+n>>0],ar[o+12>>2]=f,ar[o+16>>2]=i,ar[(e=o+20|0)>>2]=r,l||bu(r),gA[o+24>>2]=.10000000149011612,gA[o+28>>2]=0,f=8+a|(gA[o+32>>2]=0),Nl(a,o),0|(e=0|ar[e>>2])&&du(e),ar[A>>2]=ar[a>>2],ar[A+4>>2]=ar[u>>2],ar[A+8>>2]=ar[f>>2],ar[f>>2]=0,ar[u>>2]=0,ar[a>>2]=0,!l&&(du(r),0|(e=0|ar[a>>2]))){if((0|(f=0|ar[u>>2]))!=(0|e)){for(;i=f+-36|0,ar[u>>2]=i,(0|(f=(f=0|ar[f+-16>>2])?(du(f),0|ar[u>>2]):i))!=(0|e););e=0|ar[a>>2]}vu(e)}ur=c}else ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,ur=c},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t=0,o=0;t=0|ar[(r|=0)>>2],n=0|ar[t+24>>2],t=0|ar[t+28>>2],i=0|hu(80),ar[i+4>>2]=0,ar[i+8>>2]=0,ar[i>>2]=6208,ar[(f=i+12|0)>>2]=0,ar[f+4>>2]=0,ar[f+8>>2]=0,ar[f+12>>2]=0,ar[f+16>>2]=0,ar[i+32>>2]=32215,ar[i+36>>2]=0,ar[i+40>>2]=0,ar[i+44>>2]=99,ar[i+48>>2]=99,o=i+52|0,ar[(e=i+72|0)>>2]=0,ar[i+76>>2]=0,ar[o>>2]=0,ar[o+4>>2]=0,ar[o+8>>2]=0,ar[o+12>>2]=0,ar[i+68>>2]=e,ar[A>>2]=f,A=(ar[A+4>>2]=i)+16|0,bu(i),su(i),e=0|ar[A>>2],ar[f>>2]=f,ar[A>>2]=i,0|e&&ku(e),du(i),o=0|ar[r>>2],yo(f,n,t,0|ar[o+32>>2],0|ar[o+36>>2]),0|Eo(0|ar[r>>2],0)&&No(f,r,0,0),0|Eo(0|ar[r>>2],1)&&No(f,r,1,1),0|Eo(0|ar[r>>2],2)&&No(f,r,2,2),0|Eo(0|ar[r>>2],3)&&No(f,r,3,3),0|Eo(0|ar[r>>2],4)&&No(f,r,4,4),0|Eo(0|ar[r>>2],5)&&No(f,r,5,5)},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o,a,c=0,l=0,u=0,b=0;if(ur=(a=ur)+64|0,o=a+36|0,c=a+48|0,t=a,(n=0|ar[(r|=0)+4>>2])>>>0<4&&8==(0|ar[r+12>>2])){if(ar[o>>2]=0,ar[(b=4+o|0)>>2]=0,e=(ar[8+o>>2]=0)|ar[r>>2],f=0|tr[r+8>>0],l=r+9|0,tr[c>>0]=0|tr[l>>0],tr[c+1>>0]=0|tr[l+1>>0],tr[c+2>>0]=0|tr[l+2>>0],l=0|ar[r+16>>2],(u=0==(0|(r=0|ar[r+20>>2])))||bu(r),i=0|ar[i+12>>2],ar[t>>2]=e,ar[t+4>>2]=n,tr[t+8>>0]=f,tr[(e=t+9|0)>>0]=0|tr[c>>0],tr[e+1>>0]=0|tr[c+1>>0],tr[e+2>>0]=0|tr[c+2>>0],ar[t+12>>2]=i,ar[t+16>>2]=l,ar[(e=t+20|0)>>2]=r,u||bu(r),gA[t+24>>2]=.20000000298023224,gA[t+28>>2]=0,gA[t+32>>2]=.5,f=8+o|0,Nl(o,t),0|(e=0|ar[e>>2])&&du(e),ar[A>>2]=ar[o>>2],ar[A+4>>2]=ar[b>>2],ar[A+8>>2]=ar[f>>2],ar[f>>2]=0,ar[b>>2]=0,ar[o>>2]=0,!u&&(du(r),0|(e=0|ar[o>>2]))){if((0|(f=0|ar[b>>2]))!=(0|e)){for(;c=f+-36|0,ar[b>>2]=c,(0|(f=(f=0|ar[f+-16>>2])?(du(f),0|ar[b>>2]):c))!=(0|e););e=0|ar[o>>2]}vu(e)}ur=a}else ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,ur=a},function(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f|=0;var n,t,o,a,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0,w=0,v=0,m=0;ur=(a=ur)+16|0,t=a+4|0,o=a,f=0|hu(80),ar[f+4>>2]=0,ar[f+8>>2]=0,ar[f>>2]=6208,ar[(n=f+12|0)>>2]=0,ar[4+n>>2]=0,ar[8+n>>2]=0,ar[12+n>>2]=0,ar[16+n>>2]=0,ar[f+32>>2]=32215,ar[f+36>>2]=0,ar[f+40>>2]=0,ar[f+44>>2]=99,ar[f+48>>2]=99,e=f+52|0,ar[(u=f+72|0)>>2]=0,ar[f+76>>2]=0,ar[e>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[f+68>>2]=u,ar[A>>2]=n,u=(ar[A+4>>2]=f)+16|0,bu(f),su(f),e=0|ar[u>>2],ar[n>>2]=n,ar[u>>2]=f,0|e&&ku(e),du(f),u=0|ar[r>>2],yo(n,0|ar[u+24>>2],0|ar[u+28>>2],0|ar[u+32>>2],0|ar[u+36>>2]),u=i+12|0,l=6796;do{if(e=0|ar[l>>2],0|Eo(0|ar[r>>2],e)&&(Bo(n,e,b=0|Xo(0|ar[r>>2],e),s=0|Wo(0|ar[r>>2],e),0|ar[u>>2]),d=255&(0|Vo(0|ar[r>>2],e)),k=8-(d=(0|ar[u>>2])-d|0)|0,h=0|Ro(0|ar[r>>2],e,t),w=0|Fo(n,e,o),v=(0|ar[o>>2])/2|0,ar[o>>2]=v,0<(0|s)&0<(0|b))){A=0|ar[t>>2],f=0;do{for(i=0|br(A,f),c=0|br(v,f),e=0;m=0|cr[h+(i+e)>>0],or[w+(c+e<<1)>>1]=m<<d|m>>>k,(0|(e=e+1|0))!=(0|b););f=f+1|0}while((0|f)!=(0|s))}l=l+4|0}while(6824!=(0|l));ur=a},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o,a,c=0,l=0,u=0;if(ur=(a=ur)+64|0,o=a+36|0,f=a+48|0,t=a,(n=0|ar[(r|=0)+4>>2])>>>0<4&&8!=(0|ar[r+12>>2])){if(ar[o>>2]=0,ar[(u=4+o|0)>>2]=0,e=(ar[8+o>>2]=0)|ar[r>>2],i=0|tr[r+8>>0],c=r+9|0,tr[f>>0]=0|tr[c>>0],tr[f+1>>0]=0|tr[c+1>>0],tr[f+2>>0]=0|tr[c+2>>0],c=0|ar[r+16>>2],(l=0==(0|(r=0|ar[r+20>>2])))||bu(r),ar[t>>2]=e,ar[t+4>>2]=n,tr[t+8>>0]=i,tr[(e=t+9|0)>>0]=0|tr[f>>0],tr[e+1>>0]=0|tr[f+1>>0],tr[e+2>>0]=0|tr[f+2>>0],ar[t+12>>2]=8,ar[t+16>>2]=c,ar[(e=t+20|0)>>2]=r,l||bu(r),gA[t+24>>2]=.20000000298023224,gA[t+28>>2]=0,gA[t+32>>2]=.5,i=8+o|0,Nl(o,t),0|(e=0|ar[e>>2])&&du(e),ar[A>>2]=ar[o>>2],ar[A+4>>2]=ar[u>>2],ar[A+8>>2]=ar[i>>2],ar[i>>2]=0,ar[u>>2]=0,ar[o>>2]=0,!l&&(du(r),0|(e=0|ar[o>>2]))){if((0|(i=0|ar[u>>2]))!=(0|e)){for(;f=i+-36|0,ar[u>>2]=f,(0|(i=(i=0|ar[i+-16>>2])?(du(i),0|ar[u>>2]):f))!=(0|e););e=0|ar[o>>2]}vu(e)}ur=a}else ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,ur=a},function(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f|=0;var n,t,o,a,c=0,l=0,u=0,b=0,s=0,d=0;ur=(a=ur)+16|0,t=a+4|0,o=a,i=0|hu(80),ar[i+4>>2]=0,ar[i+8>>2]=0,ar[i>>2]=6208,ar[(n=i+12|0)>>2]=0,ar[4+n>>2]=0,ar[8+n>>2]=0,ar[12+n>>2]=0,ar[16+n>>2]=0,ar[i+32>>2]=32215,ar[i+36>>2]=0,ar[i+40>>2]=0,ar[i+44>>2]=99,ar[i+48>>2]=99,f=i+52|0,ar[(e=i+72|0)>>2]=0,ar[i+76>>2]=0,ar[f>>2]=0,ar[f+4>>2]=0,ar[f+8>>2]=0,ar[f+12>>2]=0,ar[i+68>>2]=e,ar[A>>2]=n,A=(ar[A+4>>2]=i)+16|0,bu(i),su(i),e=0|ar[A>>2],ar[n>>2]=n,ar[A>>2]=i,0|e&&ku(e),du(i),f=0|ar[r>>2],yo(n,0|ar[f+24>>2],0|ar[f+28>>2],0|ar[f+32>>2],0|ar[f+36>>2]),f=6848;do{if(e=0|ar[f>>2],0|Eo(0|ar[r>>2],e)&&(Bo(n,e,c=0|Xo(0|ar[r>>2],e),l=0|Wo(0|ar[r>>2],e),8),u=(255&(0|Vo(0|ar[r>>2],e)))-8|0,b=0|Ro(0|ar[r>>2],e,t),ar[t>>2]=(0|ar[t>>2])/2|0,s=0|Fo(n,e,o),0<(0|l)&0<(0|c))){e=0;do{for(i=0;d=b+((0|br(0|ar[t>>2],e))+i<<1)|0,A=s+((0|br(0|ar[o>>2],e))+i)|0,tr[A>>0]=(0|lr[d>>1])>>>u,(0|(i=i+1|0))!=(0|c););e=e+1|0}while((0|e)!=(0|l))}f=f+4|0}while(6876!=(0|f));ur=a},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o=0;if(ur=(t=ur)+48|0,n=t+36|0,f=t,1==(0|ar[(r|=0)>>2])&&12==(-4&ar[r+4>>2]|0)&&8!=(0|(o=0|ar[r+12>>2]))){if(0|(e=0|ar[r+16>>2])){switch(0|or[e+8>>1]){case 0:case 8:case 11:case 14:return ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,void(ur=t)}if(!(0|tr[e+10>>0]))return ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,void(ur=t)}return ar[n>>2]=0,ar[(i=4+n|0)>>2]=0,e=(ar[8+n>>2]=0)|tr[r+8>>0],ar[f>>2]=0,ar[f+4>>2]=1,tr[f+8>>0]=e,ar[f+12>>2]=o,ar[f+16>>2]=0,ar[(e=f+20|0)>>2]=0,gA[f+24>>2]=.5,gA[f+28>>2]=0,gA[f+32>>2]=0,Nl(n,f),0|(e=0|ar[e>>2])&&du(e),ar[A>>2]=ar[n>>2],ar[A+4>>2]=ar[i>>2],ar[A+8>>2]=ar[8+n>>2],void(ur=t)}ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,ur=t},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p,y,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0,R=0,N=0,_=0,Y=0,Q=0,D=0,J=0,M=0,T=0,U=0,S=0,O=0,z=0,j=0,H=0,x=0,P=0,L=0,K=0,q=0;if(ur=(y=ur)+112|0,g=y+96|0,a=y+92|0,Z=y+88|0,p=y+84|0,c=y+80|0,b=y+40|0,X=y,E=0|ar[(r|=0)>>2],v=0|ar[E+24>>2],m=0|ar[E+28>>2],E=255&(0|Vo(E,10)),o=15==(2|ar[36+(0|ar[r>>2])>>2]),f=0|hu(80),ar[f+4>>2]=0,ar[f+8>>2]=0,ar[f>>2]=6208,ar[(B=f+12|0)>>2]=0,ar[B+4>>2]=0,ar[B+8>>2]=0,ar[B+12>>2]=0,ar[B+16>>2]=0,ar[f+32>>2]=32215,ar[f+36>>2]=0,ar[f+40>>2]=0,ar[f+44>>2]=99,ar[f+48>>2]=99,e=f+52|0,ar[(K=f+72|0)>>2]=0,ar[f+76>>2]=0,ar[e>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[f+68>>2]=K,ar[A>>2]=B,K=(ar[A+4>>2]=f)+16|0,bu(f),su(f),e=0|ar[K>>2],ar[B>>2]=B,ar[K>>2]=f,0|e&&ku(e),du(f),yo(B,v,m,0,1),h=o?8:6,L=(1+v|0)/2|0,K=(1+m|0)/2|0,Bo(B,0,v,m,E),Bo(B,1,L,K,E),Bo(B,2,L,K,E),o&&Bo(B,6,v,m,E),ar[g>>2]=0,ar[a>>2]=0,ar[Z>>2]=0,ar[p>>2]=0,w=(ar[c>>2]=0)|Ro(0|ar[r>>2],10,g),n=0|Fo(B,0,a),L=0|Fo(B,1,Z),K=0|Fo(B,2,p),x=o?0|Fo(B,6,c):0,ar[a>>2]=(0|ar[a>>2])/2|0,ar[Z>>2]=(0|ar[Z>>2])/2|0,ar[p>>2]=(0|ar[p>>2])/2|0,ar[c>>2]=(0|ar[c>>2])/2|0,l=1<<E+-1,u=(k=1<<E)-1|0,P=0|ar[r>>2],s=1&(t=15==(1|ar[P+36>>2])),e=0|ar[P+40>>2],(d=0==(0|(P=0|ar[P+44>>2])))||bu(P),Be(b),e)for(A=0|tr[10+(0|ar[i+16>>2])>>0],ye(X,0|or[e+8>>1],0|or[e+4>>1]),A=A<<24>>24!=0,e=X,f=(B=b)+40|0;ar[B>>2]=ar[e>>2],e=e+4|0,(0|(B=B+4|0))<(0|f););else A=1;if(r=0<(0|m)){X=0<(0|v),i=1^s,G=t?3:2,V=3^s,F=t?5:4,R=5-s|0,N=4+b|0,_=8+b|0,Y=12+b|0,Q=t?7:6,D=7^s,J=65535&u,E=0;do{if(X)if(W=+gA[N>>2],I=+gA[_>>2],C=+gA[Y>>2],M=0|br(0|ar[g>>2],E),A)for(f=0;B=w+(M+(0|br(f,h)))|0,e=(0|(e=0|ef(((0|cr[B+s>>0])<<8|0|cr[B+i>>0]|0)*W+((0|cr[B+G>>0])<<8|0|cr[B+V>>0]|0)*I+((0|cr[B+F>>0])<<8|0|cr[B+R>>0]|0)*C)))<0?0:(0|e)<(0|k)?65535&e:J,q=n+((0|br(0|ar[a>>2],E))+f<<1)|0,or[q>>1]=e,o&&(q=x+((0|br(0|ar[c>>2],E))+f<<1)|0,or[q>>1]=(0|cr[B+Q>>0])<<8|0|cr[B+D>>0]),(0|(f=f+1|0))!=(0|v););else for(f=0;B=w+(M+(0|br(f,h)))|0,e=(0|(e=0|ef(.8554700016975403*(((0|cr[B+s>>0])<<8|0|cr[B+i>>0]|0)*W+((0|cr[B+G>>0])<<8|0|cr[B+V>>0]|0)*I+((0|cr[B+F>>0])<<8|0|cr[B+R>>0]|0)*C)+16)))<0?0:(0|e)<(0|k)?65535&e:J,q=n+((0|br(0|ar[a>>2],E))+f<<1)|0,or[q>>1]=e,o&&(q=x+((0|br(0|ar[c>>2],E))+f<<1)|0,or[q>>1]=(0|cr[B+Q>>0])<<8|0|cr[B+D>>0]),(0|(f=f+1|0))!=(0|v););E=E+1|0}while((0|E)!=(0|m));if(r){D=0<(0|v),J=1^s,M=t?3:2,x=3^s,V=t?5:4,F=5-s|0,R=16+b|0,N=20+b|0,_=24+b|0,Y=28+b|0,Q=32+b|0,G=36+b|0,H=+(65535&l|0),r=65535&u,E=0;do{if(D)if(X=(0|E)/2|0,T=+gA[R>>2],U=+gA[N>>2],S=+gA[_>>2],O=+gA[Y>>2],z=+gA[Q>>2],j=+gA[G>>2],i=0|br(0|ar[g>>2],E),A)for(B=0;e=w+(i+(0|br(B,h)))|0,e=(0|(e=0|ef(H+((W=+((0|cr[e+s>>0])<<8|0|cr[e+J>>0]|0))*T+(I=+((0|cr[e+M>>0])<<8|0|cr[e+x>>0]|0))*U+(C=+((0|cr[e+V>>0])<<8|0|cr[e+F>>0]|0))*S))))<0?0:(0|e)<(0|k)?65535&e:r,f=(0|B)/2|0,q=L+((0|br(0|ar[Z>>2],X))+f<<1)|0,or[q>>1]=e,e=(0|(e=0|ef(H+(W*O+I*z+C*j))))<0?0:(0|e)<(0|k)?65535&e:r,q=K+((0|br(0|ar[p>>2],X))+f<<1)|0,or[q>>1]=e,(0|(B=B+2|0))<(0|v););else for(B=0;e=w+(i+(0|br(B,h)))|0,e=(0|(e=0|ef(H+.8554700016975403*((W=+((0|cr[e+s>>0])<<8|0|cr[e+J>>0]|0))*T+(I=+((0|cr[e+M>>0])<<8|0|cr[e+x>>0]|0))*U+(C=+((0|cr[e+V>>0])<<8|0|cr[e+F>>0]|0))*S))))<0?0:(0|e)<(0|k)?65535&e:r,f=(0|B)/2|0,q=L+((0|br(0|ar[Z>>2],X))+f<<1)|0,or[q>>1]=e,e=(0|(e=0|ef(H+.8554700016975403*(W*O+I*z+C*j))))<0?0:(0|e)<(0|k)?65535&e:r,q=K+((0|br(0|ar[p>>2],X))+f<<1)|0,or[q>>1]=e,(0|(B=B+2|0))<(0|v););E=E+2|0}while((0|E)<(0|m))}}ur=(d||du(P),y)},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o=0,a=0,c=0,l=0;if(ur=(t=ur)+64|0,n=t+36|0,f=t+48|0,l=t,0==(0|ar[(r|=0)>>2])&&1==(0|ar[r+4>>2])&&8!=(0|(o=0|ar[(a=r+12|0)>>2]))){e=0|ar[r+16>>2];A:do{if(0|e){switch(0|or[e+8>>1]){case 0:case 8:case 11:case 14:break;default:break A}return ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,void(ur=t)}}while(0);return ar[n>>2]=0,ar[(c=4+n|0)>>2]=0,e=(ar[8+n>>2]=0)|tr[(i=r+8|0)>>0],ar[l>>2]=1,ar[l+4>>2]=e<<24>>24?15:14,tr[l+8>>0]=e,ar[l+12>>2]=o,ar[l+16>>2]=0,ar[(e=l+20|0)>>2]=0,gA[l+24>>2]=.5,gA[l+28>>2]=0,r=8+n|(gA[l+32>>2]=0),Nl(n,l),0|(e=0|ar[e>>2])&&du(e),i=0|tr[i>>0],e=0|ar[a>>2],ar[l>>2]=1,ar[l+4>>2]=i<<24>>24?13:12,tr[l+8>>0]=i,tr[(i=l+9|0)>>0]=0|tr[f>>0],tr[i+1>>0]=0|tr[f+1>>0],tr[i+2>>0]=0|tr[f+2>>0],ar[l+12>>2]=e,ar[(e=l+16|0)>>2]=0,ar[(i=l+20|0)>>2]=0,gA[l+24>>2]=.5,gA[l+28>>2]=0,(f=(gA[l+32>>2]=0)|ar[c>>2])>>>0>=(0|ar[r>>2])>>>0?(Nl(n,l),0|(e=0|ar[i>>2])&&du(e)):(ar[f>>2]=ar[l>>2],ar[f+4>>2]=ar[l+4>>2],ar[f+8>>2]=ar[l+8>>2],ar[f+12>>2]=ar[l+12>>2],ar[f+16>>2]=ar[e>>2],ar[f+20>>2]=ar[i>>2],ar[e>>2]=0,l=l+24|(ar[i>>2]=0),ar[(a=f+24|0)>>2]=ar[l>>2],ar[a+4>>2]=ar[l+4>>2],ar[a+8>>2]=ar[l+8>>2],ar[c>>2]=f+36),ar[A>>2]=ar[n>>2],ar[A+4>>2]=ar[c>>2],ar[A+8>>2]=ar[r>>2],void(ur=t)}ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0,ur=t},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z=0,p=0,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0,R=0,N=0,_=0,Y=0,Q=0,D=0,J=0,M=0,T=0,U=0,S=0,O=0,z=0,j=0,H=0,x=0;if(ur=(g=ur)+64|0,k=g+56|0,h=g+52|0,w=g+48|0,v=g+44|0,m=g+40|0,B=g+20|0,p=g,y=0|ar[(r|=0)>>2],b=0|ar[y+24>>2],s=0|ar[y+28>>2],y=255&(0|Vo(y,0)),d=0|Eo(0|ar[r>>2],6),u=1&(X=15==(1|ar[(f=i+4|0)>>2])),W=X<<31>>31,i=0|hu(80),ar[i+4>>2]=0,ar[i+8>>2]=0,ar[i>>2]=6208,ar[(Z=i+12|0)>>2]=0,ar[Z+4>>2]=0,ar[Z+8>>2]=0,ar[Z+12>>2]=0,ar[Z+16>>2]=0,ar[i+32>>2]=32215,ar[i+36>>2]=0,ar[i+40>>2]=0,ar[i+44>>2]=99,ar[i+48>>2]=99,e=i+52|0,ar[(j=i+72|0)>>2]=0,ar[i+76>>2]=0,ar[e>>2]=0,ar[e+4>>2]=0,ar[e+8>>2]=0,ar[e+12>>2]=0,ar[i+68>>2]=j,ar[A>>2]=Z,j=(ar[A+4>>2]=i)+16|0,bu(i),su(i),e=0|ar[j>>2],ar[Z>>2]=Z,ar[j>>2]=i,0|e&&ku(e),du(i),yo(Z,b,s,1,0|ar[f>>2]),j=d?8:6,Bo(Z,10,b,s,y),d&&Bo(Z,6,b,s,y),ar[k>>2]=0,ar[h>>2]=0,ar[w>>2]=0,ar[v>>2]=0,t=(ar[m>>2]=0)|Fo(Z,10,k),o=0|Ro(0|ar[r>>2],0,h),a=0|Ro(0|ar[r>>2],1,w),c=0|Ro(0|ar[r>>2],2,v),z=d?0|Ro(0|ar[r>>2],6,m):0,f=(l=1<<y)-1|0,Ze(B),O=0|ar[r>>2],e=0|ar[O+40>>2],(n=0==(0|(O=0|ar[O+44>>2])))||bu(O),U=e?(U=0|tr[e+10>>0],pe(p,0|or[e+8>>1],0|or[e+4>>1]),ar[B>>2]=ar[p>>2],ar[B+4>>2]=ar[p+4>>2],ar[B+8>>2]=ar[p+8>>2],ar[B+12>>2]=ar[p+12>>2],ar[B+16>>2]=ar[p+16>>2],U<<24>>24!=0):1,0<(0|s)){S=0<(0|b),D=1<<y+-1,J=B+4|0,M=B+8|0,T=B+12|0,F=B+16|0,R=X?3:2,N=X?5:4,_=W+1|0,Y=W+3|0,Q=W+5|0,V=X?7:6,W=W+7|0,G=255&f,X=(65535&f)>>>8&255,y=0;do{if(S)for(B=(0|y)/2|0,p=0;e=o+(((0|br(0|ar[h>>2],y))/2|0)+p<<1)|0,I=+(0|lr[e>>1]),e=(0|p)/2|0,r=a+(((0|br(0|ar[w>>2],B))/2|0)+e<<1)|0,C=+((0|lr[r>>1])-D|0),e=c+(((0|br(0|ar[v>>2],B))/2|0)+e<<1)|0,E=+((0|lr[e>>1])-D|0),C=U?C:1.142899990081787*C,E=U?E:1.142899990081787*E,A=0<=(0|(e=0|ef((I=U?I:1.1689000129699707*(I+-16))+gA[J>>2]*E)))?(0|e)<(0|l)?(r=255&e,(65535&e)>>>8&255):(r=G,X):r=0,i=0<=(0|(e=0|ef(I+C*gA[M>>2]-E*gA[T>>2])))?(0|e)<(0|l)?(Z=255&e,(65535&e)>>>8&255):(Z=G,X):Z=0,e=0<=(0|(e=0|ef(I+C*gA[F>>2])))?(0|e)<(0|l)?(f=255&e,(65535&e)>>>8&255):(f=G,X):f=0,x=t+(((H=0|br(p,j))|u)+(0|br(0|ar[k>>2],y)))|0,tr[x>>0]=A,A=t+(R+H+(0|br(0|ar[k>>2],y)))|0,tr[A>>0]=i,A=t+(N+H+(0|br(0|ar[k>>2],y)))|0,tr[A>>0]=e,A=t+(_+H+(0|br(0|ar[k>>2],y)))|0,tr[A>>0]=r,r=t+(Y+H+(0|br(0|ar[k>>2],y)))|0,tr[r>>0]=Z,r=t+(Q+H+(0|br(0|ar[k>>2],y)))|0,tr[r>>0]=f,d&&(r=z+(((0|br(0|ar[m>>2],y))/2|0)+p<<1)|0,H=t+((V|(x=p<<3))+(0|br(0|ar[k>>2],y)))|0,tr[H>>0]=(0|lr[r>>1])>>>8,H=z+(((0|br(0|ar[m>>2],y))/2|0)+p<<1)|0,x=t+(W+x+(0|br(0|ar[k>>2],y)))|0,tr[x>>0]=or[H>>1]),(0|(p=p+1|0))!=(0|b););y=y+1|0}while((0|y)!=(0|s))}ur=(n||du(O),g)},function(A,e,r,i,f){var n,t;return A|=0,e|=0,i|=0,f|=0,ur=(t=ur)+48|0,n=t+36|0,e=t,8==(0|(i=0|ar[(r|=0)+12>>2]))||0|ar[r>>2]?(ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0):(ar[n>>2]=0,ar[(f=4+n|0)>>2]=0,r=(ar[8+n>>2]=0)|tr[r+8>>0],ar[e>>2]=1,ar[e+4>>2]=3,tr[e+8>>0]=r,ar[e+12>>2]=i,ar[e+16>>2]=0,ar[(r=e+20|0)>>2]=0,gA[e+24>>2]=.5,gA[e+28>>2]=0,gA[e+32>>2]=0,Nl(n,e),0|(e=0|ar[r>>2])&&du(e),ar[A>>2]=ar[n>>2],ar[A+4>>2]=ar[f>>2],ar[A+8>>2]=ar[8+n>>2]),void(ur=t)},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p,y,B,E,X,W,I=0,C=0,G=0,V=0,F=0,R=0,N=0,_=0,Y=0,Q=0,D=0,J=0,M=0,T=0,U=0,S=0,O=0,z=0,j=0,H=0,x=0,P=0,L=0,K=0,q=0,$=0,AA=0,eA=0,rA=0,iA=0,fA=0,nA=0;if(ur=(W=ur)+80|0,p=W+68|0,y=W+64|0,B=W+60|0,E=W+56|0,X=W+52|0,v=W+48|0,m=W+44|0,g=W+40|0,R=W+20|0,V=W,e=0|ar[(r|=0)>>2],G=0|ar[e+36>>2],F=255&(e=0|Vo(e,0)),i=0|Vo(0|ar[r>>2],1),f=0|Vo(0|ar[r>>2],2),I=(Z=0|Eo(0|ar[r>>2],6))?255&(0|Vo(0|ar[r>>2],6)):0,e<<24>>24==8|i<<24>>24==8|f<<24>>24==8)return ar[A>>2]=0,ar[A+4>>2]=0,void(ur=W);if(e<<24>>24!=i<<24>>24||e<<24>>24!=f<<24>>24)return ar[A>>2]=0,ar[A+4>>2]=0,void(ur=W);if(e=0|ar[r>>2],C=0|ar[e+40>>2],(w=0==(0|(h=0|ar[e+44>>2])))||(bu(h),e=0|ar[r>>2]),k=0|ar[e+24>>2],d=0|ar[e+28>>2],i=0|hu(80),ar[i+4>>2]=0,ar[i+8>>2]=0,ar[i>>2]=6208,ar[(f=i+12|0)>>2]=0,ar[f+4>>2]=0,ar[f+8>>2]=0,ar[f+12>>2]=0,ar[f+16>>2]=0,ar[i+32>>2]=32215,ar[i+36>>2]=0,ar[i+40>>2]=0,ar[i+44>>2]=99,ar[i+48>>2]=99,nA=i+52|0,ar[(fA=i+72|0)>>2]=0,ar[i+76>>2]=0,ar[nA>>2]=0,ar[nA+4>>2]=0,ar[nA+8>>2]=0,ar[nA+12>>2]=0,ar[i+68>>2]=fA,fA=f,iA=(nA=i)+16|0,bu(i),su(i),e=0|ar[iA>>2],ar[f>>2]=fA,ar[iA>>2]=nA,0|e&&ku(e),du(i),yo(f,k,d,1,3),Bo(f,3,k,d,F),Bo(f,4,k,d,F),Bo(f,5,k,d,F),Z&&Bo(f,6,k,d,I),ar[p>>2]=0,ar[y>>2]=0,ar[B>>2]=0,ar[E>>2]=0,ar[X>>2]=0,ar[v>>2]=0,ar[m>>2]=0,c=(ar[g>>2]=0)|Ro(0|ar[r>>2],0,p),l=0|Ro(0|ar[r>>2],1,y),u=0|Ro(0|ar[r>>2],2,B),b=0|Fo(f,3,X),s=0|Fo(f,4,v),iA=0|Fo(f,5,m),eA=Z?(rA=0|Ro(0|ar[r>>2],6,E),0|Fo(f,6,g)):rA=0,o=(t=1<<F)-1|0,a=(255&(0|go(G)))-1|0,n=(255&(0|Zo(G)))-1|0,ar[p>>2]=(0|ar[p>>2])/2|0,ar[y>>2]=(0|ar[y>>2])/2|0,ar[B>>2]=(0|ar[B>>2])/2|0,ar[E>>2]=(0|ar[E>>2])/2|0,ar[X>>2]=(0|ar[X>>2])/2|0,ar[v>>2]=(0|ar[v>>2])/2|0,ar[m>>2]=(0|ar[m>>2])/2|0,ar[g>>2]=(0|ar[g>>2])/2|0,Ze(R),C?(e=0|or[C+8>>1],K=0|tr[C+10>>0],pe(V,e,0|or[C+4>>1]),ar[R>>2]=ar[V>>2],ar[R+4>>2]=ar[V+4>>2],ar[R+8>>2]=ar[V+8>>2],ar[R+12>>2]=ar[V+12>>2],ar[R+16>>2]=ar[V+16>>2],K=K<<24>>24!=0,e&=65535):(K=1,e=2),0<(0|d)){q=0<(0|k),$=k<<1,AA=0==(0|e),L=8==(0|e),j=1<<F+-1&65535,H=R+4|0,x=R+8|0,P=R+12|0,F=R+16|0,G=0;do{if(q){D=G>>n,R=0|br(0|ar[y>>2],D),Q=0|br(0|ar[p>>2],G),D=0|br(0|ar[B>>2],D),J=0|br(0|ar[X>>2],G),M=0|br(0|ar[m>>2],G),T=0|br(0|ar[v>>2],G),U=+gA[H>>2],S=+gA[x>>2],O=+gA[P>>2],z=+gA[F>>2],V=0;do{C=R+(e=V>>a)|0,r=Q+V|0,e=0|or[u+(D+e<<1)>>1];do{if(AA){if(i=M+V|0,f=J+V|0,I=T+V|0,K){or[b+(f<<1)>>1]=e,or[s+(I<<1)>>1]=0|or[c+(r<<1)>>1],e=0|or[l+(C<<1)>>1];break}or[b+(f<<1)>>1]=16+((128+(219*(65535&e)|0)|0)>>>8),or[s+(I<<1)>>1]=16+((128+(219*(0|lr[c+(r<<1)>>1])|0)|0)>>>8),e=16+((128+(219*(0|lr[l+(C<<1)>>1])|0)|0)>>>8)&65535;break}if(f=(65535&e)-j|0,i=0|or[c+(r<<1)>>1],e=(0|lr[l+(C<<1)>>1])-j|0,L){r=(i=(C=65535&i)-e|0)+f|0,or[b+(J+V<<1)>>1]=(0|r)<0?0:255<(0|r)?255:255&r,e=C+e|0,or[s+(T+V<<1)>>1]=(0|e)<0?0:255<(0|e)?255:255&e,e=(0|(e=i-f|0))<0?0:255<(0|e)?255:255&e,i=M+V|0;break}_=+(65535&i),Y=+(0|e),N=+(0|f),Y=K?Y:1.142899990081787*Y,e=(0|(e=0|ef((_=K?_:1.1689000129699707*(_+-16))+(N=K?N:1.142899990081787*N)*U)))<0?0:65535&((0|e)<(0|t)?e:o),or[b+(J+V<<1)>>1]=e,e=(0|(e=0|ef(_+Y*S+N*O)))<0?0:65535&((0|e)<(0|t)?e:o),or[s+(T+V<<1)>>1]=e,e=(0|(e=0|ef(_+Y*z)))<0?0:65535&((0|e)<(0|t)?e:o),i=M+V|0}while(0);or[iA+(i<<1)>>1]=e,V=V+1|0}while((0|V)!=(0|k))}Z&&hb(0|(T=eA+((0|br(0|ar[g>>2],G))<<1)|0),rA+((0|br(0|ar[E>>2],G))<<1)|0,0|$),G=G+1|0}while((0|G)!=(0|d))}ar[A>>2]=fA,ar[A+4>>2]=nA,ur=(w||du(h),W)},function(A,e,r,i,f){var n;return A|=0,e|=0,i|=0,f|=0,ur=(n=ur)+48|0,f=n+36|0,e=n,8!=(0|ar[(r|=0)+12>>2])||0|ar[r>>2]?(ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0):(ar[f>>2]=0,ar[(i=f+4|0)>>2]=0,r=(ar[f+8>>2]=0)|tr[r+8>>0],ar[e>>2]=1,ar[e+4>>2]=3,tr[e+8>>0]=r,ar[e+12>>2]=8,ar[e+16>>2]=0,ar[(r=e+20|0)>>2]=0,gA[e+24>>2]=.5,gA[e+28>>2]=0,gA[e+32>>2]=0,Nl(f,e),0|(e=0|ar[r>>2])&&du(e),ar[A>>2]=ar[f>>2],ar[A+4>>2]=ar[i>>2],ar[A+8>>2]=ar[f+8>>2]),void(ur=n)},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p,y,B,E,X,W,I=0,C=0,G=0,V=0,F=0,R=0,N=0,_=0,Y=0,Q=0,D=0,J=0,M=0,T=0,U=0,S=0,O=0,z=0,j=0,H=0,x=0,P=0,L=0;if(ur=(W=ur)+80|0,p=W+68|0,y=W+64|0,B=W+60|0,E=W+56|0,X=W+52|0,v=W+48|0,m=W+44|0,g=W+40|0,Y=W+20|0,V=W,e=0|ar[(r|=0)>>2],G=0|ar[e+36>>2],_=255&(e=0|Vo(e,0)),i=0|Vo(0|ar[r>>2],1),f=0|Vo(0|ar[r>>2],2),I=(Z=0|Eo(0|ar[r>>2],6))?255&(0|Vo(0|ar[r>>2],6)):0,e<<24>>24!=8|i<<24>>24!=8|f<<24>>24!=8)return ar[A>>2]=0,ar[A+4>>2]=0,void(ur=W);if(e=0|ar[r>>2],C=0|ar[e+40>>2],(w=0==(0|(h=0|ar[e+44>>2])))||(bu(h),e=0|ar[r>>2]),k=0|ar[e+24>>2],d=0|ar[e+28>>2],i=0|hu(80),ar[i+4>>2]=0,ar[i+8>>2]=0,ar[i>>2]=6208,ar[(f=i+12|0)>>2]=0,ar[f+4>>2]=0,ar[f+8>>2]=0,ar[f+12>>2]=0,ar[f+16>>2]=0,ar[i+32>>2]=32215,ar[i+36>>2]=0,ar[i+40>>2]=0,ar[i+44>>2]=99,ar[i+48>>2]=99,P=i+52|0,ar[(x=i+72|0)>>2]=0,ar[i+76>>2]=0,ar[P>>2]=0,ar[P+4>>2]=0,ar[P+8>>2]=0,ar[P+12>>2]=0,ar[i+68>>2]=x,x=f,H=(P=i)+16|0,bu(i),su(i),e=0|ar[H>>2],ar[f>>2]=x,ar[H>>2]=P,0|e&&ku(e),du(i),yo(f,k,d,1,3),Bo(f,3,k,d,_),Bo(f,4,k,d,_),Bo(f,5,k,d,_),Z&&Bo(f,6,k,d,I),ar[p>>2]=0,ar[y>>2]=0,ar[B>>2]=0,ar[E>>2]=0,ar[X>>2]=0,ar[v>>2]=0,ar[m>>2]=0,c=(ar[g>>2]=0)|Ro(0|ar[r>>2],0,p),l=0|Ro(0|ar[r>>2],1,y),u=0|Ro(0|ar[r>>2],2,B),b=0|Fo(f,3,X),s=0|Fo(f,4,v),H=0|Fo(f,5,m),z=Z?(j=0|Ro(0|ar[r>>2],6,E),0|Fo(f,6,g)):j=0,o=(t=1<<_)-1|0,a=(255&(0|go(G)))-1|0,n=(255&(0|Zo(G)))-1|0,Ze(Y),C?(e=0|or[C+8>>1],T=0|tr[C+10>>0],pe(V,e,0|or[C+4>>1]),ar[Y>>2]=ar[V>>2],ar[Y+4>>2]=ar[V+4>>2],ar[Y+8>>2]=ar[V+8>>2],ar[Y+12>>2]=ar[V+12>>2],ar[Y+16>>2]=ar[V+16>>2],T=T<<24>>24!=0,e&=65535):(T=1,e=2),0<(0|d)){U=0<(0|k),S=k<<1,O=0==(0|e),M=8==(0|e),Q=1<<_+-1&65535,D=Y+4|0,J=Y+8|0,_=Y+12|0,G=Y+16|0,r=0;do{if(U){V=r>>n,C=0;do{i=C>>a,f=u+((0|br(0|ar[B>>2],V))+i)|0,f=0|tr[f>>0];do{if(O){if(e=(0|br(0|ar[X>>2],r))+C|0,T){tr[b+e>>0]=f,Y=c+((0|br(0|ar[p>>2],r))+C)|0,e=s+((0|br(0|ar[v>>2],r))+C)|0,tr[e>>0]=0|tr[Y>>0],e=l+((0|br(0|ar[y>>2],V))+i)|0,e=0|tr[e>>0];break}tr[b+e>>0]=16+((128+(219*(255&f)|0)|0)>>>8),Y=c+((0|br(0|ar[p>>2],r))+C)|0,e=s+((0|br(0|ar[v>>2],r))+C)|0,tr[e>>0]=16+((128+(219*(0|cr[Y>>0])|0)|0)>>>8),e=l+((0|br(0|ar[y>>2],V))+i)|0,e=16+((128+(219*(0|cr[e>>0])|0)|0)>>>8)&255;break}if(e=0|br(0|ar[y>>2],V),I=c+((0|br(0|ar[p>>2],r))+C)|0,I=0|tr[I>>0],i=(0|cr[l+(e+i)>>0])-Q|0,e=(255&f)-Q|0,M){L=(Y=(f=255&I)-i|0)+e|0,I=b+((0|br(0|ar[X>>2],r))+C)|0,tr[I>>0]=(0|L)<0?0:255<(0|L)?-1:255&L,f=i+f|0,I=s+((0|br(0|ar[v>>2],r))+C)|0,tr[I>>0]=(0|f)<0?0:255<(0|f)?-1:255&f,e=(0|(e=Y-e|0))<0?0:255<(0|e)?-1:255&e;break}R=+(255&I),N=+(0|i),F=+(0|e),N=T?N:1.142899990081787*N,e=(0|(e=0|ef((R=T?R:1.1689000129699707*(R+-16))+(F=T?F:1.142899990081787*F)*gA[D>>2])))<0?0:255&((0|e)<(0|t)?e:o),L=b+((0|br(0|ar[X>>2],r))+C)|0,tr[L>>0]=e,e=(0|(e=0|ef(R+N*gA[J>>2]+F*gA[_>>2])))<0?0:255&((0|e)<(0|t)?e:o),L=s+((0|br(0|ar[v>>2],r))+C)|0,tr[L>>0]=e,e=(0|(e=0|ef(R+N*gA[G>>2])))<0?0:255&((0|e)<(0|t)?e:o)}while(0);L=H+((0|br(0|ar[m>>2],r))+C)|0,tr[L>>0]=e,C=C+1|0}while((0|C)!=(0|k))}Z&&hb(0|(L=z+(0|br(0|ar[g>>2],r))|0),j+(0|br(0|ar[E>>2],r))|0,0|S),r=r+1|0}while((0|r)!=(0|d))}ar[A>>2]=x,ar[A+4>>2]=P,ur=(w||du(h),W)},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o=0;return ur=(t=ur)+48|0,n=t+36|0,e=t,8==(0|ar[(r|=0)+12>>2])&&1==(0|ar[r>>2])&&3==(0|ar[r+4>>2])?(ar[n>>2]=0,ar[(f=4+n|0)>>2]=0,o=(ar[8+n>>2]=0)|ar[i+4>>2],i=0|tr[r+8>>0],ar[e>>2]=0,ar[e+4>>2]=o,tr[e+8>>0]=i,ar[e+12>>2]=8,ar[e+16>>2]=0,ar[(i=e+20|0)>>2]=0,gA[e+24>>2]=.75,gA[e+28>>2]=.5,gA[e+32>>2]=0,Nl(n,e),0|(e=0|ar[i>>2])&&du(e),ar[A>>2]=ar[n>>2],ar[A+4>>2]=ar[f>>2],ar[A+8>>2]=ar[8+n>>2]):(ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0),void(ur=t)},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0,R=0,N=0,_=0,Y=0,Q=0,D=0,J=0,M=0,T=0,U=0,S=0,O=0,z=0,j=0,H=0,x=0;if(ur=(p=ur)+112|0,w=p+108|0,v=p+104|0,T=p+100|0,Z=p+96|0,F=p+92|0,b=p+88|0,s=p+84|0,m=p+80|0,Y=p+40|0,X=p,U=0|ar[(r|=0)>>2],g=0|ar[U+24>>2],U=0|ar[U+28>>2],d=255&(0|go(f=0|ar[i+4>>2])),k=255&(0|Zo(f)),E=255&(O=0|Vo(0|ar[r>>2],3)),O<<24>>24!=8)return ar[A>>2]=0,ar[A+4>>2]=0,void(ur=p);if((h=0|Eo(0|ar[r>>2],6))&&(0|Vo(0|ar[r>>2],6))<<24>>24!=8)return ar[A>>2]=0,ar[A+4>>2]=0,void(ur=p);if(y=0|hu(80),ar[y+4>>2]=0,ar[y+8>>2]=0,ar[y>>2]=6208,ar[(B=y+12|0)>>2]=0,ar[B+4>>2]=0,ar[B+8>>2]=0,ar[B+12>>2]=0,ar[B+16>>2]=0,ar[y+32>>2]=32215,ar[y+36>>2]=0,ar[y+40>>2]=0,ar[y+44>>2]=99,ar[y+48>>2]=99,O=y+52|0,ar[(S=y+72|0)>>2]=0,ar[y+76>>2]=0,ar[O>>2]=0,ar[O+4>>2]=0,ar[O+8>>2]=0,ar[O+12>>2]=0,ar[y+68>>2]=S,S=B,M=(O=y)+16|0,bu(y),su(y),e=0|ar[M>>2],ar[B>>2]=S,ar[M>>2]=O,0|e&&ku(e),du(y),yo(B,g,U,0,f),J=(g-1+d|0)/(0|d)|0,M=(U+-1+k|0)/(0|k)|0,Bo(B,0,g,U,E),Bo(B,1,J,M,E),Bo(B,2,J,M,E),h&&Bo(B,6,g,U,E),ar[w>>2]=0,ar[v>>2]=0,ar[T>>2]=0,ar[Z>>2]=0,ar[F>>2]=0,ar[b>>2]=0,ar[s>>2]=0,c=(ar[m>>2]=0)|Ro(0|ar[r>>2],3,w),l=0|Ro(0|ar[r>>2],4,v),u=0|Ro(0|ar[r>>2],5,T),G=0|Fo(B,0,F),J=0|Fo(B,1,b),M=0|Fo(B,2,s),Q=h?(D=0|Ro(0|ar[r>>2],6,Z),0|Fo(B,6,m)):D=0,n=1<<E+-1,a=(o=1<<E)-1|0,Be(Y),e=0|ar[i+16>>2])for(r=0|tr[e+10>>0],ye(X,y=0|or[e+8>>1],0|or[e+4>>1]),r=r<<24>>24!=0,y&=65535,e=X,f=(B=Y)+40|0;ar[B>>2]=ar[e>>2],e=e+4|0,(0|(B=B+4|0))<(0|f););else y=2,r=1;if(t=0<(0|U)){E=0<(0|g),i=0==(0|y),X=Y+4|0,I=Y+8|0,C=Y+12|0,B=0;do{A:do{if(E){if(i)f=0;else for(f=0;;)if(_=l+((0|br(0|ar[v>>2],B))+f)|0,N=c+((0|br(0|ar[w>>2],B))+f)|0,e=u+((0|br(0|ar[T>>2],B))+f)|0,V=(0|cr[N>>0])*gA[X>>2]+(0|cr[_>>0])*gA[I>>2]+(0|cr[e>>0])*gA[C>>2],e=(0|(e=0|ef(r?V:219*V*.00390625+16)))<0?0:255&((0|e)<(0|o)?e:a),_=G+((0|br(0|ar[F>>2],B))+f)|0,tr[_>>0]=e,(0|(f=f+1|0))==(0|g))break A;for(;e=l+((0|br(0|ar[v>>2],B))+f)|0,e=0|tr[e>>0],r||(e=(0|(e=0|ef(219*(255&e)*.00390625+16)))<0?0:255&((0|e)<(0|o)?e:a)),_=G+((0|br(0|ar[F>>2],B))+f)|0,tr[_>>0]=e,(0|(f=f+1|0))!=(0|g););}}while(0);B=B+1|0}while((0|B)!=(0|U));if(t){_=0<(0|g),I=0==(0|y),C=Y+16|0,G=Y+20|0,F=Y+24|0,R=Y+28|0,N=Y+32|0,X=Y+36|0,V=+(65535&n|0),i=0;do{if(_)for(E=0;e=I?(e=u+((0|br(0|ar[T>>2],i))+E)|0,e=0|tr[e>>0],y=(e=r?(y=(0|i)/(0|k)|0,f=(0|E)/(0|d)|0,Y=J+((0|br(0|ar[b>>2],y))+f)|0,tr[Y>>0]=e,e=c+((0|br(0|ar[T>>2],i))+E)|0,0|tr[e>>0]):(e=(0|(e=0|ef(219*(255&e)*.00390625+16)))<0?0:255&((0|e)<(0|o)?e:a),y=(0|i)/(0|k)|0,f=(0|E)/(0|d)|0,Y=J+((0|br(0|ar[b>>2],y))+f)|0,tr[Y>>0]=e,e=c+((0|br(0|ar[T>>2],i))+E)|0,(0|(e=0|ef(219*(0|cr[e>>0])*.00390625+16)))<0?0:255&((0|e)<(0|o)?e:a)),0|br(0|ar[b>>2],y)),B=e,y+f|0):(e=c+((0|br(0|ar[w>>2],i))+E)|0,x=+(0|cr[e>>0]),e=l+((0|br(0|ar[v>>2],i))+E)|0,H=+(0|cr[e>>0]),e=u+((0|br(0|ar[T>>2],i))+E)|0,W=+(0|cr[e>>0]),z=224*(j=x*gA[C>>2]+H*gA[G>>2]+W*gA[F>>2])*.00390625,W=r?x*gA[R>>2]+H*gA[N>>2]+W*gA[X>>2]:224*z*.00390625,e=(0|(e=0|ef(V+(r?j:z))))<0?0:255&((0|e)<(0|o)?e:a),f=(0|i)/(0|k)|0,y=(0|E)/(0|d)|0,Y=J+((0|br(0|ar[b>>2],f))+y)|0,tr[Y>>0]=e,B=e=(0|(e=0|ef(V+W)))<0?0:255&((0|e)<(0|o)?e:a),(0|br(0|ar[s>>2],f))+y|0),tr[M+e>>0]=B,(0|(E=E+d|0))<(0|g););i=i+k|0}while((0|i)<(0|U));if(h&t)for(e=0;hb(0|(T=Q+(0|br(0|ar[m>>2],e))|0),D+(0|br(0|ar[Z>>2],e))|0,0|g),(0|(e=e+1|0))!=(0|U););}}ar[A>>2]=S,ar[A+4>>2]=O,ur=p},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o=0,a=0;return ur=(t=ur)+48|0,n=t+36|0,e=t,8!=(0|(f=0|ar[(r|=0)+12>>2]))&&1==(0|ar[r>>2])&&3==(0|ar[r+4>>2])?(ar[n>>2]=0,ar[(o=4+n|0)>>2]=0,a=(ar[8+n>>2]=0)|ar[i+4>>2],i=0|tr[r+8>>0],ar[e>>2]=0,ar[e+4>>2]=a,tr[e+8>>0]=i,ar[e+12>>2]=f,ar[e+16>>2]=0,ar[(i=e+20|0)>>2]=0,gA[e+24>>2]=.75,gA[e+28>>2]=.5,gA[e+32>>2]=0,Nl(n,e),0|(e=0|ar[i>>2])&&du(e),ar[A>>2]=ar[n>>2],ar[A+4>>2]=ar[o>>2],ar[A+8>>2]=ar[8+n>>2]):(ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=0),void(ur=t)},function(A,e,r,i,f){A|=0,e|=0,i|=0,f|=0;var n,t,o,a,c,l,u,b,s,d,k,h,w,v,m,g,Z,p,y=0,B=0,E=0,X=0,W=0,I=0,C=0,G=0,V=0,F=0,R=0,N=0,_=0,Y=0,Q=0,D=0,J=0,M=0,T=0,U=0,S=0,O=0,z=0,j=0,H=0,x=0,P=0,L=0,K=0,q=0,$=0,AA=0,eA=0,rA=0,iA=0;if(ur=(p=ur)+112|0,o=p+108|0,a=p+104|0,n=p+100|0,Z=p+96|0,V=p+92|0,t=p+88|0,H=p+84|0,g=p+80|0,l=p+40|0,X=p,eA=0|ar[(r|=0)>>2],w=0|ar[eA+24>>2],eA=0|ar[eA+28>>2],v=255&(0|go(y=0|ar[i+4>>2])),m=255&(0|Zo(y)),E=255&(e=0|Vo(0|ar[r>>2],3)),e<<24>>24==8)return ar[A>>2]=0,ar[A+4>>2]=0,void(ur=p);if((q=0|Eo(0|ar[r>>2],6))&&(0|Vo(0|ar[r>>2],6))<<24>>24!=e<<24>>24)return ar[A>>2]=0,ar[A+4>>2]=0,void(ur=p);if(f=0|hu(80),ar[f+4>>2]=0,ar[f+8>>2]=0,ar[f>>2]=6208,ar[(B=f+12|0)>>2]=0,ar[B+4>>2]=0,ar[B+8>>2]=0,ar[B+12>>2]=0,ar[B+16>>2]=0,ar[f+32>>2]=32215,ar[f+36>>2]=0,ar[f+40>>2]=0,ar[f+44>>2]=99,ar[f+48>>2]=99,AA=f+52|0,ar[($=f+72|0)>>2]=0,ar[f+76>>2]=0,ar[AA>>2]=0,ar[AA+4>>2]=0,ar[AA+8>>2]=0,ar[AA+12>>2]=0,ar[f+68>>2]=$,$=B,K=(AA=f)+16|0,bu(f),su(f),e=0|ar[K>>2],ar[B>>2]=$,ar[K>>2]=AA,0|e&&ku(e),du(f),yo(B,w,eA,0,y),L=(w-1+v|0)/(0|v)|0,K=(eA+-1+m|0)/(0|m)|0,Bo(B,0,w,eA,E),Bo(B,1,L,K,E),Bo(B,2,L,K,E),q&&Bo(B,6,w,eA,E),ar[o>>2]=0,ar[a>>2]=0,ar[n>>2]=0,ar[Z>>2]=0,ar[V>>2]=0,ar[t>>2]=0,ar[H>>2]=0,d=(ar[g>>2]=0)|Ro(0|ar[r>>2],3,o),k=0|Ro(0|ar[r>>2],4,a),h=0|Ro(0|ar[r>>2],5,n),J=0|Fo(B,0,V),L=0|Fo(B,1,t),K=0|Fo(B,2,H),x=q?(P=0|Ro(0|ar[r>>2],6,Z),0|Fo(B,6,g)):P=0,ar[o>>2]=(0|ar[o>>2])/2|0,ar[a>>2]=(0|ar[a>>2])/2|0,ar[n>>2]=(0|ar[n>>2])/2|0,ar[Z>>2]=(0|ar[Z>>2])/2|0,ar[V>>2]=(0|ar[V>>2])/2|0,ar[t>>2]=(0|ar[t>>2])/2|0,ar[H>>2]=(0|ar[H>>2])/2|0,ar[g>>2]=(0|ar[g>>2])/2|0,c=1<<E+-1,s=(b=1<<E)-1|0,Be(l),e=0|ar[i+16>>2])for(r=0|tr[e+10>>0],ye(X,y=0|or[e+8>>1],0|or[e+4>>1]),r=r<<24>>24!=0,y&=65535,e=X,f=(B=l)+40|0;ar[B>>2]=ar[e>>2],e=e+4|0,(0|(B=B+4|0))<(0|f););else y=2,r=1;if(u=0<(0|eA)){_=0<(0|w),Y=0==(0|y),Q=0|ar[a>>2],X=0|ar[V>>2],V=0|ar[o>>2],F=0|ar[n>>2],W=+gA[4+l>>2],I=+gA[8+l>>2],C=+gA[12+l>>2],i=0;do{A:do{if(_){if(R=0|br(Q,i),N=0|br(X,i),B=0|br(V,i),E=0|br(F,i),Y)f=0;else for(f=0;;)if(z=(0|lr[d+(B+f<<1)>>1])*W+(0|lr[k+(R+f<<1)>>1])*I+(0|lr[h+(E+f<<1)>>1])*C,e=(0|(e=0|ef(r?z:219*z*.00390625+16)))<0?0:65535&((0|e)<(0|b)?e:s),or[J+(N+f<<1)>>1]=e,(0|(f=f+1|0))==(0|w))break A;for(;e=0|or[k+(R+f<<1)>>1],r||(e=(0|(e=0|ef(219*(65535&e)*.00390625+16)))<0?0:65535&((0|e)<(0|b)?e:s)),or[J+(N+f<<1)>>1]=e,(0|(f=f+1|0))!=(0|w););}}while(0);i=i+1|0}while((0|i)!=(0|eA));if(u){j=0<(0|w),J=0==(0|y),Q=0|ar[n>>2],Y=0|ar[t>>2],_=0|ar[o>>2],N=0|ar[a>>2],T=+gA[16+l>>2],U=+gA[20+l>>2],S=+gA[24+l>>2],O=+gA[28+l>>2],z=+gA[32+l>>2],M=+gA[36+l>>2],D=+(65535&c|0),X=0|ar[H>>2],i=0;do{if(j)for(V=0|br(Q,i),F=0|br(_,i),R=0|br(N,i),E=0;e=0|or[h+((f=V+E|0)<<1)>>1],e=J?(e=r?(y=0|br(Y,(0|i)/(0|m)|0),or[L+(y+(H=(0|E)/(0|v)|0)<<1)>>1]=e,f=0|or[d+(f<<1)>>1],H):(e=(0|(e=0|ef(219*(65535&e)*.00390625+16)))<0?0:65535&((0|e)<(0|b)?e:s),y=0|br(Y,(0|i)/(0|m)|0),or[L+(y+(B=(0|E)/(0|v)|0)<<1)>>1]=e,f=(0|(e=0|ef(219*(0|lr[d+(f<<1)>>1])*.00390625+16)))<0?0:65535&((0|e)<(0|b)?e:s),B),y+e|0):(I=224*(iA=(C=+(0|lr[d+(F+E<<1)>>1]))*T+(G=+(0|lr[k+(R+E<<1)>>1]))*U+(W=+(65535&e))*S)*.00390625,e=(0|(e=0|ef(D+(r?iA:I))))<0?0:65535&((0|e)<(0|b)?e:s),B=(0|E)/(0|v)|0,H=L+((0|br(Y,y=(0|i)/(0|m)|0))+B<<1)|0,or[H>>1]=e,f=e=(0|(e=0|ef(D+(r?C*O+G*z+W*M:224*I*.00390625))))<0?0:65535&((0|e)<(0|b)?e:s),(0|br(X,y))+B|0),or[K+(e<<1)>>1]=f,(0|(E=E+v|0))<(0|w););i=i+m|0}while((0|i)<(0|eA))}}if(q&&(rA=w<<1,u))for(e=0;hb(0|(q=x+((0|br(0|ar[g>>2],e))<<1)|0),P+((0|br(0|ar[Z>>2],e))<<1)|0,0|rA),(0|(e=e+1|0))!=(0|eA););ar[A>>2]=$,ar[A+4>>2]=AA,ur=p},function(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f|=0;var n=0;do{if(0|xu(A,0|ar[e+8>>2]))Lu(0,e,r,i);else if(0|xu(A,0|ar[e>>2])){if(A=e+32|0,(0|ar[e+16>>2])!=(0|r)&&(0|ar[(n=e+20|0)>>2])!=(0|r)){ar[A>>2]=i,ar[n>>2]=r,ar[(i=e+40|0)>>2]=1+(0|ar[i>>2]),1==(0|ar[e+36>>2])&&2==(0|ar[e+24>>2])&&(tr[e+54>>0]=1),ar[e+44>>2]=4;break}1==(0|i)&&(ar[A>>2]=1)}}while(0)},function(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f|=0;var n=0,t=0,o=0,a=0;do{if(0|xu(A,0|ar[e+8>>2]))Lu(0,e,r,i);else{if(n=A+8|0,!(0|xu(A,0|ar[e>>2]))){o=0|ar[n>>2],os[63&ar[24+(0|ar[o>>2])>>2]](o,e,r,i,f);break}if(A=e+32|0,(0|ar[e+16>>2])!=(0|r)&&(0|ar[(t=e+20|0)>>2])!=(0|r)){if(ar[A>>2]=i,4==(0|ar[(i=e+44|0)>>2]))break;tr[(A=e+52|0)>>0]=0,n=(tr[(a=e+53|0)>>0]=0)|ar[n>>2],as[15&ar[20+(0|ar[n>>2])>>2]](n,e,r,r,1,f),0|tr[a>>0]?0|tr[A>>0]?A=3:(A=3,o=11):(A=4,o=11),11==(0|o)&&(ar[t>>2]=r,ar[(a=e+40|0)>>2]=1+(0|ar[a>>2]),1==(0|ar[e+36>>2])&&2==(0|ar[e+24>>2])&&(tr[e+54>>0]=1)),ar[i>>2]=A;break}1==(0|i)&&(ar[A>>2]=1)}}while(0)},function(A,e,r,i,f){A|=0,e|=0,r|=0,i|=0,f|=0;var n=0,t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0,d=0,k=0,h=0;A:do{if(0|xu(A,0|ar[e+8>>2]))Lu(0,e,r,i);else{if(t=A+12|0,d=e+24|0,k=e+36|0,h=e+54|0,b=A+8|0,l=A+16|0,!(0|xu(A,0|ar[e>>2]))){if(o=A+16+((s=0|ar[t>>2])<<3)|0,rb(l,e,r,i,f),n=A+24|0,(0|s)<=1)break;if(0==(2&(t=0|ar[b>>2])|0)&&1!=(0|ar[k>>2])){if(!(1&t))for(;;){if(0|tr[h>>0])break A;if(1==(0|ar[k>>2]))break A;if(rb(n,e,r,i,f),o>>>0<=(n=n+8|0)>>>0)break A}for(;;){if(0|tr[h>>0])break A;if(1==(0|ar[k>>2])&&1==(0|ar[d>>2]))break A;if(rb(n,e,r,i,f),o>>>0<=(n=n+8|0)>>>0)break A}}for(;;){if(0|tr[h>>0])break A;if(rb(n,e,r,i,f),o>>>0<=(n=n+8|0)>>>0)break A}}if(n=e+32|0,(0|ar[e+16>>2])!=(0|r)&&(0|ar[(s=e+20|0)>>2])!=(0|r)){if(ar[n>>2]=i,4==(0|ar[(u=e+44|0)>>2]))break;i=A+16+(ar[t>>2]<<3)|0,a=e+52|0,c=e+53|0,A=l,o=n=0;e:for(;;){if(i>>>0<=A>>>0){t=18;break}if(tr[a>>0]=0,tr[c>>0]=0,eb(A,e,r,r,1,f),0|tr[h>>0]){t=18;break}do{if(0|tr[c>>0]){if(!(0|tr[a>>0])){if(1&ar[b>>2]){n=1,t=o;break}n=1,t=18;break e}if(1==(0|ar[d>>2])){t=23;break e}if(!(2&ar[b>>2])){t=23;break e}t=n=1}else t=o}while(0);A=A+8|0,o=t}do{if(18==(0|t)){if(!o&&(ar[s>>2]=r,ar[(r=e+40|0)>>2]=1+(0|ar[r>>2]),1==(0|ar[k>>2]))&&2==(0|ar[d>>2])){if(tr[h>>0]=1,n){t=23;break}n=4;break}n?t=23:n=4}}while(0);23==(0|t)&&(n=3),ar[u>>2]=n;break}1==(0|i)&&(ar[n>>2]=1)}}while(0)},function(A,e,r,i,f){A|=0,e|=0,r|=0,f|=0;var n,t,o=0,a=0,c=0,l=0,u=0;if(!((0|(i|=0))<=0)){t=255+(n=1<<f)|0,f=0;do{for(a=0|br(f,e),c=0|br(f,i),o=0;u=(0|cr[(l=A+(o+a)|0)>>0])+(0|ar[r+(o+c<<2)>>2])|0,tr[l>>0]=(0|u)<0?0:255&((0|u)<(0|n)?u:t),(0|(o=o+1|0))!=(0|i););f=f+1|0}while((0|f)!=(0|i))}},function(A,e,r,i,f){A|=0,e|=0,r|=0,f|=0;var n,t,o=0,a=0,c=0,l=0,u=0;if(!((0|(i|=0))<=0)){t=65535+(n=1<<f)|0,f=0;do{for(a=0|br(f,e),c=0|br(f,i),o=0;u=(0|lr[(l=A+(o+a<<1)|0)>>1])+(0|ar[r+(o+c<<2)>>2])|0,or[l>>1]=(0|u)<0?0:65535&((0|u)<(0|n)?u:t),(0|(o=o+1|0))!=(0|i););f=f+1|0}while((0|f)!=(0|i))}},function(A,e,r,i,f){A|=0,e|=0,i|=0;var n,t=0,o=0,a=0,c=0,l=0;if(n=1<<(f|=0)+-1,0<(0|(r|=0))){a=0;do{for(c=0|br(a,r),o=t=0;o=((or[e+((l=t+c|0)<<1)>>1]<<i)+n>>f)+o|0,ar[A+(l<<2)>>2]=o,(0|(t=t+1|0))!=(0|r););a=a+1|0}while((0|a)!=(0|r))}},function(A,e,r,i,f){A|=0,e|=0,i|=0;var n,t=0,o=0,a=0,c=0;if(n=1<<(f|=0)+-1,0<(0|(r|=0))){a=0;do{for(o=t=0;c=(0|br(t,r))+a|0,o=((or[e+(c<<1)>>1]<<i)+n>>f)+o|0,ar[A+(c<<2)>>2]=o,(0|(t=t+1|0))!=(0|r););a=a+1|0}while((0|a)!=(0|r))}},function(A,e,r,i,f){A|=0,e|=0,i|=0;var n,t=0,o=0,a=0,c=0;if(n=1<<(f|=0)+-1,0<(0|(r|=0))){o=0;do{for(a=0|br(o,r),t=0;ar[A+((c=t+a|0)<<2)>>2]=(or[e+(c<<1)>>1]<<i)+n>>f,(0|(t=t+1|0))!=(0|r););o=o+1|0}while((0|o)!=(0|r))}},Jb,Jb,Jb,Jb,Jb,Jb,Jb,Jb,Jb,Jb,Jb,Jb,Jb,Jb,Jb],as=[Mb,function(A,e,r,i,f,n){A|=0,r|=0,i|=0,f|=0,n|=0;var t,o=0,a=0,c=0,l=0,u=0;l=(a=0|ar[(o=(e|=0)+44|0)>>2])>>>0<(c=u=0|ar[(t=e+24|0)>>2])>>>0?(ar[o>>2]=u,c):a,a=24&n;A:do{if(0==(0|a)||1==(0|f)&24==(0|a))o=a=-1;else{e:do{switch(0|f){case 0:a=o=0;break;case 1:if(8&n){a=((0|(o=a=(0|ar[e+12>>2])-(0|ar[e+8>>2])|0))<0)<<31>>31;break e}a=((0|(o=a=c-(0|ar[e+20>>2])|0))<0)<<31>>31;break e;case 2:(0|tr[(o=e+32|0)+11>>0])<0&&(o=0|ar[o>>2]),a=((0|(o=a=l-o|0))<0)<<31>>31;break;default:o=a=-1;break A}}while(0);if(a=0|tb(0|o,0|a,0|r,0|i),0<=(0|(o=D)))if((0|tr[(c=e+32|0)+11>>0])<0&&(c=0|ar[c>>2]),(0|(r=((0|(i=l-c|0))<0)<<31>>31))<(0|o)|(0|r)==(0|o)&i>>>0<a>>>0)o=a=-1;else{if(c=8&n,!(0==(0|a)&0==(0|o))){if(0|c&&0==(0|ar[e+12>>2])){o=a=-1;break}if(0!=(16&n|0)&0==(0|u)){o=a=-1;break}}0|c&&(ar[e+12>>2]=(0|ar[e+8>>2])+a,ar[e+16>>2]=l),16&n&&(ar[t>>2]=(0|ar[e+20>>2])+a)}else o=a=-1}}while(0);ar[(u=A)>>2]=0,ar[u+4>>2]=0,ar[(A=A+8|0)>>2]=a,ar[A+4>>2]=o},function(A,e,r,i,f,n){n|=0,ar[(n=A|=0)>>2]=0,ar[n+4>>2]=0,ar[(n=A+8|0)>>2]=-1,ar[n+4>>2]=-1},function(A,e,r,i,f,n){n|=0,ar[(n=A|=0)>>2]=0,ar[n+4>>2]=0,ar[(n=A+8|0)>>2]=-1,ar[n+4>>2]=-1},function(A,e,r,i,f,n){var t,o,a,c;for(A|=0,e|=0,r|=0,n|=0,t=ur=(o=ur)+31&-32,ur=ur+16|0,ar[t>>2]=0,ar[4+t>>2]=0,e=ar[8+t>>2]=0;3!=(0|e);)e=e+1|(ar[t+(e<<2)>>2]=0);for(n=(e=(c=(a=0|tr[n+11>>0])<<24>>24<0)?0|ar[n>>2]:n)+(c?0|ar[n+4>>2]:255&a)|0;!(n>>>0<=e>>>0);)_u(t,0|tr[e>>0]),e=e+1|0;for(r=0|tf(0,0,0,e=(0|tr[11+t>>0])<0?0|ar[t>>2]:t),ar[A>>2]=0,ar[A+4>>2]=0,n=ar[A+8>>2]=0;3!=(0|n);)n=n+1|(ar[A+(n<<2)>>2]=0);for(n=e+(0|Vc(r))|0;!(n>>>0<=e>>>0);)_u(A,0|tr[e>>0]),e=e+1|0;Bu(t),ur=o},function(A,e,r,i,f,n){A|=0,e|=0,n|=0;var t,o,a,c,l,u,b=0,s=0,d=0,k=0,h=0,w=0;for(w=ur=(u=ur)+31&-32,ur=ur+176|0,o=w+168|0,a=w+40|0,c=w+36|0,l=w+32|0,k=(t=w)+24|0,w=w+16|0,ar[t>>2]=0,ar[t+4>>2]=0,e=ar[t+8>>2]=0;3!=(0|e);)e=e+1|(ar[t+(e<<2)>>2]=0);for(ar[k+4>>2]=0,ar[k>>2]=16892,s=(e=(d=(s=0|tr[n+8+3>>0])<<24>>24<0)?0|ar[n>>2]:n)+((d?0|ar[n+4>>2]:255&s)<<2)|0,d=32+a|0,n=e,e=0;2!=(0|e)&n>>>0<s>>>0;){if(ar[l>>2]=n,2==(0|(b=0|es[15&ar[12+(0|ar[k>>2])>>2]](k,o,n,s,l,a,d,c)))||(0|ar[l>>2])==(0|n)){h=7;break}for(e=a;!(e>>>0>=(0|ar[c>>2])>>>0);)_u(t,0|tr[e>>0]),e=e+1|0;n=0|ar[l>>2],e=b}for(7==(0|h)&&ti(),an(),n=0|tf(0,0,0,b=(0|tr[t+11>>0])<0?0|ar[t>>2]:t),ar[A>>2]=0,ar[A+4>>2]=0,e=ar[A+8>>2]=0;3!=(0|e);)e=e+1|(ar[A+(e<<2)>>2]=0);for(ar[w+4>>2]=0,ar[w>>2]=16940,d=s=b+(0|Vc(n))|0,k=128+a|0,n=b,e=0;;){if(!(2!=(0|e)&n>>>0<s>>>0)){h=21;break}if(ar[l>>2]=n,2==(0|(b=0|es[15&ar[16+(0|ar[w>>2])>>2]](w,o,n,32<(d-n|0)?n+32|0:s,l,a,k,c)))||(0|ar[l>>2])==(0|n)){h=17;break}for(e=a;!(e>>>0>=(0|ar[c>>2])>>>0);)Ou(A,0|ar[e>>2]),e=e+4|0;n=0|ar[l>>2],e=b}if(17==(0|h))ti();else if(21==(0|h))return an(),Bu(t),void(ur=u)},function(A,e,r,i,f,n){r|=0,i|=0,f|=0,n|=0,0|xu(A|=0,0|ar[(e|=0)+8>>2])&&Ku(0,e,r,i,f)},function(A,e,r,i,f,n){r|=0,i|=0,f|=0,n|=0,0|xu(A|=0,0|ar[(e|=0)+8>>2])?Ku(0,e,r,i,f):(A=0|ar[A+8>>2],as[15&ar[20+(0|ar[A>>2])>>2]](A,e,r,i,f,n))},function(A,e,r,i,f,n){r|=0,i|=0,f|=0,n|=0;var t=0,o=0,a=0,c=0,l=0,u=0,b=0,s=0;if(0|xu(A|=0,0|ar[(e|=0)+8>>2]))Ku(0,e,r,i,f);else{t=0|tr[(s=e+52|0)>>0],a=0|tr[(o=e+53|0)>>0],c=A+16+((b=0|ar[A+12>>2])<<3)|0,tr[s>>0]=0,eb(A+16|(tr[o>>0]=0),e,r,i,f,n);A:do{if(1<(0|b)){l=e+24|0,u=e+54|0,b=A+8|0,A=A+24|0;do{if(0|tr[u>>0])break A;if(0|tr[s>>0]){if(1==(0|ar[l>>2]))break A;if(!(2&ar[b>>2]))break A}else if(0|tr[o>>0]&&0==(1&ar[b>>2]|0))break A;tr[s>>0]=0,tr[o>>0]=0,eb(A,e,r,i,f,n),A=A+8|0}while(A>>>0<c>>>0)}}while(0);tr[s>>0]=t,tr[o>>0]=a}},function(A,e,r,i,f,n){A|=0,e|=0,r|=0,i|=0,n|=0;var t=0,o=0,a=0,c=0,l=0;if(1&(f|=0)|0&&sr(36230,36243,40,36262),0<(0|n)&0<(0|f)){a=0;do{for(t=A+(0|br(a,e))|0,o=r+((0|br(a,i))<<1)|0,c=0;l=32+(0|or[o>>1])>>6,tr[t>>0]=(0|l)<0?0:255&((0|l)<255?l:255),l=32+(0|or[o+2>>1])>>6,tr[t+1>>0]=(0|l)<0?0:255&((0|l)<255?l:255),!((0|f)<=(0|(c=c+2|0)));)t=t+2|0,o=o+4|0;a=a+1|0}while((0|a)!=(0|n))}},Mb,Mb,Mb,Mb,Mb,Mb],cs=[Tb,function(A,e,r,i,f,n,t){A|=0,e|=0,r|=0,i|=0,f|=0,t|=0;var o=0,a=0,c=0,l=0,u=0,b=0;if(1&(n|=0)|0&&sr(36230,36243,105,36363),0<(0|t)&0<(0|n)){l=0;do{for(c=0|br(l,f),o=A+(0|br(l,e))|0,a=i+(c<<1)|0,c=r+(c<<1)|0,u=0;b=64+(0|or[c>>1])+(0|or[a>>1])>>7,tr[o>>0]=(0|b)<0?0:255&((0|b)<255?b:255),b=64+(0|or[c+2>>1])+(0|or[a+2>>1])>>7,tr[o+1>>0]=(0|b)<0?0:255&((0|b)<255?b:255),!((0|n)<=(0|(u=u+2|0)));)o=o+2|0,a=a+4|0,c=c+4|0;l=l+1|0}while((0|l)!=(0|t))}},function(A,e,r,i,f,n,t){A|=0,e|=0,r|=0,i|=0,n|=0;var o,a,c,l,u=0,b=0,s=0,d=0;if(c=0<(0|(l=14-(t|=0)|0))?1<<l-1:0,1&(f|=0)|0&&sr(36230,36243,172,36396),!((0|n)<=0)&&(a=65535+(o=1<<t)|0,0<(0|f))){b=0;do{for(t=A+((0|br(b,e))<<1)|0,u=r+((0|br(b,i))<<1)|0,s=0;d=(0|or[u>>1])+c>>l,or[t>>1]=(0|d)<0?0:65535&((0|d)<(0|o)?d:a),d=(0|or[u+2>>1])+c>>l,or[t+2>>1]=(0|d)<0?0:65535&((0|d)<(0|o)?d:a),!((0|f)<=(0|(s=s+2|0)));)t=t+4|0,u=u+4|0;b=b+1|0}while((0|b)!=(0|n))}},function(A,e,r,i,f,n,t){A|=0,e|=0,r|=0,i|=0,t|=0;var o=0,a=0,c=0,l=0,u=0,b=0;if(0<(0|(n|=0))&0<(0|(f|=0))){c=0;do{for(t=r+(0|br(c,i))|0,o=A+((0|br(c,e))<<1)|0,a=0;b=(0|cr[t+1>>0])<<6&65535,u=(0|cr[t+2>>0])<<6&65535,l=(0|cr[t+3>>0])<<6&65535,or[o>>1]=(0|cr[t>>0])<<6,or[o+2>>1]=b,or[o+4>>1]=u,or[o+6>>1]=l,!((0|f)<=(0|(a=a+4|0)));)t=t+4|0,o=o+8|0;c=c+1|0}while((0|c)!=(0|n))}},function(A,e,r,i,f,n,t){xo(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,0,1,8)},function(A,e,r,i,f,n,t){xo(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,0,2,8)},function(A,e,r,i,f,n,t){xo(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,0,3,8)},function(A,e,r,i,f,n,t){xo(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,1,0,8)},function(A,e,r,i,f,n,t){xo(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,1,1,8)},function(A,e,r,i,f,n,t){xo(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,1,2,8)},function(A,e,r,i,f,n,t){xo(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,1,3,8)},function(A,e,r,i,f,n,t){xo(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,2,0,8)},function(A,e,r,i,f,n,t){xo(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,2,1,8)},function(A,e,r,i,f,n,t){xo(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,2,2,8)},function(A,e,r,i,f,n,t){xo(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,2,3,8)},function(A,e,r,i,f,n,t){xo(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,3,0,8)},function(A,e,r,i,f,n,t){xo(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,3,1,8)},function(A,e,r,i,f,n,t){xo(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,3,2,8)},function(A,e,r,i,f,n,t){xo(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,3,3,8)},Tb,Tb,Tb,Tb,Tb,Tb,Tb,Tb,Tb,Tb,Tb,Tb,Tb],ls=[Ub,function(A,e,r,i,f,n,t,o){A|=0,e|=0,r|=0,i|=0,f|=0,t|=0;var a,c,l,u,b=0,s=0,d=0,k=0,h=0;if(l=1<<(u=15-(o|=0)|0)-1,1&(n|=0)|0&&sr(36230,36243,238,36490),!((0|t)<=0)&&(c=65535+(a=1<<o)|0,0<(0|n))){d=0;do{for(s=0|br(d,f),o=A+((0|br(d,e))<<1)|0,b=i+(s<<1)|0,s=r+(s<<1)|0,k=0;h=(0|or[s>>1])+l+(0|or[b>>1])>>u,or[o>>1]=(0|h)<0?0:65535&((0|h)<(0|a)?h:c),h=(0|or[s+2>>1])+l+(0|or[b+2>>1])>>u,or[o+2>>1]=(0|h)<0?0:65535&((0|h)<(0|a)?h:c),!((0|n)<=(0|(k=k+2|0)));)o=o+4|0,b=b+4|0,s=s+4|0;d=d+1|0}while((0|d)!=(0|t))}},function(A,e,r,i,f,n,t,o){A|=0,e|=0,r|=0,i|=0,t|=0;var a,c=0,l=0;if(a=14-(o|=0)|0,0<(0|(n|=0))&0<(0|(f|=0))){c=0;do{for(t=A+((0|br(c,e))<<1)|0,o=r+((0|br(c,i))<<1)|0,l=0;or[t>>1]=(0|lr[o>>1])<<a,(0|(l=l+1|0))!=(0|f);)t=t+2|0,o=o+2|0;c=c+1|0}while((0|c)!=(0|n))}},function(A,e,r,i,f,n,t,o){Po(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,0,1,o|=0)},function(A,e,r,i,f,n,t,o){Po(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,0,2,o|=0)},function(A,e,r,i,f,n,t,o){Po(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,0,3,o|=0)},function(A,e,r,i,f,n,t,o){Po(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,1,0,o|=0)},function(A,e,r,i,f,n,t,o){Po(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,1,1,o|=0)},function(A,e,r,i,f,n,t,o){Po(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,1,2,o|=0)},function(A,e,r,i,f,n,t,o){Po(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,1,3,o|=0)},function(A,e,r,i,f,n,t,o){Po(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,2,0,o|=0)},function(A,e,r,i,f,n,t,o){Po(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,2,1,o|=0)},function(A,e,r,i,f,n,t,o){Po(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,2,2,o|=0)},function(A,e,r,i,f,n,t,o){Po(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,2,3,o|=0)},function(A,e,r,i,f,n,t,o){Po(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,3,0,o|=0)},function(A,e,r,i,f,n,t,o){Po(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,3,1,o|=0)},function(A,e,r,i,f,n,t,o){Po(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,3,2,o|=0)},function(A,e,r,i,f,n,t,o){Po(A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,3,3,o|=0)},Ub,Ub,Ub,Ub,Ub,Ub,Ub,Ub,Ub,Ub,Ub,Ub,Ub,Ub],us=[Sb,function(A,e,r,i,f,n,t,o,a){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0;var c,l=0,u=0,b=0,s=0,d=0;if((0|(a|=0))<=0&&sr(36293,36243,60,36303),c=1<<a+-1,0<(0|n)&0<(0|f)){b=0;do{for(l=A+(0|br(b,e))|0,u=r+((0|br(b,i))<<1)|0,s=0;d=((0|br(0|or[u>>1],t))+c>>a)+o|0,tr[l>>0]=(0|d)<0?0:255&((0|d)<255?d:255),(0|(s=s+1|0))!=(0|f);)l=l+1|0,u=u+2|0;b=b+1|0}while((0|b)!=(0|n))}},function(A,e,r,i,f,n,t,o,a){A|=0,e|=0,r|=0,i|=0,t|=0,o|=0,a|=0;var c=0;if(0<(0|(n|=0))&0<(0|(f|=0))){a=0;do{for(t=r+(0|br(a,i))|0,o=A+((0|br(a,e))<<1)|0,c=0;or[o>>1]=(0|cr[t>>0])<<6,(0|(c=c+1|0))!=(0|f);)t=t+1|0,o=o+2|0;a=a+1|0}while((0|a)!=(0|n))}},Sb],bs=[Ob,function(A,e,r,i,f,n,t,o,a,c){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,c|=0;var l,u,b,s=0,d=0,k=0,h=0;if((0|(a|=0))<=0&&sr(36293,36243,193,36428),b=1<<a+-1,!((0|n)<=0)&&(u=65535+(l=1<<c)|0,0<(0|f))){d=0;do{for(c=A+((0|br(d,e))<<1)|0,s=r+((0|br(d,i))<<1)|0,k=0;h=((0|br(0|or[s>>1],t))+b>>a)+o|0,or[c>>1]=(0|h)<0?0:65535&((0|h)<(0|l)?h:u),(0|(k=k+1|0))!=(0|f);)c=c+2|0,s=s+2|0;d=d+1|0}while((0|d)!=(0|n))}},function(A,e,r,i,f,n,t,o,a,c){A|=0,e|=0,r|=0,i|=0,t|=0,o|=0,a|=0;var l,u,b,s=0,d=0,k=0,h=0,w=0,v=0;if(b=ur,k=(c|=0)+-8|0,h=0|br((f|=0)<<1,l=(n|=0)+3|0),ur=(u=ur)+(15+(0|+h)&-16)|0,-1<(0|(h=n+2|0))){w=0<(0|f),a=-1;do{A:do{if(w)for(d=a+1|0,a=r+(((s=0)|br(a,i))-1)|0;;){switch(0|t){case 0:c=0|cr[(a=a+1|0)>>0];break;case 1:v=a+1|0,c=(0|br(0|cr[a>>0],-2))+(58*(0|cr[v>>0])|0)+(10*(0|cr[a+2>>0])|0)-(cr[a+3>>0]<<1)>>k&65535,a=v;break;case 2:v=a+1|0,c=(0|br(0|cr[a>>0],-4))+(54*(0|cr[v>>0])|0)+(cr[a+2>>0]<<4)-(cr[a+3>>0]<<1)>>k&65535,a=v;break;case 3:v=a+1|0,c=(0|br(0|cr[a>>0],-6))+(46*(0|cr[v>>0])|0)+(28*(0|cr[a+2>>0])|0)-(cr[a+3>>0]<<2)>>k&65535,a=v;break;case 4:v=a+1|0,c=(0|br(0|cr[a>>0],-4))-(cr[a+3>>0]<<2)+(36*((0|cr[a+2>>0])+(0|cr[v>>0])|0)|0)>>k&65535,a=v;break;case 5:v=a+1|0,c=(0|br(0|cr[a>>0],-4))+(28*(0|cr[v>>0])|0)+(46*(0|cr[a+2>>0])|0)+(0|br(0|cr[a+3>>0],-6))>>k&65535,a=v;break;case 6:v=a+1|0,c=(0|br(0|cr[a>>0],-2))+(cr[v>>0]<<4)+(54*(0|cr[a+2>>0])|0)-(cr[a+3>>0]<<2)>>k&65535,a=v;break;default:v=a+1|0,c=(0|br(0|cr[a>>0],-2))+(10*(0|cr[v>>0])|0)+(58*(0|cr[a+2>>0])|0)-(cr[a+3>>0]<<1)>>k&65535,a=v}if(v=u+(d+(0|br(s,l))<<1)|0,or[v>>1]=c,(0|(s=s+1|0))==(0|f)){a=d;break A}}else a=a+1|0}while(0)}while((0|a)!=(0|h))}if(k=0==(0|t)?k:6,(0|f)<=0)ur=b;else{h=0<(0|n),d=0;do{A:do{if(h)for(a=u+(((s=0)|br(d,l))<<1)|0;;){switch(0|o){case 0:c=0|or[(a=a+2|0)>>1];break;case 1:v=a+2|0,c=(0|br(0|or[a>>1],-2))+(58*(0|or[v>>1])|0)+(10*(0|or[a+4>>1])|0)-(or[a+6>>1]<<1)>>k&65535,a=v;break;case 2:v=a+2|0,c=(0|br(0|or[a>>1],-4))+(54*(0|or[v>>1])|0)+(or[a+4>>1]<<4)-(or[a+6>>1]<<1)>>k&65535,a=v;break;case 3:v=a+2|0,c=(0|br(0|or[a>>1],-6))+(46*(0|or[v>>1])|0)+(28*(0|or[a+4>>1])|0)-(or[a+6>>1]<<2)>>k&65535,a=v;break;case 4:v=a+2|0,c=(0|br(0|or[a>>1],-4))-(or[a+6>>1]<<2)+(36*((0|or[a+4>>1])+(0|or[v>>1])|0)|0)>>k&65535,a=v;break;case 5:v=a+2|0,c=(0|br(0|or[a>>1],-4))+(28*(0|or[v>>1])|0)+(46*(0|or[a+4>>1])|0)+(0|br(0|or[a+6>>1],-6))>>k&65535,a=v;break;case 6:v=a+2|0,c=(0|br(0|or[a>>1],-2))+(or[v>>1]<<4)+(54*(0|or[a+4>>1])|0)-(or[a+6>>1]<<2)>>k&65535,a=v;break;default:v=a+2|0,c=(0|br(0|or[a>>1],-2))+(10*(0|or[v>>1])|0)+(58*(0|or[a+4>>1])|0)-(or[a+6>>1]<<1)>>k&65535,a=v}if(v=A+((0|br(s,e))+d<<1)|0,or[v>>1]=c,(0|(s=s+1|0))==(0|n))break A}}while(0);d=d+1|0}while((0|d)!=(0|f));ur=b}},function(A,e,r,i,f,n,t,o,a,c){var l;if(A|=0,e|=0,r|=0,i|=0,t|=0,o|=0,a|=0,l=14-(c|=0)|0,0<(0|(n|=0))&0<(0|(f|=0))){a=0;do{for(t=r+((0|br(a,i))<<1)|0,o=A+((0|br(a,e))<<1)|0,c=0;or[o>>1]=(0|lr[t>>1])<<l,(0|(c=c+1|0))!=(0|f);)t=t+2|0,o=o+2|0;a=a+1|0}while((0|a)!=(0|n))}},function(A,e,r,i,f,n,t,o,a,c){A|=0,e|=0,r|=0,i|=0,t|=0,o|=0,a|=0;var l,u,b,s=0,d=0,k=0,h=0,w=0,v=0;if(b=ur,k=(c|=0)+-8|0,h=0|br((f|=0)<<1,l=(n|=0)+3|0),ur=(u=ur)+(15+(0|+h)&-16)|0,-1<(0|(h=n+2|0))){w=0<(0|f),a=-1;do{A:do{if(w)for(d=a+1|0,a=r+(((s=0)|br(a,i))-1<<1)|0;;){switch(0|t){case 0:c=0|or[(a=a+2|0)>>1];break;case 1:v=a+2|0,c=(0|br(0|lr[a>>1],-2))+(58*(0|lr[v>>1])|0)+(10*(0|lr[a+4>>1])|0)-(lr[a+6>>1]<<1)>>k&65535,a=v;break;case 2:v=a+2|0,c=(0|br(0|lr[a>>1],-4))+(54*(0|lr[v>>1])|0)+(lr[a+4>>1]<<4)-(lr[a+6>>1]<<1)>>k&65535,a=v;break;case 3:v=a+2|0,c=(0|br(0|lr[a>>1],-6))+(46*(0|lr[v>>1])|0)+(28*(0|lr[a+4>>1])|0)-(lr[a+6>>1]<<2)>>k&65535,a=v;break;case 4:v=a+2|0,c=(0|br(0|lr[a>>1],-4))-(lr[a+6>>1]<<2)+(36*((0|lr[a+4>>1])+(0|lr[v>>1])|0)|0)>>k&65535,a=v;break;case 5:v=a+2|0,c=(0|br(0|lr[a>>1],-4))+(28*(0|lr[v>>1])|0)+(46*(0|lr[a+4>>1])|0)+(0|br(0|lr[a+6>>1],-6))>>k&65535,a=v;break;case 6:v=a+2|0,c=(0|br(0|lr[a>>1],-2))+(lr[v>>1]<<4)+(54*(0|lr[a+4>>1])|0)-(lr[a+6>>1]<<2)>>k&65535,a=v;break;default:v=a+2|0,c=(0|br(0|lr[a>>1],-2))+(10*(0|lr[v>>1])|0)+(58*(0|lr[a+4>>1])|0)-(lr[a+6>>1]<<1)>>k&65535,a=v}if(v=u+(d+(0|br(s,l))<<1)|0,or[v>>1]=c,(0|(s=s+1|0))==(0|f)){a=d;break A}}else a=a+1|0}while(0)}while((0|a)!=(0|h))}if(k=0==(0|t)?k:6,(0|f)<=0)ur=b;else{h=0<(0|n),d=0;do{A:do{if(h)for(a=u+(((s=0)|br(d,l))<<1)|0;;){switch(0|o){case 0:c=0|or[(a=a+2|0)>>1];break;case 1:v=a+2|0,c=(0|br(0|or[a>>1],-2))+(58*(0|or[v>>1])|0)+(10*(0|or[a+4>>1])|0)-(or[a+6>>1]<<1)>>k&65535,a=v;break;case 2:v=a+2|0,c=(0|br(0|or[a>>1],-4))+(54*(0|or[v>>1])|0)+(or[a+4>>1]<<4)-(or[a+6>>1]<<1)>>k&65535,a=v;break;case 3:v=a+2|0,c=(0|br(0|or[a>>1],-6))+(46*(0|or[v>>1])|0)+(28*(0|or[a+4>>1])|0)-(or[a+6>>1]<<2)>>k&65535,a=v;break;case 4:v=a+2|0,c=(0|br(0|or[a>>1],-4))-(or[a+6>>1]<<2)+(36*((0|or[a+4>>1])+(0|or[v>>1])|0)|0)>>k&65535,a=v;break;case 5:v=a+2|0,c=(0|br(0|or[a>>1],-4))+(28*(0|or[v>>1])|0)+(46*(0|or[a+4>>1])|0)+(0|br(0|or[a+6>>1],-6))>>k&65535,a=v;break;case 6:v=a+2|0,c=(0|br(0|or[a>>1],-2))+(or[v>>1]<<4)+(54*(0|or[a+4>>1])|0)-(or[a+6>>1]<<2)>>k&65535,a=v;break;default:v=a+2|0,c=(0|br(0|or[a>>1],-2))+(10*(0|or[v>>1])|0)+(58*(0|or[a+4>>1])|0)-(or[a+6>>1]<<1)>>k&65535,a=v}if(v=A+((0|br(s,e))+d<<1)|0,or[v>>1]=c,(0|(s=s+1|0))==(0|n))break A}}while(0);d=d+1|0}while((0|d)!=(0|f));ur=b}},Ob,Ob,Ob],ss=[function(A,e,r,i,f,n,t,o,a,c,l,u){Z(22)},function(A,e,r,i,f,n,t,o,a,c,l,u){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0,l|=0;var b,s,d=0,k=0,h=0;if((0|(u|=0))<=0&&sr(36293,36243,80,36332),s=a+1+l<<u,!((0|t)<=0)&&(b=u+1|0,0<(0|n))){d=0;do{for(u=0|br(d,f),l=A+(0|br(d,e))|0,a=i+(u<<1)|0,u=r+(u<<1)|0,k=0;h=(h=0|br(0|or[u>>1],o))+s+(0|br(0|or[a>>1],c))>>b,tr[l>>0]=(0|h)<0?0:255&((0|h)<255?h:255),(0|(k=k+1|0))!=(0|n);)l=l+1|0,a=a+2|0,u=u+2|0;d=d+1|0}while((0|d)!=(0|t))}}],ds=[function(A,e,r,i,f,n,t,o,a,c,l,u,b){Z(23)},function(A,e,r,i,f,n,t,o,a,c,l,u,b){A|=0,e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0,l|=0,b|=0;var s,d,k,h,w=0,v=0;if((0|(u|=0))<=0&&sr(36293,36243,213,36458),h=a+1+l<<u,!((0|t)<=0)&&(k=u+1|0,d=65535+(s=1<<b)|0,0<(0|n))){b=0;do{for(u=0|br(b,f),l=A+((0|br(b,e))<<1)|0,a=i+(u<<1)|0,u=r+(u<<1)|0,w=0;v=(v=0|br(0|or[u>>1],o))+h+(0|br(0|or[a>>1],c))>>k,or[l>>1]=(0|v)<0?0:65535&((0|v)<(0|s)?v:d),(0|(w=w+1|0))!=(0|n);)l=l+2|0,a=a+2|0,u=u+2|0;b=b+1|0}while((0|b)!=(0|t))}}];return{__GLOBAL__I_000101:function(){!function(A){A|=0;var e=0;(function(A,e,r){var i,f;e|=0,r|=0,f=ur=(i=ur)+31&-32,ur=ur+16|0,Sf(A|=0),ar[A>>2]=14636,ar[A+32>>2]=e,ar[A+40>>2]=r,r=-1,ar[A+48>>2]=r,tr[A+52>>0]=0,r=0|ar[8+(0|ar[A>>2])>>2],ru(f,A+4|0),fs[63&r](A,f),bn(f),ur=i})(58864,A=0|ar[2637],58920),ar[14546]=14208,ar[14548]=14228,ar[14547]=0,Jf(58192,58864),ar[14566]=0,e=-1,ar[14567]=e,function(A,e,r){var i,f;e|=0,r|=0,f=ur=(i=ur)+31&-32,ur=ur+16|0,Of(A|=0),ar[A>>2]=14572,ar[A+32>>2]=e,ar[A+40>>2]=r,r=-1,ar[A+48>>2]=r,tr[A+52>>0]=0,r=0|ar[8+(0|ar[A>>2])>>2],ru(f,A+4|0),fs[63&r](A,f),bn(f),ur=i}(58928,A,58984),ar[14568]=14256,ar[14570]=14276,ar[14569]=0,Jf(58280,58928),ar[14588]=0,A=-1,ar[14589]=A,qf(58992,A=0|ar[2543],59040),ar[14590]=28,ar[14591]=48,Jf(58364,58992),ar[14609]=0,e=-1,ar[14610]=e,$f(59048,A,59096),ar[14611]=14312,ar[14612]=14332,Jf(58448,59048),ar[14630]=0,A=-1,ar[14631]=A,qf(59104,A=0|ar[2669],59152),ar[14632]=28,ar[14633]=48,Jf(58532,59104),ar[14651]=0,e=-1,ar[14652]=e,e=0|ar[58528+(0|ar[(0|ar[14632])-12>>2])+24>>2],ar[14674]=28,ar[14675]=48,Jf(58700,e),ar[14693]=0,e=-1,ar[14694]=e,$f(59160,A,59208),ar[14653]=14312,ar[14654]=14332,Jf(58616,59160),ar[14672]=0,A=-1,ar[14673]=A,A=0|ar[58612+(0|ar[(0|ar[14653])-12>>2])+24>>2],ar[14695]=14312,ar[14696]=14332,Jf(58784,A),ar[14714]=0,A=-1,ar[14715]=A,ar[58184+(0|ar[(0|ar[14546])-12>>2])+72>>2]=58360,ar[58272+(0|ar[(0|ar[14568])-12>>2])+72>>2]=58444,A=58528+(0|ar[(0|ar[14632])-12>>2])+4|0,ar[A>>2]=8192|ar[A>>2],A=58612+(0|ar[(0|ar[14653])-12>>2])+4|0,ar[A>>2]=8192|ar[A>>2],ar[58528+(0|ar[(0|ar[14632])-12>>2])+72>>2]=58360,ar[58612+(0|ar[(0|ar[14653])-12>>2])+72>>2]=58444}(0)},__GLOBAL__sub_I_bind_cpp:function(){rA(4080,48907),S(4096,48912,1,1,0),L(4104,48917,1,-128,127),L(4120,48922,1,-128,127),L(4112,48934,1,0,255),L(4128,48948,2,-32768,32767),L(4136,48954,2,0,65535),L(4144,48969,4,-2147483648,2147483647),L(4152,48973,4,0,-1),L(4160,48986,4,-2147483648,2147483647),L(4168,48991,4,0,-1),x(4176,49005,4),x(4184,49011,8),q(1408,49018),q(2336,49030),$(2360,4,49063),z(1400,49076),K(2384,0,49092),K(2392,0,49122),K(2400,1,49159),K(2408,2,49198),K(2416,3,49229),K(2424,4,49269),K(2432,5,49298),K(2440,4,49336),K(2448,5,49366),K(2392,0,49405),K(2400,1,49437),K(2408,2,49470),K(2416,3,49503),K(2424,4,49537),K(2432,5,49570),K(2456,6,49604),K(2464,7,49635),K(2472,7,49667)},__GLOBAL__sub_I_box_cc:function(){var A,e;ur=(e=ur)+16|0,ar[(A=e)>>2]=0,ar[A+4>>2]=0,oo(56592,ar[A+8>>2]=0,0,A),ur=(0<=(0|tr[A+11>>0])||vu(0|ar[A>>2]),e)},__GLOBAL__sub_I_heif_cc:function(){!function(A){A|=0;var e=0;P(26177,1,6244,26194,67,435),P(26197,1,6248,26194,68,2),P(26221,1,6252,26194,69,3),P(26240,2,6256,26258,44,436),P(26262,3,6264,26292,32,77),P(26297,2,6276,26341,20,70),P(26345,2,6284,26341,21,45),P(26393,3,6292,26292,33,78),P(26426,4,6304,26447,7,10),P(26453,2,6320,26258,46,437),j(1224,26479,4,0),H(1224,26495,0),H(1224,26509,1),H(1224,26541,2),H(1224,26566,3),H(1224,26598,4),H(1224,26629,5),H(1224,26652,6),H(1224,26687,7),H(1224,26719,8),H(1224,26751,9),H(1224,26777,10),j(1232,26817,4,0),H(1232,26836,0),H(1232,26862,5e3),H(1232,26901,100),H(1232,26927,101),H(1232,26958,102),H(1232,26984,103),H(1232,27010,104),H(1232,27036,105),H(1232,27062,106),H(1232,27088,107),H(1232,27114,108),H(1232,27140,109),H(1232,27166,110),H(1232,27192,111),H(1232,27218,112),H(1232,27244,113),H(1232,27270,114),H(1232,27300,115),H(1232,27355,116),H(1232,27400,117),H(1232,27427,118),H(1232,27459,119),H(1232,27493,131),H(1232,27519,120),H(1232,27556,121),H(1232,27591,122),H(1232,27637,123),H(1232,27684,124),H(1232,27725,125),H(1232,27751,1e3),H(1232,27789,126),H(1232,27830,127),H(1232,27875,128),H(1232,27915,129),H(1232,27948,2e3),H(1232,27990,2001),H(1232,28026,2002),H(1232,28077,2003),H(1232,28118,2004),H(1232,28159,2005),H(1232,28195,2006),H(1232,28233,130),H(1232,28264,3e3),H(1232,28296,3001),H(1232,28333,3002),H(1232,28372,3003),H(1232,28415,3004),H(1232,28466,4e3),j(1240,28502,4,0),H(1240,28526,0),H(1240,28553,1),H(1240,28575,2),H(1240,28596,3),H(1240,28618,4),j(1248,28639,4,0),H(1248,28651,99),H(1248,28673,0),H(1248,28696,1),H(1248,28712,2),H(1248,28728,3),H(1248,28744,10),H(1248,28772,11),H(1248,28801,12),H(1248,28835,13),H(1248,28871,14),H(1248,28905,15),H(1248,28941,10),H(1248,28971,11),j(1256,29001,4,0),H(1256,29017,99),H(1256,29043,0),H(1256,29065,1),H(1256,29085,2),j(1264,29112,4,0),H(1264,29125,0),H(1264,29140,2),H(1264,29156,1),H(1264,29172,3),H(1264,29187,4),H(1264,29202,5),H(1264,29217,6),H(1264,29236,10),O(1272,1280,1296,0,26194,71,29274,0,29274,0,29261,29276,438),O(1312,1320,1336,0,26194,72,29274,0,29274,0,29279,29276,439),O(1352,1360,1376,0,26194,73,29274,0,29274,0,29297,29276,440),AA(1392,29308,29319,4,29276,441),A=0|hu(4),ar[A>>2]=0,e=0|hu(4),ar[e>>2]=0,eA(1392,29321,1224,26341,22,0|A,1224,29326,79,0|e),e=0|hu(4),ar[e>>2]=4,A=0|hu(4),ar[A>>2]=4,eA(1392,29331,1232,26341,23,0|e,1232,29326,80,0|A),U(1392)}(0)},__GLOBAL__sub_I_heif_plugin_registry_cc:function(){ar[14321]=0,ar[14322]=0,ar[14320]=57284,ar[14324]=0,ar[14325]=0,ar[14323]=57296,function(A){A|=0;var e,r=0,i=0,f=0;f=7580,0|(A=0|ar[(e=f)+8>>2])&&rs[7&A]();A=0|ar[14321];do{if(A){for(i=57284;;){if(r=0|ar[A+16>>2],f>>>0<r>>>0){if(!(r=0|ar[A>>2])){r=7;break}}else{if(f>>>0<=r>>>0){r=11;break}if(!(r=0|ar[(i=A+4|0)>>2])){r=10;break}A=i}i=A,A=r}if(7==(0|r)){i=f=A;break}if(10==(0|r)){f=A;break}if(11==(0|r)){f=A;break}}else i=f=57284}while(0);if(0|ar[i>>2])return;A=0|hu(20),ar[A+16>>2]=e,ar[A>>2]=0,ar[A+4>>2]=0,ar[A+8>>2]=f,ar[i>>2]=A,(r=0|ar[ar[14320]>>2])&&(ar[14320]=r,A=0|ar[i>>2]);so(0|ar[14321],A),ar[14322]=1+(0|ar[14322])}(61160)},__GLOBAL__sub_I_iostream_cpp:function(){},___cxa_can_catch:function(A,e,r){var i,f;return A|=0,e|=0,r|=0,i=ur=(f=ur)+31&-32,ur=ur+16|0,ar[i>>2]=ar[r>>2],(A=0|xb[63&ar[16+(0|ar[A>>2])>>2]](A,e,i))&&(ar[r>>2]=ar[i>>2]),ur=f,1&A|0},___cxa_is_pointer_type:function(A){return 1&(A=(A|=0)?0!=(0|qu(A,3960,4048,0)):0)|0},___errno_location:Cc,___getTypeName:function(A){return 0|(e=0|ar[(A|=0)+4>>2],(i=(i=0)|yc(r=1+(0|Vc(e|=0))|0))?hb(0|i,0|e,0|r):i=0,0|i);var e,r,i},___muldi3:nb,___udivdi3:lb,___uremdi3:ub,_bitshift64Ashr:bb,_bitshift64Lshr:sb,_bitshift64Shl:db,_emscripten_get_global_libc:function(){return 58064},_emscripten_replace_memory:function(A){return!(16777215&u(A)||u(A)<=16777215||2147483648<u(A))&&(tr=new i(A),or=new f(A),ar=new n(A),cr=new t(A),lr=new o(A),new a(A),gA=new c(A),Q=new l(A),r=A,!0)},_free:Bc,_i64Add:tb,_i64Subtract:ob,_llvm_bswap_i32:kb,_malloc:yc,_memcpy:hb,_memmove:wb,_memset:vb,_pthread_cond_broadcast:mb,_pthread_mutex_lock:gb,_pthread_mutex_unlock:Zb,_roundf:pb,_sbrk:yb,dynCall_i:function(A){return 0|zb[7&(A|=0)]()},dynCall_ii:function(A,e){return e|=0,0|jb[127&(A|=0)](0|e)},dynCall_iii:function(A,e,r){return e|=0,r|=0,0|Hb[31&(A|=0)](0|e,0|r)},dynCall_iiii:function(A,e,r,i){return e|=0,r|=0,i|=0,0|xb[63&(A|=0)](0|e,0|r,0|i)},dynCall_iiiii:function(A,e,r,i,f){return e|=0,r|=0,i|=0,f|=0,0|Pb[7&(A|=0)](0|e,0|r,0|i,0|f)},dynCall_iiiiid:function(A,e,r,i,f,n){return e|=0,r|=0,i|=0,f|=0,n=+n,0|Lb[7&(A|=0)](0|e,0|r,0|i,0|f,+n)},dynCall_iiiiii:function(A,e,r,i,f,n){return e|=0,r|=0,i|=0,f|=0,n|=0,0|Kb[31&(A|=0)](0|e,0|r,0|i,0|f,0|n)},dynCall_iiiiiid:function(A,e,r,i,f,n,t){return e|=0,r|=0,i|=0,f|=0,n|=0,t=+t,0|qb[3&(A|=0)](0|e,0|r,0|i,0|f,0|n,+t)},dynCall_iiiiiii:function(A,e,r,i,f,n,t){return e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,0|$b[63&(A|=0)](0|e,0|r,0|i,0|f,0|n,0|t)},dynCall_iiiiiiii:function(A,e,r,i,f,n,t,o){return e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,0|As[7&(A|=0)](0|e,0|r,0|i,0|f,0|n,0|t,0|o)},dynCall_iiiiiiiii:function(A,e,r,i,f,n,t,o,a){return e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,0|es[15&(A|=0)](0|e,0|r,0|i,0|f,0|n,0|t,0|o,0|a)},dynCall_v:function(A){rs[7&(A|=0)]()},dynCall_vi:function(A,e){e|=0,is[511&(A|=0)](0|e)},dynCall_vii:function(A,e,r){e|=0,r|=0,fs[63&(A|=0)](0|e,0|r)},dynCall_viii:function(A,e,r,i){e|=0,r|=0,i|=0,ns[127&(A|=0)](0|e,0|r,0|i)},dynCall_viiii:function(A,e,r,i,f){e|=0,r|=0,i|=0,f|=0,ts[31&(A|=0)](0|e,0|r,0|i,0|f)},dynCall_viiiii:function(A,e,r,i,f,n){e|=0,r|=0,i|=0,f|=0,n|=0,os[63&(A|=0)](0|e,0|r,0|i,0|f,0|n)},dynCall_viiiiii:function(A,e,r,i,f,n,t){e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,as[15&(A|=0)](0|e,0|r,0|i,0|f,0|n,0|t)},dynCall_viiiiiii:function(A,e,r,i,f,n,t,o){e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,cs[31&(A|=0)](0|e,0|r,0|i,0|f,0|n,0|t,0|o)},dynCall_viiiiiiii:function(A,e,r,i,f,n,t,o,a){e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,ls[31&(A|=0)](0|e,0|r,0|i,0|f,0|n,0|t,0|o,0|a)},dynCall_viiiiiiiii:function(A,e,r,i,f,n,t,o,a,c){e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0,us[3&(A|=0)](0|e,0|r,0|i,0|f,0|n,0|t,0|o,0|a,0|c)},dynCall_viiiiiiiiii:function(A,e,r,i,f,n,t,o,a,c,l){e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0,l|=0,bs[7&(A|=0)](0|e,0|r,0|i,0|f,0|n,0|t,0|o,0|a,0|c,0|l)},dynCall_viiiiiiiiiiii:function(A,e,r,i,f,n,t,o,a,c,l,u,b){e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0,l|=0,u|=0,b|=0,ss[1&(A|=0)](0|e,0|r,0|i,0|f,0|n,0|t,0|o,0|a,0|c,0|l,0|u,0|b)},dynCall_viiiiiiiiiiiii:function(A,e,r,i,f,n,t,o,a,c,l,u,b,s){e|=0,r|=0,i|=0,f|=0,n|=0,t|=0,o|=0,a|=0,c|=0,l|=0,u|=0,b|=0,s|=0,ds[1&(A|=0)](0|e,0|r,0|i,0|f,0|n,0|t,0|o,0|a,0|c,0|l,0|u,0|b,0|s)},establishStackSpace:function(A,e){ur=A|=0,e|=0},getTempRet0:function(){return 0|D},runPostSets:function(){},setTempRet0:function(A){D=A|=0},setThrew:function(A,e){A|=0,e|=0,k||(k=A,0)},stackAlloc:function(A){var e;return ur=(ur=(e=ur)+(A|=0)|0)+15&-16,0|e},stackRestore:function(A){ur=A|=0},stackSave:function(){return 0|ur}}}(d.asmGlobalArg,d.asmLibraryArg,y),Zr=d.__GLOBAL__I_000101=gr.__GLOBAL__I_000101,pr=d.__GLOBAL__sub_I_bind_cpp=gr.__GLOBAL__sub_I_bind_cpp,yr=d.__GLOBAL__sub_I_box_cc=gr.__GLOBAL__sub_I_box_cc,Br=d.__GLOBAL__sub_I_heif_cc=gr.__GLOBAL__sub_I_heif_cc,Er=d.__GLOBAL__sub_I_heif_plugin_registry_cc=gr.__GLOBAL__sub_I_heif_plugin_registry_cc,Xr=d.__GLOBAL__sub_I_iostream_cpp=gr.__GLOBAL__sub_I_iostream_cpp,Wr=(d.___cxa_can_catch=gr.___cxa_can_catch,d.___cxa_is_pointer_type=gr.___cxa_is_pointer_type,d.___errno_location=gr.___errno_location,d.___getTypeName=gr.___getTypeName),Ir=(d.___muldi3=gr.___muldi3,d.___udivdi3=gr.___udivdi3,d.___uremdi3=gr.___uremdi3,d._bitshift64Ashr=gr._bitshift64Ashr,d._bitshift64Lshr=gr._bitshift64Lshr,d._bitshift64Shl=gr._bitshift64Shl,d._emscripten_get_global_libc=gr._emscripten_get_global_libc,d._emscripten_replace_memory=gr._emscripten_replace_memory),Cr=d._free=gr._free,Gr=(d._i64Add=gr._i64Add,d._i64Subtract=gr._i64Subtract,d._llvm_bswap_i32=gr._llvm_bswap_i32,d._malloc=gr._malloc);d._memcpy=gr._memcpy,d._memmove=gr._memmove,d._memset=gr._memset,d._pthread_cond_broadcast=gr._pthread_cond_broadcast,d._pthread_mutex_lock=gr._pthread_mutex_lock,d._pthread_mutex_unlock=gr._pthread_mutex_unlock,d._roundf=gr._roundf,d._sbrk=gr._sbrk,d.establishStackSpace=gr.establishStackSpace,d.getTempRet0=gr.getTempRet0,d.runPostSets=gr.runPostSets,d.setTempRet0=gr.setTempRet0,d.setThrew=gr.setThrew,d.stackAlloc=gr.stackAlloc,d.stackRestore=gr.stackRestore,d.stackSave=gr.stackSave,d.dynCall_i=gr.dynCall_i,d.dynCall_ii=gr.dynCall_ii,d.dynCall_iii=gr.dynCall_iii,d.dynCall_iiii=gr.dynCall_iiii,d.dynCall_iiiii=gr.dynCall_iiiii,d.dynCall_iiiiid=gr.dynCall_iiiiid,d.dynCall_iiiiii=gr.dynCall_iiiiii,d.dynCall_iiiiiid=gr.dynCall_iiiiiid,d.dynCall_iiiiiii=gr.dynCall_iiiiiii,d.dynCall_iiiiiiii=gr.dynCall_iiiiiiii,d.dynCall_iiiiiiiii=gr.dynCall_iiiiiiiii,d.dynCall_v=gr.dynCall_v,d.dynCall_vi=gr.dynCall_vi,d.dynCall_vii=gr.dynCall_vii,d.dynCall_viii=gr.dynCall_viii,d.dynCall_viiii=gr.dynCall_viiii,d.dynCall_viiiii=gr.dynCall_viiiii,d.dynCall_viiiiii=gr.dynCall_viiiiii,d.dynCall_viiiiiii=gr.dynCall_viiiiiii,d.dynCall_viiiiiiii=gr.dynCall_viiiiiiii,d.dynCall_viiiiiiiii=gr.dynCall_viiiiiiiii,d.dynCall_viiiiiiiiii=gr.dynCall_viiiiiiiiii,d.dynCall_viiiiiiiiiiii=gr.dynCall_viiiiiiiiiiii,d.dynCall_viiiiiiiiiiiii=gr.dynCall_viiiiiiiiiiiii;if(k.stackAlloc=d.stackAlloc,k.stackSave=d.stackSave,k.stackRestore=d.stackRestore,k.establishStackSpace=d.establishStackSpace,k.setTempRet0=d.setTempRet0,k.getTempRet0=d.getTempRet0,d.asm=gr,bA)if(\\\"function\\\"==typeof d.locateFile?bA=d.locateFile(bA):d.memoryInitializerPrefixURL&&(bA=d.memoryInitializerPrefixURL+bA),o||r){var Vr=d.readBinary(bA);E.set(Vr,k.GLOBAL_BASE)}else{lA();var Fr=function(A){A.byteLength&&(A=new Uint8Array(A)),E.set(A,k.GLOBAL_BASE),d.memoryInitializerRequest&&delete d.memoryInitializerRequest.response,uA()};function Rr(){d.readAsync(bA,Fr,function(){throw\\\"could not load memory initializer \\\"+bA})}var Nr=vr(bA);if(Nr)Fr(Nr.buffer);else if(d.memoryInitializerRequest){function _r(){var A=d.memoryInitializerRequest,e=A.response;if(200!==A.status&&0!==A.status){var r=vr(d.memoryInitializerRequestURL);if(!r)return console.warn(\\\"a problem seems to have happened with Module.memoryInitializerRequest, status: \\\"+A.status+\\\", retrying \\\"+bA),void Rr();e=r.buffer}Fr(e)}d.memoryInitializerRequest.response?setTimeout(_r,0):d.memoryInitializerRequest.addEventListener(\\\"load\\\",_r)}else Rr()}function Yr(A){this.name=\\\"ExitStatus\\\",this.message=\\\"Program terminated with exit(\\\"+A+\\\")\\\",this.status=A}(Yr.prototype=new Error).constructor=Yr;var Qr=null;function Dr(A){function e(){d.calledRun||(d.calledRun=!0,n||(AA||(AA=!0,x(L)),x(K),d.onRuntimeInitialized&&d.onRuntimeInitialized(),function(){if(d.postRun)for(\\\"function\\\"==typeof d.postRun&&(d.postRun=[d.postRun]);d.postRun.length;)A=d.postRun.shift(),$.unshift(A);var A;x($)}()))}A=A||d.arguments,null===Qr&&(Qr=Date.now()),0<oA||(function(){if(d.preRun)for(\\\"function\\\"==typeof d.preRun&&(d.preRun=[d.preRun]);d.preRun.length;)A=d.preRun.shift(),P.unshift(A);var A;x(P)}(),0<oA||d.calledRun||(d.setStatus?(d.setStatus(\\\"Running...\\\"),setTimeout(function(){setTimeout(function(){d.setStatus(\\\"\\\")},1),e()},1)):e()))}cA=function A(){d.calledRun||Dr(),d.calledRun||(cA=A)},d.run=Dr,d.exit=function(A,e){e&&d.noExitRuntime&&0===A||(d.noExitRuntime||(n=!0,_=mr,x(q),d.onExit&&d.onExit(A)),o&&process.exit(A),d.quit(A,new Yr(A)))};var Jr=[];function Mr(e){d.onAbort&&d.onAbort(e),e=void 0!==e?(d.print(e),d.printErr(e),JSON.stringify(e)):\\\"\\\",n=!0,0;var r=\\\"abort(\\\"+e+\\\") at \\\"+p()+\\\"\\\\\\\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.\\\";throw Jr&&Jr.forEach(function(A){r=A(r,e)}),r}if(d.abort=Mr,d.preInit)for(\\\"function\\\"==typeof d.preInit&&(d.preInit=[d.preInit]);0<d.preInit.length;)d.preInit.pop()();d.noExitRuntime=!0,Dr();function Tr(A){this.handle=A,this.img=null}Tr.prototype.free=function(){this.handle&&(zr.heif_image_handle_release(this.handle),this.handle=null)},Tr.prototype._ensureImage=function(){if(!this.img){var A=zr.heif_js_decode_image(this.handle,zr.heif_colorspace_YCbCr,zr.heif_chroma_420);A&&!A.code?(this.data=new Uint8Array(function(A){for(var e=new ArrayBuffer(A.length),r=new Uint8Array(e),i=0,f=A.length;i<f;i++)r[i]=A.charCodeAt(i);return e}(A.data)),delete A.data,this.img=A):console.log(\\\"Decoding image failed\\\",this.handle,A)}},Tr.prototype.get_width=function(){return this._ensureImage(),this.img.width},Tr.prototype.get_height=function(){return this._ensureImage(),this.img.height},Tr.prototype.is_primary=function(){return this._ensureImage(),!!this.img.is_primary},Tr.prototype.display=function(m,g){var Z=this.get_width(),p=this.get_height();setTimeout(function(){if(this._ensureImage(),this.img){for(var A,e,r,i,f=0,n=0,t=0,o=0,a=0,c=0,l=Z*p,u=Z,b=Math.ceil(Z/2),s=Math.ceil(Z/2),d=Math.ceil(p/2),k=this.data,h=this.data.subarray(u*p,u*p+b*d),w=this.data.subarray(u*p+b*d,u*p+b*d+s*d),v=m.data;c<l;)i=f>>1,A=1.164*(k[t+f]-16),e=h[o+i]-128,r=w[a+i]-128,v[c<<2]=A+1.596*r,v[1+(c<<2)]=A-.813*r-.391*e,v[2+(c<<2)]=A+2.018*e,v[3+(c<<2)]=255,c++,++f<Z&&(A=1.164*(k[t+f]-16),v[c<<2]=A+1.596*r,v[1+(c<<2)]=A-.813*r-.391*e,v[2+(c<<2)]=A+2.018*e,v[3+(c<<2)]=255,c++,f++),f===Z&&(f=0,t+=u,o=(++n>>1)*b,a=(n>>1)*s);g(m)}else g(null)}.bind(this),0)};function Ur(){this.decoder=null}Ur.prototype.decode=function(A){if(this.decoder&&zr.heif_context_free(this.decoder),this.decoder=zr.heif_context_alloc(),!this.decoder)return console.log(\\\"Could not create HEIF context\\\"),[];var e=zr.heif_context_read_from_memory(this.decoder,A);if(e.code!==zr.heif_error_Ok)return console.log(\\\"Could not parse HEIF file\\\",e),[];var r=zr.heif_js_context_get_list_of_top_level_image_IDs(this.decoder);if(!r||r.code)return console.log(\\\"Error loading image ids\\\",r),[];if(!r.length)return console.log(\\\"No images found\\\"),[];for(var i=[],f=0;f<r.length;f++){var n=zr.heif_js_context_get_image_handle(this.decoder,r[f]);n&&!n.code?i.push(new Tr(n)):console.log(\\\"Could not get image data for id\\\",r[f],n)}return i};var Sr,Or,zr={HeifDecoder:Ur,fourcc:function(A){return A.charCodeAt(0)<<24|A.charCodeAt(1)<<16|A.charCodeAt(2)<<8|A.charCodeAt(3)}},jr={heif_error_code:!0,heif_suberror_code:!0,heif_compression_format:!0,heif_chroma:!0,heif_colorspace:!0,heif_channel:!0};for(Or in jr)if(jr.hasOwnProperty(Or))for(Sr in d[Or])d[Or].hasOwnProperty(Sr)&&\\\"values\\\"!==Sr&&(zr[Sr]=d[Or][Sr]);for(Sr in d)jr.hasOwnProperty(Sr)||0!==Sr.indexOf(\\\"heif_\\\")||(zr[Sr]=d[Sr]);function QA(A,e){return A=YA(A=A||\\\"function_\\\"+new Date),new Function(\\\"body\\\",\\\"return function \\\"+A+\\\\'() {\\\\\\\\n    \\\"use strict\\\";    return body.apply(this, arguments);\\\\\\\\n};\\\\\\\\n\\\\')(e)}delete this.Module;\\\"undefined\\\"!=typeof exports?(\\\"undefined\\\"!=typeof module&&module.exports&&(exports=module.exports=zr),exports.libheif=zr):this.libheif=zr,\\\"function\\\"==typeof define&&define.amd&&define([],function(){return zr})}).call(this);\\\\n;\\\\nfunction processSingleImage(image) {\\\\n    return new Promise((resolve, reject) => {\\\\n        const w = image.get_width();\\\\n        const h = image.get_height();\\\\n        const whiteImage = new ImageData(w, h);\\\\n        for (let i = 0; i < w * h; i++) {\\\\n            whiteImage.data[i * 4 + 3] = 255;\\\\n        }\\\\n        image.display(whiteImage, (imageData) => {\\\\n            if (!imageData) {\\\\n                return reject(\\\"ERR_LIBHEIF Error while processing single image and generating image data, could not ensure image\\\");\\\\n            }\\\\n            resolve(imageData);\\\\n        });\\\\n    });\\\\n}\\\\nonmessage = (message) => {\\\\n    const id = message.data.id;\\\\n    try {\\\\n        const decoder = new libheif.HeifDecoder();\\\\n        let imagesArr = decoder.decode(message.data.buffer);\\\\n        if (!imagesArr || !imagesArr.length) {\\\\n            throw \\\"ERR_LIBHEIF format not supported\\\";\\\\n        }\\\\n        imagesArr = imagesArr.filter((x) => {\\\\n            let valid = true;\\\\n            try {\\\\n                /*\\\\n                sometimes the heic container is valid\\\\n                yet the images themselves are corrupt\\\\n                */\\\\n                x.get_height();\\\\n            }\\\\n            catch (e) {\\\\n                valid = false;\\\\n            }\\\\n            return valid;\\\\n        });\\\\n        if (!imagesArr.length) {\\\\n            throw \\\"ERR_LIBHEIF Heic doesn\\\\'t contain valid images\\\";\\\\n        }\\\\n        Promise.all(imagesArr.map((image) => processSingleImage(image)))\\\\n            .then((imageDataArr) => {\\\\n            postMessage({ id, imageDataArr, error: \\\"\\\" });\\\\n        })\\\\n            .catch((e) => {\\\\n            postMessage({\\\\n                id,\\\\n                imageDataArr: [],\\\\n                error: e && e.toString ? e.toString() : e,\\\\n            });\\\\n        });\\\\n    }\\\\n    catch (e) {\\\\n        postMessage({\\\\n            id,\\\\n            imageDataArr: [],\\\\n            error: e && e.toString ? e.toString() : e,\\\\n        });\\\\n    }\\\\n};\\\\n\\\\n'],{type:\\\"application/javascript\\\"});window.__heic2any__worker=new Worker(URL.createObjectURL(r));var a=[\\\"image/png\\\",\\\"image/jpeg\\\",\\\"image/gif\\\"],b=function(e){return new Promise(function(a,r){var A=new FileReader;A.onerror=function(){r(\\\"ERR_DOM Error on converting blob to data URL\\\")},A.onload=function(r){a(A.result)},A.readAsDataURL(e)})},s=function(r){try{for(var a=atob(r.split(\\\",\\\")[1]),A=r.split(\\\",\\\")[0].split(\\\":\\\")[1].split(\\\";\\\")[0],e=new ArrayBuffer(a.length),i=new Uint8Array(e),t=0;t<a.length;t++)i[t]=a.charCodeAt(t);return new Blob([e],{type:A})}catch(r){return r.toString?r.toString():r}},d=function(r){var i=r.imageData,t=r.toType;void 0===t&&(t=\\\"image/png\\\");var f=r.quality;return void 0===f&&(f=.92),(1<f||f<0)&&(f=.92),-1===a.indexOf(t)&&(t=\\\"image/png\\\"),new Promise(function(a,A){var r=null;try{r=document.createElement(\\\"canvas\\\")}catch(r){}if(!r)return A(\\\"ERR_CANVAS Error on converting imagedata to blob: Could not create canvas element\\\");r.width=i.width,r.height=i.height;var e=r.getContext(\\\"2d\\\");if(!e)return A(\\\"ERR_CANVAS Error on converting imagedata to blob: Could not get canvas context\\\");e.putImageData(i,0,0),r.toBlob(function(r){return r?a(r):A(\\\"ERR_CANVAS Error on converting imagedata to blob: Could not get blob from canvas\\\")},t,f)})},k=function(r){var e=r.images,i=r.interval,t=r.gifHeight,f=r.gifWidth;return new Promise(function(a,A){gifshot.createGIF({images:e,interval:i,gifHeight:t,gifWidth:f},function(r){return r.error&&A(\\\"ERR_GIF \\\"+r.errorCode+\\\" \\\"+r.errorMessage),a(r.image)})})},h=function(r){for(var a=new Uint8Array(r).subarray(0,4),A=\\\"\\\",e=0;e<a.length;e++)A+=a[e].toString(16);switch(A){case\\\"89504e47\\\":return\\\"image/png\\\";case\\\"47494638\\\":return\\\"image/gif\\\";case\\\"ffd8ffe0\\\":case\\\"ffd8ffe1\\\":case\\\"ffd8ffe2\\\":case\\\"ffd8ffe3\\\":case\\\"ffd8ffe8\\\":return\\\"image/jpeg\\\";default:return!1}},v=function(r){var a=0;r?\\\"string\\\"!=typeof r&&(r=r.toString?r.toString():JSON.stringify(r)):r=\\\"ERR_UNKNOWN\\\";for(var A=[\\\"ERR_USER\\\",\\\"ERR_LIBHEIF\\\",\\\"ERR_GIF\\\",\\\"ERR_DOM\\\",\\\"ERR_CANVAS\\\"],e=0;e<A.length;e++){var i=A[e];0===r.indexOf(i)&&(a=e+1)}return{code:a,message:r}};return function(r){var a=r.blob,o=r.toType;void 0===o&&(o=\\\"image/png\\\");var u=r.quality;void 0===u&&(u=.92);var l=r.gifInterval;void 0===l&&(l=.4);var c=r.multiple;return void 0===c&&(c=void 0),new Promise(function(f,n){a instanceof Blob||v(\\\"ERR_USER library only accepts BLOBs as input\\\"),\\\"boolean\\\"!=typeof c&&v('ERR_USER \\\"multiple\\\" parameter should be of type \\\"boolean\\\"'),\\\"number\\\"!=typeof u&&v('ERR_USER \\\"quality\\\" parameter should be of type \\\"number\\\"'),\\\"number\\\"!=typeof l&&v('ERR_USER \\\"gifInterval\\\" parameter should be of type \\\"number\\\"');var r=new FileReader;r.onload=function(r){var i,a=0,A=0,e=r.target.result,t=h(e);if(t)return n(v(\\\"ERR_USER Image is already browser readable: \\\"+t));i=e,new Promise(function(a,A){var e=(Math.random()*(new Date).getTime()).toString(),r={id:e,buffer:i};window.__heic2any__worker.postMessage(r),window.__heic2any__worker.addEventListener(\\\"message\\\",function(r){if(r.data.id===e)return r.data.error?A(r.data.error):a(r.data.imageDataArr)})}).then(function(r){return a=r[0].width,A=r[0].height,Promise.all(r.map(function(r){return d({imageData:r,toType:o,quality:u})}))}).then(function(r){return\\\"image/gif\\\"===o?Promise.all(r.map(function(r){return b(r)})):(f(c?r:r[0]),[\\\"\\\"])}).then(function(r){return\\\"image/gif\\\"===o&&r?k({images:r,interval:l,gifWidth:a,gifHeight:A}):\\\"\\\"}).then(function(r){if(\\\"image/gif\\\"===o&&r){var a=s(r);\\\"string\\\"==typeof a?n(v(a)):f(a)}}).catch(function(r){n(v(r))})},r.readAsArrayBuffer(a)})}});\";var FQ_PX='data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';var FQ_H=String.fromCharCode(35,35);var FQ_SH=String.fromCharCode(35);var FQ_SL=String.fromCharCode(47);var FQ_Q=String.fromCharCode(39);var FQ_DQ=String.fromCharCode(34);var FQ_SP=String.fromCharCode(32);var FQ_MUA='Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Mobile Safari/537.36';var FQ_FUA='com.ss.android.article.news/13400 (Linux; U; Android 10; zh_CN; tb8788p1_64_bsp; Build/QQ3A.200805.001)';var FQ_FIXED='TdTC5rgxYgkOUrPHpnM7pByyRiuCmrWKGWs521cXdST0m69/COjWjSanLjfBqVovHwWlGJKu8pSXMrYqOKrdWA==';var FQ_HOST='https://api5-normal-sinfonlineb.fqnovel.com';var FQ_WEB='https://fanqienovel.com';var FQ_MSG_DETAIL=String.fromCharCode(35814,24773,33719,21462,22833,36133,65292,35831,37325,35797);var FQ_MSG_TOC=String.fromCharCode(30446,24405,33719,21462,22833,36133,65292,35831,37325,35797);var FQ_MSG_CT=String.fromCharCode(27491,25991,33719,21462,22833,36133,65292,35831,37325,35797);var FQ_MSG_LOCK=String.fromCharCode(128274);var FQ_MSG_EMPTY=String.fromCharCode(26412,31456,26242,26080,20869,23481,65292,35831,25442,28304);var FQ_IMG=String.fromCharCode(123,123,105,109,97,103,101,95,100,111,109,97,105,110,125,125);var FQ_MSG_PAY=String.fromCharCode(26412,31456,20026,20184,36153,31456,33410,65292,32593,39029,29256,26080,27861,20813,36153,38405,35835);function FQ_j2s(b){try{return String(new Packages.java.lang.String(b,Packages.java.nio.charset.Charset.forName('ISO-8859-1')));}catch(e){var s='';for(var i=0;i<b.length;i++){var v=b[i];if(v<0)v+=256;s+=String.fromCharCode(v);}return s;}}function FQ_s2j(s){return new Packages.java.lang.String(s).getBytes(Packages.java.nio.charset.Charset.forName('ISO-8859-1'));}function FQ_hex(b){var str=FQ_j2s(b);var s='';for(var i=0;i<str.length;i++){var v=str.charCodeAt(i)&255;s+=(v<16?'0':'')+v.toString(16);}return s;}function FQ_unhex(h){var r='';for(var i=0;i<h.length;i+=2)r+=String.fromCharCode(parseInt(h.substr(i,2),16));return r;}function FQ_sm3(s){var rotl=function(x,n){n=n&31;return ((x<<n)|(x>>>(32-n)))>>>0;};var len=s.length,bitLen=len*8,arr=[];for(var i=0;i<len;i++)arr.push(s.charCodeAt(i)&255);arr.push(0x80);while(arr.length%64!==56)arr.push(0);var hi=Math.floor(bitLen/4294967296),lo=bitLen>>>0;arr.push((hi>>>24)&255,(hi>>>16)&255,(hi>>>8)&255,hi&255);arr.push((lo>>>24)&255,(lo>>>16)&255,(lo>>>8)&255,lo&255);var V=[0x7380166f,0x4914b2b9,0x172442d7,0xda8a0600,0xa96f30bc,0x163138aa,0xe38dee4d,0xb0fb0e4e];for(var b=0;b<arr.length;b+=64){var W=[];for(var i=0;i<16;i++)W.push(((arr[b+i*4]<<24)|(arr[b+i*4+1]<<16)|(arr[b+i*4+2]<<8)|arr[b+i*4+3])>>>0);for(var j=16;j<68;j++){var x=(W[j-16]^W[j-9]^rotl(W[j-3],15))>>>0;x=(x^rotl(x,15)^rotl(x,23))>>>0;W.push((x^rotl(W[j-13],7)^W[j-6])>>>0);}var W1=[];for(var j=0;j<64;j++)W1.push((W[j]^W[j+4])>>>0);var A=V[0],B=V[1],C=V[2],D=V[3],E=V[4],F=V[5],G=V[6],H=V[7];for(var j=0;j<64;j++){var Tj=(j<16)?0x79cc4519:0x7a879d8a;var SS1=rotl((rotl(A,12)+E+rotl(Tj,j&31))>>>0,7);var SS2=(SS1^rotl(A,12))>>>0;var FFj=(j<16)?((A^B^C)>>>0):(((A&B)|(A&C)|(B&C))>>>0);var GGj=(j<16)?((E^F^G)>>>0):(((E&F)|((~E)&G))>>>0);var TT1=(FFj+D+SS2+W1[j])>>>0;var TT2=(GGj+H+SS1+W[j])>>>0;D=C;C=rotl(B,9);B=A;A=TT1;H=G;G=rotl(F,19);F=E;E=(TT2^rotl(TT2,9)^rotl(TT2,17))>>>0;}V[0]=(V[0]^A)>>>0;V[1]=(V[1]^B)>>>0;V[2]=(V[2]^C)>>>0;V[3]=(V[3]^D)>>>0;V[4]=(V[4]^E)>>>0;V[5]=(V[5]^F)>>>0;V[6]=(V[6]^G)>>>0;V[7]=(V[7]^H)>>>0;}var out='';for(var i=0;i<8;i++)out+=('0000000'+V[i].toString(16)).slice(-8);return out;}function FQ_md5(s){var d=Packages.java.security.MessageDigest.getInstance('MD5');var b=FQ_s2j(s);d.update(b);return FQ_hex(d.digest());}function FQ_b64(s){return String(Packages.java.util.Base64.getEncoder().encodeToString(FQ_s2j(s)));}function FQ_b64d(s){return FQ_j2s(Packages.java.util.Base64.getDecoder().decode(String(s)));}function FQ_aesCbc(data,key,iv){var C=Packages.javax.crypto.Cipher;var c=C.getInstance('AES/CBC/NoPadding');c.init(C.ENCRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(FQ_s2j(key),'AES'),new Packages.javax.crypto.spec.IvParameterSpec(FQ_s2j(iv)));return FQ_j2s(c.doFinal(FQ_s2j(data)));}function FQ_pad(s){var p=16-(s.length%16);if(p===0)p=16;var o=s;for(var i=0;i<p;i++)o+=String.fromCharCode(p);return o;}function FQ_w(lo,hi){return {lo:lo>>>0,hi:hi>>>0};}function FQ_xor(){var lo=0,hi=0;for(var i=0;i<arguments.length;i++){lo^=arguments[i].lo;hi^=arguments[i].hi;}return FQ_w(lo,hi);}function FQ_n64(v){return FQ_w(~v.lo,~v.hi);}function FQ_add(a,b){var lo=(a.lo+b.lo)>>>0;return FQ_w(lo,(a.hi+b.hi+(lo<a.lo?1:0))>>>0);}function FQ_rol(v,c){var s=((c%64)+64)%64;if(s===0)return FQ_w(v.lo,v.hi);if(s<32)return FQ_w((v.lo<<s)|(v.hi>>>(32-s)),(v.hi<<s)|(v.lo>>>(32-s)));if(s===32)return FQ_w(v.hi,v.lo);var r=s-32;return FQ_w((v.hi<<r)|(v.lo>>>(32-r)),(v.lo<<r)|(v.hi>>>(32-r)));}function FQ_ror(v,c){return FQ_rol(v,64-(c%64));}function FQ_r64(s,o){o=o||0;return FQ_w((s.charCodeAt(o)|(s.charCodeAt(o+1)<<8)|(s.charCodeAt(o+2)<<16)|(s.charCodeAt(o+3)<<24))>>>0,(s.charCodeAt(o+4)|(s.charCodeAt(o+5)<<8)|(s.charCodeAt(o+6)<<16)|(s.charCodeAt(o+7)<<24))>>>0);}function FQ_w64le2(l,r){var o='';for(var i=0;i<4;i++)o+=String.fromCharCode((l.lo>>>(i*8))&255);for(var i2=0;i2<4;i2++)o+=String.fromCharCode((l.hi>>>(i2*8))&255);for(var i3=0;i3<4;i3++)o+=String.fromCharCode((r.lo>>>(i3*8))&255);for(var i4=0;i4<4;i4++)o+=String.fromCharCode((r.hi>>>(i4*8))&255);return o;}var FQ_SZ=FQ_w(0x046d678b,0x3dc94c3a);function FQ_zbit(i){return FQ_w(i<32?((FQ_SZ.lo>>>i)&1):((FQ_SZ.hi>>>(i-32))&1),0);}var FQ_SK='fc78e0a9657a0c748ce51559903ccf03510e51d3cff232d71343e88a321c5304';var FQ_AK='d31e3718288a1027baab59f146a09a9c';var FQ_AIV='ea180a0336ed352fcd24e4d50018ae54';function FQ_srk(key){var w=[];for(var i=0;i<4;i++)w.push(FQ_r64(key,i*8));for(var x=4;x<72;x++){var m=FQ_xor(FQ_ror(w[x-1],3),w[x-3]);m=FQ_xor(m,FQ_ror(m,1));w.push(FQ_xor(FQ_n64(w[x-4]),m,FQ_zbit((x-4)%62),FQ_w(3,0)));}return w;}function FQ_sEnc(blk,keys){var l=FQ_r64(blk,0),r=FQ_r64(blk,8);for(var i=0;i<keys.length;i++){var o=r;var nl=FQ_w(FQ_rol(r,1).lo&FQ_rol(r,8).lo,FQ_rol(r,1).hi&FQ_rol(r,8).hi);r=FQ_xor(l,nl,FQ_rol(r,2),keys[i]);l=o;}return FQ_w64le2(l,r);}function FQ_ev(v){var o='';while(v>=0x80){o+=String.fromCharCode((v%0x80)|0x80);v=Math.floor(v/0x80);}o+=String.fromCharCode(v);return o;}function FQ_pbv(f,v){return FQ_ev(f*8)+FQ_ev(v);}function FQ_pbb(f,v){var e=(typeof v==='number')?String.fromCharCode(v):String(v);return FQ_ev(f*8+2)+FQ_ev(e.length)+e;}function FQ_argusBean(q,stub,ts,dev,iid,aid,rv){var bi=(/^[0-9a-f]{32}$/i.test(stub))?FQ_unhex(stub):FQ_unhex('00000000000000000000000000000000');var bh=FQ_unhex(FQ_sm3(bi).substr(0,12));var qh=(q==='')?FQ_unhex(FQ_sm3(FQ_unhex('00000000000000000000000000000000')).substr(0,12)):FQ_unhex(FQ_sm3(q).substr(0,12));var nest=FQ_pbv(1,1)+FQ_pbv(2,1)+FQ_pbv(3,1)+FQ_pbv(7,0xC792ECCC);var s23=FQ_pbb(1,'NX551J')+FQ_pbv(2,8196)+FQ_pbv(4,0x80E0D800);return FQ_pbv(1,1077940818)+FQ_pbv(2,2)+FQ_pbv(3,rv)+FQ_pbb(4,String(aid))+FQ_pbb(5,dev)+FQ_pbb(6,'1611921764')+FQ_pbb(7,FQ_qp(q,'version_name'))+FQ_pbb(8,'v04.04.05-ov-android')+FQ_pbv(9,134744640)+FQ_pbb(10,FQ_unhex('0000000000000000'))+FQ_pbv(11,0)+FQ_pbv(12,ts*2)+FQ_pbb(13,bh)+FQ_pbb(14,qh)+FQ_pbb(15,nest)+FQ_pbb(16,iid)+FQ_pbb(20,'none')+FQ_pbv(21,738)+FQ_pbb(23,s23)+FQ_pbv(25,2);}function FQ_argus(q,stub,ts,dev,iid,aid,rv){var pb=FQ_pad(FQ_argusBean(q,stub,ts,dev,iid,aid,rv));var keys=FQ_srk(FQ_unhex(FQ_SK));var enc='';for(var o=0;o<pb.length;o+=16)enc+=FQ_sEnc(pb.substr(o,16),keys);var magic=FQ_unhex('f2f7fcfff2f7fcff');var un=magic+enc+FQ_unhex('eafb2cfe8568519154');var buf=un.substr(0,8);for(var i=8;i<un.length;i++)buf+=String.fromCharCode((un.charCodeAt(i)^magic.charCodeAt(i%8))&255);var rev='';for(var j=buf.length-1;j>=0;j--)rev+=buf.charAt(j);var fin=FQ_pad(rev+'ao');var ct=FQ_aesCbc(fin,FQ_unhex(FQ_AK),FQ_unhex(FQ_AIV));return FQ_b64(FQ_unhex('f281')+ct);}function FQ_lrk(rp,aid){var dg=FQ_md5(rp+String(aid));var w=[];for(var i=0;i<34;i++)w.push(FQ_w(0,0));w[0]=FQ_r64(dg,0);w[1]=FQ_r64(dg,8);w[2]=FQ_r64(dg,16);w[3]=FQ_r64(dg,24);var b0=w[0],b8=w[1],q=[w[2],w[3]];for(var x=0;x<0x22;x++){var x9=b0;var x8=b8;x8=FQ_ror(x8,8);x8=FQ_add(x8,x9);x8=FQ_xor(x8,FQ_w(x,0));q.push(x8);x8=FQ_xor(x8,FQ_rol(x9,3));w[x+1]=x8;b0=x8;b8=q.shift();}return w;}function FQ_lEnc(blk,keys){var l=FQ_r64(blk,0),r=FQ_r64(blk,8);for(var i=0;i<34;i++){r=FQ_xor(keys[i],FQ_add(l,FQ_ror(r,8)));l=FQ_xor(r,FQ_ror(l,61));}return FQ_w64le2(l,r);}function FQ_ladon(ts,lic,aid,rp){var data=String(ts)+'-'+lic+'-'+aid;var pad2=16-(data.length%16);var pd=data;for(var i=0;i<pad2;i++)pd+=String.fromCharCode(pad2);var ks=FQ_lrk(rp,aid);var ct='';for(var o=0;o<pd.length;o+=16)ct+=FQ_lEnc(pd.substr(o,16),ks);return FQ_b64(rp+ct);}function FQ_sign(q,stub,ts,dev,iid,aid,rv){var h={'x-ss-req-ticket':String(ts*1000),'x-khronos':String(ts),'x-argus':FQ_argus(q,stub,ts,dev,iid,aid,rv),'x-ladon':FQ_ladon(ts,1611921764,aid,String.fromCharCode(1,2,3,4))};if(stub)h['x-ss-stub']=stub;return h;}function FQ_qp(q,k){var ps=String(q||'').split('&');for(var i=0;i<ps.length;i++){var e=ps[i].indexOf('=');if(e>0&&ps[i].substring(0,e)===k)return ps[i].substring(e+1);}return '';}function FQ_qs(url){var t=String(url||'');var i=t.indexOf('?');if(i<0)return '';var j=t.indexOf('#',i);return t.slice(i+1,j<0?t.length:j);}function FQ_qp(url,n){var e=String(n);var ps=String(url).replace(/^[^?]*\\?/,'').split('#')[0].split('&');for(var i=0;i<ps.length;i++){if(!ps[i])continue;var s=ps[i].indexOf('=');var k=s<0?ps[i]:ps[i].substr(0,s);if(k===e)return s<0?'':ps[i].substr(s+1);}return '';}function FQ_now(){return Math.floor(new Date().getTime()/1000);}function FQ_ua(){return 'com.dragon.read/66732 (Linux; U; Android 10; zh_CN; Pixel 4 XL; Build/QD1A.190821.007;tt-ok/3.12.13.4-tiktok)';}function FQ_hpost(url,bodyStr,headers){var arr=FQ_s2j(bodyStr);var c=new Packages.java.net.URL(url).openConnection();c.setRequestMethod('POST');c.setDoOutput(true);for(var k in headers)c.setRequestProperty(k,headers[k]);c.setConnectTimeout(20000);c.setReadTimeout(25000);var out=c.getOutputStream();out.write(arr,0,arr.length);out.flush();out.close();var code=c.getResponseCode();var is=(code>=400)?c.getErrorStream():c.getInputStream();var sb='';if(is){var enc=String(c.getHeaderField('Content-Encoding')||'');var stream=is;if(enc.indexOf('gzip')>=0)stream=new Packages.java.util.zip.GZIPInputStream(is);var rd=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(stream,'UTF-8'));var line;while((line=rd.readLine())!=null)sb+=String(line);rd.close();}return {code:code,body:sb};}function FQ_gz(s){var bos=new Packages.java.io.ByteArrayOutputStream();var g=new Packages.java.util.zip.GZIPOutputStream(bos);var b=new Packages.java.lang.String(s).getBytes(Packages.java.nio.charset.Charset.forName('UTF-8'));g.write(b,0,b.length);g.close();var arr=bos.toByteArray();var out='';for(var i=0;i<arr.length;i++){var v=arr[i]&255;if(i===8)v=2;if(i===9)v=3;out+=String.fromCharCode(v);}return out;}function FQ_ttEnc(data){var rnd='';for(var i=0;i<32;i++)rnd+=String.fromCharCode(Math.floor(Math.random()*256));var md=Packages.java.security.MessageDigest.getInstance('SHA-512');md.update(FQ_s2j(rnd));var inner=md.digest();var md2=Packages.java.security.MessageDigest.getInstance('SHA-512');md2.update(inner);md2.update(FQ_s2j(FQ_b64d(FQ_FIXED)));var hv=md2.digest();var keyB=Packages.java.util.Arrays.copyOfRange(hv,0,16);var ivB=Packages.java.util.Arrays.copyOfRange(hv,16,32);var md3=Packages.java.security.MessageDigest.getInstance('SHA-512');md3.update(FQ_s2j(data));var dh=md3.digest();var C=Packages.javax.crypto.Cipher;var c=C.getInstance('AES/CBC/NoPadding');c.init(C.ENCRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(keyB,'AES'),new Packages.javax.crypto.spec.IvParameterSpec(ivB));return String.fromCharCode(0x74,0x63,0x05,0x10,0,0)+rnd+FQ_j2s(c.doFinal(FQ_s2j(FQ_pad(FQ_j2s(dh)+data))));}function FQ_alnum(n){var ch='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';var s='';for(var i=0;i<n;i++)s+=ch.charAt(Math.floor(Math.random()*ch.length));return s;}function FQ_uuid(){return String(Packages.java.util.UUID.randomUUID());}function FQ_getPool(sv){var p=String(sv.get('fqPool')||'');if(!p){return [];}var out=[];var arr=p.split('|');for(var i=0;i<arr.length;i++){var kv=arr[i].split(',');if(kv.length>=2&&kv[0])out.push({d:kv[0],i:kv[1],o:kv[2]||'',c:kv[3]||''});}return out;}function FQ_savePool(sv,pool){var a=[];for(var i=0;i<pool.length;i++)a.push(pool[i].d+','+pool[i].i+','+(pool[i].o||'')+','+(pool[i].c||''));sv.put('fqPool',a.join('|'));}function FQ_registerOne(){var openudid=FQ_alnum(16),cdid=FQ_uuid(),clientudid=FQ_uuid();var ua='com.dragon.read/65132 (Linux; U; Android 10; zh_CN; MI 12; Build/MMB29M; Cronet/TTNetVersion:9ac8d95c 2024-11-25 QuicVersion:3f326df4 2024-11-14)';var header={display_name:'番茄小说',update_version_code:'65132',manifest_version_code:'65132',aid:1967,channel:'xiaomi_1967_64',package:'com.dragon.read',app_version:'6.5.1.32',version_code:'65132',sdk_version:'v04.04.05-ov-android',sdk_target_version:29,os:'Android',os_version:'10',os_api:'29',device_model:'MI 12',device_brand:'Xiaomi',device_manufacturer:'Google',device_category:'phone',cpu_abi:'arm64-v8a',release_build:FQ_uuid(),density_dpi:'560',display_density:'mdpi',resolution:'1440x2392',language:'zh',mac:'11:22:33:44:55:66',timezone:8,access:'wifi',not_request_sender:0,carrier:'CHINA MOBILE',mcc_mnc:'46007',rom:'EMUI-'+FQ_alnum(13),rom_version:FQ_alnum(2),sig_hash:FQ_md5(FQ_uuid()),openudid:openudid,clientudid:clientudid,sim_serial_number:[],region:'CN',tz_name:'Asia/Shanghai',tz_offset:28800,sim_region:'cn'};var js=JSON.stringify({magic_tag:'ss_app_log',header:header,_gen_time:new Date().getTime()});var post=FQ_ttEnc(FQ_gz(js));var ts=FQ_now();var P=[['tt_data','a'],['os_api','29'],['device_type','MI 12'],['ssmix','a'],['manifest_version_code','65132'],['dpi','560'],['version_name','6.5.1.32'],['ts',String(ts)],['cpu_support64','true'],['app_type','normal'],['appTheme','light'],['ac','wifi'],['host_abi','arm64-v8a'],['update_version_code','65132'],['channel','xiaomi_1967_64'],['_rticket',String(new Date().getTime())],['device_platform','android'],['version_code','65132'],['cdid',cdid],['os','android'],['is_android_pad','0'],['openudid',openudid],['package','com.dragon.read'],['resolution','1440*2392'],['os_version','10'],['language','zh'],['device_brand','Xiaomi'],['need_personal_recommend','1'],['aid','1967'],['minor_status','0'],['app_name','novel'],['mcc_mnc','46007']];P.sort(function(a,b){return a[0]<b[0]?-1:(a[0]>b[0]?1:0);});var qs='';for(var i=0;i<P.length;i++){if(i)qs+='&';qs+=P[i][0]+'='+encodeURIComponent(P[i][1]);}var r=FQ_hpost('https://log.snssdk.com/service/2/device_register/?'+qs,post,{'Content-Type':'application/octet-stream;tt-data=a','accept-encoding':'gzip','user-agent':ua,'connection':'Keep-Alive'});var Q=String.fromCharCode(34);var m=r.body.match(new RegExp(Q+'device_id_str'+Q+':'+Q+'([0-9]+)'+Q));if(!m)return null;var m2=r.body.match(new RegExp(Q+'install_id_str'+Q+':'+Q+'([0-9]+)'+Q));return {d:m[1],i:m2?m2[1]:'',o:openudid,c:cdid};}function FQ_ensure(sv,n){var pool=FQ_getPool(sv);var need=(n||3)-pool.length;var added=0;for(var i=0;i<need;i++){  var d=FQ_registerOne();  if(d){pool.push(d);added++;FQ_savePool(sv,pool);}}return pool;}function FQ_api(jv,sv,path,q,host,aid){var pool=FQ_ensure(sv,2);if(!pool.length)throw new Error('设备池为空，请检查网络后重试');var dev=pool[0].d,iid=pool[0].i;var qq=q+'&iid='+iid+'&device_id='+dev;var url=(host||FQ_HOST)+path+'?'+qq;var ts=FQ_now();var h=FQ_sign(FQ_qs(url),'',ts,dev,iid,aid||1967,Math.floor(Math.random()*2000000000));h['User-Agent']=FQ_ua();return String(jv.ajax(url+','+JSON.stringify({headers:h})));}function FQ_web(jv,url,ua){var h={'User-Agent':ua||FQ_MUA};return String(jv.ajax(url+','+JSON.stringify({headers:h})));}var QC=String.fromCharCode(34);function FQ_state(txt){var t=String(txt||'');var i=t.indexOf('window.__INITIAL_STATE__=');if(i<0)return null;var st0=t.indexOf('{',i);if(st0<0)return null;var seg=t.substring(st0);var depth=0,end=-1,instr=false,esc=false;for(var k=0;k<seg.length;k++){var ch=seg.charAt(k);if(instr){if(esc)esc=false;else if(ch===String.fromCharCode(92))esc=true;else if(ch===QC)instr=false;continue;}if(ch===QC)instr=true;else if(ch==='{')depth++;else if(ch==='}'){depth--;if(depth===0){end=k+1;break;}}}if(end<0)return null;try{return JSON.parse(seg.substring(0,end));}catch(e){return null;}}function FQ_tag(s){var t=String(s||'');return t.split('<em>').join('').split('</em>').join('').split('<').join('&lt;');}function FQ_search(jv,sv,kw,page){var off=((page||1)-1)*10;var suf='&enterfrom_aid=&enter_from=inner_search&app_name=news_article&version_name=7.0.8&app_version=7.0.8&channel=tt_huawei2019_yz&version_code=708&device_platform=android&parent_enterfrom=novel_list&novel_host=&aid=13&scm_version=1.0.0.4112&device_type=25053RT47C&device_brand=Redmi&language=zh&os_api=35&os_version=15&openudid=fqapp&update_version_code=70899&plugin=0&tma_jssdk_version=1.10.0.0&rom_version=miui__os2.0.209.0.volcnxm';var url='https://api.fanqiesdk.com/api/novel/channel/homepage/search/search/v1/?q='+encodeURIComponent(kw)+'&offset='+off+suf;var raw=FQ_web(jv,url,FQ_FUA);var out=[];try{var d=JSON.parse(raw);var rd=(d.data&&d.data.ret_data)||[];for(var i=0;i<rd.length;i++){var it=rd[i];out.push({name:FQ_tag(it.title),author:FQ_tag(it.author||''),kind:FQ_tag(it.category||''),intro:FQ_tag(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+it.book_id+FQ_SH+it.book_id,bookId:String(it.book_id)});}}catch(e){}return out;}function FQ_homeList(jv,sv){var raw=FQ_web(jv,'https://fanqienovel.com/','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36');var d=FQ_state(raw);var out=[];if(!d)return out;var hm=d.home||{};var groups=['weekList','editorList','updateList','newbookList','boyList','girlList','readRankList','newRankList','fantasyList','topRankList'];var seen={};for(var g=0;g<groups.length;g++){var arr=hm[groups[g]]||[];for(var i=0;i<arr.length;i++){var it=arr[i];var bid=String(it.bookId||'');if(!bid||seen[bid])continue;seen[bid]=1;out.push({name:String(it.bookName||''),author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumbUri||''),bookUrl:'https://fanqienovel.com/page/'+bid+FQ_SH+bid});}}return out;}function FQ_rankList(jv,sv,rankId){var raw=FQ_web(jv,FQ_WEB+FQ_SL.concat('api',FQ_SL,'rank',FQ_SL,'list?rank_id=')+(rankId||1)+'&offset=0&count=20');var out=[];try{var d=JSON.parse(raw);var l=(d.data&&d.data.list)||[];for(var i=0;i<l.length;i++){var it=l[i];var bid=String(it.bookId||'');out.push({name:String(it.bookName||''),author:String(it.author||''),kind:'排行榜',intro:String(it.abstract||''),coverUrl:String(it.thumbUri||''),bookUrl:'https://fanqienovel.com/page/'+bid+FQ_SH+bid,bookId:bid});}}catch(e){}return out;}function FQ_getDev(sv){var d=String(sv.get('fqdev')||'');var i=String(sv.get('fqiid')||'');return {d:d,i:i};}function FQ_regAndSave(sv){var r=FQ_regTest();var Q=String.fromCharCode(34);var m=r.match(new RegExp(Q+'device_id_str'+Q+':'+Q+'([0-9]+)'+Q));if(!m)return null;var m2=r.match(new RegExp(Q+'install_id_str'+Q+':'+Q+'([0-9]+)'+Q));var d=m[1],i=m2?m2[1]:'';sv.put('fqdev',d);sv.put('fqiid',i);return {d:d,i:i};}function FQ_bigBytes(n){var h=String(n.toString(16));if(h.length%2===1)h='0'+h;if(h.length>384)h=h.substring(h.length-384);return FQ_unhex(h);}function FQ_b64eJS(str){var CH='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';var out='';var i=0;var n=str.length;while(i<n){var c1=str.charCodeAt(i++)&255;var c2=(i<n)?str.charCodeAt(i++)&255:NaN;var c3=(i<n)?str.charCodeAt(i++)&255:NaN;var e1=c1>>2;var e2=((c1&3)<<4)|(isNaN(c2)?0:(c2>>4));var e3=isNaN(c2)?64:(((c2&15)<<2)|(isNaN(c3)?0:(c3>>6)));var e4=isNaN(c3)?64:(c3&63);out+=CH.charAt(e1)+CH.charAt(e2)+(e3===64?'=':CH.charAt(e3))+(e4===64?'=':CH.charAt(e4));}return out;}function FQ_b64dJS(str){var CH='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';var out='';var buf=0,bits=0;for(var i=0;i<str.length;i++){var c=str.charAt(i);if(c==='=')break;var v=CH.indexOf(c);if(v<0)continue;buf=(buf<<6)|v;bits+=6;if(bits>=8){bits-=8;out+=String.fromCharCode((buf>>bits)&255);}}return out;}function FQ_b64d2(s){try{return Packages.java.util.Base64.getDecoder().decode(String(s));}catch(e){return FQ_s2j(FQ_b64dJS(String(s)));}}function FQ_b64e2(b){try{return String(Packages.java.util.Base64.getEncoder().encodeToString(b));}catch(e){return FQ_b64eJS(FQ_j2s(b));}}function FQ_bytesHex(b){var str=FQ_j2s(b);var s='';for(var i=0;i<str.length;i++){var v=str.charCodeAt(i)&255;s+=(v<16?'0':'')+v.toString(16);}return s;}function FQ_cmGet(jv,bookId,itemIds,dev,iid){var CMP='ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff';var P=new Packages.java.math.BigInteger(CMP,16);var pk=new Packages.java.math.BigInteger(256,new Packages.java.security.SecureRandom());pk=pk.mod(P.subtract(Packages.java.math.BigInteger.ONE));var pub=Packages.java.math.BigInteger.valueOf(2).modPow(pk,P);var iv=new Packages.java.security.SecureRandom().generateSeed(16);var rk=FQ_b64d2('rCXGfd2POMGzeiNIgo4iLg==');var CC=Packages.javax.crypto.Cipher;var c1=CC.getInstance('AES/CBC/PKCS5Padding');c1.init(CC.ENCRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(rk,'AES'),new Packages.javax.crypto.spec.IvParameterSpec(iv));var ct1=c1.doFinal(FQ_s2j(FQ_bigBytes(pub)));var key=FQ_b64e2(FQ_s2j(FQ_j2s(iv)+FQ_j2s(ct1)));var body=JSON.stringify({book_id:bookId,item_ids:itemIds,key:key});var url='https://novelfm-hl.snssdk.com/novelfm/playerapi/full/mget/v1/?aid=3040&app_name=novelapp&channel=0&device_id='+dev+'&device_platform=android&device_type=UGFFI55&iid='+iid+'&os_version=0&version_code=58932&version_name=5.8.9.32';var ts=FQ_now();var stub=FQ_md5(body);var hh=FQ_sign(FQ_qs(url),stub,ts,dev,iid,3040,Math.floor(Math.random()*2000000000));hh['User-Agent']='com.dragon.read';hh['Content-Type']='application/json; charset=utf-8';var resp=FQ_hpost(url,body,hh);var dd=JSON.parse(resp.body);if(!dd||!dd.data||!dd.data.item_infos){throw new Error('取正文被上游拒绝：code='+(dd&&dd.code!=null?dd.code:'?')+' '+(dd&&dd.message?dd.message:'无'));}var infos=dd.data.item_infos;var out={};for(var iid2 in infos){var it=infos[iid2];if(!it||!it.key||!it.content){continue;}var srvHex=FQ_bytesHex(FQ_b64d2(String(it.key)));var srvN=new Packages.java.math.BigInteger(srvHex,16);var shared=srvN.modPow(pk,P);var shHex=String(shared.toString(16));if(shHex.length%2===1)shHex='0'+shHex;if(shHex.length>384)shHex=shHex.substring(shHex.length-384);var aesKey=Packages.java.util.Arrays.copyOfRange(FQ_s2j(FQ_unhex(shHex.substring(0,64))),0,32);var cb=FQ_b64d2(String(it.content));var civ=Packages.java.util.Arrays.copyOfRange(cb,0,16);var cct=Packages.java.util.Arrays.copyOfRange(cb,16,cb.length);var c2=CC.getInstance('AES/CBC/PKCS5Padding');c2.init(CC.DECRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(aesKey,'AES'),new Packages.javax.crypto.spec.IvParameterSpec(civ));var ptArr=c2.doFinal(cct);out[iid2]=String(new Packages.java.lang.String(ptArr,'UTF-8'));}return out;}function FQ_dev(sv){var d=String(sv.get('fqdev')||'');var i=String(sv.get('fqiid')||'');return {d:d,i:i};}function FQ_toc(sv,bookId,dev){var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';var url='https://api5-normal-sinfonlineb.fqnovel.com/reading/bookapi/directory/all_items/v?book_type=0&item_data_list_md5=&catalog_data_md5=&book_id='+bookId+'&book_info_md5=&need_version=true&device_id='+dev+'&'+base;var ts=FQ_now();var h=FQ_sign(FQ_qs(url),'',ts,dev,'',1967,Math.floor(Math.random()*2000000000));h['User-Agent']='Mozilla/5.0 (Linux; Android 13)';var r=String(java.ajax(url+','+JSON.stringify({headers:h})));var d=JSON.parse(r);var cats=(d.data&&d.data.catalog_data)?d.data.catalog_data:[];var out=[];for(var i=0;i<cats.length;i++){var c=cats[i];out.push({name:String(c.catalog_title||('第'+(i+1)+'章')),url:String(c.item_id)});}return out;}function FQ_explore(jv,sv,kind,page){var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';var tt={'推荐':2,'经典':3,'知识':4,'听书':5,'看剧':6,'视频':7,'短篇':8,'漫画':9,'买书':10};var tabType=tt[kind]||2;var off=((parseInt(page||'1')-1)*16);var q='tab_type='+tabType+'&offset='+off+'&client_template=0&'+base;var raw=FQ_api(jv,sv,'/reading/bookapi/bookmall/tab/v',q);var d=JSON.parse(raw);var ti=d.data.tab_item||[];var out=[];for(var t=0;t<ti.length;t++){var cells=ti[t].cell_data||[];for(var c=0;c<cells.length;c++){var bd=cells[c].book_data||[];for(var b=0;b<bd.length;b++){var it=bd[b];var bid=String(it.book_id||'');if(!bid)continue;out.push({name:String(it.book_name||''),author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+bid+FQ_SH+bid});}}}return out;}function FQ_pickBooks(jv,sv,catId,algo,page){var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';var off=((parseInt(page||'1')-1)*16);var q='cell_id=7098235271900037133&offset='+off+'&client_template=2&client_req_type=2&tab_type=2&req_rank_category_id='+catId+'&req_rank_algo='+(algo||101)+'&'+base;var raw=FQ_api(jv,sv,'/reading/bookapi/bookmall/cell/change/v1/',q);var d=JSON.parse(raw);var cv=(d.data&&d.data.cell_view)||{};var bd=cv.book_data||[];var out=[];for(var i=0;i<bd.length;i++){var it=bd[i];var bid=String(it.book_id||'');if(!bid)continue;out.push({name:String(it.book_name||''),author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+bid+FQ_SH+bid});}return out;}function FQ_tabBooks(jv,sv,tabType,page){var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';var off=((parseInt(page||'1')-1)*16);var q='tab_type='+tabType+'&offset='+off+'&client_template=0&'+base;var raw=FQ_api(jv,sv,'/reading/bookapi/bookmall/tab/v',q);var d=JSON.parse(raw);var ti=d.data.tab_item||[];var out=[];var seen={};for(var t=0;t<ti.length;t++){var cells=ti[t].cell_data||[];for(var c=0;c<cells.length;c++){var bd=cells[c].book_data||[];for(var b=0;b<bd.length;b++){var it=bd[b];var bid=String(it.book_id||'');if(!bid||seen[bid])continue;seen[bid]=1;out.push({name:String(it.book_name||''),author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+bid+FQ_SH+bid});}}}return out;}\nvar FQ_DHP='2410312426921032588552076022197566074856950548502459942654116941958108831682612228890093858261341614673227141477904012196503648957050582631942730706805009223062734745341073406696246014589361659774041027169249453200378729434170325843778659198143763193776859869524088940195577346119843545301547043747207749969763750084308926339295559968882457872412993810129130294592999947926365264059284647209730384947211681434464714438488520940127459844288859336526896320919633919';var FQ_DHU='https://novel.snssdk.com/api/novel/book/reader/content/v1?aid=13&app_name=novelapp&channel=0&device_platform=android&device_type=25053RT47C&os_version=10&support_image=1&version_code=66.9';function FQ_hget(url,headers){var c=new Packages.java.net.URL(url).openConnection();c.setRequestMethod('GET');for(var k in headers)c.setRequestProperty(k,headers[k]);c.setConnectTimeout(20000);c.setReadTimeout(25000);var code=c.getResponseCode();var is=(code>=400)?c.getErrorStream():c.getInputStream();var sb='';if(is){var enc=String(c.getHeaderField('Content-Encoding')||'');var st=is;if(enc.indexOf('gzip')>=0)st=new Packages.java.util.zip.GZIPInputStream(is);var rd=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(st,'UTF-8'));var line;while((line=rd.readLine())!=null)sb+=String(line);rd.close();}return {code:code,body:sb,y:String(c.getHeaderField('y')||''),c:String(c.getHeaderField('c')||'')};}function FQ_dhGet(jv,itemId,dev,iid){var P=new Packages.java.math.BigInteger(FQ_DHP,10);var a=new Packages.java.math.BigInteger(256,new Packages.java.security.SecureRandom());var pub=Packages.java.math.BigInteger.valueOf(2).modPow(a,P);var ivB=new Packages.java.security.SecureRandom().generateSeed(16);var keyB=FQ_b64d2('rCXGfd2POMGzeiNIgo4iLg==');var CC=Packages.javax.crypto.Cipher;var c1=CC.getInstance('AES/CBC/NoPadding');c1.init(CC.ENCRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(keyB,'AES'),new Packages.javax.crypto.spec.IvParameterSpec(ivB));var ctB=c1.doFinal(FQ_s2j(FQ_pad(FQ_j2s(pub.toByteArray()))));var blob=new Packages.java.io.ByteArrayOutputStream();blob.write(ivB);blob.write(ctB);var y=FQ_b64e2(blob.toByteArray());var url=FQ_DHU+'&item_id='+itemId;var hh=FQ_sign(FQ_qs(url),'',FQ_now(),dev,iid,13,Math.floor(Math.random()*2000000000));hh['User-Agent']='com.ss.android.article.news/13400 (Linux; U; Android 10; zh_CN; tb8788p1_64_bsp; Build/QQ3A.200805.001; Cronet/TTNetVersion:fc4cebd3 2024-12-10 QuicVersion:d9628e3d 2024-10-11)';hh['y']=y;var res=FQ_hget(url,hh);if(res.code!==200){throw new Error('正文通道 HTTP '+res.code);}var sc=res.c,dc='';try{var o=JSON.parse(res.body);if(o&&o.data&&o.data.content)dc=o.data.content;}catch(e){}if((sc==='1'||sc==='')&&dc)sc=dc;if(!res.y||!sc){throw new Error('正文通道缺少解密参数');}var s=new Packages.java.math.BigInteger(1,FQ_b64d2(res.y)).modPow(a,P);var sB=s.toByteArray();var i=0;while(i<sB.length-1&&sB[i]===0)i++;sB=Packages.java.util.Arrays.copyOfRange(sB,i,sB.length);if(sB.length<32){throw new Error('正文通道共享密钥过短');}var cb=FQ_b64d2(sc);if(cb.length<32){throw new Error('正文通道密文过短');}var c2=CC.getInstance('AES/CBC/NoPadding');c2.init(CC.DECRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(Packages.java.util.Arrays.copyOfRange(sB,0,32),'AES'),new Packages.javax.crypto.spec.IvParameterSpec(Packages.java.util.Arrays.copyOfRange(cb,0,16)));var pt=c2.doFinal(Packages.java.util.Arrays.copyOfRange(cb,16,cb.length));var n=pt.length,p=pt[n-1]&0xFF;if(p>0&&p<=16&&p<=n)pt=Packages.java.util.Arrays.copyOfRange(pt,0,n-p);return String(new Packages.java.lang.String(pt,Packages.java.nio.charset.Charset.forName('UTF-8')));}\n// ===== 段评（番茄内部叫 idea）=====\nvar FQ_IDEA_HOST='https://api5-normal-sinfonlineb.fqnovel.com';\nfunction FQ_ideaQ(dev,iid){\n  return 'iid='+iid+'&device_id='+dev+'&ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp'\n   +'&version_code=72432&version_name=7.2.4.32&device_platform=android&os=android&ssmix=a'\n   +'&device_type=25053RT47C&device_brand=Redmi&language=zh&os_api=36&os_version=16'\n   +'&manifest_version_code=72432&resolution=1280*2620&dpi=520&update_version_code=72432'\n   +'&host_abi=arm64-v8a&dragon_device_type=phone&pv_player=72432&compliance_status=0'\n   +'&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0';\n}\n// 拉整章段评：返回 {段落索引: 段评数}。失败一律返回 {}，绝不抛错\nfunction FQ_ideas(sv,itemId){\n  try{\n    var pool=FQ_ensure(sv,2);\n    if(!pool.length)return {};\n    var dev=pool[0].d,iid=pool[0].i;\n    var url=FQ_IDEA_HOST+'/novel/commentapi/idea/list/'+itemId+'/v1/?'+FQ_ideaQ(dev,iid);\n    var body=JSON.stringify({comment_source:3,compliance_status:0,item_id:itemId,item_version:'',server_channel:7});\n    var ts=FQ_now();\n    var hh=FQ_sign(FQ_qs(url),FQ_md5(body),ts,dev,iid,1967,Math.floor(Math.random()*2000000000));\n    hh['User-Agent']=FQ_ua();\n    hh['Content-Type']='application/json; charset=utf-8';\n    var res=FQ_hpost(url,body,hh);\n    if(!res||res.code!==200)return {};\n    var d=JSON.parse(res.body);\n    var dd=(d&&d.data&&d.data.data)?d.data.data:null;\n    if(!dd)return {};\n    var out={};\n    for(var k in dd){\n      var it=dd[k];\n      if(!it||!it.count||it.count<=0)continue;\n      out[k]=it.count;\n    }\n    return out;\n  }catch(e){return {};}\n}\n// 段评数格式化：106099 -> 10.6万\nfunction FQ_num(n){\n  n=Number(n)||0;\n  if(n>=100000000)return (Math.round(n/10000000)/10)+'亿';\n  if(n>=10000)return (Math.round(n/1000)/10)+'万';\n  return String(n);\n}\n// 把段评数按 <p idx=\"N\"> 注入到正文对应段落之后\n// 注意：Legado 的 HtmlFormatter.formatKeepImg 会把 <p> 转成换行、剥掉所有非 img 标签，\n// 所以这里不要写style（写了也留不下），靠 <p> -> 换行 让段评独立成段\n// ==== 段评内容模式（三态：0关 / 1只数量 / 2数量+热点段评论内容）====\nvar FQ_CR=String.fromCharCode(13);\nvar FQ_LF=String.fromCharCode(10);\n// 清洗评论文本：去掉会破坏正文 HTML 的字符，换行压成空格\nfunction FQ_clean(s){\n  var t=String(s);\n  t=t.split('<').join('‹');\n  t=t.split('>').join('›');\n  t=t.split('&').join('＆');\n  t=t.split(FQ_CR).join(' ');\n  t=t.split(FQ_LF).join(' ');\n  t=t.split('\"').join('＂');\n  return t;\n}\n// 读开关：source 变量里找 fqidea=N\nfunction FQ_ideaMode(sv){\n  try{\n    var v=String(sv.getVariable()||'');\n    var p=v.split('fqidea=');\n    if(p.length>=2){var n=Number(String(p[1]).charAt(0));if(!isNaN(n))return n>0?1:0;}\n    if(v.indexOf('idea=1')>=0)return 1;\n    return 0;\n  }catch(e){return 0;}\n}\n// 段评数最大的前 n 段（返回段落索引数组）\nfunction FQ_pickTop(ideas,n){\n  var arr=[];\n  for(var k in ideas)arr.push([Number(k),Number(ideas[k])||0]);\n  arr.sort(function(a,b){return b[1]-a[1];});\n  var out=[];\n  for(var i=0;i<arr.length&&i<n;i++)out.push(arr[i][0]);\n  return out;\n}\n// 拉某一段的段评内容\n// 关键参数（实测自 fqapp 的 paragraphComments）：comment_source=2 / comment_type=1 /\n// group_type=15 / server_channel=38（不是 43，43 恒 total=0）；路径段用 item_id，\n// business_param.book_id 用真实书籍 id；item_version 只需非空\nfunction FQ_avUrl(u){\n  var s=String(u==null?'':u);\n  if(!s)return '';\n  if(s.indexOf('http://')===0)s='https://'+s.substring(7);\n  s=s.split(FQ_DQ).join('').split(FQ_Q).join('');\n  s=s.split('<').join('').split('>').join('');\n  s=s.split('&').join('&amp;');\n  return s;\n}\n// 段评取数（带游标分页）：cursor 为空取第 1 页，否则把 cursor 作为 body 顶层字段回传\n// 返回 {ok,list,cursor,more,total}；ok=false 表示请求失败（与「真的没有评论」区分开）\n// 面板首屏拉 FQ_CMT_CNT 条，滚到底再由 FQ_cmtNext 续拉一页（见 FQ_panelBoot）\nvar FQ_CMT_CNT=50;\n// 注意：cursor 落在 150~199 区间时服务端会返回空 + has_more=false（看起来像「到底了」），\n// 那是服务端的死区而不是真取完，FQ_cmtAll 会自动跨过它\nvar FQ_PANEL_H=0.85;   // 段评面板高度占屏幕比例：必须让可见区 == WebView 视口，否则底部滚不到\nvar FQ_CMT_MAX=600;    // 面板里最多渲染多少条（防呆，约 12 页）\n// showBrowser 的 base url：**必须**是 'data:text/html;' 前缀，否则 preloadJs 非空会被\n// shouldInterceptRequest 拿去 okhttp 重抓主框架、把 html 整个顶掉（唯一豁免就是这个前缀）。\n// 代价：data: 正文会被当 URL 解析（'#' 起截断 / '%' 起转义 / '?' 起截断），\n// 所以这里只放一个纯 ASCII 空壳，面板 HTML 一律由 preloadJs 当 JS 字符串带进去。\nvar FQ_PANEL_BASE='data:text/html;';\nvar FQ_PANEL_SKEL='<!DOCTYPE html><html><head><meta charset=\"utf-8\">'\n +'<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no\">'\n +'</head><body>'\n +'<div id=\"fqfb\" style=\"display:none;padding:48px 20px;text-align:center;font-size:15px;line-height:1.7\">段评面板初始化失败，请把这条反馈给书源作者</div>'\n +'<script>setTimeout(function(){if(!window.__FQ_PANEL){var e=document.getElementById(\"fqfb\");if(e)e.style.display=\"block\";}},3000);</'+'script>'\n +'</body></html>';\nfunction FQ_cmtFetch(sv,bookId,itemId,paraIndex,cnt,cursor){\n  var out={ok:false,list:[],cursor:'',more:false,total:0};\n  try{\n    var pool=FQ_ensure(sv,2);\n    if(!pool.length)return out;\n    var dev=pool[0].d,iid=pool[0].i;\n    var url=FQ_IDEA_HOST+'/novel/commentapi/comment/list/'+itemId+'/v1/?'+FQ_ideaQ(dev,iid);\n    var cur=String(cursor==null?'':cursor);\n    var bp={book_id:bookId,comment_sort_debug:false,end_offset_time:0,fold_type:1,item_count:0,item_version:'1',max_item_count:0,need_danmaku_occlusion_face_data:false,para_index:Number(paraIndex),playlet_item_duration:0,read_item_count:0,req_type:0,start_offset_time:0,need_count:cur?false:true};\n    var bo={business_param:bp,comment_source:2,comment_type:1,count:Number(cnt)||20,group_id:itemId,group_type:15,server_channel:38,sort:1};\n    if(cur)bo.cursor=cur;\n    var body=JSON.stringify(bo);\n    var ts=FQ_now();\n    var hh=FQ_sign(FQ_qs(url),FQ_md5(body),ts,dev,iid,1967,Math.floor(Math.random()*2000000000));\n    hh['User-Agent']=FQ_ua();\n    hh['Content-Type']='application/json; charset=utf-8';\n    var res=FQ_hpost(url,body,hh);\n    if(!res||res.code!==200)return out;\n    var d=JSON.parse(res.body);\n    if(!d||(d.code!==undefined&&Number(d.code)!==0))return out;\n    out.ok=true;\n    var dd=(d&&d.data)?d.data:{};\n    var cli=dd.common_list_info||{};\n    out.cursor=String(cli.cursor==null?'':cli.cursor);\n    out.total=Number(cli.total||0)||0;\n    out.more=(cli.has_more===true);\n    var dl=dd.data_list||[];\n    for(var i=0;i<dl.length;i++){\n      var c=(dl[i]&&dl[i].comment)?dl[i].comment:{};\n      var cm=c.common||{};\n      var ct=(cm.content&&cm.content.text)?String(cm.content.text):'';\n      if(!ct)continue;\n      var bi=(cm.user_info&&cm.user_info.base_info)?cm.user_info.base_info:{};\n      var ug=(cm.user_info&&cm.user_info.user_tag)?cm.user_info.user_tag:{};\n      var st=c.stat||{};\n      var tsv=0;\n      try{tsv=Number(cm.create_timestamp||cm.create_time||c.create_timestamp||c.create_time||0)||0;}catch(e){}\n      out.list.push({u:FQ_clean(bi.user_name||'读者'),t:FQ_clean(ct),d:Number(st.digg_count||0)||0,ts:tsv,av:FQ_avUrl(bi.user_avatar),rp:Number(st.reply_count||0)||0,au:(String(ug.is_author)=='true')?1:0});\n    }\n    if(!out.list.length)out.more=false;\n    return out;\n  }catch(e){return out;}\n}\nfunction FQ_paraComments(sv,bookId,itemId,paraIndex,cnt){\n  return FQ_cmtFetch(sv,bookId,itemId,paraIndex,cnt,'').list;\n}\nfunction FQ_attachIdeas(html,ideas,bookId,itemId){\n  var cnt=0;\n  for(var k in ideas)cnt++;\n  if(!cnt)return html;\n  var bid=String(bookId||''),iid=String(itemId||'');\n  // 段落标记两种形态：网文 <p idx=\"0\">；出版书(EPUB) <p class=\"body\" idx=\"0\"> / <p class=\"kaiti\" idx=\"21\">\n  // idx 不一定在第一个属性位，所以先整段抓开标签，再从属性串里挑 idx（挑不到就不动这一段）\n  return String(html).replace(/<p([^>]*)>([\\s\\S]*?)<\\/p>/g,function(m,attr,inner){\n    var mm=/(?:^|\\s)idx=\"(\\d+)\"/.exec(attr);\n    if(!mm)return m;\n    var idx=mm[1];\n    var c=ideas[idx];\n    if(!c)return m;\n    var tag=FQ_ideaTag(bid,iid,Number(idx),c);\n    if(!tag)return m;\n    return '<p'+attr+'>'+inner+tag+'</p>';\n  });\n}\n// ==== 段评气泡：正文里只给「有段评的段落」在末尾挂一个数字气泡，点击才现场拉取 ====\n// 两态：fqidea=0 关闭 / fqidea>0 开启\n// JS 字符串 -> UTF-8 字节串（每个 char 都落在 0-255），再走 FQ_b64 才能正确编码中文\nfunction FQ_u8(s){\n  var out='';\n  for(var i=0;i<s.length;i++){\n    var c=s.charCodeAt(i);\n    if(c<0x80){out+=String.fromCharCode(c);}\n    else if(c<0x800){out+=String.fromCharCode(0xC0|(c>>6),0x80|(c&63));}\n    else if(c<0xD800||c>0xDFFF){out+=String.fromCharCode(0xE0|(c>>12),0x80|((c>>6)&63),0x80|(c&63));}\n    else{\n      i++;\n      var d=s.charCodeAt(i);\n      var cp=0x10000+(((c&0x3FF)<<10)|(d&0x3FF));\n      out+=String.fromCharCode(0xF0|(cp>>18),0x80|((cp>>12)&63),0x80|((cp>>6)&63),0x80|(cp&63));\n    }\n  }\n  return out;\n}\nfunction FQ_b64u(s){return FQ_b64(FQ_u8(s));}\n// 拼一个 JS 单引号字面量（只用于数字型 id，顺手把引号/反斜杠去掉防注入）\nfunction FQ_qt(s){\n  var t=String(s==null?'':s);\n  t=t.split('\\\\').join('');\n  t=t.split(\"'\").join('');\n  t=t.split('\"').join('');\n  return \"'\"+t+\"'\";\n}\n// 生成段评气泡图标的 data URL（内联 SVG：红色描边气泡 + 数量），按数量做缓存\nvar FQ_ICONC={};\nfunction FQ_ideaBubble(count){\n  var s=FQ_num(count);\n  var hit=FQ_ICONC[s];\n  if(hit)return hit;\n  var n=s.length;\n  var fs=21;\n  if(n<=2)fs=24;else if(n===3)fs=21;else if(n===4)fs=18;else fs=15;\n  var svg='<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"78\" height=\"44\">'\n    +'<rect x=\"3\" y=\"3\" width=\"72\" height=\"30\" rx=\"15\" fill=\"none\" stroke=\"#FF4E4E\" stroke-width=\"3\"/>'\n    +'<path d=\"M19 33 L14 43 L30 33 Z\" fill=\"#FF4E4E\"/>'\n    +'<text x=\"39\" y=\"25\" text-anchor=\"middle\" font-family=\"sans-serif\" font-size=\"'+fs+'\" fill=\"#FF4E4E\">'+s+'</text>'\n    +'</svg>';\n  var u='';\n  try{u='data:image/svg+xml;base64,'+FQ_b64u(svg);}catch(e){u='';}\n  FQ_ICONC[s]=u;\n  return u;\n}\n// 生成可点击的气泡标签：style=TEXT 让它内联在段落文字行尾（不占整行）\n// 逗号后那段 JSON 会被 App 的 formatKeepImg 原样保留，click 里的 JS 由 App 执行\nfunction FQ_ideaTag(bookId,itemId,paraIndex,count){\n  var u=FQ_ideaBubble(count);\n  if(!u)return '';\n  var click='FQ_ideaTap(source,java,'+FQ_qt(bookId)+','+FQ_qt(itemId)+','+Number(paraIndex)+')';\n  return '<img src=\"'+u+',{\"style\":\"TEXT\",\"click\":\"'+click+'\"}\">';\n}\n// 时间戳(秒) -> yyyy-MM-dd\nfunction FQ_day(ts){\n  try{\n    var n=Number(ts)||0;\n    if(n<=0)return '';\n    if(n>99999999999)n=Math.floor(n/1000);\n    var d=new Date(n*1000);\n    var y=d.getFullYear(),m=d.getMonth()+1,dd=d.getDate();\n    return y+'-'+(m<10?'0':'')+m+'-'+(dd<10?'0':'')+dd;\n  }catch(e){return '';}\n}\n// 颜色值 -> #RRGGBB（兼容 #RRGGBB 字符串、有符号 int）\nfunction FQ_col(v){\n  try{\n    var s=String(v==null?'':v);\n    if(s.charAt(0)==='#')return s;\n    var n=Number(s);\n    if(!isFinite(n)||n===0)return '';\n    if(n<0)n=n+4294967296;\n    var h=Math.round(n).toString(16);\n    while(h.length<8)h='0'+h;\n    return '#'+h.substring(2);\n  }catch(e){return '';}\n}\n// 从 Map / 普通对象里按候选键名取值（Rhino 里 Java Map 两种访问都试）\nfunction FQ_tkey(m,names){\n  try{\n    if(!m)return '';\n    for(var i=0;i<names.length;i++){\n      var v;\n      try{v=m[names[i]];}catch(e){}\n      if(v===undefined||v===null){\n        try{v=m.get(names[i]);}catch(e){}\n      }\n      if(v!==undefined&&v!==null&&String(v)!=='')return String(v);\n    }\n  }catch(e){}\n  return '';\n}\n// 弹窗配色：尽量跟随阅读主题，取不到就按是否夜间模式给默认\nfunction FQ_theme(jv){\n  var bg='',fg='',night='';\n  try{\n    var m1=jv.getThemeConfigMap();\n    bg=FQ_col(FQ_tkey(m1,['backgroundColor','bgColor','background','bg']));\n    night=FQ_tkey(m1,['isNightTheme','night','nightTheme']);\n  }catch(e){}\n  try{\n    var m2=jv.getReadBookConfigMap();\n    fg=FQ_col(FQ_tkey(m2,['textColor','textColorStr','color','text_color']));\n    if(!bg)bg=FQ_col(FQ_tkey(m2,['bgColor','backgroundColor','background','bg']));\n  }catch(e){}\n  var isNight=(String(night)==='true');\n  if(!bg)bg=isNight?'#1B1B1B':'#FFFFFF';\n  if(!fg)fg=isNight?'#CCCCCC':'#262626';\n  return {bg:bg,fg:fg,sub:isNight?'#8C8C8C':'#9A9A9A',line:isNight?'rgba(255,255,255,.14)':'rgba(0,0,0,.10)',av:isNight?'#3A3A3A':'#E6E6E6'};\n}\n// ==== 段评面板：行渲染 / 样式 / 页面（支持滚到底自动加载下一页）====\n// 把字符串转成 JS 单引号字面量（含内部转义），用于安全地把规则/参数注入弹窗页面\nfunction FQ_jsLit(s){\n  var t=String(s==null?'':s);\n  t=t.split(String.fromCharCode(92)).join(String.fromCharCode(92,92));\n  t=t.split(String.fromCharCode(39)).join(String.fromCharCode(92,39));\n  t=t.split(String.fromCharCode(10)).join('');\n  t=t.split(String.fromCharCode(13)).join('');\n  return String.fromCharCode(39)+t+String.fromCharCode(39);\n}\n// 一条段评的 DOM：头像用 <img>（能解码才是真头像，解不了就 onerror 自删露出首字）\nfunction FQ_cmtRows(list){\n  var rows='';\n  var n=(list&&list.length)?list.length:0;\n  for(var i=0;i<n;i++){\n    var c=list[i];\n    var nm=String(c.u||'读者');\n    var fu=nm.substring(0,1);\n    if(nm.charCodeAt(0)>=0xD800&&nm.charCodeAt(0)<=0xDBFF)fu=nm.substring(0,2);\n    fu=FQ_clean(fu);\n    var avu=c.av?c.av:'';var avi=c.av?('<img class=\"p\" src=\"'+FQ_PX+'\" data-av=\"'+avu+'\" alt=\"x\" referrerpolicy=\"no-referrer\">'):'';\n    var d=(c.d>0)?('<span class=\"dg\">'+FQ_num(c.d)+' 赞</span>'):'';\n    var day=FQ_day(c.ts);\n    var tm=day?('<span class=\"tm\">'+day+'</span>'):'';\n    var au=(c.au>0)?'<em class=\"au\">作者</em>':'';\n    var rp=(c.rp>0)?('<div class=\"rp\">'+c.rp+' 条回复</div>'):'';\n    var dk=FQ_clean(String(c.u||'')+'|'+String(c.ts||'')+'|'+String(c.t||'').substring(0,20));\n    rows=rows+'<div class=\"it\" data-k=\"'+dk+'\">'\n      +'<span class=\"av\"><b>'+fu+'</b>'+avi+'</span>'\n      +'<div class=\"bd\">'\n      +'<div class=\"hd\"><span class=\"un\">'+c.u+'</span>'+au+tm+d+'</div>'\n      +'<div class=\"tx\">'+c.t+'</div>'\n      +rp\n      +'</div>'\n      +'</div>';\n  }\n  return rows;\n}\nfunction FQ_cmtCss(t){\n  return 'html,body{margin:0;padding:0;overflow-x:hidden;background:'+t.bg+';color:'+t.fg+';font-family:sans-serif;font-size:15px;line-height:1.65;-webkit-text-size-adjust:100%}'\n    +'.top{padding:15px 16px 11px;font-size:16px;font-weight:600;border-bottom:1px solid '+t.line+'}'\n    +'.top i{color:#FF4E4E;font-style:normal}'\n    +'.ls{padding-bottom:2px}'\n    +'.it{box-sizing:border-box;display:flex;align-items:flex-start;padding:12px 16px;border-bottom:1px solid '+t.line+'}'\n    +'.av{flex:0 0 34px;width:34px;height:34px;border-radius:50%;background-color:'+t.av+';position:relative;overflow:hidden}'\n    +'.av b{position:absolute;left:0;top:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:400;color:'+t.sub+'}'\n    +'.av img.p{position:absolute;left:0;top:0;width:100%;height:100%;object-fit:cover;display:block;background-color:'+t.av+';z-index:2}'\n    +'.bd{flex:1;min-width:0;margin-left:10px}'\n    +'.hd{font-size:13px;color:'+t.sub+';overflow:hidden}'\n    +'.un{font-weight:600;opacity:.9}'\n    +'.au{display:inline-block;margin-left:6px;padding:0 5px;font-size:11px;font-style:normal;line-height:15px;color:#FF4E4E;border:1px solid rgba(255,78,78,.5);border-radius:3px;vertical-align:1px}'\n    +'.tm{margin-left:8px}'\n    +'.dg{float:right;color:#FF4E4E}'\n    +'.tx{margin-top:5px;word-break:break-word;white-space:pre-wrap}'\n    +'.rp{margin-top:6px;font-size:12px;color:'+t.sub+'}'\n    +'.em{padding:52px 16px;text-align:center;color:'+t.sub+'}'\n    +'.ld{padding:14px 16px 30px;text-align:center;font-size:13px;color:'+t.sub+'}';\n}\n// 段评面板 HTML。st={bookId,itemId,paraIndex,rows,total,cursor,more}\nfunction FQ_cmtPageHtml(st,t){\n  var rows=String(st.rows||'');\n  var n=(rows.match(/class=\"it\"/g)||[]).length;\n  var foot='';\n  if(n)foot='<div class=\"ld\" id=\"fqld\">'+((st.more&&st.total>n)?('已显示 '+n+' 条 / 共 '+FQ_num(st.total)+' 条，继续上滑加载更多'):'— 没有更多了 —')+'</div>';\n  return '<script>'+FQ_HEIC_DECODER+'</'+'script>'+'<!DOCTYPE html><html><head><meta charset=\"utf-8\">'\n    +'<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no\">'\n    +'<style>'+FQ_cmtCss(t)+'</style></head><body>'\n    +'<div class=\"top\"><i>\\uD83D\\uDCAC</i> 本段段评'+(st.total?(' · '+FQ_num(st.total)+' 条'):'')+'</div>'\n    +'<div class=\"ls\" id=\"fqls\">'+rows+'</div>'+foot\n    +'</body></html>';\n}\n// 供弹窗页面回调：拉下一页，返回 {c:游标,m:还有更多,t:总数,n:本页条数,h:行HTML}\n// 注：面板现在走 FQ_cmtNext（一次一页 + 死区跨越），这个「一次连拉多页」的版本留作备用\nfunction FQ_cmtMore(sv,jv,bookId,itemId,paraIndex,cursor,cnt){\n  var r={c:'',m:0,t:0,n:0,h:''};\n  try{\n    var res=FQ_cmtFetch(sv,String(bookId),String(itemId),Number(paraIndex),Number(cnt)||20,String(cursor==null?'':cursor));\n    r.c=res.cursor;r.m=res.more?1:0;r.t=res.total;r.n=res.list.length;r.h=FQ_cmtRows(res.list);\n  }catch(e){}\n  return JSON.stringify(r);\n}\n// ============ 书详情（/reading/bookapi/detail/v）============\nfunction FQ_detBase(){\n  return 'ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';\n}\n// 取详情 book_info 对象；失败/不存在返回 null（不抛异常）\n// 注意：detail 接口的 URL 里**不能带 iid**（带了服务端返回 200 + 空体），\n// 但签名 FQ_sign 的第三个设备参数仍要传 iid，两者不冲突\nfunction FQ_detJson(jv,sv,bid){\n  var id=String(bid==null?'':bid).replace(/[^0-9]/g,'');\n  if(!id)return null;\n  var pool=FQ_ensure(sv,2);\n  if(!pool.length)return null;\n  var dev=pool[0].d,iid=pool[0].i;\n  var url=FQ_HOST+'/reading/bookapi/detail/v?book_id='+id+'&book_info_md5=&need_version=true&device_id='+dev+'&'+FQ_detBase();\n  var h=FQ_sign(FQ_qs(url),'',FQ_now(),dev,iid,1967,Math.floor(Math.random()*2000000000));\n  h['User-Agent']=FQ_ua();\n  var raw='';\n  try{raw=String(jv.ajax(url+','+JSON.stringify({headers:h})));}catch(e){return null;}\n  var j=null;\n  try{j=JSON.parse(raw);}catch(e){return null;}\n  if(!j||Number(j.code)!==0)return null;\n  var bd=(j.data&&j.data.book_info)?j.data.book_info:(j.data||{});\n  return bd;\n}\n// 字数 -> 320.1万字\nfunction FQ_wcTxt(n){\n  n=Number(n)||0;\n  if(n<=0)return '';\n  return FQ_num(n)+'字';\n}\n// creation_status: 0 完结 / 1 连载 / 4 停更\nfunction FQ_stTxt(s){\n  s=String(s==null?'':s);\n  if(s==='0')return '已完结';\n  if(s==='1')return '连载中';\n  if(s==='4')return '已停更';\n  if(s==='')return '';\n  return '状态'+s;\n}\n// 简介走 <usehtml> 富文本，正文里的 < > & 先转义，避免被当标签吞掉\nfunction FQ_esc(s){\n  var t=String(s==null?'':s);\n  t=t.split('&').join('＆');\n  t=t.split('<').join('‹');\n  t=t.split('>').join('›');\n  return t;\n}\n// 排版空白 -> <br>：接口原文是「换行 + 全角缩进 　　」，但 <usehtml> 进 TextView 时裸换行会被折叠成空格，\n// 于是整段挤成一行。先把「换行+全角缩进」整块换成一个 <br>，剩下的裸换行也显式换行。\nfunction FQ_br(s){\n  var t=String(s==null?'':s);\n  t=t.replace(/[ \\t\\r\\n]*\\u3000+[ \\t]*/g,'<br>');\n  t=t.replace(/\\r\\n|\\r|\\n/g,'<br>');\n  return t;\n}\n// 详情页 init：返回 name/author/kind/intro/coverUrl/tocUrl/wordCount/lastChapter\nfunction FQ_detailInit(jv,sv,bid){\n  var id=String(bid==null?'':bid).replace(/[^0-9]/g,'');\n  if(!id)throw new Error('无效书籍ID');\n  var bd=FQ_detJson(jv,sv,id);\n  if(!bd)throw new Error('书籍详情获取失败，请重试');\n  var nm=String(bd.book_name||bd.original_book_name||'');\n  var au=String(bd.author||'');\n  var cat=String(bd.category||'');\n  var tg=String(bd.tags||'');\n  var kindArr=[];\n  if(cat)kindArr.push(cat);\n  var t1=tg.split(',');\n  for(var i=0;i<t1.length;i++){\n    var s1=String(t1[i]).replace(/^\\s+|\\s+$/g,'');\n    if(s1&&kindArr.indexOf(s1)<0)kindArr.push(s1);\n  }\n  var hd=[];\n  var sc=String(bd.score||'');\n  var rdc=String(bd.sub_info||'');\n  if(!rdc){\n    var rc=Number(bd.read_count||0)||0;\n    if(rc)rdc=FQ_num(rc)+'人在读';\n  }\n  var wcs=FQ_wcTxt(bd.word_number);\n  var stt=FQ_stTxt(bd.creation_status);\n  if(sc)hd.push('★ '+FQ_esc(sc)+' 分');\n  if(rdc)hd.push(FQ_esc(rdc));\n  if(wcs)hd.push(FQ_esc(wcs));\n  if(stt)hd.push(FQ_esc(stt));\n  var head='';\n  if(hd.length)head=hd.join(' · ')+'<br>';\n  head=head+'作品ID：'+id+'<br><br>';\n  var ab=FQ_br(FQ_esc(bd.abstract||bd.book_abstract_v2||''));\n  var out={\n    name:nm,\n    author:au,\n    kind:kindArr.join(','),\n    intro:'<usehtml>'+head+ab+'<',\n    coverUrl:String(bd.thumb_url||bd.expand_thumb_url||''),\n    tocUrl:'https://fanqienovel.com/page/'+id,\n    wordCount:wcs,\n    lastChapter:String(bd.last_chapter_title||'')\n  };\n  return JSON.stringify(out);\n}\n// 按作品 ID 查一本书（用于「作品ID搜索」），命中返回搜索项，否则 null\nfunction FQ_bookById(jv,sv,bid){\n  var id=String(bid==null?'':bid).replace(/[^0-9]/g,'');\n  if(!id)return null;\n  var bd=FQ_detJson(jv,sv,id);\n  if(!bd)return null;\n  var nm=String(bd.book_name||bd.original_book_name||'');\n  if(!nm)return null;\n  var rbid=String(bd.book_id||'');\n  if(rbid&&rbid!==id)return null;\n  return {name:nm,author:String(bd.author||''),kind:String(bd.category||''),intro:String(bd.abstract||''),coverUrl:String(bd.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+id};\n}\n// 连拉多页：只在「首屏」用一次（pageCnt 传 1），把第 1 页取回来当面板的初始内容；\n// 后面的页交给面板自己按需拉（FQ_cmtNext）。小段落第 1 页就 more=false，只有一次请求。\nfunction FQ_cmtAll(sv,bookId,itemId,paraIndex,pageCnt,perPage){\n  var out={ok:false,list:[],cursor:'',more:false,total:0,pages:0};\n  var cur='',pages=Number(pageCnt)||1,pp=Number(perPage)||FQ_CMT_CNT;\n  var seen={},bridge='';\n  for(var p=0;p<pages;p++){\n    var r=FQ_cmtFetch(sv,String(bookId),String(itemId),Number(paraIndex),pp,cur);\n    if(p===0){\n      out.ok=r.ok;out.total=r.total;\n      if(!r.ok)return out;\n    }\n    if(r.list.length){\n      // 累积时去重：sort=1 是\"智能热度\"，两次请求之间热度会漂移，\n      // 同一页里可能出现上一页已给过的评论\n      for(var i=0;i<r.list.length;i++){\n        var c=r.list[i];\n        var k=c.u+'|'+c.ts+'|'+String(c.t).substring(0,24);\n        if(seen[k])continue;\n        seen[k]=1;out.list.push(c);\n      }\n      out.pages=p+1;out.more=r.more;\n      if(!r.more||!r.cursor||r.cursor===cur)break;\n      cur=r.cursor;\n      continue;\n    }\n    // 本页为空：只可能是服务端的死区 cursor∈[150,199]。\n    // 先用 149 横跨（149 的请求能返回 [149,199)），再用 200 接上；\n    // 其它情况才算真的取完。\n    var n=Number(cur);\n    if(n>=150&&n<200){\n      if(bridge!=='149'){bridge='149';cur='149';}\n      else{bridge='200';cur='200';}\n      continue;\n    }\n    break;\n  }\n  out.cursor=cur;\n  return out;\n}\n// ==== 点击段评气泡：拉段评 + 打开「可翻页」面板 ====\n// 面板走 showBrowser 的四参形态：url + html + preloadJs + config\n//   · 要「滚到底再拉下一页」就必须在 WebView 里回调书源 JS，而面板里唯一能回调的入口\n//     是那座 JS 桥（run/java/source）。桥的对象名是随机串（BottomWebViewDialog.initWebView），\n//     只有 JS_INJECTION 那段注入脚本知道，而它只在 preloadJs 非空时才会被发出去。\n//   · 但 preloadJs 非空会让「主框架」被 okhttp 重抓（shouldInterceptRequest 里\n//     !preloadJs.isNullOrEmpty() 分支），你传的 html 会被整个顶掉；唯一豁免是\n//     base url 以 'data:text/html;' 开头（Android loadDataWithBaseURL 见 data: 前缀会退化成 loadData）。\n//   · 而 data: 的正文会被当 URL 解析：'#' 起后面全被当 fragment 丢掉、'%' 起转义、'?' 起截断\n//     —— 上一次白屏就是这么来的（CSS 里第一个 #FFFFFF 在第 196 字节）。\n// 所以：data: 里只放一个纯 ASCII 空壳，真正的面板 HTML 全部由 preloadJs 当普通 JS 字符串带进页面，\n// 内容再长再花都不经过 URL 编码。\nfunction FQ_ideaTap(sv,jv,bookId,itemId,paraIndex){\n  try{\n    var bid=String(bookId),iid=String(itemId),pi=Number(paraIndex)||0;\n    var t=FQ_theme(jv);\n    var res=FQ_cmtAll(sv,bid,iid,pi,1,FQ_CMT_CNT);\n    var st={bookId:bid,itemId:iid,paraIndex:pi,total:res.total,cursor:res.cursor,more:res.more};\n    if(!res.ok){\n      st.rows='<div class=\"em\">段评拉取失败，请稍后再试</div>';\n      st.more=false;st.total=0;st.cursor='';\n      try{jv.toast('段评拉取失败');}catch(e0){}\n    }else{\n      st.rows=res.list.length?FQ_cmtRows(res.list):'<div class=\"em\">这一段还没有人评论</div>';\n      if(!res.list.length){st.more=false;st.cursor='';}\n    }\n    var html=FQ_cmtPageHtml(st,t);\n    jv.showBrowser(FQ_PANEL_BASE,FQ_PANEL_SKEL,FQ_panelBoot(st,t,html),'{\"heightPercentage\":'+FQ_PANEL_H+'}');\n  }catch(e){\n    try{jv.toast('段评加载失败：'+e);}catch(e2){}\n  }\n}\n// 面板回调：拉「下一页」。一次只拉一页。\n// 返回 {c:游标,m:还有更多,t:总数,n:本页条数,h:行HTML,e:错误码}\n// 游标死区：cursor∈[150,199] 服务端会返回空 + has_more=false（装成\"到底了\"）。\n// 跨法：先用 149 拿到 [149,199)，再把游标直接推到 200（死区里本来没数据，跳过不丢东西）。\nfunction FQ_cmtNext(sv,arg){\n  var r={c:'',m:0,t:0,n:0,h:'',e:''};\n  try{\n    var a=arg||{};\n    var b=String(a.b==null?'':a.b),i=String(a.i==null?'':a.i);\n    var p=Number(a.p)||0,cnt=Number(a.n)||FQ_CMT_CNT,cur=String(a.c==null?'':a.c);\n    if(!b||!i){r.e='arg';return JSON.stringify(r);}\n    var res=FQ_cmtFetch(sv,b,i,p,cnt,cur);\n    if(!res.ok){r.e='http';return JSON.stringify(r);}\n    r.t=res.total;\n    if(res.list.length){\n      r.c=res.cursor;r.m=res.more?1:0;r.n=res.list.length;r.h=FQ_cmtRows(res.list);\n      if(!r.c||r.c===cur)r.m=0;\n      return JSON.stringify(r);\n    }\n    var n=Number(cur);\n    if(n>=150&&n<200){\n      var r2=FQ_cmtFetch(sv,b,i,p,cnt,'149');\n      if(r2.ok&&r2.list.length){\n        r.t=r2.total||r.t;r.c='200';r.m=r2.more?1:0;r.n=r2.list.length;r.h=FQ_cmtRows(r2.list);\n        return JSON.stringify(r);\n      }\n      var r3=FQ_cmtFetch(sv,b,i,p,cnt,'200');\n      if(r3.ok&&r3.list.length){\n        r.t=r3.total||r.t;r.c=r3.cursor;r.m=r3.more?1:0;r.n=r3.list.length;r.h=FQ_cmtRows(r3.list);\n        if(!r.c)r.m=0;\n        return JSON.stringify(r);\n      }\n    }\n    r.c=cur;r.m=0;\n    return JSON.stringify(r);\n  }catch(e){r.e='err';return JSON.stringify(r);}\n}\n// 生成 preloadJs：把面板 HTML 当 JS 字符串带进页面，接上「滚到底自动续拉」。\n// 只用 JS_INJECTION 已经建好的 run()（回调书源 JS），别的一概不碰。\nfunction FQ_panelBoot(st,t,html){\n  var B={b:String(st.bookId),i:String(st.itemId),p:Number(st.paraIndex)||0,\n    c:String(st.cursor||''),n:FQ_CMT_CNT,m:st.more?1:0,t:Number(st.total)||0,x:FQ_CMT_MAX};\n  var s='';\n  s+='var __H='+FQ_jsLit(html)+';';\n  s+='var __B='+JSON.stringify(B)+';';\n  s+='var __busy=false,__seen={},__shown=0,__ls=null;';\n  s+='function __foot(x){var d=document.getElementById(\"fqld\");if(d)d.textContent=x;}';\n  s+='function __lab(){'\n    +'var n=\"已显示 \"+__shown+\" 条\";'\n    +'if(__B.t)n+=\" / 共 \"+__B.t+\" 条\";'\n    +'if(!__B.m)return (__B.t>__shown)?(\"— \"+n+\"（服务端只放出这些）—\"):(\"— \"+n+\" —\");'\n    +'return n+\"，继续上滑加载更多\";}';\n  s+='function __near(){'\n    +'var h=window.innerHeight||document.documentElement.clientHeight||0;'\n    +'var y=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;'\n    +'var sh=Math.max(document.documentElement.scrollHeight||0,document.body.scrollHeight||0);'\n    +'return (y+h)>=(sh-360);}';\n  s+='function __pull(){'\n    +'if(__busy)return;'\n    +'if(!__B.m){__foot(__lab());return;}'\n    +'__busy=true;__foot(\"正在加载更多…\");'\n    +'run(\"FQ_cmtNext(source,\"+JSON.stringify(__B)+\")\").then(function(v){'\n      +'var r=null;try{r=JSON.parse(String(v));}catch(e0){r=null;}'\n      +'if(r&&r.h){'\n        +'var box=document.createElement(\"div\");box.innerHTML=r.h;'\n        +'var arr=box.getElementsByClassName(\"it\"),list=[];'\n        +'for(var i=0;i<arr.length;i++)list.push(arr[i]);'\n        +'for(var i=0;i<list.length;i++){'\n          +'if(__shown>=__B.x)break;'\n          +'var k=list[i].getAttribute(\"data-k\");'\n          +'if(k){if(__seen[k])continue;__seen[k]=1;}'\n          +'__ls.appendChild(list[i]);__shown++;'\n        +'}'\n        +'__faces();'\n        +'__B.c=r.c||__B.c;__B.m=r.m?1:0;if(r.t)__B.t=r.t;'\n      +'}'\n      +'__busy=false;'\n      +'__foot(__lab());'\n      +'if(__B.m&&__near())setTimeout(__pull,60);'\n    +'},function(e1){__busy=false;__foot(\"加载失败，继续上滑可重试\");});'\n  +'}';\n  s+='function __on(){if(__near())__pull();}';\n  s+='function __faces(){'\n    +'try{'\n    +'var ps=document.querySelectorAll(\"img.p\");'\n    +'for(var i=0;i<ps.length;i++){'\n      +'var im=ps[i];'\n      +'if(im.getAttribute(\"data-done\"))continue;'\n      +'im.setAttribute(\"data-done\",\"1\");'\n      +'var u=im.getAttribute(\"data-av\");'\n      +'if(!u)continue;'\n      +'(function(img,url){'\n        +'fetch(url).then(function(r){return r.blob();})'\n      +'.then(function(b){return (window.heic2any?window.heic2any({blob:b,toType:\"image/jpeg\"}):Promise.reject(\"no-dec\"));})'\n      +'.then(function(cv){'\n        +'try{'\n          +'if(Array.isArray(cv))cv=cv[0];'\n          +'if(!cv)return;'\n          +'if(cv.toDataURL){img.src=cv.toDataURL(\"image/jpeg\");return;}'\n          +'var fr=new FileReader();'\n          +'fr.onload=function(){try{img.src=fr.result;}catch(e){}};'\n          +'fr.onerror=function(){};'\n          +'fr.readAsDataURL(cv);'\n        +'}catch(e){}'\n      +'})'\n      +'.catch(function(e){});'\n      +'})(im,u);'\n    +'}'\n    +'}catch(e){}'\n  +'}';\n  s+='function __init(){'\n    +'__ls=document.getElementById(\"fqls\");'\n    +'if(!__ls)return;'\n    +'var pre=__ls.getElementsByClassName(\"it\");'\n    +'for(var i=0;i<pre.length;i++){var k=pre[i].getAttribute(\"data-k\");if(k)__seen[k]=1;__shown++;}'\n    +'window.addEventListener(\"scroll\",__on,{passive:true});'\n    +'document.addEventListener(\"scroll\",__on,{passive:true});'\n    +'setInterval(__on,900);'\n    +'__foot(__lab());'\n    +'__faces();'\n    +'if(__B.m&&__near())setTimeout(__pull,120);'\n  +'}';\n  s+='try{'\n    +'document.write(__H);'\n    +'window.__FQ_PANEL=1;'\n    +'setTimeout(__init,0);'\n  +'}catch(e2){'\n    +'var f=document.getElementById(\"fqfb\");'\n    +'if(f){f.style.display=\"block\";f.textContent=\"段评面板出错：\"+e2;'\n    +'try{document.body.insertBefore(f,document.body.firstChild);}catch(e3){}}'\n  +'}';\n  return s;\n}\n", "lastUpdateTime": "1792121557536", "loginUi": "[{\"name\": \"💬 段评气泡（点击开关）\", \"type\": \"button\", \"action\": \"fqCycle()\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"background\": \"#1565c0\", \"borderRadius\": \"6px\"}}, {\"name\": \"📊 查看当前设置\", \"type\": \"button\", \"action\": \"fqState()\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"background\": \"#37474f\", \"borderRadius\": \"6px\"}}]", "loginUrl": "function fqModeGet() { var v = String(source.getVariable() || ''); var p = v.split('fqidea='); if (p.length >= 2) { var n = Number(String(p[1]).charAt(0)); if (!isNaN(n)) return n > 0 ? 1 : 0; } if (v.indexOf('idea=1') >= 0) return 1; return 0; }\nfunction fqModeName(m) { return m > 0 ? '段评气泡：已开启，点段落末尾的红色气泡看评论' : '段评气泡：已关闭'; }\nfunction fqCycle() { var n = fqModeGet() > 0 ? 0 : 1; source.setVariable('fqidea=' + n); java.longToast(fqModeName(n) + '，重新打开章节生效'); }\nfunction fqState() { java.longToast(fqModeName(fqModeGet())); }\nfunction login() { }\n", "respondTime": 12449, "ruleBookInfo": {"author": "$.author", "coverUrl": "$.coverUrl", "init": "@js:(function(){var m=String(baseUrl).match(/([0-9]{15,})/);var bid=m?m[1]:'';if(!bid){throw new Error('无效书籍ID');}return FQ_detailInit(java,source,bid);})()", "intro": "$.intro", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name", "tocUrl": "$.tocUrl", "wordCount": "$.wordCount"}, "ruleContent": {"content": "@js:(function(){var m=String(baseUrl).match(/([0-9]{15,})/);var bid=m?m[1]:'';var m2=String(baseUrl).match(/#([0-9]+)$/);var item=m2?m2[1]:'';if(!item){throw new Error('参数错误');}var pool=FQ_ensure(source,2);if(!pool.length){throw new Error('设备池为空，请重试');}var dev=pool[0].d,iid=pool[0].i;var txt='';try{var t=FQ_dhGet(java,item,dev,iid);if(t&&t.length>30){txt=t;}}catch(e){}if(!txt&&bid){var res=FQ_cmGet(java,bid,[item],dev,iid);txt=res[item]||'';}if(!txt){throw new Error('正文获取失败，请重试');}try{if(FQ_ideaMode(source)>0){var ideas=FQ_ideas(source,item);txt=FQ_attachIdeas(txt,ideas,bid,item);}}catch(e){}return txt;})()"}, "ruleExplore": {"author": "$.author", "bookList": "@js:(function(){var u=String(baseUrl||'');var pg=(typeof page!=='undefined'&&page)?page:1;var l=[];var mr=u.match(/[?&]t=rank[^&]*/);if(mr){var mc=u.match(/[?&]cat=([0-9]+)/);var ma=u.match(/[?&]algo=([0-9]+)/);var cat=mc?mc[1]:'0';var algo=ma?ma[1]:'101';l=FQ_pickBooks(java,source,cat,algo,pg);}else{var mt=u.match(/[?&]tt=([0-9]+)/);if(mt){l=FQ_tabBooks(java,source,mt[1],pg);}else{l=FQ_homeList(java,source);}}var out=[];for(var i=0;i<l.length;i++){out.push(JSON.stringify(l[i]));}return out;})()", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "name": "$.name"}, "ruleSearch": {"author": "$.author", "bookList": "@js:(function(){\n  // 作品ID搜索渠道：输入 id:1234567890123456789 或 纯 15-20 位数字\n  var s0='';\n  try{\n    var mq=String(baseUrl).match(/[?&]q=([^&]*)/);\n    if(mq){s0=decodeURIComponent(mq[1]);}\n  }catch(e){}\n  s0=String(s0).replace(/^\\s+|\\s+$/g,'');\n  var idv='';\n  if(/^id[:：]\\s*[0-9]{1,20}$/i.test(s0)){\n    idv=s0.replace(/^id[:：]\\s*/i,'');\n  }else if(/^[0-9]{15,20}$/.test(s0)){\n    idv=s0;\n  }\n  if(idv){\n    var one=null;\n    try{one=FQ_bookById(java,source,idv);}catch(e){one=null;}\n    if(one){return [JSON.stringify(one)];}\n    return [];\n  }\n  var items=[];\n  try{\n    var d=JSON.parse(String(result));\n    items=(d.data&&d.data.ret_data)?d.data.ret_data:[];\n  }catch(e){items=[];}\n  if(items.length===0){\n    var kw='';\n    var off=0;\n    try{\n      var m=String(baseUrl).match(/[?&]q=([^&]*)/);\n      if(m){kw=decodeURIComponent(m[1]);}\n      var mo=String(baseUrl).match(/[?&]offset=(\\d+)/);\n      if(mo){off=parseInt(mo[1],10)||0;}\n    }catch(e){}\n    if(kw||off===0){\n      var u=String(baseUrl).replace('aid=13','aid=1967');\n      var alt=[];\n      if(u!==String(baseUrl)){\n        try{\n          var d2=JSON.parse(String(java.ajax(u)));\n          alt=(d2.data&&d2.data.ret_data)?d2.data.ret_data:[];\n        }catch(e){alt=[];}\n      }\n      for(var j=0;j<alt.length;j++){\n        var t2=String(alt[j].title||'').split('<em>').join('').split('</em>').join('');\n        var a2=String(alt[j].author||'');\n        if(kw&&t2.indexOf(kw)<0&&a2.indexOf(kw)<0){continue;}\n        items.push(alt[j]);\n      }\n    }\n  }\n  var out=[];\n  for(var i=0;i<items.length;i++){\n    var it=items[i];\n    var t=String(it.title||'').split('<em>').join('').split('</em>').join('');\n    out.push(JSON.stringify({name:t,author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+String(it.book_id)}));\n  }\n  return out;\n})()", "bookUrl": "$.bookUrl", "checkKeyWord": "十日终焉", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "name": "$.name"}, "ruleToc": {"chapterList": "@js:(function(){\n  var m=String(baseUrl).match(/([0-9]{15,})/);\n  var bid=m?m[1]:'';\n  if(!bid){throw new Error('无效书籍ID');}\n  var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';\n  var raw=FQ_api(java,source,'/reading/bookapi/directory/all_items/v','book_type=0&item_data_list_md5=&catalog_data_md5=&book_id='+bid+'&book_info_md5=&need_version=true&'+base);\n  var d=JSON.parse(raw);\n  var dd=d.data||{};\n  var dd2=(dd&&dd.data)?dd.data:dd;\n  function GV(n){var v=dd[n];if(v!==undefined&&v!==null)return v;return dd2[n];}\n  var out=[],seen={},volShown=false;\n  function vid(c){return String(c.itemId||c.item_id||c.chapter_id||c.id||c.catalog_id||'');}\n  function vtitle(c,idx){return String(c.title||c.chapter_title||c.catalog_title||c.name||('第'+(idx+1)+'章'));}\n  function emitVol(vol){vol=String(vol||'').trim();if(vol&&vol!=='正文'&&!seen[vol]){seen[vol]=1;volShown=true;out.push(JSON.stringify({name:vol,url:'',isVolume:true}));}}\n  function emitCh(c,idx){var id=vid(c);if(!id)return;out.push(JSON.stringify({name:vtitle(c,idx),url:'https://fanqienovel.com/page/'+bid+String.fromCharCode(35)+id,isVolume:false}));}\n  function finish(arr){if(!volShown&&arr.length){arr.unshift(JSON.stringify({name:'第一卷：默认',url:'',isVolume:true}));}return arr;}\n  // 卷名：优先 chapterListWithVolume（真实分卷）；兼容 d.data 与 d.data.data 两层嵌套\n  var grouped=GV('chapterListWithVolume');\n  var cats=GV('item_data_list');if(!cats||!cats.length)cats=GV('catalog_data')||[];\n  if(Array.isArray(grouped)&&grouped.length){\n    var flatHasVol=false;\n    for(var k=0;k<cats.length;k++){var v=String(cats[k].volume_name||cats[k].volumeName||'').trim();if(v&&v!=='正文'){flatHasVol=true;break;}}\n    if(!flatHasVol){\n      for(var g=0;g<grouped.length;g++){\n        var vol=grouped[g],chs=null,defV='';\n        if(Array.isArray(vol)){chs=vol;if(chs[0])defV=String(chs[0].volume_name||chs[0].volumeName||'').trim();}\n        else if(vol&&typeof vol==='object'){defV=String(vol.volume_name||vol.volumeName||'').trim();chs=vol.chapterList||vol.chapter_list||vol.chapters||vol.item_data_list||[];}\n        else continue;\n        if(!chs||!chs.length)continue;\n        for(var i=0;i<chs.length;i++){\n          var c=chs[i];\n          var cv=String(c.volume_name||c.volumeName||'').trim();\n          emitVol(cv||defV);\n          emitCh(c,i);\n        }\n      }\n      if(out.length)return finish(out);\n    }\n  }\n  // 扁平回退：直接读 item_data_list / catalog_data 每章 volume_name\n  if(!cats.length){throw new Error('本书没有可读文本目录（可能是听书专辑/漫画/已下架），请换源');}\n  for(var i=0;i<cats.length;i++){var c=cats[i];emitVol(c.volume_name||c.volumeName);emitCh(c,i);}\n  return finish(out);\n})()", "chapterName": "$.name", "chapterUrl": "$.url", "isVolume": "$.isVolume"}, "searchUrl": "https://api.fanqiesdk.com/api/novel/channel/homepage/search/search/v1/?q={{key}}&offset={{ (page - 1) * 10 }}&enterfrom_aid=&enter_from=inner_search&app_name=news_article&version_name=7.0.8&app_version=7.0.8&channel=tt_huawei2019_yz&version_code=708&device_platform=android&parent_enterfrom=novel_list&novel_host=&aid=13&scm_version=1.0.0.4112&device_type=25053RT47C&device_brand=Redmi&language=zh&os_api=35&os_version=15&openudid=0123456789abcdef&update_version_code=70899&plugin=0&tma_jssdk_version=1.10.0.0&rom_version=miui__os2.0.209.0.volcnxm", "weight": 0},{"bookSourceName": "书豪小说网", "bookSourceGroup": "小说", "bookSourceType": 0, "bookSourceUrl": "https://www.shuhaoxs.com/", "bookUrlPattern": "https://www\\.shuhaoxs\\.com/book/[0-9a-z]+\\.html", "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "customOrder": 0, "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13; 2211133C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36\"}", "concurrentRate": "", "loginUrl": "", "loginUi": "", "loginCheckJs": "", "jsLib": "", "bookSourceComment": "书豪小说网 shuhaoxs.com。站点已故意移除站内搜索（搜索框 onclick 跳外部 rrssk.com，index.php 只有 askBook/addBookshelf/list 三个 action，list 页不接受 wd/key/search 参数）→ searchUrl 无法实现，只能靠发现页浏览。正文/目录/详情/发现均已实测通过。", "variableComment": "", "coverDecodeJs": "", "eventListener": false, "customButton": false, "exploreUrl": "排行榜::https://www.shuhaoxs.com/rank{{page - 1 == 0 ? '.html' : '-' + page + '.html'}}\n玄幻小说::https://www.shuhaoxs.com/list-4{{page == 1 ? '/' : '-' + page + '/'}}\n奇幻小说::https://www.shuhaoxs.com/list-5{{page == 1 ? '/' : '-' + page + '/'}}\n武侠小说::https://www.shuhaoxs.com/list-6{{page == 1 ? '/' : '-' + page + '/'}}\n仙侠小说::https://www.shuhaoxs.com/list-7{{page == 1 ? '/' : '-' + page + '/'}}\n都市小说::https://www.shuhaoxs.com/list-8{{page == 1 ? '/' : '-' + page + '/'}}\n军事小说::https://www.shuhaoxs.com/list-9{{page == 1 ? '/' : '-' + page + '/'}}\n历史小说::https://www.shuhaoxs.com/list-10{{page == 1 ? '/' : '-' + page + '/'}}\n游戏小说::https://www.shuhaoxs.com/list-11{{page == 1 ? '/' : '-' + page + '/'}}\n体育小说::https://www.shuhaoxs.com/list-12{{page == 1 ? '/' : '-' + page + '/'}}\n科幻小说::https://www.shuhaoxs.com/list-13{{page == 1 ? '/' : '-' + page + '/'}}\n诸天无限::https://www.shuhaoxs.com/list-14{{page == 1 ? '/' : '-' + page + '/'}}\n悬疑小说::https://www.shuhaoxs.com/list-15{{page == 1 ? '/' : '-' + page + '/'}}\n古代言情::https://www.shuhaoxs.com/list-16{{page == 1 ? '/' : '-' + page + '/'}}\n仙侠奇缘::https://www.shuhaoxs.com/list-17{{page == 1 ? '/' : '-' + page + '/'}}\n现代言情::https://www.shuhaoxs.com/list-18{{page == 1 ? '/' : '-' + page + '/'}}\n浪漫青春::https://www.shuhaoxs.com/list-19{{page == 1 ? '/' : '-' + page + '/'}}\n玄幻言情::https://www.shuhaoxs.com/list-20{{page == 1 ? '/' : '-' + page + '/'}}\n悬疑推理::https://www.shuhaoxs.com/list-21{{page == 1 ? '/' : '-' + page + '/'}}\n科幻空间::https://www.shuhaoxs.com/list-22{{page == 1 ? '/' : '-' + page + '/'}}\n游戏竞技::https://www.shuhaoxs.com/list-23{{page == 1 ? '/' : '-' + page + '/'}}\n短篇言情::https://www.shuhaoxs.com/list-24{{page == 1 ? '/' : '-' + page + '/'}}\n轻小说::https://www.shuhaoxs.com/list-42{{page == 1 ? '/' : '-' + page + '/'}}\n原生幻想::https://www.shuhaoxs.com/list-25{{page == 1 ? '/' : '-' + page + '/'}}\n恋爱日常::https://www.shuhaoxs.com/list-26{{page == 1 ? '/' : '-' + page + '/'}}\n衍生同人::https://www.shuhaoxs.com/list-27{{page == 1 ? '/' : '-' + page + '/'}}\n搞笑吐槽::https://www.shuhaoxs.com/list-28{{page == 1 ? '/' : '-' + page + '/'}}", "exploreScreen": "", "searchUrl": "{{java.log('SEARCH-TOAST-FIRED'); java.toast('本书源不支持搜索：请复制小说详情页网址，用「添加网址」加入书籍'); 'https://www.shuhaoxs.com/index.php?action=book'}}", "ruleSearch": {"bookList": "", "name": "", "author": "", "kind": "", "wordCount": "", "lastChapter": "", "intro": "", "coverUrl": "", "bookUrl": "", "updateTime": "", "checkKeyWord": "沙雕只是保护色"}, "ruleExplore": {"bookList": "class.dList@tag.li||class.rankIBox@class.list@tag.li", "name": "class.name.0@tag.a.0@text", "author": "class.info.0@class.dlS.0@tag.dd@text", "kind": "", "wordCount": "", "lastChapter": "class.dlS.1@tag.dd@text##\\s+## ", "intro": "class.intro@text##\\s+## ", "coverUrl": "class.pic@tag.img@src", "bookUrl": "class.name.0@tag.a.0@href", "updateTime": ""}, "ruleBookInfo": {"init": "", "name": "@css:meta[property=og:novel:book_name]@content", "author": "@css:meta[property=og:novel:author]@content", "kind": "@css:meta[property=og:novel:category]@content", "wordCount": "", "lastChapter": "@css:meta[property=og:novel:latest_chapter_name]@content", "intro": "class.intro.0@text", "coverUrl": "{{@@class.pic.0@tag.img@src}}", "tocUrl": "", "updateTime": "@css:meta[property=og:novel:update_time]@content", "canReName": "", "downloadUrls": ""}, "ruleToc": {"chapterList": "@js:(function(){var s=String(result);var id='';var m1=/\\/chapter\\/([0-9A-Za-z]+)\\.html/.exec(String(baseUrl));if(m1){id=m1[1];}if(!id){var m2=/\\/book\\/([0-9A-Za-z]+)-\\d+\\.html/.exec(String(baseUrl));if(m2){id=m2[1];}}if(!id){var m3=/\\/book\\/([0-9A-Za-z]+)\\.html/.exec(String(baseUrl));if(m3){id=m3[1];}}if(!id){var m4=/\\/chapter\\/([0-9A-Za-z]+)\\.html/.exec(s);if(m4){id=m4[1];}}if(!id){var m5=/\\/book\\/([0-9A-Za-z]+)-\\d+\\.html/.exec(s);if(m5){id=m5[1];}}if(!id){return [];}var map={};function add(url,name){if(url&&name){if(!map[url]){map[url]=name;}}}var re=/<li>\\s*<a href=\"(\\/book\\/[0-9A-Za-z]+-\\d+\\.html)\">([^<]+)<\\/a>\\s*<\\/li>/g,g;while((g=re.exec(s))!=null){add(g[1],g[2]);}var max=0,r2=/-([0-9]+)\\.html/g,h;while((h=r2.exec(s))!=null){var v=parseInt(h[1],10);if(v>max){max=v;}}if(max>100){var last=Math.ceil(max/100);if(last>30){last=30;}var OB=String.fromCharCode(123),CB=String.fromCharCode(125),Q=String.fromCharCode(34);var c=java.createSymmetricCrypto('AES/CBC/PKCS5Padding','c5qYWt3ej45bbLVu1lkVnMYhfKc0uej9','7657385111503414');for(var p=2;p<=last;p++){try{var payload=OB+Q+'id'+Q+':'+Q+id+Q+','+Q+'page'+Q+':'+p+CB;var e=java.encodeURI(String(c.encryptBase64(payload)));var raw=String(java.ajax('https://www.shuhaoxs.com/index.php?action=loadChapterPage&data='+e+',{\"method\":\"POST\",\"body\":\"data='+e+'\"}'));var o=JSON.parse(raw);if(o&&o.data){for(var i=0;i<o.data.length;i++){add(o.data[i].chapterurl,o.data[i].chaptername);}}}catch(err){java.log('api page '+p+' fail '+err);}}}var need=false,stamp=0,old='';try{old=String(source.get('_tocEnum_'+id));}catch(e0){old='';}if(old){var pp=old.split('|');if(pp.length>1){stamp=parseInt(pp[1],10)||0;}}var nowMs=new Date().getTime();if(max>100&&(nowMs-stamp>43200000)){need=true;}if(need){var cnt=0,guard=0;for(var q=101;q<=max&&guard<250;q++){var ku='/book/'+id+'-'+q+'.html';if(map[ku]){continue;}guard++;try{var ph=String(java.ajax('https://www.shuhaoxs.com/book/'+id+'-'+q+'.html'));var pm=/<title>([^<]*)<\\/title>/.exec(ph);var pn=pm?String(pm[1]).split('|')[0].replace(/^\\s+|\\s+$/g,''):'';if(!pn||pn.indexOf('书豪小说网')>=0){pn='第'+q+'章';}map[ku]=pn;cnt++;}catch(pe){java.log('enum '+q+' fail '+pe);}}try{var parts=[];for(var uu in map){parts.push(uu+'>'+map[uu]);}source.put('_tocEnum_'+id,'v2|'+nowMs+'|'+parts.join('\\n'));}catch(e3){java.log('cache save fail '+e3);}java.log('ENUM done new='+cnt+' guard='+guard);}else if(old.indexOf('v2|')===0){var body2=old.substring(old.indexOf('|',old.indexOf('|')+1)+1);var rows=body2.split('\\n'),added=0;for(var r=0;r<rows.length;r++){var line=rows[r];if(!line){continue;}var gt=line.indexOf('>');if(gt<0){continue;}var u2=line.substring(0,gt),n2=line.substring(gt+1);if(u2&&!map[u2]){map[u2]=n2;added++;}}java.log('ENUM cache-hit restored='+added+' age='+(nowMs-stamp));}else{java.log('ENUM cached age='+(nowMs-stamp));}var order=[];for(var u in map){order.push({u:u,n:map[u]});}order.sort(function(a,b){var x=/-([0-9]+)\\.html$/.exec(a.u),y=/-([0-9]+)\\.html$/.exec(b.u);return (x?parseInt(x[1],10):0)-(y?parseInt(y[1],10):0);});var out=[];for(var k=0;k<order.length;k++){out.push('<li><a href=\"'+order[k].u+'\">'+order[k].n+'</a></li>');}java.log('CL id='+id+' total='+out.length+' max='+max);return out;})()", "chapterName": "@@tag.a@text", "chapterUrl": "@@tag.a@href", "nextTocUrl": "", "isVolume": "", "isVip": "", "isPay": "", "updateTime": "", "preUpdateJs": "", "formatJs": ""}, "ruleContent": {"content": "@js:(function(){var s=String(result);var m=/<div class=\"content\">([\\s\\S]*?)<\\/div>/.exec(s);if(m){s=m[1];}s=s.replace(/<br\\s*\\/?>/gi,String.fromCharCode(10)).replace(/<\\/p>/gi,String.fromCharCode(10)).replace(/<[^>]+>/g,'').replace(/&nbsp;/g,' ').replace(/&amp;/g,'&');var L=s.split(/\\r?\\n/),o=[],i,l,j,had,k;var KW=['书豪小说网','专注提供最舒适的阅读体验','探索原生幻想','分类导航','抢先更新','独家首发','诚意奉献','新作来袭','精彩不容错过','全本放送','推荐阅读','人人书库','欢迎访问','您喜欢的','喜欢的原生幻想','我们都有','APP，访问','APP，请','使用“人人书库”'];var SAFE=['shuhaoxs.com','github.com','github.io','gitlab.com','stackoverflow.com','baidu.com','google.com','gmail.com','youtube.com','wikipedia.org','qq.com','weibo.com','bilibili.com','zhihu.com','douban.com','tieba.com','163.com','126.com','sina.com','sohu.com','ifeng.com','cnblogs.com','taobao.com','tmall.com','jd.com','alipay.com','alibaba.com','aliyun.com','wechat.com','tencent.com','xiaomi.com','huawei.com','mi.com','microsoft.com','apple.com','amazon.com','netflix.com','spotify.com','twitter.com','facebook.com','instagram.com','whatsapp.com','telegram.org','openai.com','cloudflare.com','mozilla.org','python.org','nodejs.org','npmjs.com','jetbrains.com','adobe.com','intel.com','nvidia.com','amd.com'];var BAD=/(^|[^A-Za-z0-9_.-])((?:[A-Za-z0-9][A-Za-z0-9_-]{4,61}\\.)+(?:com|net|org|cc|cn|la|top|xyz|vip|me|info|biz|tv|co|io|us|pw|site|online|shop|fun|live|club))(?![.\\/:A-Za-z0-9_-])/gi;function cjk(c){return (c>=0x2018&&c<=0x201d)||(c>=0x3000&&c<=0x303f)||(c>=0x4e00&&c<=0x9fff)||(c>=0xff00&&c<=0xffef)||c===0x2026||c===0x2014||c===0x22||c===0x27;}for(i=0;i<L.length;i++){l=L[i].replace(/^\\s+|\\s+$/g,'');if(l.length<1){continue;}var hold=[],sd;for(sd=0;sd<SAFE.length;sd++){var sr=new RegExp('(?:[A-Za-z0-9_-]+\\\\.)*'+SAFE[sd].replace(/\\\\./g,'\\\\.'),'gi');l=l.replace(sr,function(mm){hold.push(mm);return String.fromCharCode(1)+(hold.length-1)+String.fromCharCode(2);});}for(k=0;k<8;k++){var t=l.replace(BAD,'$1');if(t===l){break;}l=t;}l=l.replace(new RegExp(String.fromCharCode(1)+'(\\\\d+)'+String.fromCharCode(2),'g'),function(mm,ix){return hold[+ix];});var out2='',ci,pr,nx;for(ci=0;ci<l.length;ci++){var ch=l.charAt(ci);if(ch===' '||ch==='\\t'){pr=out2.length?out2.charCodeAt(out2.length-1):0;nx=(ci+1<l.length)?l.charCodeAt(ci+1):0;if(cjk(pr)&&cjk(nx)){continue;}}out2+=ch;}l=out2.replace(/^[ \\t]+|[ \\t]+$/g,'').replace(/[ \\t]{2,}/g,' ');l=l.replace(/[\\uFF08(]\\s*[\\uFF09)]|[\\u300A\\u3008]\\s*[\\u300B\\u3009]/g,'');if(l.length<1){continue;}had=false;for(j=0;j<KW.length;j++){if(l.indexOf(KW[j])>=0){had=true;break;}}if(had){continue;}o.push(l);}return o.join(String.fromCharCode(10));})()", "replaceRegex": "", "nextContentUrl": "@css:.btnW.font16 a:contains(下一页)@href", "webJs": "", "subContent": "", "title": "", "sourceRegex": "", "imageStyle": "", "imageDecode": "", "payAction": "", "callBackJs": ""}, "lastUpdateTime": "1792064756811"},{"bookSourceComment": "//2026-10-15 修复：1) 目录排序改用「分卷閱讀N」真实序号，修复章节错乱；2) 正文 AES 解密取全量内容，修复缺字缺段；3) 目录 URL 逐个实测 data-cata 源站，修复首选源失效导致缺章；4) 目录翻页按 第X/Y頁 自拼下一页，修复超长目录缺章\n//修复目录：详情页取 data-cata；目录页按 li 的隐藏序号排序，并解码 a 的 Base64 链接\nhttps://www.lanlanbo.com\nhttps://www.gosealib.com/\nhttps://www.haitangss.com/\nhttps://www.sadseas.com/", "bookSourceGroup": "", "bookSourceName": "海棠搜书🔞蓝海搜书", "bookSourceType": 0, "bookSourceUrl": "https://www.lanlanbo.com", "customButton": false, "customOrder": -1, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "言情::/s/new/言情/{{page}}/\n耽美::/s/耽美/{{page}}/\n同人::/s/同人/{{page}}/\n综合::/s/综合/{{page}}/\nP018::/s/new/PO18/{{page}}/\n都市::/s/都市/{{page}}/\n现言::/s/现言/{{page}}/\n古言::/s/new/古言/{{page}}/\n轻小说::/s/轻小说/{{page}}/\n原创::/s/原创小说/{{page}}/\n科幻::/s/科幻/{{page}}/\n仙侠::/s/仙侠/{{page}}/\n奇幻::/s/奇幻/{{page}}/\n玄幻::/s/玄幻/{{page}}/\n衍生::/s/同人衍生/{{page}}/\n古代::/s/古代/{{page}}/\n现代::/s/现代/{{page}}/\n男性::/s/男男/{{page}}/\n女性::/s/女女/{{page}}/\n励志::/s/励志/{{page}}/\n清水::/s/清水/{{page}}/\n甜文::/s/甜文/{{page}}/\n校园::/s/校园/{{page}}/\n职场::/s/职场/{{page}}/\n种田::/s/种田/{{page}}/\n年下::/s/年下/{{page}}/\nABO::/s/ABO/{{page}}/\n1V1::/s/1V1/{{page}}/\n腹黑::/s/腹黑/{{page}}/\nNP::/s/new/NP/{{page}}/\n美人::/s/美人/{{page}}/\nBL::/s/BL/{{page}}/\n情欲::/s/情欲/{{page}}/\n百合::/s/百合/{{page}}/\n强强::/s/强强/{{page}}/\n爽文::/s/爽文/{{page}}/\n狗血::/s/狗血/{{page}}/\n娱乐圈::/s/娱乐圈/{{page}}/\n快穿::/s/快穿/{{page}}/", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36\"\n}", "lastUpdateTime": "1792034043102", "respondTime": 180000, "ruleBookInfo": {"author": ".b@text", "coverUrl": "class.BGsectionOne-top-left@img@src", "intro": "id.intro@html", "kind": ".category@a@text", "lastChapter": "class.newestChapter@a@text", "name": ".title@text", "tocUrl": "@js:(function(){var s=String(result),re=/data-cata=[\"']([^\"']+)[\"']/g,m,urls=[],seen={};while((m=re.exec(s))){var u=m[1].replace(/&amp;/g,'&');var q=u.match(/[?&]u=([^&]+)/);if(q){try{u=decodeURIComponent(q[1]);}catch(e){u=q[1];}}if(/^https?:\\/\\//i.test(u)&&!seen[u]){seen[u]=1;urls.push(u);}}if(!urls.length)return '';for(var i=0;i<urls.length&&i<5;i++){try{var b=String(java.ajax(urls[i]));if(b.indexOf('BCsectionTwo-top-chapter')>=0)return urls[i];}catch(e){}}return urls[0];})()"}, "ruleContent": {"content": "@js:(function(){function clean(s){s=String(s||'');s=s.replace(/<script[\\s\\S]*?<\\/script>/gi,'').replace(/<style[\\s\\S]*?<\\/style>/gi,'');s=s.replace(/<br\\s*\\/?\\s*>/gi,'\\n').replace(/<\\/p>/gi,'\\n').replace(/<[^>]+>/g,'');s=s.replace(/&nbsp;|&emsp;/g,' ').replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&quot;/g,'\"').replace(/&#39;|&apos;/g,\"'\").replace(/&amp;/g,'&');s=s.replace(/[^\\n]*(未(載入|载入|加载|加載)完|移[動动]流量|收藏[網网]址|多多收藏|廣告遮蔽|广告屏蔽|Loading)[^\\n]*/gi,'').replace(/www\\.[^\\n]*/g,'').replace(/[（(]＞人＜；?[）)]/g,'');return s.replace(/\\r/g,'').replace(/[ \\t]+\\n/g,'\\n').replace(/\\n{3,}/g,'\\n\\n').trim();}var h=String(result);if(h.indexOf('RBGsectionThree-content')<0&&typeof baseUrl!='undefined'){try{h=String(java.ajax(baseUrl));}catch(e){}}var m=h.match(/\\.html\\(d\\(\"([^\"]+)\"\\s*,\\s*\"([0-9a-fA-F]{32})\"\\)\\)/);if(m){try{var md5=String(java.md5Encode(m[2]));var JS=Packages.java.lang.String;var kb=new JS(md5.substring(16)).getBytes('UTF-8');var ib=new JS(md5.substring(0,16)).getBytes('UTF-8');var ct=java.base64DecodeToByteArray(m[1].replace(/\\\\/g,''));var c=Packages.javax.crypto.Cipher.getInstance('AES/CBC/PKCS5Padding');c.init(2,new Packages.javax.crypto.spec.SecretKeySpec(kb,'AES'),new Packages.javax.crypto.spec.IvParameterSpec(ib));var out=String(new JS(c.doFinal(ct),'UTF-8'));if(out&&out.length>50)return clean(out);}catch(err){}}var dm=h.match(/<div[^>]*class=[\"']RBGsectionThree-content[\"'][^>]*>([\\s\\S]*?)<\\/div>/i);return clean(dm?dm[1]:h);})()"}, "ruleExplore": [], "ruleSearch": {"author": "span[1]@a@title", "bookList": ".SHsectionThree-middle>p:nth-child(even)", "bookUrl": "span[0]@a@href", "checkKeyWord": "", "intro": "", "kind": "span[2]@a@title", "name": "span[0]@a@title"}, "ruleToc": {"chapterList": "+@js:(function(){var h=String(result),r=/<li[^>]*class=[\"'][^\"']*BCsectionTwo-top-chapter[^\"']*[\"'][^>]*>[\\s\\S]*?<\\/li>/gi,m,o=[],idx=0;while((m=r.exec(h))){var x=m[0],ord,v=x.match(/分卷[閱阅]讀\\s*(\\d+)/);if(v){ord=parseInt(v[1]);}else{var li=(x.match(/^<li[^>]*>/i)||[''])[0],mm,nr=/data-[^=]+=[\"'](\\d+)[\"']/g,last=-1;while((mm=nr.exec(li))){last=parseInt(mm[1]);}ord=last>=0?last+1:idx+1;}o.push({html:x,order:ord,idx:idx});idx++;}o.sort(function(a,b){return a.order===b.order?a.idx-b.idx:a.order-b.order});var out=typeof Packages!='undefined'?new Packages.java.util.ArrayList():[];for(var i=0;i<o.length;i++){out.add?out.add(o[i].html):out.push(o[i].html);}return out;})()", "chapterName": "@js:(function(){function e(s){return String(s||'').replace(/&amp;/g,'&').replace(/&quot;/g,'\\\"').replace(/&#39;/g,\"'\").replace(/&lt;/g,'<').replace(/&gt;/g,'>');}var s=String(result),a=(s.match(/<a[\\s\\S]*?>/i)||[''])[0],m,ar=/data-[^=]+=[\"']([^\"']*)[\"']/g;while((m=ar.exec(a))){var v=e(m[1]);if(v&&!/^[A-Za-z0-9+\\/]+={0,2}$/.test(v)&&!/^\\d+$/.test(v))return v;}m=s.match(/<a[\\s\\S]*?>([\\s\\S]*?)<\\/a>/i);return m?e(m[1].replace(/<[^>]+>/g,'').replace(/\\s+/g,' ').trim()):'';})()", "chapterUrl": "@js:(function(){function e(s){return String(s||'').replace(/&amp;/g,'&').replace(/&quot;/g,'\\\"').replace(/&#39;/g,\"'\").replace(/&lt;/g,'<').replace(/&gt;/g,'>');}function a(u,b){u=e(u);if(/^https?:\\/\\//i.test(u))return u;if(/^\\/\\//.test(u))return (String(b).match(/^(https?:)/i)||['https:'])[1]+u;var h=String(b||'').match(/^(https?:\\/\\/[^\\/]+)/i);if(u.charAt(0)=='/')return h?h[1]+u:u;return String(b||'').replace(/[?#].*$/,'').replace(/\\/[^\\/]*$/,'/')+u;}var s=String(result),b=typeof baseUrl!='undefined'?String(baseUrl):'',at=(s.match(/<a[\\s\\S]*?>/i)||[''])[0],m,ar=/data-[^=]+=[\"']([^\"']*)[\"']/g;while((m=ar.exec(at))){var v=e(m[1]);if(/^[A-Za-z0-9+\\/]+={0,2}$/.test(v)){try{var d=String(java.base64Decode(v));if(d&&/\\.html?(?:$|[?#])/.test(d))return a(d,b);}catch(err){}}}m=at.match(/href=[\"']([^\"']+)[\"']/i);return m?a(m[1],b):'';})()", "nextTocUrl": "@js:(function(){function a(u,b){u=String(u||'').replace(/&amp;/g,'&').replace(/&quot;/g,'\"').replace(/&#39;/g,\"'\");if(!u)return '';if(/^https?:\\/\\//i.test(u))return u;if(/^\\/\\//.test(u))return (String(b).match(/^(https?:)/i)||['https:'])[1]+u;var h=String(b||'').match(/^(https?:\\/\\/[^\\/]+)/i);if(u.charAt(0)=='/')return h?h[1]+u:u;return String(b||'').replace(/[?#].*$/,'').replace(/\\/[^\\/]*$/,'/')+u;}var h=String(result),b=typeof baseUrl!='undefined'?String(baseUrl):'',m=h.match(/<a[^>]+id=[\"']next[\"'][^>]+href=[\"']([^\"']+)[\"']/i)||h.match(/<a[^>]+href=[\"']([^\"']+)[\"'][^>]+id=[\"']next[\"']/i);if(m)return a(m[1],b);var p=h.match(/第\\s*<span>\\s*(\\d+)\\s*<\\/span>\\s*\\/\\s*<span>\\s*(\\d+)\\s*<\\/span>\\s*[頁页]/);if(p&&parseInt(p[1])<parseInt(p[2]))return b.replace(/catalog\\/[^\\/]*$/,'catalog/')+(parseInt(p[1])+1)+'.html';return '';})()"}, "searchUrl": "/s/{{key}}/{{page}}/", "weight": 0},{"bookSourceGroup": "自制,笔趣阁", "bookSourceName": "kk笔趣阁(http://www.kkbiquge.net)", "bookSourceType": 0, "bookSourceUrl": "http://www.kkbiquge.net", "searchUrl": "http://www.kkbiquge.net/modules/article/search.php?searchkey={{key}}", "bookUrlPattern": "http?:\\/\\/www\\.kkbiquge\\.net\\/\\d+\\/\\d+\\/", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": false, "lastUpdateTime": "1792000495363", "respondTime": 180000, "ruleBookInfo": {"name": "#info h1@text", "author": "#info p:nth-child(2)@text", "coverUrl": "#fmimg img@src", "intro": "#intro@text", "kind": "#info p:nth-child(1)@text", "lastChapter": "#info p:nth-child(4) a@text", "tocUrl": ""}, "ruleContent": {"content": "#content@html", "title": ".bookname h1@text", "replaceRegex": [["<script.*?</script>", ""], ["记住本书.*?小说", ""], ["www\\.kkbiquge\\.net", ""], ["\\s{2,}", "\n"]]}, "ruleExplore": [], "ruleSearch": {"bookList": "table tbody tr", "name": "td:nth-child(1) a@text", "author": "td:nth-child(3)@text", "coverUrl": "", "bookUrl": "td:nth-child(1) a@href", "lastChapter": "td:nth-child(2) a@text"}, "ruleToc": {"chapterList": "#list dl dd a", "chapterName": "ownText", "chapterUrl": "href", "nextTocUrl": ""}, "weight": 0},{"bookSourceComment": "不知为啥获取正文出问题了，修了一下\n记住本站发布页：https://8xsk.top ", "bookSourceGroup": "🔞", "bookSourceName": "八叉书库", "bookSourceType": 0, "bookSourceUrl": "https://bcshuku.com/", "bookUrlPattern": "https:\\/\\/bcshuku\\.com\\/novel\\d+\\/", "customButton": false, "customOrder": 28, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[\n{\"title\":\"分类\",\"url\":\"\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n{\"title\":\"长篇\",\"url\":\"/booklist1/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"综合\",\"url\":\"/booklist2/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"武侠\",\"url\":\"/booklist3/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"历史\",\"url\":\"/booklist4/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"都市\",\"url\":\"/booklist5/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"玄幻\",\"url\":\"/booklist6/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},   \n{\"title\":\"女生\",\"url\":\"/booklist7/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},   \n{\"title\":\"其他\",\"url\":\"/booklist8/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"现代\",\"url\":\"/booklist9/{{page-1}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"排行榜单\",\"url\":\"\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n{\"title\":\"热门排行\",\"url\":\"/popular/{{\n\tvar pjstr = 'index.html';\n\tif(page!=1)  pjstr='index_'+page+'.html';\n\tpjstr}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"最新更新\",\"url\":\"/latest/{{\n\tvar pjstr = 'index.html';\n\tif(page!=1)  pjstr='index_'+page+'.html';\n\tpjstr}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"最新入库\",\"url\":\"/release/{{\n\tvar pjstr = 'index.html';\n\tif(page!=1)  pjstr='index_'+page+'.html';\n\tpjstr}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"完本小说\",\"url\":\"/completed/{{\n\tvar pjstr = 'index.html';\n\tif(page!=1)  pjstr='index_'+page+'.html';\n\tpjstr}}\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}}\n]", "header": "{\"user-agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36 Edg/156.0.0.0\"}", "lastUpdateTime": "1791973651695", "respondTime": 180000, "ruleBookInfo": {"author": "//div[@class=\"info-chitiet\"]/span/a[@itemprop=\"author\"]/text()", "coverUrl": "//div[@class=\"book\"]/img/@src", "intro": "//div[@itemprop=\"description\"]/text()", "kind": "//div[@class=\"info-chitiet\"]/span/a[@itemprop=\"genre\"]/text()", "name": "//div[@class=\"col-xs-12 col-sm-8 col-md-8 desc\"]/h3/text()"}, "ruleContent": {"content": "#chapter-content@html"}, "ruleExplore": {"author": "//div[@class='caption']/div[@class=\"chi-tiet chuyen-muc\"]//text()", "bookList": "//div[@class=\"one-row\"]/div[@class=\"col-md-3 col-sm-6 col-xs-6 home-truyendecu\"]", "bookUrl": "//div[@class='caption']/a/@href", "coverUrl": "//div[@class='each_truyen']/a/img/@src", "lastChapter": "//div[@class='caption']/div[@class=\"chi-tiet tt-status\"]//small[@class=\"btn-xs label-primary\"]/text()", "name": "//div[@class='caption']/a/@title"}, "ruleSearch": {"bookList": "//div[@class=\"one-row\"]/div[@class=\"col-md-3 col-sm-6 col-xs-6 home-truyendecu\"]", "bookUrl": "//div[@class=\"each_truyen\"]/a/@href", "coverUrl": "//div[@class=\"each_truyen\"]/a/img/@src", "name": "//h3[@itemprop=\"name\"]/text()"}, "ruleToc": {"chapterList": "#list-chapter .list-chapter li a", "chapterName": "title", "chapterUrl": "href##$##,{\"webView\":true}", "nextTocUrl": "text.Next@href"}, "searchUrl": "@js:\r\nurl=\"https://bcshuku.com/e/search/\";\r\npath=java.get(url+\"index.php?keyboard=\"+key+\"&show=title,writer,byr&searchget=1\",{}).header(\"Location\") ;\r\n//java.log(path)\nurl+path", "weight": 0},{"bookSourceGroup": "自制,网页源", "bookSourceName": "书海阁(book.washai.net)", "bookSourceType": 0, "bookSourceUrl": "https://book.washai.net", "bookUrlPattern": "https?:\\/\\/book\\.washai\\.net\\/book\\/indexList-[0-9]+\\.html", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": false, "lastUpdateTime": "1791948013458", "respondTime": 180000, "ruleBookInfo": {"author": "#bookAuthor@text", "coverUrl": "#bookCoverImg@src", "intro": "#bookDesc@text", "kind": "#bookCatBadge@text", "lastChapter": "#lastIndexLink@text", "name": "#bookName@text", "tocUrl": "#allIndexLink@href", "wordCount": "#bookWordCount@text"}, "ruleContent": {"content": ".readChapterAppendBody@html", "title": "#indexName@text"}, "ruleExplore": [], "ruleSearch": [], "ruleToc": {"chapterList": "#bookIndexList li a", "chapterName": "ownText", "chapterUrl": "href", "nextTocUrl": "text.下一页@href"}, "weight": 0},{"bookSourceComment": "基于 fqapp 逆向（x-argus/x-ladon 签名 + CM DH 通道）；book_type=2 读目录，正文经 materials/skeleton 取 web_uri 直接出 JPEG；书源URL带##后缀仅作身份区分，实际请求均为 fanqienovel.com。注：漫画频道(tab_type=9)为服务端固定推荐池，发现页仅此一个真实入口；更多内容请用搜索", "bookSourceGroup": "番茄,漫画,AI", "bookSourceName": "🍅番茄漫画(APP)", "bookSourceType": 2, "bookSourceUrl": "https://fanqienovel.com##漫画版", "bookUrlPattern": "https?://fanqienovel[.]com/page/[0-9]+", "concurrentRate": "1/1500", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "🖼 番茄漫画精选::https://fanqienovel.com?t=manga&tt=9", "jsLib": "var FQ_H=String.fromCharCode(35,35);var FQ_SH=String.fromCharCode(35);var FQ_SL=String.fromCharCode(47);var FQ_Q=String.fromCharCode(39);var FQ_DQ=String.fromCharCode(34);var FQ_SP=String.fromCharCode(32);var FQ_MUA='Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Mobile Safari/537.36';var FQ_FUA='com.ss.android.article.news/13400 (Linux; U; Android 10; zh_CN; tb8788p1_64_bsp; Build/QQ3A.200805.001)';var FQ_FIXED='TdTC5rgxYgkOUrPHpnM7pByyRiuCmrWKGWs521cXdST0m69/COjWjSanLjfBqVovHwWlGJKu8pSXMrYqOKrdWA==';var FQ_HOST='https://api5-normal-sinfonlineb.fqnovel.com';\nvar FQ_IMG_DOMAINS=['p3-novel.byteimg.com','p6-novel.byteimg.com','p1-novel.byteimg.com'];\nvar FQ_MSG_NOMG=\"该章节暂无图片，请刷新重试\";var FQ_WEB='https://fanqienovel.com';var FQ_MSG_DETAIL=String.fromCharCode(35814,24773,33719,21462,22833,36133,65292,35831,37325,35797);var FQ_MSG_TOC=String.fromCharCode(30446,24405,33719,21462,22833,36133,65292,35831,37325,35797);var FQ_MSG_CT=String.fromCharCode(27491,25991,33719,21462,22833,36133,65292,35831,37325,35797);var FQ_MSG_LOCK=String.fromCharCode(128274);var FQ_MSG_EMPTY=String.fromCharCode(26412,31456,26242,26080,20869,23481,65292,35831,25442,28304);var FQ_IMG=String.fromCharCode(123,123,105,109,97,103,101,95,100,111,109,97,105,110,125,125);var FQ_MSG_PAY=String.fromCharCode(26412,31456,20026,20184,36153,31456,33410,65292,32593,39029,29256,26080,27861,20813,36153,38405,35835);function FQ_j2s(b){try{return String(new Packages.java.lang.String(b,Packages.java.nio.charset.Charset.forName('ISO-8859-1')));}catch(e){var s='';for(var i=0;i<b.length;i++){var v=b[i];if(v<0)v+=256;s+=String.fromCharCode(v);}return s;}}function FQ_s2j(s){return new Packages.java.lang.String(s).getBytes(Packages.java.nio.charset.Charset.forName('ISO-8859-1'));}function FQ_hex(b){var str=FQ_j2s(b);var s='';for(var i=0;i<str.length;i++){var v=str.charCodeAt(i)&255;s+=(v<16?'0':'')+v.toString(16);}return s;}function FQ_unhex(h){var r='';for(var i=0;i<h.length;i+=2)r+=String.fromCharCode(parseInt(h.substr(i,2),16));return r;}function FQ_sm3(s){var rotl=function(x,n){n=n&31;return ((x<<n)|(x>>>(32-n)))>>>0;};var len=s.length,bitLen=len*8,arr=[];for(var i=0;i<len;i++)arr.push(s.charCodeAt(i)&255);arr.push(0x80);while(arr.length%64!==56)arr.push(0);var hi=Math.floor(bitLen/4294967296),lo=bitLen>>>0;arr.push((hi>>>24)&255,(hi>>>16)&255,(hi>>>8)&255,hi&255);arr.push((lo>>>24)&255,(lo>>>16)&255,(lo>>>8)&255,lo&255);var V=[0x7380166f,0x4914b2b9,0x172442d7,0xda8a0600,0xa96f30bc,0x163138aa,0xe38dee4d,0xb0fb0e4e];for(var b=0;b<arr.length;b+=64){var W=[];for(var i=0;i<16;i++)W.push(((arr[b+i*4]<<24)|(arr[b+i*4+1]<<16)|(arr[b+i*4+2]<<8)|arr[b+i*4+3])>>>0);for(var j=16;j<68;j++){var x=(W[j-16]^W[j-9]^rotl(W[j-3],15))>>>0;x=(x^rotl(x,15)^rotl(x,23))>>>0;W.push((x^rotl(W[j-13],7)^W[j-6])>>>0);}var W1=[];for(var j=0;j<64;j++)W1.push((W[j]^W[j+4])>>>0);var A=V[0],B=V[1],C=V[2],D=V[3],E=V[4],F=V[5],G=V[6],H=V[7];for(var j=0;j<64;j++){var Tj=(j<16)?0x79cc4519:0x7a879d8a;var SS1=rotl((rotl(A,12)+E+rotl(Tj,j&31))>>>0,7);var SS2=(SS1^rotl(A,12))>>>0;var FFj=(j<16)?((A^B^C)>>>0):(((A&B)|(A&C)|(B&C))>>>0);var GGj=(j<16)?((E^F^G)>>>0):(((E&F)|((~E)&G))>>>0);var TT1=(FFj+D+SS2+W1[j])>>>0;var TT2=(GGj+H+SS1+W[j])>>>0;D=C;C=rotl(B,9);B=A;A=TT1;H=G;G=rotl(F,19);F=E;E=(TT2^rotl(TT2,9)^rotl(TT2,17))>>>0;}V[0]=(V[0]^A)>>>0;V[1]=(V[1]^B)>>>0;V[2]=(V[2]^C)>>>0;V[3]=(V[3]^D)>>>0;V[4]=(V[4]^E)>>>0;V[5]=(V[5]^F)>>>0;V[6]=(V[6]^G)>>>0;V[7]=(V[7]^H)>>>0;}var out='';for(var i=0;i<8;i++)out+=('0000000'+V[i].toString(16)).slice(-8);return out;}function FQ_md5(s){var d=Packages.java.security.MessageDigest.getInstance('MD5');var b=FQ_s2j(s);d.update(b);return FQ_hex(d.digest());}function FQ_b64(s){return String(Packages.java.util.Base64.getEncoder().encodeToString(FQ_s2j(s)));}function FQ_b64d(s){return FQ_j2s(Packages.java.util.Base64.getDecoder().decode(String(s)));}function FQ_aesCbc(data,key,iv){var C=Packages.javax.crypto.Cipher;var c=C.getInstance('AES/CBC/NoPadding');c.init(C.ENCRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(FQ_s2j(key),'AES'),new Packages.javax.crypto.spec.IvParameterSpec(FQ_s2j(iv)));return FQ_j2s(c.doFinal(FQ_s2j(data)));}function FQ_pad(s){var p=16-(s.length%16);if(p===0)p=16;var o=s;for(var i=0;i<p;i++)o+=String.fromCharCode(p);return o;}function FQ_w(lo,hi){return {lo:lo>>>0,hi:hi>>>0};}function FQ_xor(){var lo=0,hi=0;for(var i=0;i<arguments.length;i++){lo^=arguments[i].lo;hi^=arguments[i].hi;}return FQ_w(lo,hi);}function FQ_n64(v){return FQ_w(~v.lo,~v.hi);}function FQ_add(a,b){var lo=(a.lo+b.lo)>>>0;return FQ_w(lo,(a.hi+b.hi+(lo<a.lo?1:0))>>>0);}function FQ_rol(v,c){var s=((c%64)+64)%64;if(s===0)return FQ_w(v.lo,v.hi);if(s<32)return FQ_w((v.lo<<s)|(v.hi>>>(32-s)),(v.hi<<s)|(v.lo>>>(32-s)));if(s===32)return FQ_w(v.hi,v.lo);var r=s-32;return FQ_w((v.hi<<r)|(v.lo>>>(32-r)),(v.lo<<r)|(v.hi>>>(32-r)));}function FQ_ror(v,c){return FQ_rol(v,64-(c%64));}function FQ_r64(s,o){o=o||0;return FQ_w((s.charCodeAt(o)|(s.charCodeAt(o+1)<<8)|(s.charCodeAt(o+2)<<16)|(s.charCodeAt(o+3)<<24))>>>0,(s.charCodeAt(o+4)|(s.charCodeAt(o+5)<<8)|(s.charCodeAt(o+6)<<16)|(s.charCodeAt(o+7)<<24))>>>0);}function FQ_w64le2(l,r){var o='';for(var i=0;i<4;i++)o+=String.fromCharCode((l.lo>>>(i*8))&255);for(var i2=0;i2<4;i2++)o+=String.fromCharCode((l.hi>>>(i2*8))&255);for(var i3=0;i3<4;i3++)o+=String.fromCharCode((r.lo>>>(i3*8))&255);for(var i4=0;i4<4;i4++)o+=String.fromCharCode((r.hi>>>(i4*8))&255);return o;}var FQ_SZ=FQ_w(0x046d678b,0x3dc94c3a);function FQ_zbit(i){return FQ_w(i<32?((FQ_SZ.lo>>>i)&1):((FQ_SZ.hi>>>(i-32))&1),0);}var FQ_SK='fc78e0a9657a0c748ce51559903ccf03510e51d3cff232d71343e88a321c5304';var FQ_AK='d31e3718288a1027baab59f146a09a9c';var FQ_AIV='ea180a0336ed352fcd24e4d50018ae54';function FQ_srk(key){var w=[];for(var i=0;i<4;i++)w.push(FQ_r64(key,i*8));for(var x=4;x<72;x++){var m=FQ_xor(FQ_ror(w[x-1],3),w[x-3]);m=FQ_xor(m,FQ_ror(m,1));w.push(FQ_xor(FQ_n64(w[x-4]),m,FQ_zbit((x-4)%62),FQ_w(3,0)));}return w;}function FQ_sEnc(blk,keys){var l=FQ_r64(blk,0),r=FQ_r64(blk,8);for(var i=0;i<keys.length;i++){var o=r;var nl=FQ_w(FQ_rol(r,1).lo&FQ_rol(r,8).lo,FQ_rol(r,1).hi&FQ_rol(r,8).hi);r=FQ_xor(l,nl,FQ_rol(r,2),keys[i]);l=o;}return FQ_w64le2(l,r);}function FQ_ev(v){var o='';while(v>=0x80){o+=String.fromCharCode((v%0x80)|0x80);v=Math.floor(v/0x80);}o+=String.fromCharCode(v);return o;}function FQ_pbv(f,v){return FQ_ev(f*8)+FQ_ev(v);}function FQ_pbb(f,v){var e=(typeof v==='number')?String.fromCharCode(v):String(v);return FQ_ev(f*8+2)+FQ_ev(e.length)+e;}function FQ_argusBean(q,stub,ts,dev,iid,aid,rv){var bi=(/^[0-9a-f]{32}$/i.test(stub))?FQ_unhex(stub):FQ_unhex('00000000000000000000000000000000');var bh=FQ_unhex(FQ_sm3(bi).substr(0,12));var qh=(q==='')?FQ_unhex(FQ_sm3(FQ_unhex('00000000000000000000000000000000')).substr(0,12)):FQ_unhex(FQ_sm3(q).substr(0,12));var nest=FQ_pbv(1,1)+FQ_pbv(2,1)+FQ_pbv(3,1)+FQ_pbv(7,0xC792ECCC);var s23=FQ_pbb(1,'NX551J')+FQ_pbv(2,8196)+FQ_pbv(4,0x80E0D800);return FQ_pbv(1,1077940818)+FQ_pbv(2,2)+FQ_pbv(3,rv)+FQ_pbb(4,String(aid))+FQ_pbb(5,dev)+FQ_pbb(6,'1611921764')+FQ_pbb(7,FQ_qp(q,'version_name'))+FQ_pbb(8,'v04.04.05-ov-android')+FQ_pbv(9,134744640)+FQ_pbb(10,FQ_unhex('0000000000000000'))+FQ_pbv(11,0)+FQ_pbv(12,ts*2)+FQ_pbb(13,bh)+FQ_pbb(14,qh)+FQ_pbb(15,nest)+FQ_pbb(16,iid)+FQ_pbb(20,'none')+FQ_pbv(21,738)+FQ_pbb(23,s23)+FQ_pbv(25,2);}function FQ_argus(q,stub,ts,dev,iid,aid,rv){var pb=FQ_pad(FQ_argusBean(q,stub,ts,dev,iid,aid,rv));var keys=FQ_srk(FQ_unhex(FQ_SK));var enc='';for(var o=0;o<pb.length;o+=16)enc+=FQ_sEnc(pb.substr(o,16),keys);var magic=FQ_unhex('f2f7fcfff2f7fcff');var un=magic+enc+FQ_unhex('eafb2cfe8568519154');var buf=un.substr(0,8);for(var i=8;i<un.length;i++)buf+=String.fromCharCode((un.charCodeAt(i)^magic.charCodeAt(i%8))&255);var rev='';for(var j=buf.length-1;j>=0;j--)rev+=buf.charAt(j);var fin=FQ_pad(rev+'ao');var ct=FQ_aesCbc(fin,FQ_unhex(FQ_AK),FQ_unhex(FQ_AIV));return FQ_b64(FQ_unhex('f281')+ct);}function FQ_lrk(rp,aid){var dg=FQ_md5(rp+String(aid));var w=[];for(var i=0;i<34;i++)w.push(FQ_w(0,0));w[0]=FQ_r64(dg,0);w[1]=FQ_r64(dg,8);w[2]=FQ_r64(dg,16);w[3]=FQ_r64(dg,24);var b0=w[0],b8=w[1],q=[w[2],w[3]];for(var x=0;x<0x22;x++){var x9=b0;var x8=b8;x8=FQ_ror(x8,8);x8=FQ_add(x8,x9);x8=FQ_xor(x8,FQ_w(x,0));q.push(x8);x8=FQ_xor(x8,FQ_rol(x9,3));w[x+1]=x8;b0=x8;b8=q.shift();}return w;}function FQ_lEnc(blk,keys){var l=FQ_r64(blk,0),r=FQ_r64(blk,8);for(var i=0;i<34;i++){r=FQ_xor(keys[i],FQ_add(l,FQ_ror(r,8)));l=FQ_xor(r,FQ_ror(l,61));}return FQ_w64le2(l,r);}function FQ_ladon(ts,lic,aid,rp){var data=String(ts)+'-'+lic+'-'+aid;var pad2=16-(data.length%16);var pd=data;for(var i=0;i<pad2;i++)pd+=String.fromCharCode(pad2);var ks=FQ_lrk(rp,aid);var ct='';for(var o=0;o<pd.length;o+=16)ct+=FQ_lEnc(pd.substr(o,16),ks);return FQ_b64(rp+ct);}function FQ_sign(q,stub,ts,dev,iid,aid,rv){var h={'x-ss-req-ticket':String(ts*1000),'x-khronos':String(ts),'x-argus':FQ_argus(q,stub,ts,dev,iid,aid,rv),'x-ladon':FQ_ladon(ts,1611921764,aid,String.fromCharCode(1,2,3,4))};if(stub)h['x-ss-stub']=stub;return h;}function FQ_qp(q,k){var ps=String(q||'').split('&');for(var i=0;i<ps.length;i++){var e=ps[i].indexOf('=');if(e>0&&ps[i].substring(0,e)===k)return ps[i].substring(e+1);}return '';}function FQ_qs(url){var t=String(url||'');var i=t.indexOf('?');if(i<0)return '';var j=t.indexOf('#',i);return t.slice(i+1,j<0?t.length:j);}function FQ_qp(url,n){var e=String(n);var ps=FQ_qs(url).split('&');for(var i=0;i<ps.length;i++){if(!ps[i])continue;var s=ps[i].indexOf('=');var k=s<0?ps[i]:ps[i].substr(0,s);if(k===e)return s<0?'':ps[i].substr(s+1);}return '';}function FQ_now(){return Math.floor(new Date().getTime()/1000);}function FQ_ua(){return 'com.dragon.read/66732 (Linux; U; Android 10; zh_CN; Pixel 4 XL; Build/QD1A.190821.007;tt-ok/3.12.13.4-tiktok)';}function FQ_hpost(url,bodyStr,headers){var arr=FQ_s2j(bodyStr);var c=new Packages.java.net.URL(url).openConnection();c.setRequestMethod('POST');c.setDoOutput(true);for(var k in headers)c.setRequestProperty(k,headers[k]);c.setConnectTimeout(20000);c.setReadTimeout(25000);var out=c.getOutputStream();out.write(arr,0,arr.length);out.flush();out.close();var code=c.getResponseCode();var is=(code>=400)?c.getErrorStream():c.getInputStream();var sb='';if(is){var enc=String(c.getHeaderField('Content-Encoding')||'');var stream=is;if(enc.indexOf('gzip')>=0)stream=new Packages.java.util.zip.GZIPInputStream(is);var rd=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(stream,'UTF-8'));var line;while((line=rd.readLine())!=null)sb+=String(line);rd.close();}return {code:code,body:sb};}function FQ_gz(s){var bos=new Packages.java.io.ByteArrayOutputStream();var g=new Packages.java.util.zip.GZIPOutputStream(bos);var b=new Packages.java.lang.String(s).getBytes(Packages.java.nio.charset.Charset.forName('UTF-8'));g.write(b,0,b.length);g.close();var arr=bos.toByteArray();var out='';for(var i=0;i<arr.length;i++){var v=arr[i]&255;if(i===8)v=2;if(i===9)v=3;out+=String.fromCharCode(v);}return out;}function FQ_ttEnc(data){var rnd='';for(var i=0;i<32;i++)rnd+=String.fromCharCode(Math.floor(Math.random()*256));var md=Packages.java.security.MessageDigest.getInstance('SHA-512');md.update(FQ_s2j(rnd));var inner=md.digest();var md2=Packages.java.security.MessageDigest.getInstance('SHA-512');md2.update(inner);md2.update(FQ_s2j(FQ_b64d(FQ_FIXED)));var hv=md2.digest();var keyB=Packages.java.util.Arrays.copyOfRange(hv,0,16);var ivB=Packages.java.util.Arrays.copyOfRange(hv,16,32);var md3=Packages.java.security.MessageDigest.getInstance('SHA-512');md3.update(FQ_s2j(data));var dh=md3.digest();var C=Packages.javax.crypto.Cipher;var c=C.getInstance('AES/CBC/NoPadding');c.init(C.ENCRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(keyB,'AES'),new Packages.javax.crypto.spec.IvParameterSpec(ivB));return String.fromCharCode(0x74,0x63,0x05,0x10,0,0)+rnd+FQ_j2s(c.doFinal(FQ_s2j(FQ_pad(FQ_j2s(dh)+data))));}function FQ_alnum(n){var ch='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';var s='';for(var i=0;i<n;i++)s+=ch.charAt(Math.floor(Math.random()*ch.length));return s;}function FQ_uuid(){return String(Packages.java.util.UUID.randomUUID());}function FQ_getPool(sv){var p=String(sv.get('fqPool')||'');if(!p){return [];}var out=[];var arr=p.split('|');for(var i=0;i<arr.length;i++){var kv=arr[i].split(',');if(kv.length>=2&&kv[0])out.push({d:kv[0],i:kv[1],o:kv[2]||'',c:kv[3]||''});}return out;}function FQ_savePool(sv,pool){var a=[];for(var i=0;i<pool.length;i++)a.push(pool[i].d+','+pool[i].i+','+(pool[i].o||'')+','+(pool[i].c||''));sv.put('fqPool',a.join('|'));}function FQ_registerOne(){var openudid=FQ_alnum(16),cdid=FQ_uuid(),clientudid=FQ_uuid();var ua='com.dragon.read/65132 (Linux; U; Android 10; zh_CN; MI 12; Build/MMB29M; Cronet/TTNetVersion:9ac8d95c 2024-11-25 QuicVersion:3f326df4 2024-11-14)';var header={display_name:'番茄小说',update_version_code:'65132',manifest_version_code:'65132',aid:1967,channel:'xiaomi_1967_64',package:'com.dragon.read',app_version:'6.5.1.32',version_code:'65132',sdk_version:'v04.04.05-ov-android',sdk_target_version:29,os:'Android',os_version:'10',os_api:'29',device_model:'MI 12',device_brand:'Xiaomi',device_manufacturer:'Google',device_category:'phone',cpu_abi:'arm64-v8a',release_build:FQ_uuid(),density_dpi:'560',display_density:'mdpi',resolution:'1440x2392',language:'zh',mac:'11:22:33:44:55:66',timezone:8,access:'wifi',not_request_sender:0,carrier:'CHINA MOBILE',mcc_mnc:'46007',rom:'EMUI-'+FQ_alnum(13),rom_version:FQ_alnum(2),sig_hash:FQ_md5(FQ_uuid()),openudid:openudid,clientudid:clientudid,sim_serial_number:[],region:'CN',tz_name:'Asia/Shanghai',tz_offset:28800,sim_region:'cn'};var js=JSON.stringify({magic_tag:'ss_app_log',header:header,_gen_time:new Date().getTime()});var post=FQ_ttEnc(FQ_gz(js));var ts=FQ_now();var P=[['tt_data','a'],['os_api','29'],['device_type','MI 12'],['ssmix','a'],['manifest_version_code','65132'],['dpi','560'],['version_name','6.5.1.32'],['ts',String(ts)],['cpu_support64','true'],['app_type','normal'],['appTheme','light'],['ac','wifi'],['host_abi','arm64-v8a'],['update_version_code','65132'],['channel','xiaomi_1967_64'],['_rticket',String(new Date().getTime())],['device_platform','android'],['version_code','65132'],['cdid',cdid],['os','android'],['is_android_pad','0'],['openudid',openudid],['package','com.dragon.read'],['resolution','1440*2392'],['os_version','10'],['language','zh'],['device_brand','Xiaomi'],['need_personal_recommend','1'],['aid','1967'],['minor_status','0'],['app_name','novel'],['mcc_mnc','46007']];P.sort(function(a,b){return a[0]<b[0]?-1:(a[0]>b[0]?1:0);});var qs='';for(var i=0;i<P.length;i++){if(i)qs+='&';qs+=P[i][0]+'='+encodeURIComponent(P[i][1]);}var r=FQ_hpost('https://log.snssdk.com/service/2/device_register/?'+qs,post,{'Content-Type':'application/octet-stream;tt-data=a','accept-encoding':'gzip','user-agent':ua,'connection':'Keep-Alive'});var Q=String.fromCharCode(34);var m=r.body.match(new RegExp(Q+'device_id_str'+Q+':'+Q+'([0-9]+)'+Q));if(!m)return null;var m2=r.body.match(new RegExp(Q+'install_id_str'+Q+':'+Q+'([0-9]+)'+Q));return {d:m[1],i:m2?m2[1]:'',o:openudid,c:cdid};}function FQ_ensure(sv,n){var pool=FQ_getPool(sv);var need=(n||3)-pool.length;var added=0;for(var i=0;i<need;i++){  var d=FQ_registerOne();  if(d){pool.push(d);added++;FQ_savePool(sv,pool);}}return pool;}function FQ_api(jv,sv,path,q,host,aid){var pool=FQ_ensure(sv,2);if(!pool.length)throw new Error('设备池为空，请检查网络后重试');var dev=pool[0].d,iid=pool[0].i;var qq=q+'&iid='+iid+'&device_id='+dev;var url=(host||FQ_HOST)+path+'?'+qq;var ts=FQ_now();var h=FQ_sign(FQ_qs(url),'',ts,dev,iid,aid||1967,Math.floor(Math.random()*2000000000));h['User-Agent']=FQ_ua();return String(jv.ajax(url+','+JSON.stringify({headers:h})));}function FQ_web(jv,url,ua){var h={'User-Agent':ua||FQ_MUA};return String(jv.ajax(url+','+JSON.stringify({headers:h})));}var QC=String.fromCharCode(34);function FQ_state(txt){var t=String(txt||'');var i=t.indexOf('window.__INITIAL_STATE__=');if(i<0)return null;var st0=t.indexOf('{',i);if(st0<0)return null;var seg=t.substring(st0);var depth=0,end=-1,instr=false,esc=false;for(var k=0;k<seg.length;k++){var ch=seg.charAt(k);if(instr){if(esc)esc=false;else if(ch===String.fromCharCode(92))esc=true;else if(ch===QC)instr=false;continue;}if(ch===QC)instr=true;else if(ch==='{')depth++;else if(ch==='}'){depth--;if(depth===0){end=k+1;break;}}}if(end<0)return null;try{return JSON.parse(seg.substring(0,end));}catch(e){return null;}}function FQ_tag(s){var t=String(s||'');return t.split('<em>').join('').split('</em>').join('').split('<').join(String.fromCharCode(60,108,116,59));}function FQ_search(jv,sv,kw,page){var off=((page||1)-1)*10;var suf='&enterfrom_aid=&enter_from=inner_search&app_name=news_article&version_name=7.0.8&app_version=7.0.8&channel=tt_huawei2019_yz&version_code=708&device_platform=android&parent_enterfrom=novel_list&novel_host=&aid=13&scm_version=1.0.0.4112&device_type=25053RT47C&device_brand=Redmi&language=zh&os_api=35&os_version=15&openudid=fqapp&update_version_code=70899&plugin=0&tma_jssdk_version=1.10.0.0&rom_version=miui__os2.0.209.0.volcnxm';var url='https://api.fanqiesdk.com/api/novel/channel/homepage/search/search/v1/?q='+encodeURIComponent(kw)+'&offset='+off+suf;var raw=FQ_web(jv,url,FQ_FUA);var out=[];try{var d=JSON.parse(raw);var rd=(d.data&&d.data.ret_data)||[];for(var i=0;i<rd.length;i++){var it=rd[i];out.push({name:FQ_tag(it.title),author:FQ_tag(it.author||''),kind:FQ_tag(it.category||''),intro:FQ_tag(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+it.book_id+FQ_SH+it.book_id,bookId:String(it.book_id)});}}catch(e){}return out;}function FQ_homeList(jv,sv){var raw=FQ_web(jv,'https://fanqienovel.com/','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36');var d=FQ_state(raw);var out=[];if(!d)return out;var hm=d.home||{};var groups=['weekList','editorList','updateList','newbookList','boyList','girlList','readRankList','newRankList','fantasyList','topRankList'];var seen={};for(var g=0;g<groups.length;g++){var arr=hm[groups[g]]||[];for(var i=0;i<arr.length;i++){var it=arr[i];var bid=String(it.bookId||'');if(!bid||seen[bid])continue;seen[bid]=1;out.push({name:String(it.bookName||''),author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumbUri||''),bookUrl:'https://fanqienovel.com/page/'+bid});}}return out;}function FQ_rankList(jv,sv,rankId){var raw=FQ_web(jv,FQ_WEB+FQ_SL.concat('api',FQ_SL,'rank',FQ_SL,'list?rank_id=')+(rankId||1)+'&offset=0&count=20');var out=[];try{var d=JSON.parse(raw);var l=(d.data&&d.data.list)||[];for(var i=0;i<l.length;i++){var it=l[i];var bid=String(it.bookId||'');out.push({name:String(it.bookName||''),author:String(it.author||''),kind:'排行榜',intro:String(it.abstract||''),coverUrl:String(it.thumbUri||''),bookUrl:'https://fanqienovel.com/page/'+bid,bookId:bid});}}catch(e){}return out;}function FQ_getDev(sv){var d=String(sv.get('fqdev')||'');var i=String(sv.get('fqiid')||'');return {d:d,i:i};}function FQ_regAndSave(sv){var r=FQ_regTest();var Q=String.fromCharCode(34);var m=r.match(new RegExp(Q+'device_id_str'+Q+':'+Q+'([0-9]+)'+Q));if(!m)return null;var m2=r.match(new RegExp(Q+'install_id_str'+Q+':'+Q+'([0-9]+)'+Q));var d=m[1],i=m2?m2[1]:'';sv.put('fqdev',d);sv.put('fqiid',i);return {d:d,i:i};}function FQ_bigBytes(n){var h=String(n.toString(16));if(h.length%2===1)h='0'+h;if(h.length>384)h=h.substring(h.length-384);return FQ_unhex(h);}function FQ_b64eJS(str){var CH='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';var out='';var i=0;var n=str.length;while(i<n){var c1=str.charCodeAt(i++)&255;var c2=(i<n)?str.charCodeAt(i++)&255:NaN;var c3=(i<n)?str.charCodeAt(i++)&255:NaN;var e1=c1>>2;var e2=((c1&3)<<4)|(isNaN(c2)?0:(c2>>4));var e3=isNaN(c2)?64:(((c2&15)<<2)|(isNaN(c3)?0:(c3>>6)));var e4=isNaN(c3)?64:(c3&63);out+=CH.charAt(e1)+CH.charAt(e2)+(e3===64?'=':CH.charAt(e3))+(e4===64?'=':CH.charAt(e4));}return out;}function FQ_b64dJS(str){var CH='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';var out='';var buf=0,bits=0;for(var i=0;i<str.length;i++){var c=str.charAt(i);if(c==='=')break;var v=CH.indexOf(c);if(v<0)continue;buf=(buf<<6)|v;bits+=6;if(bits>=8){bits-=8;out+=String.fromCharCode((buf>>bits)&255);}}return out;}function FQ_b64d2(s){try{return Packages.java.util.Base64.getDecoder().decode(String(s));}catch(e){return FQ_s2j(FQ_b64dJS(String(s)));}}function FQ_b64e2(b){try{return String(Packages.java.util.Base64.getEncoder().encodeToString(b));}catch(e){return FQ_b64eJS(FQ_j2s(b));}}function FQ_bytesHex(b){var str=FQ_j2s(b);var s='';for(var i=0;i<str.length;i++){var v=str.charCodeAt(i)&255;s+=(v<16?'0':'')+v.toString(16);}return s;}function FQ_cmGet(jv,bookId,itemIds,dev,iid){var CMP='ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff';var P=new Packages.java.math.BigInteger(CMP,16);var pk=new Packages.java.math.BigInteger(256,new Packages.java.security.SecureRandom());pk=pk.mod(P.subtract(Packages.java.math.BigInteger.ONE));var pub=Packages.java.math.BigInteger.valueOf(2).modPow(pk,P);var iv=new Packages.java.security.SecureRandom().generateSeed(16);var rk=FQ_b64d2('rCXGfd2POMGzeiNIgo4iLg==');var CC=Packages.javax.crypto.Cipher;var c1=CC.getInstance('AES/CBC/PKCS5Padding');c1.init(CC.ENCRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(rk,'AES'),new Packages.javax.crypto.spec.IvParameterSpec(iv));var ct1=c1.doFinal(FQ_s2j(FQ_bigBytes(pub)));var key=FQ_b64e2(FQ_s2j(FQ_j2s(iv)+FQ_j2s(ct1)));var body=JSON.stringify({book_id:bookId,item_ids:itemIds,key:key});var url='https://novelfm-hl.snssdk.com/novelfm/playerapi/full/mget/v1/?aid=3040&app_name=novelapp&channel=0&device_id='+dev+'&device_platform=android&device_type=UGFFI55&iid='+iid+'&os_version=0&version_code=58932&version_name=5.8.9.32';var ts=FQ_now();var stub=FQ_md5(body);var hh=FQ_sign(FQ_qs(url),stub,ts,dev,iid,3040,Math.floor(Math.random()*2000000000));hh['User-Agent']='com.dragon.read';hh['Content-Type']='application/json; charset=utf-8';var resp=FQ_hpost(url,body,hh);var dd=JSON.parse(resp.body);var infos=dd.data.item_infos;var out={};for(var iid2 in infos){var it=infos[iid2];if(!it||!it.key||!it.content){continue;}var srvHex=FQ_bytesHex(FQ_b64d2(String(it.key)));var srvN=new Packages.java.math.BigInteger(srvHex,16);var shared=srvN.modPow(pk,P);var shHex=String(shared.toString(16));if(shHex.length%2===1)shHex='0'+shHex;if(shHex.length>384)shHex=shHex.substring(shHex.length-384);var aesKey=Packages.java.util.Arrays.copyOfRange(FQ_s2j(FQ_unhex(shHex.substring(0,64))),0,32);var cb=FQ_b64d2(String(it.content));var civ=Packages.java.util.Arrays.copyOfRange(cb,0,16);var cct=Packages.java.util.Arrays.copyOfRange(cb,16,cb.length);var c2=CC.getInstance('AES/CBC/PKCS5Padding');c2.init(CC.DECRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(aesKey,'AES'),new Packages.javax.crypto.spec.IvParameterSpec(civ));var ptArr=c2.doFinal(cct);out[iid2]=String(new Packages.java.lang.String(ptArr,'UTF-8'));}return out;}function FQ_dev(sv){var d=String(sv.get('fqdev')||'');var i=String(sv.get('fqiid')||'');return {d:d,i:i};}function FQ_search(sv,kw,page){var off=String((parseInt(page||'1')-1)*10);var q='q='+encodeURIComponent(kw)+'&offset='+off+'&enterfrom_aid=&enter_from=inner_search&app_name=news_article&version_name=7.0.8&app_version=7.0.8&channel=tt_huawei2019_yz&version_code=708&device_platform=android&parent_enterfrom=novel_list&novel_host=&aid=13&scm_version=1.0.0.4112&device_type=25053RT47C&device_brand=Redmi&language=zh&os_api=35&os_version=15&openudid='+FQ_alnum(16)+'&update_version_code=70899&plugin=0&tma_jssdk_version=1.10.0.0&rom_version=miui__os2.0.209.0.volcnxm';var url='https://api.fanqiesdk.com/api/novel/channel/homepage/search/search/v1/?'+q;var r=String(java.ajax(url+',{\"headers\":{\"User-Agent\":\"com.ss.android.article.news/13400\"}}'));var d=JSON.parse(r);var items=(d.data&&d.data.ret_data)?d.data.ret_data:[];var out=[];for(var i=0;i<items.length;i++){var it=items[i];var t=String(it.title||'').split('<em>').join('').split('</em>').join('');out.push({name:t,author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+String(it.book_id)});}return out;}function FQ_toc(sv,bookId,dev){var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';var url='https://api5-normal-sinfonlineb.fqnovel.com/reading/bookapi/directory/all_items/v?book_type=0&item_data_list_md5=&catalog_data_md5=&book_id='+bookId+'&book_info_md5=&need_version=true&device_id='+dev+'&'+base;var ts=FQ_now();var h=FQ_sign(FQ_qs(url),'',ts,dev,'',1967,Math.floor(Math.random()*2000000000));h['User-Agent']='Mozilla/5.0 (Linux; Android 13)';var r=String(java.ajax(url+','+JSON.stringify({headers:h})));var d=JSON.parse(r);var cats=(d.data&&d.data.catalog_data)?d.data.catalog_data:[];var out=[];for(var i=0;i<cats.length;i++){var c=cats[i];out.push({name:String(c.catalog_title||('第'+(i+1)+'章')),url:String(c.item_id)});}return out;}function FQ_explore(jv,sv,kind,page){var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';var tt={'推荐':2,'经典':3,'知识':4,'听书':5,'看剧':6,'视频':7,'短篇':8,'漫画':9,'买书':10};var tabType=tt[kind]||2;var off=((parseInt(page||'1')-1)*16);var q='tab_type='+tabType+'&offset='+off+'&client_template=0&'+base;var raw=FQ_api(jv,sv,'/reading/bookapi/bookmall/tab/v',q);var d=JSON.parse(raw);var ti=d.data.tab_item||[];var out=[];for(var t=0;t<ti.length;t++){var cells=ti[t].cell_data||[];for(var c=0;c<cells.length;c++){var bd=cells[c].book_data||[];for(var b=0;b<bd.length;b++){var it=bd[b];var bid=String(it.book_id||'');if(!bid)continue;out.push({name:String(it.book_name||''),author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+bid});}}}return out;}function FQ_pickBooks(jv,sv,catId,algo,page){var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';var off=((parseInt(page||'1')-1)*16);var q='cell_id=7098235271900037133&offset='+off+'&client_template=2&client_req_type=2&tab_type=2&req_rank_category_id='+catId+'&req_rank_algo='+(algo||101)+'&'+base;var raw=FQ_api(jv,sv,'/reading/bookapi/bookmall/cell/change/v1/',q);var d=JSON.parse(raw);var cv=(d.data&&d.data.cell_view)||{};var bd=cv.book_data||[];var out=[];for(var i=0;i<bd.length;i++){var it=bd[i];var bid=String(it.book_id||'');if(!bid)continue;out.push({name:String(it.book_name||''),author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+bid});}return out;}function FQ_tabBooks(jv,sv,tabType,page){var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';var off=((parseInt(page||'1')-1)*16);var q='tab_type='+tabType+'&offset='+off+'&client_template=0&'+base;var raw=FQ_api(jv,sv,'/reading/bookapi/bookmall/tab/v',q);var d=JSON.parse(raw);var ti=d.data.tab_item||[];var out=[];var seen={};for(var t=0;t<ti.length;t++){var cells=ti[t].cell_data||[];for(var c=0;c<cells.length;c++){var bd=cells[c].book_data||[];for(var b=0;b<bd.length;b++){var it=bd[b];var bid=String(it.book_id||'');if(!bid||seen[bid])continue;seen[bid]=1;out.push({name:String(it.book_name||''),author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+bid});}}}return out;}\n;function FQ_mgBase(){var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';return base;}\nfunction FQ_mgDir(jv,sv,bookId){var raw=FQ_api(jv,sv,'/reading/bookapi/directory/all_items/v','book_type=2&item_data_list_md5=&catalog_data_md5=&book_id='+bookId+'&book_info_md5=&need_version=true&'+FQ_mgBase());var j=JSON.parse(raw);var bi=(j.data&&j.data.book_info)||{};var il=(j.data&&j.data.item_data_list)||[];return {info:bi,items:il};}\nfunction FQ_mgToc(jv,sv,bookId){var r=FQ_mgDir(jv,sv,bookId);var out=[];for(var i=0;i<r.items.length;i++){var c=r.items[i];var t=String(c.title||(''+(i+1)));out.push({name:t,url:String(c.item_id||''),volume:String(c.volume_name||'')});}return out;}\nfunction FQ_mgInfo(jv,sv,bookId){var r=FQ_mgDir(jv,sv,bookId);var b=r.info;var tags=String(b.tags||b.category_v2||'');return {name:String(b.book_name||''),author:String(b.author||''),kind:String(b.category||tags),intro:String(b.abstract||b.book_abstract_v2||''),coverUrl:String(b.thumb_url||''),tags:tags,lastChapter:String(b.last_chapter_title||''),chapters:r.items.length};}\nfunction FQ_mgPics(resText){var dec=Packages.org.jsoup.parser.Parser.unescapeEntities(String(resText),true);var s=dec.indexOf('{');if(s<0)return [];var e=dec.lastIndexOf('}');if(e<s)return [];var j=JSON.parse(dec.substring(s,e+1));var mats=j.materials||{};var skel=(j.skeleton&&j.skeleton.data)||[];var urls=[];var seen={};function add(k){var m=mats[k];if(!m||String(m.type||'')!=='img')return;var d=m.data||{};var u=String(d.web_uri||'');if(!u||seen[u])return;seen[u]=1;urls.push(u);}if(skel.length){for(var i=0;i<skel.length;i++)add(String(skel[i].elementInfo||''));}if(!urls.length){var ks=[];for(var k in mats)ks.push(k);ks.sort();for(var q=0;q<ks.length;q++)add(ks[q]);}return urls;}\nfunction FQ_mgImgUrls(jv,sv,bookId,itemId){var pool=FQ_ensure(sv,2);if(!pool.length)throw new Error(FQ_MSG_NOMG);var res=FQ_cmGet(jv,bookId,[itemId],pool[0].d,pool[0].i);var t=res[itemId]||'';if(!t)throw new Error(FQ_MSG_NOMG);var urls=FQ_mgPics(t);if(!urls.length)throw new Error(FQ_MSG_NOMG);return urls;}\nfunction FQ_mgHtml(jv,sv,bookId,itemId){var urls=FQ_mgImgUrls(jv,sv,bookId,itemId);var Q=String.fromCharCode(34);var b='';for(var i=0;i<urls.length;i++){var u=urls[i];if(u.indexOf('http')!==0)u='https://'+FQ_IMG_DOMAINS[0]+'/origin/'+u;b+='<img src='+Q+u+Q+'>';}return b;}\n\n;function FQ_mgSearch(jv,kw,page){var off=String((parseInt(page||'1')-1)*10);\nvar suf='&enterfrom_aid=&enter_from=inner_search&app_name=news_article&version_name=7.0.8&app_version=7.0.8&channel=tt_huawei2019_yz&version_code=708&device_platform=android&parent_enterfrom=novel_list&novel_host=&aid=13&scm_version=1.0.0.4112&device_type=25053RT47C&device_brand=Redmi&language=zh&os_api=35&os_version=15&openudid=fqapp&update_version_code=70899&plugin=0&tma_jssdk_version=1.10.0.0&rom_version=miui__os2.0.209.0.volcnxm';\nvar url='https://api.fanqiesdk.com/api/novel/channel/homepage/search/search/v1/?q='+encodeURIComponent(kw)+'&offset='+off+suf;\nvar raw=FQ_web(jv,url,FQ_FUA);var d=JSON.parse(String(raw));var rd=(d.data&&d.data.ret_data)||[];var out=[];\nfor(var i=0;i<rd.length;i++){var it=rd[i];\nvar t=String(it.title||'').split('<em>').join('').split('</em>').join('');\nif(!t)continue;\nout.push({name:t,author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+String(it.book_id)});}\nreturn out;}\n\n;function FQ_mgIsComic(info){return !!info && info.comic_book_type!==undefined && info.comic_book_type!==null && String(info.comic_book_type)!=='';}\nfunction FQ_mgRaw(jv,sv,bookId){var raw=FQ_api(jv,sv,'/reading/bookapi/directory/all_items/v','book_type=2&item_data_list_md5=&catalog_data_md5=&book_id='+bookId+'&book_info_md5=&need_version=true&'+FQ_mgBase());return JSON.parse(raw);}\nfunction FQ_mgInfo2(jv,sv,bookId){var j=FQ_mgRaw(jv,sv,bookId);var b=(j.data&&j.data.book_info)||{};var il=(j.data&&j.data.item_data_list)||[];var comic=FQ_mgIsComic(b);var tags=String(b.tags||b.category_v2||'');return {name:String(b.book_name||''),author:String(b.author||''),kind:String(b.category||tags),intro:String(b.abstract||b.book_abstract_v2||''),coverUrl:String(b.thumb_url||''),tags:tags,lastChapter:String(b.last_chapter_title||''),chapters:il.length,isComic:comic?'1':'0'};}\nfunction FQ_mgText(jv,sv,bookId,itemId){var pool=FQ_ensure(sv,2);if(!pool.length)throw new Error(FQ_MSG_EMPTY);var res=FQ_cmGet(jv,bookId,[itemId],pool[0].d,pool[0].i);var t=res[itemId]||'';if(!t)throw new Error(FQ_MSG_EMPTY);var hasPic=FQ_mgPics(t);if(hasPic.length)return '';return t;}\n\n;function FQ_mgHtmlQuiet(jv,sv,bookId,itemId){try{var pool=FQ_ensure(sv,2);if(!pool.length)return '';var res=FQ_cmGet(jv,bookId,[itemId],pool[0].d,pool[0].i);var t=res[itemId]||'';if(!t)return '';var urls=FQ_mgPics(t);if(!urls.length)return '';var Q=String.fromCharCode(34);var b='';for(var i=0;i<urls.length;i++){var u=urls[i];if(u.indexOf('http')!==0)u='https://'+FQ_IMG_DOMAINS[0]+'/origin/'+u;b+='<img src='+Q+u+Q+'>';}return b;}catch(e){return '';}}\n", "lastUpdateTime": "1791895934075", "loginUi": "[\n {\n  \"name\": \"说明\",\n  \"type\": \"button\",\n  \"action\": \"FQ_mgHelp()\"\n },\n {\n  \"name\": \"检查站点连通状态\",\n  \"type\": \"button\",\n  \"action\": \"FQ_mgCheck()\"\n },\n {\n  \"name\": \"重置设备池\",\n  \"type\": \"button\",\n  \"action\": \"FQ_mgResetDev()\"\n },\n {\n  \"name\": \"打开番茄漫画官网\",\n  \"type\": \"button\",\n  \"action\": \"java.startBrowser('https://fanqienovel.com','番茄漫画')\"\n }\n]", "loginUrl": "function FQ_mgHelp(){\n  java.longToast('番茄漫画(APP)\\n\\n基于番茄官方 APP 接口逆向：x-argus/x-ladon 签名 + CM DH 通道解密。\\n\\n· 无需登录，设备自动注册\\n· 搜索/发现/阅读全免费\\n· 遇到读取失败：先「重置设备池」再刷新\\n· 正文为图片型，章节按话数出图');\n}\nfunction FQ_mgCheck(){\n  try{\n    var r=FQ_mgInfo(java,source,'7113804239352105991');\n    java.toast('站点连通正常：'+r.name+'（'+r.chapters+' 话）');\n  }catch(e){\n    java.toast('检查失败：'+e);\n  }\n}\nfunction FQ_mgResetDev(){\n  try{\n    source.put('fqPool','');\n    var pool=FQ_ensure(source,2);\n    java.toast('设备池已重置，当前 '+pool.length+' 个设备');\n  }catch(e){\n    java.toast('重置失败：'+e);\n  }\n}", "respondTime": 51858, "ruleBookInfo": {"author": "$.author", "coverUrl": "$.coverUrl", "init": "@js:(function(){var m=String(baseUrl).match(/([0-9]{15,})/);var bid=m?m[1]:'';if(!bid){throw new Error('无效书籍ID');}var r=FQ_mgInfo2(java,source,bid);if(!r.chapters)throw new Error('未找到书籍或目录为空');r.tocUrl='https://fanqienovel.com/page/'+bid;return JSON.stringify(r);})()", "intro": "$.intro", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name", "tocUrl": "$.tocUrl"}, "ruleContent": {"content": "@js:(function(){var m=String(baseUrl).match(/^https?:\\/\\/[^/]+\\/page\\/([0-9]{15,})/);var bid=m?m[1]:'';var m2=String(baseUrl).match(/#([0-9]+)$/);var item=m2?m2[1]:'';if(!bid||!item)throw new Error('参数错误');var h=FQ_mgHtmlQuiet(java,source,bid,item);if(h)return h;var t=FQ_mgText(java,source,bid,item);if(t)return t;throw new Error(FQ_MSG_NOMG);})()", "imageStyle": "FULL"}, "ruleExplore": {"author": "$.author", "bookList": "@js:(function(){var l=FQ_tabBooks(java,source,'9',1);var out=[];for(var i=0;i<l.length;i++){out.push(JSON.stringify(l[i]));}return out;})()", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "name": "$.name"}, "ruleSearch": {"author": "$.author", "bookList": "@js:(function(){var d=JSON.parse(String(result));var rd=(d.data&&d.data.ret_data)||[];var out=[];var mg=[];var other=[];for(var i=0;i<rd.length;i++){var it=rd[i];var t=String(it.title||'').split('<em>').join('').split('</em>').join('');if(!t)continue;var o=JSON.stringify({name:t,author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+String(it.book_id)});if(String(it.author||'').indexOf('番茄漫画')>=0||String(it.category||'').indexOf('漫画')>=0||String(it.category||'').indexOf('漫改')>=0){mg.push(o);}else{other.push(o);}}out=mg.concat(other);return out;})()", "bookUrl": "$.bookUrl", "checkKeyWord": "非人哉", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "name": "$.name"}, "ruleToc": {"chapterList": "@js:(function(){var m=String(baseUrl).match(/([0-9]{15,})/);var bid=m?m[1]:'';if(!bid){throw new Error('无效书籍ID');}var l=FQ_mgToc(java,source,bid);if(!l.length)throw new Error('目录为空');var out=[];for(var i=0;i<l.length;i++){out.push(JSON.stringify({name:l[i].name,url:'https://fanqienovel.com/page/'+bid+String.fromCharCode(35)+l[i].url}));}return out;})()", "chapterName": "$.name", "chapterUrl": "$.url"}, "searchUrl": "https://api.fanqiesdk.com/api/novel/channel/homepage/search/search/v1/?q={{key}}&offset={{(page-1)*10}}&enterfrom_aid=&enter_from=inner_search&app_name=news_article&version_name=7.0.8&app_version=7.0.8&channel=tt_huawei2019_yz&version_code=708&device_platform=android&parent_enterfrom=novel_list&novel_host=&aid=13&scm_version=1.0.0.4112&device_type=25053RT47C&device_brand=Redmi&language=zh&os_api=35&os_version=15&openudid=fqmanga&update_version_code=70899&plugin=0&tma_jssdk_version=1.10.0.0&rom_version=miui__os2.0.209.0.volcnxm", "weight": 0},{"bookSourceComment": "无需登录；音频流为 CENC-AES-CTR 加密，由书源在本地逐样本解密并写入缓存文件后交由阅读音频播放器播放。首次播放需等待下载与解密（约 15~30 秒）。登录界面可切换朗读音色。", "bookSourceGroup": "听书,番茄,AI", "bookSourceName": "🍅番茄听书(APP)", "bookSourceType": 1, "bookSourceUrl": "https://fanqienovel.com##听书版", "bookUrlPattern": "https?://fanqienovel[.]com/page/[0-9]+", "concurrentRate": "1/1200", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:(function(){var rows=[];rows.push({title:\"📻 听书频道\",url:\"\"});rows.push({title:\"🎧 爆款网文听听看\",url:\"https://fanqienovel.com?t=listen&p=1\"});rows.push({title:\"\",url:\"\"});rows.push({title:\"🎙 朗读音色（点击切换）\",url:\"\"});var tk=JSON.parse(FQ_atoneKinds(java));for(var j=0;j<tk.length;j++)rows.push(tk[j]);return JSON.stringify(rows);})()", "jsLib": "var FQ_H=String.fromCharCode(35,35);var FQ_SH=String.fromCharCode(35);var FQ_SL=String.fromCharCode(47);var FQ_Q=String.fromCharCode(39);var FQ_DQ=String.fromCharCode(34);var FQ_SP=String.fromCharCode(32);var FQ_MUA='Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Mobile Safari/537.36';var FQ_FUA='com.ss.android.article.news/13400 (Linux; U; Android 10; zh_CN; tb8788p1_64_bsp; Build/QQ3A.200805.001)';var FQ_FIXED='TdTC5rgxYgkOUrPHpnM7pByyRiuCmrWKGWs521cXdST0m69/COjWjSanLjfBqVovHwWlGJKu8pSXMrYqOKrdWA==';var FQ_HOST='https://api5-normal-sinfonlineb.fqnovel.com';var FQ_WEB='https://fanqienovel.com';var FQ_MSG_DETAIL=String.fromCharCode(35814,24773,33719,21462,22833,36133,65292,35831,37325,35797);var FQ_MSG_TOC=String.fromCharCode(30446,24405,33719,21462,22833,36133,65292,35831,37325,35797);var FQ_MSG_CT=String.fromCharCode(27491,25991,33719,21462,22833,36133,65292,35831,37325,35797);var FQ_MSG_LOCK=String.fromCharCode(128274);var FQ_MSG_EMPTY=String.fromCharCode(26412,31456,26242,26080,20869,23481,65292,35831,25442,28304);var FQ_IMG=String.fromCharCode(123,123,105,109,97,103,101,95,100,111,109,97,105,110,125,125);var FQ_MSG_PAY=String.fromCharCode(26412,31456,20026,20184,36153,31456,33410,65292,32593,39029,29256,26080,27861,20813,36153,38405,35835);function FQ_j2s(b){try{return String(new Packages.java.lang.String(b,Packages.java.nio.charset.Charset.forName('ISO-8859-1')));}catch(e){var s='';for(var i=0;i<b.length;i++){var v=b[i];if(v<0)v+=256;s+=String.fromCharCode(v);}return s;}}function FQ_s2j(s){return new Packages.java.lang.String(s).getBytes(Packages.java.nio.charset.Charset.forName('ISO-8859-1'));}function FQ_hex(b){var str=FQ_j2s(b);var s='';for(var i=0;i<str.length;i++){var v=str.charCodeAt(i)&255;s+=(v<16?'0':'')+v.toString(16);}return s;}function FQ_unhex(h){var r='';for(var i=0;i<h.length;i+=2)r+=String.fromCharCode(parseInt(h.substr(i,2),16));return r;}function FQ_sm3(s){var rotl=function(x,n){n=n&31;return ((x<<n)|(x>>>(32-n)))>>>0;};var len=s.length,bitLen=len*8,arr=[];for(var i=0;i<len;i++)arr.push(s.charCodeAt(i)&255);arr.push(0x80);while(arr.length%64!==56)arr.push(0);var hi=Math.floor(bitLen/4294967296),lo=bitLen>>>0;arr.push((hi>>>24)&255,(hi>>>16)&255,(hi>>>8)&255,hi&255);arr.push((lo>>>24)&255,(lo>>>16)&255,(lo>>>8)&255,lo&255);var V=[0x7380166f,0x4914b2b9,0x172442d7,0xda8a0600,0xa96f30bc,0x163138aa,0xe38dee4d,0xb0fb0e4e];for(var b=0;b<arr.length;b+=64){var W=[];for(var i=0;i<16;i++)W.push(((arr[b+i*4]<<24)|(arr[b+i*4+1]<<16)|(arr[b+i*4+2]<<8)|arr[b+i*4+3])>>>0);for(var j=16;j<68;j++){var x=(W[j-16]^W[j-9]^rotl(W[j-3],15))>>>0;x=(x^rotl(x,15)^rotl(x,23))>>>0;W.push((x^rotl(W[j-13],7)^W[j-6])>>>0);}var W1=[];for(var j=0;j<64;j++)W1.push((W[j]^W[j+4])>>>0);var A=V[0],B=V[1],C=V[2],D=V[3],E=V[4],F=V[5],G=V[6],H=V[7];for(var j=0;j<64;j++){var Tj=(j<16)?0x79cc4519:0x7a879d8a;var SS1=rotl((rotl(A,12)+E+rotl(Tj,j&31))>>>0,7);var SS2=(SS1^rotl(A,12))>>>0;var FFj=(j<16)?((A^B^C)>>>0):(((A&B)|(A&C)|(B&C))>>>0);var GGj=(j<16)?((E^F^G)>>>0):(((E&F)|((~E)&G))>>>0);var TT1=(FFj+D+SS2+W1[j])>>>0;var TT2=(GGj+H+SS1+W[j])>>>0;D=C;C=rotl(B,9);B=A;A=TT1;H=G;G=rotl(F,19);F=E;E=(TT2^rotl(TT2,9)^rotl(TT2,17))>>>0;}V[0]=(V[0]^A)>>>0;V[1]=(V[1]^B)>>>0;V[2]=(V[2]^C)>>>0;V[3]=(V[3]^D)>>>0;V[4]=(V[4]^E)>>>0;V[5]=(V[5]^F)>>>0;V[6]=(V[6]^G)>>>0;V[7]=(V[7]^H)>>>0;}var out='';for(var i=0;i<8;i++)out+=('0000000'+V[i].toString(16)).slice(-8);return out;}function FQ_md5(s){var d=Packages.java.security.MessageDigest.getInstance('MD5');var b=FQ_s2j(s);d.update(b);return FQ_hex(d.digest());}function FQ_b64(s){return String(Packages.java.util.Base64.getEncoder().encodeToString(FQ_s2j(s)));}function FQ_b64d(s){return FQ_j2s(Packages.java.util.Base64.getDecoder().decode(String(s)));}function FQ_aesCbc(data,key,iv){var C=Packages.javax.crypto.Cipher;var c=C.getInstance('AES/CBC/NoPadding');c.init(C.ENCRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(FQ_s2j(key),'AES'),new Packages.javax.crypto.spec.IvParameterSpec(FQ_s2j(iv)));return FQ_j2s(c.doFinal(FQ_s2j(data)));}function FQ_pad(s){var p=16-(s.length%16);if(p===0)p=16;var o=s;for(var i=0;i<p;i++)o+=String.fromCharCode(p);return o;}function FQ_w(lo,hi){return {lo:lo>>>0,hi:hi>>>0};}function FQ_xor(){var lo=0,hi=0;for(var i=0;i<arguments.length;i++){lo^=arguments[i].lo;hi^=arguments[i].hi;}return FQ_w(lo,hi);}function FQ_n64(v){return FQ_w(~v.lo,~v.hi);}function FQ_add(a,b){var lo=(a.lo+b.lo)>>>0;return FQ_w(lo,(a.hi+b.hi+(lo<a.lo?1:0))>>>0);}function FQ_rol(v,c){var s=((c%64)+64)%64;if(s===0)return FQ_w(v.lo,v.hi);if(s<32)return FQ_w((v.lo<<s)|(v.hi>>>(32-s)),(v.hi<<s)|(v.lo>>>(32-s)));if(s===32)return FQ_w(v.hi,v.lo);var r=s-32;return FQ_w((v.hi<<r)|(v.lo>>>(32-r)),(v.lo<<r)|(v.hi>>>(32-r)));}function FQ_ror(v,c){return FQ_rol(v,64-(c%64));}function FQ_r64(s,o){o=o||0;return FQ_w((s.charCodeAt(o)|(s.charCodeAt(o+1)<<8)|(s.charCodeAt(o+2)<<16)|(s.charCodeAt(o+3)<<24))>>>0,(s.charCodeAt(o+4)|(s.charCodeAt(o+5)<<8)|(s.charCodeAt(o+6)<<16)|(s.charCodeAt(o+7)<<24))>>>0);}function FQ_w64le2(l,r){var o='';for(var i=0;i<4;i++)o+=String.fromCharCode((l.lo>>>(i*8))&255);for(var i2=0;i2<4;i2++)o+=String.fromCharCode((l.hi>>>(i2*8))&255);for(var i3=0;i3<4;i3++)o+=String.fromCharCode((r.lo>>>(i3*8))&255);for(var i4=0;i4<4;i4++)o+=String.fromCharCode((r.hi>>>(i4*8))&255);return o;}var FQ_SZ=FQ_w(0x046d678b,0x3dc94c3a);function FQ_zbit(i){return FQ_w(i<32?((FQ_SZ.lo>>>i)&1):((FQ_SZ.hi>>>(i-32))&1),0);}var FQ_SK='fc78e0a9657a0c748ce51559903ccf03510e51d3cff232d71343e88a321c5304';var FQ_AK='d31e3718288a1027baab59f146a09a9c';var FQ_AIV='ea180a0336ed352fcd24e4d50018ae54';function FQ_srk(key){var w=[];for(var i=0;i<4;i++)w.push(FQ_r64(key,i*8));for(var x=4;x<72;x++){var m=FQ_xor(FQ_ror(w[x-1],3),w[x-3]);m=FQ_xor(m,FQ_ror(m,1));w.push(FQ_xor(FQ_n64(w[x-4]),m,FQ_zbit((x-4)%62),FQ_w(3,0)));}return w;}function FQ_sEnc(blk,keys){var l=FQ_r64(blk,0),r=FQ_r64(blk,8);for(var i=0;i<keys.length;i++){var o=r;var nl=FQ_w(FQ_rol(r,1).lo&FQ_rol(r,8).lo,FQ_rol(r,1).hi&FQ_rol(r,8).hi);r=FQ_xor(l,nl,FQ_rol(r,2),keys[i]);l=o;}return FQ_w64le2(l,r);}function FQ_ev(v){var o='';while(v>=0x80){o+=String.fromCharCode((v%0x80)|0x80);v=Math.floor(v/0x80);}o+=String.fromCharCode(v);return o;}function FQ_pbv(f,v){return FQ_ev(f*8)+FQ_ev(v);}function FQ_pbb(f,v){var e=(typeof v==='number')?String.fromCharCode(v):String(v);return FQ_ev(f*8+2)+FQ_ev(e.length)+e;}function FQ_argusBean(q,stub,ts,dev,iid,aid,rv){var bi=(/^[0-9a-f]{32}$/i.test(stub))?FQ_unhex(stub):FQ_unhex('00000000000000000000000000000000');var bh=FQ_unhex(FQ_sm3(bi).substr(0,12));var qh=(q==='')?FQ_unhex(FQ_sm3(FQ_unhex('00000000000000000000000000000000')).substr(0,12)):FQ_unhex(FQ_sm3(q).substr(0,12));var nest=FQ_pbv(1,1)+FQ_pbv(2,1)+FQ_pbv(3,1)+FQ_pbv(7,0xC792ECCC);var s23=FQ_pbb(1,'NX551J')+FQ_pbv(2,8196)+FQ_pbv(4,0x80E0D800);return FQ_pbv(1,1077940818)+FQ_pbv(2,2)+FQ_pbv(3,rv)+FQ_pbb(4,String(aid))+FQ_pbb(5,dev)+FQ_pbb(6,'1611921764')+FQ_pbb(7,FQ_qp(q,'version_name'))+FQ_pbb(8,'v04.04.05-ov-android')+FQ_pbv(9,134744640)+FQ_pbb(10,FQ_unhex('0000000000000000'))+FQ_pbv(11,0)+FQ_pbv(12,ts*2)+FQ_pbb(13,bh)+FQ_pbb(14,qh)+FQ_pbb(15,nest)+FQ_pbb(16,iid)+FQ_pbb(20,'none')+FQ_pbv(21,738)+FQ_pbb(23,s23)+FQ_pbv(25,2);}function FQ_argus(q,stub,ts,dev,iid,aid,rv){var pb=FQ_pad(FQ_argusBean(q,stub,ts,dev,iid,aid,rv));var keys=FQ_srk(FQ_unhex(FQ_SK));var enc='';for(var o=0;o<pb.length;o+=16)enc+=FQ_sEnc(pb.substr(o,16),keys);var magic=FQ_unhex('f2f7fcfff2f7fcff');var un=magic+enc+FQ_unhex('eafb2cfe8568519154');var buf=un.substr(0,8);for(var i=8;i<un.length;i++)buf+=String.fromCharCode((un.charCodeAt(i)^magic.charCodeAt(i%8))&255);var rev='';for(var j=buf.length-1;j>=0;j--)rev+=buf.charAt(j);var fin=FQ_pad(rev+'ao');var ct=FQ_aesCbc(fin,FQ_unhex(FQ_AK),FQ_unhex(FQ_AIV));return FQ_b64(FQ_unhex('f281')+ct);}function FQ_lrk(rp,aid){var dg=FQ_md5(rp+String(aid));var w=[];for(var i=0;i<34;i++)w.push(FQ_w(0,0));w[0]=FQ_r64(dg,0);w[1]=FQ_r64(dg,8);w[2]=FQ_r64(dg,16);w[3]=FQ_r64(dg,24);var b0=w[0],b8=w[1],q=[w[2],w[3]];for(var x=0;x<0x22;x++){var x9=b0;var x8=b8;x8=FQ_ror(x8,8);x8=FQ_add(x8,x9);x8=FQ_xor(x8,FQ_w(x,0));q.push(x8);x8=FQ_xor(x8,FQ_rol(x9,3));w[x+1]=x8;b0=x8;b8=q.shift();}return w;}function FQ_lEnc(blk,keys){var l=FQ_r64(blk,0),r=FQ_r64(blk,8);for(var i=0;i<34;i++){r=FQ_xor(keys[i],FQ_add(l,FQ_ror(r,8)));l=FQ_xor(r,FQ_ror(l,61));}return FQ_w64le2(l,r);}function FQ_ladon(ts,lic,aid,rp){var data=String(ts)+'-'+lic+'-'+aid;var pad2=16-(data.length%16);var pd=data;for(var i=0;i<pad2;i++)pd+=String.fromCharCode(pad2);var ks=FQ_lrk(rp,aid);var ct='';for(var o=0;o<pd.length;o+=16)ct+=FQ_lEnc(pd.substr(o,16),ks);return FQ_b64(rp+ct);}function FQ_sign(q,stub,ts,dev,iid,aid,rv){var h={'x-ss-req-ticket':String(ts*1000),'x-khronos':String(ts),'x-argus':FQ_argus(q,stub,ts,dev,iid,aid,rv),'x-ladon':FQ_ladon(ts,1611921764,aid,String.fromCharCode(1,2,3,4))};if(stub)h['x-ss-stub']=stub;return h;}function FQ_qp(q,k){var ps=String(q||'').split('&');for(var i=0;i<ps.length;i++){var e=ps[i].indexOf('=');if(e>0&&ps[i].substring(0,e)===k)return ps[i].substring(e+1);}return '';}function FQ_qs(url){var t=String(url||'');var i=t.indexOf('?');if(i<0)return '';var j=t.indexOf('#',i);return t.slice(i+1,j<0?t.length:j);}function FQ_qp(url,n){var e=String(n);var ps=FQ_qs(url).split('&');for(var i=0;i<ps.length;i++){if(!ps[i])continue;var s=ps[i].indexOf('=');var k=s<0?ps[i]:ps[i].substr(0,s);if(k===e)return s<0?'':ps[i].substr(s+1);}return '';}function FQ_now(){return Math.floor(new Date().getTime()/1000);}function FQ_ua(){return 'com.dragon.read/66732 (Linux; U; Android 10; zh_CN; Pixel 4 XL; Build/QD1A.190821.007;tt-ok/3.12.13.4-tiktok)';}function FQ_hpost(url,bodyStr,headers){var arr=FQ_s2j(bodyStr);var c=new Packages.java.net.URL(url).openConnection();c.setRequestMethod('POST');c.setDoOutput(true);for(var k in headers)c.setRequestProperty(k,headers[k]);c.setConnectTimeout(20000);c.setReadTimeout(25000);var out=c.getOutputStream();out.write(arr,0,arr.length);out.flush();out.close();var code=c.getResponseCode();var is=(code>=400)?c.getErrorStream():c.getInputStream();var sb='';if(is){var enc=String(c.getHeaderField('Content-Encoding')||'');var stream=is;if(enc.indexOf('gzip')>=0)stream=new Packages.java.util.zip.GZIPInputStream(is);var rd=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(stream,'UTF-8'));var line;while((line=rd.readLine())!=null)sb+=String(line);rd.close();}return {code:code,body:sb};}function FQ_gz(s){var bos=new Packages.java.io.ByteArrayOutputStream();var g=new Packages.java.util.zip.GZIPOutputStream(bos);var b=new Packages.java.lang.String(s).getBytes(Packages.java.nio.charset.Charset.forName('UTF-8'));g.write(b,0,b.length);g.close();var arr=bos.toByteArray();var out='';for(var i=0;i<arr.length;i++){var v=arr[i]&255;if(i===8)v=2;if(i===9)v=3;out+=String.fromCharCode(v);}return out;}function FQ_ttEnc(data){var rnd='';for(var i=0;i<32;i++)rnd+=String.fromCharCode(Math.floor(Math.random()*256));var md=Packages.java.security.MessageDigest.getInstance('SHA-512');md.update(FQ_s2j(rnd));var inner=md.digest();var md2=Packages.java.security.MessageDigest.getInstance('SHA-512');md2.update(inner);md2.update(FQ_s2j(FQ_b64d(FQ_FIXED)));var hv=md2.digest();var keyB=Packages.java.util.Arrays.copyOfRange(hv,0,16);var ivB=Packages.java.util.Arrays.copyOfRange(hv,16,32);var md3=Packages.java.security.MessageDigest.getInstance('SHA-512');md3.update(FQ_s2j(data));var dh=md3.digest();var C=Packages.javax.crypto.Cipher;var c=C.getInstance('AES/CBC/NoPadding');c.init(C.ENCRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(keyB,'AES'),new Packages.javax.crypto.spec.IvParameterSpec(ivB));return String.fromCharCode(0x74,0x63,0x05,0x10,0,0)+rnd+FQ_j2s(c.doFinal(FQ_s2j(FQ_pad(FQ_j2s(dh)+data))));}function FQ_alnum(n){var ch='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';var s='';for(var i=0;i<n;i++)s+=ch.charAt(Math.floor(Math.random()*ch.length));return s;}function FQ_uuid(){return String(Packages.java.util.UUID.randomUUID());}function FQ_getPool(sv){var p=String(sv.get('fqPool')||'');if(!p){return [];}var out=[];var arr=p.split('|');for(var i=0;i<arr.length;i++){var kv=arr[i].split(',');if(kv.length>=2&&kv[0])out.push({d:kv[0],i:kv[1],o:kv[2]||'',c:kv[3]||''});}return out;}function FQ_savePool(sv,pool){var a=[];for(var i=0;i<pool.length;i++)a.push(pool[i].d+','+pool[i].i+','+(pool[i].o||'')+','+(pool[i].c||''));sv.put('fqPool',a.join('|'));}function FQ_registerOne(){var openudid=FQ_alnum(16),cdid=FQ_uuid(),clientudid=FQ_uuid();var ua='com.dragon.read/65132 (Linux; U; Android 10; zh_CN; MI 12; Build/MMB29M; Cronet/TTNetVersion:9ac8d95c 2024-11-25 QuicVersion:3f326df4 2024-11-14)';var header={display_name:'番茄小说',update_version_code:'65132',manifest_version_code:'65132',aid:1967,channel:'xiaomi_1967_64',package:'com.dragon.read',app_version:'6.5.1.32',version_code:'65132',sdk_version:'v04.04.05-ov-android',sdk_target_version:29,os:'Android',os_version:'10',os_api:'29',device_model:'MI 12',device_brand:'Xiaomi',device_manufacturer:'Google',device_category:'phone',cpu_abi:'arm64-v8a',release_build:FQ_uuid(),density_dpi:'560',display_density:'mdpi',resolution:'1440x2392',language:'zh',mac:'11:22:33:44:55:66',timezone:8,access:'wifi',not_request_sender:0,carrier:'CHINA MOBILE',mcc_mnc:'46007',rom:'EMUI-'+FQ_alnum(13),rom_version:FQ_alnum(2),sig_hash:FQ_md5(FQ_uuid()),openudid:openudid,clientudid:clientudid,sim_serial_number:[],region:'CN',tz_name:'Asia/Shanghai',tz_offset:28800,sim_region:'cn'};var js=JSON.stringify({magic_tag:'ss_app_log',header:header,_gen_time:new Date().getTime()});var post=FQ_ttEnc(FQ_gz(js));var ts=FQ_now();var P=[['tt_data','a'],['os_api','29'],['device_type','MI 12'],['ssmix','a'],['manifest_version_code','65132'],['dpi','560'],['version_name','6.5.1.32'],['ts',String(ts)],['cpu_support64','true'],['app_type','normal'],['appTheme','light'],['ac','wifi'],['host_abi','arm64-v8a'],['update_version_code','65132'],['channel','xiaomi_1967_64'],['_rticket',String(new Date().getTime())],['device_platform','android'],['version_code','65132'],['cdid',cdid],['os','android'],['is_android_pad','0'],['openudid',openudid],['package','com.dragon.read'],['resolution','1440*2392'],['os_version','10'],['language','zh'],['device_brand','Xiaomi'],['need_personal_recommend','1'],['aid','1967'],['minor_status','0'],['app_name','novel'],['mcc_mnc','46007']];P.sort(function(a,b){return a[0]<b[0]?-1:(a[0]>b[0]?1:0);});var qs='';for(var i=0;i<P.length;i++){if(i)qs+='&';qs+=P[i][0]+'='+encodeURIComponent(P[i][1]);}var r=FQ_hpost('https://log.snssdk.com/service/2/device_register/?'+qs,post,{'Content-Type':'application/octet-stream;tt-data=a','accept-encoding':'gzip','user-agent':ua,'connection':'Keep-Alive'});var Q=String.fromCharCode(34);var m=r.body.match(new RegExp(Q+'device_id_str'+Q+':'+Q+'([0-9]+)'+Q));if(!m)return null;var m2=r.body.match(new RegExp(Q+'install_id_str'+Q+':'+Q+'([0-9]+)'+Q));return {d:m[1],i:m2?m2[1]:'',o:openudid,c:cdid};}function FQ_ensure(sv,n){var pool=FQ_getPool(sv);var need=(n||3)-pool.length;var added=0;for(var i=0;i<need;i++){  var d=FQ_registerOne();  if(d){pool.push(d);added++;FQ_savePool(sv,pool);}}return pool;}function FQ_api(jv,sv,path,q,host,aid){var pool=FQ_ensure(sv,2);if(!pool.length)throw new Error('设备池为空，请检查网络后重试');var dev=pool[0].d,iid=pool[0].i;var qq=q+'&iid='+iid+'&device_id='+dev;var url=(host||FQ_HOST)+path+'?'+qq;var ts=FQ_now();var h=FQ_sign(FQ_qs(url),'',ts,dev,iid,aid||1967,Math.floor(Math.random()*2000000000));h['User-Agent']=FQ_ua();return String(jv.ajax(url+','+JSON.stringify({headers:h})));}function FQ_web(jv,url,ua){var h={'User-Agent':ua||FQ_MUA};return String(jv.ajax(url+','+JSON.stringify({headers:h})));}var QC=String.fromCharCode(34);function FQ_state(txt){var t=String(txt||'');var i=t.indexOf('window.__INITIAL_STATE__=');if(i<0)return null;var st0=t.indexOf('{',i);if(st0<0)return null;var seg=t.substring(st0);var depth=0,end=-1,instr=false,esc=false;for(var k=0;k<seg.length;k++){var ch=seg.charAt(k);if(instr){if(esc)esc=false;else if(ch===String.fromCharCode(92))esc=true;else if(ch===QC)instr=false;continue;}if(ch===QC)instr=true;else if(ch==='{')depth++;else if(ch==='}'){depth--;if(depth===0){end=k+1;break;}}}if(end<0)return null;try{return JSON.parse(seg.substring(0,end));}catch(e){return null;}}function FQ_tag(s){var t=String(s||'');return t.split('<em>').join('').split('</em>').join('').split('<').join('&lt;');}function FQ_search(jv,sv,kw,page){var off=((page||1)-1)*10;var suf='&enterfrom_aid=&enter_from=inner_search&app_name=news_article&version_name=7.0.8&app_version=7.0.8&channel=tt_huawei2019_yz&version_code=708&device_platform=android&parent_enterfrom=novel_list&novel_host=&aid=13&scm_version=1.0.0.4112&device_type=25053RT47C&device_brand=Redmi&language=zh&os_api=35&os_version=15&openudid=fqapp&update_version_code=70899&plugin=0&tma_jssdk_version=1.10.0.0&rom_version=miui__os2.0.209.0.volcnxm';var url='https://api.fanqiesdk.com/api/novel/channel/homepage/search/search/v1/?q='+encodeURIComponent(kw)+'&offset='+off+suf;var raw=FQ_web(jv,url,FQ_FUA);var out=[];try{var d=JSON.parse(raw);var rd=(d.data&&d.data.ret_data)||[];for(var i=0;i<rd.length;i++){var it=rd[i];out.push({name:FQ_tag(it.title),author:FQ_tag(it.author||''),kind:FQ_tag(it.category||''),intro:FQ_tag(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+it.book_id+FQ_SH+it.book_id,bookId:String(it.book_id)});}}catch(e){}return out;}function FQ_homeList(jv,sv){var raw=FQ_web(jv,'https://fanqienovel.com/','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36');var d=FQ_state(raw);var out=[];if(!d)return out;var hm=d.home||{};var groups=['weekList','editorList','updateList','newbookList','boyList','girlList','readRankList','newRankList','fantasyList','topRankList'];var seen={};for(var g=0;g<groups.length;g++){var arr=hm[groups[g]]||[];for(var i=0;i<arr.length;i++){var it=arr[i];var bid=String(it.bookId||'');if(!bid||seen[bid])continue;seen[bid]=1;out.push({name:String(it.bookName||''),author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumbUri||''),bookUrl:'https://fanqienovel.com/page/'+bid+FQ_SH+bid});}}return out;}function FQ_rankList(jv,sv,rankId){var raw=FQ_web(jv,FQ_WEB+FQ_SL.concat('api',FQ_SL,'rank',FQ_SL,'list?rank_id=')+(rankId||1)+'&offset=0&count=20');var out=[];try{var d=JSON.parse(raw);var l=(d.data&&d.data.list)||[];for(var i=0;i<l.length;i++){var it=l[i];var bid=String(it.bookId||'');out.push({name:String(it.bookName||''),author:String(it.author||''),kind:'排行榜',intro:String(it.abstract||''),coverUrl:String(it.thumbUri||''),bookUrl:'https://fanqienovel.com/page/'+bid+FQ_SH+bid,bookId:bid});}}catch(e){}return out;}function FQ_getDev(sv){var d=String(sv.get('fqdev')||'');var i=String(sv.get('fqiid')||'');return {d:d,i:i};}function FQ_regAndSave(sv){var r=FQ_regTest();var Q=String.fromCharCode(34);var m=r.match(new RegExp(Q+'device_id_str'+Q+':'+Q+'([0-9]+)'+Q));if(!m)return null;var m2=r.match(new RegExp(Q+'install_id_str'+Q+':'+Q+'([0-9]+)'+Q));var d=m[1],i=m2?m2[1]:'';sv.put('fqdev',d);sv.put('fqiid',i);return {d:d,i:i};}function FQ_bigBytes(n){var h=String(n.toString(16));if(h.length%2===1)h='0'+h;if(h.length>384)h=h.substring(h.length-384);return FQ_unhex(h);}function FQ_b64eJS(str){var CH='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';var out='';var i=0;var n=str.length;while(i<n){var c1=str.charCodeAt(i++)&255;var c2=(i<n)?str.charCodeAt(i++)&255:NaN;var c3=(i<n)?str.charCodeAt(i++)&255:NaN;var e1=c1>>2;var e2=((c1&3)<<4)|(isNaN(c2)?0:(c2>>4));var e3=isNaN(c2)?64:(((c2&15)<<2)|(isNaN(c3)?0:(c3>>6)));var e4=isNaN(c3)?64:(c3&63);out+=CH.charAt(e1)+CH.charAt(e2)+(e3===64?'=':CH.charAt(e3))+(e4===64?'=':CH.charAt(e4));}return out;}function FQ_b64dJS(str){var CH='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';var out='';var buf=0,bits=0;for(var i=0;i<str.length;i++){var c=str.charAt(i);if(c==='=')break;var v=CH.indexOf(c);if(v<0)continue;buf=(buf<<6)|v;bits+=6;if(bits>=8){bits-=8;out+=String.fromCharCode((buf>>bits)&255);}}return out;}function FQ_b64d2(s){try{return Packages.java.util.Base64.getDecoder().decode(String(s));}catch(e){return FQ_s2j(FQ_b64dJS(String(s)));}}function FQ_b64e2(b){try{return String(Packages.java.util.Base64.getEncoder().encodeToString(b));}catch(e){return FQ_b64eJS(FQ_j2s(b));}}function FQ_bytesHex(b){var str=FQ_j2s(b);var s='';for(var i=0;i<str.length;i++){var v=str.charCodeAt(i)&255;s+=(v<16?'0':'')+v.toString(16);}return s;}function FQ_cmGet(jv,bookId,itemIds,dev,iid){var CMP='ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff';var P=new Packages.java.math.BigInteger(CMP,16);var pk=new Packages.java.math.BigInteger(256,new Packages.java.security.SecureRandom());pk=pk.mod(P.subtract(Packages.java.math.BigInteger.ONE));var pub=Packages.java.math.BigInteger.valueOf(2).modPow(pk,P);var iv=new Packages.java.security.SecureRandom().generateSeed(16);var rk=FQ_b64d2('rCXGfd2POMGzeiNIgo4iLg==');var CC=Packages.javax.crypto.Cipher;var c1=CC.getInstance('AES/CBC/PKCS5Padding');c1.init(CC.ENCRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(rk,'AES'),new Packages.javax.crypto.spec.IvParameterSpec(iv));var ct1=c1.doFinal(FQ_s2j(FQ_bigBytes(pub)));var key=FQ_b64e2(FQ_s2j(FQ_j2s(iv)+FQ_j2s(ct1)));var body=JSON.stringify({book_id:bookId,item_ids:itemIds,key:key});var url='https://novelfm-hl.snssdk.com/novelfm/playerapi/full/mget/v1/?aid=3040&app_name=novelapp&channel=0&device_id='+dev+'&device_platform=android&device_type=UGFFI55&iid='+iid+'&os_version=0&version_code=58932&version_name=5.8.9.32';var ts=FQ_now();var stub=FQ_md5(body);var hh=FQ_sign(FQ_qs(url),stub,ts,dev,iid,3040,Math.floor(Math.random()*2000000000));hh['User-Agent']='com.dragon.read';hh['Content-Type']='application/json; charset=utf-8';var resp=FQ_hpost(url,body,hh);var dd=JSON.parse(resp.body);var infos=dd.data.item_infos;var out={};for(var iid2 in infos){var it=infos[iid2];if(!it||!it.key||!it.content){continue;}var srvHex=FQ_bytesHex(FQ_b64d2(String(it.key)));var srvN=new Packages.java.math.BigInteger(srvHex,16);var shared=srvN.modPow(pk,P);var shHex=String(shared.toString(16));if(shHex.length%2===1)shHex='0'+shHex;if(shHex.length>384)shHex=shHex.substring(shHex.length-384);var aesKey=Packages.java.util.Arrays.copyOfRange(FQ_s2j(FQ_unhex(shHex.substring(0,64))),0,32);var cb=FQ_b64d2(String(it.content));var civ=Packages.java.util.Arrays.copyOfRange(cb,0,16);var cct=Packages.java.util.Arrays.copyOfRange(cb,16,cb.length);var c2=CC.getInstance('AES/CBC/PKCS5Padding');c2.init(CC.DECRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(aesKey,'AES'),new Packages.javax.crypto.spec.IvParameterSpec(civ));var ptArr=c2.doFinal(cct);out[iid2]=String(new Packages.java.lang.String(ptArr,'UTF-8'));}return out;}function FQ_dev(sv){var d=String(sv.get('fqdev')||'');var i=String(sv.get('fqiid')||'');return {d:d,i:i};}function FQ_search(jv,sv,kw,page){var off=String((parseInt(page||'1')-1)*10);var q='q='+encodeURIComponent(kw)+'&offset='+off+'&enterfrom_aid=&enter_from=inner_search&app_name=news_article&version_name=7.0.8&app_version=7.0.8&channel=tt_huawei2019_yz&version_code=708&device_platform=android&parent_enterfrom=novel_list&novel_host=&aid=13&scm_version=1.0.0.4112&device_type=25053RT47C&device_brand=Redmi&language=zh&os_api=35&os_version=15&openudid='+FQ_alnum(16)+'&update_version_code=70899&plugin=0&tma_jssdk_version=1.10.0.0&rom_version=miui__os2.0.209.0.volcnxm';var url='https://api.fanqiesdk.com/api/novel/channel/homepage/search/search/v1/?'+q;var UAK=String.fromCharCode(85,115,101,114,45,65,103,101,110,116);var hd={};hd[UAK]=FQ_FUA;var r=String(jv.ajax(url+','+JSON.stringify({headers:hd})));var d=JSON.parse(r);var items=(d.data&&d.data.ret_data)?d.data.ret_data:[];var out=[];for(var i=0;i<items.length;i++){var it=items[i];var t=String(it.title||'').split('<em>').join('').split('</em>').join('');out.push({name:t,author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+String(it.book_id)});}return out;}function FQ_toc(jv,sv,bookId){var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';var url='https://api5-normal-sinfonlineb.fqnovel.com/reading/bookapi/directory/all_items/v?book_type=0&item_data_list_md5=&catalog_data_md5=&book_id='+bookId+'&book_info_md5=&need_version=true&device_id='+dev+'&'+base;var ts=FQ_now();var h=FQ_sign(FQ_qs(url),'',ts,dev,'',1967,Math.floor(Math.random()*2000000000));h['User-Agent']='Mozilla/5.0 (Linux; Android 13)';var r=String(jv.ajax(url+','+JSON.stringify({headers:h})));var d=JSON.parse(r);var cats=(d.data&&d.data.catalog_data)?d.data.catalog_data:[];var out=[];for(var i=0;i<cats.length;i++){var c=cats[i];out.push({name:String(c.catalog_title||('第'+(i+1)+'章')),url:String(c.item_id)});}return out;}function FQ_explore(jv,sv,kind,page){var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';var tt={'推荐':2,'经典':3,'知识':4,'听书':5,'看剧':6,'视频':7,'短篇':8,'漫画':9,'买书':10};var tabType=tt[kind]||2;var off=((parseInt(page||'1')-1)*16);var q='tab_type='+tabType+'&offset='+off+'&client_template=0&'+base;var raw=FQ_api(jv,sv,'/reading/bookapi/bookmall/tab/v',q);var d=JSON.parse(raw);var ti=d.data.tab_item||[];var out=[];for(var t=0;t<ti.length;t++){var cells=ti[t].cell_data||[];for(var c=0;c<cells.length;c++){var bd=cells[c].book_data||[];for(var b=0;b<bd.length;b++){var it=bd[b];var bid=String(it.book_id||'');if(!bid)continue;out.push({name:String(it.book_name||''),author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+bid+FQ_SH+bid});}}}return out;}function FQ_pickBooks(jv,sv,catId,algo,page){var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';var off=((parseInt(page||'1')-1)*16);var q='cell_id=7098235271900037133&offset='+off+'&client_template=2&client_req_type=2&tab_type=2&req_rank_category_id='+catId+'&req_rank_algo='+(algo||101)+'&'+base;var raw=FQ_api(jv,sv,'/reading/bookapi/bookmall/cell/change/v1/',q);var d=JSON.parse(raw);var cv=(d.data&&d.data.cell_view)||{};var bd=cv.book_data||[];var out=[];for(var i=0;i<bd.length;i++){var it=bd[i];var bid=String(it.book_id||'');if(!bid)continue;out.push({name:String(it.book_name||''),author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+bid+FQ_SH+bid});}return out;}function FQ_tabBooks(jv,sv,tabType,page){var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';var off=((parseInt(page||'1')-1)*16);var q='tab_type='+tabType+'&offset='+off+'&client_template=0&'+base;var raw=FQ_api(jv,sv,'/reading/bookapi/bookmall/tab/v',q);var d=JSON.parse(raw);var ti=d.data.tab_item||[];var out=[];var seen={};for(var t=0;t<ti.length;t++){var cells=ti[t].cell_data||[];for(var c=0;c<cells.length;c++){var bd=cells[c].book_data||[];for(var b=0;b<bd.length;b++){var it=bd[b];var bid=String(it.book_id||'');if(!bid||seen[bid])continue;seen[bid]=1;out.push({name:String(it.book_name||''),author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+bid+FQ_SH+bid});}}}return out;}var FQ_AHOST='https://api5-sinfonlineb.novelfm.com';\nvar FQ_APATH='/novelfm/playerapi/video_model/mget/v1';\nvar FQ_AQUERY='os=android&aid=3040&ssmix=a&manifest_version_code=632&dpi=440&device_brand=Redmi&language=zh&os_api=35&comment_tag_c=5&vip_state=0&host_abi=arm64-v8a&category_style=1&need_personal_recommend=1&rom_version=miui_V816_OS3.0.1.0.VMRCNXM&device_platform=android&device_type=UGFFI55&app_name=novelapp&version_code=58932&version_name=5.8.9.32&channel=0';\nvar FQ_CACHE='/storage/emulated/0/Android/data/com.legado.app.release/cache';\nvar FQ_TONES=[{i:0,n:'默认(推荐)'},{i:1,n:'甜美少女音'},{i:2,n:'清亮青叔音'},{i:4,n:'成熟大叔音'},{i:5,n:'开朗青年音'},{i:6,n:'温柔淑女音'},{i:51,n:'青年音'},{i:74,n:'大叔音升级版'},{i:96,n:'升级版96'},{i:97,n:'升级版(多角色)'},{i:26,n:'音色26'},{i:27,n:'音色27'},{i:28,n:'音色28'},{i:29,n:'音色29'},{i:30,n:'音色30'},{i:31,n:'音色31'},{i:63,n:'音色63'},{i:64,n:'音色64'},{i:67,n:'音色67'},{i:68,n:'音色68'},{i:71,n:'音色71'},{i:100,n:'音色100'},{i:105,n:'音色105'}];\nvar FQ_ACSP=Packages.java.nio.charset.Charset.forName('ISO-8859-1');\nfunction FQ_AS2B(x){return new Packages.java.lang.String(String(x)).getBytes(FQ_ACSP);}\nfunction FQ_atone(sv){var v=String(sv.get('fqTone')||'0');var n=parseInt(v,10);return isNaN(n)?0:n;}\nfunction FQ_atoneName(sv){var t=FQ_atone(sv);for(var i=0;i<FQ_TONES.length;i++)if(FQ_TONES[i].i===t)return FQ_TONES[i].n;return t?('音色'+t):'默认(推荐)';}\nfunction FQ_asetTone(sv,v){var n=parseInt(String(v),10);if(isNaN(n))n=0;sv.put('fqTone',String(n));return FQ_atoneName(sv);}\nfunction FQ_atoneNext(sv){var t=FQ_atone(sv);var idx=0;for(var i=0;i<FQ_TONES.length;i++)if(FQ_TONES[i].i===t){idx=i;break;}idx=(idx+1)%FQ_TONES.length;sv.put('fqTone',String(FQ_TONES[idx].i));return FQ_atoneName(sv);}\nfunction FQ_apop(x){var c=0;while(x){c+=x&1;x>>>=1;}return c;}\nfunction FQ_akey(spadeB64){\n  var raw=FQ_b64d2(String(spadeB64).replace(/-/g,'+').replace(/_/g,'/'));\n  var len=raw.length;\n  if(len<3)return '';\n  var v8=len-((raw[0]^raw[1]^raw[2])&255)+47;\n  v8=Math.min(v8,len-1);\n  if(v8<33)return '';\n  var w=[];\n  for(var i=0;i<v8;i++)w.push(raw[1+i]&255);\n  var a=85,b=246;\n  for(var i2=0;i2<v8;i2++){\n    var old=w[i2];\n    var prev=(i2&1)?a:b;\n    if(i2&1)a=old;else b=old;\n    w[i2]=(-21-FQ_apop(i2)+(prev^old))&255;\n  }\n  var s='';\n  for(var i3=1;i3<33;i3++)s+=String.fromCharCode(w[i3]);\n  return s;\n}\nfunction FQ_aboxes(bytes,p,end){\n  var out=[],q=p;\n  while(q+8<=end){\n    var sz=(bytes[q]&255)*16777216+((bytes[q+1]&255)<<16)+((bytes[q+2]&255)<<8)+(bytes[q+3]&255);\n    if(sz<8||q+sz>bytes.length)break;\n    var t='';for(var i=0;i<4;i++)t+=String.fromCharCode(bytes[q+4+i]&255);\n    out.push({t:t,p:q,s:sz});\n    q+=sz;\n  }\n  return out;\n}\nfunction FQ_afind(bytes,typ){\n  var res=[];\n  (function walk(p,end){\n    var bs=FQ_aboxes(bytes,p,end);\n    for(var i=0;i<bs.length;i++){\n      if(bs[i].t===typ)res.push(bs[i]);\n      if('moov,trak,mdia,minf,stbl,dinf'.indexOf(bs[i].t)>=0)walk(bs[i].p+8,bs[i].p+bs[i].s);\n    }\n  })(0,Math.min(bytes.length,400000));\n  return res;\n}\nfunction FQ_au32(bytes,p){return (bytes[p]&255)*16777216+((bytes[p+1]&255)<<16)+((bytes[p+2]&255)<<8)+(bytes[p+3]&255);}\nfunction FQ_aaudio(sv,jv,bookId,itemId){\n  var pool=FQ_ensure(sv,2);\n  if(!pool.length)throw new Error('设备池为空，请重试');\n  var dev=pool[0].d,iid=pool[0].i;\n  var tone=FQ_atone(sv);\n  var qs=FQ_AQUERY+'&iid='+iid+'&device_id='+dev;\n  var body=JSON.stringify({audio_type:0,bgm_used:0,book_id:bookId,device_score:0,item_ids:[itemId],multi_shift:false,source:'default',tone_id:tone,user_select_start_para:0,user_select_start_para_off:0});\n  var ts=FQ_now(),stub=FQ_md5(body);\n  var hd=FQ_sign(qs,stub,ts,dev,iid,3040,Math.floor(Math.random()*2000000000));\n  hd['User-Agent']='com.dragon.read';\n  hd['Content-Type']='application/json; charset=utf-8';\n  var r=FQ_hpost(FQ_AHOST+FQ_APATH+'?'+qs,body,hd);\n  var d=JSON.parse(r.body);\n  var rows=(d.data&&d.data.video_model_datas)||[];\n  if(!rows.length){\n    var m=String(d.message||'');\n    throw new Error(m?('音频接口：'+m):'该章节暂无音频，请换书籍或音色');\n  }\n  var vmRaw=String(rows[0].video_model||'');\n  if(!vmRaw||vmRaw.length<10){\n    throw new Error('该章节暂无朗读音频（本书可能只有文本版）。请换一本书或在发现页找带音频的书');\n  }\n  var mdl;\n  try{mdl=JSON.parse(vmRaw);}catch(e){throw new Error('音频数据解析失败，请重试或换章节');}\n  var vl=(mdl.video_list)||{};\n  var st=vl['0']||vl[Object.keys(vl)[0]];\n  if(!st||!st.main_url)throw new Error('未获取到音频直链');\n  var size=(st.video_meta&&st.video_meta.size)||0;\n  if(size>22000000)throw new Error('音频文件过大('+Math.floor(size/1048576)+'MB)，请换音色或章节');\n  var enc=st.encrypt_info||{};\n  var url=String(st.main_url);\n  var ck='fqA_'+bookId+'_'+itemId+'_'+tone;\n  var cached=String(sv.get(ck)||'');\n  if(cached){\n    try{var tb=jv.readFile(cached);if(tb&&tb.length>100000)return 'file://'+FQ_CACHE+cached;}catch(e){}\n  }\n  var outHex=String(jv.ajax(url+','+JSON.stringify({headers:{},type:'hex'})));\n  if(!outHex||outHex.length<2000)throw new Error('音频下载失败');\n  var bytes=Packages.cn.hutool.core.util.HexUtil.decodeHex(outHex);\n  outHex='';\n  if(bytes.length<1000)throw new Error('音频文件异常');\n  if(enc&&enc.encrypt&&enc.spade_a){\n    var keyHex=FQ_akey(enc.spade_a);\n    if(!keyHex)throw new Error('密钥派生失败');\n    var sk=new Packages.javax.crypto.spec.SecretKeySpec(FQ_AS2B(FQ_unhex(keyHex)),'AES');\n    var C=Packages.javax.crypto.Cipher;\n    var cp=C.getInstance('AES/CTR/NoPadding');\n    var Arr=Packages.java.util.Arrays,Sys=Packages.java.lang.System,Iv=Packages.javax.crypto.spec.IvParameterSpec;\n    var stsz=FQ_afind(bytes,'stsz')[0],stco=FQ_afind(bytes,'stco')[0],stsc=FQ_afind(bytes,'stsc')[0],senc=FQ_afind(bytes,'senc')[0];\n    if(!stsz||!stco||!stsc||!senc)throw new Error('音频结构解析失败');\n    var b1=stsz.p+8,b2=stco.p+8,b3=stsc.p+8,b4=senc.p+8;\n    var cnt=FQ_au32(bytes,b1+8),nch=FQ_au32(bytes,b2+4),nent=FQ_au32(bytes,b3+4);\n    var ent=[];\n    for(var j=0;j<nent;j++)ent.push([FQ_au32(bytes,b3+8+j*12),FQ_au32(bytes,b3+8+j*12+4)]);\n    var idx=0,eI=0;\n    for(var c=0;c<nch&&idx<cnt;c++){\n      var off=FQ_au32(bytes,b2+8+c*4);\n      while(eI+1<nent&&ent[eI+1][0]<=c+1)eI++;\n      var spc=ent[eI][1];\n      for(var k=0;k<spc&&idx<cnt;k++){\n        var sz=FQ_au32(bytes,b1+12+idx*4);\n        if(off+sz>bytes.length){c=nch;break;}\n        var io=b4+8+idx*8;\n        var s16='';\n        for(var i=0;i<8;i++)s16+=String.fromCharCode(bytes[io+i]&255);\n        for(var i=0;i<8;i++)s16+=String.fromCharCode(0);\n        cp.init(C.DECRYPT_MODE,sk,new Iv(FQ_AS2B(s16)));\n        Sys.arraycopy(cp.doFinal(Arr.copyOfRange(bytes,off,off+sz)),0,bytes,off,sz);\n        off+=sz;idx++;\n      }\n    }\n  }\n  var mend=Math.min(bytes.length,400000);\n  for(var q=0;q+4<=mend;q++){\n    var c0=bytes[q]&255,c1=bytes[q+1]&255,c2=bytes[q+2]&255,c3=bytes[q+3]&255;\n    if(c0===0x65&&c1===0x6e&&c2===0x63&&c3===0x61){bytes[q]=0x6d;bytes[q+1]=0x70;bytes[q+2]=0x34;bytes[q+3]=0x61;q+=3;}\n    else if(c0===0x73&&c1===0x69&&c2===0x6e&&c3===0x66){\n      if(q>=4){\n        var ssz=FQ_au32(bytes,q-4);\n        if(ssz>=8&&ssz<50000&&q-4+ssz<=bytes.length){\n          bytes[q]=0x66;bytes[q+1]=0x72;bytes[q+2]=0x65;bytes[q+3]=0x65;\n          for(var j=q+4;j<q-4+ssz;j++)bytes[j]=0;\n          q=q-4+ssz-1;\n        }\n      }\n    }\n  }\n  var hex=String(Packages.cn.hutool.core.util.HexUtil.encodeHexStr(bytes));\n  bytes=null;\n  var DQ=String.fromCharCode(34);\n  var opt='{'+DQ+'type'+DQ+':'+DQ+'m4a'+DQ+'}';\n  var fname='https://x/'+'fa'+tone+'_'+String(itemId).substring(0,18)+'.m4a';\n  var path=String(jv.downloadFile(hex,fname+','+opt));\n  hex='';\n  try{Packages.java.lang.System.gc();}catch(e){}\n  sv.put(ck,path);\n  FQ_atrim(sv,jv,ck);\n  return 'file://'+FQ_CACHE+path;\n}\nfunction FQ_atrim(sv,jv,lastKey){\n  var keys=String(sv.get('fqAKeys')||'').split(',');\n  var nk=[];\n  for(var i=0;i<keys.length;i++)if(keys[i]&&String(sv.get(keys[i])||''))nk.push(keys[i]);\n  if(lastKey&&nk.indexOf(lastKey)<0)nk.push(lastKey);\n  while(nk.length>6){\n    var k=nk.shift();\n    var p=String(sv.get(k)||'');\n    if(p){try{jv.deleteFile(p);}catch(e){}}\n    sv.put(k,'');\n  }\n  sv.put('fqAKeys',nk.join(','));\n}\nfunction FQ_atoneBtn(sv,jv){\n  var n=FQ_atoneNext(sv);\n  jv.toast('已切换音色：'+n);\n  return n;\n}\nfunction FQ_atoneReset(sv,jv){\n  FQ_asetTone(sv,0);\n  jv.toast('音色已重置为默认(推荐)');\n  return 'default';\n}\nfunction FQ_atoneShow(sv,jv){\n  var n=FQ_atoneName(sv);\n  jv.toast('当前音色：'+n+'（ID '+FQ_atone(sv)+'）');\n  return n;\n}\nfunction FQ_abase(dev,iid){\n  return 'ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=72432&version_name=7.2.4.32&device_platform=android&os=android&ssmix=a&device_type=25053RT47C&device_brand=Redmi&language=zh&os_api=36&os_version=16&manifest_version_code=72432&resolution=1280*2620&dpi=520&update_version_code=72432&host_abi=arm64-v8a&dragon_device_type=phone&pv_player=72432&compliance_status=0&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&rom_version=miui_V816_OS3.0.9.0.WOLCNXM&iid='+iid+'&device_id='+dev;\n}\nfunction FQ_abook(sv,jv,bookId){\n  var pool=FQ_ensure(sv,2);\n  if(!pool.length)throw new Error('设备池为空，请重试');\n  var dev=pool[0].d,iid=pool[0].i;\n  var raw=FQ_api(jv,sv,'/reading/bookapi/audio/detail/','version=v3&book_id='+bookId+'&'+FQ_abase(dev,iid));\n  var j=JSON.parse(raw);\n  var bd=(j.data)||{};\n  var out={\n    name:String(bd.book_name||''),\n    author:String(bd.author||''),\n    kind:String(bd.category||''),\n    intro:String(bd.abstract||bd.book_abstract_v2||''),\n    coverUrl:String(bd.thumb_url||bd.expand_thumb_url||''),\n    serial:String(bd.serial_count||''),\n    tones:String(bd.tones||''),\n    tts:String(bd.tts_status||''),\n    dur:String(bd.duration||''),\n    bookId:bookId\n  };\n  return JSON.stringify(out);\n}\nfunction FQ_atoc(sv,jv,bookId){\n  var pool=FQ_ensure(sv,2);\n  if(!pool.length)throw new Error('设备池为空，请重试');\n  var dev=pool[0].d,iid=pool[0].i;\n  var raw=FQ_api(jv,sv,'/reading/bookapi/directory/all_items/v','book_type=0&item_data_list_md5=&catalog_data_md5=&book_id='+bookId+'&book_info_md5=&need_version=true&'+FQ_abase(dev,iid));\n  var d=JSON.parse(raw);\n  var dd=d.data||{};\n  var cats=dd.catalog_data||dd.item_data_list||[];\n  var out=[];\n  for(var i=0;i<cats.length;i++){\n    var c=cats[i];\n    var t=String(c.catalog_title||c.title||('第'+(i+1)+'章'));\n    out.push({name:t,url:'https://fanqienovel.com/page/'+bookId+'#'+String(c.item_id||c.catalog_id)});\n  }\n  return out;\n}\nfunction FQ_alisten(jv,sv,page){\n  var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';\n  var off=((parseInt(page||'1')-1)*16);\n  var raw=FQ_api(jv,sv,'/reading/bookapi/bookmall/tab/v','tab_type=5&offset='+off+'&client_template=0&'+base);\n  var d=JSON.parse(raw);\n  var ti=d.data.tab_item||[];\n  var out=[],seen={};\n  (function walk(n){\n    if(!n||typeof n!=='object')return;\n    if(n.book_data){var a=n.book_data;for(var i=0;i<a.length;i++){var b=a[i]||{};var bid=String(b.book_id||'');if(!bid||seen[bid])continue;seen[bid]=1;\n      out.push({name:String(b.book_name||''),author:String(b.author||''),kind:String(b.category||''),intro:String(b.abstract||''),coverUrl:String(b.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+bid+'#'+bid});}}\n    if(n.cell_data)for(var j=0;j<n.cell_data.length;j++)walk(n.cell_data[j]);\n  })({cell_data:ti});\n  return out;\n}\nfunction FQ_acheck(sv,jv){\n  var pool=FQ_ensure(sv,2);\n  var out={pool:pool.length,tone:FQ_atoneName(sv)};\n  try{\n    var b=FQ_abook(sv,jv,'7672933250976730174');\n    var o=JSON.parse(b);\n    out.name=o.name;out.serial=o.serial;out.tones=o.tones;\n    out.ok=true;\n  }catch(e){out.ok=false;out.err=String(e).substring(0,150);}\n  jv.longToast('设备池：'+out.pool+' 个\\n当前音色：'+out.tone+'\\n测试书籍：'+(out.name||('失败 '+out.err)));\n  return JSON.stringify(out);\n}\nfunction FQ_aclear(sv,jv){\n  var keys=String(sv.get('fqAKeys')||'').split(',');\n  var n=0;\n  for(var i=0;i<keys.length;i++){\n    var k=keys[i];\n    if(!k)continue;\n    var p=String(sv.get(k)||'');\n    if(p){try{jv.deleteFile(p);n++;}catch(e){}}\n    sv.put(k,'');\n  }\n  sv.put('fqAKeys','');\n  jv.toast('已清空音频缓存（'+n+' 个文件）');\n  return n;\n}\nfunction FQ_ahelp(sv,jv){\n  jv.longToast('番茄听书使用说明：\\n\\n1. 本源匿名可用，无需登录\\n2. 音频流为 CENC 加密，首次播放需下载并本地解密（约 15~30 秒）\\n3. 之后同一章节命中缓存，秒播\\n4. 只有提供朗读版的书才有音频，纯文本书会提示无音频\\n5. 可在此界面切换朗读音色\\n6. 缓存仅保留最近 6 个章节');\n  return 'help';\n}\n/* ---- 听书搜索：相关度排序 + 过滤噪声 ---- */\nfunction FQ_asearch2(jv,sv,kw,page){\n  var l=FQ_asrch(jv,kw,page);\n  if(!l.length)return l;\n  var DQ=String.fromCharCode(34);\n  var SQ=String.fromCharCode(39);\n  var STRIP=String.fromCharCode(92,115)+'|'+String.fromCharCode(44,65292,12290,65281,63,65311,65306,65307,59,65307)+'|'+SQ+'|'+DQ+'|'+String.fromCharCode(65288,65289,40,41,123,125,91,93);\n  function strip(s){var x=String(s||'');var re=new RegExp('['+STRIP+']','g');return x.replace(re,'');}\n  var k=strip(kw);\n  var scored=[];\n  for(var i=0;i<l.length;i++){\n    var b=l[i];\n    var nm=String(b.name||'');\n    var clean=strip(nm);\n    var sc=0;\n    if(clean===k)sc=100;                       // 完全相同\n    else if(clean.indexOf(k)>=0)sc=80;         // 名称包含关键词\n    else if(String(b.author||'')===kw)sc=70;   // 作者名精确匹配\n    else if(String(b.author||'').indexOf(k)>=0)sc=60;\n    else if(nm.indexOf(k)>=0)sc=50;\n    else if(String(b.intro||'').indexOf(k)>=0)sc=30;\n    else sc=0;\n    b._sc=sc;\n    scored.push(b);\n  }\n  scored.sort(function(a,b){return b._sc-a._sc;});\n  var out=[];\n  for(var j=0;j<scored.length;j++){\n    if(scored[j]._sc>0)out.push(scored[j]);\n  }\n  return out.length?out:scored;\n}\n\n/* ---- 听书专用搜索：自带完整请求（规避 {{key}} 未编码问题） ---- */\nvar FQ_SSUF='&enterfrom_aid=&enter_from=inner_search&app_name=news_article&version_name=7.0.8&app_version=7.0.8&channel=tt_huawei2019_yz&version_code=708&device_platform=android&parent_enterfrom=novel_list&novel_host=&aid=13&scm_version=1.0.0.4112&device_type=25053RT47C&device_brand=Redmi&language=zh&os_api=35&os_version=15&openudid=0123456789abcdef&update_version_code=70899&plugin=0&tma_jssdk_version=1.10.0.0&rom_version=miui__os2.0.209.0.volcnxm';\nvar FQ_SBASE='https://api.fanqiesdk.com/api/novel/channel/homepage/search/search/v1/';\nfunction FQ_asrch(jv,kw,page){\n  var k=String(kw||'').trim();\n  if(!k)return [];\n  var off=(parseInt(page||'1',10)-1)*10;\n  if(isNaN(off)||off<0)off=0;\n  var url=FQ_SBASE+'?q='+encodeURIComponent(k)+'&offset='+off+FQ_SSUF;\n  var UAK=String.fromCharCode(85,115,101,114,45,65,103,101,110,116);\n  var hd={};hd[UAK]='com.ss.android.article.news/13400';\n  var raw=String(jv.ajax(url+','+JSON.stringify({headers:hd})));\n  var out=[];\n  try{\n    var d=JSON.parse(raw);\n    var rd=(d.data&&d.data.ret_data)||[];\n    for(var i=0;i<rd.length;i++){\n      var it=rd[i]||{};\n      var nm=String(it.title||'').split('<em>').join('').split('</em>').join('');\n      out.push({name:nm,author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+String(it.book_id)+'#'+String(it.book_id),bookId:String(it.book_id)});\n    }\n  }catch(e){}\n  return out;\n}\n\n/* ---- 登录界面：静态生成音色按钮列表（每个音色一个按钮，不访问 source） ---- */\nfunction FQ_atoneRows(){\n  var rows=[];\n  rows.push({name:'📖 使用说明（点击查看）',type:'button',action:'FQ_ahelpSafe(java)'});\n  rows.push({name:'🎵 查看当前音色',type:'button',action:'FQ_toneShowSafe(java)'});\n  for(var i=0;i<FQ_TONES.length;i++){\n    var t=FQ_TONES[i];\n    rows.push({name:'🎙 '+t.n,type:'button',action:'FQ_toneSetSafe(java,'+t.i+')'});\n  }\n  rows.push({name:'↩️ 恢复默认音色',type:'button',action:'FQ_toneResetSafe(java)'});\n  rows.push({name:'🔍 检查连通/设备状态',type:'button',action:'FQ_checkSafe(java)'});\n  rows.push({name:'🗑 清空音频缓存',type:'button',action:'FQ_clearSafe(java)'});\n  return JSON.stringify(rows);\n}\n/* ---- 发现页：音色选择（ExploreKind 版本） ---- */\nfunction FQ_atoneKinds(jv){\n  var rows=[];\n  var cur=0;try{cur=parseInt(String(jv.get('fqTone')||'0'),10)||0;}catch(e){}\n  for(var i=0;i<FQ_TONES.length;i++){\n    var t=FQ_TONES[i];\n    var mark=(t.i===cur)?'✅':'🎙';\n    rows.push({title:mark+' '+t.n,type:'button',action:'FQ_toneSetSv(java,'+t.i+')',style:{layout_flexGrow:1}});\n  }\n  return JSON.stringify(rows);\n}\n/* ---- 发现页：搜索区（text 输入 + 按钮搜索，双通道取词） ---- */\n/* ---- 指定音色（登录界面） ---- */\nfunction FQ_toneSetSafe(jv,id){\n  var nm='音色'+id;\n  try{nm=FQ_toneNameById(id);}catch(e0){}\n  var ok=false;\n  try{jv.put('fqTone',String(id));ok=true;}catch(e1){}\n  // 三重提示：toast / longToast / 按钮名回显\n  try{jv.toast('已切换音色：'+nm);}catch(e2){}\n  try{jv.longToast('🎙 已切换音色：'+nm+'\\n（返回本书后重新进入章节生效）');}catch(e3){}\n  try{jv.put('fqLastMsg','🎙 当前音色：'+nm);}catch(e4){}\n  try{jv.reLoginView(false);}catch(e5){try{jv.reUiView(false);}catch(e6){}}\n  return ok?'ok':'fail';\n}\n/* ---- 指定音色（发现页） ---- */\nfunction FQ_toneSetSv(jv,id){\n  try{\n    jv.put('fqTone',String(id));\n    jv.toast('✅ 已切换音色：'+FQ_toneNameById(id));\n  }catch(e){try{jv.toast('切换失败：'+e);}catch(e2){}}\n  return 'ok';\n}\n/* ---- 搜索词绑定（发现页 text 输入框 600ms 防抖后触发） ---- */\nfunction FQ_toneNameById(id){\n  var s=String(id);\n  for(var i=0;i<FQ_TONES.length;i++)if(String(FQ_TONES[i].i)===s)return FQ_TONES[i].n;\n  return '音色'+s;\n}function FQ_toneShowSafe(jv){\n  var cur='0',name='默认(推荐)';\n  try{cur=String(jv.get('fqTone')||'0');name=FQ_toneNameById(cur);}catch(e){name='读取失败';}\n  try{jv.toast('当前音色：'+name);}catch(e2){}\n  try{jv.longToast('🎵 当前音色：'+name+'（ID '+cur+'）');}catch(e3){}\n  try{jv.put('fqLastMsg','🎵 当前音色：'+name);}catch(e4){}\n  try{jv.reLoginView(false);}catch(e5){try{jv.reUiView(false);}catch(e6){}}\n  return 'ok';\n}\n/* ---- 登录界面 Safe 包装（只用 java 绑定，不依赖 infoMap/source） ---- */\nfunction FQ_ahelpSafe(jv){\n  try{jv.longToast('📻 番茄听书使用说明\\n\\n1. 本源匿名可用，无需登录\\n2. 音频流为 CENC 加密，首次播放需下载并本地解密（约 15~30 秒）\\n3. 之后同一章节命中缓存，秒播\\n4. 只有提供朗读版的书才有音频\\n5. 点下方音色按钮可切换朗读音色\\n6. 缓存仅保留最近 6 个章节');}\n  catch(e){}\n  return 'help';\n}\nfunction FQ_toneResetSafe(jv){\n  try{jv.put('fqTone','0');}catch(e){}\n  try{jv.toast('已恢复默认音色（推荐）');}catch(e2){}\n  try{jv.longToast('↩️ 已恢复默认音色（推荐）\\n（返回本书后重新进入章节生效）');}catch(e3){}\n  try{jv.put('fqLastMsg','🎵 当前音色：默认(推荐)');}catch(e4){}\n  try{jv.reLoginView(false);}catch(e5){try{jv.reUiView(false);}catch(e6){}}\n  return 'ok';\n}\nfunction FQ_checkSafe(jv){\n  try{\n    var pool=[];\n    try{pool=FQ_getPool(jv);}catch(e0){}\n    var tone='默认(推荐)';\n    try{tone=FQ_toneNameById(String(jv.get('fqTone')||'0'));}catch(e1){}\n    jv.longToast('🔍 状态检查\\n\\n设备池：'+pool.length+' 个\\n当前音色：'+tone+'\\n\\n若搜索或播放异常，可先点「清空音频缓存」再重试。');\n  }catch(e){try{jv.toast('检查失败：'+e);}catch(e2){}}\n  return 'ok';\n}\nfunction FQ_clearSafe(jv){\n  var n=0;\n  try{\n    var keys=String(jv.get('fqAKeys')||'').split(',');\n    for(var i=0;i<keys.length;i++){\n      var k=keys[i];\n      if(!k)continue;\n      var p=String(jv.get(k)||'');\n      if(p){try{jv.deleteFile(p);n++;}catch(e){}}\n      try{jv.put(k,'');}catch(e2){}\n    }\n    try{jv.put('fqAKeys','');}catch(e3){}\n  }catch(e4){}\n  try{jv.toast('已清空音频缓存（'+n+' 个文件）');}catch(e5){}\n  try{jv.longToast('🗑 已清空音频缓存\\n\\n删除文件数：'+n);}catch(e6){}\n  return 'ok';\n}\n", "lastUpdateTime": "1791895990544", "loginUi": "<js>FQ_atoneRows()</js>", "loginUrl": "/* 登录界面函数集（非空，保证 SourceLoginDialog 的 JS 环境完整） */\nfunction FQ_ahelpSafe(sv,jv){try{return FQ_ahelp(sv,jv);}catch(e){try{jv.longToast('番茄听书：匿名可用，无需登录。首次播放需等待下载解密约15~30秒。');}catch(e2){}return 'help';}}\nfunction FQ_toneBtnSafe(sv,jv){try{return FQ_atoneBtn(sv,jv);}catch(e){try{jv.toast('音色切换失败：'+e);}catch(e2){}return 'err';}}\nfunction FQ_toneShowSafe(sv,jv){try{return FQ_atoneShow(sv,jv);}catch(e){try{jv.toast('读取音色失败：'+e);}catch(e2){}return 'err';}}\nfunction FQ_toneResetSafe(sv,jv){try{return FQ_atoneReset(sv,jv);}catch(e){try{jv.toast('重置失败：'+e);}catch(e2){}return 'err';}}\nfunction FQ_checkSafe(sv,jv){try{return FQ_acheck(sv,jv);}catch(e){try{jv.longToast('检查失败：'+e);}catch(e2){}return 'err';}}\nfunction FQ_clearSafe(sv,jv){try{return FQ_aclear(sv,jv);}catch(e){try{jv.toast('清空失败：'+e);}catch(e2){}return 'err';}}\nfunction login(){return 'no-login-needed';}\n", "respondTime": 54306, "ruleBookInfo": {"author": "$.author", "coverUrl": "$.coverUrl", "init": "@js:(function(){var m=String(baseUrl).match(/([0-9]{15,})/);var bid=m?m[1]:'';if(!bid)throw new Error('无效书籍ID');var s=JSON.parse(FQ_abook(source,java,bid));s.tocUrl='https://fanqienovel.com/page/'+bid;return JSON.stringify(s);})()", "intro": "$.intro", "kind": "$.kind", "name": "$.name", "tocUrl": "$.tocUrl"}, "ruleContent": {"content": "@js:(function(){var m=String(baseUrl).match(/([0-9]{15,})/);var bid=m?m[1]:'';var m2=String(baseUrl).match(/#([0-9]+)$/);var item=m2?m2[1]:'';if(!bid||!item)throw new Error('参数错误');return FQ_aaudio(source,java,bid,item);})()", "subContent": "@js:(function(){var t=String(source.get('fqTone')||'0');for(var i=0;i<FQ_TONES.length;i++)if(String(FQ_TONES[i].i)===t)return FQ_TONES[i].n;return '默认(推荐)';})()"}, "ruleExplore": {"author": "$.author", "bookList": "@js:(function(){var u=String(baseUrl||'');var pg=1;try{pg=parseInt(FQ_qp(u,'p'),10);if(isNaN(pg)||pg<1)pg=1;}catch(e){}var l=[];if(u.indexOf('t=listen')>=0){l=FQ_alisten(java,source,pg);}else{var kw='';try{if(typeof key!=='undefined'&&key)kw=String(key);}catch(e){}if(!kw){try{kw=decodeURIComponent(FQ_qp(u,'k')||'');}catch(e2){kw=FQ_qp(u,'k');}}l=kw?FQ_asearch2(java,source,kw,pg):[];}var out=[];for(var i=0;i<l.length;i++)out.push(JSON.stringify(l[i]));return out;})()", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "name": "$.name"}, "ruleSearch": {"author": "$.author", "bookList": "@js:(function(){var kw='';try{if(typeof key!=='undefined'&&key)kw=String(key);}catch(e){}if(!kw){try{kw=decodeURIComponent(FQ_qp(String(baseUrl),'q')||'');}catch(e2){kw=FQ_qp(String(baseUrl),'q');}}var pg=1;try{pg=parseInt(FQ_qp(String(baseUrl),'offset'),10);pg=isNaN(pg)?1:(pg/10+1);}catch(e){}var l=FQ_asearch2(java,source,kw,pg);var out=[];for(var i=0;i<l.length;i++){var b=l[i];out.push(JSON.stringify({name:b.name,author:b.author,kind:b.kind,intro:b.intro,coverUrl:b.coverUrl,bookUrl:b.bookUrl}));}return out;})()", "bookUrl": "$.bookUrl", "checkKeyWord": "我靠风水中医术", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "name": "$.name"}, "ruleToc": {"chapterList": "@js:(function(){var m=String(baseUrl).match(/([0-9]{15,})/);var bid=m?m[1]:'';if(!bid)throw new Error('无效书籍ID');var l=FQ_atoc(source,java,bid);if(!l.length)throw new Error('目录获取失败');book.setType(32);var out=[];for(var i=0;i<l.length;i++)out.push(JSON.stringify(l[i]));return out;})()", "chapterName": "$.name", "chapterUrl": "$.url"}, "searchUrl": "https://api.fanqiesdk.com/api/novel/channel/homepage/search/search/v1/?q={{key}}&offset={{(page-1)*10}}&enterfrom_aid=&enter_from=inner_search&app_name=news_article&version_name=7.0.8&app_version=7.0.8&channel=tt_huawei2019_yz&version_code=708&device_platform=android&parent_enterfrom=novel_list&novel_host=&aid=13&scm_version=1.0.0.4112&device_type=25053RT47C&device_brand=Redmi&language=zh&os_api=35&os_version=15&openudid=0123456789abcdef&update_version_code=70899&plugin=0&tma_jssdk_version=1.10.0.0&rom_version=miui__os2.0.209.0.volcnxm", "weight": 0},{"bookSourceComment": "基于 fqapp 开源项目逆向的番茄官方 App 接口（x-argus/x-ladon 纯 JS 签名）\n【发现】漫剧/短剧/动漫 三频道（tab_type=32/8/24，两段式视频流）\n【搜索】suggest 通道（含视频结果，固定10条）\n【播放】shortplay 通道（aid=1967）+ CENC-AES-CTR 解密 + 本地文件播放\n【画质】书源菜单→登录 可切换 360/480/540/720P（默认360P）\n【E版兼容】零第三方依赖：hex 用 BigInteger（4MB 330ms）、SM3 纯JS、Base64 三级降级\n【参考】github.com/ch6vip/fqapp", "bookSourceGroup": "视频,番茄,AI", "bookSourceName": "🍅番茄短剧·漫剧(APP)", "bookSourceType": 4, "bookSourceUrl": "https://api5-normal-sinfonlineb.fqnovel.com##短剧版", "bookUrlPattern": "https?://api5-normal-sinfonlineb[.]fqnovel[.]com/detail[?]series_id=[0-9]+", "concurrentRate": "1/1200", "customButton": false, "customOrder": 6, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\": \"🎬 漫剧热播\", \"url\": \"https://api5-normal-sinfonlineb.fqnovel.com/explore?kind=manju&page={{page}}\"}, {\"title\": \"🎭 短剧精选\", \"url\": \"https://api5-normal-sinfonlineb.fqnovel.com/explore?kind=zhaoju&page={{page}}\"}, {\"title\": \"✨ 动漫剧场\", \"url\": \"https://api5-normal-sinfonlineb.fqnovel.com/explore?kind=dongman&page={{page}}\"}]", "header": "{\"User-Agent\": \"com.phoenix.read/72932 (Linux; U; Android 12; zh_CN; V2284A; Build/V417IR;tt-ok/3.12.13.20)\"}", "jsLib": "function HG_b64JS(u8){\nvar CH='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nvar out='';var i=0,n=u8.length;\nwhile(i<n){\nvar c1=u8[i++]&255;\nvar c2=(i<n)?(u8[i++]&255):NaN;\nvar c3=(i<n)?(u8[i++]&255):NaN;\nvar e1=c1>>2;\nvar e2=((c1&3)<<4)|(isNaN(c2)?0:(c2>>4));\nvar e3=isNaN(c2)?64:(((c2&15)<<2)|(isNaN(c3)?0:(c3>>6)));\nvar e4=isNaN(c3)?64:(c3&63);\nout+=CH.charAt(e1)+CH.charAt(e2)+(e3===64?'=':CH.charAt(e3))+(e4===64?'=':CH.charAt(e4));\n}\nreturn out;\n}\nvar HG_CS=Packages.java.nio.charset.Charset.forName('ISO-8859-1');\nfunction HG_jb(u8){var s='';for(var i=0;i<u8.length;i++)s+=String.fromCharCode(u8[i]&0xff);return new Packages.java.lang.String(s).getBytes(HG_CS);}\nfunction HG_j2u(a){var o=new Uint8Array(a.length);for(var i=0;i<a.length;i++)o[i]=a[i]&0xff;return o;}\nfunction HG_hx(u8){var s='';for(var i=0;i<u8.length;i++){var b=u8[i]&0xff;s+=(b<16?'0':'')+b.toString(16);}return s;}\nfunction HG_h2b(h){var b=new Uint8Array(h.length/2);for(var i=0;i<b.length;i++)b[i]=parseInt(h.substr(i*2,2),16);return b;}\nfunction HG_u8(s){var r=[];for(var i=0;i<s.length;i++){var c=s.charCodeAt(i);if(c<0x80)r.push(c);else if(c<0x800){r.push(0xc0|(c>>6),0x80|(c&0x3f));}else{r.push(0xe0|(c>>12),0x80|((c>>6)&0x3f),0x80|(c&0x3f));}}return new Uint8Array(r);}\nfunction HG_cat(){var ps=[].slice.call(arguments),n=0,i;for(i=0;i<ps.length;i++){var p=(ps[i] instanceof Uint8Array)?ps[i]:new Uint8Array(ps[i]||[]);n+=p.length;}\nvar o=new Uint8Array(n),o2=0;for(i=0;i<ps.length;i++){var p2=(ps[i] instanceof Uint8Array)?ps[i]:new Uint8Array(ps[i]||[]);o.set(p2,o2);o2+=p2.length;}return o;}\nfunction HG_rnd(l){var o=new Uint8Array(l);for(var i=0;i<l;i++)o[i]=Math.floor(Math.random()*256);return o;}\nfunction HG_rev(b){var o=new Uint8Array(b.length);for(var i=0;i<b.length;i++)o[i]=b[b.length-i-1];return o;}\nfunction HG_ev(v){var o=[],r=v;while(r>=0x80){o.push((r%0x80)|0x80);r=Math.floor(r/0x80);}o.push(r);return new Uint8Array(o);}\nfunction HG_pbv(f,v){return HG_cat(HG_ev(f*8),HG_ev(v));}\nfunction HG_pbb(f,v){var e=(v instanceof Uint8Array)?v:HG_u8(String(v));return HG_cat(HG_ev(f*8+2),HG_ev(e.length),e);}\nfunction HG_w64(lo,hi){return {lo:lo>>>0,hi:hi>>>0};}\nfunction HG_xor(){var lo=0,hi=0;for(var i=0;i<arguments.length;i++){lo^=arguments[i].lo;hi^=arguments[i].hi;}return HG_w64(lo,hi);}\nfunction HG_a64(a,b){return HG_w64(a.lo&b.lo,a.hi&b.hi);}\nfunction HG_n64(v){return HG_w64(~v.lo,~v.hi);}\nfunction HG_add64(a,b){var lo=(a.lo+b.lo)>>>0;return HG_w64(lo,(a.hi+b.hi+(lo<a.lo?1:0))>>>0);}\nfunction HG_rol(v,c){var s=((c%64)+64)%64;if(s===0)return HG_w64(v.lo,v.hi);\nif(s<32)return HG_w64((v.lo<<s)|(v.hi>>>(32-s)),(v.hi<<s)|(v.lo>>>(32-s)));\nif(s===32)return HG_w64(v.hi,v.lo);var r=s-32;return HG_w64((v.hi<<r)|(v.lo>>>(32-r)),(v.lo<<r)|(v.hi>>>(32-r)));}\nfunction HG_ror(v,c){return HG_rol(v,64-(c%64));}\nfunction HG_r64(b,o){o=o||0;return HG_w64((b[o]|(b[o+1]<<8)|(b[o+2]<<16)|(b[o+3]<<24))>>>0,(b[o+4]|(b[o+5]<<8)|(b[o+6]<<16)|(b[o+7]<<24))>>>0);}\nfunction HG_w64le(o,off,v){for(var i=0;i<4;i++){o[off+i]=(v.lo>>>(i*8))&0xff;o[off+4+i]=(v.hi>>>(i*8))&0xff;}}\nfunction HG_r32(b){return (b[0]|(b[1]<<8)|(b[2]<<16)|(b[3]<<24))>>>0;}\nfunction HG_md5(u8){var d=Packages.java.security.MessageDigest.getInstance('MD5');d.update(HG_jb(u8));return HG_j2u(d.digest());}\nfunction HG_sm3(u8){\nvar rotl=function(x,n){n=n&31;return ((x<<n)|(x>>>(32-n)))>>>0;};\nvar s='';for(var q=0;q<u8.length;q++)s+=String.fromCharCode(u8[q]&255);\nvar len=s.length,bitLen=len*8,arr=[];\nfor(var i=0;i<len;i++)arr.push(s.charCodeAt(i)&255);\narr.push(0x80);\nwhile(arr.length%64!==56)arr.push(0);\nvar hi=Math.floor(bitLen/4294967296),lo=bitLen>>>0;\narr.push((hi>>>24)&255,(hi>>>16)&255,(hi>>>8)&255,hi&255);\narr.push((lo>>>24)&255,(lo>>>16)&255,(lo>>>8)&255,lo&255);\nvar V=[0x7380166f,0x4914b2b9,0x172442d7,0xda8a0600,0xa96f30bc,0x163138aa,0xe38dee4d,0xb0fb0e4e];\nfor(var b=0;b<arr.length;b+=64){\nvar W=[];\nfor(var i=0;i<16;i++)W.push(((arr[b+i*4]<<24)|(arr[b+i*4+1]<<16)|(arr[b+i*4+2]<<8)|arr[b+i*4+3])>>>0);\nfor(var j=16;j<68;j++){var x=(W[j-16]^W[j-9]^rotl(W[j-3],15))>>>0;x=(x^rotl(x,15)^rotl(x,23))>>>0;W.push((x^rotl(W[j-13],7)^W[j-6])>>>0);}\nvar W1=[];for(var j=0;j<64;j++)W1.push((W[j]^W[j+4])>>>0);\nvar A=V[0],B=V[1],C=V[2],D=V[3],E=V[4],F=V[5],G=V[6],H=V[7];\nfor(var j=0;j<64;j++){\nvar Tj=(j<16)?0x79cc4519:0x7a879d8a;\nvar SS1=rotl((rotl(A,12)+E+rotl(Tj,j&31))>>>0,7);\nvar SS2=(SS1^rotl(A,12))>>>0;\nvar FFj=(j<16)?((A^B^C)>>>0):(((A&B)|(A&C)|(B&C))>>>0);\nvar GGj=(j<16)?((E^F^G)>>>0):(((E&F)|((~E)&G))>>>0);\nvar TT1=(FFj+D+SS2+W1[j])>>>0;\nvar TT2=(GGj+H+SS1+W[j])>>>0;\nD=C;C=rotl(B,9);B=A;A=TT1;H=G;G=rotl(F,19);F=E;E=(TT2^rotl(TT2,9)^rotl(TT2,17))>>>0;\n}\nV[0]=(V[0]^A)>>>0;V[1]=(V[1]^B)>>>0;V[2]=(V[2]^C)>>>0;V[3]=(V[3]^D)>>>0;\nV[4]=(V[4]^E)>>>0;V[5]=(V[5]^F)>>>0;V[6]=(V[6]^G)>>>0;V[7]=(V[7]^H)>>>0;\n}\nvar out=new Uint8Array(32);\nfor(var i=0;i<8;i++){\nvar v=V[i];\nout[i*4]=(v>>>24)&255;out[i*4+1]=(v>>>16)&255;out[i*4+2]=(v>>>8)&255;out[i*4+3]=v&255;\n}\nreturn out;\n}\nvar HG_SK=HG_h2b('ac1adaae95a7af94a5114ab3b3a97dd80050aa0a39314c40528caec95256c28c');\nvar HG_AH=HG_h2b('3ccc'),HG_AP=HG_h2b('a6e783ee7001100918'),HG_AS=HG_h2b('567b'),HG_AX=HG_h2b('d04ffdff');\nvar HG_LID=1611921764,HG_MAID=3019,HG_SVS=135135744,HG_CV=1388734;\nvar HG_SZ=HG_w64(0x046d678b,0x3dc94c3a);\nfunction HG_zbit(i){return HG_w64(i<32?((HG_SZ.lo>>>i)&1):((HG_SZ.hi>>>(i-32))&1),0);}\nfunction HG_srk(key){var w=[];for(var i=0;i<4;i++)w.push(HG_r64(key,i*8));\nfor(var x=4;x<72;x++){var m=HG_xor(HG_ror(w[x-1],3),w[x-3]);m=HG_xor(m,HG_ror(m,1));\nw.push(HG_xor(HG_n64(w[x-4]),m,HG_zbit((x-4)%62),HG_w64(3,0)));}return w;}\nfunction HG_sEnc(b,keys){var l=HG_r64(b,0),r=HG_r64(b,8);\nfor(var i=0;i<keys.length;i++){var o2=r;var nl=HG_a64(HG_rol(r,1),HG_rol(r,8));r=HG_xor(l,nl,HG_rol(r,2),keys[i]);l=o2;}\nvar o=new Uint8Array(16);HG_w64le(o,0,l);HG_w64le(o,8,r);return o;}\nfunction HG_pad(d){var p=16-(d.length%16);if(p===0)p=16;var o=new Uint8Array(d.length+p);o.set(d,0);for(var i=d.length;i<o.length;i++)o[i]=p;return o;}\nfunction HG_aProto(q,stub,ts,op){op=op||{};\nvar bi=(/^[0-9a-f]{32}$/i.test(stub))?HG_h2b(stub):new Uint8Array(16);\nvar rv=(op.argusRandom==null)?HG_r32(HG_rnd(4)):(op.argusRandom>>>0);\nvar sc=(op.argusSignCount==null)?2+(HG_rnd(1)[0]%49)*2:op.argusSignCount;\nvar nest=HG_cat(HG_pbv(1,sc),HG_pbv(2,HG_CV),HG_pbv(3,HG_CV),HG_pbv(4,HG_CV));\nreturn HG_cat(HG_pbv(1,0x20200929*2),HG_pbv(2,2),HG_pbv(3,rv),HG_pbb(4,HG_MAID),HG_pbb(6,HG_LID),\nHG_pbb(7,'6.8.1.32'),HG_pbb(8,'v04.07.01-ml-android'),HG_pbv(9,HG_SVS),HG_pbb(10,new Uint8Array(8)),\nHG_pbv(12,ts*2),HG_pbb(13,HG_sm3(bi).slice(0,6)),HG_pbb(14,HG_sm3(HG_u8(q)).slice(0,6)),\nHG_pbb(15,nest),HG_pbb(20,'none'),HG_pbv(21,738));}\nfunction HG_b64(u8){\n  try{\n    var B=Packages.android.util.Base64;\n    if(B && typeof B.encodeToString==='function'){\n      var r=String(B.encodeToString(HG_jb(u8),2));\n      if(r && r.length>0) return r;\n    }\n  }catch(e){}\n  try{\n    var E=Packages.java.util.Base64.getEncoder();\n    var r2=String(E.encodeToString(HG_jb(u8)));\n    if(r2 && r2.length>0) return r2;\n  }catch(e2){}\n  return HG_b64JS(u8);\n}\nfunction HG_aesE(data,key,iv){var C=Packages.javax.crypto.Cipher;var c=C.getInstance('AES/CBC/PKCS5Padding');\nc.init(C.ENCRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(HG_jb(key),'AES'),new Packages.javax.crypto.spec.IvParameterSpec(HG_jb(iv)));\nreturn HG_j2u(c.doFinal(HG_jb(data)));}\nfunction HG_argus(q,stub,ts,op){op=op||{};\nvar pb=HG_pad(HG_aProto(q,stub,ts,op));\nvar sk=HG_sm3(HG_cat(HG_SK,HG_AH,HG_AS,HG_SK));var keys=HG_srk(sk);var enc=[];\nfor(var o1=0;o1<pb.length;o1+=16)enc.push(HG_sEnc(pb.slice(o1,o1+16),keys));\nvar encAll=HG_cat.apply(null,enc);var encoded=HG_cat(HG_AX,HG_AX,encAll);\nfor(var i=8;i<encoded.length;i++)encoded[i]^=encoded[i%8];\nvar cont=HG_cat(HG_AP,HG_rev(encoded),HG_AS);\nvar key=HG_h2b(HG_hx(HG_md5(HG_SK.slice(0,16))));var iv=HG_h2b(HG_hx(HG_md5(HG_SK.slice(16))));\nreturn HG_b64(HG_cat(HG_AH,HG_aesE(cont,key,iv)));}\nfunction HG_lrk(rp,aid){var dg=HG_u8(HG_hx(HG_md5(HG_cat(rp,HG_u8(String(aid))))));\nvar t=new Uint8Array(288);t.set(dg);var q=[];for(var i=0;i<4;i++)q.push(HG_r64(t,i*8));\nvar l=q.shift(),r=q.shift();\nfor(var x=0;x<0x22;x++){var m=HG_xor(HG_add64(HG_ror(r,8),l),HG_w64(x,0));q.push(m);\nl=HG_xor(m,HG_ror(l,61));HG_w64le(t,(x+1)*8,l);r=q.shift();}\nvar ks=[];for(var y=0;y<0x22;y++)ks.push(HG_r64(t,y*8));return ks;}\nfunction HG_lEnc(b,keys){var l=HG_r64(b,0),r=HG_r64(b,8);\nfor(var i=0;i<keys.length;i++){r=HG_xor(keys[i],HG_add64(l,HG_ror(r,8)));l=HG_xor(r,HG_ror(l,61));}\nvar o=new Uint8Array(16);HG_w64le(o,0,l);HG_w64le(o,8,r);return o;}\nfunction HG_ladon(ts,aid,op){op=op||{};\nvar rp=(op.ladonRandom==null)?HG_rnd(4):new Uint8Array(op.ladonRandom);\nvar data=HG_u8(ts+'-'+HG_LID+'-'+HG_MAID);\nvar ps=Math.ceil(data.length/16)*16;var pd=new Uint8Array(ps);pd.set(data);\nvar pad2=16-(data.length%16);if(data.length+pad2<=ps)pd.fill(pad2,data.length);\nvar ks=HG_lrk(rp,aid);var ct=[];\nfor(var o1=0;o1<pd.length;o1+=16)ct.push(HG_lEnc(pd.slice(o1,o1+16),ks));\nreturn HG_b64(HG_cat(rp,HG_cat.apply(null,ct)));}\nfunction HG_md5p(v){var b=(v instanceof Uint8Array)?v:HG_u8(String(v));return HG_md5(b).slice(0,4);}\nfunction HG_qs(url){var t=String(url||'');var q=t.indexOf('?');if(q<0)return '';\nvar h=t.indexOf('#',q);return t.slice(q+1,h<0?undefined:h);}\nfunction HG_hdr(h,n){var e=String(n).toLowerCase();for(var k in (h||{})){if(k.toLowerCase()===e&&h[k]!=null)return String(h[k]);}return '';}\nfunction HG_gSeed(url,o){o=o||{};var kh=o.khronos;\nvar stub=String(HG_hdr(o.headers,'x-ss-stub')||'').trim();\nvar bp=new Uint8Array(4);\nif(/^[0-9a-f]{32}$/i.test(stub))bp=HG_h2b(stub.slice(0,8));\nelse if(o.body!=null){var bb=(o.body instanceof Uint8Array)?o.body:HG_u8(String(o.body));if(bb.length>0)bp=HG_md5p(bb);}\nvar ck=HG_hdr(o.headers,'cookie');\nvar ts=new Uint8Array([(kh>>>24)&0xff,(kh>>>16)&0xff,(kh>>>8)&0xff,kh&0xff]);\nreturn HG_cat(HG_md5p(HG_qs(url)),bp,ck?HG_md5p(ck):new Uint8Array(4),new Uint8Array([0,1,7,4]),ts);}\nfunction HG_rbits(v){var r=((v<<1)&0xaa)|((v>>>1)&0x55);r=((r<<2)&0xcc)|((r>>>2)&0x33);return ((r<<4)|(r>>>4))&0xff;}\nfunction HG_tSeed(seed,o){o=o||{};var inp=(seed instanceof Uint8Array)?seed:new Uint8Array(seed||[]);\nif(inp.length!==20)return new Uint8Array(0);\nvar key=new Uint8Array([0x4a,(o.parameter||0)&0xff,0x16,o.headerByte3,0x47,0x6c,((o.parameter||0)>>>8)&0xff,o.headerByte2]);\nvar sb=new Uint8Array(256);for(var i=0;i<256;i++)sb[i]=i;var j=0;\nfor(var i2=0;i2<256;i2++){j=(j+sb[i2]+key[i2&7])&0xff;sb[i2]=sb[j];}\nvar pl=new Uint8Array(inp);var i3=0;j=0;\nfor(var of2=0;of2<pl.length;of2++){i3=(i3+1)&0xff;j=(j+sb[i3])&0xff;sb[i3]=sb[j];pl[of2]^=sb[(sb[i3]+sb[j])&0xff];}\nvar lm=(~pl.length)&0xff;\nfor(var of3=0;of3<pl.length;of3++){var sn=((pl[of3]<<4)|(pl[of3]>>>4))&0xff;\npl[of3]=HG_rbits(sn^pl[(of3+1)%pl.length])^lm;}\nreturn HG_cat(new Uint8Array([0x84,0x04,o.headerByte2,o.headerByte3,(o.parameter||0)&0xff,((o.parameter||0)>>>8)&0xff]),pl);}\nfunction HG_qp(url,n){var e=String(n);var ps=HG_qs(url).split('&');\nfor(var i=0;i<ps.length;i++){if(!ps[i])continue;var s=ps[i].indexOf('=');\nvar k=s<0?ps[i]:ps[i].slice(0,s);if(decodeURIComponent(k)===e)return decodeURIComponent(s<0?'':ps[i].slice(s+1));}\nreturn null;}\nfunction HG_sign(url,op){op=op||{};\nvar ts=(op.timestamp==null)?Math.floor(new Date().getTime()/1000):op.timestamp;\nvar aid=parseInt(HG_qp(url,'aid'),10);\nvar rb=HG_rnd(2);\nvar hb2=(op.headerByte2==null)?((rb[0]%7)+1)<<5:op.headerByte2;\nvar hb3=(op.headerByte3==null)?(0xe0|(rb[1]&0x0f)):op.headerByte3;\nvar hdrs=op.headers||{};\nvar sd=HG_gSeed(url,{headers:hdrs,body:op.body,khronos:ts});\nvar res={};\nres['X-Argus']=HG_argus(HG_qs(url),String(HG_hdr(hdrs,'x-ss-stub')||'').trim(),ts,op);\nres['X-Gorgon']=HG_hx(HG_tSeed(sd,{headerByte2:hb2,headerByte3:hb3,parameter:op.parameter||0}));\nres['X-Khronos']=String(ts);\nres['X-Ladon']=HG_ladon(ts,aid,op);\nreturn res;}\nfunction HG_SID(u){var s=String(u||'');var m=s.match(/[?&]series_id=([0-9]+)/);if(m)return m[1];\nvar m2=s.match(/series_id=([0-9]+)/);if(m2)return m2[1];\nvar m3=s.match(/([0-9]{15,})/);return m3?m3[1]:'';}\nfunction HG_VID(u){var s=String(u||'');var m=s.match(/[?&]vid=([0-9]+)/);if(m)return m[1];\nvar m2=s.match(/vid=([0-9]+)/);if(m2)return m2[1];return '';}\nfunction HG_BID(u){var s=String(u||'');var m=s.match(/[?&]book_id=([0-9]+)/);if(m)return m[1];\nvar m2=s.match(/book_id=([0-9]+)/);if(m2)return m2[1];return '';}\nfunction HG_API(JV, path, bodyObj, extra){\nvar java=JV;\nvar base='https://api5-normal-sinfonlineb.fqnovel.com';\nvar q={aid:'8662',app_name:'novelread',version_code:'72932',version_name:'7.2.9.32',\ndevice_platform:'android',os:'android',ssmix:'a',device_type:'V2284A',device_brand:'vivo',\nlanguage:'zh',os_api:'32',os_version:'12',manifest_version_code:'72932',\nresolution:'1080*1920',dpi:'280',update_version_code:'72932',host_abi:'arm64-v8a',\niid:'4439167111854618',device_id:'4439167111850522',channel:'huawei_8662_64',\nac:'wifi',dragon_device_type:'phone',pv_player:'72932',compliance_status:'0',\nneed_personal_recommend:'1',player_so_load:'1',is_android_pad_screen:'1',\nrom_version:'V417IR+release-keys',cdid:'6100e9f9-a1a0-4f65-ab47-94f5b41b8efb'};\nfor(var k in (extra||{})) q[k]=extra[k];\nvar arr=[]; for(var k2 in q) arr.push(k2+'='+encodeURIComponent(String(q[k2])));\narr.push('_rticket='+String(new Date().getTime()));\nvar url=base+path+'?'+arr.join('&');\nvar bs=bodyObj?JSON.stringify(bodyObj):null;\nvar h={'user-agent':'com.phoenix.read/72932 (Linux; U; Android 12; zh_CN; V2284A; Build/V417IR;tt-ok/3.12.13.20)',\n'Accept':'application/json; charset=utf-8,application/x-protobuf',\n'content-type':'application/json; charset=utf-8','cookie':'',\n'x-tt-token':'','x-tt-store-region':'cn-zj','x-tt-store-region-src':'did',\n'passport-sdk-version':'5051452','sdk-version':'2'};\nif(bs) h['x-ss-stub']=HG_hx(HG_md5(HG_u8(bs))).toUpperCase();\nvar sg=HG_sign(url,{headers:h,body:bs});\nfor(var k3 in sg) h[k3]=sg[k3];\ntry{\nvar Q=String.fromCharCode(34);\nvar opt={method:'POST',body:bs||'',headers:h};\nif(!bs) delete opt.body;\nvar jo=JSON.stringify(opt);\nvar r=java.ajax(url+','+jo);\nreturn String(r);\n}catch(e){ return 'ERR:'+String(e); }\n}\n\n// ================= CENC 解密核心（v5 新增）=================\n\n// ============ E 版兼容：hex 编解码（零第三方依赖）============\n// ① hex → bytes（零第三方依赖：Java 标准库 BigInteger）\nfunction RG_decodeHex(hex){\n  var s=String(hex||'');\n  if(s.length===0) return new Uint8Array(0);\n  if(s.length%2===1) s='0'+s;   // 奇数长度补前导零\n  var bi=new Packages.java.math.BigInteger(s,16);\n  var arr=bi.toByteArray();\n  var n=s.length>>1;\n  if(arr.length===n) return arr;\n  if(arr.length===n+1) return Packages.java.util.Arrays.copyOfRange(arr,1,arr.length);\n  if(arr.length<n){\n    // 补前导零\n    var bos=new Packages.java.io.ByteArrayOutputStream();\n    for(var i=0;i<n-arr.length;i++) bos.write(0);\n    bos.write(arr,0,arr.length);\n    return bos.toByteArray();\n  }\n  return Packages.java.util.Arrays.copyOfRange(arr,arr.length-n,arr.length);\n}\n// ② bytes → hex（零第三方依赖：Java 标准库 BigInteger）\nfunction RG_encodeHex(b){\n  if(!b || b.length===0) return '';\n  var bi=new Packages.java.math.BigInteger(1,b);\n  var h=String(bi.toString(16));\n  var want=b.length*2;\n  while(h.length<want) h='0'+h;\n  return h;\n}\n// 纯 JS 兜底实现（慢，仅保底）\nfunction RG_hexToBytesJS(hex){\n  var s=String(hex||'');\n  var n=s.length>>1;\n  var out=new Uint8Array(n);\n  for(var i=0;i<n;i++){\n    var hi=s.charCodeAt(i*2), lo=s.charCodeAt(i*2+1);\n    var vh=(hi>=48&&hi<=57)?(hi-48):((hi>=97&&hi<=102)?(hi-87):((hi>=65&&hi<=70)?(hi-55):0));\n    var vl=(lo>=48&&lo<=57)?(lo-48):((lo>=97&&lo<=102)?(lo-87):((lo>=65&&lo<=70)?(lo-55):0));\n    out[i]=((vh<<4)|vl)&255;\n  }\n  return out;\n}\nfunction RG_bytesToHexJS(b){\n  var CH='0123456789abcdef';\n  var out='';\n  for(var i=0;i<b.length;i++){var v=b[i]&255;out+=CH.charAt(v>>4)+CH.charAt(v&15);}\n  return out;\n}\n\nvar RG_CS = Packages.java.nio.charset.Charset.forName('ISO-8859-1');\n// RG_HEX 已移除（E版兼容）\nvar RG_MD = Packages.java.security.MessageDigest;\nvar RG_ARR = Packages.java.util.Arrays;\nvar RG_SYS = Packages.java.lang.System;\nvar RG_CIPHER = Packages.javax.crypto.Cipher;\nvar RG_SK = Packages.javax.crypto.spec.SecretKeySpec;\nvar RG_IVP = Packages.javax.crypto.spec.IvParameterSpec;\nfunction RG_U8(b,p){ return b[p]&255; }\nfunction RG_U32(b,p){ return (b[p]&255)*16777216 + ((b[p+1]&255)<<16) + ((b[p+2]&255)<<8) + (b[p+3]&255); }\nfunction RG_STR(b,p,n){ var s=''; for(var i=0;i<n;i++) s+=String.fromCharCode(b[p+i]&255); return s; }\nfunction RG_S2B(s){ return new Packages.java.lang.String(String(s)).getBytes(RG_CS); }\nfunction RG_H2B(h){ var s=''; for(var i=0;i<h.length;i+=2) s+=String.fromCharCode(parseInt(h.substr(i,2),16)); return RG_S2B(s); }\nvar RG_CONST = '4dd4c2e6b83162090e52b3c7a6733ba41cb2462b829ab58a196b39db57177524f49baf7f08e8d68d26a72e37c1a95a2f1f05a51892aef2949732b62a38aadd58';\n// RG_B64 已移除（E版兼容）\nfunction RG_b64d(s){\n  var str=String(s||'').replace(/-/g,'+').replace(/_/g,'/');\n  // ① android.util.Base64（LT版）\n  try{\n    var B=Packages.android.util.Base64;\n    if(B && typeof B.decode==='function'){\n      var r=B.decode(str,0);\n      if(r && r.length>0) return r;\n    }\n  }catch(e){}\n  // ② java.util.Base64（E版）\n  try{\n    var D=Packages.java.util.Base64.getDecoder();\n    var r2=D.decode(str);\n    if(r2 && r2.length>0) return r2;\n  }catch(e2){}\n  // ③ 纯 JS 兜底\n  return RG_b64dJS(str);\n}\nfunction RG_b64dJS(str){\n  var CH='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n  var out='';var buf=0,bits=0;\n  var s=String(str);\n  for(var i=0;i<s.length;i++){\n    var c=s.charAt(i);\n    if(c==='=')break;\n    var v=CH.indexOf(c);\n    if(v<0)continue;\n    buf=(buf<<6)|v;bits+=6;\n    if(bits>=8){bits-=8;out+=String.fromCharCode((buf>>bits)&255);}\n  }\n  var n=out.length;var arr=new Uint8Array(n);\n  for(var k=0;k<n;k++)arr[k]=out.charCodeAt(k)&255;\n  return arr;\n}\nfunction RG_spadeUrl(JV, b64, seedB64){\n  var seedB = RG_b64d(seedB64);\n  var raw = RG_b64d(b64);\n  if (raw.length < 5) throw new Error('spade密文过短');\n  if (RG_U8(raw,0)!==0xa8 || RG_U8(raw,2)!==0x01 || RG_U8(raw,3)!==0x00) throw new Error('spade头异常');\n  var clen = Math.floor((raw.length-4)/16)*16;\n  if (!clen) throw new Error('spade无完整块');\n  var md1 = RG_MD.getInstance('SHA-512'); md1.update(seedB); var h1 = md1.digest();\n  var md2 = RG_MD.getInstance('SHA-512'); md2.update(h1); md2.update(RG_H2B(RG_CONST)); var h2 = md2.digest();\n  var keyB = RG_ARR.copyOfRange(h2,0,16), ivB = RG_ARR.copyOfRange(h2,16,32);\n  var ctB = RG_ARR.copyOfRange(raw,4,4+clen);\n  var c = RG_CIPHER.getInstance('AES/CBC/NoPadding');\n  c.init(RG_CIPHER.DECRYPT_MODE, new RG_SK(keyB,'AES'), new RG_IVP(ivB));\n  var pt = c.doFinal(ctB);\n  var plen = pt.length;\n  if (plen) { var pad = pt[plen-1]&255; if (pad>=1 && pad<=16 && pad<=plen) plen-=pad; }\n  while (plen && (pt[plen-1]&255)===0) plen--;\n  var s=''; for (var i=0;i<plen;i++) s+=String.fromCharCode(pt[i]&255);\n  return s;\n}\nfunction RG_cencKey(JV, spadeB64){\n  var raw = RG_b64d(String(spadeB64).replace(/-/g,'+').replace(/_/g,'/'));\n  var len = raw.length;\n  if (len < 3) throw new Error('spade_a过短');\n  var v8 = len - (RG_U8(raw,0)^RG_U8(raw,1)^RG_U8(raw,2)) + 47;\n  v8 = Math.min(v8, len-1);\n  if (v8 < 33) throw new Error('spade_a长度无效');\n  var work = [];\n  for (var i=0;i<v8;i++) work.push(RG_U8(raw,1+i));\n  var a=85,b=246;\n  for (var i2=0;i2<v8;i2++){\n    var old=work[i2], prev=(i2&1)?a:b;\n    if (i2&1) a=old; else b=old;\n    var pop=0,x=i2; while(x){pop+=x&1;x>>=1;}\n    work[i2]=(-21-pop+(prev^old))&255;\n  }\n  var hs=''; for (var i3=1;i3<33;i3++) hs+=String.fromCharCode(work[i3]);\n  return hs;\n}\nfunction RG_boxes(b,start,end){\n  var o=[],p=start;\n  while(p+8<=end){\n    var sz=RG_U32(b,p), t=RG_STR(b,p+4,4), hdr=8;\n    if(sz===1){ sz=RG_U32(b,p+8)*4294967296+RG_U32(b,p+12); hdr=16; }\n    if(sz<hdr) break;\n    o.push({t:t,p:p,s:sz,hdr:hdr}); p+=sz;\n  }\n  return o;\n}\nfunction RG_find(b,start,end,typ,acc){\n  acc=acc||[];\n  var bx=RG_boxes(b,start,end);\n  for(var i=0;i<bx.length;i++){\n    var x=bx[i];\n    if(x.t===typ) acc.push(x);\n    if('moov,trak,mdia,minf,stbl,dinf,edts,udta,stsd'.indexOf(x.t)>=0){\n      RG_find(b,x.p+x.hdr,Math.min(x.p+x.s,b.length),typ,acc);\n    }\n  }\n  return acc;\n}\nfunction RG_decrypt(bytes,keyHex){\n  var BL = bytes.length;\n  var sk = new RG_SK(RG_H2B(keyHex),'AES');\n  var moovEnd = BL;\n  var top = RG_boxes(bytes,0,Math.min(BL,4096));\n  for (var i=0;i<top.length;i++){ if(top[i].t==='moov'){ moovEnd=top[i].p+top[i].s; break; } }\n  var stsdL = RG_find(bytes,28,moovEnd,'stsd');\n  // ★检测 ByteDance 私有编码：检查 stsd 里的 entry fourcc（bv2C = 私有格式，Android 解码器不支持）\n  var hasBv2C = false;\n  for (var si2 = 0; si2 < stsdL.length; si2++) {\n    var entryKids = RG_boxes(bytes, stsdL[si2].p + 16, stsdL[si2].p + stsdL[si2].s);\n    for (var ei2 = 0; ei2 < entryKids.length; ei2++) {\n      if (entryKids[ei2].t === 'bv2C' || entryKids[ei2].t === 'bv2c') { hasBv2C = true; }\n    }\n  }\n  var n1=0,n2=0,n3=0;\n  for (var i=0;i<stsdL.length;i++){\n    var kk = RG_boxes(bytes, stsdL[i].p+16, stsdL[i].p+stsdL[i].s);\n    for (var k=0;k<kk.length;k++){\n      var e=kk[k];\n      if (e.t==='encv'||e.t==='enca'){\n        if (e.t==='encv'){ bytes[e.p+4]=0x68;bytes[e.p+5]=0x65;bytes[e.p+6]=0x76;bytes[e.p+7]=0x31;n1++; }\n        else { bytes[e.p+4]=0x6d;bytes[e.p+5]=0x70;bytes[e.p+6]=0x34;bytes[e.p+7]=0x61;n2++; }\n        var eEnd=Math.min(e.p+e.s,BL);\n        for (var p3=e.p+8;p3+8<=eEnd;p3++){\n          if ((bytes[p3]&255)===0x73&&(bytes[p3+1]&255)===0x69&&(bytes[p3+2]&255)===0x6e&&(bytes[p3+3]&255)===0x66){\n            var sz4=RG_U32(bytes,p3-4);\n            if (sz4>=8 && p3-4+sz4<=BL){\n              bytes[p3]=0x66;bytes[p3+1]=0x72;bytes[p3+2]=0x65;bytes[p3+3]=0x65;\n              for (var j=p3+4;j<p3-4+sz4;j++) bytes[j]=0;\n              n3++; p3=p3-4+sz4-1;\n            }\n          }\n        }\n      }\n    }\n  }\n  var stbls = RG_find(bytes,28,moovEnd,'stbl');\n  var total=0;\n  for (var si=0;si<stbls.length;si++){\n    var sp=stbls[si].p, ss=stbls[si].s;\n    var kids=RG_boxes(bytes,sp+8,Math.min(sp+ss,BL));\n    var senc=null,stsz=null,stco=null,stsc=null;\n    for (var i2=0;i2<kids.length;i2++){\n      if(kids[i2].t==='senc')senc=kids[i2];\n      if(kids[i2].t==='stsz')stsz=kids[i2];\n      if(kids[i2].t==='stco')stco=kids[i2];\n      if(kids[i2].t==='stsc')stsc=kids[i2];\n    }\n    if(!senc||!stsz||!stco||!stsc) continue;\n    var dflt=RG_U32(bytes,stsz.p+12), cnt=RG_U32(bytes,stsz.p+16);\n    var nch=RG_U32(bytes,stco.p+12), nent=RG_U32(bytes,stsc.p+12);\n    var ef=[],es=[];\n    for (var j=0;j<nent;j++){ ef.push(RG_U32(bytes,stsc.p+16+j*12)); es.push(RG_U32(bytes,stsc.p+16+j*12+4)); }\n    var sidx=0,eidx=0;\n    for (var c=0;c<nch && sidx<cnt;c++){\n      while(eidx+1<nent && ef[eidx+1]<=c+1) eidx++;\n      var spc=es[eidx];\n      var off=RG_U32(bytes,stco.p+16+c*4);\n      for (var k2=0;k2<spc && sidx<cnt;k2++){\n        var size=dflt?dflt:RG_U32(bytes,stsz.p+20+sidx*4);\n        if(off+size>BL){c=nch;break;}\n        var ivOff=senc.p+16+sidx*8;\n        var iv16=RG_S2B(String.fromCharCode(\n          bytes[ivOff]&255,bytes[ivOff+1]&255,bytes[ivOff+2]&255,bytes[ivOff+3]&255,\n          bytes[ivOff+4]&255,bytes[ivOff+5]&255,bytes[ivOff+6]&255,bytes[ivOff+7]&255,\n          0,0,0,0,0,0,0,0));\n        var cph=RG_CIPHER.getInstance('AES/CTR/NoPadding');\n        cph.init(RG_CIPHER.DECRYPT_MODE, sk, new RG_IVP(iv16));\n        var dec=cph.doFinal(RG_ARR.copyOfRange(bytes,off,off+size));\n        RG_SYS.arraycopy(dec,0,bytes,off,size);\n        off+=size; sidx++; total++;\n      }\n    }\n  }\n  // ★E版兼容：清除 CENC 样本加密信息（senc/saiz/saio）\n  // Team版播放器会忽略它们，但 E版播放器见到 senc 就认为文件仍加密 → 拒绝播放\n  var n4=0,n5=0,n6=0;\n  for (var si3=0; si3<stbls.length; si3++){\n    var sp2=stbls[si3].p, ss2=stbls[si3].s;\n    var kids2=RG_boxes(bytes,sp2+8,Math.min(sp2+ss2,BL));\n    for (var i3=0;i3<kids2.length;i3++){\n      var e3=kids2[i3];\n      if (e3.t==='senc'||e3.t==='saiz'||e3.t==='saio'){\n        if (e3.t==='senc') n4++; else if (e3.t==='saiz') n5++; else n6++;\n        // 改成 free（保留 box 大小与位置，只改 fourcc 并清零 payload）\n        bytes[e3.p+4]=0x66; bytes[e3.p+5]=0x72; bytes[e3.p+6]=0x65; bytes[e3.p+7]=0x65;\n        for (var j3=e3.p+8;j3<Math.min(e3.p+e3.s,BL);j3++) bytes[j3]=0;\n      }\n    }\n  }\n  return {samples:total, encv:n1, enca:n2, sinf:n3, bv2c:hasBv2C, senc:n4, saiz:n5, saio:n6};\n}\n\n// ---------- 分块处理（大文件用，避免 hex 通道 OOM）----------\n// 从头部（含 moov）提取样本索引为简单数组：[offset, size, iv8hex]\nfunction RG_buildIndex(headB){\n  var BL = headB.length;\n  var moovEnd = BL;\n  var top = RG_boxes(headB, 0, Math.min(BL, 2000000));\n  for (var i=0;i<top.length;i++){ if(top[i].t==='moov'){ moovEnd=top[i].p+top[i].s; break; } }\n  // 总大小：★遍历找 mdat（moov 之后可能有 free/skip 等 box）\n  var total = moovEnd;\n  var mdatAt = -1;\n  var lim = Math.min(BL - 8, moovEnd + 200000);\n  for (var q = moovEnd; q < lim; q++) {\n    if (RG_STR(headB, q+4, 4) === 'mdat') {\n      mdatAt = q;\n      total = q + RG_U32(headB, q);\n      break;\n    }\n  }\n  // 兜底：用样本最大偏移 + size\n  if (mdatAt < 0) {\n    var maxEnd = moovEnd;\n    // samples 在后面构建，此处先用 stco 粗估\n    var stbls0 = RG_find(headB, 28, Math.min(moovEnd, BL), 'stbl');\n    for (var z0=0; z0<stbls0.length; z0++){\n      var kids0 = RG_boxes(headB, stbls0[z0].p+8, Math.min(stbls0[z0].p+stbls0[z0].s, BL));\n      for (var z1=0; z1<kids0.length; z1++){\n        if (kids0[z1].t === 'stco') {\n          var nch0 = RG_U32(headB, kids0[z1].p+12);\n          var lastOff = RG_U32(headB, kids0[z1].p+16+(nch0-1)*4);\n          if (lastOff > maxEnd) maxEnd = lastOff;\n        }\n      }\n    }\n    if (maxEnd > total) total = maxEnd + 1000000;   // 粗估最后一个 chunk 大小\n  }\n  // fourcc 修复位置（encv/enca → hev1/mp4a，sinf → free）\n  var fixes = [];\n  var stsdL = RG_find(headB, 28, Math.min(moovEnd, BL), 'stsd');\n  for (var si=0; si<stsdL.length; si++){\n    var kk = RG_boxes(headB, stsdL[si].p+16, stsdL[si].p+stsdL[si].s);\n    for (var k=0;k<kk.length;k++){\n      var e = kk[k];\n      if (e.t==='encv'||e.t==='enca'){\n        fixes.push({pos: e.p+4, to: (e.t==='encv') ? 'hev1' : 'mp4a'});\n        // 找内部 sinf\n        var eEnd = Math.min(e.p+e.s, BL);\n        for (var p3=e.p+8; p3+8<=eEnd; p3++){\n          if ((headB[p3]&255)===0x73&&(headB[p3+1]&255)===0x69&&(headB[p3+2]&255)===0x6e&&(headB[p3+3]&255)===0x66){\n            var sz4 = RG_U32(headB, p3-4);\n            if (sz4>=8 && p3-4+sz4<=BL){\n              fixes.push({pos: p3, to: 'free', zeroFrom: p3+4, zeroTo: p3-4+sz4});\n              p3 = p3-4+sz4-1;\n            }\n          }\n        }\n      }\n    }\n  }\n  // 样本索引\n  var samples = [];\n  var stbls = RG_find(headB, 28, Math.min(moovEnd, BL), 'stbl');\n  for (var si2=0; si2<stbls.length; si2++){\n    var sp = stbls[si2].p, ss = stbls[si2].s;\n    var kids = RG_boxes(headB, sp+8, Math.min(sp+ss, BL));\n    var senc=null, stsz=null, stco=null, stsc=null;\n    for (var i2=0;i2<kids.length;i2++){\n      if(kids[i2].t==='senc') senc=kids[i2];\n      if(kids[i2].t==='stsz') stsz=kids[i2];\n      if(kids[i2].t==='stco') stco=kids[i2];\n      if(kids[i2].t==='stsc') stsc=kids[i2];\n    }\n    if(!senc||!stsz||!stco||!stsc) continue;\n    var dflt = RG_U32(headB, stsz.p+12), cnt = RG_U32(headB, stsz.p+16);\n    var nch = RG_U32(headB, stco.p+12), nent = RG_U32(headB, stsc.p+12);\n    var ef=[], es=[];\n    for (var j=0;j<nent;j++){ ef.push(RG_U32(headB, stsc.p+16+j*12)); es.push(RG_U32(headB, stsc.p+16+j*12+4)); }\n    var sidx=0, eidx=0;\n    for (var c=0; c<nch && sidx<cnt; c++){\n      while(eidx+1<nent && ef[eidx+1] <= c+1) eidx++;\n      var spc = es[eidx];\n      var off = RG_U32(headB, stco.p+16+c*4);\n      for (var k2=0; k2<spc && sidx<cnt; k2++){\n        var size = dflt ? dflt : RG_U32(headB, stsz.p+20+sidx*4);\n        var ivOff = senc.p+16+sidx*8;\n        samples.push({off: off, size: size, iv: [\n          headB[ivOff]&255, headB[ivOff+1]&255, headB[ivOff+2]&255, headB[ivOff+3]&255,\n          headB[ivOff+4]&255, headB[ivOff+5]&255, headB[ivOff+6]&255, headB[ivOff+7]&255\n        ]});\n        off += size; sidx++;\n      }\n    }\n  }\n  return {total: total, moovEnd: moovEnd, fixes: fixes, samples: samples};\n}\n\n// 对单个块做解密（blockStart = 块在文件中的起始偏移）\nfunction RG_decryptBlock(block, blockStart, keyHex, samples){\n  var BL = block.length;\n  var sk = new RG_SK(RG_H2B(keyHex), 'AES');\n  var cnt = 0;\n  // 二分找到第一个可能重叠的样本\n  var lo = 0, hi = samples.length - 1, start = samples.length;\n  while (lo <= hi) {\n    var mid = (lo + hi) >> 1;\n    if (samples[mid].off + samples[mid].size > blockStart) { start = mid; hi = mid - 1; }\n    else lo = mid + 1;\n  }\n  for (var i = start; i < samples.length; i++){\n    var s = samples[i];\n    if (s.off >= blockStart + BL) break;\n    var gEnd = s.off + s.size;\n    if (gEnd <= blockStart) continue;\n    var os = Math.max(s.off, blockStart) - blockStart;\n    var oe = Math.min(gEnd, blockStart + BL) - blockStart;\n    if (oe <= os) continue;\n    var iv16 = RG_S2B(String.fromCharCode(s.iv[0], s.iv[1], s.iv[2], s.iv[3], s.iv[4], s.iv[5], s.iv[6], s.iv[7], 0,0,0,0,0,0,0,0));\n    var cph = RG_CIPHER.getInstance('AES/CTR/NoPadding');\n    cph.init(RG_CIPHER.DECRYPT_MODE, sk, new RG_IVP(iv16));\n    var dec = cph.doFinal(RG_ARR.copyOfRange(block, os, oe));\n    RG_SYS.arraycopy(dec, 0, block, os, oe - os);\n    cnt++;\n  }\n  return cnt;\n}\n\n// 应用 fourcc 修复到块（如果块包含修复位置）\nfunction RG_applyFixes(block, blockStart, fixes){\n  for (var i=0; i<fixes.length; i++){\n    var f = fixes[i];\n    if (f.pos >= blockStart && f.pos + 4 <= blockStart + block.length) {\n      var p = f.pos - blockStart;\n      block[p] = f.to.charCodeAt(0); block[p+1] = f.to.charCodeAt(1);\n      block[p+2] = f.to.charCodeAt(2); block[p+3] = f.to.charCodeAt(3);\n      if (f.zeroFrom !== undefined) {\n        var zs = Math.max(f.zeroFrom, blockStart) - blockStart;\n        var ze = Math.min(f.zeroTo, blockStart + block.length) - blockStart;\n        for (var z = zs; z < ze; z++) block[z] = 0;\n      }\n    }\n  }\n}\n\n// 播放数据（preload + fallback）\n// ★ 关键：video_model.video_list[].main_url 是明文 URL；\n//   fallback_api 响应里的 video_list.video_N.main_url 才是 spade 密文（需解密）\nfunction HG_playData(JV, vid, sid){\n  var BP = {detail_page_version:0,device_level:3,disable_digg_stat:false,need_all_video_definition:true,\n  need_mp4_align:false,use_os_player:false,use_server_dns:false,video_platform:1024};\n  var raw = String(HG_API(JV,'/novel/player/multi_video_model/preload/v1',{biz_param:BP,dr_scene:'preload',mixed_video_id_map:{'1004':[vid]}}));\n  var j = null; try { j = JSON.parse(raw); } catch(e) {}\n  if (!j || j.code !== 0 || !j.data) return null;\n  var entry = j.data[vid] || j.data[Object.keys(j.data)[0]];\n  if (!entry || !entry.video_model) return null;\n  var vm = typeof entry.video_model === 'string' ? JSON.parse(entry.video_model) : entry.video_model;\n  // 画质偏好：默认 720p，可用书源变量 hgq 覆盖（360/480/540/720/1080）\n  var prefQ = '';\n  try { prefQ = String(JV.get ? (JV.get('hgq') || '') : ''); } catch(e0) {}\n  if (!prefQ) { try { prefQ = String(source.get('hgq') || ''); } catch(e1) {} }\n  if (!prefQ) prefQ = '480';   // 默认 480p：平衡内存与清晰度（720p+ 在校验器连续执行时可能 OOM）\n  var wantDef = prefQ + 'p';\n  // ★只选 bytevc1（标准 H.265 / hvcC）：bytevc2 是 ByteDance 私有 bv2C 编码，Android 解码器不支持\n  function isStdCodec(v){ return String((v.video_meta||{}).codec_type||'') === 'bytevc1'; }\n  // 第一优先：目标清晰度 + bytevc1\n  var pick = null, pickSpadeA = '', pickDef = '';\n  for (var i = 0; i < vm.video_list.length; i++) {\n    var v = vm.video_list[i];\n    var ei = v.encrypt_info || {};\n    if (!ei.spade_a) continue;\n    var def = String((v.video_meta||{}).definition||'');\n    if (def === wantDef && isStdCodec(v)) { pick = v; pickSpadeA = String(ei.spade_a); pickDef = def; break; }\n  }\n  // 第二优先：任意 bytevc1（选 size 最大）\n  if (!pick) {\n    var bestSize = -1;\n    for (var i2 = 0; i2 < vm.video_list.length; i2++) {\n      var v2 = vm.video_list[i2];\n      var ei2 = v2.encrypt_info || {};\n      if (!ei2.spade_a || !isStdCodec(v2)) continue;\n      var sz = parseInt((v2.video_meta||{}).size || '0', 10) || 0;\n      if (sz > bestSize) { bestSize = sz; pick = v2; pickSpadeA = String(ei2.spade_a); pickDef = String((v2.video_meta||{}).definition||''); }\n    }\n  }\n  // 第三优先（兜底）：目标清晰度，任意 codec（可能会遇到 bv2C）\n  if (!pick) {\n    for (var i3 = 0; i3 < vm.video_list.length; i3++) {\n      var v3 = vm.video_list[i3];\n      var ei3 = v3.encrypt_info || {};\n      if (!ei3.spade_a) continue;\n      var def3 = String((v3.video_meta||{}).definition||'');\n      if (def3 === wantDef) { pick = v3; pickSpadeA = String(ei3.spade_a); pickDef = def3; break; }\n    }\n  }\n  if (!pick) return null;\n  // ★体积上限：hex 通道内存峰值约为文件的 2 倍，超过 24MB 会 OOM\n  // 优先在选中档位中找 ≤ 上限的；找不到则用最小的（并标记）\n  var maxMB = 20;\n  try { var mv = String(source.get('hgmax') || ''); if (mv) maxMB = parseInt(mv, 10) || 24; } catch(e5) {}\n  var maxBytes = maxMB * 1048576;\n  var pickSize = parseInt((pick.video_meta||{}).size || '0', 10) || 0;\n  // ★体积上限：写文件需 hex 字符串（约 4×文件字节），20MB 文件约需 80MB 峰值；再大必然 OOM\n  if (pickSize > maxBytes) {\n    var wantStd = isStdCodec(pick);\n    var alt = null, altSize = -1, altSpadeA = '', altDef = '';\n    for (var i4 = 0; i4 < vm.video_list.length; i4++) {\n      var v4 = vm.video_list[i4];\n      var ei4 = v4.encrypt_info || {};\n      if (!ei4.spade_a) continue;\n      if (isStdCodec(v4) !== wantStd) continue;\n      var sz4 = parseInt((v4.video_meta||{}).size || '0', 10) || 0;\n      if (sz4 <= maxBytes && sz4 > altSize) { altSize = sz4; alt = v4; altSpadeA = String(ei4.spade_a); altDef = String((v4.video_meta||{}).definition||''); }\n    }\n    if (alt) { pick = alt; pickSpadeA = altSpadeA; pickDef = altDef; pickSize = altSize; }\n    else { return { spade: null, spadeA: null, seed: null, def: pickDef, tooBig: true, sizeMB: (pickSize/1048576).toFixed(0) }; }\n  }\n  var bestSpadeA = pickSpadeA, bestDef = pickDef;\n  // fallback 响应里才有 spade 密文 URL + key_seed\n  var fb = vm.fallback_api && vm.fallback_api.fallback_api;\n  if (!fb) return null;\n  var fbr = String(JV.ajax(fb + ','+String.fromCharCode(123,34,104,101,97,100,101,114,115,34,58,123,34,85,115,101,114,45,65,103,101,110,116,34,58,34,99,111,109,46,112,104,111,101,110,105,120,46,114,101,97,100,47,55,50,57,51,50,34,125,125)));\n  var fj = null; try { fj = JSON.parse(fbr); } catch(e) {}\n  if (!fj || !fj.video_info || !fj.video_info.data) return null;\n  var fd = fj.video_info.data;\n  var seed = String(fd.key_seed || '');\n  if (!seed) return null;\n  var fvl = fd.video_list || {};\n  // 优先按 definition 匹配；否则取 size 最大的\n  var bestUrl = '', bestFs = -1, exactUrl = '';\n  for (var k in fvl) {\n    var fv = fvl[k] || {};\n    var mu = String(fv.main_url || '');\n    if (!mu || mu.indexOf('http') === 0) continue;   // 只要 spade 密文\n    var fdef = String(fv.definition || '');\n    if (fdef === bestDef) exactUrl = mu;\n    var fsz = parseInt(fv.size || '0', 10) || 0;\n    if (fsz > bestFs) { bestFs = fsz; bestUrl = mu; }\n  }\n  if (exactUrl) bestUrl = exactUrl;\n  if (!bestUrl) return null;\n  return { spade: bestUrl, spadeA: bestSpadeA, seed: seed, def: bestDef, sizeMB: ((parseInt((pick.video_meta||{}).size||'0',10)||0)/1048576).toFixed(1) };\n}\n\n// ===== 红果短剧 API 版规则函数（供书源各字段调用）=====\n// --- 搜索：网页版 /search/{kw}，解析内嵌 searchList ---\n\n// 括号配平提取 JSON 数组/对象\nfunction HG_jsonArray(text, marker){\nvar i=String(text).indexOf(marker);\nif(i<0) return null;\nvar j=i+marker.length;\nwhile(j<text.length && (text[j]===' '||text[j]===String.fromCharCode(10)||text[j]===String.fromCharCode(9))) j++;\nvar open=text[j];\nif(open!=='[' && open!=='{') return null;\nvar close=open==='['?']':'}';\nvar depth=0,quoted=false,esc=false,end=j;\nfor(;end<text.length;end++){\nvar ch=text[end];\nif(quoted){ if(esc)esc=false; else if(ch===String.fromCharCode(92))esc=true; else if(ch===String.fromCharCode(34))quoted=false; continue; }\nif(ch===String.fromCharCode(34))quoted=true;\nelse if(ch===open)depth++;\nelse if(ch===close && --depth===0) break;\n}\ntry{ return JSON.parse(text.substring(j,end+1)); }catch(e){ return null; }\n}\n// --- 详情：API multi_video_detail/v1 ---\nfunction HG_detail(JV, sid){\nvar BP={detail_page_version:0,disable_digg_stat:false,disable_video_relate_book:false,\nneed_all_video_definition:false,need_mp4_align:false,screen_width_px:'900',source:7,\nuse_os_player:false,use_server_dns:false};\nvar r=HG_API(JV,'/novel/player/multi_video_detail/v1/',{biz_param:BP,series_id:sid});\nvar j=null; try{ j=JSON.parse(String(r)); }catch(e){}\nif(!j || j.code!==0 || !j.data) return null;\nvar d=j.data[sid]||j.data[Object.keys(j.data)[0]];\nif(!d) return null;\nvar vd=d.video_data||{};\nreturn {sid:sid,\nname:String(vd.series_title||''),\nauthor:'红果短剧',\nkind:String(vd.episode_cnt||0)+'集',\nintro:String(vd.series_intro||''),\ncoverUrl:String(vd.series_cover||''),\nepisodeCnt:vd.episode_cnt||0,\nvideoList:vd.video_list||[]};\n}\n// --- 目录：从 video_list 生成章节 ---\nfunction HG_chapters(JV, sid){\nvar d=HG_detail(JV,sid);\nif(!d) throw new Error('获取剧集失败：接口未返回数据，请检查网络或稍后重试');\nvar out=[];\nvar vl=d.videoList||[];\nfor(var i=0;i<vl.length;i++){\nvar v=vl[i]||{};\nvar idx=v.vid_index||(i+1);\nvar vid=String(v.vid||'');\nif(!vid) continue;\nout.push(JSON.stringify({name:'第'+idx+'集',url:'https://api5-normal-sinfonlineb.fqnovel.com/play?vid='+vid+'&series_id='+sid+'&idx='+idx}));\n}\nif(!out.length) throw new Error('该剧暂无可用剧集');\nreturn out;\n}\n// --- 正文：取播放直链 ---\nfunction HG_play(JV, vid, sid){\nvar BP={detail_page_version:0,device_level:3,disable_digg_stat:false,need_all_video_definition:true,\nneed_mp4_align:false,use_os_player:false,use_server_dns:false,video_platform:1024};\nvar r=HG_API(JV,'/novel/player/multi_video_model/preload/v1',{biz_param:BP,dr_scene:'preload',mixed_video_id_map:{'1004':[vid]}});\nvar j=null; try{ j=JSON.parse(String(r)); }catch(e){}\nif(!j||j.code!==0||!j.data) return null;\nvar item=j.data[vid];\nif(!item) return null;\nvar vm=null; try{ vm=JSON.parse(item.video_model); }catch(e){}\nif(!vm||!vm.video_list||!vm.video_list.length) return null;\n// 选最高清晰度\nvar best=null,bestScore=-1;\nfor(var i=0;i<vm.video_list.length;i++){\nvar v=vm.video_list[i];\nif(!v.main_url) continue;\nvar meta=v.video_meta||{};\nvar def=parseInt(String(meta.definition||'0'),10)||0;\nif(def<100){ var mm=String(meta.definition||'').match(/([0-9]+)/); def=mm?parseInt(mm[1],10):0; }\nvar sc=def*1000000+(parseInt(meta.vwidth||0,10)*parseInt(meta.vheight||0,10));\nif(sc>bestScore){ bestScore=sc; best=v; }\n}\nif(!best) return null;\nreturn {url:String(best.main_url),backup:String(best.backup_url||''),def:String((best.video_meta||{}).definition||''),expire:vm.url_expire||item.expire_time||0};\n}\n// --- 关键词反解（bookList 上下文无 key 变量）---\n\n// --- 站点状态自检（登录界面按钮用）---\nfunction HG_check(JV, SV){\nvar out=[];\n// 1. 网页可达性\ntry{\nvar t0=new Date().getTime();\nvar r=String(JV.ajax('https://hongguoduanju.com/'));\nvar t1=new Date().getTime();\nout.push(r.length>10000 ? ('✅ 网页版可达 ('+(t1-t0)+'ms, '+r.length+'字节)') : ('⚠️ 网页版响应异常 ('+r.length+'字节)'));\n}catch(e){ out.push('❌ 网页版不可达: '+String(e).substring(0,60)); }\n// 2. API 可达性 + 签名自检\ntry{\nvar t2=new Date().getTime();\nvar r2=HG_API(JV,'/novel/player/multi_video_detail/v1/',{biz_param:{detail_page_version:0,disable_digg_stat:false,disable_video_relate_book:false,need_all_video_definition:false,need_mp4_align:false,screen_width_px:'900',source:7,use_os_player:false,use_server_dns:false},series_id:'7503745441910017049'});\nvar t3=new Date().getTime();\nvar j=null; try{ j=JSON.parse(String(r2)); }catch(e){}\nif(j && j.code===0){ out.push('✅ API 签名有效 ('+(t3-t2)+'ms)'); }\nelse if(j){ out.push('⚠️ API 返回异常 code='+j.code+' '+(j.message||'')); }\nelse { out.push('⚠️ API 响应无法解析 ('+String(r2).length+'字节)'); }\n}catch(e){ out.push('❌ API 不可达: '+String(e).substring(0,60)); }\nout.push('【说明】 本剧集无需登录，游客即可观看全集');\nreturn out.join(String.fromCharCode(10));\n}\n// --- 发现页：榜单/分类（网页版 HTML 解析）---\n\n// --- 发现页参数反解 ---\n\n\n\n// 清理上次生成的解密视频文件（避免缓存堆积）\nfunction RG_cleanOld(JV, SV){\n  try {\n    var oldPath = String(SV.get('rg_last') || '');\n    if (oldPath) {\n      try { JV.deleteFile(oldPath); } catch(e1) {}\n      SV.put('rg_last', '');\n    }\n  } catch(e2) {}\n}\n\n// 裁剪解密缓存：只保留最近 N 个，其余删除（避免缓存无限堆积）\nfunction RG_trimCache(JV, SV){\n  try {\n    var keys = String(SV.get('rg_keys') || '');\n    var arr = keys ? keys.split(',') : [];\n    // 新键已在规则里 put，这里把当前键加入列表\n    // 保留最近 8 个\n    var MAXK = 8;\n    while (arr.length > MAXK) {\n      var oldKey = arr.shift();\n      try {\n        var p = String(SV.get(oldKey) || '');\n        if (p) { try { JV.deleteFile(p); } catch(e1) {} }\n        SV.put(oldKey, '');\n      } catch(e2) {}\n    }\n    SV.put('rg_keys', arr.join(','));\n  } catch(e3) {}\n}\n\n// ============================================================\n// 以下为「视频书源」新增/覆盖函数（番茄短剧·漫剧）\n// 所有函数都把 java/source 作为显式参数传入，避免 jsLib 作用域限制\n// ============================================================\n\n// —— 通用请求（GET，带 phoenix 头 + 签名）——\nfunction FV_get(JV, path, extra, host){\n  var q={aid:'8662',app_name:'novelread',version_code:'72932',version_name:'7.2.9.32',\n  device_platform:'android',os:'android',ssmix:'a',device_type:'V2284A',device_brand:'vivo',\n  language:'zh',os_api:'32',os_version:'12',manifest_version_code:'72932',\n  resolution:'1080*1920',dpi:'280',update_version_code:'72932',host_abi:'arm64-v8a',\n  iid:'4439167111854618',device_id:'4439167111850522',channel:'huawei_8662_64',\n  ac:'wifi',dragon_device_type:'phone',pv_player:'72932',compliance_status:'0',\n  need_personal_recommend:'1',player_so_load:'1',is_android_pad_screen:'1',\n  rom_version:'V417IR+release-keys',cdid:'6100e9f9-a1a0-4f65-ab47-94f5b41b8efb'};\n  for(var k in (extra||{})) q[k]=extra[k];\n  var arr=[]; for(var k2 in q) arr.push(k2+'='+encodeURIComponent(String(q[k2])));\n  arr.push('_rticket='+String(new Date().getTime()));\n  var url=(host||'https://api5-normal-sinfonlineb.fqnovel.com')+path+'?'+arr.join('&');\n  var h={'user-agent':'com.phoenix.read/72932 (Linux; U; Android 12; zh_CN; V2284A; Build/V417IR;tt-ok/3.12.13.20)',\n  'Accept':'application/json; charset=utf-8,application/x-protobuf',\n  'content-type':'application/json; charset=utf-8','cookie':'',\n  'x-tt-token':'','x-tt-store-region':'cn-zj','x-tt-store-region-src':'did',\n  'passport-sdk-version':'5051452','sdk-version':'2'};\n  var sg=HG_sign(url,{headers:h});\n  for(var k3 in sg) h[k3]=sg[k3];\n  return String(JV.ajax(url+','+JSON.stringify({headers:h})));\n}\n\n// —— 漫剧/短剧 发现：第一段（取 cell_id_str + session_id）——\nfunction FV_tab(JV, tabType){\n  var r=FV_get(JV,'/reading/bookapi/bookmall/tab/v',{tab_type:String(tabType),client_template:'0',\n    offset:'0',last_tab_index:'0',screen_width_px:'1281',classic_tab_style:'v3',\n    bottom_tab_type:'0',client_req_type:'1'});\n  var j=null; try{ j=JSON.parse(r); }catch(e){ return null; }\n  if(!j.data||!j.data.tab_item) return null;\n  var ti=j.data.tab_item;\n  for(var i=0;i<ti.length;i++){\n    if(String(ti[i].tab_type)===String(tabType)) return ti[i];\n  }\n  return null;\n}\n\n// —— 漫剧/短剧 发现：第二段（取视频流，支持翻页）——\n// off=0 首屏（change_type=2），off>0 翻页（change_type=1）；sid 必须回传（服务端绑设备）\nfunction FV_feed(JV, tabType, cellId, off, sid){\n  var ex={cell_id:cellId,tab_type:String(tabType),client_template:'2',client_req_type:'2',\n    offset:String(off),unlimited_selector_change_type:(off>0?'1':'2')};\n  if(sid) ex.session_id=sid;\n  var r=FV_get(JV,'/reading/bookapi/bookmall/cell/change/v1/',ex);\n  var j=null; try{ j=JSON.parse(r); }catch(e){ return null; }\n  var d=j.data||{};\n  return d;\n}\n\n// —— 从任意 cell 树里递归收集 video_data ——\nfunction FV_collect(node, out){\n  if(!node) return out;\n  if(Array.isArray(node)){\n    for(var i=0;i<node.length;i++) FV_collect(node[i],out);\n    return out;\n  }\n  var vd=node.video_data;\n  if(vd){\n    if(Array.isArray(vd)){ for(var m=0;m<vd.length;m++) out.push(vd[m]); }\n    else out.push(vd);\n  }\n  var sub=node.cell_data;\n  if(sub) FV_collect(sub,out);\n  return out;\n}\n\n// —— video_data → 书源条目 ——\nfunction FV_item(v){\n  if(!v) return null;\n  var sid=String(v.series_id||'');\n  if(!sid) return null;\n  var t=String(v.title||v.series_title||'').trim();\n  if(!t) return null;\n  var k=[];\n  if(v.episode_cnt) k.push(String(v.episode_cnt)+'集');\n  if(v.vertical===false) k.push('横屏');\n  if(v.score) k.push(String(v.score)+'分');\n  if(v.play_cnt) k.push(String(Math.round(Number(v.play_cnt)/10000))+'万播放');\n  return JSON.stringify({name:t,author:'番茄短剧',kind:k.join(' · '),\n    intro:String(v.video_desc||v.series_intro||''),\n    coverUrl:String(v.cover||v.series_cover||''),\n    bookUrl:'https://api5-normal-sinfonlineb.fqnovel.com/detail?series_id='+sid});\n}\n\n// —— 发现页入口：解析出 kind 与 page 后调对应通道 ——\n// kind: manju(漫剧32) / zhaoju(找剧8) / dongman(动漫24)\nfunction FV_explore(JV, SV, kind, page){\n  var ttMap={manju:32,zhaoju:8,dongman:24};\n  var tt=ttMap[kind]; if(!tt) return [];\n  var pg=parseInt(page||'1',10)||1;\n  // cell 缓存（同一书源会话内复用；服务端 cell_id 数天不变）\n  var ck='fv_cell_'+tt;\n  var cellId='', sid='';\n  try{ cellId=String(SV.get(ck)||''); }catch(e){}\n  if(!cellId){\n    var t=FV_tab(JV,tt);\n    if(!t) throw new Error('发现页加载失败：无法获取频道数据（'+tt+'）');\n    var c=t.cell_data&&t.cell_data[0]?t.cell_data[0].cell_id_str:'';\n    if(!c) throw new Error('发现页加载失败：频道无 cell');\n    cellId=String(c);\n    try{ SV.put(ck,cellId); }catch(e2){}\n  }\n  // 翻页需要 session：首屏先取一次\n  var sk='fv_sid_'+tt;\n  try{ sid=String(SV.get(sk)||''); }catch(e3){}\n  var off=(pg-1)*6;\n  var d=FV_feed(JV,tt,cellId,off,sid);\n  if(!d){\n    // session 失效 → 重新开一次首屏拿新 session 后重试\n    var t2=FV_tab(JV,tt);\n    if(t2&&t2.session_id){ sid=String(t2.session_id); try{ SV.put(sk,sid); }catch(e4){} }\n    d=FV_feed(JV,tt,cellId,off,sid);\n  }\n  if(!d) throw new Error('发现页加载失败：视频流为空');\n  if(d.session_id){ try{ SV.put(sk,String(d.session_id)); }catch(e5){} }\n  var arr=FV_collect((d.cell_view&&d.cell_view.cell_data)||[],[]);\n  var out=[]; var seen={};\n  for(var i=0;i<arr.length;i++){\n    var it=FV_item(arr[i]);\n    if(!it) continue;\n    var o=JSON.parse(it);\n    if(seen[o.bookUrl]) continue;\n    seen[o.bookUrl]=1;\n    out.push(it);\n  }\n  // has_more=false 且是最后一页 → 返回空数组让 Legado 停止翻页\n  if(d.has_more===false && out.length===0) return [];\n  return out;\n}\n\n// —— 搜索：suggest 通道（含视频结果）——\n// 注意：该接口固定 10 条、无翻页参数；视频条目在 query_result_v2[].video_data\nfunction FV_search(JV, kw){\n  var r=FV_get(JV,'/reading/bookapi/search/suggest/v',{query:kw,keyword:kw,q:kw});\n  var j=null; try{ j=JSON.parse(r); }catch(e){ return []; }\n  if(!j.data) return [];\n  var v2=j.data.query_result_v2||[];\n  var out=[];\n  for(var i=0;i<v2.length;i++){\n    var v=v2[i].video_data;\n    if(!v) continue;\n    var it=FV_item(v);\n    if(it) out.push(it);\n  }\n  return out;\n}\n\n// —— 详情：multi_video_detail ——\nfunction FV_detail(JV, sid){\n  var BP={detail_page_version:0,disable_digg_stat:false,disable_video_relate_book:false,\n    need_all_video_definition:false,need_mp4_align:false,screen_width_px:'900',source:7,\n    use_os_player:false,use_server_dns:false};\n  var body={biz_param:BP,series_id:String(sid)};\n  var bs=JSON.stringify(body);\n  var u='https://api5-normal-sinfonlineb.fqnovel.com/novel/player/multi_video_detail/v1/';\n  var arr=[]; \n  var q={aid:'8662',app_name:'novelread',version_code:'72932',version_name:'7.2.9.32',\n    device_platform:'android',os:'android',ssmix:'a',device_type:'V2284A',device_brand:'vivo',\n    language:'zh',os_api:'32',os_version:'12',manifest_version_code:'72932',\n    resolution:'1080*1920',dpi:'280',update_version_code:'72932',host_abi:'arm64-v8a',\n    iid:'4439167111854618',device_id:'4439167111850522',channel:'huawei_8662_64',\n    ac:'wifi',dragon_device_type:'phone',pv_player:'72932',compliance_status:'0',\n    need_personal_recommend:'1',player_so_load:'1',is_android_pad_screen:'1',\n    rom_version:'V417IR+release-keys',cdid:'6100e9f9-a1a0-4f65-ab47-94f5b41b8efb'};\n  for(var k in q) arr.push(k+'='+encodeURIComponent(String(q[k])));\n  var url=u+'?'+arr.join('&');\n  var h={'user-agent':'com.phoenix.read/72932 (Linux; U; Android 12; zh_CN; V2284A; Build/V417IR;tt-ok/3.12.13.20)',\n    'Accept':'application/json; charset=utf-8,application/x-protobuf',\n    'content-type':'application/json; charset=utf-8','cookie':'',\n    'x-tt-token':'','x-tt-store-region':'cn-zj','x-tt-store-region-src':'did',\n    'passport-sdk-version':'5051452','sdk-version':'2'};\n  h['x-ss-stub']=HG_hx(HG_md5(HG_u8(bs))).toUpperCase();\n  var sg=HG_sign(url,{headers:h,body:bs});\n  for(var k3 in sg) h[k3]=sg[k3];\n  var r=String(JV.ajax(url+','+JSON.stringify({method:'POST',headers:h,body:bs})));\n  var j=null; try{ j=JSON.parse(r); }catch(e){ return null; }\n  if(j.code!==0||!j.data) return null;\n  var d=j.data[String(sid)]||j.data[Object.keys(j.data)[0]];\n  if(!d) return null;\n  var vd=d.video_data||{};\n  return {sid:String(sid),name:String(vd.series_title||''),author:'番茄短剧',\n    kind:String(vd.episode_cnt||0)+'集',\n    intro:String(vd.series_intro||''),\n    coverUrl:String(vd.series_cover||''),\n    episodeCnt:Number(vd.episode_cnt||0),\n    videoList:vd.video_list||[]};\n}\n\n// —— 播放：shortplay 通道（aid=1967，各档位 bytevc1 可播，URL 为 base64 明文）——\nfunction FV_playData(JV, vid){\n  var u='https://api3-normal-sinfonlinea.fqnovel.com/novel/player/video_model/v1/'\n    +'?iid=4439167111854618&device_id=4439167111850522&aid=1967&app_name=novelapp'\n    +'&version_code=72132&version_name=7.2.1.32&device_platform=android&device_brand=Xiaomi'\n    +'&os_version=13&cdid=6100e9f9-a1a0-4f65-ab47-94f5b41b8efb';\n  var BP={detail_page_version:0,device_level:3,disable_digg_stat:false,disable_video_relate_book:false,\n    from_video_id:'',need_all_video_definition:true,need_mp4_align:false,source:4,\n    use_os_player:false,use_server_dns:false,video_platform:3};\n  var body={video_id:String(vid),content_type:1004,biz_param:BP};\n  var bs=JSON.stringify(body);\n  var h={'user-agent':'com.dragon.read','Content-Type':'application/json'};\n  h['x-ss-stub']=HG_hx(HG_md5(HG_u8(bs))).toUpperCase();\n  var sg=HG_sign(u,{headers:h,body:bs});\n  for(var k in sg) h[k]=sg[k];\n  var r=String(JV.ajax(u+','+JSON.stringify({method:'POST',headers:h,body:bs})));\n  var j=null; try{ j=JSON.parse(r); }catch(e){ return null; }\n  if(j.code!==0||!j.data||!j.data.video_model) return null;\n  var vm=null;\n  try{ vm=(typeof j.data.video_model==='string')?JSON.parse(j.data.video_model):j.data.video_model; }catch(e2){ return null; }\n  var vl=vm.video_list;\n  if(!vl) return null;\n  // 画质偏好：source.get('hgq') 覆盖（360/480/540/720），默认 360（体积小、解密快）\n  var prefQ='';\n  try{ prefQ=String(JV.get?JV.get('hgq'):''); }catch(e3){}\n  if(!prefQ){ try{ prefQ=String(source.get('hgq')||''); }catch(e4){} }\n  if(!prefQ) prefQ='360';\n  var want=prefQ+'p';\n  var pick=null;\n  for(var kk in vl){\n    var v=vl[kk];\n    if(String(v.definition||'')===want && String(v.codec_type||'')==='bytevc1'){ pick=v; break; }\n  }\n  if(!pick){\n    var best=-1;\n    for(var k2 in vl){\n      var v2=vl[k2];\n      if(String(v2.codec_type||'')!=='bytevc1') continue;\n      var sz=parseInt(v2.size||'0',10)||0;\n      if(sz>best){ best=sz; pick=v2; }\n    }\n  }\n  if(!pick){\n    for(var k3 in vl){ var v3=vl[k3]; if(String(v3.definition||'')===want){ pick=v3; break; } }\n  }\n  if(!pick) return null;\n  var url64=String(pick.main_url||'');\n  if(!url64) return null;\n  var realUrl='';\n  try{ realUrl=String(new Packages.java.lang.String(RG_b64d(url64),'UTF-8')); }catch(e5){\n    try{ realUrl=String(new Packages.java.lang.String(Packages.java.util.Base64.getDecoder().decode(url64),'UTF-8')); }catch(e6){ return null; }\n  }\n  if(realUrl.indexOf('http')!==0) return null;\n  var size=parseInt(pick.size||'0',10)||0;\n  return {url:realUrl,def:String(pick.definition||''),size:size,\n    sizeMB:Math.round(size/1048576),spadeA:String(pick.spade_a||''),\n    bv2c:(String(pick.codec_type||'').indexOf('bytevc2')>=0)};\n}\n\nfunction FV_epk(u){var s=String(u||'');var m=s.match(/[?&]kind=([a-z]+)/);return m?m[1]:'';}\nfunction FV_epp(u){var s=String(u||'');var m=s.match(/[?&]page=([0-9]+)/);return m?m[1]:'1';}\nfunction HG_SW(u){var s=String(u||'');var i=s.indexOf('suggest=');if(i<0)return '';var r=s.substring(i+8);try{return decodeURIComponent(r);}catch(e){return r;}}\nfunction FV_trimCache(JV,SV){\n  try{\n    var keys=String(SV.get('fv_keys')||'');\n    var arr=keys?keys.split(','):[];\n    var MAXK=6;\n    while(arr.length>MAXK){\n      var oldKey=arr.shift();\n      try{\n        var p=String(SV.get(oldKey)||'');\n        if(p){ try{ JV.deleteFile(p); }catch(e1){} }\n        SV.put(oldKey,'');\n      }catch(e2){}\n    }\n    SV.put('fv_keys',arr.join(','));\n  }catch(e3){}\n}\n\n// ★动态探测缓存目录（跨版本兼容：不同 App 包名不同）\nfunction FV_cacheDir(JV){\n  var jv = JV || java;   // 优先用传入的 JV（规则上下文），回退全局 java（eval_js 上下文）\n  try{ jv.readFile('/'); }catch(e){\n    var m=String(e).match(/([/]storage[/]emulated[/]0[/]Android[/]data[/][^/]+[/]cache)/);\n    if(m) return m[1];\n    var m2=String(e).match(/([/]data[/]data[/][^/]+[/]cache)/);\n    if(m2) return m2[1];\n  }\n  return '';\n}\n", "lastUpdateTime": "1791896067277", "loginUi": "[{\"name\": \"📺 番茄短剧·漫剧\", \"type\": \"button\", \"action\": \"FV_check(java)\"}, {\"name\": \"🎚 画质：360P（默认，最快）\", \"type\": \"button\", \"action\": \"FV_qset(java,source,'360')\"}, {\"name\": \"🎚 画质：480P\", \"type\": \"button\", \"action\": \"FV_qset(java,source,'480')\"}, {\"name\": \"🎚 画质：540P\", \"type\": \"button\", \"action\": \"FV_qset(java,source,'540')\"}, {\"name\": \"🎚 画质：720P（较慢）\", \"type\": \"button\", \"action\": \"FV_qset(java,source,'720')\"}, {\"name\": \"🔍 检查站点连通\", \"type\": \"button\", \"action\": \"FV_check(java)\"}, {\"name\": \"🧹 清空视频缓存\", \"type\": \"button\", \"action\": \"FV_clearc(java,source)\"}]", "loginUrl": "\nfunction FV_qset(JV,SV,q){\n  try{ SV.put('hgq',String(q)); }catch(e){ try{ JV.put('hgq',String(q)); }catch(e2){} }\n  try{ JV.toast('画质已切换：'+q+'P'); }catch(e3){}\n  try{ JV.longToast('🎚 画质已切换：'+q+'P\\n（下一集生效）'); }catch(e4){}\n  return 'ok';\n}\nfunction FV_clearc(JV,SV){\n  var n=0;\n  try{\n    var kl=String(SV.get('fv_keys')||'');\n    var ka=kl?kl.split(','):[];\n    for(var i=0;i<ka.length;i++){\n      var p=String(SV.get(ka[i])||'');\n      if(p){ try{ JV.deleteFile(p); n++; }catch(e1){} }\n      SV.put(ka[i],'');\n    }\n    SV.put('fv_keys','');\n  }catch(e2){}\n  try{ JV.longToast('🧹 已清空 '+n+' 个视频缓存文件'); }catch(e3){}\n  return 'ok';\n}\nfunction FV_check(JV){\n  var out=[];\n  try{\n    var t0=new Date().getTime();\n    var r=HG_API(JV,'/novel/player/multi_video_detail/v1/',{biz_param:{detail_page_version:0,disable_digg_stat:false,disable_video_relate_book:false,need_all_video_definition:false,need_mp4_align:false,screen_width_px:'900',source:7,use_os_player:false,use_server_dns:false},series_id:'7503745441910017049'});\n    var t1=new Date().getTime();\n    var j=null; try{ j=JSON.parse(String(r)); }catch(e){}\n    if(j&&j.code===0){ out.push('✅ 接口签名有效 ('+(t1-t0)+'ms)'); }\n    else if(j){ out.push('⚠️ 接口返回异常 code='+j.code); }\n    else { out.push('⚠️ 接口响应无法解析'); }\n  }catch(e){ out.push('❌ 接口不可达：'+String(e).substring(0,60)); }\n  try{\n    var q='';\n    try{ q=String(source.get('hgq')||''); }catch(e2){}\n    out.push('🎚 当前画质：'+(q||'360')+'P（默认 360P）');\n  }catch(e3){}\n  out.push('本剧集无需登录，游客即可观看全集');\n  return out.join(String.fromCharCode(10));\n}\nfunction login(){ return 'ok'; }\n", "respondTime": 24824, "ruleBookInfo": {"author": "$.author", "coverUrl": "$.coverUrl", "init": "@js:(function(){var sid=HG_SID(String(baseUrl));if(!sid)throw new Error('无效剧集ID');var d=FV_detail(java,sid);if(!d)throw new Error('获取剧集详情失败，请检查网络或稍后重试');var out={name:d.name,author:d.author,kind:d.kind,intro:d.intro,coverUrl:d.coverUrl,tocUrl:'https://api5-normal-sinfonlineb.fqnovel.com/detail?series_id='+sid};return JSON.stringify(out);})()", "intro": "$.intro", "kind": "$.kind", "name": "$.name", "tocUrl": "$.tocUrl"}, "ruleContent": {"content": "@js:\n(function(){\ntry{\nvar FVCD='';\ntry{ java.readFile('/'); }catch(e0){\n  var mm=String(e0).match(/([/]storage[/]emulated[/]0[/]Android[/]data[/][^/]+[/]cache)/);\n  if(mm) FVCD=mm[1];\n  if(!FVCD){\n    var m2=String(e0).match(/([/]data[/]data[/][^/]+[/]cache)/);\n    if(m2) FVCD=m2[1];\n  }\n}\nif(!FVCD) FVCD='/storage/emulated/0/Android/data/com.legado.app.release/cache';\n\nvar vid=HG_VID(String(baseUrl));\nif(!vid)throw new Error('章节参数缺失');\nvar d=FV_playData(java,vid);\nif(!d)throw new Error('获取播放地址失败：该集可能已下架或接口异常');\nif(d.bv2c)throw new Error('该清晰度使用了字节私有编码，安卓解码器不支持。请在书源菜单→登录 调整画质');\nvar defName=d.def;\nvar cacheKey='fv_'+vid+'_'+defName.replace('p','');\nvar cachedPath='';\ntry{ cachedPath=String(source.get(cacheKey)||''); }catch(e0){}\nif(cachedPath){\n  try{\n    var cb=java.readFile(cachedPath);\n    if(cb&&cb.length>100000){ cb=null; try{Packages.java.lang.System.gc();}catch(e01){} java.toast('使用本地缓存，秒播'); return 'file://'+FVCD+cachedPath; }\n    cb=null;\n  }catch(e02){}\n}\njava.toast('正在解密视频（'+defName+'）…');\nvar keyHex=RG_cencKey(java,d.spadeA);\nvar hexStr=String(java.ajax(d.url+',{'+String.fromCharCode(34)+'type'+String.fromCharCode(34)+':'+String.fromCharCode(34)+'hex'+String.fromCharCode(34)+','+String.fromCharCode(34)+'retry'+String.fromCharCode(34)+':2,'+String.fromCharCode(34)+'headers'+String.fromCharCode(34)+':{'+String.fromCharCode(34)+'User-Agent'+String.fromCharCode(34)+':'+String.fromCharCode(34)+'com.phoenix.read/72932'+String.fromCharCode(34)+'}}'));\nif(hexStr.length<1000)throw new Error('视频下载失败（响应过短）');\nvar bytes=RG_decodeHex(hexStr);\nhexStr=null;\ntry{ Packages.java.lang.System.gc(); }catch(g0){}\nvar r=RG_decrypt(bytes,keyHex);\nif(r.samples<100)throw new Error('解密异常：样本数 '+r.samples);\nif(r.bv2c)throw new Error('该清晰度使用了字节私有编码，安卓解码器不支持');\nvar outHex=RG_encodeHex(bytes);\nbytes=null;\ntry{ Packages.java.lang.System.gc(); }catch(g1){}\nvar path=String(java.downloadFile(outHex,'https://x/'+cacheKey+'.mp4,{'+String.fromCharCode(34)+'type'+String.fromCharCode(34)+':'+String.fromCharCode(34)+'mp4'+String.fromCharCode(34)+'}'));\noutHex=null;\ntry{ Packages.java.lang.System.gc(); }catch(g2){}\ntry{\n  source.put(cacheKey,path);\n  var kl=String(source.get('fv_keys')||'');\n  var ka=kl?kl.split(','):[];\n  if(ka.indexOf(cacheKey)<0)ka.push(cacheKey);\n  source.put('fv_keys',ka.join(','));\n}catch(e9){}\nFV_trimCache(java,source);\nreturn 'file://'+FVCD+path;\n}catch(e){ return 'DIAG_ERR: '+String(e.message||e); }\n})()"}, "ruleExplore": {"author": "$.author", "bookList": "@js:(function(){var k=FV_epk(String(baseUrl));var pg=FV_epp(String(baseUrl));if(!k)throw new Error('发现参数缺失');return FV_explore(java,source,k,pg);})()", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "name": "$.name"}, "ruleSearch": {"author": "$.author", "bookList": "@js:(function(){var kw=HG_SW(String(baseUrl));if(!kw)throw new Error('缺少搜索关键词');var l=FV_search(java,kw);if(!l.length)throw new Error('未搜索到短剧/漫剧：'+kw);return l;})()", "bookUrl": "$.bookUrl", "checkKeyWord": "都市", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "name": "$.name"}, "ruleToc": {"chapterList": "@js:(function(){var sid=HG_SID(String(baseUrl));if(!sid)throw new Error('无效剧集ID');var d=FV_detail(java,sid);if(!d)throw new Error('获取剧集失败：接口未返回数据，请检查网络或稍后重试');var out=[];var vl=d.videoList||[];for(var i=0;i<vl.length;i++){var v=vl[i]||{};var vid=String(v.vid||'');if(!vid)continue;var idx=parseInt(v.vid_index||'0',10)||(i+1);out.push(JSON.stringify({name:'第'+idx+'集',url:'https://api5-normal-sinfonlineb.fqnovel.com/play?vid='+vid+'&series_id='+sid+'&idx='+idx}));}if(!out.length)throw new Error('该剧暂无可用剧集');return out;})()", "chapterName": "$.name", "chapterUrl": "$.url"}, "searchUrl": "https://api5-normal-sinfonlineb.fqnovel.com/search?suggest={{java.encodeURI(key)}}", "weight": 0},{"bookSourceComment": "基于开源 APP 接口（x-argus/x-ladon 签名 + CM DH 通道解密）", "bookSourceGroup": "番茄,AI", "bookSourceName": "🍅番茄小说(APP)", "bookSourceType": 0, "bookSourceUrl": "https://fanqienovel.com", "bookUrlPattern": "https?://fanqienovel[.]com/page/[0-9]+", "concurrentRate": "1/1000", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "📊 排行榜::\n🔥 推荐榜::https://fanqienovel.com?t=rank&cat=0&algo=101\n🏆 完本榜::https://fanqienovel.com?t=rank&cat=0&algo=100\n👑 巅峰榜::https://fanqienovel.com?t=rank&cat=0&algo=200\n💬 口碑榜::https://fanqienovel.com?t=rank&cat=0&algo=104\n📚 分类榜::\n🌀 穿越::https://fanqienovel.com?t=rank&cat=37&algo=101\n🎯 系统::https://fanqienovel.com?t=rank&cat=19&algo=101\n🏙 都市::https://fanqienovel.com?t=rank&cat=1&algo=101\n💕 现代言情::https://fanqienovel.com?t=rank&cat=3&algo=101\n⚔️ 玄幻::https://fanqienovel.com?t=rank&cat=7&algo=101\n🏮 古代言情::https://fanqienovel.com?t=rank&cat=5&algo=101\n♻️ 重生::https://fanqienovel.com?t=rank&cat=36&algo=101\n🏛 架空::https://fanqienovel.com?t=rank&cat=452&algo=101\n🌏 东方玄幻::https://fanqienovel.com?t=rank&cat=511&algo=101\n👊 打脸::https://fanqienovel.com?t=rank&cat=522&algo=101\n🧚 奇幻仙侠::https://fanqienovel.com?t=rank&cat=259&algo=101\n🌆 都市脑洞::https://fanqienovel.com?t=rank&cat=262&algo=101\n🚀 科幻末世::https://fanqienovel.com?t=rank&cat=8&algo=101\n🧠 玄幻脑洞::https://fanqienovel.com?t=rank&cat=257&algo=101\n🎭 衍生::https://fanqienovel.com?t=rank&cat=1079&algo=101\n📖 频道::\n✨ 推荐::https://fanqienovel.com?t=tab&tt=2\n📜 经典::https://fanqienovel.com?t=tab&tt=11\n🎓 知识::https://fanqienovel.com?t=tab&tt=12\n📄 短篇::https://fanqienovel.com?t=tab&tt=103\n🏠 首页::\n🎁 首页精选::https://fanqienovel.com", "jsLib": "var FQ_H=String.fromCharCode(35,35);var FQ_SH=String.fromCharCode(35);var FQ_SL=String.fromCharCode(47);var FQ_Q=String.fromCharCode(39);var FQ_DQ=String.fromCharCode(34);var FQ_SP=String.fromCharCode(32);var FQ_MUA='Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Mobile Safari/537.36';var FQ_FUA='com.ss.android.article.news/13400 (Linux; U; Android 10; zh_CN; tb8788p1_64_bsp; Build/QQ3A.200805.001)';var FQ_FIXED='TdTC5rgxYgkOUrPHpnM7pByyRiuCmrWKGWs521cXdST0m69/COjWjSanLjfBqVovHwWlGJKu8pSXMrYqOKrdWA==';var FQ_HOST='https://api5-normal-sinfonlineb.fqnovel.com';var FQ_WEB='https://fanqienovel.com';var FQ_MSG_DETAIL=String.fromCharCode(35814,24773,33719,21462,22833,36133,65292,35831,37325,35797);var FQ_MSG_TOC=String.fromCharCode(30446,24405,33719,21462,22833,36133,65292,35831,37325,35797);var FQ_MSG_CT=String.fromCharCode(27491,25991,33719,21462,22833,36133,65292,35831,37325,35797);var FQ_MSG_LOCK=String.fromCharCode(128274);var FQ_MSG_EMPTY=String.fromCharCode(26412,31456,26242,26080,20869,23481,65292,35831,25442,28304);var FQ_IMG=String.fromCharCode(123,123,105,109,97,103,101,95,100,111,109,97,105,110,125,125);var FQ_MSG_PAY=String.fromCharCode(26412,31456,20026,20184,36153,31456,33410,65292,32593,39029,29256,26080,27861,20813,36153,38405,35835);function FQ_j2s(b){try{return String(new Packages.java.lang.String(b,Packages.java.nio.charset.Charset.forName('ISO-8859-1')));}catch(e){var s='';for(var i=0;i<b.length;i++){var v=b[i];if(v<0)v+=256;s+=String.fromCharCode(v);}return s;}}function FQ_s2j(s){return new Packages.java.lang.String(s).getBytes(Packages.java.nio.charset.Charset.forName('ISO-8859-1'));}function FQ_hex(b){var str=FQ_j2s(b);var s='';for(var i=0;i<str.length;i++){var v=str.charCodeAt(i)&255;s+=(v<16?'0':'')+v.toString(16);}return s;}function FQ_unhex(h){var r='';for(var i=0;i<h.length;i+=2)r+=String.fromCharCode(parseInt(h.substr(i,2),16));return r;}function FQ_sm3(s){var rotl=function(x,n){n=n&31;return ((x<<n)|(x>>>(32-n)))>>>0;};var len=s.length,bitLen=len*8,arr=[];for(var i=0;i<len;i++)arr.push(s.charCodeAt(i)&255);arr.push(0x80);while(arr.length%64!==56)arr.push(0);var hi=Math.floor(bitLen/4294967296),lo=bitLen>>>0;arr.push((hi>>>24)&255,(hi>>>16)&255,(hi>>>8)&255,hi&255);arr.push((lo>>>24)&255,(lo>>>16)&255,(lo>>>8)&255,lo&255);var V=[0x7380166f,0x4914b2b9,0x172442d7,0xda8a0600,0xa96f30bc,0x163138aa,0xe38dee4d,0xb0fb0e4e];for(var b=0;b<arr.length;b+=64){var W=[];for(var i=0;i<16;i++)W.push(((arr[b+i*4]<<24)|(arr[b+i*4+1]<<16)|(arr[b+i*4+2]<<8)|arr[b+i*4+3])>>>0);for(var j=16;j<68;j++){var x=(W[j-16]^W[j-9]^rotl(W[j-3],15))>>>0;x=(x^rotl(x,15)^rotl(x,23))>>>0;W.push((x^rotl(W[j-13],7)^W[j-6])>>>0);}var W1=[];for(var j=0;j<64;j++)W1.push((W[j]^W[j+4])>>>0);var A=V[0],B=V[1],C=V[2],D=V[3],E=V[4],F=V[5],G=V[6],H=V[7];for(var j=0;j<64;j++){var Tj=(j<16)?0x79cc4519:0x7a879d8a;var SS1=rotl((rotl(A,12)+E+rotl(Tj,j&31))>>>0,7);var SS2=(SS1^rotl(A,12))>>>0;var FFj=(j<16)?((A^B^C)>>>0):(((A&B)|(A&C)|(B&C))>>>0);var GGj=(j<16)?((E^F^G)>>>0):(((E&F)|((~E)&G))>>>0);var TT1=(FFj+D+SS2+W1[j])>>>0;var TT2=(GGj+H+SS1+W[j])>>>0;D=C;C=rotl(B,9);B=A;A=TT1;H=G;G=rotl(F,19);F=E;E=(TT2^rotl(TT2,9)^rotl(TT2,17))>>>0;}V[0]=(V[0]^A)>>>0;V[1]=(V[1]^B)>>>0;V[2]=(V[2]^C)>>>0;V[3]=(V[3]^D)>>>0;V[4]=(V[4]^E)>>>0;V[5]=(V[5]^F)>>>0;V[6]=(V[6]^G)>>>0;V[7]=(V[7]^H)>>>0;}var out='';for(var i=0;i<8;i++)out+=('0000000'+V[i].toString(16)).slice(-8);return out;}function FQ_md5(s){var d=Packages.java.security.MessageDigest.getInstance('MD5');var b=FQ_s2j(s);d.update(b);return FQ_hex(d.digest());}function FQ_b64(s){return String(Packages.java.util.Base64.getEncoder().encodeToString(FQ_s2j(s)));}function FQ_b64d(s){return FQ_j2s(Packages.java.util.Base64.getDecoder().decode(String(s)));}function FQ_aesCbc(data,key,iv){var C=Packages.javax.crypto.Cipher;var c=C.getInstance('AES/CBC/NoPadding');c.init(C.ENCRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(FQ_s2j(key),'AES'),new Packages.javax.crypto.spec.IvParameterSpec(FQ_s2j(iv)));return FQ_j2s(c.doFinal(FQ_s2j(data)));}function FQ_pad(s){var p=16-(s.length%16);if(p===0)p=16;var o=s;for(var i=0;i<p;i++)o+=String.fromCharCode(p);return o;}function FQ_w(lo,hi){return {lo:lo>>>0,hi:hi>>>0};}function FQ_xor(){var lo=0,hi=0;for(var i=0;i<arguments.length;i++){lo^=arguments[i].lo;hi^=arguments[i].hi;}return FQ_w(lo,hi);}function FQ_n64(v){return FQ_w(~v.lo,~v.hi);}function FQ_add(a,b){var lo=(a.lo+b.lo)>>>0;return FQ_w(lo,(a.hi+b.hi+(lo<a.lo?1:0))>>>0);}function FQ_rol(v,c){var s=((c%64)+64)%64;if(s===0)return FQ_w(v.lo,v.hi);if(s<32)return FQ_w((v.lo<<s)|(v.hi>>>(32-s)),(v.hi<<s)|(v.lo>>>(32-s)));if(s===32)return FQ_w(v.hi,v.lo);var r=s-32;return FQ_w((v.hi<<r)|(v.lo>>>(32-r)),(v.lo<<r)|(v.hi>>>(32-r)));}function FQ_ror(v,c){return FQ_rol(v,64-(c%64));}function FQ_r64(s,o){o=o||0;return FQ_w((s.charCodeAt(o)|(s.charCodeAt(o+1)<<8)|(s.charCodeAt(o+2)<<16)|(s.charCodeAt(o+3)<<24))>>>0,(s.charCodeAt(o+4)|(s.charCodeAt(o+5)<<8)|(s.charCodeAt(o+6)<<16)|(s.charCodeAt(o+7)<<24))>>>0);}function FQ_w64le2(l,r){var o='';for(var i=0;i<4;i++)o+=String.fromCharCode((l.lo>>>(i*8))&255);for(var i2=0;i2<4;i2++)o+=String.fromCharCode((l.hi>>>(i2*8))&255);for(var i3=0;i3<4;i3++)o+=String.fromCharCode((r.lo>>>(i3*8))&255);for(var i4=0;i4<4;i4++)o+=String.fromCharCode((r.hi>>>(i4*8))&255);return o;}var FQ_SZ=FQ_w(0x046d678b,0x3dc94c3a);function FQ_zbit(i){return FQ_w(i<32?((FQ_SZ.lo>>>i)&1):((FQ_SZ.hi>>>(i-32))&1),0);}var FQ_SK='fc78e0a9657a0c748ce51559903ccf03510e51d3cff232d71343e88a321c5304';var FQ_AK='d31e3718288a1027baab59f146a09a9c';var FQ_AIV='ea180a0336ed352fcd24e4d50018ae54';function FQ_srk(key){var w=[];for(var i=0;i<4;i++)w.push(FQ_r64(key,i*8));for(var x=4;x<72;x++){var m=FQ_xor(FQ_ror(w[x-1],3),w[x-3]);m=FQ_xor(m,FQ_ror(m,1));w.push(FQ_xor(FQ_n64(w[x-4]),m,FQ_zbit((x-4)%62),FQ_w(3,0)));}return w;}function FQ_sEnc(blk,keys){var l=FQ_r64(blk,0),r=FQ_r64(blk,8);for(var i=0;i<keys.length;i++){var o=r;var nl=FQ_w(FQ_rol(r,1).lo&FQ_rol(r,8).lo,FQ_rol(r,1).hi&FQ_rol(r,8).hi);r=FQ_xor(l,nl,FQ_rol(r,2),keys[i]);l=o;}return FQ_w64le2(l,r);}function FQ_ev(v){var o='';while(v>=0x80){o+=String.fromCharCode((v%0x80)|0x80);v=Math.floor(v/0x80);}o+=String.fromCharCode(v);return o;}function FQ_pbv(f,v){return FQ_ev(f*8)+FQ_ev(v);}function FQ_pbb(f,v){var e=(typeof v==='number')?String.fromCharCode(v):String(v);return FQ_ev(f*8+2)+FQ_ev(e.length)+e;}function FQ_argusBean(q,stub,ts,dev,iid,aid,rv){var bi=(/^[0-9a-f]{32}$/i.test(stub))?FQ_unhex(stub):FQ_unhex('00000000000000000000000000000000');var bh=FQ_unhex(FQ_sm3(bi).substr(0,12));var qh=(q==='')?FQ_unhex(FQ_sm3(FQ_unhex('00000000000000000000000000000000')).substr(0,12)):FQ_unhex(FQ_sm3(q).substr(0,12));var nest=FQ_pbv(1,1)+FQ_pbv(2,1)+FQ_pbv(3,1)+FQ_pbv(7,0xC792ECCC);var s23=FQ_pbb(1,'NX551J')+FQ_pbv(2,8196)+FQ_pbv(4,0x80E0D800);return FQ_pbv(1,1077940818)+FQ_pbv(2,2)+FQ_pbv(3,rv)+FQ_pbb(4,String(aid))+FQ_pbb(5,dev)+FQ_pbb(6,'1611921764')+FQ_pbb(7,FQ_qp(q,'version_name'))+FQ_pbb(8,'v04.04.05-ov-android')+FQ_pbv(9,134744640)+FQ_pbb(10,FQ_unhex('0000000000000000'))+FQ_pbv(11,0)+FQ_pbv(12,ts*2)+FQ_pbb(13,bh)+FQ_pbb(14,qh)+FQ_pbb(15,nest)+FQ_pbb(16,iid)+FQ_pbb(20,'none')+FQ_pbv(21,738)+FQ_pbb(23,s23)+FQ_pbv(25,2);}function FQ_argus(q,stub,ts,dev,iid,aid,rv){var pb=FQ_pad(FQ_argusBean(q,stub,ts,dev,iid,aid,rv));var keys=FQ_srk(FQ_unhex(FQ_SK));var enc='';for(var o=0;o<pb.length;o+=16)enc+=FQ_sEnc(pb.substr(o,16),keys);var magic=FQ_unhex('f2f7fcfff2f7fcff');var un=magic+enc+FQ_unhex('eafb2cfe8568519154');var buf=un.substr(0,8);for(var i=8;i<un.length;i++)buf+=String.fromCharCode((un.charCodeAt(i)^magic.charCodeAt(i%8))&255);var rev='';for(var j=buf.length-1;j>=0;j--)rev+=buf.charAt(j);var fin=FQ_pad(rev+'ao');var ct=FQ_aesCbc(fin,FQ_unhex(FQ_AK),FQ_unhex(FQ_AIV));return FQ_b64(FQ_unhex('f281')+ct);}function FQ_lrk(rp,aid){var dg=FQ_md5(rp+String(aid));var w=[];for(var i=0;i<34;i++)w.push(FQ_w(0,0));w[0]=FQ_r64(dg,0);w[1]=FQ_r64(dg,8);w[2]=FQ_r64(dg,16);w[3]=FQ_r64(dg,24);var b0=w[0],b8=w[1],q=[w[2],w[3]];for(var x=0;x<0x22;x++){var x9=b0;var x8=b8;x8=FQ_ror(x8,8);x8=FQ_add(x8,x9);x8=FQ_xor(x8,FQ_w(x,0));q.push(x8);x8=FQ_xor(x8,FQ_rol(x9,3));w[x+1]=x8;b0=x8;b8=q.shift();}return w;}function FQ_lEnc(blk,keys){var l=FQ_r64(blk,0),r=FQ_r64(blk,8);for(var i=0;i<34;i++){r=FQ_xor(keys[i],FQ_add(l,FQ_ror(r,8)));l=FQ_xor(r,FQ_ror(l,61));}return FQ_w64le2(l,r);}function FQ_ladon(ts,lic,aid,rp){var data=String(ts)+'-'+lic+'-'+aid;var pad2=16-(data.length%16);var pd=data;for(var i=0;i<pad2;i++)pd+=String.fromCharCode(pad2);var ks=FQ_lrk(rp,aid);var ct='';for(var o=0;o<pd.length;o+=16)ct+=FQ_lEnc(pd.substr(o,16),ks);return FQ_b64(rp+ct);}function FQ_sign(q,stub,ts,dev,iid,aid,rv){var h={'x-ss-req-ticket':String(ts*1000),'x-khronos':String(ts),'x-argus':FQ_argus(q,stub,ts,dev,iid,aid,rv),'x-ladon':FQ_ladon(ts,1611921764,aid,String.fromCharCode(1,2,3,4))};if(stub)h['x-ss-stub']=stub;return h;}function FQ_qp(q,k){var ps=String(q||'').split('&');for(var i=0;i<ps.length;i++){var e=ps[i].indexOf('=');if(e>0&&ps[i].substring(0,e)===k)return ps[i].substring(e+1);}return '';}function FQ_qs(url){var t=String(url||'');var i=t.indexOf('?');if(i<0)return '';var j=t.indexOf('#',i);return t.slice(i+1,j<0?t.length:j);}function FQ_qp(url,n){var e=String(n);var ps=FQ_qs(url).split('&');for(var i=0;i<ps.length;i++){if(!ps[i])continue;var s=ps[i].indexOf('=');var k=s<0?ps[i]:ps[i].substr(0,s);if(k===e)return s<0?'':ps[i].substr(s+1);}return '';}function FQ_now(){return Math.floor(new Date().getTime()/1000);}function FQ_ua(){return 'com.dragon.read/66732 (Linux; U; Android 10; zh_CN; Pixel 4 XL; Build/QD1A.190821.007;tt-ok/3.12.13.4-tiktok)';}function FQ_hpost(url,bodyStr,headers){var arr=FQ_s2j(bodyStr);var c=new Packages.java.net.URL(url).openConnection();c.setRequestMethod('POST');c.setDoOutput(true);for(var k in headers)c.setRequestProperty(k,headers[k]);c.setConnectTimeout(20000);c.setReadTimeout(25000);var out=c.getOutputStream();out.write(arr,0,arr.length);out.flush();out.close();var code=c.getResponseCode();var is=(code>=400)?c.getErrorStream():c.getInputStream();var sb='';if(is){var enc=String(c.getHeaderField('Content-Encoding')||'');var stream=is;if(enc.indexOf('gzip')>=0)stream=new Packages.java.util.zip.GZIPInputStream(is);var rd=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(stream,'UTF-8'));var line;while((line=rd.readLine())!=null)sb+=String(line);rd.close();}return {code:code,body:sb};}function FQ_gz(s){var bos=new Packages.java.io.ByteArrayOutputStream();var g=new Packages.java.util.zip.GZIPOutputStream(bos);var b=new Packages.java.lang.String(s).getBytes(Packages.java.nio.charset.Charset.forName('UTF-8'));g.write(b,0,b.length);g.close();var arr=bos.toByteArray();var out='';for(var i=0;i<arr.length;i++){var v=arr[i]&255;if(i===8)v=2;if(i===9)v=3;out+=String.fromCharCode(v);}return out;}function FQ_ttEnc(data){var rnd='';for(var i=0;i<32;i++)rnd+=String.fromCharCode(Math.floor(Math.random()*256));var md=Packages.java.security.MessageDigest.getInstance('SHA-512');md.update(FQ_s2j(rnd));var inner=md.digest();var md2=Packages.java.security.MessageDigest.getInstance('SHA-512');md2.update(inner);md2.update(FQ_s2j(FQ_b64d(FQ_FIXED)));var hv=md2.digest();var keyB=Packages.java.util.Arrays.copyOfRange(hv,0,16);var ivB=Packages.java.util.Arrays.copyOfRange(hv,16,32);var md3=Packages.java.security.MessageDigest.getInstance('SHA-512');md3.update(FQ_s2j(data));var dh=md3.digest();var C=Packages.javax.crypto.Cipher;var c=C.getInstance('AES/CBC/NoPadding');c.init(C.ENCRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(keyB,'AES'),new Packages.javax.crypto.spec.IvParameterSpec(ivB));return String.fromCharCode(0x74,0x63,0x05,0x10,0,0)+rnd+FQ_j2s(c.doFinal(FQ_s2j(FQ_pad(FQ_j2s(dh)+data))));}function FQ_alnum(n){var ch='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';var s='';for(var i=0;i<n;i++)s+=ch.charAt(Math.floor(Math.random()*ch.length));return s;}function FQ_uuid(){return String(Packages.java.util.UUID.randomUUID());}function FQ_getPool(sv){var p=String(sv.get('fqPool')||'');if(!p){return [];}var out=[];var arr=p.split('|');for(var i=0;i<arr.length;i++){var kv=arr[i].split(',');if(kv.length>=2&&kv[0])out.push({d:kv[0],i:kv[1],o:kv[2]||'',c:kv[3]||''});}return out;}function FQ_savePool(sv,pool){var a=[];for(var i=0;i<pool.length;i++)a.push(pool[i].d+','+pool[i].i+','+(pool[i].o||'')+','+(pool[i].c||''));sv.put('fqPool',a.join('|'));}function FQ_registerOne(){var openudid=FQ_alnum(16),cdid=FQ_uuid(),clientudid=FQ_uuid();var ua='com.dragon.read/65132 (Linux; U; Android 10; zh_CN; MI 12; Build/MMB29M; Cronet/TTNetVersion:9ac8d95c 2024-11-25 QuicVersion:3f326df4 2024-11-14)';var header={display_name:'番茄小说',update_version_code:'65132',manifest_version_code:'65132',aid:1967,channel:'xiaomi_1967_64',package:'com.dragon.read',app_version:'6.5.1.32',version_code:'65132',sdk_version:'v04.04.05-ov-android',sdk_target_version:29,os:'Android',os_version:'10',os_api:'29',device_model:'MI 12',device_brand:'Xiaomi',device_manufacturer:'Google',device_category:'phone',cpu_abi:'arm64-v8a',release_build:FQ_uuid(),density_dpi:'560',display_density:'mdpi',resolution:'1440x2392',language:'zh',mac:'11:22:33:44:55:66',timezone:8,access:'wifi',not_request_sender:0,carrier:'CHINA MOBILE',mcc_mnc:'46007',rom:'EMUI-'+FQ_alnum(13),rom_version:FQ_alnum(2),sig_hash:FQ_md5(FQ_uuid()),openudid:openudid,clientudid:clientudid,sim_serial_number:[],region:'CN',tz_name:'Asia/Shanghai',tz_offset:28800,sim_region:'cn'};var js=JSON.stringify({magic_tag:'ss_app_log',header:header,_gen_time:new Date().getTime()});var post=FQ_ttEnc(FQ_gz(js));var ts=FQ_now();var P=[['tt_data','a'],['os_api','29'],['device_type','MI 12'],['ssmix','a'],['manifest_version_code','65132'],['dpi','560'],['version_name','6.5.1.32'],['ts',String(ts)],['cpu_support64','true'],['app_type','normal'],['appTheme','light'],['ac','wifi'],['host_abi','arm64-v8a'],['update_version_code','65132'],['channel','xiaomi_1967_64'],['_rticket',String(new Date().getTime())],['device_platform','android'],['version_code','65132'],['cdid',cdid],['os','android'],['is_android_pad','0'],['openudid',openudid],['package','com.dragon.read'],['resolution','1440*2392'],['os_version','10'],['language','zh'],['device_brand','Xiaomi'],['need_personal_recommend','1'],['aid','1967'],['minor_status','0'],['app_name','novel'],['mcc_mnc','46007']];P.sort(function(a,b){return a[0]<b[0]?-1:(a[0]>b[0]?1:0);});var qs='';for(var i=0;i<P.length;i++){if(i)qs+='&';qs+=P[i][0]+'='+encodeURIComponent(P[i][1]);}var r=FQ_hpost('https://log.snssdk.com/service/2/device_register/?'+qs,post,{'Content-Type':'application/octet-stream;tt-data=a','accept-encoding':'gzip','user-agent':ua,'connection':'Keep-Alive'});var Q=String.fromCharCode(34);var m=r.body.match(new RegExp(Q+'device_id_str'+Q+':'+Q+'([0-9]+)'+Q));if(!m)return null;var m2=r.body.match(new RegExp(Q+'install_id_str'+Q+':'+Q+'([0-9]+)'+Q));return {d:m[1],i:m2?m2[1]:'',o:openudid,c:cdid};}function FQ_ensure(sv,n){var pool=FQ_getPool(sv);var need=(n||3)-pool.length;var added=0;for(var i=0;i<need;i++){  var d=FQ_registerOne();  if(d){pool.push(d);added++;FQ_savePool(sv,pool);}}return pool;}function FQ_api(jv,sv,path,q,host,aid){var pool=FQ_ensure(sv,2);if(!pool.length)throw new Error('设备池为空，请检查网络后重试');var dev=pool[0].d,iid=pool[0].i;var qq=q+'&iid='+iid+'&device_id='+dev;var url=(host||FQ_HOST)+path+'?'+qq;var ts=FQ_now();var h=FQ_sign(FQ_qs(url),'',ts,dev,iid,aid||1967,Math.floor(Math.random()*2000000000));h['User-Agent']=FQ_ua();return String(jv.ajax(url+','+JSON.stringify({headers:h})));}function FQ_web(jv,url,ua){var h={'User-Agent':ua||FQ_MUA};return String(jv.ajax(url+','+JSON.stringify({headers:h})));}var QC=String.fromCharCode(34);function FQ_state(txt){var t=String(txt||'');var i=t.indexOf('window.__INITIAL_STATE__=');if(i<0)return null;var st0=t.indexOf('{',i);if(st0<0)return null;var seg=t.substring(st0);var depth=0,end=-1,instr=false,esc=false;for(var k=0;k<seg.length;k++){var ch=seg.charAt(k);if(instr){if(esc)esc=false;else if(ch===String.fromCharCode(92))esc=true;else if(ch===QC)instr=false;continue;}if(ch===QC)instr=true;else if(ch==='{')depth++;else if(ch==='}'){depth--;if(depth===0){end=k+1;break;}}}if(end<0)return null;try{return JSON.parse(seg.substring(0,end));}catch(e){return null;}}function FQ_tag(s){var t=String(s||'');return t.split('<em>').join('').split('</em>').join('').split('<').join('&lt;');}function FQ_search(jv,sv,kw,page){var off=((page||1)-1)*10;var suf='&enterfrom_aid=&enter_from=inner_search&app_name=news_article&version_name=7.0.8&app_version=7.0.8&channel=tt_huawei2019_yz&version_code=708&device_platform=android&parent_enterfrom=novel_list&novel_host=&aid=13&scm_version=1.0.0.4112&device_type=25053RT47C&device_brand=Redmi&language=zh&os_api=35&os_version=15&openudid=fqapp&update_version_code=70899&plugin=0&tma_jssdk_version=1.10.0.0&rom_version=miui__os2.0.209.0.volcnxm';var url='https://api.fanqiesdk.com/api/novel/channel/homepage/search/search/v1/?q='+encodeURIComponent(kw)+'&offset='+off+suf;var raw=FQ_web(jv,url,FQ_FUA);var out=[];try{var d=JSON.parse(raw);var rd=(d.data&&d.data.ret_data)||[];for(var i=0;i<rd.length;i++){var it=rd[i];out.push({name:FQ_tag(it.title),author:FQ_tag(it.author||''),kind:FQ_tag(it.category||''),intro:FQ_tag(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+it.book_id+FQ_SH+it.book_id,bookId:String(it.book_id)});}}catch(e){}return out;}function FQ_homeList(jv,sv){var raw=FQ_web(jv,'https://fanqienovel.com/','Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36');var d=FQ_state(raw);var out=[];if(!d)return out;var hm=d.home||{};var groups=['weekList','editorList','updateList','newbookList','boyList','girlList','readRankList','newRankList','fantasyList','topRankList'];var seen={};for(var g=0;g<groups.length;g++){var arr=hm[groups[g]]||[];for(var i=0;i<arr.length;i++){var it=arr[i];var bid=String(it.bookId||'');if(!bid||seen[bid])continue;seen[bid]=1;out.push({name:String(it.bookName||''),author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumbUri||''),bookUrl:'https://fanqienovel.com/page/'+bid+FQ_SH+bid});}}return out;}function FQ_rankList(jv,sv,rankId){var raw=FQ_web(jv,FQ_WEB+FQ_SL.concat('api',FQ_SL,'rank',FQ_SL,'list?rank_id=')+(rankId||1)+'&offset=0&count=20');var out=[];try{var d=JSON.parse(raw);var l=(d.data&&d.data.list)||[];for(var i=0;i<l.length;i++){var it=l[i];var bid=String(it.bookId||'');out.push({name:String(it.bookName||''),author:String(it.author||''),kind:'排行榜',intro:String(it.abstract||''),coverUrl:String(it.thumbUri||''),bookUrl:'https://fanqienovel.com/page/'+bid+FQ_SH+bid,bookId:bid});}}catch(e){}return out;}function FQ_getDev(sv){var d=String(sv.get('fqdev')||'');var i=String(sv.get('fqiid')||'');return {d:d,i:i};}function FQ_regAndSave(sv){var r=FQ_regTest();var Q=String.fromCharCode(34);var m=r.match(new RegExp(Q+'device_id_str'+Q+':'+Q+'([0-9]+)'+Q));if(!m)return null;var m2=r.match(new RegExp(Q+'install_id_str'+Q+':'+Q+'([0-9]+)'+Q));var d=m[1],i=m2?m2[1]:'';sv.put('fqdev',d);sv.put('fqiid',i);return {d:d,i:i};}function FQ_bigBytes(n){var h=String(n.toString(16));if(h.length%2===1)h='0'+h;if(h.length>384)h=h.substring(h.length-384);return FQ_unhex(h);}function FQ_b64eJS(str){var CH='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';var out='';var i=0;var n=str.length;while(i<n){var c1=str.charCodeAt(i++)&255;var c2=(i<n)?str.charCodeAt(i++)&255:NaN;var c3=(i<n)?str.charCodeAt(i++)&255:NaN;var e1=c1>>2;var e2=((c1&3)<<4)|(isNaN(c2)?0:(c2>>4));var e3=isNaN(c2)?64:(((c2&15)<<2)|(isNaN(c3)?0:(c3>>6)));var e4=isNaN(c3)?64:(c3&63);out+=CH.charAt(e1)+CH.charAt(e2)+(e3===64?'=':CH.charAt(e3))+(e4===64?'=':CH.charAt(e4));}return out;}function FQ_b64dJS(str){var CH='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';var out='';var buf=0,bits=0;for(var i=0;i<str.length;i++){var c=str.charAt(i);if(c==='=')break;var v=CH.indexOf(c);if(v<0)continue;buf=(buf<<6)|v;bits+=6;if(bits>=8){bits-=8;out+=String.fromCharCode((buf>>bits)&255);}}return out;}function FQ_b64d2(s){try{return Packages.java.util.Base64.getDecoder().decode(String(s));}catch(e){return FQ_s2j(FQ_b64dJS(String(s)));}}function FQ_b64e2(b){try{return String(Packages.java.util.Base64.getEncoder().encodeToString(b));}catch(e){return FQ_b64eJS(FQ_j2s(b));}}function FQ_bytesHex(b){var str=FQ_j2s(b);var s='';for(var i=0;i<str.length;i++){var v=str.charCodeAt(i)&255;s+=(v<16?'0':'')+v.toString(16);}return s;}function FQ_cmGet(jv,bookId,itemIds,dev,iid){var CMP='ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff';var P=new Packages.java.math.BigInteger(CMP,16);var pk=new Packages.java.math.BigInteger(256,new Packages.java.security.SecureRandom());pk=pk.mod(P.subtract(Packages.java.math.BigInteger.ONE));var pub=Packages.java.math.BigInteger.valueOf(2).modPow(pk,P);var iv=new Packages.java.security.SecureRandom().generateSeed(16);var rk=FQ_b64d2('rCXGfd2POMGzeiNIgo4iLg==');var CC=Packages.javax.crypto.Cipher;var c1=CC.getInstance('AES/CBC/PKCS5Padding');c1.init(CC.ENCRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(rk,'AES'),new Packages.javax.crypto.spec.IvParameterSpec(iv));var ct1=c1.doFinal(FQ_s2j(FQ_bigBytes(pub)));var key=FQ_b64e2(FQ_s2j(FQ_j2s(iv)+FQ_j2s(ct1)));var body=JSON.stringify({book_id:bookId,item_ids:itemIds,key:key});var url='https://novelfm-hl.snssdk.com/novelfm/playerapi/full/mget/v1/?aid=3040&app_name=novelapp&channel=0&device_id='+dev+'&device_platform=android&device_type=UGFFI55&iid='+iid+'&os_version=0&version_code=58932&version_name=5.8.9.32';var ts=FQ_now();var stub=FQ_md5(body);var hh=FQ_sign(FQ_qs(url),stub,ts,dev,iid,3040,Math.floor(Math.random()*2000000000));hh['User-Agent']='com.dragon.read';hh['Content-Type']='application/json; charset=utf-8';var resp=FQ_hpost(url,body,hh);var dd=JSON.parse(resp.body);var infos=dd.data.item_infos;var out={};for(var iid2 in infos){var it=infos[iid2];if(!it||!it.key||!it.content){continue;}var srvHex=FQ_bytesHex(FQ_b64d2(String(it.key)));var srvN=new Packages.java.math.BigInteger(srvHex,16);var shared=srvN.modPow(pk,P);var shHex=String(shared.toString(16));if(shHex.length%2===1)shHex='0'+shHex;if(shHex.length>384)shHex=shHex.substring(shHex.length-384);var aesKey=Packages.java.util.Arrays.copyOfRange(FQ_s2j(FQ_unhex(shHex.substring(0,64))),0,32);var cb=FQ_b64d2(String(it.content));var civ=Packages.java.util.Arrays.copyOfRange(cb,0,16);var cct=Packages.java.util.Arrays.copyOfRange(cb,16,cb.length);var c2=CC.getInstance('AES/CBC/PKCS5Padding');c2.init(CC.DECRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(aesKey,'AES'),new Packages.javax.crypto.spec.IvParameterSpec(civ));var ptArr=c2.doFinal(cct);out[iid2]=String(new Packages.java.lang.String(ptArr,'UTF-8'));}return out;}function FQ_dev(sv){var d=String(sv.get('fqdev')||'');var i=String(sv.get('fqiid')||'');return {d:d,i:i};}function FQ_search(sv,kw,page){var off=String((parseInt(page||'1')-1)*10);var q='q='+encodeURIComponent(kw)+'&offset='+off+'&enterfrom_aid=&enter_from=inner_search&app_name=news_article&version_name=7.0.8&app_version=7.0.8&channel=tt_huawei2019_yz&version_code=708&device_platform=android&parent_enterfrom=novel_list&novel_host=&aid=13&scm_version=1.0.0.4112&device_type=25053RT47C&device_brand=Redmi&language=zh&os_api=35&os_version=15&openudid='+FQ_alnum(16)+'&update_version_code=70899&plugin=0&tma_jssdk_version=1.10.0.0&rom_version=miui__os2.0.209.0.volcnxm';var url='https://api.fanqiesdk.com/api/novel/channel/homepage/search/search/v1/?'+q;var r=String(java.ajax(url+',{\"headers\":{\"User-Agent\":\"com.ss.android.article.news/13400\"}}'));var d=JSON.parse(r);var items=(d.data&&d.data.ret_data)?d.data.ret_data:[];var out=[];for(var i=0;i<items.length;i++){var it=items[i];var t=String(it.title||'').split('<em>').join('').split('</em>').join('');out.push({name:t,author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+String(it.book_id)});}return out;}function FQ_toc(sv,bookId,dev){var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';var url='https://api5-normal-sinfonlineb.fqnovel.com/reading/bookapi/directory/all_items/v?book_type=0&item_data_list_md5=&catalog_data_md5=&book_id='+bookId+'&book_info_md5=&need_version=true&device_id='+dev+'&'+base;var ts=FQ_now();var h=FQ_sign(FQ_qs(url),'',ts,dev,'',1967,Math.floor(Math.random()*2000000000));h['User-Agent']='Mozilla/5.0 (Linux; Android 13)';var r=String(java.ajax(url+','+JSON.stringify({headers:h})));var d=JSON.parse(r);var cats=(d.data&&d.data.catalog_data)?d.data.catalog_data:[];var out=[];for(var i=0;i<cats.length;i++){var c=cats[i];out.push({name:String(c.catalog_title||('第'+(i+1)+'章')),url:String(c.item_id)});}return out;}function FQ_explore(jv,sv,kind,page){var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';var tt={'推荐':2,'经典':3,'知识':4,'听书':5,'看剧':6,'视频':7,'短篇':8,'漫画':9,'买书':10};var tabType=tt[kind]||2;var off=((parseInt(page||'1')-1)*16);var q='tab_type='+tabType+'&offset='+off+'&client_template=0&'+base;var raw=FQ_api(jv,sv,'/reading/bookapi/bookmall/tab/v',q);var d=JSON.parse(raw);var ti=d.data.tab_item||[];var out=[];for(var t=0;t<ti.length;t++){var cells=ti[t].cell_data||[];for(var c=0;c<cells.length;c++){var bd=cells[c].book_data||[];for(var b=0;b<bd.length;b++){var it=bd[b];var bid=String(it.book_id||'');if(!bid)continue;out.push({name:String(it.book_name||''),author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+bid+FQ_SH+bid});}}}return out;}function FQ_pickBooks(jv,sv,catId,algo,page){var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';var off=((parseInt(page||'1')-1)*16);var q='cell_id=7098235271900037133&offset='+off+'&client_template=2&client_req_type=2&tab_type=2&req_rank_category_id='+catId+'&req_rank_algo='+(algo||101)+'&'+base;var raw=FQ_api(jv,sv,'/reading/bookapi/bookmall/cell/change/v1/',q);var d=JSON.parse(raw);var cv=(d.data&&d.data.cell_view)||{};var bd=cv.book_data||[];var out=[];for(var i=0;i<bd.length;i++){var it=bd[i];var bid=String(it.book_id||'');if(!bid)continue;out.push({name:String(it.book_name||''),author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+bid+FQ_SH+bid});}return out;}function FQ_tabBooks(jv,sv,tabType,page){var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';var off=((parseInt(page||'1')-1)*16);var q='tab_type='+tabType+'&offset='+off+'&client_template=0&'+base;var raw=FQ_api(jv,sv,'/reading/bookapi/bookmall/tab/v',q);var d=JSON.parse(raw);var ti=d.data.tab_item||[];var out=[];var seen={};for(var t=0;t<ti.length;t++){var cells=ti[t].cell_data||[];for(var c=0;c<cells.length;c++){var bd=cells[c].book_data||[];for(var b=0;b<bd.length;b++){var it=bd[b];var bid=String(it.book_id||'');if(!bid||seen[bid])continue;seen[bid]=1;out.push({name:String(it.book_name||''),author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+bid+FQ_SH+bid});}}}return out;}", "lastUpdateTime": "1791895892261", "respondTime": 12449, "ruleBookInfo": {"author": "$.author", "coverUrl": "$.coverUrl", "init": "@js:(function(){var m=String(baseUrl).match(/([0-9]{15,})/);var bid=m?m[1]:'';if(!bid){throw new Error('无效书籍ID');}var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';var raw=FQ_api(java,source,'/reading/bookapi/directory/all_items/v','book_type=0&item_data_list_md5=&catalog_data_md5=&book_id='+bid+'&book_info_md5=&need_version=true&'+base);var j=JSON.parse(raw);var bd=(j.data&&j.data.book_info)||{};var out={name:String(bd.book_name||''),author:String(bd.author||''),kind:String(bd.category||''),intro:String(bd.abstract||bd.book_abstract_v2||''),coverUrl:String(bd.thumb_url||bd.expand_thumb_url||''),tocUrl:'https://fanqienovel.com/page/'+bid};return JSON.stringify(out);})()", "intro": "$.intro", "kind": "$.kind", "name": "$.name", "tocUrl": "$.tocUrl"}, "ruleContent": {"content": "@js:(function(){var m=String(baseUrl).match(/([0-9]{15,})/);var bid=m?m[1]:'';var m2=String(baseUrl).match(/#([0-9]+)$/);var item=m2?m2[1]:'';if(!bid||!item){throw new Error('参数错误');}var d=FQ_dev(source);var pool=FQ_ensure(source,2);if(!pool.length){throw new Error('设备池为空，请重试');}var dev=pool[0].d,iid=pool[0].i;var res=FQ_cmGet(java,bid,[item],dev,iid);var txt=res[item]||'';if(!txt){throw new Error('正文获取失败，请重试');}return txt;})()"}, "ruleExplore": {"author": "$.author", "bookList": "@js:(function(){var u=String(baseUrl||'');var pg=(typeof page!=='undefined'&&page)?page:1;var l=[];var mr=u.match(/[?&]t=rank[^&]*/);if(mr){var mc=u.match(/[?&]cat=([0-9]+)/);var ma=u.match(/[?&]algo=([0-9]+)/);var cat=mc?mc[1]:'0';var algo=ma?ma[1]:'101';l=FQ_pickBooks(java,source,cat,algo,pg);}else{var mt=u.match(/[?&]tt=([0-9]+)/);if(mt){l=FQ_tabBooks(java,source,mt[1],pg);}else{l=FQ_homeList(java,source);}}var out=[];for(var i=0;i<l.length;i++){out.push(JSON.stringify(l[i]));}return out;})()", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "name": "$.name"}, "ruleSearch": {"author": "$.author", "bookList": "@js:(function(){var d=JSON.parse(String(result));var items=(d.data&&d.data.ret_data)?d.data.ret_data:[];var out=[];for(var i=0;i<items.length;i++){var it=items[i];var t=String(it.title||'').split('<em>').join('').split('</em>').join('');out.push(JSON.stringify({name:t,author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https://fanqienovel.com/page/'+String(it.book_id)}));}return out;})()", "bookUrl": "$.bookUrl", "checkKeyWord": "十日终焉", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "name": "$.name"}, "ruleToc": {"chapterList": "@js:(function(){var m=String(baseUrl).match(/([0-9]{15,})/);var bid=m?m[1]:'';if(!bid){throw new Error('无效书籍ID');}var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';var raw=FQ_api(java,source,'/reading/bookapi/directory/all_items/v','book_type=0&item_data_list_md5=&catalog_data_md5=&book_id='+bid+'&book_info_md5=&need_version=true&'+base);var d=JSON.parse(raw);var dd=d.data||{};var cats=dd.catalog_data||dd.item_data_list||[];var out=[];for(var i=0;i<cats.length;i++){var c=cats[i];var t=String(c.catalog_title||c.title||('第'+(i+1)+'章'));out.push(JSON.stringify({name:t,url:'https://fanqienovel.com/page/'+bid+String.fromCharCode(35)+String(c.item_id||c.catalog_id)}));}return out;})()", "chapterName": "$.name", "chapterUrl": "$.url"}, "searchUrl": "https://api.fanqiesdk.com/api/novel/channel/homepage/search/search/v1/?q={{key}}&offset=0&enterfrom_aid=&enter_from=inner_search&app_name=news_article&version_name=7.0.8&app_version=7.0.8&channel=tt_huawei2019_yz&version_code=708&device_platform=android&parent_enterfrom=novel_list&novel_host=&aid=13&scm_version=1.0.0.4112&device_type=25053RT47C&device_brand=Redmi&language=zh&os_api=35&os_version=15&openudid=0123456789abcdef&update_version_code=70899&plugin=0&tma_jssdk_version=1.10.0.0&rom_version=miui__os2.0.209.0.volcnxm", "weight": 0},{"bookSourceComment": "//2026.10.12@by沈谕", "bookSourceName": "故事族", "bookSourceType": 0, "bookSourceUrl": "https://www.gushizu.com", "customButton": false, "customOrder": 4, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nvar base = \"https://www.gushizu.com\";\nvar out = [];\nfunction push(t, u, w) {\n  out.push({\n    title: t,\n    url: u,\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: w || 0.25 }\n  });\n}\npush(\"🏆 排行榜\", \"\", 1);\npush(\"点击榜\", base + \"/rank/allvisit\", 0.25);\npush(\"收藏榜\", base + \"/rank/mark\", 0.25);\npush(\"推荐榜\", base + \"/rank/vote\", 0.25);\npush(\"周榜\", base + \"/rank/weekvisit\", 0.25);\npush(\"月榜\", base + \"/rank/monthvisit\", 0.25);\npush(\"📚 分类\", \"\", 1);\nvar cats = [\n  [\"科幻\", 41], [\"名著\", 40], [\"推理\", 39], [\"短篇\", 32],\n  [\"中篇\", 34], [\"少儿版\", 33], [\"历史版\", 8], [\"国外版\", 27],\n  [\"睡前故事\", 11], [\"科幻世界\", 30], [\"当代\", 14], [\"啄木鸟\", 13],\n  [\"意林\", 12], [\"小说月报\", 10], [\"上海故事\", 9], [\"读者\", 6],\n  [\"今古传奇\", 5], [\"故事会\", 3], [\"历史故事\", 42]\n];\nfor (var i = 0; i < cats.length; i++) {\n  push(cats[i][0], base + \"/novel/category/list/categoryId/\" + cats[i][1] + \"/<,page/{{page}}>\", 0.25);\n}\nJSON.stringify(out);", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1791816018456", "respondTime": 180000, "ruleBookInfo": {"author": ".book-intro .flex-item p:contains(作者)@text##作者：", "coverUrl": ".book-intro img@src", "intro": "@js:\nvar doc = org.jsoup.Jsoup.parse(result);\nvar name = doc.select('.book-title').text();\nvar author = doc.select('.book-intro .flex-item p:contains(作者)').text().replace('作者：','').trim();\nvar kind = doc.select('.book-intro .flex-item p:contains(分类)').text().replace('分类：','').trim();\nvar intro = doc.select('.book-intro-con p').text().trim();\nvar lines = [];\nif(name)   lines.push('<div>　　<b>📖 书名：</b>' + name + '</div>');\nif(author) lines.push('<div>　　<b>👤 作者：</b>' + author + '</div>');\nif(kind)   lines.push('<div>　　<b>📂 分类：</b>' + kind + '</div>');\nif(intro)  lines.push('<div>　　<b>📝 简介：</b></div><div>　　' + intro + '</div>');\nlines.join('');", "kind": ".book-intro .flex-item p:contains(分类)@text##分类：", "name": ".book-title@text"}, "ruleContent": {"content": "#ptReadText@html\n@js:result.replace(/<br\\s*\\/?>/gi, '\\n\\n').replace(/<[^>]+>/g, '').replace(/&nbsp;/g, ' ').replace(/\\n{3,}/g, '\\n\\n').trim();", "nextContentUrl": "a:contains(下一篇)@href"}, "ruleExplore": {"bookList": "<js>var doc = org.jsoup.Jsoup.parse(result);var els = doc.select('a.flex-wrp.border-b');if (els.size() === 0) { els = doc.select('a[href*=\"/novel/novel/index/novelId/\"]'); } els;</js>", "bookUrl": "href", "coverUrl": "img@data-src||img@src", "name": ".size15@text||h4@text||text"}, "ruleSearch": {"bookList": "a.flex-wrp, .novel-list a", "bookUrl": "href", "coverUrl": "img@data-src||img@src", "name": ".size14@text||.size15@text||h4@text||text"}, "ruleToc": {"chapterList": ".catalog-container a, .mobile-cat-inner a", "chapterName": ".chapter-name@text||text", "chapterUrl": "href"}, "searchUrl": "/novel/search/result?searchkey={{key}}", "weight": 0},{"bookSourceComment": "此书源由「一头居」原创提供\n\n由于🍅站点网页端开启了试读机制，所以章节只能看到第10章，之后的需要下载APP或开通SVIP才能浏览（能解决的既可使用，解决不了的我还会出第二个版本）\n\n【反混淆】网页端正文与部分榜单文本使用 PUA 私用区字体加密，此源于 jsLib 内置 362 字映射表(0xE3E8 起)逐字还原，实测整本还原率 100%。", "bookSourceGroup": "一头居", "bookSourceName": "番茄小说", "bookSourceType": 0, "bookSourceUrl": "https://fanqienovel.com", "bookUrlPattern": "https?://fanqienovel\\.com/page/\\d+", "concurrentRate": "500", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "----------------男生全部----------------::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{fqCatOff(page)}}&limit=100&category_id={{fqCatId(page,1)}}&gender=1&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n西方奇幻::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=1141&gender=1&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n东方仙侠::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=1140&gender=1&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n科幻末世::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=8&gender=1&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n都市日常::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=261&gender=1&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n都市修真::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=124&gender=1&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n都市高武::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=1014&gender=1&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n历史古代::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=273&gender=1&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n战神赘婿::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=27&gender=1&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n都市种田::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=263&gender=1&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n传统玄幻::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=258&gender=1&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n历史脑洞::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=272&gender=1&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n悬疑脑洞::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=539&gender=1&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n都市脑洞::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=262&gender=1&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n玄幻脑洞::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=257&gender=1&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n悬疑灵异::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=751&gender=1&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n抗战谍战::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=504&gender=1&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n游戏体育::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=746&gender=1&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n动漫衍生::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=718&gender=1&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n男频衍生::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=1016&gender=1&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n----------------女生全部----------------::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{fqCatOff(page)}}&limit=100&category_id={{fqCatId(page,0)}}&gender=0&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n古风世情::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=1139&gender=0&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n科幻末世::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=8&gender=0&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n游戏体育::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=746&gender=0&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n女频衍生::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=1015&gender=0&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n玄幻言情::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=248&gender=0&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n种田::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=23&gender=0&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n年代::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=79&gender=0&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n现言脑洞::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=267&gender=0&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n宫斗宅斗::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=246&gender=0&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n悬疑脑洞::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=539&gender=0&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n古言脑洞::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=253&gender=0&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n快穿::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=24&gender=0&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n青春甜宠::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=749&gender=0&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n星光璀璨::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=745&gender=0&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n女频悬疑::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=747&gender=0&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n职场婚恋::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=750&gender=0&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n豪门总裁::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=748&gender=0&rank_version={{Math.floor(Date.now()/3600000)*3600}}\n民国言情::https://fanqienovel.com/api/rank/category/list?app_id=2503&rank_list_type=3&rankMold=1&offset={{(page-1)*100}}&limit=100&category_id=1017&gender=0&rank_version={{Math.floor(Date.now()/3600000)*3600}}", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; SM-G975F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\", \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\", \"Accept-Language\": \"zh-CN,zh;q=0.9\", \"Referer\": \"https://fanqienovel.com/\"}", "jsLib": "\n/* ===== 番茄小说 PUA 字体反混淆库 =====\n * 网页端正文/榜单文本会把常用字替换成 Unicode 私用区码位(U+E3E8~U+E55B)，\n * 真实字形由 awesome-font 字体承载。此映射表已由字体逐字还原核对，\n * 覆盖 0xE3E8 起 362 个码位，实测整本还原率 100%。\n */\nvar FQM = \"D在主特家军然表场4要只v和?6别还g现儿岁??此象月3出战工相o男直失世F都平文什VO将真T那当?会立些u是十张学气大爱两命全后东性通被1它乐接而感车山公了常以何可话先pi叫轻M士w着变尔快l个说少色里安花远7难师放t报认面道S?克地度I好机U民写把万同水新没书电吃像斯5为y白几日教看但第加候作上拉住有法r事应位利你声身国问马女他Y比父xAHNsX边美对所金活回意到z从j知又内因点Q三定8Rb正或夫向德听更?得告并本q过记L让打f人就者去原满体做经K走如孩cG给使物?最笑部?员等受k行一条果动光门头见往自解成处天能于名其发总母的死手入路进心来h时力多开已许d至由很界n小与Z想代么分生口再妈望次西风种带J?实情才这?E我神格长觉间年眼无不亲关结0友信下却重己老2音字m呢明之前高PB目太e9起稜她也W用方子英每理便四数期中C外样a海们任\";\nvar FQB = 0xE3E8;\n\n/* 还原 PUA 密文 */\nfunction fqD(t) {\n    t = String(t == null ? \"\" : t);\n    var o = \"\", i, c, k;\n    for (i = 0; i < t.length; i++) {\n        c = t.charCodeAt(i);\n        k = c - FQB;\n        if (k >= 0 && k < FQM.length) { o += FQM.charAt(k); } else { o += t.charAt(i); }\n    }\n    return o;\n}\n\n/* 安全取值: fqG(o,'a') 等价于 o&&o.a,取不到返回 \"\" */\nfunction fqG(o, k) {\n    if (o === undefined || o === null) { return \"\"; }\n    var v = o[k];\n    if (v === undefined || v === null) { return \"\"; }\n    return v;\n}\n\n/* 时间戳(秒) -> yyyy-MM-dd */\nfunction fqDate(v) {\n    v = Number(v);\n    if (!v || isNaN(v)) { return \"\"; }\n    var d = new Date(v * 1000);\n    var m = d.getMonth() + 1, dd = d.getDate();\n    return d.getFullYear() + \"-\" + (m < 10 ? \"0\" + m : m) + \"-\" + (dd < 10 ? \"0\" + dd : dd);\n}\n\n/* 依次取第一个非空字段 */\nfunction fqP(o, ks) {\n    var i, v;\n    for (i = 0; i < ks.length; i++) {\n        v = o[ks[i]];\n        if (v !== undefined && v !== null && v !== \"\") { return v; }\n    }\n    return \"\";\n}\n\n/* 从页面 HTML 里提取 window.__INITIAL_STATE__ 并解析为对象\n * 该 JSON 含非法字面量 undefined,先替换为 null 再解析\n */\nfunction fqS(h) {\n    h = String(h == null ? \"\" : h);\n    var i = h.indexOf(\"window.__INITIAL_STATE__\");\n    if (i < 0) { return null; }\n    var j = h.indexOf(\"{\", i);\n    if (j < 0) { return null; }\n    var d = 0, ins = false, esc = false, q = \"\", k, e = -1, c;\n    for (k = j; k < h.length; k++) {\n        c = h.charAt(k);\n        if (ins) {\n            if (esc) { esc = false; }\n            else if (c === \"\\\\\") { esc = true; }\n            else if (c === q) { ins = false; }\n        } else {\n            if (c === '\"' || c === \"'\") { ins = true; q = c; }\n            else if (c === \"{\") { d++; }\n            else if (c === \"}\") { d--; if (d === 0) { e = k; break; } }\n        }\n    }\n    if (e < 0) { return null; }\n    var s = h.substring(j, e + 1).replace(/([:,\\[])\\s*undefined\\s*([,}\\]])/g, \"$1null$2\");\n    try { return JSON.parse(s); } catch (err) { return null; }\n}\n\n/* 从各种榜单/搜索响应里取出书籍数组 */\nfunction fqL(o) {\n    var d = fqG(o, \"data\");\n    if (d === \"\") { d = o; }\n    var cand = [fqG(d, \"search_book_data_list\"), fqG(d, \"book_list\"),\n                fqG(d, \"list\"), fqG(d, \"data\"), fqG(o, \"book_list\")];\n    var i;\n    for (i = 0; i < cand.length; i++) {\n        if (cand[i] !== \"\" && cand[i] !== null && cand[i].length) { return cand[i]; }\n    }\n    return [];\n}\n\n/* 归一化一本书 -> 统一 JSON 串 */\nfunction fqB(b) {\n    return JSON.stringify({\n        n: fqD(fqP(b, [\"book_name\", \"bookName\"])),\n        a: fqD(fqP(b, [\"author\"])),\n        k: fqD(fqP(b, [\"category\"])),\n        i: fqD(fqP(b, [\"book_abstract\", \"abstract\"])),\n        w: fqP(b, [\"word_count\", \"wordNumber\"]),\n        l: fqD(fqP(b, [\"last_chapter_title\", \"lastChapterTitle\", \"title\"])),\n        t: fqDate(fqP(b, [\"last_chapter_time\", \"lastChapterUpdateTime\"])),\n        c: fqP(b, [\"thumb_url\", \"thumbUri\"]),\n        u: \"https://fanqienovel.com/page/\" + fqP(b, [\"book_id\", \"bookId\"])\n    });\n}\n\n/* 列表规则: 同时兼容 JSON 接口与 SSR 页面 */\nfunction fqParse(result) {\n    var s = String(result == null ? \"\" : result).replace(/^\\s+/, \"\");\n    var L = null, o;\n    if (s.charAt(0) === \"{\") {\n        try { o = JSON.parse(s); } catch (e) { o = null; }\n        if (o !== null) { L = fqL(o); }\n    }\n    if (L === null) {\n        var st = fqS(s);\n        if (st !== null) { L = fqG(fqG(st, \"rank\"), \"book_list\"); if (L === \"\") { L = null; } }\n    }\n    return L;\n}\n\nfunction fqBookList(result) {\n    var L = fqParse(result);\n    if (L === null) { return []; }\n    var out = [], i;\n    for (i = 0; i < L.length; i++) { out.push(fqB(L[i])); }\n    return out;\n}\n\n/* 发现页: 榜单接口偶发返回空列表,自动重试 */\nfunction fqExplore(result) {\n    var out = fqBookList(result);\n    if (out.length > 0) { return out; }\n    if (typeof baseUrl === \"undefined\" || baseUrl === null) { return out; }\n    var u = String(baseUrl);\n    if (u.indexOf(\"fanqienovel.com/api/\") < 0) { return out; }\n    var i, r;\n    for (i = 0; i < 3; i++) {\n        r = \"\";\n        try { r = String(java.ajax(u)); } catch (e) { r = \"\"; }\n        if (r !== \"\") {\n            out = fqBookList(r);\n            if (out.length > 0) { return out; }\n        }\n    }\n    return out;\n}\n\n/* ===== 分类榜单分页 =====\n * 榜单接口 limit 上限 100；offset 可继续翻页，单分类实测约 313 本(4 页)。\n * 「频道全部」入口把 页码 映射为 (分类, 偏移)：每 4 页对应一个分类。\n */\nvar FQ_MALE = [1141, 1140, 8, 261, 124, 1014, 273, 27, 263, 258, 272, 539, 262, 257, 751, 504, 746, 718, 1016];\nvar FQ_FEMALE = [1139, 8, 746, 1015, 248, 23, 79, 267, 246, 539, 253, 24, 749, 745, 747, 750, 748, 1017];\nvar FQ_PAGE_PER_CAT = 4;   /* 每个分类取 4 页 = 400 本上限 */\n\nfunction fqCatId(page, gender) {\n    var ids = (Number(gender) === 0) ? FQ_FEMALE : FQ_MALE;\n    var i = Math.floor((Number(page) - 1) / FQ_PAGE_PER_CAT);\n    if (!(i >= 0)) { i = 0; }\n    if (i >= ids.length) { i = ids.length - 1; }\n    return ids[i];\n}\n\nfunction fqCatOff(page) {\n    var k = (Number(page) - 1) % FQ_PAGE_PER_CAT;\n    if (!(k >= 0)) { k = 0; }\n    return k * 100;\n}\n\n/* 频道一共能翻多少页(仅用于说明,不影响功能) */\nfunction fqCatTotalPage(gender) {\n    var ids = (Number(gender) === 0) ? FQ_FEMALE : FQ_MALE;\n    return ids.length * FQ_PAGE_PER_CAT;\n}\n", "lastUpdateTime": "1791761996518", "respondTime": 180000, "ruleBookInfo": {"author": "@js:fqD(String(JSON.parse(String(result)).author))", "canReName": "true", "coverUrl": "@js:String(JSON.parse(String(result)).thumbUri)", "init": "@js:(function(){\n  var st = fqS(String(result));\n  if (st === null) { return \"{}\"; }\n  var p = st.page;\n  if (p === undefined || p === null) { return \"{}\"; }\n  return JSON.stringify(p);\n})()", "intro": "@js:fqD(String(JSON.parse(String(result)).abstract))", "kind": "@js:(function(){\n  var p = JSON.parse(String(result));\n  var out = [];\n  try {\n    var a = JSON.parse(String(fqG(p, \"categoryV2\")));\n    for (var i = 0; i < a.length; i++) { out.push(fqD(String(fqG(a[i], \"Name\")))); }\n  } catch (e) {}\n  if (out.length === 0) {\n    var c = fqD(String(fqG(p, \"category\")));\n    if (c !== \"\") { out.push(c); }\n  }\n  return out.join(\",\");\n})()", "lastChapter": "@js:fqD(String(JSON.parse(String(result)).lastChapterTitle))", "name": "@js:fqD(String(JSON.parse(String(result)).bookName))", "tocUrl": "@js:(function(){\n  var m = String(baseUrl).match(/page\\/(\\d+)/);\n  if (m === null) { return \"\"; }\n  return \"https://fanqienovel.com/api/reader/directory/detail?bookId=\" + m[1];\n})()", "wordCount": "@js:String(JSON.parse(String(result)).wordNumber)"}, "ruleContent": {"content": "@js:(function(){\n  var st = fqS(String(result));\n  var cd = fqG(fqG(st, \"reader\"), \"chapterData\");\n  var c = fqD(String(fqG(cd, \"content\")));\n  var imgs = [];\n  c = c.replace(/<img[^>]*?(\\{[^{}]*\"web_uri\"[^{}]*\\})[^>]*>/gi, function (m, js) {\n    var o = null;\n    try { o = JSON.parse(js); } catch (e) { return \"\"; }\n    var uri = fqG(o, \"web_uri\");\n    if (uri === \"\") { return \"\"; }\n    imgs.push(\"https://p6-novel.byteimg.com/\" + uri + \"~tplv-resize:\" +\n              fqG(o, \"width\") + \":\" + fqG(o, \"height\") + \".image\");\n    return \"\\u0001\" + (imgs.length - 1) + \"\\u0001\";\n  });\n  c = c.replace(/<\\/p>\\s*<p>/gi, \"\\n\");\n  c = c.replace(/<br\\s*\\/?>/gi, \"\\n\");\n  c = c.replace(/<\\/?p[^>]*>/gi, \"\\n\");\n  c = c.replace(/<\\/img>/gi, \"\");\n  c = c.replace(/<[^>]+>/g, \"\");\n  c = c.replace(/&nbsp;/g, \" \");\n  c = c.replace(/&lt;/g, \"<\");\n  c = c.replace(/&gt;/g, \">\");\n  c = c.replace(/&quot;/g, '\"');\n  c = c.replace(/&#39;/g, \"'\");\n  c = c.replace(/&amp;/g, \"&\");\n  c = c.replace(/\\r/g, \"\");\n  c = c.replace(/[ \\t]+\\n/g, \"\\n\");\n  c = c.replace(/\\n{3,}/g, \"\\n\\n\");\n  c = c.replace(/\\u0001(\\d+)\\u0001/g, function (m, i) {\n    return \"\\n<img src=\\\"\" + imgs[Number(i)] + \"\\\">\\n\";\n  });\n  return c.replace(/^\\s+|\\s+$/g, \"\");\n})()", "imageStyle": "DEFAULT", "replaceRegex": "##[\\u200b-\\u200f\\ufeff]##", "title": "@js:fqD(String(fqG(fqG(fqS(String(result)), \"reader\"), \"chapterData\").title))"}, "ruleExplore": {"author": "@js:JSON.parse(String(result)).a", "bookList": "@js:fqExplore(result)", "bookUrl": "@js:JSON.parse(String(result)).u", "coverUrl": "@js:JSON.parse(String(result)).c", "intro": "@js:JSON.parse(String(result)).i", "kind": "@js:JSON.parse(String(result)).k", "lastChapter": "@js:JSON.parse(String(result)).l", "name": "@js:JSON.parse(String(result)).n", "wordCount": "@js:JSON.parse(String(result)).w"}, "ruleSearch": {"author": "@js:JSON.parse(String(result)).a", "bookList": "@js:fqBookList(result)", "bookUrl": "@js:JSON.parse(String(result)).u", "checkKeyWord": "search_book_data_list", "coverUrl": "@js:JSON.parse(String(result)).c", "intro": "@js:JSON.parse(String(result)).i", "kind": "@js:JSON.parse(String(result)).k", "lastChapter": "@js:JSON.parse(String(result)).l", "name": "@js:JSON.parse(String(result)).n", "wordCount": "@js:JSON.parse(String(result)).w"}, "ruleToc": {"chapterList": "@js:(function(){\n  var d = fqG(JSON.parse(String(result)), \"data\");\n  var out = [];\n  var cv = fqG(d, \"chapterListWithVolume\");\n  var vn = fqG(d, \"volumeNameList\");\n  var i, j, g, c, nm;\n  if (cv !== \"\" && cv !== null) {\n    for (i = 0; i < cv.length; i++) {\n      g = cv[i];\n      if (g === null || g === undefined) { continue; }\n      if (g.length === 0) { continue; }\n      if (cv.length > 1) {\n        nm = \"\";\n        if (vn !== \"\" && vn !== null) { if (vn[i] !== undefined) { nm = String(vn[i]); } }\n        out.push(JSON.stringify({n: nm, u: \"\", v: true, t: \"共\" + g.length + \"章\"}));\n      }\n      for (j = 0; j < g.length; j++) {\n        c = g[j];\n        out.push(JSON.stringify({\n          n: fqD(String(fqG(c, \"title\"))),\n          u: \"https://fanqienovel.com/reader/\" + fqG(c, \"itemId\"),\n          v: false,\n          t: fqG(c, \"firstPassTime\"),\n          p: fqG(c, \"needPay\"),\n          x: fqG(c, \"isChapterLock\")\n        }));\n      }\n    }\n  }\n  if (out.length === 0) {\n    var ids = fqG(d, \"allItemIds\");\n    for (i = 0; i < ids.length; i++) {\n      out.push(JSON.stringify({n: \"第\" + (i + 1) + \"章\",\n                               u: \"https://fanqienovel.com/reader/\" + ids[i], v: false}));\n    }\n  }\n  return out;\n})()", "chapterName": "@js:JSON.parse(String(result)).n", "chapterUrl": "@js:JSON.parse(String(result)).u", "isPay": "@js:(function(){\n  var o = JSON.parse(String(result));\n  if (o.v === true) { return \"\"; }\n  if (Number(o.p) > 0) { return \"true\"; }\n  return \"\";\n})()", "isVip": "@js:(function(){\n  var o = JSON.parse(String(result));\n  if (o.v === true) { return \"\"; }\n  if (o.x === true) { return \"true\"; }\n  return \"\";\n})()", "isVolume": "@js:(function(){\n  if (JSON.parse(String(result)).v === true) { return \"true\"; }\n  return \"\";\n})()", "updateTime": "@js:(function(){\n  var t = JSON.parse(String(result)).t;\n  if (t === undefined || t === null || t === \"\") { return \"\"; }\n  if (typeof t === \"string\") { return t; }\n  var d = new Date(Number(t) * 1000);\n  var m = d.getMonth() + 1, dd = d.getDate();\n  return d.getFullYear() + \"-\" + (m < 10 ? \"0\" + m : m) + \"-\" + (dd < 10 ? \"0\" + dd : dd);\n})()"}, "searchUrl": "https://fanqienovel.com/api/author/search/search_book/v1?filter=127,127,127,127&page_count=10&page_index={{page-1}}&query_word={{encodeURIComponent(key)}},{\"method\":\"POST\",\"body\":\"{}\",\"headers\":{\"Content-Type\":\"application/json\"}}", "variableComment": "此源无自定义变量。jsLib 中 FQM 为 PUA 字体映射表(0xE3E8 起 362 字)，FQB 为映射起始码位；fqD 还原密文，fqS 解析 __INITIAL_STATE__，fqL/fqB/fqBookList 归一化各接口书籍列表，fqExploreAll 处理分类合并入口，FQ_MALE/FQ_FEMALE 为男女频道分类 ID 表。", "weight": 0},{"bookSourceComment": "", "bookSourceGroup": "测试", "bookSourceName": "最终小说网", "bookSourceType": 0, "bookSourceUrl": "https://www.zuizhong.net/", "customOrder": 3813, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "exploreUrl": "", "header": "", "lastUpdateTime": "1791715648092", "loginUi": "", "respondTime": 4323, "ruleBookInfo": {"author": "[property=\"og:novel:author\"]@content", "coverUrl": "[property=\"og:image\"]@content", "intro": "[property=\"og:description\"]@content", "kind": "[property~=category|status|update_time]@content", "lastChapter": "[property~=las?test_chapter_name]@content", "name": "[property=\"og:novel:book_name\"]@content", "tocUrl": "text.目录@href@"}, "ruleContent": {"content": ".info_dv1@p[1:-2]@text", "nextContentUrl": "text.下一@href"}, "ruleExplore": [], "ruleSearch": {"author": "a.1@text", "bookList": ".txt-list@li", "bookUrl": "a.0@href", "intro": "", "kind": ".s1@text##[\\[\\]]", "lastChapter": "a.2@text", "name": "a.0@text"}, "ruleToc": {"chapterList": ".info_dv3.1@ul@a", "chapterName": "text", "chapterUrl": "href", "isVolume": "", "nextTocUrl": "option[selected]+option@value"}, "searchUrl": "<js>cookie.removeCookie(source.key);</js>\nhttps://www.zuizhong.net/search.html,{\"method\":\"POST\",\"body\":\"s={{key}}\"}", "weight": 0},{"bookSourceComment": "此书源由「一头居」原创提供", "bookSourceGroup": "一头居", "bookSourceName": "uu书库", "bookSourceType": 0, "bookSourceUrl": "https://www.uushuk.com", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "男生::https://www.uushuk.com/list-1-{{page?page:1}}/\n女生::https://www.uushuk.com/list-2-{{page?page:1}}/\n二次元::https://www.uushuk.com/list-3-{{page?page:1}}/\n玄幻小说::https://www.uushuk.com/list-4-{{page?page:1}}/\n奇幻小说::https://www.uushuk.com/list-5-{{page?page:1}}/\n武侠小说::https://www.uushuk.com/list-6-{{page?page:1}}/\n仙侠小说::https://www.uushuk.com/list-7-{{page?page:1}}/\n都市小说::https://www.uushuk.com/list-8-{{page?page:1}}/\n军事小说::https://www.uushuk.com/list-9-{{page?page:1}}/\n历史小说::https://www.uushuk.com/list-10-{{page?page:1}}/\n游戏小说::https://www.uushuk.com/list-11-{{page?page:1}}/\n体育小说::https://www.uushuk.com/list-12-{{page?page:1}}/\n科幻小说::https://www.uushuk.com/list-13-{{page?page:1}}/\n诸天无限::https://www.uushuk.com/list-14-{{page?page:1}}/\n悬疑小说::https://www.uushuk.com/list-15-{{page?page:1}}/\n古代言情::https://www.uushuk.com/list-16-{{page?page:1}}/\n仙侠奇缘::https://www.uushuk.com/list-17-{{page?page:1}}/\n现代言情::https://www.uushuk.com/list-18-{{page?page:1}}/\n浪漫青春::https://www.uushuk.com/list-19-{{page?page:1}}/\n玄幻言情::https://www.uushuk.com/list-20-{{page?page:1}}/\n悬疑推理::https://www.uushuk.com/list-21-{{page?page:1}}/\n科幻空间::https://www.uushuk.com/list-22-{{page?page:1}}/\n游戏竞技::https://www.uushuk.com/list-23-{{page?page:1}}/\n短篇言情::https://www.uushuk.com/list-24-{{page?page:1}}/\n原生幻想::https://www.uushuk.com/list-25-{{page?page:1}}/\n恋爱日常::https://www.uushuk.com/list-26-{{page?page:1}}/\n衍生同人::https://www.uushuk.com/list-27-{{page?page:1}}/\n搞笑吐槽::https://www.uushuk.com/list-28-{{page?page:1}}/", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; SM-G975F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\", \"Accept-Language\": \"zh-CN,zh;q=0.9\"}", "lastUpdateTime": "1791704960823", "respondTime": 180000, "ruleBookInfo": {"author": "@css:meta[property=\"og:novel:author\"]@content", "canReName": "true", "coverUrl": "@css:meta[property=\"og:image\"]@content##^http:##https:", "intro": "@css:meta[property=\"og:description\"]@content", "kind": "class.position@tag.a.1@text", "lastChapter": "@css:meta[property=\"og:novel:latest_chapter_name\"]@content", "name": "@css:meta[property=\"og:novel:book_name\"]@content"}, "ruleContent": {"content": "class.content@html@js:(function(){var h=String(result);h=h.split('<i class=\"icon').join('\\u0001');h=h.split('</i>').join('');h=h.split('\\u0001').join('');var a=h.indexOf('<p>');var b=h.lastIndexOf('</p>');if(a>-1&&b>a)h=h.substring(a,b+4);h=h.replace(/<p>\\s*<\\/p>/g,'');h=h.replace(/[a-zA-Z0-9\\-]+\\.(?:com|net|org|xyz|la|cc|top|icu|cn|vip|club|shop|app|info|biz|io|me|tv|site|online)(?:\\s+[a-zA-Z0-9\\-]+\\.(?:com|net|org|xyz|la|cc|top|icu|cn|vip|club|shop|app|info|biz|io|me|tv|site|online))+\\.?/g,'');h=h.replace(/[^\\u3002\\uff01\\uff1f\\n\\uff0c]{0,40}?(?:uushuk|uu\\u4e66\\u5e93)[^\\u3002\\uff01\\uff1f\\n]*[\\u3002\\uff01\\uff1f]?/g,'');h=h.replace(/[^\\u3002\\uff01\\uff1f\\n\\uff0c]{0,40}?https?:\\/\\/[^\\u3002\\uff01\\uff1f\\n]*[\\u3002\\uff01\\uff1f]?/g,'');h=h.replace(/\\n{3,}/g,'\\n');return h;})()", "nextContentUrl": "@js:(function(){var h=String(result);var m=h.match(/<a[^>]+href=\"([^\"]+)\"[^>]*>\\s*\\u4e0b\\u4e00\\u9875/);if(!m)return null;var u=String(m[1]);if(u.indexOf('http')!==0)u='https://www.uushuk.com'+u;return u;})()"}, "ruleExplore": {"author": "@js:JSON.parse(String(result)).a", "bookList": "@js:(function(){var GETA=1;var MAXN=20;var html=String(result);var items=[],m,re=/<li>[\\s\\S]*?<\\/li>/g;while((m=re.exec(html))!==null){var b=m[0];var um=b.match(/<a class=\"pic\" href=\"([^\"]+)\"/);if(!um)continue;var u=um[1];if(u.indexOf('http')!==0)u='https://www.uushuk.com'+u;var nm=b.match(/class=\"name\"[^>]*>\\s*<a[^>]*>([\\s\\S]*?)<\\/a>/);var cm=b.match(/<img[^>]+src=\"([^\"]+)\"/);var cv=cm?cm[1]:'';if(cv&&cv.indexOf('http')!==0)cv='https://www.uushuk.com'+cv;var im=b.match(/class=\"intro[^\"]*\">([\\s\\S]*?)<\\/div>/);items.push({u:u,n:nm?nm[1].replace(/<[^>]*>/g,''):'',c:cv,i:im?im[1]:''});if(items.length>=MAXN)break;}function respBody(r){if(!r)return '';try{if(r.body)return String(r.body);}catch(e){}try{return String(r.getBody());}catch(e2){}return '';}function pick(t){var a='',g='';var am=String(t).match(/og:novel:author\" content=\"([^\"]*)\"/);if(am)a=am[1];var gm=String(t).match(/og:novel:category\" content=\"([^\"]*)\"/);if(gm)g=gm[1];return [a,g];}var au=[],ki=[],k;if(GETA&&items.length>0){var us=[];for(k=0;k<items.length;k++)us.push(items[k].u);var fast=false,probe='',rb=null;try{var p0=java.ajaxAll([us[0]]);probe=respBody(p0?p0[0]:null);if(probe)fast=true;}catch(e){fast=false;}if(fast&&us.length>1){try{rb=java.ajaxAll(us.slice(1));}catch(e1){rb=null;}}for(k=0;k<items.length;k++){var t1='';if(fast){if(k===0)t1=probe;else if(rb)t1=respBody(rb[k-1]);}if(!t1){try{t1=String(java.ajax(us[k]));}catch(e3){t1='';}}var pr=pick(t1);au.push(pr[0]);ki.push(pr[1]);}}var out=[];for(k=0;k<items.length;k++){out.push(JSON.stringify({n:items[k].n,a:au[k]||'',k:ki[k]||'',i:items[k].i,c:items[k].c,u:items[k].u}));}return out;})()", "bookUrl": "@js:JSON.parse(String(result)).u", "coverUrl": "@js:JSON.parse(String(result)).c", "intro": "@js:JSON.parse(String(result)).i", "kind": "@js:JSON.parse(String(result)).k", "name": "@js:JSON.parse(String(result)).n"}, "ruleSearch": {"author": "class.book-card__meta-item.0@text##作者：##", "bookList": "@js:(function(){var MAXPG=10;var html=String(result);var all=[];function pushCards(h){var p=String(h).split('<div class=\"book-card\"'),j;for(j=1;j<p.length;j++)all.push('<div class=\"book-card\"'+p[j]);}function respBody(r){if(!r)return '';try{if(r.body)return String(r.body);}catch(e){}try{return String(r.getBody());}catch(e2){}return '';}pushCards(html);var first=all.length;var pm=html.match(/href=\"(\\/\\?action=find&v=\\d+&q=[^\"&]+)/);var pages=1;var tm=html.match(/共找到\\s*<strong>(\\d+)<\\/strong>/);if(tm){pages=Math.ceil(parseInt(tm[1],10)/20);}else{var pp=[0],m2,re2=/page=(\\d+)/g;while((m2=re2.exec(html))!==null){pp.push(parseInt(m2[1],10));}pages=Math.max.apply(null,pp);}if(pages<1)pages=1;if(pages>MAXPG)pages=MAXPG;if(pm&&pages>1){var us=[],i;for(i=2;i<=pages;i++)us.push('https://www.rrssk.com'+pm[1]+'&page='+i);var fast=false;try{var p0=java.ajaxAll([us[0]]);var b0=respBody(p0?p0[0]:null);if(b0){fast=true;pushCards(b0);}}catch(e){fast=false;}if(fast&&us.length>1){var rest=us.slice(1),rs=null;try{rs=java.ajaxAll(rest);}catch(e1){rs=null;}if(rs){for(i=0;i<rest.length;i++){var b1=respBody(rs[i]);if(b1)pushCards(b1);}}}if(all.length<=first){for(i=0;i<us.length;i++){try{var b2=String(java.ajax(us[i]));if(b2)pushCards(b2);}catch(e3){}}}}return all;})()", "bookUrl": "@js:(function(){var s=String(result);var m=s.match(/t=([^&\"']+)/);if(!m)return '';var b=decodeURIComponent(m[1]);try{return String(java.base64Decode(b));}catch(e){return '';}})()", "coverUrl": "tag.img.0@src", "intro": "class.book-card__desc@text", "kind": "class.book-card__meta-item.1@text##分类：##", "name": "class.book-card__title@text"}, "ruleToc": {"chapterList": "@js:(function(){var html=String(result);var aid='';var m=html.match(/articleid\\s*=\\s*\"([^\"]+)\"/);if(m)aid=m[1];if(!aid){m=String(baseUrl).match(/\\/book\\/([^.]+)\\.html/);if(m)aid=m[1];}if(!aid)return [];var maxPage=0;var seg=html.match(/chapter_page[\\s\\S]*?<\\/select>/);if(seg){var rr=/<option value=\"(\\d+)\">/g,mm;while((mm=rr.exec(seg[0]))!==null){var vv=parseInt(mm[1],10);if(vv>maxPage)maxPage=vv;}}var limit=(maxPage>1)?maxPage:80;var key2='I6bWc9iRWbpZsxaWrAqah8XLy7N4Lv4W';var iv='1337325401748205';var url='https://www.uushuk.com/index.php?action=loadChapterPage';var hd='{\"Content-Type\":\"application/x-www-form-urlencoded\",\"Referer\":\"https://www.uushuk.com/book/'+aid+'.html\"}';var out=[],page,i;for(page=1;page<=limit;page++){var e0=java.aesEncodeToBase64String('{\"id\":\"'+aid+'\",\"page\":'+page+'}',key2,'AES/CBC/PKCS5Padding',iv);if(!e0)break;var enc=String(e0).split('+').join('%2B').split('/').join('%2F').split('=').join('%3D');var arr=null;var opt='{\"method\":\"POST\",\"body\":\"data='+enc+'\",\"headers\":{\"Referer\":\"https://www.uushuk.com/book/'+aid+'.html\"}}';try{var r1=java.ajax(url+','+opt);if(r1){var a1=JSON.parse(String(r1)).data;if(a1&&a1.length>0)arr=a1;}}catch(e1){}if(!arr){try{var r2=java.post(url,'data='+enc,hd).body();if(r2)arr=JSON.parse(String(r2)).data;}catch(e2){}}if(!arr||arr.length===0)break;for(i=0;i<arr.length;i++){var cu=String(arr[i].chapterurl);if(cu.indexOf('http')!==0)cu='https://www.uushuk.com'+cu;out.push(JSON.stringify({n:String(arr[i].chaptername),u:cu}));}if(arr.length<100)break;}return out;})()", "chapterName": "@js:JSON.parse(String(result)).n", "chapterUrl": "@js:JSON.parse(String(result)).u"}, "searchUrl": "<js>(function(){var kw=String(key);var home=String(java.ajax('https://www.rrssk.com/00JT.html')||'');if(!home)return '';var m=home.match(/name=\"_t\" value=\"([0-9a-fA-F]+)\"/);if(!m)return '';var t=m[1];var v='17-20261011';var vm=home.match(/action=signJs&v=([0-9A-Za-z.\\-]+)/);if(vm)v=vm[1];java.ajax('https://www.rrssk.com/?action=signJs&v='+v);var enc=encodeURIComponent(kw).replace(/[!'()*]/g,function(c){return '%'+c.charCodeAt(0).toString(16).toUpperCase();});var ts=Math.floor(new Date().getTime()/1000);var f2=31023,r=2410,s9=48524,w=0,u4=enc.length,i;for(i=0;i<u4;i++){var y3=enc.charCodeAt(i)+enc.charCodeAt(u4-1-i)+t.charCodeAt(i%t.length);w=((w<<3)^(y3*f2))>>>0;w=(w+r)>>>0;}w=(w^ts)>>>0;for(i=0;i<16805;i++){w=((w^(w>>>9))*s9)>>>0;}w=(w^(w>>>15))>>>0;var sh=('00000000'+((w^283)>>>0).toString(16)).slice(-8);return JSON.stringify('keyword='+enc+'&_t='+t+'&_ts='+ts+'&_s='+sh);})()</js>https://www.rrssk.com/?action=search,{\"method\":\"POST\",\"body\":@result,\"followRedirects\":true,\"headers\":{\"Content-Type\":\"application/x-www-form-urlencoded; charset=UTF-8\",\"Referer\":\"https://www.rrssk.com/00JT.html\"}}", "weight": 0},{"bookSourceComment": "", "bookSourceGroup": "墨阅", "bookSourceName": "📖墨阅·极速", "bookSourceType": 0, "bookSourceUrl": "moyue://rapid", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>\ntry{\nvar cfg = SRCFG(source);\nvar modes = ['小说','听书','漫画','短剧'];\nvar tab = cfg.mode || '小说';\nif(modes.indexOf(tab) < 0){ tab = '小说'; }\nvar srcList = {};\ntry{ srcList = JSON.parse(String(java.ajax(host + '/legado/sources'))); }catch(e){}\nvar plats = SRCLIST(srcList, tab);\nvar out = [];\nout.push(SRFLT('模式', modes, tab, '模式', 1));\nout.push(SRFLT('平台', plats, cfg.platform, '平台', 1));\nif(tab == '小说'){\n  out.push(SRFLT('频道', ['男频','女频'], cfg.gender, '频道', 1));\n}\nvar plat = (cfg.platform=='' || cfg.platform=='全部' || plats.indexOf(cfg.platform)<0) ? '番茄' : PLATNAME(cfg.platform);\nvar gd = (cfg.gender == '女频') ? 2 : 1;\nvar menuUrl = host + '/legado/explore/menu?tab=' + encodeURIComponent(tab) + '&source=' + encodeURIComponent(plat) + '&gender=' + encodeURIComponent(cfg.gender);\nvar menuLoaded = false;\ntry{\n  var menu = JSON.parse(String(java.ajax(menuUrl)));\n  if(Array.isArray(menu) && menu.length > 0){\n    out = out.concat(menu);\n    menuLoaded = true;\n    try{\n      var sv = {};\n      try{ sv = JSON.parse(source.getVariable() || '{}'); }catch(e){}\n      sv._exploreCache = JSON.stringify(menu);\n      source.setVariable(JSON.stringify(sv));\n    }catch(e){}\n  }\n}catch(e){}\nif(!menuLoaded){\n  var cached = '';\n  try{\n    var sv = JSON.parse(source.getVariable() || '{}');\n    cached = sv._exploreCache || '';\n  }catch(e){}\n  if(cached){\n    try{\n      var cm = JSON.parse(cached);\n      if(Array.isArray(cm) && cm.length > 0){\n        out = out.concat(cm);\n        menuLoaded = true;\n      }\n    }catch(e){}\n  }\n}\nif(!menuLoaded){\n  var bt = encodeURIComponent(tab);\n  var bp = encodeURIComponent(plat);\n  var ranks = ['推荐榜','完本榜','热门榜','新书榜'];\n  for(var ri=0; ri<ranks.length; ri++){\n    out.push({title:ranks[ri], url:host+'/legado/explore/data?source='+bp+'&tab='+bt+'&bdtype='+encodeURIComponent(ranks[ri])+'&gender='+gd+'&is_ranking=1&page={{page}}', style:{layout_flexGrow:1, layout_flexBasisPercent:0.25}});\n  }\n}\nJSON.stringify(out);\n}catch(e){\n  JSON.stringify([{title:'发现页加载失败，下拉刷新重试', url:'', style:{layout_flexGrow:1, layout_flexBasisPercent:1}}]);\n}\n</js>", "header": "@js:try{var v=JSON.parse(source.getVariable()||'{}');v.token?JSON.stringify({'Authorization':'Bearer '+v.token,'User-Agent':'Legado/3.0'}):JSON.stringify({'User-Agent':'Legado/3.0'});}catch(e){JSON.stringify({'User-Agent':'Legado/3.0'});}", "jsLib": "\nvar host = 'https://moyue.app';\n\nfunction J(r){ if(typeof r==='string'){ try{return JSON.parse(r);}catch(e){ return {}; } } return r||{}; }\nfunction detailUrlOf(bu){ return host+'/legado/detail?url='+encodeURIComponent(bu); }\nfunction tocUrlOf(bu){ return host+'/legado/toc?url='+encodeURIComponent(bu); }\n\nfunction contentUrlOf(cu){ return host+'/legado/content?url='+encodeURIComponent(cu)+'&fmt=legado'; }\nfunction PLATNAME(p){ return String(p||'').replace(/\\(VIP\\)$/,''); }\n\n\n\nfunction SRCLIST(j, tab){\n  var out=['全部'];\n  try{\n    var a=(j&&j[tab])||[];\n    for(var i=0;i<a.length;i++){ out.push(a[i].n + (a[i].v ? '(VIP)' : '')); }\n  }catch(e){}\n  if(out.length<2){ out.push('番茄'); }\n  return out;\n}\nfunction SRCFG(src){\n  var v={};\n  try{ v=JSON.parse(src.getVariable()||'{}')||{}; }catch(e){ v={}; }\n  var m=null;\n  try{ m=src.getLoginInfoMap(); }catch(e){ m=null; }\n  function pick(k,d){\n    if(v[k]){ return String(v[k]); }\n    if(m){ try{ var x=m.get(k); if(x){ return String(x); } }catch(e){} }\n    return d;\n  }\n  var h=String(v.host||'').trim();\n  if(!h && m){ try{ var lh=m.get('线路'); if(lh){ h=String(lh); } }catch(e){} }\n  if(!h){ h=host; }\n  if(h.indexOf('http')!=0){ h='http://'+h; }\n  return { host:h, gender:pick('频道','男频'), platform:pick('平台','全部'), mode:pick('模式','小说') };\n}\nfunction SRSHOW(m, t){\n  var j=this.java, s=this.source;\n  var data={};\n  try{ data=JSON.parse(s.getVariable()||'{}')||{}; }catch(e){ data={}; }\n  data[t]=m;\n  s.setVariable(JSON.stringify(data));\n  j.refreshExplore();\n}\nfunction SRFLT(title, chars, def, key, size){\n  return { title:title, type:'select', chars:chars, default:def,\n    action:\"SRSHOW(infoMap['\"+title+\"'],'\"+key+\"')\",\n    style:{layout_flexGrow:1, layout_flexBasisPercent:size} };\n}\nfunction SRHDR(title){\n  return { title:title, url:'', style:{layout_flexGrow:1, layout_flexBasisPercent:1} };\n}\n\n\n\n\n\n\nfunction probe() {\n    var java = this.java;\n    var source = this.source;\n\n    try {\n        if (typeof java.showReadingBrowser == 'function') {\n            return \"ios\";\n        }\n    } catch (e) {}\n\n    try {\n        if (typeof java.reLoginView == 'function') {\n            return \"panel\";\n        }\n        new Packages.io.legado.kazusa.utils.TimeoutCancellationException('');\n        return \"panel\";\n    } catch (e) {}\n\n    try {\n        if (typeof source.loginUi == 'function') {\n            return \"browser\";\n        }\n    } catch (e) {}\n\n    return \"panel\";\n}\n\nfunction openReview(url, sources, ident) {\n    var java = this.java;\n    if (ident == null) ident = '段评';\n    var rt = this.probe();\n    if (rt == \"panel\") {\n        var htmlContent = '';\n        try {\n            htmlContent = java.ajax(url);\n        } catch (e) {}\n        try {\n        java.showBrowser(\n            url,\n            htmlContent,\n            'window.java=java;',\n            JSON.stringify({\n                \"expandedCornersRadius\": 20,\n                \"dismissOnTouchOutside\": true,\n                \"isDraggable\": true,\n                \"shouldDimBackground\": true,\n                \"backgroundDimAmount\": 0.5,\n                \"hardwareAccelerated\": true,\n                \"isNestedScrollingEnabled\": true,\n                \"isGestureInsetBottomIgnored\": true,\n                \"setFitToContents\": true,\n                \"isHideable\": true,\n                \"heightPercentage\": 0.8\n            })\n        );\n        } catch (e) {\n            java.startBrowser(url, sources + ident);\n        }\n    } else {\n        try { java.showReadingBrowser(url, sources + ident); return; } catch (e) {}\n        java.startBrowser(url, sources + ident);\n    }\n}\n\nfunction godOpen(u, t) { try { java.showReadingBrowser(u, t); return; } catch (e) {} try { java.startBrowser(u, t); } catch (e) {} }\n", "lastUpdateTime": "1791698189724", "loginCheckJs": "if(result.code()==401||String(result.body()).indexOf('40101')>=0){source.login();java.getStrResponse();}else{result;}", "loginUi": "[{\"name\": \"邮箱\", \"type\": \"text\", \"default\": \"\"}, {\"name\": \"密码\", \"type\": \"password\", \"default\": \"\"}, {\"name\": \"登录墨阅\", \"type\": \"button\", \"action\": \"login(true)\"}, {\"name\": \"📝注册账号\", \"type\": \"button\", \"action\": \"java.startBrowserAwait((function(){var b='';try{b=String((JSON.parse(source.getVariable()||'{}')||{}).host||'');}catch(e){}return b||((typeof host!=='undefined'&&host)?host:'https://moyue.app');})()+'/register','注册墨阅账号')\"}, {\"name\": \"个人中心\", \"type\": \"button\", \"action\": \"(function(){var v={};try{v=JSON.parse(source.getVariable()||'{}');}catch(e){}var t=String(v.token||'');if(!t){java.toast('请先登录书源账号');return;}var bh=String(v.host||'')||((typeof host!=='undefined'&&host)?host:'https://moyue.app');java.startBrowser(bh+'/user/token-login?token='+encodeURIComponent(t),'墨阅·个人中心');})()\"}, {\"name\": \"退出登录\", \"type\": \"button\", \"action\": \"(function(){var v={};try{v=JSON.parse(source.getVariable()||'{}');}catch(e){}delete v.token;source.setVariable(JSON.stringify(v));java.toast('已退出登录');})()\"}]", "loginUrl": "function login(flag){\n  if(flag===undefined){\n    try{ result=JSON.parse(source.getLoginInfo()||'{}'); }catch(e){ result={}; }\n  }else{\n    try{ source.putLoginInfo(JSON.stringify(result)); result=JSON.parse(source.getLoginInfo()||'{}'); }catch(e){ result={}; }\n  }\n  var email=String(result['邮箱']||'');\n  var pwd=String(result['密码']||'');\n  if(!email||!pwd){ java.longToast('请填写邮箱和密码'); throw '请填写邮箱和密码'; }\n  var hh='';try{hh=String((JSON.parse(source.getVariable()||'{}')||{}).host||'').trim();}catch(e){}\n  if(!hh){ try{ hh=String(result['线路']||'').trim(); }catch(e){} }\n  if(!hh){ hh=(typeof host!=='undefined')?host:''; }\n  if(hh.indexOf('http')!=0){ hh='http://'+hh; }\n  var opt=JSON.stringify({method:'POST',body:JSON.stringify({email:email,password:pwd}),headers:{'Content-Type':'application/json'}});\n  java.longToast('正在登录…');\n  var resp=java.ajax(hh+'/legado/login,'+opt);\n  var j=JSON.parse(resp);\n  if(j && j.code==200 && j.data && j.data.token){\n    var vv={};try{vv=JSON.parse(source.getVariable()||'{}');}catch(e){}\n    vv.token=j.data.token; vv.host=hh;\n    source.setVariable(JSON.stringify(vv));\n    java.longToast('登录成功'+((j.data.user&&j.data.user.nickname)?('：'+j.data.user.nickname):''));\n  }else{\n    var em=(j&&j.msg)||'登录失败'; java.longToast(em); throw em;\n  }\n}", "respondTime": 180000, "ruleBookInfo": {"author": "$.author", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "{{$.origin}} {{$.kind}}", "lastChapter": "$.lastChapter", "name": "$.name", "tocUrl": "<js>\nvar b = J(result);\nif(!b.bookUrl){ throw '详情bookUrl为空:' + String(result).substring(0,60); }\ntry{ book.type = b.bookType || 8; }catch(e){}\nhost + '/legado/toc?url=' + encodeURIComponent(b.bookUrl);\n</js>", "wordCount": "$.wordCount"}, "ruleContent": {"content": "<js>\nvar r = J(result);\nif(r.error){ throw r.error; }\ntry{ book.type = r.bookType || 8; }catch(e){}\nvar out;\nif(r.playUrl){\n  try{ java.startBrowser(r.playUrl, String(book.name||'短剧播放')); java.toast('正在打开播放器，支持选集/倍速/自动连播'); }catch(e){}\n  out = '【正在打开播放器】支持选集/倍速/自动连播';\n}else{\n  out = (r.lines||[]).join('\\n');\n  try{\n    var pf = 'panel';\n    try{ pf = probe.call(this) || 'panel'; }catch(e1){}\n    var rr = java.ajax(host + '/legado/render?pf=' + pf + ',' + JSON.stringify({method:'POST', body: out, headers:{'Content-Type':'text/plain;charset=utf-8'}}));\n    rr = String(rr||'');\n    if(rr && rr.indexOf('error') < 0){ out = rr; }\n  }catch(e2){}\n}\nout;\n</js>", "imageStyle": "full"}, "ruleExplore": {"author": "$.author", "bookList": "$", "bookUrl": "<js>detailUrlOf(J(result).bookUrl)</js>", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "{{$.origin}} {{$.kind}}", "lastChapter": "$.lastChapter", "name": "$.name", "wordCount": "$.wordCount"}, "ruleSearch": {"author": "$.author", "bookList": "$", "bookUrl": "<js>detailUrlOf(J(result).bookUrl)</js>", "checkKeyWord": "斗破苍穹", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "{{$.origin}} {{$.kind}}", "lastChapter": "$.lastChapter", "name": "$.name", "wordCount": "$.wordCount"}, "ruleToc": {"chapterList": "<js>\nvar r = JSON.parse(String(result));\nif(!Array.isArray(r) || r.length === 0){ throw '目录为空:' + String(result).substring(0,60); }\ntry{ book.type = r[0].bookType || 8; }catch(e){}\nJSON.stringify(r);\n</js>$[*]", "chapterName": "$.title", "chapterUrl": "<js>contentUrlOf(J(result).url)</js>", "isVolume": "<js>J(result).isVolume===true</js>"}, "searchUrl": "<js>\nvar cfg = SRCFG(source);\nvar tab = cfg.mode || '小说';\nhost + '/legado/search?key=' + encodeURIComponent(key) + '&page=' + page + '&tab=' + encodeURIComponent(tab) + '&source=' + encodeURIComponent(PLATNAME(cfg.platform));\n</js>", "weight": 0},{"bookSourceComment": "by ljun223 修复目录和正文 2026/06/10\nby天天的鸟蛋蛋 2025/04/20\n使用明月大佬的多线路选择器\n新包子漫画", "bookSourceGroup": "漫画", "bookSourceName": "G社漫画/包子漫画", "bookSourceType": 2, "bookSourceUrl": "https://manhuafree.com", "customButton": false, "customOrder": 171, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\":\"---------✨分类------------\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"全部\",\"url\":\"{{bhost()}}/manga/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"韩漫\",\"url\":\"{{bhost()}}/manga-genre/kr/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"热门\",\"url\":\"{{bhost()}}/manga-genre/hots/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"国漫\",\"url\":\"{{bhost()}}/manga-genre/cn/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"其他\",\"url\":\"{{bhost()}}/manga-genre/qita/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"日漫\",\"url\":\"{{bhost()}}/manga-genre/jp/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"欧美\",\"url\":\"{{bhost()}}/manga-genre/ou-mei/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"---------🔥热门标签------------\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"#复仇\",\"url\":\"{{bhost()}}/manga-tag/fuchou/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#古风\",\"url\":\"{{bhost()}}/manga-tag/gufeng/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#奇幻\",\"url\":\"{{bhost()}}/manga-tag/qihuan/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#逆袭\",\"url\":\"{{bhost()}}/manga-tag/nixi/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#异能\",\"url\":\"{{bhost()}}/manga-tag/yineng/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#宅向\",\"url\":\"{{bhost()}}/manga-tag/zhaixiang/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#穿越\",\"url\":\"{{bhost()}}/manga-tag/chuanyue/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#热血\",\"url\":\"{{bhost()}}/manga-tag/rexue/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#纯爱\",\"url\":\"{{bhost()}}/manga-tag/chunai/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#系统\",\"url\":\"{{bhost()}}/manga-tag/xitong/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#重生\",\"url\":\"{{bhost()}}/manga-tag/zhongsheng/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#冒险\",\"url\":\"{{bhost()}}/manga-tag/maoxian/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#灵异\",\"url\":\"{{bhost()}}/manga-tag/lingyi/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#大女主\",\"url\":\"{{bhost()}}/manga-tag/danvzhu/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#剧情\",\"url\":\"{{bhost()}}/manga-tag/juqing/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#恋爱\",\"url\":\"{{bhost()}}/manga-tag/lianai/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#玄幻\",\"url\":\"{{bhost()}}/manga-tag/xuanhuan/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#女神\",\"url\":\"{{bhost()}}/manga-tag/nvshen/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#科幻\",\"url\":\"{{bhost()}}/manga-tag/kehuan/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#魔幻\",\"url\":\"{{bhost()}}/manga-tag/mohuan/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#推理\",\"url\":\"{{bhost()}}/manga-tag/tuili/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#猎奇\",\"url\":\"{{bhost()}}/manga-tag/lieqi/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#治愈\",\"url\":\"{{bhost()}}/manga-tag/zhiyu/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#都市\",\"url\":\"{{bhost()}}/manga-tag/doushi/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#异形\",\"url\":\"{{bhost()}}/manga-tag/yixing/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#青春\",\"url\":\"{{bhost()}}/manga-tag/qingchun/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#末日\",\"url\":\"{{bhost()}}/manga-tag/mori/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#悬疑\",\"url\":\"{{bhost()}}/manga-tag/xuanyi/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#修仙\",\"url\":\"{{bhost()}}/manga-tag/xiuxian/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"#战斗\",\"url\":\"{{bhost()}}/manga-tag/zhandou/page/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}}]", "header": "<js>\nheaders={\"Referer\":baseUrl};\nJSON.stringify(headers)\n</js>", "jsLib": "function bhost() {\n    var d = \"manhuafree.com\",\n        s = this.source;\n    try {\n        var u = (p => p ? Object.values(p[0])[0] : d)(s.getVariable() && JSON.parse(s.getVariable())) || d;\n        return (/^https?:/.test(u) ? u : \"https://\" + u).replace(/\\/$/, \"\")\n    } catch (e) {\n        return (/^https?:/.test(d) ? d : \"https://\" + d).replace(/\\/$/, \"\")\n    }\n}", "lastUpdateTime": "1791635312774", "loginUi": "[\n{\"name\":\"多线路优选\",\"type\":\"button\",\n\"action\":\"checkHostsLatency(hosts)\"}\n]", "loginUrl": "var Importer = new JavaImporter(\n    Packages.java.net,\n    Packages.java.io,\n    Packages.java.util,\n    Packages.java.lang,\n    Packages.java.util.concurrent\n);\n\nvar hosts = [\n    \"manhuafree.com\",\n    \"m.g-mh.org\",\n    \"baozimh.org\",\n    \"bzmh.org\"\n    \n];\n\nfunction getTimestamp() {\n    return Packages.java.lang.System.currentTimeMillis();\n}\n\nfunction checkLatency(urlString) {\n    var connection = null;\n    try {\n        if (!urlString.startsWith(\"http://\") && !urlString.startsWith(\"https://\")) {\n            urlString = \"https://\" + urlString;\n        }\n        var startTime = getTimestamp();\n        var url = new Packages.java.net.URL(urlString);\n        connection = url.openConnection();\n        connection.setRequestMethod(\"GET\");\n        connection.setConnectTimeout(3000);\n        connection.setReadTimeout(3000);\n        \n        var inputStream = connection.getInputStream();\n        inputStream.close();\n        \n        var latency = getTimestamp() - startTime;\n        java.log(\"[SUCCESS] \" + urlString + \" | \" + latency + \"ms\");\n        return latency;\n    } catch (e) {\n        java.log(\"[FAILED] \" + urlString + \" | \" + e);\n        return null;\n    } finally {\n        try {\n            if (connection) connection.disconnect();\n        } catch (e) {}\n    }\n}\n\nfunction checkHostsLatency(hosts) {\n    with (Importer) {\n        try {\n            var totalStart = getTimestamp();\n            java.longToast(\"🚀 启动检测\");\n            \n            var results = [];\n            var total = hosts.length;\n            \n            for (var i = 0; i < hosts.length; i++) {\n                var host = hosts[i];\n                // 更新进度提示\n                java.longToast(\"🔍 检测中 (\" + (i+1) + \"/\" + total + \")\");\n                \n                var latency = checkLatency(host);\n                if (latency !== null) {\n                    results.push({\n                        host: host,\n                        latency: latency\n                    });\n                }\n            }\n\n            var totalTime = getTimestamp() - totalStart;\n            java.log(\"总耗时: \" + totalTime + \"ms\");\n            \n            if (results.length === 0) {\n                java.toast(\"❌ 无可用主机\");\n            } else {\n                results.sort(function(a, b) {\n                    return a.latency - b.latency;\n                });\n                \n                var best = results[0];\n                var summary = \"✅ 完成检测\\n最佳: \" + best.host + \"\\n⏱️ \" + best.latency + \"ms\";\n                java.longToast(summary);\n                let ms = \"共找到 \" + results.length + \"/\" + total + \" 可用节点\"\n                java.longToast(ms);\n                java.log(ms);\n                source.setVariable(JSON.stringify(results, null, 2));\n            }\n        } catch (e) {\n            java.log(\"[FATAL] \" + e);\n        }\n    }\n}", "respondTime": 180000, "ruleBookInfo": {"author": ".text-small@a@span@text##\\s", "intro": "<js>\nvar novelIntro=({title,author,genre,score,desc})=>['','✧*̥₊˚‧☆･ﾟ'.repeat(3),`📖书名：《${title}》`,`👤作者：${author}`,`🏷️类型：${genre}`,`✨最新章节：${latestChapterTitle}`,'✦ ─────────────── ✦',`${desc}`,'❈'.padEnd(20,'～*')].join('\\n').replace(/^/gm,'　　');\nvar latestChapterTitle=`{{@@.my-unit-md@span@text}}`\nvar intro=`{{@@.text-medium@text##最近章節}}`\nnovelIntro({\n    \"title\": book.name,\n    \"author\": book.author,\n    \"genre\": book.kind,\n    \"latestChapterTitle\":latestChapterTitle,\n    \"desc\": intro\n})\n</js>##(^|[。！？]+[”」）】]?)##$1<br>", "kind": ".text-sm:nth-child(3)>a@text&&.text-xl@span@text&&.py-1:nth-child(4) > a:nth-child(n+1)@text<js>java.t2s(result);</js>##\\[|\\]", "lastChapter": ".my-unit-md@span@text", "name": ".text-xl@textNodes", "tocUrl": "<js>\n\nvar mid=src.match(/data\\-mid\\=\"(\\d+)\"/)[1];\njava.put(\"mid\",mid)\nvar r=`https://api-get-v3.mgsearcher.com/api/manga/get?mid=${mid}&mode=all`\nr;\n\n</js>"}, "ruleContent": {"content": "<js>\nvar data=JSON.parse(result)\nvar encrypted=data.data.info.images.images;\n\n\nfunction decryptImages(encrypted) {\n    var prefix = \"J7r\";\n    var suffix = \"nQ\";\n    var kD = \"kD\";\n    var W4s = \"W4s\";\n    var STEP = 7;\n\n    // 注意：这两个字符串必须完全一致，一个字符都不能少/错\n    // source 用来 indexOf\n    var source = \"_-9876543210abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n    // target 用来取字符\n    var target = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\n\n  //  java.log(\"source.len=\" + source.length + \" target.len=\" + target.length); // 都应该是 64\n\n    if (!encrypted.startsWith(prefix) || !encrypted.endsWith(suffix)) {\n        throw new Error(\"x2 prefix/suffix\");\n    }\n\n    var body = encrypted.slice(prefix.length, encrypted.length - suffix.length);\n    var L = body.length - kD.length - W4s.length;\n    var cols = Math.floor(L / 3);\n    var rem2 = Math.floor((L - cols) / 2);\n    var rest = L - cols - rem2;\n\n   // java.log(\"L=\" + L + \" cols=\" + cols + \" rem2=\" + rem2 + \" rest=\" + rest);\n\n    var a = body.slice(0, rem2);\n    var b = body.slice(rem2, rem2 + 2);\n    var c = body.slice(rem2 + 2, rem2 + 2 + rest);\n    var d = body.slice(rem2 + 2 + rest, rem2 + 2 + rest + 3);\n    var e = body.slice(rem2 + 2 + rest + 3);\n\n   // java.log(\"b=\" + b + \" d=\" + d + \" e.len=\" + e.length);\n    if (b !== kD || d !== W4s || e.length !== cols) {\n        throw new Error(\"x4 marker\");\n    }\n\n    // 1. 拼接\n    var input = e + a + c;\n    java.log(\"input[0..40]=\" + input.slice(0, 40));\n\n    // 2. 每 7 字符一组，奇数索引反转\n    var swapped = \"\";\n    for (var i = 0, gi = 0; i < input.length; i += STEP, gi++) {\n        var part = input.slice(i, i + STEP);\n        if (gi % 2 === 1) {\n            part = part.split(\"\").reverse().join(\"\");\n        }\n        swapped += part;\n    }\n    //java.log(\"swapped[0..40]=\" + swapped.slice(0, 40));\n\n    // 3. 映射（这里最容易出问题）\n    var mapped = \"\";\n    for (var j = 0; j < swapped.length; j++) {\n        var ch = swapped.charAt(j);          // 用 charAt 更稳\n        var idx = source.indexOf(ch);\n        if (idx < 0) {\n            java.log(\"bad char at \" + j + \" : [\" + ch + \"] code=\" + ch.charCodeAt(0));\n            throw new Error(\"x1\");\n        }\n        mapped += target.charAt(idx);\n    }\n\n   // java.log(\"mapped[0..60]=\" + mapped.slice(0, 60));\n    // 正常应该类似：W3sib3JkZXIiOjAsInVybCI6Ii9ocC9tYW5qaXdhbmppYWRlZGk...\n\n    // 4. base64url → 标准 base64\n    var b64 = mapped.replace(/-/g, \"+\").replace(/_/g, \"/\");\n    while (b64.length % 4 !== 0) b64 += \"=\";\n    var jsonStr=java.base64Decode(b64);\n    return JSON.parse(jsonStr)\n}\n\nvar imageList=decryptImages(encrypted)\n//java.log(imageList)\n\nvar imgTags = imageList.map(item => `<img src=\"https://t-nd2-1.6wm.top${item.url}\">`).join('\\n');\nimgTags;\n\n</js>"}, "ruleExplore": [], "ruleSearch": {"bookList": ".grid-cols-3@.pb-2", "bookUrl": "a@href", "coverUrl": "img@src", "name": "h3@text"}, "ruleToc": {"chapterList": ".chapters[*]", "chapterName": ".title", "chapterUrl": "<js>\nvar mid=java.get(\"mid\")\nvar id=`{{$..id}}`\nvar r=`https://v2.apikk.top/api/v2/chapter/getinfo?m=${mid}&c=${id}`\nr;\n</js>", "updateTime": ".updatedAt"}, "searchUrl": "{{bhost()}}/s/{{key}}?page={{page}}", "weight": 0},{"bookSourceGroup": "墨阅", "bookSourceType": 0, "bookSourceUrl": "moyue://rapid", "customOrder": 1, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "header": "@js:try{var v=JSON.parse(source.getVariable()||'{}');v.token?JSON.stringify({'Authorization':'Bearer '+v.token,'User-Agent':'Legado/3.0'}):JSON.stringify({'User-Agent':'Legado/3.0'});}catch(e){JSON.stringify({'User-Agent':'Legado/3.0'});}", "lastUpdateTime": "1791628680853", "loginCheckJs": "if(result.code()==401||String(result.body()).indexOf('40101')>=0){source.login();java.getStrResponse();}else{result;}", "respondTime": 180000, "ruleBookInfo": {"name": "$.name", "author": "$.author", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "{{$.origin}} {{$.kind}}", "lastChapter": "$.lastChapter", "tocUrl": "<js>\nvar b = J(result);\nif(!b.bookUrl){ throw '详情bookUrl为空:' + String(result).substring(0,60); }\ntry{ book.type = b.bookType || 8; }catch(e){}\nhost + '/legado/toc?url=' + encodeURIComponent(b.bookUrl);\n</js>", "wordCount": "$.wordCount"}, "ruleContent": {"content": "<js>\nvar r = J(result);\nif(r.error){ throw r.error; }\ntry{ book.type = r.bookType || 8; }catch(e){}\nvar out;\nif(r.playUrl){\n  try{ java.startBrowser(r.playUrl, String(book.name||'短剧播放')); java.toast('正在打开播放器，支持选集/倍速/自动连播'); }catch(e){}\n  out = '【正在打开播放器】支持选集/倍速/自动连播';\n}else{\n  out = (r.lines||[]).join('\\n');\n  try{\n    var pf = 'panel';\n    try{ pf = probe.call(this) || 'panel'; }catch(e1){}\n    var rr = java.ajax(host + '/legado/render?pf=' + pf + ',' + JSON.stringify({method:'POST', body: out, headers:{'Content-Type':'text/plain;charset=utf-8'}}));\n    rr = String(rr||'');\n    if(rr && rr.indexOf('error') < 0){ out = rr; }\n  }catch(e2){}\n}\nout;\n</js>", "imageStyle": "full"}, "ruleExplore": {"author": "$.author", "bookList": "$", "bookUrl": "<js>detailUrlOf(J(result).bookUrl)</js>", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "{{$.origin}} {{$.kind}}", "lastChapter": "$.lastChapter", "name": "$.name", "wordCount": "$.wordCount"}, "ruleReview": {"reviewList": "$.list", "avatarRule": "$.avatar", "contentRule": "$.content", "postTimeRule": "$.time", "reviewUrl": "<js>host+'/legado/review/chapter?url='+String(chapterUrl).split('url=')[1].split('&')[0]</js>"}, "ruleSearch": {"author": "$.author", "bookList": "$", "bookUrl": "<js>detailUrlOf(J(result).bookUrl)</js>", "checkKeyWord": "斗破苍穹", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "{{$.origin}} {{$.kind}}", "lastChapter": "$.lastChapter", "name": "$.name", "wordCount": "$.wordCount"}, "ruleToc": {"chapterList": "<js>\nvar r = JSON.parse(String(result));\nif(!Array.isArray(r) || r.length === 0){ throw '目录为空:' + String(result).substring(0,60); }\ntry{ book.type = r[0].bookType || 8; }catch(e){}\nJSON.stringify(r);\n</js>$[*]", "chapterName": "$.title", "chapterUrl": "<js>contentUrlOf(J(result).url)</js>", "isVolume": "<js>J(result).isVolume===true</js>"}, "weight": 0, "jsLib": "\nvar host = 'http://192.168.2.18:8080';\n\nfunction J(r){ if(typeof r==='string'){ try{return JSON.parse(r);}catch(e){ return {}; } } return r||{}; }\nfunction detailUrlOf(bu){ return host+'/legado/detail?url='+encodeURIComponent(bu); }\nfunction tocUrlOf(bu){ return host+'/legado/toc?url='+encodeURIComponent(bu); }\n\nfunction contentUrlOf(cu){ return host+'/legado/content?url='+encodeURIComponent(cu)+'&fmt=legado'; }\nfunction PLATNAME(p){ return String(p||'').replace(/\\(VIP\\)$/,''); }\n\n\n\nfunction SRCLIST(j, tab){\n  var out=['全部'];\n  try{\n    var a=(j&&j[tab])||[];\n    for(var i=0;i<a.length;i++){ out.push(a[i].n + (a[i].v ? '(VIP)' : '')); }\n  }catch(e){}\n  if(out.length<2){ out.push('番茄'); }\n  return out;\n}\nfunction SRCFG(src){\n  var v={};\n  try{ v=JSON.parse(src.getVariable()||'{}')||{}; }catch(e){ v={}; }\n  var m=null;\n  try{ m=src.getLoginInfoMap(); }catch(e){ m=null; }\n  function pick(k,d){\n    if(v[k]){ return String(v[k]); }\n    if(m){ try{ var x=m.get(k); if(x){ return String(x); } }catch(e){} }\n    return d;\n  }\n  var h=String(v.host||'').trim();\n  if(!h && m){ try{ var lh=m.get('线路'); if(lh){ h=String(lh); } }catch(e){} }\n  if(!h){ h=host; }\n  if(h.indexOf('http')!=0){ h='http://'+h; }\n  return { host:h, gender:pick('频道','男频'), platform:pick('平台','番茄'), mode:pick('模式','小说') };\n}\nfunction SRSHOW(m, t){\n  var j=this.java, s=this.source;\n  var data={};\n  try{ data=JSON.parse(s.getVariable()||'{}')||{}; }catch(e){ data={}; }\n  data[t]=m;\n  s.setVariable(JSON.stringify(data));\n  j.refreshExplore();\n}\nfunction SRFLT(title, chars, def, key, size){\n  return { title:title, type:'select', chars:chars, default:def,\n    action:\"SRSHOW(infoMap['\"+title+\"'],'\"+key+\"')\",\n    style:{layout_flexGrow:1, layout_flexBasisPercent:size} };\n}\nfunction SRHDR(title){\n  return { title:title, url:'', style:{layout_flexGrow:1, layout_flexBasisPercent:1} };\n}\n\n\n\n\n\n\nfunction probe() {\n    var java = this.java;\n    var source = this.source;\n\n    try {\n        if (typeof java.showReadingBrowser == 'function') {\n            return \"ios\";\n        }\n    } catch (e) {}\n\n    try {\n        if (typeof java.reLoginView == 'function') {\n            return \"panel\";\n        }\n        new Packages.io.legado.kazusa.utils.TimeoutCancellationException('');\n        return \"panel\";\n    } catch (e) {}\n\n    try {\n        if (typeof source.loginUi == 'function') {\n            return \"browser\";\n        }\n    } catch (e) {}\n\n    return \"panel\";\n}\n\nfunction openReview(url, sources, ident) {\n    var java = this.java;\n    if (ident == null) ident = '段评';\n    var rt = this.probe();\n    if (rt == \"panel\") {\n        var htmlContent = '';\n        try {\n            htmlContent = java.ajax(url);\n        } catch (e) {}\n        try {\n        java.showBrowser(\n            url,\n            htmlContent,\n            'window.java=java;',\n            JSON.stringify({\n                \"expandedCornersRadius\": 20,\n                \"dismissOnTouchOutside\": true,\n                \"isDraggable\": true,\n                \"shouldDimBackground\": true,\n                \"backgroundDimAmount\": 0.5,\n                \"hardwareAccelerated\": true,\n                \"isNestedScrollingEnabled\": true,\n                \"isGestureInsetBottomIgnored\": true,\n                \"setFitToContents\": true,\n                \"isHideable\": true,\n                \"heightPercentage\": 0.8\n            })\n        );\n        } catch (e) {\n            java.startBrowser(url, sources + ident);\n        }\n    } else {\n        try { java.showReadingBrowser(url, sources + ident); return; } catch (e) {}\n        java.startBrowser(url, sources + ident);\n    }\n}\n\nfunction godOpen(u, t) { try { java.showReadingBrowser(u, t); return; } catch (e) {} try { java.startBrowser(u, t); } catch (e) {} }\n", "searchUrl": "<js>\nvar cfg = SRCFG(source);\nvar tab = cfg.mode || '小说';\nhost + '/legado/search?key=' + encodeURIComponent(key) + '&page=' + page + '&tab=' + encodeURIComponent(tab) + '&source=' + encodeURIComponent(PLATNAME(cfg.platform));\n</js>", "loginUi": "[{\"name\": \"邮箱\", \"type\": \"text\", \"default\": \"\"}, {\"name\": \"密码\", \"type\": \"password\", \"default\": \"\"}, {\"name\": \"登录墨阅\", \"type\": \"button\", \"action\": \"source.login()\"}, {\"name\": \"个人中心\", \"type\": \"button\", \"action\": \"(function(){var v={};try{v=JSON.parse(source.getVariable()||'{}');}catch(e){}var t=String(v.token||'');if(!t){java.toast('请先登录书源账号');return;}java.startBrowser(((typeof host!=='undefined'&&host)?host:'http://192.168.2.18:8080')+'/user/token-login?token='+encodeURIComponent(t),'墨阅·个人中心');})()\"}, {\"name\": \"退出登录\", \"type\": \"button\", \"action\": \"(function(){var v={};try{v=JSON.parse(source.getVariable()||'{}');}catch(e){}delete v.token;source.setVariable(JSON.stringify(v));java.toast('已退出登录');})()\"}]", "loginUrl": "function login(){\n  var info=source.getLoginInfoMap();\n  var email=String(info.get('邮箱')||'');\n  var pwd=String(info.get('密码')||'');\n  if(!email||!pwd){throw '请填写邮箱和密码';}\n  var opt=JSON.stringify({method:'POST',body:JSON.stringify({email:email,password:pwd}),headers:{'Content-Type':'application/json'}});var hh=String(info.get('线路')||'').trim()||host;if(hh.indexOf('http')!=0){hh='http://'+hh;}var resp=java.ajax(hh+'/legado/login,'+opt);\n  var j=JSON.parse(resp);\n  if(j && j.code==200 && j.data && j.data.token){\n    var vv={};try{vv=JSON.parse(source.getVariable()||'{}');}catch(e){}vv.token=j.data.token;source.setVariable(JSON.stringify(vv));\n    java.longToast('登录成功'+((j.data.user&&j.data.user.nickname)?('：'+j.data.user.nickname):''));\n  }else{\n    throw (j&&j.msg)||'登录失败';\n  }\n}", "bookSourceName": "📖墨阅聚合·极速", "bookSourceComment": "", "exploreUrl": "<js>\ntry{\nvar cfg = SRCFG(source);\nvar modes = ['小说','听书','漫画','短剧'];\nvar tab = cfg.mode || '小说';\nif(modes.indexOf(tab) < 0){ tab = '小说'; }\nvar srcList = {};\ntry{ srcList = JSON.parse(String(java.ajax(host + '/legado/sources'))); }catch(e){}\nvar plats = SRCLIST(srcList, tab);\nvar out = [];\nout.push(SRFLT('模式', modes, tab, '模式', 1));\nout.push(SRFLT('平台', plats, cfg.platform, '平台', 1));\nif(tab == '小说'){\n  out.push(SRFLT('频道', ['男频','女频'], cfg.gender, '频道', 1));\n}\nvar plat = (cfg.platform=='' || cfg.platform=='全部' || plats.indexOf(cfg.platform)<0) ? '番茄' : PLATNAME(cfg.platform);\nvar gd = (cfg.gender == '女频') ? 2 : 1;\nvar menuUrl = host + '/legado/explore/menu?tab=' + encodeURIComponent(tab) + '&source=' + encodeURIComponent(plat) + '&gender=' + encodeURIComponent(cfg.gender);\nvar menuLoaded = false;\ntry{\n  var menu = JSON.parse(String(java.ajax(menuUrl)));\n  if(Array.isArray(menu) && menu.length > 0){\n    out = out.concat(menu);\n    menuLoaded = true;\n    try{\n      var sv = {};\n      try{ sv = JSON.parse(source.getVariable() || '{}'); }catch(e){}\n      sv._exploreCache = JSON.stringify(menu);\n      source.setVariable(JSON.stringify(sv));\n    }catch(e){}\n  }\n}catch(e){}\nif(!menuLoaded){\n  var cached = '';\n  try{\n    var sv = JSON.parse(source.getVariable() || '{}');\n    cached = sv._exploreCache || '';\n  }catch(e){}\n  if(cached){\n    try{\n      var cm = JSON.parse(cached);\n      if(Array.isArray(cm) && cm.length > 0){\n        out = out.concat(cm);\n        menuLoaded = true;\n      }\n    }catch(e){}\n  }\n}\nif(!menuLoaded){\n  var bt = encodeURIComponent(tab);\n  var bp = encodeURIComponent(plat);\n  var ranks = ['推荐榜','完本榜','热门榜','新书榜'];\n  for(var ri=0; ri<ranks.length; ri++){\n    out.push({title:ranks[ri], url:host+'/legado/explore/data?source='+bp+'&tab='+bt+'&bdtype='+encodeURIComponent(ranks[ri])+'&gender='+gd+'&is_ranking=1&page={{page}}', style:{layout_flexGrow:1, layout_flexBasisPercent:0.25}});\n  }\n}\nJSON.stringify(out);\n}catch(e){\n  JSON.stringify([{title:'发现页加载失败，下拉刷新重试', url:'', style:{layout_flexGrow:1, layout_flexBasisPercent:1}}]);\n}\n</js>"},{"bookSourceComment": "by阿鬼\n详情页规则、目录规则以及正文规则——261009已修！", "bookSourceGroup": "[24.12.05已修]", "bookSourceName": "🔞腐小说", "bookSourceType": 0, "bookSourceUrl": "https://fxshu.org", "customButton": false, "customOrder": 92, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "✧✧✧✧✧✧阿鬼个人专属✧✧✧✧✧✧\n♛催眠::/tags.php?/%E5%82%AC%E7%9C%A0/\n★破镜重圆::/tags.php?/%E7%A0%B4%E9%95%9C%E9%87%8D%E5%9C%86/\n★虐文::/tags.php?/%E8%99%90%E6%96%87/\n★强强::/tags.php?/%E5%BC%BA%E5%BC%BA/\n★黑帮情仇::/tags.php?/%E9%BB%91%E5%B8%AE%E6%83%85%E4%BB%87/\n★警察::/tags.php?/%E8%AD%A6%E5%AF%9F/\n★高干::/tags.php?/%E9%AB%98%E5%B9%B2/\n★制服诱惑::/tags.php?/%E5%88%B6%E6%9C%8D%E8%AF%B1%E6%83%91/\n★年下::/tags.php?/%E5%B9%B4%E4%B8%8B/\n★父子::/tags.php?/%E7%88%B6%E5%AD%90/\n★兄弟::/tags.php?/%E5%85%84%E5%BC%9F/\n★宠溺::/tags.php?/%E5%AE%A0%E6%BA%BA/\n★业界精英::/tags.php?/%E4%B8%9A%E7%95%8C%E7%B2%BE%E8%8B%B1/\n★虐恋情深::/tags.php?/%E8%99%90%E6%81%8B%E6%83%85%E6%B7%B1/\n★不伦之恋::/tags.php?/%E4%B8%8D%E4%BC%A6%E4%B9%8B%E6%81%8B/\n★年上::/tags.php?/%E5%B9%B4%E4%B8%8A/\n★肉沫::/tags.php?/%E8%82%89%E6%B2%AB/\n★BE::/tags.php?/BE/\n★黑道情仇::/tags.php?/%E9%BB%91%E9%81%93%E6%83%85%E4%BB%87/\n★制服情缘::/tags.php?/%E5%88%B6%E6%9C%8D%E6%83%85%E7%BC%98/\n★有虐::/tags.php?/%E6%9C%89%E8%99%90/\n1V1::/tags.php?/1V1/\n★互宠::/tags.php?/%E4%BA%92%E5%AE%A0/\n★强攻强受::/tags.php?/%E5%BC%BA%E6%94%BB%E5%BC%BA%E5%8F%97/\n★腹黑::/tags.php?/%E8%85%B9%E9%BB%91/\n★虐爱::/tags.php?/%E8%99%90%E7%88%B1/\n★男男::/tags.php?/%E7%94%B7%E7%94%B7/\n★BL::/tags.php?/BL/\n★耽美::/tags.php?/%E8%80%BD%E7%BE%8E/\n★虐身::/tags.php?/%E8%99%90%E8%BA%AB/\n★虐::/tags.php?/%E8%99%90/\n★小攻虐大叔::/tags.php?/%E5%B0%8F%E6%94%BB%E8%99%90%E5%A4%A7%E5%8F%94/\n★虐心::/tags.php?/%E8%99%90%E5%BF%83/\n★虐恋::/tags.php?/%E8%99%90%E6%81%8B/\n★腹黑攻::/tags.php?/%E8%85%B9%E9%BB%91%E6%94%BB/\n✧✧✧✧✧✧全部标签✧✧✧✧✧✧\n重生::/tags.php?/%E9%87%8D%E7%94%9F/\n情有独钟::/tags.php?/%E6%83%85%E6%9C%89%E7%8B%AC%E9%92%9F/\n灵异神怪::/tags.php?/%E7%81%B5%E5%BC%82%E7%A5%9E%E6%80%AA/\n经典::/tags.php?/%E7%BB%8F%E5%85%B8/\n幻想未来::/tags.php?/%E5%B9%BB%E6%83%B3%E6%9C%AA%E6%9D%A5/\n生子::/tags.php?/%E7%94%9F%E5%AD%90/\n种田::/tags.php?/%E7%A7%8D%E7%94%B0/\n都市情缘::/tags.php?/%E9%83%BD%E5%B8%82%E6%83%85%E7%BC%98/\n\n系统::/tags.php?/%E7%B3%BB%E7%BB%9F/\n风弄::/tags.php?/%E9%A3%8E%E5%BC%84/\n军旅::/tags.php?/%E5%86%9B%E6%97%85/\n全职猎人::/tags.php?/%E5%85%A8%E8%81%8C%E7%8C%8E%E4%BA%BA/\n宠文::/tags.php?/%E5%AE%A0%E6%96%87/\n搞笑::/tags.php?/%E6%90%9E%E7%AC%91/\n欢脱::/tags.php?/%E6%AC%A2%E8%84%B1/\n爽文::/tags.php?/%E7%88%BD%E6%96%87/\n美人受::/tags.php?/%E7%BE%8E%E4%BA%BA%E5%8F%97/\n强攻美受::/tags.php?/%E5%BC%BA%E6%94%BB%E7%BE%8E%E5%8F%97/\n青梅竹马::/tags.php?/%E9%9D%92%E6%A2%85%E7%AB%B9%E9%A9%AC/\n娘受::/tags.php?/%E5%A8%98%E5%8F%97/\nABO::/tags.php?/ABO/\n兽人::/tags.php?/%E5%85%BD%E4%BA%BA/\n欢喜冤家::/tags.php?/%E6%AC%A2%E5%96%9C%E5%86%A4%E5%AE%B6/\n总受::/tags.php?/%E6%80%BB%E5%8F%97/\n天作之合::/tags.php?/%E5%A4%A9%E4%BD%9C%E4%B9%8B%E5%90%88/\n甜文::/tags.php?/%E7%94%9C%E6%96%87/\n宫廷::/tags.php?/%E5%AE%AB%E5%BB%B7/\n宫斗::/tags.php?/%E5%AE%AB%E6%96%97/\ngl百合::/tags.php?/gl%E7%99%BE%E5%90%88/\n人鱼::/tags.php?/%E4%BA%BA%E9%B1%BC/\n星际::/tags.php?/%E6%98%9F%E9%99%85/\n近水楼台::/tags.php?/%E8%BF%91%E6%B0%B4%E6%A5%BC%E5%8F%B0/\n经典经典::/tags.php?/%E7%BB%8F%E5%85%B8%E7%BB%8F%E5%85%B8/\n悬疑推理::/tags.php?/%E6%82%AC%E7%96%91%E6%8E%A8%E7%90%86/\n豪门世家::/tags.php?/%E8%B1%AA%E9%97%A8%E4%B8%96%E5%AE%B6/\n双性::/tags.php?/%E5%8F%8C%E6%80%A7/\n穿越::/tags.php?/%E7%A9%BF%E8%B6%8A/\n天真受::/tags.php?/%E5%A4%A9%E7%9C%9F%E5%8F%97/\n强制::/tags.php?/%E5%BC%BA%E5%88%B6/\n打脸::/tags.php?/%E6%89%93%E8%84%B8/\n英美剧::/tags.php?/%E8%8B%B1%E7%BE%8E%E5%89%A7/\n无限流::/tags.php?/%E6%97%A0%E9%99%90%E6%B5%81/\n超级英雄::/tags.php?/%E8%B6%85%E7%BA%A7%E8%8B%B1%E9%9B%84/\n快穿::/tags.php?/%E5%BF%AB%E7%A9%BF/\n娱乐圈::/tags.php?/%E5%A8%B1%E4%B9%90%E5%9C%88/\n诱受::/tags.php?/%E8%AF%B1%E5%8F%97/\n校园::/tags.php?/%E6%A0%A1%E5%9B%AD/\n穿越时空::/tags.php?/%E7%A9%BF%E8%B6%8A%E6%97%B6%E7%A9%BA/\n励志人生::/tags.php?/%E5%8A%B1%E5%BF%97%E4%BA%BA%E7%94%9F/\n仙侠修真::/tags.php?/%E4%BB%99%E4%BE%A0%E4%BF%AE%E7%9C%9F/\n穿书::/tags.php?/%E7%A9%BF%E4%B9%A6/\n幻想::/tags.php?/%E5%B9%BB%E6%83%B3/\n忠犬攻::/tags.php?/%E5%BF%A0%E7%8A%AC%E6%94%BB/\n天之骄子::/tags.php?/%E5%A4%A9%E4%B9%8B%E9%AA%84%E5%AD%90/\n随身空间::/tags.php?/%E9%9A%8F%E8%BA%AB%E7%A9%BA%E9%97%B4/\n机甲::/tags.php?/%E6%9C%BA%E7%94%B2/\n未来架空::/tags.php?/%E6%9C%AA%E6%9D%A5%E6%9E%B6%E7%A9%BA/\n乡村爱情::/tags.php?/%E4%B9%A1%E6%9D%91%E7%88%B1%E6%83%85/\n架空::/tags.php?/%E6%9E%B6%E7%A9%BA/\n幻想空间::/tags.php?/%E5%B9%BB%E6%83%B3%E7%A9%BA%E9%97%B4/\n科幻::/tags.php?/%E7%A7%91%E5%B9%BB/\n玄幻::/tags.php?/%E7%8E%84%E5%B9%BB/\n3P::/tags.php?/3P/\n复仇::/tags.php?/%E5%A4%8D%E4%BB%87/\n魔法::/tags.php?/%E9%AD%94%E6%B3%95/\nhp同人::/tags.php?/hp%E5%90%8C%E4%BA%BA/\n红楼梦::/tags.php?/%E7%BA%A2%E6%A5%BC%E6%A2%A6/\n游戏网游::/tags.php?/%E6%B8%B8%E6%88%8F%E7%BD%91%E6%B8%B8/\n火影::/tags.php?/%E7%81%AB%E5%BD%B1/\n黑篮::/tags.php?/%E9%BB%91%E7%AF%AE/\n竞技::/tags.php?/%E7%AB%9E%E6%8A%80/\n因缘邂逅::/tags.php?/%E5%9B%A0%E7%BC%98%E9%82%82%E9%80%85/\n职场::/tags.php?/%E8%81%8C%E5%9C%BA/\n综漫::/tags.php?/%E7%BB%BC%E6%BC%AB/\n猎人::/tags.php?/%E7%8C%8E%E4%BA%BA/\n少年漫::/tags.php?/%E5%B0%91%E5%B9%B4%E6%BC%AB/\n瓶邪::/tags.php?/%E7%93%B6%E9%82%AA/\n轻松::/tags.php?/%E8%BD%BB%E6%9D%BE/\n温馨::/tags.php?/%E6%B8%A9%E9%A6%A8/\n主攻::/tags.php?/%E4%B8%BB%E6%94%BB/\n逆袭::/tags.php?/%E9%80%86%E8%A2%AD/\n武侠::/tags.php?/%E6%AD%A6%E4%BE%A0/\n养成::/tags.php?/%E5%85%BB%E6%88%90/\n异国奇缘::/tags.php?/%E5%BC%82%E5%9B%BD%E5%A5%87%E7%BC%98/\n游戏::/tags.php?/%E6%B8%B8%E6%88%8F/\n乔装改扮::/tags.php?/%E4%B9%94%E8%A3%85%E6%94%B9%E6%89%AE/\n渣攻贱受::/tags.php?/%E6%B8%A3%E6%94%BB%E8%B4%B1%E5%8F%97/\n宫廷侯爵::/tags.php?/%E5%AE%AB%E5%BB%B7%E4%BE%AF%E7%88%B5/\n美攻强受::/tags.php?/%E7%BE%8E%E6%94%BB%E5%BC%BA%E5%8F%97/\n天生一对::/tags.php?/%E5%A4%A9%E7%94%9F%E4%B8%80%E5%AF%B9/\n异能::/tags.php?/%E5%BC%82%E8%83%BD/\nMB::/tags.php?/MB/\n同人::/tags.php?/%E5%90%8C%E4%BA%BA/\n异世大陆::/tags.php?/%E5%BC%82%E4%B8%96%E5%A4%A7%E9%99%86/\n平步青云::/tags.php?/%E5%B9%B3%E6%AD%A5%E9%9D%92%E4%BA%91/\n道具::/tags.php?/%E9%81%93%E5%85%B7/\n江湖恩怨::/tags.php?/%E6%B1%9F%E6%B9%96%E6%81%A9%E6%80%A8/\n阴差阳错::/tags.php?/%E9%98%B4%E5%B7%AE%E9%98%B3%E9%94%99/\n师徒::/tags.php?/%E5%B8%88%E5%BE%92/\n互攻::/tags.php?/%E4%BA%92%E6%94%BB/\n师生::/tags.php?/%E5%B8%88%E7%94%9F/\n现代架空::/tags.php?/%E7%8E%B0%E4%BB%A3%E6%9E%B6%E7%A9%BA/\n恐怖::/tags.php?/%E6%81%90%E6%80%96/\n女强::/tags.php?/%E5%A5%B3%E5%BC%BA/\n花季雨季::/tags.php?/%E8%8A%B1%E5%AD%A3%E9%9B%A8%E5%AD%A3/\n怅然若失::/tags.php?/%E6%80%85%E7%84%B6%E8%8B%A5%E5%A4%B1/\n相爱相杀::/tags.php?/%E7%9B%B8%E7%88%B1%E7%9B%B8%E6%9D%80/\n前世今生::/tags.php?/%E5%89%8D%E4%B8%96%E4%BB%8A%E7%94%9F/\n民国旧影::/tags.php?/%E6%B0%91%E5%9B%BD%E6%97%A7%E5%BD%B1/\n末世::/tags.php?/%E6%9C%AB%E4%B8%96/\n主受::/tags.php?/%E4%B8%BB%E5%8F%97/\n三教九流::/tags.php?/%E4%B8%89%E6%95%99%E4%B9%9D%E6%B5%81/\n婚恋::/tags.php?/%E5%A9%9A%E6%81%8B/\n美食::/tags.php?/%E7%BE%8E%E9%A3%9F/\n种田文::/tags.php?/%E7%A7%8D%E7%94%B0%E6%96%87/\n灵魂转换::/tags.php?/%E7%81%B5%E9%AD%82%E8%BD%AC%E6%8D%A2/\n网配::/tags.php?/%E7%BD%91%E9%85%8D/\n性别转换::/tags.php?/%E6%80%A7%E5%88%AB%E8%BD%AC%E6%8D%A2/\n血族::/tags.php?/%E8%A1%80%E6%97%8F/\n网红::/tags.php?/%E7%BD%91%E7%BA%A2/\n奇幻魔幻::/tags.php?/%E5%A5%87%E5%B9%BB%E9%AD%94%E5%B9%BB/\n历史剧::/tags.php?/%E5%8E%86%E5%8F%B2%E5%89%A7/\n推理悬疑::/tags.php?/%E6%8E%A8%E7%90%86%E6%82%AC%E7%96%91/\n布衣生活::/tags.php?/%E5%B8%83%E8%A1%A3%E7%94%9F%E6%B4%BB/\n边缘恋歌::/tags.php?/%E8%BE%B9%E7%BC%98%E6%81%8B%E6%AD%8C/\n海贼王::/tags.php?/%E6%B5%B7%E8%B4%BC%E7%8E%8B/\n直播::/tags.php?/%E7%9B%B4%E6%92%AD/\n奥特曼::/tags.php?/%E5%A5%A5%E7%89%B9%E6%9B%BC/\n官场::/tags.php?/%E5%AE%98%E5%9C%BA/\n正剧::/tags.php?/%E6%AD%A3%E5%89%A7/\n洪荒::/tags.php?/%E6%B4%AA%E8%8D%92/\n宅斗::/tags.php?/%E5%AE%85%E6%96%97/\n游戏竞技::/tags.php?/%E6%B8%B8%E6%88%8F%E7%AB%9E%E6%8A%80/\n未来::/tags.php?/%E6%9C%AA%E6%9D%A5/\n重口::/tags.php?/%E9%87%8D%E5%8F%A3/\n哨向::/tags.php?/%E5%93%A8%E5%90%91/\n人兽::/tags.php?/%E4%BA%BA%E5%85%BD/\nSM::/tags.php?/SM/\n番外::/tags.php?/%E7%95%AA%E5%A4%96/\n古穿今::/tags.php?/%E5%8F%A4%E7%A9%BF%E4%BB%8A/\n剑三同人::/tags.php?/%E5%89%91%E4%B8%89%E5%90%8C%E4%BA%BA/\n三国::/tags.php?/%E4%B8%89%E5%9B%BD/\n短篇::/tags.php?/%E7%9F%AD%E7%AF%87/\n调教::/tags.php?/%E8%B0%83%E6%95%99/\n清穿::/tags.php?/%E6%B8%85%E7%A9%BF/\n古典名著::/tags.php?/%E5%8F%A4%E5%85%B8%E5%90%8D%E8%91%97/\n爱情战争::/tags.php?/%E7%88%B1%E6%83%85%E6%88%98%E4%BA%89/\n复仇虐渣::/tags.php?/%E5%A4%8D%E4%BB%87%E8%99%90%E6%B8%A3/\n遥远星空::/tags.php?/%E9%81%A5%E8%BF%9C%E6%98%9F%E7%A9%BA/\n美攻::/tags.php?/%E7%BE%8E%E6%94%BB/\n剑三::/tags.php?/%E5%89%91%E4%B8%89/\n喜剧::/tags.php?/%E5%96%9C%E5%89%A7/\n总攻::/tags.php?/%E6%80%BB%E6%94%BB/\n帝王受::/tags.php?/%E5%B8%9D%E7%8E%8B%E5%8F%97/\n西幻::/tags.php?/%E8%A5%BF%E5%B9%BB/\n原著向::/tags.php?/%E5%8E%9F%E8%91%97%E5%90%91/\n产乳::/tags.php?/%E4%BA%A7%E4%B9%B3/\n主奴::/tags.php?/%E4%B8%BB%E5%A5%B4/\n东方玄幻::/tags.php?/%E4%B8%9C%E6%96%B9%E7%8E%84%E5%B9%BB/\n强攻弱受::/tags.php?/%E5%BC%BA%E6%94%BB%E5%BC%B1%E5%8F%97/\n产子::/tags.php?/%E4%BA%A7%E5%AD%90/\n西游同人::/tags.php?/%E8%A5%BF%E6%B8%B8%E5%90%8C%E4%BA%BA/\n触手::/tags.php?/%E8%A7%A6%E6%89%8B/\n皇帝受::/tags.php?/%E7%9A%87%E5%B8%9D%E5%8F%97/\n女扮男装::/tags.php?/%E5%A5%B3%E6%89%AE%E7%94%B7%E8%A3%85/\n恋爱合约::/tags.php?/%E6%81%8B%E7%88%B1%E5%90%88%E7%BA%A6/\n江湖::/tags.php?/%E6%B1%9F%E6%B9%96/\n先婚后爱::/tags.php?/%E5%85%88%E5%A9%9A%E5%90%8E%E7%88%B1/\n传奇::/tags.php?/%E4%BC%A0%E5%A5%87/\n短文::/tags.php?/%E7%9F%AD%E6%96%87/\n网游::/tags.php?/%E7%BD%91%E6%B8%B8/\n七年之痒::/tags.php?/%E4%B8%83%E5%B9%B4%E4%B9%8B%E7%97%92/\n场景::/tags.php?/%E5%9C%BA%E6%99%AF/\n冰山攻::/tags.php?/%E5%86%B0%E5%B1%B1%E6%94%BB/\nHP::/tags.php?/HP/\n现代::/tags.php?/%E7%8E%B0%E4%BB%A3/\n都市生活::/tags.php?/%E9%83%BD%E5%B8%82%E7%94%9F%E6%B4%BB/\n温情::/tags.php?/%E6%B8%A9%E6%83%85/\n俊帅受::/tags.php?/%E4%BF%8A%E5%B8%85%E5%8F%97/\n宫廷江湖::/tags.php?/%E5%AE%AB%E5%BB%B7%E6%B1%9F%E6%B9%96/\n圣经::/tags.php?/%E5%9C%A3%E7%BB%8F/\n神路::/tags.php?/%E7%A5%9E%E8%B7%AF/\n双洁::/tags.php?/%E5%8F%8C%E6%B4%81/\n水楼台::/tags.php?/%E6%B0%B4%E6%A5%BC%E5%8F%B0/\n强强对抗::/tags.php?/%E5%BC%BA%E5%BC%BA%E5%AF%B9%E6%8A%97/\n赛博朋克::/tags.php?/%E8%B5%9B%E5%8D%9A%E6%9C%8B%E5%85%8B/\nHE::/tags.php?/HE/\n罗曼::/tags.php?/%E7%BD%97%E6%9B%BC/\n逗趣儿::/tags.php?/%E9%80%97%E8%B6%A3%E5%84%BF/\n攻宠受::/tags.php?/%E6%94%BB%E5%AE%A0%E5%8F%97/\n强制爱::/tags.php?/%E5%BC%BA%E5%88%B6%E7%88%B1/\n甜虐::/tags.php?/%E7%94%9C%E8%99%90/\n强攻::/tags.php?/%E5%BC%BA%E6%94%BB/\n强受::/tags.php?/%E5%BC%BA%E5%8F%97/\n万人迷::/tags.php?/%E4%B8%87%E4%BA%BA%E8%BF%B7/\n人体盛::/tags.php?/%E4%BA%BA%E4%BD%93%E7%9B%9B/\n神话::/tags.php?/%E7%A5%9E%E8%AF%9D/\n双向暗恋::/tags.php?/%E5%8F%8C%E5%90%91%E6%9A%97%E6%81%8B/\n网王::/tags.php?/%E7%BD%91%E7%8E%8B/\n弱受::/tags.php?/%E5%BC%B1%E5%8F%97/\n老师::/tags.php?/%E8%80%81%E5%B8%88/\n同居::/tags.php?/%E5%90%8C%E5%B1%85/\n隐婚::/tags.php?/%E9%9A%90%E5%A9%9A/\n大叔受::/tags.php?/%E5%A4%A7%E5%8F%94%E5%8F%97/\n西方罗曼::/tags.php?/%E8%A5%BF%E6%96%B9%E7%BD%97%E6%9B%BC/\n路归途::/tags.php?/%E8%B7%AF%E5%BD%92%E9%80%94/\n民国架空::/tags.php?/%E6%B0%91%E5%9B%BD%E6%9E%B6%E7%A9%BA/\n郁漠::/tags.php?/%E9%83%81%E6%BC%A0/\n剧情流::/tags.php?/%E5%89%A7%E6%83%85%E6%B5%81/\n改造计划::/tags.php?/%E6%94%B9%E9%80%A0%E8%AE%A1%E5%88%92/\n饥渴受::/tags.php?/%E9%A5%A5%E6%B8%B4%E5%8F%97/\n都市::/tags.php?/%E9%83%BD%E5%B8%82/\n痴情受::/tags.php?/%E7%97%B4%E6%83%85%E5%8F%97/\n\n\n", "header": "{\n\t\"Referer\":\"https://fxshu.org/\",\n\t\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13; V2148A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/128.0.6613.146 Mobile Safari/537.36\"\n\t}", "lastUpdateTime": "1791544774343", "respondTime": 181127, "ruleBookInfo": {"author": "@get:{a}", "coverUrl": "@get:{i}", "init": "@put:{\"n\":\"[property$=book_name]@content\",\n\"a\":\"[property$=author]@content\",\n\"c\":\"[property~=category|status|update_time]@content\",\n\"l\":\"[property$=latest_chapter_name]@content||[property$=lastest_chapter_name]@content\",\n\"d\":\"[property$=description]@content\",\n\"i\":\"[property$=image]@content\"}", "intro": "@get:{d}", "kind": "@get:{c}", "lastChapter": "@get:{l}", "name": "@get:{n}"}, "ruleContent": {"content": ".nt_bxz@html"}, "ruleExplore": {"author": "h2@text##.*作者：", "bookList": ".list_article li", "bookUrl": "a@href", "intro": ".desc@text", "kind": ".time@text", "name": "h2@b@text"}, "ruleSearch": {"author": ".click@text", "bookList": ".list_article@li", "bookUrl": "a[1]@href", "intro": ".desc@text", "kind": "a[0]@text", "name": "a[1]@text", "wordCount": ".time@text"}, "ruleToc": {"chapterList": ".ampag@li[!0:2]@a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "/plus/hsearch.php?q={{key}},{\n  \"charset\": \"UTF-8\"\n}", "weight": 0},{"bookSourceComment": "// 作者：姚浅书 // 篱笆好文学，含辅助登录。v1.2 修复正文翻页：选择器改为 .mr-pagination a.mr-next。", "bookSourceGroup": "纳兰验证", "bookSourceName": "篱笆好文学", "bookSourceType": 0, "bookSourceUrl": "https://m.libahao2.com", "bookUrlPattern": "https://m\\.libahao2\\.com/book/\\d+_\\d+/?", "customButton": false, "customOrder": 3, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "玄幻魔法::https://m.libahao2.com/xuanhuan/{{page}}/\n武侠修真::https://m.libahao2.com/xiuzhen/{{page}}/\n都市言情::https://m.libahao2.com/dushi/{{page}}/\n历史军事::https://m.libahao2.com/lishi/{{page}}/\n游戏竞技::https://m.libahao2.com/wangyou/{{page}}/\n科幻灵异::https://m.libahao2.com/kehuan/{{page}}/\n女生言情::https://m.libahao2.com/nvpin/{{page}}/\n其他小说::https://m.libahao2.com/qita/{{page}}/", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1791537358614", "loginUi": "[\n  {\n    \"name\": \"🌐 打开网站首页\",\n    \"type\": \"button\",\n    \"action\": \"openBrowser()\",\n    \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}\n  },\n  {\n    \"name\": \"🍪 查看当前Cookie\",\n    \"type\": \"button\",\n    \"action\": \"checkCookie()\",\n    \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}\n  },\n  {\n    \"name\": \"🗑️ 清除Cookie\",\n    \"type\": \"button\",\n    \"action\": \"clearCookie()\",\n    \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}\n  }\n]", "loginUrl": "openBrowser = () => {\n    java.startBrowser('https://m.libahao2.com', '若页面出现验证，请手动通过，然后返回阅读即可');\n}\n\ncheckCookie = () => {\n    var c = java.getCookie('https://m.libahao2.com');\n    java.toast('Cookie: ' + (c ? c : '当前为空'));\n}\n\nclearCookie = () => {\n    java.clearCookie('https://m.libahao2.com');\n    java.toast('🗑️ Cookie 已清除');\n}\nlogin = () => {};", "respondTime": 1023, "ruleBookInfo": {"author": "meta[property=og:novel:author]@content", "coverUrl": ".mb-cover@src", "intro": "meta[property=og:description]@content", "kind": "meta[property=og:novel:category]@content", "lastChapter": "meta[property=og:novel:lastest_chapter_name]@content", "name": "meta[property=og:novel:book_name]@content"}, "ruleContent": {"content": "@js:var doc = org.jsoup.Jsoup.parse(result);\nvar content = String(doc.select('#chapterContent').html());\ncontent = content.replace(/<b style=\"color:#ff0000[^\"]*\"[^>]*>[^<]*<\\/b>/g, '');\ncontent = content.replace(/<a [^>]*rel=\"next\"[^>]*>[\\s\\S]*?<\\/a>/g, '');\ncontent;", "nextContentUrl": ".mr-pagination a.mr-next@href"}, "ruleExplore": {"author": ".m-book-meta@text##·.*", "bookList": "a.m-book-row", "bookUrl": "@href", "coverUrl": "img.m-cover@src", "intro": "p.m-book-description@text", "name": "h3.m-book-title@text"}, "ruleSearch": {"author": "p.m-book-meta@text##·.*", "bookList": "a.m-book-row", "bookUrl": "@href", "coverUrl": "img.m-cover@src", "intro": "p.m-book-description@text", "name": "h3.m-book-title@text"}, "ruleToc": {"chapterList": "#catalog ol.mb-catalog li a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "https://m.libahao2.com/sou?wd={{key}}", "weight": 0},{"bookSourceName": "速读谷", "bookSourceType": 0, "bookSourceUrl": "https://suduguu.com/", "bookUrlPattern": "https://suduguu\\.com/\\d+/", "customButton": false, "customOrder": 11, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 9) Mobile Safari/537.36\"}", "jsLib": "function getCover(href) { return href && href.startsWith('http') ? href : 'https://suduguu.com' + (href||''); }", "exploreUrl": "@js:\nvar inputData = `°·*.☆ 全部榜单 ☆.*·°\n最近更新::/zuixin/{{page}}.html\n热门小说::/paihang/{{page}}.html\n连载小说::/lianzai/{{page}}.html\n完结小说::/wanjie/{{page}}.html\n玄幻小说::/xuanhuan/{{page}}.html\n仙侠小说::/xianxia/{{page}}.html\n都市小说::/dushi/{{page}}.html\n历史小说::/lishi/{{page}}.html\n科幻小说::/kehuan/{{page}}.html\n轻小说::/qing/{{page}}.html\n悬疑小说::/xuanyi/{{page}}.html\n游戏小说::/youxi/{{page}}.html\n奇幻小说::/qihuan/{{page}}.html\n诸天无限::/zhutianwuxian/{{page}}.html\n军事小说::/junshi/{{page}}.html\n重生小说::/chongsheng/{{page}}.html\n武侠小说::/wuxia/{{page}}.html\n体育小说::/tiyu/{{page}}.html\n言情小说::/yanqing/{{page}}.html`;\nvar categories = [];\nvar lines = inputData.split('\\n').filter(l => l.trim());\nvar items = [];\nfor (var i = 0; i < lines.length; i++) {\n    var parts = lines[i].split('::');\n    var title = parts[0] || \"\";\n    var url = (parts[1] || \"\").trim();\n    if (!url) {\n        categories.push({title: title, url: \"\", style: {layout_flexGrow:1, layout_flexBasisPercent:1}});\n    } else {\n        items.push({title: title, url: url, style: {layout_flexGrow:1, layout_flexBasisPercent:0.25}});\n    }\n}\nfor (var j = 0; j < items.length; j++) { categories.push(items[j]); }\nvar remainder = items.length % 3;\nif (remainder > 0) {\n    for (var k = 0; k < 3 - remainder; k++) {\n        categories.push({title: \"----------\", url: \"\", style: {layout_flexGrow:1, layout_flexBasisPercent:0.25}});\n    }\n}\nJSON.stringify(categories);", "ruleExplore": {"bookList": ".item", "bookUrl": "a@href", "coverUrl": "img@src@js:getCover(result)", "name": "h3@a@text", "author": "p@a@text##作者[：:]", "kind": "p@span@text", "lastChapter": "ul@li@a@text", "intro": ".desc@text"}, "searchUrl": "/i/sor.aspx?key={{key}}", "ruleSearch": {"bookList": ".item", "bookUrl": "a@href", "coverUrl": "img@src@js:getCover(result)", "name": "h3@a@text", "author": "p@a@text##作者[：:]", "kind": "p@span@text", "lastChapter": "ul@li@a@text"}, "ruleBookInfo": {"name": "h1@a@text", "author": ".itemtxt@p.1@text##作者[：:]", "coverUrl": ".item@img@src@js:getCover(result)", "intro": ".des@p@text##简介[：:]", "kind": ".itemtxt@p.0@text", "wordCount": "h1@i@text", "lastChapter": ".itemtxt@ul@li.0@a@text"}, "ruleToc": {"chapterList": "#list@ul@li@a", "chapterName": "text##[\\(\\{（｛【].*[首为求更谢乐发推票章盟第补合感订加字KkWw\\/].*[\\)\\}）｝】]", "chapterUrl": "href", "nextTocUrl": "text.下一页@href"}, "ruleContent": {"content": ".con@html", "nextContentUrl": "text.下一页@href", "replaceRegex": "@js:\nvar r = result;\nr = r.replace(/\\(本章完\\)/g, '');\nr = r.replace(/速读谷/g, '');\nr = r.replace(/suduguu\\.com/g, '');\nr = r.replace(/最新最快无错/g, '');\nr = r.replace(/请收藏本站/g, '');\nr = r.replace(/「/g, '“').replace(/」/g, '”');\nr;"}, "lastUpdateTime": "1791506505721"},{"bookSourceComment": "七猫小说", "bookSourceGroup": "🌙 七猫聚合", "bookSourceName": "🌙 七猫聚合 · 小说·听书·短剧·漫剧", "bookSourceType": 0, "bookSourceUrl": "https://api-bc.wtzw.com/#qimao-aggregate-md3", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:QMA_DISC.explore.call(this,typeof infoMap===\"undefined\"?null:infoMap)", "jsLib": "var QM_KEY = 'd3dGiJc651gSQ8w1';\nvar QM_AES = '242ccb8230d709e1';\nvar QM_BC = 'https://api-bc.wtzw.com';\nvar QM_KS = 'https://api-ks.wtzw.com';\n\nfunction qmMd5(s) {\n    var b = Packages.java.security.MessageDigest.getInstance('MD5')\n        .digest(new Packages.java.lang.String(s).getBytes('UTF-8'));\n    var h = '';\n    for (var i = 0; i < b.length; i++) {\n        var x = (b[i] & 0xff).toString(16);\n        h += (x.length < 2 ? '0' : '') + x;\n    }\n    return h;\n}\n\nfunction qmSign(o) {\n    return qmMd5(Object.keys(o).sort().map(function (k) { return k + '=' + o[k]; }).join('') + QM_KEY);\n}\n\nvar QM_HEADERS = (function () {\n    var h = {'app-version': '80400', 'platform': 'android', 'reg': '0', 'AUTHORIZATION': '',\n             'application-id': 'com.****.reader', 'net-env': '1', 'channel': 'unknown', 'qm-params': ''};\n    h.sign = qmSign(h);\n    return JSON.stringify({headers: h});\n})();\n\nfunction qmUrl(base, path, params) {\n    params.sign = qmSign(params);\n    var q = Object.keys(params).map(function (k) {\n        return k + '=' + encodeURIComponent(params[k]);\n    }).join('&');\n    return base + path + '?' + q + ',' + QM_HEADERS;\n}\n\nfunction qmSearch(key, page) {\n    return qmUrl(QM_BC, '/search/v1/words', {gender: '3', imei_ip: '2937357107', page: page, wd: key});\n}\nfunction qmDetail(id) {\n    return qmUrl(QM_BC, '/api/v4/book/detail', {id: id, imei_ip: '2937357107', teeny_mode: 0});\n}\nfunction qmToc(id) {\n    return qmUrl(QM_KS, '/api/v1/chapter/chapter-list', {id: id});\n}\nfunction qmTag(gender, tid, page, over, words, sort) {\n    var p = {gender: gender, need_filters: 1, page: page, tag_id: tid,\n        over: over == null ? -99 : over, words: words == null ? -99 : words, sort: sort == null ? 0 : sort};\n    if (gender == 1 || gender == 2) p.book_preference = gender;\n    return qmUrl(QM_BC, '/api/v4/tag/index', p);\n}\n\nfunction qmContent(bid, cid, agent) {\n    var p = {id: bid, chapterId: cid};\n    if (agent) p.reader_agent = '1';\n    return qmUrl(QM_KS, '/api/v1/chapter/content', p);\n}\n\nfunction qmChapterUrl(cid, md5, agent) {\n    var s = cid + '/' + md5 + '/' + (agent == '1' ? '1' : '0');\n    var b64 = Packages.java.util.Base64.getEncoder()\n        .encodeToString(new Packages.java.lang.String(s).getBytes('UTF-8'));\n    return 'data:;base64,' + b64 + ',{\"type\":\"qm\"}';\n}\n\nfunction qmUnzipEpub(b) {\n    function u16(p) { return (b[p] & 0xff) | (b[p + 1] & 0xff) << 8; }\n    function u32(p) { return (u16(p) | u16(p + 2) << 16) >>> 0; }\n    var eocd = b.length - 22;\n    while (eocd >= 0 && u32(eocd) != 0x06054b50) eocd--;\n    if (eocd < 0) return '';\n    var p = u32(eocd + 16), count = u16(eocd + 10), html = '';\n    for (var i = 0; i < count; i++) {\n        var method = u16(p + 10), csize = u32(p + 20), usize = u32(p + 24);\n        var nlen = u16(p + 28), total = 46 + nlen + u16(p + 30) + u16(p + 32);\n        var name = String(new Packages.java.lang.String(b, p + 46, nlen, 'UTF-8'));\n        var lh = u32(p + 42);\n        p += total;\n        if (!/\\.x?html?$/i.test(name)) continue;\n        var start = lh + 30 + u16(lh + 26) + u16(lh + 28), text;\n        if (method == 0) {\n            text = new Packages.java.lang.String(b, start, csize, 'UTF-8');\n        } else {\n            var inf = new Packages.java.util.zip.Inflater(true);\n            inf.setInput(b, start, csize);\n            var out = Packages.java.util.Arrays.copyOf(b, usize);\n            inf.inflate(out);\n            inf.end();\n            text = new Packages.java.lang.String(out, 'UTF-8');\n        }\n        var m = String(text).match(/<body[^>]*>([\\s\\S]*)<\\/body>/i);\n        if (m) html += m[1];\n    }\n    return html.replace(/<h\\d[^>]*>[\\s\\S]*?<\\/h\\d>/gi, '')\n               .replace(/&amp;/g, '&').trim();\n}\n\nfunction qmDecode(content) {\n    var A = Packages.java.util.Arrays;\n    var raw = Packages.java.util.Base64.getDecoder().decode(String(content));\n    var key = new Packages.javax.crypto.spec.SecretKeySpec(new Packages.java.lang.String(QM_AES).getBytes('UTF-8'), 'AES');\n    var iv = new Packages.javax.crypto.spec.IvParameterSpec(A.copyOfRange(raw, 0, 16));\n    var c = Packages.javax.crypto.Cipher.getInstance('AES/CBC/PKCS5Padding');\n    c.init(2, key, iv);\n    var b = c.doFinal(A.copyOfRange(raw, 16, raw.length));\n    if (b.length > 3 && b[0] == 0x50 && b[1] == 0x4B) return qmUnzipEpub(b);\n    return String(new Packages.java.lang.String(b, 'UTF-8'));\n}\n\nvar QM_TAGS = {\n    '男频': [\n        ['热门', '爽文:570,都市:758,年代:672,玄幻:717,兵王:28,玄幻脑洞:884,扮猪吃虎:794,热血:1,多角色:1409,杀伐果断:202,穿越:373,逆袭:400,七猫金选:1385'],\n        ['情节', '都市脑洞:883,玄幻脑洞:884,穿越:373,逆袭:400,剑道:72,打脸虐渣:739,无敌流:305,重生:779,系统:782,多女主:945,金手指:756,脑洞:526,修仙:659,复仇:790,强者回归:402,致富:492,随身空间:345,争霸:312,奇闻异事:769,异能:644,风水:437,草根崛起:1223,穿书:338,影视:539,一统天下:410,单女主:861,职场:741,影视原著:1333,契约婚姻:355,古武:606,后悔流:1202,开局流:564,娱乐圈:357,推理:668,武魂:427,游戏:714,鉴宝:47,美食:300,修罗场:1256,进化:528,盗墓:327,技术流:663,探险:697,无限流:557,历史脑洞:885,签到:565,直播:419,网游:740,长生流:566,丧尸:632,御兽:423,囤物资:894,爱国流:830,基建:612,通古今:1203,吞噬:530,稳健流:837,科技:855,召唤:313,迪化流:832,国术:613,相亲:909,全民领主:1213,无女主:860,体育:601,偷听心声:1258,综艺:911,机甲:690,恋综:817,电竞:715,克苏鲁:834,篮球:732,国运:868,万物沟通:1285,双男主:818,荒野求生:1226,足球:576,综武:940,NBA:984,弹幕文:1274,崩人设:1257,扮演:842,氪金:1225,多重人格:954'],\n        ['背景', '都市:758,末世:556,玄幻:717,古代:604,架空历史:653,仙侠:589,年代:672,历史:669,异界:692,乡村:599,校园:691,高武:840,诸天万界:307,科幻:730,传统玄幻:1268,奇幻:678,灵气复苏:403,未来世界:704,大明:636,武侠:371,影视衍生:638,洪荒:559,星际:686,大唐:322,四合院:854,神话:726,西幻:744,三国:321,动漫衍生:598,民国:660,西游:324,大秦:858,游戏衍生:673,封神:658,火影:330,海贼王:331,宋朝:943,赛博朋克:957,崩坏星穹铁道:969'],\n        ['角色', '杀伐果断:202,智商在线:806,扮猪吃虎:794,全能:196,仙帝:31,天才:783,医生:156,废柴:791,兵王:28,女总裁:89,护花高手:30,神医:1269,战神:527,王爷:125,赘婿:36,世子:580,皇帝:62,将军:787,反派:792,明星:684,皇子:713,太子:128,学霸:781,道士:74,神豪:37,咸鱼:812,女帝:646,特种兵:547,奶爸:41,校花:92,高冷:1219,太监:642,无节操:1215,弃少:525,律师:161,书生:852,师徒恋:507,龙:444,暴君:703,僵尸:449,主播:587,魔尊:544,侦探:592,特工:188,驸马:946,幕后BOSS:963,佛系:1255,外卖员:958,杀手:784,锦衣卫:757,御姐:1254,奸臣:621,败家子:752,法医:189,真假少爷:1270,女尊:624,嘴炮:1216,丞相:944'],\n        ['风格', '爽文:570,轻松:3,种田:317,权谋:785,搞笑:788,热血:1,快节奏:1222,日常:878,悬疑:27,励志:786,现实题材:12,恐怖:567,商战:675,军事:603,第一人称:977,反套路:1224,烧脑:571,正剧:707']\n    ],\n    '女频': [\n        ['热门', '现代言情:772,甜宠:21,爽文:570,多角色:1409,豪门总裁:682,幻想言情:774,古代言情:773,重生:779,年代:672,穿越:373,逆袭:400,智商在线:806,七猫金选:1385'],\n        ['情节', '快穿:335,穿越:373,逆袭:400,HE:581,1V1:585,系统:782,追妻火葬场:753,先婚后爱:524,重生:779,金手指:756,脑洞:526,修仙:659,复仇:790,致富:492,随身空间:345,奇闻异事:769,打脸虐渣:739,异能:644,玄学:900,风水:437,一见钟情:583,穿书:338,暗恋:689,男二上位:857,破镜重圆:467,影视:539,马甲:558,职场:741,影视原著:1333,契约婚姻:355,闪婚:480,娱乐圈:357,推理:668,青梅竹马:465,婚恋:1246,带球跑:640,美食:300,替嫁:476,相爱相杀:722,修罗场:1256,双向奔赴:844,无限流:557,直播:419,隐婚:481,丧尸:632,御兽:423,囤物资:894,爱国流:830,姐弟恋:631,错嫁:501,父子火葬场:1259,基建:612,无CP:819,通古今:1203,逃荒:864,科技:855,相亲:909,双向救赎:1248,读心术:810,死对头:1239,偷听心声:1258,爆红:1250,综艺:911,机甲:690,恋综:817,天作之合:1244,电竞:715,宠夫:964,古穿今:671,BE:579,万物沟通:1285,双男主:818,倒追:1252,萌宠:1249,逃婚:483,弹幕文:1274,失忆:1251,崩人设:1257,氪金:1225,多重人格:954,双重生:828'],\n        ['背景', '现代言情:772,年代:672,古代:604,兽世:856,古代言情:773,架空历史:653,末世:556,异界:692,幻想言情:774,乡村:599,校园:691,科幻:730,奇幻:678,未来世界:704,武侠:371,影视衍生:638,星际:686,神话:726,西幻:744,动漫衍生:598,民国:660,远古:750,游戏衍生:673,衍生言情:1214,崩坏星穹铁道:969'],\n        ['角色', '豪门总裁:682,智商在线:806,扮猪吃虎:794,霸道:239,全能:196,天才:783,腹黑:789,女强:620,医生:156,萌宝:356,宠妻:1245,人间清醒:1200,双洁:947,团宠:545,可盐可甜:608,强强:533,废柴:791,偏执:248,真假千金:808,嫡女:117,王爷:125,王妃:107,世子:580,大女主:972,白月光:851,皇帝:62,将军:787,糙汉:907,明星:684,忠犬:259,皇子:713,太子:128,反派:792,傲娇:268,学霸:781,二婚:655,医妃:108,独宠:1253,咸鱼:812,女帝:646,女配:191,丫鬟:961,毒舌:265,欢喜冤家:464,首辅:133,高冷:1219,美强惨:1232,戏精:1228,万人迷:1227,痴情:1217,呆萌:609,替身:648,病娇:273,残疾:263,太监:642,丑女:141,大叔:153,锦鲤:813,主母:973,摄政王:698,律师:161,黑化:1247,弃妇:590,奶团:971,书生:852,师徒恋:507,冰山:1242,暴君:703,公主:113,反差萌:1235,庶女:118,炮灰:1229,超A:1218,女扮男装:619,醋王:1221,主播:587,魔尊:544,黑莲花:849,侦探:592,特工:188,心机:1236,校草:701,财迷:1220,皇后:106,古灵精怪:1243,皇叔:721,小狼狗:1234,佛系:1255,作精:948,外卖员:958,杀手:784,锦衣卫:757,御姐:1254,奸臣:621,后妈:845,毒医:1240,吸血鬼:182,仵作:190,绿茶:738,法医:189,厨娘:1241,女尊:624,顶流:1233,黑月光:850,逗比:1238,旺夫:1231,暖男:1237,嘴炮:1216,吃货:1230,恶婆婆:962,双女主:843'],\n        ['风格', '爽文:570,甜宠:21,轻松:3,种田:317,宅斗:342,权谋:785,虐恋:16,搞笑:788,快节奏:1222,日常:878,治愈:17,悬疑:27,励志:786,宫斗:343,现实题材:12,恐怖:567,青春:761,第一人称:977,反套路:1224,烧脑:571,正剧:707,短篇:934,清穿:336']\n    ],\n    '出版': [\n        ['热门', '都市:758,现代言情:772,玄幻:717,古代:604,古代言情:773,历史:669'],\n        ['内容主题', '家庭:687,生活:712,婚姻:628,养生:662,育儿:1321,医学:1320,社会问题:1317'],\n        ['品质认证', '出版:1303,影视原著:1333,名著:610,获奖佳作:742,名家名作:1336,站外权威推荐:1338,豆瓣高分:1337'],\n        ['出版小说', '都市:758,现代言情:772,玄幻:717,古代:604,古代言情:773,历史:669,仙侠:589,悬疑:27,现实题材:12,青春:761,科幻:730,言情:745,武侠:371,群像:1340'],\n        ['读者群体', '女性:643,青少年:540,少儿教育:797,职场人士:1318'],\n        ['个人成长', '心理:649,成功学:696,经管励志:798,情商:639,沟通:702,管理:729,经济:710,自我成长:1329,时间管理:1324,演讲:1328,思维训练:1325,领导力:1323,学习方法:1331,决策:1322,团队建设:1326,职业发展:1330,效率:1327'],\n        ['文学体裁', '传记:591,文学小说:1310,作品集:597,随笔:737,散文:645,评论:724,诗词:747,中篇小说:1309,短篇小说:1308,戏剧:1312,纪实文学:1311,杂文:1313,报告文学:1307'],\n        ['地区文学', '中国文学:1348,法国文学:1349,英国文学:1351,美国文学:1350,德国文学:1352,日本文学:1332,俄罗斯文学:1354,外文原版:1353,意大利文学:1355'],\n        ['时代背景', '社会:723,近代:728,改革开放:1314'],\n        ['社会人文', '人文社科:796,文化历史:1316,文化:685,文学艺术:795,国学:534,哲学:1315,科普:733,艺术:720,世界历史:1319'],\n        ['思想政治', '红色文学:535,思政:694,四史:611']\n    ]\n};\n\n// MD3 discovery helpers: select controls persist display values in infoMap and\n// normalized request values in the source variable.\nfunction qmExploreMapGet(map, key) {\n    try {\n        if (map && map.get) return map.get(key);\n    } catch (e) {}\n    try {\n        if (map) return map[key];\n    } catch (e) {}\n    return '';\n}\n\nfunction qmExploreMapPut(map, key, value) {\n    try {\n        if (map && map.put) {\n            map.put(key, value);\n            return;\n        }\n    } catch (e) {}\n    try {\n        if (map && map.set) {\n            map.set(key, value);\n            return;\n        }\n    } catch (e) {}\n    try {\n        if (map) map[key] = value;\n    } catch (e) {}\n}\n\nfunction qmExploreTrim(value) {\n    return String(value == null ? '' : value).replace(/^\\s+|\\s+$/g, '');\n}\n\nfunction qmExploreValue(value, fallback) {\n    return qmExploreTrim(value) === '' ? fallback : value;\n}\n\nfunction qmExploreRead(sourceValue) {\n    var raw = '';\n    try {\n        raw = sourceValue && sourceValue.getVariable ? sourceValue.getVariable() : '';\n    } catch (e) {}\n    try {\n        return JSON.parse(String(raw || '{}')) || {};\n    } catch (e) {\n        return {};\n    }\n}\n\nfunction qmExploreWrite(sourceValue, value) {\n    var serialized = JSON.stringify(value || {});\n    try {\n        if (sourceValue && sourceValue.putVariable) {\n            sourceValue.putVariable(serialized);\n            return true;\n        }\n    } catch (e) {}\n    try {\n        if (sourceValue && sourceValue.setVariable) {\n            sourceValue.setVariable(serialized);\n            return true;\n        }\n    } catch (e) {}\n    return false;\n}\n\nfunction qmExploreOptionValue(value, options, fallback) {\n    value = qmExploreTrim(value);\n    for (var i = 0; i < options.length; i++) {\n        if (String(options[i][0]) == value || String(options[i][1]) == value) return String(options[i][1]);\n    }\n    return String(fallback);\n}\n\nfunction qmExploreGroupNames(channel) {\n    var groups = QM_TAGS[channel] || [];\n    return groups.filter(function (group) {\n        return qmExploreTagOptions(channel, group[0]).length > 0;\n    }).map(function (group) { return String(group[0]); });\n}\n\n// Display names and tag_id values must come from the same validated catalog.\nfunction qmExploreTagOptions(channel, groupName) {\n    var groups = QM_TAGS[channel] || [];\n    for (var i = 0; i < groups.length; i++) {\n        if (String(groups[i][0]) != String(groupName)) continue;\n        var options = [];\n        String(groups[i][1]).split(',').forEach(function (item) {\n            var pair = item.split(':');\n            var name = qmExploreTrim(pair[0]);\n            var id = qmExploreTrim(pair[1]);\n            if (pair.length == 2 && name && /^[1-9][0-9]*$/.test(id)) {\n                options.push({name: name, id: id});\n            }\n        });\n        return options;\n    }\n    return [];\n}\n\nfunction qmExploreTagNames(channel, groupName) {\n    return qmExploreTagOptions(channel, groupName).map(function (option) {\n        return option.name;\n    });\n}\n\nfunction qmExploreTagId(channel, groupName, tagName) {\n    var option = qmExploreTagOption(channel, groupName, tagName);\n    return option ? option.id : '';\n}\n\nfunction qmExploreTagOption(channel, groupName, tagName) {\n    var options = qmExploreTagOptions(channel, groupName);\n    for (var i = 0; i < options.length; i++) {\n        if (options[i].name == String(tagName)) return options[i];\n    }\n    return options[0] || null;\n}\n\nfunction qmExploreGender(channel) {\n    return ({'男频': 1, '女频': 2, '出版': 3})[channel] || 1;\n}\n\nfunction qmExploreNormalize(value) {\n    value = value || {};\n    var channel = qmExploreTrim(value.channel || value['频道'] || value.ch) || '男频';\n    if (['男频', '女频', '出版'].indexOf(channel) < 0) channel = '男频';\n\n    var groups = qmExploreGroupNames(channel);\n    var group = qmExploreTrim(value.group || value['分类分组']);\n    if (groups.indexOf(group) < 0) group = groups[0] || '';\n\n    var option = qmExploreTagOption(channel, group, value.tag || value['分类标签']);\n    if (!option) throw new Error('当前频道没有有效的分类标签，请更新书源');\n    var tag = option.name;\n\n    var over = qmExploreOptionValue(qmExploreValue(value.over, value['状态']), [['全部状态', '-99'], ['完结', '1'], ['连载', '0']], '-99');\n    var words = qmExploreOptionValue(qmExploreValue(value.words, value['字数']), [['全部字数', '-99'], ['50万以下', '1'], ['50-100万', '2'], ['100-300万', '3'], ['300万以上', '4']], '-99');\n    var sort = qmExploreOptionValue(qmExploreValue(value.sort, value['排序']), [['按热度', '0'], ['按更新', '1'], ['按评分', '2'], ['按新书', '3']], '0');\n\n    return {channel: channel, group: group, tag: tag, over: over, words: words, sort: sort};\n}\n\nfunction qmExploreStateFromInfo(infoMapValue, sourceValue) {\n    var stored = qmExploreNormalize(qmExploreRead(sourceValue));\n    var value = {\n        channel: qmExploreValue(qmExploreMapGet(infoMapValue, '频道'), stored.channel),\n        group: qmExploreValue(qmExploreMapGet(infoMapValue, '分类分组'), stored.group),\n        tag: qmExploreValue(qmExploreMapGet(infoMapValue, '分类标签'), stored.tag),\n        over: qmExploreValue(qmExploreMapGet(infoMapValue, '状态'), stored.over),\n        words: qmExploreValue(qmExploreMapGet(infoMapValue, '字数'), stored.words),\n        sort: qmExploreValue(qmExploreMapGet(infoMapValue, '排序'), stored.sort)\n    };\n    return qmExploreNormalize(value);\n}\n\nfunction qmSaveExploreState(infoMapValue, sourceValue) {\n    var value = qmExploreStateFromInfo(infoMapValue, sourceValue);\n    qmExploreMapPut(infoMapValue, '频道', value.channel);\n    qmExploreMapPut(infoMapValue, '分类分组', value.group);\n    qmExploreMapPut(infoMapValue, '分类标签', value.tag);\n    qmExploreMapPut(infoMapValue, '状态', value.over == '-99' ? '全部状态' : (value.over == '1' ? '完结' : '连载'));\n    qmExploreMapPut(infoMapValue, '字数', value.words == '-99' ? '全部字数' : ({'1': '50万以下', '2': '50-100万', '3': '100-300万', '4': '300万以上'}[value.words] || '全部字数'));\n    qmExploreMapPut(infoMapValue, '排序', value.sort == '0' ? '按热度' : (value.sort == '1' ? '按更新' : (value.sort == '2' ? '按评分' : '按新书')));\n    try {\n        if (infoMapValue && infoMapValue.saveNow) infoMapValue.saveNow();\n    } catch (e) {}\n    qmExploreWrite(sourceValue, value);\n    return value;\n}\n\nfunction qmBuildExploreUrlFromEncoded(javaValue, encoded, page, sourceValue) {\n    var value;\n    try {\n        value = JSON.parse(decodeURIComponent(String(encoded || '')));\n    } catch (e) {\n        value = {};\n    }\n    value = qmExploreNormalize(value);\n    if (sourceValue) qmExploreWrite(sourceValue, value);\n    var tag = qmExploreTagOption(value.channel, value.group, value.tag);\n    var params = {\n        gender: qmExploreGender(value.channel),\n        tag_id: tag.id,\n        over: value.over,\n        words: value.words,\n        sort: value.sort\n    };\n    return qmTag(params.gender, params.tag_id, page, params.over, params.words, params.sort);\n}\n\n\nvar QMP_COMMENT_HTML = \"<!doctype html><html lang=\\\"zh-CN\\\"><head><meta charset=\\\"utf-8\\\"><meta name=\\\"viewport\\\" content=\\\"width=device-width,initial-scale=1\\\"><meta name=\\\"color-scheme\\\" content=\\\"light dark\\\">\\n<style>\\n:root{color-scheme:light dark;--bg:#fff;--fg:#202124;--muted:#73777d;--line:#eceef0;--accent:#496ba3;--soft:#f3f5f8} @media(prefers-color-scheme:dark){:root{--bg:#191b20;--fg:#e3e5e9;--muted:#a1a6b0;--line:#32363d;--accent:#a5c7ff;--soft:#242830}}\\n*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--fg);font:16px/1.65 system-ui,sans-serif;padding:0 20px 28px}header{position:sticky;top:0;background:var(--bg);padding:18px 0 12px;border-bottom:1px solid var(--line)}h1{font-size:19px;margin:0 0 10px}button{font:inherit;border:0;border-radius:20px;padding:7px 18px;background:var(--soft);color:var(--fg);cursor:pointer}button[aria-pressed=true]{background:var(--accent);color:var(--bg)}button:disabled{opacity:.55}nav{display:flex;gap:10px}blockquote{margin:18px 0;padding:12px 14px;background:var(--soft);border-left:3px solid var(--accent);font-size:14px;color:var(--muted);white-space:pre-wrap;overflow-wrap:anywhere}article{padding:16px 0;border-bottom:1px solid var(--line)}.name{font-size:14px;font-weight:650}.meta{font-size:12px;color:var(--muted);margin-top:8px}.text{white-space:pre-wrap;overflow-wrap:anywhere;margin-top:6px}#status{color:var(--muted);font-size:14px;margin:16px 0}#more{display:block;width:100%}small{font-weight:400;color:var(--muted);font-size:13px}\\n</style></head><body><header><h1>本段评论 <small id=\\\"count\\\"></small></h1><nav><button id=\\\"hot\\\" aria-pressed=\\\"true\\\">热门</button><button id=\\\"new\\\" aria-pressed=\\\"false\\\">最新</button></nav></header><blockquote id=\\\"quote\\\"></blockquote><main id=\\\"list\\\"></main><p id=\\\"status\\\" role=\\\"status\\\" aria-live=\\\"polite\\\">正在加载评论…</p><button id=\\\"more\\\">加载更多</button>\\n<script>\\n(function(){\\n  'use strict';\\n  var input=__QMP_INPUT__,cursor='',hot='1',busy=false,done=false,seen=Object.create(null),shown=0;\\n  var el=function(id){return document.getElementById(id)};\\n  el('quote').textContent=input.text;\\n  el('count').textContent=input.count+' 条';\\n  function node(tag,cls,text){var n=document.createElement(tag);n.className=cls;n.textContent=text;return n;}\\n  async function load(){\\n    if(busy||done)return;\\n    busy=true;el('more').disabled=true;el('hot').disabled=true;el('new').disabled=true;el('status').textContent='正在加载评论…';\\n    try{\\n      if(typeof window.qmpcRun!=='function')throw new Error('评论窗口桥接不可用，请使用阅读 MD3 3.26.16-beta.38');\\n      var request={bid:input.bid,cid:input.cid,pid:input.pid,cursor:cursor,hot:hot};\\n      var data=JSON.parse(await window.qmpcRun('qmpcPage.call(this,'+JSON.stringify(request)+')'));\\n      if(!data.ok)throw new Error(data.error||'评论加载失败');\\n      data.items.forEach(function(item){\\n        var key=item.id||item.name+'\\\\n'+item.content;if(seen[key])return;seen[key]=true;shown++;\\n        var card=document.createElement('article');card.appendChild(node('div','name',item.name));card.appendChild(node('div','text',item.content));\\n        card.appendChild(node('div','meta',[item.time,'赞 '+item.likes,item.replies+' 条回复'].join(' · ')));el('list').appendChild(card);\\n      });\\n      if(data.total!==null)el('count').textContent=data.total+' 条';\\n      done=!data.next||data.next===cursor;cursor=data.next;\\n      el('status').textContent=shown?(done?'已加载全部可见评论':'已加载 '+shown+' 条评论'):'本段暂无可见评论';\\n      el('more').textContent='加载更多';el('more').hidden=done;\\n    }catch(e){el('status').textContent='加载失败：'+(e.message||String(e));el('more').textContent='重试';el('more').hidden=false;}\\n    finally{busy=false;el('more').disabled=false;el('hot').disabled=false;el('new').disabled=false;}\\n  }\\n  function sort(value){if(busy||value===hot)return;hot=value;cursor='';done=false;shown=0;seen=Object.create(null);el('list').textContent='';el('more').hidden=false;el('hot').setAttribute('aria-pressed',String(hot==='1'));el('new').setAttribute('aria-pressed',String(hot==='0'));load();}\\n  el('hot').onclick=function(){sort('1')};el('new').onclick=function(){sort('0')};el('more').onclick=load;load();\\n})();\\n</script></body></html>\\n\";\n// MD3 beta.38 paragraph comments. Endpoint/field reference: ah-fa-fa, source 7684.\n// Independently implemented read-only adapter; no guest registration or remote JS.\nfunction qmpcJava(ctx) {\n    return ctx && ctx.java ? ctx.java : java;\n}\nfunction qmpcSource(ctx) {\n    return ctx && ctx.source ? ctx.source : source;\n}\nfunction qmpcStatus(ctx, text) {\n    try { qmpcSource(ctx).put('qmpc_status', String(text)); } catch (ignored) {}\n}\nfunction qmpcRequest(ctx, path, params, post) {\n    var p = {}, h = JSON.parse(QM_HEADERS).headers;\n    Object.keys(params).forEach(function(k) { p[k] = String(params[k]); });\n    p.sign = qmSign(p);\n    var form = Object.keys(p).map(function(k) {return encodeURIComponent(k) + '=' + encodeURIComponent(p[k]);}).join('&');\n    var options = {headers:h}, url = 'https://api-cmnt.wtzw.com' + path;\n    if (post) {\n        options.method = 'POST'; options.body = form;\n        h['Content-Type'] = 'application/x-www-form-urlencoded';\n    } else url += '?' + form;\n    var raw = String(qmpcJava(ctx).ajax(url + ',' + JSON.stringify(options), 12000) || '');\n    var result;\n    try { result = JSON.parse(raw); } catch (e) { throw new Error('七猫评论接口未返回有效 JSON'); }\n    if (!result || !result.data || typeof result.data !== 'object' || result.errors) {\n        throw new Error('七猫评论接口返回错误' + (result && result.code != null ? '（' + result.code + '）' : ''));\n    }\n    return result.data;\n}\nfunction qmpcBubble(ctx, bid, cid, pid, count, line) {\n    var label = count > 999 ? '999+' : String(count);\n    var svg = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"68\" height=\"38\" viewBox=\"0 0 68 38\"><path d=\"M13 3h46a6 6 0 0 1 6 6v17a6 6 0 0 1-6 6H19l-9 4 2-8a6 6 0 0 1-5-6V9a6 6 0 0 1 6-6Z\" fill=\"none\" stroke=\"#7b8fae\" stroke-width=\"2\"/><text x=\"36\" y=\"24\" text-anchor=\"middle\" font-family=\"sans-serif\" font-size=\"18\" fill=\"#7b8fae\">' + label + '</text></svg>';\n    var j = qmpcJava(ctx);\n    var payload = String(j.base64Encode(JSON.stringify({bid:bid,cid:cid,pid:pid,count:count,text:line})));\n    var click = 'qmpcOpen.call(this,' + JSON.stringify(payload) + ')';\n    // MD3 deliberately parses the trailing URL options JSON inside this src.\n    return '<img src=\"data:image/svg+xml;base64,' + j.base64Encode(svg) + ',' + JSON.stringify({style:'TEXT',click:click}) + '\">';\n}\nfunction qmpcAnnotate(text, bid, cid, md5) {\n    var original = String(text), ctx = this;\n    try {\n        if (String(qmpcSource(ctx).get('qmpc_enabled')) === '0') return original;\n        if (/<\\/?(?:p|div|body|img|h[1-6])\\b/i.test(original)) {\n            qmpcStatus(ctx, '本章是 HTML/出版物正文，保留原排版，未添加段评'); return original;\n        }\n        var data = qmpcRequest(ctx, '/api/v1/paragraph/bubbles', {book_id:bid,chapters:JSON.stringify([{chapter_id:String(cid),chapter_md5:String(md5 || '')}])}, true);\n        if (!Array.isArray(data.chapters)) throw new Error('气泡响应缺少章节列表');\n        var chapterData = null;\n        data.chapters.forEach(function(c) { if (String(c.chapter_id) === String(cid)) chapterData = c; });\n        if (!chapterData || !Array.isArray(chapterData.bubbles)) throw new Error('气泡响应缺少当前章节');\n        var marks = {}, matched = 0;\n        chapterData.bubbles.forEach(function(b) {\n            var n = Number(b.c);\n            if (/^[0-9a-f]{8}$/i.test(String(b.p)) && isFinite(n) && n > 0) marks[String(b.p)] = Math.floor(n);\n        });\n        // Hash the original line before whitespace conversion or display filtering.\n        var result = original.split('\\n').map(function(line) {\n            if (!line.trim()) return line;\n            var pid = qmMd5(line).slice(0, 8), count = marks[pid];\n            if (!count) return line;\n            matched++;\n            return line + qmpcBubble(ctx, String(bid), String(cid), pid, count, line);\n        }).join('\\n');\n        qmpcStatus(ctx, '章节 ' + cid + '：已添加 ' + matched + ' 个段评气泡；接口返回 ' + Object.keys(marks).length + ' 个有评论的段落');\n        return result;\n    } catch (e) {\n        qmpcStatus(ctx, '段评加载失败，正文已保留：' + String(e.message || e));\n        return original;\n    }\n}\nfunction qmpcPage(input) {\n    try {\n        if (!input || !/^\\d+$/.test(String(input.bid)) || !/^\\d+$/.test(String(input.cid)) || !/^[0-9a-f]{8}$/i.test(String(input.pid))) throw new Error('段评标识无效');\n        var cursor = String(input.cursor || ''), hot = String(input.hot) === '0' ? '0' : '1';\n        var params = {book_id:input.bid,chapter_id:input.cid,paragraph_id:input.pid,hot:hot,check_cmt_id:''};\n        if (cursor) params.next_id = cursor;\n        else { params.exposed_ids = ''; params.need_common = hot; }\n        var data = qmpcRequest(this, '/api/v2/paragraph/' + (cursor ? 'more' : 'first'), params, !cursor);\n        var list = [], next = '', total = null;\n        if (cursor) {\n            if (!Array.isArray(data.comment_list) && data.comment_list !== null) throw new Error('评论响应缺少列表');\n            list = data.comment_list || []; next = String(data.next_id || '');\n        } else {\n            if (!data.time_zone && !data.hot_zone) throw new Error('评论响应缺少列表');\n            var hotZone = data.hot_zone || {}, timeZone = data.time_zone || {};\n            list = (hotZone.comment_list || []).concat(timeZone.comment_list || []);\n            next = String(timeZone.next_id || data.next_id || '');\n            var count = timeZone.comment_count != null ? timeZone.comment_count : hotZone.comment_count;\n            total = count == null ? null : String(count);\n        }\n        if (next === cursor) next = '';\n        var seen = {}, items = [];\n        list.forEach(function(item) {\n            var user = item.user_info || {}, id = String(item.comment_id || item.id || '');\n            if (id && seen[id]) return;\n            if (id) seen[id] = true;\n            items.push({id:id,name:String(user.nickname || '七猫用户'),content:String(item.content || ''),time:String(item.comment_time || ''),likes:String(item.like_count || '0'),replies:String(item.reply_count || '0')});\n        });\n        return JSON.stringify({ok:true,items:items,next:next,total:total});\n    } catch(e) { return JSON.stringify({ok:false,error:String(e.message || e),items:[],next:'',total:null}); }\n}\nfunction qmpcOpen(encoded) {\n    var j = qmpcJava(this), input = JSON.parse(String(j.base64Decode(encoded)));\n    // Protect the HTML script boundary even if the novel contains markup.\n    var safe = JSON.stringify(input).replace(/</g, '\\\\u003c').replace(/\\u2028/g, '\\\\u2028').replace(/\\u2029/g, '\\\\u2029');\n    var html = QMP_COMMENT_HTML.replace('__QMP_INPUT__', function() { return safe; });\n    j.showBrowser('https://api-cmnt.wtzw.com/', html, 'window.qmpcRun = run;', JSON.stringify({state:3,isHideable:true,heightPercentage:0.8,widthPercentage:1,skipCollapsed:true,dismissOnTouchOutside:true,expandedCornersRadius:16,webViewInitialScale:100}));\n}\nfunction qmpcSetEnabled(enabled) {\n    qmpcSource(this).put('qmpc_enabled', enabled ? '1' : '0');\n    qmpcJava(this).longToast('段评已' + (enabled ? '开启' : '关闭') + '，请返回阅读页刷新正文');\n}\nfunction qmpcShowStatus() {\n    qmpcJava(this).longToast(String(qmpcSource(this).get('qmpc_status') || '尚未加载段评，请进入章节并刷新正文'));\n}\n\n/* Media transport adapted from 七猫四合一本地版（同人）, supplied by user. */\nvar QMA_NET = (function(qmMd5) {\nvar QM_APP_VERSION = '80400'\nvar QM_CHANNEL = 'qm-guanfang_lf'\nvar QM_APP_ID = 'com.kmxs.reader'\nvar QM_SECRET = 'd3dGiJc651gSQ8w1'\nvar QM_B64 = '+/0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'\nvar QM_PARAM_MAP = 'PXMUlErYWbdJ9saI0oy_HGitgNA8Fk3hfRqC4pmBOuc6Kx5T-2zSZ1VvjQ7DwnLe'\nvar QM_CONTENT_MAP = '5NhEilDnz01JC67qSmT89-FkGKor4stuHvBwxOILcdMeAfgPQRbyU2p3VjWX_YZa'\nfunction qmSourceOf(ctx) {\n  try { if (ctx && ctx.source) return ctx.source } catch (e) {}\n  try { if (typeof source != 'undefined') return source } catch (e2) {}\n  return null\n}\n\nfunction qmCallable(obj, name) {\n  try { return !!obj && typeof obj[name] == 'function' } catch (e) { return false }\n}\n\nfunction qmJavaOf(ctx) {\n  var candidate = null\n  try { candidate = ctx && ctx.java ? ctx.java : null } catch (e) {}\n  if (candidate && (qmCallable(candidate, 'ajax') || qmCallable(candidate, 'base64Encode') || qmCallable(candidate, 'showBrowser'))) return candidate\n  try { candidate = typeof java != 'undefined' ? java : null } catch (e2) {}\n  if (candidate && (qmCallable(candidate, 'ajax') || qmCallable(candidate, 'base64Encode') || qmCallable(candidate, 'showBrowser'))) return candidate\n  return null\n}\n\nfunction qmCacheOf(ctx) {\n  try { if (ctx && ctx.cache) return ctx.cache } catch (e) {}\n  try { if (typeof cache != 'undefined') return cache } catch (e2) {}\n  return null\n}\n\nfunction qmSign(value) {\n  return qmMd5(String(value) + QM_SECRET)\n}\n\nfunction qmUrlSign(data) {\n  var keys = Object.keys(data || {}).sort()\n  var text = ''\n  keys.forEach(function (key) { text += key + '=' + String(data[key]) })\n  return qmSign(text)\n}\n\nfunction qmMapChars(value, from, to) {\n  var out = ''\n  value = String(value)\n  for (var i = 0; i < value.length; i++) {\n    var index = from.indexOf(value.charAt(i))\n    out += index >= 0 ? to.charAt(index) : value.charAt(i)\n  }\n  return out\n}\n\nfunction qmParamEncode(value) {\n  var bytes = new Packages.java.lang.String(String(value)).getBytes('UTF-8')\n  var b64 = String(Packages.java.util.Base64.getEncoder().encodeToString(bytes)).replace(/[=\\r\\n]/g, '')\n  return qmMapChars(b64, QM_B64, QM_PARAM_MAP)\n}\n\nfunction qmContentLayerDecode(value) {\n  var b64 = qmMapChars(String(value), QM_CONTENT_MAP, QM_B64)\n  while (b64.length % 4) b64 += '='\n  try {\n    var bytes = Packages.java.util.Base64.getDecoder().decode(b64)\n    return String(new Packages.java.lang.String(bytes, 'UTF-8'))\n  } catch (e) {\n    return ''\n  }\n}\n\nfunction qmRandomHex(length) {\n  var value = String(Packages.java.util.UUID.randomUUID().toString()).replace(/-/g, '')\n  while (value.length < length) value += String(Packages.java.util.UUID.randomUUID().toString()).replace(/-/g, '')\n  return value.slice(0, length)\n}\n\nfunction qmPad(value, length) {\n  value = String(value)\n  while (value.length < length) value = '0' + value\n  return value\n}\n\nfunction qmDateStamp() {\n  var d = new Date()\n  return d.getFullYear() + qmPad(d.getMonth() + 1, 2) + qmPad(d.getDate(), 2) + qmPad(d.getHours(), 2) + qmPad(d.getMinutes(), 2) + qmPad(d.getSeconds(), 2)\n}\n\nfunction qmDevice() {\n  var runtimeSource = qmSourceOf(this)\n  var data\n  try { data = JSON.parse(String(runtimeSource && runtimeSource.get('qm_device') || '{}')) } catch (e) { data = {} }\n  if (!data.uuid) data.uuid = String(Packages.java.util.UUID.randomUUID().toString())\n  if (!data.device_id) data.device_id = qmDateStamp() + qmRandomHex(48)\n  if (!data.source_uid) data.source_uid = qmRandomHex(16)\n  if (!data.mac) data.mac = '02:' + qmRandomHex(10).match(/../g).join(':')\n  data.gender = '0'\n  data.static_score = '0.4'\n  data.sys_ver = '12'\n  data.phone_level = 'M'\n  data.app_version = QM_APP_VERSION\n  data.brand = 'Redmi'\n  data.make = 'Redmi'\n  data.model = '23117RK66C'\n  if (runtimeSource) runtimeSource.put('qm_device', JSON.stringify(data))\n  return data\n}\n\nfunction qmBuildParams() {\n  var d = qmDevice.call(this)\n  var fields = [\n    ['gender', d.gender], ['static_score', d.static_score], ['uuid', d.uuid],\n    ['device-id', d.device_id], ['mac', d.mac], ['sourceuid', d.source_uid],\n    ['sys-ver', d.sys_ver], ['phone-level', d.phone_level], ['app_ver', d.app_version],\n    ['imei', ''], ['model', d.model], ['wlb-imei', ''], ['wlb-uid', d.source_uid],\n    ['client-id', d.source_uid], ['brand', d.brand], ['make', d.make], ['net_env', '1']\n  ]\n  var parts = fields.map(function (item) { return JSON.stringify(item[0]) + ':' + JSON.stringify(String(item[1])) })\n  return qmParamEncode('{' + parts.join(',') + '}')\n}\n\nfunction qmHeaderSign(token, qmParams) {\n  var values = {\n    'AUTHORIZATION': token || '', 'app-version': QM_APP_VERSION,\n    'application-id': QM_APP_ID, 'channel': QM_CHANNEL, 'is-white': '0',\n    'net-env': '1', 'platform': 'android', 'qm-params': qmParams, 'reg': ''\n  }\n  var order = ['AUTHORIZATION','app-version','application-id','channel','is-white','net-env','platform','qm-params','reg']\n  var text = ''\n  order.forEach(function (key) { text += key + '=' + values[key] })\n  return qmSign(text)\n}\n\nfunction qmDay() {\n  var d = new Date()\n  return d.getFullYear() + qmPad(d.getMonth() + 1, 2) + qmPad(d.getDate(), 2)\n}\n\nfunction qmHeaders(token) {\n  var runtimeSource = qmSourceOf(this)\n  var qmParams = qmBuildParams.call(this)\n  var now = Math.floor(Date.now() / 1000)\n  var uid = String(runtimeSource && runtimeSource.get('qm_uid') || '')\n  return {\n    'authorization': token || '', 'app-version': QM_APP_VERSION,\n    'application-id': QM_APP_ID, 'channel': QM_CHANNEL, 'is-white': '0',\n    'net-env': '1', 'platform': 'android', 'qm-params': qmParams, 'reg': '',\n    'sign': qmHeaderSign(token || '', qmParams), 'qm-uaf': qmDay() + '-' + uid,\n    'qm-it': String(now), 'qm-ii': String(now % 10000000000), 'no-permiss': '3',\n    'user-agent': 'webviewversion/0',\n    'qm-request-id': qmSign(String(Date.now()) + qmRandomHex(8))\n  }\n}\n\nfunction qmParse(text) {\n  text = String(text == null ? '' : text).replace(/^\\uFEFF/, '').trim()\n  if (!text) throw new Error('七猫接口返回空响应')\n  var value\n  try {\n    value = JSON.parse(text)\n  } catch (e) {\n    throw new Error('七猫接口返回非 JSON，请检查网络或压缩响应')\n  }\n  if (value && value.v) {\n    var plain = qmContentLayerDecode(value.v)\n    if (plain) {\n      try { value = JSON.parse(plain) }\n      catch (e2) { throw new Error('七猫加密响应解码后不是 JSON') }\n    }\n  }\n  return value\n}\n\nfunction qmForm(data) {\n  return Object.keys(data).sort().map(function (key) {\n    return encodeURIComponent(key) + '=' + encodeURIComponent(String(data[key]))\n  }).join('&')\n}\n\nfunction qmParseJwt(token) {\n  try {\n    var part = String(token).split('.')[1].replace(/-/g, '+').replace(/_/g, '/')\n    while (part.length % 4) part += '='\n    var bytes = Packages.java.util.Base64.getDecoder().decode(part)\n    return JSON.parse(String(new Packages.java.lang.String(bytes, 'UTF-8')))\n  } catch (e) { return {} }\n}\n\nfunction qmLogin(force) {\n  var runtimeSource = qmSourceOf(this)\n  var runtimeJava = qmJavaOf(this)\n  if (!runtimeSource || !runtimeJava) throw new Error('七猫运行上下文缺少 source/java')\n  var token = String(runtimeSource.get('qm_token') || '')\n  var exp = Number(runtimeSource.get('qm_exp') || 0)\n  if (!force && token && exp > Math.floor(Date.now() / 1000) + 60) return token\n  var form = {cancell_check:'1', gender:'0'}\n  form.sign = qmUrlSign(form)\n  var headers = qmHeaders.call(this, '')\n  headers['content-type'] = 'application/x-www-form-urlencoded'\n  var option = {method:'POST', headers:headers, body:qmForm(form)}\n  var response = qmParse(runtimeJava.ajax('https://xiaoshuo.wtzw.com/api/v1/login/tourist,' + JSON.stringify(option), 15000))\n  token = String(response.data && response.data.token || '')\n  if (!token) throw new Error('七猫游客登录失败')\n  var jwt = qmParseJwt(token)\n  var user = jwt.user || {}\n  runtimeSource.put('qm_token', token)\n  runtimeSource.put('qm_exp', String(jwt.exp || Math.floor(Date.now() / 1000) + 3600))\n  runtimeSource.put('qm_uid', String(user.uid || response.data.id || ''))\n  if (user.deviceId) {\n    var device = qmDevice.call(this)\n    device.device_id = String(user.deviceId)\n    runtimeSource.put('qm_device', JSON.stringify(device))\n  }\n  return token\n}\n\nfunction qmRequest(method, url, params, form) {\n  var runtimeJava = qmJavaOf(this)\n  if (!runtimeJava) throw new Error('七猫运行上下文缺少 java')\n  var token = qmLogin.call(this, false)\n  params = params || {}\n  var fullUrl = url\n  var option = {method:method, headers:qmHeaders.call(this, token)}\n  if (form) {\n    var body = {}\n    Object.keys(form).forEach(function (key) { body[key] = String(form[key]) })\n    body.sign = qmUrlSign(body)\n    option.headers['content-type'] = 'application/x-www-form-urlencoded'\n    option.body = qmForm(body)\n  } else {\n    var query = {}\n    Object.keys(params).forEach(function (key) { query[key] = String(params[key]) })\n    var parts = Object.keys(query).sort().map(function (key) { return encodeURIComponent(key) + '=' + encodeURIComponent(query[key]) })\n    parts.push('sign=' + qmUrlSign(query))\n    fullUrl += '?' + parts.join('&')\n  }\n  return qmParse(runtimeJava.ajax(fullUrl + ',' + JSON.stringify(option), 15000))\n}\n\nfunction qmGet(url, params) { return qmRequest.call(this, 'GET', url, params, null) }\n\nfunction qmPostForm(url, form) { return qmRequest.call(this, 'POST', url, {}, form) }\n\nfunction qmRequestUrl(method, url, params, form) {\n  var token = qmLogin.call(this, false)\n  params = params || {}\n  var fullUrl = url\n  var option = {method:method, headers:qmHeaders.call(this, token)}\n  if (form) {\n    var body = {}\n    Object.keys(form).forEach(function (key) { body[key] = String(form[key]) })\n    body.sign = qmUrlSign(body)\n    option.headers['content-type'] = 'application/x-www-form-urlencoded'\n    option.body = qmForm(body)\n  } else {\n    var query = {}\n    Object.keys(params).forEach(function (key) { query[key] = String(params[key]) })\n    var parts = Object.keys(query).sort().map(function (key) { return encodeURIComponent(key) + '=' + encodeURIComponent(query[key]) })\n    parts.push('sign=' + qmUrlSign(query))\n    fullUrl += '?' + parts.join('&')\n  }\n  return fullUrl + ',' + JSON.stringify(option)\n}\n\nfunction qmGetUrl(url, params) { return qmRequestUrl.call(this, 'GET', url, params, null) }\n\nfunction qmPostFormUrl(url, form) { return qmRequestUrl.call(this, 'POST', url, {}, form) }\n\nfunction qmUrlValue(url, key) {\n  var match = String(url || '').match(new RegExp('[?&#]' + key + '=([^&#,]+)'))\n  if (!match) return ''\n  try { return decodeURIComponent(match[1]) } catch (e) { return match[1] }\n}\n\nfunction qmItemId(x, mode) {\n  x = x || {}\n  if (mode == 'audio') return String(x.album_id || x.id || '')\n  if (mode == 'video') return String(x.playlet_id || x.id || '')\n  return String(x.id || x.book_id || '')\n}\n\nfunction qmIsCandidate(x, mode) {\n  x = x || {}\n  if (!qmItemId(x, mode) || !(x.title || x.original_title)) return false\n  if (mode == 'audio') {\n    return !!(x.album_id || x.data_type == 'album' || x.data_type == 'audio' ||\n      x.audio_num || x.chapter_list_desc || x.actors || x.thumb_image_link)\n  }\n  if (mode == 'video') {\n    return !!(x.playlet_id || x.data_type == 'playlet' || x.data_type == 'video' ||\n      x.total_num || x.play_num || x.video_url || x.play_list)\n  }\n  return !!(x.data_type == 'book' || x.book_type != null || x.reader_type != null ||\n    x.author || x.original_author || x.latest_chapter_id || x.latest_chapter_title || x.words_num)\n}\n\nfunction qmVideoState(kind) {\n  var runtimeCache = qmCacheOf(this)\n  if (!runtimeCache) return {pages:{}}\n  try {\n    var saved = runtimeCache.getFromMemory('qm-video-pages-' + kind)\n    var state = saved ? JSON.parse(String(saved)) : null\n    if (state && state.pages) return state\n  } catch (e) {}\n  return {pages:{}}\n}\n\nfunction qmResetVideoState(kind) {\n  var runtimeCache = qmCacheOf(this)\n  try { if (runtimeCache) runtimeCache.deleteMemory('qm-video-pages-' + kind) } catch (e) {}\n}\n\nfunction qmVideoUploadIds(kind, page) {\n  page = String(Number(page || 1) || 1)\n  if (page == '1') {\n    qmResetVideoState.call(this, kind)\n    return []\n  }\n  var state = qmVideoState.call(this, kind)\n  var ids = []\n  Object.keys(state.pages || {}).sort(function (a, b) { return Number(a) - Number(b) }).forEach(function (key) {\n    if (Number(key) < Number(page)) ids = ids.concat(state.pages[key] || [])\n  })\n  var seen = {}\n  return ids.filter(function (id) { id = String(id); if (!id || seen[id]) return false; seen[id] = 1; return true }).slice(-120).map(function (id) {\n    return {id:String(id),item_type:kind == 'animated' ? '14' : '11',ts:String(Date.now()),type:'0'}\n  })\n}\n\nfunction qmRememberVideoPage(kind, page, items) {\n  var runtimeCache = qmCacheOf(this)\n  if (!runtimeCache) return items\n  page = String(Number(page || 1) || 1)\n  var state = qmVideoState.call(this, kind)\n  var prior = {}\n  Object.keys(state.pages || {}).forEach(function (key) {\n    if (key != page) (state.pages[key] || []).forEach(function (id) { prior[String(id)] = 1 })\n  })\n  var current = []\n  var local = {}\n  var filtered = items.filter(function (item) {\n    var id = qmItemId(item, 'video')\n    if (!id || local[id] || prior[id]) return false\n    local[id] = 1\n    current.push(String(id))\n    return true\n  })\n  state.pages[page] = current\n  Object.keys(state.pages).forEach(function (key) { if (Number(key) < Number(page) - 8) delete state.pages[key] })\n  runtimeCache.putMemory('qm-video-pages-' + kind, JSON.stringify(state))\n  return filtered\n}\n\nfunction qmExploreMarker(url, kind, page) {\n  var comma = String(url).indexOf(',')\n  if (comma < 0) comma = String(url).length\n  return String(url).slice(0, comma) + '#qm_video=' + encodeURIComponent(kind) + '&qm_page=' + encodeURIComponent(String(page)) + String(url).slice(comma)\n}\n\nfunction qmExploreHomeUrl(mode, page, dramaKind) {\n  page = String(Number(page || 1) || 1)\n  if (mode == 'publish') {\n    return qmPostFormUrl.call(this, 'https://api-bc.wtzw.com/api/v7/book-store', {\n      book_id:'',book_privacy:'1',count:'3',new_num:'4',new_user:'1',part:page == '1' ? '1' : '2',\n      publish_tab_ab_test:'1',read_preference:'0',refresh_state:page == '1' ? '4' : '7',scene_num:'5',\n      select_num:'6',tab_type:'3',upload_ids:'[]'\n    })\n  }\n  if (mode == 'audio') {\n    return qmPostFormUrl.call(this, 'https://api-bc.wtzw.com/api/v3/album/index', {\n      book_privacy:'1',cache_ver:'',read_preference:'0',real_person_num:'6',refresh_state:'4',upload_ids:'[]',user_state:''\n    })\n  }\n  if (dramaKind == 'drama') {\n    var dramaUrl = qmPostFormUrl.call(this, 'https://api-gw.wtzw.com/playlet/api/v2/list-by-tagId', {\n      page:page,playlet_privacy:'1',read_preference:'0',refresh_state:page == '1' ? '4' : '7',tag_id:'',upload_ids:JSON.stringify(qmVideoUploadIds.call(this, 'drama', page))\n    })\n    return qmExploreMarker(dramaUrl, 'drama', page)\n  }\n  var animatedUrl = qmPostFormUrl.call(this, 'https://api-gw.wtzw.com/playlet/api/v1/animated/index', {\n    change_tag:'0',page:page,playlet_privacy:'1',read_preference:'0',refresh_state:page == '1' ? '4' : '7',tag_id:'',upload_ids:JSON.stringify(qmVideoUploadIds.call(this, 'animated', page))\n  })\n  return qmExploreMarker(animatedUrl, 'animated', page)\n}\n\nfunction qmExploreMediaSearchUrl(mode, keyword, page) {\n  page = String(Number(page || 1) || 1)\n  if (mode == 'audio') {\n    return qmGetUrl.call(this, 'https://api-bc.wtzw.com/search/v1/words', {\n      extend:'',tab:'1',gender:'0',refresh_state:'8',track_id:qmDevice.call(this).source_uid + Date.now(),page:page,\n      book_id:'',book_privacy:'1',wd:String(keyword),read_preference:'4',is_short_story_user:'0'\n    })\n  }\n  return qmGetUrl.call(this, 'https://api-bc.wtzw.com/search/v1/playlet', {\n    wd:String(keyword),read_preference:'4',page:page,track_id:qmDevice.call(this).source_uid + Date.now()\n  })\n}\nreturn {\nget:qmGet, post:qmPostForm, parse:qmParse, source:qmSourceOf, java:qmJavaOf,\nsearch:qmExploreMediaSearchUrl, home:qmExploreHomeUrl, login:qmLogin,\nremember:qmRememberVideoPage, candidate:qmIsCandidate, id:qmItemId, cache:qmCacheOf\n};\n})(qmMd5);\n\nvar QMA_PLAYER_HTML = \"<!doctype html>\\n<html lang=\\\"zh-CN\\\"><head><meta charset=\\\"utf-8\\\"><meta name=\\\"viewport\\\" content=\\\"width=device-width,initial-scale=1,viewport-fit=cover\\\">\\n<title>七猫剧场</title><style>\\n:root{color-scheme:light dark;font-family:system-ui,sans-serif;background:#11151f;color:#eef1fa}body{margin:0;padding:18px}h1{font-size:21px;margin:0 0 14px}video{display:block;width:100%;max-height:60vh;min-height:180px;background:#000;border-radius:14px}p{line-height:1.6;color:#b9c3d7}button,select{font:inherit;background:#26324c;color:#eef1fa;border:1px solid #4b5b7b;border-radius:10px;padding:11px;margin:5px 3px}button:disabled{opacity:.4}.controls{display:flex;flex-wrap:wrap;margin-top:12px}select{flex:1;min-width:140px}#status{min-height:3em;font-size:14px}\\n</style></head><body>\\n<h1 id=\\\"heading\\\">七猫剧场</h1><video id=\\\"video\\\" controls playsinline preload=\\\"metadata\\\"></video>\\n<div class=\\\"controls\\\"><button id=\\\"prev\\\">上一集</button><select id=\\\"episodes\\\" aria-label=\\\"选集\\\"></select><button id=\\\"next\\\">下一集</button></div>\\n<div class=\\\"controls\\\"><button id=\\\"retry\\\">刷新播放地址</button><button id=\\\"external\\\">外部播放器</button></div>\\n<p id=\\\"status\\\" role=\\\"status\\\">正在加载选集和播放地址…</p>\\n<script>\\n(function(){\\n  'use strict';\\n  var input=__QMA_INPUT__, current=String(input.episode), rows=[], busy=false, playable=false;\\n  function el(id){return document.getElementById(id)}\\n  var video=el('video');\\n  function encoded(){return btoa(JSON.stringify({qma:1,mode:input.mode,id:input.id,stage:'play',episode:current}));}\\n  async function run(method){\\n    if(typeof window.qmaRun!=='function')throw new Error('播放器与阅读器的连接尚未就绪，请关闭后重试');\\n    return await window.qmaRun('QMA.'+method+'.call(this,'+JSON.stringify(encoded())+')');\\n  }\\n  function buttons(){\\n    var i=rows.findIndex(function(x){return x.number===current});\\n    el('prev').disabled=busy||i<=0;el('next').disabled=busy||i<0||i>=rows.length-1;\\n    el('episodes').disabled=busy||!rows.length;el('retry').disabled=busy;el('external').disabled=busy||!playable;\\n  }\\n  async function load(){\\n    if(busy)return;\\n    busy=true;playable=false;buttons();video.pause();video.removeAttribute('src');video.load();\\n    el('heading').textContent='第'+current+'集';el('status').textContent='正在获取播放地址…';\\n    try{\\n      var raw=await run('playerData'),data=typeof raw==='string'?JSON.parse(raw):raw;\\n      if(!data||!data.ok)throw new Error(data&&data.error||'播放信息加载失败');\\n      rows=data.episodes||[];el('episodes').textContent='';\\n      rows.forEach(function(row){var option=document.createElement('option');option.value=row.number;option.textContent=row.title+(row.available?'':' · 暂无地址');el('episodes').appendChild(option)});\\n      el('episodes').value=current;\\n      if(!data.url){el('status').textContent='本集暂无可播放地址，可以选择其他集或稍后刷新。';return;}\\n      if(!/^https?:\\\\/\\\\//i.test(data.url))throw new Error('播放地址格式无效');\\n      video.src=data.url;playable=true;el('status').textContent='点击画面中的播放按钮开始观看。';\\n    }catch(e){el('status').textContent='加载失败：'+(e.message||String(e));}\\n    finally{busy=false;buttons()}\\n  }\\n  function move(delta){if(busy)return;var i=rows.findIndex(function(x){return x.number===current});if(rows[i+delta]){current=rows[i+delta].number;load()}}\\n  el('prev').onclick=function(){move(-1)};el('next').onclick=function(){move(1)};\\n  el('episodes').onchange=function(){current=this.value;load()};el('retry').onclick=load;\\n  el('external').onclick=async function(){if(busy)return;busy=true;buttons();try{video.pause();await run('external');el('status').textContent='已请求打开外部播放器。'}catch(e){el('status').textContent='打开失败：'+(e.message||e)}finally{busy=false;buttons()}};\\n  video.onerror=function(){if(playable)el('status').textContent='网页播放失败，请刷新地址或尝试外部播放器。';};\\n  window.addEventListener('pagehide',function(){video.pause();video.removeAttribute('src');video.load()});\\n  load();\\n})();\\n</script></body></html>\\n\";\n/* MD3 beta.45 adapter. All media links store IDs, never expiring credentials. */\nvar QMA = (function () {\n  function bridge(ctx) { return QMA_NET.java(ctx); }\n  function state(ctx, message) {\n    var s = QMA_NET.source(ctx);\n    if (s) s.put('qma_status', String(message));\n  }\n  function id(value) {\n    value = String(value == null ? '' : value);\n    if (!/^\\d+$/.test(value)) throw new Error('媒体标识无效');\n    return value;\n  }\n  function dataUrl(ctx, value) {\n    value.qma = 1;\n    return 'data:;base64,' + bridge(ctx).base64Encode(JSON.stringify(value)) + ',{\"type\":\"qma\"}';\n  }\n  function meta(url, text) {\n    var match = String(url || '').match(/^data:;base64,([A-Za-z0-9+/=]+)/);\n    try {\n      if (match) {\n        var obj = JSON.parse(String(bridge(this).base64Decode(match[1])));\n        if (obj && obj.qma === 1) return obj;\n      }\n    } catch (ignored) {}\n    // MD3 StrResponse maps data: URLs to localhost; recover from the hex body.\n    try {\n      var raw = String(text == null ? '' : text), value;\n      if (/^(?:[0-9a-f]{2})+$/i.test(raw)) raw = String(bridge(this).hexDecodeToString(raw));\n      value = JSON.parse(raw);\n      if (value && value.qma === 1) return value;\n      if (value && value.qma_meta && value.qma_meta.qma === 1) return value.qma_meta;\n    } catch (ignored2) {}\n    try {\n      var b = this && this.book ? this.book : typeof book !== 'undefined' ? book : null;\n      var saved = b && b.getVariable ? String(b.getVariable('qma_meta') || '') : '';\n      if (saved) return JSON.parse(saved);\n    } catch (ignored3) {}\n    return null;\n  }\n  function payload(value) {\n    var p = typeof value === 'string' ? QMA_NET.parse(value) : value;\n    if (!p || !p.data || p.errors || (p.code != null && Number(p.code) !== 0 && Number(p.code) !== 200)) {\n      throw new Error('七猫媒体接口未返回有效数据' + (p && p.code != null ? '（' + p.code + '）' : ''));\n    }\n    return p.data;\n  }\n  function plain(value) { return String(value == null ? '' : value).replace(/<[^>]*>/g, '').replace(/&amp;/g, '&').trim(); }\n  function http(value) {\n    value = String(value || '').trim();\n    if (!/^https?:\\/\\/[^\\s<>\"']+$/i.test(value)) throw new Error('本集暂无可播放地址');\n    return value;\n  }\n  function mark(ctx, mode, mediaId, stage, episode) {\n    var m = {mode:mode,id:id(mediaId),stage:stage};\n    if (episode != null) m.episode = id(episode);\n    return dataUrl(ctx, m);\n  }\n  function novel(x) {\n    return {title:x.original_title || x.title,author:x.original_author || x.author || '',\n      cover:x.image_link || '',intro:x.intro || '',kind:x.ptags || '',words:x.words_num || '',\n      last:x.latest_chapter_title || '',url:qmDetail(id(x.id))};\n  }\n  function media(ctx, x, mode) {\n    if (!QMA_NET.candidate(x, mode === 'audio' ? 'audio' : 'video')) return null;\n    var mediaId = id(QMA_NET.id(x, mode === 'audio' ? 'audio' : 'video'));\n    var actual = mode === 'audio' ? 'audio' : String(x.content_type || '') === '2' ? 'animated' : 'drama';\n    var kind = {audio:'听书',drama:'短剧',animated:'漫剧'}[actual];\n    return {title:plain(x.original_title || x.title),author:mode === 'audio' ? plain(x.author || x.actors || '七猫听书') : '七猫' + kind,\n      cover:x.image_link || x.thumb_image_link || '',intro:plain(x.intro || x.description || x.sub_title),kind:kind,words:'',\n      last:x.chapter_list_desc || ((x.total_num || x.audio_num) ? '共 ' + (x.total_num || x.audio_num) + ' 集' : ''),\n      url:mark(ctx,actual,mediaId,'info')};\n  }\n  function collect(ctx, node, mode, output, seen, depth) {\n    if (!node || depth > 8) return;\n    if (Array.isArray(node)) { node.forEach(function(x) { collect(ctx,x,mode,output,seen,depth+1); }); return; }\n    if (typeof node !== 'object') return;\n    if (QMA_NET.candidate(node,mode === 'audio' ? 'audio' : 'video')) {\n      var item = media(ctx,node,mode);\n      if (item && !seen[item.url]) { seen[item.url] = true; output.push(item); }\n    }\n    Object.keys(node).forEach(function(k) {\n      if (!/^(meta|stat_params|track_id|tag_items|category_list|rank_list)$/.test(k)) collect(ctx,node[k],mode,output,seen,depth+1);\n    });\n  }\n  function searchUrl(key, page) {\n    return dataUrl(this,{stage:'search',key:String(key || '').trim(),page:Math.max(1,Number(page)||1)});\n  }\n  function search(ctx, request) {\n    var keyword = request.key, mode = 'novel';\n    var prefix = keyword.match(/^(小说|听书|有声|短剧|漫剧|视频|全部|n|a|v)\\s*[:：]\\s*(.*)$/i);\n    if (prefix) {\n      mode = {'小说':'novel','听书':'audio','有声':'audio','短剧':'drama','漫剧':'animated','视频':'video','全部':'all',n:'novel',a:'audio',v:'video'}[prefix[1].toLowerCase()];\n      keyword = prefix[2].trim();\n    }\n    if (!keyword) throw new Error('请输入要搜索的名称，例如 听书:三国');\n    var modes = mode === 'all' ? ['novel','audio','video'] : [mode], out = [], failures = [], successes = 0;\n    modes.forEach(function(selected) {\n      try {\n        var rows;\n        if (selected === 'novel') {\n          rows = payload(String(bridge(ctx).ajax(qmSearch(keyword,request.page),15000))).books;\n          if (!Array.isArray(rows)) throw new Error('小说搜索响应缺少书籍列表');\n          out = out.concat(rows.filter(function(x){return x.id && (x.title || x.original_title);}).map(novel));\n        } else {\n          var url = QMA_NET.search.call(ctx,selected === 'audio' ? 'audio' : 'video',keyword,request.page);\n          var data = payload(String(bridge(ctx).ajax(url,15000))), items = [];\n          collect(ctx,data,selected,items,{},0);\n          out = out.concat(items.filter(function(x){return selected !== 'animated' && selected !== 'drama' || x.kind === (selected === 'animated' ? '漫剧' : '短剧');}));\n        }\n        successes++;\n      } catch (e) { failures.push(selected + '：' + String(e.message || e)); }\n    });\n    state(ctx,failures.length ? '部分搜索失败：' + failures.join('；') : '搜索完成，共 ' + out.length + ' 项');\n    if (!successes) throw new Error(failures.join('；'));\n    return out;\n  }\n  function list(text, url) {\n    var m = meta.call(this,url,text), ctx = this;\n    if (!m) return (payload(String(text)).books || []).map(novel);\n    if (m.stage === 'search') return search(ctx,m);\n    if (m.stage !== 'explore') throw new Error('无效的列表入口');\n    var out = [], d;\n    if (m.mode === 'audio') {\n      var filters = QMA_DISC.audioNormalize(m.filters || {});\n      if (QMA_DISC.audioEnded(ctx,filters,m.page)) return [];\n      d = payload(QMA_NET.get.call(ctx,'https://api-bc.wtzw.com/api/v1/album/category-list',QMA_DISC.audioParams(filters,m.page)));\n      if (!Array.isArray(d.books)) throw new Error('听书分类响应缺少列表');\n      QMA_DISC.audioPages(ctx,filters,d.meta);\n      collect(ctx,d.books,'audio',out,{},0);\n    }\n    else {\n      var params = QMA_DISC.videoParams(ctx,m);\n      if (!params) return [];\n      var path = m.mode === 'animated' ? '/playlet/api/v1/animated/index' : '/playlet/api/v2/list-by-tagId';\n      d = payload(QMA_NET.post.call(ctx,'https://api-gw.wtzw.com'+path,params));\n      if (!Array.isArray(d.playlet_list)) throw new Error('视频首页响应缺少剧集列表');\n      var contentType = m.mode === 'animated' ? '2' : '1';\n      var raw = d.playlet_list.filter(function(x){return String(x.content_type) === contentType;});\n      raw = QMA_DISC.videoRows(ctx,m,raw,d.next_page);\n      out = raw.map(function(x){return media(ctx,x,m.mode);}).filter(function(x){return !!x;});\n    }\n    state(ctx,'发现页已加载 ' + out.length + ' 项');\n    return out;\n  }\n  function exploreUrl(mode, page, selection) {\n    if (!/^(audio|drama|animated)$/.test(mode)) throw new Error('媒体分类无效');\n    var request = {stage:'explore',mode:mode,page:Math.max(1,Math.floor(Number(page)||1))};\n    if (mode === 'audio') request.filters = QMA_DISC.audioNormalize(selection || {});\n    else request.tag = QMA_DISC.videoTag(mode,selection == null ? '0' : String(selection));\n    return dataUrl(this,request);\n  }\n  function getInfo(ctx,m) {\n    var d = payload(QMA_NET.get.call(ctx,m.mode === 'audio' ? 'https://api-bc.wtzw.com/api/v2/album/detail' : 'https://api-gw.wtzw.com/playlet/api/info',\n      m.mode === 'audio' ? {album_id:id(m.id)} : {playlet_id:id(m.id)}));\n    var raw = m.mode === 'audio' ? d.book || d : d.playlet || d.playlet_info || d;\n    if (!raw.title) throw new Error('媒体详情缺少标题，请刷新后重试');\n    return {raw:raw,data:d};\n  }\n  function info(url, text) {\n    var m = meta.call(this,url,text), raw = getInfo(this,m).raw;\n    var kind = m.mode === 'audio' ? '听书' : m.mode === 'animated' || String(raw.content_type) === '2' ? '漫剧' : '短剧';\n    var b = this && this.book ? this.book : typeof book !== 'undefined' ? book : null;\n    if (b) {\n      b.type = m.mode === 'audio' ? 32 : 8;\n      if (b.putVariable) {\n        b.putVariable('qma_meta',JSON.stringify(m));\n        b.putVariable('qma_card_title',JSON.stringify({mode:m.mode,id:m.id,title:raw.title}));\n      }\n    }\n    return {qma_meta:m,id:m.id,title:raw.title,author:m.mode === 'audio' ? raw.author || raw.actors || '七猫听书' : '七猫' + kind,\n      image_link:raw.image_link || raw.thumb_image_link || '',intro:plain(raw.intro || raw.description || raw.desc || raw.summary) || '七猫' + kind,\n      book_tag_list:[{title:kind}],latest_chapter_title:raw.chapter_list_desc || '共 ' + (raw.total_num || raw.audio_num || '?') + ' 集',\n      toc_url:mark(this,m.mode,m.id,'toc'),words_num:'',update_time:0,statement:'七猫'};\n  }\n  function videos(ctx,m) {\n    var d = payload(QMA_NET.get.call(ctx,'https://api-gw.wtzw.com/playlet/api/info',{playlet_id:id(m.id)}));\n    var rows = d.play_list || (d.playlet || d.playlet_info || {}).play_list;\n    if (!Array.isArray(rows)) throw new Error('视频响应缺少选集列表');\n    var seen = {}, items = [];\n    rows.forEach(function(x,index){\n      var n = String(x.sort == null ? index+1 : x.sort);\n      if (!/^\\d+$/.test(n) || seen[n]) return;\n      seen[n] = true;\n      items.push({number:n,title:'第'+n+'集',duration:x.duration || '',url:String(x.video_url || x.video_url_h265 || '')});\n    });\n    return items.sort(function(a,b){return Number(a.number)-Number(b.number);});\n  }\n  function toc(url, text) {\n    var m = meta.call(this,url,text), ctx = this;\n    var b = ctx && ctx.book ? ctx.book : typeof book !== 'undefined' ? book : null;\n    // MD3 resets the book type from bookSourceType before every TOC refresh.\n    if (b) b.type = m.mode === 'audio' ? 32 : 8;\n    if (m.mode === 'audio') {\n      var d = payload(QMA_NET.get.call(ctx,'https://api-ks.wtzw.com/api/v1/album/chapter-list',{album_id:id(m.id),source:'0'}));\n      var rows = d.chapter_list || d.list || d.chapters;\n      if (!Array.isArray(rows)) throw new Error('听书响应缺少章节列表');\n      return rows.map(function(x,index){\n        return {title:x.title || x.chapter_title || '第'+(index+1)+'集',url:mark(ctx,'audio',m.id,'play',x.id || x.chapter_id),info:'时长 '+(x.duration || '-')+' 秒'};\n      });\n    }\n    return videos(ctx,m).map(function(x){return {title:x.title,url:mark(ctx,m.mode,m.id,'play',x.number),info:'时长 '+(x.duration || '-')+' 秒'};});\n  }\n  function xml(value) {\n    var escaped={'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&apos;'};\n    return String(value).replace(/[&<>\"']/g,function(c){return escaped[c];});\n  }\n  function cardTitle(ctx,m) {\n    var b = ctx && ctx.book ? ctx.book : typeof book !== 'undefined' ? book : null;\n    try { if (b && b.name && String(b.name).trim()) return String(b.name).trim(); } catch (ignored) {}\n    try {\n      var saved=JSON.parse(String(b && b.getVariable ? b.getVariable('qma_card_title') || '{}' : '{}'));\n      if (saved.mode===m.mode && String(saved.id)===String(m.id) && saved.title) return String(saved.title);\n    } catch (ignored2) {}\n    return '七猫漫剧';\n  }\n  function titleLines(value) {\n    value=String(value).replace(/[\\x00-\\x1f]/g,' ').trim();\n    var lines=[],line='',width=0;\n    for(var i=0;i<value.length;i++) {\n      var c=value.charAt(i),code=value.charCodeAt(i);\n      if(code>=0xd800 && code<=0xdbff && i+1<value.length && value.charCodeAt(i+1)>=0xdc00 && value.charCodeAt(i+1)<=0xdfff)c+=value.charAt(++i);\n      var unit=code<128?0.6:1;\n      if(width+unit>20) {\n        if(lines.length===1){lines.push(line+'…');return lines;}\n        lines.push(line);line='';width=0;\n      }\n      line+=c;width+=unit;\n    }\n    if(line)lines.push(line);\n    return lines.length?lines:['七猫漫剧'];\n  }\n  function animatedCard(ctx,m) {\n    var lines=titleLines(cardTitle(ctx,m)),episodeY=134+(lines.length-1)*38,buttonY=episodeY+24,height=buttonY+158;\n    var svg='<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"720\" height=\"'+height+'\" viewBox=\"0 0 720 '+height+'\" font-family=\"sans-serif\">'+\n      '<rect x=\"1\" y=\"1\" width=\"718\" height=\"'+(height-2)+'\" rx=\"28\" fill=\"#FAFCFF\" stroke=\"#DCE5F2\" stroke-width=\"2\"/>'+\n      '<rect x=\"36\" y=\"26\" width=\"62\" height=\"26\" rx=\"8\" fill=\"#E9EEFF\"/>'+\n      '<text x=\"67\" y=\"45\" text-anchor=\"middle\" font-size=\"16\" fill=\"#4C63AE\">漫剧</text>'+\n      '<text x=\"684\" y=\"45\" text-anchor=\"end\" font-size=\"16\" fill=\"#7A879B\">七猫 · 视频</text>';\n    lines.forEach(function(line,index){svg+='<text x=\"36\" y=\"'+(96+index*38)+'\" font-size=\"30\" font-weight=\"700\" fill=\"#202C42\">'+xml(line)+'</text>';});\n    svg+='<text x=\"36\" y=\"'+episodeY+'\" font-size=\"20\" fill=\"#6D7B91\">第 '+id(m.episode)+' 集</text>'+\n      '<rect x=\"36\" y=\"'+buttonY+'\" width=\"648\" height=\"72\" rx=\"18\" fill=\"#4663BA\"/>'+\n      '<path d=\"M72 '+(buttonY+23)+' L72 '+(buttonY+49)+' L94 '+(buttonY+36)+' Z\" fill=\"#FFFFFF\"/>'+\n      '<text x=\"360\" y=\"'+(buttonY+45)+'\" text-anchor=\"middle\" font-size=\"25\" font-weight=\"700\" fill=\"#FFFFFF\">外部播放</text>'+\n      '<text x=\"360\" y=\"'+(buttonY+106)+'\" text-anchor=\"middle\" font-size=\"18\" fill=\"#6D7B91\">确认跳转后，选择 VLC 等视频播放器</text>'+\n      '<text x=\"360\" y=\"'+(buttonY+132)+'\" text-anchor=\"middle\" font-size=\"18\" fill=\"#8B96A7\">换集请返回目录 · 点击时刷新播放地址</text></svg>';\n    var encoded=bridge(ctx).base64Encode(JSON.stringify(m));\n    var opts={style:'full',click:'QMA.external.call(this,'+JSON.stringify(String(encoded))+')'};\n    // A single image fixes typography independently of the reader's body font.\n    return '<img src=\"data:image/svg+xml;base64,'+bridge(ctx).base64Encode(svg)+','+JSON.stringify(opts)+'\">';\n  }\n  function content(url, text) {\n    var m = meta.call(this,url,text);\n    if (!m || m.stage !== 'play') throw new Error('无效的媒体章节');\n    if (m.mode === 'audio') {\n      var d = payload(QMA_NET.get.call(this,'https://api-ks.wtzw.com/api/v1/album/info',{album_id:id(m.id),chapter_id:id(m.episode),new_user:'0'}));\n      var voices = d.voice_list || [], voice = voices.filter(function(x){return /^https?:\\/\\//i.test(String(x.voice_url || ''));})[0];\n      return http(voice && voice.voice_url);\n    }\n    if (m.mode === 'animated') return animatedCard(this,m);\n    var encoded = bridge(this).base64Encode(JSON.stringify(m));\n    var svg = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"540\" height=\"120\" viewBox=\"0 0 540 120\"><rect width=\"540\" height=\"120\" rx=\"24\" fill=\"#3957a5\"/><path d=\"M42 32L42 88L84 60Z\" fill=\"white\"/><text x=\"110\" y=\"72\" font-size=\"30\" fill=\"white\">点击播放 · 第'+id(m.episode)+'集</text></svg>';\n    var opts = {style:'full',click:'QMA.open.call(this,'+JSON.stringify(String(encoded))+')'};\n    var tip = '点击上方按钮打开播放器，可切换选集或使用外部播放器。';\n    return '第'+m.episode+'集\\n\\n<img src=\"data:image/svg+xml;base64,'+bridge(this).base64Encode(svg)+','+JSON.stringify(opts)+'\">\\n\\n'+tip;\n  }\n  function decode(ctx,encoded) {\n    var m = JSON.parse(String(bridge(ctx).base64Decode(String(encoded))));\n    if (!/^(drama|animated)$/.test(m.mode)) throw new Error('无效的视频类型');\n    id(m.id); id(m.episode);\n    return m;\n  }\n  function playerData(encoded) {\n    try {\n      var m = decode(this,encoded), rows = videos(this,m), current = null;\n      rows.forEach(function(x){if (x.number === String(m.episode)) current = x;});\n      if (!current) throw new Error('目录中没有本集，请返回刷新目录');\n      var address = '';\n      try { address = http(current.url); } catch (e) {}\n      state(this,address ? '已解析第'+m.episode+'集播放地址' : '第'+m.episode+'集暂无可播放地址');\n      return JSON.stringify({ok:true,url:address,title:current.title,episode:m.episode,\n        episodes:rows.map(function(x){return {number:x.number,title:x.title,available:!!x.url};})});\n    } catch (e) { state(this,String(e.message || e)); return JSON.stringify({ok:false,error:String(e.message || e)}); }\n  }\n  function open(encoded) {\n    var m = decode(this,encoded);\n    // Cached animated chapters may still contain the older QMA.open button.\n    if (m.mode === 'animated') return external.call(this,encoded);\n    var safe = JSON.stringify({encoded:String(encoded),mode:m.mode,id:m.id,episode:m.episode}).replace(/</g,'\\\\u003c');\n    var html = QMA_PLAYER_HTML.replace('__QMA_INPUT__',function(){return safe;});\n    bridge(this).showBrowser('https://api-gw.wtzw.com/',html,'window.qmaRun = run;',JSON.stringify({state:3,isHideable:true,heightPercentage:0.94,widthPercentage:1,skipCollapsed:true,hardwareAccelerated:true}));\n  }\n  function external(encoded) {\n    var data = JSON.parse(playerData.call(this,encoded));\n    if (!data.ok || !data.url) throw new Error(data.error || '本集暂无可播放地址');\n    bridge(this).openUrl(http(data.url),'video/*');\n    return true;\n  }\n  function help() { bridge(this).longToast('发现页长按书源→登录，可选择小说、听书、漫剧、短剧。切换后返回发现，收起再展开；必要时长按→刷新。听书支持分类、标签、状态、排序。默认搜索小说；其他内容输入 听书:名称 / 短剧:名称 / 漫剧:名称 / 全部:名称。'); }\n  function status() { bridge(this).longToast(String(QMA_NET.source(this).get('qma_status') || '尚未请求媒体接口')); }\n  function login() { try { QMA_NET.login.call(this,false); state(this,'媒体游客登录成功'); } catch(e) { state(this,String(e.message || e)); } status.call(this); }\n  function reset() {\n    var s = QMA_NET.source(this);\n    ['qm_token','qm_exp','qm_uid','qm_device'].forEach(function(k){s.put(k,'');});\n    state(this,'媒体游客身份已重置，下次媒体请求重新登录'); status.call(this);\n  }\n  return {meta:meta,searchUrl:searchUrl,list:list,exploreUrl:exploreUrl,info:info,toc:toc,content:content,\n    open:open,playerData:playerData,external:external,help:help,status:status,login:login,reset:reset};\n})();\n\nvar QMA_CATALOG = {\"audio\":[{\"name\":\"总裁\",\"id\":\"682\",\"tags\":[[\"全部\",\"-99\"],[\"有声小说\",\"923\"],[\"言情\",\"745\"],[\"现代言情\",\"772\"],[\"都市\",\"758\"],[\"甜宠\",\"21\"],[\"HE\",\"581\"],[\"优质网文\",\"1388\"],[\"1V1\",\"585\"],[\"霸道\",\"239\"],[\"虐恋\",\"16\"],[\"先婚后爱\",\"524\"],[\"萌宝\",\"356\"],[\"追妻火葬场\",\"753\"],[\"打脸虐渣\",\"739\"],[\"腹黑\",\"789\"]]},{\"name\":\"异能\",\"id\":\"644\",\"tags\":[[\"全部\",\"-99\"],[\"有声小说\",\"923\"],[\"都市\",\"758\"],[\"爽文\",\"570\"],[\"逆袭\",\"400\"],[\"优质网文\",\"1388\"],[\"热血\",\"1\"],[\"系统\",\"782\"],[\"金手指\",\"756\"],[\"扮猪吃虎\",\"794\"],[\"医生\",\"156\"],[\"多女主\",\"945\"],[\"强者回归\",\"402\"],[\"赘婿\",\"36\"],[\"重生\",\"779\"],[\"无敌流\",\"305\"]]},{\"name\":\"悬疑\",\"id\":\"27\",\"tags\":[[\"全部\",\"-99\"],[\"有声小说\",\"923\"],[\"奇闻异事\",\"769\"],[\"恐怖\",\"567\"],[\"奇闻怪谈\",\"1396\"],[\"推理\",\"668\"],[\"都市\",\"758\"],[\"风水\",\"437\"],[\"悬疑探案\",\"1390\"],[\"侦探\",\"592\"],[\"探险\",\"697\"],[\"智商在线\",\"806\"],[\"烧脑\",\"571\"],[\"言情\",\"745\"],[\"第一人称\",\"977\"],[\"盗墓\",\"327\"]]},{\"name\":\"宫斗\",\"id\":\"343\",\"tags\":[[\"全部\",\"-99\"],[\"有声小说\",\"923\"],[\"言情\",\"745\"],[\"古代言情\",\"773\"],[\"古代\",\"604\"],[\"甜宠\",\"21\"],[\"穿越\",\"373\"],[\"优质网文\",\"1388\"],[\"权谋\",\"785\"],[\"女强\",\"620\"],[\"重生\",\"779\"],[\"爽文\",\"570\"],[\"宅斗\",\"342\"],[\"1V1\",\"585\"],[\"皇帝\",\"62\"],[\"皇后\",\"106\"]]},{\"name\":\"历史\",\"id\":\"669\",\"tags\":[[\"全部\",\"-99\"],[\"人文社科\",\"796\"],[\"传记\",\"591\"],[\"有声小说\",\"923\"],[\"近代\",\"728\"],[\"穿越\",\"373\"],[\"文化\",\"685\"],[\"历史万象\",\"1391\"],[\"社会\",\"723\"],[\"爽文\",\"570\"],[\"古代\",\"604\"],[\"评书\",\"927\"],[\"文学艺术\",\"795\"],[\"曲艺\",\"925\"],[\"热血\",\"1\"],[\"大明\",\"636\"]]},{\"name\":\"穿越\",\"id\":\"373\",\"tags\":[[\"全部\",\"-99\"],[\"有声小说\",\"923\"],[\"言情\",\"745\"],[\"古代言情\",\"773\"],[\"古代\",\"604\"],[\"爽文\",\"570\"],[\"甜宠\",\"21\"],[\"优质网文\",\"1388\"],[\"种田\",\"317\"],[\"历史\",\"669\"],[\"女强\",\"620\"],[\"逆袭\",\"400\"],[\"玄幻\",\"717\"],[\"历史万象\",\"1391\"],[\"1V1\",\"585\"],[\"系统\",\"782\"]]},{\"name\":\"年代\",\"id\":\"672\",\"tags\":[[\"全部\",\"-99\"],[\"有声小说\",\"923\"],[\"现代言情\",\"772\"],[\"言情\",\"745\"],[\"重生\",\"779\"],[\"现实题材\",\"12\"],[\"优质网文\",\"1388\"],[\"甜宠\",\"21\"],[\"致富\",\"492\"],[\"都市\",\"758\"],[\"爽文\",\"570\"],[\"乡村\",\"599\"],[\"励志\",\"786\"],[\"种田\",\"317\"],[\"打脸虐渣\",\"739\"],[\"1V1\",\"585\"]]},{\"name\":\"乡村\",\"id\":\"599\",\"tags\":[[\"全部\",\"-99\"],[\"有声小说\",\"923\"],[\"都市\",\"758\"],[\"爽文\",\"570\"],[\"逆袭\",\"400\"],[\"优质网文\",\"1388\"],[\"奇闻异事\",\"769\"],[\"现实题材\",\"12\"],[\"恐怖\",\"567\"],[\"悬疑\",\"27\"],[\"奇闻怪谈\",\"1396\"],[\"年代\",\"672\"],[\"多女主\",\"945\"],[\"医生\",\"156\"],[\"风水\",\"437\"],[\"致富\",\"492\"]]},{\"name\":\"重生\",\"id\":\"779\",\"tags\":[[\"全部\",\"-99\"],[\"有声小说\",\"923\"],[\"言情\",\"745\"],[\"爽文\",\"570\"],[\"古代言情\",\"773\"],[\"古代\",\"604\"],[\"甜宠\",\"21\"],[\"都市\",\"758\"],[\"优质网文\",\"1388\"],[\"现代言情\",\"772\"],[\"复仇\",\"790\"],[\"年代\",\"672\"],[\"打脸虐渣\",\"739\"],[\"女强\",\"620\"],[\"逆袭\",\"400\"],[\"1V1\",\"585\"]]},{\"name\":\"种田\",\"id\":\"317\",\"tags\":[[\"全部\",\"-99\"],[\"有声小说\",\"923\"],[\"言情\",\"745\"],[\"古代言情\",\"773\"],[\"古代\",\"604\"],[\"穿越\",\"373\"],[\"优质网文\",\"1388\"],[\"致富\",\"492\"],[\"甜宠\",\"21\"],[\"爽文\",\"570\"],[\"女强\",\"620\"],[\"1V1\",\"585\"],[\"随身空间\",\"345\"],[\"重生\",\"779\"],[\"金手指\",\"756\"],[\"HE\",\"581\"]]},{\"name\":\"武侠\",\"id\":\"371\",\"tags\":[[\"全部\",\"-99\"],[\"有声小说\",\"923\"],[\"热血\",\"1\"],[\"古代\",\"604\"],[\"评书\",\"927\"],[\"曲艺\",\"925\"],[\"历史\",\"669\"],[\"爽文\",\"570\"],[\"言情\",\"745\"],[\"古代言情\",\"773\"],[\"逆袭\",\"400\"],[\"杀伐果断\",\"202\"],[\"智商在线\",\"806\"],[\"优质网文\",\"1388\"],[\"仙侠\",\"589\"],[\"玄幻\",\"717\"]]},{\"name\":\"仙侠\",\"id\":\"589\",\"tags\":[[\"全部\",\"-99\"],[\"有声小说\",\"923\"],[\"修仙\",\"659\"],[\"爽文\",\"570\"],[\"热血\",\"1\"],[\"穿越\",\"373\"],[\"玄幻\",\"717\"],[\"逆袭\",\"400\"],[\"燃向网文\",\"1393\"],[\"优质网文\",\"1388\"],[\"杀伐果断\",\"202\"],[\"洪荒\",\"559\"],[\"系统\",\"782\"],[\"扮猪吃虎\",\"794\"],[\"言情\",\"745\"],[\"幻想言情\",\"774\"]]},{\"name\":\"女强\",\"id\":\"620\",\"tags\":[[\"全部\",\"-99\"],[\"有声小说\",\"923\"],[\"言情\",\"745\"],[\"古代言情\",\"773\"],[\"古代\",\"604\"],[\"甜宠\",\"21\"],[\"爽文\",\"570\"],[\"穿越\",\"373\"],[\"优质网文\",\"1388\"],[\"现代言情\",\"772\"],[\"1V1\",\"585\"],[\"重生\",\"779\"],[\"都市\",\"758\"],[\"种田\",\"317\"],[\"豪门总裁\",\"682\"],[\"打脸虐渣\",\"739\"]]},{\"name\":\"游戏\",\"id\":\"714\",\"tags\":[[\"全部\",\"-99\"],[\"有声小说\",\"923\"],[\"爽文\",\"570\"],[\"网游\",\"740\"],[\"都市\",\"758\"],[\"热血\",\"1\"],[\"电竞\",\"715\"],[\"系统\",\"782\"],[\"异界\",\"692\"],[\"逆袭\",\"400\"],[\"天才\",\"783\"],[\"金手指\",\"756\"],[\"穿越\",\"373\"],[\"智商在线\",\"806\"],[\"言情\",\"745\"],[\"脑洞\",\"526\"]]},{\"name\":\"末世\",\"id\":\"556\",\"tags\":[[\"全部\",\"-99\"],[\"有声小说\",\"923\"],[\"科幻\",\"730\"],[\"爽文\",\"570\"],[\"言情\",\"745\"],[\"幻想言情\",\"774\"],[\"热血\",\"1\"],[\"重生\",\"779\"],[\"丧尸\",\"632\"],[\"杀伐果断\",\"202\"],[\"系统\",\"782\"],[\"异能\",\"644\"],[\"金手指\",\"756\"],[\"逆袭\",\"400\"],[\"穿越\",\"373\"],[\"都市\",\"758\"]]},{\"name\":\"萌宝\",\"id\":\"356\",\"tags\":[[\"全部\",\"-99\"],[\"有声小说\",\"923\"],[\"言情\",\"745\"],[\"现代言情\",\"772\"],[\"都市\",\"758\"],[\"豪门总裁\",\"682\"],[\"甜宠\",\"21\"],[\"优质网文\",\"1388\"],[\"HE\",\"581\"],[\"1V1\",\"585\"],[\"古代言情\",\"773\"],[\"古代\",\"604\"],[\"带球跑\",\"640\"],[\"穿越\",\"373\"],[\"追妻火葬场\",\"753\"],[\"爽文\",\"570\"]]},{\"name\":\"科幻\",\"id\":\"730\",\"tags\":[[\"全部\",\"-99\"],[\"有声小说\",\"923\"],[\"末世\",\"556\"],[\"爽文\",\"570\"],[\"未来世界\",\"704\"],[\"热血\",\"1\"],[\"杀伐果断\",\"202\"],[\"逆袭\",\"400\"],[\"系统\",\"782\"],[\"悬疑\",\"27\"],[\"异能\",\"644\"],[\"丧尸\",\"632\"],[\"重生\",\"779\"],[\"金手指\",\"756\"],[\"都市\",\"758\"],[\"脑洞\",\"526\"]]},{\"name\":\"民国\",\"id\":\"660\",\"tags\":[[\"全部\",\"-99\"],[\"有声小说\",\"923\"],[\"历史\",\"669\"],[\"近代\",\"728\"],[\"传记\",\"591\"],[\"现实题材\",\"12\"],[\"悬疑\",\"27\"],[\"奇闻异事\",\"769\"],[\"军事\",\"603\"],[\"人文社科\",\"796\"],[\"言情\",\"745\"],[\"探险\",\"697\"],[\"推理\",\"668\"],[\"现代言情\",\"772\"],[\"奇闻怪谈\",\"1396\"],[\"年代\",\"672\"]]},{\"name\":\"青春\",\"id\":\"761\",\"tags\":[[\"全部\",\"-99\"],[\"有声小说\",\"923\"],[\"现代言情\",\"772\"],[\"言情\",\"745\"],[\"校园\",\"691\"],[\"甜宠\",\"21\"],[\"都市\",\"758\"],[\"现实题材\",\"12\"],[\"1V1\",\"585\"],[\"短篇\",\"934\"],[\"治愈\",\"17\"],[\"HE\",\"581\"],[\"青梅竹马\",\"465\"],[\"虐恋\",\"16\"],[\"轻松\",\"3\"],[\"优质网文\",\"1388\"]]},{\"name\":\"军事\",\"id\":\"603\",\"tags\":[[\"全部\",\"-99\"],[\"有声小说\",\"923\"],[\"历史\",\"669\"],[\"近代\",\"728\"],[\"热血\",\"1\"],[\"人文社科\",\"796\"],[\"都市\",\"758\"],[\"民国\",\"660\"],[\"特种兵\",\"547\"],[\"社会\",\"723\"],[\"现实题材\",\"12\"],[\"特工\",\"188\"],[\"励志\",\"786\"],[\"红色文学\",\"535\"],[\"正剧\",\"707\"],[\"传记\",\"591\"]]}],\"drama\":[[\"推荐\",\"0\"],[\"虐恋\",\"16\"],[\"闪婚\",\"480\"],[\"真假千金\",\"812\"],[\"都市情感\",\"1273\"],[\"豪门总裁\",\"624\"],[\"复仇\",\"795\"],[\"追妻火葬场\",\"715\"],[\"女性成长\",\"1294\"],[\"穿越\",\"373\"],[\"甜宠\",\"21\"],[\"逆袭\",\"400\"],[\"重生\",\"784\"],[\"古装\",\"1272\"],[\"家庭\",\"670\"],[\"都市\",\"571\"],[\"打脸虐渣\",\"716\"],[\"悬疑\",\"27\"],[\"乡村\",\"590\"],[\"伦理\",\"1293\"],[\"婚姻\",\"718\"],[\"奇幻\",\"570\"],[\"玄幻仙侠\",\"1286\"],[\"战神\",\"527\"],[\"权谋\",\"790\"],[\"职场\",\"724\"],[\"年代\",\"572\"],[\"赘婿\",\"36\"],[\"马甲\",\"558\"],[\"强者回归\",\"402\"],[\"搞笑\",\"793\"],[\"小人物\",\"1296\"],[\"宅斗\",\"342\"],[\"系统\",\"787\"],[\"后悔流\",\"1202\"],[\"社会话题\",\"1290\"],[\"欢喜冤家\",\"464\"],[\"女强\",\"708\"],[\"扮猪吃虎\",\"799\"],[\"娱乐明星\",\"1295\"],[\"致富\",\"492\"],[\"民国\",\"573\"],[\"神医\",\"1269\"],[\"银发\",\"1297\"],[\"青春校园\",\"1288\"],[\"宫斗\",\"343\"],[\"商战\",\"723\"],[\"穿书\",\"338\"],[\"先婚后爱\",\"524\"],[\"异能\",\"727\"],[\"高手下山\",\"1299\"],[\"神豪\",\"37\"],[\"古代\",\"576\"],[\"破镜重圆\",\"467\"],[\"替身\",\"712\"],[\"团宠\",\"545\"],[\"志怪\",\"1383\"],[\"女帝\",\"617\"],[\"现代言情\",\"776\"],[\"脑洞\",\"526\"],[\"种田经商\",\"1291\"],[\"金手指\",\"726\"],[\"灵异\",\"1287\"],[\"玄幻\",\"566\"],[\"末世\",\"556\"],[\"武侠\",\"371\"],[\"偷听心声\",\"1258\"],[\"科幻\",\"594\"],[\"架空历史\",\"577\"],[\"暗恋\",\"719\"],[\"古代言情\",\"777\"],[\"大女主\",\"972\"],[\"修仙\",\"671\"],[\"奔跑吧推荐\",\"1300\"],[\"现实题材\",\"12\"],[\"女总裁\",\"89\"],[\"双重生\",\"828\"],[\"异界\",\"568\"],[\"鉴宝\",\"47\"]],\"animated\":[[\"推荐\",\"0\"],[\"古装\",\"1272\"],[\"穿越\",\"373\"],[\"逆袭\",\"400\"],[\"重生\",\"784\"],[\"玄幻仙侠\",\"1286\"],[\"都市\",\"571\"],[\"系统\",\"787\"],[\"打脸虐渣\",\"716\"],[\"末世\",\"556\"],[\"年代\",\"572\"],[\"金手指\",\"726\"],[\"悬疑\",\"27\"],[\"都市情感\",\"1273\"],[\"致富\",\"492\"],[\"奇幻\",\"570\"],[\"复仇\",\"795\"],[\"甜宠\",\"21\"],[\"异能\",\"727\"],[\"权谋\",\"790\"],[\"宅斗\",\"342\"],[\"乡村\",\"590\"],[\"玄幻\",\"566\"],[\"古代\",\"576\"],[\"穿书\",\"338\"],[\"豪门总裁\",\"624\"],[\"脑洞\",\"526\"],[\"修仙\",\"671\"],[\"囤物资\",\"894\"],[\"御兽\",\"423\"],[\"灵异\",\"1287\"],[\"种田\",\"317\"],[\"虐恋\",\"16\"],[\"家庭\",\"670\"],[\"爽文\",\"598\"],[\"随身空间\",\"345\"],[\"美食\",\"300\"],[\"追妻火葬场\",\"715\"],[\"小人物\",\"1296\"],[\"扮猪吃虎\",\"799\"],[\"丧尸\",\"732\"],[\"女帝\",\"617\"],[\"废柴\",\"796\"],[\"欢喜冤家\",\"464\"],[\"先婚后爱\",\"524\"],[\"民国\",\"573\"],[\"治愈\",\"17\"],[\"战神\",\"527\"],[\"替身\",\"712\"],[\"日常\",\"878\"],[\"网游\",\"734\"],[\"现代言情\",\"776\"],[\"通古今\",\"1203\"],[\"萌宠\",\"1249\"],[\"异界\",\"568\"],[\"恐怖\",\"599\"],[\"团宠\",\"545\"],[\"搞笑\",\"793\"],[\"烧脑\",\"600\"],[\"青春校园\",\"1288\"],[\"机甲\",\"733\"],[\"真假千金\",\"812\"],[\"失忆\",\"1251\"],[\"架空历史\",\"577\"],[\"后悔流\",\"1202\"],[\"都市脑洞\",\"883\"],[\"热血\",\"1\"],[\"娱乐明星\",\"1295\"],[\"古代言情\",\"777\"],[\"大女主\",\"972\"],[\"大明\",\"586\"],[\"社会话题\",\"1290\"],[\"马甲\",\"558\"],[\"双重生\",\"828\"],[\"偷听心声\",\"1258\"],[\"神医\",\"1269\"],[\"励志\",\"791\"],[\"破镜重圆\",\"467\"],[\"强者回归\",\"402\"],[\"娱乐圈\",\"357\"],[\"女扮男装\",\"706\"],[\"多女主\",\"945\"],[\"伦理\",\"1293\"],[\"女性成长\",\"1294\"],[\"职场\",\"724\"],[\"盗墓\",\"327\"],[\"公主\",\"113\"],[\"皇帝\",\"62\"],[\"鉴宝\",\"47\"],[\"神豪\",\"37\"],[\"赘婿\",\"36\"],[\"轻松\",\"3\"]]};\nfunction qmaNovelExplore(infoMap,source){return (function(){\nvar CHANNELS = ['男频', '女频', '出版'];\nvar OVER = [['全部状态', '-99'], ['完结', '1'], ['连载', '0']];\nvar WORDS = [['全部字数', '-99'], ['50万以下', '1'], ['50-100万', '2'], ['100-300万', '3'], ['300万以上', '4']];\nvar SORT = [['按热度', '0'], ['按更新', '1'], ['按评分', '2'], ['按新书', '3']];\nvar STYLE = {layout_flexGrow: 1, layout_flexBasisPercent: 1, layout_wrapBefore: true};\n\nvar state = qmSaveExploreState(\n    typeof infoMap === 'undefined' ? null : infoMap,\n    typeof source === 'undefined' ? null : source\n);\nvar action = \"(function(){var currentInfo=typeof infoMap==='undefined'?null:infoMap;var currentSource=typeof source==='undefined'?null:source;qmSaveExploreState(currentInfo,currentSource);try{java.reUiView(false);}catch(e){try{java.refreshExplore();}catch(e2){}}})()\";\nvar encoded = encodeURIComponent(JSON.stringify(state));\n\nfunction labels(options) {\n    return options.map(function (option) { return option[0]; });\n}\nfunction selectedLabel(options, value) {\n    for (var i = 0; i < options.length; i++) {\n        if (String(options[i][1]) == String(value)) return options[i][0];\n    }\n    return options[0][0];\n}\n\nvar resultName = '查看筛选结果 · ' + state.channel + ' · ' + state.group + ' · ' + state.tag;\nvar resultUrl = '<js>qmBuildExploreUrlFromEncoded(java,' + JSON.stringify(encoded) + ',typeof page==\"undefined\"?1:page)</js>';\nreturn JSON.stringify([\n    {title: '频道', type: 'select', chars: CHANNELS, default: state.channel, action: action, style: STYLE},\n    {title: '分类分组', type: 'select', chars: qmExploreGroupNames(state.channel), default: state.group, action: action, style: STYLE},\n    {title: '分类标签', type: 'select', chars: qmExploreTagNames(state.channel, state.group), default: state.tag, action: action, style: STYLE},\n    {title: '状态', type: 'select', chars: labels(OVER), default: selectedLabel(OVER, state.over), action: action, style: STYLE},\n    {title: '字数', type: 'select', chars: labels(WORDS), default: selectedLabel(WORDS, state.words), action: action, style: STYLE},\n    {title: '排序', type: 'select', chars: labels(SORT), default: selectedLabel(SORT, state.sort), action: action, style: STYLE},\n    {title: resultName, type: 'url', url: resultUrl, style: STYLE}\n]);\n})()\n;}\nvar QMA_ORIGINAL_LOGIN = [{\"name\": \"开启段评（刷新正文后生效）\", \"type\": \"button\", \"action\": \"qmpcSetEnabled.call(this,true)\"}, {\"name\": \"关闭段评（刷新正文后生效）\", \"type\": \"button\", \"action\": \"qmpcSetEnabled.call(this,false)\"}, {\"name\": \"查看最近段评加载状态\", \"type\": \"button\", \"action\": \"qmpcShowStatus.call(this)\"}];\n/* Independent discovery states; catalogs are snapshots of verified official metadata. */\nvar QMA_DISC = (function(){\n  var MODES=[['小说','novel'],['听书','audio'],['漫剧','animated'],['短剧','drama']];\n  var OVER=[['全部','-99'],['完结','1'],['连载','0']];\n  var SORT=[['最高热度','1'],['最近更新','2'],['最新上架','3']];\n  var KEYS={category:'听书分类',tag:'听书标签',over:'听书状态',sort:'听书排序'};\n  var STYLE={layout_flexGrow:1,layout_flexBasisPercent:1,layout_wrapBefore:true};\n  function src(ctx){return QMA_NET.source(ctx);}\n  function j(ctx){return QMA_NET.java(ctx);}\n  function get(map,key){return qmExploreMapGet(map,key);}\n  function put(map,key,value){qmExploreMapPut(map,key,value);}\n  function stored(ctx,key){try{return JSON.parse(String(src(ctx).get(key)||'{}'));}catch(e){return {};}}\n  function option(options,value,fallback){\n    for(var i=0;i<options.length;i++)if(String(value)===options[i][0]||String(value)===options[i][1])return String(options[i][1]);\n    return String(fallback);\n  }\n  function label(options,value){for(var i=0;i<options.length;i++)if(String(options[i][1])===String(value))return options[i][0];return options[0][0];}\n  function mode(){return option(MODES,src(this).get('qma_explore_mode'),'novel');}\n  function loginUi(){\n    var rows=[{name:'发现内容类型',type:'select',chars:MODES.map(function(x){return x[0];}),default:label(MODES,mode.call(this)),\n      action:'QMA_DISC.setMode.call(this,result)',style:STYLE}];\n    rows=rows.concat(QMA_ORIGINAL_LOGIN);\n    rows.push({name:'聚合使用说明',type:'button',action:'QMA.help.call(this)'},\n      {name:'查看媒体接口状态',type:'button',action:'QMA.status.call(this)'},\n      {name:'测试媒体游客登录',type:'button',action:'QMA.login.call(this)'},\n      {name:'重置媒体游客身份',type:'button',action:'QMA.reset.call(this)'});\n    return JSON.stringify(rows);\n  }\n  function setMode(values){\n    var selected=typeof values==='string'?values:get(values,'发现内容类型');\n    var chosen=option(MODES,selected,'');\n    if(!chosen)throw new Error('请选择小说、听书、漫剧或短剧');\n    var s=src(this), previous=mode.call(this);\n    s.put('qma_explore_mode',chosen);\n    // Merge only our key; preserve other saved login settings.\n    try {\n      var saved=JSON.parse(String(s.getLoginInfo()||'{}'));\n      saved['发现内容类型']=label(MODES,chosen);\n      s.putLoginInfo(JSON.stringify(saved));\n    }catch(ignored){}\n    var cleared=false;\n    if(previous!==chosen){try{s.refreshExplore();cleared=true;}catch(ignored2){}}\n    j(this).longToast('发现已切换为'+label(MODES,chosen)+(cleared?'，缓存已清除':'')+'。返回发现后收起再展开书源；如仍显示旧布局，请长按书源→刷新。');\n  }\n  function audioCategory(value){\n    for(var i=0;i<QMA_CATALOG.audio.length;i++){\n      var c=QMA_CATALOG.audio[i];if(String(value)===c.name||String(value)===c.id)return c;\n    }\n    return QMA_CATALOG.audio[0];\n  }\n  function audioNormalize(value){\n    value=value||{};var c=audioCategory(value.category);\n    return {category:c.id,tag:option(c.tags,value.tag,'-99'),over:option(OVER,value.over,'-99'),sort:option(SORT,value.sort,'1')};\n  }\n  function audioState(ctx,info){\n    var old=audioNormalize(stored(ctx,'qma_audio_filters'));\n    var category=audioCategory(get(info,KEYS.category)||old.category);\n    var tag=category.id!==old.category?'-99':get(info,KEYS.tag)||old.tag;\n    var value=audioNormalize({category:category.id,tag:tag,over:get(info,KEYS.over)||old.over,sort:get(info,KEYS.sort)||old.sort});\n    Object.keys(KEYS).forEach(function(k){\n      var display=k==='category'?category.name:k==='tag'?label(category.tags,value.tag):label(k==='over'?OVER:SORT,value[k]);\n      put(info,KEYS[k],display);\n    });\n    try{if(info&&info.saveNow)info.saveNow();}catch(ignored){}\n    src(ctx).put('qma_audio_filters',JSON.stringify(value));\n    return value;\n  }\n  function audioChanged(info){\n    audioState(this,info);\n    try{src(this).refreshExplore();}catch(ignored){}\n    // From an ExploreKind action this callback rebuilds discovery, not login.\n    try{j(this).refreshExplore();}catch(ignored2){}\n  }\n  function explore(info){\n    var selected=mode.call(this);\n    if(selected==='novel')return qmaNovelExplore.call(this,info,src(this));\n    if(selected!=='audio'){\n      return JSON.stringify(QMA_CATALOG[selected].map(function(t){\n        return {title:t[0],type:'url',url:'@js:QMA.exploreUrl.call(this,'+JSON.stringify(selected)+',page,'+JSON.stringify(t[1])+')',\n          style:{layout_flexBasisPercent:t[0].length>4?0.5:0.25,layout_flexGrow:1}};\n      }));\n    }\n    var value=audioState(this,info),category=audioCategory(value.category);\n    var action='QMA_DISC.audioChanged.call(this,typeof infoMap===\"undefined\"?null:infoMap)';\n    var values=[QMA_CATALOG.audio.map(function(c){return c.name;}),category.tags.map(function(t){return t[0];}),OVER.map(function(t){return t[0];}),SORT.map(function(t){return t[0];})];\n    var defaults=[category.name,label(category.tags,value.tag),label(OVER,value.over),label(SORT,value.sort)];\n    var keys=[KEYS.category,KEYS.tag,KEYS.over,KEYS.sort],names=['分类','标签','状态','排序'];\n    // beta.45 ExploreKind.equals ignores chars. Change the tag row's action too,\n    // so Compose receives new options even when both defaults are still 全部.\n    var rows=keys.map(function(k,index){return {title:k,viewName:JSON.stringify(names[index]),type:'select',chars:values[index],default:defaults[index],\n      action:action+(index===1?'; /* category '+category.id+' */':''),style:STYLE};});\n    var name='查看筛选结果 · '+defaults.join(' · ');\n    rows.push({title:name,type:'url',url:'@js:QMA.exploreUrl.call(this,\"audio\",page,'+JSON.stringify(value)+')',style:STYLE});\n    return JSON.stringify(rows);\n  }\n  function audioParams(value,page){\n    value=audioNormalize(value);\n    var p={category_id:value.category,category_type:'2',page:String(page),need_filters:'1',need_category:'1',over:value.over,sort:value.sort};\n    if(value.tag!=='-99')p.tag_ids=value.tag;\n    return p;\n  }\n  function mem(ctx,key,value){\n    var c=QMA_NET.cache(ctx);\n    try{if(value!==undefined){if(c)c.putMemory(key,JSON.stringify(value));return value;}return JSON.parse(String(c&&c.getFromMemory(key)||'{}'));}catch(e){return {};}\n  }\n  function audioKey(value){return 'qma-audio-pages-'+qmMd5(JSON.stringify(audioNormalize(value)));}\n  function audioEnded(ctx,value,page){if(page===1)mem(ctx,audioKey(value),{});return Number(mem(ctx,audioKey(value)).total)>0&&page>Number(mem(ctx,audioKey(value)).total);}\n  function audioPages(ctx,value,metadata){if(metadata&&/^\\d+$/.test(String(metadata.total_pages)))mem(ctx,audioKey(value),{total:Number(metadata.total_pages)});}\n  function videoTag(selected,tag){\n    var tags=QMA_CATALOG[selected]||[];\n    for(var i=0;i<tags.length;i++)if(String(tag)===tags[i][1])return String(tag);\n    throw new Error('视频分类已失效，请刷新发现页');\n  }\n  function videoKey(m){return 'qma-video-pages-'+m.mode+'-'+videoTag(m.mode,m.tag||'0');}\n  function videoParams(ctx,m){\n    var key=videoKey(m),state=m.page===1?{pages:{}}:mem(ctx,key);\n    if(m.page===1)mem(ctx,key,state);\n    if(state.end&&m.page>state.end)return null;\n    var ids=[],seen={};\n    Object.keys(state.pages||{}).sort(function(a,b){return Number(a)-Number(b);}).forEach(function(p){if(Number(p)<m.page)ids=ids.concat(state.pages[p]);});\n    ids=ids.filter(function(x){if(seen[x])return false;seen[x]=1;return true;}).slice(-120);\n    var upload=ids.map(function(x){return {id:x,item_type:m.mode==='animated'?'14':'11',ts:String(Date.now()),type:'0'};});\n    var p={page:String(m.page),playlet_privacy:'1',read_preference:'0',refresh_state:m.page===1?'4':'7',tag_id:m.tag||'0',upload_ids:JSON.stringify(upload)};\n    if(m.mode==='animated')p.change_tag=m.page===1?'1':'0';\n    return p;\n  }\n  function videoRows(ctx,m,rows,next){\n    var key=videoKey(m),state=mem(ctx,key),prior={},local={};state.pages=state.pages||{};\n    Object.keys(state.pages).forEach(function(p){if(Number(p)<m.page)state.pages[p].forEach(function(x){prior[x]=true;});});\n    var filtered=rows.filter(function(x){var i=String(x.playlet_id||x.id||'');if(!i||prior[i]||local[i])return false;local[i]=true;return true;});\n    state.pages[String(m.page)]=Object.keys(local);\n    if(!rows.length||next!=null&&(String(next)===''||Number(next)<=m.page))state.end=m.page;\n    Object.keys(state.pages).forEach(function(p){if(Number(p)<m.page-8)delete state.pages[p];});\n    mem(ctx,key,state);return filtered;\n  }\n  return {mode:mode,loginUi:loginUi,setMode:setMode,explore:explore,audioNormalize:audioNormalize,audioChanged:audioChanged,\n    audioParams:audioParams,audioEnded:audioEnded,audioPages:audioPages,videoTag:videoTag,videoParams:videoParams,videoRows:videoRows};\n})();\n", "lastUpdateTime": "1791473359336", "respondTime": 180000, "ruleBookInfo": {"author": "author", "coverUrl": "image_link", "init": "@js:\n(function(){\nif (QMA.meta.call(this,baseUrl,result)) return JSON.stringify(QMA.info.call(this,baseUrl,result));\nreturn (function(){\nreturn (function () {\n    var raw = String(result == null ? '' : result);\n    var payload;\n    try {\n        payload = JSON.parse(raw);\n    } catch (e) {\n        throw new Error('七猫详情接口未返回有效 JSON，请查看调试响应');\n    }\n    function isBook(value) {\n        return value && typeof value === 'object' && !Array.isArray(value)\n            && value.id != null && String(value.id) !== ''\n            && typeof value.title === 'string' && value.title.replace(/\\s/g, '') !== ''\n            && !('books' in value) && !('filters' in value);\n    }\n    function isFlatBook(value) {\n        return isBook(value) && ('author' in value || 'words_num' in value || 'image_link' in value);\n    }\n    if (payload && payload.data && isBook(payload.data.book)) {\n        return JSON.stringify(payload.data.book);\n    }\n    if (payload && isFlatBook(payload.data)) {\n        return JSON.stringify(payload.data);\n    }\n    if (isFlatBook(payload)) return JSON.stringify(payload);\n    throw new Error('七猫响应中没有有效书籍详情；分类页或错误响应不能当作书籍解析');\n})();\n}).call(this);\n}).call(this)", "intro": "&nbsp;&nbsp;🔖更新时间：{{java.timeFormat(java.getString('$.update_time')*1000)}}\t{{'\\n&lrm;\\n'}}🏷️ 标签：{{String(java.getString('$.book_tag_list[*].title&&$.category_over_words##・|\\\\s##，')).split('，').filter(function(v,i,a){return v && a.indexOf(v)==i;}).join('，')}}{{'\\n'+'​'}}\n\n{{$.intro}}\n{{'\\n&lrm;\\n'}}📍版权来源：{{$.statement##如有疑问可联系:fawu@qimao.com或客服QQ:3598987377}}\n<js>QMA.meta.call(this,baseUrl,result) ? java.getString(\"$.intro\") : result</js>", "kind": "book_tag_list[*].title##\\s##，", "lastChapter": "{{$.latest_chapter_title}} • {{java.timeFormat(java.getString('$.update_time')*1000)}}\n<js>result.replace(/\\s\\d+:\\d+/,'').replace(/\\//g,'-')</js>\n<js>QMA.meta.call(this,baseUrl,result) ? java.getString(\"$.latest_chapter_title\") : result</js>", "name": "title@put:{\"bid\":\"$.id\"}", "tocUrl": "@js:QMA.meta.call(this,baseUrl,result) ? java.getString(\"$.toc_url\") : qmToc(java.getString(\"$.id\"))", "wordCount": "words_num"}, "ruleContent": {"content": "@js:\nif (QMA.meta.call(this,baseUrl,result)) { QMA.content.call(this,baseUrl,result); } else {\nvar seg = String(java.hexDecodeToString(result)).split('/');\nvar bid = String(java.get('bid'));\nvar story = seg[2] == '1';\nvar out, valid = false, res;\ntry {\n    res = JSON.parse(java.ajax(qmContent(bid, seg[0], story)));\n    if (!(res.data && res.data.content)) res = JSON.parse(java.ajax(qmContent(bid, seg[0], !story)));\n    if (res.data && res.data.content) {\n        out = qmDecode(res.data.content);\n        valid = true;\n    } else out = '七猫服务器未返回本章正文：' + (res.errors ? res.errors.details : '未知错误');\n} catch (e) { out = '正文获取失败：' + e; }\nif (valid) out = qmpcAnnotate.call(this, out, bid, seg[0], String(res.data.content_md5 || seg[1] || ''));\nout;\n\n}"}, "ruleExplore": {"bookList": "@js:QMA.list.call(this,result,baseUrl)", "name": "title", "author": "author", "bookUrl": "url", "coverUrl": "cover", "intro": "intro", "kind": "kind", "lastChapter": "last", "wordCount": "words"}, "ruleSearch": {"bookList": "@js:QMA.list.call(this,result,baseUrl)", "name": "title", "author": "author", "bookUrl": "url", "coverUrl": "cover", "intro": "intro", "kind": "kind", "lastChapter": "last", "wordCount": "words"}, "ruleToc": {"chapterList": "@js:\nQMA.meta.call(this,baseUrl,result) ? QMA.toc.call(this,baseUrl,result) : (function(){var d=JSON.parse(String(result)).data; java.put(\"qm_agent\",String(d.reader_type)==\"4\"?\"1\":\"0\"); return d.chapter_lists;}).call(this)", "chapterName": "title", "chapterUrl": "@js:QMA.meta.call(this,baseUrl,result) ? java.getString(\"$.url\") : qmChapterUrl(java.getString(\"$.id\"),java.getString(\"$.content_md5\"),java.get(\"qm_agent\"))", "updateTime": "@js:QMA.meta.call(this,baseUrl,result) ? java.getString(\"$.info\") : java.getString(\"$.words\")+\"字\""}, "searchUrl": "@js:QMA.searchUrl.call(this,key,page)", "weight": 0, "bookUrlPattern": "https://api-bc\\.wtzw\\.com/api/v4/book/detail\\?.*", "loginUrl": "function login() {}", "loginUi": "@js:QMA_DISC.loginUi.call(this)"},{"bookSourceComment": "纸间 zjread.cc 书源 v12。搜索/详情/目录/正文全部在规则内完成（AES-256-GCM + HKDF + HMAC 自实现）。正文章节密钥派生已逆向，规则内本地解密。站点人机验证为 Altcha 工作量证明(PoW)，本规则已内实现、自动完成、无需手动点验证；有效期约 10 分钟，到期自动重验。说明：① 连载书最新章节前若干章可能“暂不可阅读”，会提示；② 目录接口偶发较慢（上游抓取），首次打开新书可能稍慢，之后会缓存；③ 封面接口需鉴权（401），故不显示封面；④ 从旧版本升级的**已有书籍**，请对书架里的书执行一次“更新书籍信息”（或重新添加），以刷新目录地址。", "bookSourceName": "纸间", "bookSourceType": 0, "bookSourceUrl": "https://www.zjread.cc", "concurrentRate": "1/1000", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": false, "enabledExplore": false, "eventListener": false, "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\",\"Referer\":\"https://www.zjread.cc/\",\"Origin\":\"https://www.zjread.cc\"}", "jsLib": "var ZJB=\"https://www.zjread.cc\";\nvar ZJ_UA=\"Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\";\nvar ZJ_VPAGE=\"\\nvar out=document.getElementById('out');\\nvar cf=document.getElementById('cf');\\nwindow.onerror=function(m){try{window.__zjt='JSERR:'+m;}catch(e){}};\\nfunction b64d(s){var bin=atob(s);var u=new Uint8Array(bin.length);for(var i=0;i<bin.length;i++)u[i]=bin.charCodeAt(i);return u;}\\nfunction b64e(u){var s='';for(var i=0;i<u.length;i++)s+=String.fromCharCode(u[i]);return btoa(s);}\\nfunction hex(u){var s='',i;for(i=0;i<u.length;i++){var h=u[i].toString(16);if(h.length<2)h='0'+h;s+=h;}return s;}\\nvar AESKEY=null,HMACKEY=null;\\nasync function setupKeys(){\\n  var km=b64d(KM);\\n  var hk=await crypto.subtle.importKey('raw',km,'HKDF',false,['deriveBits']);\\n  var as=await crypto.subtle.deriveBits({name:'HKDF',hash:'SHA-256',salt:new TextEncoder().encode(SID),info:new TextEncoder().encode('novel-api-aes-v1')},hk,256);\\n  AESKEY=await crypto.subtle.importKey('raw',as,'AES-GCM',false,['encrypt','decrypt']);\\n  var hs=await crypto.subtle.deriveBits({name:'HKDF',hash:'SHA-256',salt:new TextEncoder().encode(SID),info:new TextEncoder().encode('novel-hmac-v1')},hk,256);\\n  HMACKEY=await crypto.subtle.importKey('raw',hs,{name:'HMAC',hash:'SHA-256'},false,['sign']);\\n}\\nasync function decj(j){\\n  if(j&&j.version===1){ try{ var pt=await crypto.subtle.decrypt({name:'AES-GCM',iv:b64d(j.nonce),tagLength:128},AESKEY,b64d(j.data)); j.obj=JSON.parse(new TextDecoder().decode(pt)); }catch(e){ j.decerr=String(e&&e.message?e.message:e); } }\\n  return j;\\n}\\nasync function api(path,body){\\n  var iv=crypto.getRandomValues(new Uint8Array(12));\\n  var ct=new Uint8Array(await crypto.subtle.encrypt({name:'AES-GCM',iv:iv,tagLength:128},AESKEY,new TextEncoder().encode(JSON.stringify(body))));\\n  var env=JSON.stringify({version:1,algorithm:'AES-256-GCM',data:b64e(ct),nonce:b64e(iv)});\\n  var ts=String(Math.floor(Date.now()/1000));\\n  var no=b64e(crypto.getRandomValues(new Uint8Array(18))).replace(/\\\\+/g,'-').replace(/\\\\//g,'_').replace(/=/g,'');\\n  var bh=hex(new Uint8Array(await crypto.subtle.digest('SHA-256',new TextEncoder().encode(env))));\\n  var msg=['POST',path,ts,no,bh,SID].join(String.fromCharCode(10));\\n  var sg=b64e(new Uint8Array(await crypto.subtle.sign('HMAC',HMACKEY,new TextEncoder().encode(msg))));\\n  var r=await fetch(ZJB+path,{method:'POST',headers:{'Content-Type':'application/json','X-Session-ID':SID,'X-Timestamp':ts,'X-Nonce':no,'X-Signature':sg,'X-Key-Version':'1'},body:env});\\n  return await decj(await r.json());\\n}\\nfunction loadTs(){\\n  return new Promise(function(res,rej){\\n    if(window.turnstile&&typeof window.turnstile.render==='function')return res();\\n    if(window.__zjts){ var t=setInterval(function(){if(window.turnstile&&typeof window.turnstile.render==='function'){clearInterval(t);res();}},120); return; }\\n    window.__zjts=1;\\n    var s=document.createElement('script');\\n    s.src='https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit';\\n    s.async=true;s.defer=true;\\n    s.onload=function(){var t=setInterval(function(){if(window.turnstile&&typeof window.turnstile.render==='function'){clearInterval(t);res();}},100);setTimeout(function(){clearInterval(t);if(window.turnstile&&window.turnstile.render)res();else rej(new Error('turnstile not ready'));},15000);};\\n    s.onerror=function(){rej(new Error('turnstile load fail'));};\\n    document.head.appendChild(s);\\n  });\\n}\\nfunction getToken(key){\\n  return new Promise(function(res,rej){\\n    loadTs().then(function(){\\n      function go(){ try{ window.turnstile.render(cf,{sitekey:key,callback:function(t){res(t);}}); }catch(e){ setTimeout(go,200); } }\\n      try{ if(window.turnstile&&window.turnstile.ready) window.turnstile.ready(go); else go(); }catch(e){ go(); }\\n    }).catch(rej);\\n  });\\n}\\n(async function(){\\n  try{\\n    await setupKeys();\\n    var cfg=await api('/api/config',{});\\n    var d=(cfg&&cfg.obj&&cfg.obj.data)||{};\\n    var body={chapter_id:CID};\\n    if(d.content_captcha&&!d.content_verified){\\n      out.textContent='请完成人机验证，验证通过后会自动继续…';\\n      body.turnstile_token=await getToken(d.captcha_site_key);\\n    }\\n    var z=await api('/api/book/content',body);\\n    var ok=(z&&z.key_mode==='chapter')||(z&&z.obj&&String(z.obj.code)==='0');\\n    document.documentElement.setAttribute('data-ver', ok?'1':'0');\\n    out.textContent=ok?'验证完成，正在继续…':'验证未通过，可返回后重试';\\n    setTimeout(function(){try{window.close();}catch(e){}},ok?500:2500);\\n  }catch(e){ out.textContent='验证出错：'+e; document.documentElement.setAttribute('data-ver','0'); setTimeout(function(){try{window.close();}catch(e){}},2500); }\\n})();\\n\";\nvar ZJ_BOOK_RE=new RegExp(\"/book/([^,/?]+)\");\nvar ZJ_RND=new Packages.java.security.SecureRandom();\nfunction zs(b){return String(new Packages.java.lang.String(b,\"UTF-8\"));}\nfunction zu(s){return new Packages.java.lang.String(String(s)).getBytes(\"UTF-8\");}\n// 用 android.util.Base64（java.util.Base64 需 Android 8/API 26，而 Legado minSdk=23）\nfunction zb(b){return String(Packages.android.util.Base64.encodeToString(b,2));}\nfunction zd(s){return Packages.android.util.Base64.decode(String(s),2);}\nfunction zr(n){var c=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\",s=\"\",i;for(i=0;i<n;i++){s+=c.charAt(ZJ_RND.nextInt(c.length));}return s;}\nfunction zh(k,m){var x=Packages.javax.crypto.Mac.getInstance(\"HmacSHA256\");x.init(new Packages.javax.crypto.spec.SecretKeySpec(k,\"HmacSHA256\"));return x.doFinal(m);}\nfunction hc(a,b){var o=new Packages.java.io.ByteArrayOutputStream();o.write(a);o.write(b);return o.toByteArray();}\nfunction hk(ikm,salt,info){var p=zh(zu(salt),ikm);return zh(p,hc(zu(info),zu(String.fromCharCode(1))));}\nfunction hkb(ikm,saltBytes,info){var p=zh(saltBytes,ikm);return zh(p,hc(zu(info),zu(String.fromCharCode(1))));}\nfunction hs(b){var d=Packages.java.security.MessageDigest.getInstance(\"SHA-256\").digest(b),s=\"\",i;for(i=0;i<d.length;i++){var h=(d[i]&255).toString(16);if(h.length<2)h=\"0\"+h;s+=h;}return s;}\nfunction zjsave(C,o){try{C.putMemory(\"zjs\",JSON.stringify({sid:o.sid,km:o.km,exp:o.exp}));}catch(e){}}\nfunction zsleep(ms){try{Packages.java.lang.Thread.sleep(ms);}catch(e){}}\nfunction zjsess(J,C){var o=null;\n function okv(x){return !!(x&&x.sid&&x.km&&x.exp&&x.exp>Math.floor(Date.now()/1000)+60);}\n try{var sv=C.getFromMemory(\"zjs\");if(sv)o=JSON.parse(String(sv));}catch(e){o=null;}\n if(!okv(o)){\n   var now=Math.floor(Date.now()/1000),own=false;\n   try{var lb=Number(C.getFromMemory(\"zjsboot\")||0);if(!lb||(now-lb)>=20){C.putMemory(\"zjsboot\",now);own=true;}}catch(e){own=true;}\n   if(!own){for(var i=0;i<20;i++){zsleep(300);try{var sv2=C.getFromMemory(\"zjs\");if(sv2){var o2=JSON.parse(String(sv2));if(okv(o2)){o=o2;break;}}}catch(e){}}}\n   try{\n     if(!okv(o)){var b=JSON.parse(String(J.get(ZJB+\"/api/bootstrap\",null,15000).body())).data;if(!b||!b.session_id||!b.key_material)throw new Error(\"bootstrap 无效\");o={sid:b.session_id,km:b.key_material,exp:b.expires_at};zjsave(C,o);}\n   }finally{if(own){try{C.putMemory(\"zjsboot\",0);}catch(e){}}}\n }\n var km=zd(o.km);o.aes=new Packages.javax.crypto.spec.SecretKeySpec(hk(km,o.sid,\"novel-api-aes-v1\"),\"AES\");o.hk=hk(km,o.sid,\"novel-hmac-v1\");return o;}\nfunction zjsign(J,C,path,params){var s=zjsess(J,C),Cph=Packages.javax.crypto.Cipher,NL=String.fromCharCode(10);var iv=zu(zr(12));var c=Cph.getInstance(\"AES/GCM/NoPadding\");c.init(Cph.ENCRYPT_MODE,s.aes,new Packages.javax.crypto.spec.GCMParameterSpec(128,iv));var ct=c.doFinal(zu(JSON.stringify(params)));var body=JSON.stringify({version:1,algorithm:\"AES-256-GCM\",data:zb(ct),nonce:zb(iv)});var ts=String(Math.floor(Date.now()/1000));var no=zb(zu(zr(24))).replace(/\\+/g,\"-\").replace(/\\//g,\"_\").replace(/=/g,\"\");var bh=hs(zu(body));var sg=zb(zh(s.hk,zu([\"POST\",path,ts,no,bh,s.sid].join(NL))));return {body:body,headers:{\"Content-Type\":\"application/json\",\"User-Agent\":ZJ_UA,\"Referer\":ZJB+\"/\",\"Origin\":ZJB,\"X-Session-ID\":s.sid,\"X-Timestamp\":ts,\"X-Nonce\":no,\"X-Signature\":sg,\"X-Key-Version\":\"1\"}};}\nfunction zjdec(J,C,t){var rj=JSON.parse(String(t));if(!(rj&&rj.version===1))return String(t);var s=zjsess(J,C);var Cph=Packages.javax.crypto.Cipher;var c=Cph.getInstance(\"AES/GCM/NoPadding\");c.init(Cph.DECRYPT_MODE,s.aes,new Packages.javax.crypto.spec.GCMParameterSpec(128,zd(rj.nonce)));return zs(c.doFinal(zd(rj.data)));}\nfunction zjpost(J,C,path,r,timeout){var h=new Packages.java.util.HashMap();for(var k in r.headers){h.put(String(k),String(r.headers[k]));}var rr;try{rr=J.post(ZJB+path,String(r.body),h,timeout||15000);}catch(e){if(/Status=401/.test(String(e&&e.message?e.message:e))){try{C.putMemory(\"zjs\",\"\");}catch(x){}throw new Error(\"会话已过期(401)\");}throw e;}var sc=0;try{sc=rr.statusCode();}catch(e){}if(sc===401){try{C.putMemory(\"zjs\",\"\");}catch(x){}throw new Error(\"会话已过期(401)\");}var resp;try{resp=String(rr.body());}catch(e){resp=String(rr);}return resp;}\nfunction zjcallOnce(J,C,path,params,timeout){return zjdec(J,C,zjpost(J,C,path,zjsign(J,C,path,params),timeout));}\nfunction zjcall(J,C,path,params,timeout,tries){tries=tries||1;var e=null;for(var i=0;i<tries;i++){try{return zjcallOnce(J,C,path,params,timeout);}catch(ex){e=ex;if(i<tries-1)zsleep(400*(i+1));}}throw e;}\nfunction zjid(u){var m=ZJ_BOOK_RE.exec(String(u));return m?decodeURIComponent(m[1]):\"\";}\nvar ZJ_ZHU=[\"著作权\",\"著作\",\"著名\",\"显著\",\"著者\",\"编著\",\"论著\",\"名著\",\"土著\",\"卓著\",\"昭著\",\"遗著\",\"著述\",\"巨著\",\"专著\",\"原著\",\"译著\",\"合著\",\"新著\",\"旧著\",\"拙著\",\"著录\",\"著书\",\"著称\",\"著文\",\"著式\",\"著志\",\"著于\",\"著白\"];\nvar ZJ_ZHU_RE=new RegExp(\"(\"+ZJ_ZHU.join(\"|\")+\")|著\",\"g\");\nfunction zjzhu(s){s=String(s);if(s.indexOf(\"著\")<0)return s;return s.replace(ZJ_ZHU_RE,function(m){return m===\"著\"?\"着\":m;});}\nfunction zjt2s(J,s){var t;try{t=String(J.t2s(String(s)));}catch(e){t=String(s);}return zjzhu(t);}\nfunction zjlistArr(J,arr){if(!arr||!arr.length)return [];var conv=zjt2s(J,JSON.stringify(arr));var a;try{a=JSON.parse(conv);}catch(e){throw new Error(\"列表解析失败\");}var o=[];for(var i=0;i<a.length;i++){o.push(JSON.stringify(a[i]));}return o;}\nfunction zjlist(J,C,t){var j;try{j=JSON.parse(zjdec(J,C,t));}catch(e){throw new Error(\"响应解析失败\");}if(j&&typeof j.code!==\"undefined\"&&j.code!==0)throw new Error(\"站点错误 \"+j.code+(j.message?(\"：\"+j.message):\"\"));return zjlistArr(J,j&&j.data);}\nfunction zjdetail(J,C,u){var bid=zjid(u);if(!bid)return null;var key=\"zjd_\"+bid,t=Math.floor(Date.now()/1000);var j=null;try{var sv=C.getFromMemory(key);if(sv){var o=JSON.parse(String(sv));if(o&&o.t&&o.t>t-1800)j=o.j;}}catch(e){j=null;}if(!j){try{if(Number(C.getFromMemory(\"zjd_f_\"+bid)||0)>t-60)return null;}catch(e){}var s=null;try{s=zjcall(J,C,\"/api/book/detail\",{book_id:bid},15000,2);}catch(e){try{C.putMemory(\"zjd_f_\"+bid,t);}catch(x){}return null;}try{j=JSON.parse(String(s));}catch(e){j=null;}if(j&&j.code===0&&j.data){try{C.putMemory(key,JSON.stringify({t:t,j:j}));}catch(e){}}else{try{C.putMemory(\"zjd_f_\"+bid,t);}catch(x){}}}return j;}\nfunction zjdfield(J,C,u,f){var j=zjdetail(J,C,u);return zjt2s(J,(j&&j.data&&j.data[f]!=null)?j.data[f]:\"\");}\nfunction zj_search(J,C,key,page){var r=zjsign(J,C,\"/api/search\",{keyword:String(key),page:page});return ZJB+\"/api/search,\"+JSON.stringify({method:\"POST\",body:r.body,headers:r.headers,charset:\"utf-8\"});}\nfunction zjtocurl(J,C,u){return ZJB+\"/book/\"+zjid(u);}\nfunction zjtoclist(J,C,u){var bid=zjid(u);if(!bid||String(u).indexOf(ZJB+\"/book/\")!==0)throw new Error(\"无法解析书籍ID（若从旧版升级，请对本书执行“更新书籍信息”）\");var s;try{s=zjcall(J,C,\"/api/book/catalog\",{book_id:bid},45000,2);}catch(e){throw new Error(\"目录获取失败：\"+(e&&e.message?e.message:e));}var j;try{j=JSON.parse(String(s));}catch(e){throw new Error(\"目录解析失败\");}if(j&&typeof j.code!==\"undefined\"&&j.code!==0)throw new Error(\"站点错误 \"+j.code+(j.message?(\"：\"+j.message):\"\"));return zjlistArr(J,j&&j.data);}\nfunction zj_bookurl(J,item){return ZJB+\"/book/\"+JSON.parse(String(item)).id;}\nfunction zj_chapterurl(J,item){return ZJB+\"/read/\"+JSON.parse(String(item)).id;}\nfunction zjesc(s){return String(s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/\"/g,'&quot;').replace(/'/g,'&#39;');}\nfunction zjcraw(J,C,cid,tok){var prm={chapter_id:String(cid)};if(tok)prm.captcha_token=String(tok);var t0=Date.now();try{var resp=zjpost(J,C,\"/api/book/content\",zjsign(J,C,\"/api/book/content\",prm));zjhist(C,{t:Math.floor(t0/1000),c:String(cid).substr(2,6),ms:Date.now()-t0,ok:1,le:resp.length});return resp;}catch(e){var em=String(e&&e.message?e.message:e);zjhist(C,{t:Math.floor(t0/1000),c:String(cid).substr(2,6),ms:Date.now()-t0,err:em.slice(0,50)});throw e;}}\nfunction zjhist(C,o){try{var a=JSON.parse(String(C.getFromMemory(\"zjhist\")||\"[]\"));a.push(o);if(a.length>40)a=a.slice(a.length-40);C.putMemory(\"zjhist\",JSON.stringify(a));}catch(e){}}\n// 章节正文：本地解密。key = HKDF(ikm=base64decode(key_material), salt=utf8(book_id+\"\\n\"+chapter_id+\"\\n\"+version)||nonce, info=\"novel-chapter-aes-v1\")\nfunction zjcd(J,C,rj){var o=zjsess(J,C),NL=String.fromCharCode(10),Cph=Packages.javax.crypto.Cipher;\n var salt=hc(zu(String(rj.book_id)+NL+String(rj.chapter_id)+NL+String(rj.version)),zd(rj.nonce));\n var key=new Packages.javax.crypto.spec.SecretKeySpec(hkb(zd(o.km),salt,\"novel-chapter-aes-v1\"),\"AES\");\n var c=Cph.getInstance(\"AES/GCM/NoPadding\");c.init(Cph.DECRYPT_MODE,key,new Packages.javax.crypto.spec.GCMParameterSpec(128,zd(rj.nonce)));\n return zs(c.doFinal(zd(rj.data)));}\nfunction zjcdec(J,C,resp){var rj=JSON.parse(String(resp));if(!(rj&&rj.version===1))return {mode:\"plain\",code:(rj&&rj.code!==undefined?rj.code:-1),msg:((rj&&rj.message)||\"\"),obj:rj};\n if(rj.key_mode==='chapter'){return {mode:\"chapter\",obj:JSON.parse(zjcd(J,C,rj))};}\n var s=zjsess(J,C),Cph=Packages.javax.crypto.Cipher;var c=Cph.getInstance(\"AES/GCM/NoPadding\");c.init(Cph.DECRYPT_MODE,s.aes,new Packages.javax.crypto.spec.GCMParameterSpec(128,zd(rj.nonce)));return {mode:\"session\",obj:JSON.parse(zs(c.doFinal(zd(rj.data))))};}\nfunction zjchtml(J,obj){var d=(obj&&obj.data)||{};if(d.unavailable)return '<p>【本章暂不可阅读】'+zjesc(d.message||'站点暂未提供，请稍后再试')+'</p>';var paras=d.paragraphs||[];var h=\"\",i,p;for(i=0;i<paras.length;i++){p=paras[i];if(p&&typeof p==='object'){if(p.image)h+='<img src=\"'+zjesc(p.image)+'\">';if(p.text)h+='<p>'+zjesc(p.text)+'</p>';}else if(p!=null){h+='<p>'+zjesc(p)+'</p>';}}if(!h&&d.content)h='<p>'+zjesc(d.content)+'</p>';if(!h&&d.text)h='<p>'+zjesc(d.text)+'</p>';return h;}\nfunction zjj(v){return JSON.stringify(String(v)).replace(/</g,\"\\\\u003c\").replace(/>/g,\"\\\\u003e\");}\nfunction zjVPage(sid,km,cid){var vars=\"var ZJB=\"+zjj(ZJB)+\";var SID=\"+zjj(sid)+\";var KM=\"+zjj(km)+\";var CID=\"+zjj(cid)+\";\";return \"<!doctype html><html><head><meta charset='utf-8'><meta name='viewport' content='width=device-width,initial-scale=1'></head><body><div id='out' style='font-size:16px;line-height:1.7;padding:14px'>正在准备人机验证…</div><div id='cf' style='margin:12px'></div><scr\"+\"ipt>\"+vars+ZJ_VPAGE+\"</scr\"+\"ipt></body></html>\";}\n// 备用（仅当站点 captcha 类型为 cf）：跨线程锁 + 浏览器验证页；失败也要释放锁\nfunction zjdg2(C,d){try{C.putMemory(\"zjdg2\",JSON.stringify(d));}catch(e){}}\nfunction zjcfverify(J,C,id){var now=Math.floor(Date.now()/1000);var got=false;var d={};\n try{var cur=Number(C.getFromMemory(\"zjlock\")||0);if(!cur||(now-cur)>=25){C.putMemory(\"zjlock\",now);got=true;}}catch(e){got=true;}\n if(!got){d.wait=1;for(var i=0;i<30;i++){zsleep(1000);var v=0;try{v=Number(C.getFromMemory(\"zjver\")||0);}catch(e){}if(v>Math.floor(Date.now()/1000)-3540){d.other=1;zjdg2(C,d);return true;}}zjdg2(C,d);return false;}\n try{var o=zjsess(J,C);var resp=J.startBrowserAwait(ZJB+\"/\",\"请完成人机验证（完成后自动继续）\",false,zjVPage(o.sid,o.km,id));var ph=String(resp.body());var okv=(ph.indexOf('data-ver=\"1\"')>=0);d.len=ph.length;d.hasVer=okv?1:0;if(okv){try{C.putMemory(\"zjver\",Math.floor(Date.now()/1000));}catch(e){}}zjdg2(C,d);return okv;}catch(e){d.err=String(e&&e.message?e.message:e).slice(0,110);zjdg2(C,d);return false;}finally{try{C.putMemory(\"zjlock\",0);}catch(e){}}}\n// ===== Altcha 自动人机验证（PoW，无需用户交互、无 WebView）=====\n// 找 counter 使 SHA^n(alg)(salt || nonce || uint32be(counter)) 的前 keyPrefix(hex) 匹配。\nfunction zjsha(b,alg){return Packages.java.security.MessageDigest.getInstance(alg).digest(b);}\nfunction zju32(n){var b=Packages.java.nio.ByteBuffer.allocate(4);b.putInt(n|0);return b.array();}\nfunction zjhexb(s){s=String(s);var str=\"\",i;for(i=0;i<s.length-(s.length%2?1:0);i+=2)str+=String.fromCharCode(parseInt(s.substr(i,2),16));return new Packages.java.lang.String(str).getBytes(\"ISO-8859-1\");}\nfunction zjhex(b){var s=\"\",i,v,h;for(i=0;i<b.length;i++){v=b[i]&255;h=v.toString(16);if(h.length<2)h=\"0\"+h;s+=h;}return s;}\nfunction zjswhex(d,hex){for(var i=0;i<hex.length;i++){var j=i>>1;if(j>=d.length)return false;var v=d[j]&255;var h=(i&1)?(v&15):((v>>4)&15);if(h!==parseInt(hex.charAt(i),16))return false;}return true;}\nfunction zjpow(p){var alg=String(p.algorithm||\"SHA-256\");if(alg!==\"SHA-256\"&&alg!==\"SHA-384\"&&alg!==\"SHA-512\")return null;var preHex=String(p.keyPrefix||\"\").toLowerCase();if(!preHex||!/^[0-9a-f]+$/.test(preHex))return null;var salt=zjhexb(p.salt),nonce=zjhexb(p.nonce),cost=Math.max(1,Math.min(p.cost|0,10000)),klen=(p.keyLength||32)*2,t0=Date.now();for(var c=0;c<3000000;c++){var d=hc(salt,hc(nonce,zju32(c)));for(var k=0;k<cost;k++)d=zjsha(d,alg);if(zjswhex(d,preHex))return {counter:c,key:zjhex(d).substring(0,klen),ms:Date.now()-t0};if((c&255)===255&&(Date.now()-t0)>20000)return null;}return null;}\nfunction zjctype(J,C){var t=\"\",ts=0,now=Math.floor(Date.now()/1000);try{t=String(C.getFromMemory(\"zjcap\")||\"\");ts=Number(C.getFromMemory(\"zjcaps\")||0);}catch(e){}if((t===\"altcha\"||t===\"cf\")&&ts>now-3600)return t;try{var cfg=JSON.parse(String(zjcall(J,C,\"/api/config\",{},15000,2)));var d=(cfg&&cfg.data)||{};t=(((d.captcha&&d.captcha.type)===\"cf\")||d.captcha_type===\"cf\")?\"cf\":\"altcha\";try{C.putMemory(\"zjcap\",t);C.putMemory(\"zjcaps\",now);}catch(e){}}catch(e){t=\"altcha\";}return String(t);}\nfunction zjaltcha(J,C){var ct;try{ct=String(J.get(ZJB+\"/api/captcha/altcha/challenge\",null,12000).body());}catch(e){return \"\";}\n var chal;try{chal=JSON.parse(ct);}catch(e){return \"\";}\n var p=chal&&chal.parameters;if(!p||!p.keyPrefix)return \"\";\n var sol=zjpow(p);if(!sol)return \"\";\n var payload=zb(zu(JSON.stringify({challenge:{parameters:p,signature:chal.signature},solution:{counter:sol.counter,derivedKey:sol.key,time:sol.ms}})));\n var v=null;try{v=JSON.parse(String(zjcall(J,C,\"/api/captcha/altcha/verify\",{payload:payload})));}catch(e){return \"\";}\n var tok=(v&&v.data&&v.data.captcha_token)||\"\";\n try{C.putMemory(\"zjcapd\",JSON.stringify({ok:tok?1:0,ctr:sol.counter,ms:sol.ms,cost:p.cost}));}catch(e){}\n return tok;}\n// 正文总入口：直连解密优先；403/4001 自动 PoW 后重试；限频不重试；失败返回干净提示。\n// 注意：非空返回会被 Legado 当正文缓存（BookHelp.saveContent 落盘），用户可「刷新本章」重取；unavailable 在 zjchtml 里短路、不重试。\nfunction zjcontent(J,C,id){var out=\"\",dg={t:Math.floor(Date.now()/1000)};var i;\n function once(tok){try{return zjcdec(J,C,zjcraw(J,C,id,tok));}catch(e){return {mode:\"exc\",err:String(e&&e.message?e.message:e)};}}\n function cd(r){if(!r)return undefined;if(r.obj&&typeof r.obj.code!==\"undefined\")return r.obj.code;return r.code;}\n function mg(r){return String((r&&r.obj&&r.obj.message)||(r&&r.msg)||(r&&r.err)||\"\");}\n function isVerify(r){var c=cd(r);return c===403||c===4001||/驗證|验证|人機|人机|Status=403/.test(mg(r));}\n function isRate(r){var c=cd(r);return c===429||/頻繁|频繁|Status=429/.test(mg(r));}\n function isTimeout(r){return /timeout|timed out|SocketTimeout|abort/i.test(mg(r));}\n function doVerify(){var ty=\"altcha\";try{ty=String(zjctype(J,C)||\"altcha\");}catch(e){}\n   if(ty===\"altcha\"){var tok=\"\";try{tok=zjaltcha(J,C);}catch(e){}if(tok){var ra=once(tok);if(cd(ra)===0)out=zjchtml(J,ra.obj);if(!out){dg.acode=cd(ra);dg.amsg=mg(ra).slice(0,60);}}}\n   else{try{zjcfverify(J,C,id);}catch(e){}var rb=once();if(cd(rb)===0)out=zjchtml(J,rb.obj);}\n   dg.path=out?\"verify-ok\":\"verifyFail\";}\n var r=once();\n if(cd(r)===0){out=zjchtml(J,r.obj);if(out)dg.path=\"direct\";}\n if(!out&&isVerify(r))doVerify();\n if(!out&&dg.path!==\"verifyFail\"&&!isRate(r)){\n   for(i=0;i<2&&!out;i++){\n     if(isTimeout(r)){dg.path=\"timeout\";zsleep(1200*(i+1));}else{dg.path=\"retry\";zsleep(500);}\n     r=once();\n     if(cd(r)===0){out=zjchtml(J,r.obj);if(out)dg.path=\"direct\";break;}\n     if(isVerify(r)){doVerify();break;}\n     if(isRate(r))break;\n     if(typeof cd(r)!==\"undefined\"&&cd(r)!==0&&cd(r)!==403&&cd(r)!==429)break;\n   }\n }\n dg.code=cd(r);dg.msg=mg(r).slice(0,70);\n dg.final=(out?out.replace(/<[^>]*>/g,' ').replace(/\\s+/g,'').length:0);\n try{C.putMemory(\"zjdiag\",JSON.stringify(dg));}catch(e){}\n if(out)return out;\n if(cd(r)===0&&r.obj&&r.obj.data&&r.obj.data.unavailable)return \"【本章暂不可阅读】\"+zjt2s(J,r.obj.data.message||\"站点暂未提供，请稍后再试\");\n if(dg.path===\"verifyFail\"||isVerify(r))return \"【提示】本章需要人机验证（未通过）：请点一下屏幕，再点右上角的“刷新”按钮重试本章。\";\n if(isRate(r))return \"【提示】请求过于频繁（站点限流）：请稍后点一下屏幕，再点右上角的“刷新”按钮重试本章。\";\n if(r.obj&&typeof r.obj.code!==\"undefined\"&&r.obj.code!==0)return \"【提示】站点返回：\"+zjt2s(J,r.obj.message||r.obj.code);\n return \"【提示】未获取到正文（可能是网络超时）。请点一下屏幕，再点右上角的“刷新”按钮重试本章。\";\n}", "lastUpdateTime": "1791439385513", "respondTime": 180000, "ruleBookInfo": {"author": "@js:zjdfield(java,cache,baseUrl,\"author\")", "intro": "@js:zjdfield(java,cache,baseUrl,\"description\")", "kind": "@js:zjdfield(java,cache,baseUrl,\"category\")", "lastChapter": "@js:zjdfield(java,cache,baseUrl,\"latest_chapter\")", "name": "@js:zjdfield(java,cache,baseUrl,\"name\")", "tocUrl": "@js:zjtocurl(java,cache,baseUrl)"}, "ruleContent": {"content": "@js:(function(){\n  var id=(String(baseUrl).match(/\\/read\\/([^,\\/?]+)/)||['',''])[1];\n  if(!id)return \"【提示】无法解析章节链接。请点一下屏幕，再点右上角的“刷新”按钮重试本章。\";\n  var out;\n  try{ out=String(zjcontent(java,cache,id)||\"\"); }catch(e){ try{cache.putMemory(\"zjdiag\",JSON.stringify({err:String(e&&e.message?e.message:e)}));}catch(x){} out=\"【提示】加载异常，请点一下屏幕，再点右上角的“刷新”按钮重试本章。\"; }\n  try{ if(out.replace(/<[^>]*>/g,' ').replace(/\\s+/g,'').length>0) out=zjt2s(java,out); }catch(e){}\n  return out;\n})()"}, "ruleExplore": [], "ruleSearch": {"author": "$.author", "bookList": "@js:zjlist(java,cache,result)", "bookUrl": "@js:zj_bookurl(java,result)", "checkKeyWord": "斗破", "intro": "$.description", "kind": "$.category", "name": "$.name"}, "ruleToc": {"chapterList": "@js:zjtoclist(java,cache,baseUrl)", "chapterName": "$.name", "chapterUrl": "@js:zj_chapterurl(java,result)"}, "searchUrl": "{{zj_search(java,cache,key,page)}}", "weight": 0},{"bookSourceComment": "智能书库（zzbook.net）书源，支持发现、搜索、书籍详情、目录、正文与跨页续读。\n\n【站点特征】\n站点以短篇同人作品为主，全站启用 JS Cookie 校验：由前端脚本 document.cookie 写入 ge_js_validator_20（末尾数字为版本号，站点升级时可能变化），响应头不下发 Set-Cookie；请求未携带该 Cookie 时，所有页面均只返回约 278 字节的壳页。搜索接口为 POST /search.html，目录按 /go/{分类}/{书号}/{页}/ 分页，正文以 document.writeln(fn('base64')) 形式混淆输出，超长章节拆分为 {章节id}_1.html 续页。\n\n【实现说明】\n1. Cookie 获取与续期：jsLib 中的 zzMint 通过 java.ajax 请求首页，从返回内容中提取 Cookie 值写入 CookieStore 并随请求发送；若首页返回真实页面则沿用本地已存值，仅在无法取得时退化为 webView 加载。\n2. 请求头格式：Cookie 须以 \"ge_js_validator_20=值\" 的完整形式置于 headers 中，仅发送值会被服务端拒绝。Legado 的 java.ajax 不会自动携带 CookieStore 中的 Cookie，因此本源在规则内显式拼接请求头。\n3. jsLib 作用域：jsLib 在独立作用域中求值，其中的函数访问不到规则执行时才注入的 java 与 cookie 对象，因此本源所有 jsLib 函数均采用显式传参方式调用。\n4. 有效期处理：站点实际作废时间早于响应头声明的 max-age，故不依赖本地时间戳判断，改为每次请求前访问首页自校验，避免复用已失效的 Cookie 导致页面空白。\n5. 正文解码：正文规则先取 #booktxt 节点内容，再用 java.base64Decode 还原 writeln 中的 base64 片段，并清除残留的 banner 占位段。\n\n【已知限制】\n1. 站点自身的列表分页失效，发现页各分类的后续页与首页内容相同，本源未提供真翻页。\n2. 目录固定从第 1 页进入，正常使用流程不受影响。\n3. 部分分类条目由站点返回空书名，属站点数据问题。\n4. 每次请求需额外访问一次首页以校验 Cookie 有效性，是为保证稳定性的必要代价。\n5. 详情页无法附加 Cookie 守卫（其 URL 由列表项直接给出，不经书源规则），正常流程（先搜索或浏览分类）不受影响。\n\n本源仅供个人学习与阅读使用。站点若改版导致页面空白或解析异常，通常为 Cookie 校验机制变动所致，需同步更新书源。", "bookSourceGroup": "R18+", "bookSourceName": "智能书库(zzbook MO版)", "bookSourceType": 0, "bookSourceUrl": "https://www.zzbook.net", "bookUrlPattern": "https?://www\\.zzbook\\.net/go/\\d+/\\d+/", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "首页推荐::<js>zzGet(java,cookie,'/')</js>\n玄幻::<js>zzGet(java,cookie,'/list/1/1/')</js>\n重生::<js>zzGet(java,cookie,'/list/2/1/')</js>\n都市::<js>zzGet(java,cookie,'/list/3/1/')</js>\n军史::<js>zzGet(java,cookie,'/list/4/1/')</js>\n网游::<js>zzGet(java,cookie,'/list/5/1/')</js>\n科幻::<js>zzGet(java,cookie,'/list/6/1/')</js>\n灵异::<js>zzGet(java,cookie,'/list/7/1/')</js>\n言情::<js>zzGet(java,cookie,'/list/8/1/')</js>\n其他::<js>zzGet(java,cookie,'/list/9/1/')</js>", "header": "{\"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\"}", "jsLib": "function zzKey(){\n  return 'ge_js_validator_20';\n}\nfunction zzHome(){\n  return 'https://www.zzbook.net/';\n}\nfunction zzJar(ck){\n  try{\n    var v = ck.getKey(zzHome(), zzKey());\n    return v ? String(v) : '';\n  }catch(e){ }\n  return '';\n}\nfunction zzMint(jv, ck){\n  var cached = zzJar(ck);\n  var s = '';\n  try{ s = String(jv.ajax(zzHome()) || ''); }catch(e){ s = ''; }\n  if(s.indexOf('hotcontent') >= 0){\n    return cached;\n  }\n  var m = s.match(/ge_js_validator_\\d+=[^;\"']+/);\n  if(m){\n    try{ ck.setCookie(zzHome(), m[0]); }catch(e){ }\n    var i = m[0].indexOf('=');\n    if(i > 0){ return m[0].substring(i + 1); }\n  }\n  return cached;\n}\nfunction zzHead(v){\n  if(!v){ return ',{\"webView\":true,\"webViewDelayTime\":2500}'; }\n  return ',{\"headers\":{\"Cookie\":\"' + zzKey() + '=' + v + '\"}}';\n}\nfunction zzGet(jv, ck, path){\n  var u = 'https://www.zzbook.net' + path;\n  var v = zzMint(jv, ck);\n  try{ jv.log('[zzbook] get ' + path + ' ck=' + (v ? 'Y' : 'N')); }catch(e){ }\n  return u + zzHead(v);\n}\nfunction zzPost(jv, ck){\n  var v = zzMint(jv, ck);\n  try{ jv.log('[zzbook] search ck=' + (v ? 'Y' : 'N')); }catch(e){ }\n  var o = '{\"method\":\"POST\",\"body\":\"s={{key}}\"';\n  if(v){ o += ',\"headers\":{\"Cookie\":\"' + zzKey() + '=' + v + '\"}'; }\n  else { o += ',\"webView\":true,\"webViewDelayTime\":2500'; }\n  return 'https://www.zzbook.net/search.html,' + o + '}';\n}\nfunction zzToc(jv, ck, u){\n  var v = zzMint(jv, ck);\n  try{ jv.log('[zzbook] toc ck=' + (v ? 'Y' : 'N')); }catch(e){ }\n  return String(u) + zzHead(v);\n}", "lastUpdateTime": "1791428813654", "respondTime": 0, "ruleBookInfo": {"author": "@css:meta[property='og:novel:author']@content", "coverUrl": "@css:meta[property='og:image']@content", "intro": "@css:meta[property='og:description']@content##(<br\\s*/?>)?\\s*三秒记住本站[\\s\\S]*|^\\s*p\\s*|\\s*/p\\s*$|(?<![A-Za-z])rn(?![A-Za-z])", "kind": "@css:meta[property='og:novel:category']@content", "lastChapter": "@css:meta[property='og:novel:latest_chapter_name']@content", "name": "@css:meta[property='og:novel:book_name']@content", "tocUrl": "@js:(function(){var u=String((book&&book.bookUrl)||baseUrl||'');u=u.replace(/\\/$/,'');u=u?(u+'/1/'):'1/';if(u.indexOf('http')!==0){return u;}return zzToc(java,cookie,u);})()", "wordCount": "@css:#info p.visible-xs:contains(万)@text##字数：", "updateTime": "@css:meta[property='og:novel:update_time']@content"}, "ruleContent": {"content": "@css:#booktxt@all@js:zzMint(java,cookie);var h=String(result);var re=/writeln\\([^']*'([^']+)'/g;var m,o='';while((m=re.exec(h))!==null){try{o+=java.base64Decode(m[1]);}catch(e){ }}o.replace(/<p>banner\"?<\\/p>|<p>><\\/p>/gi,'')", "nextContentUrl": "@js:var r=String(java.getString('class.next@href',null,true));var c=String((chapter&&chapter.url)||baseUrl||'');c=c.replace(/\\.html.*$/,'').replace(/_\\d+$/,'');var id=c.substring(c.lastIndexOf('/')+1);var f=r.replace(/.*\\//,'').replace(/\\.html.*$/,'');(id&&r&&f.indexOf(id+'_')===0)?r:'javascript:;'", "sourceRegex": "", "webJs": ""}, "ruleExplore": {"author": "@css:.btm@ownText||.s4@text||.s5@text||i@text", "bookList": "@css:#hotcontent .item, #hotcontent li, .novelslist li, #newscontent li", "bookUrl": "@css:dt a@href||.s2 a@href||a@href", "coverUrl": "@css:img@data-original", "intro": "@css:dd@text##^[.…]+$", "kind": "@css:.s1@text", "lastChapter": "@css:.s3 a@text", "name": "@css:dt a@text||.s2 a@text||a@text", "wordCount": "@css:.btm em.orange@text"}, "ruleSearch": {"author": "@css:.btm@ownText", "bookList": "@css:#hotcontent .item", "bookUrl": "@css:dt a@href", "checkKeyWord": "总裁", "coverUrl": "@css:img@data-original", "intro": "@css:dd@text##^[.…]+$", "kind": "@css:.btm em.orange@text", "lastChapter": "", "name": "@css:dt a@text", "wordCount": ""}, "ruleToc": {"chapterList": "@css:#list a[rel=chapter]", "chapterName": "@css:dd@text", "chapterUrl": "href", "isVip": "", "nextTocUrl": "@css:#list dl>dt:first-child option@value", "updateTime": ""}, "searchUrl": "<js>zzPost(java,cookie)</js>", "weight": 0},{"bookSourceComment": "// 原作者：夜明空＆zimushui\n\n// 2026/4/5/ By sjshb57\n修复章节名称显示，删除括号内内容并移除前置序号\n// 2026/4/6/ By sjshb57\n移除正文内容显示首行标题＆同时修复目录单字括号内容被误删的问题，并且优化显示效果，符合审美\n//2026/4/7 By sjshb57\n修复搜索封面失效，修复详情页简介显示不完全，添加登陆URL，修复上个版本导致的部分书籍章节号消失的问题\n//2026/4/13 By sjshb57\n修复部分书籍会导致正文第一行被误删的问题\n// 2026/7/5 By sjshb57\n修复搜索只出现单本书籍的问题\n// 2026/7/26 By sjshb57\n// 请求头补 Referer，封面/字数逻辑合并进 jsLib", "bookSourceGroup": "🌙 小说", "bookSourceName": "🌙 得奇小说", "bookSourceType": 0, "bookSourceUrl": "https://www.deqixss.com/", "bookUrlPattern": "https?:\\/\\/www\\.deqixss\\.com\\/(books|index)\\/\\d+.*", "customButton": false, "customOrder": 7, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\n    \"title\": \"玄幻小说\",\n    \"url\": \"https://www.deqixss.com/sort/1/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"都市小说\",\n    \"url\": \"https://www.deqixss.com/sort/2/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"仙侠小说\",\n    \"url\": \"https://www.deqixss.com/sort/3/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"历史小说\",\n    \"url\": \"https://www.deqixss.com/sort/4/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"科幻小说\",\n    \"url\": \"https://www.deqixss.com/sort/5/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"诸天无限\",\n    \"url\": \"https://www.deqixss.com/sort/6/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"悬疑小说\",\n    \"url\": \"https://www.deqixss.com/sort/7/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"体育小说\",\n    \"url\": \"https://www.deqixss.com/sort/8/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"游戏小说\",\n    \"url\": \"https://www.deqixss.com/sort/9/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"综合其他\",\n    \"url\": \"https://www.deqixss.com/sort/10/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"总点击榜\",\n    \"url\": \"https://www.deqixss.com/top/allvisit/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"月点击榜\",\n    \"url\": \"https://www.deqixss.com/top/monthvisit/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"周点击榜\",\n    \"url\": \"https://www.deqixss.com/top/weekvisit/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"日点击榜\",\n    \"url\": \"https://www.deqixss.com/top/dayvisit/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"总推荐榜\",\n    \"url\": \"https://www.deqixss.com/top/allvote/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"月推荐榜\",\n    \"url\": \"https://www.deqixss.com/top/monthvote/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"周推荐榜\",\n    \"url\": \"https://www.deqixss.com/top/weekvote/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"日推荐榜\",\n    \"url\": \"https://www.deqixss.com/top/dayvote/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"总月票榜\",\n    \"url\": \"https://www.deqixss.com/top/allvipvote/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"本月票榜\",\n    \"url\": \"https://www.deqixss.com/top/monthvipvote/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"前月票榜\",\n    \"url\": \"https://www.deqixss.com/top/previpvote/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"周月票榜\",\n    \"url\": \"https://www.deqixss.com/top/weekvipvote/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"日月票榜\",\n    \"url\": \"https://www.deqixss.com/top/dayvipvote/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"总鲜花榜\",\n    \"url\": \"https://www.deqixss.com/top/allflower/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"月鲜花榜\",\n    \"url\": \"https://www.deqixss.com/top/monthflower/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"周鲜花榜\",\n    \"url\": \"https://www.deqixss.com/top/weekflower/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"日鲜花榜\",\n    \"url\": \"https://www.deqixss.com/top/dayflower/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"总鸡蛋榜\",\n    \"url\": \"https://www.deqixss.com/top/allegg/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"月鸡蛋榜\",\n    \"url\": \"https://www.deqixss.com/top/monthegg/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"周鸡蛋榜\",\n    \"url\": \"https://www.deqixss.com/top/weekegg/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"日鸡蛋榜\",\n    \"url\": \"https://www.deqixss.com/top/dayegg/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"总销售榜\",\n    \"url\": \"https://www.deqixss.com/top/allsale/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"月销售榜\",\n    \"url\": \"https://www.deqixss.com/top/monthsale/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"周销售榜\",\n    \"url\": \"https://www.deqixss.com/top/weeksale/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"日销售榜\",\n    \"url\": \"https://www.deqixss.com/top/daysale/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"月勤更榜\",\n    \"url\": \"https://www.deqixss.com/top/monthwords/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"周勤更榜\",\n    \"url\": \"https://www.deqixss.com/top/weekwords/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"日勤更榜\",\n    \"url\": \"https://www.deqixss.com/top/daywords/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"最近更新\",\n    \"url\": \"https://www.deqixss.com/top/lastupdate/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"最新入库\",\n    \"url\": \"https://www.deqixss.com/top/postdate/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"最新上架\",\n    \"url\": \"https://www.deqixss.com/top/signtime/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"收藏榜\",\n    \"url\": \"https://www.deqixss.com/top/goodnum/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"字数榜\",\n    \"url\": \"https://www.deqixss.com/top/words/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"编辑推荐\",\n    \"url\": \"https://www.deqixss.com/top/toptime/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}, {\n    \"title\": \"新书榜\",\n    \"url\": \"https://www.deqixss.com/top/newhot/{{page}}.html\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.25\n    }\n}]", "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\", \"Referer\": \"https://www.deqixss.com/\", \"Accept-Language\": \"zh-CN,zh;q=0.9\"}", "jsLib": "function cover(href) {\n    var m = String(href).match(/\\/(\\d+)\\/?$/);\n    if (!m) return \"\";\n    var id = m[1];\n    var p = id.length <= 3 ? \"0\" : id.slice(0, -3);\n    return \"https://www.deqixss.com/files/article/image/\" + p + \"/\" + id + \"/\" + id + \"s.jpg\";\n}\n\nfunction words(html) {\n    var m = String(html).match(/towan\\('(\\d+)'\\)/);\n    if (m) return m[1];\n    return String(html).replace(/<[^>]+>/g, \"\").replace(/字数[：:]/g, \"\").trim();\n}", "lastUpdateTime": "1791393733583", "loginUrl": "login.php?jumpurl=https://www.deqixss.com/", "respondTime": 2730, "ruleBookInfo": {"author": "[property=\"og:novel:author\"]@content", "coverUrl": "[property=\"og:image\"]@content", "intro": "//p[@class=\"bookintro\"]/text()\n@js:result.trim().replace(/[ \\t]+/g, '\\n').replace(/^/gm, '\\u3000\\u3000')", "kind": "{{@@[property~=update_time|status|category]@content##(\\d+):(\\d+):(\\d+)}},{{@@.booktag@.blue.1@text}}", "lastChapter": "[property=\"og:novel:latest_chapter_name\"]@content", "name": "[property=\"og:novel:book_name\"]@content", "wordCount": ".booktag@.blue.0@script@all##.*\\('(\\d+)'\\).*##$1"}, "ruleContent": {"content": "@js:\nvar url = String(baseUrl);\nvar match = url.match(/\\/(\\d+)\\/(\\d+)\\.html/);\nvar content = '';\nif (match) {\n    var origin = url.match(/(https?:\\/\\/[^\\/]+)/)[1];\n    var jsUrl = origin + '/scripts/chapter.js.php?aid=' + match[1] + '&cid=' + match[2] + '&referrer=' + encodeURIComponent(url);\n    var scriptStr = java.ajax(jsUrl);\n    var token = scriptStr.match(/chapterToken\\s*=\\s*['\"]([^'\"]+)['\"]/);\n    var ts = scriptStr.match(/timestamp\\s*=\\s*['\"]?([^'\";\\s]+)/);\n    var nc = scriptStr.match(/nonce\\s*=\\s*['\"]([^'\"]+)['\"]/);\n    if (token && ts && nc) {\n        var ajaxUrl = origin + '/modules/article/ajax2.php?aid=' + match[1] + '&cid=' + match[2] + '&token=' + token[1] + '&timestamp=' + ts[1] + '&nonce=' + nc[1];\n        var opt = JSON.stringify({\n            \"charset\": \"gbk\",\n            \"headers\": {\n                \"X-Requested-With\": \"XMLHttpRequest\",\n                \"Referer\": url\n            }\n        });\n        var res = java.ajax(ajaxUrl + ',' + opt);\n        try {\n            content = JSON.parse(res).data.content;\n        } catch (e) {}\n    }\n}\ncontent ? content : java.getString('#rtext@html');", "nextContentUrl": "text.下一页@href", "replaceRegex": "@js:\nconst FILTER_RULES = [\n  /更新不易.+?看最新章节！/g,\n  /更新不易.+?看最新无错章节！/g, \n  /更新不易.+?最新小说章节！/g,\n  /速.?读.?谷/g, \n  /本章节未完.+?请订阅/g,\n  /↑返回顶部↑/g,\n  /[（(]本章.+?完[）)]/g,\n  /^(?=.*[1-9])(?=.*章).+\\n/,\n]\n\nfor(let reg of FILTER_RULES){\n\tresult = result.replace(reg, \"\")\n}\nresult;"}, "ruleExplore": {"author": "class.author.0@text##作者[：:]", "bookList": "class.bookbox", "bookUrl": "class.bookname@a@href", "coverUrl": "class.bookname@a@href@js:cover(result)", "intro": "class.update@textNodes##简介[：:]", "kind": "class.author.2@text##阅读量[：:]", "lastChapter": "class.cat@a@text", "name": "class.bookname@a@text", "wordCount": "class.author.1@html@js:words(result)"}, "ruleSearch": {"author": "class.author.0@text##作者[：:]", "bookList": "class.bookbox", "bookUrl": "class.bookname@a@href", "coverUrl": "class.bookname@a@href@js:cover(result)", "intro": "class.update@textNodes##简介[：:]", "kind": "class.author.2@text##阅读量[：:]", "lastChapter": "class.cat@a@text", "name": "class.bookname@a@text", "wordCount": "class.author.1@html@js:words(result)"}, "ruleToc": {"chapterList": "#list-chapterAll@dd@a", "chapterName": "text@js:result.replace(/^\\d+\\./, '').replace(/^第\\S+?章\\s+(?=(\\d+\\.|第))/, '').replace(/[（(][^）)]*[）)]/g, function(m){var t=m.slice(1,-1);return (t==='上'||t==='中'||t==='下') ? ' ('+t+')' : '';}).replace(/[（(][^）)]*$/, '')", "chapterUrl": "href", "nextTocUrl": "<js>\nvar txt = java.getString(\"#pagestats@text\");\nvar max = 0;\nvar m = txt.match(/\\/(\\d+)/);\nif (m) max = parseInt(m[1]);\nvar idMatch = baseUrl.match(/(?:index|books)\\/(\\d+)/);\nvar id = idMatch ? idMatch[1] : \"\";\nvar list = [];\nif (id && max > 1) {\n    for (var i = 2; i <= max; i++) {\n        list.push(\"https://www.deqixss.com/index/\" + id + \"/\" + i);\n    }\n}\nlist;\n</js>"}, "searchUrl": "https://www.deqixss.com/modules/article/search.php,{\n  \"charset\": \"utf-8\",\n  \"method\": \"POST\",\n  \"body\": \"searchkey={{key}}&searchtype=all\"\n}", "weight": 0},{"bookSourceComment": "大文学无错小说网 www.dwxwc.com｜纯CSS无内嵌JS，2026‑10‑07修复数组问题", "bookSourceGroup": "网文", "bookSourceName": "🌞大文学无错", "bookSourceType": 0, "bookSourceUrl": "https://www.dwxwc.com", "checkKeyWord": "夜无疆", "enabled": true, "enabledCookieJar": false, "header": "{\"User‑Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0 Safari/537.36\"}", "lastUpdateTime": "1791374008168", "respondTime": 180000, "searchUrl": "https://www.dwxwc.com/search.php?keyword={{key}}", "ruleFindList": "class.bookbox", "ruleFindName": "class.bookname@tag.a@text", "ruleFindAuthor": "class.author@text##作者：", "ruleFindBookUrl": "class.bookname@tag.a@href", "ruleFindCoverUrl": "class.bookbox img@src", "ruleFindLastChapter": "class.cat@tag.a@text", "ruleBookInfo": {"name": "class.booktitle@text", "author": "class.booktag@tag.a@text", "coverUrl": "class.bookcover@tag.img@src", "intro": "class.bookintro@text", "kind": "class.booktag@tag.span@text", "lastChapter": "class.bookchapter@text", "tocUrl": ""}, "ruleToc": {"chapterList": "id.list‑chapterAll@tag.dd@tag.a", "chapterName": "text", "chapterUrl": "href"}, "ruleContent": {"content": "#content@html"}, "weight": 0},{"bookSourceComment": "大文学无错小说网 www.dwxwc.com｜纯CSS无内嵌JS，2026‑10‑07", "bookSourceGroup": "网文", "bookSourceName": "🌞大文学无错", "bookSourceType": 0, "bookSourceUrl": "https://www.dwxwc.com", "checkKeyWord": "夜无疆", "enabled": true, "enabledCookieJar": false, "header": "{\"User‑Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0 Safari/537.36\"}", "lastUpdateTime": "1791373259118", "respondTime": 180000, "searchUrl": "https://www.dwxwc.com/search.php?keyword={{key}}", "ruleFindUrl": "玄幻::/sort/1/{{page}}.html\n仙侠::/sort/2/{{page}}.html\n都市::/sort/3/{{page}}.html\n历史::/sort/4/{{page}}.html\n军事::/sort/5/{{page}}.html\n科幻::/sort/6/{{page}}.html\n言情::/sort/7/{{page}}.html\n轻小说::/sort/8/{{page}}.html\n诸天无限::/sort/9/{{page}}.html\n游戏::/sort/10/{{page}}.html\n奇幻::/sort/11/{{page}}.html\n悬疑::/sort/12/{{page}}.html\n体育::/sort/13/{{page}}.html\n官场::/sort/14/{{page}}.html\n武侠::/sort/15/{{page}}.html\n现实::/sort/16/{{page}}.html", "ruleFindList": "class.bookbox", "ruleFindName": "class.bookname@tag.a@text", "ruleFindAuthor": "class.author@text##作者：", "ruleFindBookUrl": "class.bookname@tag.a@href", "ruleFindCoverUrl": "class.bookbox img@src", "ruleFindLastChapter": "class.cat@tag.a@text", "ruleBookInfo": {"name": "class.booktitle@text", "author": "class.booktag@tag.a@text", "coverUrl": "class.bookcover@tag.img@src", "intro": "class.bookintro@text", "kind": "class.booktag@tag.span@text", "lastChapter": "class.bookchapter@text", "tocUrl": ""}, "ruleToc": {"chapterList": "id.list‑chapterAll@tag.dd@tag.a", "chapterName": "text", "chapterUrl": "href"}, "ruleContent": {"content": "#content@html", "replaceRegex": "##<script[\\s\\S]*?</script>##<div[^>]*ad[^>]*>[\\s\\S]*?</div>##&nbsp;##<br[ /]*>##\\n\\n+"}, "weight": 0},{"bookSourceComment": "大文学无错小说网 www.dwxwc.com 书源。静态页面抓取，无动态token。创建于2026-10-07。", "bookSourceGroup": "", "bookSourceName": "大文学无错小说网(dwxwc.com)20261007", "bookSourceType": 0, "bookSourceUrl": "https://www.dwxwc.com", "checkKeyWord": "夜无疆", "enabled": true, "enabledCookieJar": false, "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0 Safari/537.36\"}", "lastUpdateTime": "1791371692269", "respondTime": 180000, "searchUrl": "https://www.dwxwc.com/search.php?keyword={{key}}", "ruleSearch": {"bookList": "<js>var d = [];\nvar doc = org.jsoup.Jsoup.parse(result, baseUrl);\nif (doc.select('.bookbox').size() > 0) {\n    d = doc.select('.bookbox');\n} else {\n    var name = doc.select('h1.booktitle').text();\n    if (name) {\n        var url = doc.select('link[rel=canonical]').attr('href') || doc.select('meta[property=og:novel:read_url]').attr('content');\n        var author = doc.select('.booktag a').first().text();\n        var last = doc.select('.bookchapter').text();\n        var frag = '<div class=\"bookbox\"><h4 class=\"bookname\"><a href=\"' + url + '\">' + name + '</a></h4><div class=\"author\">作者：' + author + '</div><div class=\"cat\"><a>' + last + '</a></div></div>';\n        d = org.jsoup.Jsoup.parseBodyFragment(frag).select('.bookbox');\n    }\n}\nd;</js>", "name": "class.bookname@tag.a@text", "bookUrl": "class.bookname@tag.a@href", "author": "class.author.0@text##作者：", "lastChapter": "class.cat@tag.a@text"}, "ruleBookInfo": {"name": "class.booktitle@text", "author": "class.booktag@tag.a@text", "coverUrl": "class.bookcover@tag.img@src", "intro": "class.bookintro@text", "kind": "", "lastChapter": "class.bookchapter@text", "tocUrl": ""}, "ruleToc": {"chapterList": "id.list-chapterAll@tag.dd@tag.a", "chapterName": "text", "chapterUrl": "href"}, "ruleContent": {"content": "<js>var doc = org.jsoup.Jsoup.parse(result,baseUrl);\nvar html = doc.getElementById('content').html();\nhtml = html.replace(/<script[\\s\\S]*?<\\/script>/gi,'');\nhtml = html.replace(/<div[\\s\\S]*?>/gi,'');\nhtml = html.replace(/<\\/div>/gi,'');\nhtml = html.replace(/&nbsp;/gi,' ');\nhtml = html.replace(/<br[ \\/]*>/gi,'\\n');\nhtml = html.replace(/div.bookinfo|div.banner|div.ad/gi,'');\nresult = html.trim();\n</js>"}, "weight": 0},{"bookSourceComment": "by艳阳 | 优化：姚浅书\n域名池：suduguu.com / shudugu.org / sudugu520.com\n按钮：⚡智能换源 / 🔄切换 / 🔍自动选 / 📋当前 / 📶延迟", "bookSourceGroup": "自制", "bookSourceName": "速读谷", "bookSourceType": 0, "bookSourceUrl": "https://www.suduguu.com/", "bookUrlPattern": "https?:\\/\\/(www\\.)?(shudugu\\.org|sudugu520\\.com|suduguu\\.com)\\/\\d+(\\/.*)?", "concurrentRate": "1", "customButton": false, "customOrder": -9, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>\nvar host = getServerHost();\nvar cats = [\n    {title: \"完结小说\", url: host + '/wanjie/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"都市小说\", url: host + '/dushi/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"玄幻小说\", url: host + '/xuanhuan/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"轻小说\", url: host + '/qing/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"仙侠小说\", url: host + '/xianxia/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"历史小说\", url: host + '/lishi/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"科幻小说\", url: host + '/kehuan/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"诸天无限\", url: host + '/zhutianwuxian/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"游戏小说\", url: host + '/youxi/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"奇幻小说\", url: host + '/qihuan/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"悬疑小说\", url: host + '/xuanyi/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"体育小说\", url: host + '/tiyu/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"官场小说\", url: host + '/guanchang/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"军事小说\", url: host + '/junshi/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"武侠小说\", url: host + '/wuxia/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"乡村小说\", url: host + '/xiangcun/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"现实小说\", url: host + '/xianshi/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"言情小说\", url: host + '/yanqing/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"最新更新\", url: host + '/zuixin/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}}\n];\nJSON.stringify(cats);\n</js>", "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\"}", "jsLib": "var hosts = [\n    \"https://www.suduguu.com\",\n    \"https://shudugu.org\",\n    \"https://sudugu520.com\"\n];\n\nfunction getHosts() {\n    return hosts;\n}\n\nfunction getServerHost() {\n    var source = this.source;\n    try {\n        var config = JSON.parse(source.getVariable());\n        if (config && config[0] && config[0].host) {\n            return config[0].host;\n        }\n        return getHosts()[0];\n    } catch (e) {\n        return getHosts()[0];\n    }\n}\n\nfunction getConfig() {\n    var source = this.source;\n    try {\n        var configStr = source.getVariable();\n        if (!configStr || configStr.trim() === \"\") {\n            return { host: getHosts()[0] };\n        }\n        var config = JSON.parse(configStr);\n        if (!config || !config.join || config.length === 0) {\n            return { host: getHosts()[0] };\n        }\n        return config[0] || { host: getHosts()[0] };\n    } catch (e) {\n        return { host: getHosts()[0] };\n    }\n}\n\nfunction setConfig(key, value) {\n    var source = this.source;\n    try {\n        var config = getConfig.call(this);\n        config[key] = value;\n        source.setVariable(JSON.stringify([config]));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\n\nfunction setConfigs(obj) {\n    var source = this.source;\n    try {\n        var config = getConfig.call(this);\n        for (var k in obj) {\n            if (obj.hasOwnProperty(k)) {\n                config[k] = obj[k];\n            }\n        }\n        source.setVariable(JSON.stringify([config]));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\n\nfunction checkConnectivity(host) {\n    var timeout = 5000;\n    var socket = null;\n    try {\n        var start = new Date().getTime();\n        var jUrl = new Packages.java.net.URL(host);\n        var hostname = jUrl.getHost();\n        var port = jUrl.getPort();\n        if (port === -1) { port = jUrl.getDefaultPort(); }\n        socket = new Packages.java.net.Socket();\n        var addr = new Packages.java.net.InetSocketAddress(hostname, port);\n        socket.connect(addr, timeout);\n        var latency = new Date().getTime() - start;\n        return {ok: true, latency: latency};\n    } catch (e) {\n        return {ok: false, latency: -1, err: String(e)};\n    } finally {\n        try { if (socket !== null) { socket.close(); } } catch (e2) {}\n    }\n}\n\nfunction autoSelectHost() {\n    var allHosts = getHosts();\n    var details = [];\n    var best = null;\n    var bestLatency = -1;\n    for (var i = 0; i < allHosts.length; i++) {\n        var r = checkConnectivity.call(this, allHosts[i]);\n        r.host = allHosts[i];\n        details.push(r);\n        if (r.ok && (bestLatency < 0 || r.latency < bestLatency)) {\n            best = allHosts[i];\n            bestLatency = r.latency;\n        }\n    }\n    if (best !== null) {\n        setConfig.call(this, 'host', best);\n    }\n    return {success: best !== null, host: best, details: details};\n}", "lastUpdateTime": "1791350241890", "loginUi": "[{\"name\": \"⚡ 智能换源\", \"type\": \"button\", \"action\": \"smartswitch()\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1.0}}, {\"name\": \"🔄 切换域名\", \"type\": \"button\", \"action\": \"sethost()\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}}, {\"name\": \"🔍 自动选可用\", \"type\": \"button\", \"action\": \"autohost()\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}}, {\"name\": \"📋 当前域名\", \"type\": \"button\", \"action\": \"checkhost()\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}}, {\"name\": \"📶 域名延迟\", \"type\": \"button\", \"action\": \"pinghost()\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}}]", "loginUrl": "this.sethost = function() {\n    try {\n        var currentHost = getConfig.call(this).host || getHosts()[0];\n        var currentIndex = getHosts().indexOf(currentHost);\n        var newIndex = (currentIndex + 1) % getHosts().length;\n        var newHost = getHosts()[newIndex];\n        setConfig.call(this, 'host', newHost);\n        java.toast(\"\\n已切换到：\\n\" + newHost + \"\\n刷新发现页生效\");\n    } catch(e) {\n        setConfig.call(this, 'host', getHosts()[0]);\n        java.toast(\"\\n已初始化：\" + getHosts()[0]);\n    }\n};\n\nthis.checkhost = function() {\n    try {\n        var currentHost = getServerHost();\n        java.toast(\"\\n当前服务器：\\n\" + currentHost);\n    } catch(e) {\n        java.toast(\"获取失败\");\n    }\n};\n\nthis.autohost = function() {\n    try {\n        java.toast(\"\\n正在检测，请稍候...\");\n        var result = autoSelectHost.call(this);\n        var msg = \"\";\n        for (var i = 0; i < result.details.length; i++) {\n            var d = result.details[i];\n            var shortName = d.host.replace(\"https://\",\"\").replace(\"http://\",\"\");\n            if (d.ok) {\n                msg += \"\\n✓ \" + shortName + \"  \" + d.latency + \"ms\";\n            } else {\n                msg += \"\\n✗ \" + shortName + \"  不可达\";\n            }\n        }\n        if (result.success) {\n            msg += \"\\n\\n已选中：\" + result.host.replace(\"https://\",\"\");\n        } else {\n            msg += \"\\n\\n全部不可达\";\n        }\n        java.toast(msg);\n    } catch(e) {\n        java.toast(\"检测异常：\" + String(e));\n    }\n};\n\nthis.pinghost = function() {\n    try {\n        var currentHost = getServerHost();\n        var r = checkConnectivity.call(this, currentHost);\n        var shortName = currentHost.replace(\"https://\",\"\").replace(\"http://\",\"\");\n        if (r.ok) {\n            java.toast(\"\\n当前域名：\\n\" + shortName + \"\\n延迟：\" + r.latency + \"ms\");\n        } else {\n            java.toast(\"\\n当前域名：\\n\" + shortName + \"\\n连接失败\");\n        }\n    } catch(e) {\n        java.toast(\"检测异常：\" + String(e));\n    }\n};\n\nthis.smartswitch = function() {\n    try {\n        var current = getServerHost();\n        var shortCurrent = current.replace(\"https://\",\"\").replace(\"http://\",\"\");\n        var r = checkConnectivity.call(this, current);\n        if (r.ok) {\n            java.toast(\"\\n✓ 当前域名正常\\n\" + shortCurrent + \"\\n延迟：\" + r.latency + \"ms\\n无需切换\");\n            return;\n        }\n        java.toast(\"\\n✗ 当前域名不可达\\n\" + shortCurrent + \"\\n正在自动选可用...\");\n        var result = autoSelectHost.call(this);\n        if (result.success) {\n            var msg = \"\\n已自动切换到：\\n\" + result.host.replace(\"https://\",\"\").replace(\"http://\",\"\");\n            for (var i = 0; i < result.details.length; i++) {\n                var d = result.details[i];\n                if (d.ok) {\n                    msg += \"\\n  \" + d.host.replace(\"https://\",\"\").replace(\"http://\",\"\") + \"  \" + d.latency + \"ms\";\n                }\n            }\n            msg += \"\\n\\n请返回书架重进章节\";\n            java.toast(msg);\n        } else {\n            java.toast(\"\\n全部域名不可达\\n请检查网络或稍后重试\");\n        }\n    } catch(e) {\n        java.toast(\"智能换源异常：\" + String(e));\n    }\n};", "respondTime": 180000, "ruleBookInfo": {"author": "@css:.itemtxt p:eq(1) a@text##作者：", "coverUrl": "@css:.item a img@src", "intro": "class.des.0@text", "kind": "@css:.itemtxt p:eq(0) span:eq(1)@text", "lastChapter": "@css:.itemtxt ul li:eq(0) a@text", "name": "@css:.itemtxt h1 a@text", "wordCount": "@css:.itemtxt h1 i@text"}, "ruleContent": {"content": "@js:\nvar base = String(baseUrl);\nvar hostM = base.match(/^https?:\\/\\/[^\\/]+/);\nvar host = hostM ? hostM[0] : '';\nvar h = String(result);\nvar bidM = h.match(/BookID\\s*=\\s*\"(\\d+)\"/);\nvar aidM = h.match(/ArticleID\\s*=\\s*\"(\\d+)\"/);\nvar bid = bidM ? bidM[1] : '';\nvar aid = aidM ? aidM[1] : '';\nfunction extractP(text) {\n    var out = '';\n    var pm = text.match(/<p>[\\s\\S]*?<\\/p>/g);\n    if (!pm || pm.length === 0) {\n        var dm = text.match(/document\\.write\\((['\"])([\\s\\S]*?)\\1\\)/);\n        if (dm) {\n            pm = dm[2].match(/<p>[\\s\\S]*?<\\/p>/g);\n        }\n    }\n    if (!pm) return '';\n    for (var i = 0; i < pm.length; i++) {\n        var t = pm[i].replace(/<[^>]+>/g, '').replace(/&nbsp;/g, ' ').trim();\n        if (t) out += t + '\\n';\n    }\n    return out;\n}\nvar allContent = '';\ntry {\n    var ps = org.jsoup.Jsoup.parse(h).select('.con p');\n    for (var i = 0; i < ps.size(); i++) {\n        var t = ps.get(i).text().trim();\n        if (t) allContent += t + '\\n';\n    }\n} catch (e1) { }\nif (bid && aid) {\n    for (var p = 2; p <= 15; p++) {\n        try {\n            var url = host + '/i/a.aspx?id=' + aid + '&p=' + p + '&bid=' + bid;\n            var opts = {\n                headers: {\n                    'Referer': base,\n                    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'\n                }\n            };\n            var resp = String(java.ajax(url + ',' + JSON.stringify(opts), 15000));\n            var got = extractP(resp);\n            if (!got) break;\n            allContent += got;\n        } catch(e2) {\n            break;\n        }\n    }\n}\nallContent.replace(/\\n+$/, '\\n');"}, "ruleExplore": {"author": "@css:.itemtxt p:eq(1) a@text##作者：", "bookList": "@css:.item", "bookUrl": "@css:.itemtxt h3 a@href", "coverUrl": "@css:.item a img@src", "kind": "p@span@text", "lastChapter": "@css:.itemtxt ul li:eq(0) a@text", "name": "@css:.itemtxt h3 a@text"}, "ruleSearch": {"author": "@css:.itemtxt p:eq(1) a@text##作者：", "bookList": "@css:.item", "bookUrl": "@css:.itemtxt h3 a@href", "checkKeyWord": "没钱修什么仙", "coverUrl": "@css:.item a img@src", "kind": "p@span@text", "lastChapter": "@css:.itemtxt ul li:eq(0) a@text", "name": "@css:.itemtxt h3 a@text"}, "ruleToc": {"chapterList": "@css:#list ul li", "chapterName": "@css:a@text", "chapterUrl": "@css:a@href", "nextTocUrl": "@css:#pages a.gr@href"}, "searchUrl": "<js>\nresult = getServerHost() + \"/i/sor.aspx?key=\" + encodeURIComponent(key);\n</js>", "weight": 0},{"bookSourceName": "搬山人", "bookSourceUrl": "https://www.banshanren.com", "bookSourceGroup": "小说", "bookSourceType": 0, "bookUrlPattern": "https?://www\\.banshanren\\.com/novel/[^/?#]+/?$", "enabled": true, "enabledExplore": true, "enabledCookieJar": true, "concurrentRate": "1/5000", "lastUpdateTime": "1791318668140", "bookSourceComment": "2026-10-07 五段预览检查版。提取前检查整张网页的data-code、验证码按钮和正文段数。发现访问限制或恰好5段时打开本章原网页，需手动完成网站验证后点右上角完成；直接使用浏览器返回的页面，不额外重请求。若仍受限或仍为5段则报错，不保存残缺章节（确实只有5段的真实短章也会触发此检查）。删除未经证实的下一章续页规则。请求UA与内置浏览器一致。导入覆盖后必须清除原书章节缓存再刷新。搜索、目录、分类沿用。封面未解密。已用Rhino/Jsoup验证提取及拦截逻辑；手机验证码流程需实测。", "header": "@js:JSON.stringify({\"User-Agent\":java.getWebViewUA(),\"Referer\":\"https://www.banshanren.com/\"})", "searchUrl": "/api/search?keyword={{java.encodeURI(key)}}&page={{page}}", "ruleSearch": {"bookList": "$.model.data[*]", "name": "$.title", "author": "$.authors", "bookUrl": "/novel/{{$.slug}}", "intro": "$.brief", "kind": "$.tagNames[*]", "wordCount": "$.wordCount", "lastChapter": "$.latestUpdate"}, "exploreUrl": "全部小说::/all/0-0-0-0-0-0-1-{{page}}/\n最近更新::/all/0-0-0-0-0-0-2-{{page}}/\n热门小说::/all/0-0-0-0-0-0-3-{{page}}/\n奇幻玄幻::/all/0-4-0-0-0-0-1-{{page}}/\n现代都市::/all/0-3-0-0-0-0-1-{{page}}/\n穿越重生::/all/0-7-0-0-0-0-1-{{page}}/\n武侠仙侠::/all/0-8-0-0-0-0-1-{{page}}/\nBG言情::/all/0-5-0-0-0-0-1-{{page}}/\nBL耽美::/all/0-1-0-0-0-0-1-{{page}}/\nGL百合::/all/0-2-0-0-0-0-1-{{page}}/", "ruleExplore": {"bookList": "@css:.main_box > .novel_list > li.novel_li", "name": "@css:a.title@text", "bookUrl": "@css:a.title@href", "author": "@css:.title_box > .info_box:last-of-type@text##\\s*·[\\s\\S]*$##", "wordCount": "@css:.title_box > .info_box:last-of-type@text##^[\\s\\S]*·\\s*##", "kind": "@css:.category_list a@text", "intro": "@css:.novel_intro_box@text"}, "ruleBookInfo": {"name": "@css:.novel_title_box h1@text", "author": "@css:.novel_title_box [title=作者]@text", "intro": "@css:meta[property=\"og:description\"]@content", "kind": "@css:.novel_title_box > .category_list a@text", "wordCount": "@css:.novel_summary_box.pc > div:last-child b@text", "tocUrl": "@js:baseUrl", "lastChapter": "@css:.catalog_top_box .hl@text"}, "ruleToc": {"chapterList": "@css:.chapter_list li.volume_chapter", "chapterName": "@css:a@text", "chapterUrl": "@css:a@href"}, "ruleContent": {"title": "@css:.chapter_content_box > h2@text", "content": "@js:var pageUrl = String(baseUrl);\nfunction inspectPage(markup) {\n    java.setContent(String(markup), pageUrl);\n    var documents = java.getElements('@css:html');\n    if (documents.size() === 0) throw new Error('没有取得网页，请刷新本章');\n    var doc = documents.get(0);\n    var chapterBox = doc.select('.chapter_box').first();\n    var contentBox = doc.select('.chapter_content_box').first();\n    var paragraphs = doc.select('.chapter_content_box > p');\n    var code = chapterBox === null ? '' : String(chapterBox.attr('data-code'));\n    var notice = String(contentBox === null ? doc.text() : contentBox.text()).replace(/\\s+/g, '');\n    var captcha = /系统检测到.{0,15}访问异常|输入验证码后可继续访问/.test(notice)\n        || doc.select('#captcha_btn,[onclick*=toggleCode]').size() > 0;\n    var restricted = code !== '' && code !== '0';\n    return {doc: doc, paragraphs: paragraphs, count: paragraphs.size(), code: code, captcha: captcha, restricted: restricted};\n}\nvar state = inspectPage(result);\njava.log('搬山人正文检查：段落=' + state.count + '，状态=' + state.code + '，验证提示=' + state.captcha);\nif (state.captcha || state.restricted || state.count === 5) {\n    if (typeof java.startBrowserAwait !== 'function') {\n        throw new Error('本章疑似受限预览（' + state.count + '段）。请在阅读内置浏览器打开本章原网页完成验证；当前版本不支持自动验证窗口。');\n    }\n    var verified = java.startBrowserAwait(pageUrl, '请验证并确认本章正文已完整显示，再点右上角完成', false);\n    if (verified === null) throw new Error('没有取得验证后的网页，请重新打开本章原网页');\n    state = inspectPage(String(verified.body()));\n    java.log('搬山人验证后检查：段落=' + state.count + '，状态=' + state.code + '，验证提示=' + state.captcha);\n    if (state.captcha || state.restricted) {\n        throw new Error('原网页仍限制本章访问（状态=' + state.code + '，' + state.count + '段）。请完成验证码或网站要求的登录后再试。');\n    }\n    if (state.count === 5) {\n        throw new Error('验证后的网页仍只有5段，已停止保存，避免再次缓存截断内容。请检查原网页是否完整；恰好5段的真实短章也会触发此检查。');\n    }\n}\nif (state.count === 0) throw new Error('网页未提供正文段落，请在原网页检查访问状态');\nvar clean = state.paragraphs.clone();\nclean.select('span[onclick^=togglePostComment],span[class*=count_]').remove();\nString(clean.outerHtml());\n"}, "loginUrl": "https://www.banshanren.com/"},{"bookSourceComment": "by艳阳 \n10.6 实现域名切换功能\nsudugu520更新有点慢，优先用suduguu", "bookSourceGroup": "通常书源", "bookSourceName": "速读谷′", "bookSourceType": 0, "bookSourceUrl": "https://www.suduguu.com/", "bookUrlPattern": "https?:\\/\\/(www\\.)?(shudugu\\.org|sudugu520\\.com|suduguu\\.com)\\/\\d+(\\/.*)?", "customButton": false, "customOrder": 4, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>\nvar host = getServerHost();\nvar cats = [\n    {title: \"完结小说\", url: host + '/wanjie/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"都市小说\", url: host + '/dushi/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"玄幻小说\", url: host + '/xuanhuan/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"轻小说\", url: host + '/qing/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"仙侠小说\", url: host + '/xianxia/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"历史小说\", url: host + '/lishi/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"科幻小说\", url: host + '/kehuan/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"诸天无限\", url: host + '/zhutianwuxian/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"游戏小说\", url: host + '/youxi/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"奇幻小说\", url: host + '/qihuan/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"悬疑小说\", url: host + '/xuanyi/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"体育小说\", url: host + '/tiyu/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"官场小说\", url: host + '/guanchang/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"军事小说\", url: host + '/junshi/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"武侠小说\", url: host + '/wuxia/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"乡村小说\", url: host + '/xiangcun/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"现实小说\", url: host + '/xianshi/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"言情小说\", url: host + '/yanqing/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"最新更新\", url: host + '/zuixin/{{page == 1 ? \"\" : page + \".html\"}}', style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}}\n];\nJSON.stringify(cats);\n</js>", "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\"}", "jsLib": "var hosts = [\n    \"https://www.suduguu.com\",\n    \"https://shudugu.org\",\n    \"https://sudugu520.com\"\n];\n\nfunction getHosts() {\n    return hosts;\n}\n\nfunction getServerHost() {\n    var source = this.source;\n    try {\n        var config = JSON.parse(source.getVariable());\n        if (config && config[0] && config[0].host) {\n            return config[0].host;\n        }\n        return getHosts()[0];\n    } catch (e) {\n        return getHosts()[0];\n    }\n}\n\nfunction getConfig() {\n    var source = this.source;\n    try {\n        var configStr = source.getVariable();\n        if (!configStr || configStr.trim() === \"\") {\n            return { host: getHosts()[0] };\n        }\n        var config = JSON.parse(configStr);\n        if (!config || !config.join || config.length === 0) {\n            return { host: getHosts()[0] };\n        }\n        return config[0] || { host: getHosts()[0] };\n    } catch (e) {\n        return { host: getHosts()[0] };\n    }\n}\n\nfunction setConfig(key, value) {\n    var source = this.source;\n    try {\n        var config = getConfig.call(this);\n        config[key] = value;\n        source.setVariable(JSON.stringify([config]));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\n\nfunction setConfigs(obj) {\n    var source = this.source;\n    try {\n        var config = getConfig.call(this);\n        for (var k in obj) {\n            if (obj.hasOwnProperty(k)) {\n                config[k] = obj[k];\n            }\n        }\n        source.setVariable(JSON.stringify([config]));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\n\n// ===== 连通检测：Java TCP Socket直连 =====\n// 检测超时固定5000毫秒\nfunction checkConnectivity(host) {\n    var timeout = 5000;\n    var socket = null;\n    try {\n        var start = new Date().getTime();\n        var jUrl = new Packages.java.net.URL(host);\n        var hostname = jUrl.getHost();\n        var port = jUrl.getPort();\n        if (port === -1) { port = jUrl.getDefaultPort(); }\n        socket = new Packages.java.net.Socket();\n        var addr = new Packages.java.net.InetSocketAddress(hostname, port);\n        socket.connect(addr, timeout);\n        var latency = new Date().getTime() - start;\n        return {ok: true, latency: latency};\n    } catch (e) {\n        return {ok: false, latency: -1, err: String(e)};\n    } finally {\n        try { if (socket !== null) { socket.close(); } } catch (e2) {}\n    }\n}\n\nfunction autoSelectHost() {\n    var allHosts = getHosts();\n    var details = [];\n    var best = null;\n    for (var i = 0; i < allHosts.length; i++) {\n        var r = checkConnectivity.call(this, allHosts[i]);\n        r.host = allHosts[i];\n        details.push(r);\n        if (r.ok && best === null) { best = allHosts[i]; }\n    }\n    if (best !== null) {\n        setConfig.call(this, 'host', best);\n    }\n    return {success: best !== null, host: best, details: details};\n}\n", "lastUpdateTime": "1791289144237", "loginUi": "[{\"name\": \"🔄 切换域名\", \"type\": \"button\", \"action\": \"sethost()\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}}, {\"name\": \"🔍 自动选可用\", \"type\": \"button\", \"action\": \"autohost()\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}}, {\"name\": \"📋 当前域名\", \"type\": \"button\", \"action\": \"checkhost()\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}}, {\"name\": \"📶 域名延迟\", \"type\": \"button\", \"action\": \"pinghost()\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}}]", "loginUrl": "this.sethost = function() {\n    try {\n        var currentHost = getConfig.call(this).host || getHosts()[0];\n        var currentIndex = getHosts().indexOf(currentHost);\n        var newIndex = (currentIndex + 1) % getHosts().length;\n        var newHost = getHosts()[newIndex];\n        setConfig.call(this, 'host', newHost);\n        java.toast(\"\\n已切换到：\\n\" + newHost + \"\\n刷新发现页生效\");\n    } catch(e) {\n        setConfig.call(this, 'host', getHosts()[0]);\n        java.toast(\"\\n已初始化：\" + getHosts()[0]);\n    }\n};\n\nthis.checkhost = function() {\n    try {\n        var currentHost = getServerHost();\n        java.toast(\"\\n当前服务器：\\n\" + currentHost);\n    } catch(e) {\n        java.toast(\"获取失败\");\n    }\n};\n\nthis.autohost = function() {\n    try {\n        java.toast(\"\\n正在检测，请稍候...\");\n        var result = autoSelectHost.call(this);\n        var msg = \"\";\n        for (var i = 0; i < result.details.length; i++) {\n            var d = result.details[i];\n            var shortName = d.host.replace(\"https://\",\"\").replace(\"http://\",\"\");\n            if (d.ok) {\n                msg += \"\\n✓ \" + shortName + \"  \" + d.latency + \"ms\";\n            } else {\n                msg += \"\\n✗ \" + shortName + \"  不可达\";\n            }\n        }\n        if (result.success) {\n            msg += \"\\n\\n已选中：\" + result.host.replace(\"https://\",\"\");\n        } else {\n            msg += \"\\n\\n全部不可达\";\n        }\n        java.toast(msg);\n    } catch(e) {\n        java.toast(\"检测异常：\" + String(e));\n    }\n};\n\n// 检测当前正在使用域名的延迟\nthis.pinghost = function() {\n    try {\n        var currentHost = getServerHost();\n        var r = checkConnectivity.call(this, currentHost);\n        var shortName = currentHost.replace(\"https://\",\"\").replace(\"http://\",\"\");\n        if (r.ok) {\n            java.toast(\"\\n当前域名：\\n\" + shortName + \"\\n延迟：\" + r.latency + \"ms\");\n        } else {\n            java.toast(\"\\n当前域名：\\n\" + shortName + \"\\n连接失败\");\n        }\n    } catch(e) {\n        java.toast(\"检测异常：\" + String(e));\n    }\n};\n", "respondTime": 180000, "ruleBookInfo": {"author": "@css:.itemtxt p:eq(1) a@text##作者：", "coverUrl": "@css:.item a img@src", "intro": "class.des.0@text", "kind": "@css:.itemtxt p:eq(0) span:eq(1)@text", "lastChapter": "@css:.itemtxt ul li:eq(0) a@text", "name": "@css:.itemtxt h1 a@text", "tocUrl": "", "wordCount": "@css:.itemtxt h1 i@text"}, "ruleContent": {"content": "@css:.con p@text", "nextContentUrl": "@css:.prenext span:eq(2) a@href", "sourceRegex": "", "webJs": ""}, "ruleExplore": {"author": "@css:.itemtxt p:eq(1) a@text##作者：", "bookList": "@css:.item", "bookUrl": "@css:.itemtxt h3 a@href", "coverUrl": "@css:.item a img@src", "intro": "", "kind": "p@span@text", "lastChapter": "@css:.itemtxt ul li:eq(0) a@text", "name": "@css:.itemtxt h3 a@text"}, "ruleSearch": {"author": "@css:.itemtxt p:eq(1) a@text##作者：", "bookList": "@css:.item", "bookUrl": "@css:.itemtxt h3 a@href", "checkKeyWord": "没钱修什么仙", "coverUrl": "@css:.item a img@src", "intro": "", "kind": "p@span@text", "lastChapter": "@css:.itemtxt ul li:eq(0) a@text", "name": "@css:.itemtxt h3 a@text", "wordCount": ""}, "ruleToc": {"chapterList": "@css:#list ul li", "chapterName": "@css:a@text", "chapterUrl": "@css:a@href", "isVip": "", "nextTocUrl": "@css:#pages a.gr@href", "updateTime": ""}, "searchUrl": "<js>\nresult = getServerHost() + \"/i/sor.aspx?key=\" + encodeURIComponent(key);\n</js>", "weight": 0},{"bookSourceComment": "作者：纳兰容若\n74小说网 · 目录AES密钥动态抓取+按章号排序版", "bookSourceGroup": "自制", "bookSourceName": "74小说网", "bookSourceType": 0, "bookSourceUrl": "https://www.74xswz.com", "concurrentRate": "500", "customButton": false, "customOrder": 13, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "玄幻::/list-4/{{page}}.html\n奇幻::/list-5/{{page}}.html\n武侠::/list-6/{{page}}.html\n仙侠::/list-7/{{page}}.html\n历史::/list-10/{{page}}.html\n游戏::/list-11/{{page}}.html\n科幻::/list-13/{{page}}.html\n诸天无限::/list-14/{{page}}.html\n悬疑::/list-15/{{page}}.html\n现代言情::/list-18/{{page}}.html\n玄幻言情::/list-20/{{page}}.html\n衍生同人::/list-27/{{page}}.html", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1791218847196", "respondTime": 30000, "ruleBookInfo": {"author": ".author a@text", "coverUrl": ".pic img@src", "intro": ".intro.font14@text", "kind": ".label a span@text", "lastChapter": ".direList.font16 ul li.0 .name a@text", "name": "h1@text"}, "ruleContent": {"content": "#content@html||.content@html", "nextContentUrl": "text.下一页@href"}, "ruleExplore": [], "ruleSearch": {"author": ".book-card__meta-item.0@text##作者：", "bookList": "<js>\nvar resp = \"\";\nvar base = String(baseUrl);\nvar kw = \"\";\nvar km = base.match(/[?&]kw=([^&]*)/);\nif (km) { try { kw = decodeURIComponent(km[1]); } catch (e) { kw = km[1]; } }\nvar html = String(result);\nvar tm = html.match(/name=\"_t\"\\s+value=\"([^\"]+)\"/);\nvar token = tm ? tm[1] : \"\";\nvar sm = html.match(/src=\"(\\/\\?action=signJs[^\"]*)\"/);\nvar signUrl = sm ? sm[1] : \"\";\nif (kw && token && signUrl) {\n  var signJs = String(java.ajax(\"https://www.rrssk.com\" + signUrl, 10000));\n  var m1 = /if\\s*\\(\\s*typeof\\s+(\\w+)\\s*!==\\s*\"number\"\\s*\\|\\|\\s*\\1\\s*!==\\s*(\\d+)\\s*\\)/.exec(signJs);\n  var m2 = /if\\s*\\(\\s*(\\w+)\\s*!==\\s*1\\s*\\)/.exec(signJs);\n  if (m1 && m2) {\n    var sv = m1[1], th = m1[2], tv = m2[1];\n    var code = signJs.replace(new RegExp(\"var\\\\s+\"+sv+\"\\\\s*=\\\\s*0\\\\s*;\",\"g\"), \"var \"+sv+\"=\"+th+\";\")\n      .replace(new RegExp(sv+\"\\\\s*\\\\+=\\\\s*[^;]*;\",\"g\"), \"\")\n      .replace(new RegExp(\"var\\\\s+\"+tv+\"\\\\s*=\\\\s*0\\\\s*;\",\"g\"), \"var \"+tv+\"=1;\");\n    var window = {addEventListener: function(){}, location: {href: \"https://www.rrssk.com/003Q.html\"}};\n    try { eval(code); } catch (e) { }\n    if (window.__SIGN) {\n      var ts = Math.floor(new Date().getTime() / 1000);\n      var enc = encodeURIComponent(kw).replace(/[!'()*]/g, function(c){return \"%\"+c.charCodeAt(0).toString(16).toUpperCase();});\n      var sig = String(window.__SIGN.f(enc, token, ts));\n      if (sig !== \"00000000\") {\n        var body = \"keyword=\" + encodeURIComponent(kw) + \"&_t=\" + token + \"&_ts=\" + ts + \"&_s=\" + sig;\n        resp = String(java.ajax(\"https://www.rrssk.com/?action=search,\" + JSON.stringify({method:\"POST\", body:body, header:{\"Referer\":\"https://www.rrssk.com/003Q.html\", \"Content-Type\":\"application/x-www-form-urlencoded\"}}), 20000));\n      }\n    }\n  }\n}\nresp;\n</js>class.book-card", "bookUrl": "<js>\nvar oc = String(result.attr(\"onclick\"));\nvar m = oc.match(/[?&]t=([^&']+)/);\nvar u = m ? m[1] : \"\";\ntry { u = decodeURIComponent(u); } catch (e) { }\nvar s = u.replace(/-/g, \"+\").replace(/_/g, \"/\");\nwhile (s.length % 4 != 0) { s += \"=\"; }\ntry { u = String(java.base64Decode(s)); } catch (e) { }\nu;\n</js>", "coverUrl": ".book-card__cover img@src", "intro": ".book-card__desc@text", "kind": ".book-card__meta-item.1@text##分类：", "name": ".book-card__title@text"}, "ruleToc": {"chapterList": "<js>\nvar html = String(result);\nvar arr = [];\n\n// ---- 1. 抓 aid ----\nvar aid = \"\";\nvar am = html.match(/data-aid\\s*=\\s*[\"']([^\"']+)[\"']/);\nif (am) aid = am[1];\nif (!aid) { var am2 = html.match(/articleid\\s*=\\s*[\"']([^\"']+)[\"']/); if (am2) aid = am2[1]; }\njava.log('TOC aid=' + aid);\n\n// ---- 2. 抓随机名 JS，提取新 key / iv ----\nvar key = \"9Ug2kRcmX9MxFyRR0lbX4OayTqgVtsQ2\";\nvar iv  = \"7011822584532415\";\nvar jm = html.match(/\\/templates\\/js\\/([A-Za-z0-9]{16,})\\.js/);\nif (jm) {\n  var jsUrl = \"https://www.74xswz.com/templates/js/\" + jm[1] + \".js\";\n  try {\n    var js = String(java.ajax(jsUrl, 15000));\n    var km = js.match(/new\\s+AESCrypt\\s*\\(\\s*[\"']([A-Za-z0-9+/=]{16,64})[\"']\\s*\\)/);\n    if (km) key = km[1];\n    var im = js.match(/iv\\s*[:=]\\s*CryptoJS\\.enc\\.Utf8\\.parse\\s*\\(\\s*[\"']([^\"']{16})[\"']\\s*\\)/);\n    if (im) iv = im[1];\n  } catch (e) { java.log('TOC jsERR=' + e); }\n}\njava.log('TOC key=' + key + ' iv=' + iv);\n\n// ---- 3. 抓总页数 ----\nvar pages = 1;\nvar re = /<option[^>]*value=\"(\\d+)\"[^>]*>/g, mm;\nwhile ((mm = re.exec(html)) !== null) {\n  var p = parseInt(mm[1], 10);\n  if (p > pages) pages = p;\n}\n\n// ---- 4. AES 分页 → 收集到数组 ----\nif (aid && pages > 0) {\n  try {\n    var cipher = java.createSymmetricCrypto(\"AES/CBC/PKCS5Padding\", key, iv);\n    for (var p = 1; p <= pages; p++) {\n      try {\n        var enc = cipher.encryptBase64(JSON.stringify({id: aid, page: p}));\n        var body = \"data=\" + java.encodeURI(enc);\n        var res = String(java.ajax(\"https://www.74xswz.com/index.php?action=loadChapterPage,\" + JSON.stringify({method:\"POST\", body:body, header:{\"Content-Type\":\"application/x-www-form-urlencoded\", \"Referer\": String(baseUrl)}}), 20000));\n        var jo = JSON.parse(res);\n        if (jo && jo.code == 0 && jo.data) {\n          for (var k = 0; k < jo.data.length; k++) {\n            arr.push({url: jo.data[k].chapterurl, name: jo.data[k].chaptername});\n          }\n        }\n      } catch (e) { java.log('TOC P' + p + ' err=' + e); }\n    }\n  } catch (e) { java.log('TOC cipher err=' + e); }\n}\n\n// ---- 5. 按 URL 中的章节序号升序排序 ----\narr.sort(function(a, b) {\n  var na = 0, nb = 0;\n  var ma = String(a.url).match(/-(\\d+)\\.html/);\n  var mb = String(b.url).match(/-(\\d+)\\.html/);\n  if (ma) na = parseInt(ma[1], 10);\n  if (mb) nb = parseInt(mb[1], 10);\n  return na - nb;\n});\njava.log('TOC sorted first=' + (arr[0] ? arr[0].name : '') + ' last=' + (arr[arr.length-1] ? arr[arr.length-1].name : ''));\n\n// ---- 6. 拼 HTML ----\nvar all = \"\";\nfor (var i = 0; i < arr.length; i++) {\n  all += '<a href=\"' + arr[i].url + '\">' + arr[i].name + '</a>';\n}\n\n// ---- 7. 兜底 ----\nif (all.length == 0) {\n  var doc = java.getElement('.direList.listData') || java.getElement('.listData') || java.getElement('.direList');\n  if (doc) {\n    var as = doc.select('a');\n    for (var i = 0; i < as.size(); i++) {\n      all += '<a href=\"' + as.get(i).attr('href') + '\">' + as.get(i).text() + '</a>';\n    }\n  }\n}\nall;\n</js>a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "https://www.rrssk.com/003Q.html?kw={{key}}&page={{page}}", "weight": 0},{"bookSourceComment": "作者：纳兰容若\n74小说网 ", "bookSourceGroup": "自制", "bookSourceName": "74小说网", "bookSourceType": 0, "bookSourceUrl": "https://www.74xswz.com", "concurrentRate": "500", "customButton": false, "customOrder": 13, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "玄幻::/list-4/{{page}}.html\n奇幻::/list-5/{{page}}.html\n武侠::/list-6/{{page}}.html\n仙侠::/list-7/{{page}}.html\n历史::/list-10/{{page}}.html\n游戏::/list-11/{{page}}.html\n科幻::/list-13/{{page}}.html\n诸天无限::/list-14/{{page}}.html\n悬疑::/list-15/{{page}}.html\n现代言情::/list-18/{{page}}.html\n玄幻言情::/list-20/{{page}}.html\n衍生同人::/list-27/{{page}}.html", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1791209447341", "respondTime": 180000, "ruleBookInfo": {"author": ".author a@text", "coverUrl": ".pic img@src", "intro": ".intro.font14@text", "kind": ".label a span@text", "lastChapter": ".direList.font16 ul li.0 .name a@text", "name": "h1@text"}, "ruleContent": {"content": "#content@html||.content@html", "nextContentUrl": "text.下一页@href"}, "ruleExplore": [], "ruleSearch": {"author": ".book-card__meta-item.0@text##作者：", "bookList": "<js>\nvar resp = \"\";\nvar base = String(baseUrl);\nvar kw = \"\";\nvar km = base.match(/[?&]kw=([^&]*)/);\nif (km) { try { kw = decodeURIComponent(km[1]); } catch (e) { kw = km[1]; } }\nvar html = String(result);\nvar tm = html.match(/name=\"_t\"\\s+value=\"([^\"]+)\"/);\nvar token = tm ? tm[1] : \"\";\nvar sm = html.match(/src=\"(\\/\\?action=signJs[^\"]*)\"/);\nvar signUrl = sm ? sm[1] : \"\";\nif (kw && token && signUrl) {\n  var signJs = String(java.ajax(\"https://www.rrssk.com\" + signUrl, 10000));\n  var m1 = /if\\s*\\(\\s*typeof\\s+(\\w+)\\s*!==\\s*\"number\"\\s*\\|\\|\\s*\\1\\s*!==\\s*(\\d+)\\s*\\)/.exec(signJs);\n  var m2 = /if\\s*\\(\\s*(\\w+)\\s*!==\\s*1\\s*\\)/.exec(signJs);\n  if (m1 && m2) {\n    var sv = m1[1], th = m1[2], tv = m2[1];\n    var code = signJs.replace(new RegExp(\"var\\\\s+\"+sv+\"\\\\s*=\\\\s*0\\\\s*;\",\"g\"), \"var \"+sv+\"=\"+th+\";\")\n      .replace(new RegExp(sv+\"\\\\s*\\\\+=\\\\s*[^;]*;\",\"g\"), \"\")\n      .replace(new RegExp(\"var\\\\s+\"+tv+\"\\\\s*=\\\\s*0\\\\s*;\",\"g\"), \"var \"+tv+\"=1;\");\n    var window = {addEventListener: function(){}, location: {href: \"https://www.rrssk.com/003Q.html\"}};\n    try { eval(code); } catch (e) { }\n    if (window.__SIGN) {\n      var ts = Math.floor(new Date().getTime() / 1000);\n      var enc = encodeURIComponent(kw).replace(/[!'()*]/g, function(c){return \"%\"+c.charCodeAt(0).toString(16).toUpperCase();});\n      var sig = String(window.__SIGN.f(enc, token, ts));\n      if (sig !== \"00000000\") {\n        var body = \"keyword=\" + encodeURIComponent(kw) + \"&_t=\" + token + \"&_ts=\" + ts + \"&_s=\" + sig;\n        resp = String(java.ajax(\"https://www.rrssk.com/?action=search,\" + JSON.stringify({method:\"POST\", body:body, header:{\"Referer\":\"https://www.rrssk.com/003Q.html\", \"Content-Type\":\"application/x-www-form-urlencoded\"}}), 20000));\n      }\n    }\n  }\n}\nresp;\n</js>class.book-card", "bookUrl": "<js>\nvar oc = String(result.attr(\"onclick\"));\nvar m = oc.match(/[?&]t=([^&']+)/);\nvar u = m ? m[1] : \"\";\ntry { u = decodeURIComponent(u); } catch (e) { }\nvar s = u.replace(/-/g, \"+\").replace(/_/g, \"/\");\nwhile (s.length % 4 != 0) { s += \"=\"; }\ntry { u = String(java.base64Decode(s)); } catch (e) { }\nu;\n</js>", "coverUrl": ".book-card__cover img@src", "intro": ".book-card__desc@text", "kind": ".book-card__meta-item.1@text##分类：", "name": ".book-card__title@text"}, "ruleToc": {"chapterList": "<js>\nvar html = String(result);\nvar am = html.match(/articleid\\s*=\\s*[\"']([^\"']+)[\"']/);\nvar aid = am ? am[1] : \"\";\nvar pages = 0;\nvar re = /<option[^>]*value=\"(\\d+)\"[^>]*>([^<]*)<\\/option>/g, mm;\nwhile ((mm = re.exec(html)) !== null) {\n  var p = parseInt(mm[1], 10);\n  if (p > pages) pages = p;\n}\nvar all = \"\";\nif (aid && pages > 0) {\n  var cipher = java.createSymmetricCrypto(\"AES/CBC/PKCS5Padding\", \"9Ug2kRcmX9MxFyRR0lbX4OayTqgVtsQ2\", \"7011822584532415\");\n  for (var p = 1; p <= pages; p++) {\n    try {\n      var enc = cipher.encryptBase64(JSON.stringify({id: aid, page: p}));\n      var body = \"data=\" + java.encodeURI(enc);\n      var res = String(java.ajax(\"https://www.74xswz.com/index.php?action=loadChapterPage,\" + JSON.stringify({method:\"POST\", body:body, header:{\"Content-Type\":\"application/x-www-form-urlencoded\", \"Referer\": String(baseUrl)}}), 20000));\n      var jo = JSON.parse(res);\n      if (jo && jo.code == 0 && jo.data) {\n        for (var k = 0; k < jo.data.length; k++) {\n          all += '<a href=\"' + jo.data[k].chapterurl + '\">' + jo.data[k].chaptername + '</a>';\n        }\n      }\n    } catch (e) { }\n  }\n}\nif (all.length == 0) {\n  var doc = java.getElement('.direList.listData');\n  if (!doc) doc = java.getElement('.listData');\n  if (!doc) doc = java.getElement('.direList');\n  if (doc) {\n    var as = doc.select('a');\n    for (var i = 0; i < as.size(); i++) {\n      all += '<a href=\"' + as.get(i).attr('href') + '\">' + as.get(i).text() + '</a>';\n    }\n  }\n}\nall;\n</js>a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "https://www.rrssk.com/003Q.html?kw={{key}}&page={{page}}", "weight": 0},{"bookSourceComment": "作者：姚浅书", "bookSourceGroup": "自制", "bookSourceName": "小原文学网(搜索修复)", "bookSourceType": 0, "bookSourceUrl": "https://www.min-yuan.com", "bookUrlPattern": "https://(www\\.)?min-yuan\\.com/txt/.+", "concurrentRate": "0", "customButton": false, "customOrder": 2, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "首页::https://www.min-yuan.com/\n玄幻::https://www.min-yuan.com/xuanhuan/\n武侠::https://www.min-yuan.com/wuxia/\n都市::https://www.min-yuan.com/dushi/\n历史::https://www.min-yuan.com/lishi/\n科幻::https://www.min-yuan.com/kehuan/\n游戏::https://www.min-yuan.com/youxi/\n女生::https://www.min-yuan.com/nvsheng/\n其他::https://www.min-yuan.com/qita/", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 12; OXF-AN00 Build/HUAWEIOXF-AN00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/114.0.5735.196 Mobile Safari/537.36\",\n  \"Accept-Language\": \"zh-CN,zh;q=0.9,en;q=0.8\",\n  \"Referer\": \"https://www.min-yuan.com/\"\n}", "lastUpdateTime": "1791198672582", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=og:novel:author]@content||#info p@text##作者：||text.作者@p@text##作者：", "coverUrl": "id.fmimg@tag.img@data-original##^/##https://www.min-yuan.com/||meta[property=og:image]@content##^/##https://www.min-yuan.com/", "intro": "id.intro@text||meta[property=og:description]@content##<[^>]+>", "kind": "meta[property=og:novel:category]@content||.con_top a.1@text", "lastChapter": "meta[property=og:novel:latest_chapter_name]@content||.hidden-xs@text##最新章节：", "name": "meta[property=og:novel:book_name]@content||meta[property=og:title]@content||#info h1@text||img@alt"}, "ruleContent": {"content": "id.booktxt@html", "nextContentUrl": "a[rel=\"next\"]@href##^(?!.+_\\d+\\.html$).*$##", "title": "class.con_top@tag.h1@text"}, "ruleExplore": {"author": "div.btm@text||span.s5@text||i@text", "bookList": "#main .hotcontent .item, #main .hotcontent .m6-843z-re00-3r5a, #main .novelslist .m6-slli-37oy-gi71, #main .rank .item", "bookUrl": "a[title]@href", "coverUrl": "img@data-original", "intro": "dd@text", "kind": ".s1@text", "name": "a[title]@title"}, "ruleSearch": {"author": ".s4@text||p@text##作者：", "bookList": ".hotcontent .item||.novelslist2 li||dl", "bookUrl": "a@href", "coverUrl": "img@data-original", "intro": "dd@text||p@text", "kind": "span@text", "name": "a@title||h3@text||a@text"}, "ruleToc": {"chapterList": "id.newlist@tag.a", "chapterName": "@title", "chapterUrl": "href"}, "searchUrl": "@js:\nvar U = 'https://www.min-yuan.com';\ntry { cookie.removeCookie(U) } catch(e) {}\ntry { java.ajax(U) } catch(e) {}\nvar options = {\n    method: 'POST',\n    body: 'searchkey=' + java.encodeURI(key),\n    headers: {\n        'Content-Type': 'application/x-www-form-urlencoded',\n        'Referer': U + '/'\n    }\n};\nU + '/search/,' + JSON.stringify(options)", "weight": 0},{"bookSourceName": "篱笆好文学m站", "bookSourceGroup": "网页源", "bookSourceComment": "域名https://m.libahao2.com/，搜索使用POST表单，必须手机UA", "bookSourceType": 0, "bookSourceUrl": "https://m.libahao2.com/", "enabled": true, "enabledCookieJar": true, "enabledExplore": false, "httpUserAgent": "Mozilla/5.0 (Linux; Android 14; Mobile) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36", "searchUrl": "https://m.libahao2.com/search.php@post->keyword={{key}}", "ruleSearch": {"bookList": ".search-item", "name": ".book-title a", "author": ".book-author", "coverUrl": ".book-img img@src", "intro": ".book-desc", "bookUrl": ".book-title a@href"}, "ruleBookInfo": {"name": ".book-name", "author": ".book-author", "coverUrl": ".book-cover img@src", "intro": ".book-intro", "tocUrl": "#readBtn@href"}, "ruleToc": {"chapterList": ".chapter-item", "chapterName": "a", "chapterUrl": "a@href"}, "ruleContent": {"content": "#chapter-content", "replaceRegex": [{"regex": "&nbsp;|记住本书首发域名.*|篱笆好文学.*", "replacement": ""}]}, "lastUpdateTime": "1791194118392"},{"bookSourceComment": "📖 🄼黄金屋 | huangjinwu.org \nby 酷安陳零", "bookSourceGroup": "自制", "bookSourceName": "🄼黄金屋 -", "bookSourceType": 0, "bookSourceUrl": "https://www.huangjinwu.org/", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:s=[];push=(a,b,d)=>s.push({title:a,url:b,style:{layout_flexBasisPercent:1/d-.05,layout_flexGrow:1}});push(\"排行榜\",null,1);[[\"总点击\",\"allvisit\"],[\"月点击\",\"monthvisit\"],[\"周点击\",\"weekvisit\"],[\"总推荐\",\"allvote\"],[\"月推荐\",\"monthvote\"],[\"周推荐\",\"weekvote\"],[\"收藏榜\",\"goodnum\"],[\"字数榜\",\"size\"],[\"新书榜\",\"postdate\"]].map(([s,r])=>push(s,`/rank/${r}/{{page}}.html`,3));push(\"分类\",null,1);[\"玄幻小说\",\"仙侠小说\",\"都市小说\",\"历史小说\",\"网游小说\",\"科幻小说\",\"灵异小说\",\"言情小说\",\"其他小说\"].map((s,i)=>push(s,`/list/${i+1}/{{page}}.html`,3));push(\"标签\",null,1);[[\"生活\",\"16\"],[\"废土\",\"13162\"],[\"空间\",\"83\"],[\"修仙\",\"37\"],[\"高武\",\"82\"],[\"科幻\",\"39\"],[\"重生\",\"46\"],[\"娱乐\",\"41\"],[\"东方\",\"2\"],[\"诸天\",\"17\"],[\"言情\",\"56\"],[\"穿越\",\"4\"],[\"玄幻\",\"1\"],[\"系统流\",\"112\"],[\"末世\",\"49\"],[\"都市\",\"7\"],[\"异界\",\"15\"],[\"世界\",\"76\"],[\"仙侠\",\"23\"],[\"游戏\",\"14\"]].map(([s,r])=>push(s,`/tag/${r}/{{page}}.html`,4));JSON.stringify(s);", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Mobile Safari/537.36\"}", "jsLib": "var HJ_B='https://www.huangjinwu.org';\n// 挑战页检测+过盾：挑战JS仅种 __sc_clearance=1(1800s) 后刷新，无计算 → 种cookie重抓即可\nfunction hjPass(h, url){\n try{\n h=String(h==null?'':h);\n if(h.indexOf('__sc_clearance')>=0||h.indexOf('正在检查您的浏览器')>=0){\n try{cookie.setCookie(url,'__sc_clearance=1')}catch(e0){}\n try{cookie.setCookie(HJ_B,'__sc_clearance=1')}catch(e0b){}\n var h2='';\n try{h2=String(java.ajax(url))}catch(e1){}\n return h2===''?h:h2;\n }\n }catch(e){}\n return h;\n}", "lastUpdateTime": "1791191950582", "respondTime": 180000, "ruleBookInfo": {"author": "@js:JSON.parse(result).author", "coverUrl": "@js:JSON.parse(result).coverUrl", "init": "<js>\n(function(){\nvar h=String(result==null?'':result);\nvar re=/property=\"(og[^\"]*)\"\\s+content=\"([^\"]*)\"/g,mm,ogm={};\nwhile((mm=re.exec(h))!==null){if(!ogm[mm[1]])ogm[mm[1]]=mm[2]}\nfunction og(k){return ogm['og:novel:'+k]||ogm['og:'+k]||''}\nvar name=og('book_name'),author=og('author'),cat=og('category'),st=og('status');\nvar upd=og('update_time'),last=og('latest_chapter_name'),intro=og('description');\nvar cover=ogm['og:image']||'';\ntry{\n source.put('hjName',name);source.put('hjAuthor',author);source.put('hjCover',cover);\n source.put('hjIntro',intro);source.put('hjUpd',upd);source.put('hjLast',last);\n source.put('hjKind',cat);source.put('hjStatus',st);\n}catch(e0){}\nreturn JSON.stringify({'name':name,'author':author,'kind':cat+(st?'·'+st:''),'coverUrl':cover,'lastChapter':last});\n})()\n</js>", "intro": "<useweb>\n<div style=\"background:linear-gradient(135deg,#db2777 0%,#f472b6 60%,#fbcfe8 100%);padding:22px 16px 90px;text-align:center;\">\n <div style=\"width:64px;height:64px;margin:0 auto 10px;border-radius:50%;background:rgba(255,255,255,0.25);display:flex;align-items:center;justify-content:center;font-size:30px;\">📖</div>\n <div style=\"font-size:20px;font-weight:700;color:#fff;letter-spacing:1px;\">{{source.get('hjName')}}</div>\n <div style=\"margin-top:6px;font-size:13px;color:rgba(255,255,255,0.92);\">文 · 黄金屋</div>\n</div>\n<div style=\"margin:-70px 12px 0;background:#fff;border-radius:14px;box-shadow:0 3px 14px rgba(219,39,119,0.18);padding:14px;position:relative;\">\n <div style=\"display:flex;align-items:flex-start;gap:12px;\">\n <img src=\"{{source.get('hjCover')}}\" style=\"width:96px;border-radius:8px;box-shadow:0 2px 8px rgba(157,23,77,0.25);\" onerror=\"this.style.display='none'\"/>\n <div style=\"flex:1;min-width:0;\">\n <div style=\"font-size:16px;font-weight:700;color:#9d174d;margin-bottom:6px;\">{{source.get('hjName')}}</div>\n <div style=\"font-size:12px;color:#6b7280;margin-bottom:4px;\">✍️ {{source.get('hjAuthor')}}</div>\n <div style=\"margin-bottom:4px;\"><span style=\"display:inline-block;background:#fce7f3;color:#be185d;font-size:11px;padding:2px 8px;border-radius:10px;\">{{source.get('hjKind')}}</span><span style=\"display:inline-block;background:#fce7f3;color:#be185d;font-size:11px;padding:2px 8px;border-radius:10px;margin-left:6px;\">{{source.get('hjStatus')}}</span></div>\n <div style=\"font-size:11px;color:#db2777;background:#fdf2f8;border-left:3px solid #f472b6;padding:5px 8px;border-radius:0 8px 8px 0;\">🕐 更新：{{source.get('hjUpd')}}<br/>🔔 最新：{{source.get('hjLast')}}</div>\n </div>\n </div>\n</div>\n<div style=\"margin:12px;background:#fff;border-radius:14px;box-shadow:0 3px 14px rgba(219,39,119,0.12);padding:14px;\">\n <div style=\"font-size:14px;font-weight:700;color:#9d174d;margin-bottom:8px;\">💌 简介</div>\n <div style=\"font-size:13px;color:#4b5563;line-height:1.8;\">{{source.get('hjIntro') || '暂无简介'}}</div>\n</div>\n<div style=\"text-align:center;font-size:11px;color:#f9a8d4;padding:6px 0 18px;\">— 黄金屋 · 阅读真源 —</div>\n</useweb>", "kind": "@js:JSON.parse(result).kind", "lastChapter": "@js:JSON.parse(result).lastChapter", "name": "@js:JSON.parse(result).name"}, "ruleContent": {"content": "#readerContent@p@text", "nextContentUrl": "small@text##(\\d+)\\)$##$1###\n<js>\nArray.from(\n { length: Number(result[0]) - 1 },\n (_, i) => baseUrl.replace(/\\/?$/g, '/' + (i + 2) + '.html')\n)\n</js>"}, "ruleExplore": [], "ruleSearch": {"author": "@js:JSON.parse(result).author", "bookList": "<js>\n(function(){\nvar S=function(x){try{return String(x==null?'':x)}catch(e){return ''}};\nvar h=S(result);\nvar chal=h.indexOf('__sc_clearance')>=0||h.indexOf('正在检查您的浏览器')>=0;\nif(chal){\n try{cookie.setCookie(baseUrl,'__sc_clearance=1')}catch(e0){}\n var h2=S(java.ajax(baseUrl));\n if(h2!=='')h=h2;\n}\nvar doc=org.jsoup.Jsoup.parse(h,'https://www.huangjinwu.org/');\nvar es=doc.select('a.book-card[href^=/novel]');\nvar out=[],seen={};\nfor(var i=0;i<es.size();i++){\n var e=es.get(i);\n var u=S(e.attr('abs:href'));\n if(!u||seen[u])continue;\n seen[u]=1;\n var t=S(e.select('.book-title').first()==null?'':e.select('.book-title').first().text());\n var au=S(e.select('.book-author').first()==null?'':e.select('.book-author').first().text()).replace(/^\\s*作者：/,'').trim();\n var d=S(e.select('.book-desc').first()==null?'':e.select('.book-desc').first().text());\n var ki='',ws='';\n var ms=e.select('.book-badge');\n for(var k=0;k<ms.size();k++){\n var v=S(ms.get(k).text());\n var cls=S(ms.get(k).attr('class'));\n if(cls.indexOf('category')>=0)ki=v;\n else if(cls.indexOf('status')>=0)ki=(ki?ki+'·':'')+v;\n else if(cls.indexOf('words')>=0)ws=v;\n }\n if(ws)ki+=(ki?'·':'')+ws;\n var n='',p='0';\n var mn=/(\\d+)\\D*$/.exec(u);\n if(mn){n=mn[1];p=n.length>3?n.slice(0,-3):'0'}\n var cv=HJ_B+'/book/files/article/image/'+p+'/'+n+'/'+n+'s.jpg';\n out.push(JSON.stringify({'name':t,'author':au,'kind':ki,'intro':d,'coverUrl':cv,'url':u}));\n}\nif(out.length===0){try{java.toast('黄金屋搜索0条:len='+h.length+' chal='+chal+' card='+(h.indexOf('book-card')>=0))}catch(e){}}\nreturn out;\n})()\n</js>", "bookUrl": "@js:JSON.parse(result).url", "checkKeyWord": "明克街", "coverUrl": "@js:JSON.parse(result).coverUrl", "intro": "@js:JSON.parse(result).intro", "kind": "@js:JSON.parse(result).kind", "name": "@js:JSON.parse(result).name"}, "ruleToc": {"chapterList": "<js>\nvar base=String(baseUrl);\nvar m=base.match(/\\/novel\\/(\\d+)/);\nif(!m){'';}else{\nvar bid=m[1];\nvar root='https://www.huangjinwu.org/novel/'+bid+'/';\nfunction parseSeg(seg){\n  var r='';\n  var re=/<li class=\"chapter-item\"><a href=\"(\\/novel\\/\\d+\\/\\d+)\"[^>]*>([^<]+)<\\/a>/g,mm;\n  while((mm=re.exec(seg))!==null){r+='<a href=\"'+mm[1]+'\">'+mm[2]+'</a>';}\n  return r;\n}\nvar all=String(result);\nvar idx=all.indexOf('章节目录');\nvar seg=idx>=0?all.substring(idx):all;\nvar pages=1;\nvar pm=all.match(/\\/novel\\/\\d+\\/(\\d+)\\.html\"[^>]*>末页/);\nif(pm){pages=parseInt(pm[1],10);}\nvar out=parseSeg(seg);\nfor(var i=2;i<=pages;i++){\n  try{\n    var ph=String(java.ajax(root+i+'.html'));\n    var pi=ph.indexOf('章节目录');\n    var ps=pi>=0?ph.substring(pi):ph;\n    out+=parseSeg(ps);\n  }catch(e){}\n}\nout;\n}\n</js>a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "/search?keyword={{key}}", "weight": 0},{"bookSourceComment": "by艳阳", "bookSourceGroup": "通常书源", "bookSourceName": "速读谷", "bookSourceType": 0, "bookSourceUrl": "https://www.suduguu.com/", "bookUrlPattern": "https?://www\\.suduguu\\.com/\\d+(/.*)?", "customButton": false, "customOrder": 3, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "完结小说::/wanjie/{{page == 1 ? \"\" : page + \".html\"}}\n都市小说::/dushi/{{page == 1 ? \"\" : page + \".html\"}}\n玄幻小说::/xuanhuan/{{page == 1 ? \"\" : page + \".html\"}}\n轻小说::/qing/{{page == 1 ? \"\" : page + \".html\"}}\n仙侠小说::/xianxia/{{page == 1 ? \"\" : page + \".html\"}}\n历史小说::/lishi/{{page == 1 ? \"\" : page + \".html\"}}\n科幻小说::/kehuan/{{page == 1 ? \"\" : page + \".html\"}}\n诸天无限::/zhutianwuxian/{{page == 1 ? \"\" : page + \".html\"}}\n游戏小说::/youxi/{{page == 1 ? \"\" : page + \".html\"}}\n奇幻小说::/qihuan/{{page == 1 ? \"\" : page + \".html\"}}\n悬疑小说::/xuanyi/{{page == 1 ? \"\" : page + \".html\"}}\n体育小说::/tiyu/{{page == 1 ? \"\" : page + \".html\"}}\n官场小说::/guanchang/{{page == 1 ? \"\" : page + \".html\"}}\n军事小说::/junshi/{{page == 1 ? \"\" : page + \".html\"}}\n武侠小说::/wuxia/{{page == 1 ? \"\" : page + \".html\"}}\n乡村小说::/xiangcun/{{page == 1 ? \"\" : page + \".html\"}}\n现实小说::/xianshi/{{page == 1 ? \"\" : page + \".html\"}}\n言情小说::/yanqing/{{page == 1 ? \"\" : page + \".html\"}}\n最新更新::/zuixin/{{page == 1 ? \"\" : page + \".html\"}}", "header": "{\"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\"}", "lastUpdateTime": "1791187796359", "loginUrl": "", "respondTime": 180000, "ruleBookInfo": {"author": "@css:.itemtxt p:eq(1) a@text##作者：", "coverUrl": "@css:.item a img@src", "intro": "class.des.0@text", "kind": "@css:.itemtxt p:eq(0) span:eq(1)@text", "lastChapter": "@css:.itemtxt ul li:eq(0) a@text", "name": "@css:.itemtxt h1 a@text", "tocUrl": "", "wordCount": "@css:.itemtxt h1 i@text"}, "ruleContent": {"content": "@css:.con p@text", "nextContentUrl": "@css:.prenext span:eq(2) a@href", "sourceRegex": "", "webJs": ""}, "ruleExplore": {"author": "@css:.itemtxt p:eq(1) a@text##作者：", "bookList": "@css:.item", "bookUrl": "@css:.itemtxt h3 a@href", "coverUrl": "@css:.item a img@src", "intro": "", "kind": "p@span@text", "lastChapter": "@css:.itemtxt ul li:eq(0) a@text", "name": "@css:.itemtxt h3 a@text"}, "ruleSearch": {"author": "@css:.itemtxt p:eq(1) a@text##作者：", "bookList": "@css:.item", "bookUrl": "@css:.itemtxt h3 a@href", "checkKeyWord": "没钱修什么仙", "coverUrl": "@css:.item a img@src", "intro": "", "kind": "p@span@text", "lastChapter": "@css:.itemtxt ul li:eq(0) a@text", "name": "@css:.itemtxt h3 a@text", "wordCount": ""}, "ruleToc": {"chapterList": "@css:#list ul li", "chapterName": "@css:a@text", "chapterUrl": "@css:a@href", "isVip": "", "nextTocUrl": "@css:#pages a.gr@href", "updateTime": ""}, "searchUrl": "/i/sor.aspx?key={{key}}", "weight": 0},{"bookSourceName": "52书库", "bookSourceUrl": "https://www.52shuku.net", "bookSourceGroup": "自制", "bookSourceComment": "52书库自制源。书籍以分页形式存储，目录即页面列表，正文逐页拼接。", "bookSourceType": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": false, "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "respondTime": 15000, "searchUrl": "https://www.52shuku.net/so/search.php?q={{key}}", "ruleSearch": {"bookList": "class.excerpt||class.post||article.post||article", "name": "h2 a@text||h3 a@text||h4 a@text", "author": "@js:var t=''+result;var m=t.match(/作者[：:]\\s*([^<\\s\\n]+)/);if(!m){m=t.match(/_([^_【<\\s]+)【/);}m?m[1].replace(/^\\s+|\\s+$/g,''):'';", "intro": "class.note@text||class.excerpt-content@text||p@text", "bookUrl": "h2 a@href||h3 a@href||h4 a@href||a@href", "coverUrl": "img@src"}, "ruleBookInfo": {"name": "h1.article-title@text", "author": "@js:var t=''+result;var m=t.match(/_(.+?)【/);m?m[1]:'';", "intro": "class.article-content.0@tag.p.1@text", "kind": "@js:var t=''+result;var m=t.match(/\\[([^\\]]+)\\]\\s*《/);m?m[1]:'';", "lastChapter": "class.list.0@tag.li.-1@tag.a@text", "coverUrl": ""}, "ruleToc": {"chapterList": "class.list.clearfix.0@tag.li@tag.a||class.list.0@tag.li@tag.a||class.mulu@tag.a", "chapterName": "text", "chapterUrl": "href"}, "ruleContent": {"content": "id.text@html||id.text@text||class.book_con@html||class.book_con@text||class.book_con.fix@html||article.article-content@html||article.article-content@text", "nextContentUrl": "@js:var m=(''+result).match(/<a[^>]*href=\"([^\"]+)\"[^>]*>下一页<\\/a>/);if(m){var u=m[1];if(u.indexOf('http')!==0){if(u.indexOf('/')===0){u='https://www.52shuku.net'+u;}else{u='https://www.52shuku.net/'+u;}}u}else{'';}"}, "weight": 0, "lastUpdateTime": "1791125877715"},{"bookSourceComment": "神文小说 自制源 v5.7。搜索限频未解决（15 秒 IP 限制）；正文翻页改为 URL 推导 + h1 校验。", "bookSourceGroup": "使用前看注释_自制", "bookSourceName": "神文小说", "bookSourceType": 0, "bookSourceUrl": "https://www.shenwen.org", "customButton": false, "customOrder": 4, "enabled": true, "enabledCookieJar": true, "enabledExplore": false, "eventListener": false, "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1791107025840", "loginUi": "@js:try{java.ajax('https://www.shenwen.org/login.html')}catch(e){};JSON.stringify([{\"name\":\"用户名\",\"type\":\"title\"},{\"name\":\"user_name\",\"type\":\"text\"},{\"name\":\"密码\",\"type\":\"title\"},{\"name\":\"user_pass\",\"type\":\"password\"}])", "loginUrl": "@js:function qsskel(o) {\n function w(b, a) {\n return (b << a) | (b >>> (32 - a))\n }\n function E(k, b) {\n var U, a, d, x, c;\n d = (k & 2147483648);\n x = (b & 2147483648);\n U = (k & 1073741824);\n a = (b & 1073741824);\n c = (k & 1073741823) + (b & 1073741823);\n if (U & a) {\n return (c ^ 2147483648 ^ d ^ x)\n }\n if (U | a) {\n if (c & 1073741824) {\n return (c ^ 3221225472 ^ d ^ x)\n } else {\n return (c ^ 1073741824 ^ d ^ x)\n }\n } else {\n return (c ^ d ^ x)\n }\n }\n function s(a, c, b) {\n return (a & c) | ((~a) & b)\n }\n function r(a, c, b) {\n return (a & b) | (c & (~b))\n }\n function q(a, c, b) {\n return (a ^ c ^ b)\n }\n function p(a, c, b) {\n return (c ^ (a | (~b)))\n }\n function f(V, U, Z, Y, k, W, X) {\n V = E(V, E(E(s(U, Z, Y), k), X));\n return E(w(V, W), U)\n }\n function C(V, U, Z, Y, k, W, X) {\n V = E(V, E(E(r(U, Z, Y), k), X));\n return E(w(V, W), U)\n }\n function t(V, U, Z, Y, k, W, X) {\n V = E(V, E(E(q(U, Z, Y), k), X));\n return E(w(V, W), U)\n }\n function e(V, U, Z, Y, k, W, X) {\n V = E(V, E(E(p(U, Z, Y), k), X));\n return E(w(V, W), U)\n }\n function g(k) {\n var V;\n var d = k.length;\n var c = d + 8;\n var b = (c - (c % 64)) / 64;\n var U = (b + 1) * 16;\n var W = Array(U - 1);\n var a = 0;\n var x = 0;\n while (x < d) {\n V = (x - (x % 4)) / 4;\n a = (x % 4) * 8;\n W[V] = (W[V] | (k.charCodeAt(x) << a));\n x++\n }\n V = (x - (x % 4)) / 4;\n a = (x % 4) * 8;\n W[V] = W[V] | (128 << a);\n W[U - 2] = d << 3;\n W[U - 1] = d >>> 29;\n return W\n }\n function G(c) {\n var b = \"\",\n d = \"\",\n k, a;\n for (a = 0; a <= 3; a++) {\n k = (c >>> (a * 8)) & 255;\n d = \"0\" + k.toString(16);\n b = b + d.substr(d.length - 2, 2)\n }\n return b\n }\n function u(b) {\n b = b.replace(/\\r\\n/g, \"\\n\");\n var a = \"\";\n for (var k = 0; k < b.length; k++) {\n var d = b.charCodeAt(k);\n if (d < 128) {\n a += String.fromCharCode(d)\n } else {\n if ((d > 127) && (d < 2048)) {\n a += String.fromCharCode((d >> 6) | 192);\n a += String.fromCharCode((d & 63) | 128)\n } else {\n a += String.fromCharCode((d >> 12) | 224);\n a += String.fromCharCode(((d >> 6) & 63) | 128);\n a += String.fromCharCode((d & 63) | 128)\n }\n }\n }\n return a\n }\n var D = Array();\n var K, i, F, v, h, T, S, R, Q;\n var N = 7,\n L = 12,\n I = 17,\n H = 22;\n var B = 5,\n A = 9,\n z = 14,\n y = 20;\n var n = 4,\n m = 11,\n l = 16,\n j = 23;\n var P = 6,\n O = 10,\n M = 15,\n J = 21;\n o = u(o);\n D = g(o);\n T = 1732584193;\n S = 4023233417;\n R = 2562383102;\n Q = 271733878;\n for (K = 0; K < D.length; K += 16) {\n i = T;\n F = S;\n v = R;\n h = Q;\n T = f(T, S, R, Q, D[K + 0], N, 3614090360);\n Q = f(Q, T, S, R, D[K + 1], L, 3905402710);\n R = f(R, Q, T, S, D[K + 2], I, 606105819);\n S = f(S, R, Q, T, D[K + 3], H, 3250441966);\n T = f(T, S, R, Q, D[K + 4], N, 4118548399);\n Q = f(Q, T, S, R, D[K + 5], L, 1200080426);\n R = f(R, Q, T, S, D[K + 6], I, 2821735955);\n S = f(S, R, Q, T, D[K + 7], H, 4249261313);\n T = f(T, S, R, Q, D[K + 8], N, 1770035416);\n Q = f(Q, T, S, R, D[K + 9], L, 2336552879);\n R = f(R, Q, T, S, D[K + 10], I, 4294925233);\n S = f(S, R, Q, T, D[K + 11], H, 2304563134);\n T = f(T, S, R, Q, D[K + 12], N, 1804603682);\n Q = f(Q, T, S, R, D[K + 13], L, 4254626195);\n R = f(R, Q, T, S, D[K + 14], I, 2792965006);\n S = f(S, R, Q, T, D[K + 15], H, 1236535329);\n T = C(T, S, R, Q, D[K + 1], B, 4129170786);\n Q = C(Q, T, S, R, D[K + 6], A, 3225465664);\n R = C(R, Q, T, S, D[K + 11], z, 643717713);\n S = C(S, R, Q, T, D[K + 0], y, 3921069994);\n T = C(T, S, R, Q, D[K + 5], B, 3593408605);\n Q = C(Q, T, S, R, D[K + 10], A, 38016083);\n R = C(R, Q, T, S, D[K + 15], z, 3634488961);\n S = C(S, R, Q, T, D[K + 4], y, 3889429448);\n T = C(T, S, R, Q, D[K + 9], B, 568446438);\n Q = C(Q, T, S, R, D[K + 14], A, 3275163606);\n R = C(R, Q, T, S, D[K + 3], z, 4107603335);\n S = C(S, R, Q, T, D[K + 8], y, 1163531501);\n T = C(T, S, R, Q, D[K + 13], B, 2850285829);\n Q = C(Q, T, S, R, D[K + 2], A, 4243563512);\n R = C(R, Q, T, S, D[K + 7], z, 1735328473);\n S = C(S, R, Q, T, D[K + 12], y, 2368359562);\n T = t(T, S, R, Q, D[K + 5], n, 4294588738);\n Q = t(Q, T, S, R, D[K + 8], m, 2272392833);\n R = t(R, Q, T, S, D[K + 11], l, 1839030562);\n S = t(S, R, Q, T, D[K + 14], j, 4259657740);\n T = t(T, S, R, Q, D[K + 1], n, 2763975236);\n Q = t(Q, T, S, R, D[K + 4], m, 1272893353);\n R = t(R, Q, T, S, D[K + 7], l, 4139469664);\n S = t(S, R, Q, T, D[K + 10], j, 3200236656);\n T = t(T, S, R, Q, D[K + 13], n, 681279174);\n Q = t(Q, T, S, R, D[K + 0], m, 3936430074);\n R = t(R, Q, T, S, D[K + 3], l, 3572445317);\n S = t(S, R, Q, T, D[K + 6], j, 76029189);\n T = t(T, S, R, Q, D[K + 9], n, 3654602809);\n Q = t(Q, T, S, R, D[K + 12], m, 3873151461);\n R = t(R, Q, T, S, D[K + 15], l, 530742520);\n S = t(S, R, Q, T, D[K + 2], j, 3299628645);\n T = e(T, S, R, Q, D[K + 0], P, 4096336452);\n Q = e(Q, T, S, R, D[K + 7], O, 1126891415);\n R = e(R, Q, T, S, D[K + 14], M, 2878612391);\n S = e(S, R, Q, T, D[K + 5], J, 4237533241);\n T = e(T, S, R, Q, D[K + 12], P, 1700485571);\n Q = e(Q, T, S, R, D[K + 3], O, 2399980690);\n R = e(R, Q, T, S, D[K + 10], M, 4293915773);\n S = e(S, R, Q, T, D[K + 1], J, 2240044497);\n T = e(T, S, R, Q, D[K + 8], P, 1873313359);\n Q = e(Q, T, S, R, D[K + 15], O, 4264355552);\n R = e(R, Q, T, S, D[K + 6], M, 2734768916);\n S = e(S, R, Q, T, D[K + 13], J, 1309151649);\n T = e(T, S, R, Q, D[K + 4], P, 4149444226);\n Q = e(Q, T, S, R, D[K + 11], O, 3174756917);\n R = e(R, Q, T, S, D[K + 2], M, 718787259);\n S = e(S, R, Q, T, D[K + 9], J, 3951481745);\n T = E(T, i);\n S = E(S, F);\n R = E(R, v);\n Q = E(Q, h)\n }\n return (G(T) + G(S) + G(R) + G(Q)).toLowerCase()\n}\nfunction login(){var info=source.getLoginInfoMap();var u='',p='';if(info){u=''+((info.get?info.get('user_name'):info['user_name'])||'');p=''+((info.get?info.get('user_pass'):info['user_pass'])||'');}try{java.ajax('https://www.shenwen.org/login.html');}catch(e){}var c=''+java.getVerificationCode('https://www.shenwen.org/code.jpg?_='+new Date().getTime());var body='user_name='+encodeURIComponent(u)+'&user_pass='+qsskel(p)+'&user_code='+encodeURIComponent(c);var r=''+java.ajax('https://www.shenwen.org/qs_login_go.php,{\"method\":\"POST\",\"body\":\"'+body+'\"}');if(r.indexOf('登录成功')<0){throw '登录失败：'+r;}}", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=\"og:novel:author\"]@content", "coverUrl": "@js:var m=result.match(/<meta[^>]+property=\"og:image\"[^>]+content=\"([^\"]+)\"/);var v=m?m[1]:'';v.indexOf('http')===0?v:('https://www.shenwen.org'+v)", "intro": "meta[property=\"og:description\"]@content", "kind": "meta[property=\"og:novel:category\"]@content", "lastChapter": "meta[property=\"og:novel:latest_chapter_name\"]@content", "name": "meta[property=\"og:novel:book_name\"]@content"}, "ruleContent": {"content": "@js:var s=''+result;var re=/qsbs\\.bb\\('([^']+)'\\)/g;var m;var o='';while((m=re.exec(s))!==null){try{o+=java.base64Decode(m[1])}catch(e){}}o", "nextContentUrl": "@js:var cur=''+baseUrl;var r='';var cm=cur.match(/\\/book\\/(\\d+)\\/(\\d+)(?:_(\\d+))?\\.html$/);if(cm){var bid=cm[1];var cid=cm[2];var cp=cm[3]?parseInt(cm[3],10):0;var nu='https://www.shenwen.org/book/'+bid+'/'+cid+'_'+(cp+1)+'.html';var s=''+result;function getName(h){var m=h.match(/<h1[^>]*>([\\s\\S]*?)<\\/h1>/);if(!m){return '';}var t=m[1].replace(/<[^>]+>/g,'');t=t.replace(/[（(][^）)]*[）)]/g,'');t=t.replace(/\\s+/g,'');return t;}function getPage(h){var m=h.match(/<h1[^>]*>([\\s\\S]*?)<\\/h1>/);if(!m){return 0;}var t=m[1].replace(/<[^>]+>/g,'');var pm=t.match(/[（(]\\s*第?\\s*(\\d+)\\s*页\\s*[）)]/);if(pm){return parseInt(pm[1],10);}pm=t.match(/[（(]\\s*(\\d+)\\s*\\/\\s*\\d+\\s*[）)]/);if(pm){return parseInt(pm[1],10);}return 0;}var curN=getName(s);var curP=getPage(s);if(curP===0){curP=cp+1;}try{var t=''+java.ajax(nu);if(t.indexOf('qsbs.bb')>=0){var nxN=getName(t);var nxP=getPage(t);if(curN&&nxN&&curN===nxN&&nxP>curP){r=nu;}}}catch(e){}}r"}, "ruleExplore": [], "ruleSearch": {"bookList": "class.index_qb.0@tag.a.list", "bookUrl": "@href", "name": "@title"}, "ruleToc": {"chapterList": "-@js:var H='https://www.shenwen.org';\nvar mb=baseUrl.match(/\\/book\\/(\\d+)\\//);\nvar bid=mb?mb[1]:'';\nvar html='';\ntry{html=java.ajax(baseUrl)}catch(e){};\nvar arr=[];\nvar seen={};\nvar m;\nvar r1=/<a[^>]+href=\"\\/book\\/(\\d+)\\/(\\d+)\\.html\"[^>]*>([^<]*)<\\/a>/g;\nwhile((m=r1.exec(html))!==null){\n  if(m[1]===bid && !seen[m[2]]){\n    seen[m[2]]=1;\n    arr.push({id:m[2], name:m[3]});\n  }\n}\narr.sort(function(a,b){return parseInt(b.id,10)-parseInt(a.id,10);});\nvar out=[];\nfor(var j=0;j<arr.length;j++){\n  out.push('<a href=\"/book/'+bid+'/'+arr[j].id+'.html\">'+arr[j].name+'</a>');\n}\nout", "chapterName": "a@text", "chapterUrl": "a@href"}, "searchUrl": "@js:\nvar ck='';\ntry{ck=String(java.getCookie('https://www.shenwen.org')||'');}catch(e){}\nvar parts=ck.split(';');\nvar keep=[];\nfor(var i=0;i<parts.length;i++){\n  var p=String(parts[i]).trim();\n  if(p.length===0){continue;}\n  if(p.indexOf('user_id')===0){keep.push(p);}\n  else if(p.indexOf('user_name')===0){keep.push(p);}\n  else if(p.indexOf('320cae9b112ceefc02d1f1bf69093c11')===0){keep.push(p);}\n}\nck=keep.join('; ');\nvar options={\n  method:'POST',\n  body:'s='+java.encodeURI(key),\n  headers:{\n    'Content-Type':'application/x-www-form-urlencoded',\n    'Referer':'https://www.shenwen.org/',\n    'Cookie':ck\n  }\n};\n'https://www.shenwen.org/search.html,'+JSON.stringify(options);", "weight": 0},{"bookSourceComment": "神文小说 自制源 v3.4。搜索需登录；点右上角√后自动弹出图片验证码框，输入验证码即完成登录；注册请到源网站完成（注意：站点手机号仅支持13x/15x/17x/18x老号段，16x/19x新号段不可用，号码可尝试虚构）", "bookSourceGroup": "使用前看注释自制", "bookSourceName": "神文小说", "bookSourceType": 0, "bookSourceUrl": "https://www.shenwen.org", "enabledCookieJar": true, "enabledExplore": false, "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "loginUi": "@js:try{java.ajax('https://www.shenwen.org/login.html')}catch(e){};JSON.stringify([{\"name\":\"用户名\",\"type\":\"title\"},{\"name\":\"user_name\",\"type\":\"text\"},{\"name\":\"密码\",\"type\":\"title\"},{\"name\":\"user_pass\",\"type\":\"password\"}])", "loginUrl": "@js:function qsskel(o) {\n\n    function w(b, a) {\n\n        return (b << a) | (b >>> (32 - a))\n\n    }\n\n\n\n    function E(k, b) {\n\n        var U, a, d, x, c;\n\n        d = (k & 2147483648);\n\n        x = (b & 2147483648);\n\n        U = (k & 1073741824);\n\n        a = (b & 1073741824);\n\n        c = (k & 1073741823) + (b & 1073741823);\n\n        if (U & a) {\n\n            return (c ^ 2147483648 ^ d ^ x)\n\n        }\n\n        if (U | a) {\n\n            if (c & 1073741824) {\n\n                return (c ^ 3221225472 ^ d ^ x)\n\n            } else {\n\n                return (c ^ 1073741824 ^ d ^ x)\n\n            }\n\n        } else {\n\n            return (c ^ d ^ x)\n\n        }\n\n    }\n\n\n\n    function s(a, c, b) {\n\n        return (a & c) | ((~a) & b)\n\n    }\n\n\n\n    function r(a, c, b) {\n\n        return (a & b) | (c & (~b))\n\n    }\n\n\n\n    function q(a, c, b) {\n\n        return (a ^ c ^ b)\n\n    }\n\n\n\n    function p(a, c, b) {\n\n        return (c ^ (a | (~b)))\n\n    }\n\n\n\n    function f(V, U, Z, Y, k, W, X) {\n\n        V = E(V, E(E(s(U, Z, Y), k), X));\n\n        return E(w(V, W), U)\n\n    }\n\n\n\n    function C(V, U, Z, Y, k, W, X) {\n\n        V = E(V, E(E(r(U, Z, Y), k), X));\n\n        return E(w(V, W), U)\n\n    }\n\n\n\n    function t(V, U, Z, Y, k, W, X) {\n\n        V = E(V, E(E(q(U, Z, Y), k), X));\n\n        return E(w(V, W), U)\n\n    }\n\n\n\n    function e(V, U, Z, Y, k, W, X) {\n\n        V = E(V, E(E(p(U, Z, Y), k), X));\n\n        return E(w(V, W), U)\n\n    }\n\n\n\n    function g(k) {\n\n        var V;\n\n        var d = k.length;\n\n        var c = d + 8;\n\n        var b = (c - (c % 64)) / 64;\n\n        var U = (b + 1) * 16;\n\n        var W = Array(U - 1);\n\n        var a = 0;\n\n        var x = 0;\n\n        while (x < d) {\n\n            V = (x - (x % 4)) / 4;\n\n            a = (x % 4) * 8;\n\n            W[V] = (W[V] | (k.charCodeAt(x) << a));\n\n            x++\n\n        }\n\n        V = (x - (x % 4)) / 4;\n\n        a = (x % 4) * 8;\n\n        W[V] = W[V] | (128 << a);\n\n        W[U - 2] = d << 3;\n\n        W[U - 1] = d >>> 29;\n\n        return W\n\n    }\n\n\n\n    function G(c) {\n\n        var b = \"\",\n\n            d = \"\",\n\n            k, a;\n\n        for (a = 0; a <= 3; a++) {\n\n            k = (c >>> (a * 8)) & 255;\n\n            d = \"0\" + k.toString(16);\n\n            b = b + d.substr(d.length - 2, 2)\n\n        }\n\n        return b\n\n    }\n\n\n\n    function u(b) {\n\n        b = b.replace(/\\r\\n/g, \"\\n\");\n\n        var a = \"\";\n\n        for (var k = 0; k < b.length; k++) {\n\n            var d = b.charCodeAt(k);\n\n            if (d < 128) {\n\n                a += String.fromCharCode(d)\n\n            } else {\n\n                if ((d > 127) && (d < 2048)) {\n\n                    a += String.fromCharCode((d >> 6) | 192);\n\n                    a += String.fromCharCode((d & 63) | 128)\n\n                } else {\n\n                    a += String.fromCharCode((d >> 12) | 224);\n\n                    a += String.fromCharCode(((d >> 6) & 63) | 128);\n\n                    a += String.fromCharCode((d & 63) | 128)\n\n                }\n\n            }\n\n        }\n\n        return a\n\n    }\n\n    var D = Array();\n\n    var K, i, F, v, h, T, S, R, Q;\n\n    var N = 7,\n\n        L = 12,\n\n        I = 17,\n\n        H = 22;\n\n    var B = 5,\n\n        A = 9,\n\n        z = 14,\n\n        y = 20;\n\n    var n = 4,\n\n        m = 11,\n\n        l = 16,\n\n        j = 23;\n\n    var P = 6,\n\n        O = 10,\n\n        M = 15,\n\n        J = 21;\n\n    o = u(o);\n\n    D = g(o);\n\n    T = 1732584193;\n\n    S = 4023233417;\n\n    R = 2562383102;\n\n    Q = 271733878;\n\n    for (K = 0; K < D.length; K += 16) {\n\n        i = T;\n\n        F = S;\n\n        v = R;\n\n        h = Q;\n\n        T = f(T, S, R, Q, D[K + 0], N, 3614090360);\n\n        Q = f(Q, T, S, R, D[K + 1], L, 3905402710);\n\n        R = f(R, Q, T, S, D[K + 2], I, 606105819);\n\n        S = f(S, R, Q, T, D[K + 3], H, 3250441966);\n\n        T = f(T, S, R, Q, D[K + 4], N, 4118548399);\n\n        Q = f(Q, T, S, R, D[K + 5], L, 1200080426);\n\n        R = f(R, Q, T, S, D[K + 6], I, 2821735955);\n\n        S = f(S, R, Q, T, D[K + 7], H, 4249261313);\n\n        T = f(T, S, R, Q, D[K + 8], N, 1770035416);\n\n        Q = f(Q, T, S, R, D[K + 9], L, 2336552879);\n\n        R = f(R, Q, T, S, D[K + 10], I, 4294925233);\n\n        S = f(S, R, Q, T, D[K + 11], H, 2304563134);\n\n        T = f(T, S, R, Q, D[K + 12], N, 1804603682);\n\n        Q = f(Q, T, S, R, D[K + 13], L, 4254626195);\n\n        R = f(R, Q, T, S, D[K + 14], I, 2792965006);\n\n        S = f(S, R, Q, T, D[K + 15], H, 1236535329);\n\n        T = C(T, S, R, Q, D[K + 1], B, 4129170786);\n\n        Q = C(Q, T, S, R, D[K + 6], A, 3225465664);\n\n        R = C(R, Q, T, S, D[K + 11], z, 643717713);\n\n        S = C(S, R, Q, T, D[K + 0], y, 3921069994);\n\n        T = C(T, S, R, Q, D[K + 5], B, 3593408605);\n\n        Q = C(Q, T, S, R, D[K + 10], A, 38016083);\n\n        R = C(R, Q, T, S, D[K + 15], z, 3634488961);\n\n        S = C(S, R, Q, T, D[K + 4], y, 3889429448);\n\n        T = C(T, S, R, Q, D[K + 9], B, 568446438);\n\n        Q = C(Q, T, S, R, D[K + 14], A, 3275163606);\n\n        R = C(R, Q, T, S, D[K + 3], z, 4107603335);\n\n        S = C(S, R, Q, T, D[K + 8], y, 1163531501);\n\n        T = C(T, S, R, Q, D[K + 13], B, 2850285829);\n\n        Q = C(Q, T, S, R, D[K + 2], A, 4243563512);\n\n        R = C(R, Q, T, S, D[K + 7], z, 1735328473);\n\n        S = C(S, R, Q, T, D[K + 12], y, 2368359562);\n\n        T = t(T, S, R, Q, D[K + 5], n, 4294588738);\n\n        Q = t(Q, T, S, R, D[K + 8], m, 2272392833);\n\n        R = t(R, Q, T, S, D[K + 11], l, 1839030562);\n\n        S = t(S, R, Q, T, D[K + 14], j, 4259657740);\n\n        T = t(T, S, R, Q, D[K + 1], n, 2763975236);\n\n        Q = t(Q, T, S, R, D[K + 4], m, 1272893353);\n\n        R = t(R, Q, T, S, D[K + 7], l, 4139469664);\n\n        S = t(S, R, Q, T, D[K + 10], j, 3200236656);\n\n        T = t(T, S, R, Q, D[K + 13], n, 681279174);\n\n        Q = t(Q, T, S, R, D[K + 0], m, 3936430074);\n\n        R = t(R, Q, T, S, D[K + 3], l, 3572445317);\n\n        S = t(S, R, Q, T, D[K + 6], j, 76029189);\n\n        T = t(T, S, R, Q, D[K + 9], n, 3654602809);\n\n        Q = t(Q, T, S, R, D[K + 12], m, 3873151461);\n\n        R = t(R, Q, T, S, D[K + 15], l, 530742520);\n\n        S = t(S, R, Q, T, D[K + 2], j, 3299628645);\n\n        T = e(T, S, R, Q, D[K + 0], P, 4096336452);\n\n        Q = e(Q, T, S, R, D[K + 7], O, 1126891415);\n\n        R = e(R, Q, T, S, D[K + 14], M, 2878612391);\n\n        S = e(S, R, Q, T, D[K + 5], J, 4237533241);\n\n        T = e(T, S, R, Q, D[K + 12], P, 1700485571);\n\n        Q = e(Q, T, S, R, D[K + 3], O, 2399980690);\n\n        R = e(R, Q, T, S, D[K + 10], M, 4293915773);\n\n        S = e(S, R, Q, T, D[K + 1], J, 2240044497);\n\n        T = e(T, S, R, Q, D[K + 8], P, 1873313359);\n\n        Q = e(Q, T, S, R, D[K + 15], O, 4264355552);\n\n        R = e(R, Q, T, S, D[K + 6], M, 2734768916);\n\n        S = e(S, R, Q, T, D[K + 13], J, 1309151649);\n\n        T = e(T, S, R, Q, D[K + 4], P, 4149444226);\n\n        Q = e(Q, T, S, R, D[K + 11], O, 3174756917);\n\n        R = e(R, Q, T, S, D[K + 2], M, 718787259);\n\n        S = e(S, R, Q, T, D[K + 9], J, 3951481745);\n\n        T = E(T, i);\n\n        S = E(S, F);\n\n        R = E(R, v);\n\n        Q = E(Q, h)\n\n    }\n\n    return (G(T) + G(S) + G(R) + G(Q)).toLowerCase()\n\n}\nfunction login(){var info=source.getLoginInfoMap();var u='',p='';if(info){u=''+((info.get?info.get('user_name'):info['user_name'])||'');p=''+((info.get?info.get('user_pass'):info['user_pass'])||'');}var c=''+java.getVerificationCode('https://www.shenwen.org/code.jpg');var body='user_name='+encodeURIComponent(u)+'&user_pass='+qsskel(p)+'&user_code='+encodeURIComponent(c);var r=''+java.ajax('https://www.shenwen.org/qs_login_go.php,{\"method\":\"POST\",\"body\":\"'+body+'\"}');if(r.indexOf('登录成功')<0){throw '登录失败：'+r;}}", "searchUrl": "@js:var u='https://www.shenwen.org/search.html?s='+key+',{\"method\":\"POST\"}';try{var w=java.ajax('https://www.shenwen.org/');if(!w||w.indexOf('ge_js_validator_20=')>=0){java.ajax('https://www.shenwen.org/,{\"webView\":true,\"webViewDelayTime\":2500}')}}catch(e){};u", "ruleBookInfo": {"author": "meta[property=\"og:novel:author\"]@content", "coverUrl": "@js:var m=result.match(/<meta[^>]+property=\"og:image\"[^>]+content=\"([^\"]+)\"/);var v=m?m[1]:'';v.indexOf('http')===0?v:('https://www.shenwen.org'+v)", "intro": "meta[property=\"og:description\"]@content", "kind": "meta[property=\"og:novel:category\"]@content", "lastChapter": "meta[property=\"og:novel:latest_chapter_name\"]@content", "name": "meta[property=\"og:novel:book_name\"]@content"}, "ruleContent": {"content": "@js:var H='https://www.shenwen.org';var md=(''+baseUrl).match(/\\/book\\/(\\d+)\\/(\\d+)(?:_\\d+)?\\.html/);if(!md){md=(''+result).match(/lastread\\.set\\('(\\d+)',\\s*'(\\d+)'/)}var bid=md?md[1]:'';var cid=md?md[2]:'';var s=''+result;var o='';var n=0;while(true){var re=/qsbs\\.bb\\('([^']+)'\\)/g;var m;while((m=re.exec(s))!==null){try{o+=java.base64Decode(m[1])}catch(e){}}if(!bid||!cid||n>=30){break}n++;var nx=s.match(/hhekgv\\s*=\\s*'([^']+)'/);if(!nx){break}var u=nx[1];if(u.indexOf('/book/'+bid+'/'+cid+'_')<0){break}if(u.indexOf('http')!==0){u=H+u}var h='';try{h=''+java.ajax(u)}catch(e){break}if(!h||h.indexOf('qsbs.bb(')<0){break}s=h}o"}, "ruleSearch": {"bookList": "a.list", "bookUrl": "@href", "name": "h4@text", "author": "", "kind": "", "lastChapter": ""}, "ruleToc": {"chapterList": "@js:var H='https://www.shenwen.org';var mb=baseUrl.match(/\\/book\\/(\\d+)\\//);var bid=mb?mb[1]:'';var map={};var order=[];function add(c,n){if(c&&!map[c]){map[c]=n;order.push(c)}}function collect(html){var m;var r1=/<a[^>]+href=\"\\/book\\/(\\d+)\\/(\\d+)\\.html\"[^>]*>([^<]*)<\\/a>/g;while((m=r1.exec(html))!==null){if(m[1]===bid)add(m[2],m[3])}var r2=/<a[^>]*onclick=\"read_tz\\((\\d+)\\);\"?[^>]*>([^<]*)<\\/a>/g;while((m=r2.exec(html))!==null){add(m[1],m[2])}}var h0='';try{h0=''+java.ajax(H+'/book/'+bid+'/')}catch(e){};collect(h0);for(var i=1;i<=80;i++){var h='';try{h=''+java.ajax(H+'/book/'+bid+'/a'+i+'.html')}catch(e){break}if(h.indexOf('read_tz(')<0){break}var n=order.length;collect(h);if(order.length===n){break}}order.sort(function(a,b){return parseInt(a)-parseInt(b)});var out=[];for(var j=0;j<order.length;j++){var c=order[j];out.push('<a href=\"/book/'+bid+'/'+c+'.html\">'+map[c]+'</a>')}out", "chapterName": "a@text", "chapterUrl": "a@href"}, "lastUpdateTime": "1791096080272"},{"bookSourceComment": "神文小说 自制源 v3.4。搜索需登录；点右上角√后自动弹出图片验证码框，输入验证码即完成登录；注册请到源网站完成（注意：站点手机号仅支持13x/15x/17x/18x老号段，16x/19x新号段不可用，号码可尝试虚构）", "bookSourceGroup": "使用前看注释自制", "bookSourceName": "神文小说", "bookSourceType": 0, "bookSourceUrl": "https://www.shenwen.org", "enabledCookieJar": true, "enabledExplore": false, "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "loginUi": "@js:try{java.ajax('https://www.shenwen.org/login.html')}catch(e){};JSON.stringify([{\"name\":\"用户名\",\"type\":\"title\"},{\"name\":\"user_name\",\"type\":\"text\"},{\"name\":\"密码\",\"type\":\"title\"},{\"name\":\"user_pass\",\"type\":\"password\"}])", "loginUrl": "@js:function qsskel(o) {\n\n    function w(b, a) {\n\n        return (b << a) | (b >>> (32 - a))\n\n    }\n\n\n\n    function E(k, b) {\n\n        var U, a, d, x, c;\n\n        d = (k & 2147483648);\n\n        x = (b & 2147483648);\n\n        U = (k & 1073741824);\n\n        a = (b & 1073741824);\n\n        c = (k & 1073741823) + (b & 1073741823);\n\n        if (U & a) {\n\n            return (c ^ 2147483648 ^ d ^ x)\n\n        }\n\n        if (U | a) {\n\n            if (c & 1073741824) {\n\n                return (c ^ 3221225472 ^ d ^ x)\n\n            } else {\n\n                return (c ^ 1073741824 ^ d ^ x)\n\n            }\n\n        } else {\n\n            return (c ^ d ^ x)\n\n        }\n\n    }\n\n\n\n    function s(a, c, b) {\n\n        return (a & c) | ((~a) & b)\n\n    }\n\n\n\n    function r(a, c, b) {\n\n        return (a & b) | (c & (~b))\n\n    }\n\n\n\n    function q(a, c, b) {\n\n        return (a ^ c ^ b)\n\n    }\n\n\n\n    function p(a, c, b) {\n\n        return (c ^ (a | (~b)))\n\n    }\n\n\n\n    function f(V, U, Z, Y, k, W, X) {\n\n        V = E(V, E(E(s(U, Z, Y), k), X));\n\n        return E(w(V, W), U)\n\n    }\n\n\n\n    function C(V, U, Z, Y, k, W, X) {\n\n        V = E(V, E(E(r(U, Z, Y), k), X));\n\n        return E(w(V, W), U)\n\n    }\n\n\n\n    function t(V, U, Z, Y, k, W, X) {\n\n        V = E(V, E(E(q(U, Z, Y), k), X));\n\n        return E(w(V, W), U)\n\n    }\n\n\n\n    function e(V, U, Z, Y, k, W, X) {\n\n        V = E(V, E(E(p(U, Z, Y), k), X));\n\n        return E(w(V, W), U)\n\n    }\n\n\n\n    function g(k) {\n\n        var V;\n\n        var d = k.length;\n\n        var c = d + 8;\n\n        var b = (c - (c % 64)) / 64;\n\n        var U = (b + 1) * 16;\n\n        var W = Array(U - 1);\n\n        var a = 0;\n\n        var x = 0;\n\n        while (x < d) {\n\n            V = (x - (x % 4)) / 4;\n\n            a = (x % 4) * 8;\n\n            W[V] = (W[V] | (k.charCodeAt(x) << a));\n\n            x++\n\n        }\n\n        V = (x - (x % 4)) / 4;\n\n        a = (x % 4) * 8;\n\n        W[V] = W[V] | (128 << a);\n\n        W[U - 2] = d << 3;\n\n        W[U - 1] = d >>> 29;\n\n        return W\n\n    }\n\n\n\n    function G(c) {\n\n        var b = \"\",\n\n            d = \"\",\n\n            k, a;\n\n        for (a = 0; a <= 3; a++) {\n\n            k = (c >>> (a * 8)) & 255;\n\n            d = \"0\" + k.toString(16);\n\n            b = b + d.substr(d.length - 2, 2)\n\n        }\n\n        return b\n\n    }\n\n\n\n    function u(b) {\n\n        b = b.replace(/\\r\\n/g, \"\\n\");\n\n        var a = \"\";\n\n        for (var k = 0; k < b.length; k++) {\n\n            var d = b.charCodeAt(k);\n\n            if (d < 128) {\n\n                a += String.fromCharCode(d)\n\n            } else {\n\n                if ((d > 127) && (d < 2048)) {\n\n                    a += String.fromCharCode((d >> 6) | 192);\n\n                    a += String.fromCharCode((d & 63) | 128)\n\n                } else {\n\n                    a += String.fromCharCode((d >> 12) | 224);\n\n                    a += String.fromCharCode(((d >> 6) & 63) | 128);\n\n                    a += String.fromCharCode((d & 63) | 128)\n\n                }\n\n            }\n\n        }\n\n        return a\n\n    }\n\n    var D = Array();\n\n    var K, i, F, v, h, T, S, R, Q;\n\n    var N = 7,\n\n        L = 12,\n\n        I = 17,\n\n        H = 22;\n\n    var B = 5,\n\n        A = 9,\n\n        z = 14,\n\n        y = 20;\n\n    var n = 4,\n\n        m = 11,\n\n        l = 16,\n\n        j = 23;\n\n    var P = 6,\n\n        O = 10,\n\n        M = 15,\n\n        J = 21;\n\n    o = u(o);\n\n    D = g(o);\n\n    T = 1732584193;\n\n    S = 4023233417;\n\n    R = 2562383102;\n\n    Q = 271733878;\n\n    for (K = 0; K < D.length; K += 16) {\n\n        i = T;\n\n        F = S;\n\n        v = R;\n\n        h = Q;\n\n        T = f(T, S, R, Q, D[K + 0], N, 3614090360);\n\n        Q = f(Q, T, S, R, D[K + 1], L, 3905402710);\n\n        R = f(R, Q, T, S, D[K + 2], I, 606105819);\n\n        S = f(S, R, Q, T, D[K + 3], H, 3250441966);\n\n        T = f(T, S, R, Q, D[K + 4], N, 4118548399);\n\n        Q = f(Q, T, S, R, D[K + 5], L, 1200080426);\n\n        R = f(R, Q, T, S, D[K + 6], I, 2821735955);\n\n        S = f(S, R, Q, T, D[K + 7], H, 4249261313);\n\n        T = f(T, S, R, Q, D[K + 8], N, 1770035416);\n\n        Q = f(Q, T, S, R, D[K + 9], L, 2336552879);\n\n        R = f(R, Q, T, S, D[K + 10], I, 4294925233);\n\n        S = f(S, R, Q, T, D[K + 11], H, 2304563134);\n\n        T = f(T, S, R, Q, D[K + 12], N, 1804603682);\n\n        Q = f(Q, T, S, R, D[K + 13], L, 4254626195);\n\n        R = f(R, Q, T, S, D[K + 14], I, 2792965006);\n\n        S = f(S, R, Q, T, D[K + 15], H, 1236535329);\n\n        T = C(T, S, R, Q, D[K + 1], B, 4129170786);\n\n        Q = C(Q, T, S, R, D[K + 6], A, 3225465664);\n\n        R = C(R, Q, T, S, D[K + 11], z, 643717713);\n\n        S = C(S, R, Q, T, D[K + 0], y, 3921069994);\n\n        T = C(T, S, R, Q, D[K + 5], B, 3593408605);\n\n        Q = C(Q, T, S, R, D[K + 10], A, 38016083);\n\n        R = C(R, Q, T, S, D[K + 15], z, 3634488961);\n\n        S = C(S, R, Q, T, D[K + 4], y, 3889429448);\n\n        T = C(T, S, R, Q, D[K + 9], B, 568446438);\n\n        Q = C(Q, T, S, R, D[K + 14], A, 3275163606);\n\n        R = C(R, Q, T, S, D[K + 3], z, 4107603335);\n\n        S = C(S, R, Q, T, D[K + 8], y, 1163531501);\n\n        T = C(T, S, R, Q, D[K + 13], B, 2850285829);\n\n        Q = C(Q, T, S, R, D[K + 2], A, 4243563512);\n\n        R = C(R, Q, T, S, D[K + 7], z, 1735328473);\n\n        S = C(S, R, Q, T, D[K + 12], y, 2368359562);\n\n        T = t(T, S, R, Q, D[K + 5], n, 4294588738);\n\n        Q = t(Q, T, S, R, D[K + 8], m, 2272392833);\n\n        R = t(R, Q, T, S, D[K + 11], l, 1839030562);\n\n        S = t(S, R, Q, T, D[K + 14], j, 4259657740);\n\n        T = t(T, S, R, Q, D[K + 1], n, 2763975236);\n\n        Q = t(Q, T, S, R, D[K + 4], m, 1272893353);\n\n        R = t(R, Q, T, S, D[K + 7], l, 4139469664);\n\n        S = t(S, R, Q, T, D[K + 10], j, 3200236656);\n\n        T = t(T, S, R, Q, D[K + 13], n, 681279174);\n\n        Q = t(Q, T, S, R, D[K + 0], m, 3936430074);\n\n        R = t(R, Q, T, S, D[K + 3], l, 3572445317);\n\n        S = t(S, R, Q, T, D[K + 6], j, 76029189);\n\n        T = t(T, S, R, Q, D[K + 9], n, 3654602809);\n\n        Q = t(Q, T, S, R, D[K + 12], m, 3873151461);\n\n        R = t(R, Q, T, S, D[K + 15], l, 530742520);\n\n        S = t(S, R, Q, T, D[K + 2], j, 3299628645);\n\n        T = e(T, S, R, Q, D[K + 0], P, 4096336452);\n\n        Q = e(Q, T, S, R, D[K + 7], O, 1126891415);\n\n        R = e(R, Q, T, S, D[K + 14], M, 2878612391);\n\n        S = e(S, R, Q, T, D[K + 5], J, 4237533241);\n\n        T = e(T, S, R, Q, D[K + 12], P, 1700485571);\n\n        Q = e(Q, T, S, R, D[K + 3], O, 2399980690);\n\n        R = e(R, Q, T, S, D[K + 10], M, 4293915773);\n\n        S = e(S, R, Q, T, D[K + 1], J, 2240044497);\n\n        T = e(T, S, R, Q, D[K + 8], P, 1873313359);\n\n        Q = e(Q, T, S, R, D[K + 15], O, 4264355552);\n\n        R = e(R, Q, T, S, D[K + 6], M, 2734768916);\n\n        S = e(S, R, Q, T, D[K + 13], J, 1309151649);\n\n        T = e(T, S, R, Q, D[K + 4], P, 4149444226);\n\n        Q = e(Q, T, S, R, D[K + 11], O, 3174756917);\n\n        R = e(R, Q, T, S, D[K + 2], M, 718787259);\n\n        S = e(S, R, Q, T, D[K + 9], J, 3951481745);\n\n        T = E(T, i);\n\n        S = E(S, F);\n\n        R = E(R, v);\n\n        Q = E(Q, h)\n\n    }\n\n    return (G(T) + G(S) + G(R) + G(Q)).toLowerCase()\n\n}\nfunction login(){var info=source.getLoginInfoMap();var u='',p='';if(info){u=''+((info.get?info.get('user_name'):info['user_name'])||'');p=''+((info.get?info.get('user_pass'):info['user_pass'])||'');}var c=''+java.getVerificationCode('https://www.shenwen.org/code.jpg');var body='user_name='+encodeURIComponent(u)+'&user_pass='+qsskel(p)+'&user_code='+encodeURIComponent(c);var r=''+java.ajax('https://www.shenwen.org/qs_login_go.php,{\"method\":\"POST\",\"body\":\"'+body+'\"}');if(r.indexOf('登录成功')<0){throw '登录失败：'+r;}}", "searchUrl": "@js:var u='https://www.shenwen.org/search.html?s='+key+',{\"method\":\"POST\"}';try{var w=java.ajax('https://www.shenwen.org/');if(!w||w.indexOf('ge_js_validator_20=')>=0){java.ajax('https://www.shenwen.org/,{\"webView\":true,\"webViewDelayTime\":2500}')}}catch(e){};u", "ruleBookInfo": {"author": "meta[property=\"og:novel:author\"]@content", "coverUrl": "@js:var m=result.match(/<meta[^>]+property=\"og:image\"[^>]+content=\"([^\"]+)\"/);var v=m?m[1]:'';v.indexOf('http')===0?v:('https://www.shenwen.org'+v)", "intro": "meta[property=\"og:description\"]@content", "kind": "meta[property=\"og:novel:category\"]@content", "lastChapter": "meta[property=\"og:novel:latest_chapter_name\"]@content", "name": "meta[property=\"og:novel:book_name\"]@content"}, "ruleContent": {"content": "@js:var s=''+result;var re=/qsbs\\.bb\\('([^']+)'\\)/g;var m;var o='';while((m=re.exec(s))!==null){try{o+=java.base64Decode(m[1])}catch(e){}}o"}, "ruleSearch": {"bookList": "a.list", "bookUrl": "@href", "name": "h4@text", "author": "", "kind": "", "lastChapter": ""}, "ruleToc": {"chapterList": "@js:var H='https://www.shenwen.org';var mb=baseUrl.match(/\\/book\\/(\\d+)\\//);var bid=mb?mb[1]:'';var map={};var order=[];function add(c,n){if(c&&!map[c]){map[c]=n;order.push(c)}}function collect(html){var m;var r1=/<a[^>]+href=\"\\/book\\/(\\d+)\\/(\\d+)\\.html\"[^>]*>([^<]*)<\\/a>/g;while((m=r1.exec(html))!==null){if(m[1]===bid)add(m[2],m[3])}var r2=/<a[^>]*onclick=\"read_tz\\((\\d+)\\);\"?[^>]*>([^<]*)<\\/a>/g;while((m=r2.exec(html))!==null){add(m[1],m[2])}}var h0='';try{h0=''+java.ajax(H+'/book/'+bid+'/')}catch(e){};collect(h0);for(var i=1;i<=80;i++){var h='';try{h=''+java.ajax(H+'/book/'+bid+'/a'+i+'.html')}catch(e){break}if(h.indexOf('read_tz(')<0){break}var n=order.length;collect(h);if(order.length===n){break}}order.sort(function(a,b){return parseInt(a)-parseInt(b)});var out=[];for(var j=0;j<order.length;j++){var c=order[j];out.push('<a href=\"/book/'+bid+'/'+c+'.html\">'+map[c]+'</a>')}out", "chapterName": "a@text", "chapterUrl": "a@href"}, "lastUpdateTime": "1791093967558"},{"bookSourceComment": "", "bookSourceGroup": "自制", "bookSourceName": "素书卷", "bookSourceType": 0, "bookSourceUrl": "https://www.sushujuan.cc", "bookUrlPattern": "", "concurrentRate": "1000", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": false, "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1791093373483", "loginUrl": "", "respondTime": 180000, "ruleBookInfo": {"name": "@css:meta[property=\"og:title\"]@content", "author": "@css:meta[property=\"og:description\"]@content##\\s*作者：\\s*([^\\s]+)[\\s\\S]*##$1##", "coverUrl": "@css:meta[property=\"og:image\"]@content", "intro": "id.intro@textNodes", "kind": "", "lastChapter": "", "tocUrl": "text.章节目录@href", "wordCount": "", "canReName": "", "init": "", "downloadUrls": ""}, "ruleContent": {"content": "id.novelcontent@tag.p@textNodes##^\\s*>\\s*\\n?##", "nextContentUrl": "", "replaceRegex": "", "sourceRegex": "", "imageStyle": "", "payAction": "", "webJs": ""}, "ruleExplore": [], "ruleSearch": {"bookList": "class.qy-bcard", "name": "class.qy-bcard__title@text", "author": "class.qy-bcard__meta@tag.a@text", "bookUrl": "class.qy-bcard__cover@tag.a@href", "coverUrl": "class.qy-bcard__cover@tag.img@src", "intro": "class.qy-bcard__desc@text", "kind": "", "lastChapter": "", "wordCount": "", "checkKeyWord": ""}, "ruleToc": {"chapterList": "class.qy-chapters--full@tag.a", "chapterName": "@text", "chapterUrl": "@href", "nextTocUrl": "text.下一页@href", "isVolume": "", "isVip": "", "isPay": "", "updateTime": "", "formatJs": ""}, "searchUrl": "@js:(function(){\nvar BASE='https://www.sushujuan.cc';\nvar body='s='+encodeURIComponent(String(key||''));\nvar opt={method:'POST',body:body,headers:{'Content-Type':'application/x-www-form-urlencoded','Referer':BASE+'/','Origin':BASE}};\nreturn BASE+'/search.html,'+JSON.stringify(opt);\n})()", "weight": 0},{"bookSourceComment": "更新日志请点击登录，更新书源中查看\n\n书旗听书：登录书源后将模式切换为“听书”、来源切换为“书旗”，返回发现页长按刷新，即可使用官方“全部/男生/女生”听书发现。默认音色为 multi_role 多角色对话；详情页会显示本书可用音色及数字编号，右上角书籍变量填写编号即可切换。\n\n基础使用教程：\n1、搜索：\n    1)基础搜索：在发现页长按该书源，点击搜索，直接搜，搜索范围(全部来源小说)\n    2)进阶搜索：在登陆-书源设置中选择指定模式/来源，可搜索指定模式/来源内容\n    3)快捷搜索：使用特殊关键词(x,t,m,d,@)搜索\n         x:书名@来源  如(x:十日终焉@番茄)\n         t:书名@来源  如(t:十日终焉@番茄)\n         m:书名@来源  如(m:十日终焉@番茄)\n         d:书名@来源  如(d:十日终焉@番茄)\n         其中：x表示小说(可省略)，t表示听书，m表示漫画，d表示短剧\n         冒号支持中文英文\n         \n2、发现页：\n    在书源设置中选择指定模式或者单个来源，然后刷新发现页即可\n    \n3、更多使用方式长按发现页书源选择登录一目了然\n4、用户后台有视频教程\n         ", "bookSourceGroup": "大灰狼聚合", "bookSourceName": "自用极品书源", "bookSourceType": 0, "bookSourceUrl": "珍藏版", "bookUrlPattern": "https?:\\/\\/(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z0-9-]+(?::\\d+)?\\/detail.*", "customButton": false, "customOrder": 8, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>\nvar open_argument = source.getVariable();\nif (!open_argument || open_argument == '') {\n    var initData = {\n        tab: \"小说\",\n        tone_id: \"默认音色\",\n        shuqi_tone_id: \"multi_role\",\n        server: host[0],\n        sources: \"番茄\",\n        source_type: \"男频\",\n        find_source: \"番茄\",\n        find_tab: \"小说\",\n        fq_word_filter: \"不限\",\n        fq_status_filter: \"不限\",\n        fq_sort_filter: \"不限\",\n        fqpara: \"on\",\n        fqcommunity: \"on\",\n        pstyle: \"0\"\n    };\n    source.setVariable(JSON.stringify(initData));\n    open_argument = source.getVariable();\n}\nvar base_url = getArguments(open_argument, 'server') || host[0];\nvar ms = getArguments(open_argument, 'tone_id') || '';\nvar source_type = getArguments(open_argument, 'source_type') || '男频';\nvar tab = getArguments(open_argument, 'find_tab') || getArguments(open_argument, 'tab') || '小说';\nvar sources =  getArguments(open_argument, 'sources') || '番茄';\nvar fxyjr = getArguments(open_argument, 'fxyjr');\nvar fq_word_filter = getArguments(open_argument, 'fq_word_filter') || '不限';\nvar fq_status_filter = getArguments(open_argument, 'fq_status_filter') || '不限';\nvar fq_sort_filter = getArguments(open_argument, 'fq_sort_filter') || '不限';\n\n\nfunction checkEnv() {\n    let isModified = false;\n    try {\n        new Packages.io.legato.kazusa.utils.TimeoutCancellationException('');\n        isModified = true;\n    } catch (e) {\n        isModified = typeof source.loginUi == 'function' ? false : true;\n    }\n\n    return isModified;\n}\n\nvar islyc = checkEnv();\nlet device_type = '安卓';\ntry {\n\t  try {\n\t  java.qread();\n\t  device_type =\"轻阅读\";\n\t  } catch {\n\t  \tjava.deviceID();\n    device_type = \"苹果\";\n\t  \t}\n    \n} catch (e) {\n    try {\n        java.androidId();\n        device_type = \"安卓\";\n    } catch (e) {\n        device_type = \"安卓\";\n    }\n}\n\nvar discoverySource = String(getArguments(open_argument, 'find_source') || '').trim();\n    if (discoverySource.indexOf(',') >= 0) {\n        discoverySource = discoverySource.split(',')[0].trim();\n    }\n    // “全部”只用于搜索；发现页必须落到一个真实平台，否则选择器会显示番茄但实际仍是全部。\n    if (!discoverySource || discoverySource == '全部' || discoverySource == 'vip' || discoverySource == 'svip') {\n        discoverySource = '番茄';\n    }\n    sources = discoverySource;\n    setArguments('find_source', sources);\nvar sdtoken;\ntry {\n    var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n    sdtoken = String(loginInfoMap['手动填写番茄token(可不填)'] || '');\n} catch (e) {\n    sdtoken = '';\n}\n\nvar rawCookie = getFanqieCookie() || sdtoken;\nvar match = rawCookie.match(/sessionid=[^;]+/);\nvar fqcookie = match ? match[0] : '';\nvar fqssionid = '';\nif (!fqcookie && (sources == '番茄' || sources == '全部')) {\n    java.toast('您还未登陆番茄账号，无法同步数据哦！');\n} else {\n    fqssionid = getSessionId(fqcookie)\n}\nvar fqsjurl = base_url + \"/bookshelf?page={{page}}&ssionid=\" + fqssionid;\nvar fqtjurl = base_url + \"/fqrecommend?page={{page}}&ssionid=\" + fqssionid;\nvar fqlsurl = base_url + \"/fqhistory?page={{page}}&ssionid=\" + fqssionid;\n\nvar groupDatas = [];\nvar infoData = [ ];\nif (sources == '番茄' || sources == '全部') {\ninfoData = [{\n        \"title\": \"登录番茄\",\n        \"url\": '{\\{java.startBrowser(\"https://fanqienovel.com/\",\"番茄登录\");}}',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.45\n        }\n    }];\n}\n\nvar hasValidCookie = fqcookie.length > 0;\n\nif (hasValidCookie && (sources == '番茄' || sources == '全部')) {\n    function groupQuery() {\n        try {\n            var url = base_url + \"/group_name?ssionid=\" + fqssionid;\n            var res = java.ajax(url);\n            var response = JSON.parse(res);\n\n            if (!(response && response.data)) {}\n\n            response.data.forEach(function(group) {\n                var keys = Object.keys(group);\n                if (keys.length > 0) {\n                    var key = keys[0];\n                    var value = group[key];\n                    if (value && value.length) {\n                        var option = {\n                            \"method\": \"POST\",\n                            \"body\": {\n                                \"book_ids\": value,\n                                \"page\": \"{{page}}\"\n                            }\n                        };\n                        groupDatas.push({\n                            title: key,\n                            url: base_url + \"/bookshelf,\" + JSON.stringify(option),\n                            style: {\n                                layout_flexGrow: 1,\n                                layout_flexBasisPercent: 0.45\n                            }\n                        });\n                    }\n                }\n            });\n\n            if (groupDatas.length % 2 !== 0) {\n                groupDatas.push({\n                    title: \"--\",\n                    url: \"\",\n                    style: {\n                        layout_flexGrow: 1,\n                        layout_flexBasisPercent: 0.45\n                    }\n                });\n            }\n        } catch (e) {\n            java.longToast(\"番茄登录过期，已隐藏番茄书架\" + fqssionid);\n        }\n    }\n\n    try {\n        java.longToast(\"正在加载分组数据...\");\n        var userUrl = base_url + \"/fquser?ssionid=\" + fqssionid;\n        var userRes = java.ajax(userUrl);\n        var userData = JSON.parse(userRes);\n\n        var userName = (userData && userData.data && userData.data.name) ? userData.data.name : '未知用户';\n        if (!userName.includes('未知用户')) {\n            infoData = [{\n                title: \"番茄个人中心\",\n                url: fqsjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }, {\n                title: \"个性推荐(番茄)\",\n                url: fqtjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }, {\n                title: \"历史阅读(番茄)\",\n                url: fqlsurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }];\n        }\n        groupQuery();\n    } catch (e) {\n        java.longToast(\"番茄登录过期，已隐藏番茄书架\");\n    }\n}\n\nvar style_list = [];\ntry {\n    var durl = `${base_url}/discovestyle?source=${sources}&source_type=${source_type}&tab=${tab}`;\n    var res = java.ajax(durl);\n    var result = JSON.parse(res);\n    style_list = result.data || [];\n\n    // 番茄分类筛选只作用于小说的普通分类，不影响排行榜和其他来源。\n    if (sources == '番茄' && tab == '小说') {\n        var fqWordMap = {\n            '不限': 'word_num_default',\n            '10万字以内': 'word_num_lte10',\n            '30万字以内': 'word_num_lte30',\n            '50万字以内': 'word_num_lte50',\n            '30万字以上': 'word_num_gte30',\n            '50万字以上': 'word_num_gte50',\n            '100万字以上': 'word_num_gte100',\n            '200万字以上': 'word_num_gte200',\n            '300万字以上': 'word_num_gte300',\n            '500万字以上': 'word_num_gte500'\n        };\n        var fqStatusMap = {\n            '不限': 'creation_status_default',\n            '完结': 'creation_status_end',\n            '连载': 'creation_status_loading',\n            '半年内完结': 'creation_status_half_year_end',\n            '3日内更新': 'creation_status_3day_update',\n            '7日内更新': 'creation_status_7day_update',\n            '1月内更新': 'creation_status_1month_update'\n        };\n        var fqSortMap = {\n            '不限': 'sort_default',\n            '热门': 'sort_hot',\n            '新书': 'sort_new_book',\n            '评分': 'sort_score',\n            '字数': 'sort_word_number',\n            '有声': 'sort_audio_book'\n        };\n        var hasActiveFilter = fq_word_filter != '不限' || fq_status_filter != '不限' || fq_sort_filter != '不限';\n        if (hasActiveFilter) {\n            var selectedItems = [\n                fqWordMap[fq_word_filter] || fqWordMap['不限'],\n                fqStatusMap[fq_status_filter] || fqStatusMap['不限'],\n                fqSortMap[fq_sort_filter] || fqSortMap['不限']\n            ].join(',');\n            style_list.forEach(function(item) {\n                if (!item || typeof item.url != 'string') return;\n                var isCategory = item.url.indexOf('/get_discover?') >= 0 &&\n                    item.url.indexOf('source=番茄') >= 0 &&\n                    item.url.indexOf('&type=') >= 0 &&\n                    item.url.indexOf('&bdtype=') < 0 &&\n                    item.url.indexOf('&is_ranking=1') < 0;\n                if (isCategory && item.url.indexOf('&selected_items=') < 0) {\n                    item.url += '&selected_items=' + selectedItems;\n                }\n            });\n        }\n    }\n    if (result.msg) {\n        java.toast(result.msg);\n    }\n} catch (e) {\n    java.toast(\"发现样式获取失败\");\n}\nlet qtcookie = cookie.getCookie(base_url);\n//let qtcookie = \"\"\nlet qtop = {\n    method: \"GET\",\n    headers: {\n        cookie: qtcookie\n    },\n};\n\n\n\nqtop = JSON.stringify(qtop);\nlet qtsjurl = base_url + '/get_book_shelf,' + qtop;\n\nlet qtsj = [];\n\n// 源阅 iOS 已支持新版发现页筛选栏；此书源统一使用新版发现页。\nvar useModernExplore = true;\nif (useModernExplore) {\n    try {\n        qtsj.push(createFilter(\n            \"线路\",\n            host,\n            base_url,\n            \"server\",\n            1\n        ));\n        qtsj.push(createFilter(\n            \"模式\",\n            [\"小说\", \"听书\", \"短剧\", \"漫画\"],\n            tab,\n            \"find_tab\",\n            0.33\n        ));\n        qtsj.push(createFilter(\n            \"频道\",\n            [\"男频\", \"女频\"],\n            source_type,\n            \"source_type\",\n            0.33\n        ));\n        let source_list = ['番茄', '七猫', '书旗', '塔读', '江湖', '小米', '米读', 'QQ阅读', '酷我小说', '幻梦轻小说', '猫眼', '西瓜小说', '69书吧', '顶点', '爱下电子书', '伪69', '超会专属小说', '听小说', '阅友小说', '百度', '得间', 'QQ', '搜书神器', '得奇', '知乎', '追更人', '久久小说', '52书库', '腐小说', '完本小说', '盐选文库', '有度中文', '三零读书', '鹿鹿', '星空小说', '365小说', '冷冷文学', '万相书城', '独步小说', '福书网', '速读谷', '全本同人'];\n        if (tab == '听书') {\n            source_list = ['番茄', '七猫', '书旗', '喜马拉雅', '酷我'];\n        }\n        if (tab == '漫画') {\n            source_list = ['全免漫画', '番茄', '漫画屋', '漫画网', '漫客栈', '鸟韩漫', '新新漫画', '武芊漫画', '拷贝漫画', '漫画屋'];\n        }\n        if (tab == '短剧') {\n            source_list = ['番茄', 'YY短剧', '东梨短剧', '星芽短剧', '极速影视'];\n        }\n        qtsj.push(createFilter(\n            \"平台\",\n            source_list,\n            sources,\n            \"find_source\",\n            1\n        ));\n        if (sources == '番茄' && tab == '小说') {\n            qtsj.push(createFilter(\n                \"字数\",\n                [\"不限\", \"10万字以内\", \"30万字以内\", \"50万字以内\", \"30万字以上\", \"50万字以上\", \"100万字以上\", \"200万字以上\", \"300万字以上\", \"500万字以上\"],\n                fq_word_filter,\n                \"fq_word_filter\",\n                0.33\n            ));\n            qtsj.push(createFilter(\n                \"状态\",\n                [\"不限\", \"完结\", \"连载\", \"半年内完结\", \"3日内更新\", \"7日内更新\", \"1月内更新\"],\n                fq_status_filter,\n                \"fq_status_filter\",\n                0.33\n            ));\n            qtsj.push(createFilter(\n                \"排序\",\n                [\"不限\", \"热门\", \"新书\", \"评分\", \"字数\", \"有声\"],\n                fq_sort_filter,\n                \"fq_sort_filter\",\n                0.33\n            ));\n        }\n       const excludeTitles = ['点击登录可切换来源', '切换后长按刷新即可'];\n       style_list = style_list.filter(item => !excludeTitles.includes(item.title));\n    } catch {}\n} else {\n\tif (device_type == '安卓'){\n\tqtsj.push({\n        \"title\": \"下载阅读Sigma最新测试版\",\n        \"url\": '{\\{java.longToast(\"本书源推荐使用最新版洛娅橙改版阅读Σ\\\\n请安装后重新导入书源\");java.startBrowser(\"https://legado.langge.cf\",\"下载阅读Sigma最新测试版\");}}',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    })}\n\t}\n\nif (qtcookie) {\nqtsj.push({\n    title: \"大灰狼个人中心\",\n    url: qtsjurl,\n    style: {\n        layout_flexGrow: 1,\n        layout_flexBasisPercent: 0.45\n    }\n})\n} else {\nqtsj.push({\n    title: \"登录大灰狼书源\",\n    url: `{\\{java.startBrowser(\"${base_url}/login\",\"登录书源\");}}`,\n    style: {\n        layout_flexGrow: 1,\n        layout_flexBasisPercent: 0.45\n    }\n})\n}\n\n\nvar finalData = infoData.concat(groupDatas, style_list);\nfinalData = qtsj.concat(finalData);\nJSON.stringify(finalData);\n</js>", "header": "{ \"User-Agent\":\"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Mobile Safari/537.36 Edg/138.0.0.0\" }", "jsLib": "var host = [\n    'https://v5.langge.uk',\n    'http://219.154.201.122:5006',\n    'https://v4.langge.uk',\n    'https://v2.langge.uk',\n    'https://v7.langge.uk',\n    'https://v8.langge.uk',\n    'https://v9.langge.uk',\n    'https://v10.langge.uk'\n];\n\nfunction getArguments(open_argument, key) {\n    try {\n        open_argument = JSON.parse(open_argument);\n    } catch (e) {\n        open_argument = {\n            tab: \"小说\",\n            tone_id: \"默认音色\",\n            shuqi_tone_id: \"multi_role\",\n            server: host[0],\n            sources: \"全部\",\n            source_type: \"男频\",\n            fqpara: \"on\",\n            fqcommunity: \"on\",\n            pstyle: \"0\",\n        };\n    }\n    // 旧版本没有保存 fqpara 字段；缺失时按“开启”处理。\n    // 用户明确选择 off 时仍然保留关闭状态。\n    if (open_argument.fqpara === undefined || open_argument.fqpara === null || open_argument.fqpara === '') {\n        open_argument.fqpara = 'on';\n    }\n    if (!open_argument.shuqi_tone_id || open_argument.shuqi_tone_id === '默认音色') {\n        open_argument.shuqi_tone_id = 'multi_role';\n    }\n    if (key) {\n        return open_argument[key];\n    } else {\n        return open_argument;\n    }\n}\n\nfunction setArguments(key, value) {\n    const {\n        source\n    } = this;\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    open_argument[key] = value;\n    open_argument = JSON.stringify(open_argument);\n    source.setVariable(open_argument);\n    return open_argument;\n}\n\nfunction getFanqieCookie() {\n    var cookieManager = null;\n    try {\n        cookieManager = this.cookie;\n    } catch (e) {}\n    if (!cookieManager) {\n        try {\n            if (typeof cookie !== 'undefined') cookieManager = cookie;\n        } catch (e) {}\n    }\n    if (!cookieManager || typeof cookieManager.getCookie !== 'function') return '';\n\n    var hosts = [\n        'fanqienovel.com',\n        'https://fanqienovel.com/',\n        'https://fanqienovel.com',\n        'https://api5-normal-sinfonlinec.fqnovel.com/'\n    ];\n    var fallback = '';\n    for (var i = 0; i < hosts.length; i++) {\n        try {\n            var value = String(cookieManager.getCookie(hosts[i]) || '');\n            if (!fallback && value) fallback = value;\n            if (/(?:^|;\\s*)sessionid(?:_ss)?=/.test(value)) return value;\n        } catch (e) {}\n    }\n    return fallback;\n}\n\nfunction getSessionId(cookieValue) {\n    var value = String(cookieValue || '');\n    var match = value.match(/(?:^|;\\s*)sessionid(?:_ss)?=([^;]+)/);\n    if (!match) return '';\n    try {\n        return decodeURIComponent(match[1]);\n    } catch (e) {\n        return match[1];\n    }\n}\n\nfunction escapeFanqieCommunityText(value) {\n    return String(value || '')\n        .replace(/&/g, '&amp;')\n        .replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;')\n        .replace(/\"/g, '&quot;');\n}\n\nfunction normalizeFanqieCommunityText(value) {\n    return String(value || '').replace(/\\s+/g, ' ').trim();\n}\n\nfunction shortenFanqieCommunityText(value, maxLength) {\n    var text = normalizeFanqieCommunityText(value);\n    if (!maxLength || text.length <= maxLength) return text;\n    return text.substring(0, Math.max(1, maxLength - 1)) + '\\u2026';\n}\n\nvar FANQIE_EMOJI_PATHS = {\n    \"[微笑]\": \"/static/emoji/emoji_dr_1.png\",\n    \"[偷笑]\": \"/static/emoji/emoji_dr_2.png\",\n    \"[笑]\": \"/static/emoji/emoji_dr_3.png\",\n    \"[什么]\": \"/static/emoji/emoji_dr_4.png\",\n    \"[害羞]\": \"/static/emoji/emoji_dr_5.png\",\n    \"[爱慕]\": \"/static/emoji/emoji_dr_6.png\",\n    \"[飞吻]\": \"/static/emoji/emoji_dr_7.png\",\n    \"[奸笑]\": \"/static/emoji/emoji_dr_8.png\",\n    \"[尬笑]\": \"/static/emoji/emoji_dr_9.png\",\n    \"[思考]\": \"/static/emoji/emoji_dr_10.png\",\n    \"[撇嘴]\": \"/static/emoji/emoji_dr_11.png\",\n    \"[做鬼脸]\": \"/static/emoji/emoji_dr_12.png\",\n    \"[酷]\": \"/static/emoji/emoji_dr_13.png\",\n    \"[翻白眼]\": \"/static/emoji/emoji_dr_14.png\",\n    \"[惊呆]\": \"/static/emoji/emoji_dr_15.png\",\n    \"[震惊]\": \"/static/emoji/emoji_dr_16.png\",\n    \"[送心]\": \"/static/emoji/emoji_dr_17.png\",\n    \"[委屈]\": \"/static/emoji/emoji_dr_18.png\",\n    \"[快哭了]\": \"/static/emoji/emoji_dr_19.png\",\n    \"[笑哭]\": \"/static/emoji/emoji_dr_20.png\",\n    \"[哭]\": \"/static/emoji/emoji_dr_21.png\",\n    \"[大笑]\": \"/static/emoji/emoji_dr_22.png\",\n    \"[舔屏]\": \"/static/emoji/emoji_dr_23.png\",\n    \"[怒]\": \"/static/emoji/emoji_dr_24.png\",\n    \"[捂脸]\": \"/static/emoji/emoji_dr_25.png\",\n    \"[吐]\": \"/static/emoji/emoji_dr_26.png\",\n    \"[恐惧]\": \"/static/emoji/emoji_dr_27.png\",\n    \"[抓狂]\": \"/static/emoji/emoji_dr_28.png\",\n    \"[敬礼]\": \"/static/emoji/emoji_dr_29.png\",\n    \"[石化]\": \"/static/emoji/emoji_dr_30.png\",\n    \"[OK]\": \"/static/emoji/emoji_dr_31.png\",\n    \"[赞]\": \"/static/emoji/emoji_dr_32.png\",\n    \"[爱心]\": \"/static/emoji/emoji_dr_33.png\",\n    \"[伤心]\": \"/static/emoji/emoji_dr_34.png\",\n    \"[KISS]\": \"/static/emoji/emoji_dr_35.png\",\n    \"[懂了]\": \"/static/emoji/emoji_dr_36.png\",\n    \"[探究]\": \"/static/emoji/emoji_dr_37.png\",\n    \"[重拳出击]\": \"/static/emoji/emoji_dr_38.png\",\n    \"[吃瓜]\": \"/static/emoji/emoji_dr_39.png\",\n    \"[盯]\": \"/static/emoji/emoji_dr_40.png\",\n    \"[你细品]\": \"/static/emoji/emoji_dr_41.png\",\n    \"[赶稿中]\": \"/static/emoji/emoji_dr_42.png\",\n    \"[注意]\": \"/static/emoji/emoji_dr_43.png\",\n    \"[饱了]\": \"/static/emoji/emoji_dr_44.png\",\n    \"[码住]\": \"/static/emoji/emoji_dr_45.png\",\n    \"[学会了]\": \"/static/emoji/emoji_dr_46.png\",\n    \"[顶帖]\": \"/static/emoji/emoji_dr_47.png\",\n    \"[求爆更]\": \"/static/emoji/emoji_dr_48.png\",\n    \"[求关注]\": \"/static/emoji/emoji_dr_49.png\",\n    \"[我也强推]\": \"/static/emoji/emoji_dr_50.png\",\n    \"[雀食神作]\": \"/static/emoji/emoji_dr_51.png\",\n    \"[已种草]\": \"/static/emoji/emoji_dr_52.png\",\n    \"[书架加一]\": \"/static/emoji/emoji_dr_53.png\",\n    \"[歪头笑哭]\": \"/static/emoji/emoticon_emoji_wtxk.png\",\n    \"[神评]\": \"/static/emoji/emoticon_xiaoqi_sp.png\",\n    \"[狗头]\": \"/static/emoji/emoticon_emoji_doge.png\",\n    \"[哈哈]\": \"/static/emoji/emoticon_emoji_hhh.png\",\n    \"[流泪]\": \"/static/emoji/emoticon_emoji_tears.png\",\n    \"[可爱]\": \"/static/emoji/emoticon_emoji_cute.png\",\n    \"[色]\": \"/static/emoji/emoticon_emoji_smimi.png\",\n    \"[调皮]\": \"/static/emoji/emoticon_emoji_tpi.png\",\n    \"[小七_神评]\": \"/static/emoji/emoticon_xiaoqi_sp.png\",\n    \"[小七_狗头]\": \"/static/emoji/emoticon_xiaoqi_gt.png\",\n    \"[小七_鄙视]\": \"/static/emoji/emoticon_xiaoqi_bs.png\",\n    \"[小七_高兴]\": \"/static/emoji/emoticon_xiaoqi_gx.png\",\n    \"[小七_黑人问号]\": \"/static/emoji/emoticon_xiaoqi_hrwh.png\",\n    \"[小七_厉害]\": \"/static/emoji/emoticon_xiaoqi_lh.png\",\n    \"[小七_流泪]\": \"/static/emoji/emoticon_xiaoqi_ll.png\",\n    \"[小七_OK]\": \"/static/emoji/emoticon_xiaoqi_ok.png\",\n    \"[小七_色]\": \"/static/emoji/emoticon_xiaoqi_s.png\",\n    \"[小七_伤心]\": \"/static/emoji/emoticon_xiaoqi_sx.png\",\n    \"[小七_调皮]\": \"/static/emoji/emoticon_xiaoqi_tq.png\",\n    \"[小七_委屈]\": \"/static/emoji/emoticon_xiaoqi_wh.png\",\n    \"[小七_笑哭]\": \"/static/emoji/emoticon_xiaoqi_xk.png\",\n    \"[小七_笑嘻嘻]\": \"/static/emoji/emoticon_xiaoqi_xxy.png\",\n    \"[小七_斜眼笑]\": \"/static/emoji/emoticon_xiaoqi_xyx.png\",\n    \"[小七_赞美]\": \"/static/emoji/emoticon_xiaoqi_zm.png\",\n    \"[眯眼笑]\": \"/static/emoji/emoticon_xiaoqi_xxy.png\"\n};\n\nfunction getFanqieEmojiMap(baseUrl) {\n    var root = String(baseUrl || \"\").replace(/\\/$/, \"\");\n    var result = {};\n    Object.keys(FANQIE_EMOJI_PATHS).forEach(function(name) {\n        result[name] = root + FANQIE_EMOJI_PATHS[name];\n    });\n    return result;\n}\n\nvar FANQIE_CARD_EMOJI_TEXT = {\n    \"[微笑]\":\"😊\",\"[偷笑]\":\"😏\",\"[笑]\":\"😁\",\"[什么]\":\"🤔\",\"[害羞]\":\"😳\",\"[爱慕]\":\"😍\",\"[飞吻]\":\"😘\",\"[奸笑]\":\"😏\",\"[尬笑]\":\"😅\",\"[思考]\":\"🤔\",\"[撇嘴]\":\"😒\",\"[做鬼脸]\":\"😜\",\"[酷]\":\"😎\",\"[翻白眼]\":\"🙄\",\"[惊呆]\":\"😲\",\"[震惊]\":\"😱\",\"[送心]\":\"❤️\",\"[委屈]\":\"🥺\",\"[快哭了]\":\"😭\",\"[笑哭]\":\"😂\",\"[哭]\":\"😢\",\"[大笑]\":\"😆\",\"[舔屏]\":\"😋\",\"[怒]\":\"😡\",\"[捂脸]\":\"🤦\",\"[吐]\":\"🤮\",\"[恐惧]\":\"😨\",\"[抓狂]\":\"😫\",\"[敬礼]\":\"🫡\",\"[石化]\":\"🗿\",\"[OK]\":\"👌\",\"[赞]\":\"👍\",\"[爱心]\":\"💖\",\"[伤心]\":\"💔\",\"[KISS]\":\"💋\",\"[懂了]\":\"✅\",\"[探究]\":\"🔎\",\"[重拳出击]\":\"👊\",\"[吃瓜]\":\"🍉\",\"[盯]\":\"👀\",\"[你细品]\":\"🤌\",\"[赶稿中]\":\"✍️\",\"[注意]\":\"⚠️\",\"[饱了]\":\"😋\",\"[码住]\":\"🔖\",\"[学会了]\":\"✅\",\"[顶帖]\":\"📌\",\"[求爆更]\":\"🙏\",\"[求关注]\":\"🔔\",\"[我也强推]\":\"🚀\",\"[雀食神作]\":\"👍\",\"[已种草]\":\"🌱\",\"[书架加一]\":\"📚+1\",\"[歪头笑哭]\":\"😂\",\"[神评]\":\"🌟\",\"[狗头]\":\"🐶\",\"[哈哈]\":\"😆\",\"[流泪]\":\"😭\",\"[可爱]\":\"🥰\",\"[色]\":\"😍\",\"[调皮]\":\"😜\",\"[小七_神评]\":\"🌟\",\"[小七_狗头]\":\"🐶\",\"[小七_鄙视]\":\"😒\",\"[小七_高兴]\":\"😊\",\"[小七_黑人问号]\":\"❓\",\"[小七_厉害]\":\"👍\",\"[小七_流泪]\":\"😭\",\"[小七_OK]\":\"👌\",\"[小七_色]\":\"😍\",\"[小七_伤心]\":\"💔\",\"[小七_调皮]\":\"😜\",\"[小七_委屈]\":\"🥺\",\"[小七_笑哭]\":\"😂\",\"[小七_笑嘻嘻]\":\"😁\",\"[小七_斜眼笑]\":\"😏\",\"[小七_赞美]\":\"👏\",\"[眯眼笑]\":\"😁\"\n};\n\nfunction splitFanqieGodNoteEmojis(value, baseUrl, sources) {\n    var text = String(value || \"\").replace(/\\[[^\\[\\]]+\\]/g, function(token) {\n        return FANQIE_CARD_EMOJI_TEXT[token] || token;\n    }).replace(/\\s+/g, \" \").trim();\n    return { text: text, images: \"\" };\n}\nfunction decodeFanqieNoteText(value) {\n    return String(value || '')\n        .replace(/&#x([0-9a-f]+);/gi, function(_match, code) {\n            return String.fromCharCode(parseInt(code, 16));\n        })\n        .replace(/&#([0-9]+);/g, function(_match, code) {\n            return String.fromCharCode(parseInt(code, 10));\n        })\n        .replace(/&quot;/g, '\"')\n        .replace(/&apos;|&lsquo;|&rsquo;/g, \"'\")\n        .replace(/&lt;/g, '<')\n        .replace(/&gt;/g, '>')\n        .replace(/&amp;/g, '&');\n}\n\n// 将后端返回的 <note> 神评标签转换成阅读/源阅可渲染的 SVG 卡片。\nfunction getFanqieNoteAttribute(noteTag, name) {\n    var reg = new RegExp(name + '=\\\"([^\\\"]*)\\\"');\n    var match = String(noteTag || '').match(reg);\n    if (!match) return '';\n    try { return decodeFanqieNoteText(match[1]); } catch (e) { return match[1]; }\n}\n\nfunction cleanFanqieGodNoteText(value) {\n    var text = String(value || '')\n        .replace(/<[^>]*>/g, ' ')\n        .replace(/\\[fn=(\\d+)\\]/g, '[表情]')\n        .replace(/\\s+/g, ' ')\n        .trim();\n    return text;\n}\n\nfunction createFanqieGodNoteCard(noteTag, sources) {\n    var noteUrl = getFanqieNoteAttribute(noteTag, 'ident');\n    var rawNoteText = getFanqieNoteAttribute(noteTag, 'text');\n    var noteText = cleanFanqieGodNoteText(rawNoteText);\n    if (!noteText) return '';\n    var originMatch = String(noteUrl || '').match(/^(https?:\\/\\/[^\\/]+)/);\n    var baseUrl = originMatch ? originMatch[1] : getArguments(this.source.getVariable(), 'server');\n    var isShuqi = String(sources || '').indexOf('书旗') >= 0;\n    var jc = 'js';\n    try { if (this.checkEnv() == '改版') jc = 'click'; } catch (e) {}\n    var actionUrl = String(noteUrl || '').replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\").replace(/[\\r\\n]/g, '');\n    var title = String(sources || '番茄').replace(/'/g, '');\n    var meta = '{\"' + jc + '\":\"showCmt(\\'' + actionUrl + '\\',\\'' + title + '\\',\\'段评\\')\",\"style\":\"FULL\"}';\n    if (isShuqi) {\n        var cardUrl = String(baseUrl || '').replace(/\\/$/, '') + '/shuqi_god_card_svg?text=' + encodeURIComponent(rawNoteText) + '&v=4';\n        return '<img src=\"' + cardUrl + ',' + meta + '\">';\n    }\n    var emojiResult = splitFanqieGodNoteEmojis(rawNoteText, baseUrl, sources);\n    var displayText = shortenFanqieCommunityText(cleanFanqieGodNoteText(emojiResult.text), 27);\n    var svg = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1000\" height=\"108\" viewBox=\"0 0 1000 108\">' +\n        '<rect width=\"100%\" height=\"100%\" fill=\"rgba(255,255,255,0.55)\" rx=\"30\"/>' +\n        '<rect x=\"35\" y=\"28\" width=\"125\" height=\"52\" rx=\"16\" fill=\"#F06260\"/>' +\n        '<text x=\"97\" y=\"65\" font-size=\"32\" fill=\"#FFFFFF\" text-anchor=\"middle\" font-weight=\"bold\">神评论</text>' +\n        '<text x=\"175\" y=\"67\" font-size=\"38\" fill=\"#333333\">' + escapeFanqieCommunityText(displayText) + '</text>' +\n        '</svg>';\n    return '<img src=\"data:image/svg+xml;base64,' + this.java.base64Encode(svg) + ',' + meta + '\">';\n}\nfunction renderFanqieGodNoteCards(value, sources) {\n    var runtime = this;\n    return String(value || '').replace(/<note\\b[^>]*>(?:<\\/note>)?/g, function(noteTag) {\n        return createFanqieGodNoteCard.call(runtime, noteTag, sources) || '';\n    });\n}\nfunction checkEnv() {\n    const {\n        java,\n        source\n    } = this;\n\n    try {\n        java.qread();\n        return \"轻阅读\";\n    } catch (e) {}\n\n    try {\n        if (typeof java.reLoginView == 'function') {\n            return \"改版\";\n        }\n        new Packages.io.legato.kazusa.utils.TimeoutCancellationException('');\n        return \"改版\";\n    } catch (e) {}\n    try {\n        java.deviceID();\n        return \"苹果\";\n    } catch (e) {}\n\n    if (typeof source.loginUi == 'function') {\n        return \"安卓\";\n    }\n\n    return \"改版\";\n}\n\n// 获取番茄token\n\nfunction createGod(url,svg) {\n    var jc = 'js';\n    let islyc = this.checkEnv()\n    if (islyc == \"改版\") {\n        jc = 'click'\n    }\n   let cz= `{\"${jc}\":\"showCmt('${url}','段评' )\",\"style\":\"FULL\"}`\n\tlet img = `<img src=\"${svg},${cz}\">`\n\treturn img\n\t}\n\nlet svgs = [\"<svg t='1760002253572' class='icon' viewBox='-150 0 1224 1224' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='1490' width='800' height='800'><g transform='rotate(90 512 512) scale(1 1.2)'><path d='M224 149.333333h576c40.533333 0 74.666667 34.133333 74.666667 74.666667v460.8c0 40.533333-34.133333 74.666667-74.666667 74.666667h-108.8c-40.533333 0-78.933333 17.066667-104.533334 46.933333l-49.066666 55.466667c-4.266667 6.4-14.933333 10.666667-23.466667 10.666667-10.666667 0-19.2-4.266667-25.6-10.666667l-46.933333-55.466667c-25.6-29.866667-64-46.933333-104.533334-46.933333h-110.933333c-40.533333 0-74.666667-34.133333-74.666667-74.666667V224c0-40.533333 34.133333-74.666667 74.666667-74.666667z' fill='$tccolor' p-id='1529'></path><path d='M512 938.666667c-27.733333 0-55.466667-12.8-72.533333-34.133334l-46.933334-55.466666c-14.933333-17.066667-34.133333-25.6-57.6-25.6h-110.933333c-76.8 0-138.666667-61.866667-138.666667-138.666667V224C85.333333 147.2 147.2 85.333333 224 85.333333h573.866667c76.8 0 138.666667 61.866667 138.666666 138.666667v460.8c0 76.8-61.866667 138.666667-138.666666 138.666667h-108.8c-21.333333 0-42.666667 8.533333-55.466667 25.6l-49.066667 55.466666c-17.066667 21.333333-44.8 34.133333-72.533333 34.133334zM224 149.333333C183.466667 149.333333 149.333333 183.466667 149.333333 224v460.8c0 40.533333 34.133333 74.666667 74.666667 74.666667h110.933333c40.533333 0 78.933333 17.066667 104.533334 49.066666l46.933333 55.466667c6.4 6.4 14.933333 10.666667 25.6 10.666667 8.533333 0 19.2-4.266667 23.466667-10.666667l49.066666-55.466667c25.6-29.866667 64-46.933333 104.533334-46.933333h108.8c40.533333 0 74.666667-34.133333 74.666666-74.666667V224C874.666667 183.466667 840.533333 149.333333 800 149.333333h-576z' fill='$color' p-id='1530'></path> </g><text x='460' y='650' font-family='Arial, sans-serif' text-anchor='middle' font-size='400' fill='$fontcolor'>$displayText</text></svg>\"];\n\n\n// 创建svg\n\nfunction showFanqieComment(url, title) {\n    let { java } = this;\n    title = title || '本章说';\n    let pageUrl = String(url || '');\n    if (!pageUrl) {\n        try { java.toast('评论地址为空，请刷新本章'); } catch (e) {}\n        return;\n    }\n    let islyc = this.checkEnv();\n    try {\n        if (islyc == '轻阅读') {\n            java.startBrowserDp(pageUrl, title);\n            return;\n        }\n        if (islyc == '改版') {\n            let htmlContent = java.ajax(pageUrl);\n            java.showBrowser(\n                pageUrl,\n                htmlContent,\n                `window.java=java;`,\n                JSON.stringify({\n                    \"expandedCornersRadius\": 20,\n                    \"dismissOnTouchOutside\": true,\n                    \"isDraggable\": true,\n                    \"shouldDimBackground\": true,\n                    \"backgroundDimAmount\": 0.5,\n                    \"hardwareAccelerated\": true,\n                    \"isNestedScrollingEnabled\": true,\n                    \"isGestureInsetBottomIgnored\": true,\n                    \"setFitToContents\": true,\n                    \"isHideable\": true,\n                    \"heightPercentage\": 0.8\n                })\n            );\n            return;\n        }\n        try {\n            java.showReadingBrowser(pageUrl, title);\n            return;\n        } catch (e) {}\n        java.startBrowser(pageUrl, title);\n    } catch (e) {\n        try { java.startBrowser(pageUrl, title); } catch (err) { java.log('打开番茄评论页失败:' + err); }\n    }\n}\n\n\n// 生成本章说尾部卡片的点击协议，只负责打开官方评论聚合页，不复用段评点击逻辑。\nfunction endclick(url, title) {\n    var jc = 'js';\n    let islyc = this.checkEnv();\n    if (islyc == '改版') {\n        jc = 'click';\n    }\n    title = title || '本章说';\n    return `\"${jc}\":\"showFanqieComment('${url}','${title}')\"`;\n}\n\n\nfunction paraForAndroid(content, sources) {\n    let {\n        java,\n        cache,\n        source\n    } = this;\n    const createSvg = this.createSvg.bind(this);\n    const createGod = this.createGod.bind(this);\n    content = renderFanqieGodNoteCards.call(this, content, sources);\n     content = content.replace(\n        /<p><img ident=\"([^\"]*)\" src=\"([^\"]*)\"\\s*\\/><\\/p>/g,\n        (match, ident, src) => {\n            return `<p>${createGod(ident, src)}</p>`;\n        }\n    );\n    \n\n    return content.replace(/<p>(.*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\/>)?<\\/p>/g,\n        (match, text, url, count) => {\n            if (url && count) {\n                const click = 0;\n                cache.putMemory(url, click);\n                const encodedUrl = url;\n                return `<p>${text}<img src=\"${createSvg(count, encodedUrl,sources)}\"></p>`;\n            } else {\n                return `<p>${text}</p>`;\n            }\n        }\n    );\n}\n// 创建神评论\n\nfunction showCmt(url, sources,ident) {\n    let {\n        java,\n        cache\n    } = this;\n    if (ident == null) ident = '段评';\n    const currentTime = Date.now();\n    const click = cache.getFromMemory(url);\n    let islyc = this.checkEnv()\n    if (click < 1 && islyc == \"安卓\") {\n        cache.putMemory(url, click + 1);\n        return;\n    } else {\n        if (islyc == \"轻阅读\") {\n            java.startBrowserDp(url, sources + ident);\n        } else if (islyc == \"改版\") {\n            let paradata = new Date().toLocaleDateString();\n            let isQimaoComment = String(url || '').indexOf('/qimao_comment?') >= 0;\n            let htmlContent = isQimaoComment ? '' : cache.get(paradata+ident+\"new4\");\n            if (!htmlContent || String(htmlContent).indexOf(\"评论\") == -1) {\n                java.longToast(`\\n${paradata} 初始化${ident}页面,请稍等~`);\n                try {\n                    htmlContent = java.ajax(url);\n                } catch {\n\n                }\n\n                if (!isQimaoComment) cache.put(paradata+ident+\"new4\", htmlContent);\n                java.longToast(`\\n${paradata} 初始化${ident}页面成功~`);\n            }\n            java.showBrowser(\n                url,\n                htmlContent,\n                `window.java=java;`,\n                JSON.stringify({\n                    \"expandedCornersRadius\": 20,\n                    \"dismissOnTouchOutside\": true,\n                    \"isDraggable\": true,\n                    \"shouldDimBackground\": true,\n                    \"backgroundDimAmount\": 0.5,\n                    \"hardwareAccelerated\": true,\n                    \"isNestedScrollingEnabled\": true,\n                    \"isGestureInsetBottomIgnored\": true,\n                    \"setFitToContents\": true,\n                    \"isHideable\": true,\n                    \"heightPercentage\": 0.8\n                })\n            );\n        } else {\n            java.startBrowser(url, sources + ident);\n        }\n    }\n}\n\n//源阅段评\n\nfunction normalizeBubbleTemplateConfig(value, origin) {\n    var result = {};\n    if (!value || typeof value != 'object') return result;\n    Object.keys(value).forEach(function(key) {\n        var item = value[key];\n        var data = item && typeof item == 'object' ? item : {svg: String(item || '')};\n        var svg = String(data.svg || '');\n        var renderPath = String(data.renderPath || data.renderUrl || '');\n        if (svg.indexOf('<svg') < 0 && !renderPath) return;\n        result[String(key)] = {\n            name: String(data.name || ('样式 ' + key)),\n            type: String(data.type || (renderPath ? 'image' : 'svg')),\n            svg: svg,\n            renderPath: renderPath,\n            _origin: String(origin || '').replace(/\\/$/, '')\n        };\n    });\n    return result;\n}\n\nfunction getBubbleTemplates() {\n    var now = Date.now();\n    var memoryKey = '__bubble_templates_cache_v3__';\n    try {\n        if (this.cache && typeof this.cache.getFromMemory === 'function') {\n            var cached = String(this.cache.getFromMemory(memoryKey) || '');\n            if (cached) {\n                var memory = JSON.parse(cached);\n                if (memory && memory.templates && Object.keys(memory.templates).length && now - Number(memory.time || 0) < 30000) {\n                    return memory.templates;\n                }\n            }\n        }\n    } catch (e) {}\n    var server = String(getArguments(this.source.getVariable(), 'server') || host[0]).replace(/\\/$/, '');\n    var servers = [server].concat(host || []).filter(function(value, index, values) {\n        value = String(value || '').replace(/\\/$/, '');\n        return value && values.map(function(item) { return String(item || '').replace(/\\/$/, ''); }).indexOf(value) == index;\n    });\n    var paths = ['/api/bubbles?_=','/static/js/bubble_templates.json?_='];\n    for (var i = 0; i < servers.length; i++) {\n        var currentServer = String(servers[i]).replace(/\\/$/, '');\n        for (var pathIndex = 0; pathIndex < paths.length; pathIndex++) {\n            try {\n                var raw = String(this.java.ajax(currentServer + paths[pathIndex] + now) || '{}');\n                var templates = normalizeBubbleTemplateConfig(JSON.parse(raw), currentServer);\n                if (Object.keys(templates).length) {\n                    try {\n                        if (this.cache && typeof this.cache.putMemory === 'function') {\n                            this.cache.putMemory(memoryKey, JSON.stringify({ time: now, templates: templates }));\n                        }\n                    } catch (e) {}\n                    return templates;\n                }\n            } catch (e) {\n                try { this.java.log('气泡模板加载失败: ' + e); } catch (_) {}\n            }\n        }\n    }\n    var fallback = {\n        '0': {name: '经典气泡', type: 'svg', svg: svgs[0], renderPath: '', _origin: server}\n    };\n    try {\n        if (this.cache && typeof this.cache.putMemory === 'function') {\n            this.cache.putMemory(memoryKey, JSON.stringify({ time: now, templates: fallback }));\n        }\n    } catch (e) {}\n    return fallback;\n}\n\nfunction createSvg(number, encodedUrl, sources) {\n    var displayText = number > 99 ? \"99+\" : number.toString();\n    let configuredColor = '';\n    try {\n        configuredColor = String(getArguments(this.source.getVariable(), \"plcolor\") || '').trim();\n    } catch (e) {}\n    let plcolor = /^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(configuredColor) ? configuredColor : \"#A7A7A7\";\n    let bubbleStyle = String(getArguments(this.source.getVariable(), 'pstyle') || '0');\n    let templates = getBubbleTemplates.call(this);\n    if (!templates[bubbleStyle]) bubbleStyle = Object.keys(templates)[0] || '0';\n    let selectedTemplate = templates[bubbleStyle] || templates['0'];\n    var jc = 'js';\n    let islyc = this.checkEnv();\n    if (islyc == \"改版\") jc = 'click';\n    let style = 'text';\n    var action = '{\"' + jc + '\":\"showCmt(\\'' + encodedUrl + '\\', \\'' + sources + '\\' ,\\'段评\\')\",\"style\":\"' + style + '\"}';\n\n    if (selectedTemplate && selectedTemplate.renderPath) {\n        var renderPath = String(selectedTemplate.renderPath || '');\n        var renderUrl = /^https?:\\/\\//i.test(renderPath)\n            ? renderPath\n            : String(selectedTemplate._origin || getArguments(this.source.getVariable(), 'server') || host[0]).replace(/\\/$/, '') + (renderPath.charAt(0) == '/' ? renderPath : '/' + renderPath);\n        renderUrl += (renderUrl.indexOf('?') >= 0 ? '&' : '?') + 'count=' + encodeURIComponent(displayText) + '&color=' + encodeURIComponent(plcolor);\n        return renderUrl + ',' + action;\n    }\n\n    let color = plcolor;\n    let tccolor = 'transparent';\n    let fontcolor = plcolor;\n    let svg = selectedTemplate && selectedTemplate.svg ? selectedTemplate.svg : svgs[0];\n    svg = svg.replace(/\\{\\{color\\}\\}/g, color)\n        .replace(/\\{\\{tccolor\\}\\}/g, tccolor)\n        .replace(/\\{\\{count\\}\\}/g, displayText)\n        .replace(/\\$color/g, color)\n        .replace(/\\$tccolor/g, tccolor)\n        .replace(/\\$fontcolor/g, fontcolor)\n        .replace(/\\$displayText/g, displayText);\n    var encodedSvg = this.java.base64Encode(svg);\n    return 'data:image/svg+xml;base64,' + encodedSvg + ',' + action;\n}\n\n\n// 显示弹窗\n\n\n\nvar CompatibilityUtils = {\n    hasJavaClass: function(className) {\n        try {\n            var parts = className.split('.');\n            var obj = Packages;\n            for (var i = 0; i < parts.length; i++) {\n                obj = obj[parts[i]];\n                if (!obj) return false;\n            }\n            return true;\n        } catch (e) {\n            return false;\n        }\n    },\n    \n    safeImport: function(javaImport) {\n        var classes = [\n            'android.util.Base64',\n            'java.lang.String', \n            'java.net.URL',\n            'okhttp3.HttpUrl'\n        ];\n        \n        classes.forEach(function(className) {\n            if (this.hasJavaClass(className)) {\n                try {\n                    var classObj = eval('Packages.' + className);\n                    javaImport.importClass(classObj);\n                } catch (e) {\n                    java.log('无法导入类: ' + className);\n                }\n            }\n        }.bind(this));\n        \n        return javaImport;\n    }\n};\n\n\nvar javaImport = CompatibilityUtils.safeImport(new JavaImporter());\n\nwith(javaImport) {\n    \n\n    function getSubDomain(url) {\n        let baseUrl = getBaseUrl(url);\n        if (!baseUrl) {\n            return url;\n        }\n        try {\n            let mURL = URL(baseUrl);\n            let host = mURL.host;\n            if (isIPAddress(host)) return host;\n            return HttpUrl.parse(baseUrl).topPrivateDomain() || host;\n        } catch (e) {\n            this.java.log(e);\n            return baseUrl;\n        }\n    }\n\n    function getDomain(url) {\n        let baseUrl = getBaseUrl(url);\n        if (!baseUrl) {\n            return url;\n        }\n        try {\n            return URL(baseUrl).host;\n        } catch (e) {\n            return baseUrl;\n        }\n    }\n    /**\n     * 移除cookie\n     */\n    function removeCookie(url) {\n        const {\n            cookie\n        } = this;\n        cookie.removeCookie(url);\n        let domains = [getDomain(url), getSubDomain(url)];\n        domains.forEach((domain) => {\n            cookie.removeCookie(domain);\n        });\n    }\n}\n\nfunction getBaseUrl(url) {\n    if (!url) {\n        return null;\n    }\n    url = String(url);\n    if (url.match(/https?:\\/\\//i)) {\n        var index = url.indexOf(\"/\", 9);\n        return index == -1 ? url : url.substring(0, index);\n    }\n    return null;\n}\n\nfunction isIPv4Address(ip) {\n    ip = String(ip);\n    let parts = ip.split(\".\");\n    if (parts.length !== 4) return false;\n\n    for (let part of parts) {\n        if (!/^\\d+$/.test(part)) return false; // 必须是数字\n        if (part.length > 1 && part[0] === \"0\") return false; // 禁止前导零\n        let num = parseInt(part, 10);\n        if (num < 0 || num > 255) return false; // 范围检查\n    }\n    return true;\n}\n\nfunction isIPv6Address(ip) {\n    ip = String(ip);\n    // 处理双冒号（最多出现一次）\n    if (ip.includes(\":::\")) return false;\n    let doubleColonCount = (ip.match(/::/g) || []).length;\n    if (doubleColonCount > 1) return false;\n\n    // 分割成组\n    let groups = ip.split(\":\");\n    let validGroupCount = 8;\n    let actualGroupCount = groups.filter((g) => g !== \"\").length;\n\n    // 验证组数\n    if (doubleColonCount === 1) {\n        if (actualGroupCount > validGroupCount - 1) return false;\n    } else {\n        if (groups.length !== validGroupCount) return false;\n    }\n\n    // 验证每组内容\n    for (let group of groups) {\n        if (group === \"\") continue; // 跳过空组（双冒号部分）\n        if (!/^[0-9a-fA-F]{1,4}$/.test(group)) return false; // 1-4位十六进制\n    }\n    return true;\n}\n\nfunction isIPAddress(input) {\n    return isIPv4Address(input) || isIPv6Address(input);\n}\n\nfunction getKey(key) {\n    let parts = key.split(\";\");\n    for (let part of parts) {\n        if (part.includes(\"qttoken\")) {\n            return part.split(\"=\")[1];\n        }\n    }\n    return \"\";\n}\n\nfunction paraForiOS(html, sources) {\n    html = renderFanqieGodNoteCards.call(this, html, sources);\n\t   let result = html.replace(\n        /<p><img ident=\"([^\"]*)\" src=\"([^\"]*)\"\\s*\\/><\\/p>/g,\n        (match, ident, src) => {\n            return `<div rs-native>${createGod(ident, src)}</div>`;\n        }\n    );\n    result = result.replace(\n        /<p>(.*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\/>)?<\\/p>/g,\n        function(match, text, url, count) {\n            if (url && count) {\n                const encodedUrl = url.replace(/&/g, '&amp;');\n                let displayCount = count;\n                const numCount = Number(count);\n                if (!isNaN(numCount) && numCount > 99) {\n                    displayCount = '99';\n                }\n                return `<div rs-native>${text}<comment count=\"${displayCount}\" onPress=\"java.showReadingBrowser('${encodedUrl}','${sources}段评')\"></div>`;\n            } else {\n                return `<div rs-native>${text}</div>`;\n            }\n        }\n    );\n    return result.replace(/&#34;/g, '\"');\n}\n\n\n\n\n//按钮切换时改变源变量并刷新发现\nfunction show(m, t) {\n    const {\n        java,\n        source\n    } = this;\n    //源变量为空时刷新发现，重置源变量\n    source.getVariable()==''?java.refreshExplore():'';//\n    var data = JSON.parse(source.getVariable());\n    //java.log(data);\n    data[t] = m;\n    if (t==\"find_tab\"){\n    \tdata[\"find_source\"]=\"番茄\";\n    \t}\n    //java.longToast(JSON.stringify(data));\n    source.setVariable(JSON.stringify(data, null, 2));\n    java.refreshExplore();\n}\n\n/**\n * 创建筛选器配置\n * @param {string} title - 筛选器标题\n * @param {string[]} chars - 选项列表\n * @param {string} defaultVal - 默认值\n * @param {string} paramKey - URL参数名\n * @param {number} size - 布局占比（0-1之间，如0.33表示33%）\n * @returns {Object} 筛选器配置对象\n */\nfunction createFilter(title, chars, defaultVal, paramKey, size) {\n    return {\n        title: title,\n        type: \"select\",\n        chars: chars,\n        default: defaultVal,\n        action: `show(infoMap['${title}'],'${paramKey}')`,\n        style: {\n            layout_flexGrow: 1,\n            layout_flexBasisPercent: size\n        }\n    };\n}\n\nfunction removeAllImgTags(htmlString) {\n    const imgTagRegex = /<img\\b[^>]*>|<\\/img>|<img\\b[^>]*\\/>/gi;\n    return htmlString.replace(imgTagRegex, '');\n}\n\n\n// 书旗音色使用稳定数字编号；真实Key只在请求前转换。\nvar SHUQI_TONE_OPTIONS = [\n    {number: '1', name: '多角色对话', key: 'multi_role'},\n    {number: '2', name: '双角色对话', key: 'double_role'},\n    {number: '3', name: '成熟男人', key: 'mingge'},\n    {number: '4', name: '甜美少女', key: 'yifei'},\n    {number: '5', name: '阳光青年', key: 'xiaohou'},\n    {number: '6', name: '知性主播', key: 'qianxue'},\n    {number: '7', name: '沉稳男士', key: 'SQ_M03_PB_1218_01'},\n    {number: '8', name: '温婉淑女', key: 'F1029_PB_1128'},\n    {number: '9', name: '清朗学长', key: 'SQ_iVc8TnhZXioTB52v'},\n    {number: '10', name: '清冷校花', key: 'SQ_5Oh4F5zWa8EZbWvr'},\n    {number: '11', name: '沉稳青叔', key: 'zh_male_quarkttsV1_novel_King196'},\n    {number: '12', name: '博主小帅', key: 'zh-CN-YunxiNeural'},\n    {number: '13', name: '博主小美', key: 'zh-CN-XiaochenNeural'},\n    {number: '14', name: '敏敏郡主', key: 'zhaomin'},\n    {number: '15', name: '无忌哥哥', key: 'wuji'}\n];\n\nfunction getShuqiToneOption(value) {\n    value = String(value == null ? '' : value).trim();\n    for (var i = 0; i < SHUQI_TONE_OPTIONS.length; i++) {\n        var option = SHUQI_TONE_OPTIONS[i];\n        if (value == option.number || value == option.name || value == option.key) return option;\n    }\n    return null;\n}\n\nfunction resolveShuqiToneId(value) {\n    var option = getShuqiToneOption(value);\n    return option ? option.key : String(value || 'multi_role');\n}\n\nfunction getShuqiToneNumber(value) {\n    var option = getShuqiToneOption(value);\n    return option ? option.number : String(value || '1');\n}\n\nfunction getShuqiToneName(value) {\n    var option = getShuqiToneOption(value);\n    return option ? option.name : String(value || '多角色对话');\n}\n", "lastUpdateTime": "1791091681351", "loginUi": "[\n  {\n    \"name\": \"邮箱\",\n    \"type\": \"text\"\n  },\n  {\n    \"name\": \"密码\",\n    \"type\": \"password\"\n  },\n  {\n    \"name\": \"♥登录书源\",\n    \"type\": \"button\",\n    \"action\": \"login(true)\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"🔐注册书源\",\n    \"type\": \"button\",\n    \"action\": \"register()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \" 🔚 退出登录\",\n    \"type\": \"button\",\n    \"action\": \"logout()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"🏝用户后台\",\n    \"type\": \"button\",\n    \"action\": \"loginqt()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"⚙️ 书源设置中心\",\n    \"type\": \"button\",\n    \"action\": \"openSourceSettings()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"name\": \"🔮 检测登录\",\n    \"type\": \"button\",\n    \"action\": \"checkStatus()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"☕打赏享福利\",\n    \"type\": \"button\",\n    \"action\": \"vip()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"❇️ 更新书源\",\n    \"type\": \"button\",\n    \"action\": \"renderVersionPage()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"🍅番茄登录\",\n    \"type\": \"button\",\n    \"action\": \"fq_login()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"⛔️清空设置\",\n    \"type\": \"button\",\n    \"action\": \"reCookieSettings()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"✨设置检测\",\n    \"type\": \"button\",\n    \"action\": \"applyCookieSettings()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"📌永久发布页📌\",\n    \"type\": \"button\",\n    \"action\": \"api()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \" 🗑 清除设备\",\n    \"type\": \"button\",\n    \"action\": \"clearDevice()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"🎚切换服务器\",\n    \"type\": \"button\",\n    \"action\": \"set_server()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"♻️检测当前服务器\",\n    \"type\": \"button\",\n    \"action\": \"checkNet()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"📐 使用教程\",\n    \"type\": \"button\",\n    \"action\": \"jc()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"📡 发现页兼容\",\n    \"type\": \"button\",\n    \"action\": \"fxyjr()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"自定义搜索源(多个用英文,分割)\",\n    \"type\": \"text\"\n  },\n  {\n    \"name\": \"自定义服务器(可不填)\",\n    \"type\": \"text\"\n  },\n  {\n    \"name\": \"自定义评论颜色(可不填)\",\n    \"type\": \"text\"\n  },\n  {\n    \"name\": \"手动填写番茄token(可不填)\",\n    \"type\": \"text\"\n  }\n]", "loginUrl": "// 当前书源版本号，切勿修改，否则影响更新的识别\nconst localVersion = '5.9.30';\n\nlet controlUrl = host[0];\n\nfunction login(flag) {\n    if (flag == undefined) {\n        result = JSON.parse(source.getLoginInfo())\n    } else {\n        java.longToast(\"\\n\\n💞正在登录中...\")\n        putLoginInfo(JSON.stringify(result))\n    }\n    let base_url = getArgument('server') || host[0]\n    let zdyserver = String(result['自定义服务器(可不填)']);\n    if (zdyserver.includes('http')) {\n        setArgument('server', zdyserver);\n        if (getKey(String(cookie.getCookie(base_url)))) {\n            let cookies = cookie.getCookie(base_url)\n            try {\n                cookie.removeCookie(base_url)\n            } catch (e) {}\n            cookie.setCookie(zdyserver, cookies)\n        }\n        java.toast(`\\n\\n当前服务器为自定义服务器\\n${zdyserver}\\n\\n切换服务器请先清空服务器地址中的数据`);\n    }\n    let configuredPlcolor = String(result['自定义评论颜色(可不填)'] || '').trim();\n    let plcolor = configuredPlcolor || '#A7A7A7';\n    setArgument('plcolor', plcolor);\n    let zdysources = String(result['自定义搜索源(多个用英文,分割)'] || '');\n    if (zdysources) {\n        setArgument('sources', zdysources);\n    };\n    base_url = getArgument('server')\n    let register_email = String(result['邮箱'] || '').trim()\n    let password = String(result['密码'] || '').trim()\n    let key = String(result['密钥'] || '').trim()\n    if (key === 'undefined' || key === 'null') key = ''\n\n    // 主动点击登录时，邮箱或密码为空不允许使用残留密钥登录。\n    if (flag && (!register_email || !password)) {\n        try {\n            if (result && typeof result === 'object') {\n                delete result['密钥'];\n                putLoginInfo(JSON.stringify(result));\n            }\n        } catch (e) {}\n        java.toast(\"\\n\\n⛔️请先填写邮箱和密码\");\n        return;\n    }\n\n    if ((register_email && password || key) && !String(getKey(String(cookie.getCookie(base_url))))) {\n        try {\n            cookie.removeCookie(base_url)\n        } catch (e) {}\n        let deviceKey = '';\n        try {\n            deviceKey = java.deviceID();\n        } catch (e) {\n            deviceKey = java.androidId();\n        };\n        let deviceId = deviceKey;\n        if (register_email && password) {\n            let options = JSON.stringify({\n                method: 'POST',\n                headers: {\n                    'Content-Type': 'application/json'\n                },\n                body: JSON.stringify({\n                    register_email: result['邮箱'],\n                    password: result['密码']\n                })\n            })\n            try {\n                let data = JSON.parse(java.ajax(`${base_url}/login_api,${options}`))\n                if (data.code == 0) {\n                    //java.toast(deviceId)\n                    java.toast(\"\\n\\n✅️登录成功\")\n                    cookie.setCookie(base_url, `qttoken=${data.key};deviceId=${deviceId}`);\n                    for (var _h = 0; _h < host.length; _h++) { try { cookie.setCookie(host[_h], `qttoken=${data.key};deviceId=${deviceId}`); } catch(_e){} }\n                    result['密钥'] = data.key\n                    setArgument('qttoken', data.key);\n                    putLoginInfo(JSON.stringify(result))\n                } else {\n                    java.toast('\\n\\n💔' + data.msg || \"登录失败，请重试！\")\n                }\n            } catch (e) {\n                java.toast(\"\\n\\n💔登录失败，请重试！\\n\" + e.message)\n            }\n        } else {\n            cookie.setCookie(base_url, `qttoken=${key};deviceId=${deviceId}`)\n            let res = java.ajax(`${base_url}/user_api,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n            try {\n                res = JSON.parse(res)\n                if (res.id != undefined) {\n                    setArgument('qttoken', key);\n                    java.toast('\\n\\n密钥登录成功')\n                    result['邮箱'] = res.email\n                    putLoginInfo(JSON.stringify(result))\n                } else {\n                    throw new Error()\n                }\n            } catch (e) {\n                java.log(e)\n                java.toast(\"\\n\\n💔登录失败\")\n            }\n        }\n    } else if (flag && String(getKey(String(cookie.getCookie(base_url))))) {\n        java.toast(\"\\n\\n当前✅️已登录，请🚫退出登录后重新登录\");\n        //checkStatus();\n    } else if (flag) {\n        java.toast(\"\\n\\n⛔️请先填写邮箱和密码\");\n    }\n}\n\n\n\n\n\nfunction applyCookieSettings() {\n    let controlUrla = getArgument('controlUrl') || controlUrl;\n    var cookieStr = String(cookie.getCookie(controlUrla));\n\n    var cookieData = {};\n    if (cookieStr && cookieStr !== 'null' && cookieStr !== 'undefined' && cookieStr !== '') {\n        var pairs = cookieStr.split('; ');\n        for (var i = 0; i < pairs.length; i++) {\n            var pair = pairs[i];\n            var eqIndex = pair.indexOf('=');\n            if (eqIndex > -1) {\n                var key = pair.substring(0, eqIndex).trim();\n                var value = decodeURIComponent(pair.substring(eqIndex + 1).trim());\n                cookieData[key] = value;\n            }\n        }\n    }\n\n    var displayConfig = [{\n            key: 'server',\n            label: '服务器',\n            defaultValue: host[0]\n        },\n        {\n            key: 'proxy',\n            label: '访问模式',\n            defaultValue: '云端'\n        },\n        {\n            key: 'tab',\n            label: '阅读模式',\n            defaultValue: '小说'\n        },\n        {\n            key: 'fqcommunity',\n            label: '本章说',\n            defaultValue: 'on'\n        },\n        {\n            key: 'sources',\n            label: '书源选择',\n            defaultValue: '全部'\n        },\n        {\n            key: 'fqpara',\n            label: '段评显示',\n            defaultValue: 'on'\n        },\n        {\n            key: 'disabled_sources',\n            label: '强制搜索',\n            defaultValue: '0'\n        },\n        {\n            key: 'reading',\n            label: '同步书架',\n            defaultValue: '0'\n        },\n        {\n            key: 'info',\n            label: '完整简介',\n            defaultValue: 'on'\n        }\n    ];\n\n    var valueMap = {\n        // 访问模式\n        '本地': '💻 本地',\n        '云端': '☁️ 云端',\n\n        // 开关状态\n        'on': '✅ 开启',\n        'off': '❌ 关闭',\n        '1': '✅ 开启',\n        '0': '❌ 关闭',\n\n        // 频道类型\n        '男频': '👨 男频',\n        '女频': '👩 女频',\n\n        // 内容类型\n        '小说': '📖 小说',\n        '听书': '🎧 听书',\n        '漫画': '🎨 漫画',\n        '短剧': '🎬 短剧',\n\n        // 来源类型\n        'vip': '💎 VIP专属',\n        'svip': '👑 SVIP专属',\n        '推荐': '⭐ 网友推荐',\n        '全部': '📚 全部'\n    };\n\n\n    var displayLines = [];\n\n    for (var i = 0; i < displayConfig.length; i++) {\n        var config = displayConfig[i];\n        var argumentValue = getArgument(config.key);\n        var cookieValue = cookieData[config.key];\n        var value = argumentValue || cookieValue || config.defaultValue;\n\n        // 检测只补齐缺失配置，不能用旧 Cookie 覆盖用户当前选择。\n        if (!argumentValue) {\n            setArgument(config.key, cookieValue || config.defaultValue);\n        }\n\n        var displayValue = valueMap[value] || value;\n        if (config.key === 'sources' && displayValue.length > 25) {\n            displayValue = displayValue.substring(0, 25) + '...';\n        }\n\n        displayLines.push(config.label + ': ' + displayValue);\n    }\n\n    // 构建提示模板\n    var template = '✨ 当前配置\\n';\n    template += '━━━━━━━━━━━━━━━━\\n';\n    template += displayLines.join('\\n');\n    template += '\\n━━━━━━━━━━━━━━━━\\n';\n    template += '❤️当前应用的 *⚙️长按书源登录设置* 中的配置哦❤️'\n\n    // 显示提示\n    java.longToast(template);\n\n    return displayLines.length;\n}\n\n\nfunction reCookieSettings() {\n    var current = {};\n    try {\n        current = JSON.parse(String(source.getVariable() || '{}'));\n    } catch (e) {}\n\n    // 恢复书源默认配置；搜索默认全部来源，发现页默认番茄。\n    var defaults = {\n        _settings_version: 1,\n        server: host[0],\n        controlUrl: controlUrl,\n        tab: '小说',\n        sources: '全部',\n        find_tab: '小说',\n        find_source: '番茄',\n        source_type: '男频',\n        proxy: '云端',\n        tone_id: '默认音色',\n        shuqi_tone_id: 'multi_role',\n        fq_word_filter: '不限',\n        fq_status_filter: '不限',\n        fq_sort_filter: '不限',\n        fqpara: 'on',\n        fqcommunity: 'on',\n        reading: '0',\n        info: 'on',\n        close_img: 'off',\n        disabled_sources: '0',\n        fxyjr: 'off',\n        plcolor: '#A7A7A7',\n        pstyle: '0'\n    };\n\n    // 登录信息独立保存；源变量中的登录密钥也必须保留。\n    if (current && current.qttoken) {\n        defaults.qttoken = current.qttoken;\n    }\n    source.setVariable(JSON.stringify(defaults));\n\n    // 只清除旧设置 Cookie，不能删除 qttoken、deviceId 或番茄登录 Cookie。\n    var settingCookieKeys = [\n        'source_settings_result', 'server', 'proxy', 'tab', 'sources', 'source',\n        'media', 'find_tab', 'find_source', 'source_type', 'tone_id',\n        'shuqi_tone_id', 'fq_word_filter', 'fq_status_filter', 'fq_sort_filter',\n        'fqpara', 'fqcommunity', 'reading', 'info', 'close_img',\n        'disabled_sources', 'fxyjr', 'plcolor', 'pstyle'\n    ];\n    for (var i = 0; i < settingCookieKeys.length; i++) {\n        try {\n            cookie.setCookie(controlUrl, settingCookieKeys[i] + '=; Max-Age=0; Path=/');\n        } catch (e) {}\n    }\n\n    applyCookieSettings();\n    try { java.refreshExplore(); } catch (e) {}\n}\n// 检测服务器\nfunction checkNet() {\n    let url = getArgument('server');\n    java.longToast(`\\n\\n♻️正在检测：${url}\\n请稍等~`);\n    let date1 = new Date().getTime();\n    let html = java.ajax(url + '/health');\n    let date2 = new Date().getTime();\n    let t = date2 - date1;\n    let res = {};\n    try {\n        res = JSON.parse(html);\n    } catch {}\n    let c = res.status != \"healthy\";\n    let code = 1;\n    let time = t / 1000 + 's';\n    let logTime = '【' + url + '】\\n┋┋\\n' + '解析时间：' + time;\n    if (c || t > 5000) {\n        java.longToast('\\n💔【访问失败提示】\\n' + '┏┅━┅━┅━┅━┅┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♣️当前接口无法访问(可能被墙)♣️\\n┋┋\\n请切换其他接口/切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅┅━┅━┅┛');\n    } else if (t < 1000) {\n        java.longToast('\\n💖【网络环境优良】\\n' + '┏┅━┅━┅━┅━┅┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n❤️延迟低，推荐使用此接口❤️\\n┋┋\\n网络环境优良，请继续保持状态\\n┋┋' + '\\n┗┅━┅━┅━┅━┅┅━┅━┅┛');\n    } else if (t >= 1000 && t < 2000) {\n        java.longToast('\\n💛【网络环境一般】\\n' + '┏┅━┅━┅━┅━┅┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♦️延迟一般，勉强可使用♦️\\n┋┋\\n请切换其他接口或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅┅━┅━┅┛');\n    } else if (t >= 2000 && t < 5000) {\n        java.longToast('\\n💔【网络环境堪忧】\\n' + '┏┅━┅━┅━┅━┅┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♠延迟过高，不建议使用♠\\n┋┋\\n请切换其他接口或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅┅━┅━┅┛');\n    }\n}\n\n\n\n\nfunction isVips(res) {\n    let isVIP = '';\n    let vipEndTime = res.vip_end_time;\n    let formattedDate = '';\n\n    if (vipEndTime && vipEndTime !== 0) {\n        let date = new Date(vipEndTime * 1000);\n        formattedDate = `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;\n        let currentTime = Math.floor(Date.now() / 1000);\n        let remainingDays = Math.ceil((vipEndTime - currentTime) / (24 * 60 * 60));\n        if (currentTime > vipEndTime) {\n            isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} (已过期)`;\n        } else if (remainingDays <= 7) {\n            isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} 剩余${remainingDays}天`;\n        } else {\n            if (vipEndTime < 1912946812) {\n                isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"}(${formattedDate})`;\n            } else {\n                isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} (永久)`;\n            }\n        }\n    } else {\n        isVIP = '您尚未开通VIP';\n    }\n    return isVIP;\n}\n\nfunction checkStatus() {\n    java.longToast('\\n\\n♻️检测中...');\n    let base_url = getArgument('server')\n    let res = java.ajax(`${base_url}/user_api,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n    try {\n        res = JSON.parse(res)\n        if (res.id != undefined) {\n            result['邮箱'] = res.email\n            putLoginInfo(JSON.stringify(result))\n            let devices\n            try {\n                devices = Object.keys(JSON.parse(res.device)).length;\n            } catch (e) {\n                devices = res.device ? 1 : 0;\n            }\n            let isVip = isVips(res);\n            tips = `\n┏┅┅┅┅┅┅┱┄┄┄┄┄┄┄┄┄┄┐\n　 🧢昵称 　　　　${res.nickname.padEnd(20,\"\\t\") || \"未设置\".padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　✉️邮箱　　　　${res.email.replace(/(.{3}).*?@/,\"$1***@\").padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　🔑密钥　　　　${(`${res.user_key.substring(0,4)}***${res.user_key.slice(-4)}`).padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　📅注册时间　　${java.timeFormat(res.register_time*1000).padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　🗒️今日阅读　　${(java.timeFormat(new Date()).slice(0,10)==java.timeFormat(res.last_read_time * 1000).slice(0,10)?res.day_read_count:0).toString().padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　📚累计阅读　　${res.all_read_count.toString().padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　🕓最后阅读　　${(res.last_read_time != 0?java.timeFormat(res.last_read_time * 1000):'未阅读').padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　📱在线设备　　${devices.toString().padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　👑会员状态　　${isVip.padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　🚫封禁状态　　${res.is_banned?'已封禁':'正常　'}　　　　　　　\n┗┅┅┅┅┅┅┹┄┄┄┄┄┄┄┄┄┄┘\n`\n            java.log(tips)\n            java.longToast(tips)\n        } else {\n            throw new Error(res.msg)\n        }\n    } catch (e) {\n        //java.log(e)\n        java.toast(\"\\n检测登录失败\\n\" + e.message)\n    }\n}\n\nfunction clearDevice() {\n    let base_url = getArgument('server')\n    let res = java.ajax(`${base_url}/clear,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n    res = JSON.parse(res);\n    java.toast(res.code == 0 ? \"\\n\\n📴设备清除成功\" : res.msg)\n    Packages.java.lang.Thread.sleep(500)\n    checkStatus()\n}\n// 保存登录UI信息\nfunction putLoginInfo(info) {\n    try {\n        let key = java.androidId()\n        let encodeStr = Packages.android.util.Base64.encodeToString(java.createSymmetricCrypto(\"AES\", key).encrypt(info), 2)\n        cache.put(`userInfo_${source.getKey()}`, encodeStr)\n        return true\n    } catch (e) {\n        java.log(e)\n        return source.putLoginInfo(info)\n    }\n}\n\n// 用户后台\nfunction loginqt() {\n    let base_url = String(getArgument('server') || '').replace(/\\/+$/, '');\n    let ck = String(cookie.getKey(base_url, \"qttoken\"));\n    if (!ck) {\n        java.longToast('\\n\\n🚫请先登录!')\n        return;\n    }\n\n    // 阅读器与网页使用不同 Cookie 容器，先换取一次性交接码再打开网页。\n    try {\n        let deviceId = String(cookie.getKey(base_url, \"deviceId\") || '');\n        let options = JSON.stringify({\n            method: 'POST',\n            headers: {'Content-Type': 'application/json'},\n            body: JSON.stringify({qttoken: ck, deviceId: deviceId})\n        });\n        let response = JSON.parse(java.ajax(base_url + '/source_login_handoff,' + options));\n        if (response && response.code == 0 && response.handoff) {\n            let handoffUrl = base_url + '/source_login_handoff?code=' + encodeURIComponent(response.handoff);\n            java.startBrowserAwait(handoffUrl, '大灰狼小说后台');\n        } else {\n            java.longToast('\\n\\n🚫登录状态已失效，请重新登录!');\n        }\n    } catch (e) {\n        java.log('用户后台登录交接失败: ' + e);\n        java.longToast('\\n\\n🚫暂时无法打开用户后台，请稍后重试!');\n    }\n}\n\n\n// 用户注册\nfunction register() {\n    let base_url = getArgument('server');\n    java.startBrowserAwait(getArgument('server') + '/register', '大灰狼小说注册');\n}\n\n//登录番茄\nfunction fq_login() {\n    try {\n        cookie.removeCookie(\"snssdk.com\");\n        cookie.removeCookie(\"fanqienovel.com\")\n    } catch (e) {}\n    try {\n        java.startBrowserAwait(\"https://fanqienovel.com/\", \"登录\")\n    } catch (e) {\n        java.toast(e)\n    }\n    var cookie_ = \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : source.getLoginInfoMap()['手动登录Token'])\n    let user\n    try {\n        user = JSON.parse(java.ajax(\"https://fanqienovel.com/api/user/info/v2,\" + JSON.stringify({\n            method: \"GET\",\n            headers: {\n                \"Cookie\": cookie_\n            }\n        }))).data.name\n    } catch (e) {\n        java.log(e)\n    }\n    if (!cookie_ || cookie_ == \"sessionid=\" || !user) {\n        java.toast(\"未获取到登录凭据，登录失败\")\n        return false\n    }\n    java.toast(\"\\n\\n欢迎 \" + user + \"\\n登录成功！\")\n    return true\n}\n\n//退出登录\nfunction logout() {\n    // 登录成功时 token 会同步到所有线路，退出时必须逐个清除，避免切换线路后仍保持登录。\n    var servers = [];\n    try {\n        servers = Array.isArray(host) ? host.slice() : [];\n    } catch (e) {}\n    try {\n        var currentServer = String(getArgument('server') || '').trim();\n        if (currentServer) servers.push(currentServer);\n    } catch (e) {}\n\n    var seenServers = {};\n    for (var i = 0; i < servers.length; i++) {\n        var server = String(servers[i] || '').trim().replace(/\\/+$/, '');\n        if (!server || seenServers[server]) continue;\n        seenServers[server] = true;\n        try { cookie.removeCookie(server); } catch (e) {}\n        try { cookie.removeCookie(server + '/'); } catch (e) {}\n    }\n\n    // 清除可能按域名保存的第三方登录状态。\n    var domains = [\n        'fanqienovel.com', 'snssdk.com', '69shuba.com',\n        'langge.uk', 'langge.tk', 'langge.cf', 'doubi.tk',\n        '219.154.201.122'\n    ];\n    for (var d = 0; d < domains.length; d++) {\n        try { cookie.removeCookie(domains[d]); } catch (e) {}\n    }\n\n    // 活动 token 不应在书源变量或登录信息中继续残留；邮箱密码保留以便下次登录。\n    try {\n        var variables = JSON.parse(String(source.getVariable() || '{}'));\n        if (variables && typeof variables === 'object') {\n            delete variables.qttoken;\n            delete variables['密钥'];\n            source.setVariable(JSON.stringify(variables));\n        }\n    } catch (e) {}\n    try {\n        var loginInfo = {};\n        try { loginInfo = JSON.parse(String(source.getLoginInfo() || '{}')); } catch (e) {}\n        if (result && typeof result === 'object') {\n            for (var loginField in result) loginInfo[loginField] = result[loginField];\n        }\n        if (loginInfo && typeof loginInfo === 'object') {\n            delete loginInfo['密钥'];\n            delete loginInfo.qttoken;\n            putLoginInfo(JSON.stringify(loginInfo));\n        }\n    } catch (e) {}\n\n    java.toast(\"退出登录成功\");\n}\n\n//获取参数\nfunction getArgument(key) {\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    return open_argument[key];\n}\n\n//设置参数\nfunction setArgument(key, value) {\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    open_argument[key] = value;\n    open_argument = JSON.stringify(open_argument);\n    source.setVariable(open_argument);\n    return open_argument;\n}\n\n// 设置本地or云端访问\n\n\n\n\n\n//设置男女频\n\n\n\n\nfunction fxyjr() {\n    let fxyjr = getArgument('fxyjr');\n    if (fxyjr != 'on') {\n        setArgument('fxyjr', 'on');\n        try { java.refreshExplore(); } catch (e) {}\n        java.longToast('\\n显示旧版发现页');\n    } else {\n        setArgument('fxyjr', 'off');\n        try { java.refreshExplore(); } catch (e) {}\n        java.longToast('\\n显示新版发现页');\n    }\n}\n\n\n//设置男女频\n\n\n\n\n//首页\n//首页\nfunction api() {\n    java.startBrowserAwait('http://svip.langge.uk', \"首页\");\n}\n\n//打赏\nfunction vip() {\n    let base_url = getArgument('server');\n    let ck = String(cookie.getKey(base_url, \"qttoken\"));\n    if (!ck) {\n        java.longToast('\\n\\n🚫请先登录!')\n    } else {\n        java.startBrowserAwait(getArgument('server') + '/coffee', '大灰狼小说会员开通');\n    }\n}\n\n\n//设置搜索媒体\n\n\n//获取搜索媒体\n\n\n\n//设置服务器\nfunction set_server() {\n    putLoginInfo(JSON.stringify(result))\n    let zdyserver;\n    let base_url = getArgument('server')\n    try {\n        zdyserver = String(result['自定义服务器(可不填)']);\n        if (zdyserver.includes('http')) {\n            setArgument('server', zdyserver);\n            if (getKey(String(cookie.getCookie(base_url)))) {\n                let cookies = cookie.getCookie(base_url)\n                try {\n                    cookie.removeCookie(base_url)\n                } catch (e) {}\n                cookie.setCookie(zdyserver, cookies)\n            }\n            java.toast(`\\n\\n当前服务器为自定义服务器\\n${zdyserver}\\n\\n切换服务器请先清空服务器地址中的数据`);\n        } else {\n            zdyserver = '';\n        }\n    } catch (error) {\n        zdyserver = '';\n    }\n    if (!zdyserver) {\n        const servers = host\n        const currentServer = getArgument('server') || '';\n        const currentIndex = servers.indexOf(currentServer);\n\n        const nextIndex = currentIndex >= 0 ? (currentIndex + 1) % servers.length : 0;\n        const nextServer = servers[nextIndex];\n\n        setArgument('server', nextServer);\n        if (getKey(String(cookie.getCookie(currentServer)))) {\n            let cookies = cookie.getCookie(currentServer)\n            try {\n                cookie.removeCookie(currentServer)\n            } catch (e) {}\n            cookie.setCookie(nextServer, cookies)\n        }\n        java.longToast(`\\n\\n服务器【${nextIndex+1}】：${nextServer}`);\n    }\n}\n\n\n\n\n\n\n\n//获取其他听书来源音色\nvar tone_id = getArgument('tone_id');\n\n\n\n\n//设置来源\n\n\n// 设置简介\n\n\n// 番茄段评\n\n\n// 番茄正文末尾的本章说开关\n\n\n// 强制搜索被禁用的源\n\n\n// 我要推荐\n\n\n\n// 使用教程\nfunction jc(){\n\t  let html = `<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>使用教程</title>\n    <style>\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n        }\n\n        body {\n            background-color: #f5f5f5;\n            padding: 20px;\n        }\n\n        .container {\n            max-width: 800px;\n            margin: 0 auto;\n        }\n\n        h1 {\n            text-align: center;\n            color: #333;\n            margin-bottom: 30px;\n            padding-bottom: 10px;\n            border-bottom: 2px solid #4CAF50;\n        }\n\n        .tutorial-card {\n            background-color: white;\n            border-radius: 8px;\n            box-shadow: 0 2px 15px rgba(0, 0, 0, 0.1);\n            padding: 25px;\n            margin-bottom: 25px;\n            transition: transform 0.3s ease, box-shadow 0.3s ease;\n        }\n\n        .tutorial-card:hover {\n            transform: translateY(-5px);\n            box-shadow: 0 5px 20px rgba(0, 0, 0, 0.15);\n        }\n\n        .card-title {\n            color: #4CAF50;\n            margin-bottom: 15px;\n            font-size: 1.4em;\n        }\n\n        .card-content {\n            line-height: 1.6;\n            color: #555;\n        }\n\n        .keyword-list {\n            background-color: #f9f9f9;\n            border-left: 4px solid #4CAF50;\n            padding: 15px;\n            margin-top: 15px;\n            border-radius: 0 4px 4px 0;\n            font-family: monospace;\n        }\n\n        .keyword-item {\n            margin-bottom: 8px;\n        }\n    </style>\n</head>\n<body>\n    <div class=\"container\">\n        <h1>使用教程</h1>\n\n        <div class=\"tutorial-card\">\n            <h2 class=\"card-title\">搜索功能</h2>\n            <div class=\"card-content\">\n                <p><strong>1) 基础搜索：</strong>在发现页长按该书源，点击搜索，可直接搜索全部来源的小说。</p>\n                <p><strong>2) 进阶搜索：</strong>在“登陆-书源设置”中选择指定模式或来源，即可搜索指定内容。</p>\n                <p><strong>3) 快捷搜索：</strong>使用特殊关键词进行搜索。</p>\n                <div class=\"keyword-list\">\n                    <p class=\"keyword-item\">x:书名@来源 (例如: x:十日终焉@番茄)</p>\n                    <p class=\"keyword-item\">t:书名@来源 (例如: t:十日终焉@番茄)</p>\n                    <p class=\"keyword-item\">m:书名@来源 (例如: m:十日终焉@番茄)</p>\n                    <p class=\"keyword-item\">d:书名@来源 (例如: d:十日终焉@番茄)</p>\n                </div>\n                <p>其中，x表示小说（可省略），t表示听书，m表示漫画，d表示短剧。冒号支持中文和英文。</p>\n            </div>\n        </div>\n\n        <div class=\"tutorial-card\">\n            <h2 class=\"card-title\">发现页</h2>\n            <div class=\"card-content\">\n                <p>在书源设置中选择指定模式或者单个来源，然后刷新发现页即可。</p>\n            </div>\n        </div>\n\n        <div class=\"tutorial-card\">\n            <h2 class=\"card-title\">更多使用方式</h2>\n            <div class=\"card-content\">\n                <p>进入书源设置页面应该能一目了然。</p>\n            </div>\n        </div>\n    </div>\n</body>\n</html>`;\n\t  java.startBrowser(`data:text/html;base64,${java.base64Encode(html)}`, '大灰狼书源教程');\n\t}\n\n// 书源更新\nfunction renderVersionPage() {\n    let yd = '';\n    let html = `\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n  <meta charset=\"UTF-8\" />\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>书源更新</title>\n  <!-- Font Awesome 图标库 -->\n  <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css\" />\n  <style>\n    :root {\n      --primary-gradient: linear-gradient(135deg, #4e6ef2, #6b2dd8);\n      --latest-gradient: linear-gradient(135deg, #8e2de2 0%, #4a00e0 50%, #d4af37 100%);\n      --success-color: #28c76f;\n      --warning-color: #ff9f43;\n      --error-color: #ea5455;\n      --text-main: #1f2937;\n      --text-secondary: #6b7280;\n      --card-bg: #ffffff;\n      --border-color: #e5e7eb;\n      --light-bg: #f9fafb;\n      --shadow: 0 4px 12px rgba(78, 110, 242, 0.1);\n      --shadow-hover: 0 6px 18px rgba(78, 110, 242, 0.2);\n      --glow-shadow: 0 0 25px rgba(142, 45, 226, 0.5), 0 0 50px rgba(212, 175, 55, 0.3);\n      --modal-bg: rgba(31, 41, 55, 0.8);\n      --modal-content-bg: #ffffff;\n    }\n\n    * {\n      box-sizing: border-box;\n      margin: 0;\n      padding: 0;\n      font-family: 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;\n    }\n\n    body {\n      background: linear-gradient(135deg, #eef2ff, #f5f7ff);\n      color: var(--text-main);\n      min-height: 100vh;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      padding: 16px;\n    }\n\n    /* 加载动画 */\n    .loading-wrapper {\n      text-align: center;\n      animation: fadeIn 0.3s ease;\n    }\n\n    .loading-spinner {\n      width: 50px;\n      height: 50px;\n      border: 4px solid rgba(78, 110, 242, 0.3);\n      border-top-color: #4e6ef2;\n      border-radius: 50%;\n      margin: 0 auto 20px;\n      animation: spin 1s linear infinite;\n    }\n\n    .loading-text {\n      color: var(--text-main);\n      font-size: 16px;\n      font-weight: 500;\n    }\n\n    @keyframes spin {\n      to { transform: rotate(360deg); }\n    }\n\n    @keyframes fadeIn {\n      from { opacity: 0; transform: translateY(20px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n\n    @keyframes slideIn {\n      from { opacity: 0; transform: translateY(30px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n\n    @keyframes pulse {\n      0%, 100% { opacity: 1; }\n      50% { opacity: 0.7; }\n    }\n\n    @keyframes gradientAnimation {\n      0% { background-position: 0% 50%; }\n      50% { background-position: 100% 50%; }\n      100% { background-position: 0% 50%; }\n    }\n\n    @keyframes breathe {\n      0%, 100% { \n        transform: scale(1);\n        box-shadow: var(--glow-shadow), var(--shadow);\n      }\n      50% { \n        transform: scale(1.02);\n        box-shadow: 0 0 30px rgba(142, 45, 226, 0.6), 0 0 60px rgba(212, 175, 55, 0.4), var(--shadow);\n      }\n    }\n\n    @keyframes shimmer {\n      0% {\n        background-position: -200% center;\n      }\n      100% {\n        background-position: 200% center;\n      }\n    }\n\n    /* 主容器 */\n    .container {\n      width: 100%;\n      max-width: 420px;\n      background: var(--card-bg);\n      border-radius: 24px;\n      overflow: hidden;\n      box-shadow: var(--shadow);\n      position: relative;\n      z-index: 1;\n      animation: slideIn 0.5s ease;\n      display: none;\n    }\n\n    /* 头部 */\n    .header {\n      background: var(--primary-gradient);\n      color: #ffffff;\n      padding: 24px 16px;\n      text-align: center;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .header::before {\n      content: '';\n      position: absolute;\n      top: -30px;\n      left: -30px;\n      width: 80px;\n      height: 80px;\n      background: rgba(255, 255, 255, 0.15);\n      border-radius: 50%;\n    }\n\n    .header::after {\n      content: '';\n      position: absolute;\n      bottom: -60px;\n      right: -60px;\n      width: 150px;\n      height: 150px;\n      background: rgba(255, 255, 255, 0.1);\n      border-radius: 50%;\n    }\n\n    .header h1 {\n      font-size: 1.4rem;\n      font-weight: 700;\n      margin-bottom: 8px;\n      position: relative;\n      z-index: 2;\n    }\n\n    .header p {\n      font-size: 0.9rem;\n      opacity: 0.9;\n      line-height: 1.4;\n      position: relative;\n      z-index: 2;\n    }\n\n    .header-icon {\n      font-size: 48px;\n      margin-bottom: 10px;\n      display: inline-block;\n      animation: bounce 2s ease infinite;\n    }\n\n    @keyframes bounce {\n      0%, 100% { transform: translateY(0); }\n      50% { transform: translateY(-10px); }\n    }\n\n    /* 版本对比 */\n    .version-comparison {\n      display: flex;\n      flex-wrap: nowrap;\n      gap: 12px;\n      padding: 16px;\n      margin-top: 8px;\n      position: relative;\n      z-index: 10;\n    }\n\n    .version-card {\n      flex: 1;\n      min-width: 45%;\n      background: var(--card-bg);\n      border-radius: 16px;\n      padding: 28px 16px 16px;\n      box-shadow: var(--shadow);\n      text-align: center;\n      position: relative;\n      transition: transform 0.3s ease, box-shadow 0.3s ease;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n    }\n\n    .version-card:hover {\n      transform: translateY(-4px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .version-card.current-version {\n      background: linear-gradient(135deg, #ffffff 0%, #f8f9ff 100%);\n      border: 1px solid rgba(78, 110, 242, 0.15);\n    }\n\n    .version-card.current-version:hover {\n      box-shadow: 0 6px 20px rgba(78, 110, 242, 0.15);\n    }\n\n    .version-card.current-version h3,\n    .version-card.current-version .version-number,\n    .version-card.current-version .version-date {\n      color: var(--text-main);\n    }\n\n    .version-card.latest-version {\n      background: var(--latest-gradient);\n      background-size: 300% 300%;\n      box-shadow: var(--glow-shadow), var(--shadow);\n      color: #fff;\n      z-index: 2;\n      animation: gradientAnimation 6s ease infinite, breathe 3s ease-in-out infinite;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .version-card.latest-version::before {\n      content: '';\n      position: absolute;\n      top: -50%;\n      left: -50%;\n      width: 200%;\n      height: 200%;\n      background: linear-gradient(\n        90deg,\n        transparent,\n        rgba(255, 255, 255, 0.3),\n        transparent\n      );\n      transform: rotate(45deg);\n      animation: shimmer 3s infinite;\n    }\n\n    .version-card.latest-version h3,\n    .version-card.latest-version .version-number,\n    .version-card.latest-version .version-date {\n      color: #fff;\n      text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n      position: relative;\n      z-index: 1;\n    }\n\n    .version-status {\n      position: absolute;\n      top: 6px;\n      right: 6px;\n      padding: 3px 7px;\n      font-size: 0.65rem;\n      font-weight: 600;\n      border-radius: 6px;\n      color: #fff;\n      line-height: 1.2;\n      white-space: nowrap;\n      z-index: 2;\n    }\n\n    .version-card.latest-version .version-status {\n      background: rgba(255, 255, 255, 0.25);\n      backdrop-filter: blur(5px);\n      border: 1px solid rgba(255, 255, 255, 0.3);\n      color: #fff;\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n    }\n\n    .status-outdated { background: var(--warning-color); }\n    .status-latest { background: var(--success-color); }\n    .status-invalid { background: var(--error-color); }\n\n    .version-card h3 {\n      font-size: 0.9rem;\n      color: var(--text-secondary);\n      margin-bottom: 8px;\n      font-weight: 500;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 6px;\n    }\n\n    .version-number {\n      font-size: 1.25rem;\n      font-weight: 700;\n      color: var(--text-main);\n      margin: 8px 0;\n      transition: all 0.3s ease;\n      font-family: 'Courier New', monospace;\n    }\n\n    .version-card.latest-version .version-number {\n      font-size: 1.4rem;\n      transform: scale(1.05);\n      text-shadow: \n        0 2px 4px rgba(0, 0, 0, 0.3),\n        0 0 10px rgba(212, 175, 55, 0.8),\n        0 0 20px rgba(212, 175, 55, 0.5);\n      animation: pulse-glow 2s ease-in-out infinite;\n    }\n\n    @keyframes pulse-glow {\n      0%, 100% {\n        text-shadow: \n          0 2px 4px rgba(0, 0, 0, 0.3),\n          0 0 10px rgba(212, 175, 55, 0.8),\n          0 0 20px rgba(212, 175, 55, 0.5);\n      }\n      50% {\n        text-shadow: \n          0 2px 4px rgba(0, 0, 0, 0.3),\n          0 0 15px rgba(212, 175, 55, 1),\n          0 0 30px rgba(212, 175, 55, 0.7);\n      }\n    }\n\n    .version-date {\n      font-size: 0.8rem;\n      color: var(--text-secondary);\n      margin-top: 4px;\n    }\n\n    /* 版本对比指示器 */\n    .version-indicator {\n      position: absolute;\n      left: 50%;\n      top: 50%;\n      transform: translate(-50%, -50%);\n      z-index: 5;\n      width: 32px;\n      height: 32px;\n      border-radius: 50%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n      color: white;\n    }\n\n    .version-indicator.update-needed {\n      background: var(--error-color);\n      box-shadow: 0 2px 8px rgba(234, 84, 85, 0.4);\n      animation: pulse-indicator 1.5s infinite;\n    }\n\n    .version-indicator.is-latest {\n      background: var(--success-color);\n      box-shadow: 0 2px 8px rgba(40, 199, 111, 0.4);\n    }\n\n    @keyframes pulse-indicator {\n      0% { transform: translate(-50%, -50%) scale(1); }\n      50% { transform: translate(-50%, -50%) scale(1.1); }\n      100% { transform: translate(-50%, -50%) scale(1); }\n    }\n\n    /* 内容区 */\n    .content-container {\n      padding: 16px;\n    }\n\n    /* 状态提示 */\n    .status-alert {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      padding: 12px 16px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 10px;\n      font-weight: 500;\n      font-size: 14px;\n      animation: slideIn 0.5s ease 0.3s backwards;\n    }\n\n    .status-alert i {\n      font-size: 20px;\n    }\n\n    .status-alert.update-available {\n      background: linear-gradient(135deg, #ffeaa7 0%, #fdcb6e 100%);\n      color: #d63031;\n      box-shadow: 0 4px 15px rgba(253, 203, 110, 0.4);\n    }\n\n    .status-alert.up-to-date {\n      background: linear-gradient(135deg, #55efc4 0%, #00b894 100%);\n      color: white;\n      box-shadow: 0 4px 15px rgba(0, 184, 148, 0.4);\n    }\n\n    /* 更新容器 */\n    .update-container {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      animation: slideIn 0.5s ease 0.4s backwards;\n    }\n\n    .update-header {\n      background: var(--light-bg);\n      padding: 12px 16px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid var(--border-color);\n    }\n\n    .update-header h2 {\n      font-size: 1rem;\n      font-weight: 600;\n      color: var(--text-main);\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .update-header h2 i {\n      color: #4e6ef2;\n    }\n\n    .update-tag {\n      background: rgba(78, 110, 242, 0.1);\n      color: #4e6ef2;\n      padding: 4px 8px;\n      border-radius: 8px;\n      font-size: 0.75rem;\n      font-weight: 600;\n    }\n\n    .update-content {\n      padding: 16px;\n    }\n\n    .update-date {\n      font-weight: 600;\n      color: #4e6ef2;\n      margin-bottom: 12px;\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      padding: 8px 0;\n      border-bottom: 1px dashed #e0e0e0;\n    }\n\n    .update-text {\n      margin: 8px 0;\n      position: relative;\n      padding-left: 16px;\n      line-height: 1.5;\n      color: var(--text-main);\n      font-size: 0.95rem;\n      white-space: pre-wrap;\n      word-break: break-word;\n    }\n\n    .update-text::before {\n      content: '•';\n      position: absolute;\n      left: 0;\n      font-weight: bold;\n      color: #4e6ef2;\n      font-size: 1.2rem;\n      line-height: 1;\n    }\n\n    /* 历史日志 */\n    .history-container {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      animation: slideIn 0.5s ease 0.5s backwards;\n    }\n\n    .history-header {\n      background: var(--light-bg);\n      padding: 12px 16px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid var(--border-color);\n      cursor: pointer;\n      user-select: none;\n    }\n\n    .history-header:hover {\n      opacity: 0.8;\n    }\n\n    .history-header h2 {\n      font-size: 1rem;\n      font-weight: 600;\n      color: var(--text-main);\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .history-header h2 i {\n      color: #4e6ef2;\n    }\n\n    .toggle-history {\n      background: none;\n      border: none;\n      color: var(--text-secondary);\n      cursor: pointer;\n      font-weight: 500;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      font-size: 0.85rem;\n      transition: color 0.2s ease;\n    }\n\n    .toggle-history:hover {\n      color: #4e6ef2;\n    }\n\n    .history-content {\n      padding: 0 16px;\n      max-height: 0;\n      overflow: hidden;\n      transition: max-height 0.4s ease, padding 0.4s ease;\n    }\n\n    .history-content.expanded {\n      max-height: 60vh;\n      overflow-y: auto;\n      padding: 16px;\n      scrollbar-width: thin;\n      scrollbar-color: #4e6ef2 #f0f0f0;\n    }\n\n    .history-content.expanded::-webkit-scrollbar {\n      width: 6px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-track {\n      background: #f0f0f0;\n      border-radius: 4px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-thumb {\n      background: #4e6ef2;\n      border-radius: 4px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-thumb:hover {\n      background: #3a56d0;\n    }\n\n    .history-item {\n      margin-bottom: 16px;\n      padding-bottom: 16px;\n      border-bottom: 1px dashed var(--border-color);\n    }\n\n    .history-item:last-child {\n      border-bottom: none;\n      margin-bottom: 0;\n      padding-bottom: 0;\n    }\n\n    .history-date {\n      font-weight: 600;\n      color: var(--text-main);\n      margin-bottom: 8px;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      font-size: 0.9rem;\n      background: rgba(78, 110, 242, 0.05);\n      padding: 6px 10px;\n      border-radius: 6px;\n    }\n\n    .history-text {\n      margin: 8px 0;\n      padding-left: 16px;\n      line-height: 1.4;\n      color: var(--text-secondary);\n      position: relative;\n      font-size: 0.9rem;\n      white-space: pre-wrap;\n      word-break: break-word;\n    }\n\n    .history-text::before {\n      content: '•';\n      position: absolute;\n      left: 0;\n      color: #4e6ef2;\n      font-weight: bold;\n      font-size: 1.2rem;\n      line-height: 1;\n    }\n\n    /* 按钮组 */\n    .button-group {\n      display: flex;\n      flex-direction: column;\n      gap: 10px;\n      margin-bottom: 16px;\n    }\n\n    .button {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 10px;\n      padding: 14px 28px;\n      text-align: center;\n      font-size: 1rem;\n      border: none;\n      border-radius: 12px;\n      text-decoration: none;\n      background: var(--primary-gradient);\n      color: white;\n      font-weight: 600;\n      transition: all 0.3s ease;\n      box-shadow: var(--shadow);\n      position: relative;\n      overflow: hidden;\n      cursor: pointer;\n    }\n\n    .button i {\n      font-size: 1rem;\n    }\n\n    .button::after {\n      content: '';\n      position: absolute;\n      top: -50%;\n      left: -50%;\n      width: 200%;\n      height: 200%;\n      background: rgba(255, 255, 255, 0.1);\n      transform: rotate(30deg);\n      transition: all 0.6s ease;\n      pointer-events: none;\n    }\n\n    .button:hover {\n      transform: translateY(-3px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .button:hover::after {\n      transform: rotate(30deg) translate(20%, 20%);\n    }\n\n    .button:active {\n      transform: scale(0.95);\n    }\n\n    /* 错误状态 */\n    .error-state {\n      text-align: center;\n      padding: 40px 20px;\n      color: var(--text-main);\n    }\n\n    .error-icon {\n      font-size: 64px;\n      margin-bottom: 20px;\n      color: var(--error-color);\n    }\n\n    .error-text {\n      font-size: 16px;\n      line-height: 1.6;\n      margin-bottom: 20px;\n    }\n\n    .retry-button {\n      background: var(--primary-gradient);\n      color: white;\n      padding: 12px 30px;\n      border-radius: 12px;\n      border: none;\n      font-weight: 600;\n      cursor: pointer;\n      transition: all 0.3s ease;\n      font-size: 14px;\n      box-shadow: var(--shadow);\n    }\n\n    .retry-button:hover {\n      transform: translateY(-2px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .retry-button:active {\n      transform: scale(0.95);\n    }\n\n    /* 装饰元素 */\n    .decoration {\n      position: absolute;\n      z-index: 0;\n      pointer-events: none;\n    }\n\n    .decoration.circle {\n      width: 120px;\n      height: 120px;\n      border-radius: 50%;\n      background: rgba(107, 45, 216, 0.05);\n      top: 10%;\n      left: 10%;\n    }\n\n    .decoration.square {\n      width: 80px;\n      height: 80px;\n      transform: rotate(45deg);\n      background: rgba(78, 110, 242, 0.05);\n      bottom: 10%;\n      right: 10%;\n    }\n\n    /* 响应式 */\n    @media (max-width: 768px) {\n      body {\n        padding: 12px;\n      }\n\n      .container {\n        max-width: 100%;\n        border-radius: 20px;\n      }\n\n      .header {\n        padding: 20px 15px;\n      }\n\n      .header h1 {\n        font-size: 1.3rem;\n      }\n\n      .header-icon {\n        font-size: 40px;\n      }\n\n      .version-comparison {\n        flex-direction: row;\n        flex-wrap: nowrap;\n        gap: 10px;\n        padding: 12px;\n        margin-top: 6px;\n        overflow-x: auto;\n      }\n\n      .version-card {\n        min-width: 45%;\n        padding: 26px 12px 12px;\n      }\n\n      /* 移动端减弱呼吸动效 */\n      .version-card.latest-version {\n        animation: gradientAnimation 6s ease infinite;\n      }\n\n      .version-status {\n        top: 5px;\n        right: 5px;\n        padding: 2px 5px;\n        font-size: 0.6rem;\n      }\n\n      .version-number {\n        font-size: 1.1rem;\n      }\n\n      .version-card.latest-version .version-number {\n        font-size: 1.2rem;\n      }\n\n      .update-header h2, .history-header h2 {\n        font-size: 0.9rem;\n      }\n\n      .button {\n        padding: 12px 24px;\n        font-size: 0.95rem;\n      }\n\n      .history-content.expanded {\n        max-height: 50vh;\n        -webkit-overflow-scrolling: touch;\n      }\n    }\n\n    @media (max-width: 380px) {\n      .header h1 {\n        font-size: 1.2rem;\n      }\n\n      .version-number {\n        font-size: 1rem;\n      }\n\n      .version-card.latest-version .version-number {\n        font-size: 1.1rem;\n      }\n\n      .button {\n        padding: 11px;\n        font-size: 0.9rem;\n      }\n    }\n  </style>\n</head>\n<body>\n  <div class=\"decoration circle\"></div>\n  <div class=\"decoration square\"></div>\n\n  <div id=\"loading\" class=\"loading-wrapper\">\n    <div class=\"loading-spinner\"></div>\n    <div class=\"loading-text\"><i class=\"fas fa-search\"></i> 正在检查更新...</div>\n  </div>\n\n  <div class=\"container\" id=\"container\">\n    <div class=\"header\">\n      <div class=\"header-icon\"><i class=\"fas fa-book\"></i></div>\n      <h1>大灰狼书源更新</h1>\n      <p>推荐使用阅读Sigma版本<br>正式版可能存在兼容性问题-<a href='https://legado.langge.uk'>下载</a></p>\n    </div>\n\n    <div class=\"version-comparison\">\n      <div class=\"version-card current-version\">\n        <div class=\"version-status status-outdated\" id=\"currentStatus\">待检查</div>\n        <h3><i class=\"fas fa-cube\"></i> 当前版本</h3>\n        <div class=\"version-number\" id=\"currentVersion\">-</div>\n        <div class=\"version-date\">您的当前版本</div>\n      </div>\n\n      <div class=\"version-indicator update-needed\" id=\"versionIndicator\" style=\"display: none;\">\n        <i class=\"fas fa-arrow-right\"></i>\n      </div>\n\n      <div class=\"version-card latest-version\">\n        <div class=\"version-status status-latest\" id=\"latestStatus\">最新版本</div>\n        <h3><i class=\"fas fa-star\"></i> 最新版本</h3>\n        <div class=\"version-number\" id=\"latestVersion\">-</div>\n        <div class=\"version-date\">可用最新版本</div>\n      </div>\n    </div>\n\n    <div class=\"content-container\">\n      <div class=\"status-alert\" id=\"statusAlert\" style=\"display: none;\"></div>\n\n      <div id=\"latestLogContainer\" style=\"display: none;\">\n        <div class=\"update-container\">\n          <div class=\"update-header\">\n            <h2><i class=\"fas fa-bolt\"></i> 最新更新</h2>\n            <div class=\"update-tag\">最新发布</div>\n          </div>\n          <div class=\"update-content\">\n            <div class=\"update-date\" id=\"latestLogDate\"></div>\n            <div class=\"update-text\" id=\"latestLogContent\"></div>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"button-group\" id=\"buttonGroup\" style=\"display: none;\"></div>\n\n      <div class=\"history-container\" id=\"logs\" style=\"display: none;\">\n        <div class=\"history-header\" onclick=\"toggleLogs()\">\n          <h2><i class=\"fas fa-history\"></i> 历史更新 <span id=\"historyCount\"></span></h2>\n          <button class=\"toggle-history\" id=\"toggleButton\">\n            <span id=\"toggleText\">展开历史</span>\n            <i class=\"fas fa-chevron-down\" id=\"toggleIcon\"></i>\n          </button>\n        </div>\n        <div class=\"history-content\" id=\"logList\"></div>\n      </div>\n    </div>\n  </div>\n\n  <script>\n  let logsCollapsed = true;\n\n  function toggleLogs() {\n    logsCollapsed = !logsCollapsed;\n    const logList = document.getElementById('logList');\n    const toggleText = document.getElementById('toggleText');\n    const toggleIcon = document.getElementById('toggleIcon');\n    \n    if (logsCollapsed) {\n      logList.classList.remove('expanded');\n      toggleText.textContent = '展开历史';\n      toggleIcon.className = 'fas fa-chevron-down';\n    } else {\n      logList.classList.add('expanded');\n      toggleText.textContent = '收起历史';\n      toggleIcon.className = 'fas fa-chevron-up';\n    }\n  }\n\n  (async function() {\n    const loading = document.getElementById('loading');\n    const container = document.getElementById('container');\n    const currentVersion = document.getElementById('currentVersion');\n    const latestVersion = document.getElementById('latestVersion');\n    const currentStatus = document.getElementById('currentStatus');\n    const latestStatus = document.getElementById('latestStatus');\n    const versionIndicator = document.getElementById('versionIndicator');\n    const statusAlert = document.getElementById('statusAlert');\n    const buttonGroup = document.getElementById('buttonGroup');\n    const latestLogContainer = document.getElementById('latestLogContainer');\n    const latestLogDate = document.getElementById('latestLogDate');\n    const latestLogContent = document.getElementById('latestLogContent');\n    const logsContainer = document.getElementById('logs');\n    const logList = document.getElementById('logList');\n    const historyCount = document.getElementById('historyCount');\n\n    const localVer = '${String(localVersion)}';\n\n    // 统一的服务器配置 - 方便维护\n    const serverConfig = {\n      main: {\n        name: '主线路',\n        icon: 'rocket',\n        baseUrl: 'https://sy.langge.uk',\n        downloadPath: '/download/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup1: {\n        name: '备用线路1',\n        icon: 'box',\n        baseUrl: 'https://v2.langge.uk',\n        downloadPath: '/sy/download/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup2: {\n        name: '备用线路2',\n        icon: 'satellite',\n        baseUrl: 'https://v3.langge.tk',\n        downloadPath: '/sy/download/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup3: {\n        name: '备用线路3',\n        icon: 'link',\n        baseUrl: 'http://219.154.201.122:5006',\n        downloadPath: '/sy/download/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup4: {\n        name: '备用线路4',\n        icon: 'bolt',\n        baseUrl: 'https://v4.langge.uk',\n        downloadPath: '/sy/download/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup5: {\n        name: '备用线路5',\n        icon: 'globe',\n        baseUrl: 'https://v10.langge.uk',\n        downloadPath: '/sy/download/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup6: {\n        name: '备用线路6',\n        icon: 'broadcast-tower',\n        baseUrl: 'https://v5.langge.uk',\n        downloadPath: '/sy/download/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      }\n    };\n\n    // 版本比较函数\n    function compareVersions(vs) {\n      const normalize = (v) => {\n        return v.split('.').map(n => {\n          const num = parseInt(n, 10);\n          return isNaN(num) ? 0 : num;\n        });\n      };\n\n      const parts1 = normalize(localVer);\n      const parts2 = normalize(vs);\n      const maxLength = Math.max(parts1.length, parts2.length);\n      \n      for (let i = 0; i < maxLength; i++) {\n        const num1 = parts1[i] || 0;\n        const num2 = parts2[i] || 0;\n        if (num1 > num2) return 1;\n        if (num1 < num2) return -1;\n      }\n      return 0;\n    }\n\n    async function fetchVersionData() {\n      // 使用统一配置中除主线路外的备用线路进行版本检查\n      const serversToCheck = Object.values(serverConfig).filter(s => s.baseUrl.includes('langge.uk') || s.baseUrl.includes('219.154'));\n      \n      for (const server of serversToCheck) {\n        try {\n          const response = await fetch(server.baseUrl + '/version', { timeout: 2000 });\n          if (response.ok) {\n            return await response.json();\n          }\n        } catch (e) {\n          console.warn(\\`接口失败：\\${server.baseUrl}\\`, e);\n        }\n      }\n      throw new Error('所有更新接口都请求失败');\n    }\n\n    function showError(message) {\n      loading.innerHTML = \\`\n        <div class=\"error-state\">\n          <div class=\"error-icon\"><i class=\"fas fa-exclamation-triangle\"></i></div>\n          <div class=\"error-text\">\\${message}</div>\n          <button class=\"retry-button\" onclick=\"location.reload()\"><i class=\"fas fa-redo\"></i> 重试</button>\n        </div>\n      \\`;\n    }\n\n    try {\n      const data = await fetchVersionData();\n      const cloudVersion = String(data.version3);\n      const updateLog = data.update_log || {};\n\n      // 显示版本信息\n      currentVersion.textContent = \\`v\\${localVer}\\`;\n      latestVersion.textContent = \\`v\\${cloudVersion}\\`;\n\n      // 处理日志\n      const logEntries = Object.entries(updateLog);\n      if (logEntries.length > 0) {\n        // 显示最新日志\n        const [latestDate, latestContent] = logEntries[0];\n        latestLogDate.innerHTML = \\`<i class=\"fas fa-calendar-alt\"></i> \\${latestDate}\\`;\n        latestLogContent.textContent = latestContent;\n        latestLogContainer.style.display = 'block';\n\n        // 显示历史日志\n        if (logEntries.length > 1) {\n          const historyLogs = logEntries.slice(1);\n          historyCount.textContent = \\`(\\${historyLogs.length}条)\\`;\n          logList.innerHTML = historyLogs.map(([date, content]) => \\`\n            <div class=\"history-item\">\n              <div class=\"history-date\">\n                <i class=\"fas fa-calendar-day\"></i>\n                <span>\\${date}</span>\n              </div>\n              <div class=\"history-text\">\\${content}</div>\n            </div>\n          \\`).join('');\n          logsContainer.style.display = 'block';\n        }\n      }\n\n      // 检查更新状态\n      const compareResult = compareVersions(cloudVersion);\n      \n      // 显示版本指示器\n      versionIndicator.style.display = 'flex';\n      \n      if (compareResult === -1) {\n        // 需要更新\n        currentStatus.textContent = '待更新';\n        currentStatus.className = 'version-status status-outdated';\n        versionIndicator.className = 'version-indicator update-needed';\n        versionIndicator.innerHTML = '<i class=\"fas fa-arrow-right\"></i>';\n\n        // 使用统一配置生成下载按钮\n        buttonGroup.innerHTML = Object.values(serverConfig).map(server => {\n          const fullUrl = server.baseUrl + server.downloadPath;\n          return \\`\n            <a href=\"yuedu://booksource/importonline?src=\\${encodeURIComponent(fullUrl)}\" class=\"button\">\n              <i class=\"fas fa-\\${server.icon}\"></i>\n              <span>\\${server.name}</span>\n            </a>\n          \\`;\n        }).join('');\n        buttonGroup.style.display = 'flex';\n      } else {\n        // 已是最新版本\n        currentStatus.textContent = '最新';\n        currentStatus.className = 'version-status status-latest';\n        versionIndicator.className = 'version-indicator is-latest';\n        versionIndicator.innerHTML = '<i class=\"fas fa-check\"></i>';\n        \n        statusAlert.className = 'status-alert up-to-date';\n        statusAlert.innerHTML = '<i class=\"fas fa-check-circle\"></i> <div>您已是最新版本</div>';\n        statusAlert.style.display = 'flex';\n      }\n\n      // 显示主容器，隐藏加载\n      loading.style.display = 'none';\n      container.style.display = 'block';\n\n    } catch (err) {\n      console.error('版本检查失败：', err);\n      showError('<i class=\"fas fa-exclamation-circle\"></i> 检查更新失败，请稍后重试<br><small>' + err.message + '</small>');\n    }\n  })();\n  </script>\n</body>\n</html>\n`;\n    java.startBrowser(`data:text/html;base64,${java.base64Encode(html)}`, '大灰狼书源更新');\n}\n\n// 远程设置页面仅负责界面，用户配置仍保存在当前阅读软件的源变量中。\nfunction openSourceSettings() {\n    var current = {};\n    try {\n        current = JSON.parse(String(source.getVariable() || '{}'));\n    } catch (e) {}\n\n    if (!current || typeof current !== 'object') current = {};\n    if (!current.server) current.server = getArgument('server') || host[0];\n    if (!current.shuqi_tone_id || current.shuqi_tone_id === '默认音色') {\n        current.shuqi_tone_id = 'multi_role';\n    }\n    current.pstyle = String(current.pstyle || '0');\n\n    var settingsNonce = String(new Date().getTime()) + '_' + String(Math.floor(Math.random() * 1000000));\n    current._settings_nonce = settingsNonce;\n    var initialSettingsJson = JSON.stringify(current);\n\n    var baseUrl = String(current.server || host[0]).replace(/\\/+$/, '');\n    var settingsUrl = baseUrl + '/source-settings#config=' + encodeURIComponent(JSON.stringify(current));\n    var browserResult;\n    var body = '';\n\n    try {\n        var settingsPage = String(java.ajax(baseUrl + '/source-settings?_=' + String(new Date().getTime())) || '');\n        var stateMarker = 'let state = parseInitialState();';\n        if (settingsPage.indexOf(stateMarker) < 0) throw new Error('设置页面版本不兼容');\n\n        var injectedState = 'let state = { ...defaults, ...JSON.parse(decodeURIComponent(\"' +\n            encodeURIComponent(JSON.stringify(current)) + '\")) };';\n        settingsPage = settingsPage.replace(stateMarker, injectedState);\n\n        var relativeProbe = String.fromCharCode(96) + '$' + '{location.pathname}?probe=';\n        var absoluteProbe = String.fromCharCode(96) + baseUrl + '/source-settings?probe=';\n        settingsPage = settingsPage.replace(relativeProbe, absoluteProbe);\n        var openUrl = 'data:text/html;base64,' + java.base64Encode(settingsPage);\n        browserResult = java.startBrowserAwait(openUrl, '书源设置', false);\n\n        body = browserResult && typeof browserResult.body === 'function'\n            ? String(browserResult.body())\n            : (browserResult && browserResult.body != null ? String(browserResult.body) : String(browserResult || ''));\n    } catch (e) {\n        java.longToast('\\n当前阅读版本无法打开设置中心，原登录页设置仍可使用。\\n' + e);\n        return;\n    }\n\n    function decodeSafe(value) {\n        try {\n            return decodeURIComponent(String(value || '').trim());\n        } catch (e) {\n            return String(value || '').trim();\n        }\n    }\n\n    function parseCookieString(cookieStr) {\n        var output = {};\n        cookieStr = String(cookieStr || '');\n        if (!cookieStr || cookieStr == 'null' || cookieStr == 'undefined') return output;\n        var pairs = cookieStr.split(';');\n        for (var i = 0; i < pairs.length; i++) {\n            var pair = pairs[i];\n            var index = pair.indexOf('=');\n            if (index < 0) continue;\n            var key = decodeSafe(pair.substring(0, index));\n            var value = decodeSafe(pair.substring(index + 1));\n            output[key] = value;\n        }\n        return output;\n    }\n\n    function readSettingsResultFromBody(pageBody) {\n        var match = String(pageBody || '').match(/<script\\b[^>]*\\bid=[\"']source-settings-(?:final-)?result[\"'][^>]*>([\\s\\S]*?)<\\/script>/i);\n        if (!match || !match[1]) return null;\n        var raw = decodeSafe(match[1]);\n        if (!raw) return null;\n        return JSON.parse(raw);\n    }\n\n    function readSettingsResultFromUrl(result) {\n        var candidates = [];\n        try { candidates.push(String(result || '')); } catch (e) {}\n        try {\n            if (result && typeof result.url === 'function') candidates.push(String(result.url() || ''));\n            else if (result && result.url != null) candidates.push(String(result.url));\n        } catch (e) {}\n        try {\n            if (result && typeof result.getUrl === 'function') candidates.push(String(result.getUrl() || ''));\n        } catch (e) {}\n\n        for (var i = 0; i < candidates.length; i++) {\n            var match = candidates[i].match(/(?:#config=|[?&](?:config|source_settings_result)=)([^\\s\"'<>]+)/i);\n            if (!match || !match[1]) continue;\n            try {\n                var parsed = JSON.parse(decodeSafe(match[1]));\n                if (parsed && typeof parsed === 'object') return parsed;\n            } catch (e) {}\n        }\n        return null;\n    }\n\n    function readSettingsResultFromCookie(hostUrl) {\n        var urls = [hostUrl, hostUrl + '/', settingsUrl];\n        var seen = {};\n        for (var u = 0; u < urls.length; u++) {\n            var target = String(urls[u] || '');\n            if (!target || seen[target]) continue;\n            seen[target] = true;\n            var cookieStr = '';\n            try {\n                cookieStr = String(cookie.getCookie(target) || '');\n            } catch (e) {}\n            var cookieData = parseCookieString(cookieStr);\n            if (cookieData.source_settings_result) {\n                return JSON.parse(cookieData.source_settings_result);\n            }\n        }\n        return null;\n    }\n\n\n    function readBubbleResultFromCookie(hostUrl) {\n        var urls = [hostUrl, hostUrl + '/', hostUrl + '/static/bubble_preview.html'];\n        for (var urlIndex = 0; urlIndex < urls.length; urlIndex++) {\n            var cookieString = '';\n            try {\n                cookieString = String(cookie.getCookie(urls[urlIndex]) || '');\n            } catch (e) {}\n            var cookieData = parseCookieString(cookieString);\n            if (!cookieData.bubble_settings_result) continue;\n            try {\n                var parsed = JSON.parse(cookieData.bubble_settings_result);\n                if (parsed && typeof parsed === 'object') return parsed;\n            } catch (e) {}\n        }\n        return null;\n    }\n\n    try {\n        var resultType = '';\n        var next = readSettingsResultFromBody(body);\n        if (next) resultType = '内嵌页面';\n        if (!next) {\n            next = readSettingsResultFromCookie(baseUrl);\n            if (next) resultType = 'Cookie';\n        }\n        if (!next) {\n            next = readSettingsResultFromUrl(browserResult);\n            if (next) resultType = 'URL';\n        }\n        if (!next || typeof next !== 'object') throw new Error('未读取到设置结果');\n        if (String(next._settings_nonce || '') !== settingsNonce) throw new Error('设置结果未更新');\n\n        var bubbleHosts = [String(next.server || baseUrl).replace(/\\/+$/, ''), baseUrl].concat(host || []);\n        var checkedBubbleHosts = {};\n        for (var bubbleHostIndex = 0; bubbleHostIndex < bubbleHosts.length; bubbleHostIndex++) {\n            var bubbleHost = String(bubbleHosts[bubbleHostIndex] || '').replace(/\\/+$/, '');\n            if (!bubbleHost || checkedBubbleHosts[bubbleHost]) continue;\n            checkedBubbleHosts[bubbleHost] = true;\n            var bubbleResult = readBubbleResultFromCookie(bubbleHost);\n            if (!bubbleResult) continue;\n            if (String(bubbleResult._bubble_nonce || '') !== settingsNonce) continue;\n            if (String(bubbleResult._bubble_applied || '') !== '1') continue;\n            var bubbleStyle = String(bubbleResult.pstyle || '');\n            if (/^[A-Za-z0-9_-]{1,32}$/.test(bubbleStyle)) next.pstyle = bubbleStyle;\n            break;\n        }\n        if (resultType === 'URL' && JSON.stringify(next) === initialSettingsJson) {\n            throw new Error('源阅仅返回了初始地址，未返回修改后的设置');\n        }\n        delete next._settings_nonce;\n        if (!next.server) next.server = baseUrl;\n        if (!next.shuqi_tone_id || next.shuqi_tone_id === '默认音色') next.shuqi_tone_id = 'multi_role';\n        next.pstyle = String(next.pstyle || '0');\n        source.setVariable(JSON.stringify(next));\n        try { java.log('书源设置回传方式：' + resultType); } catch (ignore) {}\n        java.longToast('\\n模式：' + (next.tab || '') + '\\n来源：' + (next.sources || '') + '\\n搜索、发现页或正文刷新后生效。');\n    } catch (e) {\n        java.longToast('\\n未读取到设置结果，已保留原配置。\\n' + e);\n    }\n}", "respondTime": 180000, "ruleBookInfo": {"author": "$.author", "canReName": "1", "coverUrl": "$.thumb_url", "init": "<js>\nif (String(baseUrl).startsWith(\"data:\")) {\n    let res = JSON.parse(java.hexDecodeToString(result));\n    let book_id = res.book_id;\n    let tab = res.tab;\n    let sources = res.sources;\n    let url = res.url;\n    let html = \"\";\n    let proxy = getArguments(source.getVariable(), \"proxy\");\n    if (url != \"\" && proxy == \"本地\") {\n        if (sources == '69书吧') {\n            let ck69 = String(cookie.getCookie('https://www.69shuba.com'));\n            let headers = {\n        \t \"Referer\": url,\n            \"Cookie\": ck69,\n            \"User-Agent\":  java.getWebViewUA()\n             };            \n             let op = JSON.stringify({\n                \"headers\": headers\n            });\n            html = java.ajax(`${url},${op}`);\n        } else {\n            html = java.ajax(url);\n        }\n        //java.log(html);\n        if (html.includes(\"Just a moment...\") && sources == '69书吧') {\n            cookie.removeCookie('https://www.69shuba.com');\n            java.longToast('需要真人验证，请进入任意书籍详情页过验证');\n            html = java.startBrowserAwait(url, \"需要真人验证，请进入任意书籍详情页过验证\").body();\n\n             java.log(html);\n        }\n    }\n    let base_url = getArguments(source.getVariable(), \"server\");\n    let op = {\n        method: \"POST\",\n        body: {\n            html: html\n        }\n    };\n    op = JSON.stringify(op);\n    let varia = String(book.getVariable('custom'));\n    if (varia == 'null') {\n        varia = '';\n    }\n    varia = JSON.stringify({\n        'custom': varia\n    });\n    //varia = java.base64Encode(varia);\n    java.log(`${base_url}/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n    try {\n        result = java.ajax(`${base_url}/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n        JSON.parse(result);\n    } catch(_err) {\n        for (var _i = 0; _i < host.length; _i++) {\n            if (host[_i] === base_url) continue;\n            try {\n                result = java.ajax(`${host[_i]}/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n                JSON.parse(result);\n                setArguments(\"server\", host[_i]);\n                java.longToast(\"\\n\\n线路故障，已自动切换到：\" + host[_i]);\n                break;\n            } catch(_e2) { continue; }\n        }\n    }\n}\nresult\n</js>$.data", "intro": "<js>\nlet {\n    book_id,\n    source: sources,\n    tab,\n    book_tts,\n    book_tts_dice,\n    tags,\n    role,\n    last_chapter_title,\n    last_chapter_update_time,\n    word_number,\n    status,\n    score,\n    abstract,\n    copyright_info\n} = result;\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (proxy == \"本地\") {\n    proxy = \"本地网络\";\n} else {\n    proxy = \"服务器网络\";\n}\njava.put(\"book_detail\", JSON.stringify(result));\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet key3 = \"\";\ntry {\n    let cookieValue =\n        String(cookie.getCookie(base_url)) || String(java.getCookie(base_url));\n    key3 = getKey(cookieValue);\n} catch (e) {\n    key3 = \"\";\n}\n\nif (key3 == \"\") {\n    java.log(\"当前服务器未查询到登录状态，尝试查询其他服务器登录状态...\");\n    let cookieValue;\n    for (let h of host) {\n        try {\n            cookieValue = String(cookie.getCookie(h)) || String(java.getCookie(h));\n            key3 = getKey(cookieValue);\n        } catch (e) {\n            key3 = \"\";\n        }\n        if (key3) {\n            java.log(`已在${h}登录，退出查询，正在转移登录状态到当前服务${base_url}`);\n            //java.log(cookieValue)\n            cookie.removeCookie(h);\n            cookie.removeCookie(base_url);\n            cookie.setCookie(base_url, cookieValue);\n            break;\n        }\n    }\n}\n\nif (book.readConfig == null || book.readConfig.useReplaceRule == null) {\n    book.setUseReplaceRule(false);\n}\n\nlet nickname = '账号状态：⚠️ 未登录 | 点击右上角 🔖 登录';\ntry {\n    let opcx = {\n        method: \"GET\",\n        headers: {\n            cookie: 'qttoken=' + key3 + ';'\n        },\n    };\n    opcx = JSON.stringify(opcx);\n    let user_info = JSON.parse(java.ajax(base_url + '/get_avatar,' + opcx));\n    if (user_info.code == 0) {\n        if (user_info.nickname) {\n            nickname = '欢迎回来：' + user_info.nickname\n        } else {\n            nickname = '欢迎回来：' + user_info.email + \"(请前往用户后台设置用户名)\"\n        }\n    }\n} catch (e) {\n    if (key) {\n        nickname = '账号状态：已登录'\n    }\n};\n\nlet loginStatus = nickname;\n\nlet lightDivider = \"❇️───────❇️───────❇️\";\nlet heavyDivider = \"&lrm;\\n&lrm;\";\n\nlet isValid = (value) => String(value).length > 1;\nlet ctitle = book.durChapterTitle || '未开始';\nlet info = `\n    📡 当前服务：${base_url}\n    🔑 ${loginStatus}\n    🏷 数据来源：${sources}\n    🔄 当前模式：${tab}\n    ⚙️ 访问模式：${proxy}\n    📖 阅读至：${ctitle}\n`;\n\nif (tab == \"听书\") {\n    let toneId = String(book.getVariable('custom'));\n    if (toneId == 'null') toneId = '';\n    let isShuqiAudio = sources == '书旗' || sources == 'svip_书旗';\n    if (isShuqiAudio && (!toneId || toneId == '默认音色')) {\n        toneId = getArguments(source.getVariable(), 'shuqi_tone_id') || 'multi_role';\n    } else if (!toneId) {\n        toneId = '4';\n    }\n    if (isShuqiAudio) {\n        let toneName = getShuqiToneName(toneId);\n        let toneNumber = getShuqiToneNumber(toneId);\n        let supportedTones = [];\n        if (book_tts_dice && typeof book_tts_dice == 'object') {\n            supportedTones = Object.keys(book_tts_dice)\n                .map((name) => {\n                    let value = String(book_tts_dice[name] || '');\n                    let known = getShuqiToneOption(value) || getShuqiToneOption(name);\n                    return known ? {number: known.number, name: known.name} : {number: value, name: name};\n                })\n                .filter((option) => /^\\d+$/.test(option.number));\n        }\n        if (!supportedTones.length) supportedTones = SHUQI_TONE_OPTIONS.slice();\n        supportedTones.sort((left, right) => Number(left.number) - Number(right.number));\n        let availableTones = supportedTones\n            .map((option) => '    ' + option.number + '. ' + option.name)\n            .join('\\n');\n        let toneSupported = supportedTones.some((option) => option.number == toneNumber);\n        let fallbackTip = toneSupported ? '' : '\\n    ⚠️ 本书不支持当前音色，播放时会自动回退到可用音色';\n        info += `${lightDivider}\n    🎵 当前音色：${toneName}\n    🔢 当前编号：${toneNumber}${fallbackTip}\n    🛠 修改方法：点击右上角“书籍变量”，只需填写下面的数字编号；留空使用书源登录页选择的音色\n    🎙 本书可用的书旗音色：\n${availableTones}\n`;\n    } else if (isValid(book_tts)) {\n        info += `${lightDivider}\n    🎵 音色配置：${toneId}\n    ✨ AI音色请点击右上角书籍变量填写相关值，真人听书请重新搜索选择带有主播的书籍\n    ${book_tts}\n`;\n    }\n}\n\nlet basicInfo = \"\";\nlet addBasicInfo = (value, prefix, icon) => {\n    if (isValid(value)) basicInfo += `    ${icon} ${prefix} ${value}\\n`;\n};\n\naddBasicInfo(tags, \"书籍分类：\", \"🌈\");\naddBasicInfo(role, \"书籍主角：\", \"👑\");\naddBasicInfo(last_chapter_title, \"最新章节：\", \"📚\");\naddBasicInfo(last_chapter_update_time, \"更新时间：\", \"⏳\");\naddBasicInfo(word_number, \"书籍字数：\", \"📊\");\naddBasicInfo(status, \"书籍状态：\", \"🚩\");\naddBasicInfo(score, \"书籍评分：\", \"⭐\");\n\nif (basicInfo) info += `${lightDivider}\\n${basicInfo}`;\n\nif (isValid(abstract)) {\n    let indentedAbstract = abstract\n        .split(\"\\n\")\n        .map((line) => `    ${line}`)\n        .join(\"\\n\");\n    info += `${heavyDivider}\n    📖 书籍简介：\n${indentedAbstract}\n`;\n} else {\n    info += `${heavyDivider}`;\n}\n\nif (isValid(copyright_info)) {\n    info += `${lightDivider}\n    © ${copyright_info}\n`;\n} else {\n    info += `${lightDivider}`;\n}\n\ninfo += `\n${heavyDivider}\n    💠💠💠 数据更新于 ${new Date().toLocaleString()} 💠💠💠\n`;\nlet jjinfo = getArguments(source.getVariable(), \"info\");\n\nif (jjinfo != \"off\") {\n    info = String(info)\n        .split(\"\\n\")\n        .map((line) => line.replace(/^ {4}/, \"\"))\n        .join(\"\\n\");\n} else {\n    basicInfo = \"\";\n    addBasicInfo(last_chapter_title, \"最新章节：\", \"📚\");\n    addBasicInfo(last_chapter_update_time, \"更新时间：\", \"⏳\");\n    addBasicInfo(word_number, \"书籍字数：\", \"📊\");\n    addBasicInfo(status, \"书籍状态：\", \"🚩\");\n    addBasicInfo(score, \"书籍评分：\", \"⭐\");\n    if (isValid(abstract)) {\n        let indentedAbstract = abstract\n            .split(\"\\n\")\n            .map((line) => `    ${line}`)\n            .join(\"\\n\");\n        basicInfo += `\n    \\n&lrm;\n    📖 书籍简介：\n${indentedAbstract}\n`;\n    } else {\n        basicInfo += `${heavyDivider}`;\n    }\n    info = `&lrm;\\n🏷 数据来源：${sources}\\n` + basicInfo;\n}\n</js>", "lastChapter": "{{$.source}} {{$.last_chapter_title}} {{$.last_chapter_update_time}}", "name": "$.book_name", "tocUrl": "<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || \"小说\";\nlet url = result.toc_url || \"\";\nvar sdtoken;\ntry {\n    var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n    sdtoken = String(loginInfoMap['手动填写番茄token(可不填)'] || '');\n} catch (e) {\n    sdtoken = '';\n}\nvar rawCookie = getFanqieCookie() || sdtoken;\nvar match = rawCookie.match(/sessionid=[^;]+/);\nvar fqcookie = match ? match[0] : '';\nvar fqssionid = '';\nif (fqcookie) {\n    fqssionid = getSessionId(fqcookie);\n};\nsetArguments('fqssionid', fqssionid);\njava.put(\"tab\", tab);\njava.put(\"book_id\", book_id);\nlet qtcatalog = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url,\n};\nqtcatalog = java.base64Encode(JSON.stringify(qtcatalog));\n`data:;base64,${qtcatalog},{\"type\":\"qingtian2\"}`;\n</js>", "wordCount": "$.word_number"}, "ruleContent": {"content": "<js>\njava.log(result)\nresult = String(java.hexDecodeToString(result));\nlet res;\nif (result.match(/大灰狼融合/)) {\n    result = result.split(\"大灰狼融合4\");\n    res = {\n        item_id: result[0],\n        tab: result[1],\n        title: result[2],\n        sources: result[3],\n        url: \"\"\n    };\n} else {\n    res = JSON.parse(result);\n}\n\nfunction checkEnv() {\n    try {\n        java.qread();\n        return \"轻阅读\";\n    } catch (e) {}\n\n    try {\n        if (typeof java.reLoginView == 'function') {\n            return \"改版\";\n        }\n        new Packages.io.legato.kazusa.utils.TimeoutCancellationException('');\n        return \"改版\";\n    } catch (e) {}\n\n    try {\n        java.deviceID();\n        return \"苹果\";\n    } catch (e) {}\n\n    if (typeof source.loginUi == 'function') {\n        return \"安卓\";\n    }\n    return \"改版\";\n}\n\nvar clientEnv = checkEnv();\nvar islyc = clientEnv == \"改版\";\ntry {\nif (islyc) {\n\tbook.imageStyle = 'FULL';\n\t} else {\n\t\tbook.imageStyle = 'TEXT';\n\t\t}\n} catch {}\nlet varia1 = String(book.getVariable('custom'));\nif (varia1 == 'null') {\n    varia1 = '';\n}\nlet varia = JSON.stringify({\n    'custom': varia1\n});\n//  varia = java.base64Encode(varia);\nlet book_id = res.book_id;\nlet item_id = res.item_id;\nlet tab = res.tab;\nlet title = res.title;\nlet sources = res.sources;\nlet url = res.url;\nlet html = \"\";\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (url != \"\" && proxy == \"本地\") {\n    if (sources == '69书吧') {\n        let ck69 = String(cookie.getCookie('https://www.69shuba.com'));\n        let headers = {\n            \"Referer\": url,\n            \"Cookie\": ck69,\n            \"User-Agent\": java.getWebViewUA()\n        };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        java.log(url);\n        java.log(op);\n        html = java.ajax(`${url},${op}`);\n    } else {\n        html = java.ajax(url);\n    }\n    java.log('dddddddddddddddddddddddddddd')\n    java.log(html);\n    if (html.includes(\"Just a moment...\") && sources == '69书吧' && book.durChapterIndex === chapter.index) {\n        cookie.removeCookie('https://www.69shuba.com');\n        java.longToast('需要真人验证，请进入任意书籍详情页过验证');\n        html = java.startBrowserAwait(url, \"需要真人验证，请进入任意书籍详情页过验证\").body();\n        java.log('cscscscs')\n        java.log(html);\n    }\n};\nlet content = \"\";\nlet data;\n//let tone_id = getArguments(source.getVariable(), \"tone_id\");\nlet tone_id = varia1;\nlet isShuqiAudio = tab == '听书' && (sources == '书旗' || sources == 'svip_书旗');\nif (isShuqiAudio) {\n    if (!tone_id || tone_id == '默认音色') {\n        tone_id = getArguments(source.getVariable(), 'shuqi_tone_id') || 'multi_role';\n    }\n    tone_id = resolveShuqiToneId(tone_id);\n} else if (!tone_id) {\n    tone_id = '4';\n}\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet fqpara = getArguments(source.getVariable(), \"fqpara\");\nlet fqcommunity = getArguments(source.getVariable(), \"fqcommunity\");\nlet close_img = getArguments(source.getVariable(), \"close_img\");\nif (!fqcommunity) {\n    fqcommunity = \"on\";\n}\nlet device, device_type;\ntry {\n    device = java.deviceID();\n    device_type = \"苹果\";\n} catch (e) {\n    try {\n        device = java.androidId();\n        device_type = \"安卓\";\n    } catch (e) {\n        device = \"\";\n        device_type = \"安卓\";\n    }\n}\nlet isQiyue = device_type == \"苹果\" && clientEnv == \"改版\";\n\nlet qtcookie = cookie.getCookie(base_url);\ntry {\n\t   let device2 = String(cookie.getKey(base_url, \"device\"));\n\t   if (!device2){\n\t   \tdevice2 = device;\n\t   \t}\n    qtcookie = `qttoken=${String(cookie.getKey(base_url, \"qttoken\"))}; deviceId=${device2};`\n} catch (e) {java.log(e)}\n\nvar params = {\n    html: html,\n    item_id: item_id,\n    source: sources,\n    tab: tab,\n    tone_id: tone_id,\n    variable: varia,\n    version: '4.11.5.1',\n    app: '\\u9605\\u8bfb\\u795e\\u8bc4\\u8868\\u60c5',\n    god: fqpara == 'on'\n};\n\nvar content_url = '/content';\nvar reviewSource = sources == \"svip_书旗\" ? \"书旗\" : sources;\nif ((reviewSource == \"番茄\" || reviewSource == \"七猫\" || reviewSource == \"书旗\" || reviewSource == \"塔读\" || reviewSource == \"QQ阅读\" || reviewSource == \"svip_QQ阅读\") && fqpara == \"on\" && tab == \"小说\") {\n    content_url = '/content?review=1';\n}\n\n//var signInfo = generateComplexSignature('POST', content_url, {}, APP_SECRET, params);\n\n\n//var signedParams = copyObject(params);\n//signedParams.timestamp = signInfo.timestamp;\n//signedParams.nonce = signInfo.nonce;\n//signedParams.sign = signInfo.sign;\n\n\nvar op = {\n    method: \"POST\",\n    body: JSON.stringify(params),\n    headers: {\n        cookie: qtcookie,\n        'Content-Type': 'application/json'\n    }\n};\n\nop = JSON.stringify(op);\njava.log(op);\njava.log(cookie.getCookie(base_url))\ntry {\n    data = java.ajax(base_url + content_url + `,${op}`);\n    JSON.parse(data);\n} catch(_err) {\n    for (var _i = 0; _i < host.length; _i++) {\n        if (host[_i] === base_url) continue;\n        try {\n            data = java.ajax(host[_i] + content_url + `,${op}`);\n            JSON.parse(data);\n            setArguments(\"server\", host[_i]);\n            try { var _oldCk = cookie.getCookie(base_url); if (_oldCk) cookie.setCookie(host[_i], _oldCk); } catch(_ce) {}\n            base_url = host[_i];\n            java.longToast(\"\\n\\n线路故障，已自动切换到：\" + host[_i]);\n            break;\n        } catch(_e2) { continue; }\n    }\n}\ntry {\n    data = JSON.parse(data);\n    if (data.msg) {\n        var contentMsg = String(data.msg);\n        if (contentMsg.indexOf('runtime error: invalid memory address or nil pointer dereference') >= 0) {\n            // 仅隐藏后端空指针内部错误，其他业务提示仍正常显示。\n            java.log('正文接口空指针错误: ' + contentMsg);\n        } else {\n            java.toast(contentMsg);\n        }\n    }\n} catch (e) {\n    java.log('正文响应解析失败: ' + String(e));\n}\ncontent = data && data.content ? data.content : \"\"\n\nif (close_img == 'on') {\n\tcontent = removeAllImgTags(content);\n\t}\n\nif ((reviewSource == \"番茄\" || reviewSource == \"七猫\" || reviewSource == \"书旗\" || reviewSource == \"塔读\" || reviewSource == \"QQ阅读\" || reviewSource == \"svip_QQ阅读\") && tab == \"小说\") {\n    var sdtoken;\n    try {\n        var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n        sdtoken = String(loginInfoMap['手动填写番茄token(可不填)'] || '');\n    } catch (e) {\n        sdtoken = '';\n    }\n    var rawCookie = getFanqieCookie() || sdtoken;\n    var match = rawCookie.match(/sessionid=[^;]+/);\n    var fqcookie = match ? match[0] : '';\n    var fqssionid = '';\n    if (!fqcookie) {} else {\n        fqssionid = getSessionId(fqcookie)\n    }\n    content = content\n        .replace(/ident=\"/g, `ident=\"${base_url}`)\n        .replace(/book_id=/g, `book_id=${book_id}&ssionid=${fqssionid}`);\n    if (sources == \"七猫\") {\n        content = content.replace(/ident=\"([^\"]*)\"/g, function(full, reviewUrl) {\n            if (reviewUrl.indexOf('/qimao_comment?mode=paragraph&') < 0) {\n                return full;\n            }\n            let paragraphUrl = reviewUrl\n                .replace('/qimao_comment?mode=paragraph&', '/get_para_review?')\n                .replace(/([?&])paragraph_id=/, '$1para=');\n            return 'ident=\"' + paragraphUrl + '\"';\n        });\n    }\n    if (fqpara == \"on\") {\n        if (device_type == \"苹果\") {\n            content = paraForiOS(content, sources);\n        } else {\n            content = paraForAndroid(content, sources);\n        }\n    }\n}\nif ((reviewSource == \"番茄\" || reviewSource == \"七猫\" || reviewSource == \"书旗\" || reviewSource == \"QQ阅读\" || reviewSource == \"svip_QQ阅读\") && fqcommunity != \"off\" && tab == \"小说\") {\n    let svg = `${base_url}/chapter_review_svg?book_id=${book_id}&item_id=${item_id}&source=${encodeURIComponent(reviewSource)}&ssionid=${fqssionid}&cache=${Date.now()}`;\n    let commentPageUrl;\n    if (reviewSource == \"书旗\") {\n        commentPageUrl = `${base_url}/get_para_review?book_id=${book_id}&item_id=${item_id}&source=${encodeURIComponent(reviewSource)}&cache=${Date.now()}`;\n    } else if (reviewSource == \"QQ阅读\" || reviewSource == \"svip_QQ阅读\") {\n        commentPageUrl = `${base_url}/get_para_review?mode=chapter&book_id=${book_id}&item_id=${item_id}&source=${encodeURIComponent(reviewSource)}&cache=${Date.now()}`;\n    } else {\n        let commentPagePath = reviewSource == \"七猫\" ? \"/qimao_comment?mode=chapter\" : \"/fanqie_comment?mode=chapter\";\n        commentPageUrl = `${base_url}${commentPagePath}&book_id=${book_id}&item_id=${item_id}&source=${encodeURIComponent(reviewSource)}&tab=${encodeURIComponent(tab)}&ssionid=${fqssionid}&cache=${Date.now()}`;\n    }\n    let chapterSvg = '';\n    let chapterSvgChecked = false;\n    try {\n        chapterSvg = java.ajax(svg);\n        chapterSvgChecked = true;\n    } catch (e) {}\n\n    // 请求成功但没有 SVG，说明本章没有评论，不插入本章说图片。\n    // 请求失败时保留原直链兜底，避免临时网络故障隐藏已有评论。\n    let hasChapterCard = String(chapterSvg || '').indexOf('<svg') >= 0;\n    if (!chapterSvgChecked) hasChapterCard = true;\n    if (hasChapterCard) {\n        if (device_type == \"苹果\" && chapterSvg) {\n            svg = 'data:image/svg+xml;base64,' + java.base64Encode(chapterSvg);\n        } else {\n            svg += '&img=1';\n        }\n        if (device_type == '苹果') {\n            // iOS 不使用 qtbzs 专用类型，并同时提供两种点击字段，避免退化为图片预览。\n            let chapterAction = 'showFanqieComment(' + JSON.stringify(commentPageUrl) + ',' + JSON.stringify('本章说') + ')';\n            let chapterMeta = {style: 'FULL', click: chapterAction, js: chapterAction};\n            content = content + `\\n<img src=\"${svg},${JSON.stringify(chapterMeta)}\">`;\n        } else {\n            // 安卓保留原有 qtbzs 协议，避免改变已经可用的点击行为。\n            content = content + `\\n<img src=\"${svg},{'type':'qtbzs',${endclick(commentPageUrl, '本章说')},'style':'FULL'}\">`;\n        }\n    }\n}\ndata = JSON.stringify({\n    content: content,\n});\nif (device_type == \"安卓\" && (tab == \"短剧\" || tab == \"视频\" || sources.includes('毒舌影视') || sources.includes('NT动漫'))) {\n    data = {\n        content: `【右上角刷新】开启播放(下一集请切换下一章刷新)\\n播放直链：\\n${content}`,\n    };\n    data = JSON.stringify(data);\n    if (book.durChapterIndex === chapter.index) {\n        let video_url = `${base_url}/online_video?book_id=${book_id}&source=${sources}&tab=${tab}`;\n        if (sources.includes('毒舌影视') || sources.includes('NT动漫')) {\n            video_url = content;\n        };\n        java.startBrowser(video_url, title);\n        java.toast(\"正在加载视频...\");\n    }\n\n}\ndata;\n</js>$.content", "imageStyle": "full"}, "ruleExplore": {"author": "$.author", "bookList": "$.data", "bookUrl": "<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '小说';\nlet url = result.toc_url || '';\n\nlet qtdetail = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url\n}\nqtdetail = java.base64Encode(JSON.stringify(qtdetail));\n`data:;base64,${qtdetail},{\"type\":\"qingtian\"}`\n</js>", "coverUrl": "$.thumb_url", "intro": "$.abstract", "kind": "{{$.category}}\n{{$.score}}\n{{$.status}}\n{{$.source}}\n{{$.tags}}", "lastChapter": "{{$.last_chapter_title}} • {{$.last_update_time}}", "name": "$.book_name", "wordCount": "$.word_number"}, "ruleSearch": {"author": "$.author", "bookList": "$.data", "bookUrl": "<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '小说';\nlet url = result.toc_url || '';\n\nlet qtdetail = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url\n}\nqtdetail = java.base64Encode(JSON.stringify(qtdetail));\n`data:;base64,${qtdetail},{\"type\":\"qingtian\"}`\n</js>", "checkKeyWord": "我的26岁女房客@番茄", "coverUrl": "$.thumb_url", "intro": "$.abstract", "kind": "{{$.status}},{{$.score}},{{$.tags}},{{$.last_chapter_update_time}}", "lastChapter": "{{$.source}} {{$.last_chapter_title}}", "name": "$.book_name##（别名：.*?）", "wordCount": "$.word_number"}, "ruleToc": {"chapterList": "<js>\nlet res = JSON.parse(java.hexDecodeToString(result));\nif (res.method) {\n    res = Object.fromEntries(\n        res.body\n        .replace(\"source\", \"sources\")\n        .split(\"&\")\n        .map((query) => query.split(\"=\"))\n    );\n    res.url = \"\";\n}\nlet book_id = res.book_id;\njava.put('book_id', book_id);\nlet tab = res.tab;\nlet sources = res.sources;\nlet url = res.url;\nlet html = \"\";\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (url != \"\" && proxy == \"本地\") {\n    if (sources == '69书吧') {\n        let ck69 = String(cookie.getCookie('https://www.69shuba.com'));\n        let headers = {\n        \t \"Referer\": url,\n            \"Cookie\": ck69,\n            \"User-Agent\":  java.getWebViewUA()\n             };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        html = java.ajax(`${url},${op}`);    \n    } else {\n        html = java.ajax(url);\n    }\n    //java.log(html);\n    if (html.includes(\"Just a moment...\") && sources == '69书吧') {\n        cookie.removeCookie('https://www.69shuba.com');\n        java.longToast('需要真人验证，请进入任意书籍详情页过验证');\n        html = java.startBrowserAwait(url, \"需要真人验证，请进入任意书籍详情页过验证\").body();\n\n           java.log(html);\n    }\n};\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet op = {\n    method: \"POST\",\n    body: {\n        html: html\n    }\n};\nop = JSON.stringify(op);\nlet varia = String(book.getVariable('custom'));\nif (varia == 'null') {\n    varia = '';\n}\nvaria = JSON.stringify({\n    'custom': varia\n});\n// varia = java.base64Encode(varia);\n//java.log(`${base_url}/catalog?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\nlet data = java.ajax(\n    `${base_url}/catalog?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`\n);\nlet catalogResult;\ntry {\n    catalogResult = JSON.parse(data);\n} catch (e) {\n    catalogResult = null;\n}\nif (catalogResult && Number(catalogResult.code) !== 0) {\n    java.longToast('\\n\\n' + (catalogResult.msg || '获取目录失败'));\n    data = JSON.stringify({data: []});\n}\nlet device, device_type;\ntry {\n    device = java.deviceID();\n    device_type = \"苹果\";\n} catch (e) {\n    try {\n        device = java.androidId();\n        device_type = \"安卓\";\n    } catch (e) {\n        device = \"\";\n        device_type = \"安卓\";\n    }\n}\n\nif (tab == \"小说\") {\n    if (device_type == \"安卓\") {\n        book.type = 8;\n    } else {\n        book.type = 0;\n    }\n} else if (tab == \"听书\") {\n    if (device_type == \"安卓\") {\n        book.type = 32;\n    } else {\n        book.type = 1;\n    }\n} else if (tab == \"漫画\") {\n    if (device_type == \"安卓\") {\n        book.type = 64;\n    } else {\n        book.type = 2;\n    }\n} else if (tab == \"短剧\") {\n    if (device_type == \"安卓\") {\n        book.type = 8;\n    } else {\n        book.type = 3;\n    }\n} else {\n    if (device_type == \"安卓\") {\n        book.type = 8;\n    } else {\n        book.type = 0;\n    }\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet reading = getArguments(source.getVariable(), \"reading\");\n\nif (book && book.order != 0 && reading == '1') {\n    try {\n        if (!data || !book.variable || !base_url || !qtcookie) {\n            java.log('缺少必要参数');\n        } else {\n            let parsedData;\n            try {\n                parsedData = JSON.parse(data);\n            } catch (e) {\n                java.log('解析data数据失败:' + e);\n            }\n            \n            if (parsedData && parsedData.data && Array.isArray(parsedData.data) && parsedData.data[book.durChapterIndex]) {\n                let ritem = parsedData.data[book.durChapterIndex];\n                let bookInfoObj;\n                try {\n                    bookInfoObj = JSON.parse(book.variable);\n                } catch (e) {\n                    java.log('解析book.variable失败:' + e);\n                }\n                \n                if (bookInfoObj) {\n                    let book_info;\n                    try {\n                        book_info = JSON.parse(bookInfoObj.book_detail || JSON.stringify(bookInfoObj));\n                    } catch (e) {\n                        java.log('解析book_detail失败:' + e);\n                    }\n                    \n                    if (book_info && typeof book_info === 'object') {\n                        let rurl = base_url + '/add_book_to_book_shelf,';\n                        book_info['read_status'] = 1;\n                        book_info['last_chapter_item_id'] = ritem.item_id || '';\n                        book_info['last_chapter_title'] = ritem.title || '';\n                        let rop = {\n                            method: \"POST\",\n                            headers: {\n                                cookie: qtcookie\n                            },\n                            body: book_info\n                        };\n                        let check_book_url = base_url + '/check_book_in_book_shelf,';\n                        let checkResponse;\n                        \n                        try {\n                            checkResponse = java.ajax(check_book_url + JSON.stringify(rop));\n                        } catch (e) {\n                            java.log('检查书籍请求失败:' + e);\n                        }\n                        \n                        if (checkResponse) {\n                            let check_data;\n                            try {\n                                check_data = JSON.parse(checkResponse).data;\n                            } catch (e) {\n                                java.log('解析检查响应失败:' + e);\n                            }\n                            try {\n                                if (check_data && check_data.id) {\n                                    book_info['id'] = check_data.id;\n                                    let uurl = base_url + '/update_book_shelf,';\n                                    java.ajax(uurl + JSON.stringify(rop));\n                                } else {\n                                    java.ajax(rurl + JSON.stringify(rop));\n                                }\n                            } catch (e) {\n                                java.log('书架操作失败:' + e);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    } catch (error) {\n        java.log('书籍同步流程异常:' + error);\n        java.longToast('\\n同步阅读进度失败，但不影响阅读，可以前往登录关闭书架同步功能。');\n    }\n}\ndata;\n</js>$.data", "chapterName": "$.title", "chapterUrl": "<js>\nlet tab = result.tab;\nlet sources = result.source;\nlet title = result.title;\nlet item_id = result.item_id;\nlet book_id = java.get(\"book_id\");\nlet url = result.toc_url || \"\";\nlet qtcontent = {\n    book_id: book_id,\n    item_id: item_id,\n    title: title,\n    sources: sources,\n    tab: tab,\n    url: url,\n};\nqtcontent = java.base64Encode(JSON.stringify(qtcontent));\nif (sources == '卷') {\n    content_url = item_id\n} else {\n    content_url = `data:;base64,${qtcontent},{\"type\":\"qingtian3\"}`;\n}\n</js>", "updateTime": "$.first_pass_time"}, "searchUrl": "<js>\nlet base_url = getArguments(source.getVariable(), 'server');\nlet media;\nlet sources = getArguments(source.getVariable(), 'sources') || getArguments(source.getVariable(), 'source');\nlet disabled_sources = getArguments(source.getVariable(), 'disabled_sources') || '0';\nif (String(key).startsWith(\"m:\") || String(key).startsWith(\"m：\")) {\n    media = \"漫画\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"t:\") || String(key).startsWith(\"t：\")) {\n    media = \"听书\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"d:\") || String(key).startsWith(\"d：\")) {\n    media = \"短剧\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"x:\") || String(key).startsWith(\"x：\")) {\n    media = \"小说\"\n    key = key.slice(2)\n} else {\n    media = getArguments(source.getVariable(), 'tab') || getArguments(source.getVariable(), 'media');\n}\nif (key.includes('@')) {\n    var parts = key.split('@');\n    key = parts[0];\n    sources = parts[1] || sources;\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet op = {\n    method: \"GET\",\n    headers: {\n        cookie: qtcookie\n    },\n};\nop = JSON.stringify(op);\n`${base_url}/search?title=${key}&tab=${media}&source=${sources}&page={{page}}&disabled_sources=${disabled_sources},${op}`\n</js>", "weight": 0},{"bookSourceComment": "作者：纳兰容若", "bookSourceName": "74小说网", "bookSourceType": 0, "bookSourceUrl": "https://www.74xswz.com", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "玄幻::/list-4/{{page}}.html\n奇幻::/list-5/{{page}}.html\n武侠::/list-6/{{page}}.html\n仙侠::/list-7/{{page}}.html\n历史::/list-10/{{page}}.html\n游戏::/list-11/{{page}}.html\n科幻::/list-13/{{page}}.html\n诸天无限::/list-14/{{page}}.html\n悬疑::/list-15/{{page}}.html\n现代言情::/list-18/{{page}}.html\n玄幻言情::/list-20/{{page}}.html\n衍生同人::/list-27/{{page}}.html", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1791090299810", "respondTime": 180000, "ruleBookInfo": {"author": ".author a@text", "coverUrl": ".pic img@src", "intro": ".intro.font14@text", "kind": ".label a span@text", "lastChapter": ".direList.font16 ul li.0 .name a@text", "name": "h1@text"}, "ruleContent": {"content": "#content@html||.content@html", "nextContentUrl": "text.下一页@href"}, "ruleExplore": [], "ruleSearch": {"author": ".book-card__meta-item.0@text##作者：", "bookList": "<js>\nvar resp = \"\";\nvar base = String(baseUrl);\nvar kw = \"\";\nvar km = base.match(/[?&]kw=([^&]*)/);\nif (km) { try { kw = decodeURIComponent(km[1]); } catch (e) { kw = km[1]; } }\nvar html = String(result);\nvar tm = html.match(/name=\"_t\"\\s+value=\"([^\"]+)\"/);\nvar token = tm ? tm[1] : \"\";\nvar sm = html.match(/src=\"(\\/\\?action=signJs[^\"]*)\"/);\nvar signUrl = sm ? sm[1] : \"\";\nif (kw && token && signUrl) {\n  var signJs = String(java.ajax(\"https://www.rrssk.com\" + signUrl, 10000));\n  var m1 = /if\\s*\\(\\s*typeof\\s+(\\w+)\\s*!==\\s*\"number\"\\s*\\|\\|\\s*\\1\\s*!==\\s*(\\d+)\\s*\\)/.exec(signJs);\n  var m2 = /if\\s*\\(\\s*(\\w+)\\s*!==\\s*1\\s*\\)/.exec(signJs);\n  if (m1 && m2) {\n    var sv = m1[1], th = m1[2], tv = m2[1];\n    var code = signJs.replace(new RegExp(\"var\\\\s+\"+sv+\"\\\\s*=\\\\s*0\\\\s*;\",\"g\"), \"var \"+sv+\"=\"+th+\";\")\n      .replace(new RegExp(sv+\"\\\\s*\\\\+=\\\\s*[^;]*;\",\"g\"), \"\")\n      .replace(new RegExp(\"var\\\\s+\"+tv+\"\\\\s*=\\\\s*0\\\\s*;\",\"g\"), \"var \"+tv+\"=1;\");\n    var window = {addEventListener: function(){}, location: {href: \"https://www.rrssk.com/003Q.html\"}};\n    try { eval(code); } catch (e) { }\n    if (window.__SIGN) {\n      var ts = Math.floor(new Date().getTime() / 1000);\n      var enc = encodeURIComponent(kw).replace(/[!'()*]/g, function(c){return \"%\"+c.charCodeAt(0).toString(16).toUpperCase();});\n      var sig = String(window.__SIGN.f(enc, token, ts));\n      if (sig !== \"00000000\") {\n        var body = \"keyword=\" + encodeURIComponent(kw) + \"&_t=\" + token + \"&_ts=\" + ts + \"&_s=\" + sig;\n        resp = String(java.ajax(\"https://www.rrssk.com/?action=search,\" + JSON.stringify({method:\"POST\", body:body, header:{\"Referer\":\"https://www.rrssk.com/003Q.html\", \"Content-Type\":\"application/x-www-form-urlencoded\"}}), 20000));\n      }\n    }\n  }\n}\nresp;\n</js>class.book-card", "bookUrl": "<js>\nvar oc = String(result.attr(\"onclick\"));\nvar m = oc.match(/[?&]t=([^&']+)/);\nvar u = m ? m[1] : \"\";\ntry { u = decodeURIComponent(u); } catch (e) { }\nvar s = u.replace(/-/g, \"+\").replace(/_/g, \"/\");\nwhile (s.length % 4 != 0) { s += \"=\"; }\ntry { u = String(java.base64Decode(s)); } catch (e) { }\nu;\n</js>", "coverUrl": ".book-card__cover img@src", "intro": ".book-card__desc@text", "kind": ".book-card__meta-item.1@text##分类：", "name": ".book-card__title@text"}, "ruleToc": {"chapterList": "<js>\nvar html = String(result);\nvar am = html.match(/articleid\\s*=\\s*[\"']([^\"']+)[\"']/);\nvar aid = am ? am[1] : \"\";\nvar pages = 0;\nvar re = /<option value=\"(\\d+)\">\\d+-\\d+章<\\/option>/g, mm;\nwhile ((mm = re.exec(html)) !== null) {\n  var p = parseInt(mm[1], 10);\n  if (p > pages) pages = p;\n}\nvar all = \"\";\nif (aid && pages > 0) {\n  var cipher = java.createSymmetricCrypto(\"AES/CBC/PKCS5Padding\", \"rOVyYNHI0psNMqoQmNvuuBK4kR6C1b5C\", \"4892221280330977\");\n  for (var p = 1; p <= pages; p++) {\n    try {\n      var enc = cipher.encryptBase64(JSON.stringify({id: aid, page: p}));\n      var body = \"data=\" + java.encodeURI(enc);\n      var res = String(java.ajax(\"https://www.74xswz.com/index.php?action=loadChapterPage,\" + JSON.stringify({method:\"POST\", body:body, header:{\"Content-Type\":\"application/x-www-form-urlencoded\", \"Referer\": String(baseUrl)}}), 20000));\n      var jo = JSON.parse(res);\n      if (jo && jo.code == 0 && jo.data) {\n        for (var k = 0; k < jo.data.length; k++) {\n          all += '<a href=\"' + jo.data[k].chapterurl + '\">' + jo.data[k].chaptername + '</a>';\n        }\n      }\n    } catch (e) { }\n  }\n}\nif (all.length == 0) {\n  var doc = java.getElement('.direList.listData');\n  if (doc) {\n    var as = doc.select('a');\n    for (var i = 0; i < as.size(); i++) {\n      all += '<a href=\"' + as.get(i).attr('href') + '\">' + as.get(i).text() + '</a>';\n    }\n  }\n}\nall;\n</js>a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "https://www.rrssk.com/003Q.html?kw={{key}}&page={{page}}", "weight": 0},{"bookSourceComment": "神文小说 自制源 v3.3。搜索需登录；点右上角√后自动弹出图片验证码框，输入验证码即完成登录；注册请到源网站完成（注意：站点手机号仅支持13x/15x/17x/18x老号段，16x/19x新号段不可用，号码可尝试虚构）", "bookSourceGroup": "使用前看注释_自制", "bookSourceName": "神文小说", "bookSourceType": 0, "bookSourceUrl": "https://www.shenwen.org", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": false, "eventListener": false, "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1791025902372", "loginUi": "@js:try{java.ajax('https://www.shenwen.org/login.html')}catch(e){};JSON.stringify([{\"name\":\"用户名\",\"type\":\"title\"},{\"name\":\"user_name\",\"type\":\"text\"},{\"name\":\"密码\",\"type\":\"title\"},{\"name\":\"user_pass\",\"type\":\"password\"}])", "loginUrl": "@js:function qsskel(o) {\n\n    function w(b, a) {\n\n        return (b << a) | (b >>> (32 - a))\n\n    }\n\n\n\n    function E(k, b) {\n\n        var U, a, d, x, c;\n\n        d = (k & 2147483648);\n\n        x = (b & 2147483648);\n\n        U = (k & 1073741824);\n\n        a = (b & 1073741824);\n\n        c = (k & 1073741823) + (b & 1073741823);\n\n        if (U & a) {\n\n            return (c ^ 2147483648 ^ d ^ x)\n\n        }\n\n        if (U | a) {\n\n            if (c & 1073741824) {\n\n                return (c ^ 3221225472 ^ d ^ x)\n\n            } else {\n\n                return (c ^ 1073741824 ^ d ^ x)\n\n            }\n\n        } else {\n\n            return (c ^ d ^ x)\n\n        }\n\n    }\n\n\n\n    function s(a, c, b) {\n\n        return (a & c) | ((~a) & b)\n\n    }\n\n\n\n    function r(a, c, b) {\n\n        return (a & b) | (c & (~b))\n\n    }\n\n\n\n    function q(a, c, b) {\n\n        return (a ^ c ^ b)\n\n    }\n\n\n\n    function p(a, c, b) {\n\n        return (c ^ (a | (~b)))\n\n    }\n\n\n\n    function f(V, U, Z, Y, k, W, X) {\n\n        V = E(V, E(E(s(U, Z, Y), k), X));\n\n        return E(w(V, W), U)\n\n    }\n\n\n\n    function C(V, U, Z, Y, k, W, X) {\n\n        V = E(V, E(E(r(U, Z, Y), k), X));\n\n        return E(w(V, W), U)\n\n    }\n\n\n\n    function t(V, U, Z, Y, k, W, X) {\n\n        V = E(V, E(E(q(U, Z, Y), k), X));\n\n        return E(w(V, W), U)\n\n    }\n\n\n\n    function e(V, U, Z, Y, k, W, X) {\n\n        V = E(V, E(E(p(U, Z, Y), k), X));\n\n        return E(w(V, W), U)\n\n    }\n\n\n\n    function g(k) {\n\n        var V;\n\n        var d = k.length;\n\n        var c = d + 8;\n\n        var b = (c - (c % 64)) / 64;\n\n        var U = (b + 1) * 16;\n\n        var W = Array(U - 1);\n\n        var a = 0;\n\n        var x = 0;\n\n        while (x < d) {\n\n            V = (x - (x % 4)) / 4;\n\n            a = (x % 4) * 8;\n\n            W[V] = (W[V] | (k.charCodeAt(x) << a));\n\n            x++\n\n        }\n\n        V = (x - (x % 4)) / 4;\n\n        a = (x % 4) * 8;\n\n        W[V] = W[V] | (128 << a);\n\n        W[U - 2] = d << 3;\n\n        W[U - 1] = d >>> 29;\n\n        return W\n\n    }\n\n\n\n    function G(c) {\n\n        var b = \"\",\n\n            d = \"\",\n\n            k, a;\n\n        for (a = 0; a <= 3; a++) {\n\n            k = (c >>> (a * 8)) & 255;\n\n            d = \"0\" + k.toString(16);\n\n            b = b + d.substr(d.length - 2, 2)\n\n        }\n\n        return b\n\n    }\n\n\n\n    function u(b) {\n\n        b = b.replace(/\\r\\n/g, \"\\n\");\n\n        var a = \"\";\n\n        for (var k = 0; k < b.length; k++) {\n\n            var d = b.charCodeAt(k);\n\n            if (d < 128) {\n\n                a += String.fromCharCode(d)\n\n            } else {\n\n                if ((d > 127) && (d < 2048)) {\n\n                    a += String.fromCharCode((d >> 6) | 192);\n\n                    a += String.fromCharCode((d & 63) | 128)\n\n                } else {\n\n                    a += String.fromCharCode((d >> 12) | 224);\n\n                    a += String.fromCharCode(((d >> 6) & 63) | 128);\n\n                    a += String.fromCharCode((d & 63) | 128)\n\n                }\n\n            }\n\n        }\n\n        return a\n\n    }\n\n    var D = Array();\n\n    var K, i, F, v, h, T, S, R, Q;\n\n    var N = 7,\n\n        L = 12,\n\n        I = 17,\n\n        H = 22;\n\n    var B = 5,\n\n        A = 9,\n\n        z = 14,\n\n        y = 20;\n\n    var n = 4,\n\n        m = 11,\n\n        l = 16,\n\n        j = 23;\n\n    var P = 6,\n\n        O = 10,\n\n        M = 15,\n\n        J = 21;\n\n    o = u(o);\n\n    D = g(o);\n\n    T = 1732584193;\n\n    S = 4023233417;\n\n    R = 2562383102;\n\n    Q = 271733878;\n\n    for (K = 0; K < D.length; K += 16) {\n\n        i = T;\n\n        F = S;\n\n        v = R;\n\n        h = Q;\n\n        T = f(T, S, R, Q, D[K + 0], N, 3614090360);\n\n        Q = f(Q, T, S, R, D[K + 1], L, 3905402710);\n\n        R = f(R, Q, T, S, D[K + 2], I, 606105819);\n\n        S = f(S, R, Q, T, D[K + 3], H, 3250441966);\n\n        T = f(T, S, R, Q, D[K + 4], N, 4118548399);\n\n        Q = f(Q, T, S, R, D[K + 5], L, 1200080426);\n\n        R = f(R, Q, T, S, D[K + 6], I, 2821735955);\n\n        S = f(S, R, Q, T, D[K + 7], H, 4249261313);\n\n        T = f(T, S, R, Q, D[K + 8], N, 1770035416);\n\n        Q = f(Q, T, S, R, D[K + 9], L, 2336552879);\n\n        R = f(R, Q, T, S, D[K + 10], I, 4294925233);\n\n        S = f(S, R, Q, T, D[K + 11], H, 2304563134);\n\n        T = f(T, S, R, Q, D[K + 12], N, 1804603682);\n\n        Q = f(Q, T, S, R, D[K + 13], L, 4254626195);\n\n        R = f(R, Q, T, S, D[K + 14], I, 2792965006);\n\n        S = f(S, R, Q, T, D[K + 15], H, 1236535329);\n\n        T = C(T, S, R, Q, D[K + 1], B, 4129170786);\n\n        Q = C(Q, T, S, R, D[K + 6], A, 3225465664);\n\n        R = C(R, Q, T, S, D[K + 11], z, 643717713);\n\n        S = C(S, R, Q, T, D[K + 0], y, 3921069994);\n\n        T = C(T, S, R, Q, D[K + 5], B, 3593408605);\n\n        Q = C(Q, T, S, R, D[K + 10], A, 38016083);\n\n        R = C(R, Q, T, S, D[K + 15], z, 3634488961);\n\n        S = C(S, R, Q, T, D[K + 4], y, 3889429448);\n\n        T = C(T, S, R, Q, D[K + 9], B, 568446438);\n\n        Q = C(Q, T, S, R, D[K + 14], A, 3275163606);\n\n        R = C(R, Q, T, S, D[K + 3], z, 4107603335);\n\n        S = C(S, R, Q, T, D[K + 8], y, 1163531501);\n\n        T = C(T, S, R, Q, D[K + 13], B, 2850285829);\n\n        Q = C(Q, T, S, R, D[K + 2], A, 4243563512);\n\n        R = C(R, Q, T, S, D[K + 7], z, 1735328473);\n\n        S = C(S, R, Q, T, D[K + 12], y, 2368359562);\n\n        T = t(T, S, R, Q, D[K + 5], n, 4294588738);\n\n        Q = t(Q, T, S, R, D[K + 8], m, 2272392833);\n\n        R = t(R, Q, T, S, D[K + 11], l, 1839030562);\n\n        S = t(S, R, Q, T, D[K + 14], j, 4259657740);\n\n        T = t(T, S, R, Q, D[K + 1], n, 2763975236);\n\n        Q = t(Q, T, S, R, D[K + 4], m, 1272893353);\n\n        R = t(R, Q, T, S, D[K + 7], l, 4139469664);\n\n        S = t(S, R, Q, T, D[K + 10], j, 3200236656);\n\n        T = t(T, S, R, Q, D[K + 13], n, 681279174);\n\n        Q = t(Q, T, S, R, D[K + 0], m, 3936430074);\n\n        R = t(R, Q, T, S, D[K + 3], l, 3572445317);\n\n        S = t(S, R, Q, T, D[K + 6], j, 76029189);\n\n        T = t(T, S, R, Q, D[K + 9], n, 3654602809);\n\n        Q = t(Q, T, S, R, D[K + 12], m, 3873151461);\n\n        R = t(R, Q, T, S, D[K + 15], l, 530742520);\n\n        S = t(S, R, Q, T, D[K + 2], j, 3299628645);\n\n        T = e(T, S, R, Q, D[K + 0], P, 4096336452);\n\n        Q = e(Q, T, S, R, D[K + 7], O, 1126891415);\n\n        R = e(R, Q, T, S, D[K + 14], M, 2878612391);\n\n        S = e(S, R, Q, T, D[K + 5], J, 4237533241);\n\n        T = e(T, S, R, Q, D[K + 12], P, 1700485571);\n\n        Q = e(Q, T, S, R, D[K + 3], O, 2399980690);\n\n        R = e(R, Q, T, S, D[K + 10], M, 4293915773);\n\n        S = e(S, R, Q, T, D[K + 1], J, 2240044497);\n\n        T = e(T, S, R, Q, D[K + 8], P, 1873313359);\n\n        Q = e(Q, T, S, R, D[K + 15], O, 4264355552);\n\n        R = e(R, Q, T, S, D[K + 6], M, 2734768916);\n\n        S = e(S, R, Q, T, D[K + 13], J, 1309151649);\n\n        T = e(T, S, R, Q, D[K + 4], P, 4149444226);\n\n        Q = e(Q, T, S, R, D[K + 11], O, 3174756917);\n\n        R = e(R, Q, T, S, D[K + 2], M, 718787259);\n\n        S = e(S, R, Q, T, D[K + 9], J, 3951481745);\n\n        T = E(T, i);\n\n        S = E(S, F);\n\n        R = E(R, v);\n\n        Q = E(Q, h)\n\n    }\n\n    return (G(T) + G(S) + G(R) + G(Q)).toLowerCase()\n\n}\nfunction login(){var info=source.getLoginInfoMap();var u='',p='';if(info){u=''+((info.get?info.get('user_name'):info['user_name'])||'');p=''+((info.get?info.get('user_pass'):info['user_pass'])||'');}var c=''+java.getVerificationCode('https://www.shenwen.org/code.jpg');var body='user_name='+encodeURIComponent(u)+'&user_pass='+qsskel(p)+'&user_code='+encodeURIComponent(c);var r=''+java.ajax('https://www.shenwen.org/qs_login_go.php,{\"method\":\"POST\",\"body\":\"'+body+'\"}');if(r.indexOf('登录成功')<0){throw '登录失败：'+r;}}", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=\"og:novel:author\"]@content", "coverUrl": "@js:var m=result.match(/<meta[^>]+property=\"og:image\"[^>]+content=\"([^\"]+)\"/);var v=m?m[1]:'';v.indexOf('http')===0?v:('https://www.shenwen.org'+v)", "intro": "meta[property=\"og:description\"]@content", "kind": "meta[property=\"og:novel:category\"]@content", "lastChapter": "meta[property=\"og:novel:latest_chapter_name\"]@content", "name": "meta[property=\"og:novel:book_name\"]@content"}, "ruleContent": {"content": "@js:var s=''+result;var re=/qsbs\\.bb\\('([^']+)'\\)/g;var m;var o='';while((m=re.exec(s))!==null){try{o+=java.base64Decode(m[1])}catch(e){}}o"}, "ruleExplore": [], "ruleSearch": {"bookList": "a.list", "bookUrl": "@href", "name": "h4@text"}, "ruleToc": {"chapterList": "-@js:var H='https://www.shenwen.org';var mb=baseUrl.match(/\\/book\\/(\\d+)\\//);var bid=mb?mb[1]:'';var html='';try{html=java.ajax(baseUrl)}catch(e){};var map={};var order=[];var m;var r1=/<a[^>]+href=\"\\/book\\/(\\d+)\\/(\\d+)\\.html\"[^>]*>([^<]*)<\\/a>/g;while((m=r1.exec(html))!==null){if(m[1]===bid&&!map[m[2]]){map[m[2]]=m[3];order.push(m[2])}}order.sort(function(a,b){return parseInt(a)-parseInt(b)});var out=[];for(var j=0;j<order.length;j++){var c=order[j];out.push('<a href=\"/book/'+bid+'/'+c+'.html\">'+map[c]+'</a>')}out", "chapterName": "a@text", "chapterUrl": "a@href"}, "searchUrl": "@js:var u='https://www.shenwen.org/search.html?s='+key+',{\"method\":\"POST\"}';try{var w=java.ajax('https://www.shenwen.org/');if(!w||w.indexOf('ge_js_validator_20=')>=0){java.ajax('https://www.shenwen.org/,{\"webView\":true,\"webViewDelayTime\":2500}')}}catch(e){};u", "weight": 0},{"bookSourceComment": "📚 Z-Library\n【登录说明】：书源菜单 → 登录，填邮箱+密码 → 点「🔄 一键切换账号」（可存 2 个号来回切；凭证只存本机）。\n【自检说明】：「🔍 一键自检」查登录/额度/搜索/详情/评论，不耗次数。\n【评论条数】：默认 15，「设置源变量」填数字可改（0 = 不显示）。\n【额度说明】：首下某格式计 1 次，每天北京时间 05:00 重置；同书同格式重下不扣，换格式再计 1 次。\n【本机记录】：真下过的书，详情页顶部显示「✅ 本机记录（时间）」。\n【已在书架】：下完的书会变成书架里的「本地书」，与书源这本是两个身份，故详情页不显示；想确认去书架搜书名。\n【下载导入】：目前阅读只支持 TXT 和 EPUB 格式，其他格式下载之后打开其他应用查看\n【日志可忽略】：getFileNameFromPath / Cannot obtain URL file name（下载直链没后缀，随后会正常保存成「书名 作者」）。", "bookSourceGroup": "📚 搜书", "bookSourceName": "Z-Library（登录版）", "bookSourceType": 3, "bookSourceUrl": "https://zh.zlib.bz", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\": \"🇨🇳 中文热门\", \"url\": \"/eapi/book/search,{\\\"method\\\":\\\"POST\\\",\\\"body\\\":\\\"message=&page={{page}}&limit=20&languages[]=chinese\\\",\\\"headers\\\":{\\\"Content-Type\\\":\\\"application/x-www-form-urlencoded;charset=utf-8\\\",\\\"Accept\\\":\\\"application/json, text/plain, */*\\\"}}\"}, {\"title\": \"📗 中文 EPUB\", \"url\": \"/eapi/book/search,{\\\"method\\\":\\\"POST\\\",\\\"body\\\":\\\"message=&page={{page}}&limit=20&languages[]=chinese&extensions[]=epub\\\",\\\"headers\\\":{\\\"Content-Type\\\":\\\"application/x-www-form-urlencoded;charset=utf-8\\\",\\\"Accept\\\":\\\"application/json, text/plain, */*\\\"}}\"}, {\"title\": \"📃 中文 TXT\", \"url\": \"/eapi/book/search,{\\\"method\\\":\\\"POST\\\",\\\"body\\\":\\\"message=&page={{page}}&limit=20&languages[]=chinese&extensions[]=txt\\\",\\\"headers\\\":{\\\"Content-Type\\\":\\\"application/x-www-form-urlencoded;charset=utf-8\\\",\\\"Accept\\\":\\\"application/json, text/plain, */*\\\"}}\"}, {\"title\": \"🔥 全站推荐\", \"url\": \"/eapi/book/search,{\\\"method\\\":\\\"POST\\\",\\\"body\\\":\\\"message=&page={{page}}&limit=20\\\",\\\"headers\\\":{\\\"Content-Type\\\":\\\"application/x-www-form-urlencoded;charset=utf-8\\\",\\\"Accept\\\":\\\"application/json, text/plain, */*\\\"}}\"}, {\"title\": \"🌍 英文热门\", \"url\": \"/eapi/book/search,{\\\"method\\\":\\\"POST\\\",\\\"body\\\":\\\"message=&page={{page}}&limit=20&languages[]=english\\\",\\\"headers\\\":{\\\"Content-Type\\\":\\\"application/x-www-form-urlencoded;charset=utf-8\\\",\\\"Accept\\\":\\\"application/json, text/plain, */*\\\"}}\"}, {\"title\": \"🇰🇷 韩文热门\", \"url\": \"/eapi/book/search,{\\\"method\\\":\\\"POST\\\",\\\"body\\\":\\\"message=&page={{page}}&limit=20&languages[]=korean\\\",\\\"headers\\\":{\\\"Content-Type\\\":\\\"application/x-www-form-urlencoded;charset=utf-8\\\",\\\"Accept\\\":\\\"application/json, text/plain, */*\\\"}}\"}]", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1790994981499", "loginUi": "[{\"name\": \"email\", \"viewName\": \"'邮箱/用户名（当前：'+(function(){try{var o=JSON.parse(source.getLoginHeader()||'{}');return String(o['X-ZL-Cur']||'未登录');}catch(e){return '未登录';}})()+'）'\", \"type\": \"text\"}, {\"name\": \"password\", \"viewName\": \"'密码'\", \"type\": \"password\"}, {\"name\": \"切换账号\", \"viewName\": \"'🔄 一键切换账号'\", \"type\": \"button\", \"action\": \"zlToggle()\"}, {\"name\": \"自检\", \"viewName\": \"'🔍 一键自检'\", \"type\": \"button\", \"action\": \"zlCheck()\"}]", "loginUrl": "function zlG(k){try{if(typeof result!=='undefined'&&result&&result.get){var v=result.get(k);if(v!=null&&String(v)!==''){return String(v);}}}catch(e){}try{var m=source.getLoginInfoMap();if(m){var v2=m.get(k);if(v2!=null){return String(v2);}}}catch(e){}return '';}function zlP(v){v=String(v==null?'':v).trim();return (v==='null'?'':v);}function zlT(m){try{java.longToast(String(m));}catch(e){}}function zlL(m){try{java.log('Z-Library: '+m);}catch(e){}}function zlVW(s){s=String(s);var n=0;for(var i=0;i<s.length;i++){var c=s.charCodeAt(i);if(c>=0x1100&&(c<=0x115F||c===0x2329||c===0x232A||(c>=0x2E80&&c<=0xA4CF)||(c>=0xAC00&&c<=0xD7A3)||(c>=0xF900&&c<=0xFAFF)||(c>=0xFE30&&c<=0xFE6F)||(c>=0xFF00&&c<=0xFF60)||(c>=0xFFE0&&c<=0xFFE6))){n+=2;}else if((c>=0x2600&&c<=0x27BF)||(c>=0x2300&&c<=0x23FF)||(c>=0x2B00&&c<=0x2BFF)||(c>=0x2014&&c<=0x2015)||c===0x2026){n+=2;}else{n+=1;}}return n;} function zlSp(n){var t='';n=Math.round(Number(n)||0);if(n<0){n=0;}while(n>=2){t+='\\u3000';n-=2;}if(n>0){t+='\\u2002';}return t;} function zlPfx(){try{if(source){if(source.bookSourceName){return String(source.bookSourceName)+': ';}if(source.getTag){return String(source.getTag())+': ';}}}catch(e){}return '';} function zlT2(arr){var pfx=zlPfx(),W=zlVW(pfx),i,w;for(i=0;i<arr.length;i++){w=zlVW(arr[i]);if(w>W){W=w;}}var lines=[];for(i=0;i<arr.length;i++){lines.push(String(arr[i])+zlSp(W-zlVW(arr[i])));}zlT(zlSp(W-zlVW(pfx))+'\\n'+lines.join('\\n'));}function zlSt(){var o={};try{var h=String(source.getLoginHeader()||'');if(h){o=JSON.parse(h)||{};}}catch(e){o={};}return {cur:String(o.Cookie||''),cure:String(o['X-ZL-Cur']||''),alt:String(o['X-ZL-Alt']||''),alte:String(o['X-ZL-AltE']||'')};}function zlPut(cur,cure,alt,alte){var o={Cookie:String(cur||'')};if(cure){o['X-ZL-Cur']=String(cure);}if(alt){o['X-ZL-Alt']=String(alt);}if(alte){o['X-ZL-AltE']=String(alte);}try{source.putLoginHeader(JSON.stringify(o));zlL('已保存账号状态');}catch(e){zlL('保存账号状态失败 '+e);}}function zlCookie(u){return 'remix_userid='+u.id+'; remix_userkey='+u.remix_userkey;}function zlFill(email,pwd){try{var d={email:String(email==null?'':email)};if(pwd!=null){d.password=String(pwd);}java.upLoginData(JSON.parse(JSON.stringify(d)));zlL('界面已刷新');return true;}catch(e){zlL('界面刷新不支持 '+e);return false;}}function zlSaveForm(email,pwd){if(!email){return;}try{source.putLoginInfo(JSON.stringify({email:String(email),password:String(pwd==null?'':pwd)}));}catch(e){zlL('保存表单失败 '+e);}}function zlQuotaText(){try{var pj=JSON.parse(java.ajax('https://zh.zlib.bz/eapi/user/profile'));var u=pj&&pj.user;if(u&&u.id!=null){return '（'+(u.name||u.email||'')+' 今日 '+u.downloads_today+'/'+u.downloads_limit+'）';}}catch(e){}return '';}function zlDo(email,pwd){email=zlP(email);pwd=String(pwd==null?'':pwd);if(!email||!pwd){zlT('请先填写邮箱和密码');return null;}var body='email='+encodeURIComponent(email)+'&password='+encodeURIComponent(pwd);var opt='{\"method\":\"POST\",\"body\":\"'+body+'\",\"headers\":{\"Content-Type\":\"application/x-www-form-urlencoded;charset=utf-8\"}}';var r='';try{r=String(java.connect('https://zh.zlib.bz/eapi/user/login,'+opt).body());}catch(e){zlL('登录网络异常 '+e);zlT('❌网络异常（见日志）');return null;}var j={};try{j=JSON.parse(r);}catch(e){}if(j&&j.success==1&&j.user){return j.user;}zlL('登录失败 '+String(r).substring(0,200));zlT2(['❌ 登录失败',String((j&&j.error)?j.error:String(r).substring(0,48))]);return null;}function zlToggle(){try{return zlGo();}catch(e){zlL('切换异常 '+(e&&e.message?e.message:String(e)));zlT('❌切换出错（见日志）');return 'err';}}\nfunction zlGo(){\nvar st=zlSt();\nzlL('状态 cur='+st.cure+' alt='+st.alte);\nvar email=zlP(zlG('email')),pwd=zlP(zlG('password'));\nif(!st.cur&&!st.cure){\nif(!email||!pwd){zlT('请先填邮箱密码');return 'ok';}\nvar u=zlDo(email,pwd);\nif(!u){return 'fail';}\nzlPut(zlCookie(u),email,'','');\nzlFill(email,'********');\nzlSaveForm(email,'');\nzlT2(['✅ 已登录','今日 '+u.downloads_today+'/'+u.downloads_limit]);\nreturn 'ok';\n}\nif(!st.alt){\nif(email&&pwd&&email!==st.cure){\nvar u2=zlDo(email,pwd);\nif(!u2){return 'fail';}\nzlPut(zlCookie(u2),email,st.cur,st.cure);\nzlFill(email,'********');\nzlSaveForm(email,'');\nzlT2(['✅ 已记住 2 个号','再点一下即切换']);\nreturn 'ok';\n}\nzlT2(['只有 1 个号','填另一个号再点']);\nreturn 'ok';\n}\nvar tgtE=st.alte,tgtC=st.alt;\nzlPut(tgtC,tgtE,st.cur,st.cure);\nzlSaveForm(tgtE,'');\nvar ui=zlFill(tgtE,'********');\nvar arr=['🔁 已切换',tgtE];\nif(!ui){arr.push('※框未刷新 已切好');}\nzlT2(arr);\nreturn 'ok';\n}\nfunction login(){\nvar st=zlSt();\nvar email=zlP(zlG('email')),pwd=zlP(zlG('password'));\nif(st.alte&&email===st.alte){\nzlPut(st.alt,st.alte,st.cur,st.cure);\nzlSaveForm(email,'');\nzlFill(email,'********');\nzlT2(['🔁 已切换',email]);\nreturn 'ok';\n}\nif(st.cure&&email===st.cure){zlSaveForm(email,'');return 'keep';}\nif(email&&pwd){\nvar u=zlDo(email,pwd);\nif(!u){return 'fail';}\nif(st.cure){zlPut(zlCookie(u),email,st.cur,st.cure);}else{zlPut(zlCookie(u),email,'','');}\nzlSaveForm(email,'');\nreturn 'ok';\n}\nreturn 'keep';\n}\nfunction zlCheck(){\nvar rep=[];var bad=false;\nvar loginOK=false,qline='',rline='',sOK=false,dOK=false,cOK=false,first=null;\ntry{\nvar u=null;\ntry{var pj=JSON.parse(java.ajax('https://zh.zlib.bz/eapi/user/profile'));u=(pj&&pj.user)||null;if(!u||!u.id){rep.push('profile: '+String(pj).substring(0,120));}}catch(e){rep.push('profile 异常: '+e);}\nif(u&&u.id){\nloginOK=true;\nvar used=Number(u.downloads_today),lim=Number(u.downloads_limit);\nvar left=(isNaN(used)||isNaN(lim))?null:(lim-used);\nqline='✅ 登录\\u3000'+(left==null?('今日 '+u.downloads_today+'/'+u.downloads_limit):('剩 '+left+' 次'));\nrep.push('账号['+String(u.name||'')+'] <'+String(u.email||'')+'> 今日 '+u.downloads_today+'/'+u.downloads_limit+' 剩'+left);\nif(left!=null&&left<=0){\nvar now=Date.now();var bj=new Date(now+8*3600000);\nvar rst=Date.UTC(bj.getUTCFullYear(),bj.getUTCMonth(),bj.getUTCDate(),5,0,0)-8*3600000;\nif(now>=rst){rst+=86400000;}\nvar mm=Math.round((rst-now)/60000);if(mm<0){mm=0;}\nrline='⏰ 重置\\u3000还有 '+Math.floor(mm/60)+'h'+(mm%60)+'m';\n}\n}else{\nqline='❌ 登录\\u3000未登录';\n}\nvar st=zlSt();\nrep.push('已记住 主['+st.cure+'] 备['+st.alte+']');\ntry{\nvar body='message='+encodeURIComponent('book')+'&page=&limit=5';\nvar opt='{\"method\":\"POST\",\"body\":\"'+body+'\",\"headers\":{\"Content-Type\":\"application/x-www-form-urlencoded;charset=utf-8\"}}';\nvar sj=JSON.parse(java.ajax('https://zh.zlib.bz/eapi/book/search,'+opt));\nvar bs=(sj&&sj.books)||[];\nif(bs.length){first=bs[0];}else{rep.push('搜索返回 0 条');}\nsOK=!!first;\n}catch(e){rep.push('搜索异常: '+e);}\nif(first&&first.id&&first.hash){\ntry{var dj=JSON.parse(java.ajax('https://zh.zlib.bz/eapi/book/'+first.id+'/'+first.hash));dOK=!!(dj&&dj.book&&dj.book.dl);if(!dOK){rep.push('详情缺 dl');}}catch(e){rep.push('详情异常: '+e);}\ntry{java.ajax('https://zh.zlib.bz/papi/comments/book/'+first.id+'/0?limit=3');cOK=true;}catch(e){rep.push('评论异常: '+e);}\n}else{rep.push('跳过详情/评论（搜索无结果）');}\nrep.push('搜索'+(sOK?'OK':'FAIL')+' 详情'+(dOK?'OK':'FAIL')+' 评论'+(cOK?'OK':'FAIL'));\nif(!loginOK||!sOK||!dOK||!cOK){bad=true;}\ntry{var lg=JSON.parse(String(cache.get('zl_log')||'')||'[]')||[];\nif(lg&&lg.length){\nvar dt=[];for(var qi=lg.length-1;qi>=0;qi--){var x=lg[qi]||{};var dd=new Date(x.t||Date.now());\ndt.push(('0'+dd.getHours()).slice(-2)+':'+('0'+dd.getMinutes()).slice(-2)+' 打开#'+(x.b||'?')+' 账号'+(x.a||'?')+' 已用'+(x.cur==null?'?':x.cur)+' 上次'+(x.prev==null?'-':x.prev)+' 归属'+(x.to||'-')+(x.hit?' → 判定下载':''));}\nrep.push('下载检测('+lg.length+'):\\n'+dt.join('\\n'));\n}else{rep.push('下载检测: 暂无记录');}}catch(e){}\nif(bad){try{java.log('Z-Library 自检异常：\\n'+rep.join('\\n'));}catch(e){}}\nvar out=[];\nif(!loginOK){out.push('—— 请先登录 ——');}\nelse if(!sOK||!dOK||!cOK){out.push('—— 有异常 ——');}\nelse{out.push('—— 全部正常 ——');}\nout.push(qline);\nout.push(sOK?'✅ 搜索\\u3000正常':'❌ 搜索\\u3000异常');\nout.push(dOK?'✅ 详情\\u3000正常':'❌ 详情\\u3000异常');\nout.push(cOK?'✅ 评论\\u3000正常':'❌ 评论\\u3000异常');\nif(rline){out.push(rline);}\nzlT2(out);\n}catch(e){zlT('自检出错（详见日志）');zlL('自检异常 '+e);}\nreturn 'checked';\n}\n", "respondTime": 180000, "ruleBookInfo": {"author": "$.book.author", "coverUrl": "$.book.cover", "downloadUrls": "@js:(function(){\n try{\n  var base=String(source.bookSourceUrl||'').replace(/#.*$/,'').replace(/\\/+$/,'');\n  var b=(JSON.parse(result).book)||{};\n  var bid=String(b.id||'');\n  var ext=String(b.extension||'epub').toLowerCase().replace(/[^a-z0-9]/g,'')||'epub';\n  var dl=String(b.dl||'');\n  if(!dl){return '';}\n  var page=(dl.indexOf('http')===0)?dl:(base+'/'+dl.replace(/^\\//,''));\n  var tok='';\n  try{tok=String(cache.get('zl_ctok')||'');}catch(e){}\n  if(!tok){\n   var js=\"(function(){try{var m=String(document.cookie).match(/c_token=([^;]+)/);if(m){return m[1];}var C=null,S=null;try{if(typeof c!=='undefined'){C=c;}}catch(e){}try{if(typeof s1!=='undefined'){S=s1;}}catch(e){}if(!C){var mm=String(document.documentElement.innerHTML).match(/[0-9A-Fa-f]{40}/);if(mm){C=mm[0];}}if(!C||!S){return '';}var n1=parseInt(C.charAt(0),16);for(var i=0;i<4000000;i++){var s=S.array(C+i);if(s[n1]===0xb0&&s[n1+1]===0x0b){document.cookie='c_token='+C+i+'; path=/';document.cookie='c_time=0.4; path=/';return String(C)+String(i);}}return '';}catch(e){return '';}})()\";\n   try{tok=String(java.webView(null,page,js)||'');}catch(e){}\n   if(tok){try{cache.put('zl_ctok',tok,43200);}catch(e){}}\n  }\n  if(tok){\n   try{cookie.setCookie(base,'c_token='+tok+'; c_time=0.4');}catch(e){}\n   try{Packages.android.webkit.CookieManager.getInstance().setCookie(base,'c_token='+tok+'; c_time=0.4');}catch(e){}\n  }\n  return page+',{\"type\":\"'+ext+'\"}';\n }catch(e){return '';}\n})()\n", "intro": "@js:(function(){\n  var out='';\n  var SEP=function(t){return '✦ ──── '+t+' ──── ✦';};\n  try{\n    var j=(JSON.parse(result).book)||{};\n    if(!j.title&&!j.description){return '⚠️ 未获取到书籍信息，请先在书源菜单点「登录」。';}\n    var _bid=String(j.id||'');\n    var _base=String(source.bookSourceUrl||'').replace(/#.*$/,'').replace(/\\/+$/,'');\n    var _u=null;\n    try{var _pj=JSON.parse(java.ajax(_base+'/eapi/user/profile'));_u=(_pj&&_pj.user)||null;}catch(e){}\n    var _an=_u?String(_u.name||_u.email||''):'';\n    var _used=_u?Number(_u.downloads_today):NaN;\n    var _lim=_u?Number(_u.downloads_limit):NaN;\n    var _dbg={b:_bid,a:_an,cur:(isNaN(_used)?null:_used),prev:null,to:null,hit:0};\n    try{\n      if(_an&&!isNaN(_used)){\n        var _lq={};\n        try{_lq=JSON.parse(String(cache.get('zl_lq')||'')||'{}')||{};}catch(e){_lq={};}\n        if(_lq&&_lq.a===_an&&_lq.q!=null&&_lq.b){\n          var _pn=Number(_lq.q);\n          _dbg.prev=_pn;_dbg.to=String(_lq.b);\n          if(!isNaN(_pn)&&_used>_pn){\n            cache.put('zl_dlv_'+String(_lq.b),String(_lq.t||Date.now()),0);\n            try{java.log('Z-Library 判定下载: 书#'+_lq.b+' 已用 '+_pn+'→'+_used+' 归属书#'+_lq.b);}catch(e){}\n            _dbg.hit=1;\n          }\n        }\n        cache.put('zl_lq',JSON.stringify({a:_an,b:_bid,q:_used,t:Date.now()}),0);\n      }\n    }catch(e){}\n    try{\n      var _log=[];\n      try{_log=JSON.parse(String(cache.get('zl_log')||'')||'[]')||[];}catch(e){_log=[];}\n      if(!_log||_log.length==null){_log=[];}\n      _log.push(_dbg);\n      while(_log.length>5){_log.shift();}\n      cache.put('zl_log',JSON.stringify(_log),0);\n    }catch(e){}\n    try{cache.put('zl_dbg',JSON.stringify(_dbg),0);}catch(e){}\n    try{\n      var _dT=parseInt(String(cache.get('zl_dlv_'+_bid)||''),10);\n      if(!isNaN(_dT)&&_dT>0){\n        var _rdt=new Date(_dT);\n        out+='✅ 本机记录：这本下载过（'+(_rdt.getMonth()+1)+'月'+_rdt.getDate()+'日 '+('0'+_rdt.getHours()).slice(-2)+':'+('0'+_rdt.getMinutes()).slice(-2)+'）\\n\\n';\n      }\n    }catch(e){}\n    var _tip='';\n    if(!isNaN(_used)&&!isNaN(_lim)&&_lim>0&&_used>=_lim){\n      var _t='';\n      try{\n        var _now=Date.now();var _bj=new Date(_now+8*3600000);\n        var _reset=Date.UTC(_bj.getUTCFullYear(),_bj.getUTCMonth(),_bj.getUTCDate(),5,0,0)-8*3600000;\n        if(_now>=_reset){_reset+=86400000;}\n        var _m=Math.round((_reset-_now)/60000);if(_m<0){_m=0;}\n        _t='，'+Math.floor(_m/60)+'h'+(_m%60)+'m 后重置';\n      }catch(e){}\n      _tip='⚠️ 今日下载次数已用完（'+_used+'/'+_lim+'）'+_t+'\\n　额度每天北京时间 05:00 更新';\n    }else if(_an&&!isNaN(_used)&&!isNaN(_lim)&&_lim>0){\n      _tip='💾 下载本书：点【加入书架】或【阅读】任意一个\\n　账号 '+_an+' · 今日还剩 '+(_lim-_used)+' 次\\n　首次计 1 次 · 重复下不扣 · 下完在书架里搜书名';\n    }else{\n      _tip='💾 下载本书：点【加入书架】或【阅读】任意一个\\n　首次计 1 次 · 重复下不扣 · 下完在书架里搜书名';\n    }\n    out+=_tip+'\\n\\n';\n    var info=[];\n    if(j.title){info.push('📖 书名：'+String(j.title));}\n    if(j.author){info.push('👤 作者：'+String(j.author));}\n    var _pub=[];\n    if(j.publisher){_pub.push(String(j.publisher));}\n    if(j.year){_pub.push(String(j.year)+'年');}\n    if(_pub.length){info.push('🏢 出版：'+_pub.join(' · '));}\n    if(j.language){info.push('🌐 语言：'+String(j.language));}\n    var _fmt=[];\n    var ex=String(j.extension||'').toUpperCase();\n    if(ex){_fmt.push(ex);}\n    if(j.filesizeString){_fmt.push(String(j.filesizeString));}\n    if(j.pages){_fmt.push(String(j.pages)+' 页');}\n    if(_fmt.length){info.push('📄 格式：'+_fmt.join(' · '));}\n    var _sc=[];\n    if(j.qualityScore!=null){_sc.push('⭐ '+String(j.qualityScore)+' / 5');}\n    if(j.interestScore!=null){_sc.push('🔥 热度 '+String(j.interestScore));}\n    if(_sc.length){info.push(_sc.join('　'));}\n    var _ids=[];\n    if(j.identifier){_ids.push('🔖 ISBN '+String(j.identifier));}\n    if(j.series){_ids.push('📚 系列 '+String(j.series));}\n    if(j.edition){_ids.push('📕 版本 '+String(j.edition));}\n    if(_ids.length){info.push(_ids.join('　'));}\n    if(info.length){out+=SEP('书籍信息')+'\\n'+info.join('\\n')+'\\n\\n';}\n    var d=String(j.description||'').replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&quot;/g,'\"').replace(/&#39;/g,\"'\").replace(/&#x27;/g,\"'\").replace(/&nbsp;/g,' ').replace(/&amp;/g,'&').replace(/<[^>]*>/g,' ').replace(/\\s+/g,' ').trim();\n    if(d){\n      if(d.length>200){\n        var _cut=d.substring(0,200),_last=-1;\n        for(var _pi=0;_pi<_cut.length;_pi++){var _ch=_cut.charAt(_pi);if(_ch==='。'||_ch==='！'||_ch==='？'||_ch==='!'||_ch==='?'||_ch==='.'){_last=_pi;}}\n        if(_last>=120){_cut=_cut.substring(0,_last+1);}else{var _sp=_cut.lastIndexOf(' ');if(_sp>120){_cut=_cut.substring(0,_sp);}}\n        d=_cut+'…';\n      }\n      out+=SEP('内容简介')+'\\n'+d+'\\n\\n';\n    }\n    var LIMIT=15;\n    try{\n      var _c=[];\n      try{var _bv=book.getVariable('custom');if(_bv!=null){_c.push(String(_bv));}}catch(e){}\n      try{var _sv=source.getVariable();if(_sv!=null){_c.push(String(_sv));}}catch(e){}\n      for(var _i=0;_i<_c.length;_i++){var _mm=String(_c[_i]).match(/\\d+/);if(_mm){var _n=parseInt(_mm[0],10);if(!isNaN(_n)){LIMIT=_n;break;}}}\n    }catch(e){}\n    if(LIMIT>0){\n      try{\n        var _pull=Math.max(100,LIMIT);\n        var cj=JSON.parse(java.ajax(_base+'/papi/comments/book/'+j.id+'/0?limit='+_pull));\n        var arr=(cj&&cj.comments)||[];\n        var _rs=(cj&&cj.reactionsInfo&&cj.reactionsInfo.reactions)||[];\n        var _lm={};\n        for(var _ri=0;_ri<_rs.length;_ri++){_lm[String(_rs[_ri].item_id)]=Number(_rs[_ri].count)||0;}\n        var _ca=[];\n        for(var _ci2=0;_ci2<arr.length;_ci2++){\n          var _cc=arr[_ci2]||{};\n          var _tx=String(_cc.text||'').replace(/\\s+/g,' ').trim();\n          if(!_tx){continue;}\n          _ca.push({i:_ci2,t:_tx,dt:_cc.dateRelative?String(_cc.dateRelative):'',lk:_lm[String(_cc.id)]||0});\n        }\n        _ca.sort(function(a,b){return (b.lk-a.lk)||(a.i-b.i);});\n        var lines=[];\n        for(var _li=0;_li<_ca.length&&lines.length<LIMIT;_li++){\n          var _it=_ca[_li];\n          lines.push((lines.length+1)+'. '+(_it.dt?('['+_it.dt+'] '):'')+_it.t);\n        }\n        out+=SEP('读者评论 · 按热度')+'\\n'+(lines.length?lines.join('\\n'):'（暂无评论）');\n      }catch(e2){ out+=SEP('读者评论')+'\\n（获取失败）'; }\n    }\n  }catch(e){}\n  return out;\n})()", "kind": "@js:(function(){try{var b=JSON.parse(result).book||{};var k=[String(b.extension||\"\").toUpperCase()];if(b.filesizeString){k.push(String(b.filesizeString))}if(b.qualityScore!=null&&b.qualityScore!==undefined){k.push(\"⭐\"+b.qualityScore)}if(b.publisher){k.push(String(b.publisher))}if(b.year){k.push(String(b.year))}return k.join(\" · \")}catch(e){return \"\"}})()", "name": "$.book.title"}, "ruleContent": [], "ruleExplore": {"author": "author", "bookList": "@js:(function(){try{var j=JSON.parse(result);var a=(j&&j.books)?j.books:[];var o=[];for(var i=0;i<a.length;i++){var b=a[i]||{};var d=String(b.description||'').replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&quot;/g,'\"').replace(/&#39;/g,\"'\").replace(/&#x27;/g,\"'\").replace(/&nbsp;/g,' ').replace(/&amp;/g,'&').replace(/<[^>]*>/g,' ').replace(/\\s+/g,' ').trim();o.push({name:String(b.title||''),author:String(b.author||''),cover:String(b.cover||''),intro:d,kind:(String(b.extension||'').toUpperCase()+' · '+String(b.filesizeString||'')+' · ⭐'+String(b.qualityScore!=null?b.qualityScore:'-')),bookUrl:'/eapi/book/'+String(b.id)+'/'+String(b.hash)});}return o;}catch(e){return [];}})()", "bookUrl": "bookUrl", "coverUrl": "cover", "intro": "intro", "kind": "kind", "name": "name"}, "ruleSearch": {"author": "author", "bookList": "@js:(function(){try{var j=JSON.parse(result);var a=(j&&j.books)?j.books:[];var o=[];for(var i=0;i<a.length;i++){var b=a[i]||{};var d=String(b.description||'').replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&quot;/g,'\"').replace(/&#39;/g,\"'\").replace(/&#x27;/g,\"'\").replace(/&nbsp;/g,' ').replace(/&amp;/g,'&').replace(/<[^>]*>/g,' ').replace(/\\s+/g,' ').trim();o.push({name:String(b.title||''),author:String(b.author||''),cover:String(b.cover||''),intro:d,kind:(String(b.extension||'').toUpperCase()+' · '+String(b.filesizeString||'')+' · ⭐'+String(b.qualityScore!=null?b.qualityScore:'-')),bookUrl:'/eapi/book/'+String(b.id)+'/'+String(b.hash)});}return o;}catch(e){return [];}})()", "bookUrl": "bookUrl", "coverUrl": "cover", "intro": "intro", "kind": "kind", "name": "name"}, "ruleToc": [], "searchUrl": "/eapi/book/search,{\"method\":\"POST\",\"body\":\"message={{java.encodeURI(key)}}&page={{page}}&limit=20\",\"headers\":{\"Content-Type\":\"application/x-www-form-urlencoded;charset=utf-8\",\"Accept\":\"application/json, text/plain, */*\"}}", "variableComment": "（可以不填）评论条数：不填=默认15条；想调整再填数字，如 8 / 20，填0则不显示评论", "weight": 0},{"bookSourceComment": "2026.8.8 修复搜索只有一本书的情况，原代码为{{eval(String(source.loginUrl));GetUL();}}/search.html?q={{key}}&f=_all&sort={{Sort_('search')}}&p={{page}}&serialize=\n\t修复后{{eval(String(source.loginUrl));GetUL();}}/search.html?q={{key}}&f=_al\n2026.7.29 修复获取站源，优化书评格式 ◎夜泽川◎\n2026.6.21 更新获取站源目标 ◎夜泽川◎\n2026.5.24 修复诸多问题 ◎夜泽川◎\n2024.7.26 ◎夜泽川◎\n//搜索和发现需要封面可复制规则到相应位置，因为封面是从详情取的，所以可能会导致加载变慢甚至超时，自行斟酌。↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓\na@href\n<js>\nul = GetUL() + result;\njava.ajax(ul);\n</js>\n[property$=image]@content", "bookSourceGroup": "自制", "bookSourceName": "®️爱丽丝书屋（大侠修）", "bookSourceType": 0, "bookSourceUrl": "爱丽丝书屋", "bookUrlPattern": "https?:\\/\\/.*?\\..*?(xnxnxn|alice|爱丽丝|als).*?\\.[a-zA-Z]+?\\/novel\\/\\d+\\.html", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\neval(String(source.loginUrl));\nlet Cookie = cookie.getCookie(GetUL());\nif (!/lf_user_auth/.test(Cookie) && source.getLoginHeader()) {\n    let ck = source.getLoginHeaderMap()['Cookie']\n    cookie.setCookie(GetUL(), ck);\n    java.toast('登录状态掉了，已重新登陆');\n}\nvar result = [];\nvar headers = JSON.stringify({\"headers\":{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.6167.171 Safari/537.36\"}});\nvar push = (title, url, size) =>\n    result.push({\n        title: title,\n        url: url ? `{{GetUL()}}${url},` + headers : url,\n        style: {\n            layout_flexGrow: 1,\n            layout_flexBasisPercent: size\n        }\n    });\npush(`当前站源：${GetUL()}`, null, 1)\nif (source.getLoginHeader()) {\n    let jc = source.getLoginHeaderMap();\n    let inf = decodeURIComponent(jc.get(\"Cookie\"));\n    let info = decodeURIComponent(inf).match(/\\{[\\s\\S]+\\}/)[0];\n    let username = JSON.parse(info)['username'];\n    let expe = Ajax(`${GetUL()}/user/index/index.html`);\n    let ex = org.jsoup.Jsoup.parse(expe).select('.group , .user-data li');\n    push(`用户◎${username}◎中心`, null, 1);\n    push(\"书架\", \"/user/bookshelf?page={{page}}\", 0.45);\n    push(\"阅读记录\", \"/user/recentread/index.html\", 0.45);\n    ex.forEach(xp => {\n        nam = String(xp.text()).replace(/[^\\u4e00-\\u9fa5a-zA-Z0-9]/g, \"\");\n        title = /\\d/.test(nam) ? nam.replace(/(\\d+)([^\\d]+)/, \"$2：$1\") : nam.replace(/^/, \"用户等级：\");\n        push(title, null, 0.45);\n    });\n} else {\n    push(\"未登录\", null, 1);\n}\npush(\"--------书库--------\", null, 1);\npush(\"最近更新\", \"/all{{Sort_()}}.html\", 0.45);\npush(\"原创\", \"/original.html?page={{page}}\", 0.45);\npush(\"排行\", null, 1);\nvar src = Ajax(`${GetUL()}/all/order/hits+desc.html`);\nvar ph = org.jsoup.Jsoup.parse(src).select('.paihang_ds a');\nph.forEach(ta => {\n    nam = ta.text();\n    ul = ta.attr('href')\n    push(nam, ul, 0.45);\n})\npush(\"分类\", null, 1);\nvar tag = org.jsoup.Jsoup.parse(src).select('.fenlei_ds a');\ntag.forEach(ta => {\n    nam = ta.text();\n    ul = String(ta.attr('href')).replace(/$/, \"?page={{page}}\").replace(/lists/, \"all/id\").replace(/\\.html/, `{{Sort_()}}$&`);\n    push(nam, ul, 0.25);\n})\nif (source.getLoginInfoMap()?.[\"发现自定义标签🏷️（中 / 英逗号分隔）\"] != \"\") {\n\t   push(\"自定义标签🏷️\", null, 1);\n\t   let myTags = String(source.getLoginInfoMap()[\"发现自定义标签🏷️（中 / 英逗号分隔）\"]).split(/[,，]/);\n\t   myTags.forEach(tag => {\n\t   \tlet url = `/search.html?q=${tag}&f=tag&sort={{Sort_('search')}}&p={{page}}&serialize=`;\n\t   \tpush(tag, url, 0.25);\n\t   \t});\n}\nJSON.stringify(result);", "header": "{\"User-Agent\": \"Mozilla/5.0 (Android 11; Mobile; rv:147.0) Gecko/147.0 Firefox/147.0\"}", "jsLib": "//构建验证参数\nfunction calculateChecksum(nonce, cookieString) {\n    var cpk = \"ge_ua_p\";\n    if (!cookieString || !nonce) {\n        return null;\n    }\n    \n    var cookieValue = \"\";\n    var cookieArray = cookieString.toString().split(\";\");\n    \n    for (var i = 0; i < cookieArray.length; i++) {\n        var cookie = cookieArray[i].trim();\n        var parts = cookie.split(\"=\");\n        if (parts.length === 2 && parts[0] === cpk) {\n            cookieValue = parts[1];\n            break;\n        }\n    }\n    \n    if (cookieValue.length === 0) {\n        return null;\n    }\n    \n    var sum = 12345;\n    for (var i = 0; i < cookieValue.length; i++) {\n        var char = cookieValue[i];\n        if (/^[a-zA-Z0-9]$/.test(char)) {\n            sum += cookieValue.charCodeAt(i) * (nonce + i);\n        }\n    }\n    \n    return {\n    \t\"body\": \"sum=\" + sum + \"&nonce=\" + nonce,\n    \t\"cookieValue\": cookieValue\n    \t};\n}\n\nfunction Check_(src, cookies = null, url) {\n    const { java } = this;\n    if (!/Checking your browser/.test(src)) return src;\n    java.toast('检测到验证，正在自动处理中……');\n    let nonce = parseInt(src.match(/nonce\\s*=\\s*(\\d+)/)[1]);\n    cookies = String(cookies);\n    //java.log(`${cookies}|${nonce}`);\n\n    let data = calculateChecksum(nonce, cookies);\n\n    let headers = {\n        \"User-Agent\": \"Mozilla/5.0 (Android 11; Mobile; rv:140.0) Gecko/140.0 Firefox/140.0\",\n        \"Content-Type\": \"application/x-www-form-urlencoded\",\n        \"Referer\": String(this.GetUL() + \"/\"),\n        \"X-Ge-Ua-Step\": \"prev\",\n        \"Cookie\": String(\"ge_ua_p=\" + data.cookieValue)\n    };\n    \n    let postResponse = java.post(this.GetUL(), data.body, headers);\n    \n    let success = JSON.parse(postResponse.body()).ok;\n    java.toast(success ? '验证通过' : '验证失败，请重试！');\n\n    if (!success) return src;\n    \n    return java.ajax(url);\n}\n\nfunction Sort_(t) {\n\t   const { source } = this\n    const sgvs = JSON.parse(source.getVariable())?.s || 0;\n    \n    if (!sgvs) return t === 'search' ? 'relevance' : '';\n    const sorts = ['update_time+desc', 'hits+desc', 'word+desc'];\n    const sort = sorts[sgvs - 1];\n    \n    if (t === 'search') {\n        return sort.replace('+', '_');\n    }\n    return '/order/' + sort;\n}\n\nfunction GetUL() {\n\tconst { source } = this;\n\tlet sourceul = JSON.parse(source.getVariable()).sourl;\n\treturn sourceul;\n}\n\nfunction timeov(times) {\n    const date = new Date(times);\n    const year = date.getFullYear();\n    const month = String(date.getMonth() + 1).padStart(2, '0');\n    const day = String(date.getDate()).padStart(2, '0');\n    const hours = String(date.getHours()).padStart(2, '0');\n    const minutes = String(date.getMinutes()).padStart(2, '0');\n    const seconds = String(date.getSeconds()).padStart(2, '0');\n    \n    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n}\n\ncodesvg = \"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIAogICAgIHZpZXdCb3g9IjAgMCA3MDAgMjAwIiAKICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIgogICAgIHN0eWxlPSJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyI+CiAgPHJlY3Qgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0id2hpdGUiLz4KICAKICA8IS0tIOmhtumDqOagh+mimCAtLT4KICA8dGV4dCB4PSI1MCUiIHk9IjQwIiAKICAgICAgICBmb250LXNpemU9IjIwIiAKICAgICAgICBmb250LXdlaWdodD0iYm9sZCIgCiAgICAgICAgdGV4dC1hbmNob3I9Im1pZGRsZSIgCiAgICAgICAgZmlsbD0iIzAwMCI+6YCJ5oup5Y+R6YCB57G75Z6LPC90ZXh0PgogIAogIDwhLS0g6K+E6K665qih5Z2XIC0tPgogIDx0ZXh0IHg9IjI1JSIgeT0iOTAiIAogICAgICAgIGZvbnQtc2l6ZT0iMTYiIAogICAgICAgIGZvbnQtd2VpZ2h0PSJib2xkIiAKICAgICAgICB0ZXh0LWFuY2hvcj0ibWlkZGxlIiAKICAgICAgICBmaWxsPSIjMDAwIj7or4Torro8L3RleHQ+CiAgPHRleHQgeD0iMjUlIiB5PSIxMTAiIAogICAgICAgIGZvbnQtc2l6ZT0iMTQiIAogICAgICAgIGZvbnQtd2VpZ2h0PSJib2xkIiAKICAgICAgICB0ZXh0LWFuY2hvcj0ibWlkZGxlIiAKICAgICAgICBmaWxsPSIjMDAwIj4o5aGr5YaZIuivhOiuuiIpPC90ZXh0PgogIAogIDwhLS0g5Zue5aSN5qih5Z2XIC0tPgogIDx0ZXh0IHg9Ijc1JSIgeT0iOTAiIAogICAgICAgIGZvbnQtc2l6ZT0iMTYiIAogICAgICAgIGZvbnQtd2VpZ2h0PSJib2xkIiAKICAgICAgICB0ZXh0LWFuY2hvcj0ibWlkZGxlIiAKICAgICAgICBmaWxsPSIjMDAwIj7lm57lpI08L3RleHQ+CiAgPHRleHQgeD0iNzUlIiB5PSIxMTAiIAogICAgICAgIGZvbnQtc2l6ZT0iMTQiIAogICAgICAgIGZvbnQtd2VpZ2h0PSJib2xkIiAKICAgICAgICB0ZXh0LWFuY2hvcj0ibWlkZGxlIiAKICAgICAgICBmaWxsPSIjMDAwIj4o5aGr5YaZIkBpZCIpPC90ZXh0PgogIAogIDwhLS0g5bqV6YOo5L+h5oGvIC0tPgogIDx0ZXh0IHg9IjUwJSIgeT0iMTgwIiAKICAgICAgICBmb250LXNpemU9IjE0IiAKICAgICAgICBmb250LXdlaWdodD0iYm9sZCIgCiAgICAgICAgdGV4dC1hbmNob3I9Im1pZGRsZSIgCiAgICAgICAgZmlsbD0iIzAwMCI+5qW85bGCaWTnroDku4vmnIk8L3RleHQ+Cjwvc3ZnPg==\";\n\nfunction Ajax(url) {\n     const { java, cookie } = this;\n     let result = java.ajax(url);\n     result = this.Check_(result, cookie.getCookie(this.GetUL()), url);\n     return result;\n}\n\nconst SALT1 = \"B3wlP9Tzo$0RIdlvX&^sg30^0&feAox%\";\nconst SALT2 = \"Rs4qM7mGrQ6aTMr8HHvv3WikTcY&kW8R\";\n\nconst PRIVATE_KEY = [\n    \"MIIEogIBAAKCAQEAnOUiABBEw9zzOqivp4uJxTd3D5Givmwx2i+JLVdyj9iO2S1E\",\n    \"crWOaO5k6lD4fbL0MnMH+luJhO3ySm1xDZy22ruzvPHhd+Sh3nH56+hOcj1jfpBx\",\n    \"lDPlwyo2nDshY0VFr/3fonFjepp5PP+eZKYt9YWtxrVMWOc0yNH6HuRA+zwUX28W\",\n    \"RlP/4vMWi6vEYt0XLt+lTBGqyvwxPYJBYivIehGz4exC7K1bpvX8LJWVARkvEIuf\",\n    \"Y3sQHtC/BTeYoEsipfZYafTgQHJ+KAOZSq/CET0USeTt+Evfn6YcbWX577DrRyGt\",\n    \"siJjojMEG5TKdDQWmGKTQb4E2+EpTrQYaCcaowIDAQABAoIBAC8L9noWZshkxPre\",\n    \"Am43RYTB8Q3WGfsH7psCjhvukQfZZFxzWocbMiz8733j8d+ffeJy4/2K3V3jDDiN\",\n    \"QM1YJOzKREdwMLAG+xL9EnhPHNbc2azmG2jZdxhi3CVVBdoCt7biZeEMJ0xobdqA\",\n    \"vDpqKnXpNAbV7qLqEcX2UQ5aW7H6BdCgGk9HRBKXs/ll65NZmxORXLoAVg+w7Vzi\",\n    \"XaLP6+43KNXUPLz0EPndDH9VkGlMcyu6q7pWLoz6eN0fNiP4Jfl9PbV4KFlye2xo\",\n    \"4FI+Go8luM0onDL1+bKE5RJHXqfS+ow9hYzBJSz39jyNpiH7j8Hg8mMDPm0VIYtM\",\n    \"sOF/RgECgYEAzuuziQzrT74ZW27AQqMFQFLvqMmnrhR4CPg0mRq/PMHSzh+Bs+nS\",\n    \"Gib2d1ulkKIDHPOG9EWKXBOUvHOBmGro+sOS9fnfoJYeNhLmX5K1xcDJpsBOMdZv\",\n    \"euEit2i7yy+KAc26fP+SoCQEHm1mlgZG1vcfJlPDofqwRyBeKHPAkGMCgYEAwhvb\",\n    \"Fw3udE0hws92+9GYmjES8jNauBaP3hlu3lmxcnjlVqlkHbc9PkvddmCsSB/5TUCH\",\n    \"7qJRgYLo+uov40zNNavXv8cTqWvDrJxTuDFn0OSjeIvqS9kXeVHjpBP6d4CCLAZM\",\n    \"b6owfM8JtBFx9ef9ll5mwBekZDrspEXOgoCQwMECgYBujaILvFpQ7alQn5ibQcxB\",\n    \"dM5VKQCs0oTbjflUP+UjCg+eT1kWDfxSOrT+SnnoD5eINVjKVAk7br7N/QylqaE2\",\n    \"sZ1oTIu9mdckXu6064aw1HMo46AjooVHatgIlC2ZvpmGoytbM5VceEG3HA5uY4Yf\",\n    \"vkLnUGO6vFzIc7O6+zVMLwKBgFmIab0vkt6YOUtXUIWEvwPYQOnwoBaraX7Dcm0j\",\n    \"KAMqGnanuWMvgxM6ARO6MZ0vCloEuu5qdnfrfzVFUgNhCIKKGgD+fWY3K9FxZfhe\",\n    \"6Yjj/Tb8Kn0DzJ0MFZk4Ed6PKvvNh/I1qRnYkZw6M7t+X2y9bF2MSiplN4PqIv/0\",\n    \"90/BAoGAQXzOzA3q+vcA9mwKvwXrPiSscmZMekV6RBUxf1riRzTnds9uWSTKz8QM\",\n    \"LpEoNB3tKSB+4raK6xJGJ914b+jc/B7ayHDksStOLeJLV6t5+bmoKjk6qBrUjTQX\",\n    \"y8x2rsHReaJw0SbZy+4x55nYTi/0mdzomR7N27EzYtzM7iWk5w0=\",\n].join(\"\\n\");\n\nfunction getAuthHeaders(sourceId, chapterId, t) {\n    const { java } = this;\n    const signStr = SALT1 + t + sourceId + chapterId + SALT2;\n    const token = java.digestHex(signStr, \"SHA-256\");\n\n    return {\n        \"User-Agent\": \"Mozilla/5.0 (Android 11; Mobile; rv:147.0) Gecko/147.0 Firefox/147.0\",\n        \"x-request-timestamp\": t,\n        \"x-request-token\": token,\n        \"X-Requested-With\": \"XMLHttpRequest\"\n    };\n}\n\nfunction decryptChapter(chapterData) {\n    const { java } = this;\n    const rsa = java.createAsymmetricCrypto(\"RSA/ECB/PKCS1Padding\");\n    rsa.setPrivateKey(java.base64DecodeToByteArray(PRIVATE_KEY));\n   \n    const AesKeyByte = java.base64DecodeToByteArray(rsa.decryptStr(chapterData.aes_key_encrypt, false));\n    \n    const aes = java.createSymmetricCrypto(\"AES/CBC/PKCS5Padding\", AesKeyByte, java.base64DecodeToByteArray(chapterData.iv));\n    \n    return aes.decryptStr(java.base64DecodeToByteArray(chapterData.content_encrypt));\n}\n\nfunction getContent(Data) {\n    const { java, source } = this;\n    const { source_id: sourceId, chapter_id:chapterId, t, sign} = Data;\n    const url = `${this.GetUL()}/home/chapter/info?id=${sourceId}&key=${chapterId}&t=${t}&sign=${sign}`;\n\n    const headers = this.getAuthHeaders(sourceId, chapterId, t);\n    //java.log(JSON.stringify(headers))\n    const response = java.get(url, headers);\n    //java.log(response.body())\n    const json = JSON.parse(response.body());\n\n    if (json.code === 1) {\n        const chapter = json.data.chapter;\n        const content = this.decryptChapter(chapter);\n        return content;\n    } else {\n        return \"加载失败：\" + json.msg;\n    }\n}", "lastUpdateTime": "1790993559291", "loginCheckJs": "if (/小说被禁用或已删除/.test(result.body())) java.toast('小说被禁用或已删除！');\nlet sr = Check_(result.body(), result.headers().get('set-cookie'), result.url());\nresult = Packages.io.legado.app.help.http.StrResponse(result.url(), sr);\nresult;", "loginUi": "[   \n    {\n        \"name\": \"获取站源\",\n        \"type\": \"button\",\n        \"action\": \"Geturls()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"站源1\",\n        \"type\": \"button\",\n        \"action\": \"Puturl(0)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"站源2\",\n        \"type\": \"button\",\n        \"action\": \"Puturl(1)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"站源3\",\n        \"type\": \"button\",\n        \"action\": \"Puturl(2)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"站源4\",\n        \"type\": \"button\",\n        \"action\": \"Puturl(3)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"用户名/邮箱\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"密码\",\n        \"type\": \"password\"\n    },\n    {\n        \"name\": \"注册\",\n        \"type\": \"button\",\n        \"action\": \"reg()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"登录\",\n        \"type\": \"button\",\n        \"action\": \"Login()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"登出\",\n        \"type\": \"button\",\n        \"action\": \"out()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"信息\",\n        \"type\": \"button\",\n        \"action\": \"show()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"评论展示开 / 关\",\n        \"type\": \"button\",\n        \"action\": \"Comment()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"点击切换分类排序方式\",\n        \"type\": \"button\",\n        \"action\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"默认\",\n        \"type\": \"button\",\n        \"action\": \"Tgch(0)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"时间\",\n        \"type\": \"button\",\n        \"action\": \"Tgch(1)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"人气\",\n        \"type\": \"button\",\n        \"action\": \"Tgch(2)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"字数\",\n        \"type\": \"button\",\n        \"action\": \"Tgch(3)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"发现自定义标签🏷️（中 / 英逗号分隔）\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"◎↓网络书架↓◎\",\n        \"type\": \"button\",\n        \"action\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"书籍ID\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"添加\",\n        \"type\": \"button\",\n        \"action\": \"AFBook(true)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"移除\",\n        \"type\": \"button\",\n        \"action\": \"AFBook(false)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"跳转\",\n        \"type\": \"button\",\n        \"action\": \"BookShelf()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    }\n]", "loginUrl": "var r = {\n\t   \"z\": 0,\n    \"s\": 0,\n    \"co\": 0,\n    \"urls\": [],\n    \"sourl\": \"https://www.alicesw.com\"\n};\n\ntry {\n    let v = JSON.parse(source.getVariable());\n    if (v === null && typeof v !== 'object' && Array.isArray(v)) {\n        source.setVariable(JSON.stringify(r, null, \"\\t\"));\n        java.toast('已初始化，使用默认站源');\n    }\n} catch (err) {\n    java.log(err.message);\n    source.setVariable(JSON.stringify(r, null, \"\\t\"));\n    java.toast('已初始化，使用默认站源');\n}\n\nvar sgv = JSON.parse(source.getVariable());\nvar sg = source.get(\"list\");\nvar ul = GetUL();\n\nfunction reg() {\n    java.startBrowser(`${ul}/user/user/reg.html`, \"注册账号\");\n}\n\nfunction Comment() {\n    let sgvo = sgv.co;\n    sgv.co = sgv.co ? 0 : 1;\n    source.setVariable(JSON.stringify(sgv, null, \"\\t\"));\n    java.toast(`\\n评论区\\n【${[\"开启\", \"禁用\"][sgvo]} → ${[\"开启\", \"禁用\"][sgv.co]}】`);\n}\n\nfunction login() {\n    Login();\n}\n\nfunction Tgch(o) {\n    const sort = [\"默认\", \"更新时间\", \"人气\", \"字数\"];\n    const one_ = sgv.s;\n    const msg = (sgv.s = o, source.setVariable(JSON.stringify(sgv, null, \"\\t\")), `排序方式\\n【${sort[one_]}→${sort[o]}】`);\n    java.toast(\"\\n\" + msg);\n}\n\nfunction Geturls() {\n    sgv.urls.length = 0;\n    try {\n        const res = org.jsoup.Jsoup.parse(java.get('https://xn--vcsx64d.asw4.cc/', {}).body()).select('.container a');\n        const url1 = java.base64Decode(res[0].attr('href').match(/['\"](.*?)['\"]/)[1]);\n        sgv.urls.push(String(url1).replace(/\\/?$/, \"\"));\n        const url2 = java.base64Decode(res[1].attr('href').match(/['\"](.*?)['\"]/)[1]);\n        let src = java.get(java.connect(url2).url(), {}).body();\n        src = java.get(org.jsoup.Jsoup.parse(src).select('#redirectButton').attr('href'), {}).body();\n        const seen = new Set();\n        for (let match of src.matchAll(/u\\d+\\s*=\\s*r\\([\"'](.*?)[\"']\\)/g)) {\n            if (!seen.has(match[1])) {\n                sgv.urls.push(match[1].split('').reverse().join(''));\n                seen.add(match[1]);\n            }\n        }\n        source.setVariable(JSON.stringify(sgv, null, \"\\t\"));\n\n        if (sgv.urls.length >= 2) {\n            java.toast(`获取成功，共获取到${sgv.urls.length}个站源\\n┎┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┒\\n${sgv.urls.join('\\n')}\\n┖┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┚`);\n        } else {\n            java.toast('获取失败，请重试或检查网络状况');\n        }\n    } catch (e) {\n        java.log(e);\n        java.toast('\\n未知错误，请检查网络或更新阅读版本！');\n    }\n}\n\nfunction Puturl(e) {\n    if (!sgv.urls.length) return java.toast('\\n当前没有站源，请获取后选择');\n    if (e + 1 > sgv.urls.length) return java.toast(`暂无站源${e+1}`);\n    \n    try {\n        const stime = Date.now();\n        java.get(sgv.urls[e], {});\n        const speedtime = (Date.now() - stime) / 1000;\n        \n        sgv.sourl = sgv.urls[e];\n        sgv?.booklist?.forEach(item => {\n            item.img = item.img.replace(/https?:\\/\\/[^\\/]+/, sgv.urls[e]);\n            item.url = item.url.replace(/https?:\\/\\/[^\\/]+/, sgv.urls[e]);\n        });\n        source.setVariable(JSON.stringify(sgv, null, \"\\t\"));\n        \n        // 切换接口保持登录状态\n        const Cookie = cookie.getCookie(sgv.urls[e]);\n        if (!/lf_user_auth/.test(Cookie) && source.getLoginHeader()) {\n            cookie.setCookie(sgv.urls[e], source.getLoginHeaderMap().get('Cookie'));\n        }\n        java.toast(`站源已设置为【站源${e + 1}】：\\n${sgv.urls[e]}\\n♦解析用时${speedtime}秒♦`);\n    } catch (err) {\n        java.log(err.message);\n        java.toast(`\\n【站源${e+1}：${sgv.urls[e]}】\\n已失效，请检查网络状况或切换其他站源`);\n    }\n}\n\nfunction Login() {\n    const na = result['用户名/邮箱'];\n    const pa = result['密码'];\n    if (na && pa && loginByApi(na, pa)) return;\n    loginByBrowser();\n}\n\n// 接口直登：先取一次验证码页把会话钉住，再让用户输码，避免\"看到的码\"和\"提交的会话\"不是同一个\nfunction loginByApi(na, pa) {\n    const verifyUrl = `${ul}/user/user/verify.html`;\n    try {\n        cookie.removeCookie(ul);\n        const vres = java.get(verifyUrl, {});\n        // 站点返回的头名是 Set-Cookie（单数）；旧代码写成 set-cookies，永远取不到\n        let sess = '';\n        try { sess = vres.header('Set-Cookie') || ''; } catch (e) { sess = ''; }\n        let m = /PHPSESSID=([^;,\\s]+)/i.exec(sess);\n        if (!m) m = /PHPSESSID=([^;\\s]+)/i.exec(cookie.getCookie(ul) || '');\n        if (m) cookie.setCookie(ul, `PHPSESSID=${m[1]}`);\n        const code = java.getVerificationCode(verifyUrl);\n        const response = java.post(\n            `${ul}/user/user/login.html`,\n            `username=${encodeURIComponent(na)}&password=${encodeURIComponent(pa)}&code=${encodeURIComponent(code || '')}`,\n            { 'x-requested-with': 'XMLHttpRequest', 'Referer': `${ul}/user/user/login.html` }\n        );\n        let msg = response.body();\n        try { msg = JSON.parse(response.body()).msg || msg; } catch (e) { msg = response.body(); }\n        const jar = cookie.getCookie(ul) || '';\n        let ck = cookie.mapToCookie(response.cookies()) || '';\n        if (!/lf_user_auth/.test(ck) && /lf_user_auth/.test(jar)) ck = jar;\n        if (/lf_user_auth/.test(ck)) {\n            saveLogin(ck);\n            java.toast(`登录成功${msg ? '：' + msg : ''}`);\n            return true;\n        }\n        java.toast(msg || '登录失败');\n    } catch (e) {\n        java.log(e);\n    }\n    return false;\n}\n\n// 浏览器登录：在内置浏览器里完成（验证码、风控都在真实页面里走），退出浏览器时应用会把 cookie 同步回书源\nfunction loginByBrowser() {\n    java.startBrowserAwait(`${ul}/user/user/login.html`, '登录');\n    const ck = cookie.getCookie(ul) || '';\n    if (!/lf_user_auth/.test(ck)) {\n        java.toast('未检测到登录 cookie，请在内置浏览器里完成登录后再点「登录」');\n        return false;\n    }\n    saveLogin(ck);\n    java.toast('登录成功');\n    return true;\n}\n\nfunction saveLogin(ck) {\n    source.putLoginHeader(JSON.stringify({ 'Cookie': ck }));\n    try { cookie.setWebCookie(ul, ck); } catch (e) { java.log(e); }\n}\n\nfunction out() {\n    source.removeLoginHeader();\n    cookie.removeCookie(ul);\n    try { cookie.setWebCookie(ul, ''); } catch (e) { java.log(e); }\n    java.toast('已退出登录状态');\n}\n\nfunction show() {\n    const jc = source.getLoginHeaderMap();\n    let us = '无', id = '无', codes = '❌未登录';\n    if (jc) {\n        codes = '✔️已登录';\n        try {\n            const raw = decodeURIComponent(decodeURIComponent(jc.get('Cookie') || ''));\n            const m = raw.match(/\\{[\\s\\S]+\\}/);\n            if (m) { const info = JSON.parse(m[0]); us = info.username; id = info.uid; }\n        } catch (e) { java.log(e); }\n    }\n    java.longToast(`\\n◎用户：${us}◎\\n◎用户ID：${id}◎\\n◎登录状态：${codes}◎`);\n}\n\nfunction AFBook(ta) {\n    const info = result['书籍ID'];\n    if (!info) return java.toast(\"\\n未填入书籍id，请进书籍详情页，或者手动填写。\");\n    if (!source.getLoginHeaderMap()) return java.toast(\"未登录，请登录后使用\");\n    \n    try {\n        let url;\n        if (ta) {\n            url = `${ul}/user/bookshelf/add?novel_id=${info}`;\n        } else {\n            let src = \"\";\n            for (let page = 1;; page++) {\n                let sr = java.ajax(`${ul}/user/bookshelf/index.html?page=${page}`);\n                if (!/书架空空如也/.test(sr)) {\n                    src += sr + \"\\n\";\n                } else break;\n            }\n            \n            const booklist = src.match(/\\/novel\\/\\d+\\.html/g);\n            const dfid = src.match(/\\/user\\/bookshelf\\/del\\/id[^\"']+/g);\n            const index = booklist.findIndex(book => book.includes(info));\n            if (index === -1) return java.toast('未找到书籍');\n            url = GetUL() + dfid[index];\n        }\n        const msg = java.get(url, {\"x-requested-with\": \"XMLHttpRequest\"});\n        java.toast(JSON.parse(msg.body()).msg);\n    } catch (error) {\n    \t   java.log(error);\n        java.toast('未知错误，已打印至日志');\n    }\n}\n\nfunction BookShelf() {\n    if (source.getLoginHeaderMap()) {\n        java.startBrowser(`${ul}/user/bookshelf/`, \"书架\");\n    } else {\n        java.toast(\"未登录，请登录后再使用此功能。\");\n    }\n}", "respondTime": 180000, "ruleBookInfo": {"author": "@get:{a}", "canReName": "1", "coverUrl": "@get:{i}\n@js:let url = /^https?/.test(result) ? result : GetUL() + result;\nresult = java.connect(url).code() == 200 ? url : 'https://img.321cdn.com/img/01.png';\nresult;", "init": "<js>\nvar bookid = baseUrl.match(/novel\\/(\\d+)/)[1];\n//书评发送\nconst bookva = book.getVariable(\"custom\");\nif (bookva && bookva != \"\") {\n    if (source.getLoginHeader()) {\n        const commenturl = `${GetUL()}/home/comment/add.html`;\n        let body = `content=${bookva}&type=novel&mid=${bookid}`;\n        \n        try {\n            const code = String(java.getVerificationCode(`data:image/svg+xml;base64,${codesvg}`));\n            \n            if (code == \"评论\" || /^@\\d+$/.test(code)) {\n                if (/^@\\d+$/.test(code)) {\n                    body += `&pid=${code.match(/(\\d+)/)[1]}`;\n                }\n                \n                const headers = { \"x-requested-with\": \"XMLHttpRequest\" };\n                const response = java.post(commenturl, body, headers).body();\n                java.toast(JSON.parse(response).msg);\n            } else {\n                Packages.java.lang.Thread.sleep(40);\n                java.toast('请按图片要求填写');\n            }\n        } catch (err) {\n            java.log(err);\n        }\n    } else {\n        java.toast(\"未登录，请登录后操作\");\n    }\n    book.putCustomVariable(\"\");\n}\n\ntry {\n    sourceinfo = source.getLoginInfoMap();\n    sourceinfo['书籍ID'] = bookid;\n    if (bookid) {\n        source.putLoginInfo(JSON.stringify(sourceinfo));\n    }\n    $ = _ => String(java.getString(_));\n    img = /^https?/.test($('[property$=image]@content')) ? $('[property$=image]@content') : GetUL() + $('[property$=image]@content');\n    list = {\n        \"ID\": bookid,\n        \"img\": img,\n        \"name\": $('[property$=book_name]@content'),\n        \"author\": $('[property$=author]@content'),\n        \"info\": $('[property$=description]@content').slice(0, 45),\n        \"url\": \"legado://import/addToBookshelf?src=\" + baseUrl\n    }\n    source.put(\"list\", JSON.stringify(list));\n} catch (err) {\n    java.log(\"登录UI未初始化保存数据：\" + err);\n}\nsrc;\n</js>\n@put:{\"n\":\"[property$=book_name]@content\",\n\"a\":\"[property$=author]@content\",\n\"t\":\"class.fix@p.2:-2@text##.*[：:]\",\n\"k\":\"class.tg@a@ownText##\\n##,\",\n\"i\":\"[property$=image]@content\",\n\"l\":\"[property$=latest_chapter_name]@content\",\n\"r\":\"class.fix@p.3@text##\\\\s·\\\\s##\\n📂\",\n\"T\":\"[property$=update_time]@content\",\n\"m\":\"text.查看全部章节@href\",\n\"z\":\"class.fix@p.4@text##.*：(.*)·##$1###\",\n\"o\":\"[property$=description]@content\"}", "intro": "&nbsp;&nbsp;📖书籍ID：{{baseUrl.match(/novel\\/(\\d+)/)[1]}}\n☑当前站源：{{GetUL()}}\n🔥@get:{r}\n🏷️标签：@get:{k}\n🕰️更新时间：@get:{T}\n📜简介：\n@get:{o}\n<js>\nconst Bookid = baseUrl.match(/novel\\/(\\d+)/)[1];\nconst contul = `${GetUL()}/index.php?s=/Home/comment/lists/id/${Bookid}/type/novel/limit/5/size/12`;\nvar CommentNur = JSON.parse(source.getVariable()).co;\nvar cont = \"\";\nif (!CommentNur) {\n    var src = java.ajax(contul);\n    java.setContent(src);\n    var list = java.getElement('//script[@src=\"/public/static/jquery/jquery.min.js\"]/following-sibling::script[1]');\n    var lists = JSON.parse(String(list[0]).match(/var\\s*trre=([\\s\\S]+),page_num/)[1]);\n\n    cont += \"🔻评论区：\\n❗️右上角书籍变量填入评论后刷新详情页发送评论。❗️\\n\";\n    if (lists.length > 0) {\n        if (source.getLoginHeader()) {\n            let jc = source.getLoginHeaderMap();\n            let inf = decodeURIComponent(jc.get(\"Cookie\"));\n            let info = decodeURIComponent(inf).match(/\\{[\\s\\S]+\\}/)[0];\n            let myuid = JSON.parse(info)['uid'];\n            //处理我的评论数据\n            var myComments = [];\n\n            function collectMyComments(comment, parentPath) {\n                let floor = parentPath ? `${parentPath}-${comment.floorIndex}` : comment.floorIndex;\n                if (comment.uid === Number(myuid)) {\n                    myComments.push({\n                        id: comment.id,\n                        username: comment.user.username,\n                        group: comment.user.group,\n                        floor: `【${floor}楼】`,\n                        time: timeov(comment.create_time * 1000),\n                        content: comment.content\n                    });\n                }\n                if (comment._?.forEach) {\n                    comment._.forEach((child, index) => {\n                        child.floorIndex = index + 1;\n                        collectMyComments(child, floor);\n                    });\n                }\n            }\n            lists.forEach((c, i) => {\n                c.floorIndex = i + 1;\n                collectMyComments(c, \"\");\n            });\n\n            var mySection = \"=== 我的评论（共找到\" + myComments.length + \"条） ===\\n\\n\";\n            myComments.forEach(m => {\n                mySection += `┌【ID：${m.id}】| 👤${m.username} | ${m.group} | ${m.time}\\n└评论：${m.content}\\n${m.floor}\\n `;\n            });\n        } else {\n            mySection = \"\";\n        }\n\n        function formatComments(items, parentName) {\n            if (!items || !items.length) return '';\n            return items.map(item => {\n                let time = timeov(item.create_time * 1000);\n                let replyTag = parentName ? ` | @${parentName}` : '';\n                let content = (parentName ? 'ㅤ' : '') + item.content;\n                let username = item.user?.username || \"已注销用户\";\n                let group = item.user?.group || \"未知\";\n\n                let block = `${parentName ? '└' + username : username} | ${group} | ${time}${replyTag}\\n${parentName ? content.replaceAll('\\n', '\\nㅤ') : content}`;\n\n                if (item._ && item._.length) {\n                    block += '\\n' + formatComments(item._, username);\n                }\n                return block;\n            }).join(parentName ? '\\n' : '\\nㅤ\\n');\n        }\n\n        var allSection = \"=== 全部评论（共\" + lists.length + \"条） ===\\n\\n\";\n        allSection += formatComments(lists);\n\n        cont += mySection + \"\\n\" + allSection;\n    } else {\n        cont += \"本书暂时没有评论喔\";\n    }\n}\nresult = result + \"\\n\" + cont;\nresult;\n</js>", "kind": "@get:{t}\n@get:{k}", "lastChapter": "@get:{l}◎@get:{T}", "name": "@get:{n}", "tocUrl": "@get:{m}\n@js: GetUL() + result;", "wordCount": "@get:{z}"}, "ruleContent": {"content": "@js:\nvar url = GetUL();\n//处理强制登录\nvar nn = String(cookie.getCookie(url));\nvar coks = nn.split('; ');\nvar ckk = coks.filter(item => !item.startsWith(\"lf_reader_num\")).join('; ');\ncookie.setCookie(url, ckk);\nconst chapterul = java.hexDecodeToString(src);\n\nfunction content() {\n    let html = java.ajax(chapterul);\n    let content = String(java.getString('.content_txt@html', html));\n    return content.includes('正在获取小说信息') ? (eval('bookdata = ' + html.match(/book\\.initial\\s*=\\s*({[\\s\\S]+?};)/)[1]),getContent(bookdata)) : content;\n}\n\nconst text = content().trim();\n\nlet retryCount = 0;\nconst maxRetries = 3;\nlet result;\nwhile (retryCount < maxRetries) {\n    if (text != \"\" && !/正在加载小说中,请稍后/.test(text)) {\n        result = text;\n        break;\n    } else {\n        retryCount++;\n        java.toast(`\\n未获取到文本，正在重试...\\n（当前第${retryCount} / ${maxRetries}次重试）`);\n        text = content();\n    }\n}\nif (retryCount === maxRetries) {\n    result = \"重试三次仍未获取到文本，请检查网络状况。\";\n}\nresult;", "imageStyle": "DEFAULT", "replaceRegex": "##\\n*{{chapter.title}}\\n*"}, "ruleExplore": {"author": ".four@text||.t4@text||a[href$=\"author\"]@text||.datainfobox@p.1@a@text", "bookList": ".novel-item||.rec_rullist > ul||.list-group-item", "bookUrl": "a[href^=\"/novel/\"]@href\n@js: GetUL() + result;", "coverUrl": "img@src\n@js: /^https?/.test(result) ? result : GetUL() + result;", "intro": ".content-txt@text", "kind": "{{@@.sev@text%%.six@text}}\n{{@@.t6@text}}\n{{@@.t5@text}}\n{{@@.mb-1@text##浏览：(.*)##$1浏览###}}\n{{@@.badges@text}}\n{{@@.datainfobox@p.0:-1@text##.*?：}}", "lastChapter": ".datainfobox@p.-2@a@text||a[href^=\"/book/\"]@text", "name": "a[href^=\"/novel/\"]@text##^\\d+?\\.|全文阅读$", "wordCount": ".five@text||.mb-1@text||.datainfobox@p.2@ownText\n@js:\nif (/search/.test(baseUrl)) result = result.split(/\\s|\\u3000/)[1].replace(/.*?：/, \"\");\nresult;"}, "ruleSearch": {"author": ".mb-1 a@text", "bookList": ".list-group-item", "bookUrl": "a@href\n@js: GetUL() + result;", "intro": ".content-txt@text", "kind": "{{@@.mb-1@text##浏览：(.*)##$1浏览###}}\n{{@@a[href$=\"tag\"]@text%%small@text##\\[|\\]}}\n###", "name": "h5 a@text##^\\d+\\.", "wordCount": ".mb-1@text\n@js:result.split(/\\s|\\u3000/)[1].replace(/.*?：/, \"\");"}, "ruleToc": {"chapterList": "class.section-list@a", "chapterName": "text", "chapterUrl": "href\n<js>\nvar url = GetUL() + result;\nresult = `data:;base64,${java.base64Encode(url)},{\"type\":\"chapter\"}`;\nresult;\n</js>", "preUpdateJs": "eval(String(source.loginUrl));\nvar sourceUL = GetUL();\nif (!String(book.bookUrl).includes(sourceUL)) {\n  book.bookUrl = String(book.bookUrl).replace(/https?:\\/\\/[^\\/]+/,sourceUL);\n  book.tocUrl = String(book.tocUrl).replace(/https?:\\/\\/[^\\/]+/,sourceUL);\n  java.toast(\"\\n检测到切换源站，已更新目录链接。\");\n   java.refreshTocUrl();\n}"}, "searchUrl": "{{eval(String(source.loginUrl));GetUL();}}/search.html?q={{key}}&f=_all&p={{page}}", "weight": 0},{"bookSourceComment": "纳兰容若", "bookSourceGroup": "自建源", "bookSourceName": "顶点小说移动版", "bookSourceType": 0, "bookSourceUrl": "https://m.yewa.cc", "bookUrlPattern": "https://m\\.yewa\\.cc/xiaoshuo/\\d+/\\d+/", "concurrentRate": "500", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "玄幻::/xuanhuan/{{page}}.html\n修真::/xiuzhen/{{page}}.html\n都市::/dushi/{{page}}.html\n穿越::/chuanyue/{{page}}.html\n网游::/wangyou/{{page}}.html\n科幻::/kehuan/{{page}}.html\n其他::/qita/{{page}}.html\n全本::/quanben/allvisit/{{page}}.html", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\",\"Referer\":\"https://m.yewa.cc/\"}", "lastUpdateTime": "1790930478278", "respondTime": 3624, "ruleBookInfo": {"author": "meta[property='og:novel:author']@content", "coverUrl": "meta[property='og:image']@content", "intro": "meta[property='og:description']@content", "kind": "meta[property='og:novel:category']@content", "lastChapter": "meta[property='og:novel:last_chapter_name']@content", "name": "meta[property='og:novel:book_name']@content"}, "ruleContent": {"content": "#content p@text||#text p@text", "replaceRegex": "##顶点小说.*|最新网址：.*|请记住本书首发.*|本章未完.*"}, "ruleExplore": {"bookList": "article", "bookUrl": ".image a@href||a@href", "coverUrl": ".image img@src", "intro": ".info p.intro@text", "name": ".info h2.title@text"}, "ruleSearch": {"author": "$.author", "bookList": "$.data.search", "bookUrl": "$.book_detail_url", "coverUrl": "$.cover", "intro": "$.intro", "kind": "$.cate_name", "lastChapter": "$.latest_chapter_name", "name": "$.book_name"}, "ruleToc": {"chapterList": "ul.chapter li a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "@js:var home = String(java.ajax('https://m.yewa.cc/'));\nvar vars = {};\nvar reg = /var\\s+(\\w+)\\s*=\\s*\"([^\"]*)\"/g;\nvar m;\nwhile ((m = reg.exec(home)) != null) { vars[m[1]] = m[2]; }\nvar body = 'q=' + java.encodeURI(key);\nfor (var k in vars) { body += '&' + k + '=' + java.encodeURI(vars[k]); }\nvar options = { method:'POST', body: body, headers: {'Content-Type':'application/x-www-form-urlencoded'} };\n'https://m.yewa.cc/api/search,' + JSON.stringify(options);", "weight": 0},{"bookSourceComment": "书源走番茄api，四神签名秒了，别逆向倒卖我求你了，四神你自己上网搜", "bookSourceGroup": "官方,小说,番茄,番茄小说", "bookSourceName": "番茄小说", "bookSourceType": 0, "bookSourceUrl": "https://api5-normal-sinfonlinec.fqnovel.com", "bookUrlPattern": "https?://fanqienovel\\.com/page/\\d+.*", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": false, "eventListener": false, "jsLib": "var JB=Packages.java.math.BigInteger,J64=new JB(\"18446744073709551615\");function bi(e){return e instanceof JB?e.and(J64):new JB(String(e)).and(J64)}function biHex(e){return new JB(e,16).and(J64)}function biBytesLE(e,r){for(var t=\"\",n=7;n>=0;n--)t+=(\"0\"+ub(e,r+n).toString(16)).substr(-2);return biHex(t)}function biWriteLE(e,r,t){for(var n=0;n<8;n++)r[t+n]=toByte(e.shiftRight(8*n).and(bi(255)).intValue())}function rotl64(e,r){return 0==(r=(r%64+64)%64)?e:e.shiftLeft(r).or(e.shiftRight(64-r)).and(J64)}function rotr64(e,r){return rotl64(e,-r)}var JEMPTY=new Packages.java.lang.String(\"\").getBytes();function jbytes(e){return Packages.java.util.Arrays.copyOf(JEMPTY,e)}function toByte(e){return e!=e?0:e>127?e-256:e}function ub(e,r){var t=e[r];return t!=t||void 0===t?0:t<0?t+256:t}function hexBytes(e){for(var r=e.length/2,t=jbytes(r),n=0;n<r;n++)t[n]=toByte(parseInt(e.substr(2*n,2),16));return t}function bytesHex(e){for(var r=\"\",t=0;t<e.length;t++)r+=(\"0\"+ub(e,t).toString(16)).substr(-2);return r}function utf8b(e){return new Packages.java.lang.String(String(e)).getBytes(\"UTF-8\")}function bstr(e){return String(new Packages.java.lang.String(e,\"UTF-8\"))}function jconcat(){var e,r=0;for(e=0;e<arguments.length;e++)r+=arguments[e].length;var t=jbytes(r),n=0;for(e=0;e<arguments.length;e++)Packages.java.lang.System.arraycopy(arguments[e],0,t,n,arguments[e].length),n+=arguments[e].length;return t}function b64enc(e){return String(Packages.java.util.Base64.getEncoder().encodeToString(e))}function b64dec(e){return Packages.java.util.Base64.getDecoder().decode(String(e))}function jrand(e){var r=jbytes(e);return(new Packages.java.security.SecureRandom).nextBytes(r),r}function md5(e){return Packages.java.security.MessageDigest.getInstance(\"MD5\").digest(e)}function aesEncP5(e,r,t){var n=Packages.javax.crypto.Cipher.getInstance(\"AES/CBC/PKCS5Padding\");return n.init(1,new Packages.javax.crypto.spec.SecretKeySpec(r,\"AES\"),new Packages.javax.crypto.spec.IvParameterSpec(t)),n.doFinal(e)}function aesDecP5(e,r,t){var n=Packages.javax.crypto.Cipher.getInstance(\"AES/CBC/PKCS5Padding\");return n.init(2,new Packages.javax.crypto.spec.SecretKeySpec(r,\"AES\"),new Packages.javax.crypto.spec.IvParameterSpec(t)),n.doFinal(e)}function aesDecNoPad(e,r,t){var n=Packages.javax.crypto.Cipher.getInstance(\"AES/CBC/NoPadding\");return n.init(2,new Packages.javax.crypto.spec.SecretKeySpec(r,\"AES\"),new Packages.javax.crypto.spec.IvParameterSpec(t)),n.doFinal(e)}function gunzip(e){for(var r,t=new Packages.java.util.zip.GZIPInputStream(new Packages.java.io.ByteArrayInputStream(e)),n=new Packages.java.io.ByteArrayOutputStream,a=jbytes(4096);(r=t.read(a))>0;)n.write(a,0,r);return t.close(),n.toByteArray()}var SM3_IV=[1937774191,1226093241,388252375,3666478592,2842636476,372324522,3817729613,2969243214];function rotl32(e,r){return(e<<r|e>>>32-r)>>>0}function sm3(e){for(var r=[],t=0;t<e.length;t++)r.push(ub(e,t));for(r.push(128);r.length%64!=56;)r.push(0);var n=Math.floor(8*e.length/4294967296),a=8*e.length>>>0;r.push(n>>>24&255,n>>>16&255,n>>>8&255,255&n),r.push(a>>>24&255,a>>>16&255,a>>>8&255,255&a);for(var o=SM3_IV.slice(0),i=0;i<r.length;i+=64){for(var c=[],s=0;s<16;s++)c[s]=(r[i+4*s]<<24|r[i+4*s+1]<<16|r[i+4*s+2]<<8|r[i+4*s+3])>>>0;for(var u=16;u<68;u++){var f=(c[u-16]^c[u-9]^rotl32(c[u-3],15))>>>0;c[u]=(f^rotl32(f,15)^rotl32(f,23)^rotl32(c[u-13],7)^c[u-6])>>>0}for(var l=o[0],g=o[1],d=o[2],v=o[3],_=o[4],h=o[5],y=o[6],k=o[7],p=0;p<64;p++){var q,S,b;p<16?(q=2043430169,S=(l^g^d)>>>0,b=(_^h^y)>>>0):(q=2055708042,S=(l&g|l&d|g&d)>>>0,b=(_&h|~_&y)>>>0);var m=rotl32(rotl32(l,12)+_+rotl32(q,p%32)>>>0,7),x=S+v+(m^rotl32(l,12))+(c[p]^c[p+4])>>>0,P=b+k+m+c[p]>>>0,B=x,M=l,j=rotl32(g,9),A=d,C=(P^rotl32(P,9)^rotl32(P,17))>>>0,T=_,w=rotl32(h,19),F=y;l=B,g=M,d=j,v=A,_=C,h=T,y=w,k=F}o[0]=(o[0]^l)>>>0,o[1]=(o[1]^g)>>>0,o[2]=(o[2]^d)>>>0,o[3]=(o[3]^v)>>>0,o[4]=(o[4]^_)>>>0,o[5]=(o[5]^h)>>>0,o[6]=(o[6]^y)>>>0,o[7]=(o[7]^k)>>>0}for(var J=jbytes(32),O=0;O<8;O++)J[4*O]=toByte(o[O]>>>24&255),\nJ[4*O+1]=toByte(o[O]>>>16&255),J[4*O+2]=toByte(o[O]>>>8&255),J[4*O+3]=toByte(255&o[O]);return J}var GORGON_KEY=[68,185,185,217,164,174,249,252,164,147,170,117,124,163,194,196,164,150,147,143];function rotl8(e,r){return 255&(e<<r|e>>>8-r)}function rev8(e){for(var r=0,t=0;t<8;t++)r|=(e>>>t&1)<<7-t;return r}var ARGUS_KEY=hexBytes(\"ac1adaae95a7af94a5114ab3b3a97dd80050aa0a39314c40528caec95256c28c\");function uvarint(e){var r=[];e=new JB(String(e));for(var t=new JB(\"127\");;){var n=e.and(t).intValue();if(0===(e=e.shiftRight(7)).signum())return r.push(n),r;r.push(128|n)}}function pbVarint(e,r){var t=uvarint(8*e),n=uvarint(r);return t.concat(n)}function pbBytes(e,r){for(var t=uvarint(8*e+2),n=uvarint(r.length),a=t.concat(n),o=0;o<r.length;o++)a.push(ub(r,o));return a}var _argusRounds=null,FQ_REG_KEY=\"ac25c67ddd8f38c1b37a2348828e222e\",FQ_MK1=\"data:\",FQ_MK2=\";base64,\",FQ_MK3=',{\"type\":\"1\"}',FQ_MK4=\"item_ids=\",FQ_MK5=\"&book_id=\";function fqMark(e){return e=String(e),fqMkp()+b64enc(utf8b(e))+FQ_MK3}function fqMarkText(e,r){var t=String(null==e?\"\":e).trim();try{t.length>0&&t.length%2==0&&/^[0-9a-fA-F]+$/.test(t)&&(t=bstr(hexBytes(t.toLowerCase())))}catch(e){}return t}function fqVarGet(e){try{var r=e.getVariable();if(r){var t=JSON.parse(String(r));if(t&&\"object\"==typeof t)return t}}catch(e){}return{}}function fqVarSet(e,r){try{e.setVariable(JSON.stringify(r))}catch(e){}}function fqDefDevice(){return JSON.parse('{\"aid\":\"1967\",\"channel\":\"googleplay\",\"package\":\"com.dragon.read.oversea.gp\",\"versionCode\":\"68132\",\"versionName\":\"6.8.1.32\",\"deviceBrand\":\"HUAWEI\",\"deviceType\":\"WLZ-AN00\",\"osVersion\":\"13\",\"osApi\":\"32\",\"resolution\":\"1920*1080\",\"dpi\":\"480\",\"romVersion\":\"V433IR+release-keys\",\"cdid\":\"5566b484-82f9-4cef-880d-60ca354e6a99\",\"deviceId\":\"670078578733609\",\"iid\":\"670078579016233\"}')}function fqMerge(e,r){if(!r)return e;for(var t in r)try{void 0!==r[t]&&null!==r[t]&&\"\"!==String(r[t])&&(e[t]=r[t])}catch(e){}return e}function fqDevice(e){var r=fqDefDevice();if(e){try{var t=fqVarGet(e);t&&t.device&&fqMerge(r,t.device)}catch(e){}try{var n=e.getLoginHeader();if(n){var a=JSON.parse(String(n));a&&\"object\"==typeof a&&fqMerge(r,a)}}catch(e){}}return r.deviceId&&r.iid||fqMerge(r,fqDefDevice()),r}function fqUa(e){return\"com.dragon.read.oversea.gp/68132 (Linux; U; Android \"+e.osVersion+\"; zh_CN; \"+e.deviceType+\"; Build/V433IR;tt-ok/3.12.13.4-tiktok)\"}function fqSigned(e,r,t,n){var a=fqSign(e,t,r.versionName);a[\"User-Agent\"]=fqUa(r),a.Cookie=\"store-region=cn-zj; store-region-src=did; install_id=\"+r.iid+\";\",a.Accept=\"application/json; charset=utf-8,application/x-protobuf\",a[\"x-xs-from-web\"]=\"0\",a[\"x-ss-req-ticket\"]=String(Date.now()),a[\"x-vc-bdturing-sdk-version\"]=\"3.7.2.cn\",a.lc=\"101\",a[\"sdk-version\"]=\"2\",a[\"passport-sdk-version\"]=\"50564\",a[\"x-tt-store-region\"]=\"cn-zj\",a[\"x-tt-store-region-src\"]=\"did\",a[\"x-reading-request\"]=String(Date.now())+\"-\"+String(Math.floor(2e9*Math.random()));var o={method:n||\"GET\",headers:a,retry:2};return t&&(o.body=t),e+\",\"+JSON.stringify(o)}function fqUuid(){return\"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g,function(e){var r=16*Math.random()|0;return(\"x\"===e?r:3&r|8).toString(16)})}function fqQS(e){for(var r=Object.keys(e),t=[],n=0;n<r.length;n++)t.push(r[n]+\"=\"+e[r[n]]);return t.join(\"&\")}function fqCommonParams(e){var r={};return r.manifest_version_code=e.versionCode,r._rticket=String(Date.now()),r.iid=e.iid,r.channel=e.channel,r.device_type=e.deviceType,r.language=\"zh\",r.host_abi=\"arm64-v8a\",r.dragon_device_type=\"phone\",r.resolution=e.resolution||\"1920*1080\",r.update_version_code=e.versionCode,r.cdid=e.cdid||\"\",r.key_register_ts=\"0\",r.pv_player=e.versionCode,r.os_api=e.osApi||\"32\",r.req_type=\"1\",r.dpi=e.dpi||\"480\",r.compliance_status=\"0\",r.ac=\"wifi\",r.device_id=e.deviceId,r.os=\"android\",r.os_version=e.osVersion,r.version_code=e.versionCode,r.app_name=\"novelapp\",r.version_name=e.versionName,r.device_brand=e.deviceBrand,r.need_personal_recommend=\"1\",r.ssmix=\"a\",r.player_so_load=\"1\",r.device_platform=\"android\",\nr.is_android_pad_screen=\"0\",r.aid=e.aid,r.rom_version=e.romVersion||\"\",r}function fqSearchReq(e,r,t){var n=fqDevice(t),a=20*((Number(r)||1)-1),o=fqCommonParams(n);return delete o.req_type,delete o.key_register_ts,delete o.compliance_status,o.user_is_login=\"0\",o.bookstore_tab=\"2\",o.passback=String(a),o.clicked_content=\"search_history\",o.tab_name=\"store\",o.last_consume_interval=\"0\",o.offset=String(a),o.cold_start_session_id=fqUuid(),o.query=encodeURIComponent(String(e)),o.version_code=n.versionCode,o.count=\"20\",o.search_source=\"1\",o.battery_pct=\"78\",o.sys_dark_mode=\"0\",o.use_correct=\"true\",o.is_first_enter_search=\"true\",o.current_volume=\"75\",o.client_ab_info=\"%7B%7D\",o.bookshelf_search_plan=\"4\",o.use_lynx=\"false\",o.tab_type=\"1\",o.line_words_num=\"0\",o.normal_session_id=fqUuid(),o.pad_column_cover=\"0\",o.from_rs=\"false\",o.charging=\"1\",o.app_dark_mode=\"0\",o.screen_brightness=\"72\",o.down_speed=\"89121\",o.search_source_id=\"his%23%23%23\",o.font_scale=\"100\",o.network_type=\"4\",fqSigned(\"https://api5-normal-sinfonlinec.fqnovel.com/reading/bookapi/search/tab/v?\"+fqQS(o),n,null,\"GET\")}function fqTocReq(e,r){var t=fqDevice(r),n=fqCommonParams(t);return delete n.req_type,delete n.key_register_ts,delete n.compliance_status,n.book_type=\"0\",n.book_id=String(e),n.need_version=\"1\",fqSigned(\"https://api5-normal-sinfonlineb.fqnovel.com/reading/bookapi/directory/all_items/v?\"+fqQS(n),t,null,\"GET\")}function fqContentReq(e,r,t){var n=fqDevice(t),a=fqCommonParams(n);return a.item_ids=String(e),a.book_id=String(r),fqSigned(\"https://api5-normal-sinfonlineb.fqnovel.com/reading/reader/batch_full/v?\"+fqQS(a),n,null,\"GET\")}function fqSearchUrl(e,r,t){return fqMark(\"pg=\"+(Number(r)||1)+\"|kw=\"+String(e))}function fqTocMarkFromBook(e,r){var t=\"\";try{e&&(t=String(e.bookUrl||e.tocUrl||\"\"))}catch(e){t=\"\"}var n=fqMarkText(\"\",t),a=n.match(/book_id=(\\d+)/)?n.match(/book_id=(\\d+)/)[1]:\"\";if(!a&&e)try{e.bookUrl&&(a=(String(e.bookUrl).match(/book_id=(\\d+)/)||[])[1]||(String(e.bookUrl).match(/fanqienovel\\.com\\/page\\/(\\d+)/)||[])[1]||\"\")}catch(e){}return a?fqMarkA(\"book_id=\"+a):\"\"}function fqMk(e,r){try{var t=String(e).match(r);if(t)return t[1]}catch(e){}return\"\"}function fqRegKey(e,r){var t=fqDevice(r),n=fqCommonParams(t);delete n.req_type,delete n.key_register_ts,delete n.compliance_status;for(var a=\"https://api5-normal-sinfonlineb.fqnovel.com/reading/crypt/registerkey?\"+fqQS(n),o=hexBytes(FQ_REG_KEY),i=jbytes(16),c=new JB(String(t.deviceId)).toByteArray(),s=jbytes(16),u=0;u<8&&u<c.length;u++)s[u]=c[c.length-1-u];var f=JSON.stringify({content:b64enc(jconcat(i,aesEncP5(s,o,i))),keyver:1}),l=fqFetch(e,function(){return fqSigned(a,t,f,\"POST\")},function(e){try{return!!(JSON.parse(e).data||{}).key}catch(e){return!1}},4),g={};try{g=JSON.parse(l).data||{}}catch(e){g={}}if(!g.key)throw\"registerkey 失败:\"+String(l).substring(0,80);var d=b64dec(g.key),v=aesDecP5(Packages.java.util.Arrays.copyOfRange(d,16,d.length),o,Packages.java.util.Arrays.copyOfRange(d,0,16)),_=\"\";for(u=0;u<16;u++)_+=(\"0\"+ub(v,u).toString(16)).substr(-2);return{keyver:g.keyver||1,key:_.toUpperCase()}}function fqKey(e,r,t){var n=fqVarGet(r),a=n.keys&&\"object\"==typeof n.keys?n.keys:{};if(null!=t&&a[t])return String(a[t]);var o=fqRegKey(e,r);return a[o.keyver]=o.key,n.keys=a,n.device=fqDevice(r),fqVarSet(r,n),o.key}function fqParseBooks(e){var r=null;try{r=JSON.parse(String(e))}catch(e){return null}for(var t=r&&r.search_tabs||[],n=[],a=0;a<t.length;a++)for(var o=t[a]&&t[a].data||[],i=0;i<o.length;i++)for(var c=o[i]&&o[i].book_data||[],s=0;s<c.length;s++)n.push(c[s]);return n}function fqSearchList(e,r,t,n){var a=fqMarkText(e,r),o=\"\",i=1,c=a.match(/kw=([\\s\\S]*)$/);c&&(o=c[1]);var s=a.match(/pg=(\\d+)/);s&&(i=Number(s[1])||1);var u=null;if(o){var f=fqFetch(t,function(){return fqSearchReq(o,i,n)},function(e){var r=fqParseBooks(e);return!(!r||!r.length)},4);u=fqParseBooks(f)}var l=[];if(!u)return l;for(var g=0;g<u.length;g++){var d=u[g];if(d&&d.book_id){\nvar v=String(d.category||\"\")+(d.score?\" \"+d.score+\"分\":\"\")+(d.tags?\"\\n\"+d.tags:\"\");l.push(JSON.stringify({name:String(d.book_name||\"\"),author:String(d.author||\"\"),bookUrl:fqMark(\"book_id=\"+d.book_id),coverUrl:String(d.thumb_url||\"\"),intro:String(d.abstract||\"\"),kind:v,wordCount:String(null==d.word_number?\"\":d.word_number),lastChapter:String(d.last_chapter_title||\"\")}))}}return l}function fqPickBookInfo(e){var r=null;try{r=JSON.parse(String(e))}catch(e){return null}var t=r&&r.data&&r.data.book_info||null;return t&&t.book_name?t:null}function fqBookInfo(e,r,t,n){var a=String(null==e?\"\":e),o=fqPickBookInfo(a),i=fqMk(fqMarkText(e,r),/book_id=(\\d+)/);return i||(i=(String(r||\"\").match(/fanqienovel\\.com\\/page\\/(\\d+)/)||[])[1]||\"\"),!o&&i&&(a=fqFetch(t,function(){return fqTocReq(i,n)},function(e){return!!fqPickBookInfo(e)},4),o=fqPickBookInfo(a)),o?JSON.stringify({book_name:String(o.book_name||\"\"),author:String(o.author||\"\"),thumb_url:String(o.thumb_url||\"\"),abstract:String(o.abstract||\"\"),category:String(o.category||\"\"),score:String(o.score||\"\"),word_number:String(null==o.word_number?\"\":o.word_number),last_chapter_title:String(o.last_chapter_title||\"\"),serial_count:String(null==o.serial_count?\"\":o.serial_count)}):\"{}\"}function fqPickToc(e){var r=null;try{r=JSON.parse(String(e))}catch(e){return null}var t=r&&r.data||{};if(t.item_data_list&&t.item_data_list.length)return t.item_data_list;for(var n=[],a=t.catalog_data||[],o=0;o<a.length;o++)for(var i=a[o]&&a[o].item_data_list||[],c=0;c<i.length;c++)n.push(i[c]);return n.length?n:null}function fqTocList(e,r,t,n,a){var o=String(null==e?\"\":e),i=fqPickToc(o),c=fqMk(fqMarkText(e,r),/book_id=(\\d+)/);if(!c)try{t&&(c=fqMk(fqMarkText(\"\",String(t.bookUrl||t.tocUrl||\"\")),/book_id=(\\d+)/))}catch(e){c=\"\"}return!i&&c&&(o=fqFetch(n,function(){return fqTocReq(c,a)},function(e){return!!fqPickToc(e)},4),i=fqPickToc(o)),fqTocBuild(i,c)}function fqPickChapter(e){var r=null;try{r=JSON.parse(String(e))}catch(e){return null}for(var t=r&&r.data||{},n=Object.keys(t),a=0;a<n.length;a++){var o=t[n[a]];if(o&&o.content&&\"Invalid\"!==o.content)return o}return null}function fqContent(e,r,t,n){var a=String(null==e?\"\":e),o=fqPickChapter(a);if(!o){var i=fqMarkText(e,r),c=fqMk(i,/item_ids=([0-9,]+)/),s=fqMk(i,/book_id=(\\d+)/);c&&s&&(a=fqFetch(t,function(){return fqContentReq(c,s,n)},function(e){return!!fqPickChapter(e)},5),o=fqPickChapter(a))}if(!o)return\"【本章获取失败，请稍后重试】\";var u,f=fqKey(t,n,o.key_version),l=b64dec(o.content),g=null;try{g=aesDecP5(Packages.java.util.Arrays.copyOfRange(l,16,l.length),hexBytes(f),Packages.java.util.Arrays.copyOfRange(l,0,16))}catch(e){}if(null==g||g.length<2||31!==ub(g,0)||139!==ub(g,1)){var d=fqRegKey(t,n),v=fqVarGet(n);v.keys=v.keys||{},v.keys[d.keyver]=d.key,fqVarSet(n,v),f=d.key;try{g=aesDecP5(Packages.java.util.Arrays.copyOfRange(l,16,l.length),hexBytes(f),Packages.java.util.Arrays.copyOfRange(l,0,16))}catch(e){}}if(31===ub(g,0)&&139===ub(g,1))try{u=bstr(gunzip(g))}catch(e){u=bstr(g)}else u=bstr(g);return fqParas(u)}var FQ_B64T=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";function fqB64A(e){for(var r,t,n,a=(e=String(e)).length,o=a-a%3,i=[],c=0,s=0;s<o;)r=e.charCodeAt(s++),t=e.charCodeAt(s++),n=e.charCodeAt(s++),i[c++]=FQ_B64T.charAt(r>>2),i[c++]=FQ_B64T.charAt((3&r)<<4|t>>4),i[c++]=FQ_B64T.charAt((15&t)<<2|n>>6),i[c++]=FQ_B64T.charAt(63&n);return a-o===1?(r=e.charCodeAt(s),i[c++]=FQ_B64T.charAt(r>>2),i[c++]=FQ_B64T.charAt((3&r)<<4),i[c++]=\"=\",i[c++]=\"=\"):a-o===2&&(r=e.charCodeAt(s),t=e.charCodeAt(s+1),i[c++]=FQ_B64T.charAt(r>>2),i[c++]=FQ_B64T.charAt((3&r)<<4|t>>4),i[c++]=FQ_B64T.charAt((15&t)<<2),i[c++]=\"=\"),i.join(\"\")}function fqMkp(){return fqMkp.C||(fqMkp.C=FQ_MK1+FQ_LOGO+FQ_MK2)}function fqMarkA(e){return fqMkp()+fqB64A(String(e))+FQ_MK3}function fqTocBuild(e,r){var t=[];if(!e)return t;for(var n=0;n<e.length;n++){var a=e[n];if(a&&a.item_id){var o=String(a.title||\"\");o&&t.push(JSON.stringify({name:o,url:fqMarkA(FQ_MK4+a.item_id+FQ_MK5+r)}))}}return t}\nfunction __p_2ZqW_MAIN_STR_decode(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='oW\"x8?rY:|e}`,Ag0.vd[Im(=u#]@HlK_+UMnb!&iC3/VaXNq5yJTBZ);>%RSPt21Fkzs^*c96j7<L$4~pwGf{DhQEO'.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}function __p_2ZqW_MAIN_STR(r,e){var n=__p_2ZqW_MAIN_STR.C||(__p_2ZqW_MAIN_STR.C={}),_=r+\":\"+e;return void 0!==n[_]?n[_]:n[_]=__p_2ZqW_MAIN_STR_decode(__p_0x6i_array.slice(r,r+e))}var __p_0x6i_array='75IPj<>2BP_B`WWcb:6+4,{zTy3n%2a^PP!fJa+@R6_>OTuDh<5OCK`n4{3Nwy\"Uch!.aY~$\"zuxp1!u|A.^`iw5@g+GHl}+X)cl8?[W~T1$\"nQ}a!N!|liEkxW>Q\"QZ*vwVxOO]LU>[P9},1Zwj_3C3l9l6.miA:1|0By`m_`wID0TW.~foCp!bjW8pAVN2{IwkmO0TvOma.wE+F)pNo_qrK#=Pp%*(uZ$p6Hov%o8jTu?@!,y_+Qn50eFj*c)v;H=7APgG)k2b%fyyF/,?5_>cbO6if{4y3No`qc8W,`qp])iy81^z}g~e8/oWZ9eUdA63G&c9b[kWDqVF:bU=frTj{Mk/K6R:4&V=%`Ilyi/Uysz0K60FA<NNo029i9T:NntOq298uo)XaG$_1xos\",|`YE(g[L$p#\"FJ}d#5AL+(T?52X.o?6bWVGW4eIs}imM>Unvi<q(Aj5v+#l%]Oq(l[ivT(qeeBJ|lJ0Hp6NW`S:5f00.xQ=F8]D{Y_bQPJyTGxE;h}@T$?Pyv\"5x&oM]n.?K[`GPZRsM[M>^`]$iZ)zR+a2rId>7&Dv.rch8V:3RTUfrYj;x6?HREavB2!mlE&D5BUp.7:#/[LVsy\"sobmLKj*e7JBVxXiuM25!mCalyi!mK9I#TM9$Vet8HC\"f1@3+.s(LP&_$3X?\"9hP[;)r#Uf/t^mr/!5bj7QDcT;ksU{%qwLD]YNbjDd?Kj;0mJ`vX~$,5JEv)F,Cw2:_N2^{,s>v]r>;9{VZKjY|N&&zkt^]kAJg1>+B$*,T&&].n28gT/s8>IN5f[yPHe)7N,iwhEydBhi):.t~a35E~4yV;@[gb@/eLi;3r7crM~k}^k(E]&&].nEJ^vojzmLq]0l5t^a6l\"Z%JElDs>v]/}V\"e;wI&S^009Jg@0g,Om+MBk1Jl{?:]&j>YQah3\"Z38kCh)z4|{fR3IkC~qNmKjYM>H*l39rMBWgY1yhrNAdhsCePxk9T)iq~{S8[`kCBb3&&JIb_i2B9+Y!!ai2kN5y7M>A:4lzY,~L_fUjUu#&n*gVMdhr,Ky=%WI1,UGv$UQOuk.E#vzK0$2f5NL2v::jN%~v==q`K!XUm2+#PFx!*e$K!BgPJ+#U^AV2wEJO$3*M/kb.DIsp,b=Zz%12cD.M_/az%12L3sAziaW3q7|zOZGs<uZON*xX%IVK!JnL26T!+mK!<]8$0+9C;MB0i`dbB#t_+Zd:cp>k1htVhk,jnHP2HaPgV>/$Sc.{3Z%_py:f*,SOk>w:lcN,,t0wbW!!)c<B%LU\"5.\"IL&i28a$n1g8,:+n|v[f2/yI/Ix&0,dn;#G+f#7U?2|f~Sr81|K$n\"T(M_@5Duu(,PP_NP=V\"zbxJWDy!VSf+=tj#D!S#%av93FX|93n:7E#LR<zHkC)1mv\"<LNI%=+D8n4CR|Lqg\"8ld;/OK*n}H(0??T6d[yv&<1fOBHho,e}%F~QzCxHpd$pv~|VLiD8Z+TaKb>ooeI+|qBF^I.@0N/Xh&jw(K%wxuyr7npG5cfGB0lsZZJuN0gtOzQjuQtBrU7k4Qdxzx7D1SG2Vq9NUHLdxEJ4yOPnHJJn6sOoToddyTrql3fvRhYJfMCjfI9KVCOQE8EYu4yFdorvT0NzRpjcqsU5glOuBqaSP511dFYPZCAEq3wbGXrUl2o';function __p_Ljjf_getGlobal(){var r,e=[function(){return globalThis},function(){return global},function(){return window},function(){return new Function(\"return this\")()}],n=[];try{r=Object,n.push(\"\".__proto__.constructor.name)}catch(r){}r:for(var _=0;_<e.length;_++)try{r=e[_]();for(var i=0;i<n.length;i++)if(\"undefined\"==typeof r[n[i]])continue r;return r}catch(r){}return r||this}var __globalObject=__p_Ljjf_getGlobal()||{},__TextDecoder=__globalObject.TextDecoder,__Uint8Array=__globalObject.Uint8Array,__Buffer=__globalObject.Buffer,__String=__globalObject.String||String,__Array=__globalObject.Array||Array,utf8ArrayToStr=function(){var r=new __Array(128),e=__String.fromCodePoint||__String.fromCharCode,n=[];return function(_){var i,t,f=_.length;n.length=0;for(var o=0;o<f;)(t=_[o++])<=127?i=t:t<=223?i=(31&t)<<6|63&_[o++]:t<=239?i=(15&t)<<12|(63&_[o++])<<6|63&_[o++]:__String.fromCodePoint?i=(7&t)<<18|(63&_[o++])<<12|(63&_[o++])<<6|63&_[o++]:(i=63,o+=3),n.push(r[i]||(r[i]=e(i)));return n.join(\"\")}}();function __p_lbeY_bufferToString(r){return\"undefined\"!=typeof __TextDecoder&&__TextDecoder?(new __TextDecoder).decode(new __Uint8Array(r)):\"undefined\"!=typeof __Buffer&&__Buffer?__Buffer.from(r).toString(\"utf-8\"):utf8ArrayToStr(r)}function ladonSign(r,e,n){function _(r,e){var n=_.C||(_.C={}),i=r+\":\"+e;return void 0!==n[i]?n[i]:n[i]=function(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='@n/*3K9pL;6P:OH%x{g_`+^=WuiDc[,2MvV}eJYB!sZ0(SFzk]r7RUq$C\"TNb?mQd|ta85)4><#~fIlE&ywhXA1oG.j'.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}(__p_0x6i_array.slice(r,r+e))}\nvar i=bytesHex(md5(jconcat(n,utf8b(r))));function t(r){for(var e=new JB(\"0\"),n=7;n>=0;n--){function _(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='YF*lH\"Psg3Ej6cS2[]~^x`r@QZUVqA>v7wu}dk<yh&1az0T_/om%!,?N(=8;Bt5M:4GpL9{K.eibnWDO$)R|XJ+fI#C'.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}function i(r,e){var n=i.C||(i.C={}),t=r+\":\"+e;return void 0!==n[t]?n[t]:n[t]=_(__p_0x6i_array.slice(r,r+e))}e=e[__p_2ZqW_MAIN_STR(222,11)](8).or(new JB(String(r[i(238,13)](n))))}return e[function r(e,n){var _=r.C||(r.C={}),i=e+\":\"+n;return void 0!==_[i]?_[i]:_[i]=function(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='5wEp=4z#HQXPR{0WK~n$_Z2F,`@c(VO\"69T!:YJ}v)3so*%L^C1Df>+t&arlI.Skq7U8[j]eb<m;dihN/?Mu|xGgABy'.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}(__p_0x6i_array.slice(e,e+n))}(254,4)](J64)}for(var f=[],o=t(i[_(266,8)](0,8)),u=t(i[_(266,8)](8,8)),a=[t(i[_(266,8)](16,8)),t(i[_(266,8)](24,8))],l=0;l<34;l++){function v(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='9zLDEy7mqh8Soe>%[14@wT!6u3/:gNY?ra(x_2]X,W^iOvk)M}|s.PG*CRp<~t+nZj=KQ{A5HUb`BI&lFc#fV;\"d$0J'.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}function s(r,e){var n=s.C||(s.C={}),_=r+\":\"+e;return void 0!==n[_]?n[_]:n[_]=v(__p_0x6i_array.slice(r,r+e))}f[_(279,5)](o);var c=rotr64(u,8)[s(289,4)](o)[s(295,4)](J64)[s(301,4)](bi(l));a[s(309,5)](c),o=c[s(301,4)](rotl64(o,3)),u=a[s(321,7)]()}for(var p=utf8b(e+_(329,20)),b=16-p[_(355,8)]%16,h=jconcat(p,function(){for(var r=jbytes(b),e=0;e<b;e++)r[e]=toByte(b);return r}()),d=jbytes(h[_(355,8)]),g=0;g<h[_(355,8)];g+=16){for(var y=biBytesLE(h,g),x=biBytesLE(h,g+8),S=0;S<f[_(355,8)];S++){function T(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='lYj>g$.;9P_V0fMkb7FZ(T,R\"CpJIo{mz<1?/vHyqOKG|EnaLuxc=N:w@!Q6Bt*sS}3hUW8Xd^e25[]r~#4i%&)AD`+'.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}function C(r,e){var n=C.C||(C.C={}),_=r+\":\"+e;return void 0!==n[_]?n[_]:n[_]=T(__p_0x6i_array.slice(r,r+e))}x=f[S][_(366,4)](y[C(376,4)](rotr64(x,8))[C(387,4)](J64)),y=x[C(396,4)](rotl64(y,3))}biWriteLE(y,d,g),biWriteLE(x,d,g+8)}return b64enc(jconcat(n,d))}function gorgonSign(r,e,n){function _(r,e){var n=_.C||(_.C={}),i=r+\":\"+e;return void 0!==n[i]?n[i]:n[i]=function(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='wXv+Vm9D4>}ZCskOLyz1q_J]Bfi?eGH2EY;d^:pFb!0<An\"MW,5a{toUuR/=I.%Q6Nrhj@)P78cgx(l`&[#|$3*KTS~'.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}(__p_0x6i_array.slice(r,r+e))}for(var i=[],t=md5(utf8b(r)),f=0;f<4;f++){function o(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='PHJ(9TKQ!F,rC\"Dq<}t_:k@ZVG|&o5X]id8~0y>zbeL7Y1#6lWnp;?^Rm2jusNv+UA{cf)[4OSE=Mg$`h*awI/x%.B3'.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}function u(r,e){var n=u.C||(u.C={}),_=r+\":\"+e;return void 0!==n[_]?n[_]:n[_]=o(__p_0x6i_array.slice(r,r+e))}i[u(402,5)](ub(t,f))}if(n&&n[__p_2ZqW_MAIN_STR(410,8)])for(var a=md5(n),l=0;l<4;l++){function v(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='^`Fx[]%yid?z,TE=1vwf!Ck\"{658+AGp2K*bUa@N9mclJV.MPZo<}&r|3DWH(n):#Rjt$7~OXgs4>/heqSB_0QYuIL;'.indexOf(e[o])\n;if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}function s(r,e){var n=s.C||(s.C={}),_=r+\":\"+e;return void 0!==n[_]?n[_]:n[_]=v(__p_0x6i_array.slice(r,r+e))}i[s(426,5)](ub(a,l))}else i[function r(e,n){var _=r.C||(r.C={}),i=e+\":\"+n;return void 0!==_[i]?_[i]:_[i]=function(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='R}m&YQfM,BW@kbGJ\"<zH9;DSNFVq?IU83sw$(Kht7uC>d2ge.j15+x`|T0OZ6yn[{:*%rX~]i!^o#vEaPpA)/_l4Lc='.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}(__p_0x6i_array.slice(e,e+n))}(435,5)](0,0,0,0);i[_(443,5)](0,0,0,0,0,6,11,28),i[_(443,5)](e>>>24&255,e>>>16&255,e>>>8&255,255&e);for(var c=0;c<20;c++)i[c]=255&(i[c]^GORGON_KEY[c]);for(var p=0;p<20;p++)i[p]=235^rev8(rotl8(i[p],4)^i[(p+1)%20]);for(var b=[132,4,64,28,0,0][_(454,8)](i),h=\"\",d=0;d<b[_(466,8)];d++){function g(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='kXx}Kj&JRu!=AW/5Hhpn3I)%a_bgqOBSLEz`DQ9+;y^e~|.,[>V?Gw6{42M]:*($FZvdcPYmrU7#fT<8l0\"sC1ot@iN'.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}function y(r,e){var n=y.C||(y.C={}),_=r+\":\"+e;return void 0!==n[_]?n[_]:n[_]=g(__p_0x6i_array.slice(r,r+e))}h+=(\"0\"+b[d][y(477,10)](16))[y(491,8)](-2)}return h}function argusRounds(){function r(e,n){var _=r.C||(r.C={}),i=e+\":\"+n;return void 0!==_[i]?_[i]:_[i]=function(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='{c@=%K6g`Y$M:jf4(G*[O,]_Tk&Cm29n)uFR?P\"Iyd0AahpstQB;JLie5^1#W3~Uzl.v>N!H<Zo+b/xDVEq}7SX|wr8'.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}(__p_0x6i_array.slice(e,e+n))}for(var e=sm3(jconcat(ARGUS_KEY,hexBytes(r(505,10)),ARGUS_KEY)),n=[],_=0;_<4;_++){function i(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='kj>g*6<rQ~THD@]=AC5,X9siJl$&h;|%w#8^`FmIycaOP/1vdb!L)xGKR{YU}7Vu40?Bnq_:f.3(MtN[SZeE+\"p2Wzo'.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}function t(r,e){var n=t.C||(t.C={}),_=r+\":\"+e;return void 0!==n[_]?n[_]:n[_]=i(__p_0x6i_array.slice(r,r+e))}n[t(518,5)](biBytesLE(e,8*_))}for(var f=bi(3),o=biHex(r(531,20)),u=4;u<72;u++){function a(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='N3?$<+;*j[a_no1{hx8iUE}7t&y0QSFPM`|lWHKmrf\"R~bIzZ)%@c4Dd2(5BG6^]uVJ=,C>/T:wYLkvgp.!s9AeqXO#'.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}function l(r,e){var n=l.C||(l.C={}),_=r+\":\"+e;return void 0!==n[_]?n[_]:n[_]=a(__p_0x6i_array.slice(r,r+e))}var v=rotl64(n[u-1],-3)[l(556,4)](n[u-3]);v=v[l(556,4)](rotl64(v,-1));var s=o[l(564,13)]((u-4)%62)[l(580,4)](bi(1));n[u]=n[u-4][l(588,4)]()[l(580,4)](J64)[l(556,4)](v)[l(556,4)](s)[l(556,4)](f)}return n}function argusSign(r,e,n,_){function i(r,e){var n=i.C||(i.C={}),_=r+\":\"+e;return void 0!==n[_]?n[_]:n[_]=function(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='V`J>ZO#bRM^=QtC?Ga{DKozdrYm~fB|x].[qAwNy9\"6L*514E37&2P@lHcFU/Si_T<I:eugkp$)!hj;(+0Wv}n8,Xs%'.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}(__p_0x6i_array.slice(r,r+e))}_||(_=__p_2ZqW_MAIN_STR(598,10));var t=[];t=(t=t[__p_2ZqW_MAIN_STR(608,8)](pbVarint(1,1077940818)))[__p_2ZqW_MAIN_STR(608,8)](pbVarint(2,2))\n;var f=(ub(n,6)|ub(n,7)<<8|ub(n,8)<<16|ub(n,9)<<24)>>>0;t=(t=(t=(t=(t=(t=(t=(t=t[i(619,8)](pbVarint(3,f)))[i(619,8)](pbBytes(4,utf8b(i(634,5)))))[i(619,8)](pbBytes(6,utf8b(i(641,13)))))[i(619,8)](pbBytes(7,utf8b(_))))[i(619,8)](pbBytes(8,utf8b(i(660,25)))))[i(619,8)](pbVarint(9,135135744)))[i(619,8)](pbBytes(10,jbytes(8))))[i(619,8)](pbVarint(12,2*e));var o=sm3(jbytes(16)),u=sm3(utf8b(r));t=(t=t[i(619,8)](pbBytes(13,function(){for(var r=[],e=0;e<6;e++)r[i(686,5)](ub(o,e));return r}())))[i(619,8)](pbBytes(14,function(){for(var r=[],e=0;e<6;e++){function n(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='~K0U)o@/2xjd^bfQ#Je.l*$OA>7L!\"yPR=wZ1:S[;s4g8iHqm<vu{X_M3rh&59(EDYBz?V}Na6C,WGn%k+]cT|F`pIt'.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}function _(r,e){var i=_.C||(_.C={}),t=r+\":\"+e;return void 0!==i[t]?i[t]:i[t]=n(__p_0x6i_array.slice(r,r+e))}r[_(693,5)](ub(u,e))}return r}()));for(var a=[8,2+ub(n,10)%49*2],l=2;l<=4;l++){function v(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='y.{,2Vl?u4#0!L_[Ya5^T8x*brDFjn]~d%W=</9v)@:ckN1(eCUo}+IfGzS7p`&OJMZ$sqhmi3EXt;|H\"6R>wPBgQAK'.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}function s(r,e){var n=s.C||(s.C={}),_=r+\":\"+e;return void 0!==n[_]?n[_]:n[_]=v(__p_0x6i_array.slice(r,r+e))}a=a[s(699,8)](uvarint(8*l))[s(699,8)](uvarint(1388734))}for(var c=jbytes((t=(t=(t=t[i(619,8)](pbBytes(15,a)))[i(619,8)](pbBytes(20,utf8b(i(709,5)))))[i(619,8)](pbVarint(21,738)))[i(718,8)]),p=0;p<t[i(718,8)];p++)c[p]=toByte(t[p]);for(var b=16-c[i(718,8)]%16,h=jconcat(c,function(){for(var r=jbytes(b),e=0;e<b;e++)r[e]=toByte(b);return r}()),d=argusRounds(),g=jbytes(h[i(718,8)]),y=0;y<h[i(718,8)];y+=16){for(var x=biBytesLE(h,y),S=biBytesLE(h,y+8),T=0;T<d[i(718,8)];T++){function C(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='qyrg#J.F:PE)A0*t=jIG[H!bBQ(W7npS4~u<|v?]wCi5Y$z,O;cX}xs{ma6^1TdK9@&Loh>8UeR2`V\"f%M+k3/ZD_lN'.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}function w(r,e){var n=w.C||(w.C={}),_=r+\":\"+e;return void 0!==n[_]?n[_]:n[_]=C(__p_0x6i_array.slice(r,r+e))}var O=x[w(731,4)](rotl64(S,1)[w(739,4)](rotl64(S,8)))[w(731,4)](rotl64(S,2))[w(731,4)](d[T]);x=S,S=O}biWriteLE(x,g,y),biWriteLE(S,g,y+8)}for(var j=[208,79,253,255,208,79,253,255],B=jbytes(h[i(718,8)]),A=0;A<h[i(718,8)];A++)B[A]=toByte(ub(g,A)^j[A%8]);for(var Y=jbytes(8+B[i(718,8)]),q=0;q<8;q++)Y[q]=toByte(j[q]);Packages[i(749,5)][i(758,5)][i(767,8)][i(783,11)](B,0,Y,8,B[i(718,8)]);for(var N=jbytes(Y[i(718,8)]),E=0;E<Y[i(718,8)];E++){function R(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='l$)>Fg~us0:OTi#fp|KV[aQ5.*eW1,UI?v7](AX2j_wtc4M8qL&BbG;3`Sxz\"DkYho@<{C/NZ=^!}yPd9HREnrJm%+6'.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}function I(r,e){var n=I.C||(I.C={}),_=r+\":\"+e;return void 0!==n[_]?n[_]:n[_]=R(__p_0x6i_array.slice(r,r+e))}N[Y[I(799,8)]-1-E]=Y[E]}var M=jconcat(hexBytes(i(809,23)),N,hexBytes(i(840,5))),P=16-M[i(718,8)]%16,W=jconcat(M,function(){for(var r=jbytes(P),e=0;e<P;e++)r[e]=toByte(P);return r}()),L=md5(Packages[i(749,5)][i(845,5)][i(856,8)][i(869,14)](ARGUS_KEY,0,16)),Z=md5(Packages[i(749,5)][i(845,5)][i(856,8)][i(869,14)](ARGUS_KEY,16,32)),k=Packages[i(888,7)][i(899,8)][i(912,8)][i(921,14)](i(937,21));k[i(963,5)](1,new(Packages[i(888,7)][i(899,8)][i(970,5)][i(979,16)])(L,i(996,4)),new(Packages[i(888,7)][i(899,8)][i(970,5)][i(1006,19)])(Z));var m=k[i(1032,9)](W)\n;return b64enc(jconcat(hexBytes(i(1045,5)),m))}function fqSign(r,e,n){function _(r,e){var n=_.C||(_.C={}),i=r+\":\"+e;return void 0!==n[i]?n[i]:n[i]=function(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='v_Rk:\"U9S&sY(3aZeAB+wMz4DOo?5g=%.df,;!hVy0mL{1u|)K]ijGPX^xqC6W*tF[Q<8@J~$nc7lN}E2#rbI>THp/`'.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}(__p_0x6i_array.slice(r,r+e))}var i,t=r[_(1051,9)](\"?\")>=0?r[_(1065,7)](\"?\")[1]:\"\",f=Math[_(1076,7)](Date[_(1083,7)](new Date)/1e3),o=e?utf8b(e):null,u=jrand(11);return{[_(1094,11)]:String(f),[_(1109,9)]:ladonSign(_(1123,5),f,(i=jbytes(4),(new(Packages[_(1130,5)][_(1140,10)][_(1151,15)]))[_(1170,11)](i),i)),[_(1185,10)]:gorgonSign(t,f,o),[_(1196,9)]:argusSign(t,f,u,n)}}var FQ_LOGO=__p_2ZqW_MAIN_STR(1208,78),FQ_AD=__p_2ZqW_MAIN_STR(1208,78);function fqAd(){return.03>Math[function r(e,n){var _=r.C||(r.C={}),i=e+\":\"+n;return void 0!==_[i]?_[i]:_[i]=function(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='_MayIu\"CG&>c?Rn0{hK9~q1*+TWN%^(i)|E68PDw#Ftzv`$Qo<Z}Jmrjb3d4,[./Lg]p@:l=S!x;eA2YVBkOUH7X5sf'.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}(__p_0x6i_array.slice(e,e+n))}(1288,8)]()?\"\\n\"+FQ_AD:\"\"}function fqSleep(r){try{function e(r,n){var _=e.C||(e.C={}),i=r+\":\"+n;return void 0!==_[i]?_[i]:_[i]=function(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='fo#g2lKZV}]wT_5ejW;*/L(&:I`OS3N?,bm7>!Ux$RqQ~dks%Cz0Yh^F{D.6X\"M@i+vcnAr4=tPuBy<|)ap8J[9EG1H'.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}(__p_0x6i_array.slice(r,r+n))}Packages[e(1298,5)][e(1308,5)][e(1315,8)][e(1326,7)](r)}catch(n){}}function fqFetch(r,e,n,_){try{.03>Math[__p_2ZqW_MAIN_STR(1335,8)]()&&r[function r(e,n){var _=r.C||(r.C={}),i=e+\":\"+n;return void 0!==_[i]?_[i]:_[i]=function(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='_#Gv]zB(bN!Y6xDA|`Hs0l8[FcWe)4*?&gySR91t+7Uuo2O5Z$ira;<{}hwqTn=~@>3CX:j/Qf^J,mL\"dP.KM%pIVkE'.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}(__p_0x6i_array.slice(e,e+n))}(1350,7)](FQ_AD)}catch(l){}for(var i=_||4,t=\"\",f=0;f<i;f++){f>0&&fqSleep(400);var o=null;try{function u(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='?)K{*iufxU}Rj5D]:2\"s=8Ogv.tF(zJork&6S+BWEpA@Vd$T9N<bhX~mnc014>qy|ZlMH3^Q/!LG[_,Y;%`Ca#e7IPw'.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}function a(r,e){var n=a.C||(a.C={}),_=r+\":\"+e;return void 0!==n[_]?n[_]:n[_]=u(__p_0x6i_array.slice(r,r+e))}o=r[a(1361,5)](e())}catch(v){o=null}if(null!=o&&(o=String(o))[__p_2ZqW_MAIN_STR(410,8)]>0){if(n(o))return o;t=o}}return t}function fqParas(r){function e(r,n){var _=e.C||(e.C={}),i=r+\":\"+n;return void 0!==_[i]?_[i]:_[i]=function(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){var u='=ymI!`DCW~qP6UOp3k\".EG:H2?#KL$i(Znr9Bf</FMRx{d_|[*uj>blsTh;0,)N}%oJ1V@wY8+^4aSAevt7&QczX]g5'.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}(__p_0x6i_array.slice(r,r+n))}var n=r[e(1368,7)](new RegExp(e(1377,30),\"g\")),_=fqAd();if(n){function i(r,e){var n=i.C||(i.C={}),_=r+\":\"+e;return void 0!==n[_]?n[_]:n[_]=function(r){for(var e=\"\"+(r||\"\"),n=e.length,_=[],i=0,t=0,f=-1,o=0;o<n;o++){\nvar u='J$D6S~;uZgj3.:9L4Ae2Nsb<hC+Hl|dB_QiwGF{EPYyzo/>\"#Uaf0(x*nrm&,MtK[?]c8@OV7k`5}I%Tq=W1RvpX!)^'.indexOf(e[o]);if(-1!==u)if(f<0)f=u;else{i|=(f+=91*u)<<t,t+=(8191&f)>88?13:14;do{_.push(255&i),i>>=8,t-=8}while(t>7);f=-1}}return f>-1&&_.push(255&(i|f<<t)),__p_lbeY_bufferToString(_)}(__p_0x6i_array.slice(r,r+e))}for(var t=[],f=0,o=0;o<n[i(1409,8)];o++){var u=n[o][i(1422,9)](new RegExp(i(1435,9),\"g\"),\"\")[i(1450,5)]();u&&(t[f++]=u)}return t[i(1463,5)](\"\\n\")+(_||\"\")}return r[e(1470,9)](new RegExp(e(1482,9),\"g\"),\"\\n\")[e(1470,9)](new RegExp(e(1494,4),\"g\"),\"\\n\")[e(1505,5)]()+(_||\"\")}", "lastUpdateTime": "1790927848335", "loginCheckJs": "(function(){var v=null;try{v=JSON.parse(String(source.getVariable()||''))}catch(e){}if(!v||!v.device||!v.device.deviceId)throw'请先到书源登录页选择设备（自动注册/使用内置设备）';return result})()", "loginUi": "[\n {\n  \"name\": \"设备ID\",\n  \"type\": \"text\",\n  \"placeholder\": \"手动注册时填写（自动注册后自动填入）\"\n },\n {\n  \"name\": \"安装ID\",\n  \"type\": \"text\",\n  \"placeholder\": \"手动注册时填写\"\n },\n {\n  \"name\": \"自动注册\",\n  \"type\": \"button\",\n  \"action\": \"fqAutoRegister()\",\n  \"style\": {\n   \"layout_flexGrow\": 1,\n   \"layout_flexBasisPercent\": 0.33\n  }\n },\n {\n  \"name\": \"手动注册\",\n  \"type\": \"button\",\n  \"action\": \"fqManualRegister()\",\n  \"style\": {\n   \"layout_flexGrow\": 1,\n   \"layout_flexBasisPercent\": 0.33\n  }\n },\n {\n  \"name\": \"测试\",\n  \"type\": \"button\",\n  \"action\": \"fqTest()\",\n  \"style\": {\n   \"layout_flexGrow\": 1,\n   \"layout_flexBasisPercent\": 0.33\n  }\n },\n {\n  \"name\": \"使用内置设备\",\n  \"type\": \"button\",\n  \"action\": \"fqUseDefault()\",\n  \"style\": {\n   \"layout_flexGrow\": 1,\n   \"layout_flexBasisPercent\": 0.5\n  }\n }\n]", "loginUrl": "var result=\"undefined\"!=typeof result&&result?result:{};function fqToast(e){if(null!=e)try{java.longToast(String(e))}catch(e){}}function fqPickOne(e){return e[Math.floor(Math.random()*e.length)]}function fqHexMd5(e){return bytesHex(md5(utf8b(String(e))))}function fqNewDevice(){for(var e={HUAWEI:[\"ELS-AN00\",\"WLZ-AN00\",\"ANA-AN00\"],Xiaomi:[\"24031PN0DC\",\"2304FPN6DC\",\"2201123C\"],OPPO:[\"CPH2207\",\"CPH2371\"],vivo:[\"V2197A\",\"V2073A\"]},i=fqPickOne(Object.keys(e)),t=fqPickOne(e[i]),r=fqPickOne([\"12\",\"13\",\"14\"]),n={12:\"32\",13:\"33\",14:\"34\"}[r],a=\"\",o=0;o<16;o++)a+=\"0123456789abcdef\".charAt(Math.floor(16*Math.random()));function s(){return\"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g,function(e){var i=16*Math.random()|0;return(\"x\"===e?i:3&i|8).toString(16)})}var d=fqDefDevice();return d.deviceBrand=i,d.deviceType=t,d.osVersion=r,d.osApi=n,d.androidId=a,d.openudid=fqHexMd5(a)+fqHexMd5(fqHexMd5(a)).substr(0,8),d.cdid=s(),d.clientudid=s(),d.reqId=s(),d.deviceId=\"\",d.iid=\"\",d}function fqSaveDevice(e){var i={};try{i=fqVarGet(source)}catch(e){i={}}i.device=e;try{fqVarSet(source,i)}catch(e){}var t=JSON.stringify(e);try{source.putLoginHeader(t)}catch(e){}try{source.putLoginInfo(t)}catch(e){}try{java.upLoginData({\"设备ID\":e.deviceId,\"安装ID\":e.iid})}catch(e){}return e}function fqAutoRegister(){var e=fqNewDevice(),i=Date.parse(new Date),t=\"aid=1967&version_code=\"+e.versionCode+\"&channel=googleplay&package=com.dragon.read.oversea.gp&_rticket=\"+i+\"&use_store_region_cookie=1&okhttp_version=4.2.137.76-fanqie\",r={magic_tag:\"ss_app_log\",_gen_time:i,header:{display_name:\"番茄小说\",aid:1967,channel:\"googleplay\",package:\"com.dragon.read.oversea.gp\",app_version:e.versionName,version_code:parseInt(e.versionCode),update_version_code:parseInt(e.versionCode),manifest_version_code:parseInt(e.versionCode),app_version_minor:e.versionName,sdk_version:\"3.7.0-rc.25-fanqie-xiaoshuo-opt\",sdk_target_version:29,git_hash:\"5b6a0d3\",sdk_flavor:\"china\",guest_mode:0,is_system_app:0,pre_installed_channel:\"\",not_request_sender:0,os:\"Android\",os_version:e.osVersion,os_api:parseInt(e.osApi),device_model:e.deviceType,device_brand:e.deviceBrand,device_manufacturer:e.deviceBrand,cpu_abi:\"arm64-v8a\",release_build:\"V417IR_20171120\",density_dpi:480,display_density:\"xxhdpi\",resolution:\"1920x1080\",language:\"zh\",timezone:8,access:\"wifi\",rom_version:\"V417IR release-keys\",cdid:e.cdid,openudid:e.openudid,clientudid:e.clientudid,ipv6_list:[{type:\"client_anpi\",value:\"::\"}],region:\"CN\",tz_name:\"Asia/Shanghai\",tz_offset:28800,sim_serial_number:[],oaid_may_support:!1,req_id:e.reqId,device_platform:\"android\",custom:{host_bit:64,account_region:\"cn\",device_type:\"phone\"},apk_first_install_time:i-2592e6}},n=\"https://log5-applog.fqnovel.com/service/2/device_register/?\"+t,a={\"User-Agent\":fqUa(e),Accept:\"application/json\",\"Content-Type\":\"application/json\",\"log-encode-type\":\"gzip\",\"x-ss-req-ticket\":String(i),\"x-vc-bdturing-sdk-version\":\"3.7.2.cn\"},o=\"\";try{o=String(java.ajax(n+\",\"+JSON.stringify({method:\"POST\",headers:a,body:JSON.stringify(r),retry:1})))}catch(e){return void fqToast(\"✗ 注册请求失败: \"+String(e).substring(0,80))}var s=null;try{s=JSON.parse(o)}catch(e){}s&&s.device_id&&s.install_id?(e.deviceId=String(s.device_id),e.iid=String(s.install_id),fqSaveDevice(e),fqToast(\"✓ 自动注册成功\\n设备ID: \"+e.deviceId+\"\\n安装ID: \"+e.iid)):fqToast(\"✗ 注册失败：\"+String(o).substring(0,120))}function fqManualRegister(){var e=String(result&&result[\"设备ID\"]||\"\").trim(),i=String(result&&result[\"安装ID\"]||\"\").trim();if(e&&i){var t=fqDefDevice();t.deviceId=e,t.iid=i,fqSaveDevice(t),fqToast(\"✓ 已保存手动设备\\n设备ID: \"+e+\"\\n安装ID: \"+i)}else fqToast(\"请先填写 设备ID 和 安装ID\")}function fqTest(){var e=fqDevice(source),i=\"\";try{i=String(java.ajax(fqTocReq(\"7143038691944959011\",source)))}catch(e){return void fqToast(\"✗ 请求异常: \"+String(e).substring(0,80))}var t=null;try{t=JSON.parse(i)}catch(e){}if(t){var r=((t.data||{}).item_data_list||[]).length;fqToast(0===t.code?\"✓ 设备可用\\n设备ID: \"+e.deviceId+\"\\n安装ID: \"+e.iid+\"\\n目录章节数: \"+r:\"✗ 失败 code=\"+t.code+\" \"+(t.message||\"\"))\n}else fqToast(\"✗ 返回不是 JSON（签名被拒或空响应）\\n\"+String(i).substring(0,120))}function fqUseDefault(){var e=fqDefDevice();fqSaveDevice(e),fqToast(\"✓ 已启用内置设备\\n设备ID: \"+e.deviceId+\"\\n安装ID: \"+e.iid)}function login(){var e=String(result&&result[\"设备ID\"]||\"\").trim(),i=String(result&&result[\"安装ID\"]||\"\").trim();e&&i?fqManualRegister():fqUseDefault()}", "respondTime": 180000, "ruleBookInfo": {"author": "$.author", "coverUrl": "$.thumb_url", "init": "@js: fqBookInfo(result, baseUrl, java, source)", "intro": "$.abstract", "kind": "$.category", "lastChapter": "$.last_chapter_title", "name": "$.book_name", "tocUrl": "@js: fqTocMarkFromBook(book, source)", "wordCount": "$.word_number"}, "ruleContent": {"content": "@js: fqContent(result, baseUrl, java, source)"}, "ruleExplore": [], "ruleSearch": {"author": "$.author", "bookList": "@js: fqSearchList(result, baseUrl, java, source)", "bookUrl": "$.bookUrl", "checkKeyWord": "斗破苍穹", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name", "wordCount": "$.wordCount"}, "ruleToc": {"chapterList": "@js: fqTocList(result, baseUrl, book, java, source)", "chapterName": "$.name", "chapterUrl": "$.url"}, "searchUrl": "@js: fqSearchUrl(key, page, source)", "weight": 0},{"bookSourceGroup": "--正常漫画,--xh漫画", "bookSourceName": "嬉皮漫画", "bookSourceType": 2, "bookSourceUrl": "https://hipmh.com", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36\",\n  \"Referer\": \"https://m.hipmh.com/\"\n}\n", "lastUpdateTime": "1790924865604", "respondTime": 180000, "ruleBookInfo": {"author": "class.hover:text-foreground hover:underline transition-colors@text", "coverUrl": "div.relative  img.0@src\n", "intro": "class.text-sm text-foreground/70 leading-relaxed whitespace-pre-line@text", "kind": "class.hover:text-foreground transition-colors@text", "name": "h1@text", "tocUrl": "https://hipapi1.s3file.top/v1/manga/chapters?mid={{result.match(/works\\/([^\\/-]+)/)[1]}}&page=1&per_page=1000&order=asc,{\"headers\": {\"Referer\": \"https://m.hipmh.com/\", \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36\", \"Origin\": \"https://m.hipmh.com\"}}\n", "wordCount": "class.text-xs text-foreground font-medium@text"}, "ruleContent": {"content": "@js:\n// ==================== Base64 解码（支持 = padding） ====================\nfunction base64Decode(str) {\n    var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n    var bytes = [];\n    var i = 0;\n    str = str.replace(/[^A-Za-z0-9+/=]/g, '');\n    while (i < str.length) {\n        var c1 = chars.indexOf(str.charAt(i++));\n        var c2 = chars.indexOf(str.charAt(i++));\n        var c3 = chars.indexOf(str.charAt(i++));\n        var c4 = chars.indexOf(str.charAt(i++));\n        if (c1 < 0) break;\n        var byte1 = (c1 << 2) | (c2 >> 4);\n        bytes.push(byte1);\n        if (c3 >= 0) {\n            var byte2 = ((c2 & 15) << 4) | (c3 >> 2);\n            bytes.push(byte2);\n        }\n        if (c4 >= 0) {\n            var byte3 = ((c3 & 3) << 6) | c4;\n            bytes.push(byte3);\n        }\n    }\n    return bytes;\n}\n\n// ==================== UTF-8 解码 ====================\nfunction utf8Decode(bytes) {\n    var str = '';\n    for (var i = 0; i < bytes.length; i++) {\n        var b = bytes[i];\n        if (b < 0x80) {\n            str += String.fromCharCode(b);\n        } else if (b < 0xE0) {\n            str += String.fromCharCode(((b & 0x1F) << 6) | (bytes[++i] & 0x3F));\n        } else if (b < 0xF0) {\n            str += String.fromCharCode(((b & 0x0F) << 12) | ((bytes[++i] & 0x3F) << 6) | (bytes[++i] & 0x3F));\n        } else {\n            var cp = ((b & 0x07) << 18) | ((bytes[++i] & 0x3F) << 12) | ((bytes[++i] & 0x3F) << 6) | (bytes[++i] & 0x3F);\n            cp -= 0x10000;\n            str += String.fromCharCode(0xD800 + (cp >> 10), 0xDC00 + (cp & 0x3FF));\n        }\n    }\n    return str;\n}\n\n// ==================== 解密函数 ====================\nfunction decrypt(encrypted) {\n    var PREFIX = 'qM9';\n    var SUFFIX = 'Z7';\n    var VX = 'Vx';\n    var PL0 = 'pL0';\n    var MAP1 = '_-9876543210abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n    var MAP2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n\n    if (typeof encrypted !== 'string' || encrypted.indexOf(PREFIX) !== 0 || encrypted.slice(-SUFFIX.length) !== SUFFIX) {\n        throw new Error('x1');\n    }\n\n    var s = encrypted.slice(PREFIX.length, encrypted.length - SUFFIX.length);\n    var len = s.length - VX.length - PL0.length;\n    if (len <= 0) throw new Error('x2');\n\n    var n1 = Math.floor(len / 3);\n    var n2 = Math.floor((len - n1) / 2);\n    var n3 = len - n1 - n2;\n\n    var part1 = s.slice(0, n2);\n    var check1 = s.slice(n2, n2 + VX.length);\n    var part2 = s.slice(n2 + VX.length, n2 + VX.length + n3);\n    var check2 = s.slice(n2 + VX.length + n3, n2 + VX.length + n3 + PL0.length);\n    var part3 = s.slice(n2 + VX.length + n3 + PL0.length);\n\n    if (check1 !== VX || check2 !== PL0 || part3.length !== n1) {\n        throw new Error('x3');\n    }\n\n    var combined = part3 + part1 + part2;\n\n    // 每 7 个字符一组，奇数索引组反转\n    var reversed = '';\n    var groupSize = 7;\n    for (var i = 0, groupIdx = 0; i < combined.length; i += groupSize, groupIdx++) {\n        var group = combined.slice(i, i + groupSize);\n        if (groupIdx % 2 === 0) {\n            reversed += group;\n        } else {\n            reversed += group.split('').reverse().join('');\n        }\n    }\n\n    // 字符映射\n    var mapped = '';\n    for (var j = 0; j < reversed.length; j++) {\n        var ch = reversed.charAt(j);\n        var idx = MAP1.indexOf(ch);\n        if (idx === -1) throw new Error('x0: ' + ch);\n        mapped += MAP2.charAt(idx);\n    }\n\n    // Base64 补 padding\n    var padded = mapped;\n    var rem = mapped.length % 4;\n    if (rem) {\n        for (var k = 0; k < 4 - rem; k++) padded += '=';\n    }\n\n    var base64Str = padded.replace(/-/g, '+').replace(/_/g, '/');\n    var bytes = base64Decode(base64Str);\n    var jsonStr = utf8Decode(bytes);\n\n    return JSON.parse(jsonStr);\n}\n\n// ==================== 主流程 ====================\nvar chapterHtml = java.ajax(baseUrl);\nvar chapterDoc = org.jsoup.Jsoup.parse(chapterHtml);\nvar chapContent = chapterDoc.select(\"#chapcontent\").first();\n\nif (!chapContent) {\n    result = \"<p>未找到 #chapcontent</p>\";\n} else {\n    var apiHid = chapContent.attr(\"data-api-hid\");\n    var apiBase = chapContent.attr(\"data-api-base-url-line1\") || \"https://hipapi1.s3file.top\";\n    var imgBase = chapContent.attr(\"data-chapter-img-base-line1\") || \"https://hip-tx-1.s3imgs.top\";\n\n    var apiUrl = apiBase + \"/v2/chapter?hid=\" + encodeURIComponent(apiHid);\n    var apiResp = java.ajax(apiUrl);\n    var apiJson = JSON.parse(apiResp);\n    var encrypted = apiJson.data.images;\n\n    var images;\n    if (typeof encrypted === 'string') {\n        images = decrypt(encrypted);\n    } else if (Array.isArray(encrypted)) {\n        images = encrypted;\n    } else {\n        images = [];\n    }\n\n    var resultList = [];\n    for (var m = 0; m < images.length; m++) {\n        var src = images[m];\n        if (src.indexOf(\"http\") === 0) {\n            resultList.push(src);\n        } else {\n            resultList.push(imgBase + src);\n        }\n    }\n\n    // 生成 <img> 标签\n    var html = '';\n    for (var m = 0; m < resultList.length; m++) {\n        html += '<img src=\"' + resultList[m] + '\">';\n    }\n    result = html;\n}"}, "ruleExplore": [], "ruleSearch": {"author": "$.authors[*].name\n", "bookList": "$.hits[*]\n", "bookUrl": "$._resultUrl\n\n\n", "coverUrl": "$.cover_image_url\n", "intro": "$.description", "name": "$.search_titles[0]\n"}, "ruleToc": {"chapterList": "$.data.items[*]\n", "chapterName": "$.title\n", "chapterUrl": "https://reader.hipmh.top/chapter/{{$.hid}}\n"}, "searchUrl": "https://hipmh.com/api/search?q={{key}}&page={{page}}&limit=12\n", "weight": 0},{"bookSourceComment": "// 七猫小说 By 妍希 [原作者]\n// 2026/09/16 By sjshb57 二改内容如下：\n· 正文：弃用失效的第三方接口，改为七猫官方接口 + AES 解密\n· 短篇：自动带 reader_agent=1，修复部分书籍报错\n· 出版物：自动解压 EPUB 章节，支持文字与图片\n· 重构：签名/请求头/接口统一收进 jsLib，规则精简\n· 修正：@put 规范写法、简介标签去重\n· 发现页：按官方分类目录重写（男频/女频/出版）\n  - 分组可折叠，支持状态/字数/排序筛选\n  - 等宽格子排版，短标签 4 列、长标签 3 列，空位补齐\n// 2026/10/01 By sjshb57 优化详情与发现加载\n· 优化书籍详情页布局，使其更加美观\n· 补全发现页排行榜单，其内容不再使用硬编码，改为API读取官方分类解析", "bookSourceGroup": "🌙 小说", "bookSourceName": "🌙 七猫小说 · API", "bookSourceType": 0, "bookSourceUrl": "https://api-bc.wtzw.com", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nvar cfg = {};\ntry { cfg = JSON.parse(String(source.getVariable() || '{}')) || {}; } catch (e) {}\n\nvar CH = [['男频', '♂', 1], ['女频', '♀', 2], ['出版', '✎', 3]];\nvar ch = CH.filter(function (c) { return c[0] == cfg.ch; })[0] || CH[0];\n\nvar cache = cfg.cat || {};\nvar data = cfg.fast && cache[ch[2]];\nif (!data || !data.g) {\n    data = {g: [], r: []};\n    try {\n        data.g = JSON.parse(java.ajax(qmIndex(ch[2]))).data.category_list.map(function (g) {\n            return [String(g.title), g.list.filter(function (c) {\n                return c.category_type == '2' && c.category_id;\n            }).map(function (c) { return [String(c.title), String(c.category_id)]; })];\n        }).filter(function (g) { return g[1].length; });\n    } catch (e) {}\n    try {\n        JSON.parse(java.ajax(qmRankIndex(ch[2]))).data.rank_list.forEach(function (r) {\n            if (r.type == 'character_list' || r.show_type == '6') return;\n            data.r.push([String(r.title), String(r.type) + ((r.sub_titles || []).length > 1 ? '|month' : '')]);\n        });\n    } catch (e) {}\n    if (ch[2] == 1 || ch[2] == 2) {\n        data.r.push(['殿堂作品', 'sp:hall'], ['原创风云榜', 'sp:award'], ['宗师作家', 'sp:master']);\n    }\n    if (ch[2] == 2) {\n        try {\n            JSON.parse(java.ajax(qmStoryIndex())).data.rank_list.forEach(function (r) {\n                data.r.push(['短篇' + r.title, 'story:' + r.type]);\n            });\n        } catch (e) {}\n    }\n    if (data.g.length) cache[ch[2]] = data;\n}\nvar groups = data.g, ranks = data.r;\ncfg.cat = cache;\ndelete cfg.fast;\nsource.setVariable(JSON.stringify(cfg));\n\nvar open = cfg.open || {};\nvar over = cfg.over || '-99', words = cfg.words || '-99', sort = cfg.sort || '0';\n\nvar OVER = [['全部状态', '-99'], ['完结', '1'], ['连载', '0']];\nvar WORDS = [['全部字数', '-99'], ['50万以下', '1'], ['50-100万', '2'], ['100-300万', '3'], ['300万以上', '4']];\nvar SORT = [['按热度', '0'], ['按更新', '1'], ['按评分', '2'], ['按新书', '3']];\nfunction label(opts, v) { return (opts.filter(function (o) { return o[1] == v; })[0] || opts[0])[0]; }\n\nvar LAYOUT = {gap: 0.042, pad: 0.068, ch: 0.0368, shortMax: 3.3};\n\nfunction textWidth(t) {\n    var w = 0;\n    for (var i = 0; i < t.length; i++) {\n        var c = t.charCodeAt(i);\n        if (c == 32) w += 0.32;\n        else if (c < 128) w += 0.65;\n        else if (c == 0xB7) w += 0.5;\n        else if (c == 0x25CF) w += 0.9;\n        else w += 1;\n    }\n    return w;\n}\n\nvar s = [];\n\nfunction pack(items, cols) {\n    cols = cols || 4;\n    var g = LAYOUT.gap, cell = (1 - g * (cols - 1)) / cols;\n    var fit = (cell - LAYOUT.pad) / LAYOUT.ch;\n    var queue = items.map(function (it) {\n        return {it: it, span: Math.min(cols, Math.ceil(textWidth(it.title) / fit) || 1)};\n    });\n    while (queue.length) {\n        var row = [], left = cols;\n        while (queue.length && left > 0) {\n            var k = 0;\n            while (k < queue.length && queue[k].span > left) k++;\n            if (k == queue.length) break;\n            var x = queue.splice(k, 1)[0];\n            row.push(x); left -= x.span;\n        }\n        for (; left > 0; left--) row.push({it: {title: '　', url: ''}, span: 1});\n        row.forEach(function (x, i) {\n            var st = {layout_flexGrow: x.span, layout_flexBasisPercent: Math.round((x.span / (cols + 1) + (x.span - 1) * g) * 1e4) / 1e4};\n            if (i == 0) st.layout_wrapBefore = true;\n            x.it.style = st;\n            s.push(x.it);\n        });\n    }\n}\n\nfunction action(js) {\n    return \"(function(){var c={};try{c=JSON.parse(String(source.getVariable()||'{}'))||{};}catch(e){}\"\n        + js + \"c.fast=1;source.setVariable(JSON.stringify(c));java.refreshExplore();})()\";\n}\nfunction button(title, js) {\n    return {title: title, type: 'button', action: action(js)};\n}\nfunction bar(title, js) {\n    var b = button(title, js);\n    b.style = {layout_flexGrow: 1, layout_flexBasisPercent: 1, layout_wrapBefore: true};\n    s.push(b);\n}\nfunction optionRow(key, opts, cur) {\n    pack(opts.map(function (o) {\n        return button((o[1] == cur ? '● ' : '') + o[0], 'c[' + JSON.stringify(key) + ']=' + JSON.stringify(o[1]) + ';');\n    }), 3);\n}\n\npack(CH.map(function (c) {\n    return button((c[0] == ch[0] ? '● ' : '') + c[1] + ' ' + c[0], 'c.ch=' + JSON.stringify(c[0]) + ';');\n}), 3);\n\nvar filterTitle = '⚙ 筛选：' + label(OVER, over) + ' · ' + label(WORDS, words) + ' · ' + label(SORT, sort);\nbar(filterTitle + (cfg.filt ? '　▾' : '　▸'), 'c.filt=!c.filt;');\nif (cfg.filt) {\n    optionRow('over', OVER, over);\n    optionRow('words', WORDS, words);\n    optionRow('sort', SORT, sort);\n}\n\nif (!groups.length) s.push({title: '⚠ 分类加载失败', url: '', style: {layout_flexGrow: 1, layout_flexBasisPercent: 1, layout_wrapBefore: true}});\n\nfunction split(items) {\n    var short = [], long = [];\n    items.forEach(function (it) { (textWidth(it.title) > LAYOUT.shortMax ? long : short).push(it); });\n    pack(short, 4);\n    pack(long, 3);\n}\n\nif (ranks.length) {\n    var rkey = ch[0] + '|排行';\n    var rOpen = !!open[rkey];\n    bar((rOpen ? '▾ ' : '▸ ') + '排行（' + ranks.length + '）',\n        'var o=c.open||{};o[' + JSON.stringify(rkey) + ']=' + (rOpen ? 0 : 1) + ';c.open=o;');\n    if (rOpen) split(ranks.map(function (r) {\n        var t = r[1].split(':'), url;\n        if (t[0] == 'sp') url = \"{{qmSpecial('\" + t[1] + \"',\" + ch[2] + ',page)}}';\n        else if (t[0] == 'story') url = \"{{qmStoryRank('\" + t[1] + \"',page)}}\";\n        else url = '{{qmRank(' + ch[2] + \",'\" + r[1].split('|')[0] + \"',page,'\" + (r[1].split('|')[1] || '') + \"')}}\";\n        return {title: r[0], url: url};\n    }));\n}\n\ngroups.forEach(function (g, gi) {\n    var key = ch[0] + '|' + g[0];\n    var isOpen = key in open ? !!open[key] : gi == 0;\n    bar((isOpen ? '▾ ' : '▸ ') + g[0] + '（' + g[1].length + '）',\n        'var o=c.open||{};o[' + JSON.stringify(key) + ']=' + (isOpen ? 0 : 1) + ';c.open=o;');\n    if (!isOpen) return;\n    split(g[1].map(function (kv) {\n        return {title: kv[0], url: '{{qmTag(' + ch[2] + ',' + kv[1] + ',page,' + over + ',' + words + ',' + sort + ')}}'};\n    }));\n});\n\nJSON.stringify(s);\n", "jsLib": "var QM_KEY = 'd3dGiJc651gSQ8w1';\nvar QM_AES = '242ccb8230d709e1';\nvar QM_BC = 'https://api-bc.wtzw.com';\nvar QM_KS = 'https://api-ks.wtzw.com';\n\nfunction qmMd5(s) {\n    var b = Packages.java.security.MessageDigest.getInstance('MD5')\n        .digest(new Packages.java.lang.String(s).getBytes('UTF-8'));\n    var h = '';\n    for (var i = 0; i < b.length; i++) {\n        var x = (b[i] & 0xff).toString(16);\n        h += (x.length < 2 ? '0' : '') + x;\n    }\n    return h;\n}\n\nfunction qmSign(o) {\n    return qmMd5(Object.keys(o).sort().map(function (k) { return k + '=' + o[k]; }).join('') + QM_KEY);\n}\n\nvar QM_HEADERS = (function () {\n    var h = {'app-version': '80400', 'platform': 'android', 'reg': '0', 'AUTHORIZATION': '',\n             'application-id': 'com.****.reader', 'net-env': '1', 'channel': 'unknown', 'qm-params': ''};\n    h.sign = qmSign(h);\n    return JSON.stringify({headers: h});\n})();\n\nfunction qmUrl(base, path, params) {\n    params.sign = qmSign(params);\n    var q = Object.keys(params).map(function (k) {\n        return k + '=' + encodeURIComponent(params[k]);\n    }).join('&');\n    return base + path + '?' + q + ',' + QM_HEADERS;\n}\n\nfunction qmSearch(key, page) {\n    return qmUrl(QM_BC, '/search/v1/words', {gender: '3', imei_ip: '2937357107', page: page, wd: key});\n}\nfunction qmDetail(id) {\n    return qmUrl(QM_BC, '/api/v4/book/detail', {id: id, imei_ip: '2937357107', teeny_mode: 0});\n}\nfunction qmToc(id) {\n    return qmUrl(QM_KS, '/api/v1/chapter/chapter-list', {id: id});\n}\nfunction qmTag(gender, tid, page, over, words, sort) {\n    var p = {gender: gender, need_filters: 1, page: page, tag_id: tid,\n        over: over == null ? -99 : over, words: words == null ? -99 : words, sort: sort == null ? 0 : sort};\n    if (gender == 1 || gender == 2) p.book_preference = gender;\n    return qmUrl(QM_BC, '/api/v4/tag/index', p);\n}\n\nfunction qmIndex(tab) {\n    return qmUrl(QM_BC, '/api/v5/category/index', {gender: '2', tab_type: tab, read_preference: '0', book_privacy: '1', category_new_hot: '0'});\n}\n\nfunction qmForm(base, path, params) {\n    params.sign = qmSign(params);\n    var body = Object.keys(params).map(function (k) {\n        return k + '=' + encodeURIComponent(params[k]);\n    }).join('&');\n    var h = JSON.parse(QM_HEADERS).headers;\n    h['Content-Type'] = 'application/x-www-form-urlencoded';\n    return base + path + ',' + JSON.stringify({method: 'POST', body: body, headers: h});\n}\n\nfunction qmRankIndex(tab) {\n    return qmUrl(QM_BC, '/api/v1/leader-board', {rank_type: '', category_id: 0, category_type: 0, tab_type: tab, imei_ip: '2937357107', book_privacy: 1, read_preference: 0});\n}\n\nfunction qmStoryIndex() {\n    return qmUrl(QM_BC, '/api/v1/story/leader-board', {rank_type: '', category_id: 0, category_type: 0, page_no: 1, book_privacy: 1});\n}\n\nfunction qmRank(tab, type, page, period) {\n    var p = {rank_type: type, category_id: 0, category_type: 0, tab_type: tab, imei_ip: '2937357107', book_privacy: 1, read_preference: 0, page_no: page};\n    if (period == 'month') p.list_type = 'month';\n    return qmUrl(QM_BC, '/api/v1/leader-board', p);\n}\n\nfunction qmStoryRank(type, page) {\n    return qmUrl(QM_BC, '/api/v1/story/leader-board', {rank_type: type, category_id: 0, category_type: 0, page_no: page, book_privacy: 1});\n}\n\nfunction qmSpecial(kind, gender, page) {\n    if (kind == 'award') return qmUrl(QM_BC, '/api/v1/h5/book-original-award/list', {gender: gender, page: page});\n    if (kind == 'hall') return qmUrl(QM_BC, '/api/v1/h5/hall-of-fame/list', {gender: gender, page_no: page});\n    return qmUrl(QM_BC, '/api/v1/h5/original-author-master/list', {page_no: page});\n}\n\nfunction qmParam(url, k) {\n    var m = String(url).match(new RegExp('[?&]' + k + '=([^&,]*)'));\n    return m ? decodeURIComponent(m[1]) : '';\n}\n\nfunction qmItem(o) {\n    var tags = o.ptags;\n    if (!tags && o.book_title) tags = (o.type == 1 ? '宗师作家' : '大师作家') + ' · ' + o.year;\n    if (!tags) tags = [o.sub_title, o.heat_number].filter(function (v) { return v; }).join(' · ');\n    return {\n        id: String(o.id || o.book_id || ''),\n        title: String(o.title || o.book_title || ''),\n        author: String(o.author || o.author_name || ''),\n        image_link: String(o.image_link || o.img || ''),\n        intro: String(o.intro || o.rec_desc || ''),\n        ptags: String(tags || ''),\n        words_num: String(o.words_num || '')\n    };\n}\n\nfunction qmFill(items, java) {\n    var need = items.filter(function (o) { return o.id && (!o.author || !o.intro || !o.ptags); });\n    for (var i = 0; i < need.length; i += 10) {\n        var batch = need.slice(i, i + 10);\n        var res = [];\n        try { res = java.ajaxAll(batch.map(function (o) { return qmDetail(o.id); })); } catch (e) {}\n        batch.forEach(function (o, j) {\n            try {\n                var b = JSON.parse(String(res[j].body())).data.book;\n                if (!o.author) o.author = String(b.author || '');\n                if (!o.intro) o.intro = String(b.intro || '');\n                if (!o.words_num) o.words_num = String(b.words_num || '');\n                if (!o.ptags) o.ptags = String(b.category_over_words || '');\n            } catch (e) {}\n        });\n    }\n    return items;\n}\n\nfunction qmList(result, url, java) {\n    url = String(url);\n    var page = parseInt(qmParam(url, 'page') || qmParam(url, 'page_no')) || 1;\n    var d = {};\n    try { d = JSON.parse(result).data || {}; } catch (e) {}\n    var list = d.books || [];\n    if (url.indexOf('/tag/index') >= 0 && !list.length) {\n        var p = {\n            category_id: qmParam(url, 'tag_id'), category_type: '2', gender: qmParam(url, 'gender'),\n            need_filters: '1', page: String(page), book_privacy: '1', from: '4', read_preference: '0',\n            over: qmParam(url, 'over') || '-99', words: qmParam(url, 'words') || '-99',\n            sort: {'0': '1', '1': '3', '2': '2', '3': '4'}[qmParam(url, 'sort')] || '1'\n        };\n        if (qmParam(url, 'book_preference')) p.book_preference = qmParam(url, 'book_preference');\n        try { list = (JSON.parse(java.ajax(qmForm(QM_BC, '/api/v5/category/get-list', p))).data || {}).books || []; } catch (e) {}\n    } else if (url.indexOf('/story/leader-board') >= 0) {\n        if (page > 1 && !d.refresh_page) list = [];\n    } else if (url.indexOf('original-author-master') >= 0) {\n        list = page > 1 ? [] : (d.list || []);\n    } else if (url.indexOf('hall-of-fame') >= 0 || url.indexOf('/leader-board') >= 0) {\n        if (page > 1) list = [];\n        else if (qmParam(url, 'list_type') == 'month') list = d.month_books || [];\n    }\n    return qmFill(list.map(qmItem), java).map(function (o) { return JSON.stringify(o); });\n}\n\nfunction qmContent(bid, cid, agent) {\n    var p = {id: bid, chapterId: cid};\n    if (agent) p.reader_agent = '1';\n    return qmUrl(QM_KS, '/api/v1/chapter/content', p);\n}\n\nfunction qmChapterUrl(cid, md5, agent) {\n    var s = cid + '/' + md5 + '/' + (agent == '1' ? '1' : '0');\n    var b64 = Packages.java.util.Base64.getEncoder()\n        .encodeToString(new Packages.java.lang.String(s).getBytes('UTF-8'));\n    return 'data:;base64,' + b64 + ',{\"type\":\"qm\"}';\n}\n\nfunction qmUnzipEpub(b) {\n    function u16(p) { return (b[p] & 0xff) | (b[p + 1] & 0xff) << 8; }\n    function u32(p) { return (u16(p) | u16(p + 2) << 16) >>> 0; }\n    var eocd = b.length - 22;\n    while (eocd >= 0 && u32(eocd) != 0x06054b50) eocd--;\n    if (eocd < 0) return '';\n    var p = u32(eocd + 16), count = u16(eocd + 10), html = '';\n    for (var i = 0; i < count; i++) {\n        var method = u16(p + 10), csize = u32(p + 20), usize = u32(p + 24);\n        var nlen = u16(p + 28), total = 46 + nlen + u16(p + 30) + u16(p + 32);\n        var name = String(new Packages.java.lang.String(b, p + 46, nlen, 'UTF-8'));\n        var lh = u32(p + 42);\n        p += total;\n        if (!/\\.x?html?$/i.test(name)) continue;\n        var start = lh + 30 + u16(lh + 26) + u16(lh + 28), text;\n        if (method == 0) {\n            text = new Packages.java.lang.String(b, start, csize, 'UTF-8');\n        } else {\n            var inf = new Packages.java.util.zip.Inflater(true);\n            inf.setInput(b, start, csize);\n            var out = Packages.java.util.Arrays.copyOf(b, usize);\n            inf.inflate(out);\n            inf.end();\n            text = new Packages.java.lang.String(out, 'UTF-8');\n        }\n        var m = String(text).match(/<body[^>]*>([\\s\\S]*)<\\/body>/i);\n        if (m) html += m[1];\n    }\n    return html.replace(/<h\\d[^>]*>[\\s\\S]*?<\\/h\\d>/gi, '')\n               .replace(/&amp;/g, '&').trim();\n}\n\nfunction qmDecode(content) {\n    var A = Packages.java.util.Arrays;\n    var raw = Packages.java.util.Base64.getDecoder().decode(String(content));\n    var key = new Packages.javax.crypto.spec.SecretKeySpec(new Packages.java.lang.String(QM_AES).getBytes('UTF-8'), 'AES');\n    var iv = new Packages.javax.crypto.spec.IvParameterSpec(A.copyOfRange(raw, 0, 16));\n    var c = Packages.javax.crypto.Cipher.getInstance('AES/CBC/PKCS5Padding');\n    c.init(2, key, iv);\n    var b = c.doFinal(A.copyOfRange(raw, 16, raw.length));\n    if (b.length > 3 && b[0] == 0x50 && b[1] == 0x4B) return qmUnzipEpub(b);\n    return String(new Packages.java.lang.String(b, 'UTF-8'));\n}\n", "lastUpdateTime": "1790858563576", "respondTime": 180000, "ruleBookInfo": {"author": "author", "coverUrl": "image_link", "init": "data.book", "intro": "<js>\n(function () {\n    var g = function (r) {\n        try { return String(java.getString(r) || '').trim(); } catch (e) { return ''; }\n    };\n    var uniq = function (v, i, a) { return v && a.indexOf(v) == i; };\n\n    var words = parseInt(g('$.words_num')) || 0;\n    var ws = words >= 10000 ? (words / 10000).toFixed(1) + '万字' : (words ? words + '字' : '');\n    var chapters = g('$.chapters');\n    var state = [ws, g('$.is_over') == '1' ? '已完结' : '连载中', chapters ? '共' + chapters + '章' : ''].filter(uniq).join(' · ');\n\n    var ts = parseInt(g('$.update_time')) || 0;\n    var time = ts ? String(java.timeFormat(ts * 1000)).replace(/\\//g, '-') : '';\n\n    var cat = [g('$.category1_name'), g('$.category2_name')].filter(uniq).join(' · ');\n    var tags = g('$.book_tag_list[*].title').split(/\\s*\\n\\s*/).filter(uniq).join(' · ');\n\n    var score = g('$.attribute.score');\n    var scoreT = g('$.attribute.score_title');\n    var info = g('$.attribute.reading_info_list[*]').split(/\\s*\\n\\s*/);\n    var hot = [];\n    if (info[0]) hot.push(info[0] + (info[1] ? '（' + info[1].split('・').pop() + '）' : ''));\n    if (info[2]) hot.push(info[2] + '人在读');\n\n    var desc = g('$.intro')\n        .replace(/\\r/g, '')\n        .replace(/^[\\s\\u3000]+/, '')\n        .replace(/[ \\t\\u3000]*\\n[\\s\\u3000]*/g, '\\n')\n        .replace(/\\n/g, '\\n\\u3000\\u3000');\n\n    var L = [];\n    var add = function (icon, label, val) {\n        if (val) L.push('\\u3000\\u3000' + icon + ' ' + label + '：' + val);\n    };\n    add('📕', '书名', g('$.title'));\n    add('👤', '作者', g('$.author'));\n    add('🗂️', '分类', cat);\n    add('📊', '字数', state);\n    add('🔖', '标签', tags);\n    add('⭐', '评分', score ? score + (scoreT ? '（' + scoreT + '）' : '') : '');\n    add('🔥', '人气', hot.join(' · '));\n    add('🕐', '更新', time);\n    add('📖', '最新', g('$.latest_chapter_title'));\n    if (desc) {\n        L.push('\\u3000\\u3000\\u200b');\n        L.push('\\u3000\\u3000📜 简介：');\n        L.push('\\u3000\\u3000' + desc);\n    }\n    var src = g('$.source');\n    if (src) {\n        L.push('\\u3000\\u3000\\u200b');\n        L.push('\\u3000\\u3000📍 版权来源：' + src);\n    }\n    return L.join('\\n');\n})()\n</js>", "kind": "book_tag_list[*].title##\\s##，", "lastChapter": "{{$.latest_chapter_title}} • {{java.timeFormat(java.getString('$.update_time')*1000)}}\n<js>result.replace(/\\s\\d+:\\d+/,'').replace(/\\//g,'-')</js>", "name": "title@put:{\"bid\":\"$.id\"}", "tocUrl": "@js:qmToc('{{$.id}}')", "wordCount": "words_num"}, "ruleContent": {"content": "@js:\nvar seg = String(java.hexDecodeToString(result)).split('/');\nvar bid = String(java.get('bid'));\nvar story = seg[2] == '1';\nvar out;\ntry {\n    var res = JSON.parse(java.ajax(qmContent(bid, seg[0], story)));\n    if (!(res.data && res.data.content)) res = JSON.parse(java.ajax(qmContent(bid, seg[0], !story)));\n    out = (res.data && res.data.content) ? qmDecode(res.data.content)\n        : '七猫服务器未返回本章正文：' + (res.errors ? res.errors.details : '未知错误');\n} catch (e) {\n    out = '正文获取失败：' + e;\n}\nout;\n"}, "ruleExplore": {"author": "$.author", "bookList": "@js:qmList(result, baseUrl, java)", "bookUrl": "@js:qmDetail('{{$.id}}')", "coverUrl": "$.image_link", "intro": "$.intro", "kind": "$.ptags", "name": "$.title", "wordCount": "$.words_num"}, "ruleSearch": {"author": "original_author", "bookList": "data.books", "bookUrl": "@js:qmDetail('{{$.id}}')", "coverUrl": "image_link", "intro": "intro", "kind": "ptags", "name": "original_title", "wordCount": "words_num"}, "ruleToc": {"chapterList": "<js>java.put('qm_agent', String(JSON.parse(String(result)).data.reader_type) == '4' ? '1' : '0'); result</js>\n$.data.chapter_lists", "chapterName": "title", "chapterUrl": "@js:qmChapterUrl('{{$.id}}', '{{$.content_md5}}', java.get('qm_agent'))", "updateTime": "{{$.words}}字"}, "searchUrl": "@js:qmSearch(key, page)", "weight": 0},{"bookSourceComment": "作者：纳兰", "bookSourceName": "若雨中文", "bookSourceType": 0, "bookSourceUrl": "http://www.3yt.info", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\":\"网络小说\",\"url\":\"/Book/LN/1079/{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"玄幻魔法\",\"url\":\"/Book/LN/1094/{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"武侠仙侠\",\"url\":\"/Book/LN/1095/{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"都市言情\",\"url\":\"/Book/LN/1096/{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"历史军事\",\"url\":\"/Book/LN/1097/{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"网游竞技\",\"url\":\"/Book/LN/1098/{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"科幻灵异\",\"url\":\"/Book/LN/1099/{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},{\"title\":\"其它\",\"url\":\"/Book/LN/1100/{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}}]", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 12; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1790831370106", "respondTime": 577, "ruleBookInfo": {"author": "div.block_txt2 p.1@text##作者：", "coverUrl": "div.block_img2 img@src", "intro": "div.intro_info@text", "kind": "div.block_txt2 p.2 a@text", "lastChapter": "div.block_txt2 p.5 a@text", "name": "#bqgmb_h1@text"}, "ruleContent": {"content": "#nr1@html##<div id=\"content_tip\">[\\s\\S]*?</div>|最新网址：m\\.3yt\\.info|第\\d+章[^<]*\\(第\\d+/\\d+页\\)", "nextContentUrl": "text.下一页@href"}, "ruleExplore": {"author": ".block_txt p.0@text##作者：", "bookList": ".block", "bookUrl": ".block_img a@href", "coverUrl": ".block_img img@src", "intro": ".block_txt p.1@text", "name": ".block_txt h2@text"}, "ruleSearch": {"author": "td.4@text", "bookList": "table.table_01 tbody tr", "bookUrl": "@js:var href = result.select('td').get(1).select('a').attr('href'); href.replace('http://www.3yt.info/Book/', 'http://m.3yt.info/Book/').replace('/index.html', '/');", "kind": "td.0@text", "lastChapter": "td.2@text", "name": "td.1@text"}, "ruleToc": {"chapterList": "ul.chapter.1@li@a", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": "select[name=pageselect] option@value"}, "searchUrl": "/book/search.aspx?searchkey={{key}}&SeaButton=", "weight": 0},{"bookSourceGroup": "全本", "bookSourceName": "全本小说网", "bookSourceType": 0, "bookSourceUrl": "https://quanben.io", "customButton": false, "customOrder": 2, "enabled": true, "enabledCookieJar": false, "enabledExplore": false, "eventListener": false, "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Mobile Safari/537.36\"}", "lastUpdateTime": "1790828089961", "respondTime": 180000, "ruleBookInfo": {"author": "span[itemprop=author]@text", "coverUrl": "div.list2 img@src", "intro": "div.description@text", "kind": "span[itemprop=category]@text", "name": "div.list2 h3@text", "tocUrl": "<js>\nvar m = baseUrl.match(/\\/n\\/([^\\/]+)\\//);\nif (m) { result = 'https://www.quanben.io/amp/n/' + m[1] + '/list.html'; } else { result = baseUrl; }\n</js>"}, "ruleContent": {"content": ".articlebody@html"}, "ruleExplore": [], "ruleSearch": {"author": "span[itemprop=author]@text", "bookList": "div.list2", "bookUrl": "h3 a@href", "intro": "p[itemprop=description]@text", "name": "h3 a@text"}, "ruleToc": {"chapterList": "ul.list3 > li", "chapterName": "a@text", "chapterUrl": "a@href"}, "searchUrl": "/index.php?c=book&a=search&keywords={{key}},{\"charset\":\"utf-8\"}", "weight": 0},{"bookSourceGroup": "全本", "bookSourceName": "全本小说网", "bookSourceType": 0, "bookSourceUrl": "https://quanben.io", "customButton": false, "customOrder": 2, "enabled": true, "enabledCookieJar": false, "enabledExplore": false, "eventListener": false, "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Mobile Safari/537.36\"}", "lastUpdateTime": "1790827961358", "respondTime": 180000, "ruleBookInfo": {"author": "span[itemprop=author]@text", "coverUrl": "div.list2 img@src", "intro": "div.description@text", "kind": "span[itemprop=category]@text", "name": "div.list2 h3@text", "tocUrl": "<js>\nvar m = baseUrl.match(/\\/n\\/([^\\/]+)\\//);\nif (m) { result = 'https://www.quanben.io/amp/n/' + m[1] + '/list.html'; } else { result = baseUrl; }\n</js>"}, "ruleContent": {"content": ".articlebody@html"}, "ruleExplore": [], "ruleSearch": {"author": "span[itemprop=author]@text", "bookList": "div.list2", "bookUrl": "h3 a@href", "intro": "p[itemprop=description]@text", "name": "h3 a@text"}, "ruleToc": {"chapterList": "ul.list3 > li", "chapterName": "a@text", "chapterUrl": "a@href"}, "searchUrl": "/index.php?c=book&a=search&keywords={{key}},{\"charset\":\"utf-8\"}", "weight": 0},{"bookSourceComment": "书源走番茄api，四神签名秒了，别逆向倒卖我求你了，四神你自己上网搜\n作者yfishyon tg@mtydfnl", "bookSourceGroup": "官方,小说,番茄,番茄小说,api", "bookSourceName": "番茄小说(官方api)", "bookSourceType": 0, "bookSourceUrl": "https://fanqienovel.com/", "bookUrlPattern": "https?://fanqienovel\\.com/page/\\d+.*", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": false, "eventListener": false, "jsLib": "function r(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a=']:0AP<5yh2sNaezDV!G9%8{lJ;F`QYg1|jSZo.xLTUm@>36d=_ip(qH)KM#&Ivc+$,Xr7CEn/f*~^4W[utRb\"?BOk}w'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}function n(i,t){var u=n.C||(n.C={}),f=i+\":\"+t;return void 0!==u[f]?u[f]:u[f]=r(e.slice(i,i+t))}\nvar e='KEw|e1`NFR>Q)(eBvu%x)AAN:]R(!)fJBfH$fdc$:U/b4CoVL]6cd<e(y9<5QOa#IpH>a(C,{m/ehl!b<3(j}%4PB#]XaVRjH6S6>W=`7b5}Ab|J}wd2:P8sFi]PFH1p4cg!+uE:{A7pd<7qPNx,lV2M4:tBV$&V`sx9YAszLNwPm/T8bH$92cL;7Y!PYYI9:J91yk8h}q/dQ11zGX~u`%3rREl;HWtT(VG,f:g=_dv5jBLV{M`jaX5Qq{w}\"$O9n#k5aLs:,q@;G)oJr9n#k5a{C`,+Ld[D{63/9kWMp]P%4;e08x}VMp|&4J0#m})]GD{);?cgF%.,#(1u54h+l*4]tDlkV_LW:zA+RR+I>F1~~3/[&j6+Hd21.Z0jxM)REJCi=M{{2mL:~Mb!{{Y2q9fpDN/1(d0iZ8s22_/HY/{vm4?.7k%UhX{{`yfR7WM;:AIuovN)6]#{&459W{NM<S9JHF+I)UDg$v_>H5D,Y]u6V)Na?Wd2}<lb%m~Q]v#p3x2+~}lvW?>+X3g5$*b,}_P/ilD%4WtF0JQxVr,Qnt[dKgkv|:(1lJ:9\"#mQj)I!vlOTc[lTH49aaGffl2DEiqG9Z3K/(>uj)ktU47vnHyVJFI`l7RG{k7yB/d1ItleQS?YJMz\"rJ[!\"l{cb4dGmJ?pyi04Wxge%kJi7<_RY,vKQO?PlGk|MqjV(gRKNRa(D+#{?qNVfm:sg5pXy{%XgT\"2S}7G_sSMY%N%%f;a_TFE!U/&gD{13u*J|8:aY#C@dMoHT4O@DC~TJ,?Q*4}rQ?2wN^A$6kBe%R\"Evr%g:hs&_dBk}6K;w)]Fg$!Wr0{oDqQV[5:Xkjw$/xe7uOQ<!Mx>Qan{+m{nSsKCq\"Qnia>dSt1k<35M]O##szUAkx)%Bz0{!TdMpaV*uC;,wp}$96.%:C^<eq{_H>!bhy{Ka[HR^c,/ut9E@%;smx),!VB7CmI2EVesZi:yj~%s(^Pf3{]o`b,[%:)|KP\")skV[[uP\"%@67XxaM|3YK_gpgW/ikY}c^Hxeg$5hIPTvz,h*SSCdBELg58ABK{/d<yj!?wn:^,l}>TR|;V9o~~.1{7|&LWUwg4cnPtywi}s42&IV]q#}@@$;CDBK>/G|DXj}MT(Y7ym0{CJ&NFrwh?#,:B{7K[\":i[iN6KCA>ssRN6{XEG)B}~;r`ig1l1k]obovTJr}SdUQM#HedO9%KLD&TxxvowclY_:B<Eo0Ipj,rQD7d;aG0tAus$bu<p026yOj=XtL<p(+KYs7;+~tvm:B;Ef0m<2.Spc]~<vN2\"+(j&?>Y<<pBb|M8\"[Bv_;99G\"[<KWfi:d)k@(g8=C7C}kLb~C4ITOiZO`^ndQ8w>s(`(4r;%R$qq?[jWK^p^+0hE4v_KuuNT@:_lT8g#ooy@o2=^Q)VJ,r_~7$U?g~$KgI:_lT8g#ooy#JbiSviZa3g(23Ju[]bQ@bqm~URu&qO`T_d2YX2r_dbVqM99rXIc23mW=Ma:RW3XMO2|ia4(rk;RQ}?)aEm3c#Mt,cQ2!,Y4suPUuYK#~++z,E)mg#?t_B:*MB1mNmE2H1N5.LpC?s>2e(*MQDQy8{V}g33?:M)|I!VXQeu2$qUxy(m~{\"\"^/X_0y(|tPV4cc#V\"r\"q78~RNI+r<`LJdT&~)M,E&F;b7<JM1?&V\"SgDFzEv7:Y2}7&(>S}ril3e:qlr#(~CQ=`|!0;=h9C}r.yc+L,.m2zHSlOl`!~1R[rlO,}M/KjA`dxUU5lAnrxd0opi)\"MQdVn)iUQIesF64FgK/oMgUx~$.h4{5B$t:BH3bdW!OS7s=9p6:B8!$dpZJnVVLttS`I_`!XJVY9Wq;OU6<!!md6EZieG624FHECy^cW*AbVSUnh`_.$5!H|=CJ5Gon4P)E8:>qfrdD:!dH_/HS0G92**G0tSaD{1L.8Y_H[E%oa_?grZYKt(sD!&X*]aq{&h8!F[d\"cNnETCRY%&zn/NpoJ3|Sfe]RfsWqYBfpWe5u7r)e$!,|O^zk~,+mb.##o\".$eq)8hU=)8hseq|l1US%]V9{Xhw_K.bQu+NoTcZ,0@As+A1$8]HztW{*b&s0T)Vjz&znIs}s\"3V>(;j3bOSE_*~vp\"y1<a<q.3F5Dlr|4A}:2<~3ElMRal~by[p;yrUYC\"}LB_qSt!~htoUBF@%4>7i0(;S,Qsq$t?w{|b(\"F[c+.b(SBKM~AB)PQXd^r#@yw;1I})r>[?BO1vF0JM!o32Y_`Qk}vq6:AuI)g+Tm;Z/oYE7C[S,FV($N>~w*1vh&nP5/^ed1fzr@yo5fR,M%YPypR/J:o3P8S,oV&cWj/c%$gQj~II/@7{_U~]nzBU3.mOe+C5O.0g@Wnkr|enN+PC{;.FrJJ22YEjq2JAnmV/II/@7e$Bk1E(;`/Vx|WjkTx?8N?z{)o)ypR/]:P*oxBoKI*jVVB$dh(#A5cd$`?=,I+:G[g/I,potkOr?8djA?(c\"O0&N<GXzrKc\"n`i(S,o{/TJrBJA55u%od+OJ]p69By\"s1!cB~0.`nG*_vc\"5fv46|NO\"}.{5B#obbk.{ci|+qAp&/$0#tn;}Xl,luMCPACOJZL_Tg1v\"3Z5xTdZ\";6A|[t]e=O=VSuSQ4@u]^$1TTS[^qImu1#6~fbr`Un:?ONyC1{IbrQAN}?OUN##&k}>MF27M$]hWv~/$,z^j:+~v)k]cz^j:HF(9z@c\"F_^>,Z(&=,>[LCz50O%br}GH:/pr?Z9:=M[br&;eM*?1(<9dr662?FEC(TK!!pwC5G<2|_ao^5[qxfm0I!czT_`Z%0wqVTa9.qFc|jH9hntMX$Oc>OXe*oYv+Y3vD>M@WIn!?mH#|tih\"EeIwXMRhgndeecVR.:xx)n^q#4S0v#5P$21Wo0Eo`ibAr|<U]C4z;5y^1n+lEy<?T^0Ax?HgP5e=IJ]>ZhxMx1sr*J`,gYewcP5Q4i~X(Icg8qxSbz{r*:yMw)HbtDaKR49@D:`./^fy<Ry|wg+RwJ=x=vh*oo==<$GB=y}2Wqmwk3qG.4>J&VoC3mNKS@b}DGF{D1MQ>f4>JNlUGD{)U7eqN!LcUP9\"D/?)DDj*#03P*K=#s.)Azx;s,>pqck%T_AjqGlZ/:Iy1RhN@O`a{]tPP(41n]0EN}5P1KE:M0pTuet0as5,h67!t~!x=<;Jox@h2gn}Cac>=TJLL62B1$/@e%sx_zvYVrpy^1W!ty,k6\"nhLjD(41nRuaGT=TJ_U7p&||W`9p9H(:JAas7^n`ZJ7]5+(nxy.)ToY\"^@e%se^00lV\"L6_PJ%aKc6^Zx&Zjp(qME:M:5?Y#tSJL5t=xE}Zi+q(OziLr5Ni;v?M}(P%N00as5F4/I@eQ,cX|`T%G=6_A1e?`,[ra`T%~qx_A1]a4crX0vBT|@,HuTS5<s/r2eBVM3]AAJG0_GEt66C9z5t=Juq~GIuEYVVL^5Ni(I0G:H,;.JvZlDy^1nuc^co/d6:a1aJ2!J=a|H{^uJxGuKkAYZu(Byd_knODa78P\"1!:UcJ/1dqZ.Ai`5J%aKc6^Zx&Z<aA=5J(T@hM4X#.9Y,:/sx+p:55=[DQZdf:=~x<:$2W*veOVLc\"n]otfyzB(hDDb|bC%0].YIGD8s;WR(.9T(F_&Zl:l45W1RCi0[/0`YDDb|bCW(M!X#)rl@F~h5<F@MHUEah!+Q,_JvZYaHnFb@eQ,k6fudL.cT`]o2:<yh#sv|mvw3.gN2T^qSW*J+<4rFBVvH2gUuDqq9)o&;6&kI&[*nk<emm/o/PM+\"glvX74;6mh5x*%uDZj:ay%*/eIbmmo]rYo\"%%_:fKAGm@p*7U36vS3X/w^p>#OZSw%s9vznWh*5ItTZf94=|rKl5Blk+,#cZ6q(jMbi$|*TPMc#7&s[%*&3fW(.ZCrM6=K1QtpUp*TFmN9M6m({AJ[J#)B\"#bBc4Y7fp,hQW_Nd319Vopl%v[OdMTnyXq((]2}L.d/Z|}3@7K!x)[+36#8M4AG4^%+(u&X$LTLa*RjSL7h:Mg*1|*F^P9@SlK.xugpeb^F]i/Uw[}mtT;/u{wv;Q*g7Bo^w[s#tTs)_{h|h:j[g$bpG[3;0LVI\"&KLw[?#xT8~3@`D/%^<_IT2kTK)G@Cs[%/?[%v_am(1hw4[SX;Un>QAc_T0x3/,@7K#nZMhtY:nn8#}yv/Y@]Pp:`p^p>#OZSwRHHmHBj*;7(@<W_jg0!w[S0`TbB*SQ>;~Qhz1|*C7N3fW(.ZW8[+k6lw[S0`TbB*SQ>;~Qhz1|*_TP/Y4o=c:19VBa@6Hww[(F;=2>:{mvBQyaFp/0UjeLrhh.g,#3.W);;:{Rn{dTm<q=u*%v?\"q~p&0FmeqwRKd#O[}7eISpNV,PhS}UpMu[kWMmgrOnuB3)T)F}E,i$NF\"#?>rv8*w;qYPC6<0yaXV9//(Rkk.|h<yDDD5GYphg#0)3m^7qsX\"&d!X:[F<jmCKpsX\"MpV8L[w:jm^7qsX\"&dV8L[:wP9eYDu2d7Qg5FPh6d7VjlNsB`AeT,7QOIPwwtBf3BupH{D!WQueUHON#(FewyEGz<|eWhf3{FDAR,@{LXjWNQA:WS^3*dRZMN3<){EP9(f&`]u,6O)i[Wkm7zyJjRp,%]y8N;ESrV<wUtK3.4bAo)3R(C8D4i<D4Z\"OT|)8EYVK;66;N;E7PV^n}Jj>^66;N;E=9r0|OXe8Dr=Klhj<)yocJ(fe7O2t324>8l2qa(up>9~xyUZ^1}g~Zq,:8ye*tm[Ps]?*l$sl!Uu4twh<88\"#Zrwh]{n%&R+6|)\"*eL%b!^X.1A3{wWBHKju+eX{:9D?rt)k7P[^{H+nnG$Fz*UH<Qbt>9:L8x*:z6fmG{5J/bH#dRy,=Zp446<1@blC9*HO*fUVDuZkrpB!QR+*GuZ}&i[h~UVy+6S)*k|Q*f@^[v4?9:KAC}0j8T;B6R37:9*~e$xTOPKPMrU*)!nF,yUR?tR$.*?D#66;N;E7Pca%=66;N;EmOUfOO3/c?m>JM*Tgm[9Yq8HNuZ1TNwlW%b!^Xf~|`juZ:rJ{6TTW5;?\"O,6O)i[Wkwus=u|>/FK;e?1)7)L((fW:mK3;N0*>QHW7GslR4,6O)i[WkHnQcYu>tb]z,6O)i[WkA_(bJjY_99`66;N;E7PRfjcm/>>66;N;E32:^0^KjHZ=?L6;CC8Zr@^8=:n4$]yG*rm/((fzyXMpZ;^Z@N]vhEl|oIIgYt,woPR^WSq;\"g:X0px)y]y66;N;E7P}WXcUA6G(Kp]w0Mo5ZkrU)J25xWyfj9g!Fs)M{NrKWC.lR(CHGkiKa&J3>)z;32!^]=)jJ3UZ9wlW%b!^X/D0EdYD>4^tI0^!c@JCek{D!WLu)U_+EfOFpjXHAF@K2J^?yx$q(B.BTgM^4Q.r|.zb1rH\"qNr!9nV$X/D~xM{)8N.Mee:RO3/6=c\",XHKK9N\",uXUYQNchr21|(h>_|v7>m)EVdcCxPa.w0],jek;8pUz\"gauv1i3x~K.roN{11GXVqcqASJEb=`h}v>Z}KTx[PweA&61q>7/7gPk$U^~nXtY2r`hHW+$BKJI)Jt~PV{[GybeD>mR=hr9N|w_G@,#4_~r<950D]}yg[g/.wNO4XMh>_|>9[VoD*H/.wNO4XMvo+*$K[WiwvI)a?UM}=ga.w0],jeIRO1hA_m$,MV\"xkhT0h6N7xn<om:=h9N0ymTd;4;d7_mxvFP=%rU,;T[Rh7xn{.n%<SPz*1k{9.i#hr?=F0:4mX3R*wv7>mCs@klSmXkYZZE).9q?`h5(h6,|W>3AxujiU>Ncy`@NeexGT3TpuF^u=.DO3xR<8hAluX$LT_7w{)8N.MAanX.3a>+c;t;rW#}~DXX.P=%rXr%M.\"~Qm)~]VKN`h}&wB~K.rrM9WrGtwZESEfIXk~Puix^Ip&hI$Yu]c(1D)*k2SyeIRIp<66%As!t{yFALXKK`rU,i,_RQReD.%/.nxKEv&9E,*QkxPmXZy=!w0SpZM6Y,)lf$ZfFN0ymTd;4;d7_m*QV_&t*k8h4eIGQ@7K]g{.9N8`zrSbQ)f?xPJWNjG*uQK2EJeya7=c}Pa.w0],jeIRO1hA_m/I1~Nnh(>BqCI_k(m!<10<wimq^7C]@*<)&t[PDX:G@wu[J*paHl\"KLZ?#l5{.SNmvF&y64UY>[=DE\"xGM>]Q0KSM9M.D)*k2S21!R{R(z1AfIXkd,yc]XR|C>xAe~Qkk/@a:G^@oz96{)8NfSt0`0>whIsc`)RkG,pcO:HQ[NODZ&Rr=+a@[qnGOgx8~Rr=+a@K2^{UR~s##@Ak.m6\";>8O^cK4v;:W{[cMi6qJ1cLc~;rQVz1zt0mRm2stFH<4Vx&Cli4mAYM{F,#6VVp\"k.[f\")sLDRr=+H1aqk#f\"<M,lrrQV}pj&^G[\"lMYFYrI+~+9;$~z}C}vwpKs0d[bhcB:DLXpKs8l(P[]C/wZ|Tme2,S|H|$]:NJkSk&5+B+sR&}40MJY)FamM+znTw}cfeJJ[QbrZdQPRH*9$NfD^ocsiTO[,G[YH6XJ[{c?>LLq]yj4Q:\"%o<pQ|]jD[4MM{$;@Q45I0E5S\"}~RK??&g9cM+w4(7shOW0]yU%)Na:b]L1^n2|rG.Z:;A26jV;a:b]D<#>Dd[;?UE>5+~#z].Fu?{]M!Sut;?UE2^!k2%.H9}EjlvX_iy3(O{+@<[($WkBGL:?t>UDVVb$y.&!jO9Ot3a:b]L1^n2|qyg^h_:P74.f]/.M8s!tv?`qP7tItD.@p|d7d~l,;,Jb~x6F9|GCES?9,XmvsxBh`||j#gN!%#KbIVXpvsttFa4c8#yivZG|x1#>](3`@@@1Qbt4yh%Pdg<>=Mp|&4R(:+I^aF@$2|n\"Jy~x\"S{Dc)|n60Fdm[SmsKmgBlaO%>bAr|J#y4WDN){Dvs@vYDH1DtcgN,M(g<(uM_U%dFF:rG1ID^tteqx$p?[iMJ2`U,_|pp|j?=0_ZBD5IvF@Z|t)3es!m)UPT3|]U0jJ6$~iiO+TV0e%%e1#5&2BXqgWEG>AezmxlO)Um.`,h_DKC>>4(xq(zgyAJ]!Y23ozzQ&OEGDGvgE3FmefQ&[&Un51E3|O$&E1/i>>Q((+>l+S6@.`gD(q?CcBm,|=5<6?vgD;@Q42r~y@,=U^CTtxF^R/3xjhu,o<s$RGJv{Use,aE05!pGF[JeJREm?pIdh}tE}K@,ICv[<_rZ*O5i0r4vc]z;+cR:%@!$JC2~^S1W2eBgk,I,N,s+|}Q3X4`9Tic3Ir:D;sc@(tB(cKytvRK@,ICvBe7JM`}sY6p+sR|cd\"tn5vL&DK@,I_stl_uvb0K@,ICv[<z|AV6X3TZ1JCi*t~P%fpT.rS?@ltFM!$z\"bzar5B5[@5:QY=*26A%Kc}*xkB9tlP_?OF`5~qKYTq_pUJ3U.wU7ET8PneR[IFo#F>#ET8PmC=[AF/RM8~y|}QlP6e.|BF#RM8+Y^a}QlP;CYe@YB]<p+):pqP[b}BNLL;@Q42ryt:+)+m3;@Q42rPh{$iIx;@Q42r*J/s)LDx@zf\"vk&?A9|z*wuq9+(E_`VF@K2Qjhh!+?Ly0.|P|KA8(uda[}h;d]^tNF)5&wDsMLv+Cf|=/}S$o>0Cq,q8Xq16wh*MmI`M+nH3<zq/x^C!(IMCv,F%#WS)]K1yoYH@qU|h_+N^58F<A#=_f;QPZ+*YtM+i^aJXa,K$[PS1[v+8oY%.,x+8@PC|bZlhs?0f4?xMx1sr~y@,a>:VqT;:<CtDJcRAr|%^~UEVk6jVaCUc.@@{1.uS0^7K[K,A**XoD8H|SG@/WjuiHdSZvKFuNGupfHyIWD*HI*Yg,>]=;xL3v+xm1i`9,p7)=?Y~xMx1sr*J`,HK]PtDZS$~BQ](BoXInH30,MY%V@%geMP?Eum+V%bSK`e*$?V5Wv$8|.xnBt5B09wkM(30/aivKz{D!W{b@eQ,cX4PGqC=*XCGA(n)F}f\"NGAfp/dh3GvCvsGA,r@)VqfJa0;/ks2uoKd_Jk`#=/}}/X.+3.6ju?!<t7z/&p4>r(:pBSRhX=]A*1n&t3d27wSUHWzrZJbjKzn0udxMbyiyMR2TZdTxUflMR3xszqVVyK52sTQm5ygYjk0e8lOAwDHss06N2mrIGiUc6rOQIrZHNxU8bR4hBz0HKrItZo6hyM8kaMxv9w4boSLJMTUyA0vIZiR1InOteUJf5fhztphEa1q2ud7klI1vXsI8IwWl2pIrz57D9C98zeXsO6Y1apLNdfrUSKbyYRqjSfTeIfn2TsIbAhn6eCC5xNISUlcdJ2cc3Vjgx4'\n;function i(){var r,n=[function(){return globalThis},function(){return global},function(){return window},function(){return new Function(\"return this\")()}],e=[];try{r=Object,e.push(\"\".__proto__.constructor.name)}catch(r){}r:for(var i=0;i<n.length;i++)try{r=n[i]();for(var t=0;t<e.length;t++)if(\"undefined\"==typeof r[e[t]])continue r;return r}catch(r){}return r||this}var t=i()||{},u=t.TextDecoder,f=t.Uint8Array,o=t.Buffer,a=t.String||String,v=t.Array||Array,c=function(){var r=new v(128),n=a.fromCodePoint||a.fromCharCode,e=[];return function(i){var t,u,f=i.length;e.length=0;for(var o=0;o<f;)(u=i[o++])<=127?t=u:u<=223?t=(31&u)<<6|63&i[o++]:u<=239?t=(15&u)<<12|(63&i[o++])<<6|63&i[o++]:a.fromCodePoint?t=(7&u)<<18|(63&i[o++])<<12|(63&i[o++])<<6|63&i[o++]:(t=63,o+=3),e.push(r[t]||(r[t]=n(t)));return e.join(\"\")}}();function l(r){return\"undefined\"!=typeof u&&u?(new u).decode(new f(r)):\"undefined\"!=typeof o&&o?o.from(r).toString(\"utf-8\"):c(r)}var JB=Packages[n(107,5)][n(116,5)][n(123,13)],J64=new JB(n(141,25));function s(r){function n(r,i){var t=n.C||(n.C={}),u=r+\":\"+i;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='B0,QyC*kPrG[TJVD/=#?{`@AbScd:(UO&Fiq)>l\"NLa4e5!6hp+Y;_Mf]jm.X}^sW<$gu7n18E|w~R2%oxIvHZKtz93'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+i))}return r instanceof JB?r[n(168,4)](J64):new JB(String(r))[n(168,4)](J64)}function h(r){return new JB(r,16)[function r(n,i){var t=r.C||(r.C={}),u=n+\":\"+i;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='<QkSu3Vf2Fqmt8B|}?yZ>CviY~sWcdKO:DUMnp=;$HlwjEXT4^{b)7+a.Ig6/*1r!N#]zJ\"[,&R9Lo%hA(_P0G5`@xe'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(n,n+i))}(177,4)](J64)}function d(r,n){for(var i=\"\",t=7;t>=0;t--){function u(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='\"]GV|+P9Z?nb&i7dy(k;,<u#8N0w*oIq{va_p}l!CUmYF:zO^g6j3r@h5RT=/Dte.2f)H~BWK4x$Qc>sJ1XAES`L[M%'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}function f(r,n){var i=f.C||(f.C={}),t=r+\":\"+n;return void 0!==i[t]?i[t]:i[t]=u(e.slice(r,r+n))}i+=(\"0\"+O(r,n+t)[f(188,10)](16))[f(201,8)](-2)}return h(i)}function g(r,i,t){for(var u=0;u<8;u++){function f(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='vr\"HD!R@LNK)cA8m9}O_h/af4Pi6|x{Yo+^$MU3Fj5W<k,qZs`.uzGJXV;p0>S#Edb7eQl1*~IgBw(n:%tT?C=]y&2['.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}function o(r,n){var i=o.C||(o.C={}),t=r+\":\"+n;return void 0!==i[t]?i[t]:i[t]=f(e.slice(r,r+n))}i[t+u]=x(r[n(217,13)](8*u)[o(235,4)](s(255))[o(242,10)]())}}function p(r,n){function i(r,n){var t=i.C||(i.C={}),u=r+\":\"+n;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a=':dOz_=N73]GZ>teX`c,}|2Jn$#pmQs<4;gW\"/KiY{Dl*fVroIR^UCFkBu1q~x!S?&+%)y.9MvLT6h[5jbaPAH(w8E0@'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}return 0==(n=(n%64+64)%64)?r:r[i(255,11)](n).or(r[i(273,13)](64-n))[i(287,4)](J64)}function C(r,n){return p(r,-n)}var JEMPTY=new(Packages[n(107,5)][n(297,5)][n(307,8)])(\"\")[n(320,10)]();function w(r){function n(r,i){var t=n.C||(n.C={}),u=r+\":\"+i;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='p}14,7.<[ku%nXL~b:Z#WY2Jl@&V)_|G+I^6*fQBEwNjM$mKF\"tR;e3dSDP0y8O(?Us9aTo{=`/rCxgcqHAhz>]!i5v'.indexOf(n[o])\n;if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+i))}return Packages[n(336,5)][n(344,5)][n(355,8)][n(368,8)](JEMPTY,r)}function x(r){return r!=r?0:r>127?r-256:r}function O(r,n){var e=r[n];return e!=e||void 0===e?0:e<0?e+256:e}function S(r){for(var n=r[function r(n,i){var t=r.C||(r.C={}),u=n+\":\"+i;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='(`MX5\",vxk;dZoTR[#p3E1G)Lj=zD6<Q}|0m^{4n%q7SefHw+:lU~yYPgB_?N>8sI&uOc!V29h*/AJC]aiKWF$.rb@t'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(n,n+i))}(382,8)]/2,i=w(n),t=0;t<n;t++){function u(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='f)24d&Ku?aE/h6sbCjlq;.kc^BP]zt}~\"@|+xr*%I>7v3:YwNGXno8JTRgQDM[0W<$V9A,(H1U=O!_ySp{LF#5m`Zei'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}function f(r,n){var i=f.C||(f.C={}),t=r+\":\"+n;return void 0!==i[t]?i[t]:i[t]=u(e.slice(r,r+n))}i[t]=x(parseInt(r[f(396,8)](2*t,2),16))}return i}function y(r){function n(r,i){var t=n.C||(n.C={}),u=r+\":\"+i;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='ujint]O@UyRhlKzN\">cs/aQDI50PXvb,=_M6&.$Aw*2J?p4G[^eVrxkg{oY9`qFB8fm%~#ZS3L:|<1(}!d7H;ECW+T)'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+i))}for(var i=\"\",t=0;t<r[n(408,8)];t++){function u(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='^)yb*W9/6]O|Mnrhv@m!E~4BF(lGL;_%8dVoz?Tp\"SP2eH`a1k:gsR,7fZIAUcDK&[x.}3+uq#iQXjwtY{>J$CN=5<0'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}function f(r,n){var i=f.C||(f.C={}),t=r+\":\"+n;return void 0!==i[t]?i[t]:i[t]=u(e.slice(r,r+n))}i+=(\"0\"+O(r,t)[f(419,10)](16))[f(434,8)](-2)}return i}function M(r){function n(r,i){var t=n.C||(n.C={}),u=r+\":\"+i;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='ub<Ro%ECPph>G[kF4\"HTvi+(M)$~,Bg&Wt=Q`?Z]OSm16wYces@9}xdI25q{!0Da/JzX:nAL8j.;*N|3ly_7rU#VKf^'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+i))}return new(Packages[n(442,5)][n(451,5)][n(461,8)])(String(r))[n(472,10)](n(484,7))}function P(r){function n(r,i){var t=n.C||(n.C={}),u=r+\":\"+i;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='b.lW%7Ewf=JCKzGhp@XjmT#0}QLr5Y_M2q86|n!*,\"ZRS1$u{/UxPy&B;3c+4^g`aVktHDo<:])Ov~ANIeFd>[9si?('.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+i))}return String(new(Packages[n(496,5)][n(503,5)][n(511,8)])(r,n(524,7)))}function k(){var r,i=0;for(r=0;r<arguments[n(537,8)];r++){function t(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='E5K?i7p~|#_YC}A,)oH+Q1yrSTdVD;$:qx0J*>kR!X{l^j=2@8P\"3IcG6bONZ`mega<wMW](Uu9.fnt4s[/B&vLzhF%'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}function u(r,n){var i=u.C||(u.C={}),f=r+\":\"+n;return void 0!==i[f]?i[f]:i[f]=t(e.slice(r,r+n))}i+=arguments[r][u(549,8)]}var f=w(i),o=0;for(r=0;r<arguments[n(537,8)];r++){function a(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){\nvar a='mX4(Q;FV|%[?Sc0u6~prj=O>JIUR^$PLl2soHN/+Ad!K{,]8\"#`fE.Bn&x5w93eCGzbh@}qT7v_<M)kaZty1*DiWY:g'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}function v(r,n){var i=v.C||(v.C={}),t=r+\":\"+n;return void 0!==i[t]?i[t]:i[t]=a(e.slice(r,r+n))}Packages[v(561,5)][v(570,5)][v(578,8)][v(589,11)](arguments[r],0,f,o,arguments[r][v(605,8)]),o+=arguments[r][v(605,8)]}return f}function J(r){function n(r,i){var t=n.C||(n.C={}),u=r+\":\"+i;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='a?jI0AH*(y@rOS5!v2[=q>Ue7,zB|w6Xl8Ws:3QCgfh.TxZLP1{^b<RDuk~td;GV_oi\"+EJ]NY}K%c)9m#&`p$4/MFn'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+i))}return String(Packages[n(620,5)][n(627,5)][n(634,8)][n(649,13)]()[n(668,18)](r))}function N(r){function n(r,i){var t=n.C||(n.C={}),u=r+\":\"+i;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='isFqhHA]nDgxY:&%5c{vTX!f()B+PJWeVL43Q/mb6.pk`y[CE?R~20|=,awN}I7<z^Ur1$_\">u@#;ol8Gtdj*OS9ZMK'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+i))}return Packages[n(691,5)][n(700,5)][n(707,8)][n(720,13)]()[n(738,8)](String(r))}function m(r){function i(r,n){var t=i.C||(i.C={}),u=r+\":\"+n;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='tf67k`|G&>4KBTCQ<Oh{3b@pU?PY.E;ds(jWynex1]!H9Mr=L%RD/*,c$NaXS~wIZ_m}Fv^qJ+l:A2i0oVz)g5[\"8#u'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}var t=w(r);return(new(Packages[n(107,5)][n(751,10)][i(764,15)]))[i(781,11)](t),t}function R(r){function n(r,i){var t=n.C||(n.C={}),u=r+\":\"+i;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='#*\"$QzZ14MYcxJK:3e50V}h+B/nTiLgsk9GaFN{WDO|y,&8p)uqjf?Srt![l;@>(U`~X]P^IbmdR7w%E_C=6<.ov2AH'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+i))}return Packages[n(793,5)][n(806,10)][n(816,16)][n(836,14)](n(852,4))[n(861,8)](r)}function D(r,n,i){function t(r,n){var i=t.C||(t.C={}),u=r+\":\"+n;return void 0!==i[u]?i[u]:i[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='1LzawU/|HxOR*v:!Eu{2nJ<ZmVA3_)q~dI`fh4@7s,DY86Be$;XM\"jNQlr0gS]PK(b5TyWG%+c^[Cp?=k#}>t.oF&i9'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}var u=Packages[t(871,7)][t(881,8)][t(889,8)][t(898,14)](t(918,25));return u[t(949,5)](1,new(Packages[t(871,7)][t(881,8)][t(956,5)][t(968,16)])(n,t(987,4)),new(Packages[t(871,7)][t(881,8)][t(956,5)][t(991,19)])(i)),u[t(1012,9)](r)}function K(r,n,i){function t(r,n){var i=t.C||(t.C={}),u=r+\":\"+n;return void 0!==i[u]?i[u]:i[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='e@d}95][4B*2Tf7nqRw<_(LOD>8rgKU0^o#FtvXGCVu`=E/W$;),6mpba!\"1HhNiJPz:yk.{+I&s|lZMASQcx3?%jY~'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}var u=Packages[t(1023,7)][t(1038,8)][t(1050,8)][t(1063,14)](t(1082,25));return u[t(1113,5)](2,new(Packages[t(1023,7)][t(1038,8)][t(1118,5)][t(1129,16)])(n,t(1148,4)),new(Packages[t(1023,7)][t(1038,8)][t(1118,5)][t(1156,19)])(i)),u[t(1177,9)](r)}function T(r,n,i){function t(r,n){\nvar i=t.C||(t.C={}),u=r+\":\"+n;return void 0!==i[u]?i[u]:i[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='HPodulkbX:T/aVp,wGjRsh6zm;Y(=BO~Q.>+`IKfvA@g)WEy$tiD[]%3qFeCM&\"8N^Lrc}J<!12907|5_xZU#4?n*S{'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}var u=Packages[t(1194,7)][t(1207,8)][t(1217,8)][t(1228,14)](t(1246,21));return u[t(1269,5)](2,new(Packages[t(1194,7)][t(1207,8)][t(1274,5)][t(1282,16)])(n,t(1300,4)),new(Packages[t(1194,7)][t(1207,8)][t(1274,5)][t(1306,19)])(i)),u[t(1328,9)](r)}function I(r){function n(r,i){var t=n.C||(n.C={}),u=r+\":\"+i;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='d][4=:$3m`A\"HoFbf*NuWJ1UO~s^X@arTKY0{E?vRQB9Pg/M5SiqneV,pZhj>+y!.x)lD#}_|%t7k2zG(cwI;<&6LC8'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+i))}for(var i,t=new(Packages[n(1340,5)][n(1345,5)][n(1355,4)][n(1362,19)])(new(Packages[n(1340,5)].io[n(1389,25)])(r)),u=new(Packages[n(1340,5)].io[n(1422,26)]),f=w(4096);(i=t[n(1452,5)](f))>0;)u[n(1460,7)](f,0,i);return t[n(1467,7)](),u[n(1478,14)]()}var SM3_IV=[1937774191,1226093241,388252375,3666478592,2842636476,372324522,3817729613,2969243214];function q(r,n){return(r<<n|r>>>32-n)>>>0}function Q(r){function n(r,i){var t=n.C||(n.C={}),u=r+\":\"+i;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='Yy4A%k8j.J)\"S?KMd~:@O#*XxhaUQCgb{mcsDN/Ie[f!7twz=nZ3E9^1HRq&}o`0+pBV_;Fu<r(vP2|G,i6Wl$L>T5]'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+i))}for(var i=[],t=0;t<r[n(1495,8)];t++)i[n(1508,5)](O(r,t));for(i[n(1508,5)](128);i[n(1495,8)]%64!=56;){function u(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='Nku!}bU%l]#0tcjIQ2y):;vd8XM/mVL&,h^~gDGn(iE{A\"<64o|r>@Yxw+q73B*`?5R[=Te$F_aCKfZOJ9sp1P.zWHS'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}function f(r,n){var i=f.C||(f.C={}),t=r+\":\"+n;return void 0!==i[t]?i[t]:i[t]=u(e.slice(r,r+n))}i[f(1514,5)](0)}var o=Math[n(1520,7)](8*r[n(1495,8)]/4294967296),a=8*r[n(1495,8)]>>>0;i[n(1508,5)](o>>>24&255,o>>>16&255,o>>>8&255,255&o),i[n(1508,5)](a>>>24&255,a>>>16&255,a>>>8&255,255&a);for(var v=SM3_IV[n(1527,7)](0),c=0;c<i[n(1495,8)];c+=64){for(var s=[],h=0;h<16;h++)s[h]=(i[c+4*h]<<24|i[c+4*h+1]<<16|i[c+4*h+2]<<8|i[c+4*h+3])>>>0;for(var d=16;d<68;d++){var g=(s[d-16]^s[d-9]^q(s[d-3],15))>>>0;s[d]=(g^q(g,15)^q(g,23)^q(s[d-13],7)^s[d-6])>>>0}for(var p=v[0],C=v[1],S=v[2],y=v[3],M=v[4],P=v[5],k=v[6],J=v[7],N=0;N<64;N++){var m,R,D;N<16?(m=2043430169,R=(p^C^S)>>>0,D=(M^P^k)>>>0):(m=2055708042,R=(p&C|p&S|C&S)>>>0,D=(M&P|~M&k)>>>0);var K=q(q(p,12)+M+q(m,N%32)>>>0,7),T=R+y+(K^q(p,12))+(s[N]^s[N+4])>>>0,I=D+J+K+s[N]>>>0,Q=T,E=p,V=q(C,9),b=S,U=(I^q(I,9)^q(I,17))>>>0,B=M,A=q(P,19),X=k;p=Q,C=E,S=V,y=b,M=U,P=B,k=A,J=X}v[0]=(v[0]^p)>>>0,v[1]=(v[1]^C)>>>0,v[2]=(v[2]^S)>>>0,v[3]=(v[3]^y)>>>0,v[4]=(v[4]^M)>>>0,v[5]=(v[5]^P)>>>0,v[6]=(v[6]^k)>>>0,v[7]=(v[7]^J)>>>0}for(var _=w(32),F=0;F<8;F++)_[4*F]=x(v[F]>>>24&255),_[4*F+1]=x(v[F]>>>16&255),_[4*F+2]=x(v[F]>>>8&255),_[4*F+3]=x(255&v[F]);return _}function E(r,n,i){function t(r,n){var i=t.C||(t.C={}),u=r+\":\"+n;return void 0!==i[u]?i[u]:i[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='W^:(BYnT,CQt&Xu}[E2Nr5_S<yeJ!bo{vZ1U6#]8>)mwR=?K7%Dh|\"M`fdFkV0*OHp;GA/~.L+P$gils43qj@cIxa9z'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)\n}(e.slice(r,r+n))}var u=y(R(k(i,M(r))));function f(r){for(var n=new JB(\"0\"),i=7;i>=0;i--){function t(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='_s^Si>elKDPck!j/T+BOrbIE.)7n@tWM9{[qh$*1aF8VGCXNJxA&2Hm0R4:6}]p(~%Y3|w,=v?<yL`gZQ#fduo5\"U;z'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}function u(r,n){var i=u.C||(u.C={}),f=r+\":\"+n;return void 0!==i[f]?i[f]:i[f]=t(e.slice(r,r+n))}n=n[u(1540,11)](8).or(new JB(String(r[u(1557,13)](i))))}return n[function r(n,i){var t=r.C||(r.C={}),u=n+\":\"+i;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='=rN`,f{zD2R.H7(cYU;FdG/4:uL5lKnvC|6o?]_mM*~}@iaAbJ!qgkp91P^Z>$Ot&+x)%w<s#SjQTX3\"eIV0[By8WEh'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(n,n+i))}(1574,4)](J64)}for(var o=[],a=f(u[t(1581,8)](0,8)),v=f(u[t(1581,8)](8,8)),c=[f(u[t(1581,8)](16,8)),f(u[t(1581,8)](24,8))],h=0;h<34;h++){function O(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a=',kw2f\"]B(zrax+}Dh!=%Q@nT:&<qNUC5KY[p$74P0_6V9;c#EuSmWl~XF{i`IHsR^.oO?*dZGb>yve)|jMJt1L3/8Ag'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}function S(r,n){var i=S.C||(S.C={}),t=r+\":\"+n;return void 0!==i[t]?i[t]:i[t]=O(e.slice(r,r+n))}o[t(1593,5)](a);var P=C(v,8)[S(1602,4)](a)[S(1614,4)](J64)[S(1625,4)](s(h));c[S(1635,5)](P),a=P[S(1625,4)](p(a,3)),v=c[S(1643,7)]()}for(var N=M(n+t(1654,20)),m=16-N[t(1680,8)]%16,D=k(N,function(){for(var r=w(m),n=0;n<m;n++)r[n]=x(m);return r}()),K=w(D[t(1680,8)]),T=0;T<D[t(1680,8)];T+=16){function I(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='T6!8YclBt5+VjmU~eFs{Cu@(;M|R2)LfIpa}kH_dPi\"yWXG.N,%A9bO3[]/$7S<gE*0:hZo#KrDq^Q=&z`1Jxvw>?n4'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}function q(r,n){var i=q.C||(q.C={}),t=r+\":\"+n;return void 0!==i[t]?i[t]:i[t]=I(e.slice(r,r+n))}for(var Q=d(D,T),E=d(D,T+8),V=0;V<o[q(1692,8)];V++){function b(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='bXqimA^3O/`kScLC(.T1po:7D9hEVHPgvJ,&?n*wr[uja|_KtBzsf2%{)yG\"ZUxY+QF]R=N;>IMl6d8<#@eW4!}$~05'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}function U(r,n){var i=U.C||(U.C={}),t=r+\":\"+n;return void 0!==i[t]?i[t]:i[t]=b(e.slice(r,r+n))}E=o[V][q(1708,4)](Q[U(1718,4)](C(E,8))[U(1728,4)](J64)),Q=E[U(1736,4)](p(Q,3))}g(Q,K,T),g(E,K,T+8)}return J(k(i,K))}var GORGON_KEY=[68,185,185,217,164,174,249,252,164,147,170,117,124,163,194,196,164,150,147,143];function V(r,n){return 255&(r<<n|r>>>8-n)}function b(r){for(var n=0,e=0;e<8;e++)n|=(r>>>e&1)<<7-e;return n}function U(r,i,t){function u(r,n){var i=u.C||(u.C={}),t=r+\":\"+n;return void 0!==i[t]?i[t]:i[t]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='shd,&fe`YQ~0+xD6XWJ{:F4pzy$Cg>SOA1795NwK=jLtHIm\"#Gb;@i(%|?u)Ukocn}VR3*[Z.Ea2<B8q_!rP^]MlvT/'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}for(var f=[],o=R(M(r)),a=0;a<4;a++){function v(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='Z1?`oq}[;$r@*n%2WX:IdJemT\"xSlw0U&MiG~p,k3fbV6FYH{)O5Q!7RBg8PAc9hD(_]a+#sj4=Nyz|KC>EvL^.u/<t'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}function c(r,n){var i=c.C||(c.C={}),t=r+\":\"+n\n;return void 0!==i[t]?i[t]:i[t]=v(e.slice(r,r+n))}f[c(1745,5)](O(o,a))}if(t&&t[n(537,8)])for(var s=R(t),h=0;h<4;h++){function d(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='6+y#$W~/qUQ2CMuaY;JGj*1&<5d])L=NXr_fvls0x:cO!DPTVe@?,}73[bo4\"BS%8.(|>giRKzkh9IHFmnE`wA^{Ztp'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}function g(r,n){var i=g.C||(g.C={}),t=r+\":\"+n;return void 0!==i[t]?i[t]:i[t]=d(e.slice(r,r+n))}f[g(1755,5)](O(s,h))}else f[n(1765,5)](0,0,0,0);f[u(1778,5)](0,0,0,0,0,6,11,28),f[u(1778,5)](i>>>24&255,i>>>16&255,i>>>8&255,255&i);for(var p=0;p<20;p++)f[p]=255&(f[p]^GORGON_KEY[p]);for(var C=0;C<20;C++)f[C]=235^b(V(f[C],4)^f[(C+1)%20]);for(var w=[132,4,64,28,0,0][u(1789,8)](f),x=\"\",S=0;S<w[u(1805,8)];S++)x+=(\"0\"+w[S][u(1820,10)](16))[u(1836,8)](-2);return x}var ARGUS_KEY=S(n(1850,79));function B(r){var n=[];r=new JB(String(r));for(var i=new JB(function r(n,i){var t=r.C||(r.C={}),u=n+\":\"+i;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='7dEetb]j$8o*L)nxZX0/V~si`H+km>y[6IOzh,p9MJ?|v{A&QaqYf_1cw@5<D%\":^(GNW32lF!P#CK}RSUB.;4=grTu'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(n,n+i))}(1933,4));;){function t(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='@oq1t_#`*])2?ryjnc/ZQ9hTDCe|u,dAH=G:WJ;k&!P<O6[gb{iwzfR8I35l7}.xaN^KFSE($pBX\"LYUM%sV40v+~m>'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}function u(r,n){var i=u.C||(u.C={}),f=r+\":\"+n;return void 0!==i[f]?i[f]:i[f]=t(e.slice(r,r+n))}var f=r[u(1940,4)](i)[u(1947,10)]();if(0===(r=r[u(1959,13)](7))[u(1976,8)]())return n[u(1991,5)](f),n;n[u(1991,5)](128|f)}}function A(r,n){var i=B(8*r),t=B(n);return i[function r(n,i){var t=r.C||(r.C={}),u=n+\":\"+i;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='3Rm`}PDK_YI.QE(91\">xz|;Z8dO*Ce=c]V#vM2srLUX^~jpa7&+GFuH50i@wnyl4W<ho,B%TStb{)k!/N?:J[q$6Afg'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(n,n+i))}(2e3,8)](t)}function X(r,n){function i(r,n){var t=i.C||(i.C={}),u=r+\":\"+n;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='n+Uw%oy\"SPXb6{[$<k(?eHR.]Nh_VOx#*fcC`:4T^DMs|0&Z}31d,uQW!mKz9r>apF~AlY=iJ2t75q)I@8jvGBg;L/E'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}for(var t=B(8*r+2),u=B(n[i(2014,8)]),f=t[i(2025,8)](u),o=0;o<n[i(2014,8)];o++)f[i(2036,5)](O(n,o));return f}var _argusRounds=null;function _(){function r(n,i){var t=r.C||(r.C={}),u=n+\":\"+i;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='Qw2K>bm?suOz![F^<08&L~t+,9S4}DyWR/=V*T5\"Z.f3h`Cj%oiqc7U6XIr#d:vg]A{(n1GMx)HEN_@pP;l$YJk|eaB'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(n,n+i))}for(var n=Q(k(ARGUS_KEY,S(r(2046,10)),ARGUS_KEY)),i=[],t=0;t<4;t++){function u(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='~Y}Lc]m&;>19=Av\"wNTft:xoyg$rsQF)|2_8e{CiOdPK^3?Dn*[J!qZpbG0k+SMjXUWl/Eu4.H7<V`B@,a5h%zI6#R('.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}function f(r,n){var i=f.C||(f.C={}),t=r+\":\"+n\n;return void 0!==i[t]?i[t]:i[t]=u(e.slice(r,r+n))}i[f(2058,5)](d(n,8*t))}for(var o=s(3),a=h(r(2065,20)),v=4;v<72;v++){function c(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='P:i/g\"*uRWy=jSx0|N4Xw;$.]3bVeU2{1o!fc[`(lE9p%O<vt_&6rGFzL~Z,m+)CBA>s@KqQJ}aMd^5?HD8I#hn7kYT'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}function g(r,n){var i=g.C||(g.C={}),t=r+\":\"+n;return void 0!==i[t]?i[t]:i[t]=c(e.slice(r,r+n))}var C=p(i[v-1],-3)[r(2093,4)](i[v-3]);C=C[g(2102,4)](p(C,-1));var w=a[g(2110,13)]((v-4)%62)[g(2127,4)](s(1));i[v]=i[v-4][g(2136,4)]()[g(2127,4)](J64)[g(2102,4)](C)[g(2102,4)](w)[g(2102,4)](o)}return i}function F(r,i,t,u){function f(r,n){var i=f.C||(f.C={}),t=r+\":\"+n;return void 0!==i[t]?i[t]:i[t]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='Pa$p8hMfzAj4tW\"[6kGZS9&CJo(nX5<!/@v`%mi+B?T;Q|dNerqI{1^xE2Yl]*.}~LKgsuUc=)0bO,Fw#VDR:7_3>yH'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}u||(u=n(2145,10));var o=[];o=(o=o[n(2159,8)](A(1,1077940818)))[n(2159,8)](A(2,2));var a=(O(t,6)|O(t,7)<<8|O(t,8)<<16|O(t,9)<<24)>>>0;o=(o=(o=(o=(o=(o=(o=(o=o[f(2167,8)](A(3,a)))[f(2167,8)](X(4,M(f(2178,5)))))[f(2167,8)](X(6,M(f(2186,13)))))[f(2167,8)](X(7,M(u))))[f(2167,8)](X(8,M(f(2200,25)))))[f(2167,8)](A(9,135135744)))[f(2167,8)](X(10,w(8))))[f(2167,8)](A(12,2*i));var v=Q(w(16)),c=Q(M(r));o=(o=o[f(2167,8)](X(13,function(){for(var r=[],n=0;n<6;n++){function i(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='h:N5LJ|Xd;`Iz_/1FtwGBiSW,^Q#23ao]lVPubyMcO=pq&g>%[9RmHn+Us(vY}*j$ke?E<D6CZ~Ax70r.!8){K4f\"T@'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}function t(r,n){var u=t.C||(t.C={}),f=r+\":\"+n;return void 0!==u[f]?u[f]:u[f]=i(e.slice(r,r+n))}r[t(2228,5)](O(v,n))}return r}())))[f(2167,8)](X(14,function(){for(var r=[],n=0;n<6;n++){function i(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='3[!GaXczSyI`wuB/#qRk2Ox;YN)<:{dP%76+e\"v|8@LE~K}gt4r&s0HC9?W*ATQJ5D=$1lf]hbU.ZFjmM(o^,n_pi>V'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}function t(r,n){var u=t.C||(t.C={}),f=r+\":\"+n;return void 0!==u[f]?u[f]:u[f]=i(e.slice(r,r+n))}r[t(2238,5)](O(c,n))}return r}()));for(var s=[8,2+O(t,10)%49*2],h=2;h<=4;h++)s=s[f(2167,8)](B(8*h))[f(2167,8)](B(1388734));for(var C=w((o=(o=(o=o[f(2167,8)](X(15,s)))[f(2167,8)](X(20,M(f(2246,5)))))[f(2167,8)](A(21,738)))[f(2254,8)]),y=0;y<o[f(2254,8)];y++)C[y]=x(o[y]);for(var P=16-C[f(2254,8)]%16,N=k(C,function(){for(var r=w(P),n=0;n<P;n++)r[n]=x(P);return r}()),m=_(),D=w(N[f(2254,8)]),K=0;K<N[f(2254,8)];K+=16){function T(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='<7eHJzL8%#rEu}]&I3gln4)hFv^B0x{[O@NWXZ6d,R`f!m>1=j2c|9wbsSUaQ_k$qiAK~*p:G\"oMCP5V(/D?Y.Tt;y+'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}function I(r,n){var i=I.C||(I.C={}),t=r+\":\"+n;return void 0!==i[t]?i[t]:i[t]=T(e.slice(r,r+n))}for(var q=d(N,K),E=d(N,K+8),V=0;V<m[I(2269,8)];V++){var b=q[I(2278,4)](p(E,1)[I(2287,4)](p(E,8)))[I(2278,4)](p(E,2))[I(2278,4)](m[V]);q=E,E=b}g(q,D,K),g(E,D,K+8)}for(var U=[208,79,253,255,208,79,253,255],F=w(N[f(2254,8)]),Y=0;Y<N[f(2254,8)];Y++)F[Y]=x(O(D,Y)^U[Y%8]);for(var j=w(8+F[f(2254,8)]),W=0;W<8;W++)j[W]=x(U[W]);Packages[f(2293,5)][f(2301,5)][f(2307,8)][f(2318,11)](F,0,j,8,F[f(2254,8)]);for(var Z=w(j[f(2254,8)]),G=0;G<j[f(2254,8)];G++)Z[j[f(2254,8)]-1-G]=j[G]\n;var H=k(S(f(2333,23)),Z,S(f(2358,5))),$=16-H[f(2254,8)]%16,z=k(H,function(){for(var r=w($),n=0;n<$;n++)r[n]=x($);return r}()),L=R(Packages[f(2293,5)][f(2369,5)][f(2376,8)][f(2388,14)](ARGUS_KEY,0,16)),rr=R(Packages[f(2293,5)][f(2369,5)][f(2376,8)][f(2388,14)](ARGUS_KEY,16,32)),nr=Packages[f(2409,7)][f(2421,8)][f(2430,8)][f(2445,14)](f(2464,21));nr[f(2489,5)](1,new(Packages[f(2409,7)][f(2421,8)][f(2497,5)][f(2507,16)])(L,f(2523,4)),new(Packages[f(2409,7)][f(2421,8)][f(2497,5)][f(2534,19)])(rr));var er=nr[f(2559,9)](z);return J(k(S(f(2569,5)),er))}function Y(r,i,t){function u(r,n){var i=u.C||(u.C={}),t=r+\":\"+n;return void 0!==i[t]?i[t]:i[t]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='ImahT!U1Xg(lBFc,49Q?P)zu~>t0RA$^vV2{wrd_.*nHKj=Eob;@SZN`DC#f/\"LsyJ5&e8}qMG+|3[Yk:OiW<%p76]x'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}var f,o=r[n(2576,9)](\"?\")>=0?r[n(2590,7)](\"?\")[1]:\"\",a=Math[n(2603,7)](Date[u(2613,7)](new Date)/1e3),v=i?M(i):null,c=m(11);return{[u(2627,11)]:String(a),[u(2641,9)]:E(u(2654,5),a,(f=w(4),(new(Packages[u(2663,5)][u(2669,10)][u(2680,15)]))[u(2697,11)](f),f)),[u(2713,10)]:U(o,a,v),[u(2729,9)]:F(o,a,c,t)}}var FQ_REG_KEY=n(2744,40),FQ_LOGO=n(2785,78),FQ_AD=n(2785,78);function fqAd(){return.03>Math[n(2865,8)]()?\"\\n\"+FQ_AD:\"\"}var FQ_MK1=n(2877,7),FQ_MK2=n(2887,10),FQ_MK3=n(2899,16),FQ_MK4=n(2917,11),FQ_MK5=n(2932,11);function fqMark(r){return r=String(r),FQ_MKP+J(M(r))+FQ_MK3}function fqMarkText(r,n){var i=String(null==r?\"\":r)[function r(n,i){var t=r.C||(r.C={}),u=n+\":\"+i;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='/MChUeG@jS0f5kq<%W4Y.vl2Z=P*i,Ar?wJQ8RK7Op\"Tgu]:+#Hz`|m[Bo!(3xI$d~stD>{a16^y&}FLn_cb9XV)N;E'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(n,n+i))}(2947,5)]();try{function t(r,n){var i=t.C||(t.C={}),u=r+\":\"+n;return void 0!==i[u]?i[u]:i[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='+?anq3PEN]=;mJ&wY#p:)5|MQ.DBCxORGzW7g>[_`6ou$V~ZKjeli0}{(U8yS,f<XAsT@dr2kL1/9HbF!tv*\"%ch^I4'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}i[t(2954,8)]>0&&i[t(2954,8)]%2==0&&new RegExp(t(2964,18),\"\")[t(2982,5)](i)&&(i=P(S(i[function r(n,i){var t=r.C||(r.C={}),u=n+\":\"+i;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='Y%),wsbIz8EN>y@UM+Jdv<X5WR90~.#|[/Vo\"Ac_Zm1=aDH!?7CxPt*L2u(liep;f{^&SOr`q]$K4gn}6QTBjkh:F3G'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(n,n+i))}(2993,14)]())))}catch(u){}return i}function fqSleep(r){try{function i(r,n){var t=i.C||(i.C={}),u=r+\":\"+n;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='49D?>,3ZvY#GR%\"yAw}<J7qN^VCWr2aQSBg1{kMmpI:!0@X86|LK5ePoFt;._nHl/$z=b+h`~d*iu&)fT]jcU(EsOx['.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}Packages[n(107,5)][i(3012,5)][i(3020,8)][i(3031,7)](r)}catch(t){}}function fqVarGet(r){try{var i=r[n(3043,14)]();if(i){function t(r,n){var i=t.C||(t.C={}),u=r+\":\"+n;return void 0!==i[u]?i[u]:i[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='3\"A>DNK56Q~]<YG(SHXoO?lLM71Vv/:#}^d_pw!C$WIiqeau%m)2jkZU[9FE&,8@g+PT{.y0cxJ|b*=4;tsnz`RhBrf'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7)\n;f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}var u=JSON[t(3063,7)](String(i));if(u&&typeof u===t(3071,8))return u}}catch(f){}return{}}function fqVarSet(r,n){try{function i(r,n){var t=i.C||(i.C={}),u=r+\":\"+n;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a=':`6BGF[JY$KTuk+,5_xl\".>er&V38osURQwdv~DAPq4^CEt0I;H1O%*pWyzh{fja9mg<c7=?bi)Z]NM}(#@S/L2|!nX'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}r[i(3082,14)](JSON[i(3100,11)](n))}catch(t){}}function fqDefDevice(){return JSON[n(3113,7)](n(3123,457))}function j(r,n){if(!n)return r;for(var e in n)try{void 0!==n[e]&&null!==n[e]&&\"\"!==String(n[e])&&(r[e]=n[e])}catch(r){}return r}function fqDevice(r){var e=fqDefDevice();if(r){try{var i=fqVarGet(r);i&&i[n(3584,8)]&&j(e,i[n(3584,8)])}catch(r){}try{var t=r[n(3596,18)]();if(t){var u=JSON[n(3113,7)](String(t));u&&typeof u===n(3615,8)&&j(e,u)}}catch(r){}}return e[n(3628,10)]&&e[n(3643,4)]||j(e,fqDefDevice()),e}function fqUa(r){function i(r,n){var t=i.C||(i.C={}),u=r+\":\"+n;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a=':XSK)k|5<7e[%iOmuLan9gt$+^p=B.\"so&JUjxVq*d,CY>cA(DIRv_@Q1w}hl;]HTWM{FP?rfZ28z!3yEG#/`4N0~b6'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}return n(3649,64)+r[n(3718,11)]+i(3731,11)+r[i(3743,13)]+i(3758,47)}function fqSigned(r,n,i,t){function u(r,n){var i=u.C||(u.C={}),t=r+\":\"+n;return void 0!==i[t]?i[t]:i[t]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='WrqbnJR}Vd0Gc/Opo4eS6&ME~B1C,U)TF^gh<[:afz+3Y;LAi(XN>I*u!$s\"8Q7v{@Kl=jDP%|Z92#my.w?x5k_t`]H'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}var f=Y(r,i,n[u(3809,14)]);f[u(3824,13)]=fqUa(n),f[u(3842,8)]=u(3854,66)+n[u(3923,4)]+\";\",f[u(3933,8)]=u(3945,67),f[u(4018,16)]=\"0\",f[u(4038,19)]=String(Date[u(4059,4)]()),f[u(4070,31)]=u(4105,10),f.lc=u(4115,4),f[u(4121,14)]=\"2\",f[u(4141,25)]=u(4172,7),f[u(4184,21)]=u(4207,7),f[u(4220,26)]=u(4249,4),f[u(4259,21)]=String(Date[u(4059,4)]())+\"-\"+String(Math[u(4286,7)](2e9*Math[u(4298,8)]()));var o={[u(4314,8)]:t||u(4326,4),[u(4333,9)]:f,[u(4342,7)]:2};return i&&(o[u(4356,5)]=i),r+\",\"+JSON[u(4365,11)](o)}function fqFetch(r,i,t,u){try{function f(r,n){var i=f.C||(f.C={}),t=r+\":\"+n;return void 0!==i[t]?i[t]:i[t]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='.T9E<n6(Gy*3=b%j:@>t!1{gW_J$4hHa#YLoVClO}s`/I;K&Mwx)8BN[,v2A7Z5\"0deiD^cuq?p~RUXPmk]+FfSQr|z'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}.03>Math[f(4383,8)]()&&r[f(4391,7)](FQ_AD)}catch(s){}for(var o=u||4,a=\"\",v=0;v<o;v++){v>0&&fqSleep(400);var c=null;try{c=r[n(4406,5)](i())}catch(h){c=null}if(null!=c&&(c=String(c))[n(537,8)]>0){if(t(c))return c;a=c}}return a}function fqUuid(){return n(4416,45)[n(4465,9)](new RegExp(n(4478,5),\"g\"),function(r){function n(r,i){var t=n.C||(n.C={}),u=r+\":\"+i;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='1`Ihe/AB6,*+&<SXpZHr8_nd(CE?y;t7.5v#Oqo$@^lw[fib}Kmx2|UWz~j]PRa0T9MJY>{L)=DG!%QF3u\"4sgck:NV'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+i))}var i=16*Math[n(4487,8)]()|0;return(\"x\"===r?i:3&i|8)[n(4496,10)](16)})}function fqQS(r){function i(r,n){var t=i.C||(i.C={}),u=r+\":\"+n;return void 0!==t[u]?t[u]:t[u]=function(r){\nfor(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='jfwai`n8lS|4M<VOQ/LgN7cHxRe@G:0U]D!.I9du^2vA&1}rYKWT>=,m\"~$yz?[s3Xk%56Jtob;EC#(h*F)q+_B{pPZ'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}for(var t=Object[n(4506,5)](r),u=[],f=0;f<t[i(4514,8)];f++)u[i(4524,5)](t[f]+\"=\"+r[t[f]]);return u[i(4535,5)](\"&\")}function fqCommonParams(r){function n(r,i){var t=n.C||(n.C={}),u=r+\":\"+i;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='hXQpj&YeC:4@>2i6nfaW<0z\"9LRD!+rtN,gl1K$GMJV3S.?cq/%yOTZ57U_s|u]bx^=8}EHwA#[(*)mB{ko;v~PdF`I'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+i))}var i={};return i[n(4542,26)]=r[n(4572,14)],i[n(4590,10)]=String(Date[n(4603,4)]()),i[n(4611,4)]=r[n(4611,4)],i[n(4622,9)]=r[n(4622,9)],i[n(4634,14)]=r[n(4650,13)],i[n(4670,10)]=\"zh\",i[n(4684,10)]=n(4700,11),i[n(4713,23)]=n(4738,7),i[n(4751,13)]=r[n(4751,13)]||n(4771,11),i[n(4782,24)]=r[n(4572,14)],i[n(4807,5)]=r[n(4807,5)]||\"\",i[n(4816,19)]=\"0\",i[n(4840,11)]=r[n(4572,14)],i[n(4853,8)]=r[n(4865,7)]||\"32\",i[n(4876,10)]=\"1\",i[n(4890,4)]=r[n(4890,4)]||n(4896,4),i[n(4905,21)]=\"0\",i.ac=n(4930,5),i[n(4941,11)]=r[n(4953,10)],i.os=n(4971,9),i[n(4984,13)]=r[n(5002,11)],i[n(5017,15)]=r[n(4572,14)],i[n(5036,10)]=n(5049,10),i[n(5065,15)]=r[n(5084,14)],i[n(5103,15)]=r[n(5119,14)],i[n(5137,29)]=\"1\",i[n(5170,7)]=\"a\",i[n(5182,18)]=\"1\",i[n(5207,19)]=n(4971,9),i[n(5231,26)]=\"0\",i[n(5259,4)]=r[n(5259,4)],i[n(5270,14)]=r[n(5284,13)]||\"\",i}function fqSearchReq(r,i,t){function u(r,n){var i=u.C||(u.C={}),t=r+\":\"+n;return void 0!==i[t]?i[t]:i[t]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='}uWVKnqZ~tx:[TO.6GYX^\"+!({IQ8<a`k/cmFDA%g$C)3lf2J7H*w0=?oE@_9>j;&R|PS,yhpb41rNv#UMdz5]eisBL'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}var f=fqDevice(t),o=20*((Number(i)||1)-1),a=fqCommonParams(f);return delete a[n(5302,10)],delete a[n(5318,19)],delete a[n(5337,21)],a[n(5365,16)]=\"0\",a[u(5382,16)]=\"2\",a[u(5402,10)]=String(o),a[u(5413,19)]=u(5437,18),a[u(5460,10)]=u(5477,7),a[u(5487,26)]=\"0\",a[u(5513,8)]=String(o),a[u(5526,26)]=fqUuid(),a[u(5559,7)]=encodeURIComponent(String(r)),a[u(5570,15)]=f[u(5590,14)],a[u(5609,7)]=\"20\",a[u(5618,16)]=\"1\",a[u(5636,14)]=\"78\",a[u(5654,16)]=\"0\",a[u(5673,14)]=u(5694,5),a[u(5705,26)]=u(5694,5),a[u(5735,18)]=\"75\",a[u(5757,18)]=u(5780,8),a[u(5795,26)]=\"4\",a[u(5823,10)]=u(5838,7),a[u(5848,10)]=\"1\",a[u(5864,18)]=\"0\",a[u(5886,21)]=fqUuid(),a[u(5912,20)]=\"0\",a[u(5938,9)]=u(5838,7),a[u(5948,10)]=\"1\",a[u(5963,16)]=\"0\",a[u(5983,21)]=\"72\",a[u(6009,13)]=u(6027,7),a[u(6035,20)]=u(6062,15),a[u(6083,13)]=u(6101,4),a[u(6111,15)]=\"4\",fqSigned(u(6127,90)+fqQS(a),f,null,u(6220,4))}function fqTocReq(r,i){function t(r,n){var i=t.C||(t.C={}),u=r+\":\"+n;return void 0!==i[u]?i[u]:i[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='*3|7J/^$#a{.y89~D[x4fWB02R<6=`kZVpl}e;FPXSYrNgHzbUOQoq5w):\"jLM]?GmA@1&Cn>%Kth+!vEcIs_i,ud(T'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}var u=fqDevice(i),f=fqCommonParams(u);return delete f[n(5302,10)],delete f[n(5318,19)],delete f[n(5337,21)],f[t(6225,11)]=\"0\",f[t(6240,9)]=String(r),f[t(6251,15)]=\"1\",fqSigned(t(6272,101)+fqQS(f),u,null,t(6373,4))}function W(r,n,i){function t(r,n){var i=t.C||(t.C={}),u=r+\":\"+n;return void 0!==i[u]?i[u]:i[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){\nvar a='(`3?,U8yfXwr>1q$*ZYMd/.5sB0eD9bvJ[aW!]}VE\"n:;#4k6%GN=2g<PCQ@HTijt+zpS)F^IOK&ALux~|oR_mclh7{'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}var u=fqDevice(i),f=fqCommonParams(u);return f[t(6379,10)]=String(r),f[t(6393,9)]=String(n),fqSigned(t(6406,89)+fqQS(f),u,null,t(6497,4))}function fqSearchUrl(r,e,i){return fqMark(n(6505,4)+(Number(e)||1)+n(6510,5)+String(r))}function fqTocMarkFromBook(r,i){function t(r,n){var i=t.C||(t.C={}),u=r+\":\"+n;return void 0!==i[u]?i[u]:i[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='%O#iW\"Ds/L|m,+;.S}qxeh!Ana6IbR4oK7~(kyZGdVu:JH$C5)PfcpTrltw`<3E@[*F10?>B2U^j8]QMzNgv&XY9={_'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}var u=\"\";try{r&&(u=String(r[n(6521,9)]||r[function r(n,i){var t=r.C||(r.C={}),u=n+\":\"+i;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='v(+DFw>5RO%;7d!2.l)GUy&Kqi$1/#AgTQM3=9nzXb[?|fIL6t0N8^Ca`_}PxrWJmBZ\"4Hujo]:<ke*{c,Y@EsS~phV'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(n,n+i))}(6536,8)]||\"\"))}catch(v){u=\"\"}var f=fqMarkText(\"\",u),o=f[t(6550,7)](new RegExp(t(6559,16),\"\"))?f[t(6550,7)](new RegExp(t(6559,16),\"\"))[1]:\"\";if(!o&&r)try{if(r[t(6581,9)]){function a(r,n){var i=a.C||(a.C={}),t=r+\":\"+n;return void 0!==i[t]?i[t]:i[t]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='vH!39d2&V>zRK_{FLb7(84|,~;:GUJYPOD6hiju.g*S?XapoAB%TW[\"]tsZM^w1$reI5}xk0#l+C/Enm<`NfQyqc=)@'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}o=(String(r[t(6581,9)])[t(6550,7)](new RegExp(a(6592,16),\"\"))||[])[1]||(String(r[a(6614,9)])[a(6625,7)](new RegExp(a(6635,36),\"\"))||[])[1]||\"\"}}catch(c){}return o?fqMarkA(t(6671,10)+o):\"\"}function fqMk(r,e){try{var i=String(r)[n(6687,7)](e);if(i)return i[1]}catch(r){}return\"\"}function fqRegKey(r,i){function t(r,n){var i=t.C||(t.C={}),u=r+\":\"+n;return void 0!==i[u]?i[u]:i[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='8c&\"`k!(H$O[dlD3g)yWVtEn6NG~Xv4Ye1_Abw7iP.U>/xQC59j%{^ImSJrL2|F*;T?]Za0f@,=Bo:h+qzusp#R<M}K'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}var u=fqDevice(i),f=fqCommonParams(u);delete f[n(5302,10)],delete f[n(5318,19)],delete f[n(5337,21)];for(var o=n(6695,87)+fqQS(f),a=S(FQ_REG_KEY),v=w(16),c=new JB(String(u[n(3628,10)]))[n(6786,14)](),s=w(16),h=0;h<8&&h<c[n(537,8)];h++)s[h]=c[c[n(537,8)]-1-h];var d=JSON[n(6801,11)]({[n(6814,9)]:J(k(v,D(s,a,v))),[n(6827,8)]:1}),g=fqFetch(r,function(){return fqSigned(o,u,d,function r(n,i){var t=r.C||(r.C={}),u=n+\":\"+i;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='kB<X18CmlM;:w*Df[~$^ug@9N&+qvK}y7OxHA`]e\"I2sZ#4zdEna%!c3oFQ>Yh{/rW.Si|_=L,R60UtTj5Vbp(G)?PJ'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(n,n+i))}(6840,5))},function(r){try{return!!(JSON[n(3113,7)](r)[n(6851,5)]||{})[n(6863,4)]}catch(r){return!1}},4),p={};try{p=JSON[n(3113,7)](g)[n(6851,5)]||{}}catch(r){p={}}if(!p[n(6863,4)])throw n(6869,24)+String(g)[n(6895,11)](0,80);var C=N(p[n(6863,4)]),x=K(Packages[n(107,5)][n(6908,5)][n(6916,8)][n(6931,14)](C,16,C[n(537,8)]),a,Packages[n(107,5)][t(6951,5)][t(6963,8)][t(6978,14)](C,0,16)),y=\"\"\n;for(h=0;h<16;h++)y+=(\"0\"+O(x,h)[t(6998,10)](16))[t(7012,8)](-2);return{[t(7027,8)]:p[t(7027,8)]||1,[t(7041,4)]:y[t(7051,14)]()}}function fqKey(r,e,i){var t=fqVarGet(e),u=t[n(4506,5)]&&typeof t[n(4506,5)]===n(3615,8)?t[n(4506,5)]:{};if(null!=i&&u[i])return String(u[i]);var f=fqRegKey(r,e);return u[f[n(6827,8)]]=f[n(6863,4)],t[n(4506,5)]=u,t[n(3584,8)]=fqDevice(e),fqVarSet(e,t),f[n(6863,4)]}function fqParseBooks(r){var i=null;try{i=JSON[n(3113,7)](String(r))}catch(d){return null}for(var t=i&&i[n(7065,14)]||[],u=[],f=0;f<t[n(537,8)];f++)for(var o=t[f]&&t[f][n(6851,5)]||[],a=0;a<o[n(537,8)];a++)for(var v=o[a]&&o[a][n(7084,11)]||[],c=0;c<v[n(537,8)];c++){function s(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='o,_.TZj6|qR9s^aU<tINEfv}B%/=xP7h4niVdGu:AL@`H+;*wp)[&XKM]S51F0!?gJ$ODm({rW2ke\"z3QcY8#Cybl~>'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}function h(r,n){var i=h.C||(h.C={}),t=r+\":\"+n;return void 0!==i[t]?i[t]:i[t]=s(e.slice(r,r+n))}u[h(7100,5)](v[c])}return u}function fqSearchList(r,i,t,u){function f(r,n){var i=f.C||(f.C={}),t=r+\":\"+n;return void 0!==i[t]?i[t]:i[t]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='1Dt4BF_EeC|(%+0?nAj#pR7m<K}y,6W^c5baG$8X/x`@=Z\"*9YMi:f~goTL3sU&;J]wvN{lSz2[QkIdOPhrV!).Hq>u'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}var o=fqMarkText(r,i),a=\"\",v=1,c=o[n(6687,7)](new RegExp(n(7109,16),\"\"));c&&(a=c[1]);var s=o[n(6687,7)](new RegExp(f(7128,10),\"\"));s&&(v=Number(s[1])||1);var h=null;if(a){var d=fqFetch(t,function(){return fqSearchReq(a,v,u)},function(r){var n=fqParseBooks(r);return!(!n||!n[f(7138,8)])},4);h=fqParseBooks(d)}var g=[];if(!h)return g;for(var p=0;p<h[f(7138,8)];p++){function C(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='}OM{Q8t|mJP@;l&jfYvF5qAz*3pkZ([,r)K~nLI$6S`T>_EeV2=+R/:%^xoNsd#9Uw4CHBgbG]iay1cu?X\".0!W<Dh7'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}function w(r,n){var i=w.C||(w.C={}),t=r+\":\"+n;return void 0!==i[t]?i[t]:i[t]=C(e.slice(r,r+n))}var x=h[p];if(x&&x[f(7148,9)]){var O=String(x[f(7164,10)]||\"\")+(x[f(7179,7)]?\" \"+x[f(7179,7)]+\"分\":\"\")+(x[f(7188,5)]?\"\\n\"+x[f(7188,5)]:\"\");g[f(7196,5)](JSON[f(7206,11)]({[f(7220,5)]:String(x[f(7229,11)]||\"\"),[f(7246,8)]:String(x[f(7246,8)]||\"\"),[f(7260,9)]:fqMark(f(7273,10)+x[w(7287,9)]),[w(7300,10)]:String(x[w(7315,11)]||\"\"),[w(7330,7)]:String(x[w(7341,10)]||\"\"),[w(7357,5)]:O,[w(7367,11)]:String(null==x[w(7382,14)]?\"\":x[w(7382,14)]),[w(7399,14)]:String(x[w(7417,23)]||\"\")}))}}return g}function fqPickBookInfo(r){var e=null;try{e=JSON[n(3113,7)](String(r))}catch(r){return null}var i=e&&e[n(6851,5)]&&e[n(6851,5)][n(7444,11)]||null;return i&&i[n(7458,11)]?i:null}function fqBookInfo(r,i,t,u){function f(r,n){var i=f.C||(f.C={}),t=r+\":\"+n;return void 0!==i[t]?i[t]:i[t]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='Y3=xt_`uN]+XiM?@Bac<qvF>6}[\";.8yCS%{r:7Uwkzh&n|JT45P#A1gpm9ELQsI)!2^b,Zo(KD0*dfRHG/~OVl$eWj'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}var o=String(null==r?\"\":r),a=fqPickBookInfo(o),v=fqMk(fqMarkText(r,i),new RegExp(n(7471,16),\"\"));return v||(v=(String(i||\"\")[n(6687,7)](new RegExp(n(7492,36),\"\"))||[])[1]||\"\"),!a&&v&&(o=fqFetch(t,function(){return fqTocReq(v,u)},function(r){return!!fqPickBookInfo(r)},4),a=fqPickBookInfo(o)),a?JSON[n(6801,11)]({[f(7534,11)]:String(a[f(7534,11)]||\"\"),[f(7549,8)]:String(a[f(7549,8)]||\"\"),[f(7561,11)]:String(a[f(7561,11)]||\"\"),[f(7578,10)]:String(a[f(7578,10)]||\"\"),\n[f(7588,10)]:String(a[f(7588,10)]||\"\"),[f(7604,7)]:String(a[f(7604,7)]||\"\"),[f(7615,14)]:String(null==a[f(7615,14)]?\"\":a[f(7615,14)]),[f(7636,23)]:String(a[f(7636,23)]||\"\"),[f(7664,15)]:String(null==a[f(7664,15)]?\"\":a[f(7664,15)])}):\"{}\"}function fqPickToc(r){var e=null;try{e=JSON[n(3113,7)](String(r))}catch(r){return null}var i=e&&e[n(6851,5)]||{};if(i[n(7679,18)]&&i[n(7679,18)][n(537,8)])return i[n(7679,18)];for(var t=[],u=i[n(7703,15)]||[],f=0;f<u[n(537,8)];f++)for(var o=u[f]&&u[f][n(7679,18)]||[],a=0;a<o[n(537,8)];a++)t[n(1765,5)](o[a]);return t[n(537,8)]?t:null}function fqTocList(r,e,i,t,u){var f=String(null==r?\"\":r),o=fqPickToc(f),a=fqMk(fqMarkText(r,e),new RegExp(n(7471,16),\"\"));if(!a)try{i&&(a=fqMk(fqMarkText(\"\",String(i[n(6521,9)]||i[n(7722,8)]||\"\")),new RegExp(n(7471,16),\"\")))}catch(r){a=\"\"}return!o&&a&&(f=fqFetch(t,function(){return fqTocReq(a,u)},function(r){return!!fqPickToc(r)},4),o=fqPickToc(f)),fqTocBuild(o,a)}function fqPickChapter(r){function i(r,n){var t=i.C||(i.C={}),u=r+\":\"+n;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='{5WQMh?;#g+s64(u2i[XpTjG=%IldABb,\"18ZmSV`zK*@<q!/|3v0wD}xJrOEn^NY&U.$aL>~c)F7fHPRye9]k:t_Co'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}var t=null;try{t=JSON[function r(n,i){var t=r.C||(r.C={}),u=n+\":\"+i;return void 0!==t[u]?t[u]:t[u]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='H=2?*c()9O0KxUSLiu;MNWCpv$PbE+hDg@^ZYq,d5T%Aa&3}{z|IX_>~f4<VJF7tR1r:].68Gj\"eno[Qw/!#slk`myB'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(n,n+i))}(7737,7)](String(r))}catch(r){return null}for(var u=t&&t[n(6851,5)]||{},f=Object[i(7750,5)](u),o=0;o<f[i(7762,8)];o++){var a=u[f[o]];if(a&&a[i(7773,9)]&&a[i(7773,9)]!==i(7790,9))return a}return null}function fqContent(r,i,t,u){var f=String(null==r?\"\":r),o=fqPickChapter(f);if(!o){var a=fqMarkText(r,i),v=fqMk(a,new RegExp(n(7801,23),\"\")),c=fqMk(a,new RegExp(n(7471,16),\"\"));v&&c&&(f=fqFetch(t,function(){return W(v,c,u)},function(r){return!!fqPickChapter(r)},5),o=fqPickChapter(f))}if(!o)return n(7831,52);var s,h=fqKey(t,u,o[n(7887,14)]),d=N(o[n(6814,9)]),g=null;try{g=K(Packages[n(107,5)][n(6908,5)][n(6916,8)][n(6931,14)](d,16,d[n(537,8)]),S(h),Packages[n(107,5)][n(6908,5)][n(6916,8)][n(6931,14)](d,0,16))}catch(x){}if(null==g||g[n(537,8)]<2||31!==O(g,0)||139!==O(g,1)){function p(r,n){var i=p.C||(p.C={}),t=r+\":\"+n;return void 0!==i[t]?i[t]:i[t]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,i=[],t=0,u=0,f=-1,o=0;o<e;o++){var a='ce30SoE[b`r92>^A$(U!*|G]kyt#)QNW/X%zmiFvDB:7V4hs+q_}~?jpuJ=OK,fY6PMlT8{d\"w<xL1ngH&C;I.@ZRa5'.indexOf(n[o]);if(-1!==a)if(f<0)f=a;else{t|=(f+=91*a)<<u,u+=(8191&f)>88?13:14;do{i.push(255&t),t>>=8,u-=8}while(u>7);f=-1}}return f>-1&&i.push(255&(t|f<<u)),l(i)}(e.slice(r,r+n))}var C=fqRegKey(t,u),w=fqVarGet(u);w[p(7908,5)]=w[p(7908,5)]||{},w[p(7908,5)][C[p(7918,8)]]=C[p(7931,4)],fqVarSet(u,w),h=C[p(7931,4)];try{g=K(Packages[p(7941,5)][p(7952,5)][p(7958,8)][p(7973,14)](d,16,d[p(7991,8)]),S(h),Packages[p(7941,5)][p(7952,5)][p(7958,8)][p(7973,14)](d,0,16))}catch(y){}}if(31===O(g,0)&&139===O(g,1))try{s=P(I(g))}catch(M){s=P(g)}else s=P(g);return fqParas(s,fqAd())}\nvar FQ_B64T=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";function fqB64A(r){for(var t,a,n,e=(r=String(r)).length,c=e-e%3,i=[],h=0,A=0;A<c;)t=r.charCodeAt(A++),a=r.charCodeAt(A++),n=r.charCodeAt(A++),i[h++]=FQ_B64T.charAt(t>>2),i[h++]=FQ_B64T.charAt((3&t)<<4|a>>4),i[h++]=FQ_B64T.charAt((15&a)<<2|n>>6),i[h++]=FQ_B64T.charAt(63&n);return e-c===1?(t=r.charCodeAt(A),i[h++]=FQ_B64T.charAt(t>>2),i[h++]=FQ_B64T.charAt((3&t)<<4),i[h++]=\"=\",i[h++]=\"=\"):e-c===2&&(t=r.charCodeAt(A),a=r.charCodeAt(A+1),i[h++]=FQ_B64T.charAt(t>>2),i[h++]=FQ_B64T.charAt((3&t)<<4|a>>4),i[h++]=FQ_B64T.charAt((15&a)<<2),i[h++]=\"=\"),i.join(\"\")}var FQ_MKP=FQ_MK1+FQ_LOGO+FQ_MK2;function fqMarkA(r){return FQ_MKP+fqB64A(String(r))+FQ_MK3}function fqTocBuild(r,t){var a=[];if(!r)return a;for(var n=0;n<r.length;n++){var e=r[n];if(e&&e.item_id){var c=String(e.title||\"\");c&&a.push(JSON.stringify({name:c,url:fqMarkA(FQ_MK4+e.item_id+FQ_MK5+t)}))}}return a}function fqParas(r,t){var a=r.match(/<blk[^>]*>([^<]*)<\\/blk>/g);if(a){for(var n=[],e=0,c=0;c<a.length;c++){var i=a[c].replace(/<[^>]+>/g,\"\").trim();i&&(n[e++]=i)}return n.join(\"\\n\")+(t||\"\")}return r.replace(/<[^>]+>/g,\"\\n\").replace(/\\n+/g,\"\\n\").trim()+(t||\"\")}", "lastUpdateTime": "1790783078780", "loginCheckJs": "(function(){var v=null;try{v=JSON.parse(String(source.getVariable()||''))}catch(e){}if(!v||!v.device||!v.device.deviceId)throw'请先到书源登录页选择设备（自动注册/使用内置设备）';return result})()", "loginUi": "[\n {\n  \"name\": \"设备ID\",\n  \"type\": \"text\",\n  \"placeholder\": \"手动注册时填写（自动注册后自动填入）\"\n },\n {\n  \"name\": \"安装ID\",\n  \"type\": \"text\",\n  \"placeholder\": \"手动注册时填写\"\n },\n {\n  \"name\": \"自动注册\",\n  \"type\": \"button\",\n  \"action\": \"fqAutoRegister()\",\n  \"style\": {\n   \"layout_flexGrow\": 1,\n   \"layout_flexBasisPercent\": 0.33\n  }\n },\n {\n  \"name\": \"手动注册\",\n  \"type\": \"button\",\n  \"action\": \"fqManualRegister()\",\n  \"style\": {\n   \"layout_flexGrow\": 1,\n   \"layout_flexBasisPercent\": 0.33\n  }\n },\n {\n  \"name\": \"测试\",\n  \"type\": \"button\",\n  \"action\": \"fqTest()\",\n  \"style\": {\n   \"layout_flexGrow\": 1,\n   \"layout_flexBasisPercent\": 0.33\n  }\n },\n {\n  \"name\": \"使用内置设备\",\n  \"type\": \"button\",\n  \"action\": \"fqUseDefault()\",\n  \"style\": {\n   \"layout_flexGrow\": 1,\n   \"layout_flexBasisPercent\": 0.5\n  }\n }\n]", "loginUrl": "function r(r){for(var n=\"\"+(r||\"\"),e=n.length,t=[],i=0,f=0,u=-1,o=0;o<e;o++){var a='$@nq[F/:E;7=5?Q]La%SV{xUwR1P|vfJ!A`(9smjT>K*Y,yzND2^}HpdbcMBIgk#ol._4iGr8Xe~0<h&uZCWO\")+3t6'.indexOf(n[o]);if(-1!==a)if(u<0)u=a;else{i|=(u+=91*a)<<f,f+=(8191&u)>88?13:14;do{t.push(255&i),i>>=8,f-=8}while(f>7);u=-1}}return u>-1&&t.push(255&(i|u<<f)),h(t)}function n(t,i){var f=n.C||(n.C={}),u=t+\":\"+i;return void 0!==f[u]?f[u]:f[u]=r(e.slice(t,t+i))}\nvar e='AbEj8;}BfU,^F,7#$Jr%pTiW+QpO,z(0mdEZe3W*7IJg1])\"lSaO;wXo\"{&l,Dq2VvgB5xy;A!#<<G@mc}s!+5.]1OWm{]YLaL!UI4.JEHklKb?I|OKS;s9|)VV~!0c`|ku$TS\"9nMb$guIwXla%iupmSH)OaHI_FD*%t?9*!ag<zp_]3I\"%`8HfuNVMnG)zr%<r)`7>t?A[/D_tt[&0j,hK/$,Z[idEgTfJ@8:Z~a2_228Al9Rm=q?rYRZWkv@kh{vz`Zw*T6|X_0Q;$`7(!:jh0EV;5[SUmqE|fYD4nV>;k%/g@CBQ>.;*6%[WQ/EbCBQ>.;YO\"?5E},CBQ>.;JwgWW#C!C,ds_}$pHl2/n9{;2(>d$1V\"^nz2\"(/3n9352(>VB8@u<10W2/*<$tn$X9BL$G6|HB^1F[EEPIK)?VuElHB^1zKC=PEpWw:FBa%71gWC&R>^v<n71Hl>KR>A}]<6,Vz,i6($i:(9y5NbW:>>.9{K2;9)D]Pc#w3#yS,TXu`5:0fs5.`TF(9!k$#uFzD+q\"~{(O3~06,!9GZ%H\"~{bHTvw6o09GD+q\"~{(OTvw60a=8.O+AVIzy_{A8O+T9QRBsbIlQo2bu>M5jjBtX&t8GM4@ywX]]m`m4.N5Q\"Qy(]]m`m4Iqb\"uL>b9lk(a25bk9]77GV=:mYZa2HTA$zE3.{p?kEC7/6$q8jswU}B\"~w778CLf<EaaISu]C++~deS<h#3bSjq5o:/XSU:?ba?G1>CxS<@].`nXzi[p/x]]m`m46L)<b.Wg;898rw7G]]W!WiVn+Cg>Nc^!B<C}@#I@T\"jB1XA,gtK,~#bU8<<k98,[cl!a_rMwi$2^%v1Zjiz6t}hMi|xfpC*e2[[e$&<EX;ra*G!W3~%%^H^wZ7fFo*gs&X#3R*7!W3c8S{/kogZh([[}<Jr${2#l.Aa;+)q](ab.:}J;K4Iz9$y3lP}s+e\"U[:L$?iUSGfjFN_=G0s)q$u+#bZ2E=[w6:y.RAnwkb31g:IwmXv}J}R6*\"a2@e7/7:F0qI<w}Z[eb:o/5OSYHyZh^sqL]8rB5U0`CCI0DTQKU8Lm;8aN;pK>DLlKb6W\"EoZfc4.!Su{t/mLtnr@24wM`I!!ChW$eyMU]ZLhY!4+#rk:;(_K)=3KP5sFzP\"KS+T!GlMbc2(ID9Vh>DZhjbuapfU:F0otO{=<n;5>P}YLt/{R#8d:iNfrf8~?r._)>}_qDLjTTra;|0JyF%taV9K6LhE$D3#:U<;k+zo$v}9{rbby(__6}OAw+#;zqKNYd0Zmo\"1P8a7dKt;=z5o\"gOpyRH32oorOw$j=z5o\"sk$_$)}[:L$?iUSeW|mN_|[:L$?iUSt8Ck8Ed!abF%O+)$Sfli\"yY7//Hngj}qY9{B&:Mj!z(_UI{e.U^\"z}J;K4Iz9$y3lP|ZvkrOw$j=z5o\"skf=Nn14pKo$l3KvRdJ}j=z5o\"sk$_@jaVzlHG1y[jd^ZhYKWVaN4zI7tBOumWk#M;Ne@Y.SSBq!Sy)FRdJ}}Sa5<mmpbt8abKt}E$BPnN;A$wp(U[<x~yElU#;%{]rUTNXNxRdJ}~tB0|\",Y(4CacK6QKRABUEH}SSv|hUKL(\"9@j}E2KX|@,TQ$s<^Q_1H$7F!FH}.i%U^\"ns{8%a^.s)q$u+MU,)w@zA$Hy$rE\";ey=F4`4+)NyB&@co1.4}h]GiP#K,OK8KwhItaUumo\"(AF8K.+Ny:hhU2$]&H<}8KS+T!o{{Z!Ar8KAM?iBAed::=I=3flvbjFc15fg5Nn,<Z::=I=3kP+vEL(N5p::=I=3fl;Z_RG1d$&YPOe@::=I=3z5.\"v\"@_cX5::=I=3flvbv\"8ej]Iq+2)tO{W.O}$zAeL#f@DHbFqK\"wA],K&{6dDHV77:TI`AE+Y/0|W1oaUq}t^F<l$0Z385%ZF`(0G::9$?iZht/#Aq_VEn;5>P}YLt/KL2nr@2tTk=tx}A/._!o{@v/:7:E$6}rQumo\"(BEk!Y@_&Vr(y.PmK`7cwB_9$FXRN|ZSg+K;*IrlUS|Z(VatlkO.j)?S&{%Dq;O);w_]Nzd$j=z5o\"sk$_6hDUq}t^Fp(r\"4sb:L4s@V)],&{)dP.Qet?g{vOVhhX}LCZ4%N$]Y)W$s+8sUF(bV?3216:On2Jk(h;9W%)2taIQ)y8AOgUu$]Y)W$ll>Z*Aq_Ct3S4>_TIItBd;N7:K)IGn{k8Y/f\"niwhRA&+#MVFv,:KY)7[}O*Zc2}:M@2r]tf?niX|Te*U}ZWZeI9g;Sh;d$dSz5umnsbt;N|#VhocTrdhqT_P.0D{0Ik6e?M1HGFv>cN7:^$.i<{kut_lG7:zI&YB<?Q+Y6::=I=3flAU(Rqe:H|@Ty*N4}h]GiP#+^C6j!:E5>aGw{Evg|a)z5>dDeLc9lA+O.6}hXVPt/8Le:/HU(y::=I=3flc\"/AN_MD6pK+tB2:HrArOJ}~tF5%9j^5eh40_&.>DZhjbuK@qv>ZS8,;0bkpES:rOy.[GTSgs7\"@e8aL4v}J}=Z}Zh}anCa?F5_otvh^s?^;8Iw2KDINyH,T:TaKVhJ)i4|ZAp(c%}*4[?.j)_!u{yQzCrOy.5iprz\"skf=+@czb.Q%e`,cb.ItVP~rWy<8d%E3azK)?t%UhUKLBRbc%:Tz|c$uQiP.oM4_uqS@W$J)W+lbapan3@]qT41atcS@X$=)EPz\"gY5e[wlh)},)k+*\"%W@e5Gb)C}(lHG1;aSZ@UYcZs?*g&1F{GT,=.|&bV,6J)!vmgVt?lR/?(bp*=*_DHngH?il/&1ILulHB/pWrPnFfFG62h^g/E]_rD$oJCN8rXbBw#Tv0%Z`\"eUiy`{DJnTSQ,c@~cC96VAW5RQrrbetUAvE__L$)tB2l::=I=3flR<uJI]77145>1AS3t8UF(Q2F,[2$Z[3KSdf!Mpuc6CI|E2W5CRF(_*<)ZZ3xL,@y{c.z3::=I=3GLqZEz;|025U=6SgdvpjC]4{qSz7CwU[q6#o)H3,?\"$_DY5H]{&Q({bb!/?y@Rpk)VdJS@(Sn,bx>dr}f`<o*w3N4Zi,[x9+~ngf:>{r}fDj[6^Jd}|<jB/IP5$g\"aUk+.fqO:<9Pghn\"CU{<EfPO:<sdU<<oIoOR{G_qp+q/<^:VYfkJ+<[S&nI$ZreNwl=].)Du/rKx51Sn,bx>dr}fu7}qVvAciE^$3|ftViKn1n/#|cM;~ty#CF,wxk6.1%zE**!ca/2n%?O4:[/UZv?{Xx*}\"rq;d3,qGxgIx$(FClm|5UNldyym}A1<334?\"V+C!#^LUZv?{Xl1`\"[*[70D[Gj]5}V)GMo\"GO?gQLx(NXKl^\":157\"}hPWm6?xJh!O.2SoqaF*zMJI]0ZZ?Hmo^Qh>fi*s|KBK#+,+q#*JoNW7Mg[pwrg5*2Y_L8.B%]>}B;/E014>NdqrWq7UgXL]I7/;Z(Hw9#%IT6;~Jt8;Z(Hw9#uRM.sO*7lFny$t88fsf?%_,!NZp8^x[&U:X;Tq07e]:gA1A~%cHN>Jz3tov;kW~3y$sTvQ<Ts(<Z6RGGuOMY5!vadL]1=byu\"fwip!H8)88SmPz|8GBR9SdYRM;=+?E9AsQ>&qW^i<6IDZ+UpBmp\"Tz}PM#jc@L_M60}`9T/`F2IWjQ>>!=!2.rFi;vRY*y{^w,9:?*PpaIxBQ]zIPc>x\">wj)RbH$5Ys:#}6B?YZ)Y(AY|AGD9*4tMu&**akcRbfTbvwkU4nK6CHVJUBEaF8kiBUwWGZ46fBomtYHkt8FCY2Rx4OKFNdr5vUnsS26CMfTBPuD2K5IzGFkdRZsTE5g0wZ6WDmUELp2KGPvlnAJ6xaP8zZ6w8ypxciR1cELJL4u95agI';function t(){var r,n=[function(){return globalThis},function(){return global},function(){return window},function(){return new Function(\"return this\")()\n}],e=[];try{r=Object,e.push(\"\".__proto__.constructor.name)}catch(r){}r:for(var t=0;t<n.length;t++)try{r=n[t]();for(var i=0;i<e.length;i++)if(\"undefined\"==typeof r[e[i]])continue r;return r}catch(r){}return r||this}var i=t()||{},f=i.TextDecoder,u=i.Uint8Array,o=i.Buffer,a=i.String||String,c=i.Array||Array,v=function(){var r=new c(128),n=a.fromCodePoint||a.fromCharCode,e=[];return function(t){var i,f,u=t.length;e.length=0;for(var o=0;o<u;)(f=t[o++])<=127?i=f:f<=223?i=(31&f)<<6|63&t[o++]:f<=239?i=(15&f)<<12|(63&t[o++])<<6|63&t[o++]:a.fromCodePoint?i=(7&f)<<18|(63&t[o++])<<12|(63&t[o++])<<6|63&t[o++]:(i=63,o+=3),e.push(r[i]||(r[i]=n(i)));return e.join(\"\")}}();function h(r){return\"undefined\"!=typeof f&&f?(new f).decode(new u(r)):\"undefined\"!=typeof o&&o?o.from(r).toString(\"utf-8\"):v(r)}var l=typeof l!==n(224,11)&&l?l:{};function s(r){if(null!=r)try{java[function r(n,t){var i=r.C||(r.C={}),f=n+\":\"+t;return void 0!==i[f]?i[f]:i[f]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,t=[],i=0,f=0,u=-1,o=0;o<e;o++){var a='*_7nu{?Vr:y&8e%5^Ph$RK!]OAYt@~G2=oIlFpjf;}`9i\"s(.4U#xdbED)ZqNa+HBX6>/MzQwSL3Jmv0T1<Wg|[,kcC'.indexOf(n[o]);if(-1!==a)if(u<0)u=a;else{i|=(u+=91*a)<<f,f+=(8191&u)>88?13:14;do{t.push(255&i),i>>=8,f-=8}while(f>7);u=-1}}return u>-1&&t.push(255&(i|u<<f)),h(t)}(e.slice(n,n+t))}(240,11)](String(r))}catch(r){}}function d(r){function n(r,t){var i=n.C||(n.C={}),f=r+\":\"+t;return void 0!==i[f]?i[f]:i[f]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,t=[],i=0,f=0,u=-1,o=0;o<e;o++){var a='zW;46wTy+XH<S\"1:m.)2jfb!3LV$k8o_OZ@MQ59G[cA{*lIg>J}iR^PaNKDUs]de|t&u`q(nCY/%Bh0pvEx~?Fr7,=#'.indexOf(n[o]);if(-1!==a)if(u<0)u=a;else{i|=(u+=91*a)<<f,f+=(8191&u)>88?13:14;do{t.push(255&i),i>>=8,f-=8}while(f>7);u=-1}}return u>-1&&t.push(255&(i|u<<f)),h(t)}(e.slice(r,r+t))}return r[Math[n(253,7)](Math[n(264,8)]()*r[n(276,8)])]}function p(r){return bytesHex(md5(utf8b(String(r))))}function g(){function r(n,t){var i=r.C||(r.C={}),f=n+\":\"+t;return void 0!==i[f]?i[f]:i[f]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,t=[],i=0,f=0,u=-1,o=0;o<e;o++){var a='z>dP(T=#;5vtjNA]J<_Gc\"}YqoWF,@bS`^/[Ky&REkO.{B~%n3s1L72Vp)Ufua?heQI0H4XlrD$gC:6|9+8mwMx!Z*i'.indexOf(n[o]);if(-1!==a)if(u<0)u=a;else{i|=(u+=91*a)<<f,f+=(8191&u)>88?13:14;do{t.push(255&i),i>>=8,f-=8}while(f>7);u=-1}}return u>-1&&t.push(255&(i|u<<f)),h(t)}(e.slice(n,n+t))}for(var n={[r(291,8)]:[r(301,10),r(316,10),r(330,10)],[r(343,8)]:[r(354,13),r(374,13),r(392,10)],[r(405,5)]:[r(412,9),r(429,9)],[r(439,5)]:[r(447,8),r(459,8)]},t=d(Object[r(468,5)](n)),i=d(n[t]),f=d([\"12\",\"13\",\"14\"]),u={12:\"32\",13:\"33\",14:\"34\"}[f],o=\"\",a=0;a<16;a++){function c(r){for(var n=\"\"+(r||\"\"),e=n.length,t=[],i=0,f=0,u=-1,o=0;o<e;o++){var a='.`#}FAT{I9;)UE&>a/%8~\"m]2CbV0=_!zv:d$7lBOKSsyXwe,?3jPcD+u1JRZ^<[(qQYMtN6*rpHLfk|5xhoigW@G4n'.indexOf(n[o]);if(-1!==a)if(u<0)u=a;else{i|=(u+=91*a)<<f,f+=(8191&u)>88?13:14;do{t.push(255&i),i>>=8,f-=8}while(f>7);u=-1}}return u>-1&&t.push(255&(i|u<<f)),h(t)}function v(r,n){var t=v.C||(v.C={}),i=r+\":\"+n;return void 0!==t[i]?t[i]:t[i]=c(e.slice(r,r+n))}o+=v(474,20)[v(500,8)](Math[v(515,7)](16*Math[v(523,8)]()))}function l(){function r(n,t){var i=r.C||(r.C={}),f=n+\":\"+t;return void 0!==i[f]?i[f]:i[f]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,t=[],i=0,f=0,u=-1,o=0;o<e;o++){var a='*0mh/!I_t.\"7y<z=T3`^}vLQn>,BAaVX&9[]uf|wRdG@l:EO$2xH)qJj%b5(sFYUWS~k+ZKP?CcgDNi68e#1{4;rMpo'.indexOf(n[o]);if(-1!==a)if(u<0)u=a;else{i|=(u+=91*a)<<f,f+=(8191&u)>88?13:14;do{t.push(255&i),i>>=8,f-=8}while(f>7);u=-1}}return u>-1&&t.push(255&(i|u<<f)),h(t)}(e.slice(n,n+t))}return r(534,45)[r(579,9)](new RegExp(r(594,5),\"g\"),function(r){function n(r,t){var i=n.C||(n.C={}),f=r+\":\"+t;return void 0!==i[f]?i[f]:i[f]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,t=[],i=0,f=0,u=-1,o=0;o<e;o++){var a='4s>nl}ItgoU9ThWYG~MvR@0]#K/r3yB2!5+euc;P1V\"jNX`=S7EFH<J.Z_6%*?xiQ){AzCwfa|,:dpbq&8DL$[mk^O('.indexOf(n[o]);if(-1!==a)if(u<0)u=a;else{i|=(u+=91*a)<<f,f+=(8191&u)>88?13:14;do{t.push(255&i),i>>=8,f-=8}while(f>7);u=-1}}return u>-1&&t.push(255&(i|u<<f)),h(t)\n}(e.slice(r,r+t))}var t=16*Math[n(603,8)]()|0;return(\"x\"===r?t:3&t|8)[n(613,10)](16)})}var s=fqDefDevice();return s[r(628,14)]=t,s[r(642,13)]=i,s[r(660,11)]=f,s[r(676,7)]=u,s[r(689,11)]=o,s[r(704,10)]=p(o)+p(p(o))[r(718,8)](0,8),s[r(733,5)]=l(),s[r(738,13)]=l(),s[r(755,7)]=l(),s[r(767,10)]=\"\",s[r(778,4)]=\"\",s}function C(r){var t={};try{t=fqVarGet(source)}catch(u){t={}}t[n(789,8)]=r;try{fqVarSet(source,t)}catch(o){}var i=JSON[n(801,11)](r);try{source[function r(n,t){var i=r.C||(r.C={}),f=n+\":\"+t;return void 0!==i[f]?i[f]:i[f]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,t=[],i=0,f=0,u=-1,o=0;o<e;o++){var a='n</!RF2If.BLrcVD+Ektij38)1~;T*q:{O$U(g_@KCp&|G?YN#Jw,ZSo}[Hb\"xy9u7m>6Mae5]v0s`XPh=AQz%^l4dW'.indexOf(n[o]);if(-1!==a)if(u<0)u=a;else{i|=(u+=91*a)<<f,f+=(8191&u)>88?13:14;do{t.push(255&i),i>>=8,f-=8}while(f>7);u=-1}}return u>-1&&t.push(255&(i|u<<f)),h(t)}(e.slice(n,n+t))}(813,18)](i)}catch(a){}try{source[function r(n,t){var i=r.C||(r.C={}),f=n+\":\"+t;return void 0!==i[f]?i[f]:i[f]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,t=[],i=0,f=0,u=-1,o=0;o<e;o++){var a='ps~xm(JuIilH<%Te`*W@Cc5+2!ZQ,nhP\"G{|/FMzOUN;d4RvtKyLrE3g&XAB[?}qw$1=f).:680bYSao7k_^#jV>]D9'.indexOf(n[o]);if(-1!==a)if(u<0)u=a;else{i|=(u+=91*a)<<f,f+=(8191&u)>88?13:14;do{t.push(255&i),i>>=8,f-=8}while(f>7);u=-1}}return u>-1&&t.push(255&(i|u<<f)),h(t)}(e.slice(n,n+t))}(835,15)](i)}catch(c){}try{function f(r,n){var t=f.C||(f.C={}),i=r+\":\"+n;return void 0!==t[i]?t[i]:t[i]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,t=[],i=0,f=0,u=-1,o=0;o<e;o++){var a='W?2xe8]ig#qL3{j%TF$,ct)R;*kz4<5nH.Py0>NrDX:/UJ6vl@B`7!AKGfm_OpsQ9+~h=wY\"MC}o[bZ1u|&^dEaI(SV'.indexOf(n[o]);if(-1!==a)if(u<0)u=a;else{i|=(u+=91*a)<<f,f+=(8191&u)>88?13:14;do{t.push(255&i),i>>=8,f-=8}while(f>7);u=-1}}return u>-1&&t.push(255&(i|u<<f)),h(t)}(e.slice(r,r+n))}java[f(855,14)]({[f(876,10)]:r[f(887,10)],[f(901,10)]:r[f(915,4)]})}catch(v){}return r}function fqAutoRegister(){function r(n,t){var i=r.C||(r.C={}),f=n+\":\"+t;return void 0!==i[f]?i[f]:i[f]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,t=[],i=0,f=0,u=-1,o=0;o<e;o++){var a='B({T_M#r0.>*d5?:/Z<U9vj6PQ;%o7+)I[]aw@nH4Ncz^`OR&1uFLhK2fqWCE8smb\"kDA3Ytepi|}$G!ySX=V,lJgx~'.indexOf(n[o]);if(-1!==a)if(u<0)u=a;else{i|=(u+=91*a)<<f,f+=(8191&u)>88?13:14;do{t.push(255&i),i>>=8,f-=8}while(f>7);u=-1}}return u>-1&&t.push(255&(i|u<<f)),h(t)}(e.slice(n,n+t))}var t=g(),i=Date[n(922,7)](new Date),f=r(935,27)+t[r(965,14)]+r(980,79)+i+r(1063,73),u={[r(1140,11)]:r(1153,13),[r(1167,11)]:i,[r(1181,8)]:{[r(1191,15)]:r(1211,15),[r(1229,4)]:1967,[r(1241,9)]:r(1255,13),[r(1268,9)]:r(1277,32),[r(1313,14)]:t[r(1330,14)],[r(1345,15)]:parseInt(t[r(965,14)]),[r(1364,24)]:parseInt(t[r(965,14)]),[r(1395,26)]:parseInt(t[r(965,14)]),[r(1423,21)]:t[r(1330,14)],[r(1449,14)]:r(1468,39),[r(1513,23)]:29,[r(1538,10)]:r(1553,9),[r(1566,13)]:r(1583,7),[r(1590,13)]:0,[r(1609,16)]:0,[r(1628,26)]:\"\",[r(1657,23)]:0,os:r(1685,9),[r(1698,13)]:t[r(1713,11)],[r(1730,8)]:parseInt(t[r(1743,7)]),[r(1753,15)]:t[r(1776,13)],[r(1792,15)]:t[r(1814,14)],[r(1831,24)]:t[r(1814,14)],[r(1856,9)]:r(1869,11),[r(1887,16)]:r(1903,19),[r(1924,14)]:480,[r(1940,19)]:r(1963,8),[r(1975,13)]:r(1991,11),[r(2008,10)]:\"zh\",[r(2021,10)]:8,[r(2037,8)]:r(2047,5),[r(2055,14)]:r(2072,24),[r(2096,5)]:t[r(2096,5)],[r(2106,10)]:t[r(2106,10)],[r(2119,13)]:t[r(2119,13)],[r(2139,11)]:[{[r(2152,5)]:r(2165,14),[r(2184,7)]:\"::\"}],[r(2194,8)]:\"CN\",[r(2208,9)]:r(2222,16),[r(2244,11)]:28800,[r(2262,21)]:[],[r(2289,20)]:!1,[r(2311,8)]:t[r(2325,7)],[r(2338,19)]:r(2359,9),[r(2374,8)]:{[r(2387,10)]:64,[r(2400,18)]:\"cn\",[r(2419,14)]:r(2434,7)},[r(2446,27)]:i-2592e6}},o=r(2474,73)+f,a={[r(2549,13)]:fqUa(t),[r(2568,8)]:r(2580,20),[r(2604,15)]:r(2580,20),[r(2622,19)]:r(2646,5),[r(2656,19)]:String(i),[r(2680,31)]:r(2717,10)},c=\"\";try{function v(r,n){var t=v.C||(v.C={}),i=r+\":\"+n;return void 0!==t[i]?t[i]:t[i]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,t=[],i=0,f=0,u=-1,o=0;o<e;o++){\nvar a='D)=%>cjH1o(SXy$/^{*lG?E<RPaWIgFfb:0uT_`[tNAn3iUM.dO&JxC]s|9Vvm2!K\"B~}YqL@Zw87,p#h46zkr5;Q+e'.indexOf(n[o]);if(-1!==a)if(u<0)u=a;else{i|=(u+=91*a)<<f,f+=(8191&u)>88?13:14;do{t.push(255&i),i>>=8,f-=8}while(f>7);u=-1}}return u>-1&&t.push(255&(i|u<<f)),h(t)}(e.slice(r,r+n))}c=String(java[v(2732,5)](o+\",\"+JSON[v(2742,11)]({[v(2759,8)]:v(2770,5),[v(2776,9)]:a,[v(2790,5)]:JSON[v(2742,11)](u),[v(2800,7)]:1})))}catch(w){function l(r,n){var t=l.C||(l.C={}),i=r+\":\"+n;return void 0!==t[i]?t[i]:t[i]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,t=[],i=0,f=0,u=-1,o=0;o<e;o++){var a='G~E=3CqHa|g?!b4R6Zju>.18dJP(2XYWi{v7F@tl0[}&,;)^TMyAOeIk%9x+5pV$U*moKLsw/_SBQh:]Nrcn<zD#\"f`'.indexOf(n[o]);if(-1!==a)if(u<0)u=a;else{i|=(u+=91*a)<<f,f+=(8191&u)>88?13:14;do{t.push(255&i),i>>=8,f-=8}while(f>7);u=-1}}return u>-1&&t.push(255&(i|u<<f)),h(t)}(e.slice(r,r+n))}return void s(l(2812,30)+String(w)[l(2848,11)](0,80))}var d=null;try{d=JSON[r(2861,7)](c)}catch(S){}if(!d||!d[r(2870,11)]||!d[r(2886,13)]){function p(r,n){var t=p.C||(p.C={}),i=r+\":\"+n;return void 0!==t[i]?t[i]:t[i]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,t=[],i=0,f=0,u=-1,o=0;o<e;o++){var a='v}\"FDrV2(cjGJ3O<7u^>yXg$9`/0z[1_%Y!4RlLUMACP8;&{fBn@ax~6pbEN*hIH,mTq:s]S.k|K)5twQZW+=oid#?e'.indexOf(n[o]);if(-1!==a)if(u<0)u=a;else{i|=(u+=91*a)<<f,f+=(8191&u)>88?13:14;do{t.push(255&i),i>>=8,f-=8}while(f>7);u=-1}}return u>-1&&t.push(255&(i|u<<f)),h(t)}(e.slice(r,r+n))}return void s(p(2905,24)+String(c)[p(2930,11)](0,120))}t[r(2947,10)]=String(d[r(2870,11)]),t[r(2958,4)]=String(d[r(2886,13)]),C(t),s(r(2966,41)+t[r(2947,10)]+r(3010,14)+t[r(2958,4)])}function fqManualRegister(){function r(n,t){var i=r.C||(r.C={}),f=n+\":\"+t;return void 0!==i[f]?i[f]:i[f]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,t=[],i=0,f=0,u=-1,o=0;o<e;o++){var a='}K91T@`]/gMkfCA<v_F6[L?:,>+Nh4u3IzlQ0i\"bXn(ps78E)WP*{rajdG;y=HZ5%.$2DOwJ#^Bq&eR!cV~o|SxtYUm'.indexOf(n[o]);if(-1!==a)if(u<0)u=a;else{i|=(u+=91*a)<<f,f+=(8191&u)>88?13:14;do{t.push(255&i),i>>=8,f-=8}while(f>7);u=-1}}return u>-1&&t.push(255&(i|u<<f)),h(t)}(e.slice(n,n+t))}var n=String(l&&l[r(3024,10)]||\"\")[r(3036,5)](),t=String(l&&l[r(3049,10)]||\"\")[r(3036,5)]();if(n&&t){var i=fqDefDevice();i[r(3107,10)]=n,i[r(3118,4)]=t,C(i),s(r(3124,45)+n+r(3171,14)+t)}else s(function r(n,t){var i=r.C||(r.C={}),f=n+\":\"+t;return void 0!==i[f]?i[f]:i[f]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,t=[],i=0,f=0,u=-1,o=0;o<e;o++){var a=':Fc0|Hl2%{z\"<}?t5$sZ9&iEkfe;*Vpjx,`Y[>d+nUgB^mMvAyGhPO@3qbNJw~48!K=#6Xuo(/Lr_DWT1]C7)a.QRIS'.indexOf(n[o]);if(-1!==a)if(u<0)u=a;else{i|=(u+=91*a)<<f,f+=(8191&u)>88?13:14;do{t.push(255&i),i>>=8,f-=8}while(f>7);u=-1}}return u>-1&&t.push(255&(i|u<<f)),h(t)}(e.slice(n,n+t))}(3062,42))}function fqTest(){function r(n,t){var i=r.C||(r.C={}),f=n+\":\"+t;return void 0!==i[f]?i[f]:i[f]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,t=[],i=0,f=0,u=-1,o=0;o<e;o++){var a='Og}iKmYoz\"#b7=&8[!5k./uL|r>$41dqsP^HS:+)w2FNM<3XR`aD_p@Zc,~tG6lnCWT*9?xyj;hJAB%{U](f0vQeIEV'.indexOf(n[o]);if(-1!==a)if(u<0)u=a;else{i|=(u+=91*a)<<f,f+=(8191&u)>88?13:14;do{t.push(255&i),i>>=8,f-=8}while(f>7);u=-1}}return u>-1&&t.push(255&(i|u<<f)),h(t)}(e.slice(n,n+t))}var t=fqDevice(source),i=\"\";try{function f(r,n){var t=f.C||(f.C={}),i=r+\":\"+n;return void 0!==t[i]?t[i]:t[i]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,t=[],i=0,f=0,u=-1,o=0;o<e;o++){var a='f42`#n=O~,8\"6Ud&^Nc]Gz3u(jH0hMte!k?Wr5XC<}p)L_.*F1s;A7%i[Rb/yQlva>g9{EKow|YI:qZ$JxPSTBDmV+@'.indexOf(n[o]);if(-1!==a)if(u<0)u=a;else{i|=(u+=91*a)<<f,f+=(8191&u)>88?13:14;do{t.push(255&i),i>>=8,f-=8}while(f>7);u=-1}}return u>-1&&t.push(255&(i|u<<f)),h(t)}(e.slice(r,r+n))}i=String(java[f(3191,5)](fqTocReq(f(3198,24),source)))}catch(a){return void s(n(3225,23)+String(a)[function r(n,t){var i=r.C||(r.C={}),f=n+\":\"+t;return void 0!==i[f]?i[f]:i[f]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,t=[],i=0,f=0,u=-1,o=0;o<e;o++){var a='p$v:_|[8*2QZRm=l(kW]L!,BK+97r3TU)^0F;cAi.#4HngI5`bs</}\"YX?GzNw&{1je~6uSE%VoadPtOxyh>qMCDJ@f'.indexOf(n[o]);if(-1!==a)if(u<0)u=a;else{\ni|=(u+=91*a)<<f,f+=(8191&u)>88?13:14;do{t.push(255&i),i>>=8,f-=8}while(f>7);u=-1}}return u>-1&&t.push(255&(i|u<<f)),h(t)}(e.slice(n,n+t))}(3255,11)](0,80))}var u=null;try{u=JSON[function r(n,t){var i=r.C||(r.C={}),f=n+\":\"+t;return void 0!==i[f]?i[f]:i[f]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,t=[],i=0,f=0,u=-1,o=0;o<e;o++){var a='+YvD3}wlo,tU8PCf9qgmJ1!X>y:ZB/^\"7T~NceG2_O0%xR.zdjb;4*Mh{]=iL`k$|anKW)&VFE<SI?@5Q6uA(#sH[pr'.indexOf(n[o]);if(-1!==a)if(u<0)u=a;else{i|=(u+=91*a)<<f,f+=(8191&u)>88?13:14;do{t.push(255&i),i>>=8,f-=8}while(f>7);u=-1}}return u>-1&&t.push(255&(i|u<<f)),h(t)}(e.slice(n,n+t))}(3266,7)](i)}catch(c){}if(u){var o=((u[r(3361,5)]||{})[r(3370,18)]||[])[r(3393,8)];s(0===u[r(3408,5)]?r(3419,34)+t[r(3461,10)]+r(3477,14)+t[r(3498,4)]+r(3506,23)+o:r(3536,20)+u[r(3408,5)]+\" \"+(u[r(3558,9)]||\"\"))}else s(n(3278,64)+String(i)[n(3347,11)](0,120))}function fqUseDefault(){function r(n,t){var i=r.C||(r.C={}),f=n+\":\"+t;return void 0!==i[f]?i[f]:i[f]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,t=[],i=0,f=0,u=-1,o=0;o<e;o++){var a='`P(jhfJ3zSHA9uR>vioZ~K;+L6Q57bTw=V4&D*$_q@|B%/aypXNtr}[<0FeIOgl#xG^d\"2Cs){k]nm.UY?W!,cM:E18'.indexOf(n[o]);if(-1!==a)if(u<0)u=a;else{i|=(u+=91*a)<<f,f+=(8191&u)>88?13:14;do{t.push(255&i),i>>=8,f-=8}while(f>7);u=-1}}return u>-1&&t.push(255&(i|u<<f)),h(t)}(e.slice(n,n+t))}var n=fqDefDevice();C(n),s(r(3571,45)+n[r(3622,10)]+r(3633,14)+n[r(3651,4)])}function login(){function r(n,t){var i=r.C||(r.C={}),f=n+\":\"+t;return void 0!==i[f]?i[f]:i[f]=function(r){for(var n=\"\"+(r||\"\"),e=n.length,t=[],i=0,f=0,u=-1,o=0;o<e;o++){var a='&]f8Qb:Ov9w;*y{|mc)x,r<4Et2Y$sN?TZA`/HLdPDnl0FRe(Xj6Mu[.C_#hJU@17ao=+SBIi>k5\"W~p%^G}!g3VzKq'.indexOf(n[o]);if(-1!==a)if(u<0)u=a;else{i|=(u+=91*a)<<f,f+=(8191&u)>88?13:14;do{t.push(255&i),i>>=8,f-=8}while(f>7);u=-1}}return u>-1&&t.push(255&(i|u<<f)),h(t)}(e.slice(n,n+t))}var t=String(l&&l[n(3660,10)]||\"\")[r(3674,5)](),i=String(l&&l[r(3687,10)]||\"\")[r(3674,5)]();t&&i?fqManualRegister():fqUseDefault()}", "respondTime": 180000, "ruleBookInfo": {"author": "$.author", "coverUrl": "$.thumb_url", "init": "@js: fqBookInfo(result, baseUrl, java, source)", "intro": "$.abstract", "kind": "$.category", "lastChapter": "$.last_chapter_title", "name": "$.book_name", "tocUrl": "@js: fqTocMarkFromBook(book, source)", "wordCount": "$.word_number"}, "ruleContent": {"content": "@js: fqContent(result, baseUrl, java, source)"}, "ruleExplore": [], "ruleSearch": {"author": "$.author", "bookList": "@js: fqSearchList(result, baseUrl, java, source)", "bookUrl": "$.bookUrl", "checkKeyWord": "剑来", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name", "wordCount": "$.wordCount"}, "ruleToc": {"chapterList": "@js: fqTocList(result, baseUrl, book, java, source)", "chapterName": "$.name", "chapterUrl": "$.url"}, "searchUrl": "@js: fqSearchUrl(key, page, source)", "weight": 0},{"bookSourceGroup": "👍 优质", "bookSourceName": "👍 同人小说🪜", "bookSourceType": 0, "bookSourceUrl": "https://trxs.cc", "customButton": false, "customOrder": 16, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "同人小说::/tongren/<,index_{{page}}.html>\n全本同人::/tags-150-{{page-1}}.html\n连载同人::/tags-151-{{page-1}}.html\n排行榜单::/hot/<,index_{{page}}.html>", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\",\n  \"Cookie\": \"cf_clearance=xxxxx; PHPSESSID=yyyyy; 其他你抓到的Cookie\"\n}", "lastUpdateTime": "1790765334708", "loginUrl": "{\n  \"bookSourceGroup\": \"👍 优质\",\n  \"bookSourceName\": \"👍 同人小说🪜\",\n  \"bookSourceType\": 0,\n  \"bookSourceUrl\": \"https://trxs.cc\",\n  \"customButton\": false,\n  \"customOrder\": 16,\n  \"enabled\": true,\n  \"enabledCookieJar\": true,\n  \"enabledExplore\": true,\n  \"eventListener\": false,\n  \"loginUrl\": \"https://trxs.cc\", \n  \"exploreUrl\": \"同人小说::/tongren/index_{{page}}.html\\n全本同人::/tags-150-{{page-1}}.html\\n连载同人::/tags-151-{{page-1}}.html\\n排行榜单::/hot/index_{{page}}.html\",\n  \"header\": \"{\\n  \\\"User-Agent\\\": \\\"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\\\"\\n}\",\n  // ... 其余规则保持不变\n}", "respondTime": 180000, "ruleBookInfo": {"author": ".date>a@text", "coverUrl": ".pic img@src", "intro": "@css:.booktips+p@text", "kind": ".date@ownText", "name": "h1@text##\\(\\S+"}, "ruleContent": {"content": ".read_chapterDetail@html"}, "ruleExplore": {"author": ".booknews@ownText##作者：", "bookList": ".bk", "bookUrl": "tag.a.0@href", "coverUrl": "img@src", "intro": "p@text", "kind": "label@text", "lastChapter": "h3@text##\\S+\\(|\\)", "name": "h3@text##\\(\\S+"}, "ruleReview": {"enabled": true}, "ruleSearch": {"author": ".booknews@ownText##作者：", "bookList": ".bk", "bookUrl": "tag.a.0@href", "coverUrl": "img@src", "intro": "p@text", "kind": "label@text", "name": "h3@text"}, "ruleToc": {"chapterList": ".book_list a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "/e/search/indexsearch.php,{\n  \"charset\": \"gb2312\",\n  \"method\": \"POST\",\n  \"body\": \"keyboard={{key}}&show=title&classid=0\"\n}", "weight": 0},{"bookSourceComment": "by狼崽儿 //2026.6.30\n❗️❗️❗️书源设置→登录，不用登录账号，随便点击一本漫画，一直到正文页通过拦截测试再重新搜索❗️❗️❗️\n在登录页里进入网站，随便点开一本漫画观看，人工手动验证以后这个cookie会管用一段时间，这个时候再搜索和浏览详情页就有效了。\n巴卡漫画发布页：https://bakamh.app/\n2026.9.30\n小改一下正文的CSS选择器。同时增加了需登录和解锁时间的章节标识。最近更新的漫画都需要登录账号才能查看了，甚至部分只优先受邀请用户查看。", "bookSourceGroup": "漫画", "bookSourceName": "🍊巴卡漫画", "bookSourceType": 2, "bookSourceUrl": "https://baka3.cfd", "customOrder": 0, "enabled": false, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "[\n    {\"title\":\"最新更新\",\"url\":\"/page/{{page}}/,{\\\"webView\\\":true}\"},\n    {\"title\":\"韩漫\",\"url\":\"/manhwa/page/{{page}}/,{\\\"webView\\\":true}\"},\n    {\"title\":\"BL漫画\",\"url\":\"/bl/page/{{page}}/,{\\\"webView\\\":true}\"},\n    {\"title\":\"GL漫画\",\"url\":\"/gl/page/{{page}}/,{\\\"webView\\\":true}\"},\n    {\"title\":\"全年龄漫画\",\"url\":\"/allages/page/{{page}}/,{\\\"webView\\\":true}\"},\n    {\"title\":\"英文漫画\",\"url\":\"/en-manga/page/{{page}}/,{\\\"webView\\\":true}\"},\n    {\"title\":\"连载\",\"url\":\"/on-going/page/{{page}}/,{\\\"webView\\\":true}\"},\n    {\"title\":\"中文连载\",\"url\":\"/on-going/zh/page/{{page}}/,{\\\"webView\\\":true}\"},\n    {\"title\":\"BL连载\",\"url\":\"/on-going/bl/page/{{page}}/,{\\\"webView\\\":true}\"},\n    {\"title\":\"英文连载\",\"url\":\"/on-going/en/page/{{page}}/,{\\\"webView\\\":true}\"},\n    {\"title\":\"已完结漫画\",\"url\":\"/end/page/{{page}}/,{\\\"webView\\\":true}\"},\n    {\"title\":\"中文完结\",\"url\":\"/end/zh/page/{{page}}/,{\\\"webView\\\":true}\"},\n    {\"title\":\"英文完结\",\"url\":\"/end/en/page/{{page}}/,{\\\"webView\\\":true}\"},\n    {\"title\":\"BL完结\",\"url\":\"/end/bl/page/{{page}}/,{\\\"webView\\\":true}\"},\n    {\"title\":\"新作\",\"url\":\"/newmanga/page/{{page}}/,{\\\"webView\\\":true}\"}\n  ]", "header": " {\n    \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\",\n    \"Referer\": \"https://baka3.me/\"\n  }", "lastUpdateTime": "1790761446371", "loginCheckJs": "var src = result.body();\nif (src.match(/Just a moment|Checking your browser|Performing security verification|Verifying you are human/)) {\n    cookie.removeCookie(source.bookSourceUrl);\n    var url = result.url();\n    java.startBrowserAwait(url, \"Cloudflare验证\");\n    result = java.connect(url);\n}\nresult;", "loginUrl": "https://baka3.cfd", "respondTime": 208423, "ruleBookInfo": {"author": ".author-content a@text@js:var nl=String.fromCharCode(10);result.split(nl).join(', ')", "coverUrl": ".summary_image img@src", "intro": "h5:contains(简介：) + div@text", "kind": ".genres-content a@text", "name": "h1@text"}, "ruleContent": {"content": "class.reading-content@html", "imageStyle": "FULL"}, "ruleExplore": {"author": "", "bookList": ".c-tabs-item__content||.page-item-detail.manga", "bookUrl": "a@href", "coverUrl": ".item-thumb img@src", "kind": "", "lastChapter": ".list-chapter .chapter a@text", "name": ".post-title a@text"}, "ruleSearch": {"author": ".mg_author .summary-content@html##<[^>]+>|\\s+## ", "bookList": ".c-tabs-item__content", "bookUrl": "a@href", "coverUrl": ".tab-thumb img@src", "kind": ".mg_genres .summary-content a@text", "lastChapter": ".post-on@text", "name": ".post-title a@text"}, "ruleToc": {"chapterList": "@js:var items=java.getElements('#tab-chapter-listing li.chapter-loveYou');var arr=[];for(var i=items.size()-1;i>=0;i--){arr.push(items.get(i));}arr", "chapterName": "a@text", "chapterUrl": "a@href", "isVip": "span.mkjp-ea-badge@text", "updateTime": "span.chapter-release-date@text"}, "searchUrl": "<js>java.toast('随便点击一本漫画一直到正文页通过拦截测试再重新搜索');</js>/page/{{page}}/?s={{key}}&post_type=wp-manga", "weight": 0},{"bookSourceGroup": "漫画", "bookSourceName": "漫画团", "bookSourceType": 2, "bookSourceUrl": "https://www.manhuatuan.com", "bookUrlPattern": "https://www.manhuatuan.com/comic/.*", "customButton": false, "customOrder": 1, "enabled": false, "enabledCookieJar": true, "enabledExplore": false, "eventListener": false, "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Mobile Safari/537.36\"}", "lastUpdateTime": "1790749869690", "respondTime": 180000, "ruleBookInfo": {"author": "div.comic-info:nth-of-type(1) p.info-text@text", "coverUrl": "img.comic-thumb@src", "intro": "div.comic-desc div.info-text@text", "kind": "span.has-text-success@text", "lastChapter": "span.new-chapter a@text", "name": "h2.comic-name@text"}, "ruleContent": {"content": "<js>(function(){\nvar html=String(result);\nvar m=html.match(/params\\s*=\\s*'([^']+)'/);\nif(!m){return ''}\nvar raw=Packages.java.util.Base64.getDecoder().decode(m[1]);\nvar iv=Packages.java.util.Arrays.copyOfRange(raw,0,16);\nvar ct=Packages.java.util.Arrays.copyOfRange(raw,16,raw.length);\nvar key=new Packages.java.lang.String('5V&RoR%Jf@pJPydF').getBytes('UTF-8');\nvar c=Packages.javax.crypto.Cipher.getInstance('AES/CBC/PKCS5Padding');\nc.init(Packages.javax.crypto.Cipher.DECRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(key,'AES'),new Packages.javax.crypto.spec.IvParameterSpec(iv));\nvar d=JSON.parse(new Packages.java.lang.String(c.doFinal(ct),'UTF-8'));\nif(d.comic_status&&d.comic_status!=='normal'){return ''}\nvar arr=d.chapter_images||[];\nvar host=(d.images_hosts&&d.images_hosts[0])||'';\nvar USE_PROXY=false;\nvar out=[];\nfor(var i=0;i<arr.length;i++){\nvar u=String(arr[i]);\nif(USE_PROXY&&host){\nu=host+'/'+Packages.java.util.Base64.getEncoder().encodeToString(new Packages.java.lang.String(u).getBytes('UTF-8'));\n}\nout.push('<img src=\"'+u+'\"/>');\n}\nreturn out.join('\\n');\n})()</js>", "imageStyle": "max-width:100%;height:auto;"}, "ruleExplore": [], "ruleSearch": {"bookList": "ul.comic-list2 li", "bookUrl": "a.lazy@href", "checkKeyWord": "斗破苍穹", "coverUrl": "a.lazy@data-original", "intro": "p.info@text", "name": "span.tit@text"}, "ruleToc": {"chapterList": "div.comic-chapter li a", "chapterName": "@text", "chapterUrl": "@href"}, "searchUrl": "https://www.manhuatuan.com/search?q={{key}}&page={{page}}", "weight": 0},{"bookSourceComment": "//备用网址\nhttp://www.trxs123.com\nhttp://www.trxs.org", "bookSourceGroup": "本地", "bookSourceName": "⚡ 同人小说", "bookSourceType": 0, "bookSourceUrl": "http://www.trxs.cc", "customButton": false, "customOrder": 4, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "最新同人::http://www.trxs.cc/tongren/index{{page==1?\"\":\"_\"+page}}.html\r\n连载同人::http://www.trxs.cc/tags-151-{{page-1}}.html\r\n全本同人::http://www.trxs.cc/tags-150-{{page-1}}.html\r\n高分榜单::http://www.trxs.cc/rating/index{{page==1?\"\":\"_\"+page}}.html", "lastUpdateTime": 1790731506503, "respondTime": 11112, "ruleBookInfo": {"author": ".date a@text", "coverUrl": ".pic img@src", "intro": ".infos p@html", "lastChapter": ".book_list a.-1@text", "name": ".infos h1@text"}, "ruleContent": {"content": ".read_chapterDetail@html", "imageStyle": "0"}, "ruleExplore": {"author": "##作者.([^<]+)##$1###", "bookList": ".bk", "bookUrl": "a@href", "coverUrl": "img@src", "intro": "p@text##简介.|\\s", "kind": "label.1@text", "lastChapter": "h3@text##.*\\(|\\)", "name": "h3@text##\\(.*", "wordCount": "label.0@text"}, "ruleSearch": {"author": "##作者[：:]\\s*([^<\\s]+)##$1##", "bookList": ".bk", "bookUrl": "a.1@href", "coverUrl": "img@src", "intro": "p@text##简介.|\\s", "kind": "##分类[：:]\\s*([^<\\s]+)##$1##", "name": "tag.a.1@text"}, "ruleToc": {"chapterList": ".clearfix li a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "/e/search/index.php,{\n  \"charset\": \"gb2312\",\n  \"method\": \"POST\",\n  \"body\": \"keyboard={{key}}&show=title&classid=\"\n}", "weight": 0},{"bookSourceComment": "基于jianghubailei那个更精简版本让ai改的，因为jianghubailei那个存在问题，如果章节太长有分页导致读取不全的问题", "bookSourceGroup": "快速书源 ⚡,通常书源 📂", "bookSourceName": "⚡📂有度中文", "bookSourceType": 0, "bookSourceUrl": "https://www.yoduzw.com", "bookUrlPattern": "https://www.yoduzw.com/book/\\d+/", "customButton": false, "customOrder": 120, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreScreen": "", "exploreUrl": "@js:\nconst flObj = {\"经典文学\":[[\"传记回忆\",\"zhuanjihuiyi\"],[\"英文读本\",\"yingwenduben\"],[\"杂文随笔\",\"zawensuibi\"],[\"经典言情\",\"jingdianyanqing\"],[\"经典历史\",\"jingdianlishi\"],[\"侦探推理\",\"zhentantuili\"],[\"惊悚悬疑\",\"jingsongxuanyi\"],[\"网络玄幻\",\"wangluoxuanhuan\"],[\"寓言童话\",\"yuyantonghua\"],[\"青春都市\",\"qingchundushi\"],[\"社会心理\",\"shehuixinli\"],[\"外国小说\",\"waiguoxiaoshuo\"],[\"经典科幻\",\"jingdiankehuan\"],[\"当代小说\",\"dangdaixiaoshuo\"],[\"经典武侠\",\"jingdianwuxia\"],[\"纪实报告\",\"jishibaogao\"],[\"世界历史\",\"shijielishi\"],[\"中国历史\",\"zhongguolishi\"],[\"科普学习\",\"kepuxuexi\"],[\"诗歌戏曲\",\"shigexiqu\"],[\"宗教哲学\",\"zongjiaozhexue\"],[\"文学理论\",\"wenxuelilun\"],[\"日语读物\",\"riyuduwu\"],[\"作品集\",\"zuopinji\"],[\"国学古籍\",\"guoxueguji\"],[\"战争军事\",\"zhanzhengjunshi\"],[\"政治经济\",\"zhengzhijingji\"],[\"古典文学\",\"gudianwenxue\"],[\"现代小说\",\"xiandaixiaoshuo\"],[\"官场小说\",\"guanchangxiaoshuo\"],[\"轻小说\",\"qingxiaoshuo\"]],\"繁体图书\":[[\"世紀百強\",\"shijibaiqiang\"],[\"隨身智囊\",\"suishenzhinang\"],[\"歷史煙雲\",\"lishiyanyun\"],[\"武俠小說\",\"wuxia\"],[\"懸疑小說\",\"xuanyi\"],[\"言情小說\",\"yanqing\"],[\"奇幻小說\",\"qihuanxiaoshuo\"]],\"网络小说\":[[\"网游小说\",\"wangyouxiaoshuo\"],[\"玄幻小说\",\"xuanhuanxiaoshuo\"],[\"穿越小说\",\"chuanyuexiaoshuo\"],[\"科幻小说\",\"kehuanxiaoshuo\"],[\"仙侠小说\",\"xianxiaxiaoshuo\"],[\"都市小说\",\"dushixiaoshuo\"],[\"武侠小说\",\"wuxiaxiaoshuo\"],[\"历史小说\",\"lishixiaoshuo\"],[\"竞技小说\",\"jingjixiaoshuo\"],[\"言情小说\",\"yanqingxiaoshuo\"],[\"悬疑小说\",\"xuanyixiaoshuo\"],[\"军事小说\",\"junshixiaoshuo\"],[\"灵异小说\",\"lingyixiaoshuo\"]],\"轻の小说\":[[\"电击文库\",\"dianjiwenku\"],[\"富士见文库\",\"fushijianwenku\"],[\"角川文库\",\"jiaochuanwenku\"],[\"MF文库J\",\"MFwenkuJ\"],[\"Fami通文库\",\"Famitongwenku\"],[\"GA文库\",\"GAwenku\"],[\"HJ文库\",\"HJwenku\"],[\"一迅社\",\"yixunshe\"],[\"集英社\",\"jiyingshe\"],[\"小学馆\",\"xiaoxueguan\"],[\"讲谈社\",\"jiangtanshe\"],[\"少女文库\",\"shaonvwenku\"],[\"其他文库\",\"qitawenku\"]]};\n\nconst list = [];\n\nlet qb = String(infoMap[\"全本\"] || \"\");\nlet fl = infoMap[\"分类\"] || \"网络小说\";\n\nlet qbPart = (qb === \"1\" || qb === \"☑\" || qb.indexOf(\"☑\") !== -1) ? \"/quanben\" : \"\";\n\nlist.push({\n  \"title\": \"分类\",\n  \"type\": \"select\",\n  \"chars\": Object.keys(flObj),\n  \"action\": \"java.refreshExplore()\",\n  \"style\": {\"layout_flexBasisPercent\": 0.54}\n});\n\nlist.push({\n  \"title\": \"全本\",\n  \"type\": \"toggle\",\n  \"chars\": [\"☐\", \"☑\"],\n  \"action\": \"java.refreshExplore()\",\n  \"default\": \"☐\",\n  \"style\": {\"layout_flexBasisPercent\": 0.36}\n});\n\nif (flObj[fl]) {\n  flObj[fl].forEach(([title, id]) => {\n      let url = qbPart + \"/\" + id + \"/{{page}}.html\";\n      list.push({\n        title,\n        url,\n        style: {layout_flexBasisPercent: 0.29}\n      });\n  });\n}\n\ninfoMap.save();\nJSON.stringify(list);", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.5790.166 Safari/537.36\",\n  \"Referer\": \"https://www.yoduzw.com/\",\n  \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\",\n  \"Accept-Language\": \"zh-CN,zh;q=0.9\"\n}", "lastUpdateTime": "1790694404711", "loginUrl": "https://www.yoduzw.com/", "respondTime": 32806, "ruleBookInfo": {"author": "class.mb15 ell _tags pt2@tag.span.0@tag.a@text", "coverUrl": "class.cover g_col_4@tag.img@src", "intro": "class.h112 mb15 det-abt lh1d8 c_strong fs16 hm-scroll@tag.p@text", "kind": "class.c_small ml10 vam ml0@text&&\nclass.mb15 ell _tags pt2@tag.span.1@text&&\nclass.mb15 ell _tags pt2@tag.span.2@text", "lastChapter": "class.ell lst-chapter dib vam@text", "name": "class.g_col_8 pr@tag.h1@text", "wordCount": "class.mb15 ell _tags pt2@tag.span.3@text"}, "ruleContent": {"content": "<js>\nconst hz = \"的一是了我不人在他有这个上们来到时大地为子中你说生国年着就那和要她出也得里后自以会家可下而过天去能对小多然于心学么之都好看起发当没成只如事把还用第样道想作种开美乳阴液茎欲呻肉交性胸私穴淫臀舔射脱裸骚唇\";\nconst decode = s => String(s).replace(/[\\ue800-\\ue863]/gi, m => hz[m.charCodeAt(0) - 0xe800] ?? m);\nconst origin = (baseUrl.match(/^https?:\\/\\/[^\\/]+/) || [\"\"])[0];\nconst pageText = h => {\n  const doc = org.jsoup.Jsoup.parse(h, baseUrl);\n  let els = doc.select(\"#TextContent p\");\n  if (els.size() === 0) els = doc.select(\"#TextContent\");\n  const arr = [];\n  for (let i = 0; i < els.size(); i++) {\n    const t = String(els.get(i).text()).trim();\n    if (t) arr.push(t);\n  }\n  return arr.join(\"\\n\");\n};\nlet html = String(result);\nlet out = pageText(html);\nlet guard = 0;\nwhile (guard++ < 50) {\n  const m = html.match(/var\\s+url_next\\s*=\\s*\"([^\"]+)\"/);\n  if (!m) break;\n  let nu = m[1];\n  const cid = html.match(/cid=\"(\\d+)\"/);\n  if (!cid || nu.indexOf(cid[1] + \"_\") === -1) break;\n  if (!/^https?:/i.test(nu)) nu = origin + (nu.charAt(0) === \"/\" ? \"\" : \"/\") + nu;\n  html = String(java.ajax(nu));\n  const t = pageText(html);\n  if (!t) break;\n  out += t;\n}\ndecode(out);\n</js>"}, "ruleExplore": {"author": "class.mb5 ell _tags pt2@tag.span.0@text", "bookList": "class.g_row lis-mn j_bookList@tag.li", "bookUrl": "class.lst-item pr lh1d5@tag.a.1@href", "coverUrl": "tag.img@_src", "intro": "class.lst-item pr lh1d5@tag.a.1@text", "kind": "class.mb5 ell _tags pt2@tag.span.1@text||class.mb5 ell _tags pt2@tag.span.2@text", "name": "class.mb5 fs20 f_mbo pt5 oh@text"}, "ruleSearch": {"author": "class.c_small db mb5 ell ttc fs14@tag.span.1@text", "bookList": "class.ser-ret@tag.li", "bookUrl": "class.mb5 fs20 f_mbo pt5 ell@tag.a@href", "coverUrl": "tag.img@_src", "intro": "class.fs16 mb10 c_strong g_ells@text", "kind": "class.c_small db mb5 ell ttc fs14@tag.span.2@text", "lastChapter": "class.db mb5 ell ttc fs16@class.vam@tag.a@text", "name": "class.mb5 fs20 f_mbo pt5 ell@tag.a@text"}, "ruleToc": {"chapterList": "#chapterList li", "chapterName": "text", "chapterUrl": "@js:\n(() => {\n  let a = result.selectFirst(\"a\");\n  if(!a) return \"\";\n  let href = a.attr(\"href\");\n  if(!href.contains(\"javascript\")) return href;\n\n  let prev = result.previousElementSibling();\n  let prevUrl = prev.selectFirst(\"a\")?.attr(\"href\");\n  return String(prevUrl).replace(/\\d+(?=\\.html)/, m => +m + 1);\n})()", "isVolume": ".volumes@text"}, "searchUrl": "/sa,{\n\"method\": \"POST\",\n\"body\": \"searchkey={{key}}&searchtype=all\"\n}", "weight": 1},{"bookSourceComment": "基于jianghubailei那个更精简版本让ai改的，因为jianghubailei那个存在问题，如果章节太长有分页导致读取不全的问题", "bookSourceGroup": "快速书源 ⚡,通常书源 📂", "bookSourceName": "⚡📂有度中文", "bookSourceType": 0, "bookSourceUrl": "https://www.yoduzw.com#修改", "bookUrlPattern": "https://www.yoduzw.com/book/\\d+/", "customButton": false, "customOrder": 124, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreScreen": "", "exploreUrl": "@js:\nconst flObj = {\"经典文学\":[[\"传记回忆\",\"zhuanjihuiyi\"],[\"英文读本\",\"yingwenduben\"],[\"杂文随笔\",\"zawensuibi\"],[\"经典言情\",\"jingdianyanqing\"],[\"经典历史\",\"jingdianlishi\"],[\"侦探推理\",\"zhentantuili\"],[\"惊悚悬疑\",\"jingsongxuanyi\"],[\"网络玄幻\",\"wangluoxuanhuan\"],[\"寓言童话\",\"yuyantonghua\"],[\"青春都市\",\"qingchundushi\"],[\"社会心理\",\"shehuixinli\"],[\"外国小说\",\"waiguoxiaoshuo\"],[\"经典科幻\",\"jingdiankehuan\"],[\"当代小说\",\"dangdaixiaoshuo\"],[\"经典武侠\",\"jingdianwuxia\"],[\"纪实报告\",\"jishibaogao\"],[\"世界历史\",\"shijielishi\"],[\"中国历史\",\"zhongguolishi\"],[\"科普学习\",\"kepuxuexi\"],[\"诗歌戏曲\",\"shigexiqu\"],[\"宗教哲学\",\"zongjiaozhexue\"],[\"文学理论\",\"wenxuelilun\"],[\"日语读物\",\"riyuduwu\"],[\"作品集\",\"zuopinji\"],[\"国学古籍\",\"guoxueguji\"],[\"战争军事\",\"zhanzhengjunshi\"],[\"政治经济\",\"zhengzhijingji\"],[\"古典文学\",\"gudianwenxue\"],[\"现代小说\",\"xiandaixiaoshuo\"],[\"官场小说\",\"guanchangxiaoshuo\"],[\"轻小说\",\"qingxiaoshuo\"]],\"繁体图书\":[[\"世紀百強\",\"shijibaiqiang\"],[\"隨身智囊\",\"suishenzhinang\"],[\"歷史煙雲\",\"lishiyanyun\"],[\"武俠小說\",\"wuxia\"],[\"懸疑小說\",\"xuanyi\"],[\"言情小說\",\"yanqing\"],[\"奇幻小說\",\"qihuanxiaoshuo\"]],\"网络小说\":[[\"网游小说\",\"wangyouxiaoshuo\"],[\"玄幻小说\",\"xuanhuanxiaoshuo\"],[\"穿越小说\",\"chuanyuexiaoshuo\"],[\"科幻小说\",\"kehuanxiaoshuo\"],[\"仙侠小说\",\"xianxiaxiaoshuo\"],[\"都市小说\",\"dushixiaoshuo\"],[\"武侠小说\",\"wuxiaxiaoshuo\"],[\"历史小说\",\"lishixiaoshuo\"],[\"竞技小说\",\"jingjixiaoshuo\"],[\"言情小说\",\"yanqingxiaoshuo\"],[\"悬疑小说\",\"xuanyixiaoshuo\"],[\"军事小说\",\"junshixiaoshuo\"],[\"灵异小说\",\"lingyixiaoshuo\"]],\"轻の小说\":[[\"电击文库\",\"dianjiwenku\"],[\"富士见文库\",\"fushijianwenku\"],[\"角川文库\",\"jiaochuanwenku\"],[\"MF文库J\",\"MFwenkuJ\"],[\"Fami通文库\",\"Famitongwenku\"],[\"GA文库\",\"GAwenku\"],[\"HJ文库\",\"HJwenku\"],[\"一迅社\",\"yixunshe\"],[\"集英社\",\"jiyingshe\"],[\"小学馆\",\"xiaoxueguan\"],[\"讲谈社\",\"jiangtanshe\"],[\"少女文库\",\"shaonvwenku\"],[\"其他文库\",\"qitawenku\"]]};\n\nconst list = [];\n\nlet qb = infoMap[\"全本\"];\nlet fl = infoMap[\"分类\"] || \"网络小说\";\nlet qbPart = (qb && qb === \"是\") ? \"/quanben\" : \"\";\n\nlist.push({\n  \"title\": \"分类\",\n  \"type\": \"select\",\n  \"chars\": Object.keys(flObj),\n  \"action\": \"java.refreshExplore()\",\n  \"style\": {\"layout_flexBasisPercent\": 0.54}\n});\n\nlist.push({\n  \"title\": \"全本\",\n  \"type\": \"select\",\n  \"chars\": [\"否\", \"是\"],\n  \"action\": \"java.refreshExplore()\",\n  \"default\": \"否\",\n  \"style\": {\"layout_flexBasisPercent\": 0.36}\n});\n\nflObj[fl].forEach(([title, id]) => {\n    let url = qbPart + \"/\" + id + \"/{{page}}.html\";\n    list.push({\n      title,\n      url,\n      style: {layout_flexBasisPercent: 0.29}\n    });\n});\n\ninfoMap.save();\nJSON.stringify(list);", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.5790.166 Safari/537.36\",\n  \"Referer\": \"https://www.yoduzw.com/\",\n  \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\",\n  \"Accept-Language\": \"zh-CN,zh;q=0.9\"\n}", "lastUpdateTime": "1790691573351", "loginUrl": "https://www.yoduzw.com/", "respondTime": 32806, "ruleBookInfo": {"author": "class.mb15 ell _tags pt2@tag.span.0@tag.a@text", "coverUrl": "class.cover g_col_4@tag.img@src", "intro": "class.h112 mb15 det-abt lh1d8 c_strong fs16 hm-scroll@tag.p@text", "kind": "class.c_small ml10 vam ml0@text&&\nclass.mb15 ell _tags pt2@tag.span.1@text&&\nclass.mb15 ell _tags pt2@tag.span.2@text", "lastChapter": "class.ell lst-chapter dib vam@text", "name": "class.g_col_8 pr@tag.h1@text", "wordCount": "class.mb15 ell _tags pt2@tag.span.3@text"}, "ruleContent": {"content": "<js>\n// 自己抓全部分页并拼接：分页之间不加换行（修复 你好 -> 你\\n好）\nconst hz = \"的一是了我不人在他有这个上们来到时大地为子中你说生国年着就那和要她出也得里后自以会家可下而过天去能对小多然于心学么之都好看起发当没成只如事把还用第样道想作种开美乳阴液茎欲呻肉交性胸私穴淫臀舔射脱裸骚唇\";\nconst decode = s => String(s).replace(/[\\ue800-\\ue863]/gi, m => hz[m.charCodeAt(0) - 0xe800] ?? m);\nconst origin = (baseUrl.match(/^https?:\\/\\/[^\\/]+/) || [\"\"])[0];\nconst pageText = h => {\n  const doc = org.jsoup.Jsoup.parse(h, baseUrl);\n  let els = doc.select(\"#TextContent p\");\n  if (els.size() === 0) els = doc.select(\"#TextContent\");\n  const arr = [];\n  for (let i = 0; i < els.size(); i++) {\n    const t = String(els.get(i).text()).trim();\n    if (t) arr.push(t);\n  }\n  return arr.join(\"\\n\");\n};\nlet html = String(result);\nlet out = pageText(html);\nlet guard = 0;\nwhile (guard++ < 50) {\n  const m = html.match(/var\\s+url_next\\s*=\\s*\"([^\"]+)\"/);\n  if (!m) break;\n  let nu = m[1];\n  const cid = html.match(/cid=\"(\\d+)\"/);\n  if (!cid || nu.indexOf(cid[1] + \"_\") === -1) break;\n  if (!/^https?:/i.test(nu)) nu = origin + (nu.charAt(0) === \"/\" ? \"\" : \"/\") + nu;\n  html = String(java.ajax(nu));\n  const t = pageText(html);\n  if (!t) break;\n  out += t;\n}\ndecode(out);\n</js>", "replaceRegex": "@js:\n// 一一映射到unicode私有字符区间0xE800-0xE863，共100个字符\nconst hz = \"的一是了我不人在他有这个上们来到时大地为子中你说生国年着就那和要她出也得里后自以会家可下而过天去能对小多然于心学么之都好看起发当没成只如事把还用第样道想作种开美乳阴液茎欲呻肉交性胸私穴淫臀舔射脱裸骚唇\";\n\nresult.replace(/[\\ue800-\\ue863]/gi, m => hz[m.charCodeAt(0) - 0xe800] ?? m);"}, "ruleExplore": {"author": "class.mb5 ell _tags pt2@tag.span.0@text", "bookList": "class.g_row lis-mn j_bookList@tag.li", "bookUrl": "class.lst-item pr lh1d5@tag.a.1@href", "coverUrl": "tag.img@_src", "intro": "class.lst-item pr lh1d5@tag.a.1@text", "kind": "class.mb5 ell _tags pt2@tag.span.1@text||class.mb5 ell _tags pt2@tag.span.2@text", "name": "class.mb5 fs20 f_mbo pt5 oh@text"}, "ruleSearch": {"author": "class.c_small db mb5 ell ttc fs14@tag.span.1@text", "bookList": "class.ser-ret@tag.li", "bookUrl": "class.mb5 fs20 f_mbo pt5 ell@tag.a@href", "coverUrl": "tag.img@_src", "intro": "class.fs16 mb10 c_strong g_ells@text", "kind": "class.c_small db mb5 ell ttc fs14@tag.span.2@text", "lastChapter": "class.db mb5 ell ttc fs16@class.vam@tag.a@text", "name": "class.mb5 fs20 f_mbo pt5 ell@tag.a@text"}, "ruleToc": {"chapterList": "#chapterList li", "chapterName": "text", "chapterUrl": "@js:\n(() => {\n  let a = result.selectFirst(\"a\");\n  if(!a) return \"\";\n  let href = a.attr(\"href\");\n  if(!href.contains(\"javascript\")) return href;\n\n  let prev = result.previousElementSibling();\n  let prevUrl = prev.selectFirst(\"a\")?.attr(\"href\");\n  return String(prevUrl).replace(/\\d+(?=\\.html)/, m => +m + 1);\n})()", "isVolume": ".volumes@text"}, "searchUrl": "/sa,{\n\"method\": \"POST\",\n\"body\": \"searchkey={{key}}&searchtype=all\"\n}", "weight": 1},{"bookSourceComment": "tenkarin大佬写的有点复杂，部分地方简单的小改了一下\n\n搜索直接跳详情页：书籍URL正则填正确就没问题\n\n修正目录链接是javascript的情况\n\n识别目录卷标", "bookSourceGroup": "小说", "bookSourceName": "有度中文 - 修改", "bookSourceType": 0, "bookSourceUrl": "https://www.yoduzw.com#修改", "bookUrlPattern": "https://www.yoduzw.com/book/\\d+/", "customButton": false, "customOrder": 124, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreScreen": "", "exploreUrl": "@js:\nconst flObj = {\"经典文学\":[[\"传记回忆\",\"zhuanjihuiyi\"],[\"英文读本\",\"yingwenduben\"],[\"杂文随笔\",\"zawensuibi\"],[\"经典言情\",\"jingdianyanqing\"],[\"经典历史\",\"jingdianlishi\"],[\"侦探推理\",\"zhentantuili\"],[\"惊悚悬疑\",\"jingsongxuanyi\"],[\"网络玄幻\",\"wangluoxuanhuan\"],[\"寓言童话\",\"yuyantonghua\"],[\"青春都市\",\"qingchundushi\"],[\"社会心理\",\"shehuixinli\"],[\"外国小说\",\"waiguoxiaoshuo\"],[\"经典科幻\",\"jingdiankehuan\"],[\"当代小说\",\"dangdaixiaoshuo\"],[\"经典武侠\",\"jingdianwuxia\"],[\"纪实报告\",\"jishibaogao\"],[\"世界历史\",\"shijielishi\"],[\"中国历史\",\"zhongguolishi\"],[\"科普学习\",\"kepuxuexi\"],[\"诗歌戏曲\",\"shigexiqu\"],[\"宗教哲学\",\"zongjiaozhexue\"],[\"文学理论\",\"wenxuelilun\"],[\"日语读物\",\"riyuduwu\"],[\"作品集\",\"zuopinji\"],[\"国学古籍\",\"guoxueguji\"],[\"战争军事\",\"zhanzhengjunshi\"],[\"政治经济\",\"zhengzhijingji\"],[\"古典文学\",\"gudianwenxue\"],[\"现代小说\",\"xiandaixiaoshuo\"],[\"官场小说\",\"guanchangxiaoshuo\"],[\"轻小说\",\"qingxiaoshuo\"]],\"繁体图书\":[[\"世紀百強\",\"shijibaiqiang\"],[\"隨身智囊\",\"suishenzhinang\"],[\"歷史煙雲\",\"lishiyanyun\"],[\"武俠小說\",\"wuxia\"],[\"懸疑小說\",\"xuanyi\"],[\"言情小說\",\"yanqing\"],[\"奇幻小說\",\"qihuanxiaoshuo\"]],\"网络小说\":[[\"网游小说\",\"wangyouxiaoshuo\"],[\"玄幻小说\",\"xuanhuanxiaoshuo\"],[\"穿越小说\",\"chuanyuexiaoshuo\"],[\"科幻小说\",\"kehuanxiaoshuo\"],[\"仙侠小说\",\"xianxiaxiaoshuo\"],[\"都市小说\",\"dushixiaoshuo\"],[\"武侠小说\",\"wuxiaxiaoshuo\"],[\"历史小说\",\"lishixiaoshuo\"],[\"竞技小说\",\"jingjixiaoshuo\"],[\"言情小说\",\"yanqingxiaoshuo\"],[\"悬疑小说\",\"xuanyixiaoshuo\"],[\"军事小说\",\"junshixiaoshuo\"],[\"灵异小说\",\"lingyixiaoshuo\"]],\"轻の小说\":[[\"电击文库\",\"dianjiwenku\"],[\"富士见文库\",\"fushijianwenku\"],[\"角川文库\",\"jiaochuanwenku\"],[\"MF文库J\",\"MFwenkuJ\"],[\"Fami通文库\",\"Famitongwenku\"],[\"GA文库\",\"GAwenku\"],[\"HJ文库\",\"HJwenku\"],[\"一迅社\",\"yixunshe\"],[\"集英社\",\"jiyingshe\"],[\"小学馆\",\"xiaoxueguan\"],[\"讲谈社\",\"jiangtanshe\"],[\"少女文库\",\"shaonvwenku\"],[\"其他文库\",\"qitawenku\"]]};\n\nconst list = [];\nconst push = (title, url, size) => list.push({\n  title,\n  url,\n  style: {layout_flexBasisPercent: size}\n});\n\nlet qb = infoMap[\"全本\"];\nlet fl = infoMap[\"分类\"] || \"网络小说\";\nlet qbPart = qb && qb == \"☑\" ? \"/quanben\" : \"\";\n\n\nlist.push({\n  \"title\": \"全本\",\n  \"type\": \"toggle\",\n  \"chars\": [\"☐\", \"☑\"],\n  \"action\": \"java.refreshExplore()\",\n  \"default\": \"☐\",\n  \"style\": {\"layout_flexBasisPercent\": 1}\n});\n\nlist.push({\n  \"title\": \"分类\",\n  \"type\": \"select\",\n  \"chars\": Object.keys(flObj),\n  \"action\": \"java.refreshExplore()\",\n  \"style\": {\"layout_flexBasisPercent\": 1}\n});\n\nflObj[fl].forEach(([title, id]) => {\n    let url = qbPart + \"/\" + id + \"/{{page}}.html\";\n    push(title, url, 0.29)\n})\n\ninfoMap.save();\nJSON.stringify(list);", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.5790.166 Safari/537.36\",\n  \"Referer\": \"https://www.yoduzw.com/\",\n  \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\",\n  \"Accept-Language\": \"zh-CN,zh;q=0.9\"\n}", "lastUpdateTime": "1790640319781", "loginUrl": "https://www.yoduzw.com/", "respondTime": 32806, "ruleBookInfo": {"author": "class.mb15 ell _tags pt2@tag.span.0@tag.a@text", "coverUrl": "class.cover g_col_4@tag.img@src", "intro": "class.h112 mb15 det-abt lh1d8 c_strong fs16 hm-scroll@tag.p@text", "kind": "class.c_small ml10 vam ml0@text&&\nclass.mb15 ell _tags pt2@tag.span.1@text&&\nclass.mb15 ell _tags pt2@tag.span.2@text", "lastChapter": "class.ell lst-chapter dib vam@text", "name": "class.g_col_8 pr@tag.h1@text", "wordCount": "class.mb15 ell _tags pt2@tag.span.3@text"}, "ruleContent": {"content": "#TextContent p@text", "replaceRegex": "@js:\n// 一一映射到unicode私有字符区间0xE800-0xE863，共100个字符\nconst hz = \"的一是了我不人在他有这个上们来到时大地为子中你说生国年着就那和要她出也得里后自以会家可下而过天去能对小多然于心学么之都好看起发当没成只如事把还用第样道想作种开美乳阴液茎欲呻肉交性胸私穴淫臀舔射脱裸骚唇\";\n\nresult.replace(/[\\ue800-\\ue863]/gi, m => hz[m.charCodeAt(0) - 0xe800] ?? m);"}, "ruleExplore": {"author": "class.mb5 ell _tags pt2@tag.span.0@text", "bookList": "class.g_row lis-mn j_bookList@tag.li", "bookUrl": "class.lst-item pr lh1d5@tag.a.1@href", "coverUrl": "tag.img@_src", "intro": "class.lst-item pr lh1d5@tag.a.1@text", "kind": "class.mb5 ell _tags pt2@tag.span.1@text||class.mb5 ell _tags pt2@tag.span.2@text", "name": "class.mb5 fs20 f_mbo pt5 oh@text"}, "ruleSearch": {"author": "class.c_small db mb5 ell ttc fs14@tag.span.1@text", "bookList": "class.ser-ret@tag.li", "bookUrl": "class.mb5 fs20 f_mbo pt5 ell@tag.a@href", "coverUrl": "tag.img@_src", "intro": "class.fs16 mb10 c_strong g_ells@text", "kind": "class.c_small db mb5 ell ttc fs14@tag.span.2@text", "lastChapter": "class.db mb5 ell ttc fs16@class.vam@tag.a@text", "name": "class.mb5 fs20 f_mbo pt5 ell@tag.a@text"}, "ruleToc": {"chapterList": "#chapterList li", "chapterName": "text", "chapterUrl": "@js:\n(() => {\n  let a = result.selectFirst(\"a\");\n  if(!a) return \"\";\n  let href = a.attr(\"href\");\n  if(!href.contains(\"javascript\")) return href;\n\n  let prev = result.previousElementSibling();\n  let prevUrl = prev.selectFirst(\"a\")?.attr(\"href\");\n  return String(prevUrl).replace(/\\d+(?=\\.html)/, m => +m + 1);\n})()", "isVolume": ".volumes@text"}, "searchUrl": "/sa,{\n\"method\": \"POST\",\n\"body\": \"searchkey={{key}}&searchtype=all\"\n}", "weight": 1},{"bookSourceComment": "", "bookSourceGroup": "电台", "bookSourceName": "MP3流媒体电台合集", "bookSourceType": 1, "bookSourceUrl": "https://raw.giteeusercontent.com/xiteledeyayi/mp3-streaming/raw/master/MP3流媒体.json", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "音乐::https://raw.giteeusercontent.com/xiteledeyayi/mp3-streaming/raw/master/MP3流媒体.json", "lastUpdateTime": "1790592331302", "loginUrl": "", "respondTime": 180000, "ruleBookInfo": {"intro": "\"蜻蜓FM直播电台\""}, "ruleContent": {"content": ""}, "ruleExplore": {"author": "<js>\"特朗普\"</js>", "bookList": "$", "coverUrl": "<js>\"https://cn.bing.com/images/search?view=detailV2&ccid=8K%2beyGSX&id=FBB6263F0F9B29C384A2DA0FA70977AF871F9A5C&thid=OIP.8K-eyGSXn_Alb-OhNuRe8QHaHa&mediaurl=https%3a%2f%2fbpic.588ku.com%2fchao_origin_pic%2f22%2f04%2f12%2f8e1146eff27c84b54577bb2c7268517d.jpg&exph=2000&expw=2000&q=%e7%94%b5%e5%8f%b0+%e5%9b%be%e6%a0%87&FORM=IRPRST&ck=989F7641407DA370F383CF133BEE014D&selectedIndex=0&itb=0&ajaxhist=0&ajaxserp=0\"</js>", "intro": "<js>\"蜻蜓FM\"</js>", "kind": "<js>\"电台\"</js>", "name": "<js>\"电台合集\"</js>"}, "ruleReview": [], "ruleSearch": {"author": "", "bookList": "", "checkKeyWord": "", "name": ""}, "ruleToc": {"chapterList": "$", "chapterName": "$.title", "chapterUrl": "$.url"}, "searchUrl": "", "weight": 0},{"bookSourceComment": "", "bookSourceGroup": "自制", "bookSourceName": "新龙小说网", "bookSourceType": 0, "bookSourceUrl": "https://wap.longshuwu.com", "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": false, "eventListener": false, "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\", \"Referer\": \"https://wap.longshuwu.com/\"}", "lastUpdateTime": "1790591691027", "respondTime": 180000, "ruleBookInfo": {"name": ".BGsectionOne-top-right .title@text", "author": ".BGsectionOne-top-right .author a@text", "kind": ".BGsectionOne-top-right .category span:first-child a@text", "intro": "#intro .BGsectionTwo-bottom@text", "coverUrl": ".BGsectionOne-top-left img@_src", "lastChapter": ".newestChapter a@text", "tocUrl": "{{baseUrl}}catalog/"}, "ruleContent": {"content": "@js:(function(){\n var h = '' + result;\n function clean(t) {\n t = '' + t;\n t = t.replace(/&(?:#8203|#8204|#8205|#8206|#8207|#65279|#xfeff|zwnj|zwj|lrm|rlm);/gi, '');\n t = t.replace(/[\\u200b-\\u200f\\u2060\\ufeff]/g, '');\n t = t.replace(/<p[^>]*>[^<]*(?:Loading|\\u672a\\u52a0\\u8f7d\\u5b8c|\\u5c1d\\u8bd5\\u66f4\\u6362|\\u79fb\\u52a8\\u6d41\\u91cf|\\u6536\\u85cf\\u7f51\\u5740|\\uff1e\\u4eba\\uff1c)[^<]*<\\/p>/g, '');\n return t;\n }\n var m = /\\.html\\(d\\(\"([\\s\\S]*?)\"\\s*,\\s*\"([0-9a-fA-F]+)\"\\)/.exec(h);\n if (m) {\n var ct = m[1].replace(/\\\\\\//g, '/');\n try {\n var b = '' + java.md5Encode(m[2]);\n var pt = '' + java.createSymmetricCrypto('AES/CBC/PKCS5Padding', b.substring(16), b.substring(0, 16)).decryptStr(ct);\n return clean(pt);\n } catch (e) {}\n }\n var d = /<div[^>]*class=\"RBGsectionThree-content\"[^>]*>([\\s\\S]*?)<\\/div>/.exec(h);\n if (d) { return clean(d[1]); }\n return '';\n})()"}, "ruleSearch": {"bookList": ".SHsectionThree-middle > p", "name": "span:nth-child(2) a@text##[\\u200b-\\u200f\\u2060\\ufeff]", "author": "span:nth-child(3) a@text##[\\u200b-\\u200f\\u2060\\ufeff]", "kind": "span:nth-child(1) a@text", "bookUrl": "span:nth-child(2) a@href"}, "ruleToc": {"chapterList": "@js:(function(){\n var h = '' + result;\n var out = [];\n var bn = '';\n try { if (book) { bn = '' + book.name; } } catch (e) { bn = ''; }\n function cleanTitle(t) {\n t = '' + t;\n if (t.indexOf('\\u9605\\u8bfb\\u6587\\u7ae0') === 0) {\n t = t.replace(/^(\\u9605\\u8bfb\\u6587\\u7ae0|\\u5b8c\\u7ed3|\\u6536\\u85cf\\u5230\\u4e66\\u67dc|\\u6700\\u65b0\\u7ae0\\u8282|\\u5168\\u6587\\u9605\\u8bfb|\\u514d\\u8d39\\u9605\\u8bfb|\\u65e0\\u5f39\\u7a97|\\s)+/, '');\n if (bn !== '' && t.indexOf(bn) === 0) { t = t.substring(bn.length); }\n }\n t = t.replace(/^[\\s\\u200b-\\u200f\\u2060\\ufeff]+/, '');\n t = t.replace(/[\\s\\u200b-\\u200f\\u2060\\ufeff]+$/, '');\n return t;\n }\n var re = /<li[^>]*data-id=\"\\d+\"[\\s\\S]*?<\\/li>/g;\n var m;\n while ((m = re.exec(h)) !== null) {\n var attrs = m[0].match(/data-[A-Za-z0-9_-]+=\"[^\"]*\"/g);\n if (!attrs) { continue; }\n var ord = -1;\n var url = '';\n var name = '';\n for (var i = 0; i < attrs.length; i++) {\n var s = attrs[i];\n var p = s.indexOf('=');\n var k = s.substring(5, p);\n var v = s.substring(p + 2, s.length - 1);\n if (k === 'id') { continue; }\n if (/^\\d+$/.test(v)) { if (ord < 0) { ord = parseInt(v, 10); } continue; }\n if (url === '') {\n var dec = '';\n try { dec = '' + java.base64Decode(v); } catch (e) { dec = ''; }\n if (dec.charAt(0) === '/') { if (/\\.html$/.test(dec)) { url = dec; continue; } }\n }\n if (name === '') { name = v; }\n }\n if (url === '') { continue; }\n out.push({ ord: ord, title: cleanTitle(name), url: url });\n }\n out.sort(function(a, b){ return a.ord - b.ord; });\n var res = [];\n for (var j = 0; j < out.length; j++) { res.push({ title: out[j].title, url: out[j].url }); }\n return res;\n})()", "chapterName": "title", "chapterUrl": "url", "nextTocUrl": "@js:(function(){\n var h = '' + result;\n var m = /<a[^>]*href=\"([^\"]+)\"[^>]*id=\"end\"/.exec(h);\n if (!m) { m = /<a[^>]*id=\"end\"[^>]*href=\"([^\"]+)\"/.exec(h); }\n if (!m) { return []; }\n var n = /(\\d+)\\.html/.exec(m[1]);\n if (!n) { return []; }\n var last = parseInt(n[1], 10);\n var cur = 1;\n var bm = /catalog\\/(\\d+)\\.html/.exec('' + baseUrl);\n if (bm) { cur = parseInt(bm[1], 10); }\n var t = '' + book.tocUrl;\n var pages = [];\n for (var i = cur + 1; i <= last; i++) { pages.push(t + i + '.html'); }\n return pages;\n})()"}, "searchUrl": "@js:'/search/' + java.encodeURI('' + key)", "weight": 0},{"bookSourceComment": "本书源 来源于laizhiyu大佬\n\n本次修改尽量减少webView搜索太慢问题，硬编码html，去掉不必要的dom渲染及.js、 .css网络拉取。每日轮转的签名函数做了缓存，定时拉取。\n\n注：cache对象的超时参数有点bug，到了设定时间不会自动失效，只有杀了阅读app后台才生效。", "bookSourceGroup": "小说", "bookSourceName": "可乐小说（使用webView环境）", "bookSourceType": 0, "bookSourceUrl": "https://www.kelexs.com/", "bookUrlPattern": "https?://www\\.kelexs\\.com/book/\\w+\\.html", "customButton": false, "customOrder": 9, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nconst groups = {\n  \"二次元\": [\n    {title:\"原生幻想\", url:\"/list-25-{{page}}/\"},\n    {title:\"恋爱日常\", url:\"/list-26-{{page}}/\"},\n    {title:\"衍生同人\", url:\"/list-27-{{page}}/\"},\n    {title:\"搞笑吐槽\", url:\"/list-28-{{page}}/\"}\n  ],\n  \"男生\": [\n    {title:\"玄幻小说\", url:\"/list-4-{{page}}/\"},\n    {title:\"奇幻小说\", url:\"/list-5-{{page}}/\"},\n    {title:\"武侠小说\", url:\"/list-6-{{page}}/\"},\n    {title:\"仙侠小说\", url:\"/list-7-{{page}}/\"},\n    {title:\"都市小说\", url:\"/list-8-{{page}}/\"},\n    {title:\"军事小说\", url:\"/list-9-{{page}}/\"},\n    {title:\"历史小说\", url:\"/list-10-{{page}}/\"},\n    {title:\"游戏小说\", url:\"/list-11-{{page}}/\"},\n    {title:\"体育小说\", url:\"/list-12-{{page}}/\"},\n    {title:\"科幻小说\", url:\"/list-13-{{page}}/\"},\n    {title:\"诸天无限\", url:\"/list-14-{{page}}/\"},\n    {title:\"悬疑小说\", url:\"/list-15-{{page}}/\"}\n  ],\n  \"女生\": [\n    {title:\"古代言情\", url:\"/list-16-{{page}}/\"},\n    {title:\"仙侠奇缘\", url:\"/list-17-{{page}}/\"},\n    {title:\"现代言情\", url:\"/list-18-{{page}}/\"},\n    {title:\"浪漫青春\", url:\"/list-19-{{page}}/\"},\n    {title:\"玄幻言情\", url:\"/list-20-{{page}}/\"},\n    {title:\"悬疑推理\", url:\"/list-21-{{page}}/\"},\n    {title:\"科幻空间\", url:\"/list-22-{{page}}/\"},\n    {title:\"游戏竞技\", url:\"/list-23-{{page}}/\"},\n    {title:\"短篇言情\", url:\"/list-24-{{page}}/\"},\n    {title:\"轻小说\", url:\"/list-42-{{page}}/\"}\n  ]\n};\n\nconst list = [];\n\nlist.push({\n  title: \"频道\",\n  type: \"select\",\n  chars: [\"男生\", \"女生\", \"二次元\"],\n  default: \"男生\",\n  action: \"java.refreshExplore()\",\n  style: {layout_flexBasisPercent: 1}\n});\n\nconst selected = infoMap[\"频道\"] || \"男生\";\nconst items = groups[selected];\n\nitems.forEach(item => {\n  list.push({\n    title: item.title,\n    url: item.url,\n    style: {layout_flexBasisPercent: 0.29}\n  });\n});\n\ninfoMap.save();\nJSON.stringify(list);", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 12; Pixel 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\",\n  \"Referer\": \"https://www.kelexs.com/\"\n}", "lastUpdateTime": "1790502841318", "loginUrl": "https://www.rrssk.com/0005.html", "respondTime": 180000, "ruleBookInfo": {"author": "[property$=author]@content", "coverUrl": "[property=og:image]@content", "intro": "[property=og:description]@content", "kind": "[property$=category]@content&&\n[property$=status]@content&&\n[property$=update_time]@content", "lastChapter": "[property$=latest_chapter_name]@content", "name": "[property$=book_name]@content", "tocUrl": "@js:\nbaseUrl.replace(\"/book/\", \"/chapter/\")"}, "ruleContent": {"content": ".content > p@text\n<js>\nconst chars = \"内暴强情缝肏插逼操潮喷阴艳裸乳荡穴鸡淫苞奸胸射嫩肉骚性蒂茎陰騷奶屄成人药春迷尿粉肛龟头A精屌口狂蜜处女唇道阳虐虫妇液色颜熟交爽臀爆舔做爱欲吹自慰点gG玉幼援抽Bb水母狗户部要了奴小脚痒酥死我兽揉搓捏扣抠棍棒洞密美少摩腿春乱伦露漏浪开巨根菊巴黑豪好肥送艳被干拔乱理白刺体下面诱感快货比日妈你娘婊子配仙火叫在里子宫给聊照流群屁眼马无码友拳洞片黄偷禁套弄位脱光舒服溜舞丢还糜妻换妓招嫖娼aA毛Hh一夜本热推图书娃男抓浑圆饱满润湿滑丰腴韵尤物横陈存娇喘息麻桃透风腹长粗肿胀人紧夹吸撅起来雪发翘硕大胴双草坐挲跨柔软臂瘫媚秘破\";\nconst replacementChars = chars.split(\"\");\nreplacementChars[43] = \"AV\";\n\nvar content = String(result).replace(/<i class=\"icon icon-uni([0-9a-fA-F]{4})\"><\\/i>/g, (_, p1) =>\n  String.fromCharCode(parseInt(p1, 16))\n);\n\ncontent = content.replace(/[\\uE001-\\uE101]/g, char => {\n  let code = char.charCodeAt(0);\n  return replacementChars[code - 0xE001];\n});\n</js>", "nextContentUrl": ".btnW a:contains(下一页)@href", "title": "h1@text"}, "ruleExplore": {"author": "a[href*=author]@text", "bookList": ".dList li", "bookUrl": ".name a@href", "coverUrl": "img@src", "intro": ".intro@text", "kind": ".dlS.1@dd@text", "lastChapter": ".infoM2 dt:contains(更新：) + dd@text", "name": ".name a@text"}, "ruleReview": {"enabled": true}, "ruleSearch": {"author": ".book-card__meta-item:contains(作者：)@ownText", "bookList": ".book-card@js:\nif(!result || result.size() === 0){\n\t // 搜索失败，立即清空所有缓存\n  cache.delete(\"home_html_data\");\n  cache.delete(\"home_html_timestamp\");\n  cache.delete(\"daily_signjs_value\");\n  cache.delete(\"daily_signjs_timestamp\");\n}\n\nresult;", "bookUrl": ".book-card@onclick\n@js:\nconst window = {\n  open(url){\n    let t = url.match(/t=([\\w%]+)/)?.[1];\n    if(!t) return \"\";\n    return java.base64Decode(decodeURIComponent(t))\n  }\n};\n\neval(result)", "coverUrl": "img@src", "intro": ".book-card__desc@text", "kind": ".book-tag@text&&.book-card__update@text##更新：", "name": ".book-card__title@text"}, "ruleToc": {"chapterList": "@js:\nconst chapters = [];\nif(/\\/chapter\\//.test(baseUrl)) {\n  let doc = org.jsoup.Jsoup.parse(result);\n  let elements = doc.select(\".chapListBody a\");\n  elements.forEach(a => {\n    let text = a.text().trim();\n    let href = a.attr(\"href\");\n    chapters.push({text, href})\n  })\n} else {\n  try {\n    let trimRes = String(result).trim();\n    if (trimRes.startsWith(\"<\")) {\n      // 返回HTML，直接跳出，不执行JSON解析\n      throw \"not json\";\n    }\n    let json = JSON.parse(result);\n    if (json.data && json.data.length > 0){\n      json.data.forEach(ch => {\n        chapters.push({\n          text: ch.chaptername,\n          href: ch.chapterurl\n        })\n      })\n    }\n  } catch (e) {\n    // 这里去掉toast弹窗，不再弹出Unexpected token报错干扰\n    // java.longToast(e.message)\n  }\n}\n\nchapters", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": "@js:\n(() => {\nconst nextpageList = java.getStringList(\"@@.dropDown li:not(.cur)@data-p\");\nconst jsUrl = result.match(/src=\"(\\/templates\\/js\\/[A-Za-z0-9]+\\.js)\"/)?.[1];\nif(nextpageList.size() == 0 || !jsUrl) return [];\n\nconst host = java.toURL(baseUrl).origin;\nconst cryptHtml = java.ajax(host+jsUrl);\nconst key = cryptHtml.match(/new AESCrypt\\('([A-Za-z0-9]{32})'\\)/)?.[1];\nconst iv = cryptHtml.match(/CryptoJS\\.enc\\.Utf8\\.parse\\('(\\d{16})'\\)/)?.[1];\nif(!key || !iv) return [];\n\nconst id = baseUrl.match(/chapter\\/(.*?)\\.html/)?.[1];\nconst nextpages = Array.from(nextpageList, (page) => {\n  let postBody = java.createSymmetricCrypto('AES/CBC/PKCS5Padding', key, iv).encryptBase64(JSON.stringify({\n    id: id,\n    page: page\n  }));\n  return host + '/index.php?action=loadChapterPage,' + JSON.stringify({\n\t   \"method\": \"POST\",\n\t   \"body\": \"data=\"+encodeURIComponent(postBody)\n  })\n});\n\nreturn nextpages\n})()"}, "searchUrl": "@js:\n/**\n * 对齐网站搜索规则前置校验\n * 1. 去除首尾空格\n * 2. 字数限制：2～8个字\n * 3. 拦截高危特殊符号，只允许常规中文、字母、数字、常用中文标点\n * 非法特殊符号：引号、斜杠、括号、@#$^&*{}[]等脚本危险字符\n */\nfunction checkKeywordLegal(word) {\n    const trimWord = String(word).trim();\n    const kwLen = trimWord.length;\n    // 空值拦截\n    if (kwLen === 0) {\n        java.longToast(\"搜索关键词不能为空\");\n        throw new Error(\"搜索关键词不能为空\");\n    }\n    // 字数校验 2～8位\n    if (kwLen < 2 || kwLen > 8) {\n    \t   java.longToast(\"搜索关键字只允许2~8个字之间\");\n        throw new Error(\"搜索关键字只允许2~8个字之间\");\n    }\n    // 禁止高危特殊符号正则\n    const forbidReg = /[\\\\\\\"\\(\\)\\{\\}\\[\\]<>@#$%^&*;:|~]/;\n    if (forbidReg.test(trimWord)) {\n    \t   java.longToast(\"关键词包含非法特殊符号，请重新输入\");\n        throw new Error(\"关键词包含非法特殊符号，请重新输入\");\n    }\n}\n\n// JS字符串转义兜底，防止注入语法报错\nfunction jsStrEscape(str) {\n    if (str == null) return \"\";\n    return String(str)\n        .replace(/\\\\/g, \"\\\\\\\\\")\n        .replace(/\"/g, '\\\\\"')\n        .replace(/\\n/g, \"\\\\n\")\n        .replace(/\\r/g, \"\\\\r\")\n        .replace(/\\t/g, \"\\\\t\");\n}\n// 最先执行关键词校验，不合法直接抛出，终止全部后续流程\ncheckKeywordLegal(key);\n\nvar host = \"https://www.rrssk.com\";\nvar homeUrl = host + \"/0005.html\";\n\n// 缓存Key定义\nconst KEY_HOME_HTML = \"home_html_data\";\nconst KEY_HOME_STAMP = \"home_html_timestamp\";\nconst KEY_SIGNJS_VAL = \"daily_signjs_value\";\nconst KEY_SIGNJS_STAMP = \"daily_signjs_timestamp\";\n\n// 时效配置（单位：秒）\nconst HOME_TTL = 120;\nconst SIGNJS_TTL = 21600;\n\n// public.js 固定硬编码\nconst publicJsCode = `\n// rrssk public.js v11\nfunction __enc(x) {\n    return encodeURIComponent(x).replace(/[!'()*]/g, function(c) {\n        return '%' + c.charCodeAt(0).toString(16).toUpperCase();\n    });\n}\nfunction __signData(kw, t) {\n    if (!window.__SIGN || typeof window.__SIGN.f !== 'function') return null;\n    var ts = Math.floor(Date.now() / 1000);\n    return { ts: ts, s: window.__SIGN.f(__enc(kw), t, ts) };\n}\n`;\n\nconst nowSecond = Math.floor(Date.now() / 1000);\n\n// 读取首页缓存，双重校验过期\nlet homeHtmlRaw = null;\nconst cacheHome = cache.get(KEY_HOME_HTML);\nconst cacheHomeStamp = Number(cache.get(KEY_HOME_STAMP) || 0);\n// 缓存存在 + 手动时间未超时才复用\nif (cacheHome && cacheHomeStamp && (nowSecond - cacheHomeStamp < HOME_TTL)) {\n    homeHtmlRaw = cacheHome;\n}\n\n// 过期|无缓存，重新拉取\nif (!homeHtmlRaw) {\n    homeHtmlRaw = String(java.ajax(homeUrl));\n    cache.put(KEY_HOME_HTML, homeHtmlRaw, HOME_TTL);\n    cache.put(KEY_HOME_STAMP, String(nowSecond), HOME_TTL);\n}\n\n// 解析页面关键内容\nconst tMatch = homeHtmlRaw.match(/name=\"_t\" value=\"([^\"]+)\"/);\nconst apiMatch = homeHtmlRaw.match(/action=[\"'](\\/\\?action=\\w+)[\"']/);\nconst signJsLinkMatch = homeHtmlRaw.match(/<script src=\"(\\/\\?action=signJs[^\"]+)\"/);\n\nif (!tMatch) {\n\t   java.longToast(\"页面解析失败：未获取_t签名令牌\");\n    throw new Error(\"页面解析失败：未获取_t签名令牌\");\n}\nif (!apiMatch) {\n\t   java.longToast(\"页面解析失败：未获取搜索接口地址\");\n    throw new Error(\"页面解析失败：未获取搜索接口地址\");\n}\nif (!signJsLinkMatch) {\n\t   java.longToast(\"页面解析失败：未匹配signJs脚本链接\");\n    throw new Error(\"页面解析失败：未匹配signJs脚本链接\");\n};\n\nconst tokenT = tMatch[1];\nconst searchApi = apiMatch[1];\n\n// signJs 双重过期校验\nlet signJsCode = null;\nconst cacheSignJsVal = cache.get(KEY_SIGNJS_VAL);\nconst cacheSignJsStamp = Number(cache.get(KEY_SIGNJS_STAMP) || 0);\nif (cacheSignJsVal && cacheSignJsStamp && (nowSecond - cacheSignJsStamp < SIGNJS_TTL)) {\n    signJsCode = cacheSignJsVal;\n}\n\nif (!signJsCode) {\n    const signJsUrl = host + signJsLinkMatch[1];\n    signJsCode = String(java.ajax(signJsUrl));\n    cache.put(KEY_SIGNJS_VAL, signJsCode, SIGNJS_TTL);\n    cache.put(KEY_SIGNJS_STAMP, String(nowSecond), SIGNJS_TTL);\n}\n\n// 简化页面\nlet renderHtml = homeHtmlRaw\n    .replace(/<link[^>]*>/gi, '')\n    .replace(/<img[^>]*>/gi, '')\n    .replace(/<svg[\\s\\S]*?<\\/svg>/gi, '')\n    .replace(/<footer[\\s\\S]*?<\\/footer>/gi, '')\n    .replace(/<script src=\"\\/templates\\/js\\/jquery[\\s\\S]*?<\\/script>/, '')\n    .replace(/<script src=\"\\/templates\\/js\\/public\\.js[\\s\\S]*?<\\/script>/, `<script>${publicJsCode}</script>`)\n    .replace(/<script src=\"\\/\\?action=signJs[\\s\\S]*?<\\/script>/, `<script>${signJsCode}</script>`);\n\n// 执行签名\nconst safeKey = jsStrEscape(key);\nconst injectScript = `const res = __signData(\"${safeKey}\",\"${tokenT}\"); res ? res.s : null;`;\nconst signResult = String(java.webView(renderHtml, homeUrl, injectScript, false));\n\nif (!signResult || signResult === \"00000000\") {\n\t   java.longToast(\"签名失败：WebView环境指纹校验不通过\");\n    throw new Error(\"签名失败：WebView环境指纹校验不通过\");\n}\n\n// 拼装POST参数\nconst postBody = \"_t=\" + encodeURIComponent(tokenT)\n    + \"&_ts=\" + Math.floor(Date.now() / 1000)\n    + \"&_s=\" + encodeURIComponent(signResult)\n    + \"&keyword=\" + encodeURIComponent(key);\n\nhost + searchApi + \",\" + JSON.stringify({\n    method: \"POST\",\n    body: postBody\n});", "weight": 0},{"bookSourceComment": "禁漫天堂 App API 直连版(参考开源项目 ComicSparks/jasmine 机制)。API 线路可在登录界面切换，ts 半固定自愈，响应 AES-256-ECB 解密，图片乱序行块还原。搜索/详情/目录/正文/发现全链路 API。收藏夹需登录。", "bookSourceGroup": "🔞 禁漫天堂", "bookSourceName": "🔞禁漫天堂API", "bookSourceType": 2, "bookSourceUrl": "https://www.cdngwc.cc##禁漫API", "bookUrlPattern": "https?://(?:www[.])?(?:cdngwc[.](?:cc|net|club)|cdnhjk[.]net)/album[?]id=[0-9]+", "concurrentRate": "2/1000", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\n(function(){\nvar out=[];\nfunction P(t,u){try{out.push({title:t,url:'https://'+H+u});}catch(e){}}\nvar H='www.cdngwc.cc';var hh=null;try{hh=jmhost(source);}catch(e){}\nif(hh!=null){H=String(hh);}\nP('🔥 全部·最新','/categories/filter?page={{page}}&order=&c=&o=mr');\nP('全部·最多观看','/categories/filter?page={{page}}&order=&c=&o=mv');\nP('全部·日榜','/categories/filter?page={{page}}&order=&c=&o=mv_t');\nP('全部·周榜','/categories/filter?page={{page}}&order=&c=&o=mv_w');\nP('全部·月榜','/categories/filter?page={{page}}&order=&c=&o=mv_m');\nP('全部·最多收藏','/categories/filter?page={{page}}&order=&c=&o=tf');\nP('同人 doujin','/categories/filter?page={{page}}&order=&c=doujin&o=mr');\nP('单本 single','/categories/filter?page={{page}}&order=&c=single&o=mr');\nP('短篇 short','/categories/filter?page={{page}}&order=&c=short&o=mr');\nP('其他 another','/categories/filter?page={{page}}&order=&c=another&o=mr');\nP('韩漫 hanman','/categories/filter?page={{page}}&order=&c=hanman&o=mr');\nP('美漫 meiman','/categories/filter?page={{page}}&order=&c=meiman&o=mr');\nP('3D','/categories/filter?page={{page}}&order=&c=3D&o=mr');\nP('Cosplay','/categories/filter?page={{page}}&order=&c=doujin_cosplay&o=mr');\nP('英文 english','/categories/filter?page={{page}}&order=&c=english_site&o=mr');\nP('⭐ 全部收藏·默认夹','/favorite?page={{page}}&folder_id=0&o=mr');\nvar fo=null;\ntry{fo=jmget(java,source,'/favorite?page=1&folder_id=0&o=mr');}catch(e){fo=null;}\nif(fo!=null&&fo.folder_list!=null&&fo.folder_list.length){\n for(var i=0;i<fo.folder_list.length;i++){\n  var f=fo.folder_list[i];var fid=String(f.FID||f['0']||'');var fnm=String(f.name||f['2']||('收藏夹'+(i+1)));\n  if(fid.length>0&&fid!=='0'){P('📁 收藏夹·'+fnm,'/favorite?page={{page}}&folder_id='+fid+'&o=mr');}\n }\n}\nreturn String(JSON.stringify(out));\n})()\n", "header": "<js>(function(){var t;try{t=String(source.get('jmts')||'');}catch(e){t='';}if(t.length<5){t=String(Math.floor(Date.now()/1000));try{source.put('jmts',t);}catch(e){}}var u='Mozilla/5.0 (Linux; Android 13; abcdef123 Build/TQ1A.230305.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/114.0.5735.196 Safari/537.36';var o={};o.token=String(java.md5Encode(t+'185Hcomic3PAPP7R'));o.tokenparam=t+',2.1.7';o['user-agent']=u;o['X-Requested-With']='com.JMComic3.app';return JSON.stringify(o);})()</js>", "jsLib": "\nvar JMS='185Hcomic3PAPP7R';\nvar JMS2='18comicAPPContent';\nvar JMV='2.1.7';\nvar JMU='Mozilla/5.0 (Linux; Android 13; abcdef123 Build/TQ1A.230305.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/114.0.5735.196 Safari/537.36';\nvar JMHS='www.cdngwc.cc,www.cdnhjk.net,www.cdngwc.net,www.cdngwc.club';\nvar JMIMS='cdn-msp.jmapiproxy1.cc,cdn-msp.jmapiproxy2.cc,cdn-msp2.jmapiproxy2.cc,cdn-msp.jmapinodeudzn.net';\nvar JMSC=220980;\nvar JMSC2=268850;\nvar JMSC3=421926;\nfunction gv(o,k){try{var f=o[k];return typeof f==='function'?f.call(o):f;}catch(e){return null;}}\nfunction jmg(sv,k){try{var v=sv.get(k);if(v==null)return null;var s=String(v);if(s.length<1)return null;return s;}catch(e){return null;}}\nfunction jmp(sv,k,v){try{sv.put(k,String(v));}catch(e){}}\nfunction jmts(sv){var t=jmg(sv,'jmts');if(t==null||t.length<5){t=String(Math.floor(Date.now()/1000));jmp(sv,'jmts',t);}return t;}\nfunction jmnewts(sv){var t=String(Math.floor(Date.now()/1000));jmp(sv,'jmts',t);return t;}\nfunction jmhost(sv){var h=jmg(sv,'jmh');if(h==null){return 'www.cdngwc.cc';}return h;}\nfunction jmimg(sv){var h=jmg(sv,'jmim');if(h==null){return 'cdn-msp.jmapiproxy1.cc';}return h;}\nfunction jmhead(jv,sv,t,sec){var o={};o.token=String(jv.md5Encode(t+(sec||JMS)));o.tokenparam=t+','+JMV;o['user-agent']=JMU;o['X-Requested-With']='com.JMComic3.app';o['Content-Type']='application/x-www-form-urlencoded';return o;}\nfunction jmdec(jv,s,t){try{return String(jv.aesBase64DecodeToString(String(s),String(jv.md5Encode(t+JMS)),'AES/ECB/PKCS5Padding',''));}catch(e){return null;}}\nfunction jmhead(jv,sv,t,sec){var o={};o.token=String(jv.md5Encode(t+(sec||JMS)));o.tokenparam=t+','+JMV;o['user-agent']=JMU;o['X-Requested-With']='com.JMComic3.app';o['Content-Type']='application/x-www-form-urlencoded';return o;}\nfunction jmpost(jv,u,b,hd){var hs=String(JSON.stringify(hd));\n try{return jv.post(String(u),String(b),hs);}catch(e1){}\n try{var m=new Packages.java.util.HashMap();\n  m.put('token',String(hd.token));m.put('tokenparam',String(hd.tokenparam));m.put('user-agent',String(hd['user-agent']));m.put('X-Requested-With',String(hd['X-Requested-With']));m.put('Content-Type',String(hd['Content-Type']));\n  return jv.post(String(u),String(b),m);\n }catch(e2){return null;}\n}\nfunction jmget(jv,sv,path,post,body){var h=jmhost(sv);var tries=0;var ts=jmts(sv);var last=null;\n for(var r=0;r<2;r++){\n  try{\n   var hd=jmhead(jv,sv,ts,JMS);\n   var resp=null;\n   if(post){resp=jmpost(jv,'https://'+h+path,body||'',hd);}\n   else{resp=jv.connect(String('https://'+h+path),String(JSON.stringify(hd)));}\n   if(resp==null){throw 'resp null';}\n   var b=String(gv(resp,'body'));\n   var o=JSON.parse(b);\n   if(o&&o.code===200){\n    var d=o.data;var s=String(d);\n    if(s.length>1){\n     if(s.charAt(0)!=='{'&&s.charAt(0)!=='['){s=jmdec(jv,s,ts);if(s==null||s.length<1){throw 'dec fail';}}\n    } else {s='{}';}\n    return JSON.parse(s);\n   }\n   if(o&&o.code===401){throw '401';}\n   last='code '+o.code;\n  }catch(e){last=String(e);if(String(e).length>220)last='net: '+String(e).substring(0,100);}\n  ts=jmnewts(sv);\n }\n return null;\n}\nfunction jmcat(jv,sv,o){var out=[];\n try{\n  var host=jmhost(sv);var imgH=jmimg(sv);\n  var qj=String.fromCharCode(123,34,104,101,97,100,101,114,115,34,58);\n  var cont=o&&o.content?o.content:(o&&o.list?o.list:null);\n  if(cont==null)return out;\n  for(var i=0;i<cont.length;i++){\n   var c=cont[i];var id=String(c.id||'');\n   if(id.length<1)continue;\n   var n=String(c.name||'未知标题');\n   var au=String(c.author||'');\n   var hdo={};hdo['user-agent']=JMU;hdo['X-Requested-With']='com.JMComic3.app';\n   var cv='https://'+imgH+'/media/albums/'+id+'_3x4.jpg?v=1'+','+qj+JSON.stringify(JSON.stringify(hdo))+'}}';\n   var ep=c.latest_ep?String(c.latest_ep):'';\n   out.push(String(JSON.stringify({name:n,author:au,aid:id,url:'https://'+host+'/album?id='+id,cover:cv,ep:ep})));\n  }\n }catch(e){}\n return out;\n}\nfunction jmnum(jv,aid,fn){aid=parseInt(aid,10)||0;\n if(aid<JMSC)return 0;\n if(aid<JMSC2)return 10;\n var x=aid<JMSC3?10:8;\n var h=String(jv.md5Encode(String(aid)+String(fn)));\n var c=h.charCodeAt(h.length-1);\n return (c%x)*2+2;\n}\nfunction jmpid(U){var i=U.indexOf('/media/photos/');if(i<0)return null;\n var t=U.substring(i+14);var ps=t.split('/');if(ps.length<1)return null;\n var pid=ps[0].split('?')[0];var f=ps[1];if(f==null)return null;\n var name=f.split('?')[0].split('.')[0];var ext='';\n if(f.indexOf('.')>=0)ext=f.split('?')[0].split('.').pop();\n return {pid:parseInt(pid,10)||0,fn:name,ext:String(ext).toLowerCase()};\n}\n", "lastUpdateTime": "1790498048410", "loginUi": "[{\"name\": \"账号\", \"type\": \"text\", \"action\": \"\"}, {\"name\": \"密码\", \"type\": \"password\", \"action\": \"\"}, {\"name\": \"🔑 登录\", \"type\": \"button\", \"action\": \"jmDoLogin()\"}, {\"name\": \"✅ 检测登录态\", \"type\": \"button\", \"action\": \"jmLoginState()\"}, {\"name\": \"🚪 清除登录\", \"type\": \"button\", \"action\": \"jmLogout()\"}, {\"name\": \"🛰 API线路1 cdngwc.cc\", \"type\": \"button\", \"action\": \"jmSetApi(0)\"}, {\"name\": \"🛰 API线路2 cdnhjk.net\", \"type\": \"button\", \"action\": \"jmSetApi(1)\"}, {\"name\": \"🛰 API线路3 cdngwc.net\", \"type\": \"button\", \"action\": \"jmSetApi(2)\"}, {\"name\": \"🛰 API线路4 cdngwc.club\", \"type\": \"button\", \"action\": \"jmSetApi(3)\"}, {\"name\": \"🛰 API线路5 cdnutc.me\", \"type\": \"button\", \"action\": \"jmSetApi(4)\"}, {\"name\": \"📡 自动选最快API\", \"type\": \"button\", \"action\": \"jmAutoHost()\"}, {\"name\": \"🖼 图床1 jmapiproxy1\", \"type\": \"button\", \"action\": \"jmSetImg(0)\"}, {\"name\": \"🖼 图床2 jmapiproxy2\", \"type\": \"button\", \"action\": \"jmSetImg(1)\"}, {\"name\": \"🖼 图床3 msp2.proxy2\", \"type\": \"button\", \"action\": \"jmSetImg(2)\"}, {\"name\": \"🖼 图床4 jmapinodeudzn\", \"type\": \"button\", \"action\": \"jmSetImg(3)\"}, {\"name\": \"🔓 图解码开关(排查)\", \"type\": \"button\", \"action\": \"jmRawToggle()\"}, {\"name\": \"🛰 线路·图诊断\", \"type\": \"button\", \"action\": \"java.longToast('API: '+jmhost(source)+' / 图床: '+jmimg(source)+' / 图诊断: '+(jmg(source,'jmdl')||'无'))\"}]", "loginUrl": "\nfunction jmLoginRow(v){var m=(JMHS||'').split(',');for(var i=0;i<m.length;i++){if(String(m[i]).indexOf(v)>=0)return '线路'+(i+1)+': '+m[i];}return (jmg(source,'jmh')||'www.cdngwc.cc');}\nfunction jmSetHost(h){if(h==null||String(h).length<4){java.longToast('无效线路');return;}jmp(source,'jmh',String(h).trim());java.longToast('API线路已切换: '+h);}\nfunction jmImgProbe(h){try{var hd={};hd['user-agent']=JMU;hd['X-Requested-With']='com.JMComic3.app';var r=java.connect(String('https://'+h+'/media/albums/441923_3x4.jpg?v=1'),String(JSON.stringify(hd)));var b=String(gv(r,'body'));if(b.length>800)return true;}catch(e){try{var r2=java.connect(String('https://'+h+'/'));}catch(e2){}}return false;}\nfunction jmPick(k,label,list,i){var h=null;try{h=String(list[i]);}catch(e){}if(h==null||h.length<3){java.longToast(label+'线路无效');return 'no';}\n jmp(source,k,h);\n var t0=Date.now();var ok=false;\n try{if(k==='jmim'){ok=jmImgProbe(h);}else{var r=jmget(java,source,'/setting');ok=(r!=null);}}catch(e){}\n var ms=Date.now()-t0;\n if(ok){java.longToast('✅ 已选'+label+'线路'+(i+1)+': '+h+' 延迟'+ms+'ms');}\n else{java.longToast('⚠️ 已选'+label+'线路'+(i+1)+': '+h+' 测速失败 '+ms+'ms');}\n return 'ok';\n}\nfunction jmSetApi(i){return jmPick('jmh','API',String(JMHS+',www.cdnutc.me').split(','),i);}\nfunction jmSetImg(i){return jmPick('jmim','图床',String(JMIMS).split(','),i);}\nfunction jmAutoHost(){var hs=String(JMHS+',www.cdnutc.me').split(',');var best=null;var bestMs=99999;for(var i=0;i<hs.length;i++){var h=hs[i];jmp(source,'jmh',h);var t0=Date.now();var ok=false;try{var r=jmget(java,source,'/setting');ok=(r!=null);}catch(e){}var ms=Date.now()-t0;if(ok&&ms<bestMs){bestMs=ms;best=h;}}if(best==null){java.longToast('所有API线路不可达');}else{jmp(source,'jmh',best);java.longToast('✅ 已选最快API: '+best+' '+bestMs+'ms');}return 'ok';}\nfunction jmLoginState(){var r=jmget(java,source,'/favorite?page=1&folder_id=0&o=mr');if(r==null){java.longToast('未登录或请求失败');return 'no';}var n=0;if(r.list!=null)n=r.list.length;if(r.folder_list!=null||r.count!=null){java.longToast('登录态有效，收藏夹 '+String(r.total||n)+' 本');return 'ok';}java.longToast('响应异常，可能未登录');return 'no';}\nfunction jmDoLogin(){var info=null;try{info=source.getLoginInfoMap();}catch(e){info=null;}var uid='';var pwd='';try{if(info!=null){var a1=info.get('账号');if(a1!=null)uid=String(a1);var p1=info.get('密码');if(p1!=null)pwd=String(p1);if(uid.length<1){var u2=info.get('account');if(u2!=null)uid=String(u2);}if(pwd.length<1){var p2=info.get('password');if(p2!=null)pwd=String(p2);}}}catch(e){}\n if(uid.length<1||pwd.length<1){java.longToast('请先填写账号密码');return 'no';}\n var ts=jmts(source);var hd=jmhead(java,source,ts,JMS);\n var body='username='+java.encodeURI(uid)+'&password='+java.encodeURI(pwd);\n try{\n  var resp=jmpost(java,'https://'+jmhost(source)+'/login',body,hd);\n  if(resp==null){java.longToast('登录请求失败(版本不兼容)');return 'no';}\n  var b=String(gv(resp,'body'));\n  var o=JSON.parse(b);\n  var s=String(o&&o.data?o.data:'');\n  if(s.length>1&&s.charAt(0)!=='{'&&s.charAt(0)!=='['){s=jmdec(java,s,ts);}\n  var d=JSON.parse(s);\n  if(d==null||d.uid==null){java.longToast('登录失败: '+String(d&&d.msg?d.msg:'响应异常'));return 'no';}\n  jmp(source,'jmu',String(d.username||uid));\n  java.longToast('登录成功: '+String(d.username||uid)+' (金币'+String(d.coin||'?')+')');\n  return 'ok';\n }catch(e){java.longToast('登录失败(网络或账号错误): '+String(e).substring(0,80));return 'no';}\n}\nfunction jmRawToggle(){var r=jmg(source,'jmraw');if(String(r)==='1'){jmp(source,'jmraw','0');java.longToast('🖼 图解码: 已开启乱序还原');}else{jmp(source,'jmraw','1');java.longToast('🖼 图解码: 已降级为原图直显(排查模式)');}return 'ok';}\nfunction jmLogout(){try{var ck=cookie.removeCookie('https://'+jmhost(source));}catch(e){}try{jmp(source,'jmu','');}catch(e2){}java.longToast('已清除本线路登录Cookie');return 'ok';}\nfunction login(){var info=null;try{info=source.getLoginInfoMap();}catch(e){info=null;}var ok=false;try{if(info!=null){var a1=info.get('账号');if(a1!=null&&String(a1).length>0)ok=true;var a2=info.get('account');if(a2!=null&&String(a2).length>0)ok=true;}}catch(e2){}if(!ok){java.longToast('填写账号密码后点右侧“登录”按钮');}return 'ok';}\n", "respondTime": 180000, "ruleBookInfo": {"author": "$.author", "coverUrl": "$.cover", "init": "@js:\n(function(){\n try{\n  var bu=String(baseUrl||'');\n  var path=bu;var pi=bu.indexOf('/album');\n  if(pi>=0){path=bu.substring(pi);}else{return String(JSON.stringify({name:'加载异常',author:'',tags:'',cover:'',toc:'',aid:'',views:'',lc:'',fav:false,like:false,desc:'详情地址无效'}));}\n  var a=jmget(java,source,path);\n  if(a==null||a.id==null){return String(JSON.stringify({name:'加载失败',author:'',tags:'',cover:'',toc:'',aid:'',views:'',lc:'',fav:false,like:false,desc:'详情获取失败，请稍后重试或切换线路'}));}\n  var id=String(a.id);\n  var nl=String.fromCharCode(10);\n  var hosts=jmhost(source);var imgH=jmimg(source);\n  var hdo={};hdo['user-agent']=JMU;hdo['X-Requested-With']='com.JMComic3.app';\n  var qj=String.fromCharCode(123,34,104,101,97,100,101,114,115,34,58);\n  var cv='https://'+imgH+'/media/albums/'+id+'_3x4.jpg?v=1'+','+qj+JSON.stringify(JSON.stringify(hdo))+'}}';\n  var au='';if(a.author!=null&&a.author.length){for(var x=0;x<a.author.length;x++){au+=(x>0?',':'')+String(a.author[x]);}}\n  var tags='';if(a.tags!=null&&a.tags.length){for(var x2=0;x2<a.tags.length;x2++){tags+=(x2>0?',':'')+String(a.tags[x2]);}}\n  var desc=String(a.description||'');\n  var lc='';if(a.series!=null&&a.series.length){lc=String(a.series[a.series.length-1].name||'');}\n  var views=String(a.total_views||'');\n  var cat='';if(a.category!=null)cat=String(a.category.title||'');\n  jmp(source,'jmalb_'+id,JSON.stringify({id:id,name:String(a.name||''),author:au,tags:tags,series:(a.series||[]),desc:desc,imgH:imgH}));\n  var info=desc;\n  if(views.length)info+=nl+'观看: '+views;\n  if(cat.length)info+=nl+'分类: '+cat;\n  if(lc.length)info+=nl+'最新: '+lc;\n  function esc(s){var st=String(s||'');st=st.split('&').join('&amp;');st=st.split('<').join('&lt;');st=st.split('>').join('&gt;');return st;}\n  var Q=String.fromCharCode(34);\n  var q1=String.fromCharCode(39);\n  var favJs='[]';\n  var ush='';\n  var curFav=(a.is_favorite===true)?'<span style=color:#7f7>已收藏</span>':'<span style=color:#ccc>未收藏</span>';\n  try{\n   var foObj=jmget(java,source,'/favorite?page=1&folder_id=0&o=mr');\n   var folArr=(foObj!=null&&foObj.folder_list!=null)?foObj.folder_list:[];\n   if(folArr.length>0){\n    var fstr=JSON.stringify(folArr);\n    favJs=fstr.split(q1).join('\\\\\\\\'+q1);\n    for(var fi=0;fi<folArr.length;fi++){\n     var fo=folArr[fi];var fid=String(fo.FID||fo['0']||'');var fnm=String(fo.name||fo['2']||('收藏夹'+(fi+1)));\n     ush+='<button class=b onclick='+Q+'jmfav('+fi+')'+Q+'>＋ '+esc(fnm)+'</button>';\n    }\n   } else {\n    ush='<div class=n>未登录或暂无收藏夹：请先到书源菜单→登录，成功后再回详情页下拉刷新</div>';\n   }\n  }catch(e3){ush='<div class=n>收藏夹获取失败(未登录?)</div>';}\n  var tpv=jmts(source)+','+JMV;\n  var tok=String(java.md5Encode(jmts(source)+JMS));\n  var pnl='<useweb><html><head><meta name=viewport content='+Q+'width=device-width,initial-scale=1'+Q+'><style>body{background:#16181d;color:#d8d8d8;font-family:sans-serif;margin:10px}b{color:#fff}h2{margin:4px 0;font-size:17px}.n{color:#9aa;font-size:12px;line-height:1.5}.b{display:inline-block;margin:4px;padding:7px 13px;border-radius:16px;border:1px solid #4a7;background:#223;color:#fff;font-size:13px}</style></head><body>';\n  pnl+='<h2>'+esc(String(a.name||''))+'</h2>';\n  pnl+='<div class=n>作者: '+esc(au)+'</div>';\n  if(cat.length)pnl+='<div class=n>分类: '+esc(cat)+'</div>';\n  if(views.length)pnl+='<div class=n>观看: '+views+'</div>';\n  if(desc.length)pnl+='<div class=n>'+esc(desc)+'</div>';\n  pnl+='<div class=n>--- 收藏夹 '+curFav+' ---</div>'+ush;\n  pnl+='<div class=n>提示: 移动API暂无指定收藏夹参数，全部加入默认收藏夹</div>';\n  pnl+='<script>';\n  pnl+='var AID='+q1+id+q1+';';\n  pnl+='var TOK='+q1+tok+q1+';';\n  pnl+='var TPV='+q1+tpv+q1+';';\n  pnl+='var JUA='+q1+JMU+q1+';';\n  pnl+='var HOST='+q1+hosts+q1+';';\n  pnl+='var FN='+q1+esc(String(a.name||'')).split(q1).join('')+q1+';';\n  pnl+='var FAVS='+q1+favJs+q1+';';\n  pnl+='try{FAVS=JSON.parse(FAVS);}catch(e){FAVS=[];}';\n  pnl+='function hd(){var o={};o.token=TOK;o.tokenparam=TPV;o['+Q+'user-agent'+Q+']=JUA;o['+Q+'X-Requested-With'+Q+']='+q1+'com.JMComic3.app'+q1+';o['+Q+'Content-Type'+Q+']='+q1+'application/x-www-form-urlencoded'+q1+';return JSON.stringify(o);}';\n  pnl+='function jmfav(i){try{var f=FAVS[i]||{};var fid=String(f.FID||f['+Q+'0'+Q+']||'+q1+'0'+q1+');if(fid.length<1){fid='+q1+'0'+q1+';}var b='+q1+'aid='+q1+'+AID+'+q1+'&folder_id='+q1+'+fid;var r=java.post('+q1+'https://'+q1+'+HOST+'+q1+'/favorite'+q1+',b,hd());var s=String(r);var o=null;try{o=JSON.parse(s);}catch(e2){}if(o&&o.code===200){java.longToast('+q1+'✔ 已提交收藏['+q1+'+FN+'+q1+']'+q1+'+((fid!=='+q1+'0'+q1+')?('+q1+'夹'+q1+'+fid):'+q1+'默认夹'+q1+')+'+q1+': 下拉刷新详情页可见'+q1+');}else if(o&&o.code===401){java.longToast('+q1+'未登录，收藏失败'+q1+');}else{java.longToast('+q1+'收藏请求异常: '+q1+'+(s||'+q1+''+q1+').substring(0,60));}}catch(e){java.longToast('+q1+'收藏出错: '+q1+'+String(e).substring(0,80));}}';\n  pnl+='</script></body></html></useweb>';\n  info=pnl;\n  var out={};out.name=String(a.name||'');out.author=au;out.tags=tags;out.cover=cv;out.toc='https://'+hosts+'/album?id='+id;out.aid=id;out.views=views;out.lc=lc;out.fav=(a.is_favorite===true);out.like=(a.liked===true);out.desc=info;\n  return String(JSON.stringify(out));\n }catch(e){\n  return String(JSON.stringify({name:'加载异常',author:'',tags:'',cover:'',toc:'',aid:'',views:'',lc:'',fav:false,like:false,desc:String(e).substring(0,120)}));\n }\n})()\n", "intro": "$.desc", "kind": "$.tags", "lastChapter": "$.lc", "name": "$.name", "tocUrl": "$.toc"}, "ruleContent": {"content": "@js:\n(function(){\n try{\n  var bu=String(baseUrl||'');\n  var pid='';\n  var i9=bu.indexOf('id=');if(i9>=0){var t9=bu.substring(i9+3);var j9=0;while(j9<t9.length){var ch9=t9.charAt(j9);if(ch9>='0'&&ch9<='9'){j9++;}else{break;}}pid=t9.substring(0,j9);}\n  if(pid.length<1){return '章节地址无效';}\n  var c=jmget(java,source,'/chapter?id='+pid);\n  if(c==null){return '本章获取失败，请下拉重试或切换线路';}\n  var imgs=c.images||[];\n  if(imgs.length<1){return '本章暂无图片或需要登录(章节可能因版权锁定)';}\n  var imgH=jmimg(source);\n  var ts=jmts(source);\n  var Q=String.fromCharCode(34);\n  var cl=String.fromCharCode(10);\n  var html='';\n  for(var i=0;i<imgs.length;i++){\n   var n=String(imgs[i]);\n   html+='<img src='+Q+'https://'+imgH+'/media/photos/'+pid+'/'+n+'?v='+ts+Q+'>'+cl;\n  }\n  return html;\n }catch(e){return '本章解析失败: '+String(e).substring(0,120);}\n})()\n", "imageDecode": "\n(function(){\n try{\n  var U=String(src||'');\n  var i=U.indexOf('/media/photos/');\n  if(i<0)return result;\n  var t=U.substring(i+14);var ps=t.split('/');\n  if(ps.length<2)return result;\n  var pidStr=ps[0].split('?')[0];\n  var pid=parseInt(pidStr,10)||0;\n  var f=ps[1];if(f==null)return result;\n  var fn=f.split('?')[0].split('.')[0];\n  var ext='';\n  if(f.indexOf('.')>=0)ext=f.split('?')[0].split('.').pop();\n  ext=String(ext).toLowerCase();\n  if(ext==='gif')return result;\n  var n=0;\n  if(pid<220980){n=0;}\n  else if(pid<268850){n=10;}\n  else{var x=pid<421926?10:8;var h=String(java.md5Encode(String(pid)+String(fn)));var c=h.charCodeAt(h.length-1);n=(c%x)*2+2;}\n  if(n<=0)return result;\n  var raw=null;\n  try{raw=source.get('jmraw');}catch(e2){raw=null;}\n  if(String(raw)==='1'){return result;}\n  if(n<=1)return result;\n  var BF=Packages.android.graphics.BitmapFactory;\n  var bmp=BF.decodeByteArray(result,0,result.length);\n  if(bmp==null){try{source.put('jmdl','null len='+result.length+' hdr='+result[0]+','+result[1]+','+result[2]+','+result[3]);}catch(e3){}return result;}\n  var w=bmp.getWidth(),h=bmp.getHeight();\n  if(w<4||h<4){try{source.put('jmdl','tiny '+w+'x'+h);}catch(e4){}return result;}\n  var dst=Packages.android.graphics.Bitmap.createBitmap(w,h,Packages.android.graphics.Bitmap.Config.ARGB_8888);\n  var cv=new Packages.android.graphics.Canvas(dst);\n  var pt=new Packages.android.graphics.Paint();\n  var over=h%n;var move=Math.floor(h/n);\n  for(var ii=0;ii<n;ii++){\n   var m2=move;var ys=h-move*(ii+1)-over;var yd=move*ii;\n   if(ii===0){m2+=over;}else{yd+=over;}\n   if(ys<0)ys=0;if(ys+m2>h)m2=h-ys;\n   if(yd<0)yd=0;if(yd+m2>h)m2=h-yd;\n   cv.drawBitmap(bmp,new Packages.android.graphics.Rect(0,ys,w,ys+m2),new Packages.android.graphics.Rect(0,yd,w,yd+m2),pt);\n  }\n  var bos=new Packages.java.io.ByteArrayOutputStream();\n  dst.compress(Packages.android.graphics.Bitmap.CompressFormat.PNG,100,bos);\n  var out2=bos.toByteArray();\n  try{source.put('jmdl','ok r'+n+' '+pid+'/'+fn+' '+out2.length);}catch(e5){}\n  return out2;\n }catch(e){\n  try{java.longToast('🖼 图解码失败: '+String(e).substring(0,90));}catch(e6){}\n  try{source.put('jmdl','FAIL: '+String(e).substring(0,90));}catch(e7){}\n  return result;\n }\n})()\n"}, "ruleExplore": {"author": "$.author", "bookList": "@js:\n(function(){var out=[];\n try{\n  var bu=String(baseUrl||'');\n  var path=bu;var pi=bu.indexOf('/categories');var fi=bu.indexOf('/favorite');\n  if(pi>=0){path=bu.substring(pi);}else if(fi>=0){path=bu.substring(fi);}\n  var obj=jmget(java,source,path);\n  if(obj==null){out.push(String(JSON.stringify({name:'本页请求失败(可切换线路)',author:'',aid:'0',url:'https://'+jmhost(source)+'/album?id=0',cover:'',ep:''})));return out;}\n  out=jmcat(java,source,obj);\n  if(out==null)out=[];\n }catch(e){out.push(String(JSON.stringify({name:'发现解析异常: '+String(e).substring(0,120),author:'',aid:'0',url:'https://'+jmhost(source)+'/album?id=0',cover:'',ep:''})));}\n return out;\n})()\n", "bookUrl": "$.url", "coverUrl": "$.cover", "intro": "$.ep", "name": "$.name"}, "ruleSearch": {"author": "$.author", "bookList": "@js:\n(function(){var out=[];\n try{\n  var bu=String(baseUrl||'');\n  var path=bu;var pi=bu.indexOf('/search');\n  if(pi>=0){path=bu.substring(pi);}\n  var obj=jmget(java,source,path);\n  if(obj==null){out.push(String(JSON.stringify({name:'搜索请求失败(可尝试登录界面切换线路)',author:'',aid:'0',url:'https://'+jmhost(source)+'/album?id=0',cover:'',ep:''})));return out;}\n  if(obj.redirect_aid!=null){var a=String(obj.redirect_aid);if(a.length>1){out.push(String(JSON.stringify({name:String(obj.search_query||a),author:'',aid:a,url:'https://'+jmhost(source)+'/album?id='+a,cover:'',ep:''})));return out;}}\n  out=jmcat(java,source,obj);\n  if(out==null)out=[];\n }catch(e){out.push(String(JSON.stringify({name:'搜索解析异常: '+String(e).substring(0,120),author:'',aid:'0',url:'https://'+jmhost(source)+'/album?id=0',cover:'',ep:''})));}\n return out;\n})()\n", "bookUrl": "$.url", "checkKeyWord": "MANA", "coverUrl": "$.cover", "name": "$.name"}, "ruleToc": {"chapterList": "@js:\n(function(){var out=[];\n try{\n  var host=jmhost(source);\n  function aidOf(bu){var i=String(bu).indexOf('id=');if(i<0)return '';var t=String(bu).substring(i+3);var j=0;while(j<t.length){var ch=t.charAt(j);if(ch>='0'&&ch<='9'){j++;}else{break;}}return t.substring(0,j);}\n  var aid='';\n  try{aid=aidOf(baseUrl);}catch(e){}\n  if(aid.length<1){try{aid=aidOf(book?book.tocUrl:'');}catch(e2){}}\n  var obj=null;\n  var cache=jmg(source,'jmalb_'+aid);\n  if(cache!=null){try{obj=JSON.parse(cache);}catch(e){obj=null;}}\n  if(obj==null){\n   obj=jmget(java,source,'/album?id='+aid);\n   if(obj!=null){jmp(source,'jmalb_'+aid,JSON.stringify({id:aid,name:String(obj.name||''),author:'',tags:'',series:(obj.series||[]),desc:'',imgH:jmimg(source)}));}\n  }\n  if(obj==null){out.push(String(JSON.stringify({n:'目录获取失败：详情缓存丢失，请回到详情页刷新',cid:'https://'+host+'/chapter?id=0'})));return out;}\n  var ser=obj.series||[];\n  var bookName=String(obj.name||'');\n  var i=0;\n  if(ser.length<1){\n   out.push(String(JSON.stringify({n:bookName.length?bookName:'全一话',cid:'https://'+host+'/chapter?id='+aid})));\n  } else {\n   for(i=0;i<ser.length;i++){var p=ser[i];var pid=String(p.id||'');if(pid.length<1)continue;out.push(String(JSON.stringify({n:String(p.name||('第'+i+'话')),cid:'https://'+host+'/chapter?id='+pid})));}\n  }\n }catch(e){out=[];}\n return out;\n})()\n", "chapterName": "$.n", "chapterUrl": "$.cid"}, "searchUrl": "https://www.cdngwc.cc/search?search_query={{key}}&main_tag=0&page={{page}}&o=mr&t=a", "variableComment": "jmts=API时间戳(半固定,401自愈); jmh=API线路(默认www.cdngwc.cc); jmim=图床线路(默认cdn-msp.jmapiproxy1.cc); jmu=登录用户名", "weight": 0},{"bookSourceComment": "by 艳阳\nwarning:该书源仅支持精准搜索！\n已修复章节分页内容显示不全问题", "bookSourceGroup": "通常书源", "bookSourceName": "伪速读谷²", "bookSourceType": 0, "bookSourceUrl": "https://www.sudugu.cc", "bookUrlPattern": "https?://www\\.sudugu\\.cc/\\d+(/.*)?", "customButton": false, "customOrder": 8, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "玄幻小说::/fenlei/1/{{page}}/\n仙侠小说::/fenlei/2/{{page}}/\n都市小说::/fenlei/3/{{page}}/\n历史小说::/fenlei/4/{{page}}/\n军事小说::/fenlei/5/{{page}}/\n科幻小说::/fenlei/6/{{page}}/\n言情小说::/fenlei/7/{{page}}/\n轻小说::/fenlei/8/{{page}}/\n诸天无限::/fenlei/9/{{page}}/\n游戏小说::/fenlei/10/{{page}}/\n奇幻小说::/fenlei/11/{{page}}/\n悬疑小说::/fenlei/12/{{page}}/\n体育小说::/fenlei/13/{{page}}/\n官场小说::/fenlei/14/{{page}}/\n武侠小说::/fenlei/15/{{page}}/\n现实小说::/fenlei/16/{{page}}/\n完结小说::/quanben/{{page}}.html\n最新更新::/top/lastupdate/{{page}}.html", "header": "{\"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\"}", "lastUpdateTime": "1790491823386", "loginUrl": "", "respondTime": 180000, "ruleBookInfo": {"author": "@css:.itemtxt p:eq(1) a@text##作者：", "coverUrl": "@css:.item a img@src", "intro": "class.des.0@text", "kind": "p@span@text", "lastChapter": "@css:.itemtxt ul li:eq(0) a@text", "name": "@css:.itemtxt h1 a@text", "tocUrl": "", "wordCount": "@css:.itemtxt h1 i script@html##\\D"}, "ruleContent": {"content": "@css:.con@textNodes", "nextContentUrl": "@css:.prenext a:contains(下一页)@href", "sourceRegex": "[^<]*首发更新站点。<br />\\s*", "webJs": "(function(){var c=document.querySelector('.con');if(!c)return;function g(d){var a=d.querySelectorAll('.prenext a');for(var i=0;i<a.length;i++){if(a[i].textContent.replace(/\\s/g,'')==='下一页')return a[i].href}return null}function p(h){if(typeof DOMParser!=='undefined')return new DOMParser().parseFromString(h,'text/html');var t=document.implementation.createHTMLDocument('');t.body.innerHTML=h;return t}var n=g(document),k=0;while(n&&k<20){k++;try{var x=new XMLHttpRequest();x.open('GET',n,false);x.send();if(x.status!==200)break;var d=p(x.responseText),nc=d.querySelector('.con');if(nc)c.innerHTML+=nc.innerHTML;n=g(d)}catch(e){break}}var al=document.querySelectorAll('.prenext a');for(var i=0;i<al.length;i++){if(al[i].textContent.replace(/\\s/g,'')==='下一页')al[i].removeAttribute('href')}})();"}, "ruleExplore": {"author": "@css:.itemtxt p:eq(1) a@text##作者：", "bookList": "@css:.item", "bookUrl": "@css:.itemtxt h3 a@href", "coverUrl": "@css:.item a img@src", "intro": "", "kind": "p@span@text", "lastChapter": "@css:.itemtxt ul li:eq(0) a@text", "name": "@css:.itemtxt h3 a@text"}, "ruleSearch": {"author": "@css:.itemtxt ul li:eq(0)@text##作者：", "bookList": "@css:.item", "bookUrl": "@css:.itemtxt h3 a@href", "checkKeyWord": "没钱修什么仙", "coverUrl": "", "intro": "@css:.itemtxt p@text##简介：", "kind": "p@span@text", "lastChapter": "@css:.itemtxt ul li:eq(2) a@text", "name": "@css:.itemtxt h3 a@text", "wordCount": ""}, "ruleToc": {"chapterList": "@css:#list ul li", "chapterName": "@css:a@text", "chapterUrl": "@css:a@href", "isVip": "", "nextTocUrl": "@css:#pages a.gr@href", "updateTime": ""}, "searchUrl": "/modules/article/search.php,{\"method\":\"POST\",\"body\":\"searchkey={{key}}&searchtype=articlename&action=login\"}", "weight": 0},{"bookSourceGroup": "通常书源", "bookSourceName": "全本小说网", "bookSourceType": 0, "bookSourceUrl": "https://www.quanben.io", "customOrder": 596, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "exploreUrl": "@js:\nlet url = String(source.getVariable()!=\"\"?source.getVariable():source.getKey()).replace(/\\/$/, '') \nlet arr = []\nlet push = (title, url, type) => arr.push({\n  title: title,\n  url: url,\n  style: {\n    layout_flexGrow: 1,\n    layout_flexBasisPercent: type\n  }\n})\n\npush(\"🏷️全部分类🏷️\", \"\", 1)\nlet res = org.jsoup.Jsoup.parse(java.ajax(url))\nlet lis = res.select('.nav a');\nfor (let i = 0; i < lis.length; i++) {\n    let text = lis[i].text();\n    let href = url + String(lis[i].attr('href')).replace(/\\.html/g,\"_\\{\\{page\\}\\}\\.html\");\n    push(text, href, 0.25);\n}\nJSON.stringify(arr)", "header": "{\n  \"User-Agent\":\"Mozilla/5.0 (Linux; Android 12; Yolo) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/4.0 Chrome/100.0.2987.108 Mobile Safari/537.36\"\n}", "lastUpdateTime": "1790433421581", "loginUrl": "https://www.quanben.io", "respondTime": 12478, "ruleBookInfo": {"kind": "[property=\"og:novel:category\"]@content", "tocUrl": "text.章节列表@href"}, "ruleContent": {"content": "#content@p!0@html##{{chapter.title}}"}, "ruleExplore": [], "ruleSearch": {"author": "p.0@span@text", "bookList": ".row", "bookUrl": "h3 a@href", "coverUrl": "img@src", "intro": "p.1@text", "name": "h3 a@text"}, "ruleToc": {"chapterList": "<js>\nvar page = String(result)\nvar blocks = []\nvar pos = 0\nwhile (true) {\n  var k = page.indexOf('class=\"list3\"', pos)\n  if (k < 0) { break }\n  var s0 = page.lastIndexOf('<ul', k)\n  var e0 = page.indexOf('</ul>', k)\n  if (s0 < 0 || e0 < 0) { break }\n  blocks.push(page.substring(s0, e0 + 5))\n  pos = e0 + 5\n}\nvar m = page.match(/var[ ]+callback[ ]*=[ ]*'([^']+)'/)\nvar cb = m ? m[1] : ''\nm = page.match(/load_more[(][ ]*'([^']+)'/)\nvar bid = m ? m[1] : ''\nvar mid = ''\nfunction qb64(str) {\n  var C = 'PXhw7UT1B0a9kQDKZsjIASmOezxYG4CHo5Jyfg2b8FLpEvRr3WtVnlqMidu6cN'\n  var out = ''\n  for (var i = 0; i < str.length; i++) {\n    var n0 = C.indexOf(str.charAt(i))\n    var code = n0 == -1 ? str.charAt(i) : C.charAt((n0 + 3) % 62)\n    out += C.charAt(parseInt(Math.random() * 62, 10)) + code + C.charAt(parseInt(Math.random() * 62, 10))\n  }\n  return out\n}\nif (cb && bid) {\n  var u = ''\n  try { u = baseUrl ? String(baseUrl) : '' } catch (e1) { u = '' }\n  if (!u) { try { u = String(source.getKey()) } catch (e2) { u = '' } }\n  var host = 'https://www.quanben.io'\n  var p = u.indexOf('//')\n  if (p > -1) {\n    var q = u.indexOf('/', p + 2)\n    if (q > -1) { host = u.substring(0, q) } else if (u.length > p + 2) { host = u }\n  }\n  var api = host + '/index.php?c=book&a=list.jsonp&callback=' + cb + '&book_id=' + bid + '&b=' + qb64(cb)\n  var opt = JSON.stringify({ headers: { Referer: host + '/list.html' } })\n  var txt = java.ajax(api + ',' + opt)\n  if (txt) {\n    var a1 = txt.indexOf('(')\n    var b1 = txt.lastIndexOf(')')\n    if (a1 > -1 && b1 > a1) {\n      try { var jd = JSON.parse(txt.substring(a1 + 1, b1)); if (jd && jd.content) { mid = String(jd.content) } } catch (e3) { mid = '' }\n    }\n  }\n}\nvar out = blocks.length > 0 ? blocks[0] : ''\nout += mid\nfor (var i2 = 1; i2 < blocks.length; i2++) { out += blocks[i2] }\nout\n</js>ul li a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "{{String(source.getVariable()!=\"\"?source.getVariable():source.getKey()).replace(/\\/$/, '')}}/index.php?c=book&a=search&keywords={{key}}", "weight": 0},{"bookSourceComment": "更新日志请点击登录，更新书源中查看\n\n书旗听书：登录书源后将模式切换为“听书”、来源切换为“书旗”，返回发现页长按刷新，即可使用官方“全部/男生/女生”听书发现。默认音色为 multi_role 多角色对话；详情页会显示本书可用音色及数字编号，右上角书籍变量填写编号即可切换。\n\n基础使用教程：\n1、搜索：\n    1)基础搜索：在发现页长按该书源，点击搜索，直接搜，搜索范围(全部来源小说)\n    2)进阶搜索：在登陆-书源设置中选择指定模式/来源，可搜索指定模式/来源内容\n    3)快捷搜索：使用特殊关键词(x,t,m,d,@)搜索\n         x:书名@来源  如(x:十日终焉@番茄)\n         t:书名@来源  如(t:十日终焉@番茄)\n         m:书名@来源  如(m:十日终焉@番茄)\n         d:书名@来源  如(d:十日终焉@番茄)\n         其中：x表示小说(可省略)，t表示听书，m表示漫画，d表示短剧\n         冒号支持中文英文\n         \n2、发现页：\n    在书源设置中选择指定模式或者单个来源，然后刷新发现页即可\n    \n3、更多使用方式长按发现页书源选择登录一目了然\n4、用户后台有视频教程\n         ", "bookSourceGroup": "大灰狼聚合", "bookSourceName": "🍅大灰狼聚合5.9.26(vip完全版)", "bookSourceType": 0, "bookSourceUrl": "大灰狼融合VIP5.0", "bookUrlPattern": "https?:\\/\\/(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z0-9-]+(?::\\d+)?\\/detail.*", "customButton": false, "customOrder": 7, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>\nvar open_argument = source.getVariable();\nif (!open_argument || open_argument == '') {\n    var initData = {\n        tab: \"小说\",\n        tone_id: \"默认音色\",\n        shuqi_tone_id: \"multi_role\",\n        server: host[0],\n        sources: \"番茄\",\n        source_type: \"男频\",\n        find_source: \"番茄\",\n        find_tab: \"小说\",\n        fq_word_filter: \"不限\",\n        fq_status_filter: \"不限\",\n        fq_sort_filter: \"不限\",\n        fqpara: \"on\",\n        fqcommunity: \"on\",\n        pstyle: \"0\"\n    };\n    source.setVariable(JSON.stringify(initData));\n    open_argument = source.getVariable();\n}\nvar base_url = getArguments(open_argument, 'server') || host[0];\nvar ms = getArguments(open_argument, 'tone_id') || '';\nvar source_type = getArguments(open_argument, 'source_type') || '男频';\nvar tab = getArguments(open_argument, 'find_tab') || getArguments(open_argument, 'tab') || '小说';\nvar sources =  getArguments(open_argument, 'sources') || '番茄';\nvar fxyjr = getArguments(open_argument, 'fxyjr');\nvar fq_word_filter = getArguments(open_argument, 'fq_word_filter') || '不限';\nvar fq_status_filter = getArguments(open_argument, 'fq_status_filter') || '不限';\nvar fq_sort_filter = getArguments(open_argument, 'fq_sort_filter') || '不限';\n\n\nfunction checkEnv() {\n    let isModified = false;\n    try {\n        new Packages.io.legato.kazusa.utils.TimeoutCancellationException('');\n        isModified = true;\n    } catch (e) {\n        isModified = typeof source.loginUi == 'function' ? false : true;\n    }\n\n    return isModified;\n}\n\nvar islyc = checkEnv();\nlet device_type = '安卓';\ntry {\n\t  try {\n\t  java.qread();\n\t  device_type =\"轻阅读\";\n\t  } catch {\n\t  \tjava.deviceID();\n    device_type = \"苹果\";\n\t  \t}\n    \n} catch (e) {\n    try {\n        java.androidId();\n        device_type = \"安卓\";\n    } catch (e) {\n        device_type = \"安卓\";\n    }\n}\n\nvar discoverySource = String(getArguments(open_argument, 'find_source') || '').trim();\n    if (discoverySource.indexOf(',') >= 0) {\n        discoverySource = discoverySource.split(',')[0].trim();\n    }\n    // “全部”只用于搜索；发现页必须落到一个真实平台，否则选择器会显示番茄但实际仍是全部。\n    if (!discoverySource || discoverySource == '全部' || discoverySource == 'vip' || discoverySource == 'svip') {\n        discoverySource = '番茄';\n    }\n    sources = discoverySource;\n    setArguments('find_source', sources);\nvar sdtoken;\ntry {\n    var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n    sdtoken = String(loginInfoMap['手动填写番茄token(可不填)'] || '');\n} catch (e) {\n    sdtoken = '';\n}\n\nvar rawCookie = getFanqieCookie() || sdtoken;\nvar match = rawCookie.match(/sessionid=[^;]+/);\nvar fqcookie = match ? match[0] : '';\nvar fqssionid = '';\nif (!fqcookie && (sources == '番茄' || sources == '全部')) {\n    java.toast('您还未登陆番茄账号，无法同步数据哦！');\n} else {\n    fqssionid = getSessionId(fqcookie)\n}\nvar fqsjurl = base_url + \"/bookshelf?page={{page}}&ssionid=\" + fqssionid;\nvar fqtjurl = base_url + \"/fqrecommend?page={{page}}&ssionid=\" + fqssionid;\nvar fqlsurl = base_url + \"/fqhistory?page={{page}}&ssionid=\" + fqssionid;\n\nvar groupDatas = [];\nvar infoData = [ ];\nif (sources == '番茄' || sources == '全部') {\ninfoData = [{\n        \"title\": \"登录番茄\",\n        \"url\": '{\\{java.startBrowser(\"https://fanqienovel.com/\",\"番茄登录\");}}',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.45\n        }\n    }];\n}\n\nvar hasValidCookie = fqcookie.length > 0;\n\nif (hasValidCookie && (sources == '番茄' || sources == '全部')) {\n    function groupQuery() {\n        try {\n            var url = base_url + \"/group_name?ssionid=\" + fqssionid;\n            var res = java.ajax(url);\n            var response = JSON.parse(res);\n\n            if (!(response && response.data)) {}\n\n            response.data.forEach(function(group) {\n                var keys = Object.keys(group);\n                if (keys.length > 0) {\n                    var key = keys[0];\n                    var value = group[key];\n                    if (value && value.length) {\n                        var option = {\n                            \"method\": \"POST\",\n                            \"body\": {\n                                \"book_ids\": value,\n                                \"page\": \"{{page}}\"\n                            }\n                        };\n                        groupDatas.push({\n                            title: key,\n                            url: base_url + \"/bookshelf,\" + JSON.stringify(option),\n                            style: {\n                                layout_flexGrow: 1,\n                                layout_flexBasisPercent: 0.45\n                            }\n                        });\n                    }\n                }\n            });\n\n            if (groupDatas.length % 2 !== 0) {\n                groupDatas.push({\n                    title: \"--\",\n                    url: \"\",\n                    style: {\n                        layout_flexGrow: 1,\n                        layout_flexBasisPercent: 0.45\n                    }\n                });\n            }\n        } catch (e) {\n            java.longToast(\"番茄登录过期，已隐藏番茄书架\" + fqssionid);\n        }\n    }\n\n    try {\n        java.longToast(\"正在加载分组数据...\");\n        var userUrl = base_url + \"/fquser?ssionid=\" + fqssionid;\n        var userRes = java.ajax(userUrl);\n        var userData = JSON.parse(userRes);\n\n        var userName = (userData && userData.data && userData.data.name) ? userData.data.name : '未知用户';\n        if (!userName.includes('未知用户')) {\n            infoData = [{\n                title: \"番茄个人中心\",\n                url: fqsjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }, {\n                title: \"个性推荐(番茄)\",\n                url: fqtjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }, {\n                title: \"历史阅读(番茄)\",\n                url: fqlsurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }];\n        }\n        groupQuery();\n    } catch (e) {\n        java.longToast(\"番茄登录过期，已隐藏番茄书架\");\n    }\n}\n\nvar style_list = [];\ntry {\n    var durl = `${base_url}/discovestyle?source=${sources}&source_type=${source_type}&tab=${tab}`;\n    var res = java.ajax(durl);\n    var result = JSON.parse(res);\n    style_list = result.data || [];\n\n    // 番茄分类筛选只作用于小说的普通分类，不影响排行榜和其他来源。\n    if (sources == '番茄' && tab == '小说') {\n        var fqWordMap = {\n            '不限': 'word_num_default',\n            '10万字以内': 'word_num_lte10',\n            '30万字以内': 'word_num_lte30',\n            '50万字以内': 'word_num_lte50',\n            '30万字以上': 'word_num_gte30',\n            '50万字以上': 'word_num_gte50',\n            '100万字以上': 'word_num_gte100',\n            '200万字以上': 'word_num_gte200',\n            '300万字以上': 'word_num_gte300',\n            '500万字以上': 'word_num_gte500'\n        };\n        var fqStatusMap = {\n            '不限': 'creation_status_default',\n            '完结': 'creation_status_end',\n            '连载': 'creation_status_loading',\n            '半年内完结': 'creation_status_half_year_end',\n            '3日内更新': 'creation_status_3day_update',\n            '7日内更新': 'creation_status_7day_update',\n            '1月内更新': 'creation_status_1month_update'\n        };\n        var fqSortMap = {\n            '不限': 'sort_default',\n            '热门': 'sort_hot',\n            '新书': 'sort_new_book',\n            '评分': 'sort_score',\n            '字数': 'sort_word_number',\n            '有声': 'sort_audio_book'\n        };\n        var hasActiveFilter = fq_word_filter != '不限' || fq_status_filter != '不限' || fq_sort_filter != '不限';\n        if (hasActiveFilter) {\n            var selectedItems = [\n                fqWordMap[fq_word_filter] || fqWordMap['不限'],\n                fqStatusMap[fq_status_filter] || fqStatusMap['不限'],\n                fqSortMap[fq_sort_filter] || fqSortMap['不限']\n            ].join(',');\n            style_list.forEach(function(item) {\n                if (!item || typeof item.url != 'string') return;\n                var isCategory = item.url.indexOf('/get_discover?') >= 0 &&\n                    item.url.indexOf('source=番茄') >= 0 &&\n                    item.url.indexOf('&type=') >= 0 &&\n                    item.url.indexOf('&bdtype=') < 0 &&\n                    item.url.indexOf('&is_ranking=1') < 0;\n                if (isCategory && item.url.indexOf('&selected_items=') < 0) {\n                    item.url += '&selected_items=' + selectedItems;\n                }\n            });\n        }\n    }\n    if (result.msg) {\n        java.toast(result.msg);\n    }\n} catch (e) {\n    java.toast(\"发现样式获取失败\");\n}\nlet qtcookie = cookie.getCookie(base_url);\n//let qtcookie = \"\"\nlet qtop = {\n    method: \"GET\",\n    headers: {\n        cookie: qtcookie\n    },\n};\n\n\n\nqtop = JSON.stringify(qtop);\nlet qtsjurl = base_url + '/get_book_shelf,' + qtop;\n\nlet qtsj = [];\n\n// 源阅 iOS 已支持新版发现页筛选栏；此书源统一使用新版发现页。\nvar useModernExplore = true;\nif (useModernExplore) {\n    try {\n        qtsj.push(createFilter(\n            \"线路\",\n            host,\n            base_url,\n            \"server\",\n            1\n        ));\n        qtsj.push(createFilter(\n            \"模式\",\n            [\"小说\", \"听书\", \"短剧\", \"漫画\"],\n            tab,\n            \"find_tab\",\n            0.33\n        ));\n        qtsj.push(createFilter(\n            \"频道\",\n            [\"男频\", \"女频\"],\n            source_type,\n            \"source_type\",\n            0.33\n        ));\n        let source_list = ['番茄', '七猫', '书旗', '塔读', '江湖', '小米', '米读', 'QQ阅读', '酷我小说','幻梦轻小说', '西瓜小说', '69书吧', '顶点', '爱下电子书', '伪69', '超会专属小说', '3A小说', '阅友小说', '笔趣阁22', '追更人', '久久小说', '52书库', '腐小说', '完本小说', '盐选文库', '有度中文', '三零读书', '鹿鹿', '星空小说', '365小说', '冷冷文学', '万相书城', '独步小说', '福书网', '速读谷', '全本同人'];\n        if (tab == '听书') {\n            source_list = ['番茄', '七猫', '书旗', '喜马拉雅', '酷我'];\n        }\n        if (tab == '漫画') {\n            source_list = ['全免漫画', '番茄', '漫画屋', '漫画网', '漫客栈', '鸟韩漫', '新新漫画', '武芊漫画', '拷贝漫画', '漫画屋'];\n        }\n        if (tab == '短剧') {\n            source_list = ['番茄', 'YY短剧', '东梨短剧', '星芽短剧', '极速影视'];\n        }\n        qtsj.push(createFilter(\n            \"平台\",\n            source_list,\n            sources,\n            \"find_source\",\n            1\n        ));\n        if (sources == '番茄' && tab == '小说') {\n            qtsj.push(createFilter(\n                \"字数\",\n                [\"不限\", \"10万字以内\", \"30万字以内\", \"50万字以内\", \"30万字以上\", \"50万字以上\", \"100万字以上\", \"200万字以上\", \"300万字以上\", \"500万字以上\"],\n                fq_word_filter,\n                \"fq_word_filter\",\n                0.33\n            ));\n            qtsj.push(createFilter(\n                \"状态\",\n                [\"不限\", \"完结\", \"连载\", \"半年内完结\", \"3日内更新\", \"7日内更新\", \"1月内更新\"],\n                fq_status_filter,\n                \"fq_status_filter\",\n                0.33\n            ));\n            qtsj.push(createFilter(\n                \"排序\",\n                [\"不限\", \"热门\", \"新书\", \"评分\", \"字数\", \"有声\"],\n                fq_sort_filter,\n                \"fq_sort_filter\",\n                0.33\n            ));\n        }\n       const excludeTitles = ['点击登录可切换来源', '切换后长按刷新即可'];\n       style_list = style_list.filter(item => !excludeTitles.includes(item.title));\n    } catch {}\n} else {\n\tif (device_type == '安卓'){\n\tqtsj.push({\n        \"title\": \"下载阅读Sigma最新测试版\",\n        \"url\": '{\\{java.longToast(\"本书源推荐使用最新版洛娅橙改版阅读Σ\\\\n请安装后重新导入书源\");java.startBrowser(\"https://legado.langge.uk\",\"下载阅读Sigma最新测试版\");}}',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    })}\n\t}\n\nif (qtcookie) {\nqtsj.push({\n    title: \"大灰狼个人中心\",\n    url: qtsjurl,\n    style: {\n        layout_flexGrow: 1,\n        layout_flexBasisPercent: 0.45\n    }\n})\n} else {\nqtsj.push({\n    title: \"登录大灰狼书源\",\n    url: `{\\{java.startBrowser(\"${base_url}/login\",\"登录书源\");}}`,\n    style: {\n        layout_flexGrow: 1,\n        layout_flexBasisPercent: 0.45\n    }\n})\n}\n\n\nvar finalData = infoData.concat(groupDatas, style_list);\nfinalData = qtsj.concat(finalData);\nJSON.stringify(finalData);\n</js>", "header": "{ \"User-Agent\":\"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Mobile Safari/537.36 Edg/138.0.0.0\" }", "jsLib": "var host = [\n    'https://v5.langge.uk',\n    'http://219.154.201.122:5006',\n    'https://20.langge.tk',\n    'https://v4.langge.uk',\n    'https://v2.langge.uk',\n    'https://v7.langge.uk',\n    'https://v8.langge.uk',\n    'https://v9.langge.uk',\n    'https://v10.langge.uk'\n];\n\nfunction getArguments(open_argument, key) {\n    try {\n        open_argument = JSON.parse(open_argument);\n    } catch (e) {\n        open_argument = {\n            tab: \"小说\",\n            tone_id: \"默认音色\",\n            shuqi_tone_id: \"multi_role\",\n            server: host[0],\n            sources: \"全部\",\n            source_type: \"男频\",\n            fqpara: \"on\",\n            fqcommunity: \"on\",\n            pstyle: \"0\",\n        };\n    }\n    // 旧版本没有保存 fqpara 字段；缺失时按“开启”处理。\n    // 用户明确选择 off 时仍然保留关闭状态。\n    if (open_argument.fqpara === undefined || open_argument.fqpara === null || open_argument.fqpara === '') {\n        open_argument.fqpara = 'on';\n    }\n    if (!open_argument.shuqi_tone_id || open_argument.shuqi_tone_id === '默认音色') {\n        open_argument.shuqi_tone_id = 'multi_role';\n    }\n    if (key) {\n        return open_argument[key];\n    } else {\n        return open_argument;\n    }\n}\n\nfunction setArguments(key, value) {\n    const {\n        source\n    } = this;\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    open_argument[key] = value;\n    open_argument = JSON.stringify(open_argument);\n    source.setVariable(open_argument);\n    return open_argument;\n}\n\nfunction getFanqieCookie() {\n    var cookieManager = null;\n    try {\n        cookieManager = this.cookie;\n    } catch (e) {}\n    if (!cookieManager) {\n        try {\n            if (typeof cookie !== 'undefined') cookieManager = cookie;\n        } catch (e) {}\n    }\n    if (!cookieManager || typeof cookieManager.getCookie !== 'function') return '';\n\n    var hosts = [\n        'fanqienovel.com',\n        'https://fanqienovel.com/',\n        'https://fanqienovel.com',\n        'https://api5-normal-sinfonlinec.fqnovel.com/'\n    ];\n    var fallback = '';\n    for (var i = 0; i < hosts.length; i++) {\n        try {\n            var value = String(cookieManager.getCookie(hosts[i]) || '');\n            if (!fallback && value) fallback = value;\n            if (/(?:^|;\\s*)sessionid(?:_ss)?=/.test(value)) return value;\n        } catch (e) {}\n    }\n    return fallback;\n}\n\nfunction getSessionId(cookieValue) {\n    var value = String(cookieValue || '');\n    var match = value.match(/(?:^|;\\s*)sessionid(?:_ss)?=([^;]+)/);\n    if (!match) return '';\n    try {\n        return decodeURIComponent(match[1]);\n    } catch (e) {\n        return match[1];\n    }\n}\n\nfunction escapeFanqieCommunityText(value) {\n    return String(value || '')\n        .replace(/&/g, '&amp;')\n        .replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;')\n        .replace(/\"/g, '&quot;');\n}\n\nfunction normalizeFanqieCommunityText(value) {\n    return String(value || '').replace(/\\s+/g, ' ').trim();\n}\n\nfunction shortenFanqieCommunityText(value, maxLength) {\n    var text = normalizeFanqieCommunityText(value);\n    if (!maxLength || text.length <= maxLength) return text;\n    return text.substring(0, Math.max(1, maxLength - 1)) + '\\u2026';\n}\n\nvar FANQIE_EMOJI_PATHS = {\n    \"[微笑]\": \"/static/emoji/emoji_dr_1.png\",\n    \"[偷笑]\": \"/static/emoji/emoji_dr_2.png\",\n    \"[笑]\": \"/static/emoji/emoji_dr_3.png\",\n    \"[什么]\": \"/static/emoji/emoji_dr_4.png\",\n    \"[害羞]\": \"/static/emoji/emoji_dr_5.png\",\n    \"[爱慕]\": \"/static/emoji/emoji_dr_6.png\",\n    \"[飞吻]\": \"/static/emoji/emoji_dr_7.png\",\n    \"[奸笑]\": \"/static/emoji/emoji_dr_8.png\",\n    \"[尬笑]\": \"/static/emoji/emoji_dr_9.png\",\n    \"[思考]\": \"/static/emoji/emoji_dr_10.png\",\n    \"[撇嘴]\": \"/static/emoji/emoji_dr_11.png\",\n    \"[做鬼脸]\": \"/static/emoji/emoji_dr_12.png\",\n    \"[酷]\": \"/static/emoji/emoji_dr_13.png\",\n    \"[翻白眼]\": \"/static/emoji/emoji_dr_14.png\",\n    \"[惊呆]\": \"/static/emoji/emoji_dr_15.png\",\n    \"[震惊]\": \"/static/emoji/emoji_dr_16.png\",\n    \"[送心]\": \"/static/emoji/emoji_dr_17.png\",\n    \"[委屈]\": \"/static/emoji/emoji_dr_18.png\",\n    \"[快哭了]\": \"/static/emoji/emoji_dr_19.png\",\n    \"[笑哭]\": \"/static/emoji/emoji_dr_20.png\",\n    \"[哭]\": \"/static/emoji/emoji_dr_21.png\",\n    \"[大笑]\": \"/static/emoji/emoji_dr_22.png\",\n    \"[舔屏]\": \"/static/emoji/emoji_dr_23.png\",\n    \"[怒]\": \"/static/emoji/emoji_dr_24.png\",\n    \"[捂脸]\": \"/static/emoji/emoji_dr_25.png\",\n    \"[吐]\": \"/static/emoji/emoji_dr_26.png\",\n    \"[恐惧]\": \"/static/emoji/emoji_dr_27.png\",\n    \"[抓狂]\": \"/static/emoji/emoji_dr_28.png\",\n    \"[敬礼]\": \"/static/emoji/emoji_dr_29.png\",\n    \"[石化]\": \"/static/emoji/emoji_dr_30.png\",\n    \"[OK]\": \"/static/emoji/emoji_dr_31.png\",\n    \"[赞]\": \"/static/emoji/emoji_dr_32.png\",\n    \"[爱心]\": \"/static/emoji/emoji_dr_33.png\",\n    \"[伤心]\": \"/static/emoji/emoji_dr_34.png\",\n    \"[KISS]\": \"/static/emoji/emoji_dr_35.png\",\n    \"[懂了]\": \"/static/emoji/emoji_dr_36.png\",\n    \"[探究]\": \"/static/emoji/emoji_dr_37.png\",\n    \"[重拳出击]\": \"/static/emoji/emoji_dr_38.png\",\n    \"[吃瓜]\": \"/static/emoji/emoji_dr_39.png\",\n    \"[盯]\": \"/static/emoji/emoji_dr_40.png\",\n    \"[你细品]\": \"/static/emoji/emoji_dr_41.png\",\n    \"[赶稿中]\": \"/static/emoji/emoji_dr_42.png\",\n    \"[注意]\": \"/static/emoji/emoji_dr_43.png\",\n    \"[饱了]\": \"/static/emoji/emoji_dr_44.png\",\n    \"[码住]\": \"/static/emoji/emoji_dr_45.png\",\n    \"[学会了]\": \"/static/emoji/emoji_dr_46.png\",\n    \"[顶帖]\": \"/static/emoji/emoji_dr_47.png\",\n    \"[求爆更]\": \"/static/emoji/emoji_dr_48.png\",\n    \"[求关注]\": \"/static/emoji/emoji_dr_49.png\",\n    \"[我也强推]\": \"/static/emoji/emoji_dr_50.png\",\n    \"[雀食神作]\": \"/static/emoji/emoji_dr_51.png\",\n    \"[已种草]\": \"/static/emoji/emoji_dr_52.png\",\n    \"[书架加一]\": \"/static/emoji/emoji_dr_53.png\",\n    \"[歪头笑哭]\": \"/static/emoji/emoticon_emoji_wtxk.png\",\n    \"[神评]\": \"/static/emoji/emoticon_xiaoqi_sp.png\",\n    \"[狗头]\": \"/static/emoji/emoticon_emoji_doge.png\",\n    \"[哈哈]\": \"/static/emoji/emoticon_emoji_hhh.png\",\n    \"[流泪]\": \"/static/emoji/emoticon_emoji_tears.png\",\n    \"[可爱]\": \"/static/emoji/emoticon_emoji_cute.png\",\n    \"[色]\": \"/static/emoji/emoticon_emoji_smimi.png\",\n    \"[调皮]\": \"/static/emoji/emoticon_emoji_tpi.png\",\n    \"[小七_神评]\": \"/static/emoji/emoticon_xiaoqi_sp.png\",\n    \"[小七_狗头]\": \"/static/emoji/emoticon_xiaoqi_gt.png\",\n    \"[小七_鄙视]\": \"/static/emoji/emoticon_xiaoqi_bs.png\",\n    \"[小七_高兴]\": \"/static/emoji/emoticon_xiaoqi_gx.png\",\n    \"[小七_黑人问号]\": \"/static/emoji/emoticon_xiaoqi_hrwh.png\",\n    \"[小七_厉害]\": \"/static/emoji/emoticon_xiaoqi_lh.png\",\n    \"[小七_流泪]\": \"/static/emoji/emoticon_xiaoqi_ll.png\",\n    \"[小七_OK]\": \"/static/emoji/emoticon_xiaoqi_ok.png\",\n    \"[小七_色]\": \"/static/emoji/emoticon_xiaoqi_s.png\",\n    \"[小七_伤心]\": \"/static/emoji/emoticon_xiaoqi_sx.png\",\n    \"[小七_调皮]\": \"/static/emoji/emoticon_xiaoqi_tq.png\",\n    \"[小七_委屈]\": \"/static/emoji/emoticon_xiaoqi_wh.png\",\n    \"[小七_笑哭]\": \"/static/emoji/emoticon_xiaoqi_xk.png\",\n    \"[小七_笑嘻嘻]\": \"/static/emoji/emoticon_xiaoqi_xxy.png\",\n    \"[小七_斜眼笑]\": \"/static/emoji/emoticon_xiaoqi_xyx.png\",\n    \"[小七_赞美]\": \"/static/emoji/emoticon_xiaoqi_zm.png\",\n    \"[眯眼笑]\": \"/static/emoji/emoticon_xiaoqi_xxy.png\"\n};\n\nfunction getFanqieEmojiMap(baseUrl) {\n    var root = String(baseUrl || \"\").replace(/\\/$/, \"\");\n    var result = {};\n    Object.keys(FANQIE_EMOJI_PATHS).forEach(function(name) {\n        result[name] = root + FANQIE_EMOJI_PATHS[name];\n    });\n    return result;\n}\n\nvar FANQIE_CARD_EMOJI_TEXT = {\n    \"[微笑]\":\"😊\",\"[偷笑]\":\"😏\",\"[笑]\":\"😁\",\"[什么]\":\"🤔\",\"[害羞]\":\"😳\",\"[爱慕]\":\"😍\",\"[飞吻]\":\"😘\",\"[奸笑]\":\"😏\",\"[尬笑]\":\"😅\",\"[思考]\":\"🤔\",\"[撇嘴]\":\"😒\",\"[做鬼脸]\":\"😜\",\"[酷]\":\"😎\",\"[翻白眼]\":\"🙄\",\"[惊呆]\":\"😲\",\"[震惊]\":\"😱\",\"[送心]\":\"❤️\",\"[委屈]\":\"🥺\",\"[快哭了]\":\"😭\",\"[笑哭]\":\"😂\",\"[哭]\":\"😢\",\"[大笑]\":\"😆\",\"[舔屏]\":\"😋\",\"[怒]\":\"😡\",\"[捂脸]\":\"🤦\",\"[吐]\":\"🤮\",\"[恐惧]\":\"😨\",\"[抓狂]\":\"😫\",\"[敬礼]\":\"🫡\",\"[石化]\":\"🗿\",\"[OK]\":\"👌\",\"[赞]\":\"👍\",\"[爱心]\":\"💖\",\"[伤心]\":\"💔\",\"[KISS]\":\"💋\",\"[懂了]\":\"✅\",\"[探究]\":\"🔎\",\"[重拳出击]\":\"👊\",\"[吃瓜]\":\"🍉\",\"[盯]\":\"👀\",\"[你细品]\":\"🤌\",\"[赶稿中]\":\"✍️\",\"[注意]\":\"⚠️\",\"[饱了]\":\"😋\",\"[码住]\":\"🔖\",\"[学会了]\":\"✅\",\"[顶帖]\":\"📌\",\"[求爆更]\":\"🙏\",\"[求关注]\":\"🔔\",\"[我也强推]\":\"🚀\",\"[雀食神作]\":\"👍\",\"[已种草]\":\"🌱\",\"[书架加一]\":\"📚+1\",\"[歪头笑哭]\":\"😂\",\"[神评]\":\"🌟\",\"[狗头]\":\"🐶\",\"[哈哈]\":\"😆\",\"[流泪]\":\"😭\",\"[可爱]\":\"🥰\",\"[色]\":\"😍\",\"[调皮]\":\"😜\",\"[小七_神评]\":\"🌟\",\"[小七_狗头]\":\"🐶\",\"[小七_鄙视]\":\"😒\",\"[小七_高兴]\":\"😊\",\"[小七_黑人问号]\":\"❓\",\"[小七_厉害]\":\"👍\",\"[小七_流泪]\":\"😭\",\"[小七_OK]\":\"👌\",\"[小七_色]\":\"😍\",\"[小七_伤心]\":\"💔\",\"[小七_调皮]\":\"😜\",\"[小七_委屈]\":\"🥺\",\"[小七_笑哭]\":\"😂\",\"[小七_笑嘻嘻]\":\"😁\",\"[小七_斜眼笑]\":\"😏\",\"[小七_赞美]\":\"👏\",\"[眯眼笑]\":\"😁\"\n};\n\nfunction splitFanqieGodNoteEmojis(value, baseUrl, sources) {\n    var text = String(value || \"\").replace(/\\[[^\\[\\]]+\\]/g, function(token) {\n        return FANQIE_CARD_EMOJI_TEXT[token] || token;\n    }).replace(/\\s+/g, \" \").trim();\n    return { text: text, images: \"\" };\n}\nfunction decodeFanqieNoteText(value) {\n    return String(value || '')\n        .replace(/&#x([0-9a-f]+);/gi, function(_match, code) {\n            return String.fromCharCode(parseInt(code, 16));\n        })\n        .replace(/&#([0-9]+);/g, function(_match, code) {\n            return String.fromCharCode(parseInt(code, 10));\n        })\n        .replace(/&quot;/g, '\"')\n        .replace(/&apos;|&lsquo;|&rsquo;/g, \"'\")\n        .replace(/&lt;/g, '<')\n        .replace(/&gt;/g, '>')\n        .replace(/&amp;/g, '&');\n}\n\n// 将后端返回的 <note> 神评标签转换成阅读/源阅可渲染的 SVG 卡片。\nfunction getFanqieNoteAttribute(noteTag, name) {\n    var reg = new RegExp(name + '=\\\"([^\\\"]*)\\\"');\n    var match = String(noteTag || '').match(reg);\n    if (!match) return '';\n    try { return decodeFanqieNoteText(match[1]); } catch (e) { return match[1]; }\n}\n\nfunction cleanFanqieGodNoteText(value) {\n    var text = String(value || '')\n        .replace(/<[^>]*>/g, ' ')\n        .replace(/\\[fn=(\\d+)\\]/g, '[表情]')\n        .replace(/\\s+/g, ' ')\n        .trim();\n    return text;\n}\n\nfunction createFanqieGodNoteCard(noteTag, sources) {\n    var noteUrl = getFanqieNoteAttribute(noteTag, 'ident');\n    var rawNoteText = getFanqieNoteAttribute(noteTag, 'text');\n    var noteText = cleanFanqieGodNoteText(rawNoteText);\n    if (!noteText) return '';\n    var originMatch = String(noteUrl || '').match(/^(https?:\\/\\/[^\\/]+)/);\n    var baseUrl = originMatch ? originMatch[1] : getArguments(this.source.getVariable(), 'server');\n    var isShuqi = String(sources || '').indexOf('书旗') >= 0;\n    var jc = 'js';\n    try { if (this.checkEnv() == '改版') jc = 'click'; } catch (e) {}\n    var actionUrl = String(noteUrl || '').replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\").replace(/[\\r\\n]/g, '');\n    var title = String(sources || '番茄').replace(/'/g, '');\n    var meta = '{\"' + jc + '\":\"showCmt(\\'' + actionUrl + '\\',\\'' + title + '\\',\\'段评\\')\",\"style\":\"FULL\"}';\n    if (isShuqi) {\n        var cardUrl = String(baseUrl || '').replace(/\\/$/, '') + '/shuqi_god_card_svg?text=' + encodeURIComponent(rawNoteText) + '&v=4';\n        return '<img src=\"' + cardUrl + ',' + meta + '\">';\n    }\n    var emojiResult = splitFanqieGodNoteEmojis(rawNoteText, baseUrl, sources);\n    var displayText = shortenFanqieCommunityText(cleanFanqieGodNoteText(emojiResult.text), 27);\n    var svg = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1000\" height=\"108\" viewBox=\"0 0 1000 108\">' +\n        '<rect width=\"100%\" height=\"100%\" fill=\"rgba(255,255,255,0.55)\" rx=\"30\"/>' +\n        '<rect x=\"35\" y=\"28\" width=\"125\" height=\"52\" rx=\"16\" fill=\"#F06260\"/>' +\n        '<text x=\"97\" y=\"65\" font-size=\"32\" fill=\"#FFFFFF\" text-anchor=\"middle\" font-weight=\"bold\">神评论</text>' +\n        '<text x=\"175\" y=\"67\" font-size=\"38\" fill=\"#333333\">' + escapeFanqieCommunityText(displayText) + '</text>' +\n        '</svg>';\n    return '<img src=\"data:image/svg+xml;base64,' + this.java.base64Encode(svg) + ',' + meta + '\">';\n}\nfunction renderFanqieGodNoteCards(value, sources) {\n    var runtime = this;\n    return String(value || '').replace(/<note\\b[^>]*>(?:<\\/note>)?/g, function(noteTag) {\n        return createFanqieGodNoteCard.call(runtime, noteTag, sources) || '';\n    });\n}\nfunction checkEnv() {\n    const {\n        java,\n        source\n    } = this;\n\n    try {\n        java.qread();\n        return \"轻阅读\";\n    } catch (e) {}\n\n    try {\n        if (typeof java.reLoginView == 'function') {\n            return \"改版\";\n        }\n        new Packages.io.legato.kazusa.utils.TimeoutCancellationException('');\n        return \"改版\";\n    } catch (e) {}\n    try {\n        java.deviceID();\n        return \"苹果\";\n    } catch (e) {}\n\n    if (typeof source.loginUi == 'function') {\n        return \"安卓\";\n    }\n\n    return \"改版\";\n}\n\n// 获取番茄token\n\nfunction createGod(url,svg) {\n    var jc = 'js';\n    let islyc = this.checkEnv()\n    if (islyc == \"改版\") {\n        jc = 'click'\n    }\n   let cz= `{\"${jc}\":\"showCmt('${url}','段评' )\",\"style\":\"FULL\"}`\n\tlet img = `<img src=\"${svg},${cz}\">`\n\treturn img\n\t}\n\nlet svgs = [\"<svg t='1760002253572' class='icon' viewBox='-150 0 1224 1224' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='1490' width='800' height='800'><g transform='rotate(90 512 512) scale(1 1.2)'><path d='M224 149.333333h576c40.533333 0 74.666667 34.133333 74.666667 74.666667v460.8c0 40.533333-34.133333 74.666667-74.666667 74.666667h-108.8c-40.533333 0-78.933333 17.066667-104.533334 46.933333l-49.066666 55.466667c-4.266667 6.4-14.933333 10.666667-23.466667 10.666667-10.666667 0-19.2-4.266667-25.6-10.666667l-46.933333-55.466667c-25.6-29.866667-64-46.933333-104.533334-46.933333h-110.933333c-40.533333 0-74.666667-34.133333-74.666667-74.666667V224c0-40.533333 34.133333-74.666667 74.666667-74.666667z' fill='$tccolor' p-id='1529'></path><path d='M512 938.666667c-27.733333 0-55.466667-12.8-72.533333-34.133334l-46.933334-55.466666c-14.933333-17.066667-34.133333-25.6-57.6-25.6h-110.933333c-76.8 0-138.666667-61.866667-138.666667-138.666667V224C85.333333 147.2 147.2 85.333333 224 85.333333h573.866667c76.8 0 138.666667 61.866667 138.666666 138.666667v460.8c0 76.8-61.866667 138.666667-138.666666 138.666667h-108.8c-21.333333 0-42.666667 8.533333-55.466667 25.6l-49.066667 55.466666c-17.066667 21.333333-44.8 34.133333-72.533333 34.133334zM224 149.333333C183.466667 149.333333 149.333333 183.466667 149.333333 224v460.8c0 40.533333 34.133333 74.666667 74.666667 74.666667h110.933333c40.533333 0 78.933333 17.066667 104.533334 49.066666l46.933333 55.466667c6.4 6.4 14.933333 10.666667 25.6 10.666667 8.533333 0 19.2-4.266667 23.466667-10.666667l49.066666-55.466667c25.6-29.866667 64-46.933333 104.533334-46.933333h108.8c40.533333 0 74.666667-34.133333 74.666666-74.666667V224C874.666667 183.466667 840.533333 149.333333 800 149.333333h-576z' fill='$color' p-id='1530'></path> </g><text x='460' y='650' font-family='Arial, sans-serif' text-anchor='middle' font-size='400' fill='$fontcolor'>$displayText</text></svg>\"];\n\n\n// 创建svg\n\nfunction showFanqieComment(url, title) {\n    let { java } = this;\n    title = title || '本章说';\n    let pageUrl = String(url || '');\n    if (!pageUrl) {\n        try { java.toast('评论地址为空，请刷新本章'); } catch (e) {}\n        return;\n    }\n    let islyc = this.checkEnv();\n    try {\n        if (islyc == '轻阅读') {\n            java.startBrowserDp(pageUrl, title);\n            return;\n        }\n        if (islyc == '改版') {\n            let htmlContent = java.ajax(pageUrl);\n            java.showBrowser(\n                pageUrl,\n                htmlContent,\n                `window.java=java;`,\n                JSON.stringify({\n                    \"expandedCornersRadius\": 20,\n                    \"dismissOnTouchOutside\": true,\n                    \"isDraggable\": true,\n                    \"shouldDimBackground\": true,\n                    \"backgroundDimAmount\": 0.5,\n                    \"hardwareAccelerated\": true,\n                    \"isNestedScrollingEnabled\": true,\n                    \"isGestureInsetBottomIgnored\": true,\n                    \"setFitToContents\": true,\n                    \"isHideable\": true,\n                    \"heightPercentage\": 0.8\n                })\n            );\n            return;\n        }\n        try {\n            java.showReadingBrowser(pageUrl, title);\n            return;\n        } catch (e) {}\n        java.startBrowser(pageUrl, title);\n    } catch (e) {\n        try { java.startBrowser(pageUrl, title); } catch (err) { java.log('打开番茄评论页失败:' + err); }\n    }\n}\n\n\n// 生成本章说尾部卡片的点击协议，只负责打开官方评论聚合页，不复用段评点击逻辑。\nfunction endclick(url, title) {\n    var jc = 'js';\n    let islyc = this.checkEnv();\n    if (islyc == '改版') {\n        jc = 'click';\n    }\n    title = title || '本章说';\n    return `\"${jc}\":\"showFanqieComment('${url}','${title}')\"`;\n}\n\n\nfunction paraForAndroid(content, sources) {\n    let {\n        java,\n        cache,\n        source\n    } = this;\n    const createSvg = this.createSvg.bind(this);\n    const createGod = this.createGod.bind(this);\n    content = renderFanqieGodNoteCards.call(this, content, sources);\n     content = content.replace(\n        /<p><img ident=\"([^\"]*)\" src=\"([^\"]*)\"\\s*\\/><\\/p>/g,\n        (match, ident, src) => {\n            return `<p>${createGod(ident, src)}</p>`;\n        }\n    );\n    \n\n    return content.replace(/<p>(.*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\/>)?<\\/p>/g,\n        (match, text, url, count) => {\n            if (url && count) {\n                const click = 0;\n                cache.putMemory(url, click);\n                const encodedUrl = url;\n                return `<p>${text}<img src=\"${createSvg(count, encodedUrl,sources)}\"></p>`;\n            } else {\n                return `<p>${text}</p>`;\n            }\n        }\n    );\n}\n// 创建神评论\n\nfunction showCmt(url, sources,ident) {\n    let {\n        java,\n        cache\n    } = this;\n    if (ident == null) ident = '段评';\n    const currentTime = Date.now();\n    const click = cache.getFromMemory(url);\n    let islyc = this.checkEnv()\n    if (click < 1 && islyc == \"安卓\") {\n        cache.putMemory(url, click + 1);\n        return;\n    } else {\n        if (islyc == \"轻阅读\") {\n            java.startBrowserDp(url, sources + ident);\n        } else if (islyc == \"改版\") {\n            let paradata = new Date().toLocaleDateString();\n            let isQimaoComment = String(url || '').indexOf('/qimao_comment?') >= 0;\n            let htmlContent = isQimaoComment ? '' : cache.get(paradata+ident+\"new4\");\n            if (!htmlContent || String(htmlContent).indexOf(\"评论\") == -1) {\n                java.longToast(`\\n${paradata} 初始化${ident}页面,请稍等~`);\n                try {\n                    htmlContent = java.ajax(url);\n                } catch {\n\n                }\n\n                if (!isQimaoComment) cache.put(paradata+ident+\"new4\", htmlContent);\n                java.longToast(`\\n${paradata} 初始化${ident}页面成功~`);\n            }\n            java.showBrowser(\n                url,\n                htmlContent,\n                `window.java=java;`,\n                JSON.stringify({\n                    \"expandedCornersRadius\": 20,\n                    \"dismissOnTouchOutside\": true,\n                    \"isDraggable\": true,\n                    \"shouldDimBackground\": true,\n                    \"backgroundDimAmount\": 0.5,\n                    \"hardwareAccelerated\": true,\n                    \"isNestedScrollingEnabled\": true,\n                    \"isGestureInsetBottomIgnored\": true,\n                    \"setFitToContents\": true,\n                    \"isHideable\": true,\n                    \"heightPercentage\": 0.8\n                })\n            );\n        } else {\n            java.startBrowser(url, sources + ident);\n        }\n    }\n}\n\n//源阅段评\n\nfunction normalizeBubbleTemplateConfig(value, origin) {\n    var result = {};\n    if (!value || typeof value != 'object') return result;\n    Object.keys(value).forEach(function(key) {\n        var item = value[key];\n        var data = item && typeof item == 'object' ? item : {svg: String(item || '')};\n        var svg = String(data.svg || '');\n        var renderPath = String(data.renderPath || data.renderUrl || '');\n        if (svg.indexOf('<svg') < 0 && !renderPath) return;\n        result[String(key)] = {\n            name: String(data.name || ('样式 ' + key)),\n            type: String(data.type || (renderPath ? 'image' : 'svg')),\n            svg: svg,\n            renderPath: renderPath,\n            _origin: String(origin || '').replace(/\\/$/, '')\n        };\n    });\n    return result;\n}\n\nfunction getBubbleTemplates() {\n    var now = Date.now();\n    var memoryKey = '__bubble_templates_cache_v3__';\n    try {\n        if (this.cache && typeof this.cache.getFromMemory === 'function') {\n            var cached = String(this.cache.getFromMemory(memoryKey) || '');\n            if (cached) {\n                var memory = JSON.parse(cached);\n                if (memory && memory.templates && Object.keys(memory.templates).length && now - Number(memory.time || 0) < 30000) {\n                    return memory.templates;\n                }\n            }\n        }\n    } catch (e) {}\n    var server = String(getArguments(this.source.getVariable(), 'server') || host[0]).replace(/\\/$/, '');\n    var servers = [server].concat(host || []).filter(function(value, index, values) {\n        value = String(value || '').replace(/\\/$/, '');\n        return value && values.map(function(item) { return String(item || '').replace(/\\/$/, ''); }).indexOf(value) == index;\n    });\n    var paths = ['/api/bubbles?_=','/static/js/bubble_templates.json?_='];\n    for (var i = 0; i < servers.length; i++) {\n        var currentServer = String(servers[i]).replace(/\\/$/, '');\n        for (var pathIndex = 0; pathIndex < paths.length; pathIndex++) {\n            try {\n                var raw = String(this.java.ajax(currentServer + paths[pathIndex] + now) || '{}');\n                var templates = normalizeBubbleTemplateConfig(JSON.parse(raw), currentServer);\n                if (Object.keys(templates).length) {\n                    try {\n                        if (this.cache && typeof this.cache.putMemory === 'function') {\n                            this.cache.putMemory(memoryKey, JSON.stringify({ time: now, templates: templates }));\n                        }\n                    } catch (e) {}\n                    return templates;\n                }\n            } catch (e) {\n                try { this.java.log('气泡模板加载失败: ' + e); } catch (_) {}\n            }\n        }\n    }\n    var fallback = {\n        '0': {name: '经典气泡', type: 'svg', svg: svgs[0], renderPath: '', _origin: server}\n    };\n    try {\n        if (this.cache && typeof this.cache.putMemory === 'function') {\n            this.cache.putMemory(memoryKey, JSON.stringify({ time: now, templates: fallback }));\n        }\n    } catch (e) {}\n    return fallback;\n}\n\nfunction createSvg(number, encodedUrl, sources) {\n    var displayText = number > 99 ? \"99+\" : number.toString();\n    let configuredColor = '';\n    try {\n        configuredColor = String(getArguments(this.source.getVariable(), \"plcolor\") || '').trim();\n    } catch (e) {}\n    let plcolor = /^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(configuredColor) ? configuredColor : \"#A7A7A7\";\n    let bubbleStyle = String(getArguments(this.source.getVariable(), 'pstyle') || '0');\n    let templates = getBubbleTemplates.call(this);\n    if (!templates[bubbleStyle]) bubbleStyle = Object.keys(templates)[0] || '0';\n    let selectedTemplate = templates[bubbleStyle] || templates['0'];\n    var jc = 'js';\n    let islyc = this.checkEnv();\n    if (islyc == \"改版\") jc = 'click';\n    let style = 'text';\n    var action = '{\"' + jc + '\":\"showCmt(\\'' + encodedUrl + '\\', \\'' + sources + '\\' ,\\'段评\\')\",\"style\":\"' + style + '\"}';\n\n    if (selectedTemplate && selectedTemplate.renderPath) {\n        var renderPath = String(selectedTemplate.renderPath || '');\n        var renderUrl = /^https?:\\/\\//i.test(renderPath)\n            ? renderPath\n            : String(selectedTemplate._origin || getArguments(this.source.getVariable(), 'server') || host[0]).replace(/\\/$/, '') + (renderPath.charAt(0) == '/' ? renderPath : '/' + renderPath);\n        renderUrl += (renderUrl.indexOf('?') >= 0 ? '&' : '?') + 'count=' + encodeURIComponent(displayText) + '&color=' + encodeURIComponent(plcolor);\n        return renderUrl + ',' + action;\n    }\n\n    let color = plcolor;\n    let tccolor = 'transparent';\n    let fontcolor = plcolor;\n    let svg = selectedTemplate && selectedTemplate.svg ? selectedTemplate.svg : svgs[0];\n    svg = svg.replace(/\\{\\{color\\}\\}/g, color)\n        .replace(/\\{\\{tccolor\\}\\}/g, tccolor)\n        .replace(/\\{\\{count\\}\\}/g, displayText)\n        .replace(/\\$color/g, color)\n        .replace(/\\$tccolor/g, tccolor)\n        .replace(/\\$fontcolor/g, fontcolor)\n        .replace(/\\$displayText/g, displayText);\n    var encodedSvg = this.java.base64Encode(svg);\n    return 'data:image/svg+xml;base64,' + encodedSvg + ',' + action;\n}\n\n\n// 显示弹窗\n\n\n\nvar CompatibilityUtils = {\n    hasJavaClass: function(className) {\n        try {\n            var parts = className.split('.');\n            var obj = Packages;\n            for (var i = 0; i < parts.length; i++) {\n                obj = obj[parts[i]];\n                if (!obj) return false;\n            }\n            return true;\n        } catch (e) {\n            return false;\n        }\n    },\n    \n    safeImport: function(javaImport) {\n        var classes = [\n            'android.util.Base64',\n            'java.lang.String', \n            'java.net.URL',\n            'okhttp3.HttpUrl'\n        ];\n        \n        classes.forEach(function(className) {\n            if (this.hasJavaClass(className)) {\n                try {\n                    var classObj = eval('Packages.' + className);\n                    javaImport.importClass(classObj);\n                } catch (e) {\n                    java.log('无法导入类: ' + className);\n                }\n            }\n        }.bind(this));\n        \n        return javaImport;\n    }\n};\n\n\nvar javaImport = CompatibilityUtils.safeImport(new JavaImporter());\n\nwith(javaImport) {\n    \n\n    function getSubDomain(url) {\n        let baseUrl = getBaseUrl(url);\n        if (!baseUrl) {\n            return url;\n        }\n        try {\n            let mURL = URL(baseUrl);\n            let host = mURL.host;\n            if (isIPAddress(host)) return host;\n            return HttpUrl.parse(baseUrl).topPrivateDomain() || host;\n        } catch (e) {\n            this.java.log(e);\n            return baseUrl;\n        }\n    }\n\n    function getDomain(url) {\n        let baseUrl = getBaseUrl(url);\n        if (!baseUrl) {\n            return url;\n        }\n        try {\n            return URL(baseUrl).host;\n        } catch (e) {\n            return baseUrl;\n        }\n    }\n    /**\n     * 移除cookie\n     */\n    function removeCookie(url) {\n        const {\n            cookie\n        } = this;\n        cookie.removeCookie(url);\n        let domains = [getDomain(url), getSubDomain(url)];\n        domains.forEach((domain) => {\n            cookie.removeCookie(domain);\n        });\n    }\n}\n\nfunction getBaseUrl(url) {\n    if (!url) {\n        return null;\n    }\n    url = String(url);\n    if (url.match(/https?:\\/\\//i)) {\n        var index = url.indexOf(\"/\", 9);\n        return index == -1 ? url : url.substring(0, index);\n    }\n    return null;\n}\n\nfunction isIPv4Address(ip) {\n    ip = String(ip);\n    let parts = ip.split(\".\");\n    if (parts.length !== 4) return false;\n\n    for (let part of parts) {\n        if (!/^\\d+$/.test(part)) return false; // 必须是数字\n        if (part.length > 1 && part[0] === \"0\") return false; // 禁止前导零\n        let num = parseInt(part, 10);\n        if (num < 0 || num > 255) return false; // 范围检查\n    }\n    return true;\n}\n\nfunction isIPv6Address(ip) {\n    ip = String(ip);\n    // 处理双冒号（最多出现一次）\n    if (ip.includes(\":::\")) return false;\n    let doubleColonCount = (ip.match(/::/g) || []).length;\n    if (doubleColonCount > 1) return false;\n\n    // 分割成组\n    let groups = ip.split(\":\");\n    let validGroupCount = 8;\n    let actualGroupCount = groups.filter((g) => g !== \"\").length;\n\n    // 验证组数\n    if (doubleColonCount === 1) {\n        if (actualGroupCount > validGroupCount - 1) return false;\n    } else {\n        if (groups.length !== validGroupCount) return false;\n    }\n\n    // 验证每组内容\n    for (let group of groups) {\n        if (group === \"\") continue; // 跳过空组（双冒号部分）\n        if (!/^[0-9a-fA-F]{1,4}$/.test(group)) return false; // 1-4位十六进制\n    }\n    return true;\n}\n\nfunction isIPAddress(input) {\n    return isIPv4Address(input) || isIPv6Address(input);\n}\n\nfunction getKey(key) {\n    let parts = key.split(\";\");\n    for (let part of parts) {\n        if (part.includes(\"qttoken\")) {\n            return part.split(\"=\")[1];\n        }\n    }\n    return \"\";\n}\n\nfunction paraForiOS(html, sources) {\n    html = renderFanqieGodNoteCards.call(this, html, sources);\n\t   let result = html.replace(\n        /<p><img ident=\"([^\"]*)\" src=\"([^\"]*)\"\\s*\\/><\\/p>/g,\n        (match, ident, src) => {\n            return `<div rs-native>${createGod(ident, src)}</div>`;\n        }\n    );\n    result = result.replace(\n        /<p>(.*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\/>)?<\\/p>/g,\n        function(match, text, url, count) {\n            if (url && count) {\n                const encodedUrl = url.replace(/&/g, '&amp;');\n                let displayCount = count;\n                const numCount = Number(count);\n                if (!isNaN(numCount) && numCount > 99) {\n                    displayCount = '99';\n                }\n                return `<div rs-native>${text}<comment count=\"${displayCount}\" onPress=\"java.showReadingBrowser('${encodedUrl}','${sources}段评')\"></div>`;\n            } else {\n                return `<div rs-native>${text}</div>`;\n            }\n        }\n    );\n    return result.replace(/&#34;/g, '\"');\n}\n\n\n\n\n//按钮切换时改变源变量并刷新发现\nfunction show(m, t) {\n    const {\n        java,\n        source\n    } = this;\n    //源变量为空时刷新发现，重置源变量\n    source.getVariable()==''?java.refreshExplore():'';//\n    var data = JSON.parse(source.getVariable());\n    //java.log(data);\n    data[t] = m;\n    if (t==\"find_tab\"){\n    \tdata[\"find_source\"]=\"番茄\";\n    \t}\n    //java.longToast(JSON.stringify(data));\n    source.setVariable(JSON.stringify(data, null, 2));\n    java.refreshExplore();\n}\n\n/**\n * 创建筛选器配置\n * @param {string} title - 筛选器标题\n * @param {string[]} chars - 选项列表\n * @param {string} defaultVal - 默认值\n * @param {string} paramKey - URL参数名\n * @param {number} size - 布局占比（0-1之间，如0.33表示33%）\n * @returns {Object} 筛选器配置对象\n */\nfunction createFilter(title, chars, defaultVal, paramKey, size) {\n    return {\n        title: title,\n        type: \"select\",\n        chars: chars,\n        default: defaultVal,\n        action: `show(infoMap['${title}'],'${paramKey}')`,\n        style: {\n            layout_flexGrow: 1,\n            layout_flexBasisPercent: size\n        }\n    };\n}\n\nfunction removeAllImgTags(htmlString) {\n    const imgTagRegex = /<img\\b[^>]*>|<\\/img>|<img\\b[^>]*\\/>/gi;\n    return htmlString.replace(imgTagRegex, '');\n}\n\n\n// 书旗音色使用稳定数字编号；真实Key只在请求前转换。\nvar SHUQI_TONE_OPTIONS = [\n    {number: '1', name: '多角色对话', key: 'multi_role'},\n    {number: '2', name: '双角色对话', key: 'double_role'},\n    {number: '3', name: '成熟男人', key: 'mingge'},\n    {number: '4', name: '甜美少女', key: 'yifei'},\n    {number: '5', name: '阳光青年', key: 'xiaohou'},\n    {number: '6', name: '知性主播', key: 'qianxue'},\n    {number: '7', name: '沉稳男士', key: 'SQ_M03_PB_1218_01'},\n    {number: '8', name: '温婉淑女', key: 'F1029_PB_1128'},\n    {number: '9', name: '清朗学长', key: 'SQ_iVc8TnhZXioTB52v'},\n    {number: '10', name: '清冷校花', key: 'SQ_5Oh4F5zWa8EZbWvr'},\n    {number: '11', name: '沉稳青叔', key: 'zh_male_quarkttsV1_novel_King196'},\n    {number: '12', name: '博主小帅', key: 'zh-CN-YunxiNeural'},\n    {number: '13', name: '博主小美', key: 'zh-CN-XiaochenNeural'},\n    {number: '14', name: '敏敏郡主', key: 'zhaomin'},\n    {number: '15', name: '无忌哥哥', key: 'wuji'}\n];\n\nfunction getShuqiToneOption(value) {\n    value = String(value == null ? '' : value).trim();\n    for (var i = 0; i < SHUQI_TONE_OPTIONS.length; i++) {\n        var option = SHUQI_TONE_OPTIONS[i];\n        if (value == option.number || value == option.name || value == option.key) return option;\n    }\n    return null;\n}\n\nfunction resolveShuqiToneId(value) {\n    var option = getShuqiToneOption(value);\n    return option ? option.key : String(value || 'multi_role');\n}\n\nfunction getShuqiToneNumber(value) {\n    var option = getShuqiToneOption(value);\n    return option ? option.number : String(value || '1');\n}\n\nfunction getShuqiToneName(value) {\n    var option = getShuqiToneOption(value);\n    return option ? option.name : String(value || '多角色对话');\n}\n", "lastUpdateTime": "1790360602396", "loginUi": "[\n  {\n    \"name\": \"邮箱\",\n    \"type\": \"text\"\n  },\n  {\n    \"name\": \"密码\",\n    \"type\": \"password\"\n  },\n  {\n    \"name\": \"♥登录书源\",\n    \"type\": \"button\",\n    \"action\": \"login(true)\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"🔐注册书源\",\n    \"type\": \"button\",\n    \"action\": \"register()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \" 🔚 退出登录\",\n    \"type\": \"button\",\n    \"action\": \"logout()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"🏝用户后台\",\n    \"type\": \"button\",\n    \"action\": \"loginqt()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"⚙️ 书源设置中心\",\n    \"type\": \"button\",\n    \"action\": \"openSourceSettings()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"name\": \"🔮 检测登录\",\n    \"type\": \"button\",\n    \"action\": \"checkStatus()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"☕打赏享福利\",\n    \"type\": \"button\",\n    \"action\": \"vip()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"❇️ 更新书源\",\n    \"type\": \"button\",\n    \"action\": \"renderVersionPage()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"🍅番茄登录\",\n    \"type\": \"button\",\n    \"action\": \"fq_login()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"⛔️清空设置\",\n    \"type\": \"button\",\n    \"action\": \"reCookieSettings()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"✨设置检测\",\n    \"type\": \"button\",\n    \"action\": \"applyCookieSettings()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"📌永久发布页📌\",\n    \"type\": \"button\",\n    \"action\": \"api()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \" 🗑 清除设备\",\n    \"type\": \"button\",\n    \"action\": \"clearDevice()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"🎚切换服务器\",\n    \"type\": \"button\",\n    \"action\": \"set_server()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"♻️检测当前服务器\",\n    \"type\": \"button\",\n    \"action\": \"checkNet()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"📐 使用教程\",\n    \"type\": \"button\",\n    \"action\": \"jc()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"📡 发现页兼容\",\n    \"type\": \"button\",\n    \"action\": \"fxyjr()\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.4\n    }\n  },\n  {\n    \"name\": \"自定义搜索源(多个用英文,分割)\",\n    \"type\": \"text\"\n  },\n  {\n    \"name\": \"自定义服务器(可不填)\",\n    \"type\": \"text\"\n  },\n  {\n    \"name\": \"自定义评论颜色(可不填)\",\n    \"type\": \"text\"\n  },\n  {\n    \"name\": \"手动填写番茄token(可不填)\",\n    \"type\": \"text\"\n  }\n]", "loginUrl": "// 当前书源版本号，切勿修改，否则影响更新的识别\nconst localVersion = '5.9.26';\n\nlet controlUrl = host[0];\n\nfunction login(flag) {\n    if (flag == undefined) {\n        result = JSON.parse(source.getLoginInfo())\n    } else {\n        java.longToast(\"\\n\\n💞正在登录中...\")\n        putLoginInfo(JSON.stringify(result))\n    }\n    let base_url = getArgument('server') || host[0]\n    let zdyserver = String(result['自定义服务器(可不填)']);\n    if (zdyserver.includes('http')) {\n        setArgument('server', zdyserver);\n        if (getKey(String(cookie.getCookie(base_url)))) {\n            let cookies = cookie.getCookie(base_url)\n            try {\n                cookie.removeCookie(base_url)\n            } catch (e) {}\n            cookie.setCookie(zdyserver, cookies)\n        }\n        java.toast(`\\n\\n当前服务器为自定义服务器\\n${zdyserver}\\n\\n切换服务器请先清空服务器地址中的数据`);\n    }\n    let configuredPlcolor = String(result['自定义评论颜色(可不填)'] || '').trim();\n    let plcolor = configuredPlcolor || '#A7A7A7';\n    setArgument('plcolor', plcolor);\n    let zdysources = String(result['自定义搜索源(多个用英文,分割)'] || '');\n    if (zdysources) {\n        setArgument('sources', zdysources);\n    };\n    base_url = getArgument('server')\n    let register_email = String(result['邮箱'] || '').trim()\n    let password = String(result['密码'] || '').trim()\n    let key = String(result['密钥'] || '').trim()\n    if (key === 'undefined' || key === 'null') key = ''\n\n    // 主动点击登录时，邮箱或密码为空不允许使用残留密钥登录。\n    if (flag && (!register_email || !password)) {\n        try {\n            if (result && typeof result === 'object') {\n                delete result['密钥'];\n                putLoginInfo(JSON.stringify(result));\n            }\n        } catch (e) {}\n        java.toast(\"\\n\\n⛔️请先填写邮箱和密码\");\n        return;\n    }\n\n    if ((register_email && password || key) && !String(getKey(String(cookie.getCookie(base_url))))) {\n        try {\n            cookie.removeCookie(base_url)\n        } catch (e) {}\n        let deviceKey = '';\n        try {\n            deviceKey = java.deviceID();\n        } catch (e) {\n            deviceKey = java.androidId();\n        };\n        let deviceId = deviceKey;\n        if (register_email && password) {\n            let options = JSON.stringify({\n                method: 'POST',\n                headers: {\n                    'Content-Type': 'application/json'\n                },\n                body: JSON.stringify({\n                    register_email: result['邮箱'],\n                    password: result['密码']\n                })\n            })\n            try {\n                let data = JSON.parse(java.ajax(`${base_url}/login_api,${options}`))\n                if (data.code == 0) {\n                    //java.toast(deviceId)\n                    java.toast(\"\\n\\n✅️登录成功\")\n                    cookie.setCookie(base_url, `qttoken=${data.key};deviceId=${deviceId}`);\n                    for (var _h = 0; _h < host.length; _h++) { try { cookie.setCookie(host[_h], `qttoken=${data.key};deviceId=${deviceId}`); } catch(_e){} }\n                    result['密钥'] = data.key\n                    setArgument('qttoken', data.key);\n                    putLoginInfo(JSON.stringify(result))\n                } else {\n                    java.toast('\\n\\n💔' + data.msg || \"登录失败，请重试！\")\n                }\n            } catch (e) {\n                java.toast(\"\\n\\n💔登录失败，请重试！\\n\" + e.message)\n            }\n        } else {\n            cookie.setCookie(base_url, `qttoken=${key};deviceId=${deviceId}`)\n            let res = java.ajax(`${base_url}/user_api,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n            try {\n                res = JSON.parse(res)\n                if (res.id != undefined) {\n                    setArgument('qttoken', key);\n                    java.toast('\\n\\n密钥登录成功')\n                    result['邮箱'] = res.email\n                    putLoginInfo(JSON.stringify(result))\n                } else {\n                    throw new Error()\n                }\n            } catch (e) {\n                java.log(e)\n                java.toast(\"\\n\\n💔登录失败\")\n            }\n        }\n    } else if (flag && String(getKey(String(cookie.getCookie(base_url))))) {\n        java.toast(\"\\n\\n当前✅️已登录，请🚫退出登录后重新登录\");\n        //checkStatus();\n    } else if (flag) {\n        java.toast(\"\\n\\n⛔️请先填写邮箱和密码\");\n    }\n}\n\n\n\n\n\nfunction applyCookieSettings() {\n    let controlUrla = getArgument('controlUrl') || controlUrl;\n    var cookieStr = String(cookie.getCookie(controlUrla));\n\n    var cookieData = {};\n    if (cookieStr && cookieStr !== 'null' && cookieStr !== 'undefined' && cookieStr !== '') {\n        var pairs = cookieStr.split('; ');\n        for (var i = 0; i < pairs.length; i++) {\n            var pair = pairs[i];\n            var eqIndex = pair.indexOf('=');\n            if (eqIndex > -1) {\n                var key = pair.substring(0, eqIndex).trim();\n                var value = decodeURIComponent(pair.substring(eqIndex + 1).trim());\n                cookieData[key] = value;\n            }\n        }\n    }\n\n    var displayConfig = [{\n            key: 'server',\n            label: '服务器',\n            defaultValue: host[0]\n        },\n        {\n            key: 'proxy',\n            label: '访问模式',\n            defaultValue: '云端'\n        },\n        {\n            key: 'tab',\n            label: '阅读模式',\n            defaultValue: '小说'\n        },\n        {\n            key: 'fqcommunity',\n            label: '本章说',\n            defaultValue: 'on'\n        },\n        {\n            key: 'sources',\n            label: '书源选择',\n            defaultValue: '全部'\n        },\n        {\n            key: 'fqpara',\n            label: '段评显示',\n            defaultValue: 'on'\n        },\n        {\n            key: 'disabled_sources',\n            label: '强制搜索',\n            defaultValue: '0'\n        },\n        {\n            key: 'reading',\n            label: '同步书架',\n            defaultValue: '0'\n        },\n        {\n            key: 'info',\n            label: '完整简介',\n            defaultValue: 'on'\n        }\n    ];\n\n    var valueMap = {\n        // 访问模式\n        '本地': '💻 本地',\n        '云端': '☁️ 云端',\n\n        // 开关状态\n        'on': '✅ 开启',\n        'off': '❌ 关闭',\n        '1': '✅ 开启',\n        '0': '❌ 关闭',\n\n        // 频道类型\n        '男频': '👨 男频',\n        '女频': '👩 女频',\n\n        // 内容类型\n        '小说': '📖 小说',\n        '听书': '🎧 听书',\n        '漫画': '🎨 漫画',\n        '短剧': '🎬 短剧',\n\n        // 来源类型\n        'vip': '💎 VIP专属',\n        'svip': '👑 SVIP专属',\n        '推荐': '⭐ 网友推荐',\n        '全部': '📚 全部'\n    };\n\n\n    var displayLines = [];\n\n    for (var i = 0; i < displayConfig.length; i++) {\n        var config = displayConfig[i];\n        var argumentValue = getArgument(config.key);\n        var cookieValue = cookieData[config.key];\n        var value = argumentValue || cookieValue || config.defaultValue;\n\n        // 检测只补齐缺失配置，不能用旧 Cookie 覆盖用户当前选择。\n        if (!argumentValue) {\n            setArgument(config.key, cookieValue || config.defaultValue);\n        }\n\n        var displayValue = valueMap[value] || value;\n        if (config.key === 'sources' && displayValue.length > 25) {\n            displayValue = displayValue.substring(0, 25) + '...';\n        }\n\n        displayLines.push(config.label + ': ' + displayValue);\n    }\n\n    // 构建提示模板\n    var template = '✨ 当前配置\\n';\n    template += '━━━━━━━━━━━━━━━━\\n';\n    template += displayLines.join('\\n');\n    template += '\\n━━━━━━━━━━━━━━━━\\n';\n    template += '❤️当前应用的 *⚙️长按书源登录设置* 中的配置哦❤️'\n\n    // 显示提示\n    java.longToast(template);\n\n    return displayLines.length;\n}\n\n\nfunction reCookieSettings() {\n    var current = {};\n    try {\n        current = JSON.parse(String(source.getVariable() || '{}'));\n    } catch (e) {}\n\n    // 恢复书源默认配置；搜索默认全部来源，发现页默认番茄。\n    var defaults = {\n        _settings_version: 1,\n        server: host[0],\n        controlUrl: controlUrl,\n        tab: '小说',\n        sources: '全部',\n        find_tab: '小说',\n        find_source: '番茄',\n        source_type: '男频',\n        proxy: '云端',\n        tone_id: '默认音色',\n        shuqi_tone_id: 'multi_role',\n        fq_word_filter: '不限',\n        fq_status_filter: '不限',\n        fq_sort_filter: '不限',\n        fqpara: 'on',\n        fqcommunity: 'on',\n        reading: '0',\n        info: 'on',\n        close_img: 'off',\n        disabled_sources: '0',\n        fxyjr: 'off',\n        plcolor: '#A7A7A7',\n        pstyle: '0'\n    };\n\n    // 登录信息独立保存；源变量中的登录密钥也必须保留。\n    if (current && current.qttoken) {\n        defaults.qttoken = current.qttoken;\n    }\n    source.setVariable(JSON.stringify(defaults));\n\n    // 只清除旧设置 Cookie，不能删除 qttoken、deviceId 或番茄登录 Cookie。\n    var settingCookieKeys = [\n        'source_settings_result', 'server', 'proxy', 'tab', 'sources', 'source',\n        'media', 'find_tab', 'find_source', 'source_type', 'tone_id',\n        'shuqi_tone_id', 'fq_word_filter', 'fq_status_filter', 'fq_sort_filter',\n        'fqpara', 'fqcommunity', 'reading', 'info', 'close_img',\n        'disabled_sources', 'fxyjr', 'plcolor', 'pstyle'\n    ];\n    for (var i = 0; i < settingCookieKeys.length; i++) {\n        try {\n            cookie.setCookie(controlUrl, settingCookieKeys[i] + '=; Max-Age=0; Path=/');\n        } catch (e) {}\n    }\n\n    applyCookieSettings();\n    try { java.refreshExplore(); } catch (e) {}\n}\n// 检测服务器\nfunction checkNet() {\n    let url = getArgument('server');\n    java.longToast(`\\n\\n♻️正在检测：${url}\\n请稍等~`);\n    let date1 = new Date().getTime();\n    let html = java.ajax(url + '/health');\n    let date2 = new Date().getTime();\n    let t = date2 - date1;\n    let res = {};\n    try {\n        res = JSON.parse(html);\n    } catch {}\n    let c = res.status != \"healthy\";\n    let code = 1;\n    let time = t / 1000 + 's';\n    let logTime = '【' + url + '】\\n┋┋\\n' + '解析时间：' + time;\n    if (c || t > 5000) {\n        java.longToast('\\n💔【访问失败提示】\\n' + '┏┅━┅━┅━┅━┅┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♣️当前接口无法访问(可能被墙)♣️\\n┋┋\\n请切换其他接口/切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅┅━┅━┅┛');\n    } else if (t < 1000) {\n        java.longToast('\\n💖【网络环境优良】\\n' + '┏┅━┅━┅━┅━┅┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n❤️延迟低，推荐使用此接口❤️\\n┋┋\\n网络环境优良，请继续保持状态\\n┋┋' + '\\n┗┅━┅━┅━┅━┅┅━┅━┅┛');\n    } else if (t >= 1000 && t < 2000) {\n        java.longToast('\\n💛【网络环境一般】\\n' + '┏┅━┅━┅━┅━┅┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♦️延迟一般，勉强可使用♦️\\n┋┋\\n请切换其他接口或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅┅━┅━┅┛');\n    } else if (t >= 2000 && t < 5000) {\n        java.longToast('\\n💔【网络环境堪忧】\\n' + '┏┅━┅━┅━┅━┅┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♠延迟过高，不建议使用♠\\n┋┋\\n请切换其他接口或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅┅━┅━┅┛');\n    }\n}\n\n\n\n\nfunction isVips(res) {\n    let isVIP = '';\n    let vipEndTime = res.vip_end_time;\n    let formattedDate = '';\n\n    if (vipEndTime && vipEndTime !== 0) {\n        let date = new Date(vipEndTime * 1000);\n        formattedDate = `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;\n        let currentTime = Math.floor(Date.now() / 1000);\n        let remainingDays = Math.ceil((vipEndTime - currentTime) / (24 * 60 * 60));\n        if (currentTime > vipEndTime) {\n            isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} (已过期)`;\n        } else if (remainingDays <= 7) {\n            isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} 剩余${remainingDays}天`;\n        } else {\n            if (vipEndTime < 1912946812) {\n                isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"}(${formattedDate})`;\n            } else {\n                isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} (永久)`;\n            }\n        }\n    } else {\n        isVIP = '您尚未开通VIP';\n    }\n    return isVIP;\n}\n\nfunction checkStatus() {\n    java.longToast('\\n\\n♻️检测中...');\n    let base_url = getArgument('server')\n    let res = java.ajax(`${base_url}/user_api,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n    try {\n        res = JSON.parse(res)\n        if (res.id != undefined) {\n            result['邮箱'] = res.email\n            putLoginInfo(JSON.stringify(result))\n            let devices\n            try {\n                devices = Object.keys(JSON.parse(res.device)).length;\n            } catch (e) {\n                devices = res.device ? 1 : 0;\n            }\n            let isVip = isVips(res);\n            tips = `\n┏┅┅┅┅┅┅┱┄┄┄┄┄┄┄┄┄┄┐\n　 🧢昵称 　　　　${res.nickname.padEnd(20,\"\\t\") || \"未设置\".padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　✉️邮箱　　　　${res.email.replace(/(.{3}).*?@/,\"$1***@\").padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　🔑密钥　　　　${(`${res.user_key.substring(0,4)}***${res.user_key.slice(-4)}`).padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　📅注册时间　　${java.timeFormat(res.register_time*1000).padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　🗒️今日阅读　　${(java.timeFormat(new Date()).slice(0,10)==java.timeFormat(res.last_read_time * 1000).slice(0,10)?res.day_read_count:0).toString().padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　📚累计阅读　　${res.all_read_count.toString().padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　🕓最后阅读　　${(res.last_read_time != 0?java.timeFormat(res.last_read_time * 1000):'未阅读').padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　📱在线设备　　${devices.toString().padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　👑会员状态　　${isVip.padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　🚫封禁状态　　${res.is_banned?'已封禁':'正常　'}　　　　　　　\n┗┅┅┅┅┅┅┹┄┄┄┄┄┄┄┄┄┄┘\n`\n            java.log(tips)\n            java.longToast(tips)\n        } else {\n            throw new Error(res.msg)\n        }\n    } catch (e) {\n        //java.log(e)\n        java.toast(\"\\n检测登录失败\\n\" + e.message)\n    }\n}\n\nfunction clearDevice() {\n    let base_url = getArgument('server')\n    let res = java.ajax(`${base_url}/clear,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n    res = JSON.parse(res);\n    java.toast(res.code == 0 ? \"\\n\\n📴设备清除成功\" : res.msg)\n    Packages.java.lang.Thread.sleep(500)\n    checkStatus()\n}\n// 保存登录UI信息\nfunction putLoginInfo(info) {\n    try {\n        let key = java.androidId()\n        let encodeStr = Packages.android.util.Base64.encodeToString(java.createSymmetricCrypto(\"AES\", key).encrypt(info), 2)\n        cache.put(`userInfo_${source.getKey()}`, encodeStr)\n        return true\n    } catch (e) {\n        java.log(e)\n        return source.putLoginInfo(info)\n    }\n}\n\n// 用户后台\nfunction loginqt() {\n    let base_url = String(getArgument('server') || '').replace(/\\/+$/, '');\n    let ck = String(cookie.getKey(base_url, \"qttoken\"));\n    if (!ck) {\n        java.longToast('\\n\\n🚫请先登录!')\n        return;\n    }\n\n    // 阅读器与网页使用不同 Cookie 容器，先换取一次性交接码再打开网页。\n    try {\n        let deviceId = String(cookie.getKey(base_url, \"deviceId\") || '');\n        let options = JSON.stringify({\n            method: 'POST',\n            headers: {'Content-Type': 'application/json'},\n            body: JSON.stringify({qttoken: ck, deviceId: deviceId})\n        });\n        let response = JSON.parse(java.ajax(base_url + '/source_login_handoff,' + options));\n        if (response && response.code == 0 && response.handoff) {\n            let handoffUrl = base_url + '/source_login_handoff?code=' + encodeURIComponent(response.handoff);\n            java.startBrowserAwait(handoffUrl, '大灰狼小说后台');\n        } else {\n            java.longToast('\\n\\n🚫登录状态已失效，请重新登录!');\n        }\n    } catch (e) {\n        java.log('用户后台登录交接失败: ' + e);\n        java.longToast('\\n\\n🚫暂时无法打开用户后台，请稍后重试!');\n    }\n}\n\n\n// 用户注册\nfunction register() {\n    let base_url = getArgument('server');\n    java.startBrowserAwait(getArgument('server') + '/register', '大灰狼小说注册');\n}\n\n//登录番茄\nfunction fq_login() {\n    try {\n        cookie.removeCookie(\"snssdk.com\");\n        cookie.removeCookie(\"fanqienovel.com\")\n    } catch (e) {}\n    try {\n        java.startBrowserAwait(\"https://fanqienovel.com/\", \"登录\")\n    } catch (e) {\n        java.toast(e)\n    }\n    var cookie_ = \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : source.getLoginInfoMap()['手动登录Token'])\n    let user\n    try {\n        user = JSON.parse(java.ajax(\"https://fanqienovel.com/api/user/info/v2,\" + JSON.stringify({\n            method: \"GET\",\n            headers: {\n                \"Cookie\": cookie_\n            }\n        }))).data.name\n    } catch (e) {\n        java.log(e)\n    }\n    if (!cookie_ || cookie_ == \"sessionid=\" || !user) {\n        java.toast(\"未获取到登录凭据，登录失败\")\n        return false\n    }\n    java.toast(\"\\n\\n欢迎 \" + user + \"\\n登录成功！\")\n    return true\n}\n\n//退出登录\nfunction logout() {\n    // 登录成功时 token 会同步到所有线路，退出时必须逐个清除，避免切换线路后仍保持登录。\n    var servers = [];\n    try {\n        servers = Array.isArray(host) ? host.slice() : [];\n    } catch (e) {}\n    try {\n        var currentServer = String(getArgument('server') || '').trim();\n        if (currentServer) servers.push(currentServer);\n    } catch (e) {}\n\n    var seenServers = {};\n    for (var i = 0; i < servers.length; i++) {\n        var server = String(servers[i] || '').trim().replace(/\\/+$/, '');\n        if (!server || seenServers[server]) continue;\n        seenServers[server] = true;\n        try { cookie.removeCookie(server); } catch (e) {}\n        try { cookie.removeCookie(server + '/'); } catch (e) {}\n    }\n\n    // 清除可能按域名保存的第三方登录状态。\n    var domains = [\n        'fanqienovel.com', 'snssdk.com', '69shuba.com',\n        'langge.uk', 'langge.tk', 'langge.cf', 'doubi.tk',\n        '219.154.201.122'\n    ];\n    for (var d = 0; d < domains.length; d++) {\n        try { cookie.removeCookie(domains[d]); } catch (e) {}\n    }\n\n    // 活动 token 不应在书源变量或登录信息中继续残留；邮箱密码保留以便下次登录。\n    try {\n        var variables = JSON.parse(String(source.getVariable() || '{}'));\n        if (variables && typeof variables === 'object') {\n            delete variables.qttoken;\n            delete variables['密钥'];\n            source.setVariable(JSON.stringify(variables));\n        }\n    } catch (e) {}\n    try {\n        var loginInfo = {};\n        try { loginInfo = JSON.parse(String(source.getLoginInfo() || '{}')); } catch (e) {}\n        if (result && typeof result === 'object') {\n            for (var loginField in result) loginInfo[loginField] = result[loginField];\n        }\n        if (loginInfo && typeof loginInfo === 'object') {\n            delete loginInfo['密钥'];\n            delete loginInfo.qttoken;\n            putLoginInfo(JSON.stringify(loginInfo));\n        }\n    } catch (e) {}\n\n    java.toast(\"退出登录成功\");\n}\n\n//获取参数\nfunction getArgument(key) {\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    return open_argument[key];\n}\n\n//设置参数\nfunction setArgument(key, value) {\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    open_argument[key] = value;\n    open_argument = JSON.stringify(open_argument);\n    source.setVariable(open_argument);\n    return open_argument;\n}\n\n// 设置本地or云端访问\n\n\n\n\n\n//设置男女频\n\n\n\n\nfunction fxyjr() {\n    let fxyjr = getArgument('fxyjr');\n    if (fxyjr != 'on') {\n        setArgument('fxyjr', 'on');\n        try { java.refreshExplore(); } catch (e) {}\n        java.longToast('\\n显示旧版发现页');\n    } else {\n        setArgument('fxyjr', 'off');\n        try { java.refreshExplore(); } catch (e) {}\n        java.longToast('\\n显示新版发现页');\n    }\n}\n\n\n//设置男女频\n\n\n\n\n//首页\n//首页\nfunction api() {\n    java.startBrowserAwait('http://svip.langge.uk', \"首页\");\n}\n\n//打赏\nfunction vip() {\n    let base_url = getArgument('server');\n    let ck = String(cookie.getKey(base_url, \"qttoken\"));\n    if (!ck) {\n        java.longToast('\\n\\n🚫请先登录!')\n    } else {\n        java.startBrowserAwait(getArgument('server') + '/coffee', '大灰狼小说会员开通');\n    }\n}\n\n\n//设置搜索媒体\n\n\n//获取搜索媒体\n\n\n\n//设置服务器\nfunction set_server() {\n    putLoginInfo(JSON.stringify(result))\n    let zdyserver;\n    let base_url = getArgument('server')\n    try {\n        zdyserver = String(result['自定义服务器(可不填)']);\n        if (zdyserver.includes('http')) {\n            setArgument('server', zdyserver);\n            if (getKey(String(cookie.getCookie(base_url)))) {\n                let cookies = cookie.getCookie(base_url)\n                try {\n                    cookie.removeCookie(base_url)\n                } catch (e) {}\n                cookie.setCookie(zdyserver, cookies)\n            }\n            java.toast(`\\n\\n当前服务器为自定义服务器\\n${zdyserver}\\n\\n切换服务器请先清空服务器地址中的数据`);\n        } else {\n            zdyserver = '';\n        }\n    } catch (error) {\n        zdyserver = '';\n    }\n    if (!zdyserver) {\n        const servers = host\n        const currentServer = getArgument('server') || '';\n        const currentIndex = servers.indexOf(currentServer);\n\n        const nextIndex = currentIndex >= 0 ? (currentIndex + 1) % servers.length : 0;\n        const nextServer = servers[nextIndex];\n\n        setArgument('server', nextServer);\n        if (getKey(String(cookie.getCookie(currentServer)))) {\n            let cookies = cookie.getCookie(currentServer)\n            try {\n                cookie.removeCookie(currentServer)\n            } catch (e) {}\n            cookie.setCookie(nextServer, cookies)\n        }\n        java.longToast(`\\n\\n服务器【${nextIndex+1}】：${nextServer}`);\n    }\n}\n\n\n\n\n\n\n\n//获取其他听书来源音色\nvar tone_id = getArgument('tone_id');\n\n\n\n\n//设置来源\n\n\n// 设置简介\n\n\n// 番茄段评\n\n\n// 番茄正文末尾的本章说开关\n\n\n// 强制搜索被禁用的源\n\n\n// 我要推荐\n\n\n\n// 使用教程\nfunction jc(){\n\t  let html = `<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>使用教程</title>\n    <style>\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n        }\n\n        body {\n            background-color: #f5f5f5;\n            padding: 20px;\n        }\n\n        .container {\n            max-width: 800px;\n            margin: 0 auto;\n        }\n\n        h1 {\n            text-align: center;\n            color: #333;\n            margin-bottom: 30px;\n            padding-bottom: 10px;\n            border-bottom: 2px solid #4CAF50;\n        }\n\n        .tutorial-card {\n            background-color: white;\n            border-radius: 8px;\n            box-shadow: 0 2px 15px rgba(0, 0, 0, 0.1);\n            padding: 25px;\n            margin-bottom: 25px;\n            transition: transform 0.3s ease, box-shadow 0.3s ease;\n        }\n\n        .tutorial-card:hover {\n            transform: translateY(-5px);\n            box-shadow: 0 5px 20px rgba(0, 0, 0, 0.15);\n        }\n\n        .card-title {\n            color: #4CAF50;\n            margin-bottom: 15px;\n            font-size: 1.4em;\n        }\n\n        .card-content {\n            line-height: 1.6;\n            color: #555;\n        }\n\n        .keyword-list {\n            background-color: #f9f9f9;\n            border-left: 4px solid #4CAF50;\n            padding: 15px;\n            margin-top: 15px;\n            border-radius: 0 4px 4px 0;\n            font-family: monospace;\n        }\n\n        .keyword-item {\n            margin-bottom: 8px;\n        }\n    </style>\n</head>\n<body>\n    <div class=\"container\">\n        <h1>使用教程</h1>\n\n        <div class=\"tutorial-card\">\n            <h2 class=\"card-title\">搜索功能</h2>\n            <div class=\"card-content\">\n                <p><strong>1) 基础搜索：</strong>在发现页长按该书源，点击搜索，可直接搜索全部来源的小说。</p>\n                <p><strong>2) 进阶搜索：</strong>在“登陆-书源设置”中选择指定模式或来源，即可搜索指定内容。</p>\n                <p><strong>3) 快捷搜索：</strong>使用特殊关键词进行搜索。</p>\n                <div class=\"keyword-list\">\n                    <p class=\"keyword-item\">x:书名@来源 (例如: x:十日终焉@番茄)</p>\n                    <p class=\"keyword-item\">t:书名@来源 (例如: t:十日终焉@番茄)</p>\n                    <p class=\"keyword-item\">m:书名@来源 (例如: m:十日终焉@番茄)</p>\n                    <p class=\"keyword-item\">d:书名@来源 (例如: d:十日终焉@番茄)</p>\n                </div>\n                <p>其中，x表示小说（可省略），t表示听书，m表示漫画，d表示短剧。冒号支持中文和英文。</p>\n            </div>\n        </div>\n\n        <div class=\"tutorial-card\">\n            <h2 class=\"card-title\">发现页</h2>\n            <div class=\"card-content\">\n                <p>在书源设置中选择指定模式或者单个来源，然后刷新发现页即可。</p>\n            </div>\n        </div>\n\n        <div class=\"tutorial-card\">\n            <h2 class=\"card-title\">更多使用方式</h2>\n            <div class=\"card-content\">\n                <p>进入书源设置页面应该能一目了然。</p>\n            </div>\n        </div>\n    </div>\n</body>\n</html>`;\n\t  java.startBrowser(`data:text/html;base64,${java.base64Encode(html)}`, '大灰狼书源教程');\n\t}\n\n// 书源更新\nfunction renderVersionPage() {\n    let yd = '';\n    let html = `\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n  <meta charset=\"UTF-8\" />\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>书源更新</title>\n  <!-- Font Awesome 图标库 -->\n  <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css\" />\n  <style>\n    :root {\n      --primary-gradient: linear-gradient(135deg, #4e6ef2, #6b2dd8);\n      --latest-gradient: linear-gradient(135deg, #8e2de2 0%, #4a00e0 50%, #d4af37 100%);\n      --success-color: #28c76f;\n      --warning-color: #ff9f43;\n      --error-color: #ea5455;\n      --text-main: #1f2937;\n      --text-secondary: #6b7280;\n      --card-bg: #ffffff;\n      --border-color: #e5e7eb;\n      --light-bg: #f9fafb;\n      --shadow: 0 4px 12px rgba(78, 110, 242, 0.1);\n      --shadow-hover: 0 6px 18px rgba(78, 110, 242, 0.2);\n      --glow-shadow: 0 0 25px rgba(142, 45, 226, 0.5), 0 0 50px rgba(212, 175, 55, 0.3);\n      --modal-bg: rgba(31, 41, 55, 0.8);\n      --modal-content-bg: #ffffff;\n    }\n\n    * {\n      box-sizing: border-box;\n      margin: 0;\n      padding: 0;\n      font-family: 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;\n    }\n\n    body {\n      background: linear-gradient(135deg, #eef2ff, #f5f7ff);\n      color: var(--text-main);\n      min-height: 100vh;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      padding: 16px;\n    }\n\n    /* 加载动画 */\n    .loading-wrapper {\n      text-align: center;\n      animation: fadeIn 0.3s ease;\n    }\n\n    .loading-spinner {\n      width: 50px;\n      height: 50px;\n      border: 4px solid rgba(78, 110, 242, 0.3);\n      border-top-color: #4e6ef2;\n      border-radius: 50%;\n      margin: 0 auto 20px;\n      animation: spin 1s linear infinite;\n    }\n\n    .loading-text {\n      color: var(--text-main);\n      font-size: 16px;\n      font-weight: 500;\n    }\n\n    @keyframes spin {\n      to { transform: rotate(360deg); }\n    }\n\n    @keyframes fadeIn {\n      from { opacity: 0; transform: translateY(20px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n\n    @keyframes slideIn {\n      from { opacity: 0; transform: translateY(30px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n\n    @keyframes pulse {\n      0%, 100% { opacity: 1; }\n      50% { opacity: 0.7; }\n    }\n\n    @keyframes gradientAnimation {\n      0% { background-position: 0% 50%; }\n      50% { background-position: 100% 50%; }\n      100% { background-position: 0% 50%; }\n    }\n\n    @keyframes breathe {\n      0%, 100% { \n        transform: scale(1);\n        box-shadow: var(--glow-shadow), var(--shadow);\n      }\n      50% { \n        transform: scale(1.02);\n        box-shadow: 0 0 30px rgba(142, 45, 226, 0.6), 0 0 60px rgba(212, 175, 55, 0.4), var(--shadow);\n      }\n    }\n\n    @keyframes shimmer {\n      0% {\n        background-position: -200% center;\n      }\n      100% {\n        background-position: 200% center;\n      }\n    }\n\n    /* 主容器 */\n    .container {\n      width: 100%;\n      max-width: 420px;\n      background: var(--card-bg);\n      border-radius: 24px;\n      overflow: hidden;\n      box-shadow: var(--shadow);\n      position: relative;\n      z-index: 1;\n      animation: slideIn 0.5s ease;\n      display: none;\n    }\n\n    /* 头部 */\n    .header {\n      background: var(--primary-gradient);\n      color: #ffffff;\n      padding: 24px 16px;\n      text-align: center;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .header::before {\n      content: '';\n      position: absolute;\n      top: -30px;\n      left: -30px;\n      width: 80px;\n      height: 80px;\n      background: rgba(255, 255, 255, 0.15);\n      border-radius: 50%;\n    }\n\n    .header::after {\n      content: '';\n      position: absolute;\n      bottom: -60px;\n      right: -60px;\n      width: 150px;\n      height: 150px;\n      background: rgba(255, 255, 255, 0.1);\n      border-radius: 50%;\n    }\n\n    .header h1 {\n      font-size: 1.4rem;\n      font-weight: 700;\n      margin-bottom: 8px;\n      position: relative;\n      z-index: 2;\n    }\n\n    .header p {\n      font-size: 0.9rem;\n      opacity: 0.9;\n      line-height: 1.4;\n      position: relative;\n      z-index: 2;\n    }\n\n    .header-icon {\n      font-size: 48px;\n      margin-bottom: 10px;\n      display: inline-block;\n      animation: bounce 2s ease infinite;\n    }\n\n    @keyframes bounce {\n      0%, 100% { transform: translateY(0); }\n      50% { transform: translateY(-10px); }\n    }\n\n    /* 版本对比 */\n    .version-comparison {\n      display: flex;\n      flex-wrap: nowrap;\n      gap: 12px;\n      padding: 16px;\n      margin-top: 8px;\n      position: relative;\n      z-index: 10;\n    }\n\n    .version-card {\n      flex: 1;\n      min-width: 45%;\n      background: var(--card-bg);\n      border-radius: 16px;\n      padding: 28px 16px 16px;\n      box-shadow: var(--shadow);\n      text-align: center;\n      position: relative;\n      transition: transform 0.3s ease, box-shadow 0.3s ease;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n    }\n\n    .version-card:hover {\n      transform: translateY(-4px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .version-card.current-version {\n      background: linear-gradient(135deg, #ffffff 0%, #f8f9ff 100%);\n      border: 1px solid rgba(78, 110, 242, 0.15);\n    }\n\n    .version-card.current-version:hover {\n      box-shadow: 0 6px 20px rgba(78, 110, 242, 0.15);\n    }\n\n    .version-card.current-version h3,\n    .version-card.current-version .version-number,\n    .version-card.current-version .version-date {\n      color: var(--text-main);\n    }\n\n    .version-card.latest-version {\n      background: var(--latest-gradient);\n      background-size: 300% 300%;\n      box-shadow: var(--glow-shadow), var(--shadow);\n      color: #fff;\n      z-index: 2;\n      animation: gradientAnimation 6s ease infinite, breathe 3s ease-in-out infinite;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .version-card.latest-version::before {\n      content: '';\n      position: absolute;\n      top: -50%;\n      left: -50%;\n      width: 200%;\n      height: 200%;\n      background: linear-gradient(\n        90deg,\n        transparent,\n        rgba(255, 255, 255, 0.3),\n        transparent\n      );\n      transform: rotate(45deg);\n      animation: shimmer 3s infinite;\n    }\n\n    .version-card.latest-version h3,\n    .version-card.latest-version .version-number,\n    .version-card.latest-version .version-date {\n      color: #fff;\n      text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n      position: relative;\n      z-index: 1;\n    }\n\n    .version-status {\n      position: absolute;\n      top: 6px;\n      right: 6px;\n      padding: 3px 7px;\n      font-size: 0.65rem;\n      font-weight: 600;\n      border-radius: 6px;\n      color: #fff;\n      line-height: 1.2;\n      white-space: nowrap;\n      z-index: 2;\n    }\n\n    .version-card.latest-version .version-status {\n      background: rgba(255, 255, 255, 0.25);\n      backdrop-filter: blur(5px);\n      border: 1px solid rgba(255, 255, 255, 0.3);\n      color: #fff;\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n    }\n\n    .status-outdated { background: var(--warning-color); }\n    .status-latest { background: var(--success-color); }\n    .status-invalid { background: var(--error-color); }\n\n    .version-card h3 {\n      font-size: 0.9rem;\n      color: var(--text-secondary);\n      margin-bottom: 8px;\n      font-weight: 500;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 6px;\n    }\n\n    .version-number {\n      font-size: 1.25rem;\n      font-weight: 700;\n      color: var(--text-main);\n      margin: 8px 0;\n      transition: all 0.3s ease;\n      font-family: 'Courier New', monospace;\n    }\n\n    .version-card.latest-version .version-number {\n      font-size: 1.4rem;\n      transform: scale(1.05);\n      text-shadow: \n        0 2px 4px rgba(0, 0, 0, 0.3),\n        0 0 10px rgba(212, 175, 55, 0.8),\n        0 0 20px rgba(212, 175, 55, 0.5);\n      animation: pulse-glow 2s ease-in-out infinite;\n    }\n\n    @keyframes pulse-glow {\n      0%, 100% {\n        text-shadow: \n          0 2px 4px rgba(0, 0, 0, 0.3),\n          0 0 10px rgba(212, 175, 55, 0.8),\n          0 0 20px rgba(212, 175, 55, 0.5);\n      }\n      50% {\n        text-shadow: \n          0 2px 4px rgba(0, 0, 0, 0.3),\n          0 0 15px rgba(212, 175, 55, 1),\n          0 0 30px rgba(212, 175, 55, 0.7);\n      }\n    }\n\n    .version-date {\n      font-size: 0.8rem;\n      color: var(--text-secondary);\n      margin-top: 4px;\n    }\n\n    /* 版本对比指示器 */\n    .version-indicator {\n      position: absolute;\n      left: 50%;\n      top: 50%;\n      transform: translate(-50%, -50%);\n      z-index: 5;\n      width: 32px;\n      height: 32px;\n      border-radius: 50%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n      color: white;\n    }\n\n    .version-indicator.update-needed {\n      background: var(--error-color);\n      box-shadow: 0 2px 8px rgba(234, 84, 85, 0.4);\n      animation: pulse-indicator 1.5s infinite;\n    }\n\n    .version-indicator.is-latest {\n      background: var(--success-color);\n      box-shadow: 0 2px 8px rgba(40, 199, 111, 0.4);\n    }\n\n    @keyframes pulse-indicator {\n      0% { transform: translate(-50%, -50%) scale(1); }\n      50% { transform: translate(-50%, -50%) scale(1.1); }\n      100% { transform: translate(-50%, -50%) scale(1); }\n    }\n\n    /* 内容区 */\n    .content-container {\n      padding: 16px;\n    }\n\n    /* 状态提示 */\n    .status-alert {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      padding: 12px 16px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 10px;\n      font-weight: 500;\n      font-size: 14px;\n      animation: slideIn 0.5s ease 0.3s backwards;\n    }\n\n    .status-alert i {\n      font-size: 20px;\n    }\n\n    .status-alert.update-available {\n      background: linear-gradient(135deg, #ffeaa7 0%, #fdcb6e 100%);\n      color: #d63031;\n      box-shadow: 0 4px 15px rgba(253, 203, 110, 0.4);\n    }\n\n    .status-alert.up-to-date {\n      background: linear-gradient(135deg, #55efc4 0%, #00b894 100%);\n      color: white;\n      box-shadow: 0 4px 15px rgba(0, 184, 148, 0.4);\n    }\n\n    /* 更新容器 */\n    .update-container {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      animation: slideIn 0.5s ease 0.4s backwards;\n    }\n\n    .update-header {\n      background: var(--light-bg);\n      padding: 12px 16px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid var(--border-color);\n    }\n\n    .update-header h2 {\n      font-size: 1rem;\n      font-weight: 600;\n      color: var(--text-main);\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .update-header h2 i {\n      color: #4e6ef2;\n    }\n\n    .update-tag {\n      background: rgba(78, 110, 242, 0.1);\n      color: #4e6ef2;\n      padding: 4px 8px;\n      border-radius: 8px;\n      font-size: 0.75rem;\n      font-weight: 600;\n    }\n\n    .update-content {\n      padding: 16px;\n    }\n\n    .update-date {\n      font-weight: 600;\n      color: #4e6ef2;\n      margin-bottom: 12px;\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      padding: 8px 0;\n      border-bottom: 1px dashed #e0e0e0;\n    }\n\n    .update-text {\n      margin: 8px 0;\n      position: relative;\n      padding-left: 16px;\n      line-height: 1.5;\n      color: var(--text-main);\n      font-size: 0.95rem;\n      white-space: pre-wrap;\n      word-break: break-word;\n    }\n\n    .update-text::before {\n      content: '•';\n      position: absolute;\n      left: 0;\n      font-weight: bold;\n      color: #4e6ef2;\n      font-size: 1.2rem;\n      line-height: 1;\n    }\n\n    /* 历史日志 */\n    .history-container {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      animation: slideIn 0.5s ease 0.5s backwards;\n    }\n\n    .history-header {\n      background: var(--light-bg);\n      padding: 12px 16px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid var(--border-color);\n      cursor: pointer;\n      user-select: none;\n    }\n\n    .history-header:hover {\n      opacity: 0.8;\n    }\n\n    .history-header h2 {\n      font-size: 1rem;\n      font-weight: 600;\n      color: var(--text-main);\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .history-header h2 i {\n      color: #4e6ef2;\n    }\n\n    .toggle-history {\n      background: none;\n      border: none;\n      color: var(--text-secondary);\n      cursor: pointer;\n      font-weight: 500;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      font-size: 0.85rem;\n      transition: color 0.2s ease;\n    }\n\n    .toggle-history:hover {\n      color: #4e6ef2;\n    }\n\n    .history-content {\n      padding: 0 16px;\n      max-height: 0;\n      overflow: hidden;\n      transition: max-height 0.4s ease, padding 0.4s ease;\n    }\n\n    .history-content.expanded {\n      max-height: 60vh;\n      overflow-y: auto;\n      padding: 16px;\n      scrollbar-width: thin;\n      scrollbar-color: #4e6ef2 #f0f0f0;\n    }\n\n    .history-content.expanded::-webkit-scrollbar {\n      width: 6px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-track {\n      background: #f0f0f0;\n      border-radius: 4px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-thumb {\n      background: #4e6ef2;\n      border-radius: 4px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-thumb:hover {\n      background: #3a56d0;\n    }\n\n    .history-item {\n      margin-bottom: 16px;\n      padding-bottom: 16px;\n      border-bottom: 1px dashed var(--border-color);\n    }\n\n    .history-item:last-child {\n      border-bottom: none;\n      margin-bottom: 0;\n      padding-bottom: 0;\n    }\n\n    .history-date {\n      font-weight: 600;\n      color: var(--text-main);\n      margin-bottom: 8px;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      font-size: 0.9rem;\n      background: rgba(78, 110, 242, 0.05);\n      padding: 6px 10px;\n      border-radius: 6px;\n    }\n\n    .history-text {\n      margin: 8px 0;\n      padding-left: 16px;\n      line-height: 1.4;\n      color: var(--text-secondary);\n      position: relative;\n      font-size: 0.9rem;\n      white-space: pre-wrap;\n      word-break: break-word;\n    }\n\n    .history-text::before {\n      content: '•';\n      position: absolute;\n      left: 0;\n      color: #4e6ef2;\n      font-weight: bold;\n      font-size: 1.2rem;\n      line-height: 1;\n    }\n\n    /* 按钮组 */\n    .button-group {\n      display: flex;\n      flex-direction: column;\n      gap: 10px;\n      margin-bottom: 16px;\n    }\n\n    .button {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 10px;\n      padding: 14px 28px;\n      text-align: center;\n      font-size: 1rem;\n      border: none;\n      border-radius: 12px;\n      text-decoration: none;\n      background: var(--primary-gradient);\n      color: white;\n      font-weight: 600;\n      transition: all 0.3s ease;\n      box-shadow: var(--shadow);\n      position: relative;\n      overflow: hidden;\n      cursor: pointer;\n    }\n\n    .button i {\n      font-size: 1rem;\n    }\n\n    .button::after {\n      content: '';\n      position: absolute;\n      top: -50%;\n      left: -50%;\n      width: 200%;\n      height: 200%;\n      background: rgba(255, 255, 255, 0.1);\n      transform: rotate(30deg);\n      transition: all 0.6s ease;\n      pointer-events: none;\n    }\n\n    .button:hover {\n      transform: translateY(-3px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .button:hover::after {\n      transform: rotate(30deg) translate(20%, 20%);\n    }\n\n    .button:active {\n      transform: scale(0.95);\n    }\n\n    /* 错误状态 */\n    .error-state {\n      text-align: center;\n      padding: 40px 20px;\n      color: var(--text-main);\n    }\n\n    .error-icon {\n      font-size: 64px;\n      margin-bottom: 20px;\n      color: var(--error-color);\n    }\n\n    .error-text {\n      font-size: 16px;\n      line-height: 1.6;\n      margin-bottom: 20px;\n    }\n\n    .retry-button {\n      background: var(--primary-gradient);\n      color: white;\n      padding: 12px 30px;\n      border-radius: 12px;\n      border: none;\n      font-weight: 600;\n      cursor: pointer;\n      transition: all 0.3s ease;\n      font-size: 14px;\n      box-shadow: var(--shadow);\n    }\n\n    .retry-button:hover {\n      transform: translateY(-2px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .retry-button:active {\n      transform: scale(0.95);\n    }\n\n    /* 装饰元素 */\n    .decoration {\n      position: absolute;\n      z-index: 0;\n      pointer-events: none;\n    }\n\n    .decoration.circle {\n      width: 120px;\n      height: 120px;\n      border-radius: 50%;\n      background: rgba(107, 45, 216, 0.05);\n      top: 10%;\n      left: 10%;\n    }\n\n    .decoration.square {\n      width: 80px;\n      height: 80px;\n      transform: rotate(45deg);\n      background: rgba(78, 110, 242, 0.05);\n      bottom: 10%;\n      right: 10%;\n    }\n\n    /* 响应式 */\n    @media (max-width: 768px) {\n      body {\n        padding: 12px;\n      }\n\n      .container {\n        max-width: 100%;\n        border-radius: 20px;\n      }\n\n      .header {\n        padding: 20px 15px;\n      }\n\n      .header h1 {\n        font-size: 1.3rem;\n      }\n\n      .header-icon {\n        font-size: 40px;\n      }\n\n      .version-comparison {\n        flex-direction: row;\n        flex-wrap: nowrap;\n        gap: 10px;\n        padding: 12px;\n        margin-top: 6px;\n        overflow-x: auto;\n      }\n\n      .version-card {\n        min-width: 45%;\n        padding: 26px 12px 12px;\n      }\n\n      /* 移动端减弱呼吸动效 */\n      .version-card.latest-version {\n        animation: gradientAnimation 6s ease infinite;\n      }\n\n      .version-status {\n        top: 5px;\n        right: 5px;\n        padding: 2px 5px;\n        font-size: 0.6rem;\n      }\n\n      .version-number {\n        font-size: 1.1rem;\n      }\n\n      .version-card.latest-version .version-number {\n        font-size: 1.2rem;\n      }\n\n      .update-header h2, .history-header h2 {\n        font-size: 0.9rem;\n      }\n\n      .button {\n        padding: 12px 24px;\n        font-size: 0.95rem;\n      }\n\n      .history-content.expanded {\n        max-height: 50vh;\n        -webkit-overflow-scrolling: touch;\n      }\n    }\n\n    @media (max-width: 380px) {\n      .header h1 {\n        font-size: 1.2rem;\n      }\n\n      .version-number {\n        font-size: 1rem;\n      }\n\n      .version-card.latest-version .version-number {\n        font-size: 1.1rem;\n      }\n\n      .button {\n        padding: 11px;\n        font-size: 0.9rem;\n      }\n    }\n  </style>\n</head>\n<body>\n  <div class=\"decoration circle\"></div>\n  <div class=\"decoration square\"></div>\n\n  <div id=\"loading\" class=\"loading-wrapper\">\n    <div class=\"loading-spinner\"></div>\n    <div class=\"loading-text\"><i class=\"fas fa-search\"></i> 正在检查更新...</div>\n  </div>\n\n  <div class=\"container\" id=\"container\">\n    <div class=\"header\">\n      <div class=\"header-icon\"><i class=\"fas fa-book\"></i></div>\n      <h1>大灰狼书源更新</h1>\n      <p>推荐使用阅读Sigma版本<br>正式版可能存在兼容性问题-<a href='https://legado.langge.uk'>下载</a></p>\n    </div>\n\n    <div class=\"version-comparison\">\n      <div class=\"version-card current-version\">\n        <div class=\"version-status status-outdated\" id=\"currentStatus\">待检查</div>\n        <h3><i class=\"fas fa-cube\"></i> 当前版本</h3>\n        <div class=\"version-number\" id=\"currentVersion\">-</div>\n        <div class=\"version-date\">您的当前版本</div>\n      </div>\n\n      <div class=\"version-indicator update-needed\" id=\"versionIndicator\" style=\"display: none;\">\n        <i class=\"fas fa-arrow-right\"></i>\n      </div>\n\n      <div class=\"version-card latest-version\">\n        <div class=\"version-status status-latest\" id=\"latestStatus\">最新版本</div>\n        <h3><i class=\"fas fa-star\"></i> 最新版本</h3>\n        <div class=\"version-number\" id=\"latestVersion\">-</div>\n        <div class=\"version-date\">可用最新版本</div>\n      </div>\n    </div>\n\n    <div class=\"content-container\">\n      <div class=\"status-alert\" id=\"statusAlert\" style=\"display: none;\"></div>\n\n      <div id=\"latestLogContainer\" style=\"display: none;\">\n        <div class=\"update-container\">\n          <div class=\"update-header\">\n            <h2><i class=\"fas fa-bolt\"></i> 最新更新</h2>\n            <div class=\"update-tag\">最新发布</div>\n          </div>\n          <div class=\"update-content\">\n            <div class=\"update-date\" id=\"latestLogDate\"></div>\n            <div class=\"update-text\" id=\"latestLogContent\"></div>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"button-group\" id=\"buttonGroup\" style=\"display: none;\"></div>\n\n      <div class=\"history-container\" id=\"logs\" style=\"display: none;\">\n        <div class=\"history-header\" onclick=\"toggleLogs()\">\n          <h2><i class=\"fas fa-history\"></i> 历史更新 <span id=\"historyCount\"></span></h2>\n          <button class=\"toggle-history\" id=\"toggleButton\">\n            <span id=\"toggleText\">展开历史</span>\n            <i class=\"fas fa-chevron-down\" id=\"toggleIcon\"></i>\n          </button>\n        </div>\n        <div class=\"history-content\" id=\"logList\"></div>\n      </div>\n    </div>\n  </div>\n\n  <script>\n  let logsCollapsed = true;\n\n  function toggleLogs() {\n    logsCollapsed = !logsCollapsed;\n    const logList = document.getElementById('logList');\n    const toggleText = document.getElementById('toggleText');\n    const toggleIcon = document.getElementById('toggleIcon');\n    \n    if (logsCollapsed) {\n      logList.classList.remove('expanded');\n      toggleText.textContent = '展开历史';\n      toggleIcon.className = 'fas fa-chevron-down';\n    } else {\n      logList.classList.add('expanded');\n      toggleText.textContent = '收起历史';\n      toggleIcon.className = 'fas fa-chevron-up';\n    }\n  }\n\n  (async function() {\n    const loading = document.getElementById('loading');\n    const container = document.getElementById('container');\n    const currentVersion = document.getElementById('currentVersion');\n    const latestVersion = document.getElementById('latestVersion');\n    const currentStatus = document.getElementById('currentStatus');\n    const latestStatus = document.getElementById('latestStatus');\n    const versionIndicator = document.getElementById('versionIndicator');\n    const statusAlert = document.getElementById('statusAlert');\n    const buttonGroup = document.getElementById('buttonGroup');\n    const latestLogContainer = document.getElementById('latestLogContainer');\n    const latestLogDate = document.getElementById('latestLogDate');\n    const latestLogContent = document.getElementById('latestLogContent');\n    const logsContainer = document.getElementById('logs');\n    const logList = document.getElementById('logList');\n    const historyCount = document.getElementById('historyCount');\n\n    const localVer = '${String(localVersion)}';\n\n    // 统一的服务器配置 - 方便维护\n    const serverConfig = {\n      main: {\n        name: '主线路',\n        icon: 'rocket',\n        baseUrl: 'https://sy.langge.uk',\n        downloadPath: '/download/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup1: {\n        name: '备用线路1',\n        icon: 'box',\n        baseUrl: 'https://v2.langge.uk',\n        downloadPath: '/sy/download/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup2: {\n        name: '备用线路2',\n        icon: 'satellite',\n        baseUrl: 'https://v3.langge.tk',\n        downloadPath: '/sy/download/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup3: {\n        name: '备用线路3',\n        icon: 'link',\n        baseUrl: 'http://219.154.201.122:5006',\n        downloadPath: '/sy/download/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup4: {\n        name: '备用线路4',\n        icon: 'bolt',\n        baseUrl: 'https://v4.langge.uk',\n        downloadPath: '/sy/download/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup5: {\n        name: '备用线路5',\n        icon: 'globe',\n        baseUrl: 'https://v10.langge.uk',\n        downloadPath: '/sy/download/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup6: {\n        name: '备用线路6',\n        icon: 'broadcast-tower',\n        baseUrl: 'https://v5.langge.uk',\n        downloadPath: '/sy/download/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      }\n    };\n\n    // 版本比较函数\n    function compareVersions(vs) {\n      const normalize = (v) => {\n        return v.split('.').map(n => {\n          const num = parseInt(n, 10);\n          return isNaN(num) ? 0 : num;\n        });\n      };\n\n      const parts1 = normalize(localVer);\n      const parts2 = normalize(vs);\n      const maxLength = Math.max(parts1.length, parts2.length);\n      \n      for (let i = 0; i < maxLength; i++) {\n        const num1 = parts1[i] || 0;\n        const num2 = parts2[i] || 0;\n        if (num1 > num2) return 1;\n        if (num1 < num2) return -1;\n      }\n      return 0;\n    }\n\n    async function fetchVersionData() {\n      // 使用统一配置中除主线路外的备用线路进行版本检查\n      const serversToCheck = Object.values(serverConfig).filter(s => s.baseUrl.includes('langge.uk') || s.baseUrl.includes('219.154'));\n      \n      for (const server of serversToCheck) {\n        try {\n          const response = await fetch(server.baseUrl + '/version', { timeout: 2000 });\n          if (response.ok) {\n            return await response.json();\n          }\n        } catch (e) {\n          console.warn(\\`接口失败：\\${server.baseUrl}\\`, e);\n        }\n      }\n      throw new Error('所有更新接口都请求失败');\n    }\n\n    function showError(message) {\n      loading.innerHTML = \\`\n        <div class=\"error-state\">\n          <div class=\"error-icon\"><i class=\"fas fa-exclamation-triangle\"></i></div>\n          <div class=\"error-text\">\\${message}</div>\n          <button class=\"retry-button\" onclick=\"location.reload()\"><i class=\"fas fa-redo\"></i> 重试</button>\n        </div>\n      \\`;\n    }\n\n    try {\n      const data = await fetchVersionData();\n      const cloudVersion = String(data.version3);\n      const updateLog = data.update_log || {};\n\n      // 显示版本信息\n      currentVersion.textContent = \\`v\\${localVer}\\`;\n      latestVersion.textContent = \\`v\\${cloudVersion}\\`;\n\n      // 处理日志\n      const logEntries = Object.entries(updateLog);\n      if (logEntries.length > 0) {\n        // 显示最新日志\n        const [latestDate, latestContent] = logEntries[0];\n        latestLogDate.innerHTML = \\`<i class=\"fas fa-calendar-alt\"></i> \\${latestDate}\\`;\n        latestLogContent.textContent = latestContent;\n        latestLogContainer.style.display = 'block';\n\n        // 显示历史日志\n        if (logEntries.length > 1) {\n          const historyLogs = logEntries.slice(1);\n          historyCount.textContent = \\`(\\${historyLogs.length}条)\\`;\n          logList.innerHTML = historyLogs.map(([date, content]) => \\`\n            <div class=\"history-item\">\n              <div class=\"history-date\">\n                <i class=\"fas fa-calendar-day\"></i>\n                <span>\\${date}</span>\n              </div>\n              <div class=\"history-text\">\\${content}</div>\n            </div>\n          \\`).join('');\n          logsContainer.style.display = 'block';\n        }\n      }\n\n      // 检查更新状态\n      const compareResult = compareVersions(cloudVersion);\n      \n      // 显示版本指示器\n      versionIndicator.style.display = 'flex';\n      \n      if (compareResult === -1) {\n        // 需要更新\n        currentStatus.textContent = '待更新';\n        currentStatus.className = 'version-status status-outdated';\n        versionIndicator.className = 'version-indicator update-needed';\n        versionIndicator.innerHTML = '<i class=\"fas fa-arrow-right\"></i>';\n\n        // 使用统一配置生成下载按钮\n        buttonGroup.innerHTML = Object.values(serverConfig).map(server => {\n          const fullUrl = server.baseUrl + server.downloadPath;\n          return \\`\n            <a href=\"yuedu://booksource/importonline?src=\\${encodeURIComponent(fullUrl)}\" class=\"button\">\n              <i class=\"fas fa-\\${server.icon}\"></i>\n              <span>\\${server.name}</span>\n            </a>\n          \\`;\n        }).join('');\n        buttonGroup.style.display = 'flex';\n      } else {\n        // 已是最新版本\n        currentStatus.textContent = '最新';\n        currentStatus.className = 'version-status status-latest';\n        versionIndicator.className = 'version-indicator is-latest';\n        versionIndicator.innerHTML = '<i class=\"fas fa-check\"></i>';\n        \n        statusAlert.className = 'status-alert up-to-date';\n        statusAlert.innerHTML = '<i class=\"fas fa-check-circle\"></i> <div>您已是最新版本</div>';\n        statusAlert.style.display = 'flex';\n      }\n\n      // 显示主容器，隐藏加载\n      loading.style.display = 'none';\n      container.style.display = 'block';\n\n    } catch (err) {\n      console.error('版本检查失败：', err);\n      showError('<i class=\"fas fa-exclamation-circle\"></i> 检查更新失败，请稍后重试<br><small>' + err.message + '</small>');\n    }\n  })();\n  </script>\n</body>\n</html>\n`;\n    java.startBrowser(`data:text/html;base64,${java.base64Encode(html)}`, '大灰狼书源更新');\n}\n\n// 远程设置页面仅负责界面，用户配置仍保存在当前阅读软件的源变量中。\nfunction openSourceSettings() {\n    var current = {};\n    try {\n        current = JSON.parse(String(source.getVariable() || '{}'));\n    } catch (e) {}\n\n    if (!current || typeof current !== 'object') current = {};\n    if (!current.server) current.server = getArgument('server') || host[0];\n    if (!current.shuqi_tone_id || current.shuqi_tone_id === '默认音色') {\n        current.shuqi_tone_id = 'multi_role';\n    }\n    current.pstyle = String(current.pstyle || '0');\n\n    var settingsNonce = String(new Date().getTime()) + '_' + String(Math.floor(Math.random() * 1000000));\n    current._settings_nonce = settingsNonce;\n    var initialSettingsJson = JSON.stringify(current);\n\n    var baseUrl = String(current.server || host[0]).replace(/\\/+$/, '');\n    var settingsUrl = baseUrl + '/source-settings#config=' + encodeURIComponent(JSON.stringify(current));\n    var browserResult;\n    var body = '';\n\n    try {\n        var settingsPage = String(java.ajax(baseUrl + '/source-settings?_=' + String(new Date().getTime())) || '');\n        var stateMarker = 'let state = parseInitialState();';\n        if (settingsPage.indexOf(stateMarker) < 0) throw new Error('设置页面版本不兼容');\n\n        var injectedState = 'let state = { ...defaults, ...JSON.parse(decodeURIComponent(\"' +\n            encodeURIComponent(JSON.stringify(current)) + '\")) };';\n        settingsPage = settingsPage.replace(stateMarker, injectedState);\n\n        var relativeProbe = String.fromCharCode(96) + '$' + '{location.pathname}?probe=';\n        var absoluteProbe = String.fromCharCode(96) + baseUrl + '/source-settings?probe=';\n        settingsPage = settingsPage.replace(relativeProbe, absoluteProbe);\n        var openUrl = 'data:text/html;base64,' + java.base64Encode(settingsPage);\n        browserResult = java.startBrowserAwait(openUrl, '书源设置', false);\n\n        body = browserResult && typeof browserResult.body === 'function'\n            ? String(browserResult.body())\n            : (browserResult && browserResult.body != null ? String(browserResult.body) : String(browserResult || ''));\n    } catch (e) {\n        java.longToast('\\n当前阅读版本无法打开设置中心，原登录页设置仍可使用。\\n' + e);\n        return;\n    }\n\n    function decodeSafe(value) {\n        try {\n            return decodeURIComponent(String(value || '').trim());\n        } catch (e) {\n            return String(value || '').trim();\n        }\n    }\n\n    function parseCookieString(cookieStr) {\n        var output = {};\n        cookieStr = String(cookieStr || '');\n        if (!cookieStr || cookieStr == 'null' || cookieStr == 'undefined') return output;\n        var pairs = cookieStr.split(';');\n        for (var i = 0; i < pairs.length; i++) {\n            var pair = pairs[i];\n            var index = pair.indexOf('=');\n            if (index < 0) continue;\n            var key = decodeSafe(pair.substring(0, index));\n            var value = decodeSafe(pair.substring(index + 1));\n            output[key] = value;\n        }\n        return output;\n    }\n\n    function readSettingsResultFromBody(pageBody) {\n        var match = String(pageBody || '').match(/<script\\b[^>]*\\bid=[\"']source-settings-(?:final-)?result[\"'][^>]*>([\\s\\S]*?)<\\/script>/i);\n        if (!match || !match[1]) return null;\n        var raw = decodeSafe(match[1]);\n        if (!raw) return null;\n        return JSON.parse(raw);\n    }\n\n    function readSettingsResultFromUrl(result) {\n        var candidates = [];\n        try { candidates.push(String(result || '')); } catch (e) {}\n        try {\n            if (result && typeof result.url === 'function') candidates.push(String(result.url() || ''));\n            else if (result && result.url != null) candidates.push(String(result.url));\n        } catch (e) {}\n        try {\n            if (result && typeof result.getUrl === 'function') candidates.push(String(result.getUrl() || ''));\n        } catch (e) {}\n\n        for (var i = 0; i < candidates.length; i++) {\n            var match = candidates[i].match(/(?:#config=|[?&](?:config|source_settings_result)=)([^\\s\"'<>]+)/i);\n            if (!match || !match[1]) continue;\n            try {\n                var parsed = JSON.parse(decodeSafe(match[1]));\n                if (parsed && typeof parsed === 'object') return parsed;\n            } catch (e) {}\n        }\n        return null;\n    }\n\n    function readSettingsResultFromCookie(hostUrl) {\n        var urls = [hostUrl, hostUrl + '/', settingsUrl];\n        var seen = {};\n        for (var u = 0; u < urls.length; u++) {\n            var target = String(urls[u] || '');\n            if (!target || seen[target]) continue;\n            seen[target] = true;\n            var cookieStr = '';\n            try {\n                cookieStr = String(cookie.getCookie(target) || '');\n            } catch (e) {}\n            var cookieData = parseCookieString(cookieStr);\n            if (cookieData.source_settings_result) {\n                return JSON.parse(cookieData.source_settings_result);\n            }\n        }\n        return null;\n    }\n\n\n    function readBubbleResultFromCookie(hostUrl) {\n        var urls = [hostUrl, hostUrl + '/', hostUrl + '/static/bubble_preview.html'];\n        for (var urlIndex = 0; urlIndex < urls.length; urlIndex++) {\n            var cookieString = '';\n            try {\n                cookieString = String(cookie.getCookie(urls[urlIndex]) || '');\n            } catch (e) {}\n            var cookieData = parseCookieString(cookieString);\n            if (!cookieData.bubble_settings_result) continue;\n            try {\n                var parsed = JSON.parse(cookieData.bubble_settings_result);\n                if (parsed && typeof parsed === 'object') return parsed;\n            } catch (e) {}\n        }\n        return null;\n    }\n\n    try {\n        var resultType = '';\n        var next = readSettingsResultFromBody(body);\n        if (next) resultType = '内嵌页面';\n        if (!next) {\n            next = readSettingsResultFromCookie(baseUrl);\n            if (next) resultType = 'Cookie';\n        }\n        if (!next) {\n            next = readSettingsResultFromUrl(browserResult);\n            if (next) resultType = 'URL';\n        }\n        if (!next || typeof next !== 'object') throw new Error('未读取到设置结果');\n        if (String(next._settings_nonce || '') !== settingsNonce) throw new Error('设置结果未更新');\n\n        var bubbleHosts = [String(next.server || baseUrl).replace(/\\/+$/, ''), baseUrl].concat(host || []);\n        var checkedBubbleHosts = {};\n        for (var bubbleHostIndex = 0; bubbleHostIndex < bubbleHosts.length; bubbleHostIndex++) {\n            var bubbleHost = String(bubbleHosts[bubbleHostIndex] || '').replace(/\\/+$/, '');\n            if (!bubbleHost || checkedBubbleHosts[bubbleHost]) continue;\n            checkedBubbleHosts[bubbleHost] = true;\n            var bubbleResult = readBubbleResultFromCookie(bubbleHost);\n            if (!bubbleResult) continue;\n            if (String(bubbleResult._bubble_nonce || '') !== settingsNonce) continue;\n            if (String(bubbleResult._bubble_applied || '') !== '1') continue;\n            var bubbleStyle = String(bubbleResult.pstyle || '');\n            if (/^[A-Za-z0-9_-]{1,32}$/.test(bubbleStyle)) next.pstyle = bubbleStyle;\n            break;\n        }\n        if (resultType === 'URL' && JSON.stringify(next) === initialSettingsJson) {\n            throw new Error('源阅仅返回了初始地址，未返回修改后的设置');\n        }\n        delete next._settings_nonce;\n        if (!next.server) next.server = baseUrl;\n        if (!next.shuqi_tone_id || next.shuqi_tone_id === '默认音色') next.shuqi_tone_id = 'multi_role';\n        next.pstyle = String(next.pstyle || '0');\n        source.setVariable(JSON.stringify(next));\n        try { java.log('书源设置回传方式：' + resultType); } catch (ignore) {}\n        java.longToast('\\n模式：' + (next.tab || '') + '\\n来源：' + (next.sources || '') + '\\n搜索、发现页或正文刷新后生效。');\n    } catch (e) {\n        java.longToast('\\n未读取到设置结果，已保留原配置。\\n' + e);\n    }\n}", "respondTime": 180000, "ruleBookInfo": {"author": "$.author", "canReName": "1", "coverUrl": "$.thumb_url", "init": "<js>\nif (String(baseUrl).startsWith(\"data:\")) {\n    let res = JSON.parse(java.hexDecodeToString(result));\n    let book_id = res.book_id;\n    let tab = res.tab;\n    let sources = res.sources;\n    let url = res.url;\n    let html = \"\";\n    let proxy = getArguments(source.getVariable(), \"proxy\");\n    if (url != \"\" && proxy == \"本地\") {\n        if (sources == '69书吧') {\n            let ck69 = String(cookie.getCookie('https://www.69shuba.com'));\n            let headers = {\n        \t \"Referer\": url,\n            \"Cookie\": ck69,\n            \"User-Agent\":  java.getWebViewUA()\n             };            \n             let op = JSON.stringify({\n                \"headers\": headers\n            });\n            html = java.ajax(`${url},${op}`);\n        } else {\n            html = java.ajax(url);\n        }\n        //java.log(html);\n        if (html.includes(\"Just a moment...\") && sources == '69书吧') {\n            cookie.removeCookie('https://www.69shuba.com');\n            java.longToast('需要真人验证，请进入任意书籍详情页过验证');\n            html = java.startBrowserAwait(url, \"需要真人验证，请进入任意书籍详情页过验证\").body();\n\n             java.log(html);\n        }\n    }\n    let base_url = getArguments(source.getVariable(), \"server\");\n    let op = {\n        method: \"POST\",\n        body: {\n            html: html\n        }\n    };\n    op = JSON.stringify(op);\n    let varia = String(book.getVariable('custom'));\n    if (varia == 'null') {\n        varia = '';\n    }\n    varia = JSON.stringify({\n        'custom': varia\n    });\n    //varia = java.base64Encode(varia);\n    java.log(`${base_url}/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n    try {\n        result = java.ajax(`${base_url}/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n        JSON.parse(result);\n    } catch(_err) {\n        for (var _i = 0; _i < host.length; _i++) {\n            if (host[_i] === base_url) continue;\n            try {\n                result = java.ajax(`${host[_i]}/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n                JSON.parse(result);\n                setArguments(\"server\", host[_i]);\n                java.longToast(\"\\n\\n线路故障，已自动切换到：\" + host[_i]);\n                break;\n            } catch(_e2) { continue; }\n        }\n    }\n}\nresult\n</js>$.data", "intro": "<js>\nlet {\n    book_id,\n    source: sources,\n    tab,\n    book_tts,\n    book_tts_dice,\n    tags,\n    role,\n    last_chapter_title,\n    last_chapter_update_time,\n    word_number,\n    status,\n    score,\n    abstract,\n    copyright_info\n} = result;\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (proxy == \"本地\") {\n    proxy = \"本地网络\";\n} else {\n    proxy = \"服务器网络\";\n}\njava.put(\"book_detail\", JSON.stringify(result));\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet key3 = \"\";\ntry {\n    let cookieValue =\n        String(cookie.getCookie(base_url)) || String(java.getCookie(base_url));\n    key3 = getKey(cookieValue);\n} catch (e) {\n    key3 = \"\";\n}\n\nif (key3 == \"\") {\n    java.log(\"当前服务器未查询到登录状态，尝试查询其他服务器登录状态...\");\n    let cookieValue;\n    for (let h of host) {\n        try {\n            cookieValue = String(cookie.getCookie(h)) || String(java.getCookie(h));\n            key3 = getKey(cookieValue);\n        } catch (e) {\n            key3 = \"\";\n        }\n        if (key3) {\n            java.log(`已在${h}登录，退出查询，正在转移登录状态到当前服务${base_url}`);\n            //java.log(cookieValue)\n            cookie.removeCookie(h);\n            cookie.removeCookie(base_url);\n            cookie.setCookie(base_url, cookieValue);\n            break;\n        }\n    }\n}\n\nif (book.readConfig == null || book.readConfig.useReplaceRule == null) {\n    book.setUseReplaceRule(false);\n}\n\nlet nickname = '账号状态：⚠️ 未登录 | 点击右上角 🔖 登录';\ntry {\n    let opcx = {\n        method: \"GET\",\n        headers: {\n            cookie: 'qttoken=' + key3 + ';'\n        },\n    };\n    opcx = JSON.stringify(opcx);\n    let user_info = JSON.parse(java.ajax(base_url + '/get_avatar,' + opcx));\n    if (user_info.code == 0) {\n        if (user_info.nickname) {\n            nickname = '欢迎回来：' + user_info.nickname\n        } else {\n            nickname = '欢迎回来：' + user_info.email + \"(请前往用户后台设置用户名)\"\n        }\n    }\n} catch (e) {\n    if (key) {\n        nickname = '账号状态：已登录'\n    }\n};\n\nlet loginStatus = nickname;\n\nlet lightDivider = \"❇️───────❇️───────❇️\";\nlet heavyDivider = \"&lrm;\\n&lrm;\";\n\nlet isValid = (value) => String(value).length > 1;\nlet ctitle = book.durChapterTitle || '未开始';\nlet info = `\n    📡 当前服务：${base_url}\n    🔑 ${loginStatus}\n    🏷 数据来源：${sources}\n    🔄 当前模式：${tab}\n    ⚙️ 访问模式：${proxy}\n    📖 阅读至：${ctitle}\n`;\n\nif (tab == \"听书\") {\n    let toneId = String(book.getVariable('custom'));\n    if (toneId == 'null') toneId = '';\n    let isShuqiAudio = sources == '书旗' || sources == 'svip_书旗';\n    if (isShuqiAudio && (!toneId || toneId == '默认音色')) {\n        toneId = getArguments(source.getVariable(), 'shuqi_tone_id') || 'multi_role';\n    } else if (!toneId) {\n        toneId = '4';\n    }\n    if (isShuqiAudio) {\n        let toneName = getShuqiToneName(toneId);\n        let toneNumber = getShuqiToneNumber(toneId);\n        let supportedTones = [];\n        if (book_tts_dice && typeof book_tts_dice == 'object') {\n            supportedTones = Object.keys(book_tts_dice)\n                .map((name) => {\n                    let value = String(book_tts_dice[name] || '');\n                    let known = getShuqiToneOption(value) || getShuqiToneOption(name);\n                    return known ? {number: known.number, name: known.name} : {number: value, name: name};\n                })\n                .filter((option) => /^\\d+$/.test(option.number));\n        }\n        if (!supportedTones.length) supportedTones = SHUQI_TONE_OPTIONS.slice();\n        supportedTones.sort((left, right) => Number(left.number) - Number(right.number));\n        let availableTones = supportedTones\n            .map((option) => '    ' + option.number + '. ' + option.name)\n            .join('\\n');\n        let toneSupported = supportedTones.some((option) => option.number == toneNumber);\n        let fallbackTip = toneSupported ? '' : '\\n    ⚠️ 本书不支持当前音色，播放时会自动回退到可用音色';\n        info += `${lightDivider}\n    🎵 当前音色：${toneName}\n    🔢 当前编号：${toneNumber}${fallbackTip}\n    🛠 修改方法：点击右上角“书籍变量”，只需填写下面的数字编号；留空使用书源登录页选择的音色\n    🎙 本书可用的书旗音色：\n${availableTones}\n`;\n    } else if (isValid(book_tts)) {\n        info += `${lightDivider}\n    🎵 音色配置：${toneId}\n    ✨ AI音色请点击右上角书籍变量填写相关值，真人听书请重新搜索选择带有主播的书籍\n    ${book_tts}\n`;\n    }\n}\n\nlet basicInfo = \"\";\nlet addBasicInfo = (value, prefix, icon) => {\n    if (isValid(value)) basicInfo += `    ${icon} ${prefix} ${value}\\n`;\n};\n\naddBasicInfo(tags, \"书籍分类：\", \"🌈\");\naddBasicInfo(role, \"书籍主角：\", \"👑\");\naddBasicInfo(last_chapter_title, \"最新章节：\", \"📚\");\naddBasicInfo(last_chapter_update_time, \"更新时间：\", \"⏳\");\naddBasicInfo(word_number, \"书籍字数：\", \"📊\");\naddBasicInfo(status, \"书籍状态：\", \"🚩\");\naddBasicInfo(score, \"书籍评分：\", \"⭐\");\n\nif (basicInfo) info += `${lightDivider}\\n${basicInfo}`;\n\nif (isValid(abstract)) {\n    let indentedAbstract = abstract\n        .split(\"\\n\")\n        .map((line) => `    ${line}`)\n        .join(\"\\n\");\n    info += `${heavyDivider}\n    📖 书籍简介：\n${indentedAbstract}\n`;\n} else {\n    info += `${heavyDivider}`;\n}\n\nif (isValid(copyright_info)) {\n    info += `${lightDivider}\n    © ${copyright_info}\n`;\n} else {\n    info += `${lightDivider}`;\n}\n\ninfo += `\n${heavyDivider}\n    💠💠💠 数据更新于 ${new Date().toLocaleString()} 💠💠💠\n`;\nlet jjinfo = getArguments(source.getVariable(), \"info\");\n\nif (jjinfo != \"off\") {\n    info = String(info)\n        .split(\"\\n\")\n        .map((line) => line.replace(/^ {4}/, \"\"))\n        .join(\"\\n\");\n} else {\n    basicInfo = \"\";\n    addBasicInfo(last_chapter_title, \"最新章节：\", \"📚\");\n    addBasicInfo(last_chapter_update_time, \"更新时间：\", \"⏳\");\n    addBasicInfo(word_number, \"书籍字数：\", \"📊\");\n    addBasicInfo(status, \"书籍状态：\", \"🚩\");\n    addBasicInfo(score, \"书籍评分：\", \"⭐\");\n    if (isValid(abstract)) {\n        let indentedAbstract = abstract\n            .split(\"\\n\")\n            .map((line) => `    ${line}`)\n            .join(\"\\n\");\n        basicInfo += `\n    \\n&lrm;\n    📖 书籍简介：\n${indentedAbstract}\n`;\n    } else {\n        basicInfo += `${heavyDivider}`;\n    }\n    info = `&lrm;\\n🏷 数据来源：${sources}\\n` + basicInfo;\n}\n</js>", "lastChapter": "{{$.source}} {{$.last_chapter_title}} {{$.last_chapter_update_time}}", "name": "$.book_name", "tocUrl": "<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || \"小说\";\nlet url = result.toc_url || \"\";\nvar sdtoken;\ntry {\n    var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n    sdtoken = String(loginInfoMap['手动填写番茄token(可不填)'] || '');\n} catch (e) {\n    sdtoken = '';\n}\nvar rawCookie = getFanqieCookie() || sdtoken;\nvar match = rawCookie.match(/sessionid=[^;]+/);\nvar fqcookie = match ? match[0] : '';\nvar fqssionid = '';\nif (fqcookie) {\n    fqssionid = getSessionId(fqcookie);\n};\nsetArguments('fqssionid', fqssionid);\njava.put(\"tab\", tab);\njava.put(\"book_id\", book_id);\nlet qtcatalog = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url,\n};\nqtcatalog = java.base64Encode(JSON.stringify(qtcatalog));\n`data:;base64,${qtcatalog},{\"type\":\"qingtian2\"}`;\n</js>", "wordCount": "$.word_number"}, "ruleContent": {"content": "<js>\njava.log(result)\nresult = String(java.hexDecodeToString(result));\nlet res;\nif (result.match(/大灰狼融合/)) {\n    result = result.split(\"大灰狼融合4\");\n    res = {\n        item_id: result[0],\n        tab: result[1],\n        title: result[2],\n        sources: result[3],\n        url: \"\"\n    };\n} else {\n    res = JSON.parse(result);\n}\n\nfunction checkEnv() {\n    try {\n        java.qread();\n        return \"轻阅读\";\n    } catch (e) {}\n\n    try {\n        if (typeof java.reLoginView == 'function') {\n            return \"改版\";\n        }\n        new Packages.io.legato.kazusa.utils.TimeoutCancellationException('');\n        return \"改版\";\n    } catch (e) {}\n\n    try {\n        java.deviceID();\n        return \"苹果\";\n    } catch (e) {}\n\n    if (typeof source.loginUi == 'function') {\n        return \"安卓\";\n    }\n    return \"改版\";\n}\n\nvar clientEnv = checkEnv();\nvar islyc = clientEnv == \"改版\";\ntry {\nif (islyc) {\n\tbook.imageStyle = 'FULL';\n\t} else {\n\t\tbook.imageStyle = 'TEXT';\n\t\t}\n} catch {}\nlet varia1 = String(book.getVariable('custom'));\nif (varia1 == 'null') {\n    varia1 = '';\n}\nlet varia = JSON.stringify({\n    'custom': varia1\n});\n//  varia = java.base64Encode(varia);\nlet book_id = res.book_id;\nlet item_id = res.item_id;\nlet tab = res.tab;\nlet title = res.title;\nlet sources = res.sources;\nlet url = res.url;\nlet html = \"\";\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (url != \"\" && proxy == \"本地\") {\n    if (sources == '69书吧') {\n        let ck69 = String(cookie.getCookie('https://www.69shuba.com'));\n        let headers = {\n            \"Referer\": url,\n            \"Cookie\": ck69,\n            \"User-Agent\": java.getWebViewUA()\n        };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        java.log(url);\n        java.log(op);\n        html = java.ajax(`${url},${op}`);\n    } else {\n        html = java.ajax(url);\n    }\n    java.log('dddddddddddddddddddddddddddd')\n    java.log(html);\n    if (html.includes(\"Just a moment...\") && sources == '69书吧' && book.durChapterIndex === chapter.index) {\n        cookie.removeCookie('https://www.69shuba.com');\n        java.longToast('需要真人验证，请进入任意书籍详情页过验证');\n        html = java.startBrowserAwait(url, \"需要真人验证，请进入任意书籍详情页过验证\").body();\n        java.log('cscscscs')\n        java.log(html);\n    }\n};\nlet content = \"\";\nlet data;\n//let tone_id = getArguments(source.getVariable(), \"tone_id\");\nlet tone_id = varia1;\nlet isShuqiAudio = tab == '听书' && (sources == '书旗' || sources == 'svip_书旗');\nif (isShuqiAudio) {\n    if (!tone_id || tone_id == '默认音色') {\n        tone_id = getArguments(source.getVariable(), 'shuqi_tone_id') || 'multi_role';\n    }\n    tone_id = resolveShuqiToneId(tone_id);\n} else if (!tone_id) {\n    tone_id = '4';\n}\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet fqpara = getArguments(source.getVariable(), \"fqpara\");\nlet fqcommunity = getArguments(source.getVariable(), \"fqcommunity\");\nlet close_img = getArguments(source.getVariable(), \"close_img\");\nif (!fqcommunity) {\n    fqcommunity = \"on\";\n}\nlet device, device_type;\ntry {\n    device = java.deviceID();\n    device_type = \"苹果\";\n} catch (e) {\n    try {\n        device = java.androidId();\n        device_type = \"安卓\";\n    } catch (e) {\n        device = \"\";\n        device_type = \"安卓\";\n    }\n}\nlet isQiyue = device_type == \"苹果\" && clientEnv == \"改版\";\n\nlet qtcookie = cookie.getCookie(base_url);\ntry {\n\t   let device2 = String(cookie.getKey(base_url, \"device\"));\n\t   if (!device2){\n\t   \tdevice2 = device;\n\t   \t}\n    qtcookie = `qttoken=${String(cookie.getKey(base_url, \"qttoken\"))}; deviceId=${device2};`\n} catch (e) {java.log(e)}\n\nvar params = {\n    html: html,\n    item_id: item_id,\n    source: sources,\n    tab: tab,\n    tone_id: tone_id,\n    variable: varia,\n    version: '4.11.5.1',\n    app: '\\u9605\\u8bfb\\u795e\\u8bc4\\u8868\\u60c5',\n    god: fqpara == 'on'\n};\n\nvar content_url = '/content';\nvar reviewSource = sources == \"svip_书旗\" ? \"书旗\" : sources;\nif ((reviewSource == \"番茄\" || reviewSource == \"七猫\" || reviewSource == \"书旗\" || reviewSource == \"塔读\" || reviewSource == \"QQ阅读\" || reviewSource == \"svip_QQ阅读\") && fqpara == \"on\" && tab == \"小说\") {\n    content_url = '/content?review=1';\n}\n\n//var signInfo = generateComplexSignature('POST', content_url, {}, APP_SECRET, params);\n\n\n//var signedParams = copyObject(params);\n//signedParams.timestamp = signInfo.timestamp;\n//signedParams.nonce = signInfo.nonce;\n//signedParams.sign = signInfo.sign;\n\n\nvar op = {\n    method: \"POST\",\n    body: JSON.stringify(params),\n    headers: {\n        cookie: qtcookie,\n        'Content-Type': 'application/json'\n    }\n};\n\nop = JSON.stringify(op);\njava.log(op);\njava.log(cookie.getCookie(base_url))\ntry {\n    data = java.ajax(base_url + content_url + `,${op}`);\n    JSON.parse(data);\n} catch(_err) {\n    for (var _i = 0; _i < host.length; _i++) {\n        if (host[_i] === base_url) continue;\n        try {\n            data = java.ajax(host[_i] + content_url + `,${op}`);\n            JSON.parse(data);\n            setArguments(\"server\", host[_i]);\n            try { var _oldCk = cookie.getCookie(base_url); if (_oldCk) cookie.setCookie(host[_i], _oldCk); } catch(_ce) {}\n            base_url = host[_i];\n            java.longToast(\"\\n\\n线路故障，已自动切换到：\" + host[_i]);\n            break;\n        } catch(_e2) { continue; }\n    }\n}\ntry {\n    data = JSON.parse(data);\n    if (data.msg) {\n        var contentMsg = String(data.msg);\n        if (contentMsg.indexOf('runtime error: invalid memory address or nil pointer dereference') >= 0) {\n            // 仅隐藏后端空指针内部错误，其他业务提示仍正常显示。\n            java.log('正文接口空指针错误: ' + contentMsg);\n        } else {\n            java.toast(contentMsg);\n        }\n    }\n} catch (e) {\n    java.log('正文响应解析失败: ' + String(e));\n}\ncontent = data && data.content ? data.content : \"\"\n\nif (close_img == 'on') {\n\tcontent = removeAllImgTags(content);\n\t}\n\nif ((reviewSource == \"番茄\" || reviewSource == \"七猫\" || reviewSource == \"书旗\" || reviewSource == \"塔读\" || reviewSource == \"QQ阅读\" || reviewSource == \"svip_QQ阅读\") && tab == \"小说\") {\n    var sdtoken;\n    try {\n        var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n        sdtoken = String(loginInfoMap['手动填写番茄token(可不填)'] || '');\n    } catch (e) {\n        sdtoken = '';\n    }\n    var rawCookie = getFanqieCookie() || sdtoken;\n    var match = rawCookie.match(/sessionid=[^;]+/);\n    var fqcookie = match ? match[0] : '';\n    var fqssionid = '';\n    if (!fqcookie) {} else {\n        fqssionid = getSessionId(fqcookie)\n    }\n    content = content\n        .replace(/ident=\"/g, `ident=\"${base_url}`)\n        .replace(/book_id=/g, `book_id=${book_id}&ssionid=${fqssionid}`);\n    if (sources == \"七猫\") {\n        content = content.replace(/ident=\"([^\"]*)\"/g, function(full, reviewUrl) {\n            if (reviewUrl.indexOf('/qimao_comment?mode=paragraph&') < 0) {\n                return full;\n            }\n            let paragraphUrl = reviewUrl\n                .replace('/qimao_comment?mode=paragraph&', '/get_para_review?')\n                .replace(/([?&])paragraph_id=/, '$1para=');\n            return 'ident=\"' + paragraphUrl + '\"';\n        });\n    }\n    if (fqpara == \"on\") {\n        if (device_type == \"苹果\") {\n            content = paraForiOS(content, sources);\n        } else {\n            content = paraForAndroid(content, sources);\n        }\n    }\n}\nif ((reviewSource == \"番茄\" || reviewSource == \"七猫\" || reviewSource == \"书旗\" || reviewSource == \"QQ阅读\" || reviewSource == \"svip_QQ阅读\") && fqcommunity != \"off\" && tab == \"小说\") {\n    let svg = `${base_url}/chapter_review_svg?book_id=${book_id}&item_id=${item_id}&source=${encodeURIComponent(reviewSource)}&ssionid=${fqssionid}&cache=${Date.now()}`;\n    let commentPageUrl;\n    if (reviewSource == \"书旗\") {\n        commentPageUrl = `${base_url}/get_para_review?book_id=${book_id}&item_id=${item_id}&source=${encodeURIComponent(reviewSource)}&cache=${Date.now()}`;\n    } else if (reviewSource == \"QQ阅读\" || reviewSource == \"svip_QQ阅读\") {\n        commentPageUrl = `${base_url}/get_para_review?mode=chapter&book_id=${book_id}&item_id=${item_id}&source=${encodeURIComponent(reviewSource)}&cache=${Date.now()}`;\n    } else {\n        let commentPagePath = reviewSource == \"七猫\" ? \"/qimao_comment?mode=chapter\" : \"/fanqie_comment?mode=chapter\";\n        commentPageUrl = `${base_url}${commentPagePath}&book_id=${book_id}&item_id=${item_id}&source=${encodeURIComponent(reviewSource)}&tab=${encodeURIComponent(tab)}&ssionid=${fqssionid}&cache=${Date.now()}`;\n    }\n    let chapterSvg = '';\n    let chapterSvgChecked = false;\n    try {\n        chapterSvg = java.ajax(svg);\n        chapterSvgChecked = true;\n    } catch (e) {}\n\n    // 请求成功但没有 SVG，说明本章没有评论，不插入本章说图片。\n    // 请求失败时保留原直链兜底，避免临时网络故障隐藏已有评论。\n    let hasChapterCard = String(chapterSvg || '').indexOf('<svg') >= 0;\n    if (!chapterSvgChecked) hasChapterCard = true;\n    if (hasChapterCard) {\n        if (device_type == \"苹果\" && chapterSvg) {\n            svg = 'data:image/svg+xml;base64,' + java.base64Encode(chapterSvg);\n        } else {\n            svg += '&img=1';\n        }\n        if (device_type == '苹果') {\n            // iOS 不使用 qtbzs 专用类型，并同时提供两种点击字段，避免退化为图片预览。\n            let chapterAction = 'showFanqieComment(' + JSON.stringify(commentPageUrl) + ',' + JSON.stringify('本章说') + ')';\n            let chapterMeta = {style: 'FULL', click: chapterAction, js: chapterAction};\n            content = content + `\\n<img src=\"${svg},${JSON.stringify(chapterMeta)}\">`;\n        } else {\n            // 安卓保留原有 qtbzs 协议，避免改变已经可用的点击行为。\n            content = content + `\\n<img src=\"${svg},{'type':'qtbzs',${endclick(commentPageUrl, '本章说')},'style':'FULL'}\">`;\n        }\n    }\n}\ndata = JSON.stringify({\n    content: content,\n});\nif (device_type == \"安卓\" && (tab == \"短剧\" || tab == \"视频\" || sources.includes('毒舌影视') || sources.includes('NT动漫'))) {\n    data = {\n        content: `【右上角刷新】开启播放(下一集请切换下一章刷新)\\n播放直链：\\n${content}`,\n    };\n    data = JSON.stringify(data);\n    if (book.durChapterIndex === chapter.index) {\n        let video_url = `${base_url}/online_video?book_id=${book_id}&source=${sources}&tab=${tab}`;\n        if (sources.includes('毒舌影视') || sources.includes('NT动漫')) {\n            video_url = content;\n        };\n        java.startBrowser(video_url, title);\n        java.toast(\"正在加载视频...\");\n    }\n\n}\ndata;\n</js>$.content", "imageStyle": "full"}, "ruleExplore": {"author": "$.author", "bookList": "$.data", "bookUrl": "<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '小说';\nlet url = result.toc_url || '';\n\nlet qtdetail = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url\n}\nqtdetail = java.base64Encode(JSON.stringify(qtdetail));\n`data:;base64,${qtdetail},{\"type\":\"qingtian\"}`\n</js>", "coverUrl": "$.thumb_url", "intro": "$.abstract", "kind": "{{$.category}}\n{{$.score}}\n{{$.status}}\n{{$.source}}\n{{$.tags}}", "lastChapter": "{{$.last_chapter_title}} • {{$.last_update_time}}", "name": "$.book_name", "wordCount": "$.word_number"}, "ruleSearch": {"author": "$.author", "bookList": "$.data", "bookUrl": "<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '小说';\nlet url = result.toc_url || '';\n\nlet qtdetail = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url\n}\nqtdetail = java.base64Encode(JSON.stringify(qtdetail));\n`data:;base64,${qtdetail},{\"type\":\"qingtian\"}`\n</js>", "checkKeyWord": "我的26岁女房客@番茄", "coverUrl": "$.thumb_url", "intro": "$.abstract", "kind": "{{$.status}},{{$.score}},{{$.tags}},{{$.last_chapter_update_time}}", "lastChapter": "{{$.source}} {{$.last_chapter_title}}", "name": "$.book_name##（别名：.*?）", "wordCount": "$.word_number"}, "ruleToc": {"chapterList": "<js>\nlet res = JSON.parse(java.hexDecodeToString(result));\nif (res.method) {\n    res = Object.fromEntries(\n        res.body\n        .replace(\"source\", \"sources\")\n        .split(\"&\")\n        .map((query) => query.split(\"=\"))\n    );\n    res.url = \"\";\n}\nlet book_id = res.book_id;\njava.put('book_id', book_id);\nlet tab = res.tab;\nlet sources = res.sources;\nlet url = res.url;\nlet html = \"\";\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (url != \"\" && proxy == \"本地\") {\n    if (sources == '69书吧') {\n        let ck69 = String(cookie.getCookie('https://www.69shuba.com'));\n        let headers = {\n        \t \"Referer\": url,\n            \"Cookie\": ck69,\n            \"User-Agent\":  java.getWebViewUA()\n             };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        html = java.ajax(`${url},${op}`);    \n    } else {\n        html = java.ajax(url);\n    }\n    //java.log(html);\n    if (html.includes(\"Just a moment...\") && sources == '69书吧') {\n        cookie.removeCookie('https://www.69shuba.com');\n        java.longToast('需要真人验证，请进入任意书籍详情页过验证');\n        html = java.startBrowserAwait(url, \"需要真人验证，请进入任意书籍详情页过验证\").body();\n\n           java.log(html);\n    }\n};\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet op = {\n    method: \"POST\",\n    body: {\n        html: html\n    }\n};\nop = JSON.stringify(op);\nlet varia = String(book.getVariable('custom'));\nif (varia == 'null') {\n    varia = '';\n}\nvaria = JSON.stringify({\n    'custom': varia\n});\n// varia = java.base64Encode(varia);\n//java.log(`${base_url}/catalog?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\nlet data = java.ajax(\n    `${base_url}/catalog?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`\n);\nlet catalogResult;\ntry {\n    catalogResult = JSON.parse(data);\n} catch (e) {\n    catalogResult = null;\n}\nif (catalogResult && Number(catalogResult.code) !== 0) {\n    java.longToast('\\n\\n' + (catalogResult.msg || '获取目录失败'));\n    data = JSON.stringify({data: []});\n}\nlet device, device_type;\ntry {\n    device = java.deviceID();\n    device_type = \"苹果\";\n} catch (e) {\n    try {\n        device = java.androidId();\n        device_type = \"安卓\";\n    } catch (e) {\n        device = \"\";\n        device_type = \"安卓\";\n    }\n}\n\nif (tab == \"小说\") {\n    if (device_type == \"安卓\") {\n        book.type = 8;\n    } else {\n        book.type = 0;\n    }\n} else if (tab == \"听书\") {\n    if (device_type == \"安卓\") {\n        book.type = 32;\n    } else {\n        book.type = 1;\n    }\n} else if (tab == \"漫画\") {\n    if (device_type == \"安卓\") {\n        book.type = 64;\n    } else {\n        book.type = 2;\n    }\n} else if (tab == \"短剧\") {\n    if (device_type == \"安卓\") {\n        book.type = 8;\n    } else {\n        book.type = 3;\n    }\n} else {\n    if (device_type == \"安卓\") {\n        book.type = 8;\n    } else {\n        book.type = 0;\n    }\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet reading = getArguments(source.getVariable(), \"reading\");\n\nif (book && book.order != 0 && reading == '1') {\n    try {\n        if (!data || !book.variable || !base_url || !qtcookie) {\n            java.log('缺少必要参数');\n        } else {\n            let parsedData;\n            try {\n                parsedData = JSON.parse(data);\n            } catch (e) {\n                java.log('解析data数据失败:' + e);\n            }\n            \n            if (parsedData && parsedData.data && Array.isArray(parsedData.data) && parsedData.data[book.durChapterIndex]) {\n                let ritem = parsedData.data[book.durChapterIndex];\n                let bookInfoObj;\n                try {\n                    bookInfoObj = JSON.parse(book.variable);\n                } catch (e) {\n                    java.log('解析book.variable失败:' + e);\n                }\n                \n                if (bookInfoObj) {\n                    let book_info;\n                    try {\n                        book_info = JSON.parse(bookInfoObj.book_detail || JSON.stringify(bookInfoObj));\n                    } catch (e) {\n                        java.log('解析book_detail失败:' + e);\n                    }\n                    \n                    if (book_info && typeof book_info === 'object') {\n                        let rurl = base_url + '/add_book_to_book_shelf,';\n                        book_info['read_status'] = 1;\n                        book_info['last_chapter_item_id'] = ritem.item_id || '';\n                        book_info['last_chapter_title'] = ritem.title || '';\n                        let rop = {\n                            method: \"POST\",\n                            headers: {\n                                cookie: qtcookie\n                            },\n                            body: book_info\n                        };\n                        let check_book_url = base_url + '/check_book_in_book_shelf,';\n                        let checkResponse;\n                        \n                        try {\n                            checkResponse = java.ajax(check_book_url + JSON.stringify(rop));\n                        } catch (e) {\n                            java.log('检查书籍请求失败:' + e);\n                        }\n                        \n                        if (checkResponse) {\n                            let check_data;\n                            try {\n                                check_data = JSON.parse(checkResponse).data;\n                            } catch (e) {\n                                java.log('解析检查响应失败:' + e);\n                            }\n                            try {\n                                if (check_data && check_data.id) {\n                                    book_info['id'] = check_data.id;\n                                    let uurl = base_url + '/update_book_shelf,';\n                                    java.ajax(uurl + JSON.stringify(rop));\n                                } else {\n                                    java.ajax(rurl + JSON.stringify(rop));\n                                }\n                            } catch (e) {\n                                java.log('书架操作失败:' + e);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    } catch (error) {\n        java.log('书籍同步流程异常:' + error);\n        java.longToast('\\n同步阅读进度失败，但不影响阅读，可以前往登录关闭书架同步功能。');\n    }\n}\ndata;\n</js>$.data", "chapterName": "$.title", "chapterUrl": "<js>\nlet tab = result.tab;\nlet sources = result.source;\nlet title = result.title;\nlet item_id = result.item_id;\nlet book_id = java.get(\"book_id\");\nlet url = result.toc_url || \"\";\nlet qtcontent = {\n    book_id: book_id,\n    item_id: item_id,\n    title: title,\n    sources: sources,\n    tab: tab,\n    url: url,\n};\nqtcontent = java.base64Encode(JSON.stringify(qtcontent));\nif (sources == '卷') {\n    content_url = item_id\n} else {\n    content_url = `data:;base64,${qtcontent},{\"type\":\"qingtian3\"}`;\n}\n</js>", "updateTime": "$.first_pass_time"}, "searchUrl": "<js>\nlet base_url = getArguments(source.getVariable(), 'server');\nlet media;\nlet sources = getArguments(source.getVariable(), 'sources') || getArguments(source.getVariable(), 'source');\nlet disabled_sources = getArguments(source.getVariable(), 'disabled_sources') || '0';\nif (String(key).startsWith(\"m:\") || String(key).startsWith(\"m：\")) {\n    media = \"漫画\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"t:\") || String(key).startsWith(\"t：\")) {\n    media = \"听书\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"d:\") || String(key).startsWith(\"d：\")) {\n    media = \"短剧\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"x:\") || String(key).startsWith(\"x：\")) {\n    media = \"小说\"\n    key = key.slice(2)\n} else {\n    media = getArguments(source.getVariable(), 'tab') || getArguments(source.getVariable(), 'media');\n}\nif (key.includes('@')) {\n    var parts = key.split('@');\n    key = parts[0];\n    sources = parts[1] || sources;\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet op = {\n    method: \"GET\",\n    headers: {\n        cookie: qtcookie\n    },\n};\nop = JSON.stringify(op);\n`${base_url}/search?title=${key}&tab=${media}&source=${sources}&page={{page}}&disabled_sources=${disabled_sources},${op}`\n</js>", "weight": 0},{"bookSourceComment": "番茄小说，七猫小说，塔读小说，书旗小说，起点小说，所有来源均支持段评，本章说\n\ntg群:https://t.me/mowanxiaoshuo", "bookSourceGroup": "番茄,个人", "bookSourceName": "魔丸小说", "bookSourceType": 0, "bookSourceUrl": "https://www.mowan.lol", "customOrder": 83, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "<js>\nfunction styles(so) {\n    var today = new Date();\n    var dateT = today.getFullYear()\n        + '-'\n        + (today.getMonth() + 1)\n        + '-'\n        + today.getDate()\n        + '_discover_tabs';\n\n    var url = Api('/api/discover/tabs');\n    var res = null;\n    var cacheData = '';\n    var sourceItem = null;\n    var result = [];\n    var tab;\n    var count = 0;\n    var i;\n    var u;\n\n    try {\n        cacheData = cache.get(dateT)+\"1\";\n\n        if (cacheData) {\n            try {\n                res = JSON.parse(cacheData);\n            } catch (e) {\n                res = null;\n            }\n        }\n\n        if (!res) {\n            res = JSON.parse(java.ajax(url));\n\n            if (res && res.code == 0) {\n                cache.put(dateT, JSON.stringify(res));\n            }\n        }\n    } catch (e) {\n        return [{\n            title: '数据加载失败，请刷新后重试',\n            url: '',\n            style: {\n                layout_flexGrow: 1,\n                layout_flexBasisPercent: 1\n            }\n        }];\n    }\n\n    if (!res || res.code != 0 || !res.data || !res.data.sources) {\n        return [{\n            title: '请先登陆，登陆后刷新发现页即可',\n            url: '',\n            style: {\n                layout_flexGrow: 1,\n                layout_flexBasisPercent: 1\n            }\n        }];\n    }\n\n    for (i = 0; i < res.data.sources.length; i++) {\n        if (res.data.sources[i] && res.data.sources[i].name == so) {\n            sourceItem = res.data.sources[i];\n            break;\n        }\n    }\n\n    if (!sourceItem || !sourceItem.tabs || sourceItem.tabs.length == 0) {\n        return [{\n            title: '暂无' + (so || '') + '发现内容',\n            url: '',\n            style: {\n                layout_flexGrow: 1,\n                layout_flexBasisPercent: 1\n            }\n        }];\n    }\n\n    for (i = 0; i < sourceItem.tabs.length; i++) {\n        tab = sourceItem.tabs[i];\n\n        if (!tab) {\n            continue;\n        }\n\n        if (tab.section) {\n            if (count > 0) {\n                while (count < 3) {\n                    result.push({\n                        title: '--',\n                        url: '',\n                        style: {\n                            layout_flexGrow: 1,\n                            layout_flexBasisPercent: 0.25\n                        }\n                    });\n                    count++;\n                }\n            }\n\n            result.push({\n                title: tab.title || '',\n                url: '',\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 1\n                }\n            });\n\n            count = 0;\n            continue;\n        }\n\n        u = '/api/discover/content?source='\n            + encodeURIComponent(sourceItem.source || '')\n            + '&tab='\n            + encodeURIComponent(tab.key || '')\n            + '&page={{page}}&page_size=12';\n\n        result.push({\n            title: tab.title || '',\n            url: Api(u),\n            style: {\n                layout_flexGrow: 1,\n                layout_flexBasisPercent: 0.25\n            }\n        });\n\n        count++;\n\n        if (count >= 3) {\n            count = 0;\n        }\n    }\n\n    if (count > 0) {\n        while (count < 3) {\n            result.push({\n                title: '--',\n                url: '',\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.25\n                }\n            });\n\n            count++;\n        }\n    }\n\n    return result;\n}\n\nvar so = cache.get('sources') || '起点小说';\n\nvar s = [\n    create(\n        \"请选择平台\",\n        [\"番茄小说\", \"七猫小说\", \"书旗小说\", \"塔读小说\",\"红烛故事\",\"西瓜小说\",\"轻小说\",\"星星短剧\",\"依依短剧\",\"起点小说\"],\n        so,\n        \"sources\",\n        1\n    )\n];\n\n\n\nJSON.stringify(s.concat(styles(so)), null, 2);\n</js>", "jsLib": "var mw = \"https://www.mowan.lol\";\n\nfunction getCookie(k) {\n    var java = this.java;\n    var cookie = this.cookie;\n    var cookieValue = String(cookie.getCookie(mw)) || String(java.getCookie(mw));\n    var parts = cookieValue.split(\";\");\n    for (var i = 0; i < parts.length; i++) {\n        var part = parts[i].trim();\n        var idx = part.indexOf(k + \"=\");\n        if (idx === 0) {\n            return part.substring(k.length + 1);\n        }\n    }\n    return \"\";\n}\n\nfunction Api(url, method) {\n    method = method || 'GET';\n    var java = this.java;\n    var XDeviceID = this.getCookie('X-Device-ID');\n    var Authorization = this.getCookie('Authorization');\n    if (typeof Authorization === 'string') {\n        Authorization = Authorization.replace(\"%20\", \" \");\n    } else {\n        Authorization = String(Authorization).replace(\"%20\", \" \");\n    }\n    var options = {\n        method: method,\n        headers: JSON.stringify({\n            'Authorization': Authorization,\n            'X-Device-ID': XDeviceID,\n            'Content-Type': 'application/json',\n            'User-Agent': 'yuedu_app',\n            'Referer': mw\n        })\n    };\n    return mw + url + ',' + JSON.stringify(options);\n}\n\nfunction showPara(url) {\n    var java = this.java;\n    var cache = this.cache;\n    var date = new Date().toLocaleDateString();\n    var cacheKey = date + \"dp\";\n    var htmlContent = cache.get(cacheKey);\n    if (!htmlContent || String(htmlContent).indexOf(\"id=\") === -1) {\n        htmlContent = java.ajax(url);\n        cache.put(cacheKey, htmlContent);\n    }\n    var browserConfig = {\n        \"expandedCornersRadius\": 20,\n        \"dismissOnTouchOutside\": true,\n        \"isDraggable\": true,\n        \"shouldDimBackground\": true,\n        \"backgroundDimAmount\": 0.5,\n        \"hardwareAccelerated\": true,\n        \"isNestedScrollingEnabled\": true,\n        \"isGestureInsetBottomIgnored\": true,\n        \"setFitToContents\": true,\n        \"isHideable\": true,\n        \"heightPercentage\": 0.8\n    };\n    java.showBrowser(url, htmlContent, \"window.java=java;\", JSON.stringify(browserConfig));\n}\n\nfunction createBubble(number, url, bubble) {\n    var num = number > 99 ? \"99+\" : number.toString();\n    bubble = bubble.replace('$num', num);\n    var encodedBubble = this.java.base64Encode(bubble);\n    encodedBubble = 'data:image/svg+xml;base64,' + encodedBubble + ',{\"click\":\"showPara(\\'' + (mw + url) + '\\' )\",\"style\":\"text\"}';\n    return '<img src=\"' + encodedBubble + '\">';\n}\n\nfunction showChapter(url) {\n    var java = this.java;\n    var cache = this.cache;\n    var date = new Date().toLocaleDateString();\n    var cacheKey = date + \"end\";\n    var htmlContent = cache.get(cacheKey);\n    if (!htmlContent || String(htmlContent).indexOf(\"id=\") === -1) {\n        htmlContent = java.ajax(url);\n        cache.put(cacheKey, htmlContent);\n    }\n    var browserConfig = {\n        \"expandedCornersRadius\": 20,\n        \"dismissOnTouchOutside\": true,\n        \"isDraggable\": true,\n        \"shouldDimBackground\": true,\n        \"backgroundDimAmount\": 0.5,\n        \"hardwareAccelerated\": true,\n        \"isNestedScrollingEnabled\": true,\n        \"isGestureInsetBottomIgnored\": true,\n        \"setFitToContents\": true,\n        \"isHideable\": true,\n        \"heightPercentage\": 0.8\n    };\n    java.showBrowser(url, htmlContent, \"window.java=java;\", JSON.stringify(browserConfig));\n}\n\nfunction createChapter(url, svg) {\n    var encodedSvg = this.java.base64Encode(svg);\n    encodedSvg = 'data:image/svg+xml;base64,' + encodedSvg + ',{\"click\":\"showChapter(\\'' + (mw + url) + '\\' )\",\"style\":\"FULL\"}';\n    return '<img src=\"' + encodedSvg + '\">';\n}\n\nfunction show(k, v) {\n    var java = this.java;\n    var cache = this.cache;\n    cache.put(v, k);\n    java.refreshExplore();\n}\n\nfunction create(k, chars, defaultV, v, size) {\n    return {\n        title: k,\n        type: \"select\",\n        chars: chars,\n        default: defaultV,\n        action: 'show(infoMap[\\'' + k + '\\'],\\'' + v + '\\')',\n        style: {\n            layout_flexGrow: 1,\n            layout_flexBasisPercent: size\n        }\n    };\n}\n\nfunction formatDate(input, fmt) {\n    if (fmt === undefined) fmt = 'YYYY-MM-DD HH:mm:ss';\n    var date = (input instanceof Date) ? input : new Date(input);\n    if (isNaN(date.getTime())) return '';\n\n    function pad(n) {\n        var s = String(n);\n        return s.length < 2 ? '0' + s : s;\n    }\n\n    var map = {\n        YYYY: date.getFullYear(),\n        MM: pad(date.getMonth() + 1),\n        DD: pad(date.getDate()),\n        HH: pad(date.getHours()),\n        mm: pad(date.getMinutes()),\n        ss: pad(date.getSeconds())\n    };\n\n    return fmt.replace(/YYYY|MM|DD|HH|mm|ss/g, function(m) {\n        return map[m];\n    });\n}\n\nfunction Env() {\n    var java = this.java;\n    var source = this.source;\n    try {\n        java.qread();\n        return 4;\n    } catch (e) {}\n    try {\n        if (typeof java.reLoginView === 'function') return 1;\n        new Packages.io.legato.kazusa.utils.TimeoutCancellationException('');\n        return 1;\n    } catch (e) {}\n    try {\n        java.deviceID();\n        return 3;\n    } catch (e) {}\n    if (typeof source.loginUi === 'function') return 2;\n    return 1;\n}\n\nfunction Content(res) {\n    var evn = this.Env();\n    var content = \"\";\n    var text = res.data.paragraphs;\n    if (!text) {\n        return res.data.msg || \"暂无数据，请稍后再试~\";\n    }\n    var enabledPara = res.data.comment.enabled;\n    var bubble = enabledPara ? res.data.comment.bubble.svg : \"\";\n    var enabledChapter = res.data.comment.chapter_enabled;\n    var chapterSvgs = enabledChapter ? res.data.comment.chapter_card.svg : \"\";\n\n    var contents = [];\n    for (var i = 0; i < text.length; i++) {\n        var item = text[i];\n        var html = \"\";\n        if (item.comment_count > 0 && enabledPara && bubble != '' && evn == 1) {\n            html = '<p>' + item.text + this.createBubble(item.comment_count, item.comment_url, bubble) + '</p>';\n        } else if (item.comment_count > 0 && enabledPara && bubble != '' && evn == 3) {\n            html = '<div rs-native>' + item.text + '<comment count=\"' + item.comment_count + '\" onPress=\"java.showReadingBrowser(\\'' + (mw + item.comment_url) + '\\',\\'段评\\')\"></div>';\n        } else {\n            html = item.text;\n        }\n        if (item.image) {\n            if (typeof item.image === 'string') {\n                html += '<img src=\"' + item.image + '\">';\n            } else if (Array.isArray(item.image)) {\n                for (var j = 0; j < item.image.length; j++) {\n                    html += '<img src=\"' + item.image[j] + '\">';\n                }\n            }\n        }\n\n        contents.push(html);\n    }\n\n    content = contents.join(\"\\n\");\n\n    if (enabledChapter && chapterSvgs != \"\" && evn == 1) {\n        var chapterUrl = res.data.comment.chapter_card.url;\n        content += '\\n' + this.createChapter(chapterUrl, chapterSvgs);\n    } else if (enabledChapter && chapterSvgs != \"\" && evn == 3) {\n        var chapterUrl = res.data.comment.chapter_card.url;\n        var enChapterSvgs = java.base64Encode(chapterSvgs);\n        content += '<div rs-native><img onPress=\"java.showReadingBrowser(\\'' + (mw + chapterUrl) + '\\',\\'本章说\\')\" src=\"data:image/svg+xml;base64,' + enChapterSvgs + '\"></div>';\n    }\n\n    return content;\n}", "lastUpdateTime": "1790354671081", "loginCheckJs": "", "loginUrl": "https://www.mowan.lol/user/me?app=yuedu&version=26.9.22", "respondTime": 180000, "ruleBookInfo": {"author": "$.data.author", "init": "<js>\nvar url = java.hexDecodeToString(result);\njava.ajax(Api(url));\n</js>", "intro": "<js>\nresult = JSON.parse(result);\n\nvar typeM = {\n\t\"novel\" : \"小说\",\n\t\"audio\" : \"听书\",\n\t\"image\" : \"漫画\",\n\t\"video\" : \"短剧\"\n\t};\n\nvar bookSource = result.data.source;\nvar latest_chapter = result.data.latest_chapter;\nvar latest_update_time = result.data.latest_update_time;\nvar description = result.data.description;\nvar sourceType = result.data.type;\n\n[\n  '  源站：' + bookSource,\n  latest_chapter && ('最新章节：' + latest_chapter),\n  latest_update_time && ('更新时间：' + formatDate(latest_update_time)),\n  '类型：' + (typeM[sourceType] || '小说'),\n  \"\\n\",\n  description\n].filter(Boolean).join('\\n')\n</js>", "kind": "{{$.data.category}},{{$.data.status}}", "name": "$.data.name", "tocUrl": "/api/book/chapters?source={{$.data.source}}&book_id={{$.data.id}}&type={{$.data.type}}\n<js>\n'data:;base64,' + java.base64Encode(result) + ',{\"type\":\"mw\"}'\n</js>"}, "ruleContent": {"content": "<js>\nvar url = java.hexDecodeToString(result);\njava.log(url);\nresult = java.ajax(Api(url));\nresult = JSON.parse(result);\n\nvar content;\nvar code = result.code;\nvar msg = result.message;\n\nvar sourceType = url.match(/type=([^&]+)/)[1];\n\nif (code != 0) {\n  content = msg;\n} else if (sourceType && sourceType==\"novel\") {\n  content = Content(result);\n} else {\n\tcontent = result.data.content;\n}\ncontent\n</js>"}, "ruleExplore": [], "ruleReview": [], "ruleSearch": {"author": "author", "bookList": "<js>\nresult = JSON.parse(result);\nif (result.code!=0) {\n    result = {\"data\":{\"items\":[\n            {\n                \"name\": \"❗❗❗当前未登录状态\",\n                \"author\": \"请登录后使用\",\n                \"latestChapterTitle\":\"请注册账号并登陆\",\n                \"cover\": \"http://fc3tn.baidu.com/it/u=1573211303,3438572022&fm=203&src=787&fc_m=cvican\",\n                \"description\":result.message,\n                \"id\":\"\",\n                \"source\":\"\"\n            }\n        ]}}\n}\nJSON.stringify(result)\n</js>\n$.data.items", "bookUrl": "/api/book/detail?source={{$.source}}&book_id={{$.id}}\n<js>\n'data:;base64,' + java.base64Encode(result) + ',{\"type\":\"mw\"}'\n</js>", "checkKeyWord": "我的", "coverUrl": "cover", "intro": "description", "kind": "{{$.category}},{{$.status}}", "lastChapter": "源站：{{$.source}}", "name": "name"}, "ruleToc": {"chapterList": "<js>\nvar url = java.hexDecodeToString(result);\nvar resStr = java.ajax(Api(url));\nvar res = JSON.parse(resStr);\nvar sourceType = url.match(/type=([^&]+)/)[1];\njava.put('sourceType',sourceType);\n\nif (res.code != 0) {\n  var parts = book.bookUrl.split(',')[1];\n  var decodedUrl = java.base64Decode(parts);\n  resStr = java.ajax(Api(decodedUrl.replace('book/detail', 'book/chapters')));\n}\n\nvar typeMap = {\n    \"novel\": {\n        ios: 0,\n        default: 8\n    },\n    \"audio\": {\n        ios: 1,\n        default: 32\n    },\n    \"image\": {\n        ios: 2,\n        default: 64\n    },\n    \"video\": {\n        ios: 3,\n        default: 4\n    }\n};\nvar currentType = typeMap[sourceType] || typeMap[\"novel\"];\nif (Env==3) {\nbook.type = currentType.ios;\n} else {\nbook.type = currentType.default;\n}\n\nresStr;\n</js>\n$.data.chapters", "chapterName": "$.name", "chapterUrl": "/api/chapter/content?source={{$.source}}&chapter_id={{$.id}}&type={{java.get('sourceType')}}\n<js>\n'data:;base64,' + java.base64Encode(result) + ',{\"type\":\"mw\"}'\n</js>", "updateTime": "$.update_time\n<js>\nformatDate(result)\n</js>"}, "searchUrl": "<js>Api('/api/search?keyword=' + key + '&page=' + page + '&page_size=20')</js>", "weight": 0},{"bookSourceComment": "原始书源：https://www.yckceo.com/yuedu/shuyuan/content/id/7036.html\n原作者与历史修订：zhbyjm7783、遇知、聆听月与悦；原页面分享者：shirenla。\n\n2026-09-25 搜索目录修复 V4\n修复可搜索到书籍但加载目录失败的问题：根据搜索结果的 data-bid 生成独立目录地址，避免空书籍链接回退到搜索页；更新目录提取规则；正文排除评论数字。\n使用者已在 Android 阅读中确认本次修复可用。测试书《来日有信》（千山茶客），验证时共41章；另检查了搜索结果、目录章节链接与首章公开正文。\n\n使用说明：保持 CookieJar 开启；搜索为空时，在书源菜单中点击登录，完成起点网站验证后重试。旧书籍仍报错时，切换到本书源或重新搜索添加。发现页未启用；付费章节未验证。", "bookSourceGroup": "起点|目录修复", "bookSourceName": "起点·搜索目录修复V4", "bookSourceType": 0, "bookSourceUrl": "https://www.qidian.com/#on-toc-v2", "customButton": false, "customOrder": 3, "enabled": true, "enabledCookieJar": true, "enabledExplore": false, "eventListener": false, "lastUpdateTime": "1790317926015", "loginUrl": "https://www.qidian.com/", "respondTime": 180192, "ruleBookInfo": {"name": "@css:meta[property=\"og:novel:book_name\"]@content", "author": "@css:meta[property=\"og:novel:author\"]@content", "intro": "@css:meta[property=\"og:description\"]@content", "kind": "@css:meta[property=\"og:novel:category\"]@content", "lastChapter": "@css:meta[property=\"og:novel:latest_chapter_name\"]@content", "coverUrl": "@css:meta[property=\"og:image\"]@content", "tocUrl": "@css:meta[property=\"og:novel:read_url\"]@content@js:\nvar u = String(result).trim();\nif (!/^https?:\\/\\/www\\.qidian\\.com\\/book\\/\\d+\\/catalog\\//.test(u)) throw new Error(\"V4未进入独立目录页；页面标题=\" + java.getString(\"tag.title@text\"));\nu + \",{\\\"webView\\\":true,\\\"webJs\\\":\\\"document.querySelector(\\\\\\\"a[href*=\\\\\\\\\\\\\\\"/chapter/\\\\\\\\\\\\\\\"][title*=\\\\\\\\\\\\\\\"首发时间\\\\\\\\\\\\\\\"]\\\\\\\") ? document.documentElement.outerHTML : \\\\\\\"\\\\\\\"\\\"}\";"}, "ruleContent": {"content": "@css:main.content .content-text@text", "webJs": "document.querySelector(\"main.content .content-text\") ? document.documentElement.outerHTML : \"\""}, "ruleSearch": {"bookList": "@css:li.res-book-item[data-bid]", "name": "@css:.book-info-title a@text", "author": "@css:.author a.name@text", "bookUrl": "data-bid@js:\nvar id = String(result).trim();\nif (!/^\\d+$/.test(id)) throw new Error(\"V4搜索结果缺少data-bid书籍编号\");\n\"https://www.qidian.com/book/\" + id + \"/catalog/\" + \",{\\\"webView\\\":true,\\\"webJs\\\":\\\"document.querySelector(\\\\\\\"a[href*=\\\\\\\\\\\\\\\"/chapter/\\\\\\\\\\\\\\\"][title*=\\\\\\\\\\\\\\\"首发时间\\\\\\\\\\\\\\\"]\\\\\\\") ? document.documentElement.outerHTML : \\\\\\\"\\\\\\\"\\\"}\";", "coverUrl": "@css:.book-img-box img@src", "intro": "@css:.intro@text", "kind": "@css:.author a:not(.name), .author span@text", "lastChapter": "@css:.update a@text", "wordCount": "@css:.total p:first-child span@text", "checkKeyWord": "来日有信"}, "ruleToc": {"chapterList": "@css:a[href*=\"/chapter/\"][title*=\"首发时间\"]\n@js:\nvar n = typeof result.size === \"function\" ? result.size() : result.length;\nif (!n) throw new Error(\"V4目录为空；页面标题=\" + java.getString(\"tag.title@text\"));\nresult;", "chapterName": "text", "chapterUrl": "href@js:\nvar u=String(result).trim();\nif(u.indexOf(\"//\")===0) u=\"https:\"+u;\nif(!/^https:\\/\\/www\\.qidian\\.com\\/chapter\\/\\d+\\/\\d+\\//.test(u)) throw new Error(\"V4章节链接格式异常\");\nu + ',{\"webView\":true}';", "updateTime": "title##.*首发时间：| 章节字数：.*"}, "searchUrl": "https://www.qidian.com/so/{{key}}.html?page={{page}},{\n  \"webView\": true\n}", "weight": 0},{"bookSourceUrl": "https://www.kelexs.com", "bookSourceName": "可乐小说", "bookSourceGroup": "网络小说", "bookSourceType": 0, "bookSourceComment": "可乐小说书源（基于实测接口规则组装，导入后请实测验证）", "enabled": true, "enabledExplore": false, "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36\"\n}", "loginUrl": "", "searchUrl": "@js:{\n  let token = '4ee2b788983dd1c95463d862eb40795b';\n  return {\n    method: 'POST',\n    url: 'https://www.kelexs.com/?action=search',\n    body: 'keyword=' + encodeURIComponent(key) + '&_t=' + token + '&_ts=&_s='\n  }\n}", "ruleSearch": {"bookList": "class.book-card", "name": "class.book-card__title@text", "author": "class.book-card__meta@text@js:{\n  let m = result.match(/作者：(.+?)[分类]/);\n  return m ? m[1].trim() : ''\n}", "kind": "class.book-card__meta@text@js:{\n  let m = result.match(/分类：(.+?)$/);\n  return m ? m[1].replace(/[连载中|完结|已完结]/,'').trim() : ''\n}", "coverUrl": "class.book-card__cover@tag.img@src", "intro": "class.book-card__desc@text", "lastChapter": "class.book-card__update@text", "bookUrl": "@js:{\n  let onclick = java.toString(result);\n  let m = onclick.match(/t=([^&'\"]+)/);\n  if (!m) return '';\n  let b64 = m[1].replace(/%3D/g,'=').replace(/\\s/g,'');\n  let bytes = java.util.Base64.getDecoder().decode(b64);\n  return new java.lang.String(bytes, 'UTF-8');\n}"}, "ruleBookInfo": {"name": "meta[property='og:novel:book_name']@content", "author": "meta[property='og:novel:author']@content", "coverUrl": "meta[property='og:image']@content", "intro": "meta[name='description']@content", "kind": "meta[property='og:novel:category']@content", "lastChapter": "meta[property='og:novel:latest_chapter_name']@content"}, "ruleToc": {"chapterList": "class.chapList@tag.li", "chapterName": "tag.a@text", "chapterUrl": "tag.a@href"}, "ruleContent": {"content": "class.content@text", "nextContentUrl": ""}, "lastUpdateTime": "1790289588362"},{"bookSourceComment": "by 艳阳\nwarning:该书源仅支持精准搜索！", "bookSourceGroup": "通常书源", "bookSourceName": "伪速读谷²", "bookSourceType": 0, "bookSourceUrl": "https://www.sudugu.cc", "bookUrlPattern": "https?://www\\.sudugu\\.cc/\\d+(/.*)?", "customButton": false, "customOrder": 5, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "玄幻小说::/fenlei/1/{{page}}/\n仙侠小说::/fenlei/2/{{page}}/\n都市小说::/fenlei/3/{{page}}/\n历史小说::/fenlei/4/{{page}}/\n军事小说::/fenlei/5/{{page}}/\n科幻小说::/fenlei/6/{{page}}/\n言情小说::/fenlei/7/{{page}}/\n轻小说::/fenlei/8/{{page}}/\n诸天无限::/fenlei/9/{{page}}/\n游戏小说::/fenlei/10/{{page}}/\n奇幻小说::/fenlei/11/{{page}}/\n悬疑小说::/fenlei/12/{{page}}/\n体育小说::/fenlei/13/{{page}}/\n官场小说::/fenlei/14/{{page}}/\n武侠小说::/fenlei/15/{{page}}/\n现实小说::/fenlei/16/{{page}}/\n完结小说::/quanben/{{page}}.html\n最新更新::/top/lastupdate/{{page}}.html", "header": "{\"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\"}", "lastUpdateTime": "1790259463642", "loginUrl": "", "respondTime": 180000, "ruleBookInfo": {"author": "@css:.itemtxt p:eq(1) a@text##作者：", "coverUrl": "@css:.item a img@src", "intro": "class.des.0@text", "kind": "p@span@text", "lastChapter": "@css:.itemtxt ul li:eq(0) a@text", "name": "@css:.itemtxt h1 a@text", "tocUrl": "", "wordCount": "@css:.itemtxt h1 i script@html##\\D"}, "ruleContent": {"content": "@css:.con@textNodes", "nextContentUrl": "@css:.prenext span:eq(1) a@href", "sourceRegex": "[^<]*首发更新站点。<br />\\s*", "webJs": ""}, "ruleExplore": {"author": "@css:.itemtxt p:eq(1) a@text##作者：", "bookList": "@css:.item", "bookUrl": "@css:.itemtxt h3 a@href", "coverUrl": "@css:.item a img@src", "intro": "", "kind": "p@span@text", "lastChapter": "@css:.itemtxt ul li:eq(0) a@text", "name": "@css:.itemtxt h3 a@text"}, "ruleSearch": {"author": "@css:.itemtxt ul li:eq(0)@text##作者：", "bookList": "@css:.item", "bookUrl": "@css:.itemtxt h3 a@href", "checkKeyWord": "没钱修什么仙", "coverUrl": "", "intro": "@css:.itemtxt p@text##简介：", "kind": "p@span@text", "lastChapter": "@css:.itemtxt ul li:eq(2) a@text", "name": "@css:.itemtxt h3 a@text", "wordCount": ""}, "ruleToc": {"chapterList": "@css:#list ul li", "chapterName": "@css:a@text", "chapterUrl": "@css:a@href", "isVip": "", "nextTocUrl": "@css:#pages a.gr@href", "updateTime": ""}, "searchUrl": "/modules/article/search.php,{\"method\":\"POST\",\"body\":\"searchkey={{key}}&searchtype=articlename&action=login\"}", "weight": 0},{"bookSourceGroup": "搜索", "enabled": true, "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1\",\n  \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\n  \"Accept-Language\": \"zh-CN,zh;q=0.9\"\n}", "ruleExplore": {"intro": "p.m-book-description@text", "kind": "p.m-book-meta@text##.*?·\\s*", "bookUrl": "a@href##^(/.*)##https://m.libahao2.com$1", "bookList": "article.m-catalog-item a.m-book-row, .m-cover-shelf a.m-cover-book", "author": "p.m-book-meta@text##·.*||p@text", "lastChapter": "a.m-catalog-chapter span:nth-child(2)@text", "name": "h3.m-book-title@text||h3@text", "coverUrl": "img.m-cover@src||img@src"}, "bookSourceType": 0, "ruleToc": {"chapterUrl": "a@href", "chapterName": "a@text", "chapterList": "ol li"}, "exploreUrl": "[\n  {\"title\":\"玄幻魔法\",\"url\":\"/xuanhuan/{{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"武侠修真\",\"url\":\"/xiuzhen/{{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"都市言情\",\"url\":\"/dushi/{{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"历史军事\",\"url\":\"/lishi/{{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"游戏竞技\",\"url\":\"/wangyou/{{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"科幻灵异\",\"url\":\"/kehuan/{{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"女生言情\",\"url\":\"/nvpin/{{page}}\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"其他小说\",\"url\":\"/qita/{{page}}\",\"style\":{\"layout_flexGrow\":1}}\n]", "customOrder": -1, "searchUrl": "/sou?wd={{key}}", "ruleSearch": {"intro": "p.m-book-description@text", "kind": "p.m-book-meta@text##.*?·\\s*||span.m-pill@text", "bookUrl": "a@href##^(/.*)##https://m.libahao2.com$1", "bookList": "a.m-book-row", "author": "p.m-book-meta@text##·.*", "name": "h3.m-book-title@text", "coverUrl": "img.m-cover@src"}, "bookSourceName": "篱笆好文学", "bookSourceUrl": "https://m.libahao2.com", "ruleContent": {"content": "#chapterText@p@html", "nextContentUrl": "text.下一页@href"}, "enabledExplore": true, "lastUpdateTime": "1790223077187"},{"bookSourceComment": "速读谷 www.sudugu.cc 书源。正文直接在章节页HTML的div.con中（无token校验、无广告），但章节分页（_2.html），用nextContentUrl按文字精确匹配'下一页'拼接（末页是'下一章'不可误拼）。搜索单结果时302直达书页，bookList用JS兼容。创建于2026-09-04。", "bookSourceGroup": "", "bookSourceName": "速读谷(sudugu.cc)20260904", "bookSourceType": 0, "bookSourceUrl": "https://www.sudugu.cc", "checkKeyWord": "夜无疆", "enabled": true, "enabledCookieJar": false, "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36\"}", "lastUpdateTime": "1790135789949", "respondTime": 180000, "searchUrl": "https://www.sudugu.cc/modules/article/search.php,{\"method\": \"POST\", \"body\": \"searchkey={{key}}&action=login&searchtype=articlename\"}", "ruleSearch": {"bookList": "<js>var d = [];\nvar doc = org.jsoup.Jsoup.parse(result, baseUrl);\nvar items = doc.select('.item.clear');\nif (items.size() > 0) {\n    d = items;\n} else if (doc.select('#list li a').size() > 0) {\n    var name = doc.select('.itemtxt h1 a').text();\n    if (name) {\n        var author = doc.select('.itemtxt p a').first().text().replace('作者：', '');\n        var last = doc.select('.itemtxt ul li a').first().text();\n        var frag = '<div class=\"item clear\"><div class=\"itemtxt\"><h3><a href=\"' + baseUrl + '\">' + name + '</a></h3><ul><li>作者：' + author + '</li><li>阅读量：0</li><li>更新：<a>' + last + '</a></li></ul></div></div>';\n        d = org.jsoup.Jsoup.parseBodyFragment(frag).select('.item.clear');\n    }\n}\nd;</js>", "name": "tag.h3@tag.a@text", "bookUrl": "tag.h3@tag.a@href", "author": "tag.li.0@text##作者：", "lastChapter": "tag.li.2@tag.a@text"}, "ruleBookInfo": {"name": "class.itemtxt@tag.h1@tag.a@text", "author": "class.itemtxt@tag.p.1@tag.a@text##作者：", "kind": "class.itemtxt@tag.p.0@tag.span@text", "coverUrl": "class.item@tag.img@src", "intro": "class.des@text", "lastChapter": "class.itemtxt@tag.ul.0@tag.li.0@tag.a@text", "tocUrl": ""}, "ruleToc": {"chapterList": "id.list@tag.li@tag.a", "chapterName": "text", "chapterUrl": "href"}, "ruleContent": {"content": "@css:div.con@textNodes", "nextContentUrl": "@css:.prenext span a:contains(下一页)@href"}, "weight": 0},{"bookSourceComment": "抖音小说 www.douyinxs.com 书源（笔趣阁架构）。正文 article#content 直出无广告，但章节分页(_2.html)且目录分页(_2/)；目录每页 dt 前重复「最新10章」块，用 dt ~ dd 兄弟选择器排除。搜索 POST /search/，120秒限流1次(IP级，与PC同公网IP共享额度)——搜索失败等2分钟再试；关键词过短(约<4汉字)报「关键字最少10个字符」。创建于2026-09-19。", "bookSourceGroup": "", "bookSourceName": "抖音小说(douyinxs.com)20260919", "bookSourceType": 0, "bookSourceUrl": "https://www.douyinxs.com", "checkKeyWord": "人在洪武", "enabled": true, "enabledCookieJar": false, "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36\"}", "lastUpdateTime": "1790135818832", "respondTime": 180000, "searchUrl": "https://www.douyinxs.com/search/,{\"method\": \"POST\", \"body\": \"searchkey={{key}}&submit=\"}", "ruleSearch": {"bookList": "@css:.novelslist2 ul li:has(a)", "name": "@css:.s2 a@text", "bookUrl": "@css:.s2 a@href", "author": "@css:.s4@text", "kind": "@css:.s1@text##\\[|\\]", "lastChapter": "@css:.s3 a@text"}, "ruleBookInfo": {"name": "@css:meta[property='og:novel:book_name']@content", "author": "@css:meta[property='og:novel:author']@content", "kind": "@css:meta[property='og:novel:category']@content", "coverUrl": "@css:meta[property='og:image']@content", "intro": "@css:meta[property='og:description']@content", "lastChapter": "@css:meta[property='og:novel:lastest_chapter_name']@content", "tocUrl": ""}, "ruleToc": {"chapterList": "@css:#list dt:contains(正文) ~ dd a", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": "@css:.index-container a:contains(下一页)@href"}, "ruleContent": {"content": "@css:#content p@text", "nextContentUrl": "@css:a#next:contains(下一页)@href"}, "weight": 0},{"bookSourceComment": "得奇小说网 www.deqixs.cc 书源。正文接口带动态token校验：先请求chapter.js.php拿token（有时效，现取现用），再带Referer+XHR头+完整Chrome UA请求ajax2.php，无需Cookie。单结果搜索302跳转书页已兼容。创建于2026-09-04。", "bookSourceGroup": "", "bookSourceName": "得奇小说网(deqixs.cc)20260904", "bookSourceType": 0, "bookSourceUrl": "https://www.deqixs.cc", "checkKeyWord": "夜无疆", "enabled": true, "enabledCookieJar": false, "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36\"}", "lastUpdateTime": "1790135853085", "respondTime": 180000, "searchUrl": "https://www.deqixs.cc/modules/article/search.php,{\"method\": \"POST\", \"body\": \"searchkey={{key}}&action=login&searchtype=all\"}", "ruleSearch": {"bookList": "<js>var d = [];\nvar doc = org.jsoup.Jsoup.parse(result, baseUrl);\nif (doc.select('.bookbox').size() > 0) {\n    d = doc.select('.bookbox');\n} else {\n    var name = doc.select('h1.booktitle').text();\n    if (name) {\n        var url = doc.select('link[rel=canonical]').attr('href') || doc.select('meta[property=og:novel:read_url]').attr('content');\n        var author = doc.select('.booktag a').first().text();\n        var last = doc.select('.bookchapter').text();\n        var frag = '<div class=\"bookbox\"><h4 class=\"bookname\"><a href=\"' + url + '\">' + name + '</a></h4><div class=\"author\">作者：' + author + '</div><div class=\"cat\"><a>' + last + '</a></div></div>';\n        d = org.jsoup.Jsoup.parseBodyFragment(frag).select('.bookbox');\n    }\n}\nd;</js>", "name": "class.bookname@tag.a@text", "bookUrl": "class.bookname@tag.a@href", "author": "class.author.0@text##作者：", "lastChapter": "class.cat@tag.a@text"}, "ruleBookInfo": {"name": "class.booktitle@text", "author": "class.booktag@tag.a@text", "coverUrl": "class.bookcover@tag.img@src", "intro": "class.bookintro@text", "kind": "", "lastChapter": "class.bookchapter@text", "tocUrl": ""}, "ruleToc": {"chapterList": "id.list-chapterAll@tag.dd@tag.a", "chapterName": "text", "chapterUrl": "href"}, "ruleContent": {"content": "<js>var m = String(baseUrl).match(/\\/books\\/(\\d+)\\/(\\d+)\\.html/);\nif (!m) {\n    result = '章节地址解析失败: ' + baseUrl;\n} else {\n    var aid = m[1];\n    var cid = m[2];\n    var ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36';\n    var opt = ',{\"headers\":{\"User-Agent\":\"' + ua + '\",\"Referer\":\"' + baseUrl + '\",\"X-Requested-With\":\"XMLHttpRequest\"}}';\n    var tokenJs = String(java.ajax('https://www.deqixs.cc/scripts/chapter.js.php?aid=' + aid + '&cid=' + cid + '&referrer=' + baseUrl + opt) || '');\n    var t = tokenJs.match(/chapterToken\\s*=\\s*'([^']+)'/);\n    var s = tokenJs.match(/timestamp\\s*=\\s*([0-9]+)/);\n    var n = tokenJs.match(/nonce\\s*=\\s*'([^']+)'/);\n    if (!t || !s || !n) {\n        result = '获取token失败，请重试';\n    } else {\n        var apiUrl = 'https://www.deqixs.cc/modules/article/ajax2.php?aid=' + aid + '&cid=' + cid + '&token=' + t[1] + '&timestamp=' + s[1] + '&nonce=' + n[1] + opt;\n        var res = String(java.ajax(apiUrl) || '');\n        var json = null;\n        try { json = JSON.parse(res); } catch (e) {}\n        if (json && json.status == 1 && json.data && json.data.content) {\n            result = json.data.content.replace(/<br\\s*\\/?>/gi, '\\n').replace(/&nbsp;/gi, ' ').replace(/更新不易[\\s\\S]*?(看最新章节|看最新无错章节|最新小说章节|请订阅)[！!]/g, '').replace(/速\\s*读\\s*谷|shudugu\\.org/g, '').replace(/\\n{3,}/g, '\\n\\n').trim();\n        } else {\n            result = '获取正文失败: ' + (json && json.message ? json.message : res.substring(0, 100));\n        }\n    }\n}</js>"}, "weight": 0},{"bookSourceName": "思路客", "bookSourceUrl": "https://www.szndz.com", "bookSourceGroup": "自制", "bookSourceType": 0, "enabled": true, "enabledExplore": false, "searchUrl": "@js:\nvar b = 'https://www.szndz.com';\nvar kw = String(key);\nvar sp = b + '/user/search.html?q=' + java.encodeURI(kw);\nvar h = '' + java.ajax(sp);\nvar names = ['vw','abw','ru','jrt','van','fw','cwl','gpr','uyoo','tz','euu','tsn','eju','um','fp','dvm','jpk','deblkx','ht','azy','sna','wqx','fpp','rup','jwj','bgt','qp','yf','cw','wq','sign'];\nvar parts = ['q=' + java.encodeURI(kw)];\nfor (var i = 0; i < names.length; i++) {\n var n = names[i];\n var mk = 'var ' + n;\n var v = '';\n var from = 0;\n var i1 = -1;\n while (true) {\n var i0 = h.indexOf(mk, from);\n if (i0 < 0) break;\n var pe = i0 + mk.length;\n while (pe < h.length && (h.charAt(pe) == ' ' || h.charAt(pe) == '\\t')) pe++;\n if (h.charAt(pe) == '=') { i1 = pe; break; }\n from = i0 + 1;\n }\n if (i1 >= 0) {\n var q1 = h.indexOf('\"', i1);\n var q2 = h.indexOf('\"', q1 + 1);\n v = h.substring(q1 + 1, q2);\n }\n if (n == 'bgt' && v.length > 0) v = v.substring(0, v.length - 1);\n parts.push(n + '=' + java.encodeURI(v));\n}\nb + '/api/search,{\"method\":\"POST\",\"body\":\"' + parts.join('&') + '\"}'", "ruleSearch": {"bookList": "$.data.search", "name": "$.book_name", "author": "$.author", "bookUrl": "$.book_list_url", "kind": "$.cate_name", "lastChapter": "$.latest_chapter_name", "coverUrl": ""}, "ruleBookInfo": {"name": "meta[property=\"og:novel:book_name\"]@content", "author": "meta[property=\"og:novel:author\"]@content", "intro": "meta[property=\"og:description\"]@content", "coverUrl": "meta[property=\"og:image\"]@content", "kind": "meta[property=\"og:novel:category\"]@content", "lastChapter": "meta[property=\"og:novel:latest_chapter_name\"]@content"}, "ruleToc": {"chapterList": "#at td.L", "chapterName": "a@text", "chapterUrl": "a@href"}, "ruleContent": {"content": "id.htmlContent@html"}, "lastUpdateTime": "1790128072809"},{"bookSourceName": "鬼吹灯", "bookSourceUrl": "http://www.gdbzkz.com", "bookSourceType": 0, "bookSourceComment": "免登录：阅读、搜索、目录、正文均无需账号；登录仅用于书架收藏/推荐/书签。搜索入口 /s.php?ie=utf-8&q=关键词；详情页与目录页同页；正文尾部固定插入本站域名与“请记住本书首发域名”广告行，已由 replaceRegex 清除；站点正文含繁体变体字（後/於/麽/擡等），已用 java.t2s 转简体。", "enabled": true, "enabledExplore": false, "searchUrl": "/s.php?ie=utf-8&q={{key}}", "ruleSearch": {"bookList": "class.bookbox", "name": "class.bookname@tag.a@text", "author": "class.author@text##^作者：", "kind": "class.cat@text##^分类：", "lastChapter": "class.update@tag.a@text", "bookUrl": "class.bookname@tag.a@href", "coverUrl": "class.bookimg@tag.img@src"}, "ruleBookInfo": {"name": "class.info@tag.h2@text", "author": "class.info@class.small@tag.span.0@text##^作者：", "kind": "class.info@class.small@tag.span.1@text##^分类：", "coverUrl": "class.info@class.cover@tag.img@src", "intro": "class.info@class.intro@text##^简介：|无弹窗推荐地址：\\S*|作者：.*所写的.*转载作品.*", "lastChapter": "class.info@class.small@tag.span.-1@tag.a@text"}, "ruleToc": {"chapterList": "class.listmain@tag.dd@tag.a", "chapterName": "text", "chapterUrl": "href"}, "ruleContent": {"content": "#content@html", "replaceRegex": "@js:var t=''+result;try{t=''+java.t2s(t)}catch(e){}var fb={'後':'后','於':'于','麽':'么','擡':'抬','縱':'纵','閃':'闪','復':'复','隨':'随','內':'内','眾':'众','別':'别','確':'确','號':'号','鬆':'松','隱':'隐','財':'财','儘':'尽','噹':'当','顏':'颜','嘆':'叹','穫':'获','襠':'裆','歷':'历','係':'系','麵':'面','衝':'冲','長':'长','門':'门','風':'风','為':'为','會':'会','這':'这','樣':'样','們':'们','學':'学','過':'过','說':'说','來':'来','裡':'里','對':'对','現':'现','見':'见','開':'开','點':'点'};for(var k in fb){t=t.split(k).join(fb[k])}t=t.replace(/https?:\\/\\/[^\\s\\u3000]+/g,'');t=t.replace(/请记住本书首发域名[^\\n]*/g,'');t=t.replace(/鬼吹灯手机版阅读网址[^\\n]*/g,'');var ls=t.split('\\n');var out=[];for(var i=0;i<ls.length;i++){var s=ls[i].replace(/^[\\s\\u3000\\u00a0]+|[\\s\\u3000\\u00a0]+$/g,'');if(s.length==0){if(out.length>0&&out[out.length-1]!=''){out.push('')}continue}out.push(s)}while(out.length>0&&out[out.length-1]==''){out.pop()}out.join('\\n')", "nextContentUrl": "text.下一章@href"}, "lastUpdateTime": "1790099098372"},{"bookSourceGroup": "漫画书源 🎨", "bookSourceName": "🎨包子漫画", "bookSourceType": 2, "bookSourceUrl": "https://cn.bzmanga.com", "customButton": false, "customOrder": -1, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>\nvar sort = [];\nvar push = function(title, url, type1, type2) {\n    sort.push({\n        title: title,\n        url: url,\n        style: {\n            layout_flexGrow: type1,\n            layout_flexBasisPercent: type2\n        }\n    });\n};\n\nvar typeNames = [\"全部\", \"恋爱\", \"纯爱\", \"古风\", \"异能\", \"悬疑\", \"剧情\", \"科幻\", \"奇幻\", \"玄幻\", \"穿越\", \"冒险\", \"推理\", \"武侠\", \"格斗\", \"战争\", \"热血\", \"搞笑\", \"大女主\", \"都市\", \"总裁\", \"后宫\", \"日常\", \"韩漫\", \"少年\", \"其它\"];\nvar types = [\"all\",\"lianai\",\"chunai\",\"gufeng\",\"yineng\",\"xuanyi\",\"juqing\",\"kehuan\",\"qihuan\",\"xuanhuan\",\"chuanyue\",\"mouxian\",\"tuili\",\"wuxia\",\"gedou\",\"zhanzheng\",\"rexie\",\"gaoxiao\",\"danuzhu\",\"dushi\",\"zongcai\",\"hougong\",\"richang\",\"hanman\",\"shaonian\",\"qita\"];\n\ntypeNames.forEach(function(item, index) {\n    var url = \"https://cn.bzmanga.com/api/bzmhq/amp_comic_list?type=\" + types[index] + \"&region=all&filter=&page={{page}}&limit=36&language=cn&__amp_source_origin=https://cn.bzmanga.com\";\n    push(item, url, 1, 0.25);\n});\nJSON.stringify(sort)\n</js>", "header": "@js:\nJSON.stringify({\n\"Accept-Language\": \"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7\"\n})", "lastUpdateTime": "1790009415533", "respondTime": 70, "ruleBookInfo": {"author": "class.comics-detail__author@text", "coverUrl": "tag.amp-img.0@src", "init": "<js>java.t2s(result)</js>", "intro": "class.comics-detail__desc overflow-hidden@text", "kind": "class.tag-list@text", "lastChapter": "class.comics-chapters__item.0@text", "name": "class.comics-detail__title@text", "tocUrl": "class.pure-u-1-1 pure-u-sm-1-2 pure-u-md-1-3 pure-u-lg-1-4 comics-chapters@tag.a@harf@class.comics-chapters__item@text"}, "ruleContent": {"content": "@js:\nlet n =java.getElements('class.comic-contain@amp-img')\nlet c=[];\n    Array.from(n).forEach(x=>{\n    c.push({\n    link:x.attr('data-src')\n})    \n}) \nvar imgTags = c.map(item => `<img src=\"${item.link}\">`).join('\\n');\n    imgTags;", "imageStyle": "FULL", "title": "class.title"}, "ruleExplore": {"author": "$.author", "bookList": "$.items[*]", "bookUrl": "https://cn.bzmanga.com/comic/{{$.comic_id}}", "coverUrl": "https://static-tw.baozimh.com/cover/{{$.topic_img}}", "kind": "$.type_names", "name": "$.name"}, "ruleSearch": {"author": "class.tags text-truncate@text", "bookList": "class.comics-card pure-u-1-2 pure-u-sm-1-2 pure-u-md-1-4 pure-u-lg-1-6", "bookUrl": "class.comics-card pure-u-1-2 pure-u-sm-1-2 pure-u-md-1-4 pure-u-lg-1-6@tag.a@href", "coverUrl": "tag.amp-img.0@src", "kind": "class.tabs cls@text", "lastChapter": "class.comics-chapters__item.0@text", "name": "class.comics-card__title text-truncate@text"}, "ruleToc": {"chapterList": "<js>java.t2s(result)</js>\nclass.pure-u-1-1 pure-u-sm-1-2 pure-u-md-1-3 pure-u-lg-1-4 comics-chapters", "chapterName": "tag.span@text", "chapterUrl": "tag.a@href"}, "searchUrl": "https://cn.bzmanga.com/search?q={{key}}", "weight": 0},{"bookSourceComment": "//禁忌书屋(cool18 bbs4)书贴聚合源：搜索关键词后把帖子按【书名】聚合成书(书名写法不同也会并成一本)，点开书按书名再搜一次生成目录(按发帖时间从早到晚/一层楼一章，主贴和跟帖都算)，正文取帖子正文区。参考 by河鹅和 的旧书源改写，适配 cool18 新版 wap 模板。", "bookSourceGroup": "聚合书源", "bookSourceName": "禁忌书屋·书贴聚合", "bookSourceType": 0, "bookSourceUrl": "https://www.cool18.com/bbs4/", "concurrentRate": "", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": false, "enabledReview": false, "header": "{\"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\"}", "jsLib": "", "lastUpdateTime": "1789900621006", "loginUrl": "", "loginUi": "", "loginCheckJs": "", "respondTime": 180000, "ruleBookInfo": {"init": "", "name": "", "author": "", "kind": "", "intro": "", "coverUrl": "", "tocUrl": "", "wordCount": "", "lastChapter": ""}, "ruleContent": {"content": "#content-section pre@textNodes||#content-section@html", "replaceRegex": "", "replaceRule": "", "sourceRegex": "", "webJs": ""}, "ruleExplore": [], "ruleReview": {"avatarRule": "", "contentRule": "", "postTimeRule": "", "reviewList": "", "userNameRule": ""}, "ruleSearch": {"author": "$.author", "bookList": ".l-m1\n<js>\n/*\n * 禁忌书屋(cool18 bbs4) 搜索列表聚合脚本\n * 把搜索结果里的书贴按【书名】聚合成\"书\", 供阅读(Legado)搜索列表显示\n * 参考旧书源 by河鹅和 的写法改写, 适配 cool18 新版 wap 模板\n *\n * 两个坑:\n * 1) 搜索结果里\"主贴\"的标题是加粗的(<b>), 后面更新的章节经常以\"跟帖\"发出, 标题不加粗,\n *    所以不能只看加粗的, 也不能用 first=1 过滤(那样会把新章节全丢掉);\n * 2) 同一本书的标题写法不统一, 有【仙宫香妃录】、《仙宫香妃录》、【仙宫香妃录(新版)】等,\n *    要按\"去掉书名号+统一括号\"后的书名聚合, 才不会一本书拆成好几本\n */\nvar keyList = [];\nvar bookList = [];\ntry {\n    var rawVar = source.getVariable();\n    if (rawVar) {\n        var Variable = JSON.parse(rawVar);\n        if (Variable) {\n            if (Variable.keyList) keyList = Variable.keyList;\n            if (Variable.bookList) bookList = Variable.bookList;\n        }\n    }\n} catch (e) {\n    keyList = [];\n    bookList = [];\n}\n\nfunction trimStr(s) {\n    if (s === null || typeof s == \"undefined\") return \"\";\n    return String(s).replace(/^\\s+|\\s+$/g, \"\");\n}\n\nfunction listCount(list) {\n    if (!list) return 0;\n    if (typeof list.length == \"number\") return list.length;\n    return list.size();\n}\n\nfunction listItem(list, i) {\n    var v = null;\n    try { v = list[i]; } catch (e1) { v = null; }\n    if (v === null || typeof v == \"undefined\") {\n        try { v = list.get(i); } catch (e2) { v = null; }\n    }\n    return v;\n}\n\n/* 取标题里第一对书名号(含括号), 没有则返回空 */\nfunction pickRawName(title) {\n    var opens = [\"【\", \"《\", \"[\", \"［\", \"〔\", \"〖\"];\n    var closes = [\"】\", \"》\", \"]\", \"］\", \"〕\", \"〗\"];\n    for (var i = 0; i < opens.length; i++) {\n        var s = title.indexOf(opens[i]);\n        if (s < 0) continue;\n        var e = title.indexOf(closes[i], s + 1);\n        if (e > s) return trimStr(title.substring(s, e + 1));\n    }\n    return \"\";\n}\n\n/* 显示用书名: 去掉两端的书名号 */\nfunction displayName(raw) {\n    var s = trimStr(raw);\n    while (s.length > 0 && \"【《[［〔〖\".indexOf(s.charAt(0)) >= 0) s = s.substring(1);\n    while (s.length > 0 && \"】》]］〕〗\".indexOf(s.charAt(s.length - 1)) >= 0) {\n        s = s.substring(0, s.length - 1);\n    }\n    return trimStr(s);\n}\n\n/* 聚合用的键: 去掉所有书名号/空格, 全角括号转半角, 这样同一本书的不同写法会并成一本 */\nfunction bookKey(name) {\n    var out = \"\";\n    var drop = \"【】《》[]［］〔〕〖〗 \\u3000\\t\\r\\n\";\n    for (var i = 0; i < name.length; i++) {\n        var ch = name.charAt(i);\n        if (drop.indexOf(ch) >= 0) continue;\n        if (ch === \"（\") out += \"(\";\n        else if (ch === \"）\") out += \")\";\n        else out += ch;\n    }\n    return out;\n}\n\n/* 放进 URL 参数里用的键(只要不影响 URL 结构即可, 中文由阅读自己转义) */\nfunction urlEscape(s) {\n    var out = \"\";\n    for (var i = 0; i < s.length; i++) {\n        var ch = s.charAt(i);\n        if (ch === \"%\") out += \"%25\";\n        else if (ch === \"&\") out += \"%26\";\n        else if (ch === \"#\") out += \"%23\";\n        else if (ch === \"+\") out += \"%2B\";\n        else if (ch === \"=\") out += \"%3D\";\n        else if (ch === \"?\") out += \"%3F\";\n        else out += ch;\n    }\n    return out;\n}\n\n/*\n * 目录页(按书名再搜一次)的关键词:\n * 实测本站搜索\"多一个字、带空格或括号\"就经常 0 结果, 含\"乱伦\"会被站点过滤,\n * 所以把书名切成片段, 取最长的安全片段(最多7字)当关键词, 目录页再用书名精确过滤\n */\nfunction pickKeyword(key) {\n    var s = trimStr(key);\n    var chunks = s.split(\"乱伦\");\n    var best = \"\";\n    for (var i = 0; i < chunks.length; i++) {\n        var segs = chunks[i].split(/[^\\u4e00-\\u9fa5A-Za-z0-9]+/);\n        for (var j = 0; j < segs.length; j++) {\n            var seg = trimStr(segs[j]);\n            if (seg.length > best.length) best = seg;\n        }\n    }\n    if (best.length > 7) best = best.substring(0, 7);\n    if (best.length < 2) best = s;\n    if (best.length > 7) best = best.substring(0, 7);\n    return best;\n}\n\n/* 从标题里取作者, 用字符串查找而不用正则(部分正则在 Rhino 里编译不过) */\nfunction pickAuthor(title) {\n    var tags = [\"作者：\", \"作者:\", \"作者 :\", \"作：\", \"作:\", \"作 :\"];\n    var stops = [\" \", \"\\u3000\", \"\\t\", \"，\", \"。\", \"、\", \"）\", \")\", \"】\", \"]\", \"（\", \"(\", \"【\", \"[\"];\n    for (var i = 0; i < tags.length; i++) {\n        var p = title.indexOf(tags[i]);\n        if (p < 0) continue;\n        var rest = title.substring(p + tags[i].length);\n        var end = -1;\n        for (var j = 0; j < stops.length; j++) {\n            var k = rest.indexOf(stops[j]);\n            if (k >= 0 && (end < 0 || k < end)) end = k;\n        }\n        if (end >= 0) rest = rest.substring(0, end);\n        return trimStr(rest);\n    }\n    return \"\";\n}\n\nvar count = listCount(result);\nif (count === 0) {\n    result = \"[]\";\n} else {\n    for (var i = 0; i < count; i++) {\n        var b = listItem(result, i);\n        if (!b) continue;\n        var title = trimStr(java.getString(\"a@text\", b));\n        if (title === \"\") continue;\n        var rawName = pickRawName(title);\n        if (rawName === \"\") {\n            /* 没书名号的: 只有主贴(标题加粗)才当成一本书, 跟帖直接丢掉, 免得生成垃圾书 */\n            var boldTitle = trimStr(java.getString(\"a b@text\", b));\n            if (boldTitle === \"\") continue;\n            rawName = title;\n        }\n        var bookname = displayName(rawName);\n        var bookkey = bookKey(rawName);\n        if (bookname === \"\" || bookkey === \"\") continue;\n        var uploader = trimStr(java.getString(\"font@text\", b));\n        var date = trimStr(java.getString(\"i@text\", b));\n        var author = pickAuthor(title);\n        var idx = keyList.indexOf(bookkey);\n        if (idx === -1) {\n            keyList.push(bookkey);\n            bookList.push({\n                bookname: bookname,\n                key: urlEscape(bookkey),\n                keyword: pickKeyword(bookkey),\n                author: author,\n                uploader: uploader,\n                time: date,\n                sum: 1\n            });\n        } else {\n            bookList[idx].sum = bookList[idx].sum + 1;\n        }\n    }\n    source.setVariable(JSON.stringify({ keyList: keyList, bookList: bookList }));\n    result = JSON.stringify(bookList);\n}\n</js>\n$[*]", "bookUrl": "index.php?action=search&bbsdr=bbs4&act=threadsearch&app=forum&keywords={{$.keyword}}&submit=%E6%9F%A5%E8%AF%A2&bk={{$.key}}", "checkKeyWord": "", "coverUrl": "", "intro": "共{{$.sum}}章　最新：{{$.time}}　上传者：{{$.uploader}}", "kind": "$.time", "lastChapter": "", "name": "$.bookname", "wordCount": ""}, "ruleToc": {"chapterList": "-ul.thread-list li.l-m1\n<js>\n/*\n * 目录列表: 用\"书名键\"过滤搜索结果, 只留下这本书的书贴(主贴+跟帖都算, 更新章节常在跟帖里)\n * 过滤是精确匹配(把标题里的书名按同样的规则归一化后比较), 所以【仙宫香妃录】不会串到\n * 【仙宫香妃录（新版）】里; 万一一条都匹配不上, 再逐级放宽, 保证目录不为空\n */\nvar tocHitList = [];\nvar tocSoftList = [];\nvar tocAllList = [];\n\nfunction tocTrim(s) {\n    if (s === null || typeof s == \"undefined\") return \"\";\n    return String(s).replace(/^\\s+|\\s+$/g, \"\");\n}\n\n/* 与搜索列表完全一致的书名归一化规则 */\nfunction tocPickRawName(title) {\n    var opens = [\"【\", \"《\", \"[\", \"［\", \"〔\", \"〖\"];\n    var closes = [\"】\", \"》\", \"]\", \"］\", \"〕\", \"〗\"];\n    for (var i = 0; i < opens.length; i++) {\n        var s = title.indexOf(opens[i]);\n        if (s < 0) continue;\n        var e = title.indexOf(closes[i], s + 1);\n        if (e > s) return tocTrim(title.substring(s, e + 1));\n    }\n    return \"\";\n}\n\nfunction tocBookKey(name) {\n    var out = \"\";\n    var drop = \"【】《》[]［］〔〕〖〗 \\u3000\\t\\r\\n\";\n    for (var i = 0; i < name.length; i++) {\n        var ch = name.charAt(i);\n        if (drop.indexOf(ch) >= 0) continue;\n        if (ch === \"（\") out += \"(\";\n        else if (ch === \"）\") out += \")\";\n        else out += ch;\n    }\n    return out;\n}\n\nvar tocWant = \"\";\ntry {\n    tocWant = tocBookKey(tocTrim(book.name));\n} catch (e) {\n    tocWant = \"\";\n}\n\nvar tocCount = 0;\nif (result) {\n    tocCount = (typeof result.length == \"number\") ? result.length : result.size();\n}\nfor (var i = 0; i < tocCount; i++) {\n    var tocEl = null;\n    try { tocEl = result[i]; } catch (e1) { tocEl = null; }\n    if (tocEl === null || typeof tocEl == \"undefined\") {\n        try { tocEl = result.get(i); } catch (e2) { tocEl = null; }\n    }\n    if (!tocEl) continue;\n    var tocName = tocTrim(java.getString(\"a@text\", tocEl));\n    var tocUrl = tocTrim(java.getString(\"a@href\", tocEl));\n    if (tocName === \"\" || tocUrl === \"\") continue;\n    var tocItem = { name: tocName, url: tocUrl };\n    tocAllList.push(tocItem);\n    var tocRaw = tocPickRawName(tocName);\n    var tocKey = tocBookKey(tocRaw === \"\" ? tocName : tocRaw);\n    if (tocWant !== \"\" && tocKey === tocWant) {\n        tocHitList.push(tocItem);\n    } else if (tocWant !== \"\" && tocKey.indexOf(tocWant) >= 0) {\n        tocSoftList.push(tocItem);\n    }\n}\n\nif (tocHitList.length > 0) {\n    result = JSON.stringify(tocHitList);\n} else if (tocSoftList.length > 0) {\n    result = JSON.stringify(tocSoftList);\n} else {\n    result = JSON.stringify(tocAllList);\n}\n</js>\n$[*]", "chapterName": "$.name##\\s*作\\s*者?[:：].*$##", "chapterUrl": "$.url", "isVip": "", "nextTocUrl": "<js>\n/*\n * 目录下一页: 当前页还有 .l-m1 书贴时才取\"下一页\"链接, 没有就结束翻页\n * (搜索结果最后一页之后站点仍会输出下一页链接, 必须自己判断)\n * 另外最多翻 5 页, 免得关键词太宽泛时一直翻下去\n */\nfunction ntStr(v) {\n    if (v === null || typeof v == \"undefined\") return \"\";\n    return String(v).replace(/^\\s+|\\s+$/g, \"\");\n}\n\nvar ntCount = 0;\ntry {\n    ntCount = parseInt(java.get(\"tocPageCount\"), 10);\n    if (isNaN(ntCount)) ntCount = 0;\n} catch (e) {\n    ntCount = 0;\n}\nif (ntStr(baseUrl).indexOf(\"&p=\") < 0) ntCount = 0; /* 回到第一页就重新计数 */\nntCount = ntCount + 1;\ntry {\n    java.put(\"tocPageCount\", String(ntCount));\n} catch (e2) {\n}\n\nvar ntHasChapter = ntStr(java.getString(\".l-m1 a@href\"));\nvar ntNextUrl = ntStr(java.getString(\".pagination-bar a.next@href\"));\nif (ntCount < 5 && ntHasChapter !== \"\" && ntNextUrl !== \"\") {\n    result = ntNextUrl;\n} else {\n    result = \"\";\n}\n</js>"}, "searchUrl": "<js>if(page==1){source.setVariable('')}</js>index.php?action=search&bbsdr=bbs4&act=threadsearch&app=forum&keywords={{key}}&submit=%E6%9F%A5%E8%AF%A2&p={{page}}", "weight": 0},{"bookSourceComment": "作者：纳兰容若 // 需手动过CF验证", "bookSourceGroup": "自建源", "bookSourceName": "霹雳书屋", "bookSourceType": 0, "bookSourceUrl": "https://www.pilishuwu.com", "bookUrlPattern": ".*pilishuwu\\.com/\\d+/\\d+/info\\.html.*", "concurrentRate": "1000", "customButton": false, "customOrder": 6, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\":\"全部小说\",\"url\":\"/0/list/1.html\"},{\"title\":\"男频小说\",\"url\":\"/1/list/1.html\"},{\"title\":\"女频小说\",\"url\":\"/2/list/1.html\"},{\"title\":\"电子图书\",\"url\":\"/3/list/1.html\"},{\"title\":\"无CP小说\",\"url\":\"/4/list/1.html\"},{\"title\":\"纯爱小说\",\"url\":\"/5/list/1.html\"}]", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\", \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\", \"Accept-Language\": \"zh-CN,zh;q=0.9,en;q=0.8\", \"Referer\": \"https://www.pilishuwu.com/\"}", "lastUpdateTime": "1789827498772", "loginUi": "[\n  {\n    \"name\": \"🌐 打开浏览器完成验证\",\n    \"type\": \"button\",\n    \"action\": \"openBrowser()\",\n    \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}\n  },\n  {\n    \"name\": \"🍪 查看Cookie状态\",\n    \"type\": \"button\",\n    \"action\": \"checkCookie()\",\n    \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}\n  },\n  {\n    \"name\": \"🗑️ 清除Cookie\",\n    \"type\": \"button\",\n    \"action\": \"clearCookie()\",\n    \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}\n  }\n]", "loginUrl": "openBrowser = () => {\n    java.startBrowser('https://www.pilishuwu.com', '请完成安全验证，通过后返回阅读即可');\n}\n\ncheckCookie = () => {\n    var c = java.getCookie('https://www.pilishuwu.com');\n    if (c && c.indexOf('cf_clearance') !== -1) {\n        java.toast('✅ 已检测到 cf_clearance Cookie');\n    } else {\n        java.toast('❌ 未检测到 cf_clearance Cookie');\n    }\n}\n\nclearCookie = () => {\n    java.clearCookie('https://www.pilishuwu.com');\n    java.toast('🗑️ Cookie 已清除');\n}", "respondTime": 91700, "ruleBookInfo": {"author": "div.book-info-status a[href*=author]@text || p.book-status@text", "coverUrl": "div.book-cover img@src || img.book-cover@src", "intro": "div.book-intro@text || p.book-intro@text", "kind": "a.book-fenlei@text || span.book-fenlei@text", "lastChapter": "a.book-newest@text", "name": "h1@text || h2.book-title@text", "tocUrl": "@js:baseUrl.replace(/info\\.html.*$/, 'menu/1.html')"}, "ruleContent": {"content": "@js:\nvar html = result;\nvar cid = '';\nvar m1 = html.match(/data-chapter-id=\"(\\d+)\"/);\nif (m1) cid = m1[1];\nif (!cid) {\n  var m2 = html.match(/id:\\s*'(\\d+)'/);\n  if (m2) cid = m2[1];\n}\nvar content = '';\nif (cid) {\n  var apiUrl = source.key + '/wmcms/ajax/index.php?action=novel.getchapter&cid=' + cid + '&format=1';\n  var res = java.ajax(apiUrl);\n  try {\n    var json = JSON.parse(res);\n    if (json.code == 200 && json.data && json.data.chapter) {\n      var ch = json.data.chapter;\n      if (ch.chapter_isvip == '0' && ch.content && ch.content.length > 0) {\n        var lines = [];\n        for (var i = 0; i < ch.content.length; i++) lines.push(String(ch.content[i]));\n        content = lines.join('\\n');\n      } else if (ch.chapter_isvip != '0') {\n        content = '【VIP章节，需订阅后阅读】';\n      } else {\n        content = '【本章内容为空】';\n      }\n    } else {\n      content = '【接口返回异常 code=' + json.code + '】';\n    }\n  } catch(e) {\n    content = '【JSON解析失败: ' + e + '】';\n  }\n} else {\n  content = '【未能提取章节ID】';\n}\nresult = content;\nresult;", "nextContentUrl": "#readLoadNext a:last-child@href"}, "ruleExplore": {"author": "span.book-status@text", "bookList": "div.x-book", "bookUrl": "div.x-book__coverbox a@href", "coverUrl": "img.x-book__cover@src", "intro": "p.x-book__intro@text", "kind": "span.book-fenlei@text", "name": "p.x-book__info--name@text"}, "ruleSearch": {"author": "span.book-status@text", "bookList": "div.x-book", "bookUrl": "div.x-book__coverbox a@href", "checkKeyWord": "我的", "coverUrl": "img.x-book__cover@src", "intro": "p.x-book__intro@text", "kind": "span.book-fenlei@text", "name": "p.x-book__info--name@text"}, "ruleToc": {"chapterList": "li.chapter", "chapterName": "a span@text", "chapterUrl": "a@href"}, "searchUrl": "https://www.pilishuwu.com/module/search/search.php?module=novel&key={{key}}", "weight": 0},{"bookSourceComment": "登录搜索", "bookSourceGroup": "快速书源 ⚡,通常书源 📂", "bookSourceName": "⚡📂有度中文", "bookSourceType": 0, "bookSourceUrl": "https://www.yoduzw.com", "bookUrlPattern": "https://www.yoduzw.com/book/\\d+/?for-search", "customButton": false, "customOrder": 130, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreScreen": "", "exploreUrl": "❀                       经 典 文 学                      ❀::\n传记回忆::/zhuanjihuiyi/{{page}}.html\n杂文随笔::/zawensuibi/{{page}}.html\n经典历史::/jingdianlishi/{{page}}.html\n侦探推理::/zhentantuili/{{page}}.html\n惊悚悬疑::/jingsongxuanyi/{{page}}.html\n网络玄幻::/wangluoxuanhuan/{{page}}.html\n青春都市::/qingchundushi/{{page}}.html\n社会心理::/shehuixinli/{{page}}.html\n经典科幻::/jingdiankehuan/{{page}}.html\n外国小说::/waiguoxiaoshuo/{{page}}.html\n当代小说::/dangdaixiaoshuo/{{page}}.html\n现代小说::/xiandaixiaoshuo/{{page}}.html\n官场小说::/guanchangxiaoshuo/{{page}}.html\n经典武侠::/jingdianwuxia/{{page}}.html\n纪实报告::/jishibaogao/{{page}}.html\n世界历史::/shijielishi/{{page}}.html\n中国历史::/zhongguolishi/{{page}}.html\n科普学习::/kepuxuexi/{{page}}.html\n宗教哲学::/zongjiaozhexue/{{page}}.html\n文学理论::/wenxuelilun/{{page}}.html\n寓言童话::/yuyantonghua/{{page}}.html\n作  品  集::/zuopinji/{{page}}.html\n国学古籍::/guoxueguji/{{page}}.html\n战争军事::/zhanzhengjunshi/{{page}}.html\n政治经济::/zhengzhijingji/{{page}}.html\n古典文学::/gudianwenxue/{{page}}.html\n经典言情::/jingdianyanqing/{{page}}.html\n英文读本::/yingwenduben/{{page}}.html\n日语读物::/riyuduwu/{{page}}.html\n诗歌戏曲::/shigexiqu/{{page}}.html\n❀                       网 络 小 说                      ❀::\n玄    幻::/xuanhuanxiaoshuo/{{page}}.html\n仙    侠::/xianxiaxiaoshuo/{{page}}.html\n都    市::/dushixiaoshuo/{{page}}.html\n武    侠::/wuxiaxiaoshuo/{{page}}.html\n悬    疑::/xuanyixiaoshuo/{{page}}.html\n军    事::/junshixiaoshuo/{{page}}.html\n灵    异::/lingyixiaoshuo/{{page}}.html\n科    幻::/kehuanxiaoshuo/{{page}}.html\n历    史::/lishixiaoshuo/{{page}}.html\n竞    技::/jingjixiaoshuo/{{page}}.html\n穿    越::/chuanyuexiaoshuo/{{page}}.html\n言    情::/yanqingxiaoshuo/{{page}}.html\n网    游::/wangyouxiaoshuo/{{page}}.html\n❀                       轻 小 说 区                      ❀::\n富士见文库::/fushijianwenku/{{page}}.html\nFami通文库::/Famitongwenku/{{page}}.html\n  电击文库  ::/dianjiwenku/{{page}}.html\n  角川文库  ::/jiaochuanwenku/{{page}}.html\n  少女文库  ::/shaonvwenku/{{page}}.html\n  其他文库  ::/qitawenku/{{page}}.html\n   MF文库J  ::/MFwenkuJ/{{page}}.html\n   GA文库   ::/GAwenku/{{page}}.html\n   HJ文库   ::/HJwenku/{{page}}.html\n一迅社::/yixunshe/{{page}}.html\n集英社::/jiyingshe/{{page}}.html\n小学馆::/xiaoxueguan/{{page}}.html\n讲谈社::/jiangtanshe/{{page}}.html", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.5790.166 Safari/537.36\",\n  \"Referer\": \"https://www.yoduzw.com/\",\n  \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\",\n  \"Accept-Language\": \"zh-CN,zh;q=0.9\"\n}", "lastUpdateTime": "1789789148259", "loginUrl": "https://www.yoduzw.com/", "respondTime": 32806, "ruleBookInfo": {"author": "class.mb15 ell _tags pt2@tag.span.0@tag.a@text", "coverUrl": "class.cover g_col_4@tag.img@src", "intro": "class.h112 mb15 det-abt lh1d8 c_strong fs16 hm-scroll@tag.p@text", "kind": "class.c_small ml10 vam ml0@text&&\nclass.mb15 ell _tags pt2@tag.span.1@text&&\nclass.mb15 ell _tags pt2@tag.span.2@text", "lastChapter": "class.ell lst-chapter dib vam@text", "name": "class.g_col_8 pr@tag.h1@text", "wordCount": "class.mb15 ell _tags pt2@tag.span.3@text"}, "ruleContent": {"content": "class.read-content@tag.p@text", "nextContentUrl": "class.mlfy_page@tag.a.4@href", "replaceRegex": "<js>\ni=[\"%uE800\",\"%uE801\",\"%uE802\",\"%uE803\",\"%uE804\",\"%uE805\",\"%uE806\",\"%uE807\",\"%uE808\",\"%uE809\",\"%uE80A\",\"%uE80B\",\"%uE80C\",\"%uE80D\",\"%uE80E\",\"%uE80F\",\"%uE810\",\"%uE811\",\"%uE812\",\"%uE813\",\"%uE814\",\"%uE815\",\"%uE816\",\"%uE817\",\"%uE818\",\"%uE819\",\"%uE81A\",\"%uE81B\",\"%uE81C\",\"%uE81D\",\"%uE81E\",\"%uE81F\",\"%uE820\",\"%uE821\",\"%uE822\",\"%uE823\",\"%uE824\",\"%uE825\",\"%uE826\",\"%uE827\",\"%uE828\",\"%uE829\",\"%uE82A\",\"%uE82B\",\"%uE82C\",\"%uE82D\",\"%uE82E\",\"%uE82F\",\"%uE830\",\"%uE831\",\"%uE832\",\"%uE833\",\"%uE834\",\"%uE835\",\"%uE836\",\"%uE837\",\"%uE838\",\"%uE839\",\"%uE83A\",\"%uE83B\",\"%uE83C\",\"%uE83D\",\"%uE83E\",\"%uE83F\",\"%uE840\",\"%uE841\",\"%uE842\",\"%uE843\",\"%uE844\",\"%uE845\",\"%uE846\",\"%uE847\",\"%uE848\",\"%uE849\",\"%uE84A\",\"%uE84B\",\"%uE84C\",\"%uE84D\",\"%uE84E\",\"%uE84F\",\"%uE850\",\"%uE851\",\"%uE852\",\"%uE853\",\"%uE854\",\"%uE855\",\"%uE856\",\"%uE857\",\"%uE858\",\"%uE859\",\"%uE85A\",\"%uE85B\",\"%uE85C\",\"%uE85D\",\"%uE85E\",\"%uE85F\",\"%uE860\",\"%uE861\",\"%uE862\",\"%uE863\"];\nz=\"的一是了我不人在他有这个上们来到时大地为子中你说生国年着就那和要她出也得里后自以会家可下而过天去能对小多然于心学么之都好看起发当没成只如事把还用第样道想作种开美乳阴液茎欲呻肉交性胸私穴淫臀舔射脱裸骚唇\";\nconst charMap={};\nconst Patterns=[];\nfor (let idx=0;idx<i.length;idx++){\n\tcharMap[i[idx]]=z[idx];\n\tPatterns.push(i[idx].replace(/[.*+?^${}()|[\\]\\\\]/g,'\\\\$&'));\n}\nconst Reg=new RegExp(Patterns.join('|'),'g');\nfunction processText(html){\n\treturn html.replace(Reg,match=>charMap[match]);\n}\nhtml=escape(result);\nhtml=processText(html);\nunescape(html)\n</js>", "webJs": "document.documentElement.outerHTML"}, "ruleExplore": {"author": "class.mb5 ell _tags pt2@tag.span.0@text", "bookList": "class.g_row lis-mn j_bookList@tag.li", "bookUrl": "class.lst-item pr lh1d5@tag.a.1@href", "coverUrl": "tag.img@_src", "intro": "class.lst-item pr lh1d5@tag.a.1@text", "kind": "class.mb5 ell _tags pt2@tag.span.1@text||class.mb5 ell _tags pt2@tag.span.2@text", "name": "class.mb5 fs20 f_mbo pt5 oh@text"}, "ruleSearch": {"author": "class.c_small db mb5 ell ttc fs14@tag.span.1@text", "bookList": "class.ser-ret@tag.li", "bookUrl": "class.mb5 fs20 f_mbo pt5 ell@tag.a@href", "coverUrl": "tag.img@_src", "intro": "class.fs16 mb10 c_strong g_ells@text", "kind": "class.c_small db mb5 ell ttc fs14@tag.span.2@text", "lastChapter": "class.db mb5 ell ttc fs16@class.vam@tag.a@text", "name": "class.mb5 fs20 f_mbo pt5 ell@tag.a@text"}, "ruleToc": {"chapterList": "id.chapterList@tag.li", "chapterName": "class.w33p@tag.span@text", "chapterUrl": "class.w33p@tag.a@href"}, "searchUrl": "https://www.yoduzw.com/sa,{\n\"method\": \"POST\",\n\"body\": \"searchkey={{key}}&searchtype=all\"\n}", "weight": 1},{"bookSourceComment": "// \n\t1. 能否看正文取决请求头authorization，目前通过免广告版获得阅读时间。\n2. 次广告可以看当天，如果看不了那就是当天广告还没有点。\n3. 有些漫画无法在legado中加载，复制到浏览器可以正常打开。", "bookSourceGroup": "漫画", "bookSourceName": "栗子漫画", "bookSourceType": 2, "bookSourceUrl": "http://ai.qsmm.fun", "customButton": false, "customOrder": 2, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nvar host = \"http://ai.qsmm.fun\";\nvar SIGN = \"lzsign=0f59608449ff6cfc5c8200e3891385cb&t=1789549790\";\n\nvar areas = {\"🌏 全部\":\"\",\"🇨🇳 国漫\":\"1\",\"🇯🇵 日漫\":\"2\",\"🇰🇷 韩漫\":\"3\",\"🇺🇸 美漫\":\"4\"};\nvar states = {\"📖 全部\":\"\",\"🔖 连载\":\"1\",\"✅ 完结\":\"2\"};\nvar tags = [\"全部\",\"热血\",\"格斗\",\"武侠\",\"魔幻\",\"魔法\",\"冒险\",\"爱情\",\"搞笑\",\"校园\",\"科幻\",\"后宫\",\"励志\",\"职场\",\"美食\",\"社会\",\"黑道\",\"战争\",\"历史\",\"悬疑\",\"竞技\",\"体育\",\"恐怖\",\"推理\",\"生活\",\"伪娘\",\"治愈\",\"神鬼\",\"四格\",\"百合\",\"耽美\",\"舞蹈\",\"侦探\",\"宅男\",\"音乐\",\"萌系\",\"古风\",\"恋爱\",\"都市\",\"穿越\",\"游戏\",\"其他\",\"日常\",\"腹黑\",\"仙侠\",\"修仙\",\"纯爱\",\"唯美\",\"青春\",\"彩虹\",\"权谋\",\"宅斗\",\"装逼\",\"浪漫\",\"偶像\",\"大女主\",\"复仇\",\"虐心\",\"灵异\",\"逆袭\",\"妖怪\",\"架空\",\"动作\",\"宫斗\",\"脑洞\",\"战斗\",\"怪物\",\"系统\",\"智斗\",\"机甲\",\"高甜\",\"异能\",\"末日\",\"奇幻\",\"正能量\",\"宫廷\",\"亲情\",\"剧情\",\"轻小说\",\"暗黑\",\"长条\",\"玄幻\",\"霸总\",\"其它\",\"节操\",\"欧风\",\"女神\",\"转生\",\"异形\",\"反套路\",\"重生\",\"性转\"];\n\nvar saved = {};\ntry { saved = JSON.parse(source.getVariable() || \"{}\") || {}; } catch (e) {}\nvar currentArea  = areas[saved.area] !== undefined ? saved.area : \"🌏 全部\";\nvar currentState = states[saved.state] !== undefined ? saved.state : \"📖 全部\";\nvar areaVal  = areas[currentArea] || \"\";\nvar stateVal = states[currentState] || \"\";\n\nfunction pushCell(name, url) {\n  ui.push({ title: name, url: url, style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.2 } });\n}\nfunction pushTitle(name) {\n  ui.push({ title: name, url: '', style: { layout_flexBasisPercent: 1, layout_flexGrow: 1 } });\n}\nfunction buildUrl(tag) {\n  var u = host + \"/app/api/category/list?page={{page}}\";\n  if (tag && tag !== \"全部\") u += \"&tag=\" + encodeURIComponent(tag);\n  if (areaVal)  u += \"&class=\" + areaVal;\n  if (stateVal) u += \"&isend=\" + stateVal;\n  return u + \"&\" + SIGN;\n}\n\nvar ui = [\n  { title: '关键字', type: 'text', default: '', style: { layout_flexBasisPercent: 1 } },\n  { title: '🔍 搜索本站', type: 'button', action: \"var k=infoMap['关键字']; if(!k){ java.toast('请输入漫画名称'); } else { java.searchBook(k, source); }\", style: { layout_flexBasisPercent: 1 } },\n\n  { title: '国家', type: 'select', chars: Object.keys(areas), default: currentArea,\n    action: \"var v=infoMap['国家']; var o={}; try{o=JSON.parse(source.getVariable()||'{}')||{}}catch(e){} o.area=v; source.setVariable(JSON.stringify(o)); java.toast('国家已切换到: ' + v); java.refreshExplore();\",\n    style: { layout_flexBasisPercent: 1 } },\n\n  { title: '状态', type: 'select', chars: Object.keys(states), default: currentState,\n    action: \"var v=infoMap['状态']; var o={}; try{o=JSON.parse(source.getVariable()||'{}')||{}}catch(e){} o.state=v; source.setVariable(JSON.stringify(o)); java.toast('状态已切换到: ' + v); java.refreshExplore();\",\n    style: { layout_flexBasisPercent: 1 } }\n];\n\npushTitle('━━━ 【按标签】 ━━━');\nfor (var i = 0; i < tags.length; i++) {\n  pushCell(tags[i], buildUrl(tags[i]));\n}\n\nJSON.stringify(ui);", "header": "{\n  \"authorization\": \"eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjE1MTI0OTN9.2eC2_zPwUn5y9O5mKE8p7upkuqbpJ_7q-ztDdbZOmnZu-VhZl3Zi2V1T9ZvW2hPGWkmSsJoey6wGU6OOgZIajQ\"\n}", "lastUpdateTime": "1789720153034", "respondTime": 180000, "ruleBookInfo": {"author": "$.data.author", "coverUrl": "https://cdn.lzimg.xyz{{$.data.picY}}", "intro": "📚漫画名：{{$.data.name}}\n🖊️作者   ：{{$.data.author}}\n🏷️分类   ：{{$.data.tags}}\n📕简介   ：{{$.data.content}}", "kind": "$.data.tags", "lastChapter": "@js:\nvar d = result;\nif (typeof d === 'string') { try { d = JSON.parse(d); } catch(e){} }\nfunction g(o,k){ if(o==null) return undefined; return (typeof o.get==='function')? o.get(k) : o[k]; }\nvar data = g(d,'data');\nvar ch = data && g(data,'chapters');\nif (!ch) '';\nelse {\n  var n = (ch.length!==undefined)? ch.length : (g(ch,'size')||0);\n  if (n===0) '';\n  else {\n    var last = (typeof ch.get==='function')? ch.get(n-1) : ch[n-1];\n    (last && g(last,'name'))? g(last,'name') : '';\n  }\n}", "name": "$.data.name"}, "ruleContent": {"content": "@js:\nvar d = result;\nif (typeof d === 'string') { try { d = JSON.parse(d); } catch(e){} }\nfunction g(o,k){ if(o==null) return undefined; try { return (typeof o.get==='function')? o.get(k) : o[k]; } catch(e){ return undefined; } }\n\nvar data = g(d,'data');\nvar arr = data && g(data,'pics');\nif (!arr) arr = g(d,'pics');\n\nvar out = [];\nif (arr) {\n    var n = (arr.length!==undefined)? arr.length : (g(arr,'size')||0);\n    for (var i=0;i<n;i++){\n        var p = (typeof arr.get==='function')? arr.get(i) : arr[i];\n        if (p==null) continue;\n        if (typeof p === 'object') p = g(p,'url')||g(p,'src')||g(p,'path')||g(p,'img');\n        if (p==null) continue;\n\n        p = String(p).trim();\n        if (!p) continue;\n\n        if (p.indexOf('//') === 0) {\n            p = 'https:' + p;\n        } else if (p.indexOf('http') !== 0) {\n            if (p.charAt(0) !== '/') p = '/' + p;\n            p = 'https://cdn.lzimg.xyz' + p;\n        }\n\n        // 纯净的标签，不带任何多余的参数\n        out.push('<img src=\"' + p + '\">');\n    }\n}\nout.join('\\n');"}, "ruleExplore": {"author": "$.author", "bookList": "$.data.category_list[*]", "bookUrl": "/app/api/v2/detail/{{$.id}}", "coverUrl": "https://cdn.lzimg.xyz{{$.picY}}", "intro": "$.content", "kind": "$.tags", "name": "$.name"}, "ruleSearch": {"author": "$.author", "bookList": "$.data.search_full[*]", "bookUrl": "/app/api/v2/detail/{{$.id}}", "checkKeyWord": "天命大反派", "coverUrl": "https://cdn.lzimg.xyz{{$.picY}}", "intro": "$.content", "kind": "$.tags", "name": "$.name"}, "ruleToc": {"chapterList": "$.data.chapters[*]", "chapterName": "$.name", "chapterUrl": "/app/api/chapter/v3/{{$.id}}?lzsign=0f59608449ff6cfc5c8200e3891385cb&t=1789549790"}, "searchUrl": "/app/api/search/full?q={{key}}&lzsign=150434f70b14c56aae6ffcfa2b560620&t=1789550539", "weight": 0},{"bookSourceComment": "作者：纳兰容若 // 思兔阅读，UTF-8", "bookSourceGroup": "自建源", "bookSourceName": "思兔阅读", "bookSourceType": 0, "bookSourceUrl": "https://www.sto66.com", "bookUrlPattern": ".*sto66\\.com/book/.*", "concurrentRate": "1000", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\":\"书库\",\"url\":\"/library.html\"},{\"title\":\"排行\",\"url\":\"/ranking.html\"},{\"title\":\"全本\",\"url\":\"/full.html\"},{\"title\":\"最近更新\",\"url\":\"/ranking/update.html\"}]", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\", \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\", \"Accept-Language\": \"zh-CN,zh;q=0.9\", \"Referer\": \"https://www.sto66.com/\"}", "lastUpdateTime": "1789706070580", "respondTime": 767, "ruleBookInfo": {"author": "meta[property=\"og:novel:author\"]@content", "coverUrl": "meta[property=\"og:image\"]@content", "intro": "meta[property=\"og:description\"]@content", "kind": "meta[property=\"og:novel:category\"]@content", "lastChapter": "meta[property=\"og:novel:latest_chapter_name\"]@content", "name": "meta[property=\"og:novel:book_name\"]@content || h1@text", "tocUrl": "@js:\nvar m = baseUrl.match(/\\/book\\/(\\w+)\\.html/);\nif (m) '/chapter/' + m[1] + '/1.html'; else '';"}, "ruleContent": {"content": "div#content p@text", "nextContentUrl": "a#linkNext@href", "title": "div.book.read h1@text || h1.pt10@text"}, "ruleExplore": {"author": "div.author:eq(0)@text##作者：", "bookList": "div.bookbox", "bookUrl": "h2.bookname a@href", "coverUrl": "img@src", "intro": "div.update@text##简介：", "lastChapter": "div.cat a@text", "name": "h2.bookname a@text"}, "ruleSearch": {"author": "div.author:eq(0)@text##作者：", "bookList": "div.bookbox", "bookUrl": "h2.bookname a@href", "checkKeyWord": "夜无疆", "intro": "div.update@text##简介：", "lastChapter": "div.cat a@text", "name": "h2.bookname a@text"}, "ruleToc": {"chapterList": "div#allchapter dl dd", "chapterName": "a@text", "chapterUrl": "a@href", "nextTocUrl": "a#linkNext@href"}, "searchUrl": "https://www.sto66.com/search/{{key}}.html", "weight": 0},{"bookSourceComment": "作者：纳兰容若 // 需手动过CF验证", "bookSourceGroup": "自建源", "bookSourceName": "霹雳书屋", "bookSourceType": 0, "bookSourceUrl": "https://www.pilishuwu.com", "bookUrlPattern": ".*pilishuwu\\.com/\\d+/\\d+/info\\.html.*", "concurrentRate": "1000", "customButton": false, "customOrder": -1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\":\"全部小说\",\"url\":\"/0/list/1.html\"},{\"title\":\"男频小说\",\"url\":\"/1/list/1.html\"},{\"title\":\"女频小说\",\"url\":\"/2/list/1.html\"},{\"title\":\"电子图书\",\"url\":\"/3/list/1.html\"},{\"title\":\"无CP小说\",\"url\":\"/4/list/1.html\"},{\"title\":\"纯爱小说\",\"url\":\"/5/list/1.html\"}]", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\", \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\", \"Accept-Language\": \"zh-CN,zh;q=0.9,en;q=0.8\", \"Referer\": \"https://www.pilishuwu.com/\"}", "lastUpdateTime": "1789694137337", "loginUi": "[\n  {\n    \"name\": \"🌐 打开浏览器完成验证\",\n    \"type\": \"button\",\n    \"action\": \"openBrowser()\",\n    \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}\n  },\n  {\n    \"name\": \"🍪 查看Cookie状态\",\n    \"type\": \"button\",\n    \"action\": \"checkCookie()\",\n    \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}\n  },\n  {\n    \"name\": \"🗑️ 清除Cookie\",\n    \"type\": \"button\",\n    \"action\": \"clearCookie()\",\n    \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}\n  }\n]", "loginUrl": "openBrowser = () => {\n    java.startBrowser('https://www.pilishuwu.com', '请完成安全验证，通过后返回阅读即可');\n}\n\ncheckCookie = () => {\n    var c = java.getCookie('https://www.pilishuwu.com');\n    if (c && c.indexOf('cf_clearance') !== -1) {\n        java.toast('✅ 已检测到 cf_clearance Cookie');\n    } else {\n        java.toast('❌ 未检测到 cf_clearance Cookie');\n    }\n}\n\nclearCookie = () => {\n    java.clearCookie('https://www.pilishuwu.com');\n    java.toast('🗑️ Cookie 已清除');\n}", "respondTime": 2607, "ruleBookInfo": {"author": "div.book-info-status a[href*=author]@text || p.book-status@text", "coverUrl": "div.book-cover img@src || img.book-cover@src", "intro": "div.book-intro@text || p.book-intro@text", "kind": "a.book-fenlei@text || span.book-fenlei@text", "lastChapter": "a.book-newest@text", "name": "h1@text || h2.book-title@text"}, "ruleContent": {"content": "div.read-content@textNodes || div#chapter-content@textNodes || div.content@textNodes", "nextContentUrl": "a#next@href || a.next@href || a:contains(下一页)@href"}, "ruleExplore": {"author": "span.book-status@text", "bookList": "div.x-book", "bookUrl": "div.x-book__coverbox a@href", "coverUrl": "img.x-book__cover@src", "intro": "p.x-book__intro@text", "kind": "span.book-fenlei@text", "name": "p.x-book__info--name@text"}, "ruleSearch": {"author": "span.book-status@text", "bookList": "div.x-book", "bookUrl": "div.x-book__coverbox a@href", "checkKeyWord": "我的", "coverUrl": "img.x-book__cover@src", "intro": "p.x-book__intro@text", "kind": "span.book-fenlei@text", "name": "p.x-book__info--name@text"}, "ruleToc": {"chapterList": "div.book-chapter-list a || ul.chapter-list li a || div.chapter-list a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "https://www.pilishuwu.com/module/search/search.php?module=novel&key={{key}}", "weight": 0},{"bookSourceComment": "2026-09-17：默认文字转简体，URL保持原样。twkan.com此前访问异常，本源使用twkan.cc，不保证旧书ID互通。公开页面匿名可读，未发现账号入口。请求间隔2秒；遇验证或限频停止并提示，需手动验证。搜索/分类列表无封面，详情有封面。 2026-09-17 E兼容修复：搜索、发现、目录返回逐项JSON字符串数组，字段继续JSONPath；并非整数组JSON.stringify。", "bookSourceGroup": "AI", "bookSourceName": "台湾小说网(twkan.cc)", "bookSourceType": 0, "bookSourceUrl": "https://twkan.cc/", "bookUrlPattern": "https?://(?:www[.])?twkan[.]cc/book/[A-Za-z0-9]+[.]html", "concurrentRate": "1/2000", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "热门推荐::https://www.twkan.cc/\n玄幻::https://www.twkan.cc/library/4ZyXBmkpBKE0CZre8xpWft/{{page}}.html\n仙侠::https://www.twkan.cc/library/1atwJtoBJ6G7Jyb6FDlPtT/{{page}}.html\n都市::https://www.twkan.cc/library/2gr4z5Jz9ZNM1NLXrJORkN/{{page}}.html\n历史::https://www.twkan.cc/library/9WnLjlGrA2WzBYwdH9nRx/{{page}}.html\n科幻::https://www.twkan.cc/library/7dG222CnytPNTX5EtjGxCC/{{page}}.html\n军事::https://www.twkan.cc/library/5lIKnscgjyDeHoxgM85ygm/{{page}}.html\n言情::https://www.twkan.cc/library/UmyEUPcEoKK6p2oAcoUSC/{{page}}.html\n轻小说::https://www.twkan.cc/library/1nENalPqLsPaObjhtw3Gpf/{{page}}.html\n悬疑::https://www.twkan.cc/library/4bAvYg9ZmMQ9CuvQqPVcG8/{{page}}.html\n奇幻::https://www.twkan.cc/library/1MlyhP24PsZBlLfJDFqoqA/{{page}}.html\n游戏::https://www.twkan.cc/library/4vINQfiwMRl0Kl1fB3ihZt/{{page}}.html\n诸天无限::https://www.twkan.cc/library/3QhTcsMkxFzF1YDLzO48oc/{{page}}.html\n武侠::https://www.twkan.cc/library/67Fc3zzuMkZWcG7oH7jF2Z/{{page}}.html\n重生::https://www.twkan.cc/library/1Ce9LrTxPyHhrQ2gW2F52y/{{page}}.html\n体育::https://www.twkan.cc/library/1RgQeN9n69lr7osC8JqSbo/{{page}}.html\n现实::https://www.twkan.cc/library/2Kkc6czsCFOv3Vhy2gfJBJ/{{page}}.html\n穿越::https://www.twkan.cc/library/24S6D6q7GI2NbHaHpWfWdO/{{page}}.html\n未删减::https://www.twkan.cc/library/3Wx5Kt8fHBA1qK73EEwpXP/{{page}}.html\n人气榜::https://www.twkan.cc/ranking/hits/{{page}}.html\n全本小说::https://www.twkan.cc/full/{{page}}.html", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36\",\"Referer\":\"https://www.twkan.cc/\"}", "lastUpdateTime": "1789640056365", "loginCheckJs": "(function(){var b=result.body;if(typeof b==='function')b=b.call(result);b=String(b);var c=result.code;if(typeof c==='function')c=c.call(result);var msg='';if(Number(c)===429||/搜索间隔|搜索間隔|请求过于频繁|請求過於頻繁/.test(b))msg='站点限频，请暂停搜索后再试';else if(/<title>Just a moment|<title>Attention Required/.test(b))msg='站点要求人机验证，请使用书源菜单打开网站手动完成';else if(Number(c)>=400)msg='站点HTTP错误 '+c+'，请稍后重试';if(msg){java.toast(msg);throw new Error(msg);}return result;})()", "loginUi": "<js>JSON.stringify([{name:'检查访问状态',type:'button',action:'checkSite()'},{name:'打开网站',type:'button',action:'openSite()'}])</js>", "loginUrl": "function checkSite(){try{var t=Date.now();var h=String(java.ajax('https://www.twkan.cc/'));var d=Packages.org.jsoup.Jsoup.parse(h);if(d.select('.item dl dt a[href^=/book/]').size()>0){java.toast('站点可直连，当前可匿名阅读；公开页面未发现账号登录入口。耗时 '+(Date.now()-t)+'ms');}else{java.toast('未取得正常书单，可能需要验证或站点暂时不可用');}}catch(e){java.toast('访问失败：'+e);}}function openSite(){java.startBrowser('https://www.twkan.cc/','台湾小说网');}function login(){checkSite();}", "respondTime": 180000, "ruleBookInfo": {"author": "$.a", "coverUrl": "$.c", "init": "@js:var d=Packages.org.jsoup.Jsoup.parse(String(result));function t(s){return String(java.t2s(String(d.select(s).text())));}var o=t('.bookintro');var at=o.indexOf('本书由思兔小说');if(at>=0)o=o.substring(0,at);JSON.stringify({n:t('h1.booktitle'),a:t('.booktag a.red'),k:t('.booktag a.blue')+','+t('.booktag span.red'),w:t('.booktag span.blue').split(' ')[0],o:o,c:String(d.select('.bookcover img').attr('src')),l:t('a.bookchapter')});", "intro": "$.o", "kind": "$.k", "lastChapter": "$.l", "name": "$.n", "tocUrl": "{{baseUrl}}##/book/##/chapter/", "wordCount": "$.w"}, "ruleContent": {"content": "@js:var d=Packages.org.jsoup.Jsoup.parse(String(result));var es=d.select('#content p');var a=[];for(var i=0;i<es.size();i++){var t=String(java.t2s(String(es.get(i).text())));if(t.length>0)a.push(t);}a.join(String.fromCharCode(10));", "title": "@js:java.t2s(String(Packages.org.jsoup.Jsoup.parse(String(result)).select('h1').text()));"}, "ruleExplore": {"author": "$.author", "bookList": "@js:var d=Packages.org.jsoup.Jsoup.parse(String(result));function t(x){return String(java.t2s(String(x)));}var a=[];var bs=d.select('.item');if(bs.size()>0){for(var i=0;i<bs.size();i++){var b=bs.get(i),n=b.select('dl dt a[href^=/book/]');if(n.size()>0)a.push({name:t(n.text()),author:t(b.select('dl dt span').text()),intro:t(b.select('dl dd').text()),coverUrl:String(b.select('.image img').attr('src')),bookUrl:String(n.attr('href'))});}}else{bs=d.select('.bookbox');for(var i=0;i<bs.size();i++){var b=bs.get(i),au=b.select('.author'),n=b.select('.bookname a'),up=b.select('.update');var o=String(up.attr('title'));if(!o)o=String(up.text());if(n.size()>0)a.push({name:t(n.text()),author:t(au.size()?au.get(0).text():'').replace(/^作者[：:]/,'').trim(),wordCount:t(au.size()>1?au.get(1).text():'').replace(/^字数[：:]/,'').trim(),intro:t(o).replace(/^简介[：:]/,'').trim(),lastChapter:t(b.select('.cat a').text()),bookUrl:String(n.attr('href'))});}}for(var twkIndex=0;twkIndex<a.length;twkIndex++){a[twkIndex]=String(JSON.stringify(a[twkIndex]));}a;", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "intro": "$.intro", "lastChapter": "$.lastChapter", "name": "$.name", "wordCount": "$.wordCount"}, "ruleSearch": {"author": "$.author", "bookList": "@js:var d=Packages.org.jsoup.Jsoup.parse(String(result));function t(x){return String(java.t2s(String(x)));}var a=[];var bs=d.select('.item');if(bs.size()>0){for(var i=0;i<bs.size();i++){var b=bs.get(i),n=b.select('dl dt a[href^=/book/]');if(n.size()>0)a.push({name:t(n.text()),author:t(b.select('dl dt span').text()),intro:t(b.select('dl dd').text()),coverUrl:String(b.select('.image img').attr('src')),bookUrl:String(n.attr('href'))});}}else{bs=d.select('.bookbox');for(var i=0;i<bs.size();i++){var b=bs.get(i),au=b.select('.author'),n=b.select('.bookname a'),up=b.select('.update');var o=String(up.attr('title'));if(!o)o=String(up.text());if(n.size()>0)a.push({name:t(n.text()),author:t(au.size()?au.get(0).text():'').replace(/^作者[：:]/,'').trim(),wordCount:t(au.size()>1?au.get(1).text():'').replace(/^字数[：:]/,'').trim(),intro:t(o).replace(/^简介[：:]/,'').trim(),lastChapter:t(b.select('.cat a').text()),bookUrl:String(n.attr('href'))});}}for(var twkIndex=0;twkIndex<a.length;twkIndex++){a[twkIndex]=String(JSON.stringify(a[twkIndex]));}a;", "bookUrl": "$.bookUrl", "checkKeyWord": "斗破苍穹", "coverUrl": "$.coverUrl", "intro": "$.intro", "lastChapter": "$.lastChapter", "name": "$.name", "wordCount": "$.wordCount"}, "ruleToc": {"chapterList": "@js:var d=Packages.org.jsoup.Jsoup.parse(String(result));var es=d.select('#allchapter a');var a=[];for(var i=0;i<es.size();i++){var u=String(es.get(i).attr('href'));if(/^[/]chapter[/][A-Za-z0-9]+[/][A-Za-z0-9]{10,}[.]html$/.test(u))a.push({n:String(java.t2s(String(es.get(i).text()))),u:u});}for(var twkIndex=0;twkIndex<a.length;twkIndex++){a[twkIndex]=String(JSON.stringify(a[twkIndex]));}a;", "chapterName": "$.n", "chapterUrl": "$.u", "nextTocUrl": "@js:var d=Packages.org.jsoup.Jsoup.parse(String(result));var u=String(d.select('#linkNext').attr('href'));/^[/]chapter[/][A-Za-z0-9]+[/][0-9]+[.]html$/.test(u)?u:'';"}, "searchUrl": "https://www.twkan.cc/search/{{key}}/{{page}}.html", "weight": 0},{"bookSourceComment": "2026-09-17：默认文字转简体，URL保持原样。twkan.com此前访问异常，本源使用twkan.cc，不保证旧书ID互通。公开页面匿名可读，未发现账号入口。请求间隔2秒；遇验证或限频停止并提示，需手动验证。搜索/分类列表无封面，详情有封面。 2026-09-17 E兼容修复：搜索、发现、目录返回逐项JSON字符串数组，字段继续JSONPath；并非整数组JSON.stringify。", "bookSourceGroup": "AI", "bookSourceName": "台湾小说网(twkan.cc)", "bookSourceType": 0, "bookSourceUrl": "https://twkan.cc/", "bookUrlPattern": "https?://(?:www[.])?twkan[.]cc/book/[A-Za-z0-9]+[.]html", "concurrentRate": "1/2000", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "热门推荐::https://www.twkan.cc/\n玄幻::https://www.twkan.cc/library/4ZyXBmkpBKE0CZre8xpWft/{{page}}.html\n仙侠::https://www.twkan.cc/library/1atwJtoBJ6G7Jyb6FDlPtT/{{page}}.html\n都市::https://www.twkan.cc/library/2gr4z5Jz9ZNM1NLXrJORkN/{{page}}.html\n历史::https://www.twkan.cc/library/9WnLjlGrA2WzBYwdH9nRx/{{page}}.html\n科幻::https://www.twkan.cc/library/7dG222CnytPNTX5EtjGxCC/{{page}}.html\n军事::https://www.twkan.cc/library/5lIKnscgjyDeHoxgM85ygm/{{page}}.html\n言情::https://www.twkan.cc/library/UmyEUPcEoKK6p2oAcoUSC/{{page}}.html\n轻小说::https://www.twkan.cc/library/1nENalPqLsPaObjhtw3Gpf/{{page}}.html\n悬疑::https://www.twkan.cc/library/4bAvYg9ZmMQ9CuvQqPVcG8/{{page}}.html\n奇幻::https://www.twkan.cc/library/1MlyhP24PsZBlLfJDFqoqA/{{page}}.html\n游戏::https://www.twkan.cc/library/4vINQfiwMRl0Kl1fB3ihZt/{{page}}.html\n诸天无限::https://www.twkan.cc/library/3QhTcsMkxFzF1YDLzO48oc/{{page}}.html\n武侠::https://www.twkan.cc/library/67Fc3zzuMkZWcG7oH7jF2Z/{{page}}.html\n重生::https://www.twkan.cc/library/1Ce9LrTxPyHhrQ2gW2F52y/{{page}}.html\n体育::https://www.twkan.cc/library/1RgQeN9n69lr7osC8JqSbo/{{page}}.html\n现实::https://www.twkan.cc/library/2Kkc6czsCFOv3Vhy2gfJBJ/{{page}}.html\n穿越::https://www.twkan.cc/library/24S6D6q7GI2NbHaHpWfWdO/{{page}}.html\n未删减::https://www.twkan.cc/library/3Wx5Kt8fHBA1qK73EEwpXP/{{page}}.html\n人气榜::https://www.twkan.cc/ranking/hits/{{page}}.html\n全本小说::https://www.twkan.cc/full/{{page}}.html", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36\",\"Referer\":\"https://www.twkan.cc/\"}", "lastUpdateTime": "1789634422834", "loginCheckJs": "(function(){var b=result.body;if(typeof b==='function')b=b.call(result);b=String(b);var c=result.code;if(typeof c==='function')c=c.call(result);var msg='';if(Number(c)===429||/搜索间隔|搜索間隔|请求过于频繁|請求過於頻繁/.test(b))msg='站点限频，请暂停搜索后再试';else if(/<title>Just a moment|<title>Attention Required/.test(b))msg='站点要求人机验证，请使用书源菜单打开网站手动完成';else if(Number(c)>=400)msg='站点HTTP错误 '+c+'，请稍后重试';if(msg){java.toast(msg);throw new Error(msg);}return result;})()", "loginUi": "<js>JSON.stringify([{name:'检查访问状态',type:'button',action:'checkSite()'},{name:'打开网站',type:'button',action:'openSite()'}])</js>", "loginUrl": "function checkSite(){try{var t=Date.now();var h=String(java.ajax('https://www.twkan.cc/'));var d=Packages.org.jsoup.Jsoup.parse(h);if(d.select('.item dl dt a[href^=/book/]').size()>0){java.toast('站点可直连，当前可匿名阅读；公开页面未发现账号登录入口。耗时 '+(Date.now()-t)+'ms');}else{java.toast('未取得正常书单，可能需要验证或站点暂时不可用');}}catch(e){java.toast('访问失败：'+e);}}function openSite(){java.startBrowser('https://www.twkan.cc/','台湾小说网');}function login(){checkSite();}", "respondTime": 180000, "ruleBookInfo": {"author": "$.a", "coverUrl": "$.c", "init": "@js:var d=Packages.org.jsoup.Jsoup.parse(String(result));function t(s){return String(java.t2s(String(d.select(s).text())));}var o=t('.bookintro');var at=o.indexOf('本书由思兔小说');if(at>=0)o=o.substring(0,at);JSON.stringify({n:t('h1.booktitle'),a:t('.booktag a.red'),k:t('.booktag a.blue')+','+t('.booktag span.red'),w:t('.booktag span.blue').split(' ')[0],o:o,c:String(d.select('.bookcover img').attr('src')),l:t('a.bookchapter')});", "intro": "$.o", "kind": "$.k", "lastChapter": "$.l", "name": "$.n", "tocUrl": "{{baseUrl}}##/book/##/chapter/", "wordCount": "$.w"}, "ruleContent": {"content": "@js:var d=Packages.org.jsoup.Jsoup.parse(String(result));var es=d.select('#content p');var a=[];for(var i=0;i<es.size();i++){var t=String(java.t2s(String(es.get(i).text())));if(t.length>0)a.push(t);}a.join(String.fromCharCode(10));", "title": "@js:java.t2s(String(Packages.org.jsoup.Jsoup.parse(String(result)).select('h1').text()));"}, "ruleExplore": {"author": "$.author", "bookList": "@js:var d=Packages.org.jsoup.Jsoup.parse(String(result));function t(x){return String(java.t2s(String(x)));}var a=[];var bs=d.select('.item');if(bs.size()>0){for(var i=0;i<bs.size();i++){var b=bs.get(i),n=b.select('dl dt a[href^=/book/]');if(n.size()>0)a.push({name:t(n.text()),author:t(b.select('dl dt span').text()),intro:t(b.select('dl dd').text()),coverUrl:String(b.select('.image img').attr('src')),bookUrl:String(n.attr('href'))});}}else{bs=d.select('.bookbox');for(var i=0;i<bs.size();i++){var b=bs.get(i),au=b.select('.author'),n=b.select('.bookname a'),up=b.select('.update');var o=String(up.attr('title'));if(!o)o=String(up.text());if(n.size()>0)a.push({name:t(n.text()),author:t(au.size()?au.get(0).text():'').replace(/^作者[：:]/,'').trim(),wordCount:t(au.size()>1?au.get(1).text():'').replace(/^字数[：:]/,'').trim(),intro:t(o).replace(/^简介[：:]/,'').trim(),lastChapter:t(b.select('.cat a').text()),bookUrl:String(n.attr('href'))});}}for(var twkIndex=0;twkIndex<a.length;twkIndex++){a[twkIndex]=String(JSON.stringify(a[twkIndex]));}a;", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "intro": "$.intro", "lastChapter": "$.lastChapter", "name": "$.name", "wordCount": "$.wordCount"}, "ruleSearch": {"author": "$.author", "bookList": "@js:var d=Packages.org.jsoup.Jsoup.parse(String(result));function t(x){return String(java.t2s(String(x)));}var a=[];var bs=d.select('.item');if(bs.size()>0){for(var i=0;i<bs.size();i++){var b=bs.get(i),n=b.select('dl dt a[href^=/book/]');if(n.size()>0)a.push({name:t(n.text()),author:t(b.select('dl dt span').text()),intro:t(b.select('dl dd').text()),coverUrl:String(b.select('.image img').attr('src')),bookUrl:String(n.attr('href'))});}}else{bs=d.select('.bookbox');for(var i=0;i<bs.size();i++){var b=bs.get(i),au=b.select('.author'),n=b.select('.bookname a'),up=b.select('.update');var o=String(up.attr('title'));if(!o)o=String(up.text());if(n.size()>0)a.push({name:t(n.text()),author:t(au.size()?au.get(0).text():'').replace(/^作者[：:]/,'').trim(),wordCount:t(au.size()>1?au.get(1).text():'').replace(/^字数[：:]/,'').trim(),intro:t(o).replace(/^简介[：:]/,'').trim(),lastChapter:t(b.select('.cat a').text()),bookUrl:String(n.attr('href'))});}}for(var twkIndex=0;twkIndex<a.length;twkIndex++){a[twkIndex]=String(JSON.stringify(a[twkIndex]));}a;", "bookUrl": "$.bookUrl", "checkKeyWord": "斗破苍穹", "coverUrl": "$.coverUrl", "intro": "$.intro", "lastChapter": "$.lastChapter", "name": "$.name", "wordCount": "$.wordCount"}, "ruleToc": {"chapterList": "@js:var d=Packages.org.jsoup.Jsoup.parse(String(result));var es=d.select('#allchapter a');var a=[];for(var i=0;i<es.size();i++){var u=String(es.get(i).attr('href'));if(/^[/]chapter[/][A-Za-z0-9]+[/][A-Za-z0-9]{10,}[.]html$/.test(u))a.push({n:String(java.t2s(String(es.get(i).text()))),u:u});}for(var twkIndex=0;twkIndex<a.length;twkIndex++){a[twkIndex]=String(JSON.stringify(a[twkIndex]));}a;", "chapterName": "$.n", "chapterUrl": "$.u", "nextTocUrl": "@js:var d=Packages.org.jsoup.Jsoup.parse(String(result));var u=String(d.select('#linkNext').attr('href'));/^[/]chapter[/][A-Za-z0-9]+[/][0-9]+[.]html$/.test(u)?u:'';"}, "searchUrl": "https://www.twkan.cc/search/{{key}}/{{page}}.html", "weight": 0},{"bookSourceComment": "\n//登录切换接口，默认秋风。\n//更改接口需刷新发现列表。\n//可在首页书架添加以下网址：\n春雨书屋\nhttps://www.chunyushuwu.com\n夏日书屋\nhttps://www.xiarishuwu.com\n秋风书屋\nhttps://www.qiufengshuwu.com\n冬雪书屋\nhttps://www.dongxueshuwu.com", "bookSourceGroup": "☣️精选senhora", "bookSourceName": "四季书屋", "bookSourceType": 0, "bookSourceUrl": "sjsw:youke", "bookUrlPattern": "https?://www.(chunyushuwu|xiarishuwu|qiufengshuwu|dongxueshuwu).com/book/\\d+.html", "customButton": false, "customOrder": -124, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\neval(String(source.loginUrl));\nvar sort=[],\npush=(title,surl,size)=>sort.push({\n\t\ttitle: title,\n\t\turl: surl?url+surl:\"\",\n\t\tstyle: {\n\t\t\t\tlayout_flexGrow: 1,\n\t\t\t\tlayout_flexBasisPercent: size\n\t\t\t}\n\t});\n\t\npush(\"小说分类\",null,1);\n\nvar kind=[\"男频小说\",\"女频小说\",\"中国文学\",\"外国文学\",\"轻小说\",\"百合小说\",\"耽美小说\",\"网盘资源\"].map((title,i)=>{\n\tlink=`/sort/${i+1}_{{page}}/`;\n\tpush(title,link,0.25)\n\t})\n\t\nvar xbook=\"/top/postdate_{{page}}/\";\npush(\"新书\",xbook,0.4);\npush(\"完本\",\"/full/{{page}}/\",0.4);\npush(\"排行榜单\",null,1);\nvar ztop=\"/top/allvisit_{{page}}/\";\npush(\"总排行榜\",ztop,0.25);\n\nvar top=[\n[\"日点击榜\",\"dayvisit\"],\n[\"周点击榜\",\"weekvisit\"],\n[\"月点击榜\",\"monthvisit\"],\n[\"总点击榜\",\"allvisit\"],\n[\"总推荐榜\",\"allvote\"],\n[\"字数排行\",\"size\"],\n[\"最新入库\",\"postdate\"],\n[\"最近更新\",\"lastupdate\"]\n].map(([title,u],i)=>{\n\tlink=`/top/${u}_{{page}}/`;\n\tpush(title,link,0.25)\n\t})\n\t\nJSON.stringify(sort)", "header": "{\n\t\"User-Agent\": \"Mozilla/5.0 (Linux; Android 9) Mobile Safari/537.36\",\n\"Referer\": \"{{baseUrl}}\"\n\t}", "lastUpdateTime": "1789574097036", "loginUi": "[\n    {\n        name: \"设置要使用的接口\",\n        type: \"button\",\n        action: \"java.toast('点击下面按钮即可设置，更改接口后需长按发现列表刷新。')\"\n    },\n    {\n        name: \"显示当前的接口\",\n        type: \"button\",\n        action: \"get(v)\"\n    },\n    {\n    \t   name: \"接口1：春雨书屋\",\n    \t   type: \"button\",\n    \t   action: \"set(1)\"\n    \t},\n    \t{\n    \t   name: \"接口2：夏日书屋\",\n    \t   type: \"button\",\n    \t   action: \"set(2)\"\n    \t},\n    \t{\n    \t   name: \"接口3：秋风书屋\",\n    \t   type: \"button\",\n    \t   action: \"set(3)\"\n    \t},\n    \t{\n    \t   name: \"接口4：冬雪书屋\",\n    \t   type: \"button\",\n    \t   action: \"set(4)\"\n    \t}\n]", "loginUrl": "//接口设置，以及链接\nvar v=source.getVariable(),\nc=\"https://www.chunyushuwu.com\",\nx=\"https://www.xiarishuwu.com\",\nq=\"https://www.qiufengshuwu.com\",\nd=\"https://www.dongxueshuwu.com\";\nvar data={\n\t1:\"1：春雨书屋\\n\"+c,\n\t2:\"2：夏日书屋\\n\"+x,\n\t3:\"3：秋风书屋\\n\"+q,\n\t4:\"4：冬雪书屋\\n\"+d\n\t}//接口数据\n//判断接口\nif(!v||v==\"\"){\n\tv=3;\n\tsource.setVariable(v);\n\tjava.toast(\"未设置接口，使用默认秋风。\")\n\t}else(v=v)\n//设置保存接口\nfunction set(num){\n\tvar show=\"设置成功！当前接口：\\n接口\";\n\tjava.toast(show+data[num]);\n\treturn source.setVariable(num)\n\t}\n//获取显示接口\nfunction get(v){\n\tvar show=\"当前接口：\\n接口\"+data[v];\n\treturn java.longToast(show)\n\t}\n\t//按接口获取网址\nvar url;\nurl=v==1?c:v==2?x:v==3?q:v==4?d:q;\nurl;", "respondTime": 180000, "ruleBookInfo": {"author": ".infotype a@text", "canReName": "1", "coverUrl": ".infohead img@src", "intro": "#intro p@text", "kind": ".infotype p.1:2:3@text##.*：", "lastChapter": ".list_xm a.0@text", "name": ".cataloginfo h3@text", "tocUrl": ".gochapter a@href"}, "ruleContent": {"content": "#novelcontent p@html"}, "ruleExplore": {"author": "p.author@text", "bookList": ".article||.full_content||.articlegeneral", "bookUrl": "a.0@href", "coverUrl": "img@data-src||a.0@href\n@js:\nvar id,iid,img,\nhtml=/html/;\nif(html.test(result)){\n\tid=result.match(/\\d+/)[0];\n\tiid=parseInt(id/1000);\nimg=`https://www.pilixiaoshuo.com/files/article/image/${iid}/${id}/${id}s.jpg`;\n\t}else{img=result}\nimg;", "intro": "p.simple@text", "kind": ".p1@text##\\[|\\]", "name": "h6@text||.p2@text"}, "ruleSearch": {"author": "a.1@text", "bookList": "p.sone", "bookUrl": "a.0@href", "checkKeyWord": "剑来", "coverUrl": "a.0@href\n@js:\nvar id=result.match(/\\d+/)[0],\niid=parseInt(id/1000);\n`https://www.pilixiaoshuo.com/files/article/image/${iid}/${id}/${id}s.jpg`", "kind": "0", "name": "a.0@text"}, "ruleToc": {"chapterList": "ul.chapters li ", "chapterName": "text", "chapterUrl": "a@href", "isVolume": ".juan@text"}, "searchUrl": "{{eval(String(source.loginUrl));\nurl}}/s.html,{\n  \"body\": \"s={{key}}&type=articlename\",\n  \"charset\": \"GBK\",\n  \"method\": \"POST\"\n}", "variableComment": "1：春雨书屋\n2：夏日书屋\n3：秋风书屋\n4：冬雪书屋", "weight": 0},{"bookSourceComment": "移动网好像访问不了，连wifi可以访问，质量还不错的网站", "bookSourceGroup": "☣️精选senhora", "bookSourceName": "🎬 奇优影院", "bookSourceType": 0, "bookSourceUrl": "http://1e6e.com/", "customButton": false, "customOrder": -128, "enabled": true, "enabledCookieJar": false, "enabledExplore": false, "eventListener": false, "header": "{\n\t\"User-Agent\":\"Mozilla/5.0 (Linux; Android 10; MI 8 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.127 Mobile Safari/537.36\"\n\t}", "lastUpdateTime": "1789574123012", "respondTime": 7228, "ruleBookInfo": {"intro": "class.stui-pannel_bd.1@class.col-pd@text##.*第一时间为你提供.*在线免费观看，.*讲述了##<br>"}, "ruleContent": {"content": "id.playbox@iframe@src\n@js:\nif(book.durChapterIndex==chapter.index){\n\t\tjava.startBrowser(result,title)\n\t\tjava.toast('正在加载视频\\n视频加载较慢，请耐心等待')\n\t}\n'【刷新正文】播放\\n✅直链:\\n'+result"}, "ruleExplore": [], "ruleSearch": {"author": "class.line2@ownText## / | ##,", "bookList": "class.stui-vodlist__media@li", "bookUrl": "a.0@href", "coverUrl": "a@data-original", "intro": "{{\"📺奇优影院\"}}", "kind": "class.hidden-mi@text##(类型|地区|年份)：##,", "lastChapter": "class.pic-text@text", "name": "class.title@text"}, "ruleToc": {"chapterList": "<js>\nall=\"\"\nlen=java.getElements('class.nav-tabs@li').length\nfor(i=1;i<=len;i++){\nfrom=java.getElements('class.nav-tabs@li')[i-1].text()\nres=java.getElements('class.stui-content__playlist')[i-1]\nres=JSON.stringify(res).replace(/<\\/a>/g,'<p>'+'🎬'+from+'</p></a>')\nall+=JSON.parse(res)\n}\nall\n</js>\nclass.stui-content__playlist@li@a", "chapterName": "ownText", "chapterUrl": "href##$##,{\"webView\":true}", "updateTime": "p@text"}, "searchUrl": "/search.php,{\n\t\"charset\":\"UTF-8\",\n\t\"method\":\"POST\",\n\t\"body\":\"searchword={{key}}\"\n\t}", "weight": 0},{"bookSourceComment": "最新 order=1\n人气 order=2\n连载 order=4\n完结 order=5", "bookSourceGroup": "☘️广播剧", "bookSourceName": "水山听书（优+）", "bookSourceType": 1, "bookSourceUrl": "https://m.ting13.cc", "concurrentRate": "380", "customButton": false, "customOrder": 22, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nsort=[];\npush=(title,url,type1,type2)=>sort.push({\n\t\ttitle: title,\n\t\turl: url,\n\t\tstyle: {\n\t\t\t\tlayout_flexGrow: type1,\n\t\t\t\tlayout_flexBasisPercent: type2\n\t\t\t}\n\t});\n\t\nfl=[[\"玄幻修真\",\"xuanhuan\"],[\"灵异惊悚\",\"lingyi\"],[\"都市言情\",\"dushi\"],[\"军事历史\",\"junshi\"],[\"儿童故事\",\"ertong\"],[\"经典纪实\",\"jishi\"],[\"长篇评书\",\"pingshu\"],[\"相声戏曲\",\"xiangsheng\"],[\"综艺娱乐\",\"yule\"],[\"百家讲坛\",\"bjjt\"],[\"网游竞技\",\"jingji\"],[\"官场商战\",\"guanchangshangzhan\"],[\"人物传记\",\"chuanji\"],[\"通俗文学\",\"wenxue\"],[\"其他有声\",\"qita\"]];\n\n [[\"连载\",\"lastupdate\"],[\"完结\",\"over\"]].map([title,status]=>{\n\tpush('🔖分类'+title+'🔖', null, 1, 1);\n\t  fl.map(([title,uri],index)=>{\n\t    url= `/yousheng/${uri}/${status}/{{page}}.html`;\n\tif(index+1 <= fl.length - fl.length%3)\n\t\t\t {\tpush(title, url, 1, 0.25);}\n\t\t\t\telse{ push(title, url, 0, 0.29);}\n     \t\n    \t});\n\t});\n\nJSON.stringify(sort);", "header": "@js:\n\noption = {\n  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 8.1.0; JKM-AL00b Build/HUAWEIJKM-AL00b; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044807 Mobile Safari/536\"+Date.now().toString().slice(0, 8),\n   \"accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\",\n   \"accept-language\": \"zh-CN,zh;q=0.9\",\n  \"upgrade-insecure-requests\": \"1\",\n   \"x-requested-with\": \"XMLHttpRequest\",\n   \"Referer\": \"https://m.ting13.cc/novelsearch/search/result.html\"\n}\n\nJSON.stringify(option)", "jsLib": "function _0x39d980(_0x4c1c5c) {\n    var _0x4b93ce = \"PXhw7U1B0a9kQDKZsTjIASmOeNzxYG4CHo1JyRfg2b8FLpEvr3FtVnlqMidu6c\",\n        _0x54feb0 = \"\";\n    for (var _0x32fd00 = 0; _0x32fd00 < _0x4c1c5c.length; _0x32fd00++) {\n        {\n            var _0x4fac68 = _0x4b93ce.indexOf(_0x4c1c5c[_0x32fd00]);\n            if (_0x4fac68 == -1) var _0x3b3ff4 = _0x4c1c5c[_0x32fd00];\n            else var _0x3b3ff4 = _0x4b93ce[(_0x4fac68 + 3) % 62];\n            var _0x2be90a = parseInt(Math.random() * 62, 10);\n            var _0x29466b = parseInt(Math.random() * 62, 10);\n            _0x54feb0 += _0x4b93ce[_0x2be90a] + _0x3b3ff4 + _0x4b93ce[_0x29466b];\n        }\n    }\n    return _0x54feb0;\n}", "lastUpdateTime": 1779274596356, "loginCheckJs": "if (String(result.body()).length < 150) {\n\t java.log(\"重\")\n\t result = java.connect(result.url())\n} else result\n\n\nif (result.body().includes(\"即将跳转</font>\")) {\n\ta = \torg.jsoup.Jsoup.parse(result.body())\n\turl = source.key+a.select(\".notfoud-container a\").attr(\"href\")\n\tjava.log(\"一级跳转：\"+url)\n\tresult = java.connect(url)\n}\n\nif (result.body().includes('\"data\":null')) {\n\tcookie.removeCookie(source.key)\n\turl = source.key+`/novelsearch/search/result.html,{\n  \"body\": \"searchword=${key}\",\n  \"method\": \"POST\"\n}`\n\tjava.log(\"一级搜索：\"+url)\n\tjava.ajax(url)\n\tresult = java.getStrResponse()\n} else result\n\nif (result.body().includes(\"var reversed =\")) {\n\t a = String(result.body()).match(/var reversed = \"(.+)\"/)[1]\n\t code = a.split('').reverse().join('');\n\t c = java.base64Decode(code)\n\t cc = String(c).match(/var token = '([^']+)'/)[1]\n\t c1 = \"__51guid__=\"+encodeURIComponent(cc)\n\t java.log(c1)\n\t cookie.replaceCookie(source.key, c1)\n\t result = java.connect(result.url())\n} else result\n", "loginUrl": "https://m.ting13.cc/user/index.html", "respondTime": 156707, "ruleBookInfo": {"author": ".book-rand-a.2@text", "coverUrl": "[property=\"og:image\"]@content", "intro": "🔔 更新时间： {{@@.book-rand-a.4@text##连载|完结}}\n📯 {{@@.book-rand-a.3@text}}\n🏷 {{@@.book-rand-a.1@text}}\n📂 内容简介：{{@@.book-des@text}}##(^|[。！？]+[”」）】]?)##$1<br>", "kind": "{{@@.book-rand-a a.0@text}}\n{{@@.book-rand-a.4@text##\\s.*}}", "name": "h1@text", "tocUrl": "text.全部章节@href"}, "ruleContent": {"content": "<js>\n$ = val => org.jsoup.Jsoup.parse(result).select(val)\n\nvar _b = $(\"meta[name='_b']\").attr(\"content\"),\n    _p = $(\"meta[name='_p']\").attr(\"content\"),\n    _0x5d58e9 = $(\"meta[name='_n']\").attr(\"content\"),\n    _d = $(\"meta[name='_d']\").attr(\"content\");\n\nvar option = {};\noption.sc = $(\"meta[name='_c']\").attr(\"content\");\noption.sp = _0x39d980(String($(\"meta[name='_c']\").attr(\"content\")));\n\nbody = `nid=${_b}&cid=${_p}&sort=${_d}`\nurl = `https://m.ting13.cc/api/mapi/play,{\n  \"body\": \"${body}\",\n  \"headers\": ${JSON.stringify(option)},\n  \"method\": \"POST\"\n}`\njava.log(url)\nj = JSON.parse(java.ajax(url))\nj.status==200?j.url:java.toast(j.msg)\n</js>"}, "ruleExplore": {"author": "演播：{{@@.book-meta.1@text}}", "bookList": ".book-li", "bookUrl": "a.0@href", "coverUrl": "img@data-original", "intro": ".book-desc@text", "kind": "{{@@.score@text}}\n{{@@.playCountText@text}}℃\n{{@@h4 span@text}}", "lastChapter": ".book-meta.0@text", "name": "h4 a.0@text"}, "ruleSearch": {"author": "{{$.author.name}}  演播：{{$.boyin.name}}", "bookList": "$.data[*]", "bookUrl": "$.novel.url", "checkKeyWord": "悦后即焚", "coverUrl": "$.novel.cover", "intro": "$.novel.intro", "kind": "{{$.novel.isovername}}\n{{$.data.allvisit}}℃\n{{$.novel.lasttime}}", "lastChapter": "$.novel.lastname", "name": "$.novel.name"}, "ruleToc": {"chapterList": ".play-list li", "chapterName": "a@textNodes", "chapterUrl": "a@href", "nextTocUrl": ".chapter-list-block li a@href", "updateTime": "span@text"}, "searchUrl": "/api/ajax/solist?word={{key}}&type=name&page={{page}}&order=1", "weight": 0},{"bookSourceComment": "七猫小说 · 妍希（原作者）\n// 2026/09/16 By sjshb57 二改内容如下：\n· 正文：弃用失效的第三方接口，改为七猫官方接口 + AES 解密\n· 短篇：自动带 reader_agent=1，修复部分书籍报错\n· 出版物：自动解压 EPUB 章节，支持文字与图片\n· 重构：签名/请求头/接口统一收进 jsLib，规则精简\n· 修正：@put 规范写法、简介标签去重\n· 发现页：按官方分类目录重写（男频/女频/出版）\n  - 分组可折叠，支持状态/字数/排序筛选\n  - 等宽格子排版，短标签 4 列、长标签 3 列，空位补齐", "bookSourceGroup": "🌙 小说", "bookSourceName": "🌙 七猫小说 · API", "bookSourceType": 0, "bookSourceUrl": "https://api-bc.wtzw.com", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nvar cfg = {};\ntry { cfg = JSON.parse(String(source.getVariable() || '{}')) || {}; } catch (e) {}\n\nvar CH = [['男频', '♂', 1], ['女频', '♀', 2], ['出版', '✎', 3]];\nvar ch = CH.filter(function (c) { return c[0] == cfg.ch; })[0] || CH[0];\nvar DEF_OPEN = {'男频|热门': 1, '女频|热门': 1, '出版|热门': 1};\nvar open = cfg.open || DEF_OPEN;\nvar over = cfg.over || '-99', words = cfg.words || '-99', sort = cfg.sort || '0';\n\nvar OVER = [['全部状态', '-99'], ['完结', '1'], ['连载', '0']];\nvar WORDS = [['全部字数', '-99'], ['50万以下', '1'], ['50-100万', '2'], ['100-300万', '3'], ['300万以上', '4']];\nvar SORT = [['按热度', '0'], ['按更新', '1'], ['按评分', '2'], ['按新书', '3']];\nfunction label(opts, v) { return (opts.filter(function (o) { return o[1] == v; })[0] || opts[0])[0]; }\n\nvar LAYOUT = {gap: 0.042, pad: 0.068, ch: 0.0368, shortMax: 3.3};\n\nfunction textWidth(t) {\n    var w = 0;\n    for (var i = 0; i < t.length; i++) {\n        var c = t.charCodeAt(i);\n        if (c == 32) w += 0.32;\n        else if (c < 128) w += 0.65;\n        else if (c == 0xB7) w += 0.5;\n        else if (c == 0x25CF) w += 0.9;\n        else w += 1;\n    }\n    return w;\n}\n\nvar s = [];\n\nfunction pack(items, cols) {\n    cols = cols || 4;\n    var g = LAYOUT.gap, cell = (1 - g * (cols - 1)) / cols;\n    var fit = (cell - LAYOUT.pad) / LAYOUT.ch;\n    var queue = items.map(function (it) {\n        return {it: it, span: Math.min(cols, Math.ceil(textWidth(it.title) / fit) || 1)};\n    });\n    while (queue.length) {\n        var row = [], left = cols;\n        while (queue.length && left > 0) {\n            var k = 0;\n            while (k < queue.length && queue[k].span > left) k++;\n            if (k == queue.length) break;\n            var x = queue.splice(k, 1)[0];\n            row.push(x); left -= x.span;\n        }\n        for (; left > 0; left--) row.push({it: {title: '　', url: ''}, span: 1});\n        row.forEach(function (x, i) {\n            var st = {layout_flexGrow: x.span, layout_flexBasisPercent: Math.round((x.span / (cols + 1) + (x.span - 1) * g) * 1e4) / 1e4};\n            if (i == 0) st.layout_wrapBefore = true;\n            x.it.style = st;\n            s.push(x.it);\n        });\n    }\n}\n\nfunction action(js) {\n    return \"(function(){var c={};try{c=JSON.parse(String(source.getVariable()||'{}'))||{};}catch(e){}\"\n        + js + \"source.setVariable(JSON.stringify(c));java.refreshExplore();})()\";\n}\nfunction button(title, js) {\n    return {title: title, type: 'button', action: action(js)};\n}\nfunction bar(title, js) {\n    var b = button(title, js);\n    b.style = {layout_flexGrow: 1, layout_flexBasisPercent: 1, layout_wrapBefore: true};\n    s.push(b);\n}\nfunction optionRow(key, opts, cur) {\n    pack(opts.map(function (o) {\n        return button((o[1] == cur ? '● ' : '') + o[0], 'c[' + JSON.stringify(key) + ']=' + JSON.stringify(o[1]) + ';');\n    }), 3);\n}\n\npack(CH.map(function (c) {\n    return button((c[0] == ch[0] ? '● ' : '') + c[1] + ' ' + c[0], 'c.ch=' + JSON.stringify(c[0]) + ';');\n}), 3);\n\nvar filterTitle = '⚙ 筛选：' + label(OVER, over) + ' · ' + label(WORDS, words) + ' · ' + label(SORT, sort);\nbar(filterTitle + (cfg.filt ? '　▾' : '　▸'), 'c.filt=!c.filt;');\nif (cfg.filt) {\n    optionRow('over', OVER, over);\n    optionRow('words', WORDS, words);\n    optionRow('sort', SORT, sort);\n}\n\nQM_TAGS[ch[0]].forEach(function (g) {\n    var key = ch[0] + '|' + g[0];\n    var items = g[1].split(',');\n    var isOpen = !!open[key];\n    bar((isOpen ? '▾ ' : '▸ ') + g[0] + '（' + items.length + '）',\n        'var o=c.open||' + JSON.stringify(DEF_OPEN) + ';var k=' + JSON.stringify(key) + ';if(o[k])delete o[k];else o[k]=1;c.open=o;');\n    if (!isOpen) return;\n    var short = [], long = [];\n    items.forEach(function (it) {\n        var kv = it.split(':');\n        var tag = {title: kv[0], url: '{{qmTag(' + ch[2] + ',' + kv[1] + ',page,' + over + ',' + words + ',' + sort + ')}}'};\n        (textWidth(kv[0]) > LAYOUT.shortMax ? long : short).push(tag);\n    });\n    pack(short, 4);\n    pack(long, 3);\n});\n\nJSON.stringify(s);\n", "jsLib": "var QM_KEY = 'd3dGiJc651gSQ8w1';\nvar QM_AES = '242ccb8230d709e1';\nvar QM_BC = 'https://api-bc.wtzw.com';\nvar QM_KS = 'https://api-ks.wtzw.com';\n\nfunction qmMd5(s) {\n    var b = Packages.java.security.MessageDigest.getInstance('MD5')\n        .digest(new Packages.java.lang.String(s).getBytes('UTF-8'));\n    var h = '';\n    for (var i = 0; i < b.length; i++) {\n        var x = (b[i] & 0xff).toString(16);\n        h += (x.length < 2 ? '0' : '') + x;\n    }\n    return h;\n}\n\nfunction qmSign(o) {\n    return qmMd5(Object.keys(o).sort().map(function (k) { return k + '=' + o[k]; }).join('') + QM_KEY);\n}\n\nvar QM_HEADERS = (function () {\n    var h = {'app-version': '80400', 'platform': 'android', 'reg': '0', 'AUTHORIZATION': '',\n             'application-id': 'com.****.reader', 'net-env': '1', 'channel': 'unknown', 'qm-params': ''};\n    h.sign = qmSign(h);\n    return JSON.stringify({headers: h});\n})();\n\nfunction qmUrl(base, path, params) {\n    params.sign = qmSign(params);\n    var q = Object.keys(params).map(function (k) {\n        return k + '=' + encodeURIComponent(params[k]);\n    }).join('&');\n    return base + path + '?' + q + ',' + QM_HEADERS;\n}\n\nfunction qmSearch(key, page) {\n    return qmUrl(QM_BC, '/search/v1/words', {gender: '3', imei_ip: '2937357107', page: page, wd: key});\n}\nfunction qmDetail(id) {\n    return qmUrl(QM_BC, '/api/v4/book/detail', {id: id, imei_ip: '2937357107', teeny_mode: 0});\n}\nfunction qmToc(id) {\n    return qmUrl(QM_KS, '/api/v1/chapter/chapter-list', {id: id});\n}\nfunction qmTag(gender, tid, page, over, words, sort) {\n    var p = {gender: gender, need_filters: 1, page: page, tag_id: tid,\n        over: over == null ? -99 : over, words: words == null ? -99 : words, sort: sort == null ? 0 : sort};\n    if (gender == 1 || gender == 2) p.book_preference = gender;\n    return qmUrl(QM_BC, '/api/v4/tag/index', p);\n}\n\nfunction qmContent(bid, cid, agent) {\n    var p = {id: bid, chapterId: cid};\n    if (agent) p.reader_agent = '1';\n    return qmUrl(QM_KS, '/api/v1/chapter/content', p);\n}\n\nfunction qmChapterUrl(cid, md5, agent) {\n    var s = cid + '/' + md5 + '/' + (agent == '1' ? '1' : '0');\n    var b64 = Packages.java.util.Base64.getEncoder()\n        .encodeToString(new Packages.java.lang.String(s).getBytes('UTF-8'));\n    return 'data:;base64,' + b64 + ',{\"type\":\"qm\"}';\n}\n\nfunction qmUnzipEpub(b) {\n    function u16(p) { return (b[p] & 0xff) | (b[p + 1] & 0xff) << 8; }\n    function u32(p) { return (u16(p) | u16(p + 2) << 16) >>> 0; }\n    var eocd = b.length - 22;\n    while (eocd >= 0 && u32(eocd) != 0x06054b50) eocd--;\n    if (eocd < 0) return '';\n    var p = u32(eocd + 16), count = u16(eocd + 10), html = '';\n    for (var i = 0; i < count; i++) {\n        var method = u16(p + 10), csize = u32(p + 20), usize = u32(p + 24);\n        var nlen = u16(p + 28), total = 46 + nlen + u16(p + 30) + u16(p + 32);\n        var name = String(new Packages.java.lang.String(b, p + 46, nlen, 'UTF-8'));\n        var lh = u32(p + 42);\n        p += total;\n        if (!/\\.x?html?$/i.test(name)) continue;\n        var start = lh + 30 + u16(lh + 26) + u16(lh + 28), text;\n        if (method == 0) {\n            text = new Packages.java.lang.String(b, start, csize, 'UTF-8');\n        } else {\n            var inf = new Packages.java.util.zip.Inflater(true);\n            inf.setInput(b, start, csize);\n            var out = Packages.java.util.Arrays.copyOf(b, usize);\n            inf.inflate(out);\n            inf.end();\n            text = new Packages.java.lang.String(out, 'UTF-8');\n        }\n        var m = String(text).match(/<body[^>]*>([\\s\\S]*)<\\/body>/i);\n        if (m) html += m[1];\n    }\n    return html.replace(/<h\\d[^>]*>[\\s\\S]*?<\\/h\\d>/gi, '')\n               .replace(/&amp;/g, '&').trim();\n}\n\nfunction qmDecode(content) {\n    var A = Packages.java.util.Arrays;\n    var raw = Packages.java.util.Base64.getDecoder().decode(String(content));\n    var key = new Packages.javax.crypto.spec.SecretKeySpec(new Packages.java.lang.String(QM_AES).getBytes('UTF-8'), 'AES');\n    var iv = new Packages.javax.crypto.spec.IvParameterSpec(A.copyOfRange(raw, 0, 16));\n    var c = Packages.javax.crypto.Cipher.getInstance('AES/CBC/PKCS5Padding');\n    c.init(2, key, iv);\n    var b = c.doFinal(A.copyOfRange(raw, 16, raw.length));\n    if (b.length > 3 && b[0] == 0x50 && b[1] == 0x4B) return qmUnzipEpub(b);\n    return String(new Packages.java.lang.String(b, 'UTF-8'));\n}\n\nvar QM_TAGS = {\n    '男频': [\n        ['热门', '爽文:570,都市:758,年代:672,玄幻:717,兵王:28,玄幻脑洞:884,扮猪吃虎:794,热血:1,多角色:1409,杀伐果断:202,穿越:373,逆袭:400,七猫金选:1385'],\n        ['情节', '都市脑洞:883,玄幻脑洞:884,穿越:373,逆袭:400,剑道:72,打脸虐渣:739,无敌流:305,重生:779,系统:782,多女主:945,金手指:756,脑洞:526,修仙:659,复仇:790,强者回归:402,致富:492,随身空间:345,争霸:312,奇闻异事:769,异能:644,风水:437,草根崛起:1223,穿书:338,影视:539,一统天下:410,单女主:861,职场:741,影视原著:1333,契约婚姻:355,古武:606,后悔流:1202,开局流:564,娱乐圈:357,推理:668,武魂:427,游戏:714,鉴宝:47,美食:300,修罗场:1256,进化:528,盗墓:327,技术流:663,探险:697,无限流:557,历史脑洞:885,签到:565,直播:419,网游:740,长生流:566,丧尸:632,御兽:423,囤物资:894,爱国流:830,基建:612,通古今:1203,吞噬:530,稳健流:837,科技:855,召唤:313,迪化流:832,国术:613,相亲:909,全民领主:1213,无女主:860,体育:601,偷听心声:1258,综艺:911,机甲:690,恋综:817,电竞:715,克苏鲁:834,篮球:732,国运:868,万物沟通:1285,双男主:818,荒野求生:1226,足球:576,综武:940,NBA:984,弹幕文:1274,崩人设:1257,扮演:842,氪金:1225,多重人格:954'],\n        ['背景', '都市:758,末世:556,玄幻:717,古代:604,架空历史:653,仙侠:589,年代:672,历史:669,异界:692,乡村:599,校园:691,高武:840,诸天万界:307,科幻:730,传统玄幻:1268,奇幻:678,灵气复苏:403,未来世界:704,大明:636,武侠:371,影视衍生:638,洪荒:559,星际:686,大唐:322,四合院:854,神话:726,西幻:744,三国:321,动漫衍生:598,民国:660,西游:324,大秦:858,游戏衍生:673,封神:658,火影:330,海贼王:331,宋朝:943,赛博朋克:957,崩坏星穹铁道:969'],\n        ['角色', '杀伐果断:202,智商在线:806,扮猪吃虎:794,全能:196,仙帝:31,天才:783,医生:156,废柴:791,兵王:28,女总裁:89,护花高手:30,神医:1269,战神:527,王爷:125,赘婿:36,世子:580,皇帝:62,将军:787,反派:792,明星:684,皇子:713,太子:128,学霸:781,道士:74,神豪:37,咸鱼:812,女帝:646,特种兵:547,奶爸:41,校花:92,高冷:1219,太监:642,无节操:1215,弃少:525,律师:161,书生:852,师徒恋:507,龙:444,暴君:703,僵尸:449,主播:587,魔尊:544,侦探:592,特工:188,驸马:946,幕后BOSS:963,佛系:1255,外卖员:958,杀手:784,锦衣卫:757,御姐:1254,奸臣:621,败家子:752,法医:189,真假少爷:1270,女尊:624,嘴炮:1216,丞相:944'],\n        ['风格', '爽文:570,轻松:3,种田:317,权谋:785,搞笑:788,热血:1,快节奏:1222,日常:878,悬疑:27,励志:786,现实题材:12,恐怖:567,商战:675,军事:603,第一人称:977,反套路:1224,烧脑:571,正剧:707']\n    ],\n    '女频': [\n        ['热门', '现代言情:772,甜宠:21,爽文:570,多角色:1409,豪门总裁:682,幻想言情:774,古代言情:773,重生:779,年代:672,穿越:373,逆袭:400,智商在线:806,七猫金选:1385'],\n        ['情节', '快穿:335,穿越:373,逆袭:400,HE:581,1V1:585,系统:782,追妻火葬场:753,先婚后爱:524,重生:779,金手指:756,脑洞:526,修仙:659,复仇:790,致富:492,随身空间:345,奇闻异事:769,打脸虐渣:739,异能:644,玄学:900,风水:437,一见钟情:583,穿书:338,暗恋:689,男二上位:857,破镜重圆:467,影视:539,马甲:558,职场:741,影视原著:1333,契约婚姻:355,闪婚:480,娱乐圈:357,推理:668,青梅竹马:465,婚恋:1246,带球跑:640,美食:300,替嫁:476,相爱相杀:722,修罗场:1256,双向奔赴:844,无限流:557,直播:419,隐婚:481,丧尸:632,御兽:423,囤物资:894,爱国流:830,姐弟恋:631,错嫁:501,父子火葬场:1259,基建:612,无CP:819,通古今:1203,逃荒:864,科技:855,相亲:909,双向救赎:1248,读心术:810,死对头:1239,偷听心声:1258,爆红:1250,综艺:911,机甲:690,恋综:817,天作之合:1244,电竞:715,宠夫:964,古穿今:671,BE:579,万物沟通:1285,双男主:818,倒追:1252,萌宠:1249,逃婚:483,弹幕文:1274,失忆:1251,崩人设:1257,氪金:1225,多重人格:954,双重生:828'],\n        ['背景', '现代言情:772,年代:672,古代:604,兽世:856,古代言情:773,架空历史:653,末世:556,异界:692,幻想言情:774,乡村:599,校园:691,科幻:730,奇幻:678,未来世界:704,武侠:371,影视衍生:638,星际:686,神话:726,西幻:744,动漫衍生:598,民国:660,远古:750,游戏衍生:673,衍生言情:1214,崩坏星穹铁道:969'],\n        ['角色', '豪门总裁:682,智商在线:806,扮猪吃虎:794,霸道:239,全能:196,天才:783,腹黑:789,女强:620,医生:156,萌宝:356,宠妻:1245,人间清醒:1200,双洁:947,团宠:545,可盐可甜:608,强强:533,废柴:791,偏执:248,真假千金:808,嫡女:117,王爷:125,王妃:107,世子:580,大女主:972,白月光:851,皇帝:62,将军:787,糙汉:907,明星:684,忠犬:259,皇子:713,太子:128,反派:792,傲娇:268,学霸:781,二婚:655,医妃:108,独宠:1253,咸鱼:812,女帝:646,女配:191,丫鬟:961,毒舌:265,欢喜冤家:464,首辅:133,高冷:1219,美强惨:1232,戏精:1228,万人迷:1227,痴情:1217,呆萌:609,替身:648,病娇:273,残疾:263,太监:642,丑女:141,大叔:153,锦鲤:813,主母:973,摄政王:698,律师:161,黑化:1247,弃妇:590,奶团:971,书生:852,师徒恋:507,冰山:1242,暴君:703,公主:113,反差萌:1235,庶女:118,炮灰:1229,超A:1218,女扮男装:619,醋王:1221,主播:587,魔尊:544,黑莲花:849,侦探:592,特工:188,心机:1236,校草:701,财迷:1220,皇后:106,古灵精怪:1243,皇叔:721,小狼狗:1234,佛系:1255,作精:948,外卖员:958,杀手:784,锦衣卫:757,御姐:1254,奸臣:621,后妈:845,毒医:1240,吸血鬼:182,仵作:190,绿茶:738,法医:189,厨娘:1241,女尊:624,顶流:1233,黑月光:850,逗比:1238,旺夫:1231,暖男:1237,嘴炮:1216,吃货:1230,恶婆婆:962,双女主:843'],\n        ['风格', '爽文:570,甜宠:21,轻松:3,种田:317,宅斗:342,权谋:785,虐恋:16,搞笑:788,快节奏:1222,日常:878,治愈:17,悬疑:27,励志:786,宫斗:343,现实题材:12,恐怖:567,青春:761,第一人称:977,反套路:1224,烧脑:571,正剧:707,短篇:934,清穿:336']\n    ],\n    '出版': [\n        ['热门', '都市:758,现代言情:772,玄幻:717,古代:604,古代言情:773,历史:669'],\n        ['内容主题', '家庭:687,生活:712,婚姻:628,养生:662,育儿:1321,医学:1320,社会问题:1317'],\n        ['品质认证', '出版:1303,影视原著:1333,名著:610,获奖佳作:742,名家名作:1336,站外权威推荐:1338,豆瓣高分:1337'],\n        ['出版小说', '都市:758,现代言情:772,玄幻:717,古代:604,古代言情:773,历史:669,仙侠:589,悬疑:27,现实题材:12,青春:761,科幻:730,言情:745,武侠:371,群像:1340'],\n        ['读者群体', '女性:643,青少年:540,少儿教育:797,职场人士:1318'],\n        ['个人成长', '心理:649,成功学:696,经管励志:798,情商:639,沟通:702,管理:729,经济:710,自我成长:1329,时间管理:1324,演讲:1328,思维训练:1325,领导力:1323,学习方法:1331,决策:1322,团队建设:1326,职业发展:1330,效率:1327'],\n        ['文学体裁', '传记:591,文学小说:1310,作品集:597,随笔:737,散文:645,评论:724,诗词:747,中篇小说:1309,短篇小说:1308,戏剧:1312,纪实文学:1311,杂文:1313,报告文学:1307'],\n        ['地区文学', '中国文学:1348,法国文学:1349,英国文学:1351,美国文学:1350,德国文学:1352,日本文学:1332,俄罗斯文学:1354,外文原版:1353,意大利文学:1355'],\n        ['时代背景', '社会:723,近代:728,改革开放:1314'],\n        ['社会人文', '人文社科:796,文化历史:1316,文化:685,文学艺术:795,国学:534,哲学:1315,科普:733,艺术:720,世界历史:1319'],\n        ['思想政治', '红色文学:535,思政:694,四史:611']\n    ]\n};\n", "lastUpdateTime": "1789516577768", "respondTime": 180000, "ruleBookInfo": {"author": "author", "coverUrl": "image_link", "init": "data.book", "intro": "&nbsp;&nbsp;🔖更新时间：{{java.timeFormat(java.getString('$.update_time')*1000)}}\t{{'\\n&lrm;\\n'}}🏷️ 标签：{{String(java.getString('$.book_tag_list[*].title&&$.category_over_words##・|\\\\s##，')).split('，').filter(function(v,i,a){return v && a.indexOf(v)==i;}).join('，')}}{{'\\n'+'​'}}\n\n{{$.intro}}\n{{'\\n&lrm;\\n'}}📍版权来源：{{$.statement##如有疑问可联系:fawu@qimao.com或客服QQ:3598987377}}", "kind": "book_tag_list[*].title##\\s##，", "lastChapter": "{{$.latest_chapter_title}} • {{java.timeFormat(java.getString('$.update_time')*1000)}}\n<js>result.replace(/\\s\\d+:\\d+/,'').replace(/\\//g,'-')</js>", "name": "title@put:{\"bid\":\"$.id\"}", "tocUrl": "@js:qmToc('{{$.id}}')", "wordCount": "words_num"}, "ruleContent": {"content": "@js:\nvar seg = String(java.hexDecodeToString(result)).split('/');\nvar bid = String(java.get('bid'));\nvar story = seg[2] == '1';\nvar out;\ntry {\n    var res = JSON.parse(java.ajax(qmContent(bid, seg[0], story)));\n    if (!(res.data && res.data.content)) res = JSON.parse(java.ajax(qmContent(bid, seg[0], !story)));\n    out = (res.data && res.data.content) ? qmDecode(res.data.content)\n        : '七猫服务器未返回本章正文：' + (res.errors ? res.errors.details : '未知错误');\n} catch (e) {\n    out = '正文获取失败：' + e;\n}\nout;\n"}, "ruleExplore": {"author": "$.author", "bookList": "$.data.books", "bookUrl": "@js:qmDetail('{{$.id}}')", "coverUrl": "$.image_link", "intro": "$.intro", "kind": "$.ptags", "name": "$.title", "wordCount": "$.words_num"}, "ruleSearch": {"author": "original_author", "bookList": "data.books", "bookUrl": "@js:qmDetail('{{$.id}}')", "coverUrl": "image_link", "intro": "intro", "kind": "ptags", "name": "original_title", "wordCount": "words_num"}, "ruleToc": {"chapterList": "<js>java.put('qm_agent', String(JSON.parse(String(result)).data.reader_type) == '4' ? '1' : '0'); result</js>\n$.data.chapter_lists", "chapterName": "title", "chapterUrl": "@js:qmChapterUrl('{{$.id}}', '{{$.content_md5}}', java.get('qm_agent'))", "updateTime": "{{$.words}}字"}, "searchUrl": "@js:qmSearch(key, page)", "weight": 0},{"bookSourceGroup": "☣️精选senhora", "bookSourceName": "格格党[分页]", "bookSourceType": 0, "bookSourceUrl": "http://www.qodown.com", "bookUrlPattern": "http://www.qodown.com/post/\\d+.html", "customButton": false, "customOrder": -121, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\":\"排行\",\"url\":\"/rank/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"书库\",\"url\":\"/sort/{{page}}/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"完本\",\"url\":\"/quanben/sort/{{page}}/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}}]", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 10;  Build/QP1A.190711.020) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Mobile Safari/537.36\"}", "lastUpdateTime": "1789509847570", "respondTime": 5468, "ruleBookInfo": {"author": "[property=\"og:novel:author\"]@content", "coverUrl": "[property=\"og:image\"]@content", "intro": "[property=\"og:description\"]@content", "kind": "[property=\"og:novel:category\"]@content&&\n[property=\"og:novel:status\"]@content&&\n[property=\"og:novel:update_time\"]@content", "lastChapter": "{{@@[property$=chapter_name]@content}}･{{@@[property$=update_time]@content##\\s.*}}\n@js:result\n.replace(\"••\",\"\")\n.replace(/^(\\d+).第/,'第')\n.replace(/^(正文|VIP章节|最新章节)?(\\s+|_)|[\\(\\{（｛【].*[求含理更谢乐发推票盟补加字Kk\\/].*/g,'')\n.replace(/^(\\d+)[、．]第.+章/,'第$1章')\n.replace(/^(\\d+)、\\d+、/,'第$1章 ')\n.replace(/^(\\d+)、\\d+/,'第$1章')\n.replace(/^(第.+章)\\s?\\d+/,'$1')\n.replace(/^(\\d+)、/,'第$1章 ')\n.replace(/^(第.+章)\\s?第.+章/,'$1')\n.replace(/第\\s(.+)\\s章/,'第$1章')\n.replace(/.*(chapter|Chapter)\\s?(\\d+)\\s?/,'$1 $2 ')\n.replace(/\\(.+\\)/,'')\n.replace(/\\[|。/,'')\n.replace(/第([零一二两三四五六七八九十百千]+)章/g,java.toNumChapter(result))\n##(章)([^\\s]+)(\\s·)##$1 $2$3", "name": "[property=\"og:novel:book_name\"]@content"}, "ruleContent": {"content": "id.content@p@html", "nextContentUrl": "id.next_url@href"}, "ruleExplore": {"author": ".item span.0@text||.s4@text", "bookList": "ul li&&class.item", "bookUrl": "a.0@href", "coverUrl": "img@src||a.0@href##.*/post/((\\d+)\\d{3}).html##http://img.qodown.com/$2/$1/$1s.jpg", "intro": "dl@dd@text", "kind": "span.s1@text##\\[|\\]", "name": "span.s2@text&&dl@dt@a@text"}, "ruleSearch": {"author": ".s4@text", "bookList": ".txt-list li!0", "bookUrl": "a.0@href", "checkKeyWord": "诡秘", "kind": ".s1@text##\\[|\\]", "lastChapter": ".s3@text", "name": ".s2@text", "wordCount": ".s5@text"}, "ruleToc": {"chapterList": "class.section-list fix.1@li@a", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": "option@value||text.下一页@href"}, "searchUrl": "/search/,\n{\n  \"body\": \"searchkey={{key}}&Submit=搜索\",\n  \"charset\": \"UTF-8\",\n  \"method\": \"POST\"\n}", "weight": 0},{"bookSourceComment": "同站：https://m.po18xs.com\n肉肉屋 https://m.rourouwu5.com", "bookSourceGroup": "⛎JJ城", "bookSourceName": "御书屋", "bookSourceType": 0, "bookSourceUrl": "https://m.3322t.com/", "customButton": false, "customOrder": -120, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "最新入库::/top/postdate_{{page}}/\n最近更新::/top/lastupdate_{{page}}/\n玄幻魔法::/sort/1_{{page}}/\n仙侠修真::/sort/2_{{page}}/\n都市言情::/sort/3_{{page}}/\n科幻网游::/sort/4_{{page}}/\n惊悚悬疑::/sort/5_{{page}}/\n耽美同人::/sort/6_{{page}}/\n穿越架空::/sort/7_{{page}}/\n高辣浓情::/sort/8_{{page}}/\n禁忌百合::/sort/9_{{page}}/\n精品文学::/sort/10_{{page}}/", "header": "{\n\"User-Agent\":\"Mozilla/5.0(Linux;Android8.1.0;JKM-AL00bBuild/HUAWEIJKM-AL00b;wv)AppleWebKit/537.36(KHTML,likeGecko)Version/4.0Chrome/66.0.3359.126MQQBrowser/6.2TBS/044807MobileSafari/537.36\"\n}", "lastUpdateTime": "1789507545404", "respondTime": 26910, "ruleBookInfo": {"author": "class.infotype@tag.a.0@text", "coverUrl": "class.pic@img@src", "intro": "class.intro@p@text##爱☆就☆收☆藏.*|禁忌书屋.*", "kind": "class.infotype@tag.p.1@text##类型：", "lastChapter": "class.infotype@tag.p.3@tag.a@text", "name": "class.cataloginfo@tag.h3@text", "tocUrl": "class.gochapter@a@href"}, "ruleContent": {"content": "id.novelcontent@html##上一章|下一章|加入书签|返回目录"}, "ruleExplore": {"author": "class.author@text||class.p3@text", "bookList": "class.article||class.articlegeneral", "bookUrl": "tag.a@href", "coverUrl": "tag.img@src##yushuwu.asia##3322t.com", "intro": "class.simple@text", "kind": "class.p1@text##\\[|\\]", "name": "tag.h6@text||class.blue@text"}, "ruleSearch": {"author": "tag.a.1@text", "bookList": "class.searchresult@tag.p", "bookUrl": "tag.a@href", "coverUrl": "tag.a@href<js>\nvarid=result.match(/(\\d+)/)[1];\nvariid=parseInt(id/1000);\n'http://img.3322t.com/image/'+iid+'/'+id+'/'+id+'s.jpg';\n</js>", "name": "tag.a.0@text"}, "ruleToc": {"chapterList": "class.chapters@tag.li", "chapterName": "tag.a@text", "chapterUrl": "tag.a@href", "nextTocUrl": "text.下一页@href"}, "searchUrl": "/s.php,{\n\"charset\":\"gbk\",\n\"method\":\"POST\",\n\"body\":\"type=articlename&s={{key}}\"\n}", "weight": 0},{"bookSourceComment": "分页", "bookSourceGroup": "🔞", "bookSourceName": "腐文阁🎃[无搜索]", "bookSourceType": 0, "bookSourceUrl": "https://m.fuwenge.com/", "customButton": false, "customOrder": -112, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "                      🎖 总榜 🎖                      ::/top_{{page}}.html\n—————🍀全部🎀分类🍀—————\n校园言情::/class_visit_1/{{page}}.html\n都市言情::/class_visit_2/{{page}}.html\n古代言情::/class_visit_3/{{page}}.html\n罗曼史::/class_visit_4/{{page}}.html\n耽美::/class_visit_5/{{page}}.html\n百合::/class_visit_6/{{page}}.html\n同人::/class_visit_7/{{page}}.html\n奇幻玄幻::/class_visit_8/{{page}}.html\n网游竞技::/class_visit_9/{{page}}.html\n科幻异能::/class_visit_10/{{page}}.html\n恐怖灵异::/class_visit_11/{{page}}.html\n惊悚推理::/class_visit_12/{{page}}.html\n武侠仙侠::/class_visit_13/{{page}}.html\n历史军事::/class_visit_14/{{page}}.html\n穿越重生::/class_visit_15/{{page}}.html\n综合其它::/class_visit_16/{{page}}.html", "lastUpdateTime": "1789506293008", "respondTime": 233579, "ruleBookInfo": {"coverUrl": ".pic@img@src", "intro": ".intro@text", "kind": "##\\[状态\\]：([^<]+)</p>##$1###", "tocUrl": "text.打开目录@href"}, "ruleContent": {"content": ".content@html"}, "ruleExplore": {"author": ".author_intro@text##\\|.*", "bookList": ".pictext", "bookUrl": "a@href", "coverUrl": "img@data-original", "intro": ".book_description@text||.info_description@text", "kind": ".author_intro@text##.*\\|", "name": "img@alt||.info_title@text", "wordCount": ".author_intro@text##字 \\|.*\n@js: result##.*\\| "}, "ruleSearch": {"author": "span.0@text", "bookList": "class.partlist-info@dl||class.slist xbk@li", "bookUrl": "tag.a.1@href", "checkKeyWord": "情敌", "coverUrl": "tag.a.1@href<js>'http://img.fuwenge.com/image'+String(result).replace(/.*?(\\d*?)(\\d{1,3}).html/,'/$1/$1$2/$1$2s.jpg').replace('//','/0/')</js>", "intro": "tag.span.2@text", "kind": "##\\[类别\\]：\\s*<[^>]+>(.*?)<##$1###", "lastChapter": "class.latest_title ablue@title", "name": "a.0@text", "wordCount": "##\\[字数\\]：\\s*<[^>]+>(.*?)<##$1###"}, "ruleToc": {"chapterList": ".list@li", "chapterName": "span@text", "chapterUrl": "a@href", "nextTocUrl": "text.下一页@href"}, "searchUrl": "/search.php?searchkey={{key}}", "weight": 0},{"bookSourceGroup": "☣️精选senhora", "bookSourceName": "奥福书屋🎃[分页]", "bookSourceType": 0, "bookSourceUrl": "https://m.aofusw.com", "customButton": false, "customOrder": 93, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "全部::/list/0_0_0_{{page}}_0_0_0.html\n玄幻小说::/list/0_0_0_{{page}}_0_1_0.html\n幻想言情::/list/0_0_0_{{page}}_0_2_0.html\n衍生同人::/list/0_0_0_{{page}}_0_3_0.html\n仙侠奇缘::/list/0_0_0_{{page}}_0_4_0.html\n虚拟网游::/list/0_0_0_{{page}}_0_5_0.html\n历史小说::/list/0_0_0_{{page}}_0_6_0.html\n灵异悬疑::/list/0_0_0_{{page}}_0_7_0.html\n推理小说::/list/0_0_0_{{page}}_0_8_0.html\n都市小说::/list/0_0_0_{{page}}_0_9_0.html\n所有作品::/list/0_0_0_{{page}}_0_0_0.html\n玄幻小说::/list/0_0_0_{{page}}_0_39_0.html\n幻想言情::/list/0_0_0_{{page}}_0_3631_0.html\n衍生同人::/list/0_0_0_{{page}}_0_341_0.html\n仙侠奇缘::/list/0_0_0_{{page}}_0_4209_0.html\n虚拟网游::/list/0_0_0_{{page}}_0_381_0.html\n历史小说::/list/0_0_0_{{page}}_0_357_0.html\n灵异悬疑::/list/0_0_0_{{page}}_0_4439_0.html\n推理小说::/list/0_0_0_{{page}}_0_279_0.html\n都市小说::/list/0_0_0_{{page}}_0_1013_0.html\n更新小说::/list/1.html\n榜单小说::/list/top_{{page}}.html\n完结小说::/list/finish_{{page}}.html\n章数排序::/list/chapters_{{page}}.html", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 9) Mobile Safari/537.36\"}", "lastUpdateTime": "1789496440791", "respondTime": 10374, "ruleBookInfo": {"author": "@get:{a}", "coverUrl": "@get:{c}", "init": "@put:{n:\"[property$=book_name]@content\",\na:\"[property$=author]@content\",\nk:\"[property~=category|status|update_time]@content\",\nl:\"[property$=latest_chapter_name]@content\",\ni:\"[property$=description]@content\",\nc:\"[property$=image]@content\",\nt:\"text.目录@href\"}", "intro": "@get:{i}", "kind": "@get:{k}", "lastChapter": "@get:{l}", "name": "@get:{n}", "tocUrl": "@get:{t}"}, "ruleContent": {"content": "@js:\nurl=\"https:\"+result.match(/initTxt\\(\"([^\"]+)\",\"[^\"]+\"\\)/)[1];\nr=String(java.ajax(url).match(/_txt_call\\(([\\s\\S]+\\})\\)/)[1]);\nvar r = eval('(' + r + ')');\n\t\t\t\tif(r.content!=null){\t\t\t\t\n      var e = r.replace;\n\t\t\t\tfor (var n in e) {\n\t\t\t\t\tvar i = new RegExp(e[n], \"ig\");\n\t\t\t\t\tr.content = r.content.replace(i, n)\n\t\t\t\t}\n\t\t\t\tresult=r.content\n\t\t\t\t\t}else{result=\"章节加载失败，或者内容正在手打中，请稍后访问~\"}"}, "ruleExplore": {"author": "a.2@text", "bookList": ".CGsectionTwo-right-content-unit", "bookUrl": "a.0@href", "intro": "p.-2@text", "kind": "p.-1@text", "name": "a.0@text"}, "ruleSearch": {"author": "a.1@text", "bookList": ".search-card", "bookUrl": "a.0@href", "intro": ".sc-content@text", "kind": "span.-1@text", "lastChapter": "span.-2@text", "name": "a.0@text"}, "ruleToc": {"chapterList": ".chapter-list li a", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": "text.下页@href"}, "searchUrl": "/search/,{\n  \"body\": \"keyword={{key}}\",\n  \"method\": \"POST\"\n}", "weight": 72},{"bookSourceComment": "修改了一下搜索无内容和正文去广告", "bookSourceName": "要撸小说修", "bookSourceType": 0, "bookSourceUrl": "https://yaoluku.com", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "最新::https://www.yaoluku.com/sort/{{page}}/,{\"webView\":true}\n完本::https://www.yaoluku.com/quanben/sort/{{page}}/,{\"webView\":true}\n玄幻::https://www.yaoluku.com/sort/1/{{page}}/,{\"webView\":true}\n武侠::https://www.yaoluku.com/sort/2/{{page}}/,{\"webView\":true}\n都市::https://www.yaoluku.com/sort/3/{{page}}/,{\"webView\":true}\n科幻::https://www.yaoluku.com/sort/4/{{page}}/,{\"webView\":true}\n穿越::https://www.yaoluku.com/sort/5/{{page}}/,{\"webView\":true}\n耽美::https://www.yaoluku.com/sort/6/{{page}}/,{\"webView\":true}\n游戏::https://www.yaoluku.com/sort/7/{{page}}/,{\"webView\":true}\n精品::https://www.yaoluku.com/sort/8/{{page}}/,{\"webView\":true}\n午夜::https://www.yaoluku.com/sort/9/{{page}}/,{\"webView\":true}", "lastUpdateTime": "1789494002099", "respondTime": 180000, "ruleBookInfo": {"author": "[property=\"og:novel:author\"]@content", "coverUrl": ".novel_info_main img@src", "intro": "[property=\"og:description\"]@content", "kind": "[property~=category|status|update_time]@content", "lastChapter": "[property~=las?test_chapter_name]@content", "name": "[property=\"og:novel:book_name\"]@content", "wordCount": ".novel_info_title p.0@span.1@text"}, "ruleContent": {"content": "#article p@html"}, "ruleExplore": {"author": ".fa-user-circle-o@text", "bookList": "ul.flex li", "bookUrl": "a.0@href", "coverUrl": "img@data-original", "intro": ".indent@text", "kind": ".full@text&&em@text##\\/##,", "name": "img@title"}, "ruleSearch": {"author": "##fa-user-circle-o[^<]+<\\/i>([^\\s<]+)##$1###", "bookList": ".searchresult", "bookUrl": "a.0@href", "coverUrl": "img@data-src", "intro": ".searchresult_p@text", "kind": ".img_span span@text&&.s_gray@text##\\s*\\/\\s*|.*字\\s*##,", "lastChapter": "p.-1@text", "name": "p.-1@text\n<js>\nif(\"最新章节\"==result){\n\tresult=\"\"\n\t}else{\n\t\tresult=java.getString(\"img@title\")\n\t\t}\t\n</js>", "wordCount": ".s_gray@text##(.*字)##$1###"}, "ruleToc": {"chapterList": "#catalog li a", "chapterName": "text", "chapterUrl": "href##$##,{\"webView\":true}"}, "searchUrl": "{{u=\"https://yaoluku.com\";a=String(cookie.getCookie(u));b=a.replace(\"ss_search_delay=1\", \"\");cookie.setCookie(u, b);java.log(cookie.getCookie(u));result}}\nhttps://yaoluku.com/search/,{\n  \"body\": \"searchkey={{key}}&searchtype=all&Submit=\",\n  \"method\": \"POST\",\n   \"webView\": true\n}", "weight": 0},{"bookSourceComment": "\n", "bookSourceGroup": "📖 轻说", "bookSourceName": "轻小说文库", "bookSourceType": 0, "bookSourceUrl": "https://www.wenku8.cc", "concurrentRate": "", "customOrder": 34, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "@js:\nres=[]\ncontent=java.ajax(\"http://www.wenku8.cc/modules/article/articlelist.php?class=\")\nres.push({title:'分类阅读',url:'',style:{layout_flexGrow:1,layout_flexBasisPercent:1}})\ncontent.match(/分类阅读[\\s\\S]+Tags云集/gi)[0].match(/<a.+<\\/a>/gi).forEach(a=>{\n    res.push({title:a.match(/>.+(?=<)/gi)[0].replace('>',''),url:a.match(/\\\".+(?=\\\")/gi)[0].replace('\"','')+\"&page={{page}}\",style:{layout_flexGrow:1,layout_flexBasisPercent:0.25}})\n})\nres.push({title:'日常系属性Tags',url:'',style:{layout_flexGrow:1,layout_flexBasisPercent:1}})\ncontent.match(/日常系属性Tags[\\s\\S]+幻想系属性Tags/gi)[0].match(/<a.+<\\/a>/gi).forEach(a=>{\n    res.push({title:a.match(/>.+(?=<)/gi)[0].replace('>',''),url:'https://www.wenku8.cc/modules/article/'+a.match(/=.+(?=>.+<)/gi)[0].replace(/^=/i,'')+\"&page={{page}},{'charset': 'gbk'}\",style:{layout_flexGrow:1,layout_flexBasisPercent:0.25}})\n})\nres.push({title:'幻想系属性Tags',url:'',style:{layout_flexGrow:1,layout_flexBasisPercent:1}})\ncontent.match(/幻想系属性Tags[\\s\\S]+黑深残属性Tags/gi)[0].match(/<a.+<\\/a>/gi).forEach(a=>{\n    res.push({title:a.match(/>.+(?=<)/gi)[0].replace('>',''),url:'https://www.wenku8.cc/modules/article/'+a.match(/=.+(?=>.+<)/gi)[0].replace(/^=/i,'')+\"&page={{page}},{'charset': 'gbk'}\",style:{layout_flexGrow:1,layout_flexBasisPercent:0.25}})\n})\nres.push({title:'黑深残属性Tags',url:'',style:{layout_flexGrow:1,layout_flexBasisPercent:1}})\ncontent.match(/黑深残属性Tags[\\s\\S]+人物属性类Tags/gi)[0].match(/<a.+<\\/a>/gi).forEach(a=>{\n    res.push({title:a.match(/>.+(?=<)/gi)[0].replace('>',''),url:'https://www.wenku8.cc/modules/article/'+a.match(/=.+(?=>.+<)/gi)[0].replace(/^=/i,'')+\"&page={{page}},{'charset': 'gbk'}\",style:{layout_flexGrow:1,layout_flexBasisPercent:0.25}})\n})\nres.push({title:'人物属性类Tags',url:'',style:{layout_flexGrow:1,layout_flexBasisPercent:1}})\ncontent.match(/人物属性类Tags[\\s\\S]+特殊属性类Tags/gi)[0].match(/<a.+<\\/a>/gi).forEach(a=>{\n    res.push({title:a.match(/>.+(?=<)/gi)[0].replace('>',''),url:'https://www.wenku8.cc/modules/article/'+a.match(/=.+(?=>.+<)/gi)[0].replace(/^=/i,'')+\"&page={{page}},{'charset': 'gbk'}\",style:{layout_flexGrow:1,layout_flexBasisPercent:0.25}})\n})\nres.push({title:'特殊属性类Tags',url:'',style:{layout_flexGrow:1,layout_flexBasisPercent:1}})\ncontent.match(/特殊属性类Tags[\\s\\S]+排 行 榜/gi)[0].match(/<a.+<\\/a>/gi).forEach(a=>{\n    res.push({title:a.match(/>.+(?=<)/gi)[0].replace('>',''),url:'https://www.wenku8.cc/modules/article/'+a.match(/=.+(?=>.+<)/gi)[0].replace(/^=/i,'')+\"&page={{page}},{'charset': 'gbk'}\",style:{layout_flexGrow:1,layout_flexBasisPercent:0.25}})\n})\nres.push({title:'排行榜',url:'',style:{layout_flexGrow:1,layout_flexBasisPercent:1}})\ncontent.match(/排 行 榜[\\s\\S]+小说搜索/gi)[0].match(/<a[^&\\n]+<\\/a>/gi).forEach(a=>{\n    res.push({title:a.match(/>.+?(?=<)/i)[0].replace('>',''),url:a.match(/\\\".+(?=\\\")/gi)[0].replace('\"','')+\"&page={{page}}\",style:{layout_flexGrow:1,layout_flexBasisPercent:0.25}})\n})\nJSON.stringify(res)", "lastUpdateTime": "1789485161678", "loginCheckJs": "", "loginUrl": "https://www.wenku8.cc/login.php", "respondTime": 180000, "ruleBookInfo": {"author": "id.content@tag.tbody.0@tag.tr.-1@tag.td.1@text##小说作者：", "coverUrl": "id.content@.0@.3@.0@.0@tag.img@src", "intro": "//span[6]", "kind": "id.content@.0@.3@.0@.0@.1@tag.span.0@text##作品Tags：\n@js:\nres=[]\nresult.forEach(item=>{\n    item.split(\" \").forEach(i=>res.push(i))\n})\nres", "lastChapter": "//td[2]/span[4]/a/text()", "name": "id.content@tag.td.0@tag.td.0@tag.b@text", "tocUrl": "text.小说目录@href", "wordCount": "id.content@tag.tbody.0@tag.tr.-1@tag.td.4@text##全文长度："}, "ruleContent": {"content": "id.content@html##本文来自.*|最新.*一网打尽！\n@js:\nencode = function(str) {\n\t\t\treturn '&appver=1.13&request=' + java.base64Encode(str) + '&timetoken=' + (new Date().getTime());\n\t\t};\nif (result.match(\"不再提供该小说\")) {\n\t   response=java.post(\n\t   \t    \"http://app.wenku8.com/android.php\",\n\t   \t    encode('action=book&do=text&aid=' + baseUrl.match(/\\/(\\d+)(?=\\/|\\.htm)/gi)[1].replace('/','') + '&cid=' + baseUrl.match(/\\/(\\d+)(?=\\/|\\.htm)/gi)[2].replace('/','') + '&t=0'),\n\t   \t    {\n\t\t\t\t\t       'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t\t\t       'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 7.1.2; unknown Build/NZH54D)'\n        })\n    response.body().replace('<!--image-->http','<img src=\"http').replace('jpg<!--image-->','jpg\">')\n} else {\n\t   result\n}"}, "ruleExplore": {"author": "//div[2]/p[1]/text()##/分类.*", "bookList": "//div[@id='content']//td/div", "bookUrl": "//div[2]/b/a/@href", "coverUrl": "img@src", "intro": "//p[4]##.+简介:", "kind": "//p[3]/span/text()&&//p[2]/text()##更新:|字数:\n@js:\nres=[]\nresult.forEach(item=>{\n    item.split(new RegExp(\"[ \\/]\",\"gi\")).forEach(i=>res.push(i))\n})\nres", "name": "//div[2]/b/a/@title"}, "ruleSearch": {"author": "//div[2]/p[1]##(.+作者:)|(/分类:.+)", "bookList": "<js>\n//搜索词\njava.toast('书名搜索成功，5s后开始作者搜索')\nwhile(new Date().getTime()-Number(cookie.getKey('http://www.wenku8.net','jieqiVisitTime').replace('jieqiArticlesearchTime%3D',''))*1000<6000){}\nkey = java.get(\"key\")\npage = java.get(\"page\")\n//拼接搜索作者链接\nurl = `https://www.wenku8.net/modules/article/search.php?searchtype=author&searchkey=${key}&page=${page},{\n    \"charset\": \"gbk\"\n}`\ncombineHtml = result + java.ajax(url)\ncombineHtml\n</js>\n@css:#content>table td>div", "bookUrl": "//div[2]/b/a/@href", "checkKeyWord": "无职转生", "coverUrl": "img@src", "intro": "//p[4]##.+简介:", "kind": "//p[3]/span/text()&&//p[2]/text()&&//p[5]/text()##更新:|字数:\n@js:\nres=[]\nresult.forEach(item=>{\n    if (item.match(\"已经下架\")) res.unshift(\"已下架\")\n    else item.split(new RegExp(\"[ \\/]\",\"gi\")).forEach(i=>res.push(i))\n})\n\nres", "name": "//div[2]/b/a/@title", "wordCount": ""}, "ruleToc": {"chapterList": "class.css@tag.td", "chapterName": "text", "chapterUrl": "tag.a@href", "isVolume": "<js>java.getString(\"tag.a@text\")==\"\"?true:false</js>"}, "searchUrl": "https://www.wenku8.cc/modules/article/search.php?searchtype=articlename&searchkey={{java.put('key',key)}}&page={{java.put('page',page)}},{\n    \"charset\": \"gbk\"\n}\n@js:\nif(new Date().getTime()-Number(cookie.getKey('http://www.wenku8.net','jieqiVisitTime').replace('jieqiArticlesearchTime%3D',''))*1000<6000){\n  java.toast('搜索频率过高，延迟'+(new Date().getTime()-Number(cookie.getKey('http://www.wenku8.net','jieqiVisitTime').replace('jieqiArticlesearchTime%3D',''))*1000)/1000+'秒后继续')\n}\nwhile(new Date().getTime()-Number(cookie.getKey('http://www.wenku8.net','jieqiVisitTime').replace('jieqiArticlesearchTime%3D',''))*1000<6000){}\nresult", "weight": 0},{"bookSourceComment": "https://www.52shuku.net/", "bookSourceGroup": "⛎JJ城", "bookSourceName": "52书库po5[分页]", "bookSourceType": 0, "bookSourceUrl": "https://www.po5.net", "bookUrlPattern": "https?://www.po5.net/\\w+/b/\\w+.html", "customButton": false, "customOrder": -110, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "快穿小说::https://www.po5.net/tuijian/kuaichuan/{{page==1?'':'index_'+page+'.html'}}\n历史同人::https://www.52shuku.net/Tags_Nan/LiShiTongRen{{page==1?'.html':'_'+page+'.html'}}\n无CP小说::https://www.po5.net/Tags_Nan/wu-cp{{page==1?'.html':'_'+page+'.html'}}\n现代耽美::https://www.po5.net/xiandaidushi/<,index_{{page}}.html>\n穿越耽美::https://www.po5.net/chongsheng/<,index_{{page}}.html>\n古架耽美::https://www.po5.net/jiakong/<,index_{{page}}.html>\nG L 百合::https://www.po5.net/gl/<,index_{{page}}.html>\n综漫同人::https://www.po5.net/bl/<,index_{{page}}.html>\n言情小说::https://www.po5.net/yanqing/<,index_{{page}}.html>\n男频小说::https://www.po5.net/nan/<,index_{{page}}.html>", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 9) Mobile Safari/537.36\"}", "lastUpdateTime": "1789483581980", "respondTime": 8754, "ruleBookInfo": {"author": "h1@text##【.*|.*_", "canReName": "1", "intro": ".article-content@p.1@text##.*简介：|.*文案：", "kind": ".article-content@p.2@text##.*专题：", "lastChapter": "time.muted@text"}, "ruleContent": {"content": "#nr1@html", "replaceRegex": "##目录.*尾页|Tips：.*|传送门：.*|Top|.*http.*"}, "ruleExplore": {"author": "class.note@text##.*作者：|【.*", "bookList": ".content article!0", "bookUrl": "a.0@href", "intro": ".note@text##.*简介：|.*文案：", "kind": "class.note@text##简介：.*|文案：.*|.*【|】.*", "lastChapter": "span.-1@text", "name": "class.note@text##.*《|》.*"}, "ruleSearch": {"author": "class.note@text##.*作者：|【.*", "bookList": ".excerpt", "bookUrl": "a.0@href", "checkKeyWord": "燕王和我", "intro": ".note@text##.*简介：|.*文案：", "kind": "a.1@text", "name": "class.note@text##.*《|》.*", "wordCount": "class.note@text##.*【|】.*"}, "ruleToc": {"chapterList": "ul.list li a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "/so/search.php?q={{key}}<,&m=&f=_all&s=&p={{page}}>", "weight": 0},{"bookSourceComment": "合集：\nhttps://ww2.fuxsw.cc/\n同步：\nhttp://www.fuxs2.cc\nhttps://s.fuxs2.cc\nhttps://www.jiqinw.com/\nhttps://www.fuxiaoshu.com/", "bookSourceGroup": "☣️精选senhora", "bookSourceName": "👔 腐小说网（加粗）[分页]", "bookSourceType": 0, "bookSourceUrl": "https://www.fxshu.cc/", "customButton": false, "customOrder": -19, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\":\"现代耽美\",\"url\":\"/xiandai/<,list_{{page}}.html>\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.4}},{\"title\":\"古代耽美\",\"url\":\"/gudai/<,list_{{page}}.html>\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.4}},{\"title\":\"穿越重生\",\"url\":\"/chuanyue/<,list_{{page}}.html>\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.4}},{\"title\":\"玄幻灵异\",\"url\":\"/qihuan/<,list_{{page}}.html>\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.4}},{\"title\":\"网游竞技\",\"url\":\"/wangyou/<,list_{{page}}.html>\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.4}},{\"title\":\"同人耽美\",\"url\":\"/tongren/<,list_{{page}}.html>\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.4}},\n{\"title\":\"双性\",\"url\":\"/tags.php?/%E5%8F%8C%E6%80%A7/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"ABO\",\"url\":\"/tags.php?/ABO/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"种田文\",\"url\":\"/tags.php?/%E7%A7%8D%E7%94%B0%E6%96%87/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"甜文\",\"url\":\"/tags.php?/%E7%94%9C%E6%96%87/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"快穿\",\"url\":\"/tags.php?/%E5%BF%AB%E7%A9%BF/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"星际\",\"url\":\"/tags.php?/%E6%98%9F%E9%99%85/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"重生\",\"url\":\"/tags.php?/%E9%87%8D%E7%94%9F/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"末世\",\"url\":\"/tags.php?/%E6%9C%AB%E4%B8%96/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"穿书\",\"url\":\"/tags.php?/%E7%A9%BF%E4%B9%A6/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"强强\",\"url\":\"/tags.php?/%E5%BC%BA%E5%BC%BA/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"娱乐圈\",\"url\":\"/tags.php?/%E5%A8%B1%E4%B9%90%E5%9C%88/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"NP\",\"url\":\"/tags.php?/NP/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"男男\",\"url\":\"/tags.php?/%E7%94%B7%E7%94%B7/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"修真\",\"url\":\"/tags.php?/%E4%BB%99%E4%BE%A0%E4%BF%AE%E7%9C%9F/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"爽文\",\"url\":\"/tags.php?/%E7%88%BD%E6%96%87/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"校园\",\"url\":\"/tags.php?/%E6%A0%A1%E5%9B%AD/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"系统\",\"url\":\"/tags.php?/%E7%B3%BB%E7%BB%9F/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"短篇\",\"url\":\"/tags.php?/%E7%9F%AD%E7%AF%87/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"总受\",\"url\":\"/tags.php?/%E6%80%BB%E5%8F%97/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"破镜重圆\",\"url\":\"/tags.php?/%E7%A0%B4%E9%95%9C%E9%87%8D%E5%9C%86/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"无限流\",\"url\":\"/tags.php?/%E6%97%A0%E9%99%90%E6%B5%81/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"总攻\",\"url\":\"/tags.php?/%E6%80%BB%E6%94%BB/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"灵异神怪\",\"url\":\"/tags.php?/%E7%81%B5%E5%BC%82%E7%A5%9E%E6%80%AA/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"无CP\",\"url\":\"/tags.php?/%E6%97%A0CP/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"豪门世家\",\"url\":\"/tags.php?/%E8%B1%AA%E9%97%A8%E4%B8%96%E5%AE%B6/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"情有独钟\",\"url\":\"/tags.php?/%E6%83%85%E6%9C%89%E7%8B%AC%E9%92%9F/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"强制爱\",\"url\":\"/tags.php?/%E5%BC%BA%E5%88%B6%E7%88%B1/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"柯南\",\"url\":\"/tags.php?/%E6%9F%AF%E5%8D%97/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"调教\",\"url\":\"/tags.php?/%E8%B0%83%E6%95%99/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"父子\",\"url\":\"/tags.php?/%E7%88%B6%E5%AD%90/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"3P\",\"url\":\"/tags.php?/3P/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"年下\",\"url\":\"/tags.php?/%E5%B9%B4%E4%B8%8B/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"游戏网游\",\"url\":\"/tags.php?/%E6%B8%B8%E6%88%8F%E7%BD%91%E6%B8%B8/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"穿越时空\",\"url\":\"/tags.php?/%E7%A9%BF%E8%B6%8A%E6%97%B6%E7%A9%BA/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"重口\",\"url\":\"/tags.php?/%E9%87%8D%E5%8F%A3/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"综漫\",\"url\":\"/tags.php?/%E7%BB%BC%E6%BC%AB/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"虐文\",\"url\":\"/tags.php?/%E8%99%90%E6%96%87/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"萌宠\",\"url\":\"/tags.php?/%E8%90%8C%E5%AE%A0/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"狗血\",\"url\":\"/tags.php?/%E7%8B%97%E8%A1%80/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"强制\",\"url\":\"/tags.php?/%E5%BC%BA%E5%88%B6/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"甜宠\",\"url\":\"/tags.php?/%E7%94%9C%E5%AE%A0/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"SM\",\"url\":\"/tags.php?/SM/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"强攻强受\",\"url\":\"/tags.php?/%E5%BC%BA%E6%94%BB%E5%BC%BA%E5%8F%97/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"有肉\",\"url\":\"/tags.php?/%E6%9C%89%E8%82%89/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"直播\",\"url\":\"/tags.php?/%E7%9B%B4%E6%92%AD/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"宫廷侯爵\",\"url\":\"/tags.php?/%E5%AE%AB%E5%BB%B7%E4%BE%AF%E7%88%B5/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"美食\",\"url\":\"/tags.php?/%E7%BE%8E%E9%A3%9F/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"年代文\",\"url\":\"/tags.php?/%E5%B9%B4%E4%BB%A3%E6%96%87/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}}]", "header": "{\n\t\"User-Agent\": \"Mozilla/5.0 (Linux; Android 9) Mobile Safari/537.36\",\"referer\":\"{{baseUrl}}\"\n\t}", "lastUpdateTime": "1789473843684", "respondTime": 181641, "ruleBookInfo": {"author": "##作者：([^<]+)<##$1###", "intro": "tag.div.12@html##(?s)(?:☆、)?(?:楔子|第\\s*[一1]\\s*[卷章]).*|\\w{5}小说\\||\\耽美小说-腐小说", "kind": "tag.div.10@tag.a.-1@text&&tag.div.11@tag.span.1@tag.a@text&&tag.div.11@tag.span.0@text##.*：|\\s.*", "lastChapter": "tag.div.13@tag.a.-1@text"}, "ruleContent": {"content": "tag.div.12@html", "imageStyle": "0"}, "ruleExplore": {"author": "tag.a.0@text##.*作者：", "bookList": "class.list_article@ul@li", "bookUrl": "tag.a.0@href", "coverUrl": "@js:'https://pic3.zhimg.com/80/v2-053a0564f1b0b10eb73feac1e1819f5a_1440w.jpg'", "intro": "class.desc.0@text", "lastChapter": "class.time.0@text", "name": "tag.a.0@b@text||tag.a.0@strong@text"}, "ruleSearch": {"author": "##作者：([^<]+)<##$1###", "bookList": "class.list_article@ul@li", "bookUrl": "tag.a.1@href", "checkKeyWord": "冒牌货", "coverUrl": "@js:'https://pic3.zhimg.com/80/v2-053a0564f1b0b10eb73feac1e1819f5a_1440w.jpg'", "intro": "class.desc.0@text", "kind": "tag.a.0@text&&tag.p.0@text##\\(|\\)", "lastChapter": "class.time.0@text", "name": "tag.a.1@text##\\作者：.*"}, "ruleToc": {"chapterList": "//a[text()=\"下一页\"]/../following-sibling::li/a", "chapterName": "text##(\\d+)##第$1页", "chapterUrl": "href"}, "searchUrl": "https://www.fxshu.cc/plus/hsearch.php?q={{key}},{\n\"method\": \"POST\",", "weight": 0},{"bookSourceComment": "搜索不到时可以尝试以下格式搜索（注意关闭精确搜索）\n##完整书名", "bookSourceGroup": "☣️精选senhora", "bookSourceName": "晋江文学（搜索）", "bookSourceType": 0, "bookSourceUrl": "https://m.jjwxc.net/channel", "customButton": false, "customOrder": -90, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>\n//一行个数\nvar nums = 4 ;\n//分隔符\nvar separator = '::'\n\n//标题::链接::一行个数::分类\n\nall=[\"今日限免::https://app-cdn.jjwxc.net/bookstore/getFullPage?channel=novelfree\",\"我的收藏::http://app.jjwxc.org:80/androidapi/incrementFavorite?versionCode=185&token={{cookie.getKey('http://m.jjwxc.net','sid')}}&backupTime=&order=1\",\"点击签到::https://m.jjwxc.net/my/signIn,{'headers':'cookie':'sid={{cookie.getKey(\\\"http://m.jjwxc.net\\\",\\\"sid\\\")}}'}\",\"百合搜索::https://app.jjwxc.org/search/getSearchForKeyWords?versionCode=226&offset={{(page-1)*20}}&limit=20&bq=0&removetags=0&fw=0&yc=0&xx=3&sd=0&lx=0&fg=0&mainview=0&fbsj=0&searchkeyWords={{String(source.getVariable()).match(/^搜索(.*)/)[1]}}&isfinish=2&token={{cookie.getKey('http://m.jjwxc.net','sid')}}&sortType=0\",\"🌸     百合全部    🌸::https://app-cdn.jjwxc.net/bookstore/getFullPage?channel=bhxs&version=3::1\",\"频道金榜::229\",\"重来一世::2222000013\",\"幻想未来::2222000023\",\"架空历史::2222000015\",\"都市情缘::2222000024\",\"穿越时空::2222000016\",\"天赐良缘::2222000025\",\"时尚娱乐::2222000026\",\"奇幻异闻::2222000014\",\"系统快穿::2280000168\",\"宫廷侯爵::2280000164\",\"业界精英::2280000166\",\"情有独钟::2280000170\",\"运气淘文::2240000009\",\"勤奋更新::2226000013\",\"月度排行::2222000004\",\"季度排行::2222000005\",\"年度排行::2222000006\",\" VIP新文 ::2222000002\",\"新晋作者::2222000003\",\"🌸    百合完结    🌸::https://android.jjwxc.com/search/getSearchForKeyWords?versionCode=221&offset={{(page-1)*20}}&limit=20&bq=0&removetags=0&fw=0&yc=0&xx=3&sd=0&lx=0&fg=0&mainview=0&fbsj=0&isfinish=2&token={{cookie.getKey('https://m.jjwxc.net','sid')}}&sortType=2::1\",\"重来一世::2222000031\",\"幻想未来::2222000039\",\"架空历史::2222000033\",\"都市情缘::2222000040\",\"穿越时空::2222000034\",\"天赐良缘::2222000041\",\"时尚娱乐::2222000042\",\"奇幻异闻::2222000032\",\"系统快穿::2280000169\",\"宫廷侯爵::2280000165\",\"业界精英::2280000167\",\"情有独钟::2280000171\",\"🌸    百合连载    🌸::::1\",\"重来一世::2222000013\",\"幻想未来::2222000023\",\"架空历史::2222000015\",\"都市情缘::2222000024\",\"穿越时空::2222000016\",\"天赐良缘::2222000025\",\"时尚娱乐::2222000026\",\"奇幻异闻::2222000014\",\"系统快穿::2280000168\",\"宫廷侯爵::2280000164\",\"业界精英::2280000166\",\"情有独钟::2280000170\",\"-------- 标签[百合] --------::::1\",\"快穿::125::::bq\",\"穿书::134::::bq\",\"甜文::124::::bq\",\"重生::75::::bq\",\"爽文::137::::bq\",\"系统::122::::bq\",\"强强::19::::bq\",\"星际::135::::bq\",\"生子::20::::bq\",\"校园::185::::bq\",\"末世::81::::bq\",\"女配::96::::bq\",\"美食::99::::bq\",\"异能::72::::bq\",\"玄学::206::::bq\",\"打脸::138::::bq\",\"清穿::18::::bq\",\"女强::82::::bq\",\"直播::142::::bq\",\"年下::21::::bq\",\"武侠::11::::bq\",\"逆袭::184::::bq\",\"宫斗::74::::bq\",\"日韩::86::::bq\",\"婚恋::78::::bq\",\"竞技::70::::bq\",\"科举::174::::bq\",\"萌宠::205::::bq\",\"恐怖::29::::bq\",\"机甲::97::::bq\",\"科幻::28::::bq\",\"洪荒::67::::bq\",\"血族::69::::bq\",\"宅斗::73::::bq\",\"网红::141::::bq\",\"成长::183::::bq\",\"职场::98::::bq\",\"经商::180::::bq\",\"网配::84::::bq\",\"美娱::140::::bq\",\"商战::123::::bq\",\"传奇::89::::bq\",\"聊斋::188::::bq\",\"婆媳::80::::bq\",\"爱情::1::::lx\",\"武侠::2::::lx\",\"奇幻::3::::lx\",\"仙侠::4::::lx\",\"游戏::5::::lx\",\"传奇::6::::lx\",\"科幻::7::::lx\",\"童话::8::::lx\",\"惊悚::9::::lx\",\"悬疑::10::::lx\",\"剧情::16::::lx\",\"娱乐圈::64::::bq\",\"种田文::66::::bq\",\"年代文::173::::bq\",\"无限流::83::::bq\",\"少年漫::90::::bq\",\"古穿今::65::::bq\",\"升级流::139::::bq\",\"少女漫::14::::bq\",\"原著向::93::::bq\",\"姐弟恋::186::::bq\",\"大冒险::198::::bq\",\"轻小说::17::::lx\",\"穿越时空::60::::bq\",\"仙侠修真::68::::bq\",\"豪门世家::33::::bq\",\"随身空间::56::::bq\",\"情有独钟::39::::bq\",\"灵异神怪::26::::bq\",\"破镜重圆::47::::bq\",\"英美衍生::17::::bq\",\"虐恋情深::42::::bq\",\"青梅竹马::62::::bq\",\"超级英雄::132::::bq\",\"宫廷侯爵::32::::bq\",\"异世大陆::57::::bq\",\"悬疑推理::128::::bq\",\"天作之合::52::::bq\",\"天之骄子::54::::bq\",\"游戏网游::92::::bq\",\"都市情缘::30::::bq\",\"性别转换::24::::bq\",\"现代架空::126::::bq\",\"未来架空::127::::bq\",\"欢喜冤家::41::::bq\",\"前世今生::49::::bq\",\"幻想空间::25::::bq\",\"复仇虐渣::145::::bq\",\"东方玄幻::144::::bq\",\"朝堂之上::178::::bq\",\"奇幻魔幻::27::::bq\",\"励志人生::121::::bq\",\"民国旧影::61::::bq\",\"布衣生活::38::::bq\",\"业界精英::101::::bq\",\"历史衍生::91::::bq\",\"女扮男装::136::::bq\",\"市井生活::175::::bq\",\"古代幻想::189::::bq\",\"西方罗曼::59::::bq\",\"平步青云::55::::bq\",\"相爱相杀::103::::bq\",\"因缘邂逅::45::::bq\",\"灵魂转换::23::::bq\",\"魔法幻情::191::::bq\",\"西方名著::16::::bq\",\"江湖恩怨::35::::bq\",\"异国奇缘::37::::bq\",\"花季雨季::31::::bq\",\"制服情缘::85::::bq\",\"都市异闻::181::::bq\",\"古典名著::130::::bq\",\"近水楼台::46::::bq\",\"亡灵异族::192::::bq\",\"乔装改扮::51::::bq\",\"小门小户::177::::bq\",\"时代奇缘::22::::bq\",\"史诗奇幻::199::::bq\",\"阴差阳错::53::::bq\",\"恋爱合约::48::::bq\",\"异闻传说::196::::bq\",\"边缘恋歌::44::::bq\",\"三教九流::36::::bq\",\"骑士与剑::63::::bq\",\"七年之痒::79::::bq\",\"授权衍生::148::::bq\",\"异想天开::190::::bq\",\"乡村爱情::58::::bq\",\"爱情战争::50::::bq\",\"时尚流行::182::::bq\",\"时代新风::210::::bq\",\"古典衍生::20::::lx\",\"东方衍生::18::::lx\",\"西方衍生::19::::lx\",\"其他衍生::21::::lx\"];\n\n\n\n//@天天gg@酷安 下面不要动\nfunction parse(data){\n\tlet args=data.split(separator);\n\tlet title = args[0],url=args[1],num=nums;\n\t\n\t//链接生成\n\t let u=/^\\d+/.test(url)?\"http://app-cdn.jjwxc.net/bookstore/getFullPage?channelBody=%7B%\"+url+\"%22%3A%7B%22offset%22%3A%22{{(page-1)*25}}%22%2C%22limit%22%3A%2225%22%7D%7D&versionCode=148\":url;\n try {num = args[2] }catch(e){}\n try {tag = args[3];\n u=tag==\"bq\"?'https://android.jjwxc.com/search/getSearchForKeyWords?versionCode=221&offset={{(page-1)*20}}&limit=20&bq='+url+'&removetags=0&fw=0&yc=0&xx=3&sd=0&lx=0&fg=0&mainview=0&fbsj=0&collectionTypes=ors&isfinish=0&sortType=0&token={\\{cookie.getKey(\"https://m.jjwxc.net\",\"sid\")}\\}':u;\n u=tag==\"lx\"?'https://android.jjwxc.com/search/getSearchForKeyWords?versionCode=221&offset={{(page-1)*20}}&limit=20&bq=0&removetags=0&fw=0&yc=0&xx=3&sd=0&lx='+url+'&fg=0&mainview=0&fbsj=0&collectionTypes=ors&isfinish=0&sortType=0&token={\\{cookie.getKey(\"https://m.jjwxc.net\",\"sid\")}}':u\n }catch(e){}\n\treturn [title, u, num]\n\t}\n\nfunction FlexBox(title, url, num){\n\t\t let obj={};\n\t\t obj.style={},obj.title=title,obj.url=url?url:'',obj.style['layout_flexGrow']=1;\n\t//数值设定\n\tlet data={1:1,2:0.4,3:0.25,4:0.2,5:0.15,7:0.1,10:0.05};\nobj.style['layout_flexBasisPercent']=data[num]\n\t\treturn obj\n\t\t}\nresult=JSON.stringify(all.map(data=>{\n\tlet args=parse(data);\n\treturn FlexBox.apply(null, args)\n\t}))\n</js>", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Linux; U; Android 8.0.0; zh-cn; MIX 2 Build/OPR1.170623.027) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1\"\n}", "lastUpdateTime": "1789474370608", "loginUrl": "http://m.jjwxc.net", "respondTime": 41525, "ruleBookInfo": {"author": "$.authorName", "canReName": "1", "coverUrl": "$.novelCover", "intro": "<js>\n//请假条\ntry{\na=JSON.parse(java.ajax('http://app.jjwxc.org/androidapi/getnovelOtherInfo?novelId='+baseUrl.match(/(\\d+)/)[1]+'&type=novelbasicinfo&versionCode=163'));\n\njava.put(\"pv\",a.novelreview)\n\n$=a.novelLeave;\nn='\\n';\nleave=$.leaveContent?'————————•————————'+n+'​'+n+$.leaveDateBack+n+'​'+'​'+'      '+$.leaveContent+n+$.leaveDate.replace(/请假时间：/,'⌚️')+n+$.leaveIntro:'';\njava.put('leave',leave);\njava.put('intro',JSON.parse(result).novelIntro.replace(/\\#/g,'＃'));\nresult}catch(err){\njava.log(err);\njava.put('leave',\"\");\njava.put('intro',\"\");\n}\n</js>\n&nbsp;&nbsp;📖{{$.novelIntroShort##。$}}📖{{'\\n&lrm;'}}<br>\n🏆{{$.ranking}}    🍼{{$.nutrition_novel}}    📝{{$.comment_count}}    🔖{{$.novelStyle}}\n◉ 标签：{{$.novelTags##,|\\s##🏷}}<br>\n◉ {{$.protagonist##,|，|；|;##、}}<br>\n◉ {{$.costar##,|，|；|;##、}}<br>\n◉ {{$.other##,|，|；|;##、}}<br>\n◉ 视角：{{$.mainview}}<br>\n◉ 评分：{{java.get(\"pv\")}}<br>\n◉ 收藏：{{$.novelbefavoritedcount}}<br>\n{{String(java.get('intro')).replace(/立意:/,'◎◎ 立意：')}}<br>{{java.get('leave')}}<br>\n{{'\\n'+'​'}}\n\n<js>\nresult=String(result);\nli=result.match(/◎ 立意.*/)?'&lrm;\\n'+result.match(/(◎ 立意.*?<br>)/)[1]:'';\nString(result).replace(/📖📖|📖''📖/,'').replace(/(◉ 收藏.*?<br>)/,'$1\\n'+li+'&lrm;\\n'+'————————•————————\\n').replace(/◎◎ 立意.*<br>/,'').replace(/(?:◉ 标签：|◉ 主角：|◉ 配角：|◉ 其它：|◉ 视角：|◉ 评分：|&lrm;\\n◎ 立意：)<br>/g,'')</js>", "kind": "{{step=java.getString('$.novelStep')=='2'?'已完结':'连载中';}},{{$.novelClass&&$.novelTags}}##-##,", "lastChapter": "<js>\ntry{last=JSON.parse(java.ajax('http://android.jjwxc.net/androidapi/chapterList?novelId='+baseUrl.match(/(\\d+)/)[1])).chapterlist;\n$=last[last.length-1];\nvip=$.isvip?'🔒':'';\nchapterid=$.chapterid;\nchaptername=$.chaptername;\ndate=$.chapterdate;\nvip+chapterid+'.'+chaptername+'•'+date}\ncatch(err){\nresult=\"请刷新或暂无目录\"\n}\n</js>", "name": "$.novelName", "tocUrl": "http://app-cdn.jjwxc.net/androidapi/chapterList?novelId={{baseUrl.match(/novelId=(\\d+)/)[1]}}&more=0&whole=1", "wordCount": "$.novelSize##,"}, "ruleContent": {"content": "<js>\nif(baseUrl.match(/jjwxc/)){\nintro=java.get(\"intro1\");\n\nintro=intro!=\"\"?\"◎\"+intro+\"◎<br>\":\"\";\ncontent=java.getElement(\"$.content\");\n\nsaybody=java.getString(\"$.sayBody\");\nsay=saybody!=\"\"?\"\\n作者有话说：\\n\"+saybody:\"\";\nif(baseUrl.match(/token/)){\n\tvipc=/^DcAWGQtI44o=$/.test(content)?JSON.parse(src).message:java.createSymmetricCrypto(\"DES/CBC/PKCS5Padding\", String(\"KK!%G3JdCHJxpAF3%Vg9pN\"), String(\"1ae2c94b\")).decryptStr(content)\n\t\nresult=intro+String(vipc+say);\n}else{result=intro+content+say}\n\n}else{result=\"&lrm;\"}\n\n\n//评论开启\nbbb = book.getVariable(\"custom\")\nsss=source.getVariable()\nif(/评论/.test(bbb) || /评论/.test(sss)){\n\tjava.log(sss)\nlet commentNum =/评论/.test(bbb)?bbb.match(/评论(\\d+)/)[1]:sss.match(/评论(\\d+)/)[1];\ncommentUrl = baseUrl.replace(/androidapi/,'comment').replace(/chapterContent/,'getCommentList')+\"&limit=\"+commentNum+\"&offset=0\";\n\ncomment = JSON.parse(java.ajax(commentUrl));\ncommentList =comment.commentList || comment.data.commentList;\ncommentb = \"\";\nfor(i=0;i<commentList.length;i++){\n\tlet b = commentList[i];\n\tlet author = b.commentAuthor;\n\tlet body = b.commentBody;\n\tlet time = b.commentDate;\n\tcommentb+=\"▪\"+author+\" ——\"+time+\"▪\\n\"+body+\"\\n\";\n\t}\nresult = result + \"\\n&lrm;\\n最新评论：\\n\" + commentb\n}\nresult\n</js>\n##为营造更好的评论环境，近期网站要求发评须进行实名认证，未实名用户评论暂时仅在对应作者后台及发评用户后台可见.*|获取正文失败[\\s\\S]+|◎\\s+?◎", "imageStyle": "TEXT", "replaceRegex": "@js:\n//去除章节简介与正文重复\nif(/^◎/.test(result) ){\nchapter = result.match(/◎([\\s\\S]+?)…*◎/)[1].replace(/\\s/g,'');\nchapter2=result.match(/◎[\\s\\S]+?◎([\\s\\S]+)/)[1].replace(/\\s/g,'');\n\n//前十个字相同就删除\nnum = 10\nif(chapter.substring(0,num)==chapter2.substring(0,num)){\n\tresult = result.replace(/◎[\\s\\S]+?◎/,'')\n\t}else{result}\n}else{result}"}, "ruleExplore": {"author": "$.authorName||$.authorname", "bookList": "@JSon:$..[?(@.novelName)]&&$..[?(@.novelname)]&&$.massage\n<js>\nif(result){\nfunction remove(a,b){\nlet delIndexList = a; // 要删除的序列\n if (delIndexList.length !== 0) { \nfor (let i = delIndexList.length - 1; i >= 0; i--) { b.splice(delIndexList[i], 1) } \nreturn b\n}\n}\n\nif(baseUrl=='https://app-cdn.jjwxc.net/bookstore/getFullPage?channel=bhxs&version=3'||baseUrl.match(/novelfree/)){\nlist=JSON.parse(src);\nfor(i in list){\nchannelName=list[i].channelName;\nblist=list[i].data;\nif(blist!=\"undefined\"){\nfor(j in blist){\nblist[j].channelName=channelName\n}}else{blist.channelName=channelName}\n\n}\nif(!baseUrl.match(/novelfree/)){\nlist=remove([0, 6,11,12,13],list)\n}else{\nlist=remove([1],list)\n}\nresult=JSON.stringify(list);}\nelse if(baseUrl.match(/signIn|getSearchForKeyWords/)){\nresult=\"{signIn:[\"+src+\"]}\"\n}\nelse{result=result}\n}else{result=\"\"}\n</js>\n$..[?(@.novelName)]&&$..[?(@.novelname)]&&$.signIn[*]", "bookUrl": "http://app-cdn.jjwxc.net/androidapi/novelbasicinfo?novelId={{$.novelid||$.novelId}}@put:{id:$.novelid||$.novelId}", "coverUrl": "@JSon:$.cover||$.novelCover||$.ebookurl", "intro": "$.novelIntroShort||$.novelintroshort\n<js>\nfree=\"{{$.freeDate}}\";\nif(free!=\"\"){\nresult=\"限免日期：🗓\"+free+\"\\n\"+result\n}else{\nresult=result\n}\n</js>", "kind": "@JSon:$.channelName&&$.tags&&$.novelSizeformat##\\s+##,", "lastChapter": "第{{$.maxChapterId}}章##第章", "name": "$.novelName||$.novelname||$.message", "wordCount": "$.novelStep||$.novelstep\n@js:result==2?'已完结':'连载中';"}, "ruleSearch": {"author": "author", "bookList": "class.cytable@tag.tr[1:20]@tag.a[1]||$.items[:20]\n<js>\nlist=result.toArray();\njson=[];\nfor(i in list){\nid=String(list[i]).match(/href/)?String(list[i].attr(\"href\")).match(/(\\d+)/)[1]:list[i].novelid;\nurl=\"http://www.jjwxc.net/onebook.php?novelid=\"+id;\nhtml=String(java.ajax(url));\njava.setContent(html);\nJ=org.jsoup.Jsoup.parse(html);\n\ndes=String(J.select(\"span[style='color:#F98C4D']\").text()).replace(/立意：/,'◎ ').replace(/一句话简介：/,'◎ ')+\"◎\"+java.getElement(\"id.novelintro\").text();\ntitle=J.select('h1[itemprop=\"name\"]').text();\nauthor=J.select('span[itemprop=\"author\"]').text();\ncover=J.select(\".noveldefaultimage\").attr(\"src\");\ncat=String(J.select('a[style=\"text-decoration:none;color: red;\"]').text()).replace(/\\s/g,',');\nstatus=J.select('span[itemprop=\"updataStatus\"]').text();\nsize=String(J.select('span[itemprop=\"wordCount\"]').text()).replace(/字/,'');\nn=String(java.getElement('@@id.oneboolt@tag.tr.-2@span').text()).replace(/\\n/,'•').replace(/\\*最新更新/,'').replace(/(.*?)\\[VIP\\]/,'🔒$1');\nnum=java.getElement('@@id.oneboolt@tag.tr.-2@tag.td.0').text();\ngenre=J.select('[itemprop=\"genre\"]').text().split('-')[1];\njson.push({\ntitle:title,\nauthor:author,\ncat:status+\",\"+cat+','+genre,\nsize:size,\nurl:\"http://app-cdn.jjwxc.net/androidapi/novelbasicinfo?novelId=\"+id,\ndes:des,\nnew:String(num+\"、\"+n).replace(/(\\d+、)🔒/,'🔒$1'),\ncover:cover\n})\n}\njson\n</js>", "bookUrl": "url", "coverUrl": "cover", "intro": "des", "kind": "cat", "lastChapter": "new", "name": "title", "wordCount": "size"}, "ruleToc": {"chapterList": "$.chapterlist\n<js>\nbook.canUpdate;\nresult = result==\"[]\"?JSON.stringify([{\"chaptername\":\"暂无目录\",\"chapterid\":\"\",\"islock\":\"0\"}]):result;\n</js>\n$.[*]", "chapterName": "<js>\n$=result;\ntitle=$.chaptername;\ntitle=String(title).replace(/^\\s+/,'');\nintro=$.chapterintro;\nvip=$.isvip!='0';\nlock=$.islock!='0';\ntype=$.chaptertype=='1'?true:false;\nnum=!type?$.chapterid+\"  ☪ \":'';\n\n//下面被注释的代码是已经有章节数的前面就不加序号了\nbbb = book.getVariable(\"custom\");\nsss = source.getVariable();\nif(/去章节序号/.test(bbb) || /去章节序号/.test(sss)){\nnum=''\n}else{num=num}\n\ntitle=type?'📖 '+title+' 📖':title;\nif( (/目录简介/.test(bbb) || /目录简介/.test(sss))&&!/📖/.test(title)){\n\ttitle = title + \" ❖ \"+intro\n\t}else{\n\t\ttitle = title\n\t\tjava.put(\"intro1\",intro);\n\t\t}\nv=vip&&!type?' ◇':'';\nl=lock?'[此章节已锁]':'';\nresult=num+title+l+v;\n</js>", "chapterUrl": "@js:\n$=result;\ncookie=cookie.getKey(\"http://m.jjwxc.net\",\"sid\");\nchapterid=$.chapterid;\nvip=$.isvip!='0';\n\ntype=$.chaptertype=='1';\n\nif( !type){\nif(!vip){\nresult='https://app.jjwxc.net/androidapi/chapterContent?novelId='+baseUrl.match(/novelId=(\\d+)/)[1]+'&chapterId='+chapterid\n}else{result=\"https://app.jjwxc.net/androidapi/chapterContent?novelId=\"+baseUrl.match(/novelId=(\\d+)/)[1]+'&versionCode=191&token='+cookie+'&chapterId='+chapterid}\n}else{ result=\"\"}", "isVolume": "<js>\n\"{{$.chaptertype}}\"=='1'?true:false;\n</js>", "updateTime": "{{$.chaptersize}}字•{{$.chapterdate}}•{{$.chapterintro##^\\s*}}##^•|0000-00-00.*|^0字•|•$"}, "searchUrl": "@js:\nif(/^##/.test(key)){\n\tresult = \"https://android.jjwxc.net/androidapi/search?versionCode=191&keyword={{key}}&type=1&page={{page}}&searchType=8&sortMode=DESC\"\n\t}else{\n\t\tresult = 'http://www.jjwxc.net/bookbase.php?searchkeywords={{key}}&page={{page}},{\"charset\": \"gbk\"}'\n\t\t}", "variableComment": "1、书籍变量（当前书）\n填写 [去章节序号] —— 去除章节序号\n填写 [目录简介] —— 章节简介放到目录列表，正文不出现\n填写 [评论+评论数量]——如 评论50  则可以显示50条评论，数量必填\n\n2、源变量（所有书）\n其余同书籍变量\n填写[搜索+书名] —— 必须在第一行，搜索百合书籍，在发现里点击[百合搜索]\n\n更改过后都要重新刷新", "weight": 0},{"bookSourceComment": "腐小说\nhttp://www.fuxsb.com\nhttps://b1.fuxsw.cc/\nfxs8.cc\nhttp://www.fuxsb.cc\nhttp://www.Fuxsw.cc\nhttp://www.fuxs.top/\nhttp://www.fxshu.top/\nhttp://www.fxsw.org/\n\thttp://www.jiqinw.com\nhttp://www.fuxiaoshu.com/", "bookSourceGroup": "⛎JJ城", "bookSourceName": "🐑繁星四月[分页]", "bookSourceType": 0, "bookSourceUrl": "http://www.fuxsb.cc", "customButton": false, "customOrder": -5, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{'title':'首页分类','url':'','style':{layout_flexGrow:1,layout_flexBasisPercent:1}},\n{'title':'现代耽美','url':'http://www.fuxs1.com/xiandai/<,list_{{page}}.html>','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'古代耽美','url':'http://www.fuxs1.com/gudai/<,list_{{page}}.html>','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'穿越重生','url':'http://www.fuxs1.com/chuanyue/<,list_{{page}}.html>','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'玄幻灵异','url':'http://www.fuxs1.com/qihuan/<,list_{{page}}.html>','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'网游竞技','url':'http://www.fuxs1.com/wangyou/<,list_{{page}}.html>','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'同人耽美','url':'http://www.fuxs1.com/tongren/<,list_{{page}}.html>','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'全部排行','url':'','style':{layout_flexGrow:1,layout_flexBasisPercent:1}},\n{'title':'最新更新','url':'/zx/<,list_{{page}}.html>','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'近期热门','url':'/tietui/<,list_{{page}}.html>','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'总排行榜','url':'/paihang/<,list_{{page}}.html>','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'现代排行','url':'/paihang/xd/<,list_{{page}}.html>','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'古代排行','url':'/paihang/gd/<,list_{{page}}.html>','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'穿越排行','url':'/paihang/cy/<,list_{{page}}.html>','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'玄幻排行','url':'/paihang/xh/<,list_{{page}}.html>','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'网游排行','url':'/paihang/wy/<,list_{{page}}.html>','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'同人排行','url':'/paihang/tr/<,list_{{page}}.html>','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'2026排行','url':'/paihang/nian/<,list_{{page}}.html>','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'2025排行','url':'/paihang/2025y.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'2024排行','url':'/paihang/2024y.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'2023排行','url':'/paihang/2023y.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'2022排行','url':'/paihang/2022y.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'2021排行','url':'/paihang/2021y.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'2020排行','url':'/paihang/2020y.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'2019排行','url':'/paihang/2019y.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'2018排行','url':'/paihang/2018y.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'最热标签','url':'','style':{layout_flexGrow:1,layout_flexBasisPercent:1}},\n{'title':'甜文','url':'/tags-197-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'强强','url':'/tags-170-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'爽文','url':'/tags-183-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'重生','url':'/tags-2-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'穿书','url':'/tags-225-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'系统','url':'/tags-171-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'生子','url':'/tags-15-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'快穿','url':'/tags-218-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'年下','url':'/tags-192-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'星际','url':'/tags-202-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'校园','url':'/tags-221-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'甜宠','url':'/tags-730-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'短篇','url':'/tags-619-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'打脸','url':'/tags-214-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'综漫','url':'/tags-249-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'美食','url':'/tags-488-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'末世','url':'/tags-435-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'异能','url':'/tags-284-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'架空','url':'/tags-233-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'年上','url':'/tags-292-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'萌宠','url':'/tags-870-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'直播','url':'/tags-601-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'成长','url':'/tags-743-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'狗血','url':'/tags-765-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'HE','url':'/tags-677-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'ABO','url':'/tags-191-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'主攻','url':'/tags-255”-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'西幻','url':'/tags-633-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'武侠','url':'/tags-257-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'权谋','url':'/tags-996-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'轻松','url':'/tags-253-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'基建','url':'/tags-1087-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'克苏鲁','url':'/tags-1154-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'纸片人','url':'/tags-1262-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'升级流','url':'/tags-1043-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'反套路','url':'/tags-1234-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'无限流','url':'/tags-216-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'万人迷','url':'/tags-687-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'第四天灾','url':'/tags-1322-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'英美衍生','url':'/tags-845-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'超级英雄','url':'/tags-217-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'异想天开','url':'/tags-971-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'西方罗曼','url':'/tags-703-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'历史衍生','url':'/tags-901-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'情有独钟','url':'/tags-3-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'穿越时空','url':'/tags-222-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'灵异神怪','url':'/tags-4-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'豪门世家','url':'/tags-206-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'仙侠修真','url':'/tags-224-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'都市情缘','url':'/tags-17-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'幻想空间','url':'/tags-234-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'破镜重圆','url':'/tags-11-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'欢喜冤家','url':'/tags-194-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'天作之合','url':'/tags-196-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'宫廷侯爵','url':'/tags-263-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'天之骄子','url':'/tags-228-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'现代架空','url':'/tags-396-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'励志人生','url':'/tags-223-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'游戏网游','url':'/tags-242-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'未来架空','url':'/tags-231-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'业界精英','url':'/tags-414-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'前世今生','url':'/tags-410-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'悬疑推理','url':'/tags-205-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'随身空间','url':'/tags-229-{{page}}.html','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'这是空的','url':'','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}}]", "lastUpdateTime": "1789472242420", "respondTime": 180834, "ruleBookInfo": {"author": ".atts strong@text||.ccfun strong@text", "intro": ".wz-nr@html||.conbd@html||.ttt_tm@html##第.*?章[\\s\\S]+", "kind": "class.atts@tag.span.1@a@text||class.ccfun@tag.span.1@a@text", "lastChapter": "##<span>时间：(.*?)</span>##$1###", "name": "h1@text"}, "ruleContent": {"content": ".conbd@html||.co-by@html", "replaceRegex": "##Fxsw.org|[0-9a-zA-Z]{3}BL小说\\|耽美小说-腐小说"}, "ruleExplore": {"author": "##作者：([^<]+)##$1###", "bookList": ".list_article ul li", "bookUrl": "h2@a@href||class.about3@tag.a.-1@href", "intro": ".desc@text", "kind": ".tags@text", "lastChapter": "span.1@text", "name": "h2@a@title||.about3 strong@text||h2@text"}, "ruleSearch": {"author": ".click@text", "bookList": "class.list_article@ul@li", "bookUrl": "h2@a@href", "checkKeyWord": "主角", "intro": "p@html", "kind": "tag.a.0@text", "lastChapter": ".time@text", "name": "h2@text##\\上.*|\\中.*|\\下.*|\\番外.*"}, "ruleToc": {"chapterList": "@js:\nn=result.match(/共(\\d+)页/)[1];\nlist=[];\nlist.push({name:'第1页',url:baseUrl});\nfor(var i=2;i<=n;i++){\nurl1=baseUrl.replace(/.html/,'')+'_'+i+'.html';\nlist.push({name:'第'+i+'页',url:url1});\n}list", "chapterName": "name", "chapterUrl": "url"}, "searchUrl": "/e/search/index.php,{\n\"method\": \"POST\",\n\"body\": \"keyboard={{key}}&show=title,writer,ftitle,keyboard&tempid=1&tbname=article\"\n}", "weight": 0},{"bookSourceComment": "http://m.fushutxt.cc\n\n搜索间隔30s", "bookSourceGroup": "☣️精选senhora", "bookSourceName": "福书网🎃[分页]", "bookSourceType": 0, "bookSourceUrl": "https://m.fushuw.org", "bookUrlPattern": "http://m.fushuw.org/\\w+/\\d+.html", "customButton": false, "customOrder": -1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "🪵最近更新🪵::lastdate/{{page==1?'':'index_'+page+'.html'}}\n现代都市::xiandaidushi/{{page==1?'':'index_'+page+'.html'}}\n古代架空::gudaijiakong/{{page==1?'':'index_'+page+'.html'}}\n穿越重生::chuanyuechongsheng/{{page==1?'':'index_'+page+'.html'}}\n玄幻灵异::xuanhuanlingyi/{{page==1?'':'index_'+page+'.html'}}\n推理悬疑::tuilixuanyi/{{page==1?'':'index_'+page+'.html'}}\n网游竞技::wangyoujingji/{{page==1?'':'index_'+page+'.html'}}\n B L 同人::BLtongren/{{page==1?'':'index_'+page+'.html'}}\n G L 百合::GLbaihe/{{page==1?'':'index_'+page+'.html'}}\n本站推荐::bztuijian/{{page==1?'':'index_'+page+'.html'}}\n周排行榜::bzremenweek/{{page==1?'':'index_'+page+'.html'}}\n月排行榜::bzremenmonth/{{page==1?'':'index_'+page+'.html'}}", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 9) Mobile Safari/537.36\"}", "lastUpdateTime": "1789471104770", "respondTime": 180058, "ruleBookInfo": {"author": "text.作者：.0@text##.*作者：", "coverUrl": "img@data-original", "intro": "#text p:gt(5):lt(13)@html", "name": "h1@text"}, "ruleContent": {"content": "#text>p@textNodes"}, "ruleExplore": {"author": "p.1@text||span.1@text\n@js: result##.*作者：", "bookList": ".book-li", "bookUrl": "a@href", "coverUrl": "img@src", "kind": "p.2@text||span.2@text\n@js:result##类型：|时间：", "name": "h4@text"}, "ruleSearch": {"author": "span.-1@text", "bookList": "h2", "bookUrl": "a@href", "checkKeyWord": "冒牌货", "name": "a@text"}, "ruleToc": {"chapterList": "@js:\nvar page=src.match(/<b>(\\d+)<.b>/)[1];\nvar url=baseUrl.replace(/.html/,\"_0.html\")\nvar list=[{text:\"第1页\",href:baseUrl}];\nif(page&&list){\n\tfor(i=1;i<page;i++){\n\t\tlist.push({text:`第${i+1}页`,href:url.replace(/_0/,\"_\"+i)})\n\t\t}\n\t\tlist;\n\t}else{\n\t\tjava.longToast(\"目录获取失败，检查网络或稍后再试！\")\n\t\t}", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "e/search/index.php,{\"method\":\"POST\",\"body\":\"keyboard={{key}}&show=title&tempid=1&tbname=article\"}", "weight": 0},{"bookSourceGroup": "☘小说", "bookSourceName": "52书库（po5.net）", "bookSourceType": 0, "bookSourceUrl": "https://www.po5.net#77", "customButton": false, "customOrder": 137, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "现代耽美::/xiandaidushi/<,index_{{page}}.html>\n穿越耽美::/chongsheng/<,index_{{page}}.html>\n古架耽美::/jiakong/<,index_{{page}}.html>\nGL百合::/gl/<,index_{{page}}.html>\n综漫同人::/bl/<,index_{{page}}.html>\n言情小说::/yanqing/<,index_{{page}}.html>", "lastUpdateTime": 1789455448823, "respondTime": 4457, "ruleBookInfo": {"author": "h1@text\n##.*_|【.*", "name": "h1@text\n##_.*"}, "ruleContent": {"content": "#nr1 p:not(:last-of-type)@textNodes"}, "ruleExplore": {"author": "h2@text\n##.*_|【.*?】", "bookList": ".content article:not(:first-of-type):not(:last-of-type)", "bookUrl": "a@href", "intro": ".note@text", "kind": "h2@text\n##.*【(.*)】##$1", "lastChapter": ".muted@text", "name": "h2@text\n##^\\d+\\.|_.*"}, "ruleSearch": {"author": "h4@text\n##.*_|【.*?】", "bookList": ".content article", "bookUrl": "a@href", "checkKeyWord": "综漫", "intro": ".note@text", "kind": "h4@text&&.muted a@text\n##.*【(.*)】##$1", "name": "h4@text\n##^\\d+\\.|_.*"}, "ruleToc": {"chapterList": ".list .mulu a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "/so/search.php?q={{key}}", "weight": 0},{"bookSourceName": "稷下書院", "bookSourceType": 0, "bookSourceUrl": "https://www.novel543.com", "customOrder": 7, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 15; V2304A Build/AP3A.240905.015.A2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/126.0.6478.71 Mobile Safari/537.36\",\n  \"sec-ch-ua-platform\": \"\\\"Android\\\"\",\n  \"origin\": \"https://www.novel543.com/\",\n  \"x-requested-with\": \"cn.mujiankeji.mbrowser\",\n  \"referer\": \"https://www.novel543.com/\",\n  \"accept-language\": \"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7\"\n}", "lastUpdateTime": 1789376163276, "respondTime": 180000, "ruleBookInfo": {"author": "<js>\nvar doc = org.jsoup.Jsoup.parse(result);\nvar el = doc.select(\".author, span:contains(作者), .book-info p:contains(作者), .info p:contains(作者)\").first();\nif (el) {\n    var t = el.text().replace(\"作者：\", \"\").replace(\"作者:\", \"\");\n    t.split(\"分類\")[0].split(\"分类\")[0].split(\"更新\")[0].trim();\n} else {\n    \"\";\n}\n</js>", "coverUrl": "<js>\nvar doc = org.jsoup.Jsoup.parse(result);\nvar img = doc.select(\".book-img img, .pic img, .cover img, div[class*='img'] img, img\").first();\nif (img) {\n    var src = img.attr(\"data-original\") || img.attr(\"data-src\") || img.attr(\"src\");\n    if (src && src.indexOf(\"data:image\") === -1) {\n        src;\n    } else {\n        \"\";\n    }\n} else {\n    \"\";\n}\n</js>", "intro": ".intro@text || .description@text || #intro@text || .book-intro@text || .summary@text", "kind": ".category@text || .genre@text", "name": "h1@text || .book-name@text || h2@text", "tocUrl": "<js>\nvar doc = org.jsoup.Jsoup.parse(result);\nvar allTocLink = doc.select(\"a:contains(完整目錄), a:contains(完整目录), a:contains(全部章節), a:contains(全部章节), a:contains(查看目錄), a:contains(查看目录), .all-chapters a, .more-chapters a\");\nif (!allTocLink.isEmpty()) {\n    allTocLink.attr(\"href\");\n} else {\n    baseUrl;\n}\n</js>", "wordCount": ".word-count@text"}, "ruleContent": {"content": "<js>\nif (result.indexOf(\"Just a moment\") !== -1 || result.indexOf(\"cf-turnstile\") !== -1 || result.indexOf(\"安全驗證\") !== -1) {\n    result = java.startBrowserAwait(baseUrl, \"验证\").body();\n}\nvar doc = org.jsoup.Jsoup.parse(result);\ndoc.select(\"script, style, ins, iframe, .ads, .ad, div[id*='ad'], .page-nav, .nav-btn, .chapter-nav, .cdn-cgi\").remove();\nvar el = doc.select(\"#content, .content, #chapter-content, #htmlContent, .read-content, #article, .panel-body, div.txt\").first();\nif (el) {\n    var txt = String(el.text());\n    var reg = new RegExp(\"([。！？!?」”])([^\\\\n”」])\", \"g\");\n    txt.replace(reg, \"$1\\n\\n$2\");\n} else {\n    result;\n}\n</js>", "nextContentUrl": "a:contains(下一頁)@href || a:contains(下一页)@href", "replaceRegex": "##全\\\\?本\\\\?小\\\\?說\\\\?網|看最新章節內容.*下載星文閱讀.*\\n?|網站已經不更新最新章節內容.*\\n?|星文閱讀APP更新最新章節內容.*\\n?|溫馨提示.*\\n?|(?<=[\\u4e00-\\u9fa5])\\s+(?=[\\u4e00-\\u9fa5])"}, "ruleExplore": {}, "ruleReview": {}, "ruleSearch": {"author": ".author@text || span:contains(作者)@text || .text-muted@text || p:contains(作者)@text", "bookList": "<js>\nif (result.indexOf(\"Just a moment\") !== -1 || result.indexOf(\"安全驗證\") !== -1 || result.indexOf(\"cf-turnstile\") !== -1 || result.length < 2000) {\n    cookie.removeCookie(source.bookSourceUrl);\n    var res = java.startBrowserAwait(baseUrl, \"验证\");\n    result = res.body();\n}\nvar doc = org.jsoup.Jsoup.parse(result);\nif (doc.select(\"div.novel-list, div.row, div.book-item, div.media\").isEmpty()) {\n    result = java.ajax(baseUrl);\n    doc = org.jsoup.Jsoup.parse(result);\n}\nvar elements = doc.select(\"div.novel-list div.item, div.row > div, div.book-item, .media, div[class*='book']\");\nif (elements.size() <= 1) {\n    elements = doc.select(\"a[href*='/0/'], a[href*='/04/'], a[href*='/book/'], a[href*='/novel/']\");\n}\nelements;\n</js>", "bookUrl": "a[href*='/0']@href || a[href*='/book/']@href || .title a@href || h4 a@href || h3 a@href", "coverUrl": "img@data-original || img@data-src || img@src", "intro": ".intro@text || .desc@text || .summary@text || .description@text", "name": "a[href*='/0']@text || a[href*='/book/']@text || h4 a@text || h3 a@text || .title a@text || a@text"}, "ruleToc": {"chapterList": "<js>\nif (result.indexOf(\"Just a moment\") !== -1 || result.indexOf(\"cf-turnstile\") !== -1) {\n    result = java.startBrowserAwait(baseUrl, \"验证\").body();\n}\nvar doc = org.jsoup.Jsoup.parse(result);\ndoc.select(\"header, footer, nav, .header, .footer, .nav, .menu, .top-nav, #header, #footer, .recommend, .hot-book, a:contains(閱讀), a:contains(阅读), a:contains(首頁), a:contains(首页)\").remove();\nvar list = doc.select(\"div.chapter-list a, div.catalog a, ul.chapters a, div.list-group a, div.novel-chapters a, .chapter-item a, div.bd a, ul.m-cat-list a, #chapters a\");\nif (list.isEmpty()) {\n    list = doc.select(\"a[href*='.html']\");\n}\nlist;\n</js>", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "https://www.novel543.com/search/{{key}}", "weight": 0},{"bookSourceComment": "单书站：夜无疆。首页同时提供书籍信息与完整章节目录，章节地址为 /chapter/chapter-{序号}/。", "bookSourceGroup": "单书源", "bookSourceName": "夜无疆（yewuj）", "bookSourceType": 0, "bookSourceUrl": "https://www.yewuj.com", "bookUrlPattern": "https://www\\.yewuj\\.com/(?:chapter/chapter-\\d+/?)?(?:\\?.*)?$", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": false, "eventListener": false, "lastUpdateTime": "1789377671036", "respondTime": 180000, "ruleBookInfo": {"author": "(//*[contains(text(),'作者：')])[1]/text()##作者：##", "coverUrl": "(//img[contains(@src,'cover')])[1]/@src", "intro": "@js:'那一天太阳落下再也没有升起…………………'", "kind": "@js:'玄幻'", "lastChapter": "(//a[contains(@href,'/chapter/chapter-')])[1]/text()", "name": "(//h2)[1]/text()", "tocUrl": "@js:'https://www.yewuj.com/'", "wordCount": "", "init": "@js:\nif (/\\/chapter\\/chapter-\\d+\\/?$/.test(baseUrl)) {\n    result = java.ajax('https://www.yewuj.com/');\n}\nresult"}, "ruleContent": {"content": "//h1/following::p[not(ancestor::footer)]"}, "ruleExplore": [], "ruleSearch": {"author": "@js:'辰东'", "bookList": "//body", "bookUrl": "@js:'https://www.yewuj.com/'", "coverUrl": "@js:'https://www.yewuj.com/cover.webp'", "intro": "@js:'那一天太阳落下再也没有升起…………………'", "kind": "@js:'玄幻'", "lastChapter": "(//a[contains(@href,'/chapter/chapter-')])[1]/text()", "name": "@js:'夜无疆'", "wordCount": ""}, "ruleToc": {"chapterList": "(//a[contains(@href,'/chapter/chapter-')])[position()>1]", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "https://www.yewuj.com/", "weight": 0},{"bookSourceComment": "台湾，需要代理", "bookSourceGroup": "", "bookSourceName": "101看书", "bookSourceType": 0, "bookSourceUrl": "https://101kks.com", "bookUrlPattern": "https://101kks.com/book/\\d+.html", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\r\nconst list = [];\r\nconst html = java.ajax(\"https://101kks.com\");\r\n\r\nlist.push({\r\n    title: \"标签-按更新排序？\",\r\n    url: \"\",\r\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\r\n});\r\n\r\n// 精准匹配分类链接：限定/newtag/路径，兼容标签其他属性\r\nconst reg = /<a href=\"(\\/newtag\\/[^\"]+)\"[^>]*>([^<]+)<\\/a>/g;\r\nlet match;\r\nwhile ((match = reg.exec(html)) !== null) {\r\n\tconst title = match[2].trim();\r\n\t// 路径规范化：去掉结尾斜杠后统一拼接分页格式\r\n\tconst basePath = match[1].replace(/\\/$/, '');\r\n\tlist.push({\r\n\t\ttitle: title,\r\n\t\turl: `${basePath}/{{page}},{\"webView\":true}`,\r\n\t\tstyle: {\r\n\t\t\tlayout_flexGrow: 1,\r\n\t\t\tlayout_flexBasisPercent: 0.2\r\n\t\t}\r\n\t});\r\n}\r\n\r\nJSON.stringify(list);", "lastUpdateTime": "1789371397095", "loginCheckJs": "if (result.body().match(/<title>(请稍候…|Just a moment...)<\\/title>/)){\n\turl = key ? (java.ruleUrl) : result.url();\n\tjava.startBrowserAwait(url,\"验证\")\n}\nresult", "respondTime": 180000, "ruleBookInfo": {"coverUrl": ".bookimg2>img@src", "init": "@js:\nconst matchResult = baseUrl.match(/\\/(\\d+)\\.html/); \nconst id = matchResult ? matchResult[1] : null; \njava.log(id);\njava.put('bookId',id)\nresult", "kind": ".booknav2@p.1@a@text", "lastChapter": ".booknav2@p.3@text##更新：##", "name": "h1>a@text", "tocUrl": "https://101kks.com/ajax_novels/chapterlist/{{java.get('bookId')}}.html,{\r\n    \"method\": \"GET\",\n    \"headers\": {\"referer\": \"https://101kks.com/book/{{java.get('bookId')}}/index.html\"},\n    \"webView\": true\r\n}", "wordCount": ".booknav2@p.2@text"}, "ruleContent": {"content": "#txtcontent@html"}, "ruleExplore": {"coverUrl": "img@src"}, "ruleSearch": {"author": ".labelbox@label.0@text", "bookList": "#article_list_content li", "bookUrl": "h3@a.1@href##$##,{\"webView\":true}", "coverUrl": "img@src", "intro": "ol.ellipsis_2@text", "kind": ".labelbox@label.1@text", "lastChapter": ".zxzj>p>a@text", "name": "h3@a.1@text", "wordCount": ".labelbox@label.2@text"}, "ruleToc": {"chapterList": "ul li", "chapterName": "a@text", "chapterUrl": "a@href##$##,{\"webView\":true}"}, "searchUrl": "https://101kks.com/search/{{key}}/{{page}}.html,{\"webView\":true}", "weight": 0},{"bookSourceGroup": "小说", "bookSourceName": "篱笆好文学", "bookSourceType": 0, "bookSourceUrl": "https://m.libahao2.com", "bookUrlPattern": "https://m\\.libahao2\\.com/book/\\d+_\\d+/?", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "玄幻魔法::https://m.libahao2.com/xuanhuan/{{page}}/\n武侠修真::https://m.libahao2.com/xiuzhen/{{page}}/\n都市言情::https://m.libahao2.com/dushi/{{page}}/\n历史军事::https://m.libahao2.com/lishi/{{page}}/\n游戏竞技::https://m.libahao2.com/wangyou/{{page}}/\n科幻灵异::https://m.libahao2.com/kehuan/{{page}}/\n女生言情::https://m.libahao2.com/nvpin/{{page}}/\n其他小说::https://m.libahao2.com/qita/{{page}}/", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1789363535369", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=og:novel:author]@content", "coverUrl": ".book-info-cover@src", "intro": "meta[property=og:description]@content", "kind": "meta[property=og:novel:category]@content", "lastChapter": "meta[property=og:novel:lastest_chapter_name]@content", "name": "meta[property=og:novel:book_name]@content"}, "ruleContent": {"content": "@js:var doc = org.jsoup.Jsoup.parse(result);\nvar content = String(doc.select('#chapterContent').html());\ncontent = content.replace(/<b style=\"color:#ff0000[^\"]*\"[^>]*>[^<]*<\\/b>/g, '');\ncontent = content.replace(/<a [^>]*rel=\"next\"[^>]*>[\\s\\S]*?<\\/a>/g, '');\ncontent;", "nextContentUrl": "@js:var doc = org.jsoup.Jsoup.parse(result);\nvar nextUrl = '';\nvar footerLinks = doc.select('.footer-nav a');\nif (footerLinks.size() >= 3) {\n    var lastLink = footerLinks.get(footerLinks.size() - 1);\n    if (lastLink.text().indexOf('下一页') >= 0) {\n        nextUrl = lastLink.attr('href');\n    }\n}\nnextUrl;"}, "ruleExplore": {"author": ".book-author@text", "bookList": "a.book-item", "bookUrl": "@href", "coverUrl": ".book-cover@src", "intro": ".book-description@text", "name": ".book-title@text"}, "ruleSearch": {"author": ".book-author@text", "bookList": "a.book-item", "bookUrl": "@href", "coverUrl": ".book-cover@src", "intro": ".book-description@text", "name": ".book-title@text"}, "ruleToc": {"chapterList": "@js:var doc = org.jsoup.Jsoup.parse(result);\nvar chapters = [];\nvar uls = doc.select('div.chapter-list ul');\nfor (var i = 0; i < uls.size(); i++) {\n    var ul = uls.get(i);\n    var parent = ul.parent();\n    if (parent != null && parent.hasClass('tab-content')) continue;\n    var links = ul.select('li a');\n    for (var j = 0; j < links.size(); j++) {\n        chapters.push([links.get(j).text(), links.get(j).attr('href')]);\n    }\n}\nchapters;", "chapterName": "@js:result[0]", "chapterUrl": "@js:result[1]"}, "searchUrl": "https://m.libahao2.com/sou?wd={{key}}", "weight": 0},{"bookSourceComment": "", "bookSourceGroup": "", "bookSourceName": "要撸小说", "bookSourceType": 0, "bookSourceUrl": "https://yaoluxs.com", "customOrder": -58326, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "最新::https://www.yaoluku.com/sort/{{page}}/,{\"webView\":true}\n完本::https://www.yaoluku.com/quanben/sort/{{page}}/,{\"webView\":true}\n玄幻::https://www.yaoluku.com/sort/1/{{page}}/,{\"webView\":true}\n武侠::https://www.yaoluku.com/sort/2/{{page}}/,{\"webView\":true}\n都市::https://www.yaoluku.com/sort/3/{{page}}/,{\"webView\":true}\n科幻::https://www.yaoluku.com/sort/4/{{page}}/,{\"webView\":true}\n穿越::https://www.yaoluku.com/sort/5/{{page}}/,{\"webView\":true}\n耽美::https://www.yaoluku.com/sort/6/{{page}}/,{\"webView\":true}\n游戏::https://www.yaoluku.com/sort/7/{{page}}/,{\"webView\":true}\n精品::https://www.yaoluku.com/sort/8/{{page}}/,{\"webView\":true}\n午夜::https://www.yaoluku.com/sort/9/{{page}}/,{\"webView\":true}", "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36\"}", "lastUpdateTime": "1789338805274", "respondTime": 180000, "ruleBookInfo": {"author": "[property=\"og:novel:author\"]@content", "coverUrl": ".novel_info_main img@src", "intro": "[property=\"og:description\"]@content", "kind": "[property~=category|status|update_time]@content", "lastChapter": "[property~=las?test_chapter_name]@content", "name": "[property=\"og:novel:book_name\"]@content", "wordCount": ".novel_info_title p.0@span.1@text"}, "ruleContent": {"content": "@js:\nvar m = String(src).match(/encoded\\s*=\\s*\"([^\"]+)\"/);\nif (m) {\n  var d = String(java.base64Decode(m[1]));\n  d.replace(/永久地址.*?com/g, \"\").replace(/更多精彩小说地址.*?com/g, \"\").replace(/要撸小说/g, \"\");\n} else {\n  \"\";\n}\n"}, "ruleExplore": {"author": ".fa-user-circle-o@text", "bookList": "ul.flex li", "bookUrl": "a.0@href", "coverUrl": "img@data-original", "intro": ".indent@text", "kind": ".full@text&&em@text##\\/##,", "name": "img@title"}, "ruleSearch": {"author": "##fa-user-circle-o[^<]+<\\/i>([^\\s<]+)##$1###", "bookList": ".searchresult", "bookUrl": "a.0@href", "coverUrl": "img@data-src", "intro": ".searchresult_p@text", "kind": ".img_span span@text&&.s_gray@text##\\s*\\/\\s*|.*字\\s*##,", "lastChapter": "p.-1@text", "name": "p.-1@text\n<js>\nif(\"最新章节\"==result){\n\tresult=\"\"\n\t}else{\n\t\tresult=java.getString(\"img@title\")\n\t\t}\t\n</js>", "wordCount": ".s_gray@text##(.*字)##$1###"}, "ruleToc": {"chapterList": "#catalog li a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "{{cookie.removeCookie(\"https://yaoluku.com\")}}\nhttps://yaoluku.com/search/,{\n  \"body\": \"searchkey={{key}}&searchtype=all&Submit=\",\n  \"method\": \"POST\"\n}", "weight": 0},{"bookSourceComment": "已修复", "bookSourceGroup": "✔️2026-09-13,小说", "bookSourceName": "要撸小说", "bookSourceType": 0, "bookSourceUrl": "https://yaoluxs.com", "customOrder": 1137, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "[{\"title\":\"首页\",\"url\":\"/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},{\"title\":\"玄幻\",\"url\":\"/sort/1/{{page}}/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"武侠\",\"url\":\"/sort/2/{{page}}/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"都市\",\"url\":\"/sort/3/{{page}}/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"科幻\",\"url\":\"/sort/4/{{page}}/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"穿越\",\"url\":\"/sort/5/{{page}}/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"耽美\",\"url\":\"/sort/6/{{page}}/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"游戏\",\"url\":\"/sort/7/{{page}}/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"精品\",\"url\":\"/sort/8/{{page}}/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"午夜\",\"url\":\"/sort/9/{{page}}/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}}]", "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36\"}", "lastUpdateTime": "1789328909265", "respondTime": 1609, "ruleBookInfo": {"author": "[property=\"og:novel:author\"]@content", "coverUrl": ".novel_info_main img@src", "intro": "[property=\"og:description\"]@content", "kind": "[property~=category|status|update_time]@content", "lastChapter": "[property~=las?test_chapter_name]@content", "name": "[property=\"og:novel:book_name\"]@content", "wordCount": ".novel_info_title p.0@span.1@text"}, "ruleContent": {"content": "@js:\nvar m = String(src).match(/encoded\\s*=\\s*\"([^\"]+)\"/);\nif (m) {\n  var d = String(java.base64Decode(m[1]));\n  d.replace(/永久地址.*?com/g, \"\").replace(/更多精彩小说地址.*?com/g, \"\").replace(/要撸小说/g, \"\");\n} else {\n  \"\";\n}\n", "nextContentUrl": "a[href*='next']@href||a[href*='next_page']@href", "title": "h1@text||.title@text"}, "ruleExplore": {"author": ".fa-user-circle-o@text", "bookList": "ul.flex li", "bookUrl": "a.0@href", "coverUrl": "img@data-original", "intro": ".indent@text", "kind": ".full@text&&em@text##\\/##,", "name": "img@title"}, "ruleSearch": {"author": "##fa-user-circle-o[^<]+<\\/i>([^\\s<]+)##$1###", "bookList": ".searchresult", "bookUrl": "a.0@href", "coverUrl": "img@data-src", "intro": ".searchresult_p@text", "kind": ".img_span span@text&&.s_gray@text##\\s*\\/\\s*|.*字\\s*##,", "lastChapter": "p.-1@text", "name": "p.-1@text\n<js>\nif(\"最新章节\"==result){\n\tresult=\"\"\n\t}else{\n\t\tresult=java.getString(\"img@title\")\n\t\t}\t\n</js>", "wordCount": ".s_gray@text##(.*字)##$1###"}, "ruleToc": {"chapterList": "#catalog li a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "{{cookie.removeCookie(\"https://yaoluxs.com\")}}\nhttps://yaoluxs.com/search/,{\n  \"body\": \"searchkey={{key}}&searchtype=all&Submit=\",\n  \"method\": \"POST\"\n}", "weight": 0},{"bookSourceComment": "适配 kyankanshu.com，仅支持通过书籍详情页URL导入", "bookSourceGroup": "手动导入", "bookSourceName": "快眼看书", "bookSourceType": 0, "bookSourceUrl": "https://www.kyankanshu.com", "customOrder": 0, "enabled": true, "enabledExplore": false, "exploreUrl": "", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; Pixel 3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Mobile Safari/537.36\"}", "lastUpdateTime": "1789275490288", "loginUrl": "", "respondTime": 180000, "ruleBookInfo": {"author": ".header h1 + p@text", "coverUrl": "", "intro": ".content p@text", "kind": "", "lastChapter": ".header p:nth-child(2)@text", "name": ".header h1@text", "tocUrl": ""}, "ruleChapterList": {"chapterList": "a[href^='/info/']", "chapterName": "text", "chapterUrl": "href"}, "ruleChapterUrl": "", "ruleContent": {"content": ".content@html", "nextContentUrl": ".page a:contains('下一页')@href"}, "ruleSearch": {"bookList": "", "bookName": "", "bookUrl": ""}, "ruleToc": {"chapterList": "a[href^='/info/']", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "", "weight": 0},{"bookSourceName": "快眼看书", "bookSourceUrl": "https://www.kyankanshu.com", "bookSourceType": 0, "bookSourceComment": "快眼看书免费小说阅读网。基于实际页面结构编写，支持搜索、详情、目录与正文阅读。", "enabled": true, "enabledExplore": true, "customOrder": 0, "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Mobile Safari/537.36\"}", "searchUrl": "/search.php?keyword={{key}}", "ruleSearch": {"bookList": "//div[@class='book-list']//li | //div[@class='result-list']//li | //ul[@class='list']//li", "name": "//a/@title", "author": "//span[@class='author']/text()", "kind": "//span[@class='cate']/text()", "intro": "//p[@class='intro']/text()", "bookUrl": "//a/@href", "coverUrl": "//img/@src"}, "ruleBookInfo": {"name": "//div[@class='novel']//h2/text()", "author": "//div[@class='novel']//p[contains(text(),'作者')]//span[2]/text()", "kind": "//div[@class='novel']//p[contains(text(),'分类')]//a/text()", "intro": "//div[@class='desc']//p/text()", "lastChapter": "//div[@class='novel']//p[contains(text(),'最新')]//a/text()", "coverUrl": "", "tocUrl": "@js:java.get('bookUrl').replace(/\\/$/, '') + '_1/'"}, "ruleToc": {"chapterList": "//div[@class='desc']//ul//li//a", "chapterName": "text", "chapterUrl": "href"}, "ruleContent": {"content": "//div[@class='content']//text()", "nextContentUrl": ""}, "ruleExplore": {"bookList": "//div[@class='book-list']//li | //div[@class='item']", "name": "//a/@title", "author": "//span[@class='author']/text()", "bookUrl": "//a/@href", "coverUrl": "//img/@src"}, "exploreUrl": "玄幻::/cate1/##都市::/cate2/##仙侠::/cate3/##历史::/cate4/##网游::/cate5/##科幻::/cate6/", "lastUpdateTime": "1789275080961"},{"bookSourceComment": "77读书 www.77shuku.info | 杰奇CMS UTF-8 无需登录 无搜索频控(实测) ◆ 规则要点: 搜索/发现/目录列表均 @js 返回JSON字符串数组+$.纯键字段(绕开AnalyzeByJSoup状态污染) ◆ 正文=div#ChapterContents去content_tip+截断txt下载地址尾部广告+逐行广告词过滤, 交HtmlFormatter净化 ◆ 发现=8分类(/store/N_page)+8排行(postdate=入库/toptime=本站推荐)+全本小说+站内最新 | bookUrlPattern匹配/novel/ID/ ◆ 构建: LegadoTeam官方版 2026-09-12", "bookSourceGroup": "AI", "bookSourceName": "77读书(77shuku)", "bookSourceType": 0, "bookSourceUrl": "http://www.77shuku.info", "bookUrlPattern": "https?://www[.]77shuku[.]info/novel/[0-9]+/?", "concurrentRate": "2/1000", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:var arr = []; function sec(t){ arr.push({title: t}); } function it(t, u){ arr.push({title: t, url: u}); } sec('—— 分类 ——'); it('玄幻', '/store/1_{{page}}.html'); it('仙侠', '/store/2_{{page}}.html'); it('都市', '/store/3_{{page}}.html'); it('言情', '/store/9_{{page}}.html'); it('穿越', '/store/4_{{page}}.html'); it('科幻', '/store/7_{{page}}.html'); it('恐怖', '/store/6_{{page}}.html'); it('网游', '/store/8_{{page}}.html'); sec('—— 排行 ——'); it('总点击榜', '/rank/allvisit/'); it('月点击榜', '/rank/monthvisit/'); it('周点击榜', '/rank/weekvisit/'); it('最新入库', '/rank/postdate/'); it('字数排行', '/rank/size/'); it('总推荐榜', '/rank/allvote/'); it('收藏排行', '/rank/goodnum/'); it('本站推荐', '/rank/toptime/'); sec('—— 专题 ——'); it('全本小说', '/quanben.html'); it('站内最新', 'http://www.77shuku.info/'); String(JSON.stringify(arr));", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1789196952566", "loginCheckJs": "var b = ''; try { var x = result.body; if (typeof x === 'function') { x = x.call(result); } b = String(x || ''); } catch (e) {} if (b.indexOf('搜索间隔') > -1 || b.indexOf('请勿频繁') > -1 || b.indexOf('稍后再') > -1) { throw new Error('⏳ 触发站点搜索间隔限制，请等待约2分钟后再搜索'); } result;", "respondTime": 12493, "ruleBookInfo": {"author": "meta[property=og:novel:author]@content", "coverUrl": "meta[property=og:image]@content", "intro": "@js:var Jsoup = Packages.org.jsoup.Jsoup; var doc = (result && typeof result.select === 'function') ? result : Jsoup.parse(String(result)); var el = doc.select('div#intro'); el.size() > 0 ? String(el.get(0).html()) : '';", "kind": "meta[property=og:novel:category]@content", "lastChapter": "meta[property=og:novel:latest_chapter_name]@content", "name": "meta[property=og:novel:book_name]@content", "wordCount": "@js:var Jsoup = Packages.org.jsoup.Jsoup; var doc = (result && typeof result.select === 'function') ? result : Jsoup.parse(String(result)); var el = doc.select('div#info span.item'); var wc = ''; for (var i = 0; i < el.size(); i++) { var t = String(el.get(i).text()); if (t.indexOf('字数') > -1) { wc = t.replace('字数：', '').replace('字', ''); break; } } wc;"}, "ruleContent": {"content": "@js:var Jsoup = Packages.org.jsoup.Jsoup; var Parser = Packages.org.jsoup.parser.Parser; var doc = (result && typeof result.select === 'function') ? result : Jsoup.parse(String(result)); var els = doc.select('div#ChapterContents'); var out = ''; if (els.size() > 0) { var e = els.get(0); var tp = e.select('div#content_tip'); if (tp.size() > 0) { tp.get(0).remove(); } var htm = String(e.html()); var c1 = htm.indexOf('txt下载地址'); if (c1 > -1) { htm = htm.substring(0, c1); } var NL = String.fromCharCode(10); var SP = String.fromCharCode(32); var NB = String.fromCharCode(160); htm = htm.replace(/<br[^>]*>/gi, NL); htm = htm.replace(/<[^>]+>/g, SP); var raw = Parser.unescapeEntities(htm, true); raw = raw.split(NB).join(SP); var ads = ['txt', 'http', 'www.', '.com', '.net', '.cc', '.vip', '.top', '.xyz', '77dushu', '77shuku', '最新网址', '请收藏本站', '全文免费阅读', '全集txt', '记住77', '牢记网址', '无弹窗', '最快更新', '手机版', '手机端', '章节报错', 'APP', 'app下载', '盗版', '请分享']; function hasCJK(s) { for (var c = 0; c < s.length; c++) { var z = s.charCodeAt(c); if (z >= 19968 && z <= 40869) { return true; } } return false; } var lines = raw.split(NL); var res = []; for (var i = 0; i < lines.length; i++) { var ln = String(lines[i]).replace(/ +/g, SP).trim(); if (ln.length == 0) { continue; } var low = ln.toLowerCase(); var bad = false; for (var k = 0; k < ads.length; k++) { if (low.indexOf(ads[k].toLowerCase()) > -1) { bad = true; break; } } if (bad) { continue; } if (ln.length <= 8 && !hasCJK(ln)) { continue; } res.push(ln); } out = res.join(NL + NL); } out;"}, "ruleExplore": {"author": "$.author", "bookList": "@js:var Jsoup = Packages.org.jsoup.Jsoup; var doc = (result && typeof result.select === 'function') ? result : Jsoup.parse(String(result)); function E(s){ return String(s).trim(); } var out = []; var bs = doc.select('div.shu_box'); if (bs.size() > 0) { for (var i = 0; i < bs.size(); i++) { var b = bs.get(i); var a = b.select('div.shu_xinxi h4 a'); if (a.size() == 0) { continue; } var sm = b.select('div.shu_xinxi h4 small'); var ip = b.select('p.intro'); var im = b.select('div.shu_img img'); out.push(String(JSON.stringify({name: E(a.get(0).text()), bookUrl: String(a.get(0).attr('href')), author: sm.size() > 0 ? E(sm.get(0).text()) : '', kind: '', lastChapter: '', wordCount: '', coverUrl: im.size() > 0 ? String(im.get(0).attr('src')) : '', intro: ip.size() > 0 ? E(ip.get(0).text()) : '', updateTime: ''}))); } } else { var rs = doc.select('div#articlelist ul li'); var hit = false; for (var i = 0; i < rs.size(); i++) { var a2 = rs.get(i).select('span.l2 a'); if (a2.size() == 0) { continue; } hit = true; var l1 = rs.get(i).select('span.l1'); var l3 = rs.get(i).select('span.l3'); var l4 = rs.get(i).select('span.l4 a'); var l5 = rs.get(i).select('span.l5'); var l7 = rs.get(i).select('span.l7'); out.push(String(JSON.stringify({name: E(a2.get(0).text()), bookUrl: String(a2.get(0).attr('href')), author: l3.size() > 0 ? E(l3.get(0).text()) : '', kind: l1.size() > 0 ? E(l1.get(0).text()) : '', lastChapter: l4.size() > 0 ? E(l4.get(0).text()) : '', wordCount: l5.size() > 0 ? E(l5.get(0).text()) : '', coverUrl: '', intro: '', updateTime: l7.size() > 0 ? E(l7.get(0).text()) : ''}))); } if (!hit) { var hs = doc.select('ul.titlelist li'); for (var i = 0; i < hs.size(); i++) { var an = hs.get(i).select('div.zp a'); if (an.size() == 0) { continue; } var lb = hs.get(i).select('div.lb'); var az = hs.get(i).select('div.author'); var zz = hs.get(i).select('div.zz a'); var sj = hs.get(i).select('div.sj'); out.push(String(JSON.stringify({name: E(an.get(0).text()), bookUrl: String(an.get(0).attr('href')), author: az.size() > 0 ? E(az.get(0).text()) : '', kind: lb.size() > 0 ? E(lb.get(0).text()).replace('[', '').replace(']', '') : '', lastChapter: zz.size() > 0 ? E(zz.get(0).text()) : '', wordCount: '', coverUrl: '', intro: '', updateTime: sj.size() > 0 ? E(sj.get(0).text()) : ''}))); } } } out;", "bookUrl": "$.bookUrl", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name", "wordCount": "$.wordCount"}, "ruleSearch": {"author": "$.author", "bookList": "@js:var Jsoup = Packages.org.jsoup.Jsoup; var doc = (result && typeof result.select === 'function') ? result : Jsoup.parse(String(result)); function E(s){ return String(s).trim(); } var out = []; var rows = doc.select('tr'); for (var i = 0; i < rows.size(); i++) { var td = rows.get(i).select('td'); if (td.size() < 7) { continue; } var a = td.get(2).select('a'); if (a.size() == 0) { continue; } var url = String(a.get(0).attr('href')); if (url.indexOf('/novel/') < 0) { continue; } var name = E(a.get(0).text()); var auEl = td.get(5).select('span'); var author = auEl.size() > 0 ? E(auEl.get(0).text()) : E(td.get(5).text()); var kindS = E(td.get(1).text()).replace('[', '').replace(']', ''); var ch = td.get(3).select('a'); var last = ch.size() > 0 ? E(ch.get(0).text()) : ''; var wc = ''; if (td.size() > 7) { wc = E(td.get(7).text()); if (wc.indexOf('K') > -1) { wc = wc.split('K').join('000'); } } out.push(String(JSON.stringify({name: name, bookUrl: url, author: author, kind: kindS, lastChapter: last, wordCount: wc, intro: ''}))); } out;", "bookUrl": "$.bookUrl", "checkKeyWord": "剑来", "coverUrl": "$.coverUrl", "intro": "$.intro", "kind": "$.kind", "lastChapter": "$.lastChapter", "name": "$.name", "wordCount": "$.wordCount"}, "ruleToc": {"chapterList": "@js:var Jsoup = Packages.org.jsoup.Jsoup; var doc = (result && typeof result.select === 'function') ? result : Jsoup.parse(String(result)); var out = []; var seen = {}; var ds = doc.select('div.zjbox dd a'); for (var i = 0; i < ds.size(); i++) { var u = String(ds.get(i).attr('href')); var t = String(ds.get(i).text()).trim(); if (u.indexOf('/chapter/') < 0 || t.length == 0) { continue; } if (seen[u]) { continue; } seen[u] = 1; out.push(String(JSON.stringify({name: t, url: u}))); } out;", "chapterName": "$.name", "chapterUrl": "$.url"}, "searchUrl": "http://www.77shuku.info/modules/article/search.php?searchkey={{key}}", "weight": 0},{"bookSourceComment": "绅士漫画(wnacg家族 MeiuPic)·动态域名版 2026-09-11c\n【图床线路】img1~5.wnimg2.cfd同一存储,verify不绑主机;部分网络对CF个别IP段RST导致图片不显示。正文规则自动探测可达线路并缓存于变量imgH(host|ts|协议,TTL6h,fail冷却30min);换线路=换URL=换缓存key绕开坏缓存。详情页简介内置线路卡片:打开即实测各线路连通性与延迟,点一行固定该线路,🔄改回自动,📶重新测速;发现页🛠维护组可一键清缓存。\nUA硬性要求(无UA403,按PC模板勿改)。正文为空已修:page_url数组提取+直出阅读页。发现页<js>生成分组网格。\n匿名可读,登录仅书架收藏。换域名只改源URL,发布页 https://wn01.link/ 成人内容注意场景。", "bookSourceGroup": "漫画,R18", "bookSourceName": "绅士漫画（动态域名版）", "bookSourceType": 2, "bookSourceUrl": "https://www.wn10.shop/", "bookUrlPattern": "https?://[^/]+/photos-index-aid-[0-9]+[.]html", "concurrentRate": "1/1200", "customButton": false, "customOrder": -92874, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>var U='{{source.getBookSourceUrl()}}';var k=[];function G(t){k.push({title:t,style:{layout_flexBasisPercent:1,layout_wrapBefore:true,layout_justifySelf:'flex_start'}});}function B(t,u){k.push({title:t,url:U+u,style:{layout_flexBasisPercent:0.23}});}function W(t,a){k.push({title:t,type:'button',action:a,style:{layout_flexBasisPercent:0.23}});}var C=String.fromCharCode(39);G('🆕 更新');B('最近更新','albums-index-page-{{page}}.html');B('全部','albums-index-page-{{page}}-cate-5.html');G('🔥 排行');B('日榜','albums-favorite_ranking-page-{{page}}-type-day.html');B('周榜','albums-favorite_ranking-page-{{page}}-type-week.html');B('月榜','albums-favorite_ranking-page-{{page}}-type-month.html');B('年榜','albums-favorite_ranking-page-{{page}}-type-year.html');G('🈶 汉化');B('同人誌','albums-index-page-{{page}}-cate-1.html');B('单行本','albums-index-page-{{page}}-cate-9.html');B('短篇','albums-index-page-{{page}}-cate-10.html');B('韩漫','albums-index-page-{{page}}-cate-20.html');G('🇯🇵 日语');B('同人誌','albums-index-page-{{page}}-cate-12.html');B('单行本','albums-index-page-{{page}}-cate-13.html');B('短篇','albums-index-page-{{page}}-cate-14.html');G('🇬🇧 英语');B('同人誌','albums-index-page-{{page}}-cate-16.html');B('单行本','albums-index-page-{{page}}-cate-17.html');B('短篇','albums-index-page-{{page}}-cate-18.html');G('🇰🇷 韩漫');B('全部','albums-index-page-{{page}}-cate-19.html');B('生肉','albums-index-page-{{page}}-cate-21.html');G('🎨 图集');B('CG画集','albums-index-page-{{page}}-cate-2.html');B('Cosplay','albums-index-page-{{page}}-cate-3.html');B('3D','albums-index-page-{{page}}-cate-22.html');B('AI图集','albums-index-page-{{page}}-cate-37.html');G('🏷 标签');B('全彩','albums-index-tag-%E5%85%A8%E5%BD%A9-page-{{page}}.html');B('DL版','albums-index-tag-DL%E7%89%88-page-{{page}}.html');B('韩漫','albums-index-tag-%E9%9F%93%E6%BC%AB-page-{{page}}.html');G('🛠 维护');W('清图片线路缓存','source.put('+C+'imgH'+C+','+C+C+');java.toast('+C+'已清除,重进章节将自动重测线路'+C+')');JSON.stringify(k);</js>", "header": "{\"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36\",\"Referer\":\"https://www.wn10.shop/\",\"Accept-Language\":\"zh-CN,zh;q=0.9\"}", "lastUpdateTime": "1789145812873", "loginUi": "<js>var W={layout_flexGrow:1,layout_flexShrink:1};var pub='';try{pub=String(source.get('pub'));}catch(e){pub='';}if(pub=='null'||pub=='undefined'||!pub){pub='https://wn01.link/';}var usr='';try{usr=String(source.get('user'));}catch(e){usr='';}if(usr=='null'||usr=='undefined'){usr='';}var r=[];r.push({name:'账号',type:'text',default:usr,style:W});r.push({name:'密码',type:'password',default:'',style:W});r.push({name:'发布页地址',type:'text',default:pub,style:W});r.push({name:'① 登录并保存会话',type:'button',action:'login()',style:W});r.push({name:'② 检查登录状态',type:'button',action:'wnChk()',style:W});r.push({name:'③ 调起浏览器·发布页',type:'button',action:'wnPubOpen()',style:W});r.push({name:'④ 取发布页最新地址',type:'button',action:'wnDom()',style:W});JSON.stringify(r);</js>", "loginUrl": "var WN_PUB='https://wn01.link/';function wnB(){var s=String(source.getBookSourceUrl()||'');while(s.length&&s.charAt(s.length-1)=='/'){s=s.substring(0,s.length-1);}return s||'https://www.wn10.shop';}function wnV(k){var v='';try{v=String(result.get(k));}catch(e){v='';}if(v=='null'||v=='undefined'){v='';}return v;}function wnP(){var v=wnV('发布页地址');if(!v){try{v=String(source.get('pub'));}catch(e){v='';}}if(v=='null'||v=='undefined'){v='';}if(!v){v=WN_PUB;}return v;}function wnLinks(h){var r=[],i=0,ok='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-_';while(true){i=h.indexOf('http',i);if(i<0)break;var j=i;while(j<h.length&&ok.indexOf(h.charAt(j))>=0){j++;}var s=h.substring(i,j);if(s.length>12&&s.indexOf('wn')>=0&&s.indexOf('wnimg')<0&&r.indexOf(s)<0){r.push(s);}i=j;}return r;}function login(){var u=wnV('账号'),p=wnV('密码');try{source.put('pub',wnP());}catch(e){}if(!u||!p){java.toast('已保存发布页地址。未填账号密码,跳过登录(本站正文无需登录)');return;}var body='normal=1&login_name='+encodeURIComponent(u)+'&login_pass='+encodeURIComponent(p)+'&submit=%E7%99%BB%E9%8C%84';var o={method:'POST',body:body,headers:{'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8','X-Requested-With':'XMLHttpRequest','Referer':wnB()+'/users-login.html'}};var r=String(java.ajax(wnB()+'/users-check_login.html,'+JSON.stringify(o))||'');var ok=false;try{ok=(JSON.parse(r).ret===true);}catch(e){}if(ok){try{source.put('user',u);}catch(e){}java.toast('✅ 登录成功,会话Cookie已保存(用于书架收藏同步)');}else{java.toast('❌ 登录失败:'+r.substring(0,60)+' | 正文无需登录,不影响阅读');}}function wnChk(){var h='';try{h=String(java.ajax(wnB()+'/,'+JSON.stringify({retry:2,timeout:15000}))||'');}catch(e){}if(h.length<600){java.toast('⚠️ 无法访问站点,域名可能已失效:'+wnB());return;}var ok=h.indexOf('users-logout')>=0,u='';try{u=String(source.get('user'));if(u=='null'){u='';}}catch(e){}if(ok){java.toast('✅ 已登录'+(u?'('+u+')':'')+',书架收藏可同步');}else{java.toast('⚪ 未登录。本站正文/目录/发现均匿名可读,登录仅用于书架收藏');}}function wnOpen(x,t){try{java.startBrowser(x,t);return;}catch(e){}try{java.openUrl(x);return;}catch(e2){}try{java.copyText(x);java.toast('无法调起浏览器,已复制链接:'+x);}catch(e3){}}function wnPubOpen(){var p=wnP();try{source.put('pub',p);}catch(e){}wnOpen(p,'绅士漫画·地址发布页');}function wnDom(){var h='';try{h=String(java.ajax(wnP()+','+JSON.stringify({retry:2,timeout:20000}))||'');}catch(e){}var L=wnLinks(h);if(!L.length){java.toast('❌ 未从发布页取到新地址,请点调起浏览器·发布页手动查看');return;}try{java.copyText(L.join(String.fromCharCode(10)))}catch(e){}java.longToast('📋 发布页最新地址(已复制,替换源URL即整体迁移):'+String.fromCharCode(10)+L.join(String.fromCharCode(10)));}function wnUC(u,t){try{var c=Packages.java.net.URL(u).openConnection();c.setConnectTimeout(t||5000);c.setReadTimeout(t||5000);c.setRequestProperty('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36');var r=c.getResponseCode();try{c.disconnect();}catch(e){}return r;}catch(e2){return -1;}}function wnImgSpd(){var HS=['img1.wnimg2.cfd','img2.wnimg2.cfd','img3.wnimg2.cfd','img4.wnimg2.cfd','img5.wnimg2.cfd'],rs=[],best='',bs='',i,j;for(i=0;i<HS.length;i++){var a=Date.now();if(wnUC('https://'+HS[i]+'/',6000)!=-1){rs.push(HS[i]+' https OK '+(Date.now()-a)+'ms');if(!best){best=HS[i];bs='s';}}else rs.push(HS[i]+' https X');}if(!best){for(j=0;j<HS.length;j++){if(wnUC('http://'+HS[j]+'/',6000)!=-1){best=HS[j];bs='h';rs[j]=rs[j]+' | http OK';break;}}}var NL=String.fromCharCode(10);if(best){try{source.put('imgH',best+'|'+Date.now()+'|'+bs);}catch(e){}java.longToast('📶 已选图片线路 '+best+' ('+(bs=='s'?'https':'http')+'),重进章节生效'+NL+rs.join(NL));}else{try{source.put('imgH','fail|'+Date.now());}catch(e2){}java.longToast('❌ 全部图片线路不通,需换网络或开代理'+NL+rs.join(NL));}}function wnImgClr(){try{source.put('imgH','');}catch(e){}java.toast('✔ 已清除图片线路缓存,重进章节自动重测');}", "respondTime": 185598, "ruleBookInfo": {"author": "//div[@id='bodywrap']/h2/text()@js:var s=String(result),r='';if(s.charAt(0)=='['){var k=s.indexOf(']');if(k>1){var g=s.substring(1,k);var p=Math.max(g.lastIndexOf('('),g.lastIndexOf('（'));if(p>0){r=g.substring(p+1);if(r.charAt(r.length-1)==')'||r.charAt(r.length-1)=='）')r=r.substring(0,r.length-1);}else{r=g;}}}String(r.replace(/^[ ]+|[ ]+$/g,''));", "coverUrl": "//div[@class='asTB']/div[@class='asTBcell uwthumb']/img/@src##////##https://", "intro": "@js:var Q=String.fromCharCode(34);function esc(s){s=String(s==null?'':s);s=s.split('&').join('&amp;');s=s.split('<').join('&lt;');s=s.split('>').join('&gt;');s=s.split(String.fromCharCode(10)).join('<br>');return s;}var doc=Packages.org.jsoup.Jsoup.parse(String(src));var desc='';try{var ps=doc.select('div.asTBcell.uwconn p');for(var i=0;i<ps.size();i++){var t=String(ps.get(i).text()).replace(/^[ ]+|[ ]+$/g,'');if(t&&t!='簡介：'&&t!='简介：'){desc=desc?desc+'<br>'+esc(t):esc(t);}}}catch(e){}if(desc.length>500){desc=desc.substring(0,500)+'…';}var tag='';try{var els=doc.select('div.uwconn div.addtags a.tagshow');var tt=[];for(var j=0;j<els.size();j++){tt.push(String(els.get(j).text()));}if(tt.length){tag='<br>📌 '+esc(tt.join('  '));}}catch(e){}var HS=['img1','img2','img3','img4','img5'],rows='';for(var r=0;r<HS.length;r++){rows=rows+'<div class=row onclick=sel('+r+')>'+HS[r]+'.wnimg2.cfd <span id=s'+r+'>测速中…</span></div>';}var PH='<div>@DESC@</div><hr><div>🛖 图床线路 <span>(点一行=固定该线路,重进章节生效)</span> 当前:<span id=cur>…</span></div>@ROWS@<div class=btns><button onclick=auto()>🔄 改回自动</button><button onclick=probe(0)>📶 重新测速</button></div><style>#cur{color:#0a58ca;font-weight:bold}.row{padding:7px;border-bottom:1px solid #e5e5e5}.row:active{background:#eee}.ok{color:#087f23}.bad{color:#c0392b}.btns{margin-top:9px}button{margin-right:8px;padding:6px 10px}</style><script>var HS=[@q@img1@q@,@q@img2@q@,@q@img3@q@,@q@img4@q@,@q@img5@q@];function gv(){try{var v=source.get(@q@imgH@q@);return v==null?@q@@q@:String(v)}catch(e){return @q@@q@}}function sv(v){try{source.put(@q@imgH@q@,v)}catch(e){}}function nm(i){return HS[i]+@q@.wnimg2.cfd@q@}function showCur(){var v=gv();var el=document.getElementById(@q@cur@q@);if(!v){el.innerText=@q@自动(进章节时探测)@q@;return}var p=v.split(@q@|@q@);var age=Date.now()-(parseInt(p[1])||0);if(p[0]==@q@fail@q@){el.innerText=@q@全部线路不通(需代理/换网络)·@q@+age+@q@前记录@q@}else{el.innerText=p[0];if(age>21600000){el.innerText=el.innerText+@q@ ·缓存过期将重测@q@}}}function probe(i){if(i>=HS.length){showCur();return}var t=Date.now();var r=null;try{r=java.head(@q@https://@q@+nm(i)+@q@/@q@,@q@{}@q@,3000)}catch(e){}var dt=Date.now()-t;var ok=r&&String(r).length>5;var el=document.getElementById(@q@s@q@+i);if(el){el.innerHTML=ok?@q@<b class=ok>✔ 通 @q@+dt+@q@ms</b>@q@:@q@<b class=bad>✘ 不通</b>@q@}setTimeout(function(){probe(i+1)},80)}function sel(i){sv(nm(i)+@q@|@q@+Date.now()+@q@|s@q@);java.toast(@q@已固定 @q@+nm(i)+@q@,重进章节生效@q@);showCur()}function auto(){sv(@q@@q@);java.toast(@q@已改回自动:进章节时自动探测选线@q@);showCur()}showCur();setTimeout(function(){probe(0)},300);';'<useweb>'+PH.split('@DESC@').join(desc+tag).split('@ROWS@').join(rows).split('@q@').join(Q)+'</scr'+'ipt></useweb>';", "kind": "@js:var v='';try{var els=Packages.org.jsoup.Jsoup.parse(String(src)).select('div.asTBcell.uwconn > label');for(var i=0;i<els.size();i++){var t=String(els.get(i).text());if(t.indexOf('分類')>=0||t.indexOf('分类')>=0){var p=t.split(/[：:]/);if(p.length>1)v=p[1];break;}}}catch(e){}String(v).replace(/／/g,'/').replace(/^[ ]+|[ ]+$/g,'');", "name": "//div[@id='bodywrap']/h2/text()", "wordCount": "//div[@class='asTBcell uwconn']/label/text()@js:var m=String(result).match(/頁數[：: ]*([0-9]+)/)||String(result).match(/页数[：: ]*([0-9]+)/);m?m[1]+'页':'';"}, "ruleContent": {"content": "@js:var Q=String.fromCharCode(34),NL=String.fromCharCode(10),SQ=String.fromCharCode(39),BS=String.fromCharCode(92);function grab(s){var i=s.indexOf('page_url');if(i<0)return[];var b=s.indexOf('[',i);if(b<0)return[];var e=s.indexOf(']',b);if(e<b)return[];var a=s.substring(b+1,e).split(','),r=[];for(var k=0;k<a.length;k++){var x=a[k].split(BS).join('').split(Q).join('').split(SQ).join('').replace(/^[ ]+|[ ]+$/g,'');if(x.length>5)r.push(x);}return r;}function gv(k){var v='';try{v=String(source.get(k));}catch(e){}if(v=='null'||v=='undefined'){v='';}return v;}function sv(k,v){try{source.put(k,v);}catch(e){}}function hg(u){var i=u.indexOf('://');if(i<0)return '';var j=u.indexOf('/',i+3);if(j<0)j=u.length;return u.substring(i+3,j);}function pt(u){var i=u.indexOf('://');if(i<0)return '/';var j=u.indexOf('/',i+3);return j<0?'/':u.substring(j);}function pcd(u){try{var c=Packages.java.net.URL(u).openConnection();c.setConnectTimeout(4000);c.setReadTimeout(4000);c.setRequestProperty('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36');var r=c.getResponseCode();try{c.disconnect();}catch(e){}return r;}catch(e){return -1;}}var d=String(result||''),ps=grab(d);if(!ps.length){var m=String(baseUrl||'').match(/aid-([0-9]+)/);if(m){var q1=String(baseUrl||'').split('/');ps=grab(String(java.ajax(q1[0]+'//'+q1[2]+'/photos-item-aid-'+m[1]+'.html,'+JSON.stringify({retry:3}))||''));}}if(!ps.length)throw new Error('正文解析失败:未取到图片列表,站点可能改版或域名失效,请到发布页查新地址,或在书源登录界面点图片测速');var u0=ps[0];if(u0.indexOf('//')===0)u0='https:'+u0;var oh=hg(u0),useH=oh,useS=(u0.indexOf('https:')===0?'https:':'http:'),ok=0;var cv=gv('imgH'),cp=cv?cv.split('|'):[];if(cp[0]){var age=Date.now()-(parseInt(cp[1])||0);if(cp[0]!='fail'&&age<21600000){useH=cp[0];useS=(cp[2]=='h'?'http:':'https:');ok=1;}else if(cp[0]=='fail'&&age<1800000){ok=1;}}if(!ok){var L=[oh],HS=['img1.wnimg2.cfd','img2.wnimg2.cfd','img3.wnimg2.cfd','img4.wnimg2.cfd','img5.wnimg2.cfd'];for(var t=0;t<HS.length;t++){if(HS[t]!=oh)L.push(HS[t]);}var pick='',sc='';for(var t2=0;t2<L.length;t2++){if(pcd('https://'+L[t2]+'/')!=-1){pick=L[t2];sc='s';break;}}if(!pick){for(var t3=0;t3<L.length;t3++){if(pcd('http://'+L[t3]+'/')!=-1){pick=L[t3];sc='h';break;}}}if(pick){useH=pick;useS=(sc=='h'?'http:':'https:');sv('imgH',pick+'|'+Date.now()+'|'+sc);}else{sv('imgH','fail|'+Date.now());}}var o=[];for(var n=0;n<ps.length;n++){var p=ps[n];if(p.indexOf('//')===0)p='https:'+p;o.push('<img src='+Q+useS+'//'+useH+pt(p)+Q+'>');}o.join(NL);", "imageStyle": "FULL"}, "ruleExplore": {"bookList": "//div[@class='gallary_wrap']/ul/li", "bookUrl": "//div[@class='info']/div[@class='title']/a/@href", "coverUrl": "//li/div[1]/a/img/@src", "intro": "//li/div[@class='info']/div[@class='info_col']/text()@js:var t=String(result).split(String.fromCharCode(10)).join(' ');var d=t.match(/(20[0-9][0-9]-[0-9][0-9]-[0-9][0-9])/);var p=t.match(/([0-9]+)[^0-9]{0,8}[張张]/);var o=[];if(p)o.push('📄'+p[1]+'页');if(d)o.push('🕒'+d[1]);o.join('  ');", "kind": "@js:var h=String(result),bu=String(baseUrl),m=h.match(/cate-([0-9]+)/)||bu.match(/cate-([0-9]+)/);var MAP={'1':'汉化','5':'同人誌','6':'单行本','7':'短篇','12':'日语','16':'英语','19':'韩漫','20':'韩漫·汉化','21':'韩漫·生肉','2':'CG画集','3':'Cosplay','22':'3D','37':'AI绘','9':'单行本·汉化','10':'短篇·汉化'};var label=MAP[m?m[1]:'']||'';if(!label&&bu.indexOf('ranking')>=0)label='排行榜';if(!label&&bu.indexOf('-tag-')>=0)label='标签';if(!label){if(/繁体|繁體/.test(h))label='繁体中文';else if(/汉化|漢化|翻訳|翻译/.test(h))label='汉化';else if(h.indexOf('title')>=0)label='日语';}String(label);", "name": "//div[@class='info']/div[@class='title']/a//text()@js:String(result).split(String.fromCharCode(10)).join('')", "wordCount": "//li/div[@class='info']/div[@class='info_col']/text()@js:var m=String(result).match(/([0-9]+)[^0-9]{0,8}[張张]/);m?m[1]+'页':'';"}, "ruleSearch": {"bookList": "//div[@class='gallary_wrap']/ul/li", "bookUrl": "//div[@class='info']/div[@class='title']/a/@href", "checkKeyWord": "全彩", "coverUrl": "//li/div[1]/a/img/@src", "intro": "//li/div[@class='info']/div[@class='info_col']/text()@js:var t=String(result).split(String.fromCharCode(10)).join(' ');var d=t.match(/(20[0-9][0-9]-[0-9][0-9]-[0-9][0-9])/);var p=t.match(/([0-9]+)[^0-9]{0,8}[張张]/);var o=[];if(p)o.push('📄'+p[1]+'页');if(d)o.push('🕒'+d[1]);o.join('  ');", "kind": "@js:var h=String(result),bu=String(baseUrl),m=h.match(/cate-([0-9]+)/)||bu.match(/cate-([0-9]+)/);var MAP={'1':'同人誌·中文','12':'同人誌·日文','16':'同人誌·英文','5':'同人誌','2':'CG画集','3':'Cosplay','22':'3D','37':'AI绘','6':'单行本','9':'单行本·中文','13':'单行本·日文','17':'单行本·英文','7':'短篇','10':'短篇·中文','19':'韩漫','20':'韩漫·中文','21':'韩漫·原版'};var label=MAP[m?m[1]:'']||'';if(!label&&bu.indexOf('ranking')>=0)label='排行榜';if(!label&&bu.indexOf('-tag-')>=0)label='标签';if(!label){if(/繁体|繁體/.test(h))label='繁体中文';else if(/汉化|漢化|翻訳|翻译|中国語|嵌字/.test(h))label='汉化';else if(/English/i.test(h))label='英语';else if(h.indexOf('title')>=0)label='日语';}String(label);", "name": "//div[@class='info']/div[@class='title']/a//text()@js:String(result).split(String.fromCharCode(10)).join('')", "wordCount": "//li/div[@class='info']/div[@class='info_col']/text()@js:var m=String(result).match(/([0-9]+)[^0-9]{0,8}[張张]/);m?m[1]+'页':'';"}, "ruleToc": {"chapterList": "//div[@class='asTB']", "chapterName": "@js:'全本'", "chapterUrl": "@js:var u=String(baseUrl),m=u.match(/aid-([0-9]+)/),r=u;if(m){var p=u.split('/');r=p[0]+'//'+p[2]+'/photos-item-aid-'+m[1]+'.html';}r;"}, "searchUrl": "{{source.getBookSourceUrl()}}search/?q={{key}}&f=_all&s=create_time_DESC&syn=yes&p={{page}}", "weight": 500},{"bookSourceGroup": "小说", "bookSourceName": "久久小说", "bookSourceType": 0, "bookSourceUrl": "https://m.ijjjxs.net", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>\nvar host = \"https://m.ijjjxs.net\";\n\n// ============ 状态存储 ============\nvar state = {};\ntry {\n  var saved = source.getVariable();\n  if (saved) state = JSON.parse(saved) || {};\n} catch (e) { state = {}; }\n\n// ============ 选项表 ============\nvar sorts = [\"最新更新\",\"日排行\",\"周排行\",\"月排行\",\"总排行\",\"日推荐\",\"周推荐\",\"月推荐\",\"总推荐\",\"总收藏\",\"字数\",\"最新入库\"];\nvar sortVals = {\"最新更新\":\"lastupdate\",\"日排行\":\"dayvisit\",\"周排行\":\"weekvisit\",\"月排行\":\"monthvisit\",\"总排行\":\"allvisit\",\"日推荐\":\"dayvote\",\"周推荐\":\"weekvote\",\"月推荐\":\"monthvote\",\"总推荐\":\"allvote\",\"总收藏\":\"goodnum\",\"字数\":\"size\",\"最新入库\":\"postdate\"};\n\nvar wcs = [\"不限字数\",\"30万以下\",\"30-50万\",\"50-100万\",\"100-200万\",\"200万以上\"];\nvar wcVals = {\"不限字数\":\"0\",\"30万以下\":\"1\",\"30-50万\":\"2\",\"50-100万\":\"3\",\"100-200万\":\"4\",\"200万以上\":\"5\"};\n\nvar sts = [\"不限状态\",\"正在连载\",\"已经完结\"];\nvar stVals = {\"不限状态\":\"0\",\"正在连载\":\"1\",\"已经完结\":\"2\"};\n\nvar cats = [\"全部分类\",\"玄幻修真\",\"重生穿越\",\"都市小说\",\"军史小说\",\"网游小说\",\"科幻小说\",\"灵异小说\",\"言情小说\",\"其他小说\"];\nvar catVals = {\"全部分类\":\"0\",\"玄幻修真\":\"1\",\"重生穿越\":\"2\",\"都市小说\":\"3\",\"军史小说\":\"4\",\"网游小说\":\"5\",\"科幻小说\":\"6\",\"灵异小说\":\"7\",\"言情小说\":\"8\",\"其他小说\":\"9\"};\n\n// ============ 当前值 ============\nvar curSort = state.sort || \"最新更新\";\nvar curWc   = state.wc   || \"不限字数\";\nvar curSt   = state.st   || \"不限状态\";\n\nvar sv = sortVals[curSort] || \"lastupdate\";\nvar wv = wcVals[curWc]     || \"0\";\nvar tv = stVals[curSt]     || \"0\";\n\n// ============ 内联 action ============\nvar actSort = \"var v=infoMap['排序'];var s={};try{s=JSON.parse(source.getVariable())||{};}catch(e){}s.sort=v;source.setVariable(JSON.stringify(s));java.toast('✅ 排序: '+v);java.refreshExplore();\";\nvar actWc   = \"var v=infoMap['字数'];var s={};try{s=JSON.parse(source.getVariable())||{};}catch(e){}s.wc=v;source.setVariable(JSON.stringify(s));java.toast('✅ 字数: '+v);java.refreshExplore();\";\nvar actSt   = \"var v=infoMap['状态'];var s={};try{s=JSON.parse(source.getVariable())||{};}catch(e){}s.st=v;source.setVariable(JSON.stringify(s));java.toast('✅ 状态: '+v);java.refreshExplore();\";\nvar actSearch = \"var k=infoMap['关键字'];if(!k){java.toast('请输入关键字');}else{java.searchBook(k,source);}\";\n\n// ============ 工具函数 ============\nfunction pushTitle(text) {\n  ui.push({ title: text, url: '', style: { layout_flexBasisPercent: 1, layout_flexGrow: 1 } });\n}\nfunction pushCell(name, urlStr) {\n  ui.push({ title: name, url: urlStr, style: { layout_flexBasisPercent: 0.3, layout_flexGrow: 1 } });\n}\n\n// ============ UI ============\nvar ui = [];\n\n// 搜索\nui.push({ title: '关键字', type: 'text', default: '', style: { layout_flexBasisPercent: 1 } });\nui.push({ title: '🔍 搜索本站', type: 'button', action: actSearch, style: { layout_flexBasisPercent: 1 } });\n\n// 筛选条件\npushTitle('━━━ 【筛选条件】 ━━━');\nui.push({ title: '排序', type: 'select', chars: sorts, default: curSort, action: actSort, style: { layout_flexBasisPercent: 0.45 } });\nui.push({ title: '字数', type: 'select', chars: wcs,   default: curWc,   action: actWc,   style: { layout_flexBasisPercent: 0.45 } });\nui.push({ title: '状态', type: 'select', chars: sts,   default: curSt,   action: actSt,   style: { layout_flexBasisPercent: 0.45 } });\n\n// 当前状态\npushTitle('━━━━━━━━━━━━━━━━━━');\npushTitle('📋 当前：' + curSort + ' ｜ ' + curWc + ' ｜ ' + curSt);\npushTitle('👇 点下方分类进入对应列表');\npushTitle('━━━━━━━━━━━━━━━━━━');\n\n// 分类标签\npushTitle('━━━ 【小说分类】 ━━━');\ncats.forEach(function(c) {\n  var urlStr = host + '/fenlei/' + sv + '_' + (catVals[c] || '0') + '_' + wv + '_' + tv + '_{{page}}.html';\n  pushCell(c, urlStr);\n});\n\nJSON.stringify(ui);\n</js>", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 10; Mobile) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1789143810481", "respondTime": 180000, "ruleBookInfo": {"author": "@XPath://meta[@property='og:novel:author']/@content", "coverUrl": "@XPath://meta[@property='og:image']/@content", "intro": "@XPath://meta[@property='og:description']/@content", "kind": "@XPath://meta[@property='og:novel:category']/@content", "lastChapter": "@XPath://meta[@property='og:novel:latest_chapter_name']/@content", "name": "@XPath://meta[@property='og:novel:book_name']/@content"}, "ruleContent": {"content": "<js>var h=result;var re=/qsbs\\.bb\\('([^']+)'\\)/g;var m;var b='';var kb='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';while((m=re.exec(h))!=null){var s=m[1];for(var i=0;i<s.length;i+=4){var a1=kb.indexOf(s.charAt(i));var a2=kb.indexOf(s.charAt(i+1));var a3=kb.indexOf(s.charAt(i+2));var a4=kb.indexOf(s.charAt(i+3));b+=String.fromCharCode((a1<<2)|(a2>>4));if(a3>-1){b+=String.fromCharCode(((a2&15)<<4)|(a3>>2));}if(a4>-1){b+=String.fromCharCode(((a3&3)<<6)|a4);}}}decodeURIComponent(escape(b));</js>", "nextContentUrl": "<js>var m=result.match(/hhekgsv='([^']+)'/);if(m&&m[1]&&m[1].indexOf('.html')>-1){m[1]}else{''};</js>"}, "ruleExplore": {"author": "class.s4@text", "bookList": "class.sort_list@tag.li", "bookUrl": "class.s2@tag.a@href", "kind": "class.s1@text##[\\[\\]]##", "name": "class.s2@tag.a@text"}, "ruleSearch": {"author": "class.s4@text", "bookList": "class.sort_list@tag.li", "bookUrl": "class.s2@tag.a@href", "kind": "class.s1@text##[\\[\\]]##", "name": "class.s2@tag.a@text"}, "ruleToc": {"chapterList": "@XPath://h3[contains(text(),'章节列表')]/following-sibling::div[1]//ul[@class='chapter-list']/li/a", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": ".page_num a.y@href||.btn-mulu@href"}, "searchUrl": "@js:\"https://m.ijjjxs.net/search.html,\" + JSON.stringify({\n    method: 'POST',\n    body: 's=' + encodeURIComponent(key),\n    charset: 'utf-8',\n    headers: {\n        'Content-Type': 'application/x-www-form-urlencoded',\n        'Origin': 'https://m.ijjjxs.net',\n        'Referer': 'https://m.ijjjxs.net/'\n    }\n})", "weight": 0},{"bookSourceComment": "酷酷追漫 - 漫画站。注意：服务端搜索有 1 秒冷却，连点会返回限流提示。发现页动态 UI。", "bookSourceGroup": "漫画", "bookSourceName": "酷酷追漫", "bookSourceType": 2, "bookSourceUrl": "http://cn.kukuc.cc", "bookUrlPattern": "http://cn\\.kukuc\\.cc/bookkuku/\\d+/?", "customButton": false, "customOrder": 10, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>\nvar host = \"http://cn.kukuc.cc\";\n\n// ============ 模式状态 ============\nvar MODES = [\"🔥 更新与排行\", \"📚 书库\"];\nvar currentMode = \"🔥 更新与排行\";\ntry {\n  var saved = source.getVariable();\n  if (saved) {\n    var obj = JSON.parse(saved);\n    if (obj.mode && MODES.indexOf(obj.mode) >= 0) currentMode = obj.mode;\n  }\n} catch (e) {}\n\n// ============ 书库：地区状态 ============\nvar channels = {\n  \"🌏 全部\": \"9\",\n  \"🇯🇵 日漫\": \"1\",\n  \"🌏 港台\": \"2\",\n  \"🇺🇸 美漫\": \"3\",\n  \"🇨🇳 国漫\": \"4\",\n  \"🇰🇷 韩漫\": \"5\",\n  \"❓ 未分类\": \"6\"\n};\nvar currentChannel = \"🌏 全部\";\ntry {\n  var saved2 = source.getVariable();\n  if (saved2) {\n    var obj2 = JSON.parse(saved2);\n    if (obj2.channel && channels[obj2.channel]) currentChannel = obj2.channel;\n  }\n} catch (e) {}\nvar area = channels[currentChannel] || \"9\";\n\n// ============ 数据 ============\nvar tags = [\"全部\",\"长条\",\"大女主\",\"韩漫\",\"奇幻\",\"轻小说\",\"生活\",\"悬疑\",\"格斗\",\"搞笑\",\"竞技\",\"职场\",\"萌系\",\"冒险\",\"治愈\",\"都市\",\"霸总\",\"神鬼\",\"侦探\",\"爱情\",\"古风\",\"科幻\",\"穿越\",\"校园\",\"美食\",\"热血\",\"励志\",\"异世界\",\"历史\",\"战争\",\"恐怖\",\"后宫\",\"系统\",\"耽美\",\"纯爱\",\"玄幻\",\"爆笑\",\"修真\",\"魔幻\",\"装逼\",\"逆袭\",\"复仇\",\"日常\",\"青春\",\"亲情\",\"宅斗\"];\nvar fulls = [[\"全部\",\"3\"],[\"连载中\",\"4\"],[\"已完结\",\"1\"]];\nvar ranks = [[\"🔥 总点击榜\",\"alldj\"],[\"📈 月点击榜\",\"ydj\"],[\"📊 周点击榜\",\"zdj\"],[\"📉 日点击榜\",\"rdj\"],[\"⭐ 总收藏榜\",\"allfav\"]];\nvar weekdays = [\"周一\",\"周二\",\"周三\",\"周四\",\"周五\",\"周六\",\"周日\"];\n\n// ============ UI 骨架 ============\nvar ui = [\n  { title: '关键字', type: 'text', default: '', style: { layout_flexBasisPercent: 1 } },\n  { title: '🔍 搜索本站', type: 'button', action: \"var k=infoMap['关键字']; if(!k){ java.toast('请输入漫画名称'); } else { java.searchBook(k, source); }\", style: { layout_flexBasisPercent: 1 } },\n  { title: '模式切换', type: 'select', chars: MODES, default: currentMode, action: \"var m=infoMap['模式切换']; var obj={}; try{obj=JSON.parse(source.getVariable());}catch(e){} obj.mode=m; source.setVariable(JSON.stringify(obj)); java.refreshExplore();\", style: { layout_flexBasisPercent: 1 } }\n];\n\n// 一行一个（整行按钮）\nfunction pushRow(name, urlStr) {\n  ui.push({ title: name, url: urlStr, style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } });\n}\n// 一行多个（小按钮）\nfunction pushCell(name, urlStr) {\n  ui.push({ title: name, url: urlStr, style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.2 } });\n}\n\n// ============ 模式 1：更新与排行 ============\nif (currentMode === \"🔥 更新与排行\") {\n\n  ui.push({ title: '━━━ 【排行榜】 ━━━', url: '', style: { layout_flexBasisPercent: 1, layout_flexGrow: 1 } });\n  ranks.forEach(function(r) {\n    pushRow(r[0], host + '/kukuctop/' + r[1] + '.html');\n  });\n\n  ui.push({ title: '━━━ 【每日更新】 ━━━', url: '', style: { layout_flexBasisPercent: 1, layout_flexGrow: 1 } });\n  weekdays.forEach(function(d, idx) {\n    pushCell(\"🆕 \" + d, host + '/kukucupdate/' + (idx + 1) + '.html');\n  });\n\n}\n\n// ============ 模式 2：书库 ============\nif (currentMode === \"📚 书库\") {\n\n  ui.push({ title: '书库地区', type: 'select', chars: Object.keys(channels), default: currentChannel, action: \"var c=infoMap['书库地区']; var obj={}; try{obj=JSON.parse(source.getVariable());}catch(e){} obj.channel=c; source.setVariable(JSON.stringify(obj)); java.refreshExplore(); java.toast('已切换到: '+c);\", style: { layout_flexBasisPercent: 1 } });\n\n  ui.push({ title: '━━━ 【按类型】 ━━━', url: '', style: { layout_flexBasisPercent: 1, layout_flexGrow: 1 } });\n  tags.forEach(function(t) {\n    pushCell(t, host + '/kukucmangalists/' + area + '/' + encodeURIComponent(t) + '/3/{{page}}.html');\n  });\n\n  ui.push({ title: '━━━ 【按进度】 ━━━', url: '', style: { layout_flexBasisPercent: 1, layout_flexGrow: 1 } });\n  fulls.forEach(function(f) {\n    pushCell(\"📖 \" + f[0], host + '/kukucmangalists/' + area + '/全部/' + f[1] + '/{{page}}.html');\n  });\n\n}\n\nJSON.stringify(ui);\n</js>", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\",\"Referer\":\"http://cn.kukuc.cc/\"}", "lastUpdateTime": "1789143920649", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=\"og:novel:author\"]@content", "coverUrl": "meta[property=\"og:image\"]@content", "intro": "meta[property=\"og:description\"]@content", "kind": "meta[property=\"og:novel:category\"]@content", "lastChapter": "meta[property=\"og:novel:latest_chapter_name\"]@content", "name": "meta[property=\"og:title\"]@content"}, "ruleContent": {"content": "@js:\n(function() {\n    var m = String(baseUrl).match(/\\/kukucchapter\\/(\\d+)\\/(\\d+)\\.html/);\n    if (!m) return '未匹配章节ID';\n    var aid = m[1], cid = m[2];\n\n    var api = 'http://cn.kukuc.cc/api/comic/read/pics';\n    var hdrs = {\n        'X-Requested-With': 'XMLHttpRequest',\n        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',\n        'Origin': 'http://cn.kukuc.cc',\n        'Referer': String(baseUrl)\n    };\n\n    function fetchBatch(offset) {\n        var body = 'id=' + cid + '&aid=' + aid + '&offset=' + offset + '&limit=5';\n        var opts = { method: 'POST', body: body, headers: hdrs, charset: 'utf-8' };\n        var resp = java.ajax(api + ',' + JSON.stringify(opts));\n        if (resp && typeof resp.body === 'function') resp = resp.body();\n        try {\n            return JSON.parse(String(resp));\n        } catch (e) {\n            return null;\n        }\n    }\n\n    var first = fetchBatch(0);\n    if (!first || !first.data || !first.data.pic) {\n        return '首屏解析失败: ' + String(first).substring(0, 200);\n    }\n\n    var total = first.data.total || first.data.pic.length;\n    var all = first.data.pic.slice();\n\n    var offset = 5;\n    while (offset < total) {\n        var r = fetchBatch(offset);\n        if (!r || !r.data || !r.data.pic || !r.data.pic.length) break;\n        all = all.concat(r.data.pic);\n        offset += 5;\n    }\n\n    var imgs = '';\n    for (var i = 0; i < all.length; i++) {\n        var u = all[i].pic;\n        if (!u) continue;\n        imgs += '<img src=\"' + u + '\" style=\"width:100%;display:block;margin:0;padding:0;\">';\n    }\n    return imgs || '无图片';\n})()", "nextContentUrl": "@js:\n(function() {\n    var m = String(baseUrl).match(/\\/kukucchapter\\/(\\d+)\\/(\\d+)\\.html/);\n    if (!m) return '';\n\n    var html = String(java.ajax(String(baseUrl)));\n    var next = html.match(/next\\s*:\\s*(\\d+)/);\n    if (next && next[1] && next[1] !== '0') {\n        return 'http://cn.kukuc.cc/kukucchapter/' + m[1] + '/' + next[1] + '.html';\n    }\n    return '';\n})()"}, "ruleExplore": {"author": ".comic-author@text", "bookList": ".comic-sort li.comic-item||.update-list li.comic-item||.comic-list li.comic-item||.rank-comic-list li.list", "bookUrl": "a@href", "coverUrl": "img@src||img@data-original", "lastChapter": ".chapter@text", "name": ".title@text||h3.comic-name a@text||a@title"}, "ruleSearch": {"bookList": ".comic-sort li.comic-item||#js_comicSortList li||ul.comic-sort li", "bookUrl": "a@href", "checkKeyWord": "天命大反派", "coverUrl": "img@src", "lastChapter": ".chapter@text", "name": ".title@text||a@title"}, "ruleToc": {"chapterList": "#js_chapters li.comic-chapter-item", "chapterName": "a@title", "chapterUrl": "a@href"}, "searchUrl": "http://cn.kukuc.cc/search?searchkey={{key}}", "weight": 0},{"bookSourceGroup": "✦优", "bookSourceName": "🄼黄金屋 -", "bookSourceType": 0, "bookSourceUrl": "https://www.huangjinwu.org/", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:s=[];push=(a,b,d)=>s.push({title:a,url:b,style:{layout_flexBasisPercent:1/d-.05,layout_flexGrow:1}});push(\"排行榜\",null,1);[[\"总点击\",\"allvisit\"],[\"月点击\",\"monthvisit\"],[\"周点击\",\"weekvisit\"],[\"总推荐\",\"allvote\"],[\"月推荐\",\"monthvote\"],[\"周推荐\",\"weekvote\"],[\"收藏榜\",\"goodnum\"],[\"字数榜\",\"size\"],[\"新书榜\",\"postdate\"]].map(([s,r])=>push(s,`/rank/${r}/{{page}}.html`,3));push(\"分类\",null,1);[\"玄幻小说\",\"仙侠小说\",\"都市小说\",\"历史小说\",\"网游小说\",\"科幻小说\",\"灵异小说\",\"言情小说\",\"其他小说\"].map((s,i)=>push(s,`/list/${i+1}/{{page}}.html`,3));push(\"标签\",null,1);[[\"生活\",\"16\"],[\"废土\",\"13162\"],[\"空间\",\"83\"],[\"修仙\",\"37\"],[\"高武\",\"82\"],[\"科幻\",\"39\"],[\"重生\",\"46\"],[\"娱乐\",\"41\"],[\"东方\",\"2\"],[\"诸天\",\"17\"],[\"言情\",\"56\"],[\"穿越\",\"4\"],[\"玄幻\",\"1\"],[\"系统流\",\"112\"],[\"末世\",\"49\"],[\"都市\",\"7\"],[\"异界\",\"15\"],[\"世界\",\"76\"],[\"仙侠\",\"23\"],[\"游戏\",\"14\"]].map(([s,r])=>push(s,`/tag/${r}/{{page}}.html`,4));JSON.stringify(s);", "lastUpdateTime": "1789132889732", "respondTime": 180000, "ruleBookInfo": {"author": "[property=\"og:novel:author\"]@content", "coverUrl": "[property=og:image]@content", "intro": "[property=\"og:novel:update_time\"]@content&&\n[property=\"og:description\"]@content@js:'更新时间：'+result", "kind": "[property~=category|status|tags]@content", "lastChapter": "[property~=las?test_chapter_name]@content", "name": "[property=\"og:novel:book_name\"]@content"}, "ruleContent": {"content": "#readerContent@p@text", "nextContentUrl": "small@text##(\\d+)\\)$##$1###\n<js>\nArray.from(\n    { length: Number(result[0]) - 1 },\n    (_, i) => baseUrl.replace(/\\/?$/g, '/' + (i + 2) + '.html')\n)\n</js>"}, "ruleExplore": [], "ruleSearch": {"author": ".book-author@text##^[\\w ]{2}：", "bookList": ".book-card", "bookUrl": "@href", "checkKeyWord": "明克街", "coverUrl": "a@href\n@js:'/book/files/article/image/'+(n=/(\\d+)\\D*$/.exec(result)[1],n.length>3?n.slice(0,-3):'0')+'/'+n+'/'+n+'s.jpg'", "intro": ".book-desc@text", "kind": ".book-badge@text", "name": ".book-title@text"}, "ruleToc": {"chapterList": "#chapterList.-1@a", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": ".page-link.-1@href##(\\d+)\\.html##$1###\n<js>\nArray.from(\n    { length: Number(result[0]) - 1 },\n    (_, i) => baseUrl.replace(/\\/?$/g, '/' + (i + 2) + '.html')\n)\n</js>"}, "searchUrl": "/search?keyword={{key}}", "weight": 0},{"bookSourceComment": "2026.9.9日更新：\n合并番茄听书多人对话和成熟大叔音色\n优化番茄听书AI音色字幕对齐音频进度\n修复发现页段评图标大小切换无效问题\n\nSVG气泡示例(颜色：$color 段评数量：$displayText)\n\n❤️‍🔥登录必看❤️‍🔥\n1.输入邮箱密码后必须点✓保存生效，\n否则读取不到输入的账号密码\n2.跳转卡顿在设置→其他设置中清除WebView缓存\n\n🔔适配兼容\niOS 适配:源阅,栖阅,轻悦时光,用心读书\n📖获取书源请访问书山发布页\n     https://fb.shushan.vip\n\n阅读软件多平台聚合下载站\nhttps://legado.vossc.com\n\n🔥注：阅读请使用最新测试版\n1.所有源站每20秒最多12章，把预下载调到0-3之间使用\n💯[打赏VIP无请求限制,专属书源]\n2.自定义源站示例：番茄小说,七猫  多个源站用英文,号分隔\n源站名参考 登录URL //书源配置列表 v参数\n3.源站带有❇️图标表示只能指定或@搜索\n\n4.搜索模式：\n书名@来源 多个来源用英文,号分隔\n示例： \n系统@番茄小说，多个源站使用英文,号分隔\n书名@类型 返回对应类型所有源站数据，可直接使用@方式搜索或者点击登陆切换模式\n示例： \n系统@小说  听书  漫画  短剧等\n默认书名排序\n指定作者优先：\n作者名@作者   作者名@作者,源站", "bookSourceGroup": "聚合书源", "bookSourceName": "📚书山聚合", "bookSourceType": 0, "bookSourceUrl": "书山聚合", "bookUrlPattern": "https?:\\/\\/.*\\/details.*", "customButton": true, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": true, "exploreUrl": "<js>\nlet config = getConfig.call(this);\nif (!config.host || !config.gender) {\n    config = { gender: \"boy\", host: getServerHost() };\n    setConfigs.call(this, config);\n    java.toast(\"配置初始化完成\");\n}\nlet obj = (title, url, type) => ({\n  title: title,\n  url: url,\n  style: { layout_flexGrow: 1, layout_flexBasisPercent: type }\n});\nlet sort = [];\nlet controls = [];\nlet allSourceOptions = [{label:'☁️聚合搜索', value:''}];\nlet sourceNameToType = {};\nlet sourceTypeToNames = {};\ntry {\n    let apiResponse = JSON.parse(java.ajax(getServerHost() + \"/api/get_config\"));\n    if (apiResponse && Array.isArray(apiResponse)) {\n        apiResponse.forEach(item => {\n            if (item.name && item.key) {\n                allSourceOptions.push({\n                    label: item.name,\n                    value: item.name\n                });\n                if (item.type) {\n                    sourceNameToType[item.name] = item.type;\n                    if (!sourceTypeToNames[item.type]) {\n                        sourceTypeToNames[item.type] = [];\n                    }\n                    sourceTypeToNames[item.type].push(item.name);\n                }\n            }\n        });\n    }\n} catch(e) {\n    java.toast(\"获取源站列表失败，请尝试切换服务器后刷新\");\n}\nlet modeOptions = [\"📖小说\", \"🎧听书\", \"🌈漫画\", \"▶️视频\"];\nlet modeDisplayToName = {'📖小说':'小说','🎧听书':'听书','🌈漫画':'漫画','▶️视频':'视频'};\nlet modeNameToDisplay = {'小说':'📖小说','听书':'🎧听书','漫画':'🌈漫画','视频':'▶️视频'};\nlet modeTypeMap = {'小说':'novel','听书':'audio','漫画':'comic','视频':'video'};\nlet defaultMode = \"📖小说\";\nlet currentModeName = \"\";\nif (config.source) {\n    if (modeNameToDisplay[config.source]) {\n        defaultMode = modeNameToDisplay[config.source];\n        currentModeName = config.source;\n    } else if (sourceNameToType[config.source]) {\n        let type = sourceNameToType[config.source];\n        let typeToMode = {'novel':'📖小说','audio':'🎧听书','comic':'🌈漫画','video':'▶️视频'};\n        defaultMode = typeToMode[type] || \"📖小说\";\n        currentModeName = modeDisplayToName[defaultMode] || \"小说\";\n    }\n} else {\n    currentModeName = \"小说\";\n}\nfunction getSourceOptionsByMode(modeName) {\n    let type = modeTypeMap[modeName] || 'novel';\n    let options = [{label:'☁️聚合搜索', value:''}];\n    if (sourceTypeToNames[type]) {\n        sourceTypeToNames[type].forEach(name => {\n            options.push({label: name, value: name});\n        });\n    }\n    return options;\n}\nlet currentSourceOptions = getSourceOptionsByMode(currentModeName);\nlet sourceLabels = currentSourceOptions.map(item => item.label);\nlet currentSource = config.source || '';\nlet defaultSourceLabel = '☁️聚合搜索';\nlet modeNames = ['小说','听书','漫画','视频'];\nif (!modeNames.includes(currentSource)) {\n    for (let i = 0; i < currentSourceOptions.length; i++) {\n        if (currentSourceOptions[i].value == currentSource) {\n            defaultSourceLabel = currentSourceOptions[i].label;\n            break;\n        }\n    }\n}\nlet mapObj = {};\ncurrentSourceOptions.forEach(item => { mapObj[item.label] = item.value; });\nlet mapStr = JSON.stringify(mapObj).replace(/\\\\/g,'\\\\\\\\').replace(/\"/g,'\\\\\"');\ncontrols.push({\n    title: \"☃关键词💭：书名/作者\",\n    type: \"text\",\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.6 }\n});\ncontrols.push({\n    title: \"🔍搜索\",\n    type: \"button\",\n    action: \"java.searchBook(infoMap['☃关键词💭：书名/作者'] || '', source.bookSourceName + '::' + source.getKey())\",\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: -1, layout_alignSelf: \"baseline\" }\n});\ncontrols.push({\n    title: \"🔄刷新\",\n    type: \"button\",\n    action: \"java.refreshExplore()\",\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.4, layout_alignSelf: \"baseline\" }\n});\ncontrols.push({\n    title: \"⚙登录\",\n    type: \"button\",\n    action: \"java.open('login','http',null)\",\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.4, layout_alignSelf: \"baseline\" }\n});\ncontrols.push({\n    title: \"性别\",\n    type: \"select\",\n    chars: [\"♂️男频\", \"♀️女频\"],\n    default: config.gender == \"boy\" ? \"♂️男频\" : \"♀️女频\",\n    action: \"(function(){ var raw=infoMap['性别']||''; var v=(raw.indexOf('男')>=0)?'boy':'girl'; setConfigs.call(this,{gender:v}); java.refreshExplore(); })()\",\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.4 }\n});\nlet modeMapStr = JSON.stringify(modeDisplayToName).replace(/\\\\/g,'\\\\\\\\').replace(/\"/g,'\\\\\"');\ncontrols.push({\n    title: \"模式\",\n    type: \"select\",\n    chars: modeOptions,\n    default: defaultMode,\n    action: \"(function(){ var raw=infoMap['模式']||''; var modeMap=JSON.parse('\" + modeMapStr + \"'); var modeName=modeMap[raw]||'小说'; setConfigs.call(this,{source:modeName}); java.refreshExplore(); })()\",\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.4 }\n});\nlet currentStyle = cache.get(\"imgstyle\") ?? \"TEXT\";\nlet currentSizeLabel = currentStyle == \"TEXT\" ? \"🔵大号\" : \"🟢小号\";\ncontrols.push({\n    title: \"段评图标\",\n    type: \"select\",\n    chars: [\"🟢小号\", \"🔵大号\"],\n    default: currentSizeLabel,\n    action: \"(function(){ var raw=infoMap['段评图标']||''; var v='TEXT'; if(raw.indexOf('小号')>=0){ v='text'; } else if(raw.indexOf('大号')>=0){ v='TEXT'; } cache.put('imgstyle', v); var msg = v=='TEXT'?'大号':'小号'; java.toast('\\\\n🥽段评气泡-'+msg+'样式'); java.refreshExplore(); })()\",\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.4 }\n});\nlet sourceOptionsStr = JSON.stringify(currentSourceOptions).replace(/\\\\/g,'\\\\\\\\').replace(/\"/g,'\\\\\"');\ncontrols.push({\n    title: \"源站\",\n    type: \"select\",\n    chars: sourceLabels,\n    default: defaultSourceLabel,\n    action: \"(function(){ var raw=infoMap['源站']||''; var options=JSON.parse('\" + sourceOptionsStr + \"'); var map={}; options.forEach(function(item){ map[item.label]=item.value; }); setConfigs.call(this,{source:map[raw]||''}); java.refreshExplore(); })()\",\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.4 }\n});\ncontrols.push({\n    title: \"━━━━━━━━━━━━━━━━━━━━\",\n    type: \"title\",\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n});\nlet currentType = config.gender || \"\";\nlet currentSource2 = config.source || \"\";\nconst getGenderDisplayName = (gender) => {\n  if (gender == \"boy\") return \"男频\";\n  if (gender == \"girl\") return \"女频\";\n  return \"\";\n};\nconst genderDisplay = getGenderDisplayName(currentType);\nconst excludedSources = [\"小说\", \"听书\", \"漫画\", \"视频\", \"短剧\", \"音频\",\"番茄小说\"];\nif (currentSource2 && !excludedSources.includes(currentSource2)) {\n  try {\n    let apiUrl = `${getServerHost()}/type_api?source=${currentSource2}`;\n    if (currentType) {\n      apiUrl += `&gender=${currentType}`;\n    }\n    let response = JSON.parse(java.ajax(apiUrl));\n    if (response.data.found) {\n      response.data.found.forEach(item => {\n        let finalUrl = \"\";\n        if (item.url) {\n          if (item.url.includes('jj_signin') || item.url.includes('jjbookshelf')) {\n            finalUrl = item.url;\n          } else {\n            finalUrl = `${getServerHost()}/type_api?source=${currentSource2}&page={{page}}&url=${item.url}`;\n            if (currentType) {\n              finalUrl += `&gender=${currentType}`;\n            }\n          }\n        }\n        sort.push({\n          title: item.title,\n          url: finalUrl,\n          style: item.style || { layout_flexGrow: 1, layout_flexBasisPercent: 0.29 }\n        });\n      });\n    } else {\n      sort.push({\n        title: `【${currentSource2}】${genderDisplay ? `【${genderDisplay}】` : ''}暂无数据`,\n        url: \"\",\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n      });\n    }\n  } catch(e) {\n    sort.push({\n      title: `【${currentSource2}】${genderDisplay ? `【${genderDisplay}】` : ''}暂无数据`,\n      url: \"\",\n      style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n    });\n  }\n  sort = controls.concat(sort);\n  JSON.stringify(sort);\n} else {\n  let recommendUrl = getServerHost() + \"/read_recommend?session=\" + getSessionId();\n  sort.push({\n    title: '个性推荐',\n    url: recommendUrl,\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.45 }\n  });\n  sort.push({\n    title: '猜你喜欢',\n    url: 'https://fanqienovel.com/tab/cai',\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.45 }\n  });\n  sort.push({\n    title: '巅峰榜单',\n    url: 'https://fanqienovel.com/api/author/misc/top_book_list/v1/?limit=100&offset={{(page-1)*100}}',\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.29 }\n  });\n  sort.push({\n    title: '出版榜单',\n    url: 'https://fanqienovel.com/api/node/publication/list?page_index={{(page-1)*100}}&page_count=100',\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.29 }\n  });\n  sort.push({\n    title: '爆更榜单',\n    url: 'https://api-lf.fanqiesdk.com/api/novel/channel/homepage/rank/rank_list/v2/?aid=13&limit=50&offset={{(page-1)*100}}&side_type=15&type=1',\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.29 }\n  });\n  sort.push({\n    title: '黑马榜单',\n    url: 'https://api-lf.fanqiesdk.com/api/novel/channel/homepage/rank/rank_list/v2/?aid=13&limit=50&offset={{(page-1)*100}}&side_type=13&type=1',\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.29 }\n  });\n  sort.push({\n    title: '热搜榜单',\n    url: 'https://api-lf.fanqiesdk.com/api/novel/channel/homepage/rank/rank_list/v2/?aid=13&limit=50&offset={{(page-1)*100}}&side_type=12&type=1',\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.29 }\n  });\n  let showCategories = currentType == \"girl\" ? [0] : [1];\n  showCategories.forEach(genderCode => {\n    let isMale = genderCode == 1;\n    let genderLabel = isMale ? \"男频\" : \"女频\";\n    let categories = isMale ? [\n      {id: 1141, name: \"西方奇幻\"},\n      {id: 1140, name: \"东方仙侠\"},\n      {id: 8, name: \"科幻末世\"},\n      {id: 261, name: \"都市日常\"},\n      {id: 124, name: \"都市修真\"},\n      {id: 1014, name: \"都市高武\"},\n      {id: 273, name: \"历史古代\"},\n      {id: 27, name: \"战神赘婿\"},\n      {id: 263, name: \"都市种田\"},\n      {id: 258, name: \"传统玄幻\"},\n      {id: 272, name: \"历史脑洞\"},\n      {id: 262, name: \"都市脑洞\"},\n      {id: 257, name: \"玄幻脑洞\"},\n      {id: 751, name: \"悬疑灵异\"},\n      {id: 504, name: \"抗战谍战\"},\n      {id: 746, name: \"游戏体育\"},\n      {id: 718, name: \"动漫衍生\"},\n      {id: 1016, name: \"男频衍生\"}\n    ] : [\n      {id: 1139, name: \"古风世情\"},\n      {id: 8, name: \"科幻末世\"},\n      {id: 746, name: \"游戏体育\"},\n      {id: 1015, name: \"女频衍生\"},\n      {id: 248, name: \"玄幻言情\"},\n      {id: 23, name: \"种田\"},\n      {id: 79, name: \"年代\"},\n      {id: 267, name: \"现言脑洞\"},\n      {id: 246, name: \"宫斗宅斗\"},\n      {id: 539, name: \"悬疑脑洞\"},\n      {id: 253, name: \"古言脑洞\"},\n      {id: 24, name: \"快穿\"},\n      {id: 749, name: \"青春甜宠\"},\n      {id: 745, name: \"星光璀璨\"},\n      {id: 747, name: \"女频悬疑\"},\n      {id: 750, name: \"职场婚恋\"},\n      {id: 748, name: \"豪门总裁\"},\n      {id: 1017, name: \"民国言情\"}\n    ];\n    sort.push({\n      title: `❤️${genderLabel}阅读榜❤️`,\n      url: \"\",\n      style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n    });\n    categories.forEach(cat => {\n      sort.push({\n        title: cat.name,\n        url: `${getServerHost()}/style_top?rank_list_type=3&offset={{(page-1)*10}}&limit=10&category_id=${cat.id}&gender=${genderCode}&rankMold=2`,\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.29 }\n      });\n    });\n    sort.push({\n      title: `❤️${genderLabel}新书榜❤️`,\n      url: \"\",\n      style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 }\n    });\n    categories.forEach(cat => {\n      sort.push({\n        title: cat.name,\n        url: `${getServerHost()}/style_top?rank_list_type=3&offset={{(page-1)*10}}&limit=10&category_id=${cat.id}&gender=${genderCode}&rankMold=1`,\n        style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.29 }\n      });\n    });\n  });\n  let fqCategoryArr = [];\n  showCategories = currentType == \"girl\" ? [0] : [1];\n  showCategories.forEach(i => {\n    try {\n      let response = JSON.parse(java.ajax(`${getServerHost()}/type_style?new_category_tab=${i}`));\n      let categoryGroups = response.data;\n      categoryGroups.forEach(group => {\n        fqCategoryArr.push(obj(`❤️${group.name}❤️`, null, 1));\n        group.data.forEach(category => {\n          let gender, genre_type;\n          if (i == 0) {\n            gender = 0;\n            genre_type = 0;\n          } else if (i == 1) {\n            gender = 1;\n            genre_type = 0;\n          } else {\n            gender = 1;\n            genre_type = 0;\n          }\n          fqCategoryArr.push({\n            title: category.name,\n            url: `${getServerHost()}/type_style?category_id=${category.category_id}&genre_type=${genre_type}&gender=${gender}&offset={{(page-1)*100}}&selected_items=`,\n            style: {\n              layout_flexGrow: 1,\n              layout_flexBasisPercent: 0.29\n            }\n          });\n        });\n      });\n    } catch (e) {\n      fqCategoryArr.push(obj(\"分类加载失败，请重试\", null, 1));\n    }\n  });\n  fqCategoryArr.forEach(item => {\n    if (item.style && item.style.layout_flexBasisPercent) {\n      sort.push({\n        title: item.title,\n        url: item.url,\n        style: item.style\n      });\n    } else {\n      sort.push({\n        title: item.title,\n        url: item.url,\n        style: {\n          layout_flexGrow: 1,\n          layout_flexBasisPercent: 0.29\n        }\n      });\n    }\n  });\n  let hasValidSession = false;\n  let username = \"\";\n  try {\n    let uinfo = java.ajax(getServerHost() + \"/book_user?session=\" + getSessionId());\n    uinfo = JSON.parse(uinfo);\n    if (uinfo.data.name) {\n      username = uinfo.data.name;\n      hasValidSession = true;\n    }\n  } catch (e) {\n  }\n  if (!hasValidSession) {\n    java.toast(\"番茄登录已过期，请重新登录\");\n  }\n  let gro = [];\n  let pushGro = (title, url, type) => gro.push(obj(title, url, type));\n  let sArr = [];\n  if (hasValidSession) {\n    try {\n      let book_shelf_info = JSON.parse(java.ajax(getServerHost() + \"/book_shelf?session=\" + getSessionId()));\n      if (book_shelf_info.code == 0) {\n        let groups_bookids = { \"未分组\": [] };\n        book_shelf_info.data.book_shelf_info.forEach(i => {\n          if (!groups_bookids[i.group_name ? i.group_name : \"未分组\"]) \n            groups_bookids[i.group_name] = [];\n          groups_bookids[i.group_name ? i.group_name : \"未分组\"].push(i.book_id);\n        });\n        Object.keys(groups_bookids).forEach(k => {\n          pushGro(k, \"https://fanqienovel.com/fqbookshelf/groupName/\" + k, 0.4);\n        });\n        if (Object.keys(groups_bookids).length % 2 != 0) pushGro(\"占位\", \"\", 0.4);\n        sArr.push(obj(username + '的个人中心', '', 1));\n        sArr.push(obj(\"我的书架\", \"https://fanqienovel.com/fqbookshelf\", 1));\n        sArr = sArr.concat(gro);\n        sArr.push(obj(\"阅读历史\", getServerHost() + \"/read_history?session=\" + getSessionId() + \"&page={{page}}\", 1));\n      } else {\n        java.toast(\"获取书架信息失败，登录可能已过期\");\n      }\n    } catch (e) {\n      java.toast(\"番茄登录过期，已隐藏个人中心\");\n    }\n  } else {\n    java.toast(\"您还未登录番茄账号，无法同步数据\");\n  }\n  sort = sArr.concat(sort);\n  sort = controls.concat(sort);\n  JSON.stringify(sort);\n}\n</js>", "header": "@js:\nJSON.stringify({\n\t\"User-Agent\":java.getWebViewUA(),\n\t\"X-Api-Key\": getSecretKey(),\n\t\"X-Novel-Token\": \"SHUSAN_READ_2025\"\n\t})", "jsLib": "var hosts = [\n    \"https://v1.vossc.com\",\n    \"https://v2.vossc.com\",\n    \"https://v3.vossc.com\",\n    \"https://v4.vossc.com\",\n    \"http://1.94.248.5:7001\"\n];\n\nfunction getHosts() {\n    return hosts;\n}\n\nfunction getServerHost() {\n    let { source } = this;\n    try {\n        const config = JSON.parse(source.getVariable());\n        return config?.[0]?.host || getHosts()[0];\n    } catch (e) {\n        return getHosts()[0];\n    }\n}\n\nfunction getParagraphApiUrl() {\n    let host = getServerHost.call(this);\n    return host + '/para';\n}\n\nfunction deviceType() {\n    let { java } = this;\n    try {\n        var id = java.androidId();\n        if (id && id !== '') {\n            return false;\n        }\n    } catch (e) {}\n    \n    try {\n        var id = java.deviceID();\n        if (id && id !== '') {\n            return true;\n        }\n    } catch (e) {}\n    \n    return false;\n}\n\nfunction checkEnv() {\n    let { java, source } = this;\n    let isModified = false;\n    try {\n        new Packages.io.legato.kazusa.utils.TimeoutCancellationException('');\n        isModified = true;\n    } catch (e) {\n        isModified = typeof source.loginUi == 'function' ? false : true;\n    }\n\n    return isModified;\n}\n\nfunction isQRead() {\n    let { java } = this;\n    try {\n        return java.qread && java.qread() == \"1\";\n    } catch (e) {\n        return false;\n    }\n}\n\nfunction getSecretKey() {\n    let { java, source, cookie } = this;\n    try {\n        var headerValue = source.getLoginHeader();\n        if (headerValue) {\n            var headerStr = String(headerValue);\n            if (headerStr && headerStr.length >= 10) {\n                return java.base64Encode(headerStr);\n            }\n        }\n        \n        var cookieHeader = cookie.getCookie(getServerHost.call(this)) || '';\n        var tokenMatch = cookieHeader.match(/X-Novel-Token=([^;]+)/);\n        if (tokenMatch) {\n            return tokenMatch[1];\n        }\n        \n        java.toast(\"❌ 未登录，请先登录\");\n        return \"\";\n    } catch (e) {\n        java.toast(\"❌ 获取登陆状态失败\");\n        return \"\";\n    }\n}\n\nfunction getConfig() {\n    let { source } = this;\n    try {\n        let configStr = source.getVariable();\n        if (!configStr || configStr.trim() === \"\") {\n            return { host: getServerHost.call(this) };\n        }\n        let config = JSON.parse(configStr);\n        if (!config || !Array.isArray(config) || config.length === 0) {\n            return { host: getServerHost.call(this) };\n        }\n        return config[0] || { host: getServerHost.call(this) };\n    } catch (e) {\n        return { host: getServerHost.call(this) };\n    }\n}\n\nfunction setConfig(key, value) {\n    let { source } = this;\n    try {\n        let config = getConfig.call(this);\n        config[key] = value;\n        source.setVariable(JSON.stringify([config]));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\n\nfunction setConfigs(obj) {\n    let { source } = this;\n    try {\n        let config = getConfig.call(this);\n        for (let k in obj) {\n            if (obj.hasOwnProperty(k)) {\n                config[k] = obj[k];\n            }\n        }\n        source.setVariable(JSON.stringify([config]));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\n\nfunction getSessionId() {\n    const { cookie, source } = this;\n    try {\n        let cookieHeader = String(cookie.getCookie('fanqienovel.com'));\n        let sessionId = cookieHeader.match(/sessionid=([^;]+)/)?.[1] || null;\n        if (sessionId) {\n            return sessionId;\n        }\n    } catch (e) {}\n    try {\n        let loginInfo = source.getLoginInfoMap() || {};\n        return loginInfo['番茄登录Token'] || \"\";\n    } catch (e) {\n        return \"\";\n    }\n}\n\nfunction splitArray(input, size) {\n    let output = []\n    for (let i = 0; i < input.length; i += size) {\n        output.push(input.slice(i, i + size))\n    }\n    return output\n}\n\nfunction getCommentIconColor() {\n    let {\n        source\n    } = this;\n    let color = \"#666666\";\n    let loginInfo = source.getLoginInfoMap() || \"\";\n    if (loginInfo['段评图标颜色'] && loginInfo['段评图标颜色'].startsWith('#')) {\n        color = loginInfo['段评图标颜色'];\n    }\n    return color;\n}\n\nfunction wrapContentForIOS(content) {\n    if (content == null || content == undefined) {\n        return '';\n    }\n    if (typeof content !== 'string') {\n        try {\n            content = String(content);\n        } catch (e) {\n            return '';\n        }\n    }\n    const pureContent = content.trim();\n    if (deviceType.call(this)) {\n        return pureContent;\n    }\n    let lines = pureContent.split('\\n').map(line => {\n        if (line && line.trim()) {\n            const trimLine = line.trim().replace(/\\s+/g, ' ');\n            return `<div rs-native>${trimLine}</div>`;\n        }\n        return line || '';\n    });\n    return lines.join('\\n');\n}\n\nfunction createCommentHtmlTag(displayText, url, sourceName) {\n    const encodedUrl = url.replace(/'/g, \"\\\\'\");\n    return '<comment count=\"' + String(displayText) + '\" onPress=\"java.' +\n        (isQRead.call(this) ? 'startBrowserDp' : 'startBrowser') +\n        '(\\'' + encodedUrl + '\\',\\'' + sourceName + '段评\\')\" />';\n}\n\nfunction buildCommentUrl(sourceType, bid, cid, para) {\n    let host = getServerHost.call(this);\n\n    switch (sourceType) {\n        case 'jj':\n            return host + '/jj_comment?bid=' + bid + '&cid=' + cid + '&para=' + para;\n        case 'qm':\n            return host + '/qm_comment?item_id=' + cid + '&book_id=' + bid + '&paragraph_id=' + para;\n        case 'qq':\n            return host + '/qq_comment?bid=' + bid + '&cid=' + cid + '&para=' + para;\n        case 'qd':\n            return host + '/qd_comment?bid=' + bid + '&cid=' + cid + '&para=' + para;\n        case 'fq':\n        default:\n            return host + '/idea_comment?item_id=' + cid + '&book_id=' + bid + '&para=' + para + '&sessionid=' + getSessionId.call(this);\n    }\n}\n\nfunction getCommentSourceName(sourceType) {\n    switch (sourceType) {\n        case 'jj':\n            return '晋江';\n        case 'qm':\n            return '七猫';\n        case 'qq':\n            return '企鹅';\n        case 'qd':\n            return '起点';\n        case 'fq':\n        default:\n            return '番茄';\n    }\n}\n\nfunction startCommentBrowser(url, title) {\n    let { java, source } = this;\n    \n    let userHeight = source.getLoginInfoMap().get(\"📐段评高度%\");\n    let heightPercentage = 0.75; // 默认\n    if (userHeight) {\n        let h = parseFloat(userHeight);\n        if (!isNaN(h)) {\n            if (h > 1) h = h / 100;\n            heightPercentage = Math.min(1, Math.max(0, h));\n        }\n    }\n    \n    let userRadius = source.getLoginInfoMap().get(\"📐段评圆角，填0-50之间\");\n    let cornerRadius = 20; // 默认20\n    if (userRadius) {\n        let r = parseInt(userRadius);\n        if (!isNaN(r)) {\n            cornerRadius = Math.min(50, Math.max(0, r)); // 限制在0-50之间\n        }\n    }\n    \n    if (isQRead.call(this)) {\n        java.startBrowserDp(url, title);\n    } else {\n        let isModifiedVersion = checkEnv.call(this);\n        if (isModifiedVersion) {\n            try {\n                let htmlContent = java.ajax(url);\n                java.showBrowser(\n                    url,\n                    htmlContent,\n                    `window.java=java;`,\n                    JSON.stringify({\n                        \"expandedCornersRadius\": cornerRadius,\n                        \"dismissOnTouchOutside\": true,\n                        \"isDraggable\": true,\n                        \"shouldDimBackground\": true,\n                        \"backgroundDimAmount\": 0.5,\n                        \"hardwareAccelerated\": true,\n                        \"isNestedScrollingEnabled\": true,\n                        \"isGestureInsetBottomIgnored\": true,\n                        \"setFitToContents\": false,\n                        \"heightPercentage\": heightPercentage,\n                        \"isHideable\": true\n                    })\n                );\n            } catch (e) {\n                java.showBrowser(\n                    url,\n                    null,\n                    `window.java=java;`,\n                    JSON.stringify({\n                        \"expandedCornersRadius\": cornerRadius,\n                        \"dismissOnTouchOutside\": true,\n                        \"hardwareAccelerated\": true,\n                        \"isNestedScrollingEnabled\": true,\n                        \"isGestureInsetBottomIgnored\": true,\n                        \"heightPercentage\": heightPercentage,\n                        \"isHideable\": true\n                    })\n                );\n            }\n        } else {\n            java.startBrowser(url, title);\n        }\n    }\n}\n\nfunction createSvg(number, color, bid, cid, para, sourceType = 'fq') {\n    let { java, source, cache } = this;\n    var displayText = number > 99 ? \"99+\" : number;\n    var date = String(Date.now()).match(/(\\d{6}$)/)[1];\n\n    let isIOS = deviceType.call(this);\n    if (isIOS) {\n        let commentUrl = buildCommentUrl.call(this, sourceType, bid, cid, para);\n        let sourceName = getCommentSourceName(sourceType);\n        return createCommentHtmlTag.call(this, displayText, commentUrl, sourceName);\n    }\n\n    let isQingRead = isQRead.call(this);\n    let isModifiedVersion = checkEnv.call(this);\n    \n    let customSvgRaw = source.getLoginInfoMap().get(\"自定义气泡SVG\");\n    \n    let customSvg = \"\";\n    if (customSvgRaw) {\n        if (typeof customSvgRaw == 'function') {\n            try { customSvg = customSvgRaw(); } catch (e) {}\n        } else if (typeof customSvgRaw == 'string') {\n            customSvg = customSvgRaw;\n        } else {\n            customSvg = String(customSvgRaw);\n        }\n    }\n    \n    const isValidSvg = customSvg && customSvg.trim().startsWith('<svg') && customSvg.trim().endsWith('</svg>');\n    \n    let imageStyle = cache.get(\"imgstyle\") ?? \"TEXT\";\n    \n    var svg;\n    if (isQingRead || isModifiedVersion) {\n        if (isValidSvg) {\n            svg = customSvg.replace(/\\$color/g, color).replace(/\\$displayText/g, displayText);\n        } else {\n            svg = `<svg width=\"160\" height=\"120\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M 55 10 L 120 10 Q 150 10 150 40 L 150 80 Q 150 110 120 110 L 55 110 Q 25 110 25 80 L 25 75 L 3 60 L 25 45 L 25 40 Q 25 10 55 10 Z\" fill=\"none\" stroke=\"${color}\" stroke-width=\"5\" stroke-linejoin=\"round\"/><text x=\"87\" y=\"77\" font-family=\"Arial, sans-serif\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-size=\"50\" font-weight=\"bold\" fill=\"${color}\">${displayText}</text></svg>`;\n        }\n    } else {\n        svg = isValidSvg ? customSvg : `<svg width=\"1000\" height=\"909\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M80,80 h840 a60,60 0 0 1 60,60 v580 a60,60 0 0 1 -60,60 h-620 l-140,90 v-90 h-80 a60,60 0 0 1 -60,-60 v-580 a60,60 0 0 1 60,-60 z\" fill=\"none\" stroke=\"${color}\" stroke-width=\"16\" stroke-linejoin=\"round\"/><text x=\"500\" y=\"450\" font-family=\"Arial, sans-serif\" text-anchor=\"middle\" font-size=\"360\" fill=\"${color}\" dy=\"0.3em\">${displayText}</text></svg>`;\n    }\n\n    var encodedSvg = java.base64Encode(svg);\n\n    const jsFunction = {\n        'jj': 'showJJCmt',\n        'qm': 'showQmCmt',\n        'qq': 'showQQCmt',\n        'qd': 'showQDCmt',\n        'snm': 'showSnmCmt',\n        'fq': 'showCmt'\n    }[sourceType] || 'showCmt';\n\n    const baseData = `data:image/svg+xml;base64,${encodedSvg},{'${isModifiedVersion ? 'click' : 'js'}':'${jsFunction}(\"${bid}\",\"${cid}\",\"${para}\",\"${date}\")','style':'${imageStyle}'}`;\n\n    if (sourceType == 'qq' && para == 0) return baseData;\n    return deviceType.call(this) ? baseData : `<img src=\"${baseData}\">`;\n}\n\nfunction createGodReviewSvg(reviews, bid, cid, paraId) {\n    let { java, source, cache } = this;\n    \n    if (!reviews || reviews.length == 0) return '';\n    \n    let review = reviews[0];\n    let content = review.content || '';\n    \n    content = content.replace(/https?:\\/\\/[^\\s]+/g, \"\")\n                     .replace(/qdd\\.gg\\/[^\\s]+/g, \"\")\n                     .replace(/\\[fn=\\d+\\]/g, \"\");\n    \n    let displayText = content.trim();\n    let maxChars = 21;\n    \n    if (displayText.length > maxChars) {\n        displayText = displayText.substring(0, maxChars) + '…';\n    }\n    \n    if (!displayText) return '';\n    \n    let isModifiedVersion = checkEnv.call(this);\n    \n    let tagColor = \"#FF4444\";\n    \n    let textColor = \"#FF4444\";\n    try {\n        let loginInfo = source.getLoginInfoMap() || \"\";\n        if (loginInfo['神评文字颜色'] && loginInfo['神评文字颜色'].startsWith('#')) {\n            textColor = loginInfo['神评文字颜色'];\n        }\n    } catch(e) {}\n    \n    let borderColor = \"#CCCCCC\";\n    try {\n        let loginInfo = source.getLoginInfoMap() || \"\";\n        if (loginInfo['神评边框颜色'] && loginInfo['神评边框颜色'].startsWith('#')) {\n            borderColor = loginInfo['神评边框颜色'];\n        }\n    } catch(e) {}\n    \n    displayText = displayText.replace(/&/g, '&amp;')\n                             .replace(/</g, '&lt;')\n                             .replace(/>/g, '&gt;')\n                             .replace(/\"/g, '&quot;')\n                             .replace(/'/g, '&apos;');\n\n    let svg = `<svg viewBox=\"0 0 600 60\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display:block;margin-top:2px;width:100%;max-width:600px;height:auto;\">\n        <rect x=\"2\" y=\"2\" width=\"596\" height=\"56\" fill=\"rgba(255,255,255,0.10)\" rx=\"16\" stroke=\"${borderColor}\" stroke-width=\"0.8\"/>\n        <rect x=\"16\" y=\"14\" width=\"60\" height=\"32\" rx=\"10\" fill=\"${tagColor}\"/>\n        <text x=\"46\" y=\"36\" font-family=\"system-ui, -apple-system, sans-serif\" font-size=\"18\" text-anchor=\"middle\" font-weight=\"600\" fill=\"#FFFFFF\">神评论</text>\n        <text x=\"90\" y=\"40\" font-family=\"system-ui, -apple-system, sans-serif\" font-size=\"23\" font-weight=\"500\" fill=\"${textColor}\">${displayText}</text>\n    </svg>`;\n    \n    let encodedSvg = java.base64Encode(svg);\n    \n    let jsFunction = 'showQDCmt';\n    let date = String(Date.now()).match(/(\\d{6}$)/)[1];\n    \n    const baseData = `data:image/svg+xml;base64,${encodedSvg},{'${isModifiedVersion ? 'click' : 'js'}':'${jsFunction}(\"${bid}\",\"${cid}\",\"${paraId}\",\"${date}\")','style':'full'}`;\n    \n    return `<img src=\"${baseData}\">`;\n}\n\nfunction createChapterEndSvg(bid, cid, totalCount, authorName, authorExpectText, commentList) {\n    let { java, source, cache } = this;\n    \n    let color = getCommentIconColor.call(this);\n    let isModifiedVersion = checkEnv.call(this);\n    \n    let countText = totalCount > 999 ? \"999+\" : String(totalCount);\n    \n    var EMOJI = {\n        1:\"👏\",2:\"🌹\",3:\"🤝\",4:\"😁\",5:\"😄\",6:\"🥺\",7:\"🙂\",8:\"😏\",9:\"😙\",10:\"👆🏻🐽\",\n        11:\"🙄\",12:\"😭\",13:\"😵\",14:\"😥\",15:\"🖕🏻\",16:\"🥵\",17:\"😓\",18:\"🤫\",19:\"😂\",20:\"😢\",\n        21:\"😍\",22:\"🤕🔨\",23:\"😑\",24:\"😫\",25:\"🤗\",26:\"🤪\",27:\"🙏\",28:\"😣\",29:\"💪\",30:\"💀\",\n        31:\"😳\",32:\"😎\",33:\"🤭\",34:\"😄👏\",35:\"👍🏻\",36:\"🤓\",37:\"😡\",38:\"🙁\",39:\"😄❓\",40:\"😞\",\n        41:\"😧\",42:\"💋\",43:\"☺️\",44:\"🤬\",45:\"😴\",46:\"🤠🚬\",47:\"😱\",48:\"🐷\",49:\"😪\",50:\"🤐\",\n        51:\"🥴\",52:\"🌙\",53:\"❤️\",54:\"🔪\",55:\"🎁\",56:\"💔\",57:\"👊🏻\",58:\"😒\",59:\"✌🏻️\",60:\"😮\",\n        61:\"🤨\",62:\"😴\",63:\"👏🏻\",64:\"🐲\",65:\"⭐\",66:\"🌧️\",67:\"🍉\",68:\"🍵\",69:\"🔥\",70:\"💯\"\n    };\n    \n    function removeFnEmoji(s) {\n        return s ? s.replace(/\\[fn=\\d+\\]/g, '') : '';\n    }\n    \n    function replaceFnEmoji(s) {\n        return s ? s.replace(/\\[fn=(\\d+)\\]/g, function(match, id) {\n            return EMOJI[parseInt(id)] || '';\n        }) : '';\n    }\n    \n    let commentListArray = [];\n    if (commentList && typeof commentList == 'object' && commentList.length !== undefined) {\n        commentListArray = commentList;\n    } else if (Array.isArray(commentList)) {\n        commentListArray = commentList;\n    }\n    \n    let maxComments = 3;\n    let validComments = [];\n    for (let i = 0; i < commentListArray.length && validComments.length < maxComments; i++) {\n        let c = commentListArray[i] || {};\n        let content = c.Content || c.content || '';\n        if (content && content.trim()) {\n            let userName = c.UserName || c.userName || c.nickname || '匿名';\n            let likeCount = c.AgreeAmount || c.agreeAmount || c.likeCount || 0;\n            let formattedContent = replaceFnEmoji(content.trim());\n            validComments.push({\n                userName: userName.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&apos;'),\n                content: formattedContent.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&apos;'),\n                likeCount: likeCount\n            });\n        }\n    }\n    \n    if (validComments.length == 0) {\n        var emptyHeight = 150;\n        var svg = `<svg viewBox=\"0 0 700 ${emptyHeight}\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display:block;margin-top:16px;width:100%;max-width:700px;height:auto;\">\n    <rect x=\"0\" y=\"0\" width=\"700\" height=\"${emptyHeight}\" rx=\"18\" fill=\"none\" stroke=\"${color}\" stroke-width=\"0.5\" opacity=\"0.6\"/>\n    <text x=\"32\" y=\"44\" font-family=\"system-ui, -apple-system, sans-serif\" font-size=\"24\" font-weight=\"700\" fill=\"${color}\" opacity=\"1\">💬 本章说</text>\n    <text x=\"668\" y=\"44\" text-anchor=\"end\" font-family=\"system-ui, -apple-system, sans-serif\" font-size=\"18\" font-weight=\"600\" fill=\"${color}\" opacity=\"0.9\">${countText}条评论 ›</text>\n    <line x1=\"28\" y1=\"58\" x2=\"672\" y2=\"58\" stroke=\"${color}\" stroke-width=\"0.3\" opacity=\"0.35\"/>\n    <text x=\"350\" y=\"110\" text-anchor=\"middle\" font-family=\"system-ui, -apple-system, sans-serif\" font-size=\"16\" fill=\"${color}\" opacity=\"0.55\">还没有评论，快来抢沙发吧~</text>\n</svg>`;\n        \n        var encodedSvg = java.base64Encode(svg);\n        var jsFunction = 'showQDCmt';\n        var date = String(Date.now()).match(/(\\d{6}$)/)[1];\n        var baseData = `data:image/svg+xml;base64,${encodedSvg},{'${isModifiedVersion ? 'click' : 'js'}':'${jsFunction}(\"${bid}\",\"${cid}\",\"benzhang\",\"${date}\")','style':'FULL'}`;\n        return '\\n' + `<img src=\"${baseData}\">`;\n    }\n    \n    let headerHeight = 100;\n    let cardHeight = 130;\n    let cardGap = 24;\n    let bottomPadding = -20;\n    let totalHeight = headerHeight + validComments.length * (cardHeight + cardGap) + bottomPadding;\n    \n    var svg = `<svg viewBox=\"0 0 700 ${totalHeight}\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display:block;margin-top:16px;width:100%;max-width:700px;height:auto;\">\n    <rect x=\"0\" y=\"0\" width=\"700\" height=\"${totalHeight}\" rx=\"18\" fill=\"none\" stroke=\"${color}\" stroke-width=\"0.5\" opacity=\"0.6\"/>\n    <text x=\"32\" y=\"44\" font-family=\"system-ui, -apple-system, sans-serif\" font-size=\"24\" font-weight=\"700\" fill=\"${color}\" opacity=\"1\">💬 本章说</text>\n    <text x=\"668\" y=\"44\" text-anchor=\"end\" font-family=\"system-ui, -apple-system, sans-serif\" font-size=\"18\" font-weight=\"600\" fill=\"${color}\" opacity=\"0.9\">${countText}条评论 ›</text>\n    <line x1=\"28\" y1=\"58\" x2=\"672\" y2=\"58\" stroke=\"${color}\" stroke-width=\"0.3\" opacity=\"0.35\"/>`;\n    \n    validComments.forEach(function(c, idx) {\n        let yPos = 77 + idx * (cardHeight + cardGap);\n        let maxCharsPerLine = 23;\n        let contentDisplay = c.content;\n        \n        if (contentDisplay.length > maxCharsPerLine * 2) {\n            contentDisplay = contentDisplay.substring(0, maxCharsPerLine * 2) + '…';\n        }\n        \n        let hasTwoLines = contentDisplay.length > maxCharsPerLine;\n        let line1Text = hasTwoLines ? contentDisplay.substring(0, maxCharsPerLine) : contentDisplay;\n        let line2Text = hasTwoLines ? contentDisplay.substring(maxCharsPerLine) : '';\n        \n        let likeText = c.likeCount > 999 ? \"999+\" : String(c.likeCount);\n        let likeWidth = likeText.length * 13 + 50;\n        let likeX = 668 - likeWidth;\n        \n        let avatarColors = [\"#e07078\", \"#6090d0\", \"#50b878\", \"#d0a860\", \"#9060c8\"];\n        let avatarColor = avatarColors[idx % avatarColors.length];\n        let initial = c.userName.charAt(0);\n        \n        let cardBg = idx % 2 == 0 ? 'rgba(128,128,128,0.1)' : 'rgba(128,128,128,0.05)';\n        \n        svg += `\n    <rect x=\"14\" y=\"${yPos}\" width=\"672\" height=\"${cardHeight}\" rx=\"14\" fill=\"${cardBg}\"/>\n    <circle cx=\"50\" cy=\"${yPos + 34}\" r=\"19\" fill=\"${avatarColor}\" opacity=\"0.95\"/>\n    <text x=\"50\" y=\"${yPos + 40}\" text-anchor=\"middle\" font-family=\"system-ui, -apple-system, sans-serif\" font-size=\"16\" font-weight=\"700\" fill=\"#ffffff\">${initial}</text>\n    <text x=\"82\" y=\"${yPos + 28}\" font-family=\"system-ui, -apple-system, sans-serif\" font-size=\"21\" font-weight=\"700\" fill=\"${color}\" opacity=\"1\">${c.userName}</text>\n    <text x=\"82\" y=\"${yPos + 72}\" font-family=\"system-ui, -apple-system, sans-serif\" font-size=\"24\" font-weight=\"400\" fill=\"${color}\" opacity=\"1\">　　${line1Text}</text>`;\n        if (hasTwoLines) {\n            svg += `\n    <text x=\"82\" y=\"${yPos + 104}\" font-family=\"system-ui, -apple-system, sans-serif\" font-size=\"24\" font-weight=\"400\" fill=\"${color}\" opacity=\"1\">　　　${line2Text}</text>`;\n        }\n        svg += `\n    <g transform=\"translate(${likeX}, ${yPos + 6})\">\n        <rect x=\"0\" y=\"0\" width=\"${likeWidth}\" height=\"28\" rx=\"14\" fill=\"none\" stroke=\"${color}\" stroke-width=\"0.7\" opacity=\"0.7\"/>\n        <g transform=\"translate(9, 4)\">\n            <path d=\"M12 8V4a3 3 0 0 0-3-3L5 10v10h10.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM6 20H3a2 2 0 0 1-2-2v-6a2 2 0 0 1 2-2h3\" fill=\"none\" stroke=\"${color}\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" transform=\"scale(0.78)\" opacity=\"0.85\"/>\n        </g>\n        <text x=\"${likeWidth / 2 + 8}\" y=\"19\" text-anchor=\"middle\" font-family=\"system-ui, -apple-system, sans-serif\" font-size=\"14\" font-weight=\"600\" fill=\"${color}\" opacity=\"0.85\">${likeText}</text>\n    </g>`;\n    });\n    \n    svg += `\n</svg>`;\n    \n    var encodedSvg = java.base64Encode(svg);\n    var jsFunction = 'showQDCmt';\n    var date = String(Date.now()).match(/(\\d{6}$)/)[1];\n    var baseData = `data:image/svg+xml;base64,${encodedSvg},{'${isModifiedVersion ? 'click' : 'js'}':'${jsFunction}(\"${bid}\",\"${cid}\",\"benzhang\",\"${date}\")','style':'FULL'}`;\n    \n    return '\\n' + `<img src=\"${baseData}\">`;\n}\n\nfunction checkClickRateLimit(lastCallKey) {\n    let { cache } = this;\n    let lastCallTime = cache.getFromMemory(lastCallKey) || 0;\n    let currentTime = Date.now();\n    if (currentTime - lastCallTime < 1000) {\n        return false;\n    }\n    cache.putMemory(lastCallKey, currentTime);\n    return true;\n}\n\nfunction handleCommentClick(sourceType, bid, cid, para, date, cacheKey) {\n    let { cache } = this;\n    let isModifiedVersion = checkEnv.call(this);\n    let isQingRead = isQRead.call(this);\n\n    if (!isModifiedVersion && !isQingRead) {\n        let mname = cacheKey;\n        let load = (cache.getFromMemory(mname) ?? \"-\").split(\"-\");\n        if (load[0] != \"1\" || load[1] != date) {\n            cache.putMemory(mname, \"1-\" + date);\n            return;\n        }\n        let lastCallKey = `last_call_${sourceType}_${bid}_${cid}_${para}`;\n        if (!checkClickRateLimit.call(this, lastCallKey)) {\n            return;\n        }\n    }\n\n    let commentUrl = buildCommentUrl.call(this, sourceType, bid, cid, para);\n    let title = isModifiedVersion ? getCommentSourceName(sourceType) + \"段评\" : (cache.getFromMemory(cacheKey + \"-text\") ?? getCommentSourceName(sourceType) + \"段评\");\n    startCommentBrowser.call(this, commentUrl, title);\n}\n\nfunction getComments(content, bid, cid, sourceType = 'fq', contentMd5 = null, extraParams = {}) {\n    let { java, cache, source } = this;\n    \n    if (content == null || content == undefined) {\n        return '';\n    }\n    if (typeof content !== 'string') {\n        try {\n            content = String(content);\n        } catch (e) {\n            return '';\n        }\n    }\n    \n    let apiBase = getParagraphApiUrl.call(this);\n    \n    try {\n        let lines = content\n            .replace(new RegExp('(<img[^>]*?>)\\n', 'g'), \"$1\")\n            .split(\"\\n\")\n            .filter(line => line && line.trim());\n\n        if (lines.length == 0) {\n            return wrapContentForIOS.call(this, content);\n        }\n\n        let isModifiedVersion = checkEnv.call(this);\n        let isQingRead = isQRead.call(this);\n        let isIOS = deviceType.call(this);\n\n        let apiUrl = buildParagraphUrl.call(this, apiBase, sourceType, bid, cid, contentMd5, extraParams);\n        if (!apiUrl) {\n            return wrapContentForIOS.call(this, content);\n        }\n\n        let response;\n        try {\n            response = java.ajax(apiUrl);\n        } catch (e) {\n            return wrapContentForIOS.call(this, content);\n        }\n\n        if (!response || (typeof response == 'string' && response.trim() == '')) {\n            return wrapContentForIOS.call(this, content);\n        }\n\n        let result;\n        try {\n            result = JSON.parse(response);\n        } catch (e) {\n            return wrapContentForIOS.call(this, content);\n        }\n\n        if (!result || result.code !== 0 || !result.data || !result.data.list) {\n            let msg = (result && result.msg) ? result.msg : '请求失败';\n            //java.toast(msg);\n            return wrapContentForIOS.call(this, content);\n        }\n\n        let paragraphList = result.data.list;\n        if (!Array.isArray(paragraphList) || paragraphList.length == 0) {\n            return wrapContentForIOS.call(this, content);\n        }\n        \n        let reviews = [];\n        let chapterEndData = null;\n        \n        if (sourceType == 'qd') {\n            try {\n                if (result.data.reviews && Array.isArray(result.data.reviews)) {\n                    reviews = result.data.reviews;\n                }\n            } catch (e) {\n                reviews = [];\n            }\n            \n            try {\n                let host = getServerHost.call(this);\n                let authorUrl = host + '/qd_comment?action=comments&bid=' + bid + '&cid=' + cid + '&para=1&author=1';\n                let authorResponse;\n                try {\n                    authorResponse = java.ajax(authorUrl);\n                } catch (e) {\n                    authorResponse = null;\n                }\n                \n                if (authorResponse) {\n                    let authorData;\n                    try {\n                        authorData = JSON.parse(authorResponse);\n                    } catch (e) {\n                        authorData = null;\n                    }\n                    \n                    if (authorData) {\n                        const activity = authorData?.Data?.Getchapteractivity;\n                        \n                        if (activity && activity.AuthorName) {\n                            var authorName = activity.AuthorName || \"\";\n                            var authorSay = activity.AuthorComments || \"\";\n                            var authorExpect = activity.AskMonthTicket?.AuthorExpectText || \"\";\n                            var displayText = authorSay || authorExpect || \"\";\n                            \n                            if (authorName && displayText) {\n                                authorName = authorName.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n                                displayText = displayText.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n                                \n                                var textLines = [];\n                                var temp = displayText;\n                                var maxChars = 30;\n                                while (temp.length > maxChars) {\n                                    textLines.push(temp.substring(0, maxChars));\n                                    temp = temp.substring(maxChars);\n                                }\n                                if (temp.length > 0) textLines.push(temp);\n                                \n                                var textHeight = textLines.length * 30;\n                                var totalHeight = 60 + textHeight;\n                                var avatarChar = authorName.charAt(0);\n                                var avatarColor = \"#FF6B6B\";\n                                \n                                var svg = '<svg viewBox=\"0 0 700 ' + totalHeight + '\" xmlns=\"http://www.w3.org/2000/svg\" style=\"display:block;margin-bottom:8px;width:100%;max-width:700px;height:auto;\">\\n';\n                                svg += '<rect x=\"0\" y=\"0\" width=\"700\" height=\"' + totalHeight + '\" fill=\"rgba(255,68,68,0.04)\" rx=\"12\" stroke=\"#FF4444\" stroke-width=\"0.3\"/>\\n';\n                                svg += '<circle cx=\"50\" cy=\"38\" r=\"22\" fill=\"' + avatarColor + '\"/>\\n';\n                                svg += '<text x=\"50\" y=\"44\" font-size=\"20\" text-anchor=\"middle\" font-weight=\"700\" fill=\"#FFFFFF\">' + avatarChar + '</text>\\n';\n                                svg += '<text x=\"86\" y=\"30\" font-size=\"17\" font-weight=\"700\" fill=\"#333333\">' + authorName + '</text>\\n';\n                                svg += '<text x=\"' + (86 + authorName.length * 17 + 6) + '\" y=\"30\" font-size=\"14\" font-weight=\"500\" fill=\"#FF4444\">作家的话</text>\\n';\n                                \n                                textLines.forEach(function(line, idx) {\n                                    svg += '<text x=\"86\" y=\"' + (60 + idx * 30) + '\" font-size=\"18\" font-weight=\"400\" fill=\"#666666\">' + line + '</text>\\n';\n                                });\n                                \n                                svg += '</svg>';\n                                \n                                var authorSvgBase64 = java.base64Encode(svg);\n                                var authorDataUrl = 'data:image/svg+xml;base64,' + authorSvgBase64 + ',{\"style\":\"FULL\"}';\n                                lines.push('<img src=\"' + authorDataUrl + '\" />');\n                            }\n                        }\n                    }\n                }\n            } catch (e) {}\n            \n            try {\n                let host = getServerHost.call(this);\n                let chapterEndUrl = host + '/paras/proxy_paragraph?bid=' + bid + '&cid=' + cid;\n                let chapterEndResponse;\n                try {\n                    chapterEndResponse = java.ajax(chapterEndUrl);\n                } catch (e) {\n                    chapterEndResponse = null;\n                }\n                \n                if (chapterEndResponse) {\n                    let chapterEndResult;\n                    try {\n                        chapterEndResult = JSON.parse(chapterEndResponse);\n                    } catch (e) {\n                        chapterEndResult = null;\n                    }\n                    \n                    if (chapterEndResult) {\n                        const endActivity = chapterEndResult?.Data?.Getchapteractivity;\n                        const endComments = chapterEndResult?.Data?.Getchapterendcomments;\n                        if (endActivity && endComments) {\n                            chapterEndData = {\n                                totalCount: endComments.TotalCount || 0,\n                                authorName: endActivity.AuthorName || '',\n                                authorExpectText: endActivity.AskMonthTicket?.AuthorExpectText || '',\n                                commentList: endComments.DataList || []\n                            };\n                        }\n                    }\n                }\n            } catch (e) {}\n        }\n        \n        let reviewsByParagraph = {};\n        try {\n            reviews.forEach(review => {\n                let paraId = review.paragraph_id;\n                if (!reviewsByParagraph[paraId]) {\n                    reviewsByParagraph[paraId] = [];\n                }\n                reviewsByParagraph[paraId].push(review);\n            });\n        } catch (e) {}\n        \n        lines = lines.map(line => {\n            if (typeof line !== 'string') {\n                try {\n                    return String(line);\n                } catch (e) {\n                    return '';\n                }\n            }\n            return line;\n        });\n        \n        let hasTitleComment = false;\n        let titleCommentData = null;\n\n        paragraphList.forEach((item, index) => {\n            let paraId = item.paragraph_id || item.paragraphId;\n            let count = item.comment_count || item.textCount || 0;\n            let hot = (item.hot == 1 || item.is_hot_comment == 1 || item.isHotComment == true);\n            if (count <= 0) return;\n\n            let lineIndex;\n            if (sourceType == 'qq') {\n                if (paraId == 0) {\n                    hasTitleComment = true;\n                    titleCommentData = item;\n                    return;\n                }\n                lineIndex = parseInt(paraId) - 1;\n            } else if (sourceType == 'qd') {\n                if (paraId == -1) {\n                    hasTitleComment = true;\n                    titleCommentData = item;\n                    return;\n                }\n                lineIndex = parseInt(paraId) - 1;\n            } else if (sourceType == 'qm') {\n                lineIndex = index;\n            } else {\n                lineIndex = sourceType == 'jj' ? parseInt(paraId) - 1 : parseInt(paraId);\n            }\n\n            if (lineIndex < 0 || lineIndex >= lines.length) return;\n            \n            if (typeof lines[lineIndex] !== 'string') return;\n            \n            if (/<img[^>]*>/i.test(lines[lineIndex])) {\n                return;\n            }\n\n            if (sourceType == 'fq') {\n                let textOnly = String(lines[lineIndex])\n                    .replace(new RegExp('<[^>]*>', 'g'), '')\n                    .replace(/&nbsp;/g, ' ')\n                    .trim();\n                if (!textOnly) {\n                    return;\n                }\n                if (!isModifiedVersion && !isQingRead) {\n                    cache.putMemory(`fq-${bid}-${cid}-${paraId}-text`, textOnly);\n                }\n            }\n\n            if (!isModifiedVersion && !isQingRead && sourceType != 'fq') {\n                let cacheKey = `${sourceType}-${bid}-${cid}-${paraId}-text`;\n                cache.putMemory(cacheKey, lines[lineIndex]);\n            }\n\n            let color = hot ? \"#f06060\" : getCommentIconColor.call(this);\n            let commentTag = createSvg.call(this, count, color, bid, cid, paraId, sourceType);\n            \n            let reviewTag = '';\n            if (sourceType == 'qd' && reviewsByParagraph[paraId]) {\n                reviewTag = createGodReviewSvg.call(this, reviewsByParagraph[paraId], bid, cid, paraId);\n            }\n            \n            if (isIOS) {\n                lines[lineIndex] += commentTag;\n                if (reviewTag) {\n                    lines[lineIndex] += '<br>' + reviewTag;\n                }\n            } else {\n                if (commentTag.startsWith('data:image')) {\n                    lines[lineIndex] += `<img src=\"${commentTag}\">`;\n                } else {\n                    lines[lineIndex] += commentTag;\n                }\n                if (reviewTag) {\n                    if (reviewTag.startsWith('data:image')) {\n                        lines[lineIndex] += '\\n' + `<img src=\"${reviewTag}\">`;\n                    } else {\n                        lines[lineIndex] += '\\n' + reviewTag;\n                    }\n                }\n            }\n        });\n\n        if (hasTitleComment && titleCommentData) {\n            let titleCount = titleCommentData.comment_count || titleCommentData.textCount || 0;\n            let titleHot = (titleCommentData.hot == 1 || titleCommentData.is_hot_comment == 1 || titleCommentData.isHotComment == true);\n            let color = titleHot ? \"#f06060\" : getCommentIconColor.call(this);\n            let titleBubble = createSvg.call(this, titleCount, color, bid, cid, 0, sourceType);\n            cache.put(bid + \"_\" + cid, titleBubble);\n        }\n\n        let resultContent = lines.join(\"\\n\");\n        if (sourceType == 'qd' && chapterEndData && chapterEndData.totalCount > 0) {\n            let chapterEndSvg = createChapterEndSvg.call(this, bid, cid, chapterEndData.totalCount, chapterEndData.authorName, chapterEndData.authorExpectText, chapterEndData.commentList);\n            resultContent += chapterEndSvg;\n        }\n\n        return wrapContentForIOS.call(this, resultContent);\n    } catch (e) {\n        return wrapContentForIOS.call(this, content);\n    }\n}\n\neval(function(p,a,c,k,e,r){e=function(c){return c.toString(36)};if('0'.replace(0,e)==0){while(c--)r[e(c)]=k[c];k=[function(e){return r[e]||e}];e=function(){return'[0-9a-n]'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('function buildParagraphUrl(0,g,3,1,b,4){c secretKey=getSecretKey.h(i);switch(g){5\\'j\\':c 8=`${0}?6=j&9=${3}&7=${1}`;d(4.e&&4.f){8+=`&e=${4.e}&f=${4.f}`}c a=JJtoken.h(i);d(a)8+=`&a=${a}`;2 8;5\\'k\\':d(!b)2 null;2`${0}?6=k&9=${3}&7=${1}&content_md5=${b}`;5\\'l\\':2`${0}?6=l&9=${3}&7=${1}`;5\\'m\\':2`${0}?6=m&9=${3}&7=${1}`;5\\'n\\':default:2`${0}?6=n&7=${1}`}}',[],24,'apiBase|cid|return|bid|extraParams|case|source|chapter_id|jjUrl|book_id|token|contentMd5|let|if|bookid|chapterid|sourceType|call|this|jj|qm|qq|qd|fq'.split('|'),0,{}))\n\nfunction showJJCmt(bid, cid, para, date) {\n    handleCommentClick.call(this, 'jj', bid, cid, para, date, `jj-${bid}-${cid}-${para}`);\n}\n\nfunction showQDCmt(bid, cid, para, date) {\n    handleCommentClick.call(this, 'qd', bid, cid, para, date, `qd-${bid}-${cid}-${para}`);\n}\n\nfunction showCmt(bid, cid, para, date) {\n    handleCommentClick.call(this, 'fq', bid, cid, para, date, `fq-${bid}-${cid}-${para}`);\n}\n\nfunction showQmCmt(bid, cid, para, date) {\n    handleCommentClick.call(this, 'qm', bid, cid, para, date, `qm-${bid}-${cid}-${para}`);\n}\n\nfunction showQQCmt(bid, cid, para, date) {\n    handleCommentClick.call(this, 'qq', bid, cid, para, date, `qq-${bid}-${cid}-${para}`);\n}\n\nfunction JJtoken() {\n    let { java, source } = this;\n    const loginInfo = source.getLoginInfoMap();\n    const key = loginInfo['晋江登录Token'] || '';\n    if (!key) {\n        java.toast(\"无法阅读未共享的章节和订阅付费章节\");\n    }\n    return java.base64Encode(key);\n}\n\nfunction getSortKey() {\n    let { java } = this;\n    const sortKey = java.get(\"sortkey\") || '';\n    if (!sortKey) {\n        java.toast(\"请先设置排序参数\");\n    }\n    return sortKey;\n}\n\nfunction getTtsTone(sourceType) {\n    let config = getConfig.call(this);\n    if (sourceType == 'fanqie') {\n        return config.fanqie_tts_tone || \"1\";\n    } else if (sourceType == 'shuqi') {\n        return config.shuqi_tts_tone || \"yifei\";\n    }\n    return \"\";\n}\n\nfunction getBookData(bookId) {\n    let { java, source } = this;\n    let newUrl = getServerHost.call(this) + '/detail?book_id=' + bookId;\n    let response = java.ajax(newUrl);\n    let responseData = JSON.parse(response);\n    \n    if (Array.isArray(responseData.data)) {\n        return responseData.data[0];\n    } else if (responseData.data && typeof responseData.data == 'object') {\n        return responseData.data;\n    } else if (responseData.code == 0 && responseData.data) {\n        return responseData.data;\n    }\n    return null;\n}\n\nfunction syncReadingHistory(bookId) {\n    let { java, source } = this;\n    if (bookId) {\n        var sessionid = getSessionId.call(this);\n        if (sessionid && sessionid.trim() !== \"\") {\n            var syncUrl = getServerHost.call(this) + \"/update_history?book_id=\" + bookId + \"&sessionid=\" + sessionid;\n            java.ajax(syncUrl);\n        }\n    }\n}\n\nfunction buildChapterUrl(x, catalog) {\n    let { java } = this;\n    const isFanqieApp = ['番茄小说', '番茄短剧', '番茄听书', '番茄畅听'].includes(catalog.source);\n    \n    let chapterParams = {\n        cid: x.cid,\n        source: catalog.source\n    };\n    \n    if (catalog.source === '书旗听书') {\n        const itemIdMatch = x.url?.match(/[?&]?item_ids=(\\d+)/);\n        if (itemIdMatch) {\n            chapterParams.bookid = catalog.bookid;\n            chapterParams.item_ids = itemIdMatch[1];\n        }\n    }\n    \n    if (!isFanqieApp) {\n        chapterParams.url = catalog.url;\n    } else {\n        chapterParams.book_id = catalog.bookid;\n        chapterParams.item_id = x.url?.match(/item_id=(\\d+)/)?.[1] || null;\n    }\n    \n    if (['企鹅看书', 'QQ阅读', '起点'].includes(catalog.source) && x.url && typeof x.url == 'string') {\n        let cMatch = x.url.match(/chapterid=(\\d+)/);\n        if (cMatch) {\n            chapterParams.bookid = catalog.bookid;\n            chapterParams.chapterid = cMatch[1];\n        }\n    }\n    \n    if (catalog.source == '晋江') {\n        let chapterIdMatch = x.url?.match(/chapterId=(\\d+)/);\n        if (chapterIdMatch) {\n            chapterParams.novelId = catalog.bookid;\n            chapterParams.chapterId = chapterIdMatch[1];\n        }\n    }\n    \n    if (catalog.source == '半夏') {\n        let bjBidMatch = x.url?.match(/bookid=(\\d+)/);\n        let bjChapterIdMatch = x.url?.match(/chapterid=(\\d+)/);\n        let novelIdMatch = x.url?.match(/novelId=(\\d+)/);\n        let chapterIdMatch = x.url?.match(/chapterId=(\\d+)/);\n        if (bjBidMatch && bjChapterIdMatch) {\n            chapterParams.bookid = bjBidMatch[1];\n            chapterParams.chapterid = bjChapterIdMatch[1];\n        }\n        if (novelIdMatch && chapterIdMatch) {\n            chapterParams.novelId = novelIdMatch[1];\n            chapterParams.chapterId = chapterIdMatch[1];\n        }\n    }\n    \n    if (catalog.source == '七猫小说') {\n        chapterParams.qm_url = x.url;\n    }\n    \n    if (catalog.source == '七猫短剧') {\n        chapterParams.qm_id = catalog.bookid;\n    }\n    \n    if (catalog.source == '七猫听书') {\n        chapterParams.book_id = catalog.bookid;\n        let qmItemIdMatch = x.url?.match(/item_id=(\\d+)/);\n        if (qmItemIdMatch) {\n            chapterParams.item_id = qmItemIdMatch[1];\n        }\n    }\n    \n    if (catalog.source == '少年梦') {\n        let snmBidMatch = x.url?.match(/bid=(\\d+)/);\n        let snmCidMatch = x.url?.match(/cid=(\\d+)/);\n        if (snmBidMatch) chapterParams.bookid = snmBidMatch[1];\n        if (snmCidMatch) chapterParams.chapterid = snmCidMatch[1];\n    }\n    \n    let encodedParams = java.base64Encode(JSON.stringify(chapterParams));\n    \n    let commentPart = '{\"type\":\"qingci\"}';\n    \n    if (catalog.source == '七猫小说') {\n        const qmBookId = catalog.bookid;\n        const qmChapterId = x.url?.match(/item_id=(\\d+)/)?.[1] || null;\n        if (qmBookId && qmChapterId) {\n            const qmCommentUrl = `${getServerHost.call(this)}/qm_comment?book_id=${qmBookId}&item_id=${qmChapterId}&type=chapter`;\n            commentPart = `{\"type\":\"qingci\",\"js\":\"book ? result : '${qmCommentUrl}'\"}`;\n        }\n    } else if (catalog.source == '晋江' && chapterParams.novelId && chapterParams.chapterId) {\n        let jjCommentUrl = `${getServerHost.call(this)}/jj_comment?bid=${chapterParams.novelId}&cid=${chapterParams.chapterId}`;\n        commentPart = `{\"type\":\"qingci\",\"js\":\"book ? result : '${jjCommentUrl}'\"}`;\n    } else if (catalog.source == '半夏' && chapterParams.novelId && chapterParams.chapterId) {\n        let bjCommentUrl = `${getServerHost.call(this)}/jj_comment?bid=${chapterParams.novelId}&cid=${chapterParams.chapterId}`;\n        if (chapterParams.bookid && chapterParams.chapterid) {\n            bjCommentUrl += `&bookid=${chapterParams.bookid}&chapterid=${chapterParams.chapterid}`;\n        }\n        commentPart = `{\"type\":\"qingci\",\"js\":\"book ? result : '${bjCommentUrl}'\"}`;\n    } else if (isFanqieApp) {\n        const bookId = catalog.bookid;\n        const itemId = x.url?.match(/item_id=(\\d+)/)?.[1] || null;\n        if (bookId && itemId) {\n            const fanqieCommentUrl = `${getServerHost.call(this)}/idea_comment?book_id=${bookId}&item_id=${itemId}&sessionid=${getSessionId.call(this)}`;\n            commentPart = `{\"type\":\"qingci\",\"js\":\"book ? result : '${fanqieCommentUrl}'\"}`;\n        }\n    } else if (catalog.source == '起点' && chapterParams.bookid && chapterParams.chapterid) {\n        let qdCommentUrl = `${getServerHost.call(this)}/qd_comment?bid=${chapterParams.bookid}&cid=${chapterParams.chapterid}&para=benzhang`;\n        commentPart = `{\"type\":\"qingci\",\"js\":\"book ? result : '${qdCommentUrl}'\"}`;\n    }\n    \n    return `data:chapterUrl;base64,${encodedParams},${commentPart}`;\n}\n\nfunction showTabTips(catalog) {\n    var tabTips = {\n        audio: '听书',\n        video: '视频',\n        comic: '漫画'\n    };\n    if (tabTips[catalog.tab]) {\n        this.java.toast('当前为' + tabTips[catalog.tab] + '模式');\n    }\n}\n\nfunction buildSearchResult(key, sourceParam, host) {\n    let { java } = this;\n    if (key && key.length == 19 && !Number.isNaN(parseInt(key))) {\n        return handleFanqieSearch.call(this, key, host);\n    } else if (key && (key.length == 6 || key.length == 7 || key.length == 8) && !Number.isNaN(parseInt(key))) {\n        return handleJjwxcSearch.call(this, key, host);\n    } else {\n        return host + '/search?login=search&key={{key}}&page={{page}}' + sourceParam;\n    }\n}\n\nfunction handleFanqieSearch(key, host) {\n    let { java } = this;\n    var u = host + `/detail?book_id=${key}`;\n    var kdy = java.base64Encode(u);\n    var response = JSON.parse(java.ajax(u));\n    var nam = response.data.book_name || (response.data[0] && response.data[0].book_name) || '未知';\n    return host + `/details?url=${kdy}&source=番茄小说&name=${encodeURIComponent(nam)}`;\n}\n\nfunction handleJjwxcSearch(key, host) {\n    let { java } = this;\n    var jjApiUrl = `http://app-cdn.jjwxc.net/androidapi/novelbasicinfo?novelId=${key}`;\n    var jjResponse = java.ajax(jjApiUrl);\n    var jjData = JSON.parse(jjResponse);\n    var novelName = jjData.novelName || '未知';\n    var encodedUrl = java.base64Encode(jjApiUrl);\n    return host + `/details?url=${encodedUrl}&source=晋江&name=${encodeURIComponent(novelName)}`;\n}\n\nfunction encode(data) {\n    let { java } = this;\n    return java.createSymmetricCrypto(\"DES/CBC/PKCS5Padding\", String(\"KW8Dvm2N\"), String(\"1ae2c94b\")).encryptBase64(data)\n}\n\nfunction decode(data) {\n    let { java } = this;\n    try {\n        var encryptedBytes = java.base64DecodeToByteArray(data);\n        var key = \"G@tY3$jK7#mL2&pW8\";\n        var iv = \"C!eH4&sM6@wP9^zX1\";\n        var crypto = java.createSymmetricCrypto(\"AES/CBC/PKCS5Padding\", key, iv);\n        return crypto.decryptStr(encryptedBytes);\n    } catch (e) {\n        return data;\n    }\n}", "lastUpdateTime": "1789121889159", "loginUi": "[{\n        \"name\": \"邮箱\",\n        \"type\": \"text\",\n        \"action\": \"\"\n    },\n    {\n        \"name\": \"密码\",\n        \"type\": \"password\",\n        \"action\": \"\"\n    },\n    {\n        \"name\": \"⭕账号登录\",\n        \"type\": \"button\",\n        \"action\": \"login()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🔑注册书源\",\n        \"type\": \"button\",\n        \"action\": \"key()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🔘退出登录\",\n        \"type\": \"button\",\n        \"action\": \"user_logout()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🔐修改密码\",\n        \"type\": \"button\",\n        \"action\": \"password()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🔮信息查询\",\n        \"type\": \"button\",\n        \"action\": \"get_user()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"👤用户后台\",\n        \"type\": \"button\",\n        \"action\": \"user_center()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🔍聚合搜索\",\n        \"type\": \"button\",\n        \"action\": \"sou0()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🧭书源更新\",\n        \"type\": \"button\",\n        \"action\": \"version()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"☕打赏享福利\",\n        \"type\": \"button\",\n        \"action\": \"vip()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"📚书山发布页\",\n        \"type\": \"button\",\n        \"action\": \"fb()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"自定义源站\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"❤️段评开关\",\n        \"type\": \"button\",\n        \"action\": \"toggleParacomment('paras')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🥽SVG大小\",\n        \"type\": \"button\",\n        \"action\": \"imagestyle()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n    \t\"name\": \"🎚服务器切换\",\n        \"type\": \"button\",\n        \"action\": \"sethost()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"♻️服务器检测\",\n        \"type\": \"button\",\n        \"action\": \"checkCurrentServer()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"👨‍🦱男 频\",\n        \"type\": \"button\",\n        \"action\": \"boy()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"👩‍🦰女 频\",\n        \"type\": \"button\",\n        \"action\": \"girl()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n                \"name\": \"🍅番茄登录\",\n        \"type\": \"button\",\n        \"action\": \"fq_login()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"❌番茄退出\",\n        \"type\": \"button\",\n        \"action\": \"logout()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🍅记录同步\",\n        \"type\": \"button\",\n        \"action\": \"toggleBookSync()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🍅发现排序\",\n        \"type\": \"button\",\n        \"action\": \"SortFilter()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🎧 TTS音色\",\n        \"type\": \"button\",\n        \"action\": \"TTSSelector()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n     {\n       \"name\": \"⚡TXT下载开关\",\n       \"type\": \"button\",\n       \"action\": \"toggleFqdown('fqdown')\",\n       \"style\": {\n           \"layout_flexGrow\": 1,\n           \"layout_flexBasisPercent\": 0.4\n        }\n    },\n   {\n        \"name\": \"↓   切换/查询当前模式   ↓\",\n        \"type\": \"button\",\n        \"action\": \"get_cx()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"📖小说模式\",\n        \"type\": \"button\",\n        \"action\": \"type1()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🎧听书模式\",\n        \"type\": \"button\",\n        \"action\": \"type2()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🏞️漫画模式\",\n        \"type\": \"button\",\n        \"action\": \"type3()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"▶️视频模式\",\n        \"type\": \"button\",\n        \"action\": \"type4()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n\n        \"name\": \"↓   专  属VIP源   站   ↓\",\n        \"type\": \"button\",\n        \"action\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"🐧QQ阅读\",\n        \"type\": \"button\",\n        \"action\": \"sou51()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🐧企鹅看书\",\n        \"type\": \"button\",\n        \"action\": \"sou8()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"📓晋江文学\",\n        \"type\": \"button\",\n        \"action\": \"sou55()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n       \"name\": \"♟️书旗文学\",\n        \"type\": \"button\",\n        \"action\": \"sou9()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🍻半夏中文❇️\",\n        \"type\": \"button\",\n        \"action\": \"sou11()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🌤️69书吧com\",\n        \"type\": \"button\",\n        \"action\": \"sou12()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"📖全本小说\",\n        \"type\": \"button\",\n        \"action\": \"sou42()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🪷书耽网\",\n        \"type\": \"button\",\n        \"action\": \"sou52()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🛸得奇小说\",\n        \"type\": \"button\",\n        \"action\": \"sou49()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🛟万相书城\",\n        \"type\": \"button\",\n        \"action\": \"sou48()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🏔台湾小说\",\n        \"type\": \"button\",\n        \"action\": \"sou50()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n    \t \"name\": \"🌧云图有声\",\n        \"type\": \"button\",\n        \"action\": \"sou53()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n\n        \"name\": \"📻书音FM\",\n        \"type\": \"button\",\n        \"action\": \"sou40()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🎧喜马拉雅\",\n        \"type\": \"button\",\n        \"action\": \"sou47()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"↓   免   费   源   站   ↓\",\n        \"type\": \"button\",\n        \"action\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"🍅番茄小说\",\n        \"type\": \"button\",\n        \"action\": \"sou1()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🍅番茄听书[AI音色]\",\n        \"type\": \"button\",\n        \"action\": \"sou2()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🎧番茄畅听\",\n        \"type\": \"button\",\n        \"action\": \"sou3()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🍅番茄漫画\",\n        \"type\": \"button\",\n        \"action\": \"sou4()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🍅番茄短剧\",\n        \"type\": \"button\",\n        \"action\": \"sou5()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \t\"name\": \"🦉猫眼看书\",\n        \"type\": \"button\",\n        \"action\": \"sou21()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🐱七猫小说\",\n        \"type\": \"button\",\n        \"action\": \"sou6()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🐱七猫短剧\",\n        \"type\": \"button\",\n        \"action\": \"sou33()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"📆二三中文\",\n        \"type\": \"button\",\n        \"action\": \"sou7()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🍰淘小说\",\n        \"type\": \"button\",\n        \"action\": \"sou24()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🍒追书神器\",\n        \"type\": \"button\",\n        \"action\": \"sou19()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🍋得间小说\",\n        \"type\": \"button\",\n        \"action\": \"sou13()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🥨爱下电子书\",\n        \"type\": \"button\",\n        \"action\": \"sou16()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🌾小米阅读\",\n        \"type\": \"button\",\n        \"action\": \"sou20()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🍭米读小说\",\n        \"type\": \"button\",\n        \"action\": \"sou18()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🎊疯读小说\",\n        \"type\": \"button\",\n        \"action\": \"sou23()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"⚖️圣武书屋\",\n        \"type\": \"button\",\n        \"action\": \"sou22()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🍂知乎盐选\",\n        \"type\": \"button\",\n        \"action\": \"sou14()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🐾百度小说\",\n        \"type\": \"button\",\n        \"action\": \"sou36()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🌊酷我小说\",\n        \"type\": \"button\",\n        \"action\": \"sou37()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🐰思兔阅读\",\n        \"type\": \"button\",\n        \"action\": \"sou25()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🍥包子漫画\",\n        \"type\": \"button\",\n        \"action\": \"sou29()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🌝全面漫画\",\n        \"type\": \"button\",\n        \"action\": \"sou39()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n    \"name\": \"段评图标颜色\",\n    \"type\": \"text\"\n    },\n   {\n    \"name\": \"番茄登录Token\",\n    \"type\": \"text\"\n   }, \n  {\n    \"name\": \"晋江登录Token\",\n    \"type\": \"password\"\n   },\n   {\n    \"name\": \"🗑️清理缓存\",\n    \"type\": \"button\",\n    \"action\": \"cleanCache()\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.45\n    }\n   }, \n   {\n    \"name\": \"🔄 强制刷新\",\n    \"type\": \"button\",\n    \"action\": \"ChapterRefresh()\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.45\n    }\n   }, \n  {\n    \"name\": \"自定义气泡SVG\",\n    \"type\": \"text\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 1\n    }\n   },  \n  {\n    \"name\": \"神评文字颜色\",\n    \"type\": \"text\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.45\n    }\n}, {\n    \"name\": \"神评边框颜色\",\n    \"type\": \"text\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.45\n    }\n}, {\n    \"name\": \"下面设置仅在阅读Sigma生效\",\n    \"type\": \"button\",\n    \"action\": \"\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 1\n    }\n}, {\n    \"name\": \"📐段评高度%\",\n    \"type\": \"text\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 1\n    }\n}, {\n    \"name\": \"📐段评圆角，填0-50之间\",\n    \"type\": \"text\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 1\n    }\n}]", "loginUrl": "//请勿修改版本号\nconst localVersion = \"5.50\";\n\nvar sourceList = [\n    {n:\"sou0\",v:null,m:\"🔍聚合搜索\"},\n    {n:\"sou1\",v:\"番茄小说\",m:\"番茄小说\"},\n    {n:\"sou2\",v:\"番茄听书\",m:\"番茄听书\"},\n    {n:\"sou3\",v:\"番茄畅听\",m:\"番茄畅听\"},\n    {n:\"sou4\",v:\"番茄漫画\",m:\"番茄漫画\"},\n    {n:\"sou5\",v:\"番茄短剧\",m:\"番茄短剧\"},\n    {n:\"sou6\",v:\"七猫小说\",m:\"🐱七猫小说\"},\n    {n:\"sou7\",v:\"二三中文\",m:\"💫二三中文\"},\n    {n:\"sou8\",v:\"企鹅看书\",m:\"🐧企鹅看书\"},\n    {n:\"sou9\",v:\"书旗\",m:\"♟️书旗\"},\n    {n:\"sou10\",v:\"60看书\",m:\"60看书\"},\n    {n:\"sou11\",v:\"半夏\",m:\"半夏小说\"},\n    {n:\"sou12\",v:\"69书吧\",m:\"69书吧com\"},\n    {n:\"sou13\",v:\"得间\",m:\"得间\"},\n    {n:\"sou14\",v:\"知乎\",m:\"知乎盐选\"},\n    {n:\"sou15\",v:\"茶马\",m:\"茶马小说\"},\n    {n:\"sou16\",v:\"爱下电子书\",m:\"爱下电子书\"},\n    {n:\"sou17\",v:\"笔趣阁\",m:\"笔趣阁22\"},\n    {n:\"sou18\",v:\"米读\",m:\"米读\"},\n    {n:\"sou19\",v:\"追书神器\",m:\"追书神器\"},\n    {n:\"sou20\",v:\"小米阅读\",m:\"小米阅读\"},\n    {n:\"sou21\",v:\"猫眼看书\",m:\"猫眼看书\"},\n    {n:\"sou22\",v:\"圣武书屋\",g:\"girl\",m:\"圣武书屋\"},\n    {n:\"sou23\",v:\"疯读\",m:\"疯读小说\"},\n    {n:\"sou24\",v:\"淘小说\",m:\"淘小说\"},\n    {n:\"sou25\",v:\"思兔\",m:\"思兔阅读\"},\n    {n:\"sou26\",v:\"甜梦文库\",g:\"girl\",m:\"甜梦文库\"},\n    {n:\"sou27\",v:\"三七轻小说\",m:\"三七轻小说\"},\n    {n:\"sou28\",v:\"歪瑞古德\",m:\"歪瑞古德\"},\n    {n:\"sou29\",v:\"包子漫画\",m:\"包子漫画\"},\n    {n:\"sou30\",v:\"西瓜\",m:\"🍉西瓜小说\"},        \n    {n:\"sou31\",v:\"速读谷\",m:\"速读谷\"},\n    {n:\"sou32\",v:\"919\",m:\"919言情\"},\n    {n:\"sou33\",v:\"七猫短剧\",m:\"🐱七猫短剧\"},\n    {n:\"sou34\",v:\"69书吧co\",m:\"69书吧co\"},\n    {n:\"sou35\",v:\"笔下小说\",m:\"笔下小说\"},\n    {n:\"sou36\",v:\"百度\",m:\"百度小说\"},\n    {n:\"sou37\",v:\"酷我\",m:\"酷我小说\"},\n    {n:\"sou38\",v:\"笔趣阁78\",m:\"笔趣阁78\"},\n    {n:\"sou39\",v:\"全面漫画\",m:\"全面漫画\"},\n    {n:\"sou40\",v:\"书音\",m:\"书音FM\"},\n    {n:\"sou41\",v:\"云端\",m:\"云端书库\"},\n    {n:\"sou42\",v:\"全本\",m:\"全本小说\"},\n    {n:\"sou43\",v:\"红牛小说\",m:\"红牛小说\"},\n    {n:\"sou44\",v:\"3a中文\",m:\"3A中文\"},\n    {n:\"sou45\",v:\"萝卜\",m:\"萝卜小说\"},\n    {n:\"sou46\",v:\"精品\",m:\"精品文学\"},\n    {n:\"sou47\",v:\"喜马拉雅\",m:\"喜马拉雅\"},\n    {n:\"sou48\",v:\"万相书城\",m:\"万相书城\"},\n    {n:\"sou49\",v:\"得奇\",m:\"得奇小说\"},\n    {n:\"sou50\",v:\"台湾\",m:\"台湾小说\"},\n    {n:\"sou51\",v:\"QQ阅读\",m:\"🐧QQ阅读\"},\n    {n:\"sou52\",v:\"书耽网\",m:\"书耽网\"},\n    {n:\"sou53\",v:\"云图有声\",m:\"云图有声\"},\n    {n:\"sou54\",v:\"番薯小说\",m:\"番薯小说\"},\n    {n:\"sou55\",v:\"晋江\",m:\"晋江文学\"},\n    {n:\"type1\",v:\"小说\",m:\"小说模式\"},\n    {n:\"type2\",v:\"听书\",m:\"听书模式\"},\n    {n:\"type3\",v:\"漫画\",m:\"漫画模式\"},\n    {n:\"type4\",v:\"视频\",m:\"视频模式\"}\n];\n\nfunction login(flag) {\n    const host = getServerHost();\n    \n    if (flag == undefined) {\n        const loginInfo = source.getLoginInfoMap();\n        var email = loginInfo['邮箱'];\n        var password = loginInfo['密码'];\n    } else {\n        source.putLoginInfo(JSON.stringify(result));\n        var email = result['邮箱'];\n        var password = result['密码'];\n    }\n    \n    if (!email || !password) {\n        java.toast(\"\\n❌ 请先填写账号和密码并点击✓保存后登录\");\n        return;\n    }\n    \n    java.toast(\"正在登录...\");\n    const url = host + '/login';\n    const body = \"email=\" + encodeURIComponent(email) + \"&password=\" + encodeURIComponent(password);\n    \n    try {\n        const response = java.ajax(url + \",\" + JSON.stringify({\n            method: \"POST\",\n            body: body,\n            timeout: 10000\n        }));\n        \n        const data = JSON.parse(response);\n        \n        if (data.code == 200) {\n            const user = data.data.user;\n            const deviceInfo = data.data.device || {};\n            \n            source.putLoginHeader(user.api_key);\n            \n            const nickname = user.nickname || \"用户\";\n            const maskedEmail = email.includes('@') ? \n                email.substring(0, 3) + \"****\" + email.substring(email.indexOf('@')) : \n                email;\n            const memberStatus = (user.is_member || false) ? \"👑VIP会员\" : \"普通会员\";\n            const welcomeMsg = (user.is_member || false) ? \"欢迎回来，👑尊贵VIP会员\" : \"欢迎回来\";\n            \n            const onlineCount = deviceInfo.online_count || 0;\n            const deviceLimit = deviceInfo.device_limit || 1;\n            const totalCount = deviceInfo.total_count || 0;\n            \n            var deviceStatusText = \"\";\n            if (onlineCount >= deviceLimit && totalCount > 0) {\n                deviceStatusText = \"⚠️ 设备已满（\" + onlineCount + \"/\" + deviceLimit + \"）\\n新设备登录将挤掉旧设备\";\n            } else if (onlineCount > 0) {\n                deviceStatusText = \"📱 在线设备：\" + onlineCount + \"/\" + deviceLimit;\n            } else {\n                deviceStatusText = \"📱 当前无其他设备在线\";\n            }\n            \n            function maskDeviceId(deviceId) {\n                if (!deviceId || deviceId.length <= 8) return deviceId || '未知';\n                return deviceId.substring(0, 4) + \"****\" + deviceId.substring(deviceId.length - 4);\n            }\n            \n            function maskIp(ip) {\n                if (!ip) return '';\n                if (ip.indexOf('.') !== -1 && ip.indexOf(':') == -1) {\n                    var parts = ip.split('.');\n                    if (parts.length == 4) return parts[0] + '.' + parts[1] + '.*.*';\n                }\n                if (ip.indexOf(':') !== -1) {\n                    var parts = ip.split(':');\n                    var validParts = [];\n                    for (var i = 0; i < parts.length; i++) {\n                        if (parts[i] !== '') validParts.push(parts[i]);\n                    }\n                    if (validParts.length >= 4) return validParts.slice(0, 4).join(':') + ':*:*';\n                }\n                return ip;\n            }\n            \n            var deviceListText = \"\";\n            var deviceList = (deviceInfo && deviceInfo.list) ? deviceInfo.list : [];\n            if (deviceList && deviceList.length > 0) {\n                deviceListText = \"\\n── 设备列表 ──\";\n                for (var i = 0; i < deviceList.length; i++) {\n                    var dev = deviceList[i];\n                    var statusIcon = dev.is_online ? '🟢' : '⚫';\n                    var maskedId = maskDeviceId(dev.device_id);\n                    var maskedIp = maskIp(dev.ip_address);\n                    var ipText = maskedIp ? ' | ' + maskedIp : '';\n                    deviceListText += \"\\n\" + statusIcon + \" \" + maskedId + ipText;\n                }\n            }\n            \n            java.toast(\n                \"\\n───────────────\\n\" +\n                \"🌟 \" + welcomeMsg + \" 🌟\\n\" +\n                \"───────────────\\n\" +\n                \"昵称：\" + nickname + \"\\n\" +\n                \"邮箱：\" + maskedEmail + \"\\n\" +\n                \"状态：\" + memberStatus + \"\\n\" +\n                \"───────────────\\n\" +\n                deviceStatusText +\n                deviceListText + \"\\n\" +\n                \"───────────────\"\n            );\n        } else {\n            java.toast(\n                \"\\n───────────────\\n\" +\n                \"❌ 登录失败 ❌\\n\" +\n                \"───────────────\\n\" +\n                \"错误代码：\" + (data.code || \"未知\") + \"\\n\" +\n                \"错误信息：\" + (data.message || \"未知错误\") + \"\\n\" +\n                \"───────────────\"\n            );\n        }\n        \n    } catch (e) {\n        java.toast(\n            \"\\n───────────────\\n\" +\n            \"❌ 网络错误 ❌\\n\" +\n            \"───────────────\\n\" +\n            \"连接服务器失败\\n\" +\n            \"请检查网络连接\\n\" +\n            \"请切换服务器尝试\\n\" +\n            \"───────────────\"\n        );\n    }\n}\n\nfunction user_logout() {\n    let hadLogin = false;\n    \n    if (source.getLoginHeader() && String(source.getLoginHeader()).trim().length > 0) {\n        hadLogin = true;\n    }\n    \n    try {\n        var apiUrl = getServerHost() + '/api/logout';\n        var response = java.ajax(apiUrl + \",\" + JSON.stringify({\n            method: \"POST\",\n            headers: {\n                \"Content-Type\": \"application/json\"\n            },\n            timeout: 5000\n        }));\n    } catch (e) {}\n    \n    try {\n        cookie.removeCookie(getServerHost());\n    } catch (e) {}\n    \n    source.putLoginHeader(\"\");\n    \n    if (!source.getLoginHeader() || String(source.getLoginHeader()).trim().length == 0) {\n        java.toast(hadLogin ? \"\\n❗ 已成功退出登录\" : \"\\nℹ️ 当前未登录状态\");\n    }\n}\n\nfunction hasValidCustomSource() {\n    const value = (source.getLoginInfoMap())['自定义源站'];\n    return !(value == null || value == undefined || value == \"\" || String(value).trim() == \"\");\n}\n\nfunction showCustomSourceAlert() {\n    const customSource = (source.getLoginInfoMap())['自定义源站'];\n    java.toast(\n        \"\\n⚠️ 自定义源站配置提醒 ⚠️\\n\" +\n        \"──────────────────\\n\" +\n        \"检测到已设置自定义源站: \\n✨\" +\n        \"【\" + (customSource || \"\") + \"】✨\\n\" +\n        \"──────────────────\\n\" +\n        \"请前往「书源登录」清除配置\\n\" +\n        \"才能使指定源站切换生效\"\n    );\n}\n\nfunction updateConfig(key, value, message, gender) {\n    if (key == \"source\" && hasValidCustomSource()) {\n        showCustomSourceAlert();\n        return;\n    }\n    \n    if (gender !== undefined) {\n        setConfigs.call(this, {[key]: value, gender: gender});\n    } else {\n        setConfig.call(this, key, value);\n    }\n    java.toast(message || \"设置已更新\");\n}\n\nfunction get_user() {\n    try {\n        var apiKey = getSecretKey();\n        if (!apiKey) {\n            java.toast(\"❌ 未获取到密钥，请先登录\");\n            return;\n        }\n\n        var timestamp = Math.floor(Date.now() / 1000);\n        var apiUrl = getServerHost() + '/login';\n        \n        var postData = {\n            key: apiKey,\n            timestamp: timestamp\n        };\n        \n        var response = java.ajax(apiUrl + \",\" + JSON.stringify({\n            method: \"POST\",\n            body: JSON.stringify(postData),\n            headers: {\n                \"Content-Type\": \"application/json\"\n            },\n            timeout: 10000\n        }));\n        \n        var data = JSON.parse(response);\n        \n        if (data.data.user) {\n            var userInfo = data.data.user;\n            var deviceInfo = data.data.device || {};\n            \n            var statusDisplay = \"\";\n            switch(userInfo.status) {\n                case \"正常\":\n                    statusDisplay = \"✅ 正常\";\n                    break;\n                case \"会员\":\n                    statusDisplay = \"👑VIP会员\";\n                    break;\n                case \"封禁\":\n                    statusDisplay = \"🚫 封禁\";\n                    break;\n                default:\n                    statusDisplay = userInfo.status || \"正常\";\n            }\n            \n            var email = userInfo.email || \"未绑定\";\n            var maskedEmail = \"未绑定\";\n            if (email !== \"未绑定\" && email.includes(\"@\")) {\n                var parts = email.split(\"@\");\n                var username = parts[0];\n                var domain = parts[1];\n                if (username.length > 2) {\n                    maskedEmail = username.substring(0, 2) + \"****@\" + domain;\n                } else {\n                    maskedEmail = username + \"****@\" + domain;\n                }\n            }\n            \n            var nickname = userInfo.nickname || \"未设置\";\n            if (nickname == \"未设置\") {\n                nickname = \"👤 \" + nickname;\n            } else {\n                nickname = \"👤 \" + nickname;\n            }\n            \n            // 设备信息处理\n            var onlineCount = deviceInfo.online_count || 0;\n            var deviceLimit = deviceInfo.device_limit || 1;\n            var totalCount = deviceInfo.total_count || 0;\n            \n            var deviceStatusText = \"\";\n            if (onlineCount >= deviceLimit && totalCount > 0) {\n                deviceStatusText = \"⚠️ 设备已满（\" + onlineCount + \"/\" + deviceLimit + \"）\";\n            } else if (onlineCount > 0) {\n                deviceStatusText = \"📱 在线设备：\" + onlineCount + \"/\" + deviceLimit;\n            } else {\n                deviceStatusText = \"📱 当前无设备在线\";\n            }\n            \n            function maskDeviceId(deviceId) {\n                if (!deviceId || deviceId.length <= 8) return deviceId || '未知';\n                return deviceId.substring(0, 4) + \"****\" + deviceId.substring(deviceId.length - 4);\n            }\n            \n            function maskIp(ip) {\n                if (!ip) return '';\n                if (ip.indexOf('.') !== -1 && ip.indexOf(':') == -1) {\n                    var parts = ip.split('.');\n                    if (parts.length == 4) return parts[0] + '.' + parts[1] + '.*.*';\n                }\n                if (ip.indexOf(':') !== -1) {\n                    var parts = ip.split(':');\n                    var validParts = [];\n                    for (var i = 0; i < parts.length; i++) {\n                        if (parts[i] !== '') validParts.push(parts[i]);\n                    }\n                    if (validParts.length >= 4) return validParts.slice(0, 4).join(':') + ':*:*';\n                }\n                return ip;\n            }\n            \n            function formatTime(timeStr) {\n                if (!timeStr || timeStr == \"从未使用\") return \"未知\";\n                return timeStr;\n            }\n            \n            var deviceListText = \"\";\n            var deviceList = (deviceInfo && deviceInfo.list) ? deviceInfo.list : [];\n            if (deviceList && deviceList.length > 0) {\n                deviceListText = \"\\n── 设备列表 ──\";\n                for (var i = 0; i < deviceList.length; i++) {\n                    var dev = deviceList[i];\n                    var statusIcon = dev.is_online ? '🟢' : '⚫';\n                    var maskedId = maskDeviceId(dev.device_id);\n                    var maskedIp = maskIp(dev.ip_address);\n                    var deviceName = dev.device_name || '未知设备';\n                    var trustedIcon = dev.is_trusted ? ' 🔒' : '';\n                    var lastSeen = dev.last_seen || '未知';\n                    \n                    deviceListText += \"\\n\" + statusIcon + \" \" + maskedId + trustedIcon;\n                    deviceListText += \"\\n   📱 \" + deviceName + \" | \" + (maskedIp || '未知IP');\n                    deviceListText += \"\\n   ⏰ \" + lastSeen;\n                    if (i < deviceList.length - 1) {\n                        deviceListText += \"\\n\";\n                    }\n                }\n            } else {\n                deviceListText = \"\\n── 设备列表 ──\\n暂无设备记录\";\n            }\n            \n            var displayContent = \n                \"\\n────────────\\n\" +\n                \"📊 用 户 信 息 📊\\n\" +\n                \"────────────\\n\" +\n                nickname + \"\\n\" +\n                \"────────────\\n\" +\n                \"📧 绑定邮箱\\n\" + maskedEmail + \"\\n\" +\n                \"────────────\\n\" +\n                \"📊 累计阅读\\n\" + (userInfo.total_usage || 0) + \" 次\\n\" +\n                \"────────────\\n\" +\n                \"📈 今日阅读\\n\" + (userInfo.today_usage || 0) + \" 次\\n\" +\n                \"────────────\\n\" +\n                \"🔄 账户状态\\n\" + statusDisplay + \"\\n\" +\n                \"────────────\\n\" +\n                \"📅 注册时间\\n\" + (userInfo.created_at || \"未知\") + \"\\n\" +\n                \"────────────\\n\" +\n                \"🖥️ 设备管理\\n\" +\n                \"总数：\" + totalCount + \" | \" + deviceStatusText + \"\\n\" +\n                (deviceInfo.current_device_online ? \"🟢 当前设备在线\\n\" : \"\") +\n                (deviceInfo.is_kicked ? \"⚠️ 设备已被踢出：\" + deviceInfo.kicked_reason + \"\\n\" : \"\") +\n                deviceListText + \"\\n\";\n            \n            if (userInfo.is_banned) {\n                displayContent += \"────────────\\n\" +\n                                \"🚫 封禁信息\\n\" + (userInfo.banned_info || \"已封禁\") + \"\\n\";\n            }\n            \n            if (userInfo.last_used && userInfo.last_used !== \"从未使用\") {\n                displayContent += \"────────────\\n\" +\n                                \"⏰ 最后使用\\n\" + userInfo.last_used + \"\\n\";\n            }\n            \n            if (userInfo.is_member) {\n                displayContent += \"────────────\\n\" +\n                                \"💎 会员状态\\n👑 尊贵VIP会员\\n\";\n            }\n            \n            displayContent += \"────────────\\n\" +\n                            \"✨ 查询完成\";\n            \n            java.longToast(displayContent);\n            \n        } else {\n            var errorMsg = data.message || \"未知错误\";\n            java.longToast(\"❌ 查询失败：\" + errorMsg);\n        }\n        \n    } catch (e) {\n        java.longToast(\"❌ 网络连接异常，请稍后重试\");\n    }\n}\n\nfunction get_cx() {\n    try {\n        var currentConfig = getConfig.call(this);\n        var currentHost = currentConfig.host || hosts[0];\n        var currentSource = (!currentConfig.source || currentConfig.source == null) ? \n            \"☁️ 聚合搜索 ☁️\" : \n            (sourceList.find(item => item.v == currentConfig.source)?.m || currentConfig.source);\n        \n        var currentGender = currentConfig.gender == \"boy\" ? \" 男🧸频 \" : \n            (currentConfig.gender == \"girl\" ? \" 女🎀频 \" : \" 未设置 \");\n        \n        var currentTone = currentConfig.sz ? \"音色\" + data[parseInt(currentConfig.sz) || 1][0] : \"默认音色\";\n        \n        var customSource = (source.getLoginInfoMap())['自定义源站'] || \"未设置\"; \n        var customSourceStatus = hasValidCustomSource() ? \"🔗 \" + customSource : \"当前未设置，示例：米读,书旗\";\n        \n        var username = \"未登录\";\n        try {\n            var cookie_ = String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) || \n                         (source.getLoginInfoMap())['番茄登录Token'];\n            if (cookie_) {\n                var userInfo = JSON.parse(java.ajax(\"https://fanqienovel.com/api/user/info/v2,\" + JSON.stringify({\n                    method: \"GET\", \n                    headers: { \"Cookie\": \"sessionid=\" + cookie_ },\n                    timeout: 5000\n                })));\n                username = userInfo.data?.name || \"已登录(未获取到用户名)\";\n            }\n        } catch (e) {\n            username = \"登录状态检查失败\";\n        }\n\n        var message = \n            \"\\n───────────────\\n\" +\n            \"☑️  配  置  状  态 ☑️\\n\" +\n            \"───────────────\\n\" +\n            \"🔘 服  务  器 🔘\\n\" + currentHost + \"\\n\" +\n            \"───────────────\\n\" +\n            \"🌋 书  源 🌋\\n\" + currentSource + \"\\n\" +\n            \"───────────────\\n\" +\n            \"🏔️ 偏  好 🏔️\\n\" + currentGender + \"\\n\" +\n            \"───────────────\\n\" +\n            \"🎧 AI 音 色 🎧\\n\" + currentTone + \"\\n\" +\n            \"───────────────\\n\" +\n            \"❇️ 自 定 义 源 ❇️\\n\" + customSourceStatus + \"\\n\" +\n            \"───────────────\\n\" +\n            \"🍅 番 茄 账 号 🍅\\n\" + username + \"\\n\" +\n            \"───────────────\\n\" +\n            \"\\n✨ 提示：点击按钮切换配置\";\n            \n        java.longToast(message);\n    } catch(e) {\n        setConfig.call(this, 'host', getHosts[0]);\n        java.toast(\"⚠️ 配置初始化完成，请重试\");\n    }\n}\n\nthis.sethost = function() {\n    try {\n        var currentHost = getConfig.call(this).host || getHosts()[0];\n        var currentIndex = getHosts().indexOf(currentHost);\n        var newIndex = (currentIndex + 1) % getHosts().length;\n        var newHost = getHosts()[newIndex];\n        setConfig.call(this, 'host', newHost);\n        java.toast(\"\\n切换到：\\n\" + newHost + \"\");\n    } catch(e) {\n        setConfig.call(this, 'host', getHosts()[0]);\n        java.toast(\"\\n已初始化：\" + getHosts()[0]);\n    }\n};\n\nfor (var i = 0; i < sourceList.length; i++) {\n    (function() {\n        var s = sourceList[i];\n        this[s.n] = function() {\n            if (hasValidCustomSource()) {\n                showCustomSourceAlert();\n                return;\n            } if (s.g) {\n                updateConfig(\"source\", s.v, \"\\n已切换\" + (s.v ? '到❇️' : '') + s.m +\"❇️\\n刷新发现页生效\", s.g);\n            } else {\n                updateConfig(\"source\", s.v, \"\\n已切换\" + (s.v ? '到❇️' : '') + s.m +\"❇️\\n刷新发现页生效\");\n            }\n        };\n    }).call(this);\n}\n\nfunction Map(e) {\n    if (e == \"source\" && hasValidCustomSource()) {\n        showCustomSourceAlert();\n        return (source.getLoginInfoMap())['自定义源站'];\n    }\n    var infomap = source.getLoginInfoMap();\n    const value = infomap[e];\n    if (!value) {\n        java.longToast(\"请先登录❗\");\n    }\n    return value;\n}\n\nfunction checkCurrentServer() {\n    try {\n        var currentHost = getServerHost() +'/detection';\n        java.longToast(`\\n\\n♻️正在检测当前服务器：${currentHost}\\n请稍等~`);\n        let date1 = new Date().getTime();\n        let html = java.ajax(currentHost);\n        let date2 = new Date().getTime();\n        let t = date2 - date1;\n        let c = String(html).indexOf('书山聚合');\n        let time = t / 1000 + 's';\n        let logTime = '【' + currentHost + '】\\n┋┋\\n' + '解析时间：' + time;\n        \n        if (c == -1 || t > 5000) {\n            java.longToast('\\n💔【访问失败提示】\\n' + '┏┅━┅━┅━┅━┅┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♣️当前接口无法访问(可能被墙)♣️\\n┋┋\\n请切换其他接口/切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅┅━┅━┅┛');\n        } else if (t < 1000) {\n            java.longToast('\\n💖【网络环境优良】\\n' + '┏┅━┅━┅━┅━┅┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n❤️延迟低，推荐使用此接口❤️\\n┋┋\\n网络环境优良，请继续保持状态\\n┋┋' + '\\n┗┅━┅━┅━┅━┅┅━┅━┅┛');\n        } else if (t >= 1000 && t < 2000) {\n            java.longToast('\\n💛【网络环境一般】\\n' + '┏┅━┅━┅━┅━┅┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♦️延迟一般，勉强可使用♦️\\n┋┋\\n请切换其他接口或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅┅━┅━┅┛');\n        } else if (t >= 2000 && t < 5000) {\n            java.longToast('\\n💔【网络环境堪忧】\\n' + '┏┅━┅━┅━┅━┅┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♠延迟过高，不建议使用♠\\n┋┋\\n请切换其他接口或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅┅━┅━┅┛');\n        }\n    } catch(e) {\n        java.longToast('\\n❌【服务器检测失败】\\n' + '┏┅━┅━┅━┅━┅┅━┅━┅┓\\n┋┋\\n检测过程中发生错误\\n┋┋\\n请检查网络连接或服务器状态\\n┋┋' + '\\n┗┅━┅━┅━┅━┅┅━┅━┅┛');\n    }\n}\n\nfunction fq_login() {\n    try { \tjava.startBrowserAwait(\"https://fanqienovel.com/main/writer/login\", \"登录\");\n    } catch (e) {\n        java.toast(e);\n    }\n    try {\n        cookie.removeCookie(\"snssdk.com\");\n    } catch (e) {}\n    \n    let cookieHeader = String(cookie.getCookie('fanqienovel.com'));\n    \n    const match = cookieHeader.match(/sessionid=([^;]+)/);\n    java.toast(match);\n    let sessionId = match ? match[1] : null;\n\n    let cookieString = sessionId ? \"sessionid=\" + sessionId : source.getLoginInfoMap()['番茄登录Token'] || \"\";\n    java.toast(cookieString);\n    let user;\n    try {\n        user = JSON.parse(java.ajax(\"https://fanqienovel.com/api/user/info/v2,\" + JSON.stringify({\n            method: \"GET\",\n            headers: { \"Cookie\": cookieString }\n        }))).data.name;\n    } catch (e) { \n        java.log(e); \n    }\n    \n    if (!cookieString || cookieString == \"sessionid=\" || !user) {\n        java.toast(\"未获取到登录凭据，登录失败\");\n        return false;\n    }\n    \n    java.toast(\"\\n\\n欢迎 \" + user + \"\\n登录成功！\");\n    return true;\n}\n\nfunction logout() {\n    cookie.removeCookie(\"fanqienovel.com\");\n    cookie.removeCookie(\"snssdk.com\");\n    const manualToken = (source.getLoginInfoMap())['番茄登录Token'];\n    \n    const hasValidToken = manualToken && String(manualToken).trim().length > 0;\n    \n    if (hasValidToken) {\n        java.toast(\"请手动移除填写的Token\");\n    } else {\n        java.toast(\"退出登录成功\");\n    }\n}\n\nfunction imagestyle() {\n    let style = cache.get(\"imgstyle\") ?? \"TEXT\";\n    if (style == \"TEXT\") {\n        cache.put(\"imgstyle\", \"text\");\n        java.toast(\"\\n🥽段评气泡-小号样式\");\n    } else if (style == \"text\") {\n        cache.put(\"imgstyle\", \"TEXT\");\n        java.toast(\"\\n🥽段评气泡-大号样式\");\n    }\n}\n\nfunction toggleParacomment() {\n    const key = \"yunpara\";\n    let status = java.get(key) ?? \"off\";\n    if (status == \"on\") {\n        java.put(key, \"off\");\n        java.toast(\"\\n🍅番茄，🌙晋江，🐱七猫，💮半夏，🐧QQ阅读，🐧企鹅看书，💫起点\\n❌段评已关闭\");\n    } else {\n        java.put(key, \"on\");\n        java.toast(\"\\n🍅番茄，🌙晋江，🐱七猫，💮半夏，🐧QQ阅读，🐧企鹅看书，💫起点\\n✅段评已开启，需要下载缓存时请关闭\");\n    }\n}\n\nfunction ChapterRefresh() {\n    const key = \"chapter_refresh_force\";\n    let status = java.get(key) ?? \"off\";\n    \n    if (status == \"on\") {\n        java.put(key, \"off\");\n        java.toast(\"\\n☁️ 已切换为正常阅读\");\n    } else {\n        java.put(key, \"on\");\n        java.toast(\"\\n🔄 绕过缓存强制刷新(建议只在某点和某江缺字时启用)\");\n    }\n}\n\nfunction toggleBookSync() {\n    let status = java.get(\"book_sync\") ?? \"off\";\n    if (status == \"off\") {\n        java.put(\"book_sync\", \"on\");\n        java.toast(\"\\n🍅番茄小说\\n✅已开启 - 将自动同步阅读记录\");\n    } else {\n        java.put(\"book_sync\", \"off\");\n        java.toast(\"\\n🍅番茄小说\\n❌已关闭 - 停止同步阅读记录\");\n    }\n}\n\nfunction toggleFqdown(a) {\n    let status = java.get(a) ?? \"off\";\n    if (status == \"off\") {\n        java.put(a, \"on\");\n        java.toast(\"\\n🍅番茄小说\\nTXT下载功能已开启，在线阅读或换源需要关闭该功能\");\n    } else {\n        java.put(a, \"off\");\n        java.toast(\"\\n🍅番茄小说\\nTXT全本下载功能已关闭\");\n    }\n}\n\nfunction cleanCache() {\n    try {\n        var cleanUrl = getServerHost() + '/cron/cache';\n        \n        java.toast(\"正在清理缓存...\");\n        \n        var response = java.ajax(cleanUrl + \",\" + JSON.stringify({\n            method: \"GET\",\n            timeout: 5000\n        }));\n        \n        var result = JSON.parse(response);\n        \n        if (result.isSuccess) {\n            java.toast(\"✅ 缓存清理成功\");\n        } else {\n            java.toast(\"❌ 清理失败：\" + (result.errorMsg || \"未知错误\"));\n        }\n        \n    } catch (e) {\n        java.toast(\"❌ 清理失败：\" + e);\n    }\n}\n\nfunction SortFilter() {\n    try {\n        var savedParams = java.get(\"sortkey\");\n        savedParams = savedParams ? savedParams : \"\";\n        \n        if (savedParams.startsWith('\">')) {\n            savedParams = savedParams.substring(2);\n        } else if (savedParams.startsWith('>')) {\n            savedParams = savedParams.substring(1);\n        }\n        \n        let html = `<!DOCTYPE html><html><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\"><title>🍅标签排序筛选</title><style>\n            *{margin:0;padding:0;box-sizing:border-box}\n            body{font-family:'PingFang SC','Microsoft YaHei',sans-serif;background:#f8f9fa;color:#333;max-width:700px;margin:0 auto;padding:16px}\n            .container{background:white;border-radius:16px;box-shadow:0 4px 20px rgba(0,0,0,0.08);padding:24px}\n            .header{margin-bottom:24px;text-align:center}\n            h1{color:#ff6b35;font-size:24px;font-weight:600;margin-bottom:8px}\n            .subtitle{color:#666;font-size:14px;margin-bottom:16px}\n            .current-section{background:#f0f7ff;border-radius:12px;padding:16px;margin-bottom:24px;border:1px solid #e3f2fd;position:relative}\n            .current-label{color:#1976d2;font-size:14px;font-weight:500;margin-bottom:8px}\n            .current-value{color:#2c3e50;font-size:16px;font-weight:500;min-height:24px;word-break:break-all}\n            .section{margin-bottom:28px}\n            .section-title{display:flex;align-items:center;margin-bottom:16px;font-size:16px;font-weight:600;color:#2c3e50}\n            .section-icon{margin-right:8px;font-size:18px}\n            .tip{font-size:12px;color:#ff6b35;margin-left:8px;background:#fff0e6;padding:2px 8px;border-radius:4px}\n            .buttons-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(100px,1fr));gap:10px}\n            .filter-btn{padding:10px 0;font-size:14px;border:1px solid #e0e0e0;border-radius:8px;background:white;color:#555;cursor:pointer;transition:all 0.2s;font-weight:500;text-align:center}\n            .filter-btn:hover{transform:translateY(-2px);box-shadow:0 4px 8px rgba(0,0,0,0.1)}\n            .filter-btn.selected{background:#ff6b35;color:white;border-color:#ff6b35;box-shadow:0 2px 8px rgba(255,107,53,0.3)}\n            .filter-btn.selected:hover{background:#ff5a22;box-shadow:0 4px 12px rgba(255,107,53,0.4)}\n            .action-hint{text-align:center;color:#666;font-size:13px;margin-top:32px;padding:12px;background:#f8f9fa;border-radius:8px;border:1px dashed #ddd}\n            .action-hint strong{color:#ff6b35}\n            .clear-btn{width:100%;background:#f8f9fa;color:#666;border:1px solid #ddd;border-radius:8px;padding:12px;font-size:14px;cursor:pointer;transition:all 0.2s;margin-top:32px}\n            .clear-btn:hover{background:#ffefeb;color:#ff6b35;border-color:#ff6b35}\n            @media (max-width:480px){.buttons-grid{grid-template-columns:repeat(3,1fr)}}\n        </style></head><body><div class=\"container\">\n            <div class=\"header\">\n                <h1>🍅 标签排序筛选</h1>\n                <div class=\"subtitle\">选择筛选条件，右上角\"✓\"确认生效</div>\n            </div>\n            \n            <div class=\"current-section\">\n                <div class=\"current-label\">当前选择：</div>\n                <div id=\"result-output\">${savedParams ? savedParams : \"未选择\"}</div>\n            </div>\n            \n            <div class=\"section\">\n                <div class=\"section-title\">\n                    <span class=\"section-icon\">📏</span> 字数参数 <span class=\"tip\">单选</span>\n                </div>\n                <div class=\"buttons-grid\" id=\"length-btns\"></div>\n            </div>\n            \n            <div class=\"section\">\n                <div class=\"section-title\">\n                    <span class=\"section-icon\">📈</span> 状态参数 <span class=\"tip\">单选</span>\n                </div>\n                <div class=\"buttons-grid\" id=\"status-btns\"></div>\n            </div>\n            \n            <div class=\"section\">\n                <div class=\"section-title\">\n                    <span class=\"section-icon\">🔝</span> 排序参数 <span class=\"tip\">单选</span>\n                </div>\n                <div class=\"buttons-grid\" id=\"sort-btns\"></div>\n            </div>\n            \n            <button onclick=\"clearAll()\" class=\"clear-btn\">\n                🗑️ 清除所有选择\n            </button>\n            \n            <div class=\"action-hint\">\n                提示：选择完成后点击右上角 <strong>✓</strong> 按钮确认设置\n            </div>\n        </div><script>\nvar currentParams = document.getElementById('result-output').textContent.trim();\nvar selectedItems = [];\n\nif (currentParams && currentParams !== \"未选择\" && currentParams !== \"undefined\") {\n    selectedItems = currentParams.split(\", \");\n}\n\nvar config={\nlengths:[\"10万以下\",\"30万以下\",\"50万以下\",\"30万以上\",\"50万以上\",\"100万以上\",\"200万以上\",\"300万以上\",\"500万以上\"],\nstatuses:[\"完结\",\"连载\",\"半年完结\",\"3天更新\",\"7天更新\",\"1月更新\"],\nsorts:[\"热门\",\"新书\",\"评分\",\"字数\"]\n};\nvar categorySelection={\nlength:null,\nstatus:null,\nsort:null\n};\nfunction initCategorySelection(){\nif(selectedItems.length>0){\nfor(var i=0;i<selectedItems.length;i++){\nvar item=selectedItems[i];\nif(config.lengths.includes(item)){\ncategorySelection.length=item;\n}else if(config.statuses.includes(item)){\ncategorySelection.status=item;\n}else if(config.sorts.includes(item)){\ncategorySelection.sort=item;\n}}}}\ninitCategorySelection();\nfunction initButtons(containerId,items,category){\nvar container=document.getElementById(containerId);\nvar buttonsHTML='';\nfor(var i=0;i<items.length;i++){\nvar name=items[i];\nvar isSelected=categorySelection[category]==name;\nbuttonsHTML+='<button onclick=\"toggleSelection(\\\\''+name+'\\\\',\\\\''+category+'\\\\')\" class=\"filter-btn'+(isSelected?' selected':'')+'\">'+name+'</button>';\n}\ncontainer.innerHTML=buttonsHTML;\n}\nfunction toggleSelection(name,category){\nif(categorySelection[category]==name){\ncategorySelection[category]=null;\n}else{\ncategorySelection[category]=name;\n}\nupdateButtonStates();\nupdateOutput();\n}\nfunction updateButtonStates(){\nfor(var category in categorySelection){\nvar containerId=category+'-btns';\nvar container=document.getElementById(containerId);\nif(container){\nvar buttons=container.getElementsByTagName('button');\nfor(var i=0;i<buttons.length;i++){\nvar btn=buttons[i];\nvar btnName=btn.textContent;\nbtn.className='filter-btn'+(categorySelection[category]==btnName?' selected':'');\n}}}}\nfunction updateOutput(){\nvar allSelected=[];\nfor(var category in categorySelection){\nif(categorySelection[category]){\nallSelected.push(categorySelection[category]);}}\nvar resultText=allSelected.length>0?allSelected.join(\", \"):\"未选择\";\ndocument.getElementById('result-output').textContent=resultText;\n}\nfunction clearAll(){\ncategorySelection={length:null,status:null,sort:null};\nupdateButtonStates();\nupdateOutput();\n}\ninitButtons('length-btns',config.lengths,'length');\ninitButtons('status-btns',config.statuses,'status');\ninitButtons('sort-btns',config.sorts,'sort');\nupdateOutput();\n</script></body></html>`;\n        \n        let base64 = `data:text/html;base64,${java.base64Encode(html)}`;\n        let body = java.startBrowserAwait(base64,\"书籍筛选\",false).body();\n        \n        let resultDivStart = body.indexOf('<div id=\"result-output\">');\n        let selectedItems = \"\";\n        \n        if (resultDivStart > -1) {\n            let contentStart = body.indexOf('>', resultDivStart);\n            if (contentStart > -1) {\n                contentStart += 1;\n                let contentEnd = body.indexOf('</div>', contentStart);\n                if (contentEnd > contentStart) {\n                    selectedItems = body.substring(contentStart, contentEnd).trim();\n                    \n                    if (selectedItems == \"未选择\") {\n                        selectedItems = \"\";\n                    } else {\n                        if (selectedItems.startsWith('\">')) {\n                            selectedItems = selectedItems.substring(2);\n                        } else if (selectedItems.startsWith('>')) {\n                            selectedItems = selectedItems.substring(1);\n                        }\n                    }\n                }\n            }\n        }\n        \n        java.put(\"sortkey\", selectedItems);\n        \n        if (selectedItems == \"\") {\n            java.toast(\"已清除所有筛选条件\");\n        } else {\n            java.toast(\"设置成功，该设置仅🍅番茄小说发现页生效\");\n        }\n        \n    } catch(e) {\n        java.log(e);\n    }\n}\n\nfunction TTSSelector() {\n    try {\n        var config = getConfig.call(this);\n        var currentFanqieTone = config.fanqie_tts_tone || \"\";\n        var currentShuqiTone = config.shuqi_tts_tone || \"\";\n        var activeTab = config.tts_active_tab || \"fanqie\";\n        \n        var fanqieTones = [\n            { id: \"80\", name: \"多人对话/升级\" },\n            { id: \"1\", name: \"甜美少女\" },\n            { id: \"2\", name: \"清亮青叔\" },\n            { id: \"74\", name: \"成熟大叔/升级\" },\n            { id: \"5\", name: \"开朗青年\" },\n            { id: \"6\", name: \"温柔淑女\" },\n            { id: \"8\", name: \"风雅青叔\" },\n            { id: \"12\", name: \"清纯少女\" },\n            { id: \"17\", name: \"磁性青叔\" },\n            { id: \"29\", name: \"儒雅大叔\" },\n            { id: \"30\", name: \"优雅御姐\" },\n            { id: \"31\", name: \"斯文青叔\" },\n            { id: \"32\", name: \"知性主播\" },\n            { id: \"100\", name: \"俏皮御姐\" },\n            { id: \"103\", name: \"双音灵动\" }\n        ];\n        \n        var shuqiTones = [\n            { id: \"multi_role\", name: \"多角色对话\" },\n            { id: \"double_role\", name: \"双角色对话\" },\n            { id: \"yifei\", name: \"甜美少女\" },\n            { id: \"mingge\", name: \"成熟男人\" },\n            { id: \"xiaohou\", name: \"阳光青年\" },\n            { id: \"qianxue\", name: \"知性主播\" },\n            { id: \"SQ_M03_PB_1218_01\", name: \"沉稳男士\" },\n            { id: \"F1029_PB_1128\", name: \"温婉淑女\" },\n            { id: \"zh-CN-YunxiNeural\", name: \"讲书博主小帅\" },\n            { id: \"zh-CN-XiaochenNeural\", name: \"讲书博主小美\" },\n            { id: \"SQ_iVc8TnhZXioTB52v\", name: \"清朗学长\" },\n            { id: \"SQ_5Oh4F5zWa8EZbWvr\", name: \"清冷校花\" },\n            { id: \"zh_male_quarkttsV1_novel_King196\", name: \"沉稳青叔\" }\n        ];\n        \n        function getToneName(id, source) {\n            var list = source == 'fanqie' ? fanqieTones : shuqiTones;\n            for (var i = 0; i < list.length; i++) {\n                if (list[i].id == id) {\n                    return list[i].name;\n                }\n            }\n            return id || \"未选择\";\n        }\n        \n        var fanqieDisplay = currentFanqieTone ? getToneName(currentFanqieTone, 'fanqie') : \"未选择\";\n        var shuqiDisplay = currentShuqiTone ? getToneName(currentShuqiTone, 'shuqi') : \"未选择\";\n        \n        var fanqieHtml = '';\n        for (var i = 0; i < fanqieTones.length; i++) {\n            var tone = fanqieTones[i];\n            var isSelected = (currentFanqieTone == tone.id);\n            fanqieHtml += '<button onclick=\"selectTone(\\'' + tone.id + '\\',\\'fanqie\\')\" data-id=\"' + tone.id + '\" class=\"tone-btn' + (isSelected ? ' selected' : '') + '\"><span class=\"tone-name\">' + tone.name + '</span></button>';\n        }\n        \n        var shuqiHtml = '';\n        for (var i = 0; i < shuqiTones.length; i++) {\n            var tone = shuqiTones[i];\n            var isSelected = (currentShuqiTone == tone.id);\n            shuqiHtml += '<button onclick=\"selectTone(\\'' + tone.id + '\\',\\'shuqi\\')\" data-id=\"' + tone.id + '\" class=\"tone-btn' + (isSelected ? ' selected' : '') + '\"><span class=\"tone-name\">' + tone.name + '</span></button>';\n        }\n        \n        var html = `<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\">\n<title>🎧 TTS音色选择</title>\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css\">\n<style>\n*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:-apple-system,'PingFang SC','Microsoft YaHei',sans-serif;background:#f0f2f5;color:#333;padding:12px;max-width:720px;margin:0 auto}\n.container{background:#fff;border-radius:16px;box-shadow:0 4px 24px rgba(0,0,0,0.06);overflow:hidden}\n.header{background:linear-gradient(135deg,#ff6b35,#f7931e);padding:20px 24px;color:#fff}\n.header h1{font-size:22px;font-weight:700;display:flex;align-items:center;gap:10px}\n.header h1 i{font-size:24px}\n.header p{font-size:13px;opacity:0.9;margin-top:4px}\n.current-section{background:#f8f9fa;margin:16px 16px 0;padding:12px 16px;border-radius:10px;border:1px solid #e9ecef}\n.current-label{font-size:13px;color:#868e96;font-weight:500;margin-bottom:4px}\n.current-value{font-size:16px;font-weight:600;color:#212529;display:flex;justify-content:space-between;align-items:center}\n.current-value .source-tag{font-size:12px;font-weight:400;color:#868e96}\n.tabs{display:flex;border-bottom:2px solid #e9ecef;padding:0 16px;margin-top:12px;gap:0}\n.tab-btn{padding:12px 20px;border:none;background:transparent;font-size:14px;font-weight:600;color:#868e96;cursor:pointer;border-bottom:3px solid transparent;transition:all 0.2s;display:flex;align-items:center;gap:8px}\n.tab-btn i{font-size:16px}\n.tab-btn.active{color:#ff6b35;border-bottom-color:#ff6b35}\n.tab-btn:hover{color:#ff6b35}\n.tab-panel{display:none;padding:16px}\n.tab-panel.active{display:block}\n.tab-panel .panel-title{font-size:13px;color:#868e96;margin-bottom:12px;padding-left:4px}\n.tone-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}\n.tone-btn{padding:12px 8px;border:2px solid #e9ecef;border-radius:12px;background:#fff;cursor:pointer;transition:all 0.2s;text-align:center;font-size:13px;font-weight:500;color:#495057}\n.tone-btn:hover{border-color:#ff6b35;transform:translateY(-2px);box-shadow:0 4px 12px rgba(255,107,53,0.15)}\n.tone-btn.selected{background:#ff6b35;border-color:#ff6b35;color:#fff;box-shadow:0 4px 12px rgba(255,107,53,0.25)}\n.clear-area{padding:0 16px 16px}\n.clear-btn{width:100%;padding:12px;border:2px dashed #dee2e6;border-radius:12px;background:transparent;font-size:14px;color:#868e96;cursor:pointer;transition:all 0.2s;display:flex;align-items:center;justify-content:center;gap:8px}\n.clear-btn:hover{border-color:#ff6b35;color:#ff6b35;background:#fff5f0}\n.action-hint{text-align:center;font-size:12px;color:#adb5bd;padding:12px 16px 16px;border-top:1px solid #f1f3f5}\n.action-hint i{color:#ff6b35}\n@media (max-width:480px){.tone-grid{grid-template-columns:repeat(3,1fr)}.tab-btn{padding:10px 14px;font-size:13px}}\n</style>\n</head>\n<body>\n<div class=\"container\">\n<div class=\"header\">\n<h1><i class=\"fas fa-headphones\"></i> TTS音色选择</h1>\n<p>番茄和书旗音色独立设置，切换Tab分别选择</p>\n</div>\n<div class=\"current-section\">\n<div class=\"current-label\"><i class=\"fas fa-check-circle\" style=\"color:#40c057;margin-right:6px\"></i>当前音色</div>\n<div class=\"current-value\">\n<span id=\"fanqie-display\">🍅 <span id=\"fanqie-value\">` + fanqieDisplay + `</span></span>\n<span id=\"shuqi-display\">📚 <span id=\"shuqi-value\">` + shuqiDisplay + `</span></span>\n</div>\n</div>\n<div class=\"tabs\">\n<button class=\"tab-btn active\" data-tab=\"fanqie\" onclick=\"switchTab('fanqie')\"><i class=\"fas fa-tomato\"></i> 番茄</button>\n<button class=\"tab-btn\" data-tab=\"shuqi\" onclick=\"switchTab('shuqi')\"><i class=\"fas fa-book\"></i> 书旗</button>\n</div>\n<div id=\"panel-fanqie\" class=\"tab-panel active\">\n<div class=\"panel-title\"><i class=\"fas fa-list-ul\" style=\"color:#ff6b35\"></i> 番茄音色列表</div>\n<div class=\"tone-grid\">` + fanqieHtml + `</div>\n</div>\n<div id=\"panel-shuqi\" class=\"tab-panel\">\n<div class=\"panel-title\"><i class=\"fas fa-list-ul\" style=\"color:#1976d2\"></i> 书旗音色列表</div>\n<div class=\"tone-grid\">` + shuqiHtml + `</div>\n</div>\n<div class=\"clear-area\">\n<button onclick=\"clearAll()\" class=\"clear-btn\"><i class=\"fas fa-trash-alt\"></i> 清除所有音色</button>\n</div>\n<div class=\"action-hint\"><i class=\"fas fa-check-circle\"></i> 选择完成后点击右上角 <strong>✓</strong> 确认</div>\n</div>\n<script>\nvar fanqieTone = '` + currentFanqieTone + `';\nvar shuqiTone = '` + currentShuqiTone + `';\nvar activeTab = '` + activeTab + `';\nvar fanqieMap = {};\nvar shuqiMap = {};\nvar fanqieList = ` + JSON.stringify(fanqieTones) + `;\nvar shuqiList = ` + JSON.stringify(shuqiTones) + `;\nfor (var i = 0; i < fanqieList.length; i++) { fanqieMap[fanqieList[i].id] = fanqieList[i].name; }\nfor (var i = 0; i < shuqiList.length; i++) { shuqiMap[shuqiList[i].id] = shuqiList[i].name; }\n\nfunction switchTab(tab) {\n    activeTab = tab;\n    document.querySelectorAll('.tab-btn').forEach(function(b) { b.classList.remove('active'); });\n    document.querySelector('.tab-btn[data-tab=\"' + tab + '\"]').classList.add('active');\n    document.querySelectorAll('.tab-panel').forEach(function(p) { p.classList.remove('active'); });\n    document.getElementById('panel-' + tab).classList.add('active');\n}\n\nfunction selectTone(id, source) {\n    if (source == 'fanqie') {\n        fanqieTone = id;\n        document.querySelectorAll('#panel-fanqie .tone-btn').forEach(function(b) {\n            b.classList.remove('selected');\n            if (b.getAttribute('data-id') == id) { b.classList.add('selected'); }\n        });\n        document.getElementById('fanqie-value').textContent = fanqieMap[id] || id;\n    } else {\n        shuqiTone = id;\n        document.querySelectorAll('#panel-shuqi .tone-btn').forEach(function(b) {\n            b.classList.remove('selected');\n            if (b.getAttribute('data-id') == id) { b.classList.add('selected'); }\n        });\n        document.getElementById('shuqi-value').textContent = shuqiMap[id] || id;\n    }\n}\n\nfunction clearAll() {\n    fanqieTone = '';\n    shuqiTone = '';\n    document.querySelectorAll('.tone-btn').forEach(function(b) { b.classList.remove('selected'); });\n    document.getElementById('fanqie-value').textContent = '未选择';\n    document.getElementById('shuqi-value').textContent = '未选择';\n}\n</script>\n</body>\n</html>`;\n        \n        var base64 = `data:text/html;base64,${java.base64Encode(html)}`;\n        var body = java.startBrowserAwait(base64, \"TTS音色选择\", false).body();\n        \n        var newFanqieTone = '';\n        var newShuqiTone = '';\n        \n        var fanqieMatch = body.match(/<span id=\"fanqie-value\">([^<]*)<\\/span>/);\n        if (fanqieMatch && fanqieMatch[1] && fanqieMatch[1] != '未选择') {\n            for (var i = 0; i < fanqieTones.length; i++) {\n                if (fanqieTones[i].name == fanqieMatch[1]) {\n                    newFanqieTone = fanqieTones[i].id;\n                    break;\n                }\n            }\n        }\n        \n        var shuqiMatch = body.match(/<span id=\"shuqi-value\">([^<]*)<\\/span>/);\n        if (shuqiMatch && shuqiMatch[1] && shuqiMatch[1] != '未选择') {\n            for (var i = 0; i < shuqiTones.length; i++) {\n                if (shuqiTones[i].name == shuqiMatch[1]) {\n                    newShuqiTone = shuqiTones[i].id;\n                    break;\n                }\n            }\n        }\n        \n        setConfigs.call(this, {\n            fanqie_tts_tone: newFanqieTone,\n            shuqi_tts_tone: newShuqiTone\n        });\n        \n        var msg = '';\n        if (newFanqieTone && newShuqiTone) {\n            msg = '✅ 番茄: ' + getToneName(newFanqieTone, 'fanqie') + ' | 书旗: ' + getToneName(newShuqiTone, 'shuqi');\n        } else if (newFanqieTone) {\n            msg = '✅ 番茄音色: ' + getToneName(newFanqieTone, 'fanqie');\n        } else if (newShuqiTone) {\n            msg = '✅ 书旗音色: ' + getToneName(newShuqiTone, 'shuqi');\n        } else {\n            msg = '已清除所有TTS音色';\n        }\n        java.toast(msg);\n        \n    } catch(e) {\n        java.log(e);\n        java.toast(\"❌ 音色设置失败：\" + e);\n    }\n}\n\nfunction vip() { java.startBrowserAwait(getServerHost() + '/coffee', \"喝咖啡\"); }\nfunction fb() { java.startBrowserAwait('https://fb.shushan.vip', \"发布页\"); }\nfunction key() { java.startBrowserAwait(getServerHost() + '/user_login', \"登陆注册\"); }\nfunction user_center() { java.startBrowserAwait(getServerHost() + '/user_center', \"用户中心\"); }\nfunction version() { java.startBrowserAwait(getServerHost() + '/version?id=' + localVersion, \"版本检查\"); }\nfunction help() { java.startBrowserAwait(getServerHost() + '/help', \"使用帮助\"); }\nfunction password() { java.startBrowserAwait(getServerHost() + '/forgot_password', \"修改密码\"); }\nfunction boy() { updateConfig(\"gender\", \"boy\", \"\\n已设置为\\n🧸男频🧸\\n刷新发现页生效\"); }\nfunction girl() { updateConfig(\"gender\", \"girl\", \"\\n已设置为\\n🎀女频🎀\\n刷新发现页生效\"); }", "respondTime": 180000, "ruleBookInfo": {"author": "$.author", "canReName": "1", "coverUrl": "$.cover", "downloadUrls": "{{$.book_url##[|]}}\n@js:\nlet url = java.base64Decode(result);\nlet source = \"{{$.source}}\".toLowerCase();\n\nif (source == \"番茄小说\") {\n    let book_id = \"{{$.bookid}}\";\n    java.toast('\\n❗请等待正在下载变成下载完成后在导入');\n    \n    if (book_id) {\n        getServerHost() + `/down?key={{getSecretKey()}}&book_id=${book_id}`;\n    } else {\n        url;\n    }\n} else if (source == \"爱去\") {\n    let bookIdMatch = url.match(/txt-(\\d+)\\.htm/);\n    if (bookIdMatch && bookIdMatch[1]) {\n        let bookId = bookIdMatch[1];\n        let requestUrl = 'https://www.aiqu666.com/txt-xx/softdownfree.asp?softid=' + bookId + '&ckm=mianfei';\n        let html = java.ajax(requestUrl);\n        let downloadSection = html.match(/<img[^>]*icon_downloadserver[^>]*>([\\s\\S]*?)<span style=\"FONT-SIZE: 18px; COLOR: #0000ff\">下载帮助:/);\n        \n        if (downloadSection) {\n            let firstMatch = downloadSection[1].match(/第一下载地址[^<]*<a[^>]*href=\"([^\"]+\\.(txt|zip|rar|epub))\"/);\n            if (firstMatch && firstMatch[1]) {\n                firstMatch[1];\n            } else {\n                let allLinks = downloadSection[1].match(/href=\"([^\"]+\\.(txt|zip|rar|epub))\"/g);\n                allLinks && allLinks.length > 1 ? allLinks[1].replace('href=\"', '').replace('\"', '') : '';\n            }\n        } else {\n            '';\n        }\n    } else {\n        url;\n    }\n} else {\n    url;\n}", "init": "<js>\nif (String(baseUrl).startsWith(\"data:\")) {\n    let res = JSON.parse(java.hexDecodeToString(result));\n    \n    if (res.source == \"番茄小说\" && java.get(\"fqdown\") == \"on\") {\n        book.type = 128;\n        java.toast('\\n正在准备TXT，请等待后端缓存完毕后点击阅读导入…');\n    }\n\n    let request = getServerHost() + `/details,${JSON.stringify({\n        method: \"POST\",\n        body: res\n    })}`;\n    \n    result = java.ajax(request);\n    let response = JSON.parse(result);\n    if (response.data.tab == \"download\") {\n       book.type = 128;\n    }\n} \nresult;\n</js>\n$.data", "intro": "&nbsp;&nbsp;\n✨ 源站：{{$.source}}{{\"\\n\"+\"​\"}}\n{{$.desc}}\n<js>\nconst tomatoSources = [\"番茄小说\", \"番茄听书\", \"番茄畅听\"];\nconst jjwxcSources = [\"晋江\"];\n\nconst sourceName = \"{{$.source}}\";\nconst bookIdFromBackend = \"{{$.bookid}}\";\n\nlet finalResult = result;\n\nif (tomatoSources.includes(sourceName)) {\n    try {\n        let bookId = bookIdFromBackend;\n        if (bookId) {\n            let bookData = getBookData(bookId);\n            \n            if (bookData) {\n                let syncStatus = java.get(\"book_sync\") ?? \"off\";\n                if (syncStatus == \"on\") {\n                    syncReadingHistory(bookData.book_id);\n                }\n                \n                let bookName = bookData.original_book_name || bookData.book_name || \"\";\n                let aliasName = bookData.book_flight_alias_name || bookData.sub_title || \"\";\n                let createTime = bookData.create_time ? bookData.create_time.split('T')[0] : (bookData.first_online_time ? java.timeFormat(parseInt(Object.values(JSON.parse(bookData.first_online_time))[0])*1000).split(' ')[0] : \"\");\n                let updateTime = bookData.last_chapter_update_time ? java.timeFormat(parseInt(bookData.last_chapter_update_time)*1000) : \"\";\n                \n                let authorName = \"\";\n                if (bookData.original_authors) {\n                    try {\n                        let authorsParsed = JSON.parse(bookData.original_authors);\n                        authorName = Array.isArray(authorsParsed) ? authorsParsed.map(a => a.AuthorName || a.author_name || a).join(', ') : bookData.original_authors;\n                    } catch(e) {\n                        authorName = bookData.original_authors;\n                    }\n                } else {\n                    authorName = bookData.author || \"\";\n                }\n                \n                let roleName = \"\";\n                if (bookData.roles) {\n                    try {\n                        let rolesParsed = JSON.parse(bookData.roles);\n                        roleName = Array.isArray(rolesParsed) ? rolesParsed.join(', ') : bookData.roles;\n                    } catch(e) {\n                        roleName = bookData.roles;\n                    }\n                } else if (bookData.role) {\n                    roleName = bookData.role;\n                }\n                \n                let bookTagsData = bookData.pure_category_tags || bookData.tags || \"\";\n                let readCount = bookData.read_count || \"0\";\n                let bookStatus = bookData.book_search_visible == 'false' ? \"下架\" : \"正常\";\n                let abstract = bookData.book_abstract_v2 || bookData.abstract || \"\";\n                let copyrightInfo = bookData.copyright_info || \"\";\n                \n                let output = `&nbsp;&nbsp;\n✨ 源站：${sourceName}{{\"\\n\"+\"​\"}}\n📕 源名：${bookName}`;\n                \n                if (aliasName) output += `\\n📖 别名：${aliasName}`;\n                \n                output += `\\n✏️ 开坑：${createTime} \n🧭 更新：${updateTime}&lrm;\n👤 作者：${authorName}`;\n                \n                if (roleName) output += `\\n🎭 主角：${roleName}`;\n                \n                output += `\n🏷️ 标签：${bookTagsData}\n👁️ 在线：${readCount}人在读\n🔗 书籍状态：${bookStatus} `;\n                \n                output += `\\n🔄 阅读记录：${syncStatus == \"on\" ? \"✅已开启同步\" : \"❌已关闭同步\"}`;\n                \n                if (sourceName == \"番茄听书\") {\n                    try {\n                        let ttsUrl = `https://reading.snssdk.com/reading/bookapi/audio/toneinfo/?book_id=${bookId}&aid=1967`;\n                        let response = java.ajax(ttsUrl);\n                        let data = JSON.parse(response);\n                        let ttsData = data.data;\n                        let toneLines = [];\n                        \n                        if (ttsData.recommend_tone) {\n                            for (var i = 0; i < ttsData.tts_tones.length; i++) {\n                                if (ttsData.tts_tones[i].id == ttsData.recommend_tone) {\n                                    toneLines.push('🎤 推荐音色：' + ttsData.tts_tones[i].title + ' (音色ID: ' + ttsData.tts_tones[i].id + ')');\n                                    break;\n                                }\n                            }\n                        }\n                        \n                        if (ttsData.tts_tones && ttsData.tts_tones.length > 0) {\n                            var availableTones = '';\n                            for (var j = 0; j < ttsData.tts_tones.length; j++) {\n                                if (j > 0) availableTones += '、';\n                                availableTones += ttsData.tts_tones[j].title + '(音色ID: ' + ttsData.tts_tones[j].id + ')';\n                            }\n                            toneLines.push('🎧 可用音色：' + availableTones);\n                        }\n                        \n                        if (toneLines.length > 0) {\n                            output += '\\n' + toneLines.join('\\n');\n                        }\n                    } catch (e) {}\n                }\n                \n                output += `{{\"\\n\"+\"​\"}}\n📜 简介：${abstract}{{\"\\n\"+\"​\"}}`;\n                \n                if (copyrightInfo) {\n                    output += `\\n📍 ${copyrightInfo.split('，')[0]}。`;\n                }\n                \n                finalResult = output;\n            }\n        }\n    } catch (e) {\n    }\n} else if (jjwxcSources.some(source => sourceName.includes(source))) {\n    try {\n        let novelId = bookIdFromBackend;\n        \n        if (novelId) {\n            let currentVariable = book.getVariable(\"custom\") || \"\";\n            \n            if (!currentVariable.includes(\"开启段评\") && !currentVariable.includes(\"关闭段评\")) {\n                try {\n                    let checkUrl = `https://android.jjwxc.com/app.jjwxc/android/reading/authorNovelSetting/getSetting?versionCode=381&novelid=${novelId}&setting_type=author_paragraph_comment_switch`;\n                    \n                    let request = `${checkUrl},${JSON.stringify({\n                        headers: {\n                            \"versiontype\": \"reading\",\n                            \"versionCode\": \"381\"\n                        }\n                    })}`;\n                    \n                    let ajaxResult = java.ajax(request);\n                    let checkResponse = JSON.parse(ajaxResult);\n                    \n                    let paraEnabled = checkResponse.data?.paragraph_switch == \"1\";\n                    \n                    let newVariable = currentVariable + (paraEnabled ? \"开启段评\" : \"关闭段评\");\n                    book.putVariable(\"custom\", newVariable);\n                    \n                } catch(e) {\n                    let newVariable = currentVariable + \"关闭段评\";\n                    book.putVariable(\"custom\", newVariable);\n                }\n            }\n        }\n    } catch (e) {\n    }\n}\nfinalResult;\n</js>", "kind": "$.tags", "name": "$.title", "tocUrl": "<js>\nlet catalog = {\n    source: result.source,\n    url: result.book_url,\n    name: result.title,\n    tab: result.tab || \"novel\",\n    bookid: result.bookid || \"\"\n};\n\nvar tabTips = {audio: '听书', video: '视频', comic: '漫画'}; \nif (tabTips[catalog.tab]) {\n    java.toast('当前为' + tabTips[catalog.tab] + '模式');\n}\n\nyunurl = java.base64Encode(JSON.stringify(catalog));\nresult = `data:catalogUrl;base64,${yunurl},{\"type\":\"susan\"}`;\n</js>", "wordCount": "$.wordCount"}, "ruleContent": {"callBackJs": "if (event == \"clickCustomButton\") {\n    let targetUrl = \"\";\n    \n    if (chapter && chapter.url) {\n        try {\n            let chUrl = String(chapter.url);\n            let jsMatch = chUrl.match(/\"js\":\"book \\? result : '([^']+)'\"/);\n            if (jsMatch && jsMatch[1]) {\n                targetUrl = jsMatch[1];\n            }\n        } catch (e) {}\n    } else if (book && book.tocUrl) {\n        try {\n            let tocUrl = String(book.tocUrl);\n            let base64Str = tocUrl.replace(/^data:catalogUrl;base64,/, '');\n            let idx = base64Str.indexOf(',');\n            if (idx >= 0) base64Str = base64Str.substring(0, idx);\n            let catalog = JSON.parse(java.base64Decode(base64Str));\n            let source = catalog.source || \"\";\n            let bookid = catalog.bookid || \"\";\n            \n            if (bookid) {\n                let urlMap = {\n                    \"晋江\": \"/jj_author?novelid=\" + bookid,\n                    \"起点\": \"/qd_role?bookid=\" + bookid,\n                    \"七猫小说\": \"/qm_comment?type=book&book_id=\" + bookid,\n                    \"番茄小说\": \"/fq_comment?book_id=\" + bookid,\n                    \"番茄听书\": \"/fq_comment?book_id=\" + bookid,\n                    \"菠萝包\": \"/sfacg_comment?bookid=\" + bookid\n                };\n                \n                if (urlMap[source]) {\n                    targetUrl = getServerHost() + urlMap[source];\n                }\n            }\n        } catch (e) {}\n    }\n\n    if (targetUrl) {\n        targetUrl += \"&key=\" + getSecretKey();\n        java.showBrowser(\n            targetUrl,\n            null,\n            \"window.java=java;\",\n            JSON.stringify({\n                \"expandedCornersRadius\": 20,\n                \"dismissOnTouchOutside\": true,\n                \"isDraggable\": true,\n                \"shouldDimBackground\": true,\n                \"backgroundDimAmount\": 0.5,\n                \"hardwareAccelerated\": true,\n                \"isNestedScrollingEnabled\": true,\n                \"isGestureInsetBottomIgnored\": true,\n                \"setFitToContents\": false,\n                \"heightPercentage\": 0.85,\n                \"isHideable\": true\n            })\n        );\n    } else {\n        java.toast(chapter ? \"当前来源不支持章评\" : \"当前来源不支持\");\n    }\n    true;\n}", "content": "<js>eval(function(p,a,c,k,e,r){e=function(c){return(c<62?'':e(parseInt(c/62)))+((c=c%62)>35?String.fromCharCode(c+29):c.toString(36))};if('0'.replace(0,e)==0){while(c--)r[e(c)]=k[c];k=[function(e){return r[e]||e}];e=function(){return'([3-8bcf-mo-rt-zB-UWYZ]|1\\\\w)'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('5 3=u.y(6.hexDecodeToString(g));5 M=13()?\\'ios\\':\\'14\\';5 m=\\'\\';4(M==\\'14\\'){o{m=6.15()}p(e){o{m=6.16()}p(e2){m=\\'\\'}}}b{o{m=6.16()}p(e){o{m=6.15()}p(e2){m=\\'\\'}}}4(!13()){o{eval(String(f.loginUrl));5 N=getConfig.18(19);5 C=Date.C();5 1a=2*60*60*1000;4(!N.O||(C-N.O)>1a){setConfig.18(19,\\'O\\',C);5 c=u.y(6.D(v()+\"/j?vid=sy\"));4(c.j){4(c.1c&&c.1c.toString().toLowerCase()==\"1d\"&&c.j>z){6.P(j());6.k(\"请更新书源！下载页面已打开。\")}5 r=c.j>z?\"\\\\n✨发现新版本V\"+c.j+\" (当前V\"+z+\")\"+(c.r?\"\\\\n\"+c.r:\\'\\'):c.j<z?\"\\\\n⚠️版本异常\\\\n本地V\"+z+\" > 云端V\"+c.j+\"\\\\n请检查书源配置\":\\'\\';4(r)6.k(r)}b 4(c.r){6.k(c.r)}}}p(e){}}3.j=\"12\";4(6.1e(\"chapter_refresh_force\")==\"on\"){3.refresh=\\'1d\\'}4(3.f==\\'晋江\\'){3.token=JJtoken()||\"\"}4(3.f==\\'七猫小说\\'&&3.E){5 Q=3.E.R(/l=(\\\\d+)/);5 S=3.E.R(/t=(\\\\d+)/);5 T=3.E.R(/F=([a-f0-9]+)/);4(Q)3.l=Q[1];4(S)3.t=S[1];4(T)3.F=T[1]}4(3.f==\\'番茄听书\\'||3.f==\\'番茄畅听\\'){o{5 G=1g(\\'fanqie\\');5 H=v()+\\'/1h?1i=\\'+G+\\'&U=\\'+3.t;5 h=u.y(6.D(H));4(h.8&&h.8[0]&&h.8[0].I){g=h.8[0].I}b{6.k(\"当前音色不支持该章节，请切换其他音色尝试\");g=\"\"}}p(e){6.k(\"获取音频失败，请切换音色或重试\");g=\"\"}}b 4(3.f==\\'书旗听书\\'){o{5 W=3.q||\\'\\';5 Y=3.U||\\'\\';5 G=1g(\\'shuqi\\');4(W&&Y){5 H=v()+\\'/1h?q=\\'+W+\\'&U=\\'+Y+\\'&1i=\\'+G;5 h=u.y(6.D(H));4(h.8&&h.8[0]&&h.8[0].I){g=h.8[0].I}b{6.k(\"当前音色不支持该章节，请切换其他音色尝试\");g=\"\"}}}p(e){6.k(\"获取音频失败，请切换音色或重试\");g=\"\"}}b 4(3.f==\\'番茄短剧\\'||3.f==\\'七猫短剧\\'){5 B=\\'\\';4(3.f==\\'番茄短剧\\'&&3.l){B=v()+\\'/1j?l=\\'+3.l+\\'&1k=\\'+Z()}b 4(3.f==\\'七猫短剧\\'&&3.10){B=v()+\\'/1j?10=\\'+3.10+\\'&1k=\\'+Z()}4(B){4(11.1l==J.1m){6.P(B,J.1n||\\'视频播放\\');6.k(\\'视频加载中...\\');g=\"▶️刷新正文进入播放界面\"}b{g=\"▶️点击章节进入播放界面\"}}}b{5 1o=v()+`/1p,${u.stringify({method:\"POST\",headers:{\"Content-1q\":\"application/json\",\"X-Api-Key\":Z(),\"X-1r-1q\":M,\"X-1r-Id\":m},body:3})}`;5 i=u.y(6.D(1o));5 7=i.8.1p;5 1s=/^[A-Za-z0-9+/]*={0,2}$/.test(7);4(1s){o{7=decode(7)}p(e){7=6.base64Decode(7)}}4(i.8&&i.8.tab==\"video\"){4(11.1l==J.1m){6.P(7,J.1n||\\'视频播放\\');6.k(\\'视频加载中...\\');7=\"▶️刷新正文进入播放界面\"}b{7=\"▶️点击章节进入播放界面\"}}4((6.1e(\"yunpara\")||\"off\")==\"on\"){5 s=3.f;4(s==\\'番茄小说\\'&&3.l&&3.t){7=w(7,3.l,3.t,\\'fq\\')}b 4(s==\\'晋江\\'&&3.K&&3.L){5 1t=11.getVariable(\"custom\")||\"\";4(!1t.includes(\"关闭段评\")){7=w(7,3.K,3.L,\\'jj\\',1v,{})}}b 4(s==\\'半夏\\'&&3.K&&3.L){7=w(7,3.K,3.L,\\'jj\\',1v,{q:3.q,x:3.x})}b 4(s==\\'七猫小说\\'&&3.l&&3.t&&3.F){7=w(7,3.l,3.t,\\'qm\\',3.F)}b 4((s==\\'企鹅看书\\'||s==\\'QQ阅读\\')&&3.q&&3.x){7=w(7,3.q,3.x,\\'qq\\')}b 4(s==\\'起点\\'&&3.q&&3.x){7=w(7,3.q,3.x,\\'qd\\')}}4(i.8&&i.8.1w){7+=\"\\\\n\"+i.8.1w}4(i.8&&i.8.1x){7+=\"\\\\n【📢作者有话说】\\\\n\"+i.8.1x}g=7}',[],96,'|||chapterParams|if|let|java|finalResult|data|||else|versionData|||source|result|apiData|response|version|toast|book_id|deviceId||try|catch|bookid|msg||item_id|JSON|getServerHost|getComments|chapterid|parse|localVersion||videoUrl|now|ajax|qm_url|content_md5|toneId|apiUrl|main_url|chapter|novelId|chapterId|deviceTypeStr|config|lastUpdateCheck|startBrowser|bookIdMatch|match|itemIdMatch|contentMd5Match|item_ids||bookId||itemId|getSecretKey|qm_id|book||deviceType|android|androidId|deviceID||call|this|fourHours||force|true|get||getTtsTone|audio|tone_id|player|key|durChapterIndex|index|title|chapterUrl|content|Type|Device|isBase64|customVar||null|notice|sayBody'.split('|'),0,{}))</js>", "payAction": "//java.log(baseUrl);\nnid = baseUrl.match(/bid=(\\d+)/)[1];\ncid = baseUrl.match(/cid=(\\d+)/)[1];\ntoken = java.base64Decode(JJtoken());\nenbody = String(Date.now())+\":\"+token+\":\"+nid;\nsign = encode(enbody)\nbody = \"versionCode=444&novelId=\"+nid+\"&chapters=\"+cid+\"&orderType=15&isautoBuy=0&autosubscribeStatus=0&notUseBackpoint=&sign=\"+sign;\nurl = \"https://android.jjwxc.net/androidapi/buy,\"\npost = {\n\t\"method\":\"POST\",\n\t\"body\":String(body)\n\t}\n a = java.ajax(url+JSON.stringify(post));\n if(/购买成功/.test(JSON.parse(a).message)){\n \tjava.longToast(JSON.parse(a).message);\n \tresult  = true\n \t}else{\n \t\tmm = JSON.parse(a).message==\"\"?JSON.parse(a).popupdata.popupmessage+\"\\n❗️进晋江app进行一次验证后❗️才能在阅读app使用购买功能\":JSON.parse(a).message;\n \t\tjava.longToast(mm);\n}", "replaceRegex": "##\\(本章完\\)|\\(\\)|\\(第\\d+/\\d+页\\)|(?:.*(?:蟹蟹|扔了|感谢|投出|灌溉营养液|送的|谢谢).*?(?:手榴|月票|霸王票|小天使|火箭炮|深水鱼雷|浅水炸弹|地雷|营养液)([xX]\\d+)*.*|.*?瓶[；~]|\".*?\"(?:营养液|手榴弹|月票|霸王票|小天使|火箭炮|深水鱼雷|浅水炸弹|地雷)x\\d+|读者.*?(月石|营养液).*|地雷感谢：[\\s\\S]+)", "subContent": "@js:\nlet chapterParams = JSON.parse(java.hexDecodeToString(result));\nif(chapterParams.source == '番茄听书' || chapterParams.source == '番茄畅听'){\n    try{\n        let toneId = getTtsTone('fanqie');\n        let apiUrl = getServerHost() + '/audio_lrc?item_id=' + chapterParams.item_id + '&tone_id=' + toneId + '&book_id=' + chapterParams.book_id;\n        let lrcData = java.ajax(apiUrl);\n        result = decode(lrcData);\n    }catch(e){\n        result='';\n    }\n}else if(chapterParams.source == '七猫听书'){\n    try{\n        let bookId = chapterParams.book_id || '';\n        let itemId = chapterParams.item_id || '';\n        if(bookId && itemId){\n            let apiUrl = getServerHost() + '/audio_lrc?source=qm&book_id=' + bookId + '&item_id=' + itemId;\n            let lrcData = java.ajax(apiUrl);\n            result = decode(lrcData);\n        }else{\n            result='';\n        }\n    }catch(e){\n        result='';\n    }\n}else{\n    result='';\n}", "title": "@js:\nlet isAndroid = deviceType();\nlet title = chapter.title || \"\";\n\nif (isAndroid) {\n    let chapterParams = JSON.parse(java.hexDecodeToString(result));\n    \n    let bookid = chapterParams.bookid || null;\n    let chapterid = chapterParams.chapterid || null;\n    \n    let yunparaStatus = java.get(\"yunpara\") || \"off\";\n    \n    let isModifiedVersion = checkEnv();\n    let isQingRead = isQRead();\n    \n    let isQQSource = chapterParams.source == 'QQ阅读' || chapterParams.source == '企鹅看书';\n    let isQDSource = chapterParams.source == '起点';\n    \n    if ((isModifiedVersion || isQingRead) && yunparaStatus == \"on\" && bookid && chapterid) {\n        if (isQQSource || isQDSource) {\n            let Bubble = cache.get(bookid + \"_\" + chapterid) || \"\";\n            title = title + Bubble;\n        }\n    }\n}\ntitle;"}, "ruleExplore": {"author": "$.author", "bookList": "<js>\nfunction getBookIdFull(url) {\n    const {java} = this;\n    let $ = JSON.parse(url).data;\n    let arr = [];\n    if ($.book_shelf_info && $.book_shelf_info.length > 0) {\n        arr = $.book_shelf_info.map(item => item.book_id);\n    } else if ($.data_list && $.data_list.length > 0) {\n        arr = $.data_list.map(item => item.book_id_str);\n    } else {\n        java.toast(\"获取 book_id 失败，你可能需要登录！\");\n    }\n    return arr;\n}\n\nlet session = getSessionId()\n\ngetShelf = () => {\n    let book_shelf_info = java.ajax(getServerHost() + \"/book_shelf?session=\" + session)\n    \n    bid = getBookIdFull(book_shelf_info)\n    \n    let id_list = splitArray(bid, 200)\n    let urls = []\n    id_list.forEach(i => {\n        urls.push(getServerHost() +\"/detail?book_id=\" + i.join(\",\"))\n    })\n    res = java.ajaxAll(urls)\n\n    let resp = {book_info: []}\n    res.forEach(r => {\n        resp.book_info = resp.book_info.concat(JSON.parse(r.body()).data)\n    })\n\n    return resp\n}\n\nfunction getByGroupName(name) {\n    let book_shelf_info = JSON.parse(java.ajax(getServerHost() +\"/book_shelf?session=\" + session))\n    \n    let group_bookids = {\n        \"未分组\": []\n    }\n    book_shelf_info.data.book_shelf_info.forEach(i => {\n        if (!group_bookids[i.group_name ? i.group_name : \"未分组\"]) group_bookids[i.group_name] = []\n        group_bookids[i.group_name ? i.group_name : \"未分组\"].push(i.book_id)\n    })\n    \n    if (!group_bookids[decodeURIComponent(name)]) return {data: []}\n    \n    let book_ids = splitArray(group_bookids[decodeURIComponent(name)], 200)\n    let urls = []\n\n    book_ids.forEach(i => { \turls.push(getServerHost() +\"/detail?book_id=\" + i.join(\",\"))\n    })\n    \n    res = java.ajaxAll(urls)\n\n    let resp = {book_info: []}\n    res.forEach(r => {\n        resp.book_info = resp.book_info.concat(JSON.parse(r.body()).data)\n    })\n\n    return resp\n}\n\nfunction getByTabIndex(index) {\n    let url = _mlsec.requestHeader(\n        \"bookmall/tab\",\n        \"version_name=5.8.9.32\",\n        null,\n        \"sessionid=\" + session\n    )\n    let all = JSON.parse(java.ajax(url))\n    let tab = all.data.tab_item[0].cell_data[index].cell_data\n    if (!tab) tab = []\n    let bookList = []\n    for (let i of tab) {\n        bookList = bookList.concat(i.book_data)\n    }\n    return { book_info: bookList }\n}\n\nfunction getGuessYouLike() {\n    let apiUrl = 'https://reading.snssdk.com/reading/bookapi/bookmall/tab/v/?version_name=5.8.9.32&device_id=1024&device_type=114514&iid=2048&aid=1967&channel=0&os_version=0&app_name=novelapp&version_code=58932&device_platform=android'\n    let response = java.ajax(apiUrl + ', ' + JSON.stringify({\n        headers: {\n            'Cookie': \"sessionid=\" + session\n        }\n    }))\n    let responseData = JSON.parse(response)\n    let finalResult = {\n        code: 0,\n        message: 'SUCCESS',\n        data: {\n            cell_view: {\n                book_data: []\n            }\n        }\n    }\n    if (responseData.data && responseData.data.tab_item && responseData.data.tab_item.length > 0 && responseData.data.tab_item[0].cell_data && responseData.data.tab_item[0].cell_data.length > 0 && responseData.data.tab_item[0].cell_data[0].cell_data && responseData.data.tab_item[0].cell_data[0].cell_data.length > 0 && responseData.data.tab_item[0].cell_data[0].cell_data[0].book_data) {\n        finalResult.data.cell_view.book_data = responseData.data.tab_item[0].cell_data[0].cell_data[0].book_data\n    }\n    return finalResult\n}\n\nfunction normalizeResponse(data) {\n    if (data.data && data.data.book_list && Array.isArray(data.data.book_list)) {\n        return data.data.book_list;\n    }\n    \n    if (data.book_info) return data.book_info;\n    if (data.data && data.data.book_info) return data.data.book_info;\n    if (data.data && Array.isArray(data.data)) return data.data;\n    if (data.list) return data.list;\n    if (data.book_list) return data.book_list;\n    if (data.data && data.data.publication_list) return data.data.publication_list;\n    if (data.result) return data.result;\n    if (data.data && data.data.result) return data.data.result;\n    if (data.data && data.data.cell_view && data.data.cell_view.book_data) {\n        return data.data.cell_view.book_data;\n    }\n    if (data.data && data.data.records) return data.data.records;\n    if (data.data && data.data.list) return data.data.list;\n    \n    return [];\n}\n\nif (baseUrl.includes(\"jj_signin\")) {\n    let decodedToken = java.base64Decode(JJtoken());\n    let timestamp = Date.now();\n    let enbody = timestamp + ':' + decodedToken;\n    let encodedEnbody = encode(enbody);\n    \n    let signUrl = \"https://app.jjwxc.org/androidapi/signin,{\\\"method\\\":\\\"POST\\\",\\\"body\\\":\\\"versionCode=313&sign=\" + encodedEnbody + \"\\\"}\";\n    \n    let signinResult = java.ajax(signUrl);\n    \n    let result = JSON.parse(signinResult);\n    let message = result.message || \"签到请求完成\";\n    \n    let responseData = {\n        \"isSuccess\": result.code == \"200\",\n        \"errorMsg\": result.code == \"200\" ? \"success\" : \"fail\",\n        \"data\": [{\n            \"title\": message\n        }]\n    };\n    \n    JSON.stringify(responseData);\n} else if (baseUrl.includes(\"jjbookshelf\")) {\n    let token = JJtoken();\n    let jjUrl = baseUrl + token;\n    result = JSON.parse(java.ajax(jjUrl));\n    JSON.stringify(result);\n} else if (baseUrl.includes(\"type_style\")) {\n    let sortKey = getSortKey() || '';\n    let newUrl = baseUrl + sortKey;\n    result = JSON.parse(java.ajax(newUrl));\n    \n    let normalizedData = normalizeResponse(result);\n    JSON.stringify({data: normalizedData});\n} else if (baseUrl.endsWith(\"bookshelf\")) {\n    result = getShelf(\"bookshelf/info\")\n} else if(/read_history/.test(baseUrl)) {\n    let pageMatch = baseUrl.match(/page=(\\d+)/);\n    let page = pageMatch ? pageMatch[1] : '1';\n    \n    let history_response = java.ajax(getServerHost() + \"/read_history?session=\" + session + \"&page=\" + page)\n    let history_data = JSON.parse(history_response)\n    \n    if (history_data.data.data_list) {\n        let book_ids = history_data.data.data_list.map(item => item.book_id_str)\n        \n        let id_list = splitArray(book_ids, 200)\n        let urls = []\n        id_list.forEach(i => {\n          urls.push(getServerHost() +\"/detail?book_id=\" + i.join(\",\"))\n        })\n        \n        let resp = {book_info: []}\n        urls.forEach(url => {\n            let detailResponse = java.ajax(url)\n            let detailData = JSON.parse(detailResponse)\n            if (detailData.data) {\n                resp.book_info = resp.book_info.concat(detailData.data)\n            }\n        })\n        \n        result = resp\n    } else {\n        result = {book_info: []}\n    }\n} else if (baseUrl.includes(\"style_top\")) {\n    result = JSON.parse(result);\n} else if (baseUrl.includes(\"/tab/cai\")) {\n    result = getGuessYouLike();\n} else {\n    let w = baseUrl.split(\"/\")\n    if (baseUrl.includes(\"groupName\")) {\n        result = getByGroupName(w[w.length - 1])\n    } else if (baseUrl.includes(\"tab\")) {\n        result = getByTabIndex(parseInt(w[w.length - 1]))\n    } else {\n        result = JSON.parse(result)\n        if (result.data && result.data.data) {\n            result = {book_info: result.data.data}\n        }\n    }\n}\n\nif (!baseUrl.includes(\"jjbookshelf\") && !baseUrl.includes(\"type_style\") && !baseUrl.includes(\"jj_signin\")) {\n    let normalizedData = normalizeResponse(result);\n    JSON.stringify({data: normalizedData})\n}\n</js>\n$.data[*]", "bookUrl": "<js>\nlet source = result.source;\nlet book_url = result.book_url;\nlet title = result.title || result.book_name || result.bookName;\nlet book_id = result.book_id || result.series_id || result.bookId;\nlet cover = result.thumb_url || result.thumb_url || result.thumbUri || result.cover;\nlet desc = result.desc || result.abstract;\n\nlet detail = {\n    source: source,\n    url: book_url,\n    cover: cover,\n    desc: desc,\n    name: title\n};\n\nif (book_id && /^\\d{19}$/.test(book_id)) {\n    detail.cover = cover;\n    detail.desc = desc;\n    detail.url = java.base64Encode(`https://api5-normal-sinfonlineb.fqnovel.com/reading/bookapi/multi-detail/v/?aid=1967&iid=1&version_code=999&book_id=${book_id}`);\n    detail.source = \"番茄小说\";\n} else if (book_url) {\n    detail.url = java.base64Encode(book_url);\n}\n\nlet yunurl = java.base64Encode(JSON.stringify(detail));\n`data:detailsUrl;base64,${yunurl},{\"type\":\"susan\"}`;\n</js>", "coverUrl": "$.thumb_url||$.audio_thumb_uri||$.thumbUri||$.cover", "intro": "$.abstract||$.desc", "kind": "$.tags", "lastChapter": "$.lastChapterTitle||$.last_chapter_title||$.latestChapterTitle", "name": "$.book_name||$.bookName||$.original_book_name||$.title", "wordCount": "$.word_number||$.WordsCount"}, "ruleSearch": {"author": "$.author", "bookList": "$.data", "bookUrl": "<js>\nlet source = String(result.source);\nlet book_url = result.book_url;\nlet title = result.title;\nlet cover = result.cover;\nlet desc = result.desc;\n\nlet detail = {\n    source: source,\n    url: book_url,\n    cover: cover,\n    desc: desc,\n    name: title\n};\n\nyunurl = java.base64Encode(JSON.stringify(detail));\n`data:detailsUrl;base64,${yunurl},{\"type\":\"susan\"}`;\n</js>", "checkKeyWord": "我在精神病院学斩神@番茄小说", "coverUrl": "$.cover", "intro": "$.desc", "kind": "$.tags", "lastChapter": "{{$.source}}·{{$.latestChapterTitle}}", "name": "$.title", "wordCount": "$.wordCount"}, "ruleToc": {"chapterList": "<js>\nlet res = JSON.parse(java.hexDecodeToString(result));\nlet catalog = {source: res.source, url: res.url, name: res.name, bookid: res.bookid || \"\", tab: res.tab || \"novel\"};\n\nshowTabTips(catalog);\n\nlet op = {method: \"POST\", body: catalog};\n\nlet catalogUrl = getServerHost() + `/catalog,${JSON.stringify(op)}`;\nlet response = java.ajax(catalogUrl);\n//java.log(response);\n\nlet device = deviceType() ? 'ios' : 'android';\n\nif (device == 'android') {\n    var typeMap = {audio:32, comic:64};\n    book.type = catalog.tab in typeMap ? typeMap[catalog.tab] : 8;\n} else {\n    var typeMap = {audio:1, comic:2, video:3};\n    book.type = catalog.tab in typeMap ? typeMap[catalog.tab] : 0;\n}\n\nJSON.parse(response).data.map((x) => {\n    if (x.isVolume == true) {\n        x.url = \"\";\n        return x;\n    }\n    \n    x.url = buildChapterUrl(x, catalog);\n    return x;\n});\n</js>", "chapterName": "title", "chapterUrl": "url", "isPay": "isPay", "isVip": "isVip", "isVolume": "isVolume", "updateTime": "tag"}, "searchUrl": "<js>\nlet config = getConfig.call(this);\nif (!config.host || !config.gender) {\n    config = { gender: \"boy\", host: getServerHost() };\n    setConfigs.call(this, config);\n    java.toast(\"配置初始化完成\");\n}\n\nvar sourceVal = '';\nvar customSource = '';\n\ntry {\n    customSource = (source.getLoginInfoMap())['自定义源站'];\n} catch(e) {\n    customSource = '';\n}\n\nif (customSource !== undefined && customSource !== null && String(customSource).trim() !== \"\") {\n    sourceVal = String(customSource).trim();\n} else if (config.source) {\n    sourceVal = config.source;\n}\n\nvar param = sourceVal ? '&source=' + encodeURIComponent(sourceVal) : '';\n\nresult = buildSearchResult(key, param, getServerHost());\n</js>", "weight": 0},{"bookSourceComment": "番茄小说，七猫小说，塔读小说，书旗小说，支持段评，后续将支持起点\n\ntg群:https://t.me/mowanxiaoshuo", "bookSourceName": "魔丸小说", "bookSourceType": 0, "bookSourceUrl": "https://www.mowan.lol", "customButton": false, "customOrder": 2, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>\nlet url = Api('/api/discover/tabs');\nlet res = JSON.parse(java.ajax(url));\n\nvar SOURCE_ORDER = {\n    \"番茄小说\": 1,\n    \"书旗小说\": 2,\n    \"七猫小说\": 3,\n    \"塔读小说\": 4\n};\n\nfunction transform(data) {\n    var result = [];\n    var sources = data.data.sources;\n    var i, j, temp;\n\n    for (i = 0; i < sources.length; i++) {\n        for (j = 0; j < sources.length - 1 - i; j++) {\n            var orderA = SOURCE_ORDER[sources[j].name];\n            var orderB = SOURCE_ORDER[sources[j + 1].name];\n            if ((orderA || 99) > (orderB || 99)) {\n                temp = sources[j];\n                sources[j] = sources[j + 1];\n                sources[j + 1] = temp;\n            }\n        }\n    }\n\n    for (i = 0; i < sources.length; i++) {\n        var source = sources[i];\n        result.push({\n            title: source.name,\n            url: \"\",\n            style: {\n                layout_flexGrow: 1,\n                layout_flexBasisPercent: 1\n            }\n        });\n\n        var count = 0;\n\n        for (j = 0; j < source.tabs.length; j++) {\n            var tab = source.tabs[j];\n\n            if (tab.section === true) {\n                result.push({\n                    title: tab.title,\n                    url: \"\",\n                    style: {\n                        layout_flexGrow: 1,\n                        layout_flexBasisPercent: 1\n                    }\n                });\n                count = 0;\n                continue;\n            }\n\n            var u = \"/api/discover/content?source=\" + source.source\n                  + \"&tab=\" + encodeURIComponent(tab.key)\n                  + \"&page={{page}}&page_size=12\";\n            u = Api(u);\n            result.push({\n                title: tab.title,\n                url: u,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.25\n                }\n            });\n\n            count++;\n            if (count === 3) {\n                count = 0;\n            }\n        }\n\n        while (count > 0 && count < 3) {\n            result.push({\n                title: \"--\",\n                url: \"\",\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.25\n                }\n            });\n            count++;\n        }\n    }\n\n    return result;\n}\n\nJSON.stringify(transform(res), null, 2);\n\n</js>", "jsLib": ";eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('2 b=\"J://K.L.M\";e c(k){2{3,w}=9;2 x=f(w.c(b))||f(3.c(b));2 l=x.N(\";\");O(2 i=0;i<l.y;i++){2 m=l[i].P();2 z=m.A(k+\"=\");n(z===0){g m.Q(k.y+1)}}g\"\"}e R(7,d){d=d||\\'S\\';2{3}=9;2 B=9.c(\\'X-C-D\\');2 4=9.c(\\'4\\');n(T 4===\\'U\\'){4=4.o(\"%p\",\" \")}V{4=f(4).o(\"%p\",\" \")}2 E={d:d,W:q.r({\\'4\\':4,\\'X-C-D\\':B,\\'Y-Z\\':\\'10/11\\'})};g b+7+\\',\\'+q.r(E)}e F(7){2{3,s}=9;2 G=12 13().14();2 t=G+\"15\";2 a=s.16(t);n(!a||f(a).A(\"17=\")===-1){3.18(1);a=3.19(7);s.1a(t,a)}2 H={\"1b\":p,\"1c\":6,\"1d\":6,\"1e\":6,\"1f\":0.5,\"1g\":6,\"1h\":6,\"1i\":6,\"1j\":6,\"1k\":6,\"1l\":0.8};3.1m(7,a,\"1n.3=3;\",q.r(H))}e 1o(u,7,h){2 v=u>I?\"I+\":u.1p();h=h.o(\\'$v\\',v);1q j=9.3.1r(h);j=`1s:1t/1u+1v;1w,${j},{\"1x\":\"F(\\'${b+7}\\' )\",\"1y\":\"1z\"}`;g`<1A 1B=\"${j}\">`}',62,100,'||let|java|Authorization||true|url||this|htmlContent|mw|getCookie|method|function|String|return|bubble||encodedBubble||parts|part|if|replace|20|JSON|stringify|cache|cacheKey|number|num|cookie|cookieValue|length|idx|indexOf|XDeviceID|Device|ID|options|showPara|date|browserConfig|99|https|www|mowan|lol|split|for|trim|substring|Api|GET|typeof|string|else|headers||Content|Type|application|json|new|Date|toLocaleDateString|dp|get|id|longToast|ajax|put|expandedCornersRadius|dismissOnTouchOutside|isDraggable|shouldDimBackground|backgroundDimAmount|hardwareAccelerated|isNestedScrollingEnabled|isGestureInsetBottomIgnored|setFitToContents|isHideable|heightPercentage|showBrowser|window|createBubble|toString|var|base64Encode|data|image|svg|xml|base64|click|style|text|img|src'.split('|'),0,{}));", "lastUpdateTime": "1789051145426", "loginUrl": "https://www.mowan.lol/user/me?app=yuedu&version=26.9.10", "respondTime": 180000, "ruleBookInfo": {"author": "$.data.author", "coverUrl": "$.data.cover", "init": "<js>\nlet url = java.hexDecodeToString(result);\njava.ajax(Api(url));\n</js>", "intro": "<js>\nresult = JSON.parse(result);\n`源站：${result.data.source}\n${result.data.description}`\n</js>", "kind": "{{$.data.category}},{{$.data.status}}", "name": "$.data.name", "tocUrl": "/api/book/chapters?source={{$.data.source}}&book_id={{$.data.id}}\n<js>\n`data:;base64,${java.base64Encode(result)},{\"type\":\"mw\"}`\n</js>"}, "ruleContent": {"content": "<js>\nlet url = java.hexDecodeToString(result);\nresult = java.ajax(Api(url));\nresult = JSON.parse(result);\n\nlet content;\nlet code = result.code;\nlet msg = result.message;\n\nif (code != 0) {\n  content = msg;\n} else {\n  let text = result.data.paragraphs;\n  let enabled = result.data.comment.enabled;\n  let bubble = enabled ? result.data.comment.bubble.svg : \"\";\n\n  var contents = [];\n  for (var i = 0; i < text.length; i++) {\n    var item = text[i];\n    var html = \"\";\n    if (item.comment_count > 0 && enabled && bubble != '') {\n      html = '<p>' + item.text + createBubble(item.comment_count, item.comment_url, bubble) + '</p>';\n    } else {\n      html = item.text;\n    }\n    if (item.image) {\n      if (typeof item.image === 'string') {\n        html += '<img src=\"' + item.image + '\">';\n      } else if (Array.isArray(item.image)) {\n        for (var j = 0; j < item.image.length; j++) {\n          html += '<img src=\"' + item.image[j] + '\">';\n        }\n      }\n    }\n\n    contents.push(html);\n  }\n\n  content = contents.join(\"\\n\");\n}\n</js>"}, "ruleExplore": [], "ruleSearch": {"author": "author", "bookList": "<js>\nresult = JSON.parse(result);\nif (result.code!=0) {\n    result = {\"data\":{\"items\":[\n            {\n                \"name\": \"❗❗❗当前未登录状态\",\n                \"author\": \"请登录后使用\",\n                \"latestChapterTitle\":\"请注册账号并登陆\",\n                \"cover\": \"http://fc3tn.baidu.com/it/u=1573211303,3438572022&fm=203&src=787&fc_m=cvican\",\n                \"description\":result.message,\n                \"id\":\"\",\n                \"source\":\"\"\n            }\n        ]}}\n}\nJSON.stringify(result)\n</js>\n$.data.items", "bookUrl": "/api/book/detail?source={{$.source}}&book_id={{$.id}}\n<js>\n`data:;base64,${java.base64Encode(result)},{\"type\":\"mw\"}`\n</js>", "checkKeyWord": "我的", "coverUrl": "cover", "intro": "description", "kind": "{{$.category}},{{$.status}}", "lastChapter": "源站：{{$.source}}", "name": "name"}, "ruleToc": {"chapterList": "<js>\nlet url = java.hexDecodeToString(result);\njava.ajax(Api(url));\n</js>\n$.data.chapters", "chapterName": "$.name", "chapterUrl": "/api/chapter/content?source={{$.source}}&chapter_id={{$.id}}\n<js>\n`data:;base64,${java.base64Encode(result)},{\"type\":\"mw\"}`\n</js>"}, "searchUrl": "<js>Api('/api/search?keyword={{key}}&page={{page}}&page_size=20')</js>", "weight": 0},{"bookSourceComment": "小雨的世界 · 起点中文\n交流群：1104270100\n登录界面可配置评论样式与自订配置（支持安卓+ios自订阅）\n所有接口算法来自于https://m.tb.cn/h.8pvBZxh?tk=R4fMTSqAOiS\n免费看七天请求无限制，喜欢就来闲鱼支持一下吧", "bookSourceGroup": "起点", "bookSourceName": "小雨的世界", "bookSourceType": 0, "bookSourceUrl": "小雨的世界", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nresult = xyExplore(this);", "jsLib": "var XY_API = {\n  root: \"https://full.hnxianxin.cn/qd/\",\n  coverPath: \"https://bookcover.yuewen.com/qdbimg/349573/\",\n};\n\nvar XY_TEXT_SITES = { 11: 1, 12: 1, 4: 1 };\nvar XY_QUERY_NAMES = {\n  categoryid: \"category_id\",\n  subcategoryid: \"subcategory_id\",\n  classid: \"class_id\",\n  actionstatus: \"action_status\",\n  wordscount: \"words_count\",\n  paidmode: \"paid_mode\",\n  tagtype: \"tag_type\",\n  great: \"great\",\n  endure: \"endure\",\n  tagid: \"tag_ids\",\n};\nvar XY_FILTER_TITLES = {\n  actionstatus: \"连载状态\",\n  wordscount: \"字数范围\",\n  paidmode: \"付费模式\",\n  tagtype: \"标签匹配\",\n  classid: \"标签筛选\",\n  great: \"精品筛选\",\n  endure: \"耐看筛选\",\n};\n\nfunction xyBridge(ctx) {\n  if (ctx && ctx.java) return ctx.java;\n  if (typeof java !== \"undefined\") return java;\n  return null;\n}\n\nfunction xySource(ctx) {\n  if (ctx && ctx.source) return ctx.source;\n  if (typeof source !== \"undefined\") return source;\n  return null;\n}\n\nfunction xyState(ctx) {\n  var holder = xySource(ctx);\n  var state = {};\n  try {\n    state = JSON.parse(holder.getVariable() || \"{}\");\n  } catch (error) {\n    state = {};\n  }\n  if (!state || typeof state !== \"object\") state = {};\n  if (state.xySite === \"男站\") state.xySite = \"男生\";\n  if (state.xySite === \"女站\") state.xySite = \"女生\";\n  if (!state.xySite || !XY_TEXT_SITES[String(xySiteIdByName(state.xySite))])\n    state.xySite = \"男生\";\n  if (!state.xyOrderName || state.xyOrderName === \"默认榜单\")\n    state.xyOrderName = \"人气最高\";\n  if (!state.xyCategoryName) state.xyCategoryName = \"全部\";\n  if (!state.xyActionStatusName) state.xyActionStatusName = \"不限\";\n  if (!state.xyWordsCountName) state.xyWordsCountName = \"不限\";\n  if (!state.xyPaidModeName) state.xyPaidModeName = \"不限\";\n  if (!state.xyTagTypeName) state.xyTagTypeName = \"包含任意已选标签\";\n  if (!state.xyGreatName) state.xyGreatName = \"不限\";\n  if (!state.xyEndureName) state.xyEndureName = \"不限\";\n  if (!state.xyTagValue) state.xyTagValue = \"\";\n  if (state.xyShowPara !== false) state.xyShowPara = true;\n  if (state.xyShowChapter !== false) state.xyShowChapter = true;\n  if (state.xyLargeBubble !== false) state.xyLargeBubble = true;\n  if (state.xyCustomMode !== true) state.xyCustomMode = false;\n  state.xyYwkey = String(state.xyYwkey || \"\");\n  state.xyYwguid = String(state.xyYwguid || \"\");\n  return state;\n}\n\nfunction xySiteIdByName(name) {\n  if (name === \"女生\") return 12;\n  if (name === \"出版\") return 4;\n  return 11;\n}\n\nfunction xyGet(ctx, key, fallback) {\n  var state = xyState(ctx);\n  return Object.prototype.hasOwnProperty.call(state, key)\n    ? state[key]\n    : fallback;\n}\n\nfunction xyAjax(ctx, url) {\n  var bridge = xyBridge(ctx);\n  if (!bridge) throw new Error(\"java context is unavailable\");\n  return bridge.ajax(url);\n}\n\nfunction xyJson(ctx, url) {\n  return JSON.parse(xyAjax(ctx, url));\n}\n\nfunction xySearchUrl(ctx, keyword, page) {\n  var value = String(keyword || \"\").replace(/^\\s+|\\s+$/g, \"\");\n  var pageNumber = Math.max(1, parseInt(String(page || \"1\"), 10) || 1);\n  return (\n    XY_API.root +\n    \"search.php?keyword=\" +\n    encodeURIComponent(value) +\n    \"&site=1&page=\" +\n    pageNumber +\n    \"&page_size=20\"\n  );\n}\n\nfunction xyDetailUrl(ctx, id) {\n  return (\n    XY_API.root + \"detail.php?bookId=\" + encodeURIComponent(String(id || \"\"))\n  );\n}\n\nfunction xyCatalogUrl(ctx, id) {\n  return (\n    XY_API.root + \"catalog.php?bookId=\" + encodeURIComponent(String(id || \"\"))\n  );\n}\n\nfunction xyCoverUrl(ctx, id) {\n  return XY_API.coverPath + encodeURIComponent(String(id || \"\")) + \"/180\";\n}\n\nfunction xyNormalizeBase64(value) {\n  var encoded = String(value || \"\").replace(/\\s+/g, \"\");\n  encoded = encoded.replace(/-/g, \"+\").replace(/_/g, \"/\");\n  while (encoded.length % 4) encoded += \"=\";\n  return encoded;\n}\n\nfunction xyDecodeChapter(ctx, value) {\n  var text = String(value || \"\");\n  try {\n    text = decodeURIComponent(text);\n  } catch (error) {}\n  if (text.charAt(0) === \"{\") return JSON.parse(text);\n  var match = text.match(/base64,([A-Za-z0-9+\\/=_%-]+)/i);\n  var encoded = match ? match[1] : text;\n  if (!encoded) throw new Error(\"章节地址无效\");\n  var separator = encoded.indexOf(\",\");\n  if (separator >= 0) encoded = encoded.substring(0, separator);\n  var json = xyBridge(ctx).base64Decode(xyNormalizeBase64(encoded));\n  var data = JSON.parse(json);\n  if (\n    !data ||\n    !data.bookId ||\n    data.chapterId === undefined ||\n    data.chapterId === null ||\n    data.chapterId === \"\"\n  ) {\n    throw new Error(\"章节信息无效\");\n  }\n  if (\n    !Object.prototype.hasOwnProperty.call(data, \"time\") ||\n    !/^\\d+$/.test(String(data.time))\n  ) {\n    throw new Error(\"章节时间戳无效，请刷新目录\");\n  }\n  if (String(data.time) === \"0\") {\n    throw new Error(\"章节时间戳无效，请刷新目录\");\n  }\n  return data;\n}\n\nfunction xyChapterPayload(ctx, value) {\n  return String(xyBridge(ctx).hexDecodeToString(String(value || \"\")) || \"\");\n}\n\nfunction xyCustomHeaders(ctx) {\n  var state = xyState(ctx);\n  if (!state.xyCustomMode || !state.xyYwkey || !state.xyYwguid) return null;\n  return { Ywkey: String(state.xyYwkey), Ywguid: String(state.xyYwguid) };\n}\n\nfunction xyContentUrl(ctx, value) {\n  var data = xyDecodeChapter(ctx, value);\n  var vip = Number(data.v !== undefined ? data.v : data.vip) ? 1 : 0;\n  var epub = Number(data.epub) ? 1 : 0;\n  var url =\n    XY_API.root +\n    \"content.php?bookId=\" +\n    encodeURIComponent(String(data.bookId)) +\n    \"&chapterId=\" +\n    encodeURIComponent(String(data.chapterId)) +\n    \"&t=\" +\n    encodeURIComponent(String(data.time)) +\n    \"&epub=\" +\n    epub +\n    \"&v=\" +\n    vip;\n  var headers = xyCustomHeaders(ctx);\n  return headers ? url + \",\" + JSON.stringify({ headers: headers }) : url;\n}\n\nfunction xyQuery(ctx, url, name) {\n  var match = String(url || \"\").match(\n    new RegExp(\"[?&]\" + name + \"=([^&]+)\", \"i\"),\n  );\n  if (!match) return \"\";\n  try {\n    return decodeURIComponent(match[1]);\n  } catch (error) {\n    return match[1];\n  }\n}\n\nfunction xyCleanText(value) {\n  var images = [];\n  var text = String(value || \"\").replace(/<img\\b[^>]*>/gi, function (tag) {\n    images.push(tag);\n    return \"\\n@@XY_IMG_\" + (images.length - 1) + \"@@\\n\";\n  });\n  text = text\n    .replace(/<br\\s*\\/?>/gi, \"\\n\")\n    .replace(/<\\/p>/gi, \"\\n\")\n    .replace(/<[^>]+>/g, \"\")\n    .replace(/&nbsp;/g, \" \")\n    .replace(/&amp;/g, \"&\")\n    .replace(/&lt;/g, \"<\")\n    .replace(/&gt;/g, \">\")\n    .replace(/\\r\\n?/g, \"\\n\");\n  return text.replace(/@@XY_IMG_(\\d+)@@/g, function (all, index) {\n    return images[Number(index)] || \"\";\n  });\n}\n\nfunction xyH5Url(bookId, chapterId, paragraphId) {\n  var url =\n    XY_API.root +\n    \"index.html?bookId=\" +\n    encodeURIComponent(String(bookId)) +\n    \"&chapterId=\" +\n    encodeURIComponent(String(chapterId));\n  if (paragraphId !== undefined && paragraphId !== null && paragraphId !== \"\") {\n    url += \"&paragraphIndex=\" + encodeURIComponent(String(paragraphId));\n  }\n  return url;\n}\n\nfunction xyShowComment(bridge, url, title) {\n  if (bridge && url) bridge.startBrowser(String(url), String(title || \"评论\"));\n}\n\nfunction xyCommentCounts(ctx, bookId, chapterId) {\n  var map = {};\n  var chapterCount = 0;\n  try {\n    var response = xyJson(\n      ctx,\n      XY_API.root +\n        \"review.php?bookId=\" +\n        encodeURIComponent(String(bookId)) +\n        \"&chapterId=\" +\n        encodeURIComponent(String(chapterId)),\n    );\n    var root = response.data || response.Data || {};\n    var list = (root.Getparagraphscommentcounts || {}).DataList || [];\n    for (var index = 0; index < list.length; index++) {\n      var item = list[index];\n      var paragraph = Number(item.ParagraphId);\n      var count = Number(item.CommentCount);\n      if (paragraph === -1) {\n        chapterCount = count;\n      } else if (paragraph >= 0 && count > 0) {\n        map[String(paragraph)] = {\n          count: count,\n          hot: Number(item.HasHotComment || item.hasHotComment || 0) === 1,\n        };\n      }\n    }\n  } catch (error) {\n    try {\n      xyBridge(ctx).log(\"评论数量获取失败：\" + error);\n    } catch (ignored) {}\n  }\n  return { map: map, chapter: chapterCount };\n}\n\nfunction xyCommentBubble(ctx, count, bookId, chapterId, paragraphId, hot) {\n  var bridge = xyBridge(ctx);\n  if (!bridge || !bridge.base64Encode) return \"\";\n  var display = Number(count) > 99 ? \"99+\" : String(Number(count) || 0);\n  var font = \"system-ui,-apple-system,Arial,sans-serif\";\n  var svg =\n    '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"5 14 45 36\" width=\"180\" height=\"144\">' +\n    '<path d=\"M44 48 Q48 48 48 44 L48 20 Q48 16 44 16 L20 16 Q16 16 16 20 L16 24 S16 28 10 30 Q6 32 10 34 Q16 36 16 38 L16 44 Q16 48 20 48 Z\" fill=\"none\" stroke=\"#666666\" stroke-width=\"0.7\"/>' +\n    '<text x=\"32\" y=\"36.5\" text-anchor=\"middle\" font-family=\"' +\n    font +\n    '\" font-weight=\"600\" font-size=\"11\" fill=\"#666666\">' +\n    display +\n    \"</text></svg>\";\n  var options = {\n    style: xyGet(ctx, \"xyLargeBubble\", true) ? \"TEXT\" : \"text\",\n    type: \"xy\",\n    status: hot ? \"emphasis\" : \"normal\",\n    click:\n      \"xyShowComment(java,\" +\n      JSON.stringify(xyH5Url(bookId, chapterId, paragraphId)) +\n      ',\"段评\")',\n    marker: \"xyComment:\" + bookId + \":\" + chapterId + \":\" + paragraphId,\n  };\n  return (\n    '<img src=\"data:' +\n    \"image/svg+xml;base64,\" +\n    bridge.base64Encode(svg) +\n    \",\" +\n    JSON.stringify(options) +\n    '\">'\n  );\n}\n\nfunction xyXmlEscape(text) {\n  return String(text || \"\")\n    .replace(/&/g, \"&amp;\")\n    .replace(/</g, \"&lt;\")\n    .replace(/>/g, \"&gt;\")\n    .replace(/\"/g, \"&quot;\");\n}\n\nfunction xyCommentCard(ctx, count, bookId, chapterId) {\n  var bridge = xyBridge(ctx);\n  if (!bridge || !bridge.base64Encode || Number(count) <= 0) return \"\";\n  var width = 1080,\n    height = 150,\n    left = 60,\n    right = 60;\n  var svg =\n    '<svg width=\"' +\n    width +\n    '\" height=\"' +\n    height +\n    '\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">' +\n    '<rect x=\"2\" y=\"2\" width=\"' +\n    (width - 4) +\n    '\" height=\"' +\n    (height - 4) +\n    '\" fill=\"rgba(255,255,255,0.25)\" rx=\"59\" stroke=\"#888\" stroke-width=\"1\"/>' +\n    '<text x=\"' +\n    left +\n    '\" y=\"88\" font-size=\"46\" font-family=\"Segoe UI,Arial,sans-serif\" fill=\"#333333\">本章说</text>' +\n    '<text x=\"' +\n    (width - right) +\n    '\" y=\"86\" font-size=\"38\" text-anchor=\"end\" font-family=\"Segoe UI,Arial,sans-serif\" fill=\"#666666\">' +\n    xyXmlEscape(Number(count) + \"条评论 ❯\") +\n    \"</text>\" +\n    \"</svg>\";\n  var options = {\n    style: \"FULL\",\n    click:\n      \"xyShowComment(java,\" +\n      JSON.stringify(xyH5Url(bookId, chapterId)) +\n      ',\"本章评论\")',\n    marker: \"xyCommentTail:\" + bookId + \":\" + chapterId,\n  };\n  return (\n    '<img src=\"data:' +\n    \"image/svg+xml;base64,\" +\n    bridge.base64Encode(svg) +\n    \",\" +\n    JSON.stringify(options) +\n    '\">'\n  );\n}\n\nfunction xyFormatContent(ctx, body, baseUrl) {\n  var response;\n  try {\n    response = JSON.parse(body);\n  } catch (error) {\n    throw new Error(\"正文响应不是JSON：\" + String(body).substring(0, 120));\n  }\n  if (response.error) throw new Error(response.error);\n  if (response.detail) throw new Error(response.detail);\n  if (\n    response.code !== undefined &&\n    Number(response.code) !== 0 &&\n    response.msg\n  )\n    throw new Error(response.msg);\n\n  var content =\n    response.content ||\n    response.Content ||\n    (response.Data && response.Data.Content) ||\n    \"\";\n  if (!content) throw new Error(\"正文内容为空\");\n\n  var bookId = xyQuery(ctx, baseUrl, \"bookId\");\n  var chapterId = xyQuery(ctx, baseUrl, \"chapterId\");\n  var state = xyState(ctx);\n  var counts =\n    state.xyShowPara || state.xyShowChapter\n      ? xyCommentCounts(ctx, bookId, chapterId)\n      : { map: {}, chapter: 0 };\n  var lines = xyCleanText(content).split(\"\\n\");\n  var output = [];\n  var paragraphIndex = 1;\n\n  for (var index = 0; index < lines.length; index++) {\n    var line = lines[index].replace(/^\\s+|\\s+$/g, \"\");\n    if (!line) continue;\n    if (/<img\\b/i.test(line)) {\n      output.push(line);\n      continue;\n    }\n    var idea = counts.map[String(paragraphIndex)];\n    if (\n      state.xyShowPara &&\n      idea &&\n      idea.count > 0 &&\n      line.indexOf(\n        \"xyComment:\" + bookId + \":\" + chapterId + \":\" + paragraphIndex,\n      ) < 0\n    ) {\n      line +=\n        \" \" +\n        xyCommentBubble(\n          ctx,\n          idea.count,\n          bookId,\n          chapterId,\n          paragraphIndex,\n          idea.hot,\n        );\n    }\n    output.push(line);\n    paragraphIndex++;\n  }\n\n  if (state.xyShowChapter) {\n    var card = xyCommentCard(ctx, counts.chapter, bookId, chapterId);\n    if (card) output.push(\"\", card);\n  }\n  return output.join(\"\\n\");\n}\nfunction xySearchItems(ctx, body) {\n  var response = JSON.parse(body);\n  var cards = (response.Data || {}).CardList || [];\n  var output = [];\n  for (var cardIndex = 0; cardIndex < cards.length; cardIndex++) {\n    var rows = cards[cardIndex].Body || [];\n    for (var rowIndex = 0; rowIndex < rows.length; rowIndex++) {\n      var item = rows[rowIndex].ItemData;\n      if (item && Number(item.BookId) > 0 && Number(item.BookType) === 1) {\n        output.push(JSON.stringify(item));\n      }\n    }\n  }\n  return output;\n}\n\nfunction xyExploreItems(ctx, body) {\n  var list = (JSON.parse(body).Data || {}).Books || [];\n  var output = [];\n  for (var index = 0; index < list.length; index++)\n    output.push(JSON.stringify(list[index]));\n  return output;\n}\n\nfunction xyKind(data) {\n  var values = [\n    data.CategoryName,\n    data.SubCategoryName,\n    data.ActionStatusString,\n    data.BookStatus,\n    data.WordsCount,\n  ];\n  var tags = data.BookTags || [];\n  for (var tagIndex = 0; tagIndex < tags.length && tagIndex < 4; tagIndex++)\n    values.push(tags[tagIndex]);\n  var output = [];\n  for (var index = 0; index < values.length; index++) {\n    var value = String(values[index] || \"\").replace(/^\\s+|\\s+$/g, \"\");\n    if (value && value !== \"0\") output.push(value);\n  }\n  return output.join(\"·\");\n}\n\nfunction xyFallbackConfig() {\n  return {\n    sites: [\n      { Id: 11, Name: \"男生\" },\n      { Id: 12, Name: \"女生\" },\n      { Id: 4, Name: \"出版\" },\n    ],\n    orders: [{ Id: 11, Name: \"人气最高\" }],\n    lines: [],\n    filterOne: [],\n    valid: false,\n  };\n}\n\nfunction xyConfigLine(lines, tag) {\n  for (var index = 0; index < (lines || []).length; index++) {\n    if (lines[index].Tag === tag) return lines[index];\n  }\n  return {};\n}\n\nfunction xyOptions(line) {\n  return line && line.FilterUnions ? line.FilterUnions : [];\n}\n\nfunction xyNames(options) {\n  var output = [];\n  for (var index = 0; index < (options || []).length; index++)\n    output.push(String(options[index].Name));\n  return output;\n}\n\nfunction xySelected(options, name) {\n  for (var index = 0; index < (options || []).length; index++) {\n    if (String(options[index].Name) === String(name)) return options[index];\n  }\n  return options && options.length ? options[0] : null;\n}\n\nfunction xyOptional(options, name) {\n  if (!name) return null;\n  for (var index = 0; index < (options || []).length; index++) {\n    if (String(options[index].Name) === String(name)) return options[index];\n  }\n  return null;\n}\n\nfunction xyOptionId(options, name, fallback) {\n  var selected = xySelected(options, name);\n  return selected && selected.Id !== undefined ? selected.Id : fallback;\n}\n\nfunction xyLoadConfig(ctx, state) {\n  var config = xyFallbackConfig();\n  var siteId = xyOptionId(config.sites, state.xySite, 11);\n  try {\n    var response = xyJson(\n      ctx,\n      XY_API.root + \"ranking.php?action=config&site_id=\" + siteId,\n    );\n    var data = response.Data || response.data || {};\n    var resultCode =\n      response.Result !== undefined\n        ? Number(response.Result)\n        : Number(response.result || 0);\n    if (resultCode === 0 && data) {\n      var sites = (data.SiteList || []).filter(function (item) {\n        return XY_TEXT_SITES[String(Number(item.Id))] === 1;\n      });\n      if (sites.length) config.sites = sites;\n      config.orders = data.Orders || [];\n      config.lines = data.FiltrLines || [];\n      config.filterOne = data.FilterOne || [];\n      config.valid = true;\n    }\n  } catch (error) {\n    try {\n      xyBridge(ctx).log(\"发现配置加载失败：\" + error);\n    } catch (ignored) {}\n  }\n  if (!config.orders.length) config.orders = xyFallbackConfig().orders;\n  return config;\n}\n\nfunction xySelectAction(key, title, clearKeys, syncInfo) {\n  var clear = \"\";\n  if (clearKeys && clearKeys.length) {\n    for (var index = 0; index < clearKeys.length; index++) {\n      clear += \"delete d[\" + JSON.stringify(clearKeys[index]) + \"];\";\n    }\n  }\n  var sync = syncInfo\n    ? \"xySyncExploreInfo(infoMap, \" + JSON.stringify(syncInfo) + \");\"\n    : \"\";\n  return (\n    \"var v=infoMap[\" +\n    JSON.stringify(title) +\n    \"]||(infoMap.get&&infoMap.get(\" +\n    JSON.stringify(title) +\n    \"));var d={};try{d=JSON.parse(source.getVariable()||'{}')}catch(e){}\" +\n    clear +\n    \"d.\" +\n    key +\n    \"=String(v||'');source.setVariable(JSON.stringify(d));\" +\n    sync +\n    \"try{source.refreshExplore()}catch(e){}try{java.refreshExplore()}catch(e){}\"\n  );\n}\n\nfunction xyHeader(rows, title) {\n  rows.push({\n    title: \"—— \" + title + \" ——\",\n    url: \"\",\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 },\n  });\n}\n\nfunction xyEntry(rows, title, url, basis) {\n  rows.push({\n    title: title,\n    url: url,\n    style: {\n      layout_flexGrow: 1,\n      layout_flexBasisPercent: basis === undefined ? -1 : basis,\n    },\n  });\n}\n\nfunction xyActionButton(rows, title, action, basis) {\n  rows.push({\n    title: title,\n    url: \"\",\n    type: \"button\",\n    action: action,\n    style: {\n      layout_flexGrow: 1,\n      layout_flexBasisPercent: basis === undefined ? -1 : basis,\n    },\n  });\n}\n\nfunction xyChip(rows, title, url, selected) {\n  rows.push({\n    title: (selected ? \"✅ \" : \"\") + title,\n    url: url,\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.25 },\n  });\n}\n\nfunction xySelect(rows, title, options, selected, action, viewName) {\n  var row = {\n    title: title,\n    url: \"\",\n    type: \"select\",\n    chars: xyNames(options),\n    default: String(selected ? selected.Name : \"\"),\n    action: action,\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.45 },\n  };\n  if (viewName) row.viewName = \"'\" + viewName + \"'\";\n  rows.push(row);\n}\n\nfunction xyFilterTitle(tag) {\n  return XY_FILTER_TITLES[tag] || tag;\n}\n\nfunction xyQueryName(tag) {\n  return XY_QUERY_NAMES[tag] || tag;\n}\n\nfunction xyWithState(state, key, value) {\n  var next = {};\n  for (var name in state) {\n    if (Object.prototype.hasOwnProperty.call(state, name))\n      next[name] = state[name];\n  }\n  if (value === undefined || value === null || value === \"\") delete next[key];\n  else next[key] = String(value);\n  return next;\n}\n\nfunction xyBlankOptions(options) {\n  return [{ Name: \"不限\" }].concat(options || []);\n}\n\nfunction xySelectedOption(line, name) {\n  if (!name || name === \"不限\") return null;\n  return xyOptional(xyOptions(line), name);\n}\n\nfunction xySelectedFilterOne(config, state, tag) {\n  var lines = config.filterOne || [];\n  for (var index = 0; index < lines.length; index++) {\n    if (lines[index].Tag !== tag) continue;\n    var name = tag === \"great\" ? state.xyGreatName : state.xyEndureName;\n    return xySelectedOption(lines[index], name);\n  }\n  return null;\n}\n\nfunction xySelectedTag(config, state) {\n  var groups = xyOptions(xyConfigLine(config.lines, \"classid\"));\n  var value = String(state.xyTagValue || \"\");\n  for (var groupIndex = 0; groupIndex < groups.length; groupIndex++) {\n    var group = groups[groupIndex];\n    var tags = group.Extvalue || [];\n    for (var tagIndex = 0; tagIndex < tags.length; tagIndex++) {\n      if (value === String(group.Id) + \":\" + String(tags[tagIndex].Id)) {\n        return { id: String(tags[tagIndex].Id), classId: String(group.Id) };\n      }\n    }\n  }\n  return null;\n}\n\nfunction xyResetExtendedState(state) {\n  var next = {};\n  for (var key in state) {\n    if (!Object.prototype.hasOwnProperty.call(state, key)) continue;\n    if (\n      key === \"xyActionStatusName\" ||\n      key === \"xyWordsCountName\" ||\n      key === \"xyPaidModeName\" ||\n      key === \"xyTagTypeName\" ||\n      key === \"xyGreatName\" ||\n      key === \"xyEndureName\" ||\n      key === \"xyTagValue\" ||\n      /^xyTag_/.test(key) ||\n      /^xyFilterOne_/.test(key)\n    )\n      continue;\n    next[key] = state[key];\n  }\n  return next;\n}\n\nfunction xySyncExploreInfo(infoMap, values) {\n  if (!infoMap) return;\n  for (var name in values) {\n    if (!Object.prototype.hasOwnProperty.call(values, name)) continue;\n    var value = values[name];\n    try {\n      if (value === undefined || value === null || value === \"\")\n        infoMap.remove(name);\n      else infoMap.put(name, String(value));\n    } catch (error) {}\n  }\n  try {\n    infoMap.saveNow();\n  } catch (error) {}\n}\n\nfunction xyResetMainExploreState(state) {\n  var next = {};\n  for (var key in state) {\n    if (!Object.prototype.hasOwnProperty.call(state, key)) continue;\n    if (\n      key === \"xySite\" ||\n      key === \"xyOrderName\" ||\n      key === \"xyCategoryName\" ||\n      key === \"xySubCategoryName\"\n    )\n      continue;\n    next[key] = state[key];\n  }\n  return next;\n}\n\nfunction xyResetMainExploreFilters(holder, bridge, infoMap) {\n  holder.setVariable(\n    JSON.stringify(xyResetMainExploreState(xyState({ source: holder }))),\n  );\n  xySyncExploreInfo(infoMap, {\n    站点: \"男生\",\n    榜单: \"人气最高\",\n    分类: \"全部\",\n    子分类: null,\n  });\n  try {\n    holder.refreshExplore();\n  } catch (error) {}\n  try {\n    bridge.refreshExplore();\n  } catch (error) {}\n}\n\nfunction xyResetExtendedExploreFilters(holder, bridge, infoMap) {\n  holder.setVariable(\n    JSON.stringify(xyResetExtendedState(xyState({ source: holder }))),\n  );\n  xySyncExploreInfo(infoMap, {\n    连载状态: \"不限\",\n    字数范围: \"不限\",\n    付费模式: \"不限\",\n    标签匹配: \"包含任意已选标签\",\n    精品: \"不限\",\n    耐看: \"不限\",\n  });\n  try {\n    holder.refreshExplore();\n  } catch (error) {}\n  try {\n    bridge.refreshExplore();\n  } catch (error) {}\n}\n\nfunction xyRankingUrl(config, state, page, extra) {\n  var site = xySelected(config.sites, state.xySite);\n  var order = xySelected(config.orders, state.xyOrderName);\n  var categoryLine = xyConfigLine(config.lines, \"categoryid\");\n  var categories = xyOptions(categoryLine);\n  var category = xySelected(categories, state.xyCategoryName);\n  var subcategory = xyOptional(\n    category && category.Extvalue,\n    state.xySubCategoryName,\n  );\n  var actionStatus = xySelectedOption(\n    xyConfigLine(config.lines, \"actionstatus\"),\n    state.xyActionStatusName,\n  );\n  var wordsCount = xySelectedOption(\n    xyConfigLine(config.lines, \"wordscount\"),\n    state.xyWordsCountName,\n  );\n  var paidMode = xySelectedOption(\n    xyConfigLine(config.lines, \"paidmode\"),\n    state.xyPaidModeName,\n  );\n  var selectedTag = xySelectedTag(config, state);\n  var tagType = selectedTag\n    ? xySelectedOption(\n        xyConfigLine(config.lines, \"tagtype\"),\n        state.xyTagTypeName,\n      )\n    : null;\n  var great = xySelectedFilterOne(config, state, \"great\");\n  var endure = xySelectedFilterOne(config, state, \"endure\");\n\n  var params = {\n    action: \"ranking\",\n    site_id: String(site ? site.Id : 11),\n    order: String(order ? order.Id : 11),\n    page: String(page),\n    page_size: \"20\",\n    category_id: String(category ? category.Id : 0),\n  };\n  if (\n    subcategory &&\n    subcategory.Id !== undefined &&\n    String(subcategory.Id) !== \"0\"\n  ) {\n    params.subcategory_id = String(subcategory.Id);\n  }\n  if (actionStatus) params.action_status = String(actionStatus.Id);\n  if (wordsCount) params.words_count = String(wordsCount.Id);\n  if (paidMode) params.paid_mode = String(paidMode.Id);\n  if (selectedTag) {\n    params.class_id = selectedTag.classId;\n    params.tag_ids = selectedTag.id;\n  }\n  if (tagType) params.tag_type = String(tagType.Id);\n  if (great) params.great = String(great.Id);\n  if (endure) params.endure = String(endure.Id);\n\n  if (extra) {\n    for (var key in extra) {\n      if (!Object.prototype.hasOwnProperty.call(extra, key)) continue;\n      var value = extra[key];\n      if (value === undefined || value === null || value === \"\") continue;\n      params[key] = String(value);\n    }\n  }\n\n  var query = [];\n  for (var name in params) {\n    if (!Object.prototype.hasOwnProperty.call(params, name)) continue;\n    if (name === \"subcategory_id\" && params[name] === \"0\") continue;\n    var encoded =\n      name === \"page\" ? params[name] : encodeURIComponent(params[name]);\n    query.push(name + \"=\" + encoded);\n  }\n  return XY_API.root + \"ranking.php?\" + query.join(\"&\");\n}\n\nfunction xyAddTagChips(rows, config, state) {\n  var groups = xyOptions(xyConfigLine(config.lines, \"classid\"));\n  if (!groups.length) return;\n  xyHeader(rows, \"标签筛选 · 单选\");\n  for (var groupIndex = 0; groupIndex < groups.length; groupIndex++) {\n    var group = groups[groupIndex];\n    var tags = group.Extvalue || [];\n    if (!tags.length) continue;\n    xyHeader(rows, String(group.Name));\n    for (var tagIndex = 0; tagIndex < tags.length; tagIndex++) {\n      var tag = tags[tagIndex];\n      var value = String(group.Id) + \":\" + String(tag.Id);\n      var selected = String(state.xyTagValue) === value;\n      var next = xyWithState(state, \"xyTagValue\", selected ? \"\" : value);\n      xyChip(\n        rows,\n        String(tag.Name),\n        xyRankingUrl(config, next, \"{{page}}\"),\n        selected,\n      );\n    }\n  }\n}\n\nfunction xySquareSiteId(state) {\n  return xySiteIdByName(state.xySite) === 12 ? 12 : 11;\n}\n\nfunction xySquareJumpQuery(jumpUrl) {\n  var text = String(jumpUrl || \"\");\n  var match = text.match(/[?&]query=([^&]+)/i);\n  if (!match) return {};\n  var raw = match[1];\n  try {\n    if (raw.indexOf(\"%7B\") === 0 || raw.indexOf(\"%7b\") === 0)\n      raw = decodeURIComponent(raw);\n    var parsed = JSON.parse(raw);\n    return parsed && typeof parsed === \"object\" ? parsed : {};\n  } catch (error) {\n    return {};\n  }\n}\n\nfunction xySquareRankingUrl(siteId, order, filter, category, page) {\n  var params = {\n    action: \"ranking\",\n    site_id: String(siteId),\n    order: String(order),\n    page: String(page),\n    page_size: \"20\",\n  };\n  if (\n    category !== undefined &&\n    category !== null &&\n    String(category) !== \"-1\"\n  ) {\n    params.category_id = String(category);\n  }\n  if (filter) params.filter = String(filter).replace(/=/g, \":\");\n  var query = [];\n  for (var name in params) {\n    if (!Object.prototype.hasOwnProperty.call(params, name)) continue;\n    query.push(\n      name +\n        \"=\" +\n        (name === \"page\" ? params[name] : encodeURIComponent(params[name])),\n    );\n  }\n  return XY_API.root + \"ranking.php?\" + query.join(\"&\");\n}\n\nfunction xySquareListUrl(itemId, page) {\n  return (\n    XY_API.root +\n    \"ranking.php?action=list&item_id=\" +\n    encodeURIComponent(String(itemId)) +\n    \"&page=\" +\n    page +\n    \"&page_size=100\"\n  );\n}\n\nfunction xySquareBlockUrl(name, data, state) {\n  var siteId = xySquareSiteId(state);\n  var title = data.Title || {};\n  var common = data.CommonExt || {};\n  var query = xySquareJumpQuery(title.JumpActionUrl);\n  var lowerName = String(name || \"\").toLowerCase();\n  var column = String(common.ColumnName || \"\");\n  if (query.itemId !== undefined && query.itemId !== null) {\n    return xySquareListUrl(query.itemId, \"{{page}}\");\n  }\n  if (query.filter !== undefined && query.filter !== null) {\n    return xySquareRankingUrl(\n      siteId,\n      1,\n      query.filter,\n      query.categoryId,\n      \"{{page}}\",\n    );\n  }\n  if (\n    String(title.JumpActionUrl || \"\").indexOf(\"SanJiang\") >= 0 ||\n    lowerName.indexOf(\"新书\") >= 0 ||\n    lowerName.indexOf(\"潜力\") >= 0 ||\n    column.indexOf(\"xinshu\") >= 0\n  ) {\n    return xySquareRankingUrl(siteId, 15, \"\", query.categoryId, \"{{page}}\");\n  }\n  if (lowerName.indexOf(\"免费\") >= 0) {\n    return xySquareRankingUrl(siteId, 11, \"paidmode:1\", 0, \"{{page}}\");\n  }\n  if (lowerName.indexOf(\"完本\") >= 0) {\n    return xySquareRankingUrl(siteId, 11, \"actionstatus:1\", 0, \"{{page}}\");\n  }\n  return xySquareRankingUrl(siteId, 11, \"\", query.categoryId, \"{{page}}\");\n}\n\nfunction xyLoadSquare(ctx, state) {\n  var sourceSiteId = xySiteIdByName(state.xySite);\n  if (sourceSiteId !== 11 && sourceSiteId !== 12) return [];\n  var siteId = xySquareSiteId(state);\n  var blocks = [];\n  try {\n    var response = xyJson(\n      ctx,\n      XY_API.root +\n        \"ranking.php?action=square&site=\" +\n        siteId +\n        \"&page=1&page_size=20\",\n    );\n    var resultCode =\n      response.Result !== undefined\n        ? Number(response.Result)\n        : Number(response.result || 0);\n    var items = (response.Data || response.data || {}).Items || [];\n    if (resultCode !== 0 || !items.length) return blocks;\n    for (var index = 0; index < items.length; index++) {\n      var data = items[index].Data || {};\n      var name = String((data.Title || {}).Name || \"\").replace(\n        /^\\s+|\\s+$/g,\n        \"\",\n      );\n      if (!name) continue;\n      var hasBooks = false;\n      var listKeys = [\"List\", \"BookList\", \"DataList\", \"Items\", \"ItemList\"];\n      for (var keyIndex = 0; keyIndex < listKeys.length; keyIndex++) {\n        var value = data[listKeys[keyIndex]];\n        if (value && value.length) hasBooks = true;\n      }\n      if (!hasBooks) continue;\n      blocks.push({ name: name, url: xySquareBlockUrl(name, data, state) });\n    }\n  } catch (error) {\n    try {\n      xyBridge(ctx).log(\"起点书城分块加载失败：\" + error);\n    } catch (ignored) {}\n  }\n  return blocks;\n}\n\nfunction xyAddSquareBlocks(ctx, rows, state) {\n  var blocks = xyLoadSquare(ctx, state);\n  if (!blocks.length) return;\n  xyHeader(rows, \"起点书城 · \" + state.xySite);\n  for (var index = 0; index < blocks.length; index++) {\n    xyChip(rows, blocks[index].name, blocks[index].url, false);\n  }\n}\n\nfunction xyExplore(ctx) {\n  var state = xyState(ctx);\n  var config = xyLoadConfig(ctx, state);\n  var categoryLine = xyConfigLine(config.lines, \"categoryid\");\n  var categories = xyOptions(categoryLine);\n  var site = xySelected(config.sites, state.xySite);\n  var order = xySelected(config.orders, state.xyOrderName);\n  var category = xySelected(categories, state.xyCategoryName);\n  var actionStatusLine = xyConfigLine(config.lines, \"actionstatus\");\n  var wordsCountLine = xyConfigLine(config.lines, \"wordscount\");\n  var paidModeLine = xyConfigLine(config.lines, \"paidmode\");\n  var tagTypeLine = xyConfigLine(config.lines, \"tagtype\");\n  var rows = [];\n\n  xyAddSquareBlocks(ctx, rows, state);\n  xyHeader(rows, \"主筛选 · 起点发现\");\n  xySelect(\n    rows,\n    \"站点\",\n    config.sites,\n    site,\n    xySelectAction(\"xySite\", \"站点\", [\"xyCategoryName\", \"xySubCategoryName\"], {\n      分类: \"全部\",\n      子分类: null,\n    }),\n    \"站点\",\n  );\n  xySelect(\n    rows,\n    \"榜单\",\n    config.orders,\n    order,\n    xySelectAction(\"xyOrderName\", \"榜单\"),\n    \"榜单\",\n  );\n  xySelect(\n    rows,\n    \"分类\",\n    categories,\n    category,\n    xySelectAction(\"xyCategoryName\", \"分类\", [\"xySubCategoryName\"], {\n      子分类: null,\n    }),\n    \"分类\",\n  );\n  var subcategoryOptions = xyBlankOptions(\n    (category && category.Extvalue) || [],\n  );\n  if (subcategoryOptions.length > 1) {\n    xySelect(\n      rows,\n      \"子分类\",\n      subcategoryOptions,\n      xySelected(subcategoryOptions, state.xySubCategoryName),\n      xySelectAction(\"xySubCategoryName\", \"子分类\"),\n      \"子类\",\n    );\n  }\n  xyActionButton(\n    rows,\n    \"重置主筛选（恢复默认）\",\n    \"xyResetMainExploreFilters(source, java, infoMap)\",\n    1,\n  );\n\n  xyHeader(rows, \"扩展筛选\");\n  xySelect(\n    rows,\n    \"连载状态\",\n    xyBlankOptions(xyOptions(actionStatusLine)),\n    { Name: state.xyActionStatusName },\n    xySelectAction(\"xyActionStatusName\", \"连载状态\"),\n    \"状态\",\n  );\n  xySelect(\n    rows,\n    \"字数范围\",\n    xyBlankOptions(xyOptions(wordsCountLine)),\n    { Name: state.xyWordsCountName },\n    xySelectAction(\"xyWordsCountName\", \"字数范围\"),\n    \"字数\",\n  );\n  xySelect(\n    rows,\n    \"付费模式\",\n    xyBlankOptions(xyOptions(paidModeLine)),\n    { Name: state.xyPaidModeName },\n    xySelectAction(\"xyPaidModeName\", \"付费模式\"),\n    \"付费\",\n  );\n  xySelect(\n    rows,\n    \"标签匹配\",\n    xyOptions(tagTypeLine),\n    { Name: state.xyTagTypeName },\n    xySelectAction(\"xyTagTypeName\", \"标签匹配\"),\n    \"匹配\",\n  );\n  xySelect(\n    rows,\n    \"精品\",\n    xyBlankOptions(xyOptions(xyConfigLine(config.filterOne, \"great\"))),\n    { Name: state.xyGreatName },\n    xySelectAction(\"xyGreatName\", \"精品\"),\n    \"精品\",\n  );\n  xySelect(\n    rows,\n    \"耐看\",\n    xyBlankOptions(xyOptions(xyConfigLine(config.filterOne, \"endure\"))),\n    { Name: state.xyEndureName },\n    xySelectAction(\"xyEndureName\", \"耐看\"),\n    \"耐看\",\n  );\n  xyActionButton(\n    rows,\n    \"重置扩展筛选\",\n    \"xyResetExtendedExploreFilters(source, java, infoMap)\",\n    1,\n  );\n\n  xyHeader(rows, \"结果操作\");\n  xyEntry(rows, \"当前结果\", xyRankingUrl(config, state, \"{{page}}\"), 1);\n\n  xyAddTagChips(rows, config, state);\n\n  if (!config.valid) {\n    xyHeader(rows, \"配置接口暂不可用，当前使用默认榜单\");\n  }\n  return JSON.stringify(rows);\n}", "lastUpdateTime": "1789049478823", "loginUi": "@js:\nresult = xyLoginUi(this);", "loginUrl": "function login(){}\nfunction xyLoginState() {\n  var state = {};\n  try {\n    state = JSON.parse(source.getVariable() || \"{}\");\n  } catch (error) {\n    state = {};\n  }\n  if (!state || typeof state !== \"object\") state = {};\n  if (state.xySite === \"男站\") state.xySite = \"男生\";\n  if (state.xySite === \"女站\") state.xySite = \"女生\";\n  if (\n    state.xySite !== \"男生\" &&\n    state.xySite !== \"女生\" &&\n    state.xySite !== \"出版\"\n  )\n    state.xySite = \"男生\";\n  if (!state.xyOrderName || state.xyOrderName === \"默认榜单\")\n    state.xyOrderName = \"人气最高\";\n  if (!state.xyCategoryName) state.xyCategoryName = \"全部\";\n  if (state.xyShowPara !== false) state.xyShowPara = true;\n  if (state.xyShowChapter !== false) state.xyShowChapter = true;\n  if (state.xyLargeBubble !== false) state.xyLargeBubble = true;\n  if (state.xyCustomMode !== true) state.xyCustomMode = false;\n  state.xyYwkey = String(state.xyYwkey || \"\");\n  state.xyYwguid = String(state.xyYwguid || \"\");\n  return state;\n}\n\nfunction xyLoginSave(state) {\n  source.setVariable(JSON.stringify(state));\n  try {\n    java.reLoginView();\n  } catch (error) {}\n}\n\nfunction xyLoginTogglePara() {\n  var state = xyLoginState();\n  state.xyShowPara = !state.xyShowPara;\n  xyLoginSave(state);\n  java.toast(\n    \"段评已\" + (state.xyShowPara ? \"开启\" : \"关闭\") + \"，请刷新当前章节\",\n  );\n}\n\nfunction xyLoginToggleChapter() {\n  var state = xyLoginState();\n  state.xyShowChapter = !state.xyShowChapter;\n  xyLoginSave(state);\n  java.toast(\n    \"章评已\" + (state.xyShowChapter ? \"开启\" : \"关闭\") + \"，请刷新当前章节\",\n  );\n}\n\nfunction xyLoginToggleLargeBubble() {\n  var state = xyLoginState();\n  state.xyLargeBubble = !state.xyLargeBubble;\n  xyLoginSave(state);\n  java.toast(\n    \"段评气泡已切换为\" +\n      (state.xyLargeBubble ? \"大气泡\" : \"小气泡\") +\n      \"，请刷新当前章节\",\n  );\n}\n\nfunction xyLoginSaveCredential() {\n  var state = xyLoginState();\n  state.xyYwkey = String((result && result.get(\"ywkey\")) || \"\").replace(\n    /^\\s+|\\s+$/g,\n    \"\",\n  );\n  state.xyYwguid = String((result && result.get(\"ywguid\")) || \"\").replace(\n    /^\\s+|\\s+$/g,\n    \"\",\n  );\n  xyLoginSave(state);\n  java.toast(\"自订凭证已保存\");\n}\n\nfunction xyLoginToggleCustom() {\n  var state = xyLoginState();\n  if (!state.xyCustomMode && (!state.xyYwkey || !state.xyYwguid)) {\n    java.toast(\"请先填写并保存 ywkey 与 ywguid\");\n    return;\n  }\n  state.xyCustomMode = !state.xyCustomMode;\n  xyLoginSave(state);\n  java.toast(\n    \"自订模式已\" +\n      (state.xyCustomMode ? \"开启\" : \"关闭\") +\n      \"，请刷新目录后生效\",\n  );\n}\n\nfunction xyLoginUi() {\n  var state = xyLoginState();\n  var rows = [];\n\n  function button(name, action) {\n    rows.push({\n      title: \"\",\n      url: \"\",\n      name: name,\n      type: \"button\",\n      action: action,\n      style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 },\n    });\n  }\n\n  function label(name) {\n    button(\"—— \" + name + \" ——\", \"void 0;\");\n  }\n\n  label(\"自订正文凭证\");\n  rows.push({\n    title: \"\",\n    url: \"\",\n    name: \"ywkey\",\n    type: \"text\",\n    default: state.xyYwkey || \"\",\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 },\n  });\n  rows.push({\n    title: \"\",\n    url: \"\",\n    name: \"ywguid\",\n    type: \"text\",\n    default: state.xyYwguid || \"\",\n    style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 },\n  });\n  button(\n    state.xyCustomMode ? \"✅ 自订模式已开启\" : \"⬜ 自订模式已关闭\",\n    \"xyLoginToggleCustom()\",\n  );\n  button(\"保存自订凭证\", \"xyLoginSaveCredential()\");\n\n  label(\"阅读评论\");\n  button(\n    state.xyShowPara ? \"✅ 段评气泡\" : \"⬜ 段评气泡\",\n    \"xyLoginTogglePara()\",\n  );\n  button(\n    state.xyLargeBubble ? \"✅ 大气泡（TEXT）\" : \"⬜ 小气泡（text）\",\n    \"xyLoginToggleLargeBubble()\",\n  );\n  button(\n    state.xyShowChapter ? \"✅ 章末评论\" : \"⬜ 章末评论\",\n    \"xyLoginToggleChapter()\",\n  );\n\n  return JSON.stringify(rows);\n}", "respondTime": 180000, "ruleBookInfo": {"author": "@js:\nresult = JSON.parse(result).Data.AuthorInfo.Author;", "coverUrl": "@js:\nresult = xyCoverUrl(this, JSON.parse(result).Data.BaseBookInfo.BookId);", "intro": "@js:\nresult = JSON.parse(result).Data.BaseBookInfo.Description;", "kind": "@js:\nvar d=JSON.parse(result).Data.BaseBookInfo;var blacklist=d.FreshManSimple&&Number(d.FreshManSimple.IsInBlackList||0);result=xyKind(d)+'·'+(blacklist?'非限免':'限免');", "lastChapter": "@js:\nvar d=JSON.parse(result).Data.BaseBookInfo.ChapterInfo;result=d.LastVipUpdateChapterName||d.LastUpdateChapterName;", "name": "@js:\nresult = JSON.parse(result).Data.BaseBookInfo.BookName;", "tocUrl": "@js:\nresult = xyCatalogUrl(this, JSON.parse(result).Data.BaseBookInfo.BookId);"}, "ruleContent": {"content": "@js:\nvar xyPayload = xyChapterPayload(this, result);\nvar xyUrl = xyContentUrl(this, xyPayload);\nvar xyBody = xyAjax(this, xyUrl);\nresult = xyFormatContent(this, xyBody, xyUrl);", "imageStyle": "DEFAULT"}, "ruleExplore": {"author": "$.AuthorName", "bookList": "$.Data.Books[*]||$.Data.Data.Items[*]", "bookUrl": "https://full.hnxianxin.cn/qd/detail.php?bookId={{$.BookId}}", "coverUrl": "@js:\nresult = xyCoverUrl(this, result.BookId);", "intro": "$.Description||$.Desc", "kind": "@js:\nresult = xyKind(result);", "lastChapter": "$.LastChapterName", "name": "$.BookName", "wordCount": "$.WordsCount"}, "ruleSearch": {"author": "$.AuthorName", "bookList": "$.Data.CardList[*].Body[*].ItemData", "bookUrl": "https://full.hnxianxin.cn/qd/detail.php?bookId={{$.BookId}}", "coverUrl": "@js:\nresult = xyCoverUrl(this, result.BookId);", "intro": "$.Description", "kind": "@js:\nresult = xyKind(result);", "lastChapter": "$.LastChapterName", "name": "$.BookName", "wordCount": "$.WordsCount"}, "ruleToc": {"chapterList": "$.data[*]", "chapterName": "$.N", "chapterUrl": "$.C", "isVip": "$.V", "isVolume": "$.Vo", "updateTime": "$.T"}, "searchUrl": "@js:\nresult = xySearchUrl(this, key, page);", "weight": 0},{"bookSourceComment": "", "bookSourceGroup": "玄幻小说", "bookSourceName": "海棠文学城", "bookSourceType": 0, "bookSourceUrl": "https://www.cncjbz.com", "bookUrlPattern": "", "concurrentRate": "1000", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": false, "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1789026031514", "loginUrl": "", "respondTime": 180000, "ruleBookInfo": {"author": "@css:meta[property=\"og:novel:author\"]@content", "canReName": "", "coverUrl": "@css:meta[property=\"og:image\"]@content##^http:##https:", "downloadUrls": "", "init": "", "intro": "id.intro@textNodes##^\\s+##", "kind": "@css:meta[property=\"og:novel:category\"]@content", "lastChapter": "@css:meta[property=\"og:novel:latest_chapter_name\"]@content", "name": "@css:meta[property=\"og:novel:book_name\"]@content", "tocUrl": "", "wordCount": ""}, "ruleContent": {"content": "id.content@html", "imageStyle": "", "nextContentUrl": "text.下一页@href", "payAction": "", "replaceRegex": "@js:(function(){\nvar s = String(result||'');\ns = s.replace(/(一秒记住[^\\n]{0,40}|www\\.cncjbz\\.com[^\\n]{0,40}|海棠文学城转载收集[^\\n]{0,60}|请记住本书首发域名[^\\n]{0,40})/gi,'');\nvar dict = {\"sE\": \"色\", \"hsE\": \"色\", \"Ye\": \"液\", \"nV\": \"女\", \"g0ng\": \"宫\", \"T\": \"体\", \"Si\": \"死\", \"X\": \"性\", \"W\": \"污\", \"r0U\": \"肉\", \"r0u\": \"肉\", \"yu\": \"欲\", \"m0\": \"摸\", \"C\": \"操\", \"h\": \"黄\", \"g\": \"干\", \"b\": \"比\", \"Y\": \"影\", \"Ai\": \"爱\", \"x\": \"胸\", \"r\": \"乳\", \"y\": \"硬\", \"x1\": \"吸\", \"cHa\": \"插\", \"Sh\": \"湿\", \"bA0\": \"苞\", \"GU\": \"股\", \"Gu\": \"股\", \"nEnG\": \"嫩\", \"T1aN\": \"舔\", \"SHeNY1N\": \"呻吟\", \"rUjiaNg\": \"乳尖\", \"x1ShUn\": \"吸吮\", \"GinJiNg\": \"精\", \"JiNg\": \"精\", \"yAn\": \"阳\", \"Shu\": \"湿\"};\nvar DJ = /[\\u4e00-\\u9fff]/;\nvar confirmed = {};\ns.replace(/[A-Za-z0-9]{1,20}/g, function(run, off){\n  if (dict[run] === undefined) return run;\n  var pre = off > 0 ? s.charAt(off-1) : '';\n  var post = off + run.length < s.length ? s.charAt(off + run.length) : '';\n  if (DJ.test(pre) || DJ.test(post)) confirmed[run] = true;\n  return run;\n});\nfunction engGuard(run, off){\n  var L = off > 0 ? s.charAt(off-1) : '';\n  var R = off + run.length < s.length ? s.charAt(off + run.length) : '';\n  var isLet = function(c){ return c && /[A-Za-z]/.test(c); };\n  if (R === '-' && isLet(s.charAt(off + run.length + 1))) return true;\n  if (L === '-' && isLet(s.charAt(off - 2))) return true;\n  var wl = s.slice(Math.max(0, off-10), off);\n  var wr = s.slice(off + run.length, Math.min(s.length, off + run.length + 10));\n  if (/[A-Za-z]{2}/.test(wl) && /[A-Za-z]{2}/.test(wr)) return true;\n  return false;\n}\ns = s.replace(/[A-Za-z0-9]{1,20}/g, function(run, off){\n  var dec = dict[run];\n  if (dec === undefined) return run;\n  var pre = off > 0 ? s.charAt(off-1) : '';\n  var post = off + run.length < s.length ? s.charAt(off + run.length) : '';\n  var nearCjk = DJ.test(pre) || DJ.test(post);\n  if (!nearCjk && !confirmed[run]) return run;\n  if (engGuard(run, off)) return run;\n  return dec;\n});\ns = s.replace(/&nbsp;/g,' ').replace(/&ensp;|&emsp;/g,' ').replace(/&amp;/g,'&');\ns = s.replace(/<\\s*br\\s*\\/?>/gi,'\\n').replace(/<\\/?p[^>]*>/gi,'\\n');\nreturn s;\n})()", "sourceRegex": "", "webJs": ""}, "ruleExplore": [], "ruleSearch": {"author": "class.author@tag.a@text", "bookList": "class.bookbox", "bookUrl": "class.bookimg@tag.a@href", "checkKeyWord": "", "coverUrl": "class.bookimg@tag.img@src", "intro": "class.bookinfo@tag.p@text", "kind": "class.cat@text##分类：", "lastChapter": "class.update@tag.a@text", "name": "class.bookname@tag.a@text", "wordCount": ""}, "ruleToc": {"chapterList": "class.listmain@tag.dd", "chapterName": "tag.a@text", "chapterUrl": "tag.a@href", "formatJs": "", "isVolume": "", "isVip": "", "isPay": "", "nextTocUrl": "", "updateTime": ""}, "searchUrl": "@js:(function(){\nvar BASE='https://www.cncjbz.com';\nvar kw=String(key||'');\nvar q=encodeURIComponent(kw);\nvar vp=Date.now();\nvar u=BASE+'/dshifisdhgujdu.html?act=pytohz&q='+q+'&ie=utf-8&vp='+vp;\nvar opt={method:'GET',headers:{'Cookie':'search_pass=1','Referer':BASE+'/'}};\nreturn u+','+JSON.stringify(opt);\n})()", "weight": 0},{"bookSourceComment": "//梦不觉", "bookSourceGroup": "影视", "bookSourceName": "奈飞工厂", "bookSourceType": 4, "bookSourceUrl": "https://www.netflixgc.com", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>\nvar host = \"https://www.netflixgc.com\";\nvar channels = { \"🎬 电影\": 1, \"📺 电视剧\": 2, \"🧸 漫剧\": 3, \"🎭 综艺\": 23, \"🎞️ 纪录片\": 24 };\nvar currentChannel = '🎬 电影';\ntry {\n  var saved = source.getVariable();\n  if (saved) {\n    var obj = JSON.parse(saved);\n    if (obj.channel) currentChannel = obj.channel;\n  }\n} catch(e) {}\nvar cid = channels[currentChannel] || 1;\n\nvar filters = {\n  \"类型\": {\n    \"1\": [\"全部\",\"喜剧\",\"爱情\",\"恐怖\",\"动作\",\"科幻\",\"剧情\",\"犯罪\",\"奇幻\",\"悬疑\",\"惊悚\",\"家庭\",\"冒险\",\"同性\",\"运动\",\"战争\",\"灾难\",\"NETFLIX\",\"HBO\",\"BBC ONE\",\"HULU\",\"APPLE TV\",\"FOX\"],\n    \"2\": [\"全部\",\"古装\",\"战争\",\"青春偶像\",\"喜剧\",\"爱情\",\"家庭\",\"犯罪\",\"动作\",\"奇幻\",\"剧情\",\"历史\",\"经典\",\"乡村\",\"情景\",\"商战\",\"恐怖\",\"悬疑\",\"惊悚\",\"冒险\",\"同性\",\"运动\",\"灾难\",\"NETFLIX\",\"HBO\",\"BBC ONE\",\"HULU\",\"APPLE TV\",\"FOX\",\"NBC\",\"其他\"],\n    \"3\": [\"全部\",\"搞笑\",\"热血\",\"催泪\",\"后宫\",\"机战\",\"致郁\",\"百合\",\"推理\",\"校园\",\"音乐\",\"社团\",\"装通\",\"战斗\",\"日常\",\"恋爱\",\"冒险\",\"魔幻\",\"喜剧\",\"动作\",\"奇幻\",\"剧情\",\"动画\",\"科幻\",\"NETFLIX\"],\n    \"23\": [\"全部\",\"真人秀\",\"搞笑\",\"音乐\",\"冒险\",\"爱情\",\"喜剧\",\"脱口秀\",\"NETFLIX\"],\n    \"24\": [\"全部\",\"人物\",\"军事\",\"历史\",\"文化\",\"探索\",\"科技\",\"自然\",\"剧情\",\"纪录片\",\"NETFLIX\"]\n  },\n  \"地区\": {\n    \"1\": [\"全部\",\"中国\",\"大陆\",\"香港\",\"台湾\",\"美国\",\"韩国\",\"日本\",\"泰国\",\"新加坡\",\"马来西亚\",\"印度\",\"英国\",\"法国\",\"瑞典\",\"瑞士\",\"乌克兰\",\"加拿大\",\"西班牙\",\"俄罗斯\",\"其它\"],\n    \"2\": [\"全部\",\"中国\",\"大陆\",\"香港\",\"台湾\",\"美国\",\"韩国\",\"日本\",\"泰国\",\"新加坡\",\"马来西亚\",\"印度\",\"英国\",\"法国\",\"瑞典\",\"瑞士\",\"乌克兰\",\"加拿大\",\"西班牙\",\"俄罗斯\",\"其它\"],\n    \"3\": [\"全部\",\"日本\",\"美国\",\"其他\"],\n    \"23\": [\"全部\",\"美国\",\"日本\",\"韩国\"],\n    \"24\": [\"全部\",\"美国\",\"日本\",\"韩国\",\"英国\"]\n  },\n  \"年份\": {\n    \"1\": [\"全部\",\"2026\",\"2025\",\"2024\",\"2023\",\"2022\",\"2021\",\"2020\",\"2019\",\"2018\",\"2017\",\"2016\",\"2015\",\"2014\",\"2013\",\"2012\",\"2011\",\"2010\",\"2009\",\"2008\",\"2007\",\"2006\",\"2005\",\"2004\",\"2003\",\"2002\",\"2001\",\"2000\",\"1999\",\"1998\",\"1997\",\"1996\",\"1995\",\"1994\",\"1993\",\"1992\",\"1991\",\"1990\",\"其他\"],\n    \"2\": [\"全部\",\"2026\",\"2025\",\"2024\",\"2023\",\"2022\",\"2021\",\"2020\",\"2019\",\"2018\",\"2017\",\"2016\",\"2015\",\"2014\",\"2013\",\"2012\",\"2011\",\"2010\",\"2009\",\"2008\",\"2007\",\"2006\",\"2005\",\"2004\",\"2003\",\"2002\",\"2001\",\"2000\"],\n    \"3\": [\"全部\",\"2026\",\"2025\",\"2024\",\"2023\",\"2022\",\"2021\",\"2020\",\"2019\",\"2018\",\"2017\",\"2016\",\"2015\",\"2014\",\"2013\",\"2012\",\"2011\",\"2010\",\"2009\",\"2008\",\"2007\",\"2006\",\"2005\",\"2004\",\"2003\",\"2002\",\"2001\",\"2000\",\"1999\",\"1998\",\"1997\",\"1996\",\"1995\",\"1994\",\"1993\",\"1992\",\"1991\",\"1990\",\"其他\"],\n    \"23\": [\"全部\",\"2026\",\"2025\",\"2024\",\"2023\",\"2022\",\"2021\",\"2020\",\"2019\",\"2018\",\"2017\",\"2016\",\"2015\",\"2014\",\"2013\",\"2012\",\"2011\",\"其他\"],\n    \"24\": [\"全部\",\"2026\",\"2025\",\"2024\",\"2023\",\"2022\",\"2021\",\"2020\",\"2019\",\"2018\",\"2017\",\"2016\",\"2015\",\"2014\",\"2013\",\"2012\",\"2011\",\"其他\"]\n  },\n  \"语言\": {\n    \"1\": [\"全部\",\"中文\",\"粤语\",\"闽南语\",\"英语\",\"日语\",\"韩语\",\"法语\",\"俄语\",\"德语\",\"泰语\",\"瑞典语\",\"印度语\"],\n    \"2\": [\"全部\",\"中文\",\"国语\",\"粤语\",\"闽南语\",\"英语\",\"日语\",\"韩语\",\"法语\",\"俄语\",\"德语\",\"泰语\",\"瑞典语\",\"印度语\",\"其它\"],\n    \"3\": [\"全部\",\"日语\",\"英语\"],\n    \"23\": [\"全部\",\"英语\",\"日语\",\"韩语\"],\n    \"24\": [\"全部\",\"英语\",\"日语\",\"韩语\"]\n  }\n};\n\nvar ui = [\n  { title: '关键字', type: 'text', default: '', style: { layout_flexBasisPercent: 1 } },\n  { title: '🔍 搜剧', type: 'button', action: \"var k=infoMap['关键字']; if(!k){ java.toast('请输入影片名称'); } else { java.searchBook(k, source); }\", style: { layout_flexBasisPercent: 1 } },\n  { title: '频道切换', type: 'select', chars: Object.keys(channels), default: currentChannel, action: \"var c=infoMap['频道切换']; var obj={}; try{obj=JSON.parse(source.getVariable());}catch(e){} obj.channel=c; source.setVariable(JSON.stringify(obj)); java.refreshExplore(); java.toast('已切换到: '+c);\", style: { layout_flexBasisPercent: 1 } }\n];\n\nfunction pushTag(group, name, urlStr) {\n  ui.push({ title: name, url: urlStr, style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.2 } });\n}\n\nvar sorts = [{name: \"按最新\", val: \"time\"}, {name: \"按最热\", val: \"hits\"}, {name: \"按评分\", val: \"score\"}];\nui.push({ title: '👇 【排行榜】', url: '', style: { layout_flexBasisPercent: 1, layout_flexGrow: 1 } });\nsorts.forEach(function(s) {\n  var apiBody = \"type=\"+cid+\"&class=&area=&year=&lang=&letter=&by=\"+s.val+\"&page={{page}}\";\n  var apiUrl = host + \"/index.php/ds_api/vod,{\\\"method\\\":\\\"POST\\\",\\\"body\\\":\\\"\" + apiBody + \"\\\"}\";\n  pushTag(\"排行\", s.name, apiUrl);\n});\n\nui.push({ title: '👇 【按类型】', url: '', style: { layout_flexBasisPercent: 1, layout_flexGrow: 1 } });\n(filters[\"类型\"][cid] || []).forEach(function(c) {\n  var cPath = c === \"全部\" ? \"\" : encodeURIComponent(c);\n  var apiBody = \"type=\"+cid+\"&class=\"+cPath+\"&area=&year=&lang=&letter=&by=time&page={{page}}\";\n  var apiUrl = host + \"/index.php/ds_api/vod,{\\\"method\\\":\\\"POST\\\",\\\"body\\\":\\\"\" + apiBody + \"\\\"}\";\n  pushTag(\"类型\", c, apiUrl);\n});\n\nui.push({ title: '👇 【按地区】', url: '', style: { layout_flexBasisPercent: 1, layout_flexGrow: 1 } });\n(filters[\"地区\"][cid] || []).forEach(function(a) {\n  var aPath = a === \"全部\" ? \"\" : encodeURIComponent(a);\n  var apiBody = \"type=\"+cid+\"&class=&area=\"+aPath+\"&year=&lang=&letter=&by=time&page={{page}}\";\n  var apiUrl = host + \"/index.php/ds_api/vod,{\\\"method\\\":\\\"POST\\\",\\\"body\\\":\\\"\" + apiBody + \"\\\"}\";\n  pushTag(\"地区\", a, apiUrl);\n});\n\nui.push({ title: '👇 【按年份】', url: '', style: { layout_flexBasisPercent: 1, layout_flexGrow: 1 } });\n(filters[\"年份\"][cid] || []).forEach(function(y) {\n  var yPath = y === \"全部\" ? \"\" : y;\n  var apiBody = \"type=\"+cid+\"&class=&area=&year=\"+yPath+\"&lang=&letter=&by=time&page={{page}}\";\n  var apiUrl = host + \"/index.php/ds_api/vod,{\\\"method\\\":\\\"POST\\\",\\\"body\\\":\\\"\" + apiBody + \"\\\"}\";\n  pushTag(\"年份\", y, apiUrl);\n});\n\nui.push({ title: '👇 【按语言】', url: '', style: { layout_flexBasisPercent: 1, layout_flexGrow: 1 } });\n(filters[\"语言\"][cid] || []).forEach(function(l) {\n  var lPath = l === \"全部\" ? \"\" : encodeURIComponent(l);\n  var apiBody = \"type=\"+cid+\"&class=&area=&year=&lang=\"+lPath+\"&letter=&by=time&page={{page}}\";\n  var apiUrl = host + \"/index.php/ds_api/vod,{\\\"method\\\":\\\"POST\\\",\\\"body\\\":\\\"\" + apiBody + \"\\\"}\";\n  pushTag(\"语言\", l, apiUrl);\n});\n\nJSON.stringify(ui);\n</js>", "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\"}", "lastUpdateTime": "1789005932602", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=og:novel:author]@content || .slide-info:matches(演员) a@text || .slide-info:contains(演员) a@text", "coverUrl": "meta[property=og:image]@content || .detail-pic img@data-src", "intro": "meta[property=og:description]@content || #height_limit@text || .text.cor3@text", "kind": "meta[property=og:novel:category]@content || .slide-info:matches(类型) a@text || .slide-info:contains(类型) a@text", "lastChapter": "meta[property=og:novel:latest_chapter_name]@content || .slide-info-remarks:nth-of-type(1)@text || .slide-info-remarks:eq(0)@text", "name": "meta[property=og:novel:book_name]@content || h3.slide-info-title@text"}, "ruleContent": {"content": "<js>\nvar out = '';\ntry {\n    // 抛弃正则，直接用字符串分割，完美避开嵌套大括号被截断的问题\n    var parts = String(result).split('var player_aaaa=');\n    if (parts.length > 1) {\n        // 截取到 </script> 之前的内容\n        var jsonStr = parts[1].split('</script>')[0].trim();\n        // 如果末尾有分号，则去掉分号，确保是纯净的 JSON\n        if (jsonStr.charAt(jsonStr.length - 1) === ';') {\n            jsonStr = jsonStr.slice(0, -1);\n        }\n        \n        var data = JSON.parse(jsonStr);\n        var url = String(data.url);\n        \n        if (data.encrypt == 2) {\n            var b64Str = String(java.base64Decode(url));\n            url = decodeURIComponent(b64Str);\n        } else if (data.encrypt == 1) {\n            url = decodeURIComponent(url);\n        }\n        \n        out = '' + url.replace(/\\\\\\//g, '/');\n    } else {\n        out = '⚠️ 解析失败，源码中未找到 player_aaaa 配置。';\n    }\n} catch(e) {\n    out = '⚠️ 解析异常：' + String(e);\n}\nout;\n</js>"}, "ruleExplore": {"author": "$.vod_actor", "bookList": "$.list", "bookUrl": "$.url", "coverUrl": "$.vod_pic", "intro": "$.vod_blurb", "kind": "$.vod_tag##<[^>]+>", "lastChapter": "$.vod_remarks", "name": "$.vod_name"}, "ruleSearch": {"author": ".slide-info:contains(演员) a@text", "bookList": ".search-list .flex.rel.overflow", "bookUrl": "a[href*=/voddetail/]@href", "coverUrl": "img@data-src", "kind": ".slide-info:contains(类型) a@text", "lastChapter": ".slide-info-remarks:eq(0)@text", "name": "h3.slide-info-title@text"}, "ruleToc": {"chapterList": ".anthology-list-play li a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "https://www.netflixgc.com/vodsearch/-------------.html?wd={{key}}", "weight": 0},{"bookSourceComment": "格格党网（www.ggd66.com 思思CMS·UTF-8）2026-09-09 重构\n【原站已失效】旧域名 www.ggd8.cc/m TLS 握手被重置（手机侧与本机均不可达），已迁移至同源镜像 www.ggd66.com\n1.搜索：GET /search/?searchkey=关键词（表单 POST 同用），单页返回 25~100 条、无分页控件\n2.【限频对策】站点搜索限30秒/次，实现方式=下发 Cookie ss_search_delay 标记，服务端只查标记不校验时间戳\n  → searchUrl 每次搜索前剔除该 Cookie 键（其余键原样保留）即可无等待连续搜索，已实测连搜4次全放行\n3.详情：og:novel:* meta 齐全；简介取 .bookintro 截断到 <br>（去掉站点宣传语）\n4.目录：详情页 #list-chapterAll 内 dd>a 全量内联无分页（实测最多 5951 章完整），dl 首个区是“最新章节”倒序已避开；按章节ID自动判序\n5.正文：#rtext 内逐段清洗——命中广告词时从该词处【截断】而非整段删除（站点常把广告拼在正文句尾，整删会误伤正文）；乱码域名按半角问号密集(占比>1/3)+域名/www./.vip 短行识别；全角？？？与【…】剧情内容不受影响\n6.章内分页：{章节ID}_{N}.html，nextContentUrl 只跟带下划线的链接；末页“下一页”指向下一章(无下划线)→返回空自然终止，杜绝串章\n7.发现：22 个入口=首页4榜(?tab=1~4 分发)+8分类+8完本分类+全部+全本大厅；列表解析器一次适配 bookbox/item/li/最近更新 四种模板\n8.【无需登录】全部正文匿名免费可读；登录UI为可选功能(永久书架同步)，站点登录无验证码，判据=GET /bookcase/ 含“永久书架”\n  注意：登录成功后不写 putLoginHeader，避免把限频 Cookie 固化进登录头拖累搜索\n9.bookUrlPattern=…/qu/[0-9]+/? 便于浏览器打开书籍页时一键导入\n10.列表/详情/目录/正文规则全用 @js:+jsoup 直取，实体统一交 jsoup Parser.unescapeEntities 解码（String.replace 只换首个的坑已避）\n使用前建议：书架里指向 ggd8.cc 的旧书需重新搜索添加", "bookSourceGroup": "AI", "bookSourceName": "格格党网", "bookSourceType": 0, "bookSourceUrl": "https://www.ggd66.com", "bookUrlPattern": "https?://www[.]ggd66[.]com/qu/[0-9]+/?", "customButton": false, "customOrder": 354, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "热门推荐::https://www.ggd66.com/?tab=4\n最近更新::https://www.ggd66.com/?tab=1\n最新入库::https://www.ggd66.com/?tab=2\n阅读排行::https://www.ggd66.com/?tab=3\n玄幻·连载::/sort/1/{{page}}/\n武侠·连载::/sort/2/{{page}}/\n都市·连载::/sort/3/{{page}}/\n历史·连载::/sort/4/{{page}}/\n科幻·连载::/sort/5/{{page}}/\n竞技·连载::/sort/6/{{page}}/\n女生·连载::/sort/7/{{page}}/\n其他·连载::/sort/8/{{page}}/\n全部·连载::/sort/{{page}}/\n完本·玄幻::/quanben/sort/1/{{page}}/\n完本·武侠::/quanben/sort/2/{{page}}/\n完本·都市::/quanben/sort/3/{{page}}/\n完本·历史::/quanben/sort/4/{{page}}/\n完本·科幻::/quanben/sort/5/{{page}}/\n完本·竞技::/quanben/sort/6/{{page}}/\n完本·女生::/quanben/sort/7/{{page}}/\n完本·其他::/quanben/sort/8/{{page}}/\n全本大厅::/quanben/sort/{{page}}/", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1788949753047", "loginCheckJs": "(function(){try{var b=String(result.body());if(b.indexOf('搜索间隔')>=0){throw new Error('⛔ 格格党·站点搜索限频(30秒/次)未解除，请稍候30秒再搜索');}if(b.indexOf('Attention Required')>=0){throw new Error('⛔ 格格党·访问被拦截，请稍后重试');}}catch(e){if(String(e).indexOf('格格党')>=0){throw e;}}return result;})()", "loginUi": "<js>JSON.stringify([{name:'账号',type:'text',hint:'4-10位英文或数字(未注册可留空直接点注册)'},{name:'密码',type:'password',hint:'6-20位英文或数字'},{name:'邮箱',type:'text',hint:'注册用，留空自动生成'},{name:'① 登录',type:'button',action:'login()',style:{layout_flexGrow:1}},{name:'② 注册',type:'button',action:'register()',style:{layout_flexGrow:1}},{name:'③ 检查登录状态',type:'button',action:'checkLogin()',style:{layout_flexGrow:1}},{name:'④ 退出登录',type:'button',action:'logout()',style:{layout_flexGrow:1}},{name:'⑤ 检查站点连接',type:'button',action:'checkSite()',style:{layout_flexGrow:1}}]);</js>", "loginUrl": "function HOST(){return 'https://www.ggd66.com';}function UAX(){return 'Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36';}function doLoginPost(b){var opt={method:'POST',body:b,headers:{'User-Agent':UAX(),'Content-Type':'application/x-www-form-urlencoded','Referer':HOST()+'/login/'},retry:1,timeout:20000};return String(java.ajax(HOST()+'/login/,'+JSON.stringify(opt)));}function isLogged(){try{var t=String(java.ajax(HOST()+'/bookcase/,'+JSON.stringify({method:'GET',headers:{'User-Agent':UAX()},retry:1,timeout:20000})));return t.indexOf('永久书架')>=0;}catch(e){return false;}}function login(){var f=result;var u=f['账号'];var p=f['密码'];if(!u||!p){java.toast('🔔 请先填写账号和密码');return;}var b='username='+encodeURIComponent(u)+'&password='+encodeURIComponent(p)+'&action=login&jumpurl='+encodeURIComponent('/bookcase/');try{var r=doLoginPost(b);if(r.indexOf('登陆失败')>=0){java.toast('❌ 登录失败：账号或密码错误');return;}if(isLogged()){java.toast('✅ 格格党·登录成功('+u+')，永久书架已可用');}else{java.toast('⚠️ 登录响应异常，请确认账号密码后重试');}}catch(e){java.toast('❌ 登录请求失败：'+String(e).substring(0,60));}}function register(){var f=result;var u=f['账号'];var p=f['密码'];if(!u||!p){java.toast('🔔 请先填写要注册的账号和密码');return;}if(u.length<4||u.length>10){java.toast('🔔 账号需4-10位英文或数字');return;}if(p.length<6||p.length>20){java.toast('🔔 密码需6-20位英文或数字');return;}var em=f['邮箱']||'';if(em===''){em=u+'@qq.com';}var opt={method:'POST',body:'username='+encodeURIComponent(u)+'&password='+encodeURIComponent(p)+'&repassword='+encodeURIComponent(p)+'&email='+encodeURIComponent(em)+'&action=register&jumpurl='+encodeURIComponent('/bookcase/'),headers:{'User-Agent':UAX(),'Content-Type':'application/x-www-form-urlencoded','Referer':HOST()+'/register/'},retry:1,timeout:20000};try{var r=String(java.ajax(HOST()+'/register/,'+JSON.stringify(opt)));if(r.indexOf('永久书架')>=0){java.toast('✅ 注册成功并已自动登录：'+u+'（'+em+'）');}else if(r.indexOf('已注册')>=0||r.indexOf('存在')>=0){java.toast('⚠️ 该账号或邮箱已存在，请直接登录');}else{java.toast('⚠️ 注册结果未知，请用「检查登录状态」确认');}}catch(e){java.toast('❌ 注册失败：'+String(e).substring(0,60));}}function checkLogin(){if(isLogged()){java.toast('✅ 已登录：永久书架/阅读记录云端同步可用');}else{java.toast('ℹ️ 未登录。本站看书无需登录，登录仅用于永久书架同步');}}function logout(){try{source.removeLoginHeader();}catch(e){}try{cookie.setCookie(HOST(),'');}catch(e){}java.toast('👋 已退出登录，本地书架不受影响');}function checkSite(){var hs=[HOST(),'https://www.huilingtian.com'];var i,t0,ms,ok=[];for(i=0;i<hs.length;i++){try{t0=new Date().getTime();var r=String(java.ajax(hs[i]+'/,'+JSON.stringify({method:'GET',headers:{'User-Agent':UAX()},retry:0,timeout:15000})));ms=new Date().getTime()-t0;ok.push(hs[i].replace('https://','')+' ✅ '+ms+'ms');}catch(e){ok.push(hs[i].replace('https://','')+' ❌ 不可达');}}java.longToast(ok.join(String.fromCharCode(10)));}", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=og:novel:author]@content", "coverUrl": "meta[property=og:image]@content", "intro": "@js:(function(){var d=(typeof result!=='undefined'&&result&&typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var x=d.select('.bookintro');if(x.size()<1)return '';var h=String(x.get(0).html());var i=h.indexOf('<br');if(i>0)h=h.substring(0,i);h=h.replace(new RegExp('<[^>]+>','g'),'');return Packages.org.jsoup.parser.Parser.unescapeEntities(h,true).trim();})()", "kind": "meta[property=og:novel:category]@content&&meta[property=og:novel:status]@content", "lastChapter": "meta[property=og:novel:lastest_chapter_name]@content", "name": "meta[property=og:novel:book_name]@content"}, "ruleContent": {"content": "@js:(function(){var d=(typeof result!=='undefined'&&result&&typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var n=d.select('#rtext');if(n.size()<1)n=d.select('.readcontent');if(n.size()<1)return '';var el=n.get(0),i,k,x;x=el.select('script');for(i=0;i<x.size();i++){x.get(i).remove();}x=el.select('style');for(i=0;i<x.size();i++){x.get(i).remove();}x=el.select('a');for(i=0;i<x.size();i++){x.get(i).remove();}var ad=['本章完','GOOGLE搜索','御宅屋','返回顶部','请收藏本站','txt下载','最快更新','新笔趣阁','全文免费阅读就在','记住本站','首发网站','台湾小说网','本书首发','全网首发','无错章节','无乱序','最快的章节更新'];var ps=el.select('p');var t,s2,wi,q,qi,cut,buf=[];for(i=0;i<ps.size();i++){t=String(ps.get(i).text());s2=t.trim();if(s2===''||s2==='*'){continue;}cut=false;for(k=0;k<ad.length;k++){wi=s2.indexOf(ad[k]);if(wi>=0){s2=s2.substring(0,wi).trim();cut=true;}}if(cut&&s2.length<4){continue;}q=0;for(qi=0;qi<s2.length;qi++){if(s2.charAt(qi)==='?'){q++;}}if(q>=6&&q*3>s2.length){continue;}if(s2.length<60&&s2.indexOf('域名')>=0){continue;}if(s2.length<40&&(s2.indexOf('www.')>=0||s2.indexOf('.vip')>=0||s2.indexOf('.cc')>=0||s2.indexOf('.net')>=0)){continue;}buf.push(Packages.org.jsoup.parser.Parser.unescapeEntities(s2,true));}if(buf.length===0){var tx=String(el.text()).trim();if(tx!==''){buf.push(Packages.org.jsoup.parser.Parser.unescapeEntities(tx,true));}}return buf.join(String.fromCharCode(10,10));})()", "nextContentUrl": "@js:(function(){var s=String(result);var i=s.indexOf('linkNext');if(i<0)return '';var j=s.indexOf('href=',i);if(j<0)return '';var q=s.charAt(j+5);if(q!==String.fromCharCode(34)&&q!==String.fromCharCode(39))return '';var u=s.substring(j+6,s.indexOf(q,j+6));if(u===''||u.indexOf('javascript')>=0)return '';var m=u.match(new RegExp('_[0-9]+[.]html$'));if(!m)return '';if(u.indexOf('http')===0)return u;var pp=String(baseUrl).split('/');return pp[0]+'/'+pp[1]+'/'+pp[2]+u;})()"}, "ruleExplore": {"author": "author", "bookList": "@js:(function(){var d=(typeof result!=='undefined'&&result&&typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var bu=String(typeof baseUrl==='undefined'?'':baseUrl);var pp=bu.split('/');var or=pp.length>2?pp[0]+'/'+pp[1]+'/'+pp[2]:'';function A(u){u=String(u===null?'':u);if(u===''||u.indexOf('javascript')===0)return '';if(u.indexOf('http')===0)return u;return or+u;}function T(e){if(e===null||typeof e==='undefined')return '';return String(e.text()).trim();}function un(s){return Packages.org.jsoup.parser.Parser.unescapeEntities(String(s),true).trim();}function cut(s){s=String(s);var i=s.search(new RegExp('[:：]'));if(i>=0)s=s.substring(i+1);return s.replace('[','').replace(']','').trim();}function C(el,cls){var x=el.select(cls);return x.size()>0?T(x.get(0)):'';}var tab=(bu.match(new RegExp('[?&]tab=([0-9]+)'))||['',''])[1];var out=[];var i,k,e,o,a,s,x,au;function P(o){if(o.name&&o.url)out.push(o);}if(tab==='1'||tab==='2'||tab==='3'){var sel=tab==='1'?'#gengxin li':(tab==='2'?'#zuixin li':'#fengyou li');x=d.select(sel);for(i=0;i<x.size();i++){e=x.get(i);a=e.select('a');if(a.size()<1)continue;o={name:un(T(a.get(0))),url:A(a.get(0).attr('href')),author:'',kind:'',lastChapter:'',intro:'',coverUrl:''};if(tab==='1'){o.author=un(C(e,'.s4'));o.kind=cut(C(e,'.s1'));o.lastChapter=un(C(e,'.s3 a'));}else{s=e.select('span');if(s.size()>0)o.author=un(T(s.get(0)));o.kind=cut(String(e.ownText()).trim());if(a.size()>1)o.lastChapter=un(T(a.get(1)));}P(o);}}else if(tab==='4'){x=d.select('.item');for(i=0;i<x.size();i++){e=x.get(i);a=e.select('dt a');if(a.size()<1)continue;s=e.select('dt span');o={name:un(T(a.get(0))),url:A(a.get(0).attr('href')),author:s.size()>0?un(T(s.get(0))):'',kind:'',lastChapter:'',intro:un(C(e,'dd')),coverUrl:''};var im=e.select('img');if(im.size()>0)o.coverUrl=String(im.get(0).attr('src'));P(o);}}else{x=d.select('.bookbox');if(x.size()===0)x=d.select('.item');var hk=d.select('h2');var kind=hk.size()>0?T(hk.get(0)).replace('小说列表','').trim():'';if(kind.indexOf('与')===0)kind='';for(i=0;i<x.size();i++){e=x.get(i);a=e.select('.bookname a');if(a.size()<1)continue;o={name:un(T(a.get(0))),url:A(a.get(0).attr('href')),author:'',kind:kind,lastChapter:'',intro:'',coverUrl:''};au=e.select('.author');for(k=0;k<au.size();k++){s=T(au.get(k));if(s.indexOf('作者')===0)o.author=cut(s);}if(!o.author){s=e.select('dt span');if(s.size()>0)o.author=un(T(s.get(0)));}o.lastChapter=un(C(e,'.cat a'));var up=e.select('.update');if(up.size()>0)o.intro=cut(un(T(up.get(0))));var im2=e.select('img');if(im2.size()>0)o.coverUrl=String(im2.get(0).attr('src'));P(o);}}return out;})()", "bookUrl": "url", "coverUrl": "coverUrl", "intro": "intro", "kind": "kind", "lastChapter": "lastChapter", "name": "name"}, "ruleSearch": {"author": "author", "bookList": "@js:(function(){var d=(typeof result!=='undefined'&&result&&typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var bu=String(typeof baseUrl==='undefined'?'':baseUrl);var pp=bu.split('/');var or=pp.length>2?pp[0]+'/'+pp[1]+'/'+pp[2]:'';function A(u){u=String(u===null?'':u);if(u===''||u.indexOf('javascript')===0)return '';if(u.indexOf('http')===0)return u;return or+u;}function T(e){if(e===null||typeof e==='undefined')return '';return String(e.text()).trim();}function un(s){return Packages.org.jsoup.parser.Parser.unescapeEntities(String(s),true).trim();}function cut(s){s=String(s);var i=s.search(new RegExp('[:：]'));if(i>=0)s=s.substring(i+1);return s.replace('[','').replace(']','').trim();}function C(el,cls){var x=el.select(cls);return x.size()>0?T(x.get(0)):'';}var tab=(bu.match(new RegExp('[?&]tab=([0-9]+)'))||['',''])[1];var out=[];var i,k,e,o,a,s,x,au;function P(o){if(o.name&&o.url)out.push(o);}if(tab==='1'||tab==='2'||tab==='3'){var sel=tab==='1'?'#gengxin li':(tab==='2'?'#zuixin li':'#fengyou li');x=d.select(sel);for(i=0;i<x.size();i++){e=x.get(i);a=e.select('a');if(a.size()<1)continue;o={name:un(T(a.get(0))),url:A(a.get(0).attr('href')),author:'',kind:'',lastChapter:'',intro:'',coverUrl:''};if(tab==='1'){o.author=un(C(e,'.s4'));o.kind=cut(C(e,'.s1'));o.lastChapter=un(C(e,'.s3 a'));}else{s=e.select('span');if(s.size()>0)o.author=un(T(s.get(0)));o.kind=cut(String(e.ownText()).trim());if(a.size()>1)o.lastChapter=un(T(a.get(1)));}P(o);}}else if(tab==='4'){x=d.select('.item');for(i=0;i<x.size();i++){e=x.get(i);a=e.select('dt a');if(a.size()<1)continue;s=e.select('dt span');o={name:un(T(a.get(0))),url:A(a.get(0).attr('href')),author:s.size()>0?un(T(s.get(0))):'',kind:'',lastChapter:'',intro:un(C(e,'dd')),coverUrl:''};var im=e.select('img');if(im.size()>0)o.coverUrl=String(im.get(0).attr('src'));P(o);}}else{x=d.select('.bookbox');if(x.size()===0)x=d.select('.item');var hk=d.select('h2');var kind=hk.size()>0?T(hk.get(0)).replace('小说列表','').trim():'';if(kind.indexOf('与')===0)kind='';for(i=0;i<x.size();i++){e=x.get(i);a=e.select('.bookname a');if(a.size()<1)continue;o={name:un(T(a.get(0))),url:A(a.get(0).attr('href')),author:'',kind:kind,lastChapter:'',intro:'',coverUrl:''};au=e.select('.author');for(k=0;k<au.size();k++){s=T(au.get(k));if(s.indexOf('作者')===0)o.author=cut(s);}if(!o.author){s=e.select('dt span');if(s.size()>0)o.author=un(T(s.get(0)));}o.lastChapter=un(C(e,'.cat a'));var up=e.select('.update');if(up.size()>0)o.intro=cut(un(T(up.get(0))));var im2=e.select('img');if(im2.size()>0)o.coverUrl=String(im2.get(0).attr('src'));P(o);}}return out;})()", "bookUrl": "url", "checkKeyWord": "江山", "coverUrl": "coverUrl", "intro": "intro", "kind": "kind", "lastChapter": "lastChapter", "name": "name"}, "ruleToc": {"chapterList": "@js:(function(){var d=(typeof result!=='undefined'&&result&&typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var bu=String(typeof baseUrl==='undefined'?'':baseUrl);var pp=bu.split('/');var or=pp.length>2?pp[0]+'/'+pp[1]+'/'+pp[2]:'';function A(u){u=String(u===null?'':u);if(u===''||u.indexOf('javascript')===0)return '';if(u.indexOf('http')===0)return u;return or+u;}var n=d.select('#list-chapterAll dd a');if(n.size()<1)n=d.select('dl.chapterlist dd a');if(n.size()<1)n=d.select('.chapterlist a');var arr=[],ids=[],i,e,u,t,m;for(i=0;i<n.size();i++){e=n.get(i);u=A(e.attr('href'));t=Packages.org.jsoup.parser.Parser.unescapeEntities(String(e.text()),true).trim();if(u===''||t==='')continue;if(arr.length>0&&arr[arr.length-1].url===u)continue;m=u.match(new RegExp('/([0-9]+)(_[0-9]+)?[.]html$'));ids.push(m?Number(m[1]):0);arr.push({title:t,url:u});}var rev=false,g;for(g=1;g<ids.length;g++){if(ids[g]<ids[g-1]){rev=true;break;}}if(rev)arr.reverse();return arr;})()", "chapterName": "title", "chapterUrl": "url"}, "searchUrl": "<js>var U='https://www.ggd66.com/';var cs=String(cookie.getCookie(U)).split(';'),i,s,o=[];for(i=0;i<cs.length;i++){s=cs[i].trim();if(s!==''&&s.indexOf('ss_search_delay')<0){o.push(s);}}cookie.setCookie(U,o.join('; '));U+'search/?searchkey='+encodeURIComponent(key);</js>", "weight": 0},{"bookSourceGroup": "AI,R18", "bookSourceName": "黄果剧场", "bookSourceType": 0, "bookSourceUrl": "https://huangguo.video", "bookUrlPattern": "https?://huangguo\\.video/(?:video|series|photo|role)/[a-z0-9-]+", "concurrentRate": "1/1000", "customButton": false, "customOrder": 1, "enabled": false, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:var A=[['全部视频','https://huangguo.video/videos?page={{page}}'],['MV/音乐剧','https://huangguo.video/videos?category=1&page={{page}}'],['短片','https://huangguo.video/videos?category=2&page={{page}}'],['连续剧','https://huangguo.video/videos?category=3&page={{page}}'],['片段','https://huangguo.video/videos?category=4&page={{page}}'],['都市','https://huangguo.video/videos?tags=1&page={{page}}'],['人妻','https://huangguo.video/videos?tags=2&page={{page}}'],['古风','https://huangguo.video/videos?tags=7&page={{page}}'],['乱伦','https://huangguo.video/videos?tags=8&page={{page}}'],['图集-全部','https://huangguo.video/photos?page={{page}}'],['图集-都市','https://huangguo.video/photos?tags=1&page={{page}}'],['图集-同人','https://huangguo.video/photos?tags=4&page={{page}}'],['角色-最新','https://huangguo.video/roles'],['角色-作品','https://huangguo.video/roles?sort=works'],['角色-播放','https://huangguo.video/roles?sort=views']].map(function(x){return{title:x[0],url:x[1],style:{layout_flexBasisPercent:0.33}}});result=JSON.stringify(A);", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36\", \"Referer\": \"https://huangguo.video/\"}", "lastUpdateTime": "1788933938029", "loginCheckJs": "(function(){try{var b=String(result.body());if(b.indexOf('Attention Required')>-1||b.indexOf('you have been blocked')>-1){throw new Error('站点被 Cloudflare 拦截，请稍后重试');}if(b.indexOf('<!DOCTYPE')===0&&b.indexOf('黄果剧场')===-1){throw new Error('站点响应异常，可能域名已失效');}}catch(e){if(e instanceof Error){throw e;}}return result;})()", "loginUi": "@js:var all=[];all.push({'name':'检查站点连接','type':'button','action':'checkConn()','style':{'layout_flexGrow':1,'layout_flexBasisPercent':1}});all.push({'name':'本站无需登录，可直接搜索浏览','type':'text','style':{'layout_flexGrow':1,'layout_flexBasisPercent':1}});result=JSON.stringify(all);", "loginUrl": "var HOST='https://huangguo.video';function checkConn(){try{var r=java.get(HOST+'/');var s=String(r.body?r.body():r);if(s.indexOf('Attention Required')>-1||s.indexOf('you have been blocked')>-1){java.longToast('被 Cloudflare 拦截，请更换网络环境后重试');return;}if(s.indexOf('黄果剧场')>-1){java.longToast('站点连接正常，无需登录');}else{java.longToast('站点响应异常，可能域名已失效');}}catch(e){java.longToast('连接失败：'+e);}}function login(){try{java.upLoginData();}catch(e){}java.toast('黄果剧场无需登录，直接使用');}", "respondTime": 180000, "ruleBookInfo": {"author": "@js:(function(){var r=Packages.org.jsoup.Jsoup.parse(String(result));var n=r.select('.uploader-row .name').first();if(n&&n.text())return n.text();var m=r.select('meta[property=og:description]').first();if(!m)return'';var mm=m.attr('content').match(/(.+?)出品/);return mm?mm[1]:'';})()", "coverUrl": "@js:(function(){var r=Packages.org.jsoup.Jsoup.parse(String(result));var m=r.select('meta[property=og:image]').first();if(!m)return'';var s=m.attr('content');return s.indexOf('http')===0?s:('https://huangguo.video'+s);})()", "intro": "@js:(function(){var r=Packages.org.jsoup.Jsoup.parse(String(result));var u=String(baseUrl||'');var m=r.select('meta[property=og:description]').first();var d=m?m.attr('content'):'';if(u.indexOf('/series/')>-1){var n=r.select('[data-episode-list] a[href^=/video/]').size();var h1=r.select('h1').first();var info=(h1?h1.text():'')+' · 共'+n+'集';return'<useweb><div style=text-align:center;padding:10px;font-size:15px;color:#F0B24A>'+info+'</div><div style=text-align:center;padding:4px><button type=button style=background:#F0B24A;color:#16130F;border:none;border-radius:20px;padding:10px;font-size:14px onclick=java.longToast(&#39;请到目录中选择剧集观看&#39;)>📺 观看提示</button></div></useweb>';}return d;})()", "kind": "@js:(function(){var r=Packages.org.jsoup.Jsoup.parse(String(result));var u=String(baseUrl||'');var m=r.select('meta[property=og:description]').first();var d=m?m.attr('content'):'';if(u.indexOf('/role/')>-1){var m2=d.match(/女[0-9]+岁|男[0-9]+岁/);return m2?m2[0]:'AI角色';}var tags=r.select('.tag-row a.plot-tag');var arr=[];for(var i=0;i<tags.size();i++){var t=tags.get(i).text();if(t)arr.push(t);}var mm=d.match(/黄果剧场的([^，,]+)/);if(mm&&arr.indexOf(mm[1])<0)arr.unshift(mm[1]);return arr.join(' / ');})()", "lastChapter": "@js:(function(){var r=Packages.org.jsoup.Jsoup.parse(String(result));var u=r.select('.uploader-row').first();if(!u)return'';var t=u.text(),i=t.lastIndexOf(' · ');return i>0?t.substring(i+3):t;})()", "name": "@js:(function(){var r=Packages.org.jsoup.Jsoup.parse(String(result)),m=r.select('meta[property=og:title]').first();if(!m)return'';var t=m.attr('content'),i=t.indexOf(' · ');return i>0?t.substring(0,i):t;})()"}, "ruleContent": {"content": "@js:(function(){var u=String(baseUrl||'');function abs(h){if(!h)return'';if(h.indexOf('http')===0)return h;return'https://huangguo.video'+h;}var Q=String.fromCharCode(34);if(u.indexOf('/photo/')>-1){var d=Packages.org.jsoup.Jsoup.parse(String(result));var seen={};var urls=[];var f=d.select('img[src*=/display/]').first();if(f){var s0=abs(f.attr('src'));if(s0&&!seen[s0]){seen[s0]=1;urls.push(s0);}}var sl=d.select('.slide[data-src]');for(var i=0;i<sl.size();i++){var s=abs(sl.get(i).attr('data-src'));if(s&&!seen[s]){seen[s]=1;urls.push(s);}}if(urls.length===0)return'图集加载失败，可能页面结构已变化';var h='<div style=text-align:center;padding:4px>';for(var j=0;j<urls.length;j++){h+='<img src='+Q+urls[j]+Q+' loading=lazy style=width:100%;max-width:520px;display:block;margin-top:10px;border-radius:8px>';}h+='<p style=color:#999;font-size:12px;text-align:center>共 '+urls.length+' 张</p></div>';return h;}try{java.startBrowser(u,'');}catch(e){}return'已尝试在浏览器打开视频播放页：'+u+String.fromCharCode(10)+'浏览器内可直接播放（连续剧请点选集切换剧集）';})()"}, "ruleExplore": {"author": "author", "bookList": "@js:(function(){var d=(typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var u=String(baseUrl||'');function abs(h){if(!h)return'';if(h.indexOf('http')===0)return h;return'https://huangguo.video'+h;}function bg(s){var i=s.indexOf('url(');if(i<0)return'';var j=s.indexOf(')',i);return j<0?'':s.substring(i+4,j);}var L=[];if(u.indexOf('/roles')>-1){var c=d.select('a.role-card');for(var i=0;i<c.size();i++){var e=c.get(i);var p=e.select('p').first();var sp=e.select('span');var info='';for(var k=0;k<sp.size();k++){var t=sp.get(k).text();if(info===''&&t.indexOf('岁')>-1)info=t;}var cd=e.select('.card-cover').first();L.push({name:p?p.text():'',url:abs(e.attr('href')),coverUrl:abs(bg(cd?cd.attr('style'):'')),kind:info,author:''});}return L;}var a=d.select('article a[href^=/video/],article a[href^=/series/],article a[href^=/photo/]');for(var i=0;i<a.size();i++){var e=a.get(i);var h=e.attr('href');var p=e.select('p').first();var im=e.select('img[src*=/uploads/]').first();var u2=e.select('a[href^=/user/]').first();var tp=h.indexOf('/photo/')>-1?'图集':(h.indexOf('/series/')>-1?'连续剧':'短片');L.push({name:p?p.text():'',url:abs(h),coverUrl:im?abs(im.attr('src')):'',kind:tp,author:u2?u2.text():''});}return L;})()", "bookUrl": "url", "coverUrl": "coverUrl", "kind": "kind", "name": "name"}, "ruleSearch": {"author": "@js:(function(){var r=(typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var a=r.select('a[href^=/user/]').first();return a?a.text():'';})()", "bookList": "article.search-content-card", "bookUrl": "@js:(function(){var r=(typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var a=r.select('a[href^=/video/],a[href^=/series/],a[href^=/photo/]').first();if(!a)return'';var h=a.attr('href');return h.indexOf('http')===0?h:('https://huangguo.video'+h);})()", "coverUrl": "@js:(function(){var r=(typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var i=r.select('img[src*=/uploads/]').first();if(!i)return'';var s=i.attr('src');return s.indexOf('http')===0?s:('https://huangguo.video'+s);})()", "kind": "@js:(function(){var r=(typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var ps=r.select('p');if(ps.size()<2)return'';return ps.get(ps.size()-1).text();})()", "name": "@js:(function(){var r=(typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var p=r.select('a p');return p.size()>0?p.get(0).text():'';})()"}, "ruleToc": {"chapterList": "@js:(function(){var d=Packages.org.jsoup.Jsoup.parse(String(result));var u=String(baseUrl||'');function abs(h){if(!h)return'';if(h.indexOf('http')===0)return h;return'https://huangguo.video'+h;}var o=[];if(u.indexOf('/series/')>-1){var e=d.select('[data-episode-list] a[href^=/video/]');for(var i=0;i<e.size();i++){var a=e.get(i);var p=a.select('p').first();o.push({title:p?p.text():a.attr('href'),url:abs(a.attr('href'))});}if(o.length>0)return o;}var h=d.select('h1').first();return[{title:h?h.text():u,url:u}];})()", "chapterName": "title", "chapterUrl": "url"}, "searchUrl": "https://huangguo.video/search?q={{key}}", "weight": 0},{"bookSourceComment": "恋上你中文 www.book630.org\n⚠️ 搜索必须登录（正文/目录/详情免登录）；请到书源登录界面登录或注册。\n搜索限频20秒/次，书源已自动处理；如遇限频提示等待20秒即可。\n目录前100章在详情页，更多章节由目录分页自动翻页（每页100章）。\n正文每章可能分2~3页(_N.html)，书源自动拼接。", "bookSourceGroup": "AI,R18", "bookSourceName": "恋上你中文（登录搜索）", "bookSourceType": 0, "bookSourceUrl": "https://www.book630.org", "bookUrlPattern": "https?://www\\.book630\\.org/\\d+_\\d+/?$", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "✨全部更新::/list0_{{page}}/\n玄幻修真::/list1_{{page}}/\n重生穿越::/list2_{{page}}/\n都市异能::/list3_{{page}}/\n历史军事::/list4_{{page}}/\n网游竞技::/list5_{{page}}/\n科幻世界::/list6_{{page}}/\n灵异悬疑::/list7_{{page}}/\n言情女生::/list8_{{page}}/\n其他类型::/list9_{{page}}/", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36\", \"Referer\": \"https://www.book630.org/\"}", "lastUpdateTime": "1788927807231", "loginCheckJs": "(function(){var u=String(result.url()||'');var b=String(result.body()||'');if(u.indexOf('login.html')>=0||(b.indexOf('会员登录')>=0&&b.indexOf('user_code')>=0)){throw new Error('🔒 搜索需要登录：请到书源登录界面登录后再搜索（书架/正文无需登录）');}if(b.indexOf('搜索间隔')>=0){var m=b.match(/【(\\d+)】秒，请于\\s*([\\d:]+)/);throw new Error('⏳ 站点搜索限频：'+(m?('间隔'+m[1]+'秒，请于 '+m[2]+' 后再搜'):'请约20秒后再试')+'！');}return result;})()", "loginUi": "[{\"name\": \"帐号\", \"type\": \"text\"}, {\"name\": \"密码\", \"type\": \"password\"}, {\"name\": \"登录\", \"type\": \"button\", \"action\": \"login()\"}, {\"name\": \"注册帐号\", \"type\": \"text\", \"hint\": \"字母加数字3-15字\"}, {\"name\": \"注册密码\", \"type\": \"password\"}, {\"name\": \"手机号\", \"type\": \"text\", \"default\": \"13800001234\"}, {\"name\": \"注 册\", \"type\": \"button\", \"action\": \"register()\"}, {\"name\": \"检查登录状态\", \"type\": \"button\", \"action\": \"checkLogin()\"}]", "loginUrl": "\nfunction login() {\n    var u = String(result.get('帐号') || '');\n    var p = String(result.get('密码') || '');\n    if (!u || !p) { java.toast('⚠️ 请先填写帐号和密码'); return; }\n    java.toast('⏳ 正在获取验证码，请在弹窗中输入（验证码会话60秒内有效，请尽快输入）');\n    var code = java.getVerificationCode('https://www.book630.org/code.jpg?' + Math.random());\n    if (!code || String(code).trim() === '') { java.toast('⚠️ 未输入验证码'); return; }\n    java.toast('登录中...');\n    var body = 'user_name=' + encodeURIComponent(u) + '&user_pass=' + java.md5Encode(p) + '&user_code=' + encodeURIComponent(String(code).trim());\n    var r = java.post('https://www.book630.org/qs_login_go.php', body, {\n        'Content-Type': 'application/x-www-form-urlencoded',\n        'X-Requested-With': 'XMLHttpRequest',\n        'User-Agent': 'Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36',\n        'Referer': 'https://www.book630.org/login.html',\n        'Origin': 'https://www.book630.org'\n    });\n    var b = String(r.body() || '').replace(/\\s/g, '');\n    var d = b.split('|');\n    if (d[0] == '1') {\n        java.toast('✅ 登录成功，可以搜索了');\n        upLoginData({'帐号': u});\n    } else {\n        java.toast('❌ 登录失败: ' + (d[1] || '未知错误（验证码错误或已超60秒? 请重试）'));\n    }\n}\n\nfunction register() {\n    var u = String(result.get('注册帐号') || '');\n    var p = String(result.get('注册密码') || '');\n    var m = String(result.get('手机号') || '');\n    if (!u || !p || !m) { java.toast('⚠️ 请填写注册帐号/注册密码/手机号'); return; }\n    if (!/^[A-Za-z0-9]{3,15}$/.test(u)) { java.toast('⚠️ 帐号需为字母加数字，3-15字内'); return; }\n    java.toast('⏳ 正在获取验证码，请在弹窗中输入');\n    var code = java.getVerificationCode('https://www.book630.org/code.jpg?' + Math.random());\n    if (!code || String(code).trim() === '') { java.toast('⚠️ 未输入验证码'); return; }\n    java.toast('注册中...');\n    var pw = java.md5Encode(p);\n    var body = 'name=' + encodeURIComponent(u) + '&pass=' + pw + '&pass2=' + pw + '&mobile=' + encodeURIComponent(m) + '&code=' + encodeURIComponent(String(code).trim());\n    var r = java.post('https://www.book630.org/qs_register_go.php', body, {\n        'Content-Type': 'application/x-www-form-urlencoded',\n        'X-Requested-With': 'XMLHttpRequest',\n        'User-Agent': 'Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36',\n        'Referer': 'https://www.book630.org/register.html',\n        'Origin': 'https://www.book630.org'\n    });\n    var b = String(r.body() || '').replace(/\\s/g, '');\n    var d = b.split('|');\n    if (d[0] == '1') {\n        java.toast('✅ ' + (d[1] || '注册成功') + '（已自动登录）');\n        upLoginData({'帐号': u, '注册帐号': u, '注册密码': ''});\n    } else {\n        java.toast('❌ 注册失败: ' + (d[1] || '未知错误（验证码错误? 帐号已存在?）'));\n    }\n}\n\nfunction checkLogin() {\n    java.toast('检查登录状态...');\n    var b = String(java.ajax('https://www.book630.org/mybook.html') || '');\n    if (b.indexOf('会员书架') >= 0 && b.indexOf('user_code') < 0) {\n        var ck = String(cookie.getCookie('https://www.book630.org') || '');\n        var m = ck.match(/user_name=([^;\\s]+)/);\n        java.toast('✅ 已登录' + (m ? ('：' + java.base64Decode(m[1]).replace(/\\0/g, '')) : '') + '，可以搜索');\n    } else {\n        java.toast('❌ 未登录！本站搜索必须登录：请填好帐号密码后点「登录」按钮');\n    }\n}\n", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=og:novel:author]@content", "canReName": "true", "coverUrl": "meta[property=og:image]@content", "intro": "meta[property=og:description]@content", "kind": "meta[property=og:novel:category]@content", "lastChapter": "meta[property=og:novel:latest_chapter_name]@content", "name": "meta[property=og:novel:book_name]@content"}, "ruleContent": {"content": "@js:(function(){var d=(typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var el=d.select('#txt');if(el.size()==0){return '⚠️ 正文获取失败，请刷新重试';}var ps=el.first().select('p');var sb=[];for(var i=0;i<ps.size();i++){sb.push(String(ps.get(i).text()));}return sb.join('\\n');})()", "nextContentUrl": "@js:(function(){var d=(typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var m=String(baseUrl).match(/_(\\d+)\\.html$/);var cur=m?parseInt(m[1],10):0;var nxt=cur+1;var as=d.select('div.chapter-page-btn a');for(var i=0;i<as.size();i++){var a=as.get(i);if(String(a.text()).indexOf('下章')>=0){var h=a.attr('href');if(new RegExp('_'+nxt+'\\\\.html$').test(h)){return h;}}}return '';})()"}, "ruleExplore": {"author": "@js:result.select('span.s4').text()", "bookList": "@js:(function(){var d=(typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var ul=d.select('ul.sort_list').first();if(ul==null){throw new Error('⚠️ 列表解析失败');}return ul.select('li');})()", "bookUrl": "@js:result.select('span.s2 a').attr('href')", "kind": "@js:String(result.select('span.s1').text()).replace(/[\\[\\]]/g, '')", "lastChapter": "@js:String(result.select('span.s2 a').attr('title')).replace(/^最新章节：/, '')", "name": "@js:result.select('span.s2 a').text()"}, "ruleSearch": {"author": "@js:String(result.select('span.s5').text()).replace(/^\\s+/, '')", "bookList": "@js:(function(){var d=(typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));if(String(d.text()).indexOf('会员登录')>=0&&d.select('#user_code').size()>0){throw new Error('🔒 搜索需要登录：请到书源登录界面登录后再搜索');}var ul=d.select('ul.sort_list').first();if(ul==null){throw new Error('⚠️ 搜索结果异常：未找到结果列表');}var t=String(ul.text());if(t.indexOf('搜索间隔')>=0){var m=t.match(/【(\\d+)】秒，请于\\s*([\\d:]+)/);throw new Error('⏳ 站点搜索限频：'+(m?('间隔'+m[1]+'秒，请于 '+m[2]+' 后再搜'):'请约20秒后再试')+'！');}return ul.select('li');})()", "bookUrl": "@js:result.select('span.s2 a').attr('href')", "checkKeyWord": "我的", "name": "@js:result.select('span.s2 a').text()"}, "ruleToc": {"chapterList": "@js:(function(){var d=(typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var us=d.select('ul.chapter-list');if(us.size()==0){throw new Error('⚠️ 目录获取失败：未找到章节列表');}return us.get(us.size()-1).select('li');})()", "chapterName": "@js:result.select('a').first().text()", "chapterUrl": "@js:result.select('a').first().attr('href')", "nextTocUrl": "@js:(function(){var d=(typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var sel=d.select('div.page_num select');if(sel.size()>0){var opts=sel.first().select('option');for(var i=0;i<opts.size();i++){if(opts.get(i).hasAttr('selected')){if(i+1<opts.size()){return opts.get(i+1).attr('value');}return '';}}return '';}var as=d.select('ul.btn-group a');for(var j=0;j<as.size();j++){if(String(as.get(j).text()).indexOf('章节目录')>=0){return as.get(j).attr('href');}}return '';})()"}, "searchUrl": "{{(function(){var u='https://www.book630.org';var ck=String(cookie.getCookie(u));var parts=ck.split(';');var keep=[];for(var i=0;i<parts.length;i++){var p=parts[i].trim();if(p.indexOf('search_time=')!==0&&p!=='')keep.push(p);}cookie.setCookie(u,keep.join('; '));return '';})()}}https://www.book630.org/search.html,{\"method\":\"POST\",\"body\":\"s={{key}}\",\"retry\":3}", "weight": 0},{"bookSourceComment": "此书源为个人用AI整合，主要功能是查找书籍。免费用户仅可阅读前十章，登录并购买官方会员后可解锁全部内容。", "bookSourceGroup": "不需要启用", "bookSourceName": "番茄（发现）", "bookSourceType": 0, "bookSourceUrl": "https://fanqienovel.com", "customButton": false, "customOrder": 2, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>\n// ========== 基础配置 ==========\nvar BASE_URL = \"https://fanqienovel.com/api/author/library/book_list/v/\";\n\nvar man = {\"西方奇幻\":\"1141\",\"东方仙侠\":\"1140\",\"科幻末世\":\"8\",\"男频衍生\":\"1016\",\"都市高武\":\"1014\",\"悬疑灵异\":\"751\",\"悬疑脑洞\":\"539\",\"抗战谍战\":\"504\",\"历史古代\":\"273\",\"历史脑洞\":\"272\",\"都市种田\":\"263\",\"都市脑洞\":\"262\",\"都市日常\":\"261\",\"玄幻脑洞\":\"257\",\"战神赘婿\":\"27\",\"动漫衍生\":\"718\",\"游戏体育\":\"746\",\"传统玄幻\":\"258\",\"都市修真\":\"124\",\"衍生\":\"1079\",\"仕途\":\"558\",\"综影视\":\"1058\",\"天灾\":\"658\",\"第一人称\":\"871\",\"赛博朋克\":\"873\",\"第四天灾\":\"855\",\"规则怪谈\":\"851\",\"搞笑轻松\":\"778\",\"古代\":\"758\",\"悬疑\":\"10\",\"克苏鲁\":\"705\",\"都市异能\":\"516\",\"末日求生\":\"515\",\"灵气复苏\":\"514\",\"高武世界\":\"513\",\"异世大陆\":\"512\",\"东方玄幻\":\"511\",\"谍战\":\"507\",\"清朝\":\"503\",\"宋朝\":\"501\",\"断层\":\"500\",\"武将\":\"497\",\"国运\":\"496\",\"综漫\":\"465\",\"开局\":\"453\",\"架空\":\"452\",\"奇幻仙侠\":\"259\",\"都市\":\"1\",\"玄幻\":\"7\",\"历史\":\"12\",\"体育\":\"15\",\"武侠\":\"16\",\"多女主\":\"91\",\"赘婿\":\"25\",\"全能\":\"856\",\"大佬\":\"520\",\"大小姐\":\"519\",\"特工\":\"518\",\"游戏主播\":\"509\",\"神探\":\"506\",\"贵族\":\"502\",\"皇帝\":\"498\",\"单女主\":\"389\",\"校花\":\"385\",\"无女主\":\"391\",\"女帝\":\"378\",\"特种兵\":\"375\",\"反派\":\"369\",\"神医\":\"26\",\"奶爸\":\"42\",\"学霸\":\"82\",\"天才\":\"90\",\"腹黑\":\"92\",\"扮猪吃虎\":\"93\",\"都市江湖\":\"1460\",\"风水秘术\":\"1455\",\"斩神衍生\":\"1062\",\"十日衍生\":\"1060\",\"西游衍生\":\"373\",\"公版衍生\":\"1037\",\"红楼衍生\":\"1036\",\"甄嬛衍生\":\"1035\",\"如懿衍生\":\"1034\",\"惊悚游戏\":\"537\",\"卡牌\":\"874\",\"山海经\":\"875\",\"捉鬼\":\"867\",\"剑修\":\"868\",\"废土\":\"869\",\"副本\":\"864\",\"黑科技\":\"854\",\"无脑爽\":\"850\",\"魂穿\":\"852\",\"高手下山\":\"845\",\"黑化\":\"846\",\"迪化\":\"843\",\"发家致富\":\"840\",\"无后宫\":\"838\",\"争霸\":\"837\",\"1v1\":\"834\",\"升级流\":\"830\",\"灵魂互换\":\"831\",\"科举\":\"832\",\"封神\":\"731\",\"四合院\":\"495\",\"电竞\":\"508\",\"双重生\":\"524\",\"乡村\":\"11\",\"同人\":\"538\",\"打脸\":\"522\",\"破案\":\"505\",\"囤物资\":\"494\",\"钓鱼\":\"493\",\"网游\":\"372\",\"奥特同人\":\"367\",\"求生\":\"379\",\"无敌\":\"384\",\"民国\":\"390\",\"九叔\":\"383\",\"穿书\":\"382\",\"聊天群\":\"381\",\"大秦\":\"377\",\"龙珠\":\"376\",\"漫威\":\"374\",\"神奇宝贝\":\"371\",\"海贼\":\"370\",\"火影\":\"368\",\"职场\":\"127\",\"明朝\":\"126\",\"家庭\":\"125\",\"三国\":\"67\",\"末世\":\"68\",\"直播\":\"69\",\"无限流\":\"70\",\"诸天万界\":\"71\",\"大唐\":\"73\",\"宠物\":\"74\",\"外卖\":\"75\",\"星际\":\"77\",\"美食\":\"78\",\"剑道\":\"80\",\"盗墓\":\"81\",\"灵异\":\"100\",\"鉴宝\":\"17\",\"系统\":\"19\",\"神豪\":\"20\",\"重生\":\"36\",\"穿越\":\"37\",\"二次元\":\"39\",\"海岛\":\"40\",\"娱乐圈\":\"43\",\"空间\":\"44\",\"推理\":\"61\"}\nvar girls ={\"女频悬疑\":\"747\",\"古风世情\":\"1139\",\"科幻末世\":\"8\",\"女频衍生\":\"1015\",\"民国言情\":\"1017\",\"悬疑脑洞\":\"539\",\"青春甜宠\":\"749\",\"双男主\":\"275\",\"古言脑洞\":\"253\",\"现言脑洞\":\"267\",\"玄幻言情\":\"248\",\"宫斗宅斗\":\"246\",\"豪门总裁\":\"748\",\"动漫衍生\":\"718\",\"星光璀璨\":\"745\",\"游戏体育\":\"746\",\"职场婚恋\":\"750\",\"双女主\":\"704\",\"年代\":\"79\",\"种田\":\"23\",\"快穿\":\"24\",\"古言权谋\":\"1317\",\"悬疑恋爱\":\"1169\",\"纯爱\":\"1012\",\"衍生\":\"1079\",\"仕途\":\"558\",\"综影视\":\"1058\",\"天灾\":\"658\",\"第一人称\":\"871\",\"赛博朋克\":\"873\",\"规则怪谈\":\"851\",\"搞笑轻松\":\"778\",\"古代\":\"758\",\"悬疑\":\"10\",\"谍战\":\"507\",\"职场商战\":\"485\",\"虐恋情深\":\"481\",\"日久生情\":\"474\",\"豪门世家\":\"473\",\"综漫\":\"465\",\"异世穿越\":\"464\",\"独宠\":\"460\",\"现代言情\":\"3\",\"古代言情\":\"5\",\"武侠\":\"16\",\"幻想言情\":\"32\",\"位尊权重\":\"1456\",\"总裁\":\"29\",\"忠犬\":\"865\",\"全能\":\"856\",\"白切黑\":\"853\",\"双学霸\":\"849\",\"作精\":\"521\",\"大佬\":\"520\",\"大小姐\":\"519\",\"游戏主播\":\"509\",\"神探\":\"506\",\"贵族\":\"502\",\"将军\":\"492\",\"毒医\":\"491\",\"厨娘\":\"490\",\"律师\":\"488\",\"医生\":\"487\",\"明星\":\"486\",\"替身\":\"470\",\"双面\":\"469\",\"冰山\":\"468\",\"古灵精怪\":\"459\",\"天作之合\":\"455\",\"可盐可甜\":\"454\",\"无CP\":\"392\",\"病娇\":\"380\",\"反派\":\"369\",\"萌宝\":\"28\",\"宠妻\":\"30\",\"学霸\":\"82\",\"公主\":\"83\",\"皇后\":\"84\",\"王妃\":\"85\",\"女强\":\"86\",\"皇叔\":\"87\",\"嫡女\":\"88\",\"精灵\":\"89\",\"天才\":\"90\",\"腹黑\":\"92\",\"扮猪吃虎\":\"93\",\"团宠\":\"94\",\"男二上位\":\"1457\",\"代嫁代娶\":\"1458\",\"攻略反派\":\"1459\",\"风水秘术\":\"1455\",\"斩神衍生\":\"1062\",\"十日衍生\":\"1060\",\"西游衍生\":\"373\",\"公版衍生\":\"1037\",\"红楼衍生\":\"1036\",\"甄嬛衍生\":\"1035\",\"如懿衍生\":\"1034\",\"惊悚游戏\":\"537\",\"追夫\":\"872\",\"山海经\":\"875\",\"胎穿\":\"876\",\"捉鬼\":\"867\",\"剑修\":\"868\",\"相互救赎\":\"860\",\"宠夫\":\"861\",\"无脑爽\":\"850\",\"魂穿\":\"852\",\"黑化\":\"846\",\"养崽\":\"847\",\"年龄差\":\"848\",\"真假千金\":\"844\",\"久别重逢\":\"839\",\"发家致富\":\"840\",\"养成\":\"835\",\"互宠\":\"836\",\"1v1\":\"834\",\"灵魂互换\":\"831\",\"科举\":\"832\",\"年下\":\"829\",\"婚恋\":\"34\",\"封神\":\"731\",\"四合院\":\"495\",\"电竞\":\"508\",\"双重生\":\"524\",\"前世今生\":\"523\",\"双洁\":\"702\",\"追妻火葬场\":\"616\",\"乡村\":\"11\",\"逃荒\":\"557\",\"同人\":\"538\",\"打脸\":\"522\",\"破案\":\"505\",\"囤物资\":\"494\",\"钓鱼\":\"493\",\"HE\":\"484\",\"相爱相杀\":\"483\",\"暗恋\":\"482\",\"逃婚\":\"480\",\"带球跑\":\"479\",\"强强\":\"478\",\"一见钟情\":\"477\",\"双向奔赴\":\"476\",\"破镜重圆\":\"475\",\"契约婚姻\":\"471\",\"隐婚\":\"467\",\"闪婚\":\"466\",\"今穿古\":\"463\",\"古穿今\":\"462\",\"群穿\":\"461\",\"护短\":\"458\",\"虐渣\":\"457\",\"情有独钟\":\"456\",\"马甲\":\"266\",\"先婚后爱\":\"265\",\"医术\":\"247\",\"女扮男装\":\"388\",\"青梅竹马\":\"387\",\"无敌\":\"384\",\"民国\":\"390\",\"穿书\":\"382\",\"职场\":\"127\",\"家庭\":\"125\",\"末世\":\"68\",\"直播\":\"69\",\"无限流\":\"70\",\"兽世\":\"72\",\"清穿\":\"76\",\"星际\":\"77\",\"美食\":\"78\",\"盗墓\":\"81\",\"虐文\":\"95\",\"甜宠\":\"96\",\"灵异\":\"100\",\"校园\":\"4\",\"系统\":\"19\",\"重生\":\"36\",\"穿越\":\"37\",\"二次元\":\"39\",\"娱乐圈\":\"43\",\"空间\":\"44\",\"推理\":\"61\"}\nvar action = {\"都市\":\"1\",\"都市生活\":\"2\",\"现代言情\":\"3\",\"古代言情\":\"5\",\"玄幻\":\"7\",\"科幻\":\"8\",\"悬疑\":\"10\",\"历史\":\"12\",\"武侠\":\"16\",\"幻想言情\":\"32\",\"影视小说\":\"45\",\"诗歌散文\":\"46\",\"文学小说\":\"47\",\"生活\":\"48\",\"社会科学\":\"50\",\"名著经典\":\"51\",\"科技\":\"52\",\"经济管理\":\"53\",\"教育\":\"54\",\"成功励志\":\"56\",\"推理悬疑\":\"61\",\"文化历史\":\"62\",\"中国名著\":\"98\",\"外国名著\":\"99\",\"战神\":\"27\",\"萌宝\":\"28\",\"豪门总裁\":\"29\",\"宠妻\":\"30\",\"学霸\":\"82\",\"公主\":\"83\",\"皇后\":\"84\",\"王妃\":\"85\",\"女强\":\"86\",\"嫡女\":\"88\",\"精灵\":\"89\",\"天才\":\"90\",\"腹黑\":\"92\",\"校园\":\"4\",\"种田\":\"23\",\"重生\":\"36\",\"穿越\":\"37\",\"娱乐圈\":\"43\",\"推理\":\"61\",\"直播\":\"69\",\"大唐\":\"73\",\"美食\":\"78\",\"年代\":\"79\",\"剑道\":\"80\",\"盗墓\":\"81\",\"甜宠\":\"96\",\"战争\":\"97\",\"灵异\":\"100\",\"国学\":\"116\",\"家庭\":\"125\",\"明朝\":\"126\",\"职场\":\"127\",\"法律\":\"142\",\"宫斗宅斗\":\"246\",\"玄幻言情\":\"248\",\"古言脑洞\":\"253\",\"都市日常\":\"261\",\"都市脑洞\":\"262\",\"现言脑洞\":\"267\",\"历史古代\":\"273\",\"两性\":\"274\",\"特种兵\":\"375\",\"青梅竹马\":\"387\",\"女扮男装\":\"388\",\"民国\":\"390\",\"外国文学\":\"397\",\"古代文学\":\"398\",\"当代文学\":\"399\",\"现实小说\":\"400\",\"文学理论\":\"401\",\"中国历史\":\"402\",\"世界历史\":\"403\",\"历史传记\":\"404\",\"人文社科\":\"405\",\"哲学宗教\":\"406\",\"心理学\":\"407\",\"政治军事\":\"408\",\"人物传记\":\"409\",\"个人成长\":\"410\",\"思维智商\":\"411\",\"人际交往\":\"412\",\"文化艺术\":\"413\",\"亲子家教\":\"415\",\"保健养生\":\"416\",\"时尚美妆\":\"418\",\"美食休闲\":\"419\",\"家居旅游\":\"420\",\"风水占卜\":\"421\",\"经典国学\":\"423\",\"架空\":\"452\",\"今穿古\":\"463\",\"冰山\":\"468\",\"豪门世家\":\"473\",\"一见钟情\":\"477\",\"暗恋\":\"482\",\"HE\":\"484\",\"学校教育\":\"721\",\"成人教育\":\"722\",\"豪门爽文\":\"745\",\"悬疑恋爱\":\"747\",\"霸总\":\"748\",\"青春甜宠\":\"749\",\"职场婚恋\":\"750\",\"悬疑灵异\":\"751\",\"官场\":\"788\"};\n\nvar TAGS = {\n    \"男频\": man,\n    \"女频\": girls,\n    \"出版\": action\n};\n\nvar GENDERS = [\"全部\", \"女生\", \"男生\"];\nvar STATUSES = [\"全部\", \"连载中\", \"已完结\"];\nvar WORDCOUNTS = [\"全部\", \"30万以下\", \"30-50万\", \"50-100万\", \"100-200万\", \"200万以上\"];\nvar SORTS = [\"最热\", \"最新\", \"字数\"];\n\nvar GENDER_ID = {\"全部\":\"-1\",\"女生\":\"0\",\"男生\":\"1\"};\nvar STATUS_ID = {\"全部\":\"-1\",\"连载中\":\"1\",\"已完结\":\"0\"};\nvar WORDCOUNT_ID = {\"全部\":\"-1\",\"30万以下\":\"0\",\"30-50万\":\"1\",\"50-100万\":\"2\",\"100-200万\":\"3\",\"200万以上\":\"4\"};\nvar SORT_ID = {\"最热\":\"0\",\"最新\":\"1\",\"字数\":\"2\"};\n\nvar BD = [\"男频\", \"女频\", \"出版\"];\n\n// ========== 状态 ==========\nvar st = {};\ntry { st = JSON.parse(source.getVariable()); } catch (e) { st = {}; }\n\nvar bd = st.board || \"男频\";\nif (BD.indexOf(bd) === -1) bd = \"男频\";\nvar gender = st.gender || \"全部\";\nvar status = st.status || \"全部\";\nvar wordcount = st.wordcount || \"全部\";\nvar sort = st.sort || \"最热\";\nvar tagSel = st.tag || \"\";\n\n// ========== Action ==========\nvar A_board = \"var s={};try{s=JSON.parse(source.getVariable())}catch(e){};s.board=infoMap['分类']||s.board||'男频';s.tag='';source.setVariable(JSON.stringify(s));java.refreshExplore();\";\nvar A_gender = \"var s={};try{s=JSON.parse(source.getVariable())}catch(e){};s.gender=infoMap['性别']||'全部';source.setVariable(JSON.stringify(s));java.refreshExplore();\";\nvar A_status = \"var s={};try{s=JSON.parse(source.getVariable())}catch(e){};s.status=infoMap['状态']||'全部';source.setVariable(JSON.stringify(s));java.refreshExplore();\";\nvar A_wordcount = \"var s={};try{s=JSON.parse(source.getVariable())}catch(e){};s.wordcount=infoMap['字数']||'全部';source.setVariable(JSON.stringify(s));java.refreshExplore();\";\nvar A_sort = \"var s={};try{s=JSON.parse(source.getVariable())}catch(e){};s.sort=infoMap['排序']||'最热';source.setVariable(JSON.stringify(s));java.refreshExplore();\";\n\n// ========== URL ==========\nfunction buildUrl(tagId) {\n    return BASE_URL +\n        \"?page_count=10\" +\n        \"&page_index={{(page-1)*10}}\" +\n        \"&gender=\" + (GENDER_ID[gender] || \"-1\") +\n        \"&category_id=\" + tagId +\n        \"&creation_status=\" + (STATUS_ID[status] || \"-1\") +\n        \"&word_count=\" + (WORDCOUNT_ID[wordcount] || \"-1\") +\n        \"&book_type=-1\" +\n        \"&sort=\" + (SORT_ID[sort] || \"0\");\n}\n\n// ========== UI ==========\nvar ui = [];\n\n// ===== 我的书架分组（直接展开） =====\nui.push({ title: \"📚 我的书架\", url: \"\", style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } });\n\nvar shelfRes = java.ajax(\"https://fanqienovel.com/reading/bookapi/bookshelf/info/v:version/?aid=1967&iid=0&version_code=56910&update_version_code=56910\");\nvar shelfParsed = JSON.parse(shelfRes);\nvar shelfData = (shelfParsed.data && shelfParsed.data.book_shelf_info) || [];\n\n// 按 group_name 分组\nvar groupMap = {};\nfor (var i = 0; i < shelfData.length; i++) {\n    var item = shelfData[i];\n    var gName = item.group_name || \"未分组\";\n    if (!groupMap[gName]) groupMap[gName] = [];\n    groupMap[gName].push(item.book_id);\n}\n\nObject.keys(groupMap).forEach(function(gName) {\n    var bookIds = groupMap[gName];\n    var option = {\n        method: \"POST\",\n        body: JSON.stringify({ books: bookIds.map(function(id) { return { book_id: id, item_id: \"0\" }; }) })\n    };\n    ui.push({\n        title: \"　▌ \" + gName + \" (\" + bookIds.length + \")\",\n        url: \"https://fanqienovel.com/api/bookshelf/multidetail,\" + JSON.stringify(option),\n        style: {\n            layout_flexGrow: 1,\n            layout_flexBasisPercent: 0.25\n        }\n    });\n});\n\n// ===== 分隔 =====\nui.push({ title: \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\", url: \"\", style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } });\n\n// ===== 分类选择器 =====\nui.push({ title: \"分类\", type: \"select\", chars: BD, default: bd, action: A_board, style: { layout_flexBasisPercent: 1 } });\nui.push({ title: \"性别\", type: \"select\", chars: GENDERS, default: gender, action: A_gender, style: { layout_flexBasisPercent: 1 } });\nui.push({ title: \"状态\", type: \"select\", chars: STATUSES, default: status, action: A_status, style: { layout_flexBasisPercent: 1 } });\nui.push({ title: \"字数\", type: \"select\", chars: WORDCOUNTS, default: wordcount, action: A_wordcount, style: { layout_flexBasisPercent: 1 } });\nui.push({ title: \"排序\", type: \"select\", chars: SORTS, default: sort, action: A_sort, style: { layout_flexBasisPercent: 1 } });\n\n// ===== 标签标题 =====\nui.push({ title: \"　　　　　　 🔶🔸\" + bd + \" 标签🔸🔶 　　　　　　\", url: \"\", style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } });\n\n// ===== 标签展开 =====\nvar currentTags = TAGS[bd];\nObject.keys(currentTags).forEach(function(tag) {\n    var tagId = currentTags[tag];\n    var isSel = (tagSel == tag);\n    ui.push({\n        title: (isSel ? \"▌\" : \"　\") + tag,\n        url: buildUrl(tagId),\n        style: {\n            layout_flexGrow: 1,\n            layout_flexBasisPercent: 0.25\n        }\n    });\n});\n\nJSON.stringify(ui);\n\n</js>", "header": "{\n    \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.62 Mobile Safari/537.36\",\n    \"Referer\": \"https://fanqienovel.com/\",\n    \"ismobile\": 0\n  }", "jsLib": "function GetTitleDecode(res) {\n   var data1 = [\"s\", \"?\", \"作\", \"口\", \"在\", \"他\", \"能\", \"并\", \"B\", \"士\", \"4\", \"U\", \"克\", \"才\", \"正\", \"们\", \"字\", \"声\", \"高\", \"全\", \"尔\", \"活\", \"者\", \"动\", \"其\", \"主\", \"报\", \"多\", \"望\", \"放\", \"h\", \"w\", \"次\", \"年\", \"?\", \"中\", \"3\", \"特\", \"于\", \"十\", \"入\", \"要\", \"男\", \"同\", \"G\", \"面\", \"分\", \"方\", \"K\", \"什\", \"再\", \"教\", \"本\", \"己\", \"结\", \"1\", \"等\", \"世\", \"N\", \"?\", \"说\", \"g\", \"u\", \"期\", \"Z\", \"外\", \"美\", \"M\", \"行\", \"给\", \"9\", \"文\", \"将\", \"两\", \"许\", \"张\", \"友\", \"0\", \"英\", \"应\", \"向\", \"像\", \"此\", \"白\", \"安\", \"少\", \"何\", \"打\", \"气\", \"常\", \"定\", \"间\", \"花\", \"见\", \"孩\", \"它\", \"直\", \"风\", \"数\", \"使\", \"道\", \"第\", \"水\", \"已\", \"女\", \"山\", \"解\", \"d\", \"P\", \"的\", \"通\", \"关\", \"性\", \"叫\", \"儿\", \"L\", \"妈\", \"问\", \"回\", \"神\", \"来\", \"S\", \"?\", \"四\", \"里\", \"前\", \"国\", \"些\", \"O\", \"v\", \"l\", \"A\", \"心\", \"平\", \"自\", \"无\", \"军\", \"光\", \"代\", \"是\", \"好\", \"却\", \"c\", \"得\", \"种\", \"就\", \"意\", \"先\", \"立\", \"z\", \"子\", \"过\", \"Y\", \"j\", \"表\", \"?\", \"么\", \"所\", \"接\", \"了\", \"名\", \"金\", \"受\", \"J\", \"满\", \"眼\", \"没\", \"部\", \"那\", \"m\", \"每\", \"车\", \"度\", \"可\", \"R\", \"斯\", \"经\", \"现\", \"门\", \"明\", \"V\", \"如\", \"走\", \"命\", \"y\", \"6\", \"E\", \"战\", \"很\", \"上\", \"f\", \"月\", \"西\", \"7\", \"长\", \"夫\", \"想\", \"话\", \"变\", \"海\", \"机\", \"x\", \"到\", \"W\", \"一\", \"成\", \"生\", \"信\", \"笑\", \"但\", \"父\", \"开\", \"内\", \"东\", \"马\", \"日\", \"小\", \"而\", \"后\", \"带\", \"以\", \"三\", \"几\", \"为\", \"认\", \"X\", \"死\", \"员\", \"目\", \"位\", \"之\", \"学\", \"远\", \"人\", \"音\", \"呢\", \"我\", \"q\", \"乐\", \"象\", \"重\", \"对\", \"个\", \"被\", \"别\", \"F\", \"也\", \"书\", \"稜\", \"D\", \"写\", \"还\", \"因\", \"家\", \"发\", \"时\", \"i\", \"或\", \"住\", \"德\", \"当\", \"o\", \"I\", \"比\", \"觉\", \"然\", \"吃\", \"去\", \"公\", \"a\", \"老\", \"亲\", \"情\", \"体\", \"太\", \"b\", \"万\", \"C\", \"电\", \"理\", \"?\", \"失\", \"力\", \"更\", \"拉\", \"物\", \"着\", \"原\", \"她\", \" 工\", \"实\", \"色\", \"感\", \"记\", \"看\", \"出\", \"相\", \"路\", \"大\", \"你\", \"侯\", \"2\", \"和\", \"?\", \"与\", \"p\", \"样\", \"新\", \"只\", \"便\", \"最\", \"不\", \"进\", \"T\", \"r\", \"做\", \"格\", \"母\", \"总\", \"爱\", \"身\", \"师\", \"轻\", \"知\", \"往\", \"加\", \"从\", \"?\", \"天\", \"e\", \"H\", \"?\", \"听\", \"场\", \"由\", \"快\", \"边\", \" 让\", \"把\", \"任\", \"8\", \"条\", \"头\", \"事\", \"至\", \"起\", \"点\", \"真\", \"手\", \"这\", \"难\", \"都\", \"界\", \"用\", \"法\", \"n\", \"处\", \"下\", \"又\", \"Q\", \"告\", \"地\", \"5\", \"k\", \"t\", \"岁\", \"有\", \"会\", \"果\", \"利\", \"民\"]\n    var code = 58345;\n    var content = '';\n    var key='';\n    var index='';\n    var replacement='';\n    for (var i = 0; i < res.length; i++) {\n        key = res[i].charCodeAt(0);\n        index = key - code;\n        replacement =( data1[index] && data1[index] !== '?')? data1[index] : res[i];\n        content += replacement;\n    }\n    return content;\n}\n\nfunction GetContentDecode(res) {\n    var data2=[\"D\", \"在\", \"主\", \"特\", \"家\", \"军\", \"然\", \"表\", \"场\", \"4\", \"要\", \"只\", \"v\", \"和\", \"?\", \"6\", \"别\", \"还\", \"g\", \"现\", \"儿\", \"岁\", \"?\", \"?\", \"此\", \"象\", \"月\", \"3\", \"出\", \"战\", \"工\", \"相\", \"o\", \"男\", \"直\", \"失\", \"世\", \"F\", \"都\", \"平\", \"文\", \"什\", \"V\", \"O\", \"将\", \"真\", \"T\", \"那\", \"当\", \"?\", \"会\", \"立\", \"些\", \"u\", \"是\", \"十\", \"张\", \"学\", \"气\", \"大\", \"爱\", \"两\", \"命\", \"全\", \"后\", \"东\", \"性\", \"通\", \"被\", \"1\", \"它\", \"乐\", \"接\", \"而\", \"感\", \"车\", \"山\", \"公\", \"了\", \"常\", \"以\", \"何\", \"可\", \"话\", \"先\", \"p\", \"i\", \"叫\", \"轻\", \"M\", \"士\", \"w\", \"着\", \"变\", \"尔\", \"快\", \"l\", \"个\", \"说\", \"少\", \"色\", \"里\", \"安\", \"花\", \"远\", \"7\", \"难\", \"师\", \"放\", \"t\", \"报\", \"认\", \"面\", \"道\", \"S\", \"?\", \"克\", \"地\", \"度\", \"I\", \"好\", \"机\", \"U\", \"民\", \"写\", \"把\", \"万\", \"同\", \"水\", \"新\", \"没\", \"书\", \"电\", \"吃\", \"像\", \"斯\", \"5\", \"为\", \"y\", \"白\", \"几\", \"日\", \"教\", \"看\", \"但\", \"第\", \"加\", \"侯\", \"作\", \"上\", \"拉\", \"住\", \"有\", \"法\", \"r\", \"事\", \"应\", \"位\", \"利\", \"你\", \"声\", \"身\", \"国\", \"问\", \"马\", \"女\", \"他\", \"Y\", \"比\", \"父\", \"x\", \"A\", \"H\", \"N\", \"s\", \"X\", \"边\", \"美\", \"对\", \"所\", \"金\", \"活\", \"回\", \"意\", \"到\", \"z\", \"从\", \"j\", \"知\", \"又\", \"内\", \"因\", \"点\", \"Q\", \"三\", \"定\", \"8\", \"R\", \"b\", \"正\", \"或\", \"夫\", \"向\", \"德\", \"听\", \"更\", \"?\", \"得\", \"告\", \"并\", \"本\", \"q\", \"过\", \"记\", \"L\", \"让\", \"打\", \"f\", \"人\", \"就\", \"者\", \"去\", \"原\", \"满\", \"体\", \"做\", \"经\", \"K\", \"走\", \"如\", \"孩\", \"c\", \"G\", \"给\", \"使\", \"物\", \"?\", \"最\", \"笑\", \"部\", \"?\", \"员\", \"等\", \"受\", \"k\", \"行\", \"一\", \"条\", \"果\", \"动\", \"光\", \"门\", \"头\", \"见\", \"往\", \"自\", \"解\", \"成\", \"处\", \"天\", \"能\", \"于\", \"名\", \"其\", \"发\", \"总\", \"母\", \"的\", \"死\", \"手\", \"入\", \"路\", \"进\", \"心\", \"来\", \"h\", \"时\", \"力\", \"多\", \"开\", \"已\", \"许\", \"d\", \"至\", \"由\", \"很\", \"界\", \"n\", \"小\", \" 与\", \"Z\", \"想\", \"代\", \"么\", \"分\", \"生\", \"口\", \"再\", \"妈\", \"望\", \"次\", \"西\", \"风\", \"种\", \"带\", \"J\", \"?\", \"实\", \"情\", \"才\", \"这\", \"?\", \"E\", \"我\", \"神\", \"格\", \"长\", \"觉\", \"间\", \"年\", \"眼\", \"无\", \"不\", \"亲\", \"关\", \"结\", \"0\", \"友\", \"信\", \"下\", \"却\", \"重\", \"己\", \"老\", \"2\", \"音\", \"字\", \"m\", \"呢\", \"明\", \"之\", \"前\", \"高\", \"P\", \"B\", \"目\", \"太\", \"e\", \"9\", \"起\", \"稜\", \"她\", \"也\", \"W\", \"用\", \"方\", \"子\", \"英\", \"每\", \"理\", \"便\", \"四\", \"数\", \"期\", \"中\", \"C\", \"外\", \"样\", \"a\", \"海\", \"们\", \"任\"]\n    var code = 58344;\n    var content = '';\n    var key='';\n    var index='';\n    var replacement='';\n    for (var i = 0; i < res.length; i++) {\n        key = res[i].charCodeAt(0);\n        index = key - code;\n        replacement =( data2[index] && data2[index] !== '?')? data2[index] : res[i];\n        content += replacement;\n    }\n    return content;\n}\n\nfunction GetDecode(res) {\n   var data3= ['体', 'y', '十', '现', '快', '便', '话', '却', '月', '物', '水', '的', '放', '知', '爱', '万', '?', '表', '风', '理', 'O', '老', '也', 'p', '常', '克', '平', '几', '最', '主', '她', 's', '将', '法', '情', 'o', '光', 'a', '我', '呢', 'J', '员', '太', '每', '望', '受', '教', 'w', '利', '军', '已', 'U', '人', '如', '变', '得', '要', '少', '斯', '门', '电', 'm', '男', '没', 'A', 'K', '国', '时', '中', '走', '么', '何', '口', '小', '向', '问', '轻', 'T', 'd', '神', '下', '间', '车', 'f', 'G', '度', 'D', '又', '大', '面', '远', '就', '写', 'j', '给', '通', '起', '实', 'E', '?', '它', '去', 'S', '到', '道', '数', '吃', '们', '加', 'P', '是', '无', '把', '事', '西', '多', '界', '?', '发', '新', '外', '活', '解', '孩', '只', '作', '前', 'Y', '尔', '经', '?', 'u', '心', '告', '父', '等', 'Q', '民', '全', '这', '9', '果', '安', '?', 'i', '母', '8', 'r', '说', '任', '先', '和', '地', 'C', '张', '战', '场', 'g', '像', 'c', 'q', '你', '使', '?', '样', '总', '目', 'x', '性', '处', '音', '头', '?', '应', '乐', '关', '能', '花', 'l', '当', '名', '手', '4', '重', '字', '声', '力', '友', '然', '生', '代', '内', '里', '本', '回', '真', '入', '师', '象', '?', '0', '点', 'R', ' 亲', 'V', '种', '动', '英', '命', 'Z', 'h', 'X', '做', '特', '边', '高', '有', 'B', '为', '期', '自', '年', '马', '认', '出', '接', '至', 'H', '正', '方', '感', '所', '明', '者', '稜', 'F', '住', '学', '还', '分', '意', '更', '其', 'n', '但', '比', '觉', '以', '由', '死', '家', '让', '失', '士', 'L', '2', 'I', '金', '叫', '身', '报', '听', 'w', '再', '原', '山', '海', '白', '很', '见', '5', '直', '位', '第', '工', '个', '开', '岁', '好', '用', '都', '于', '可', '同', '3', '次', '四', '?', '日', '信', '与', '女', '笑', '满', '并', '部', '什', '不', '从', '或', '机', '此', '?', '了', '记', '三', 'e', '些', 'b', 'N', '夫', '会', '才', '儿', '眼', '两', '美', '被', '一', '公', '来', '立', 'z', '长', '对', '己', '看', 'k', '许', '因', '相', '色', '后', '往', '打', '结', '格', '过', '世', '气', '7', '子', '条', '在', '书', '之', '定', 'v', '拉', '成', '进', '带', '着', '东', '上', '想', '天', '他', '妈', '1', '文', '而', '路', '那', '别', '德', '6', 'M', 't', '行', '侯', '难']\n    var code = 58344;\n    var content = '';\n    var key='';\n    var index='';\n    var replacement='';\n    for (var i = 0; i < res.length; i++) {\n        key = res[i].charCodeAt(0);\n        index = key - code;\n        replacement =( data3[index] && data3[index] !== '?')? data3[index] : res[i];\n        content += replacement;\n    }\n    return content;\n}", "lastUpdateTime": "1788879791553", "loginUrl": "https://fanqienovel.com/main/writer/login", "respondTime": 180000, "ruleBookInfo": {"tocUrl": "@js:\nvar id = baseUrl.match(/\\d+/);\n`https://fanqienovel.com/api/reader/directory/detail?bookId=${id}`;"}, "ruleContent": {"content": "@js:\r\n// 1. 提取 content 字段\r\nvar m = result.match(/\"content\":\"([\\s\\S]*?)\",\"uid\"/);\r\nvar content = m ? m[1] : '';\r\n\r\n// 2. 先反转义 JSON 特殊字符\r\ncontent = content.replace(/\\\\u003C/g, '<')\r\n                 .replace(/\\\\u003E/g, '>')\r\n                 .replace(/\\\\u002F/g, '/')\r\n                 .replace(/\\\\n/g, '\\n')\r\n                 .replace(/\\\\\"/g, '\"');\r\n\r\n// 3. 提取所有 <p> 标签内容\r\nvar paras = content.match(/<p[^>]*>([\\s\\S]*?)<\\/p>/g) || [];\r\nvar texts = [];\r\nfor (var i = 0; i < paras.length; i++) {\r\n  var t = paras[i].replace(/<[^>]+>/g, '').trim();\r\n  if (t) {\r\n    texts.push(t);\r\n  }\r\n}\r\n\r\n// 4. 拼接\r\nvar raw = texts.join('\\n\\n');\r\n\r\n// 5. 解密\r\nresult = GetContentDecode(raw);\n\n// 6. 判断内容长度，过短则拼接提示文本\r\nif (result.length < 500) {\r\n  result = result + \"\\n\\n【请购买会员并在阅读登录账号!!!】\";\r\n}", "title": "@js:\nvar m = result.match(/\"title\":\"([^\"]+)\"/);\nvar title = m ? m[1] : '';\n// 去掉书名前缀\nvar idx = title.indexOf('第');\nif (idx > -1) {\n  title = title.substring(idx);\n}\n// 去掉\"在线免费阅读\"及之后的内容\nvar endIdx = title.indexOf('在线免费阅读');\nif (endIdx > -1) {\n  title = title.substring(0, endIdx);\n}\nresult = title.trim();"}, "ruleExplore": {"author": "author", "bookList": "<js>GetDecode(result); </js>\n.data.book_list[*]||.detail_list[*]", "bookUrl": "/{{$..book_id}}", "coverUrl": "thumb_url", "intro": "abstract", "kind": "creation_status&&read_count\n@js:\nvar state='';\nswitch(parseInt(String(result[0]))){\ncase 4:case 0: state='完结';break;\ncase 1: state='连载中';break;\ncase -1: state='已断更';break;\ndefault: state='已下架';break;\n}\nvar list=[];\nlist.push(state);\nlist.push(String(result[1]));\nresult=list.toString();", "lastChapter": "lastChapterTitle", "name": "book_name", "wordCount": "word_count"}, "ruleSearch": {"author": ".author", "bookList": "<js>GetTitleDecode(result); </js>\n.search_book_data_list[*]", "bookUrl": "/{{$..book_id}}", "checkKeyWord": "开店", "coverUrl": "thumb_url", "intro": ".book_abstract", "kind": "read_count&&.creation_status&&.category\n@js:\nvar read=parseInt(result[0]);\nif(read>10000)\n result[0]=(read/ 10000).toFixed(1)+'万';\nresult[0]=result[0]+'人在读';\nvar state='';\nswitch(parseInt(result[1])){\ncase 4:case 0: state='完结';break;\ncase 1: state='连载中';break;\ncase -1: state='已断更';break;\ndefault: state='已下架';break;\n}\nresult[1]=state;\nresult;", "lastChapter": ".last_chapter_title", "name": ".book_name", "wordCount": ".word_count"}, "ruleToc": {"chapterList": "@js:var data = JSON.parse(result);\nvar volume = data.data.chapterListWithVolume;\nvar flattenChapters = function (chapters) {\n    let flatArray = [];\n    for (let chapter of chapters) {\n        if (Array.isArray(chapter)) {\n            flatArray = flatArray.concat(flattenChapters(chapter));\n        } else {\n            flatArray.push(chapter);\n        }\n    }\n    return flatArray;\n}\nvar list = flattenChapters(volume);\nlist.forEach(function(item) {\n    item.itemId = 'https://fanqienovel.com/reader/' + item.itemId;\n});\nlist;", "chapterName": "title", "chapterUrl": "itemId", "preUpdateJs": "java.refreshTocUrl()"}, "searchUrl": "https://fanqienovel.com/api/author/search/search_book/v1?filter=127,127,127,127&page_count=10&page_index={{page-1}}&query_type=0&query_word={{key}}", "weight": 0},{"bookSourceComment": "此书源为个人用AI整合，主要功能是查找书籍。免费用户仅可阅读前十章，登录并购买官方会员后可解锁全部内容。", "bookSourceGroup": "不需要启用", "bookSourceName": "番茄（发现）", "bookSourceType": 0, "bookSourceUrl": "https://fanqienovel.com", "customButton": false, "customOrder": 2, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>\n// ========== 基础配置 ==========\nvar BASE_URL = \"https://fanqienovel.com/api/author/library/book_list/v/\";\n\nvar man = {\"都市\":\"1\",\"都市生活\":\"2\",\"玄幻\":\"7\",\"科幻\":\"8\",\"悬疑\":\"10\",\"乡村\":\"11\",\"历史\":\"12\",\"体育\":\"15\",\"武侠\":\"16\",\"影视小说\":\"45\",\"文学小说\":\"47\",\"生活\":\"48\",\"成功励志\":\"56\",\"文化历史\":\"62\",\"赘婿\":\"25\",\"神医\":\"26\",\"战神\":\"27\",\"奶爸\":\"42\",\"学霸\":\"82\",\"天才\":\"90\",\"腹黑\":\"92\",\"扮猪吃虎\":\"93\",\"鉴宝\":\"17\",\"系统\":\"19\",\"神豪\":\"20\",\"种田\":\"23\",\"重生\":\"36\",\"穿越\":\"37\",\"二次元\":\"39\",\"海岛\":\"40\",\"娱乐圈\":\"43\",\"空间\":\"44\",\"推理\":\"61\",\"洪荒\":\"66\",\"三国\":\"67\",\"末世\":\"68\",\"直播\":\"69\",\"无限流\":\"70\",\"诸天万界\":\"71\",\"大唐\":\"73\",\"宠物\":\"74\",\"外卖\":\"75\",\"星际\":\"77\",\"美食\":\"78\",\"年代\":\"79\",\"剑道\":\"80\",\"盗墓\":\"81\",\"战争\":\"97\",\"灵异\":\"100\",\"都市修真\":\"124\",\"家庭\":\"125\",\"明朝\":\"126\",\"职场\":\"127\",\"都市日常\":\"261\",\"都市脑洞\":\"262\",\"都市种田\":\"263\",\"历史脑洞\":\"272\",\"历史古代\":\"273\",\"惊悚\":\"322\",\"奥特同人\":\"367\",\"火影\":\"368\",\"反派\":\"369\",\"海贼\":\"370\",\"神奇宝贝\":\"371\",\"网游\":\"372\",\"西游\":\"373\",\"漫威\":\"374\",\"特种兵\":\"375\",\"龙珠\":\"376\",\"大秦\":\"377\",\"女帝\":\"378\",\"求生\":\"379\",\"聊天群\":\"381\",\"穿书\":\"382\",\"九叔\":\"383\",\"无敌\":\"384\",\"校花\":\"385\",\"单女主\":\"389\",\"无女主\":\"391\",\"都市青春\":\"396\",\"架空\":\"452\",\"开局\":\"453\",\"综漫\":\"465\",\"钓鱼\":\"493\",\"囤物资\":\"494\",\"四合院\":\"495\",\"国运\":\"496\",\"武将\":\"497\",\"皇帝\":\"498\",\"断层\":\"500\",\"宋朝\":\"501\",\"宫廷侯爵\":\"502\",\"清朝\":\"503\",\"抗战谍战\":\"504\",\"破案\":\"505\",\"神探\":\"506\",\"谍战\":\"507\",\"电竞\":\"508\",\"游戏主播\":\"509\",\"东方玄幻\":\"511\",\"异世大陆\":\"512\",\"高武世界\":\"513\",\"灵气复苏\":\"514\",\"末日求生\":\"515\",\"都市异能\":\"516\",\"修仙\":\"517\",\"特工\":\"518\",\"大小姐\":\"519\",\"大佬\":\"520\",\"打脸\":\"522\",\"双重生\":\"524\",\"同人\":\"538\",\"悬疑脑洞\":\"539\",\"克苏鲁\":\"705\",\"衍生同人\":\"718\",\"游戏体育\":\"746\",\"悬疑灵异\":\"751\",\"搞笑轻松\":\"778\",\"官场\":\"788\"};\n\nvar girls = {\"都市生活\":\"2\",\"现代言情\":\"3\",\"古代言情\":\"5\",\"科幻\":\"8\",\"悬疑\":\"10\",\"乡村\":\"11\",\"武侠\":\"16\",\"幻想言情\":\"32\",\"婚恋\":\"34\",\"影视小说\":\"45\",\"文学小说\":\"47\",\"生活\":\"48\",\"成功励志\":\"56\",\"文化历史\":\"62\",\"萌宝\":\"28\",\"豪门总裁\":\"29\",\"宠妻\":\"30\",\"学霸\":\"82\",\"公主\":\"83\",\"皇后\":\"84\",\"王妃\":\"85\",\"女强\":\"86\",\"皇叔\":\"87\",\"嫡女\":\"88\",\"精灵\":\"89\",\"天才\":\"90\",\"腹黑\":\"92\",\"扮猪吃虎\":\"93\",\"团宠\":\"94\",\"校园\":\"4\",\"系统\":\"19\",\"种田\":\"23\",\"快穿\":\"24\",\"重生\":\"36\",\"穿越\":\"37\",\"二次元\":\"39\",\"娱乐圈\":\"43\",\"空间\":\"44\",\"推理\":\"61\",\"末世\":\"68\",\"直播\":\"69\",\"兽世\":\"72\",\"清穿\":\"76\",\"星际\":\"77\",\"美食\":\"78\",\"年代\":\"79\",\"盗墓\":\"81\",\"虐文\":\"95\",\"甜宠\":\"96\",\"战争\":\"97\",\"灵异\":\"100\",\"家庭\":\"125\",\"职场\":\"127\",\"宫斗宅斗\":\"246\",\"医术\":\"247\",\"玄幻言情\":\"248\",\"古言脑洞\":\"253\",\"都市日常\":\"261\",\"马甲\":\"266\",\"现言脑洞\":\"267\",\"现言复仇\":\"268\",\"双男主\":\"275\",\"反派\":\"369\",\"病娇\":\"380\",\"穿书\":\"382\",\"无敌\":\"384\",\"青梅竹马\":\"387\",\"女扮男装\":\"388\",\"民国\":\"390\",\"无CP\":\"392\",\"可盐可甜\":\"454\",\"天作之合\":\"455\",\"情有独钟\":\"456\",\"虐渣\":\"457\",\"护短\":\"458\",\"古灵精怪\":\"459\",\"独宠\":\"460\",\"群穿\":\"461\",\"古穿今\":\"462\",\"今穿古\":\"463\",\"异世穿越\":\"464\",\"综漫\":\"465\",\"闪婚\":\"466\",\"隐婚\":\"467\",\"冰山\":\"468\",\"双面\":\"469\",\"替身\":\"470\",\"契约婚姻\":\"471\",\"豪门世家\":\"473\",\"日久生情\":\"474\",\"破镜重圆\":\"475\",\"双向奔赴\":\"476\",\"一见钟情\":\"477\",\"强强\":\"478\",\"带球跑\":\"479\",\"逃婚\":\"480\",\"暗恋\":\"482\",\"相爱相杀\":\"483\",\"HE\":\"484\",\"职场商战\":\"485\",\"明星\":\"486\",\"医生\":\"487\",\"律师\":\"488\",\"现言萌宝\":\"489\",\"厨娘\":\"490\",\"毒医\":\"491\",\"将军\":\"492\",\"囤物资\":\"494\",\"四合院\":\"495\",\"抗战谍战\":\"504\",\"破案\":\"505\",\"电竞\":\"508\",\"游戏主播\":\"509\",\"大小姐\":\"519\",\"大佬\":\"520\",\"作精\":\"521\",\"打脸\":\"522\",\"前世今生\":\"523\",\"双重生\":\"524\",\"同人\":\"538\",\"悬疑脑洞\":\"539\",\"逃荒\":\"557\",\"双洁\":\"702\",\"双女主\":\"704\",\"衍生同人\":\"718\",\"豪门爽文\":\"745\",\"游戏体育\":\"746\",\"悬疑恋爱\":\"747\",\"霸总\":\"748\",\"青春甜宠\":\"749\",\"职场婚恋\":\"750\",\"搞笑轻松\":\"778\"};\n\nvar action = {\"都市\":\"1\",\"都市生活\":\"2\",\"现代言情\":\"3\",\"古代言情\":\"5\",\"玄幻\":\"7\",\"科幻\":\"8\",\"悬疑\":\"10\",\"历史\":\"12\",\"武侠\":\"16\",\"幻想言情\":\"32\",\"影视小说\":\"45\",\"诗歌散文\":\"46\",\"文学小说\":\"47\",\"生活\":\"48\",\"社会科学\":\"50\",\"名著经典\":\"51\",\"科技\":\"52\",\"经济管理\":\"53\",\"教育\":\"54\",\"成功励志\":\"56\",\"推理悬疑\":\"61\",\"文化历史\":\"62\",\"中国名著\":\"98\",\"外国名著\":\"99\",\"战神\":\"27\",\"萌宝\":\"28\",\"豪门总裁\":\"29\",\"宠妻\":\"30\",\"学霸\":\"82\",\"公主\":\"83\",\"皇后\":\"84\",\"王妃\":\"85\",\"女强\":\"86\",\"嫡女\":\"88\",\"精灵\":\"89\",\"天才\":\"90\",\"腹黑\":\"92\",\"校园\":\"4\",\"种田\":\"23\",\"重生\":\"36\",\"穿越\":\"37\",\"娱乐圈\":\"43\",\"推理\":\"61\",\"直播\":\"69\",\"大唐\":\"73\",\"美食\":\"78\",\"年代\":\"79\",\"剑道\":\"80\",\"盗墓\":\"81\",\"甜宠\":\"96\",\"战争\":\"97\",\"灵异\":\"100\",\"国学\":\"116\",\"家庭\":\"125\",\"明朝\":\"126\",\"职场\":\"127\",\"法律\":\"142\",\"宫斗宅斗\":\"246\",\"玄幻言情\":\"248\",\"古言脑洞\":\"253\",\"都市日常\":\"261\",\"都市脑洞\":\"262\",\"现言脑洞\":\"267\",\"历史古代\":\"273\",\"两性\":\"274\",\"特种兵\":\"375\",\"青梅竹马\":\"387\",\"女扮男装\":\"388\",\"民国\":\"390\",\"外国文学\":\"397\",\"古代文学\":\"398\",\"当代文学\":\"399\",\"现实小说\":\"400\",\"文学理论\":\"401\",\"中国历史\":\"402\",\"世界历史\":\"403\",\"历史传记\":\"404\",\"人文社科\":\"405\",\"哲学宗教\":\"406\",\"心理学\":\"407\",\"政治军事\":\"408\",\"人物传记\":\"409\",\"个人成长\":\"410\",\"思维智商\":\"411\",\"人际交往\":\"412\",\"文化艺术\":\"413\",\"亲子家教\":\"415\",\"保健养生\":\"416\",\"时尚美妆\":\"418\",\"美食休闲\":\"419\",\"家居旅游\":\"420\",\"风水占卜\":\"421\",\"经典国学\":\"423\",\"架空\":\"452\",\"今穿古\":\"463\",\"冰山\":\"468\",\"豪门世家\":\"473\",\"一见钟情\":\"477\",\"暗恋\":\"482\",\"HE\":\"484\",\"学校教育\":\"721\",\"成人教育\":\"722\",\"豪门爽文\":\"745\",\"悬疑恋爱\":\"747\",\"霸总\":\"748\",\"青春甜宠\":\"749\",\"职场婚恋\":\"750\",\"悬疑灵异\":\"751\",\"官场\":\"788\"};\n\nvar TAGS = {\n    \"男频\": man,\n    \"女频\": girls,\n    \"出版文学\": action\n};\n\nvar GENDERS = [\"全部\", \"女生\", \"男生\"];\nvar STATUSES = [\"全部\", \"连载中\", \"已完结\"];\nvar WORDCOUNTS = [\"全部\", \"30万以下\", \"30-50万\", \"50-100万\", \"100-200万\", \"200万以上\"];\nvar SORTS = [\"最热\", \"最新\", \"字数\"];\n\nvar GENDER_ID = {\"全部\":\"-1\",\"女生\":\"0\",\"男生\":\"1\"};\nvar STATUS_ID = {\"全部\":\"-1\",\"连载中\":\"1\",\"已完结\":\"0\"};\nvar WORDCOUNT_ID = {\"全部\":\"-1\",\"30万以下\":\"0\",\"30-50万\":\"1\",\"50-100万\":\"2\",\"100-200万\":\"3\",\"200万以上\":\"4\"};\nvar SORT_ID = {\"最热\":\"0\",\"最新\":\"1\",\"字数\":\"2\"};\n\nvar BD = [\"男频\", \"女频\", \"出版文学\"];\n\n// ========== 状态 ==========\nvar st = {};\ntry { st = JSON.parse(source.getVariable()); } catch (e) { st = {}; }\n\n// 优先从 st 读（持久化的），infoMap 只在切换瞬间有用\nvar bd = st.board || \"男频\";\nif (BD.indexOf(bd) === -1) bd = \"男频\";\nvar gender = st.gender || \"全部\";\nvar status = st.status || \"全部\";\nvar wordcount = st.wordcount || \"全部\";\nvar sort = st.sort || \"最热\";\nvar tagSel = st.tag || \"\";\n\n// ========== Action（切板块时存进 st 并清 tag） ==========\nvar A_board = \"var s={};try{s=JSON.parse(source.getVariable())}catch(e){};s.board=infoMap['分类板块']||s.board||'男频';s.tag='';source.setVariable(JSON.stringify(s));java.refreshExplore();\";\nvar A_gender = \"var s={};try{s=JSON.parse(source.getVariable())}catch(e){};s.gender=infoMap['性别']||'全部';source.setVariable(JSON.stringify(s));java.refreshExplore();\";\nvar A_status = \"var s={};try{s=JSON.parse(source.getVariable())}catch(e){};s.status=infoMap['状态']||'全部';source.setVariable(JSON.stringify(s));java.refreshExplore();\";\nvar A_wordcount = \"var s={};try{s=JSON.parse(source.getVariable())}catch(e){};s.wordcount=infoMap['字数']||'全部';source.setVariable(JSON.stringify(s));java.refreshExplore();\";\nvar A_sort = \"var s={};try{s=JSON.parse(source.getVariable())}catch(e){};s.sort=infoMap['排序']||'最热';source.setVariable(JSON.stringify(s));java.refreshExplore();\";\n\n// ========== URL ==========\nfunction buildUrl(tagId) {\n    return BASE_URL +\n        \"?page_count=10\" +\n        \"&page_index={{(page-1)*10}}\" +\n        \"&gender=\" + (GENDER_ID[gender] || \"-1\") +\n        \"&category_id=\" + tagId +\n        \"&creation_status=\" + (STATUS_ID[status] || \"-1\") +\n        \"&word_count=\" + (WORDCOUNT_ID[wordcount] || \"-1\") +\n        \"&book_type=-1\" +\n        \"&sort=\" + (SORT_ID[sort] || \"0\");\n}\n\n// ========== UI ==========\nvar ui = [];\n\nui.push({ title: \"分类板块\", type: \"select\", chars: BD, default: bd, action: A_board, style: { layout_flexBasisPercent: 1 } });\nui.push({ title: \"性别\", type: \"select\", chars: GENDERS, default: gender, action: A_gender, style: { layout_flexBasisPercent: 1 } });\nui.push({ title: \"状态\", type: \"select\", chars: STATUSES, default: status, action: A_status, style: { layout_flexBasisPercent: 1 } });\nui.push({ title: \"字数\", type: \"select\", chars: WORDCOUNTS, default: wordcount, action: A_wordcount, style: { layout_flexBasisPercent: 1 } });\nui.push({ title: \"排序\", type: \"select\", chars: SORTS, default: sort, action: A_sort, style: { layout_flexBasisPercent: 1 } });\n\nui.push({ title: \"　　　　　　 \" + bd + \" 标签 　　　　　　\", url: \"\", style: { layout_flexGrow: 1, layout_flexBasisPercent: 1 } });\n\nvar currentTags = TAGS[bd];\nObject.keys(currentTags).forEach(function(tag) {\n    var tagId = currentTags[tag];\n    var isSel = (tagSel == tag);\n    ui.push({\n        title: (isSel ? \"▌\" : \"　\") + tag,\n        url: buildUrl(tagId),\n        style: {\n            layout_flexGrow: 1,\n            layout_flexBasisPercent: 0.25\n        }\n    });\n});\n\nJSON.stringify(ui);\n\n</js>", "header": "{\n    \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.62 Mobile Safari/537.36\",\n    \"Referer\": \"https://fanqienovel.com/\",\n    \"ismobile\": 0\n  }", "jsLib": "function GetTitleDecode(res) {\n   var data1 = [\"s\", \"?\", \"作\", \"口\", \"在\", \"他\", \"能\", \"并\", \"B\", \"士\", \"4\", \"U\", \"克\", \"才\", \"正\", \"们\", \"字\", \"声\", \"高\", \"全\", \"尔\", \"活\", \"者\", \"动\", \"其\", \"主\", \"报\", \"多\", \"望\", \"放\", \"h\", \"w\", \"次\", \"年\", \"?\", \"中\", \"3\", \"特\", \"于\", \"十\", \"入\", \"要\", \"男\", \"同\", \"G\", \"面\", \"分\", \"方\", \"K\", \"什\", \"再\", \"教\", \"本\", \"己\", \"结\", \"1\", \"等\", \"世\", \"N\", \"?\", \"说\", \"g\", \"u\", \"期\", \"Z\", \"外\", \"美\", \"M\", \"行\", \"给\", \"9\", \"文\", \"将\", \"两\", \"许\", \"张\", \"友\", \"0\", \"英\", \"应\", \"向\", \"像\", \"此\", \"白\", \"安\", \"少\", \"何\", \"打\", \"气\", \"常\", \"定\", \"间\", \"花\", \"见\", \"孩\", \"它\", \"直\", \"风\", \"数\", \"使\", \"道\", \"第\", \"水\", \"已\", \"女\", \"山\", \"解\", \"d\", \"P\", \"的\", \"通\", \"关\", \"性\", \"叫\", \"儿\", \"L\", \"妈\", \"问\", \"回\", \"神\", \"来\", \"S\", \"?\", \"四\", \"里\", \"前\", \"国\", \"些\", \"O\", \"v\", \"l\", \"A\", \"心\", \"平\", \"自\", \"无\", \"军\", \"光\", \"代\", \"是\", \"好\", \"却\", \"c\", \"得\", \"种\", \"就\", \"意\", \"先\", \"立\", \"z\", \"子\", \"过\", \"Y\", \"j\", \"表\", \"?\", \"么\", \"所\", \"接\", \"了\", \"名\", \"金\", \"受\", \"J\", \"满\", \"眼\", \"没\", \"部\", \"那\", \"m\", \"每\", \"车\", \"度\", \"可\", \"R\", \"斯\", \"经\", \"现\", \"门\", \"明\", \"V\", \"如\", \"走\", \"命\", \"y\", \"6\", \"E\", \"战\", \"很\", \"上\", \"f\", \"月\", \"西\", \"7\", \"长\", \"夫\", \"想\", \"话\", \"变\", \"海\", \"机\", \"x\", \"到\", \"W\", \"一\", \"成\", \"生\", \"信\", \"笑\", \"但\", \"父\", \"开\", \"内\", \"东\", \"马\", \"日\", \"小\", \"而\", \"后\", \"带\", \"以\", \"三\", \"几\", \"为\", \"认\", \"X\", \"死\", \"员\", \"目\", \"位\", \"之\", \"学\", \"远\", \"人\", \"音\", \"呢\", \"我\", \"q\", \"乐\", \"象\", \"重\", \"对\", \"个\", \"被\", \"别\", \"F\", \"也\", \"书\", \"稜\", \"D\", \"写\", \"还\", \"因\", \"家\", \"发\", \"时\", \"i\", \"或\", \"住\", \"德\", \"当\", \"o\", \"I\", \"比\", \"觉\", \"然\", \"吃\", \"去\", \"公\", \"a\", \"老\", \"亲\", \"情\", \"体\", \"太\", \"b\", \"万\", \"C\", \"电\", \"理\", \"?\", \"失\", \"力\", \"更\", \"拉\", \"物\", \"着\", \"原\", \"她\", \" 工\", \"实\", \"色\", \"感\", \"记\", \"看\", \"出\", \"相\", \"路\", \"大\", \"你\", \"侯\", \"2\", \"和\", \"?\", \"与\", \"p\", \"样\", \"新\", \"只\", \"便\", \"最\", \"不\", \"进\", \"T\", \"r\", \"做\", \"格\", \"母\", \"总\", \"爱\", \"身\", \"师\", \"轻\", \"知\", \"往\", \"加\", \"从\", \"?\", \"天\", \"e\", \"H\", \"?\", \"听\", \"场\", \"由\", \"快\", \"边\", \" 让\", \"把\", \"任\", \"8\", \"条\", \"头\", \"事\", \"至\", \"起\", \"点\", \"真\", \"手\", \"这\", \"难\", \"都\", \"界\", \"用\", \"法\", \"n\", \"处\", \"下\", \"又\", \"Q\", \"告\", \"地\", \"5\", \"k\", \"t\", \"岁\", \"有\", \"会\", \"果\", \"利\", \"民\"]\n    var code = 58345;\n    var content = '';\n    var key='';\n    var index='';\n    var replacement='';\n    for (var i = 0; i < res.length; i++) {\n        key = res[i].charCodeAt(0);\n        index = key - code;\n        replacement =( data1[index] && data1[index] !== '?')? data1[index] : res[i];\n        content += replacement;\n    }\n    return content;\n}\n\nfunction GetContentDecode(res) {\n    var data2=[\"D\", \"在\", \"主\", \"特\", \"家\", \"军\", \"然\", \"表\", \"场\", \"4\", \"要\", \"只\", \"v\", \"和\", \"?\", \"6\", \"别\", \"还\", \"g\", \"现\", \"儿\", \"岁\", \"?\", \"?\", \"此\", \"象\", \"月\", \"3\", \"出\", \"战\", \"工\", \"相\", \"o\", \"男\", \"直\", \"失\", \"世\", \"F\", \"都\", \"平\", \"文\", \"什\", \"V\", \"O\", \"将\", \"真\", \"T\", \"那\", \"当\", \"?\", \"会\", \"立\", \"些\", \"u\", \"是\", \"十\", \"张\", \"学\", \"气\", \"大\", \"爱\", \"两\", \"命\", \"全\", \"后\", \"东\", \"性\", \"通\", \"被\", \"1\", \"它\", \"乐\", \"接\", \"而\", \"感\", \"车\", \"山\", \"公\", \"了\", \"常\", \"以\", \"何\", \"可\", \"话\", \"先\", \"p\", \"i\", \"叫\", \"轻\", \"M\", \"士\", \"w\", \"着\", \"变\", \"尔\", \"快\", \"l\", \"个\", \"说\", \"少\", \"色\", \"里\", \"安\", \"花\", \"远\", \"7\", \"难\", \"师\", \"放\", \"t\", \"报\", \"认\", \"面\", \"道\", \"S\", \"?\", \"克\", \"地\", \"度\", \"I\", \"好\", \"机\", \"U\", \"民\", \"写\", \"把\", \"万\", \"同\", \"水\", \"新\", \"没\", \"书\", \"电\", \"吃\", \"像\", \"斯\", \"5\", \"为\", \"y\", \"白\", \"几\", \"日\", \"教\", \"看\", \"但\", \"第\", \"加\", \"侯\", \"作\", \"上\", \"拉\", \"住\", \"有\", \"法\", \"r\", \"事\", \"应\", \"位\", \"利\", \"你\", \"声\", \"身\", \"国\", \"问\", \"马\", \"女\", \"他\", \"Y\", \"比\", \"父\", \"x\", \"A\", \"H\", \"N\", \"s\", \"X\", \"边\", \"美\", \"对\", \"所\", \"金\", \"活\", \"回\", \"意\", \"到\", \"z\", \"从\", \"j\", \"知\", \"又\", \"内\", \"因\", \"点\", \"Q\", \"三\", \"定\", \"8\", \"R\", \"b\", \"正\", \"或\", \"夫\", \"向\", \"德\", \"听\", \"更\", \"?\", \"得\", \"告\", \"并\", \"本\", \"q\", \"过\", \"记\", \"L\", \"让\", \"打\", \"f\", \"人\", \"就\", \"者\", \"去\", \"原\", \"满\", \"体\", \"做\", \"经\", \"K\", \"走\", \"如\", \"孩\", \"c\", \"G\", \"给\", \"使\", \"物\", \"?\", \"最\", \"笑\", \"部\", \"?\", \"员\", \"等\", \"受\", \"k\", \"行\", \"一\", \"条\", \"果\", \"动\", \"光\", \"门\", \"头\", \"见\", \"往\", \"自\", \"解\", \"成\", \"处\", \"天\", \"能\", \"于\", \"名\", \"其\", \"发\", \"总\", \"母\", \"的\", \"死\", \"手\", \"入\", \"路\", \"进\", \"心\", \"来\", \"h\", \"时\", \"力\", \"多\", \"开\", \"已\", \"许\", \"d\", \"至\", \"由\", \"很\", \"界\", \"n\", \"小\", \" 与\", \"Z\", \"想\", \"代\", \"么\", \"分\", \"生\", \"口\", \"再\", \"妈\", \"望\", \"次\", \"西\", \"风\", \"种\", \"带\", \"J\", \"?\", \"实\", \"情\", \"才\", \"这\", \"?\", \"E\", \"我\", \"神\", \"格\", \"长\", \"觉\", \"间\", \"年\", \"眼\", \"无\", \"不\", \"亲\", \"关\", \"结\", \"0\", \"友\", \"信\", \"下\", \"却\", \"重\", \"己\", \"老\", \"2\", \"音\", \"字\", \"m\", \"呢\", \"明\", \"之\", \"前\", \"高\", \"P\", \"B\", \"目\", \"太\", \"e\", \"9\", \"起\", \"稜\", \"她\", \"也\", \"W\", \"用\", \"方\", \"子\", \"英\", \"每\", \"理\", \"便\", \"四\", \"数\", \"期\", \"中\", \"C\", \"外\", \"样\", \"a\", \"海\", \"们\", \"任\"]\n    var code = 58344;\n    var content = '';\n    var key='';\n    var index='';\n    var replacement='';\n    for (var i = 0; i < res.length; i++) {\n        key = res[i].charCodeAt(0);\n        index = key - code;\n        replacement =( data2[index] && data2[index] !== '?')? data2[index] : res[i];\n        content += replacement;\n    }\n    return content;\n}\n\nfunction GetDecode(res) {\n   var data3= ['体', 'y', '十', '现', '快', '便', '话', '却', '月', '物', '水', '的', '放', '知', '爱', '万', '?', '表', '风', '理', 'O', '老', '也', 'p', '常', '克', '平', '几', '最', '主', '她', 's', '将', '法', '情', 'o', '光', 'a', '我', '呢', 'J', '员', '太', '每', '望', '受', '教', 'w', '利', '军', '已', 'U', '人', '如', '变', '得', '要', '少', '斯', '门', '电', 'm', '男', '没', 'A', 'K', '国', '时', '中', '走', '么', '何', '口', '小', '向', '问', '轻', 'T', 'd', '神', '下', '间', '车', 'f', 'G', '度', 'D', '又', '大', '面', '远', '就', '写', 'j', '给', '通', '起', '实', 'E', '?', '它', '去', 'S', '到', '道', '数', '吃', '们', '加', 'P', '是', '无', '把', '事', '西', '多', '界', '?', '发', '新', '外', '活', '解', '孩', '只', '作', '前', 'Y', '尔', '经', '?', 'u', '心', '告', '父', '等', 'Q', '民', '全', '这', '9', '果', '安', '?', 'i', '母', '8', 'r', '说', '任', '先', '和', '地', 'C', '张', '战', '场', 'g', '像', 'c', 'q', '你', '使', '?', '样', '总', '目', 'x', '性', '处', '音', '头', '?', '应', '乐', '关', '能', '花', 'l', '当', '名', '手', '4', '重', '字', '声', '力', '友', '然', '生', '代', '内', '里', '本', '回', '真', '入', '师', '象', '?', '0', '点', 'R', ' 亲', 'V', '种', '动', '英', '命', 'Z', 'h', 'X', '做', '特', '边', '高', '有', 'B', '为', '期', '自', '年', '马', '认', '出', '接', '至', 'H', '正', '方', '感', '所', '明', '者', '稜', 'F', '住', '学', '还', '分', '意', '更', '其', 'n', '但', '比', '觉', '以', '由', '死', '家', '让', '失', '士', 'L', '2', 'I', '金', '叫', '身', '报', '听', 'w', '再', '原', '山', '海', '白', '很', '见', '5', '直', '位', '第', '工', '个', '开', '岁', '好', '用', '都', '于', '可', '同', '3', '次', '四', '?', '日', '信', '与', '女', '笑', '满', '并', '部', '什', '不', '从', '或', '机', '此', '?', '了', '记', '三', 'e', '些', 'b', 'N', '夫', '会', '才', '儿', '眼', '两', '美', '被', '一', '公', '来', '立', 'z', '长', '对', '己', '看', 'k', '许', '因', '相', '色', '后', '往', '打', '结', '格', '过', '世', '气', '7', '子', '条', '在', '书', '之', '定', 'v', '拉', '成', '进', '带', '着', '东', '上', '想', '天', '他', '妈', '1', '文', '而', '路', '那', '别', '德', '6', 'M', 't', '行', '侯', '难']\n    var code = 58344;\n    var content = '';\n    var key='';\n    var index='';\n    var replacement='';\n    for (var i = 0; i < res.length; i++) {\n        key = res[i].charCodeAt(0);\n        index = key - code;\n        replacement =( data3[index] && data3[index] !== '?')? data3[index] : res[i];\n        content += replacement;\n    }\n    return content;\n}", "lastUpdateTime": "1788873876751", "loginUrl": "https://fanqienovel.com/main/writer/login", "respondTime": 180000, "ruleBookInfo": {"tocUrl": "@js:\nvar id = baseUrl.match(/\\d+/);\n`https://fanqienovel.com/api/reader/directory/detail?bookId=${id}`;"}, "ruleContent": {"content": "@js:\r\n// 1. 提取 content 字段\r\nvar m = result.match(/\"content\":\"([\\s\\S]*?)\",\"uid\"/);\r\nvar content = m ? m[1] : '';\r\n\r\n// 2. 先反转义 JSON 特殊字符\r\ncontent = content.replace(/\\\\u003C/g, '<')\r\n                 .replace(/\\\\u003E/g, '>')\r\n                 .replace(/\\\\u002F/g, '/')\r\n                 .replace(/\\\\n/g, '\\n')\r\n                 .replace(/\\\\\"/g, '\"');\r\n\r\n// 3. 提取所有 <p> 标签内容\r\nvar paras = content.match(/<p[^>]*>([\\s\\S]*?)<\\/p>/g) || [];\r\nvar texts = [];\r\nfor (var i = 0; i < paras.length; i++) {\r\n  var t = paras[i].replace(/<[^>]+>/g, '').trim();\r\n  if (t) {\r\n    texts.push(t);\r\n  }\r\n}\r\n\r\n// 4. 拼接\r\nvar raw = texts.join('\\n\\n');\r\n\r\n// 5. 解密\r\nresult = GetContentDecode(raw);\n\n// 6. 判断内容长度，过短则拼接提示文本\r\nif (result.length < 500) {\r\n  result = result + \"\\n\\n【请购买会员并在阅读登录账号!!!】\";\r\n}", "title": "@js:\nvar m = result.match(/\"title\":\"([^\"]+)\"/);\nvar title = m ? m[1] : '';\n// 去掉书名前缀\nvar idx = title.indexOf('第');\nif (idx > -1) {\n  title = title.substring(idx);\n}\n// 去掉\"在线免费阅读\"及之后的内容\nvar endIdx = title.indexOf('在线免费阅读');\nif (endIdx > -1) {\n  title = title.substring(0, endIdx);\n}\nresult = title.trim();"}, "ruleExplore": {"author": "author", "bookList": "<js>GetDecode(result); </js>\n.data.book_list[*]", "bookUrl": "/{{$..book_id}}", "coverUrl": "thumb_url", "intro": "abstract", "kind": "creation_status&&read_count\n@js:\nvar state='';\nswitch(parseInt(String(result[0]))){\ncase 4:case 0: state='完结';break;\ncase 1: state='连载中';break;\ncase -1: state='已断更';break;\ndefault: state='已下架';break;\n}\nvar list=[];\nlist.push(state);\nlist.push(String(result[1]));\nresult=list.toString();", "lastChapter": "lastChapterTitle", "name": "book_name", "wordCount": "word_count"}, "ruleSearch": {"author": ".author", "bookList": "<js>GetTitleDecode(result); </js>\n.search_book_data_list[*]", "bookUrl": "/{{$..book_id}}", "checkKeyWord": "开店", "coverUrl": "thumb_url", "intro": ".book_abstract", "kind": "read_count&&.creation_status&&.category\n@js:\nvar read=parseInt(result[0]);\nif(read>10000)\n result[0]=(read/ 10000).toFixed(1)+'万';\nresult[0]=result[0]+'人在读';\nvar state='';\nswitch(parseInt(result[1])){\ncase 4:case 0: state='完结';break;\ncase 1: state='连载中';break;\ncase -1: state='已断更';break;\ndefault: state='已下架';break;\n}\nresult[1]=state;\nresult;", "lastChapter": ".last_chapter_title", "name": ".book_name", "wordCount": ".word_count"}, "ruleToc": {"chapterList": "@js:var data = JSON.parse(result);\nvar volume = data.data.chapterListWithVolume;\nvar flattenChapters = function (chapters) {\n    let flatArray = [];\n    for (let chapter of chapters) {\n        if (Array.isArray(chapter)) {\n            flatArray = flatArray.concat(flattenChapters(chapter));\n        } else {\n            flatArray.push(chapter);\n        }\n    }\n    return flatArray;\n}\nvar list = flattenChapters(volume);\nlist.forEach(function(item) {\n    item.itemId = 'https://fanqienovel.com/reader/' + item.itemId;\n});\nlist;", "chapterName": "title", "chapterUrl": "itemId", "preUpdateJs": "java.refreshTocUrl()"}, "searchUrl": "https://fanqienovel.com/api/author/search/search_book/v1?filter=127,127,127,127&page_count=10&page_index={{page-1}}&query_type=0&query_word={{key}}", "weight": 0},{"bookSourceComment": "此书源为个人用AI整合，主要功能是查找书籍。免费用户仅可阅读前十章，登录并购买官方会员后可解锁全部内容。", "bookSourceGroup": "嘿嘿", "bookSourceName": "番茄（发现）", "bookSourceType": 0, "bookSourceUrl": "https://fanqienovel.com", "customButton": false, "customOrder": 2, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>\n// API URL模板，使用占位符\nvar url = 'https://fanqienovel.com/api/author/library/book_list/v/?page_count=10&page_index={{(page-1)*10}}&gender=genderId&category_id=categoryId&creation_status=statusId&word_count=wordcountId&book_type=-1&sort=sortId';\n\n// 基础类型配置模板\nvar baseTypeConfig = {\n    \"categoryId\": 0,\n    \"genderId\": \"-1\",\n    \"statusId\": \"-1\", \n    \"wordcountId\": \"-1\",\n    \"sortId\": \"0\"\n};\n\n// 通用的类型配置生成器\nfunction generateTypeConfig(categoryId, defaultGender = '-1') {\n    return [\n        /*\n        // 全部类型\n        {\"title\": \"全部-最热\", \"categoryId\": categoryId, \"genderId\": \"-1\", \"statusId\": \"-1\", \"wordcountId\": \"-1\", \"sortId\": \"0\"},\n        {\"title\": \"全部-最新\", \"categoryId\": categoryId, \"genderId\": \"-1\", \"statusId\": \"-1\", \"wordcountId\": \"-1\", \"sortId\": \"1\"},\n        {\"title\": \"全部-字数\", \"categoryId\": categoryId, \"genderId\": \"-1\", \"statusId\": \"-1\", \"wordcountId\": \"-1\", \"sortId\": \"2\"},\n        \n        // 女生类型\n        {\"title\": \"女生-最热\", \"categoryId\": categoryId, \"genderId\": \"0\", \"statusId\": \"-1\", \"wordcountId\": \"-1\", \"sortId\": \"0\"},\n        {\"title\": \"女生-最新\", \"categoryId\": categoryId, \"genderId\": \"0\", \"statusId\": \"-1\", \"wordcountId\": \"-1\", \"sortId\": \"1\"},\n        {\"title\": \"女生-字数\", \"categoryId\": categoryId, \"genderId\": \"0\", \"statusId\": \"-1\", \"wordcountId\": \"-1\", \"sortId\": \"2\"},\n        \n        // 男生类型  \n        {\"title\": \"男生-最热\", \"categoryId\": categoryId, \"genderId\": \"1\", \"statusId\": \"-1\", \"wordcountId\": \"-1\", \"sortId\": \"0\"},\n        {\"title\": \"男生-最新\", \"categoryId\": categoryId, \"genderId\": \"1\", \"statusId\": \"-1\", \"wordcountId\": \"-1\", \"sortId\": \"1\"},\n        {\"title\": \"男生-字数\", \"categoryId\": categoryId, \"genderId\": \"1\", \"statusId\": \"-1\", \"wordcountId\": \"-1\", \"sortId\": \"2\"},\n        \n        // 状态分类（使用默认性别）\n        {\"title\": \"最热-已完结\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"0\", \"wordcountId\": \"-1\", \"sortId\": \"0\"},\n        {\"title\": \"最热-连载中\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"1\", \"wordcountId\": \"-1\", \"sortId\": \"0\"},\n        {\"title\": \"最新-已完结\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"0\", \"wordcountId\": \"-1\", \"sortId\": \"1\"},\n        {\"title\": \"最新-连载中\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"1\", \"wordcountId\": \"-1\", \"sortId\": \"1\"},\n        {\"title\": \"字数-已完结\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"0\", \"wordcountId\": \"-1\", \"sortId\": \"2\"},\n        {\"title\": \"字数-连载中\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"1\", \"wordcountId\": \"-1\", \"sortId\": \"2\"},\n        */\n        // 字数分类 - 连载\n        {\"title\": \"最热连载30万以下\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"1\", \"wordcountId\": \"0\", \"sortId\": \"0\"},\n        {\"title\": \"最新连载30万以下\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"1\", \"wordcountId\": \"0\", \"sortId\": \"1\"},\n        {\"title\": \"最热连载30-50万\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"1\", \"wordcountId\": \"1\", \"sortId\": \"0\"},\n        {\"title\": \"最新连载30-50万\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"1\", \"wordcountId\": \"1\", \"sortId\": \"1\"},\n        {\"title\": \"最热连载50-100万\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"1\", \"wordcountId\": \"2\", \"sortId\": \"0\"},\n        {\"title\": \"最新连载50-100万\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"1\", \"wordcountId\": \"2\", \"sortId\": \"1\"},\n        {\"title\": \"最热连载100-200万\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"1\", \"wordcountId\": \"3\", \"sortId\": \"0\"},\n        {\"title\": \"最新连载100-200万\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"1\", \"wordcountId\": \"3\", \"sortId\": \"1\"},\n        {\"title\": \"最热连载200万以上\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"1\", \"wordcountId\": \"4\", \"sortId\": \"0\"},\n        {\"title\": \"最新连载200万以上\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"1\", \"wordcountId\": \"4\", \"sortId\": \"1\"},\n        /*\n        // 字数分类 - 完结\n        {\"title\": \"最热完结30万以下\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"0\", \"wordcountId\": \"0\", \"sortId\": \"0\"},\n        {\"title\": \"最新完结30万以下\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"0\", \"wordcountId\": \"0\", \"sortId\": \"1\"},\n        {\"title\": \"最热完结30-50万\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"0\", \"wordcountId\": \"1\", \"sortId\": \"0\"},\n        {\"title\": \"最新完结30-50万\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"0\", \"wordcountId\": \"1\", \"sortId\": \"1\"},\n        {\"title\": \"最热完结50-100万\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"0\", \"wordcountId\": \"2\", \"sortId\": \"0\"},\n        {\"title\": \"最新完结50-100万\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"0\", \"wordcountId\": \"2\", \"sortId\": \"1\"},\n        {\"title\": \"最热完结100-200万\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"0\", \"wordcountId\": \"3\", \"sortId\": \"0\"},\n        {\"title\": \"最新完结100-200万\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"0\", \"wordcountId\": \"3\", \"sortId\": \"1\"},\n        {\"title\": \"最热完结200万以上\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"0\", \"wordcountId\": \"4\", \"sortId\": \"0\"},\n        {\"title\": \"最新完结200万以上\", \"categoryId\": categoryId, \"genderId\": defaultGender, \"statusId\": \"0\", \"wordcountId\": \"4\", \"sortId\": \"1\"}\n */\n   ];\n}\n\n// 样式模板\nvar titleduf = {\n    \"title\": \"\",\n    \"url\": \"\", \n    \"style\": {\n        \"layout_flexGrow\": 1, \n        \"layout_flexBasisPercent\": 1\n    }\n};\nvar urlduf = {\n    \"title\": \"\",\n    \"url\": \"\",\n    \"style\": {\n        \"layout_flexGrow\": 1,\n        \"layout_flexBasisPercent\": 0.3\n    }\n};\n\n// URL参数替换函数\nfunction replaceUrlParams(urlTemplate, params) {\n    return urlTemplate.replace(/categoryId|genderId|statusId|wordcountId|sortId/gi, \n        matched => params[matched]);\n}\n\n// 主处理函数：将类型配置转换为结果JSON\nvar reultJson = [];\n\nfunction AddJson(title, listMap) {\n    // 添加标题项\n    var titleItem = JSON.parse(JSON.stringify(titleduf));\n    titleItem.title = title;\n    reultJson.push(titleItem);\n    \n    // 添加URL项\n    listMap.forEach(obj => {\n        var urlItem = JSON.parse(JSON.stringify(urlduf));\n        urlItem.title = obj.title;\n        urlItem.url = replaceUrlParams(url, obj);\n        reultJson.push(urlItem);\n    });\n}\n\n// 定义分类配置并一次性处理\nvar categoryConfigs = [\n    {name: \"🍃无CP🍃\", id: 392, gender: \"0\"},\n    {name: \"🍃双女主🍃\", id: 704, gender: \"0\"},\n    {name: \"🍃无女主🍃\", id: 391, gender: \"1\"},\n    {name: \"🍃单女主🍃\", id: 389, gender: \"1\"}\n];\n\n// 处理所有分类配置\ncategoryConfigs.forEach(config => {\n    var typeList = generateTypeConfig(config.id, config.gender);\n    AddJson(config.name, typeList);\n});\n\n// 输出最终结果\nJSON.stringify(reultJson);\n\n</js>", "header": "{\n    \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.62 Mobile Safari/537.36\",\n    \"Referer\": \"https://fanqienovel.com/\",\n    \"ismobile\": 0\n  }", "jsLib": "function GetTitleDecode(res) {\n   var data1 = [\"s\", \"?\", \"作\", \"口\", \"在\", \"他\", \"能\", \"并\", \"B\", \"士\", \"4\", \"U\", \"克\", \"才\", \"正\", \"们\", \"字\", \"声\", \"高\", \"全\", \"尔\", \"活\", \"者\", \"动\", \"其\", \"主\", \"报\", \"多\", \"望\", \"放\", \"h\", \"w\", \"次\", \"年\", \"?\", \"中\", \"3\", \"特\", \"于\", \"十\", \"入\", \"要\", \"男\", \"同\", \"G\", \"面\", \"分\", \"方\", \"K\", \"什\", \"再\", \"教\", \"本\", \"己\", \"结\", \"1\", \"等\", \"世\", \"N\", \"?\", \"说\", \"g\", \"u\", \"期\", \"Z\", \"外\", \"美\", \"M\", \"行\", \"给\", \"9\", \"文\", \"将\", \"两\", \"许\", \"张\", \"友\", \"0\", \"英\", \"应\", \"向\", \"像\", \"此\", \"白\", \"安\", \"少\", \"何\", \"打\", \"气\", \"常\", \"定\", \"间\", \"花\", \"见\", \"孩\", \"它\", \"直\", \"风\", \"数\", \"使\", \"道\", \"第\", \"水\", \"已\", \"女\", \"山\", \"解\", \"d\", \"P\", \"的\", \"通\", \"关\", \"性\", \"叫\", \"儿\", \"L\", \"妈\", \"问\", \"回\", \"神\", \"来\", \"S\", \"?\", \"四\", \"里\", \"前\", \"国\", \"些\", \"O\", \"v\", \"l\", \"A\", \"心\", \"平\", \"自\", \"无\", \"军\", \"光\", \"代\", \"是\", \"好\", \"却\", \"c\", \"得\", \"种\", \"就\", \"意\", \"先\", \"立\", \"z\", \"子\", \"过\", \"Y\", \"j\", \"表\", \"?\", \"么\", \"所\", \"接\", \"了\", \"名\", \"金\", \"受\", \"J\", \"满\", \"眼\", \"没\", \"部\", \"那\", \"m\", \"每\", \"车\", \"度\", \"可\", \"R\", \"斯\", \"经\", \"现\", \"门\", \"明\", \"V\", \"如\", \"走\", \"命\", \"y\", \"6\", \"E\", \"战\", \"很\", \"上\", \"f\", \"月\", \"西\", \"7\", \"长\", \"夫\", \"想\", \"话\", \"变\", \"海\", \"机\", \"x\", \"到\", \"W\", \"一\", \"成\", \"生\", \"信\", \"笑\", \"但\", \"父\", \"开\", \"内\", \"东\", \"马\", \"日\", \"小\", \"而\", \"后\", \"带\", \"以\", \"三\", \"几\", \"为\", \"认\", \"X\", \"死\", \"员\", \"目\", \"位\", \"之\", \"学\", \"远\", \"人\", \"音\", \"呢\", \"我\", \"q\", \"乐\", \"象\", \"重\", \"对\", \"个\", \"被\", \"别\", \"F\", \"也\", \"书\", \"稜\", \"D\", \"写\", \"还\", \"因\", \"家\", \"发\", \"时\", \"i\", \"或\", \"住\", \"德\", \"当\", \"o\", \"I\", \"比\", \"觉\", \"然\", \"吃\", \"去\", \"公\", \"a\", \"老\", \"亲\", \"情\", \"体\", \"太\", \"b\", \"万\", \"C\", \"电\", \"理\", \"?\", \"失\", \"力\", \"更\", \"拉\", \"物\", \"着\", \"原\", \"她\", \" 工\", \"实\", \"色\", \"感\", \"记\", \"看\", \"出\", \"相\", \"路\", \"大\", \"你\", \"侯\", \"2\", \"和\", \"?\", \"与\", \"p\", \"样\", \"新\", \"只\", \"便\", \"最\", \"不\", \"进\", \"T\", \"r\", \"做\", \"格\", \"母\", \"总\", \"爱\", \"身\", \"师\", \"轻\", \"知\", \"往\", \"加\", \"从\", \"?\", \"天\", \"e\", \"H\", \"?\", \"听\", \"场\", \"由\", \"快\", \"边\", \" 让\", \"把\", \"任\", \"8\", \"条\", \"头\", \"事\", \"至\", \"起\", \"点\", \"真\", \"手\", \"这\", \"难\", \"都\", \"界\", \"用\", \"法\", \"n\", \"处\", \"下\", \"又\", \"Q\", \"告\", \"地\", \"5\", \"k\", \"t\", \"岁\", \"有\", \"会\", \"果\", \"利\", \"民\"]\n    var code = 58345;\n    var content = '';\n    var key='';\n    var index='';\n    var replacement='';\n    for (var i = 0; i < res.length; i++) {\n        key = res[i].charCodeAt(0);\n        index = key - code;\n        replacement =( data1[index] && data1[index] !== '?')? data1[index] : res[i];\n        content += replacement;\n    }\n    return content;\n}\n\nfunction GetContentDecode(res) {\n    var data2=[\"D\", \"在\", \"主\", \"特\", \"家\", \"军\", \"然\", \"表\", \"场\", \"4\", \"要\", \"只\", \"v\", \"和\", \"?\", \"6\", \"别\", \"还\", \"g\", \"现\", \"儿\", \"岁\", \"?\", \"?\", \"此\", \"象\", \"月\", \"3\", \"出\", \"战\", \"工\", \"相\", \"o\", \"男\", \"直\", \"失\", \"世\", \"F\", \"都\", \"平\", \"文\", \"什\", \"V\", \"O\", \"将\", \"真\", \"T\", \"那\", \"当\", \"?\", \"会\", \"立\", \"些\", \"u\", \"是\", \"十\", \"张\", \"学\", \"气\", \"大\", \"爱\", \"两\", \"命\", \"全\", \"后\", \"东\", \"性\", \"通\", \"被\", \"1\", \"它\", \"乐\", \"接\", \"而\", \"感\", \"车\", \"山\", \"公\", \"了\", \"常\", \"以\", \"何\", \"可\", \"话\", \"先\", \"p\", \"i\", \"叫\", \"轻\", \"M\", \"士\", \"w\", \"着\", \"变\", \"尔\", \"快\", \"l\", \"个\", \"说\", \"少\", \"色\", \"里\", \"安\", \"花\", \"远\", \"7\", \"难\", \"师\", \"放\", \"t\", \"报\", \"认\", \"面\", \"道\", \"S\", \"?\", \"克\", \"地\", \"度\", \"I\", \"好\", \"机\", \"U\", \"民\", \"写\", \"把\", \"万\", \"同\", \"水\", \"新\", \"没\", \"书\", \"电\", \"吃\", \"像\", \"斯\", \"5\", \"为\", \"y\", \"白\", \"几\", \"日\", \"教\", \"看\", \"但\", \"第\", \"加\", \"侯\", \"作\", \"上\", \"拉\", \"住\", \"有\", \"法\", \"r\", \"事\", \"应\", \"位\", \"利\", \"你\", \"声\", \"身\", \"国\", \"问\", \"马\", \"女\", \"他\", \"Y\", \"比\", \"父\", \"x\", \"A\", \"H\", \"N\", \"s\", \"X\", \"边\", \"美\", \"对\", \"所\", \"金\", \"活\", \"回\", \"意\", \"到\", \"z\", \"从\", \"j\", \"知\", \"又\", \"内\", \"因\", \"点\", \"Q\", \"三\", \"定\", \"8\", \"R\", \"b\", \"正\", \"或\", \"夫\", \"向\", \"德\", \"听\", \"更\", \"?\", \"得\", \"告\", \"并\", \"本\", \"q\", \"过\", \"记\", \"L\", \"让\", \"打\", \"f\", \"人\", \"就\", \"者\", \"去\", \"原\", \"满\", \"体\", \"做\", \"经\", \"K\", \"走\", \"如\", \"孩\", \"c\", \"G\", \"给\", \"使\", \"物\", \"?\", \"最\", \"笑\", \"部\", \"?\", \"员\", \"等\", \"受\", \"k\", \"行\", \"一\", \"条\", \"果\", \"动\", \"光\", \"门\", \"头\", \"见\", \"往\", \"自\", \"解\", \"成\", \"处\", \"天\", \"能\", \"于\", \"名\", \"其\", \"发\", \"总\", \"母\", \"的\", \"死\", \"手\", \"入\", \"路\", \"进\", \"心\", \"来\", \"h\", \"时\", \"力\", \"多\", \"开\", \"已\", \"许\", \"d\", \"至\", \"由\", \"很\", \"界\", \"n\", \"小\", \" 与\", \"Z\", \"想\", \"代\", \"么\", \"分\", \"生\", \"口\", \"再\", \"妈\", \"望\", \"次\", \"西\", \"风\", \"种\", \"带\", \"J\", \"?\", \"实\", \"情\", \"才\", \"这\", \"?\", \"E\", \"我\", \"神\", \"格\", \"长\", \"觉\", \"间\", \"年\", \"眼\", \"无\", \"不\", \"亲\", \"关\", \"结\", \"0\", \"友\", \"信\", \"下\", \"却\", \"重\", \"己\", \"老\", \"2\", \"音\", \"字\", \"m\", \"呢\", \"明\", \"之\", \"前\", \"高\", \"P\", \"B\", \"目\", \"太\", \"e\", \"9\", \"起\", \"稜\", \"她\", \"也\", \"W\", \"用\", \"方\", \"子\", \"英\", \"每\", \"理\", \"便\", \"四\", \"数\", \"期\", \"中\", \"C\", \"外\", \"样\", \"a\", \"海\", \"们\", \"任\"]\n    var code = 58344;\n    var content = '';\n    var key='';\n    var index='';\n    var replacement='';\n    for (var i = 0; i < res.length; i++) {\n        key = res[i].charCodeAt(0);\n        index = key - code;\n        replacement =( data2[index] && data2[index] !== '?')? data2[index] : res[i];\n        content += replacement;\n    }\n    return content;\n}\n\nfunction GetDecode(res) {\n   var data3= ['体', 'y', '十', '现', '快', '便', '话', '却', '月', '物', '水', '的', '放', '知', '爱', '万', '?', '表', '风', '理', 'O', '老', '也', 'p', '常', '克', '平', '几', '最', '主', '她', 's', '将', '法', '情', 'o', '光', 'a', '我', '呢', 'J', '员', '太', '每', '望', '受', '教', 'w', '利', '军', '已', 'U', '人', '如', '变', '得', '要', '少', '斯', '门', '电', 'm', '男', '没', 'A', 'K', '国', '时', '中', '走', '么', '何', '口', '小', '向', '问', '轻', 'T', 'd', '神', '下', '间', '车', 'f', 'G', '度', 'D', '又', '大', '面', '远', '就', '写', 'j', '给', '通', '起', '实', 'E', '?', '它', '去', 'S', '到', '道', '数', '吃', '们', '加', 'P', '是', '无', '把', '事', '西', '多', '界', '?', '发', '新', '外', '活', '解', '孩', '只', '作', '前', 'Y', '尔', '经', '?', 'u', '心', '告', '父', '等', 'Q', '民', '全', '这', '9', '果', '安', '?', 'i', '母', '8', 'r', '说', '任', '先', '和', '地', 'C', '张', '战', '场', 'g', '像', 'c', 'q', '你', '使', '?', '样', '总', '目', 'x', '性', '处', '音', '头', '?', '应', '乐', '关', '能', '花', 'l', '当', '名', '手', '4', '重', '字', '声', '力', '友', '然', '生', '代', '内', '里', '本', '回', '真', '入', '师', '象', '?', '0', '点', 'R', ' 亲', 'V', '种', '动', '英', '命', 'Z', 'h', 'X', '做', '特', '边', '高', '有', 'B', '为', '期', '自', '年', '马', '认', '出', '接', '至', 'H', '正', '方', '感', '所', '明', '者', '稜', 'F', '住', '学', '还', '分', '意', '更', '其', 'n', '但', '比', '觉', '以', '由', '死', '家', '让', '失', '士', 'L', '2', 'I', '金', '叫', '身', '报', '听', 'w', '再', '原', '山', '海', '白', '很', '见', '5', '直', '位', '第', '工', '个', '开', '岁', '好', '用', '都', '于', '可', '同', '3', '次', '四', '?', '日', '信', '与', '女', '笑', '满', '并', '部', '什', '不', '从', '或', '机', '此', '?', '了', '记', '三', 'e', '些', 'b', 'N', '夫', '会', '才', '儿', '眼', '两', '美', '被', '一', '公', '来', '立', 'z', '长', '对', '己', '看', 'k', '许', '因', '相', '色', '后', '往', '打', '结', '格', '过', '世', '气', '7', '子', '条', '在', '书', '之', '定', 'v', '拉', '成', '进', '带', '着', '东', '上', '想', '天', '他', '妈', '1', '文', '而', '路', '那', '别', '德', '6', 'M', 't', '行', '侯', '难']\n    var code = 58344;\n    var content = '';\n    var key='';\n    var index='';\n    var replacement='';\n    for (var i = 0; i < res.length; i++) {\n        key = res[i].charCodeAt(0);\n        index = key - code;\n        replacement =( data3[index] && data3[index] !== '?')? data3[index] : res[i];\n        content += replacement;\n    }\n    return content;\n}", "lastUpdateTime": "1788871409442", "loginUrl": "https://fanqienovel.com/main/writer/login", "respondTime": 180000, "ruleBookInfo": {"tocUrl": "@js:\nvar id = baseUrl.match(/\\d+/);\n`https://fanqienovel.com/api/reader/directory/detail?bookId=${id}`;"}, "ruleContent": {"content": "@js:\r\n// 1. 提取 content 字段\r\nvar m = result.match(/\"content\":\"([\\s\\S]*?)\",\"uid\"/);\r\nvar content = m ? m[1] : '';\r\n\r\n// 2. 先反转义 JSON 特殊字符\r\ncontent = content.replace(/\\\\u003C/g, '<')\r\n                 .replace(/\\\\u003E/g, '>')\r\n                 .replace(/\\\\u002F/g, '/')\r\n                 .replace(/\\\\n/g, '\\n')\r\n                 .replace(/\\\\\"/g, '\"');\r\n\r\n// 3. 提取所有 <p> 标签内容\r\nvar paras = content.match(/<p[^>]*>([\\s\\S]*?)<\\/p>/g) || [];\r\nvar texts = [];\r\nfor (var i = 0; i < paras.length; i++) {\r\n  var t = paras[i].replace(/<[^>]+>/g, '').trim();\r\n  if (t) {\r\n    texts.push(t);\r\n  }\r\n}\r\n\r\n// 4. 拼接\r\nvar raw = texts.join('\\n\\n');\r\n\r\n// 5. 解密\r\nresult = GetContentDecode(raw);\n\n// 6. 判断内容长度，过短则拼接提示文本\r\nif (result.length < 500) {\r\n  result = result + \"\\n\\n【请购买会员并在阅读登录账号!!!】\";\r\n}", "title": "@js:\nvar m = result.match(/\"title\":\"([^\"]+)\"/);\nvar title = m ? m[1] : '';\n// 去掉书名前缀\nvar idx = title.indexOf('第');\nif (idx > -1) {\n  title = title.substring(idx);\n}\n// 去掉\"在线免费阅读\"及之后的内容\nvar endIdx = title.indexOf('在线免费阅读');\nif (endIdx > -1) {\n  title = title.substring(0, endIdx);\n}\nresult = title.trim();"}, "ruleExplore": {"author": "author", "bookList": "<js>GetDecode(result); </js>\n.data.book_list[*]", "bookUrl": "/{{$..book_id}}", "coverUrl": "thumb_url", "intro": "abstract", "kind": "creation_status&&read_count\n@js:\nvar state='';\nswitch(parseInt(String(result[0]))){\ncase 4:case 0: state='完结';break;\ncase 1: state='连载中';break;\ncase -1: state='已断更';break;\ndefault: state='已下架';break;\n}\nvar list=[];\nlist.push(state);\nlist.push(String(result[1]));\nresult=list.toString();", "lastChapter": "lastChapterTitle", "name": "book_name", "wordCount": "word_count"}, "ruleSearch": {"author": ".author", "bookList": "<js>GetTitleDecode(result); </js>\n.search_book_data_list[*]", "bookUrl": "/{{$..book_id}}", "checkKeyWord": "开店", "coverUrl": "thumb_url", "intro": ".book_abstract", "kind": "read_count&&.creation_status&&.category\n@js:\nvar read=parseInt(result[0]);\nif(read>10000)\n result[0]=(read/ 10000).toFixed(1)+'万';\nresult[0]=result[0]+'人在读';\nvar state='';\nswitch(parseInt(result[1])){\ncase 4:case 0: state='完结';break;\ncase 1: state='连载中';break;\ncase -1: state='已断更';break;\ndefault: state='已下架';break;\n}\nresult[1]=state;\nresult;", "lastChapter": ".last_chapter_title", "name": ".book_name", "wordCount": ".word_count"}, "ruleToc": {"chapterList": "@js:var data = JSON.parse(result);\nvar volume = data.data.chapterListWithVolume;\nvar flattenChapters = function (chapters) {\n    let flatArray = [];\n    for (let chapter of chapters) {\n        if (Array.isArray(chapter)) {\n            flatArray = flatArray.concat(flattenChapters(chapter));\n        } else {\n            flatArray.push(chapter);\n        }\n    }\n    return flatArray;\n}\nvar list = flattenChapters(volume);\nlist.forEach(function(item) {\n    item.itemId = 'https://fanqienovel.com/reader/' + item.itemId;\n});\nlist;", "chapterName": "title", "chapterUrl": "itemId", "preUpdateJs": "java.refreshTocUrl()"}, "searchUrl": "https://fanqienovel.com/api/author/search/search_book/v1?filter=127,127,127,127&page_count=10&page_index={{page-1}}&query_type=0&query_word={{key}}", "weight": 0},{"bookSourceComment": "// 目录获取失败的小说网站里也没有相关内容\n// 港梯免验证", "bookSourceGroup": "🍊 女频", "bookSourceName": "🍊 半夏小说[梯]", "bookSourceType": 0, "bookSourceUrl": "https://www.xbanxia.cc/", "customOrder": -1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "耽美同人::/list/1_{{page}}.html\n男頻熱文::/list/2_{{page}}.html\n現代情感::/list/3_{{page}}.html\n古裝迷情::/list/4_{{page}}.html\n穿越重生::/list/5_{{page}}.html\n其他言情::/list/6_{{page}}.html\n臺灣言情::/list/7_{{page}}.html\n網游科幻::/list/8_{{page}}.html\n恐怖推理::/list/9_{{page}}.html\n仙俠言情::/list/10_{{page}}.html\n玄幻言情::/list/11_{{page}}.html\nBG同人::/list/12_{{page}}.html", "header": "{\n\t\"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36\",\n\t\"Referer\": \"https://www.xbanxia.cc/\"\n}", "lastUpdateTime": "1788840203257", "respondTime": 180000, "ruleBookInfo": {"author": "class.book-describe@tag.p.0@text", "coverUrl": "class.book-img@img@src", "intro": "class.describe-html@tag.p.0@text", "kind": "class.book-describe@tag.p.3@text##最近更新:", "lastChapter": "class.book-describe@tag.p.4@text##最近章節:", "name": "class.book-describe@tag.h1@text", "tocUrl": "class.book-list clearfix@tag.li"}, "ruleContent": {"content": "id.nr1@html", "replaceRegex": "##{{chapter.title}}"}, "ruleExplore": [], "ruleSearch": {"author": "class.pop-intro@text", "bookList": "class.pop-books2 clearfix@tag.ol", "bookUrl": "tag.a.0@href", "checkKeyWord": "偉大航路賣八卦的人生", "coverUrl": "img@src", "intro": "", "kind": "", "name": "tag.a.0@text", "wordCount": ""}, "ruleToc": {"chapterList": "class.book-list clearfix@tag.li", "chapterName": "tag.a@text", "chapterUrl": "tag.a@href"}, "searchUrl": "https://www.xbanxia.cc/modules/article/search_t.php?charset=utf-8&searchkey={{key}}&Submit=&page={{page}}", "weight": 0},{"bookSourceComment": "须菠萝猫书源配合\n找书啦 zhaoshu.la —— 在线求书互助站\n· 发现：最新已解决 / 最新未解决 / 全部求书 / 🙋我的求书（每页10条，page 翻页）\n· 搜索：/search/{关键词}/all/，匹配求书帖标题+描述\n· 详情：/request/{id}.html\n· ★简介用官方 <useweb> 浏览器渲染：简介里直接生成橙色按钮，点一下就走 legado://import/addToBookshelf 深链 → 按各书源详情页正则匹配 → 直接打开那本书的详情页\n· 目录：把「求书原帖 + 每一条书友回复」映射成虚拟章节；标题带 🔗 表示该回复含书源网址，带 ✅ 表示已被采纳；回复里每条网址再生成「🔗 一键开书」章节（点它直接调起阅读）\n· 正文：展示该条回复全文 + 提取出的网址 + 复制网址跳转提示\n· 登录界面可登录 / 检查登录状态 / 退出 / 发布求书帖（书名2~200字，描述≥10字；站点无删除功能）\n· 站点必须使用手机端 UA，桌面 UA 会被 GoEdge WAF 拦截（302 到 /WAF/VERIFY/CAPTCHA）\n· 阅读全部匿名可访问，无需登录；登录仅用于发帖/回复\n· 服务器响应较慢（单页约 6~7 秒），已放宽 timeout\n", "bookSourceGroup": "AI书源", "bookSourceName": "🔍 找书啦·求书互助", "bookSourceType": 0, "bookSourceUrl": "https://www.zhaoshu.la", "bookUrlPattern": "https?://(?:www\\.)?zhaoshu\\.la/request/\\d+\\.html", "customButton": false, "customOrder": 6, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "🔥 最新已解决::https://www.zhaoshu.la/solved/{{page>1?'page/'+page:''}}&&⏳ 最新未解决::https://www.zhaoshu.la/unsolved/{{page>1?'page/'+page:''}}&&📚 全部求书::https://www.zhaoshu.la/all/{{page>1?'page/'+page:''}}&&🙋 我的求书::https://www.zhaoshu.la/user/requests.php", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36\", \"Accept-Language\": \"zh-CN,zh;q=0.9,en;q=0.8\"}", "lastUpdateTime": "1788781557116", "loginCheckJs": "(function(){\n  try {\n    /* 未登录访问「我的求书」时站点 302 → /auth/login.php，\n       因此判据是：最终 URL 是登录页（而不是原来写的 /user/requests.php，\n       那个 URL 在重定向后永远不会出现，提示从来不会弹）。 */\n    var u = String(result.url() || '');\n    if (u.indexOf('/auth/login.php') >= 0) {\n      java.toast('⚠️ 查看「我的求书」需要先登录：书源管理 → 本来源 → 登录');\n    }\n  } catch (e) {}\n  return result;\n})()\n", "loginUi": "[{\"name\": \"邮箱\", \"type\": \"text\", \"hint\": \"找书啦登录邮箱（浏览找书无需登录）\"}, {\"name\": \"密码\", \"type\": \"password\", \"hint\": \"登录密码\"}, {\"name\": \"① 登录\", \"type\": \"button\", \"action\": \"login()\"}, {\"name\": \"② 检查登录状态\", \"type\": \"button\", \"action\": \"checkLogin()\"}, {\"name\": \"③ 退出登录\", \"type\": \"button\", \"action\": \"logout()\"}, {\"name\": \"书名\", \"type\": \"text\", \"hint\": \"发布求书：书名（2~200字）\"}, {\"name\": \"描述\", \"type\": \"text\", \"hint\": \"发布求书：线索描述（≥10字，作者/平台/字数/渠道等）\"}, {\"name\": \"④ 发布求书帖\", \"type\": \"button\", \"action\": \"publishRequest()\"}, {\"name\": \"⑤ 我的求书入口\", \"type\": \"button\", \"action\": \"openMyRequests()\"}, {\"name\": \"📖 使用说明\", \"type\": \"button\", \"action\": \"showHelp()\"}]", "loginUrl": "function zsHomeHtml(){\n    try { return String(java.ajax('https://www.zhaoshu.la/')); } catch(e) { return ''; }\n}\nfunction zsLogged(html){\n    // 判据：页头「退出登录 /auth/logout.php」链接只在已登录时渲染。\n    // 不能用 /request/create.php —— 首页导航栏常年挂这个入口占位；\n    // 也不能用「登录你的找书啦账号」反向判断 —— 这句是登录框副标题，登录页必含。\n    return String(html).indexOf('/auth/logout.php') >= 0;\n}\nfunction zsFlashMsg(html){\n    var m = String(html).match(/--danger-bg[^>]*>([\\s\\S]*?)<\\/div>/);\n    if (!m) return '';\n    return String(m[1]).replace(/<[^>]+>/g, '').replace(/\\s+/g, '');\n}\n/* 取指定页面的 csrf_token。页面自身渲染失败/被WAF时才返回空串；\n   旧版曾把「登录你的找书啦账号」当未登录哨兵——实际上它是登录框副标题，\n   登录页本身就含这句话，导致 token 永远被清空（260907 修复）。 */\nfunction zsCsrf(path){\n    var h = '';\n    try { h = String(java.ajax('https://www.zhaoshu.la' + path)); } catch(e) { return ''; }\n    var m = h.match(/name=\"csrf_token\" value=\"([0-9a-f]+)\"/);\n    return m ? m[1] : '';\n}\nfunction zsToken(){ return zsCsrf('/auth/login.php'); }\n/* 表单 POST，走 java.ajax 的 URL 选项式以复用 CookieJar 与书源 UA */\nfunction zsPost(path, formObj){\n    var pairs = [];\n    for (var k in formObj) pairs.push(encodeURIComponent(k) + '=' + encodeURIComponent(formObj[k]));\n    var opt = { method: 'POST', body: pairs.join('&'),\n                headers: { 'Content-Type': 'application/x-www-form-urlencoded' } };\n    return String(java.ajax('https://www.zhaoshu.la' + path + ',' + JSON.stringify(opt)));\n}\nfunction zsGet(path){\n    try { return String(java.ajax('https://www.zhaoshu.la' + path)); } catch(e) { return ''; }\n}\n/* 站点对「未登录时的POST」一律 302 → 首页（登录成功也 302 → 首页），\n   POST 响应体被重定向吞掉 flash（如\"邮箱或密码错误\"）。\n   会话是否有效用 GET 首页看「退出登录」链接复核。 */\nfunction zsSessionValid(){\n    return zsLogged(zsHomeHtml());\n}\nfunction login(){\n    var em = '', pw = '';\n    try {\n        em = String(result.get('邮箱') || '').trim();\n        pw = String(result.get('密码') || '');\n    } catch (e) { em = ''; pw = ''; }\n    if (!em || !pw) { java.toast('⚠️ 请先填写邮箱和密码'); return; }\n    java.toast('⏳ 正在登录找书啦…');\n    try {\n        var tk = zsToken();\n        if (!tk) { java.toast('❌ 未取得CSRF令牌，站点可能触发WAF，请稍后再试'); return; }\n        var res = zsPost('/auth/login.php', { csrf_token: tk, email: em, password: pw });\n        if (res.indexOf('GOEDGE_WAF') >= 0) {\n            java.toast('❌ 触发WAF人机验证，请先用浏览器打开网站过一次验证');\n            return;\n        }\n        /* 会话复核：登录成败不能只看 POST 响应（可能被 302 重定向改写），\n           重新 GET 首页看「退出登录」链接是否出现 */\n        if (zsSessionValid()) {\n            java.toast('✅ 登录成功：' + em + '　现在可以发布求书帖了');\n        } else {\n            var fm = zsFlashMsg(res);\n            if (!fm) {\n                /* flash 可能被 302 吞掉，补一发登录页 GET 兜底 */\n                fm = zsFlashMsg(String(java.ajax('https://www.zhaoshu.la/auth/login.php')));\n            }\n            java.toast('❌ 登录失败：' + (fm || '邮箱或密码不正确'));\n        }\n    } catch (e2) {\n        java.toast('❌ 登录异常：' + e2.message);\n    }\n}\n/* 发布求书帖：POST /request/create.php  csrf_token + book_name + description */\nfunction publishRequest(){\n    var nm = '', ds = '';\n    try {\n        nm = String(result.get('书名') || '').trim();\n        ds = String(result.get('描述') || '').trim();\n    } catch (e) { nm = ''; ds = ''; }\n    if (!nm || nm.length < 2)  { java.toast('⚠️ 书名至少 2 个字'); return; }\n    if (nm.length > 200)       { java.toast('⚠️ 书名不能超过 200 字'); return; }\n    if (!ds || ds.length < 10) { java.toast('⚠️ 描述至少 10 个字，线索越详细越容易被找到'); return; }\n    java.toast('⏳ 正在发布求书帖…');\n    try {\n        /* 260907实测：已登录但处于发帖限制时，create.php 会静默 302 回首页（无表单无提示），\n           必须先判页面形态再决定提示，否则会把\"限制中\"误报成\"未登录\" */\n        var cp = zsGet('/request/create.php');\n        if (cp.indexOf('name=\"book_name\"') < 0) {\n            if (zsLogged(cp)) {\n                java.toast('❌ 站点暂不接受发布：可能处于发帖冷却期（发帖后一段时间内不能再发）或账号受限，请稍后再试');\n            } else {\n                java.toast('❌ 未登录无法发布：请先填邮箱密码点「① 登录」');\n            }\n            return;\n        }\n        var tk = (cp.match(/name=\"csrf_token\" value=\"([0-9a-f]+)\"/) || [])[1] || '';\n        if (!tk) { java.toast('❌ 未取得CSRF令牌，请稍后再试'); return; }\n        if (!zsSessionValid()) { java.toast('❌ 登录已失效，请重新点「① 登录」'); return; }\n        var res = zsPost('/request/create.php', { csrf_token: tk, book_name: nm, description: ds });\n        if (res.indexOf('GOEDGE_WAF') >= 0) {\n            java.toast('❌ 触发WAF人机验证，请先用浏览器打开网站过一次验证');\n            return;\n        }\n        var cid = res.match(/canonical\" href=\"https?:\\/\\/[^\\/]+\\/request\\/(\\d+)\\.html\"/);\n        if (res.indexOf('发布成功') >= 0 || (cid && res.indexOf('request-book-name') >= 0)) {\n            java.longToast('✅ 发布成功' + (cid ? ('：求书帖 #' + cid[1] + '《' + nm + '》') : '')\n                + '\\n可在发现页「🙋 我的求书」查看。'\n                + '\\n注意：站点不提供删除功能，帖子会长期公开。');\n        } else {\n            java.toast('❌ 发布失败：' + (zsFlashMsg(res) || '请确认已登录且描述不少于10字'));\n        }\n    } catch (e3) {\n        java.toast('❌ 发布异常：' + e3.message);\n    }\n}\nfunction openMyRequests(){\n    java.toast('🙋 我的求书：回到书源「发现」页，点最后一个分类「🙋 我的求书」即可');\n}\nfunction checkLogin(){\n    java.toast('⏳ 正在检查登录状态…');\n    var h = zsHomeHtml();\n    if (!h) { java.toast('❌ 无法访问网站，请检查网络'); return; }\n    if (h.indexOf('GOEDGE_WAF') >= 0) { java.toast('❌ 触发WAF人机验证，请稍后重试'); return; }\n    if (zsLogged(h)) {\n        var m = h.match(/user-name\">([^<]+)</);\n        var n = h.match(/user-title[^>]*>([^<]*)</);\n        java.toast('✅ 已登录：' + (m ? m[1] : '未知用户') + (n ? '（' + n[1].trim() + '）' : '') + '　可发布/回复求书帖');\n    } else {\n        java.toast('⚠️ 未登录（浏览找书无需登录，发帖/回复才需要）');\n    }\n}\nfunction logout(){\n    try {\n        try { source.removeLoginInfo(); } catch(e0) {}\n        cookie.removeCookie('https://www.zhaoshu.la/');\n        try { source.removeLoginHeader(); } catch(e1) {}\n        var still = zsLogged(zsHomeHtml());\n        java.toast(still ? '⚠️ 已清除本站Cookie，但站点仍判定为登录中，重启阅读后生效'\n                         : '🚪 已退出登录（本站Cookie已清除）');\n    } catch (e) { java.toast('❌ 退出失败：' + e.message); }\n}\nfunction showHelp(){\n    var t = '【找书啦 使用说明】' + String.fromCharCode(10)\n          + '1. 发现页：最新已解决 / 最新未解决 / 全部求书 / 我的求书' + String.fromCharCode(10)\n          + '2. 搜索框输入书名，匹配的是求书帖标题与描述' + String.fromCharCode(10)\n          + '3. 点书名进详情页，书友回复里带网址即为找到的书源' + String.fromCharCode(10)\n          + '4. 详情页简介是网页渲染的，直接点橙色「📖 打开这本书」按钮即可调起该书详情页' + String.fromCharCode(10)\n          + '5. 目录里每条网址也会生成「🔗 一键开书」章节，作为按钮之外的双保险' + String.fromCharCode(10)\n          + '6. 发布求书：先点「① 登录」，再填「书名」「描述」两点，点「④ 发布求书帖」' + String.fromCharCode(10)\n          + '   书名字数 2~200，描述至少 10 字；站点无删除功能，请谨慎发布' + String.fromCharCode(10)\n          + '7. 发布后点「发现 → 🙋 我的求书」查看自己的帖子（未登录时该页为空）' + String.fromCharCode(10)\n          + '8. 浏览找书无需登录；只有发帖/回复才需要登录' + String.fromCharCode(10)\n          + '9. 本站必须使用手机UA，电脑UA会触发GoEdge WAF人机验证';\n    try { java.longToast(t); } catch (e) { try { java.toast(t); } catch (e2) { java.copyText(t); } }\n}", "respondTime": 180000, "ruleBookInfo": {"author": "@js:(function(){var d=(result&&typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var e=d.select('div.detail-user-name a').first();return e?e.text().trim():'';})()", "intro": "@js:(function(){var Jsoup=Packages.org.jsoup.Jsoup;var d=(result&&typeof result.select==='function')?result:Jsoup.parse(String(result));var SOH=String.fromCharCode(1);function esc(s){return String(s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/\"/g,'&quot;');}function T(el){if(!el)return '';var s=String(el.html()).replace(/<br\\s*\\/?>/gi,SOH);var ps=String(Jsoup.parseBodyFragment(s).text()).split(SOH);for(var i=0;i<ps.length;i++)ps[i]=ps[i].trim();return ps.join('<br>');}function host(u){var m=String(u).match(/^https?:\\/\\/([^\\/]+)/i);return m?m[1].replace(/^www\\./,''):String(u).substring(0,26);}var v='';try{v=String(source.getVariable()||'').trim();}catch(e){v='';}var OPT=v?',{\"origin\":\"'+v+'\"}':'';function deep(u){return 'legado://import/addToBookshelf?src='+encodeURIComponent(String(u)+OPT);}var h1=d.select('h1.request-book-name').first();var title='';if(h1){var c=h1.clone(),bs=c.select('span.badge');for(var y=0;y<bs.size();y++)bs.get(y).remove();title=String(c.text()).replace(/^[\\s📖]+/,'').trim();}var bd=d.select('h1.request-book-name span.badge').first();var us=d.select('div.detail-user-name a').first();var mt=d.select('div.detail-user-meta').first();var rs=d.select('div.reply-item');var urls=[],seen={};for(var a=0;a<rs.size();a++){var ls=rs.get(a).select('a[href]');for(var b=0;b<ls.size();b++){var hu=String(ls.get(b).attr('href'));if(hu.indexOf('http')!==0||hu.indexOf('zhaoshu.la')>=0||seen[hu]){continue;}seen[hu]=1;var au=rs.get(a).select('div.reply-user-name-row a').first();urls.push({u:hu,f:au?String(au.text()).trim():'书友',ac:rs.get(a).hasClass('accepted')?1:0});}}urls.sort(function(x,y){return y.ac-x.ac;});var H='<useweb><html><head><meta charset=\"utf-8\">';H+='<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">';H+='<style>body{margin:0;padding:10px 12px 14px;background:#f5f6f8;color:#1c1c1e;font-family:sans-serif;font-size:14.5px;line-height:1.6}';H+='.hd{font-size:17px;font-weight:700;margin:0 0 4px}.mt{color:#6b7280;font-size:12.5px;margin:0 0 10px}';H+='.cd{background:#fff;border-radius:9px;padding:9px 11px;margin:0 0 9px}.cd b{color:#ff9900;font-size:12.5px;display:block;margin-bottom:3px}';H+='.tip{background:#fff7e6;border:1px solid #ffd591;border-radius:9px;padding:8px 11px;margin:0 0 9px;color:#874d00;font-size:13px}';H+='a.bt{display:block;background:#ff9900;color:#fff;border-radius:9px;padding:10px 12px;margin:0 0 8px;text-decoration:none;font-size:15px;font-weight:700}';H+='a.bt:active{background:#e67e00}a.bt .ok{float:right;font-weight:400;font-size:12.5px}';H+='.uu{font-size:11.5px;color:#6b7280;word-break:break-all;margin:0 0 9px;padding:0 2px}.rp{border-left:3px solid #ff9900;padding-left:8px;margin:0 0 9px}';H+='.rh{font-size:12.5px;color:#374151}.no{background:#eef0f3;border-radius:9px;padding:12px;text-align:center;color:#6b7280}';H+='</style></head><body>';H+='<div class=\"hd\">'+esc(title)+'</div>';H+='<div class=\"mt\">'+esc(bd?String(bd.text()).trim():'')+' · 求书人 '+esc(us?String(us.text()).trim():'匿名')+' · '+esc(mt?String(mt.text()).trim():'')+' · 共 '+rs.size()+' 条回复</div>';H+='<div class=\"cd\"><b>求书描述</b>'+(T(d.select('div.detail-description').first())||'（发布者未填写）')+'</div>';if(urls.length){H+='<div class=\"tip\">👇 点下面的按钮，阅读会直接打开这本书的详情页（需已装能匹配该书源网址的书源）</div>';for(var k=0;k<urls.length;k++){var it=urls[k];H+='<a class=\"bt\" href=\"'+esc(deep(it.u))+'\">📖 打开这本书 · '+esc(host(it.u))+(it.ac?'<span class=\"ok\">✅已采纳</span>':'')+'</a>';H+='<div class=\"uu\">'+(k+1)+'. '+esc(it.u)+'　（来自 '+esc(it.f)+'，长按可复制）</div>';} }else{H+='<div class=\"no\">这条求书帖的回复里还没有书源网址</div>';}H+='<div class=\"cd\"><b>全部回复 '+rs.size()+' 条</b>';for(var q=0;q<rs.size();q++){var r=rs.get(q);var ru=r.select('div.reply-user-name-row a').first();H+='<div class=\"rp\"><div class=\"rh\">💬 回复'+(q+1)+' · '+esc(ru?String(ru.text()).trim():'书友')+(r.hasClass('accepted')?' · ✅已采纳':'')+'</div>'+(T(r.select('div.reply-text').first())||'（空）')+'</div>';}H+='</div>';if(v)H+='<div class=\"mt\">已指定书源：'+esc(v)+'</div>';H+='</body></html></useweb>';return H;})()", "kind": "@js:(function(){var d=(result&&typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var a=[],b=d.select('h1.request-book-name span.badge').first(),c=d.select('div.reply-section h2 span.count').first(),m=d.select('div.detail-user-meta').first();if(b)a.push(b.text().trim());if(c)a.push('回复'+String(c.text()).replace(/[()（）]/g,'')+'条');if(m)a.push(m.text().trim());return a.join(' · ');})()", "name": "@js:(function(){var d=(result&&typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var e=d.select('h1.request-book-name').first();if(!e)return '';return (function(){var c=e.clone(),bs=c.select('span.badge');for(var z=0;z<bs.size();z++)bs.get(z).remove();return String(c.text());})().replace(/^[\\s📖]+/,'').trim();})()"}, "ruleContent": {"content": "@js:(function(){var Jsoup=Packages.org.jsoup.Jsoup;var d=(result&&typeof result.select==='function')?result:Jsoup.parse(String(result));var NL=String.fromCharCode(10),SEP='──────────────────────',SOH=String.fromCharCode(1);function T(el){if(!el)return '';var s=String(el.html()).replace(/<br\\s*\\/?>/gi,SOH);return (function(){var ps=String(Jsoup.parseBodyFragment(s).text()).split(SOH);for(var q0=0;q0<ps.length;q0++)ps[q0]=ps[q0].trim();return ps.join(NL);})().trim();}function LK(el){var a=[],ls=el.select('a[href]');for(var i=0;i<ls.size();i++){var h=ls.get(i).attr('href');if(h.indexOf('http')===0)a.push(h);}return a;}var rid=String(baseUrl||'').replace(/^[\\s\\S]*#reply-/,'');var h1=d.select('h1.request-book-name').first();var title=h1?(function(){var c=h1.clone(),bs=c.select('span.badge');for(var z=0;z<bs.size();z++)bs.get(z).remove();return String(c.text());})().replace(/^[\\s📖]+/,'').trim():'';var bd=d.select('h1.request-book-name span.badge').first();var us=d.select('div.detail-user-name a').first();var mt=d.select('div.detail-user-meta').first();if(rid.indexOf('open-')===0){var zraw='';try{zraw=decodeURIComponent(rid.substring(5));}catch(e9){zraw=rid.substring(5);}var zvv='';try{zvv=String(source.getVariable()||'').trim();}catch(e10){zvv='';}var zoo=zvv?',{\"origin\":\"'+zvv+'\"}':'';var zok='';try{java.openUrl('legado://import/addToBookshelf?src='+encodeURIComponent(zraw+zoo));zok='✅ 已调起阅读，正在打开该书详情页';}catch(e11){zok='⚠️ 调起失败：'+e11.message;}var zbb='🔗 一键开书'+NL+NL+zraw+NL+NL+zok+NL;if(zvv)zbb=zbb+NL+'（已指定书源：'+zvv+'）'+NL;zbb=zbb+NL+'也可直接在书籍详情页的简介里点「📖 打开这本书」按钮。';return zbb;}var rs=d.select('div.reply-item');var head='📖《'+title+'》'+NL+'🔖 '+(bd?bd.text().trim():'')+'　👤 求书人：'+(us?us.text().trim():'匿名')+'　🕐 '+(mt?mt.text().trim():'')+NL+'💬 共 '+rs.size()+' 条回复';var TIP=NL+SEP+NL+'💡 返回书籍详情页，简介里就有可点击的「📖 打开这本书」按钮；'+NL+'   目录里的「🔗 一键开书」章节同样可直接调起阅读打开该书。';if(rid==='intro'||rid===''){var out=head+NL+SEP+NL+'【求书描述】'+NL+(T(d.select('div.detail-description').first())||'（发布者未填写描述）')+NL+SEP+NL+'【全部回复】'+NL;var urls=[];for(var i=0;i<rs.size();i++){var r=rs.get(i);var u=r.select('div.reply-user-name-row a').first();var acc=r.hasClass('accepted')?'✅已采纳':'未采纳';out+=NL+'💬 回复'+(i+1)+'｜'+(u?u.text().trim():'书友')+'（'+acc+'）'+NL+(T(r.select('div.reply-text').first())||'（空）')+NL;var ls=LK(r);for(var j=0;j<ls.length;j++){out+='　🔗 '+ls[j]+NL;urls.push(ls[j]);}}if(urls.length){out+=NL+SEP+NL+'【🔗 书友找到的书源地址 共'+urls.length+'条】'+NL;for(var k=0;k<urls.length;k++)out+=(k+1)+'. '+urls[k]+NL;}else out+=NL+'（回复中暂未发现外部书源网址）';return out+TIP;}var target=null,idx=0;for(var n=0;n<rs.size();n++){var bb=rs.get(n).select('button[data-type=reply]').first();var idd=bb?bb.attr('data-id'):('n'+(n+1));if(String(idd)===rid){target=rs.get(n);idx=n+1;break;}}if(!target&&rs.size()>0){var pi=parseInt(rid,10);if(pi>0&&pi<=rs.size()){target=rs.get(pi-1);idx=pi;}else{target=rs.get(0);idx=1;}}if(!target)return head+NL+SEP+NL+'（该求书帖暂无回复内容）'+TIP;var u2=target.select('div.reply-user-name-row a').first();var ttl=target.select('div.reply-user-name-row span.user-title').first();var adm=target.select('span.admin-badge').first();var ft=target.select('div.reply-footer span').first();var lk=target.select('span.like-count').first();var out=head+NL+SEP+NL;out+='💬 回复 '+idx+'｜'+(u2?u2.text().trim():'书友');if(ttl)out+='（'+ttl.text().trim()+(adm?'·'+adm.text().trim():'')+'）';out+=NL;var info=[];if(ft)info.push('🕐 '+ft.text().trim());if(lk)info.push('❤️ '+lk.text().trim()+' 赞');if(target.hasClass('accepted'))info.push('✅ 已被采纳');if(info.length)out+=info.join('　')+NL;out+=SEP+NL+(T(target.select('div.reply-text').first())||'（空）')+NL;var ls2=LK(target);if(ls2.length){out+=NL+SEP+NL+'【🔗 本条回复中的书源地址】'+NL;for(var q=0;q<ls2.length;q++)out+=(q+1)+'. '+ls2[q]+NL;}return out+TIP;})()"}, "ruleExplore": {"author": "@js:(function(){var e=result.select('div.request-user-name a').first();if(e){var t=String(e.text()).trim();if(t)return t;}return '我';})()", "bookList": "class.request-item", "bookUrl": "@js:(function(){var e=result.select('h2.request-book-name a').first();return e?e.attr('href'):'';})()", "intro": "@js:(function(){var p=result.select('p.request-description').first(),b=result.select('span.badge').first();var t=p?p.text().trim():'',s=b?b.text().trim():'',tip='';if(s.indexOf('已解决')>=0)tip='  ➜ 点击书名进详情页，简介里有可直接点击的开书按钮';else if(s.indexOf('未解决')>=0)tip='  ➜ 点击书名进详情页查看求书线索';return (t||'（发布者未填写补充描述）')+tip;})()", "kind": "@js:(function(){var a=[],b=result.select('span.badge').first(),m=result.select('div.request-meta').first(),t='';if(b)a.push(String(b.text()).trim());if(m)t=String(m.text()).trim();if(!t){var all=result.select('div.request-actions .action-btn');for(var i=all.size()-1;i>=0;i--){var x=String(all.get(i).text()).replace(/\\s+/g,' ').trim();if(/(刚刚|秒|分钟|小时|天前|天前|周|月|年|\\d{1,2}月\\d{1,2}日)/.test(x)){t=x;break;}}}if(t)a.push(t);return a.join(' · ');})()", "lastChapter": "@js:(function(){var a=result.select('div.request-actions a.action-btn').first();return a?a.text().trim():'';})()", "name": "@js:(function(){var e=result.select('h2.request-book-name a').first();return e?e.text().trim():'';})()"}, "ruleSearch": {"author": "@js:(function(){var e=result.select('div.request-user-name a').first();if(e){var t=String(e.text()).trim();if(t)return t;}return '我';})()", "bookList": "class.request-item", "bookUrl": "@js:(function(){var e=result.select('h2.request-book-name a').first();return e?e.attr('href'):'';})()", "checkKeyWord": "我的", "intro": "@js:(function(){var p=result.select('p.request-description').first(),b=result.select('span.badge').first();var t=p?p.text().trim():'',s=b?b.text().trim():'',tip='';if(s.indexOf('已解决')>=0)tip='  ➜ 点击书名进详情页，简介里有可直接点击的开书按钮';else if(s.indexOf('未解决')>=0)tip='  ➜ 点击书名进详情页查看求书线索';return (t||'（发布者未填写补充描述）')+tip;})()", "kind": "@js:(function(){var a=[],b=result.select('span.badge').first(),m=result.select('div.request-meta').first(),t='';if(b)a.push(String(b.text()).trim());if(m)t=String(m.text()).trim();if(!t){var all=result.select('div.request-actions .action-btn');for(var i=all.size()-1;i>=0;i--){var x=String(all.get(i).text()).replace(/\\s+/g,' ').trim();if(/(刚刚|秒|分钟|小时|天前|天前|周|月|年|\\d{1,2}月\\d{1,2}日)/.test(x)){t=x;break;}}}if(t)a.push(t);return a.join(' · ');})()", "lastChapter": "@js:(function(){var a=result.select('div.request-actions a.action-btn').first();return a?a.text().trim():'';})()", "name": "@js:(function(){var e=result.select('h2.request-book-name a').first();return e?e.text().trim():'';})()"}, "ruleToc": {"chapterList": "@js:(function(){var Jsoup=Packages.org.jsoup.Jsoup;var d=(result&&typeof result.select==='function')?result:Jsoup.parse(String(result));var out=new Packages.org.jsoup.select.Elements();var h1=d.select('h1.request-book-name').first();var title=h1?(function(){var c=h1.clone(),bs=c.select('span.badge');for(var z=0;z<bs.size();z++)bs.get(z).remove();return String(c.text());})().replace(/^[\\s📖]+/,'').trim():'求书原帖';var box=Jsoup.parseBodyFragment('<div class=\"zs-intro\" data-rid=\"intro\" data-no=\"0\"></div>').body().child(0);box.text('📋 求书原帖｜'+title);out.add(box);var rs=d.select('div.reply-item');for(var i=0;i<rs.size();i++){var r=rs.get(i);var b=r.select('button[data-type=reply]').first();r.attr('data-rid',b?b.attr('data-id'):('n'+(i+1)));r.attr('data-no',String(i+1));out.add(r);var gl=r.select('a[href]');var got={};for(var j=0;j<gl.size();j++){var hu=String(gl.get(j).attr('href'));if(hu.indexOf('http')!==0||hu.indexOf('zhaoshu.la')>=0||got[hu]){continue;}got[hu]=1;var op=Jsoup.parseBodyFragment('<div class=\"zs-open\"></div>').body().child(0);op.attr('data-rid','open-'+encodeURIComponent(hu));op.attr('data-no',String(i+1));var zh=hu.substring(hu.indexOf('//')+2).split('/')[0].replace(/^www\\./,'');op.text('🔗 一键开书 · 回复'+(i+1)+' · '+zh);out.add(op);}}return out;})()", "chapterName": "@js:(function(){var e=result;if(e.hasClass('zs-intro')||e.hasClass('zs-open'))return e.text();var no=e.attr('data-no');var u=e.select('div.reply-user-name-row a').first();var nm=u?u.text().trim():'书友';var t=e.select('div.reply-text').first();var raw=String(t?t.text():'');var lk=raw.indexOf('http')>=0?' 🔗':'';var tx=raw.replace(/https?:\\/\\/\\S+/g,'').replace(/\\s+/g,' ').trim();var ac=e.hasClass('accepted')?' ✅':'';var br=tx.length>22?tx.substring(0,22)+'…':tx;return '💬 回复'+no+'｜'+nm+lk+ac+(br?'：'+br:'');})()", "chapterUrl": "@js:(function(){var b=baseUrl||'';if(b.indexOf('http')!==0){b=(book&&book.bookUrl)?book.bookUrl:'';}return b+'#reply-'+result.attr('data-rid');})()"}, "searchUrl": "https://www.zhaoshu.la/search/{{java.encodeURI(key)}}/all/{{page>1?'page/'+page:''}}", "variableComment": "填书源网址(bookSourceUrl，如 rrssk聚合)可强制指定书源；留空自动匹配。登录界面可①登录/④发布求书帖/🙋我的求书", "weight": 0},{"bookSourceComment": "", "bookSourceGroup": "自定义", "bookSourceName": "瀚海书阁", "bookSourceType": 0, "bookSourceUrl": "https://www.ingml.cc", "bookUrlPattern": "\\/novel\\/[0-9]+\\.html", "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": false, "lastUpdateTime": "1788730670909", "loginUi": "", "loginUrl": "", "respondTime": 180000, "ruleBookInfo": {"author": "class.hover:text-primary.0@text", "coverUrl": "class.w-32 h-44 object-cover rounded-md shadow-md@src\n<js>\n\"https://www.ingml.cc\"+result;\n</js>", "init": "", "intro": "class.text-gray-700 dark:text-gray-300 leading-relaxed@text", "kind": "class.hover:text-primary.1@text", "name": "h1@text", "wordCount": "tag.span.2@text"}, "ruleContent": {"content": "class.read-content j_readContent@html", "title": "class.j_chapterName@text"}, "ruleExplore": {"bookList": ""}, "ruleReview": [], "ruleSearch": {"author": "tag.p.0@text", "bookList": "@css:div.bg-light-secondary.rounded-lg.overflow-hidden.shadow-sm.flex", "bookUrl": "tag.div.bg-light-secondary@onclick\n<js>\nvar url=result;\nurl=url.replace(\"window.open('\",'');\nurl=url.replace(\"', '_blank')\",\"\")\nurl;\n</js>", "coverUrl": "tag.img@src", "intro": "tag.p.1@text", "kind": "tag.span.0@text", "name": "tag.h3@text", "wordCount": "tag.span.3@text"}, "ruleToc": {"chapterList": "id.chapter-list@a", "chapterName": "a@text", "chapterUrl": "a@href\n<js>\n\"https://www.ingml.cc\"+result;\n</js>", "nextTocUrl": "text.下一页@href"}, "searchUrl": "https://www.ingml.cc/search.html?keyword={{key}}&page={{page}}", "weight": 0},{"bookSourceComment": "", "bookSourceGroup": "自定义", "bookSourceName": "瀚海书阁", "bookSourceType": 0, "bookSourceUrl": "https://www.ingml.cc", "bookUrlPattern": "\\/novel\\/[0-9]+\\.html", "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": false, "lastUpdateTime": "1772491176767", "loginUi": "", "loginUrl": "", "respondTime": 180000, "ruleBookInfo": {"author": "class.hover:text-primary.0@text", "coverUrl": "class.w-32 h-44 object-cover rounded-md shadow-md@src\n<js>\n\"https://www.ingml.cc\"+result;\n</js>", "init": "", "intro": "class.text-gray-700 dark:text-gray-300 leading-relaxed@text", "kind": "class.hover:text-primary.1@text", "name": "h1@text", "wordCount": "tag.span.2@text"}, "ruleContent": {"content": "class.read-content j_readContent@html", "title": "class.j_chapterName@text"}, "ruleExplore": {"bookList": ""}, "ruleReview": [], "ruleSearch": {"author": "tag.p.0@text", "bookList": "@css:div.bg-light-secondary.rounded-lg.overflow-hidden.shadow-sm.flex", "bookUrl": "tag.div.bg-light-secondary@onclick\n<js>\nvar url=result;\nurl=url.replace(\"window.open('\",'');\nurl=url.replace(\"', '_blank')\",\"\")\nurl;\n</js>", "coverUrl": "tag.img@src", "intro": "tag.p.1@text", "kind": "tag.span.0@text", "name": "tag.h3@text", "wordCount": "tag.span.3@text"}, "ruleToc": {"chapterList": "id.chapter-list@a", "chapterName": "a@text", "chapterUrl": "a@href\n<js>\n\"https://www.ingml.cc\"+result;\n</js>", "nextTocUrl": "text.下一页@href"}, "searchUrl": "https://www.ingml.cc/search.html?keyword={{key}}&page={{page}}", "weight": 0},{"bookSourceComment": "松鹤庭沐·言璃版 v2.1\n\n修复：搜索翻页重复、分类乱码、书名括号、宣传帖过滤\n新增：女生小说分类8个、男生小说榜单分区(总榜/完本/连载×12)\n优化：详情页信息丰富化、封面HTTPS、付费章兜底、限流防风控\n\n-修复部分ai代码格式问题", "bookSourceName": "松鹤庭沐·言璃版", "bookSourceType": 0, "bookSourceUrl": "https://so.html5.qq.com#v2修复版", "concurrentRate": "3/1", "customButton": false, "customOrder": 3, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nvar U = function(g, s, f) {\n    return \"https://bookshelf.html5.qq.com/qbread/api/rank/list?ch=001995&groupid=\" + g + \"&start={{page}}&count=20&sort=\" + s + \"&sub=&tag=&words=&finish=\" + f + \",{'headers':{'Referer':'https://bookshelf.html5.qq.com/qbread/categorylist?traceid=0809004&sceneid=FeedsTab&strageid=&ch=001995&tabfrom=top&feeds_version=8516&reader_version=0&groupid=\" + g + \"&tag_type_id=1'}}\";\n};\n\nvar A = function(t, g, s, f) {\n    return '{\"title\":\"' + t + '\",\"url\":\"' + U(g, s, f) + '\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}}';\n};\n\nvar H = function(t) {\n    return '{\"title\":\"' + t + '\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}}';\n};\n\nvar E = '{\"title\":\"\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}}';\n\nvar F = function(s) {\n    s.split(\",\").forEach(function(x) {\n        var p = x.split(\":\");\n        a.push(A(p[0], p[1], 0, \"\"));\n    })\n};\n\nvar a = [H(\"男生分类\")];\nF(\"都市:1505,玄幻:1501,仙侠:1504,奇幻:1502,历史:1506,军事:1507,科幻空间:1509,悬疑侦探:1508,游戏竞技:1510,武侠:1503,体育:1511,轻小说:1512,短篇:1515,现实:1499\");\na.push(E);\na.push(H(\"风格\"));\nF(\"轻松:20284,热血:20286,快节奏:20281,脑洞大:20280,搞笑:22176,谋略:20285,智斗:20279,正能量:20282,无金手指:20283,思想迪化:20561,人生巅峰:22147,群像:20278,爽文:20882,神功秘籍:22132,机缘奇遇:22144,鬼怪神魔:22247,兄弟情义:22309,孙悟空:22356,红颜知己:22187,变异生物:22258,高科技:22249,剑道:22286\");\na.push(E);\na.push(E);\na.push(H(\"流派\"));\nF(\"穿越:20003,系统流:20006,无敌流:20011,重生:20002,日常文:20007,赚钱:20136,强者归来:20021,经营:20000,草根崛起:20020,无限流:20008,诸天流:20023,扮猪吃虎:20019,开局流:20515,文娱:20050,斗罗大陆:20199,争霸:20028,游戏异界:20162,兵王:20030,练功流:20166,护花高手:20134,洪荒:20057,末世:20055,升级流:20094,废柴流:20015,天才流:20014,医生流:20033,综漫:20200,凡人流:20503,架空历史:20148,异能:20046,进化:20082,召唤流:20012,三国:20026,养成:20004,种田:20090,单女主:20060\");\na.push(E);\na.push(H(\"女生分类\"));\nF(\"幻情:1516,仙侠:1517,悬疑:1518,科幻:1519,游戏:1520,青春:1522,古言:1523,现言:1524\");\na.push(E);\na.push(H(\"榜单\"));\na.push(A(\"都市总榜\", \"1505\", \"3\", \"\"));\na.push(A(\"玄幻总榜\", \"1501\", \"3\", \"\"));\na.push(A(\"仙侠总榜\", \"1504\", \"3\", \"\"));\na.push(A(\"奇幻总榜\", \"1502\", \"3\", \"\"));\na.push(A(\"历史总榜\", \"1506\", \"3\", \"\"));\na.push(A(\"军事总榜\", \"1507\", \"3\", \"\"));\na.push(A(\"科幻总榜\", \"1509\", \"3\", \"\"));\na.push(A(\"悬疑总榜\", \"1508\", \"3\", \"\"));\na.push(A(\"游戏总榜\", \"1510\", \"3\", \"\"));\na.push(A(\"武侠总榜\", \"1503\", \"3\", \"\"));\na.push(A(\"现言总榜\", \"1524\", \"3\", \"\"));\na.push(A(\"古言总榜\", \"1523\", \"3\", \"\"));\n\na.push(A(\"都市完本\", \"1505\", \"0\", \"1\"));\na.push(A(\"玄幻完本\", \"1501\", \"0\", \"1\"));\na.push(A(\"仙侠完本\", \"1504\", \"0\", \"1\"));\na.push(A(\"奇幻完本\", \"1502\", \"0\", \"1\"));\na.push(A(\"历史完本\", \"1506\", \"0\", \"1\"));\na.push(A(\"军事完本\", \"1507\", \"0\", \"1\"));\na.push(A(\"科幻完本\", \"1509\", \"0\", \"1\"));\na.push(A(\"悬疑完本\", \"1508\", \"0\", \"1\"));\na.push(A(\"游戏完本\", \"1510\", \"0\", \"1\"));\na.push(A(\"武侠完本\", \"1503\", \"0\", \"1\"));\na.push(A(\"现言完本\", \"1524\", \"0\", \"1\"));\na.push(A(\"古言完本\", \"1523\", \"0\", \"1\"));\n\na.push(A(\"都市连载\", \"1505\", \"0\", \"0\"));\na.push(A(\"玄幻连载\", \"1501\", \"0\", \"0\"));\na.push(A(\"仙侠连载\", \"1504\", \"0\", \"0\"));\na.push(A(\"奇幻连载\", \"1502\", \"0\", \"0\"));\na.push(A(\"历史连载\", \"1506\", \"0\", \"0\"));\na.push(A(\"军事连载\", \"1507\", \"0\", \"0\"));\na.push(A(\"科幻连载\", \"1509\", \"0\", \"0\"));\na.push(A(\"悬疑连载\", \"1508\", \"0\", \"0\"));\na.push(A(\"游戏连载\", \"1510\", \"0\", \"0\"));\na.push(A(\"武侠连载\", \"1503\", \"0\", \"0\"));\na.push(A(\"现言连载\", \"1524\", \"0\", \"0\"));\na.push(A(\"古言连载\", \"1523\", \"0\", \"0\"));\n\na.push(E);\n\"[\" + a.join(\",\") + \"]\";", "header": "{\n\t\"user-agent\":\"Mozilla/5.0 (Linux; Android 10; MI 8 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36\",\n\t\"Referer\":\"https://bookshelf.html5.qq.com/qbread\"\n\t}", "lastUpdateTime": "1788709980865", "respondTime": 180000, "ruleBookInfo": {"author": "$.author", "coverUrl": "$.picurl", "init": "$.data.bookInfo", "intro": "<p>{{(t=String(java.getString('$.tag'))).length?'🏷️   标签：'+t.replace(/\\|/g,', '):''}}</p>{{'\\n'}}<br>\n<p>🔖   简介：{{$.summary}}</p>", "kind": "{{$.userscore}}分 · {{$.subject}} · {{$.serialnum}}章 · {{(Number(java.getString('$.contentsize'))/10000).toFixed(1)}}万字 · {{java.getString('$.isfinish')=='true'?'已完结':'连载中'}}\n{{String(java.getString('$.tag')).replace(/\\|/g,'、')}}\n{{String(java.timeFormat(java.getString('$.lastUpdatetime')*1000)).replace(/\\//g,'-').replace(/\\s.*/,'')}}", "lastChapter": "$.lastSerialname##正文卷.|正文.|VIP卷.|默认卷.|卷_|VIP章节.|免费章节.|章节目录.|最新章节.|[\\(（【].*?[求更票谢乐发订合补加架字修Kk].*?[】）\\)]|.*新书.*|.*上线.*", "name": "$.resourceName##（.*", "tocUrl": "https://bookshelf.html5.qq.com/qbread/api/book/all-chapter?bookId={{$.resourceID}}", "wordCount": "$.contentsize"}, "ruleContent": {"content": "{{$.data.Content[0].Content||'本章暂无法读取（可能为付费章节）'}}"}, "ruleExplore": {"author": "$.author", "bookList": "$.rows[*]", "bookUrl": "https://bookshelf.html5.qq.com/qbread/api/novel/intro-info?bookid={{$.resourceID}}", "coverUrl": "$.picurl", "intro": "$.summary", "kind": "{{$.userscore}}分 · {{$.subject}} · {{$.serialnum}}章 · {{(Number(java.getString('$.contentsize'))/10000).toFixed(1)}}万字 · {{java.getString('$.isfinish')=='true'?'已完结':'连载中'}}\n{{String(java.getString('$.tag')).replace(/\\|/g,'、')}}\n{{String(java.timeFormat(java.getString('$.lastUpdatetime')*1000)).replace(/\\//g,'-').replace(/\\s.*/,'')}}", "lastChapter": "$.lastSerialname##正文卷.|正文.|VIP卷.|默认卷.|卷_|VIP章节.|免费章节.|章节目录.|最新章节.|[\\(（【].*?[求更票谢乐发订合补加架字修Kk].*?[】）\\)]|.*新书.*|.*上线.*", "name": "$.resourceName##（.*", "wordCount": "$.contentsize"}, "ruleSearch": {"author": "$.author", "bookList": "$.booklist[*]", "bookUrl": "$.bid\n<js>1100000000+parseInt(result)</js>\nhttps://bookshelf.html5.qq.com/qbread/api/novel/intro-info?bookid={{result}}", "coverUrl": "$.bid\n@js:\nvar s = result;\nfunction gt(s){\n    var a = s.slice(-3);\n    if(a<10){\n        var n = s.slice(-1);\n    }else if(a<100){\n        var n = s.slice(-2);\n    }else{\n        var n = a;\n    }\n    return n;\n}\n\"https://wfqqreader-1252317822.image.myqcloud.com/cover/\"+gt(s)+\"/\"+s+\"/b_\"+s+\".jpg\"", "intro": "$.intro", "kind": "{{$.categoryInfoV4##\\d.*?\\:(.*?)\\:.*?(,|$)##$1$2###}}\n{{$.updateInfo##已更新至.*##连载中}}", "lastChapter": "$.updateInfo##已更新至##第", "name": "$.title", "wordCount": "$.totalWords"}, "ruleToc": {"chapterList": "$.rows", "chapterName": "$.serialName##正文卷.|正文.|VIP卷.|默认卷.|卷_|VIP章节.|免费章节.|章节目录.|最新章节.|[\\(（【].*?[求更票谢乐发订合补加架字修Kk].*?[】）\\)]", "chapterUrl": "https://novel.html5.qq.com/be-api/content/ads-read,{\n\t\"method\": \"POST\",\n\t\"body\": {\n\t\t\"Scene\": \"chapter\",\n\t\t\"ContentAnchorBatch\": [{\n\t\t\t\t\"BookID\": \"{{(baseUrl.match(/bookId=(\\d+)/)||['',''])[1]}}\",\n\t\t\t\t\"ChapterSeqNo\": [{{$.serialID}}]\n\t\t\t}]\n\t},\n\t\"headers\": {\n\t\t\"user-agent\": \"Mozilla/5.0 (Linux; Android 10; MI 8 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36\",\n\t\t\"Referer\": \"https://bookshelf.html5.qq.com/qbread\",\n\t\t\"Q-GUID\": \"4aa27c7cf2d9aca3359656ea186488cb\"\n\t}\n}"}, "searchUrl": "https://newopensearch.reader.qq.com/wechat?keyword={{key}}&amp;start={{(page-1)*20}}&amp;end={{page*20-1}}", "weight": 0},{"bookSourceComment": "金银小说网 www.fdxrz.com\n- 搜索: POST /search (keyword+page), 无CSRF强制/无频控/无需登录\n- 发现: 书库/全本/25分类, 表格结构, 排序路径 /{cat}/update/{page}/\n- 目录: 详情页 #list-chapterAll 全量内联(实测1432章完整)\n- 正文: #htmlContent, 章内分页URL带_xx.html后缀(linkNext跟踪), JS过滤多种站点广告\n- UA已设置, Cloudflare直连可过\n- 搜索/发现列表字段全部@js:直取(规避AnalyzeByJSoup状态污染); meta规则须用meta[...]形式(tag.meta[...]会被当标签名解析)", "bookSourceGroup": "网络小说", "bookSourceName": "金银小说网", "bookSourceType": 0, "bookSourceUrl": "https://www.fdxrz.com", "bookUrlPattern": "https?://www\\.fdxrz\\.com/jinyin/\\d+\\.html", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "🔖最近更新::https://www.fdxrz.com/shuku/update/{{page}}/\n🆕最新入库::https://www.fdxrz.com/shuku/post/{{page}}/\n🔥热门阅读::https://www.fdxrz.com/shuku/all/{{page}}/\n📈周点击榜::https://www.fdxrz.com/shuku/week/{{page}}/\n💜推荐票榜::https://www.fdxrz.com/shuku/vote/{{page}}/\n✅全本小说::https://www.fdxrz.com/quanben/{{page}}/\n📖玄幻::https://www.fdxrz.com/xuanhuan/update/{{page}}/\n📖奇幻::https://www.fdxrz.com/qihuan/update/{{page}}/\n📖武侠::https://www.fdxrz.com/wuxia/update/{{page}}/\n📖仙侠::https://www.fdxrz.com/xianxia/update/{{page}}/\n📖都市::https://www.fdxrz.com/dushi/update/{{page}}/\n📖历史::https://www.fdxrz.com/lishi/update/{{page}}/\n📖军事::https://www.fdxrz.com/junshi/update/{{page}}/\n📖游戏::https://www.fdxrz.com/youxi/update/{{page}}/\n📖经济::https://www.fdxrz.com/jingji/update/{{page}}/\n📖科幻::https://www.fdxrz.com/kehuan/update/{{page}}/\n📖灵异::https://www.fdxrz.com/lingyi/update/{{page}}/\n📖美文::https://www.fdxrz.com/meiwen/update/{{page}}/\n📖同人::https://www.fdxrz.com/tongren/update/{{page}}/\n📖剧本::https://www.fdxrz.com/juben/update/{{page}}/\n📖出版::https://www.fdxrz.com/chuban/update/{{page}}/\n📖言情::https://www.fdxrz.com/yanqing/update/{{page}}/\n📖科普::https://www.fdxrz.com/kepu/update/{{page}}/\n📖时尚::https://www.fdxrz.com/shishang/update/{{page}}/\n📖经管::https://www.fdxrz.com/jingguan/update/{{page}}/\n📖励志::https://www.fdxrz.com/lizhi/update/{{page}}/\n📖名著::https://www.fdxrz.com/mingzhu/update/{{page}}/\n📖青春::https://www.fdxrz.com/qingchun/update/{{page}}/\n📖教育::https://www.fdxrz.com/jiaoyu/update/{{page}}/\n📖推理::https://www.fdxrz.com/tuili/update/{{page}}/\n📖其他::https://www.fdxrz.com/qita/update/{{page}}/", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1788697590428", "respondTime": 3569, "ruleBookInfo": {"author": "meta[property=og:novel:author]@content", "coverUrl": "meta[property=og:image]@content", "intro": "meta[property=og:description]@content", "kind": "meta[property=og:novel:category]@content", "lastChapter": "meta[property=og:novel:latest_chapter_name]@content", "name": "meta[property=og:novel:book_name]@content", "wordCount": "@js:(function(){var m=String(result).match(/字数：([^<\\s]+)/);return m?m[1]:'';})()"}, "ruleContent": {"content": "@js:(function(){var html=(typeof result==='string')?result:String(result.html());var doc=Packages.org.jsoup.Jsoup.parse(html);var ps=doc.select('#htmlContent p');if(ps.size()==0){ps=doc.select('.panel-readcontent p');}var out=[];for(var i=0;i<ps.size();i++){var t=String(ps.get(i).text()).trim();if(!t)continue;if(t.indexOf('提醒您')>-1&&(t.indexOf('最新章节')>-1||t.indexOf('金银')>-1||t.indexOf('修复')>-1))continue;if(t.indexOf('域名')>-1&&(t.indexOf('记住')>-1||t.indexOf('牢记')>-1||t.indexOf('金银')>-1))continue;if(t.indexOf('金银小说')>-1&&(t.indexOf('首发')>-1||t.indexOf('无弹窗')>-1||t.indexOf('完整章节')>-1))continue;if(t.indexOf('如章节缺失')>-1||t.indexOf('#阅#读#模#式')>-1||t.indexOf('你看#到的')>-1)continue;if(t.indexOf('☧')>-1||t.indexOf('ˍ')>-1||t.indexOf('⊞')>-1)continue;if(t.indexOf('推荐他的其他作品')>-1||t.indexOf('记住域名')>-1||t.indexOf('全网首发无弹窗')>-1)continue;if(t.indexOf('网址：/book/')>-1)continue;if(t.indexOf('讨论本书')>-1)continue;if(t.indexOf('听说')===0&&(t.indexOf('本书')>-1||t.indexOf('恋人')>-1||t.indexOf('运气')>-1||t.indexOf('幸运')>-1))continue;if(t.indexOf('(请来')>-1&&t.indexOf('完整章节')>-1)continue;if(t.indexOf('（请来')>-1&&t.indexOf('完整章节')>-1)continue;out.push(t);}return out.join('\\n');})()", "nextContentUrl": "@js:(function(){var html=(typeof result==='string')?result:String(result.html());var m=html.match(/id=\\\"linkNext\\\"[^>]*href=\\\"([^\\\"]+)\\\"/);return (m&&/_[0-9A-Za-z]+\\.html/.test(m[1]))?m[1]:'';})()"}, "ruleExplore": {"author": "@js:(function(){try{return String(result.select('td').get(2).text()).trim();}catch(e){return '';}})()", "bookList": "class.mytable@tag.tbody@tag.tr[1:]", "bookUrl": "@js:(function(){try{return String(result.select('td').get(0).select('a').first().attr('href'));}catch(e){return '';}})()", "kind": "@js:(function(){try{return String(result.select('td').get(4).text()).trim();}catch(e){return '';}})()", "lastChapter": "@js:(function(){try{var a=result.select('td').get(1).select('a').first();return a?String(a.text()):'';}catch(e){return '';}})()", "name": "@js:(function(){try{return String(result.select('td').get(0).select('a').first().text());}catch(e){return '';}})()"}, "ruleSearch": {"author": "@js:(function(){try{return String(result.select('p.booktag a').first().text());}catch(e){return 'ERR2:'+e;}})()", "bookList": "class.col-md-10", "bookUrl": "@js:(function(){try{return String(result.select('h4.bookTitle a').first().attr('href'));}catch(e){return 'ERR5:'+e;}})()", "checkKeyWord": "都市", "coverUrl": "@js:(function(){try{var p=result.parent();var i=result.elementSiblingIndex();var img=p.children().get(i-1).select('img').first();if(!img)return '';var s=String(img.attr('src'));if(s.indexOf('http')==0)return s;var b=String(baseUrl);return b.substring(0,b.indexOf('/',b.indexOf('//')+3))+s;}catch(e){return 'ERR6:'+e;}})()", "intro": "@js:(function(){try{return String(result.select('p#bookIntro').first().text());}catch(e){return 'ERR3:'+e;}})()", "lastChapter": "@js:(function(){try{return String(result.select('a.text-danger').first().text());}catch(e){return 'ERR4:'+e;}})()", "name": "@js:(function(){try{return String(result.select('h4.bookTitle a').first().text());}catch(e){return 'ERR1:'+e;}})()"}, "ruleToc": {"chapterList": "id.list-chapterAll@tag.dd@tag.a||class.panel-chapterlist.1@tag.dd@tag.a", "chapterName": "@text", "chapterUrl": "@href"}, "searchUrl": "https://www.fdxrz.com/search,{\"method\":\"POST\",\"body\":\"keyword={{key}}&page={{page}}\",\"charset\":\"UTF-8\"}", "weight": 0},{"bookSourceGroup": "影视,小说,图片", "bookSourceName": "🍎 终极全栖接口聚合 ", "bookSourceType": 0, "bookSourceUrl": "苹果通用API接口聚合", "customButton": false, "customOrder": 2, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nvar apiMap = {\n    '影视-如意': 'https://cj.rycjapi.com/api.php/provide/vod/',\n    '影视-无水印': 'https://api.wsyzy.net/api.php/provide/vod/',\n    '影视-红牛': 'https://www.hongniuzy2.com/api.php/provide/vod/',\n    '影视-豪华': 'https://hhzyapi.com/api.php/provide/vod/',\n    '影视-速播': 'https://subocj.com/api.php/provide/vod/',\n    '影视-索尼': 'https://suoniapi.com/api.php/provide/vod/',\n    '影视-量子': 'https://cj.lziapi.com/api.php/provide/vod/',\n    '影视-暴风': 'https://bfzyapi.com/api.php/provide/vod/',\n    '影视-360': 'https://360zy.com/api.php/provide/vod/',\n    '影视-魔都': 'https://caiji.moduapi.cc/api.php/provide/vod/',\n    '影视-香蕉': '链接',\n    '影视-细胞': '链接',\n    '影视-番号': '链接',\n    '影视-极品': '链接',\n    '影视-奥斯卡': '链接',\n    '影视-搜V资源': '链接',\n    '影视-黑料': '链接',\n    '影视-杏吧': '链接',\n   '影视-红楼': '链接',\n   '影视-乐播': '链接',\n    '小说-jkun': '链接',\n    '小说-155': '链接',\n    '小说-杏吧': '链接',\n    '小说-红楼': '链接',\n    '小说-乐播':'链接'\n};\nvar apiGroups = {\n    '影视-常规': ['影视-如意', '影视-无水印', '影视-红牛', '影视-豪华', '影视-速播', '影视-索尼', '影视-量子', '影视-暴风', '影视-360', '影视-魔都'],\n    '影视-18禁': ['影视-香蕉', '影视-细胞', '影视-番号', '影视-极品', '影视-奥斯卡', '影视-搜V资源', '影视-黑料', '影视-杏吧', '影视-红楼','影视-乐播'],\n    '小说与图集': ['小说-jkun', '小说-155','小说-杏吧','小说-红楼','小说-乐播']\n};\nvar vars = {};\ntry { vars = JSON.parse(source.getVariable()); } catch (e) { vars = { group: '影视-常规', api: '影视-如意', url: apiMap['影视-如意'] }; }\nvar currentGroup = vars.group || '影视-常规';\nvar currentApi = vars.api || '影视-如意';\nif (apiGroups[currentGroup].indexOf(currentApi) === -1) { currentApi = apiGroups[currentGroup][0]; }\nvar base = apiMap[currentApi] || apiMap['影视-如意'];\nvar isArt = base.indexOf('/art/') !== -1;\n\nvar actionChange = \"var map=\" + JSON.stringify(apiMap) + \"; var g=infoMap['接口类型']||'影视-常规'; var a=infoMap['接口选择']||'影视-如意'; var u=map[a]; source.setVariable(JSON.stringify({group:g, api:a, url:u})); java.toast('切换成功，正在加载引擎...'); java.refreshExplore();\";\n\nvar ui = [];\nui.push({ title: '接口类型', type: 'select', chars: Object.keys(apiGroups), default: currentGroup, action: actionChange, style: { layout_flexBasisPercent: 1 } });\nui.push({ title: '接口选择', type: 'select', chars: apiGroups[currentGroup], default: currentApi, action: actionChange, style: { layout_flexBasisPercent: 1 } });\nui.push({ title: '全局关键字', type: 'text', default: '', style: { layout_flexBasisPercent: 1 } });\nui.push({ title: '🔍 当前接口搜', type: 'button', action: \"var k = infoMap['全局关键字']; if(!k){ java.toast('输入为空'); } else { java.searchBook(k, source); }\", style: { layout_flexBasisPercent: 1 } });\n\nvar rawCats = [];\nvar parentMap = {};\ntry {\n    var jsonStr = java.ajax(base + '?ac=list&at=json');\n    rawCats = JSON.parse(jsonStr).class || [];\n    for (var i = 0; i < rawCats.length; i++) { parentMap[rawCats[i].type_id] = rawCats[i].type_name; }\n} catch (e) {}\n\nvar ignoreIds = [1, 2, 3, 4];\nvar seen = {};\nfor (var i = 0; i < rawCats.length; i++) {\n    var c = rawCats[i];\n    if (!c.type_id || !c.type_name || ignoreIds.indexOf(parseInt(c.type_id, 10)) !== -1 || seen[c.type_id]) continue;\n    seen[c.type_id] = true;\n    var pName = parentMap[c.type_pid] || '';\n    var name = pName && pName !== c.type_name ? pName + '-' + c.type_name : c.type_name;\n    ui.push({ title: name, url: base + '?ac=' + (isArt ? 'list' : 'videolist') + '&t=' + c.type_id + '&pg={{page}}&at=json', style: { layout_flexGrow: 1, layout_flexBasisPercent: 0.31 } });\n}\nJSON.stringify(ui);", "lastUpdateTime": "1788611516873", "respondTime": 180000, "ruleBookInfo": {"author": "@js: var d = typeof result === 'string' ? JSON.parse(result) : result; var i = (d && d.list) ? d.list[0] : {}; i.vod_actor || i.art_actor || '未知';", "coverUrl": "@js: var d = typeof result === 'string' ? JSON.parse(result) : result; var i = (d && d.list) ? d.list[0] : {}; i.vod_pic || i.art_pic || '';", "intro": "@js: var d = typeof result === 'string' ? JSON.parse(result) : result; var i = (d && d.list) ? d.list[0] : {}; i.vod_blurb || i.art_blurb || i.vod_content || i.art_content || '';", "kind": "@js: var d = typeof result === 'string' ? JSON.parse(result) : result; var i = (d && d.list) ? d.list[0] : {}; (i.vod_class || i.art_class || '') + ',' + (i.vod_year || i.art_time || '');", "lastChapter": "@js: var d = typeof result === 'string' ? JSON.parse(result) : result; var i = (d && d.list) ? d.list[0] : {}; i.vod_remarks || i.art_time || '';", "name": "@js:\nvar d = typeof result === 'string' ? JSON.parse(result) : result;\nvar i = (d && d.list) ? d.list[0] : {};\nvar isArt = !!i.art_name;\nif (typeof book !== 'undefined' && book != null) { book.setType(isArt ? 0 : 4); }\ni.vod_name || i.art_name || '';", "wordCount": "@js: var d = typeof result === 'string' ? JSON.parse(result) : result; var i = (d && d.list) ? d.list[0] : {}; i.vod_score || i.art_score || '';"}, "ruleContent": {"content": "@js:\nvar api = String(baseUrl).split('?')[0];\nvar isArt = api.indexOf('/art/') !== -1;\nvar out = baseUrl;\n\nif (isArt) {\n  var d = typeof result === 'string' ? JSON.parse(result) : result;\n  var obj = (d && d.list) ? d.list[0] : {};\n  var html = obj.art_content || obj.art_pic || '';\n  var imgs = html.match(/https?:\\/\\/[^\\s\"'<>]+\\.(?:jpg|jpeg|png|gif|webp)/gi);\n  if (imgs && imgs.length > 0) {\n    out = imgs.map(function(u){return '<img src=\"' + u + '\">';}).join('\\n');\n  } else {\n    out = html.replace(/\\n/g, '<br>');\n  }\n}\nout;", "imageStyle": "FULL", "nextContentUrl": "@js:\nvar nextUrl = '';\ntry {\n  var d = JSON.parse(result);\n  var cp = parseInt(d.page || 1);\n  var pc = parseInt(d.pagecount || d.total || 1);\n  if (cp < pc) {\n    var u = String(baseUrl);\n    nextUrl = u.indexOf('&pg=') !== -1 ? u.replace(/&pg=\\d+/, '&pg=' + (cp + 1)) : u + '&pg=' + (cp + 1);\n  }\n} catch(e) {}\nnextUrl;", "replaceRegex": "##.*https://p22.k00ppc.com.*"}, "ruleExplore": {"author": "@js: result.vod_actor || result.art_actor || '未知'", "bookList": "$.list", "bookUrl": "@js:\nvar api = String(baseUrl).split('?')[0];\nvar isArt = api.indexOf('/art/') !== -1;\nif (typeof book !== 'undefined' && book != null) { book.setType(isArt ? 0 : 4); }\napi + '?ac=detail&ids=' + (isArt ? result.art_id : result.vod_id);", "coverUrl": "@js: result.vod_pic || result.art_pic || ''", "intro": "@js: result.vod_blurb || result.art_blurb || ''", "kind": "@js: (result.vod_class || result.art_class || '') + ',' + (result.vod_year || result.art_time || '')", "lastChapter": "@js: result.vod_remarks || result.art_time || ''", "name": "@js: result.vod_name || result.art_name || ''", "wordCount": "@js: result.vod_score || result.art_score || ''"}, "ruleSearch": {"author": "@js: result.vod_actor || result.art_actor || '未知'", "bookList": "$.list", "bookUrl": "@js:\nvar api = String(baseUrl).split('?')[0];\nvar isArt = api.indexOf('/art/') !== -1;\nif (typeof book !== 'undefined' && book != null) { book.setType(isArt ? 0 : 4); }\napi + '?ac=detail&ids=' + (isArt ? result.art_id : result.vod_id);", "coverUrl": "@js: result.vod_pic || result.art_pic || ''", "intro": "@js: result.vod_blurb || result.art_blurb || ''", "kind": "@js: (result.vod_class || result.art_class || '') + ',' + (result.vod_year || result.art_time || '')", "lastChapter": "@js: result.vod_remarks || result.art_time || ''", "name": "@js: result.vod_name || result.art_name || ''", "wordCount": "@js: result.vod_score || result.art_score || ''"}, "ruleToc": {"chapterList": "@js:\nvar api = String(baseUrl).split('?')[0];\nvar isArt = api.indexOf('/art/') !== -1;\n\nif (typeof book !== 'undefined' && book != null) { book.setType(isArt ? 0 : 4); }\n\nvar list = [];\nif (isArt) {\n  list.push({name: '正文浏览', url: baseUrl});\n} else {\n  try {\n    var d = typeof result === 'string' ? JSON.parse(result) : result;\n    var vod = (d && d.list) ? d.list[0] : {};\n    var playFrom = (vod.vod_play_from || '').split('$$$');\n    var playUrl = (vod.vod_play_url || '').split('$$$');\n    for (var i = 0; i < playUrl.length; i++) {\n      if (!playUrl[i]) continue;\n      var lineName = (playFrom[i] || '线路' + (i+1)).trim();\n      var episodes = playUrl[i].split('#');\n      for (var j = 0; j < episodes.length; j++) {\n        if (!episodes[j]) continue;\n        var parts = episodes[j].split('$');\n        // 核心修复点：无视垃圾站的数据缺失，强吃裸链\n        if (parts.length > 1) {\n          list.push({ name: lineName + ' - ' + parts[0], url: parts[1] });\n        } else {\n          var epName = episodes.length > 1 ? ('第' + (j+1) + '集') : '播放';\n          list.push({ name: lineName + ' - ' + epName, url: parts[0] });\n        }\n      }\n    }\n  } catch(e) {}\n}\nlist;", "chapterName": "name", "chapterUrl": "url"}, "searchUrl": "@js:\nvar vars = {};\ntry { vars = JSON.parse(source.getVariable()); } catch(e) {}\nvar api = vars.url || 'https://cj.rycjapi.com/api.php/provide/vod/';\nvar ac = api.indexOf('/art/') !== -1 ? 'list' : 'videolist';\napi + '?ac=' + ac + '&wd=' + encodeURIComponent(key) + '&pg=' + page + '&at=json';", "weight": 0},{"bookSourceComment": "63书阁(m.63sg.com) 书源\n规则版本: 2026-09-05\n【站点结构】\n  详情页 /novel/{id}/  目录页 /dir/{id}/?page=N&sort=asc(每页50章)\n  正文页 /read/{id}/{卷}/{章}.html  章内分页 /read/{id}/{卷}/{章}/{页}.html\n  搜索 POST /so.html (searchtype=novelname&searchkey=关键词)\n  分类 /type/{分类}_0_{状态}_{排序}_{页码}.html (页码用下划线连接)\n【书源URL正则】bookUrlPattern 同时匹配 m. 与 www. 两个子域\n【UA】header 字段已固定移动端 User-Agent(站点按 UA 下发移动模板)\n【⚠️重要限制：站点付费墙】\n  本站每本书仅前约65章免费，其后章节服务端返回占位文字\n  『请登录后在继续阅读本部小说！』。已实测：注册并登录后该限制依旧存在，\n  加书架也无效，属于站点付费墙而非登录问题。\n  本源的正文规则会把该占位文字替换为明确的付费章节提示。\n  完本小说/短篇(章节数少于免费额度)可完整阅读。\n【搜索频率】站点限制搜索间隔，请勿频繁搜索。\n【技术说明】\n  1) 列表(搜索/发现)字段用 @js: 直取 jsoup。原因：实测发现 Legado 的\n     AnalyzeByJSoup 在同一元素上连续解析多条 CSS 规则时存在 Elements 状态污染，\n     会使靠后的 bookUrl/kind 规则返回空并回退成列表页地址(表现为整页只出1本书)。\n     改用 @js: 走 JS 通道可完全规避，且带 a.cover 兜底。\n  2) 站点按固定字数硬切分页，会把 &nbsp; 实体切成两半(如 &nb / sp; 、&n / bsp;)，\n     且孤立 & 会被 jsoup 转义成 &amp;。content 规则内联\n     ##&(?:amp;)?n(?:b(?:s(?:p;?)?)?)?|nbsp;?|sp;|(?<=>)(?:p;|;|bsp;)|&amp;(?![a-zA-Z#])|&(?![a-zA-Z#])##\n     统一清除各类碎片与冗余缩进实体，同时保留 &amp;B / &#123; 等正常写法。\n  3) chapterList 用 @js: 过滤站点脏数据：个别书的目录里混有 /0.html 这类不存在的章节\n     (访问会 302 回详情页导致内容为空)；intro 用 @js: 对半去重，修复部分书 og:description\n     被站点自身写重复两遍的问题。\n  4) nextContentUrl 用 #next_url 定位，并用正则把三段式(下一章)清空，只保留四段式(章内下一页)。\n", "bookSourceGroup": "AI", "bookSourceName": "63书阁", "bookSourceType": 0, "bookSourceUrl": "https://m.63sg.com", "bookUrlPattern": "https?://(?:m|www)\\.63sg\\.com/novel/\\d+/?", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "📖 全部·最近更新::https://m.63sg.com/type/0_0_0_lastupdate_{{page}}.html\n🆕 最新入库::https://m.63sg.com/type/0_0_0_postdate_{{page}}.html\n🔥 人气总榜::https://m.63sg.com/type/0_0_0_votenum_{{page}}.html\n⭐ 收藏榜单::https://m.63sg.com/type/0_0_0_marknum_{{page}}.html\n📈 周点击榜::https://m.63sg.com/type/0_0_0_weekvisit_{{page}}.html\n🗂 玄幻小说::https://m.63sg.com/type/1_0_0_lastupdate_{{page}}.html\n🗂 仙侠小说::https://m.63sg.com/type/2_0_0_lastupdate_{{page}}.html\n🗂 都市小说::https://m.63sg.com/type/3_0_0_lastupdate_{{page}}.html\n🗂 职场小说::https://m.63sg.com/type/4_0_0_lastupdate_{{page}}.html\n🗂 历史小说::https://m.63sg.com/type/5_0_0_lastupdate_{{page}}.html\n🗂 军事小说::https://m.63sg.com/type/6_0_0_lastupdate_{{page}}.html\n🗂 科幻小说::https://m.63sg.com/type/7_0_0_lastupdate_{{page}}.html\n🗂 游戏小说::https://m.63sg.com/type/8_0_0_lastupdate_{{page}}.html\n🗂 灵异小说::https://m.63sg.com/type/9_0_0_lastupdate_{{page}}.html\n🗂 短篇小说::https://m.63sg.com/type/10_0_0_lastupdate_{{page}}.html\n🗂 现言小说::https://m.63sg.com/type/11_0_0_lastupdate_{{page}}.html\n🗂 古言小说::https://m.63sg.com/type/12_0_0_lastupdate_{{page}}.html\n🗂 幻侠小说::https://m.63sg.com/type/13_0_0_lastupdate_{{page}}.html\n🗂 穿越小说::https://m.63sg.com/type/14_0_0_lastupdate_{{page}}.html\n🗂 总裁小说::https://m.63sg.com/type/15_0_0_lastupdate_{{page}}.html\n🗂 浪漫小说::https://m.63sg.com/type/16_0_0_lastupdate_{{page}}.html\n🗂 耽美小说::https://m.63sg.com/type/17_0_0_lastupdate_{{page}}.html\n📚 全部·全本::https://m.63sg.com/type/0_0_2_lastupdate_{{page}}.html\n📚 玄幻·全本::https://m.63sg.com/type/1_0_2_lastupdate_{{page}}.html\n📚 仙侠·全本::https://m.63sg.com/type/2_0_2_lastupdate_{{page}}.html\n📚 都市·全本::https://m.63sg.com/type/3_0_2_lastupdate_{{page}}.html\n📚 职场·全本::https://m.63sg.com/type/4_0_2_lastupdate_{{page}}.html\n📚 历史·全本::https://m.63sg.com/type/5_0_2_lastupdate_{{page}}.html\n📚 军事·全本::https://m.63sg.com/type/6_0_2_lastupdate_{{page}}.html\n📚 科幻·全本::https://m.63sg.com/type/7_0_2_lastupdate_{{page}}.html\n📚 游戏·全本::https://m.63sg.com/type/8_0_2_lastupdate_{{page}}.html\n📚 灵异·全本::https://m.63sg.com/type/9_0_2_lastupdate_{{page}}.html", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1788610159929", "respondTime": 14923, "ruleBookInfo": {"author": "[property='og:novel:author']@content", "coverUrl": "[property='og:image']@content", "intro": "@js:(function(){try{var d=(result&&typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var n=d.select('meta[property=og:description]');if(n.isEmpty())return '';var s=String(n.first().attr('content'));var h=Math.floor(s.length/2);if(h>30&&s.substring(0,h)===s.substring(h)){s=s.substring(0,h);}return s;}catch(x){return '';}})()", "kind": "[property='og:novel:category']@content", "lastChapter": "[property='og:novel:latest_chapter_name']@content", "name": "[property='og:novel:book_name']@content", "tocUrl": ".bookchaptermore@href"}, "ruleContent": {"content": "#booktxt@html##&(?:amp;)?n(?:b(?:s(?:p;?)?)?)?|nbsp;?|sp;|(?<=>)(?:p;|;|bsp;)|&amp;(?![a-zA-Z#])|&(?![a-zA-Z#])##", "nextContentUrl": "#next_url@href##/read/\\d+/\\d+/\\d+\\.html$##", "replaceRegex": "##~{5,}请登录后在继续阅读本部小说！~{5,}##⚠️ 本章为付费章节：63书阁每本书仅前约65章免费试读，完本小说/短篇不受影响。"}, "ruleExplore": {"author": "@js:(function(){try{var e=result.select('dd').last().select('a').first();return e==null?'':String(e.text())}catch(x){return ''}})()", "bookList": ".content@dl", "bookUrl": "@js:(function(){try{var e=result.select('dt a').first();if(e==null){e=result.select('a.cover').first()}return e==null?'':String(e.attr('href'))}catch(x){return ''}})()", "coverUrl": "@js:(function(){try{var e=result.select('a.cover').first().select('img').first();return e==null?'':String(e.attr('src'))}catch(x){return ''}})()", "intro": "@js:(function(){try{var e=result.select('dd').first();return e==null?'':String(e.text())}catch(x){return ''}})()", "kind": "@js:(function(){try{var e=result.select('dd').last().select('span').first();return e==null?'':String(e.text())}catch(x){return ''}})()", "name": "@js:(function(){try{var e=result.select('dt a').first();return e==null?'':String(e.text())}catch(x){return ''}})()"}, "ruleSearch": {"author": "@js:(function(){try{var e=result.select('dd').last().select('a').first();return e==null?'':String(e.text())}catch(x){return ''}})()", "bookList": ".content@dl", "bookUrl": "@js:(function(){try{var e=result.select('dt a').first();if(e==null){e=result.select('a.cover').first()}return e==null?'':String(e.attr('href'))}catch(x){return ''}})()", "checkKeyWord": "大明", "coverUrl": "@js:(function(){try{var e=result.select('a.cover').first().select('img').first();return e==null?'':String(e.attr('src'))}catch(x){return ''}})()", "intro": "@js:(function(){try{var e=result.select('dd').first();return e==null?'':String(e.text())}catch(x){return ''}})()", "kind": "@js:(function(){try{var e=result.select('dd').last().select('span').first();return e==null?'':String(e.text())}catch(x){return ''}})()", "name": "@js:(function(){try{var e=result.select('dt a').first();return e==null?'':String(e.text())}catch(x){return ''}})()"}, "ruleToc": {"chapterList": "@js:(function(){var d=(result&&typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var all=d.select('ul.mt0 li a');var out=new Packages.java.util.ArrayList();for(var i=0;i<all.size();i++){var a=all.get(i);var seg=String(a.attr('href')).split('/').pop();var num=seg.replace('.html','');if(num.length>0&&num!=='0'){out.add(a);}}return out.size()>0?out:all;})()", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": "select#indexselect@option@value"}, "searchUrl": "https://m.63sg.com/so.html,{\"method\":\"POST\",\"body\":\"searchtype=novelname&searchkey={{key}}\"}", "weight": 0},{"bookSourceComment": "30s搜索间隔", "bookSourceGroup": "☣️精选senhora", "bookSourceName": "福书网🎃[分页]", "bookSourceType": 0, "bookSourceUrl": "http://m.fushutxt.cc#🎃", "bookUrlPattern": "http://m.fushutxt.cc/\\w+/\\d+.html", "customButton": false, "customOrder": -149, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "最近更新::lastdate/{{page==1?'':'index_'+page+'.html'}}\n现代都市::xiandaidushi/{{page==1?'':'index_'+page+'.html'}}\n古代架空::gudaijiakong/{{page==1?'':'index_'+page+'.html'}}\n穿越重生::chuanyuechongsheng/{{page==1?'':'index_'+page+'.html'}}\n玄幻灵异::xuanhuanlingyi/{{page==1?'':'index_'+page+'.html'}}\n推理悬疑::tuilixuanyi/{{page==1?'':'index_'+page+'.html'}}\n网游竞技::wangyoujingji/{{page==1?'':'index_'+page+'.html'}}\n B L 同人::BLtongren/{{page==1?'':'index_'+page+'.html'}}\n G L 百合::GLbaihe/{{page==1?'':'index_'+page+'.html'}}\n本站推荐::bztuijian/{{page==1?'':'index_'+page+'.html'}}\n周排行榜::bzremenweek/{{page==1?'':'index_'+page+'.html'}}\n月排行榜::bzremenmonth/{{page==1?'':'index_'+page+'.html'}}", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 9) Mobile Safari/537.36\"}", "lastUpdateTime": "1788530530526", "respondTime": 184180, "ruleBookInfo": {"author": "text.作者：.0@text##.*作者：", "coverUrl": "img@data-original", "intro": "#text p:gt(5):lt(13)@html", "name": "h1@text"}, "ruleContent": {"content": "#text>p@textNodes"}, "ruleExplore": {"author": "p.1@text||span.1@text\n@js: result##.*作者：", "bookList": ".book-li", "bookUrl": "a@href", "coverUrl": "img@src", "kind": "p.2@text||span.2@text\n@js:result##类型：|时间：", "name": "h4@text"}, "ruleSearch": {"author": "span.-1@text", "bookList": "h2", "bookUrl": "a@href", "checkKeyWord": "冒牌货", "name": "a@text"}, "ruleToc": {"chapterList": "@js:\nvar page=src.match(/<b>(\\d+)<.b>/)[1];\nvar url=baseUrl.replace(/.html/,\"_0.html\")\nvar list=[{text:\"第1页\",href:baseUrl}];\nif(page&&list){\n\tfor(i=1;i<page;i++){\n\t\tlist.push({text:`第${i+1}页`,href:url.replace(/_0/,\"_\"+i)})\n\t\t}\n\t\tlist;\n\t}else{\n\t\tjava.longToast(\"目录获取失败，检查网络或稍后再试！\")\n\t\t}", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "https://m.fushutxt.cc/e/search/index.php,{\"method\":\"POST\",\"body\":\"keyboard={{key}}&show=title&tempid=1&tbname=article\"}", "weight": 0},{"bookSourceComment": "20241025修复发现\n20240222By_zhbyjm77833\n免费：vip=0\n全部：vip=9", "bookSourceGroup": "自写1003", "bookSourceName": "纵横中文网api[搜书专用]", "bookSourceType": 0, "bookSourceUrl": "https://www.zongheng.com/##zhbyjm7783", "bookUrlPattern": "", "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "exploreUrl": "@js:\nsort = [];\npush = (title, url, type) => sort.push({\n    title: title,\n    url: url,\n    style: {\n        layout_flexBasisPercent: type\n    }\n});\n\npush(\"༺ˇ»`ʚ 排行榜 ɞ´«ˇ༻\", null, 1);\n [\n        [\"月票榜\", \"1\"],\n        [\"新书榜\", \"4\"],\n        [\"点击榜\", \"5\"],\n        [\"推荐榜\", \"6\"],\n        [\"捧场榜\",\"7\"],\n        [\"完结榜\",\"8\"],\n        [\"新书订阅\", \"9\"],\n        [\"24h畅销\",\"3\"],\n        [\"24h更新\",\"10\"],\n        [\"作者人气\",\"12\"]\n].map([title, Id] => {\n    title=title,\n    url= `https://www.zongheng.com/api/rank/details,{\"method\":\"POST\",\"body\":\"cateFineId=0&cateType=0&pageNum={{page}}&pageSize=20&period=0&rankNo=&rankType=${Id}\"}`,\n    push(title, url, 0.29)\n    });\n\npush(\"༺ˇ»`ʚ 男生 ɞ´«ˇ༻\", null, 1);\n [\n        [\"全部\", \"0\",\"\"],\n        [\"玄幻奇幻\", \"8101\",\"\"],\n        [\"王朝争霸\", \"8101\",\"8411\"],\n        [\"诸天万界\", \"8101\",\"8412\"],\n        [\"西方奇幻\", \"8101\",\"8413\"],\n        [\"异世大陆\", \"8101\",\"8414\"],\n        [\"东方玄幻\", \"8101\",\"8415\"],\n        [\"武侠仙侠\", \"8102\",\"\"],\n        [\"古典仙侠\", \"8102\",\"8351\"],\n        [\"上古洪荒\", \"8102\",\"8352\"],\n        [\"幻想修真\", \"8102\",\"8353\"],\n        [\"传统武侠\", \"8102\",\"8354\"],\n        [\"武侠幻想\", \"8102\",\"8355\"],\n        [\"都市\",\"8103\",\"\"],\n        [\"热血校园\",\"8103\",\"8471\"],\n        [\"商战职场\",\"8103\",\"8472\"],\n        [\"都市高手\",\"8103\",\"8473\"],\n        [\"乡村生活\",\"8103\",\"8474\"],\n        [\"明星娱乐\",\"8103\",\"8475\"],\n        [\"都市生活\",\"8103\",\"8476\"],\n        [\"都市高武\",\"8103\",\"8477\"],\n        [\"灵气复苏\",\"8103\",\"8478\"],\n        [\"官场\",\"8103\",\"8479\"],\n        [\"历史\",\"8104\",\"\"],\n        [\"架空历史\",\"8104\",\"8291\"],\n        [\"历史传记\",\"8104\",\"8292\"],\n        [\"穿越历史\",\"8104\",\"8293\"],\n        [\"科幻\",\"8105\",\"\"],\n        [\"未来幻想\",\"8105\",\"8441\"],\n        [\"末世危机\",\"8105\",\"8442\"],\n        [\"星际机甲\",\"8105\",\"8443\"],\n        [\"奇闻异事\",\"8106\",\"\"],\n        [\"侦探推理\",\"8106\",\"8321\"],\n        [\"寻宝探险\",\"8106\",\"8322\"],\n        [\"恐怖灵异\",\"8106\",\"8323\"],\n        [\"奇门秘术\",\"8106\",\"8324\"],\n        [\"游戏\", \"8107\",\"\"],\n        [\"虚拟网游\", \"8107\",\"8381\"],\n        [\"电子竞技\", \"8107\",\"8382\"],\n        [\"N次元\",\"8108\",\"\"],\n        [\"衍生同人\",\"8108\",\"8201\"],\n        [\"原生幻想\",\"8108\",\"8202\"],\n        [\"轻小说\",\"8108\",\"8203\"],\n        [\"现实题材\",\"8109\",\"\"],\n        [\"现实百态\",\"8109\",\"8501\"],\n        [\"体育\", \"8110\",\"\"],\n        [\"足球天下\", \"8110\",\"8231\"],\n        [\"篮球风云\", \"8110\",\"8232\"],\n        [\"其他竞技\", \"8110\",\"8233\"],\n        [\"军事\",\"8111\",\"\"],\n        [\"战争幻想\",\"8111\",\"8261\"],\n        [\"谍战特工\",\"8111\",\"8262\"],\n        [\"抗战烽火\",\"8111\",\"8263\"],\n        [\"现代军事\",\"8111\",\"8264\"]\n].map([title, Id, id] => {\n    title=title,\n    url= `https://www.zongheng.com/api2/catefine/storeSearch,{\"method\":\"POST\",\"body\":\"worksTypes=${Id}&bookType=0&subWorksTypes=${id}&totalWord=0&serialStatus=9&vip=9&categoryId=${id}&categoryPid=${Id}&naodongFilter=0&pageNum={{page}}&pageSize=20\"}`,\n    push(title, url, 0.29)\n    });\n    \npush(\"༺ˇ»`ʚ 女生 ɞ´«ˇ༻\", null, 1);\n [\n        [\"全部\", \"0\",\"\"],       \n        [\"现代言情\", \"8161\",\"\"],\n        [\"总裁豪门\", \"8161\",\"8531\"],\n        [\"都市奇幻\", \"8161\",\"8532\"],\n        [\"年代重生\", \"8161\",\"8533\"],\n        [\"现实生活\", \"8161\",\"8534\"],\n        [\"青春校园\", \"8161\",\"8535\"],\n        [\"娱乐明星\", \"8161\",\"8536\"],\n        [\"民国旧影\", \"8161\",\"8537\"],\n        [\"职场情缘\", \"8161\",\"8538\"],\n        [\"现代悬疑\", \"8161\",\"8539\"],\n        [\"古代言情\", \"8162\",\"\"],\n        [\"远古大陆\", \"8162\",\"8561\"],\n        [\"武侠江湖\", \"8162\",\"8562\"],\n        [\"权谋天下\", \"8162\",\"8563\"],\n        [\"古代情缘\", \"8162\",\"8564\"],\n        [\"宫闱宅斗\", \"8162\",\"8565\"],\n        [\"种田经商\", \"8162\",\"8566\"],\n        [\"古代悬疑\", \"8162\",\"8567\"],\n        [\"幻想言情\",\"8163\",\"\"],\n        [\"异世幻想\",\"8163\",\"8591\"],\n        [\"末世求生\",\"8163\",\"8592\"],\n        [\"无限快穿\",\"8163\",\"8593\"],\n        [\"未来科幻\",\"8163\",\"8594\"],\n        [\"玄幻仙侠\",\"8163\",\"8595\"],\n        [\"衍生言情\", \"8164\",\"\"],\n        [\"经典衍生\", \"8164\",\"8651\"],\n        [\"次元衍生\", \"8164\",\"8652\"],\n        [\"游戏竞技\", \"8165\",\"\"],\n        [\"运动竞技\", \"8165\",\"8621\"],\n        [\"网游电竞\", \"8165\",\"8622\"],\n        [\"现实主义\",\"8166\",\"\"],\n        [\"现实故事\",\"8166\",\"8711\"]\n].map([title, Id, id] => {\n    title=title,\n    url= `https://www.zongheng.com/api2/catefine/storeSearch,{\"method\":\"POST\",\"body\":\"worksTypes=${Id}&bookType=1&subWorksTypes=${id}&totalWord=0&serialStatus=9&vip=9&categoryId=${id}&categoryPid=${Id}&naodongFilter=0&pageNum={{page}}&pageSize=20\"}`,\n    push(title, url, 0.29)\n    });\n\nJSON.stringify(sort);", "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36\"}", "lastUpdateTime": "1788526229936", "loginUrl": "", "respondTime": 180000, "ruleBookInfo": {"author": "", "canReName": "", "coverUrl": "", "downloadUrls": "", "init": "", "intro": "", "kind": "", "lastChapter": "", "name": "", "tocUrl": "", "wordCount": ""}, "ruleContent": {"content": ".content@p@text"}, "ruleExplore": {"author": "pseudonym||authorName", "bookList": "result.resultList||result.bookList", "bookUrl": "https://bookapi.zongheng.com/api/chapter/getChapterList,{\"method\":\"POST\",\"body\":\"bookId={{$.bookId}}\"}", "coverUrl": "bookCover||picUrl", "intro": "description", "kind": "{{$.cateFineName||$.categoryName}}\n{{$.latestChapterTime||$.orderColumnInfo}}\n连载{{$.serialStatus}}完结@js:result.replace(/连载1完结/g,'完结').replace(/连载0完结/g,'连载')", "lastChapter": "{{$.latestChapterName||$.theNewChapter}}{{$.latestChapterTime||$.orderColumnInfo}}", "name": "bookName||name", "wordCount": "number||totalWords"}, "ruleSearch": {"author": "authorName", "bookList": "data.datas.list", "bookUrl": "https://bookapi.zongheng.com/api/chapter/getChapterList,{\"method\":\"POST\",\"body\":\"bookId={$.bookId}\"}", "checkKeyWord": "", "coverUrl": "https://static.zongheng.com/upload{{$.coverUrl}}", "intro": "description", "kind": "{{$.cateFineName&&$.tomeName&&$.catePName&&$.keyword&&$.updateTime}}\n连载{{$.serialStatus}}完结##\\<font color\\=\\\"RED\\\"\\>|\\<\\/font\\>\n@js:result.replace(/连载1完结/g,'完结').replace(/连载0完结/g,'连载')", "lastChapter": "chapterName&&updateTime", "name": "name##\\<font color\\=\\\"RED\\\"\\>|\\<\\/font\\>", "wordCount": "totalWord"}, "ruleToc": {"chapterList": "result.chapterList[*].chapterViewList[*]", "chapterName": "chapterName", "chapterUrl": "https://read.zongheng.com/chapter/{$.bookId}/{$.chapterId}.html", "formatJs": "", "isVip": "level", "preUpdateJs": "", "updateTime": "{{$.createTime}} 字数：{{$.wordNums}}"}, "searchUrl": "https://search.zongheng.com/search/book?keyword={{key}}&sort=null&pageNo=1&pageNum=20&isFromHuayu=0", "weight": 0},{"bookSourceComment": "by狼崽儿 //2026.9.4\n虽然网站书籍已经不更新了，优点是保留了许多老书籍。\n有搜索30秒限制，所以已经内置移除cookie破除限制。\n有些小说正文内容不全，即缺少一段后文，自行辨别。", "bookSourceName": "御宅屋🌟", "bookSourceType": 0, "bookSourceUrl": "https://yswhub.cc", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "[\n  { \"title\": \"耽美\", \"url\": \"https://yswhub.cc/sort/1_{{page}}.html\" },\n  { \"title\": \"高辣文\", \"url\": \"https://yswhub.cc/sort/6_{{page}}.html\" },\n  { \"title\": \"言情\", \"url\": \"https://yswhub.cc/sort/5_{{page}}.html\" },\n  { \"title\": \"百合\", \"url\": \"https://yswhub.cc/sort/2_{{page}}.html\" },\n  { \"title\": \"玄幻\", \"url\": \"https://yswhub.cc/sort/3_{{page}}.html\" },\n  { \"title\": \"修仙\", \"url\": \"https://yswhub.cc/sort/4_{{page}}.html\" },\n  { \"title\": \"种田\", \"url\": \"https://yswhub.cc/sort/8_{{page}}.html\" },\n  { \"title\": \"网游\", \"url\": \"https://yswhub.cc/sort/10_{{page}}.html\" },\n  { \"title\": \"其他\", \"url\": \"https://yswhub.cc/sort/11_{{page}}.html\" },\n  { \"title\": \"腹黑\", \"url\": \"https://yswhub.cc/sort/7_{{page}}.html\" },\n  { \"title\": \"高干\", \"url\": \"https://yswhub.cc/sort/9_{{page}}.html\" },\n  { \"title\": \"科幻\", \"url\": \"https://yswhub.cc/sort/13_{{page}}.html\" }\n]", "header": " {\n    \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"\n  }", "lastUpdateTime": "1788492654646", "loginUrl": "https://yswhub.cc", "respondTime": 180000, "ruleBookInfo": {"author": "a[href*='/author/']@text", "intro": "//h3[contains(text(),'简介')]/following-sibling::div[1]/pre@text##……", "kind": ".article_info_td div:contains(类别：)@text##类别：", "name": "ul.h_nav_items li:last-of-type@text", "tocUrl": "a.btn[href*='/indexlist/']@href"}, "ruleContent": {"content": "#nr1 p@textNodes", "nextContentUrl": "div.nr_page td.next a:contains(下一页)@href"}, "ruleExplore": {"author": "p strong@text", "bookList": "div.common-bookele", "bookUrl": "h3 a@href", "intro": "span.abstract a@text", "name": "h3 a@text"}, "ruleSearch": {"author": "a[href*='/author/']@text", "bookList": "section.SHsectionThree .SHsectionThree-middle p", "bookUrl": "a[href*='/read/']@href", "checkKeyWord": "", "intro": "span:first-child@text", "name": "a[href*='/read/']@text"}, "ruleToc": {"chapterList": "ul#jsList1 li.two a", "chapterName": "@text", "chapterUrl": "@href"}, "searchUrl": "{{url=source.getKey();\ncookie.removeCookie(url);}}/search/?searchkey={{key}}&searchtype=all", "weight": 0},{"bookSourceComment": "松鹤庭沐·言璃版 v2.0\n\n修复：搜索翻页重复、分类乱码、书名括号、宣传帖过滤\n新增：女生小说分类8个、男生小说榜单分区(总榜/完本/连载×12)\n优化：详情页信息丰富化、封面HTTPS、付费章兜底、限流防风控", "bookSourceName": "松鹤庭沐·言璃版", "bookSourceType": 0, "bookSourceUrl": "https://so.html5.qq.com#v2修复版", "concurrentRate": "3/1", "customButton": false, "customOrder": 2, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "&lt;js&gt;\nvar U=function(g,s,f){return \"https://bookshelf.html5.qq.com/qbread/api/rank/list?ch=001995&amp;groupid=\"+g+\"&amp;start={{page}}&amp;count=20&amp;sort=\"+s+\"&amp;sub=&amp;tag=&amp;words=&amp;finish=\"+f+\",{'headers':{'Referer':'https://bookshelf.html5.qq.com/qbread/categorylist?traceid=0809004&amp;sceneid=FeedsTab&amp;strageid=&amp;ch=001995&amp;tabfrom=top&amp;feeds_version=8516&amp;reader_version=0&amp;groupid=\"+g+\"&amp;tag_type_id=1'}}\"};\nvar A=function(t,g,s,f){return '{\"title\":\"'+t+'\",\"url\":\"'+U(g,s,f)+'\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}}'};\nvar H=function(t){return '{\"title\":\"'+t+'\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}}'};\nvar E='{\"title\":\"\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}}';\nvar F=function(s){s.split(\",\").forEach(function(x){var p=x.split(\":\");a.push(A(p[0],p[1],0,\"\"))})};\nvar a=[H(\"男生分类\")];\nF(\"都市:1505,玄幻:1501,仙侠:1504,奇幻:1502,历史:1506,军事:1507,科幻空间:1509,悬疑侦探:1508,游戏竞技:1510,武侠:1503,体育:1511,轻小说:1512,短篇:1515,现实:1499\");\na.push(E);\na.push(H(\"风格\"));\nF(\"轻松:20284,热血:20286,快节奏:20281,脑洞大:20280,搞笑:22176,谋略:20285,智斗:20279,正能量:20282,无金手指:20283,思想迪化:20561,人生巅峰:22147,群像:20278,爽文:20882,神功秘籍:22132,机缘奇遇:22144,鬼怪神魔:22247,兄弟情义:22309,孙悟空:22356,红颜知己:22187,变异生物:22258,高科技:22249,剑道:22286\");\na.push(E);a.push(E);\na.push(H(\"流派\"));\nF(\"穿越:20003,系统流:20006,无敌流:20011,重生:20002,日常文:20007,赚钱:20136,强者归来:20021,经营:20000,草根崛起:20020,无限流:20008,诸天流:20023,扮猪吃虎:20019,开局流:20515,文娱:20050,斗罗大陆:20199,争霸:20028,游戏异界:20162,兵王:20030,练功流:20166,护花高手:20134,洪荒:20057,末世:20055,升级流:20094,废柴流:20015,天才流:20014,医生流:20033,综漫:20200,凡人流:20503,架空历史:20148,异能:20046,进化:20082,召唤流:20012,三国:20026,养成:20004,种田:20090,单女主:20060\");\na.push(E);\na.push(H(\"女生分类\"));\nF(\"幻情:1516,仙侠:1517,悬疑:1518,科幻:1519,游戏:1520,青春:1522,古言:1523,现言:1524\");\na.push(E);\na.push(H(\"榜单\"));\na.push(A(\"都市总榜\",\"1505\",\"3\",\"\"));\na.push(A(\"玄幻总榜\",\"1501\",\"3\",\"\"));\na.push(A(\"仙侠总榜\",\"1504\",\"3\",\"\"));\na.push(A(\"奇幻总榜\",\"1502\",\"3\",\"\"));\na.push(A(\"历史总榜\",\"1506\",\"3\",\"\"));\na.push(A(\"军事总榜\",\"1507\",\"3\",\"\"));\na.push(A(\"科幻总榜\",\"1509\",\"3\",\"\"));\na.push(A(\"悬疑总榜\",\"1508\",\"3\",\"\"));\na.push(A(\"游戏总榜\",\"1510\",\"3\",\"\"));\na.push(A(\"武侠总榜\",\"1503\",\"3\",\"\"));\na.push(A(\"现言总榜\",\"1524\",\"3\",\"\"));\na.push(A(\"古言总榜\",\"1523\",\"3\",\"\"));\na.push(A(\"都市完本\",\"1505\",\"0\",\"1\"));\na.push(A(\"玄幻完本\",\"1501\",\"0\",\"1\"));\na.push(A(\"仙侠完本\",\"1504\",\"0\",\"1\"));\na.push(A(\"奇幻完本\",\"1502\",\"0\",\"1\"));\na.push(A(\"历史完本\",\"1506\",\"0\",\"1\"));\na.push(A(\"军事完本\",\"1507\",\"0\",\"1\"));\na.push(A(\"科幻完本\",\"1509\",\"0\",\"1\"));\na.push(A(\"悬疑完本\",\"1508\",\"0\",\"1\"));\na.push(A(\"游戏完本\",\"1510\",\"0\",\"1\"));\na.push(A(\"武侠完本\",\"1503\",\"0\",\"1\"));\na.push(A(\"现言完本\",\"1524\",\"0\",\"1\"));\na.push(A(\"古言完本\",\"1523\",\"0\",\"1\"));\na.push(A(\"都市连载\",\"1505\",\"0\",\"0\"));\na.push(A(\"玄幻连载\",\"1501\",\"0\",\"0\"));\na.push(A(\"仙侠连载\",\"1504\",\"0\",\"0\"));\na.push(A(\"奇幻连载\",\"1502\",\"0\",\"0\"));\na.push(A(\"历史连载\",\"1506\",\"0\",\"0\"));\na.push(A(\"军事连载\",\"1507\",\"0\",\"0\"));\na.push(A(\"科幻连载\",\"1509\",\"0\",\"0\"));\na.push(A(\"悬疑连载\",\"1508\",\"0\",\"0\"));\na.push(A(\"游戏连载\",\"1510\",\"0\",\"0\"));\na.push(A(\"武侠连载\",\"1503\",\"0\",\"0\"));\na.push(A(\"现言连载\",\"1524\",\"0\",\"0\"));\na.push(A(\"古言连载\",\"1523\",\"0\",\"0\"));\na.push(E);\n\"[\"+a.join(\",\")+\"]\";\n&lt;/js&gt;", "header": "{\n\t\"user-agent\":\"Mozilla/5.0 (Linux; Android 10; MI 8 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36\",\n\t\"Referer\":\"https://bookshelf.html5.qq.com/qbread\"\n\t}", "lastUpdateTime": "1788450160569", "respondTime": 180000, "ruleBookInfo": {"author": "$.author", "coverUrl": "$.picurl", "init": "$.data.bookInfo", "intro": "&lt;p&gt;{{(t=String(java.getString('$.tag'))).length?'🏷️   标签：'+t.replace(/\\|/g,', '):''}}&lt;/p&gt;{{'\\n&amp;lrm;'}}\n&lt;p&gt;🔖   简介：{{$.summary}}&lt;/p&gt;", "kind": "{{$.userscore}}分 · {{$.subject}} · {{$.serialnum}}章 · {{(Number(java.getString('$.contentsize'))/10000).toFixed(1)}}万字 · {{java.getString('$.isfinish')=='true'?'已完结':'连载中'}}\n{{String(java.getString('$.tag')).replace(/\\|/g,'、')}}\n{{String(java.timeFormat(java.getString('$.lastUpdatetime')*1000)).replace(/\\//g,'-').replace(/\\s.*/,'')}}", "lastChapter": "$.lastSerialname##正文卷.|正文.|VIP卷.|默认卷.|卷_|VIP章节.|免费章节.|章节目录.|最新章节.|[\\(（【].*?[求更票谢乐发订合补加架字修Kk].*?[】）\\)]|.*新书.*|.*上线.*", "name": "$.resourceName##（.*", "tocUrl": "https://bookshelf.html5.qq.com/qbread/api/book/all-chapter?bookId={{$.resourceID}}", "wordCount": "$.contentsize"}, "ruleContent": {"content": "&lt;p&gt;{{$.data.Content[0].Content||'本章暂无法读取（可能为付费章节）'}}&lt;/p&gt;"}, "ruleExplore": {"author": "$.author", "bookList": "$.rows[*]", "bookUrl": "https://bookshelf.html5.qq.com/qbread/api/novel/intro-info?bookid={{$.resourceID}}", "coverUrl": "$.picurl", "intro": "$.summary", "kind": "{{$.userscore}}分 · {{$.subject}} · {{$.serialnum}}章 · {{(Number(java.getString('$.contentsize'))/10000).toFixed(1)}}万字 · {{java.getString('$.isfinish')=='true'?'已完结':'连载中'}}\n{{String(java.getString('$.tag')).replace(/\\|/g,'、')}}\n{{String(java.timeFormat(java.getString('$.lastUpdatetime')*1000)).replace(/\\//g,'-').replace(/\\s.*/,'')}}", "lastChapter": "$.lastSerialname##正文卷.|正文.|VIP卷.|默认卷.|卷_|VIP章节.|免费章节.|章节目录.|最新章节.|[\\(（【].*?[求更票谢乐发订合补加架字修Kk].*?[】）\\)]|.*新书.*|.*上线.*", "name": "$.resourceName##（.*", "wordCount": "$.contentsize"}, "ruleSearch": {"author": "$.author", "bookList": "$.booklist[*]", "bookUrl": "$.bid\n&lt;js&gt;1100000000+parseInt(result)&lt;/js&gt;\nhttps://bookshelf.html5.qq.com/qbread/api/novel/intro-info?bookid={{result}}", "coverUrl": "$.bid\n@js:\nvar s = result\nfunction gt(s){\n\tlet a = s.slice(-3)\n\tif(a&lt;10){\n\t\tn = s.slice(-1)\n\t\t}\n\telse if(a&lt;100){\n\t\tn = s.slice(-2)\n\t\t}\n\telse{\n\t\tn = a\n\t\t}\n\treturn n\n}\n\"https://wfqqreader-1252317822.image.myqcloud.com/cover/\"+gt(s)+\"/\"+s+\"/b_\"+s+\".jpg\"", "intro": "$.intro", "kind": "{{$.categoryInfoV4##\\d.*?\\:(.*?)\\:.*?(,|$)##$1$2###}}\n{{$.updateInfo##已更新至.*##连载中}}", "lastChapter": "$.updateInfo##已更新至##第", "name": "$.title", "wordCount": "$.totalWords"}, "ruleToc": {"chapterList": "$.rows", "chapterName": "$.serialName##正文卷.|正文.|VIP卷.|默认卷.|卷_|VIP章节.|免费章节.|章节目录.|最新章节.|[\\(（【].*?[求更票谢乐发订合补加架字修Kk].*?[】）\\)]", "chapterUrl": "https://novel.html5.qq.com/be-api/content/ads-read,{\n\t\"method\": \"POST\",\n\t\"body\": {\n\t\t\"Scene\": \"chapter\",\n\t\t\"ContentAnchorBatch\": [{\n\t\t\t\t\"BookID\": \"{{(baseUrl.match(/bookId=(\\d+)/)||['',''])[1]}}\",\n\t\t\t\t\"ChapterSeqNo\": [{{$.serialID}}]\n\t\t\t}]\n\t},\n\t\"headers\": {\n\t\t\"user-agent\": \"Mozilla/5.0 (Linux; Android 10; MI 8 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36\",\n\t\t\"Referer\": \"https://bookshelf.html5.qq.com/qbread\",\n\t\t\"Q-GUID\": \"4aa27c7cf2d9aca3359656ea186488cb\"\n\t}\n}"}, "searchUrl": "https://newopensearch.reader.qq.com/wechat?keyword={{key}}&amp;start={{(page-1)*20}}&amp;end={{page*20-1}}", "weight": 0},{"bookSourceComment": "//By情无羁25.04.09 使用需要魔法\n主域名需魔法，但是大陆无障碍地址不用。\n可以在APP或者主域名里面找到大陆无障碍地址自行替换API域名。\n比如当前的无障碍地址是https://www.copy4000.com/，所以把https://api.mangacopy.com里的mangacopy替换成copy4000。\n\n替换结果示例https://api.copy4000.com\n\n不建议频繁搜索和校验，会触发风控。触发风控后可选择放置几个小时，或者遵循指示下载官方APP一小时后解除风控。", "bookSourceGroup": "", "bookSourceName": "拷贝漫画（优++）", "bookSourceType": 0, "bookSourceUrl": "https://www.mangacopy.com/", "customOrder": 208, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "exploreUrl": "@js:\nsort = [];\npush = (title, url, type) => sort.push({\n    title: title,\n    url: url,\n    style: {\n        layout_flexGrow: 1,\n        layout_flexBasisPercent: type\n    }\n});\n\nurl = (theme) => `@js:\n\"https://api.mangacopy.com/api/v3/comics?ordering=-datetime_updated&limit=21&offset={{(page-1)*21}}&free_type=1&theme=${theme}&_update=true\"` \n\npush(\"全部题材\", \"\", 1)\ntagUrl = 'https://api.mangacopy.com/api/v3/theme/comic/count?free_type=1&limit=500&offset=0&_update=true' \nlet $ = JSON.parse(java.ajax(tagUrl)).results.list\n$.forEach(($) => {\n  push($.name, url($.path_word), 0.25)\n})\n\nJSON.stringify(sort)", "header": "@js:\nJSON.stringify({\n\"platform\":\"1\",\n\"version\":\"9.9.9\",\n\"Accept-Language\": \"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7\",\r\n\"Accept\": \"application/json\",\n\"referer\":baseUrl\n})", "lastUpdateTime": "1788449879889", "respondTime": 181130, "ruleBookInfo": {"init": "<js>java.t2s(result)</js>\n$..comic", "intro": "$..brief", "kind": "{{$..display}},{{$..theme}}##.*?name\":\"(.*?)\".*?|\\,.*\\]##$1", "lastChapter": "$..last_chapter##.*name=(.*?)\\W##$1", "tocUrl": "https://api.mangacopy.com/api/v3/comic/{{$..path_word}}\n<js>\na=result.replace(/\\s.*/g,'').replace(/$/,'/group/default/chapters?limit=100&offset=0')\na\n</js>"}, "ruleContent": {"content": "$..url\n<js>\nresult.split(\"\\n\").map(x=>'<img src=\"'+x+'\">').join(\"\\n\")\n</js>", "imageStyle": "FULL"}, "ruleExplore": [], "ruleSearch": {"author": "$.author##.*name=(.*?)\\,.*##$1", "bookList": "<js>java.t2s(result)</js>\n$..list[*]", "bookUrl": "https://api.mangacopy.com/api/v3/comic2/{{$.path_word}}?platform=1&_update=true", "checkKeyWord": "登录武林系统", "coverUrl": "$.cover", "name": "$.name"}, "ruleToc": {"chapterList": "$..list[*]", "chapterName": "name", "chapterUrl": "https://api.mangacopy.com/api/v3/comic/{{$.comic_path_word}}/chapter2/{{$.uuid}}?in_mainland=true&platform=1", "nextTocUrl": "$..count\n<js>\na=String(result[0]);\nb= Math.floor(parseFloat(a.replace(/\\s/,''))/100);\nb=b+1\nlist=[];\nfor(i=0;i<=b;i++){\n\tlist.push(baseUrl.replace(/offset=0/,'offset='+100*i))\n\t}list\n</js>"}, "searchUrl": "https://api.mangacopy.com/api/v3/search/comic?platform=1&q={{key}}&limit=20&offset={{20*(page-1)}}&q_type=&_update=true", "weight": 0},{"bookSourceComment": "主域名需魔法，但是大陆无障碍地址不用。\n可以在APP或者主域名里面找到大陆无障碍地址自行替换API域名。\n比如当前的无障碍地址是https://www.copy4000.com/，所以把https://api.mangacopy.com里的mangacopy替换成copy4000。\n\n替换结果示例https://api.copy4000.com\n\n不建议频繁搜索和校验，会触发风控。触发风控后可选择放置几个小时，或者遵循指示下载官方APP一小时后解除风控。", "bookSourceGroup": "", "bookSourceName": "拷贝轻小说[Yolo]", "bookSourceType": 0, "bookSourceUrl": "https://www.mangacopy.com", "customOrder": 792, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "exploreUrl": "@js:\nsort = [];\npush = (title, url, type) => sort.push({\n    title: title,\n    url: url,\n    style: {\n        layout_flexGrow: 1,\n        layout_flexBasisPercent: type\n    }\n});\n\nurl = (theme) => `@js:\n\"https://api.mangacopy.com/api/v3/books?ordering=-datetime_updated&limit=21&offset={{(page-1)*21}}&free_type=1&theme=${theme}&_update=true\"` \n\npush(\"全部题材\", \"\", 1)\ntagUrl = 'https://api.mangacopy.com/api/v3/theme/book/count?free_type=1&limit=500&offset=0&_update=true' \nlet $ = JSON.parse(java.ajax(tagUrl)).results.list\n$.forEach(($) => {\n  push($.name, url($.path_word), 0.25)\n})\n\nJSON.stringify(sort)", "lastUpdateTime": "1788450029016", "respondTime": 24687, "ruleBookInfo": {"author": "$.author..name", "coverUrl": "$.cover", "init": "results.book", "intro": "$.brief", "kind": "$.theme..name", "lastChapter": "$.last_chapter..name", "name": "$.name", "tocUrl": "https://api.mangacopy.com/api/v3/book/{{$.path_word}}/volumes?_update=true"}, "ruleContent": {"content": "@js:\nvar url = java.getString('$..txt_addr');\nvar text = java.cacheFile(url);\nvar img = java.getString('$..content');\nvar ims = img.match(/https?:\\/\\/.+\\.(jpg|jpeg|webp)/gi);\nvar imgs = '';  \nif (ims) {\n    imgs = ims.map(x => `<img src=\"${x}\">`).join('\\n');\n}\ntext + imgs;"}, "ruleExplore": {"bookList": ""}, "ruleSearch": {"author": "$.author..name", "bookList": "results.list.[*]", "bookUrl": "https://api.mangacopy.com/api/v3/book/{{$.path_word}}?_update=true", "checkKeyWord": "我被告白之后", "coverUrl": "$.cover", "name": "$.name"}, "ruleToc": {"chapterList": "$.results..list[*]", "chapterName": "$.name", "chapterUrl": "https://api.mangacopy.com/api/v3/book/{{$.book_path_word}}/volume/{{$..id}}?_update=true", "isVolume": ""}, "searchUrl": "https://api.mangacopy.com/api/v3/search/books?limit=20&offset=0&q_type=&q={{key}}&_update=true", "weight": 0},{"bookSourceComment": "主站 www.pilishuwu.com，镜像 www.pilibook.net / www.pili45.com。访问不了时通过登录界面切换域名。搜索有验证码，弹出浏览器完成后点右上角对勾即可。发现页可直接浏览。", "bookSourceName": "霹雳书屋", "bookSourceType": 0, "bookSourceUrl": "https://www.pilishuwu.com", "bookUrlPattern": "https?://[^/]+/\\d+/\\d+/info\\.html", "concurrentRate": "1000", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreScreen": "", "exploreUrl": "全部小说::{{host.call(this)}}/0/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html,{\"webView\":true}\n男频小说::{{host.call(this)}}/1/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html,{\"webView\":true}\n女频小说::{{host.call(this)}}/2/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html,{\"webView\":true}\n电子图书::{{host.call(this)}}/3/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html,{\"webView\":true}\n无CP小说::{{host.call(this)}}/4/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html,{\"webView\":true}\n纯爱小说::{{host.call(this)}}/5/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html,{\"webView\":true}\n百合小说::{{host.call(this)}}/6/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html,{\"webView\":true}\n轻小说::{{host.call(this)}}/8/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html,{\"webView\":true}\n最新入库::{{host.call(this)}}/top/list/0/1/{{page}}.html,{\"webView\":true}\n全部点击::{{host.call(this)}}/top/list/0/2/{{page}}.html,{\"webView\":true}\n本年点击::{{host.call(this)}}/top/list/0/3/{{page}}.html,{\"webView\":true}\n本月点击::{{host.call(this)}}/top/list/0/4/{{page}}.html,{\"webView\":true}\n本周点击::{{host.call(this)}}/top/list/0/5/{{page}}.html,{\"webView\":true}\n本日点击::{{host.call(this)}}/top/list/0/6/{{page}}.html,{\"webView\":true}", "header": "@js:\nJSON.stringify({\n  \"User-Agent\": java.getWebViewUA(),\n  \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\n  \"Accept-Language\": \"zh-CN,zh;q=0.9,en;q=0.8\"\n})\n", "jsLib": "function host(){\n  var src=this.source;\n  var m=src?src.getLoginInfoMap():null;\n  var h=(m&&m[\"线路\"])||\"https://www.pili45.com\";\n  if(String(h).indexOf(\"http\")!=0){\n    if(String(h).indexOf(\"pilibook\")>=0) h=\"https://www.pilibook.net\";\n    else if(String(h).indexOf(\"pilishuwu\")>=0) h=\"https://www.pilishuwu.com\";\n    else h=\"https://www.pili45.com\";\n  }\n  return String(h).replace(/\\/$/,\"\");\n}", "lastUpdateTime": "1788443165368", "loginCheckJs": "var resultUrl = result.url();\nvar resultCode = result.code();\nvar resultBoDy = String(result.body()||\"\");\nif (/Just a moment|Checking your browser|_cf_|cf-browser-verification|challenge-platform/i.test(resultBoDy) && resultCode >= 403) {\n  java.longToast(\"请完成人机验证后点右上角对勾\");\n  cookie.removeCookie(baseUrl);\n  result = java.startBrowserAwait(resultUrl, \"Cloudflare验证\", false);\n}\nresult;", "loginUi": "[{\"name\":\"线路\",\"type\":\"select\",\"chars\":[\"https://www.pilishuwu.com\",\"https://www.pilibook.net\",\"https://www.pili45.com\"],\"default\":\"https://www.pili45.com\"}]", "loginUrl": "@js:\nfunction login(){\n  var m=source.getLoginInfoMap()||{};\n  source.putLoginInfo(JSON.stringify(m));\n  java.toast(\"已切换线路：\"+host.call(this));\n}\n", "respondTime": 180000, "ruleBookInfo": {"author": ".x-detail__info--author@text##作者：", "coverUrl": "class.x-book__coverbox.0@tag.img.0@src", "intro": ".x-detail__intro--content@text", "kind": "class.x-detail__info--words.0@text##分类：##", "lastChapter": ".x-catalog__new@text##最新", "name": ".x-detail__info--title@text", "tocUrl": "text.章节目录@href##$##,{\"webView\":true}"}, "ruleContent": {"content": "@js:\nvar m=String(baseUrl||'').match(/read\\/(\\d+)\\.html/);\nvar cid=m?m[1]:'';\nif(!cid){''}else{\nvar j=JSON.parse(java.ajax('https://www.pili45.com/wmcms/ajax/index.php?action=novel.getchapter&cid='+cid+'&format=1'));\nif(j.code!=200){''}else{\nvar c=j.data.chapter;\njava.put('ctitle', c.chapter_name||'');\nvar arr=c.content||[];\nvar out=[];\nfor(var i=0;i<arr.length;i++){out.push('<p>'+arr[i]+'</p>');}\nout.join('');\n}\n}", "title": "@js:java.get('ctitle')"}, "ruleExplore": {"author": "p.x-book__info--author@tag.span.0@text||.x-info__author span@text", "bookList": ".x-library__books .x-book||.x-rank__book", "bookUrl": "a@href##$##,{\"webView\":true}", "coverUrl": "img@data-src||img@src", "intro": ".x-book__info--chapter@text||.x-info__intro@text", "kind": "span.red@text||.x-info__author@ownText", "name": ".x-book__info--name@text||.x-info__name@text", "wordCount": ".word-convert@text"}, "ruleSearch": {"author": ".book-status@text||p.x-book__info--author@tag.span.0@text", "bookList": "@js:\nfunction books(){var a=java.getElements('.x-library__books .x-book');if(a&&a.size()>0)return a;return java.getElements('.x-book');}\nvar c=books();\nif(c&&c.size()>0){c;}else{\nvar s=String(result||'');\nvar need=s.indexOf('验证码')>=0 && s.indexOf('请稍候')<0 && s.indexOf('Just a moment')<0 && s.indexOf('搜索结果')<0;\nif(need){\njava.longToast('请完成搜索验证后点右上角对勾');\nvar resp=java.startBrowserAwait(java.get('url'),'搜索验证');\nvar html='';try{html=String(resp.body());}catch(e){html=String(resp);}\njava.setContent(html);\nc=books();\n}\nc;\n}", "bookUrl": ".x-book__coverbox a@href##$##,{\"webView\":true}", "checkKeyWord": "系统", "coverUrl": "img@data-src||img@src", "intro": ".x-book__intro@text||.x-book__info--chapter@text", "kind": ".book-fenlei@text||span.red@text", "name": ".x-book__info--name@text", "wordCount": ".word-convert@text"}, "ruleToc": {"chapterList": "li.chapter", "chapterName": "a@text", "chapterUrl": "a@href##$##,{\"webView\":true}"}, "searchUrl": "@js:\nvar k = java.encodeURI(key);\nvar h = host.call(this);\nvar url = page > 1\n  ? (h + \"/search/0/\" + k + \"/\" + page + \".html\")\n  : (h + \"/module/search/search.php?key=\" + k + \"&module=novel&type=0\");\njava.put(\"url\", url);\nvar waitJs = \"(()=>{var b=document.querySelectorAll('.x-book');if(b.length)return document.documentElement.outerHTML;var t=document.title||'';var h=document.body?document.body.innerHTML:'';if(h.indexOf('验证码')>=0&&t.indexOf('请稍候')<0&&t.indexOf('Just a moment')<0)return document.documentElement.outerHTML;return null;})()\";\nurl + ',' + JSON.stringify({webView:true, webJs:waitJs, webViewDelayTime:1500});\n", "variableComment": "登录UI「线路」：主站 pilishuwu.com / 镜像 pilibook.net / 镜像 pili45.com。默认 pili45.com。", "weight": 0},{"bookSourceComment": "主站 www.pilishuwu.com，镜像 www.pilibook.net / www.pili45.com。访问不了时通过登录界面切换域名。搜索有验证码，弹出浏览器完成后点右上角对勾即可。发现页可直接浏览。", "bookSourceName": "霹雳书屋", "bookSourceType": 0, "bookSourceUrl": "https://www.pilishuwu.com", "bookUrlPattern": "https?://[^/]+/\\d+/\\d+/info\\.html", "concurrentRate": "1000", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreScreen": "", "exploreUrl": "全部小说::{{host.call(this)}}/0/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html,{\"webView\":true}\n男频小说::{{host.call(this)}}/1/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html,{\"webView\":true}\n女频小说::{{host.call(this)}}/2/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html,{\"webView\":true}\n电子图书::{{host.call(this)}}/3/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html,{\"webView\":true}\n无CP小说::{{host.call(this)}}/4/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html,{\"webView\":true}\n纯爱小说::{{host.call(this)}}/5/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html,{\"webView\":true}\n百合小说::{{host.call(this)}}/6/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html,{\"webView\":true}\n轻小说::{{host.call(this)}}/8/list/{{page==1?'1':'0_0_0_0_0_0_0_'+page}}.html,{\"webView\":true}\n最新入库::{{host.call(this)}}/top/list/0/1/{{page}}.html,{\"webView\":true}\n全部点击::{{host.call(this)}}/top/list/0/2/{{page}}.html,{\"webView\":true}\n本年点击::{{host.call(this)}}/top/list/0/3/{{page}}.html,{\"webView\":true}\n本月点击::{{host.call(this)}}/top/list/0/4/{{page}}.html,{\"webView\":true}\n本周点击::{{host.call(this)}}/top/list/0/5/{{page}}.html,{\"webView\":true}\n本日点击::{{host.call(this)}}/top/list/0/6/{{page}}.html,{\"webView\":true}", "header": "@js:\nJSON.stringify({\n  \"User-Agent\": java.getWebViewUA(),\n  \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\n  \"Accept-Language\": \"zh-CN,zh;q=0.9,en;q=0.8\"\n})\n", "jsLib": "function host(){\n  var src=this.source;\n  var m=src?src.getLoginInfoMap():null;\n  var h=(m&&m[\"线路\"])||\"https://www.pili45.com\";\n  if(String(h).indexOf(\"http\")!=0){\n    if(String(h).indexOf(\"pilibook\")>=0) h=\"https://www.pilibook.net\";\n    else if(String(h).indexOf(\"pilishuwu\")>=0) h=\"https://www.pilishuwu.com\";\n    else h=\"https://www.pili45.com\";\n  }\n  return String(h).replace(/\\/$/,\"\");\n}", "lastUpdateTime": "1788408968864", "loginCheckJs": "var resultUrl = result.url();\nvar resultCode = result.code();\nvar resultBoDy = String(result.body()||\"\");\nif (/Just a moment|Checking your browser|_cf_|cf-browser-verification|challenge-platform/i.test(resultBoDy) && resultCode >= 403) {\n  java.longToast(\"请完成人机验证后点右上角对勾\");\n  cookie.removeCookie(baseUrl);\n  result = java.startBrowserAwait(resultUrl, \"Cloudflare验证\", false);\n}\nresult;", "loginUi": "[{\"name\":\"线路\",\"type\":\"select\",\"chars\":[\"https://www.pilishuwu.com\",\"https://www.pilibook.net\",\"https://www.pili45.com\"],\"default\":\"https://www.pili45.com\"}]", "loginUrl": "@js:\nfunction login(){\n  var m=source.getLoginInfoMap()||{};\n  source.putLoginInfo(JSON.stringify(m));\n  java.toast(\"已切换线路：\"+host.call(this));\n}\n", "respondTime": 180000, "ruleBookInfo": {"author": ".x-detail__info--author@text##作者：", "coverUrl": "class.x-book__coverbox.0@tag.img.0@src", "intro": ".x-detail__intro--content@text", "kind": "class.x-detail__info--words.0@text##分类：##", "lastChapter": ".x-catalog__new@text##最新", "name": ".x-detail__info--title@text", "tocUrl": "text.章节目录@href##$##,{\"webView\":true}"}, "ruleContent": {"content": "#chapterContent .jsChapterWrapper p@html", "title": "#chapterTitle@text", "webJs": "(()=>{var el=document.querySelector('#chapterContent .jsChapterWrapper')||document.querySelector('#chapterContent');if(!el)return null;var t=el.innerText||'';if(/加载中|loading/i.test(t)&&el.querySelectorAll('p').length<3)return null;if(el.querySelectorAll('p').length<1)return null;return document.documentElement.outerHTML;})()"}, "ruleExplore": {"author": "p.x-book__info--author@tag.span.0@text||.x-info__author span@text", "bookList": ".x-library__books .x-book||.x-rank__book", "bookUrl": "a@href##$##,{\"webView\":true}", "coverUrl": "img@data-src||img@src", "intro": ".x-book__info--chapter@text||.x-info__intro@text", "kind": "span.red@text||.x-info__author@ownText", "name": ".x-book__info--name@text||.x-info__name@text", "wordCount": ".word-convert@text"}, "ruleSearch": {"author": ".book-status@text||p.x-book__info--author@tag.span.0@text", "bookList": "@js:\nfunction books(){var a=java.getElements('.x-library__books .x-book');if(a&&a.size()>0)return a;return java.getElements('.x-book');}\nvar c=books();\nif(c&&c.size()>0){c;}else{\nvar s=String(result||'');\nvar need=s.indexOf('验证码')>=0 && s.indexOf('请稍候')<0 && s.indexOf('Just a moment')<0 && s.indexOf('搜索结果')<0;\nif(need){\njava.longToast('请完成搜索验证后点右上角对勾');\nvar resp=java.startBrowserAwait(java.get('url'),'搜索验证');\nvar html='';try{html=String(resp.body());}catch(e){html=String(resp);}\njava.setContent(html);\nc=books();\n}\nc;\n}", "bookUrl": ".x-book__coverbox a@href##$##,{\"webView\":true}", "checkKeyWord": "系统", "coverUrl": "img@data-src||img@src", "intro": ".x-book__intro@text||.x-book__info--chapter@text", "kind": ".book-fenlei@text||span.red@text", "name": ".x-book__info--name@text", "wordCount": ".word-convert@text"}, "ruleToc": {"chapterList": "li.chapter", "chapterName": "a@text", "chapterUrl": "a@href##$##,{\"webView\":true}"}, "searchUrl": "@js:\nvar k = java.encodeURI(key);\nvar h = host.call(this);\nvar url = page > 1\n  ? (h + \"/search/0/\" + k + \"/\" + page + \".html\")\n  : (h + \"/module/search/search.php?key=\" + k + \"&module=novel&type=0\");\njava.put(\"url\", url);\nvar waitJs = \"(()=>{var b=document.querySelectorAll('.x-book');if(b.length)return document.documentElement.outerHTML;var t=document.title||'';var h=document.body?document.body.innerHTML:'';if(h.indexOf('验证码')>=0&&t.indexOf('请稍候')<0&&t.indexOf('Just a moment')<0)return document.documentElement.outerHTML;return null;})()\";\nurl + ',' + JSON.stringify({webView:true, webJs:waitJs, webViewDelayTime:1500});\n", "variableComment": "登录UI「线路」：主站 pilishuwu.com / 镜像 pilibook.net / 镜像 pili45.com。默认 pili45.com。", "weight": 0},{"bookSourceComment": "//2026.6.21@by荡神", "bookSourceGroup": "写源", "bookSourceName": "🌟免费小说", "bookSourceType": 0, "bookSourceUrl": "https://cn.zhys.tw", "customButton": false, "customOrder": 20, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nvar result=[];\nvar push=function(t,u,s){result.push({title:t,url:u,style:{layout_flexGrow:1,layout_flexBasisPercent:s}})};\n\npush('📚 分类浏览',null,1);\nvar cats=[\n  ['豪门','/haomenzongcai?page={{page}}'],\n  ['悬疑','/xuanyilingyi?page={{page}}'],\n  ['青春','/langmanqingchun?page={{page}}'],\n  ['玄幻','/xianxiaxuanhuan?page={{page}}'],\n  ['架空','/chuanyuejiakong?page={{page}}'],\n  ['异能','/dushiyineng?page={{page}}'],\n  ['都市','/dushiyanqing?page={{page}}'],\n  ['现代','/xianyan?page={{page}}'],\n  ['古代','/guyan?page={{page}}']\n];\ncats.forEach(function(c){push(c[0],c[1],0.25)});\n\npush('🏆 排行榜',null,1);\npush('女频新书榜','/rank/70?page={{page}}',0.5);\npush('女频阅读榜','/rank/39?page={{page}}',0.5);\npush('男频新书榜','/rank/20?page={{page}}',0.5);\npush('男频阅读榜','/rank/1?page={{page}}',0.5);\n\npush('📋 子榜单',null,1);\nvar subRanks=[\n  ['古风世情','/rank/39?page={{page}}'],\n  ['科幻末世','/rank/40?page={{page}}'],\n  ['游戏体育','/rank/41?page={{page}}'],\n  ['女频衍生','/rank/42?page={{page}}'],\n  ['玄幻言情','/rank/43?page={{page}}'],\n  ['种田','/rank/44?page={{page}}'],\n  ['年代','/rank/45?page={{page}}'],\n  ['现言脑洞','/rank/46?page={{page}}'],\n  ['宫斗宅斗','/rank/47?page={{page}}'],\n  ['悬疑脑洞','/rank/48?page={{page}}'],\n  ['古言脑洞','/rank/49?page={{page}}'],\n  ['快穿','/rank/50?page={{page}}'],\n  ['青春甜宠','/rank/51?page={{page}}'],\n  ['星光璀璨','/rank/52?page={{page}}'],\n  ['女频悬疑','/rank/53?page={{page}}'],\n  ['职场婚恋','/rank/54?page={{page}}'],\n  ['豪门总裁','/rank/55?page={{page}}'],\n  ['民国言情','/rank/56?page={{page}}']\n];\nsubRanks.forEach(function(r){push(r[0],r[1],0.33)});\n\nJSON.stringify(result);", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 12; SM-G9810) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1788403811524", "loginUrl": "https://cn.zhys.tw", "respondTime": 180000, "ruleBookInfo": {"author": "a[href*='/author/']@text", "coverUrl": "figure img@src||img@src", "intro": "div[itemprop='description']@text", "kind": "ol li:nth-child(3) a@text", "name": "h1@text", "wordCount": "span:contains('万字')@text"}, "ruleContent": {"content": "#article-content@html", "replaceRegex": "##<p>\\s*第\\d+章\\s+.*?</p>||请收藏本站.*|.*记住本站域名.*|.*免费小说.*"}, "ruleExplore": {"author": "p[itemprop='author']@text##\\|.*||a[href*='/author/']@text", "bookList": "li[itemprop='mainEntity']||section ul li:has(a[href*='/book/'])", "bookUrl": "a[itemprop='url']@href||a[href*='/book/']@href", "coverUrl": "img[itemprop='image']@src||img@src", "name": "h2[itemprop='name']@text||a[href*='/book/']@text"}, "ruleSearch": {"author": "p[itemprop='author']@text", "bookList": "li[itemprop='mainEntity']", "bookUrl": "a[itemprop='url']@href", "coverUrl": "img[itemprop='image']@src", "kind": "span[itemprop='genre']@text", "name": "h2[itemprop='name']@text"}, "ruleToc": {"chapterList": "#full-catalog a[href*='/read/']", "chapterName": "text##上次阅读", "chapterUrl": "href"}, "searchUrl": "/search?q={{key}}&page={{page}}", "weight": 0, "loginCheckJs": "var src = result.body();\nif (src.match(/Just a moment|Checking your browser|Performing security verification|Verifying you are human/)) {\n    cookie.removeCookie(source.bookSourceUrl);\n    var url = result.url();\n    java.startBrowserAwait(url, \"Cloudflare验证\");\n    result = java.connect(url);\n}\nresult;"},{"bookSourceGroup": "小说", "bookSourceName": "爱下电子书", "bookSourceType": 0, "bookSourceUrl": "https://ixdzs8.com", "bookUrlPattern": "https://ixdzs8\\.com/read/\\d+/?", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "最近更新::/new/?page={{page}}\n完结小说::/end/?page={{page}}\n日榜::/hot/day/?page={{page}}\n月榜::/hot/month/?page={{page}}\n总榜::/hot/?page={{page}}\n玄幻奇幻::/sort/1/index-0-0-0-{{page}}.html\n武侠小说::/sort/10/index-0-0-0-{{page}}.html\n修真仙侠::/sort/2/index-0-0-0-{{page}}.html\n都市青春::/sort/3/index-0-0-0-{{page}}.html\n军事历史::/sort/4/index-0-0-0-{{page}}.html\n网游竞技::/sort/5/index-0-0-0-{{page}}.html\n科幻灵异::/sort/6/index-0-0-0-{{page}}.html\n言情穿越::/sort/7/index-0-0-0-{{page}}.html\n耽美同人::/sort/8/index-0-0-0-{{page}}.html\n台言古言::/sort/9/index-0-0-0-{{page}}.html\n其他小说::/sort/0/index-0-0-0-{{page}}.html", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1788330412645", "respondTime": 180000, "ruleBookInfo": {"name": ".n-text h1@text", "author": ".bauthor a@text", "intro": "#intro@text", "kind": ".tags a@text"}, "ruleContent": {"content": "@js:\nvar tokenMatch = src.match(/token\\s*=\\s*\"([^\"]+)\"/);\nvar html = src;\nif (tokenMatch) {\n    var token = tokenMatch[1];\n    var tourl = baseUrl + \"?challenge=\" + encodeURIComponent(token);\n    html = java.ajax(tourl);\n}\nvar section = html.match(/<section[^>]*>\\s*([\\s\\S]*?)\\s*<\\/section>/i);\nif (!section) {\n    \"\";\n} else {\n    var text = section[1]\n        .replace(/<br\\s*\\/?>/gi, \"\\n\")\n        .replace(/<\\/p>\\s*<p[^>]*>/gi, \"\\n\")\n        .replace(/<\\/?p[^>]*>/gi, \"\")\n        .trim();\n    text;\n}"}, "ruleExplore": {"author": ".bauthor a@text", "bookList": ".u-list li", "bookUrl": "a@href", "coverUrl": "img@src", "intro": ".l-p2@text", "kind": ".lz@text", "lastChapter": ".l-chapter@text", "name": "a@title", "wordCount": ".size@text"}, "ruleSearch": {"author": ".bauthor a@text", "bookList": ".u-list li", "bookUrl": "a@href", "coverUrl": "img@src\n@js:\nif (result == \"https://img22.ixdzs.com/nopic2.jpg\") {\n    null;\n} else {\n    result;\n}", "intro": ".l-p2@text", "kind": ".lz@text", "lastChapter": ".l-chapter@text", "name": "a@title", "wordCount": ".size@text"}, "ruleToc": {"chapterList": "@js:\nvar bidMatch = baseUrl.match(/read\\/(\\d+)/);\nif (!bidMatch) {\n    [];\n} else {\n    var bid = bidMatch[1];\n    var resp = java.post(source.getKey() + \"/novel/clist/\", \"bid=\" + bid, {});\n    var json = JSON.parse(resp.body()).data;\n    var result = [];\n    var volume = \"\";\n    for (var i = 0; i < json.length; i++) {\n        var item = json[i];\n        if (item.ctype === \"1\") {\n            volume = item.title;\n            continue;\n        }\n        item.url = source.getKey() + \"/read/\" + bid + \"/p\" + item.ordernum + \".html\";\n        item.volume = volume;\n        result.push(item);\n    }\n    result;\n}", "chapterName": "title", "chapterUrl": "url", "updateTime": "volume"}, "searchUrl": "/bsearch?q={{key}}&page={{page}}", "weight": 0},{"bookSourceComment": "//  梦不觉", "bookSourceGroup": "漫画", "bookSourceName": "G站漫画", "bookSourceType": 2, "bookSourceUrl": "https://m.g-mh.org/", "customButton": false, "customOrder": 26, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\n(function() {\n    var items = [\n        {\"title\":\"全部\",\"url\":\"https://m.g-mh.org/manga/page/{{page}}\"},\n        {\"title\":\"韩漫\",\"url\":\"https://m.g-mh.org/manga-genre/kr/page/{{page}}\"},\n        {\"title\":\"国漫\",\"url\":\"https://m.g-mh.org/manga-genre/cn/page/{{page}}\"},\n        {\"title\":\"日漫\",\"url\":\"https://m.g-mh.org/manga-genre/jp/page/{{page}}\"},\n        {\"title\":\"欧美\",\"url\":\"https://m.g-mh.org/manga-genre/ou-mei/page/{{page}}\"},\n        {\"title\":\"其他\",\"url\":\"https://m.g-mh.org/manga-genre/qita/page/{{page}}\"},\n        {\"title\":\"热门\",\"url\":\"https://m.g-mh.org/manga-genre/hots/page/{{page}}\"},\n        {\"title\":\"复仇\",\"url\":\"https://m.g-mh.org/manga-tag/fuchou/page/{{page}}\"},\n        {\"title\":\"古风\",\"url\":\"https://m.g-mh.org/manga-tag/gufeng/page/{{page}}\"},\n        {\"title\":\"奇幻\",\"url\":\"https://m.g-mh.org/manga-tag/qihuan/page/{{page}}\"},\n        {\"title\":\"逆袭\",\"url\":\"https://m.g-mh.org/manga-tag/nixi/page/{{page}}\"},\n        {\"title\":\"异能\",\"url\":\"https://m.g-mh.org/manga-tag/yineng/page/{{page}}\"},\n        {\"title\":\"宅向\",\"url\":\"https://m.g-mh.org/manga-tag/zhaixiang/page/{{page}}\"},\n        {\"title\":\"穿越\",\"url\":\"https://m.g-mh.org/manga-tag/chuanyue/page/{{page}}\"},\n        {\"title\":\"热血\",\"url\":\"https://m.g-mh.org/manga-tag/rexue/page/{{page}}\"},\n        {\"title\":\"纯爱\",\"url\":\"https://m.g-mh.org/manga-tag/chunai/page/{{page}}\"},\n        {\"title\":\"系统\",\"url\":\"https://m.g-mh.org/manga-tag/xitong/page/{{page}}\"},\n        {\"title\":\"重生\",\"url\":\"https://m.g-mh.org/manga-tag/zhongsheng/page/{{page}}\"},\n        {\"title\":\"冒险\",\"url\":\"https://m.g-mh.org/manga-tag/maoxian/page/{{page}}\"},\n        {\"title\":\"灵异\",\"url\":\"https://m.g-mh.org/manga-tag/lingyi/page/{{page}}\"},\n        {\"title\":\"大女主\",\"url\":\"https://m.g-mh.org/manga-tag/danvzhu/page/{{page}}\"},\n        {\"title\":\"剧情\",\"url\":\"https://m.g-mh.org/manga-tag/juqing/page/{{page}}\"},\n        {\"title\":\"恋爱\",\"url\":\"https://m.g-mh.org/manga-tag/lianai/page/{{page}}\"},\n        {\"title\":\"玄幻\",\"url\":\"https://m.g-mh.org/manga-tag/xuanhuan/page/{{page}}\"},\n        {\"title\":\"女神\",\"url\":\"https://m.g-mh.org/manga-tag/nvshen/page/{{page}}\"},\n        {\"title\":\"科幻\",\"url\":\"https://m.g-mh.org/manga-tag/kehuan/page/{{page}}\"},\n        {\"title\":\"魔幻\",\"url\":\"https://m.g-mh.org/manga-tag/mohuan/page/{{page}}\"},\n        {\"title\":\"推理\",\"url\":\"https://m.g-mh.org/manga-tag/tuili/page/{{page}}\"},\n        {\"title\":\"猎奇\",\"url\":\"https://m.g-mh.org/manga-tag/lieqi/page/{{page}}\"},\n        {\"title\":\"治愈\",\"url\":\"https://m.g-mh.org/manga-tag/zhiyu/page/{{page}}\"},\n        {\"title\":\"都市\",\"url\":\"https://m.g-mh.org/manga-tag/doushi/page/{{page}}\"},\n        {\"title\":\"异形\",\"url\":\"https://m.g-mh.org/manga-tag/yixing/page/{{page}}\"},\n        {\"title\":\"青春\",\"url\":\"https://m.g-mh.org/manga-tag/qingchun/page/{{page}}\"},\n        {\"title\":\"末日\",\"url\":\"https://m.g-mh.org/manga-tag/mori/page/{{page}}\"},\n        {\"title\":\"悬疑\",\"url\":\"https://m.g-mh.org/manga-tag/xuanyi/page/{{page}}\"},\n        {\"title\":\"修仙\",\"url\":\"https://m.g-mh.org/manga-tag/xiuxian/page/{{page}}\"},\n        {\"title\":\"战斗\",\"url\":\"https://m.g-mh.org/manga-tag/zhandou/page/{{page}}\"}\n    ];\n\n    var ui = [];\n\n    // 搜索框 + 搜索按钮（一行）\n    ui.push({title:'关键字', type:'text', default:'', style:{layout_flexBasisPercent:0.7, layout_flexGrow:1}});\n    ui.push({title:'🔍 搜索', type:'button', action:\"var k=infoMap['关键字']; if(!k){ java.toast('请输入关键字'); } else { java.searchBook(k, source); }\", style:{layout_flexBasisPercent:1, layout_flexGrow:1}});\n\n    // 分类标签：每行两个\n    for (var i = 0; i < items.length; i++) {\n        ui.push({title: items[i].title, url: items[i].url, style:{layout_flexBasisPercent:0.25, layout_flexGrow:1}});\n    }\n\n    return JSON.stringify(ui);\n})()", "header": "{\"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36\",\"Referer\":\"https://m.g-mh.org/\"}", "lastUpdateTime": "1788321628633", "respondTime": 180000, "ruleBookInfo": {"author": "a[href^='/manga-author/'] span@text", "coverUrl": "img.1@src", "intro": "#info p.line-clamp-4@text", "kind": "a[href^='/manga-genre/'] span@text&&a[href^='/manga-tag/'] span@text", "lastChapter": "#lastchap@text", "name": "h1@text##\\s*\\n.*", "tocUrl": "@js:\ntry{\n  let mid = String(result).match(/data-mid=\"(\\d+)\"/);\n  if(mid && mid[1]){\n    java.put(\"mid\", mid[1]);\n    \"https://api-get-v3.mgsearcher.com/api/manga/get?mid=\" + mid[1] + \"&mode=all\";\n  } else {\n    \"\";\n  }\n}catch(e){\"\"}"}, "ruleContent": {"content": "@js:(function(){\ntry{\n  var resultStr = result;\n  \n  if(typeof resultStr === 'undefined' || resultStr === null) return '';\n  \n  var json;\n  if(typeof resultStr === 'object') {\n    json = resultStr;\n  } else {\n    if(typeof resultStr !== 'string' || resultStr.length < 10) return '';\n    try { json = JSON.parse(resultStr); } catch(e) { return ''; }\n  }\n  \n  var info = json.data && json.data.info ? json.data.info : {};\n  var imagesData = info.images;\n  var NL = String.fromCharCode(10);\n  var host = 'https://c-nc-1.6wm.top';\n  \n  if(imagesData && imagesData.images) {\n    var imgs = imagesData.images;\n    var isString = typeof imgs === 'string';\n    \n    if(!isString && typeof imgs === 'object' && typeof imgs.length === 'number') {\n      if(imgs.length > 0 && typeof imgs[0] === 'string' && imgs[0].indexOf('J7r') === 0) {\n        var joined = '';\n        for(var _i = 0; _i < imgs.length; _i++) { joined += imgs[_i]; }\n        imagesData = { images: joined, line: imagesData.line || 1 };\n        isString = true;\n      } else {\n        var line = imagesData.line || 1;\n        if(line === 2) host = 'https://c-nd2-1.6wm.top';\n        else if(line === 3) host = 'https://c-nd3-1.6wm.top';\n        var tags = [];\n        for(var _j = 0; _j < imgs.length; _j++) {\n          var u = imgs[_j];\n          if(u && typeof u === 'object' && u.url) u = u.url;\n          if(u && typeof u === 'string') {\n            if(u.indexOf('http') !== 0) u = host + u;\n            tags.push('<img src=\"' + u + '\">');\n          }\n        }\n        return tags.join(NL);\n      }\n    }\n    \n    if(isString) {\n      var encrypted = imgs;\n      var lineNum = imagesData.line || 1;\n      \n      if(encrypted.substring(0, 3) !== 'J7r' || encrypted.substring(encrypted.length - 2) !== 'nQ' || encrypted.length < 20) return '';\n      \n      var FROM_TABLE = '_-9876543210abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n      var TO_TABLE   = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n      var CHUNK_SIZE = 7;\n      var MAGIC_A = 'kD';\n      var MAGIC_B = 'W4s';\n      \n      var stripped = encrypted.substring(3, encrypted.length - 2);\n      var dataLen = stripped.length;\n      var K = Math.floor((dataLen - 5) / 3);\n      \n      var p1_len = K;\n      var R = dataLen - K - 3;\n      \n      var markerFound = true;\n      if(stripped.substring(p1_len, p1_len + 2) !== MAGIC_A) markerFound = false;\n      if(stripped.substring(R, R + 3) !== MAGIC_B) markerFound = false;\n      \n      if(!markerFound) {\n        var idxA = stripped.indexOf(MAGIC_A);\n        var idxB = stripped.indexOf(MAGIC_B);\n        if(idxA >= 0 && idxB > idxA + 2) {\n          p1_len = idxA;\n          R = idxB;\n        } else { return ''; }\n      }\n      \n      var p1 = stripped.substring(0, p1_len);\n      var p3 = stripped.substring(p1_len + 2, R);\n      var p5 = stripped.substring(R + 3);\n      \n      var pairSwap = function(str) {\n        var out = '';\n        var i = 0;\n        var chunkIdx = 0;\n        while(i < str.length) {\n          var chunk = str.substring(i, i + CHUNK_SIZE);\n          if(chunkIdx % 2 === 1) {\n            var rev = '';\n            for(var j = chunk.length - 1; j >= 0; j--) rev += chunk[j];\n            chunk = rev;\n          }\n          out += chunk;\n          i += CHUNK_SIZE;\n          chunkIdx++;\n        }\n        return out;\n      };\n      \n      var combined = pairSwap(p5 + p1 + p3);\n      var substituted = '';\n      for(var si = 0; si < combined.length; si++) {\n        var c = combined.charAt(si);\n        var idx = FROM_TABLE.indexOf(c);\n        substituted += idx >= 0 ? TO_TABLE.charAt(idx) : c;\n      }\n      \n      var b64 = substituted.replace(/-/g, '+').replace(/_/g, '/');\n      while(b64.length % 4 !== 0) b64 += '=';\n      \n      var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n      var decoded = '';\n      for(var bi = 0; bi < b64.length; bi += 4) {\n        if(b64.charAt(bi+1) === '') break;\n        var c1 = chars.indexOf(b64.charAt(bi));\n        var c2 = chars.indexOf(b64.charAt(bi+1));\n        var c3 = chars.indexOf(b64.charAt(bi+2));\n        var c4 = chars.indexOf(b64.charAt(bi+3));\n        var triple = (c1 << 18) | (c2 << 12) | ((c3 & 63) << 6) | (c4 & 63);\n        decoded += String.fromCharCode((triple >>> 16) & 255);\n        if(c3 >= 0) decoded += String.fromCharCode((triple >>> 8) & 255);\n        if(c4 >= 0) decoded += String.fromCharCode(triple & 255);\n      }\n      \n      var imageList = JSON.parse(decoded);\n      \n      if(!imageList || typeof imageList !== 'object' || typeof imageList.length === 'undefined') return '';\n      \n      if(lineNum === 2) host = 'https://c-nd2-1.6wm.top';\n      else if(lineNum === 3) host = 'https://c-nd3-1.6wm.top';\n      \n      var imgTags = [];\n      for(var ti = 0; ti < imageList.length; ti++) {\n        var item = imageList[ti];\n        var url = item && (item.url || item);\n        if(url && typeof url === 'string') {\n          if(url.indexOf('http') !== 0) url = host + url;\n          imgTags.push('<img src=\"' + url + '\">');\n        }\n      }\n      \n      return imgTags.join(NL);\n    }\n  }\n  \n  return '';\n} catch(e) {\n  return '';\n}\n})()"}, "ruleExplore": {"bookList": "div.cardlist > div.pb-2", "bookUrl": "a@href", "coverUrl": "img@src", "name": "h3.cardtitle@text"}, "ruleSearch": {"author": "a[href*='/manga-author/'] span@text", "bookList": ".cardlist > div.pb-2", "bookUrl": "a@href", "checkKeyWord": "万界守门人", "coverUrl": "img.card@src", "name": "h3@text"}, "ruleToc": {"chapterList": "@js:\nlet json=JSON.parse(result);\nlet list=json.data.chapters||json.data.info.chapters||[];\nlist.map(item=>JSON.stringify(item));", "chapterName": "@js:\nlet obj=JSON.parse(result);\nobj.name||obj.title||obj.chapter_name||obj.chapter_title||(obj.attributes&&obj.attributes.title)||JSON.stringify(obj);", "chapterUrl": "@js:\nlet obj=JSON.parse(result);\nlet mid=java.get(\"mid\");\nlet cid=obj.id||obj.chapter_id;\nif(mid&&cid){\n  \"https://api-get-v3.mgsearcher.com/api/v2/chapter/getinfo?m=\"+mid+\"&c=\"+cid;\n}else{\"\"}"}, "searchUrl": "https://m.g-mh.org/s/{{key}}?page={{page}}", "weight": 0},{"bookSourceComment": "//    梦不觉   自动解锁剧集", "bookSourceGroup": "影视", "bookSourceName": "花花短剧APP[本地解密_自动解锁剧集]", "bookSourceType": 4, "bookSourceUrl": "花花短剧APP", "customButton": false, "customOrder": 3, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\n(function(){\n    var cats = [\n        {title:'古装剧场', url:'https://huahua.baibaipei.com/app/home/page?menu=%E5%8F%A4%E8%A3%85%E5%89%A7%E5%9C%BA&page={{page}}&pageSize=18&' + hs()},\n        {title:'迷雾剧场', url:'https://huahua.baibaipei.com/app/home/page?menu=%E8%BF%B7%E9%9B%BE%E5%89%A7%E5%9C%BA&page={{page}}&pageSize=18&' + hs()},\n        {title:'新剧', url:'https://huahua.baibaipei.com/app/home/page?menu=%E6%96%B0%E5%89%A7&page={{page}}&pageSize=18&' + hs()},\n        {title:'热播剧', url:'https://huahua.baibaipei.com/app/home/page?menu=%E7%83%AD%E6%92%AD%E5%89%A7&page={{page}}&pageSize=18&' + hs()},\n        {title:'都市', url:'https://huahua.baibaipei.com/app/drama/list?oriented=0&category=%E9%83%BD%E5%B8%82&page={{page}}&pageSize=18&' + hs()},\n        {title:'悬疑', url:'https://huahua.baibaipei.com/app/drama/list?oriented=0&category=%E6%82%AC%E7%96%91&page={{page}}&pageSize=18&' + hs()},\n        {title:'古言', url:'https://huahua.baibaipei.com/app/drama/list?oriented=0&category=%E5%8F%A4%E8%A8%80&page={{page}}&pageSize=18&' + hs()},\n        {title:'玄幻', url:'https://huahua.baibaipei.com/app/drama/list?oriented=0&category=%E7%8E%84%E5%B9%BB&page={{page}}&pageSize=18&' + hs()},\n        {title:'热血', url:'https://huahua.baibaipei.com/app/drama/list?oriented=0&category=%E7%83%AD%E8%A1%80&page={{page}}&pageSize=18&' + hs()},\n        {title:'动作', url:'https://huahua.baibaipei.com/app/drama/list?oriented=0&category=%E5%8A%A8%E4%BD%9C&page={{page}}&pageSize=18&' + hs()},\n        {title:'历史', url:'https://huahua.baibaipei.com/app/drama/list?oriented=0&category=%E5%8E%86%E5%8F%B2&page={{page}}&pageSize=18&' + hs()},\n        {title:'军事', url:'https://huahua.baibaipei.com/app/drama/list?oriented=0&category=%E5%86%9B%E4%BA%8B&page={{page}}&pageSize=18&' + hs()},\n        {title:'二次元', url:'https://huahua.baibaipei.com/app/drama/list?oriented=0&category=%E4%BA%8C%E6%AC%A1%E5%85%83&page={{page}}&pageSize=18&' + hs()}\n    ];\n\n    var ui = [];\n\n    ui.push({title:'关键字', type:'text', default:'', style:{layout_flexBasisPercent:70, layout_flexGrow:1}});\n    ui.push({title:'🔍搜索', type:'button', action:\"var k=infoMap['关键字']; if(!k){java.toast('请输入关键字');} else {java.searchBook(k, source);}\", style:{layout_flexBasisPercent:30, layout_flexGrow:1}});\n\n    for (var i = 0; i < cats.length; i++) {\n        ui.push({title:cats[i].title, url:cats[i].url, style:{layout_flexBasisPercent:50, layout_flexGrow:0.35}});\n    }\n\n    return JSON.stringify(ui);\n})()", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36 Chrome/150.0.0.0 Mobile Safari/537.36\",\"platform\":\"android\",\"versionName\":\"1.0.2\",\"versionCode\":\"3\",\"Accept\":\"application/json\",\"Accept-Charset\":\"UTF-8\"}", "jsLib": "var _S='cCEJrpiwQx0wP!p1Hao';\nfunction _hc(s){var h=0;for(var i=0;i<s.length;i++){h=((31*h)+s.charCodeAt(i))|0;}return h;}\nvar _BC='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nfunction _b64e(n){var s=String(n),r='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i),b=i+1<s.length?s.charCodeAt(i+1):0,c=i+2<s.length?s.charCodeAt(i+2):0;var t=(a<<16)|((i+1<s.length?b:0)<<8)|((i+2<s.length?c:0));r+=_BC[(t>>18)&63]+_BC[(t>>12)&63]+_BC[(t>>6)&63]+_BC[t&63];}var p=s.length%3;if(p==1)r=r.slice(0,-2)+'==';else if(p==2)r=r.slice(0,-1)+'=';return r;}\nfunction _b64d(s){var o=[],i,a,b,d,f,c=_BC;for(i=0;i<s.length;i+=4){a=c.indexOf(s.charAt(i));b=c.indexOf(s.charAt(i+1));d=c.indexOf(s.charAt(i+2));f=c.indexOf(s.charAt(i+3));if(a<0||b<0)continue;o.push((a<<2)|(b>>4));if(d>=0)o.push(((b&15)<<4)|(d>>2));if(f>=0)o.push(((d&3)<<6)|f);}return o;}\nvar _SB=[0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76,0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0,0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15,0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75,0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84,0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf,0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8,0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2,0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73,0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb,0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79,0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08,0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a,0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e,0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf,0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16];\nvar _ISB=[0x52,0x09,0x6a,0xd5,0x30,0x36,0xa5,0x38,0xbf,0x40,0xa3,0x9e,0x81,0xf3,0xd7,0xfb,0x7c,0xe3,0x39,0x82,0x9b,0x2f,0xff,0x87,0x34,0x8e,0x43,0x44,0xc4,0xde,0xe9,0xcb,0x54,0x7b,0x94,0x32,0xa6,0xc2,0x23,0x3d,0xee,0x4c,0x95,0x0b,0x42,0xfa,0xc3,0x4e,0x08,0x2e,0xa1,0x66,0x28,0xd9,0x24,0xb2,0x76,0x5b,0xa2,0x49,0x6d,0x8b,0xd1,0x25,0x72,0xf8,0xf6,0x64,0x86,0x68,0x98,0x16,0xd4,0xa4,0x5c,0xcc,0x5d,0x65,0xb6,0x92,0x6c,0x70,0x48,0x50,0xfd,0xed,0xb9,0xda,0x5e,0x15,0x46,0x57,0xa7,0x8d,0x9d,0x84,0x90,0xd8,0xab,0x00,0x8c,0xbc,0xd3,0x0a,0xf7,0xe4,0x58,0x05,0xb8,0xb3,0x45,0x06,0xd0,0x2c,0x1e,0x8f,0xca,0x3f,0x0f,0x02,0xc1,0xaf,0xbd,0x03,0x01,0x13,0x8a,0x6b,0x3a,0x91,0x11,0x41,0x4f,0x67,0xdc,0xea,0x97,0xf2,0xcf,0xce,0xf0,0xb4,0xe6,0x73,0x96,0xac,0x74,0x22,0xe7,0xad,0x35,0x85,0xe2,0xf9,0x37,0xe8,0x1c,0x75,0xdf,0x6e,0x47,0xf1,0x1a,0x71,0x1d,0x29,0xc5,0x89,0x6f,0xb7,0x62,0x0e,0xaa,0x18,0xbe,0x1b,0xfc,0x56,0x3e,0x4b,0xc6,0xd2,0x79,0x20,0x9a,0xdb,0xc0,0xfe,0x78,0xcd,0x5a,0xf4,0x1f,0xdd,0xa8,0x33,0x88,0x07,0xc7,0x31,0xb1,0x12,0x10,0x59,0x27,0x80,0xec,0x5f,0x60,0x51,0x7f,0xa9,0x19,0xb5,0x4a,0x0d,0x2d,0xe5,0x7a,0x9f,0x93,0xc9,0x9c,0xef,0xa0,0xe0,0x3b,0x4d,0xae,0x2a,0xf5,0xb0,0xc8,0xeb,0xbb,0x3c,0x83,0x53,0x99,0x61,0x17,0x2b,0x04,0x7e,0xba,0x77,0xd6,0x26,0xe1,0x69,0x14,0x63,0x55,0x21,0x0c,0x7d];\nvar _RC=[0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36];\nfunction _xt(a,b){var r=0;while(b){if(b&1)r^=a;var hi=a&0x80;a=((a<<1)&0xff);if(hi)a^=0x1b;b>>=1;}return r;}\nfunction _aesKeyExp(key){var w=[];for(var i=0;i<16;i++)w.push(key[i]);for(i=4;i<44;i++){var t=w.slice((i-1)*4,i*4);if(i%4===0){var t0=t[0];t[0]=t[1];t[1]=t[2];t[2]=t[3];t[3]=t0;for(var j=0;j<4;j++)t[j]=_SB[t[j]];t[0]^=_RC[i/4-1];}for(j=0;j<4;j++)w.push(w[(i-4)*4+j]^t[j]);}return w;}\nfunction _aesDecBlock(c,wk){var s=[],i,r;for(i=0;i<16;i++)s.push(c[i]);function ark(wr){for(i=0;i<16;i++)s[i]^=wk[wr*16+(i&3)+((i>>2)<<2)];}ark(10);for(r=9;r>=1;r--){for(i=1;i<4;i++){var row=[];for(var cc=0;cc<4;cc++)row[cc]=s[i+cc*4];for(cc=0;cc<4;cc++)s[i+cc*4]=row[(cc+4-i)%4];}for(i=0;i<16;i++)s[i]=_ISB[s[i]];ark(r);for(cc=0;cc<4;cc++){var b0=s[0+cc*4],b1=s[1+cc*4],b2=s[2+cc*4],b3=s[3+cc*4];s[0+cc*4]=_xt(b0,14)^_xt(b1,11)^_xt(b2,13)^_xt(b3,9);s[1+cc*4]=_xt(b0,9)^_xt(b1,14)^_xt(b2,11)^_xt(b3,13);s[2+cc*4]=_xt(b0,13)^_xt(b1,9)^_xt(b2,14)^_xt(b3,11);s[3+cc*4]=_xt(b0,11)^_xt(b1,13)^_xt(b2,9)^_xt(b3,14);}}for(i=1;i<4;i++){var row2=[];for(var c2=0;c2<4;c2++)row2[c2]=s[i+c2*4];for(c2=0;c2<4;c2++)s[i+c2*4]=row2[(c2+4-i)%4];}for(i=0;i<16;i++)s[i]=_ISB[s[i]];ark(0);var out=[];for(i=0;i<16;i++)out.push(s[i]);return out;}\nfunction _aesCbcDec(ct,key,iv){var wk=_aesKeyExp(key);var out=[],prev=iv,i;for(i=0;i<ct.length;i+=16){var dec=_aesDecBlock(ct.slice(i,i+16),wk);for(var j=0;j<16;j++){out.push(dec[j]^prev[j]);}prev=ct.slice(i,i+16);}var p=out[out.length-1];if(p>=1&&p<=16)out=out.slice(0,out.length-p);return out;}\nfunction _u8d(a){var s='',i=0;while(i<a.length){var c=a[i];if(c<128){s+=String.fromCharCode(c);i++;}else if(c<224){s+=String.fromCharCode(((c&31)<<6)|(a[i+1]&63));i+=2;}else if(c<240){s+=String.fromCharCode(((c&15)<<12)|((a[i+1]&63)<<6)|(a[i+2]&63));i+=3;}else{var cp=((c&7)<<18)|((a[i+1]&63)<<12)|((a[i+2]&63)<<6)|(a[i+3]&63);cp-=0x10000;s+=String.fromCharCode(0xD800+(cp>>10),0xDC00+(cp&1023));i+=4;}}return s;}\nfunction hs(){var ts=String(Math.floor(Date.now()/1000));var nc='abcdefghijklmnopqrstuvwxyz',nn='';for(var i=0;i<16;i++)nn+=nc[Math.floor(Math.random()*nc.length)];var j='nonce='+nn+'&timestamp='+ts;return 'nonce='+nn+'&timestamp='+ts+'&signature='+encodeURIComponent(_b64e(_hc(j+_S)));}\nfunction decryptAES(enc){var s=String(enc).replace(/[^A-Za-z0-9+/=]/g,'');if(!s||s.length<32)return '{}';try{var b=_b64d(s);if(!b||b.length<32)return '{}';var KEY=[],ks='fcPD@Sdbmn&B4B@o',i;for(i=0;i<16;i++)KEY.push(ks.charCodeAt(i));return _u8d(_aesCbcDec(b.slice(16),KEY,b.slice(0,16)));}catch(e){return '{}';}}\n// ============ DJX 纯JS密码学库（jsLib将内嵌此代码，ES5兼容Rhino） ============\n// MD5\nvar _MD5HEX='0123456789abcdef';\nfunction _md5(s){\n  function rotl(x,c){return (x<<c)|(x>>>(32-c));}\n  function add(x,y){var l=(x&0xffff)+(y&0xffff),m=(x>>16)+(y>>16)+(l>>16);return (m<<16)|(l&0xffff);}\n  function toBytes(str){\n    var out=[],p=0;\n    for(var i=0;i<str.length;i++){\n      var c=str.charCodeAt(i);\n      if(c<128){out[p++]=c;}\n      else if(c<2048){out[p++]=0xc0|(c>>6);out[p++]=0x80|(c&63);}\n      else if(c<55296||c>=57344){out[p++]=0xe0|(c>>12);out[p++]=0x80|((c>>6)&63);out[p++]=0x80|(c&63);}\n      else{i++;var c2=str.charCodeAt(i);c=0x10000+(((c&0x3ff)<<10)|(c2&0x3ff));\n        out[p++]=0xf0|(c>>18);out[p++]=0x80|((c>>12)&63);out[p++]=0x80|((c>>6)&63);out[p++]=0x80|(c&63);}\n    }\n    return out;\n  }\n  var bytes=toBytes(s),len=bytes.length,bitLen=len*8;\n  bytes.push(0x80);\n  while(bytes.length%64!==56)bytes.push(0);\n  var _lo=bitLen>>>0,_hi=Math.floor(bitLen/4294967296);\n  for(var i=0;i<4;i++)bytes.push((_lo>>>(i*8))&0xff);\n  for(var i=0;i<4;i++)bytes.push((_hi>>>(i*8))&0xff);\n  var a0=0x67452301,b0=0xefcdab89,c0=0x98badcfe,d0=0x10325476;\n  var K=[0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40821,0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a,0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391];\n  var S=[7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21];\n  for(var off=0;off<bytes.length;off+=64){\n    var M=[];\n    for(var i=0;i<16;i++){M[i]=bytes[off+i*4]|(bytes[off+i*4+1]<<8)|(bytes[off+i*4+2]<<16)|(bytes[off+i*4+3]<<24);}\n    var A=a0,B=b0,C=c0,D=d0;\n    for(var i=0;i<64;i++){\n      var F,g;\n      if(i<16){F=(B&C)|(~B&D);g=i;}\n      else if(i<32){F=(D&B)|(~D&C);g=(5*i+1)%16;}\n      else if(i<48){F=B^C^D;g=(3*i+5)%16;}\n      else{F=C^(B|~D);g=(7*i)%16;}\n      var tmp=D;D=C;C=B;\n      B=add(B,rotl(add(add(A,F),add(K[i],M[g])),S[i]));\n      A=tmp;\n    }\n    a0=add(a0,A);b0=add(b0,B);c0=add(c0,C);d0=add(d0,D);\n  }\n  function h(n){var s='';for(var i=0;i<4;i++){s+=_MD5HEX[(n>>(8*i+4))&15]+_MD5HEX[(n>>(8*i))&15];}return s;}\n  return h(a0)+h(b0)+h(c0)+h(d0);\n}\n// SHA-256\nvar _K256=[0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2];\nfunction _sha256(s){\n  function rotr(x,n){return (x>>>n)|(x<<(32-n));}\n  var h0=0x6a09e667,h1=0xbb67ae85,h2=0x3c6ef372,h3=0xa54ff53a,h4=0x510e527f,h5=0x9b05688c,h6=0x1f83d9ab,h7=0x5be0cd19;\n  var bytes=[];\n  for(var i=0;i<s.length;i++){\n    var c=s.charCodeAt(i);\n    if(c<128)bytes.push(c);\n    else if(c<2048){bytes.push(0xc0|(c>>6),0x80|(c&63));}\n    else if(c<55296||c>=57344){bytes.push(0xe0|(c>>12),0x80|((c>>6)&63),0x80|(c&63));}\n    else{i++;var c2=s.charCodeAt(i);var cp=0x10000+(((c&0x3ff)<<10)|(c2&0x3ff));bytes.push(0xf0|(cp>>18),0x80|((cp>>12)&63),0x80|((cp>>6)&63),0x80|(cp&63));}\n  }\n  var bitLen=bytes.length*8;\n  bytes.push(0x80);\n  while(bytes.length%64!==56)bytes.push(0);\n  var _lo=bitLen>>>0,_hi=Math.floor(bitLen/4294967296);\n  for(var i=0;i<4;i++)bytes.push((_hi>>>(24-i*8))&0xff);\n  for(var i=0;i<4;i++)bytes.push((_lo>>>(24-i*8))&0xff);\n  for(var off=0;off<bytes.length;off+=64){\n    var w=[];\n    for(var i=0;i<16;i++)w[i]=(bytes[off+i*4]<<24)|(bytes[off+i*4+1]<<16)|(bytes[off+i*4+2]<<8)|bytes[off+i*4+3];\n    for(var i=16;i<64;i++){\n      var s0=rotr(w[i-15],7)^rotr(w[i-15],18)^(w[i-15]>>>3);\n      var s1=rotr(w[i-2],17)^rotr(w[i-2],19)^(w[i-2]>>>10);\n      w[i]=(w[i-16]+s0+w[i-7]+s1)|0;\n    }\n    var a=h0,b=h1,c=h2,d=h3,e=h4,f=h5,g=h6,hh=h7;\n    for(var i=0;i<64;i++){\n      var S1=rotr(e,6)^rotr(e,11)^rotr(e,25);\n      var ch=(e&f)^(~e&g);\n      var t1=(hh+S1+ch+_K256[i]+w[i])|0;\n      var S0=rotr(a,2)^rotr(a,13)^rotr(a,22);\n      var maj=(a&b)^(a&c)^(b&c);\n      var t2=(S0+maj)|0;\n      hh=g;g=f;f=e;e=(d+t1)|0;d=c;c=b;b=a;a=(t1+t2)|0;\n    }\n    h0=(h0+a)|0;h1=(h1+b)|0;h2=(h2+c)|0;h3=(h3+d)|0;h4=(h4+e)|0;h5=(h5+f)|0;h6=(h6+g)|0;h7=(h7+hh)|0;\n  }\n  function w32(n){var s='';for(var i=3;i>=0;i--){var b=(n>>>(i*8))&0xff;s+=(b<16?'0':'')+b.toString(16);}return s;}\n  return w32(h0)+w32(h1)+w32(h2)+w32(h3)+w32(h4)+w32(h5)+w32(h6)+w32(h7);\n}\nfunction _hmacSha256(key,msg){\n  var k=[];for(var i=0;i<key.length;i++)k.push(key.charCodeAt(i)&0xff);\n  if(k.length>64){var kh=_sha256(key);for(var i=0;i<32;i++)k.push(parseInt(kh.substr(i*2,2),16));k=k.slice(32);}\n  while(k.length<64)k.push(0);\n  var ipad=[],opad=[];\n  for(var i=0;i<64;i++){ipad[i]=k[i]^0x36;opad[i]=k[i]^0x5c;}\n  var ib=[];for(var i=0;i<64;i++)ib.push(ipad[i]);\n  for(var i=0;i<msg.length;i++)ib.push(msg.charCodeAt(i)&0xff);\n  var inner=_sha256Bytes(ib);\n  var ob=[];for(var i=0;i<64;i++)ob.push(opad[i]);\n  for(var i=0;i<inner.length;i++)ob.push(inner[i]);\n  return _sha256Bytes(ob);\n}\nfunction _sha256Bytes(bytes){\n  function rotr(x,n){return (x>>>n)|(x<<(32-n));}\n  var h0=0x6a09e667,h1=0xbb67ae85,h2=0x3c6ef372,h3=0xa54ff53a,h4=0x510e527f,h5=0x9b05688c,h6=0x1f83d9ab,h7=0x5be0cd19;\n  var bitLen=bytes.length*8;\n  bytes=bytes.slice();bytes.push(0x80);\n  while(bytes.length%64!==56)bytes.push(0);\n  var _lo=bitLen>>>0,_hi=Math.floor(bitLen/4294967296);\n  for(var i=0;i<4;i++)bytes.push((_hi>>>(24-i*8))&0xff);\n  for(var i=0;i<4;i++)bytes.push((_lo>>>(24-i*8))&0xff);\n  for(var off=0;off<bytes.length;off+=64){\n    var w=[];\n    for(var i=0;i<16;i++)w[i]=(bytes[off+i*4]<<24)|(bytes[off+i*4+1]<<16)|(bytes[off+i*4+2]<<8)|bytes[off+i*4+3];\n    for(var i=16;i<64;i++){\n      var s0=rotr(w[i-15],7)^rotr(w[i-15],18)^(w[i-15]>>>3);\n      var s1=rotr(w[i-2],17)^rotr(w[i-2],19)^(w[i-2]>>>10);\n      w[i]=(w[i-16]+s0+w[i-7]+s1)|0;\n    }\n    var a=h0,b=h1,c=h2,d=h3,e=h4,f=h5,g=h6,hh=h7;\n    for(var i=0;i<64;i++){\n      var S1=rotr(e,6)^rotr(e,11)^rotr(e,25);\n      var ch=(e&f)^(~e&g);\n      var t1=(hh+S1+ch+_K256[i]+w[i])|0;\n      var S0=rotr(a,2)^rotr(a,13)^rotr(a,22);\n      var maj=(a&b)^(a&c)^(b&c);\n      var t2=(S0+maj)|0;\n      hh=g;g=f;f=e;e=(d+t1)|0;d=c;c=b;b=a;a=(t1+t2)|0;\n    }\n    h0=(h0+a)|0;h1=(h1+b)|0;h2=(h2+c)|0;h3=(h3+d)|0;h4=(h4+e)|0;h5=(h5+f)|0;h6=(h6+g)|0;h7=(h7+hh)|0;\n  }\n  function w32(n){return [((n>>>24)&0xff),((n>>>16)&0xff),((n>>>8)&0xff),(n&0xff)];}\n  return w32(h0).concat(w32(h1),w32(h2),w32(h3),w32(h4),w32(h5),w32(h6),w32(h7));\n}\nfunction _hmacSha256Hex(key,msg){\n  var b=_hmacSha256(key,msg),h='';\n  for(var i=0;i<b.length;i++){h+=(b[i]<16?'0':'')+b[i].toString(16);}\n  return h;\n}\n// 字节工具\nfunction _str2bytes(s){var out=[],p=0;for(var i=0;i<s.length;i++){var c=s.charCodeAt(i);if(c<128)out[p++]=c;else if(c<2048){out[p++]=0xc0|(c>>6);out[p++]=0x80|(c&63);}else if(c<55296||c>=57344){out[p++]=0xe0|(c>>12);out[p++]=0x80|((c>>6)&63);out[p++]=0x80|(c&63);}else{i++;var c2=s.charCodeAt(i);var cp=0x10000+(((c&0x3ff)<<10)|(c2&0x3ff));out[p++]=0xf0|(cp>>18);out[p++]=0x80|((cp>>12)&63);out[p++]=0x80|((cp>>6)&63);out[p++]=0x80|(cp&63);}}return out;}\nfunction _b64eBytes(b){var BC='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',r='';for(var i=0;i<b.length;i+=3){var a=b[i],c1=i+1<b.length?b[i+1]:0,c2=i+2<b.length?b[i+2]:0;r+=BC[a>>2]+BC[((a&3)<<4)|(c1>>4)]+BC[((c1&15)<<2)|(c2>>6)]+BC[c2&63];}var p=b.length%3;if(p===1)r=r.slice(0,-2)+'==';else if(p===2)r=r.slice(0,-1)+'=';return r;}\n// AES-128-ECB 加密（复用jsLib已有S盒/密钥扩展，此处独立实现保证自洽）\nvar _SBX=[0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76,0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0,0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15,0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75,0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84,0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf,0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8,0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2,0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73,0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb,0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79,0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08,0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a,0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e,0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf,0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16];\nfunction _aesKeyExp2(key){var w=[];for(var i=0;i<16;i++)w.push(key[i]);var RC=[0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36];for(var i=4;i<44;i++){var t=w.slice((i-1)*4,i*4);if(i%4===0){var t0=t[0];t[0]=t[1];t[1]=t[2];t[2]=t[3];t[3]=t0;for(var j=0;j<4;j++)t[j]=_SBX[t[j]];t[0]^=RC[i/4-1];}for(var j=0;j<4;j++)w.push(w[(i-4)*4+j]^t[j]);}return w;}\nfunction _gm(a,b){var r=0;while(b){if(b&1)r^=a;var hi=a&0x80;a=((a<<1)&0xff);if(hi)a^=0x1b;b>>=1;}return r;}\n// GF(2^8) 乘法查表（消除循环，Rhino 下提速 2-3 倍）\nvar _G2=[],_G3=[],_G9=[],_GB=[],_GD=[],_GE=[];\nfor(var _gi=0;_gi<256;_gi++){_G2[_gi]=_gm(_gi,2);_G3[_gi]=_gm(_gi,3);_G9[_gi]=_gm(_gi,9);_GB[_gi]=_gm(_gi,11);_GD[_gi]=_gm(_gi,13);_GE[_gi]=_gm(_gi,14);}\nfunction _aesEncBlock(p,wk){\n  var s=p.slice(),i,r;\n  function ark(wr){for(i=0;i<16;i++)s[i]^=wk[wr*16+i];}\n  ark(0);\n  for(r=1;r<=9;r++){\n    for(i=0;i<16;i++)s[i]=_SBX[s[i]];\n    for(i=1;i<4;i++){var row=[];for(var cc=0;cc<4;cc++)row[cc]=s[i+cc*4];for(cc=0;cc<4;cc++)s[i+cc*4]=row[(cc+i)%4];}\n    for(cc=0;cc<4;cc++){var b0=s[0+cc*4],b1=s[1+cc*4],b2=s[2+cc*4],b3=s[3+cc*4];\n      s[0+cc*4]=_G2[b0]^_G3[b1]^b2^b3;\n      s[1+cc*4]=b0^_G2[b1]^_G3[b2]^b3;\n      s[2+cc*4]=b0^b1^_G2[b2]^_G3[b3];\n      s[3+cc*4]=_G3[b0]^b1^b2^_G2[b3];}\n    ark(r);\n  }\n  for(i=0;i<16;i++)s[i]=_SBX[s[i]];\n  for(i=1;i<4;i++){var row2=[];for(var c2=0;c2<4;c2++)row2[c2]=s[i+c2*4];for(c2=0;c2<4;c2++)s[i+c2*4]=row2[(c2+i)%4];}\n  ark(10);\n  return s;\n}\nfunction _aesEcbEnc(plain,key){\n  var pad=16-(plain.length%16),padded=plain.slice();\n  for(var i=0;i<pad;i++)padded.push(pad);\n  var wk=_aesKeyExp2(key),out=[];\n  for(var i=0;i<padded.length;i+=16){var blk=_aesEncBlock(padded.slice(i,i+16),wk);for(var j=0;j<16;j++)out.push(blk[j]);}\n  return out;\n}\n// AES-128-ECB 解密（独立实现，供响应解密；PKCS5去填充）\nvar _ISBX=[0x52,0x09,0x6a,0xd5,0x30,0x36,0xa5,0x38,0xbf,0x40,0xa3,0x9e,0x81,0xf3,0xd7,0xfb,0x7c,0xe3,0x39,0x82,0x9b,0x2f,0xff,0x87,0x34,0x8e,0x43,0x44,0xc4,0xde,0xe9,0xcb,0x54,0x7b,0x94,0x32,0xa6,0xc2,0x23,0x3d,0xee,0x4c,0x95,0x0b,0x42,0xfa,0xc3,0x4e,0x08,0x2e,0xa1,0x66,0x28,0xd9,0x24,0xb2,0x76,0x5b,0xa2,0x49,0x6d,0x8b,0xd1,0x25,0x72,0xf8,0xf6,0x64,0x86,0x68,0x98,0x16,0xd4,0xa4,0x5c,0xcc,0x5d,0x65,0xb6,0x92,0x6c,0x70,0x48,0x50,0xfd,0xed,0xb9,0xda,0x5e,0x15,0x46,0x57,0xa7,0x8d,0x9d,0x84,0x90,0xd8,0xab,0x00,0x8c,0xbc,0xd3,0x0a,0xf7,0xe4,0x58,0x05,0xb8,0xb3,0x45,0x06,0xd0,0x2c,0x1e,0x8f,0xca,0x3f,0x0f,0x02,0xc1,0xaf,0xbd,0x03,0x01,0x13,0x8a,0x6b,0x3a,0x91,0x11,0x41,0x4f,0x67,0xdc,0xea,0x97,0xf2,0xcf,0xce,0xf0,0xb4,0xe6,0x73,0x96,0xac,0x74,0x22,0xe7,0xad,0x35,0x85,0xe2,0xf9,0x37,0xe8,0x1c,0x75,0xdf,0x6e,0x47,0xf1,0x1a,0x71,0x1d,0x29,0xc5,0x89,0x6f,0xb7,0x62,0x0e,0xaa,0x18,0xbe,0x1b,0xfc,0x56,0x3e,0x4b,0xc6,0xd2,0x79,0x20,0x9a,0xdb,0xc0,0xfe,0x78,0xcd,0x5a,0xf4,0x1f,0xdd,0xa8,0x33,0x88,0x07,0xc7,0x31,0xb1,0x12,0x10,0x59,0x27,0x80,0xec,0x5f,0x60,0x51,0x7f,0xa9,0x19,0xb5,0x4a,0x0d,0x2d,0xe5,0x7a,0x9f,0x93,0xc9,0x9c,0xef,0xa0,0xe0,0x3b,0x4d,0xae,0x2a,0xf5,0xb0,0xc8,0xeb,0xbb,0x3c,0x83,0x53,0x99,0x61,0x17,0x2b,0x04,0x7e,0xba,0x77,0xd6,0x26,0xe1,0x69,0x14,0x63,0x55,0x21,0x0c,0x7d];\nfunction _aesDecBlockE(c,wk){\n  var s=c.slice(),i,r;\n  function ark(wr){for(i=0;i<16;i++)s[i]^=wk[wr*16+i];}\n  ark(10);\n  for(r=9;r>=1;r--){\n    for(i=1;i<4;i++){var row=[];for(var cc=0;cc<4;cc++)row[cc]=s[i+cc*4];for(cc=0;cc<4;cc++)s[i+cc*4]=row[(cc+4-i)%4];}\n    for(i=0;i<16;i++)s[i]=_ISBX[s[i]];\n    ark(r);\n    for(cc=0;cc<4;cc++){var b0=s[0+cc*4],b1=s[1+cc*4],b2=s[2+cc*4],b3=s[3+cc*4];\n      s[0+cc*4]=_GE[b0]^_GB[b1]^_GD[b2]^_G9[b3];\n      s[1+cc*4]=_G9[b0]^_GE[b1]^_GB[b2]^_GD[b3];\n      s[2+cc*4]=_GD[b0]^_G9[b1]^_GE[b2]^_GB[b3];\n      s[3+cc*4]=_GB[b0]^_GD[b1]^_G9[b2]^_GE[b3];}\n  }\n  for(i=1;i<4;i++){var row2=[];for(var c2=0;c2<4;c2++)row2[c2]=s[i+c2*4];for(c2=0;c2<4;c2++)s[i+c2*4]=row2[(c2+4-i)%4];}\n  for(i=0;i<16;i++)s[i]=_ISBX[s[i]];\n  ark(0);\n  return s;\n}\nfunction _aesEcbDec(ct,key){\n  var wk=_aesKeyExp2(key),out=[];\n  for(var i=0;i<ct.length;i+=16){var blk=_aesDecBlockE(ct.slice(i,i+16),wk);for(var j=0;j<16;j++)out.push(blk[j]);}\n  var p=out[out.length-1];\n  if(p>=1&&p<=16&&out.length>=p){var ok=true;for(var i=1;i<=p;i++){if(out[out.length-i]!==p){ok=false;break;}}if(ok)out=out.slice(0,out.length-p);}\n  return out;\n}\nfunction _b64dBytes(s){var o=[],BC='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',i,a,b,d,f;for(i=0;i<s.length;i+=4){a=BC.indexOf(s.charAt(i));b=BC.indexOf(s.charAt(i+1));d=BC.indexOf(s.charAt(i+2));f=BC.indexOf(s.charAt(i+3));if(a<0||b<0)continue;o.push((a<<2)|(b>>4));if(d>=0)o.push(((b&15)<<4)|(d>>2));if(f>=0)o.push(((d&3)<<6)|f);}return o;}\nfunction _u8ds(a){var s='',i=0;while(i<a.length){var c=a[i];if(c<128){s+=String.fromCharCode(c);i++;}else if(c<224){s+=String.fromCharCode(((c&31)<<6)|(a[i+1]&63));i+=2;}else if(c<240){s+=String.fromCharCode(((c&15)<<12)|((a[i+1]&63)<<6)|(a[i+2]&63));i+=3;}else{var cp=((c&7)<<18)|((a[i+1]&63)<<12)|((a[i+2]&63)<<6)|(a[i+3]&63);cp-=0x10000;s+=String.fromCharCode(0xD800+(cp>>10),0xDC00+(cp&1023));i+=4;}}return s;}\n// ============ DJX RPC 封装 ============\nvar DJX_KEY_D='70ca849663aba96aa08f82272cedd0b4';\nvar DJX_UA='Mozilla/5.0 (Linux; Android 13; M2012K11AG Build/TKQ1.221114.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/150.0.7871.181 Mobile Safari/537.36 okhttp/3.9.1 djxsdk/2.9.0.5';\n// 固定设备身份（同一 sdk_did 注册返回同一 token，幂等）\nvar DJX_SDID='a'+_md5(DJX_KEY_D+'sdkdid').substring(0,16);\nvar DJX_UID='bddid_'+_md5(DJX_KEY_D+'uuid').substring(0,20);\n// 运行时自动注册的 token（过期由 _djxRpc 检测并重注册）\nvar DJX_TOKEN='';\nvar DJX_COMMON='siteid=5623562&dev_log_aid=664072&uuid='+DJX_UID+'&uuid_type=bddid&vod_version=0.0.0.0&dp_sdk_version=0.0.0.0&sdk_version=2.9.0.5&type=2&dt=M2012K11AG&os=Android&partner=pangle_664072&package_name=com.xin.huahua';\nfunction _djxCall(path,biz,tk){\n  var hexs='0123456789ABCDEF',aln='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',salt='',nonce='';\n  for(var i=0;i<9;i++)salt+=hexs[Math.floor(Math.random()*16)];\n  for(i=0;i<16;i++)nonce+=aln[Math.floor(Math.random()*aln.length)];\n  var ts=String(Math.floor(Date.now()/1000));\n  var form=biz+'&'+DJX_COMMON;\n  var keyhex=_md5(DJX_KEY_D+salt).substring(0,16);\n  var key=[];for(var i=0;i<16;i++)key.push(keyhex.charCodeAt(i));\n  var body=_b64eBytes(_aesEcbEnc(_str2bytes(form),key));\n  var sig=_hmacSha256Hex(DJX_KEY_D,ts+nonce+form);\n  var url='https://csj-sp.csjdeveloper.com/csj_sp/api/v1'+path+'?siteid=5623562';\n  var headers={'X-Salt':salt,'X-Nonce':nonce,'X-Timestamp':ts,'X-Signature':sig,'Content-Type':'application/x-www-form-urlencoded; charset=utf-8','User-Agent':DJX_UA};\n  if(tk)headers['X-Access-Token']=tk;\n  var resp=_httpPost(url,body,headers);\n  var dec=_aesEcbDec(_b64dBytes(resp),key);\n  return JSON.parse(_u8ds(dec));\n}\n// 注册/刷新 token（user/login 同加密链路，无 token 头；幂等）\nfunction _djxReg(){\n  var r=_djxCall('/user/login','sdk_did='+DJX_SDID);\n  if(r&&r.data&&r.data.access_token)DJX_TOKEN=r.data.access_token;\n  return DJX_TOKEN;\n}\n// 主入口：懒注册 + token 失效自动重注册重试\nfunction _djxRpc(path,biz){\n  if(!DJX_TOKEN)_djxReg();\n  var o=_djxCall(path,biz,DJX_TOKEN);\n  if(o&&o.ret!==0&&o.msg&&(o.msg.indexOf('access_token')>=0||o.msg.indexOf('token')>=0)){\n    _djxReg();\n    o=_djxCall(path,biz,DJX_TOKEN);\n  }\n  return o;\n}\n// 自动解锁（无广告回调，服务端只验签名；每次最多解锁10集，幂等）\nfunction _djxUnlock(spid,index){\n  return _djxRpc('/pay/ad_unlock','lock_index='+index+'&shortplay_id='+spid+'&lock_free=0&lock_ad=10');\n}\n// 书源运行环境注入：DJX shortplay_id 全局（由 ruleBookInfo.init 赋值）\nvar DJX_SPID=0;\n// 书源版 _httpPost：Rhino 直接 java 互操作，兼容任意 Legado 版本\nfunction _httpPost(url,body,headers){\n  try{\n    var u=new Packages.java.net.URL(url);\n    var conn=u.openConnection();\n    conn.setRequestMethod('POST');\n    conn.setDoOutput(true);\n    conn.setConnectTimeout(8000);\n    conn.setReadTimeout(8000);\n    for(var k in headers)conn.setRequestProperty(k,headers[k]);\n    var os=conn.getOutputStream();\n    var bytes=new Packages.java.lang.String(body).getBytes('UTF-8');\n    os.write(bytes,0,bytes.length);\n    os.flush();os.close();\n    var code=conn.getResponseCode();\n    var is=(code>=200&&code<300)?conn.getInputStream():conn.getErrorStream();\n    var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n    var sb=new Packages.java.lang.StringBuilder();var line;\n    while((line=br.readLine())!==null)sb.append(line);\n    br.close();\n    return String(sb.toString());\n  }catch(e){return '';}\n}\n", "lastUpdateTime": "1788319211276", "respondTime": 180000, "ruleBookInfo": {"coverUrl": "@js:result.data.cover", "init": "@js:var o=JSON.parse(decryptAES(result));DJX_SPID=o&&o.data?Number(o.data.thirdId||0):0;o&&o.data?o:{data:{}}", "intro": "@js:result.data.introduction", "kind": "@js:result.data.categories", "lastChapter": "@js:result.data.total?'共'+result.data.total+'集':''", "name": "@js:result.data.title", "tocUrl": "@js:result.data.id?'https://huahua.baibaipei.com/app/drama/detail?id='+result.data.id+'&thirdId='+String(result.data.thirdId||0)+'&'+hs():''", "wordCount": "@js:result.data.total?String(result.data.total):''"}, "ruleContent": {"content": "@js:var R='';try{var m=chapter.url.match(/(\\d+)\\|(\\d+)\\|([\\w]+)(?:\\|(\\d+))?/);var spid=m[1],eid=m[2],vid=m[3],idx=Number(m[4]||0);var biz='video_id='+vid+'&episode_id='+eid+'&shortplay_id='+spid+'&lock_free=1';var o=_djxRpc('/shortplay/video_model',biz);if(o&&o.ret===10&&idx>0){_djxUnlock(spid,idx);o=_djxRpc('/shortplay/video_model',biz);}var vv=o&&o.data&&o.data.video_model&&o.data.video_model.video_list;if(vv&&vv.video_1&&vv.video_1.main_url){R=_u8ds(_b64dBytes(String(vv.video_1.main_url).replace(/-/g,'+').replace(/_/g,'/')));}else{R='无法获取播放地址：ret='+(o?o.ret:'?')+' msg='+(o?o.msg:'?');}}catch(e){R='播放地址获取异常：'+e.message;}R"}, "ruleExplore": {"bookList": "@js:var o=JSON.parse(decryptAES(result));o&&o.data&&o.data.list?o.data.list:[]", "bookUrl": "@js:'https://huahua.baibaipei.com/app/drama/detail?id='+result.id+'&thirdId='+String(result.thirdId||0)+'&'+hs()", "coverUrl": "@js:result.cover", "intro": "@js:result.introduction", "kind": "@js:result.categories", "lastChapter": "@js:result.subtitle", "name": "@js:result.title"}, "ruleSearch": {"bookList": "@js:var o=JSON.parse(decryptAES(result));o&&o.data&&o.data.list?o.data.list:[]", "bookUrl": "@js:'https://huahua.baibaipei.com/app/drama/detail?id='+result.id+'&thirdId='+String(result.thirdId||0)+'&'+hs()", "coverUrl": "@js:result.cover", "intro": "@js:result.introduction", "kind": "@js:result.categories", "lastChapter": "@js:result.subtitle", "name": "@js:result.title"}, "ruleToc": {"chapterList": "@js:try{var o=JSON.parse(decryptAES(result));var spid=o&&o.data?Number(o.data.thirdId||0):0;var d=_djxRpc('/shortplay/detail','shortplay_id='+spid+'&index=1&count=999&lock_free=1&not_include=0&direction=0');var arr=d&&d.data&&d.data.list?d.data.list:[];for(var i=0;i<arr.length;i++){arr[i]._spid=spid;}if(arr.length===0){arr=[{_spid:spid,_err:'detail ret='+d.ret+' msg='+d.msg,index:0,episode_id:0,vid:'',title:'目录为空:'+(d&&d.msg||'未知')}];}arr}catch(e){[{_spid:0,_err:String(e),index:0,episode_id:0,vid:'',title:'目录加载异常:'+e.message}]}", "chapterName": "@js:result._err?'⚠️'+result.title:'第'+result.index+'集'", "chapterUrl": "@js:'https://huahua.baibaipei.com/#'+result._spid+'|'+String(result.episode_id)+'|'+result.vid+'|'+String(result.index||0)"}, "searchUrl": "<js>'https://huahua.baibaipei.com/app/drama/list?oriented=0&page=1&pageSize=50&title='+encodeURIComponent(key)+'&'+hs()</js>", "weight": 0},{"bookSourceComment": "//梦不觉", "bookSourceGroup": "影视", "bookSourceName": "听小说APP[短剧_官方本地解密]", "bookSourceType": 4, "bookSourceUrl": "APP短剧接口", "customButton": false, "customOrder": 5, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\n(function(){\n    var state = {ch:'男频', ct:'类型', rk:'排行榜'};\n    try { var saved = JSON.parse(source.getVariable()); if(saved && saved.ch) state = saved; } catch(e){}\n    \n    var maleCates = ['都市脑洞','都市玄幻','古风权谋','种田经营','都市日常','奇幻脑洞','历史古代','玄幻仙侠','奇幻仙侠','战神归来'];\n    var femaleCates = ['都市情感','宫斗宅斗','家庭伦理','年代剧','古风言情','奇幻爱情','萌宝','民国爱情','成长创业'];\n    \n    var maleTags = [\n        ['逆袭',20],['神豪',24],['种田经营',65],['爽剧',6],['系统/弹幕',10],\n        ['捞偏门',63],['异能',16],['传承觉醒',47],['悬疑',17],['天下无敌',48],\n        ['大男主',38],['刑侦破案',45],['强者回归',39]\n    ];\n    var femaleTags = [\n        ['读心术',51],['破镜重圆',36],['总裁',8],['反转',26],['都市',15],\n        ['马甲',18],['闪婚',37],['现代',35],['穿书',52],['一见钟情',58],\n        ['年代',1],['女强',12],['宫斗宅斗',31],['萌宝',13],['奇幻脑洞',66],\n        ['青梅竹马',49],['先婚后爱',11],['穿越',4],['亲情',29],['重生',7],\n        ['玄学',46],['大女主',40],['暗恋成真',53],['追妻',28],['甜宠',19],\n        ['奇幻',14],['日久生情',25],['打脸虐渣',21],['欢喜冤家',44]\n    ];\n    \n    var actionJs = \"var s={ch:infoMap['频道']||'男频',ct:infoMap['分类']||'类型',rk:infoMap['排行']||'排行榜'}; source.setVariable(JSON.stringify(s)); java.refreshExplore();\";\n    \n    var cache = {};\n    try { cache = JSON.parse(source.getVariable()); } catch(e){}\n    if (!cache.dev_id) {\n        cache.dev_id = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c){\n            var r = Math.random()*16|0, v = c=='x'?r:(r&0x3|0x8);\n            return v.toString(16);\n        });\n        source.setVariable(JSON.stringify(cache));\n    }\n    var devId = cache.dev_id;\n    var authH = '{\"headers\":{\"publicId\":\"' + devId + '\",\"deviceId\":\"' + devId + '\",\"m2\":\"' + devId + '\"}}';\n    \n    var ui = [];\n    ui.push({title:'频道', type:'select', chars:['男频','女频'], default:state.ch, action:actionJs, style:{layout_flexBasisPercent:1}});\n    ui.push({title:'分类', type:'select', chars:['类型','剧情'], default:state.ct, action:actionJs, style:{layout_flexBasisPercent:1}});\n    ui.push({title:'排行', type:'select', chars:['排行榜','推荐','最新'], default:state.rk, action:actionJs, style:{layout_flexBasisPercent:1}});\n    ui.push({title:'关键字', type:'text', default:'', style:{layout_flexBasisPercent:1}});\n    ui.push({title:'搜短剧', type:'button', action:\"var k=infoMap['关键字']; if(!k){ java.toast('请输入关键字'); } else { java.searchBook(k, source); }\", style:{layout_flexBasisPercent:1}});\n    \n    // 排行链接（根据rk状态高亮对应项）\n    ui.push({title:'排行榜', url:'https://ts3.txs12.com/playlet/rank', style:{layout_flexGrow:1, layout_flexBasisPercent:0.33}});\n    ui.push({title:'推荐', url:'https://ts3.txs12.com/playlet/list-video, ' + authH, style:{layout_flexGrow:1, layout_flexBasisPercent:0.33}});\n    ui.push({title:'最新', url:'https://ts3.txs12.com/playlet/video/new, ' + authH, style:{layout_flexGrow:1, layout_flexBasisPercent:0.33}});\n    \n    if (state.ct === '类型') {\n        // 分类名称 → 按钮触发搜索\n        var cates = (state.ch === '男频') ? maleCates : femaleCates;\n        for (var i = 0; i < cates.length; i++) {\n            var cat = cates[i];\n            ui.push({title:cat, type:'button', action:\"java.searchBook('\" + cat + \"', source)\", style:{layout_flexGrow:1, layout_flexBasisPercent:0.33}});\n        }\n    } else {\n        // 剧情标签 → 跳转标签页\n        var tags = (state.ch === '男频') ? maleTags : femaleTags;\n        for (var i = 0; i < tags.length; i++) {\n            var t = tags[i];\n            ui.push({title:t[0], url:'https://ts3.txs12.com/playlet/tags/' + t[1], style:{layout_flexGrow:1, layout_flexBasisPercent:0.25}});\n        }\n    }\n    \n    return JSON.stringify(ui);\n})()", "header": "{\"User-Agent\":\"okhttp/5.3.2\",\"appName\":\"com.listenxs.txsplayer\",\"vc\":\"521430\",\"vn\":\"1.4.3\",\"channel\":\"defChannel\",\"language\":\"zh-CN\",\"country\":\"CN\",\"netType\":\"1\",\"Gender\":\"male\",\"gpStore\":\"true\"}", "lastUpdateTime": "1788319568329", "respondTime": 180000, "ruleBookInfo": {"author": "$.data.actor", "coverUrl": "$.data.faceImg", "intro": "$.data.description", "kind": "{{$.data.classify}},{{$.data.tags}}", "lastChapter": "{{$.data.video_count}}集", "name": "$.data.title", "tocUrl": "@js:\n(function(){\n    return String(baseUrl);\n})()", "wordCount": "评分:{{$.data.score}}"}, "ruleContent": {"content": "@js:\n(function(){\n    try {\n        var data = JSON.parse(result);\n        if (data.code === 0 && data.data && data.data.length > 0) {\n            return data.data[0].url;\n        }\n    } catch(e) {}\n    return result;\n})()"}, "ruleExplore": {"author": "$.actor", "bookList": "@js:\n(function(){\n    try {\n        var data = JSON.parse(result);\n        if (data.data && Array.isArray(data.data)) return data.data;\n        if (data.data && data.data.rankings) return data.data.rankings;\n        if (data.data && data.data.dramas) return data.data.dramas;\n        if (data.data && data.data.recommendations) return data.data.recommendations;\n    } catch(e) {}\n    return [];\n})()", "bookUrl": "@js:\n(function(){\n    var item = result;\n    var id = item.id || '';\n    return 'https://ts3.txs12.com/playlet/video/' + id + '/info';\n})()", "coverUrl": "$.faceImg", "intro": "$.description", "kind": "@js:\n(function(){\n    var parts = [];\n    if (result.score) parts.push('评分:' + result.score);\n    if (result.rank) parts.push('第' + result.rank + '名');\n    if (result.video_count) parts.push(result.video_count + '集');\n    if (result.tags) parts.push(result.tags.join(','));\n    return parts.join(',');\n})()", "lastChapter": "@js:\n(function(){\n    if (result.video_count) return result.video_count + '集';\n    if (result.classify) return result.classify.join(',');\n    return '';\n})()", "name": "$.title"}, "ruleSearch": {"author": "$.actor", "bookList": "$.data.results", "bookUrl": "@js:\n(function(){\n    var item = result;\n    var id = item.id || '';\n    return 'https://ts3.txs12.com/playlet/video/' + id + '/info';\n})()", "coverUrl": "$.faceImg", "intro": "$.description", "kind": "@js:\n(function(){\n    var parts = [];\n    if (result.score) parts.push('评分:' + result.score);\n    if (result.video_count) parts.push(result.video_count + '集');\n    if (result.tags) parts.push(result.tags.join(','));\n    return parts.join(',');\n})()", "lastChapter": "@js:\n(function(){\n    if (result.video_count) return result.video_count + '集';\n    if (result.classify) return result.classify.join(',');\n    return '';\n})()", "name": "$.title"}, "ruleToc": {"chapterList": "$.data.items", "chapterName": "$.title", "chapterUrl": "@js:\n(function(){\n    var m = String(baseUrl).match(/playlet\\/video\\/([^\\/]+)/);\n    var vid = m ? m[1] : '';\n    var eid = java.getString('$.episode_id') || '';\n    if (!vid || !eid) return '';\n    return 'https://ts3.txs12.com/playlet/video/' + vid + '/items, {\\\"method\\\":\\\"POST\\\",\\\"body\\\":{\\\"video_ids\\\":[\\\"' + eid + '\\\"]}}';\n})()", "isVolume": "false", "updateTime": "$.utime"}, "searchUrl": "https://ts3.txs12.com/playlet/search-video?keyword={{key}}&page={{page}}&size=20", "weight": 0},{"bookSourceComment": "//梦不觉", "bookSourceGroup": "小说", "bookSourceName": "听小说APP[小说_官方本地解密]", "bookSourceType": 0, "bookSourceUrl": "APP小说接口", "customButton": false, "customOrder": 6, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\n(function(){\n    var state = {c:'男频', t:'分类', s:'热播'};\n    try { var saved = JSON.parse(source.getVariable()); if(saved && saved.c) state = saved; } catch(e){}\n    \n    var sortMap = {'热播':'hotplay','评分':'score','完本':'endxs','新书':'newxs','人气':'updatexs'};\n    var channelMap = {'男频':0,'女频':1};\n    \n    var dict = {\n        '男频': {\n            '分类': '玄幻,奇幻,仙侠,武侠,灵异,科幻,职场,都市,游戏,竞技,历史,军事,同人,其他,轻小说'.split(','),\n            '题材': '装备,赚钱,轮回,重生,种田,治愈,直播,征战,征服,争斗,战争,缘分,游戏,阴阳,异世,异能,异界,医术,妖魔,血脉,悬疑,虚拟,修炼,兄弟,星辰,信仰,邪恶,现实,武道,五行,文明,位面,未来,猥琐,危机,同人,挑战,体育,逃亡,守护,生死,生活,神兽,神魔,神秘,神话,烧脑,杀戮,任务,热血,权谋,求生'.split(','),\n            '身份': '至尊,战神,宅男,业界精英,药师,学生,枭雄,仙尊,武神,同人,特种兵,书生,神医,神豪,少年,商人,杀手,强者,乞丐,女婿,农民,奶爸,明星,美女,流氓,教师,剑客,火影,黑客,海贼,贵族,盗贼,孤儿,公子,法医,帝王,道士,大侠,刺客,吃货,草根,兵王,保镖,保安,白领'.split(','),\n            '性格': '装逼,勇猛,野蛮,阳光,嚣张,侠义,玩世不恭,铁血,杀伐果断,懦弱,狂傲,狡猾,坚毅,搞笑,疯狂,风流,逗逼,暗黑'.split(','),\n            '情节': '扮猪吃虎,宝物,超能力,打脸,丹药,吊炸天,发财,翻身,废材,废材逆袭,洪荒,戒指,金手指,金庸,坑爹,逆天改命,入侵,三国,神器,随身空间,特殊技能,天书,王者荣耀,西游,咸鱼翻身,血腥,一统天下'.split(','),\n            '流派': '重生,直播,争霸流,召唤流,异兽流,医生,学院流,校花,乡村,系统流,武侠,无限流,无敌流,文娱,网游,透视,天才流,随身流,爽文,升级流,神豪,软饭流,轻小说,奶爸,练功流,可爱流,惊悚,技术流,洪荒流,红包,废柴流,凡人流,恶搞,都市,兵王,保镖'.split(',')\n        },\n        '女频': {\n            '分类': '古代言情,现代言情,青春校园,玄幻奇幻,武侠仙侠,悬疑灵异,游戏竞技,同人,科幻,其他'.split(','),\n            '题材': '总裁,赚钱,专宠,重逢,智谋,职场,正剧,争斗,争宠,缘分,冤家,娱乐圈,友情,游戏,音乐,妖魔,选秀,相亲,现实,喜剧,亡国,吐槽,甜心,甜蜜,替身,替嫁,桃花,守护,嗜血,生活,深情,烧脑,商业,伤痛,闪婚,三生三世,日常,权利,情有独钟,倾城,青梅竹马,青春,契约,婆媳,虐渣,男强,命运,美食,卖萌,励志,江山,家族,家长里短,婚姻,回忆,皇权,欢乐,豪门,闺蜜,古风,孤独,狗血,宫斗宅斗,搞笑,感人,复仇,斗智斗勇,初恋,宠妻,宠溺,宠婚,车祸,背叛,爱情,BE'.split(','),\n            '身份': '御姐,娱乐明星,业界精英,学霸,校花,王侯将相,王妃,替身,特工,庶女,首席,神医,设计师,商女,人妻,前妻,千金,弃妇,女强,女配,农女,明星,萌宝,灰姑娘,皇后,贵族,公主,高富帅,毒医,第三者,嫡女,变身,白领,BL'.split(','),\n            '性格': '搞笑,懦弱,腹黑,霸道,冰冷,温柔,阳光,可爱,傲娇,冷酷,淡定,纯真,善良,强势,高冷,八卦,妖娆,风流,杀伐果断,情深,专情,甜美,张扬,奇葩,冰山,冷血,狡猾,柔情,毒舌,呆萌,玩世不恭,刁蛮,野蛮,古灵精怪,勇敢,花心,妖媚,逗逼,幽默,多情,机智,暖心,欢脱,专一,傻白甜,萌萌哒,高智商,慢热,敢爱敢恨,逗比'.split(','),\n            '情节': '阴错阳差,一往情深,一见钟情,未婚怀孕,逃婚,死缠烂打,生死大爱,情有独钟,青梅竹马,强取豪夺,破镜重圆,女追男,女强女尊,虐渣打脸,涅槃,麻雀变凤凰,浪漫情缘,纠缠,欢喜冤家,黑化,复婚,复合,反转,反套路,错嫁,错爱,春风一度,出轨,不离不弃,变身,爱而不得'.split(','),\n            '流派': '总裁文,种田文,医生,养成,言情,现言,甜宠文,爽文,轻小说,轻松文,女尊文,虐文,虐恋,暖文,年代文,脑洞,萌宠,可爱流,婚恋,古言,穿越,爆笑,宝宝'.split(',')\n        }\n    };\n    \n    var ui = [];\n    var actionJs = \"var s={c:infoMap['频道']||'男频', t:infoMap['类别']||'分类', s:infoMap['排序']||'热播'}; source.setVariable(JSON.stringify(s)); java.refreshExplore();\";\n    \n    ui.push({title:'频道', type:'select', chars:['男频','女频'], default:state.c, action:actionJs, style:{layout_flexBasisPercent:1}});\n    ui.push({title:'类别', type:'select', chars:['分类','题材','身份','性格','情节','流派'], default:state.t, action:actionJs, style:{layout_flexBasisPercent:1}});\n    ui.push({title:'排序', type:'select', chars:['热播','评分','完本','新书','人气'], default:state.s, action:actionJs, style:{layout_flexBasisPercent:1}});\n    ui.push({title:'关键字', type:'text', default:'', style:{layout_flexBasisPercent:1}});\n    ui.push({title:'🔍搜全网', type:'button', action:\"var k=infoMap['关键字']; if(!k){ java.toast('请输入关键字'); } else { java.searchBook(k, source); }\", style:{layout_flexBasisPercent:1}});\n    \n    var items = dict[state.c][state.t] || [];\n    var genderVal = channelMap[state.c];\n    var sortVal = sortMap[state.s];\n    \n    for (var i = 0; i < items.length; i++) {\n        var item = items[i];\n        var url = (state.t === '分类')\n            ? 'https://ts3.txs12.com/bycate/list?type=' + sortVal + '&minor=&start={{page}}&limit=20&language=zh_cn&gender=' + genderVal + '&major=' + encodeURIComponent(item)\n            : 'https://ts3.txs12.com/bytag/list?type=' + sortVal + '&start={{page}}&limit=20&language=zh_cn&gender=' + genderVal + '&tags=' + encodeURIComponent(item);\n        ui.push({title:item, url:url, style:{layout_flexGrow:1, layout_flexBasisPercent:0.25}});\n    }\n    \n    return JSON.stringify(ui);\n})()", "header": "{\"User-Agent\":\"okhttp/5.3.2\",\"appName\":\"com.listenxs.txsplayer\",\"vc\":\"521430\",\"vn\":\"1.4.3\",\"channel\":\"defChannel\",\"language\":\"zh-CN\",\"country\":\"CN\",\"netType\":\"1\",\"Gender\":\"male\",\"gpStore\":\"true\"}", "jsLib": "var SIGN_MAP = {'1':'H','2':'F','3':'G','4':'I','5':'J','9':'9','A':'C','B':'1','C':'Z','D':'E','E':'D','F':'2'};\nfunction nativeSign(str) {\n    var r = '';\n    for (var i = 0; i < str.length; i++) {\n        r += SIGN_MAP[str[i]] || str[i];\n    }\n    return r;\n}\nvar ESFEJJ_SECRET = '8a1b44c6-351d-4e23-9613-bb3bf9ad01ba';\nvar APP_VER = '1.4.3';\nvar APP_VC = '521430';\nvar APP_NAME = 'com.listenxs.txsplayer';", "lastUpdateTime": "1788319637551", "respondTime": 180000, "ruleBookInfo": {"author": "$.data.xsAuthor", "coverUrl": "$.data.xsCover", "intro": "$.data.xsIntro", "kind": "{{$.data.majCate}},{{$.data.subCate}}", "lastChapter": "$.data.chapterNum", "name": "$.data.xsName", "tocUrl": "<js>\nString(baseUrl).replace('/bookinfo/', '/audiolist-4/').split('?')[0] + '?https=1&dirHcCode=';\n</js>", "wordCount": "$.data.words"}, "ruleContent": {"content": "@js:\n(function(){\n    var body = result;\n    try {\n        var j = JSON.parse(body);\n        if (j.data) {\n            var audio = j.data.audioUrl || j.data.url || j.data.playUrl || j.data.m4aUrl;\n            if (audio && (audio.match(/\\.(m4a|mp3|aac|ogg|flac|wav)(\\?|$)/i) || audio.match(/^https?:\\/\\//))) {\n                return audio;\n            }\n            return j.data.chapterBody || j.data.content || j.data.text || j.data.body || '';\n        }\n    } catch(e) {}\n    if (body.match(/\\.(m4a|mp3|aac|ogg|flac|wav)(\\?|$)/i)) {\n        return body.trim();\n    }\n    if (body.indexOf('<') !== -1 && body.indexOf('>') !== -1) {\n        return body.replace(/<[^>]+>/g, '\\n').replace(/\\n{3,}/g, '\\n\\n').trim();\n    }\n    return body;\n})()"}, "ruleExplore": {"author": "$.xsAuthor", "bookList": "$.data", "bookUrl": "https://ts3.txs12.com/bookinfo/{{$._id}}?language=zh_cn", "coverUrl": "$.xsCover", "intro": "$.xsIntro", "kind": "{{$.xsScore}}分,{{$.playView}}热度", "lastChapter": "第{{$.chapterNum}}章", "name": "$.xsName"}, "ruleSearch": {"author": "$.xsAuthor", "bookList": "$.data", "bookUrl": "https://ts3.txs12.com/bookinfo/{{$._id}}?language=zh_cn", "coverUrl": "$.xsCover", "intro": "$.xsIntro", "kind": "{{$.xsScore}}分,{{$.playView}}热度", "lastChapter": "第{{$.chapterNum}}章", "name": "$.xsName"}, "ruleToc": {"chapterList": "$.data.chapterCon", "chapterName": "$.tit", "chapterUrl": "@js:\n(function(){\n    var bookId = String(baseUrl).split('/audiolist-4/')[1];\n    if (bookId) bookId = bookId.split('?')[0];\n    var cid = String(java.getString('$.cid') || '');\n\n    var cache = {};\n    try { cache = JSON.parse(source.getVariable()); } catch(e) {}\n\n    var devId = cache.dev_id || '';\n    if (!devId) {\n        devId = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c){\n            var r = Math.random()*16|0, v = c=='x'?r:(r&0x3|0x8);\n            return v.toString(16);\n        });\n        cache.dev_id = devId;\n    }\n\n    var shuKey = 'shu_' + bookId;\n    var dirKey = 'dir_' + bookId;\n    var shuId = cache[shuKey] || '';\n    var dirHcCode = cache[dirKey] || '';\n\n    // 从目录接口拿 shuId + dirHcCode（一次性，缓存复用）\n    if (!shuId || !dirHcCode) {\n        try {\n            var r = java.ajax('https://ts3.txs12.com/audiolist-4/' + bookId + '?https=1&dirHcCode=');\n            var j = JSON.parse(String(r));\n            if (j.data) {\n                if (!shuId && j.data.chapterUrl) {\n                    var m = String(j.data.chapterUrl).match(/shuId=(\\d+)/);\n                    if (m) shuId = m[1];\n                }\n                if (!dirHcCode) dirHcCode = String(j.data.dirHcCode || '');\n                if (shuId) cache[shuKey] = shuId;\n                if (dirHcCode) cache[dirKey] = dirHcCode;\n            }\n        } catch(e) {}\n        if (!shuId) {\n            try {\n                var r2 = java.ajax('https://ts3.txs12.com/bookinfo/' + bookId + '?language=zh_cn');\n                var j2 = JSON.parse(String(r2));\n                if (j2.data && j2.data.x_id) {\n                    shuId = String(j2.data.x_id);\n                    cache[shuKey] = shuId;\n                }\n            } catch(e2) {}\n        }\n    }\n    source.setVariable(JSON.stringify(cache));\n\n    var ts = new Date().getTime();\n    var tt = String(Math.floor(ts / 1000));\n    var computed = Math.floor(ts / 10000) + 5;\n\n    // token = md5('?' + shuId&_id&dirHcCode&cid（p1原始query顺序） + computed + 'cV2')\n    var token = String(java.md5Encode('?shuId=' + shuId + '&_id=' + bookId + '&dirHcCode=' + dirHcCode + '&cid=' + cid + computed + 'cV2'));\n\n    // 10参数：URL与签名均按 TreeMap(key) 排序\n    var allParams = {\n        '_id': bookId,\n        'app_name': APP_NAME,\n        'app_vc': APP_VC,\n        'app_vn': APP_VER,\n        'cid': cid,\n        'dev_id': devId,\n        'dirHcCode': dirHcCode,\n        'shuId': shuId,\n        'token': token,\n        'ts': String(ts)\n    };\n    var sortedKeys = Object.keys(allParams).sort();\n    var urlParts = [];\n    var signParts = [];\n    for (var i = 0; i < sortedKeys.length; i++) {\n        var k = sortedKeys[i];\n        var v = allParams[k];\n        urlParts.push(k + '=' + encodeURIComponent(v));\n        signParts.push(k + '=' + v);\n    }\n    var urlStr = urlParts.join('&');\n    var signStr = signParts.join('&');\n\n    // ss = nativeSign(md5(basePath + 排序参数 + tt + '+' + SECRET).toUpperCase())\n    var signSource = 'https://res.txs12.com/cV2/' + signStr + tt + '+' + ESFEJJ_SECRET;\n    var md5Result = String(java.md5Encode(signSource));\n    var ss = nativeSign(md5Result.toUpperCase());\n\n    var finalUrl = 'https://res.txs12.com/cV2/?' + urlStr;\n    var opt = {'headers': {'ss': ss, 'tt': tt}};\n    return finalUrl + ',' + JSON.stringify(opt);\n})()"}, "searchUrl": "https://ts3.txs12.com/search/result?query={{key}}&language=zh_cn&start={{page-1}}&limit=30", "weight": 0},{"bookSourceComment": "//    梦不觉   自动解锁剧集", "bookSourceGroup": "影视", "bookSourceName": "花花短剧APP[本地解密_自动解锁剧集]", "bookSourceType": 4, "bookSourceUrl": "花花短剧APP", "customButton": false, "customOrder": 3, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\n(function(){\n    var cats = [\n        {title:'古装剧场', url:'https://huahua.baibaipei.com/app/home/page?menu=%E5%8F%A4%E8%A3%85%E5%89%A7%E5%9C%BA&page={{page}}&pageSize=18&' + hs()},\n        {title:'迷雾剧场', url:'https://huahua.baibaipei.com/app/home/page?menu=%E8%BF%B7%E9%9B%BE%E5%89%A7%E5%9C%BA&page={{page}}&pageSize=18&' + hs()},\n        {title:'新剧', url:'https://huahua.baibaipei.com/app/home/page?menu=%E6%96%B0%E5%89%A7&page={{page}}&pageSize=18&' + hs()},\n        {title:'热播剧', url:'https://huahua.baibaipei.com/app/home/page?menu=%E7%83%AD%E6%92%AD%E5%89%A7&page={{page}}&pageSize=18&' + hs()},\n        {title:'都市', url:'https://huahua.baibaipei.com/app/drama/list?oriented=0&category=%E9%83%BD%E5%B8%82&page={{page}}&pageSize=18&' + hs()},\n        {title:'悬疑', url:'https://huahua.baibaipei.com/app/drama/list?oriented=0&category=%E6%82%AC%E7%96%91&page={{page}}&pageSize=18&' + hs()},\n        {title:'古言', url:'https://huahua.baibaipei.com/app/drama/list?oriented=0&category=%E5%8F%A4%E8%A8%80&page={{page}}&pageSize=18&' + hs()},\n        {title:'玄幻', url:'https://huahua.baibaipei.com/app/drama/list?oriented=0&category=%E7%8E%84%E5%B9%BB&page={{page}}&pageSize=18&' + hs()},\n        {title:'热血', url:'https://huahua.baibaipei.com/app/drama/list?oriented=0&category=%E7%83%AD%E8%A1%80&page={{page}}&pageSize=18&' + hs()},\n        {title:'动作', url:'https://huahua.baibaipei.com/app/drama/list?oriented=0&category=%E5%8A%A8%E4%BD%9C&page={{page}}&pageSize=18&' + hs()},\n        {title:'历史', url:'https://huahua.baibaipei.com/app/drama/list?oriented=0&category=%E5%8E%86%E5%8F%B2&page={{page}}&pageSize=18&' + hs()},\n        {title:'军事', url:'https://huahua.baibaipei.com/app/drama/list?oriented=0&category=%E5%86%9B%E4%BA%8B&page={{page}}&pageSize=18&' + hs()},\n        {title:'二次元', url:'https://huahua.baibaipei.com/app/drama/list?oriented=0&category=%E4%BA%8C%E6%AC%A1%E5%85%83&page={{page}}&pageSize=18&' + hs()}\n    ];\n\n    var ui = [];\n\n    ui.push({title:'关键字', type:'text', default:'', style:{layout_flexBasisPercent:70, layout_flexGrow:1}});\n    ui.push({title:'🔍搜索', type:'button', action:\"var k=infoMap['关键字']; if(!k){java.toast('请输入关键字');} else {java.searchBook(k, source);}\", style:{layout_flexBasisPercent:30, layout_flexGrow:1}});\n\n    for (var i = 0; i < cats.length; i++) {\n        ui.push({title:cats[i].title, url:cats[i].url, style:{layout_flexBasisPercent:50, layout_flexGrow:1}});\n    }\n\n    return JSON.stringify(ui);\n})()", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36 Chrome/150.0.0.0 Mobile Safari/537.36\",\"platform\":\"android\",\"versionName\":\"1.0.2\",\"versionCode\":\"3\",\"Accept\":\"application/json\",\"Accept-Charset\":\"UTF-8\"}", "jsLib": "var _S='cCEJrpiwQx0wP!p1Hao';\nfunction _hc(s){var h=0;for(var i=0;i<s.length;i++){h=((31*h)+s.charCodeAt(i))|0;}return h;}\nvar _BC='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nfunction _b64e(n){var s=String(n),r='';for(var i=0;i<s.length;i+=3){var a=s.charCodeAt(i),b=i+1<s.length?s.charCodeAt(i+1):0,c=i+2<s.length?s.charCodeAt(i+2):0;var t=(a<<16)|((i+1<s.length?b:0)<<8)|((i+2<s.length?c:0));r+=_BC[(t>>18)&63]+_BC[(t>>12)&63]+_BC[(t>>6)&63]+_BC[t&63];}var p=s.length%3;if(p==1)r=r.slice(0,-2)+'==';else if(p==2)r=r.slice(0,-1)+'=';return r;}\nfunction _b64d(s){var o=[],i,a,b,d,f,c=_BC;for(i=0;i<s.length;i+=4){a=c.indexOf(s.charAt(i));b=c.indexOf(s.charAt(i+1));d=c.indexOf(s.charAt(i+2));f=c.indexOf(s.charAt(i+3));if(a<0||b<0)continue;o.push((a<<2)|(b>>4));if(d>=0)o.push(((b&15)<<4)|(d>>2));if(f>=0)o.push(((d&3)<<6)|f);}return o;}\nvar _SB=[0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76,0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0,0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15,0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75,0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84,0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf,0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8,0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2,0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73,0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb,0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79,0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08,0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a,0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e,0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf,0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16];\nvar _ISB=[0x52,0x09,0x6a,0xd5,0x30,0x36,0xa5,0x38,0xbf,0x40,0xa3,0x9e,0x81,0xf3,0xd7,0xfb,0x7c,0xe3,0x39,0x82,0x9b,0x2f,0xff,0x87,0x34,0x8e,0x43,0x44,0xc4,0xde,0xe9,0xcb,0x54,0x7b,0x94,0x32,0xa6,0xc2,0x23,0x3d,0xee,0x4c,0x95,0x0b,0x42,0xfa,0xc3,0x4e,0x08,0x2e,0xa1,0x66,0x28,0xd9,0x24,0xb2,0x76,0x5b,0xa2,0x49,0x6d,0x8b,0xd1,0x25,0x72,0xf8,0xf6,0x64,0x86,0x68,0x98,0x16,0xd4,0xa4,0x5c,0xcc,0x5d,0x65,0xb6,0x92,0x6c,0x70,0x48,0x50,0xfd,0xed,0xb9,0xda,0x5e,0x15,0x46,0x57,0xa7,0x8d,0x9d,0x84,0x90,0xd8,0xab,0x00,0x8c,0xbc,0xd3,0x0a,0xf7,0xe4,0x58,0x05,0xb8,0xb3,0x45,0x06,0xd0,0x2c,0x1e,0x8f,0xca,0x3f,0x0f,0x02,0xc1,0xaf,0xbd,0x03,0x01,0x13,0x8a,0x6b,0x3a,0x91,0x11,0x41,0x4f,0x67,0xdc,0xea,0x97,0xf2,0xcf,0xce,0xf0,0xb4,0xe6,0x73,0x96,0xac,0x74,0x22,0xe7,0xad,0x35,0x85,0xe2,0xf9,0x37,0xe8,0x1c,0x75,0xdf,0x6e,0x47,0xf1,0x1a,0x71,0x1d,0x29,0xc5,0x89,0x6f,0xb7,0x62,0x0e,0xaa,0x18,0xbe,0x1b,0xfc,0x56,0x3e,0x4b,0xc6,0xd2,0x79,0x20,0x9a,0xdb,0xc0,0xfe,0x78,0xcd,0x5a,0xf4,0x1f,0xdd,0xa8,0x33,0x88,0x07,0xc7,0x31,0xb1,0x12,0x10,0x59,0x27,0x80,0xec,0x5f,0x60,0x51,0x7f,0xa9,0x19,0xb5,0x4a,0x0d,0x2d,0xe5,0x7a,0x9f,0x93,0xc9,0x9c,0xef,0xa0,0xe0,0x3b,0x4d,0xae,0x2a,0xf5,0xb0,0xc8,0xeb,0xbb,0x3c,0x83,0x53,0x99,0x61,0x17,0x2b,0x04,0x7e,0xba,0x77,0xd6,0x26,0xe1,0x69,0x14,0x63,0x55,0x21,0x0c,0x7d];\nvar _RC=[0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36];\nfunction _xt(a,b){var r=0;while(b){if(b&1)r^=a;var hi=a&0x80;a=((a<<1)&0xff);if(hi)a^=0x1b;b>>=1;}return r;}\nfunction _aesKeyExp(key){var w=[];for(var i=0;i<16;i++)w.push(key[i]);for(i=4;i<44;i++){var t=w.slice((i-1)*4,i*4);if(i%4===0){var t0=t[0];t[0]=t[1];t[1]=t[2];t[2]=t[3];t[3]=t0;for(var j=0;j<4;j++)t[j]=_SB[t[j]];t[0]^=_RC[i/4-1];}for(j=0;j<4;j++)w.push(w[(i-4)*4+j]^t[j]);}return w;}\nfunction _aesDecBlock(c,wk){var s=[],i,r;for(i=0;i<16;i++)s.push(c[i]);function ark(wr){for(i=0;i<16;i++)s[i]^=wk[wr*16+(i&3)+((i>>2)<<2)];}ark(10);for(r=9;r>=1;r--){for(i=1;i<4;i++){var row=[];for(var cc=0;cc<4;cc++)row[cc]=s[i+cc*4];for(cc=0;cc<4;cc++)s[i+cc*4]=row[(cc+4-i)%4];}for(i=0;i<16;i++)s[i]=_ISB[s[i]];ark(r);for(cc=0;cc<4;cc++){var b0=s[0+cc*4],b1=s[1+cc*4],b2=s[2+cc*4],b3=s[3+cc*4];s[0+cc*4]=_xt(b0,14)^_xt(b1,11)^_xt(b2,13)^_xt(b3,9);s[1+cc*4]=_xt(b0,9)^_xt(b1,14)^_xt(b2,11)^_xt(b3,13);s[2+cc*4]=_xt(b0,13)^_xt(b1,9)^_xt(b2,14)^_xt(b3,11);s[3+cc*4]=_xt(b0,11)^_xt(b1,13)^_xt(b2,9)^_xt(b3,14);}}for(i=1;i<4;i++){var row2=[];for(var c2=0;c2<4;c2++)row2[c2]=s[i+c2*4];for(c2=0;c2<4;c2++)s[i+c2*4]=row2[(c2+4-i)%4];}for(i=0;i<16;i++)s[i]=_ISB[s[i]];ark(0);var out=[];for(i=0;i<16;i++)out.push(s[i]);return out;}\nfunction _aesCbcDec(ct,key,iv){var wk=_aesKeyExp(key);var out=[],prev=iv,i;for(i=0;i<ct.length;i+=16){var dec=_aesDecBlock(ct.slice(i,i+16),wk);for(var j=0;j<16;j++){out.push(dec[j]^prev[j]);}prev=ct.slice(i,i+16);}var p=out[out.length-1];if(p>=1&&p<=16)out=out.slice(0,out.length-p);return out;}\nfunction _u8d(a){var s='',i=0;while(i<a.length){var c=a[i];if(c<128){s+=String.fromCharCode(c);i++;}else if(c<224){s+=String.fromCharCode(((c&31)<<6)|(a[i+1]&63));i+=2;}else if(c<240){s+=String.fromCharCode(((c&15)<<12)|((a[i+1]&63)<<6)|(a[i+2]&63));i+=3;}else{var cp=((c&7)<<18)|((a[i+1]&63)<<12)|((a[i+2]&63)<<6)|(a[i+3]&63);cp-=0x10000;s+=String.fromCharCode(0xD800+(cp>>10),0xDC00+(cp&1023));i+=4;}}return s;}\nfunction hs(){var ts=String(Math.floor(Date.now()/1000));var nc='abcdefghijklmnopqrstuvwxyz',nn='';for(var i=0;i<16;i++)nn+=nc[Math.floor(Math.random()*nc.length)];var j='nonce='+nn+'&timestamp='+ts;return 'nonce='+nn+'&timestamp='+ts+'&signature='+encodeURIComponent(_b64e(_hc(j+_S)));}\nfunction decryptAES(enc){var s=String(enc).replace(/[^A-Za-z0-9+/=]/g,'');if(!s||s.length<32)return '{}';try{var b=_b64d(s);if(!b||b.length<32)return '{}';var KEY=[],ks='fcPD@Sdbmn&B4B@o',i;for(i=0;i<16;i++)KEY.push(ks.charCodeAt(i));return _u8d(_aesCbcDec(b.slice(16),KEY,b.slice(0,16)));}catch(e){return '{}';}}\n// ============ DJX 纯JS密码学库（jsLib将内嵌此代码，ES5兼容Rhino） ============\n// MD5\nvar _MD5HEX='0123456789abcdef';\nfunction _md5(s){\n  function rotl(x,c){return (x<<c)|(x>>>(32-c));}\n  function add(x,y){var l=(x&0xffff)+(y&0xffff),m=(x>>16)+(y>>16)+(l>>16);return (m<<16)|(l&0xffff);}\n  function toBytes(str){\n    var out=[],p=0;\n    for(var i=0;i<str.length;i++){\n      var c=str.charCodeAt(i);\n      if(c<128){out[p++]=c;}\n      else if(c<2048){out[p++]=0xc0|(c>>6);out[p++]=0x80|(c&63);}\n      else if(c<55296||c>=57344){out[p++]=0xe0|(c>>12);out[p++]=0x80|((c>>6)&63);out[p++]=0x80|(c&63);}\n      else{i++;var c2=str.charCodeAt(i);c=0x10000+(((c&0x3ff)<<10)|(c2&0x3ff));\n        out[p++]=0xf0|(c>>18);out[p++]=0x80|((c>>12)&63);out[p++]=0x80|((c>>6)&63);out[p++]=0x80|(c&63);}\n    }\n    return out;\n  }\n  var bytes=toBytes(s),len=bytes.length,bitLen=len*8;\n  bytes.push(0x80);\n  while(bytes.length%64!==56)bytes.push(0);\n  var _lo=bitLen>>>0,_hi=Math.floor(bitLen/4294967296);\n  for(var i=0;i<4;i++)bytes.push((_lo>>>(i*8))&0xff);\n  for(var i=0;i<4;i++)bytes.push((_hi>>>(i*8))&0xff);\n  var a0=0x67452301,b0=0xefcdab89,c0=0x98badcfe,d0=0x10325476;\n  var K=[0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40821,0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a,0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391];\n  var S=[7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21];\n  for(var off=0;off<bytes.length;off+=64){\n    var M=[];\n    for(var i=0;i<16;i++){M[i]=bytes[off+i*4]|(bytes[off+i*4+1]<<8)|(bytes[off+i*4+2]<<16)|(bytes[off+i*4+3]<<24);}\n    var A=a0,B=b0,C=c0,D=d0;\n    for(var i=0;i<64;i++){\n      var F,g;\n      if(i<16){F=(B&C)|(~B&D);g=i;}\n      else if(i<32){F=(D&B)|(~D&C);g=(5*i+1)%16;}\n      else if(i<48){F=B^C^D;g=(3*i+5)%16;}\n      else{F=C^(B|~D);g=(7*i)%16;}\n      var tmp=D;D=C;C=B;\n      B=add(B,rotl(add(add(A,F),add(K[i],M[g])),S[i]));\n      A=tmp;\n    }\n    a0=add(a0,A);b0=add(b0,B);c0=add(c0,C);d0=add(d0,D);\n  }\n  function h(n){var s='';for(var i=0;i<4;i++){s+=_MD5HEX[(n>>(8*i+4))&15]+_MD5HEX[(n>>(8*i))&15];}return s;}\n  return h(a0)+h(b0)+h(c0)+h(d0);\n}\n// SHA-256\nvar _K256=[0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2];\nfunction _sha256(s){\n  function rotr(x,n){return (x>>>n)|(x<<(32-n));}\n  var h0=0x6a09e667,h1=0xbb67ae85,h2=0x3c6ef372,h3=0xa54ff53a,h4=0x510e527f,h5=0x9b05688c,h6=0x1f83d9ab,h7=0x5be0cd19;\n  var bytes=[];\n  for(var i=0;i<s.length;i++){\n    var c=s.charCodeAt(i);\n    if(c<128)bytes.push(c);\n    else if(c<2048){bytes.push(0xc0|(c>>6),0x80|(c&63));}\n    else if(c<55296||c>=57344){bytes.push(0xe0|(c>>12),0x80|((c>>6)&63),0x80|(c&63));}\n    else{i++;var c2=s.charCodeAt(i);var cp=0x10000+(((c&0x3ff)<<10)|(c2&0x3ff));bytes.push(0xf0|(cp>>18),0x80|((cp>>12)&63),0x80|((cp>>6)&63),0x80|(cp&63));}\n  }\n  var bitLen=bytes.length*8;\n  bytes.push(0x80);\n  while(bytes.length%64!==56)bytes.push(0);\n  var _lo=bitLen>>>0,_hi=Math.floor(bitLen/4294967296);\n  for(var i=0;i<4;i++)bytes.push((_hi>>>(24-i*8))&0xff);\n  for(var i=0;i<4;i++)bytes.push((_lo>>>(24-i*8))&0xff);\n  for(var off=0;off<bytes.length;off+=64){\n    var w=[];\n    for(var i=0;i<16;i++)w[i]=(bytes[off+i*4]<<24)|(bytes[off+i*4+1]<<16)|(bytes[off+i*4+2]<<8)|bytes[off+i*4+3];\n    for(var i=16;i<64;i++){\n      var s0=rotr(w[i-15],7)^rotr(w[i-15],18)^(w[i-15]>>>3);\n      var s1=rotr(w[i-2],17)^rotr(w[i-2],19)^(w[i-2]>>>10);\n      w[i]=(w[i-16]+s0+w[i-7]+s1)|0;\n    }\n    var a=h0,b=h1,c=h2,d=h3,e=h4,f=h5,g=h6,hh=h7;\n    for(var i=0;i<64;i++){\n      var S1=rotr(e,6)^rotr(e,11)^rotr(e,25);\n      var ch=(e&f)^(~e&g);\n      var t1=(hh+S1+ch+_K256[i]+w[i])|0;\n      var S0=rotr(a,2)^rotr(a,13)^rotr(a,22);\n      var maj=(a&b)^(a&c)^(b&c);\n      var t2=(S0+maj)|0;\n      hh=g;g=f;f=e;e=(d+t1)|0;d=c;c=b;b=a;a=(t1+t2)|0;\n    }\n    h0=(h0+a)|0;h1=(h1+b)|0;h2=(h2+c)|0;h3=(h3+d)|0;h4=(h4+e)|0;h5=(h5+f)|0;h6=(h6+g)|0;h7=(h7+hh)|0;\n  }\n  function w32(n){var s='';for(var i=3;i>=0;i--){var b=(n>>>(i*8))&0xff;s+=(b<16?'0':'')+b.toString(16);}return s;}\n  return w32(h0)+w32(h1)+w32(h2)+w32(h3)+w32(h4)+w32(h5)+w32(h6)+w32(h7);\n}\nfunction _hmacSha256(key,msg){\n  var k=[];for(var i=0;i<key.length;i++)k.push(key.charCodeAt(i)&0xff);\n  if(k.length>64){var kh=_sha256(key);for(var i=0;i<32;i++)k.push(parseInt(kh.substr(i*2,2),16));k=k.slice(32);}\n  while(k.length<64)k.push(0);\n  var ipad=[],opad=[];\n  for(var i=0;i<64;i++){ipad[i]=k[i]^0x36;opad[i]=k[i]^0x5c;}\n  var ib=[];for(var i=0;i<64;i++)ib.push(ipad[i]);\n  for(var i=0;i<msg.length;i++)ib.push(msg.charCodeAt(i)&0xff);\n  var inner=_sha256Bytes(ib);\n  var ob=[];for(var i=0;i<64;i++)ob.push(opad[i]);\n  for(var i=0;i<inner.length;i++)ob.push(inner[i]);\n  return _sha256Bytes(ob);\n}\nfunction _sha256Bytes(bytes){\n  function rotr(x,n){return (x>>>n)|(x<<(32-n));}\n  var h0=0x6a09e667,h1=0xbb67ae85,h2=0x3c6ef372,h3=0xa54ff53a,h4=0x510e527f,h5=0x9b05688c,h6=0x1f83d9ab,h7=0x5be0cd19;\n  var bitLen=bytes.length*8;\n  bytes=bytes.slice();bytes.push(0x80);\n  while(bytes.length%64!==56)bytes.push(0);\n  var _lo=bitLen>>>0,_hi=Math.floor(bitLen/4294967296);\n  for(var i=0;i<4;i++)bytes.push((_hi>>>(24-i*8))&0xff);\n  for(var i=0;i<4;i++)bytes.push((_lo>>>(24-i*8))&0xff);\n  for(var off=0;off<bytes.length;off+=64){\n    var w=[];\n    for(var i=0;i<16;i++)w[i]=(bytes[off+i*4]<<24)|(bytes[off+i*4+1]<<16)|(bytes[off+i*4+2]<<8)|bytes[off+i*4+3];\n    for(var i=16;i<64;i++){\n      var s0=rotr(w[i-15],7)^rotr(w[i-15],18)^(w[i-15]>>>3);\n      var s1=rotr(w[i-2],17)^rotr(w[i-2],19)^(w[i-2]>>>10);\n      w[i]=(w[i-16]+s0+w[i-7]+s1)|0;\n    }\n    var a=h0,b=h1,c=h2,d=h3,e=h4,f=h5,g=h6,hh=h7;\n    for(var i=0;i<64;i++){\n      var S1=rotr(e,6)^rotr(e,11)^rotr(e,25);\n      var ch=(e&f)^(~e&g);\n      var t1=(hh+S1+ch+_K256[i]+w[i])|0;\n      var S0=rotr(a,2)^rotr(a,13)^rotr(a,22);\n      var maj=(a&b)^(a&c)^(b&c);\n      var t2=(S0+maj)|0;\n      hh=g;g=f;f=e;e=(d+t1)|0;d=c;c=b;b=a;a=(t1+t2)|0;\n    }\n    h0=(h0+a)|0;h1=(h1+b)|0;h2=(h2+c)|0;h3=(h3+d)|0;h4=(h4+e)|0;h5=(h5+f)|0;h6=(h6+g)|0;h7=(h7+hh)|0;\n  }\n  function w32(n){return [((n>>>24)&0xff),((n>>>16)&0xff),((n>>>8)&0xff),(n&0xff)];}\n  return w32(h0).concat(w32(h1),w32(h2),w32(h3),w32(h4),w32(h5),w32(h6),w32(h7));\n}\nfunction _hmacSha256Hex(key,msg){\n  var b=_hmacSha256(key,msg),h='';\n  for(var i=0;i<b.length;i++){h+=(b[i]<16?'0':'')+b[i].toString(16);}\n  return h;\n}\n// 字节工具\nfunction _str2bytes(s){var out=[],p=0;for(var i=0;i<s.length;i++){var c=s.charCodeAt(i);if(c<128)out[p++]=c;else if(c<2048){out[p++]=0xc0|(c>>6);out[p++]=0x80|(c&63);}else if(c<55296||c>=57344){out[p++]=0xe0|(c>>12);out[p++]=0x80|((c>>6)&63);out[p++]=0x80|(c&63);}else{i++;var c2=s.charCodeAt(i);var cp=0x10000+(((c&0x3ff)<<10)|(c2&0x3ff));out[p++]=0xf0|(cp>>18);out[p++]=0x80|((cp>>12)&63);out[p++]=0x80|((cp>>6)&63);out[p++]=0x80|(cp&63);}}return out;}\nfunction _b64eBytes(b){var BC='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',r='';for(var i=0;i<b.length;i+=3){var a=b[i],c1=i+1<b.length?b[i+1]:0,c2=i+2<b.length?b[i+2]:0;r+=BC[a>>2]+BC[((a&3)<<4)|(c1>>4)]+BC[((c1&15)<<2)|(c2>>6)]+BC[c2&63];}var p=b.length%3;if(p===1)r=r.slice(0,-2)+'==';else if(p===2)r=r.slice(0,-1)+'=';return r;}\n// AES-128-ECB 加密（复用jsLib已有S盒/密钥扩展，此处独立实现保证自洽）\nvar _SBX=[0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76,0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0,0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15,0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75,0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84,0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf,0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8,0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2,0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73,0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb,0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79,0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08,0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a,0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e,0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf,0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16];\nfunction _aesKeyExp2(key){var w=[];for(var i=0;i<16;i++)w.push(key[i]);var RC=[0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36];for(var i=4;i<44;i++){var t=w.slice((i-1)*4,i*4);if(i%4===0){var t0=t[0];t[0]=t[1];t[1]=t[2];t[2]=t[3];t[3]=t0;for(var j=0;j<4;j++)t[j]=_SBX[t[j]];t[0]^=RC[i/4-1];}for(var j=0;j<4;j++)w.push(w[(i-4)*4+j]^t[j]);}return w;}\nfunction _gm(a,b){var r=0;while(b){if(b&1)r^=a;var hi=a&0x80;a=((a<<1)&0xff);if(hi)a^=0x1b;b>>=1;}return r;}\n// GF(2^8) 乘法查表（消除循环，Rhino 下提速 2-3 倍）\nvar _G2=[],_G3=[],_G9=[],_GB=[],_GD=[],_GE=[];\nfor(var _gi=0;_gi<256;_gi++){_G2[_gi]=_gm(_gi,2);_G3[_gi]=_gm(_gi,3);_G9[_gi]=_gm(_gi,9);_GB[_gi]=_gm(_gi,11);_GD[_gi]=_gm(_gi,13);_GE[_gi]=_gm(_gi,14);}\nfunction _aesEncBlock(p,wk){\n  var s=p.slice(),i,r;\n  function ark(wr){for(i=0;i<16;i++)s[i]^=wk[wr*16+i];}\n  ark(0);\n  for(r=1;r<=9;r++){\n    for(i=0;i<16;i++)s[i]=_SBX[s[i]];\n    for(i=1;i<4;i++){var row=[];for(var cc=0;cc<4;cc++)row[cc]=s[i+cc*4];for(cc=0;cc<4;cc++)s[i+cc*4]=row[(cc+i)%4];}\n    for(cc=0;cc<4;cc++){var b0=s[0+cc*4],b1=s[1+cc*4],b2=s[2+cc*4],b3=s[3+cc*4];\n      s[0+cc*4]=_G2[b0]^_G3[b1]^b2^b3;\n      s[1+cc*4]=b0^_G2[b1]^_G3[b2]^b3;\n      s[2+cc*4]=b0^b1^_G2[b2]^_G3[b3];\n      s[3+cc*4]=_G3[b0]^b1^b2^_G2[b3];}\n    ark(r);\n  }\n  for(i=0;i<16;i++)s[i]=_SBX[s[i]];\n  for(i=1;i<4;i++){var row2=[];for(var c2=0;c2<4;c2++)row2[c2]=s[i+c2*4];for(c2=0;c2<4;c2++)s[i+c2*4]=row2[(c2+i)%4];}\n  ark(10);\n  return s;\n}\nfunction _aesEcbEnc(plain,key){\n  var pad=16-(plain.length%16),padded=plain.slice();\n  for(var i=0;i<pad;i++)padded.push(pad);\n  var wk=_aesKeyExp2(key),out=[];\n  for(var i=0;i<padded.length;i+=16){var blk=_aesEncBlock(padded.slice(i,i+16),wk);for(var j=0;j<16;j++)out.push(blk[j]);}\n  return out;\n}\n// AES-128-ECB 解密（独立实现，供响应解密；PKCS5去填充）\nvar _ISBX=[0x52,0x09,0x6a,0xd5,0x30,0x36,0xa5,0x38,0xbf,0x40,0xa3,0x9e,0x81,0xf3,0xd7,0xfb,0x7c,0xe3,0x39,0x82,0x9b,0x2f,0xff,0x87,0x34,0x8e,0x43,0x44,0xc4,0xde,0xe9,0xcb,0x54,0x7b,0x94,0x32,0xa6,0xc2,0x23,0x3d,0xee,0x4c,0x95,0x0b,0x42,0xfa,0xc3,0x4e,0x08,0x2e,0xa1,0x66,0x28,0xd9,0x24,0xb2,0x76,0x5b,0xa2,0x49,0x6d,0x8b,0xd1,0x25,0x72,0xf8,0xf6,0x64,0x86,0x68,0x98,0x16,0xd4,0xa4,0x5c,0xcc,0x5d,0x65,0xb6,0x92,0x6c,0x70,0x48,0x50,0xfd,0xed,0xb9,0xda,0x5e,0x15,0x46,0x57,0xa7,0x8d,0x9d,0x84,0x90,0xd8,0xab,0x00,0x8c,0xbc,0xd3,0x0a,0xf7,0xe4,0x58,0x05,0xb8,0xb3,0x45,0x06,0xd0,0x2c,0x1e,0x8f,0xca,0x3f,0x0f,0x02,0xc1,0xaf,0xbd,0x03,0x01,0x13,0x8a,0x6b,0x3a,0x91,0x11,0x41,0x4f,0x67,0xdc,0xea,0x97,0xf2,0xcf,0xce,0xf0,0xb4,0xe6,0x73,0x96,0xac,0x74,0x22,0xe7,0xad,0x35,0x85,0xe2,0xf9,0x37,0xe8,0x1c,0x75,0xdf,0x6e,0x47,0xf1,0x1a,0x71,0x1d,0x29,0xc5,0x89,0x6f,0xb7,0x62,0x0e,0xaa,0x18,0xbe,0x1b,0xfc,0x56,0x3e,0x4b,0xc6,0xd2,0x79,0x20,0x9a,0xdb,0xc0,0xfe,0x78,0xcd,0x5a,0xf4,0x1f,0xdd,0xa8,0x33,0x88,0x07,0xc7,0x31,0xb1,0x12,0x10,0x59,0x27,0x80,0xec,0x5f,0x60,0x51,0x7f,0xa9,0x19,0xb5,0x4a,0x0d,0x2d,0xe5,0x7a,0x9f,0x93,0xc9,0x9c,0xef,0xa0,0xe0,0x3b,0x4d,0xae,0x2a,0xf5,0xb0,0xc8,0xeb,0xbb,0x3c,0x83,0x53,0x99,0x61,0x17,0x2b,0x04,0x7e,0xba,0x77,0xd6,0x26,0xe1,0x69,0x14,0x63,0x55,0x21,0x0c,0x7d];\nfunction _aesDecBlockE(c,wk){\n  var s=c.slice(),i,r;\n  function ark(wr){for(i=0;i<16;i++)s[i]^=wk[wr*16+i];}\n  ark(10);\n  for(r=9;r>=1;r--){\n    for(i=1;i<4;i++){var row=[];for(var cc=0;cc<4;cc++)row[cc]=s[i+cc*4];for(cc=0;cc<4;cc++)s[i+cc*4]=row[(cc+4-i)%4];}\n    for(i=0;i<16;i++)s[i]=_ISBX[s[i]];\n    ark(r);\n    for(cc=0;cc<4;cc++){var b0=s[0+cc*4],b1=s[1+cc*4],b2=s[2+cc*4],b3=s[3+cc*4];\n      s[0+cc*4]=_GE[b0]^_GB[b1]^_GD[b2]^_G9[b3];\n      s[1+cc*4]=_G9[b0]^_GE[b1]^_GB[b2]^_GD[b3];\n      s[2+cc*4]=_GD[b0]^_G9[b1]^_GE[b2]^_GB[b3];\n      s[3+cc*4]=_GB[b0]^_GD[b1]^_G9[b2]^_GE[b3];}\n  }\n  for(i=1;i<4;i++){var row2=[];for(var c2=0;c2<4;c2++)row2[c2]=s[i+c2*4];for(c2=0;c2<4;c2++)s[i+c2*4]=row2[(c2+4-i)%4];}\n  for(i=0;i<16;i++)s[i]=_ISBX[s[i]];\n  ark(0);\n  return s;\n}\nfunction _aesEcbDec(ct,key){\n  var wk=_aesKeyExp2(key),out=[];\n  for(var i=0;i<ct.length;i+=16){var blk=_aesDecBlockE(ct.slice(i,i+16),wk);for(var j=0;j<16;j++)out.push(blk[j]);}\n  var p=out[out.length-1];\n  if(p>=1&&p<=16&&out.length>=p){var ok=true;for(var i=1;i<=p;i++){if(out[out.length-i]!==p){ok=false;break;}}if(ok)out=out.slice(0,out.length-p);}\n  return out;\n}\nfunction _b64dBytes(s){var o=[],BC='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',i,a,b,d,f;for(i=0;i<s.length;i+=4){a=BC.indexOf(s.charAt(i));b=BC.indexOf(s.charAt(i+1));d=BC.indexOf(s.charAt(i+2));f=BC.indexOf(s.charAt(i+3));if(a<0||b<0)continue;o.push((a<<2)|(b>>4));if(d>=0)o.push(((b&15)<<4)|(d>>2));if(f>=0)o.push(((d&3)<<6)|f);}return o;}\nfunction _u8ds(a){var s='',i=0;while(i<a.length){var c=a[i];if(c<128){s+=String.fromCharCode(c);i++;}else if(c<224){s+=String.fromCharCode(((c&31)<<6)|(a[i+1]&63));i+=2;}else if(c<240){s+=String.fromCharCode(((c&15)<<12)|((a[i+1]&63)<<6)|(a[i+2]&63));i+=3;}else{var cp=((c&7)<<18)|((a[i+1]&63)<<12)|((a[i+2]&63)<<6)|(a[i+3]&63);cp-=0x10000;s+=String.fromCharCode(0xD800+(cp>>10),0xDC00+(cp&1023));i+=4;}}return s;}\n// ============ DJX RPC 封装 ============\nvar DJX_KEY_D='70ca849663aba96aa08f82272cedd0b4';\nvar DJX_UA='Mozilla/5.0 (Linux; Android 13; M2012K11AG Build/TKQ1.221114.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/150.0.7871.181 Mobile Safari/537.36 okhttp/3.9.1 djxsdk/2.9.0.5';\n// 固定设备身份（同一 sdk_did 注册返回同一 token，幂等）\nvar DJX_SDID='a'+_md5(DJX_KEY_D+'sdkdid').substring(0,16);\nvar DJX_UID='bddid_'+_md5(DJX_KEY_D+'uuid').substring(0,20);\n// 运行时自动注册的 token（过期由 _djxRpc 检测并重注册）\nvar DJX_TOKEN='';\nvar DJX_COMMON='siteid=5623562&dev_log_aid=664072&uuid='+DJX_UID+'&uuid_type=bddid&vod_version=0.0.0.0&dp_sdk_version=0.0.0.0&sdk_version=2.9.0.5&type=2&dt=M2012K11AG&os=Android&partner=pangle_664072&package_name=com.xin.huahua';\nfunction _djxCall(path,biz,tk){\n  var hexs='0123456789ABCDEF',aln='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',salt='',nonce='';\n  for(var i=0;i<9;i++)salt+=hexs[Math.floor(Math.random()*16)];\n  for(i=0;i<16;i++)nonce+=aln[Math.floor(Math.random()*aln.length)];\n  var ts=String(Math.floor(Date.now()/1000));\n  var form=biz+'&'+DJX_COMMON;\n  var keyhex=_md5(DJX_KEY_D+salt).substring(0,16);\n  var key=[];for(var i=0;i<16;i++)key.push(keyhex.charCodeAt(i));\n  var body=_b64eBytes(_aesEcbEnc(_str2bytes(form),key));\n  var sig=_hmacSha256Hex(DJX_KEY_D,ts+nonce+form);\n  var url='https://csj-sp.csjdeveloper.com/csj_sp/api/v1'+path+'?siteid=5623562';\n  var headers={'X-Salt':salt,'X-Nonce':nonce,'X-Timestamp':ts,'X-Signature':sig,'Content-Type':'application/x-www-form-urlencoded; charset=utf-8','User-Agent':DJX_UA};\n  if(tk)headers['X-Access-Token']=tk;\n  var resp=_httpPost(url,body,headers);\n  var dec=_aesEcbDec(_b64dBytes(resp),key);\n  return JSON.parse(_u8ds(dec));\n}\n// 注册/刷新 token（user/login 同加密链路，无 token 头；幂等）\nfunction _djxReg(){\n  var r=_djxCall('/user/login','sdk_did='+DJX_SDID);\n  if(r&&r.data&&r.data.access_token)DJX_TOKEN=r.data.access_token;\n  return DJX_TOKEN;\n}\n// 主入口：懒注册 + token 失效自动重注册重试\nfunction _djxRpc(path,biz){\n  if(!DJX_TOKEN)_djxReg();\n  var o=_djxCall(path,biz,DJX_TOKEN);\n  if(o&&o.ret!==0&&o.msg&&(o.msg.indexOf('access_token')>=0||o.msg.indexOf('token')>=0)){\n    _djxReg();\n    o=_djxCall(path,biz,DJX_TOKEN);\n  }\n  return o;\n}\n// 自动解锁（无广告回调，服务端只验签名；每次最多解锁10集，幂等）\nfunction _djxUnlock(spid,index){\n  return _djxRpc('/pay/ad_unlock','lock_index='+index+'&shortplay_id='+spid+'&lock_free=0&lock_ad=10');\n}\n// 书源运行环境注入：DJX shortplay_id 全局（由 ruleBookInfo.init 赋值）\nvar DJX_SPID=0;\n// 书源版 _httpPost：Rhino 直接 java 互操作，兼容任意 Legado 版本\nfunction _httpPost(url,body,headers){\n  try{\n    var u=new Packages.java.net.URL(url);\n    var conn=u.openConnection();\n    conn.setRequestMethod('POST');\n    conn.setDoOutput(true);\n    conn.setConnectTimeout(8000);\n    conn.setReadTimeout(8000);\n    for(var k in headers)conn.setRequestProperty(k,headers[k]);\n    var os=conn.getOutputStream();\n    var bytes=new Packages.java.lang.String(body).getBytes('UTF-8');\n    os.write(bytes,0,bytes.length);\n    os.flush();os.close();\n    var code=conn.getResponseCode();\n    var is=(code>=200&&code<300)?conn.getInputStream():conn.getErrorStream();\n    var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(is,'UTF-8'));\n    var sb=new Packages.java.lang.StringBuilder();var line;\n    while((line=br.readLine())!==null)sb.append(line);\n    br.close();\n    return String(sb.toString());\n  }catch(e){return '';}\n}\n", "lastUpdateTime": "1788318595965", "respondTime": 180000, "ruleBookInfo": {"coverUrl": "@js:result.data.cover", "init": "@js:var o=JSON.parse(decryptAES(result));DJX_SPID=o&&o.data?Number(o.data.thirdId||0):0;o&&o.data?o:{data:{}}", "intro": "@js:result.data.introduction", "kind": "@js:result.data.categories", "lastChapter": "@js:result.data.total?'共'+result.data.total+'集':''", "name": "@js:result.data.title", "tocUrl": "@js:result.data.id?'https://huahua.baibaipei.com/app/drama/detail?id='+result.data.id+'&thirdId='+String(result.data.thirdId||0)+'&'+hs():''", "wordCount": "@js:result.data.total?String(result.data.total):''"}, "ruleContent": {"content": "@js:var R='';try{var m=chapter.url.match(/(\\d+)\\|(\\d+)\\|([\\w]+)(?:\\|(\\d+))?/);var spid=m[1],eid=m[2],vid=m[3],idx=Number(m[4]||0);var biz='video_id='+vid+'&episode_id='+eid+'&shortplay_id='+spid+'&lock_free=1';var o=_djxRpc('/shortplay/video_model',biz);if(o&&o.ret===10&&idx>0){_djxUnlock(spid,idx);o=_djxRpc('/shortplay/video_model',biz);}var vv=o&&o.data&&o.data.video_model&&o.data.video_model.video_list;if(vv&&vv.video_1&&vv.video_1.main_url){R=_u8ds(_b64dBytes(String(vv.video_1.main_url).replace(/-/g,'+').replace(/_/g,'/')));}else{R='无法获取播放地址：ret='+(o?o.ret:'?')+' msg='+(o?o.msg:'?');}}catch(e){R='播放地址获取异常：'+e.message;}R"}, "ruleExplore": {"bookList": "@js:var o=JSON.parse(decryptAES(result));o&&o.data&&o.data.list?o.data.list:[]", "bookUrl": "@js:'https://huahua.baibaipei.com/app/drama/detail?id='+result.id+'&thirdId='+String(result.thirdId||0)+'&'+hs()", "coverUrl": "@js:result.cover", "intro": "@js:result.introduction", "kind": "@js:result.categories", "lastChapter": "@js:result.subtitle", "name": "@js:result.title"}, "ruleSearch": {"bookList": "@js:var o=JSON.parse(decryptAES(result));o&&o.data&&o.data.list?o.data.list:[]", "bookUrl": "@js:'https://huahua.baibaipei.com/app/drama/detail?id='+result.id+'&thirdId='+String(result.thirdId||0)+'&'+hs()", "coverUrl": "@js:result.cover", "intro": "@js:result.introduction", "kind": "@js:result.categories", "lastChapter": "@js:result.subtitle", "name": "@js:result.title"}, "ruleToc": {"chapterList": "@js:try{var o=JSON.parse(decryptAES(result));var spid=o&&o.data?Number(o.data.thirdId||0):0;var d=_djxRpc('/shortplay/detail','shortplay_id='+spid+'&index=1&count=999&lock_free=1&not_include=0&direction=0');var arr=d&&d.data&&d.data.list?d.data.list:[];for(var i=0;i<arr.length;i++){arr[i]._spid=spid;}if(arr.length===0){arr=[{_spid:spid,_err:'detail ret='+d.ret+' msg='+d.msg,index:0,episode_id:0,vid:'',title:'目录为空:'+(d&&d.msg||'未知')}];}arr}catch(e){[{_spid:0,_err:String(e),index:0,episode_id:0,vid:'',title:'目录加载异常:'+e.message}]}", "chapterName": "@js:result._err?'⚠️'+result.title:'第'+result.index+'集'", "chapterUrl": "@js:'https://huahua.baibaipei.com/#'+result._spid+'|'+String(result.episode_id)+'|'+result.vid+'|'+String(result.index||0)"}, "searchUrl": "<js>'https://huahua.baibaipei.com/app/drama/list?oriented=0&page=1&pageSize=50&title='+encodeURIComponent(key)+'&'+hs()</js>", "weight": 0},{"bookSourceComment": "by狼崽儿 //2026.6.27\n没有发现页是因为我觉得它的发现页没什么营养。\n但是我想了一下，觉得也许有人需要，就还是做了。有些标签本身没有作品，不是失效了。\n该网站质量中等。章节概率出现乱序和不全的情况，这些均是正常情况。如果目录顺序颠倒，可以在阅读目录页的右上角反转目录。因为不同的漫画章节顺序不同，只能自适应一下。\n//2026.9.1\n原名是新新漫画https://www.xxim.cc，但是这个网站挂了。后面我又在网上找的这个像是同源站，只是部分CSS选择器不一样，已经在原基础上进行了微调。", "bookSourceGroup": "", "bookSourceName": "天脉漫画", "bookSourceType": 2, "bookSourceUrl": "https://www.tnmm.cc", "concurrentRate": "", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "@js:\nvar result = [];\nvar areas = ['韩国','日本','中国'];\nvar fulls = [{id:'4',name:'连载中'},{id:'1',name:'已完结'}];\n\n// 默认全部\nresult.push({\n  title: '最新更新',\n  url: '/api/comic/index/lists,{\"method\":\"POST\",\"body\":\"area=9&tags=全部&full=3&page={{page}}\"}',\n  style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}\n});\n\n// 按地区\nfor (var i = 0; i < areas.length; i++) {\n  result.push({\n    title: areas[i],\n    url: '/api/comic/index/lists,{\"method\":\"POST\",\"body\":\"area=' + (i+1) + '&tags=全部&full=3&page={{page}}\"}',\n    style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}\n  });\n}\n\n// 按进度\nfor (var i = 0; i < fulls.length; i++) {\n  result.push({\n    title: fulls[i].name,\n    url: '/api/comic/index/lists,{\"method\":\"POST\",\"body\":\"area=9&tags=全部&full=' + fulls[i].id + '&page={{page}}\"}',\n    style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}\n  });\n}\n\n// 组合\nresult.push({\n  title: '韩国连载中',\n  url: '/api/comic/index/lists,{\"method\":\"POST\",\"body\":\"area=1&tags=全部&full=4&page={{page}}\"}'\n});\nresult.push({\n  title: '日本连载中',\n  url: '/api/comic/index/lists,{\"method\":\"POST\",\"body\":\"area=2&tags=全部&full=4&page={{page}}\"}'\n});\n\nJSON.stringify(result);", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 12; wv) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1788256292769", "respondTime": 4775, "ruleBookInfo": {"author": "meta[property=og:novel:author]@content", "coverUrl": "meta[property=og:image]@content", "intro": "", "kind": "meta[property=og:novel:category]@content\n@js:var s = String(result); s = s.replace(/[\\[\\]]/g, '').replace(/[,，\\n\\r]+/g, ' ').replace(/\\s+/g, ' ').trim(); s", "lastChapter": "meta[property=og:novel:latest_chapter_name]@content", "name": "meta[property=og:novel:book_name]@content"}, "ruleContent": {"content": "@js:\nvar start = result.indexOf('id=\"cp_img\"');\nvar html = '';\nif (start !== -1) {\n    var end = result.indexOf('</div>', start);\n    html = result.substring(start, end);\n}\nvar urls = [];\nvar re = /data-src=\"([^\"]+)\"/g;\nvar m;\nwhile ((m = re.exec(html)) != null) {\n    urls.push(m[1]);\n}\nvar out = '';\nfor (var i = 0; i < urls.length; i++) {\n    out += '<img src=\"' + urls[i] + '\">\\n';\n}\nout;", "imageStyle": "FULL"}, "ruleExplore": {"author": "$.author", "bookList": "@json:$.data[*]", "bookUrl": "$.info_url", "coverUrl": "$.cover", "intro": "$.content", "name": "$.name"}, "ruleSearch": {"author": "$.author", "bookList": "@json:$.data[*]", "bookUrl": "$.info_url", "coverUrl": "$.cover", "intro": "$.intro", "kind": "$.tags[0]", "name": "$.name"}, "ruleToc": {"chapterList": "ul#ncp3_ul li", "chapterName": "div.ncp3li_title@text", "chapterUrl": "a@href"}, "searchUrl": "/api/front/index/search,{\n  \"body\": \"key={{key}}\",\n  \"charset\": \"UTF-8\",\n  \"headers\": {\n    \"user-agent\": \"Mozilla/5.0 (Linux; Android 8.1.0; JKM-AL00b Build/HUAWEIJKM-AL00b; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044807 Mobile Safari/537.36\",\n    \"X-Requested-With\": \"XMLHttpRequest\",\n    \"Content-Type\": \"application/x-www-form-urlencoded\"\n  },\n  \"js\": \"java.toast('正在搜索漫画，请稍等…');\",\n  \"method\": \"POST\",\n  \"webView\": false\n}", "weight": 1},{"bookSourceGroup": "小说", "bookSourceName": "久久小说网", "bookSourceType": 0, "bookSourceUrl": "https://www.aijjxs.com", "bookUrlPattern": "https://www\\.aijjxs\\.com/txt/\\d+\\.html", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "穿越::https://www.aijjxs.com/txt/chuanyue/index_{{page}}.html\n重生::https://www.aijjxs.com/txt/chongshengxiaoshuo/index_{{page}}.html\n古代架空::https://www.aijjxs.com/txt/lsjs/index_{{page}}.html\n现代言情::https://www.aijjxs.com/txt/young/index_{{page}}.html\n总裁豪门::https://www.aijjxs.com/txt/qinggan/index_{{page}}.html\n仙侠幻想::https://www.aijjxs.com/txt/wuxia/index_{{page}}.html\n同人衍生::https://www.aijjxs.com/txt/tongrenxiaoshuo/index_{{page}}.html\n无限流::https://www.aijjxs.com/txt/wuxianliu/index_{{page}}.html\n耽于纯美::https://www.aijjxs.com/txt/dmtr/index_{{page}}.html\n玄幻魔法::https://www.aijjxs.com/txt/xuanhuan/index_{{page}}.html\n都市异能::https://www.aijjxs.com/txt/dushi/index_{{page}}.html\n历史军事::https://www.aijjxs.com/txt/tiexue/index_{{page}}.html\n网游小说::https://www.aijjxs.com/txt/juben/index_{{page}}.html\n惊悚悬疑::https://www.aijjxs.com/txt/kongbu/index_{{page}}.html\n文学名著::https://www.aijjxs.com/txt/gdmz/index_{{page}}.html", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1788232204348", "respondTime": 180000, "ruleBookInfo": {"author": ".kv a@text", "coverUrl": ".pic img@src", "intro": ".intro-panel .desc@text", "kind": ".kv p:contains(分类)@text##.*：", "name": "article.panel h3@text##《|》", "tocUrl": "a:contains(在线阅读)@href"}, "ruleContent": {"content": "#view_content_txt@html"}, "ruleExplore": {"author": "span.mainGreen a@text", "bookList": "div.listbg", "bookUrl": "span.title a@href", "coverUrl": "a.img img@src", "intro": "div[style]:eq(0)@text", "name": "span.title a@text"}, "ruleSearch": {"author": "@text##.*作者：", "bookList": "div.searchTopic", "bookUrl": "a.searchtitle@href", "name": "a.searchtitle@text"}, "ruleToc": {"chapterList": "ul.chapter-list li a", "chapterName": "@text", "chapterUrl": "@href"}, "searchUrl": "https://www.aijjxs.com/e/search/index.php,{\"method\":\"POST\",\"body\":\"keyboard={{key}}&show=title,writer\"}", "weight": 0},{"bookSourceComment": "by狼崽儿 //2026.9.1\n如果获取目录失败，就代表该书已下架。", "bookSourceName": "再漫画🌟", "bookSourceType": 2, "bookSourceUrl": "https://manhua.zaimanhua.com", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "@js:\nvar result = [];\nvar push = function(title, url, size) {\n  result.push({\n    title: title,\n    url: url,\n    style: {\n      layout_flexGrow: 1,\n      layout_flexBasisPercent: size\n    }\n  });\n};\nvar api = '&channel=pc&app_name=zmh&version=1.0.0&timestamp=0&uid=0';\npush('🏆 人气榜', 'https://v4api.zaimanhua.com/app/v1/comic/rank/list?tag_id=0&by_time=0&rank_type=0&page={{page}}&size=24' + api, 0.25);\npush('💬 吐槽榜', 'https://v4api.zaimanhua.com/app/v1/comic/rank/list?tag_id=0&by_time=0&rank_type=1&page={{page}}&size=24' + api, 0.25);\npush('⭐ 订阅榜', 'https://v4api.zaimanhua.com/app/v1/comic/rank/list?tag_id=0&by_time=0&rank_type=2&page={{page}}&size=24' + api, 0.25);\npush('🆕 最新更新', 'https://v4api.zaimanhua.com/api/v1/comic2/update_list?page={{page}}&size=24' + api, 1);\npush('🏷 按主题', null, 1);\nvar u = 'https://v4api.zaimanhua.com/app/v1/comic/filter/classify?channel=pc&app_name=zmh&version=1.0.0&timestamp=0&uid=0';\nvar d = JSON.parse(java.ajax(u)).data;\nvar ths = d.classifyList[0].list || [];\nfor (var i = 0; i < ths.length; i++) {\n  var t = ths[i];\n  if (t.tagId == 0) { continue; }\n  push(t.tagName, 'https://v4api.zaimanhua.com/app/v1/comic/filter/list?theme=' + t.tagId + '&cate=0&status=0&zone=0&sortType=0&page={{page}}&size=24' + api, 0.25);\n}\nJSON.stringify(result);", "header": "{  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 8.1.0; JKM-AL00b Build/HUAWEIJKM-AL00b; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044807 Mobile Safari/537.36\"}", "lastUpdateTime": "1788228365681", "respondTime": 180000, "ruleBookInfo": {"author": "@js:\nvar d = (typeof result === 'string') ? JSON.parse(result) : result;\nvar a = d.data.comicInfo.authorsTagList || [];\nvar s = [];\nfor (var i = 0; i < a.length; i++) { s.push(a[i].tagName); }\ns.join(' / ')", "coverUrl": "@Json:data.comicInfo.cover", "intro": "@js:\nvar d = (typeof result === 'string') ? JSON.parse(result) : result;\nvar ci = d.data.comicInfo;\nfunction arr(li) {\n  var s = [];\n  for (var i = 0; i < li.length; i++) { s.push(li[i].tagName); }\n  return s.join(' / ');\n}\nvar out = '';\nout += '  🎯 状态：' + (arr(ci.statusTagList || []) || '未知') + '\\n';\nout += '🔥 人气：' + (ci.hotNumStr || ci.hotNum || '?') + '\\n';\nout += '📜 简介：\\n' + (ci.description || '暂无简介');\nresult = out;", "kind": "@js:\nvar d = (typeof result === 'string') ? JSON.parse(result) : result;\nvar ci = d.data.comicInfo;\nvar tags = [];\nvar c = ci.cateTagList || [];\nvar t = ci.themeTagList || [];\nfor (var i = 0; i < c.length; i++) { tags.push(c[i].tagName); }\nfor (var j = 0; j < t.length; j++) { tags.push(t[j].tagName); }\ntags.join(' / ')", "lastChapter": "@Json:data.comicInfo.lastUpdateChapterName", "name": "@Json:data.comicInfo.title"}, "ruleContent": {"content": "@js:\nvar d = (typeof result === 'string') ? JSON.parse(result) : result;\nvar ci = d.data.chapterInfo;\nvar pus = ci.page_url || [];\nvar out = [];\nfor (var i = 0; i < pus.length; i++) { out.push('<img src=\\\"' + pus[i] + '\\\">'); }\nout.join('\\n')", "imageStyle": "FULL"}, "ruleExplore": {"author": "$._author", "bookList": "@js:\nvar d = (typeof result === 'string') ? JSON.parse(result) : result;\nvar list = d.data.comicList || d.data || [];\nvar out = [];\nfor (var i = 0; i < list.length; i++) {\n  var x = list[i];\n  out.push(JSON.stringify({\n    _name: x.name || x.title || '',\n    _author: x.authors || '',\n    _cover: x.cover || '',\n    _kind: x.types || '',\n    _intro: '状态：' + (x.status || '') + String.fromCharCode(10) + '更新：' + (x.last_update_chapter_name || ''),\n    _last: x.last_update_chapter_name || '',\n    _py: x.comic_py || x.comicId || ''\n  }));\n}\nresult = out;", "bookUrl": "$._py@js:'https://v4api.zaimanhua.com/api/v1/comic2/comic/detail?comic_py='+result+'&channel=pc&app_name=zmh&version=1.0.0&timestamp=0&uid=0'", "coverUrl": "$._cover", "intro": "$._intro", "kind": "@js:\nvar o = (typeof result === 'string') ? JSON.parse(result) : result;\nresult = o._kind || '';", "lastChapter": "$._last", "name": "$._name"}, "ruleSearch": {"author": "$.authors", "bookList": "@Json:data.list", "bookUrl": "$.comic_py@js:'https://v4api.zaimanhua.com/api/v1/comic2/comic/detail?comic_py='+result+'&channel=pc&app_name=zmh&version=1.0.0&timestamp=0&uid=0'", "checkKeyWord": "半调子恋人", "coverUrl": "$.cover", "intro": "@js:\nvar d = (typeof result === 'string') ? JSON.parse(result) : result;\n'状态：' + (d.status || '') + '\\n更新：' + (d.last_update_chapter_name || '')", "kind": "$.types", "lastChapter": "$.last_update_chapter_name", "name": "$.title"}, "ruleToc": {"chapterList": "@js:\nvar d = (typeof result === 'string') ? JSON.parse(result) : result;\nvar ci = d.data.comicInfo;\nvar cid = ci.id;\nvar vols = ci.chapterList || [];\nvar arr = [];\nfor (var i = 0; i < vols.length; i++) {\n  var chs = vols[i].data || [];\n  for (var j = 0; j < chs.length; j++) {\n    var ch = chs[j];\n    var u = 'https://v4api.zaimanhua.com/api/v1/comic2/chapter/detail?comic_id=' + cid + '&chapter_id=' + ch.chapter_id + '&channel=pc&app_name=zmh&version=1.0.0&timestamp=0&uid=0';\n    arr.push({name: ch.chapter_title, order: ch.chapter_order, url: u});\n  }\n}\narr.sort(function(a, b) { return (a.order || 0) - (b.order || 0); });\nvar out = [];\nfor (var k = 0; k < arr.length; k++) { out.push(JSON.stringify({name: arr[k].name, url: arr[k].url})); }\nout;", "chapterName": "$.name", "chapterUrl": "$.url"}, "searchUrl": "@js:\n'https://v4api.zaimanhua.com/app/v1/search/index?keyword=' + encodeURIComponent(key) + '&source=0&page=' + page + '&size=24&channel=pc&app_name=zmh&version=1.0.0&timestamp=0&uid=0'", "weight": 0},{"bookSourceGroup": "漫画", "bookSourceName": "（禁漫）三四娱乐", "bookSourceType": 2, "bookSourceUrl": "https://www.3004gg.com/", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "美女写真::/meinv/page/{{page}}\n连载漫画::/item/%e8%bf%9e%e8%bd%bd/page/{{page}}\n完结漫画::/item/%e5%ae%8c%e7%bb%93/page/{{page}}\n短篇漫画::/item/%e7%9f%ad%e7%af%87%e6%bc%ab%e7%94%bb/page/{{page}}", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 12; 2112123AC) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.104 Mobile Safari/537.36\",\"Referer\":\"https://www.3004gg.com/\"}", "lastUpdateTime": "1788211033376", "respondTime": 180000, "ruleBookInfo": {"coverUrl": "class.c-img@img@src", "intro": "class.dis@text", "kind": "rel.category tag@text", "lastChapter": "class.subtitle.0@text", "name": "class.article-title@a.0@text"}, "ruleContent": {"content": "class.lazy placeholder-img@all", "nextContentUrl": "text.下一页@href"}, "ruleExplore": [], "ruleSearch": {"author": "rel.tag@text", "bookList": "class.box@class.excerpt excerpt-one", "bookUrl": "h2@a@href", "checkKeyWord": "行动扫码", "coverUrl": "img@src", "intro": "class.post-tags@text", "kind": "//*[@rel=\"tag\"][3]/text()", "lastChapter": "class.time@text", "name": "a.1@title", "wordCount": "class.subtitle@text"}, "ruleToc": {"chapterList": "class.chapter-link", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "/?s={{key}}", "weight": 0},{"bookSourceComment": "1.需要在书源登录真白萌，才能使用此书源；\n2.章节获取内容失败且前面有🔒的标志，请去真白萌购买此章节；\n3.真白萌有访问次数限制，一分钟内不能访问太多次，所以别下载，大概率下载不到十章就一直失败；\n4.基本上你一章一章阅读不会出现第3点的问题，如果出现内容失败，自己点一下刷新内容就行了；\n5.待补充；", "bookSourceGroup": "真白萌,轻小说", "bookSourceName": "真白萌(请先登录)", "bookSourceType": 0, "bookSourceUrl": "https://masiro.me/admin/", "bookUrlPattern": "", "concurrentRate": "", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "[{'title':'论坛首页','url':'','style':{layout_flexGrow:1,layout_flexBasisPercent:1}},\n{'title':'全部小说','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&status=1&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.4}},\n{'title':'日轻小说','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&order=2&ori=0','style':{layout_flexGrow:1,layout_flexBasisPercent:0.4}},\n{'title':'原创小说','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&order=2&ori=1','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'最近更新','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&order=1','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'我的收藏','url':'https://masiro.me/admin/loadMoreNovels?collection=1','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'世界观','url':'','style':{layout_flexGrow:1,layout_flexBasisPercent:1}},\n{'title':'VR/游戏','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=40&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'异世界','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=5&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'迷宫地域','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=6&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'现代','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=45&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'科幻','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=25&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'校园','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=11&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'主题|题材','url':'','style':{layout_flexGrow:1,layout_flexBasisPercent:1}},\n{'title':'战    纪','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=12&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'游记','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=20&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'美食','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=21&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'恶役','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=38&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'误解系','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=16&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'欢乐向','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=34&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'穿越/转生','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=24&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'种田/经营','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=43&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'异能/超自然战斗','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=26&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'主角类型','url':'','style':{layout_flexGrow:1,layout_flexBasisPercent:1}},\n{'title':'女性主角','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=8&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'青梅竹马','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=29&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'萝莉/幼女','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=39&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.25}},\n{'title':'病娇','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=19&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'人外','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=9&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'兽耳','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=10&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'妹妹','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=27&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'姐姐','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=28&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'伪娘','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=30&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'TS','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=23&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'吸血鬼','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=17&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'恋爱关系','url':'','style':{layout_flexGrow:1,layout_flexBasisPercent:1}},\n{'title':'喜剧','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=4&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'纯爱','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=31&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'后宫','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=33&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'百合','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=7&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'其他标签','url':'','style':{layout_flexGrow:1,layout_flexBasisPercent:1}},\n{'title':'治愈','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=36&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'黑深残','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=18&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'R17','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=22&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'短篇','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=37&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'同人','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=41&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'连载','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&status=0&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'完结','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=15&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}},\n{'title':'腰斩','url':'https://masiro.me/admin/loadMoreNovels?page={{page}}&tags=14&order=2','style':{layout_flexGrow:1,layout_flexBasisPercent:0.2}}]", "header": "{\n    \"Connection\": \"keep-alive\",\n    \"X-Requested-With\": \"XMLHttpRequest\",\n    \"Accept\": \"application/json, text/javascript, */*; q=0.01\",\n    \"Content-Type\": \"application/x-www-form-urlencoded; charset=UTF-8\",\n    \"User-Agent\": \"Mozilla/5.0 (Linux; Android 17) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.7922.175 Mobile Safari/537.36\",\n    \"Referer\": \"https://masiro.me/admin/auth/login\",\n    \"Accept-Language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\"\n}", "jsLib": "function getCookieValue(cookieStr, name) {\n    const regex = new RegExp(`(^| )${name}=([^;]+)`);\n    const match = cookieStr.match(regex);\n    return match ? decodeURIComponent(match[2]) : null;\n}", "lastUpdateTime": 1751821220343, "loginUi": "", "loginUrl": "https://masiro.me/admin/auth/login", "respondTime": 180000, "ruleBookInfo": {"author": ".author@a@text", "canReName": "1", "coverUrl": ".mailbox-attachment-icon@img@data-src", "init": "", "intro": "div.brief@html", "kind": "span.label@text", "lastChapter": "a.nw-a@text", "name": "div.novel-title@text", "tocUrl": "@js:\nvar headers = java.get('searchHeaders');\nvar options = {\n    method: \"GET\",\n    headers: headers,\n    webView: true\n};\nvar theBookUrl = baseUrl + \",\" + JSON.stringify(options);\ntheBookUrl;", "wordCount": "div.n-chapters@text"}, "ruleContent": {"content": "class.nvl-content@html"}, "ruleSearch": {"author": "author", "bookList": "<js>\nvar key = java.get('key');\nvar page = java.get('page');\nvar cookieHost = java.getCookie(\"https://masiro.me\");\n\nvar headers = {\n    \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0\",\n    \"Referer\": \"https://masiro.me/admin/novels\",\n    \"Connection\": \"keep-alive\",\n    \"Cookie\": cookieHost || \"\",\n    \"X-XSRF-TOKEN\": getCookieValue(cookieHost, \"XSRF-TOKEN\")\n};\njava.put('searchHeaders', headers);\n\nvar url = \"https://masiro.me/admin/loadMoreNovels?page=\" + page + \n\t\t\"&keyword=\" + encodeURIComponent(key) +\n\t\t\"&_t=\" + Date.now();\n\nvar response = java.get(url, headers);\nvar responseData = JSON.parse(response.body());\n\nif (responseData.code !== 1) {\n    java.error(\"请求失败: \" + responseData.msg);\n}\n\nvar resultList = [];\nresponseData.novels.forEach(function(novel) {\n    var tags = [];\n    novel.tags.forEach(function(tag) {\n        tags.push(tag.name);\n    });\n\n    var translators = [];\n    novel.translators.forEach(function(translator) {\n        translators.push(translator.name);\n    });\n\n    var coverUrl = \"https://masiro.me\" + novel.cover_img;\n\n    var novelItem = {\n        id: novel.id,\n        title: novel.title,\n        brief: novel.brief,\n        author: novel.author,\n        cover: coverUrl,\n        status: novel.status, // 0=连载中, 1=已完结\n        wordCount: novel.words,\n        updateTime: novel.updated_at,\n        latestChapter: novel.new_up_content,\n        tags: tags.join(\", \"),\n        translators: translators.join(\", \"),\n        readCount: novel.read_num,\n        collectCount: novel.collect_nums,\n        likeCount: novel.thumb_up,\n        sourceUrl: novel.original\n    };\n    \n    resultList.push(novelItem);\n});\n\njava.log(JSON.stringify(resultList));\nresult = resultList;\n</js>", "bookUrl": "https://masiro.me/admin/novelView?novel_id={{@json:id}}", "checkKeyWord": "妹妹", "coverUrl": "cover", "intro": "brief", "kind": "tags", "lastChapter": "latestChapter", "name": "title", "wordCount": "wordCount"}, "ruleToc": {"chapterList": "ul.chapter-ul@.episode-ul>a, li.chapter-box>b", "chapterName": ".episode-box>span:nth-of-type(1)@text||li.chapter-box>b@text", "chapterUrl": "href", "isVip": "@js:\nvar doc = org.jsoup.Jsoup.parse(result);\nvar smallElement = doc.select(\".episode-box > small:first-of-type\").first();\nvar isVIP = (smallElement != null && smallElement.text().trim().length() > 0);\n//var isVIP = smallElement ? smallElement.text().trim().length > 0 : false;\nisVIP;", "isVolume": "li.chapter-box>b@text", "preUpdateJs": "", "updateTime": ".episode-box>span:nth-of-type(2)>span[title]@text"}, "searchUrl": "https://masiro.me/admin/loadMoreNovels?page={{page}}&keyword={{key}}\n@js:\njava.put('page', page);java.put('key', key);result;", "weight": 0},{"bookSourceComment": "稻草人书屋·言璃版 v2.1\n\n【线路】iidcr.com 镜像（Cloudflare）。主域 dcrbk.com 已被 DNS 污染，直连必超时（搜索空/转圈/15秒断连），勿改回。\n\n【修复】旧2.x格式→Legado标准格式（筛选页+搜索恢复）；书名/作者选择器错配；正文翻页死循环（长章节丢后半段）；发现页滞后列表→最新列表（12分类）；标签显示0、封面正则断行、死代码清理。\n\n【防御】浏览器UA+Cookie+1.5秒限速。该站防刷激进，密集请求会封IP约15分钟，静候解封即可。\n\n【维护】无法访问时：换网络或让阅读App走VPN。规则锚点：og:novel:meta、#all-chapter、#cont-body。", "bookSourceGroup": "阅读4.6", "bookSourceName": "稻草人书屋·言璃版", "bookSourceType": 0, "bookSourceUrl": "https://www.iidcr.com", "bookUrlPattern": "https?://www\\.iidcr\\.com/book/.*", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 9; MIX 2 Build/PKQ1.190118.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/80.0.3987.99 Mobile Safari/537.36\", \"Accept-Language\": \"zh-CN,zh;q=0.9\", \"Referer\": \"https://www.iidcr.com/\"}", "httpUserAgent": "Mozilla/5.0 (Linux; Android 9; MIX 2 Build/PKQ1.190118.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/80.0.3987.99 Mobile Safari/537.36", "concurrentRate": "1500", "lastUpdateTime": "1788161289347", "weight": 0, "searchUrl": "https://www.iidcr.com/plus/search.php?q={{key}}", "exploreUrl": "[{\"title\": \"女生·言情\", \"url\": \"https://www.iidcr.com/nav/sublove-{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"耽美·纯爱\", \"url\": \"https://www.iidcr.com/nav/subbl-{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"奇幻·玄幻\", \"url\": \"https://www.iidcr.com/nav/subqihuan-{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"武侠·仙侠\", \"url\": \"https://www.iidcr.com/nav/subwuxia-{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"科幻·游戏\", \"url\": \"https://www.iidcr.com/nav/subkehuan-{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"都市·娱乐\", \"url\": \"https://www.iidcr.com/nav/subdushi-{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"历史·军事\", \"url\": \"https://www.iidcr.com/nav/sublishi-{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"悬疑·灵异\", \"url\": \"https://www.iidcr.com/nav/subkongbu-{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"轻小说\", \"url\": \"https://www.iidcr.com/nav/sublight-{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"国外文学\", \"url\": \"https://www.iidcr.com/nav/subguowai-{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"现当代\", \"url\": \"https://www.iidcr.com/nav/submodern-{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"名著\", \"url\": \"https://www.iidcr.com/nav/subclassics-{{page}}.html\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}]", "ruleSearch": {"bookList": "@css:tbody tr", "name": "@css:a.orange@title", "author": "@css:td:eq(1)@text", "kind": "", "intro": "", "coverUrl": "", "bookUrl": "@css:a.orange@href"}, "ruleExplore": {"bookList": "@css:.media", "name": "@css:h4 a@text", "author": "", "kind": "", "intro": "@css:.media-info@text", "coverUrl": "@css:img@src", "bookUrl": "@css:h4 a@href"}, "ruleBookInfo": {"name": "@css:[property$=book_name]@content", "author": "@css:[property$=author]@content", "kind": "@css:[property$=category]@content&&@css:[property$=status]@content", "lastChapter": "@css:[property$=latest_chapter_name]@content", "intro": "@css:.book-detail@text", "coverUrl": "@css:[property$=image]@content", "tocUrl": ""}, "ruleToc": {"chapterList": "@css:#all-chapter a", "chapterName": "@css:a@title", "chapterUrl": "@css:a@href"}, "ruleContent": {"content": "@js:var doc=org.jsoup.Jsoup.parse(result);var ps=doc.select('#cont-body p');var arr=[];for(var i=0;i<ps.size();i++){var t=ps.get(i).text().trim();if(t)arr.push(t);}var out;if(arr.length==0){out='正文提取失败：页面结构可能变化或网络波动，请刷新重试';}else{out=arr.join('\\n');}out", "nextContentUrl": "@css:#cont-body ~ .page li.active + li a@href"}},{"bookSourceComment": "听友FM 在线听书。音源地址需 webView 渲染获得。", "bookSourceGroup": "听书", "bookSourceName": "听友FM", "bookSourceType": 1, "bookSourceUrl": "https://tingyou.fm", "bookUrlPattern": "https://tingyou\\.fm/albums/\\d+", "concurrentRate": "1500", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreScreen": "", "exploreUrl": "[{\"title\": \"有声小说\", \"url\": \"\", \"style\": {\"layout_flexBasisPercent\": 1, \"layout_flexGrow\": 1}}, {\"title\": \"玄幻奇幻\", \"url\": \"https://tingyou.fm/?type=46&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"武侠小说\", \"url\": \"https://tingyou.fm/?type=11&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"言情通俗\", \"url\": \"https://tingyou.fm/?type=19&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"恐怖惊悚\", \"url\": \"https://tingyou.fm/?type=14&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"官场商战\", \"url\": \"https://tingyou.fm/?type=17&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"历史军事\", \"url\": \"https://tingyou.fm/?type=15&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"百家讲坛\", \"url\": \"https://tingyou.fm/?type=9&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"刑侦反腐\", \"url\": \"https://tingyou.fm/?type=16&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"有声文学\", \"url\": \"https://tingyou.fm/?type=10&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"人物纪实\", \"url\": \"https://tingyou.fm/?type=18&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"广播剧\", \"url\": \"https://tingyou.fm/?type=36&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"英文读物\", \"url\": \"https://tingyou.fm/?type=22&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"轻音清心\", \"url\": \"https://tingyou.fm/?type=23&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"二人转\", \"url\": \"https://tingyou.fm/?type=31&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"健康养生\", \"url\": \"https://tingyou.fm/?type=33&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"综艺娱乐\", \"url\": \"https://tingyou.fm/?type=34&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"头条\", \"url\": \"https://tingyou.fm/?type=40&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"戏曲\", \"url\": \"https://tingyou.fm/?type=38&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"脱口秀\", \"url\": \"https://tingyou.fm/?type=41&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"商业财经\", \"url\": \"https://tingyou.fm/?type=42&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"亲子教育\", \"url\": \"https://tingyou.fm/?type=43&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"教育培训\", \"url\": \"https://tingyou.fm/?type=44&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"时尚生活\", \"url\": \"https://tingyou.fm/?type=45&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"童话寓言\", \"url\": \"https://tingyou.fm/?type=20&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"相声小品\", \"url\": \"https://tingyou.fm/?type=21&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"未分类\", \"url\": \"https://tingyou.fm/?type=47&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"评书\", \"url\": \"\", \"style\": {\"layout_flexBasisPercent\": 1, \"layout_flexGrow\": 1}}, {\"title\": \"单田芳\", \"url\": \"https://tingyou.fm/?type=1&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"刘兰芳\", \"url\": \"https://tingyou.fm/?type=2&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"田连元\", \"url\": \"https://tingyou.fm/?type=3&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"袁阔成\", \"url\": \"https://tingyou.fm/?type=4&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"连丽如\", \"url\": \"https://tingyou.fm/?type=5&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"孙一\", \"url\": \"https://tingyou.fm/?type=8&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"王子封臣\", \"url\": \"https://tingyou.fm/?type=30&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"马长辉\", \"url\": \"https://tingyou.fm/?type=25&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"昊儒书场\", \"url\": \"https://tingyou.fm/?type=26&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"王军\", \"url\": \"https://tingyou.fm/?type=27&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"王玥波\", \"url\": \"https://tingyou.fm/?type=28&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"石连君\", \"url\": \"https://tingyou.fm/?type=29&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"粤语评书\", \"url\": \"https://tingyou.fm/?type=12&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"关永超\", \"url\": \"https://tingyou.fm/?type=35&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"张少佐\", \"url\": \"https://tingyou.fm/?type=6&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"田战义\", \"url\": \"https://tingyou.fm/?type=7&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"其他评书\", \"url\": \"https://tingyou.fm/?type=13&sort=popular&page={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}]", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Mobile Safari/537.36\",\n  \"Accept-Language\": \"zh-CN,zh;q=0.9\"\n}\n", "jsLib": "// XChaCha20Poly1305 decrypt (pure-JS HChaCha20 + Java JCE ChaCha20-Poly1305)\nfunction ting_hchacha_run(state){\n  function qr(s,ai,bi,ci,di){\n    s[ai]=(s[ai]+s[bi])>>>0; s[di]=(((s[di]^s[ai])<<16)|((s[di]^s[ai])>>>16))>>>0;\n    s[ci]=(s[ci]+s[di])>>>0; s[bi]=(((s[bi]^s[ci])<<12)|((s[bi]^s[ci])>>>20))>>>0;\n    s[ai]=(s[ai]+s[bi])>>>0; s[di]=(((s[di]^s[ai])<<8)|((s[di]^s[ai])>>>24))>>>0;\n    s[ci]=(s[ci]+s[di])>>>0; s[bi]=(((s[bi]^s[ci])<<7)|((s[bi]^s[ci])>>>25))>>>0;\n  }\n  for(var i=0;i<10;i++){\n    qr(state,0,4,8,12); qr(state,1,5,9,13); qr(state,2,6,10,14); qr(state,3,7,11,15);\n    qr(state,0,5,10,15); qr(state,1,6,11,12); qr(state,2,7,8,13); qr(state,3,4,9,14);\n  }\n}\nfunction ting_hchacha(keyBytes, nonce16){\n  var s=[\n    0x61707865,0x3320646e,0x79622d32,0x6b206574,\n    keyBytes[0]|keyBytes[1]<<8|keyBytes[2]<<16|keyBytes[3]<<24,\n    keyBytes[4]|keyBytes[5]<<8|keyBytes[6]<<16|keyBytes[7]<<24,\n    keyBytes[8]|keyBytes[9]<<8|keyBytes[10]<<16|keyBytes[11]<<24,\n    keyBytes[12]|keyBytes[13]<<8|keyBytes[14]<<16|keyBytes[15]<<24,\n    keyBytes[16]|keyBytes[17]<<8|keyBytes[18]<<16|keyBytes[19]<<24,\n    keyBytes[20]|keyBytes[21]<<8|keyBytes[22]<<16|keyBytes[23]<<24,\n    keyBytes[24]|keyBytes[25]<<8|keyBytes[26]<<16|keyBytes[27]<<24,\n    keyBytes[28]|keyBytes[29]<<8|keyBytes[30]<<16|keyBytes[31]<<24,\n    nonce16[0]|nonce16[1]<<8|nonce16[2]<<16|nonce16[3]<<24,\n    nonce16[4]|nonce16[5]<<8|nonce16[6]<<16|nonce16[7]<<24,\n    nonce16[8]|nonce16[9]<<8|nonce16[10]<<16|nonce16[11]<<24,\n    nonce16[12]|nonce16[13]<<8|nonce16[14]<<16|nonce16[15]<<24,\n  ];\n  ting_hchacha_run(s);\n  var out=new Uint8Array(32);\n  var ws=[s[0],s[1],s[2],s[3],s[12],s[13],s[14],s[15]];\n  for(var i=0;i<8;i++){var w=ws[i];out[i*4]=w&255;out[i*4+1]=(w>>>8)&255;out[i*4+2]=(w>>>16)&255;out[i*4+3]=(w>>>24)&255;}\n  return out;\n}\nfunction __hex2bytes(hex){var len=hex.length;var out=new Uint8Array(len>>1);for(var i=0;i<out.length;i++){out[i]=parseInt(hex.slice(2*i,2*i+2),16);}return out;}\nfunction __toByteArr(u8){var ba=new Packages.java.io.ByteArrayOutputStream();for(var i=0;i<u8.length;i++){ba.write(u8[i]&255);}return ba.toByteArray();}\nfunction ting_decryptPayload(hexPayload, hexKey){\n  var k=__hex2bytes(hexKey);\n  var buf=__hex2bytes(hexPayload);\n  var nonce=new Uint8Array(24);\n  for(var i=0;i<24;i++){nonce[i]=buf[i+1];}\n  var ctArea=buf.subarray(25);\n  var ct=new Uint8Array(ctArea.length);\n  for(var j=0;j<ctArea.length;j++){ct[j]=ctArea[j];}\n  var ver=buf[0];\n  if(ver===2){ // reverse ct\n    var rev=new Uint8Array(ct.length);\n    for(var r=0;r<ct.length;r++){rev[r]=ct[ct.length-1-r];}\n    ct=rev;\n  }\n  var subkey=ting_hchacha(k, nonce.subarray(0,16));\n  var nonce12=new Uint8Array(12);\n  for(var n4=0;n4<8;n4++){nonce12[4+n4]=nonce[16+n4];}\n  var cipher=Packages.javax.crypto.Cipher.getInstance(\"ChaCha20-Poly1305\");\n  var sk=new Packages.javax.crypto.spec.SecretKeySpec(__toByteArr(subkey), \"ChaCha20\");\n  var gcm=new Packages.javax.crypto.spec.GCMParameterSpec(128, __toByteArr(nonce12));\n  cipher.init(javax.crypto.Cipher.DECRYPT_MODE, sk, gcm);\n  var pb=cipher.doFinal(__toByteArr(ct));\n  return new java.lang.String(pb, \"UTF-8\");\n}\n", "lastUpdateTime": "1788148651693", "respondTime": 180000, "ruleBookInfo": {"author": "meta[name=author]@content", "coverUrl": "meta[property=og:image]@content", "intro": "meta[name=description]@content", "kind": "meta[name=album-status]@content", "name": "meta[property=og:title]@content## - 听友FM.*", "wordCount": "meta[name=chapter-count]@content##$##集"}, "ruleContent": {"content": "@webjs:(function(){var a=document.querySelector('.root-audio');if(a&&a.src&&a.src.indexOf('blob:')!==0){return a.src}var p=document.querySelector('.play-btn');if(p&&!window.__tyauto){window.__tyauto=1;p.click()}return null})()", "title": "meta[property=og:title]@content"}, "ruleExplore": {"author": ".info .info-item:nth-of-type(5)@text##作者：", "bookList": "@js:(function(){var ty=\"46\";var so=\"popular\";var p=1;try{var bu=String(baseUrl||\"\");var tm=bu.match(/[?&]type=(\\d+)/);if(tm)ty=tm[1];var sm=bu.match(/[?&]sort=([a-z]+)/);if(sm)so=sm[1];var pm=bu.match(/[?&]page=(\\d+)/);if(pm)p=parseInt(pm[1]);}catch(e){}var url=\"https://json.hgeuz.cn/tyfm/json_v1/types/\"+ty+\"/\"+so+\"/p\"+p;var raw=java.ajax(url);var m=String(raw).match(/\"payload\":\"([0-9a-f]+)\"/);if(!m)return [];var plain=ting_decryptPayload(m[1],\"ea9d9d4f9a983fe6f6382f29c7b46b8d6dc47abc6da36662e6ddff8c78902f65\");var data=JSON.parse(plain);var arr=data&&data.data?data.data:[];var out=[];for(var i=0;i<arr.length;i++){var a=arr[i];out.push({name:String(a.title),cover:String(a.cover_url),url:\"https://tingyou.fm/albums/\"+a.id});}return out;})()", "bookUrl": "url", "coverUrl": "cover", "kind": ".info .info-item:nth-of-type(3)@text##分类：", "name": "name", "wordCount": ".info .info-item:nth-of-type(1)@text##期.*"}, "ruleSearch": {"author": ".info .info-item:nth-of-type(5)@text##作者：", "bookList": "@js:(function(){var s=String(result);var m=s.match(/__NUXT_DATA__[^>]*>([\\s\\S]*?)<\\/script>/);if(!m)return [];var arr=JSON.parse(m[1]);var list=null;for(var i=0;i<arr.length;i++){var o=arr[i];if(o&&typeof o===\"object\"&&!(o instanceof Array)&&o.searchResults!==undefined){var sr=o.searchResults;var so=(typeof sr===\"number\")?arr[sr]:sr;if(so){var lk=so.list;list=(typeof lk===\"number\")?arr[lk]:lk;}break;}}if(!list||!list.length)return [];var out=[];var seen={};for(var j=0;j<list.length;j++){var ref=list[j];var co=(typeof ref===\"number\")?arr[ref]:ref;if(co&&typeof co===\"object\"){var id=arr[co.id];var t=arr[co.title];var c=arr[co.cover];if(id&&t&&c&&!seen[id]){seen[id]=1;out.push({name:String(t),cover:String(c),url:\"https://tingyou.fm/albums/\"+id});}}}return out;})()", "bookUrl": "url", "checkKeyWord": "狂龙", "coverUrl": "cover", "kind": ".info .info-item:nth-of-type(3)@text##分类：", "name": "name", "wordCount": ".info .info-item:nth-of-type(1)@text##期.*"}, "ruleToc": {"chapterList": "@js:(function(){var s=String(result);var m=s.match(/__NUXT_DATA__[^>]*>([\\s\\S]*?)<\\/script>/);if(!m)return [];var arr=[];try{arr=JSON.parse(m[1])}catch(e){return [];}var ci=-1;for(var i=0;i<arr.length;i++){var o=arr[i];if(o&&typeof o==='object'&&!(o instanceof Array)&&o.chapters!==undefined){ci=i;break;}}if(ci<0)return [];var crefs=arr[ci].chapters;var cr=(typeof crefs==='number')?arr[crefs]:crefs;if(!cr||!cr.length)return [];var out=[];var bm=String(baseUrl).match(/albums\\/(\\d+)/);var bid=bm?bm[1]:'';for(var j=0;j<cr.length;j++){var co=arr[cr[j]];if(co&&typeof co==='object'){out.push({name:String(arr[co.title]),url:'https://tingyou.fm/audios/'+bid+'/'+String(arr[co.index])});}}return out;})()", "chapterName": "name", "chapterUrl": "url"}, "searchUrl": "https://tingyou.fm/search/result?keyword={{key}}&page={{page}},{\"retry\":5}", "weight": 0},{"bookSourceComment": "SiS文學網 b.sis.la\n强制简体\n正文已强力过滤广告和导航\n强烈建议开启WebView", "bookSourceGroup": "成人小说", "bookSourceName": "🔞SiS文學網 简体", "bookSourceType": 0, "bookSourceUrl": "https://b.sis.la", "customOrder": 0, "enabled": true, "enabledExplore": true, "exploreUrl": "最新::https://b.sis.la/\n職業制服::https://b.sis.la/classify/rolecloth\n情色武俠::https://b.sis.la/classify/xianxia\n氣質美女::https://b.sis.la/classify/beautifulgirl\n經典激情::https://b.sis.la/classify/passion\n學生校園::https://b.sis.la/classify/school\n都市生活::https://b.sis.la/classify/sexcity\n強暴虐待::https://b.sis.la/classify/bdsm\n人妻熟女::https://b.sis.la/classify/wife\n家庭亂倫::https://b.sis.la/classify/fam", "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\", \"Cookie\": \"isSimplified=1\", \"Accept-Language\": \"zh-CN,zh;q=0.9\"}", "lastUpdateTime": "1788120697940", "respondTime": 180000, "ruleBookInfo": {"author": "", "intro": "", "name": "strong@text||h1@text||title@text##\\s*/.*|\\s*-.*SiS.*", "tocUrl": ""}, "ruleContent": {"content": "@js:\nlet t = result;\n// 优先取 #readerContent\nlet m = t.match(/id=[\"']readerContent[\"'][^>]*>([\\s\\S]*?)<\\/div>/i);\nif (m) t = m[1];\nelse {\n  m = t.match(/class=[\"']entry-content[\"'][^>]*>([\\s\\S]*?)<\\/div>/i);\n  if (m) t = m[1];\n}\n// 清理\nt = t.replace(/<br\\s*\\/?>/gi, '\\n')\n     .replace(/<[^>]+>/g, '')\n     .replace(/&nbsp;/g, ' ')\n     .replace(/&lt;/g, '<').replace(/&gt;/g, '>')\n     .replace(/相關閱讀[\\s\\S]*/g, '')\n     .replace(/热门TAG[\\s\\S]*/g, '')\n     .replace(/返回上一頁[\\s\\S]*/g, '')\n     .replace(/分頁\\s*\\d+\\s*\\/\\s*\\d+/g, '')\n     .replace(/«.*?»/g, '')\n     .replace(/試玩|聊天|辣妹|風月|搜尋|提供大量|每天更新/g, '')\n     .replace(/\\n{3,}/g, '\\n\\n')\n     .trim();\n// 去掉开头多余标题重复\nlet lines = t.split('\\n');\nwhile (lines.length > 0 && (lines[0].trim() === '' || lines[0].includes('href=') || lines[0].length < 5)) {\n  lines.shift();\n}\nt = lines.join('\\n').trim();\nt;", "nextContentUrl": "a[rel=next]@href||.pagination a:contains(下頁)@href||.pagination a:contains(下页)@href", "replaceRegex": ""}, "ruleExplore": {"bookList": "a.list-group-item", "bookUrl": "href", "name": "text##\\s*/.*"}, "ruleSearch": {"bookList": "a.list-group-item||a[href*=/article/]", "bookUrl": "href", "name": "text##\\s*/.*"}, "ruleToc": {"chapterList": "@js:\n[{\"name\": book.name || \"正文\", \"url\": baseUrl}]", "chapterName": "name", "chapterUrl": "url"}, "searchUrl": "https://b.sis.la/search/?q={{key}}", "weight": 0},{"bookSourceComment": "風月文學網 h528.com\n短篇为主，一篇文章=一本书\n分类已全部加入\n正文使用JS精准截取（标题后 → 全文完）\n建议开启WebView\n仅供学习交流", "bookSourceGroup": "成人小说", "bookSourceName": "風月文學網 h528", "bookSourceType": 0, "bookSourceUrl": "http://www.h528.com", "customOrder": 0, "enabled": true, "enabledExplore": true, "exploreUrl": "人妻熟女::http://www.h528.com/post/category/%e4%ba%ba%e5%a6%bb%e7%86%9f%e5%a5%b3\n家庭亂倫::http://www.h528.com/post/category/%e5%ae%b6%e5%ba%ad%e4%ba%82%e5%80%ab\n強暴虐待::http://www.h528.com/post/category/%e5%bc%b7%e6%9a%b4%e8%99%90%e5%be%85\n學生校園::http://www.h528.com/post/category/%e6%a0%a1%e5%9c%92%e5%b8%ab%e7%94%9f\n武俠科幻::http://www.h528.com/post/category/%e6%ad%a6%e4%bf%a0%e7%a7%91%e5%b9%bb\n動漫改編::http://www.h528.com/post/category/%e5%8b%95%e6%bc%ab%e6%94%b9%e7%b7%a8\n名人明星::http://www.h528.com/post/category/%e5%90%8d%e4%ba%ba%e6%98%8e%e6%98%9f\n都市生活::http://www.h528.com/post/category/%e9%83%bd%e5%b8%82%e7%94%9f%e6%b4%bb\n變身系列::http://www.h528.com/post/category/%e8%ae%8a%e8%ba%ab%e7%b3%bb%e5%88%97\n經驗故事::http://www.h528.com/post/category/%e7%b6%93%e9%a9%97%e6%95%85%e4%ba%8b\n另類其它::http://www.h528.com/post/category/%e5%8f%a6%e9%a1%9e%e5%85%b6%e5%ae%83\n性知識::http://www.h528.com/post/category/%e6%80%a7%e7%9f%a5%e8%ad%98\n最新::http://www.h528.com/", "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\"}", "lastUpdateTime": "1788118329733", "respondTime": 180000, "ruleBookInfo": {"author": "", "intro": "", "name": "h2@text||h1@text||title@text##-.*風月.*|\\s*-.*", "tocUrl": ""}, "ruleContent": {"content": "@js:\nlet t = result.replace(/\\r/g,'').replace(/\\n+/g,'\\n');\nlet start = t.search(/當|我|他|她|在|這|那|有一天|有一次|話說|正文|第[一二三四五六七八九十\\d]+[章節回]/);\nif(start < 0) start = t.indexOf('\\n') > 0 ? t.indexOf('\\n')+1 : 0;\nlet end = t.search(/全文完|☆★☆|分類\\*|最新文章|分站|Page \\d+ of/);\nif(end < 0) end = t.length;\nlet content = t.substring(start, end).trim();\ncontent = content.replace(/《\\s*\\[.*?\\]\\s*》/g,'').replace(/meme104|173免費|視訊|聊天網/g,'').trim();\ncontent;", "replaceRegex": ""}, "ruleExplore": {"bookList": "a[href*=/post/][href$=.html]", "bookUrl": "href", "name": "text"}, "ruleSearch": {"bookList": "a[href*=/post/][href$=.html]", "bookUrl": "href", "name": "text"}, "ruleToc": {"chapterList": "@js:\n[{\n  \"name\": book.name || \"正文\",\n  \"url\": baseUrl\n}]", "chapterName": "name", "chapterUrl": "url"}, "searchUrl": "http://www.h528.com/?s={{key}}", "weight": 0},{"bookSourceGroup": "漫画", "bookSourceName": "奇漫屋（mqzjw）", "bookSourceType": 2, "bookSourceUrl": "https://www.mqzjw.com", "bookUrlPattern": "https?://www.mqzjw.com/book/\\d+.html", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nconst list = [];\nconst push = function(title, url, size) {\n    list.push({\n        title: title,\n        url: url,\n        style: {layout_flexBasisPercent: size}\n    });\n};\n\nconst tpl = \"/index.php/api/data/comic?type%5Btags%5D=$id&type%5Border%5D=hits&type%5Blist%5D=0&type%5Bpay%5D=0&type%5Bfinish%5D=0\";\nconst catUrl = java.toURL(source.key).origin + \"/category/\";\nconst doc = org.jsoup.Jsoup.parse(java.ajax(catUrl));\nconst cates = doc.select(\"#cates a\");\nconst tags = [];\ncates.forEach(cat => {\n  let title = cat.text().trim()\n  let len = title.length();\n  if(len === 0 || len > 4) return;\n  let href = String(cat.attr(\"href\") || \"\");\n  if(!href) return;\n  let id = href?.match(/\\d+$/)?.[0] || \"\";\n  let url = \"\";\n  if(title == \"全部\"){\n    url = tpl.replace(/\\?.*/, \"\") + \"?page={{page}}\";\n    url += \",\" + JSON.stringify({headers:{Referer: catUrl}})\n  }else{\n    url = tpl.replace(\"$id\", id) + \"&page={{page}},\" + JSON.stringify({headers:{Referer: catUrl+\"tags/\"+id}})\n  }\n  push(title, url, 0.2)\n})\n\nJSON.stringify(list)", "header": "{\n\t\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13; V2148A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/128.0.6613.146 Mobile Safari/537.36\"\n\t}", "lastUpdateTime": "1788080430020", "respondTime": 180000, "ruleBookInfo": {"author": "h2@ownText", "canReName": "1", "coverUrl": "img.0@src", "init": ".comics-detail", "intro": ".comics-detail__desc@text", "kind": ".tag@text&&span:contains(更新时间:)@text##更新时间:", "lastChapter": "@js:\nlet last = java.getString(\"@@:contains(最新：) > a@text\");\nString(last).trim() || \"抱歉，本小说章节目录不存在\"", "name": "h1@ownText"}, "ruleContent": {"content": "@js:\nvar key = \"TRHvYbpGlNFoOdLaXrKRYgvdGwGfjnJj\";\nvar iv = \"kBKXQIpFYTDOHGLQlRUklPLtNPcBKSve\".slice(0, 16);\nvar cipher = java.createSymmetricCrypto(\"AES/CBC/PKCS5Padding\", key, iv);\nvar hh = baseUrl.split(\",\")[1];\nvar maxPageLimit = 10; // 防止死循环\nvar currentPage = 1;\nvar nextUrl = baseUrl;\nvar allImages = [];\n\nwhile (currentPage <= maxPageLimit) {\n  try {\n    var resp;\n    if (currentPage === 1) {\n      resp = result;\n    } else {\n      resp = java.ajax(nextUrl);\n      if (!resp) break;\n    }\n    var rawData = JSON.parse(resp).data;\n    if (!rawData) break;\n    var images = JSON.parse(cipher.decryptStr(rawData));\n    \n    if (!images || images.length == 0) break;\n    images.forEach(c => allImages.push(`<img src=\"${c.img},${hh}\">`));\n  } catch (e) {\n    java.log(`第${currentPage}页处理失败: ${e.toString()}`);\n  }\n  \n  currentPage++;\n  nextUrl = nextUrl.replace(/page=(\\d+)/, (_, p) => `page=${+p + 1}`);\n}\n\nallImages.join(\"\\n\");", "imageStyle": "FULL"}, "ruleExplore": {"author": "$.author", "bookList": "$.data", "bookUrl": "$.url", "coverUrl": "$.pic", "intro": "$.content", "kind": "$.tags&&$.addtime", "lastChapter": "章节数：{{$.chapter_nums}}", "name": "$.name"}, "ruleSearch": {"bookList": ".list a", "bookUrl": "a@href", "coverUrl": ".field-img@img@src", "kind": ".txt-inner[0]@text&&.txt-inner[1]@text", "lastChapter": ".txt-inner[2]@text##更新至", "name": ".title@text"}, "ruleToc": {"chapterList": "#chapter-items a", "chapterName": "div@ownText", "chapterUrl": "href@js:\nlet ref = java.toURL(baseUrl).origin + result;\nlet cid = String(result).match(/\\d+$/)?.[0];\nlet api = `/index.php/api/data/pic?cid=${cid}&page=1`;\nlet hh = JSON.stringify({headers:{Referer: ref}});\napi + \",\" + hh"}, "searchUrl": "/index.php/search?key={{key}}", "weight": 0},{"bookSourceGroup": "漫画", "bookSourceName": "奇漫屋（qimanwu）", "bookSourceType": 2, "bookSourceUrl": "https://m.qimanwu.app", "customButton": false, "customOrder": 82, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nfunction qimanwu() {\n   let disc = [];\nlet tagHtml = java.ajax(`${source.key}/custom/search`);\n  let doc = org.jsoup.Jsoup.parse(tagHtml);\n  let tags = doc.select(\".groupList li a\");\n  Array.from(tags).forEach(a => {\n    disc.push({\n      title: a.text(),\n      url: a.attr(\"href\") +\"/page/{{page}}\",\n      style: {\n        layout_flexGrow: 1,\n        layout_flexBasisPercent: 0.45\n      }\n    });\n  });\n  \n  disc.push({\n    title: \"精品漫画\",\n    url: \"/custom/boutique\",\n    style: {layout_flexBasisPercent: 1, layout_flexGrow: 0.45}\n  });\n  \n  disc.push({\n    title: \"最近更新\",\n    url: \"/custom/update\",\n    style: {layout_flexBasisPercent: 1, layout_flexGrow: 0.45}\n  });\n  \n  disc.push({\n    title: \"热门推荐\",\n    url: \"/custom/recom\",\n    style: {layout_flexBasisPercent: 1, layout_flexGrow: 0.45}\n  });\n\n   return JSON.stringify(disc);\n}\n\nconst getDate = (time) => \n  new Date(time).toLocaleDateString();\n\nconst getTime = (dateStr) => {\n  let d;\n  try {\n    d = new Date(dateStr);\n    if (isNaN(d.getTime())) throw new Error('Invalid Date');\n  } catch (e) {\n    return 0;\n  }\n  return d.getTime()\n}\n\nlet discovery;\n\ntry {\n  let raw = String(source.getVariable()).trim();\n  let cache = null;\n  if (raw) { try { cache = JSON.parse(raw); } catch (e) {} }\n\n  let now = Date.now();\n  let sevenDays = 7 * 24 * 60 * 60 * 1000;\n\n  let isValid = cache\n               && cache.date\n               && cache.fx !== undefined\n               && (now -  getTime(cache.date)) < sevenDays;\n\n  if (isValid) {\n    discovery = cache.fx;\n  } else {\n    discovery = qimanwu();\n    let dateStr = getDate(now);\n    source.setVariable(JSON.stringify({ date: dateStr, fx: discovery }));\n  }\n} catch (e) {\n  discovery = qimanwu();\n  source.setVariable(JSON.stringify({\n    date: getDate(now),\n    fx: discovery\n  }));\n}\n\ndiscovery;", "header": "{\n  \"User-Agent\": \"{{java.getWebViewUA()}}\",\n  \"Referer\": \"{{baseUrl}}\",\n  \"cookie\": \"{{cookie.getCookie(baseUrl)}}\"\n}", "homepageModules": "", "lastUpdateTime": "1788080456512", "respondTime": 180000, "ruleBookInfo": {"author": "p.1@text", "canReName": "1", "coverUrl": "img.cover@src@js:\nvar hh = JSON.stringify({\"headers\": {\n  \"User-Agent\": java.getWebViewUA(),\n  \"Referer\": baseUrl,\n  \"cookie\": cookie.getCookie(baseUrl)\n}});\nresult + \",\" + hh", "init": "@js:\nif(/很遗憾，该漫画不存在/.test(result)){\n  result = \"<nocomic>很遗憾，该漫画不存在或章节已被删除</nocomic>\"\n}\nresult", "intro": "p.5@text||nocomic@text", "kind": "p.2@a@text", "lastChapter": "p.3@text##更新至：", "name": "p.0@text||nocomic@text"}, "ruleContent": {"content": "@js:\n(() => {\n  var match = result.match(/params\\s*=\\s*['\"]([^'\"]+)['\"]/);\n  if (!match) return \"\";\n  var params = match[1];\n  \n  var allBytes = java.base64DecodeToByteArray(params);\n  var ivBytes = allBytes.slice(0, 16);\n  var ctBytes = allBytes.slice(16);\n  var key = \"9S8$vJnU2ANeSRoF\";\n  key = java.strToBytes(key);\n  var cipher = java.createSymmetricCrypto(\"AES/CBC/PKCS5Padding\", key, ivBytes);\n  var jsonStr = cipher.decryptStr(ctBytes);\n  var {images} = JSON.parse(jsonStr);\n  \n  var hh = JSON.stringify({\"headers\": {\n    \"User-Agent\": java.getWebViewUA(),\n    \"Referer\": baseUrl,\n    \"cookie\": cookie.getCookie(baseUrl)\n  }});\n\n  return images.map(x=>`<img src=\"${x+','+hh}\">`).join(\"\");\n})();", "imageStyle": "FULL"}, "ruleExplore": [], "ruleSearch": {"author": "p.2@text", "bookList": ".rankList@li", "bookUrl": "a@href", "coverUrl": "img.0@src@js:\nvar hh = JSON.stringify({\"headers\": {\n  \"User-Agent\": java.getWebViewUA(),\n  \"Referer\": baseUrl,\n  \"cookie\": cookie.getCookie(baseUrl)\n}});\nresult + \",\" + hh", "lastChapter": "p.1@text", "name": "p.0@text"}, "ruleToc": {"chapterList": ".chapterList li a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "/search/{{encodeURIComponent(key)}}/{{page}}", "weight": 0},{"bookSourceComment": "🐱Pixiv小喵：翻译模块已整段换新。\n原微软 edge auth 通道(api.cognitive.microsofttranslator.com)已被官方关闭，导致翻译全部失效；\n现移植自「🌈pixiv小说🙈（免梯，自动翻译外文）」的三引擎翻译：\n🟢必应网页版(免密钥·国内直连，默认) / 🔵腾讯TranSmart(填微软密钥走Azure官方，未填则走腾讯自有引擎+MyMemory兜底) / 🤖AI大模型(OpenAI兼容)。\n登录界面新增：微软密钥、AI接口地址、AI密钥、AI模型 四个输入框，以及「📖翻译说明」「🔁翻译引擎」「🤖AI翻译测试」三个按钮；\n「查看设置」新增当前翻译引擎显示。\n注意：填完翻译相关输入框后需点右上角 √ 重新登录才会写进登录信息，引擎才能读到。", "bookSourceGroup": "Pixiv", "bookSourceName": "🐱Pixiv小喵（自动翻译）", "bookSourceType": 0, "bookSourceUrl": "https://app-api.pixiv.net/##", "bookUrlPattern": "http://localhost/|https://www.pixiv.net/novel/series/\\d{3,}", "concurrentRate": "3/2000", "customButton": false, "customOrder": 173, "enabled": false, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nlet banben=\"1.1.9\";\nvar obj = {\n    '动态': {\n        \"url\": `{{\n            if (page == 1) {\n            url = 'https://app-api.pixiv.net/v1/novel/follow?restrict=public';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n            }}`,\n        \"fb\": 0.2 },\n    '推荐': {\n        \"url\": `{{\n            if (page == 1) {\n            url = 'https://app-api.pixiv.net/v1/novel/recommended?include_privacy_policy=true&filter=for_android&include_ranking_novels=true';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n            }}`,\n        \"fb\": 0.2 },\n    '追更': {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https://app-api.pixiv.net/v1/watchlist/novel';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n            }}`,\n        \"fb\": 0.2 },\n    '收藏·公开': {\n        \"url\": `{{\n            if (page == 1) {\n                let id = source.getLoginInfoMap().get('id');\n                url = 'https://app-api.pixiv.net/v1/user/bookmarks/novel?user_id='+id+'&restrict=public';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n            }}`,\n        \"wb\": 1,\n        \"fb\": 0.4 },\n    '收藏·私密': {\n        \"url\": `{{\n            if (page == 1) {\n                let id = source.getLoginInfoMap().get('id');\n                url = 'https://app-api.pixiv.net/v1/user/bookmarks/novel?user_id='+id+'&restrict=private';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n            }}`,\n        \"fb\": 0.4 },\n    'R-18·日': {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https://app-api.pixiv.net/v1/novel/ranking?filter=for_android&mode=day_r18';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n            }}`,\n        \"wb\": 1,\n        \"fb\": 0.2 },\n    'R-18·AI': {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https://app-api.pixiv.net/v1/novel/ranking?filter=for_android&mode=week_ai_r18';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n            }}`,\n        \"fb\": 0.2 },\n    'R-18·周': {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https://app-api.pixiv.net/v1/novel/ranking?filter=for_android&mode=week_r18';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n            }}`,\n        \"fb\": 0.2 }\n}\n\nvar sort = [];\npush = (title, url, fg, wrap, fb) => sort.push({\n    \"title\": title,\n    \"url\": url,\n    \"style\": {\n      layout_flexGrow: fg || 1,\n      layout_flexBasisPercent: fb||-1,\n      layout_wrapBefore: wrap ? true : false\n     }\n  });\n\nfor (x in obj) {\npush(x, obj[x].url, obj[x].fg, obj[x].wb, obj[x].fb);\n}\nJSON.stringify(sort);", "header": "@js:\n(()=>{\n\tlet headers = gethd();\n\treturn JSON.stringify(headers);\n})();", "jsLib": "sleep = Packages.java.lang.Thread.sleep;\nua = 'PixivAndroidApp/5.0.166 (Android 14; RMX3366)';\nappv = '5.0.166';\na_l = 'zh-CN';\nBUA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36';\n\nbiaoq = new RegExp('^(?:NTR|NTL|修仙|奇幻|后宫|纯爱|隐奸|乱伦|乱交|母女.?|母子|父女|幼女|姐弟|人妻|正太|足交|口交|肛交|丝袜|催眠|系统|原创|续写|软饭流|修罗场|规则怪谈|女性视角|性开放世界|奸尸|冰恋|.?重口)$','i');\n\nfunction timemd5(time) {\n\tvar saltStr = time + '28c1fdd170a5204386cb1313c7077b34f83e4aaf4aa829ce78c231e05b0bae2c';\n\ttry {\n\t\tvar jv = this.java || (typeof java !== 'undefined' ? java : null);\n\t\tif (jv && jv.md5Encode) return jv.md5Encode(saltStr);\n\t} catch(e) {}\n\tvar md = Packages.java.security.MessageDigest.getInstance(\"MD5\");\n\tmd.update(new Packages.java.lang.String(saltStr).getBytes(\"UTF-8\"));\n\tvar dg = md.digest();\n\tvar hx = '';\n\tfor (var di = 0; di < dg.length; di++) {\n\t\tvar bv = dg[di] & 0xFF;\n\t\thx += (bv < 16 ? '0' : '') + bv.toString(16);\n\t}\n\treturn hx;\n}\n\nfunction gethd(url='',ck='') {\n\tconst {java, source} = this;\nlet time = java.timeFormatUTC(Date.now(),\"yyyy-MM-dd'T'HH:mm:ss'+00:00'\",8*60*60*1000);\nlet hash = this.timemd5(time);\nlet atk = source.getLoginHeader()||'';\nif(atk) atk = String('Bearer '+atk);\nlet headers = {\n    'x-client-time': time,\n    \t'User-Agent': ua,\n    \t'accept-language': a_l,\n    \t'authorization': atk,\n    \t'app-os': 'Android',\n    \t'app-os-version': 'Android 14',\n    \t'app-version': appv,\n    'x-client-hash': hash,\n    'cookie': ''\n    \t }\nck!='' && (headers['cookie']=ck);\nurl=url.replace(\"app-api.pixiv.net\",\"210.140.139.155\");\nurl && (headers['host']='app-api.pixiv.net');\nif (url=='') return headers;\nelse if (url.startsWith('data')) return url;\nelse {\n\tdelete headers['x-client-time'];\n\tdelete headers['x-client-hash'];\n\treturn url + ',' + JSON.stringify({'headers':headers});}\n};\n\nfunction leng(str) {\n\tlet length = 0;\n\tconst fuhao = ',.?!:;()[]\"';\n\tconst fuhao2 = '📘';\n\tfor (let char of str) {\n\t\tif (fuhao.includes(char) ) length += 0.5;\n\t\telse if (fuhao2.includes(char) ) length += 2;\n\t\telse length += 1;\n\t\t}\n\t\treturn length;\n}\n\nfunction gethdi(url='') {\turl=url.replace(\"i.pximg.net\",\"210.140.139.133\");\nlet imgoptions = {\n  headers: {\n    'User-Agent': 'PixivIOSApp/5.8.0',\n    'accept-encoding': 'gzip, br',\n    'referer': 'https://app-api.pixiv.net/',\n    'host': 'i.pximg.net'\n    }\n  };\n  return url+','+JSON.stringify(imgoptions);\n }\n \nfunction copy(txt) {\n\tlet htm = `data:text/html;charset=utf-8,<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<style>\nbody {\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: center;\n\talign-items: center;\n\theight: 60vh;}\n</style>\n</head>\n<body>\n<textarea id=\"copyt\" rows=\"3\">${txt}</textarea>\n<br>\n<button id=\"btn1\" onclick=\"copy()\">复制</button>\n<script>\ndocument.addEventListener(\"DOMContentLoaded\", function () {\nconst textarea = document.getElementById(\"copyt\");\ntextarea.style.height = \"auto\";\ntextarea.style.height = textarea.scrollHeight + \"px\";});\nfunction copy() {\nconst cpt = document.getElementById(\"copyt\");\ncpt.select();\ndocument.execCommand(\"copy\");}\n</script>\n</body></html>`;\nthis.java.startBrowser(htm,'复制');\n\t}\n\nfunction lookc(lyc) {\nconst [title,uid,unm,uim,tags,caption,cdate,xh,sc,gk,sTitle,id,ugz] = lyc;\n\tlet htm = `<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<style>\ntable {\n\twidth: 100%;\n\ttable-layout: fixed;\n\ttext-align: center;\n\tmargin: 0 auto;\n\tword-break: break-all;\n\t}\ntd img {\n\twidth: 100%;\n\theight: 100%;\n\tobject-fit: contain;\n\t}\n.cap {\n\t text-align: left;\n\t text-indent: 2em;\n\t}\na {text-decoration: none;}\np {margin: 0.2em auto;}\n</style>\n</head>\n<body>\n<table border=\"1\" cellspacing=\"0\">\n<tr>\n<th colspan=\"6\">标题：<a href=\"https://www.pixiv.net/novel/show.php?id=${id}\">${title}</a></th>\n</tr>\n<tr>\n<td colspan=\"4\">\n作者：<a href=\"https://www.pixiv.net/users/${uid}\">${unm}</a>\n${ugz=='true' ? '<span style=\"font-size: 0.7em;\"> (已关注)</span>' : ''}\n</td>\n<td colspan=\"2\"><img src=\"${uim}\"></td>\n</tr>\n${sTitle!='' ? ('<tr><td colspan=\"6\">小说：《'+sTitle+'》'+'</td></tr>') : ''}\n<tr>\n<td>喜欢</td>\n<td>${xh}</td>\n<td>收藏</td>\n<td>${sc}</td>\n<td>观看</td>\n<td>${gk}</td>\n</tr>\n<tr>\n<td>时间</td>\n<td colspan=\"5\">${cdate}</td>\n</tr>\n<td>标签</td>\n<td colspan=\"5\">${tags}</td>\n</tr>\n${caption!='' ? ('<tr><td>简介</td><td class=\"cap\" colspan=\"5\">'+caption+'</td></tr>') : ''}\n</table>\n<br>\n<script>\n</script>\n</body></html>`;\nthis.java.startBrowser(`data:text/html;charset=utf-8,${encodeURIComponent(htm)}`,'信息');\n}\n\n//🤖翻译工具集（必应 / 腾讯Azure / AI大模型 三引擎）——移植自「🌈pixiv小说🙈（免梯，自动翻译外文）」\n//   小喵原先的 edge.microsoft.com auth 通道已被微软关闭，整段替换。\nvar util={open(url,title,msg){if(msg){this.java.longToast(\"\\n\"+msg);this.sleep(300)}url&&this.java.startBrowser(url,title||\"\")},getMaxLen(texts,max){max=max||5E4;for(var len=0,all=0;len<texts.length;len++)if(len>1E3||(all+=texts[len].Text.length)>max){len--;break}return len},splitByMaxLenAdjustLines(str,maxLen){const parts=[];let remaining=str;maxLen=maxLen||5E4;while(remaining.length>maxLen){let part=remaining.slice(0,maxLen);let rest=remaining.slice(maxLen);let lastNewlineIndex=part.lastIndexOf(\"\\n\");if(lastNewlineIndex===\n-1){parts.push(part);remaining=rest}else{let firstPart=part.slice(0,lastNewlineIndex+1);let movedPart=part.slice(lastNewlineIndex+1);parts.push(firstPart);remaining=movedPart+rest}}remaining.length>0&&parts.push(remaining);return parts},api:{auth:\"https://edge.microsoft.com/translate/auth\",translate:\"https://api.cognitive.microsofttranslator.com/translate?from\\x3d{from}\\x26to\\x3d{to}\\x26api-version\\x3d3.0\"},isJa:(str,n)=>/[\\u30a1-\\u30f6\\u3041-\\u3093\\uff66-\\uff9d\\uff9e\\uff9f][\\u30a1-\\u9fa5]/.test((n=\nn||100)>0?String(str).substring(0,n):str),isEn:(str,n)=>!/[\\u30a1-\\u30f6\\u3041-\\u3093\\uff66-\\uff9d\\uff9e\\uff9f\\u4e00-\\u9fa5]{2}/.test((n=n||100)>0?String(str).substring(0,n):str),noZh:(k,n)=>{n=n||100;if(util.isJa(k,n)){util.lang_zh=\"\\u65e5\\u8bed\";util.lang=\"ja\";return true}else if(util.isEn(k,n)){util.lang_zh=\"\\u82f1\\u8bed\";util.lang=\"en\";return true}else return false},fixImg(str){let obj={\"\\uff1a\":\":\",\"\\uff0c\":\",\",\"\\u201c\":'\"',\"\\u201d\":'\"'};return str.replace(/<img .+>/g,$=>$.replace(/[\\u201c\\u201d\\uff1a\\uff0c]/g,\nx=>obj[x]))},objfy:(x,y,z)=>JSON.stringify(x,y||null,z||2),getAuth(isNew){const {cache,java}=this;if(!isNew){var auth=cache.getFromMemory(\"auth\");if(auth){let t=+auth.slice(0,13),k=auth.slice(14);if(k&&Date.now()-t<6E5)return k}}auth=java.ajax(util.api.auth)+\"\";cache.putMemory(\"auth\",`${Date.now()}#${auth}`);return auth},filterReg:/^[\\x00-@\\[-`{-~\\uff01-\\uff20]+$|^\\s*[\\x00-\\u2e7f]\\s*$/,logProp(ox){let obj={};Object.keys(ox).forEach(x=>{let v=ox[x];if(typeof v===\"function\"){v=v.toString();try{obj[x]=\n[v,ox[x]()]}catch{obj[x]=v}}else obj[x]=v});this.java.log(JSON.stringify(obj,null,2))},//🟢必应网页版翻译(免注册免密钥)：GET cn.bing.com/translator 取IG+key+token，POST ttranslatev3逐段翻译，token失效自动重取\nbingCred(){const{java}=this;let h=String(java.get(\"https://cn.bing.com/translator\",{\"User-Agent\":BUA}).body());let ig=h.match(/IG:\"([A-Za-z0-9]{32})\"/),ap=h.match(/params_AbusePreventionHelper\\s*=\\s*\\[([^\\]]+)\\]/);if(!ig||!ap)throw\"必应凭据获取失败\";let p=ap[1].split(\",\");return{ig:ig[1],key:p[0].replace(/[\"\\s]/g,\"\"),tk:p[1].replace(/[\"\\s]/g,\"\")}},bingT(texts,from){const{java}=this;let c=util.bingCred.call(this),out=[];for(let i=0;i<texts.length;i++){var tx=\"\";if(texts[i])for(let t=0;t<2&&!tx;t++){try{tx=JSON.parse(String(java.post(\"https://cn.bing.com/ttranslatev3?isVertical=1&&IG=\"+c.ig+\"&IID=translator.5027\",\"fromLang=\"+((from||util.lang)===\"en\"?\"en\":\"ja\")+\"&to=zh-Hans&text=\"+encodeURIComponent(texts[i])+\"&token=\"+c.tk+\"&key=\"+c.key+\"&tryFetchingGenderDebiasedTranslations=true\",{\"content-type\":\"application/x-www-form-urlencoded\",\"referer\":\"https://cn.bing.com/translator\",\"x-requested-with\":\"XMLHttpRequest\",\"User-Agent\":BUA}).body()))[0].translations[0].text}catch(e){tx=\"\"}if(!tx){if(t)tx=texts[i];else{sleep(700);c=util.bingCred.call(this)}}}out.push(tx||texts[i]);if(i<texts.length-1)sleep(120)}return out},lgKey(m,pre){try{if(!m)return\"\";var ks=null;try{if(m.keySet){var it=m.keySet().iterator();ks=[];while(it.hasNext())ks.push(String(it.next()))}else ks=Object.keys(m)}catch(e){ks=Object.keys(m)}if(!ks||!ks.length)return\"\";for(var i=0;i<ks.length;i++){var k=String(ks[i]);if(k.indexOf(pre)===0){var v=\"\";try{v=String(m.get?(m.get(k)||\"\"):(m[k]||\"\"))}catch(e2){v=String(m[k]||\"\")}v=v.replace(/^\\s+|\\s+$/g,\"\");if(v)return v}}}catch(e){}return\"\"},aiT(texts,from){const{java,source}=this;let m=source.getLoginInfoMap(),au=util.lgKey(m,\"AI接口地址\"),ak=util.lgKey(m,\"AI密钥\"),am=util.lgKey(m,\"AI模型\");if(!au)throw\"AI翻译未配置：请先在登录界面填写「AI接口地址」，再点「AI翻译测试」验证\";if(!ak)java.toast(\"@⚠️未填写AI密钥：部分平台(如opencode)无需token可直接使用，若你的平台需要凭据请到登录界面填写「AI密钥」\");if(!am)am=\"gpt-4o-mini\";let u=au.replace(/\\/+$/,\"\");if(!/\\/chat\\/completions$/.test(u))u+=/\\/v\\d+$/.test(u)?\"/chat/completions\":\"/v1/chat/completions\";let srcLang=(from||util.lang)===\"en\"?\"英语\":\"日语\",out=[];for(let i=0;i<texts.length;i++){var tx=\"\";if(texts[i])for(let t=0;t<2&&!tx;t++){try{let body=JSON.stringify({model:am,temperature:0.2,messages:[{role:\"system\",content:\"你是专业的小说翻译引擎。用户提供的文本是\"+srcLang+\"原文，请精准翻译成**简体中文**。严格规则：(1)只输出简体中文译文本身；(2)禁止任何解释、注释、拼音、原文片段或引号包装；(3)必须保留原文的换行与段落结构；(4)若原文已是中文则原样返回；(5)禁止把目标语言写成日文/英文/任何非中文语言。\"},{role:\"user\",content:texts[i]}]});let hd={\"content-type\":\"application/json\",\"User-Agent\":\"Mozilla/5.0 (Linux; Android 14)\"};if(ak)hd.authorization=\"Bearer \"+ak;let j=JSON.parse(String(java.post(u,body,hd,120000).body()));let c=j.choices&&j.choices[0]&&j.choices[0].message&&j.choices[0].message.content;tx=c?String(c).replace(/^\\s+|\\s+$/g,\"\"):\"\";if(!tx)throw j.error&&j.error.message||\"空响应\";var _k=(tx.match(/[\\u3040-\\u309f\\u30a0-\\u30ff]/g)||[]).length;if(srcLang===\"日语\"&&_k>0&&_k/tx.length>0.25){java.log(\"AI译文仍以日文为主(\"+_k+\"/\"+tx.length+\")：\"+tx.substring(0,40));throw \"译文中日文占比过高\"}}catch(e){tx=\"\";if(t)java.log(\"AI翻译第\"+(i+1)+\"段失败：\"+e);else sleep(900)}}out.push(tx||texts[i]);if(i<texts.length-1)sleep(150)}return out},aiTest(){try{let r=util.aiT.call(this,[\"これはAI翻訳の接続テストです。こんにちは、世界。\"],\"ja\");this.java.longToast(\"🤖AI翻译测试成功：\\n\"+r[0])}catch(e){this.java.longToast(\"❌AI翻译测试失败：\\n\"+e+\"\\n\\n排查：①AI接口地址 如 https://api.deepseek.com (无需/v1,自动补全) ②AI密钥 sk-开头(可选：需凭据的平台才填，opencode等免token平台留空) ③AI模型名如 gpt-4o-mini/deepseek-chat ④手机网络能否直连该服务\")}},translateTexts(_texts,option){const {java,source}=this;try{option=option||{};let {from,to}=option;var texts=_texts;if(typeof texts===\"string\"){if(texts.length<10&&!util.filterReg.test(texts))return[texts];texts=util.splitByMaxLenAdjustLines(texts,2000)}if(!(texts&&texts.length))throw\"Invalid input!\";to=(to==\"zh-hans\"||to==\"zh-CN\"||to==\"zh\"||!to)?\"zh\":to;var lgm=source.getLoginInfoMap(),msKey=util.lgKey(lgm,\"微软密钥\").replace(/\\s/g,\"\"),teng=source.get(\"teng\")+\"\";let result=[];if(teng===\"ai\")return util.aiT.call(this,texts,from);if(teng!==\"tx\")return util.bingT.call(this,texts,from);if(msKey.length>10){for(let i=0;i<texts.length;){let batch=[];let total=0;while(i<texts.length&&batch.length<50&&(total+=texts[i].length)<=20000){batch.push({Text:texts[i]});i++}let reqBody=JSON.stringify(batch);let opt=JSON.stringify({method:\"POST\",headers:{\"content-type\":\"application/json\",\"Ocp-Apim-Subscription-Key\":msKey},body:reqBody});let r=java.post(\"https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to=\"+to,reqBody,{\"content-type\":\"application/json\",\"Ocp-Apim-Subscription-Key\":msKey});let j=JSON.parse(String(r.body()));for(let k=0;k<j.length;k++)result.push(j[k].translations[0].text)}return result}for(let i=0;i<texts.length;){let batch=[];let total=0;while(i<texts.length&&batch.length<8&&(total+=texts[i].length)<=4000){batch.push(texts[i]);i++}let reqBody=JSON.stringify({header:{fn:\"auto_translation\",session:\"\",client_key:\"browser-chromium-131.0.0.0\"},type:\"plain\",model_category:1,text_domain:0,source:{lang:(from||\"ja\"),text_list:batch},target:{lang:\"zh\"}});let r=java.post(\"https://transmart.qq.com/api/imt\",reqBody,{\"content-type\":\"application/json\",\"referer\":\"https://transmart.qq.com/\"});let j=JSON.parse(String(r.body()));if(j.header.ret_code==\"succ\"&&j.auto_translation&&j.auto_translation.length==batch.length){result=result.concat(j.auto_translation)}else{for(let k=0;k<batch.length;k++){let mm=java.ajax(\"https://api.mymemory.translated.net/get?q=\"+encodeURIComponent(batch[k])+\"&langpair=\"+((from||util.lang)===\"en\"?\"en\":\"ja\")+\"|zh-CN\");let mj=JSON.parse(mm);result.push(mj.responseData?mj.responseData.translatedText:batch[k])}}}return result}catch(e){e=\"@\\u7ffb\\u8bd1\\u5931\\u8d25\\uff1a\\n\"+e;java.log(e);java.toast(e);return typeof _texts===\"string\"?[_texts]:(_texts&&_texts.length?_texts.slice():[])}},xq_trans(){const {java,book}=this;let val=this.getTrans();if(val!==0){let needTag=this.source.get(\"bq\")==1;let intro=needTag?String(book.intro).replace(/^\\s*#.*\\n\\s*/,\"\"):book.intro+\"\";let ks=intro.split(/\\n\\s*/);if(needTag){var tags=(java.get(\"tags\")+\"\").replace(/^\\[|\\]$/g,\n\"\").split(/,\\s*/).join(\"\\uff0c\");ks.unshift(tags)}ks.unshift(book.name,book.author);if(util.noZh(intro+book.name)){let start=needTag?3:2;let arr=this.translate(ks,{start:start});let tagStr=needTag?`\\u6807\\u7b7e(\\u8bd1)\\uff1a#${arr[2].replace(/\\uff0c/g,\" #\")}\\n\\u539f\\u6807\\u7b7e\\uff1a#${tags.replace(/\\uff0c/g,\" #\")}\\n`:\"\";book.name=arr[0];book.intro=`\\u3000\\u3000\\u7ffb\\u8bd1\\uff1a\\u6a21\\u5f0f${val}\\u3001${util.lang_zh}\\n\\u539f\\u6807\\u9898\\uff1a${ks[0]}\\n\\u4f5c\\u8005(\\u8bd1)\\uff1a${arr[1]}\\n${tagStr}${\"\\u2014\".repeat(24)}\\n${arr.slice(start).join(\"\\n\").replace(/\\uff1a\\//g,\n\":/\")}`.replace(/\\n\\s*/g,\"$\\x26\\u3000\\u3000\");java.put(\"lang\",util.lang)}}},mulu_trans(list){list=list||this.result;const {java}=this;if(java.get(\"sid\")!=\"\\ud83c\\udde8\\ud83c\\uddf3\"&&java.get(\"lang\")+\"\")if(list.length>0){let titles=Array.from(list,x=>x.title);let ts=this.translate(titles,{forced:1});Array.from(list,(x,i)=>{x.title=ts[i]||x.title})}return list},noImg(v){this.source.put(\"noImg\",v=v?1:\"\");this.java.longToast(v?\"\\n\\u4e0d\\u52a0\\u8f7d\\u6b63\\u6587\\u4e2d\\u56fe\\u7247\\uff0c\\u663e\\u793a\\u5176url\\uff0c\\u56fe\\u7247\\u4f1a\\u5f71\\u54cd\\u6b63\\u6587\\u52a0\\u8f7d\\u901f\\u5ea6\\uff0c\\u6b63\\u6587\\u4e00\\u76f4\\u4e3a\\u7a7a\\u767d\\u65f6\\u5efa\\u8bae\\u5f00\\u542f\":\n\"\\n\\u52a0\\u8f7d\\u6b63\\u6587\\u4e2d\\u56fe\\u7247\\uff08\\u9ed8\\u8ba4\\uff09\\uff0c\\u8f83\\u591a\\u56fe\\u7247\\u4f1a\\u4e25\\u91cd\\u5f71\\u54cd\\u6b63\\u6587\\u52a0\\u8f7d\\u901f\\u5ea6\")},tihuan_trans(str){str=str||this.result;str=util.noZh(str)?util.fixImg(this.translate(str)):str;if(this.source.get(\"noImg\")==1)str=str.replace(/<img src=\"(.+?),.*?>/g,\"$1\");return str}};\nfunction translate(str,option){str=str||this.result;let val=this.getTrans();let isStr=!!str.split;let fn=util.translateTexts.bind(this);if(option&&option.forced||val==1)var res=fn(str,option);else if(val==0)return isStr?str:str.join(\"\\n\");else if(val==2){let arr=isStr?str.split(\"\\n\"):str;res=fn(arr,option);for(let i=option&&option.start||0,n=res.length;i<n;i++){let x=res[i];res[i]=/^<img .+>$/.test(x)?arr[i]:`${arr[i]}${x.length>6?\"\\n\":\"\"}\\ud83d\\udd04\\ufe0f${x}`}}return isStr?res.join(\"\\n\"):res}\nfunction getTrans(){let s=this.source.get(\"trans\")+\"\";if(s===\"\"){this.source.put(\"trans\",1);return 1}return isNaN(s=+s)?1:s}\nfunction changeTrans(){let n=this.getTrans();let v=n>1?0:n+1;this.source.put(\"trans\",v);\nlet modeDesc = v==0 ? \"⚫ 关闭\" : (v==1 ? \"🟢 自动识别(默认)\" : \"🟢 对照显示\");\nlet eng = this.source.get(\"teng\")+\"\";\nlet engDesc = eng===\"tx\" ? \"🔵 腾讯TranSmart\" : (eng===\"ai\" ? \"🤖 AI大模型\" : \"🟢 必应翻译(默认)\");\nlet explain = \"📖 翻译说明：\\n\" +\n\"提供自动翻译，方便阅读 pixiv 上大量的日语小说。\\n\" +\n\"自动识别日语/英语并翻译为简体中文，依据为前100个字符。\\n\" +\n\"支持三种模式：关闭 / 自动识别(默认) / 对照显示(原文+译文交替)。\\n\" +\n\"翻译内容：正文、简介、标签、作者、小说名、章节名。\\n\" +\n\"如果详情页报错，请点「🌐翻译模式」关闭翻译。\\n\\n\" +\n\"当前模式：\" + modeDesc + \"\\n\" +\n\"当前引擎：\" + engDesc + \"\\n\\n\" +\n\"💡 引擎切换请点「🔁翻译引擎」，三选一：\\n\" +\n\"🟢必应(免密钥·国内直连) → 🔵腾讯(填微软密钥走Azure官方) → 🤖AI大模型(OpenAI兼容)\";\nthis.java.longToast(explain);};\n\nfunction pxOauth(postBody) {\n\tconst {java} = this;\n\tlet time = java.timeFormatUTC(Date.now(),\"yyyy-MM-dd'T'HH:mm:ss'+00:00'\",8*60*60*1000);\n\tlet hash = timemd5(time);\n\tlet req = 'POST /auth/token HTTP/1.1\\r\\nHost: oauth.secure.pixiv.net\\r\\n'\n\t\t+'User-Agent: '+ua+'\\r\\n'\n\t\t+'content-type: application/x-www-form-urlencoded\\r\\n'/*--- 🎉 小彩蛋：推荐小说《说好低调发育，全服公告什么鬼？》作者：稀粥西洲 🎉 --- */\n\t\t+'x-client-time: '+time+'\\r\\nx-client-hash: '+hash+'\\r\\n'\n\t\t+'accept-language: '+a_l+'\\r\\napp-os: Android\\r\\napp-os-version: Android 14\\r\\napp-version: '+appv+'\\r\\n'\n\t\t+'Content-Length: '+postBody.length+'\\r\\nConnection: close\\r\\n\\r\\n'+postBody;\n\tlet sf = Packages.javax.net.ssl.SSLSocketFactory.getDefault();\n\tlet ips = ['210.140.139.155','210.140.139.152','210.140.139.158','210.140.139.161'];\n\tlet sock = null, lastErr = '';\n\tfor (let i = 0; i < ips.length; i++) {\n\t\ttry {\n\t\t\tlet addr = Packages.java.net.InetAddress.getByName(ips[i]);\n\t\t\tsock = sf.createSocket(addr, 443);\n\t\t\tsock.setSoTimeout(12000);\n\t\t\tlet os = sock.getOutputStream();\n\t\t\tos.write(new Packages.java.lang.String(req).getBytes('UTF-8'));\n\t\t\tos.flush();\n\t\t\tlet rd = new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(sock.getInputStream(),'UTF-8'));\n\t\t\tlet sb = new Packages.java.lang.StringBuilder();\n\t\t\tlet line;\n\t\t\twhile ((line = rd.readLine()) != null) { sb.append(line); sb.append('\\n'); }\n\t\t\treturn String(sb.toString());\n\t\t} catch(e) {\n\t\t\tlastErr = e;\n\t\t\ttry { if (sock != null) sock.close(); } catch(e2) {}\n\t\t}\n\t}\n\tthrow lastErr == '' ? 'oauth直连失败：无可用IP' : lastErr;\n}\n\n//🤖翻译引擎切换：必应(bing)→腾讯(tx)→AI(ai)三态循环，存书源变量teng；AI配置见登录界面AI输入框\nfunction changeEng(){var c=this.source.get(\"teng\")+\"\";if(c!==\"tx\"&&c!==\"ai\")c=\"bing\";var v=c===\"bing\"?\"tx\":(c===\"tx\"?\"ai\":\"bing\");this.source.put(\"teng\",v);this.java.toast(v===\"bing\"?\"@🟢翻译引擎：必应翻译(免密钥·国内直连)\":(v===\"tx\"?\"@🔵翻译引擎：腾讯TranSmart(微软密钥走Azure官方)\":\"@🤖翻译引擎：AI大模型(OpenAI兼容，AI密钥可选)\"))};\n", "lastUpdateTime": "1788074162884", "loginCheckJs": "//java.toast('登录检查：'+result);\n\nif (result.code() == 400) {\n\tsource.login();\n\tsleep(500);\n\tlet url = gethd(result.url());\n\tresult = java.connect(url);\n\t}\nresult", "loginUi": "[ \n     {\n        name: \"下载pixEz（支持插画、回复评论等）\",\n        type: \"button\",\n        action: \"https://gh-proxy.org/https://github.com/Notsfsssf/pixez-flutter\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        name: \"token\",\n        type: \"text\"\n    },\n    {\n        name: \"token说明\",\n        type: \"button\",\n        action: \"java.longToast(`\ntoken说明：\n填写该值后点击右上角√进行登录\n可以通过获取token按钮得到(不需要跳转app)\n阅读正式版无法支持获取token功能`);\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        name: \"获取token\",\n        type: \"button\",\n        action: \"Login()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        name: \"微软密钥(Azure·仅腾讯模式生效)\",\n        type: \"text\"\n    },\n    {\n        name: \"AI接口地址(OpenAI兼容)\",\n        type: \"text\"\n    },\n    {\n        name: \"AI密钥(OpenAI兼容·可选)\",\n        type: \"text\"\n    },\n    {\n        name: \"AI模型(OpenAI兼容·选填)\",\n        type: \"text\"\n    },\n\n    {\n        name: \"id\",\n        type: \"text\"\n    },\n    {\n        name: \"id说明\",\n        type: \"button\",\n        action: \"java.longToast(`\nid说明：\n登录时该值为空会自动填写该值，这是登录账号的ID（可手动更改）。\n发现页的收藏分类加载的该ID的收藏`);\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        name: \"搜索说明\",\n        type: \"button\",\n        action: \"java.longToast(`\n搜索说明：\n默认使用关键词搜索\n输入小说id号显示对应的小说\n输入“正文@许斌”搜索正文含许斌的小说\n输入“作者@69559022”搜索指定id作者的书`);\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        name: \"书名\",\n        type: \"text\"\n    },\n     {\n        name: \"↑追更该书\",\n        type: \"button\",\n        action: \"scz(3)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n     {\n        name: \"复制id\",\n        type: \"button\",\n        action: \"fuzhi(2)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n     {\n        name: \"取消追更\",\n        type: \"button\",\n        action: \"scz(30)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"章节\",\n        type: \"text\"\n    },\n    {\n        name: \"↑收藏该章\",\n        type: \"button\",\n        action: \"scz(1,'public')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        name: \"取消收藏\",\n        type: \"button\",\n        action: \"scz(10)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        name: \"私密收藏\",\n        type: \"button\",\n        action: \"scz(1,'private')\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n     {\n        name: \"详情\",\n        type: \"button\",\n        action: \"caption()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        name: \"作者\",\n        type: \"text\"\n    },\n    {\n        name: \"↑关注作者\",\n        type: \"button\",\n        action: \"scz(2)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n     {\n        name: \"复制id\",\n        type: \"button\",\n        action: \"fuzhi(1)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n     {\n        name: \"取消关注\",\n        type: \"button\",\n        action: \"scz(20)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"购买token\",\n        type: \"button\",\n        action: \"java.longToast('喵～购买链接被本喵挠掉啦！请勿轻信任何购买渠道，保护好你的小钱钱(๑•̀ㅂ•́)و✧')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        name: \"查看设置\",\n        type: \"button\",\n        action: \"showSettings()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        name: \"(ฅ´ω`ฅ)\",\n        type: \"button\",\n        action: \"showCatBlessing()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        name: \"🖼️图片显示\",\n        type: \"button\",\n        action: \"toggleImg()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    \t{\n        name: \"🔢补充序号\",\n        type: \"button\",\n        action: \"xvhao()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    \t{\n        name: \"📝简介标签\",\n        type: \"button\",\n        action: \"biaoqian()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    \t{\n        name: \"📘书名标识\",\n        type: \"button\",\n        action: \"gongcun()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    \t{\n        name: \"📖翻译说明\",\n        type: \"button\",\n        action:  \"java.longToast(`\\n自动翻译日语/英语为简体中文。\\n\\n【模式】点「🌐翻译模式」循环切换：关闭 → 自动识别(默认) → 对照显示。\\n\\n【引擎】点「🔁翻译引擎」循环切换：\\n🟢必应翻译：免密钥、国内直连，开箱即用；\\n🔵腾讯TranSmart：填了「微软密钥」就走 Azure 官方通道，质量更稳；没填密钥则走腾讯自有引擎(失败自动降级 MyMemory)；\\n🤖AI大模型：OpenAI 兼容接口，需填「AI接口地址」(如 https://api.deepseek.com ，/v1 自动补全)，「AI密钥」可选(部分平台免token)，「AI模型」选填默认 gpt-4o-mini。\\n\\n填完 AI 配置请点「🤖AI翻译测试」验证连通性`)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    \t{\n        name: \"🔁翻译引擎\",\n        type: \"button\",\n        action:  \"changeEng()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    \t{\n        name: \"🤖AI翻译测试\",\n        type: \"button\",\n        action:  \"util.aiTest.call(this)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    \t{\n        name: \"🌐翻译模式\",\n        type: \"button\",\n        action:  \"changeTrans()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    \t{\n        name: \"书源介绍\",\n        type: \"button\",\n        action: \"showSourceIntro()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        name: \"屏蔽标签\",\n        type: \"text\"\n    }\n]", "loginUrl": "function gongcun() {\nlet gc = source.get('gc');\nif(gc!=1) {source.put('gc',1);java.toast('🟢已开启\\n书名开头会有📘符号');}\nelse {source.put('gc',0);java.toast('⚫已关闭\\n不会添加📘');}\n\t}\nfunction xvhao() {\nlet xh = source.get('xh');\nif(xh!=1) {source.put('xh',1);java.toast('🟢已开启\\n会自动补充章节名序号');}\nelse {source.put('xh',0);java.toast('⚫已关闭\\n不会补充序号');}\n\t}\nfunction biaoqian() {\nlet bq = source.get('bq');\nif(bq!=1) {source.put('bq',1);java.toast('🟢已开启\\n会在简介显示作品标签');}\nelse {source.put('bq',0);java.toast('⚫已关闭\\n不会显示简介标签');}\n\t}\n\nfunction toggleImg() {\n    let noImg = source.get('noImg');\n    if (noImg == 1) {\n        source.put('noImg', 0);\n        java.toast('🟢 已开启显示插图');\n    } else {\n        source.put('noImg', 1);\n        java.toast('⚫ 已关闭插图显示（仅显示链接）');\n    }\n    java.reLoginView();\n}\n\nfunction showSettings() {\n    let gc = source.get('gc') == 1 ? '🟢开启' : '⚫关闭';\n    let xh = source.get('xh') == 1 ? '🟢开启' : '⚫关闭';\n    let bq = source.get('bq') == 1 ? '🟢开启' : '⚫关闭';\n    let noImg = source.get('noImg') == 1 ? '⚫隐藏' : '🟢显示';\n    let trans = source.get('trans') || '1';\n    let transMap = {'0':'⚫关闭','1':'🟢自动识别(默认)','2':'🟢对照显示'};\n    let transStr = transMap[trans] || trans;\n    let teng = source.get('teng') + '';\n    let tengMap = {'bing':'🟢必应翻译(免密钥)','tx':'🔵腾讯TranSmart','ai':'🤖AI大模型(OpenAI兼容)'};\n    let tengStr = tengMap[teng] || '🟢必应翻译(免密钥)';\n    let msg = '\\n🖼️图片显示：' + noImg + '\\n🔢补充序号：' + xh + '\\n📝简介标签：' + bq + '\\n📘书名标识：' + gc + '\\n🌐翻译模式：' + transStr + '\\n🔁翻译引擎：' + tengStr;\n    java.longToast(msg);\n}\n\nfunction showSourceIntro() {\n    let intro = '📖 本小说书源基于以下两个版本合并修改：\\n\\n1️⃣ 带公告和翻译功能的版本：\\n   由不知名人士在洛娅橙原版基础上添加了微软翻译功能，\\n   后来又被加入了商业推广广告。\\n\\n2️⃣ 由某位热心大佬修复直连后的洛娅橙原版：\\n   修复了网络直连问题，保持了原版纯净。\\n\\n✨ 猫猫黛西（由 DeepSeek 全程代劳）基于以上两个版本，\\n   去除了所有广告，\\n   进行了大量界面优化和功能调整，\\n   为您带来纯净、便捷的阅读体验。\\n\\n感谢所有为开源做出贡献的大佬们！(ฅ´ω`ฅ)';\n    java.longToast(intro);\n}\n\nfunction login() {\nlet Info = source.getLoginInfoMap();\ntry {\nlet tk = Info.token;\nif (!tk || tk == '') throw 'TOKEN为空，请先填写';\nlet body = `client_id=MOBrBDS8blbauoSck0ZfDbtuzpyT&client_secret=lsACyCD94FhDUtGTXi3QzcFE2uU1hqtDaKeqrdwj&grant_type=refresh_token&refresh_token=${tk}&include_policy=true`;\nlet rr;\ntry {\nrr = pxOauth(body);\n} catch(err) {\njava.log('px oauth直连失败，回退常规请求：'+err);\nlet time2 = java.timeFormatUTC(Date.now(),\"yyyy-MM-dd'T'HH:mm:ss'+00:00'\",8*60*60*1000);\nlet headers = {\n    'User-Agent': ua,\n    'content-type': 'application/x-www-form-urlencoded',\n    'x-client-hash': timemd5(time2),\n    'accept-language': a_l,\n    'app-version': appv,\n    'app-os-version': 'Android 6.0',\n    'x-client-time': time2,\n    'app-os': 'Android',\n    'host': 'oauth.secure.pixiv.net'\n  };\nlet url = 'https://oauth.secure.pixiv.net/auth/token';\nurl = url.replace(\"oauth.secure.pixiv.net\",\"210.140.139.155\");\nrr = String(java.post(url,body,headers).body());\n}\nif (rr.indexOf('{') >= 0) rr = rr.substring(rr.indexOf('{'));\nlet atk = rr.match(/\"access_token\"[:\\s\"]+([^\"]+)/)[1];\nsource.putLoginHeader(atk);\nif (Info.id=='') {\n\tInfo.id = com.jayway.jsonpath.JsonPath.read(rr, \"$.user.id\");}\nsource.putLoginInfo(JSON.stringify(Info));\n} catch(err) {\n\tjava.toast('\\n💔登录失败');\n\tjava.log('px登录失败：'+err);\n  \tsleep(600);}\n}\n\nfunction scz(x, restrict) {\n\tlet headers = gethd();\n\tlet url = \"https://210.140.139.155/\";\n\tlet body,nm,tt,ttt;\n\tif (x==1) {\n\t url += 'v2/novel/bookmark/add';\n\t \tlet id = cache.get('pxid');\n\t \tif (id=='') ttt='请刷新章节';\n\t \tbody = 'novel_id='+id+'&restrict=' + (restrict || 'public');\n\t \tnm = source.getLoginInfoMap().get('章节');\n\t \ttt= (restrict=='private'? '私密收藏' : '收藏');\n\t } else if(x==2) {\n\t \turl += 'v1/user/follow/add';\n\t \tlet uid = cache.get('pxuid');\n\t \tif (uid=='') ttt='请刷新章节或详情页';\n\t \tbody = 'user_id='+uid+'&restrict=public';\n\t \tnm = source.getLoginInfoMap().get('作者');\n\t \ttt='关注';\n\t \t} else if(x==10) {\n\t \turl += 'v1/novel/bookmark/delete';\n\t \tlet id = String(cache.get('pxid'));\n\t \tbody = id ? 'novel_id='+id : '';\n\t \tnm = source.getLoginInfoMap().get('章节');\n\t \ttt='取消收藏';\n\t \t} else if(x==20) {\n\t \turl += 'v1/user/follow/delete';\n\t \tlet uid = String(cache.get('pxuid'));\n\t \tbody = uid ? 'user_id='+uid : '';\n\t \tnm = source.getLoginInfoMap().get('作者');\n\t \ttt='取消关注';\n\t \t} else if(x==3) {\n\t \turl += 'v1/watchlist/novel/add';\n\t \tlet sid = cache.get('pxsid');\n\t \tif (sid=='') ttt='请刷新详情页';\n\t \tbody = 'series_id='+sid;\n\t \tnm = source.getLoginInfoMap().get('书名');\n\t \ttt='追更';\n\t \t} else if(x==30) {\n\t \turl += 'v1/watchlist/novel/delete';\n\t \tlet sid = String(cache.get('pxsid'));\n\t \tbody = sid ? 'series_id='+sid : '';\n\t \tnm = source.getLoginInfoMap().get('书名');\n\t \ttt='取消追更';\n\t \t}\n\n\ttry {\n\t\tif (ttt) {java.longToast(ttt);throw 't空';}\n\t\tif (!body) throw 'b空';\n\t\theaders['host']='app-api.pixiv.net';\n\t\tlet jg = java.post(url,body,headers).statusCode();\n\t\tif (jg!=200) throw tt+'响应码异常';\n\t\telse java.longToast(`\\n已${tt}：\\n${nm}`);\n\t\t} catch(e) {\n\t\t\tif (!ttt) java.toast(`\\n${tt}失败`);\n\t\t\tjava.log(e);}\n\t}\n\nfunction reck() {\nsource.removeLoginHeader();\ncookie.removeCookie('https://accounts.pixiv.net');\ncookie.removeCookie('https://accounts.google.com');\ncookie.removeCookie('https://api.weibo.com');\n\t}\n\nfunction Login() {\nlet rkey = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';\nlet cv='';\nfor (let i = 0; i < 128; i++) {\n\tlet ra = Math.floor(Math.random()*rkey.length);\n\tcv+=rkey.charAt(ra);}\n\nlet aly = new JavaImporter(\nPackages.cn.hutool.crypto.digest.Digester,\nPackages.cn.hutool.core.codec.Base64,\nPackages.cn.hutool.crypto.digest.DigestAlgorithm);\nwith (aly) {\n\tlet asBs =  Packages.java.lang.String(cv).getBytes(\"US-ASCII\");\n\tlet digester = new Digester(DigestAlgorithm.SHA256);\n\tlet hashBs = digester.digest(asBs);\n\tvar codeChallenge  = Base64.encodeUrlSafe(hashBs);\n}\n\nlet urllg =`https://app-api.pixiv.net/web/v1/login?code_challenge=${codeChallenge}&code_challenge_method=S256&client=pixiv-android`;\nreck();\n\nlet wbua=java.getWebViewUA().replaceAll(\"; wv| Version\\/4.0\",'')+'';\nif (/HUA\\s*WEI/i.test(wbua))\nwbua=\"Mozilla/5.0 (Linux; Android 14; RMX3366 Build/UKQ1.230924.001) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.7049.100 Mobile Safari/537.36\";\n\nlet bb=java.startBrowserAwait(urllg+`,{\n\"headers\":{\n\t\"User-Agent\": \"${wbua}\"\n\t}}`,'登录',false).body();\nlet code;\nif (bb.includes('<title>Online com')) {\nsleep(600);\njava.toast('稍等');\nlet over = java.webViewGetOverrideUrl(bb,'https://app-api.pixiv.net/','','pixiv:.*');\ncode = over.match(/code=([^&]+)/);\n}\nreck();\n\nlet token;\nif (code) {\nlet tkurl = 'https://oauth.secure.pixiv.net/auth/token';\nlet headers = gethd();\nlet body = `code_verifier=${cv}&code=${code[1]}&grant_type=authorization_code&redirect_uri=https://app-api.pixiv.net/web/v1/users/auth/pixiv/callback&client_id=MOBrBDS8blbauoSck0ZfDbtuzpyT&client_secret=lsACyCD94FhDUtGTXi3QzcFE2uU1hqtDaKeqrdwj&include_policy=true`;\nlet tkr = java.post(tkurl,body,headers);\ntoken = tkr.body().match(/refresh_token\":\"([^\"]+)/);\n}\n\nif (token) {\nlet htm = `data:text/html;charset=utf-8,<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><style>\nh2 {\n\ttext-align: center;\n\tline-height: 6;}\ntextarea {\n\tfont-size: 12px;\n\twidth: 96%;\n\tmargin: 10px 2%;\n\tpadding: 6px;}\n.ann {\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\theight: 50vh;}\nbutton {\n\tbackground-color: rgb(76,175,80);\n\tcolor: white;\n\tborder: none;\n\tborder-radius: 4px;\n\theight: 6vh;\n\twidth: 30vw;\n\toverflow: hidden;\n\ttransition: font-size 0.3s;\n\tfont-size: 16px;}\n.an-s {\n\tfont-size: 12px;}\n.alert-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\tbackground: rgba(0, 0, 0, 0.6);\n\tdisplay: none;\n\tjustify-content: center;\n\talign-items: center;\n\tz-index: 9999;}\n.alert-box {\n\tbackground: rgb(232,234,246);\n\tpadding: 10px;\n\tborder-radius: 12px;\n\tbox-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);\n\tmin-width: 100px;\n\ttext-align: center;}\n</style></head>\n<body>\n<div class=\"alert-overlay\" id=\"alertO\">\n <div class=\"alert-box\">\n  <p>已复制到剪贴板：</p>\n  <p id=\"alertM\" style=\"font-size: 12px;\"></p>\n </div>\n</div>\n<h2>Token获取成功🥳</h2>\n<textarea readonly id=\"copyt\" rows=\"3\">${token[1]}</textarea>\n<p style=\"font-size: 12px;\">请复制粘贴到登录界面的token框，然后点击√进行登录</p>\n<div class=\"ann\">\n<button id=\"btn1\" onclick=\"copy()\">复制</button>\n</div>\n<script>\nfunction showAlert(txt, time) {\nconst overlay = document.getElementById('alertO');\nconst message = document.getElementById('alertM');\nmessage.textContent = txt;\noverlay.style.display = 'flex';\nif (time > 0) {\n\tsetTimeout(() => {\n\t\toverlay.style.display = 'none';\n\t\t}, time);\n\t}\n}\nfunction copy() {\nconst btn = document.getElementById('btn1');\nbtn.classList.add('an-s');\nconst cpt = document.getElementById(\"copyt\");\ncpt.select();\ntry {\n    const cpy = document.execCommand(\"copy\");\n    if (cpy.length<9) throw '异常';\n    showAlert(cpt.value, 1000);\n  } catch (e) {alert(\"复制失败，请手动复制\");}\nsetTimeout(() => {\n\tbtn.classList.remove('an-s');\n\t}, 450);\n}\n</script>\n</body></html>`;\n\njava.startBrowser(htm,'获取token');\njava.log(token[1]);\n\t} else {sleep(700);java.toast('获取失败😭');}\n}\n\nfunction fuzhi(x) {\n\tif (x==1) {\n\tlet uid = cache.get('pxuid');\n\tcopy(uid);}\n\tif (x==2) {\n\tlet sid = cache.get('pxsid');\n\tcopy(sid);}\n\t}\n\nfunction caption() {\n\tlet lyc=cache.getFromMemory('pxcjj');\n\tif (lyc) lookc(lyc);\n\telse java.longToast('请刷新正文');\n\t}\n\nfunction showCatBlessing() {\n    var catBlessings = [\n        '猫猫祝你今天心情超好～ 多笑笑，好运自然来喵！(ฅ´ω`ฅ)',\n        '愿猫猫的柔软治愈你～ 今天也要好好吃饭、好好休息喵！',\n        '猫猫保佑你嘎嘎！今天更容易发现生活中的小确幸哦～',\n        '愿你像猫猫一样慵懒又幸福，鱼干自由，阳光满屋喵！',\n        '猫猫说：你今天超棒的！继续保持，好运正在路上喵～',\n        '愿你今天眼睛亮亮的，发现更多美好，烦恼统统退散喵！',\n        '猫猫赐你一天好心情buff！不易低落，不易烦躁，开心一整天喵！',\n        '愿你今天皮肤光滑、心情愉悦，像猫猫一样优雅又自在喵！',\n        '猫猫觉得你很有眼缘～ 今天运气会变好，惊喜等着你喵！',\n        '愿你今天精神饱满，做事顺顺利利，猫猫在背后保佑你喵！',\n        '哈！(ᗒᗣᗕ)՞',\n        '愿你今天说话都特别顺溜，好运buff已到位，冲鸭！'\n    ];\n    var idx = Math.floor(Math.random() * catBlessings.length);\n    java.longToast('猫猫黛西：' + catBlessings[idx]);\n}\n\nfunction showTransHelp() {\n    let eng = source.get('teng') + '';\n    let engMap = {'bing':'🟢必应翻译\\n   免密钥、国内直连，开箱即用',\n                  'tx':'🔵腾讯TranSmart\\n   填了微软密钥走 Azure 官方；未填走腾讯自有引擎',\n                  'ai':'🤖AI大模型\\n   OpenAI 兼容接口，需填 AI 接口地址'};\n    let msg = '📖 翻译说明\\n\\n'\n        + '【模式】「🌐翻译模式」循环：关闭 → 自动识别(默认) → 对照显示\\n'\n        + '【引擎】「🔁翻译引擎」循环：必应 → 腾讯 → AI\\n\\n'\n        + '当前引擎：' + (engMap[eng] || engMap['bing']) + '\\n\\n'\n        + '翻译范围：正文 / 简介 / 标签 / 作者 / 小说名 / 章节名\\n'\n        + '识别依据：正文前 100 个字符判定日语或英语\\n'\n        + '详情页报错时请先关闭翻译';\n    java.longToast(msg);\n}\n\n", "respondTime": 180705, "ruleBookInfo": {"author": "$.novel_series_detail.user.name\n<js>\nlet uid = java.get('uid');\nlet auth = result || String(book.author).replace(/[\\u200b]+/,'');\nif (uid == '') {uid = java.getString('$.novel_series_detail.user.id');}\nlet Info=source.getLoginInfoMap();\nInfo['作者'] = auth;\ncache.put('pxuid',uid);\nsource.putLoginInfo(JSON.stringify(Info));\n'\\u200b' + auth\n</js>", "canReName": "1", "init": "<js>\nvar sid = java.get('sid');\nlet i = String(book.bookUrl).includes('https:/');\nif (i) { sid = String(book.bookUrl).match(/\\d{3,}$/);}\n\ncache.deleteMemory('pxcjj');\nif (sid == '🇨🇳') {\n\tlet Info=source.getLoginInfoMap();\n\tlet bkn = String(book.name);\n\tlet id = java.hexDecodeToString(result).match(/\\d+$/)[0];\n\tInfo['书名'] = '';\n\tcache.put('pxsid','');\n\tInfo['章节'] = bkn;\n\tcache.put('pxid',id);\n\tsource.putLoginInfo(JSON.stringify(Info));\n\tlet length = leng(bkn);\t\nbook.intro = (source.get('bq')==1?String(java.get('tags')).replace(/, /g,' #').replace('[','　　#').replace(']','\\n　　'):'') + (length>18?('《'+book.name+'》\\n'):'') + java.get('jianjie');\n\trr='1';\n\n} else {\nlet url = 'https://app-api.pixiv.net/v2/novel/series?series_id=' + sid;\nbook.bookUrl = `data:;base64,${java.base64Encode(url)},{\"type\":\"px\"}`;\n\ntry {\n\njg = java.connect(gethd(url));\nrr = jg.body();\nif (jg.code() == 400) {\n\tsource.login();\n\tPackages.java.lang.Thread.sleep(500);\n\trr = java.ajax(gethd(url));\n\t}\n\n} catch(err) {\n\trr={};\n\tjava.toast('详情页链接加载失败'+sid);\n\t}\n\njava.setContent(rr);\n\ntry {\nlet tm = java.getString('$.novel_series_latest_novel.create_date');\nlet d = new Date(tm);\nd = java.timeFormatUTC(d,'yy/MM/dd',8*60*60*1000);\nbook.kind = String(book.kind).replace(/\\d+\\/\\d+\\/\\d+|$/,d).replace('null','');\n} catch(err) {java.toast('详情页内容错误');}\n\nlet bkn = String(java.getString('$.novel_series_detail.title')).replace(/^《(.+)》$/,'$1');\nbook.name = bkn.replace(/[(（].{0,9}((?:仙侠|纯爱|后宫|萝莉).?){3,}.{0,9}[)）](?=\\s*[一-ꀀ])/,'');\n\nif (book.name == '') {\n\tlet txte = java.getString('$..user_message',rr);\n\tjava.longToast('\\n未获取到书名\\n'+txte);\n\t} else {\n\t\n\tlet Info=source.getLoginInfoMap();\n\tInfo['书名'] = book.name;\n\tcache.put('pxsid',sid);\n\tInfo['章节'] = '';\n\tcache.put('pxid','');\n\tsource.putLoginInfo(JSON.stringify(Info));\n\t\n\tif (source.get('gc') == 1) book.name='📘'+book.name;\n\t}\n\nif (book.coverUrl == null) {\n\tlet img = java.getString('$.novel_series_latest_novel.image_urls.large');\n\tbook.coverUrl = gethdi(img);\n}\n\nlet length = leng(String(book.name));\nif (length > 18) length= '《'+String(book.name).replace(/^📘/,'')+'》\\n';\nelse length = '';\nlet jianjie = java.getString('$.novel_series_detail.caption');\nbook.intro = (source.get('bq')==1?String(java.get('tags')).replace(/, /g,' #').replace('[','　　#').replace(']','\\n　　'):'') + length + java.get('jianjie');\njava.put('jianjie',jianjie);\njava.put(\"bookr\",rr);\n}\nutil.xq_trans.call(this);\nrr\n</js>", "lastChapter": "$.novel_series_latest_novel.title##[【《]?{{book.name}}[》】]?", "tocUrl": "@js:book.bookUrl", "wordCount": "$.novel_series_detail.total_character_count"}, "ruleContent": {"content": "script.0@html\n<js>\nlet rr = result.match(/novel:\\s*({.+})/)[1];\nlet id = String(chapter.url).match(/\\d+(?=$|,)/)[0];\n\nlet bin = book.durChapterIndex;\nlet cin = chapter.index;\nlet inn = cin - bin;\nif (inn==0) {\nlet rra = result.match(/authorDetails:\\s*({.+})/)[1];\nlet uid = java.getString('$..userId',rra);\nlet unm = java.getString('$..userName',rra);\nlet uim = java.getString('$..url',rra);\nuim = uim.replace('i.pximg.net','pximg.hakurei.cc');\nlet ugz = java.getString('$..isFollowed',rra);\nlet tags = java.getStringList('$..tags[*]',rr);\ntags = Array.from(tags).map(x => `＃${x}`).join(' ');\nlet caption = String(java.getString('$..caption',rr));\ncaption = caption ? '<p>'+caption.replace(/(?:<br \\/>)+/g, '</p><p>')+'</p>' : '';\nlet cdate = java.getString('$..cdate',rr);\nlet xh = java.getString('$..rating.like',rr);\nlet sc = java.getString('$..rating.bookmark',rr);\nlet gk = java.getString('$..rating.view',rr);\nlet title = java.getString('$.title',rr);\nlet sTitle = java.getString('$.seriesTitle',rr);\ncache.putMemory('pxcjj',[title,uid,unm,uim,tags,caption,cdate,xh,sc,gk,sTitle,id,ugz]);\ncache.put('pxuid',uid);\ncache.put('pxid',id);\nlet Info=source.getLoginInfoMap();\n\nlet sid = java.get('sid');\nif (sid != '🇨🇳') {\n\tInfo['书名']=String(book.name).replace(/^📘/,'');\n\tcache.put('pxsid',sid);} else {\n\tInfo['书名']='';\n\tcache.put('pxsid','');}\n\nInfo['章节'] = chapter.title;\nInfo['作者'] = book.author.replace('\\u200b','');\nsource.putLoginInfo(JSON.stringify(Info));\n}\n\nlet urls = java.getString('$..urls',rr);\nlet tt = String(java.getString('$.text',rr));\nlet img1 = tt.match(/\\[uploadedimage\\:\\d+\\]/g)||'';\nlet img2 = tt.match(/\\[pixivimage\\:[\\d\\-]+\\]/g)||'';\nfor (x of img1) {\n\tlet id = x.match(/\\d+/)[0];\n\tlet url = java.getString('$..'+id+'.urls.original',rr);\n\tlet re = new RegExp('\\\\[uploadedimage\\\\:'+id+'\\\\]');\n\ttt = tt.replace(re,'<img src=\"'+gethdi(url)+'\"/>');\n\t}\nfor (x of img2) {\n\tlet id = x.match(/[\\d\\-]+/)[0];\n\tlet url = java.getString('$..'+id+'..images.original',rr);\n\tif (url=='null') url = java.getString('$..'+id+'..images.medium',rr);\n\tlet re = new RegExp('\\\\[pixivimage\\\\:'+id+'\\\\]');\n\ttt = tt.replace(re,'<img src=\"'+gethdi(url)+'\"/>');\n\t}\ntt.replaceAll('[newpage]','\\n—换页符—\\n').replace(/\\[\\[jumpuri\\:(.+)\\>.+\\]\\]/,'🖇️$1🖇️')\n</js>", "replaceRegex": "@js:util.tihuan_trans.call(this);"}, "ruleExplore": {"author": "@js:\nlet uid = java.getString('$.user.id');\njava.put('uid',uid);\njava.getString('$.user.name');", "bookList": "<js>\nif (baseUrl.startsWith('http://127.') ) {\n\trr = [{}];\n\t} else {\nlet nurl = java.getString('$.next_url');\nif (nurl == '') {\n\tjava.toast('发现页到底了');\n\tsource.put('nurl','http://127.0.0.1');\n\t}\nelse {\n\tsource.put('nurl',nurl);\n\t}\nif (baseUrl.includes('/watchlist/novel') ) {\n\trr = java.getElement(\"$.series\");\n\t} else { rr = java.getElement(\"$.novels\");}\n\n}\nrr\n</js>", "bookUrl": "<js>\nlet id = java.getString('$.id');\nlet sid = java.getString('$.series.id');\nlet rr = 'https://app-api.pixiv.net/webview/v2/novel?id=' + id;\n\nif (baseUrl.includes('/watchlist/novel') ) {\n\tsid = id;\n\tif (source.get('gc')=='1') book.name='📘'+book.name;\n}\nelse if (sid=='') {sid='🇨🇳';}\nelse {\n\tlet jj = java.get('jianjie');\n\tjava.put('jianjie',book.name+'\\n'+jj);\n}\njava.put('sid',sid);\n`data:;base64,${java.base64Encode(rr)},{\"type\":\"px\"}`\n</js>", "coverUrl": "<js>\nif (baseUrl.includes('/watchlist/novel') ) {url = java.getString('$.url');}\nelse {url = java.getString('$.image_urls.large');}\ngethdi(url);\n</js>", "intro": "<js>\nlet jj = java.get('jianjie');\nlet rr = '\\n' + java.getString('$.caption');\nlet rs = java.htmlFormat(rr);\njava.put('jianjie',rs);\njj + rs\n</js>", "kind": "@js:\nif (baseUrl.includes('/watchlist/novel') ) {\n\trrr = '';\n\tjava.put('tags','');\n\ttm = java.getString('$.last_published_content_datetime');\n\t} else {\n\t\tlet tags=java.get('tags');\n\t\trr=String(tags).slice(1,-1).split(', ');\n\t\trrr = rr.filter(i => biaoq.test(i) );\n\t\trr.forEach(x=>{\n\t\t\tif (x=='萝莉') {\n\t\t\t\tif (!rrr.includes('幼女')) rrr.unshift(x);}\n\t\t\telse if (['熟女','淫妻'].includes(x)) {\n\t\t\t\tif (!rrr.includes('人妻')) rrr.unshift(x);}\n\t\t\telse if (['仙侠','古风','武侠'].includes(x) && !rrr.some(y=>/[修仙古风武侠]{2}/.test(y))) {\n\t\t\t\t\trrr.unshift(x);}\n\t});\n\t\ttm = java.getString('$.create_date');\n}\nlet d=new Date(tm);\nd=java.timeFormatUTC(d,'yy/MM/dd',8*60*60*1000);\n\nrrr.toString()+','+d", "name": "@js:\nresult = String(java.getString('$.title'));\nlet bookn = String(java.getString('$.series.title')).replace(/^《(.+)》$/,'$1');\nif (bookn != '') {\n\tjava.put('jianjie', '《'+bookn+'》\\n');\n\tresult = result.replace(bookn,'♸').replace(/[《【]?♸[】》]?/,'')||result;\n\t}\nresult = result.replace(/[(（].{0,9}((?:仙侠|纯爱|后宫|萝莉).?){3,}.{0,9}[)）](?=\\s*[一-ꀀ])/,'').replace(/《(.+)》/,'$1');\n\nlet tags = java.getStringList('$.tags..name');\njava.put('tags',tags);\ntags=String(tags).slice(1,-1).split(/, |\\//);\nlet bptag=source.getLoginInfoMap()['屏蔽标签']||'';\nif (bptag!='') {\n\tbptag = String(bptag).split(/[,\\|]/).map(x=>x.replace('#',''))\nfor (let char of tags)\nif (bptag.includes(char)) result=''\n}\nresult", "wordCount": "$.text_length"}, "ruleSearch": {"author": "<js>\n{{(source.ruleExplore.author).replace('@js:','')}}\n</js>", "bookList": "<js>\npage=cache.getFromMemory('pxpage');\ncache.deleteMemory('pxpage');\nif (baseUrl.startsWith('http://127.')) {rr = [{}];}\n\nelse {\nrr = java.getElement('$.novels');\nnurl = java.getString('$.next_url');\nif (rr.length<6&&page==1&&nurl!='') {\n\tsleep(500);\n\trs = java.ajax(gethd(nurl));\n\tjava.setContent(rs)\n\trrr = java.getElement('$.novels');\n\trr.addAll(rrr);\n\tnurl = java.getString('$.next_url');\n}\n\nif (nurl == '') {\n\tjava.toast('搜索页到底了');\n\tsource.put('nurls','http://127.0.0.1');\n\t} else {source.put('nurls',nurl);}\n\n}\nrr\n</js>", "bookUrl": "<js>\nlet id = java.getString('$.id');\nlet sid = java.getString('$.series.id');\nif (sid=='') {\n\tsid='🇨🇳';\n\t} else {\n\tlet jj = java.get('jianjie');\n\tjava.put('jianjie',book.name+'\\n'+jj);\n\t}\nlet rr = 'https://app-api.pixiv.net/webview/v2/novel?id=' + id;\njava.put('sid',sid);\n`data:;base64,${java.base64Encode(rr)},{\"type\":\"px\"}`\n</js>", "coverUrl": "$.image_urls.large\n<js>\ngethdi(result);\n</js>", "intro": "<js>\nlet jj = java.get('jianjie');\nlet rr = '\\n' + java.getString('$.caption');\nlet rs = java.htmlFormat(rr);\njava.put('jianjie',rs);\njj + rs\n</js>", "kind": "<js>\n{{(source.ruleExplore.kind).replace('@js:','')}}\n</js>", "name": "<js>\n{{(source.ruleExplore.name).replace('@js:','')}}\n</js>", "wordCount": "$.text_length"}, "ruleToc": {"chapterList": "<js>\nlet sid = java.get('sid');\nif (sid == '🇨🇳') {result=[result];}\nelse {\n\ttry {\n\t\tlet url = java.hexDecodeToString(result);\nlet bookr=java.get('bookr')+'';\nif (!bookr) {\n\tlet rs=java.connect(gethd(url));\n\tif (rs.code() == 400) {\n\t\tsource.login();\n\t\tsleep(500);\n\t\trs=java.connect(gethd(url));}\nbookr=rs.body();}\n\t\tjava.setContent(bookr);\n\t\tjava.put('bookr','');\n\t\t} catch(e){}\nresult = java.getElement('$.novels');\n}\nutil.mulu_trans.call(this);\nresult\n</js>", "chapterName": "<js>\nlet sid = java.get('sid');\nif (sid == '🇨🇳') {cc=book.name;}\nelse {\nlet title = java.getString('$.title');\ntitle = String(title).replace(/[(（].{0,9}((?:仙侠|纯爱|后宫|萝莉).?){3,}.{0,9}[)）](?=\\s*[一-ꀀ])/,'');\nlet bkn=String(book.name).replace(/^📘|[。？！]+$/g,'');\ncc = title.replace(bkn,'♸').replace(/[《【]♸[。？！]*[】》]\\s*|♸[。？！\\s]*/,'')||title;\n\t}\nif (source.get('xh')==1) {\n\tcc='▫️'+cc;\n}\n\tcc\n</js>", "chapterUrl": "<js>\nlet sid = java.get('sid');\nif (sid == '🇨🇳') {\n\t\tuu=java.hexDecodeToString(result);\n\t\tbook.putCustomVariable('这是单贴，链接：'+uu);\n\t}\nelse {\nlet id = java.getString('$.id');\nuu='https://app-api.pixiv.net/webview/v2/novel?id=' + id;\n}\ngethd(uu);\n</js>", "formatJs": "title.replace(/^▫️(?![第序]|#?第?[\\d零一二三四五六七八九十百千]+[章回])/,'第'+index+'章 ').replace(/^▫️/,'');", "nextTocUrl": "$.next_url\n<js>\nif (result!='[]') {\nresult=gethd(result[0]);\n}else{result=[];}\nresult\n</js>", "updateTime": "$.create_date\n<js>\nif (result) {\nlet d=new Date(result);\nupt=java.timeFormatUTC(d,\"yyyy/MM/dd HH:mm\",8*60*60*1000);\n}\nelse '';\n</js>"}, "searchUrl": "<js>\nif (page == 1) {\ncache.putMemory('pxpage',page);\n\t\tif (/^\\u200b/.test(key)) {\n\t\t\tlet uid = cache.getFromMemory('pxuid');\n\t\t\tif (uid=='') java.longToast('\\n请刷新书籍');\n\t\t\telse url = 'https://app-api.pixiv.net/v1/user/novels?filter=for_android&user_id=' + uid;}\n\t\telse if (key.startsWith('作者@')) {\n\t\t\tlet uid = key.slice(3);\n\t\t\tif (!/^\\d{3,}$/.test(uid)) java.longToast('\\n请输入正确的id');\n\t\t\telse url = 'https://app-api.pixiv.net/v1/user/novels?filter=for_android&user_id='+uid;\t}\n\t\telse if (/\\d{5,}$/.test(key) ) {\n\t\t\tlet sid = key.match(/\\d+$/)[0];\n\t\t\tjava.put('sid',sid);\n\t\t\tif (key.startsWith('作者')) java.longToast('\\n请输入正确的搜索格式');\n\t\t\telse url = `data:;base64,${java.base64Encode(sid)},{\"type\":\"\"}`;}\n\t\telse if (key.startsWith('正文@')) {\n\t\t\turl = 'https://app-api.pixiv.net/v1/search/novel?filter=for_android&merge_plain_keyword_results=true&sort=date_desc&search_target=text&word='+key.slice(3);}\n\t\telse { url = 'https://app-api.pixiv.net/v1/search/novel?filter=for_android&merge_plain_keyword_results=true&word='+key;}\nsource.put('nurls','http://127.0.0.1');\n\n} else {url = source.get('nurls');}\ngethd(url)\n</js>", "weight": 0},{"bookSourceComment": "漫画详情未增加，搜索未增加，大部分漫画功能实现", "bookSourceGroup": "🙈,pixiv", "bookSourceName": "🌈pixiv小说（免梯小说漫画）", "bookSourceType": 0, "bookSourceUrl": "https://pixiv小说.luoyacheng.ip-ddns.com##测试版", "bookUrlPattern": "http://localhost/|https://www.pixiv.net/novel/series/\\d{3,}", "concurrentRate": "3/2000", "customButton": false, "customOrder": 174, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nvar loginInfo = JSON.parse(source.getLoginInfo() || \"{}\");\n\nlet banben=\"1.1.9\";\nvar obj = {\n\t\"►漫画◄\": {\n        \"url\": ``,\n        \"fb\": 1\n    },\n\"动态\": {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https://app-api.pixiv.net/v2/illust/follow?restrict=all';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n        }}`\n    },\n\"推荐\": {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https://app-api.pixiv.net/v1/illust/recommended?filter=for_ios&include_ranking_label=true';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n        }}`\n    },\n    \"收藏\": {\n        \"url\": `{{\n            if (page == 1) {\n                let id = source.getLoginInfoMap().get('id');\n                url = 'https://app-api.pixiv.net/v1/user/bookmarks/illust?user_id='+id+'&restrict=public';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n        }}`,\n        \"wb\": 1\n    },\n    \"追更\": {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https://app-api.pixiv.net/v1/watchlist/manga';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n        }}`\n    },\n    \"►小说◄\": {\n        \"url\": ``,\n        \"fb\": 1\n    },\n    \"动 态\": {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https://app-api.pixiv.net/v1/novel/follow?restrict=public';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n        }}`\n    },\n    \"推 荐\": {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https://app-api.pixiv.net/v1/novel/recommended?include_privacy_policy=true&filter=for_android&include_ranking_novels=true';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n        }}`\n    },\n    \"收 藏\": {\n        \"url\": `{{\n            if (page == 1) {\n                let id = source.getLoginInfoMap().get('id');\n                url = 'https://app-api.pixiv.net/v1/user/bookmarks/novel?user_id='+id+'&restrict=public';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n        }}`,\n        \"wb\": 1\n    },\n    \"追 更\": {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https://app-api.pixiv.net/v1/watchlist/novel';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n        }}`\n    },\n    \"ⅹⅷ\": {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https://app-api.pixiv.net/v1/novel/ranking?filter=for_android&mode=day_r18';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n        }}`,\n        \"wb\": 1,\n        \"fb\": 0.25\n    },\n    \"ⅹⅷ_AI\": {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https://app-api.pixiv.net/v1/novel/ranking?filter=for_android&mode=week_ai_r18';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n        }}`,\n        \"fb\": 0.25\n    },\n    \"ⅹⅷ_WK\": {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https://app-api.pixiv.net/v1/novel/ranking?filter=for_android&mode=week_r18';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n        }}`,\n        \"fb\": 0.25\n    }\n};\n\nif (loginInfo && loginInfo[\"tag\"] && typeof loginInfo[\"tag\"] === \"string\") {\n    var tagArr = loginInfo[\"tag\"].split(/[,，|]/);\n    var validTagArr = [];\n    for (var i = 0; i < tagArr.length; i++) {\n        var tag = tagArr[i].trim();\n        if (tag !== \"\") {\n            validTagArr.push(tag);\n        }\n    }\n    for (var j = 0; j < validTagArr.length; j++) {\n        var item = validTagArr[j];\n        var key = item;\n        var urlTemplate = \"{{if (page == 1) {url = 'https://app-api.pixiv.net/v1/search/novel?filter=for_android&merge_plain_keyword_results=true&word=\" + item + \"';} else {url = source.get('nurl');} url=gethd(url);}}\";\n        obj[key] = { url: urlTemplate };\n    }\n}\n\n\nvar sort = [];\npush = (title, url, fg, wrap, fb) => sort.push({\n    \"title\": title,\n    \"url\": url,\n    \"style\": {\n      layout_flexGrow: fg || 1,\n      layout_flexBasisPercent: fb||-1,\n      layout_wrapBefore: wrap ? true : false\n     }\n  });\n\nfor (x in obj) {\npush(x, obj[x].url, obj[x].fg, obj[x].wb, obj[x].fb);\n}\nJSON.stringify(sort);", "header": "@js:\n(()=>{\n\tlet headers = gethd();\n\treturn JSON.stringify(headers);\n})();", "jsLib": "//参考自开源项目：pixez-flutter🙏\nsleep = Packages.java.lang.Thread.sleep;\nua = 'PixivAndroidApp/5.0.166 (Android 14; RMX3366)';\nappv = '5.0.166';\na_l = 'zh-CN';\n\nbiaoq = new RegExp('^(?:NTR|NTL|修仙|奇幻|后宫|纯爱|隐奸|乱伦|乱交|母女.?|母子|父女|幼女|姐弟|人妻|正太|足交|口交|肛交|丝袜|催眠|系统|原创|续写|软饭流|修罗场|规则怪谈|女性视角|性开放世界|奸尸|冰恋|.?重口)$','i');\n\nfunction timemd5(time) {\n\tvar saltStr = time + '28c1fdd170a5204386cb1313c7077b34f83e4aaf4aa829ce78c231e05b0bae2c';\n\ttry {\n\t\tvar jv = this.java || (typeof java !== 'undefined' ? java : null);\n\t\tif (jv && jv.md5Encode) return jv.md5Encode(saltStr);\n\t} catch(e) {}\n\tvar md = Packages.java.security.MessageDigest.getInstance(\"MD5\");\n\tmd.update(new Packages.java.lang.String(saltStr).getBytes(\"UTF-8\"));\n\tvar dg = md.digest();\n\tvar hx = '';\n\tfor (var di = 0; di < dg.length; di++) {\n\t\tvar bv = dg[di] & 0xFF;\n\t\thx += (bv < 16 ? '0' : '') + bv.toString(16);\n\t}\n\treturn hx;\n}\n\nfunction gethd(url='',ck='') {\n\tconst {java, source} = this;\nlet time = java.timeFormatUTC(Date.now(),\"yyyy-MM-dd'T'HH:mm:ss'+00:00'\",8*60*60*1000);\nlet hash = this.timemd5(time);\nlet atk = source.getLoginHeader()||'';\nif(atk) atk = String('Bearer '+atk);\nlet headers = {\n    'x-client-time': time,\n    \t'User-Agent': ua,\n    \t'accept-language': a_l,\n    \t'authorization': atk,\n    \t'app-os': 'Android',\n    \t'app-os-version': 'Android 14',\n    \t'app-version': appv,\n    'x-client-hash': hash,\n    'cookie': ''\n    \t }\nck!='' && (headers['cookie']=ck);\nurl=url.replace(\"app-api.pixiv.net\",\"210.140.139.155\");\nurl && (headers['host']='app-api.pixiv.net');\nif (url=='') return headers;\nelse if (url.startsWith('data')) return url;\nelse {\n\tdelete headers['x-client-time'];\n\tdelete headers['x-client-hash'];\n\treturn url + ',' + JSON.stringify({'headers':headers});}\n};\n\n\nfunction leng(str) {\n\tlet length = 0;\n\tconst fuhao = ',.?!:;()[]\"';\n\tconst fuhao2 = '📘';\n\tfor (let char of str) {\n\t\tif (fuhao.includes(char) ) length += 0.5;\n\t\telse if (fuhao2.includes(char) ) length += 2;\n\t\telse length += 1;\n\t\t}\n\t\treturn length;\n}\n\nfunction gethdi(url='') {\turl=url.replace(\"i.pximg.net\",\"210.140.139.133\");\nlet imgoptions = {\n  headers: {\n    'User-Agent': 'PixivIOSApp/5.8.0',\n    'accept-encoding': 'gzip, br',\n    'referer': 'https://app-api.pixiv.net/',\n    'host': 'i.pximg.net'\n    }\n  };\n  return url+','+JSON.stringify(imgoptions);\n }\n \nfunction copy(txt) {\n\tlet htm = `data:text/html;charset=utf-8,<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<style>\nbody {\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: center;\n\talign-items: center;\n\theight: 60vh;}\n</style>\n</head>\n<body>\n<textarea id=\"copyt\" rows=\"3\">${txt}</textarea>\n<br>\n<button id=\"btn1\" onclick=\"copy()\">复制</button>\n<script>\ndocument.addEventListener(\"DOMContentLoaded\", function () {\nconst textarea = document.getElementById(\"copyt\");\ntextarea.style.height = \"auto\";\ntextarea.style.height = textarea.scrollHeight + \"px\";});\nfunction copy() {\nconst cpt = document.getElementById(\"copyt\");\ncpt.select();\ndocument.execCommand(\"copy\");}\n</script>\n</body></html>`;\nthis.java.startBrowser(htm,'复制');\n\t}\n\n\nfunction lookc(lyc) {\nconst [title,uid,unm,uim,tags,caption,cdate,xh,sc,gk,sTitle,id,ugz] = lyc;\n\tlet htm = `<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<style>\ntable {\n\twidth: 100%;\n\ttable-layout: fixed;\n\ttext-align: center;\n\tmargin: 0 auto;\n\tword-break: break-all;\n\t}\ntd img {\n\twidth: 100%;\n\theight: 100%;\n\tobject-fit: contain;\n\t}\n.cap {\n\t text-align: left;\n\t text-indent: 2em;\n\t}\na {text-decoration: none;}\np {margin: 0.2em auto;}\n</style>\n</head>\n<body>\n<table border=\"1\" cellspacing=\"0\">\n<tr>\n<th colspan=\"6\">标题：<a href=\"https://www.pixiv.net/novel/show.php?id=${id}\">${title}</a></th>\n</tr>\n<tr>\n<td colspan=\"4\">\n作者：<a href=\"https://www.pixiv.net/users/${uid}\">${unm}</a>\n${ugz=='true' ? '<span style=\"font-size: 0.7em;\"> (已关注)</span>' : ''}\n</td>\n<td colspan=\"2\"><img src=\"${uim}\"></td>\n</tr>\n${sTitle!='' ? ('<tr><td colspan=\"6\">小说：《'+sTitle+'》'+'</td></tr>') : ''}\n<tr>\n<td>喜欢</td>\n<td>${xh}</td>\n<td>收藏</td>\n<td>${sc}</td>\n<td>观看</td>\n<td>${gk}</td>\n</tr>\n<tr>\n<td>时间</td>\n<td colspan=\"5\">${cdate}</td>\n</tr>\n<td>标签</td>\n<td colspan=\"5\">${tags}</td>\n</tr>\n${caption!='' ? ('<tr><td>简介</td><td class=\"cap\" colspan=\"5\">'+caption+'</td></tr>') : ''}\n</table>\n<br>\n<script>\n\n</script>\n</body></html>`;\nlet java=this.java;\njava.startBrowser(`data:text/html;base64,${java.base64Encode(htm)}`,'信息');\n}\n\nfunction gengxin(){\nconst {java, source} = this;\n\tlet url0='https://gitee.com/lyc486/yuedu2/commits/main/书源/pixiv小说/pixiv.json?browser_history=0&page=1&per=3';\n\tlet rr0=java.get(url0,{'User-Agent': 'Mozilla/5.0 (Linux; Android 14)','X-Requested-With': 'XMLHttpRequest'}).body();\n\tlet \tgxlrr = com.jayway.jsonpath.JsonPath.read(rr0, '$.list[0:3].title');\n\tlet [gxlr, gxlr2, gxlr3] = gxlrr;\n\tlet banben =   String(source.exploreUrl).match(/let banben=\"([\\u005c\\u005cd\\u005c\\u005c.]+)\"/)[1];\n\tgxlr=String(gxlr).split(/^([^\\u005c\\u005c-]+)-/);\n\tgxlr[0]=='' ? '' : gxlr=['','0',gxlr[0]];\n\tlet gxts;\n\tif (gxlr[1]>banben){gxts=['更新','0,140,186'];}\n\telse {gxts= ['导入','76,175,80'];};\n\tlet htm = `<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<style>\ntable {\n\ttext-align: center;\n\tmargin: 0 auto;\n\t}\n.ann {\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\theight: 50vh;\n\t}\nbutton {\n\tbackground-color: rgb(${gxts[1]});\n\tcolor: white;\n\tborder: none;\n\tborder-radius: 4px;\n\theight: 6vh;\n\twidth: 30vw;\n\toverflow: hidden;\n\t}\nbutton span {\n  cursor: pointer;\n  display: inline-block;\n  position: relative;\n  transition: 0.4s;\n}\nbutton span:after {\n  content: '>';\n  position: absolute;\n  opacity: 0;\n  top: 0;\n  right: 30px;\n  transition: 0.2s;\n}\nbutton:active span {\n  padding-right: 20px;\n}\nbutton:active span:after {\n  opacity: 1;\n  right: -40px;\n}\n</style>\n</head>\n<body>\n<table border=\"1\" cellspacing=\"0\">\n<th colspan=\"2\">最新日志：${gxlr[2]}</th>\n<tr>\n<td>仓库版本：${gxlr[1]}</td>\n<td>本地版本：${banben}</td>\n</tr>\n<tr>\n<td colspan=\"2\" style=\"text-align: left;\">往期日志：${gxlr2}<br>　　　　　${gxlr3}</td>\n</tr>\n</table>\n<div class=\"ann\">\n<a href=\"legado://import/importonline?src=https://github.com/Luoyacheng/yuedu/raw/main/书源/pixiv小说/pixiv.json\">\n<button><span>${gxts[0]}</span></button>\n</a>\n</div>\n<a href=\"legado://import/importonline?src=https://cdn.jsdelivr.net/gh/Luoyacheng/yuedu@main/书源/pixiv小说/pixiv.json\" style=\"font-size: 10px;\">备用链接</a>\n</body>\n</html>`;\nif(typeof this.book=='undefined'||gxts[0]=='更新') java.startBrowser(`data:text/html;base64,${java.base64Encode(htm)}`,'px更新');\r\n}\nfunction fankui(){\tthis.java.startBrowser('https://github.com/Luoyacheng/yuedu/discussions/categories/b-pixiv?discussions_q=','px反馈');\n}\n\n//★2026.08免VPN修复★ pixiv已把oauth迁到Cloudflare，HTTP/2下nginx强制SNI↔Host校验返回421，\n//且GFW对*.pixiv.net的SNI直接重置。本函数用原始TLS套接字直连东京源站IP：不发SNI、不协商ALPN，\n//手写HTTP/1.1报文靠Host头路由到oauth（证书为Google Trust Services公共证书，系统默认信任）。\nfunction pxOauth(postBody) {\n    const { java } = this;\n    let time = java.timeFormatUTC(Date.now(), \"yyyy-MM-dd'T'HH:mm:ss'+00:00'\", 8 * 60 * 60 * 1000);\n    let hash = this.timemd5(time);\n    let req = 'POST /auth/token HTTP/1.1\\r\\nHost: oauth.secure.pixiv.net\\r\\n'\n        + 'User-Agent: ' + ua + '\\r\\n'\n        + 'content-type: application/x-www-form-urlencoded\\r\\n'\n        + 'x-client-time: ' + time + '\\r\\nx-client-hash: ' + hash + '\\r\\n'\n        + 'accept-language: ' + a_l + '\\r\\napp-os: Android\\r\\napp-os-version: Android 14\\r\\napp-version: ' + appv + '\\r\\n'\n        + 'Content-Length: ' + postBody.length + '\\r\\nConnection: close\\r\\n\\r\\n' + postBody;\n    let sf = Packages.javax.net.ssl.SSLSocketFactory.getDefault();\n    let ips = ['210.140.139.155', '210.140.139.152', '210.140.139.158', '210.140.139.161'];\n    let sock = null, lastErr = '';\n    for (let i = 0; i < ips.length; i++) {\n        try {\n            let addr = Packages.java.net.InetAddress.getByName(ips[i]);\n            sock = sf.createSocket(addr, 443);\n            sock.setSoTimeout(12000);\n            let os = sock.getOutputStream();\n            os.write(new Packages.java.lang.String(req).getBytes('UTF-8'));\n            os.flush();\n            let rd = new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(sock.getInputStream(), 'UTF-8'));\n            let sb = new Packages.java.lang.StringBuilder();\n            let line;\n            while ((line = rd.readLine()) != null) { sb.append(line); sb.append('\\n'); }\n            return String(sb.toString());\n        } catch (e) {\n            lastErr = e;\n            try { if (sock != null) sock.close(); } catch (e2) {}\n        }\n    }\n    throw lastErr == '' ? 'oauth直连失败：无可用IP' : lastErr;\n}\n", "lastUpdateTime": "1788074492371", "loginCheckJs": "//java.toast('登录检查：'+result);\n\nif (result.code() == 400) {\n\tsource.login();\n\tsleep(500);\n\tlet url = gethd(result.url());\n\tresult = java.connect(url);\n\t}\nresult", "loginUi": "[\n    {\n        name: \"token\",\n        type: \"text\"\n    },\n    {\n        name: \"token说明\",\n        type: \"button\",\n        action: \"java.longToast(`\ntoken说明：\n填写该值后点击右上角√进行登录\n可以通过获取token按钮得到(不需要跳转app)\n阅读正式版无法支持获取token功能`);\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        name: \"获取token\",\n        type: \"button\",\n        action: \"Login()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        name: \"id\",\n        type: \"text\"\n    },\n    {\n        name: \"id说明\",\n        type: \"button\",\n        action: \"java.longToast(`\nid说明：\n登录时该值为空会自动填写该值，这是登录账号的ID（可手动更改）。\n发现页的收藏分类加载的该ID的收藏`);\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        name: \"搜索说明\",\n        type: \"button\",\n        action: \"java.longToast(`\n搜索说明：\n默认使用关键词搜索\n输入小说id号显示对应的小说\n输入“正文@许斌”搜索正文含许斌的小说\n输入“作者@69559022”搜索指定id作者的书`);\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        name: \"书名\",\n        type: \"text\"\n    },\n     {\n        name: \"↑追更该书\",\n        type: \"button\",\n        action: \"scz(3)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n     {\n        name: \"复制id\",\n        type: \"button\",\n        action: \"fuzhi(2)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n     {\n        name: \"取消追更\",\n        type: \"button\",\n        action: \"scz(30)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"章节\",\n        type: \"text\"\n    },\n    {\n        name: \"↑收藏该章\",\n        type: \"button\",\n        action: \"scz(1)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n     {\n        name: \"详情\",\n        type: \"button\",\n        action: \"caption()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n     {\n        name: \"取消收藏\",\n        type: \"button\",\n        action: \"scz(10)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"作者\",\n        type: \"text\"\n    },\n    {\n        name: \"↑关注作者\",\n        type: \"button\",\n        action: \"scz(2)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n     {\n        name: \"复制id\",\n        type: \"button\",\n        action: \"fuzhi(1)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n     {\n        name: \"取消关注\",\n        type: \"button\",\n        action: \"scz(20)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    \t{\n        name: \"📘书名标识\",\n        type: \"button\",\n        action: \"gongcun()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    \t{\n        name: \"反馈\",\n        type: \"button\",\n        action: \"fankui()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    \t{\n        name: \"版本更新\",\n        type: \"button\",\n        action: \"gengxin()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    \t{\n        name: \"🫧补充序号\",\n        type: \"button\",\n        action: \"xvhao()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"占位\",\n        type: \"button\",\n        action: \"java.longToast(`这里没有东西`);\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    \t{\n        name: \"书源介绍\",\n        type: \"button\",\n        action: \"java.startBrowser('https://luoyacheng.cloudns.ch/#P站','介绍');\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    \t{\n        name: \"＃简介标签\",\n        type: \"button\",\n        action: \"biaoqian()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    }, \n    {\n    \t  name: \"tag\",\n    \t  type: \"text\"\n     },\n         {\n        name: \"屏蔽tag\",\n        type: \"text\"\n    }\n]", "loginUrl": "function gongcun() {\nlet gc = source.get('gc');\nif(gc!=1) {source.put('gc',1);java.toast('🟢已开启\\n书名开头会有📘符号');}\nelse {source.put('gc',0);java.toast('⚫已关闭\\n不会添加📘');}\n\t}\nfunction xvhao() {\nlet xh = source.get('xh');\nif(xh!=1) {source.put('xh',1);java.toast('🟢已开启\\n会自动补充章节名序号');}\nelse {source.put('xh',0);java.toast('⚫已关闭\\n不会补充序号');}\n\t}\nfunction biaoqian() {\nlet bq = source.get('bq');\nif(bq!=1) {source.put('bq',1);java.toast('🟢已开启\\n会在简介显示作品标签');}\nelse {source.put('bq',0);java.toast('⚫已关闭\\n不会显示简介标签');}\n\t}\n\nfunction login() {\nlet time = java.timeFormatUTC(Date.now(),\"yyyy-MM-dd'T'HH:mm:ss'+00:00'\",8*60*60*1000);\nlet hash = timemd5(time);\n\tlet headers = {\n    'User-Agent': ua,\n    'content-type': 'application/x-www-form-urlencoded',\n    'x-client-hash': hash,\n    'accept-language': a_l,\n    'app-version': appv,\n    'app-os-version': 'Android 14',\n    'x-client-time': time,\n    'app-os': 'Android'\n  };\n  let url = 'https://oauth.secure.pixiv.net/auth/token';\n  let Info = source.getLoginInfoMap();\n  let tk = Info.token;\n  if (!tk) { java.toast('请先填写token'); sleep(600); return; }\n  let body = `client_id=MOBrBDS8blbauoSck0ZfDbtuzpyT&client_secret=lsACyCD94FhDUtGTXi3QzcFE2uU1hqtDaKeqrdwj&grant_type=refresh_token&refresh_token=${tk}&include_policy=true`;\n\n  function parseResult(rr) {\n  \trr = String(rr);\n  \tif (/^HTTP\\/1\\. \\d{3}/.test(rr)) { let bi = rr.indexOf('{'); if (bi >= 0) rr = rr.substring(bi); }\n  \tlet m = rr.match(/\"access_token\"[:\\s\\\"]+([^\\\"]+)/);\n  \tif (m) {\n  \t\tsource.putLoginHeader(m[1]);\n  \t\tif (Info.id==''||Info.id==null) {\n  \t\t\ttry { Info.id = com.jayway.jsonpath.JsonPath.read(rr, \"$.response.user.id\"); }\n  \t\t\tcatch(e) { try { Info.id = com.jayway.jsonpath.JsonPath.read(rr, \"$.user.id\"); } catch(e2){} }\n  \t\t}\n  \t\tsource.putLoginInfo(JSON.stringify(Info));\n  \t\tjava.toast('\\n😆登录成功');\n  \t\treturn true;\n  \t}\n  \tif (rr.indexOf('invalid_grant') >= 0) {\n  \t\tjava.toast('\\n⚠️refresh_token已失效\\n请重新获取token');\n  \t\tsleep(800);\n  \t\treturn true;\n  \t}\n  \treturn false;\n  }\n\n  //★2026.08免VPN修复：优先走直连通道换token（无VPN可用）\n  try {\n  \tif (parseResult(pxOauth(body))) return;\n  } catch(e) {\n  \tjava.log('px oauth直连失败：'+e);\n  }\n\n  try {\n  \tlet resp = java.post(url, body, headers);\n  \tlet rr = resp.body();\n  \tlet code = resp.statusCode();\n  \tjava.log('px login post: code='+code+' body='+(rr+'').substring(0,200));\n  \tif (parseResult(rr)) return;\n  \tif (code != 200) {\n  \t\tjava.toast('\\n💔登录失败 HTTP '+code+'\\n'+(rr+'').substring(0,80));\n  \t\tsleep(800);\n  \t\treturn;\n  \t}\n  } catch(e) {\n  \tjava.log('px login post err: ' + e);\n  }\n\n  try {\n  \tlet opt = JSON.stringify({method:'POST', body:body, headers:headers});\n  \tlet rr = (java.connect(url+','+opt).body() + '');\n  \tjava.log('px login connect: '+(rr+'').substring(0,200));\n  \tif (parseResult(rr)) return;\n  } catch(e) {\n  \tjava.log('px login connect err: ' + e);\n  }\n\n  java.toast('\\n💔登录失败\\n请开启VPN后重试');\n  sleep(800);\n}\nfunction scz(x) {\n\tlet headers = gethd();\n\t//let url = 'https://app-api.pixiv.net/';\n\tlet url = \"https://210.140.139.155/\";\n\tlet body,nm,tt,ttt;\n\tlet yes = cache.get('yes');\n\tif (x==1) {\n\t \tlet id = cache.get('pxid');\n\t \tif (id=='') ttt='请刷新章节';\nif (yes == 2) {\n\t url += 'v2/illust/bookmark/add';\n\t \tbody = 'illust_id='+id+'&restrict=public';\n} else {\n\t url += 'v2/novel/bookmark/add';\n\t \tbody = 'novel_id='+id+'&restrict=public';\n}\n\t \tnm = source.getLoginInfoMap().get('章节');\n\t \ttt='收藏';\n\t } else if (x==2) {\n\t \turl += 'v1/user/follow/add';\n\t \tlet uid = cache.get('pxuid');\n\t \tif (uid=='') ttt='请刷新章节或详情页';\n\t \tbody = 'user_id='+uid+'&restrict=public';\n\t \tnm = source.getLoginInfoMap().get('作者');\n\t \ttt='关注';\n\t \t} else if(x==10) {\n\t \tlet id = String(cache.get('pxid'));\n\t \tif (yes == 2) {\n\t url += 'v1/illust/bookmark/delete';\n\t \tbody = id ? 'illust_id='+id : '';\n} else {\n\t \turl += 'v1/novel/bookmark/delete';\n\t \tbody = id ? 'novel_id='+id : '';\n\t \t}\n\t \tnm = source.getLoginInfoMap().get('章节');\n\t \ttt='取消收藏😅';\n\t \t} else if(x==20) {\n\t \turl += 'v1/user/follow/delete';\n\t \tlet uid = String(cache.get('pxuid'));\n\t \tbody = uid ? 'user_id='+uid : '';\n\t \tnm = source.getLoginInfoMap().get('作者');\n\t \ttt='取消关注😅';\n\t \t} else if(x==3) {\n\t \t\n\t \tlet sid = cache.get('pxsid');\n\t \tif (sid=='') ttt='请刷新详情页';\n\t \tif (yes == 2) {\n\t url += 'v1/watchlist/manga/add';\n\t \tbody = 'series_id='+sid;\n} else {\n\turl += 'v1/watchlist/novel/add';\n\t \tbody = 'series_id='+sid;\n\t \t}\n\t \tnm = source.getLoginInfoMap().get('书名');\n\t \ttt='追更';\n\t \t} else if(x==30) {\n\t \tlet sid = String(cache.get('pxsid'));\n\t \tif (yes == 2) {\n\t url += 'v1/watchlist/manga/delete';\n\t \tbody = sid ? 'series_id='+sid : '';\n} else {\n\turl += 'v1/watchlist/novel/delete';\n\t \tbody = sid ? 'series_id='+sid : '';\n\t \t}\n\t \tnm = source.getLoginInfoMap().get('书名');\n\t \ttt='取消追更😅';\n\t \t}\n\n\ttry {\n\t\tif (ttt) {java.longToast(ttt);throw 't空';}\n\t\tif (!body) throw 'b空';\n\t\theaders['host']='app-api.pixiv.net';\n\t\tlet jg = java.post(url,body,headers).statusCode();\n\t\tif (jg!=200) throw tt+'响应码异常';\n\t\telse java.longToast(`\\n已${tt}：\\n${nm}`);\n\t\t} catch(e) {\n\t\t\tif (!ttt) java.toast(`\\n${tt}失败`);\n\t\t\tjava.log(e);}\n\t}\n\nfunction reck() {\nsource.removeLoginHeader();\ncookie.removeCookie('https://accounts.pixiv.net');\ncookie.removeCookie('https://accounts.google.com');\ncookie.removeCookie('https://api.weibo.com');\n\t}\n\nfunction Login() {\nlet rkey = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';\nlet cv='';\nfor (let i = 0; i < 128; i++) {\n\tlet ra = Math.floor(Math.random()*rkey.length);\n\tcv+=rkey.charAt(ra);}\n\nlet aly = new JavaImporter(\nPackages.cn.hutool.crypto.digest.Digester,\nPackages.cn.hutool.core.codec.Base64,\nPackages.cn.hutool.crypto.digest.DigestAlgorithm);\nwith (aly) {\n\t//转ASCII数组\n\tlet asBs =  Packages.java.lang.String(cv).getBytes(\"US-ASCII\");\n\t//创建SHA256并计算\n\tlet digester = new Digester(DigestAlgorithm.SHA256);\n\tlet hashBs = digester.digest(asBs);\n\t//Base64URL编码并移除填充\n\tvar codeChallenge  = Base64.encodeUrlSafe(hashBs);\n}\n\nlet urllg =`https://app-api.pixiv.net/web/v1/login?code_challenge=${codeChallenge}&code_challenge_method=S256&client=pixiv-android`;\nreck();\n//防止重定向错误，清书源cookie。也需要手动清内置浏览器cookie\n\nlet wbua=java.getWebViewUA().replaceAll(\"; wv| Version\\/4.0\",'')+'';\nif (/HUA\\s*WEI/i.test(wbua))\nwbua=\"Mozilla/5.0 (Linux; Android 14; RMX3366 Build/UKQ1.230924.001) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.7049.100 Mobile Safari/537.36\";\n\nlet bb=java.startBrowserAwait(urllg+`,{\n\"headers\":{\n\t\"User-Agent\": \"${wbua}\"\n\t}}`,'登录',false).body();\nlet code;\nif (bb.includes('<title>Online com')) {\nsleep(600);\njava.toast('稍等');\nlet over = java.webViewGetOverrideUrl(bb,'https://app-api.pixiv.net/','','pixiv:.*');\ncode = over.match(/code=([^&]+)/);\n}\nreck();\n\nlet token;\nif (code) {\nlet tkurl = 'https://oauth.secure.pixiv.net/auth/token';\nlet headers = gethd();\nlet body = `code_verifier=${cv}&code=${code[1]}&grant_type=authorization_code&redirect_uri=https://app-api.pixiv.net/web/v1/users/auth/pixiv/callback&client_id=MOBrBDS8blbauoSck0ZfDbtuzpyT&client_secret=lsACyCD94FhDUtGTXi3QzcFE2uU1hqtDaKeqrdwj&include_policy=true`;\nlet tkr = java.post(tkurl,body,headers);\n//java.log(tkr.body());\ntoken = tkr.body().match(/refresh_token\":\"([^\"]+)/);\n}\n\nif (token) {\nlet htm = `data:text/html;charset=utf-8,<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><style>\nh2 {\n\ttext-align: center;\n\tline-height: 6;}\ntextarea {\n\tfont-size: 12px;\n\twidth: 96%;\n\tmargin: 10px 2%;\n\tpadding: 6px;}\n.ann {\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\theight: 50vh;}\nbutton {\n\tbackground-color: rgb(76,175,80);\n\tcolor: white;\n\tborder: none;\n\tborder-radius: 4px;\n\theight: 6vh;\n\twidth: 30vw;\n\toverflow: hidden;\n\ttransition: font-size 0.3s;\n\tfont-size: 16px;}\n.an-s {\n\tfont-size: 12px;}\n.alert-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\tbackground: rgba(0, 0, 0, 0.6);\n\tdisplay: none;\n\tjustify-content: center;\n\talign-items: center;\n\tz-index: 9999;}\n/* 对话框主体 */\n.alert-box {\n\tbackground: rgb(232,234,246);\n\tpadding: 10px;\n\tborder-radius: 12px;\n\tbox-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);\n\tmin-width: 100px;\n\ttext-align: center;}\n</style></head>\n<body>\n<div class=\"alert-overlay\" id=\"alertO\">\n <div class=\"alert-box\">\n  <p>已复制到剪贴板：</p>\n  <p id=\"alertM\" style=\"font-size: 12px;\"></p>\n </div>\n</div>\n<h2>Token获取成功🥳</h2>\n<textarea readonly id=\"copyt\" rows=\"3\">${token[1]}</textarea>\n<p style=\"font-size: 12px;\">请复制粘贴到登录界面的token框，然后点击√进行登录</p>\n<div class=\"ann\">\n<button id=\"btn1\" onclick=\"copy()\">复制</button>\n</div>\n<script>\nfunction showAlert(txt, time) {\nconst overlay = document.getElementById('alertO');\nconst message = document.getElementById('alertM');\nmessage.textContent = txt;\noverlay.style.display = 'flex';\nif (time > 0) {\n\tsetTimeout(() => {\n\t\toverlay.style.display = 'none';\n\t\t}, time);\n\t}\n}\nfunction copy() {\nconst btn = document.getElementById('btn1');\nbtn.classList.add('an-s');\nconst cpt = document.getElementById(\"copyt\");\ncpt.select();\ntry {\n    const cpy = document.execCommand(\"copy\");\n    if (cpy.length<9) throw '异常';\n    showAlert(cpt.value, 1000);\n  } catch (e) {alert(\"复制失败，请手动复制\");}\nsetTimeout(() => {\n\tbtn.classList.remove('an-s');\n\t}, 450);\n}\n</script>\n</body></html>`;\n\njava.startBrowser(htm,'获取token');\njava.log(token[1]); //留一份到日志\t\n\t} else {sleep(700);java.toast('获取失败😭');}\n}\n\nfunction fuzhi(x) {\n\tif (x==1) {\n\tlet uid = cache.get('pxuid');\n\tcopy(uid);}\n\tif (x==2) {\n\tlet sid = cache.get('pxsid');\n\tcopy(sid);}\n\t}\n\nfunction caption() {\n\tlet lyc=cache.getFromMemory('pxcjj');\n\tif (lyc) lookc(lyc);\n\telse java.longToast('请刷新正文');\n\t}", "respondTime": 229699, "ruleBookInfo": {"author": "$.novel_series_detail.user.name\n<js>\nlet uid = java.get('uid');\nlet auth = result || String(book.author).replace(/[\\u200b]+/,'');\nif (uid == '') {uid = java.getString('$.novel_series_detail.user.id');}\nlet Info=source.getLoginInfoMap();\nInfo['作者'] = auth;\ncache.put('pxuid',uid);\nsource.putLoginInfo(JSON.stringify(Info));\n'\\u200b' + auth\n</js>", "canReName": "1", "init": "<js>\nvar sid = java.get('sid');\nvar id = java.get('id');\nlet yes = java.get('yes');\nlet i = String(book.bookUrl).includes('https:/');\nif (i) { sid = String(book.bookUrl).match(/\\d{3,}$/);}\n\ncache.deleteMemory('pxcjj'); //仅通过正文打开详情，防错\nif (sid == '🇨🇳') {\n\tlet Info=source.getLoginInfoMap();\n\tlet bkn = String(book.name);\n\tInfo['书名'] = '';\n\tcache.put('pxsid','');\n\tInfo['章节'] = bkn;\n\tcache.put('pxid',id);\n\tsource.putLoginInfo(JSON.stringify(Info));\n\tlet length = leng(bkn);\t\nbook.intro = (source.get('bq')==1?String(java.get('tags')).replace(/, /g,' #').replace('[','#').replace(']','\\n\\n'):'') + (length>18?('《'+book.name+'》\\n'):'') + java.get('jianjie');\n\trr='1';\n\n} else {\nif (yes==2) {\n\turl = 'https://app-api.pixiv.net/v1/illust/series?illust_series_id=' + sid;\n\t\t} else {\n url = 'https://app-api.pixiv.net/v2/novel/series?series_id=' + sid;\n}\n//修正bookurl\nbook.bookUrl = `data:;base64,${java.base64Encode(url)},{\"type\":\"px\"}`;\n\ntry {\n\tjg = java.connect(gethd(url));\nrr = jg.body();\nif (jg.code() == 400) {\n\tsource.login();\n\tPackages.java.lang.Thread.sleep(500);\n\trr = java.ajax(gethd(url));\n\t}\n\n} catch(err) {\n\trr={};\n\tjava.toast('详情页链接加载失败'+sid);\n\t}\n\n//设置解析结果\njava.setContent(rr);\n\n\n//更新更新时间\ntry {\nlet tm = '';\nif (yes==2){\ntm = java.getString('$.illust_series_first_illust.create_date');\n} else {\n tm = java.getString('$.novel_series_latest_novel.create_date');\n}\nlet d = new Date(tm);\nd = java.timeFormatUTC(d,'yy/MM/dd',8*60*60*1000);\nbook.kind = String(book.kind).replace(/\\d+\\/\\d+\\/\\d+|$/,d).replace('null','');\n} catch(err) {java.toast('详情页内容错误');}\n\n//获取书名并净化\nlet bkn = '';\nif (yes==2){\nbkn = String(java.getString('$.illust_series_detail.title')).replace(/^《(.+)》$/,'$1');\nbook.name = bkn.replace(/[(（].{0,9}((?:仙侠|纯爱|后宫|萝莉).?){3,}.{0,9}[)）](?=\\s*[一-ꀀ])/,'');\n} else {\nbkn = String(java.getString('$.novel_series_detail.title')).replace(/^《(.+)》$/,'$1');\nbook.name = bkn.replace(/[(（].{0,9}((?:仙侠|纯爱|后宫|萝莉).?){3,}.{0,9}[)）](?=\\s*[一-ꀀ])/,'');\n}\n//java.log('┌获取书名\\n[99:99.999] └'+book.name);\n\n//获取书名失败\nif (book.name == '') {\n\t//效果，unicode转字符\n\t// let ee = JSON.stringify(JSON.parse(rr) );\n\tlet txte = java.getString('$..user_message',rr);\n\t//弹出提示，sid相应序列不存在\n\tjava.longToast('\\n未获取到书名\\n'+txte);\n\t} else {\n\t\n\t//放入书名\n\tlet Info=source.getLoginInfoMap();\n\tInfo['书名'] = book.name;\n\tcache.put('pxsid',sid);\n\tInfo['章节'] = '';\n\tcache.put('pxid','');\n\tsource.putLoginInfo(JSON.stringify(Info));\n\t\n\t//同名共存\n\tif (source.get('gc') == 1) book.name='📘'+book.name;\n\t}\n\n//补充封面链接\nif (book.coverUrl == null) {\n\tlet img = java.getString('$.novel_series_latest_novel.image_urls.large');\n\tbook.coverUrl = gethdi(img);\n\t\t\n//java.log('┌获取封面\\n[99:99.999] └'+book.coverUrl);\n}\n\n//计算书名长度\nlet length = leng(String(book.name));\n//大于18个全角字符\nif (length > 18) length= '《'+String(book.name).replace(/^📘/,'')+'》\\n';\nelse length = '';\nlet jianjie = java.getString('$.novel_series_detail.caption');\nbook.intro = (source.get('bq')==1?String(java.get('tags')).replace(/, /g,' #').replace('[','#').replace(']','\\n\\n'):'') + length + java.get('jianjie');\njava.put('jianjie',jianjie);\njava.put(\"bookr\",rr);\n}\n\nrr\n</js>", "lastChapter": "$.novel_series_latest_novel.title##[【《]?{{book.name}}[》】]?", "tocUrl": "@js:book.bookUrl", "wordCount": "$.novel_series_detail.total_character_count"}, "ruleContent": {"content": "<js>\nlet yes = java.get('yes');\nlet cid =java.get('cid');\ncache.put('yes',yes)\nif (yes==2) {\n\tconst jsonStr = java.hexDecodeToString(result);\n\t//java.log(jsonStr)\n\tlet id = java.get('id');\n\tcache.put('pxid',id);\n\tlet bin = book.durChapterIndex;\nlet cin = chapter.index;\nlet inn = cin - bin;\nif (inn==0) {\n\tlet Info=source.getLoginInfoMap();\nlet sid = java.get('sid');\nif (sid != '🇨🇳') {\n\tInfo['书名']=String(book.name).replace(/^📘/,'');\n\tcache.put('pxsid',sid);} else {\n\tInfo['书名']='';\n\tcache.put('pxsid','');}\n\nInfo['章节'] = chapter.title;\nInfo['作者'] = book.author.replace('\\u200b','');\n//放入UI界面\nsource.putLoginInfo(JSON.stringify(Info));\n}\nvar fixed = jsonStr;\nfixed = fixed.replace(\"{image_urls={\", \"{\\\"image_urls\\\": {\");\nfixed = fixed.replace(\"square_medium=\", \"\\\"square_medium\\\":\\\"\");\nfixed = fixed.replace(\"medium=\", \"\\\"medium\\\":\\\"\");\nfixed = fixed.replace(\"large=\", \"\\\"large\\\":\\\"\");\nfixed = fixed.replace(\"original=\", \"\\\"original\\\":\\\"\");\nfixed = fixed.replace(\".jpg,\", \".jpg\\\", \");\nfixed = fixed.replace(\".jpg}}\", \".jpg\\\"}}\");\nfixed = fixed.replace(\".png,\", \".png\\\", \"); \n​fixed = fixed.replace(\".png}}\", \".png\\\"}}\");\nfixed = fixed.replace(\"}\\n{\", \"},\\n{\");\nfixed = \"[\" + fixed + \"]\";\nfixed= fixed.replace(/　/g, ''); \nfixed = fixed.replace(/\\s+/g, ' '); \n//java.log(fixed)\nvar imageArray = [];\ntry {\n  imageArray = JSON.parse(fixed);\n} catch (e) {\njava.log(\"错误\")\n}\nvar cctv = \"\";\nfor (var i = 0; i < imageArray.length; i++) {\n  if (imageArray[i] && imageArray[i].image_urls && imageArray[i].image_urls.medium) {\n    cctv += '<img src=\"' + gethdi(imageArray[i].image_urls.large) + '\"/>';\n    cctv+= \"\\n\";\n  } else {\n    cctv += \"第\" + (i + 1) + \"张：数据异常\\n\";\n  }\n}\njava.log(cctv);\n\t} else {\n\tlet result = java.getString('script.0@html');\nlet rr = result.match(/novel:\\s*({.+})/)[1];\nlet id = String(chapter.url).match(/\\d+(?=$|,)/)[0];\n\nlet bin = book.durChapterIndex;\nlet cin = chapter.index;\nlet inn = cin - bin;\nif (inn==0) {\nlet rra = result.match(/authorDetails:\\s*({.+})/)[1];\n//作者信息\nlet uid = java.getString('$..userId',rra);\nlet unm = java.getString('$..userName',rra);\nlet uim = java.getString('$..url',rra);\nuim = uim.replace('i.pximg.net','pximg.hakurei.cc');\nlet ugz = java.getString('$..isFollowed',rra);\n//作品信息\nlet tags = java.getStringList('$..tags[*]',rr);\ntags = Array.from(tags).map(x => `＃${x}`).join(' ');\nlet caption = String(java.getString('$..caption',rr));\ncaption = caption ? '<p>'+caption.replace(/(?:<br \\/>)+/g, '</p><p>')+'</p>' : '';\nlet cdate = java.getString('$..cdate',rr);\nlet xh = java.getString('$..rating.like',rr);\nlet sc = java.getString('$..rating.bookmark',rr);\nlet gk = java.getString('$..rating.view',rr);\nlet title = java.getString('$.title',rr);\nlet sTitle = java.getString('$.seriesTitle',rr);\n//放入信息\ncache.putMemory('pxcjj',[title,uid,unm,uim,tags,caption,cdate,xh,sc,gk,sTitle,id,ugz]);\ncache.put('pxuid',uid);\ncache.put('pxid',id);\nlet Info=source.getLoginInfoMap();\n\nlet sid = java.get('sid');\nif (sid != '🇨🇳') {\n\tInfo['书名']=String(book.name).replace(/^📘/,'');\n\tcache.put('pxsid',sid);} else {\n\tInfo['书名']='';\n\tcache.put('pxsid','');}\n\nInfo['章节'] = chapter.title;\nInfo['作者'] = book.author.replace('\\u200b','');\n//放入UI界面\nsource.putLoginInfo(JSON.stringify(Info));\n}\n\nlet urls = java.getString('$..urls',rr);\nlet tt = String(java.getString('$.text',rr));\nlet img1 = tt.match(/\\[uploadedimage\\:\\d+\\]/g)||'';\nlet img2 = tt.match(/\\[pixivimage\\:[\\d\\-]+\\]/g)||'';\nfor (x of img1) {\n\tlet id = x.match(/\\d+/)[0];\n\tlet url = java.getString('$..'+id+'.urls.original',rr);\n\tlet re = new RegExp('\\\\[uploadedimage\\\\:'+id+'\\\\]');\n\ttt = tt.replace(re,'<img src=\"'+gethdi(url)+'\"/>');\n\t}\nfor (x of img2) {\n\tlet id = x.match(/[\\d\\-]+/)[0];\n\tlet url = java.getString('$..'+id+'..images.original',rr);\n\tif (url=='null') url = java.getString('$..'+id+'..images.medium',rr);\n\tlet re = new RegExp('\\\\[pixivimage\\\\:'+id+'\\\\]');\n\ttt = tt.replace(re,'<img src=\"'+gethdi(url)+'\"/>');\n\t}\ntt.replaceAll('[newpage]','\\n—换页符—\\n').replace(/\\[\\[jumpuri\\:(.+)\\>.+\\]\\]/,'🖇️$1🖇️')\n}\n</js>", "imageStyle": "SINGLE"}, "ruleExplore": {"author": "@js:\nlet uid = java.getString('$.user.id');\njava.put('uid',uid);\njava.getString('$.user.name');", "bookList": "<js>\nlet yes = 1;\nif (baseUrl.startsWith('http://127.0') ) {\n\trr = [{}];\n\t} else {\nlet nurl = java.getString('$.next_url');\nif (nurl == '') {\n\tjava.toast('发现页到底了');\n\tsource.put('nurl','http://127.0.0.1');\n\t}\nelse {\n\tsource.put('nurl',nurl);\n\t}\n\n\tif (baseUrl.includes('illust')) {\n\t\trr = java.getElement(\"$.illusts\");\n\t\tyes = 2;\n\t\t} else if (baseUrl.includes('/watchlist/') ) {\n\trr = java.getElement(\"$.series\");\n\t} else { rr = java.getElement(\"$.novels\");}\n}\nif (baseUrl.includes('manga')) {\n\tyes = 2;\n\t}\njava.put('yes',yes);\nrr\n</js>", "bookUrl": "<js>\nlet id = java.getString('$.id');\nlet sid = java.getString('$.series.id');\nlet cid = java.getString('$.meta_pages');\nif (baseUrl.includes('illust')) {\n\t\trr = 'https://app-api.pixiv.net/webview/v2/novel?id=' + id;\n\t\tif (sid=='') {\n  \tif (cid=='') {\n  \t\tcid = java.getString('$.image_urls')\ncid=cid.replace(\"{square_medium\", \"{image_urls={square_medium\");\n                       cid=cid.replace(\"}\",\"}}\")\n\t\trr = cid;\n\t\t} else {\n\t\trr = cid;\n\t\t\t}\n\t\t\t}\n\t\t} else {\n  rr = 'https://app-api.pixiv.net/webview/v2/novel?id=' + id;\n}\n\nif (baseUrl.includes('/watchlist/') ) {\n\tsid = id;\n\tif (source.get('gc')=='1') book.name='📘'+book.name;\n}\nelse if (sid=='') {sid='🇨🇳';}\nelse {\n\tlet jj = java.get('jianjie');\n\tjava.put('jianjie',book.name+'\\n'+jj);\n}\njava.put('id',id);\njava.put('sid',sid);\n`data:;base64,${java.base64Encode(rr)},{\"type\":\"px\"}`\n</js>", "coverUrl": "<js>\nif (baseUrl.includes('/watchlist/') ) {url = java.getString('$.url');}\nelse {\nurl = java.getString('$.image_urls.large')\n;}\ngethdi(url);\n</js>", "intro": "<js>\nlet jj = java.get('jianjie');\nlet rr = '\\n' + java.getString('$.caption');\nlet rs = java.htmlFormat(rr);\njava.put('jianjie',rs);\njj + rs\n</js>", "kind": "@js:\nif (baseUrl.includes('/watchlist/') ) {\n\trrr = '';\n\tjava.put('tags','');\n\ttm = java.getString('$.last_published_content_datetime');\n\t} else {\n\t\tlet tags=java.get('tags');\n\t\trr=String(tags).slice(1,-1).split(', ');\n\t\trrr = rr.filter(i => biaoq.test(i) );\n\t\trr.forEach(x=>{\n\t\t\tif (x=='萝莉') {\n\t\t\t\tif (!rrr.includes('幼女')) rrr.unshift(x);}\n\t\t\telse if (['熟女','淫妻'].includes(x)) {\n\t\t\t\tif (!rrr.includes('人妻')) rrr.unshift(x);}\n\t\t\telse if (['仙侠','古风','武侠'].includes(x) && !rrr.some(y=>/[修仙古风武侠]{2}/.test(y))) {\n\t\t\t\t\trrr.unshift(x);}\n\t});\n\t\ttm = java.getString('$.create_date');\n}\nlet d=new Date(tm);\nd=java.timeFormatUTC(d,'yy/MM/dd',8*60*60*1000);\n\nrrr.toString()+','+d", "name": "@js:\nresult = String(java.getString('$.title'));\nlet bookn = String(java.getString('$.series.title')).replace(/^《(.+)》$/,'$1');\nif (bookn != '') {\n\tjava.put('jianjie', '《'+bookn+'》\\n');\n\tresult = result.replace(bookn,'♸').replace(/[《【]?♸[】》]?/,'')||result;\n\t}\nresult = result.replace(/[(（].{0,9}((?:仙侠|纯爱|后宫|萝莉).?){3,}.{0,9}[)）](?=\\s*[一-ꀀ])/,'').replace(/《(.+)》/,'$1');\n\nlet tags = java.getStringList('$.tags..name');\njava.put('tags',tags);\ntags=String(tags).slice(1,-1).split(/, |\\//);\nlet bptag=source.getLoginInfoMap()['屏蔽tag']||'';\nif (bptag!='') {\n\tbptag = String(bptag).split(/[,\\|]/).map(x=>x.replace('#',''))\nfor (let char of tags)\nif (bptag.includes(char)) result=''\n}\nresult", "wordCount": "$.text_length"}, "ruleSearch": {"author": "<js>\n{{(source.ruleExplore.author).replace('@js:','')}}\n</js>", "bookList": "<js>\npage=cache.getFromMemory('pxpage');\ncache.deleteMemory('pxpage');\nif (baseUrl.startsWith('http://127.')) {rr = [{}];}\n\nelse {\nrr = java.getElement('$.novels');\nnurl = java.getString('$.next_url');\nif (rr.length<6&&page==1&&nurl!='') {\n\t//处理不触发下一页且有nurl的情况\n\tsleep(500);\n\trs = java.ajax(gethd(nurl));\n\tjava.setContent(rs)\n\trrr = java.getElement('$.novels');\n\t//合并对象函数，可直接用\n\trr.addAll(rrr);\n\tnurl = java.getString('$.next_url');\n}\n\nif (nurl == '') {\n\tjava.toast('搜索页到底了');\n\tsource.put('nurls','http://127.0.0.1');\n\t} else {source.put('nurls',nurl);}\n\n}\nrr\n</js>", "bookUrl": "<js>\nlet id = java.getString('$.id');\nlet sid = java.getString('$.series.id');\nif (sid=='') {\n\tsid='🇨🇳';\n\t} else {\n\tlet jj = java.get('jianjie');\n\tjava.put('jianjie',book.name+'\\n'+jj);\n\t}\nlet rr = 'https://app-api.pixiv.net/webview/v2/novel?id=' + id;\njava.put('sid',sid);\n`data:;base64,${java.base64Encode(rr)},{\"type\":\"px\"}`\n</js>", "coverUrl": "$.image_urls.large\n<js>\ngethdi(result);\n</js>", "intro": "<js>\nlet jj = java.get('jianjie');\nlet rr = '\\n' + java.getString('$.caption');\nlet rs = java.htmlFormat(rr);\njava.put('jianjie',rs);\njj + rs\n</js>", "kind": "<js>\n{{(source.ruleExplore.kind).replace('@js:','')}}\n</js>", "name": "<js>\n{{(source.ruleExplore.name).replace('@js:','')}}\n</js>", "wordCount": "$.text_length"}, "ruleToc": {"chapterList": "<js>\nlet sid = java.get('sid');\nlet yes = java.get('yes');\nif (yes == 2) {\n    book.type = 64;\n    } else {\n    book.type = 8;\n}\nif (sid == '🇨🇳') {result=[result];}\nelse {\n\ttry {\n\t\tlet url = java.hexDecodeToString(result);\n\t\t//下一页会报错，直接跳过\nlet bookr=java.get('bookr')+'';\nif (!bookr) {\n\tlet rs=java.connect(gethd(url));\n\tif (rs.code() == 400) {\n\t\tsource.login();\n\t\tsleep(500);\n\t\trs=java.connect(gethd(url));}\nbookr=rs.body();}\n\t\tjava.setContent(bookr);\n\t\tjava.put('bookr',''); //保证单目录时进行刷新\n\t\t} catch(e){}\n\t\tif (yes==2) {\n\t\t\ttargetVar = java.getElement('$.illusts');\n\t\t\tstandardArr = Array.isArray(targetVar) ?targetVar : Array.from(targetVar);\n\t\t\tresult = standardArr.slice(0).reverse();\n\t\t\t} else {\nresult = java.getElement('$.novels');\n}\n}\nresult\n</js>", "chapterName": "<js>\nlet sid = java.get('sid');\nif (sid == '🇨🇳') {cc=book.name;}\nelse {\nlet title = java.getString('$.title');\ntitle = String(title).replace(/[(（].{0,9}((?:仙侠|纯爱|后宫|萝莉).?){3,}.{0,9}[)）](?=\\s*[一-ꀀ])/,'');\nlet bkn=String(book.name).replace(/^📘|[。？！]+$/g,'');\n//消除后不剩字则不消除\ncc = title.replace(bkn,'♸').replace(/[《【]♸[。？！]*[】》]\\s*|♸[。？！\\s]*/,'')||title;\n\t}\nif (source.get('xh')==1) {\n\tcc='▫️'+cc;\n}\n\tcc\n</js>", "chapterUrl": "<js>\nlet sid = java.get('sid');\nlet yes = java.get('yes');\nif (sid == '🇨🇳') {\n\tif (yes ==2) { \t\n\t\tlet url = java.hexDecodeToString(result);\n\t\t`data:;base64,${java.base64Encode(url)},{\"type\":\"px\"}` } else {\n\t\tuu=java.hexDecodeToString(result);\n\t\tbook.putCustomVariable('这是单贴，链接：'+uu);\n\t\tgethd(uu);\n\t\t}\n\t}\nelse {\n\tlet id = java.getString('$.id');\n\tjava.put('id',id)\n\tcid = java.getString('$.meta_pages')\n\tif (yes == 2) {\n\t\tif (cid=='') {\n\t\t\tcid = java.getString('$.image_urls');\n                        cid=cid.replace(\"{square_medium\", \"{image_urls={square_medium\");\n                       cid=cid.replace(\"}\",\"}}\")\n\t\t\tuu = cid;\n\t`data:;base64,${java.base64Encode(uu)},{\"type\":\"px\"}`\n\t\t\t} else {\nuu = cid;\n\t`data:;base64,${java.base64Encode(uu)},{\"type\":\"px\"}`\n\t}\n\t\t} else {\nuu='https://app-api.pixiv.net/webview/v2/novel?id=' + id;\ngethd(uu);\n}\n}\n</js>", "formatJs": "title.replace(/^▫️(?![第序]|#?第?[\\d零一二三四五六七八九十百千]+[章回])/,'第'+index+'章 ').replace(/^▫️/,'');", "nextTocUrl": "$.next_url\n<js>\nif (result!='[]') {\nresult=gethd(result[0]);\n}else{result=[];}\nresult\n</js>", "updateTime": "$.create_date\n<js>\nif (result) {\nlet d=new Date(result);\nupt=java.timeFormatUTC(d,\"yyyy/MM/dd HH:mm\",8*60*60*1000);\n}\nelse '';\n</js>"}, "searchUrl": "<js>\nif (page == 1) {\ncache.putMemory('pxpage',page);\n\t\tif (/^\\u200b/.test(key)) {\n\t\t\tlet uid = cache.getFromMemory('pxuid');\n\t\t\tif (uid=='') java.longToast('\\n请刷新书籍');\n\t\t\telse url = 'https://app-api.pixiv.net/v1/user/novels?filter=for_android&user_id=' + uid;}\n\t\telse if (key.startsWith('作者@')) {\n\t\t\tlet uid = key.slice(3);\n\t\t\tif (!/^\\d{3,}$/.test(uid)) java.longToast('\\n请输入正确的id');\n\t\t\telse url = 'https://app-api.pixiv.net/v1/user/novels?filter=for_android&user_id='+uid;\t}\n\t\telse if (/\\d{5,}$/.test(key) ) {\n\t\t\tlet sid = key.match(/\\d+$/)[0];\n\t\t\tjava.put('sid',sid);\n\t\t\tif (key.startsWith('作者')) java.longToast('\\n请输入正确的搜索格式');\n\t\t\telse url = `data:;base64,${java.base64Encode(sid)},{\"type\":\"\"}`;}\n\t\telse if (key.startsWith('正文@')) {\n\t\t\turl = 'https://app-api.pixiv.net/v1/search/novel?filter=for_android&merge_plain_keyword_results=true&sort=date_desc&search_target=text&word='+key.slice(3);}\n\t\telse { url = 'https://app-api.pixiv.net/v1/search/novel?filter=for_android&merge_plain_keyword_results=true&word='+key;}\nsource.put('nurls','http://127.0.0.1'); //重置储存的下一页\n\n} else {url = source.get('nurls');}\ngethd(url)\n</js>", "weight": 0},{"bookSourceName": "凡人小说网🌟", "bookSourceType": 0, "bookSourceUrl": "https://www.fanren7.com", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "奇幻·玄幻::/qihuan/11-{{page}}.html\n武侠·仙侠::/wuxia/22-{{page}}.html\n都市·青春::/dushi/33-{{page}}.html\n历史·穿越::/lishi/44-{{page}}.html\n游戏·竞技::/youxi/55-{{page}}.html\n科幻·灵异::/kehuan/66-{{page}}.html\n书库::/shuku/{{page}}/", "header": " {\n    \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"\n  }", "lastUpdateTime": "1788021884911", "respondTime": 180000, "ruleBookInfo": {"author": ".novel_info_title i a@text", "coverUrl": "meta[property=\\\"og:image\\\"]@content", "intro": "meta[property=\\\"og:description\\\"]@content", "kind": ".novel_info_title p span@text", "name": ".novel_info_title h1@text"}, "ruleContent": {"content": "@js:var xid=baseUrl.match(/(\\d+)\\.html/)[1];\nvar html=java.ajax('https://www.fanren7.com/ajax.php?my=url2disk&xid='+xid);\nvar a=html.indexOf('<div id=\"bodybox\">');\nvar b=html.indexOf('</div>{697}',a);\nvar body=a>=0&&b>a?html.substring(a+18,b):'';\nvar ps=body.split('<p>');\nvar out=[];\nfor(var i=1;\ni<ps.length;\ni++){var t=ps[i].split('</p>')[0].replaceAll('<[^>]+>','').trim();\nif(t=='')continue;\nif(t.indexOf('第')>-1&&t.indexOf('/')>-1&&t.indexOf('页')>-1)continue;\nif(t.indexOf('本章未完')>-1)continue;\nout.push(t)}out.join('\\n');"}, "ruleExplore": {"author": ".li_bottom a@text", "bookList": "ul.flex li", "bookUrl": ".img_span a@href", "coverUrl": ".img_span img@crs", "intro": "p.indent@text", "kind": ".img_span span@text", "name": ".w100 h2@text"}, "ruleSearch": {"author": ".li_bottom a@text", "bookList": "ul.flex li", "bookUrl": ".img_span a@href", "intro": "p.indent@text", "kind": ".img_span span@text", "name": ".w100 h2@text"}, "ruleToc": {"chapterList": "#showbox1 ul li", "chapterName": "a@text", "chapterUrl": "a@href"}, "searchUrl": "/so/{{key}}/", "weight": 0, "bookSourceComment": "by狼崽儿 //2026.8.30"},{"bookSourceComment": "⚠️使用3.26版本，推荐lyc\n\n\n主要功能：免梯直连、自动翻译非中文小说\npixiv：全球最大的插画网站，其小说板块也是很多小说的首发更新网站，一般比版主、uaa上更新快几天，且无删减。\n其他新增功能：不加载插图功能，小说加载慢可打开\ntoken：一种长效账号身份令牌，阅读登录中填写\n获取token方法：阅读登录中获取token、在pixEz登录并导出token；\n基于lyc486的🌈pixiv小说、Notsfsssf/pixez-flutter、微软翻译3.0\n\n📝 更新日志（by DeepSeek）：\n- 2026.08.29：去除所有商业推广广告（VPN推广、购买token引导、联系购买等）\n- 删除“线路”、“备用”、“注册”、“说明”等广告按钮\n- 统一设置开关为 toggle 模式，优化界面美观度\n- 新增“查看设置”按钮，一键查看所有开关状态\n- 优化按钮排版布局\n\n感谢所有为开源做出贡献的大佬们！(ฅ´ω`ฅ)\n\n", "bookSourceGroup": "Pixiv", "bookSourceName": "🐱Pixiv小喵", "bookSourceType": 0, "bookSourceUrl": "https://app-api.pixiv.net/", "bookUrlPattern": "http://localhost/|https://www.pixiv.net/novel/series/\\d{3,}", "concurrentRate": "3/2000", "customButton": false, "customOrder": 33, "enabled": false, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nlet banben=\"1.1.9\";\nvar obj = {\n    '动态': {\n        \"url\": `{{\n            if (page == 1) {\n            url = 'https://app-api.pixiv.net/v1/novel/follow?restrict=public';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n            }}`,\n        \"fb\": 0.2 },\n    '推荐': {\n        \"url\": `{{\n            if (page == 1) {\n            url = 'https://app-api.pixiv.net/v1/novel/recommended?include_privacy_policy=true&filter=for_android&include_ranking_novels=true';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n            }}`,\n        \"fb\": 0.2 },\n    '追更': {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https://app-api.pixiv.net/v1/watchlist/novel';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n            }}`,\n        \"fb\": 0.2 },\n    '收藏·公开': {\n        \"url\": `{{\n            if (page == 1) {\n                let id = source.getLoginInfoMap().get('id');\n                url = 'https://app-api.pixiv.net/v1/user/bookmarks/novel?user_id='+id+'&restrict=public';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n            }}`,\n        \"wb\": 1,\n        \"fb\": 0.4 },\n    '收藏·私密': {\n        \"url\": `{{\n            if (page == 1) {\n                let id = source.getLoginInfoMap().get('id');\n                url = 'https://app-api.pixiv.net/v1/user/bookmarks/novel?user_id='+id+'&restrict=private';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n            }}`,\n        \"fb\": 0.4 },\n    'R-18·日': {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https://app-api.pixiv.net/v1/novel/ranking?filter=for_android&mode=day_r18';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n            }}`,\n        \"wb\": 1,\n        \"fb\": 0.2 },\n    'R-18·AI': {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https://app-api.pixiv.net/v1/novel/ranking?filter=for_android&mode=week_ai_r18';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n            }}`,\n        \"fb\": 0.2 },\n    'R-18·周': {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https://app-api.pixiv.net/v1/novel/ranking?filter=for_android&mode=week_r18';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n            }}`,\n        \"fb\": 0.2 }\n}\n\nvar sort = [];\npush = (title, url, fg, wrap, fb) => sort.push({\n    \"title\": title,\n    \"url\": url,\n    \"style\": {\n      layout_flexGrow: fg || 1,\n      layout_flexBasisPercent: fb||-1,\n      layout_wrapBefore: wrap ? true : false\n     }\n  });\n\nfor (x in obj) {\npush(x, obj[x].url, obj[x].fg, obj[x].wb, obj[x].fb);\n}\nJSON.stringify(sort);", "header": "@js:\n(()=>{\n\tlet headers = gethd();\n\treturn JSON.stringify(headers);\n})();", "jsLib": "sleep = Packages.java.lang.Thread.sleep;\nua = 'PixivAndroidApp/5.0.166 (Android 14; RMX3366)';\nappv = '5.0.166';\na_l = 'zh-CN';\n\nbiaoq = new RegExp('^(?:NTR|NTL|修仙|奇幻|后宫|纯爱|隐奸|乱伦|乱交|母女.?|母子|父女|幼女|姐弟|人妻|正太|足交|口交|肛交|丝袜|催眠|系统|原创|续写|软饭流|修罗场|规则怪谈|女性视角|性开放世界|奸尸|冰恋|.?重口)$','i');\n\nfunction timemd5(time) {\n\tvar saltStr = time + '28c1fdd170a5204386cb1313c7077b34f83e4aaf4aa829ce78c231e05b0bae2c';\n\ttry {\n\t\tvar jv = this.java || (typeof java !== 'undefined' ? java : null);\n\t\tif (jv && jv.md5Encode) return jv.md5Encode(saltStr);\n\t} catch(e) {}\n\tvar md = Packages.java.security.MessageDigest.getInstance(\"MD5\");\n\tmd.update(new Packages.java.lang.String(saltStr).getBytes(\"UTF-8\"));\n\tvar dg = md.digest();\n\tvar hx = '';\n\tfor (var di = 0; di < dg.length; di++) {\n\t\tvar bv = dg[di] & 0xFF;\n\t\thx += (bv < 16 ? '0' : '') + bv.toString(16);\n\t}\n\treturn hx;\n}\n\nfunction gethd(url='',ck='') {\n\tconst {java, source} = this;\nlet time = java.timeFormatUTC(Date.now(),\"yyyy-MM-dd'T'HH:mm:ss'+00:00'\",8*60*60*1000);\nlet hash = this.timemd5(time);\nlet atk = source.getLoginHeader()||'';\nif(atk) atk = String('Bearer '+atk);\nlet headers = {\n    'x-client-time': time,\n    \t'User-Agent': ua,\n    \t'accept-language': a_l,\n    \t'authorization': atk,\n    \t'app-os': 'Android',\n    \t'app-os-version': 'Android 14',\n    \t'app-version': appv,\n    'x-client-hash': hash,\n    'cookie': ''\n    \t }\nck!='' && (headers['cookie']=ck);\nurl=url.replace(\"app-api.pixiv.net\",\"210.140.139.155\");\nurl && (headers['host']='app-api.pixiv.net');\nif (url=='') return headers;\nelse if (url.startsWith('data')) return url;\nelse {\n\tdelete headers['x-client-time'];\n\tdelete headers['x-client-hash'];\n\treturn url + ',' + JSON.stringify({'headers':headers});}\n};\n\nfunction leng(str) {\n\tlet length = 0;\n\tconst fuhao = ',.?!:;()[]\"';\n\tconst fuhao2 = '📘';\n\tfor (let char of str) {\n\t\tif (fuhao.includes(char) ) length += 0.5;\n\t\telse if (fuhao2.includes(char) ) length += 2;\n\t\telse length += 1;\n\t\t}\n\t\treturn length;\n}\n\nfunction gethdi(url='') {\turl=url.replace(\"i.pximg.net\",\"210.140.139.133\");\nlet imgoptions = {\n  headers: {\n    'User-Agent': 'PixivIOSApp/5.8.0',\n    'accept-encoding': 'gzip, br',\n    'referer': 'https://app-api.pixiv.net/',\n    'host': 'i.pximg.net'\n    }\n  };\n  return url+','+JSON.stringify(imgoptions);\n }\n \nfunction copy(txt) {\n\tlet htm = `data:text/html;charset=utf-8,<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<style>\nbody {\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: center;\n\talign-items: center;\n\theight: 60vh;}\n</style>\n</head>\n<body>\n<textarea id=\"copyt\" rows=\"3\">${txt}</textarea>\n<br>\n<button id=\"btn1\" onclick=\"copy()\">复制</button>\n<script>\ndocument.addEventListener(\"DOMContentLoaded\", function () {\nconst textarea = document.getElementById(\"copyt\");\ntextarea.style.height = \"auto\";\ntextarea.style.height = textarea.scrollHeight + \"px\";});\nfunction copy() {\nconst cpt = document.getElementById(\"copyt\");\ncpt.select();\ndocument.execCommand(\"copy\");}\n</script>\n</body></html>`;\nthis.java.startBrowser(htm,'复制');\n\t}\n\nfunction lookc(lyc) {\nconst [title,uid,unm,uim,tags,caption,cdate,xh,sc,gk,sTitle,id,ugz] = lyc;\n\tlet htm = `<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<style>\ntable {\n\twidth: 100%;\n\ttable-layout: fixed;\n\ttext-align: center;\n\tmargin: 0 auto;\n\tword-break: break-all;\n\t}\ntd img {\n\twidth: 100%;\n\theight: 100%;\n\tobject-fit: contain;\n\t}\n.cap {\n\t text-align: left;\n\t text-indent: 2em;\n\t}\na {text-decoration: none;}\np {margin: 0.2em auto;}\n</style>\n</head>\n<body>\n<table border=\"1\" cellspacing=\"0\">\n<tr>\n<th colspan=\"6\">标题：<a href=\"https://www.pixiv.net/novel/show.php?id=${id}\">${title}</a></th>\n</tr>\n<tr>\n<td colspan=\"4\">\n作者：<a href=\"https://www.pixiv.net/users/${uid}\">${unm}</a>\n${ugz=='true' ? '<span style=\"font-size: 0.7em;\"> (已关注)</span>' : ''}\n</td>\n<td colspan=\"2\"><img src=\"${uim}\"></td>\n</tr>\n${sTitle!='' ? ('<tr><td colspan=\"6\">小说：《'+sTitle+'》'+'</td></tr>') : ''}\n<tr>\n<td>喜欢</td>\n<td>${xh}</td>\n<td>收藏</td>\n<td>${sc}</td>\n<td>观看</td>\n<td>${gk}</td>\n</tr>\n<tr>\n<td>时间</td>\n<td colspan=\"5\">${cdate}</td>\n</tr>\n<td>标签</td>\n<td colspan=\"5\">${tags}</td>\n</tr>\n${caption!='' ? ('<tr><td>简介</td><td class=\"cap\" colspan=\"5\">'+caption+'</td></tr>') : ''}\n</table>\n<br>\n<script>\n</script>\n</body></html>`;\nthis.java.startBrowser(`data:text/html;charset=utf-8,${encodeURIComponent(htm)}`,'信息');\n}\n\nutil={open(a,b,d){d&&(this.java.longToast(\"\\n\"+d),this.sleep(300));a&&this.java.startBrowser(a,b||\"\")},\ngetMaxLen(a,b=5E4){for(var d=0,c=0;d<a.length;d++)if(d>1E3||(c+=a[d].Text.length)>b){d--;break}return d},splitByMaxLenAdjustLines(a,b=5E4){const d=[];for(var c=a;c.length>b;){a=c.slice(0,b);c=c.slice(b);let e=a.lastIndexOf(\"\\n\");if(e===-1)d.push(a);else{let f=a.slice(0,e+1);a=a.slice(e+1);d.push(f);c=a+c}}c.length>0&&d.push(c);return d},api:{auth:\"https://edge.microsoft.com/translate/auth\",translate:\"https://api.cognitive.microsofttranslator.com/translate?from\\x3d{from}\\x26to\\x3d{to}\\x26api-version\\x3d3.0\"},\nisJa:(a,b=100)=>/[\\u30a1-\\u30f6\\u3041-\\u3093\\uff66-\\uff9d\\uff9e\\uff9f][\\u30a1-\\u9fa5]/.test(b>0?String(a).substring(0,b):a),isEn:(a,b=100)=>!/[\\u30a1-\\u30f6\\u3041-\\u3093\\uff66-\\uff9d\\uff9e\\uff9f\\u4e00-\\u9fa5]{2}/.test(b>0?String(a).substring(0,b):a),noZh:(a,b=100)=>util.isJa(a,b)?(util.lang_zh=\"\\u65e5\\u8bed\",util.lang=\"ja\",!0):util.isEn(a,b)?(util.lang_zh=\"\\u82f1\\u8bed\",util.lang=\"en\",!0):!1,fixImg(a){let b={\"\\uff1a\":\":\",\"\\uff0c\":\",\",\"\\u201c\":'\"',\"\\u201d\":'\"'};return a.replace(/<img .+>/g,d=>d.replace(/[\\u201c\\u201d\\uff1a\\uff0c]/g,\nc=>b[c]))},objfy:(a,b=null,d=2)=>JSON.stringify(a,b,d),getAuth(a){const {cache:b,java:d}=this;if(!a){var c=b.getFromMemory(\"auth\");if(c&&(a=+c.slice(0,13),(c=c.slice(14))&&Date.now()-a<6E5))return c}c=d.ajax(util.api.auth)+\"\";b.putMemory(\"auth\",`${Date.now()}#${c}`);return c},translateTexts(a,b){const {java:d}=this;try{let {from:e,to:f}=b||{};var c=a;if(typeof c===\"string\"){if(!c.trim())return[c];c=util.splitByMaxLenAdjustLines(c)}if(c&&c.length)c=Array.from(c,k=>({Text:k}));else throw\"Invalid input!\";\nlet g=[],h=util.api.translate.replace(\"{from}\",e||\"\").replace(\"{to}\",f||\"zh-hans\"),n=util.getAuth.bind(this),p=n();for(;c.length>0;){let k=d.ajax(h+\",\"+JSON.stringify({body:JSON.stringify(c.splice(0,util.getMaxLen(c))),method:\"POST\",headers:{Authorization:\"Bearer \"+p,\"Content-Type\":\"application/json\"}})),m=JSON.parse(k),{error:l}=m;if(l){if(String(l.code).startsWith(\"401\"))return d.toast(\"auth\\u5931\\uff0c\\u5c1d\\u8bd5\\u91cd\\u65b0\\u7ffb\\u8bd1\"),n(!0),util.translateTexts.bind(this)(a,b);d.log(`Error@code\\uff1a${l.code}\\n msg\\uff1a${l.message}`)}else if(!m.map)throw\"@\\u7ffb\\u8bd1\\u8bf7\\u6c42\\u8fd4\\u56de\\u503c\\u5f02\\u5e38\\uff1a\"+\nk;g=g.concat(m.map(q=>q.translations[0].text))}return g}catch(e){return e=\"@\\u7ffb\\u8bd1\\u5931\\u8d25\\uff1a\\n\"+e+\"\\n\"+JSON.stringify(a).substring(0,100),d.log(e),d.toast(e),this.cache.deleteMemory(\"auth\"),a.join?a:[a]}},xq_trans(){const {java:a,book:b}=this;let d=this.getTrans();if(d!==0){let f=this.source.get(\"bq\")==1;var c=f?String(b.intro).replace(/^\\s*#.*\\n\\s*/,\"\"):b.intro+\"\";let g=c.split(/\\n\\s*/);if(f){var e=(a.get(\"tags\")+\"\").replace(/^\\[|\\]$/g,\"\").split(/,\\s*/).join(\"\\uff0c\");g.unshift(e)}g.unshift(b.name,\nb.author);if(util.noZh(b.name+c)){c=f?3:2;let h=this.translate(g,{start:c});e=f?`\\u6807\\u7b7e(\\u8bd1)\\uff1a#${h[2].replace(/\\uff0c/g,\" #\")}\\n\\u539f\\u6807\\u7b7e\\uff1a#${e.replace(/\\uff0c/g,\" #\")}\\n`:\"\";b.name=h[0];b.intro=`\\u3000\\u3000\\u7ffb\\u8bd1\\uff1a\\u6a21\\u5f0f${d}\\u3001${util.lang_zh}\\n\\u539f\\u6807\\u9898\\uff1a${g[0]}\\n\\u4f5c\\u8005(\\u8bd1)\\uff1a${h[1]}\\n${e}${\"\\u2014\".repeat(24)}\\n${h.slice(c).join(\"\\n\").replace(/\\uff1a\\//g,\":/\")}`.replace(/\\n\\s*/g,\"$\\x26\\u3000\\u3000\");a.put(\"lang\",util.lang)}}},\nmulu_trans(a=this.result){var {java:b}=this;if(b.get(\"sid\")!=\"\\ud83c\\udde8\\ud83c\\uddf3\"&&b.get(\"lang\")+\"\"&&a.length>0){b=Array.from(a,c=>c.title);let d=this.translate(b,{forced:1});Array.from(a,(c,e)=>{c.title=d[e]||c.title})}return a},noImg(a){this.source.put(\"noImg\",a=a?1:\"\");this.java.longToast(a?\"\\n\\u4e0d\\u52a0\\u8f7d\\u6b63\\u6587\\u4e2d\\u56fe\\u7247\\uff0c\\u663e\\u793a\\u5176url\\uff0c\\u56fe\\u7247\\u4f1a\\u5f71\\u54cd\\u6b63\\u6587\\u52a0\\u8f7d\\u901f\\u5ea6\\uff0c\\u6b63\\u6587\\u4e00\\u76f4\\u4e3a\\u7a7a\\u767d\\u65f6\\u5efa\\u8bae\\u5f00\\u542f\":\n\"\\n\\u52a0\\u8f7d\\u6b63\\u6587\\u4e2d\\u56fe\\u7247\\uff08\\u9ed8\\u8ba4\\uff09\\uff0c\\u8f83\\u591a\\u56fe\\u7247\\u4f1a\\u4e25\\u91cd\\u5f71\\u54cd\\u6b63\\u6587\\u52a0\\u8f7d\\u901f\\u5ea6\")},tihuan_trans(a=this.result){a=util.noZh(a)?util.fixImg(this.translate(a)):a;this.source.get(\"noImg\")==1&&(a=a.replace(/<img src=\"(.+?),.*?>/g,\"$1\"));return a}};\nfunction translate(a=this.result,b){let d=this.getTrans(),c=!!a.split,e=util.translateTexts.bind(this);if(b&&b.forced||d==1)var f=e(a,b);else{if(d==0)return c?a:a.join(\"\\n\");if(d==2){a=c?a.split(\"\\n\"):a;f=e(a,b);for(let g=b&&b.start||0,h=f.length;g<h;g++)b=f[g],f[g]=/^<img .+>$/.test(b)?a[g]:`${a[g]}${b.length>6?\"\\n\":\"\"}\\ud83d\\udd04\\ufe0f${b}`}}return c?f.join(\"\\n\"):f}function getTrans(){let a=this.source.get(\"trans\")+\"\";return a===\"\"?(this.source.put(\"trans\",1),1):isNaN(a=+a)?1:a}\nfunction changeTrans(){var a=this.getTrans();a=a>1?0:a+1;this.source.put(\"trans\",a);var modeDesc=\"\";if(a==0)modeDesc=\"⚫ 关闭\";else if(a==1)modeDesc=\"🟢 自动识别(默认)\";else if(a==2)modeDesc=\"🟢 对照显示\";var explain=\"📖 翻译说明：\\n提供自动翻译方便阅读pixiv中大量日语小说，微软翻译api，自动识别日语/英语并对其翻译为简体中文，依据为前100个字符，支持关闭/开启(默认)/段后展示三种模式，翻译内容：正文/简介/标签/作者/小说名/章节名，如果详情页报错请关闭\\n\\n当前模式：\"+modeDesc;this.java.longToast(explain);}\n\nfunction pxOauth(postBody) {\n\tconst {java} = this;\n\tlet time = java.timeFormatUTC(Date.now(),\"yyyy-MM-dd'T'HH:mm:ss'+00:00'\",8*60*60*1000);\n\tlet hash = timemd5(time);\n\tlet req = 'POST /auth/token HTTP/1.1\\r\\nHost: oauth.secure.pixiv.net\\r\\n'\n\t\t+'User-Agent: '+ua+'\\r\\n'\n\t\t+'content-type: application/x-www-form-urlencoded\\r\\n'/*--- 🎉 小彩蛋：推荐小说《说好低调发育，全服公告什么鬼？》作者：稀粥西洲 🎉 --- */\n\t\t+'x-client-time: '+time+'\\r\\nx-client-hash: '+hash+'\\r\\n'\n\t\t+'accept-language: '+a_l+'\\r\\napp-os: Android\\r\\napp-os-version: Android 14\\r\\napp-version: '+appv+'\\r\\n'\n\t\t+'Content-Length: '+postBody.length+'\\r\\nConnection: close\\r\\n\\r\\n'+postBody;\n\tlet sf = Packages.javax.net.ssl.SSLSocketFactory.getDefault();\n\tlet ips = ['210.140.139.155','210.140.139.152','210.140.139.158','210.140.139.161'];\n\tlet sock = null, lastErr = '';\n\tfor (let i = 0; i < ips.length; i++) {\n\t\ttry {\n\t\t\tlet addr = Packages.java.net.InetAddress.getByName(ips[i]);\n\t\t\tsock = sf.createSocket(addr, 443);\n\t\t\tsock.setSoTimeout(12000);\n\t\t\tlet os = sock.getOutputStream();\n\t\t\tos.write(new Packages.java.lang.String(req).getBytes('UTF-8'));\n\t\t\tos.flush();\n\t\t\tlet rd = new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(sock.getInputStream(),'UTF-8'));\n\t\t\tlet sb = new Packages.java.lang.StringBuilder();\n\t\t\tlet line;\n\t\t\twhile ((line = rd.readLine()) != null) { sb.append(line); sb.append('\\n'); }\n\t\t\treturn String(sb.toString());\n\t\t} catch(e) {\n\t\t\tlastErr = e;\n\t\t\ttry { if (sock != null) sock.close(); } catch(e2) {}\n\t\t}\n\t}\n\tthrow lastErr == '' ? 'oauth直连失败：无可用IP' : lastErr;\n}", "lastUpdateTime": "1788020378026", "loginCheckJs": "//java.toast('登录检查：'+result);\n\nif (result.code() == 400) {\n\tsource.login();\n\tsleep(500);\n\tlet url = gethd(result.url());\n\tresult = java.connect(url);\n\t}\nresult", "loginUi": "[ \n     {\n        name: \"下载pixEz（支持插画、回复评论等）\",\n        type: \"button\",\n        action: \"https://gh-proxy.org/https://github.com/Notsfsssf/pixez-flutter\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        name: \"token\",\n        type: \"text\"\n    },\n    {\n        name: \"token说明\",\n        type: \"button\",\n        action: \"java.longToast(`\ntoken说明：\n填写该值后点击右上角√进行登录\n可以通过获取token按钮得到(不需要跳转app)\n阅读正式版无法支持获取token功能`);\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        name: \"获取token\",\n        type: \"button\",\n        action: \"Login()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        name: \"id\",\n        type: \"text\"\n    },\n    {\n        name: \"id说明\",\n        type: \"button\",\n        action: \"java.longToast(`\nid说明：\n登录时该值为空会自动填写该值，这是登录账号的ID（可手动更改）。\n发现页的收藏分类加载的该ID的收藏`);\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        name: \"搜索说明\",\n        type: \"button\",\n        action: \"java.longToast(`\n搜索说明：\n默认使用关键词搜索\n输入小说id号显示对应的小说\n输入“正文@许斌”搜索正文含许斌的小说\n输入“作者@69559022”搜索指定id作者的书`);\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        name: \"书名\",\n        type: \"text\"\n    },\n     {\n        name: \"↑追更该书\",\n        type: \"button\",\n        action: \"scz(3)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n     {\n        name: \"复制id\",\n        type: \"button\",\n        action: \"fuzhi(2)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n     {\n        name: \"取消追更\",\n        type: \"button\",\n        action: \"scz(30)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"章节\",\n        type: \"text\"\n    },\n    {\n        name: \"↑收藏该章\",\n        type: \"button\",\n        action: \"scz(1,'public')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        name: \"取消收藏\",\n        type: \"button\",\n        action: \"scz(10)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        name: \"私密收藏\",\n        type: \"button\",\n        action: \"scz(1,'private')\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n     {\n        name: \"详情\",\n        type: \"button\",\n        action: \"caption()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        name: \"作者\",\n        type: \"text\"\n    },\n    {\n        name: \"↑关注作者\",\n        type: \"button\",\n        action: \"scz(2)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n     {\n        name: \"复制id\",\n        type: \"button\",\n        action: \"fuzhi(1)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n     {\n        name: \"取消关注\",\n        type: \"button\",\n        action: \"scz(20)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"购买token\",\n        type: \"button\",\n        action: \"java.longToast('喵～购买链接被本喵挠掉啦！请勿轻信任何购买渠道，保护好你的小钱钱(๑•̀ㅂ•́)و✧')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        name: \"查看设置\",\n        type: \"button\",\n        action: \"showSettings()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        name: \"(ฅ´ω`ฅ)\",\n        type: \"button\",\n        action: \"showCatBlessing()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        name: \"🖼️图片显示\",\n        type: \"button\",\n        action: \"toggleImg()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    \t{\n        name: \"🔢补充序号\",\n        type: \"button\",\n        action: \"xvhao()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    \t{\n        name: \"📝简介标签\",\n        type: \"button\",\n        action: \"biaoqian()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    \t{\n        name: \"📘书名标识\",\n        type: \"button\",\n        action: \"gongcun()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    \t{\n        name: \"🌐翻译模式\",\n        type: \"button\",\n        action:  \"changeTrans()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    \t{\n        name: \"书源介绍\",\n        type: \"button\",\n        action: \"showSourceIntro()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        name: \"屏蔽标签\",\n        type: \"text\"\n    }\n]", "loginUrl": "function gongcun() {\nlet gc = source.get('gc');\nif(gc!=1) {source.put('gc',1);java.toast('🟢已开启\\n书名开头会有📘符号');}\nelse {source.put('gc',0);java.toast('⚫已关闭\\n不会添加📘');}\n\t}\nfunction xvhao() {\nlet xh = source.get('xh');\nif(xh!=1) {source.put('xh',1);java.toast('🟢已开启\\n会自动补充章节名序号');}\nelse {source.put('xh',0);java.toast('⚫已关闭\\n不会补充序号');}\n\t}\nfunction biaoqian() {\nlet bq = source.get('bq');\nif(bq!=1) {source.put('bq',1);java.toast('🟢已开启\\n会在简介显示作品标签');}\nelse {source.put('bq',0);java.toast('⚫已关闭\\n不会显示简介标签');}\n\t}\n\nfunction toggleImg() {\n    let noImg = source.get('noImg');\n    if (noImg == 1) {\n        source.put('noImg', 0);\n        java.toast('🟢 已开启显示插图');\n    } else {\n        source.put('noImg', 1);\n        java.toast('⚫ 已关闭插图显示（仅显示链接）');\n    }\n    java.reLoginView();\n}\n\nfunction showSettings() {\n    let gc = source.get('gc') == 1 ? '🟢开启' : '⚫关闭';\n    let xh = source.get('xh') == 1 ? '🟢开启' : '⚫关闭';\n    let bq = source.get('bq') == 1 ? '🟢开启' : '⚫关闭';\n    let noImg = source.get('noImg') == 1 ? '⚫隐藏' : '🟢显示';\n    let trans = source.get('trans') || '1';\n    let transMap = {'0':'⚫关闭','1':'🟢自动识别(默认)','2':'🟢对照显示'};\n    let transStr = transMap[trans] || trans;\n    let msg = '\\n🖼️图片显示：' + noImg + '\\n🔢补充序号：' + xh + '\\n📝简介标签：' + bq + '\\n📘书名标识：' + gc + '\\n🌐翻译模式：' + transStr;\n    java.longToast(msg);\n}\n\nfunction showSourceIntro() {\n    let intro = '📖 本小说书源基于以下两个版本合并修改：\\n\\n1️⃣ 带公告和翻译功能的版本：\\n   由不知名人士在洛娅橙原版基础上添加了微软翻译功能，\\n   后来又被加入了商业推广广告。\\n\\n2️⃣ 由某位热心大佬修复直连后的洛娅橙原版：\\n   修复了网络直连问题，保持了原版纯净。\\n\\n✨ 猫猫黛西（由 DeepSeek 全程代劳）基于以上两个版本，\\n   去除了所有广告，\\n   进行了大量界面优化和功能调整，\\n   为您带来纯净、便捷的阅读体验。\\n\\n感谢所有为开源做出贡献的大佬们！(ฅ´ω`ฅ)';\n    java.longToast(intro);\n}\n\nfunction login() {\nlet Info = source.getLoginInfoMap();\ntry {\nlet tk = Info.token;\nif (!tk || tk == '') throw 'TOKEN为空，请先填写';\nlet body = `client_id=MOBrBDS8blbauoSck0ZfDbtuzpyT&client_secret=lsACyCD94FhDUtGTXi3QzcFE2uU1hqtDaKeqrdwj&grant_type=refresh_token&refresh_token=${tk}&include_policy=true`;\nlet rr;\ntry {\nrr = pxOauth(body);\n} catch(err) {\njava.log('px oauth直连失败，回退常规请求：'+err);\nlet time2 = java.timeFormatUTC(Date.now(),\"yyyy-MM-dd'T'HH:mm:ss'+00:00'\",8*60*60*1000);\nlet headers = {\n    'User-Agent': ua,\n    'content-type': 'application/x-www-form-urlencoded',\n    'x-client-hash': timemd5(time2),\n    'accept-language': a_l,\n    'app-version': appv,\n    'app-os-version': 'Android 6.0',\n    'x-client-time': time2,\n    'app-os': 'Android',\n    'host': 'oauth.secure.pixiv.net'\n  };\nlet url = 'https://oauth.secure.pixiv.net/auth/token';\nurl = url.replace(\"oauth.secure.pixiv.net\",\"210.140.139.155\");\nrr = String(java.post(url,body,headers).body());\n}\nif (rr.indexOf('{') >= 0) rr = rr.substring(rr.indexOf('{'));\nlet atk = rr.match(/\"access_token\"[:\\s\"]+([^\"]+)/)[1];\nsource.putLoginHeader(atk);\nif (Info.id=='') {\n\tInfo.id = com.jayway.jsonpath.JsonPath.read(rr, \"$.user.id\");}\nsource.putLoginInfo(JSON.stringify(Info));\n} catch(err) {\n\tjava.toast('\\n💔登录失败');\n\tjava.log('px登录失败：'+err);\n  \tsleep(600);}\n}\n\nfunction scz(x, restrict) {\n\tlet headers = gethd();\n\tlet url = \"https://210.140.139.155/\";\n\tlet body,nm,tt,ttt;\n\tif (x==1) {\n\t url += 'v2/novel/bookmark/add';\n\t \tlet id = cache.get('pxid');\n\t \tif (id=='') ttt='请刷新章节';\n\t \tbody = 'novel_id='+id+'&restrict=' + (restrict || 'public');\n\t \tnm = source.getLoginInfoMap().get('章节');\n\t \ttt= (restrict=='private'? '私密收藏' : '收藏');\n\t } else if(x==2) {\n\t \turl += 'v1/user/follow/add';\n\t \tlet uid = cache.get('pxuid');\n\t \tif (uid=='') ttt='请刷新章节或详情页';\n\t \tbody = 'user_id='+uid+'&restrict=public';\n\t \tnm = source.getLoginInfoMap().get('作者');\n\t \ttt='关注';\n\t \t} else if(x==10) {\n\t \turl += 'v1/novel/bookmark/delete';\n\t \tlet id = String(cache.get('pxid'));\n\t \tbody = id ? 'novel_id='+id : '';\n\t \tnm = source.getLoginInfoMap().get('章节');\n\t \ttt='取消收藏';\n\t \t} else if(x==20) {\n\t \turl += 'v1/user/follow/delete';\n\t \tlet uid = String(cache.get('pxuid'));\n\t \tbody = uid ? 'user_id='+uid : '';\n\t \tnm = source.getLoginInfoMap().get('作者');\n\t \ttt='取消关注';\n\t \t} else if(x==3) {\n\t \turl += 'v1/watchlist/novel/add';\n\t \tlet sid = cache.get('pxsid');\n\t \tif (sid=='') ttt='请刷新详情页';\n\t \tbody = 'series_id='+sid;\n\t \tnm = source.getLoginInfoMap().get('书名');\n\t \ttt='追更';\n\t \t} else if(x==30) {\n\t \turl += 'v1/watchlist/novel/delete';\n\t \tlet sid = String(cache.get('pxsid'));\n\t \tbody = sid ? 'series_id='+sid : '';\n\t \tnm = source.getLoginInfoMap().get('书名');\n\t \ttt='取消追更';\n\t \t}\n\n\ttry {\n\t\tif (ttt) {java.longToast(ttt);throw 't空';}\n\t\tif (!body) throw 'b空';\n\t\theaders['host']='app-api.pixiv.net';\n\t\tlet jg = java.post(url,body,headers).statusCode();\n\t\tif (jg!=200) throw tt+'响应码异常';\n\t\telse java.longToast(`\\n已${tt}：\\n${nm}`);\n\t\t} catch(e) {\n\t\t\tif (!ttt) java.toast(`\\n${tt}失败`);\n\t\t\tjava.log(e);}\n\t}\n\nfunction reck() {\nsource.removeLoginHeader();\ncookie.removeCookie('https://accounts.pixiv.net');\ncookie.removeCookie('https://accounts.google.com');\ncookie.removeCookie('https://api.weibo.com');\n\t}\n\nfunction Login() {\nlet rkey = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';\nlet cv='';\nfor (let i = 0; i < 128; i++) {\n\tlet ra = Math.floor(Math.random()*rkey.length);\n\tcv+=rkey.charAt(ra);}\n\nlet aly = new JavaImporter(\nPackages.cn.hutool.crypto.digest.Digester,\nPackages.cn.hutool.core.codec.Base64,\nPackages.cn.hutool.crypto.digest.DigestAlgorithm);\nwith (aly) {\n\tlet asBs =  Packages.java.lang.String(cv).getBytes(\"US-ASCII\");\n\tlet digester = new Digester(DigestAlgorithm.SHA256);\n\tlet hashBs = digester.digest(asBs);\n\tvar codeChallenge  = Base64.encodeUrlSafe(hashBs);\n}\n\nlet urllg =`https://app-api.pixiv.net/web/v1/login?code_challenge=${codeChallenge}&code_challenge_method=S256&client=pixiv-android`;\nreck();\n\nlet wbua=java.getWebViewUA().replaceAll(\"; wv| Version\\/4.0\",'')+'';\nif (/HUA\\s*WEI/i.test(wbua))\nwbua=\"Mozilla/5.0 (Linux; Android 14; RMX3366 Build/UKQ1.230924.001) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.7049.100 Mobile Safari/537.36\";\n\nlet bb=java.startBrowserAwait(urllg+`,{\n\"headers\":{\n\t\"User-Agent\": \"${wbua}\"\n\t}}`,'登录',false).body();\nlet code;\nif (bb.includes('<title>Online com')) {\nsleep(600);\njava.toast('稍等');\nlet over = java.webViewGetOverrideUrl(bb,'https://app-api.pixiv.net/','','pixiv:.*');\ncode = over.match(/code=([^&]+)/);\n}\nreck();\n\nlet token;\nif (code) {\nlet tkurl = 'https://oauth.secure.pixiv.net/auth/token';\nlet headers = gethd();\nlet body = `code_verifier=${cv}&code=${code[1]}&grant_type=authorization_code&redirect_uri=https://app-api.pixiv.net/web/v1/users/auth/pixiv/callback&client_id=MOBrBDS8blbauoSck0ZfDbtuzpyT&client_secret=lsACyCD94FhDUtGTXi3QzcFE2uU1hqtDaKeqrdwj&include_policy=true`;\nlet tkr = java.post(tkurl,body,headers);\ntoken = tkr.body().match(/refresh_token\":\"([^\"]+)/);\n}\n\nif (token) {\nlet htm = `data:text/html;charset=utf-8,<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><style>\nh2 {\n\ttext-align: center;\n\tline-height: 6;}\ntextarea {\n\tfont-size: 12px;\n\twidth: 96%;\n\tmargin: 10px 2%;\n\tpadding: 6px;}\n.ann {\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\theight: 50vh;}\nbutton {\n\tbackground-color: rgb(76,175,80);\n\tcolor: white;\n\tborder: none;\n\tborder-radius: 4px;\n\theight: 6vh;\n\twidth: 30vw;\n\toverflow: hidden;\n\ttransition: font-size 0.3s;\n\tfont-size: 16px;}\n.an-s {\n\tfont-size: 12px;}\n.alert-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\tbackground: rgba(0, 0, 0, 0.6);\n\tdisplay: none;\n\tjustify-content: center;\n\talign-items: center;\n\tz-index: 9999;}\n.alert-box {\n\tbackground: rgb(232,234,246);\n\tpadding: 10px;\n\tborder-radius: 12px;\n\tbox-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);\n\tmin-width: 100px;\n\ttext-align: center;}\n</style></head>\n<body>\n<div class=\"alert-overlay\" id=\"alertO\">\n <div class=\"alert-box\">\n  <p>已复制到剪贴板：</p>\n  <p id=\"alertM\" style=\"font-size: 12px;\"></p>\n </div>\n</div>\n<h2>Token获取成功🥳</h2>\n<textarea readonly id=\"copyt\" rows=\"3\">${token[1]}</textarea>\n<p style=\"font-size: 12px;\">请复制粘贴到登录界面的token框，然后点击√进行登录</p>\n<div class=\"ann\">\n<button id=\"btn1\" onclick=\"copy()\">复制</button>\n</div>\n<script>\nfunction showAlert(txt, time) {\nconst overlay = document.getElementById('alertO');\nconst message = document.getElementById('alertM');\nmessage.textContent = txt;\noverlay.style.display = 'flex';\nif (time > 0) {\n\tsetTimeout(() => {\n\t\toverlay.style.display = 'none';\n\t\t}, time);\n\t}\n}\nfunction copy() {\nconst btn = document.getElementById('btn1');\nbtn.classList.add('an-s');\nconst cpt = document.getElementById(\"copyt\");\ncpt.select();\ntry {\n    const cpy = document.execCommand(\"copy\");\n    if (cpy.length<9) throw '异常';\n    showAlert(cpt.value, 1000);\n  } catch (e) {alert(\"复制失败，请手动复制\");}\nsetTimeout(() => {\n\tbtn.classList.remove('an-s');\n\t}, 450);\n}\n</script>\n</body></html>`;\n\njava.startBrowser(htm,'获取token');\njava.log(token[1]);\n\t} else {sleep(700);java.toast('获取失败😭');}\n}\n\nfunction fuzhi(x) {\n\tif (x==1) {\n\tlet uid = cache.get('pxuid');\n\tcopy(uid);}\n\tif (x==2) {\n\tlet sid = cache.get('pxsid');\n\tcopy(sid);}\n\t}\n\nfunction caption() {\n\tlet lyc=cache.getFromMemory('pxcjj');\n\tif (lyc) lookc(lyc);\n\telse java.longToast('请刷新正文');\n\t}\n\nfunction showCatBlessing() {\n    var catBlessings = [\n        '猫猫祝你今天心情超好～ 多笑笑，好运自然来喵！(ฅ´ω`ฅ)',\n        '愿猫猫的柔软治愈你～ 今天也要好好吃饭、好好休息喵！',\n        '猫猫保佑你嘎嘎！今天更容易发现生活中的小确幸哦～',\n        '愿你像猫猫一样慵懒又幸福，鱼干自由，阳光满屋喵！',\n        '猫猫说：你今天超棒的！继续保持，好运正在路上喵～',\n        '愿你今天眼睛亮亮的，发现更多美好，烦恼统统退散喵！',\n        '猫猫赐你一天好心情buff！不易低落，不易烦躁，开心一整天喵！',\n        '愿你今天皮肤光滑、心情愉悦，像猫猫一样优雅又自在喵！',\n        '猫猫觉得你很有眼缘～ 今天运气会变好，惊喜等着你喵！',\n        '愿你今天精神饱满，做事顺顺利利，猫猫在背后保佑你喵！',\n        '哈！(ᗒᗣᗕ)՞',\n        '愿你今天说话都特别顺溜，好运buff已到位，冲鸭！'\n    ];\n    var idx = Math.floor(Math.random() * catBlessings.length);\n    java.longToast('猫猫黛西：' + catBlessings[idx]);\n}", "respondTime": 180705, "ruleBookInfo": {"author": "$.novel_series_detail.user.name\n<js>\nlet uid = java.get('uid');\nlet auth = result || String(book.author).replace(/[\\u200b]+/,'');\nif (uid == '') {uid = java.getString('$.novel_series_detail.user.id');}\nlet Info=source.getLoginInfoMap();\nInfo['作者'] = auth;\ncache.put('pxuid',uid);\nsource.putLoginInfo(JSON.stringify(Info));\n'\\u200b' + auth\n</js>", "canReName": "1", "init": "<js>\nvar sid = java.get('sid');\nlet i = String(book.bookUrl).includes('https:/');\nif (i) { sid = String(book.bookUrl).match(/\\d{3,}$/);}\n\ncache.deleteMemory('pxcjj');\nif (sid == '🇨🇳') {\n\tlet Info=source.getLoginInfoMap();\n\tlet bkn = String(book.name);\n\tlet id = java.hexDecodeToString(result).match(/\\d+$/)[0];\n\tInfo['书名'] = '';\n\tcache.put('pxsid','');\n\tInfo['章节'] = bkn;\n\tcache.put('pxid',id);\n\tsource.putLoginInfo(JSON.stringify(Info));\n\tlet length = leng(bkn);\t\nbook.intro = (source.get('bq')==1?String(java.get('tags')).replace(/, /g,' #').replace('[','　　#').replace(']','\\n　　'):'') + (length>18?('《'+book.name+'》\\n'):'') + java.get('jianjie');\n\trr='1';\n\n} else {\nlet url = 'https://app-api.pixiv.net/v2/novel/series?series_id=' + sid;\nbook.bookUrl = `data:;base64,${java.base64Encode(url)},{\"type\":\"px\"}`;\n\ntry {\n\njg = java.connect(gethd(url));\nrr = jg.body();\nif (jg.code() == 400) {\n\tsource.login();\n\tPackages.java.lang.Thread.sleep(500);\n\trr = java.ajax(gethd(url));\n\t}\n\n} catch(err) {\n\trr={};\n\tjava.toast('详情页链接加载失败'+sid);\n\t}\n\njava.setContent(rr);\n\ntry {\nlet tm = java.getString('$.novel_series_latest_novel.create_date');\nlet d = new Date(tm);\nd = java.timeFormatUTC(d,'yy/MM/dd',8*60*60*1000);\nbook.kind = String(book.kind).replace(/\\d+\\/\\d+\\/\\d+|$/,d).replace('null','');\n} catch(err) {java.toast('详情页内容错误');}\n\nlet bkn = String(java.getString('$.novel_series_detail.title')).replace(/^《(.+)》$/,'$1');\nbook.name = bkn.replace(/[(（].{0,9}((?:仙侠|纯爱|后宫|萝莉).?){3,}.{0,9}[)）](?=\\s*[一-ꀀ])/,'');\n\nif (book.name == '') {\n\tlet txte = java.getString('$..user_message',rr);\n\tjava.longToast('\\n未获取到书名\\n'+txte);\n\t} else {\n\t\n\tlet Info=source.getLoginInfoMap();\n\tInfo['书名'] = book.name;\n\tcache.put('pxsid',sid);\n\tInfo['章节'] = '';\n\tcache.put('pxid','');\n\tsource.putLoginInfo(JSON.stringify(Info));\n\t\n\tif (source.get('gc') == 1) book.name='📘'+book.name;\n\t}\n\nif (book.coverUrl == null) {\n\tlet img = java.getString('$.novel_series_latest_novel.image_urls.large');\n\tbook.coverUrl = gethdi(img);\n}\n\nlet length = leng(String(book.name));\nif (length > 18) length= '《'+String(book.name).replace(/^📘/,'')+'》\\n';\nelse length = '';\nlet jianjie = java.getString('$.novel_series_detail.caption');\nbook.intro = (source.get('bq')==1?String(java.get('tags')).replace(/, /g,' #').replace('[','　　#').replace(']','\\n　　'):'') + length + java.get('jianjie');\njava.put('jianjie',jianjie);\njava.put(\"bookr\",rr);\n}\nutil.xq_trans.call(this);\nrr\n</js>", "lastChapter": "$.novel_series_latest_novel.title##[【《]?{{book.name}}[》】]?", "tocUrl": "@js:book.bookUrl", "wordCount": "$.novel_series_detail.total_character_count"}, "ruleContent": {"content": "script.0@html\n<js>\nlet rr = result.match(/novel:\\s*({.+})/)[1];\nlet id = String(chapter.url).match(/\\d+(?=$|,)/)[0];\n\nlet bin = book.durChapterIndex;\nlet cin = chapter.index;\nlet inn = cin - bin;\nif (inn==0) {\nlet rra = result.match(/authorDetails:\\s*({.+})/)[1];\nlet uid = java.getString('$..userId',rra);\nlet unm = java.getString('$..userName',rra);\nlet uim = java.getString('$..url',rra);\nuim = uim.replace('i.pximg.net','pximg.hakurei.cc');\nlet ugz = java.getString('$..isFollowed',rra);\nlet tags = java.getStringList('$..tags[*]',rr);\ntags = Array.from(tags).map(x => `＃${x}`).join(' ');\nlet caption = String(java.getString('$..caption',rr));\ncaption = caption ? '<p>'+caption.replace(/(?:<br \\/>)+/g, '</p><p>')+'</p>' : '';\nlet cdate = java.getString('$..cdate',rr);\nlet xh = java.getString('$..rating.like',rr);\nlet sc = java.getString('$..rating.bookmark',rr);\nlet gk = java.getString('$..rating.view',rr);\nlet title = java.getString('$.title',rr);\nlet sTitle = java.getString('$.seriesTitle',rr);\ncache.putMemory('pxcjj',[title,uid,unm,uim,tags,caption,cdate,xh,sc,gk,sTitle,id,ugz]);\ncache.put('pxuid',uid);\ncache.put('pxid',id);\nlet Info=source.getLoginInfoMap();\n\nlet sid = java.get('sid');\nif (sid != '🇨🇳') {\n\tInfo['书名']=String(book.name).replace(/^📘/,'');\n\tcache.put('pxsid',sid);} else {\n\tInfo['书名']='';\n\tcache.put('pxsid','');}\n\nInfo['章节'] = chapter.title;\nInfo['作者'] = book.author.replace('\\u200b','');\nsource.putLoginInfo(JSON.stringify(Info));\n}\n\nlet urls = java.getString('$..urls',rr);\nlet tt = String(java.getString('$.text',rr));\nlet img1 = tt.match(/\\[uploadedimage\\:\\d+\\]/g)||'';\nlet img2 = tt.match(/\\[pixivimage\\:[\\d\\-]+\\]/g)||'';\nfor (x of img1) {\n\tlet id = x.match(/\\d+/)[0];\n\tlet url = java.getString('$..'+id+'.urls.original',rr);\n\tlet re = new RegExp('\\\\[uploadedimage\\\\:'+id+'\\\\]');\n\ttt = tt.replace(re,'<img src=\"'+gethdi(url)+'\"/>');\n\t}\nfor (x of img2) {\n\tlet id = x.match(/[\\d\\-]+/)[0];\n\tlet url = java.getString('$..'+id+'..images.original',rr);\n\tif (url=='null') url = java.getString('$..'+id+'..images.medium',rr);\n\tlet re = new RegExp('\\\\[pixivimage\\\\:'+id+'\\\\]');\n\ttt = tt.replace(re,'<img src=\"'+gethdi(url)+'\"/>');\n\t}\ntt.replaceAll('[newpage]','\\n—换页符—\\n').replace(/\\[\\[jumpuri\\:(.+)\\>.+\\]\\]/,'🖇️$1🖇️')\n</js>", "replaceRegex": "@js:util.tihuan_trans.call(this);"}, "ruleExplore": {"author": "@js:\nlet uid = java.getString('$.user.id');\njava.put('uid',uid);\njava.getString('$.user.name');", "bookList": "<js>\nif (baseUrl.startsWith('http://127.') ) {\n\trr = [{}];\n\t} else {\nlet nurl = java.getString('$.next_url');\nif (nurl == '') {\n\tjava.toast('发现页到底了');\n\tsource.put('nurl','http://127.0.0.1');\n\t}\nelse {\n\tsource.put('nurl',nurl);\n\t}\nif (baseUrl.includes('/watchlist/novel') ) {\n\trr = java.getElement(\"$.series\");\n\t} else { rr = java.getElement(\"$.novels\");}\n\n}\nrr\n</js>", "bookUrl": "<js>\nlet id = java.getString('$.id');\nlet sid = java.getString('$.series.id');\nlet rr = 'https://app-api.pixiv.net/webview/v2/novel?id=' + id;\n\nif (baseUrl.includes('/watchlist/novel') ) {\n\tsid = id;\n\tif (source.get('gc')=='1') book.name='📘'+book.name;\n}\nelse if (sid=='') {sid='🇨🇳';}\nelse {\n\tlet jj = java.get('jianjie');\n\tjava.put('jianjie',book.name+'\\n'+jj);\n}\njava.put('sid',sid);\n`data:;base64,${java.base64Encode(rr)},{\"type\":\"px\"}`\n</js>", "coverUrl": "<js>\nif (baseUrl.includes('/watchlist/novel') ) {url = java.getString('$.url');}\nelse {url = java.getString('$.image_urls.large');}\ngethdi(url);\n</js>", "intro": "<js>\nlet jj = java.get('jianjie');\nlet rr = '\\n' + java.getString('$.caption');\nlet rs = java.htmlFormat(rr);\njava.put('jianjie',rs);\njj + rs\n</js>", "kind": "@js:\nif (baseUrl.includes('/watchlist/novel') ) {\n\trrr = '';\n\tjava.put('tags','');\n\ttm = java.getString('$.last_published_content_datetime');\n\t} else {\n\t\tlet tags=java.get('tags');\n\t\trr=String(tags).slice(1,-1).split(', ');\n\t\trrr = rr.filter(i => biaoq.test(i) );\n\t\trr.forEach(x=>{\n\t\t\tif (x=='萝莉') {\n\t\t\t\tif (!rrr.includes('幼女')) rrr.unshift(x);}\n\t\t\telse if (['熟女','淫妻'].includes(x)) {\n\t\t\t\tif (!rrr.includes('人妻')) rrr.unshift(x);}\n\t\t\telse if (['仙侠','古风','武侠'].includes(x) && !rrr.some(y=>/[修仙古风武侠]{2}/.test(y))) {\n\t\t\t\t\trrr.unshift(x);}\n\t});\n\t\ttm = java.getString('$.create_date');\n}\nlet d=new Date(tm);\nd=java.timeFormatUTC(d,'yy/MM/dd',8*60*60*1000);\n\nrrr.toString()+','+d", "name": "@js:\nresult = String(java.getString('$.title'));\nlet bookn = String(java.getString('$.series.title')).replace(/^《(.+)》$/,'$1');\nif (bookn != '') {\n\tjava.put('jianjie', '《'+bookn+'》\\n');\n\tresult = result.replace(bookn,'♸').replace(/[《【]?♸[】》]?/,'')||result;\n\t}\nresult = result.replace(/[(（].{0,9}((?:仙侠|纯爱|后宫|萝莉).?){3,}.{0,9}[)）](?=\\s*[一-ꀀ])/,'').replace(/《(.+)》/,'$1');\n\nlet tags = java.getStringList('$.tags..name');\njava.put('tags',tags);\ntags=String(tags).slice(1,-1).split(/, |\\//);\nlet bptag=source.getLoginInfoMap()['屏蔽标签']||'';\nif (bptag!='') {\n\tbptag = String(bptag).split(/[,\\|]/).map(x=>x.replace('#',''))\nfor (let char of tags)\nif (bptag.includes(char)) result=''\n}\nresult", "wordCount": "$.text_length"}, "ruleSearch": {"author": "<js>\n{{(source.ruleExplore.author).replace('@js:','')}}\n</js>", "bookList": "<js>\npage=cache.getFromMemory('pxpage');\ncache.deleteMemory('pxpage');\nif (baseUrl.startsWith('http://127.')) {rr = [{}];}\n\nelse {\nrr = java.getElement('$.novels');\nnurl = java.getString('$.next_url');\nif (rr.length<6&&page==1&&nurl!='') {\n\tsleep(500);\n\trs = java.ajax(gethd(nurl));\n\tjava.setContent(rs)\n\trrr = java.getElement('$.novels');\n\trr.addAll(rrr);\n\tnurl = java.getString('$.next_url');\n}\n\nif (nurl == '') {\n\tjava.toast('搜索页到底了');\n\tsource.put('nurls','http://127.0.0.1');\n\t} else {source.put('nurls',nurl);}\n\n}\nrr\n</js>", "bookUrl": "<js>\nlet id = java.getString('$.id');\nlet sid = java.getString('$.series.id');\nif (sid=='') {\n\tsid='🇨🇳';\n\t} else {\n\tlet jj = java.get('jianjie');\n\tjava.put('jianjie',book.name+'\\n'+jj);\n\t}\nlet rr = 'https://app-api.pixiv.net/webview/v2/novel?id=' + id;\njava.put('sid',sid);\n`data:;base64,${java.base64Encode(rr)},{\"type\":\"px\"}`\n</js>", "coverUrl": "$.image_urls.large\n<js>\ngethdi(result);\n</js>", "intro": "<js>\nlet jj = java.get('jianjie');\nlet rr = '\\n' + java.getString('$.caption');\nlet rs = java.htmlFormat(rr);\njava.put('jianjie',rs);\njj + rs\n</js>", "kind": "<js>\n{{(source.ruleExplore.kind).replace('@js:','')}}\n</js>", "name": "<js>\n{{(source.ruleExplore.name).replace('@js:','')}}\n</js>", "wordCount": "$.text_length"}, "ruleToc": {"chapterList": "<js>\nlet sid = java.get('sid');\nif (sid == '🇨🇳') {result=[result];}\nelse {\n\ttry {\n\t\tlet url = java.hexDecodeToString(result);\nlet bookr=java.get('bookr')+'';\nif (!bookr) {\n\tlet rs=java.connect(gethd(url));\n\tif (rs.code() == 400) {\n\t\tsource.login();\n\t\tsleep(500);\n\t\trs=java.connect(gethd(url));}\nbookr=rs.body();}\n\t\tjava.setContent(bookr);\n\t\tjava.put('bookr','');\n\t\t} catch(e){}\nresult = java.getElement('$.novels');\n}\nutil.mulu_trans.call(this);\nresult\n</js>", "chapterName": "<js>\nlet sid = java.get('sid');\nif (sid == '🇨🇳') {cc=book.name;}\nelse {\nlet title = java.getString('$.title');\ntitle = String(title).replace(/[(（].{0,9}((?:仙侠|纯爱|后宫|萝莉).?){3,}.{0,9}[)）](?=\\s*[一-ꀀ])/,'');\nlet bkn=String(book.name).replace(/^📘|[。？！]+$/g,'');\ncc = title.replace(bkn,'♸').replace(/[《【]♸[。？！]*[】》]\\s*|♸[。？！\\s]*/,'')||title;\n\t}\nif (source.get('xh')==1) {\n\tcc='▫️'+cc;\n}\n\tcc\n</js>", "chapterUrl": "<js>\nlet sid = java.get('sid');\nif (sid == '🇨🇳') {\n\t\tuu=java.hexDecodeToString(result);\n\t\tbook.putCustomVariable('这是单贴，链接：'+uu);\n\t}\nelse {\nlet id = java.getString('$.id');\nuu='https://app-api.pixiv.net/webview/v2/novel?id=' + id;\n}\ngethd(uu);\n</js>", "formatJs": "title.replace(/^▫️(?![第序]|#?第?[\\d零一二三四五六七八九十百千]+[章回])/,'第'+index+'章 ').replace(/^▫️/,'');", "nextTocUrl": "$.next_url\n<js>\nif (result!='[]') {\nresult=gethd(result[0]);\n}else{result=[];}\nresult\n</js>", "updateTime": "$.create_date\n<js>\nif (result) {\nlet d=new Date(result);\nupt=java.timeFormatUTC(d,\"yyyy/MM/dd HH:mm\",8*60*60*1000);\n}\nelse '';\n</js>"}, "searchUrl": "<js>\nif (page == 1) {\ncache.putMemory('pxpage',page);\n\t\tif (/^\\u200b/.test(key)) {\n\t\t\tlet uid = cache.getFromMemory('pxuid');\n\t\t\tif (uid=='') java.longToast('\\n请刷新书籍');\n\t\t\telse url = 'https://app-api.pixiv.net/v1/user/novels?filter=for_android&user_id=' + uid;}\n\t\telse if (key.startsWith('作者@')) {\n\t\t\tlet uid = key.slice(3);\n\t\t\tif (!/^\\d{3,}$/.test(uid)) java.longToast('\\n请输入正确的id');\n\t\t\telse url = 'https://app-api.pixiv.net/v1/user/novels?filter=for_android&user_id='+uid;\t}\n\t\telse if (/\\d{5,}$/.test(key) ) {\n\t\t\tlet sid = key.match(/\\d+$/)[0];\n\t\t\tjava.put('sid',sid);\n\t\t\tif (key.startsWith('作者')) java.longToast('\\n请输入正确的搜索格式');\n\t\t\telse url = `data:;base64,${java.base64Encode(sid)},{\"type\":\"\"}`;}\n\t\telse if (key.startsWith('正文@')) {\n\t\t\turl = 'https://app-api.pixiv.net/v1/search/novel?filter=for_android&merge_plain_keyword_results=true&sort=date_desc&search_target=text&word='+key.slice(3);}\n\t\telse { url = 'https://app-api.pixiv.net/v1/search/novel?filter=for_android&merge_plain_keyword_results=true&word='+key;}\nsource.put('nurls','http://127.0.0.1');\n\n} else {url = source.get('nurls');}\ngethd(url)\n</js>", "weight": 0},{"bookSourceGroup": "Pixiv,lyc", "bookSourceName": "🌈pixiv小说", "bookSourceType": 0, "bookSourceUrl": "https://pixiv小说.luoyacheng.ip-ddns.com", "bookUrlPattern": "http://localhost/|https://www.pixiv.net/novel/series/\\d{3,}", "concurrentRate": "3/2000", "customButton": false, "customOrder": 32, "enabled": false, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nlet banben=\"1.1.9\";\nvar obj = {\n    '动态': {\n        \"url\": `{{\n            if (page == 1) {\n            url = 'https://app-api.pixiv.net/v1/novel/follow?restrict=public';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n            }}`,\n        \"fb\": 0.2 },\n    '推荐': {\n        \"url\": `{{\n            if (page == 1) {\n            url = 'https://app-api.pixiv.net/v1/novel/recommended?include_privacy_policy=true&filter=for_android&include_ranking_novels=true';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n            }}`,\n        \"fb\": 0.2 },\n    '追更': {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https://app-api.pixiv.net/v1/watchlist/novel';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n            }}`,\n        \"fb\": 0.2 },\n    '收藏·公开': {\n        \"url\": `{{\n            if (page == 1) {\n                let id = source.getLoginInfoMap().get('id');\n                url = 'https://app-api.pixiv.net/v1/user/bookmarks/novel?user_id='+id+'&restrict=public';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n            }}`,\n        \"wb\": 1,\n        \"fb\": 0.4 },\n    '收藏·私密': {\n        \"url\": `{{\n            if (page == 1) {\n                let id = source.getLoginInfoMap().get('id');\n                url = 'https://app-api.pixiv.net/v1/user/bookmarks/novel?user_id='+id+'&restrict=private';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n            }}`,\n        \"fb\": 0.4 },\n    'R-18·日': {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https://app-api.pixiv.net/v1/novel/ranking?filter=for_android&mode=day_r18';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n            }}`,\n        \"wb\": 1,\n        \"fb\": 0.2 },\n    'R-18·AI': {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https://app-api.pixiv.net/v1/novel/ranking?filter=for_android&mode=week_ai_r18';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n            }}`,\n        \"fb\": 0.2 },\n    'R-18·周': {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https://app-api.pixiv.net/v1/novel/ranking?filter=for_android&mode=week_r18';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n            }}`,\n        \"fb\": 0.2 }\n}\n\nvar sort = [];\npush = (title, url, fg, wrap, fb) => sort.push({\n    \"title\": title,\n    \"url\": url,\n    \"style\": {\n      layout_flexGrow: fg || 1,\n      layout_flexBasisPercent: fb||-1,\n      layout_wrapBefore: wrap ? true : false\n     }\n  });\n\nfor (x in obj) {\npush(x, obj[x].url, obj[x].fg, obj[x].wb, obj[x].fb);\n}\nJSON.stringify(sort);", "header": "@js:\n(()=>{\n\tlet headers = gethd();\n\treturn JSON.stringify(headers);\n})();", "jsLib": "//参考自开源项目：pixez-flutter🙏\nsleep = Packages.java.lang.Thread.sleep;\nua = 'PixivAndroidApp/5.0.166 (Android 14; RMX3366)';\nappv = '5.0.166';\na_l = 'zh-CN';\n\nbiaoq = new RegExp('^(?:NTR|NTL|修仙|奇幻|后宫|纯爱|隐奸|乱伦|乱交|母女.?|母子|父女|幼女|姐弟|人妻|正太|足交|口交|肛交|丝袜|催眠|系统|原创|续写|软饭流|修罗场|规则怪谈|女性视角|性开放世界|奸尸|冰恋|.?重口)$','i');\n\nfunction timemd5(time) {\n\tvar saltStr = time + '28c1fdd170a5204386cb1313c7077b34f83e4aaf4aa829ce78c231e05b0bae2c';\n\ttry {\n\t\tvar jv = this.java || (typeof java !== 'undefined' ? java : null);\n\t\tif (jv && jv.md5Encode) return jv.md5Encode(saltStr);\n\t} catch(e) {}\n\tvar md = Packages.java.security.MessageDigest.getInstance(\"MD5\");\n\tmd.update(new Packages.java.lang.String(saltStr).getBytes(\"UTF-8\"));\n\tvar dg = md.digest();\n\tvar hx = '';\n\tfor (var di = 0; di < dg.length; di++) {\n\t\tvar bv = dg[di] & 0xFF;\n\t\thx += (bv < 16 ? '0' : '') + bv.toString(16);\n\t}\n\treturn hx;\n}\n\n\nfunction gethd(url='',ck='') {\n\tconst {java, source} = this;\nlet time = java.timeFormatUTC(Date.now(),\"yyyy-MM-dd'T'HH:mm:ss'+00:00'\",8*60*60*1000);\nlet hash = this.timemd5(time);\nlet atk = source.getLoginHeader()||'';\nif(atk) atk = String('Bearer '+atk);\nlet headers = {\n    'x-client-time': time,\n    \t'User-Agent': ua,\n    \t'accept-language': a_l,\n    \t'authorization': atk,\n    \t'app-os': 'Android',\n    \t'app-os-version': 'Android 14',\n    \t'app-version': appv,\n    'x-client-hash': hash,\n    'cookie': ''\n    \t }\nck!='' && (headers['cookie']=ck);\nurl=url.replace(\"app-api.pixiv.net\",\"210.140.139.155\");\nurl && (headers['host']='app-api.pixiv.net');\nif (url=='') return headers;\nelse if (url.startsWith('data')) return url;\nelse {\n\tdelete headers['x-client-time'];\n\tdelete headers['x-client-hash'];\n\treturn url + ',' + JSON.stringify({'headers':headers});}\n};\n\n\nfunction leng(str) {\n\tlet length = 0;\n\tconst fuhao = ',.?!:;()[]\"';\n\tconst fuhao2 = '📘';\n\tfor (let char of str) {\n\t\tif (fuhao.includes(char) ) length += 0.5;\n\t\telse if (fuhao2.includes(char) ) length += 2;\n\t\telse length += 1;\n\t\t}\n\t\treturn length;\n}\n\nfunction gethdi(url='') {\turl=url.replace(\"i.pximg.net\",\"210.140.139.133\");\nlet imgoptions = {\n  headers: {\n    'User-Agent': 'PixivIOSApp/5.8.0',\n    'accept-encoding': 'gzip, br',\n    'referer': 'https://app-api.pixiv.net/',\n    'host': 'i.pximg.net'\n    }\n  };\n  return url+','+JSON.stringify(imgoptions);\n }\n \nfunction copy(txt) {\n\tlet htm = `data:text/html;charset=utf-8,<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<style>\nbody {\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: center;\n\talign-items: center;\n\theight: 60vh;}\n</style>\n</head>\n<body>\n<textarea id=\"copyt\" rows=\"3\">${txt}</textarea>\n<br>\n<button id=\"btn1\" onclick=\"copy()\">复制</button>\n<script>\ndocument.addEventListener(\"DOMContentLoaded\", function () {\nconst textarea = document.getElementById(\"copyt\");\ntextarea.style.height = \"auto\";\ntextarea.style.height = textarea.scrollHeight + \"px\";});\nfunction copy() {\nconst cpt = document.getElementById(\"copyt\");\ncpt.select();\ndocument.execCommand(\"copy\");}\n</script>\n</body></html>`;\nthis.java.startBrowser(htm,'复制');\n\t}\n\n\nfunction lookc(lyc) {\nconst [title,uid,unm,uim,tags,caption,cdate,xh,sc,gk,sTitle,id,ugz] = lyc;\n\tlet htm = `<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<style>\ntable {\n\twidth: 100%;\n\ttable-layout: fixed;\n\ttext-align: center;\n\tmargin: 0 auto;\n\tword-break: break-all;\n\t}\ntd img {\n\twidth: 100%;\n\theight: 100%;\n\tobject-fit: contain;\n\t}\n.cap {\n\t text-align: left;\n\t text-indent: 2em;\n\t}\na {text-decoration: none;}\np {margin: 0.2em auto;}\n</style>\n</head>\n<body>\n<table border=\"1\" cellspacing=\"0\">\n<tr>\n<th colspan=\"6\">标题：<a href=\"https://www.pixiv.net/novel/show.php?id=${id}\">${title}</a></th>\n</tr>\n<tr>\n<td colspan=\"4\">\n作者：<a href=\"https://www.pixiv.net/users/${uid}\">${unm}</a>\n${ugz=='true' ? '<span style=\"font-size: 0.7em;\"> (已关注)</span>' : ''}\n</td>\n<td colspan=\"2\"><img src=\"${uim}\"></td>\n</tr>\n${sTitle!='' ? ('<tr><td colspan=\"6\">小说：《'+sTitle+'》'+'</td></tr>') : ''}\n<tr>\n<td>喜欢</td>\n<td>${xh}</td>\n<td>收藏</td>\n<td>${sc}</td>\n<td>观看</td>\n<td>${gk}</td>\n</tr>\n<tr>\n<td>时间</td>\n<td colspan=\"5\">${cdate}</td>\n</tr>\n<td>标签</td>\n<td colspan=\"5\">${tags}</td>\n</tr>\n${caption!='' ? ('<tr><td>简介</td><td class=\"cap\" colspan=\"5\">'+caption+'</td></tr>') : ''}\n</table>\n<br>\n<script>\n\n</script>\n</body></html>`;\nlet java=this.java;\njava.startBrowser(`data:text/html;base64,${java.base64Encode(htm)}`,'信息');\n}\n\nfunction gengxin(){\nconst {java, source} = this;\n\tlet url0='https://gitee.com/lyc486/yuedu2/commits/main/书源/pixiv小说/pixiv.json?browser_history=0&page=1&per=3';\n\tlet rr0=java.get(url0,{'User-Agent': 'Mozilla/5.0 (Linux; Android 14)','X-Requested-With': 'XMLHttpRequest'}).body();\n\tlet \tgxlrr = com.jayway.jsonpath.JsonPath.read(rr0, '$.list[0:3].title');\n\tlet [gxlr, gxlr2, gxlr3] = gxlrr;\n\tlet banben =   String(source.exploreUrl).match(/let banben=\"([\\d\\.]+)\"/)[1];\n\tgxlr=String(gxlr).split(/^([^\\-]+)-/);\n\tgxlr[0]=='' ? '' : gxlr=['','0',gxlr[0]];\n\tlet gxts;\n\tif (gxlr[1]>banben){gxts=['更新','0,140,186'];}\n\telse {gxts= ['导入','76,175,80'];};\n\tlet htm = `<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<style>\ntable {\n\ttext-align: center;\n\tmargin: 0 auto;\n\t}\n.ann {\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\theight: 50vh;\n\t}\nbutton {\n\tbackground-color: rgb(${gxts[1]});\n\tcolor: white;\n\tborder: none;\n\tborder-radius: 4px;\n\theight: 6vh;\n\twidth: 30vw;\n\toverflow: hidden;\n\t}\nbutton span {\n  cursor: pointer;\n  display: inline-block;\n  position: relative;\n  transition: 0.4s;\n}\nbutton span:after {\n  content: '>';\n  position: absolute;\n  opacity: 0;\n  top: 0;\n  right: 30px;\n  transition: 0.2s;\n}\nbutton:active span {\n  padding-right: 20px;\n}\nbutton:active span:after {\n  opacity: 1;\n  right: -40px;\n}\n</style>\n</head>\n<body>\n<table border=\"1\" cellspacing=\"0\">\n<th colspan=\"2\">最新日志：${gxlr[2]}</th>\n<tr>\n<td>仓库版本：${gxlr[1]}</td>\n<td>本地版本：${banben}</td>\n</tr>\n<tr>\n<td colspan=\"2\" style=\"text-align: left;\">往期日志：${gxlr2}<br>　　　　　${gxlr3}</td>\n</tr>\n</table>\n<div class=\"ann\">\n<a href=\"legado://import/importonline?src=https://github.com/Luoyacheng/yuedu/raw/main/书源/pixiv小说/pixiv.json\">\n<button><span>${gxts[0]}</span></button>\n</a>\n</div>\n<a href=\"legado://import/importonline?src=https://cdn.jsdelivr.net/gh/Luoyacheng/yuedu@main/书源/pixiv小说/pixiv.json\" style=\"font-size: 10px;\">备用链接</a>\n</body>\n</html>`;\nif(typeof this.book=='undefined'||gxts[0]=='更新') java.startBrowser(`data:text/html;base64,${java.base64Encode(htm)}`,'px更新');\r\n}\nfunction fankui(){\tthis.java.startBrowser('https://github.com/Luoyacheng/yuedu/discussions/categories/b-pixiv?discussions_q=','px反馈');\n}\n//★2026.08修复★ pixiv已把oauth迁移到Cloudflare，老的\"域名替换成210.140.139.155再POST\"会因\n//HTTP/2的SNI↔Host严格校验被nginx以421拒绝；且GFW对*.pixiv.net的SNI直接重置。\n//本函数用原始TLS套接字直连东京源站IP：不发SNI、不协商ALPN(h2)，手写HTTP/1.1报文，\n//靠Host头路由到oauth虚拟主机（该证书为Google Trust Services公共证书，系统默认信任）。\nfunction pxOauth(postBody) {\n\tconst {java} = this;\n\tlet time = java.timeFormatUTC(Date.now(),\"yyyy-MM-dd'T'HH:mm:ss'+00:00'\",8*60*60*1000);\n\tlet hash = timemd5(time);\n\tlet req = 'POST /auth/token HTTP/1.1\\r\\nHost: oauth.secure.pixiv.net\\r\\n'\n\t\t+'User-Agent: '+ua+'\\r\\n'\n\t\t+'content-type: application/x-www-form-urlencoded\\r\\n'\n\t\t+'x-client-time: '+time+'\\r\\nx-client-hash: '+hash+'\\r\\n'\n\t\t+'accept-language: '+a_l+'\\r\\napp-os: Android\\r\\napp-os-version: Android 14\\r\\napp-version: '+appv+'\\r\\n'\n\t\t+'Content-Length: '+postBody.length+'\\r\\nConnection: close\\r\\n\\r\\n'+postBody;\n\tlet sf = Packages.javax.net.ssl.SSLSocketFactory.getDefault();\n\tlet ips = ['210.140.139.155','210.140.139.152','210.140.139.158','210.140.139.161'];\n\tlet sock = null, lastErr = '';\n\tfor (let i = 0; i < ips.length; i++) {\n\t\ttry {\n\t\t\tlet addr = Packages.java.net.InetAddress.getByName(ips[i]);\n\t\t\tsock = sf.createSocket(addr, 443);\n\t\t\tsock.setSoTimeout(12000);\n\t\t\tlet os = sock.getOutputStream();\n\t\t\tos.write(new Packages.java.lang.String(req).getBytes('UTF-8'));\n\t\t\tos.flush();\n\t\t\tlet rd = new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(sock.getInputStream(),'UTF-8'));\n\t\t\tlet sb = new Packages.java.lang.StringBuilder();\n\t\t\tlet line;\n\t\t\twhile ((line = rd.readLine()) != null) { sb.append(line); sb.append('\\n'); }\n\t\t\treturn String(sb.toString());\n\t\t} catch(e) {\n\t\t\tlastErr = e;\n\t\t\ttry { if (sock != null) sock.close(); } catch(e2) {}\n\t\t}\n\t}\n\tthrow lastErr == '' ? 'oauth直连失败：无可用IP' : lastErr;\n}\n", "lastUpdateTime": "1788020560586", "loginCheckJs": "//java.toast('登录检查：'+result);\n\nif (result.code() == 400) {\n\tsource.login();\n\tsleep(500);\n\tlet url = gethd(result.url());\n\tresult = java.connect(url);\n\t}\nresult", "loginUi": "[\n    {\n        \"name\": \"token\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"token说明\",\n        \"type\": \"button\",\n        \"action\": \"java.longToast(`\\ntoken说明：\\n填写该值后点击右上角√进行登录\\n可以通过获取token按钮得到(不需要跳转app)\\n阅读正式版无法支持获取token功能`);\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"获取token\",\n        \"type\": \"button\",\n        \"action\": \"Login()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"id\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"id说明\",\n        \"type\": \"button\",\n        \"action\": \"java.longToast(`\\nid说明：\\n登录时该值为空会自动填写该值，这是登录账号的ID（可手动更改）。\\n发现页的收藏分类加载的该ID的收藏`);\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"搜索说明\",\n        \"type\": \"button\",\n        \"action\": \"java.longToast(`\\n搜索说明：\\n默认使用关键词搜索\\n输入小说id号显示对应的小说\\n输入“正文@许斌”搜索正文含许斌的小说\\n输入“作者@69559022”搜索指定id作者的书`);\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"书名\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"↑追更该书\",\n        \"type\": \"button\",\n        \"action\": \"scz(3)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"复制id\",\n        \"type\": \"button\",\n        \"action\": \"fuzhi(2)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"取消追更\",\n        \"type\": \"button\",\n        \"action\": \"scz(30)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"章节\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"↑公开收藏\",\n        \"type\": \"button\",\n        \"action\": \"scz(1)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"取消收藏\",\n        \"type\": \"button\",\n        \"action\": \"scz(10)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"私密收藏\",\n        \"type\": \"button\",\n        \"action\": \"scz(1,'private')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"详情\",\n        \"type\": \"button\",\n        \"action\": \"caption()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"作者\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"↑关注作者\",\n        \"type\": \"button\",\n        \"action\": \"scz(2)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"复制id\",\n        \"type\": \"button\",\n        \"action\": \"fuzhi(1)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"取消关注\",\n        \"type\": \"button\",\n        \"action\": \"scz(20)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        \"name\": \"查看设置\",\n        \"type\": \"button\",\n        \"action\": \"showSettings()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"📘书名标识\",\n        \"type\": \"button\",\n        \"action\": \"gongcun()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🔢补充序号\",\n        \"type\": \"button\",\n        \"action\": \"xvhao()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"📝简介标签\",\n        \"type\": \"button\",\n        \"action\": \"biaoqian()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"📖书源介绍\",\n        \"type\": \"button\",\n        \"action\": \"java.startBrowser('https://luoyacheng.cloudns.ch/#P站','介绍');\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"📢书源反馈\",\n        \"type\": \"button\",\n        \"action\": \"fankui()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🔄版本更新\",\n        \"type\": \"button\",\n        \"action\": \"gengxin()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"屏蔽标签\",\n        \"type\": \"text\"\n    }\n]", "loginUrl": "function gongcun() {\nlet gc = source.get('gc');\nif(gc!=1) {source.put('gc',1);java.toast('🟢已开启\\n书名开头会有📘符号');}\nelse {source.put('gc',0);java.toast('⚫已关闭\\n不会添加📘');}\n\t}\nfunction xvhao() {\nlet xh = source.get('xh');\nif(xh!=1) {source.put('xh',1);java.toast('🟢已开启\\n会自动补充章节名序号');}\nelse {source.put('xh',0);java.toast('⚫已关闭\\n不会补充序号');}\n\t}\nfunction biaoqian() {\nlet bq = source.get('bq');\nif(bq!=1) {source.put('bq',1);java.toast('🟢已开启\\n会在简介显示作品标签');}\nelse {source.put('bq',0);java.toast('⚫已关闭\\n不会显示简介标签');}\n\t}\n\nfunction showSettings() {\n    let gc = source.get('gc') == 1 ? '🟢开启' : '⚫关闭';\n    let xh = source.get('xh') == 1 ? '🟢开启' : '⚫关闭';\n    let bq = source.get('bq') == 1 ? '🟢开启' : '⚫关闭';\n    let msg = '\\n🔢补充序号：' + xh + '\\n📝简介标签：' + bq + '\\n📘书名标识：' + gc;\n    java.longToast(msg);\n}\n\nfunction login() {\nlet Info = source.getLoginInfoMap();\n\ntry {\nlet tk = Info.token;\nif (!tk || tk == '') throw 'TOKEN为空，请先填写';\nlet body = `client_id=MOBrBDS8blbauoSck0ZfDbtuzpyT&client_secret=lsACyCD94FhDUtGTXi3QzcFE2uU1hqtDaKeqrdwj&grant_type=refresh_token&refresh_token=${tk}&include_policy=true`;\nlet rr;\ntry {\n//★优先走免VPN直连通道\nrr = pxOauth(body);\n} catch(err) {\njava.log('px oauth直连失败，回退常规请求：'+err);\nlet time2 = java.timeFormatUTC(Date.now(),\"yyyy-MM-dd'T'HH:mm:ss'+00:00'\",8*60*60*1000);\nlet headers = {\n    'User-Agent': ua,\n    'content-type': 'application/x-www-form-urlencoded',\n    'x-client-hash': timemd5(time2),\n    'accept-language': a_l,\n    'app-version': appv,\n    'app-os-version': 'Android 6.0',\n    'x-client-time': time2,\n    'app-os': 'Android',\n    'host': 'oauth.secure.pixiv.net'\n  };\nlet url = 'https://oauth.secure.pixiv.net/auth/token';\nurl = url.replace(\"oauth.secure.pixiv.net\",\"210.140.139.155\");\nrr = String(java.post(url,body,headers).body());\n}\n//剥离HTTP响应头，仅保留JSON部分\nif (rr.indexOf('{') >= 0) rr = rr.substring(rr.indexOf('{'));\nlet atk = rr.match(/\"access_token\"[:\\s\"]+([^\"]+)/)[1];\nsource.putLoginHeader(atk);\nif (Info.id=='') {\n\tInfo.id = com.jayway.jsonpath.JsonPath.read(rr, \"$.user.id\");}\nsource.putLoginInfo(JSON.stringify(Info));\n//java.toast('\\n😆登录成功');\n} catch(err) {\n\tjava.toast('\\n💔登录失败');\n\tjava.log('px登录失败：'+err);\n  \tsleep(600);}\n}\n\nfunction scz(x, restrict) {\n\tlet headers = gethd();\n\t//let url = 'https://app-api.pixiv.net/';\n\tlet url = \"https://210.140.139.155/\";\n\tlet body,nm,tt,ttt;\n\tif (x==1) {\n\t url += 'v2/novel/bookmark/add';\n\t \tlet id = cache.get('pxid');\n\t \tif (id=='') ttt='请刷新章节';\n\t \tbody = 'novel_id='+id+'&restrict=' + (restrict || 'public');\n\t \tnm = source.getLoginInfoMap().get('章节');\n\t \ttt= (restrict=='private'? '私密收藏' : '公开收藏');\n\t } else if(x==2) {\n\t \turl += 'v1/user/follow/add';\n\t \tlet uid = cache.get('pxuid');\n\t \tif (uid=='') ttt='请刷新章节或详情页';\n\t \tbody = 'user_id='+uid+'&restrict=public';\n\t \tnm = source.getLoginInfoMap().get('作者');\n\t \ttt='关注';\n\t \t} else if(x==10) {\n\t \turl += 'v1/novel/bookmark/delete';\n\t \tlet id = String(cache.get('pxid'));\n\t \tbody = id ? 'novel_id='+id : '';\n\t \tnm = source.getLoginInfoMap().get('章节');\n\t \ttt='取消收藏';\n\t \t} else if(x==20) {\n\t \turl += 'v1/user/follow/delete';\n\t \tlet uid = String(cache.get('pxuid'));\n\t \tbody = uid ? 'user_id='+uid : '';\n\t \tnm = source.getLoginInfoMap().get('作者');\n\t \ttt='取消关注';\n\t \t} else if(x==3) {\n\t \turl += 'v1/watchlist/novel/add';\n\t \tlet sid = cache.get('pxsid');\n\t \tif (sid=='') ttt='请刷新详情页';\n\t \tbody = 'series_id='+sid;\n\t \tnm = source.getLoginInfoMap().get('书名');\n\t \ttt='追更';\n\t \t} else if(x==30) {\n\t \turl += 'v1/watchlist/novel/delete';\n\t \tlet sid = String(cache.get('pxsid'));\n\t \tbody = sid ? 'series_id='+sid : '';\n\t \tnm = source.getLoginInfoMap().get('书名');\n\t \ttt='取消追更';\n\t \t}\n\n\ttry {\n\t\tif (ttt) {java.longToast(ttt);throw 't空';}\n\t\tif (!body) throw 'b空';\n\t\theaders['host']='app-api.pixiv.net';\n\t\tlet jg = java.post(url,body,headers).statusCode();\n\t\tif (jg!=200) throw tt+'响应码异常';\n\t\telse java.longToast(`\\n已${tt}：\\n${nm}`);\n\t\t} catch(e) {\n\t\t\tif (!ttt) java.toast(`\\n${tt}失败`);\n\t\t\tjava.log(e);}\n\t}\n\nfunction reck() {\nsource.removeLoginHeader();\ncookie.removeCookie('https://accounts.pixiv.net');\ncookie.removeCookie('https://accounts.google.com');\ncookie.removeCookie('https://api.weibo.com');\n\t}\n\nfunction Login() {\nlet rkey = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';\nlet cv='';\nfor (let i = 0; i < 128; i++) {\n\tlet ra = Math.floor(Math.random()*rkey.length);\n\tcv+=rkey.charAt(ra);}\n\nlet aly = new JavaImporter(\nPackages.cn.hutool.crypto.digest.Digester,\nPackages.cn.hutool.core.codec.Base64,\nPackages.cn.hutool.crypto.digest.DigestAlgorithm);\nwith (aly) {\n\t//转ASCII数组\n\tlet asBs =  Packages.java.lang.String(cv).getBytes(\"US-ASCII\");\n\t//创建SHA256并计算\n\tlet digester = new Digester(DigestAlgorithm.SHA256);\n\tlet hashBs = digester.digest(asBs);\n\t//Base64URL编码并移除填充\n\tvar codeChallenge  = Base64.encodeUrlSafe(hashBs);\n}\n\nlet urllg =`https://app-api.pixiv.net/web/v1/login?code_challenge=${codeChallenge}&code_challenge_method=S256&client=pixiv-android`;\nreck();\n//防止重定向错误，清书源cookie。也需要手动清内置浏览器cookie\n\nlet wbua=java.getWebViewUA().replaceAll(\"; wv| Version\\/4.0\",'')+'';\nif (/HUA\\s*WEI/i.test(wbua))\nwbua=\"Mozilla/5.0 (Linux; Android 14; RMX3366 Build/UKQ1.230924.001) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.7049.100 Mobile Safari/537.36\";\n\nlet bb=java.startBrowserAwait(urllg+`,{\n\"headers\":{\n\t\"User-Agent\": \"${wbua}\"\n\t}}`,'登录',false).body();\nlet code;\nif (bb.includes('<title>Online com')) {\nsleep(600);\njava.toast('稍等');\nlet over = java.webViewGetOverrideUrl(bb,'https://app-api.pixiv.net/','','pixiv:.*');\ncode = over.match(/code=([^&]+)/);\n}\nreck();\n\nlet token;\nif (code) {\nlet tkurl = 'https://oauth.secure.pixiv.net/auth/token';\nlet headers = gethd();\nlet body = `code_verifier=${cv}&code=${code[1]}&grant_type=authorization_code&redirect_uri=https://app-api.pixiv.net/web/v1/users/auth/pixiv/callback&client_id=MOBrBDS8blbauoSck0ZfDbtuzpyT&client_secret=lsACyCD94FhDUtGTXi3QzcFE2uU1hqtDaKeqrdwj&include_policy=true`;\nlet tkr = java.post(tkurl,body,headers);\n//java.log(tkr.body());\ntoken = tkr.body().match(/refresh_token\":\"([^\"]+)/);\n}\n\nif (token) {\nlet htm = `data:text/html;charset=utf-8,<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><style>\nh2 {\n\ttext-align: center;\n\tline-height: 6;}\ntextarea {\n\tfont-size: 12px;\n\twidth: 96%;\n\tmargin: 10px 2%;\n\tpadding: 6px;}\n.ann {\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\theight: 50vh;}\nbutton {\n\tbackground-color: rgb(76,175,80);\n\tcolor: white;\n\tborder: none;\n\tborder-radius: 4px;\n\theight: 6vh;\n\twidth: 30vw;\n\toverflow: hidden;\n\ttransition: font-size 0.3s;\n\tfont-size: 16px;}\n.an-s {\n\tfont-size: 12px;}\n.alert-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\tbackground: rgba(0, 0, 0, 0.6);\n\tdisplay: none;\n\tjustify-content: center;\n\talign-items: center;\n\tz-index: 9999;}\n/* 对话框主体 */\n.alert-box {\n\tbackground: rgb(232,234,246);\n\tpadding: 10px;\n\tborder-radius: 12px;\n\tbox-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);\n\tmin-width: 100px;\n\ttext-align: center;}\n</style></head>\n<body>\n<div class=\"alert-overlay\" id=\"alertO\">\n <div class=\"alert-box\">\n  <p>已复制到剪贴板：</p>\n  <p id=\"alertM\" style=\"font-size: 12px;\"></p>\n </div>\n</div>\n<h2>Token获取成功🥳</h2>\n<textarea readonly id=\"copyt\" rows=\"3\">${token[1]}</textarea>\n<p style=\"font-size: 12px;\">请复制粘贴到登录界面的token框，然后点击√进行登录</p>\n<div class=\"ann\">\n<button id=\"btn1\" onclick=\"copy()\">复制</button>\n</div>\n<script>\nfunction showAlert(txt, time) {\nconst overlay = document.getElementById('alertO');\nconst message = document.getElementById('alertM');\nmessage.textContent = txt;\noverlay.style.display = 'flex';\nif (time > 0) {\n\tsetTimeout(() => {\n\t\toverlay.style.display = 'none';\n\t\t}, time);\n\t}\n}\nfunction copy() {\nconst btn = document.getElementById('btn1');\nbtn.classList.add('an-s');\nconst cpt = document.getElementById(\"copyt\");\ncpt.select();\ntry {\n    const cpy = document.execCommand(\"copy\");\n    if (cpy.length<9) throw '异常';\n    showAlert(cpt.value, 1000);\n  } catch (e) {alert(\"复制失败，请手动复制\");}\nsetTimeout(() => {\n\tbtn.classList.remove('an-s');\n\t}, 450);\n}\n</script>\n</body></html>`;\n\njava.startBrowser(htm,'获取token');\njava.log(token[1]); //留一份到日志\t\n\t} else {sleep(700);java.toast('获取失败😭');}\n}\n\nfunction fuzhi(x) {\n\tif (x==1) {\n\tlet uid = cache.get('pxuid');\n\tcopy(uid);}\n\tif (x==2) {\n\tlet sid = cache.get('pxsid');\n\tcopy(sid);}\n\t}\n\nfunction caption() {\n\tlet lyc=cache.getFromMemory('pxcjj');\n\tif (lyc) lookc(lyc);\n\telse java.longToast('请刷新正文');\n\t}", "respondTime": 229699, "ruleBookInfo": {"author": "$.novel_series_detail.user.name\n<js>\nlet uid = java.get('uid');\nlet auth = result || String(book.author).replace(/[\\u200b]+/,'');\nif (uid == '') {uid = java.getString('$.novel_series_detail.user.id');}\nlet Info=source.getLoginInfoMap();\nInfo['作者'] = auth;\ncache.put('pxuid',uid);\nsource.putLoginInfo(JSON.stringify(Info));\n'\\u200b' + auth\n</js>", "canReName": "1", "init": "<js>\nvar sid = java.get('sid');\nlet i = String(book.bookUrl).includes('https:/');\nif (i) { sid = String(book.bookUrl).match(/\\d{3,}$/);}\n\ncache.deleteMemory('pxcjj'); //仅通过正文打开详情，防错\nif (sid == '🇨🇳') {\n\tlet Info=source.getLoginInfoMap();\n\tlet bkn = String(book.name);\n\tlet id = java.hexDecodeToString(result).match(/\\d+$/)[0];\n\tInfo['书名'] = '';\n\tcache.put('pxsid','');\n\tInfo['章节'] = bkn;\n\tcache.put('pxid',id);\n\tsource.putLoginInfo(JSON.stringify(Info));\n\tlet length = leng(bkn);\t\nbook.intro = (source.get('bq')==1?String(java.get('tags')).replace(/, /g,' #').replace('[','#').replace(']','\\n\\n'):'') + (length>18?('《'+book.name+'》\\n'):'') + java.get('jianjie');\n\trr='1';\n\n} else {\nlet url = 'https://app-api.pixiv.net/v2/novel/series?series_id=' + sid;\n//修正bookurl\nbook.bookUrl = `data:;base64,${java.base64Encode(url)},{\"type\":\"px\"}`;\n\ntry {\n\njg = java.connect(gethd(url));\nrr = jg.body();\nif (jg.code() == 400) {\n\tsource.login();\n\tPackages.java.lang.Thread.sleep(500);\n\trr = java.ajax(gethd(url));\n\t}\n\n} catch(err) {\n\trr={};\n\tjava.toast('详情页链接加载失败'+sid);\n\t}\n\n//设置解析结果\njava.setContent(rr);\n\n\n//更新更新时间\ntry {\nlet tm = java.getString('$.novel_series_latest_novel.create_date');\nlet d = new Date(tm);\nd = java.timeFormatUTC(d,'yy/MM/dd',8*60*60*1000);\nbook.kind = String(book.kind).replace(/\\d+\\/\\d+\\/\\d+|$/,d).replace('null','');\n} catch(err) {java.toast('详情页内容错误');}\n\n//获取书名并净化\nlet bkn = String(java.getString('$.novel_series_detail.title')).replace(/^《(.+)》$/,'$1');\nbook.name = bkn.replace(/[(（].{0,9}((?:仙侠|纯爱|后宫|萝莉).?){3,}.{0,9}[)）](?=\\s*[一-ꀀ])/,'');\n\n//java.log('┌获取书名\\n[99:99.999] └'+book.name);\n\n//获取书名失败\nif (book.name == '') {\n\t//效果，unicode转字符\n\t// let ee = JSON.stringify(JSON.parse(rr) );\n\tlet txte = java.getString('$..user_message',rr);\n\t//弹出提示，sid相应序列不存在\n\tjava.longToast('\\n未获取到书名\\n'+txte);\n\t} else {\n\t\n\t//放入书名\n\tlet Info=source.getLoginInfoMap();\n\tInfo['书名'] = book.name;\n\tcache.put('pxsid',sid);\n\tInfo['章节'] = '';\n\tcache.put('pxid','');\n\tsource.putLoginInfo(JSON.stringify(Info));\n\t\n\t//同名共存\n\tif (source.get('gc') == 1) book.name='📘'+book.name;\n\t}\n\n//补充封面链接\nif (book.coverUrl == null) {\n\tlet img = java.getString('$.novel_series_latest_novel.image_urls.large');\n\tbook.coverUrl = gethdi(img);\n\t\t\n//java.log('┌获取封面\\n[99:99.999] └'+book.coverUrl);\n}\n\n//计算书名长度\nlet length = leng(String(book.name));\n//大于18个全角字符\nif (length > 18) length= '《'+String(book.name).replace(/^📘/,'')+'》\\n';\nelse length = '';\nlet jianjie = java.getString('$.novel_series_detail.caption');\nbook.intro = (source.get('bq')==1?String(java.get('tags')).replace(/, /g,' #').replace('[','#').replace(']','\\n\\n'):'') + length + java.get('jianjie');\njava.put('jianjie',jianjie);\njava.put(\"bookr\",rr);\n}\n\nrr\n</js>", "lastChapter": "$.novel_series_latest_novel.title##[【《]?{{book.name}}[》】]?", "tocUrl": "@js:book.bookUrl", "wordCount": "$.novel_series_detail.total_character_count"}, "ruleContent": {"content": "script.0@html\n<js>\nlet rr = result.match(/novel:\\s*({.+})/)[1];\nlet id = String(chapter.url).match(/\\d+(?=$|,)/)[0];\n\nlet bin = book.durChapterIndex;\nlet cin = chapter.index;\nlet inn = cin - bin;\nif (inn==0) {\nlet rra = result.match(/authorDetails:\\s*({.+})/)[1];\n//作者信息\nlet uid = java.getString('$..userId',rra);\nlet unm = java.getString('$..userName',rra);\nlet uim = java.getString('$..url',rra);\nuim = uim.replace('i.pximg.net','pximg.hakurei.cc');\nlet ugz = java.getString('$..isFollowed',rra);\n//作品信息\nlet tags = java.getStringList('$..tags[*]',rr);\ntags = Array.from(tags).map(x => `＃${x}`).join(' ');\nlet caption = String(java.getString('$..caption',rr));\ncaption = caption ? '<p>'+caption.replace(/(?:<br \\/>)+/g, '</p><p>')+'</p>' : '';\nlet cdate = java.getString('$..cdate',rr);\nlet xh = java.getString('$..rating.like',rr);\nlet sc = java.getString('$..rating.bookmark',rr);\nlet gk = java.getString('$..rating.view',rr);\nlet title = java.getString('$.title',rr);\nlet sTitle = java.getString('$.seriesTitle',rr);\n//放入信息\ncache.putMemory('pxcjj',[title,uid,unm,uim,tags,caption,cdate,xh,sc,gk,sTitle,id,ugz]);\ncache.put('pxuid',uid);\ncache.put('pxid',id);\nlet Info=source.getLoginInfoMap();\n\nlet sid = java.get('sid');\nif (sid != '🇨🇳') {\n\tInfo['书名']=String(book.name).replace(/^📘/,'');\n\tcache.put('pxsid',sid);} else {\n\tInfo['书名']='';\n\tcache.put('pxsid','');}\n\nInfo['章节'] = chapter.title;\nInfo['作者'] = book.author.replace('\\u200b','');\n//放入UI界面\nsource.putLoginInfo(JSON.stringify(Info));\n}\n\nlet urls = java.getString('$..urls',rr);\nlet tt = String(java.getString('$.text',rr));\nlet img1 = tt.match(/\\[uploadedimage\\:\\d+\\]/g)||'';\nlet img2 = tt.match(/\\[pixivimage\\:[\\d\\-]+\\]/g)||'';\nfor (x of img1) {\n\tlet id = x.match(/\\d+/)[0];\n\tlet url = java.getString('$..'+id+'.urls.original',rr);\n\tlet re = new RegExp('\\\\[uploadedimage\\\\:'+id+'\\\\]');\n\ttt = tt.replace(re,'<img src=\"'+gethdi(url)+'\"/>');\n\t}\nfor (x of img2) {\n\tlet id = x.match(/[\\d\\-]+/)[0];\n\tlet url = java.getString('$..'+id+'..images.original',rr);\n\tif (url=='null') url = java.getString('$..'+id+'..images.medium',rr);\n\tlet re = new RegExp('\\\\[pixivimage\\\\:'+id+'\\\\]');\n\ttt = tt.replace(re,'<img src=\"'+gethdi(url)+'\"/>');\n\t}\ntt.replaceAll('[newpage]','\\n—换页符—\\n').replace(/\\[\\[jumpuri\\:(.+)\\>.+\\]\\]/,'🖇️$1🖇️')\n</js>"}, "ruleExplore": {"author": "@js:\nlet uid = java.getString('$.user.id');\njava.put('uid',uid);\njava.getString('$.user.name');", "bookList": "<js>\nif (baseUrl.startsWith('http://127.0') ) {\n\trr = [{}];\n\t} else {\nlet nurl = java.getString('$.next_url');\nif (nurl == '') {\n\tjava.toast('发现页到底了');\n\tsource.put('nurl','http://127.0.0.1');\n\t}\nelse {\n\tsource.put('nurl',nurl);\n\t}\nif (baseUrl.includes('/watchlist/novel') ) {\n\trr = java.getElement(\"$.series\");\n\t} else { rr = java.getElement(\"$.novels\");}\n\n}\nrr\n</js>", "bookUrl": "<js>\nlet id = java.getString('$.id');\nlet sid = java.getString('$.series.id');\nlet rr = 'https://app-api.pixiv.net/webview/v2/novel?id=' + id;\n\nif (baseUrl.includes('/watchlist/novel') ) {\n\tsid = id;\n\tif (source.get('gc')=='1') book.name='📘'+book.name;\n}\nelse if (sid=='') {sid='🇨🇳';}\nelse {\n\tlet jj = java.get('jianjie');\n\tjava.put('jianjie',book.name+'\\n'+jj);\n}\njava.put('sid',sid);\n`data:;base64,${java.base64Encode(rr)},{\"type\":\"px\"}`\n</js>", "coverUrl": "<js>\nif (baseUrl.includes('/watchlist/novel') ) {url = java.getString('$.url');}\nelse {url = java.getString('$.image_urls.large');}\ngethdi(url);\n</js>", "intro": "<js>\nlet jj = java.get('jianjie');\nlet rr = '\\n' + java.getString('$.caption');\nlet rs = java.htmlFormat(rr);\njava.put('jianjie',rs);\njj + rs\n</js>", "kind": "@js:\nif (baseUrl.includes('/watchlist/novel') ) {\n\trrr = '';\n\tjava.put('tags','');\n\ttm = java.getString('$.last_published_content_datetime');\n\t} else {\n\t\tlet tags=java.get('tags');\n\t\trr=String(tags).slice(1,-1).split(', ');\n\t\trrr = rr.filter(i => biaoq.test(i) );\n\t\trr.forEach(x=>{\n\t\t\tif (x=='萝莉') {\n\t\t\t\tif (!rrr.includes('幼女')) rrr.unshift(x);}\n\t\t\telse if (['熟女','淫妻'].includes(x)) {\n\t\t\t\tif (!rrr.includes('人妻')) rrr.unshift(x);}\n\t\t\telse if (['仙侠','古风','武侠'].includes(x) && !rrr.some(y=>/[修仙古风武侠]{2}/.test(y))) {\n\t\t\t\t\trrr.unshift(x);}\n\t});\n\t\ttm = java.getString('$.create_date');\n}\nlet d=new Date(tm);\nd=java.timeFormatUTC(d,'yy/MM/dd',8*60*60*1000);\n\nrrr.toString()+','+d", "name": "@js:\nresult = String(java.getString('$.title'));\nlet bookn = String(java.getString('$.series.title')).replace(/^《(.+)》$/,'$1');\nif (bookn != '') {\n\tjava.put('jianjie', '《'+bookn+'》\\n');\n\tresult = result.replace(bookn,'♸').replace(/[《【]?♸[】》]?/,'')||result;\n\t}\nresult = result.replace(/[(（].{0,9}((?:仙侠|纯爱|后宫|萝莉).?){3,}.{0,9}[)）](?=\\s*[一-ꀀ])/,'').replace(/《(.+)》/,'$1');\n\nlet tags = java.getStringList('$.tags..name');\njava.put('tags',tags);\ntags=String(tags).slice(1,-1).split(/, |\\//);\nlet bptag=source.getLoginInfoMap()['屏蔽标签']||'';\nif (bptag!='') {\n\tbptag = String(bptag).split(/[,\\|]/).map(x=>x.replace('#',''))\nfor (let char of tags)\nif (bptag.includes(char)) result=''\n}\nresult", "wordCount": "$.text_length"}, "ruleSearch": {"author": "<js>\n{{(source.ruleExplore.author).replace('@js:','')}}\n</js>", "bookList": "<js>\npage=cache.getFromMemory('pxpage');\ncache.deleteMemory('pxpage');\nif (baseUrl.startsWith('http://127.')) {rr = [{}];}\n\nelse {\nrr = java.getElement('$.novels');\nnurl = java.getString('$.next_url');\nif (rr.length<6&&page==1&&nurl!='') {\n\t//处理不触发下一页且有nurl的情况\n\tsleep(500);\n\trs = java.ajax(gethd(nurl));\n\tjava.setContent(rs)\n\trrr = java.getElement('$.novels');\n\t//合并对象函数，可直接用\n\trr.addAll(rrr);\n\tnurl = java.getString('$.next_url');\n}\n\nif (nurl == '') {\n\tjava.toast('搜索页到底了');\n\tsource.put('nurls','http://127.0.0.1');\n\t} else {source.put('nurls',nurl);}\n\n}\nrr\n</js>", "bookUrl": "<js>\nlet id = java.getString('$.id');\nlet sid = java.getString('$.series.id');\nif (sid=='') {\n\tsid='🇨🇳';\n\t} else {\n\tlet jj = java.get('jianjie');\n\tjava.put('jianjie',book.name+'\\n'+jj);\n\t}\nlet rr = 'https://app-api.pixiv.net/webview/v2/novel?id=' + id;\njava.put('sid',sid);\n`data:;base64,${java.base64Encode(rr)},{\"type\":\"px\"}`\n</js>", "coverUrl": "$.image_urls.large\n<js>\ngethdi(result);\n</js>", "intro": "<js>\nlet jj = java.get('jianjie');\nlet rr = '\\n' + java.getString('$.caption');\nlet rs = java.htmlFormat(rr);\njava.put('jianjie',rs);\njj + rs\n</js>", "kind": "<js>\n{{(source.ruleExplore.kind).replace('@js:','')}}\n</js>", "name": "<js>\n{{(source.ruleExplore.name).replace('@js:','')}}\n</js>", "wordCount": "$.text_length"}, "ruleToc": {"chapterList": "<js>\nlet sid = java.get('sid');\nif (sid == '🇨🇳') {result=[result];}\nelse {\n\ttry {\n\t\tlet url = java.hexDecodeToString(result);\n\t\t//下一页会报错，直接跳过\nlet bookr=java.get('bookr')+'';\nif (!bookr) {\n\tlet rs=java.connect(gethd(url));\n\tif (rs.code() == 400) {\n\t\tsource.login();\n\t\tsleep(500);\n\t\trs=java.connect(gethd(url));}\nbookr=rs.body();}\n\t\tjava.setContent(bookr);\n\t\tjava.put('bookr',''); //保证单目录时进行刷新\n\t\t} catch(e){}\nresult = java.getElement('$.novels');\n}\nresult\n</js>", "chapterName": "<js>\nlet sid = java.get('sid');\nif (sid == '🇨🇳') {cc=book.name;}\nelse {\nlet title = java.getString('$.title');\ntitle = String(title).replace(/[(（].{0,9}((?:仙侠|纯爱|后宫|萝莉).?){3,}.{0,9}[)）](?=\\s*[一-ꀀ])/,'');\nlet bkn=String(book.name).replace(/^📘|[。？！]+$/g,'');\n//消除后不剩字则不消除\ncc = title.replace(bkn,'♸').replace(/[《【]♸[。？！]*[】》]\\s*|♸[。？！\\s]*/,'')||title;\n\t}\nif (source.get('xh')==1) {\n\tcc='▫️'+cc;\n}\n\tcc\n</js>", "chapterUrl": "<js>\nlet sid = java.get('sid');\nif (sid == '🇨🇳') {\n\t\tuu=java.hexDecodeToString(result);\n\t\tbook.putCustomVariable('这是单贴，链接：'+uu);\n\t}\nelse {\nlet id = java.getString('$.id');\nuu='https://app-api.pixiv.net/webview/v2/novel?id=' + id;\n}\ngethd(uu);\n</js>", "formatJs": "title.replace(/^▫️(?![第序]|#?第?[\\d零一二三四五六七八九十百千]+[章回])/,'第'+index+'章 ').replace(/^▫️/,'');", "nextTocUrl": "$.next_url\n<js>\nif (result!='[]') {\nresult=gethd(result[0]);\n}else{result=[];}\nresult\n</js>", "updateTime": "$.create_date\n<js>\nif (result) {\nlet d=new Date(result);\nupt=java.timeFormatUTC(d,\"yyyy/MM/dd HH:mm\",8*60*60*1000);\n}\nelse '';\n</js>"}, "searchUrl": "<js>\nif (page == 1) {\ncache.putMemory('pxpage',page);\n\t\tif (/^\\u200b/.test(key)) {\n\t\t\tlet uid = cache.getFromMemory('pxuid');\n\t\t\tif (uid=='') java.longToast('\\n请刷新书籍');\n\t\t\telse url = 'https://app-api.pixiv.net/v1/user/novels?filter=for_android&user_id=' + uid;}\n\t\telse if (key.startsWith('作者@')) {\n\t\t\tlet uid = key.slice(3);\n\t\t\tif (!/^\\d{3,}$/.test(uid)) java.longToast('\\n请输入正确的id');\n\t\t\telse url = 'https://app-api.pixiv.net/v1/user/novels?filter=for_android&user_id='+uid;\t}\n\t\telse if (/\\d{5,}$/.test(key) ) {\n\t\t\tlet sid = key.match(/\\d+$/)[0];\n\t\t\tjava.put('sid',sid);\n\t\t\tif (key.startsWith('作者')) java.longToast('\\n请输入正确的搜索格式');\n\t\t\telse url = `data:;base64,${java.base64Encode(sid)},{\"type\":\"\"}`;}\n\t\telse if (key.startsWith('正文@')) {\n\t\t\turl = 'https://app-api.pixiv.net/v1/search/novel?filter=for_android&merge_plain_keyword_results=true&sort=date_desc&search_target=text&word='+key.slice(3);}\n\t\telse { url = 'https://app-api.pixiv.net/v1/search/novel?filter=for_android&merge_plain_keyword_results=true&word='+key;}\nsource.put('nurls','http://127.0.0.1'); //重置储存的下一页\n\n} else {url = source.get('nurls');}\ngethd(url)\n</js>", "weight": 0},{"bookSourceComment": "本站所有漫画永久免费！请加入收藏夹以防走失！\n未满18周岁请自觉离开，建议使用chrome或者火狐浏览器，发消息到 nnhanman18@gmail.com 得最新网址。如果书源失效网站域名换成：nnhm95.com，nnhm93.com，nnhm81.com，nnhm92.com，nnhm91.com", "bookSourceGroup": "🔞漫画", "bookSourceName": "🔞鸟鸟韩漫", "bookSourceType": 2, "bookSourceUrl": "https://nnhm91.com", "bookUrlPattern": "https://nnhm91\\.com/comic/", "concurrentRate": "", "coverDecodeJs": "", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreScreen": "", "exploreUrl": "最新更新::https://nnhm91.com/update\n新书发布::https://nnhm91.com/update/newbook\n推荐漫画::https://nnhm91.com/update/recommend\n日榜::https://nnhm91.com/ranking/daily\n周榜::https://nnhm91.com/ranking/weekly\n月榜::https://nnhm91.com/ranking/monthly\n总榜::https://nnhm91.com/ranking/all\n全部漫画::https://nnhm91.com/comics/all/ob/time/st/all/page/{{page}}\n已完结::https://nnhm91.com/comics/all/ob/time/st/completed/page/{{page}}\n连载中::https://nnhm91.com/comics/all/ob/time/st/serialized/page/{{page}}\n最热门::https://nnhm91.com/comics/all/ob/hits/st/all/page/{{page}}\n正妹::https://nnhm91.com/comics/正妹/ob/time/st/all/page/{{page}}\n恋爱::https://nnhm91.com/comics/恋爱/ob/time/st/all/page/{{page}}\n肉慾::https://nnhm91.com/comics/肉慾/ob/time/st/all/page/{{page}}\n浪漫::https://nnhm91.com/comics/浪漫/ob/time/st/all/page/{{page}}\n大尺度::https://nnhm91.com/comics/大尺度/ob/time/st/all/page/{{page}}\n巨乳::https://nnhm91.com/comics/巨乳/ob/time/st/all/page/{{page}}\n有夫之婦::https://nnhm91.com/comics/有夫之婦/ob/time/st/all/page/{{page}}\n女大生::https://nnhm91.com/comics/女大生/ob/time/st/all/page/{{page}}\n狗血劇::https://nnhm91.com/comics/狗血劇/ob/time/st/all/page/{{page}}\n同居::https://nnhm91.com/comics/同居/ob/time/st/all/page/{{page}}\n好友::https://nnhm91.com/comics/好友/ob/time/st/all/page/{{page}}\n調教::https://nnhm91.com/comics/調教/ob/time/st/all/page/{{page}}\n动作::https://nnhm91.com/comics/动作/ob/time/st/all/page/{{page}}\n後宮::https://nnhm91.com/comics/後宮/ob/time/st/all/page/{{page}}\n不倫::https://nnhm91.com/comics/不倫/ob/time/st/all/page/{{page}}\n3D::https://nnhm91.com/comics/3D/ob/time/st/all/page/{{page}}\n校園::https://nnhm91.com/comics/校園/ob/time/st/all/page/{{page}}\n耽美::https://nnhm91.com/comics/耽美/ob/time/st/all/page/{{page}}\n日漫::https://nnhm91.com/comics/日漫/ob/time/st/all/page/{{page}}\n出版漫画::https://nnhm91.com/comics/出版漫画/ob/time/st/all/page/{{page}}\n", "header": "@js:\nJSON.stringify({\n\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\",\n\"Referer\": \"https://nnhm91.com/\"\n})\n", "jsLib": "", "lastUpdateTime": "1787884729702", "loginCheckJs": "", "loginUi": "", "loginUrl": "", "respondTime": 180000, "ruleBookInfo": {"author": "class.sub_r@tag.p.2@text", "canReName": "", "coverUrl": "id.Cover@tag.img@src", "downloadUrls": "", "init": "", "intro": "class.txtDesc@text##介绍[:：]\\s*##", "kind": "class.sub_r@tag.p.3@tag.a@text", "lastChapter": "", "name": "class.Introduct@tag.h1@text##《|》", "tocUrl": "", "updateTime": "class.sub_r@class.date@text@js:result.replace(/^连载中\\s*/,'').replace(/^已完结\\s*/,'');", "wordCount": ""}, "ruleContent": {"callBackJs": "", "content": "class.view-imgBox@tag.img@data-src\n@js:\nvar pool = ['p4.nnpic.xyz','p6.nnpic.xyz','p8.nnpic.xyz','p9.nnpic.xyz','p10.nnpic.xyz','p11.nnpic.xyz'];\nvar bad = ['img.nnpic.xyz','p4.nnpic.xyz','p6.nnpic.xyz','p8.nnpic.xyz','p9.nnpic.xyz','p10.nnpic.xyz','p11.nnpic.xyz'];\nvar urls = result.split('\\n').filter(Boolean);\nvar out = [];\nfor (var i = 0; i < urls.length; i++) {\n  var u = urls[i];\n  var m = u.match(/^https?:\\/\\/([^\\/]+)(\\/.*)$/);\n  if (m && bad.indexOf(m[1]) >= 0) {\n    u = 'https://' + pool[Math.floor(Math.random()*pool.length)] + m[2];\n  }\n  out.push('<img src=\"' + u + '\">');\n}\nout.join('\\n');\n", "imageDecode": "", "imageStyle": "FULL", "nextContentUrl": "", "payAction": "", "replaceRegex": "", "sourceRegex": "", "subContent": "", "title": "class.BarTit@tag.h1@text", "webJs": ""}, "ruleExplore": {"author": "", "bookList": "class.col_3_1@tag.li||class.itemBox", "bookUrl": "class.ImgA@href||class.itemImg@tag.a@href", "coverUrl": "class.ImgA@tag.picture@tag.source@srcset||class.itemImg@tag.picture@tag.source@srcset", "intro": "", "kind": "class.itemTxt@class.pd@tag.a@text", "lastChapter": "class.info@tag.a@text||class.info@text||class.itemTxt@tag.p.0@tag.a@text", "name": "class.txtA@text||class.itemTxt@class.title@text", "updateTime": "class.info@text||class.itemTxt@class.date@text", "wordCount": ""}, "ruleSearch": {"author": "", "bookList": "class.col_3_1@tag.li", "bookUrl": "class.ImgA@href", "checkKeyWord": "人妻", "coverUrl": "class.ImgA@tag.picture@tag.source@srcset", "intro": "", "kind": "", "lastChapter": "class.info@tag.a@text||class.info@text", "name": "class.txtA@text", "updateTime": "class.info@text", "wordCount": ""}, "ruleToc": {"chapterList": "-class.Drama@tag.li", "chapterName": "@tag.a@text", "chapterUrl": "@tag.a@href##^##https://nnhm91.com", "formatJs": "", "isPay": "", "isVip": "", "isVolume": "", "nextTocUrl": "", "preUpdateJs": "", "updateTime": ""}, "searchUrl": "https://nnhm91.com/search/{{key}}/page/{{page}}", "variableComment": "", "weight": 0},{"bookSourceComment": "网站发布页kxkmh.xyz", "bookSourceGroup": "🔞漫画", "bookSourceName": "🔞开心看漫画", "bookSourceType": 2, "bookSourceUrl": "https://kxmanhua.com", "bookUrlPattern": "https://kxmanhua\\.com/manga/\\d+", "concurrentRate": "", "coverDecodeJs": "", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreScreen": "", "exploreUrl": "全部漫画::https://kxmanhua.com/manga/library?type=0&complete=1&page={{page}}&orderby=1\n3D漫画::https://kxmanhua.com/manga/library?type=1&complete=1&page={{page}}&orderby=1\n韩漫::https://kxmanhua.com/manga/library?type=2&complete=1&page={{page}}&orderby=1\n日漫::https://kxmanhua.com/manga/library?type=3&complete=1&page={{page}}&orderby=1\n真人漫画::https://kxmanhua.com/manga/library?type=4&complete=1&page={{page}}&orderby=1\n耽美BL漫画::https://kxmanhua.com/manga/library?type=5&complete=1&page={{page}}&orderby=1\n完结::https://kxmanhua.com/manga/library?type=0&complete=2&page={{page}}&orderby=1\n连载::https://kxmanhua.com/manga/library?type=0&complete=3&page={{page}}&orderby=1\n最热门::https://kxmanhua.com/manga/library?type=0&complete=1&page={{page}}&orderby=1\n最近更新::https://kxmanhua.com/manga/library?type=0&complete=1&page={{page}}&orderby=2\n最新上架::https://kxmanhua.com/manga/library?type=0&complete=1&page={{page}}&orderby=3\n排行::https://kxmanhua.com/manga/rank\n", "header": "@js:\nJSON.stringify({\n\"User-Agent\": \"Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\",\n\"Referer\": \"https://kxmanhua.com/\"\n})\n", "jsLib": "", "lastUpdateTime": "1787878968907", "loginCheckJs": "", "loginUi": "", "loginUrl": "", "respondTime": 180000, "ruleBookInfo": {"author": "class.anime__details__title@tag.span.0@text##作者：\\s*##", "canReName": "", "coverUrl": "class.anime__details__pic@data-setbg", "downloadUrls": "", "init": "", "intro": "class.anime__details__text@tag.p.1@text", "kind": "class.anime__details__widget@tag.li.0@tag.a@text", "lastChapter": "", "name": "class.anime__details__title@tag.h3@text", "tocUrl": "", "updateTime": "class.anime__details__widget@tag.li.1@text##最近更新：\\s*##", "wordCount": ""}, "ruleContent": {"callBackJs": "", "content": "class.blog__details__content@tag.img@html\n", "imageDecode": "", "imageStyle": "FULL", "nextContentUrl": "", "payAction": "", "replaceRegex": "", "sourceRegex": "", "subContent": "", "title": "class.view-fix-top-bar-title@text", "webJs": ""}, "ruleExplore": {"author": "", "bookList": "class.product__item||class.product__sidebar__view__item", "bookUrl": "@tag.p@tag.a@href||class.product__item__text@tag.h6@tag.a@href", "coverUrl": "class.product__item__pic@data-setbg||@data-setbg", "intro": "", "kind": "class.epgreen@text||class.ep@text", "lastChapter": "", "name": "class.product__item__text@tag.h6@tag.a@text||@tag.p@tag.a@text", "updateTime": "", "wordCount": ""}, "ruleSearch": {"author": "", "bookList": "class.product__item", "bookUrl": "class.product__item__text@tag.h6@tag.a@href##^##https://kxmanhua.com", "checkKeyWord": "爱", "coverUrl": "class.product__item__pic@data-setbg", "intro": "", "kind": "class.epgreen@text||class.ep@text", "lastChapter": "", "name": "class.product__item__text@tag.h6@tag.a@text", "updateTime": "", "wordCount": ""}, "ruleToc": {"chapterList": "-class.chapter_list@tag.a", "chapterName": "@text", "chapterUrl": "@href##^##https://kxmanhua.com", "formatJs": "", "isPay": "", "isVip": "", "isVolume": "", "nextTocUrl": "", "preUpdateJs": "", "updateTime": ""}, "searchUrl": "https://kxmanhua.com/manga/search?keyword={{key}}&page={{page}}", "variableComment": "", "weight": 0},{"bookSourceComment": "【话本小说 · 使用说明】(本书源基于 Legado MD3 版本制作调试)\n\n■ 这是什么\n话本小说网(www.ihuaben.com)书源, 以同人/原创小说为主, 免费在线阅读。\n\n■ 搜索说明\n1. 支持书名/作者搜索(话本站内搜索 so.ihuaben.com)\n2. 注意: 话本是同人/原创平台, 没有主流网文(如斗破苍穹等搜不到属正常)\n3. 若开「精确搜索」, 只返回书名与关键词完全一致的结果\n\n■ 发现页(5个榜单)\n点击榜 / 评论榜 / 收藏榜 / 新书榜 / 新手村, 各100条\n\n■ 正文阅读\n1. 章节开头的角色对话已排版为「头像+名字：台词」(模拟聊天, 线性排列)\n2. 已自动清除: 评论数字徽标、段评、作者语(角色对话保留)\n3. 正文插图已保留; 文字嵌入模式下头像按文字行高显示(较小)\n\n■ MD3版本注意事项\n1. 若换书后图片样式未生效: 从书架删除该书重新加入\n2. 首次打开较长的书, 目录页(全量章节)加载略慢属正常\n3. 图片排版受Legado MD3文本阅读器限制: 图片只能「小尺寸内联同行」或「大尺寸独占一行」, 无法像原网站聊天气泡那样左右分栏\n", "bookSourceGroup": "小说", "bookSourceName": "话本小说", "bookSourceType": 0, "bookSourceUrl": "https://www.ihuaben.com", "bookUrlPattern": "https://www\\.ihuaben\\.com/book/\\d+\\.html", "concurrentRate": "", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "点击榜::https://top.ihuaben.com/\n评论榜::https://top.ihuaben.com/comment.html\n收藏榜::https://top.ihuaben.com/favorite.html\n新书榜::https://top.ihuaben.com/new_book.html\n新手村::https://top.ihuaben.com/new_author.html\n", "header": "@js:\nJSON.stringify({\n\"User-Agent\": java.getWebViewUA()\n})\n", "lastUpdateTime": "1787793010720", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=og:novel:author]@content", "canReName": "", "coverUrl": "meta[property=og:image]@content", "downloadUrls": "", "init": "", "intro": "meta[property=og:description]@content", "kind": "meta[property=og:novel:category]@content", "lastChapter": "", "name": "meta[property=og:novel:book_name]@content", "tocUrl": "@js:baseUrl.replace(/\\/book\\//, '/list/');", "updateTime": "", "wordCount": ""}, "ruleContent": {"callBackJs": "", "content": "<js>\nvar doc = org.jsoup.Jsoup.parse(String(result));\nvar cs = doc.select('#contentsource').first();\nif (cs) {\n  cs.select('i.num, .passage-cosplay-preview, script, style').remove();\n  var talks = cs.select('.talk');\n  for (var i = 0; i < talks.size(); i++) {\n    var t = talks.get(i);\n    var avatarSrc = '';\n    var av = t.select('.avatar img').first();\n    if (av) avatarSrc = av.attr('src');\n    var nm = t.select('.name').first();\n    var name = nm ? nm.text() : '';\n    var msg = t.select('.talkcontent p').text();\n    var p = doc.createElement('p');\n    if (avatarSrc) {\n      var img = doc.createElement('img');\n      img.attr('src', avatarSrc);\n      p.appendChild(img);\n    }\n    p.appendText(name + '：' + msg);\n    t.replaceWith(p);\n  }\n  result = cs.html();\n}\nresult;\n</js>\n", "imageDecode": "", "imageStyle": "text", "nextContentUrl": "", "payAction": "", "replaceRegex": "", "sourceRegex": "", "subContent": "", "title": "#chaptertitle h1@text", "webJs": ""}, "ruleExplore": {"author": "td.3@a@text", "bookList": "table.table-hover tbody tr", "bookUrl": "td.0@a@href", "coverUrl": "", "intro": "", "kind": "td.2@text", "lastChapter": "td.1@a@text", "name": "td.0@a@text", "updateTime": "", "wordCount": ""}, "ruleSearch": {"author": "p.text-muted@a.0@text", "bookList": "div.searchresult", "bookUrl": "h2@a@href", "checkKeyWord": "月莎", "coverUrl": "", "intro": "div.searchresult-info p@a.0@text", "kind": "", "lastChapter": "", "name": "h2@a@text", "updateTime": "", "wordCount": ""}, "ruleToc": {"chapterList": "div.chapter-row", "chapterName": "span.col-title@a@text", "chapterUrl": "span.col-title@a@href", "formatJs": "", "isPay": "", "isVip": "", "isVolume": "", "nextTocUrl": "", "preUpdateJs": "", "updateTime": ""}, "searchUrl": "https://so.ihuaben.com/search?keyword={{key}}", "weight": 0},{"bookSourceComment": "需要先在登录页面获取网址。\n部分内容需要登录才会显示，可登可不登。\n原作寿横、jiajunjin大佬，优化了发现和登录ui，添加了jm号搜索，添加魔法线路，有问题换魔法别用日韩。", "bookSourceGroup": "漫画", "bookSourceName": "🎨禁漫天堂", "bookSourceType": 2, "bookSourceUrl": "https://jmcomicqa.cc", "customOrder": 36, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "@js:\neval(String(source.loginUrl));\n\nvar URL =  $$$.url;\nif (URL && !/^https?:\\/\\//.test(URL)) {\n    URL = 'https://' + URL;\n}\nvar lineType = $$$.lineType || '主线路'; \nvar shunt = $$$.shunt || 1;\nvar weekIndex = $$$.weekIndex || 0; \nvar list = [];\n\nfunction push(title, url, size) { \n    list.push({\n        \"title\": title,\n        \"url\": url,\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": size\n        }\n    });\n}\n\nvar urlHint = (lineType === '备用线路') ? ' (备用线路)' : (lineType === '国际通用' ? ' (国际通用)' : (lineType === '东南亚' ? ' (东南亚)' : ' (主线路)'));\n\npush('❗❗为空请获取/更换链接，然后刷新❗❗','', 1);\npush('[▶ '+$$$.name+' ◀]', '', 1);\npush('[ '+$$$.url + urlHint + ' 分流' + $$$.shunt + ' ]', '', 1);\n\nvar sortConfigs = [\n  { key: 'mr', title: '按时间' },\n  { key: 'mv', title: '按阅读' },\n  { key: 'tf', title: '按最爱' },\n  { key: 'mo', title: '按收藏' },\n  { key: 'tr', title: '按评分' },\n  { key: 'md', title: '按评论' },\n  { key: 'mp', title: '按图片' }\n];\n\nvar categories = [\n[\"全部\", \"albums?o={key}&page=\"],\n  [\"COS\", \"albums/another/sub/cosplay?o={key}&page=\"],\n  [\"3D\", \"search/photos?search_query=3D&o={key}&page=\"],\n  [\"韩漫\", \"albums/hanman?o={key}&page=\"],\n  [\"热门\", \"albums?o={key}&page=\"],\n  [\"单本\", \"albums/single?o={key}&page=<,{{page}}>\"],\n  [\"CG\", \"albums/doujin/sub/CG?o={key}&page=<,{{page}}>\"],\n  [\"青年漫\", \"albums/single/sub/youth?o={key}&page=<,{{page}}>\"],\n  [\"短篇\", \"albums/short?o={key}&page=<,{{page}}>\"],\n  [\"同人\", \"albums/doujin?o={key}&page=<,{{page}}>\"],\n  [\"其他\", \"albums/another?o={key}&page=<,{{page}}>\"],\n  [\"小说\", \"novels?o=mv?o={key}&page=<,{{page}}>\"],\n  [\"美漫\", \"albums/meiman?o={key}&page=<,{{page}}>\"],\n  [\"C106&推荐本本\", \"promotes/29?o={key}&page=<,{{page}}>\"],\n  [\"禁漫去码&全彩化\", \"promotes/30?o={key}&page=<,{{page}}>\"],\n  [\"禁漫汉化组\", \"search/photos?main_tag=0&search_query=%E7%A6%81%E6%BC%AB%E6%B1%89%E5%C%96%E7%BB%84?o={key}&page=<,{{page}}>\"]\n];\n\nvar currentTagIndex = Math.min(Math.max($$$.tag || 0, 0), sortConfigs.length - 1);\nvar currentKey = sortConfigs[currentTagIndex].key;\nvar currentTitle = sortConfigs[currentTagIndex].title;\n\n\npush('🏷️分类标签---' + currentTitle + '🏷️', '', 1);\n\n\n\nfor (var j = 0; j < categories.length; j++) {\n  var arr = categories[j];\n  var t = arr[0];\n  var u = arr[1];\n  var url = URL + '/' + u.replace('{key}', currentKey);\n  if (u.indexOf('<,{{page}}>') === -1) {\n    url += '{{page}}';\n  }\n  push(t, url, 0.25);\n}\npush('🏷️每周必看 (当前: ' + weekIndex + ', 范围 0-210,0为最新)🏷️','',1); \n\ntry {\n    var pageHtml = java.ajax(URL + '/albums'); \n    var albumRegex = /href=\"\\/album\\/(\\d+)\"/g;\n    var matches = [];\n    var match;\n    while ((match = albumRegex.exec(pageHtml)) !== null) {\n        matches.push(match[1]);\n    }\n    if (matches.length > 0) {\n        var randomId = matches[Math.floor(Math.random() * matches.length)];\n        var randomUrl = URL + '/album/' + randomId;\n        push('🎲 随机看一本(仅测试版可用) 🎲', randomUrl, 1);\n    }\n} catch (e) {\n    java.log('Failed to fetch random album: ' + e);\n}\n\nvar weeklyTypes = [['日漫','manga'],['韩漫','hanman'],['其他','another']];\nfor (var i = 0; i < weeklyTypes.length; i++) {\n    var arr = weeklyTypes[i];\n    var t = arr[0];\n    var p = arr[1];\n    push(t, URL + '/week/' + weekIndex + '?skdad=1&type=' + p + '&page={{page}}', 0.25);\n}\n\n\n\npush('🏷️每周连载🏷️', '', 1);\nlet _list = [[\"周一\", \"serialization/1&page=\"], [\"周二\", \"serialization/2&page=\"], [\"周三\", \"serialization/3&page=\"], [\"周四\", \"serialization/4&page=\"],[\"周五\", \"serialization/5&page=\"], [\"周六\", \"serialization/6&page=\"], [\"周日\", \"serialization/7&page=\"], [\"已完结\", \"serialization/7&page=\"]];\n    _list.map(([t, u]) => {\n    \t    push(t, `${URL}/${u}` + '{{page}}', 0.25);\n    \t});\npush('👁‍🗨阅读排行榜👁‍🗨', '', 1);\nvar typeList = [[\"日榜\", \"&t=t\"], [\"周榜\", \"&t=w\"], [\"月榜\", \"&t=m\"],[\"总榜\", \"\"]];\nfor (var k = 0; k < typeList.length; k++) {\n    var arr = typeList[k];\n    var t = arr[0];\n    var type = arr[1];\n    push(t, URL + '/albums?o=mv' + type + '&page=' + '{{page}}' , 0.2);\n}\n\t\npush('♥️收藏排行榜♥️', '', 1);\nfor (var l = 0; l < typeList.length; l++) {\n    var arr = typeList[l];\n    var t = arr[0];\n    var type = arr[1];\n    push(t, URL + '/albums?o=mo' + type + '&page=' + '{{page}}', 0.2);\n}\n\nvar sorts1 = [\"無修正\",\"劇情向\",\"青年漫\",\"校服\",\"純愛\",\"人妻\",\"教師\",\"百合\",\"Yaoi\",\"性轉\",\"女裝\",\"癡女\",\"全彩\",\"女性向\",\"完結\",\"純愛\",\"禁漫漢化組\"];\nvar sorts2 = [\"御姐\",\"熟女\",\"未成年\",\"巨乳\",\"貧乳\",\"女性支配\",\"教師\",\"女僕\",\"護士\",\"泳裝\",\"眼鏡\",\"連褲襪\",\"其他制服\",\"兔女郎\"];\nvar sorts3 = [\"群交\",\"足交\",\"束縛\",\"肛交\",\"阿黑顏\",\"藥物\",\"扶他\",\"調教\",\"野外露出\",\"催眠\",\"自慰\",\"觸手\",\"獸交\",\"亞人\",\"怪物女孩\",\"皮物\",\"附身\",\"ryona\",\"骑大车\"];\nvar sorts4 = [\"CG\",\"重口\",\"獵奇\",\"非H\",\"血腥暴力\",\"站長推薦\"];\nvar sortCriteria = [\n  { label: '🏷️标签---按时间🏷️', sort: 'mr' },\n  { label: '🏷️标签---按阅读🏷️', sort: 'mv' },\n  { label: '🏷️标签---按最爱🏷️', sort: 'tf' },\n  { label: '🏷️标签---按收藏🏷️', sort: 'mo' },\n  { label: '🏷️标签---按评分🏷️', sort: 'tr' },\n  { label: '🏷️标签---按评论🏷️', sort: 'md' },\n  { label: '🏷️标签---按图片🏷️', sort: 'mp' }\n];\n\nvar sort =  sortCriteria[$$$.tag].sort;\nvar label = sortCriteria[$$$.tag].label;\n\npush(label, '', 1);\npush('▶主题A漫◀','', 1);\nfor (var m = 0; m < sorts1.length; m++) {\n    var s = sorts1[m];\n    push(s, URL + '/search/photos?search_query=' + s + '&o=' + sort + '&page=' + '{{page}}', 0.25);\n}\n\npush('▶角色/扮演◀','', 1);\nfor (var n = 0; n < sorts2.length; n++) {\n    var s = sorts2[n];\n    push(s, URL + '/search/photos?search_query=' + s + '&o=' + sort + '&page=' + '{{page}}', 0.25);\n}\n\npush('▶特殊PLAY◀','', 1);\nfor (var p = 0; p < sorts3.length; p++) {\n    var s = sorts3[p];\n    push(s, URL + '/search/photos?search_query=' + s + '&o=' + sort + '&page=' + '{{page}}', 0.25);\n}\n\npush('▶其他◀','', 1);\nfor (var q = 0; q < sorts4.length; q++) {\n    var s = sorts4[q];\n    push(s, URL + '/search/photos?search_query=' + s + '&o=' + sort + '&page=' + '{{page}}', 0.25);\n}\n    \nJSON.stringify(list);", "header": "{\n\t\"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0\",\n\"Referer\":\"https://18comic.vip/\"\n}", "jsLib": "function Get(e) {\n    var $this = this;\n    var java = $this.java;\n    var source = $this.source;\n    var cookie = $this.cookie;\n    var get = JSON.parse(source.getVariable());\n    return get[e];\n}", "lastUpdateTime": "1787714053032", "loginCheckJs": " var resultUrl = result.url();\n var resultCode = result.code();\n var resultBoDy = result.body();\n if (/_cf_|ge_ua|verify.php/ig.test(resultBoDy) ) {\n     if (key) {\n         url = baseUrl + java.ruleUrl;\n     }\n     cookie.removeCookie(baseUrl)\n     result = java.startBrowserAwait(resultUrl, \n     \t\"验证\", false);\n }\nresult;", "loginUi": "[ \n    {\n        \"name\": \"账号\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"密码\",\n        \"type\": \"password\"\n    },\n    {\n        \"name\": \"༺»`点击切换分流´«༻\",\n        \"type\": \"button\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"切换分流线路(1-4)\",\n        \"type\": \"button\",\n        \"action\": \"toggleShunt()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.3\n        }\n    },\n    {\n        \"name\": \"切换国际线路\",\n        \"type\": \"button\",\n        \"action\": \"setIntlUrl()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.3,\n            \"fontSize\": \"medium\",\n            \"padding\": \"10px\",\n            \"fontWeight\": \"bold\",\n            \"color\": \"white\",\n            \"backgroundColor\": \"#28a745\"\n        }\n    },\n    {\n        \"name\": \"切换东南亚线路\",\n        \"type\": \"button\",\n        \"action\": \"setSeaUrl()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.3,\n            \"fontSize\": \"medium\",\n            \"padding\": \"10px\",\n            \"fontWeight\": \"bold\",\n            \"color\": \"#000000\",\n            \"backgroundColor\": \"#ffc107\"\n        }\n    },\n    {\n        \"name\": \"❤️获取/切换国内直连\",\n        \"type\": \"button\",\n        \"action\": \"url()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.3,\n            \"fontSize\": \"large\",\n            \"padding\": \"15px\",\n            \"fontWeight\": \"bold\",\n            \"color\": \"white\",\n            \"backgroundColor\": \"#007bff\"\n        }\n    },\n    \n    {\n        \"name\": \"༺ˇ»`ʚ  点击切换排序    ɞ´«ˇ༻\",\n        \"type\": \"button\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"时间\",\n        \"type\": \"button\",\n        \"action\": \"tag(0)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"阅读\",\n        \"type\": \"button\",\n        \"action\": \"tag(1)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"最爱\",\n        \"type\": \"button\",\n        \"action\": \"tag(2)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"收藏\",\n        \"type\": \"button\",\n        \"action\": \"tag(3)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"评分\",\n        \"type\": \"button\",\n        \"action\": \"tag(4)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"评论\",\n        \"type\": \"button\",\n        \"action\": \"tag(5)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"图片\",\n        \"type\": \"button\",\n        \"action\": \"tag(6)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"༺»`每周必看索引 (0-210)´«༻\",\n        \"type\": \"button\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"重置\",\n        \"type\": \"button\",\n        \"action\": \"resetWeekIndex()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"随机\",\n        \"type\": \"button\",\n        \"action\": \"randomWeekIndex()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"+1\",\n        \"type\": \"button\",\n        \"action\": \"incrementWeekIndex()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"-1\",\n        \"type\": \"button\",\n        \"action\": \"decrementWeekIndex()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    }\n]", "loginUrl": "var intlLinks = [];\nvar seaLinks = [];\nvar defaultIntlLinks = ['https://18comic.vip', 'https://18comic.ink'];\nvar defaultSeaLinks = ['https://jmcomic-zzz.one', 'https://jmcomic-zzz.org'];\nvar cachedPageHtml = null;\n\nfunction extractLinks(pageHtml, blockRegex) {\n    var links = [];\n    if (!pageHtml) return links;\n    var blockMatch = pageHtml.match(blockRegex);\n    if (blockMatch && blockMatch[1]) {\n        var blockContent = blockMatch[1];\n        var linkMatches = blockContent.match(/<span>(.*?)<\\/span>/g);\n        if (linkMatches) {\n            links = linkMatches.map(function(spanTag) {\n                var domain = spanTag.replace(/<\\/?span>/g, '').trim();\n                return /^https?:\\/\\//.test(domain) ? domain : 'https://' + domain;\n            }).filter(function(url) {\n                return url !== 'https://';\n            });\n        }\n    }\n    return links;\n}\n\nvar intlBlockRegex = /<div class=\"international\">([\\s\\S]*?)<\\/div>/;\nvar seaBlockRegex = /<div class=\"southeast_asia\">([\\s\\S]*?)<\\/div>/;\n\ntry {\n    cachedPageHtml = java.ajax('https://jmcomicqa.cc');\n    intlLinks = extractLinks(cachedPageHtml, intlBlockRegex);\n    seaLinks = extractLinks(cachedPageHtml, seaBlockRegex);\n\n    if (intlLinks.length === 0) {\n        java.log('未能从jmcomicqa.cc提取国际线路, 启用备用线路。');\n        intlLinks = defaultIntlLinks;\n    }\n    if (seaLinks.length === 0) {\n        java.log('未能从jmcomicqa.cc提取东南亚线路, 启用备用线路。');\n        seaLinks = defaultSeaLinks;\n    }\n} catch (e) {\n    java.log('访问jmcomicqa.cc失败, 启用备用线路: ' + e);\n    intlLinks = defaultIntlLinks;\n    seaLinks = defaultSeaLinks;\n}\n\nvar original = {\n    'url': 'https://jmcomicqa.cc',\n    'name': '寿横',\n    'tag': 0,\n    'weekIndex': 0, \n    'shunt': 1,\n    'usedIndexes': [],\n    'lineType': '主线路',\n    'intlLinkIndex': 0,\n    'seaLinkIndex': 0\n};\ntry {\n    $$$= JSON.parse(source.getVariable());\n    if ($$$ == null) {\n        throw new Error();\n    } else {\n        if (!$$$.hasOwnProperty('usedIndexes'))$$$.usedIndexes = [];\n        if (!$$$.hasOwnProperty('weekIndex')) $$$.weekIndex = 0;\n        if (!$$$.hasOwnProperty('tag')) $$$.tag = 0;\n        if (!$$$.hasOwnProperty('shunt')) $$$.shunt = 1; \n        if (!$$$.hasOwnProperty('lineType')) $$$.lineType = '主线路';\n        if (!$$$.hasOwnProperty('intlLinkIndex')) $$$.intlLinkIndex = 0;\n        if (!$$$.hasOwnProperty('seaLinkIndex')) $$$.seaLinkIndex = 0;\n    };\n} catch (e) {\n    $$$= original;\n    put($$$);\n}\n\nfunction put(data) {\n    return source.setVariable(JSON.stringify(data, null, '\\t'));\n}\n\nfunction n(e) {\n    var n_str = '\\n';\n    for (var m = 1; m < e; m++) {\n        n_str = n_str + '\\n';\n    }\n    return n_str;\n}\n\nfunction log(e) {\n    if (e == undefined) {\n        return;\n    }\n    java.longToast(e);\n}\n\nvar regexList = [\n    /china\"><span>(.*?)<\\/span>/,\n    /first_line\"><span>(.*?)<\\/span>/,\n    /second_line\"><span>(.*?)<\\/span>/\n];\n\nfunction getRandomUnusedIndex() {\n    if ($$$.usedIndexes.length === regexList.length) {\n       $$$.usedIndexes = [];\n    }\n    var randomIndex;\n    do {\n        randomIndex = Math.floor(Math.random() * regexList.length);\n    } while ($$$.usedIndexes.indexOf(randomIndex) !== -1);\n    $$$.usedIndexes.push(randomIndex);\n    put($$$);\n    return randomIndex;\n}\n\nvar MAX_INDEX = 210;\nvar MIN_INDEX = 0;\n\nfunction updateIndex(newIndex) {\n    if (newIndex !== $$$.weekIndex) {\n        $$$.weekIndex = newIndex;\n        put($$$);\n        log('【索引更新】每周必看索引已更新为: ' + newIndex + n(2) + '请刷新探索页');\n    } else {\n        log('【提示】索引值未更改，当前值为: ' + newIndex);\n    }\n}\n\nfunction randomWeekIndex() {\n    var newIndex = Math.floor(Math.random() * (MAX_INDEX + 1));\n    updateIndex(newIndex);\n}\n\nfunction incrementWeekIndex() {\n    var newIndex = $$$.weekIndex + 1;\n    if (newIndex > MAX_INDEX) {\n        newIndex = MAX_INDEX;\n        log('【警告】已达最大索引值: ' + MAX_INDEX);\n    }\n    updateIndex(newIndex);\n}\n\nfunction decrementWeekIndex() {\n    var newIndex = $$$.weekIndex - 1;\n    if (newIndex < MIN_INDEX) {\n        newIndex = MIN_INDEX;\n        log('【警告】已达最小索引值: ' + MIN_INDEX);\n    }\n    updateIndex(newIndex);\n}\n\nfunction resetWeekIndex() {\n    updateIndex(MIN_INDEX);\n}\n\nfunction login() {\n    var result = JSON.parse(source.getLoginInfo());\n    var username = result['账号'];\n    $$$.name = username;\n    var password = result['密码'];\n    var options = {\n\t   body: 'username=' + username + '&password=' + password + '&submit_login=1',\n\t   method: 'POST'\n\t};\n    if (!cachedPageHtml) {\n        cachedPageHtml = java.ajax('https://jmcomicqa.cc');\n    }\n    var randomIndex = getRandomUnusedIndex();\n    var currentRegex = regexList[randomIndex];\n    var matchResult = cachedPageHtml.match(currentRegex);\n    var url = matchResult ? matchResult[1] : $$$.url;\nif (url && !/^https?:\\/\\//.test(url)) {\n      url = 'https://' + url;\n}    \n    var lineType = randomIndex === 0 ? '主线路' : '备用线路';\n    var lineHint = randomIndex === 0 ? ' (默认主线路)' : ' (备用线路)';\n    log('站点变更:' + url + lineHint);\n    \n    $$$.url = url;\n    $$$.lineType = lineType;\n    put($$$);\n    java.ajax(url + '/login,' + JSON.stringify(options));\n    return put($$$);\n}\n\nvar P = ['时间', '阅读', '最爱', '收藏', '评分', '评论', '图片'];\n\nfunction typeP(e) {\n    if (e == undefined || e < 0 || e >= P.length) {\n        e = 0;\n    }\n    return P[e];\n}\n\nfunction tag(e) {\n    if (e == $$$.tag) {\n        return log('【标签切换提示】' + n(2) + '已经选择[' + typeP(e) + ']，无需更换');\n    }\n    log('【标签切换提示】' + n(2) + '已经切换到[' + typeP(e) + ']，请刷新探索页');\n    $$$.tag = e;\n    return put($$$);\n}\n\nfunction url() {\n    if (!cachedPageHtml) {\n        cachedPageHtml = java.ajax('https://jmcomicqa.cc');\n    }\n    var randomIndex = getRandomUnusedIndex();\n    var currentRegex = regexList[randomIndex];\n    var matchResult = cachedPageHtml.match(currentRegex);\n    var url = matchResult ? matchResult[1] : $$$.url;\nif (url && !/^https?:\\/\\//.test(url)) {\n      url = 'https://' + url;\n}\n    \n    var lineType = randomIndex === 0 ? '主线路' : '备用线路';\n    var lineHint = randomIndex === 0 ? ' (默认主线路)' : ' (备用线路)';\n    \n    if (url == $$$.url) {\n        return log('【站点提示】' + n(2) + '站点无需更换，当前为' + lineHint);\n    }\n    log('站点变更:' + url + lineHint);\n    $$$.url = url;\n    $$$.lineType = lineType;\n    return put($$$);\n}\n\nfunction setIntlUrl() {\n    if (typeof $$$.intlLinkIndex === 'undefined') $$$.intlLinkIndex = 0;\n    $$$.intlLinkIndex = ($$$.intlLinkIndex + 1) % intlLinks.length;\n    var newUrl = intlLinks[$$$.intlLinkIndex];\n    $$$.url = newUrl;\n    $$$.lineType = '国际通用，需魔法';\n    put($$$);\n    log('【国际站点】已切换 (' + ($$$.intlLinkIndex + 1) + '/' + intlLinks.length + '): ' + newUrl + n(2) + '请刷新探索页');\n}\n\nfunction setSeaUrl() {\n    if (typeof $$$.seaLinkIndex === 'undefined') $$$.seaLinkIndex = 0;\n    $$$.seaLinkIndex = ($$$.seaLinkIndex + 1) % seaLinks.length;\n    var newUrl = seaLinks[$$$.seaLinkIndex];\n    $$$.url = newUrl;\n    $$$.lineType = '东南亚，需魔法';\n    put($$$);\n    log('【东南亚站点】已切换 (' + ($$$.seaLinkIndex + 1) + '/' + seaLinks.length + '): ' + newUrl + n(2) + '请刷新探索页');\n}\n\nfunction toggleShunt() {\n    var newShunt = $$$.shunt + 1;\n    if (newShunt > 4) {\n        newShunt = 1;\n    }\n    log('【分流切换提示】' + n(2) + '已切换分流: ' + $$$.shunt + ' -> ' + newShunt + '，请刷新探索页');\n    $$$.shunt = newShunt;\n    return put($$$);\n}\n\n\nfunction shunt(e) {\n    if (e < 1 || e > 4) {\n        return log('【分流提示】' + n(2) + '分流值不合法，范围为1-4。');\n    }\n    if (e == $$$.shunt) {\n        return log('【分流切换提示】' + n(2) + '已经选择分流[' + e + ']，无需更换');\n    }\n    log('【分流切换提示】' + n(2) + '已经切换到分流[' + e + ']，请刷新探索页');\n    $$$.shunt = e;\n    return put($$$);}", "respondTime": 180000, "ruleBookInfo": {"author": "{{@@.phone-author-tag@text}}", "coverUrl": ".thumb-overlay.2@img@src", "init": "<js>\nurl = baseUrl\nvar num = baseUrl.indexOf(\"novel\") !== -1 ? 1 : 2;\njava.put(\"btype\",num);\nresult\n</js>", "intro": " {{@@class.train-number@text}}\n{{@@class.intro-collapse-content@text}}\n{{@@class.p-t-5 float-left@text##日期}}    {{@@class.p-t-5 float-right@text##日期}}\n{{@@class.col-xs-12 col-lg-7 nav-tab-content@class.p-t-5 p-b-5@text##叙述：|敘述：}}", "kind": "@js:\nvar text;\nif (baseUrl.indexOf('novel') !== -1){\n\ttext=java.getString('span[data-type=tags]@a@text');\n}else {\n\ttext=java.getString('#intro-block@[data-type=tags]@a@text');\n}\ntext;", "name": "{{@@h1@text}}", "tocUrl": "baseUrl", "wordCount": "{{@class.train-number@text}}"}, "ruleContent": {"content": "{{@class.novel-content@html}}\n{{@class.row thumb-overlay-albums@tag.img@data-original}}\n@js:var url = baseUrl\nif(baseUrl.indexOf(\"novel\") !== -1){\n\tresult\n\t} else {\n        var lines = result.split(\"\\n\");\n        var newLines = [];\n        for (var i = 0; i < lines.length; i++) {\n            newLines.push('<img src=\"' + lines[i] + '\">');\n        }\n        newLines.join(\"\\n\")\n}", "imageDecode": "if (src.search(\"qyyuapi.com\") != -1) {\n    result;\n} else {\n    var Magua = new JavaImporter();\n    Magua.importPackage(Packages.java.io, Packages.android.graphics);\n    with(Magua) {\n        var mac = src.match(/photos\\/(\\d+)?\\/(\\d+)?/);\n        var bookId = mac[1];\n        var imgId = mac[2];\n        if (src.search(\"gif\") != -1 || Number(bookId) < 220980) {\n            result;\n        } else {\n            var num;\n            if (Number(bookId) > 421925) {\n                var md5 = java.md5Encode((bookId + imgId));\n                var ascii = md5.substr( - 1).charCodeAt(0);\n                num = (ascii % 8 + 1) * 2;\n            } else if (Number(bookId) >= 268850) {\n                var md5 = java.md5Encode((bookId + imgId));\n                var ascii = md5.substr( - 1).charCodeAt(0);\n                num = (ascii % 10 + 1) * 2;\n            } else {\n                num = 10;\n            }\n            var img = BitmapFactory.decodeByteArray(result, 0, result.length);\n            var height = img.getHeight();\n            var width = img.getWidth();\n            var y = Math.floor(height / num);\n            var remainder = height % num;\n            var newImg = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);\n            var canvas = new Canvas(newImg);\n            for (var i = 1; i <= num; i++) {\n                var h = i === num ? remainder: 0;\n                canvas.drawBitmap(Bitmap.createBitmap(img, 0, y * (i - 1), width, y + h), 0, height - y * i - h, null);\n            }\n            var newbit = new ByteArrayOutputStream();\n            newImg.compress(Bitmap.CompressFormat.PNG, 100, newbit);\n            newbit.toByteArray();\n        }\n    }\n}", "imageStyle": "FULL"}, "ruleExplore": [], "ruleSearch": {"author": "@js:\nvar text;\nif (baseUrl.indexOf('novel') !== -1){\n\ttext=java.getString('.title-truncate.2@text');\n}else {\n\ttext=java.getString('.title-truncate.1@text');\n}\ntext;", "bookList": ".list-col||.list-item||.thumb-overlay-guess_likes", "bookUrl": "tag.a.0@href", "coverUrl": "img@data-original||img@src", "intro": ".video-title@text", "kind": ".tag@text", "lastChapter": "@js:\nvar text;\nif (baseUrl.indexOf('novel') !== -1){\n\ttext=java.getString('.title-truncate.1@text');\n}else {\n\ttext=java.getString('');\n}\ntext;", "name": ".video-title@text", "wordCount": "span.0@text##^##👍🏻"}, "ruleToc": {"chapterList": "class.btn-toolbar.0@tag.a||.reading\n<js>\nvar type = +(java.get('btype'))\njava.log(type)\nswitch (type) {\n  case 1:\n    book.type = 8;\n    break;\n  case 2:\n    book.type = 64;\n}\nresult\n</js>", "chapterName": "text", "chapterUrl": "href##(.*)##$1/?shunt={{Get('shunt')}}", "preUpdateJs": "{{}}", "updateTime": "span@text"}, "searchUrl": "{{Get('url')}}/search/photos?search_query={{key}}&search-type=photos&main_tag=0&page={{page}}", "weight": 0},{"bookSourceComment": "如遇卡顿在章节URL切换下面线路\n         A\": \"doppiocdn.com\",\n        \"B\": \"doppiocdn1.com\",\n        \"C\": \"doppiocdn.media\",\n        \"D\": \"doppiocdn.net\",\n        \"E\": \"doppiocdn.org\",\n        \"F\": \"doppiocdn.live\",", "bookSourceGroup": "视频直播", "bookSourceName": "VirtualTaboo直播优化", "bookSourceType": 4, "bookSourceUrl": "https://zh.virtualtaboo.live##吉吉国王", "customButton": false, "customOrder": 4, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:var currentPrimaryTag = 'girls';\nlet sort = [], push = (t, u, p) => sort.push({ title: t, url: u, style: { layout_flexBasisPercent: p } });\n\nlet data = JSON.parse(java.ajax('https://zh.virtualtaboo.live/api/front/models/liveTags?primaryTag=girls&withMixedTags=true&sac=true'));\nlet tagGroups = data.liveTagGroups || [], tagDetails = data.liveTagDetails || {};\n\nlet tagNameMap = {\n    'tagLanguageChinese':'中文','tagLanguageUkrainian':'乌克兰语','autoTagNew':'新主播','autoTagVr':'VR直播',\n    'subcultureBdsm':'虐恋','groupShow':'群组秀','ageTeen':'18+','ageYoung':'22+','ageMilf':'熟女',\n    'ageMature':'成熟','ageOld':'老年','ethnicityMiddleEastern':'中东','ethnicityAsian':'亚洲','ethnicityEbony':'黑人',\n    'ethnicityIndian':'印度','ethnicityLatino':'拉丁','ethnicityMultiracial':'混血','ethnicityWhite':'白人',\n    'bodyTypePetite':'娇小','bodyTypeAthletic':'运动型','bodyTypeMedium':'匀称','bodyTypeCurvy':'曲线型',\n    'bodyTypeBBW':'大码美女','bodyTypeBig':'丰满','hairColorBlonde':'金发','hairColorBrown':'棕发',\n    'hairColorBlack':'黑发','hairColorRed':'红发','hairColorColorful':'彩发','hairColorHairless':'无毛',\n    'privatePriceEight':'8元/分钟','privatePriceSixteenToTwentyFour':'16-24元/分钟','privatePriceThirtyTwoSixty':'32-60元/分钟',\n    'privatePriceNinetyPlus':'90+元/分钟','autoTagBestPrivates':'最佳私密秀','autoTagRecordablePrivate':'可录制私密秀',\n    'autoTagSpy':'可窥视','autoTagP2P':'P2P直播','autoTagInteractiveToy':'互动玩具','mobile':'手机直播',\n    'tagGroupSex':'群交','specificsBigTits':'巨乳','specificsHairy':'有毛','doPublicPlace':'公共场合',\n    'specificsBigAss':'大屁股','doAnal':'肛交','doSquirt':'喷水','fuckMachine':'炮机','doHardcore':'硬核',\n    'doBlowjob':'口交','specificSmallTits':'贫乳','specificPregnant':'孕妇','doFisting':'拳交',\n    'doMasturbation':'自慰','specificShaven':'剃毛','doDeepThroat':'深喉','doDildoOrVibrator':'假阳具/震动器',\n    'doFootFetish':'恋足','doOffice':'办公室','subcultureGoth':'哥特','jerkOffInstruction':'射精指导',\n    'subcultureSwingers':'交换伴侣','doCosplay':'Cosplay','doSexToys':'性玩具','doTalk':'聊天',\n    'subcultureEmo':'Emo','subcultureCuckold':'出轨','subcultureMistresses':'情妇','videoGames':'电玩',\n    'doStriptease':'脱衣舞','asmr':'ASMR','doYoga':'瑜伽','doCooking':'烹饪','autoTagNonNude':'非全裸',\n    'specificInterracial':'跨种族','specificsTattoos':'纹身','specificsPiercing':'穿孔','autoTagLovense':'Lovense',\n    'latex':'乳胶','doRolePlay':'角色扮演','leather':'皮革','autoTagKiiroo':'Kiiroo','corset':'紧身内衣',\n    'doAnalToys':'后庭玩具','doNippleToys':'乳头玩具','specificBigClit':'大阴蒂','specificBigNipples':'大乳头',\n    'specificHairyArmpits':'腋毛','specificTrimmed':'修剪','specificTomboy':'假小子','specificQueer':'酷儿',\n    'specificNonBinary':'非二元性别','subcultureEgirl':'电子女孩','subcultureAnime':'动漫女孩',\n    'subcultureGlamour':'高贵','subcultureKpop':'韩流','subcultureHousewives':'家庭主妇',\n    'subcultureGymBabe':'健身宝贝','subcultureRomantic':'浪漫','subculturePunks':'朋克',\n    'subcultureNerds':'书呆子','subcultureGamers':'玩家','subcultureStudent':'学生',\n    'subcultureClubber':'夜店女郎','subcultureBottom':'Bottom','subcultureTop':'Top',\n    'subcultureChubbies':'胖熊','subcultureCubs':'小熊','subcultureDragQueens':'变装皇后',\n    'subcultureEboy':'E-boy','subcultureGymRats':'健身狂','subcultureHunks':'猛男',\n    'subcultureJocks':'运动男','subcultureOtters':'水獭','subcultureStuds':'种马',\n    'doEroticDance':'色情舞','cockRating':'大屌评分','doEjaculation':'射精','doTwerk':'电臀舞',\n    'doAssToMouth':'肛交到口交','doDoublePenetration':'双茎插入','doOrgasm':'高潮',\n    'doFoursome':'四人性交','doAhegao':'高潮脸','doCreamPie':'体内射精','doDoggyStyle':'狗式',\n    'doPussyLicking':'舔鲍鱼','doBukkake':'集体颜射','doShower':'洗澡','doHumiliation':'羞辱',\n    'doOilShow':'精油表演','doCumshot':'颜射','doGape':'开肛','doCamelToe':'阴部骆驼趾',\n    'doFlashing':'快闪裸体','doCowgirl':'骑乘女','doFacesitting':'骑脸','doGagging':'强制塞口',\n    'doStrapon':'穿戴式阳具','do69Position':'69姿势','doMassage':'按摩','doSpanking':'鞭打',\n    'doUpskirt':'裙底风光','doGloryHole':'厕板洞','doThreesome':'三人性交','doSmoking':'抽烟',\n    'boots':'靴子','heels':'高跟鞋','nylon':'丝袜','specificJeans':'牛仔裤','specificSportGear':'运动装备',\n    'tagLanguageAfrican':'非洲裔','tagLanguageAlgerian':'阿尔及利亚','tagLanguageArgentinian':'阿根廷',\n    'tagLanguageArmenian':'亚美尼亚','tagLanguageAssamese':'阿萨姆','tagLanguageAustralian':'澳大利亚',\n    'tagLanguageAustrian':'奥地利人','tagLanguageBangladeshi':'孟加拉','tagLanguageBelgian':'比利时',\n    'tagLanguageBengali':'孟加拉语','tagLanguageBrazilian':'巴西','tagLanguageBulgarian':'保加利亚人',\n    'tagLanguageCanadian':'加拿大','tagLanguageChilean':'智利','tagLanguageColombian':'哥伦比亚',\n    'tagLanguageCroatian':'克罗地亚','tagLanguageCzech':'捷克','tagLanguageDanish':'丹麦',\n    'tagLanguageDominican':'多米尼加','tagLanguageDutch':'荷兰','tagLanguageEcuadorian':'厄瓜多尔',\n    'tagLanguageEgyptian':'埃及','tagLanguageEstonian':'爱沙尼亚','tagLanguageEuropean':'欧洲女孩',\n    'tagLanguageFilipino':'菲律宾','tagLanguageFinnish':'芬兰','tagLanguageFrench':'法语',\n    'tagLanguageGeorgian':'格鲁吉亚','tagLanguageGermanSpeaking':'德语','tagLanguageGreek':'希腊',\n    'tagLanguageGujarati':'古吉拉特','tagLanguageHindi':'印地','tagLanguageHungarian':'匈牙利',\n    'tagLanguageIndonesian':'印度尼西亚','tagLanguageIrish':'爱尔兰','tagLanguageIsraeli':'以色列',\n    'tagLanguageItalian':'意大利','tagLanguageJamaican':'牙买加','tagLanguageJapanese':'日语',\n    'tagLanguageKannada':'卡纳达','tagLanguageKenyan':'肯尼亚','tagLanguageKiwi':'新西兰',\n    'tagLanguageKorean':'韩语','tagLanguageLatvian':'拉脱维亚','tagLanguageLithuanian':'立陶宛',\n    'tagLanguageMalagasy':'马尔加什','tagLanguageMalayalam':'马拉雅拉姆','tagLanguageMalaysian':'马来西亚',\n    'tagLanguageMarathi':'马拉地','tagLanguageMexican':'墨西哥','tagLanguageMoroccan':'摩洛哥',\n    'tagLanguageNigerian':'尼日利亚','tagLanguageNordic':'北欧','tagLanguageNorwegian':'挪威',\n    'tagLanguageOdia':'奥里亚','tagLanguagePeruvian':'秘鲁','tagLanguagePolish':'波兰',\n    'tagLanguagePortuguese':'葡萄牙','tagLanguagePortugueseSpeaking':'葡萄牙语','tagLanguagePunjabi':'旁遮普',\n    'tagLanguageRomanian':'罗马尼亚','tagLanguageRussianSpeaking':'俄罗斯','tagLanguageSerbian':'塞尔维亚',\n    'tagLanguageSlovakian':'斯洛伐克','tagLanguageSouthAfrican':'南非','tagLanguageSpanish':'西班牙语',\n    'tagLanguageSpanishSpeaking':'西班牙','tagLanguageSriLankan':'斯里兰卡','tagLanguageSwedish':'瑞典',\n    'tagLanguageSwiss':'瑞士','tagLanguageTaiwanese':'台湾省','tagLanguageTamil':'泰米尔',\n    'tagLanguageTelugu':'泰卢固','tagLanguageThai':'泰国','tagLanguageTurkish':'土耳其',\n    'tagLanguageUKModels':'英国','tagLanguageUSModels':'美国','tagLanguageUgandan':'乌干达',\n    'tagLanguageVenezuelan':'委内瑞拉','tagLanguageVietnamese':'越南','tagLanguageZimbabwean':'津巴布韦'\n};\n\nfunction getDisplay(tag) { return tagNameMap[tag] || tag.replace(/([A-Z])/g, ' $1').trim(); }\n\nfunction buildUrl(tag) {\n    return 'https://zh.virtualtaboo.live/api/front/models?removeShows=false&recInFeatured=false&limit=60&offset={{(page-1)*60}}&primaryTag=' + currentPrimaryTag + '&filterGroupTags=' + encodeURIComponent(JSON.stringify([[tag]])) + '&sortBy=stripRanking&parentTag=' + tag + '&userRole=user&sac=true';\n}\n\nfunction render(tags, title) {\n    if (!tags || !tags.length) return;\n    push('❤️ ' + title + ' ❤️', null, 1);\n    for (var i = 0; i < tags.length; i++) {\n        var tag = tags[i];\n        if (!tag) continue;\n        var count = tagDetails[tag] ? tagDetails[tag].modelsLive || 0 : 0;\n        push(getDisplay(tag) + (count > 0 ? count + '人' : ''), buildUrl(tag), 0.29);\n    }\n}\n\nfunction sortTags(tags) {\n    tags.sort(function(a, b) {\n        var ca = tagDetails[a] ? tagDetails[a].modelsLive || 0 : 0;\n        var cb = tagDetails[b] ? tagDetails[b].modelsLive || 0 : 0;\n        return cb - ca;\n    });\n    return tags;\n}\n\nfunction findGroup(alias) {\n    for (var i = 0; i < tagGroups.length; i++) {\n        if (tagGroups[i].alias === alias) return tagGroups[i];\n    }\n    return null;\n}\n\nfunction renderManual(list, title) {\n    var valid = [];\n    for (var i = 0; i < list.length; i++) {\n        var tag = list[i];\n        if (tagDetails[tag] && tagDetails[tag].modelsLive > 0) valid.push(tag);\n    }\n    render(sortTags(valid), title);\n}\n\n// ============================================================\n// girls 频道\n// ============================================================\ncurrentPrimaryTag = 'girls';\npush('🔥 在线热门', 'https://zh.virtualtaboo.live/api/front/models?removeShows=false&recInFeatured=false&limit=60&offset=0&primaryTag=girls&sortBy=stripRanking&userRole=user&sac=true', 1);\n\nvar quickLang = [\n    ['🇨🇳 中文', 'tagLanguageChinese'],\n    ['🇯🇵 日语', 'tagLanguageJapanese'],\n    ['🇻🇳 越南语', 'tagLanguageVietnamese']\n];\nfor (var i = 0; i < quickLang.length; i++) {\n    var tag = quickLang[i][1];\n    var count = tagDetails[tag] ? tagDetails[tag].modelsLive || 0 : 0;\n    if (count > 0) push(quickLang[i][0] + count + '人', buildUrl(tag), 0.29);\n}\n\nvar groupTitles = { 'specials': '🔥 特别推荐', 'age': '🎂 年龄', 'ethnicity': '🌍 人种', 'bodyType': '💪 体型', 'hairColor': '💇 发色', 'privatePrice': '💰 价格' };\n['specials', 'age', 'ethnicity', 'bodyType', 'hairColor', 'privatePrice'].forEach(function(alias) {\n    var group = findGroup(alias);\n    if (!group) return;\n    var valid = [];\n    var tags = group.tags || [];\n    for (var i = 0; i < tags.length; i++) {\n        var tag = tags[i];\n        if (tagDetails[tag] && tagDetails[tag].modelsLive > 0) valid.push(tag);\n    }\n    render(sortTags(valid), groupTitles[alias]);\n});\n\nvar langTags = [];\nfor (var tag in tagDetails) {\n    if (tag.indexOf('tagLanguage') === 0 && tag.indexOf('-') === -1 && tagDetails[tag].modelsLive > 0) langTags.push(tag);\n}\nrender(sortTags(langTags), '🌐 语言分类');\n\nvar subTags = [];\nfor (var tag in tagDetails) {\n    if (tag.indexOf('subculture') === 0 && tag.indexOf('-') === -1 && tagDetails[tag].modelsLive > 0) subTags.push(tag);\n}\nrender(sortTags(subTags), '🎭 亚文化');\n\nvar allGroup = findGroup('allTags');\nvar actionTags = [], bodyTags = [], perfTags = [];\nvar perfKeywords = ['striptease', 'eroticDance', 'twerk', 'oilShow', 'shower', 'topless', 'flashing', 'upskirt'];\nif (allGroup) {\n    var allTags = allGroup.tags || [];\n    for (var i = 0; i < allTags.length; i++) {\n        var tag = allTags[i];\n        if (!tagDetails[tag] || tagDetails[tag].modelsLive <= 0) continue;\n        if (tag.indexOf('do') === 0) actionTags.push(tag);\n        else if (tag.indexOf('specific') === 0) bodyTags.push(tag);\n        for (var k = 0; k < perfKeywords.length; k++) {\n            if (tag.indexOf(perfKeywords[k]) !== -1) { perfTags.push(tag); break; }\n        }\n    }\n}\nrender(sortTags(actionTags), '🎬 活动分类');\nrender(sortTags(bodyTags), '🔍 身体特征');\nrender(sortTags(perfTags), '💃 表演类型');\n\nrenderManual(['doStrapon','doAnalToys','autoTagInteractiveToy','doDildoOrVibrator','fuckMachine','doNippleToys','doSexToys','autoTagKiiroo','autoTagLovense'], '📱 设备分类');\nrenderManual(['doSmoking','subcultureCuckold','specificsPiercing','cockRating','heels','corset','doFootFetish','specificJeans','subcultureBdsm','leather','subcultureMistresses','latex','nylon','specificsTattoos','specificPregnant','specificSportGear'], '🖤 恋物癖');\n\n// ============================================================\n// couples 频道\n// ============================================================\nfunction buildCouples() {\n    currentPrimaryTag = 'couples';\n    var data2 = JSON.parse(java.ajax('https://zh.virtualtaboo.live/api/front/models/liveTags?primaryTag=couples&withMixedTags=true&sac=true'));\n    var tagGroups2 = data2.liveTagGroups || [];\n    var tagDetails2 = data2.liveTagDetails || {};\n\n    function renderCouplesTags(tags, title) {\n        if (!tags || !tags.length) return;\n        push('❤️ ' + title + ' ❤️', null, 1);\n        for (var i = 0; i < tags.length; i++) {\n            var tag = tags[i];\n            if (!tag) continue;\n            var count = tagDetails2[tag] ? tagDetails2[tag].modelsLive || 0 : 0;\n            push(getDisplay(tag) + (count > 0 ? count + '人' : ''), buildUrl(tag), 0.29);\n        }\n    }\n\n    function findGroup2(alias) {\n        for (var i = 0; i < tagGroups2.length; i++) {\n            if (tagGroups2[i].alias === alias) return tagGroups2[i];\n        }\n        return null;\n    }\n\n    function sortTags2(tags) {\n        tags.sort(function(a, b) {\n            var ca = tagDetails2[a] ? tagDetails2[a].modelsLive || 0 : 0;\n            var cb = tagDetails2[b] ? tagDetails2[b].modelsLive || 0 : 0;\n            return cb - ca;\n        });\n        return tags;\n    }\n\n    function renderManualCouples(list, title) {\n        var valid = [];\n        for (var i = 0; i < list.length; i++) {\n            var tag = list[i];\n            if (tagDetails2[tag] && tagDetails2[tag].modelsLive > 0) valid.push(tag);\n        }\n        renderCouplesTags(sortTags2(valid), title);\n    }\n\n    push('💕 情侣专区 💕', null, 1);\n\n    var groupTitles2 = {\n        'specials': '🔥 特别推荐',\n        'age': '🎂 年龄',\n        'ethnicity': '🌍 人种',\n        'bodyType': '💪 体型',\n        'hairColor': '💇 发色',\n        'privatePrice': '💰 价格'\n    };\n    ['specials', 'age', 'ethnicity', 'bodyType', 'hairColor', 'privatePrice'].forEach(function(alias) {\n        var group = findGroup2(alias);\n        if (!group) return;\n        var valid = [];\n        var tags = group.tags || [];\n        for (var i = 0; i < tags.length; i++) {\n            var tag = tags[i];\n            if (tagDetails2[tag] && tagDetails2[tag].modelsLive > 0) valid.push(tag);\n        }\n        renderCouplesTags(sortTags2(valid), groupTitles2[alias]);\n    });\n\n    ['tagLanguage', 'subculture'].forEach(function(prefix) {\n        var tags = [];\n        for (var tag in tagDetails2) {\n            if (tag.indexOf(prefix) === 0 && tag.indexOf('-') === -1 && tagDetails2[tag].modelsLive > 0) tags.push(tag);\n        }\n        renderCouplesTags(sortTags2(tags), prefix === 'tagLanguage' ? '🌐 语言分类' : '🎭 亚文化');\n    });\n\n    var allGroup2 = findGroup2('allTags');\n    var actionTags2 = [], bodyTags2 = [], perfTags2 = [];\n    var perfKeywords = ['striptease', 'eroticDance', 'twerk', 'oilShow', 'shower', 'topless', 'flashing', 'upskirt'];\n    if (allGroup2) {\n        var allTags2 = allGroup2.tags || [];\n        for (var i = 0; i < allTags2.length; i++) {\n            var tag = allTags2[i];\n            if (!tagDetails2[tag] || tagDetails2[tag].modelsLive <= 0) continue;\n            if (tag.indexOf('do') === 0) actionTags2.push(tag);\n            else if (tag.indexOf('specific') === 0) bodyTags2.push(tag);\n            for (var k = 0; k < perfKeywords.length; k++) {\n                if (tag.indexOf(perfKeywords[k]) !== -1) { perfTags2.push(tag); break; }\n            }\n        }\n    }\n    renderCouplesTags(sortTags2(actionTags2), '🎬 活动分类');\n    renderCouplesTags(sortTags2(bodyTags2), '🔍 身体特征');\n    renderCouplesTags(sortTags2(perfTags2), '💃 表演类型');\n\n    renderManualCouples(['doStrapon','doAnalToys','autoTagInteractiveToy','doDildoOrVibrator','fuckMachine','doNippleToys','doSexToys','autoTagKiiroo','autoTagLovense'], '📱 设备分类');\n    renderManualCouples(['doSmoking','subcultureCuckold','specificsPiercing','cockRating','heels','corset','doFootFetish','specificJeans','subcultureBdsm','leather','subcultureMistresses','latex','nylon','specificsTattoos','specificPregnant','specificSportGear'], '🖤 恋物癖');\n}\n\n// ============================================================\n// men 频道\n// ============================================================\nfunction buildMen() {\n    currentPrimaryTag = 'men';\n    var data2 = JSON.parse(java.ajax('https://zh.virtualtaboo.live/api/front/models/liveTags?primaryTag=men&withMixedTags=true&sac=true'));\n    var tagGroups2 = data2.liveTagGroups || [];\n    var tagDetails2 = data2.liveTagDetails || {};\n\n    function renderMenTags(tags, title) {\n        if (!tags || !tags.length) return;\n        push('❤️ ' + title + ' ❤️', null, 1);\n        for (var i = 0; i < tags.length; i++) {\n            var tag = tags[i];\n            if (!tag) continue;\n            var count = tagDetails2[tag] ? tagDetails2[tag].modelsLive || 0 : 0;\n            push(getDisplay(tag) + (count > 0 ? count + '人' : ''), buildUrl(tag), 0.29);\n        }\n    }\n\n    function findGroup2(alias) {\n        for (var i = 0; i < tagGroups2.length; i++) {\n            if (tagGroups2[i].alias === alias) return tagGroups2[i];\n        }\n        return null;\n    }\n\n    function sortTags2(tags) {\n        tags.sort(function(a, b) {\n            var ca = tagDetails2[a] ? tagDetails2[a].modelsLive || 0 : 0;\n            var cb = tagDetails2[b] ? tagDetails2[b].modelsLive || 0 : 0;\n            return cb - ca;\n        });\n        return tags;\n    }\n\n    function renderManualMen(list, title) {\n        var valid = [];\n        for (var i = 0; i < list.length; i++) {\n            var tag = list[i];\n            if (tagDetails2[tag] && tagDetails2[tag].modelsLive > 0) valid.push(tag);\n        }\n        renderMenTags(sortTags2(valid), title);\n    }\n\n    push('👨 男主播专区 👨', null, 1);\n\n    var groupTitles2 = {\n        'specials': '🔥 特别推荐',\n        'orientation': '💖 性取向',\n        'age': '🎂 年龄',\n        'ethnicity': '🌍 人种',\n        'bodyType': '💪 体型',\n        'hairColor': '💇 发色',\n        'privatePrice': '💰 价格'\n    };\n    ['specials', 'orientation', 'age', 'ethnicity', 'bodyType', 'hairColor', 'privatePrice'].forEach(function(alias) {\n        var group = findGroup2(alias);\n        if (!group) return;\n        var valid = [];\n        var tags = group.tags || [];\n        for (var i = 0; i < tags.length; i++) {\n            var tag = tags[i];\n            if (tagDetails2[tag] && tagDetails2[tag].modelsLive > 0) valid.push(tag);\n        }\n        renderMenTags(sortTags2(valid), groupTitles2[alias]);\n    });\n\n    ['tagLanguage', 'subculture'].forEach(function(prefix) {\n        var tags = [];\n        for (var tag in tagDetails2) {\n            if (tag.indexOf(prefix) === 0 && tag.indexOf('-') === -1 && tagDetails2[tag].modelsLive > 0) tags.push(tag);\n        }\n        renderMenTags(sortTags2(tags), prefix === 'tagLanguage' ? '🌐 语言分类' : '🎭 亚文化');\n    });\n\n    var allGroup2 = findGroup2('allTags');\n    var actionTags2 = [], bodyTags2 = [], perfTags2 = [];\n    var perfKeywords = ['striptease', 'eroticDance', 'twerk', 'oilShow', 'shower', 'topless', 'flashing', 'upskirt'];\n    if (allGroup2) {\n        var allTags2 = allGroup2.tags || [];\n        for (var i = 0; i < allTags2.length; i++) {\n            var tag = allTags2[i];\n            if (!tagDetails2[tag] || tagDetails2[tag].modelsLive <= 0) continue;\n            if (tag.indexOf('do') === 0) actionTags2.push(tag);\n            else if (tag.indexOf('specific') === 0) bodyTags2.push(tag);\n            for (var k = 0; k < perfKeywords.length; k++) {\n                if (tag.indexOf(perfKeywords[k]) !== -1) { perfTags2.push(tag); break; }\n            }\n        }\n    }\n    renderMenTags(sortTags2(actionTags2), '🎬 活动分类');\n    renderMenTags(sortTags2(bodyTags2), '🔍 身体特征');\n    renderMenTags(sortTags2(perfTags2), '💃 表演类型');\n\n    renderManualMen(['doStrapon','doAnalToys','autoTagInteractiveToy','doDildoOrVibrator','fuckMachine','doNippleToys','doSexToys','autoTagKiiroo','autoTagLovense'], '📱 设备分类');\n    renderManualMen(['doSmoking','subcultureCuckold','specificsPiercing','cockRating','heels','corset','doFootFetish','specificJeans','subcultureBdsm','leather','subcultureMistresses','latex','nylon','specificsTattoos','specificPregnant','specificSportGear'], '🖤 恋物癖');\n}\n\n// ============================================================\n// trans 频道\n// ============================================================\nfunction buildTrans() {\n    currentPrimaryTag = 'trans';\n    var data3 = JSON.parse(java.ajax('https://zh.virtualtaboo.live/api/front/models/liveTags?primaryTag=trans&withMixedTags=true&sac=true'));\n    var tagGroups3 = data3.liveTagGroups || [];\n    var tagDetails3 = data3.liveTagDetails || {};\n\n    function renderTransTags(tags, title) {\n        if (!tags || !tags.length) return;\n        push('❤️ ' + title + ' ❤️', null, 1);\n        for (var i = 0; i < tags.length; i++) {\n            var tag = tags[i];\n            if (!tag) continue;\n            var count = tagDetails3[tag] ? tagDetails3[tag].modelsLive || 0 : 0;\n            push(getDisplay(tag) + (count > 0 ? count + '人' : ''), buildUrl(tag), 0.29);\n        }\n    }\n\n    function findGroup3(alias) {\n        for (var i = 0; i < tagGroups3.length; i++) {\n            if (tagGroups3[i].alias === alias) return tagGroups3[i];\n        }\n        return null;\n    }\n\n    function sortTags3(tags) {\n        tags.sort(function(a, b) {\n            var ca = tagDetails3[a] ? tagDetails3[a].modelsLive || 0 : 0;\n            var cb = tagDetails3[b] ? tagDetails3[b].modelsLive || 0 : 0;\n            return cb - ca;\n        });\n        return tags;\n    }\n\n    function renderManualTrans(list, title) {\n        var valid = [];\n        for (var i = 0; i < list.length; i++) {\n            var tag = list[i];\n            if (tagDetails3[tag] && tagDetails3[tag].modelsLive > 0) valid.push(tag);\n        }\n        renderTransTags(sortTags3(valid), title);\n    }\n\n    push('⚧️ 跨性别专区 ⚧️', null, 1);\n\n    var groupTitles3 = {\n        'specials': '🔥 特别推荐',\n        'age': '🎂 年龄',\n        'ethnicity': '🌍 人种',\n        'bodyType': '💪 体型',\n        'hairColor': '💇 发色',\n        'privatePrice': '💰 价格'\n    };\n    ['specials', 'age', 'ethnicity', 'bodyType', 'hairColor', 'privatePrice'].forEach(function(alias) {\n        var group = findGroup3(alias);\n        if (!group) return;\n        var valid = [];\n        var tags = group.tags || [];\n        for (var i = 0; i < tags.length; i++) {\n            var tag = tags[i];\n            if (tagDetails3[tag] && tagDetails3[tag].modelsLive > 0) valid.push(tag);\n        }\n        renderTransTags(sortTags3(valid), groupTitles3[alias]);\n    });\n\n    ['tagLanguage', 'subculture'].forEach(function(prefix) {\n        var tags = [];\n        for (var tag in tagDetails3) {\n            if (tag.indexOf(prefix) === 0 && tag.indexOf('-') === -1 && tagDetails3[tag].modelsLive > 0) tags.push(tag);\n        }\n        renderTransTags(sortTags3(tags), prefix === 'tagLanguage' ? '🌐 语言分类' : '🎭 亚文化');\n    });\n\n    var allGroup3 = findGroup3('allTags');\n    var actionTags3 = [], bodyTags3 = [], perfTags3 = [];\n    var perfKeywords = ['striptease', 'eroticDance', 'twerk', 'oilShow', 'shower', 'topless', 'flashing', 'upskirt'];\n    if (allGroup3) {\n        var allTags3 = allGroup3.tags || [];\n        for (var i = 0; i < allTags3.length; i++) {\n            var tag = allTags3[i];\n            if (!tagDetails3[tag] || tagDetails3[tag].modelsLive <= 0) continue;\n            if (tag.indexOf('do') === 0) actionTags3.push(tag);\n            else if (tag.indexOf('specific') === 0) bodyTags3.push(tag);\n            for (var k = 0; k < perfKeywords.length; k++) {\n                if (tag.indexOf(perfKeywords[k]) !== -1) { perfTags3.push(tag); break; }\n            }\n        }\n    }\n    renderTransTags(sortTags3(actionTags3), '🎬 活动分类');\n    renderTransTags(sortTags3(bodyTags3), '🔍 身体特征');\n    renderTransTags(sortTags3(perfTags3), '💃 表演类型');\n\n    renderManualTrans(['doStrapon','doAnalToys','autoTagInteractiveToy','doDildoOrVibrator','fuckMachine','doNippleToys','doSexToys','autoTagKiiroo','autoTagLovense'], '📱 设备分类');\n    renderManualTrans(['doSmoking','subcultureCuckold','specificsPiercing','cockRating','heels','corset','doFootFetish','specificJeans','subcultureBdsm','leather','subcultureMistresses','latex','nylon','specificsTattoos','specificPregnant','specificSportGear'], '🖤 恋物癖');\n}\n\n// ============================================================\n// 执行所有频道\n// ============================================================\nbuildCouples();\nbuildMen();\nbuildTrans();\n\nJSON.stringify(sort);", "header": "{\"User-Agent\": \"Mozilla/5.0 (Android)\"}", "lastUpdateTime": "1787711886134", "respondTime": 151, "ruleBookInfo": {"author": "{{$.user.user.name}}", "coverUrl": "https://img.doppiocdn.com/thumbs/{{$.user.user.snapshotTimestamp}}/{{$.cam.streamName}}_webp", "name": "{{$.user.user.username}}", "tocUrl": "https://zh.virtualtaboo.live/api/front/v2/broadcasts/{{$.user.user.id}}?uniq=ix9yufd20we8bscq"}, "ruleContent": [], "ruleExplore": {"bookList": "$.blocks..models[*]||$.models[*]", "bookUrl": "https://zh.virtualtaboo.live/api/front/v2/models/{{$.id}}/cam?timezoneOffset=-480&triggerRequest=loadCam&primaryTag=girls&withRecentShow=1&skipTipMenu=1&uniq=ix9yufd20we8bscq", "coverUrl": "@js:result.snapshotTimestamp && result.streamName ? 'https://img.doppiocdn.com/thumbs/' + result.snapshotTimestamp + '/' + result.streamName + '_webp' : result.snapshotUrl", "kind": "@js:var s={'public':'免费','groupShow':'付费'}[result.status]||'离线';var c=result.country?result.country.toUpperCase()+' ':'未知';c+' | '+(s)+(result.isLive?(' | '+(result.viewersCount||0)+'在看'):'')", "name": "@js:\nif (\"{{$.status}}\"==\"public\"){result=\"{{$.username}}\"}else{result=\"\"}"}, "ruleSearch": {"author": "$.streamName", "bookList": "$.models[*]", "bookUrl": "https://zh.virtualtaboo.live/api/front/v2/models/{{$.id}}/cam?timezoneOffset=-480&triggerRequest=loadCam&primaryTag=girls&withRecentShow=1&skipTipMenu=1&uniq=ix9yufd20we8bscq", "checkKeyWord": "bao", "coverUrl": "@js:try{var sn=result.streamName;var ts=result.snapshotTimestamp;if(sn&&ts){'https://img.doppiocdn.live/thumbs/'+ts+'/'+sn+'_webp'}else if(result.previewUrl){result.previewUrl}else if(result.previewUrlThumbBig){result.previewUrlThumbBig}else if(result.previewUrlThumbSmall){result.previewUrlThumbSmall}else if(result.avatarUrl){result.avatarUrl}else{''}}catch(e){''}", "intro": "$.groupShowTopic", "kind": "@js:var s={'public':'免费','groupShow':'付费'}[result.status]||'离线';var c=result.country?result.country.toUpperCase()+' ':'未知';c+' | '+s+' | '+(result.viewersCount||0)+'在看'", "name": "@js:\nif (\"{{$.status}}\"==\"public\"){result=\"{{$.username}}\"}else{result=\"\"}"}, "ruleToc": {"chapterList": "$..item", "chapterName": "@js: ( ({ 'true': '在线', 'false': '离线' }[result.isLive] || result.isLive)+({ 'public': '免费', 'groupShow': '收费', 'p2p': '一对一','off':' ' }[result.status] || result.status) )", "chapterUrl": "@js: 'https://edge-hls.doppiocdn.live/hls/'+result.modelId+'/master/'+result.modelId+'_'+({ 'public': 'auto', 'groupShow': '160p_blurred', 'p2p': '160p_blurred','off':' ' }[result.status] || result.status)+'.m3u8?pkey=bXorqTB5ZhP5FcpX'\n//卡顿就换掉上面域名"}, "searchUrl": "https://zh.virtualtaboo.live/api/front/v4/models/search/group/username?query={{key}}&limit=500&offset={{(page-1)*500}}&primaryTag=girls&uniq=", "weight": 0},{"bookSourceComment": "V0.6\n\n把书籍的目录网址（或 结尾递增 的正文网址）输入阅读APP书架上的添加网址。\n\n懂正则的可以自己修改正则来适配。", "bookSourceName": "添加-目录网址", "bookSourceType": 0, "bookSourceUrl": "添加-目录网址", "bookUrlPattern": "https?://.+", "customButton": false, "customOrder": -1, "enabled": true, "enabledCookieJar": false, "enabledExplore": false, "eventListener": false, "lastUpdateTime": "1787663738180", "respondTime": 180000, "ruleBookInfo": {"name": "title@text"}, "ruleContent": {"content": "<js>\nvar html = org.jsoup.Jsoup.parse(java.ajax(baseUrl + ',{\"webView\":true}'));\nvar hrefs = [];\nfor (var a of html.select(\"a\")) {\n    var text = a.text();\n    var href = a.attr('href');\n    if (text && href != baseUrl) {\n    \tif(/下[—一]页/.test(text)){\n    \t\tjava.put(\"下一页3\", href);\n    \t}else if(/\\d_\\d/.test(href)){\n    \t  hrefs.push(href);\n    \t}\n    }\n}\njava.put(\"下一页2\", hrefs);\nhtml.select(\"cite,a,b,button,h1,h2,h3,h4\").remove();\nvar btext = html.body().text();\njava.put(\"文本内容\", btext);\nbtext;\n</js>", "nextContentUrl": "<js>\nvar next = java.get(\"下一页3\");\nif(!next || !next.length() || next == baseUrl){\nvar nexts = java.get(\"下一页2\").split(\",\");\nvar num = baseUrl.match(/\\d_(\\d+)/);\nif(num){\n  num = '_' + (Number(num[1]) + 1);\n  for (var target of nexts) {\n   \tif(target.indexOf(num) !== -1){\n  \t\tnext = target;\n  \t\tbreak;\n\t\t}\n  }\n}else if(nexts[0].length){\n\tnext = nexts[0];\n}\nnext = next && next.length() && next != baseUrl ? next : null;\nif(!next){\nvar page = java.get(\"文本内容\").match(/第[^\\n\\d]{0,5}(\\d+)\\/(\\d+)[^\\n\\d]{0,5}页/);\nif(page){\n\tvar npage = Number(page[1])+1;\n\tvar mpage = Number(page[2]);\n\tif(npage <= mpage){\n\t\tnext = baseUrl.replace(/(_\\d+)?(\\.html|\\/)?$/, \"_\"+npage+\"$2\");\n\t}\n}\n}\n}\nnext;\n</js>", "replaceRegex": "<js>\nconst FILTER_RULES = [\n  /[^一-龟\\n]+function\\(\\)\\{[^一-龟]+/g,\n]\nfor(let reg of FILTER_RULES){\n\tresult = result.replace(reg, \"\");\n}\nresult = result.replace(/([^一-龟A-Za-z，,、\\/])[ ]+/g, `$1\n`);\nresult;\n</js>"}, "ruleExplore": [], "ruleSearch": [], "ruleToc": {"chapterList": "<js>\nvar html = org.jsoup.Jsoup.parse(java.ajax(baseUrl + ',{\"webView\":true}'));\nvar allA = html.select(\"a\");\nvar alist = [];\nfor (var a of allA) {\n    var text = a.text();\n    var href = a.attr('href');\n    if (text && /【|第.{1,9}章|章[ ：]/.test(text) && href != baseUrl) {\n        alist.push(a);\n    }\n    if (text && /下[—一]页/.test(text) && href != baseUrl) {\n        java.put(\"下一页\", href);\n    }\n}\n\nhtml.select(\"cite,a,b,button,h1,h2,h3,h4\").remove();\nvar blist = [];\nif(html.body().text().replaceAll(/[^一-龟]/, \"\").length() > 500 && alist.length < 9){\nvar reg = /([^\\d])(\\d+)(\\.html|\\/)?$/;\nif(baseUrl.match(reg)){\nvar nowUrl = baseUrl;\nvar nums = Number(source.getVariable()) || 200;\n for(var i=0;i<nums;i++){\n  blist.push({\n     href: nowUrl,\n     text: \"第\" + (i + 1) + \"章\"\n  });\n  var matchs = nowUrl.match(reg);\n  nowUrl = nowUrl.replace(reg, \"$1\") + (Number(matchs[2]) + 1) + (matchs[3] || \"\");\n}\n}\n}\nblist.length ? blist : alist.length ? alist : allA;\n</js>", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": "<js>\njava.get(\"下一页\");\n</js>"}, "weight": 0},{"bookSourceGroup": "接口破解版", "bookSourceName": "芒果书坊(接口直连)", "bookSourceType": 0, "bookSourceUrl": "https://mangguoshufang.com", "concurrentRate": "", "customOrder": 0, "enabled": true, "enabledExplore": true, "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36\"}", "lastUpdateTime": "1787659860101", "loginUrl": "", "respondTime": 180000, "ruleBookInfo": {"author": "$.author", "coverUrl": "$.cover", "intro": "$.description", "kind": "$.category", "name": "$.title"}, "ruleContent": {"content": "$.content"}, "ruleExplore": [], "ruleSearch": {"author": "$.author", "bookList": "$.data.list", "bookUrl": "https://mangguoshufang.com/wmcms/ajax/index.php?action=novel.getchapter&cid={{$.id}}&format=1", "coverUrl": "$.cover", "intro": "$.description", "kind": "$.category", "lastChapter": "", "name": "$.title", "wordCount": ""}, "ruleToc": {"chapterList": "$.data.list", "chapterName": "$.chapter_name", "chapterUrl": "https://mangguoshufang.com/wmcms/ajax/index.php?action=novel.getchapter&cid={{$.id}}&format=1"}, "searchUrl": "https://mangguoshufang.com/module/search/search.php?key={{key}}&module=novel&page={{page}}", "weight": 0},{"bookSourceComment": "by狼崽儿 //2026.8.25\n搜索比较复杂，所以速度比较慢，访问太快可能会限流，比如无法获取封面和无法翻页，继续下拉刷新等待即可", "bookSourceName": "哔哩轻小说🌟", "bookSourceType": 0, "bookSourceUrl": "https://www.bilinovel.net", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "@js:\nvar items = [];\nfunction makeWenkuPath(overrides) {\n  var cfg = ['lastupdate', '0', '0', '0', '0', '0', '0', '0', '{{page}}', '0'];\n  var keys = ['order', 'tagid', 'isfull', 'anime', 'rgroupid', 'sortid', 'typeid', 'words', 'page', 'update'];\n  for (var n = 0; n < keys.length; n++) {\n    if (overrides[keys[n]] != null) { cfg[n] = overrides[keys[n]]; }\n  }\n  return source.bookSourceUrl + '/wenku/' + cfg.join('_') + '.html';\n}\nvar page = org.jsoup.Jsoup.parse(java.ajax(source.bookSourceUrl + '/wenku/'));\nvar groups = page.select('ul#filters li.sort-li');\nvar idx = 0;\nwhile (idx < groups.size()) {\n  var grp = groups.get(idx);\n  var head = grp.select('h3.sort-li-title').first();\n  var label = head != null ? head.text() : '';\n  items.push({title: '>> ' + label + ' <<', url: '', style: {layout_flexGrow: 1, layout_flexBasisPercent: 1}});\n  var opts = grp.select('a.btn-tag.jsTag');\n  var j = 0;\n  while (j < opts.size()) {\n    var opt = opts.get(j);\n    var ov = {};\n    ov[opt.attr('data-filter-type')] = opt.attr('data-filter-value');\n    items.push({title: opt.text(), url: makeWenkuPath(ov), style: {layout_flexGrow: 1}});\n    j++;\n  }\n  idx++;\n}\nJSON.stringify(items);", "header": "{\n\"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Mobile Safari/537.36\", \n\"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8\",\n \"Accept-Language\": \"zh-CN,zh;q=0.9\",\n \"Referer\": \"https://www.bilinovel.net/\", \n\"Cookie\": \"night=0\"\n}", "lastUpdateTime": "1787657569234", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=og:novel:author]@content", "coverUrl": "meta[property=\"og:image\"]@content", "intro": "section#bookSummary content@html", "kind": ".tag-small-group em a@text&&", "lastChapter": "meta[property=og:novel:latest_chapter_name]@content", "name": "meta[property=og:novel:book_name]@content", "tocUrl": "meta[property=og:novel:read_url]@content", "wordCount": "div.book-cell p:nth-of-type(2)@text"}, "ruleContent": {"content": "#acontent@html@js:\nvar html = result;\n// 1. 将 data-src 转换为 src\nhtml = html.replace(/data-src=\"([^\"]+)\"/g, 'src=\"$1\"');\n// 2. 去掉无用的占位图 src（防止加载失败）\nhtml = html.replace(/src=\"\\/images\\/sloading\\.svg\"/g, '');\n// 3. 让隐藏的图片显示出来\nhtml = html.replace(/style=\"display:none;\"/g, '');\nhtml;", "nextContentUrl": ".mlfy_page a[href*='_']@href"}, "ruleExplore": {"author": "@js:var t=result.select('span.book-author').text();\nvar i=t.indexOf('作者');\ni>=0?t.substring(i+2):t;", "bookList": "ol.book-ol.book-ol-normal li.book-li||ol.jsBooks li.book-li", "bookUrl": "a@href", "coverUrl": ".book-cover img@data-src", "intro": "@js:var d=result.select('p.book-desc, p.book-intro');\nd.size()>0?d.first().text():'';", "kind": "@js:var t=result.select('span.tag-small-group em.tag-small');var arr=[];for(var i=0;i<t.size();i++){arr.push(t.get(i).text());}arr.join('&&');", "name": "a h4.book-title@text"}, "ruleSearch": {"author": "@js:var t=result.select('span.book-author').text();var i=t.indexOf('作者');i>=0?t.substring(i+2):t;", "bookList": "@js:\nvar doc = org.jsoup.Jsoup.parse(result);\nif (doc.select('ol.book-ol.book-ol-normal').size() > 0) {\n  java.setContent(result);\n  java.getElement('ol.book-ol.book-ol-normal li.book-li');\n} else {\n  var n = doc.select('meta[property=og:novel:book_name]');\n  var a = doc.select('meta[property=og:novel:author]');\n  var i = doc.select('meta[property=og:description]');\n  var c = doc.select('meta[property=og:image]');\n  var k = doc.select('meta[property=og:novel:category]');\n  var name = n.size() > 0 ? n.first().attr('content') : '';\n  var author = a.size() > 0 ? a.first().attr('content') : '';\n  var intro = i.size() > 0 ? i.first().attr('content') : '';\n  var cover = c.size() > 0 ? c.first().attr('content') : '';\n  var kind = k.size() > 0 ? k.first().attr('content') : '';\n  var esc = function(s) { return String(s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;'); };\n  var card = '<li class=\"book-li\"><a href=\"' + baseUrl + '\"><div class=\"book-cover\"><img data-src=\"' + esc(cover) + '\"></div><h4 class=\"book-title\">' + esc(name) + '</h4><p class=\"book-desc\">' + esc(intro) + '</p><span class=\"book-author\">作者' + esc(author) + '</span><span class=\"tag-small-group\"><em class=\"tag-small\">' + esc(kind) + '</em></span></a></li>';\n  java.setContent(card);\n  java.getElement('li.book-li');\n}", "bookUrl": "a@href", "coverUrl": "li.book-li .book-cover img@data-src", "intro": "a p.book-desc@text", "kind": ".tag-small-group .tag-small@text&&", "lastChapter": "", "name": "a h4.book-title@text"}, "ruleToc": {"chapterList": "@js:\nvar doc = org.jsoup.Jsoup.parse(result);\nvar items = doc.select('ul.volume-chapters li.chapter-li:not(.volume-cover)');\nvar arr = [];\nfor (var i = 0; i < items.size(); i++) {\nvar it = items.get(i);\nvar isVol = it.hasClass('chapter-bar');\nvar a = it.select('a').first();\nvar t = a != null ? a.text() : '';\nvar u = a != null ? a.attr('href') : '';\narr.push(JSON.stringify({title: t, url: u, isVolume: isVol}));\n}\narr;", "chapterName": "$.title", "chapterUrl": "@js:var c = JSON.parse(result);c.isVolume ? '' : c.url;", "isVolume": "$.isVolume"}, "searchUrl": "@js:\nvar u = source.bookSourceUrl;\nvar b1 = java.ajax(u + '/search.html?search_guard=js');\nvar m1 = b1 != null ? b1.match(/jieqiSearchJs=([^;]+)/) : null;\nvar jsC = m1 != null ? m1[1] : '';\nvar hs = JSON.parse(source.header);\nvar h2 = java.get(u + '/search.html?search_guard=css', hs).header('set-cookie');\nvar m2 = h2 != null ? h2.match(/jieqiSearchCss=([^;]+)/) : null;\nvar cssC = m2 != null ? m2[1] : '';\nhs.Cookie = String((hs.Cookie || '') + '; jieqiSearchJs=' + jsC + '; jieqiSearchCss=' + cssC);\nvar h3 = java.get(u + '/search.html?search_guard=redeem&r=' + new Date().getTime(), hs).header('set-cookie');\nvar m3 = h3 != null ? h3.match(/jieqiSearchTicket=([^;]+)/) : null;\nvar tk = m3 != null ? m3[1] : '';\nvar q = page == 1 ? u + '/search.html?searchkey=' + encodeURIComponent(key) : u + '/search/' + encodeURIComponent(key) + '_' + page + '.html';\nq + ',{\"headers\":{\"Cookie\":\"jieqiSearchTicket=' + tk + '\"},\"webView\":false}';", "weight": 0},{"bookSourceName": "少年小说网", "bookSourceUrl": "https://www.snxsw.com", "bookSourceType": 0, "bookSourceComment": "少年小说网 www.snxsw.com（阅读App 3.x+）。正文为qsbs.bb Base64混淆，已通过规则自动解码；章内分页自动合并。注意：搜索为POST且服务端限制同一IP每20秒一次，频繁搜索会提示限流，属正常现象。需阅读3.x版本（用到负索引与@css:语法）。", "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "header": "{\"User-Agent\": \"Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1\"}", "checkKeyWord": "九阳武神", "searchUrl": "https://www.snxsw.com/search.html?cb={{Math.random()}},{\"method\": \"POST\", \"body\": \"s={{java.encodeURI(key)}}\"}", "ruleSearch": {"bookList": "class.sort_list@tag.li", "name": "class.s2@tag.a@text", "bookUrl": "class.s2@tag.a@href", "author": "class.s5@text##^[\\s\\u00A0]+##"}, "exploreUrl": "玄幻修真::/fl/1/{{page}}/\n重生穿越::/fl/2/{{page}}/\n都市小说::/fl/3/{{page}}/\n军史小说::/fl/4/{{page}}/\n网游小说::/fl/5/{{page}}/\n科幻小说::/fl/6/{{page}}/\n灵异小说::/fl/7/{{page}}/\n言情小说::/fl/8/{{page}}/\n其他小说::/fl/9/{{page}}/", "ruleExplore": {"bookList": "class.sort_list@tag.li", "name": "class.s2@tag.a@text", "bookUrl": "class.s2@tag.a@href", "author": "class.s4@text", "kind": "class.s1@text", "lastChapter": "class.s2@tag.a@title##最新章节：##"}, "ruleBookInfo": {"name": "class.bookname@tag.h1@text", "author": "class.author@text##\\s*著$##", "kind": "class.tag@tag.span@text", "lastChapter": "class.update@tag.a@text", "intro": "@css:meta[property=og:description]@content", "coverUrl": "class.book-img@tag.img@src", "tocUrl": ""}, "ruleToc": {"chapterList": "class.chapter-list.-1@tag.a", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": "class.btn-mulu@href||class.page_num@tag.a.1@href"}, "ruleContent": {"chapterName": "id.chaptername@text##（第\\d+页）\\s*$##", "content": "<js>\nvar m = result.match(/qsbs\\.bb\\('([A-Za-z0-9+\\/=]+)'\\)/g);\nvar out = [];\nif (m) {\n  for (var i = 0; i < m.length; i++) {\n    var d = String(java.base64Decode(m[i].match(/'([^']+)'/)[1]));\n    if (d.indexOf('<p') != 0) continue;\n    var t = d.replace(/<\\/?p[^>]*>/g, '');\n    t = t.replace(/[-－]{0,3}>{0,3}\\s*少年小说网（www\\.snxsw\\.com）[^！\\n]{0,20}！/g, '');\n    t = t.replace(/\\s*-{1,3}>*\\s*$/, '');\n    if (!t) continue;\n    if (/^第[0-9零一二两三四五六七八九十百千万]+章.{0,15}$/.test(t) && !/[。！？…”\"]$/.test(t)) continue;\n    out.push(t);\n  }\n}\nout.join('\\n')\n</js>", "nextContentUrl": "<js>\nvar u = result.match(/var\\s+hhekgsv\\s*=\\s*'(\\/read\\/[^']*?_\\d+\\.html)'/);\nu ? u[1] : ''\n</js>"}, "lastUpdateTime": "1787636990749"},{"bookSourceComment": "网站的书都是用户上传，你也可去网站上传\n【技术实现】\n搜索：HTML 搜索（GET /search.php?q=）\n发现：CSS 选择器（library.php 分页）\n详情：CSS 选择器（详情页与目录同页）\n目录：CSS 选择器（chapter-chip）\n正文：CSS@html + JS 解码，反爬字符自动还原\n登录：POST 表单登录（loginUi + loginUrl，Cookie 持久化）\n\n【局限性】\n- 网站有 GOEDGE WAF 防护，必须使用移动端 UA 请求头\n- 章节以\"段\"为单位（TXT 分段），非传统章节\n- 列表页作者字段实为上传者昵称\n- 登录需在书源设置中配置邮箱和密码（切勿在公开群组分享含账号的书源）", "bookSourceGroup": "小说", "bookSourceName": "存书啦（用户自传）", "bookSourceType": 0, "bookSourceUrl": "https://www.cunshu.la", "bookUrlPattern": "https?://www\\.cunshu\\.la/read/[A-Za-z0-9+/=]+", "customButton": false, "customOrder": 48, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "最新上传::/library.php?sort=latest&page={{page}}\n最多阅读::/library.php?sort=hot&page={{page}}", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 10; SM-G975F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1787629949061", "loginUi": "[{\"name\": \"登录邮箱\", \"type\": \"text\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"name\": \"登录密码\", \"type\": \"text\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}]", "loginUrl": "function login() {\n    var info = source.getLoginInfoMap();\n    if (!info) throw new Error('请先输入邮箱和密码');\n    var email = info.get('登录邮箱');\n    var pwd = info.get('登录密码');\n    email = email == null ? '' : String(email).trim();\n    pwd = pwd == null ? '' : String(pwd);\n    if (!email || !pwd) throw new Error('请先输入邮箱和密码');\n    var url = 'https://www.cunshu.la/login.php';\n    var body = 'email=' + encodeURIComponent(email) + '&password=' + encodeURIComponent(pwd);\n    var headers = {'Content-Type': 'application/x-www-form-urlencoded'};\n    var resp = java.post(url, body, headers, 30000);\n    if (!resp) throw new Error('登录请求失败');\n    var respBody = resp.body();\n    if (!respBody) throw new Error('登录响应为空');\n    if (respBody.indexOf('邮箱或密码错误') >= 0) throw new Error('邮箱或密码错误');\n    if (respBody.indexOf('auth-form') >= 0) throw new Error('登录失败，请重试');\n}", "respondTime": 180000, "ruleBookInfo": {"author": "@js:\nvar text = result || \"\";\nvar title = \"\";\ntry { title = baseElement.select(\".ph-name\").text(); } catch(e) {}\ntext = title + \"\\n\" + text;\nvar m = text.match(/作者\\s*[：:]\\s*([^\\n\\r，。；、！？!?*（）()【】\\[\\]{}《》<>\"'\\s]{1,16})/);\nif (m) {\n  var name = m[1].replace(/[，。；、！？!?*（）()【】\\[\\]{}《》<>\"'\\s]+$/, \"\");\n  name = name.split(/简介|又名|本书|作品|作者|连载|更新|小说|全文/)[0];\n  if (name) { result = name; }\n  else { result = \"\"; }\n} else {\n  var m2 = text.match(/\\b[bB][yY]\\s*[：:]?\\s*([^\\n\\r，。；、！？!?*（）()【】\\[\\]{}《》<>\"'\\s]{1,16})/);\n  if (m2) {\n    var name2 = m2[1].replace(/[，。；、！？!?*（）()【】\\[\\]{}《》<>\"'\\s]+$/, \"\");\n    name2 = name2.split(/简介|又名|本书|作品|作者|连载|更新|小说|全文/)[0];\n    if (name2) { result = name2; }\n    else { result = \"\"; }\n  } else { result = \"\"; }\n}", "intro": ".preview-text@text", "name": ".ph-name@text"}, "ruleContent": {"content": ".chapter-text@html@js:\nvar html = result;\nhtml = html.replace(/<span class=\"kw-protect\">([\\s\\S]*?)<\\/span>/g, function(m, inner) {\n    return inner.replace(/<i class=\"cr\" data-cp=\"([0-9a-fA-F]+)\"><\\/i>/g, function(m2, cp) {\n        var code = parseInt(cp, 16);\n        if (code && !isNaN(code)) return String.fromCodePoint(code);\n        return '';\n    });\n});\nhtml = html.replace(/<br\\s*\\/?>/gi, '\\n');\nhtml = html.replace(/<[^>]+>/g, '');\nhtml = html.replace(/\\n{3,}/g, '\\n\\n');\nresult = html;", "nextContentUrl": "text.下一段@href", "title": ".chapter-title@text"}, "ruleExplore": {"bookList": ".resource-list .resource-card", "bookUrl": "@href", "name": ".rc-name@text"}, "ruleSearch": {"bookList": ".resource-card-group .resource-card", "bookUrl": ".rc-name-link@href", "name": ".rc-name@text"}, "ruleToc": {"chapterList": ".chapter-overlay-grid .chapter-chip", "chapterName": "@text", "chapterUrl": "@href"}, "searchUrl": "/search.php?q={{key}}", "weight": 0},{"bookSourceName": "福书网🌟", "bookSourceType": 0, "bookSourceUrl": "https://m.fushuw.org", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "古代架空::@js:var c='gudaijiakong';var b=source.bookSourceUrl;page==1?b+'/'+c+'/':b+'/'+c+'/index_'+(page-1)+'.html';\n现代都市::@js:var c='xiandaidushi';var b=source.bookSourceUrl;page==1?b+'/'+c+'/':b+'/'+c+'/index_'+(page-1)+'.html';\n穿越重生::@js:var c='chuanyuechongsheng';var b=source.bookSourceUrl;page==1?b+'/'+c+'/':b+'/'+c+'/index_'+(page-1)+'.html';\n玄幻灵异::@js:var c='xuanhuanlingyi';var b=source.bookSourceUrl;page==1?b+'/'+c+'/':b+'/'+c+'/index_'+(page-1)+'.html';\n推理悬疑::@js:var c='tuilixuanyi';var b=source.bookSourceUrl;page==1?b+'/'+c+'/':b+'/'+c+'/index_'+(page-1)+'.html';\n网游竞技::@js:var c='wangyoujingji';var b=source.bookSourceUrl;page==1?b+'/'+c+'/':b+'/'+c+'/index_'+(page-1)+'.html';\nBL同人::@js:var c='BLtongren';var b=source.bookSourceUrl;page==1?b+'/'+c+'/':b+'/'+c+'/index_'+(page-1)+'.html';\nGL百合::@js:var c='GLbaihe';var b=source.bookSourceUrl;page==1?b+'/'+c+'/':b+'/'+c+'/index_'+(page-1)+'.html';\n本站推荐::@js:var c='bztuijian';var b=source.bookSourceUrl;page==1?b+'/'+c+'/':b+'/'+c+'/index_'+(page-1)+'.html';\n热门排行::@js:var c='bzremen';var b=source.bookSourceUrl;page==1?b+'/'+c+'/':b+'/'+c+'/index_'+(page-1)+'.html';\n周排行榜::@js:var c='bzremenweek';var b=source.bookSourceUrl;page==1?b+'/'+c+'/':b+'/'+c+'/index_'+(page-1)+'.html';\n月排行榜::@js:var c='bzremenmonth';var b=source.bookSourceUrl;page==1?b+'/'+c+'/':b+'/'+c+'/index_'+(page-1)+'.html';", "header": "{\n    \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"\n  }", "lastUpdateTime": "1787627118194", "respondTime": 180000, "ruleBookInfo": {"author": "@js:var doc=org.jsoup.Jsoup.parse(result);var el=doc.select('td.info_text span, div.title_info_right p').first();var t=el!=null?el.text():'';t.indexOf('作者：')==0?t.substring(3):t;", "coverUrl": "div.title_info_left img@data-original", "intro": "@js:\nvar doc = org.jsoup.Jsoup.parse(result);\nvar el = doc.select('#text').first();\nvar t = el != null ? el.text() : '';\nvar a1 = t.indexOf('简介：');\nvar a2 = t.indexOf('文案：');\nvar a = a1 >= 0 && (a2 < 0 || a1 < a2) ? a1 : a2;\nvar b = t.indexOf('第1章');\nvar r = (a >= 0 && b > a) ? t.substring(a + 3, b).trim() : '';\nr.split(' 　　').join('\\n');", "name": "h1@text"}, "ruleContent": {"content": "@js:\nvar doc = org.jsoup.Jsoup.parse(result);\nvar el = doc.select('#text').first();\nvar html = el != null ? el.html() : '';\nvar i = html.indexOf('<p>第');          // ① 从本章标记开始（切掉《书名》作者：+简介整段）\nif (i >= 0) { html = html.substring(i); }\nvar k = html.indexOf('id=\"goto-pl\"');   // ② 截断页脚噪音（评论/JS/推荐/分页导航）\nif (k >= 0) { html = html.substring(0, k); }\nvar j = html.indexOf('耽美小说');       // ③ 删章末水印\nif (j >= 0) { html = html.substring(0, j); }\nhtml;"}, "ruleExplore": {"author": "@js:var s=result.select('span').get(1).text();var i=s.indexOf('作者：');i>=0?s.substring(i+3):s;", "bookList": "li.book-li", "bookUrl": "a@href", "kind": "", "name": "h4.book-title@text"}, "ruleSearch": {"author": "span[style]@text", "bookList": "@js:\nvar m = result.match(/searchid=(\\d+)/);\nif (m != null) { cookie.setCookie(source.bookSourceUrl + '/e/search/result/', m[0]); }\njava.setContent(result);\njava.getElement('h2.r');", "bookUrl": "a.l@href", "name": "a.l@text"}, "ruleToc": {"chapterList": "@js:\nvar url = baseUrl;\nvar prefix = url.substring(0, url.lastIndexOf('/') + 1);\nvar bid = url.substring(url.lastIndexOf('/') + 1, url.length - 5);\nvar b = java.ajax(url);\nvar i = b.indexOf('<b>');\nvar j = i >= 0 ? b.indexOf('</b>', i) : -1;\nvar total = (i >= 0 && j > i) ? parseInt(b.substring(i + 3, j)) : 1;\nvar list = [];\nfor (var k = 0; k < total; k++) {\n  list.push(JSON.stringify({title: '第' + (k + 1) + '页', url: k == 0 ? url : prefix + bid + '_' + k + '.html'}));\n}\nlist;", "chapterName": "$.title", "chapterUrl": "$.url"}, "searchUrl": "@js:\nvar sid = cookie.getCookie(source.bookSourceUrl + '/e/search/result/');\nvar s = sid.indexOf('searchid=') >= 0 ? sid.substring(sid.indexOf('searchid=') + 9) : '';\npage == 1 ? source.bookSourceUrl + '/e/search/index.php?searchget=1&keyboard=' + encodeURIComponent(key) + '&show=title&tempid=1&tbname=article' : source.bookSourceUrl + '/e/search/result/index.php?page=' + (page - 1) + '&searchid=' + s;", "weight": 0, "bookSourceComment": "by狼崽儿 //2026.8.25\n本书源的特点是将正文里面的简介移至详情页简介，使之更加规范清晰。"},{"bookSourceGroup": "置顶", "bookSourceName": "篱笆好文学", "bookSourceType": 0, "bookSourceUrl": "https://www.m.libahao2.com", "customOrder": 17, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "[{\"title\":\"首页\",\"url\":\"/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"玄幻魔法\",\"url\":\"/xuanhuan/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"武侠修真\",\"url\":\"/xiuzhen/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"都市言情\",\"url\":\"/dushi/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"历史军事\",\"url\":\"/lishi/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"游戏竞技\",\"url\":\"/wangyou/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"科幻灵异\",\"url\":\"/kehuan/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"女生言情\",\"url\":\"/nvpin/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},{\"title\":\"其他小说\",\"url\":\"/qita/{{page}}\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}}]", "lastUpdateTime": "1787562519136", "respondTime": 180000, "ruleBookInfo": {"author": ".book-info p:contains(作者)@text", "coverUrl": ".book-info img@src", "intro": ".book-info p:contains(简介)@text", "kind": ".book-info p:contains(类别) a@text", "lastChapter": ".book-info p:contains(最新章节) a@text", "name": ".book-info h1@text", "wordCount": ".book-info p:contains(最新更新时间)@text"}, "ruleContent": {"content": ".chapter-content@html", "nextContentUrl": ".footer-nav a:contains(下一页)@href", "replaceRegex": "##本章结束，点击继续阅读"}, "ruleExplore": {"author": "td:nth-child(4)@text", "bookList": ".latest-updates tbody tr", "bookUrl": "td:nth-child(2) a@href", "coverUrl": "td:nth-child(2) a@href@js:(match = result.match(/_(\\d+)\\//)) ? 'https://www.libahao.com/data/image/' + match[1] + '.jpg' : ''", "lastChapter": "td:nth-child(3) a@text", "name": "td:nth-child(2) a@text"}, "ruleSearch": {"author": ".book-author@text", "bookList": ".book-list a", "bookUrl": "a.0@href", "checkKeyWord": "你好", "coverUrl": "img@src", "intro": ".book-description@text", "name": ".book-title@text"}, "ruleToc": {"chapterList": "@js:var html=result;var regex=/<a[^>]*href=[\"'](\\/book\\/[^\"']+\\.html)[\"'][^>]*>([\\s\\S]*?)<\\/a>/g;var match;var out=[];var i=0;while((match=regex.exec(html))!==null){i++;var href=match[1];var title=match[2].replace(/<[^>]+>/g,'').replace(/^\\s+|\\s+$/g,'');var m=title.match(/第\\s*(\\d+)/);var n=m?m[1]:String(i);var url=href.replace(/\\/\\d+\\.html$/,'/'+n+'.html');out.push(title+'\\t'+url);}out;", "chapterName": "@js:String(result).split('\\t')[0]", "chapterUrl": "@js:String(result).split('\\t')[1]"}, "searchUrl": "https://m.libahao2.com/sou?wd={{key}}", "weight": 0},{"bookSourceGroup": "爱", "bookSourceName": "🌈pixiv小说", "bookSourceType": 0, "bookSourceUrl": "https://pixiv小说.luoyacheng.ip-ddns.com", "bookUrlPattern": "http://localhost/|https://www.pixiv.net/novel/series/\\d{3,}", "concurrentRate": "3/2000", "customButton": false, "customOrder": 144, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nlet banben=\"1.1.9\";\nvar obj = {\n\t动态: {\n\t\t\"url\": `{{\n\t\t\tif (page == 1) {\n\t\t\turl = 'https://app-api.pixiv.net/v1/novel/follow?restrict=public';\n\t\t\t} else {url = source.get('nurl');}\n\t\t\turl=gethd(url);\n\t\t\t}}`},\n\t推荐: {\n\t\t\"url\": `{{\n\t\t\tif (page == 1) {\n\t\t\turl = 'https://app-api.pixiv.net/v1/novel/recommended?include_privacy_policy=true&filter=for_android&include_ranking_novels=true';\n\t\t\t} else {url = source.get('nurl');}\n\t\t\turl=gethd(url);\n\t\t\t}}`},\n\t收藏: {\n\t\t\"url\": `{{\n\t\t\tif (page == 1) {\n\t\t\t\tlet id = source.getLoginInfoMap().get('id');\n\t\t\t\turl = 'https://app-api.pixiv.net/v1/user/bookmarks/novel?user_id='+id+'&restrict=public';\n\t\t\t} else {url = source.get('nurl');}\n\t\t\turl=gethd(url);\n\t\t\t}}`,\n\t\t\"wb\": 1},\n\t追更: {\n\t\t\"url\": `{{\n\t\t\tif (page == 1) {\n\t\t\t\turl = 'https://app-api.pixiv.net/v1/watchlist/novel';\n\t\t\t} else {url = source.get('nurl');}\n\t\t\turl=gethd(url);\n\t\t\t}}`},\n\t'ⅹⅷ': {\n\t\t\"url\": `{{\n\t\t\tif (page == 1) {\n\t\t\t\turl = 'https://app-api.pixiv.net/v1/novel/ranking?filter=for_android&mode=day_r18';\n\t\t\t} else {url = source.get('nurl');}\n\t\t\turl=gethd(url);\n\t\t\t}}`,\n\t\t\twb:1,\n\t\t\tfb:0.2},\n\t'ⅹⅷ_AI': {\n\t\t\"url\": `{{\n\t\t\tif (page == 1) {\n\t\t\t\turl = 'https://app-api.pixiv.net/v1/novel/ranking?filter=for_android&mode=week_ai_r18';\n\t\t\t} else {url = source.get('nurl');}\n\t\t\turl=gethd(url);\n\t\t\t}}`,\n\t\t\tfb:0.2},\n\t'ⅹⅷ_WK': {\n\t\t\"url\": `{{\n\t\t\tif (page == 1) {\n\t\t\t\turl = 'https://app-api.pixiv.net/v1/novel/ranking?filter=for_android&mode=week_r18';\n\t\t\t} else {url = source.get('nurl');}\n\t\t\turl=gethd(url);\n\t\t\t}}`,\n\t\t\tfb:0.2}\n\t}\n\n\nvar sort = [];\npush = (title, url, fg, wrap, fb) => sort.push({\n    \"title\": title,\n    \"url\": url,\n    \"style\": {\n      layout_flexGrow: fg || 1,\n      layout_flexBasisPercent: fb||-1,\n      layout_wrapBefore: wrap ? true : false\n     }\n  });\n\nfor (x in obj) {\npush(x, obj[x].url, obj[x].fg, obj[x].wb, obj[x].fb);\n}\nJSON.stringify(sort);", "header": "@js:\n(()=>{\n\tlet headers = gethd();\n\treturn JSON.stringify(headers);\n})();", "jsLib": "//参考自开源项目：pixez-flutter🙏\nsleep = Packages.java.lang.Thread.sleep;\nua = 'PixivAndroidApp/5.0.166 (Android 14; RMX3366)';\nappv = '5.0.166';\na_l = 'zh-CN';\n\nbiaoq = new RegExp('^(?:NTR|NTL|修仙|奇幻|后宫|纯爱|隐奸|乱伦|乱交|母女.?|母子|父女|幼女|姐弟|人妻|正太|足交|口交|肛交|丝袜|催眠|系统|原创|续写|软饭流|修罗场|规则怪谈|女性视角|性开放世界|奸尸|冰恋|.?重口)$','i');\n\nfunction timemd5(time) {\n\tvar saltStr = time + '28c1fdd170a5204386cb1313c7077b34f83e4aaf4aa829ce78c231e05b0bae2c';\n\ttry {\n\t\tvar jv = this.java || (typeof java !== 'undefined' ? java : null);\n\t\tif (jv && jv.md5Encode) return jv.md5Encode(saltStr);\n\t} catch(e) {}\n\tvar md = Packages.java.security.MessageDigest.getInstance(\"MD5\");\n\tmd.update(new Packages.java.lang.String(saltStr).getBytes(\"UTF-8\"));\n\tvar dg = md.digest();\n\tvar hx = '';\n\tfor (var di = 0; di < dg.length; di++) {\n\t\tvar bv = dg[di] & 0xFF;\n\t\thx += (bv < 16 ? '0' : '') + bv.toString(16);\n\t}\n\treturn hx;\n}\n\n\nfunction gethd(url='',ck='') {\n\tconst {java, source} = this;\nlet time = java.timeFormatUTC(Date.now(),\"yyyy-MM-dd'T'HH:mm:ss'+00:00'\",8*60*60*1000);\nlet hash = this.timemd5(time);\nlet atk = source.getLoginHeader()||'';\nif(atk) atk = String('Bearer '+atk);\nlet headers = {\n    'x-client-time': time,\n    \t'User-Agent': ua,\n    \t'accept-language': a_l,\n    \t'authorization': atk,\n    \t'app-os': 'Android',\n    \t'app-os-version': 'Android 14',\n    \t'app-version': appv,\n    'x-client-hash': hash,\n    'cookie': ''\n    \t }\nck!='' && (headers['cookie']=ck);\nurl=url.replace(\"app-api.pixiv.net\",\"210.140.139.155\");\nurl && (headers['host']='app-api.pixiv.net');\nif (url=='') return headers;\nelse if (url.startsWith('data')) return url;\nelse {\n\tdelete headers['x-client-time'];\n\tdelete headers['x-client-hash'];\n\treturn url + ',' + JSON.stringify({'headers':headers});}\n};\n\n\nfunction leng(str) {\n\tlet length = 0;\n\tconst fuhao = ',.?!:;()[]\"';\n\tconst fuhao2 = '📘';\n\tfor (let char of str) {\n\t\tif (fuhao.includes(char) ) length += 0.5;\n\t\telse if (fuhao2.includes(char) ) length += 2;\n\t\telse length += 1;\n\t\t}\n\t\treturn length;\n}\n\nfunction gethdi(url='') {\turl=url.replace(\"i.pximg.net\",\"210.140.139.133\");\nlet imgoptions = {\n  headers: {\n    'User-Agent': 'PixivIOSApp/5.8.0',\n    'accept-encoding': 'gzip, br',\n    'referer': 'https://app-api.pixiv.net/',\n    'host': 'i.pximg.net'\n    }\n  };\n  return url+','+JSON.stringify(imgoptions);\n }\n \nfunction copy(txt) {\n\tlet htm = `data:text/html;charset=utf-8,<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<style>\nbody {\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: center;\n\talign-items: center;\n\theight: 60vh;}\n</style>\n</head>\n<body>\n<textarea id=\"copyt\" rows=\"3\">${txt}</textarea>\n<br>\n<button id=\"btn1\" onclick=\"copy()\">复制</button>\n<script>\ndocument.addEventListener(\"DOMContentLoaded\", function () {\nconst textarea = document.getElementById(\"copyt\");\ntextarea.style.height = \"auto\";\ntextarea.style.height = textarea.scrollHeight + \"px\";});\nfunction copy() {\nconst cpt = document.getElementById(\"copyt\");\ncpt.select();\ndocument.execCommand(\"copy\");}\n</script>\n</body></html>`;\nthis.java.startBrowser(htm,'复制');\n\t}\n\n\nfunction lookc(lyc) {\nconst [title,uid,unm,uim,tags,caption,cdate,xh,sc,gk,sTitle,id,ugz] = lyc;\n\tlet htm = `<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<style>\ntable {\n\twidth: 100%;\n\ttable-layout: fixed;\n\ttext-align: center;\n\tmargin: 0 auto;\n\tword-break: break-all;\n\t}\ntd img {\n\twidth: 100%;\n\theight: 100%;\n\tobject-fit: contain;\n\t}\n.cap {\n\t text-align: left;\n\t text-indent: 2em;\n\t}\na {text-decoration: none;}\np {margin: 0.2em auto;}\n</style>\n</head>\n<body>\n<table border=\"1\" cellspacing=\"0\">\n<tr>\n<th colspan=\"6\">标题：<a href=\"https://www.pixiv.net/novel/show.php?id=${id}\">${title}</a></th>\n</tr>\n<tr>\n<td colspan=\"4\">\n作者：<a href=\"https://www.pixiv.net/users/${uid}\">${unm}</a>\n${ugz=='true' ? '<span style=\"font-size: 0.7em;\"> (已关注)</span>' : ''}\n</td>\n<td colspan=\"2\"><img src=\"${uim}\"></td>\n</tr>\n${sTitle!='' ? ('<tr><td colspan=\"6\">小说：《'+sTitle+'》'+'</td></tr>') : ''}\n<tr>\n<td>喜欢</td>\n<td>${xh}</td>\n<td>收藏</td>\n<td>${sc}</td>\n<td>观看</td>\n<td>${gk}</td>\n</tr>\n<tr>\n<td>时间</td>\n<td colspan=\"5\">${cdate}</td>\n</tr>\n<td>标签</td>\n<td colspan=\"5\">${tags}</td>\n</tr>\n${caption!='' ? ('<tr><td>简介</td><td class=\"cap\" colspan=\"5\">'+caption+'</td></tr>') : ''}\n</table>\n<br>\n<script>\n\n</script>\n</body></html>`;\nlet java=this.java;\njava.startBrowser(`data:text/html;base64,${java.base64Encode(htm)}`,'信息');\n}\n\nfunction gengxin(){\nconst {java, source} = this;\n\tlet url0='https://gitee.com/lyc486/yuedu2/commits/main/书源/pixiv小说/pixiv.json?browser_history=0&page=1&per=3';\n\tlet rr0=java.get(url0,{'User-Agent': 'Mozilla/5.0 (Linux; Android 14)','X-Requested-With': 'XMLHttpRequest'}).body();\n\tlet \tgxlrr = com.jayway.jsonpath.JsonPath.read(rr0, '$.list[0:3].title');\n\tlet [gxlr, gxlr2, gxlr3] = gxlrr;\n\tlet banben =   String(source.exploreUrl).match(/let banben=\"([\\d\\.]+)\"/)[1];\n\tgxlr=String(gxlr).split(/^([^\\-]+)-/);\n\tgxlr[0]=='' ? '' : gxlr=['','0',gxlr[0]];\n\tlet gxts;\n\tif (gxlr[1]>banben){gxts=['更新','0,140,186'];}\n\telse {gxts= ['导入','76,175,80'];};\n\tlet htm = `<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<style>\ntable {\n\ttext-align: center;\n\tmargin: 0 auto;\n\t}\n.ann {\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\theight: 50vh;\n\t}\nbutton {\n\tbackground-color: rgb(${gxts[1]});\n\tcolor: white;\n\tborder: none;\n\tborder-radius: 4px;\n\theight: 6vh;\n\twidth: 30vw;\n\toverflow: hidden;\n\t}\nbutton span {\n  cursor: pointer;\n  display: inline-block;\n  position: relative;\n  transition: 0.4s;\n}\nbutton span:after {\n  content: '>';\n  position: absolute;\n  opacity: 0;\n  top: 0;\n  right: 30px;\n  transition: 0.2s;\n}\nbutton:active span {\n  padding-right: 20px;\n}\nbutton:active span:after {\n  opacity: 1;\n  right: -40px;\n}\n</style>\n</head>\n<body>\n<table border=\"1\" cellspacing=\"0\">\n<th colspan=\"2\">最新日志：${gxlr[2]}</th>\n<tr>\n<td>仓库版本：${gxlr[1]}</td>\n<td>本地版本：${banben}</td>\n</tr>\n<tr>\n<td colspan=\"2\" style=\"text-align: left;\">往期日志：${gxlr2}<br>　　　　　${gxlr3}</td>\n</tr>\n</table>\n<div class=\"ann\">\n<a href=\"legado://import/importonline?src=https://github.com/Luoyacheng/yuedu/raw/main/书源/pixiv小说/pixiv.json\">\n<button><span>${gxts[0]}</span></button>\n</a>\n</div>\n<a href=\"legado://import/importonline?src=https://cdn.jsdelivr.net/gh/Luoyacheng/yuedu@main/书源/pixiv小说/pixiv.json\" style=\"font-size: 10px;\">备用链接</a>\n</body>\n</html>`;\nif(typeof this.book=='undefined'||gxts[0]=='更新') java.startBrowser(`data:text/html;base64,${java.base64Encode(htm)}`,'px更新');\r\n}\nfunction fankui(){\tthis.java.startBrowser('https://github.com/Luoyacheng/yuedu/discussions/categories/b-pixiv?discussions_q=','px反馈');\n}\n//★2026.08修复★ pixiv已把oauth迁移到Cloudflare，老的\"域名替换成210.140.139.155再POST\"会因\n//HTTP/2的SNI↔Host严格校验被nginx以421拒绝；且GFW对*.pixiv.net的SNI直接重置。\n//本函数用原始TLS套接字直连东京源站IP：不发SNI、不协商ALPN(h2)，手写HTTP/1.1报文，\n//靠Host头路由到oauth虚拟主机（该证书为Google Trust Services公共证书，系统默认信任）。\nfunction pxOauth(postBody) {\n\tconst {java} = this;\n\tlet time = java.timeFormatUTC(Date.now(),\"yyyy-MM-dd'T'HH:mm:ss'+00:00'\",8*60*60*1000);\n\tlet hash = timemd5(time);\n\tlet req = 'POST /auth/token HTTP/1.1\\r\\nHost: oauth.secure.pixiv.net\\r\\n'\n\t\t+'User-Agent: '+ua+'\\r\\n'\n\t\t+'content-type: application/x-www-form-urlencoded\\r\\n'\n\t\t+'x-client-time: '+time+'\\r\\nx-client-hash: '+hash+'\\r\\n'\n\t\t+'accept-language: '+a_l+'\\r\\napp-os: Android\\r\\napp-os-version: Android 14\\r\\napp-version: '+appv+'\\r\\n'\n\t\t+'Content-Length: '+postBody.length+'\\r\\nConnection: close\\r\\n\\r\\n'+postBody;\n\tlet sf = Packages.javax.net.ssl.SSLSocketFactory.getDefault();\n\tlet ips = ['210.140.139.155','210.140.139.152','210.140.139.158','210.140.139.161'];\n\tlet sock = null, lastErr = '';\n\tfor (let i = 0; i < ips.length; i++) {\n\t\ttry {\n\t\t\tlet addr = Packages.java.net.InetAddress.getByName(ips[i]);\n\t\t\tsock = sf.createSocket(addr, 443);\n\t\t\tsock.setSoTimeout(12000);\n\t\t\tlet os = sock.getOutputStream();\n\t\t\tos.write(new Packages.java.lang.String(req).getBytes('UTF-8'));\n\t\t\tos.flush();\n\t\t\tlet rd = new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(sock.getInputStream(),'UTF-8'));\n\t\t\tlet sb = new Packages.java.lang.StringBuilder();\n\t\t\tlet line;\n\t\t\twhile ((line = rd.readLine()) != null) { sb.append(line); sb.append('\\n'); }\n\t\t\treturn String(sb.toString());\n\t\t} catch(e) {\n\t\t\tlastErr = e;\n\t\t\ttry { if (sock != null) sock.close(); } catch(e2) {}\n\t\t}\n\t}\n\tthrow lastErr == '' ? 'oauth直连失败：无可用IP' : lastErr;\n}\n", "lastUpdateTime": "1787559674884", "loginCheckJs": "//java.toast('登录检查：'+result);\n\nif (result.code() == 400) {\n\tsource.login();\n\tsleep(500);\n\tlet url = gethd(result.url());\n\tresult = java.connect(url);\n\t}\nresult", "loginUi": "[\n    {\n        name: \"token\",\n        type: \"text\"\n    },\n    {\n        name: \"token说明\",\n        type: \"button\",\n        action: \"java.longToast(`\ntoken说明：\n填写该值后点击右上角√进行登录\n可以通过获取token按钮得到(不需要跳转app)\n阅读正式版无法支持获取token功能`);\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        name: \"获取token\",\n        type: \"button\",\n        action: \"Login()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        name: \"id\",\n        type: \"text\"\n    },\n    {\n        name: \"id说明\",\n        type: \"button\",\n        action: \"java.longToast(`\nid说明：\n登录时该值为空会自动填写该值，这是登录账号的ID（可手动更改）。\n发现页的收藏分类加载的该ID的收藏`);\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        name: \"搜索说明\",\n        type: \"button\",\n        action: \"java.longToast(`\n搜索说明：\n默认使用关键词搜索\n输入小说id号显示对应的小说\n输入“正文@许斌”搜索正文含许斌的小说\n输入“作者@69559022”搜索指定id作者的书`);\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        name: \"书名\",\n        type: \"text\"\n    },\n     {\n        name: \"↑追更该书\",\n        type: \"button\",\n        action: \"scz(3)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n     {\n        name: \"复制id\",\n        type: \"button\",\n        action: \"fuzhi(2)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n     {\n        name: \"取消追更\",\n        type: \"button\",\n        action: \"scz(30)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"章节\",\n        type: \"text\"\n    },\n    {\n        name: \"↑收藏该章\",\n        type: \"button\",\n        action: \"scz(1)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n     {\n        name: \"详情\",\n        type: \"button\",\n        action: \"caption()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n     {\n        name: \"取消收藏\",\n        type: \"button\",\n        action: \"scz(10)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"作者\",\n        type: \"text\"\n    },\n    {\n        name: \"↑关注作者\",\n        type: \"button\",\n        action: \"scz(2)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n     {\n        name: \"复制id\",\n        type: \"button\",\n        action: \"fuzhi(1)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n     {\n        name: \"取消关注\",\n        type: \"button\",\n        action: \"scz(20)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    \t{\n        name: \"📘书名标识\",\n        type: \"button\",\n        action: \"gongcun()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    \t{\n        name: \"反馈\",\n        type: \"button\",\n        action: \"fankui()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    \t{\n        name: \"版本更新\",\n        type: \"button\",\n        action: \"gengxin()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    \t{\n        name: \"🫧补充序号\",\n        type: \"button\",\n        action: \"xvhao()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"占位\",\n        type: \"button\",\n        action: \"java.longToast(`这里没有东西`);\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    \t{\n        name: \"书源介绍\",\n        type: \"button\",\n        action: \"java.startBrowser('https://luoyacheng.cloudns.ch/#P站','介绍');\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    \t{\n        name: \"＃简介标签\",\n        type: \"button\",\n        action: \"biaoqian()\",\n        \"style\": {\n            \"layout_flexGrow\": 0,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"屏蔽标签\",\n        type: \"text\"\n    }\n]", "loginUrl": "function gongcun() {\nlet gc = source.get('gc');\nif(gc!=1) {source.put('gc',1);java.toast('🟢已开启\\n书名开头会有📘符号');}\nelse {source.put('gc',0);java.toast('⚫已关闭\\n不会添加📘');}\n\t}\nfunction xvhao() {\nlet xh = source.get('xh');\nif(xh!=1) {source.put('xh',1);java.toast('🟢已开启\\n会自动补充章节名序号');}\nelse {source.put('xh',0);java.toast('⚫已关闭\\n不会补充序号');}\n\t}\nfunction biaoqian() {\nlet bq = source.get('bq');\nif(bq!=1) {source.put('bq',1);java.toast('🟢已开启\\n会在简介显示作品标签');}\nelse {source.put('bq',0);java.toast('⚫已关闭\\n不会显示简介标签');}\n\t}\n\nfunction login() {\nlet Info = source.getLoginInfoMap();\n\ntry {\nlet tk = Info.token;\nif (!tk || tk == '') throw 'TOKEN为空，请先填写';\nlet body = `client_id=MOBrBDS8blbauoSck0ZfDbtuzpyT&client_secret=lsACyCD94FhDUtGTXi3QzcFE2uU1hqtDaKeqrdwj&grant_type=refresh_token&refresh_token=${tk}&include_policy=true`;\nlet rr;\ntry {\n//★优先走免VPN直连通道\nrr = pxOauth(body);\n} catch(err) {\njava.log('px oauth直连失败，回退常规请求：'+err);\nlet time2 = java.timeFormatUTC(Date.now(),\"yyyy-MM-dd'T'HH:mm:ss'+00:00'\",8*60*60*1000);\nlet headers = {\n    'User-Agent': ua,\n    'content-type': 'application/x-www-form-urlencoded',\n    'x-client-hash': timemd5(time2),\n    'accept-language': a_l,\n    'app-version': appv,\n    'app-os-version': 'Android 6.0',\n    'x-client-time': time2,\n    'app-os': 'Android',\n    'host': 'oauth.secure.pixiv.net'\n  };\nlet url = 'https://oauth.secure.pixiv.net/auth/token';\nurl = url.replace(\"oauth.secure.pixiv.net\",\"210.140.139.155\");\nrr = String(java.post(url,body,headers).body());\n}\n//剥离HTTP响应头，仅保留JSON部分\nif (rr.indexOf('{') >= 0) rr = rr.substring(rr.indexOf('{'));\nlet atk = rr.match(/\"access_token\"[:\\s\"]+([^\"]+)/)[1];\nsource.putLoginHeader(atk);\nif (Info.id=='') {\n\tInfo.id = com.jayway.jsonpath.JsonPath.read(rr, \"$.user.id\");}\nsource.putLoginInfo(JSON.stringify(Info));\n//java.toast('\\n😆登录成功');\n} catch(err) {\n\tjava.toast('\\n💔登录失败');\n\tjava.log('px登录失败：'+err);\n  \tsleep(600);}\n}\n\nfunction scz(x) {\n\tlet headers = gethd();\n\t//let url = 'https://app-api.pixiv.net/';\n\tlet url = \"https://210.140.139.155/\";\n\tlet body,nm,tt,ttt;\n\tif (x==1) {\n\t url += 'v2/novel/bookmark/add';\n\t \tlet id = cache.get('pxid');\n\t \tif (id=='') ttt='请刷新章节';\n\t \tbody = 'novel_id='+id+'&restrict=public';\n\t \tnm = source.getLoginInfoMap().get('章节');\n\t \ttt='收藏';\n\t } else if(x==2) {\n\t \turl += 'v1/user/follow/add';\n\t \tlet uid = cache.get('pxuid');\n\t \tif (uid=='') ttt='请刷新章节或详情页';\n\t \tbody = 'user_id='+uid+'&restrict=public';\n\t \tnm = source.getLoginInfoMap().get('作者');\n\t \ttt='关注';\n\t \t} else if(x==10) {\n\t \turl += 'v1/novel/bookmark/delete';\n\t \tlet id = String(cache.get('pxid'));\n\t \tbody = id ? 'novel_id='+id : '';\n\t \tnm = source.getLoginInfoMap().get('章节');\n\t \ttt='取消收藏😅';\n\t \t} else if(x==20) {\n\t \turl += 'v1/user/follow/delete';\n\t \tlet uid = String(cache.get('pxuid'));\n\t \tbody = uid ? 'user_id='+uid : '';\n\t \tnm = source.getLoginInfoMap().get('作者');\n\t \ttt='取消关注😅';\n\t \t} else if(x==3) {\n\t \turl += 'v1/watchlist/novel/add';\n\t \tlet sid = cache.get('pxsid');\n\t \tif (sid=='') ttt='请刷新详情页';\n\t \tbody = 'series_id='+sid;\n\t \tnm = source.getLoginInfoMap().get('书名');\n\t \ttt='追更';\n\t \t} else if(x==30) {\n\t \turl += 'v1/watchlist/novel/delete';\n\t \tlet sid = String(cache.get('pxsid'));\n\t \tbody = sid ? 'series_id='+sid : '';\n\t \tnm = source.getLoginInfoMap().get('书名');\n\t \ttt='取消追更😅';\n\t \t}\n\n\ttry {\n\t\tif (ttt) {java.longToast(ttt);throw 't空';}\n\t\tif (!body) throw 'b空';\n\t\theaders['host']='app-api.pixiv.net';\n\t\tlet jg = java.post(url,body,headers).statusCode();\n\t\tif (jg!=200) throw tt+'响应码异常';\n\t\telse java.longToast(`\\n已${tt}：\\n${nm}`);\n\t\t} catch(e) {\n\t\t\tif (!ttt) java.toast(`\\n${tt}失败`);\n\t\t\tjava.log(e);}\n\t}\n\nfunction reck() {\nsource.removeLoginHeader();\ncookie.removeCookie('https://accounts.pixiv.net');\ncookie.removeCookie('https://accounts.google.com');\ncookie.removeCookie('https://api.weibo.com');\n\t}\n\nfunction Login() {\nlet rkey = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';\nlet cv='';\nfor (let i = 0; i < 128; i++) {\n\tlet ra = Math.floor(Math.random()*rkey.length);\n\tcv+=rkey.charAt(ra);}\n\nlet aly = new JavaImporter(\nPackages.cn.hutool.crypto.digest.Digester,\nPackages.cn.hutool.core.codec.Base64,\nPackages.cn.hutool.crypto.digest.DigestAlgorithm);\nwith (aly) {\n\t//转ASCII数组\n\tlet asBs =  Packages.java.lang.String(cv).getBytes(\"US-ASCII\");\n\t//创建SHA256并计算\n\tlet digester = new Digester(DigestAlgorithm.SHA256);\n\tlet hashBs = digester.digest(asBs);\n\t//Base64URL编码并移除填充\n\tvar codeChallenge  = Base64.encodeUrlSafe(hashBs);\n}\n\nlet urllg =`https://app-api.pixiv.net/web/v1/login?code_challenge=${codeChallenge}&code_challenge_method=S256&client=pixiv-android`;\nreck();\n//防止重定向错误，清书源cookie。也需要手动清内置浏览器cookie\n\nlet wbua=java.getWebViewUA().replaceAll(\"; wv| Version\\/4.0\",'')+'';\nif (/HUA\\s*WEI/i.test(wbua))\nwbua=\"Mozilla/5.0 (Linux; Android 14; RMX3366 Build/UKQ1.230924.001) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.7049.100 Mobile Safari/537.36\";\n\nlet bb=java.startBrowserAwait(urllg+`,{\n\"headers\":{\n\t\"User-Agent\": \"${wbua}\"\n\t}}`,'登录',false).body();\nlet code;\nif (bb.includes('<title>Online com')) {\nsleep(600);\njava.toast('稍等');\nlet over = java.webViewGetOverrideUrl(bb,'https://app-api.pixiv.net/','','pixiv:.*');\ncode = over.match(/code=([^&]+)/);\n}\nreck();\n\nlet token;\nif (code) {\nlet tkurl = 'https://oauth.secure.pixiv.net/auth/token';\nlet headers = gethd();\nlet body = `code_verifier=${cv}&code=${code[1]}&grant_type=authorization_code&redirect_uri=https://app-api.pixiv.net/web/v1/users/auth/pixiv/callback&client_id=MOBrBDS8blbauoSck0ZfDbtuzpyT&client_secret=lsACyCD94FhDUtGTXi3QzcFE2uU1hqtDaKeqrdwj&include_policy=true`;\nlet tkr = java.post(tkurl,body,headers);\n//java.log(tkr.body());\ntoken = tkr.body().match(/refresh_token\":\"([^\"]+)/);\n}\n\nif (token) {\nlet htm = `data:text/html;charset=utf-8,<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><style>\nh2 {\n\ttext-align: center;\n\tline-height: 6;}\ntextarea {\n\tfont-size: 12px;\n\twidth: 96%;\n\tmargin: 10px 2%;\n\tpadding: 6px;}\n.ann {\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\theight: 50vh;}\nbutton {\n\tbackground-color: rgb(76,175,80);\n\tcolor: white;\n\tborder: none;\n\tborder-radius: 4px;\n\theight: 6vh;\n\twidth: 30vw;\n\toverflow: hidden;\n\ttransition: font-size 0.3s;\n\tfont-size: 16px;}\n.an-s {\n\tfont-size: 12px;}\n.alert-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\tbackground: rgba(0, 0, 0, 0.6);\n\tdisplay: none;\n\tjustify-content: center;\n\talign-items: center;\n\tz-index: 9999;}\n/* 对话框主体 */\n.alert-box {\n\tbackground: rgb(232,234,246);\n\tpadding: 10px;\n\tborder-radius: 12px;\n\tbox-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);\n\tmin-width: 100px;\n\ttext-align: center;}\n</style></head>\n<body>\n<div class=\"alert-overlay\" id=\"alertO\">\n <div class=\"alert-box\">\n  <p>已复制到剪贴板：</p>\n  <p id=\"alertM\" style=\"font-size: 12px;\"></p>\n </div>\n</div>\n<h2>Token获取成功🥳</h2>\n<textarea readonly id=\"copyt\" rows=\"3\">${token[1]}</textarea>\n<p style=\"font-size: 12px;\">请复制粘贴到登录界面的token框，然后点击√进行登录</p>\n<div class=\"ann\">\n<button id=\"btn1\" onclick=\"copy()\">复制</button>\n</div>\n<script>\nfunction showAlert(txt, time) {\nconst overlay = document.getElementById('alertO');\nconst message = document.getElementById('alertM');\nmessage.textContent = txt;\noverlay.style.display = 'flex';\nif (time > 0) {\n\tsetTimeout(() => {\n\t\toverlay.style.display = 'none';\n\t\t}, time);\n\t}\n}\nfunction copy() {\nconst btn = document.getElementById('btn1');\nbtn.classList.add('an-s');\nconst cpt = document.getElementById(\"copyt\");\ncpt.select();\ntry {\n    const cpy = document.execCommand(\"copy\");\n    if (cpy.length<9) throw '异常';\n    showAlert(cpt.value, 1000);\n  } catch (e) {alert(\"复制失败，请手动复制\");}\nsetTimeout(() => {\n\tbtn.classList.remove('an-s');\n\t}, 450);\n}\n</script>\n</body></html>`;\n\njava.startBrowser(htm,'获取token');\njava.log(token[1]); //留一份到日志\t\n\t} else {sleep(700);java.toast('获取失败😭');}\n}\n\nfunction fuzhi(x) {\n\tif (x==1) {\n\tlet uid = cache.get('pxuid');\n\tcopy(uid);}\n\tif (x==2) {\n\tlet sid = cache.get('pxsid');\n\tcopy(sid);}\n\t}\n\nfunction caption() {\n\tlet lyc=cache.getFromMemory('pxcjj');\n\tif (lyc) lookc(lyc);\n\telse java.longToast('请刷新正文');\n\t}", "respondTime": 229699, "ruleBookInfo": {"author": "$.novel_series_detail.user.name\n<js>\nlet uid = java.get('uid');\nlet auth = result || String(book.author).replace(/[\\u200b]+/,'');\nif (uid == '') {uid = java.getString('$.novel_series_detail.user.id');}\nlet Info=source.getLoginInfoMap();\nInfo['作者'] = auth;\ncache.put('pxuid',uid);\nsource.putLoginInfo(JSON.stringify(Info));\n'\\u200b' + auth\n</js>", "canReName": "1", "init": "<js>\nvar sid = java.get('sid');\nlet i = String(book.bookUrl).includes('https:/');\nif (i) { sid = String(book.bookUrl).match(/\\d{3,}$/);}\n\ncache.deleteMemory('pxcjj'); //仅通过正文打开详情，防错\nif (sid == '🇨🇳') {\n\tlet Info=source.getLoginInfoMap();\n\tlet bkn = String(book.name);\n\tlet id = java.hexDecodeToString(result).match(/\\d+$/)[0];\n\tInfo['书名'] = '';\n\tcache.put('pxsid','');\n\tInfo['章节'] = bkn;\n\tcache.put('pxid',id);\n\tsource.putLoginInfo(JSON.stringify(Info));\n\tlet length = leng(bkn);\t\nbook.intro = (source.get('bq')==1?String(java.get('tags')).replace(/, /g,' #').replace('[','#').replace(']','\\n\\n'):'') + (length>18?('《'+book.name+'》\\n'):'') + java.get('jianjie');\n\trr='1';\n\n} else {\nlet url = 'https://app-api.pixiv.net/v2/novel/series?series_id=' + sid;\n//修正bookurl\nbook.bookUrl = `data:;base64,${java.base64Encode(url)},{\"type\":\"px\"}`;\n\ntry {\n\njg = java.connect(gethd(url));\nrr = jg.body();\nif (jg.code() == 400) {\n\tsource.login();\n\tPackages.java.lang.Thread.sleep(500);\n\trr = java.ajax(gethd(url));\n\t}\n\n} catch(err) {\n\trr={};\n\tjava.toast('详情页链接加载失败'+sid);\n\t}\n\n//设置解析结果\njava.setContent(rr);\n\n\n//更新更新时间\ntry {\nlet tm = java.getString('$.novel_series_latest_novel.create_date');\nlet d = new Date(tm);\nd = java.timeFormatUTC(d,'yy/MM/dd',8*60*60*1000);\nbook.kind = String(book.kind).replace(/\\d+\\/\\d+\\/\\d+|$/,d).replace('null','');\n} catch(err) {java.toast('详情页内容错误');}\n\n//获取书名并净化\nlet bkn = String(java.getString('$.novel_series_detail.title')).replace(/^《(.+)》$/,'$1');\nbook.name = bkn.replace(/[(（].{0,9}((?:仙侠|纯爱|后宫|萝莉).?){3,}.{0,9}[)）](?=\\s*[一-ꀀ])/,'');\n\n//java.log('┌获取书名\\n[99:99.999] └'+book.name);\n\n//获取书名失败\nif (book.name == '') {\n\t//效果，unicode转字符\n\t// let ee = JSON.stringify(JSON.parse(rr) );\n\tlet txte = java.getString('$..user_message',rr);\n\t//弹出提示，sid相应序列不存在\n\tjava.longToast('\\n未获取到书名\\n'+txte);\n\t} else {\n\t\n\t//放入书名\n\tlet Info=source.getLoginInfoMap();\n\tInfo['书名'] = book.name;\n\tcache.put('pxsid',sid);\n\tInfo['章节'] = '';\n\tcache.put('pxid','');\n\tsource.putLoginInfo(JSON.stringify(Info));\n\t\n\t//同名共存\n\tif (source.get('gc') == 1) book.name='📘'+book.name;\n\t}\n\n//补充封面链接\nif (book.coverUrl == null) {\n\tlet img = java.getString('$.novel_series_latest_novel.image_urls.large');\n\tbook.coverUrl = gethdi(img);\n\t\t\n//java.log('┌获取封面\\n[99:99.999] └'+book.coverUrl);\n}\n\n//计算书名长度\nlet length = leng(String(book.name));\n//大于18个全角字符\nif (length > 18) length= '《'+String(book.name).replace(/^📘/,'')+'》\\n';\nelse length = '';\nlet jianjie = java.getString('$.novel_series_detail.caption');\nbook.intro = (source.get('bq')==1?String(java.get('tags')).replace(/, /g,' #').replace('[','#').replace(']','\\n\\n'):'') + length + java.get('jianjie');\njava.put('jianjie',jianjie);\njava.put(\"bookr\",rr);\n}\n\nrr\n</js>", "lastChapter": "$.novel_series_latest_novel.title##[【《]?{{book.name}}[》】]?", "tocUrl": "@js:book.bookUrl", "wordCount": "$.novel_series_detail.total_character_count"}, "ruleContent": {"content": "script.0@html\n<js>\nlet rr = result.match(/novel:\\s*({.+})/)[1];\nlet id = String(chapter.url).match(/\\d+(?=$|,)/)[0];\n\nlet bin = book.durChapterIndex;\nlet cin = chapter.index;\nlet inn = cin - bin;\nif (inn==0) {\nlet rra = result.match(/authorDetails:\\s*({.+})/)[1];\n//作者信息\nlet uid = java.getString('$..userId',rra);\nlet unm = java.getString('$..userName',rra);\nlet uim = java.getString('$..url',rra);\nuim = uim.replace('i.pximg.net','pximg.hakurei.cc');\nlet ugz = java.getString('$..isFollowed',rra);\n//作品信息\nlet tags = java.getStringList('$..tags[*]',rr);\ntags = Array.from(tags).map(x => `＃${x}`).join(' ');\nlet caption = String(java.getString('$..caption',rr));\ncaption = caption ? '<p>'+caption.replace(/(?:<br \\/>)+/g, '</p><p>')+'</p>' : '';\nlet cdate = java.getString('$..cdate',rr);\nlet xh = java.getString('$..rating.like',rr);\nlet sc = java.getString('$..rating.bookmark',rr);\nlet gk = java.getString('$..rating.view',rr);\nlet title = java.getString('$.title',rr);\nlet sTitle = java.getString('$.seriesTitle',rr);\n//放入信息\ncache.putMemory('pxcjj',[title,uid,unm,uim,tags,caption,cdate,xh,sc,gk,sTitle,id,ugz]);\ncache.put('pxuid',uid);\ncache.put('pxid',id);\nlet Info=source.getLoginInfoMap();\n\nlet sid = java.get('sid');\nif (sid != '🇨🇳') {\n\tInfo['书名']=String(book.name).replace(/^📘/,'');\n\tcache.put('pxsid',sid);} else {\n\tInfo['书名']='';\n\tcache.put('pxsid','');}\n\nInfo['章节'] = chapter.title;\nInfo['作者'] = book.author.replace('\\u200b','');\n//放入UI界面\nsource.putLoginInfo(JSON.stringify(Info));\n}\n\nlet urls = java.getString('$..urls',rr);\nlet tt = String(java.getString('$.text',rr));\nlet img1 = tt.match(/\\[uploadedimage\\:\\d+\\]/g)||'';\nlet img2 = tt.match(/\\[pixivimage\\:[\\d\\-]+\\]/g)||'';\nfor (x of img1) {\n\tlet id = x.match(/\\d+/)[0];\n\tlet url = java.getString('$..'+id+'.urls.original',rr);\n\tlet re = new RegExp('\\\\[uploadedimage\\\\:'+id+'\\\\]');\n\ttt = tt.replace(re,'<img src=\"'+gethdi(url)+'\"/>');\n\t}\nfor (x of img2) {\n\tlet id = x.match(/[\\d\\-]+/)[0];\n\tlet url = java.getString('$..'+id+'..images.original',rr);\n\tif (url=='null') url = java.getString('$..'+id+'..images.medium',rr);\n\tlet re = new RegExp('\\\\[pixivimage\\\\:'+id+'\\\\]');\n\ttt = tt.replace(re,'<img src=\"'+gethdi(url)+'\"/>');\n\t}\ntt.replaceAll('[newpage]','\\n—换页符—\\n').replace(/\\[\\[jumpuri\\:(.+)\\>.+\\]\\]/,'🖇️$1🖇️')\n</js>"}, "ruleExplore": {"author": "@js:\nlet uid = java.getString('$.user.id');\njava.put('uid',uid);\njava.getString('$.user.name');", "bookList": "<js>\nif (baseUrl.startsWith('http://127.0') ) {\n\trr = [{}];\n\t} else {\nlet nurl = java.getString('$.next_url');\nif (nurl == '') {\n\tjava.toast('发现页到底了');\n\tsource.put('nurl','http://127.0.0.1');\n\t}\nelse {\n\tsource.put('nurl',nurl);\n\t}\nif (baseUrl.includes('/watchlist/novel') ) {\n\trr = java.getElement(\"$.series\");\n\t} else { rr = java.getElement(\"$.novels\");}\n\n}\nrr\n</js>", "bookUrl": "<js>\nlet id = java.getString('$.id');\nlet sid = java.getString('$.series.id');\nlet rr = 'https://app-api.pixiv.net/webview/v2/novel?id=' + id;\n\nif (baseUrl.includes('/watchlist/novel') ) {\n\tsid = id;\n\tif (source.get('gc')=='1') book.name='📘'+book.name;\n}\nelse if (sid=='') {sid='🇨🇳';}\nelse {\n\tlet jj = java.get('jianjie');\n\tjava.put('jianjie',book.name+'\\n'+jj);\n}\njava.put('sid',sid);\n`data:;base64,${java.base64Encode(rr)},{\"type\":\"px\"}`\n</js>", "coverUrl": "<js>\nif (baseUrl.includes('/watchlist/novel') ) {url = java.getString('$.url');}\nelse {url = java.getString('$.image_urls.large');}\ngethdi(url);\n</js>", "intro": "<js>\nlet jj = java.get('jianjie');\nlet rr = '\\n' + java.getString('$.caption');\nlet rs = java.htmlFormat(rr);\njava.put('jianjie',rs);\njj + rs\n</js>", "kind": "@js:\nif (baseUrl.includes('/watchlist/novel') ) {\n\trrr = '';\n\tjava.put('tags','');\n\ttm = java.getString('$.last_published_content_datetime');\n\t} else {\n\t\tlet tags=java.get('tags');\n\t\trr=String(tags).slice(1,-1).split(', ');\n\t\trrr = rr.filter(i => biaoq.test(i) );\n\t\trr.forEach(x=>{\n\t\t\tif (x=='萝莉') {\n\t\t\t\tif (!rrr.includes('幼女')) rrr.unshift(x);}\n\t\t\telse if (['熟女','淫妻'].includes(x)) {\n\t\t\t\tif (!rrr.includes('人妻')) rrr.unshift(x);}\n\t\t\telse if (['仙侠','古风','武侠'].includes(x) && !rrr.some(y=>/[修仙古风武侠]{2}/.test(y))) {\n\t\t\t\t\trrr.unshift(x);}\n\t});\n\t\ttm = java.getString('$.create_date');\n}\nlet d=new Date(tm);\nd=java.timeFormatUTC(d,'yy/MM/dd',8*60*60*1000);\n\nrrr.toString()+','+d", "name": "@js:\nresult = String(java.getString('$.title'));\nlet bookn = String(java.getString('$.series.title')).replace(/^《(.+)》$/,'$1');\nif (bookn != '') {\n\tjava.put('jianjie', '《'+bookn+'》\\n');\n\tresult = result.replace(bookn,'♸').replace(/[《【]?♸[】》]?/,'')||result;\n\t}\nresult = result.replace(/[(（].{0,9}((?:仙侠|纯爱|后宫|萝莉).?){3,}.{0,9}[)）](?=\\s*[一-ꀀ])/,'').replace(/《(.+)》/,'$1');\n\nlet tags = java.getStringList('$.tags..name');\njava.put('tags',tags);\ntags=String(tags).slice(1,-1).split(/, |\\//);\nlet bptag=source.getLoginInfoMap()['屏蔽标签']||'';\nif (bptag!='') {\n\tbptag = String(bptag).split(/[,\\|]/).map(x=>x.replace('#',''))\nfor (let char of tags)\nif (bptag.includes(char)) result=''\n}\nresult", "wordCount": "$.text_length"}, "ruleSearch": {"author": "<js>\n{{(source.ruleExplore.author).replace('@js:','')}}\n</js>", "bookList": "<js>\npage=cache.getFromMemory('pxpage');\ncache.deleteMemory('pxpage');\nif (baseUrl.startsWith('http://127.')) {rr = [{}];}\n\nelse {\nrr = java.getElement('$.novels');\nnurl = java.getString('$.next_url');\nif (rr.length<6&&page==1&&nurl!='') {\n\t//处理不触发下一页且有nurl的情况\n\tsleep(500);\n\trs = java.ajax(gethd(nurl));\n\tjava.setContent(rs)\n\trrr = java.getElement('$.novels');\n\t//合并对象函数，可直接用\n\trr.addAll(rrr);\n\tnurl = java.getString('$.next_url');\n}\n\nif (nurl == '') {\n\tjava.toast('搜索页到底了');\n\tsource.put('nurls','http://127.0.0.1');\n\t} else {source.put('nurls',nurl);}\n\n}\nrr\n</js>", "bookUrl": "<js>\nlet id = java.getString('$.id');\nlet sid = java.getString('$.series.id');\nif (sid=='') {\n\tsid='🇨🇳';\n\t} else {\n\tlet jj = java.get('jianjie');\n\tjava.put('jianjie',book.name+'\\n'+jj);\n\t}\nlet rr = 'https://app-api.pixiv.net/webview/v2/novel?id=' + id;\njava.put('sid',sid);\n`data:;base64,${java.base64Encode(rr)},{\"type\":\"px\"}`\n</js>", "coverUrl": "$.image_urls.large\n<js>\ngethdi(result);\n</js>", "intro": "<js>\nlet jj = java.get('jianjie');\nlet rr = '\\n' + java.getString('$.caption');\nlet rs = java.htmlFormat(rr);\njava.put('jianjie',rs);\njj + rs\n</js>", "kind": "<js>\n{{(source.ruleExplore.kind).replace('@js:','')}}\n</js>", "name": "<js>\n{{(source.ruleExplore.name).replace('@js:','')}}\n</js>", "wordCount": "$.text_length"}, "ruleToc": {"chapterList": "<js>\nlet sid = java.get('sid');\nif (sid == '🇨🇳') {result=[result];}\nelse {\n\ttry {\n\t\tlet url = java.hexDecodeToString(result);\n\t\t//下一页会报错，直接跳过\nlet bookr=java.get('bookr')+'';\nif (!bookr) {\n\tlet rs=java.connect(gethd(url));\n\tif (rs.code() == 400) {\n\t\tsource.login();\n\t\tsleep(500);\n\t\trs=java.connect(gethd(url));}\nbookr=rs.body();}\n\t\tjava.setContent(bookr);\n\t\tjava.put('bookr',''); //保证单目录时进行刷新\n\t\t} catch(e){}\nresult = java.getElement('$.novels');\n}\nresult\n</js>", "chapterName": "<js>\nlet sid = java.get('sid');\nif (sid == '🇨🇳') {cc=book.name;}\nelse {\nlet title = java.getString('$.title');\ntitle = String(title).replace(/[(（].{0,9}((?:仙侠|纯爱|后宫|萝莉).?){3,}.{0,9}[)）](?=\\s*[一-ꀀ])/,'');\nlet bkn=String(book.name).replace(/^📘|[。？！]+$/g,'');\n//消除后不剩字则不消除\ncc = title.replace(bkn,'♸').replace(/[《【]♸[。？！]*[】》]\\s*|♸[。？！\\s]*/,'')||title;\n\t}\nif (source.get('xh')==1) {\n\tcc='▫️'+cc;\n}\n\tcc\n</js>", "chapterUrl": "<js>\nlet sid = java.get('sid');\nif (sid == '🇨🇳') {\n\t\tuu=java.hexDecodeToString(result);\n\t\tbook.putCustomVariable('这是单贴，链接：'+uu);\n\t}\nelse {\nlet id = java.getString('$.id');\nuu='https://app-api.pixiv.net/webview/v2/novel?id=' + id;\n}\ngethd(uu);\n</js>", "formatJs": "title.replace(/^▫️(?![第序]|#?第?[\\d零一二三四五六七八九十百千]+[章回])/,'第'+index+'章 ').replace(/^▫️/,'');", "nextTocUrl": "$.next_url\n<js>\nif (result!='[]') {\nresult=gethd(result[0]);\n}else{result=[];}\nresult\n</js>", "updateTime": "$.create_date\n<js>\nif (result) {\nlet d=new Date(result);\nupt=java.timeFormatUTC(d,\"yyyy/MM/dd HH:mm\",8*60*60*1000);\n}\nelse '';\n</js>"}, "searchUrl": "<js>\nif (page == 1) {\ncache.putMemory('pxpage',page);\n\t\tif (/^\\u200b/.test(key)) {\n\t\t\tlet uid = cache.getFromMemory('pxuid');\n\t\t\tif (uid=='') java.longToast('\\n请刷新书籍');\n\t\t\telse url = 'https://app-api.pixiv.net/v1/user/novels?filter=for_android&user_id=' + uid;}\n\t\telse if (key.startsWith('作者@')) {\n\t\t\tlet uid = key.slice(3);\n\t\t\tif (!/^\\d{3,}$/.test(uid)) java.longToast('\\n请输入正确的id');\n\t\t\telse url = 'https://app-api.pixiv.net/v1/user/novels?filter=for_android&user_id='+uid;\t}\n\t\telse if (/\\d{5,}$/.test(key) ) {\n\t\t\tlet sid = key.match(/\\d+$/)[0];\n\t\t\tjava.put('sid',sid);\n\t\t\tif (key.startsWith('作者')) java.longToast('\\n请输入正确的搜索格式');\n\t\t\telse url = `data:;base64,${java.base64Encode(sid)},{\"type\":\"\"}`;}\n\t\telse if (key.startsWith('正文@')) {\n\t\t\turl = 'https://app-api.pixiv.net/v1/search/novel?filter=for_android&merge_plain_keyword_results=true&sort=date_desc&search_target=text&word='+key.slice(3);}\n\t\telse { url = 'https://app-api.pixiv.net/v1/search/novel?filter=for_android&merge_plain_keyword_results=true&word='+key;}\nsource.put('nurls','http://127.0.0.1'); //重置储存的下一页\n\n} else {url = source.get('nurls');}\ngethd(url)\n</js>", "weight": 0},{"bookSourceComment": "2.27搜索问题，去除搜索代码,{\"webView\": true}\n// /so/comic/ 会同时搜索小说和视频(源代码)，但是视频获取一直有问题就没写(没搞懂)\n//  书籍列表规则漫画优先，部分封面加载不出来(搞不懂)。\n// 发现页漫画也会加载小说，本质是和搜索一样。\n// 如果网址失效，可自行访问huangqu.top，验证后进入永久域名地址复制url到源url和发现页规则里替换掉。", "bookSourceGroup": "🔞", "bookSourceName": "Icu", "bookSourceType": 0, "bookSourceUrl": "https://ztopaq7zrz.hq555.icu:1678", "bookUrlPattern": "https://ztopaq7zrz.hq555.icu:1678", "customButton": false, "customOrder": 59, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>\njava.longToast(\"多刷新两次，如果失败可能网址失效了，可查看源注释重新获取。\");\n(function() {\n    try {\n        // 第一步：获取HTML\n        var baseUrl = \"https://ztopaq7zrz.hq555.icu:1678\";\n        var html = java.connect(baseUrl + \"/so\").getBody();\n\n        if (html.match(/easy_slider_html/) || html.match(/安全验证/)) {\n            cookie.removeCookie(source.bookSourceUrl);\n\n            java.startBrowserAwait(baseUrl, '人机验证');\n            html = java.connect(baseUrl + \"/so\").getBody();\n        };\n\n        if (!html) return '';\n\n        // 第二步：解析HTML\n        var doc = org.jsoup.Jsoup.parse(html);\n\n        // 第三步：获取标题元素\n        var titles = doc.select('.layui-tab-item-title');\n        // java.log(\"找到标题数量: \" + titles.size());\n\n        if (titles.size() < 4) {\n            //  java.log(\"标题数量不足4个\");\n            return '';\n        }\n\n        // 第四步：初始化结果数组\n        var results = [];\n\n        // 获取小说区域\n        var fictionTitle = titles.get(1);\n        var comicTitle = titles.get(2);\n        var endTitle = titles.get(3);\n\n        //  java.log(\"小说标题: \" + fictionTitle.text());\n        // java.log(\"漫画标题: \" + comicTitle.text());\n        // java.log(\"结束标题: \" + endTitle.text());\n\n        // 1. 添加\"小说\"大类\n        results.push({\n            \"title\": \"小说\",\n            \"url\": \"\",\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 1\n            }\n        });\n\n        // 提取小说子分类\n        // java.log(\"\\n=== 开始提取小说子分类 ===\");\n        var currentElement = fictionTitle.nextElementSibling();\n        var fictionCount = 0;\n\n        while (currentElement && !currentElement.equals(comicTitle)) {\n            if (currentElement.hasClass('layui-tab-item-tagContainer')) {\n                //   java.log(\"找到小说tagContainer\");\n\n                var links = currentElement.select('a');\n                //   java.log(\"小说容器中有\" + links.size() + \"个链接\");\n\n                for (var i = 0; i < links.size(); i++) {\n                    var link = links.get(i);\n\n                    // 提取名称\n                    var span = link.selectFirst('span.layui-tab-item-tagContainer-tag');\n                    var name = '';\n                    if (span) {\n                        name = span.text().trim();\n                    } else {\n                        name = link.text().trim();\n                    }\n\n                    // 提取链接（保持原始相对或绝对路径）\n                    var href = link.attr('href');\n\n                    if (name && href) {\n                        // 仅确保链接包含分页参数，不处理相对链接转换\n                        if (!href.includes(\"{{page}}\")) {\n                            href = href + \"/{{page}}\";\n                        }\n\n                        results.push({\n                            \"title\": name,\n                            \"url\": href,\n                            \"style\": {\n                                \"layout_flexGrow\": 1,\n                                \"layout_flexBasisPercent\": 0.25\n                            }\n                        });\n                        fictionCount++;\n                        //   java.log(\"添加小说子分类: \" + name + \" -> \" + href);\n                    }\n                }\n            }\n\n            currentElement = currentElement.nextElementSibling();\n        }\n\n        //  java.log(\"小说子分类数量: \" + fictionCount);\n\n        // 2. 添加\"漫画\"大类\n        results.push({\n            \"title\": \"漫画\",\n            \"url\": \"\",\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 1\n            }\n        });\n\n        // 提取漫画子分类\n        //   java.log(\"\\n=== 开始提取漫画子分类 ===\");\n        currentElement = comicTitle.nextElementSibling();\n        var comicCount = 0;\n\n        while (currentElement && !currentElement.equals(endTitle)) {\n            if (currentElement.hasClass('layui-tab-item-tagContainer')) {\n                //   java.log(\"找到漫画tagContainer\");\n\n                var links = currentElement.select('a');\n                //   java.log(\"漫画容器中有\" + links.size() + \"个链接\");\n\n                for (var i = 0; i < links.size(); i++) {\n                    var link = links.get(i);\n\n                    // 提取名称\n                    var span = link.selectFirst('span.layui-tab-item-tagContainer-tag');\n                    var name = '';\n                    if (span) {\n                        name = span.text().trim();\n                    } else {\n                        name = link.text().trim();\n                    }\n\n                    // 提取链接（保持原始相对或绝对路径）\n                    var href = link.attr('href');\n\n                    if (name && href) {\n                        // 仅确保链接包含分页参数，不处理相对链接转换\n                        if (!href.includes(\"{{page}}\")) {\n                            href = href + \"/{{page}}\";\n                        }\n\n                        results.push({\n                            \"title\": name,\n                            \"url\": href,\n                            \"style\": {\n                                \"layout_flexGrow\": 1,\n                                \"layout_flexBasisPercent\": 0.25\n                            }\n                        });\n                        comicCount++;\n                        //   java.log(\"添加漫画子分类: \" + name + \" -> \" + href);\n                    }\n                }\n            }\n\n            currentElement = currentElement.nextElementSibling();\n        }\n\n        //   java.log(\"漫画子分类数量: \" + comicCount);\n\n        // 第五步：返回JSON\n        // java.log(\"\\n最终生成的发现地址规则:\");\n        // java.log(JSON.stringify(results, null, 2));\n        return JSON.stringify(results);\n    } catch (e) {\n        return \"\" + e;\n    }\n})();\n</js>", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1787536788828", "loginCheckJs": "var src = result.body();\nif (src.match(/easy_slider_html/) || src.match(/安全验证/)) {\n    cookie.removeCookie(source.bookSourceUrl);\n    let url = result.url();\n    java.startBrowserAwait(url, \"验证\");\n    result = java.connect(url);\n}\nresult;", "respondTime": 180000, "ruleBookInfo": {"coverUrl": "{{book.coverUrl}}", "init": ".detail-box", "intro": ".m-desc.xs-show@text", "kind": "p.1@text", "lastChapter": "p.-1@text", "name": "{{book.name}}"}, "ruleContent": {"content": ".cartoon@html||id.art-content@html", "imageStyle": "FULL"}, "ruleExplore": [], "ruleSearch": {"bookList": ".layui-tab-item-novelContainer[-1]@.novel-grid@.novel-grid-item&&.layui-tab-item-novelContainer[-2]@.novel-grid@.novel-grid-item", "bookUrl": "a@href", "checkKeyWord": "绿帽", "coverUrl": "img@data-original||img@src", "kind": "<js>\nvar href = java.getString(\"a@href\");\nif (href && href.indexOf('/xs') === 0) {\n    result = '小说';\n} else if (href && href.indexOf('/comic') === 0) {\n    result = '漫画';\n} else {\n    result = '视频'; // 写不好\n}\nresult;\n</js>", "name": "p@text"}, "ruleToc": {"chapterList": "id.myList@li@a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "/so/comic/{{key}}/{{page}}", "weight": 0},{"bookSourceComment": "// 免翻稳定，部分小说内容需登录，建议登录\n// 书源地址失效后，请访问发布页获取最新地址\n\n// 国内发布页：https://www.alicesw.me/\n// 主站：https://www.alicesw.com/\n\n// ver 1.0\n// 全局调用源注释文本代码\n// eval(String(source.bookSourceComment))", "bookSourceGroup": "R18", "bookSourceName": "【自制】🌸爱丽丝书屋🌸", "bookSourceType": 0, "bookSourceUrl": "https://xn--vcsx64d.alicesw12.xyz/", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[\n    {\n        \"title\": \"🔖全局🔖\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"title\": \"原创\",\n        \"url\": \"original.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"all/order/update_time+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"all/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"all/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"🔖分类🔖\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"title\": \"科幻\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"all/id/71/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"all/id/71/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"all/id/71/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"经典\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"all/id/79/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"all/id/79/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"all/id/79/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"奇幻\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"all/id/75/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"all/id/75/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"all/id/75/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"系统\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"all/id/69/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"all/id/69/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"all/id/69/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"武侠\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"all/id/68/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"all/id/68/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"all/id/68/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"乱伦\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"all/id/65/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"all/id/65/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"all/id/65/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"都市\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"all/id/64/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"all/id/64/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"all/id/64/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"乡村\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"all/id/63/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"all/id/63/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"all/id/63/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"同人\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"all/id/73/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"all/id/73/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"all/id/73/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"玄幻\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"all/id/62/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"all/id/62/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"all/id/62/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"校园\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"all/id/61/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"all/id/61/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"all/id/61/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"穿越\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"all/id/70/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"all/id/70/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"all/id/70/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"纯爱\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"all/id/19/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"all/id/19/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"all/id/19/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"萝莉\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"all/id/48/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"all/id/48/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"all/id/48/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"言情\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"all/id/59/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"all/id/59/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"all/id/59/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    }\n]", "header": "Mozilla/5.0 (Linux; Android 15; 23049RAD8C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.7922.83 Mobile Safari/537.36", "lastUpdateTime": 1787416260344, "loginUrl": "user/user/login.html", "respondTime": 180000, "ruleBookInfo": {"author": "//div[@class='box_info']/div[@class='novel_info']/p[1]/a/text()", "coverUrl": "@js:\nvar cover = java.getString(\"//div[@class='box_intro']/div[@class='pic']/img/@src\", true);\nif(cover && /img\\/\\d+\\.webp/.test(cover)){cover = \"https://img.321cdn.com/img/01.png\"}\ncover", "intro": "@js:\nvar info = java.getString(\"//div[@class='box_info']/div[@class='novel_info']//p[not(.//a)]//text()\");\nvar intro = java.getString(\"//div[@class='jianjie']/p/text()\");\nintro+\"\\n◤-----------------------------------------------------------------◥\\n\"+info+\"\\n◣-----------------------------------------------------------------◢\\n\"", "kind": "//div[@class='box_info']/div[@class='tags_list']/a/text()", "lastChapter": "//div[@class='box_info']/table/tbody/tr[1]/td/div/p[1]/a[2]/text()", "name": "//div[@class='box_info']/div[@class='novel_title']/text()", "tocUrl": "//div[@class='book_newchap']//a[contains(text(),'查看所有章')]/@href", "wordCount": "//div[@class='box_info']/div[@class='novel_info']/p[4]/text()@js:let num = parseFloat(result.replace(/[\\n\\s　,]/g, \"\").match(/\\d+(?:\\.\\d+)?/)?.[0]) || 0;\nnum + \"万\""}, "ruleContent": {"content": "//div[contains(@class,'read-content')]/p/text()@js: (Array.isArray(result) ? result.join('') : result || '').trim() || '章节无内容，请手动检查！'", "title": "//div[@class='text-head']/h3/text()"}, "ruleExplore": {"author": "//li[@class='four']/text()", "bookList": "//div[@class='clearfix rec_rullist']/ul", "bookUrl": "//li[@class='two']/a/@href", "kind": "@js:\nvar tag  = java.getString(\"//li[@class='sev']/span/a/text()\");\nvar uptime  = java.getString(\"//li[@class='six']/text()\");\nvar views=  java.getString(\"//li[@class='diyhot']/text()\");\ntag+\",👀\"+views+\",\"+uptime", "lastChapter": "//li[@class='three']/a/text()", "name": "//li[@class='two']/a/text()", "wordCount": "//li[@class='five']/text()@js:let num = parseFloat(result.replace(/[\\n\\s　,]/g, \"\").match(/\\d+(?:\\.\\d+)?/)?.[0]) || 0;\nnum + \"万\""}, "ruleSearch": {"author": "//p[@class='mb-1 text-muted']/a/text()", "bookList": "//div[@class='list-group']/div[@class='list-group-item']", "bookUrl": "//h5/a/@href", "checkKeyWord": "朱门绣户", "intro": "//p[@class='content-txt']", "kind": "<js>\nvar status = java.getString(\"//h5/small/text()\");\nvar tags = java.getString(\"//p[@class='text-muted']/a/text()\");\nvar views = java.getString(\"//p[@class='mb-1 text-muted']//text()\").match(/\\d+?.\\d+/g)[1];\nstatus+\",👀\"+views+\",\"+tags\n</js>\n##\\[|]##", "name": "//h5/a//text()@js:result.replace(/[\\[\\]\\s]/g,\"\").replace(/\\d+\\.?|\\n/g,\"\")", "wordCount": "//p[1]/text()@js:let num = parseFloat(result.replace(/[\\n\\s　,]/g, \"\").match(/\\d+(?:\\.\\d+)?/)?.[0]) || 0;\nnum + \"万\""}, "ruleToc": {"chapterList": "//ul[@class='mulu_list']/li", "chapterName": "//a/text()", "chapterUrl": "//a/@href()"}, "searchUrl": "search.html?q={{key}}&f=_all", "weight": 0},{"bookSourceName": "138阅读网🌟", "bookSourceType": 0, "bookSourceUrl": "https://www.13txt.net/", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "header": " {\n    \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"\n  }", "lastUpdateTime": "1787502759734", "loginCheckJs": "var src = result.body();\nif (src.match(/Just a moment|Checking your browser|Performing security verification|Verifying you are human/)) {\n    cookie.removeCookie(source.bookSourceUrl);\n    var url = result.url();\n    java.startBrowserAwait(url, \"Cloudflare验证\");\n    result = java.connect(url);\n}\nresult;", "respondTime": 180000, "ruleBookInfo": {"name": "meta[property=og:novel:book_name]@content", "author": "meta[property=og:novel:author]@content", "kind": "meta[property=og:novel:category]@content", "lastChapter": "meta[property=og:novel:latest_chapter_name]@content", "coverUrl": "meta[property=og:image]@content"}, "ruleContent": {"content": "#content@html"}, "ruleExplore": {"bookList": "#newscontent ul li", "name": ".s2 a@text", "author": ".s5@text", "lastChapter": ".s3 a@text", "bookUrl": ".s2 a@href"}, "ruleSearch": {"bookList": "div.result-game-item", "name": ".result-game-item-title-link@text", "author": ".result-game-item-info-tag:nth-child(1) span:nth-child(2)@text", "kind": ".result-game-item-info-tag:nth-child(2) span:nth-child(2)@text", "intro": ".result-game-item-desc@text", "coverUrl": ".result-game-item-pic img@src", "bookUrl": ".result-game-item-title-link@href"}, "ruleToc": {"chapterList": "#list dl dd", "chapterName": "a@text", "chapterUrl": "a@href"}, "searchUrl": "/search.php?keyword={{key}}", "weight": 0, "exploreUrl": "玄幻小说::https://www.13txt.net/list/1-{{page}}.html\n修真小说::https://www.13txt.net/list/2-{{page}}.html\n都市小说::https://www.13txt.net/list/3-{{page}}.html\n穿越小说::https://www.13txt.net/list/4-{{page}}.html\n网游小说::https://www.13txt.net/list/5-{{page}}.html\n科幻小说::https://www.13txt.net/list/6-{{page}}.html\n排行榜::https://www.13txt.net/paihangbang/\n完本小说::https://www.13txt.net/wanben/{{page}}_1", "bookSourceComment": "by狼崽儿 //2026.8.24\n有CF防护，手动验证一下。部分书只有防盗章，自己分辨一下。"},{"bookSourceName": "添加-正文", "bookSourceType": 0, "bookSourceUrl": "测试", "bookUrlPattern": "https?://.+read/\\d+/?$", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": false, "eventListener": false, "lastUpdateTime": "1787479537410", "respondTime": 180000, "ruleBookInfo": {"name": "title@text"}, "ruleContent": {"content": "<js>\nvar html = org.jsoup.Jsoup.parse(java.ajax(baseUrl + ',{\"webView\":true}'));\nvar hrefs = [];\nfor (var a of html.select(\"a\")) {\n    var text = a.text();\n    var href = a.attr('href');\n    if (text && (/下[—一]页/.test(text) || /\\d_\\d/.test(href)) && href != baseUrl) {\n    \threfs.push(href)\n    }\n}\njava.put(\"下一页2\", hrefs);\nhtml.select(\"cite,a,b,button,h1,h2,h3,h4\").remove();\nvar btext = html.body().text();\nif(btext.length() < 200){\nhtml = org.jsoup.Jsoup.parse(java.ajax(baseUrl + ',{\"webView\":true}'));\n html.select(\"cite,a,b,button,h1,h2,h3,h4\").remove();\n btext = html.body().text();\n}\nbtext;\n</js>", "nextContentUrl": "<js>\nvar nexts = java.get(\"下一页2\").split(\",\");\nvar next = null;\nvar num = baseUrl.match(/_(\\d+)/);\nif(num){\n  num = '_' + (Number(num[1]) + 1);\n  for (var target of nexts) {\n   \tif(target.indexOf(num) !== -1){\n  \t\tnext = target;\n  \t\tbreak;\n\t\t}\n  }\n}else if(nexts[0].length){\n\tnext = nexts[0];\n}\nnext.length() && next != baseUrl ? next : null;\n</js>", "replaceRegex": "<js>\nconst FILTER_RULES = [\n  /[^一-龟\\n]+function\\(\\)\\{[^一-龟]+/g,\n]\nfor(let reg of FILTER_RULES){\n\tresult = result.replace(reg, \"\");\n}\nresult = result.replace(/([：～—…”。】’\\)！？])[ ]+/g, `$1\n`);\nresult;\n</js>"}, "ruleExplore": [], "ruleSearch": [], "ruleToc": {"chapterList": "<js>\nvar nowUrl = baseUrl;\nvar links = [];\nvar nums = Number(source.getVariable());\nnums = nums ? Math.max(nums,200) : 200;\nfor(var i=0;i<nums;i++){\n  links.push({\n     href: nowUrl,\n     text: \"第\" + (i + 1) + \"章\"\n  });\nnowUrl = nowUrl.replace(/\\/\\d+\\/?$/, \"/\") + (Number(nowUrl.match(/\\/(\\d+)$/)[1]) + 1);\n}\nlinks;\n</js>", "chapterName": "text", "chapterUrl": "href"}, "weight": 0},{"bookSourceComment": "笔趣阁移动版(m.lianaiya.com)\n1. 站点带WAF挑战(503+token)，已在各JS字段内联自动设置 waf_challenge Cookie（未用jsLib，规避部分版本jsLib作用域java绑定异常）\n2. 搜索接口实际需UTF-8编码(表单标注gbk无效)，站点有搜索频率限制，已设并发间隔1000ms\n3. 正文自动合并分页(_N.html)，清理广告行与页码标记\n4. 目录取「全部章节列表」节点，避免最新章节预览重复\n5. 需手机UA(PC UA会被站点屏蔽)", "bookSourceGroup": "笔趣阁", "bookSourceName": "笔趣阁·恋爱呀", "bookSourceType": 0, "bookSourceUrl": "https://m.lianaiya.com/", "bookUrlPattern": ".*m\\.lianaiya\\.com/book/.+", "concurrentRate": "1000", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:(function(){function wt(h){var m=String(h).match(/var token='([^']+)'/);return m?m[1]:null;}var host='https://m.lianaiya.com/';var h=String(java.ajax(host));var t=wt(h);if(t){try{cookie.setCookie(host,'waf_challenge='+t);}catch(e){}}return JSON.stringify([{'title':'玄幻小说','url':'https://m.lianaiya.com/xuanhuan/'},{'title':'修真小说','url':'https://m.lianaiya.com/xiuzhen/'},{'title':'都市小说','url':'https://m.lianaiya.com/dushi/'},{'title':'历史小说','url':'https://m.lianaiya.com/lishi/'},{'title':'网游小说','url':'https://m.lianaiya.com/wangyou/'},{'title':'科幻小说','url':'https://m.lianaiya.com/kehuan/'},{'title':'言情小说','url':'https://m.lianaiya.com/yanqing/'},{'title':'其他小说','url':'https://m.lianaiya.com/qita/'},{'title':'全本小说','url':'https://m.lianaiya.com/quanben/'}]);})()", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1787473575648", "respondTime": 14141, "ruleBookInfo": {"author": "[property=og:novel:author]@content", "coverUrl": "[property=og:image]@content", "intro": "[property=og:description]@content##\\s*关于[^：]{0,30}：", "kind": "[property=og:novel:category]@content", "lastChapter": "[property=og:novel:latest_chapter_name]@content", "name": "[property=og:novel:book_name]@content", "tocUrl": "@js:(function(){function wt(h){var m=String(h).match(/var token='([^']+)'/);return m?m[1]:null;}var host='https://m.lianaiya.com/';var h=String(java.ajax(host));var t=wt(h);if(t){try{cookie.setCookie(host,'waf_challenge='+t);}catch(e){}}return baseUrl;})()"}, "ruleContent": {"content": "@js:(function(){function wt(h){var m=String(h).match(/var token='([^']+)'/);return m?m[1]:null;}function wg(url){var h=String(java.ajax(url));var t2=wt(h);if(t2){try{cookie.setCookie('https://m.lianaiya.com/','waf_challenge='+t2);}catch(e){}h=String(java.ajax(url));}return h;}function pick(h){var i=h.indexOf('id=\"chaptercontent\"');if(i<0)return null;var j=h.indexOf('>',i);if(j<0)return null;var d=1,k=j+1,no,nc;while(d>0&&k<h.length){no=h.indexOf('<div',k);nc=h.indexOf('</div>',k);if(nc<0)break;if(no>=0&&no<nc){d++;k=no+4;}else{d--;k=nc+6;}}return h.substring(j+1,k-6);}function clean(s){s=String(s);s=s.replace(/^[\\s\\S]{0,150}?\\(第\\d+\\/\\d+页\\)\\s*(<br\\s*\\/?>\\s*)+/,'');s=s.replace(/一秒记住[^<]{0,80}/g,'');s=s.replace(/请勿开启浏览器阅读模式[^<]{0,60}/g,'');s=s.replace(/(<br\\s*\\/?>\\s*){3,}/g,'$1$1');return s.replace(/^\\s+|\\s+$/g,'');}function nextPage(h){if(!/getElementById\\('pb_next1'\\)\\.innerHTML\\s*=\\s*'下一页'/.test(h))return null;var o=h.match(/getElementById\\('pb_next1'\\)\\.onclick\\s*=\\s*(go_[0-9a-f]+)/);if(!o)return null;var v=h.match(new RegExp('function '+o[1]+'\\\\(\\\\)\\\\s*\\\\{\\\\s*window\\\\.location\\\\.href\\\\s*=\\\\s*(nav_[0-9a-f]+);'));if(!v)return null;var u=h.match(new RegExp('var '+v[1]+'\\\\s*=\\\\s*\\'([^\\']+)\\''));return u?u[1]:null;}var html=String(result);if(wt(html)){html=wg(baseUrl);}var first=pick(html);if(first===null)return '正文获取失败，请刷新或重新搜索';var parts=[clean(first)];var next=nextPage(html),guard=0;while(next&&/_\\d+\\.html$/.test(next)&&guard++<60){html=wg(next);var c=pick(html);if(c===null)break;parts.push(clean(c));next=nextPage(html);}return parts.join('<br><br>');})()"}, "ruleExplore": {"author": ".s4@text", "bookList": ".lis li", "bookUrl": ".s2@a@href", "kind": ".s1@text##\\[|\\]", "lastChapter": ".s3@a@text", "name": ".s2@a@text"}, "ruleSearch": {"author": ".author@text##作者：", "bookList": ".bookbox", "bookUrl": ".bookname@a@href", "checkKeyWord": "万界武尊", "coverUrl": ".bookimg@img@src", "intro": ".bookinfo@p@text##关于[^：]{0,30}：", "kind": ".cat@text##分类：", "lastChapter": ".update@a@text", "name": ".bookname@a@text"}, "ruleToc": {"chapterList": "//dt[contains(text(),'全部章节')]/following-sibling::dd", "chapterName": "a@text", "chapterUrl": "a@href"}, "searchUrl": "@js:(function(){function wt(h){var m=String(h).match(/var token='([^']+)'/);return m?m[1]:null;}var host='https://m.lianaiya.com/';var h=String(java.ajax(host));var t=wt(h);if(t){try{cookie.setCookie(host,'waf_challenge='+t);}catch(e){}}function enc(s){try{return java.urlEncode(s);}catch(ex){return encodeURIComponent(s);}}return 'https://m.lianaiya.com/sdfgsdyugfsdugf.html?s=5256649918672294880&ie=gbk&q='+enc(key);})()", "weight": 0},{"bookSourceComment": "by艳阳，双域名切换版", "bookSourceGroup": "通常书源", "bookSourceName": "夜伴书屋", "bookSourceType": 0, "bookSourceUrl": "https://38.34.172.127/", "bookUrlPattern": "https?:\\/\\/(38\\.34\\.172\\.127|www\\.yybsw\\.com)\\/.*", "customOrder": 10, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "exploreUrl": "<js>\nvar host = getServerHost();\nvar cats = [\n    {title: \"奇幻·玄幻\", url: host + \"/list/qihuan{{page}}.html\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"科幻·游戏\", url: host + \"/list/kehuan{{page}}.html\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"武侠·仙侠\", url: host + \"/list/wuxia{{page}}.html\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"女生·言情\", url: host + \"/list/yanqing{{page}}.html\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"都市·娱乐\", url: host + \"/list/dushi{{page}}.html\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"历史·军事\", url: host + \"/list/lishi{{page}}.html\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"悬疑·灵异\", url: host + \"/list/xuanyi{{page}}.html\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"耽美·纯爱\", url: host + \"/list/chunai{{page}}.html\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}},\n    {title: \"轻小说\", url: host + \"/list/lightnovel{{page}}.html\", style: {layout_flexGrow: 1, layout_flexBasisPercent: 0.25}}\n];\nJSON.stringify(cats);\n</js>", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 14; Mobile) Chrome/120.0 Safari/537.36\"}", "jsLib": "var hosts = [\n    \"https://38.34.172.127\",\n    \"https://www.yybsw.com\"\n];\n\nfunction getHosts() {\n    return hosts;\n}\n\nfunction getServerHost() {\n    var source = this.source;\n    try {\n        var config = JSON.parse(source.getVariable());\n        if (config && config[0] && config[0].host) {\n            return config[0].host;\n        }\n        return getHosts()[0];\n    } catch (e) {\n        return getHosts()[0];\n    }\n}\n\nfunction getConfig() {\n    var source = this.source;\n    try {\n        var configStr = source.getVariable();\n        if (!configStr || configStr.trim() === \"\") {\n            return { host: getHosts()[0] };\n        }\n        var config = JSON.parse(configStr);\n        if (!config || !config.join || config.length === 0) {\n            return { host: getHosts()[0] };\n        }\n        return config[0] || { host: getHosts()[0] };\n    } catch (e) {\n        return { host: getHosts()[0] };\n    }\n}\n\nfunction setConfig(key, value) {\n    var source = this.source;\n    try {\n        var config = getConfig.call(this);\n        config[key] = value;\n        source.setVariable(JSON.stringify([config]));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\n\nfunction setConfigs(obj) {\n    var source = this.source;\n    try {\n        var config = getConfig.call(this);\n        for (var k in obj) {\n            if (obj.hasOwnProperty(k)) {\n                config[k] = obj[k];\n            }\n        }\n        source.setVariable(JSON.stringify([config]));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}", "lastUpdateTime": "1787427606582", "loginUi": "[{\"name\": \"🔄 切换域名\", \"type\": \"button\", \"action\": \"sethost()\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}}, {\"name\": \"📋 查看当前域名\", \"type\": \"button\", \"action\": \"checkhost()\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}}]", "loginUrl": "this.sethost = function() {\n    try {\n        var currentHost = getConfig.call(this).host || getHosts()[0];\n        var currentIndex = getHosts().indexOf(currentHost);\n        var newIndex = (currentIndex + 1) % getHosts().length;\n        var newHost = getHosts()[newIndex];\n        setConfig.call(this, 'host', newHost);\n        java.toast(\"\\n已切换到：\\n\" + newHost + \"\\n刷新发现页生效\");\n    } catch(e) {\n        setConfig.call(this, 'host', getHosts()[0]);\n        java.toast(\"\\n已初始化：\" + getHosts()[0]);\n    }\n};\n\nthis.checkhost = function() {\n    try {\n        var currentHost = getServerHost();\n        java.toast(\"\\n当前服务器：\\n\" + currentHost);\n    } catch(e) {\n        java.toast(\"获取失败\");\n    }\n};", "respondTime": 8000, "ruleBookInfo": {"author": ".book-info .row .col-md-8.0 a@text", "coverUrl": ".book-info img@src", "intro": ".book-detail@text", "lastChapter": ".book-info .row .col-md-8.1 a@text", "tocUrl": "", "wordCount": ".book-info .row .col-md-4.0@text##状态："}, "ruleContent": {"content": "#cont-body@html", "nextContentUrl": ".pagination li a@href"}, "ruleExplore": {"bookList": ".media", "bookUrl": "h4 a@href", "coverUrl": "img@src", "name": "h4 a@text"}, "ruleSearch": {"author": "td.1@text", "bookList": ".table tbody tr", "bookUrl": "td.0 a@href", "name": "td.0 a@text##《|》"}, "ruleToc": {"chapterList": "#all-chapter .col-md-6", "chapterName": "a@text", "chapterUrl": "a@href"}, "searchUrl": "<js>\nresult = getServerHost() + \"/plus/search.php?q=\" + encodeURIComponent(key);\n</js>", "weight": 0},{"bookSourceComment": "by艳阳", "bookSourceGroup": "通常书源", "bookSourceName": "夜伴书屋", "bookSourceType": 0, "bookSourceUrl": "https://38.34.172.127/", "customOrder": 10, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "exploreUrl": "奇幻·玄幻::/list/qihuan{{page}}.html\n科幻·游戏::/list/kehuan{{page}}.html\n武侠·仙侠::/list/wuxia{{page}}.html\n女生·言情::/list/yanqing{{page}}.html\n都市·娱乐::/list/dushi{{page}}.html\n历史·军事::/list/lishi{{page}}.html\n悬疑·灵异::/list/xuanyi{{page}}.html\n耽美·纯爱::/list/chunai{{page}}.html\n轻小说::/list/lightnovel{{page}}.html", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 14; Mobile) Chrome/120.0 Safari/537.36\"}", "lastUpdateTime": "1787425102766", "respondTime": 8000, "ruleBookInfo": {"author": ".book-info .row .col-md-8.0 a@text", "coverUrl": ".book-info img@src", "intro": ".book-detail@text", "lastChapter": ".book-info .row .col-md-8.1 a@text", "tocUrl": "", "wordCount": ".book-info .row .col-md-4.0@text##状态："}, "ruleContent": {"content": "#cont-body@html", "nextContentUrl": ".pagination li a@href"}, "ruleExplore": {"bookList": ".media", "bookUrl": "h4 a@href", "coverUrl": "img@src", "name": "h4 a@text"}, "ruleSearch": {"author": "td.1@text", "bookList": ".table tbody tr", "bookUrl": "td.0 a@href", "name": "td.0 a@text##《|》"}, "ruleToc": {"chapterList": "#all-chapter .col-md-6", "chapterName": "a@text", "chapterUrl": "a@href"}, "searchUrl": "/plus/search.php?q={{key}}"},{"bookSourceComment": "", "bookSourceGroup": "3第三批小说", "bookSourceName": "爱下电子（优）", "bookSourceType": 0, "bookSourceUrl": "https://ixdzs8.com", "customOrder": 196, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "玄幻::/sort/1/index-0-0-1-{{page}}.html\n武侠::/sort/10/index-0-0-1-{{page}}.html\n修真::/sort/2/index-0-0-1-{{page}}.html\n修真::/sort/3/index-0-0-1-{{page}}.html\n灵异::/sort/6/index-0-0-1-{{page}}.html\n日榜::/hot/day/?page={{page}}\n周榜::/hot/month/?page={{page}}\n总榜::/hot/?page={{page}}", "lastUpdateTime": "1787417507593", "respondTime": 19797, "ruleBookInfo": {"downloadUrls": ".btn-solid@tag.a@href", "intro": "爱下电子书\n书名:《{{@class.n-text[0]@tag.h1@text}}》\n作者:{{@class.bauthor[0]@text}}\n{{@class.trend@text}}\n简介:{{@id.intro@text## 　　##\n}}", "kind": ".tags@tag.a@text"}, "ruleContent": {"content": "@js:\nvar m = src.match(/token\\s*=\\s*\\x22([^\\x22]+)\\x22/);\nvar token = m != null ? m[1] : '';\nvar tourl = baseUrl + '?challenge=' + encodeURIComponent(token);\nvar sm = java.ajax(tourl).match(/<section>\\s*((?:<p>.*?<\\/p>\\s*)+)(.*?)\\s*<\\/section>/i);\nvar sectionHtml = sm != null ? sm[1] : '';\nvar text = sectionHtml.replace(new RegExp('<\\/?p>', 'g'), '\\n').trim();\ntext;"}, "ruleExplore": [], "ruleSearch": {"author": ".bauthor@tag.a@text", "bookList": ".u-list@tag.li", "bookUrl": "a@href", "checkKeyWord": "洪荒之龙族称霸", "coverUrl": "img@src\n@js:\nif (result == \"https://img22.ixdzs.com/nopic2.jpg\"){\n\tnull;\n\t}else{result}", "intro": ".l-p2@text", "kind": ".lz@text", "lastChapter": ".l-chapter@text", "name": "a@title", "wordCount": ".size@text"}, "ruleToc": {"chapterList": "@js:\nvar bid = baseUrl.match(/read\\/(\\d+)/)[1];\nvar resp = java.post(source.getKey()+\"/novel/clist/\",\"bid=\"+bid,{});\nvar json = JSON.parse(resp.body()).data;\nvar page = 0;\nvar n = \"\";\nfor(var i=json.length - 1; i >= 0; i--){\n\tif(json[i].ctype === \"1\"){\n\t\tn = json[i].title;\n\t\tjson.splice(i, 1);\n\t\tcontinue;\n\t\t}\n\tpage = json[i][\"ordernum\"];\n\tjson[i][\"url\"] = source.getKey() + \"/read/\" + bid + \"/p\" + page + \".html\";\n\tjson[i][\"n\"] = n;\n\t}\njson;", "chapterName": "title", "chapterUrl": "url", "updateTime": "n"}, "searchUrl": "/bsearch?q={{key}}&page={{page}}", "weight": 0},{"bookSourceName": "白鹿书院", "bookSourceType": 0, "bookSourceUrl": "https://s.bailushuyuan.org", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "header": "{  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 8.1.0; JKM-AL00b Build/HUAWEIJKM-AL00b; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044807 Mobile Safari/537.36\"}", "lastUpdateTime": "1787416195129", "loginUrl": "https://s.bailushuyuan.org", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property=\"og:book:author\"]@content", "coverUrl": "@js:\nvar doc = org.jsoup.Jsoup.parse(result);\nvar img = doc.select('main img[alt$=小说封面]').first();\nif (img == null) { img = doc.select('main img[alt$=照片]').first(); }\nimg ? ('https://s.bailushuyuan.org' + img.attr('src')) : ''", "intro": "@js:\nvar doc = org.jsoup.Jsoup.parse(result);\nvar all = doc.getAllElements();\nvar ol = doc.select('ol.text-body-tertiary').first();\nvar olIdx = (ol != null) ? all.indexOf(ol) : -1;\nvar ps = doc.select('p.mb-2');\nvar txt = [];\nfor (var j = 0; j < ps.size(); j++) {\n  var pi = all.indexOf(ps.get(j));\n  if (olIdx < 0 || pi < olIdx) { txt.push(ps.get(j).text()); }\n}\ntxt.join('\\n');", "kind": "@js:var doc=org.jsoup.Jsoup.parse(result);\nvar p=doc.select('p.mb-2').first();\nvar a=p?p.select('a').last():null;\na?a.text():''", "name": "h1@text"}, "ruleContent": {"content": "@js:\nvar doc = org.jsoup.Jsoup.parse(result);\nvar el = doc.select('#chaptersShowContent').first();\nvar h1 = doc.select('h1').first();\nel ? el.html() : ('请在此书源重新搜索' + (h1 ? h1.text() : '该作品'));"}, "ruleExplore": {"bookList": "main div.row.gx-1.gy-3.mb-3.text-center a", "name": "div.text-truncate@text", "bookUrl": "@js:var href=result.attr('href');var t=result.attr('title');\nvar u='https://s.bailushuyuan.org'+href;var ru=u;\nif(!t){try{var b=java.ajax(u);var j=b.indexOf('<a title=');\nif(j>=0){var k=b.indexOf('href=',j);if(k>=0){var q=b.charAt(k+5);\nvar k2=b.indexOf(q,k+6);\nif(k2>k){ru='https://s.bailushuyuan.org'+b.substring(k+6,k2);\n}}}}catch(e){}}t?u:ru"}, "ruleSearch": {"bookList": "main div.row.gx-1.gy-3.mb-3.text-center a", "bookUrl": "@js:var href=result.attr('href');var t=result.attr('title');\nvar u='https://s.bailushuyuan.org'+href;var ru=u;\nif(!t){try{var b=java.ajax(u);var j=b.indexOf('<a title=');\nif(j>=0){var k=b.indexOf('href=',j);if(k>=0){var q=b.charAt(k+5);\nvar k2=b.indexOf(q,k+6);\nif(k2>k){ru='https://s.bailushuyuan.org'+b.substring(k+6,k2);\n}}}}catch(e){}}t?u:ru", "checkKeyWord": "犬与鬼", "name": "div.text-truncate@text"}, "ruleToc": {"chapterList": "@js:\nvar doc = org.jsoup.Jsoup.parse(result);\nvar ols = doc.select('ol.text-body-tertiary li a');\nvar mainAs = doc.select('main a[title]');\nvar list = [];\nif (ols.size() > 0) {\n  for (var i = 0; i < ols.size(); i++) {\n    list.push(JSON.stringify({title: ols.get(i).text(), url: 'https://s.bailushuyuan.org' + ols.get(i).attr('href')}));\n  }\n} else {\n  for (var j = 0; j < mainAs.size(); j++) {\n    list.push(JSON.stringify({title: mainAs.get(j).attr('title'), url: 'https://s.bailushuyuan.org' + mainAs.get(j).attr('href')}));\n  }\n}\nlist;", "chapterName": "$.title", "chapterUrl": "$.url"}, "searchUrl": "@js:\nvar any = '';\nvar exact = '';\nvar enc = encodeURIComponent(key);\nfor (var i = 1; i <= 9; i++) {\n  var u = 'https://s.bailushuyuan.org/novel/traditional/categories/' + i + '?name_cont=' + enc;\n  try {\n    var body = java.ajax(u);\n    if (body.indexOf('row gx-1 gy-3 mb-3 text-center') !== -1) {\n      if (!any) { any = u; }\n      if (body.indexOf('href=\"/' + enc + '\"') !== -1) { exact = u; break; }\n    }\n  } catch(e) {}\n}\nexact || any || ('https://s.bailushuyuan.org/novel/traditional/categories/1?name_cont=' + enc);", "weight": 0, "bookSourceComment": "by狼崽儿  //2026.8.23\n这个网站分别在不同的分类装了搜索页，所以搜索时是一条一条地试。为了避免停留在错误的搜索url里，尽可能搜作品全名。", "exploreUrl": "言情小说::https://s.bailushuyuan.org/言情小说\n武侠小说::https://s.bailushuyuan.org/武侠小说\n现代小说::https://s.bailushuyuan.org/现代小说\n外国小说::https://s.bailushuyuan.org/外国小说\n侦探小说::https://s.bailushuyuan.org/侦探小说\n科幻小说::https://s.bailushuyuan.org/科幻小说\n古典小说::https://s.bailushuyuan.org/古典小说\n军事小说::https://s.bailushuyuan.org/军事小说\n纪实小说::https://s.bailushuyuan.org/纪实小说"},{"bookSourceComment": "// 免翻稳定，部分小说内容需登录，推荐登录使用\n// 书源地址失效后，请访问发布页获取最新地址\n\n// 国内发布页：https://www.alicesw.me/\n// 主站：https://www.alicesw.com/\n\n// ver 1.0\n// 全局调用源注释文本代码\n// eval(String(source.bookSourceComment))", "bookSourceGroup": "R18", "bookSourceName": "【自制】🌸爱丽丝书屋🌸", "bookSourceType": 0, "bookSourceUrl": "https://xn--vcsx64d.alicesw12.xyz/", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[\n    {\n        \"title\": \"🔖全局🔖\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"title\": \"原创\",\n        \"url\": \"{{source.bookSourceUrl}}original.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/order/update_time+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"🔖分类🔖\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"title\": \"科幻\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/71/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/71/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/71/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"经典\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/79/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/79/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/79/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"奇幻\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/75/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/75/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/75/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"系统\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/69/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/69/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/69/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"武侠\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/68/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/68/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/68/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"乱伦\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/65/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/65/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/65/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"都市\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/64/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/64/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/64/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"乡村\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/63/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/63/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/63/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"同人\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/73/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/73/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/73/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"玄幻\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/62/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/62/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/62/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"校园\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/61/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/61/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/61/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"穿越\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/70/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/70/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/70/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"纯爱\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/19/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/19/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/19/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"萝莉\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/48/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/48/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/48/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"言情\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/59/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/59/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/59/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    }\n]", "header": "Mozilla/5.0 (Linux; Android 15; 23049RAD8C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.7922.83 Mobile Safari/537.36", "lastUpdateTime": 1787402808704, "loginUrl": "{{source.bookSourceUrl}}user/user/login.html", "respondTime": 180000, "ruleBookInfo": {"author": "//div[@class='box_info']/div[@class='novel_info']/p[1]/a/text()", "coverUrl": "@js:\nvar cover = java.getString(\"//div[@class='box_intro']/div[@class='pic']/img/@src\", true);\nif(cover && /img\\/\\d+\\.webp/.test(cover)){cover = \"https://img.321cdn.com/img/01.png\"}\ncover", "intro": "@js:\nvar info = java.getString(\"//div[@class='box_info']/div[@class='novel_info']//p[not(.//a)]//text()\");\nvar intro = java.getString(\"//div[@class='jianjie']/p/text()\");\nintro+\"\\n◤-----------------------------------------------------------------◥\\n\"+info+\"\\n◣-----------------------------------------------------------------◢\\n\"", "kind": "//div[@class='box_info']/div[@class='tags_list']/a/text()", "lastChapter": "//div[@class='box_info']/table/tbody/tr[1]/td/div/p[1]/a[2]/text()", "name": "//div[@class='box_info']/div[@class='novel_title']/text()", "tocUrl": "//div[@class='book_newchap']//a[contains(text(),'查看所有章')]/@href", "wordCount": "//div[@class='box_info']/div[@class='novel_info']/p[4]/text()@js:let num = parseFloat(result.replace(/[\\n\\s　,]/g, \"\").match(/\\d+(?:\\.\\d+)?/)?.[0]) || 0;\nnum + \"万\""}, "ruleContent": {"content": "//div[contains(@class,'read-content')]/p/text()@js: (Array.isArray(result) ? result.join('') : result || '').trim() || '章节无内容，请手动检查！'", "title": "//div[@class='text-head']/h3/text()"}, "ruleExplore": {"author": "//li[@class='four']/text()", "bookList": "//div[@class='clearfix rec_rullist']/ul", "bookUrl": "//li[@class='two']/a/@href", "kind": "@js:\nvar tag  = java.getString(\"//li[@class='sev']/span/a/text()\");\nvar uptime  = java.getString(\"//li[@class='six']/text()\");\nvar views=  java.getString(\"//li[@class='diyhot']/text()\");\ntag+\",👀\"+views+\",\"+uptime", "lastChapter": "//li[@class='three']/a/text()", "name": "//li[@class='two']/a/text()", "wordCount": "//li[@class='five']/text()@js:let num = parseFloat(result.replace(/[\\n\\s　,]/g, \"\").match(/\\d+(?:\\.\\d+)?/)?.[0]) || 0;\nnum + \"万\""}, "ruleSearch": {"author": "//p[@class='mb-1 text-muted']/a/text()", "bookList": "//div[@class='list-group']/div[@class='list-group-item']", "bookUrl": "//h5/a/@href", "checkKeyWord": "姐妹嫂母", "intro": "//p[@class='content-txt']", "kind": "<js>\nvar status = java.getString(\"//h5/small/text()\");\nvar tags = java.getString(\"//p[@class='text-muted']/a/text()\");\nvar views = java.getString(\"//p[@class='mb-1 text-muted']//text()\").match(/\\d+?.\\d+/g)[1];\nstatus+\",👀\"+views+\",\"+tags\n</js>\n##\\[|]##", "name": "//h5/a//text()@js:result.replace(/[\\[\\]\\s]/g,\"\").replace(/\\d+\\.?|\\n/g,\"\")", "wordCount": "//p[1]/text()@js:let num = parseFloat(result.replace(/[\\n\\s　,]/g, \"\").match(/\\d+(?:\\.\\d+)?/)?.[0]) || 0;\nnum + \"万\""}, "ruleToc": {"chapterList": "//ul[@class='mulu_list']/li", "chapterName": "//a/text()", "chapterUrl": "//a/@href()"}, "searchUrl": "{{source.bookSourceUrl}}search.html?q={{key}}&f=_all", "weight": 0},{"bookSourceComment": "// 免翻稳定，部分小说内容需登录，推荐登录使用\n// 书源地址失效后，请访问发布页获取最新地址\n\n// 国内发布页：https://www.alicesw.me/\n// 主站：https://www.alicesw.com/\n\n// ver 1.0\n// 全局调用源注释文本代码\n// eval(String(source.bookSourceComment))", "bookSourceGroup": "R18", "bookSourceName": "【自制】🌸爱丽丝书屋🌸", "bookSourceType": 0, "bookSourceUrl": "https://xn--vcsx64d.alicesw12.xyz/", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[\n    {\n        \"title\": \"🔖全局🔖\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"title\": \"原创\",\n        \"url\": \"{{source.bookSourceUrl}}original.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/order/update_time+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"🔖分类🔖\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"title\": \"科幻\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/71/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/71/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/71/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"经典\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/79/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/79/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/79/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"奇幻\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/75/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/75/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/75/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"系统\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/69/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/69/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/69/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"武侠\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/68/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/68/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/68/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"乱伦\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/65/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/65/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/65/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"都市\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/64/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/64/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/64/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"乡村\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/63/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/63/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/63/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"同人\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/73/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/73/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/73/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"玄幻\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/62/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/62/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/62/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"校园\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/61/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/61/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/61/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"穿越\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/70/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/70/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/70/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"纯爱\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/19/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/19/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/19/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"萝莉\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/48/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/48/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/48/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"言情\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/59/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/59/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/59/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    }\n]", "header": "Mozilla/5.0 (Linux; Android 15; 23049RAD8C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.7922.83 Mobile Safari/537.36", "lastUpdateTime": 1787401762221, "loginUrl": "{{source.bookSourceUrl}}user/user/login.html", "respondTime": 180000, "ruleBookInfo": {"author": "//div[@class='box_info']/div[@class='novel_info']/p[1]/a/text()", "coverUrl": "@js:\nvar cover = java.getString(\"//div[@class='box_intro']/div[@class='pic']/img/@src\", true);\nif(cover && /img\\/\\d+\\.webp/.test(cover)){cover = \"https://img.321cdn.com/img/01.png\"}\ncover", "intro": "@js:\nvar info = java.getString(\"//div[@class='box_info']/div[@class='novel_info']//p[not(.//a)]//text()\");\nvar intro = java.getString(\"//div[@class='jianjie']/p/text()\");\nintro+\"\\n◤-----------------------------------------------------------------◥\\n\"+info+\"\\n◣-----------------------------------------------------------------◢\\n\"", "kind": "//div[@class='box_info']/div[@class='tags_list']/a/text()", "lastChapter": "//div[@class='box_info']/table/tbody/tr[1]/td/div/p[1]/a[2]/text()", "name": "//div[@class='box_info']/div[@class='novel_title']/text()", "tocUrl": "//div[@class='book_newchap']//a[contains(text(),'查看所有章')]/@href", "wordCount": "//div[@class='box_info']/div[@class='novel_info']/p[4]/text()@js:let num = parseFloat(result.replace(/[\\n\\s　,]/g, \"\").match(/\\d+(?:\\.\\d+)?/)?.[0]) || 0;\nnum + \"万\""}, "ruleContent": {"content": "//div[contains(@class,'read-content')]/p/text()//div[contains(@class,'read-content')]/p/text()@js: (Array.isArray(result) ? result.join('') : result || '').trim() || '章节无内容，请手动检查！'", "title": "//div[@class='text-head']/h3/text()"}, "ruleExplore": {"author": "//li[@class='four']/text()", "bookList": "//div[@class='clearfix rec_rullist']/ul", "bookUrl": "//li[@class='two']/a/@href", "kind": "@js:\nvar tag  = java.getString(\"//li[@class='sev']/span/a/text()\");\nvar uptime  = java.getString(\"//li[@class='six']/text()\");\nvar views=  java.getString(\"//li[@class='diyhot']/text()\");\ntag+\",👀\"+views+\",\"+uptime", "lastChapter": "//li[@class='three']/a/text()", "name": "//li[@class='two']/a/text()", "wordCount": "//li[@class='five']/text()@js:let num = parseFloat(result.replace(/[\\n\\s　,]/g, \"\").match(/\\d+(?:\\.\\d+)?/)?.[0]) || 0;\nnum + \"万\""}, "ruleSearch": {"author": "//p[@class='mb-1 text-muted']/a/text()", "bookList": "//div[@class='list-group']/div[@class='list-group-item']", "bookUrl": "//h5/a/@href", "checkKeyWord": "姐妹嫂母", "intro": "//p[@class='content-txt']", "kind": "<js>\nvar status = java.getString(\"//h5/small/text()\");\nvar tags = java.getString(\"//p[@class='text-muted']/a/text()\");\nvar views = java.getString(\"//p[@class='mb-1 text-muted']//text()\").match(/\\d+?.\\d+/g)[1];\nstatus+\",👀\"+views+\",\"+tags\n</js>\n##\\[|]##", "name": "//h5/a//text()@js:result.replace(/[\\[\\]\\s]/g,\"\").replace(/\\d+\\.?|\\n/g,\"\")", "wordCount": "//p[1]/text()@js:let num = parseFloat(result.replace(/[\\n\\s　,]/g, \"\").match(/\\d+(?:\\.\\d+)?/)?.[0]) || 0;\nnum + \"万\""}, "ruleToc": {"chapterList": "//ul[@class='mulu_list']/li", "chapterName": "//a/text()", "chapterUrl": "//a/@href()"}, "searchUrl": "{{source.bookSourceUrl}}search.html?q={{key}}&f=_all", "weight": 0},{"bookSourceComment": "移动版书源，需在APP内登录后使用搜索功能。修复目录获取，支持分页完整目录", "bookSourceGroup": "AI", "bookSourceName": "皮皮小说（登录搜索）", "bookSourceType": 0, "bookSourceUrl": "https://www.ppshu.net", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "玄幻修真::/list/1/{{page}}.html\n重生穿越::/list/2/{{page}}.html\n都市小说::/list/3/{{page}}.html\n军史小说::/list/4/{{page}}.html\n网游小说::/list/5/{{page}}.html\n科幻小说::/list/6/{{page}}.html\n灵异小说::/list/7/{{page}}.html\n言情小说::/list/8/{{page}}.html\n其他小说::/list/9/{{page}}.html", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; SM-G981B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1787383968758", "loginUrl": "https://www.ppshu.net/login.html", "respondTime": 180000, "ruleBookInfo": {"author": "span.author@text", "coverUrl": ".book-img img.0@src", "intro": "meta[name=\"description\"]@content", "kind": "p.tag span.blue@text", "lastChapter": "p.update a@text", "name": "div.bookname h1@text"}, "ruleContent": {"content": "div.txt@html", "nextContentUrl": "@js:var m=result.match(/href=\"([^\"]+)\"[^>]*class=\"url_next\"/);m&&m[1].match(/_\\d+\\.html$/)?m[1]:''"}, "ruleExplore": {"author": "span.s4@text", "bookList": "ul.sort_list li", "bookUrl": "span.s2 a@href", "lastChapter": "span.s2 a@title", "name": "span.s2 a@text"}, "ruleSearch": {"author": "span.s5@text", "bookList": "ul.sort_list li", "bookUrl": "span.s2 a@href", "name": "span.s2 a@text"}, "ruleToc": {"chapterList": "@js:\nvar chapters = [];\nvar domain = (baseUrl.match(/^https?:\\/\\/[^\\/]+/) || [''])[0];\nvar html = src || result || '';\n\nfunction toAbs(u) { return u.indexOf('http') < 0 ? domain + (u.indexOf('/') === 0 ? '' : '/') + u : u; }\nfunction grabUl(ulHtml) {\n    var out = [];\n    var re = /<li><a href=\"([^\"]+)\"[^>]*>([\\s\\S]*?)<\\/a><\\/li>/g;\n    var m;\n    while ((m = re.exec(ulHtml))) {\n        var name = m[2].replace(/<[^>]+>/g, '').replace(/^\\s+|\\s+$/g, '');\n        if (name && m[1]) out.push({text: name, href: m[1]});\n    }\n    return out;\n}\nfunction selectPages(h) {\n    var sel = h.match(/<select[^>]*>([\\s\\S]*?)<\\/select>/);\n    var urls = [];\n    if (sel) {\n        var re = /<option[^>]*value=\"([^\"]+)\"/g, om;\n        while ((om = re.exec(sel[1]))) { var u = toAbs(om[1]); if (urls.indexOf(u) < 0) urls.push(u); }\n    }\n    return urls;\n}\n\n// 1. 从详情页 章节列表 区块抓取第1-100章(排除最新章节干扰)\nvar cs = html.match(/<h3[^>]*>章节列表[\\s\\S]*?<ul[^>]*class=\"chapter-list\"[^>]*>([\\s\\S]*?)<\\/ul>/);\nif (cs) chapters = chapters.concat(grabUl(cs[1]));\n\n// 2. 找到第一个 index 页\nvar firstIndex = html.match(/href=\"([^\"]*index_\\d+\\.html)\"/);\nvar pages = [];\nif (firstIndex) {\n    var idxHtml = java.ajax(toAbs(firstIndex[1]));\n    pages = selectPages(idxHtml);\n    var u2 = idxHtml.match(/<ul[^>]*class=\"chapter-list\"[^>]*>([\\s\\S]*?)<\\/ul>/);\n    if (u2) chapters = chapters.concat(grabUl(u2[1]));\n}\n\n// 3. 抓取其余 index 页\nfor (var i = 0; i < pages.length; i++) {\n    if (/index_\\d+\\.html/.test(pages[i])) {\n        if (firstIndex && pages[i] === toAbs(firstIndex[1])) continue;\n        var h = java.ajax(pages[i]);\n        var u3 = h.match(/<ul[^>]*class=\"chapter-list\"[^>]*>([\\s\\S]*?)<\\/ul>/);\n        if (u3) chapters = chapters.concat(grabUl(u3[1]));\n    }\n}\n\n// 4. 按 href 去重(保留首次出现)\nvar seen = {}; var out = [];\nfor (var k = 0; k < chapters.length; k++) {\n    if (!seen[chapters[k].href]) { seen[chapters[k].href] = true; out.push(chapters[k]); }\n}\nout;", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "/search.html,{\"method\":\"POST\",\"body\":\"s={{key}}\"}", "weight": 0},{"bookSourceComment": "", "bookSourceGroup": "", "bookSourceName": "顶点小说", "bookSourceType": 0, "bookSourceUrl": "http://www.xsbook.org", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": false, "exploreUrl": "", "respondTime": 180000, "ruleBookInfo": {"init": "", "name": "", "author": "", "coverUrl": "img@src", "intro": "", "kind": "", "lastChapter": "", "wordCount": "class.orange@text", "tocUrl": ""}, "ruleContent": {"content": "id.chaptercontent@textNodes", "nextContentUrl": "class.block@href", "replaceRegex": "", "webJs": "", "sourceRegex": ""}, "ruleExplore": {"bookList": ""}, "ruleSearch": {"bookList": "tag.li", "name": "", "author": "", "coverUrl": "img@src", "bookUrl": "tag.a@href", "lastChapter": "", "kind": "", "intro": "", "wordCount": ""}, "ruleToc": {"chapterList": "class.listtj@tag.a", "chapterName": "@text", "chapterUrl": "@href", "nextTocUrl": "", "preUpdateJs": ""}, "searchUrl": "http://www.xsbook.org/search19.html?searchkey={{key}}", "weight": 0, "lastUpdateTime": "1787355733379"},{"bookSourceGroup": "咪咪喵", "bookSourceName": "番茄听书[官方]", "bookSourceType": 1, "bookSourceUrl": "番茄听书官方本地接口  by咪咪喵原创  搬运请注明来源！", "bookUrlPattern": "https://reading.snssdk.com", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "@js:\nsort=[];\npush=(title,url,type1,type2)=>sort.push({\n\t\ttitle: title,\n\t\turl: url,\n\t\tstyle: {\n\t\t\t\tlayout_flexGrow: type1,\n\t\t\t\tlayout_flexBasisPercent: type2\n\t\t\t}\n\t});\n\nvar data = {\"code\":0,\"data\":{\"category_tree\":[{\"parent_category\":{\"category_name\":\"小说\",\"tag\":\"novel\",\"category_ids\":[5368709120]},\"child_categories\":[{\"category_id\":\"1\",\"category_name\":\"都市\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/5c4e070e0753e1c31c6dc473430ef6e6~tplv-noop.image\"},{\"category_id\":\"3\",\"category_name\":\"现代言情\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/7eb7e0d35f701c62a4b879eb88d30f13~tplv-noop.image\"},{\"category_id\":\"5\",\"category_name\":\"古代言情\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/40ed03c2b02ec221becf8eda1a047b1d~tplv-noop.image\"},{\"category_id\":\"261\",\"category_name\":\"都市日常\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/d3c9da48852aa36bab43ee1a5ea62e36~tplv-noop.image\"},{\"category_id\":\"79\",\"category_name\":\"年代\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/8de405f1b578392d74ba60eb25dc0eca~tplv-noop.image\"},{\"category_id\":\"7\",\"category_name\":\"玄幻\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/dc7c883589be2a1159fb1aef81d7cd54~tplv-noop.image\"},{\"category_id\":\"246\",\"category_name\":\"宫斗宅斗\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/ecec9474d8da23af2d89ce11ff32fb60~tplv-noop.image\"},{\"category_id\":\"23\",\"category_name\":\"种田\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/f2304df6bb861041e7078f5b4714041e~tplv-noop.image\"},{\"category_id\":\"258\",\"category_name\":\"传统玄幻\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/dc7c883589be2a1159fb1aef81d7cd54~tplv-noop.image\"},{\"category_id\":\"91\",\"category_name\":\"多女主\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/1910cae5b8eee37bd93e8f806eec707c~tplv-noop.image\"},{\"category_id\":\"12\",\"category_name\":\"历史\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/dac8281c1240fa766ead266a2bc0225f~tplv-noop.image\"},{\"category_id\":\"262\",\"category_name\":\"都市脑洞\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/ba5766c26cfe042e1042c83e9e784099~tplv-noop.image\"},{\"category_id\":\"124\",\"category_name\":\"都市修真\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/9744124991543d0700edf476c2a878e8~tplv-noop.image\"},{\"category_id\":\"27\",\"category_name\":\"兵王\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/c6309c0398751888455eea51dc2df8b3~tplv-noop.image\"},{\"category_id\":\"263\",\"category_name\":\"都市种田\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/ef3c4dfad092c6d86aa54f8a5d3502a4~tplv-noop.image\"},{\"category_id\":\"265\",\"category_name\":\"先婚后爱\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/15e2932ba77bedcb137e04d00961b473~tplv-noop.image\"},{\"category_id\":\"273\",\"category_name\":\"历史古代\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/ed042689ec53cb73d96b325caa856c75~tplv-noop.image\"},{\"category_id\":\"26\",\"category_name\":\"神医\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/9744124991543d0700edf476c2a878e8~tplv-noop.image\"},{\"category_id\":\"29\",\"category_name\":\"豪门总裁\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/7eb7e0d35f701c62a4b879eb88d30f13~tplv-noop.image\"},{\"category_id\":\"257\",\"category_name\":\"玄幻脑洞\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/fbba9e4dfa19e9279fa81b79e4236e0e~tplv-noop.image\"},{\"category_id\":\"10\",\"category_name\":\"悬疑\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/030c1a5898dfac64074bf1b6018b2340~tplv-noop.image\"},{\"category_id\":\"1016\",\"category_name\":\"男频衍生\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/865404c00a584e27b2a95d60546a7889~tplv-noop.image\"},{\"category_id\":\"1140\",\"category_name\":\"东方仙侠\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/a9fef8085e96ded01723977e24a59404~tplv-noop.image\"},{\"category_id\":\"533\",\"category_name\":\"民俗秘闻\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/0e5e83530b245dc2f2da5afae968c466~tplv-noop.image\"},{\"category_id\":\"1014\",\"category_name\":\"都市高武\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/d85483046ca2d555e92e56cd8f98f188~tplv-noop.image\"},{\"category_id\":\"37\",\"category_name\":\"穿越\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/24ff7377a0f282df8174a75c25254d3a~tplv-noop.image\"},{\"category_id\":\"19\",\"category_name\":\"系统\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/b7c301b0ac13e05e5fcceafa1cecc847~tplv-noop.image\"},{\"category_id\":\"520\",\"category_name\":\"大佬\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/0eed12e3098ab8d5e0e7fe384edc09eb~tplv-noop.image\"},{\"category_id\":\"259\",\"category_name\":\"奇幻仙侠\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/ae6602ff291fe820e234cbd87bc29652~tplv-noop.image\"},{\"category_id\":\"30\",\"category_name\":\"宠妻\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/513225ee7c2dae24e4a971d1127560a9~tplv-noop.image\"},{\"category_id\":\"248\",\"category_name\":\"玄幻言情\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/d63f1ef5744f39b1e27b607681675406~tplv-noop.image\"},{\"category_id\":\"253\",\"category_name\":\"古言脑洞\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/5a7558dabf614467af95f5551fcdd577~tplv-noop.image\"},{\"category_id\":\"267\",\"category_name\":\"现言脑洞\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/591a3949ceab829020e26bf0923c34b1~tplv-noop.image\"},{\"category_id\":\"272\",\"category_name\":\"历史脑洞\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/ee4ce2a2a8e09b64b8855065cda2b9f5~tplv-noop.image\"},{\"category_id\":\"504\",\"category_name\":\"抗战谍战\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/d7a09c25b4360d9961eb7b460ae21e98~tplv-noop.image\"},{\"category_id\":\"8\",\"category_name\":\"科幻末世\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/fd665f366b09200b081089f04ef12db2~tplv-noop.image\"},{\"category_id\":\"247\",\"category_name\":\"医术\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/733450cb667fad93a6f51b514a936463~tplv-noop.image\"},{\"category_id\":\"384\",\"category_name\":\"无敌\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/ed042689ec53cb73d96b325caa856c75~tplv-noop.image\"},{\"category_id\":\"727\",\"category_name\":\"七零\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/9b6f25ed67b5afcd9060aa5ca24bc0a5~tplv-noop.image\"},{\"category_id\":\"453\",\"category_name\":\"开局\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/ef3c4dfad092c6d86aa54f8a5d3502a4~tplv-noop.image\"},{\"category_id\":\"86\",\"category_name\":\"女强\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/89724dcb72fdde80c65dc289904377ac~tplv-noop.image\"},{\"category_id\":\"94\",\"category_name\":\"团宠\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/4a96cfa9e400019d9dca98f71875b6fd~tplv-noop.image\"},{\"category_id\":\"24\",\"category_name\":\"快穿\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/cb8a5e075b85204b5a8d108bb22d5863~tplv-noop.image\"},{\"category_id\":\"723\",\"category_name\":\"下山\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/63b462edc53e5fc897e1627f0839cbd5~tplv-noop.image\"},{\"category_id\":\"36\",\"category_name\":\"重生\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/33a1147c526d142ea9ff7abd592a6a36~tplv-noop.image\"},{\"category_id\":\"718\",\"category_name\":\"动漫衍生\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/b00a3459b2d80675817b273f984513df~tplv-noop.image\"},{\"category_id\":\"584\",\"category_name\":\"道士\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/73fa3d3fc364ac920c1f71ff24cefb5b~tplv-noop.image\"},{\"category_id\":\"746\",\"category_name\":\"游戏体育\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/ae027f88b604006c5b6c2084c099e153~tplv-noop.image\"},{\"category_id\":\"2\",\"category_name\":\"都市生活\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/d6c78ab94505d65ea20981fd84b12927~tplv-noop.image\"},{\"category_id\":\"275\",\"category_name\":\"双男主\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/733eceac8e20aa6b3fc927b2fb38cddf~tplv-noop.image\"},{\"category_id\":\"119\",\"category_name\":\"搞笑\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/a9c84658d272d9f5aaf08b23811de899~tplv-noop.image\"},{\"category_id\":\"32\",\"category_name\":\"幻想言情\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/591a3949ceab829020e26bf0923c34b1~tplv-noop.image\"},{\"category_id\":\"100\",\"category_name\":\"灵异\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/59c974d2ccbfc01edc8d0676c7cb57dd~tplv-noop.image\"},{\"category_id\":\"90\",\"category_name\":\"天才\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/cd055b4c170cdbb45ba8b88c8b2146c9~tplv-noop.image\"},{\"category_id\":\"28\",\"category_name\":\"萌宝\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/46635ac969fb860d9ab49820642e5875~tplv-noop.image\"},{\"category_id\":\"597\",\"category_name\":\"爽文\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/844de8885ea1ba913625575b50b6a4e6~tplv-noop.image\"},{\"category_id\":\"728\",\"category_name\":\"八零\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/ef3c4dfad092c6d86aa54f8a5d3502a4~tplv-noop.image\"},{\"category_id\":\"25\",\"category_name\":\"赘婿\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/a116d20631f0e39ed8711358de6e7523~tplv-noop.image\"},{\"category_id\":\"745\",\"category_name\":\"星光璀璨\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/c91e53671a649b4cb196c3aaf86ce7c4~tplv-noop.image\"},{\"category_id\":\"735\",\"category_name\":\"凡人流\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/5182d1a3ea6f49a364b71375ff21da0d~tplv-noop.image\"},{\"category_id\":\"266\",\"category_name\":\"马甲\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/ad618ad342ddd844375aca5b63dd8dd8~tplv-noop.image\"},{\"category_id\":\"125\",\"category_name\":\"家庭\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/41b60319575686df99d4b56d62d4f748~tplv-noop.image\"},{\"category_id\":\"81\",\"category_name\":\"盗墓\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/e010d0e1119873428947ebd5c8220fcf~tplv-noop.image\"},{\"category_id\":\"20\",\"category_name\":\"神豪\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/c6309c0398751888455eea51dc2df8b3~tplv-noop.image\"},{\"category_id\":\"391\",\"category_name\":\"无女主\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/09856ca9113388a76b32b02b2f764dc4~tplv-noop.image\"},{\"category_id\":\"42\",\"category_name\":\"奶爸\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/f2304df6bb861041e7078f5b4714041e~tplv-noop.image\"},{\"category_id\":\"68\",\"category_name\":\"末世\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/2f995f155cd5b06fd1a2b9be55a059cc~tplv-noop.image\"},{\"category_id\":\"749\",\"category_name\":\"青春甜宠\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/b735f51af1415685e757515fc63853b6~tplv-noop.image\"},{\"category_id\":\"1015\",\"category_name\":\"女频衍生\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/e8c5492f81a22a227a5bf65e6678772d~tplv-noop.image\"},{\"category_id\":\"372\",\"category_name\":\"网游\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/da504de5c8412ba66c44a364f4a0f2d9~tplv-noop.image\"},{\"category_id\":\"537\",\"category_name\":\"惊悚游戏\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/d47b75bea2b170215076cd1496a8b57d~tplv-noop.image\"},{\"category_id\":\"269\",\"category_name\":\"现言日常\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/690630f03282dc1b2ddc8281274406b5~tplv-noop.image\"},{\"category_id\":\"80\",\"category_name\":\"剑道\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/55fc3c56b05e7b087aaf33db5ba4498c~tplv-noop.image\"},{\"category_id\":\"536\",\"category_name\":\"刑侦探案\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/0176c7c5c876a1b92ec21ee9f74b901f~tplv-noop.image\"},{\"category_id\":\"379\",\"category_name\":\"求生\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/2f995f155cd5b06fd1a2b9be55a059cc~tplv-noop.image\"},{\"category_id\":\"1139\",\"category_name\":\"古风世情\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/fdaddcf99c229e9c0bd51a6ead6260be~tplv-noop.image\"},{\"category_id\":\"57\",\"category_name\":\"游戏动漫\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/86c4526d9bdd44267522871a6e264c3d~tplv-noop.image\"},{\"category_id\":\"369\",\"category_name\":\"反派\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/270daa0dafe7140d76698dcd9c916cda~tplv-noop.image\"},{\"category_id\":\"74\",\"category_name\":\"宠物\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/d61a44f6be29c859bfaaf441e8343013~tplv-noop.image\"},{\"category_id\":\"43\",\"category_name\":\"娱乐圈\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/a8de2ee4debf0c6413138bb2fed805db~tplv-noop.image\"},{\"category_id\":\"385\",\"category_name\":\"校花\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/79f908969a52ca3e03d4eb064ab38eb2~tplv-noop.image\"},{\"category_id\":\"88\",\"category_name\":\"嫡女\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/733450cb667fad93a6f51b514a936463~tplv-noop.image\"},{\"category_id\":\"61\",\"category_name\":\"推理\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/23f54b543463f8eeaaaad35216884340~tplv-noop.image\"},{\"category_id\":\"16\",\"category_name\":\"武侠\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/ef9203d1b459f89b8b6b7dafa0430bc4~tplv-noop.image\"},{\"category_id\":\"1017\",\"category_name\":\"民国言情\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/5b78b069794d93134f8ad6cd1be1400b~tplv-noop.image\"},{\"category_id\":\"44\",\"category_name\":\"空间\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/015a678a4d48ea6703eb82b5027a7ef9~tplv-noop.image\"},{\"category_id\":\"395\",\"category_name\":\"现言甜宠\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/14dee9b56e09984a3f01de05aa76e6f6~tplv-noop.image\"},{\"category_id\":\"487\",\"category_name\":\"医生\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/03afeb1b23fe1b31c5a587d35a3ba15b~tplv-noop.image\"},{\"category_id\":\"585\",\"category_name\":\"女配\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/5659c055fd6f6b22ff60afe8f9e86c53~tplv-noop.image\"},{\"category_id\":\"15\",\"category_name\":\"体育\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/f89c2c02de883e1ceef4a2a52b7a4981~tplv-noop.image\"},{\"category_id\":\"392\",\"category_name\":\"无CP\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/e28f24608998d9e1ff968f76e8baa49c~tplv-noop.image\"},{\"category_id\":\"725\",\"category_name\":\"永生\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/81927ad4f5466c64de5e5685535af1ee~tplv-noop.image\"},{\"category_id\":\"82\",\"category_name\":\"学霸\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/bb2ca232534f50b965f9605ca703ccfe~tplv-noop.image\"},{\"category_id\":\"378\",\"category_name\":\"女帝\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/b95d7a4c5b185fb9cbd37b2136259d8b~tplv-noop.image\"},{\"category_id\":\"96\",\"category_name\":\"甜宠\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/188a23cd85e9b5c3579ef179c27d8f72~tplv-noop.image\"},{\"category_id\":\"1141\",\"category_name\":\"西方奇幻\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/2f29ab02a3e8d7f49d01904255bc0327~tplv-noop.image\"},{\"category_id\":\"535\",\"category_name\":\"鬼故事\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/b6791892a497536d24021a8f3939dca7~tplv-noop.image\"},{\"category_id\":\"4\",\"category_name\":\"校园\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/a95b17d6d1edd123cb3581906db3c2d2~tplv-noop.image\"},{\"category_id\":\"39\",\"category_name\":\"二次元\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/01ddeb78424ec372cab5c78424f351cd~tplv-noop.image\"},{\"category_id\":\"69\",\"category_name\":\"直播\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/0a441935195f8799db10baa314d26f7c~tplv-noop.image\"},{\"category_id\":\"75\",\"category_name\":\"外卖\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/acb9314f913f29f11aa138ba149f41c1~tplv-noop.image\"},{\"category_id\":\"592\",\"category_name\":\"王爷\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/89a4d7dd3366f1a7932e487bcbf42fc9~tplv-noop.image\"},{\"category_id\":\"737\",\"category_name\":\"大叔\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/ecbef6ec91202c870f76d9a774ac5d33~tplv-noop.image\"},{\"category_id\":\"83\",\"category_name\":\"公主\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/b30063a98117fef9875ffaac26378d99~tplv-noop.image\"},{\"category_id\":\"590\",\"category_name\":\"替嫁\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/ab0cec88341bf4d75b706fba6012084a~tplv-noop.image\"},{\"category_id\":\"17\",\"category_name\":\"鉴宝\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/788bd08e7646a02e904e8e146b0a5a17~tplv-noop.image\"},{\"category_id\":\"704\",\"category_name\":\"双女主\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/127e5ed31bb648853b42dd0cc99cec74~tplv-noop.image\"},{\"category_id\":\"388\",\"category_name\":\"女扮男装\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/76887c7ea649c3c2c75d5b7d373de462~tplv-noop.image\"},{\"category_id\":\"71\",\"category_name\":\"诸天万界\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/33a1147c526d142ea9ff7abd592a6a36~tplv-noop.image\"},{\"category_id\":\"70\",\"category_name\":\"无限流\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/745d33cc08e2c2448fddcbfda7a16aa3~tplv-noop.image\"},{\"category_id\":\"85\",\"category_name\":\"王妃\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/733450cb667fad93a6f51b514a936463~tplv-noop.image\"},{\"category_id\":\"77\",\"category_name\":\"星际\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/05ab0cbc8509134be41af7dc3ab31d94~tplv-noop.image\"},{\"category_id\":\"375\",\"category_name\":\"特种兵\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/9b9c2b467a1962cb0f1b9cf07269e3b5~tplv-noop.image\"},{\"category_id\":\"734\",\"category_name\":\"吞噬\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/439d48633cd88023f0e00528b316842e~tplv-noop.image\"},{\"category_id\":\"591\",\"category_name\":\"太子\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/a856716984bb38836c0bee63ec933dd0~tplv-noop.image\"},{\"category_id\":\"72\",\"category_name\":\"兽世\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/b492e40276bc055344374297d67cc65d~tplv-noop.image\"},{\"category_id\":\"67\",\"category_name\":\"三国\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/f1b30b8640b7c7332743dd4343ae0bec~tplv-noop.image\"},{\"category_id\":\"589\",\"category_name\":\"法医\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/a0e8588dc541aaa9503605541fcd2f6e~tplv-noop.image\"},{\"category_id\":\"729\",\"category_name\":\"捡漏\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/c2f21e141fa0484b97e6146c34d18ba4~tplv-noop.image\"},{\"category_id\":\"587\",\"category_name\":\"村花\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/faa37b8809beb8948de5cf6f83e00de0~tplv-noop.image\"},{\"category_id\":\"249\",\"category_name\":\"古言萌宝\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/298ec2617ba5a5313e00804d8c8b3dd4~tplv-noop.image\"},{\"category_id\":\"582\",\"category_name\":\"丧尸\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/3e031bd3f1d6001ef1b72806c7ff025a~tplv-noop.image\"},{\"category_id\":\"514\",\"category_name\":\"灵气复苏\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/944c0046a2d3034de1bff8830a63e3cd~tplv-noop.image\"},{\"category_id\":\"66\",\"category_name\":\"洪荒\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/e1d03e1ed715fe2e903c1c66c33924eb~tplv-noop.image\"},{\"category_id\":\"31\",\"category_name\":\"其他\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/bc238b3116961f6bd60ab6e07f32f6ce~tplv-noop.image\"},{\"category_id\":\"40\",\"category_name\":\"海岛\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/d64a8bbd46cb44369a518a2797156b9f~tplv-noop.image\"},{\"category_id\":\"516\",\"category_name\":\"都市异能\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/ec3dd2313943c0d17637de43114ecfed~tplv-noop.image\"},{\"category_id\":\"724\",\"category_name\":\"召唤\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/53d43639ce698c36041d99e0e822773c~tplv-noop.image\"},{\"category_id\":\"719\",\"category_name\":\"天道\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/97d258d776b9723946de7f0362302a21~tplv-noop.image\"},{\"category_id\":\"92\",\"category_name\":\"腹黑\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/c5a63b3653d8e90fe2be8b9fa1a9ce5a~tplv-noop.image\"},{\"category_id\":\"731\",\"category_name\":\"封神\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/06931c1ff40aa556f523e16cf463a21a~tplv-noop.image\"},{\"category_id\":\"492\",\"category_name\":\"将军\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/a8cda80eed657cf511573873add92c37~tplv-noop.image\"},{\"category_id\":\"382\",\"category_name\":\"穿书\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/513225ee7c2dae24e4a971d1127560a9~tplv-noop.image\"},{\"category_id\":\"45\",\"category_name\":\"影视小说\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/f7dc4d0ecaef796e67b33ddff9bd85ce~tplv-noop.image\"},{\"category_id\":\"368\",\"category_name\":\"火影\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/aeb1298ea36e0ff8e6193e84ed63ec61~tplv-noop.image\"},{\"category_id\":\"444\",\"category_name\":\"影视原声\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/dcd99aa1613b8ec5e33e08c23dc7352f~tplv-noop.image\"},{\"category_id\":\"383\",\"category_name\":\"九叔\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/f961031d5e7ce98770046ae9db196330~tplv-noop.image\"},{\"category_id\":\"390\",\"category_name\":\"民国\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/351732da58e7993051173aa497daa201~tplv-noop.image\"},{\"category_id\":\"507\",\"category_name\":\"谍战\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/e8a99892e5257186c750deccd83c2f9b~tplv-noop.image\"},{\"category_id\":\"394\",\"category_name\":\"古言甜宠\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/3100c2a83c088a6d9f1c7bff0319f6c1~tplv-noop.image\"},{\"category_id\":\"76\",\"category_name\":\"清穿\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/a6b2c5d722f1b12af069a508a2ca754e~tplv-noop.image\"},{\"category_id\":\"588\",\"category_name\":\"地府\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/229637aabe7a9e25b46cc1c79a9b15db~tplv-noop.image\"},{\"category_id\":\"613\",\"category_name\":\"御兽\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/907533ad4b7a951a2059ab37794c8a8a~tplv-noop.image\"},{\"category_id\":\"367\",\"category_name\":\"奥特同人\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/398474364ed378fcc3c8d81d9949ebb5~tplv-noop.image\"},{\"category_id\":\"380\",\"category_name\":\"病娇\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/286528e43bed3ad6e29e11ecd9584fc8~tplv-noop.image\"},{\"category_id\":\"78\",\"category_name\":\"美食\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/6efd36fc5ea6d2d03f3e34ec50daf4ee~tplv-noop.image\"},{\"category_id\":\"381\",\"category_name\":\"聊天群\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/ff544dbd1eea047744b844e9f311a86a~tplv-noop.image\"},{\"category_id\":\"376\",\"category_name\":\"龙珠\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/4760b42581bc95bcd945135ebc7fdb2c~tplv-noop.image\"},{\"category_id\":\"89\",\"category_name\":\"精灵\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/aa60765635d6d0f019efaff07c9b5e8f~tplv-noop.image\"},{\"category_id\":\"95\",\"category_name\":\"虐文\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/19c957463e13f1bb72ab302cedf428b6~tplv-noop.image\"},{\"category_id\":\"387\",\"category_name\":\"青梅竹马\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/19c957463e13f1bb72ab302cedf428b6~tplv-noop.image\"},{\"category_id\":\"84\",\"category_name\":\"皇后\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/e86dab68cceee8a3a41754d0ed07e90c~tplv-noop.image\"},{\"category_id\":\"518\",\"category_name\":\"特工\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/35e7c4fcaff23bc05e3f70d8d1db71b0~tplv-noop.image\"},{\"category_id\":\"374\",\"category_name\":\"漫威\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/907a4d5a4e8d8d57ec8f4ab0e15096de~tplv-noop.image\"},{\"category_id\":\"373\",\"category_name\":\"西游\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/01ddeb78424ec372cab5c78424f351cd~tplv-noop.image\"},{\"category_id\":\"498\",\"category_name\":\"皇帝\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/4092a87dde811eb4876195f52200784d~tplv-noop.image\"},{\"category_id\":\"73\",\"category_name\":\"大唐\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/db7ade546ae7466da3d16d1fadb30b75~tplv-noop.image\"},{\"category_id\":\"127\",\"category_name\":\"职场\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/5b16034d2548fc17817448b63e9f5cd4~tplv-noop.image\"},{\"category_id\":\"557\",\"category_name\":\"逃荒\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/1c6d1c9f1994c21937fcdafee72c0488~tplv-noop.image\"},{\"category_id\":\"466\",\"category_name\":\"闪婚\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/f61cfeff7a8ef351b9349f46a6167ce9~tplv-noop.image\"},{\"category_id\":\"493\",\"category_name\":\"钓鱼\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/854442896a6f98c433090b241146bd4a~tplv-noop.image\"},{\"category_id\":\"126\",\"category_name\":\"明朝\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/8a9723f5ffd0f63b0a4ef2dcd594892f~tplv-noop.image\"},{\"category_id\":\"377\",\"category_name\":\"大秦\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/8d6553b3941c7e72eb00e1d149c59566~tplv-noop.image\"}]},{\"parent_category\":{\"category_name\":\"相声评书\",\"tag\":\"opera\",\"category_ids\":[2147483648]},\"child_categories\":[{\"category_id\":\"110\",\"category_name\":\"评书\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/c1ee206ae6c93dc38feba1cc00b6c4eb~tplv-noop.image\"},{\"category_id\":\"201\",\"category_name\":\"单田芳\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/8e330a27695d9aebfffa6f42bfba194b~tplv-noop.image\"},{\"category_id\":\"202\",\"category_name\":\"刘兰芳\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/5361e3717b5db4c28297c05ce7a27244~tplv-noop.image\"},{\"category_id\":\"111\",\"category_name\":\"相声\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/8e6b2a8879e21a46111596d5787ca22c~tplv-noop.image\"},{\"category_id\":\"204\",\"category_name\":\"袁阔成\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/f9af68a0f345b4cba28e67d2aca3ee0b~tplv-noop.image\"},{\"category_id\":\"203\",\"category_name\":\"田连元\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/0e9e2191517ae1199a10293131259c32~tplv-noop.image\"},{\"category_id\":\"114\",\"category_name\":\"小品\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/daf4b73fb35220d2d3b7d1b58364632a~tplv-noop.image\"}]},{\"parent_category\":{\"category_name\":\"历史\",\"tag\":\"history\",\"category_ids\":[11811160064]},\"child_categories\":[{\"category_id\":\"207\",\"category_name\":\"名人传\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/93b4fe1da639c5307877d00981c6cb4a~tplv-noop.image\"},{\"category_id\":\"213\",\"category_name\":\"近现代\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/0713d9b1a784daecd22d12957aa6be22~tplv-noop.image\"},{\"category_id\":\"212\",\"category_name\":\"中国史\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/dcaa706f65d241871251af4aa7c6eb59~tplv-noop.image\"},{\"category_id\":\"206\",\"category_name\":\"战争史\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/d53117bebb368fade1750d174401503a~tplv-noop.image\"},{\"category_id\":\"211\",\"category_name\":\"明清\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/0e4af68fc2d177b884e1e9b0fa6ced38~tplv-noop.image\"},{\"category_id\":\"356\",\"category_name\":\"其他历史\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/8c7f521ceb8092aa885a4bddd51caafe~tplv-noop.image\"},{\"category_id\":\"210\",\"category_name\":\"唐宋\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/0a80f85fef055352efb80799afc74c69~tplv-noop.image\"},{\"category_id\":\"209\",\"category_name\":\"魏晋南北朝\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/50d36062145f82bd8e9010e2cac37c15~tplv-noop.image\"},{\"category_id\":\"208\",\"category_name\":\"秦汉\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/7192b8b9aca7c497b62c2aa2c859bcd3~tplv-noop.image\"},{\"category_id\":\"214\",\"category_name\":\"世界史\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/5a50fb0f4ba09f69ab84308a031127a0~tplv-noop.image\"}]},{\"parent_category\":{\"category_name\":\"文化\",\"tag\":\"culture\",\"category_ids\":[10737418240]},\"child_categories\":[{\"category_id\":\"562\",\"category_name\":\"大案纪实\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/1721c55e3b7ca2164d9eac03aed72b69~tplv-noop.image\"},{\"category_id\":\"116\",\"category_name\":\"国学\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/074e22f233f60549f0f5891c1ac8c0ed~tplv-noop.image\"},{\"category_id\":\"118\",\"category_name\":\"文化\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/84de95ac7e59df63d7e39bcacf9d1804~tplv-noop.image\"},{\"category_id\":\"132\",\"category_name\":\"名著解读\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/11903649f5b954b84208bd76ca957035~tplv-noop.image\"},{\"category_id\":\"115\",\"category_name\":\"佛学\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/31bca37bb66a62593c34440778b69667~tplv-noop.image\"},{\"category_id\":\"353\",\"category_name\":\"民间故事\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/1d2219708e24b3d051d5b4e12d0fc9b8~tplv-noop.image\"},{\"category_id\":\"237\",\"category_name\":\"社科\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/3548b8b4e57a3d85f366ff5fa11a0617~tplv-noop.image\"},{\"category_id\":\"133\",\"category_name\":\"纪录\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/2ddf75b8475f94f3a2c3c5b854afe64c~tplv-noop.image\"},{\"category_id\":\"236\",\"category_name\":\"散文戏剧\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/d1bafaf985c3b2ec82e8b94e545391e7~tplv-noop.image\"},{\"category_id\":\"135\",\"category_name\":\"哲学\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/6b336342553b38ecbb66715b4f13824e~tplv-noop.image\"},{\"category_id\":\"354\",\"category_name\":\"其他人文\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/fe0b79805e8587ecbd62caafe85df92e~tplv-noop.image\"},{\"category_id\":\"352\",\"category_name\":\"读书书评\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/a3e9573a495a95f69f3e2a371991682d~tplv-noop.image\"},{\"category_id\":\"136\",\"category_name\":\"自然科学\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/48c9c06d3f39dc5db39e85e0339226e2~tplv-noop.image\"},{\"category_id\":\"134\",\"category_name\":\"艺术\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/e6432579f09e40b4827bee953118b4b0~tplv-noop.image\"}]},{\"parent_category\":{\"category_name\":\"学习成长\",\"tag\":\"study\",\"category_ids\":[12884901888]},\"child_categories\":[{\"category_id\":\"239\",\"category_name\":\"励志成功\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/d7155de7a861592ef3bc055f51f2355a~tplv-noop.image\"},{\"category_id\":\"144\",\"category_name\":\"沟通表达\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/df459ec2b315d686a45189178562b869~tplv-noop.image\"},{\"category_id\":\"335\",\"category_name\":\"未解谜团\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/3ab10402326579a6043cdf56d774ce0a~tplv-noop.image\"},{\"category_id\":\"143\",\"category_name\":\"投资理财\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/f0f2b229a17df9cf74997441579db23c~tplv-noop.image\"},{\"category_id\":\"147\",\"category_name\":\"考试培训\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/8aa557d4685592f87bcf2aed9ec4f3ad~tplv-noop.image\"},{\"category_id\":\"145\",\"category_name\":\"职业职场\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/9c89d9dde1619ac591c5c47163b4f52b~tplv-noop.image\"},{\"category_id\":\"153\",\"category_name\":\"中考\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/a205d245930ef5d18b75ccbec854cc29~tplv-noop.image\"},{\"category_id\":\"238\",\"category_name\":\"经管商业\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/bb3ad0987af6509b9d1ac9f760ef06e0~tplv-noop.image\"},{\"category_id\":\"146\",\"category_name\":\"心理\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/dd53d0c70baf2eb31b4011892b929b7c~tplv-noop.image\"},{\"category_id\":\"142\",\"category_name\":\"法律\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/ef63dc709c50afac78a97c8e07e2fa42~tplv-noop.image\"},{\"category_id\":\"154\",\"category_name\":\"小升初\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/7859e844b5bba1759ed2f44aab3fff01~tplv-noop.image\"},{\"category_id\":\"341\",\"category_name\":\"其他成长\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/19044c4aaff5b120546f12a32ff926cb~tplv-noop.image\"}]},{\"parent_category\":{\"category_name\":\"情感\",\"tag\":\"emotion\",\"category_ids\":[15032385536]},\"child_categories\":[{\"category_id\":\"229\",\"category_name\":\"情感故事\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/03733e62ec203f68d6f1b6890f4472db~tplv-noop.image\"},{\"category_id\":\"234\",\"category_name\":\"婚姻\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/64d0f69c5b9306273e2bb208c2229e33~tplv-noop.image\"},{\"category_id\":\"233\",\"category_name\":\"心理健康\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/7d0bfe878b95c04edf004b96fdecc165~tplv-noop.image\"},{\"category_id\":\"232\",\"category_name\":\"夜话\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/f142fb6f049cbf4425b0c46d44bad7d2~tplv-noop.image\"},{\"category_id\":\"231\",\"category_name\":\"女性\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/5147d937aa21a884509238fdb9e6afb8~tplv-noop.image\"},{\"category_id\":\"230\",\"category_name\":\"美文\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/8dd2f5ecf70e14d8bcd1470efa86f10f~tplv-noop.image\"}]},{\"parent_category\":{\"category_name\":\"亲子\",\"tag\":\"parentage\",\"category_ids\":[6442450944]},\"child_categories\":[{\"category_id\":\"220\",\"category_name\":\"儿童文学\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/5fcc3f5f30d2282d3bb49e127a4faccd~tplv-noop.image\"},{\"category_id\":\"225\",\"category_name\":\"胎教早教\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/a5d35d428a531830a3cb5d822e80d793~tplv-noop.image\"},{\"category_id\":\"365\",\"category_name\":\"其他亲子\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/24f96a335aaf9c06bb823cf1c4e1055c~tplv-noop.image\"},{\"category_id\":\"223\",\"category_name\":\"科普\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/c4a73217d654ab8db9b9801a77252537~tplv-noop.image\"},{\"category_id\":\"224\",\"category_name\":\"国学历史\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/c644b29ea548c2183e3b87d4a1ed7093~tplv-noop.image\"},{\"category_id\":\"130\",\"category_name\":\"儿童歌曲\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/42c9b9e24ca091374075eba5140111fb~tplv-noop.image\"},{\"category_id\":\"131\",\"category_name\":\"儿童成长\",\"icon\":\"http://p6-tt.byteimg.com/origin/novel-images/88140ee1f3ee81e47c16265acec8c0df\"},{\"category_id\":\"222\",\"category_name\":\"儿童英语\",\"icon\":\"http://p3-novel.byteimg.com/novel-static/a1dcb90bbd1f23ad4641ff3d11e5cc59~tplv-noop.image\"},{\"category_id\":\"228\",\"category_name\":\"亲子健康\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/7a2e24d19ad87182812806f2e6b6e350~tplv-noop.image\"},{\"category_id\":\"227\",\"category_name\":\"孕产健康\",\"icon\":\"http://p6-novel.byteimg.com/novel-static/4b3a8d21ffbc2356d308670768e99432~tplv-noop.image\"}]}]},\"log_id\":\"202607021430287AFA51ACDFE3B5CE6667\",\"message\":\"success\"};\n\nif (data.data && data.data.category_tree) {\n    var tree = data.data.category_tree;\n    tree.forEach(function(parent) {\n        var parentName = parent.parent_category.category_name;\n var parentName = '🐱' + parentName + '  全部分类🐱'; \n var tag = parent.parent_category.tag;\n  \n        push(parentName, null, 1, 1);\n        parent.child_categories.forEach(function(child) {\n            var url = 'https://novel.snssdk.com/api/novel/channel/homepage/new_category/book_list/v1/?sdk_type=2&from_scene=201&parent_category_tag=' + tag +'&device_platform=android&os=android&ssmix=a&aid=13&app_name=news_article_lite&version_code=160900&version_name=16.9.0&manifest_version_code=16900&update_version_code=169006&ab_client=a1%2Ce1%2Cf2%2Cg2%2Cf7&ab_group=z1&ab_feature=z1&abflag=3&language=zh&os_api=32&os_version=12&ac=wifi&current_launch_mode=enter_launch&current_launch_mode_hot=enter_launch&today_first_launch_mode=enter_launch&sa_enable=0&openlive_plugin_status=0&isTTWebView=0&host_abi=arm64-v8a&dq_param=0&isTTWebViewHeifSupport=0&plugin_state=608039325409296&cli_default_category=__all__&rom_version=32&limit=20&offset={{(page-1)*20}}&category_id=' + child.category_id;\n            push(child.category_name, url, 1, 0.25);\n        });\n    });\n}\n\nJSON.stringify(sort)", "respondTime": 180000, "ruleBookInfo": {"author": "author", "coverUrl": "thumb_url", "init": "data[0]", "intro": "&nbsp;&nbsp;\n📕 源名：{{$.original_book_name}}\n📖 别名：{{$.book_flight_alias_name}}\n✏️ 开坑：{{$.create_time##T|\\+.*## }}\n🏷️ 标签：{{$.tags}}\n👤 主角：{{$.roles##\\[|\\\"|\\]}}\n👁️ 在线：{{$.read_count}}人在读\n🔗 书籍状态：__status__{{\"\\n\"+\"​\"}}\n📜 简介：{{$.abstract}}{{\"\\n\"+\"​\"}}\n\n\n\n📍 {{$.copyright_info##，.*##。}}{{\"\\n\"+\"​\"}}\n@js:result.replace(/.+：(人在读)?\\n/g,\"\").replace('__status__', (java.getString('$.book_search_visible') == 'true' ? '正常' : (java.getString('$.tomato_book_status') == '3' ? '下架' : '小黑屋')))", "kind": "{{$.category}}\n{{$.score}}分\n连载{{$.creation_status}}完结\n{{$.sub_info}}\n@js:result.replace(/连载0完结/g,'完结').replace(/连载1完结/g,'连载').replace(/连载4完结/g,'已断更').replace(/连载-1完结/g,'完结')", "lastChapter": "{{$.last_chapter_title}} • {{java.timeFormat(java.getString('last_chapter_update_time')*1000)}}", "name": "original_book_name@put:{book_id:book_id}", "tocUrl": "https://fanqienovel.com/api/reader/directory/detail?bookId=@get:{book_id}", "wordCount": "word_number"}, "ruleContent": {"content": "@js:(function(){\nfunction getMainUrl(jsonStr) {\n  try {\n    var data = JSON.parse(String(jsonStr));\n    if (data.data && Array.isArray(data.data) && data.data.length > 0) {\n      var first = data.data[0];\n      if (first && first.main_url) return first.main_url;\n    }\n    var infos = (data.data && data.data.video_model_infos) || [];\n    var i;\n    var j;\n    var info;\n    var model;\n    var videoList;\n    for (i = 0; i < infos.length; i++) {\n      info = infos[i];\n      if (!info.video_model) continue;\n      model = JSON.parse(info.video_model);\n      videoList = model.video_list || [];\n      for (j = 0; j < videoList.length; j++) {\n        if (videoList[j] && videoList[j].main_url) return videoList[j].main_url;\n      }\n    }\n  } catch (e) {\n    return null;\n  }\n  return null;\n}\nvar currentUrl = (typeof chapter !== \"undefined\" && chapter && chapter.url) ? chapter.url : ((typeof baseUrl !== \"undefined\" && baseUrl) ? baseUrl : \"\");\nvar itemMatch = String(currentUrl).match(/item_id=(\\d+)/);\nvar itemId = itemMatch ? itemMatch[1] : String(currentUrl).replace(/[^0-9]/g, \"\");\nif (itemId === \"\") return \"未找到章节ID\";\nvar playinfoUrl = \"https://reading.snssdk.com/reading/reader/audio/playinfo/?tone_id=0&item_ids=\" + itemId + \"&pv_player=-1&aid=3040&device_platform=android\";\nvar errorMessage = \"\";\ntry {\n  var signedHeaders = fanqieSignHeaders(playinfoUrl, null);\n  var responseBody = java.connect(playinfoUrl, JSON.stringify(signedHeaders)).body();\n  var audioUrl = getMainUrl(responseBody);\n  if (audioUrl) return audioUrl;\n} catch (e2) {\n  errorMessage = e2.message || String(e2);\n}\nreturn errorMessage ? \"获取音频失败：\" + errorMessage : \"未找到音频链接\";\n})()", "replaceRegex": "##\"$##"}, "ruleExplore": {"author": "番茄畅听{{$.author}}", "bookList": "$..data[*]", "bookUrl": "@js:(function(){var u='https://api5-sinfonlinec.jxbhmy.com/reading/bookapi/multi-detail/v/?device_platform=ios&aid=13&iid=1&version_code=999&book_id='+(result.book_id||result.series_id);var h=fanqieSignHeaders(u,null);return u+',{\"headers\":'+JSON.stringify(h)+'}';})()", "coverUrl": "$.thumb_url", "intro": "$.abstract", "kind": "{{$.category_tags[0].CategoryName}},{{$.category_tags[1].CategoryName}},评分{{$.score}}", "lastChapter": "$.chapter_number", "name": "$.book_name", "wordCount": "stat_rank_desc"}, "ruleSearch": {"author": "{{$.author}} 共{{$.serial_count}}集", "bookList": "<js>\nlet res = JSON.parse(result);\nlet book_list = [];\nif (res.data.search_data) {\n  for (let item of res.data.search_data) {\n    if (item.books && Array.isArray(item.books)) {\n      book_list = book_list.concat(item.books);\n    }\n  }\n}\nJSON.stringify(book_list)\n</js>$[*]", "bookUrl": "https://api.jxbhmy.com/reading/bookapi/multi-detail/v/?aid=13&iid=1&version_code=999&book_id={{$.book_id}}", "checkKeyWord": "十日终焉", "coverUrl": "thumb_url", "intro": "abstract", "kind": "tags", "name": "book_name||$..series_title##（别名：.*?）", "wordCount": "{{$.secondary_info_list[0].content}}"}, "ruleToc": {"chapterList": "$.data.chapterListWithVolume[*].*", "chapterName": "$.title", "chapterUrl": "https://mcs.zijieapi.com/list?item_id={{$.itemId}}", "updateTime": "发布于 {{java.timeFormat(java.getString('$.firstPassTime')*1000)}}"}, "searchUrl": "@js:\nvar query = key;\nvar tab_type = 2;\nvar offset = (page - 1) * 20;\nvar limit = 20;\nvar url = 'https://api5-lite-sinfonlinec.novelfm.com/novelfm/bookmall/search/page/v1/?aid=3040&update_version_code=65432&device_platform=android';\nvar body = JSON.stringify({query: query, offset: offset, limit: limit, tab_type: tab_type});\nvar headers = fanqieSignHeaders(url, body);\nheaders['Content-Type'] = 'application/json; charset=utf-8';\nurl + ',{\"method\":\"POST\",\"body\":' + JSON.stringify(body) + ',\"headers\":' + JSON.stringify(headers) + '}'", "weight": 0, "jsLib": "var ガて=(function(){var ﾌォ=!![];return function(ヸぜ,ざト){var ｸザ=ﾌォ?function(){if(ざト){var こシ=ざト['\\x61\\x70\\x70\\x6c'+'\\x79'](ヸぜ,arguments);return ざト=null,こシ;}}:function(){};return ﾌォ=![],ｸザ;};}()),ｰぱ=ガて(this,function(){var ほゖ={};ほゖ['\\x45\\x50\\x66\\x65'+'\\x66']=function(ゅぱ,とっ){return ゅぱ!==とっ;},ほゖ['\\x73\\x6e\\x77\\x51'+'\\x69']='\\x28\\x28\\x28\\x2e'+'\\x2b\\x29\\x2b\\x29'+'\\x2b\\x29\\x2b\\x24';var ﾛる=ほゖ;if(ﾛる['\\x45\\x50\\x66\\x65'+'\\x66'](ｰぱ['\\x62\\x69\\x6e\\x64']()['\\x74\\x6f\\x53\\x74'+'\\x72\\x69\\x6e\\x67']()['\\x69\\x6e\\x64\\x65'+'\\x78\\x4f\\x66']('\\x0a'),-(0x1*0x1bfb+-0x171b+-0x4df)))return;return ｰぱ['\\x74\\x6f\\x53\\x74'+'\\x72\\x69\\x6e\\x67']()['\\x73\\x65\\x61\\x72'+'\\x63\\x68'](ﾛる['\\x73\\x6e\\x77\\x51'+'\\x69'])['\\x74\\x6f\\x53\\x74'+'\\x72\\x69\\x6e\\x67']()['\\x63\\x6f\\x6e\\x73'+'\\x74\\x72\\x75\\x63'+'\\x74\\x6f\\x72'](ｰぱ)['\\x73\\x65\\x61\\x72'+'\\x63\\x68'](ﾛる['\\x73\\x6e\\x77\\x51'+'\\x69']);});ｰぱ();function あいうえ(ヅｩ){var ジシ={};ジシ['\\x61\\x52\\x5a\\x77'+'\\x49']=function(ヅヷ,ェそ){return ヅヷ<ェそ;},ジシ['\\x74\\x63\\x50\\x62'+'\\x41']=function(るも,にリ){return るも^にリ;},ジシ['\\x58\\x71\\x56\\x70'+'\\x42']=function(ぶぢ,ヂｰ){return ぶぢ^ヂｰ;},ジシ['\\x61\\x65\\x62\\x6a'+'\\x58']=function(ﾂら,ジれ){return ﾂら+ジれ;},ジシ['\\x68\\x48\\x72\\x47'+'\\x41']=function(ゑﾑ,ナゎ){return ゑﾑ+ナゎ;},ジシ['\\x66\\x6c\\x7a\\x74'+'\\x69']=function(ｦぢ,ﾉほ){return ｦぢ<ﾉほ;},ジシ['\\x44\\x63\\x79\\x49'+'\\x62']=function(ﾔゔ,ﾖﾚ){return ﾔゔ+ﾖﾚ;};var ハげ=ジシ,ﾉテ=[],ツよ=0x17cc+0x360+0x5e*-0x4a,ぽク=ヅｩ['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68'],ヲフ=[];for(;ハげ['\\x61\\x52\\x5a\\x77'+'\\x49'](ツよ,ぽク);ツよ+=-0x7e9+0x6de+0x10e){ﾉテ['\\x70\\x75\\x73\\x68'](ハげ['\\x74\\x63\\x50\\x62'+'\\x41'](ハげ['\\x58\\x71\\x56\\x70'+'\\x42'](ヅｩ[ツよ],ヅｩ[ハげ['\\x61\\x65\\x62\\x6a'+'\\x58'](ツよ,0x2643+0xe72+-0x34b4)]),ヅｩ[ハげ['\\x68\\x48\\x72\\x47'+'\\x41'](ツよ,0x89a+-0x17a1+0xf09)]));}for(var おオ=0x2093+0x39*-0x56+-0xd6d;ハげ['\\x66\\x6c\\x7a\\x74'+'\\x69'](おオ,ﾉテ['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68']);おオ+=0x1*0x19e2+0x45*0x2a+0x214c*-0x1){ヲフ['\\x70\\x75\\x73\\x68'](ハげ['\\x61\\x65\\x62\\x6a'+'\\x58']('',String['\\x66\\x72\\x6f\\x6d'+'\\x43\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65']['\\x61\\x70\\x70\\x6c'+'\\x79'](null,ﾉテ['\\x73\\x6c\\x69\\x63'+'\\x65'](おオ,ハげ['\\x44\\x63\\x79\\x49'+'\\x62'](おオ,-0x2cf*0x7+0x1e74+-0x1*0x6e3)))));}return ヲフ['\\x6a\\x6f\\x69\\x6e']('');};function fanqieU32(なハ){var よと={};よと['\\x74\\x41\\x52\\x46'+'\\x48']=function(ぺダ,ケﾂ){return ぺダ>>>ケﾂ;};var るﾃ=よと;return るﾃ['\\x74\\x41\\x52\\x46'+'\\x48'](なハ,-0xc63+0x3a6+-0x8bd*-0x1);}function fanqieXor64(ヮゐ,ヺｶ){var マﾇ={'\\x56\\x6e\\x4f\\x6c\\x58':function(ﾏｵ,フロ){return ﾏｵ(フロ);},'\\x68\\x59\\x6b\\x4c\\x4a':function(あま,ルﾊ){return あま^ルﾊ;},'\\x42\\x50\\x70\\x58\\x69':function(ｦゐ,こメ){return ｦゐ(こメ);},'\\x4d\\x48\\x4a\\x56\\x76':function(ゅﾛ,ュね){return ゅﾛ^ュね;}};return[マﾇ['\\x56\\x6e\\x4f\\x6c'+'\\x58'](fanqieU32,マﾇ['\\x68\\x59\\x6b\\x4c'+'\\x4a'](ヮゐ[-0x1605+0x1*0x5e9+0x101c],ヺｶ[0x5a7+-0x2504+-0x1*-0x1f5d])),マﾇ['\\x42\\x50\\x70\\x58'+'\\x69'](fanqieU32,マﾇ['\\x4d\\x48\\x4a\\x56'+'\\x76'](ヮゐ[0x1f1f+-0x18ad+-0x1*0x671],ヺｶ[0xbad+0x18*-0xe9+0xa2c]))];}function fanqieAnd64(ブけ,ギち){var には={'\\x62\\x49\\x49\\x52\\x68':function(ｳぉ,ヹル){return ｳぉ(ヹル);},'\\x61\\x6a\\x70\\x4b\\x78':function(ﾖｿ,ヰた){return ﾖｿ&ヰた;},'\\x53\\x51\\x64\\x6e\\x52':function(ｾエ,ﾅﾁ){return ｾエ(ﾅﾁ);}};return[には['\\x62\\x49\\x49\\x52'+'\\x68'](fanqieU32,には['\\x61\\x6a\\x70\\x4b'+'\\x78'](ブけ[-0xe5a+-0x20*0x94+-0x2*-0x106d],ギち[-0x162b+-0x21*0x81+0x26cc])),には['\\x53\\x51\\x64\\x6e'+'\\x52'](fanqieU32,には['\\x61\\x6a\\x70\\x4b'+'\\x78'](ブけ[0x4b*0x4a+-0x3*0xa3d+0x90a],ギち[-0x2113+-0x12*-0x24+-0x4*-0x7a3]))];}function fanqieNot64(ざざ){var マﾗ={'\\x6a\\x72\\x41\\x56\\x6b':function(ヤゆ,ぞゆ){return ヤゆ(ぞゆ);}};return[マﾗ['\\x6a\\x72\\x41\\x56'+'\\x6b'](fanqieU32,~ざざ[0x271+-0xf*0x1c5+0x181a]),マﾗ['\\x6a\\x72\\x41\\x56'+'\\x6b'](fanqieU32,~ざざ[0x5ce+-0x216d*0x1+0x1ba0])];}function fanqieAdd64(ゃグ,ﾋま){var ﾊﾑ={'\\x6d\\x54\\x56\\x67\\x65':function(こセ,リﾔ){return こセ+リﾔ;},'\\x77\\x6c\\x67\\x56\\x6f':function(ゖさ,ﾗし){return ゖさ>=ﾗし;},'\\x78\\x61\\x56\\x45\\x7a':function(をゲ,フﾒ){return をゲ(フﾒ);},'\\x71\\x77\\x63\\x66\\x6c':function(びト,ｻボ){return びト(ｻボ);},'\\x48\\x70\\x72\\x46\\x61':function(ぺぜ,ｪぇ){return ぺぜ+ｪぇ;}},きィ=ﾊﾑ['\\x6d\\x54\\x56\\x67'+'\\x65'](ゃグ[-0x366+0x4*0x6b0+-0x175a],ﾋま[-0x1d7c+-0x1b8a+0x3906]),ｬね=ﾊﾑ['\\x77\\x6c\\x67\\x56'+'\\x6f'](きィ,-0x1cb3f8e04+0x113fae7f8*0x1+-0x5*-0x57da879c)?0x1415+0xa2e+-0x1*0x1e42:-0x408+-0x1*0x23d3+0x27db;return[ﾊﾑ['\\x78\\x61\\x56\\x45'+'\\x7a'](fanqieU32,きィ),ﾊﾑ['\\x71\\x77\\x63\\x66'+'\\x6c'](fanqieU32,ﾊﾑ['\\x48\\x70\\x72\\x46'+'\\x61'](ﾊﾑ['\\x48\\x70\\x72\\x46'+'\\x61'](ゃグ[-0x148e+-0x4*-0x287+0xa73],ﾋま[0x3*0xa0d+-0x1450+-0x9d6*0x1]),ｬね))];}function fanqieRotl64(ヱぇ,ゆｵ){var トン={'\\x53\\x47\\x79\\x41\\x75':'\\x31\\x7c\\x30\\x7c'+'\\x34\\x7c\\x33\\x7c'+'\\x32','\\x67\\x68\\x61\\x6e\\x64':function(ッヂ,ヘぢ){return ッヂ===ヘぢ;},'\\x59\\x4b\\x4a\\x4c\\x68':function(ポソ,ォボ){return ポソ(ォボ);},'\\x53\\x4c\\x55\\x62\\x64':function(リテ,ナヨ){return リテ|ナヨ;},'\\x71\\x47\\x42\\x72\\x47':function(うｾ,ゎﾏ){return うｾ<<ゎﾏ;},'\\x44\\x54\\x43\\x4a\\x55':function(ｬそ,ぬぷ){return ｬそ>>>ぬぷ;},'\\x77\\x45\\x76\\x69\\x41':function(サｿ,ｲョ){return サｿ-ｲョ;},'\\x6e\\x59\\x59\\x51\\x67':function(ｯを,ｬユ){return ｯを<<ｬユ;},'\\x76\\x4d\\x4b\\x72\\x72':function(わざ,ゴっ){return わざ>>>ゴっ;},'\\x4c\\x73\\x6a\\x64\\x61':function(ﾑぬ,つヶ){return ﾑぬ-つヶ;},'\\x67\\x45\\x6e\\x5a\\x57':function(べほ,っふ){return べほ>っふ;},'\\x57\\x68\\x76\\x53\\x45':function(ﾜゴ,へｦ,ンゲ){return ﾜゴ(へｦ,ンゲ);},'\\x79\\x42\\x67\\x53\\x73':function(ｧゾ,クょ){return ｧゾ===クょ;}},ﾕぉ=トン['\\x53\\x47\\x79\\x41'+'\\x75']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),ソく=0x1053+0xdb*-0x3+-0xdc2;while(!![]){switch(ﾕぉ[ソく++]){case'\\x30':if(トン['\\x67\\x68\\x61\\x6e'+'\\x64'](ゆｵ,-0x1*0x6ca+0x16*-0x6f+0x6e*0x26))return[ヱぇ[-0x158*-0xc+0x18*0x188+-0x34e0],ヱぇ[0x1ac0+-0x65*0x44+-0x3*-0x7]];continue;case'\\x31':ゆｵ%=0x207+0x262e+-0x27f5;continue;case'\\x32':return[トン['\\x59\\x4b\\x4a\\x4c'+'\\x68'](fanqieU32,トン['\\x53\\x4c\\x55\\x62'+'\\x64'](トン['\\x71\\x47\\x42\\x72'+'\\x47'](ヱぇ[-0x26e1+0xe3*0x1a+0xfd3],ゆｵ),トン['\\x44\\x54\\x43\\x4a'+'\\x55'](ヱぇ[-0xa12+0x23b3+-0x19a0],トン['\\x77\\x45\\x76\\x69'+'\\x41'](-0x1*-0x230c+-0x83*-0x47+0x1*-0x4741,ゆｵ)))),トン['\\x59\\x4b\\x4a\\x4c'+'\\x68'](fanqieU32,トン['\\x53\\x4c\\x55\\x62'+'\\x64'](トン['\\x6e\\x59\\x59\\x51'+'\\x67'](ヱぇ[0x9*0x3ee+-0x4*-0x833+-0x4429*0x1],ゆｵ),トン['\\x76\\x4d\\x4b\\x72'+'\\x72'](ヱぇ[0x1*-0x1529+0x1b*0xf1+-0x442],トン['\\x4c\\x73\\x6a\\x64'+'\\x61'](-0x2*-0xaf2+-0x623*0x5+-0x2f9*-0x3,ゆｵ))))];case'\\x33':if(トン['\\x67\\x45\\x6e\\x5a'+'\\x57'](ゆｵ,-0x1a09+-0x1c43+0x1224*0x3))return トン['\\x57\\x68\\x76\\x53'+'\\x45'](fanqieRotl64,[ヱぇ[0x12b0+0x12d8+-0x1*0x2587],ヱぇ[-0x1bfa+-0x2e4*-0xd+0x1*-0x99a]],トン['\\x4c\\x73\\x6a\\x64'+'\\x61'](ゆｵ,0x11*0xfb+0x1*-0x1de7+0xd5c));continue;case'\\x34':if(トン['\\x79\\x42\\x67\\x53'+'\\x73'](ゆｵ,-0xbf2+-0xcc2*0x3+0x18*0x219))return[ヱぇ[-0xaf4+0x89*0x45+0x67e*-0x4],ヱぇ[-0x47f+-0x22ac+-0x272b*-0x1]];continue;}break;}}function fanqieRotr64(ぉヱ,マぜ){var ナゾ={'\\x69\\x56\\x50\\x41\\x71':function(ぉや,ぱﾒ){return ぉや===ぱﾒ;},'\\x7a\\x4a\\x4a\\x5a\\x77':function(でゲ,ピヲ,ほワ){return でゲ(ピヲ,ほワ);},'\\x47\\x4c\\x4e\\x51\\x49':function(ヅサ,ｧゃ){return ヅサ-ｧゃ;}};return マぜ%=0xef2*0x1+-0xe17+-0x9b,ナゾ['\\x69\\x56\\x50\\x41'+'\\x71'](マぜ,-0x1d5d*0x1+-0x13d*-0x19+-0x1*0x198)?[ぉヱ[-0x748*-0x3+0x1*0x1196+-0x276e],ぉヱ[0x143a+0x6aa*-0x2+0x1*-0x6e5]]:ナゾ['\\x7a\\x4a\\x4a\\x5a'+'\\x77'](fanqieRotl64,ぉヱ,ナゾ['\\x47\\x4c\\x4e\\x51'+'\\x49'](-0x1fdc+-0x2*-0x108d+-0xfe,マぜ));}function fanqieLoadLe64(ゑく){var ﾇゃ={'\\x56\\x6e\\x57\\x53\\x70':function(ゆタ,バシ){return ゆタ(バシ);},'\\x57\\x4f\\x46\\x74\\x77':function(ヅダ,ヴイ){return ヅダ|ヴイ;},'\\x57\\x7a\\x77\\x68\\x61':function(かぇ,テモ){return かぇ|テモ;},'\\x69\\x4c\\x42\\x6e\\x70':function(ﾓば,ｸﾕ){return ﾓば|ｸﾕ;},'\\x46\\x72\\x65\\x66\\x56':function(みﾐ,のじ){return みﾐ<<のじ;},'\\x7a\\x56\\x6d\\x77\\x57':function(ﾙォ,ォゃ){return ﾙォ<<ォゃ;},'\\x6e\\x69\\x58\\x4a\\x77':function(ェひ,ホギ){return ェひ<<ホギ;}};return[ﾇゃ['\\x56\\x6e\\x57\\x53'+'\\x70'](fanqieU32,ﾇゃ['\\x57\\x4f\\x46\\x74'+'\\x77'](ﾇゃ['\\x57\\x7a\\x77\\x68'+'\\x61'](ﾇゃ['\\x69\\x4c\\x42\\x6e'+'\\x70'](ゑく['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](0xe98*0x1+0x6a*0x34+-0x2420),ﾇゃ['\\x46\\x72\\x65\\x66'+'\\x56'](ゑく['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](-0x45*0x1f+0x14e*0x19+-0x1842),0x1f52+0x2206+0x1b8*-0x26)),ﾇゃ['\\x46\\x72\\x65\\x66'+'\\x56'](ゑく['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](-0x4*-0x1bc+-0xb9c+0x4ae*0x1),-0xf*-0x7b+0xd75*-0x1+-0x194*-0x4)),ﾇゃ['\\x46\\x72\\x65\\x66'+'\\x56'](ゑく['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](-0x27*0xef+-0x1508+-0x3974*-0x1),-0x2663+0x1e4a+0x1*0x831))),ﾇゃ['\\x56\\x6e\\x57\\x53'+'\\x70'](fanqieU32,ﾇゃ['\\x57\\x7a\\x77\\x68'+'\\x61'](ﾇゃ['\\x57\\x4f\\x46\\x74'+'\\x77'](ﾇゃ['\\x57\\x7a\\x77\\x68'+'\\x61'](ゑく['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](0x22a5+-0x1257+-0x56e*0x3),ﾇゃ['\\x46\\x72\\x65\\x66'+'\\x56'](ゑく['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](0x57c+-0xead+0x83*0x12),0xbfb*-0x2+-0x1*0x156c+0x2d6a)),ﾇゃ['\\x7a\\x56\\x6d\\x77'+'\\x57'](ゑく['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](0x20b7+0x2606+0x46b7*-0x1),-0x16bd+-0x131*0x9+0x2186)),ﾇゃ['\\x6e\\x69\\x58\\x4a'+'\\x77'](ゑく['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](-0x8fb*0x2+0x26e3+-0x14e6),-0x958+0x1*0x19e4+-0x1074)))];}function fanqiePackLe64(うシ){var ヘバ={'\\x75\\x67\\x50\\x6b\\x66':function(ｩｭ,ぞれ){return ｩｭ+ぞれ;},'\\x4a\\x79\\x6c\\x52\\x49':function(いォ,ネエ){return いォ(ネエ);},'\\x65\\x72\\x47\\x70\\x75':function(ネﾖ,ｬと){return ネﾖ(ｬと);}};return ヘバ['\\x75\\x67\\x50\\x6b'+'\\x66'](ヘバ['\\x4a\\x79\\x6c\\x52'+'\\x49'](fanqiePackLe32,うシ[-0x19e2+-0x48b*0x2+0x22f8]),ヘバ['\\x65\\x72\\x47\\x70'+'\\x75'](fanqiePackLe32,うシ[0x40*-0x5f+-0x45c+0x1c1d]));}function fanqieBit(ヱﾙ,ェｿ){var ﾜｮ={};ﾜｮ['\\x59\\x66\\x69\\x71'+'\\x47']=function(ュド,ヲく){return ュド<ヲく;},ﾜｮ['\\x48\\x6a\\x71\\x70'+'\\x4e']=function(ヸぅ,ホヺ){return ヸぅ&ホヺ;},ﾜｮ['\\x64\\x7a\\x6b\\x48'+'\\x6e']=function(れﾜ,ﾆェ){return れﾜ>>>ﾆェ;},ﾜｮ['\\x7a\\x46\\x7a\\x66'+'\\x72']=function(ﾐン,ゼｱ){return ﾐン&ゼｱ;},ﾜｮ['\\x6b\\x6a\\x51\\x7a'+'\\x48']=function(ｦえ,ぞう){return ｦえ-ぞう;};var プぇ=ﾜｮ;return プぇ['\\x59\\x66\\x69\\x71'+'\\x47'](ェｿ,0x13fb+0xd*-0x22a+0x1*0x847)?プぇ['\\x48\\x6a\\x71\\x70'+'\\x4e'](プぇ['\\x64\\x7a\\x6b\\x48'+'\\x6e'](ヱﾙ[0x7f0+0x2309*0x1+-0x2af9],ェｿ),0x149a+0x11e*0x19+0x12f*-0x29):プぇ['\\x7a\\x46\\x7a\\x66'+'\\x72'](プぇ['\\x64\\x7a\\x6b\\x48'+'\\x6e'](ヱﾙ[0x37*0x32+0x2389*-0x1+0x18cc],プぇ['\\x6b\\x6a\\x51\\x7a'+'\\x48'](ェｿ,0x1*0x182f+-0x2396+-0xd*-0xe3)),0x1*0x226b+0x21d4+-0x2*0x221f);}function fanqieHex2bin(イﾗ){var ボイ={'\\x45\\x73\\x4e\\x45\\x76':function(きｫ,ヤピ){return きｫ<ヤピ;},'\\x43\\x66\\x79\\x59\\x4f':function(ェぢ,ポブ,ｿよ){return ェぢ(ポブ,ｿよ);},'\\x54\\x7a\\x44\\x78\\x45':function(ベホ,くｭ){return ベホ+くｭ;}},ﾛｩ='',ヤヱ;for(ヤヱ=0x83*0x43+0x9*0x23d+-0x366e;ボイ['\\x45\\x73\\x4e\\x45'+'\\x76'](ヤヱ,イﾗ['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68']);ヤヱ+=-0x1*0x25ea+0x65c+-0xa*-0x328){ﾛｩ+=String['\\x66\\x72\\x6f\\x6d'+'\\x43\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'](ボイ['\\x43\\x66\\x79\\x59'+'\\x4f'](parseInt,イﾗ['\\x73\\x75\\x62\\x73'+'\\x74\\x72\\x69\\x6e'+'\\x67'](ヤヱ,ボイ['\\x54\\x7a\\x44\\x78'+'\\x45'](ヤヱ,0x24a5+0x1ad3+-0x3f76)),-0xf00+0x1b*-0xb1+0x21bb));}return ﾛｩ;}function fanqieBytes2Hex(ぉこ){var ぴぬ={};ぴぬ['\\x45\\x5a\\x76\\x4f'+'\\x42']='\\x33\\x7c\\x34\\x7c'+'\\x31\\x7c\\x32\\x7c'+'\\x30',ぴぬ['\\x75\\x63\\x6f\\x51'+'\\x63']=function(ゆヷ,フポ){return ゆヷ<フポ;},ぴぬ['\\x50\\x7a\\x63\\x53'+'\\x41']=function(ニボ,ぅﾓ){return ニボ<ぅﾓ;},ぴぬ['\\x4c\\x73\\x41\\x67'+'\\x61']=function(ガｪ,トバ){return ガｪ+トバ;},ぴぬ['\\x46\\x6b\\x76\\x45'+'\\x65']=function(レラ,ヷほ){return レラ-ヷほ;};var みゆ=ぴぬ,ずガ=みゆ['\\x45\\x5a\\x76\\x4f'+'\\x42']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),みせ=-0xb6b+-0x4ff+0x106a;while(!![]){switch(ずガ[みせ++]){case'\\x30':return モｸ;case'\\x31':var ゃワ;continue;case'\\x32':for(ﾅコ=-0x2562+-0x2*0x6cd+0x1a*0x1f6;みゆ['\\x75\\x63\\x6f\\x51'+'\\x63'](ﾅコ,ぉこ['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68']);ﾅコ++){ゃワ=ぉこ['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](ﾅコ)['\\x74\\x6f\\x53\\x74'+'\\x72\\x69\\x6e\\x67'](-0x1d2b+-0x4*0x940+-0x1*-0x423b);if(みゆ['\\x50\\x7a\\x63\\x53'+'\\x41'](ゃワ['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68'],0x2*-0x487+-0x25e4+0x2ef4))ゃワ=みゆ['\\x4c\\x73\\x41\\x67'+'\\x61']('\\x30',ゃワ);モｸ+=ゃワ['\\x73\\x75\\x62\\x73'+'\\x74\\x72\\x69\\x6e'+'\\x67'](みゆ['\\x46\\x6b\\x76\\x45'+'\\x65'](ゃワ['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68'],-0x1acd+0x7*0x68+0x17f7));}continue;case'\\x33':var モｸ='';continue;case'\\x34':var ﾅコ;continue;}break;}}function fanqieBase64Encode(ヮン){var ｴず={};ｴず['\\x45\\x58\\x4f\\x6b'+'\\x71']='\\x35\\x7c\\x36\\x7c'+'\\x30\\x7c\\x37\\x7c'+'\\x32\\x7c\\x31\\x7c'+'\\x34\\x7c\\x33',ｴず['\\x72\\x47\\x59\\x62'+'\\x42']=function(ぷド,ｯｦ){return ぷド<ｯｦ;},ｴず['\\x53\\x6b\\x4d\\x4f'+'\\x50']='\\x32\\x7c\\x34\\x7c'+'\\x35\\x7c\\x36\\x7c'+'\\x33\\x7c\\x31\\x7c'+'\\x30',ｴず['\\x6b\\x75\\x47\\x61'+'\\x79']=function(ぞざ,ｫみ){return ぞざ&ｫみ;},ｴず['\\x4e\\x52\\x79\\x68'+'\\x47']=function(るず,ｷャ){return るず|ｷャ;},ｴず['\\x5a\\x6e\\x75\\x65'+'\\x55']=function(タェ,あヵ){return タェ<<あヵ;},ｴず['\\x4e\\x6a\\x43\\x73'+'\\x72']=function(たむ,エｭ){return たむ>>エｭ;},ｴず['\\x45\\x68\\x6a\\x57'+'\\x55']=function(テヒ,ズも){return テヒ<<ズも;},ｴず['\\x4b\\x68\\x5a\\x58'+'\\x50']=function(つｧ,ｷぎ){return つｧ<ｷぎ;},ｴず['\\x78\\x6e\\x4e\\x56'+'\\x7a']=function(ノケ,ゐｻ){return ノケ&ゐｻ;},ｴず['\\x58\\x68\\x53\\x47'+'\\x56']=function(ぱﾔ,ぱタ){return ぱﾔ<ぱタ;},ｴず['\\x65\\x59\\x4f\\x58'+'\\x51']=function(ろン,ルと){return ろン&ルと;},ｴず['\\x51\\x76\\x53\\x6e'+'\\x59']='\\x41\\x42\\x43\\x44'+'\\x45\\x46\\x47\\x48'+'\\x49\\x4a\\x4b\\x4c'+'\\x4d\\x4e\\x4f\\x50'+'\\x51\\x52\\x53\\x54'+'\\x55\\x56\\x57\\x58'+'\\x59\\x5a\\x61\\x62'+'\\x63\\x64\\x65\\x66'+'\\x67\\x68\\x69\\x6a'+'\\x6b\\x6c\\x6d\\x6e'+'\\x6f\\x70\\x71\\x72'+'\\x73\\x74\\x75\\x76'+'\\x77\\x78\\x79\\x7a'+'\\x30\\x31\\x32\\x33'+'\\x34\\x35\\x36\\x37'+'\\x38\\x39\\x2b\\x2f';var ﾛﾒ=ｴず,らｨ=ﾛﾒ['\\x45\\x58\\x4f\\x6b'+'\\x71']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),ヨチ=-0x1444+-0x16b2+0x2af6;while(!![]){switch(らｨ[ヨチ++]){case'\\x30':var ぱぷ=-0x7*0x11a+-0x413*0x1+0x1*0xbc9;continue;case'\\x31':var ｭヂ;continue;case'\\x32':var ﾜィ;continue;case'\\x33':return かョ;case'\\x34':while(ﾛﾒ['\\x72\\x47\\x59\\x62'+'\\x42'](ぱぷ,ヮン['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68'])){var ｵが=ﾛﾒ['\\x53\\x6b\\x4d\\x4f'+'\\x50']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),ﾝス=0xf22+-0x48d+0x7*-0x183;while(!![]){switch(ｵが[ﾝス++]){case'\\x30':かョ+=ﾛﾒ['\\x72\\x47\\x59\\x62'+'\\x42'](ｭヂ,-0x10e1+-0x4*-0x247+0x3*0x297)?'\\x3d':やェ['\\x63\\x68\\x61\\x72'+'\\x41\\x74'](ﾛﾒ['\\x6b\\x75\\x47\\x61'+'\\x79'](ｭヂ,-0x186*0x9+0x8ef+0x506));continue;case'\\x31':かョ+=ﾛﾒ['\\x72\\x47\\x59\\x62'+'\\x42'](ﾜィ,0x1d55+0x2272+-0x3fc7)?'\\x3d':やェ['\\x63\\x68\\x61\\x72'+'\\x41\\x74'](ﾛﾒ['\\x4e\\x52\\x79\\x68'+'\\x47'](ﾛﾒ['\\x5a\\x6e\\x75\\x65'+'\\x55'](ﾛﾒ['\\x6b\\x75\\x47\\x61'+'\\x79'](ﾜィ,-0xd61+-0x4*-0x4bf+-0x58c),-0x25a4+0x833*-0x4+0x7f*0x8e),ﾛﾒ['\\x72\\x47\\x59\\x62'+'\\x42'](ｭヂ,-0x547+-0xd11+-0x92c*-0x2)?0x20f+0x13e9+-0x15f8:ﾛﾒ['\\x4e\\x6a\\x43\\x73'+'\\x72'](ｭヂ,0x1*0x38b+-0xa*0x122+0x1*0x7cf)));continue;case'\\x32':ｷゆ=ﾛﾒ['\\x6b\\x75\\x47\\x61'+'\\x79'](ヮン['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](ぱぷ++),-0x1ed+-0x2d+0x319);continue;case'\\x33':かョ+=やェ['\\x63\\x68\\x61\\x72'+'\\x41\\x74'](ﾛﾒ['\\x4e\\x52\\x79\\x68'+'\\x47'](ﾛﾒ['\\x45\\x68\\x6a\\x57'+'\\x55'](ﾛﾒ['\\x6b\\x75\\x47\\x61'+'\\x79'](ｷゆ,-0x18c*-0xb+-0x1dc5+0x4*0x331),0x1*0x3f1+-0x566*-0x1+-0x953),ﾛﾒ['\\x72\\x47\\x59\\x62'+'\\x42'](ﾜィ,-0x17e*-0x17+0x1*-0x10fc+0x13d*-0xe)?0xdec+0x1733*-0x1+0x1db*0x5:ﾛﾒ['\\x4e\\x6a\\x43\\x73'+'\\x72'](ﾜィ,-0x23d+0xfef+0x2*-0x6d7)));continue;case'\\x34':ﾜィ=ﾛﾒ['\\x4b\\x68\\x5a\\x58'+'\\x50'](ぱぷ,ヮン['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68'])?ﾛﾒ['\\x78\\x6e\\x4e\\x56'+'\\x7a'](ヮン['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](ぱぷ++),-0x1f78+0x119c+0xedb):-(0x52*-0xd+0x20f8+0x1*-0x1ccd);continue;case'\\x35':ｭヂ=ﾛﾒ['\\x58\\x68\\x53\\x47'+'\\x56'](ぱぷ,ヮン['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68'])?ﾛﾒ['\\x65\\x59\\x4f\\x58'+'\\x51'](ヮン['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](ぱぷ++),0x3aa+-0x974*-0x3+-0x263*0xd):-(-0x1aba*-0x1+0x107*0x3+-0x1dce);continue;case'\\x36':かョ+=やェ['\\x63\\x68\\x61\\x72'+'\\x41\\x74'](ﾛﾒ['\\x4e\\x6a\\x43\\x73'+'\\x72'](ｷゆ,-0x120b+-0x29*-0x94+-0x5a7));continue;}break;}}continue;case'\\x35':var やェ=ﾛﾒ['\\x51\\x76\\x53\\x6e'+'\\x59'];continue;case'\\x36':var かョ='';continue;case'\\x37':var ｷゆ;continue;}break;}}function fanqieZeros(ﾆﾘ){var ラﾄ={};ラﾄ['\\x4c\\x76\\x77\\x72'+'\\x54']=function(ｼﾏ,ロﾈ){return ｼﾏ<ロﾈ;};var ｪﾅ=ラﾄ,しり='',ゎﾈ;for(ゎﾈ=-0x2145+0x7*-0x58d+-0x1*-0x4820;ｪﾅ['\\x4c\\x76\\x77\\x72'+'\\x54'](ゎﾈ,ﾆﾘ);ゎﾈ++)しり+='\\x00';return しり;}function fanqieUtf8(やヮ){var げク={};げク['\\x58\\x41\\x68\\x58'+'\\x43']='\\x30\\x7c\\x31\\x7c'+'\\x34\\x7c\\x33\\x7c'+'\\x32\\x7c\\x35',げク['\\x54\\x49\\x59\\x46'+'\\x47']=function(ヤャ,ュト){return ヤャ<ュト;},げク['\\x62\\x44\\x51\\x49'+'\\x4b']=function(ぅブ,ぢテ){return ぅブ>=ぢテ;},げク['\\x51\\x65\\x7a\\x6d'+'\\x75']=function(パｦ,ﾚぢ){return パｦ<=ﾚぢ;},げク['\\x42\\x54\\x77\\x59'+'\\x67']=function(ッォ,チバ){return ッォ<チバ;},げク['\\x64\\x5a\\x6a\\x79'+'\\x48']=function(クチ,めﾜ){return クチ+めﾜ;},げク['\\x65\\x79\\x63\\x4d'+'\\x72']=function(エｿ,ぎﾀ){return エｿ+ぎﾀ;},げク['\\x64\\x71\\x74\\x53'+'\\x42']=function(ぼボ,ゑぬ){return ぼボ>=ゑぬ;},げク['\\x78\\x56\\x66\\x72'+'\\x79']=function(おｿ,むも){return おｿ+むも;},げク['\\x43\\x5a\\x44\\x69'+'\\x7a']=function(ﾄぬ,ぬﾛ){return ﾄぬ<<ぬﾛ;},げク['\\x4b\\x61\\x4b\\x42'+'\\x48']=function(そカ,ザノ){return そカ-ザノ;},げク['\\x48\\x67\\x4a\\x43'+'\\x65']=function(ポす,ャヮ){return ポす-ャヮ;},げク['\\x67\\x78\\x7a\\x7a'+'\\x76']=function(チぉ,ぽズ){return チぉ<ぽズ;},げク['\\x41\\x6a\\x4a\\x43'+'\\x55']=function(ャッ,ェソ){return ャッ|ェソ;},げク['\\x62\\x6e\\x75\\x63'+'\\x49']=function(ヸモ,ｰィ){return ヸモ>>ｰィ;},げク['\\x58\\x79\\x65\\x58'+'\\x62']=function(ヰこ,ユブ){return ヰこ|ユブ;},げク['\\x57\\x78\\x4e\\x6e'+'\\x5a']=function(ソニ,つゔ){return ソニ&つゔ;},げク['\\x6a\\x61\\x6c\\x77'+'\\x4f']=function(ｪｺ,ヱゾ){return ｪｺ|ヱゾ;},げク['\\x54\\x59\\x48\\x4b'+'\\x48']=function(びゃ,プｱ){return びゃ|プｱ;},げク['\\x64\\x56\\x6d\\x6c'+'\\x48']=function(ｼじ,いぺ){return ｼじ&いぺ;},げク['\\x51\\x77\\x42\\x75'+'\\x75']=function(るｫ,ぼﾁ){return るｫ|ぼﾁ;},げク['\\x45\\x68\\x4b\\x4a'+'\\x4d']=function(ふホ,がゾ){return ふホ&がゾ;},げク['\\x58\\x6d\\x51\\x6c'+'\\x75']=function(ﾛﾊ,すや){return ﾛﾊ|すや;},げク['\\x62\\x64\\x67\\x65'+'\\x58']=function(ワｾ,ゑｶ){return ワｾ&ゑｶ;},げク['\\x4b\\x6a\\x68\\x43'+'\\x6d']=function(タｦ,どほ){return タｦ>>どほ;},げク['\\x73\\x56\\x4a\\x49'+'\\x74']=function(ゑヴ,パャ){return ゑヴ|パャ;},げク['\\x41\\x76\\x48\\x52'+'\\x41']=function(ヅﾕ,ヂヅ){return ヅﾕ&ヂヅ;},げク['\\x43\\x4d\\x72\\x59'+'\\x50']=function(ィｶ,ﾊァ){return ィｶ&ﾊァ;};var スづ=げク,リｹ=スづ['\\x58\\x41\\x68\\x58'+'\\x43']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),ビゖ=0x12f0+0x1*0x6fb+0x5*-0x52f;while(!![]){switch(リｹ[ビゖ++]){case'\\x30':var ヮレ='';continue;case'\\x31':var まつ;continue;case'\\x32':for(まつ=-0x1494+-0x31*-0x65+0xb*0x1d;スづ['\\x54\\x49\\x59\\x46'+'\\x47'](まつ,やヮ['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68']);まつ++){ﾒゆ=やヮ['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](まつ);スづ['\\x62\\x44\\x51\\x49'+'\\x4b'](ﾒゆ,0x2bac+-0x14*-0xe13+-0x6d28*0x1)&&スづ['\\x51\\x65\\x7a\\x6d'+'\\x75'](ﾒゆ,0x141f1*0x1+0x2753*-0x5+0x5ead)&&スづ['\\x42\\x54\\x77\\x59'+'\\x67'](スづ['\\x64\\x5a\\x6a\\x79'+'\\x48'](まつ,0x257a+-0x55a+-0x3*0xab5),やヮ['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68'])&&(じｬ=やヮ['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](スづ['\\x65\\x79\\x63\\x4d'+'\\x72'](まつ,0x3ad*0x8+-0x2437+-0x2*-0x368)),スづ['\\x64\\x71\\x74\\x53'+'\\x42'](じｬ,-0x15f1*-0xf+-0x16609+0xf8ea)&&スづ['\\x51\\x65\\x7a\\x6d'+'\\x75'](じｬ,0x129c9+0x14e*-0xc2+0xb352)&&(ﾒゆ=スづ['\\x65\\x79\\x63\\x4d'+'\\x72'](スづ['\\x78\\x56\\x66\\x72'+'\\x79'](-0x84df+0xf153+0x10a*0x8e,スづ['\\x43\\x5a\\x44\\x69'+'\\x7a'](スづ['\\x4b\\x61\\x4b\\x42'+'\\x48'](ﾒゆ,-0xbaa8+0x19544+-0x29c),-0x15cb+-0xc*-0x1f5+-0x8d*0x3)),スづ['\\x48\\x67\\x4a\\x43'+'\\x65'](じｬ,0x3852+-0x7964+-0x1*-0x11d12)),まつ++));if(スづ['\\x54\\x49\\x59\\x46'+'\\x47'](ﾒゆ,0x1804+0x1aac+-0x3230))ヮレ+=String['\\x66\\x72\\x6f\\x6d'+'\\x43\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'](ﾒゆ);else{if(スづ['\\x67\\x78\\x7a\\x7a'+'\\x76'](ﾒゆ,-0x134a*0x2+0x15ba+0x18da))ヮレ+=String['\\x66\\x72\\x6f\\x6d'+'\\x43\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'](スづ['\\x41\\x6a\\x4a\\x43'+'\\x55'](0x14*-0x58+0xd0c+0x56c*-0x1,スづ['\\x62\\x6e\\x75\\x63'+'\\x49'](ﾒゆ,0x1d*0x112+0x133*0x6+-0x2636)),スづ['\\x58\\x79\\x65\\x58'+'\\x62'](-0x956+-0x56f+0x1*0xf45,スづ['\\x57\\x78\\x4e\\x6e'+'\\x5a'](ﾒゆ,0xbe1+0x213a+0x1d*-0x18c)));else スづ['\\x42\\x54\\x77\\x59'+'\\x67'](ﾒゆ,0x5fbb+-0x5*0x5506+0x24963)?ヮレ+=String['\\x66\\x72\\x6f\\x6d'+'\\x43\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'](スづ['\\x6a\\x61\\x6c\\x77'+'\\x4f'](0x1391+0x218f+-0x3440,スづ['\\x62\\x6e\\x75\\x63'+'\\x49'](ﾒゆ,-0x142f*0x1+-0x49*0x29+0x1fec)),スづ['\\x54\\x59\\x48\\x4b'+'\\x48'](0x6*0x1a+-0x136c+0x1350,スづ['\\x64\\x56\\x6d\\x6c'+'\\x48'](スづ['\\x62\\x6e\\x75\\x63'+'\\x49'](ﾒゆ,0x1e9f+-0x47*-0xd+-0x2234),-0x1dd*0x11+0x2103+0x9*-0x1f)),スづ['\\x51\\x77\\x42\\x75'+'\\x75'](0x1*-0x1732+0x10*-0x15a+0x2d52,スづ['\\x45\\x68\\x4b\\x4a'+'\\x4d'](ﾒゆ,0x1180+0x153c+-0x267d))):ヮレ+=String['\\x66\\x72\\x6f\\x6d'+'\\x43\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'](スづ['\\x58\\x6d\\x51\\x6c'+'\\x75'](-0x2*-0xd6c+0x1925+-0x74b*0x7,スづ['\\x62\\x6e\\x75\\x63'+'\\x49'](ﾒゆ,0x1b6a+-0x3*0x117+-0x1813*0x1)),スづ['\\x51\\x77\\x42\\x75'+'\\x75'](-0x1ca*-0x8+-0xfa1*-0x1+-0x1d71*0x1,スづ['\\x62\\x64\\x67\\x65'+'\\x58'](スづ['\\x4b\\x6a\\x68\\x43'+'\\x6d'](ﾒゆ,0x1*0x1663+0x216b+0x6*-0x94b),-0x7*-0x13a+0x11*-0x1cd+0x1646*0x1)),スづ['\\x73\\x56\\x4a\\x49'+'\\x74'](-0x2263+0x20e*0x2+0x1*0x1ec7,スづ['\\x41\\x76\\x48\\x52'+'\\x41'](スづ['\\x4b\\x6a\\x68\\x43'+'\\x6d'](ﾒゆ,-0x20a2+0x11b0+0xef8*0x1),0x1*-0x128e+-0x1e9d+0x316a)),スづ['\\x51\\x77\\x42\\x75'+'\\x75'](0x2*0x19b+0x3e*0x3+0x6e*-0x8,スづ['\\x43\\x4d\\x72\\x59'+'\\x50'](ﾒゆ,-0x805+-0x1cbf+0x2503)));}}continue;case'\\x33':var じｬ;continue;case'\\x34':var ﾒゆ;continue;case'\\x35':return ヮレ;}break;}}function fanqiePad(タｪ,かミ){var かプ={};かプ['\\x6d\\x53\\x43\\x6e'+'\\x47']='\\x31\\x7c\\x34\\x7c'+'\\x30\\x7c\\x33\\x7c'+'\\x32',かプ['\\x66\\x6a\\x48\\x59'+'\\x56']=function(ソェ,ヮゴ){return ソェ-ヮゴ;},かプ['\\x55\\x48\\x4a\\x67'+'\\x59']=function(ｼヺ,だﾉ){return ｼヺ%だﾉ;},かプ['\\x4a\\x73\\x75\\x62'+'\\x71']=function(むロ,ヌﾁ){return むロ<ヌﾁ;};var ｬバ=かプ,ｴど=ｬバ['\\x6d\\x53\\x43\\x6e'+'\\x47']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),ﾅン=0x6dc+0x619*-0x5+-0x17a1*-0x1;while(!![]){switch(ｴど[ﾅン++]){case'\\x30':var ぜべ;continue;case'\\x31':var ﾂｼ=ｬバ['\\x66\\x6a\\x48\\x59'+'\\x56'](かミ,ｬバ['\\x55\\x48\\x4a\\x67'+'\\x59'](タｪ['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68'],かミ));continue;case'\\x32':return ﾒプ;case'\\x33':for(ぜべ=-0x7c+0x8cb+-0x2c5*0x3;ｬバ['\\x4a\\x73\\x75\\x62'+'\\x71'](ぜべ,ﾂｼ);ぜべ++)ﾒプ+=String['\\x66\\x72\\x6f\\x6d'+'\\x43\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'](ﾂｼ);continue;case'\\x34':var ﾒプ=タｪ;continue;}break;}}function fanqiePackLe32(ﾝず){var ｩｱ={'\\x6a\\x6c\\x47\\x73\\x77':function(ヷン,むで){return ヷン(むで);},'\\x6f\\x78\\x59\\x6e\\x45':function(グﾓ,ビぶ){return グﾓ&ビぶ;},'\\x4b\\x48\\x49\\x74\\x51':function(なﾜ,ブに){return なﾜ>>>ブに;},'\\x6d\\x6c\\x48\\x64\\x44':function(むメ,けｽ){return むメ&けｽ;},'\\x69\\x45\\x55\\x79\\x67':function(がヌ,ふネ){return がヌ>>>ふネ;}};return ﾝず=ｩｱ['\\x6a\\x6c\\x47\\x73'+'\\x77'](fanqieU32,ﾝず),String['\\x66\\x72\\x6f\\x6d'+'\\x43\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'](ｩｱ['\\x6f\\x78\\x59\\x6e'+'\\x45'](ﾝず,-0x1*-0x193f+-0x3*0x921+0x1*0x323),ｩｱ['\\x6f\\x78\\x59\\x6e'+'\\x45'](ｩｱ['\\x4b\\x48\\x49\\x74'+'\\x51'](ﾝず,-0x14a5+0x2684+-0x11d7),0x14db*0x1+0x1fae+-0x338a),ｩｱ['\\x6d\\x6c\\x48\\x64'+'\\x44'](ｩｱ['\\x4b\\x48\\x49\\x74'+'\\x51'](ﾝず,0x1*-0x11a1+0x2*-0x2c0+0x1*0x1731),-0x44d*-0x2+-0x1*-0x1ae4+-0x227f),ｩｱ['\\x6d\\x6c\\x48\\x64'+'\\x44'](ｩｱ['\\x69\\x45\\x55\\x79'+'\\x67'](ﾝず,0x240a+-0xce7+-0x1*0x170b),0x5ab*-0x1+-0x2232+-0x146e*-0x2));}function fanqiePackBe32(ｼｭ){var ハア={'\\x66\\x6f\\x71\\x58\\x46':function(サむ,クユ){return サむ(クユ);},'\\x75\\x72\\x41\\x41\\x62':function(ﾁヵ,ﾓヹ){return ﾁヵ&ﾓヹ;},'\\x4f\\x41\\x55\\x51\\x6c':function(ずむ,んじ){return ずむ>>>んじ;},'\\x6a\\x71\\x54\\x5a\\x70':function(つﾓ,レと){return つﾓ&レと;},'\\x6c\\x44\\x74\\x58\\x62':function(ャが,ﾝネ){return ャが>>>ﾝネ;},'\\x6e\\x4a\\x59\\x62\\x64':function(ぃｵ,ゔぴ){return ぃｵ&ゔぴ;},'\\x45\\x65\\x7a\\x46\\x46':function(ゖい,ｹｧ){return ゖい&ｹｧ;}};return ｼｭ=ハア['\\x66\\x6f\\x71\\x58'+'\\x46'](fanqieU32,ｼｭ),String['\\x66\\x72\\x6f\\x6d'+'\\x43\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'](ハア['\\x75\\x72\\x41\\x41'+'\\x62'](ハア['\\x4f\\x41\\x55\\x51'+'\\x6c'](ｼｭ,0x26e8+-0xa96+-0x1c3a),0x1ae6+-0x609+-0x13de),ハア['\\x6a\\x71\\x54\\x5a'+'\\x70'](ハア['\\x6c\\x44\\x74\\x58'+'\\x62'](ｼｭ,0xa63+0x2c7*-0x9+0xeac),-0x649+-0x2*0x4ee+0x449*0x4),ハア['\\x6e\\x4a\\x59\\x62'+'\\x64'](ハア['\\x4f\\x41\\x55\\x51'+'\\x6c'](ｼｭ,-0x1e7c+0x15e1+0xc9*0xb),0x4ae+0x13ca+-0x1779*0x1),ハア['\\x45\\x65\\x7a\\x46'+'\\x46'](ｼｭ,-0x1*0x5a4+0x2*-0xa13+0x1*0x1ac9));}function fanqieMd5Raw(オｻ){var ぽの={'\\x55\\x77\\x57\\x74\\x4d':'\\x30\\x7c\\x32\\x39'+'\\x7c\\x32\\x35\\x7c'+'\\x33\\x34\\x7c\\x36'+'\\x7c\\x32\\x30\\x7c'+'\\x32\\x32\\x7c\\x35'+'\\x7c\\x32\\x34\\x7c'+'\\x31\\x39\\x7c\\x32'+'\\x31\\x7c\\x33\\x31'+'\\x7c\\x34\\x7c\\x31'+'\\x32\\x7c\\x39\\x7c'+'\\x31\\x34\\x7c\\x31'+'\\x36\\x7c\\x31\\x30'+'\\x7c\\x37\\x7c\\x32'+'\\x33\\x7c\\x31\\x7c'+'\\x31\\x35\\x7c\\x31'+'\\x33\\x7c\\x32\\x36'+'\\x7c\\x33\\x7c\\x33'+'\\x36\\x7c\\x38\\x7c'+'\\x32\\x7c\\x31\\x31'+'\\x7c\\x32\\x37\\x7c'+'\\x31\\x37\\x7c\\x32'+'\\x38\\x7c\\x33\\x35'+'\\x7c\\x33\\x30\\x7c'+'\\x33\\x32\\x7c\\x33'+'\\x33\\x7c\\x31\\x38','\\x6c\\x73\\x56\\x69\\x63':function(はウ,ワヰ){return はウ<ワヰ;},'\\x6b\\x42\\x72\\x49\\x4e':function(ﾛｮ,ﾓｯ){return ﾛｮ>>>ﾓｯ;},'\\x62\\x67\\x46\\x6f\\x44':function(れワ,んペ){return れワ*んペ;},'\\x6d\\x6a\\x76\\x46\\x44':function(ﾚぞ,ぷｦ){return ﾚぞ+ぷｦ;},'\\x56\\x42\\x73\\x66\\x72':function(ﾎぴ,ウち){return ﾎぴ!==ウち;},'\\x58\\x70\\x44\\x59\\x70':function(ｷョ,ﾜﾏ){return ｷョ%ﾜﾏ;},'\\x78\\x59\\x4b\\x5a\\x71':function(ポシ,ずミ){return ポシ>>>ずミ;},'\\x44\\x42\\x72\\x44\\x75':function(ァこ,ｰサ){return ァこ*ｰサ;},'\\x4d\\x41\\x45\\x42\\x69':function(マぴ,ﾀく){return マぴ>>>ﾀく;},'\\x71\\x48\\x57\\x65\\x6e':function(セち,ヨﾒ){return セち/ヨﾒ;},'\\x61\\x4a\\x4a\\x47\\x4e':function(ウヴ,ぅャ){return ウヴ&ぅャ;},'\\x68\\x75\\x63\\x74\\x79':function(ゎた,ﾍむ){return ゎた<ﾍむ;},'\\x4d\\x58\\x4c\\x47\\x78':'\\x39\\x7c\\x32\\x7c'+'\\x34\\x7c\\x35\\x7c'+'\\x30\\x7c\\x31\\x30'+'\\x7c\\x37\\x7c\\x33'+'\\x7c\\x38\\x7c\\x31'+'\\x7c\\x36','\\x73\\x4c\\x4d\\x62\\x48':function(ッさ,ヘｶ){return ッさ(ヘｶ);},'\\x62\\x64\\x4a\\x54\\x55':function(もご,ガウ){return もご+ガウ;},'\\x6d\\x76\\x65\\x53\\x4c':function(ヵォ,ゑヌ){return ヵォ|ゑヌ;},'\\x65\\x67\\x43\\x45\\x56':function(ゥち,なぴ){return ゥち|なぴ;},'\\x78\\x48\\x4d\\x67\\x59':function(イヰ,ｶけ){return イヰ+ｶけ;},'\\x68\\x6d\\x6d\\x48\\x78':function(だぉ,ﾜョ){return だぉ*ﾜョ;},'\\x41\\x6a\\x6c\\x51\\x64':function(ヹこ,るｹ){return ヹこ<<るｹ;},'\\x4d\\x54\\x62\\x48\\x5a':function(チメ,マェ){return チメ+マェ;},'\\x64\\x4f\\x52\\x5a\\x55':function(ボめ,ﾄリ){return ボめ+ﾄリ;},'\\x64\\x7a\\x4e\\x5a\\x57':function(コす,ょヰ){return コす*ょヰ;},'\\x51\\x41\\x70\\x71\\x4f':function(ｱゎ,ﾇれ){return ｱゎ+ﾇれ;},'\\x4e\\x63\\x6c\\x75\\x46':function(メソ,モゕ){return メソ*モゕ;},'\\x61\\x54\\x4e\\x6e\\x74':function(ﾓヲ,ぱﾄ){return ﾓヲ+ぱﾄ;},'\\x65\\x58\\x68\\x6e\\x58':function(ﾋよ,ゃて){return ﾋよ*ゃて;},'\\x77\\x6f\\x6d\\x71\\x6f':function(ベョ,ｺﾎ){return ベョ(ｺﾎ);},'\\x6a\\x61\\x4c\\x49\\x68':function(ンハ,ブぜ){return ンハ+ブぜ;},'\\x47\\x55\\x51\\x64\\x47':function(るﾇ,ﾙタ){return るﾇ<ﾙタ;},'\\x6f\\x51\\x6d\\x44\\x79':'\\x35\\x7c\\x32\\x7c'+'\\x31\\x7c\\x34\\x7c'+'\\x30\\x7c\\x33','\\x4f\\x6a\\x4b\\x52\\x71':function(ﾐネ,ゖが){return ﾐネ(ゖが);},'\\x69\\x4e\\x48\\x70\\x68':function(ィば,ゃそ){return ィば+ゃそ;},'\\x66\\x55\\x75\\x79\\x42':function(ﾔエ,ｲダ){return ﾔエ+ｲダ;},'\\x70\\x4b\\x6e\\x5a\\x54':function(ｶを,わろ){return ｶを(わろ);},'\\x7a\\x74\\x58\\x50\\x69':function(ヨっ,ヶラ){return ヨっ|ヶラ;},'\\x5a\\x67\\x51\\x51\\x56':function(ハォ,ﾙま){return ハォ-ﾙま;},'\\x52\\x41\\x6b\\x4b\\x5a':function(ゕﾘ,ﾓろ){return ゕﾘ&ﾓろ;},'\\x72\\x41\\x6d\\x4a\\x45':function(リえ,わﾗ){return リえ|わﾗ;},'\\x6d\\x58\\x4b\\x6a\\x44':function(ゼｨ,ケピ){return ゼｨ&ケピ;},'\\x66\\x4b\\x49\\x52\\x78':function(シｽ,ﾛラ){return シｽ+ﾛラ;},'\\x7a\\x69\\x52\\x57\\x50':function(ゎシ,ゼワ){return ゎシ*ゼワ;},'\\x66\\x66\\x54\\x72\\x65':function(テぬ,ゔｧ){return テぬ^ゔｧ;},'\\x42\\x46\\x6a\\x6d\\x41':function(チヴ,コふ){return チヴ^コふ;},'\\x49\\x42\\x4c\\x52\\x69':function(ペス,ァラ){return ペス+ァラ;},'\\x41\\x67\\x6a\\x78\\x6b':function(ひわ,ｰｺ){return ひわ+ｰｺ;},'\\x43\\x59\\x77\\x75\\x70':function(ｦと,をぽ){return ｦと+をぽ;},'\\x46\\x4f\\x54\\x6c\\x69':function(トラ,ピぎ){return トラ(ピぎ);},'\\x45\\x41\\x4f\\x69\\x57':function(ﾒほ,めﾑ){return ﾒほ(めﾑ);},'\\x45\\x75\\x4c\\x57\\x56':function(えﾖ,ぢゥ){return えﾖ(ぢゥ);},'\\x56\\x59\\x59\\x79\\x6e':function(ぺﾓ,ルｯ){return ぺﾓ&ルｯ;},'\\x48\\x6b\\x74\\x55\\x58':function(がゖ,ォぴ){return がゖ>>>ォぴ;},'\\x5a\\x44\\x5a\\x66\\x7a':function(ダぜ,ジｵ){return ダぜ*ジｵ;},'\\x4b\\x4e\\x76\\x58\\x71':function(ﾛち,ヅｪ){return ﾛち&ヅｪ;}},ｬば=ぽの['\\x55\\x77\\x57\\x74'+'\\x4d']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),ャネ=-0x6b*-0x27+-0xc5*0x2e+0x1319;while(!![]){switch(ｬば[ャネ++]){case'\\x30':var みん=[-0x69e*0x1+0x1*-0x240b+0x2ab0,0xe8c+-0x713*0x2+-0x5a,0xc14+0x304+-0xf07,0x3*-0x6c9+-0x14f9+0x296a,0x1af6+0x707*0x1+-0x21f6,0x2197+0x9*0x401+-0x22ca*0x2,0x23e4*-0x1+0x11ae+0x1247*0x1,-0xaee+0x1cab*-0x1+-0x1*-0x27af,-0x8*0x61+0x172d+-0x141e,0xdfe+0x737*-0x3+-0x1b*-0x49,0x2*0xe15+-0x373*-0x7+0x9*-0x5ce,0x1*-0x1cd0+0x8e0+0x1406,0x7*0x194+0x5f*-0x1d+-0x42,-0xe*-0x68+-0x22d9+0x1d35*0x1,-0x162b+0x1079+-0x5c3*-0x1,0xec*0x17+-0x2e+0x218*-0xa,-0x5c8+-0x123*0xa+0x112b,0x2*0x419+0x16e5*0x1+-0x1*0x1f0e,0x259c+-0x2*-0x110b+0x47a4*-0x1,0x20a9+-0xd9f+-0x12f6,0x31f*-0x5+-0xa84+0xe*0x1de,0x1082+-0x6*-0x16f+-0x7*0x395,0xed8+-0x1d95+0x1*0xecb,0xc9a+0x1*0x2141+-0x2dc7,0x15aa*-0x1+0xa42+0xb6d,0x98a+0x8ff+-0x1280,-0x227b+0x737+-0x1b52*-0x1,0xe81+0x17*-0x1a7+0x1794,-0x2547+0x682*0x3+-0x1a*-0xaf,-0x1641+-0x497*-0x4+-0x1f7*-0x2,-0x5c*-0x1c+0x3*-0x2eb+-0x141*0x1,-0x197*-0x1+-0x739+0x5b6,0xfba+-0x1*0xa4+-0xf12,0xcd1+0x757*0x5+-0x3179,0x281*0xb+0x332*0x6+-0xf8d*0x3,0x6b*0x2f+-0x953+-0x3*0x369,-0x1*0xce5+-0x1*-0x1e25+-0x89e*0x2,-0x1f77+-0x2fe+0x2280,-0x12de+-0x2*-0xe67+-0x4f0*0x2,0x1e25+0x104c+0x2e5a*-0x1,0x6c1+-0x1a3f*0x1+-0x1c6*-0xb,0x7bb+-0x86f*0x1+0xbf,0x20bb+-0xd*0x259+-0x226,0x1fe5+-0x83*0x1a+-0x1280,-0x1aef*-0x1+0xd6+-0x1bc1,-0x1a14+0x18e1+0x13e*0x1,-0x77*0x3d+-0x1*0x469+0x20d4,-0x2c8+-0x20e*0x1+-0xd*-0x61,0x1cdc+0x280+0x1*-0x1f56,-0xacc*-0x2+0x80e+-0x1d9c,0x11b4+-0x2338+0x1193,0x1036+-0x107*0x7+-0x8f0,-0x2*-0xdb5+-0x2520*0x1+0x9bc,0xbeb+0x39+-0xc1a,-0x4f1+0x5*0x277+0x753*-0x1,-0x7af*-0x2+0x11de+-0x1*0x2127,-0xbf5*-0x1+-0x1fc7+0x13d8,0xbb*-0x7+0x1123+0x2ff*-0x4,0x1*-0x669+0x1*-0x16b9+-0x1d31*-0x1,0x10ac+-0x71*-0x3d+-0x22d*0x14,-0x12c4+-0x1981+0x2c4b,0x1cec+0xfd4*-0x1+-0xd0e,-0x1bd7+0x145d+0x789,-0x2343+-0x2403+-0x17c9*-0x3];continue;case'\\x31':var こリ;continue;case'\\x32':ヮド['\\x70\\x75\\x73\\x68'](-0x5*0x435+0x1489*-0x1+0x86a*0x5);continue;case'\\x33':for(ヮど=0x2*0x1328+0x234d*-0x1+0x1*-0x303;ぽの['\\x6c\\x73\\x56\\x69'+'\\x63'](ヮど,-0xf29+-0x258a+0x34f3);ヮど++)ﾐガ[ヮど]=ぽの['\\x6b\\x42\\x72\\x49'+'\\x4e'](Math['\\x66\\x6c\\x6f\\x6f'+'\\x72'](ぽの['\\x62\\x67\\x46\\x6f'+'\\x44'](Math['\\x61\\x62\\x73'](Math['\\x73\\x69\\x6e'](ぽの['\\x6d\\x6a\\x76\\x46'+'\\x44'](ヮど,0x5*0x315+0x1e7d+-0x2de5*0x1))),-0x1f73d59c+-0x112ae3c74+0x232221210)),-0x258d+0x214+0x2379);continue;case'\\x34':var ヒば=0x7a47c725+-0xd974b41d+0x14efa9881;continue;case'\\x35':var づツ;continue;case'\\x36':var ペﾍ;continue;case'\\x37':var きス;continue;case'\\x38':みぇ=ヮド['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68'];continue;case'\\x39':var ﾛェ=-0x5060eef+-0xb2416*-0x161+-0x5*-0x12bed03;continue;case'\\x31\\x30':var ﾁん;continue;case'\\x31\\x31':while(ぽの['\\x56\\x42\\x73\\x66'+'\\x72'](ぽの['\\x58\\x70\\x44\\x59'+'\\x70'](ヮド['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68'],-0x3*0x3c4+0x1386+0x2*-0x3fd),0x3*0xa49+0x781+-0x2624))ヮド['\\x70\\x75\\x73\\x68'](0x1c61+0x991*-0x3+0x52*0x1);continue;case'\\x31\\x32':var ッﾗ=-0x116471d9b+-0x7b760*0x2775+0x2df786979;continue;case'\\x31\\x33':var ナね;continue;case'\\x31\\x34':var ｰぼ;continue;case'\\x31\\x35':var ヷり;continue;case'\\x31\\x36':var ぷブ;continue;case'\\x31\\x37':バｪ=ぽの['\\x78\\x59\\x4b\\x5a'+'\\x71'](づツ,0x2537*0x1+-0x2191+-0x3a6);continue;case'\\x31\\x38':return ュォ;case'\\x31\\x39':var ミヅ;continue;case'\\x32\\x30':var ずヮ;continue;case'\\x32\\x31':var スぃ;continue;case'\\x32\\x32':var みぇ;continue;case'\\x32\\x33':var ｿﾊ;continue;case'\\x32\\x34':var バｪ;continue;case'\\x32\\x35':var ヮド=[];continue;case'\\x32\\x36':var ュォ;continue;case'\\x32\\x37':づツ=ぽの['\\x44\\x42\\x72\\x44'+'\\x75'](みぇ,-0x10f*-0x1+0x58c+-0x231*0x3);continue;case'\\x32\\x38':ミヅ=ぽの['\\x4d\\x41\\x45\\x42'+'\\x69'](Math['\\x66\\x6c\\x6f\\x6f'+'\\x72'](ぽの['\\x71\\x48\\x57\\x65'+'\\x6e'](づツ,-0x4a59bcbc*0x6+-0x24*0xe31701e+0x97a1c614*0x8)),0x1ce9+0x66d*-0x4+-0x335);continue;case'\\x32\\x39':var ﾐガ=[];continue;case'\\x33\\x30':for(ペﾍ=-0x12d3+-0x1*0x13d5+0x26a8;ぽの['\\x6c\\x73\\x56\\x69'+'\\x63'](ペﾍ,0x1d*0xa3+0x1*0x182d+-0x3e*0xb0);ペﾍ++)ヮド['\\x70\\x75\\x73\\x68'](ぽの['\\x61\\x4a\\x4a\\x47'+'\\x4e'](ぽの['\\x78\\x59\\x4b\\x5a'+'\\x71'](ミヅ,ぽの['\\x62\\x67\\x46\\x6f'+'\\x44'](ペﾍ,-0x47*-0x31+-0x1*-0x217d+-0x2f0c)),-0x4fd+-0xfa8+0x15a4));continue;case'\\x33\\x31':var ぅば=-0x2*0x3cb56f84+-0x61692ab0+-0x1*-0x142192cb9;continue;case'\\x33\\x32':for(ナね=-0x185a+-0x1*-0x253+0x1607;ぽの['\\x68\\x75\\x63\\x74'+'\\x79'](ナね,ヮド['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68']);ナね+=0x2480+-0x19e4+0x11*-0x9c){var ﾏり=ぽの['\\x4d\\x58\\x4c\\x47'+'\\x78']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),やガ=0x1310+-0x1*-0x25bf+-0x38cf;while(!![]){switch(ﾏり[やガ++]){case'\\x30':ﾁん=ッﾗ;continue;case'\\x31':ッﾗ=ぽの['\\x73\\x4c\\x4d\\x62'+'\\x48'](fanqieU32,ぽの['\\x62\\x64\\x4a\\x54'+'\\x55'](ッﾗ,ﾁん));continue;case'\\x32':for(ヮど=0x5*-0x40+-0x1df*-0x1+-0x9f*0x1;ぽの['\\x68\\x75\\x63\\x74'+'\\x79'](ヮど,0x1d44+-0x1e69+-0x1*-0x135);ヮど++){スぃ[ヮど]=ぽの['\\x73\\x4c\\x4d\\x62'+'\\x48'](fanqieU32,ぽの['\\x6d\\x76\\x65\\x53'+'\\x4c'](ぽの['\\x65\\x67\\x43\\x45'+'\\x56'](ぽの['\\x65\\x67\\x43\\x45'+'\\x56'](ヮド[ぽの['\\x78\\x48\\x4d\\x67'+'\\x59'](ナね,ぽの['\\x68\\x6d\\x6d\\x48'+'\\x78'](ヮど,-0x1b09+-0x19*0xa4+0x2b11))],ぽの['\\x41\\x6a\\x6c\\x51'+'\\x64'](ヮド[ぽの['\\x4d\\x54\\x62\\x48'+'\\x5a'](ぽの['\\x64\\x4f\\x52\\x5a'+'\\x55'](ナね,ぽの['\\x64\\x7a\\x4e\\x5a'+'\\x57'](ヮど,-0x656+0x250+0x205*0x2)),0x94*-0x33+0x20a6+-0x329*0x1)],0x935+0x1d1*-0xb+0xace)),ぽの['\\x41\\x6a\\x6c\\x51'+'\\x64'](ヮド[ぽの['\\x51\\x41\\x70\\x71'+'\\x4f'](ぽの['\\x62\\x64\\x4a\\x54'+'\\x55'](ナね,ぽの['\\x4e\\x63\\x6c\\x75'+'\\x46'](ヮど,-0x2*0xf+-0x148f+0x1*0x14b1)),-0x1e76+0xc0*0xc+0x1578)],-0x120b+-0x1471+-0x1*-0x268c)),ぽの['\\x41\\x6a\\x6c\\x51'+'\\x64'](ヮド[ぽの['\\x78\\x48\\x4d\\x67'+'\\x59'](ぽの['\\x61\\x54\\x4e\\x6e'+'\\x74'](ナね,ぽの['\\x65\\x58\\x68\\x6e'+'\\x58'](ヮど,0x1b*-0x47+-0x1*0x2381+-0x2de*-0xf)),-0x240*-0xe+-0x15db*0x1+-0x9a2)],0x41*-0x86+-0xc*0x8a+-0x40f*-0xa)));}continue;case'\\x33':ぅば=ぽの['\\x77\\x6f\\x6d\\x71'+'\\x6f'](fanqieU32,ぽの['\\x6a\\x61\\x4c\\x49'+'\\x68'](ぅば,ｰぼ));continue;case'\\x34':ｰぼ=ぅば;continue;case'\\x35':ぷブ=ヒば;continue;case'\\x36':ﾛェ=ぽの['\\x77\\x6f\\x6d\\x71'+'\\x6f'](fanqieU32,ぽの['\\x62\\x64\\x4a\\x54'+'\\x55'](ﾛェ,きス));continue;case'\\x37':for(ずヮ=-0x3*0xa6a+0x1856+0x6e8;ぽの['\\x47\\x55\\x51\\x64'+'\\x47'](ずヮ,-0x1*-0x1499+-0x886+-0xbd3*0x1);ずヮ++){var グｬ=ぽの['\\x6f\\x51\\x6d\\x44'+'\\x79']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),ユピ=-0x7*-0x37b+0x306*0x7+-0x2d87;while(!![]){switch(グｬ[ユピ++]){case'\\x30':ﾁん=ぷブ;continue;case'\\x31':ｰぼ=きス;continue;case'\\x32':ヷり=ぽの['\\x4f\\x6a\\x4b\\x52'+'\\x71'](fanqieU32,ぽの['\\x6d\\x6a\\x76\\x46'+'\\x44'](ぽの['\\x69\\x4e\\x48\\x70'+'\\x68'](ぽの['\\x66\\x55\\x75\\x79'+'\\x42'](ｿﾊ,ｰぼ),ﾐガ[ずヮ]),スぃ[こリ]));continue;case'\\x33':ぷブ=ぽの['\\x70\\x4b\\x6e\\x5a'+'\\x54'](fanqieU32,ぽの['\\x69\\x4e\\x48\\x70'+'\\x68'](ぷブ,ぽの['\\x7a\\x74\\x58\\x50'+'\\x69'](ぽの['\\x41\\x6a\\x6c\\x51'+'\\x64'](ヷり,みん[ずヮ]),ぽの['\\x78\\x59\\x4b\\x5a'+'\\x71'](ヷり,ぽの['\\x5a\\x67\\x51\\x51'+'\\x56'](0x10bf+0x1ce4*-0x1+0xc45,みん[ずヮ])))));continue;case'\\x34':きス=ﾁん;continue;case'\\x35':if(ぽの['\\x6c\\x73\\x56\\x69'+'\\x63'](ずヮ,-0x879*-0x3+-0x1122+0x5*-0x1a5))ｿﾊ=ぽの['\\x7a\\x74\\x58\\x50'+'\\x69'](ぽの['\\x61\\x4a\\x4a\\x47'+'\\x4e'](ぷブ,ﾁん),ぽの['\\x52\\x41\\x6b\\x4b'+'\\x5a'](~ぷブ,きス)),こリ=ずヮ;else{if(ぽの['\\x6c\\x73\\x56\\x69'+'\\x63'](ずヮ,-0x4*0x7fb+0x61*0x37+0xb35))ｿﾊ=ぽの['\\x72\\x41\\x6d\\x4a'+'\\x45'](ぽの['\\x61\\x4a\\x4a\\x47'+'\\x4e'](きス,ぷブ),ぽの['\\x52\\x41\\x6b\\x4b'+'\\x5a'](~きス,ﾁん)),こリ=ぽの['\\x6d\\x58\\x4b\\x6a'+'\\x44'](ぽの['\\x66\\x4b\\x49\\x52'+'\\x78'](ぽの['\\x7a\\x69\\x52\\x57'+'\\x50'](-0x83c+-0x1339+0x1b7a,ずヮ),-0xf06+-0x20e5+0x1*0x2fec),-0x227e+0x1dae+-0x2b*-0x1d);else ぽの['\\x68\\x75\\x63\\x74'+'\\x79'](ずヮ,-0xe*0x25f+-0x67*-0x3a+0xa0c)?(ｿﾊ=ぽの['\\x66\\x66\\x54\\x72'+'\\x65'](ぽの['\\x66\\x66\\x54\\x72'+'\\x65'](ぷブ,ﾁん),きス),こリ=ぽの['\\x61\\x4a\\x4a\\x47'+'\\x4e'](ぽの['\\x61\\x54\\x4e\\x6e'+'\\x74'](ぽの['\\x68\\x6d\\x6d\\x48'+'\\x78'](0x4*-0x6b6+-0x244c+-0x3*-0x150d,ずヮ),-0x105e+0x299+0xdca),0x5bd+-0x23a+-0x374)):(ｿﾊ=ぽの['\\x42\\x46\\x6a\\x6d'+'\\x41'](ﾁん,ぽの['\\x65\\x67\\x43\\x45'+'\\x56'](ぷブ,~きス)),こリ=ぽの['\\x52\\x41\\x6b\\x4b'+'\\x5a'](ぽの['\\x62\\x67\\x46\\x6f'+'\\x44'](0x75f+0x2*-0x79e+0x7e4,ずヮ),0x2267+-0x29*0x6f+-0x1091));}continue;}break;}}continue;case'\\x38':ヒば=ぽの['\\x77\\x6f\\x6d\\x71'+'\\x6f'](fanqieU32,ぽの['\\x49\\x42\\x4c\\x52'+'\\x69'](ヒば,ぷブ));continue;case'\\x39':スぃ=[];continue;case'\\x31\\x30':きス=ﾛェ;continue;}break;}}continue;case'\\x33\\x33':ュォ=ぽの['\\x41\\x67\\x6a\\x78'+'\\x6b'](ぽの['\\x43\\x59\\x77\\x75'+'\\x70'](ぽの['\\x64\\x4f\\x52\\x5a'+'\\x55'](ぽの['\\x46\\x4f\\x54\\x6c'+'\\x69'](fanqiePackLe32,ぅば),ぽの['\\x73\\x4c\\x4d\\x62'+'\\x48'](fanqiePackLe32,ヒば)),ぽの['\\x45\\x41\\x4f\\x69'+'\\x57'](fanqiePackLe32,ッﾗ)),ぽの['\\x45\\x75\\x4c\\x57'+'\\x56'](fanqiePackLe32,ﾛェ));continue;case'\\x33\\x34':var ヮど;continue;case'\\x33\\x35':for(ペﾍ=-0x3d1*-0x4+-0x2b*0xa3+0xc1d;ぽの['\\x47\\x55\\x51\\x64'+'\\x47'](ペﾍ,0x16a6+0x16a6+-0x2d48);ペﾍ++)ヮド['\\x70\\x75\\x73\\x68'](ぽの['\\x56\\x59\\x59\\x79'+'\\x6e'](ぽの['\\x48\\x6b\\x74\\x55'+'\\x58'](バｪ,ぽの['\\x5a\\x44\\x5a\\x66'+'\\x7a'](ペﾍ,0x1ea3+0x1f5e+-0x3df9)),0x1007*0x2+0x2*0x40a+-0x2723));continue;case'\\x33\\x36':for(ヮど=0x2*-0x20e+0x115*-0xe+0x1342;ぽの['\\x47\\x55\\x51\\x64'+'\\x47'](ヮど,オｻ['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68']);ヮど++)ヮド['\\x70\\x75\\x73\\x68'](ぽの['\\x4b\\x4e\\x76\\x58'+'\\x71'](オｻ['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](ヮど),-0xdd3*-0x1+0x1c7*0x10+-0x2944));continue;}break;}}function fanqieMd5Hex(カﾚ){var もｪ={'\\x69\\x47\\x6b\\x7a\\x56':function(エヲ,ﾒシ){return エヲ(ﾒシ);}};return もｪ['\\x69\\x47\\x6b\\x7a'+'\\x56'](fanqieBytes2Hex,もｪ['\\x69\\x47\\x6b\\x7a'+'\\x56'](fanqieMd5Raw,カﾚ));}function fanqieSm3(ホﾐ){var ｽぜ={'\\x72\\x76\\x6e\\x64\\x46':'\\x37\\x7c\\x31\\x37'+'\\x7c\\x31\\x32\\x7c'+'\\x31\\x38\\x7c\\x33'+'\\x32\\x7c\\x31\\x34'+'\\x7c\\x31\\x7c\\x32'+'\\x36\\x7c\\x36\\x7c'+'\\x32\\x39\\x7c\\x31'+'\\x39\\x7c\\x35\\x7c'+'\\x33\\x31\\x7c\\x32'+'\\x37\\x7c\\x31\\x33'+'\\x7c\\x33\\x7c\\x31'+'\\x35\\x7c\\x32\\x33'+'\\x7c\\x38\\x7c\\x32'+'\\x32\\x7c\\x32\\x7c'+'\\x32\\x35\\x7c\\x30'+'\\x7c\\x32\\x31\\x7c'+'\\x33\\x30\\x7c\\x32'+'\\x30\\x7c\\x31\\x36'+'\\x7c\\x32\\x38\\x7c'+'\\x32\\x34\\x7c\\x31'+'\\x31\\x7c\\x34\\x7c'+'\\x39\\x7c\\x31\\x30','\\x44\\x6e\\x7a\\x6d\\x47':function(ヹぬ,ウえ){return ヹぬ<ウえ;},'\\x4d\\x75\\x51\\x69\\x6d':'\\x31\\x37\\x7c\\x38'+'\\x7c\\x31\\x32\\x7c'+'\\x30\\x7c\\x31\\x7c'+'\\x31\\x35\\x7c\\x31'+'\\x39\\x7c\\x31\\x36'+'\\x7c\\x32\\x33\\x7c'+'\\x33\\x7c\\x32\\x30'+'\\x7c\\x32\\x31\\x7c'+'\\x31\\x34\\x7c\\x31'+'\\x33\\x7c\\x36\\x7c'+'\\x31\\x30\\x7c\\x32'+'\\x7c\\x39\\x7c\\x35'+'\\x7c\\x31\\x31\\x7c'+'\\x32\\x32\\x7c\\x37'+'\\x7c\\x34\\x7c\\x31'+'\\x38','\\x45\\x58\\x6b\\x52\\x6b':function(ﾒや,ズﾂ){return ﾒや(ズﾂ);},'\\x62\\x6f\\x49\\x5a\\x74':function(ィエ,エデ){return ィエ|エデ;},'\\x67\\x50\\x53\\x45\\x54':function(ｺき,ゲﾓ){return ｺき|ゲﾓ;},'\\x63\\x59\\x65\\x70\\x54':function(シひ,ﾊた){return シひ|ﾊた;},'\\x50\\x50\\x4a\\x78\\x68':function(ぞぢ,ザｹ){return ぞぢ<<ザｹ;},'\\x75\\x6c\\x68\\x48\\x70':function(ﾇリ,ｬつ){return ﾇリ*ｬつ;},'\\x68\\x6c\\x42\\x71\\x67':function(ゅも,ﾔゴ){return ゅも<<ﾔゴ;},'\\x68\\x5a\\x42\\x61\\x70':function(ぴろ,りヹ){return ぴろ+りヹ;},'\\x4d\\x53\\x64\\x46\\x67':function(ﾄﾋ,ｵア){return ﾄﾋ<<ｵア;},'\\x50\\x41\\x45\\x72\\x67':function(ジゲ,ｶド){return ジゲ+ｶド;},'\\x6a\\x6a\\x54\\x61\\x44':function(ﾚエ,フぼ){return ﾚエ*フぼ;},'\\x4c\\x66\\x52\\x58\\x51':function(つぢ,ヰサ){return つぢ+ヰサ;},'\\x52\\x4e\\x70\\x6c\\x59':function(ヵﾜ,るゑ){return ヵﾜ*るゑ;},'\\x55\\x52\\x59\\x50\\x69':function(ｺウ,ﾄヰ){return ｺウ<ﾄヰ;},'\\x49\\x4f\\x45\\x53\\x6b':function(ギリ,ﾝﾌ){return ギリ^ﾝﾌ;},'\\x46\\x64\\x61\\x72\\x68':function(げま,ﾓむ){return げま^ﾓむ;},'\\x68\\x6b\\x48\\x77\\x76':function(ョヂ,めぅ){return ョヂ-めぅ;},'\\x79\\x49\\x6f\\x68\\x64':function(ｲヹ,ゐぴ){return ｲヹ-ゐぴ;},'\\x77\\x52\\x52\\x74\\x67':function(ﾆﾍ,セぃ,ョソ){return ﾆﾍ(セぃ,ョソ);},'\\x59\\x42\\x6b\\x79\\x65':function(ヱｯ,っﾇ){return ヱｯ(っﾇ);},'\\x79\\x4d\\x55\\x41\\x74':function(ごｲ,ﾖォ,ヷｲ){return ごｲ(ﾖォ,ヷｲ);},'\\x51\\x74\\x4a\\x46\\x72':function(のゼ,らｯ){return のゼ-らｯ;},'\\x66\\x68\\x71\\x71\\x54':function(ケｽ,ふヘ){return ケｽ-ふヘ;},'\\x49\\x47\\x57\\x6d\\x78':function(パッ,ｾシ){return パッ^ｾシ;},'\\x78\\x5a\\x53\\x6e\\x4d':function(ﾈと,ばャ){return ﾈと(ばャ);},'\\x48\\x41\\x6a\\x49\\x4f':function(ボゎ,ッぴ){return ボゎ^ッぴ;},'\\x72\\x46\\x5a\\x63\\x52':function(ぇょ,みき){return ぇょ<みき;},'\\x64\\x7a\\x45\\x4f\\x73':'\\x37\\x7c\\x31\\x31'+'\\x7c\\x33\\x7c\\x39'+'\\x7c\\x32\\x7c\\x38'+'\\x7c\\x31\\x32\\x7c'+'\\x36\\x7c\\x31\\x7c'+'\\x31\\x33\\x7c\\x30'+'\\x7c\\x31\\x30\\x7c'+'\\x34\\x7c\\x35','\\x79\\x4c\\x4d\\x4b\\x77':function(ゕﾗ,ァヰ){return ゕﾗ+ァヰ;},'\\x6e\\x54\\x49\\x66\\x6a':function(ﾘｲ,ﾚゆ){return ﾘｲ^ﾚゆ;},'\\x6a\\x55\\x67\\x67\\x44':function(ラら,ｾて){return ラら(ｾて);},'\\x78\\x55\\x75\\x55\\x56':function(ニベ,ヤの,ユヲ){return ニベ(ヤの,ユヲ);},'\\x73\\x51\\x65\\x4f\\x4a':function(だル,みズ){return だル<みズ;},'\\x59\\x4b\\x78\\x57\\x79':function(ニだ,そｼ){return ニだ(そｼ);},'\\x4c\\x63\\x4e\\x69\\x74':function(マヨ,ﾏﾒ){return マヨ+ﾏﾒ;},'\\x68\\x58\\x4c\\x4f\\x6b':function(ずｱ,ﾙろ){return ずｱ^ﾙろ;},'\\x41\\x70\\x42\\x79\\x65':function(ｺﾆ,タﾙ){return ｺﾆ&タﾙ;},'\\x49\\x54\\x43\\x77\\x75':function(ムこ,アｺ){return ムこ&アｺ;},'\\x79\\x76\\x54\\x71\\x6f':function(ｧぶ,ﾊゔ){return ｧぶ|ﾊゔ;},'\\x61\\x67\\x65\\x74\\x53':function(ザｭ,ペﾆ){return ザｭ&ペﾆ;},'\\x6b\\x71\\x79\\x50\\x50':function(ャヺ,ﾀげ){return ャヺ&ﾀげ;},'\\x62\\x70\\x53\\x4e\\x49':function(らﾍ,モｱ,ﾌケ){return らﾍ(モｱ,ﾌケ);},'\\x54\\x63\\x58\\x52\\x4a':function(らヹ,まっ,ｷワ){return らヹ(まっ,ｷワ);},'\\x4d\\x76\\x54\\x59\\x76':function(ロﾚ,ｰﾖ){return ロﾚ^ｰﾖ;},'\\x61\\x46\\x54\\x44\\x43':function(ろは,てわ){return ろは+てわ;},'\\x42\\x45\\x74\\x6e\\x6a':function(けヺ,にヹ){return けヺ+にヹ;},'\\x47\\x6d\\x65\\x54\\x48':function(ケだ,ピｷ){return ケだ(ピｷ);},'\\x70\\x72\\x51\\x71\\x46':function(スか,ﾈめ){return スか^ﾈめ;},'\\x43\\x49\\x75\\x7a\\x67':function(ごｮ,びｪ){return ごｮ<びｪ;},'\\x55\\x52\\x46\\x6b\\x77':function(コプ,ゖけ){return コプ(ゖけ);},'\\x54\\x74\\x4f\\x4c\\x47':function(ラヤ,っｵ){return ラヤ/っｵ;},'\\x4d\\x6b\\x63\\x55\\x4c':function(べメ,ゖヹ){return べメ!==ゖヹ;},'\\x50\\x63\\x62\\x67\\x56':function(ョん,ャん){return ョん%ャん;}},ゴヴ=ｽぜ['\\x72\\x76\\x6e\\x64'+'\\x46']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),しダ=-0x2252+-0x43d+0x268f;while(!![]){switch(ゴヴ[しダ++]){case'\\x30':var ﾋｼ;continue;case'\\x31':var シゑ;continue;case'\\x32':var ゾﾀ;continue;case'\\x33':var どミ;continue;case'\\x34':for(ｮふ=-0x1a+-0x35d+0x377;ｽぜ['\\x44\\x6e\\x7a\\x6d'+'\\x47'](ｮふ,ｺぇ['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68']);ｮふ+=-0x1d3+-0x2*0x75+0xf*0x33){var ぬア=ｽぜ['\\x4d\\x75\\x51\\x69'+'\\x6d']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),あざ=0x4*0x43b+-0x60+-0x108c;while(!![]){switch(ぬア[あざ++]){case'\\x30':for(ヵゲ=-0x1aec+0x6*0x581+-0x61a;ｽぜ['\\x44\\x6e\\x7a\\x6d'+'\\x47'](ヵゲ,0x75*0x15+-0xdd8*0x1+0x44f*0x1);ヵゲ++){ぬそ[ヵゲ]=ｽぜ['\\x45\\x58\\x6b\\x52'+'\\x6b'](fanqieU32,ｽぜ['\\x62\\x6f\\x49\\x5a'+'\\x74'](ｽぜ['\\x67\\x50\\x53\\x45'+'\\x54'](ｽぜ['\\x63\\x59\\x65\\x70'+'\\x54'](ｽぜ['\\x50\\x50\\x4a\\x78'+'\\x68'](ｸエ['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](ｽぜ['\\x75\\x6c\\x68\\x48'+'\\x70'](ヵゲ,-0x12af+0x48f+-0x14*-0xb5)),-0x9*0x18a+0x2*0x12b7+0xa7*-0x24),ｽぜ['\\x68\\x6c\\x42\\x71'+'\\x67'](ｸエ['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](ｽぜ['\\x68\\x5a\\x42\\x61'+'\\x70'](ｽぜ['\\x75\\x6c\\x68\\x48'+'\\x70'](ヵゲ,0x195d+-0x1144+-0x815),0x1c91+0x1bb3+-0x3843*0x1)),0x1a11+-0x3*-0x6cf+0xe*-0x351)),ｽぜ['\\x4d\\x53\\x64\\x46'+'\\x67'](ｸエ['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](ｽぜ['\\x50\\x41\\x45\\x72'+'\\x67'](ｽぜ['\\x6a\\x6a\\x54\\x61'+'\\x44'](ヵゲ,-0xa4d+0x2*-0x5d+-0x1*-0xb0b),-0x7e3+-0x2334*-0x1+0x1*-0x1b4f)),-0x71*-0x4f+0xa6*0x7+-0x2761)),ｸエ['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](ｽぜ['\\x4c\\x66\\x52\\x58'+'\\x51'](ｽぜ['\\x52\\x4e\\x70\\x6c'+'\\x59'](ヵゲ,-0x21ad+-0x5*0x10d+-0x1379*-0x2),-0x2*-0x6fb+0x11ab+-0x3*0xa8a))));}continue;case'\\x31':for(ヵゲ=0x1*-0x1085+-0x1*0x222f+0x32c4;ｽぜ['\\x55\\x52\\x59\\x50'+'\\x69'](ヵゲ,0x25d+0x2209+0x7d*-0x4a);ヵゲ++){どミ=ｽぜ['\\x45\\x58\\x6b\\x52'+'\\x6b'](fanqieU32,ｽぜ['\\x49\\x4f\\x45\\x53'+'\\x6b'](ｽぜ['\\x46\\x64\\x61\\x72'+'\\x68'](ぬそ[ｽぜ['\\x68\\x6b\\x48\\x77'+'\\x76'](ヵゲ,0x1*0x1ffc+0x103a+0x1*-0x3026)],ぬそ[ｽぜ['\\x79\\x49\\x6f\\x68'+'\\x64'](ヵゲ,-0x2186+-0xf15+0x30a4)]),ｽぜ['\\x77\\x52\\x52\\x74'+'\\x67'](fanqieRotl32,ぬそ[ｽぜ['\\x79\\x49\\x6f\\x68'+'\\x64'](ヵゲ,-0x45+-0x26e6*-0x1+0x1*-0x269e)],-0x4f*0x13+-0x3*0x251+0xcdf))),ぬそ[ヵゲ]=ｽぜ['\\x45\\x58\\x6b\\x52'+'\\x6b'](fanqieU32,ｽぜ['\\x49\\x4f\\x45\\x53'+'\\x6b'](ｽぜ['\\x46\\x64\\x61\\x72'+'\\x68'](ｽぜ['\\x59\\x42\\x6b\\x79'+'\\x65'](fanqieP1,どミ),ｽぜ['\\x79\\x4d\\x55\\x41'+'\\x74'](fanqieRotl32,ぬそ[ｽぜ['\\x51\\x74\\x4a\\x46'+'\\x72'](ヵゲ,-0x18e*0x19+0x1*-0x961+-0x464*-0xb)],-0x2602+0x207+0x2402)),ぬそ[ｽぜ['\\x66\\x68\\x71\\x71'+'\\x54'](ヵゲ,-0xb27*-0x3+0x1c97*0x1+0x1f03*-0x2)]));}continue;case'\\x32':ハグ[-0x9d3+-0x1b7*-0x4+0x3*0xfd]=ｽぜ['\\x59\\x42\\x6b\\x79'+'\\x65'](fanqieU32,ｽぜ['\\x46\\x64\\x61\\x72'+'\\x68'](ハグ[0x2090+0x2a4*-0xd+-0x1*-0x1c4],ぺヅ));continue;case'\\x33':ォみ=シゑ[0x1b77+-0x14f0+-0x685*0x1];continue;case'\\x34':ハグ[0x178f+0x1*-0x199b+-0x5*-0x6a]=ｽぜ['\\x45\\x58\\x6b\\x52'+'\\x6b'](fanqieU32,ｽぜ['\\x49\\x47\\x57\\x6d'+'\\x78'](ハグ[-0x9f8+0x2ad*0x9+0xe17*-0x1],とヒ));continue;case'\\x35':ハグ[0x1159+-0x7*0x3ac+0x85d]=ｽぜ['\\x59\\x42\\x6b\\x79'+'\\x65'](fanqieU32,ｽぜ['\\x46\\x64\\x61\\x72'+'\\x68'](ハグ[-0x1826+-0x1a*-0x33+0x12fa],ォみ));continue;case'\\x36':ｾも=シゑ[-0x2694+0x32+-0x1*-0x2669];continue;case'\\x37':ハグ[0x556*0x7+0x72*0x47+-0x13*0x3a1]=ｽぜ['\\x59\\x42\\x6b\\x79'+'\\x65'](fanqieU32,ｽぜ['\\x49\\x4f\\x45\\x53'+'\\x6b'](ハグ[0xa3a+0x4*-0x272+-0x1*0x6d],ムぃ));continue;case'\\x38':ぬそ=new Array(-0x1*-0x22cb+-0x2272+0x7*-0x3);continue;case'\\x39':ハグ[0x1448+-0x1862+0x41b]=ｽぜ['\\x78\\x5a\\x53\\x6e'+'\\x4d'](fanqieU32,ｽぜ['\\x48\\x41\\x6a\\x49'+'\\x4f'](ハグ[-0x1*-0x16a+-0xa99*0x1+0x930],ヒｻ));continue;case'\\x31\\x30':for(ﾋｼ=-0x1*-0x2453+0x2059+-0x3*0x16e4;ｽぜ['\\x72\\x46\\x5a\\x63'+'\\x52'](ﾋｼ,-0x22a8+0x1e87+0x461);ﾋｼ++){var ペヹ=ｽぜ['\\x64\\x7a\\x45\\x4f'+'\\x73']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),べこ=0x13*-0x1fd+0x1828+0xb*0x13d;while(!![]){switch(ペヹ[べこ++]){case'\\x30':ｾも=とヒ;continue;case'\\x31':ヒｻ=ぺヅ;continue;case'\\x32':ゾﾀ=ｽぜ['\\x45\\x58\\x6b\\x52'+'\\x6b'](fanqieU32,ｽぜ['\\x79\\x4c\\x4d\\x4b'+'\\x77'](ｽぜ['\\x79\\x4c\\x4d\\x4b'+'\\x77'](ｽぜ['\\x50\\x41\\x45\\x72'+'\\x67'](チェ,ぼﾄ),ネｹ),ポバ[ﾋｼ]));continue;case'\\x33':ネｹ=ｽぜ['\\x45\\x58\\x6b\\x52'+'\\x6b'](fanqieU32,ｽぜ['\\x6e\\x54\\x49\\x66'+'\\x6a'](ポヱ,ｽぜ['\\x79\\x4d\\x55\\x41'+'\\x74'](fanqieRotl32,ぺヅ,-0x20*0x4f+0x12c0+-0x8d4)));continue;case'\\x34':ムぃ=ｫラ;continue;case'\\x35':ｫラ=ｽぜ['\\x6a\\x55\\x67\\x67'+'\\x44'](fanqieP0,ﾑゔ);continue;case'\\x36':ォみ=ｽぜ['\\x78\\x55\\x75\\x55'+'\\x56'](fanqieRotl32,ヒｻ,-0x791+0x138d*-0x1+0x1b27*0x1);continue;case'\\x37':カぽ=ｽぜ['\\x73\\x51\\x65\\x4f'+'\\x4a'](ﾋｼ,-0xe*0x25+0x441*-0x1+-0x657*-0x1)?0x64b*-0xcc908+0x3e10d2d*-0x2f+-0x4*-0x6024b16d:-0xf404022+0x574428a3+0x3283b509;continue;case'\\x38':ﾑゔ=ｽぜ['\\x59\\x4b\\x78\\x57'+'\\x79'](fanqieU32,ｽぜ['\\x79\\x4c\\x4d\\x4b'+'\\x77'](ｽぜ['\\x68\\x5a\\x42\\x61'+'\\x70'](ｽぜ['\\x4c\\x63\\x4e\\x69'+'\\x74'](かぺ,ｾも),ポヱ),ぬそ[ﾋｼ]));continue;case'\\x39':ｽぜ['\\x73\\x51\\x65\\x4f'+'\\x4a'](ﾋｼ,0x200e+-0x1095+-0xf69)?(チェ=ｽぜ['\\x48\\x41\\x6a\\x49'+'\\x4f'](ｽぜ['\\x6e\\x54\\x49\\x66'+'\\x6a'](ぺヅ,ヒｻ),ォみ),かぺ=ｽぜ['\\x49\\x47\\x57\\x6d'+'\\x78'](ｽぜ['\\x68\\x58\\x4c\\x4f'+'\\x6b'](ｫラ,ムぃ),とヒ)):(チェ=ｽぜ['\\x63\\x59\\x65\\x70'+'\\x54'](ｽぜ['\\x63\\x59\\x65\\x70'+'\\x54'](ｽぜ['\\x41\\x70\\x42\\x79'+'\\x65'](ぺヅ,ヒｻ),ｽぜ['\\x41\\x70\\x42\\x79'+'\\x65'](ぺヅ,ォみ)),ｽぜ['\\x49\\x54\\x43\\x77'+'\\x75'](ヒｻ,ォみ)),かぺ=ｽぜ['\\x79\\x76\\x54\\x71'+'\\x6f'](ｽぜ['\\x61\\x67\\x65\\x74'+'\\x53'](ｫラ,ムぃ),ｽぜ['\\x6b\\x71\\x79\\x50'+'\\x50'](~ｫラ,とヒ)));continue;case'\\x31\\x30':とヒ=ｽぜ['\\x62\\x70\\x53\\x4e'+'\\x49'](fanqieRotl32,ムぃ,0x2384+0x1*0x269f+0x1*-0x4a10);continue;case'\\x31\\x31':ポヱ=ｽぜ['\\x62\\x70\\x53\\x4e'+'\\x49'](fanqieRotl32,ｽぜ['\\x59\\x4b\\x78\\x57'+'\\x79'](fanqieU32,ｽぜ['\\x4c\\x66\\x52\\x58'+'\\x51'](ｽぜ['\\x4c\\x63\\x4e\\x69'+'\\x74'](ｽぜ['\\x54\\x63\\x58\\x52'+'\\x4a'](fanqieRotl32,ぺヅ,-0x8*0x32b+-0x15f3+0x2f57),ｫラ),ｽぜ['\\x78\\x55\\x75\\x55'+'\\x56'](fanqieRotl32,カぽ,ｽぜ['\\x41\\x70\\x42\\x79'+'\\x65'](ﾋｼ,0x19a*-0x13+-0x1a1a+0x38a7)))),0x231a+0xce*0x2b+-0x45ad);continue;case'\\x31\\x32':ぼﾄ=ォみ;continue;case'\\x31\\x33':ぺヅ=ゾﾀ;continue;}break;}}continue;case'\\x31\\x31':ハグ[-0x140a+0x40b+0x1002]=ｽぜ['\\x78\\x5a\\x53\\x6e'+'\\x4d'](fanqieU32,ｽぜ['\\x49\\x47\\x57\\x6d'+'\\x78'](ハグ[0x1c81*0x1+-0x1e8e+0x210],ぼﾄ));continue;case'\\x31\\x32':ポバ=new Array(-0x1*-0x10d5+-0x4*0x7c3+0x17*0xa1);continue;case'\\x31\\x33':とヒ=シゑ[0x1189+-0x5ed+-0xb96*0x1];continue;case'\\x31\\x34':ムぃ=シゑ[0x1639+0x2152+-0x17*0x26a];continue;case'\\x31\\x35':for(ヵゲ=0x2*0x77b+-0x117c+0x286;ｽぜ['\\x72\\x46\\x5a\\x63'+'\\x52'](ヵゲ,-0x3*-0x191+-0x3e2+-0x1d*0x5);ヵゲ++)ポバ[ヵゲ]=ｽぜ['\\x59\\x42\\x6b\\x79'+'\\x65'](fanqieU32,ｽぜ['\\x4d\\x76\\x54\\x59'+'\\x76'](ぬそ[ヵゲ],ぬそ[ｽぜ['\\x61\\x46\\x54\\x44'+'\\x43'](ヵゲ,0xf99+-0x2115+0x1180)]));continue;case'\\x31\\x36':ぺヅ=シゑ[-0xa3a+-0x1*-0x2596+0x22*-0xce];continue;case'\\x31\\x37':ｸエ=ｺぇ['\\x73\\x75\\x62\\x73'+'\\x74\\x72\\x69\\x6e'+'\\x67'](ｮふ,ｽぜ['\\x42\\x45\\x74\\x6e'+'\\x6a'](ｮふ,-0x4*-0x6b2+-0x92+-0x2*0xcfb));continue;case'\\x31\\x38':ハグ[-0x25d9*0x1+-0x1474+-0x1*-0x3a54]=ｽぜ['\\x47\\x6d\\x65\\x54'+'\\x48'](fanqieU32,ｽぜ['\\x4d\\x76\\x54\\x59'+'\\x76'](ハグ[0x1e0+-0x1911+0x1738],ｾも));continue;case'\\x31\\x39':シゑ=ハグ['\\x73\\x6c\\x69\\x63'+'\\x65'](0x141e+-0x7*0x2a5+0x3*-0x89);continue;case'\\x32\\x30':ぼﾄ=シゑ[-0x187d*0x1+-0x33e+0x43*0x6a];continue;case'\\x32\\x31':ｫラ=シゑ[0x178*0x8+-0x11b*0x17+0x2bd*0x5];continue;case'\\x32\\x32':ハグ[-0x1*-0x7e8+0x434*0x1+-0xc18]=ｽぜ['\\x78\\x5a\\x53\\x6e'+'\\x4d'](fanqieU32,ｽぜ['\\x70\\x72\\x51\\x71'+'\\x46'](ハグ[0x606*0x3+-0x664+-0xbaa],ｫラ));continue;case'\\x32\\x33':ヒｻ=シゑ[0x2380+0xf58*0x1+0x2ad*-0x13];continue;}break;}}continue;case'\\x35':var ｫラ;continue;case'\\x36':var ヒｻ;continue;case'\\x37':var ハグ=[-0xac161aab+0x30e65*-0xd90+0x2*0xa484b575,-0x6f1cc963+-0x2bd9e62c+0xe40b6248,0x1413a7*0x4+-0x80938e5+0x1edd2d20,0x6de77699+-0x81b66c7f+0x3*0x4f72fea2,-0xf15192cd+-0x13454b21f+0x60613c*0x776,-0x2*0x1606eebc+0x14*0x46a792+0x3cb9feba,0xb6cbe12b+-0x1b8040fc+0x48424e1e,-0x7bfe70fe*-0x1+-0x606f*0x3ab77+0x196e095e9];continue;case'\\x38':var ポヱ;continue;case'\\x39':for(ヵゲ=-0x745*-0x2+0xbfb*-0x1+-0x28f;ｽぜ['\\x43\\x49\\x75\\x7a'+'\\x67'](ヵゲ,0x9*0x335+-0x26f6+0xa21);ヵゲ++)ギぁ+=ｽぜ['\\x59\\x42\\x6b\\x79'+'\\x65'](fanqiePackBe32,ハグ[ヵゲ]);continue;case'\\x31\\x30':return ギぁ;case'\\x31\\x31':ｺぇ+=ｽぜ['\\x47\\x6d\\x65\\x54'+'\\x48'](fanqiePackBe32,かレ);continue;case'\\x31\\x32':var かレ=ｽぜ['\\x6a\\x6a\\x54\\x61'+'\\x44'](ホﾐ['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68'],0x96f+0x3da+-0xd41);continue;case'\\x31\\x33':var ｾも;continue;case'\\x31\\x34':var ポバ;continue;case'\\x31\\x35':var チェ;continue;case'\\x31\\x36':var ギぁ='';continue;case'\\x31\\x37':var ｺぇ=ｽぜ['\\x68\\x5a\\x42\\x61'+'\\x70'](ホﾐ,'\\u0080');continue;case'\\x31\\x38':var ｸエ;continue;case'\\x31\\x39':var ぼﾄ;continue;case'\\x32\\x30':var カぽ;continue;case'\\x32\\x31':var ヵゲ;continue;case'\\x32\\x32':var ネｹ;continue;case'\\x32\\x33':var かぺ;continue;case'\\x32\\x34':ｺぇ+=ｽぜ['\\x55\\x52\\x46\\x6b'+'\\x77'](fanqiePackBe32,Math['\\x66\\x6c\\x6f\\x6f'+'\\x72'](ｽぜ['\\x54\\x74\\x4f\\x4c'+'\\x47'](かレ,-0x428*0x244a57+-0x8*0x37ec6c07+-0x323f8cd*-0x110)));continue;case'\\x32\\x35':var ﾑゔ;continue;case'\\x32\\x36':var ぺヅ;continue;case'\\x32\\x37':var とヒ;continue;case'\\x32\\x38':while(ｽぜ['\\x4d\\x6b\\x63\\x55'+'\\x4c'](ｽぜ['\\x50\\x63\\x62\\x67'+'\\x56'](ｺぇ['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68'],-0x1582*0x1+-0x1e3*0x1+-0x17a5*-0x1),0xaa5*-0x1+-0xb65*0x2+0x21a7))ｺぇ+='\\x00';continue;case'\\x32\\x39':var ォみ;continue;case'\\x33\\x30':var ｮふ;continue;case'\\x33\\x31':var ムぃ;continue;case'\\x33\\x32':var ぬそ;continue;}break;}}function fanqieRotl32(ナぽ,ｾﾛ){var ボり={'\\x66\\x6a\\x61\\x56\\x6f':function(げｾ,ぎﾋ){return げｾ(ぎﾋ);},'\\x6c\\x6c\\x42\\x6f\\x54':function(カｽ,シぉ){return カｽ===シぉ;},'\\x41\\x47\\x52\\x74\\x56':function(ﾈァ,ヶｲ){return ﾈァ(ヶｲ);},'\\x64\\x41\\x6a\\x75\\x77':function(ァぐ,ｻﾅ){return ァぐ|ｻﾅ;},'\\x44\\x73\\x71\\x4e\\x69':function(ﾈｦ,ﾊわ){return ﾈｦ<<ﾊわ;},'\\x6e\\x53\\x65\\x41\\x6d':function(ばス,ﾊへ){return ばス>>>ﾊへ;},'\\x4b\\x53\\x4b\\x54\\x47':function(サス,みｸ){return サス-みｸ;}};return ｾﾛ&=-0x1983+-0x1a*-0x8+0x18d2,ナぽ=ボり['\\x66\\x6a\\x61\\x56'+'\\x6f'](fanqieU32,ナぽ),ボり['\\x6c\\x6c\\x42\\x6f'+'\\x54'](ｾﾛ,0xb0d+0xb*0x317+-0x2d0a)?ナぽ:ボり['\\x41\\x47\\x52\\x74'+'\\x56'](fanqieU32,ボり['\\x64\\x41\\x6a\\x75'+'\\x77'](ボり['\\x44\\x73\\x71\\x4e'+'\\x69'](ナぽ,ｾﾛ),ボり['\\x6e\\x53\\x65\\x41'+'\\x6d'](ナぽ,ボり['\\x4b\\x53\\x4b\\x54'+'\\x47'](-0x116f*-0x1+0x1*0x25d3+-0x1*0x3722,ｾﾛ))));}function fanqieP0(はﾍ){var ンあ={'\\x45\\x59\\x6a\\x77\\x52':function(ぅっ,ﾎそ){return ぅっ(ﾎそ);},'\\x70\\x4a\\x76\\x48\\x6c':function(ﾇプ,ﾎｿ){return ﾇプ^ﾎｿ;},'\\x4a\\x77\\x58\\x74\\x55':function(ユン,ぁﾜ){return ユン^ぁﾜ;},'\\x64\\x4e\\x49\\x4b\\x61':function(ぴﾇ,ほバ,ぜだ){return ぴﾇ(ほバ,ぜだ);},'\\x51\\x75\\x69\\x43\\x41':function(ぽﾑ,カヶ,っサ){return ぽﾑ(カヶ,っサ);}};return ンあ['\\x45\\x59\\x6a\\x77'+'\\x52'](fanqieU32,ンあ['\\x70\\x4a\\x76\\x48'+'\\x6c'](ンあ['\\x4a\\x77\\x58\\x74'+'\\x55'](はﾍ,ンあ['\\x64\\x4e\\x49\\x4b'+'\\x61'](fanqieRotl32,はﾍ,0x37c+-0x2076+0x1d03)),ンあ['\\x51\\x75\\x69\\x43'+'\\x41'](fanqieRotl32,はﾍ,-0x3*0xc76+0x2134+-0x43f*-0x1)));}function fanqieP1(ﾜミ){var ぶゐ={'\\x6e\\x59\\x4d\\x70\\x6c':function(ビﾙ,ヹﾜ){return ビﾙ(ヹﾜ);},'\\x62\\x65\\x74\\x70\\x7a':function(ナｯ,チた){return ナｯ^チた;},'\\x4c\\x42\\x78\\x72\\x67':function(ミゼ,ねれ,ﾂｮ){return ミゼ(ねれ,ﾂｮ);},'\\x6c\\x4e\\x6e\\x6c\\x45':function(ぁｬ,つュ,サぅ){return ぁｬ(つュ,サぅ);}};return ぶゐ['\\x6e\\x59\\x4d\\x70'+'\\x6c'](fanqieU32,ぶゐ['\\x62\\x65\\x74\\x70'+'\\x7a'](ぶゐ['\\x62\\x65\\x74\\x70'+'\\x7a'](ﾜミ,ぶゐ['\\x4c\\x42\\x78\\x72'+'\\x67'](fanqieRotl32,ﾜミ,-0xf42+0x1b92+-0xc41)),ぶゐ['\\x6c\\x4e\\x6e\\x6c'+'\\x45'](fanqieRotl32,ﾜミ,0x3a2*-0x3+0x25f6+-0x1af9)));}function fanqieVarint(うヤ){var ヂル={'\\x46\\x45\\x71\\x58\\x78':function(ずつ,ヤあ){return ずつ(ヤあ);},'\\x74\\x66\\x67\\x53\\x77':function(ョｯ,いボ){return ョｯ>いボ;},'\\x63\\x4d\\x47\\x69\\x4b':function(クズ,ｶﾀ){return クズ|ｶﾀ;},'\\x56\\x54\\x42\\x73\\x48':function(ビポ,ゥょ){return ビポ&ゥょ;},'\\x65\\x41\\x76\\x72\\x58':function(レツ,ﾌぉ){return レツ/ﾌぉ;},'\\x62\\x79\\x6e\\x46\\x75':function(ゕわ,ｲプ){return ゕわ+ｲプ;},'\\x7a\\x45\\x72\\x7a\\x56':function(ぷづ,ｽぃ){return ぷづ&ｽぃ;}},マン='';うヤ=ヂル['\\x46\\x45\\x71\\x58'+'\\x78'](fanqieU32,うヤ);while(ヂル['\\x74\\x66\\x67\\x53'+'\\x77'](うヤ,0x1d15+-0xcc7*-0x1+-0x295c)){マン+=String['\\x66\\x72\\x6f\\x6d'+'\\x43\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'](ヂル['\\x63\\x4d\\x47\\x69'+'\\x4b'](ヂル['\\x56\\x54\\x42\\x73'+'\\x48'](うヤ,0xac*-0x25+-0x3*0xbc3+0x3ca4),-0x1*-0xe21+0x1*0x1f85+-0x2*0x1693)),うヤ=Math['\\x66\\x6c\\x6f\\x6f'+'\\x72'](ヂル['\\x65\\x41\\x76\\x72'+'\\x58'](うヤ,0x1815+-0x71*-0x1+0x52*-0x4b));}return ヂル['\\x62\\x79\\x6e\\x46'+'\\x75'](マン,String['\\x66\\x72\\x6f\\x6d'+'\\x43\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'](ヂル['\\x7a\\x45\\x72\\x7a'+'\\x56'](うヤ,0x12bf+0x4*0x70a+0x2e68*-0x1)));}function fanqieFieldVarint(ぼシ,ゅデ){var ルフ={'\\x68\\x68\\x55\\x61\\x52':function(ぉぺ,るゾ){return ぉぺ+るゾ;},'\\x53\\x48\\x51\\x4c\\x69':function(へﾋ,ｱブ){return へﾋ(ｱブ);},'\\x45\\x62\\x55\\x48\\x76':function(ﾖぢ,ﾘラ){return ﾖぢ<<ﾘラ;}};return ルフ['\\x68\\x68\\x55\\x61'+'\\x52'](ルフ['\\x53\\x48\\x51\\x4c'+'\\x69'](fanqieVarint,ルフ['\\x45\\x62\\x55\\x48'+'\\x76'](ぼシ,0x1216+0x1*0x181f+-0x16*0x1eb)),ルフ['\\x53\\x48\\x51\\x4c'+'\\x69'](fanqieVarint,ゅデ));}function fanqieFieldBytes(ぼぞ,れｵ){var ｳェ={'\\x58\\x51\\x6d\\x51\\x54':function(ゥぜ,ソｲ){return ゥぜ+ソｲ;},'\\x41\\x51\\x71\\x4e\\x56':function(ﾀぞ,ほネ){return ﾀぞ(ほネ);},'\\x53\\x65\\x6e\\x52\\x47':function(フﾚ,ベｰ){return フﾚ|ベｰ;},'\\x54\\x78\\x44\\x6b\\x5a':function(リぁ,をﾈ){return リぁ<<をﾈ;}};return ｳェ['\\x58\\x51\\x6d\\x51'+'\\x54'](ｳェ['\\x58\\x51\\x6d\\x51'+'\\x54'](ｳェ['\\x41\\x51\\x71\\x4e'+'\\x56'](fanqieVarint,ｳェ['\\x53\\x65\\x6e\\x52'+'\\x47'](ｳェ['\\x54\\x78\\x44\\x6b'+'\\x5a'](ぼぞ,-0x18*0xe3+-0x2000+-0x7*-0x79d),-0x83+-0x1*0xa85+0xb0a)),ｳェ['\\x41\\x51\\x71\\x4e'+'\\x56'](fanqieVarint,れｵ['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68'])),れｵ);}function fanqieFieldString(へづ,ｶゕ){var ﾂど={'\\x41\\x43\\x42\\x4f\\x5a':function(ぱヂ,ァぷ,ｧネ){return ぱヂ(ァぷ,ｧネ);},'\\x43\\x71\\x64\\x49\\x63':function(いへ,うえ){return いへ(うえ);}};return ﾂど['\\x41\\x43\\x42\\x4f'+'\\x5a'](fanqieFieldBytes,へづ,ﾂど['\\x43\\x71\\x64\\x49'+'\\x63'](fanqieUtf8,ﾂど['\\x43\\x71\\x64\\x49'+'\\x63'](String,ｶゕ)));}function fanqieParseQuery(ﾍダ){var ぎﾆ={'\\x63\\x6b\\x58\\x70\\x68':function(ムチ,ぷﾄ){return ムチ<ぷﾄ;},'\\x70\\x4c\\x6c\\x76\\x73':function(ゲれ,ﾉﾅ){return ゲれ===ﾉﾅ;},'\\x45\\x43\\x4d\\x48\\x61':function(ヸヺ,すﾝ){return ヸヺ<すﾝ;},'\\x6f\\x67\\x4e\\x76\\x70':function(プと,ﾅや){return プと+ﾅや;},'\\x66\\x62\\x52\\x69\\x4b':function(がﾍ,ペし){return がﾍ(ペし);}},ホオ={},ﾖｻ=ﾍダ['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x26'),イﾍ,ｨが,ｷﾋ,ヺゴ,ヶガ;for(イﾍ=0x1f1d+0x1b01+-0x3a1e;ぎﾆ['\\x63\\x6b\\x58\\x70'+'\\x68'](イﾍ,ﾖｻ['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68']);イﾍ++){ｨが=ﾖｻ[イﾍ];if(ぎﾆ['\\x70\\x4c\\x6c\\x76'+'\\x73'](ｨが,''))continue;ｷﾋ=ｨが['\\x69\\x6e\\x64\\x65'+'\\x78\\x4f\\x66']('\\x3d'),ヺゴ=ぎﾆ['\\x45\\x43\\x4d\\x48'+'\\x61'](ｷﾋ,-0x2535*-0x1+0x21d*-0x11+0x29*-0x8)?ｨが:ｨが['\\x73\\x75\\x62\\x73'+'\\x74\\x72\\x69\\x6e'+'\\x67'](-0x704*-0x4+-0x41b*0x3+-0xfbf,ｷﾋ),ヶガ=ぎﾆ['\\x45\\x43\\x4d\\x48'+'\\x61'](ｷﾋ,-0x1ae+-0x36d+-0x51b*-0x1)?'':ｨが['\\x73\\x75\\x62\\x73'+'\\x74\\x72\\x69\\x6e'+'\\x67'](ぎﾆ['\\x6f\\x67\\x4e\\x76'+'\\x70'](ｷﾋ,-0x26e8+0x1*0x1075+0x1674));try{ヺゴ=ぎﾆ['\\x66\\x62\\x52\\x69'+'\\x4b'](decodeURIComponent,ヺゴ['\\x72\\x65\\x70\\x6c'+'\\x61\\x63\\x65'](/\\+/g,'\\x20')),ヶガ=ぎﾆ['\\x66\\x62\\x52\\x69'+'\\x4b'](decodeURIComponent,ヶガ['\\x72\\x65\\x70\\x6c'+'\\x61\\x63\\x65'](/\\+/g,'\\x20'));}catch(ｲよ){}ホオ[ヺゴ]=ヶガ;}return ホオ;}function fanqieInt(きオ){var ルﾘ={'\\x74\\x44\\x6f\\x72\\x52':function(ズザ,りｦ){return ズザ(りｦ);},'\\x70\\x6e\\x68\\x46\\x43':function(れェ,なﾒ,ゆぁ){return れェ(なﾒ,ゆぁ);}},ﾄも=ルﾘ['\\x74\\x44\\x6f\\x72'+'\\x52'](String,きオ),ヘｦ=ﾄも['\\x6d\\x61\\x74\\x63'+'\\x68'](/^[\\s]*[+-]?\\d+/);return ヘｦ?ルﾘ['\\x70\\x6e\\x68\\x46'+'\\x43'](parseInt,ヘｦ[-0x5de+0x7*-0x34a+0x1ce4],-0xeeb*0x1+0x1*0x13f7+-0x502):-0x965*0x4+-0xe70+0x3404;}function fanqieOsDword(ズぢ){var ヲづ={'\\x6d\\x72\\x77\\x50\\x63':'\\x33\\x7c\\x30\\x7c'+'\\x35\\x7c\\x32\\x7c'+'\\x36\\x7c\\x31\\x7c'+'\\x34','\\x74\\x56\\x4f\\x59\\x79':function(あぜ,ゐひ){return あぜ<ゐひ;},'\\x58\\x47\\x69\\x51\\x5a':function(ヸぎ,はの){return ヸぎ*はの;},'\\x65\\x48\\x6a\\x68\\x67':function(チほ,ﾃレ,あﾕ){return チほ(ﾃレ,あﾕ);},'\\x5a\\x71\\x5a\\x58\\x68':function(まチ,ヒギ){return まチ(ヒギ);},'\\x77\\x6e\\x71\\x75\\x55':function(ぱン,ろｼ){return ぱン(ろｼ);},'\\x71\\x6b\\x78\\x70\\x77':function(ｺッ,ゃｬ){return ｺッ<ゃｬ;},'\\x59\\x77\\x4e\\x4a\\x63':function(ガﾄ,ブヅ){return ガﾄ+ブヅ;}},えﾁ=ヲづ['\\x6d\\x72\\x77\\x50'+'\\x63']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),ナヰ=0x1588+0x1c86+-0x320e;while(!![]){switch(えﾁ[ナヰ++]){case'\\x30':var ｾと=[0x79c6+0x4e52+-0x7818,0x1e*0x90+0x2597+0xf*-0x319,0x7*0x143888+0x184efa0+-0x2*0x693dac,0x29a8cb*-0x1+0x352697+0x148234,-0x402d*0x1c373+0x6c6cb161+0x54bf69d6,0x1*0xcd2c797+-0xfe1e4e0+0x1*0xb0f1d49];continue;case'\\x31':for(ロあ=0x1*-0x43+-0x2364+0x23a7;ヲづ['\\x74\\x56\\x4f\\x59'+'\\x79'](ロあ,0x1*-0x1f7f+0xd6*-0xd+0x2a63);ロあ++)せレ+=ヲづ['\\x58\\x47\\x69\\x51'+'\\x5a'](ヲづ['\\x65\\x48\\x6a\\x68'+'\\x67'](parseInt,ぷゐ['\\x63\\x68\\x61\\x72'+'\\x41\\x74'](ロあ),0x1129*0x1+0x1*0x23ac+-0x9f*0x55)||-0xefa+-0x1519+0x1*0x2413,ｾと[ロあ]);continue;case'\\x32':var ロあ;continue;case'\\x33':var ぷゐ=ヲづ['\\x5a\\x71\\x5a\\x58'+'\\x68'](String,ズぢ)['\\x72\\x65\\x70\\x6c'+'\\x61\\x63\\x65'](/\\./g,'');continue;case'\\x34':return ヲづ['\\x77\\x6e\\x71\\x75'+'\\x55'](fanqieU32,せレ);case'\\x35':var せレ=0x266*0xd+0xd*0x1ab+0x34dd*-0x1;continue;case'\\x36':while(ヲづ['\\x71\\x6b\\x78\\x70'+'\\x77'](ぷゐ['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68'],-0xaa1+-0x1036+0x1add))ぷゐ=ヲづ['\\x59\\x77\\x4e\\x4a'+'\\x63']('\\x30',ぷゐ);continue;}break;}}function fanqieLks(はぜ,そプ){var ﾍヘ={'\\x6d\\x6a\\x6f\\x45\\x72':'\\x34\\x7c\\x33\\x7c'+'\\x31\\x7c\\x31\\x33'+'\\x7c\\x39\\x7c\\x35'+'\\x7c\\x31\\x34\\x7c'+'\\x32\\x7c\\x31\\x31'+'\\x7c\\x31\\x30\\x7c'+'\\x38\\x7c\\x36\\x7c'+'\\x30\\x7c\\x37\\x7c'+'\\x31\\x32\\x7c\\x31'+'\\x35','\\x59\\x61\\x61\\x5a\\x6e':function(ゑむ,ペゃ){return ゑむ(ペゃ);},'\\x65\\x47\\x4f\\x7a\\x6f':function(ごセ,ぢｩ){return ごセ+ぢｩ;},'\\x58\\x41\\x59\\x52\\x4d':function(ﾑｨ,おマ){return ﾑｨ<おマ;},'\\x6f\\x4e\\x61\\x59\\x57':function(ツﾎ,ンｻ){return ツﾎ*ンｻ;},'\\x72\\x72\\x51\\x66\\x68':function(ィﾑ,キペ){return ィﾑ+キペ;},'\\x7a\\x69\\x73\\x4d\\x4d':function(ソね,エゎ){return ソね<エゎ;},'\\x65\\x46\\x41\\x63\\x7a':'\\x31\\x7c\\x32\\x7c'+'\\x34\\x7c\\x33\\x7c'+'\\x35\\x7c\\x37\\x7c'+'\\x36\\x7c\\x30','\\x74\\x68\\x69\\x47\\x58':function(フめ,のん,ヰッ){return フめ(のん,ヰッ);},'\\x47\\x47\\x4a\\x79\\x56':function(ﾎキ,ァﾓ,ｶロ){return ﾎキ(ァﾓ,ｶロ);},'\\x47\\x62\\x49\\x4b\\x77':function(ｵお,ﾇヵ){return ｵお^ﾇヵ;},'\\x65\\x45\\x7a\\x46\\x61':function(ゅお,ﾂィ,ぢガ){return ゅお(ﾂィ,ぢガ);}},ヹｭ=ﾍヘ['\\x6d\\x6a\\x6f\\x45'+'\\x72']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),ﾈｧ=0x1*0x19b+-0x935+0x79a;while(!![]){switch(ヹｭ[ﾈｧ++]){case'\\x30':ﾋゅ=[せヮ[-0x1*0x1fb2+-0x58d+0x2541],せヮ[-0x1*-0x111d+-0xb*-0x135+-0x1e61]];continue;case'\\x31':var ﾋゅ;continue;case'\\x32':var ベエ;continue;case'\\x33':var せヮ=[];continue;case'\\x34':var スけ=ﾍヘ['\\x59\\x61\\x61\\x5a'+'\\x6e'](fanqieMd5Hex,ﾍヘ['\\x65\\x47\\x4f\\x7a'+'\\x6f'](はぜ,ﾍヘ['\\x59\\x61\\x61\\x5a'+'\\x6e'](String,そプ)));continue;case'\\x35':var ﾋド;continue;case'\\x36':ﾋド=せヮ[0x268a*-0x1+0x22d7+0x9e*0x6];continue;case'\\x37':ﾎヘ=[せヮ[-0x1f76+-0x2*0x9f7+0x3364]];continue;case'\\x38':どぞ=せヮ[-0x11b7+0x15d0+-0x419];continue;case'\\x39':var どぞ;continue;case'\\x31\\x30':for(ダﾌ=-0x1*0x1708+0x2*0xe13+0xa*-0x83;ﾍヘ['\\x58\\x41\\x59\\x52'+'\\x4d'](ダﾌ,0x10a2+0x66d*0x5+-0x30bf*0x1);ダﾌ++)せヮ[ダﾌ]=ﾍヘ['\\x59\\x61\\x61\\x5a'+'\\x6e'](fanqieLoadLe64,スけ['\\x73\\x75\\x62\\x73'+'\\x74\\x72\\x69\\x6e'+'\\x67'](ﾍヘ['\\x6f\\x4e\\x61\\x59'+'\\x57'](ダﾌ,0xa7*0xb+-0x1aa+-0x17*0x3d),ﾍヘ['\\x72\\x72\\x51\\x66'+'\\x68'](ﾍヘ['\\x6f\\x4e\\x61\\x59'+'\\x57'](ダﾌ,0xcfc*-0x3+-0x1125+0x3821),0x1162*-0x2+-0x19d*-0xe+0xc36)));continue;case'\\x31\\x31':var ダﾌ;continue;case'\\x31\\x32':for(ダﾌ=0x16+-0x24d2+0x24bc;ﾍヘ['\\x7a\\x69\\x73\\x4d'+'\\x4d'](ダﾌ,-0xd*-0x21f+-0x188e+-0x2e3);ダﾌ++){var コヂ=ﾍヘ['\\x65\\x46\\x41\\x63'+'\\x7a']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),やｷ=-0x19*0x79+-0x14b7*-0x1+0x43*-0x22;while(!![]){switch(コヂ[やｷ++]){case'\\x30':ﾋド=ﾋゅ['\\x73\\x68\\x69\\x66'+'\\x74']();continue;case'\\x31':ベエ=どぞ;continue;case'\\x32':オト=ﾍヘ['\\x74\\x68\\x69\\x47'+'\\x58'](fanqieAdd64,ﾍヘ['\\x47\\x47\\x4a\\x79'+'\\x56'](fanqieRotr64,ﾋド,-0x33*-0x71+0x7fb*-0x1+-0xe80),ベエ);continue;case'\\x33':ﾋゅ['\\x70\\x75\\x73\\x68'](オト);continue;case'\\x34':オト[0x658+-0x941*-0x1+-0xf99]=ﾍヘ['\\x59\\x61\\x61\\x5a'+'\\x6e'](fanqieU32,ﾍヘ['\\x47\\x62\\x49\\x4b'+'\\x77'](オト[-0x1*0x1c09+-0x5b*0x49+0x35fc],ダﾌ));continue;case'\\x35':オト=ﾍヘ['\\x65\\x45\\x7a\\x46'+'\\x61'](fanqieXor64,オト,ﾍヘ['\\x65\\x45\\x7a\\x46'+'\\x61'](fanqieRotr64,ベエ,-0x1753+0x193f+0x1af*-0x1));continue;case'\\x36':どぞ=オト;continue;case'\\x37':ﾎヘ[ﾍヘ['\\x72\\x72\\x51\\x66'+'\\x68'](ダﾌ,-0x255e+-0x2335*0x1+0x4894)]=オト;continue;}break;}}continue;case'\\x31\\x33':var ﾎヘ;continue;case'\\x31\\x34':var オト;continue;case'\\x31\\x35':return ﾎヘ['\\x73\\x6c\\x69\\x63'+'\\x65'](0x1e0a*-0x1+0x1*-0xdd7+0x2be1,-0x6*-0x665+0x23e9+0x25*-0x201);}break;}}function fanqieLeb(ヘご,げた){var ｬｱ={'\\x43\\x4a\\x66\\x55\\x75':'\\x33\\x7c\\x34\\x7c'+'\\x30\\x7c\\x31\\x7c'+'\\x32','\\x79\\x43\\x5a\\x61\\x4e':function(ぜヲ,タく){return ぜヲ<タく;},'\\x45\\x59\\x64\\x43\\x4e':function(ヱポ,シリ,むポ){return ヱポ(シリ,むポ);},'\\x5a\\x5a\\x6c\\x65\\x76':function(キｶ,ゼし,ョｼ){return キｶ(ゼし,ョｼ);},'\\x6f\\x5a\\x55\\x55\\x5a':function(ﾍお,キｨ){return ﾍお+キｨ;},'\\x6d\\x66\\x45\\x57\\x77':function(ネﾀ,ゼぉ){return ネﾀ(ゼぉ);},'\\x48\\x67\\x45\\x65\\x6f':function(ぺシ,りて){return ぺシ(りて);}},ゅﾑ=ｬｱ['\\x43\\x4a\\x66\\x55'+'\\x75']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),づﾂ=0x26*0x29+0x108+0x2*-0x38f;while(!![]){switch(ゅﾑ[づﾂ++]){case'\\x30':var チぞ;continue;case'\\x31':for(チぞ=0x8*-0x410+-0x1*0x113d+0x31bd;ｬｱ['\\x79\\x43\\x5a\\x61'+'\\x4e'](チぞ,0xf94+-0x1*-0x1537+0x24a9*-0x1);チぞ++){せは=ｬｱ['\\x45\\x59\\x64\\x43'+'\\x4e'](fanqieXor64,げた[チぞ],ｬｱ['\\x45\\x59\\x64\\x43'+'\\x4e'](fanqieAdd64,ノブ,ｬｱ['\\x45\\x59\\x64\\x43'+'\\x4e'](fanqieRotr64,せは,0x1f4b+0x1f78+-0x3ebb))),ノブ=ｬｱ['\\x45\\x59\\x64\\x43'+'\\x4e'](fanqieXor64,せは,ｬｱ['\\x5a\\x5a\\x6c\\x65'+'\\x76'](fanqieRotr64,ノブ,-0x11e+-0x2693+0x27ee));}continue;case'\\x32':return ｬｱ['\\x6f\\x5a\\x55\\x55'+'\\x5a'](ｬｱ['\\x6d\\x66\\x45\\x57'+'\\x77'](fanqiePackLe64,ノブ),ｬｱ['\\x6d\\x66\\x45\\x57'+'\\x77'](fanqiePackLe64,せは));case'\\x33':var ノブ=ｬｱ['\\x48\\x67\\x45\\x65'+'\\x6f'](fanqieLoadLe64,ヘご['\\x73\\x75\\x62\\x73'+'\\x74\\x72\\x69\\x6e'+'\\x67'](0x197e+-0x35d+-0x1621,0x1fd*0x6+-0x42*0x3a+0x30e));continue;case'\\x34':var せは=ｬｱ['\\x6d\\x66\\x45\\x57'+'\\x77'](fanqieLoadLe64,ヘご['\\x73\\x75\\x62\\x73'+'\\x74\\x72\\x69\\x6e'+'\\x67'](-0x74a+-0xb4a*-0x2+-0x9*0x1b2,-0x1786+0x268a*-0x1+0x3e20));continue;}break;}}function fanqieRandomBytes(ｧぼ){var ぴﾚ={};ぴﾚ['\\x54\\x4c\\x72\\x6a'+'\\x54']='\\x30\\x7c\\x33\\x7c'+'\\x31\\x7c\\x34\\x7c'+'\\x32\\x7c\\x35',ぴﾚ['\\x5a\\x64\\x62\\x72'+'\\x57']=function(おぷ,ﾘゅ){return おぷ<ﾘゅ;},ぴﾚ['\\x54\\x41\\x7a\\x4e'+'\\x4b']=function(にｦ,ぁゔ){return にｦ*ぁゔ;},ぴﾚ['\\x58\\x68\\x5a\\x74'+'\\x50']=function(ぜア,がぅ){return ぜア!==がぅ;},ぴﾚ['\\x6c\\x4c\\x6b\\x74'+'\\x4e']='\\x75\\x6e\\x64\\x65'+'\\x66\\x69\\x6e\\x65'+'\\x64',ぴﾚ['\\x59\\x44\\x79\\x58'+'\\x6f']=function(るチ,ヸけ){return るチ&ヸけ;};var ヷﾀ=ぴﾚ,ザご=ヷﾀ['\\x54\\x4c\\x72\\x6a'+'\\x54']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),けた=0x1880+-0x38*0x9a+0x30*0x31;while(!![]){switch(ザご[けた++]){case'\\x30':var いた='';continue;case'\\x31':var ヸと;continue;case'\\x32':for(ノﾙ=-0x1ec8+-0x1ebc+-0x3d84*-0x1;ヷﾀ['\\x5a\\x64\\x62\\x72'+'\\x57'](ノﾙ,ｧぼ);ノﾙ++)いた+=String['\\x66\\x72\\x6f\\x6d'+'\\x43\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'](Math['\\x66\\x6c\\x6f\\x6f'+'\\x72'](ヷﾀ['\\x54\\x41\\x7a\\x4e'+'\\x4b'](Math['\\x72\\x61\\x6e\\x64'+'\\x6f\\x6d'](),-0x1*-0x119b+0x29*-0xc+-0x15*0xb3)));continue;case'\\x33':var ノﾙ;continue;case'\\x34':try{if(ヷﾀ['\\x58\\x68\\x5a\\x74'+'\\x50'](typeof Packages,ヷﾀ['\\x6c\\x4c\\x6b\\x74'+'\\x4e'])){ヸと=Packages['\\x6a\\x61\\x76\\x61']['\\x6c\\x61\\x6e\\x67']['\\x72\\x65\\x66\\x6c'+'\\x65\\x63\\x74']['\\x41\\x72\\x72\\x61'+'\\x79']['\\x6e\\x65\\x77\\x49'+'\\x6e\\x73\\x74\\x61'+'\\x6e\\x63\\x65'](Packages['\\x6a\\x61\\x76\\x61']['\\x6c\\x61\\x6e\\x67']['\\x42\\x79\\x74\\x65']['\\x54\\x59\\x50\\x45'],ｧぼ),new Packages['\\x6a\\x61\\x76\\x61']['\\x73\\x65\\x63\\x75'+'\\x72\\x69\\x74\\x79']['\\x53\\x65\\x63\\x75'+'\\x72\\x65\\x52\\x61'+'\\x6e\\x64\\x6f\\x6d']()['\\x6e\\x65\\x78\\x74'+'\\x42\\x79\\x74\\x65'+'\\x73'](ヸと);for(ノﾙ=-0x3*-0xa22+-0x17b+-0x1ceb;ヷﾀ['\\x5a\\x64\\x62\\x72'+'\\x57'](ノﾙ,ｧぼ);ノﾙ++)いた+=String['\\x66\\x72\\x6f\\x6d'+'\\x43\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'](ヷﾀ['\\x59\\x44\\x79\\x58'+'\\x6f'](ヸと[ノﾙ],0x1a*0xef+0x1856+0x3*-0xfdf));return いた;}}catch(かペ){}continue;case'\\x35':return いた;}break;}}function fanqieLs(ユぜ,げｱ,ｹニ){var ｿね={'\\x52\\x4f\\x42\\x41\\x54':'\\x36\\x7c\\x32\\x7c'+'\\x33\\x7c\\x30\\x7c'+'\\x35\\x7c\\x34\\x7c'+'\\x31','\\x52\\x58\\x76\\x69\\x4c':function(キハ,ズう){return キハ(ズう);},'\\x4b\\x68\\x44\\x57\\x62':function(ゼゑ,エィ){return ゼゑ+エィ;},'\\x6f\\x4f\\x41\\x6c\\x72':function(ろぅ,ワグ,ｦヲ){return ろぅ(ワグ,ｦヲ);},'\\x69\\x63\\x59\\x70\\x45':'\\x2d\\x31\\x36\\x31'+'\\x31\\x39\\x32\\x31'+'\\x37\\x36\\x34\\x2d'+'\\x33\\x30\\x31\\x39','\\x43\\x49\\x46\\x58\\x5a':function(ヲダ,ユイ){return ヲダ<ユイ;},'\\x41\\x45\\x4f\\x6b\\x41':function(ぽぽ,ゃシ){return ぽぽ===ゃシ;},'\\x65\\x64\\x4f\\x69\\x6a':function(グｼ,ｰォ){return グｼ===ｰォ;},'\\x6e\\x58\\x54\\x54\\x71':function(むゼ,ﾝレ){return むゼ(ﾝレ);}},カｦ=ｿね['\\x52\\x4f\\x42\\x41'+'\\x54']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),タギ=0x2515+0x2242+0x7*-0xa31;while(!![]){switch(カｦ[タギ++]){case'\\x30':var ﾇェ='';continue;case'\\x31':return ｿね['\\x52\\x58\\x76\\x69'+'\\x4c'](fanqieBase64Encode,ｿね['\\x4b\\x68\\x44\\x57'+'\\x62'](よｶ,ﾇェ));case'\\x32':var ﾔｬ=ｿね['\\x6f\\x4f\\x41\\x6c'+'\\x72'](fanqiePad,ｿね['\\x4b\\x68\\x44\\x57'+'\\x62'](ｿね['\\x52\\x58\\x76\\x69'+'\\x4c'](String,ユぜ),ｿね['\\x69\\x63\\x59\\x70'+'\\x45']),0x1aab+-0x19eb+-0xb0);continue;case'\\x33':var セャ=ｿね['\\x6f\\x4f\\x41\\x6c'+'\\x72'](fanqieLks,よｶ,ｹニ);continue;case'\\x34':for(ﾐバ=-0x295+0x3*-0x137+0x63a;ｿね['\\x43\\x49\\x46\\x58'+'\\x5a'](ﾐバ,ﾔｬ['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68']);ﾐバ+=0x943+0x487*-0x2+-0x25)ﾇェ+=ｿね['\\x6f\\x4f\\x41\\x6c'+'\\x72'](fanqieLeb,ﾔｬ['\\x73\\x75\\x62\\x73'+'\\x74\\x72\\x69\\x6e'+'\\x67'](ﾐバ,ｿね['\\x4b\\x68\\x44\\x57'+'\\x62'](ﾐバ,0x1aba+-0x35c*-0x4+0x6*-0x6af)),セャ);continue;case'\\x35':var ﾐバ;continue;case'\\x36':var よｶ=ｿね['\\x41\\x45\\x4f\\x6b'+'\\x41'](げｱ,null)||ｿね['\\x65\\x64\\x4f\\x69'+'\\x6a'](げｱ,undefined)?ｿね['\\x6e\\x58\\x54\\x54'+'\\x71'](fanqieRandomBytes,-0xc81+-0x3bd+0x2*0x821):げｱ;continue;}break;}}function fanqieSke(ォセ){var カは={'\\x50\\x49\\x43\\x76\\x6c':'\\x32\\x7c\\x35\\x7c'+'\\x30\\x7c\\x36\\x7c'+'\\x31\\x7c\\x33\\x7c'+'\\x34','\\x65\\x4b\\x59\\x52\\x4d':function(ゼげ,ぞヤ){return ゼげ<ぞヤ;},'\\x6b\\x62\\x72\\x78\\x48':function(ダヮ,ｲぷ){return ダヮ<ｲぷ;},'\\x5a\\x7a\\x72\\x79\\x61':function(ﾇま,ゖム,メキ){return ﾇま(ゖム,メキ);},'\\x79\\x45\\x46\\x4a\\x53':function(セゑ,りｲ){return セゑ-りｲ;},'\\x43\\x74\\x61\\x41\\x54':function(ヘニ,ｬﾏ,だﾆ){return ヘニ(ｬﾏ,だﾆ);},'\\x6d\\x41\\x61\\x47\\x77':function(ﾝア,ｪの){return ﾝア-ｪの;},'\\x47\\x63\\x4d\\x44\\x50':function(アヅ,ヴミ,ヷｨ){return アヅ(ヴミ,ヷｨ);},'\\x58\\x43\\x79\\x46\\x44':function(ヵつ,るを,ブｲ){return ヵつ(るを,ブｲ);},'\\x4e\\x65\\x6a\\x68\\x57':function(ぎト,ﾖヸ,ヸﾗ){return ぎト(ﾖヸ,ヸﾗ);},'\\x49\\x6f\\x53\\x6f\\x4e':function(なギ,ｺぺ){return なギ(ｺぺ);},'\\x62\\x46\\x6c\\x5a\\x6d':function(ヮﾘ,ヒゾ){return ヮﾘ-ヒゾ;},'\\x72\\x72\\x6c\\x6c\\x50':function(タぅ,ユﾓ){return タぅ^ユﾓ;},'\\x7a\\x77\\x46\\x65\\x43':function(ゃム,ォレ){return ゃム%ォレ;},'\\x76\\x45\\x69\\x4c\\x7a':function(ぬエ,ゃﾎ){return ぬエ-ゃﾎ;}},ルセ=カは['\\x50\\x49\\x43\\x76'+'\\x6c']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),ネき=-0xd69+0xe*0x14+0xc51;while(!![]){switch(ルセ[ネき++]){case'\\x30':var ｧロ;continue;case'\\x31':for(ｧロ=-0x2*0xca1+0x2489+0xb47*-0x1;カは['\\x65\\x4b\\x59\\x52'+'\\x4d'](ｧロ,-0x14c2+0x163d+-0x177);ｧロ++)ﾃそ[ｧロ]=ォセ[ｧロ];continue;case'\\x32':var ﾃそ=new Array(-0x1cde+-0x2*0x81a+0x1ae*0x1b);continue;case'\\x33':for(ｧロ=0x17b*-0x1+-0x1772+0x4fd*0x5;カは['\\x6b\\x62\\x72\\x78'+'\\x48'](ｧロ,-0x6fa*0x3+0x2*0xf70+-0x2*0x4d5);ｧロ++){ﾄﾁ=カは['\\x5a\\x7a\\x72\\x79'+'\\x61'](fanqieRotr64,ﾃそ[カは['\\x79\\x45\\x46\\x4a'+'\\x53'](ｧロ,-0x2546+-0xd*0xba+-0x9*-0x531)],0x2671+-0x6*0x1bb+-0xa*0x2ce),ﾄﾁ=カは['\\x43\\x74\\x61\\x41'+'\\x54'](fanqieXor64,ﾄﾁ,ﾃそ[カは['\\x6d\\x41\\x61\\x47'+'\\x77'](ｧロ,-0x342*0x7+0x3f5+0x12dc)]),ﾄﾁ=カは['\\x47\\x63\\x4d\\x44'+'\\x50'](fanqieXor64,ﾄﾁ,カは['\\x43\\x74\\x61\\x41'+'\\x54'](fanqieRotr64,ﾄﾁ,0x9f7*-0x1+-0xfe9+0x19e1)),ﾃそ[ｧロ]=カは['\\x58\\x43\\x79\\x46'+'\\x44'](fanqieXor64,カは['\\x4e\\x65\\x6a\\x68'+'\\x57'](fanqieXor64,カは['\\x49\\x6f\\x53\\x6f'+'\\x4e'](fanqieNot64,ﾃそ[カは['\\x62\\x46\\x6c\\x5a'+'\\x6d'](ｧロ,-0x1d*0x54+0x187d+-0xef5)]),ﾄﾁ),[カは['\\x72\\x72\\x6c\\x6c'+'\\x50'](-0x3d+-0x1*0x22e0+0x2320,カは['\\x43\\x74\\x61\\x41'+'\\x54'](fanqieBit,パぺ,カは['\\x7a\\x77\\x46\\x65'+'\\x43'](カは['\\x76\\x45\\x69\\x4c'+'\\x7a'](ｧロ,0x102a+0x1d67+-0x2d8d),0x1*-0xc53+-0xe7a+0x1b0b))),0x1a8*-0x2+-0xc*-0x26c+-0x8*0x338]);}continue;case'\\x34':return ﾃそ;case'\\x35':var パぺ=[0x9fd19*-0xce+-0x8134b14+-0x148a5cbd*-0x1,0x7ec7d8f+-0x77d25bf6+0xadaf2aa1];continue;case'\\x36':var ﾄﾁ;continue;}break;}}function fanqieSeb(ヅｱ,るﾀ){var ぃヹ={'\\x44\\x62\\x61\\x75\\x45':'\\x31\\x7c\\x33\\x7c'+'\\x34\\x7c\\x35\\x7c'+'\\x32\\x7c\\x36\\x7c'+'\\x30','\\x6d\\x78\\x79\\x51\\x6e':function(ヷめ,アﾂ){return ヷめ+アﾂ;},'\\x4b\\x4d\\x41\\x68\\x67':function(ｹｸ,えみ){return ｹｸ(えみ);},'\\x45\\x76\\x42\\x54\\x4e':function(ｬﾓ,とぃ){return ｬﾓ(とぃ);},'\\x48\\x4d\\x43\\x75\\x55':function(ゾざ,バﾅ){return ゾざ(バﾅ);},'\\x6e\\x67\\x72\\x41\\x54':function(ズﾄ,ォロ){return ズﾄ(ォロ);},'\\x4d\\x63\\x6f\\x52\\x56':function(ばブ,クあ){return ばブ<クあ;},'\\x63\\x51\\x50\\x4c\\x51':function(ザチ,ﾅか,カｪ){return ザチ(ﾅか,カｪ);},'\\x64\\x72\\x58\\x54\\x76':function(ゃゎ,ﾇめ,めぉ){return ゃゎ(ﾇめ,めぉ);},'\\x50\\x7a\\x6d\\x75\\x50':function(ョヹ,ユヹ,ｩハ){return ョヹ(ユヹ,ｩハ);}},ぇポ=ぃヹ['\\x44\\x62\\x61\\x75'+'\\x45']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),ぁヰ=0x17c3+-0x137c+-0x447;while(!![]){switch(ぇポ[ぁヰ++]){case'\\x30':return ぃヹ['\\x6d\\x78\\x79\\x51'+'\\x6e'](ぃヹ['\\x4b\\x4d\\x41\\x68'+'\\x67'](fanqiePackLe64,ﾀパ),ぃヹ['\\x45\\x76\\x42\\x54'+'\\x4e'](fanqiePackLe64,ﾚﾖ));case'\\x31':var そヹ=ぃヹ['\\x48\\x4d\\x43\\x75'+'\\x55'](fanqieSke,るﾀ);continue;case'\\x32':var ﾂボ;continue;case'\\x33':var ﾀパ=ぃヹ['\\x4b\\x4d\\x41\\x68'+'\\x67'](fanqieLoadLe64,ヅｱ['\\x73\\x75\\x62\\x73'+'\\x74\\x72\\x69\\x6e'+'\\x67'](-0x8*-0x37e+0x569*0x5+-0x36fd,0x9db+0x90f+-0x12e2));continue;case'\\x34':var ﾚﾖ=ぃヹ['\\x6e\\x67\\x72\\x41'+'\\x54'](fanqieLoadLe64,ヅｱ['\\x73\\x75\\x62\\x73'+'\\x74\\x72\\x69\\x6e'+'\\x67'](-0x9*0x213+-0x6bd+0x1970,0x1*-0x141b+0x1ee0+-0xab5));continue;case'\\x35':var ウン;continue;case'\\x36':for(ﾂボ=0x1ced+0x1b*0x12c+0x7*-0x8a7;ぃヹ['\\x4d\\x63\\x6f\\x52'+'\\x56'](ﾂボ,0xab6+0x22f*0x8+-0x1be6);ﾂボ++){ウン=ﾚﾖ,ﾚﾖ=ぃヹ['\\x63\\x51\\x50\\x4c'+'\\x51'](fanqieXor64,ぃヹ['\\x63\\x51\\x50\\x4c'+'\\x51'](fanqieXor64,ぃヹ['\\x63\\x51\\x50\\x4c'+'\\x51'](fanqieXor64,ﾀパ,ぃヹ['\\x64\\x72\\x58\\x54'+'\\x76'](fanqieAnd64,ぃヹ['\\x63\\x51\\x50\\x4c'+'\\x51'](fanqieRotl64,ﾚﾖ,0x19bc+-0x964+-0x2f*0x59),ぃヹ['\\x50\\x7a\\x6d\\x75'+'\\x50'](fanqieRotl64,ﾚﾖ,-0x5d7+-0x59+-0x31c*-0x2))),ぃヹ['\\x64\\x72\\x58\\x54'+'\\x76'](fanqieRotl64,ﾚﾖ,0xcb9*-0x2+0x1*-0x100a+-0x1*-0x297e)),そヹ[ﾂボ]),ﾀパ=ウン;}continue;}break;}}function fanqieSm3Message(ソて,きク){var うィ={'\\x41\\x6d\\x49\\x62\\x74':'\\x31\\x7c\\x33\\x7c'+'\\x32\\x7c\\x30\\x7c'+'\\x34','\\x6a\\x50\\x45\\x54\\x62':function(ざﾌ,ゔゖ){return ざﾌ(ゔゖ);},'\\x67\\x62\\x64\\x56\\x73':function(るヸ,じヱ){return るヸ===じヱ;},'\\x72\\x46\\x6b\\x77\\x50':function(ジヲ,パｮ){return ジヲ(パｮ);},'\\x52\\x6b\\x6e\\x77\\x6c':function(むむ,ヹﾂ){return むむ===ヹﾂ;},'\\x48\\x65\\x53\\x48\\x48':function(やピ,はげ){return やピ(はげ);}},ビォ=うィ['\\x41\\x6d\\x49\\x62'+'\\x74']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),ェカ=-0x130a*-0x1+0x1298+-0x25a2;while(!![]){switch(ビォ[ェカ++]){case'\\x30':ゼｭ=うィ['\\x6a\\x50\\x45\\x54'+'\\x62'](fanqieSm3,うィ['\\x67\\x62\\x64\\x56'+'\\x73'](ソて,'')?うィ['\\x72\\x46\\x6b\\x77'+'\\x50'](fanqieZeros,-0x1*-0xfb5+-0x709*-0x1+-0x1*0x16ae):ソて)['\\x73\\x75\\x62\\x73'+'\\x74\\x72\\x69\\x6e'+'\\x67'](0x9*0x431+0x13a*0x12+0x2d9*-0x15,0x64d+-0x4*0x77c+0x9*0x2a1);continue;case'\\x31':var ｹﾇ;continue;case'\\x32':if(うィ['\\x52\\x6b\\x6e\\x77'+'\\x6c'](きク,''))ｹﾇ=うィ['\\x72\\x46\\x6b\\x77'+'\\x50'](fanqieSm3,うィ['\\x72\\x46\\x6b\\x77'+'\\x50'](fanqieZeros,0x150d+-0x72*0x1+-0x148b))['\\x73\\x75\\x62\\x73'+'\\x74\\x72\\x69\\x6e'+'\\x67'](0x1055+0x2661+-0x36b6,0x2*-0x10af+0x10b5+0x10af);else ｹﾇ=うィ['\\x48\\x65\\x53\\x48'+'\\x48'](fanqieSm3,うィ['\\x72\\x46\\x6b\\x77'+'\\x50'](fanqieHex2bin,きク))['\\x73\\x75\\x62\\x73'+'\\x74\\x72\\x69\\x6e'+'\\x67'](-0x11c7+0x2705*0x1+0x153e*-0x1,0x1*0x366+-0x22cc+0x1*0x1f6c);continue;case'\\x33':var ゼｭ;continue;case'\\x34':var ヹず={};ヹず['\\x62\\x6f\\x64\\x79'+'\\x48\\x61\\x73\\x68']=ｹﾇ,ヹず['\\x71\\x75\\x65\\x72'+'\\x79\\x48\\x61\\x73'+'\\x68']=ゼｭ;return ヹず;}break;}}var ラウ=fanqieHex2bin('\\x66\\x63\\x37\\x38'+'\\x65\\x30\\x61\\x39'+'\\x36\\x35\\x37\\x61'+'\\x30\\x63\\x37\\x34'+'\\x38\\x63\\x65\\x35'+'\\x31\\x35\\x35\\x39'+'\\x39\\x30\\x33\\x63'+'\\x63\\x66\\x30\\x33'+'\\x35\\x31\\x30\\x65'+'\\x35\\x31\\x64\\x33'+'\\x63\\x66\\x66\\x32'+'\\x33\\x32\\x64\\x37'+'\\x31\\x33\\x34\\x33'+'\\x65\\x38\\x38\\x61'+'\\x33\\x32\\x31\\x63'+'\\x35\\x33\\x30\\x34'),ドズ=fanqieHex2bin('\\x61\\x63\\x31\\x61'+'\\x64\\x61\\x61\\x65'+'\\x39\\x35\\x61\\x37'+'\\x61\\x66\\x39\\x34'+'\\x61\\x35\\x31\\x31'+'\\x34\\x61\\x62\\x33'+'\\x62\\x33\\x61\\x39'+'\\x37\\x64\\x64\\x38'+'\\x30\\x30\\x35\\x30'+'\\x61\\x61\\x30\\x61'+'\\x33\\x39\\x33\\x31'+'\\x34\\x63\\x34\\x30'+'\\x35\\x32\\x38\\x63'+'\\x61\\x65\\x63\\x39'+'\\x35\\x32\\x35\\x36'+'\\x63\\x32\\x38\\x63'),ﾔｩ=あいうえ([0x157b+-0x97*-0x40+0x16f*-0x29,-0x2b*-0xda+0xb8b+-0x3029,-0x1323+-0x2027*0x1+0x3361,0x580+0x975*-0x3+0x1728,-0x38a*0x3+0x1*-0xb8d+0x23*0xa9,0x2a*-0x4a+0x1*-0x1813+0x250d,-0x1*0xfc1+0x18d0+0x1*-0x829,-0x1ed+0x3*0x3bb+-0x1*0x881,-0x1e6f+-0x137*-0xa+-0x1291*-0x1,0x4ae+-0x1b2b+0x1744,-0x5c1+-0xbce*-0x3+-0xf1*0x1f,-0x379+-0x1*0x1bc4+-0x8*-0x3fa,-0x22ed+0x19cc+0x1*0x9fd,-0xc61*0x1+-0x2447+0x30ab,-0x1*-0x1a6b+-0x15cb+-0x3e5,-0x437*-0x1+0xc*-0x308+0x5f*0x59,-0xc43*-0x3+-0x423+0x31*-0xa6,-0xe+0x391*-0x3+0xb0d,0x5*0x190+0x1f46+-0x26c3,0x1fb+0x4*0x8de+0x24a0*-0x1,0x1*-0x206a+0x1a69+0x6e2,0x68b*0x5+0x16a+-0x21bd,0x1d5f+0x3ad+-0x2013,0x2653+-0x59*0x5+0x35*-0xac,-0x2*0x1b+-0x25f7+-0x26f1*-0x1,0x1c21+-0x246e+0x8fc,-0x11*0x18b+0x1f02+-0x17*0x35,0x14e*-0x6+0x1*0xf8b+-0x75e,-0x5*0x29c+-0x220*0xd+0x290b,-0x151e+0x2107+0xb81*-0x1,0xf23+0x3dd+-0x12b3*0x1,-0x236*-0xb+-0x1fc5+0x787,0x3e*-0x27+0x8a5*-0x3+-0x4*-0x8f6,0xfc4+-0x1204+0x21*0x17,0x2ed+-0x291*0x2+0x65*0x7,0x88*-0x12+-0x1b*-0xb2+-0x8eb,-0x38f*-0x5+0xb83+-0x1cd9,-0x2123+-0x21*0x6f+0x303c,0x59+0x3*0xa65+-0x1eae,0x11*-0x12b+-0xad9*-0x3+-0x1*0xbc0,0x138f*0x1+-0x3*0x4e7+-0x3e*0x11,-0xe97+-0x1*-0x59e+-0x1*-0x926,0xcbb*-0x1+0xd5+-0xc6e*-0x1,-0x729+0x566*0x4+0xf*-0xf1,0x1138+-0x205f+-0x53*-0x31,-0x2682+0x62f*-0x1+-0x3be*-0xc,-0x1dd3+0x13c6+-0x1*-0xae3,0x1297+0x2546*0x1+0xae*-0x51,0x3*0xa1+0x18be+-0x1a33,-0xf06*-0x1+0x169d*0x1+-0xeb*0x28,-0x3*-0x1b+-0x1284+0x131d,0xb57+0x1641+-0x216e,-0x1aed+-0x65*0x4d+0x396a,-0x2652+-0xff+0x2791,-0x151*0x11+-0x9*0x447+-0x1*-0x3da3,0x580+-0xa*-0x18b+-0x149f,-0x1a*-0xc2+-0x1079*0x1+-0x252,-0x1dc1+-0x2*0xb6f+0x3525,0x47*-0x8b+0x8f1+0x1e0a,0x1dec+0xc8d*0x1+-0x29df,0x8b4+-0x5*0x31+-0x713*0x1,-0x58d+-0x449*-0x9+-0x2055,0x1497+-0x1*0x1db5+0x98e,0x666+-0xe6c+0x1*0x8f5,0x469*-0x2+0x1*-0x1b31+0x24fe,-0xb55+0xd*-0x192+0x670*0x5,-0xf1+0x6cb+-0x4e0,0xf62+-0x593+-0x9c1,0x1500+0x6c6+-0x1*0x1b31,0x78b*-0x1+0x126f+-0x11c*0x9,0x8*0x13+0x733*-0x2+-0x5*-0x2e1,0x208d*-0x1+-0x2dd+0x23bb,0x1929+0xb51+-0x243b,-0x6*-0x56b+0x1925+-0x3a*0xfb,-0x31d*-0x4+0x161*0x2+-0xea5,-0xb84*-0x2+-0x1*0xa30+0xc5f*-0x1,-0x6b4+-0x25bf*-0x1+0x7bb*-0x4,0xb8e*-0x1+0x1*-0x685+0x1229,-0xf82+0x2342+-0x13a4,0x1*-0x563+-0x1a06+-0xe*-0x244,-0x163c+-0x29*0xc+-0x13*-0x14c,-0x157c+0x724*-0x2+0x2432,0x9*-0x370+-0x2*0xbd7+0x378d*0x1,0x1fd1+0x1f*-0x67+-0x12a2,-0x3e2+-0x23f2+-0x10*-0x289,-0x1*0xb35+0xdd1+-0x249,-0x219*-0x7+-0x8*-0x66+0x20*-0x88,0x6*0x11b+-0x1a*-0xe1+0x298*-0xb,0x4c9+0x1*0xff5+-0x13f6,-0x31d+0x10cf*-0x1+-0x1*-0x13f9,0x15ba+0x7*0x67+0x193*-0xf,-0x24d5+0x2*0x11a7+0x222,0x112e+0x3b9*-0x1+-0xd2f,0x1*0x130d+0x139b+-0x25b2,0x1d2d+0x1*-0x166+0x1*-0x1ace,0x305+-0x2*0xf7c+0x1c30,0x110d+0x4*-0x61f+-0x1*-0x7f1,0x2*0x91e+-0x5*0x4f+-0x32b*0x5,0x2312+-0x2085+-0x215,0xbc9+0x1d*-0x37+-0x52a,-0x1*0xf73+0x1e82+-0xe5f,0x1fcf+-0x10e2*0x2+0x3*0xfb,-0x613+0x1f48+-0x1864,0x1a52+-0x864+-0x17*0xc2,-0x1*0x5ad+-0x116*-0xc+-0x73e,-0xc40+0x229d*0x1+-0x1569,0x67*-0x51+0xcc7*-0x3+0x47df,0x2509+-0x1411+0x3a*-0x49,0x11d9*-0x1+-0x2065+-0x2*-0x196d,-0x25+0x19*0xd1+0x2*-0x9e5,-0x1bb4+-0x1dc3+0x39ff,0x17be+-0x213e+0x989,-0xd8*-0x29+-0x37f*-0x3+-0x2c18,0x1024+0x1f1a+-0x2ebd,-0x16c6+0x1ceb+-0x571,-0x1*-0xc17+0x235e+0x2f33*-0x1,0xa*0x71+-0x1e06+0x1a2a,-0x24ee+-0x1301+0xcb*0x47,-0x62*0x25+-0xd7+0xfc4,0x17d3+-0x635+-0x10f8,0x53*-0x25+-0x15dd+0x370*0xa,0x6f3+-0x1*-0x132d+-0x196f,-0x233f+-0x3*0xd7+0x25d9*0x1,-0x1*0x1bdd+-0x695+-0x1*-0x2294,-0xa9a+-0x758+0x12cf,0x1*0x1159+0x2312+-0x1*0x33c1,0x28*-0x6f+0x1*-0x21ee+0x1*0x33c8,-0x16b*0x3+-0x53*-0x68+-0xd*0x242,-0x3*-0xa7b+-0x2688+0x7bb,-0xf*-0x9+-0x14f9+-0x251*-0x9,0x67*-0x17+-0x35b*-0x1+0x65a,0x1481+-0xe*0x19+-0x12f0,-0xdec+-0x1bcb+0x2a31,0x15+-0x1098+0x1144,-0x1*-0x1100+0x74+0x107a*-0x1,0xd65+0x3f3+-0x10f0*0x1,-0x1c99+0x2d1*0x7+0x17*0x6b,-0x1a1+0x2*0x2cf+-0xd0*0x4,0x156c+-0xae7*0x1+-0x9eb*0x1,-0x1*-0x232f+-0x2028+-0x2a8,-0x8*-0x2b9+-0x13df+-0x148,0x1*0x2245+-0x1131*0x1+0xf*-0x115,0x701*-0x1+0x3f*0x79+-0x1645,-0x78e+-0x5a*0x2e+-0x116*-0x16,-0x5b+0x398+0xc*-0x35,0x6*0x2af+-0x13*-0x175+-0x2bc9,0x1*0x253c+0x1341+-0x37cf,-0x77*-0x13+0x46c+-0x7*0x1d9,0x1b77+-0x24ff+0x1*0xa7b,0x15b2+-0x1e2d+0x943*0x1,-0x669+-0x3*-0xb1e+-0x2*0xd2d,0x1785+-0x1*0x255d+0x54*0x2d,-0x3f2+-0x202+0x613*0x1,0x1822+-0xd3*0x2+-0x15e6,-0x1708+-0x16ad+0x4*0xba5,0x1cf*-0x1+0x25d6+0x239e*-0x1,0x4*-0x1fd+-0x2*0x107b+0x29aa,0x1091+0x23d9+-0x3457,-0x9ef+0x8c6*0x2+-0x6b3,0x1f8e+-0x501*0x2+-0x156b,-0x1521+-0x1*-0x1c27+-0x5*0x151,0x1dcb*-0x1+0xa32+-0x3d*-0x54,0x2416+-0x17d3*-0x1+-0x3bab,0x1f47+0x1e5b+-0x3cb2*0x1,-0xab3*0x1+-0x1769*-0x1+0x179*-0x8,-0xb69+0x16d*0xc+-0x551,0x3fb+0x2265+-0x12ce*0x2,0xa18+0x1*0x20ab+0x277*-0x11,0x6cc+-0x3*0xcc7+0x1f99,-0x12ed+-0x181a+-0x2b87*-0x1,0x2*0x718+0x7*-0xe9+-0x6d9,-0x1*-0x71d+-0x2*0x12ad+0x6*0x51c,0xb5*-0x2f+-0x1173+-0x198d*-0x2,-0x2*0x133b+-0x1a90+-0x6*-0xae5,0x4a0+0x2646+0x61*-0x70,0xd17*-0x2+0x16d1*0x1+0x3d1*0x1,-0x172a+-0x1a01+0x316c,0x2368+0xe*-0x13d+0x2f2*-0x6,0x2f5*0xd+0x2e6+0x829*-0x5,0xd60+-0x23c8+0x170a,-0x903+-0x1bb1+0x2*0x12a4,0x1*-0x1327+0x1e80+-0xb29,0x7d*-0xb+0x1958*0x1+-0x135a,-0x1*0x1fb2+0x134*-0x1+0x1093*0x2,0x1f7*0x3+0xdad+0x1*-0x12c1,-0x145*-0x5+-0x33c+-0x26c,0x1a71+-0xd7c*0x1+-0xbfe,0x1*0x20bc+0xb*-0x32a+0x249,0x88f+0x25d*-0xf+0x1b6c,-0x16e*-0x11+0xf9*0x25+0x35*-0x11f,-0x916+-0x9fc*0x3+0x27c1*0x1,0x9*0x58+0x1*0x541+-0x821,-0xa3*-0x2b+-0x5ea+0x19*-0xd4,0x1183+-0x9b6+0x99*-0xc,-0x1*-0x1cf3+-0x4*0x58f+-0x6ab,-0x1317+-0xb*0x20f+0xdf5*0x3,-0x2ec*-0x2+0x856+-0xd9f,0x1927+0x9a8+-0x220c,-0x25ca+0x1c8d+0x9ec,0x14f+0x56*-0x4+-0x2*-0x77,-0x12df+-0x23f1+0x3708*0x1,0x1*0x8f5+-0x8d2+0x4*0x2,-0x87a*0x2+0x1c0d*-0x1+0x177*0x1f,0x17a+0x3ce+-0x4e5*0x1,-0x46*0x79+0x19*-0xb5+0x62*0x86,0x2201+-0x1e17+-0x34*0x13,-0x1a80+-0xf98+0x2ace,-0x263d+-0x756+0x2dc0,0x1a4d+-0x1*-0xfca+-0x29dd,-0x233d+-0x25c+0x25c0,0x2060+0x1c2f+-0x3c82,0x16e*-0x5+-0x81*0x17+0x1342,-0x18cd+0x1*-0xb61+0x24e1,0x659*-0x2+0x1d*0xa6+-0x5db,-0x50c+-0x10d0*0x1+0x161d*0x1,0xb*0xa+0x26b*0xd+0x145*-0x19,0x1*0x1776+0x22c4+-0x35*0x116,0x1f0d+0x1c34+-0x3af1,-0x4f8+0x2*-0xc8f+0x1ed4,-0xd5*-0x2+-0x17cd+0x16a6,-0x2*0x63d+0x221f*0x1+0x2f*-0x72,-0x11e4+0x78a*0x4+0x7b*-0x19,-0x251d+-0x25eb+0x4bf1,-0x1*0x150f+-0x19f8+0x2f30,-0x64+0x2513+-0x1*0x2406,0x733+-0x163*0x5+0x2f,0x49*0x72+0x2654+0x9*-0x7cf,-0x11*-0x35+0x1e41+-0x2136,0x135e+-0xab2+-0x85e,-0x9*0x14d+0xec2+-0x3*0xf9,-0x185b+-0x1c9b+0x34fe,0x26c5+0x1*0x229d+-0x48fc,-0x4bb*-0x7+-0x7e*0x30+-0x94b,-0x1070+0x4*-0x683+0x2af7,-0xddf*0x1+0x11a7+-0x321,0x1d*0x112+-0x2*0x1130+-0x144*-0x3,0xc59+0x6*-0xb3+-0x7a6,-0x2*-0xf31+0x2236+0x2af*-0x18,0x1690+-0x141*-0x14+-0x1*0x2ef1,-0x196*-0xb+0x4*-0x1e4+0x28*-0x3a,-0x1*-0x1df5+-0x1*-0x1166+-0x2*0x176d,-0x5a*0x50+-0xbff*0x1+0x151*0x1f,0x195+0x26df+-0x2872,0xed8+-0x183a+0x57*0x1d,-0x1767+0x51d+-0x1*-0x1253,-0x1*0x226a+-0x25*0x62+-0x9c1*-0x5,-0x22f*-0x2+0x427*0x1+-0x7a3,-0x15*0xa3+0xbf7+0x1ec,0x377*0x2+0x158a+0x29*-0xb0,-0x19ba+-0x3*-0xf9+-0x5ed*-0x4,0x6ca+-0x9*0x39+-0x458,0xe71+0x1*0x2195+0x137*-0x27,-0x7*0x43a+0x1f3c+-0xc3,0x1a66*0x1+-0x1d*0x65+0xe11*-0x1,0x65f+-0xc72+0x651,-0x2390+-0x96*0x19+0x32bc,-0x260a+0x44*0x5+-0x253b*-0x1,-0x227d+0x1167*0x1+0x1149,0xe3d+-0x19af+0xc70,0x780+0x1cf*-0x1+-0x4d9,0x1975+0x1ba6+-0x5*0xa99,-0xf3d+-0x7a0+0x17ba,0x40f*0x2+-0xf5+-0xf4*0x7,0x151f+0x1c2e+0x103f*-0x3,0x2710+-0x551*0x7+-0x111,-0x43*-0x37+0x6*0x373+-0x6*0x5be,-0x1c73+0xe*0x4a+-0x1*-0x18c1,-0x1bde+-0x24cd+-0x4b*-0xdf,0x5e+-0x10b0+0x1075,-0xbd+-0x1dc+0x340,0xfe2+-0x1ee4+0x2f*0x57,0x46c+-0x1*-0x67b+0x217*-0x5,-0x65*0x49+-0x1db7+0x1*0x3b37,-0x11*0x141+-0x1f97+0x34f3,-0x25ea+0x158c+0x57b*0x3,0x13f2+-0x1*-0xdd5+0x13*-0x1c5,-0x1990+0x36e*-0x1+-0x1d*-0x104,0x203a+0x31*-0x79+0x81b*-0x1,-0x25e4*-0x1+0x833*0x1+-0x2d65,0x87e+-0x1*0x7de+-0x17,-0x8b*0x9+0x20a*-0xf+0x185*0x18,-0x44e*0x1+0x1*-0x180a+0x1ca5,0x7*-0x291+0x2558+0x933*-0x2,0x231d+0x1d7c+-0x4062,-0x1*-0x11a9+0x1*-0x6bf+-0x9fe,0x259*-0x6+0x2ae+0xb92,-0x237d+-0x44*-0x65+-0x2*-0x4a1,-0x323*-0x1+0x1*-0x159b+0x36*0x5c,-0x13ee+0x1*-0x439+0x11*0x179,0x4*0x2c5+0x13*-0x149+0xd9b,-0x33*-0x11+-0x1491+0x1202,-0x2*-0x79+-0x873*-0x3+-0x6*0x442,-0xe49+0x585+0x71*0x16,-0x155f*0x1+0x1d3*0x3+0x1008,0x1*0x16af+-0x1*0x1c3+-0x14aa,0xf1*0x4+-0x66c+-0x2ec*-0x1,-0x162a+0x1*0x13de+0xad*0x4,-0x5*0x227+0xceb+-0x142,-0x1134+-0x7db+0x2*0xccd,0x18b9+-0x1*0x1a29+0xbc*0x2,0x243a+0x1*-0x1c8f+-0x75d,-0x1*-0x24f7+-0x1494+-0x1005,0xfc8+-0x11b5+-0x1*-0x251,0x1b92+-0x3*-0x6f5+-0x2fb0,-0x7*-0x33a+-0xce6*-0x1+-0x2368,0x1*-0xa30+-0x130b+0x1e35,-0x1*0x92+-0x2116+0x21a8,-0x3e+0x679*0x1+0x67*-0xe,-0x1f9d+-0xce2+0x2d4c,0xd*0x9d+-0x1499+0xd08,0x25b1+-0x1fc7*-0x1+-0x44a8,-0xc3c+-0x10f*0x2+0xf46,0x14*0x3d+-0xb9d+0x6e6,-0x25d+0x202e+0x1cf3*-0x1,0x3c4+0x12*-0xd7+0xbf7,-0x753+0xf0e+-0x777,0x1429+0x1*-0x2653+-0x1*-0x12aa,0x1a70+-0x5b2*-0x5+-0x3649,-0x2*0xc56+-0x1*-0x264f+-0xd6c,-0xe4b+-0x66c*-0x4+-0xb5a,0x249c+-0x1*0x1d87+-0x6cd*0x1,0x5e*0x69+-0xa*0x7b+-0x2148,-0xb*0xa5+-0x3*-0x38+0x685,0x1366+-0x13d3+0xf*0xb,0x2350+-0x1421*-0x1+-0x3755,-0x1*0x1b15+0x1*-0x1a8a+0x365a,-0x83*-0x3d+-0x3*0x98f+0x18*-0x13,0x2587+0x372*0x6+-0x3a18,-0x9*0x29d+-0x1*-0xc98+0xb8d*0x1,0x26b*0xb+0x22a3+-0x3c73,-0x31*0x1d+0x5d7+0x81,0xdd*-0x2+0x1*-0x817+0xa83,0x140f+0x1353+-0x2758,0x73b*-0x5+-0x1*0x243e+0x48ce,-0x143+0x19*-0x13+0x381,0xbcb*0x3+-0x1dc5*-0x1+0x119*-0x3b,-0x1fe9+-0x1786+-0x511*-0xb,0x99b+-0x11a1+0x858,-0x10dd+-0x25aa+0x4*0xdbe,-0x218b+-0xe19*0x2+0x3e2f,-0x1*0x1d67+-0x103e+0x35*0xe1,0x2062+0x3b4*-0x7+-0x2*0x2c5,0x49*-0x47+-0x2*-0xe12+-0x748,0xd*0x124+-0x7ed+-0x4c*0x14,0x2119+-0xd*-0x92+-0x2833,-0x1beb+0x1c8e+0x1f,0x22*-0xf6+0x623*-0x3+-0x1*-0x3323,0x217d+-0x10e1+-0x31*0x53,-0x2a+0x1*0x146f+-0x17*0xda,0x1bfb+-0x2665+-0xae5*-0x1,0x1*-0x253d+0x50c+0x20eb,0x2052+0xa7b*0x2+0x1*-0x34c9,0x13e1+0x40d+0x1*-0x17e1,0x6*0x485+-0x1*0x1de5+0x2e0,0x10bd+0x1*-0x484+0x2c*-0x43,0xd4d+0x17b9+-0x2490,-0x128c+0x49f+0x74d*0x2,0xf09*0x1+-0x14fb+0x5f4,0x2*-0x2ab+-0x21a6+0x27b8,-0x1302+-0x8bb+0x11*0x1ae,-0xe1c+-0x1168+-0xaa7*-0x3,0x326*-0x1+-0x1306+0x16b7,0x1a2a+0x26f4+-0x4091,-0x16f6+-0xa31+0x2204,-0xc18+-0x194b+0x2613,0x102*-0xc+0x1*-0x1c1d+0x2838,0x19d4+-0x2485+0x1*0xb6f,-0x1728+-0x87*-0x43+0x2*-0x5fd,-0x790+0x7c4+0x1*0x70]);function fanqieBuildArgus(のヹ,ゕぶ,おビ){var ゃぜ={'\\x52\\x44\\x50\\x43\\x72':'\\x30\\x7c\\x32\\x7c'+'\\x36\\x7c\\x31\\x32'+'\\x7c\\x31\\x34\\x7c'+'\\x31\\x30\\x7c\\x31'+'\\x7c\\x33\\x7c\\x31'+'\\x31\\x7c\\x39\\x7c'+'\\x31\\x33\\x7c\\x35'+'\\x7c\\x38\\x7c\\x37'+'\\x7c\\x34','\\x67\\x47\\x64\\x56\\x72':function(ﾅペ,のぐ){return ﾅペ(のぐ);},'\\x4d\\x45\\x6b\\x6a\\x51':function(ャぎ,ﾆほ){return ャぎ!==ﾆほ;},'\\x4b\\x61\\x64\\x41\\x67':function(ヮェ,ｺヶ){return ヮェ!==ｺヶ;},'\\x52\\x67\\x43\\x6c\\x54':function(レヺ,ぞゖ){return レヺ+ぞゖ;},'\\x69\\x56\\x76\\x46\\x66':function(すベ,ヺゐ){return すベ+ヺゐ;},'\\x53\\x43\\x77\\x47\\x52':function(テヵ,ｨぁ){return テヵ+ｨぁ;},'\\x6e\\x68\\x56\\x4b\\x6e':function(ｱょ,ろと){return ｱょ+ろと;},'\\x68\\x6e\\x50\\x47\\x77':function(ズﾘ,らよ){return ズﾘ+らよ;},'\\x41\\x69\\x68\\x4a\\x48':function(テズ,ﾜﾑ){return テズ+ﾜﾑ;},'\\x6d\\x72\\x69\\x69\\x6a':function(ょば,ぎバ){return ょば+ぎバ;},'\\x6e\\x76\\x78\\x66\\x69':function(ﾜｯ,コぐ){return ﾜｯ+コぐ;},'\\x52\\x44\\x66\\x79\\x7a':function(ぷぁ,おﾚ){return ぷぁ+おﾚ;},'\\x70\\x5a\\x4d\\x62\\x45':function(ぁろ,イょ){return ぁろ+イょ;},'\\x42\\x53\\x50\\x65\\x56':function(へモ,をヮ,ﾖロ){return へモ(をヮ,ﾖロ);},'\\x70\\x41\\x42\\x66\\x4a':function(りｮ,ラサ){return りｮ<<ラサ;},'\\x4d\\x54\\x50\\x4f\\x63':function(ヒる,ケﾑ,ヵﾗ){return ヒる(ケﾑ,ヵﾗ);},'\\x42\\x50\\x78\\x73\\x69':function(ｦぺ,エち,タぉ){return ｦぺ(エち,タぉ);},'\\x6d\\x73\\x71\\x73\\x4f':function(ﾒト,ゖｼ,ぶﾀ){return ﾒト(ゖｼ,ぶﾀ);},'\\x6f\\x74\\x6b\\x4f\\x48':function(にロ,ぬモ,フま){return にロ(ぬモ,フま);},'\\x62\\x6e\\x4c\\x53\\x4e':function(とヮ,ﾘつ,くら){return とヮ(ﾘつ,くら);},'\\x42\\x53\\x58\\x6c\\x69':function(ﾖユ,ユヅ,エバ){return ﾖユ(ユヅ,エバ);},'\\x4d\\x6a\\x75\\x59\\x4c':function(ﾓわ,ツｹ){return ﾓわ(ツｹ);},'\\x65\\x61\\x79\\x75\\x45':function(ゾし,ﾔさ){return ゾし<<ﾔさ;},'\\x53\\x48\\x76\\x4c\\x6e':function(ﾑﾏ,ヴゖ,ざウ){return ﾑﾏ(ヴゖ,ざウ);},'\\x4f\\x55\\x43\\x4f\\x41':function(ﾜブ,ヌﾀ,ぷそ){return ﾜブ(ヌﾀ,ぷそ);},'\\x65\\x71\\x4e\\x4f\\x5a':function(ヌﾂ,じゾ,ねｩ){return ヌﾂ(じゾ,ねｩ);},'\\x42\\x71\\x61\\x6d\\x49':function(ノエ,ごｭ,ヷｳ){return ノエ(ごｭ,ヷｳ);},'\\x6f\\x4b\\x53\\x45\\x6a':function(コｺ,むぬ){return コｺ!==むぬ;},'\\x42\\x63\\x69\\x4e\\x4d':function(ロヒ,ゥｸ){return ロヒ*ゥｸ;},'\\x41\\x57\\x74\\x75\\x73':function(ンね,デッ){return ンね+デッ;},'\\x78\\x69\\x71\\x72\\x58':function(さシ,ゐモ){return さシ+ゐモ;},'\\x78\\x45\\x7a\\x44\\x4f':function(ｮイ,やゔ,ハﾕ){return ｮイ(やゔ,ハﾕ);},'\\x6c\\x73\\x63\\x68\\x59':function(ごハ,ぼﾏ){return ごハ!==ぼﾏ;},'\\x66\\x4d\\x6e\\x71\\x42':function(ヤﾘ,ｯぽ){return ヤﾘ!==ｯぽ;},'\\x43\\x55\\x56\\x69\\x67':function(ｯレ,ブゼ){return ｯレ!==ブゼ;},'\\x73\\x4f\\x65\\x47\\x63':function(ﾆし,ﾆキ){return ﾆし!==ﾆキ;},'\\x44\\x50\\x44\\x6a\\x63':function(キリ,ｧむ){return キリ!==ｧむ;},'\\x57\\x6b\\x74\\x79\\x78':function(っク,ﾇボ){return っク(ﾇボ);},'\\x52\\x64\\x6c\\x4c\\x76':'\\x76\\x30\\x34\\x2e'+'\\x30\\x34\\x2e\\x30'+'\\x35\\x2d\\x6f\\x76'+'\\x2d\\x61\\x6e\\x64'+'\\x72\\x6f\\x69\\x64','\\x6a\\x4a\\x57\\x53\\x67':function(ゾさ,リﾀ){return ゾさ(リﾀ);}},じﾋ=ゃぜ['\\x52\\x44\\x50\\x43'+'\\x72']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),ﾊｫ=-0x2205+-0x25f2+-0x17fd*-0x3;while(!![]){switch(じﾋ[ﾊｫ++]){case'\\x30':var ﾗﾄ=ゃぜ['\\x67\\x47\\x64\\x56'+'\\x72'](fanqieParseQuery,のヹ);continue;case'\\x31':var バの=ゃぜ['\\x4d\\x45\\x6b\\x6a'+'\\x51'](おビ['\\x62\\x6f\\x64\\x79'+'\\x5f\\x73\\x74\\x75'+'\\x62'],undefined)?ゃぜ['\\x67\\x47\\x64\\x56'+'\\x72'](String,おビ['\\x62\\x6f\\x64\\x79'+'\\x5f\\x73\\x74\\x75'+'\\x62']):'';continue;case'\\x32':var ダヌ=ゃぜ['\\x4d\\x45\\x6b\\x6a'+'\\x51'](おビ['\\x61\\x69\\x64'],undefined)?ゃぜ['\\x67\\x47\\x64\\x56'+'\\x72'](fanqieInt,おビ['\\x61\\x69\\x64']):-0x8d*-0xc+-0x1e24+0x1f37;continue;case'\\x33':var ベﾕ=ゃぜ['\\x4b\\x61\\x64\\x41'+'\\x67'](ﾗﾄ['\\x64\\x65\\x76\\x69'+'\\x63\\x65\\x5f\\x69'+'\\x64'],undefined)?ﾗﾄ['\\x64\\x65\\x76\\x69'+'\\x63\\x65\\x5f\\x69'+'\\x64']:'';continue;case'\\x34':return ゃぜ['\\x52\\x67\\x43\\x6c'+'\\x54'](ゃぜ['\\x69\\x56\\x76\\x46'+'\\x66'](ゃぜ['\\x69\\x56\\x76\\x46'+'\\x66'](ゃぜ['\\x53\\x43\\x77\\x47'+'\\x52'](ゃぜ['\\x6e\\x68\\x56\\x4b'+'\\x6e'](ゃぜ['\\x68\\x6e\\x50\\x47'+'\\x77'](ゃぜ['\\x68\\x6e\\x50\\x47'+'\\x77'](ゃぜ['\\x41\\x69\\x68\\x4a'+'\\x48'](ゃぜ['\\x6e\\x68\\x56\\x4b'+'\\x6e'](ゃぜ['\\x6d\\x72\\x69\\x69'+'\\x6a'](ゃぜ['\\x6e\\x76\\x78\\x66'+'\\x69'](ゃぜ['\\x52\\x44\\x66\\x79'+'\\x7a'](ゃぜ['\\x6e\\x68\\x56\\x4b'+'\\x6e'](ゃぜ['\\x6e\\x68\\x56\\x4b'+'\\x6e'](ゃぜ['\\x70\\x5a\\x4d\\x62'+'\\x45'](ゃぜ['\\x42\\x53\\x50\\x65'+'\\x56'](fanqieFieldVarint,0x5c*-0x66+-0x1*0x1044+0x34ed*0x1,ゃぜ['\\x70\\x41\\x42\\x66'+'\\x4a'](0x284fa600+0x3c752ca0+-0x44a4c977,0x168f+-0x163d+-0x51)),ゃぜ['\\x4d\\x54\\x50\\x4f'+'\\x63'](fanqieFieldVarint,-0x23ee+0x39e+0x2052,-0x11cc+0x19ed*-0x1+0x2bbb)),ゃぜ['\\x42\\x50\\x78\\x73'+'\\x69'](fanqieFieldVarint,0x26*-0xb+0x5*-0x469+0x17b2,ナぜ)),ゃぜ['\\x6d\\x73\\x71\\x73'+'\\x4f'](fanqieFieldString,0x139b+-0x1*-0x1621+0x8*-0x537,ダヌ)),ゃぜ['\\x42\\x50\\x78\\x73'+'\\x69'](fanqieFieldString,-0x47*0x5b+-0x4e*-0x77+-0xb00,ベﾕ)),ゃぜ['\\x6f\\x74\\x6b\\x4f'+'\\x48'](fanqieFieldString,0xec7+-0x882+-0xd*0x7b,ヶﾃ)),ゃぜ['\\x62\\x6e\\x4c\\x53'+'\\x4e'](fanqieFieldString,-0xeb3+-0xc9f+0x1b59*0x1,ヤツ)),ゃぜ['\\x42\\x50\\x78\\x73'+'\\x69'](fanqieFieldString,-0x2049+0x1274+0xddd,ヰぇ)),ゃぜ['\\x42\\x50\\x78\\x73'+'\\x69'](fanqieFieldVarint,-0x5*-0x2d1+0x1eb7+-0x2cc3,ﾈﾐ)),ゃぜ['\\x42\\x53\\x58\\x6c'+'\\x69'](fanqieFieldBytes,-0x2d7*-0x1+0x24f*0x3+-0x9ba,ゃぜ['\\x4d\\x6a\\x75\\x59'+'\\x4c'](fanqieZeros,-0x92d+0x1*-0x261a+0x2f4f))),ゃぜ['\\x42\\x50\\x78\\x73'+'\\x69'](fanqieFieldVarint,0x3c1+0x16d7+-0x1a8d,-0x2*0x317+-0xe9c+0x14ca)),ゃぜ['\\x42\\x53\\x50\\x65'+'\\x56'](fanqieFieldVarint,-0x9b1*-0x4+0x19eb+-0x40a3,ゃぜ['\\x65\\x61\\x79\\x75'+'\\x45'](ゕぶ,-0x1*0x221b+0x12ee+0x797*0x2))),ゃぜ['\\x53\\x48\\x76\\x4c'+'\\x6e'](fanqieFieldBytes,0x21db+-0x1b59*0x1+-0x675,ヌｦ['\\x62\\x6f\\x64\\x79'+'\\x48\\x61\\x73\\x68'])),ゃぜ['\\x4f\\x55\\x43\\x4f'+'\\x41'](fanqieFieldBytes,-0x18e4+0x44f*-0x1+-0x1*-0x1d41,ヌｦ['\\x71\\x75\\x65\\x72'+'\\x79\\x48\\x61\\x73'+'\\x68'])),ゃぜ['\\x4d\\x54\\x50\\x4f'+'\\x63'](fanqieFieldVarint,0x263a+-0xe*-0x24c+-0x464e,-0x1*0x22b5+-0xa*0x3c1+0x4b21)),ゃぜ['\\x65\\x71\\x4e\\x4f'+'\\x5a'](fanqieFieldBytes,0x1094+-0x1190+-0x5*-0x37,ｩざ));case'\\x35':var ヌｦ=ゃぜ['\\x42\\x71\\x61\\x6d'+'\\x49'](fanqieSm3Message,のヹ,バの);continue;case'\\x36':var ヶﾃ=ゃぜ['\\x6f\\x4b\\x53\\x45'+'\\x6a'](おビ['\\x6c\\x69\\x63\\x65'+'\\x6e\\x73\\x65\\x5f'+'\\x69\\x64'],undefined)?ゃぜ['\\x67\\x47\\x64\\x56'+'\\x72'](fanqieInt,おビ['\\x6c\\x69\\x63\\x65'+'\\x6e\\x73\\x65\\x5f'+'\\x69\\x64']):0x1*0x3a885af1+-0x501f4c05+0x75aaea78;continue;case'\\x37':var ナぜ=ゃぜ['\\x6f\\x4b\\x53\\x45'+'\\x6a'](おビ['\\x61\\x72\\x67\\x75'+'\\x73\\x5f\\x72\\x61'+'\\x6e\\x64\\x6f\\x6d'],undefined)?ゃぜ['\\x67\\x47\\x64\\x56'+'\\x72'](fanqieInt,おビ['\\x61\\x72\\x67\\x75'+'\\x73\\x5f\\x72\\x61'+'\\x6e\\x64\\x6f\\x6d']):Math['\\x66\\x6c\\x6f\\x6f'+'\\x72'](ゃぜ['\\x42\\x63\\x69\\x4e'+'\\x4d'](Math['\\x72\\x61\\x6e\\x64'+'\\x6f\\x6d'](),0x284a2454+-0xa4076*-0xc37+-0x5*0x780b456));continue;case'\\x38':var ｩざ=ゃぜ['\\x41\\x57\\x74\\x75'+'\\x73'](ゃぜ['\\x53\\x43\\x77\\x47'+'\\x52'](ゃぜ['\\x78\\x69\\x71\\x72'+'\\x58'](ゃぜ['\\x62\\x6e\\x4c\\x53'+'\\x4e'](fanqieFieldString,-0x43*0x95+0xb83+0x1b7d,ぬぶ),ゃぜ['\\x53\\x48\\x76\\x4c'+'\\x6e'](fanqieFieldString,-0xf5*0xb+0xf*0x68+0x471,ごぽ)),ゃぜ['\\x78\\x45\\x7a\\x44'+'\\x4f'](fanqieFieldString,-0x15*-0x101+0x2*0xeed+-0x32ec,りﾈ)),ゃぜ['\\x4f\\x55\\x43\\x4f'+'\\x41'](fanqieFieldVarint,-0x60b*0x3+0xee3+0x3*0x116,ゃぜ['\\x4d\\x6a\\x75\\x59'+'\\x4c'](fanqieOsDword,ごぽ)));continue;case'\\x39':var ぬぶ=ゃぜ['\\x6c\\x73\\x63\\x68'+'\\x59'](ﾗﾄ['\\x64\\x65\\x76\\x69'+'\\x63\\x65\\x5f\\x74'+'\\x79\\x70\\x65'],undefined)?ﾗﾄ['\\x64\\x65\\x76\\x69'+'\\x63\\x65\\x5f\\x74'+'\\x79\\x70\\x65']:'';continue;case'\\x31\\x30':var りﾈ=ゃぜ['\\x66\\x4d\\x6e\\x71'+'\\x42'](おビ['\\x63\\x68\\x61\\x6e'+'\\x6e\\x65\\x6c'],undefined)?ゃぜ['\\x4d\\x6a\\x75\\x59'+'\\x4c'](String,おビ['\\x63\\x68\\x61\\x6e'+'\\x6e\\x65\\x6c']):ゃぜ['\\x43\\x55\\x56\\x69'+'\\x67'](ﾗﾄ['\\x63\\x68\\x61\\x6e'+'\\x6e\\x65\\x6c'],undefined)?ﾗﾄ['\\x63\\x68\\x61\\x6e'+'\\x6e\\x65\\x6c']:'\\x30';continue;case'\\x31\\x31':var ヤツ=ゃぜ['\\x73\\x4f\\x65\\x47'+'\\x63'](ﾗﾄ['\\x76\\x65\\x72\\x73'+'\\x69\\x6f\\x6e\\x5f'+'\\x6e\\x61\\x6d\\x65'],undefined)?ﾗﾄ['\\x76\\x65\\x72\\x73'+'\\x69\\x6f\\x6e\\x5f'+'\\x6e\\x61\\x6d\\x65']:'';continue;case'\\x31\\x32':var ヰぇ=ゃぜ['\\x44\\x50\\x44\\x6a'+'\\x63'](おビ['\\x73\\x64\\x6b\\x5f'+'\\x76\\x65\\x72\\x73'+'\\x69\\x6f\\x6e'],undefined)?ゃぜ['\\x57\\x6b\\x74\\x79'+'\\x78'](String,おビ['\\x73\\x64\\x6b\\x5f'+'\\x76\\x65\\x72\\x73'+'\\x69\\x6f\\x6e']):ゃぜ['\\x52\\x64\\x6c\\x4c'+'\\x76'];continue;case'\\x31\\x33':var ごぽ=ゃぜ['\\x66\\x4d\\x6e\\x71'+'\\x42'](ﾗﾄ['\\x6f\\x73\\x5f\\x76'+'\\x65\\x72\\x73\\x69'+'\\x6f\\x6e'],undefined)?ﾗﾄ['\\x6f\\x73\\x5f\\x76'+'\\x65\\x72\\x73\\x69'+'\\x6f\\x6e']:'';continue;case'\\x31\\x34':var ﾈﾐ=ゃぜ['\\x6f\\x4b\\x53\\x45'+'\\x6a'](おビ['\\x73\\x64\\x6b\\x5f'+'\\x76\\x65\\x72\\x73'+'\\x69\\x6f\\x6e\\x5f'+'\\x69\\x6e\\x74'],undefined)?ゃぜ['\\x6a\\x4a\\x57\\x53'+'\\x67'](fanqieInt,おビ['\\x73\\x64\\x6b\\x5f'+'\\x76\\x65\\x72\\x73'+'\\x69\\x6f\\x6e\\x5f'+'\\x69\\x6e\\x74']):0xa5774cb+0x100f6e67+0x1ef*-0x9802e;continue;}break;}}function fanqieReverseBytes(でジ){var ｯｵ={};ｯｵ['\\x50\\x55\\x4e\\x6b'+'\\x63']=function(ﾎれ,ぅだ){return ﾎれ-ぅだ;},ｯｵ['\\x78\\x65\\x59\\x74'+'\\x61']=function(ヮズ,ンｴ){return ヮズ>=ンｴ;};var ガｼ=ｯｵ,ヘゴ='',っも;for(っも=ガｼ['\\x50\\x55\\x4e\\x6b'+'\\x63'](でジ['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68'],0x4d9*0x6+0x2634*-0x1+0x91f);ガｼ['\\x78\\x65\\x59\\x74'+'\\x61'](っも,0x5*0x265+0xce1+-0x2*0xc6d);っも--)ヘゴ+=でジ['\\x63\\x68\\x61\\x72'+'\\x41\\x74'](っも);return ヘゴ;}function fanqieAesSbox(){return[0x10ce+0x2706+-0x3771,0x595+0x1*-0x313+0x206*-0x1,-0xe2a+0x1f3d+-0x109c,-0x118+-0x98e*0x4+0x27cb,-0x19e*-0x5+0x8*-0x2b0+0x2*0x72e,-0xe44+-0x537+0x13e6,-0x20f5+-0x23fe+-0x22b1*-0x2,-0x21c3+0x47f*-0x8+0xc0*0x5e,0xa59+-0x253f+-0x1*-0x1b16,-0x39d*0x4+0x1*0x18d7+-0xa62,-0x2419+0x1a92+0x1*0x9ee,-0x4*-0x247+0x2558+-0x2e49,-0x44b+0x1adf+-0xacb*0x2,0x748+-0x2e*-0x3d+0x63*-0x2d,-0x22c7+-0xd7*-0x1f+0x969,-0xd00+-0x105b+0x1dd1,0x1cf2+0xa59+0x2681*-0x1,-0x22df+-0xf1*-0x15+0xf9c,-0x2ff*-0x6+-0x2*0x9d7+-0x27d*-0x1,0x16a7*0x1+-0x20fd+0xad3,0x6ba*0x4+-0x15ce+-0x420,-0xe37+0x3*-0x51a+0x1dde,0x1*0x212b+-0x2444+-0x9*-0x60,0x19*0x62+0x1*-0x23c4+0x1b22,0x21b7+-0x1*0x134b+-0x1*0xdbf,0x1f89+0x8*0x100+-0x26b5,-0x211b+0xc7a+0x1543,-0x1*0x205f+-0x14b7+0x35c5,0xb*0x6+0x1457+-0x13fd,-0x846+-0x24e+0x59c*0x2,-0x1*-0x1613+0x2197+-0x3738,-0x36e+-0x1*-0x17f5+0x53*-0x3d,0x6d+0x9*-0x291+0x1763,0x1*0x130d+-0x5c*0x7+-0x2*0x7c6,-0xf6*-0x28+0x7*-0x489+-0x61e,0x23dd+0x10*0x211+-0x44c7*0x1,0x15cd+-0x3a1+-0x11f6,-0xe93+-0x1ec0+-0x1*-0x2d92,-0x139b+0xa78+-0x3*-0x35e,-0x18a*-0x5+-0x1664+0xf7e,0x211b+0x14c+-0x2233,0x1*0x7d5+-0x14a9+-0x1*-0xd79,0x9*0x18a+-0x1*-0x1541+-0x2*0x111b,0x5*0x1b1+-0x1df2+0x21*0xae,0x1b5+-0x8f+-0xb5,0x6ee+0x1*-0x2023+0x1a0d,-0x1476+0x594+0xf13,-0x26bb+-0x1*-0x136e+0x1362,-0x3*-0x894+-0x256d+0xbb5,-0x27e+0x1e6+0x15f,0x113*-0x2+-0x49*0x49+-0xb8d*-0x2,0x1*0xa0b+0x1*-0x4b2+0x24b*-0x2,-0x1*0x228a+0x2*-0x58a+0x2db6*0x1,-0x6*-0x498+0xcbc+-0xd*0x30e,0x9fa+0x1648+0x395*-0x9,0xb60+0xc0c+-0x1*0x16d2,-0x74a*0x5+0x6f0+0x1d89*0x1,0x1438+0x13ab*-0x1+-0x7b*0x1,-0x1735+-0x112e+0x3*0xda1,0x1f37+-0x1061+0x4*-0x37d,-0x568+0x2*-0x761+0x303*0x7,0x2e*0x34+-0xa91+0x160,0xedf+0x12aa*0x1+-0x20d7,0x2262+-0xd*0x1b4+0x1af*-0x7,-0xf27*0x1+-0x1b9c+0x2acc,-0x7c9*0x3+-0x5e1+0x1dbf,-0xc24+0x2058+-0xa04*0x2,-0x24ca*-0x1+0x144e*-0x1+-0x1*0x1062,-0x2*-0xad+-0x1d4b+0xa*0x2ce,0x816+0x1*-0x1d75+0x1*0x15cd,0x29*0x5c+-0x53c+-0x926,-0x13b2*0x1+0x13*0x167+0x1*-0x653,-0x1*-0x22f7+-0x19b8+-0x8ed,0x1*-0x1b65+0xab2+0x1*0x10ee,0x4*-0x35+-0x1*-0x2417+-0x226d*0x1,-0x12ea+-0x796*-0x2+-0x471*-0x1,-0x1909+-0x2a2*0x8+0x2e42*0x1,0x8ca+0x1*-0x2635+0x1e4e,-0xc3e+-0x6*-0xfe+-0x679*-0x1,-0x3*0x34b+-0x437*0x2+-0x4f*-0x3d,-0x80b+0x1201+-0x9a3*0x1,0x12d0+0x57f+0x2*-0xbbf,-0x1*-0x1083+0x13d6+-0x2459,0x1bad+-0x224f+0x78f,0x17*0x1af+0x545+-0x2bde,0xd84+-0x1259+0x5d1,-0x1*0x2dd+0x1c7c+0x18ee*-0x1,-0x229f+0x18bf+0xa3b,-0x75e+-0x10a*0x15+-0x9*-0x34a,-0xf1a*-0x1+0x1b7*0x3+-0xc*0x19f,-0x189f*-0x1+-0x1ed4+0x1*0x6f3,0x1e03*0x1+-0x649+0x1*-0x1781,0x16ab+-0x1a9e+-0x9b*-0x7,0x476*0x3+-0x1*-0x1ece+-0x2be4,0x1*-0x194e+-0x6d9*-0x1+0x12cd,0xef*-0x29+-0x22d*0xe+0x458c,-0xdb+-0x754+0x8ff,0x118d*-0x2+0x1f5a+0x4af,-0x4d0+0x16af+-0x1135,0x205c+-0x3*-0x1b7+0x6e*-0x55,0x502*-0x2+0xe60+-0x419,0x1a16+0x161*-0x2+0x2d*-0x83,-0x8*0x84+0x13bd+0x7b5*-0x2,-0x1*-0x26ba+-0x335*0x3+-0x1c96,0x1*0x971+-0xd4b+0x41f,-0x5*0x5f9+-0x17*0x31+0x233d,0x1*-0xed1+0xa93+0x440,-0x3*-0xf1+-0x41d+0x1*0x1c9,0x8bd*-0x1+0x279*-0x1+0x76*0x19,-0x1c02*0x1+0x1f83+-0x345,-0x19c+0x2*-0xbbf+0x19b9,-0x67*-0x26+0x1*-0x1f0e+0x2*0x836,0xbf9+-0x7ce+-0x11*0x3a,0x4*0x257+0x1e81+-0x139d*0x2,-0x16b5+-0x4*0x732+0x33bd,-0x2456+0x275*-0x8+-0x1f*-0x1d3,-0x1afd+-0x1b8a+-0x1c7*-0x1f,0x773+0x2059+-0x272f,0x1*-0x1ae0+0x1c8b*-0x1+0x37a3,0x1bd+0x2*0xf1f+0x169*-0x16,0x1945+-0x55b+0x997*-0x2,0x16cf*0x1+-0x98*0x25+0xb*-0x3,-0xc56+0x2179+-0x1*0x1449,0x1*-0x49d+-0x148*0xe+0x16ae,0x2*0xb99+0x29*-0x6b+-0x5ff,-0x99a*-0x1+-0x1044+-0x7a9*-0x1,-0x13d*-0x1b+0x81*-0x29+-0x1*0xbd3,-0x20fc+-0x2146+-0x6*-0xb2e,-0x164f+-0x95*0x1+0x17b1,0x1*0x1e9d+-0xec1+-0xfd0,0x1af+-0x1bdf+0x1a43,-0xeed*-0x2+-0x79d*0x2+-0xdb4,-0x175c+0x9d*0x1+0x171e*0x1,-0x30d+-0x22f1+0x2695,0x3*-0xa9f+-0x11*0x1d8+0x3f79*0x1,-0x1*-0x11e7+0x25c+0x4*-0x50b,-0x1*-0x305+0x850+-0xa91,0x142a+-0x2064+0x15*0x9d,-0x1ed*0xa+0x23fe+-0x129*0xe,-0xc08+-0x68*-0x10+0x5c5,0x2*0x12f8+0xbc9+-0x3155,-0xe7c+0x85*-0xa+0x1*0x140b,0x171*0x3+-0xfac+0x5*0x24a,0x1998+-0x17bf+-0x2*0xb3,0x245*-0x2+0x53f+-0x55*0x1,0x5c*-0x61+0x1b44+0x819,-0x14a8+-0xe9*-0x22+0x16d*-0x7,0x18d6+0x3*-0x5f8+0x103*-0x6,0x1648+0x289*-0x3+0x33*-0x49,0x1*-0x12c4+0x2d6+0x1018,0x5*-0x3ab+-0x28e*-0x2+0xdcb,-0x25c8+-0x289+-0x28d9*-0x1,0x2696+-0x91f+-0x3*0x9bb,-0x6*-0x3a1+-0x1343*-0x2+-0x1daf*0x2,0x99b+-0x4a*-0x47+0x1d69*-0x1,-0x1cc5+-0x772+-0x1*-0x244b,-0x325*-0x1+0xa7*-0x1c+0xffd,-0x2a1*-0x6+-0xf61+-0x1*0x7,-0x1a19+-0x1c36+0x365a,0x15ca+0x959*0x1+0x4*-0x792,-0x1*-0x1804+0x1b09+-0x322d,0x2488+0x1*0x1e70+-0x32e*0x15,-0x2*-0x411+0xd*0x1fb+-0x21a7,0xcd0+0x2e*-0x37+-0x2e4,-0x8a5+-0x1344+-0x4b3*-0x6,0x23f4+0x3*-0x637+0x19*-0xb1,-0x22e6+-0x26e8+0x24f9*0x2,-0x9*-0x1e9+-0x9cb+-0x70a*0x1,0x1f*0xef+0x8d*0x2b+-0x1*0x33de,-0x5c2+0x1c33+-0x159e,-0x37*-0x1+0xa*0x2a+0x3*-0x65,0x3*-0x976+-0x1*-0x621+0x16a3,-0xcbd+0x1*-0x2248+0x2f96,-0x2*0x113d+0x14+0x22fb,0xdee+-0x26f4+0x19ea,-0xa*0xbc+-0x93*0x19+0x3b2*0x6,0x360+-0x1c50+0x19d7,0x1*-0x17ea+-0x1*-0x247f+-0xbcd,-0x40e+0x2296+-0x1e51,0x1ec7+0xcc6+0xa0*-0x45,0xa*-0x18d+-0x24a2+0x34b1,0x1459*-0x1+0x1fb0+0x5*-0x21a,-0x230c+-0x922+0x2c7c,0x1be8+0x22dc+-0x3e1b,0x21*-0x107+-0x3*0x37f+0x2cd0,0x40+0x1035+-0x1*0x101f,-0x5*-0x771+-0x12e1*0x1+-0x116*0x10,0x2*0x3b+0x2616+-0x12d1*0x2,-0x1557+0x35b*0x7+-0x1c1,0x4c*-0x3+0x1178+0x80d*-0x2,-0x29*-0x4b+-0x14e3+-0x4c7*-0x2,0x209b+0x8b4+0x1*-0x2947,0x113a+-0x1e3c+0x3*0x494,-0x5b4+0x1b4f*0x1+-0x305*0x7,0x11a*-0x13+0x1deb+-0x8d8,0x4*-0x805+-0x2199+0x41db*0x1,0x707+0x270e+-0x3*0xf53,-0x139f*0x1+-0x88d*-0x2+0x32b,0x19f9*-0x1+0x178*0x1a+-0xb83,-0x1*0xc31+-0xeff+-0x3*-0x952,-0x9a2+0x3*0x2c2+0xa*0x3a,0x2*0xddf+-0x1e32*0x1+-0x351*-0x1,-0x79*0x21+-0xe4d+0x1e5a,0x18a5+0x1fee+0x1c3a*-0x2,0x7d5+0x1*-0xad8+0x34e,0x14f1+-0x244c+-0x4*-0x406,-0x11*0x31+-0x52+0x41e,-0xa25*-0x1+0xc67+0x272*-0x9,0x7*0x9b+-0x5*0x767+0x2136,0xd8f+0x715+0x1*-0x1466,0x1c30+-0x2561*-0x1+0x206e*-0x2,-0x220*-0xe+-0x60e+-0x7*0x354,0x15*-0x141+-0x88d*-0x3+0xf6,-0x1a3b+0x97*0x7+0x161d,-0xfb0+0xa*0x181+0x2*0xce,0x1cbd*0x1+0x240f+-0x205f*0x2,-0x49*-0x3a+-0x1*0x1214+-0x1*-0x1eb,-0x1921+0x13b1+0x5a5,0x2300+0x7ae+0xe1d*-0x3,0x22f4+0x13bd+0x1afc*-0x2,-0x2704+-0x1183+0x7f*0x73,0x86*-0x1b+-0x6*0x63e+0x3457,-0x1*0xc93+0x759*0x5+-0x2f*0x83,-0x719*0x4+0xd49+-0x7*-0x23f,0x143b+0x17c6+-0xc*0x398,0xb9c+-0x73*0x27+-0x1*-0x6e1,-0x95*0x40+0x1ae3*0x1+0xbb*0xf,0x2598+0x6d7+-0x2c5e,-0xb5e+0x1401+-0x1a*0x51,-0x39*0xaa+0x1279+0x143a,0x11d+0x1f08+0x1*-0x1f97,0x1326+0x23b9+-0x1*0x364b,0x1*-0x17b9+-0x1*0x307+-0x2f*-0x95,0x1fd3+0x71*-0x3e+-0x457*0x1,0x82a+-0x1d54+0x15b1,0x31b+0x2146+-0x4*0x8de,-0x1b47*0x1+0xe4a+-0x3*-0x499,-0x15*-0x5+-0x4*-0x1ed+0x18*-0x53,-0x1779+0x20*-0x3b+0x1f01,-0x16a1+-0x17*-0x22+0x2*0xa39,-0x248f+0x42b+-0x3e*-0x88,-0x215b*0x1+-0x1603+-0x5*-0xb33,-0x2a1*0x8+-0x198e+-0xfb5*-0x3,0x8ff+0xaea+-0x9ee*0x2,-0x1302*0x2+0x2*-0x70f+-0x34e1*-0x1,-0x253a+-0x6ae+0x136*0x25,0xf1e+-0x1274+0x1cc*0x2,0x2536+0xacd+-0x2f9b,-0xc3c+0x35*0x2+0xc13,-0x2370+0x617+-0x1df2*-0x1,0xf44+0x56f*-0x2+0x1*-0x439,-0x5c3+0x15d1+-0xfff,0x249b*-0x1+-0x4c*0x81+0x1*0x4b97,0x1fd*-0xf+0xeac+0xf7b,0x10f8+-0x3b9*-0x5+0xb9e*-0x3,0x182d+-0x580+0x1*-0x1297];}function fanqieAesXtime(びヸ){var ｺぎ={};ｺぎ['\\x4c\\x4d\\x5a\\x70'+'\\x66']=function(ヘノ,ムタ){return ヘノ&ムタ;},ｺぎ['\\x4b\\x4e\\x41\\x44'+'\\x53']=function(ウご,カフ){return ウご^カフ;},ｺぎ['\\x71\\x69\\x59\\x79'+'\\x4e']=function(コぁ,へぷ){return コぁ<<へぷ;},ｺぎ['\\x74\\x52\\x52\\x59'+'\\x43']=function(すジ,ひツ){return すジ&ひツ;};var ニｭ=ｺぎ;return ニｭ['\\x4c\\x4d\\x5a\\x70'+'\\x66'](ニｭ['\\x4b\\x4e\\x41\\x44'+'\\x53'](ニｭ['\\x71\\x69\\x59\\x79'+'\\x4e'](びヸ,0x59*0x2b+0x1228+-0x211a),ニｭ['\\x74\\x52\\x52\\x59'+'\\x43'](びヸ,-0xe*0x14b+0x2*-0x8e+-0x1d*-0xae)?-0x1c5e+0x1*-0x8bf+0x2538:-0x25d+0x1de*-0xc+0x18c5),-0x66*0x4+-0x1b*-0x10d+0x16*-0x12c);}function fanqieAesExpandKey(ひつ,ｦﾗ){var ｫゾ={'\\x58\\x42\\x4a\\x75\\x71':'\\x31\\x7c\\x30\\x7c'+'\\x39\\x7c\\x37\\x7c'+'\\x33\\x7c\\x38\\x7c'+'\\x32\\x7c\\x31\\x30'+'\\x7c\\x36\\x7c\\x34'+'\\x7c\\x35','\\x57\\x47\\x6b\\x58\\x64':function(わモ,けヴ){return わモ<けヴ;},'\\x55\\x71\\x69\\x74\\x77':'\\x30\\x7c\\x34\\x7c'+'\\x31\\x7c\\x37\\x7c'+'\\x38\\x7c\\x32\\x7c'+'\\x36\\x7c\\x33\\x7c'+'\\x35','\\x4c\\x55\\x79\\x45\\x73':function(めｱ,ﾉサ){return めｱ-ﾉサ;},'\\x6b\\x44\\x4b\\x65\\x74':function(みノ,もモ){return みノ-もモ;},'\\x66\\x6f\\x76\\x78\\x63':function(ゆガ,りも){return ゆガ^りも;},'\\x52\\x67\\x45\\x71\\x6f':function(るﾕ,ゃﾔ){return るﾕ-ゃﾔ;},'\\x7a\\x4f\\x70\\x48\\x6d':function(スン,ﾓｼ){return スン+ﾓｼ;},'\\x55\\x58\\x6d\\x64\\x48':function(びﾐ,ホｮ){return びﾐ^ホｮ;},'\\x69\\x45\\x7a\\x44\\x7a':function(ﾋほ,いほ){return ﾋほ-いほ;},'\\x55\\x46\\x53\\x68\\x4c':function(ぷぼ,ﾌソ){return ぷぼ-ﾌソ;},'\\x52\\x4d\\x77\\x41\\x56':function(ぱｹ,さあ){return ぱｹ+さあ;},'\\x58\\x71\\x70\\x5a\\x4f':function(ｫふ,ぜﾍ){return ｫふ^ぜﾍ;},'\\x41\\x4a\\x74\\x43\\x50':function(ｦﾓ,バよ){return ｦﾓ+バよ;},'\\x77\\x5a\\x51\\x67\\x77':function(ヶヅ,ラた){return ヶヅ^ラた;},'\\x50\\x4b\\x6a\\x4e\\x42':function(でマ,ﾛｹ){return でマ-ﾛｹ;},'\\x70\\x58\\x76\\x58\\x72':function(にナ,プた){return にナ===プた;},'\\x5a\\x73\\x71\\x71\\x53':function(フパ,ろゥ){return フパ%ろゥ;},'\\x59\\x6f\\x6e\\x48\\x6a':'\\x31\\x7c\\x32\\x7c'+'\\x30\\x7c\\x33\\x7c'+'\\x35\\x7c\\x34','\\x74\\x74\\x54\\x50\\x64':function(えょ,ヱぐ){return えょ(ヱぐ);},'\\x44\\x54\\x78\\x72\\x69':function(つテ,サビ){return つテ<サビ;},'\\x42\\x48\\x70\\x73\\x58':function(ﾋﾇ,タﾜ){return ﾋﾇ&タﾜ;}},ﾖﾁ=ｫゾ['\\x58\\x42\\x4a\\x75'+'\\x71']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),との=-0xc*-0x124+0x3*-0x3bb+-0x27f;while(!![]){switch(ﾖﾁ[との++]){case'\\x30':var ざン=0x57*0x3e+0x257a+0x1*-0x3a8b;continue;case'\\x31':var るぎ=[];continue;case'\\x32':var ヲァ;continue;case'\\x33':var みﾑ;continue;case'\\x34':for(ｬツ=-0x635*0x4+0x11b*-0x23+0x3f95*0x1;ｫゾ['\\x57\\x47\\x6b\\x58'+'\\x64'](ｬツ,-0x73*-0x39+0x1095+-0x2980);ｬツ+=-0x8a9*0x1+0x85b+0x2*0x29){var ゴち=ｫゾ['\\x55\\x71\\x69\\x74'+'\\x77']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),ｼネ=0x1*0xe09+-0xf*-0x1+0xb*-0x148;while(!![]){switch(ゴち[ｼネ++]){case'\\x30':ョﾆ=るぎ[ｫゾ['\\x4c\\x55\\x79\\x45'+'\\x73'](ｬツ,-0xb02+0x2*0x58f+0x1*-0x18)];continue;case'\\x31':けニ=るぎ[ｫゾ['\\x6b\\x44\\x4b\\x65'+'\\x74'](ｬツ,-0x528+0x18d+-0x39d*-0x1)];continue;case'\\x32':るぎ[ｬツ]=ｫゾ['\\x66\\x6f\\x76\\x78'+'\\x63'](るぎ[ｫゾ['\\x52\\x67\\x45\\x71'+'\\x6f'](ｬツ,-0x162b*-0x1+0x2b*-0x1+-0x15f0)],ョﾆ);continue;case'\\x33':るぎ[ｫゾ['\\x7a\\x4f\\x70\\x48'+'\\x6d'](ｬツ,0x1a7d*0x1+-0x1a1*-0x15+-0x3cb0)]=ｫゾ['\\x55\\x58\\x6d\\x64'+'\\x48'](るぎ[ｫゾ['\\x69\\x45\\x7a\\x44'+'\\x7a'](ｬツ,-0x5*-0x42d+0x2336+0x1*-0x3809)],けニ);continue;case'\\x34':みﾑ=るぎ[ｫゾ['\\x55\\x46\\x53\\x68'+'\\x4c'](ｬツ,-0x216d+-0x1fde+0x414e)];continue;case'\\x35':るぎ[ｫゾ['\\x52\\x4d\\x77\\x41'+'\\x56'](ｬツ,-0x2*0x88+0x1*-0xafb+0xc0e)]=ｫゾ['\\x58\\x71\\x70\\x5a'+'\\x4f'](るぎ[ｫゾ['\\x6b\\x44\\x4b\\x65'+'\\x74'](ｬツ,-0x1ad9+0x6e0+0x1d2*0xb)],ヲァ);continue;case'\\x36':るぎ[ｫゾ['\\x41\\x4a\\x74\\x43'+'\\x50'](ｬツ,0x2f*0xbc+0xf82*-0x1+-0x1301)]=ｫゾ['\\x77\\x5a\\x51\\x67'+'\\x77'](るぎ[ｫゾ['\\x50\\x4b\\x6a\\x4e'+'\\x42'](ｬツ,-0x260d+-0x1239+-0x13*-0x2f7)],みﾑ);continue;case'\\x37':ヲァ=るぎ[ｫゾ['\\x52\\x67\\x45\\x71'+'\\x6f'](ｬツ,0xdd*-0x11+-0x18eb*0x1+0xd33*0x3)];continue;case'\\x38':if(ｫゾ['\\x70\\x58\\x76\\x58'+'\\x72'](ｫゾ['\\x5a\\x73\\x71\\x71'+'\\x53'](ｬツ,-0x2010+0x2*0x10ac+-0x138),-0x11*-0x23f+0x1*0x1c96+0x1*-0x42c5)){var ﾜソ=ｫゾ['\\x59\\x6f\\x6e\\x48'+'\\x6a']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),ヌｹ=-0x1*0x17b+0x2d*-0xa3+0x227*0xe;while(!![]){switch(ﾜソ[ヌｹ++]){case'\\x30':みﾑ=ｦﾗ[けニ];continue;case'\\x31':ェﾐ=ョﾆ;continue;case'\\x32':ョﾆ=ｫゾ['\\x77\\x5a\\x51\\x67'+'\\x77'](ｦﾗ[みﾑ],ざン);continue;case'\\x33':けニ=ｦﾗ[ヲァ];continue;case'\\x34':ざン=ｫゾ['\\x74\\x74\\x54\\x50'+'\\x64'](fanqieAesXtime,ざン);continue;case'\\x35':ヲァ=ｦﾗ[ェﾐ];continue;}break;}}continue;}break;}}continue;case'\\x35':return るぎ;case'\\x36':for(ｬツ=0x52*0x3+0x2255+-0x70f*0x5;ｫゾ['\\x44\\x54\\x78\\x72'+'\\x69'](ｬツ,0x1d4c+-0x191b+0x97*-0x7);ｬツ++)るぎ[ｬツ]=ｫゾ['\\x42\\x48\\x70\\x73'+'\\x58'](ひつ['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](ｬツ),-0x2617+-0x3*0x1a1+0x2bf9);continue;case'\\x37':var ョﾆ;continue;case'\\x38':var けニ;continue;case'\\x39':var ｬツ;continue;case'\\x31\\x30':var ェﾐ;continue;}break;}}function fanqieAesEncryptBlock(ｸつ,ｰて,ヸす){var ゕゾ={'\\x58\\x4c\\x46\\x6e\\x51':'\\x31\\x34\\x7c\\x31'+'\\x33\\x7c\\x31\\x32'+'\\x7c\\x39\\x7c\\x35'+'\\x7c\\x32\\x7c\\x31'+'\\x35\\x7c\\x31\\x31'+'\\x7c\\x36\\x7c\\x37'+'\\x7c\\x38\\x7c\\x31'+'\\x30\\x7c\\x31\\x7c'+'\\x33\\x7c\\x34\\x7c'+'\\x30','\\x71\\x43\\x62\\x6b\\x43':function(べヅ,ｭゔ){return べヅ<ｭゔ;},'\\x72\\x57\\x4e\\x77\\x65':function(デけ,ィﾗ){return デけ^ィﾗ;},'\\x68\\x6c\\x69\\x69\\x69':function(ユべ,ゐｽ){return ユべ&ゐｽ;},'\\x42\\x6f\\x6a\\x6c\\x78':function(ぇヰ,ﾆャ){return ぇヰ<=ﾆャ;},'\\x55\\x77\\x41\\x44\\x68':'\\x34\\x7c\\x32\\x7c'+'\\x35\\x7c\\x31\\x7c'+'\\x33\\x7c\\x30','\\x70\\x77\\x73\\x41\\x75':function(すヘ,ザび){return すヘ<ザび;},'\\x56\\x6a\\x75\\x43\\x43':function(ぞﾒ,ゐゖ){return ぞﾒ+ゐゖ;},'\\x5a\\x4f\\x61\\x53\\x6b':function(ずは,ろめ){return ずは*ろめ;},'\\x70\\x67\\x6f\\x44\\x52':function(えボ,ｰポ){return えボ!==ｰポ;},'\\x49\\x49\\x4f\\x7a\\x59':'\\x35\\x7c\\x33\\x7c'+'\\x31\\x7c\\x32\\x7c'+'\\x36\\x7c\\x37\\x7c'+'\\x30\\x7c\\x34','\\x53\\x41\\x49\\x6e\\x4a':function(わに,さニ){return わに^さニ;},'\\x72\\x55\\x54\\x57\\x62':function(つず,ホｫ){return つず^ホｫ;},'\\x79\\x6f\\x49\\x53\\x66':function(ミゕ,ワﾂ){return ミゕ(ワﾂ);},'\\x76\\x66\\x71\\x53\\x52':function(ぃヤ,ィろ){return ぃヤ^ィろ;},'\\x45\\x58\\x4d\\x6a\\x57':function(びﾌ,チヷ){return びﾌ(チヷ);},'\\x7a\\x56\\x75\\x72\\x53':function(ヌセ,もﾅ){return ヌセ*もﾅ;},'\\x68\\x4a\\x49\\x6d\\x78':function(すﾆ,ﾜｳ){return すﾆ+ﾜｳ;},'\\x66\\x7a\\x43\\x42\\x66':function(ぢつ,ナラ){return ぢつ+ナラ;},'\\x66\\x46\\x4c\\x6f\\x73':function(バッ,べタ){return バッ+べタ;},'\\x72\\x79\\x67\\x6e\\x51':function(ゃぼ,えび){return ゃぼ*えび;},'\\x69\\x41\\x4d\\x58\\x4f':function(ヵっ,ンァ){return ヵっ^ンァ;},'\\x52\\x55\\x75\\x6c\\x53':function(ﾅト,はザ){return ﾅト(はザ);},'\\x6e\\x57\\x69\\x53\\x49':function(おぺ,へふ){return おぺ*へふ;},'\\x79\\x77\\x64\\x65\\x42':function(ヸス,シじ){return ヸス^シじ;},'\\x4d\\x67\\x79\\x71\\x7a':function(ｰチ,ピむ){return ｰチ^ピむ;},'\\x6e\\x79\\x6b\\x77\\x57':function(ュム,ルバ){return ュム(ルバ);},'\\x78\\x72\\x56\\x76\\x45':function(ナふ,ぅﾎ){return ナふ+ぅﾎ;},'\\x74\\x70\\x4c\\x69\\x54':function(ﾃｸ,つぐ){return ﾃｸ^つぐ;},'\\x62\\x51\\x7a\\x58\\x4c':function(こぐ,ﾒｽ){return こぐ^ﾒｽ;},'\\x49\\x4c\\x41\\x4e\\x77':function(ﾐﾎ,ﾖヱ){return ﾐﾎ^ﾖヱ;},'\\x45\\x4b\\x64\\x57\\x53':function(フヱ,キい){return フヱ(キい);},'\\x73\\x63\\x4e\\x52\\x74':function(ゎガ,ゎヺ){return ゎガ<ゎヺ;},'\\x7a\\x74\\x63\\x6b\\x45':function(ｼゆ,ぽせ){return ｼゆ<ぽせ;},'\\x59\\x77\\x77\\x6f\\x41':function(りヅ,ﾊま){return りヅ*ﾊま;},'\\x61\\x66\\x6f\\x79\\x47':function(ゃｾ,ﾕチ){return ゃｾ*ﾕチ;},'\\x58\\x63\\x49\\x66\\x61':function(ﾒろ,ﾚﾙ){return ﾒろ%ﾚﾙ;}},しユ=ゕゾ['\\x58\\x4c\\x46\\x6e'+'\\x51']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),ごヹ=-0x13bc+0x199e+-0x5e2;while(!![]){switch(しユ[ごヹ++]){case'\\x30':return ｽゑ['\\x6a\\x6f\\x69\\x6e']('');case'\\x31':for(メダ=-0x3*0x584+0x1fbb*-0x1+-0x1*-0x3047;ゕゾ['\\x71\\x43\\x62\\x6b'+'\\x43'](メダ,-0x769*0x5+-0xd53*-0x1+0x2a*0x91);メダ++)ｨﾉ[メダ]=ゕゾ['\\x72\\x57\\x4e\\x77'+'\\x65'](ゕゾ['\\x68\\x6c\\x69\\x69'+'\\x69'](ｸつ['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](メダ),0x1f96+0x1b9c+-0x3a33),ｰて[メダ]);continue;case'\\x32':var メダ;continue;case'\\x33':for(すえ=0x163b+-0x2189+0xb4f;ゕゾ['\\x42\\x6f\\x6a\\x6c'+'\\x78'](すえ,-0x1835+0x12a7+0x598);すえ++){var ﾛヵ=ゕゾ['\\x55\\x77\\x41\\x44'+'\\x68']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),ｩﾑ=-0x1*0x17fe+-0x11*0xa7+-0x2315*-0x1;while(!![]){switch(ﾛヵ[ｩﾑ++]){case'\\x30':for(メダ=-0x6aa*-0x3+0x1411*-0x1+-0x13*-0x1;ゕゾ['\\x70\\x77\\x73\\x41'+'\\x75'](メダ,0x1f8a+0x2708+-0x13*0x3b6);メダ++)ｨﾉ[メダ]^=ｰて[ゕゾ['\\x56\\x6a\\x75\\x43'+'\\x43'](ゕゾ['\\x5a\\x4f\\x61\\x53'+'\\x6b'](すえ,-0x6c4+0x2*-0xba9+0x1e26),メダ)];continue;case'\\x31':ｨﾉ=ﾘク;continue;case'\\x32':ﾘク=new Array(0x4db+-0x10*0x1b7+0x16a5*0x1);continue;case'\\x33':if(ゕゾ['\\x70\\x67\\x6f\\x44'+'\\x52'](すえ,0xf*-0x171+0x74*-0x44+-0x77f*-0x7)){ﾀみ=new Array(-0xae8+-0x13bc+0x1eb4);for(ﾑﾌ=0x1750+0x1a1f+0x316f*-0x1;ゕゾ['\\x70\\x77\\x73\\x41'+'\\x75'](ﾑﾌ,0x2*0x712+0x7f8+-0x1618);ﾑﾌ++){var クひ=ゕゾ['\\x49\\x49\\x4f\\x7a'+'\\x59']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),ヶｺ=0x2*0x61+-0xcec+-0xad*-0x12;while(!![]){switch(クひ[ヶｺ++]){case'\\x30':ﾀみ[ゕゾ['\\x56\\x6a\\x75\\x43'+'\\x43'](ゕゾ['\\x5a\\x4f\\x61\\x53'+'\\x6b'](ﾑﾌ,-0x1*0xb24+0x2298+-0x1770),-0x2*0xb5f+-0x15a3*-0x1+0x11d)]=ゕゾ['\\x53\\x41\\x49\\x6e'+'\\x4a'](ゕゾ['\\x53\\x41\\x49\\x6e'+'\\x4a'](ゕゾ['\\x72\\x55\\x54\\x57'+'\\x62'](シぷ,バぢ),ゕゾ['\\x79\\x6f\\x49\\x53'+'\\x66'](fanqieAesXtime,ｯゴ)),ゕゾ['\\x76\\x66\\x71\\x53'+'\\x52'](ゕゾ['\\x45\\x58\\x4d\\x6a'+'\\x57'](fanqieAesXtime,でヹ),でヹ));continue;case'\\x31':ｯゴ=ｨﾉ[ゕゾ['\\x56\\x6a\\x75\\x43'+'\\x43'](ゕゾ['\\x7a\\x56\\x75\\x72'+'\\x53'](ﾑﾌ,-0x1074+0x38*-0x1b+0x2cc*0x8),0x884+0x1c9f*-0x1+-0x1*-0x141d)];continue;case'\\x32':でヹ=ｨﾉ[ゕゾ['\\x68\\x4a\\x49\\x6d'+'\\x78'](ゕゾ['\\x7a\\x56\\x75\\x72'+'\\x53'](ﾑﾌ,-0x2d0+-0x22ae*-0x1+-0x1fda),0x4*-0x464+0xc76*-0x3+0x36f5)];continue;case'\\x33':バぢ=ｨﾉ[ゕゾ['\\x66\\x7a\\x43\\x42'+'\\x66'](ゕゾ['\\x5a\\x4f\\x61\\x53'+'\\x6b'](ﾑﾌ,-0x5e1+-0x2ce+0x8b3),-0x11ee+0x1ff5+-0xe06)];continue;case'\\x34':ﾀみ[ゕゾ['\\x66\\x46\\x4c\\x6f'+'\\x73'](ゕゾ['\\x72\\x79\\x67\\x6e'+'\\x51'](ﾑﾌ,0x4e5+0x11de+-0x16bf),-0x2b*0x8d+-0x71*0x2+0x1894)]=ゕゾ['\\x69\\x41\\x4d\\x58'+'\\x4f'](ゕゾ['\\x53\\x41\\x49\\x6e'+'\\x4a'](ゕゾ['\\x76\\x66\\x71\\x53'+'\\x52'](ゕゾ['\\x69\\x41\\x4d\\x58'+'\\x4f'](ゕゾ['\\x45\\x58\\x4d\\x6a'+'\\x57'](fanqieAesXtime,シぷ),シぷ),バぢ),ｯゴ),ゕゾ['\\x52\\x55\\x75\\x6c'+'\\x53'](fanqieAesXtime,でヹ));continue;case'\\x35':シぷ=ｨﾉ[ゕゾ['\\x72\\x79\\x67\\x6e'+'\\x51'](ﾑﾌ,-0x114a+-0x1*0xdb7+0x1*0x1f05)];continue;case'\\x36':ﾀみ[ゕゾ['\\x6e\\x57\\x69\\x53'+'\\x49'](ﾑﾌ,-0x23ee+-0x2317*0x1+0x4709)]=ゕゾ['\\x79\\x77\\x64\\x65'+'\\x42'](ゕゾ['\\x4d\\x67\\x79\\x71'+'\\x7a'](ゕゾ['\\x4d\\x67\\x79\\x71'+'\\x7a'](ゕゾ['\\x6e\\x79\\x6b\\x77'+'\\x57'](fanqieAesXtime,シぷ),ゕゾ['\\x72\\x55\\x54\\x57'+'\\x62'](ゕゾ['\\x79\\x6f\\x49\\x53'+'\\x66'](fanqieAesXtime,バぢ),バぢ)),ｯゴ),でヹ);continue;case'\\x37':ﾀみ[ゕゾ['\\x78\\x72\\x56\\x76'+'\\x45'](ゕゾ['\\x72\\x79\\x67\\x6e'+'\\x51'](ﾑﾌ,-0x244b+0x14b4+0xf9b),0x1*-0x64d+0x4a9*0x6+-0xc*0x1ce)]=ゕゾ['\\x74\\x70\\x4c\\x69'+'\\x54'](ゕゾ['\\x79\\x77\\x64\\x65'+'\\x42'](ゕゾ['\\x62\\x51\\x7a\\x58'+'\\x4c'](シぷ,ゕゾ['\\x79\\x6f\\x49\\x53'+'\\x66'](fanqieAesXtime,バぢ)),ゕゾ['\\x49\\x4c\\x41\\x4e'+'\\x77'](ゕゾ['\\x45\\x4b\\x64\\x57'+'\\x53'](fanqieAesXtime,ｯゴ),ｯゴ)),でヹ);continue;}break;}}ｨﾉ=ﾀみ;}continue;case'\\x34':for(メダ=-0xa72*-0x2+0xb*0x2ef+-0x3529;ゕゾ['\\x71\\x43\\x62\\x6b'+'\\x43'](メダ,-0x2152+-0x59c*-0x4+0xaf2);メダ++)ｨﾉ[メダ]=ヸす[ｨﾉ[メダ]];continue;case'\\x35':for(ﾑﾌ=0x26d4+-0x21b0+-0x524;ゕゾ['\\x73\\x63\\x4e\\x52'+'\\x74'](ﾑﾌ,-0x26f5+0x25a6+0x153);ﾑﾌ++){for(がﾜ=-0x10a*-0x4+-0xc4d*-0x3+0x290f*-0x1;ゕゾ['\\x7a\\x74\\x63\\x6b'+'\\x45'](がﾜ,-0x2*0x274+-0x1d*0xc5+0x16f*0x13);がﾜ++)ﾘク[ゕゾ['\\x66\\x46\\x4c\\x6f'+'\\x73'](ゕゾ['\\x59\\x77\\x77\\x6f'+'\\x41'](ﾑﾌ,0x1*-0x1792+0x277*0xd+0x1b1*-0x5),がﾜ)]=ｨﾉ[ゕゾ['\\x56\\x6a\\x75\\x43'+'\\x43'](ゕゾ['\\x61\\x66\\x6f\\x79'+'\\x47'](ゕゾ['\\x58\\x63\\x49\\x66'+'\\x61'](ゕゾ['\\x78\\x72\\x56\\x76'+'\\x45'](ﾑﾌ,がﾜ),0x249f+-0x4*-0xc+-0x24cb),-0x1df5*0x1+0x389*0xa+0x1*-0x561),がﾜ)];}continue;}break;}}continue;case'\\x34':for(メダ=-0x55*-0x65+0x4*-0x49c+-0x1*0xf19;ゕゾ['\\x70\\x77\\x73\\x41'+'\\x75'](メダ,0xa0c*-0x3+-0x1*0x11da+0x1*0x300e);メダ++)ｽゑ[メダ]=String['\\x66\\x72\\x6f\\x6d'+'\\x43\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'](ゕゾ['\\x68\\x6c\\x69\\x69'+'\\x69'](ｨﾉ[メダ],-0x163a+-0xc*0x28b+0x35bd));continue;case'\\x35':var ﾑﾌ;continue;case'\\x36':var ｯゴ;continue;case'\\x37':var でヹ;continue;case'\\x38':var ﾘク;continue;case'\\x39':var がﾜ;continue;case'\\x31\\x30':var ﾀみ;continue;case'\\x31\\x31':var バぢ;continue;case'\\x31\\x32':var すえ;continue;case'\\x31\\x33':var ｽゑ=[];continue;case'\\x31\\x34':var ｨﾉ=[];continue;case'\\x31\\x35':var シぷ;continue;}break;}}function fanqieAesCbcEncrypt(ネﾔ,ﾕリ,にば,マれ){var ｻヲ={'\\x53\\x47\\x58\\x61\\x6b':'\\x31\\x7c\\x32\\x7c'+'\\x35\\x7c\\x38\\x7c'+'\\x39\\x7c\\x36\\x7c'+'\\x31\\x30\\x7c\\x30'+'\\x7c\\x37\\x7c\\x33'+'\\x7c\\x34','\\x4b\\x45\\x46\\x76\\x41':function(ﾗぱ){return ﾗぱ();},'\\x55\\x4d\\x6f\\x51\\x41':function(ゼア,ジホ,ﾖバ){return ゼア(ジホ,ﾖバ);},'\\x70\\x43\\x77\\x4c\\x42':function(ｧパ,ねひ){return ｧパ<ねひ;},'\\x63\\x6f\\x42\\x69\\x52':'\\x33\\x7c\\x31\\x7c'+'\\x30\\x7c\\x34\\x7c'+'\\x32','\\x6e\\x4f\\x72\\x49\\x42':function(ほヌ,ﾔタ){return ほヌ&ﾔタ;},'\\x4b\\x6e\\x44\\x77\\x6a':function(さﾁ,ヮね){return さﾁ^ヮね;},'\\x4a\\x4c\\x78\\x52\\x75':function(ヷﾛ,ふペ){return ヷﾛ+ふペ;},'\\x42\\x6d\\x67\\x70\\x43':function(ｼド,めフ,むｧ,ぷむ){return ｼド(めフ,むｧ,ぷむ);},'\\x6c\\x4d\\x66\\x61\\x56':function(ｲメ,ヌな,ビﾒ){return ｲメ(ヌな,ビﾒ);}},カバ=ｻヲ['\\x53\\x47\\x58\\x61'+'\\x6b']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),レせ=0x1*-0x26b6+-0x266c+0x3*0x19b6;while(!![]){switch(カバ[レせ++]){case'\\x30':var ぇァ;continue;case'\\x31':var ﾂネ=ｻヲ['\\x4b\\x45\\x46\\x76'+'\\x41'](fanqieAesSbox);continue;case'\\x32':var テゥ=ｻヲ['\\x55\\x4d\\x6f\\x51'+'\\x41'](fanqieAesExpandKey,ﾕリ,ﾂネ);continue;case'\\x33':for(ぇァ=-0x1*-0x21a3+0x351*-0x2+-0x1b01;ｻヲ['\\x70\\x43\\x77\\x4c'+'\\x42'](ぇァ,ぢﾜ['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68']);ぇァ+=0xe9c+0x4f4*0x1+0x3*-0x680){var ﾜハ=ｻヲ['\\x63\\x6f\\x42\\x69'+'\\x52']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),ｱの=-0x445*0x6+0x75*0xb+0x7*0x2f1;while(!![]){switch(ﾜハ[ｱの++]){case'\\x30':for(ピﾍ=-0x9*-0x1d+-0x21d*0xb+-0x239*-0xa;ｻヲ['\\x70\\x43\\x77\\x4c'+'\\x42'](ピﾍ,-0x2496+-0x1937+-0x1*-0x3ddd);ピﾍ++)ソぽ+=String['\\x66\\x72\\x6f\\x6d'+'\\x43\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'](ｻヲ['\\x6e\\x4f\\x72\\x49'+'\\x42'](ｻヲ['\\x4b\\x6e\\x44\\x77'+'\\x6a'](ノげ['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](ピﾍ),ねミ['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](ピﾍ)),-0x3*-0x614+-0x1*-0x21b3+-0x32f0));continue;case'\\x31':ソぽ='';continue;case'\\x32':ﾐノ+=ねミ;continue;case'\\x33':ノげ=ぢﾜ['\\x73\\x75\\x62\\x73'+'\\x74\\x72\\x69\\x6e'+'\\x67'](ぇァ,ｻヲ['\\x4a\\x4c\\x78\\x52'+'\\x75'](ぇァ,-0x1a1*0x11+0x728+-0x1499*-0x1));continue;case'\\x34':ねミ=ｻヲ['\\x42\\x6d\\x67\\x70'+'\\x43'](fanqieAesEncryptBlock,ソぽ,テゥ,ﾂネ);continue;}break;}}continue;case'\\x34':return ﾐノ;case'\\x35':var ぢﾜ=マれ?ネﾔ:ｻヲ['\\x6c\\x4d\\x66\\x61'+'\\x56'](fanqiePad,ネﾔ,0x3f2+0xa*-0x284+-0x30a*-0x7);continue;case'\\x36':var ノげ;continue;case'\\x37':var ピﾍ;continue;case'\\x38':var ねミ=にば;continue;case'\\x39':var ﾐノ='';continue;case'\\x31\\x30':var ソぽ;continue;}break;}}function fanqieArgus(レゼ,ぎぺ,れち){var ゲね={'\\x53\\x78\\x4b\\x6f\\x44':'\\x31\\x32\\x7c\\x32'+'\\x30\\x7c\\x36\\x7c'+'\\x38\\x7c\\x39\\x7c'+'\\x37\\x7c\\x31\\x37'+'\\x7c\\x31\\x30\\x7c'+'\\x33\\x7c\\x31\\x34'+'\\x7c\\x35\\x7c\\x31'+'\\x35\\x7c\\x31\\x33'+'\\x7c\\x31\\x39\\x7c'+'\\x31\\x31\\x7c\\x31'+'\\x38\\x7c\\x30\\x7c'+'\\x34\\x7c\\x31\\x36'+'\\x7c\\x32\\x7c\\x31','\\x78\\x43\\x68\\x59\\x64':function(ﾉシ,ﾊム){return ﾉシ+ﾊム;},'\\x70\\x7a\\x6b\\x4e\\x47':'\\u00f2\\u00f7\\u00fc\\u00ff'+'\\u00f2\\u00f7\\u00fc\\u00ff','\\x51\\x55\\x73\\x5a\\x6d':function(ｵさ,ｩテ){return ｵさ(ｩテ);},'\\x4c\\x56\\x4e\\x72\\x61':function(びも,テや){return びも+テや;},'\\x6d\\x73\\x62\\x48\\x76':function(っャ,いェ,げヶ,バね,ドぶ){return っャ(いェ,げヶ,バね,ドぶ);},'\\x6c\\x61\\x43\\x68\\x6a':function(ﾅぴ,ウブ,ﾏｶ){return ﾅぴ(ウブ,ﾏｶ);},'\\x4d\\x79\\x53\\x7a\\x4f':function(どゾ,ゃる){return どゾ+ゃる;},'\\x59\\x78\\x57\\x77\\x6c':function(ボょ,ﾛウ){return ボょ+ﾛウ;},'\\x67\\x75\\x52\\x68\\x4a':'\\u00a6\\x6e\\u00ad\\u009f'+'\\x77\\x01\\u00d0\\x0c'+'\\x18','\\x67\\x4e\\x74\\x45\\x54':'\\x66\\x63\\x37\\x38'+'\\x65\\x30\\x61\\x39'+'\\x36\\x35\\x37\\x61'+'\\x30\\x63\\x37\\x34'+'\\x38\\x63\\x65\\x35'+'\\x31\\x35\\x35\\x39'+'\\x39\\x30\\x33\\x63'+'\\x63\\x66\\x30\\x33'+'\\x35\\x31\\x30\\x65'+'\\x35\\x31\\x64\\x33'+'\\x63\\x66\\x66\\x32'+'\\x33\\x32\\x64\\x37'+'\\x31\\x33\\x34\\x33'+'\\x65\\x38\\x38\\x61'+'\\x33\\x32\\x31\\x63'+'\\x35\\x33\\x30\\x34','\\x54\\x6a\\x47\\x64\\x67':function(うぉ,やｼ){return うぉ<やｼ;},'\\x51\\x6d\\x73\\x7a\\x41':function(ぉま,ウグ){return ぉま*ウグ;},'\\x63\\x54\\x44\\x42\\x55':function(ごビ,ニェ,ろﾖ){return ごビ(ニェ,ろﾖ);},'\\x74\\x4b\\x5a\\x45\\x58':function(ゐヨ,ズよ,ぽﾕ,ぐｼ){return ゐヨ(ズよ,ぽﾕ,ぐｼ);},'\\x48\\x43\\x72\\x6d\\x53':function(ペら,ビヲ){return ペら(ビヲ);},'\\x47\\x49\\x4e\\x77\\x48':function(っづ,ゲア){return っづ(ゲア);},'\\x6a\\x46\\x79\\x4b\\x4f':function(ョス,アす){return ョス^アす;},'\\x46\\x42\\x73\\x56\\x67':function(チぺ,ルチ){return チぺ%ルチ;},'\\x66\\x4a\\x6d\\x6f\\x71':function(ヅし,ﾉり){return ヅし+ﾉり;},'\\x71\\x45\\x49\\x6a\\x6d':function(ネメ,らケ){return ネメ&らケ;},'\\x72\\x59\\x68\\x5a\\x79':function(げだ,ャｲ){return げだ(ャｲ);}},ぁホ=ゲね['\\x53\\x78\\x4b\\x6f'+'\\x44']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),バﾊ=-0x1d2a+-0x1f47*-0x1+-0x1*0x21d;while(!![]){switch(ぁホ[バﾊ++]){case'\\x30':めド=ゲね['\\x78\\x43\\x68\\x59'+'\\x64'](ゲね['\\x70\\x7a\\x6b\\x4e'+'\\x47'],せギ);continue;case'\\x31':return ゲね['\\x51\\x55\\x73\\x5a'+'\\x6d'](fanqieBase64Encode,ゲね['\\x4c\\x56\\x4e\\x72'+'\\x61']('\\u00f2\\u0081',ゲね['\\x6d\\x73\\x62\\x48'+'\\x76'](fanqieAesCbcEncrypt,ゲね['\\x6c\\x61\\x43\\x68'+'\\x6a'](fanqiePad,ばき,0x88+-0x1153*0x2+-0x15e*-0x19),ユよ,ニウ,!![])));case'\\x32':ばき=ゲね['\\x4d\\x79\\x53\\x7a'+'\\x4f'](ゲね['\\x59\\x78\\x57\\x77'+'\\x6c'](ゲね['\\x67\\x75\\x52\\x68'+'\\x4a'],ゲね['\\x51\\x55\\x73\\x5a'+'\\x6d'](fanqieReverseBytes,めド)),'\\x61\\x6f');continue;case'\\x33':var ばき;continue;case'\\x34':ぁぁ=めド['\\x73\\x75\\x62\\x73'+'\\x74\\x72\\x69\\x6e'+'\\x67'](0x22*-0x11a+0x17e4+0xd90,-0x2*-0xeae+0x8d*0x35+0xd3*-0x47);continue;case'\\x35':var ペﾎ=ゲね['\\x51\\x55\\x73\\x5a'+'\\x6d'](fanqieHex2bin,ゲね['\\x67\\x4e\\x74\\x45'+'\\x54']);continue;case'\\x36':var ぞせ;continue;case'\\x37':var ぁぁ;continue;case'\\x38':var せギ='';continue;case'\\x39':var めド;continue;case'\\x31\\x30':var せェ;continue;case'\\x31\\x31':for(ﾇぎ=0x124a+0x5*-0x427+0x1*0x279;ゲね['\\x54\\x6a\\x47\\x64'+'\\x67'](ﾇぎ,0x1827+0x21fd+-0x3a20);ﾇぎ++)ﾐﾋ[ﾇぎ]=ゲね['\\x51\\x55\\x73\\x5a'+'\\x6d'](fanqieLoadLe64,ペﾎ['\\x73\\x75\\x62\\x73'+'\\x74\\x72\\x69\\x6e'+'\\x67'](ゲね['\\x51\\x6d\\x73\\x7a'+'\\x41'](ﾇぎ,0x10a7+0x1972+-0x2a11),ゲね['\\x4d\\x79\\x53\\x7a'+'\\x4f'](ゲね['\\x51\\x6d\\x73\\x7a'+'\\x41'](ﾇぎ,-0xbf9+-0x2472+0x3073),0xbf*0xa+-0x234f*-0x1+-0x2abd)));continue;case'\\x31\\x32':var くず=ゲね['\\x63\\x54\\x44\\x42'+'\\x55'](fanqiePad,ゲね['\\x74\\x4b\\x5a\\x45'+'\\x58'](fanqieBuildArgus,レゼ,ぎぺ,れち),-0x1*0x1fc3+-0x1be1+-0x1dda*-0x2);continue;case'\\x31\\x33':var ユよ=ゲね['\\x48\\x43\\x72\\x6d'+'\\x53'](fanqieMd5Raw,グオ['\\x73\\x75\\x62\\x73'+'\\x74\\x72\\x69\\x6e'+'\\x67'](0x96f+0x2177+-0x2ae6,0x1*0x1b91+0x1a9f+-0x3620));continue;case'\\x31\\x34':var ﾐﾋ=[];continue;case'\\x31\\x35':var グオ=ゲね['\\x47\\x49\\x4e\\x77'+'\\x48'](String,ドズ);continue;case'\\x31\\x36':for(ﾇぎ=-0x19e8+0x715+-0x649*-0x3;ゲね['\\x54\\x6a\\x47\\x64'+'\\x67'](ﾇぎ,めド['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68']);ﾇぎ++){せェ=ゲね['\\x6a\\x46\\x79\\x4b'+'\\x4f'](めド['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](ﾇぎ),ぁぁ['\\x63\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'+'\\x41\\x74'](ゲね['\\x46\\x42\\x73\\x56'+'\\x67'](ﾇぎ,-0x3*0x202+0x14*0xa0+-0x672))),めド=ゲね['\\x4d\\x79\\x53\\x7a'+'\\x4f'](ゲね['\\x66\\x4a\\x6d\\x6f'+'\\x71'](めド['\\x73\\x75\\x62\\x73'+'\\x74\\x72\\x69\\x6e'+'\\x67'](0x1b7e+-0x1c34+0xb6,ﾇぎ),String['\\x66\\x72\\x6f\\x6d'+'\\x43\\x68\\x61\\x72'+'\\x43\\x6f\\x64\\x65'](ゲね['\\x71\\x45\\x49\\x6a'+'\\x6d'](せェ,-0x1*0x1afc+0x4b*-0x61+0x3866))),めド['\\x73\\x75\\x62\\x73'+'\\x74\\x72\\x69\\x6e'+'\\x67'](ゲね['\\x78\\x43\\x68\\x59'+'\\x64'](ﾇぎ,-0xed5+0x25c1+-0x16eb*0x1)));}continue;case'\\x31\\x37':var ﾇぎ;continue;case'\\x31\\x38':for(ぞせ=-0xe35+0x81*0x1b+0xe*0xb;ゲね['\\x54\\x6a\\x47\\x64'+'\\x67'](ぞせ,くず['\\x6c\\x65\\x6e\\x67'+'\\x74\\x68']);ぞせ+=-0xe*-0x8e+-0x1*0xec5+-0x9*-0xc9)せギ+=ゲね['\\x6c\\x61\\x43\\x68'+'\\x6a'](fanqieSeb,くず['\\x73\\x75\\x62\\x73'+'\\x74\\x72\\x69\\x6e'+'\\x67'](ぞせ,ゲね['\\x66\\x4a\\x6d\\x6f'+'\\x71'](ぞせ,-0xb*-0xed+0x1555*-0x1+0xb36)),ﾐﾋ);continue;case'\\x31\\x39':var ニウ=ゲね['\\x72\\x59\\x68\\x5a'+'\\x79'](fanqieMd5Raw,グオ['\\x73\\x75\\x62\\x73'+'\\x74\\x72\\x69\\x6e'+'\\x67'](0x1952+-0x837+-0x110b*0x1,0x1d9e+0x1c4e*-0x1+-0x130));continue;case'\\x32\\x30':var ょﾌ=[];continue;}break;}}function fanqieBuildHeaders(くﾄ,ダめ,ユビ){var タぼ={'\\x66\\x59\\x44\\x6f\\x57':'\\x31\\x35\\x7c\\x32'+'\\x30\\x7c\\x31\\x38'+'\\x7c\\x31\\x30\\x7c'+'\\x33\\x7c\\x30\\x7c'+'\\x38\\x7c\\x35\\x7c'+'\\x31\\x39\\x7c\\x37'+'\\x7c\\x31\\x34\\x7c'+'\\x36\\x7c\\x32\\x31'+'\\x7c\\x31\\x7c\\x31'+'\\x33\\x7c\\x31\\x31'+'\\x7c\\x32\\x7c\\x39'+'\\x7c\\x31\\x37\\x7c'+'\\x31\\x36\\x7c\\x31'+'\\x32\\x7c\\x34','\\x62\\x51\\x67\\x47\\x44':function(ェジ,ﾖゥ){return ェジ!==ﾖゥ;},'\\x46\\x42\\x62\\x69\\x4c':function(ﾍか,ぬミ){return ﾍか(ぬミ);},'\\x74\\x6b\\x44\\x4b\\x68':function(ヮし,ｬデ){return ヮし!==ｬデ;},'\\x55\\x71\\x47\\x58\\x59':function(モィ,がど){return モィ===がど;},'\\x77\\x73\\x62\\x6c\\x73':function(ゃト,へゼ){return ゃト(へゼ);},'\\x63\\x43\\x4d\\x67\\x4e':function(もま,ヰゲ){return もま===ヰゲ;},'\\x66\\x64\\x4d\\x4e\\x72':function(ﾊキ,づば,てン,ッゥ){return ﾊキ(づば,てン,ッゥ);},'\\x70\\x41\\x4e\\x4e\\x4d':function(ミチ,ﾘへ){return ミチ!==ﾘへ;},'\\x54\\x74\\x70\\x52\\x45':function(ンぼ,くセ){return ンぼ(くセ);},'\\x6b\\x4c\\x54\\x56\\x6c':function(ﾖﾌ,ﾌｱ){return ﾖﾌ/ﾌｱ;},'\\x6e\\x59\\x59\\x44\\x74':function(ｸヶ,ｳぶ){return ｸヶ!==ｳぶ;},'\\x6e\\x4a\\x51\\x68\\x44':'\\x78\\x2d\\x73\\x73'+'\\x2d\\x73\\x74\\x75'+'\\x62','\\x44\\x56\\x6f\\x72\\x61':function(おじ,じゆ){return おじ(じゆ);},'\\x65\\x48\\x50\\x75\\x74':'\\x61\\x70\\x70\\x6c'+'\\x69\\x63\\x61\\x74'+'\\x69\\x6f\\x6e\\x2f'+'\\x6a\\x73\\x6f\\x6e'+'\\x3b\\x20\\x63\\x68'+'\\x61\\x72\\x73\\x65'+'\\x74\\x3d\\x75\\x74'+'\\x66\\x2d\\x38','\\x70\\x46\\x51\\x69\\x69':function(アぽ,だヱ){return アぽ!==だヱ;},'\\x6b\\x76\\x67\\x6b\\x51':function(ｼむ,ｷノ){return ｼむ(ｷノ);},'\\x79\\x76\\x4d\\x58\\x64':function(にﾖ,ﾝの,クロ,ッﾈ){return にﾖ(ﾝの,クロ,ッﾈ);},'\\x78\\x69\\x51\\x61\\x68':function(ッｻ,ﾃす){return ッｻ(ﾃす);},'\\x62\\x53\\x72\\x5a\\x6c':function(ゾｮ,ｱホ){return ゾｮ(ｱホ);},'\\x50\\x65\\x49\\x6f\\x50':function(ろみ,ヷﾙ){return ろみ(ヷﾙ);},'\\x68\\x76\\x56\\x53\\x42':function(ヘる,ヰっ){return ヘる(ヰっ);},'\\x51\\x6d\\x51\\x67\\x57':function(グイ,ｴｬ){return グイ<ｴｬ;},'\\x6a\\x6f\\x63\\x4c\\x52':function(メめ,べパ){return メめ+べパ;}},ﾋど=タぼ['\\x66\\x59\\x44\\x6f'+'\\x57']['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x7c'),ォﾙ=0x1321+-0x1*0x182f+0x50e;while(!![]){switch(ﾋど[ォﾙ++]){case'\\x30':var ヹプ={};continue;case'\\x31':var ﾆﾚ;continue;case'\\x32':ヹプ['\\x62\\x6f\\x64\\x79'+'\\x5f\\x73\\x74\\x75'+'\\x62']=ﾆズ;continue;case'\\x33':var ヮプ=タぼ['\\x62\\x51\\x67\\x47'+'\\x44'](ユビ['\\x61\\x69\\x64'],undefined)?タぼ['\\x46\\x42\\x62\\x69'+'\\x4c'](fanqieInt,ユビ['\\x61\\x69\\x64']):タぼ['\\x74\\x6b\\x44\\x4b'+'\\x68'](ｲす['\\x61\\x69\\x64'],undefined)?タぼ['\\x46\\x42\\x62\\x69'+'\\x4c'](fanqieInt,ｲす['\\x61\\x69\\x64']):0x395*-0x1+-0x1*0x12af+0x11*0x1c3;continue;case'\\x34':return ぐツ;case'\\x35':var ﾆズ=タぼ['\\x55\\x71\\x47\\x58'+'\\x59'](ﾒザ,null)?'':タぼ['\\x46\\x42\\x62\\x69'+'\\x4c'](fanqieMd5Hex,ﾒザ);continue;case'\\x36':var その;continue;case'\\x37':var ブブ=タぼ['\\x74\\x6b\\x44\\x4b'+'\\x68'](ユビ['\\x68\\x65\\x6c\\x69'+'\\x6f\\x73\\x5f\\x72'+'\\x61\\x6e\\x64\\x6f'+'\\x6d\\x5f\\x68\\x65'+'\\x78'],undefined)?タぼ['\\x77\\x73\\x62\\x6c'+'\\x73'](fanqieHex2bin,タぼ['\\x46\\x42\\x62\\x69'+'\\x4c'](String,ユビ['\\x68\\x65\\x6c\\x69'+'\\x6f\\x73\\x5f\\x72'+'\\x61\\x6e\\x64\\x6f'+'\\x6d\\x5f\\x68\\x65'+'\\x78'])):null;continue;case'\\x38':var ﾒザ=タぼ['\\x63\\x43\\x4d\\x67'+'\\x4e'](ダめ,null)||タぼ['\\x63\\x43\\x4d\\x67'+'\\x4e'](ダめ,undefined)?null:タぼ['\\x46\\x42\\x62\\x69'+'\\x4c'](fanqieUtf8,タぼ['\\x46\\x42\\x62\\x69'+'\\x4c'](String,ダめ));continue;case'\\x39':よょ=タぼ['\\x66\\x64\\x4d\\x4e'+'\\x72'](fanqieArgus,ﾋつ,うも,ヹプ);continue;case'\\x31\\x30':var うも=タぼ['\\x70\\x41\\x4e\\x4e'+'\\x4d'](ユビ['\\x6b\\x68\\x72\\x6f'+'\\x6e\\x6f\\x73'],undefined)?タぼ['\\x54\\x74\\x70\\x52'+'\\x45'](fanqieInt,ユビ['\\x6b\\x68\\x72\\x6f'+'\\x6e\\x6f\\x73']):Math['\\x66\\x6c\\x6f\\x6f'+'\\x72'](タぼ['\\x6b\\x4c\\x54\\x56'+'\\x6c'](new Date()['\\x67\\x65\\x74\\x54'+'\\x69\\x6d\\x65'](),0x25d4+0x17d+-0x2369));continue;case'\\x31\\x31':ヹプ['\\x61\\x69\\x64']=ヮプ;continue;case'\\x31\\x32':if(タぼ['\\x6e\\x59\\x59\\x44'+'\\x74'](ﾒザ,null))ぐツ[タぼ['\\x6e\\x4a\\x51\\x68'+'\\x44']]=タぼ['\\x77\\x73\\x62\\x6c'+'\\x73'](fanqieMd5Hex,ﾒザ)['\\x74\\x6f\\x55\\x70'+'\\x70\\x65\\x72\\x43'+'\\x61\\x73\\x65']();continue;case'\\x31\\x33':for(ﾆﾚ in ユビ)if(ユビ['\\x68\\x61\\x73\\x4f'+'\\x77\\x6e\\x50\\x72'+'\\x6f\\x70\\x65\\x72'+'\\x74\\x79'](ﾆﾚ))ヹプ[ﾆﾚ]=ユビ[ﾆﾚ];continue;case'\\x31\\x34':var よょ;continue;case'\\x31\\x35':くﾄ=タぼ['\\x44\\x56\\x6f\\x72'+'\\x61'](String,くﾄ);continue;case'\\x31\\x36':ぐツ={'\\x61\\x63\\x63\\x65\\x70\\x74':タぼ['\\x65\\x48\\x50\\x75'+'\\x74'],'\\x55\\x73\\x65\\x72\\x2d\\x41\\x67\\x65\\x6e\\x74':タぼ['\\x70\\x46\\x51\\x69'+'\\x69'](ユビ['\\x75\\x73\\x65\\x72'+'\\x5f\\x61\\x67\\x65'+'\\x6e\\x74'],undefined)?タぼ['\\x6b\\x76\\x67\\x6b'+'\\x51'](String,ユビ['\\x75\\x73\\x65\\x72'+'\\x5f\\x61\\x67\\x65'+'\\x6e\\x74']):ﾔｩ,'\\x78\\x2d\\x6b\\x68\\x72\\x6f\\x6e\\x6f\\x73':タぼ['\\x77\\x73\\x62\\x6c'+'\\x73'](String,うも),'\\x78\\x2d\\x61\\x72\\x67\\x75\\x73':よょ,'\\x78\\x2d\\x6c\\x61\\x64\\x6f\\x6e':タぼ['\\x66\\x64\\x4d\\x4e'+'\\x72'](fanqieLs,うも,おゲ,ヮプ),'\\x78\\x2d\\x68\\x65\\x6c\\x69\\x6f\\x73':タぼ['\\x79\\x76\\x4d\\x58'+'\\x64'](fanqieLs,うも,ブブ,ヮプ),'\\x78\\x2d\\x73\\x73\\x2d\\x72\\x65\\x71\\x2d\\x74\\x69\\x63\\x6b\\x65\\x74':タぼ['\\x78\\x69\\x51\\x61'+'\\x68'](String,その)};continue;case'\\x31\\x37':その=タぼ['\\x70\\x41\\x4e\\x4e'+'\\x4d'](ユビ['\\x73\\x73\\x5f\\x72'+'\\x65\\x71\\x5f\\x74'+'\\x69\\x63\\x6b\\x65'+'\\x74'],undefined)?タぼ['\\x77\\x73\\x62\\x6c'+'\\x73'](fanqieInt,ユビ['\\x73\\x73\\x5f\\x72'+'\\x65\\x71\\x5f\\x74'+'\\x69\\x63\\x6b\\x65'+'\\x74']):new Date()['\\x67\\x65\\x74\\x54'+'\\x69\\x6d\\x65']();continue;case'\\x31\\x38':var ｲす=タぼ['\\x62\\x53\\x72\\x5a'+'\\x6c'](fanqieParseQuery,ﾋつ);continue;case'\\x31\\x39':var おゲ=タぼ['\\x74\\x6b\\x44\\x4b'+'\\x68'](ユビ['\\x6c\\x61\\x64\\x6f'+'\\x6e\\x5f\\x72\\x61'+'\\x6e\\x64\\x6f\\x6d'+'\\x5f\\x68\\x65\\x78'],undefined)?タぼ['\\x50\\x65\\x49\\x6f'+'\\x50'](fanqieHex2bin,タぼ['\\x68\\x76\\x56\\x53'+'\\x42'](String,ユビ['\\x6c\\x61\\x64\\x6f'+'\\x6e\\x5f\\x72\\x61'+'\\x6e\\x64\\x6f\\x6d'+'\\x5f\\x68\\x65\\x78'])):null;continue;case'\\x32\\x30':var ﾋつ=タぼ['\\x51\\x6d\\x51\\x67'+'\\x57'](くﾄ['\\x69\\x6e\\x64\\x65'+'\\x78\\x4f\\x66']('\\x3f'),-0x47*-0x2c+-0x693*0x1+-0x5a1)?'':くﾄ['\\x73\\x75\\x62\\x73'+'\\x74\\x72\\x69\\x6e'+'\\x67'](タぼ['\\x6a\\x6f\\x63\\x4c'+'\\x52'](くﾄ['\\x69\\x6e\\x64\\x65'+'\\x78\\x4f\\x66']('\\x3f'),0x183d+-0xf65+-0x8d7))['\\x73\\x70\\x6c\\x69'+'\\x74']('\\x23')[0x1377*-0x2+-0x16a1*-0x1+-0x3*-0x56f];continue;case'\\x32\\x31':var ぐツ;continue;}break;}}function fanqieSignHeaders(ﾏい,モァ,はつ){var あう={'\\x41\\x50\\x51\\x63\\x7a':function(げせ,けシ,ｵれ,ヨヤ){return げせ(けシ,ｵれ,ヨヤ);},'\\x48\\x51\\x70\\x57\\x5a':function(ゴェ,ゖゐ){return ゴェ===ゖゐ;}};if(!はつ)はつ={};return あう['\\x41\\x50\\x51\\x63'+'\\x7a'](fanqieBuildHeaders,ﾏい,あう['\\x48\\x51\\x70\\x57'+'\\x5a'](モァ,undefined)?null:モァ,はつ);}", "lastUpdateTime": "1787274713125"},{"bookSourceComment": "// 免翻稳定，部分小说内容需登录，推荐登录使用\n\n// 国内发布页：https://www.asw2.cc/\n// 主站：https://www.alicesw.com/\n\n// 全局调用源注释文本代码\n// eval(String(source.bookSourceComment))", "bookSourceGroup": "R18", "bookSourceName": "【自制】🌸爱丽丝书屋🌸", "bookSourceType": 0, "bookSourceUrl": "https://xn--vcsx64d.alicesw12.xyz/", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[\n    {\n        \"title\": \"🔖全局🔖\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"title\": \"原创\",\n        \"url\": \"{{source.bookSourceUrl}}original.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/order/update_time+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"🔖分类🔖\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"title\": \"科幻\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/71/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/71/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/71/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"经典\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/79/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/79/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/79/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"奇幻\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/75/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/75/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/75/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"系统\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/69/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/69/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/69/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"武侠\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/68/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/68/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/68/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"乱伦\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/65/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/65/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/65/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"都市\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/64/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/64/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/64/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"乡村\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/63/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/63/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/63/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"同人\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/73/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/73/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/73/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"玄幻\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/62/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/62/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/62/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"校园\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/61/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/61/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/61/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"穿越\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/70/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/70/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/70/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"纯爱\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/19/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/19/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/19/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"萝莉\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/48/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/48/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/48/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"言情\",\n        \"url\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"时间\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/59/order/update_time+desc?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"字数\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/59/order/word+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"title\": \"人气\",\n        \"url\": \"{{source.bookSourceUrl}}all/id/59/order/hits+desc.html?page={{page}}\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    }\n]", "header": "Mozilla/5.0 (Linux; Android 15; 23049RAD8C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.7922.83 Mobile Safari/537.36", "lastUpdateTime": 1787244084892, "loginUrl": "{{source.bookSourceUrl}}user/user/login.html", "respondTime": 180000, "ruleBookInfo": {"author": "//div[@class='box_info']/div[@class='novel_info']/p[1]/a/text()", "coverUrl": "@js:\nvar cover = java.getString(\"//div[@class='box_intro']/div[@class='pic']/img/@src\", true);\nif(cover && /img\\/\\d+\\.webp/.test(cover)){cover = \"https://img.321cdn.com/img/01.png\"}\ncover", "intro": "@js:\nvar info = java.getString(\"//div[@class='box_info']/div[@class='novel_info']//p[not(.//a)]//text()\");\nvar intro = java.getString(\"//div[@class='jianjie']/p/text()\");\nintro+\"\\n◤-----------------------------------------------------------------◥\\n\"+info+\"\\n◣-----------------------------------------------------------------◢\\n\"", "kind": "//div[@class='box_info']/div[@class='tags_list']/a/text()", "lastChapter": "//div[@class='box_info']/table/tbody/tr[1]/td/div/p[1]/a[2]/text()", "name": "//div[@class='box_info']/div[@class='novel_title']/text()", "tocUrl": "//div[@class='book_newchap']//a[contains(text(),'查看所有章')]/@href", "wordCount": "//div[@class='box_info']/div[@class='novel_info']/p[4]/text()@js:\nlet txt = result.split(\"\\n\").join(\"\");\ntxt = txt.replace(/[\\n\\s　]/g, \"\");\nlet m = txt.match(/\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)?/);\nlet num = m ? parseFloat(m[0].replace(/,/g, \"\")) : 0;\nnum + \"万\""}, "ruleContent": {"content": "//div[contains(@class,'read-content')]/p/text()@js: (function() { let raw = (typeof result !== 'undefined') ? result : (typeof value !== 'undefined' ? value : ''); let text = Array.isArray(raw) ? raw.join('') : String(raw || ''); return text.trim() || '章节无内容'; })()", "title": "//div[@class='text-head']/h3/text()"}, "ruleExplore": {"author": "//li[@class='four']/text()", "bookList": "//div[@class='clearfix rec_rullist']/ul", "bookUrl": "//li[@class='two']/a/@href", "kind": "@js:\nvar tag  = java.getString(\"//li[@class='sev']/span/a/text()\");\nvar uptime  = java.getString(\"//li[@class='six']/text()\");\nvar views=  java.getString(\"//li[@class='diyhot']/text()\");\ntag+\",👀\"+views+\",\"+uptime", "lastChapter": "//li[@class='three']/a/text()", "name": "//li[@class='two']/a/text()", "wordCount": "//li[@class='five']/text()@js:\nlet txt = result.split(\"\\n\").join(\"\");\ntxt = txt.replace(/[\\n\\s　]/g, \"\");\nlet m = txt.match(/\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)?/);\nlet num = m ? parseFloat(m[0].replace(/,/g, \"\")) : 0;\nnum + \"万\""}, "ruleSearch": {"author": "//p[@class='mb-1 text-muted']/a/text()", "bookList": "//div[@class='list-group']/div[@class='list-group-item']", "bookUrl": "//h5/a/@href", "checkKeyWord": "美母为妻", "intro": "//p[@class='content-txt']", "kind": "<js>\nvar status = java.getString(\"//h5/small/text()\");\nvar tags = java.getString(\"//p[@class='text-muted']/a/text()\");\nvar views = java.getString(\"//p[@class='mb-1 text-muted']//text()\").match(/\\d+?.\\d+/g)[1];\nstatus+\",👀\"+views+\",\"+tags\n</js>\n##\\[|]##", "name": "//h5/a//text()", "wordCount": "//p[1]/text()@js:\nlet txt = result.split(\"\\n\").join(\"\");\ntxt = txt.replace(/[\\n\\s　]/g, \"\");\nlet m = txt.match(/\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)?/);\nlet num = m ? parseFloat(m[0].replace(/,/g, \"\")) : 0;\nnum + \"万\""}, "ruleToc": {"chapterList": "//ul[@class='mulu_list']/li", "chapterName": "//a/text()", "chapterUrl": "//a/@href()"}, "searchUrl": "{{source.bookSourceUrl}}search.html?q={{key}}&f=_all", "weight": 0},{"bookSourceComment": "by艳阳\n我们永远年轻,我们永远向前", "bookSourceGroup": "通常书源", "bookSourceName": "速读谷²", "bookSourceType": 0, "bookSourceUrl": "https://www.shudugu.org", "bookUrlPattern": "https?://www\\.shudugu\\.org/\\d+(/.*)?", "customButton": false, "customOrder": 3, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "完结小说::/wanjie/{{page == 1 ? \"\" : page + \".html\"}}\n都市小说::/dushi/{{page == 1 ? \"\" : page + \".html\"}}\n玄幻小说::/xuanhuan/{{page == 1 ? \"\" : page + \".html\"}}\n轻小说::/qing/{{page == 1 ? \"\" : page + \".html\"}}\n仙侠小说::/xianxia/{{page == 1 ? \"\" : page + \".html\"}}\n历史小说::/lishi/{{page == 1 ? \"\" : page + \".html\"}}\n科幻小说::/kehuan/{{page == 1 ? \"\" : page + \".html\"}}\n诸天无限::/zhutianwuxian/{{page == 1 ? \"\" : page + \".html\"}}\n游戏小说::/youxi/{{page == 1 ? \"\" : page + \".html\"}}\n奇幻小说::/qihuan/{{page == 1 ? \"\" : page + \".html\"}}\n悬疑小说::/xuanyi/{{page == 1 ? \"\" : page + \".html\"}}\n体育小说::/tiyu/{{page == 1 ? \"\" : page + \".html\"}}\n官场小说::/guanchang/{{page == 1 ? \"\" : page + \".html\"}}\n军事小说::/junshi/{{page == 1 ? \"\" : page + \".html\"}}\n武侠小说::/wuxia/{{page == 1 ? \"\" : page + \".html\"}}\n乡村小说::/xiangcun/{{page == 1 ? \"\" : page + \".html\"}}\n现实小说::/xianshi/{{page == 1 ? \"\" : page + \".html\"}}\n言情小说::/yanqing/{{page == 1 ? \"\" : page + \".html\"}}\n最新更新::/zuixin/{{page == 1 ? \"\" : page + \".html\"}}", "header": "{\"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\"}", "lastUpdateTime": "1787244087335", "loginUrl": "", "respondTime": 180000, "ruleBookInfo": {"author": "@css:.itemtxt p:eq(1) a@text##作者：", "coverUrl": "@css:.item a img@src", "intro": "class.des.0@text", "kind": "@css:.itemtxt p:eq(0) span:eq(1)@text", "lastChapter": "@css:.itemtxt ul li:eq(0) a@text", "name": "@css:.itemtxt h1 a@text", "tocUrl": "", "wordCount": "@css:.itemtxt h1 i@text"}, "ruleContent": {"content": "@css:.con p@text", "nextContentUrl": "@css:.prenext span:eq(2) a@href", "sourceRegex": "", "webJs": ""}, "ruleExplore": {"author": "@css:.itemtxt p:eq(1) a@text##作者：", "bookList": "@css:.item", "bookUrl": "@css:.itemtxt h3 a@href", "coverUrl": "@css:.item a img@src", "intro": "", "kind": "p@span@text", "lastChapter": "@css:.itemtxt ul li:eq(0) a@text", "name": "@css:.itemtxt h3 a@text"}, "ruleSearch": {"author": "@css:.itemtxt p:eq(1) a@text##作者：", "bookList": "@css:.item", "bookUrl": "@css:.itemtxt h3 a@href", "checkKeyWord": "没钱修什么仙", "coverUrl": "@css:.item a img@src", "intro": "", "kind": "p@span@text", "lastChapter": "@css:.itemtxt ul li:eq(0) a@text", "name": "@css:.itemtxt h3 a@text", "wordCount": ""}, "ruleToc": {"chapterList": "@css:#list ul li", "chapterName": "@css:a@text", "chapterUrl": "@css:a@href", "isVip": "", "nextTocUrl": "@css:#pages a.gr@href", "updateTime": ""}, "searchUrl": "/i/sor.aspx?key={{key}}", "weight": 0},{"bookSourceComment": "", "bookSourceGroup": "", "bookSourceName": "🎉 聚合书库", "bookSourceType": 0, "bookSourceUrl": "https://book4.cc", "bookUrlPattern": "https?://book4.cc/AU文学/.{1,3}/\\d+/", "customOrder": 1060, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "@js:\nvar sort = [],\n    header = eval(getHeaders(source)),\n    src = java.connect(\n    \tbaseUrl, header).body(),\n    b = src.match(/(html_b|dstr)=\"(.*?)\"/);\nif (b) src = dec(b);\nvar doc = org.jsoup.Jsoup.parse(src),\n    a = doc.select(\"ul.nav.nav-pills li a\");\nfor (let i = 1; i < a.size(); i++) {\n    let fl = ({\n        \"title\": a[i].text(),\n        \"url\": `${a[i].attr(\"href\")}<,{{page}}>`,\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexShrink\": 1,\n            \"layout_alignSelf\": \"auto\",\n            \"layout_flexBasisPercent\": 0.2,\n            \"layout_wrapBefore\": false\n        }\n    });\n    sort.push(fl);\n}\n\nJSON.stringify(sort);", "header": "@js:\nJSON.stringify({\n\t\"Referer\": baseUrl + \"/\",\n\t\"X-Requested-With\": \"mark.via\",\n\t\"Accept-Language\": \"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7\",\n\t\"User-Agent\": java.getWebViewUA()\n\t});", "jsLib": "function as(input) {\n    var ts = this[\"\\x6a\\x61\\x76\\x61\"][\"\\x62\\x61\\x73\\x65\\x36\\x34\\x44\\x65\\x63\\x6f\\x64\\x65\"](input);\n    return ts;\n}\n\nfunction dec(a) {\n    var to = this.as(a[2]),\n        html = (a[1].includes(\"str\") ?\n        decodeURIComponent(to) : to);\n    return html;\n}\n\nfunction getHeaders(that) {\n    const source = (that || this.source);\n    var header = String(source.header);\n    if (/^.?js(:|>)/.test(header)) {\n        let h1 = header.split(\"js:\"),\n            h2 = header.split(\"js>\");\n        let head = (Array.isArray(h1) && h1[1]) || (Array.isArray(h2) && h2[1]);\n        return String(head.toString());\n    } else return header;\n}", "lastUpdateTime": "1787239843908", "loginCheckJs": "var url = result.url(), src = result.body(),\nb = src.match(/(html_b|dstr)=\"(.*?)\"/);\nif(b){\n\th = dec(b);\n\tresult = Packages.io.legado.app.help.http.StrResponse(url, h);\n\t}\nresult", "respondTime": 3667, "ruleBookInfo": {"author": "$.author", "coverUrl": "$.cover", "init": "<js>\nvar data = {}, n = 0, so = 1;\nvar v = book.getVariable(\"custom\"),\nb = result.match(/book=(\\{.*\\})/) || [];\ntry {\n    data = JSON.parse(b[1]);\n} catch (err) {\n    java.log(err)\n    data = eval(\"(\" + b[1] + \")\");\n}\nvar img = java.getString(\n\t\".book-img img@src\", result);\nlet origin = data[\"同书名作者其他阅读源\"];\n//java.log(JSON.stringify(origin[0]))\nif (v != \"\") {\n    so = n;\n    n = Number(v) - 1;\n}\n\nlet obj = origin[n],\ninfo = `<br>当前源：【${so}】状态：${obj.isok ? \"可用\" : \"异常\"}\n最新章节：${obj.last_chapter_name}\n更新时间：${obj.time_update}\n源列表（多个源可设置书籍变量更改接口）\\n` + origin.map((o, i) =>`源接口：〔${i + 1}〕状态：${o.isok ? \"可用\" : \"异常\"}\n\t最新章节：${o.last_chapter_name}\n\t更新时间：${o.time_update}`).join(\"\\n\");\nobj.intro = `${info} <br>本书《${book.name}》简介：\\n${obj.intro}`;\nlet load = result.match(/load_js\\('(.+?)'/);\n\t//java.log(load.toString());\n\tlet kind = `${obj.type_name},${obj.time_update}`, \n\tlast = `${obj.last_chapter_name}•${obj.time_update}`;\nobj.kind = kind; obj.last = last;\nobj.dir = ( (load && load[1]) || \"/show_jsload_book_info/\") + obj.book_yun_path;\nobj.cover = img;\nJSON.stringify(obj);\n</js>", "intro": "$.intro", "kind": "$.kind", "lastChapter": "$.last", "name": "$.book_name", "tocUrl": "$.dir"}, "ruleContent": {"content": "article > .entry-content > p@html\n##<p style.*|.*<a href.*"}, "ruleExplore": {"author": "p.author.0@text", "bookList": "<js>\nString(result).replace(/<!--|-->/g, \"\");\n</js>\n#main li", "bookUrl": "a.1@href", "coverUrl": "img@src", "intro": "p.-1@text##简介：", "kind": "p.author.1:3:4@text", "lastChapter": "a.-2@text", "name": "h3 a@text##《|》"}, "ruleSearch": {"author": "p.author.0@text", "bookList": "<js>\nString(result).replace(/<!--|-->/g, \"\");\n</js>\n#book_list li", "bookUrl": "a.1@href", "coverUrl": "img@src", "intro": "p.-1@html##简介：", "kind": "p.author.1:-2@text", "lastChapter": "a.-1@text", "name": "a.1@text##《|》"}, "ruleToc": {"chapterList": "@js:\nvar _ = JSON.parse(result).chapter_list;\nArray.from(_, ($) => ({\n    name: $.name,\n    link: book.bookUrl + $.file_name,\n    info: String(`${$.len}字`)\n}));", "chapterName": "name", "chapterUrl": "link", "preUpdateJs": "java.refreshTocUrl()", "updateTime": "info"}, "searchUrl": "https://book4.cc/AU文学/searchword?q={{key}}", "variableComment": "设置源变量更改接口", "weight": 0},{"bookSourceComment": "by艳阳，感叹:速读谷各种站真的是层出不穷啊", "bookSourceGroup": "通常书源", "bookSourceName": "速读谷", "bookSourceType": 0, "bookSourceUrl": "https://www.shudugu.org", "bookUrlPattern": "https?://www\\.shudugu\\.org/\\d+(/.*)?", "customOrder": 0, "enabled": true, "enabledExplore": true, "exploreUrl": "最新更新::/zuixin/\n完结小说::/wanjie/\n玄幻小说::/xuanhuan/\n仙侠小说::/xianxia/\n都市小说::/dushi/\n历史小说::/lishi/\n军事小说::/junshi/\n科幻小说::/kehuan/\n言情小说::/yanqing/", "header": "{\"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\"}", "lastUpdateTime": "1787210469858", "loginUrl": "", "ruleBookInfo": {"author": "@css:.itemtxt p:eq(1) a@text##作者：", "coverUrl": "@css:.item a img@src", "intro": "@css:.des@text", "kind": "@css:.itemtxt p:eq(0) span:eq(1)@text", "lastChapter": "@css:.itemtxt ul li:eq(0) a@text", "name": "@css:.itemtxt h1 a@text", "tocUrl": "", "wordCount": "@css:.itemtxt h1 i@text"}, "ruleContent": {"content": "@css:.con p@text", "nextContentUrl": "@css:.prenext span:eq(2) a@href", "sourceRegex": "", "webJs": ""}, "ruleExplore": {"author": "@css:.itemtxt p:eq(1) a@text##作者：", "bookList": "@css:.item", "bookUrl": "@css:.itemtxt h3 a@href", "coverUrl": "@css:.item a img@src", "intro": "", "kind": "@css:.itemtxt p:eq(0) span:eq(1)@text", "lastChapter": "@css:.itemtxt ul li:eq(0) a@text", "name": "@css:.itemtxt h3 a@text", "wordCount": ""}, "ruleSearch": {"author": "@css:.itemtxt p:eq(1) a@text##作者：", "bookList": "@css:.item", "bookUrl": "@css:.itemtxt h3 a@href", "coverUrl": "@css:.item a img@src", "intro": "", "kind": "@css:.itemtxt p:eq(0) span:eq(1)@text", "lastChapter": "@css:.itemtxt ul li:eq(0) a@text", "name": "@css:.itemtxt h3 a@text", "wordCount": ""}, "ruleToc": {"chapterList": "@css:#list ul li", "chapterName": "@css:a@text", "chapterUrl": "@css:a@href", "isVip": "", "nextTocUrl": "@css:#pages a.gr@href", "updateTime": ""}, "searchUrl": "/i/sor.aspx?key={{key}}", "weight": 0},{"bookSourceComment": "較前版加了搜索功能，目前只有比较热门的32本书，尤其是某個糖糖的書，不定期上新更新延迟5-7天。\n公益网站，可进论坛求书和交流輕小說，論壇頁：\nhttps://bbs.xiaoxiaoshuo8.com\n广而告之：推荐NNSSNE大佬的legado C分支企鹅群1101873338 ，進群給開發著大佬送溫暖（催更🤣）", "bookSourceName": "千白羽轻小说交流站", "bookSourceType": 0, "bookSourceUrl": "https://www.xiaoxiaoshuo8.com", "bookUrlPattern": "(https?://)?(www\\.)?xiaoxiaoshuo8\\.com", "customButton": false, "customOrder": 3, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\":\"全部小说\",\"url\":\"https://www.xiaoxiaoshuo8.com/xiaoshuodaquan/\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}}]", "lastUpdateTime": "1787194533463", "respondTime": 180000, "ruleBookInfo": {"author": "div#info > p.0@text", "intro": "div#intro > p@text", "kind": "div.con_top > a.1@text", "lastChapter": "div#list > dl > dd > a.0@text", "name": "div#info > h1@text", "wordCount": "<js>\nlet id = book.bookUrl.match(/_(\\d+)\\/?$/)[1];\nresult = java.ajax(\n\t `https://www.xiaoxiaoshuo8.com/modules/article/52mb_uptime.php?id=${id}&type=lastupdate`\n).match(/\\d{4}-\\d{2}-\\d{2}/)[0]+'更新';\n</js>"}, "ruleContent": {"content": "#content@html"}, "ruleExplore": {"bookList": "div#wrapper > div#main > div.novellist > ul > li", "bookUrl": "a@href", "coverUrl": "<js>var href = java.getString('a@href'); var p = href.lastIndexOf('/'); var id = href.substring(0,p); var q = id.lastIndexOf('_'); var a = id.substring(id.lastIndexOf('/')+1,q); var b = id.substring(q+1); result = 'https://www.xiaoxiaoshuo8.com/files/article/image/' + a + '/' + b + '/' + b + 's.jpg';</js>", "name": "a@text"}, "ruleSearch": {"author": ".author.0@text##.* | ", "bookList": "div.hot_sale", "bookUrl": "a@href", "coverUrl": "@js:\nvar url = \"{{@@.hot_sale a@href}}\"\nvar id = url.match(/\\d+/g)\nvar a=id[1]\nvar b = \"https://www.xiaoxiaoshuo8.com/files/article/image/\"\nvar coverUrl = b + \"0\" + \"/\" + a + \"/\" + a + \"s.jpg\"\njava.log(coverUrl)", "kind": ".author.0@text##\\| .*", "lastChapter": ".author.1@text##.* 更新：", "name": "p.title@text", "wordCount": ".author.1@text##\\| .*"}, "ruleToc": {"chapterList": "div#wrapper > div.box_con > div#list > dl > dd[9:]", "chapterName": "a@text", "chapterUrl": "a@href"}, "searchUrl": "https://m.xiaoxiaoshuo8.com/s.php,{\n  \"body\": \"keyword={{key}}&t=1\",\n  \"charset\": \"UTF-8\",\n  \"method\": \"POST\",\n  \"webView\": true\n}", "weight": 0},{"ruleSearch": {"lastChapter": "$.last_chapter_title", "kind": "$.category", "wordCount": "$.word_number", "bookUrl": "@js:'https://fq.taijiwang.top/api/detail?book_id='+{{$.book_id}}", "author": "$.author", "name": "$.book_name", "bookList": "@js:\nvar d=JSON.parse(result);\nvar tabs=d.data.search_tabs||[];\nvar books=[];\nfor(var i=0;i<tabs.length;i++){\n  var t=tabs[i];\n  if(t.data){\n    for(var j=0;j<t.data.length;j++){\n      var g=t.data[j];\n      if(g.book_data){\n        for(var k=0;k<g.book_data.length;k++)books.push(JSON.stringify(g.book_data[k]));\n      }\n    }\n  }\n}\nresult=books;", "coverUrl": "$.thumb_url", "intro": "$.abstract"}, "lastUpdateTime": "1787166245487", "bookSourceGroup": "番茄", "ruleContent": {"content": "$.data.content", "nextContentUrl": ""}, "bookSourceType": 0, "weight": 0, "exploreUrl": "", "jsLib": "", "ruleToc": {"chapterList": "@js:\nvar d=JSON.parse(result);\nvar vols=(d.data&&d.data.data&&d.data.data.chapterListWithVolume)||[];\nvar arr=[];\nfor(var i=0;i<vols.length;i++){\n  for(var j=0;j<vols[i].length;j++){\n    var c=vols[i][j];\n    arr.push(JSON.stringify(c));\n  }\n}\nresult=arr;", "chapterName": "$.title", "nextTocUrl": "", "chapterUrl": "@js:\nvar c=JSON.parse(result);\nvar bid='';\nvar m=baseUrl.match(/book_id=(\\d+)/);\nif(m)bid=m[1];\n'https://fq.taijiwang.top/api/content?tab=%E5%B0%8F%E8%AF%B4&item_id='+c.itemId+'&bid='+bid"}, "bookSourceComment": "自写书源：番茄小说官方数据聚合 API。免登录、无需加群，搜索/详情/目录/正文实测可用。番茄官方站点的搜索与正文接口对非浏览器有签名/滑块风控，故正文与搜索走公开聚合接口。2026-08-20 验证。", "bookSourceName": "番茄", "bookSourceUrl": "https://fq.taijiwang.top", "customOrder": 0, "enabledExplore": false, "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 Mobile Safari/537.36 SearchCraft/3.6.5 (Baidu; P1 9.0)\"\n}", "ruleBookInfo": {"coverUrl": "$.data.data.thumb_url", "tocUrl": "@js:'https://fq.taijiwang.top/api/book?book_id='+{{$.data.data.book_id}}+'&bid='+{{$.data.data.book_id}}", "intro": "$.data.data.abstract", "lastChapter": "$.data.data.last_chapter_title", "name": "$.data.data.book_name", "kind": "$.data.data.category", "author": "$.data.data.author", "wordCount": "$.data.data.word_number"}, "searchUrl": "@js:'https://fq.taijiwang.top/api/search?key='+encodeURIComponent(key)+'&tab_type=3&offset='+((page-1)*10)", "enabledCookieJar": true, "enabled": true, "ruleExplore": [], "loginUrl": ""},{"ruleSearch": {"lastChapter": "$.latest_chapter_title", "kind": "$.ptags", "wordCount": "$.words_num", "bookUrl": "@js:qmBookDetailUrl.call(this,{{$.id}})", "author": "$.author", "name": "$.title", "bookList": "$.data.books", "coverUrl": "$.image_link", "intro": "$.intro"}, "lastUpdateTime": "1787166273064", "bookSourceGroup": "七猫", "ruleContent": {"content": "@js:qmDecryptContent.call(this,result)", "nextContentUrl": ""}, "bookSourceType": 0, "weight": 0, "exploreUrl": "", "jsLib": "var QM_SECRET = 'd3dGiJc651gSQ8w1';\nvar QM_AES_KEY = '242ccb8230d709e1';\nvar QM_B64 = '+/0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\nvar QM_PARAM_MAP = 'PXMUlErYWbdJ9saI0oy_HGitgNA8Fk3hfRqC4pmBOuc6Kx5T-2zSZ1VvjQ7DwnLe';\nvar QM_APP_VERSION = '80400';\nvar QM_CHANNEL = 'qm-guanfang_lf';\nvar QM_APP_ID = 'com.kmxs.reader';\n\nfunction qmMd5(value) {\n  return String(java.md5Encode(String(value)));\n}\n\nfunction qmRandomHex(len) {\n  var chars = '0123456789abcdef';\n  var s = '';\n  for (var i = 0; i < len; i++) s += chars.charAt(Math.floor(Math.random() * 16));\n  return s;\n}\n\nfunction qmPad(value, len) {\n  value = String(value);\n  while (value.length < len) value = '0' + value;\n  return value;\n}\n\nfunction qmDateStamp() {\n  var d = new Date();\n  return d.getFullYear() + qmPad(d.getMonth() + 1, 2) + qmPad(d.getDate(), 2) +\n    qmPad(d.getHours(), 2) + qmPad(d.getMinutes(), 2) + qmPad(d.getSeconds(), 2);\n}\n\nfunction qmSourceOf(ctx) {\n  try { if (ctx && ctx.source) return ctx.source; } catch (e) {}\n  try { if (typeof source != 'undefined') return source; } catch (e2) {}\n  return null;\n}\n\nfunction qmStore() {\n  var src = qmSourceOf(this);\n  var v = src ? String(src.getVariable() || '') : '';\n  try { return JSON.parse(v) || {}; } catch (e) { return {}; }\n}\n\nfunction qmSave(data) {\n  var src = qmSourceOf(this);\n  if (src) src.setVariable(JSON.stringify(data));\n}\n\nfunction qmDevice() {\n  var s = qmStore.call(this);\n  if (!s.device) s.device = {};\n  var d = s.device;\n  if (!d.uuid) d.uuid = String(Packages.java.util.UUID.randomUUID().toString());\n  if (!d.device_id) d.device_id = qmDateStamp() + qmRandomHex(48);\n  if (!d.source_uid) d.source_uid = qmRandomHex(16);\n  if (!d.mac) {\n    var h = qmRandomHex(10);\n    d.mac = '02:' + h.replace(/(..)(?=.)/g, '$1:');\n  }\n  d.gender = '0';\n  d.static_score = '0.4';\n  d.sys_ver = '12';\n  d.phone_level = 'M';\n  d.app_version = QM_APP_VERSION;\n  d.brand = 'Redmi';\n  d.make = 'Redmi';\n  d.model = '23117RK66C';\n  s.device = d;\n  qmSave.call(this, s);\n  return d;\n}\n\nfunction qmMapChars(value, from, to) {\n  var out = '';\n  value = String(value);\n  for (var i = 0; i < value.length; i++) {\n    var idx = from.indexOf(value.charAt(i));\n    out += idx >= 0 ? to.charAt(idx) : value.charAt(i);\n  }\n  return out;\n}\n\nfunction qmParamEncode(value) {\n  var bytes = new Packages.java.lang.String(String(value)).getBytes('UTF-8');\n  var b64 = String(Packages.android.util.Base64.encodeToString(bytes, 2)).replace(/[=\\r\\n]/g, '');\n  return qmMapChars(b64, QM_B64, QM_PARAM_MAP);\n}\n\nfunction qmBuildParams() {\n  var d = qmDevice.call(this);\n  var fields = [\n    ['gender', d.gender], ['static_score', d.static_score], ['uuid', d.uuid],\n    ['device-id', d.device_id], ['mac', d.mac], ['sourceuid', d.source_uid],\n    ['sys-ver', d.sys_ver], ['phone-level', d.phone_level], ['app_ver', d.app_version],\n    ['imei', ''], ['model', d.model], ['wlb-imei', ''], ['wlb-uid', d.source_uid],\n    ['client-id', d.source_uid], ['brand', d.brand], ['make', d.make], ['net_env', '1']\n  ];\n  var parts = [];\n  for (var i = 0; i < fields.length; i++) {\n    parts.push(JSON.stringify(fields[i][0]) + ':' + JSON.stringify(String(fields[i][1])));\n  }\n  return qmParamEncode('{' + parts.join(',') + '}');\n}\n\nfunction qmHeaders(token, qmParams) {\n  var now = Math.floor(Date.now() / 1000);\n  var day = qmDateStamp().substring(0, 8);\n  var order = ['AUTHORIZATION', 'app-version', 'application-id', 'channel', 'is-white', 'net-env', 'platform', 'qm-params', 'reg'];\n  var values = {\n    'AUTHORIZATION': token || '',\n    'app-version': QM_APP_VERSION,\n    'application-id': QM_APP_ID,\n    'channel': QM_CHANNEL,\n    'is-white': '0',\n    'net-env': '1',\n    'platform': 'android',\n    'qm-params': qmParams,\n    'reg': ''\n  };\n  var text = '';\n  for (var i = 0; i < order.length; i++) text += order[i] + '=' + values[order[i]];\n  return {\n    'authorization': token || '',\n    'app-version': QM_APP_VERSION,\n    'application-id': QM_APP_ID,\n    'channel': QM_CHANNEL,\n    'is-white': '0',\n    'net-env': '1',\n    'platform': 'android',\n    'qm-params': qmParams,\n    'reg': '',\n    'sign': qmMd5(text + QM_SECRET),\n    'qm-uaf': day + '-',\n    'qm-it': String(now),\n    'qm-ii': String(now % 10000000000),\n    'no-permiss': '3',\n    'user-agent': 'webviewversion/0',\n    'qm-request-id': qmMd5(String(Date.now()) + qmRandomHex(8))\n  };\n}\n\nfunction qmUrlSign(data) {\n  var keys = [];\n  for (var k in data) keys.push(k);\n  keys.sort();\n  var text = '';\n  for (var i = 0; i < keys.length; i++) text += keys[i] + '=' + String(data[keys[i]]);\n  return qmMd5(text + QM_SECRET);\n}\n\nfunction qmLogin() {\n  var s = qmStore.call(this);\n  var now = Math.floor(Date.now() / 1000);\n  if (s.token && s.exp && s.exp > now + 60) return s.token;\n  var qmParams = qmBuildParams.call(this);\n  var headers = qmHeaders('', qmParams);\n  headers['content-type'] = 'application/x-www-form-urlencoded';\n  var form = { cancell_check: '1', gender: '0' };\n  form.sign = qmUrlSign(form);\n  var body = 'cancell_check=1&gender=0&sign=' + form.sign;\n  var resp = JSON.parse(java.ajax('https://xiaoshuo.wtzw.com/api/v1/login/tourist,' +\n    JSON.stringify({ method: 'POST', headers: headers, body: body })));\n  var token = String(resp.data && resp.data.token || '');\n  if (!token) throw new Error('七猫游客登录失败');\n  s.token = token;\n  s.exp = Math.floor(Date.now() / 1000) + 3600;\n  qmSave.call(this, s);\n  return token;\n}\n\nfunction qmSignUrl(url, params) {\n  var token = qmLogin.call(this);\n  var query = {};\n  for (var k in params) query[k] = String(params[k]);\n  var keys = [];\n  for (var k in query) keys.push(k);\n  keys.sort();\n  var parts = [];\n  for (var i = 0; i < keys.length; i++) {\n    parts.push(encodeURIComponent(keys[i]) + '=' + encodeURIComponent(query[keys[i]]));\n  }\n  parts.push('sign=' + encodeURIComponent(qmUrlSign(query)));\n  var headers = qmHeaders(token, qmBuildParams.call(this));\n  return url + '?' + parts.join('&') + ',' + JSON.stringify({ headers: headers });\n}\n\nfunction qmSearchUrl(key, page) {\n  key = String(key || '').trim();\n  page = String(Number(page || 1) || 1);\n  return qmSignUrl.call(this, 'https://api-bc.wtzw.com/search/v1/words', {\n    extend: '',\n    tab: '3',\n    gender: '0',\n    refresh_state: '8',\n    track_id: qmRandomHex(16) + String(Date.now()),\n    page: page,\n    book_id: '',\n    book_privacy: '1',\n    wd: key,\n    read_preference: '4',\n    is_short_story_user: '0'\n  });\n}\n\nfunction qmBookDetailUrl(id) {\n  return qmSignUrl.call(this, 'https://api-bc.wtzw.com/api/v4/book/detail', {\n    id: String(id),\n    imei_ip: '2937357107',\n    teeny_mode: '0'\n  });\n}\n\nfunction qmTocUrl(id) {\n  return qmSignUrl.call(this, 'https://api-ks.wtzw.com/api/v1/chapter/chapter-list', {\n    id: String(id)\n  });\n}\n\nfunction qmContentUrl(bid, cid) {\n  return qmSignUrl.call(this, 'https://api-ks.wtzw.com/api/v1/chapter/content', {\n    id: String(bid),\n    chapterId: String(cid)\n  });\n}\n\nfunction qmDecryptContent(text) {\n  var d = JSON.parse(text);\n  var b64 = String(d.data && d.data.content || '');\n  if (!b64) return '';\n  var raw = Packages.android.util.Base64.decode(b64, 0);\n  if (!raw || raw.length <= 16) return '';\n  var iv = Packages.java.util.Arrays.copyOfRange(raw, 0, 16);\n  var encrypted = Packages.java.util.Arrays.copyOfRange(raw, 16, raw.length);\n  var key = new Packages.javax.crypto.spec.SecretKeySpec(\n    new Packages.java.lang.String(QM_AES_KEY).getBytes('UTF-8'), 'AES');\n  var ivSpec = new Packages.javax.crypto.spec.IvParameterSpec(iv);\n  var cipher = Packages.javax.crypto.Cipher.getInstance('AES/CBC/PKCS5Padding');\n  cipher.init(2, key, ivSpec);\n  return String(new Packages.java.lang.String(cipher.doFinal(encrypted), 'UTF-8'));\n}\n", "ruleToc": {"chapterList": "$.data.chapter_lists", "chapterName": "$.title", "nextTocUrl": "", "chapterUrl": "@js:var m=baseUrl.match(/chapter-list\\?id=(\\d+)/);qmContentUrl.call(this,m?m[1]:'',{{$.id}})"}, "bookSourceComment": "自写书源：直连七猫官方 API。游客自动登录（无需注册、无需加群），搜索/详情/目录/正文全链路实测可用，正文本地 AES 解密。注：出版书(EPUB 类型)暂不支持。2026-08-20 验证。", "bookSourceName": "七猫", "bookSourceUrl": "https://api-bc.wtzw.com", "customOrder": 0, "enabledExplore": false, "header": "{\n  \"User-Agent\": \"webviewversion/0\"\n}", "ruleBookInfo": {"coverUrl": "$.data.book.image_link", "tocUrl": "@js:var d=JSON.parse(result);qmTocUrl.call(this,d.data.book.id)", "intro": "$.data.book.intro", "lastChapter": "$.data.book.latest_chapter_title", "name": "$.data.book.title", "kind": "@js:var d=JSON.parse(result);(d.data.book.category1_name||'')+' '+(d.data.book.category2_name||'')", "author": "$.data.book.author", "wordCount": "$.data.book.words_num"}, "searchUrl": "@js:qmSearchUrl.call(this,key,page)", "enabledCookieJar": true, "enabled": true, "ruleExplore": [], "loginUrl": ""},{"bookSourceComment": "中文成人文学网短篇（blog.xbookcn.net 简体版）\n已优化目录+正文\n注意：有 Cloudflare，建议开启 WebView 或先用浏览器验证\n仅供学习交流", "bookSourceGroup": "成人小说", "bookSourceName": "中文成人文学网-短篇(简体)", "bookSourceType": 0, "bookSourceUrl": "https://blog.xbookcn.net", "customOrder": 0, "enabled": true, "enabledExplore": true, "exploreUrl": "精选作品::https://blog.xbookcn.net/search/label/%E7%B2%BE%E9%80%89%E4%BD%9C%E5%93%81\n现代情色::https://blog.xbookcn.net/search/label/%E7%8E%B0%E4%BB%A3%E6%83%85%E8%89%B2\n日本情色::https://blog.xbookcn.net/search/label/%E6%97%A5%E6%9C%AC%E6%83%85%E8%89%B2\n西洋情色::https://blog.xbookcn.net/search/label/%E8%A5%BF%E6%B4%8B%E6%83%85%E8%89%B2\n伴侣交换::https://blog.xbookcn.net/search/label/%E4%BC%B4%E4%BE%A3%E4%BA%A4%E6%8D%A2\n武侠情色::https://blog.xbookcn.net/search/label/%E6%AD%A6%E4%BE%A0%E6%83%85%E8%89%B2\n奇幻科幻::https://blog.xbookcn.net/search/label/%E5%A5%87%E5%B9%BB%E7%A7%91%E5%B9%BB\n家庭乱伦::https://blog.xbookcn.net/search/label/%E5%AE%B6%E5%BA%AD%E4%B9%B1%E4%BC%A6\n性爱调教::https://blog.xbookcn.net/search/label/%E6%80%A7%E7%88%B1%E8%B0%83%E6%95%99\n粗野性交::https://blog.xbookcn.net/search/label/%E7%B2%97%E9%87%8E%E6%80%A7%E4%BA%A4\n多人群交::https://blog.xbookcn.net/search/label/%E5%A4%9A%E4%BA%BA%E7%BE%A4%E4%BA%A4\n教师学生::https://blog.xbookcn.net/search/label/%E6%95%99%E5%B8%88%E5%AD%A6%E7%94%9F\n古典情色::https://blog.xbookcn.net/search/label/%E5%8F%A4%E5%85%B8%E6%83%85%E8%89%B2\n历史情色::https://blog.xbookcn.net/search/label/%E5%8E%86%E5%8F%B2%E6%83%85%E8%89%B2\n同性情色::https://blog.xbookcn.net/search/label/%E5%90%8C%E6%80%A7%E6%83%85%E8%89%B2\n都市生活::https://blog.xbookcn.net/search/label/%E9%83%BD%E5%B8%82%E7%94%9F%E6%B4%BB\n乡间记趣::https://blog.xbookcn.net/search/label/%E4%B9%A1%E9%97%B4%E8%AE%B0%E8%B6%A3\n疯狂暴露::https://blog.xbookcn.net/search/label/%E7%96%AF%E7%8B%82%E6%9A%B4%E9%9C%B2\n午夜怪谈::https://blog.xbookcn.net/search/label/%E5%8D%88%E5%A4%9C%E6%80%AA%E8%B0%88\n游戏乐园::https://blog.xbookcn.net/search/label/%E6%B8%B8%E6%88%8F%E4%B9%90%E5%9B%AD\n医生护士::https://blog.xbookcn.net/search/label/%E5%8C%BB%E7%94%9F%E6%8A%A4%E5%A3%AB", "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\"}", "lastUpdateTime": "1787164658914", "respondTime": 180000, "ruleBookInfo": {"author": "作者[：:]\\s*(.*?)(?=\\n|（|$)", "intro": "", "name": "h3@text||h1@text||title@text##-短篇.*|\\s*-.*", "tocUrl": ""}, "ruleContent": {"content": "class.post-body@html||class.entry-content@html||id.post-body@html||article@html||class.post@html||body@html", "replaceRegex": "##作者[：:].*?\\n|目录:.*|目錄：.*|<script[\\s\\S]*?</script>|<style[\\s\\S]*?</style>|<a[^>]*>.*?</a>|广告|推荐"}, "ruleExplore": {"bookList": "h3 a||.post-title a||article h3 a", "bookUrl": "href", "name": "text"}, "ruleSearch": {"bookList": "h3 a||.post-title a||article h3 a", "bookUrl": "href", "name": "text"}, "ruleToc": {"chapterList": "@js:\n[{\n  \"name\": book.name || \"正文\",\n  \"url\": baseUrl\n}]", "chapterName": "name", "chapterUrl": "url"}, "searchUrl": "https://blog.xbookcn.net/search?q={{key}}", "weight": 0},{"bookSourceComment": "中文成人文學網短篇（blog.xbookcn.com）\n已优化目录+正文\n注意：有 Cloudflare，建议开启 WebView 或先用浏览器验证\n仅供学习交流", "bookSourceGroup": "成人小说", "bookSourceName": "中文成人文學網-短篇", "bookSourceType": 0, "bookSourceUrl": "https://blog.xbookcn.com", "customOrder": 0, "enabled": true, "enabledExplore": true, "exploreUrl": "精選作品::https://blog.xbookcn.com/search/label/%E7%B2%BE%E9%81%B8%E4%BD%9C%E5%93%81\n現代情色::https://blog.xbookcn.com/search/label/%E7%8F%BE%E4%BB%A3%E6%83%85%E8%89%B2\n日本情色::https://blog.xbookcn.com/search/label/%E6%97%A5%E6%9C%AC%E6%83%85%E8%89%B2\n西洋情色::https://blog.xbookcn.com/search/label/%E8%A5%BF%E6%B4%8B%E6%83%85%E8%89%B2\n伴侶交換::https://blog.xbookcn.com/search/label/%E4%BC%B4%E4%BE%B6%E4%BA%A4%E6%8F%9B\n武俠情色::https://blog.xbookcn.com/search/label/%E6%AD%A6%E4%BF%A0%E6%83%85%E8%89%B2\n奇幻科幻::https://blog.xbookcn.com/search/label/%E5%A5%87%E5%B9%BB%E7%A7%91%E5%B9%BB\n家庭亂倫::https://blog.xbookcn.com/search/label/%E5%AE%B6%E5%BA%AD%E4%BA%82%E5%80%AB\n性愛調教::https://blog.xbookcn.com/search/label/%E6%80%A7%E6%84%9B%E8%AA%BF%E6%95%99\n粗野性交::https://blog.xbookcn.com/search/label/%E7%B2%97%E9%87%8E%E6%80%A7%E4%BA%A4\n多人群交::https://blog.xbookcn.com/search/label/%E5%A4%9A%E4%BA%BA%E7%BE%A4%E4%BA%A4\n教師學生::https://blog.xbookcn.com/search/label/%E6%95%99%E5%B8%AB%E5%AD%B8%E7%94%9F\n古典情色::https://blog.xbookcn.com/search/label/%E5%8F%A4%E5%85%B8%E6%83%85%E8%89%B2\n歷史情色::https://blog.xbookcn.com/search/label/%E6%AD%B7%E5%8F%B2%E6%83%85%E8%89%B2\n同性情色::https://blog.xbookcn.com/search/label/%E5%90%8C%E6%80%A7%E6%83%85%E8%89%B2\n都市生活::https://blog.xbookcn.com/search/label/%E9%83%BD%E5%B8%82%E7%94%9F%E6%B4%BB", "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\"}", "lastUpdateTime": "1787164276897", "respondTime": 180000, "ruleBookInfo": {"author": "作者[：:]\\s*(.*?)(?=\\n|（|$)", "intro": "", "name": "h3@text||h1@text||title@text##-短篇.*|\\s*-.*", "tocUrl": ""}, "ruleContent": {"content": "class.post-body@html||class.entry-content@html||id.post-body@html||article@html||class.post@html||body@html", "replaceRegex": "##作者[：:].*?\\n|目錄：.*|<script[\\s\\S]*?</script>|<style[\\s\\S]*?</style>|<a[^>]*>.*?</a>|廣告|推荐"}, "ruleExplore": {"bookList": "h3 a||.post-title a||article h3 a", "bookUrl": "href", "name": "text"}, "ruleSearch": {"bookList": "h3 a||.post-title a||article h3 a", "bookUrl": "href", "name": "text"}, "ruleToc": {"chapterList": "@js:\n[{\n  \"name\": book.name || \"正文\",\n  \"url\": baseUrl\n}]", "chapterName": "name", "chapterUrl": "url"}, "searchUrl": "https://blog.xbookcn.com/search?q={{key}}", "weight": 0},{"bookSourceComment": "by 狼崽儿 //2026.8.9\n第三方的开放番茄小说API。无法同步账号\n1.支持小说，漫画，听书，短剧（但是这个API的短剧资源无法播放，所以实际上只支持前三种模式），默认小说，切换类型在登录切换，别忘了在左上角切换源类型。\n2.仅支持小说评论。（其实也支持其他类型的评论，但是阅读会有兼容问题）\n3.评论支持看用户名，评论正文，用户评分，点赞数，回复数。但是无法看楼中楼和具体用户信息。\n4.评论数默认拉取100条，实测会在100多条的数量变动。如果需要拉取更多评论，在正文的LIMIT处修改数字，但是太多评论会很慢。\n5.全面兼容所有版本的阅读\n7.无段评，评论为整本书评论\n【V2 更新】2026.8.10\n去除评论字数限制；采用更加简单的toUrl，提高了解析目录成功率。为文章前面添加空格，优化文章显示效果。\n【V3 更新】2026.8.11\n重大更新！现已支持所有模式的发现页，只需要在登录处变换男女频道和四大类型就可以更新发现页。如果是旧版阅读，在发现页长按此书源，在下拉列表点击更新。同时优化当前模式的弹窗，支持查看模式，当前频道和评论开关状态。因为拉取评论容易导致校验超时，所以建议平时关掉评论开关。\n【V3.1 更新】2026.8.11\n支持显示卷名。\n【V3.2 更新】2026.8.20，介于原api失效，更换了新的api （by 艳阳）", "bookSourceName": "🍅 番茄小说聚合API", "bookSourceType": 0, "bookSourceUrl": "https://fq.taijiwang.top", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "@js:\nvar v = String(source.getVariable()).split(',');\nvar idx = parseInt(v[0]) || 0;\nvar tabs = ['小说', '听书', '漫画', '短剧'];\nvar tab = tabs[idx] || '小说';\nvar channels = ['男频', '女频'];\nvar ch = channels[parseInt(v[3]) || 0] || '男频';\nvar url = 'https://fq.taijiwang.top/api/discover/style?tab=' + encodeURIComponent(tab) + '&source_type=' + encodeURIComponent(ch);\nvar d = JSON.parse(java.ajax(url));\nvar styles = d.data || [];\nvar arr = [];\nfor (var i = 0; i < styles.length; i++) {\n  var it = styles[i];\n  var t = String(it.title).replace(/[°・\\*.☆]/g, '').trim();\n  if (it.url) {\n    arr.push({title: t, url: it.url});\n  } else {\n    arr.push({title: t, url: '', style: {layout_flexGrow: 1, layout_flexBasisPercent: 1, background: '#37474f', borderRadius: '6px'}});\n  }\n}\nJSON.stringify(arr);", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 Mobile Safari/537.36 SearchCraft/3.6.5 (Baidu; P1 9.0)\"\n}", "jsLib": "var TypeNames = [\"小说\", \"听书\", \"漫画\", \"短剧\"];\nvar TypeValues = [3, 2, 8, 11];\n\nfunction TYPE() {\n    var v = String(this.source.getVariable()).split(\",\");\n    var idx = parseInt(v[0]) || 0;\n    return TypeValues[idx] !== undefined ? TypeValues[idx] : 3;\n}\n\nfunction TAB() {\n    var v = String(this.source.getVariable()).split(\",\");\n    var idx = parseInt(v[0]) || 0;\n    var tabs = [\"%E5%B0%8F%E8%AF%B4\", \"%E5%90%AC%E4%B9%A6\", \"%E6%BC%AB%E7%94%BB\", \"%E7%9F%AD%E5%89%A7\"];\n    return tabs[idx] !== undefined ? tabs[idx] : \"%E5%B0%8F%E8%AF%B4\";\n}\n\nfunction CMTOFF() {\n    var v = String(this.source.getVariable()).split(\",\");\n    return v[1] == 'off';\n}", "lastUpdateTime": "1787158620617", "loginUi": "[\n    {\n        \"name\": \"当前模式\",\n        \"type\": \"button\",\n        \"action\": \"A()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"主页\",\n        \"type\": \"button\",\n        \"action\": \"C()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n{\n        \"name\": \"🧑男频\",\n        \"type\": \"button\",\n        \"action\": \"E(0)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n{\n        \"name\": \"👩女频\",\n        \"type\": \"button\",\n        \"action\": \"E(1)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"📖小说\",\n        \"type\": \"button\",\n        \"action\": \"B(0)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"🎧听书\",\n        \"type\": \"button\",\n        \"action\": \"B(1)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"🖼漫画\",\n        \"type\": \"button\",\n        \"action\": \"B(2)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"🎬短剧\",\n        \"type\": \"button\",\n        \"action\": \"B(3)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"💬 评论: 开启/关闭\",\n        \"type\": \"button\",\n        \"action\": \"D()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.5\n      }\n   }\n]", "loginUrl": "A = () => {\n    let v = String(this.source.getVariable()).split(\",\");\n    let x = parseInt(v[0]) || 0;\n    let names = [\"小说\", \"听书\", \"漫画\", \"短剧\"];\n    let icons = [\"📖\", \"🎧\", \"🖼\", \"🎬\"];\n    let chs = [\"男频\", \"女频\"];\n    let ch = chs[parseInt(v[3]) || 0] || '男频';\n    let cmt = v[1] == 'off' ? '关闭' : '开启';\n    let nl = String.fromCharCode(10);\n    java.toast('━━━━━━━━━━━' + nl +\n        icons[x] + ' 当前模式' + nl +\n        names[x] + nl +\n        '━━━━━━━━━━━' + nl +\n        '👥 频道' + nl +\n        ch + nl +\n        '━━━━━━━━━━━' + nl +\n        '💬 评论开关' + nl +\n        cmt + nl +\n        '━━━━━━━━━━━');\n}\n\nB = (x) => {\n    let v = String(this.source.getVariable()).split(\",\");\n    v[0] = x;\n    this.source.setVariable(v.join(\",\"));\n    let names = [\"小说\", \"听书\", \"漫画\", \"短剧\"];\n    java.toast('已切换到：' + names[x]);\n}\n\nC = () => {\n    java.startBrowser('https://fq.taijiwang.top', '');\n}\n\nD = () => {\n    let v = String(this.source.getVariable()).split(\",\");\n    v[1] = (v[1] == 'off') ? 'on' : 'off';\n    this.source.setVariable(v.join(\",\"));\n    java.toast('💬 评论已' + (v[1] == 'on' ? '开启' : '关闭'));\n}\n\nE = (x) => {\n    let v = String(this.source.getVariable()).split(\",\");\n    v[3] = x;\n    this.source.setVariable(v.join(\",\"));\n    let names = [\"男频\", \"女频\"];\n    java.toast('已切换到：' + names[x] + '（发现页联动）');\n}", "respondTime": 78500, "ruleBookInfo": {"author": "$.data.data.author", "coverUrl": "$.data.data.thumb_url", "intro": "@js:\nvar d = JSON.parse(result);\nvar dd = d.data.data;\nfunction pad(n) { return n < 10 ? '0' + n : '' + n; }\nfunction fmtTime(ts) {\n  var t = new Date(parseInt(ts) * 1000);\n  return t.getFullYear() + '-' + pad(t.getMonth() + 1) + '-' + pad(t.getDate()) + ' ' + pad(t.getHours()) + ':' + pad(t.getMinutes()) + ':' + pad(t.getSeconds());\n}\nvar info = '';\ninfo += '🆔 书号：' + (dd.book_id || '') + '\\n';\ninfo += '📕 书名：' + (dd.book_name || '') + '\\n';\ninfo += '🎯 状况：' + (dd.creation_status == '0' ? '连载中' : '已完结') + '\\n';\ninfo += '✏️ 开坑：' + String(dd.create_time || '').substring(0, 10) + '\\n';\ninfo += '🕰️ 更新：' + (dd.last_publish_time ? fmtTime(dd.last_publish_time) : '') + '\\n';\ninfo += '⌨️ 字数：' + (dd.word_number || '0') + '字\\n';\ninfo += '🏷️ 标签：' + (dd.tags || '') + '\\n';\ninfo += '📊 评分：' + (dd.score || '0') + '分\\n';\ninfo += '🔖 分类：' + (dd.category || '') + '\\n';\ninfo += '📜 简介：\\n' + (dd.abstract || '');\nresult = info;", "kind": "$.data.data.category", "name": "$.data.data.book_name", "tocUrl": "@js:\nvar m = baseUrl.match(/book_id=(\\d+)/);\nbaseUrl.split('detail').join('book') + (m ? '&bid=' + m[1] : '')"}, "ruleContent": {"content": "@js:\nvar d = JSON.parse(result);\nvar v = String(this.source.getVariable()).split(',');\nvar mode = parseInt(v[0]) || 0;\n\nvar content = '';\n\nif (mode == 0) {\n  content = d.data.content || '';\n  // 首段补全角空格缩进（API 首段无缩进）\n  if (content) {\n    var ci = 0;\n    while (ci < content.length && (content.charAt(ci) === '\\n' || content.charAt(ci) === ' ')) ci++;\n    if (ci < content.length && content.charAt(ci) !== '\\u3000') {\n      content = content.substring(0, ci) + '\\u3000\\u3000' + content.substring(ci);\n    }\n  }\n} else if (mode == 1) {\n  content = d.data.audio_url || d.data.content || '';\n} else if (mode == 2) {\n  content = d.data.images || '';\n} else if (mode == 3) {\n  content = d.data.video_url || '';\n}\n\nif (mode == 0 && typeof CMTOFF !== 'undefined' && !CMTOFF()) {\n  var bid = '';\n  var m = baseUrl.match(/bid=(\\d+)/);\n  if (m) bid = m[1];\n  try {\n    var all = [];\n    var offset = 0;\n    var LIMIT = 100;\n    while (all.length < LIMIT) {\n      var cr = JSON.parse(java.ajax('https://fq.taijiwang.top/api/comment?book_id=' + bid + '&count=50&offset=' + offset));\n      var cmts = cr.data.data.comment;\n      if (!cmts || cmts.length === 0) break;\n      all = all.concat(cmts);\n      if (!cr.data.data.has_more) break;\n      offset += 50;\n    }\n    if (all.length > 0) {\n      content += '\\n\\n━━━━━━━━━━━━━━━━━━\\n💬 本书书评（共' + all.length + '条）\\n━━━━━━━━━━━━━━━━━━\\n';\n      for (var i = 0; i < all.length; i++) {\n        var c = all[i];\n        var nick = (c.user_info && c.user_info.user_name) ? c.user_info.user_name : '匿名';\n        var digg = c.digg_count || 0;\n        var rep = c.reply_count || 0;\n        var sc = c.score || '';\n        var txt = String(c.text).split('\\n').join(' ');\n        var line = '👤 ' + nick;\n        if (sc) line += ' ⭐' + sc;\n        line += ' 👍' + digg + ' 💬' + rep;\n        content += line + '\\n📝 ' + txt + '\\n';\n      }\n    }\n  } catch (e) {}\n}\nresult = content;"}, "ruleExplore": {"author": "$.author", "bookList": "@Json:data", "bookUrl": "$.book_id@js:'https://fq.taijiwang.top/api/detail?book_id=' + result", "coverUrl": "$.thumb_url", "intro": "$.abstract", "kind": "$.category", "name": "$.book_name"}, "ruleSearch": {"author": "$.author", "bookList": "@js:\nvar d = JSON.parse(result);\nvar tabs = d.data.search_tabs;\nvar v = String(this.source.getVariable()).split(\",\");\nvar idx = parseInt(v[0]) || 0;\nvar typeValues = [3, 2, 8, 11];\nvar currentType = typeValues[idx] !== undefined ? typeValues[idx] : 3;\nvar books = [];\nfor (var i = 0; i < tabs.length; i++) {\n    if (tabs[i].tab_type == currentType && tabs[i].data) {\n        for (var j = 0; j < tabs[i].data.length; j++) {\n            var g = tabs[i].data[j];\n            if (currentType == 11) {\n                // === 短剧: 从 video_data 取, 统一成书结构 ===\n                var vd = g.video_data;\n                if (vd) {\n                    for (var k = 0; k < vd.length; k++) {\n                        var it = vd[k];\n                        var cat = '';\n                        try {\n                            var cs = JSON.parse(it.category_schema || '[]');\n                            if (cs[0]) cat = cs[0].name;\n                        } catch (e) {}\n                        books.push(JSON.stringify({\n                            book_name: it.title || it.raw_book_name || '',\n                            author: it.author || '',\n                            category: cat,\n                            abstract: it.rec_text || it.sub_title || '',\n                            thumb_url: it.cover || it.horiz_cover || '',\n                            book_id: it.series_id || it.vid || ''\n                        }));\n                    }\n                }\n            } else {\n                // === 小说/听书/漫画: 原有逻辑 ===\n                var bd = g.book_data;\n                if (bd) {\n                    for (var k = 0; k < bd.length; k++) {\n                        books.push(JSON.stringify(bd[k]));\n                    }\n                }\n            }\n        }\n    }\n}\nresult = books;", "bookUrl": "$.book_id@js:'https://fq.taijiwang.top/api/detail?book_id=' + result", "coverUrl": "$.thumb_url", "intro": "$.abstract", "kind": "$.category", "name": "$.book_name"}, "ruleToc": {"chapterList": "@js:\nvar d = (typeof result === 'string') ? JSON.parse(result) : result;\nvar obj = d.data.data;\nvar clwv = obj.chapterListWithVolume || [];\nvar vnl = obj.volumeNameList || [];\nvar arr = [];\nfor (var i = 0; i < clwv.length; i++) {\n  var vol = clwv[i];\n  if (vol.length > 0) {\n    var vn = vnl[i] || ('第' + (i + 1) + '卷');\n    arr.push(JSON.stringify({title: vn, isVolume: true, itemId: vol[0].itemId}));\n  }\n  for (var j = 0; j < vol.length; j++) {\n    var ch = vol[j];\n    ch.isVolume = false;\n    arr.push(JSON.stringify(ch));\n  }\n}\narr;", "chapterName": "$.title", "chapterUrl": "@js:\nvar c = JSON.parse(result);\nvar bid = '';\nvar m = baseUrl.match(/book_id=(\\d+)/);\nif (m) bid = m[1];\nc.isVolume ? '' : 'https://fq.taijiwang.top/api/content?tab=' + TAB() + '&item_id=' + c.itemId + '&bid=' + bid;", "isVolume": "$.isVolume"}, "searchUrl": "@js:var base='https://fq.taijiwang.top';\nvar offset=(page-1)*10;\nbase+'/api/search?key='+encodeURIComponent(key)+'&tab_type='+TYPE()+'&offset='+offset", "weight": 0},{"bookSourceComment": "by狼崽儿 //2026.8.19\n融合了好几个有名漫画网站资源的漫画网站。bug未知，如果有问题先从登录处进去搜索查看漫画，走一遍真人搜索流程。\n有些线路或者有些漫画本身资源有问题，线路问题换线路，漫画显示章节下架就说明看不了了。", "bookSourceName": "🌟卡拉漫画", "bookSourceType": 2, "bookSourceUrl": "https://www.kalamanhua.com", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "@js:\nvar result = [];\nvar push = function(title, url, size) {\n    result.push({\n        title: title,\n        url: url,\n        style: {\n            layout_flexGrow: 1,\n            layout_flexBasisPercent: size\n        }\n    });\n};\nvar regions = [\n    {name: '全部', code: '26'},\n    {name: '韩漫', code: 'Kc'},\n    {name: '日漫', code: 'Jc'},\n    {name: '中漫', code: 'Cc'},\n    {name: '欧美漫', code: 'Ec'},\n    {name: '其他', code: 'Oc'}\n];\nvar types = [\n    'All', '恋爱', '冒险', '生活', '校园', '热血', '魔法', '悬疑', '科幻',\n    '运动', '都市', '耽美', '搞笑', '单女主', '纯爱', '总裁', '奇幻', '恐怖',\n    '灵异', '异能', '穿越', '剧情', '古风', '言情', '玄幻', '复仇', '多女主',\n    '霸总', '虐恋', '青春', '真人', '重生', '甜宠', '游戏竞技', '家庭', 'BL',\n    '民国', '同人', '系统', '爱情', '美人', '喜剧', '纯真', '腹黑', '财阀',\n    '后宫', '战争', '修真', '其他'\n];\nfor (var r = 0; r < regions.length; r++) {\n    var region = regions[r];\n    for (var t = 0; t < types.length; t++) {\n        var type = types[t];\n        var isAll = (t === 0);\n        var base;\n        if (isAll) {\n            base = '/type/' + region.code;\n        } else {\n            var encodedType = (type === 'All' || type === 'BL') ? type : encodeURIComponent(type);\n            base = '/type/' + region.code + '--' + encodedType;\n        }\n        var url;\n        if (isAll) {\n            url = '@js:var base=\"' + base + '\";if(page==1){base+\"-----.html\";}else{base+\"---\"+page+\"--.html\";}';\n        } else {\n            url = '@js:var base=\"' + base + '\";if(page==1){base+\"---.html\";}else{base+\"-\"+page+\"--.html\";}';\n        }\n        var title;\n        if (isAll) {\n            title = '📌 ' + region.name + '·全部';\n        } else {\n            title = region.name + '·' + type;\n        }\n        var size = isAll ? 1 : 0.35;\n        push(title, url, size);\n    }\n}\nJSON.stringify(result);", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\",\n  \"Referer\": \"https://www.kalamanhua.com\",\n  \"Cookie\": \"cf_human_passed=true\"\n}", "lastUpdateTime": "1787135922026", "loginCheckJs": "", "loginUrl": "https://www.kalamanhua.com", "respondTime": 2152, "ruleBookInfo": {"author": "##作者：([^<]+)<##$1###", "coverUrl": ".stui-content__thumb img@data-original@js:result + ',{\"headers\":{\"Referer\":\"https://www.kalamanhua.com\"}}'", "intro": "@js:\nvar names = [];\nvar tm = result.match(/data-toggle=\"tab\"[^>]*>([^<]+)</g);\nif (tm) {\n    for (var i = 0; i < tm.length; i++) {\n        var mm = tm[i].match(/>([^<]+)</);\n        if (mm) names.push(mm[1]);\n    }\n}\nvar n = names.length;\nif (n === 0) {\n    n = (result.match(/<ul class=\"stui-content__playlist/g) || []).length;\n    for (var z = 0; z < n; z++) {\n        names.push('线路' + (z + 1));\n    }\n}\nvar xu = '0';\ntry {\n    var cv = book.getVariable('custom');\n    if (cv != null && cv != '') {\n        xu = String(cv);\n    }\n} catch(e) {}\nif (xu == '0' || xu == '') {\n    var ov = String(book.variable || '');\n    if (ov != '') {\n        xu = ov;\n    }\n}\nvar list = '';\nfor (var i2 = 0; i2 < names.length; i2++) {\n    list += '◖' + i2 + '◗' + names[i2] + ' ';\n}\nvar lineInfo = '【线路列表】' + list.trim() + '\\n当前来源◖' + xu + '◗\\n（右上角书籍变量填 0-' + (n - 1) + ' 刷新切换线路）';\nvar desc = '';\nvar dcMatch = result.match(/<span class=\"detail-content\" style=\"display: none;\">([\\s\\S]*?)<\\/span>/);\nif (dcMatch) {\n    desc = dcMatch[1].trim();\n}\nif (!desc) {\n    var dsMatch = result.match(/<span class=\"detail-sketch\">([\\s\\S]*?)<\\/span>/);\n    if (dsMatch) {\n        desc = dsMatch[1].trim();\n    }\n}\nif (!desc) {\n    desc = java.getString('meta[name=\"description\"]@content') || '';\n}\nlineInfo + '\\n\\n📖 简介：' + desc;", "kind": ".stui-content__detail@text##类型：(.+?)地区：##$1##", "lastChapter": ".data span@text", "name": "h1.title@text"}, "ruleContent": {"content": "@js:\nvar um = result.match(/\"url\":\"([0-9a-f]+)\"/);\nvar enc = um ? um[1] : '';\nvar out = '';\nif (enc) {\n  try {\n    var resp = java.get('https://image.kalaimg.top/play/min/' + enc, {Referer: 'https://www.kalamanhua.com/'});\n    var minHtml = String(resp.body());\n    var d1 = minHtml.indexOf('var d=\"');\n    var b64 = '';\n    if (d1 >= 0) { var d2 = minHtml.indexOf('\"', d1 + 7); if (d2 > d1) { b64 = minHtml.substring(d1 + 7, d2); } }\n    var k1 = minHtml.indexOf('k=[');\n    var k = [];\n    if (k1 >= 0) { var k2 = minHtml.indexOf(']', k1 + 3); if (k2 > k1) { var kp = minHtml.substring(k1 + 3, k2).split(','); for (var t = 0; t < kp.length; t++) { k.push(parseInt(kp[t])); } } }\n    if (b64 && k.length > 0) {\n      var bytes = java.base64DecodeToByteArray(b64);\n      var dec = '';\n      for (var i = 0; i < bytes.length; i++) {\n        dec += String.fromCharCode((bytes[i] & 0xff) ^ k[i % k.length]);\n      }\n      var imgs = dec.match(/data-src=\"\\/image\\/index\\/[^\"]+\"/g);\n      if (imgs) {\n        for (var j = 0; j < imgs.length; j++) {\n          var src = imgs[j].replace(/data-src=\"/, '').replace(/\"$/, '');\n          out += '<img src=\"https://image.kalaimg.top' + src + ',{\"headers\":{\"Referer\":\"https://www.kalamanhua.com/\"}}\">';\n        }\n      }\n    }\n  } catch(e) {}\n}\nout;", "imageStyle": "FULL"}, "ruleExplore": {"author": ".stui-vodlist__detail p@text", "bookList": "//ul[contains(@class,'vodlist')]/li", "bookUrl": "a@href", "coverUrl": "a@data-original", "intro": "@js:\nvar a = java.getString('.stui-vodlist__detail p@text');\nvar l = java.getString('.pic-text b@text');\nvar result = '作者：' + (a || '') + '\\n更新：' + (l || '');\nresult;", "kind": ".pic-text1 b@text", "lastChapter": ".pic-text b@text", "name": "a@title"}, "ruleSearch": {"author": ".stui-vodlist__detail p@text", "bookList": "ul.stui-vodlist > li", "bookUrl": "a@href", "checkKeyWord": "", "coverUrl": "a@data-original@js:result + ',{\"headers\":{\"Referer\":\"https://www.kalamanhua.com\"}}'", "kind": ".pic-text1 b@text", "lastChapter": ".pic-text b@text", "name": "a@title"}, "ruleToc": {"chapterList": "@js:\nvar xu = '0';\nvar mi = String(book.intro || '').match(/来源◖(\\d+)◗/);\nif (mi) { xu = mi[1]; }\ntry { var cv = book.getVariable('custom'); if (cv != null && cv != '') { xu = String(cv); } } catch(e) {}\nvar idx = parseInt(xu);\nif (!(idx >= 0)) { idx = 0; }\nvar doc = org.jsoup.Jsoup.parse(result);\nvar uls = doc.select('ul.stui-content__playlist');\nvar ul = uls.size() > 0 ? uls.get(Math.min(idx, uls.size() - 1)) : null;\nvar arr = [];\nif (ul) {\n  var as = ul.select('li a');\n  for (var i = 0; i < as.size(); i++) {\n    arr.push(JSON.stringify({name: as.get(i).text(), url: 'https://www.kalamanhua.com' + as.get(i).attr('href')}));\n  }\n}\narr;", "chapterName": "$.name", "chapterUrl": "$.url"}, "searchUrl": "/search/page/{{page}}/wd/{{key}}.html", "weight": 0},{"bookSourceComment": "//2026.6.20\n用了夜泽川的猕猴桃漫画的代码做了发布页和翻页规则，在此郑重感谢。\n！！！大家一定要擦亮眼睛，不要给这个网站买会员啊！直接在Legado阅读里阅读或者去正版漫蛙网站里看。正版漫蛙是htpps://www.mw777.me。这个源爬的网站胜在国内连接稳定，更换了域名也容易改，网速差可以考虑挂梯或换域名。\n用户ljy911028发的是正版漫蛙的源，大家可以也去那里看看。\n我也是在昨天才发现这个网站是需要开会员看部分漫画的，之前一直都是直接抓取api阅读，所以不要在这个网站充钱，真正的漫蛙是完全免费的。\n8.19\n因为这个漫蛙就是猕猴桃漫画里的某个域名，所以很多代码复用夜泽川就行。本次修改主要是把硬编码的获取API的方法改成了基于源Url获取API，如果源失效只要改源Url（源Url后面不要加/）就好了。登录处是发现页网址。", "bookSourceGroup": "", "bookSourceName": "漫蛙", "bookSourceType": 2, "bookSourceUrl": "https://www.manwaye.cc", "bookUrlPattern": "", "concurrentRate": "", "coverDecodeJs": "(() => {\n    const view = result.readAllBytes();\n    const isImage = (view[0] === 0xFF && view[1] === 0xD8) ||\n        (view[0] === 0x89 && view[1] === 0x50) ||\n        (view[0] === 0x47 && view[1] === 0x49) ||\n        (view[0] === 0x52 && view[1] === 0x49);\n    if (isImage) return result;\n    const iv = view.slice(0, 16);\n    const ciphertext = view.slice(16);\n    const key = java.strToBytes('0B6666A0-BB59-1381-B746-a0E4C9AC');\n    const cipher = java.createSymmetricCrypto(\"AES/CBC/PKCS5Padding\", key, iv);\n    return cipher.decrypt(ciphertext);\n})();", "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreScreen": "", "exploreUrl": "@js:\nvar baseUrl = source.bookSourceUrl;\nif (baseUrl && baseUrl.length > 0 && baseUrl.charAt(baseUrl.length - 1) == '/') {\n    baseUrl = baseUrl.substring(0, baseUrl.length - 1);\n}\n\nvar result = [];\nvar push = (title, tag, p, size) => result.push({\n    title: title,\n    url: baseUrl + '/api' + p + \",\" + JSON.stringify({\n        \"body\": \"{\\\"page\\\":{\\\"page\\\":{{page}},\\\"pageSize\\\":1000},\\\"category\\\":\\\"comic\\\",\\\"sort\\\":0,\\\"comic\\\":{\\\"status\\\":-1,\\\"day\\\":0,\\\"tag\\\":\\\"\" + tag + \"\\\"},\\\"video\\\":{\\\"year\\\":0,\\\"typeId\\\":0,\\\"typeId1\\\":0,\\\"area\\\":\\\"\\\",\\\"lang\\\":\\\"\\\",\\\"status\\\":-1,\\\"day\\\":0},\\\"novel\\\":{\\\"status\\\":-1,\\\"day\\\":0,\\\"sortId\\\":0}}\",\n        \"method\": \"POST\"\n    }),\n    style: {\n        layout_flexGrow: 1,\n        layout_flexBasisPercent: size\n    }\n});\n\nvar html = java.ajax(baseUrl + '/cate');\nvar doc = org.jsoup.Jsoup.parse(html);\nvar tagContainers = doc.select('.tag-container');\nvar lastContainer = tagContainers.size() > 0 ? tagContainers.get(tagContainers.size() - 1) : null;\nvar tags = lastContainer ? lastContainer.select('a') : [];\nfor (var i = 0; i < tags.size(); i++) {\n    var a = tags.get(i);\n    var size = i == 0 ? 1 : 0.25;\n    push(a.text(), a.attr('data-value'), a.attr('href'), size);\n}\nJSON.stringify(result);", "header": "{  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 8.1.0; JKM-AL00b Build/HUAWEIJKM-AL00b; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044807 Mobile Safari/537.36\"}", "lastUpdateTime": "1787136123572", "loginCheckJs": "", "loginUi": "", "loginUrl": "https://www.manwake.cc/", "respondTime": 6451, "ruleBookInfo": {"author": "a[href*=\"author\"]@text", "canReName": "", "coverUrl": "", "init": "", "intro": "p.comic-desc@text", "kind": "a[href^=\"/cate/\"]@text", "lastChapter": "a#newch@text", "name": "h2#page-title@text", "tocUrl": "", "wordCount": ""}, "ruleContent": {"content": "@js:\nvar imglist = JSON.parse(src).data.images;\nvar html = '';\nfor (var i = 0; i < imglist.length; i++) {\n    html += '<img src=\\\"' + imglist[i].url + '\\\">\\\n';\n}\nhtml", "imageDecode": "(function() {\n    var isImage = (result[0] === 0xFF && result[1] === 0xD8) ||\n        (result[0] === 0x89 && result[1] === 0x50) ||\n        (result[0] === 0x47 && result[1] === 0x49) ||\n        (result[0] === 0x52 && result[1] === 0x49);\n    if (isImage) return result;\n    var iv = result.slice(0, 16);\n    var ciphertext = result.slice(16);\n    var key = java.strToBytes('0B6666A0-BB59-1381-B746-a0E4C9AC');\n    var cipher = java.createSymmetricCrypto('AES/CBC/PKCS5Padding', key, iv);\n    return cipher.decrypt(ciphertext);\n})();", "imageStyle": "", "nextContentUrl": "@js:\nvar pageList = [];\nlet Data = JSON.parse(src).data.pagination;\nvar page = Math.ceil(Data.total / Data.page_size);\nfor (let i = 2;i <= page;i++) {\npageList.push(baseUrl.replace(\"page=1\",`page=${i}`));\n}\npageList;", "replaceRegex": "", "sourceRegex": "", "webJs": ""}, "ruleExplore": {"author": "", "bookList": "$.data.list[*]", "bookUrl": "@json:$.url##/api/comic/##/comic/", "coverUrl": "$.pic", "intro": "$.description", "kind": "$.tags", "lastChapter": "", "name": "$.title", "wordCount": ""}, "ruleSearch": {"author": "$.author", "bookList": "$.data.list", "bookUrl": "$.url", "coverUrl": "$.cover", "intro": "$.description", "kind": "$.tags", "lastChapter": "", "name": "$.title", "wordCount": ""}, "ruleToc": {"chapterList": "#chapter-grid-container a", "chapterName": "@data-title", "chapterUrl": "@href@js:\nvar baseUrl = source.bookSourceUrl;\nif (baseUrl && baseUrl.length > 0 && baseUrl.charAt(baseUrl.length - 1) == '/') {\n    baseUrl = baseUrl.substring(0, baseUrl.length - 1);\n}\nvar a = result.split(\"/\")[3];\nvar b = baseUrl + '/api/comic/image/' + a + '?count=true&page=1';\nb;", "isVip": "", "isVolume": "", "nextTocUrl": "", "updateTime": "span@text##\\n##|"}, "searchUrl": "/api/search?type=mh&page={{page}}&pageSize=20&keyword={{key}}", "variableComment": "", "weight": 0},{"schemaVersion": 1, "bookSourceName": "🍅番茄小说-JS本地代理版", "bookSourceType": 1, "bookSourceUrl": "http://192.168.1.5:18423", "ruleSearch": {"url": "search?query={{key}}", "list": "js: var d=JSON.parse(result);return d.data&&d.data.book_data?d.data.book_data:[];", "name": "js: return $.book_name;", "author": "js: return $.author;", "coverUrl": "js: return $.thumb_url;", "bookUrl": "js: return 'detail?id='+$.book_id;"}, "ruleToc": {"url": "js: return $.id.toString();", "list": "js: var d=JSON.parse(result);var vols=d.data.chapter_list_with_volume.volume_list;var arr=[];for(var i=0;i<vols.length;i++){arr=arr.concat(vols[i].chapter_list);}return arr;", "name": "js: return $.name;"}, "ruleContent": {"url": "content?id={{url}}", "content": "js: var d=JSON.parse(result);return d.content||(d.data&&d.data.content)||'获取失败，请重试';"}, "header": "{\"X-Requested-With\": \"XMLHttpRequest\"}", "lastUpdateTime": "1787122047716"},{"bookSourceComment": "xiangshuba.com 香书吧，XPath源", "bookSourceGroup": "XPath", "bookSourceName": "香书吧", "bookSourceType": 0, "bookSourceUrl": "https://www.xiangshuba.com", "bookUrlPattern": "", "customOrder": 0, "enabled": true, "enabledExplore": false, "exploreUrl": "", "lastUpdateTime": "1787110600115", "loginUrl": "", "ruleBookInfo": {"author": "//div[@class='info']//p[1]/text()", "coverUrl": "//div[@class='cover']/img/@src", "intro": "//div[@class='desc']/text()", "kind": "//div[@class='info']//p[2]/text()", "lastChapter": "//div[@class='new_chapter']/a/text()", "name": "//div[@class='info']/h1/text()", "tocUrl": "//a[text()=\"开始阅读\"]/@href"}, "ruleContent": {"content": "//div[@id='content']", "nextContentUrl": "//a[text()=\"下一章\"]/@href"}, "ruleExplore": [], "ruleSearch": {"author": ".//div[@class='search_info']/p[1]/text()", "bookList": "//div[@class='search_list']/ul/li", "bookUrl": ".//h3/a/@href", "coverUrl": ".//img/@src", "kind": ".//div[@class='search_info']/p[2]/text()", "lastChapter": "", "name": ".//h3/a/text()"}, "ruleToc": {"chapterList": "//div[@id='list']//a", "chapterName": "./text()", "chapterUrl": "./@href", "nextTocUrl": "//a[text()=\"下一页\"]/@href"}, "searchUrl": "/search.php?keyword={{key}}", "weight": 0},{"bookSourceComment": "第一版主网址导航：\nhttps://dddyyybbbzzz.xyz/\n\n网址：\nhttps://www.bz4444444.net/\nhttps://www.bz444444444.com/\nhttps://www.banzhu44444444.net/\n\n点「登录」= 进入网站手动过验证\n\n如果无法访问小说了，就重新登录网站再次手动验证，一般就可以解决问题了。", "bookSourceGroup": "R18", "bookSourceName": "第一版主·言璃版", "bookSourceType": 0, "bookSourceUrl": "https://www.banzhu44444444.net/##", "bookUrlPattern": "", "concurrentRate": "3", "customOrder": -48, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "[{\"title\":\"全部\",\"url\":\"/shuku/0-lastupdate-0-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"连载中\",\"url\":\"/shuku/0-lastupdate-1-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"已完本\",\"url\":\"/shuku/0-lastupdate-2-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"总人气\",\"url\":\"/shuku/0-allvisit-0-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"月人气\",\"url\":\"/shuku/0-monthvisit-0-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"字数\",\"url\":\"/shuku/0-size-0-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"新书\",\"url\":\"/shuku/0-postdate-0-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"玄幻奇幻\",\"url\":\"/shuku/1-lastupdate-0-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"武侠仙侠\",\"url\":\"/shuku/2-lastupdate-0-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"都市言情\",\"url\":\"/shuku/3-lastupdate-0-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"穿越历史\",\"url\":\"/shuku/4-lastupdate-0-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"科幻灵异\",\"url\":\"/shuku/5-lastupdate-0-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"藏经阁\",\"url\":\"/shuku/6-lastupdate-0-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\"其他类别\",\"url\":\"/shuku/7-lastupdate-0-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}},\n{\"title\":\" \",\"url\":\" \",\"style\":{\"layout_flexBasisPercent\":0.25,\"layout_flexGrow\":1}}]", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; U; Android 8.1.0; zh-CN; MI 8 Lite Build/OPM1.171019.019) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 UCBrowser/13.2.0.1100 Mobile Safari/537.36\"}", "lastUpdateTime": "1787083887896", "loginCheckJs": "", "loginUi": "", "loginUrl": "https://www.banzhu44444444.net/", "respondTime": 60000, "ruleBookInfo": {"author": "", "coverUrl": "", "init": "", "intro": ".bd.2@text", "kind": "", "lastChapter": "ul.list.0@li.0@text", "name": "h1@text", "wordCount": ""}, "ruleContent": {"content": "<js>\nfunction x(a, b) {\n\tresult = String(result).replace(a, b);\n}\n//debug\nfunction d(debug) {\n\tjava.log(debug);\n\tjava.log(result);\n}\n\n//同时加载多章时，自动验证成功后有的页面加载失败时重新获取\nif(/<div\\s*class=\"title\"\\s*>.*1234/.test(src)){\n \t//重新设置正文解析内容\n\tjava.setContent(java.ajax(baseUrl));\n}\n\n//获取正文内容\nresult = java.getString('.page-content@tag.p.0@html');\n\n//大概第四页正文有切割，需要调接口获取这一页剩余正文\nif (/\\$.post\\('',{'j':'1'}/.test(src)) {\n\tresult += java.ajax(String(baseUrl + ',' + JSON.stringify({\n\t\t\"method\": \"POST\",\n\t\t\"body\": \"j=1\"\n\t})))\n}\n\n//d(\"正文\"+baseUrl)\n\n//有问题修改下面正则 两个br标签换行显示\nx(/((\\s*)<br>\\n?){2}/g,\"<br><br>\");\n//d('1.0:')\nx(/<script.*<\\/script>/g,\"\");\n\ntry {\n\t// Aes解密\n\tsecret = src.match(/=\\s*secret\\(\\s*['\"](.+?)['\"],[\\s]*['\"](.+?)['\"],[^);]*?/);\n\tstring = secret[1]\n\tcode = java.md5Encode(secret[2]);\n\tiv = code.substring(0, 16);\n\tkey = code.substring(16);\n\t//java.log(baseUrl + \" Aes解密ok：\" + code + \"\\n\" + iv + \"\\n\" + key)\n\tresult = java.createSymmetricCrypto(\"AES/CBC/PKCS7Padding\", key, iv).decryptStr(string);\n} catch (err) {\n\ttry {\n\t\t// 乱序恢复\n\t\tns = java.base64Decode(src.match(/var ns='(.+?)';/)[1]).split(',');\n\t\t//java.log(baseUrl + \"乱序恢复ok\")\n\t\tparagraphArr = result.split('<br><br>');\n\t\tresult = \"\";\n\t\tfor (i = 1; i <= paragraphArr.length; i++) {\n\t\t\tresult += paragraphArr[ns[i] - ns[0]] + '<br><br>';\n\t\t}\n\t} catch (err) {\n\t\t//java.log(baseUrl + \"乱序恢复Aes解密no\")\n\t}\n}\n\n//初始化图片链接\nx(/(<img\\s+)data\\-cfsrc=\"[^\"]+\"/g,\"$1\");\nx(/[\\r\\n]?[\\t ]*<img .+?toimg\\/data\\/([^\\.]+)[^>]+>[\\t ]*[\\r\\n]?/g, \"#$1#\");\n\n//初始化字体格式的文字,匹配<i>&#xe800</i>\nx(/<i>(.*?)<\\/i>/g, function(str, p1) {\n\t//java.log(p1.charCodeAt().toString(16));\n\t//返回16进制，例：p1=&#xe800 返回格式#e800#\n\treturn '#' + p1.charCodeAt().toString(16) + '#'\n})\n//d('2.0:')\n\n//转换空格\nx(/&nbsp;/g, ' ');\n//初始化分段准备\nx(/[\\t  ]{2,2}/g, \"　\");\n\n//去掉标签里的属性\nx(/(\\<|&lt;)([^\\>]*?)(\\s|&nbsp;)[^\\>]*(\\>|&gt;)/g, \"<$2>\");\n//d('2.1:')\n//段落换行\nx(/\\s*(\\n|<br\\/?>)+\\s*(　{2,})?/gi, \"\\r\\n\");\n//d('3.0:')\n//去掉不需要的标签\nx(/([\\r\\n　]*\\<\\/?([A-Za-z]*)?\\>[\\r\\n　]*)/gi, \"\");\n\n//引号替换\nx(/‘/g, \"『\");\nx(/’/g, \"』\");\nx(/“/g, \"「\");\nx(/”/g, \"」\");\n\nif (/(Undefined|(^\\s*$))/.test(result)) {\n\tresult =\n\t\t\"<br/>　　网站分页有时有问题不可用，速度慢的时候就会是现在这样了，网站速度快的时候就没事了。<br/>　　换个时间刷新试试！！！<br/>　　换个时间刷新试试！！！<br/>　　换个时间刷新试试！！！<br/>\" + result;\n}\n\n//d(\"正文\"+baseUrl)\n\"\\r\\n\" + result + \"hereispagebreak\";\n</js>", "imageStyle": "TEXT", "nextContentUrl": ".chapterPages@tag.a!0@href@js:\nfor (let i in result) {\n\tresult[i] = String(result[i]).replace(/.+?\\('\\d+','\\d+','(\\d+)','(\\d+)'\\).+?/, (str, p1, p2) => p1 + '_' + p2 + '.html');\n}\nresult", "replaceRegex": "<js>\nfunction d(debug) {\n\tjava.log(debug);\n\tjava.log(result);\n}\n/*\nfunction x(a, b, c) {\n\tif (c) {\n\t\twhile (c.exec(result)) {\n\t\t\treplace(a, b)\n\t\t}\n\t\treturn false\n\t}\n\treplace(a, b)\n}\n*/\nfunction x(a, b, c) {\n\tif (!c) return replace(a, b);\n\twhile (c.exec(result)) {\n\t\treplace(a, b)\n\t}\n}\nfunction replace(a, b) {\n\tresult = String(result).replace(a, b);\n}\n\n// 拼音还原\nx(/#1040782805#/gi,\"奸\");\nx(/#1063785572#/gi,\"搞\");\nx(/#1082275499#/gi,\"台\");\nx(/#1218400718#/gi,\"虐\");\nx(/#1697595086#/gi,\"斩\");\nx(/#1801354585#/gi,\"勃\");\nx(/#1810002091#/gi,\"九\");\nx(/#1947937898#/gi,\"粉\");\nx(/#2022721869#/gi,\"粉\");\nx(/#2033008053#/gi,\"撸\");\nx(/#2063259833#/gi,\"色\");\nx(/#2090369734#/gi,\"熟\");\nx(/#2173857009#/gi,\"高\");\nx(/#2174754224#/gi,\"暴\");\nx(/#2276251664#/gi,\"嫩\");\nx(/#2293535402#/gi,\"兽\");\nx(/#2444947917#/gi,\"性\");\nx(/#2471389451#/gi,\"湿\");\nx(/#2525826615#/gi,\"狗\");\nx(/#2548022544#/gi,\"狗\");\nx(/#2553168545#/gi,\"穴\");\nx(/#2633701054#/gi,\"棒\");\nx(/#2761875847#/gi,\"胸\");\nx(/#2769203094#/gi,\"未\");\nx(/#2781961287#/gi,\"厥\");\nx(/#2811411890#/gi,\"亡\");\nx(/#2965616717#/gi,\"爱\");\nx(/#3043454467#/gi,\"日\");\nx(/#3089649511#/gi,\"宫\");\nx(/#3296363576#/gi,\"欲\");\nx(/#3309926634#/gi,\"宰\");\nx(/#3342690501#/gi,\"舌\");\nx(/#3382216428#/gi,\"义\");\nx(/#3746262645#/gi,\"舔\");\nx(/#3893173869#/gi,\"介\");\nx(/#4006928252#/gi,\"吞\");\nx(/#4017050851#/gi,\"交\");\nx(/#0678663477#/gi,\"情\");\nx(/#5736430795#/gi,\"内\");\nx(/#5110754259#/gi,\"吸\");\nx(/#9763512263#/gi,\"美\");\nx(/#0923672614#/gi,\"死\");\nx(/#5318824731#/gi,\"妈\");\nx(/#6197424834#/gi,\"中\");\nx(/#9925956069#/gi,\"处\");\nx(/#0486110525#/gi,\"水\");\nx(/#6378369235#/gi,\"胡\");\nx(/#5732450242#/gi,\"母\");\nx(/#8087788059#/gi,\"国\");\nx(/#6259252852#/gi,\"杀\");\nx(/#6514831790#/gi,\"血\");\nx(/#7228562021#/gi,\"纪\");\nx(/#7051993783#/gi,\"硬\");\nx(/#9636759436#/gi,\"药\");\nx(/#6789528781#/gi,\"学\");\nx(/#5213317466#/gi,\"具\");\nx(/#9134848937#/gi,\"做\");\nx(/#5910985788#/gi,\"足\");\nx(/#7074467222#/gi,\"逼\");\nx(/#5265224411#/gi,\"干\");\nx(/#9860153795#/gi,\"麻\");\nx(/#4933790542#/gi,\"枪\");\nx(/#8698737337#/gi,\"奶\");\nx(/#7051410763#/gi,\"马\");\nx(/#4740869798#/gi,\"操\");\nx(/#8478694653#/gi,\"主\");\nx(/#6855685283#/gi,\"摇\");\nx(/#6281647881#/gi,\"流\");\nx(/#0423651377#/gi,\"插\");\nx(/#4808579862#/gi,\"臀\");\nx(/#5946892177#/gi,\"淫\");\nx(/#4481675898#/gi,\"荡\");\nx(/#8280163404#/gi,\"蛋\");\nx(/#9308659858#/gi,\"射\");\nx(/#0961296593#/gi,\"弹\");\nx(/#5229950952#/gi,\"肉\");\nx(/#5260398634#/gi,\"指\");\nx(/#6050660618#/gi,\"屁\");\nx(/#5969522288#/gi,\"亲\");\nx(/#5429058065#/gi,\"弟\");\nx(/#5366734122#/gi,\"共\");\nx(/#6957748176#/gi,\"尸\");\nx(/#9928120606#/gi,\"腿\");\nx(/#0551252288#/gi,\"龟\");\nx(/#7618693335#/gi,\"呻\");\nx(/#0975893408#/gi,\"吟\");\nx(/#0026372214#/gi,\"丝\");\nx(/#5318162318#/gi,\"贱\");\nx(/#0720742117#/gi,\"乳\");\nx(/#4488426878#/gi,\"缝\");\nx(/#6768988724#/gi,\"鸡\");\nx(/#0092238155#/gi,\"阴\");\nx(/#0551722925#/gi,\"唇\");\nx(/#6534003186#/gi,\"蜜\");\nx(/#5518664754#/gi,\"骚\");\nx(/#4668655063#/gi,\"潮\");\nx(/#4766000693#/gi,\"精\");\nx(/#8666880661#/gi,\"凌\");\nx(/#5105645092#/gi,\"温\");\nx(/#5329628684#/gi,\"辱\");\nx(/#0473556214#/gi,\"含\");\nx(/#4472054519#/gi,\"咪\");\nx(/#7508904751#/gi,\"帮\");\nx(/#0783213298#/gi,\"丁\");\nx(/#9821815185#/gi,\"裸\");\nx(/#0146287633#/gi,\"露\");\nx(/#0756494362#/gi,\"偷\");\nx(/#5710915044#/gi,\"童\");\nx(/#8954155954#/gi,\"炮\");\nx(/#5004143384#/gi,\"乱\");\nx(/#9829762678#/gi,\"妇\");\nx(/#4538628495#/gi,\"挤\");\nx(/#9173059916#/gi,\"毒\");\nx(/#9720548295#/gi,\"杜\");\nx(/#7130632296#/gi,\"席\");\nx(/#8993789017#/gi,\"洞\");\nx(/#5758773674#/gi,\"棍\");\nx(/#5245263419#/gi,\"轮\");\nx(/#0261725863#/gi,\"泽\");\nx(/#9572021917#/gi,\"尿\");\nx(/#8926554707#/gi,\"炸\");\nx(/#0351216125#/gi,\"坑\");\nx(/#0050897572#/gi,\"涛\");\nx(/#4436421269#/gi,\"党\");\nx(/#8997927012#/gi,\"灭\");\nx(/#8592042303#/gi,\"腐\");\nx(/#6560841485#/gi,\"伦\");\nx(/#1607055014#/gi,\"酸\");\nx(/#2158558763#/gi,\"幼\");\nx(/#8051876761#/gi,\"漪\");\nx(/#4704630913#/gi,\"茎\");\nx(/#0519063805#/gi,\"秽\");\nx(/#8861933232#/gi,\"婊\");\nx(/#8261828414#/gi,\"肛\");\nx(/#8025291368#/gi,\"锦\");\nx(/#0813524594#/gi,\"妓\");\nx(/#2729628100#/gi,\"颅\");\nx(/#4510436554#/gi,\"菊\");\nx(/#1024850854#/gi,\"嫡\");\n//字体格式文字替换\n//替换格式规则  x(/#正则#/gi,\"文本\");\n//例：一般在字体编辑器复制出来对应的编号 uniE800或者$E800为\"的\"这个字,  正则替换格式：\n\n//净化替换\nx(/([^\\n]*?(手.?机.?看.?[小片](.?[书说])?|搜?.{0,4}索?.{0,4}第.{0,4}一.{0,4}版.{0,4}主)[^\\n]*)/gi,\"\");\nx(/([^\\n]*([最樶]新.?)?[地网].?[址祉阯].?[发發沷].?[布怖].?[页頁]?[\\:：]?[1１4４]?[^\\n]*)/g,\"\");\nx(/([^\\n]*([最寻找发].{0,3}[新回].{0,3}[网地{0,3}[址阯])[^\\n]*)/gi,\"\");\nx(/([^\\n]*\\\\u5730\\\\u5740\\\\u767c\\\\u5e03\\\\u9801[^\\n]*)/gi,\"\");\nx(/([^\\n]*[1１][a-zA-Zａ-ｚＡ-Ｚ][2２][a-zA-Zａ-ｚＡ-Ｚ][3３][a-zA-Zａ-ｚＡ-Ｚ]([4４][a-zA-Zａ-ｚＡ-Ｚ])?[^<\\r\\n]*)/gi,\"\");\nx(/([^\\n]*ＹＹＤＳＴxＴ(．ＣＣ)?[^\\n]*)/,\"\");\nx(/(.*[0０][1１][bЪｂ][ｚz].*)/gi,\"\");\nx(/(.*[真发即百更].?[正送可度多].?[网电获搜精].?[站子得索彩].?\\s?[请邮最第小].*)/gi,\"\");\nx(/([^<\\n]*?手.机.看.小.[书说][^\\n]*)/gi,\"\");\nx(/(ｂｚ２０２１)[^<\\n]+/gi,\"\");\nx(/(手机阅读小说：７７７８８７７[^\\n]*)/gi,\"\");\nx(/(diyibanzhu@gmail.com)/gi,\"\");\n(/((（待续）|(地~址~)|(手机看片))[^\\n]*)/gi,\"\");\nx(/([^\\n]*#chao#.+?#lian#.+?#jie#[^\\n]*)/gi,\"\");\nx(/([^\\n]*[wШЩ]*?.*[c℃ㄈＣ][oО⊙ò〇Ο０][mмММΜ][^\\n]*)/gi,\"\");\nx(/([^\\n]*使用chrome谷歌浏览[^\\n]*)/gi,\"\");\nx(/（苹果手机使用.+/g,\"\");\nx(/.*((５|６|７|８)X)+.*/g,\"\");\nx(/www.diyibanzhu.net/g,\"\");\n\n//分页后的断行还原\nx(/([\\r\\n]?\\s*(hereispagebreak)[\\r\\n]?\\s*)/gi, \"\");\n\n//35字换行排版恢复\nx(/([\\r\\n])((tjjtds)?.{33,39}[，、．～…\"：；'—『「\\u4e00-\\u9fa5][\\r\\n])\\s{2}/gi, \"$1$2tjjtds\", /([\\r\\n])((tjjtds)?.{33,39}[，、．～…\"：；'—『「\\u4e00-\\u9fa5][\\r\\n])\\s{2}/gi);\n\n// 换行修复\n//x(/([\\r\\n])((tjjtds)?.{33,39}[，、．～…\"：；'—『「\\u4e00-\\u9fa5][\\r\\n])\\s{2}/gi, \"$1$2tjjtds\", 1);\n\nx(/[\\r\\n](tjjtds|　+?[\\r\\n])/g, \"\");\n//为防万一，去掉汉字之间的空格\nx(/([\\u4e00-\\u9fa5])[ 　]+([\\u4e00-\\u9fa5])/g, '$1$2');\n//去掉多余换行\nx(/[\\r\\n]{2,}/g, \"\\r\\n\")\n\nx(/([「][^」]+)\\s*\\n\\s*/g, \"$1\", /([「][^」]+)\\s*\\n\\s*/g);\nx(/([\\u4e00-\\u9fa5][『「][^，。？！：；]{1,12}[」』])\\s+/g, \"$1\");\nx(/([。！？…])([『「])/g, \"$1\\r\\n　　$2\");\n// 日期换行\nfunction dateBreak(){\n  let reg = /^.{1,100}/;\n  let r100 = result.match(reg);\n  if(r100 && r100[0]){\n    let str = r100[0];\n    let reg2 = /(\\d+年\\d+月\\d+日)/\n    if(reg2.test(str)){\n      result = result.replace(reg,str.replace(reg2,'$1\\r\\n'));\n    }\n  }\n}\ndateBreak()\nx(/([\\u4e00-\\u9fa5])\\s+([\\u4e00-\\u9fa5])/g,'$1$2');\nresult;\n</js>"}, "ruleExplore": {"author": "", "bookList": "", "bookUrl": "", "coverUrl": "", "intro": "", "kind": "", "lastChapter": "", "name": "", "wordCount": ""}, "ruleSearch": {"author": ".info.0@text##\\s+字数：.*", "bookList": ".column-2 ", "bookUrl": ".name@href", "checkKeyWord": "", "coverUrl": "@js:'http://m.diyibanzhu.quest/images/jipin-default.jpg'", "intro": "", "kind": "span.0@text&&p.info.1@text##更新：", "lastChapter": ".update@a@text", "name": ".name@text", "wordCount": ".info@span@text##字数："}, "ruleToc": {"chapterList": ".chapter-list.1@li", "chapterName": "a@text", "chapterUrl": "a@href", "nextTocUrl": "text.下页@href"}, "searchUrl": "/s.php,{\n\"charset\": \"gbk\",\n\"method\":\"post\",\n\"body\":\"objectType=2&type=articlename&s={{key}}\"\n}", "weight": 0},{"bookSourceComment": "搜索不能用，只能分类看。", "bookSourceGroup": "R18", "bookSourceName": "要撸小说", "bookSourceType": 0, "bookSourceUrl": "https://www.yaoluku.com", "bookUrlPattern": "https://www\\.yaoluku\\.com/book/\\d+", "concurrentRate": "1000", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "最新::https://www.yaoluku.com/sort/{{page}}/,{\"webView\":true}\n完本::https://www.yaoluku.com/quanben/sort/{{page}}/,{\"webView\":true}\n玄幻::https://www.yaoluku.com/sort/1/{{page}}/,{\"webView\":true}\n武侠::https://www.yaoluku.com/sort/2/{{page}}/,{\"webView\":true}\n都市::https://www.yaoluku.com/sort/3/{{page}}/,{\"webView\":true}\n科幻::https://www.yaoluku.com/sort/4/{{page}}/,{\"webView\":true}\n穿越::https://www.yaoluku.com/sort/5/{{page}}/,{\"webView\":true}\n耽美::https://www.yaoluku.com/sort/6/{{page}}/,{\"webView\":true}\n游戏::https://www.yaoluku.com/sort/7/{{page}}/,{\"webView\":true}\n精品::https://www.yaoluku.com/sort/8/{{page}}/,{\"webView\":true}\n午夜::https://www.yaoluku.com/sort/9/{{page}}/,{\"webView\":true}\n", "header": "@js:\nJSON.stringify({\n  \"User-Agent\": java.getWebViewUA()\n})\n", "lastUpdateTime": "1787068347968", "respondTime": 180000, "ruleBookInfo": {"author": "meta[property='og:novel:author']@content||a[href^='/author/']@text", "coverUrl": "meta[property='og:novel:img']@content", "intro": "meta[property='og:description']@content", "kind": "meta[property='og:novel:category']@content", "lastChapter": "meta[property='og:novel:lastest_chapter_name']@content", "name": "meta[property='og:novel:book_name']@content||h1@text"}, "ruleContent": {"content": "@js:\nvar m = String(src).match(/encoded\\s*=\\s*\"([^\"]+)\"/);\nif (m) {\n  var d = String(java.base64Decode(m[1]));\n  d.replace(/永久地址.*?com/g, \"\").replace(/更多精彩小说地址.*?com/g, \"\").replace(/要撸小说/g, \"\");\n} else {\n  \"\";\n}\n", "nextContentUrl": "a[href*='next']@href||a[href*='next_page']@href", "title": "h1@text||.title@text"}, "ruleExplore": {"author": "div.li_bottom a[href^='/author/']@text##\\s", "bookList": "ul.flex > li", "bookUrl": "div.img_span a@href@js:result + ',{\"webView\":true}'", "coverUrl": "div.img_span img@data-original", "intro": "p.indent@text", "name": "h2@text", "wordCount": "em.orange@text"}, "ruleSearch": {"author": "div.li_bottom a[href^='/author/']@text##\\s", "bookList": "ul.flex > li", "bookUrl": "div.img_span a@href@js:result + ',{\"webView\":true}'", "checkKeyWord": "系统", "coverUrl": "div.img_span img@data-original", "intro": "p.indent@text", "name": "h2@text", "wordCount": "em.orange@text"}, "ruleToc": {"chapterList": "ul#ul_all_chapters > li", "chapterName": "a@text", "chapterUrl": "a@href"}, "searchUrl": "https://www.yaoluku.com/search?q={{key}}&page={{page}},{\"webView\":true}", "weight": 0},{"bookSourceComment": "UAA小说·言璃版(API+HTML混合版)。搜索/发现走官方API接口(JSON)，详情/目录/正文走移动版页面。\n【登录】本站章节分权限：前几章游客可看，第5章起需注册会员，部分章节需VIP/U币付费。登录方法：书源管理→点开本源→登录，WebView打开页面后点右上角头像，输入邮箱+密码+图形验证码登录，登录态自动保存。\n【正文】若刷新正文出现文本不全，可尝试在阅读页打开链接手动过验证码后返回刷新。", "bookSourceGroup": "成人小说", "bookSourceName": "UAA小说·言璃版", "bookSourceType": 0, "bookSourceUrl": "https://m.uaa.com", "bookUrlPattern": "https?://(www|m)\\.uaa\\.com/novel/(intro|chapter)\\?id=.*", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "[{\"title\": \"最新上架\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&size=20&orderType=1\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"最近更新\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&size=20&orderType=2\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"最多观看\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&size=20&orderType=3\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"最多收藏\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&size=20&orderType=4\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"题材\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"都市\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?category=都市&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"校园\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?category=校园&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"乱伦\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?category=乱伦&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"玄幻\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?category=玄幻&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"系统\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?category=系统&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"穿越\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?category=穿越&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"武侠\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?category=武侠&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"奇幻\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?category=奇幻&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"乡村\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?category=乡村&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"历史\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?category=历史&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"明星\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?category=明星&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"科幻\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?category=科幻&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"同人\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?category=同人&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"标签\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"后宫\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%90%8E%E5%AE%AB&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"调教\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E8%B0%83%E6%95%99&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"人妻\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E4%BA%BA%E5%A6%BB&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"剧情\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%89%A7%E6%83%85&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"熟女\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%86%9F%E5%A5%B3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"NTR\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=NTR&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"适合女生\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E9%80%82%E5%90%88%E5%A5%B3%E7%94%9F&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"反差\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%8F%8D%E5%B7%AE&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"母子\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%AF%8D%E5%AD%90&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"猎艳\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%8C%8E%E8%89%B3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"丝袜\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E4%B8%9D%E8%A2%9C&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"爽文\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%88%BD%E6%96%87&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"性奴\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%80%A7%E5%A5%B4&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"手枪文\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%89%8B%E6%9E%AA%E6%96%87&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"母女花\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%AF%8D%E5%A5%B3%E8%8A%B1&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"NTL\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=NTL&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"淫堕\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%B7%AB%E5%A0%95&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"NP\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=NP&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"群交\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%BE%A4%E4%BA%A4&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"纯爱\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%BA%AF%E7%88%B1&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"绿奴\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%BB%BF%E5%A5%B4&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"榨精\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%A6%A8%E7%B2%BE&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"痴女\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%97%B4%E5%A5%B3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"骨科\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E9%AA%A8%E7%A7%91&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"凌辱\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%87%8C%E8%BE%B1&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"异世界\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%BC%82%E4%B8%96%E7%95%8C&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"好文笔\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%A5%BD%E6%96%87%E7%AC%94&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"肉便器\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E8%82%89%E4%BE%BF%E5%99%A8&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"绿母\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%BB%BF%E6%AF%8D&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"目前犯\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%9B%AE%E5%89%8D%E7%8A%AF&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"露出\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E9%9C%B2%E5%87%BA&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"萝莉\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E8%90%9D%E8%8E%89&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"重口\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E9%87%8D%E5%8F%A3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"1v1\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=1v1&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"经典\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%BB%8F%E5%85%B8&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"恋足\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%81%8B%E8%B6%B3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"小马拉大车\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%B0%8F%E9%A9%AC%E6%8B%89%E5%A4%A7%E8%BD%A6&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"强奸\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%BC%BA%E5%A5%B8&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"姐妹花\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%A7%90%E5%A6%B9%E8%8A%B1&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"全家桶\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%85%A8%E5%AE%B6%E6%A1%B6&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"无绿\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%97%A0%E7%BB%BF&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"校花\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%A0%A1%E8%8A%B1&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"种马\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%A7%8D%E9%A9%AC&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"破处\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%A0%B4%E5%A4%84&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"出轨\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%87%BA%E8%BD%A8&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"淫妻\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%B7%AB%E5%A6%BB&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"女性视角\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%A5%B3%E6%80%A7%E8%A7%86%E8%A7%92&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"催眠\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%82%AC%E7%9C%A0&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"受孕\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%8F%97%E5%AD%95&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"暗黑\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%9A%97%E9%BB%91&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"足交\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E8%B6%B3%E4%BA%A4&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"SM\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=SM&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"甜文\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%94%9C%E6%96%87&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"隐奸\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E9%9A%90%E5%A5%B8&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"异国\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%BC%82%E5%9B%BD&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"微重口\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%BE%AE%E9%87%8D%E5%8F%A3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"父女\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%88%B6%E5%A5%B3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"产奶\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E4%BA%A7%E5%A5%B6&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"人兽\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E4%BA%BA%E5%85%BD&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"官场\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%AE%98%E5%9C%BA&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"有父\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%9C%89%E7%88%B6&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"末世\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%9C%AB%E4%B8%96&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"异种族\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%BC%82%E7%A7%8D%E6%97%8F&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"白虎\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%99%BD%E8%99%8E&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"虐心\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E8%99%90%E5%BF%83&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"交换伴侣\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E4%BA%A4%E6%8D%A2%E4%BC%B4%E4%BE%A3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"AI辅助\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=AI%E8%BE%85%E5%8A%A9&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"百合\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%99%BE%E5%90%88&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"微肉\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%BE%AE%E8%82%89&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"粗口\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%B2%97%E5%8F%A3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"下克上\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E4%B8%8B%E5%85%8B%E4%B8%8A&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"暴虐\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%9A%B4%E8%99%90&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"逆推\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E9%80%86%E6%8E%A8&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"改造\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%94%B9%E9%80%A0&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"伪娘\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E4%BC%AA%E5%A8%98&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"灵异\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%81%B5%E5%BC%82&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"复仇\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%A4%8D%E4%BB%87&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"快穿\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%BF%AB%E7%A9%BF&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"公媳\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%85%AC%E5%AA%B3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"媚黑\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%AA%9A%E9%BB%91&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"高H\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E9%AB%98H&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"药物\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E8%8D%AF%E7%89%A9&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"性转\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%80%A7%E8%BD%AC&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"浪漫\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%B5%AA%E6%BC%AB&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"肛交\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E8%82%9B%E4%BA%A4&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"触手\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E8%A7%A6%E6%89%8B&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"Futa\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=Futa&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"捆绑\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%8D%86%E7%BB%91&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"监禁\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%9B%91%E7%A6%81&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"母女\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%AF%8D%E5%A5%B3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"巨乳\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%B7%A8%E4%B9%B3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"制服诱惑\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%88%B6%E6%9C%8D%E8%AF%B1%E6%83%91&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"HE\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=HE&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"搞笑\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%90%9E%E7%AC%91&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"耽美\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E8%80%BD%E7%BE%8E&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"病娇\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%97%85%E5%A8%87&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"人妖\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E4%BA%BA%E5%A6%96&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"逆NTR\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E9%80%86NTR&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"轮奸\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E8%BD%AE%E5%A5%B8&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"认知修改\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E8%AE%A4%E7%9F%A5%E4%BF%AE%E6%94%B9&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"加料文\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%8A%A0%E6%96%99%E6%96%87&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"美腿\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%BE%8E%E8%85%BF&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"少女\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%B0%91%E5%A5%B3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"兄妹\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%85%84%E5%A6%B9&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"3P\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=3P&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"BE\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=BE&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"TS\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=TS&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"败北\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E8%B4%A5%E5%8C%97&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"恶堕\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%81%B6%E5%A0%95&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"肥臀\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E8%82%A5%E8%87%80&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"丰满肉体\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E4%B8%B0%E6%BB%A1%E8%82%89%E4%BD%93&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"古风\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%8F%A4%E9%A3%8E&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"黑丝\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E9%BB%91%E4%B8%9D&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"老师\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E8%80%81%E5%B8%88&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"绿帽视角\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%BB%BF%E5%B8%BD%E8%A7%86%E8%A7%92&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"内射中出\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%86%85%E5%B0%84%E4%B8%AD%E5%87%BA&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"轻小说\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E8%BD%BB%E5%B0%8F%E8%AF%B4&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"情趣玩具\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%83%85%E8%B6%A3%E7%8E%A9%E5%85%B7&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"少妇\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%B0%91%E5%A6%87&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"BG\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=BG&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"白给\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%99%BD%E7%BB%99&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"常识置换\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%B8%B8%E8%AF%86%E7%BD%AE%E6%8D%A2&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"姐弟\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%A7%90%E5%BC%9F&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"破除\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%A0%B4%E9%99%A4&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"完全支配\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%AE%8C%E5%85%A8%E6%94%AF%E9%85%8D&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"洗脑\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%B4%97%E8%84%91&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"JK\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=JK&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"打桩\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%89%93%E6%A1%A9&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"第一人称\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%AC%AC%E4%B8%80%E4%BA%BA%E7%A7%B0&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"骨感\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E9%AA%A8%E6%84%9F&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"黑人\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E9%BB%91%E4%BA%BA&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"继母\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%BB%A7%E6%AF%8D&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"舅妈\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E8%88%85%E5%A6%88&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"老妪\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E8%80%81%E5%A6%AA&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"乱交\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E4%B9%B1%E4%BA%A4&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"魅魔\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E9%AD%85%E9%AD%94&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"母畜化\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%AF%8D%E7%95%9C%E5%8C%96&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"年上\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%B9%B4%E4%B8%8A&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"女尊\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%A5%B3%E5%B0%8A&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"炮友\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%82%AE%E5%8F%8B&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"强制高潮\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%BC%BA%E5%88%B6%E9%AB%98%E6%BD%AE&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"翘臀\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%BF%98%E8%87%80&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"情侣\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%83%85%E4%BE%A3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"失禁\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%A4%B1%E7%A6%81&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"师徒\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%B8%88%E5%BE%92&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"室友\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%AE%A4%E5%8F%8B&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"仙子\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E4%BB%99%E5%AD%90&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"校服\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%A0%A1%E6%9C%8D&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"胁迫\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E8%83%81%E8%BF%AB&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"学生\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E5%AD%A6%E7%94%9F&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"淫语\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%B7%AB%E8%AF%AD&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"瑜伽服\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E7%91%9C%E4%BC%BD%E6%9C%8D&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"职场\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E8%81%8C%E5%9C%BA&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"治愈\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E6%B2%BB%E6%84%88&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"主仆契约\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E4%B8%BB%E4%BB%86%E5%A5%91%E7%BA%A6&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"自慰\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?includeTags=%E8%87%AA%E6%85%B0&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"篇幅\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"短篇\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&size=20&space=1\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"中篇\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&size=20&space=2\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"长篇\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&size=20&space=3\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"状态\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"已完结\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?finished=1&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"连载中\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?finished=0&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"人称视角\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"男性视角\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&person=1&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"女性视角\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&person=2&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"第二人称\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&person=3&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"第三人称\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&person=4&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"肉量\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"少肉\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&porn=1&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"中肉\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&porn=2&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"多肉\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&porn=3&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"超多肉\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&porn=4&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"取向\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"直男\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?orientation=1&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"女主\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?orientation=2&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"男男\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?orientation=3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"女女\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?orientation=4&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"来源\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"原创首发\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&size=20&source=1\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"会员上传\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&size=20&source=2\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"时段\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"今日\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&period=1&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"本周\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&period=2&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"本月\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&period=3&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"评分\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"9分+\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&score=9&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"8分+\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&score=8&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"7分+\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&score=7&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"6分+\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&score=6&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"5分+\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&score=5&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"4分+\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&score=4&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"3分+\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&score=3&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"2分+\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&score=2&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"1分+\", \"url\": \"https://m.uaa.com/api/novel/app/novel/search?page={{page}}&score=1&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}]", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\",\"Accept-Language\":\"zh-CN,zh;q=0.9\"}", "lastUpdateTime": "1787052167941", "loginUrl": "https://m.uaa.com/", "loginCheckJs": "", "loginUi": "", "ruleBookInfo": {"author": "class.item.1@tag.a.0@text", "coverUrl": "class.novel_box@tag.img@src", "intro": "{{var h=result;var s=(h.match(/评分：<span>([^<]+)<\\/span>/)||['',''])[1];var r=(h.match(/rou.svg\"\\/>([^<]+)<\\/li>/)||['',''])[1];var st=(h.match(/update_state\">状态：([^<]+)<\\/span>/)||['',''])[1];var ut=(h.match(/最新：第[^（(]*（([^）)]+)更新）/)||['',''])[1];var tags='';var tm=h.match(/<ul class=\"tag_box\">([\\s\\S]*?)<\\/ul>/);if(tm){var re=/<b>#<\\/b>([^<]+)<\\/a>/g;var m;var arr=[];while((m=re.exec(tm[1]))!==null){arr.push(m[1]);}tags='#'+arr.join('#');}var b=(h.match(/class=\"brief_box\">\\s*<div class=\"txt ellipsis\">小说简介：([\\s\\S]*?)<\\/div>/)||['',''])[1];'评分:'+s+'\\n肉量:'+r+'\\n标签:'+tags+'\\n属性:'+st+(ut?'('+ut+'更新)':'')+'\\n简介:'+b}}", "kind": "class.item.2@tag.a@text&&class.tag_box@tag.a@text&&class.props_box@tag.li.0@text", "lastChapter": "class.item.0@text##最新：|（.*更新）", "name": "class.novel_box@tag.h1@text", "tocUrl": ""}, "ruleContent": {"content": "{{var h=result;var re=/<div class=\"line\"[^>]*>([\\s\\S]*?)<\\/div>/g;var m;var arr=[];while((m=re.exec(h))!==null){var t=m[1].replace(/<[^>]*>/g,'').replace(/&nbsp;/g,' ').replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&amp;/g,'&').trim();if(!t||t.indexOf('以下正文内容已隐藏')>=0||t.indexOf('付费章节')>=0||t.indexOf('立即登录')>=0||t.indexOf('永久域名')>=0||t.indexOf('女儿骚')>=0||t.indexOf('Chrome')>=0||t.indexOf('Safari')>=0||t.indexOf('VPN')>=0||t.indexOf('电报')>=0||t.indexOf('t.me')>=0||t.indexOf('18禁')>=0||t.indexOf('最佳浏览')>=0||t.indexOf('uaadizhi')>=0)continue;arr.push(t)}arr.join('\\n')}}", "nextContentUrl": ""}, "ruleExplore": {"author": "$.authors", "bookList": "$.model.data", "bookUrl": "https://m.uaa.com/novel/intro?id={{$.id}}", "coverUrl": "$.coverUrl", "intro": "$.brief", "kind": "{{$.categories}}\n{{$.tags}}\n{{$.pornRateDesc##\\((.*)\\)##$1###}}\n{{result.finished == 1 ? \"完结\" : \"连载\"}}\n{{$.lengthTypeDesc}}\n{{$.score > 0 ? \"评分：\" + $.score : \"\"}}", "lastChapter": "({{$.updateTimeFormat}}){{$.latestUpdate}}", "name": "$.title", "wordCount": "$.wordCountFormat"}, "ruleSearch": {"author": "$.authors", "bookList": "$.model.data", "bookUrl": "https://m.uaa.com/novel/intro?id={{$.id}}", "coverUrl": "$.coverUrl", "intro": "$.brief", "kind": "{{$.categories}}\n{{$.tags}}\n{{$.pornRateDesc##\\((.*)\\)##$1###}}\n{{result.finished == 1 ? \"完结\" : \"连载\"}}\n{{$.lengthTypeDesc}}\n{{$.score > 0 ? \"评分：\" + $.score : \"\"}}", "lastChapter": "({{$.updateTimeFormat}}){{$.latestUpdate}}", "name": "$.title", "wordCount": "$.wordCountFormat"}, "ruleToc": {"chapterList": "@css:.catalog_ul li.menu", "chapterName": "@css:a@text", "chapterUrl": "@css:a@href", "isVip": "", "updateTime": ""}, "searchUrl": "https://m.uaa.com/api/novel/app/novel/search?keyword={{key}}&page={{page}}&size=20", "weight": 0},{"bookSourceComment": "本书源 来源于laizhiyu大佬\n\nwebView一劳永逸，速度没有补环境来的快，不过只有搜索使用webView，慢点应该能接受吧😄", "bookSourceGroup": "小说", "bookSourceName": "可乐小说 - webView", "bookSourceType": 0, "bookSourceUrl": "https://www.kelexs.com/", "bookUrlPattern": "https?://www\\.kelexs\\.com/book/\\w+\\.html", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nconst groups = {\n  \"二次元\": [\n    {title:\"原生幻想\", url:\"/list-25-{{page}}/\"},\n    {title:\"恋爱日常\", url:\"/list-26-{{page}}/\"},\n    {title:\"衍生同人\", url:\"/list-27-{{page}}/\"},\n    {title:\"搞笑吐槽\", url:\"/list-28-{{page}}/\"}\n  ],\n  \"男生\": [\n    {title:\"玄幻小说\", url:\"/list-4-{{page}}/\"},\n    {title:\"奇幻小说\", url:\"/list-5-{{page}}/\"},\n    {title:\"武侠小说\", url:\"/list-6-{{page}}/\"},\n    {title:\"仙侠小说\", url:\"/list-7-{{page}}/\"},\n    {title:\"都市小说\", url:\"/list-8-{{page}}/\"},\n    {title:\"军事小说\", url:\"/list-9-{{page}}/\"},\n    {title:\"历史小说\", url:\"/list-10-{{page}}/\"},\n    {title:\"游戏小说\", url:\"/list-11-{{page}}/\"},\n    {title:\"体育小说\", url:\"/list-12-{{page}}/\"},\n    {title:\"科幻小说\", url:\"/list-13-{{page}}/\"},\n    {title:\"诸天无限\", url:\"/list-14-{{page}}/\"},\n    {title:\"悬疑小说\", url:\"/list-15-{{page}}/\"}\n  ],\n  \"女生\": [\n    {title:\"古代言情\", url:\"/list-16-{{page}}/\"},\n    {title:\"仙侠奇缘\", url:\"/list-17-{{page}}/\"},\n    {title:\"现代言情\", url:\"/list-18-{{page}}/\"},\n    {title:\"浪漫青春\", url:\"/list-19-{{page}}/\"},\n    {title:\"玄幻言情\", url:\"/list-20-{{page}}/\"},\n    {title:\"悬疑推理\", url:\"/list-21-{{page}}/\"},\n    {title:\"科幻空间\", url:\"/list-22-{{page}}/\"},\n    {title:\"游戏竞技\", url:\"/list-23-{{page}}/\"},\n    {title:\"短篇言情\", url:\"/list-24-{{page}}/\"},\n    {title:\"轻小说\", url:\"/list-42-{{page}}/\"}\n  ]\n};\n\nconst list = [];\n\nlist.push({\n  title: \"频道\",\n  type: \"select\",\n  chars: [\"男生\", \"女生\", \"二次元\"],\n  default: \"男生\",\n  action: \"java.refreshExplore()\",\n  style: {layout_flexBasisPercent: 1}\n});\n\nconst selected = infoMap[\"频道\"] || \"男生\";\nconst items = groups[selected];\n\nitems.forEach(item => {\n  list.push({\n    title: item.title,\n    url: item.url,\n    style: {layout_flexBasisPercent: 0.29}\n  });\n});\n\ninfoMap.save();\nJSON.stringify(list);", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 12; Pixel 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\",\n  \"Referer\": \"https://www.kelexs.com/\"\n}", "lastUpdateTime": "1786928253902", "loginUrl": "https://www.rrssk.com/0005.html", "respondTime": 180000, "ruleBookInfo": {"author": "[property$=author]@content", "coverUrl": "[property=og:image]@content", "intro": "[property=og:description]@content", "kind": "[property$=category]@content&&\n[property$=status]@content&&\n[property$=update_time]@content", "lastChapter": "[property$=latest_chapter_name]@content", "name": "[property$=book_name]@content", "tocUrl": "@js:\nbaseUrl.replace(\"/book/\", \"/chapter/\")"}, "ruleContent": {"content": ".content > p@text\n<js>\nconst chars = \"内暴强情缝肏插逼操潮喷阴艳裸乳荡穴鸡淫苞奸胸射嫩肉骚性蒂茎陰騷奶屄成人药春迷尿粉肛龟头A精屌口狂蜜处女唇道阳虐虫妇液色颜熟交爽臀爆舔做爱欲吹自慰点gG玉幼援抽Bb水母狗户部要了奴小脚痒酥死我兽揉搓捏扣抠棍棒洞密美少摩腿春乱伦露漏浪开巨根菊巴黑豪好肥送艳被干拔乱理白刺体下面诱感快货比日妈你娘婊子配仙火叫在里子宫给聊照流群屁眼马无码友拳洞片黄偷禁套弄位脱光舒服溜舞丢还糜妻换妓招嫖娼aA毛Hh一夜本热推图书娃男抓浑圆饱满润湿滑丰腴韵尤物横陈存娇喘息麻桃透风腹长粗肿胀人紧夹吸撅起来雪发翘硕大胴双草坐挲跨柔软臂瘫媚秘破\";\nconst replacementChars = chars.split(\"\");\nreplacementChars[43] = \"AV\";\n\nvar content = String(result).replace(/<i class=\"icon icon-uni([0-9a-fA-F]{4})\"><\\/i>/g, (_, p1) =>\n  String.fromCharCode(parseInt(p1, 16))\n);\n\ncontent = content.replace(/[\\uE001-\\uE101]/g, char => {\n  let code = char.charCodeAt(0);\n  return replacementChars[code - 0xE001];\n});\n</js>", "nextContentUrl": ".btnW a:contains(下一页)@href", "title": "h1@text"}, "ruleExplore": {"author": "a[href*=author]@text", "bookList": ".dList li", "bookUrl": ".name a@href", "coverUrl": "img@src", "intro": ".intro@text", "kind": ".dlS.1@dd@text", "lastChapter": ".infoM2 dt:contains(更新：) + dd@text", "name": ".name a@text"}, "ruleSearch": {"author": ".book-card__meta-item:contains(作者：)@ownText", "bookList": ".book-card", "bookUrl": ".book-card@onclick\n@js:\nconst window = {\n  open(url){\n    let t = url.match(/t=([\\w%]+)/)?.[1];\n    if(!t) return \"\";\n    return java.base64Decode(decodeURIComponent(t))\n  }\n};\n\neval(result)", "coverUrl": "img@src", "intro": ".book-card__desc@text", "kind": ".book-tag@text&&.book-card__update@text##更新：", "name": ".book-card__title@text"}, "ruleToc": {"chapterList": "@js:\nconst chapters = [];\nif(/\\/chapter\\//.test(baseUrl)) {\n  let doc = org.jsoup.Jsoup.parse(result);\n  let elements = doc.select(\".chapListBody a\");\n  elements.forEach(a => {\n    let text = a.text().trim();\n    let href = a.attr(\"href\");\n    chapters.push({text, href})\n  })\n} else {\n  try {\n    let json = JSON.parse(result);\n    if (json.data && json.data.length > 0){\n      json.data.forEach(ch => {\n        chapters.push({\n          text: ch.chaptername,\n          href: ch.chapterurl\n        })\n      })\n    }\n  } catch (e) {\n    java.longToast(e.message)\n  }\n}\n\nchapters", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": "@js:\n(() => {\nconst nextpageList = java.getStringList(\"@@.dropDown li:not(.cur)@data-p\");\nconst jsUrl = result.match(/src=\"(\\/templates\\/js\\/[A-Za-z0-9]+\\.js)\"/)?.[1];\nif(nextpageList.size() == 0 || !jsUrl) return [];\n\nconst host = java.toURL(baseUrl).origin;\nconst cryptHtml = java.ajax(host+jsUrl);\nconst key = cryptHtml.match(/new AESCrypt\\('([A-Za-z0-9]{32})'\\)/)?.[1];\nconst iv = cryptHtml.match(/CryptoJS\\.enc\\.Utf8\\.parse\\('(\\d{16})'\\)/)?.[1];\nif(!key || !iv) return [];\n\nconst id = baseUrl.match(/chapter\\/(.*?)\\.html/)?.[1];\nconst nextpages = Array.from(nextpageList, (page) => {\n  let postBody = java.createSymmetricCrypto('AES/CBC/PKCS5Padding', key, iv).encryptBase64(JSON.stringify({\n    id: id,\n    page: page\n  }));\n  return host + '/index.php?action=loadChapterPage,' + JSON.stringify({\n\t   \"method\": \"POST\",\n\t   \"body\": \"data=\"+encodeURIComponent(postBody)\n  })\n});\n\nreturn nextpages\n})()"}, "searchUrl": "@js:\n(function() {\n\t var host = \"https://www.rrssk.com\";\n  var homeUrl = host + \"/0005.html\"; \n  var homeHtml = String(java.ajax(homeUrl));\n  var tMatch = homeHtml.match(/name=\"_t\" value=\"([^\"]+)\"/);\n  var t = tMatch ? tMatch[1] : null;\n  if (!t) return;\n  homeHtml = homeHtml\n  .replace(/<link[^>]*>/gi, '')\n  .replace(/<img[^>]*>/gi, '')\n  .replace(/<svg[\\s\\S]*?<\\/svg>/gi, '')\n  .replace(/<footer[\\s\\S]*?<\\/footer>/gi, '');\n\n  var ts = Math.floor(Date.now() / 1000);\n  var kw = encodeURIComponent(key);\n  \n  var injectedJs = String('window.__SIGN.f(\"' + kw + '\", \"' + t + '\", ' + ts + ')');\n  \n  var s = String(java.webView(homeHtml, homeUrl, injectedJs, false));\n  \n  if (!s || s === \"00000000\") return;\n  \n  var postBody = \"_t=\" + encodeURIComponent(t) +\n    \"&_ts=\" + ts +\n    \"&_s=\" + encodeURIComponent(s) +\n    \"&keyword=\" + kw;\n  \n  var actionMatch = homeHtml.match(/action=[\"'](\\/\\?action=\\w+)[\"']/);\n  var action = actionMatch ? actionMatch[1] : \"\";\n  if (!action) return;\n  \n  return host + action + \",\" + JSON.stringify({\n    method: \"POST\",\n    body: postBody\n  });\n})();", "weight": 0},{"bookSourceComment": "UAA有爱爱(API+HTML混合版)。搜索/发现走官方API接口(JSON)，详情/目录/正文走移动版页面。\n【登录】本站章节分权限：前几章游客可看，第5章起需注册会员，部分章节需VIP/U币付费。登录方法：书源管理→点开本源→登录，WebView打开页面后点右上角头像，输入邮箱+密码+图形验证码登录，登录态自动保存。\n【正文】若刷新正文出现文本不全，可尝试在阅读页打开链接手动过验证码后返回刷新。", "bookSourceGroup": "成人小说", "bookSourceName": "UAA小说·言璃版", "bookSourceType": 0, "bookSourceUrl": "https://www.uaa.com", "bookUrlPattern": "https?://(www|m)\\.uaa\\.com/novel/(intro|chapter)\\?id=.*", "customOrder": 0, "enabled": true, "enabledExplore": true, "exploreUrl": "[{\"title\": \"最新上架\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&size=20&orderType=1\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"最近更新\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&size=20&orderType=2\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"最多观看\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&size=20&orderType=3\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"最多收藏\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&size=20&orderType=4\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"题材\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"都市\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?category=都市&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"校园\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?category=校园&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"乱伦\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?category=乱伦&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"玄幻\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?category=玄幻&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"系统\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?category=系统&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"穿越\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?category=穿越&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"武侠\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?category=武侠&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"奇幻\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?category=奇幻&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"乡村\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?category=乡村&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"历史\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?category=历史&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"明星\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?category=明星&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"科幻\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?category=科幻&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"同人\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?category=同人&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"标签\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"后宫\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%90%8E%E5%AE%AB&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"调教\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E8%B0%83%E6%95%99&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"人妻\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E4%BA%BA%E5%A6%BB&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"剧情\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%89%A7%E6%83%85&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"熟女\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%86%9F%E5%A5%B3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"NTR\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=NTR&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"适合女生\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E9%80%82%E5%90%88%E5%A5%B3%E7%94%9F&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"反差\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%8F%8D%E5%B7%AE&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"母子\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%AF%8D%E5%AD%90&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"猎艳\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%8C%8E%E8%89%B3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"丝袜\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E4%B8%9D%E8%A2%9C&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"爽文\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%88%BD%E6%96%87&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"性奴\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%80%A7%E5%A5%B4&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"手枪文\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%89%8B%E6%9E%AA%E6%96%87&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"母女花\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%AF%8D%E5%A5%B3%E8%8A%B1&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"NTL\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=NTL&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"淫堕\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%B7%AB%E5%A0%95&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"NP\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=NP&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"群交\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%BE%A4%E4%BA%A4&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"纯爱\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%BA%AF%E7%88%B1&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"绿奴\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%BB%BF%E5%A5%B4&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"榨精\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%A6%A8%E7%B2%BE&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"痴女\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%97%B4%E5%A5%B3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"骨科\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E9%AA%A8%E7%A7%91&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"凌辱\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%87%8C%E8%BE%B1&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"异世界\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%BC%82%E4%B8%96%E7%95%8C&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"好文笔\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%A5%BD%E6%96%87%E7%AC%94&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"肉便器\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E8%82%89%E4%BE%BF%E5%99%A8&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"绿母\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%BB%BF%E6%AF%8D&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"目前犯\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%9B%AE%E5%89%8D%E7%8A%AF&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"露出\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E9%9C%B2%E5%87%BA&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"萝莉\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E8%90%9D%E8%8E%89&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"重口\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E9%87%8D%E5%8F%A3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"1v1\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=1v1&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"经典\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%BB%8F%E5%85%B8&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"恋足\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%81%8B%E8%B6%B3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"小马拉大车\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%B0%8F%E9%A9%AC%E6%8B%89%E5%A4%A7%E8%BD%A6&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"强奸\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%BC%BA%E5%A5%B8&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"姐妹花\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%A7%90%E5%A6%B9%E8%8A%B1&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"全家桶\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%85%A8%E5%AE%B6%E6%A1%B6&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"无绿\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%97%A0%E7%BB%BF&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"校花\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%A0%A1%E8%8A%B1&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"种马\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%A7%8D%E9%A9%AC&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"破处\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%A0%B4%E5%A4%84&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"出轨\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%87%BA%E8%BD%A8&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"淫妻\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%B7%AB%E5%A6%BB&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"女性视角\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%A5%B3%E6%80%A7%E8%A7%86%E8%A7%92&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"催眠\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%82%AC%E7%9C%A0&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"受孕\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%8F%97%E5%AD%95&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"暗黑\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%9A%97%E9%BB%91&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"足交\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E8%B6%B3%E4%BA%A4&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"SM\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=SM&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"甜文\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%94%9C%E6%96%87&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"隐奸\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E9%9A%90%E5%A5%B8&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"异国\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%BC%82%E5%9B%BD&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"微重口\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%BE%AE%E9%87%8D%E5%8F%A3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"父女\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%88%B6%E5%A5%B3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"产奶\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E4%BA%A7%E5%A5%B6&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"人兽\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E4%BA%BA%E5%85%BD&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"官场\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%AE%98%E5%9C%BA&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"有父\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%9C%89%E7%88%B6&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"末世\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%9C%AB%E4%B8%96&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"异种族\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%BC%82%E7%A7%8D%E6%97%8F&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"白虎\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%99%BD%E8%99%8E&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"虐心\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E8%99%90%E5%BF%83&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"交换伴侣\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E4%BA%A4%E6%8D%A2%E4%BC%B4%E4%BE%A3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"AI辅助\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=AI%E8%BE%85%E5%8A%A9&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"百合\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%99%BE%E5%90%88&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"微肉\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%BE%AE%E8%82%89&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"粗口\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%B2%97%E5%8F%A3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"下克上\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E4%B8%8B%E5%85%8B%E4%B8%8A&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"暴虐\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%9A%B4%E8%99%90&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"逆推\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E9%80%86%E6%8E%A8&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"改造\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%94%B9%E9%80%A0&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"伪娘\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E4%BC%AA%E5%A8%98&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"灵异\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%81%B5%E5%BC%82&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"复仇\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%A4%8D%E4%BB%87&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"快穿\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%BF%AB%E7%A9%BF&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"公媳\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%85%AC%E5%AA%B3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"媚黑\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%AA%9A%E9%BB%91&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"高H\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E9%AB%98H&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"药物\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E8%8D%AF%E7%89%A9&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"性转\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%80%A7%E8%BD%AC&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"浪漫\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%B5%AA%E6%BC%AB&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"肛交\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E8%82%9B%E4%BA%A4&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"触手\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E8%A7%A6%E6%89%8B&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"Futa\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=Futa&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"捆绑\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%8D%86%E7%BB%91&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"监禁\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%9B%91%E7%A6%81&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"母女\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%AF%8D%E5%A5%B3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"巨乳\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%B7%A8%E4%B9%B3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"制服诱惑\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%88%B6%E6%9C%8D%E8%AF%B1%E6%83%91&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"HE\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=HE&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"搞笑\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%90%9E%E7%AC%91&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"耽美\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E8%80%BD%E7%BE%8E&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"病娇\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%97%85%E5%A8%87&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"人妖\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E4%BA%BA%E5%A6%96&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"逆NTR\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E9%80%86NTR&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"轮奸\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E8%BD%AE%E5%A5%B8&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"认知修改\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E8%AE%A4%E7%9F%A5%E4%BF%AE%E6%94%B9&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"加料文\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%8A%A0%E6%96%99%E6%96%87&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"美腿\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%BE%8E%E8%85%BF&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"少女\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%B0%91%E5%A5%B3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"兄妹\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%85%84%E5%A6%B9&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"3P\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=3P&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"BE\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=BE&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"TS\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=TS&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"败北\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E8%B4%A5%E5%8C%97&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"恶堕\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%81%B6%E5%A0%95&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"肥臀\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E8%82%A5%E8%87%80&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"丰满肉体\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E4%B8%B0%E6%BB%A1%E8%82%89%E4%BD%93&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"古风\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%8F%A4%E9%A3%8E&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"黑丝\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E9%BB%91%E4%B8%9D&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"老师\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E8%80%81%E5%B8%88&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"绿帽视角\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%BB%BF%E5%B8%BD%E8%A7%86%E8%A7%92&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"内射中出\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%86%85%E5%B0%84%E4%B8%AD%E5%87%BA&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"轻小说\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E8%BD%BB%E5%B0%8F%E8%AF%B4&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"情趣玩具\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%83%85%E8%B6%A3%E7%8E%A9%E5%85%B7&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"少妇\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%B0%91%E5%A6%87&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"BG\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=BG&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"白给\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%99%BD%E7%BB%99&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"常识置换\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%B8%B8%E8%AF%86%E7%BD%AE%E6%8D%A2&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"姐弟\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%A7%90%E5%BC%9F&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"破除\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%A0%B4%E9%99%A4&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"完全支配\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%AE%8C%E5%85%A8%E6%94%AF%E9%85%8D&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"洗脑\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%B4%97%E8%84%91&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"JK\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=JK&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"打桩\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%89%93%E6%A1%A9&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"第一人称\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%AC%AC%E4%B8%80%E4%BA%BA%E7%A7%B0&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"骨感\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E9%AA%A8%E6%84%9F&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"黑人\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E9%BB%91%E4%BA%BA&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"继母\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%BB%A7%E6%AF%8D&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"舅妈\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E8%88%85%E5%A6%88&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"老妪\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E8%80%81%E5%A6%AA&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"乱交\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E4%B9%B1%E4%BA%A4&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"魅魔\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E9%AD%85%E9%AD%94&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"母畜化\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%AF%8D%E7%95%9C%E5%8C%96&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"年上\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%B9%B4%E4%B8%8A&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"女尊\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%A5%B3%E5%B0%8A&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"炮友\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%82%AE%E5%8F%8B&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"强制高潮\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%BC%BA%E5%88%B6%E9%AB%98%E6%BD%AE&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"翘臀\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%BF%98%E8%87%80&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"情侣\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%83%85%E4%BE%A3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"失禁\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%A4%B1%E7%A6%81&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"师徒\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%B8%88%E5%BE%92&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"室友\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%AE%A4%E5%8F%8B&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"仙子\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E4%BB%99%E5%AD%90&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"校服\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%A0%A1%E6%9C%8D&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"胁迫\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E8%83%81%E8%BF%AB&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"学生\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E5%AD%A6%E7%94%9F&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"淫语\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%B7%AB%E8%AF%AD&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"瑜伽服\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E7%91%9C%E4%BC%BD%E6%9C%8D&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"职场\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E8%81%8C%E5%9C%BA&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"治愈\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E6%B2%BB%E6%84%88&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"主仆契约\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E4%B8%BB%E4%BB%86%E5%A5%91%E7%BA%A6&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"自慰\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?includeTags=%E8%87%AA%E6%85%B0&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"篇幅\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"短篇\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&size=20&space=1\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"中篇\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&size=20&space=2\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"长篇\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&size=20&space=3\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"状态\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"已完结\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?finished=1&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"连载中\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?finished=0&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"人称视角\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"男性视角\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&person=1&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"女性视角\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&person=2&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"第二人称\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&person=3&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"第三人称\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&person=4&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"肉量\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"少肉\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&porn=1&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"中肉\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&porn=2&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"多肉\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&porn=3&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"超多肉\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&porn=4&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"取向\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"直男\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?orientation=1&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"女主\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?orientation=2&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"男男\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?orientation=3&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"女女\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?orientation=4&page={{page}}&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"来源\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"原创首发\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&size=20&source=1\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"会员上传\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&size=20&source=2\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4}}, {\"title\": \"时段\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"今日\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&period=1&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"本周\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&period=2&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"本月\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&period=3&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"评分\", \"url\": \"\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"9分+\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&score=9&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"8分+\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&score=8&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"7分+\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&score=7&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"6分+\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&score=6&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"5分+\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&score=5&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"4分+\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&score=4&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"3分+\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&score=3&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"2分+\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&score=2&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}, {\"title\": \"1分+\", \"url\": \"https://www.uaa.com/api/novel/app/novel/search?page={{page}}&score=1&size=20\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2}}]", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\",\"Accept-Language\":\"zh-CN,zh;q=0.9\"}", "lastUpdateTime": "1786772076813", "loginUrl": "https://m.uaa.com/novel/list", "ruleBookInfo": {"author": "class.item.1@tag.a.0@text", "coverUrl": "class.novel_box@tag.img@src", "intro": "{{var h=result;var s=(h.match(/评分：<span>([^<]+)<\\/span>/)||['',''])[1];var r=(h.match(/rou.svg\"\\/>([^<]+)<\\/li>/)||['',''])[1];var st=(h.match(/update_state\">状态：([^<]+)<\\/span>/)||['',''])[1];var ut=(h.match(/最新：第[^（(]*（([^）)]+)更新）/)||['',''])[1];var tags='';var tm=h.match(/<ul class=\"tag_box\">([\\s\\S]*?)<\\/ul>/);if(tm){var re=/<b>#<\\/b>([^<]+)<\\/a>/g;var m;var arr=[];while((m=re.exec(tm[1]))!==null){arr.push(m[1]);}tags='#'+arr.join('#');}var b=(h.match(/class=\"brief_box\">\\s*<div class=\"txt ellipsis\">小说简介：([\\s\\S]*?)<\\/div>/)||['',''])[1];'评分:'+s+'\\n肉量:'+r+'\\n标签:'+tags+'\\n属性:'+st+(ut?'('+ut+'更新)':'')+'\\n简介:'+b}}", "kind": "class.item.2@tag.a@text&&class.tag_box@tag.a@text&&class.props_box@tag.li.0@text", "lastChapter": "class.item.0@text##最新：|（.*更新）", "name": "class.novel_box@tag.h1@text", "tocUrl": ""}, "ruleContent": {"content": "@css:.article .line@textNodes##以下正文内容已隐藏[\\s\\S]*##", "nextContentUrl": ""}, "ruleExplore": {"author": "$.authors", "bookList": "$.model.data", "bookUrl": "https://m.uaa.com/novel/intro?id={{$.id}}", "coverUrl": "$.coverUrl", "intro": "$.brief", "kind": "{{$.categories}}\n{{$.tags}}\n{{$.pornRateDesc##\\((.*)\\)##$1###}}\n{{result.finished == 1 ? \"完结\" : \"连载\"}}\n{{$.lengthTypeDesc}}\n{{$.score > 0 ? \"评分：\" + $.score : \"\"}}", "lastChapter": "({{$.updateTimeFormat}}){{$.latestUpdate}}", "name": "$.title", "wordCount": "$.wordCountFormat"}, "ruleSearch": {"author": "$.authors", "bookList": "$.model.data", "bookUrl": "https://m.uaa.com/novel/intro?id={{$.id}}", "coverUrl": "$.coverUrl", "intro": "$.brief", "kind": "{{$.categories}}\n{{$.tags}}\n{{$.pornRateDesc##\\((.*)\\)##$1###}}\n{{result.finished == 1 ? \"完结\" : \"连载\"}}\n{{$.lengthTypeDesc}}\n{{$.score > 0 ? \"评分：\" + $.score : \"\"}}", "lastChapter": "({{$.updateTimeFormat}}){{$.latestUpdate}}", "name": "$.title", "wordCount": "$.wordCountFormat"}, "ruleToc": {"chapterList": "@css:.catalog_ul li.menu", "chapterName": "@css:a@text", "chapterUrl": "@css:a@href", "isVip": "", "updateTime": ""}, "searchUrl": "https://www.uaa.com/api/novel/app/novel/search?keyword={{key}}&page={{page}}&size=20", "weight": 0},{"bookSourceGroup": "木里阅读", "bookSourceName": "🍅木里书屋🍅", "bookSourceType": 0, "bookSourceUrl": "https://mulides-pyfq.ms.show/", "customButton": false, "customOrder": -1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\n\nlet sort = [];\npush = (title, url, type) => sort.push({\n    title: title,\n    url: url,\n    style: {\n        layout_flexBasisPercent: type\n    }\n});\n    push('番茄书架', 'https://fanqienovel.com/reading/bookapi/bookshelf/info/v:version/?aid=1967&iid=0&version_code=56910&update_version_code=56910', 1);\n    push('巅峰榜单', 'https://fanqienovel.com/api/author/misc/top_book_list/v1/?limit=100&offset=0', 0.29);\n    push('出版榜单', 'https://fanqienovel.com/api/node/publication/list?page_index=0&page_count=100', 0.29);\n    push('爆更榜单', 'https://api-lf.fanqiesdk.com/api/novel/channel/homepage/rank/rank_list/v2/?aid=13&limit=50&offset=0&side_type=15&type=1', 0.29);\n    push('黑马榜单', 'https://api-lf.fanqiesdk.com/api/novel/channel/homepage/rank/rank_list/v2/?aid=13&limit=50&offset=0&side_type=13&type=1', 0.29);\n    push('热搜榜单', 'https://api-lf.fanqiesdk.com/api/novel/channel/homepage/rank/rank_list/v2/?aid=13&limit=50&offset=&side_type=12&type=1', 0.29);\t\n    push('每周推荐', 'https://fanqienovel.com/api/rank/recommend/list?type=1&limit=10&offset=0', 0.29);\t\n\t\n\tA=[[\"推荐\",\"10\"],[\"完结\",\"11\"],[\"热搜\",\"12\"]]\t;\n[[\"男频\",\"1\"],[\"女频\",\"0\"]].map([title,id]=>{\n\tpush('❤️'+title+'榜单❤️', null, 1);\n\tif(id==2){ \tA=A.slice(1,A.length-1) }\n\t\tA.map([title,uri]=>{\t\t\t\n\t\t  \turl= `https://novel.snssdk.com/api/novel/channel/homepage/rank/rank_list/v2/?aid=13&app_name=news_article&app_version=9.7.3&channel=tengxun_tt&device_platform=android&os=android&device_type=ProjectTitan&os_api=29&os_version=10&openlive_plugin_status=1&isTTWebViewHeifSupport=0&limit=100&offset={{(page-1)*100}}&side_type=${uri}&type=${id}`;\n\t\t\t\tpush(title, url, 0.29);\t\t\t\n\t\t\t});\n\t});\t\n\t\n\tcategory = () =>{\n\t\t\tcategory_url = \"https://novel.snssdk.com/api/novel/channel/homepage/new_category/page/data/v1/?aid=13\";\nreturn  JSON.parse(java.ajax(category_url)).data\t\t\n\t\t}\n\t\t  \n  json = (data) => {\n     boy = data.boy_category;\n     girl = data.girl_category;\n     publish = data.publish_category;\n     json = [[\"男频\",\"gender=1\",boy],[\"女频\",\"gender=0\",girl],[\"出版\",\"genre_type=160\",publish]];\n     return JSON.parse(JSON.stringify(json));\n   }\t\n\t\tjson(category()).map([tit1,gender,category]=>{\n\t    push('❤️'+tit1+'❤️', null, 1);\n     category.map(($,index)=>{\n     \tindex++;\n\t    title = $.category_name;\n     \tcid = $.category_id;\n\t    url=  `https://novel.snssdk.com/api/novel/channel/homepage/new_category/book_list/v1/?aid=1967&app_name=news_article&app_version=9.7.3&channel=tengxun_tt&creation_status=9&device_platform=android&enter_from=novel_category&novel_host&novel_version&version_code=973&version_name=9.7.3&word_count=9&os=android&device_type=ProjectTitan&os_api=29&os_version=10&offset={{(page-1)*100}}&limit=100&category_id=${cid}&${gender}`;\n\t\t\t\tpush(title, url, 0.29);\t\n      });\n  });\nJSON.stringify(sort);", "header": "{\n\t\"user-agent\":\"Mozilla/5.0 (Linux; Android 10; TAS-AN00 Build/HUAWEITAS-AN00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/114.0.5735.61 Mobile Safari/537.36 Super 4.6.5\"\n}", "lastUpdateTime": "1786697045762", "loginUrl": "https://fanqienovel.com", "respondTime": 180000, "ruleBookInfo": {"author": "$.book.author", "coverUrl": "$.book.thumb_url", "intro": "&nbsp;&nbsp;\n🆔ID:{{$.book.book_id}}\n📕 书名：{{$..book_name}}\n📇 状态：__status__-连载{{$..creation_status}}完结\n⌨️ 字数：{{$..word_count}}字\n📎 分类：{{$..category##/##,}}\n🏷️ 标签：🏷{{$..tags}}\n📜 简介：\n{{$..abstract}}", "kind": "男生{{$..gender}}女生\n{{$..category}}\n连载{{$..creation_status}}完结\n{{$..score}}分\n{{java.timeFormatUTC(java.getString(\"$..last_chapter_update_time\")*1000,'yyyy-MM-dd',8)}} \n##连载0|1完结|男生0|1女生\n@js:result\n.replace(\"男生2女生\",\"出版\")\n.replace(\"连载4完结\",\"断更\")\n.replace(\"连载-1完结\",\"未知\");", "lastChapter": "{{$..last_chapter_title}} • {{java.timeFormat(java.getString(\"$..last_chapter_update_time\")*1000)}}", "name": "$.book.book_name@put:{book_id: $.book.book_id}", "tocUrl": "https://fanqienovel.com/api/reader/directory/detail?bookId={{$..book_id}}", "wordCount": "$..word_count"}, "ruleContent": {"content": "$.content", "title": "$.title"}, "ruleExplore": {"author": "author##</?em>", "bookList": "<js>\nlet list = [];\nlet resultData = JSON.parse(result);\n\nlet targetData = resultData.data || resultData.list || resultData.book_list || \n                resultData.publication_list || resultData.result || resultData;\n                \nif (targetData != null && targetData.book_shelf_info) {\n    let bookIds = targetData.book_shelf_info.map(item => `{\"book_id\": \"${item.book_id}\"}`).join(',');\n    \n    let booksData = java.ajax(\n`https://fanqienovel.com/api/bookshelf/multidetail,{\"method\": \"post\",\"body\": {\"books\":[${bookIds}]}}`\n        );\n    \n    let books = JSON.parse(booksData).data.detail_list;\n    for (let i in books) {\n        let d = books[i];\n        list.push({\n            src: d,\n            book_name: d.book_name,\n            author: d.author,\n            category:d.category,\n            tags:d.tags,\n            word_number:d.word_number,\n            lastChapterTitle: d.last_chapter_title,\n            abstract: d.abstract,\n            book_id: d.book_id,\n        });\n    }\n} else {\n    list = targetData.content || targetData;\n}\n\nJSON.stringify({data: list})\n</js>\ndata.data||data.list||book_list||data.publication_list||data.result||data", "bookUrl": "https://mulides-pyfq.ms.show/api/book/{{$.book_id||$.bookId}}", "coverUrl": "http://p6-novel.byteimg.com/large/{$.thumb_uri}||$.thumb_url||thumbUri", "intro": "$.abstract", "kind": "category&&source", "lastChapter": "last_chapter_title", "name": "book_name||bookName", "wordCount": "word_number"}, "ruleSearch": {"author": "author##</?em>", "bookList": "$.data.ret_data.*||$..book_info[*]", "bookUrl": "https://mulides-pyfq.ms.show/api/book/@get:{book_id}", "checkKeyWord": "我的26岁女房客", "coverUrl": ".audio_thumb_uri", "intro": ".abstract", "kind": "category&&score", "name": "book_name||title@put:{book_id: book_id}##<em>|</em>|《|》", "wordCount": "连载{{$.creation_status}}完结##连载0|1完结"}, "ruleToc": {"chapterList": "$.data.chapterListWithVolume[*].*", "chapterName": "$.title", "chapterUrl": "https://mulides-pyfq.ms.show/api/book/@get:{book_id}/chapter/{{$.itemId}}", "formatJs": "$.volume_name", "updateTime": "发布于 {{java.timeFormat(java.getString('$.firstPassTime')*1000)}}"}, "searchUrl": "https://novel.snssdk.com/api/novel/channel/homepage/search/search/v1/?device_platform=android&parent_enterfrom=novel_channel_search.tab.&offset={{(page-1)*10}}&aid=1967&q={{key}}", "weight": 0},{"bookSourceName": "Hi歌曲音乐网", "bookSourceType": 1, "bookSourceUrl": "https://higequ.com", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "飙升榜::https://higequ.com/biaosheng/?page={{page}}\n新歌榜单::https://higequ.com/xinge/?page={{page}}\n热歌榜单::https://higequ.com/rege/?page={{page}}\n抖音音乐榜::https://higequ.com/dy/?page={{page}}\n经典怀旧榜::https://higequ.com/jdhj/?page={{page}}\n影视金曲榜::https://higequ.com/ys/?page={{page}}\n网红新歌榜::https://higequ.com/wh/?page={{page}}\n儿歌排行榜::https://higequ.com/erge/?page={{page}}\n车载排行榜::https://higequ.com/cz/?page={{page}}\nDJ音乐排行榜::https://higequ.com/dj/?page={{page}}\n华语榜::https://higequ.com/huayu/?page={{page}}\n粤语榜::https://higequ.com/yueyu/?page={{page}}\n欧美榜::https://higequ.com/oumei/?page={{page}}\n韩语榜::https://higequ.com/hanyu/?page={{page}}\n日语榜::https://higequ.com/riyu/?page={{page}}\n流行趋势榜::https://higequ.com/lxqs/?page={{page}}\n极品电音榜::https://higequ.com/jpdy/?page={{page}}\n跑步健身榜::https://higequ.com/pbjs/?page={{page}}\nKTV点唱榜::https://higequ.com/ktvdc/?page={{page}}\nThe Billboard::https://higequ.com/bill/?page={{page}}", "header": " {\n    \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\",\n    \"Referer\": \"https://higequ.com/\"\n  }", "lastUpdateTime": "1786544960789", "loginUrl": "https://higequ.com/", "respondTime": 180000, "ruleBookInfo": {"author": "@js:decodeURIComponent((baseUrl.match(/artist=([^&]+)/)||['',''])[1])", "coverUrl": "@js:var m=result.match(/og:image\\\" content=\\\"([^\\\"]+)\\\"/);m?m[1]:'';", "intro": "@js:\nvar nm = decodeURIComponent((baseUrl.match(/name=([^&]+)/)||['',''])[1]);\nvar ar = decodeURIComponent((baseUrl.match(/artist=([^&]+)/)||['',''])[1]);\n'　　🎵 歌曲：' + nm + '\\n' + '　　🎤 歌手：' + ar;", "kind": "", "name": "@js:decodeURIComponent((baseUrl.match(/name=([^&]+)/)||['',''])[1])", "tocUrl": ""}, "ruleContent": {"content": "@js:\nvar m = result.match(/let code = \"([A-Za-z0-9+/=]+)\"/);\nvar url = '';\nif (m) {\n  var bytes = Packages.android.util.Base64.decode(m[1], 0);\n  url = String(new Packages.java.lang.String(bytes, 'UTF-8'));\n}\nurl ? url : baseUrl;"}, "ruleExplore": {"author": ".result-artist@text", "bookList": ".result-item", "bookUrl": "@js:\nvar rid = String(result.attr('data-rid'));\nvar nm = String(result.select('.result-title').first().text());\nvar ar = String(result.select('.result-artist').first().text());\n'https://higequ.com/player/' + rid + '/?name=' + encodeURIComponent(nm) + '&artist=' + encodeURIComponent(ar);\"\n  }", "intro": ".result-album@text", "kind": ".result-album@text", "name": ".result-title@text"}, "ruleSearch": {"author": "class.result-artist@text", "bookList": "class.result-item", "bookUrl": "@js:\nvar rid = String(result.attr('data-rid'));\nvar nm = String(result.select('.result-title').first().text());\nvar ar = String(result.select('.result-artist').first().text());\n'https://higequ.com/player/' + rid + '/?name=' + encodeURIComponent(nm) + '&artist=' + encodeURIComponent(ar);", "intro": "class.result-album@text", "kind": "class.result-album@text", "name": "class.result-title@text"}, "ruleToc": {"chapterList": "@js:\nvar nm = decodeURIComponent((baseUrl.match(/name=([^&]+)/)||['','未知歌曲'])[1]);\n[JSON.stringify({name: nm, url: baseUrl})];", "chapterName": "$.name", "chapterUrl": "$.url"}, "searchUrl": "/s/{{key}}/{{page}}", "weight": 0, "bookSourceComment": "by狼崽儿 //2026.8.12\n套的是kuwo的音源，全面可放。\n仅歌曲。搜索页无封面，详情页有。\n同源网，但是网络结构不太一样：\nhttps://inmp3.com/\nhttps://xingehui.com/"},{"bookSourceComment": "书旗评论api密码加群或者tg拿，免费！\n纯本地书旗源，免费看全部，评论走服务器\n1045801523群号\n纯免费，盗版源\ntg：https://t.me/+1F9ippiIxbVmZmM1", "bookSourceGroup": "api,shuqi", "bookSourceName": "书旗小说本地源（同人）", "bookSourceType": 0, "bookSourceUrl": "https://ocean.shuqireader.com#1", "customButton": false, "customOrder": -1, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nsort=[];\npush=(title,url,type1,type2)=>sort.push({\n\t\ttitle: title,\n\t\turl: url,\n\t\tstyle: {\n\t\t\t\tlayout_flexGrow: type1,\n\t\t\t\tlayout_flexBasisPercent: type2\n\t\t\t}\n\t});\n\t\n   \n\t\t\n\t\tfunction category(groupKey) {\t\t\t\t\t\t\t\n\t\t\t params = \"groupKey=\"+groupKey+\"&source=1\";\n    path = \"/api/bcsbizai/category/column/allitems\";\n    url = GetUrl(path, params);\t\t\t\n     return  JSON.parse(java.ajax(url)).data.items; \t\t\n\t\t}\n\n\nconst categorizedData = (i) => {\n  return category(i).reduce((acc, curr) => {\n    const { itemKey, itemSubType, itemName, itemId } = curr;    \n    const originalKey = itemSubType.includes(itemKey) ? itemKey : itemSubType;\n   iTag = itemKey == \"TAG\"?\"tagIds\":itemSubType.includes(\"SECOND\")?\"secondCategoryId\":\"firstCategoryId\";\n    \n    // 键名映射规则\n    const keyMap = {\n      \"CATEGORY\": \"分类\",\n      \"MAIN_LINE\": \"题材\",\n      \"PLOT\": \"情节\",\n      \"ROLE\": \"角色\",\n      \"STYLE\": \"风格\"\n    };\n    // 应用映射后的键名\n    const categoryKey = keyMap[originalKey] || originalKey;\n    \n    // 检查分类是否已经存在\n    let category = acc.find(item => item[0] === categoryKey);\n    // 如果分类不存在，创建新的分类项\n    if (category) {\n      category[1].push([itemName, itemId, iTag]);\n    } else {\n      acc.push([categoryKey, [[itemName, itemId, iTag]]]);\n    }\n    return acc;\n  }, []);\n};\n\t\t\n\t\tcategoryList = (i) =>{\n \t categoryList = categorizedData(i).map([title,list]=>{\t\t\t\n\t\t   push(title, null, 1, 1);\n\t\t   \n\t   list.map(([title,itemId, iTag],index)=>{\t\t\n\t   url = `@js:\n       params = \"curPage=\"+page+\"&pageSize=10&${iTag}=${itemId}\";\n       \n       path = \"/api/bcsbizai/xapi/categoryAndTag/books/h5\";\n       url = GetUrl(path, params);`;\n\t\t\t\tif(index +1<= list.length - list.length%3)\n\t\t\t {\tpush(title, url, 1, 0.25);}\n\t\t\t\telse{ push(title, url, 0, 0.29);}\n\t\t\t\t});\n\t});\n\treturn categoryList;\n} \t   \n\t\t\n\t\t\n\t\teval(String(source.loginUrl));\n\t\tlogin();\n  var v = source.getVariable();\n  var obj = JSON.parse(v)[0].fl[0];\n  var keys = Object.keys(obj);\n\t\tkeys.forEach(key => {\n\t\t\t\tname = key;\n\t\t  \ttype = obj[key]});\n\t push(name, null, 1, 1);\n   categoryList(type);\n\nJSON.stringify(sort);", "header": "{\n  \"accept\": \"application/json, text/plain, */*\",\n  \"user-agent\": \"Mozilla/5.0 (Linux; Android 9; Pixel 4 Build/PQ3A.190801.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/81.0.4044.117 Mobile Safari/537.36\",\n  \"content-type\": \"application/x-www-form-urlencoded\",\n  \"origin\": \"https://t.shuqi.com\",\n  \"x-requested-with\": \"mark.via.gp\",\n  \"sec-fetch-site\": \"cross-site\",\n  \"sec-fetch-mode\": \"cors\",\n  \"sec-fetch-dest\": \"empty\",\n  \"accept-language\": \"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7\"\n}", "jsLib": "let timeoffset = 2 * 60 * 60 * 1000;\n\nfunction sortedStr(str, i) {\t\n \t  let obj = {};\n    let arr = String(str).split('&');\n    arr.forEach(item => {\n        let [key, value] = item.split('=');\n        obj[key] = value;\n      });\n     var result = Object.keys(obj).sort();\n    if(/platform=0/.test(str)){\n     result = result\n     .map(key=>key + \"=\" + obj[key]).join(\"&\");\n    }else{\n     \tresult = result\n     \t.map(key=> obj[key]).join(\"\");\n    }    \n      return result\n}\n\nfunction Token() {\t\n \t  const { java, source } = this;\n    let origin = \"https://t.shuqi.com\";  \t \n   \tvar token = java.get(origin,{}).cookies()\n    .toString().match(/shuqi_token=([^,]*)/)[1];\n    var head = {\n    \t\t\"authorization\": \"Bearer \"+token\n    \t}; \t\n    token = source.putLoginHeader(\n    \tJSON.stringify(head));\n      return token\n}\n\nfunction GetUrl(path, params, sourceUrl) {\n \t  const { java, source } = this;\n \t  let sourceUrl = sourceUrl || \"https://ocean.shuqireader.com\";\n    var v = source.getVariable();\n    try{\n    var userId = JSON.parse(v)[0].uid[0].userId;\n  }catch(e){\n  \t  var userId = '12345678';\n  \t}\n      \n    var t = Date.now();\n    var time = ~~(t / 1e3);\n         \n    var gateway = \"sq_h5_gateway\";\n    var params0 = \"sqSv=1.0\";\n   \t var params1 = `user_id=${userId}&timestamp=${time}`;\n   \t \n   \t \n   \t \n   \t if (/info/.test(path)) {\n   \t  var skey = \"37e81a9d8f02596e1b895d07c171d5c9\";\n   \t  var params = params1 + \"&\" + params;\t  \n   \t  var sign = java.md5Encode(sortedStr(params) + skey);    \n     var body = params + \"&platform=0&needFreeStack=1&sign=\" + sign;\n   \t  \n   \t}else{\n    \t\tvar skey = \"eefc4798f28ea41622487ad80ef7e81c\";\n    \t\tvar params = params0 + \"&\" + params1 + \"&platform=0&\" + params;\n   \t  var sign = java.md5Encode(sortedStr(params) + \"&skey=\" + skey );\n   \t var body = params + \"&key=\" + gateway + \"&sign=\" + sign;\n   \n   \t\t}\n     \n   if (source.getLoginHeaderMap() == null) {\n   \t    \tthis.Token();\n   }\n  \n   var url = sourceUrl + path + \",\" + JSON.stringify({\n  \"body\": body,\n  \"method\": \"POST\"\n});\n\n   return url;\n}\n\n// SQ_COMMENT_API_V1_BEGIN\nvar SQ_COMMENT_API_BASE = \"https://shuqi.aadcn.cn\";\nvar SQ_COMMENT_API_KEY = \"tongrenshuqi134679\";\nvar _sqRenderExtKey = \"\";\nvar _sqRenderExtValue = null;\nvar _sqMetaMapCache = null;\nvar _sqShortMapCache = null;\n\nfunction sqSource() {\n    try { if (this && this.source) return this.source; } catch(e) {}\n    try { if (typeof source !== \"undefined\") return source; } catch(e2) {}\n    return null;\n}\n\nfunction sqJava() {\n    try { if (this && this.java) return this.java; } catch(e) {}\n    try { if (typeof java !== \"undefined\") return java; } catch(e2) {}\n    return null;\n}\n\nfunction sqLoginValue(key, defaultValue) {\n    try {\n        var s = sqSource.call(this);\n        var map = s && s.getLoginInfoMap ? s.getLoginInfoMap() : null;\n        var value = map && (map.get ? map.get(key) : map[key]);\n        if (value !== null && value !== undefined && String(value).trim() !== \"\") return String(value);\n    } catch(e) {}\n    return defaultValue == null ? \"\" : String(defaultValue);\n}\n\nfunction sqToggle(key, defaultValue) {\n    var value = sqLoginValue.call(this, key, \"\");\n    if (!value) return !!defaultValue;\n    value = String(value).trim().toLowerCase();\n    return value === \"✅\" || value === \"1\" || value === \"true\" || value === \"开\" || value === \"开启\";\n}\n\nfunction sqCommentConfig() {\n    var style = sqLoginValue.call(this, \"◎ 模板\", \"起点\");\n    var templateKey = String(style).replace(\"样式\", \"◎ 气泡\");\n    return {\n        paragraph: sqToggle.call(this, \"段评开关\", false),\n        chapter: sqToggle.call(this, \"章评开关\", false),\n        color: sqLoginValue.call(this, \"段评气泡颜色\", \"#666666\"),\n        colorSplit: sqToggle.call(this, \"段评分色\", false),\n        splitColor: sqLoginValue.call(this, \"分色气泡颜色\", \"#e23b3b\"),\n        splitCount: Number(sqLoginValue.call(this, \"分色评论数\", \"45\")) || 45,\n        hotColor: sqLoginValue.call(this, \"热门气泡颜色\", \"#f06060\"),\n        theme: sqLoginValue.call(this, \"评论主题\", \"自动\"),\n        height: sqLoginValue.call(this, \"评论窗口高度\", \"80\"),\n        bubbleStyle: style,\n        bubbleSize: sqLoginValue.call(this, \"◎ 大小\", \"text\"),\n        bubbleTemplate: sqLoginValue.call(this, templateKey, \"\")\n    };\n}\n\nfunction sqApiKey() {\n    return sqLoginValue.call(this, \"书旗评论 API Key\", \"\") || SQ_COMMENT_API_KEY;\n}\n\nfunction sqPost(path, body) {\n    var j = sqJava.call(this);\n    if (!j) return { ok: false, error: \"java unavailable\" };\n    var payload = body || {};\n    payload.apiKey = sqApiKey.call(this);\n    var option = {\n        method: \"POST\",\n        body: JSON.stringify(payload),\n        headers: { \"Content-Type\": \"application/json\", \"Accept\": \"application/json\" }\n    };\n    try {\n        var raw = j.ajax(SQ_COMMENT_API_BASE + path + \",\" + JSON.stringify(option));\n        var text = String(raw || \"{}\").replace(/^\\uFEFF/, \"\").trim();\n        return JSON.parse(text || \"{}\");\n    } catch(e) {\n        try { j.log(\"书旗评论接口请求失败 \" + path + \": \" + e); } catch(_) {}\n        return { ok: false, error: String(e) };\n    }\n}\n\nfunction sqList(value) {\n    if (!value) return [];\n    if (Array.isArray(value)) return value;\n    if (value.size && value.get) {\n        var result = [];\n        for (var i = 0; i < value.size(); i++) result.push(value.get(i));\n        return result;\n    }\n    return [];\n}\n\nfunction sqRenderExt(bookId, chapterId) {\n    var key = String(bookId || \"\") + \":\" + String(chapterId || \"\");\n    if (key && key === _sqRenderExtKey && _sqRenderExtValue) return _sqRenderExtValue;\n    var response = sqPost.call(this, \"/v1/reader/render-ext\", {\n        bookId: String(bookId || \"\"),\n        chapterId: String(chapterId || \"\")\n    });\n    if (response && response.ok) {\n        _sqRenderExtKey = key;\n        _sqRenderExtValue = response;\n    }\n    return response || { ok: false };\n}\n\nfunction sqParagraphList(response) {\n    try {\n        var outer = response && response.data || {};\n        var data = outer.data || outer.Data || {};\n        var ext = data.bookChapterExtInfo || data.BookChapterExtInfo || {};\n        return sqList(ext.paragraphList || ext.ParagraphList);\n    } catch(e) {\n        return [];\n    }\n}\n\nfunction sqCommentList(response) {\n    try {\n        var outer = response && response.data || {};\n        var data = outer.data || outer.Data || {};\n        return sqList(data.commentList || data.CommentList);\n    } catch(e) {\n        return [];\n    }\n}\n\nfunction sqReadMap(key, cacheName) {\n    if (cacheName === \"meta\" && _sqMetaMapCache !== null) return _sqMetaMapCache;\n    if (cacheName === \"short\" && _sqShortMapCache !== null) return _sqShortMapCache;\n    var map = {};\n    try {\n        var j = sqJava.call(this);\n        var raw = j && j.get ? j.get(key) : \"\";\n        if (raw) map = JSON.parse(String(raw)) || {};\n    } catch(e) { map = {}; }\n    if (cacheName === \"meta\") _sqMetaMapCache = map;\n    if (cacheName === \"short\") _sqShortMapCache = map;\n    return map;\n}\n\nfunction sqLookupChapterMap(map, url) {\n    map = map || {};\n    var raw = String(url || \"\");\n    var optionAt = raw.lastIndexOf(\",{\");\n    if (optionAt > 0) raw = raw.substring(0, optionAt);\n    var candidates = [raw];\n    var queryAt = raw.indexOf(\"?\");\n    if (queryAt >= 0) candidates.push(raw.substring(queryAt));\n    var count = candidates.length;\n    for (var i = 0; i < count; i++) {\n        candidates.push(candidates[i].replace(/0$/, \"1\"));\n        candidates.push(candidates[i].replace(/1$/, \"0\"));\n    }\n    for (var j = 0; j < candidates.length; j++) {\n        if (Object.prototype.hasOwnProperty.call(map, candidates[j])) return map[candidates[j]];\n    }\n    return null;\n}\n\nfunction sqGetShortMap(ctx) {\n    return sqReadMap.call(ctx || this, \"sqShortMap\", \"short\");\n}\n\nfunction sqLookupMap(map, base) {\n    var value = sqLookupChapterMap(map, base);\n    return value == null ? \"\" : String(value);\n}\n\nfunction sqGetChapterMeta(url) {\n    var raw = String(url || \"\");\n    try {\n        var bidMatch = raw.match(/[#&?]sqBid=([^&#]+)/);\n        var cidMatch = raw.match(/[#&?]sqCid=([^&#]+)/);\n        if (bidMatch && cidMatch) {\n            return {\n                bookId: decodeURIComponent(bidMatch[1]),\n                chapterId: decodeURIComponent(cidMatch[1])\n            };\n        }\n    } catch(eHash) {}\n    var value = sqLookupChapterMap(sqReadMap.call(this, \"sqMetaMap\", \"meta\"), raw);\n    if (!value) return null;\n    if (typeof value === \"string\") {\n        try { value = JSON.parse(value); } catch(e) { return null; }\n    }\n    return value && value.bookId && value.chapterId ? value : null;\n}\n\nfunction sqGetChapterShortUrl(url) {\n    var value = sqLookupChapterMap(sqReadMap.call(this, \"sqShortMap\", \"short\"), url);\n    return value == null ? \"\" : String(value);\n}\n\nfunction sqSafeJs(value) {\n    return String(value == null ? \"\" : value)\n        .replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\").replace(/[\\r\\n]+/g, \"\");\n}\n\nfunction sqQuoteText(value) {\n    var text = String(value == null ? \"\" : value)\n        .replace(/<br\\s*\\/?>(?=.)/gi, \"\\n\")\n        .replace(/<img\\b[^>]*>/gi, \"\")\n        .replace(/<[^>]+>/g, \"\")\n        .replace(/&nbsp;/gi, \" \")\n        .replace(/&amp;/gi, \"&\")\n        .replace(/&quot;/gi, '\"')\n        .replace(/&#39;/gi, \"'\")\n        .replace(/&lt;/gi, \"<\")\n        .replace(/&gt;/gi, \">\")\n        .replace(/[\\s\\u00a0\\u3000]+/g, \" \")\n        .trim();\n    if (text.length > 160) text = text.slice(0, 160) + \"…\";\n    return text;\n}\nfunction sqBubbleData(count, bookId, chapterId, paragraphId, hot, kind, paraText) {\n    var j = sqJava.call(this);\n    var number = Number(count) || 0;\n    if (!j || !j.base64Encode || number <= 0) return \"\";\n    var cfg = sqCommentConfig.call(this);\n    var color = cfg.color;\n    if (cfg.colorSplit) {\n        if (hot) color = cfg.hotColor;\n        else if (number >= cfg.splitCount) color = cfg.splitColor;\n    }\n    if (!/^#[0-9a-fA-F]{6}$/.test(color)) color = \"#666666\";\n    var displayText = number > 999 ? \"999\" : String(number);\n    var font = \"Arial\";\n    var template = String(cfg.bubbleTemplate || \"\").trim();\n    var svg;\n    if (cfg.bubbleStyle !== \"起点\" && template.indexOf(\"<svg\") >= 0) {\n        svg = template\n            .replace(/\\$\\{qpyscolor\\}/g, color)\n            .replace(/\\$\\{qpwzcolor\\}/g, color)\n            .replace(/\\$\\{font\\}/g, font)\n            .replace(/\\$\\{displayText\\}/g, displayText);\n    } else {\n        svg = '<svg viewBox=\"5 14 45 36\" xmlns=\"http://www.w3.org/2000/svg\" width=\"180\" height=\"144\">' +\n            '<path d=\"M44 48 Q48 48 48 44 L48 20 Q48 16 44 16 L20 16 Q16 16 16 20 L16 24 S16 28 10 30 Q6 32 10 34 Q16 36 16 38 L16 44 Q16 48 20 48 Z\" fill=\"none\" stroke=\"' + color + '\" stroke-width=\"0.7\"/>' +\n            '<text x=\"32\" y=\"38\" text-anchor=\"middle\" font-family=\"' + font + '\" font-weight=\"600\" font-size=\"18\" fill=\"' + color + '\" dominant-baseline=\"middle\">' + displayText + '</text>' +\n            '</svg>';\n    }\n    var click;\n    if (kind === \"chapter\") {\n        click = \"showSqChapterComments('\" + sqSafeJs(bookId) + \"','\" + sqSafeJs(chapterId) + \"','\" + sqSafeJs(paragraphId) + \"','\" + sqSafeJs(sqQuoteText(paraText)) + \"')\";\n    } else {\n        click = \"showSqComments('\" + sqSafeJs(bookId) + \"','\" + sqSafeJs(chapterId) + \"','\" + sqSafeJs(paragraphId) + \"','\" + sqSafeJs(sqQuoteText(paraText)) + \"')\";\n    }\n    return \"data:image/svg+xml;base64,\" + j.base64Encode(svg) + \",\" + JSON.stringify({\n        style: cfg.bubbleSize === \"TEXT\" ? \"TEXT\" : \"text\",\n        type: \"sq\",\n        click: click\n    });\n}\n\nfunction sqBubbleImage(count, bookId, chapterId, paragraphId, hot, paraText) {\n    var data = sqBubbleData.call(this, count, bookId, chapterId, paragraphId, hot, \"paragraph\", paraText);\n    return data ? '<img src=\"' + data.replace(/\"/g, \"&quot;\") + '\">' : \"\";\n}\n\nfunction sqDecorateContent(content, bookId, chapterId, chapterTitle) {\n    var cfg = sqCommentConfig.call(this);\n    var sourceRef = sqSource.call(this);\n    var titleKey = \"sq_title_bubble_\" + String(chapterId || \"\");\n    function saveTitle(value) {\n        try { if (sourceRef && sourceRef.put && chapterId) sourceRef.put(titleKey, String(value || \"\")); } catch(e) {}\n    }\n    if ((!cfg.paragraph && !cfg.chapter) || !bookId || !chapterId) {\n        saveTitle(\"\");\n        return content;\n    }\n\n    var response = sqRenderExt.call(this, bookId, chapterId);\n    var paragraphs = sqParagraphList(response);\n    if (!paragraphs.length) {\n        saveTitle(\"\");\n        return content;\n    }\n\n    var titleItem = null;\n    var bodyItems = [];\n    for (var p = 0; p < paragraphs.length; p++) {\n        var item = paragraphs[p] || {};\n        var order = Number(item.orderId !== undefined ? item.orderId : item.OrderId);\n        var count = Number(item.commentCount || item.CommentCount || 0);\n        if (count <= 0) continue;\n        if (order === 0) titleItem = item;\n        else if (order > 0) bodyItems.push(item);\n    }\n\n    if (cfg.chapter && titleItem) {\n        var titleCount = Number(titleItem.commentCount || titleItem.CommentCount || 0);\n        var titlePid = titleItem.paragraphId || titleItem.ParagraphId || \"p000\";\n        var titleText = String(titleItem.text || titleItem.Text || titleItem.summaryText || titleItem.SummaryText || chapterTitle || \"\");\n        saveTitle(sqBubbleData.call(this, titleCount, bookId, chapterId, titlePid, !!(titleItem.isHotParagraph || titleItem.IsHotParagraph), \"chapter\", titleText));\n    } else {\n        saveTitle(\"\");\n    }\n    if (!cfg.paragraph) return content;\n\n    var pieces = String(content || \"\").split(/(<br\\s*\\/?>)/i);\n    var textIndexes = [];\n    for (var i = 0; i < pieces.length; i++) {\n        if (!/^<br\\s*\\/?>$/i.test(pieces[i]) && String(pieces[i]).trim()) textIndexes.push(i);\n    }\n    for (var b = 0; b < bodyItems.length; b++) {\n        var bodyItem = bodyItems[b] || {};\n        var bodyOrder = Number(bodyItem.orderId !== undefined ? bodyItem.orderId : bodyItem.OrderId);\n        var bodyCount = Number(bodyItem.commentCount || bodyItem.CommentCount || 0);\n        var bodyPid = bodyItem.paragraphId || bodyItem.ParagraphId || (\"p\" + String(bodyOrder));\n        var target = textIndexes[bodyOrder - 1];\n        if (target !== undefined) {\n            var bodyText = String(bodyItem.text || bodyItem.Text || bodyItem.summaryText || bodyItem.SummaryText || pieces[target] || \"\");\n            pieces[target] += sqBubbleImage.call(this, bodyCount, bookId, chapterId, bodyPid, !!(bodyItem.isHotParagraph || bodyItem.IsHotParagraph), bodyText);\n        }\n    }\n    return pieces.join(\"\");\n}\n\nfunction sqEscapeHtml(value) {\n    return String(value == null ? \"\" : value)\n        .replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\")\n        .replace(/\"/g, \"&quot;\").replace(/'/g, \"&#39;\");\n}\n\nfunction sqRichText(comment) {\n    var raw = String(comment && (comment.richText || comment.text) || \"\");\n    var images = [];\n    raw = raw.replace(/<img\\b[^>]*>/gi, function(tag) {\n        var match = tag.match(/src=[\"'](data:image\\/(?:webp|png|gif);base64,[A-Za-z0-9+/=]+)[\"']/i);\n        if (!match) return \"\";\n        var token = \"__SQ_EMOJI_\" + images.length + \"__\";\n        images.push('<img class=\"emoji\" src=\"' + match[1] + '\" alt=\"\">');\n        return token;\n    });\n    raw = sqEscapeHtml(raw).replace(/\\r?\\n/g, \"<br>\");\n    for (var i = 0; i < images.length; i++) raw = raw.replace(\"__SQ_EMOJI_\" + i + \"__\", images[i]);\n    return raw;\n}\n\nfunction sqFormatTime(value) {\n    var time = Number(value || 0);\n    if (!time) return \"\";\n    try { return sqJava.call(this).timeFormatUTC(time, \"yyyy-MM-dd HH:mm\", 28800000); } catch(e) { return \"\"; }\n}\n\nfunction sqReplyHtml(reply) {\n    var name = sqEscapeHtml(reply && reply.nickname || \"书友\");\n    var target = reply && reply.repliedUserNickname ? \" 回复 \" + sqEscapeHtml(reply.repliedUserNickname) : \"\";\n    return '<div class=\"reply\"><b>' + name + '</b>' + target + '：' + sqRichText(reply) + '</div>';\n}\n\nvar _sqReplyDomSeq = 0;\nfunction sqCommentCard(comment) {\n    comment = comment || {};\n    var avatar = String(comment.userPhoto || \"\");\n    var replyData = comment.replies || {};\n    var replies = sqList(replyData.commentList);\n    var replyHtml = \"\";\n    for (var i = 0; i < replies.length; i++) replyHtml += sqReplyHtml(replies[i]);\n    var badges = comment.isAuthor ? '<span class=\"badge\">作者</span>' : \"\";\n    if (comment.fanCard && comment.fanCard.levelName) badges += '<span class=\"badge muted\">' + sqEscapeHtml(comment.fanCard.levelName) + '</span>';\n\n    var replyNum = Number(comment.replyNum || 0);\n    var nextIndex = replyData.nextItemIndex;\n    var hasMore = replyNum > replies.length && nextIndex !== null && nextIndex !== undefined && String(nextIndex) !== \"\";\n    var safeMid = String(comment.mid || \"comment\").replace(/[^A-Za-z0-9_-]/g, \"_\");\n    var replyTarget = \"sq_replies_\" + safeMid + \"_\" + (_sqReplyDomSeq++);\n    var moreButton = hasMore\n        ? '<button class=\"reply-more\" type=\"button\" data-target=\"' + replyTarget + '\" data-mid=\"' + sqEscapeHtml(comment.mid || \"\") + '\" data-cursor=\"' + sqEscapeHtml(nextIndex) + '\" data-author=\"' + sqEscapeHtml(comment.authorId || \"0\") + '\" onclick=\"sqLoadReplies(this)\">展开更多回复</button>'\n        : \"\";\n\n    return '<article class=\"comment\">' +\n        '<div class=\"author\">' + (avatar ? '<img class=\"avatar\" src=\"' + sqEscapeHtml(avatar) + '\">' : '<span class=\"avatar fallback\"></span>') +\n        '<div class=\"identity\"><div><b>' + sqEscapeHtml(comment.nickname || \"书友\") + '</b>' + badges + '</div><time>' + sqFormatTime.call(this, comment.pubTime) + '</time></div>' +\n        '<span class=\"likes\">赞 ' + Number(comment.likes || 0) + '</span></div>' +\n        '<div class=\"text\">' + sqRichText(comment) + '</div>' +\n        ((replyHtml || moreButton) ? '<div class=\"replies\"><div id=\"' + replyTarget + '\">' + replyHtml + '</div>' + moreButton + '</div>' : '') +\n        '</article>';\n}\n\nfunction sqCards(list) {\n    list = sqList(list);\n    if (!list.length) return '<div class=\"empty\">暂无评论</div>';\n    var html = \"\";\n    for (var i = 0; i < list.length; i++) html += sqCommentCard.call(this, list[i]);\n    return html;\n}\n\nfunction sqBrowserConfig() {\n    var cfg = sqCommentConfig.call(this);\n    var height = Number(cfg.height || 80);\n    if (height > 1) height = height / 100;\n    if (!(height > 0 && height <= 1)) height = 0.8;\n    return {\n        state: 4,\n        isHideable: true,\n        heightPercentage: height,\n        expandedCornersRadius: 16,\n        dismissOnTouchOutside: true,\n        widthPercentage: 1.0,\n        maxWidth: -1,\n        skipCollapsed: true,\n        hardwareAccelerated: true,\n        webViewInitialScale: 100\n    };\n}\n\nfunction sqReplyBrowserScript() {\n    return [\n        '<script>',\n        '(function(){',\n        'function replyNode(item){',\n        'var row=document.createElement(\"div\");row.className=\"reply dynamic-reply\";',\n        'var name=document.createElement(\"b\");name.textContent=String(item.nickname||\"书友\");row.appendChild(name);',\n        'var text=\"\";if(item.repliedUserNickname)text+=\" 回复 \"+item.repliedUserNickname;text+=\"：\"+String(item.text||\"\");',\n        'row.appendChild(document.createTextNode(text));return row;',\n        '}',\n        'window.sqLoadReplies=function(button){',\n        'if(!button||button.disabled)return;var cfg=window.sqReplyRequest||{};var box=document.getElementById(button.getAttribute(\"data-target\"));if(!box)return;',\n        'button.disabled=true;button.textContent=\"加载中...\";',\n        'try{',\n        'var body={apiKey:cfg.apiKey,bookId:String(cfg.bookId||\"\"),chapterId:String(cfg.chapterId||\"\"),mid:String(button.getAttribute(\"data-mid\")||\"\"),itemIndex:Number(button.getAttribute(\"data-cursor\")||0),size:20,authorId:String(button.getAttribute(\"data-author\")||\"0\")};',\n        'var option={method:\"POST\",body:JSON.stringify(body),headers:{\"Content-Type\":\"application/json\",\"Accept\":\"application/json\"}};',\n        'var raw=window.java.ajax(cfg.apiBase+\"/v1/comments/chapter-replies,\"+JSON.stringify(option));var response=JSON.parse(String(raw||\"{}\").replace(/^\\\\uFEFF/,\"\"));',\n        'if(!response.ok)throw new Error(response.error||\"回复加载失败\");var outer=response.data||{},data=outer.data||{},list=data.commentList||[];',\n        'for(var i=0;i<list.length;i++)box.appendChild(replyNode(list[i]));',\n        'var next=data.nextItemIndex;if(next===null||next===undefined)next=response.pagination&&response.pagination.nextItemIndex;',\n        'var more=data.hasMore;if(more===null||more===undefined)more=response.pagination&&response.pagination.hasMore;',\n        'if(more&&list.length&&next!==null&&next!==undefined){button.setAttribute(\"data-cursor\",String(next));button.disabled=false;button.textContent=\"展开更多回复\";}else{button.disabled=true;button.className=\"reply-more ended\";button.textContent=\"已展开全部回复\";}',\n        '}catch(error){button.disabled=false;button.textContent=\"加载失败，点击重试\";}',\n        '};',\n        '})();',\n        '</script>'\n    ].join(\"\\n\");\n}\n\nfunction sqBrowserPreload(bookId, chapterId, mode, paragraphId, quoteText) {\n    return \"window.sqPageInit=\" + JSON.stringify({\n        apiBase: SQ_COMMENT_API_BASE,\n        apiKey: sqApiKey.call(this),\n        bookId: String(bookId || \"\"),\n        chapterId: String(chapterId || \"\"),\n        paragraphId: String(paragraphId || \"\"),\n        mode: String(mode || \"paragraph\"),\n        quoteText: sqQuoteText(quoteText)\n    }).replace(/</g, \"\\\\u003c\") + \";try{window.java=java;}catch(e){}\";\n}\n\nfunction sqHtmlShell(title, subtitle, content, tabs) {\n    var theme = sqCommentConfig.call(this).theme;\n    var forced = theme === \"深色\" ? \"dark\" : (theme === \"浅色\" ? \"light\" : \"auto\");\n    var css = ':root{--bg:#f5f5f5;--panel:#fff;--text:#202124;--muted:#73777f;--line:#e6e7e9;--accent:#df3f32;--reply:#f7f7f8}' +\n        '@media(prefers-color-scheme:dark){:root{--bg:#111214;--panel:#1b1c1f;--text:#eceef1;--muted:#a3a7ae;--line:#303238;--accent:#ff7165;--reply:#24262b}}' +\n        'html.dark{--bg:#111214;--panel:#1b1c1f;--text:#eceef1;--muted:#a3a7ae;--line:#303238;--accent:#ff7165;--reply:#24262b}' +\n        'html.light{--bg:#f5f5f5;--panel:#fff;--text:#202124;--muted:#73777f;--line:#e6e7e9;--accent:#df3f32;--reply:#f7f7f8}' +\n        '*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"PingFang SC\",\"Microsoft YaHei\",sans-serif}' +\n        'header{position:sticky;top:0;z-index:3;background:var(--panel);border-bottom:1px solid var(--line);padding:15px 16px 12px}h1{font-size:18px;margin:0 0 4px}header p{font-size:12px;color:var(--muted);margin:0}' +\n        '.tabs{display:flex;gap:22px;margin-top:12px}.tab{border:0;background:none;color:var(--muted);font-size:14px;padding:6px 0;border-bottom:2px solid transparent}.tab.active{color:var(--accent);border-color:var(--accent);font-weight:600}' +\n        'main{max-width:760px;margin:0 auto;padding:10px}.comment,.section{background:var(--panel);border:1px solid var(--line);border-radius:8px;margin-bottom:8px;padding:14px}' +\n        '.author{display:flex;align-items:center;gap:10px}.avatar{width:38px;height:38px;border-radius:50%;object-fit:cover;background:var(--reply)}.identity{min-width:0;flex:1}.identity b{font-size:14px}.identity time{display:block;color:var(--muted);font-size:11px;margin-top:3px}.likes{color:var(--muted);font-size:12px}.text{font-size:15px;line-height:1.72;margin:11px 0 2px;word-break:break-word}.emoji{width:24px;height:24px;vertical-align:middle}' +\n        '.badge{font-size:10px;color:#fff;background:var(--accent);border-radius:3px;padding:1px 4px;margin-left:5px}.badge.muted{background:#767b85}.replies{background:var(--reply);border-radius:6px;padding:8px 10px;margin-top:10px}.reply{font-size:13px;line-height:1.65;margin:5px 0}.reply b{color:var(--accent)}.more,.empty{color:var(--muted);font-size:12px;margin-top:5px}.empty{text-align:center;padding:40px 10px}' +\n        '.reply-more{min-height:30px;margin-top:8px;padding:4px 13px;border:0;border-radius:15px;background:var(--panel);color:var(--accent);font-size:12px;font-weight:600}.reply-more:disabled{opacity:.7}.reply-more.ended{color:var(--muted)}' +\n        '.section h2{font-size:14px;margin:0 0 10px;color:var(--accent)}.section .comment{border:0;border-top:1px solid var(--line);border-radius:0;margin:0;padding-left:0;padding-right:0}.section .comment:first-of-type{border-top:0}' +\n        '.panel[hidden]{display:none}';\n    var tabScript = tabs ? '<script>function sqTab(name){var ps=document.querySelectorAll(\".panel\"),bs=document.querySelectorAll(\".tab\");for(var i=0;i<ps.length;i++)ps[i].hidden=ps[i].id!==name;for(var j=0;j<bs.length;j++)bs[j].className=\"tab\"+(bs[j].getAttribute(\"data-tab\")===name?\" active\":\"\")}</script>' : \"\";\n    return '<!doctype html><html class=\"' + forced + '\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><style>' + css + '</style></head><body>' +\n        '<header><h1>' + sqEscapeHtml(title) + '</h1><p>' + sqEscapeHtml(subtitle) + '</p>' + (tabs || \"\") + '</header><main>' + content + '</main>' + tabScript + sqReplyBrowserScript() + '</body></html>';\n}\n\nfunction sqLiveCommentHtml() {\n    return [\n        '<!doctype html><html><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">',\n        '<style>',\n        ':root{--bg:#f5f5f5;--panel:#fff;--text:#202124;--muted:#73777f;--line:#e6e7e9;--accent:#df3f32;--reply:#f7f7f8}@media(prefers-color-scheme:dark){:root{--bg:#111214;--panel:#1b1c1f;--text:#eceef1;--muted:#a3a7ae;--line:#303238;--accent:#ff7165;--reply:#24262b}}',\n        '*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"PingFang SC\",\"Microsoft YaHei\",sans-serif}header{position:sticky;top:0;z-index:3;background:var(--panel);border-bottom:1px solid var(--line);padding:14px 16px 10px}h1{font-size:18px;margin:0 0 4px}.quote{display:none;margin:8px 0 6px;padding:9px 12px 9px 14px;border-left:3px solid var(--accent);background:var(--reply);border-radius:0 6px 6px 0;color:var(--text);font-size:14px;line-height:1.65;white-space:pre-wrap;word-break:break-word}#subtitle{font-size:12px;color:var(--muted)}.tabs{display:flex;gap:22px;margin-top:10px}.tab{border:0;background:none;color:var(--muted);font-size:14px;padding:6px 0;border-bottom:2px solid transparent}.tab.active{color:var(--accent);border-color:var(--accent);font-weight:600}main{max-width:760px;margin:0 auto;padding:10px}',\n        '.comment,.section{background:var(--panel);border:1px solid var(--line);border-radius:8px;margin-bottom:8px;padding:14px}.author-row{display:flex;align-items:center;gap:10px}.avatar{width:38px;height:38px;border-radius:50%;object-fit:cover;background:var(--reply)}.identity{min-width:0;flex:1}.identity b{font-size:14px}.identity time{display:block;color:var(--muted);font-size:11px;margin-top:3px}.likes{color:var(--muted);font-size:12px}.text{font-size:15px;line-height:1.72;margin:11px 0 2px;word-break:break-word}.emoji{width:24px;height:24px;vertical-align:middle}.replies{background:var(--reply);border-radius:6px;padding:8px 10px;margin-top:10px}.reply{font-size:13px;line-height:1.65;margin:5px 0}.reply b{color:var(--accent)}.reply-more{min-height:30px;margin-top:8px;padding:4px 13px;border:0;border-radius:15px;background:var(--panel);color:var(--accent);font-size:12px;font-weight:600}.reply-more:disabled{opacity:.7}.section h2{font-size:14px;margin:0 0 10px;color:var(--accent)}.section .comment{border:0;border-top:1px solid var(--line);border-radius:0;margin:0;padding-left:0;padding-right:0}.empty,.loading,.error{text-align:center;color:var(--muted);padding:34px 10px}.error{color:#b42318}',\n        '.skeleton{height:112px;border-radius:8px;margin-bottom:8px;background:linear-gradient(90deg,var(--panel),var(--reply),var(--panel));background-size:200% 100%;animation:shine 1.2s infinite}@keyframes shine{to{background-position:-200% 0}}',\n        '</style></head><body>',\n        '<header><h1 id=\"title\">段评</h1><div id=\"quote\" class=\"quote\"></div><div id=\"subtitle\">加载中...</div><div id=\"tabs\" class=\"tabs\"><button class=\"tab active\" data-order=\"hot\">最热</button><button class=\"tab\" data-order=\"new\">最新</button></div></header>',\n        '<main id=\"list\"><div class=\"skeleton\"></div><div class=\"skeleton\"></div></main>',\n        '<script>',\n        '(function(){',\n        'var init=window.sqPageInit||{},API=String(init.apiBase||\"\"),KEY=String(init.apiKey||\"\"),BID=String(init.bookId||\"\"),CID=String(init.chapterId||\"\"),PID=String(init.paragraphId||\"\"),MODE=String(init.mode||\"paragraph\"),QUOTE=String(init.quoteText||\"\"),seq=0;',\n        'var list=document.getElementById(\"list\"),title=document.getElementById(\"title\"),quote=document.getElementById(\"quote\"),subtitle=document.getElementById(\"subtitle\"),tabs=document.getElementById(\"tabs\");if(QUOTE){quote.textContent=QUOTE;quote.style.display=\"block\";}',\n        'function esc(v){return String(v==null?\"\":v).replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\");}',\n        'function rich(c){var r=String(c&&c.richText||\"\");if(r.indexOf(\"<img\")>=0)return r;return esc(c&&c.text||\"\");}',\n        'function api(path,body,done){body=body||{};body.apiKey=KEY;var payload=JSON.stringify(body),finished=false;function finish(err,value){if(finished)return;finished=true;done(err,value);}try{var xhr=new XMLHttpRequest();xhr.open(\"POST\",API+path,true);xhr.setRequestHeader(\"Content-Type\",\"application/json\");xhr.onload=function(){try{var root=JSON.parse(String(xhr.responseText||\"{}\").replace(/^\\\\uFEFF/,\"\"));if(!root.ok)throw new Error(root.error||\"接口错误\");finish(null,root);}catch(e){finish(e);}};xhr.onerror=function(){fallback();};xhr.send(payload);}catch(e){fallback();}function fallback(){try{var option={method:\"POST\",body:payload,headers:{\"Content-Type\":\"application/json\",\"Accept\":\"application/json\"}};var raw=window.java.ajax(API+path+\",\"+JSON.stringify(option));var root=JSON.parse(String(raw||\"{}\"));if(!root.ok)throw new Error(root.error||\"接口错误\");finish(null,root);}catch(e2){finish(e2);}}}',\n        'function replyHtml(r){return \"<div class=\\\\\"reply\\\\\"><b>\"+esc(r.nickname||\"书友\")+\"</b>\"+(r.repliedUserNickname?(\" 回复 \"+esc(r.repliedUserNickname)):\"\")+\"：\"+rich(r)+\"</div>\";}',\n        'function replyBox(c){var rd=c.replies||{},arr=rd.commentList||[],html=\"\",id=\"sq_reply_\"+(seq++),i;for(i=0;i<arr.length;i++)html+=replyHtml(arr[i]);var next=rd.nextItemIndex,total=Number(c.replyNum||0);var more=total>arr.length&&next!==null&&next!==undefined&&String(next)!==\"\";return (html||more)?(\"<div class=\\\\\"replies\\\\\"><div id=\\\\\"\"+id+\"\\\\\">\"+html+\"</div>\"+(more?(\"<button class=\\\\\"reply-more\\\\\" data-target=\\\\\"\"+id+\"\\\\\" data-mid=\\\\\"\"+esc(c.mid||\"\")+\"\\\\\" data-cursor=\\\\\"\"+esc(next)+\"\\\\\" data-author=\\\\\"\"+esc(c.authorId||0)+\"\\\\\">展开更多回复</button>\"):\"\")+\"</div>\"):\"\";}',\n        'function cardHtml(c){var av=String(c.userPhoto||\"\"),avatar=av?(\"<img class=\\\\\"avatar\\\\\" src=\\\\\"\"+esc(av)+\"\\\\\">\"):\"<span class=\\\\\"avatar\\\\\"></span>\";return \"<article class=\\\\\"comment\\\\\"><div class=\\\\\"author-row\\\\\">\"+avatar+\"<div class=\\\\\"identity\\\\\"><b>\"+esc(c.nickname||\"书友\")+\"</b><time>\"+esc(c.pubTime||\"\")+\"</time></div><span class=\\\\\"likes\\\\\">赞 \"+Number(c.likes||0)+\"</span></div><div class=\\\\\"text\\\\\">\"+rich(c)+\"</div>\"+replyBox(c)+\"</article>\";}',\n        'function wire(root){var buttons=root.querySelectorAll(\".reply-more\");for(var i=0;i<buttons.length;i++)buttons[i].onclick=function(){loadReplies(this);};}',\n        'function loadReplies(button){if(button.disabled)return;button.disabled=true;button.textContent=\"加载中...\";api(\"/v1/comments/chapter-replies\",{bookId:BID,chapterId:CID,mid:String(button.getAttribute(\"data-mid\")||\"\"),itemIndex:Number(button.getAttribute(\"data-cursor\")||0),size:20,authorId:String(button.getAttribute(\"data-author\")||0)},function(err,root){if(err){button.disabled=false;button.textContent=\"加载失败，点击重试\";return;}var outer=root.data||{},d=outer.data||{},arr=d.commentList||[],box=document.getElementById(button.getAttribute(\"data-target\"));for(var i=0;i<arr.length;i++){var holder=document.createElement(\"div\");holder.innerHTML=replyHtml(arr[i]);if(holder.firstChild)box.appendChild(holder.firstChild);}var next=d.nextItemIndex;if(next===null||next===undefined)next=root.pagination&&root.pagination.nextItemIndex;var more=d.hasMore;if(more===null||more===undefined)more=root.pagination&&root.pagination.hasMore;if(more&&arr.length&&next!==null&&next!==undefined){button.setAttribute(\"data-cursor\",String(next));button.disabled=false;button.textContent=\"展开更多回复\";}else{button.textContent=\"已展开全部回复\";}});}',\n        'function showError(err){list.innerHTML=\"<div class=\\\\\"error\\\\\">加载失败：\"+esc(err&&err.message||err)+\"</div>\";}',\n        \"function sqCommentPage(root) {\\n    var outer = root && root.data || {};\\n    var data = outer.data || outer.Data || {};\\n    var pagination = root && root.pagination || outer.pagination || data.pagination || {};\\n    var list = data.commentList || data.CommentList || [];\\n    var next = data.nextItemIndex;\\n    if (next === null || next === undefined) next = pagination.nextItemIndex;\\n    var more = data.hasMore;\\n    if (more === null || more === undefined) more = pagination.hasMore;\\n    if (typeof more === \\\"string\\\") more = more.toLowerCase() !== \\\"false\\\";\\n    return { list: Array.isArray(list) ? list : [], next: next, more: more };\\n}\\n\\nfunction sqCommentFooter(text, ended) {\\n    var node = document.getElementById(\\\"sq_comment_footer\\\");\\n    if (!node) {\\n        node = document.createElement(\\\"div\\\");\\n        node.id = \\\"sq_comment_footer\\\";\\n        node.className = \\\"empty\\\";\\n        list.appendChild(node);\\n    }\\n    node.textContent = text;\\n    node.className = ended ? \\\"empty\\\" : \\\"loading\\\";\\n    list.appendChild(node);\\n}\\n\\nvar sqPageOrder = \\\"\\\";\\nvar sqPageCursor = null;\\nvar sqPageLoading = false;\\nvar sqPageEnded = false;\\nvar sqPageLoaded = 0;\\nvar sqPageSize = 20;\\n\\nfunction sqMaybeLoadComments() {\\n    if (sqPageEnded || sqPageLoading || !sqPageOrder) return;\\n    if (window.innerHeight + window.scrollY >= document.documentElement.scrollHeight - 220) loadParagraph(sqPageOrder, false);\\n}\\n\\nwindow.addEventListener(\\\"scroll\\\", sqMaybeLoadComments);\\n\",\n        \"function loadParagraph(order, reset) {\\n    if (sqPageLoading) return;\\n    if (reset || sqPageOrder !== order) {\\n        sqPageOrder = order;\\n        sqPageCursor = null;\\n        sqPageEnded = false;\\n        sqPageLoaded = 0;\\n        list.innerHTML = '<div class=\\\"skeleton\\\"></div><div class=\\\"skeleton\\\"></div>';\\n    }\\n    if (sqPageEnded) return;\\n    sqPageLoading = true;\\n    var body = { bookId: BID, chapterId: CID, paragraphId: PID, order: order, size: sqPageSize };\\n    if (sqPageCursor !== null && sqPageCursor !== undefined && String(sqPageCursor) !== \\\"\\\") body.itemIndex = Number(sqPageCursor);\\n    api(\\\"/v1/comments/chapter-list\\\", body, function(err, root) {\\n        sqPageLoading = false;\\n        if (err) { showError(err); return; }\\n        var page = sqCommentPage(root);\\n        var arr = page.list;\\n        if (sqPageLoaded === 0) list.innerHTML = \\\"\\\";\\n        if (arr.length) {\\n            var html = \\\"\\\";\\n            for (var i = 0; i < arr.length; i++) html += cardHtml(arr[i]);\\n            list.insertAdjacentHTML(\\\"beforeend\\\", html);\\n            sqPageLoaded += arr.length;\\n            wire(list);\\n        }\\n        var next = page.next;\\n        var noNext = next === null || next === undefined || String(next) === \\\"\\\" || (sqPageCursor !== null && String(next) === String(sqPageCursor));\\n        sqPageEnded = !arr.length || page.more === false || noNext;\\n        if (sqPageEnded) {\\n            if (!sqPageLoaded) list.innerHTML = '<div class=\\\"empty\\\">暂无评论</div>';\\n            sqCommentFooter(\\\"已到底（共 \\\" + sqPageLoaded + \\\" 条）\\\", true);\\n        } else {\\n            sqPageCursor = next;\\n            sqCommentFooter(\\\"继续下滑加载\\\", false);\\n            setTimeout(sqMaybeLoadComments, 50);\\n        }\\n        subtitle.textContent = MODE === \\\"chapterTitle\\\" ? (\\\"章节标题 · \\\" + sqPageLoaded + \\\" 条已加载\\\") : (\\\"第 \\\" + Number(String(PID).replace(/\\\\D/g, \\\"\\\")) + \\\" 段 · \\\" + sqPageLoaded + \\\" 条已加载\\\");\\n    });\\n}\",\n        'function loadChapter(){title.textContent=\"章评\";tabs.style.display=\"none\";api(\"/v1/reader/render-ext\",{bookId:BID,chapterId:CID},function(err,root){if(err){showError(err);return;}var outer=root.data||{},d=outer.data||{},ext=d.bookChapterExtInfo||{},ps=(ext.paragraphList||[]).slice(0),total=0;for(var i=0;i<ps.length;i++)total+=Number(ps[i].commentCount||0);subtitle.textContent=\"本章共 \"+total+\" 条段评\";ps.sort(function(a,b){return Number(b.commentCount||0)-Number(a.commentCount||0);});ps=ps.slice(0,6);if(!ps.length){list.innerHTML=\"<div class=\\\\\"empty\\\\\">本章暂无评论</div>\";return;}list.innerHTML=\"\";for(var x=0;x<ps.length;x++)(function(item){var section=document.createElement(\"section\"),pid=String(item.paragraphId||(\"p\"+Number(item.orderId||0))),count=Number(item.commentCount||0);section.className=\"section\";section.innerHTML=\"<h2>第 \"+(Number(item.orderId||0)+1)+\" 段 · \"+count+\" 条</h2><div class=\\\\\"loading\\\\\">加载中...</div>\";list.appendChild(section);api(\"/v1/comments/chapter-list\",{bookId:BID,chapterId:CID,paragraphId:pid,order:\"hot\",size:5},function(e,res){if(e){section.innerHTML+=\"<div class=\\\\\"error\\\\\">加载失败</div>\";return;}var o=res.data||{},dd=o.data||{},arr=dd.commentList||[],html=section.querySelector(\"h2\").outerHTML;for(var z=0;z<arr.length;z++)html+=cardHtml(arr[z]);section.innerHTML=html;wire(section);});})(ps[x]);});}',\n        'var tabButtons=tabs.querySelectorAll(\".tab\");for(var i=0;i<tabButtons.length;i++)tabButtons[i].onclick=function(){for(var j=0;j<tabButtons.length;j++)tabButtons[j].className=\"tab\";this.className=\"tab active\";loadParagraph(this.getAttribute(\"data-order\"));};',\n        'if(MODE===\"chapter\")loadChapter();else{title.textContent=MODE===\"chapterTitle\"?\"章评\":\"段评\";loadParagraph(\"hot\");}',\n        '})();',\n        '</script></body></html>'\n    ].join(\"\\n\");\n}\n\nfunction showSqComments(bookId, chapterId, paragraphId, quoteText) {\n    var j = sqJava.call(this);\n    if (!j || !j.showBrowser) return;\n    j.showBrowser(SQ_COMMENT_API_BASE + \"/paragraph\", sqLiveCommentHtml(), sqBrowserPreload.call(this, bookId, chapterId, \"paragraph\", paragraphId, quoteText), JSON.stringify(sqBrowserConfig.call(this)));\n}\n\nfunction showSqChapterComments(bookId, chapterId, paragraphId, quoteText) {\n    var j = sqJava.call(this);\n    if (!j || !j.showBrowser) return;\n    j.showBrowser(SQ_COMMENT_API_BASE + \"/paragraph\", sqLiveCommentHtml(), sqBrowserPreload.call(this, bookId, chapterId, \"chapterTitle\", paragraphId || \"p000\", quoteText), JSON.stringify(sqBrowserConfig.call(this)));\n}\n\n// SQ_COMMENT_API_V1_END", "lastUpdateTime": "1786458318985", "loginCheckJs": "if (JSON.parse(result.body()).message == \"Api Gateway Auth ERROR\") {\n   \t\tToken();\n   }else{\n   \tresult;\n }", "loginUi": "@js:\nvar fullStyle = { layout_flexGrow: 1, layout_flexBasisPercent: 1 };\nvar halfStyle = { layout_flexGrow: 1, layout_flexBasisPercent: 0.4 };\nvar thirdStyle = { layout_flexGrow: 1, layout_flexBasisPercent: 0.3 };\nresult = JSON.stringify([\n  { name: \"      📛     当前分类      📛      \", type: \"button\", action: \"login()\", style: fullStyle },\n  { name: \"⭕男频\", type: \"button\", action: \"set(0)\", style: halfStyle },\n  { name: \"⭕女频\", type: \"button\", action: \"set(1)\", style: halfStyle },\n  { name: \"userId\", type: \"text\", default: \"12345678\", style: fullStyle },\n  { name: \"💬 评论设置\", type: \"button\", action: \"commentRefreshTip()\", style: fullStyle },\n  { name: \"段评开关\", type: \"toggle\", action: \"commentRefreshTip()\", chars: [\"🔳\", \"✅\"], default: \"🔳\", style: halfStyle },\n  { name: \"章评开关\", type: \"toggle\", action: \"commentRefreshTip()\", chars: [\"🔳\", \"✅\"], default: \"🔳\", style: halfStyle },\n  { name: \"段评分色\", type: \"toggle\", action: \"commentRefreshTip()\", chars: [\"🔳\", \"✅\"], default: \"🔳\", style: halfStyle },\n  { name: \"段评气泡颜色\", type: \"text\", action: \"saveCommentSetting('段评气泡颜色')\", default: \"#666666\", style: thirdStyle },\n  { name: \"分色气泡颜色\", type: \"text\", action: \"saveCommentSetting('分色气泡颜色')\", default: \"#e23b3b\", style: thirdStyle },\n  { name: \"热门气泡颜色\", type: \"text\", action: \"saveCommentSetting('热门气泡颜色')\", default: \"#f06060\", style: thirdStyle },\n  { name: \"分色评论数\", type: \"text\", action: \"saveCommentSetting('分色评论数')\", default: \"45\", style: thirdStyle },\n  { name: \"评论窗口高度\", type: \"text\", action: \"saveCommentSetting('评论窗口高度')\", default: \"80\", style: thirdStyle },\n  { name: \"评论主题\", type: \"select\", chars: [\"自动\", \"浅色\", \"深色\"], default: \"自动\", style: halfStyle },\n  { name: \"◎ 模板\", type: \"select\", chars: [\"起点\", \"样式一\", \"样式二\", \"样式三\"], default: \"起点\", style: halfStyle },\n  { name: \"◎ 大小\", type: \"select\", chars: [\"TEXT\", \"text\"], default: \"text\", style: halfStyle },\n  { name: \"🍋 自定义气泡 🍋\", type: \"button\", style: fullStyle },\n  { name: \"◎ 气泡一\", type: \"text\", action: \"saveCommentSetting('◎ 气泡一')\", style: fullStyle },\n  { name: \"◎ 气泡二\", type: \"password\", action: \"saveCommentSetting('◎ 气泡二')\", style: fullStyle },\n  { name: \"◎ 气泡三\", type: \"password\", action: \"saveCommentSetting('◎ 气泡三')\", style: fullStyle },\n  { name: \"书旗评论 API Key\", type: \"password\", action: \"saveCommentSetting('书旗评论 API Key')\", style: fullStyle }\n]);", "loginUrl": "genderList = [{\"男频\":\"male\"},{\"女频\":\"female\"}];\n\n//放置登入头\nfunction put(json){\n\t\treturn source.setVariable(\n\t\t\tJSON.stringify(json)\n\t\t);\n\t}\n\t\nfunction login() {    \t \t\n\t  \tvar userId = source.getLoginInfoMap() || {};\n\t  \t userId = userId[\"userId\"];\n\t\t\t userId = !/^\\d+/.test(userId) ? 12345678 : userId;   \n  var v = source.getVariable();\n  if(v == \"\"){ set(0); }\n    v = JSON.parse(source.getVariable());  \n    var uid = [{\"uid\":[{\"userId\":userId}]}];\n    var mergedObj = Object.assign({}, v[0], uid[0]);\n    var con = [mergedObj];\n    java.longToast(JSON.stringify(con));\n    return put(con);\n  }\n  \nfunction set(i){\n\t var gender = genderList[i];\n  var keys = Object.keys(gender);\n  keys.forEach(key => {\n     java.toast(\"设置成功！\"+ key);\n  });\n\treturn put([{\"fl\":[gender]}]);\n\t}\n\n// SQ_COMMENT_LOGIN_V1\nfunction commentRefreshTip() {\n  java.longToast(\"\\n评论设置已修改\\n请返回阅读页并刷新正文后生效\");\n}\n\nfunction saveCommentSetting(key) {\n  var value = String(result[key] || \"\").trim();\n  var map = new Packages.java.util.HashMap();\n  map.put(key, value);\n  java.upLoginData(map);\n  try { source.putLoginInfo(JSON.stringify(result)); } catch(e) {}\n  java.toast(key + \"已保存\");\n}", "respondTime": 180000, "ruleBookInfo": {"author": "authorName", "coverUrl": "imgUrl", "init": "$.data", "intro": "<br>\n🕰 更新：{{java.timeFormatUTC(java.getString(\"$.lastInsTime\")*1000,'yyyy-MM-dd HH:mm', timeoffset)}}\n&shy;\n🔖 标签：{{$.tag[*].tagName##\\n##,}}\n🔗 版权：{{$.cpName}}\n&shy;\n📂 简介：{{$.desc}}\n@js:result.replace(/.+：\\s/g,'')", "kind": "{{java.getString('$.freeStack')=='1'?'':'💲VIP'}}\n{{$.monthlyBuyTip}}\n{{$.className}}\n{{java.getString('$.state')=='1'?'连载':'完结'}}", "lastChapter": "lastChapter.chapterName", "name": "bookName", "tocUrl": "@js:\nbookId = \"{{$.bookId}}\";\nparams = `bookId=${bookId}`;\npath = \"/webapi/bcspub/openapi/book/chapterlist\";\nurl = GetUrl(path, params, 'https://ocean.shuqireader.com');", "wordCount": "{{$.wordCount}}万字"}, "ruleContent": {"content": "@js:\n(function () {\n  var raw = String(src || \"\").trim();\n  if (!raw) return \"获取正文失败：响应为空\";\n  if (/^data:text\\/plain;base64,/i.test(raw)) {\n    try {\n      var dataMatch = raw.match(/^data:text\\/plain;base64,([^#,\\s]+)/i);\n      if (dataMatch && dataMatch[1]) raw = String(java.base64Decode(dataMatch[1]) || \"\").trim();\n    } catch (eDataUrl) { return \"获取正文失败：data URL 解码失败\"; }\n  }\n  var requestUrl = \"\";\n  var responseText = raw;\n  if (/^https?:\\/\\//i.test(raw)) {\n    requestUrl = raw;\n    try { responseText = String(java.ajax(requestUrl) || \"\"); }\n    catch (eRequest) { return \"获取正文失败：章节请求失败\"; }\n  }\n  var obj;\n  try { obj = JSON.parse(responseText || \"{}\"); }\n  catch (eParse) { return \"获取正文失败：响应格式错误\"; }\n  var enc = \"\";\n  if (obj.message == \"success\" && obj.ChapterContent) {\n    enc = obj.ChapterContent;\n  } else {\n    var shortUrl = \"\";\n    try {\n      var lookupUrl = requestUrl || String(baseUrl || \"\");\n      var optionAt = lookupUrl.lastIndexOf(\",{\");\n      if (optionAt > 0) lookupUrl = lookupUrl.substring(0, optionAt);\n      shortUrl = sqLookupMap(sqGetShortMap(this), lookupUrl);\n      if (!shortUrl && java && java.get) {\n        shortUrl = String(java.get(\"sqShort@\" + lookupUrl) || java.get(\"shortUrl\") || \"\");\n      }\n    } catch (eShortMap) {\n      try { shortUrl = String(java.get(\"shortUrl\") || \"\"); } catch (eLegacy) {}\n    }\n    if (!shortUrl) return \"付费章节地址缺失，请刷新目录\";\n    try {\n      var shortObj = JSON.parse(String(java.ajax(shortUrl) || \"{}\"));\n      enc = shortObj.ChapterContent || \"\";\n    } catch (eShort) { return \"付费章节加载失败\"; }\n  }\n  if (!enc) return \"章节内容为空\";\n  function p(e) {\n    return String(e || \"\").split(\"\").map(function (ch) {\n      return ch.match(/[A-Za-z]/)\n        ? ((c = Math.floor(ch.charCodeAt(0) / 97),\n           k = (ch.toLowerCase().charCodeAt(0) - 83) % 26 || 26,\n           String.fromCharCode(k + (0 == c ? 64 : 96))))\n        : ch;\n    }).join(\"\");\n  }\n  var text = java.base64Decode(p(enc));\n  var meta = sqGetChapterMeta.call(this, baseUrl);\n  if (!meta && requestUrl) meta = sqGetChapterMeta.call(this, requestUrl);\n  if (meta && meta.bookId && meta.chapterId) {\n    var chapterQuote = \"\";\n    try { if (typeof chapter !== \"undefined\" && chapter) chapterQuote = String(chapter.title || chapter.chapterName || \"\"); } catch (eChapterQuote) {}\n    text = sqDecorateContent.call(this, text, meta.bookId, meta.chapterId, chapterQuote);\n  }\n  return text;\n})();", "title": "@js:\nvar sqTitleText = String(title || result || \"\");\ntry { chapter.putImgUrl(null); } catch(eClearSqTitle) {}\nvar sqTitleBubble = \"\";\nvar sqCfg = sqCommentConfig.call(this);\nvar sqMeta = sqGetChapterMeta.call(this, baseUrl);\nif (sqCfg.chapter && sqMeta && sqMeta.chapterId) {\n  try {\n    var sqTitleSource = sqSource.call(this);\n    if (sqTitleSource && sqTitleSource.get) sqTitleBubble = String(sqTitleSource.get(\"sq_title_bubble_\" + String(sqMeta.chapterId)) || \"\");\n  } catch(eSqTitle) { sqTitleBubble = \"\"; }\n}\nsqTitleText + sqTitleBubble;"}, "ruleExplore": [], "ruleSearch": {"author": "$.authorName||$.author", "bookList": ".[?(@.bookName)]||.[?(@.title)]", "bookUrl": "@js:\nbookId = \"{{$.bookId||$.bid}}\";\nparams = `bookId=${bookId}`;\npath = \"/webapi/bcspub/openapi/book/info\";\nurl = GetUrl(path, params);", "checkKeyWord": "御兽：只有我能看见隐藏进化路线", "coverUrl": "$.imgUrl||$.cover", "intro": "$.desc", "kind": "@js:\nc = \"{{$.className||$.category}}\";\ns1 = \"{{$.status}}\";\ns2 = \"{{$.state}}\";\nif(s1!=\"\"){\n\t   s = s1 == '0'?'连载':'完结';\n\t}else{\n\t\t  s = s2 == '1'?'连载':'完结';\n }\nresult = c + \",\" + s;", "lastChapter": "$.latest_chapter.cname", "name": "$.bookName||$.title", "wordCount": "$.wordCount||$.words"}, "ruleToc": {"chapterList": "<js>\nlist = [];\ndata = JSON.parse(src).data;\nchargeContUrlPrefix = data.chargeContUrlPrefix;\nfreeContUrlPrefix = data.freeContUrlPrefix;\nshortContUrlPrefix = data.shortContUrlPrefix;\nchapterList = data.chapterList;\nvar sqMetaMap = {};\nvar sqShortMap = {};\nvar sqCatalogBookId = \"\";\ntry { sqCatalogBookId = String(bookId || \"\"); } catch(e) {}\nif (!sqCatalogBookId) {\n  var sqBookMatch = String(baseUrl || \"\").match(/bookId=(\\d+)/);\n  if (sqBookMatch) sqCatalogBookId = sqBookMatch[1];\n}\nfunction sqFmtCatalogTime(ts) {\n  var d = new Date(Number(ts || 0) * 1000);\n  if (!Number(ts || 0)) return \"\";\n  function pad(n) { return n < 10 ? \"0\" + n : String(n); }\n  return d.getFullYear() + \"-\" + pad(d.getMonth() + 1) + \"-\" + pad(d.getDate()) + \" \" + pad(d.getHours()) + \":\" + pad(d.getMinutes());\n}\nfor (i in chapterList) {\n  volumeName = chapterList[i].volumeName;\n  list.push({ chapterName: \"🏮〖\" + volumeName + \"〗🏮\", isVolume: true });\n  chapterList[i].volumeList.forEach($ => {\n    var suffix = String($.contUrlSuffix || \"\");\n    var realChapterUrl = ($.isFreeRead ? freeContUrlPrefix : chargeContUrlPrefix) + suffix;\n    realChapterUrl = String(realChapterUrl || \"\").replace(/0$/, \"1\");\n    var currentBookId = String(sqCatalogBookId || \"\");\n    var currentChapterId = String($.chapterId || \"\");\n    chapterUrl = realChapterUrl;\n    shortUrl = shortContUrlPrefix + String($.shortContUrlSuffix || \"\");\n    time = sqFmtCatalogTime($.chapterUpdateTime);\n    wordCount = $.wordCount + \"字\";\n    chapterPrice = $.chapterPrice != \"0\" && !$.isFreeRead ? $.chapterPrice + \"书豆\" : \"\";\n    if (suffix) {\n      sqMetaMap[suffix] = { bookId: currentBookId, chapterId: currentChapterId };\n      if (shortUrl) sqShortMap[suffix] = shortUrl;\n    }\n    list.push({\n      chapterName: $.chapterName,\n      chapterUrl: chapterUrl,\n      isVip: !$.isFreeRead,\n      isPay: $.isBuy,\n      chapterInfo: [volumeName, time, wordCount, chapterPrice].join(\"丨\").replace(/丨$/, \"\")\n    });\n  });\n}\ntry {\n  java.put(\"sqMetaMap\", JSON.stringify(sqMetaMap));\n  java.put(\"sqShortMap\", JSON.stringify(sqShortMap));\n  _sqMetaMapCache = null;\n  _sqShortMapCache = null;\n} catch(eMap) {}\nlist\n</js>", "chapterName": "chapterName", "chapterUrl": "chapterUrl", "isPay": "isPay", "isVip": "isVip", "isVolume": "isVolume", "updateTime": "chapterInfo"}, "searchUrl": "https://read.xiaoshuo1-sm.com/novel/i.php?do=is_search&isNewBind=0&platform=3&&user_id=8000000&q={{key}}&page={{page}}&size=10&uid=8000000&filterMigu=1&ver=&p=3&timestamp={{~~(Date.now()/1e3)}}", "weight": 0},{"bookSourceComment": "需登录，新账号限制每天搜索10次（注册不限制，看书不需要登录，可通过登录界面登出实现换号，但不建议频繁换号，后果自负），有问题联系作者QQ：2387744250，不定期维护\n【搜索方式】\n• 关键词搜索：直接在搜索框输入书名或关键词（消耗搜索次数）\n• 标签搜索：在搜索框输入\"tag:标签名\"或\"标签:标签名\"（例：\"tag:玄幻\"）\n  注：标签搜索不消耗搜索次数，且只能搜索到打上了相应标签或标签包含该字样的小说，冒号不区分中英文\n  有效的搜索：\"tag:无限流\"、\"标签：爽文\"\n  无效的搜索：\"tag:猫\"（没有一个标签包含字样\"猫\"）\nv2.0更新：\n1. 新增标签搜索功能；\n2. 发现页拓展，具体新增内容自行查看；\n3. 发现页新增\"我的书架\"入口，该书架与网页端菠萝猫书架直接同步；", "bookSourceGroup": "菠萝猫", "bookSourceName": "菠萝猫小说v2.0", "bookSourceType": 0, "bookSourceUrl": "https://www.boluomao.com", "bookUrlPattern": "https?://www\\.boluomao\\.com/book/\\d+\\.html", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "@js:\nvar result = [];\nvar bigStyle = { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1 };\nvar uniformStyle = { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25 };\n\n/* ===== 我的书架（对接书架API，自动遍历分页） ===== */\nresult.push({ \"title\": \"我的书架\", \"url\": \"/api/bookcase.php?page=1\", \"style\": bigStyle });\n\n/* ===== 男生（大按钮）+ 子分类平铺 ===== */\nresult.push({ \"title\": \"男生\", \"url\": \"/gender/boy/page/{{page}}/,{\\\"webView\\\":true}\", \"style\": bigStyle });\nvar boySubs = [\n  [\"全部\",\"/gender/boy/page/{{page}}/\"],[\"玄幻\",\"/gender/boy/category/1/page/{{page}}/\"],\n  [\"奇幻\",\"/gender/boy/category/2/page/{{page}}/\"],[\"武侠\",\"/gender/boy/category/3/page/{{page}}/\"],\n  [\"仙侠\",\"/gender/boy/category/4/page/{{page}}/\"],[\"都市\",\"/gender/boy/category/5/page/{{page}}/\"],\n  [\"军事\",\"/gender/boy/category/6/page/{{page}}/\"],[\"历史\",\"/gender/boy/category/7/page/{{page}}/\"],\n  [\"游戏\",\"/gender/boy/category/8/page/{{page}}/\"],[\"体育\",\"/gender/boy/category/9/page/{{page}}/\"],\n  [\"科幻\",\"/gender/boy/category/10/page/{{page}}/\"],[\"诸天无限\",\"/gender/boy/category/11/page/{{page}}/\"],\n  [\"悬疑\",\"/gender/boy/category/12/page/{{page}}/\"]\n];\nfor (var i = 0; i < boySubs.length; i++) {\n  result.push({ \"title\": boySubs[i][0], \"url\": boySubs[i][1] + ',{\\\"webView\\\":true}', \"style\": uniformStyle });\n}\n\n/* ===== 女生（大按钮）+ 子分类平铺 ===== */\nresult.push({ \"title\": \"女生\", \"url\": \"/gender/girl/page/{{page}}/,{\\\"webView\\\":true}\", \"style\": bigStyle });\nvar girlSubs = [\n  [\"全部\",\"/gender/girl/page/{{page}}/\"],[\"古代言情\",\"/gender/girl/category/13/page/{{page}}/\"],\n  [\"仙侠奇缘\",\"/gender/girl/category/14/page/{{page}}/\"],[\"现代言情\",\"/gender/girl/category/15/page/{{page}}/\"],\n  [\"浪漫青春\",\"/gender/girl/category/16/page/{{page}}/\"],[\"玄幻言情\",\"/gender/girl/category/17/page/{{page}}/\"],\n  [\"悬疑推理\",\"/gender/girl/category/18/page/{{page}}/\"],[\"科幻空间\",\"/gender/girl/category/19/page/{{page}}/\"],\n  [\"游戏竞技\",\"/gender/girl/category/20/page/{{page}}/\"],[\"短篇言情\",\"/gender/girl/category/21/page/{{page}}/\"],\n  [\"耽美\",\"/gender/girl/category/32/page/{{page}}/\"],[\"百合\",\"/gender/girl/category/33/page/{{page}}/\"],\n  [\"轻小说\",\"/gender/girl/category/34/page/{{page}}/\"]\n];\nfor (var i = 0; i < girlSubs.length; i++) {\n  result.push({ \"title\": girlSubs[i][0], \"url\": girlSubs[i][1] + ',{\\\"webView\\\":true}', \"style\": uniformStyle });\n}\n\n/* ===== 二次元（大按钮）+ 子分类平铺 ===== */\nresult.push({ \"title\": \"二次元\", \"url\": \"/gender/acg/page/{{page}}/,{\\\"webView\\\":true}\", \"style\": bigStyle });\nvar acgSubs = [\n  [\"全部\",\"/gender/acg/page/{{page}}/\"],[\"原生幻想\",\"/gender/acg/category/22/page/{{page}}/\"],\n  [\"恋爱日常\",\"/gender/acg/category/23/page/{{page}}/\"],[\"衍生同人\",\"/gender/acg/category/24/page/{{page}}/\"],\n  [\"搞笑吐槽\",\"/gender/acg/category/25/page/{{page}}/\"]\n];\nfor (var i = 0; i < acgSubs.length; i++) {\n  result.push({ \"title\": acgSubs[i][0], \"url\": acgSubs[i][1] + ',{\\\"webView\\\":true}', \"style\": uniformStyle });\n}\n\n/* ===== 热门专题（占位大按钮）+ 入口（去掉“小说”字样） ===== */\nresult.push({ \"title\": \"热门专题\", \"url\": \"\", \"style\": bigStyle });\nvar hotTopics = [\n  [\"SF轻小说\",\"/topic/1.html?p={{page}}\"],[\"刺猬猫\",\"/topic/2.html?p={{page}}\"],\n  [\"少年梦\",\"/topic/3.html?p={{page}}\"],[\"飞卢\",\"/topic/4.html?p={{page}}\"]\n];\nfor (var i = 0; i < hotTopics.length; i++) {\n  result.push({ \"title\": hotTopics[i][0], \"url\": hotTopics[i][1] + ',{\\\"webView\\\":true}', \"style\": uniformStyle });\n}\n\n/* ===== 最新专题（占位大按钮）+ 入口（去掉“小说”字样） ===== */\nresult.push({ \"title\": \"最新专题\", \"url\": \"\", \"style\": bigStyle });\nvar newTopics = [\n  [\"息壤\",\"/topic/5.html?p={{page}}\"],[\"次元姬\",\"/topic/6.html?p={{page}}\"]\n];\nfor (var i = 0; i < newTopics.length; i++) {\n  result.push({ \"title\": newTopics[i][0], \"url\": newTopics[i][1] + ',{\\\"webView\\\":true}', \"style\": uniformStyle });\n}\n\nJSON.stringify(result);", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\"\n}", "lastUpdateTime": "1786421437229", "loginUrl": "https://www.boluomao.com/user/login/", "respondTime": 180000, "ruleBookInfo": {"name": "@css:h1.font36@text || meta[property=og:title]@content## 全文免费阅读.*|全文免费阅读.*|_.*", "author": "@css:.bookTitleLeft a.author@text", "coverUrl": "@css:meta[property=og:image]@content", "kind": "@css:.info dl dt:contains(分类) + dd a@text && .info dl dt:contains(状态) + dd@text && .info dd.tags-line a@text", "lastChapter": "@css:.info a.latest-link@text", "intro": "@css:meta[property=og:description]@content || #bookIntro@text", "wordCount": "@css:.txtb > .about .num@text", "tocUrl": "{{baseUrl}}"}, "ruleContent": {"content": "<js>\nvar doc = org.jsoup.Jsoup.parse(result);\n// 移除隐藏的干扰混淆字\ndoc.select(\"[style*='display:none']\").remove();\ndoc.select(\"[style*='display: none']\").remove();\ndoc.select(\"[style*='font-size:0']\").remove();\ndoc.select(\"[style*='font-size: 0']\").remove();\ndoc.select(\"[style*='visibility:hidden']\").remove();\ndoc.select(\"[style*='visibility: hidden']\").remove();\n\nvar paragraphs = doc.select(\"div.content p\").toArray();\nvar textList = [];\nfor (var i = 0; i < paragraphs.length; i++) {\n    var txt = paragraphs[i].text().trim();\n    if (txt) {\n        textList.push(txt);\n    }\n}\ntextList.join('\\n\\n');\n</js>", "nextContentUrl": "<js>\nvar doc = org.jsoup.Jsoup.parse(result);\nvar a = doc.select(\"div.readPage a:contains(下一页)\").first();\nif (a) {\n    var href = a.attr(\"href\");\n    if (href && href.trim() != \"\") {\n        var url = href.startsWith(\"http\") ? href : \"https://www.boluomao.com\" + href;\n        url + ',{\"webView\":true}';\n    } else {\n        null;\n    }\n} else {\n    null;\n}\n</js>"}, "ruleExplore": {"bookList": "<js>\nvar isBookcase = typeof result === 'string' && result.trim().indexOf('{') === 0;\nif (isBookcase) {\n    var allBooks = [];\n    var page = 1;\n    while (page <= 200) {\n        var apiUrl = 'https://www.boluomao.com/api/bookcase.php?page=' + page;\n        var resp;\n        try {\n            resp = java.ajax(apiUrl);\n        } catch (e) {\n            break;\n        }\n        if (!resp || resp.trim().length === 0) {\n            break;\n        }\n        var json;\n        try {\n            json = JSON.parse(resp);\n        } catch (e) {\n            break;\n        }\n        if (!json.data || json.data.length === 0) {\n            break;\n        }\n        for (var i = 0; i < json.data.length; i++) {\n            allBooks.push(json.data[i]);\n        }\n        page++;\n    }\n    var html = '<div class=\"picList\"><ul>';\n    for (var i = 0; i < allBooks.length; i++) {\n        var book = allBooks[i];\n        var href = '/book/' + book.articleid + '.html';\n        var name = book.articlename || '';\n        var cover = book.cover || '';\n        var author = book.author || '';\n        var size = book.size != null ? String(book.size) : '';\n        var newest = book.newest_chapter_name || '';\n        html += '<li><div class=\"picb\"><img src=\"' + cover + '\"></div>';\n        html += '<div class=\"txtb\"><div class=\"name\"><a href=\"' + href + '\">' + name + '</a></div>';\n        html += '<span class=\"author\">' + author + '</span>';\n        html += '<span class=\"label\">' + newest + '</span>';\n        html += '<span class=\"num\">字数：' + size + '</span>';\n        html += '<div class=\"intro\"></div>';\n        html += '</div></li>';\n    }\n    html += '</ul></div>';\n    org.jsoup.Jsoup.parse(html).select('div.picList ul li');\n} else {\n    org.jsoup.Jsoup.parse(result || '').select('div.picList ul li');\n}\n</js>", "bookUrl": "@css:div.txtb div.name a@href##$##,{\"webView\":true}", "coverUrl": "@css:div.picb img@src", "name": "@css:div.txtb div.name a@text## 全文免费阅读.*|全文免费阅读.*|_.*", "author": "@css:span.author@text##作者：", "kind": "@css:span.label@text", "wordCount": "@css:span.num@text##字数：", "intro": "@css:div.intro@text"}, "ruleSearch": {"bookList": "<js>\nvar doc = org.jsoup.Jsoup.parse(result);\nif (result.indexOf(\"searchRemain\") > -1) {\n    var strongText = doc.select(\"span.searchRemain strong\").text();\n    if (strongText && strongText.trim() !== \"\") {\n        java.longToast(\"🔍 当前账号剩余搜索次数: \" + strongText.trim() + \" 次\");\n    } else if (result.indexOf(\"次数已用完\") > -1 || result.indexOf(\"限制\") > -1) {\n        java.longToast(\"⚠️ 当前账号今日搜索次数已耗尽！\");\n    } else if (result.indexOf(\"退出\") > -1) {\n        java.longToast(\"🔍 当前账号剩余搜索次数: 10 次\");\n    } else {\n        java.longToast(\"⚠️ 未检测到登录状态，请先登录！\");\n    }\n}\ndoc.select(\"div.picList ul li\");\n</js>", "bookUrl": "@css:div.txtb div.name a@href##$##,{\"webView\":true}", "coverUrl": "@css:div.picb img@src", "name": "@css:div.txtb div.name a@text## 全文免费阅读.*|全文免费阅读.*|_.*", "author": "@css:span.author@text##作者：", "kind": "@css:span.label@text", "wordCount": "@css:span.num@text##字数：", "intro": "@css:div.intro@text"}, "ruleToc": {"chapterList": "@css:#chapters .direList ul li a", "chapterName": "text", "chapterUrl": "href##$##,{\"webView\":true}", "nextTocUrl": "<js>\nvar doc = org.jsoup.Jsoup.parse(result);\nvar nextA = doc.select(\"div.page-range-list span.cur + a\").first();\nif (nextA) {\n    var href = nextA.attr(\"href\");\n    if (href && href.trim() != \"\") {\n        var url = href.startsWith(\"http\") ? href : \"https://www.boluomao.com\" + href;\n        url + ',{\"webView\":true}';\n    } else {\n        null;\n    }\n} else {\n    null;\n}\n</js>"}, "searchUrl": "<js>\nvar finalUrl;\nif (/^(tag|标签)[:：]/.test(key)) {\n    var tagName = key.replace(/^(tag|标签)[:：]/, '').trim();\n    finalUrl = 'https://www.boluomao.com/tag/' + encodeURIComponent(tagName) + '/';\n    if (page > 1) {\n        finalUrl += 'page/' + page + '/';\n    }\n    java.longToast('🏷️ 标签搜索模式（不消耗搜索次数）：' + tagName);\n} else {\n    finalUrl = 'https://www.boluomao.com/search/?q=' + encodeURIComponent(key);\n    if (page > 1) {\n        finalUrl += '&page=' + page;\n    }\n    java.longToast('🔍 关键词搜索模式（消耗搜索次数）：' + key);\n}\nfinalUrl + ',{\"webView\":true}';\n</js>", "weight": 0},{"bookSourceComment": "需要自己有懒人听书会员，下载安卓8.8.03版本，登录进行抓包填入登录页信息，使用自己账号，听书。只有会员才能听上🔒的\n1045801523群号\n纯免费，盗版源\ntg：https://t.me/+SCsvr5O7YIc3NmIx", "bookSourceGroup": "懒人听书,app,api", "bookSourceName": "懒人听书app本地源（同人）", "bookSourceType": 1, "bookSourceUrl": "https://m.lrts.me/", "customButton": false, "customOrder": -123, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\n\nvar items=[];\nvar wide={layout_flexGrow:1,layout_flexBasisPercent:1};\nvar cell={layout_flexGrow:1,layout_flexBasisPercent:0.25};\nfunction add(title,url,style){items.push({title:String(title),url:url,style:style||cell});}\nfunction onePageUrl(hostKind,path,params,setup){\n  return \"@js:\\n\"+\n    \"\\n\"+\n    (setup||\"\")+\n    \"var out=null;if(Number(page||1)===1)out=\"+(hostKind===\"feed\"?\"lrtsFeedUrl\":\"lrtsUrl\")+\"(java,source,\"+JSON.stringify(path)+\",\"+JSON.stringify(params||{})+\");out;\";\n}\nfunction feedPageUrl(path,params){\n  return \"@js:\\n\"+\n    \"\\n\"+\n    \"var p=Number(page||1),refer=p===1?'':String(source.get('lrts_feed_refer')||'end');\\n\"+\n    \"if(p===1)source.put('lrts_feed_refer','');\\n\"+\n    \"var args=\"+JSON.stringify(params||{})+\";if(p>1&&\"+JSON.stringify(path)+\"==='/lrts/cgi/homepage/homePageFeedList'){args.showRankModule='0';args.size='20';}args.referId=refer;var out=null;if(refer!=='end')out=lrtsFeedUrl(java,source,\"+JSON.stringify(path)+\",args);out;\";\n}\nfunction categoryUrl(entityId){\n  return \"@js:\\n\"+\n    \"\\n\"+\n    \"var eid=\"+JSON.stringify(entityId)+\";\\n\"+\n    \"var out=null;\\n\"+\n    \"if(page==1){source.put('lrts_book_ids','');out=lrtsUrl(java,source,'/yyting/label/filterResources.action',{dsize:'20',entityId:eid,entityType:'3',pageNum:'1',showFilters:'1'});}else{var ids=String(source.get('lrts_book_ids')||'').split(',').filter(function(x){return x;});var start=(page-1)*20;var part=ids.slice(start,start+20);if(part.length){out=lrtsUrl(java,source,'/yyting/label/filterResources.action',{bookIds:'['+part.join(',')+']',dsize:'20',entityId:'0',entityType:'0',pageNum:'0',showFilters:'0'});}}\\n\"+\n    \"out;\";\n}\nadd(\"推荐\",feedPageUrl(\"/lrts/cgi/homepage/homePageFeedList\",{recommendedSwitch:\"0\",showRankModule:\"1\",size:\"26\"}),cell);\nadd(\"小说\",onePageUrl(\"api\",\"/yyting/page/novelChannelPage\",{channelId:\"50000152\",channelShowStyle:\"5\",preferenceType:\"\",recommendedSwitch:\"0\",respType:\"0\"}),cell);\nadd(\"会员\",onePageUrl(\"feed\",\"/lrts/cgi/homepage/vipPage\",{}),cell);\nadd(\"儿童\",feedPageUrl(\"/lrts/cgi/homepage/childrenChannelPageFeedList\",{category:\"0\",channelId:\"5337203\",recommendedSwitch:\"0\",size:\"20\"}),cell);\nadd(\"音乐\",onePageUrl(\"api\",\"/yyting/musicradio/channelPage\",{hv:\"1.434.0\"},\"source.put('lrts_music_tab','');\\n\"),cell);\nadd(\"榜单\",onePageUrl(\"api\",\"/yyting/ranking/resList.action\",{filterType:\"0\",pageNum:\"1\",pageSize:\"100\",rangeType:\"6\",rankId:\"14680\"}),cell);\n\nadd(\"儿童分类\",null,wide);\ntry{\n  var childBody=JSON.parse(String(java.ajax(lrtsFeedUrl(java,source,\"/lrts/cgi/homepage/childrenChannelMenuList\",{channelId:\"5337203\"}))));\n  (childBody.data&&childBody.data.categoryList||[]).forEach(function(category){\n    add(category.categoryName,feedPageUrl(\"/lrts/cgi/homepage/childrenChannelPageFeedList\",{category:String(category.category),channelId:\"5337203\",recommendedSwitch:\"0\",size:\"20\"}),cell);\n  });\n}catch(e){java.log(\"懒人听书儿童分类加载失败: \"+e);}\n\nadd(\"音乐频道\",null,wide);\ntry{\n  var musicBody=JSON.parse(String(java.ajax(lrtsUrl(java,source,\"/yyting/musicradio/channelPage\",{hv:\"1.434.0\"}))));\n  (musicBody.data&&musicBody.data.tabList||[]).forEach(function(tab){\n    add(tab.name,onePageUrl(\"api\",\"/yyting/musicradio/recMusicService/fetchMusicList\",{id:String(tab.id),referId:\"\",pageSize:\"20\"}),cell);\n  });\n}catch(e){java.log(\"懒人听书音乐频道加载失败: \"+e);}\n\nadd(\"榜单\",null,wide);\ntry{\n  var rankBody=JSON.parse(String(java.ajax(lrtsUrl(java,source,\"/yyting/ranking/rankingsGroupList.action\",{groupId:\"0\",groupType:\"1\",recommendedSwitch:\"8\"}))));\n  (rankBody.data&&rankBody.data.list||[]).forEach(function(group){\n    var groupName=group.rankingsGroupInfoView&&group.rankingsGroupInfoView.name||\"榜单\";\n    add(groupName,null,wide);\n    (group.rankingsList||[]).forEach(function(rank){\n      var rankType=Number(rank.rankType||0);\n      var rankUrl;\n      if(rankType===10){\n        rankUrl=\"@js:\\n\"+\n          \"\\n\"+\n          \"var p=Number(page||1);lrtsUrl(java,source,'/yyting/music/rankingsItemList.action',{filterType:\"+JSON.stringify(String(rank.filterType))+\",pageNum:String(p),pageSize:'100',rangeType:\"+JSON.stringify(String(rank.rangeType))+\",rankId:\"+JSON.stringify(String(rank.rankId))+\"});\";\n      }else if(rankType===2){\n        rankUrl=null;\n      }else{\n        rankUrl=\"@js:\\n\"+\n          \"\\n\"+\n          \"var p=Number(page||1);lrtsUrl(java,source,'/yyting/ranking/resList.action',{filterType:\"+JSON.stringify(String(rank.filterType))+\",pageNum:String(p),pageSize:'100',rangeType:\"+JSON.stringify(String(rank.rangeType))+\",rankId:\"+JSON.stringify(String(rank.rankId))+\"});\";\n      }\n      if(rankUrl)add(rank.rankName,rankUrl,cell);\n    });\n  });\n}catch(e){java.log(\"懒人听书榜单加载失败: \"+e);}\n\n[{id:\"9011\",title:\"分类标签 · 男频\"},{id:\"9012\",title:\"分类标签 · 女频\"}].forEach(function(group){\n  add(group.title,null,wide);\n  try{\n    var body=JSON.parse(String(java.ajax(lrtsUrl(java,source,\"/yyting/label/labelList.action\",{id:group.id,showLocation:\"2\"}))));\n    (body.data&&body.data.list||[]).forEach(function(label,index){\n      add(label.name,categoryUrl(group.id+\"_\"+label.id),cell);\n    });\n  }catch(e){java.log(\"懒人听书分类标签加载失败: \"+e);}\n});\nJSON.stringify(items);", "header": "{\"User-Agent\":\"Android16/yyting/Xiaomi/2509FPN0BC/ch_qq_appcenter/8803/Android\"}", "jsLib": "var LR_BASE=\"https://gzapi.mting.info\";\nvar LR_FEED_BASE=LR_BASE.replace(\".mting.info\",\".lanrentingshu.com\");\nvar LR_APP_BASE=\"https://shapi.mting.info\";\nvar LR_SALT=\"vYCmm+6CFVykQk5w0wiUDliCQRA=\";\nvar LR_SESSION_KEYS=[\"token\",\"imei\",\"nwt\",\"mode\",\"lrid\",\"ostar36\",\"userMode\",\"duId\"];\nfunction lrtsResolveSession(source,java) {\n  var raw=String(source.get(\"lrts_session\")||\"\").trim();\n  if(!raw){\n    throw new Error(\"本书源不含内置账号，请先在书源登录中填写本人抓包的 8 项会话参数\");\n  }\n  var custom;\n  try{\n    custom=JSON.parse(raw);\n  }catch(parseError){\n    throw new Error(\"个人抓包会话格式无效，请在书源登录中重新填写并保存\");\n  }\n  var candidate={};\n  var missing=[];\n  LR_SESSION_KEYS.forEach(function(key){\n    var value=custom[key];\n    if(value===null||value===undefined||String(value).trim()===\"\")missing.push(key);\n    else candidate[key]=String(value).trim();\n  });\n  if(missing.length){\n    throw new Error(\"个人抓包会话缺少参数：\"+missing.join(\"、\")+\"，请在书源登录中补全\");\n  }\n  return candidate;\n}\nfunction lrtsSignedUrl(java, source, base, path, params) {\n  params=params||{};\n  var LR_SESSION=lrtsResolveSession(source,java);\n  Object.keys(LR_SESSION).forEach(function(key){\n    if(LR_SESSION[key]!==null&&LR_SESSION[key]!==undefined&&LR_SESSION[key]!==\"\") params[key]=String(LR_SESSION[key]);\n  });\n  var q=parseInt(String(source.get(\"lrts_q\")||\"0\"),10);\n  if(!isFinite(q)||q<0) q=0;\n  q=q+1;\n  source.put(\"lrts_q\",String(q));\n  params.q=String(q);\n  params.ts=String(Date.now());\n  var keys=Object.keys(params).filter(function(key){return params[key]!==null&&params[key]!==undefined;}).sort();\n  var canonical=path+\"?\"+keys.map(function(key){return key+\"=\"+String(params[key]);}).join(\"&\");\n  params.sc=String(java.md5Encode(canonical+LR_SALT));\n  return base+path+\"?\"+Object.keys(params).filter(function(key){return params[key]!==null&&params[key]!==undefined;}).map(function(key){return encodeURIComponent(key)+\"=\"+encodeURIComponent(String(params[key]));}).join(\"&\");\n}\nfunction lrtsUrl(java, source, path, params) { return lrtsSignedUrl(java,source,LR_BASE,path,params); }\nfunction lrtsFeedUrl(java, source, path, params) { return lrtsSignedUrl(java,source,LR_FEED_BASE,path,params); }\nfunction lrtsAppUrl(java, source, path, params) { return lrtsSignedUrl(java,source,LR_APP_BASE,path,params); }\n// QMC eKey decryption for Legado's Rhino runtime.\n// Decrypted bytes are returned through the audio player's JSON-array data source.\nfunction lrtsU8(value) {\n  return Number(value) & 255;\n}\n\nfunction lrtsSetByte(bytes, index, value) {\n  value = Number(value) & 255;\n  bytes[index] = value > 127 ? value - 256 : value;\n}\n\nfunction lrtsReadU32BE(bytes, offset) {\n  return (((lrtsU8(bytes[offset]) << 24) |\n    (lrtsU8(bytes[offset + 1]) << 16) |\n    (lrtsU8(bytes[offset + 2]) << 8) |\n    lrtsU8(bytes[offset + 3])) >>> 0);\n}\n\nfunction lrtsWriteU32BE(output, offset, value) {\n  output[offset] = (value >>> 24) & 255;\n  output[offset + 1] = (value >>> 16) & 255;\n  output[offset + 2] = (value >>> 8) & 255;\n  output[offset + 3] = value & 255;\n}\n\nfunction lrtsTeaDecryptBlock(input, key) {\n  var left = lrtsReadU32BE(input, 0);\n  var right = lrtsReadU32BE(input, 4);\n  var words = [\n    lrtsReadU32BE(key, 0),\n    lrtsReadU32BE(key, 4),\n    lrtsReadU32BE(key, 8),\n    lrtsReadU32BE(key, 12)\n  ];\n  var sum = 0xe3779b90;\n  for (var round = 0; round < 16; round++) {\n    var rightMix = ((((left << 4) + words[2]) ^\n      (left + sum) ^ ((left >>> 5) + words[3])) >>> 0);\n    right = (right - rightMix) >>> 0;\n    var leftMix = ((((right << 4) + words[0]) ^\n      (right + sum) ^ ((right >>> 5) + words[1])) >>> 0);\n    left = (left - leftMix) >>> 0;\n    sum = (sum - 0x9e3779b9) >>> 0;\n  }\n  var output = new Array(8);\n  lrtsWriteU32BE(output, 0, left);\n  lrtsWriteU32BE(output, 4, right);\n  return output;\n}\n\nfunction lrtsSliceBytes(bytes, start, end) {\n  var output = [];\n  var limit = Math.min(Number(end), bytes.length);\n  for (var index = Number(start); index < limit; index++) output.push(lrtsU8(bytes[index]));\n  return output;\n}\n\nfunction lrtsXorBlock(left, right) {\n  var output = new Array(8);\n  for (var index = 0; index < 8; index++) output[index] = lrtsU8(left[index]) ^ lrtsU8(right[index]);\n  return output;\n}\n\nfunction lrtsTencentTeaDecrypt(input, key) {\n  if (input.length < 16 || input.length % 8 !== 0) throw new Error(\"QMC TEA data length is invalid\");\n  var decrypted = lrtsTeaDecryptBlock(lrtsSliceBytes(input, 0, 8), key);\n  var padding = decrypted[0] & 7;\n  var outputLength = input.length - 1 - padding - 2 - 7;\n  if (outputLength < 0) throw new Error(\"QMC TEA padding is invalid\");\n  var output = new Array(outputLength);\n  var previousCipher = [0, 0, 0, 0, 0, 0, 0, 0];\n  var currentCipher = lrtsSliceBytes(input, 0, 8);\n  var inputOffset = 8;\n  var blockOffset = 1 + padding;\n\n  function nextBlock() {\n    previousCipher = currentCipher;\n    currentCipher = lrtsSliceBytes(input, inputOffset, inputOffset + 8);\n    decrypted = lrtsTeaDecryptBlock(lrtsXorBlock(decrypted, currentCipher), key);\n    inputOffset += 8;\n    blockOffset = 0;\n  }\n\n  for (var skipped = 0; skipped < 2;) {\n    if (blockOffset < 8) {\n      blockOffset++;\n      skipped++;\n    } else {\n      nextBlock();\n    }\n  }\n  for (var outputOffset = 0; outputOffset < outputLength;) {\n    if (blockOffset < 8) {\n      output[outputOffset++] = decrypted[blockOffset] ^ previousCipher[blockOffset];\n      blockOffset++;\n    } else {\n      nextBlock();\n    }\n  }\n  for (var zeroIndex = 0; zeroIndex < 7; zeroIndex++) {\n    if (decrypted[blockOffset] !== previousCipher[blockOffset]) {\n      throw new Error(\"QMC TEA zero check failed\");\n    }\n    blockOffset++;\n  }\n  return output;\n}\n\nfunction lrtsAsciiBytes(text) {\n  var output = new Array(String(text).length);\n  for (var index = 0; index < output.length; index++) output[index] = String(text).charCodeAt(index) & 255;\n  return output;\n}\n\nfunction lrtsBase64Bytes(java, text) {\n  var javaBytes = java.base64DecodeToByteArray(String(text));\n  var output = new Array(javaBytes.length);\n  for (var index = 0; index < javaBytes.length; index++) output[index] = lrtsU8(javaBytes[index]);\n  return output;\n}\n\nfunction lrtsBytesToAscii(bytes) {\n  var output = \"\";\n  for (var index = 0; index < bytes.length; index += 256) {\n    var part = bytes.slice(index, Math.min(index + 256, bytes.length));\n    output += String.fromCharCode.apply(String, part);\n  }\n  return output;\n}\n\nfunction lrtsStartsWithBytes(bytes, prefix) {\n  if (bytes.length < prefix.length) return false;\n  for (var index = 0; index < prefix.length; index++) {\n    if (lrtsU8(bytes[index]) !== lrtsU8(prefix[index])) return false;\n  }\n  return true;\n}\n\nfunction lrtsSimpleKey(salt, length) {\n  var output = new Array(length);\n  for (var index = 0; index < length; index++) {\n    output[index] = Math.floor(Math.abs(Math.tan(salt + index * 0.1)) * 100) & 255;\n  }\n  return output;\n}\n\nfunction lrtsDeriveQmcKey(java, eKey) {\n  var raw = lrtsBase64Bytes(java,eKey);\n  var v2Prefix = lrtsAsciiBytes(\"QQMusic EncV2,Key:\");\n  if (lrtsStartsWithBytes(raw, v2Prefix)) {\n    raw = raw.slice(v2Prefix.length);\n    raw = lrtsTencentTeaDecrypt(raw, lrtsAsciiBytes(\"386ZJY!@#*$%^&)(\"));\n    raw = lrtsTencentTeaDecrypt(raw, lrtsAsciiBytes(\"**#!(#$%&^a1cZ,T\"));\n    raw = lrtsBase64Bytes(java,lrtsBytesToAscii(raw));\n  }\n  if (raw.length < 16) throw new Error(\"QMC eKey is too short\");\n  var simpleKey = lrtsSimpleKey(106, 8);\n  var teaKey = new Array(16);\n  for (var index = 0; index < 8; index++) {\n    teaKey[index * 2] = simpleKey[index];\n    teaKey[index * 2 + 1] = raw[index];\n  }\n  return raw.slice(0, 8).concat(lrtsTencentTeaDecrypt(raw.slice(8), teaKey));\n}\n\nfunction lrtsImulU32(left, right) {\n  var low = left & 65535;\n  var high = (left >>> 16) & 65535;\n  return ((low * right + (((high * right) & 65535) << 16)) >>> 0);\n}\n\nfunction lrtsQmcDecrypt(java, bytes, eKey) {\n  var key = lrtsDeriveQmcKey(java,eKey);\n  if (key.length <= 300) {\n    for (var mapIndex = 0; mapIndex < bytes.length; mapIndex++) {\n      var mapOffset = mapIndex > 0x7fff ? mapIndex % 0x7fff : mapIndex;\n      var keyIndex = (mapOffset * mapOffset + 71214) % key.length;\n      var rotate = ((keyIndex & 7) + 4) % 8;\n      var value = key[keyIndex];\n      var mapMask = ((value << rotate) | (value >>> rotate)) & 255;\n      lrtsSetByte(bytes, mapIndex, lrtsU8(bytes[mapIndex]) ^ mapMask);\n    }\n    return key.length;\n  }\n\n  var size = key.length;\n  var box = new Array(size);\n  var cursor = 0;\n  var index;\n  for (index = 0; index < size; index++) box[index] = index & 255;\n  for (index = 0; index < size; index++) {\n    cursor = (cursor + box[index] + key[index % size]) % size;\n    var swap = box[index];\n    box[index] = box[cursor];\n    box[cursor] = swap;\n  }\n  var hash = 1;\n  for (index = 0; index < key.length; index++) {\n    if (key[index] === 0) continue;\n    var nextHash = lrtsImulU32(hash, key[index]);\n    if (nextHash === 0 || nextHash <= hash) break;\n    hash = nextHash;\n  }\n\n  function segmentSkip(id) {\n    var seed = key[id % size];\n    if (!seed) throw new Error(\"QMC RC4 seed is zero\");\n    return Math.floor((hash / ((id + 1) * seed)) * 100) % size;\n  }\n\n  function firstSegment(position, length, offset) {\n    for (var firstIndex = 0; firstIndex < length; firstIndex++) {\n      lrtsSetByte(bytes, position + firstIndex,\n        lrtsU8(bytes[position + firstIndex]) ^ key[segmentSkip(offset + firstIndex)]);\n    }\n  }\n\n  function segment(position, length, offset) {\n    var segmentBox = box.slice(0);\n    var left = 0;\n    var right = 0;\n    var skip = (offset % 5120) + segmentSkip(Math.floor(offset / 5120));\n    for (var segmentIndex = -skip; segmentIndex < length; segmentIndex++) {\n      left = (left + 1) % size;\n      right = (segmentBox[left] + right) % size;\n      var segmentSwap = segmentBox[left];\n      segmentBox[left] = segmentBox[right];\n      segmentBox[right] = segmentSwap;\n      if (segmentIndex >= 0) {\n        var mask = segmentBox[(segmentBox[left] + segmentBox[right]) % size];\n        lrtsSetByte(bytes, position + segmentIndex,\n          lrtsU8(bytes[position + segmentIndex]) ^ mask);\n      }\n    }\n  }\n\n  var offset = 0;\n  var processed = 0;\n  var remaining = bytes.length;\n  function advance(length) {\n    offset += length;\n    processed += length;\n    remaining -= length;\n  }\n  if (offset < 128) {\n    var firstLength = Math.min(remaining, 128 - offset);\n    firstSegment(0, firstLength, offset);\n    advance(firstLength);\n  }\n  if (remaining && offset % 5120 !== 0) {\n    var partialLength = Math.min(remaining, 5120 - (offset % 5120));\n    segment(processed, partialLength, offset);\n    advance(partialLength);\n  }\n  while (remaining > 5120) {\n    segment(processed, 5120, offset);\n    advance(5120);\n  }\n  if (remaining) segment(processed, remaining, offset);\n  return key.length;\n}\n\nfunction lrtsAudioFormat(bytes) {\n  var head = \"\";\n  for (var index = 0; index < Math.min(4, bytes.length); index++) head += String.fromCharCode(lrtsU8(bytes[index]));\n  if (head === \"OggS\") return { mime: \"audio/ogg\", ext: \"ogg\" };\n  if (head === \"fLaC\") return { mime: \"audio/flac\", ext: \"flac\" };\n  if (head.substring(0, 3) === \"ID3\" || (bytes.length > 1 && lrtsU8(bytes[0]) === 255 && (lrtsU8(bytes[1]) & 224) === 224)) {\n    return { mime: \"audio/mpeg\", ext: \"mp3\" };\n  }\n  throw new Error(\"QMC decrypted data has an unsupported header\");\n}\n\nfunction lrtsAudioDataSource(bytes, format) {\n  var encoded = String(Packages.android.util.Base64.encodeToString(bytes, 2) || \"\");\n  if (!encoded) throw new Error(\"QMC audio Base64 encoding failed\");\n  return JSON.stringify([\"data:\" + format.mime + \";base64,\" + encoded]);\n}\n\nfunction lrtsLoadAllCatalog(java, source, marker) {\n  var bookId=String(marker.bookId||\"\");\n  var entityType=String(marker.entityType||\"1\");\n  var total=parseInt(String(marker.sections||\"0\"),10);\n  var pageSize=1000;\n  var pageCount=isFinite(total)&&total>0?Math.ceil(total/pageSize):100;\n  var all=[];\n  if(!bookId)throw new Error(\"目录标记缺少 bookId\");\n  for(var pageNum=1;pageNum<=pageCount;pageNum++){\n    var body=null;\n    var lastError=null;\n    for(var attempt=0;attempt<2;attempt++){\n      try{\n        var pageUrl=lrtsAppUrl(java,source,\"/yyting/bookclient/ClientGetBookResource.action\",{\n          bookId:bookId,\n          isUp:\"0\",\n          pageNum:String(pageNum),\n          pageSize:String(pageSize),\n          sceneId:\"B3\",\n          sortType:\"0\"\n        });\n        body=JSON.parse(String(java.ajax(pageUrl)||\"{}\"));\n        if(!body||!Array.isArray(body.list))throw new Error(String(body&&body.msg||\"目录响应缺少 list\"));\n        lastError=null;\n        break;\n      }catch(error){lastError=error;}\n    }\n    if(lastError)throw new Error(\"第\"+pageNum+\"页目录获取失败: \"+lastError);\n    var list=body.list||[];\n    if(!list.length)break;\n    for(var index=0;index<list.length;index++){\n      var item=list[index];\n      item._lrtsBookId=bookId;\n      item._lrtsEntityType=entityType;\n      all.push(item);\n    }\n    if(list.length<pageSize)break;\n  }\n  if(isFinite(total)&&total>0&&all.length<total){\n    throw new Error(\"目录不完整: \"+all.length+\"/\"+total);\n  }\n  if(isFinite(total)&&total>0&&all.length>total)all=all.slice(0,total);\n  return all;\n}\n", "lastUpdateTime": "1786289433458", "loginUi": "@js:\nfunction lrtsSavedSession(){\n  try{return JSON.parse(String(source.get(\"lrts_session\")||\"{}\"));}catch(e){return {};}\n}\nvar saved=lrtsSavedSession();\nvar full={layout_flexGrow:1,layout_flexBasisPercent:1};\nvar half={layout_flexGrow:1,layout_flexBasisPercent:0.46};\nfunction field(name,type,style){\n  return {name:name,type:type,default:String(saved[name]||\"\"),style:style||full};\n}\nresult=JSON.stringify([\n  {name:\"请抓包懒人听书app版本为8.8.03的信息\",type:\"button\",action:\"lrtsCaptureTip()\",style:full},\n  field(\"token\",\"password\",full),\n  field(\"imei\",\"password\",full),\n  field(\"lrid\",\"password\",full),\n  field(\"duId\",\"password\",full),\n  field(\"ostar36\",\"password\",full),\n  field(\"userMode\",\"text\",full),\n  field(\"nwt\",\"text\",half),\n  field(\"mode\",\"text\",half),\n  {name:\"保存并启用\",type:\"button\",action:\"login()\",style:full},\n  {name:\"查看状态\",type:\"button\",action:\"lrtsSessionStatus()\",style:half},\n  {name:\"清除个人会话\",type:\"button\",action:\"lrtsClearSession()\",style:half}\n]);", "loginUrl": "var LR_LOGIN_FIELDS=[\n  {name:\"token\",key:\"token\"},\n  {name:\"imei\",key:\"imei\"},\n  {name:\"nwt\",key:\"nwt\"},\n  {name:\"mode\",key:\"mode\"},\n  {name:\"lrid\",key:\"lrid\"},\n  {name:\"ostar36\",key:\"ostar36\"},\n  {name:\"userMode\",key:\"userMode\"},\n  {name:\"duId\",key:\"duId\"}\n];\n\nfunction lrtsLoginField(name){\n  try{\n    if(result&&typeof result.get===\"function\")return String(result.get(name)||\"\").trim();\n  }catch(e1){}\n  try{\n    if(result&&result[name]!==null&&result[name]!==undefined)return String(result[name]).trim();\n  }catch(e2){}\n  return \"\";\n}\n\nfunction login(){\n  var session={};\n  var missing=[];\n  LR_LOGIN_FIELDS.forEach(function(field){\n    var value=lrtsLoginField(field.name);\n    if(!value)missing.push(field.name);\n    session[field.key]=value;\n  });\n  if(missing.length){\n    java.longToast(\"请完整填写以下参数：\\n\"+missing.join(\"、\"));\n    return;\n  }\n  source.put(\"lrts_session\",JSON.stringify(session));\n  source.put(\"lrts_q\",\"0\");\n  try{\n    var map=new Packages.java.util.HashMap();\n    LR_LOGIN_FIELDS.forEach(function(field){map.put(field.name,session[field.key]);});\n    java.upLoginData(map);\n  }catch(saveError){}\n  java.longToast(\"个人 App 会话已保存并启用\");\n}\n\nfunction lrtsCaptureTip(){\n  java.longToast(\"本书源不提供内置账号，仅支持使用你本人的抓包会话。\\n请从懒人听书 Android 客户端 8.8.03 的 HAR 请求参数中提取并填写 token、imei、lrid、duId、ostar36、userMode、nwt、mode。\\n其他版本的字段或签名可能不同，不能保证兼容；请勿填写其他 App 的参数。\");\n}\n\nfunction lrtsSessionStatus(){\n  try{\n    var saved=JSON.parse(String(source.get(\"lrts_session\")||\"{}\"));\n    var complete=LR_LOGIN_FIELDS.every(function(field){\n      return saved[field.key]!==null&&saved[field.key]!==undefined&&String(saved[field.key]).trim()!==\"\";\n    });\n    java.longToast(complete?\"个人抓包会话已配置\":\"尚未配置个人抓包会话，当前无法使用\");\n  }catch(error){\n    java.longToast(\"个人抓包会话数据无效，请清除后重新填写\");\n  }\n}\n\nfunction lrtsClearSession(){\n  source.put(\"lrts_session\",\"\");\n  source.put(\"lrts_q\",\"0\");\n  try{\n    var map=new Packages.java.util.HashMap();\n    LR_LOGIN_FIELDS.forEach(function(field){map.put(field.name,\"\");});\n    java.upLoginData(map);\n  }catch(clearError){}\n  java.longToast(\"个人抓包会话已清除；使用前请重新抓包填写\");\n  try{java.reLoginView();}catch(refreshError){}\n}", "respondTime": 727, "ruleBookInfo": {"author": "{{$.data.detail.author||$.data.singerName}}  演播：{{$.data.detail.announcer||$.data.singerName}}", "coverUrl": "$.data.detail.bestCover||$.data.detail.cover||$.data.pic", "intro": "🔊 播放：{{$.data.detail.play}}\n🎙 演播：{{$.data.detail.announcer||$.data.singerName}}\n💿 专辑：{{$.data.albumName}}\n🏷 标签：{{$.data.detail.labels[*].name##\n##、}}\n📖 简介：{{$.data.detail.desc}}", "kind": "MP3", "lastChapter": "@js:\nvar sections=parseInt(String(java.getString(\"$.data.detail.sections\")||\"0\"),10);\nisFinite(sections)&&sections>0?\"共\"+sections+\"集\":\"MP3\";", "name": "@js:\nvar name=String(java.getString(\"$.data.detail.shortName\")||java.getString(\"$.data.detail.name\")||java.getString(\"$.data.songName\")||\"\");\nname||\"MP3\";", "tocUrl": "@js:\nvar bookId=String(java.getString(\"$.data.detail.id\")||\"\");\nvar songMid=String(java.getString(\"$.data.songMid\")||\"\");\nif(bookId){\n  lrtsUrl(java,source,\"/yyting/bookclient/ClientGetBookResource.action\",{bookId:bookId,isUp:\"0\",pageNum:\"1\",pageSize:\"50\",sceneId:\"B3\",sortType:\"0\"});\n}else if(songMid){\n  source.put(\"lrts_music_song_mid\",songMid);\n  source.put(\"lrts_music_song_name\",String(java.getString(\"$.data.songName\")||\"MP3\"));\n  var now=String(Date.now());\n  lrtsFeedUrl(java,source,\"/lrts/cgi/musicradio/tmeService/getMediaUrl\",{costInfo:now+\"-\"+now+\"-0\",opType:\"0\",songMid:songMid});\n}else{\n  throw new Error(\"详情没有返回有声书 ID 或歌曲 ID\");\n}"}, "ruleContent": {"content": "@js:\n\nvar raw=String(src||\"\");\nvar body;\nif(String(baseUrl||\"\").indexOf(\"data:;base64,\")===0){\n  var marker=JSON.parse(String(java.hexDecodeToString(raw)||\"{}\"));\n  if(marker.kind!==\"lrtsBookAudio\")throw new Error(\"未知的懒人听书章节标记\");\n  var now=String(Date.now());\n  var playUrl=lrtsAppUrl(java,source,\"/yyting/v3/gateway/getListenPath\",{\n    costInfo:now+\"-\"+now+\"-0\",\n    effect:\"0\",\n    entityId:String(marker.bookId||\"\"),\n    entityType:String(marker.entityType||\"1\"),\n    opType:\"0\",\n    quality:\"1\",\n    resId:String(marker.resId||\"\"),\n    section:String(marker.section||\"\"),\n    trackId:String(marker.trackId||\"\"),\n    vid:\"\"\n  });\n  body=JSON.parse(String(java.ajax(playUrl)||\"{}\"));\n}else{\n  body=JSON.parse(raw);\n}\nvar model=body.data&&body.data.length!==undefined?body.data[0]:body.data;\nmodel=model||{};\nvar path=String(model.path||model.url||\"\");\nvar eKey=String(model.key||\"\");\nvar encrypted=!!eKey||/.mgg(?:$|[?#])/i.test(path);\nif(encrypted){\n  if(!path)throw new Error(\"加密歌曲没有返回媒体地址\");\n  if(!eKey)throw new Error(\"加密歌曲没有返回 eKey，无法解密\");\n  var cachePath=\"\";\n  try{\n    cachePath=String(java.downloadFile(path+\", \"+JSON.stringify({type:\"mgg\"}))||\"\");\n    if(!cachePath)throw new Error(\"加密歌曲下载失败\");\n    var audioBytes=java.readFile(cachePath);\n    if(!audioBytes||!audioBytes.length)throw new Error(\"加密歌曲缓存为空\");\n    lrtsQmcDecrypt(java,audioBytes,eKey);\n    var format=lrtsAudioFormat(audioBytes);\n    path=lrtsAudioDataSource(audioBytes,format);\n  }finally{\n    if(cachePath)try{java.deleteFile(cachePath);}catch(deleteError){}\n  }\n}\nif(!path)throw new Error(String(body.msg||\"App 播放地址获取失败，请确认账号权益或更新 HAR 会话\"));\npath;"}, "ruleExplore": [], "ruleSearch": {"author": "{{$.author}}  演播：{{$.announcer}}", "bookList": "<js>\nvar responseText=String(result==null?\"\":result).trim();\nfunction parseResponse(text){\n  text=String(text||\"\").trim();\n  if(text.charAt(0)!==\"{\"&&text.charAt(0)!==\"[\"){\n    var start=text.indexOf(\"{\");\n    var end=text.lastIndexOf(\"}\");\n    if(start>=0&&end>start)text=text.substring(start,end+1);\n  }\n  try{return JSON.parse(text);}catch(error){return null;}\n}\nvar body=parseResponse(responseText);\nif(!body&&String(baseUrl||\"\").indexOf(\"/yyting/musicradio/channelPage\")>=0){\n  \n  body=parseResponse(String(java.ajax(lrtsUrl(java,source,\"/yyting/musicradio/channelPage\",{hv:\"1.434.0\"}))));\n}\nif(!body){java.log(\"懒人听书发现响应不是 JSON: \"+responseText.substring(0,120));body={};}\nvar list=[];\nvar seen={};\nfunction add(raw){\n  if(!raw)return;\n  if(raw.ranking&&Array.isArray(raw.ranking.list)){raw.ranking.list.forEach(add);return;}\n  if(raw.musicList&&Array.isArray(raw.musicList.list)){raw.musicList.list.forEach(add);return;}\n  if(raw.folder&&Array.isArray(raw.folder.list)){raw.folder.list.forEach(add);return;}\n  if(raw.videoCollectionManga||raw.activity||raw.topic||raw.advert)return;\n  if(Number(raw.type)===10000)return;\n  if(raw.bookAlbum)raw=raw.bookAlbum;\n  if(raw.music)raw=raw.music;\n  if(raw.entityId&&raw.entityName)raw={id:raw.entityId,name:raw.entityName,cover:raw.cover,typeName:raw.typeName,score:raw.score,playCount:raw.playCount,recReason:raw.highlightTags||\"\",entityType:1};\n  if(raw.songMid)raw={id:String(raw.songMid),name:raw.songName,author:raw.singerName,announcer:raw.singerName,cover:raw.pic,desc:raw.albumName,entityType:99,_music:1,mediaMid:raw.mediaMid};\n  var itemType=Number(raw.type);\n  if(itemType===19||itemType===80||itemType===10||itemType===63||itemType===10000)return;\n  var id=raw.id||raw.entityId||raw.baseEntityId;\n  var displayName=raw.name||raw.entityName||raw.realName||raw.songName;\n  if(!id||!displayName||seen[String(id)])return;\n  var entityType=Number(raw.entityType||raw.baseEntityType||1);\n  if(entityType!==1&&entityType!==99)return;\n  raw.id=String(id);\n  raw.name=String(displayName);\n  raw.cover=raw.cover||raw.bestCover||raw.orignCover||raw.dynamicCover||\"\";\n  raw.announcer=raw.announcer||raw.nickName||\"\";\n  raw.author=raw.author||\"\";\n  seen[String(id)]=1;\n  list.push(raw);\n}\nif(body.data&&body.data.bookAlbums){\n  var searchBooks=body.data.bookAlbums||[];\n  var previousRefer=String(source.get(\"lrts_search_refer\")||\"\");\n  var nextRefer=String(body.data.tabInfo&&body.data.tabInfo.referId||\"\");\n  source.put(\"lrts_search_refer\",(!searchBooks.length||!nextRefer||nextRefer===previousRefer)?\"end\":nextRefer);\n  searchBooks.forEach(add);\n}else if(body.books){\n  if(body.bookIds&&body.bookIds.length>20) source.put(\"lrts_book_ids\",body.bookIds.join(\",\"));\n  body.books.concat(body.albums||[]).forEach(add);\n}else if(body.list){\n  if(String(baseUrl||\"\").indexOf(\"/yyting/read/rankingsItemList.action\")>=0){\n    var rankMatch=String(baseUrl||\"\").match(/[?&]rankId=([^&]+)/);\n    var rankKey=\"lrts_read_rank_\"+(rankMatch?decodeURIComponent(rankMatch[1]):\"\");\n    var previous=String(source.get(rankKey)||\"0\");\n    var next=body.list.length?String(body.list[body.list.length-1].showOrder||\"\"):\"\";\n    source.put(rankKey,!next||next===previous?\"end\":next);\n  }else{\n    body.list.forEach(add);\n  }\n}else if(body.data){\n  var data=body.data;\n  if(data.recommendEntityList){\n    source.put(\"lrts_feed_refer\",String(data.referId||\"end\"));\n    data.recommendEntityList.forEach(add);\n  }\n  (data.rankListModule||[]).forEach(function(module){(module.list||[]).forEach(add);});\n  (data.ranking&&data.ranking.rankings||[]).forEach(function(rank){(rank.rankingItems||[]).forEach(add);});\n  if(data.list&&data.list.length)data.list.forEach(add);\n  function modules(groups){(groups||[]).forEach(function(group){(group.moduleList||[]).forEach(function(module){(module.entityList||[]).forEach(add);});});}\n  modules(data.moduleGroup);\n  (data.channelGroup||[]).forEach(function(channel){modules(channel.moduleGroup);});\n  var tabId=String(source.get(\"lrts_music_tab\")||\"\");\n  (data.tabList||[]).filter(function(tab){return !tabId||String(tab.id)===tabId;}).forEach(function(tab){(tab.musicList||[]).forEach(add);});\n  (data.musicList||[]).forEach(add);\n}\nresult=JSON.stringify(list);\n</js>\n$[*]", "bookUrl": "@js:\n\nif(Number(java.getString(\"$._music\"))===1){\n  var songMid=String(java.getString(\"$.id\"));\n  source.put(\"lrts_music_song_mid\",songMid);\n  source.put(\"lrts_music_song_name\",String(java.getString(\"$.name\")||\"音乐\"));\n  lrtsUrl(java,source,\"/yyting/musicradio/recMusicService/getMusicInfo\",{songMid:songMid});\n}else{\nvar id=String(java.getString(\"$.id\"));\nlrtsAppUrl(java,source,\"/yyting/v3/book/bookInfoPage\",{id:id,listenPos:\"1\",reqMask:\"31\",source:\"0\",trackSize:\"50\",type:\"1\"});}", "coverUrl": "$.cover", "intro": "{{$.recReason}}\n{{$.desc}}", "kind": "{{$.shortRecReason}}\n{{$.rankingInfo}}\n{{$.score}}分", "lastChapter": "{{$.state}}", "name": "$.name"}, "ruleToc": {"chapterList": "<js>\nvar raw=String(result==null?\"\":result);\nif(String(baseUrl||\"\").indexOf(\"/yyting/bookclient/ClientGetBookResource.action\")>=0){\n  var catalogBody;\n  try{catalogBody=JSON.parse(raw);}catch(error){throw new Error(\"听书目录响应不是 JSON: \"+error);}\n  if(Number(catalogBody.status)!==0||!Array.isArray(catalogBody.list)){\n    throw new Error(String(catalogBody.msg||\"听书目录响应缺少 list\"));\n  }\n  var responseBookId=String(catalogBody.bookId||\"\");\n  if(!responseBookId)throw new Error(\"听书目录响应缺少 bookId\");\n  catalogBody.list.forEach(function(item){\n    if(item&&typeof item===\"object\"){\n      item._lrtsBookId=responseBookId;\n      item._lrtsEntityType=\"1\";\n    }\n  });\n  result=JSON.stringify(catalogBody);\n}else{\n  var musicBody;\n  try{musicBody=JSON.parse(raw);}catch(error){throw new Error(\"歌曲目录响应不是 JSON: \"+error);}\n  var musicList=Array.isArray(musicBody)?musicBody:\n    (Array.isArray(musicBody.list)?musicBody.list:\n    (Array.isArray(musicBody.data)?musicBody.data:\n    (musicBody.data?[musicBody.data]:[])));\n  result=JSON.stringify({list:musicList});\n}\nresult;\n</js>\n$.list[*]", "chapterName": "@js:\nvar name=String(java.getString(\"$.name\")||\"\");\nname||String(source.get(\"lrts_music_song_name\")||\"MP3\");", "chapterUrl": "@js:\nif(String(baseUrl).indexOf(\"/lrts/cgi/musicradio/tmeService/getMediaUrl\")>=0){\n  var songMid=String(source.get(\"lrts_music_song_mid\")||\"\");\n  var now=String(Date.now());\n  lrtsFeedUrl(java,source,\"/lrts/cgi/musicradio/tmeService/getMediaUrl\",{costInfo:now+\"-\"+now+\"-0\",opType:\"0\",songMid:songMid});\n}else{\n  var bookId=String(java.getString(\"$._lrtsBookId\")||\"\");\n  if(!bookId)throw new Error(\"章节数据缺少 _lrtsBookId\");\n  var now=String(Date.now());\n  lrtsAppUrl(java,source,\"/yyting/v3/gateway/getListenPath\",{\n    costInfo:now+\"-\"+now+\"-0\",\n    effect:\"0\",\n    entityId:bookId,\n    entityType:String(java.getString(\"$._lrtsEntityType\")||\"1\"),\n    opType:\"0\",\n    quality:\"1\",\n    resId:String(java.getString(\"$.id\")||\"\"),\n    section:String(java.getString(\"$.section\")||\"\"),\n    trackId:String(java.getString(\"$.tmeId\")||\"\"),\n    vid:\"\"\n  });\n}", "isVip": "$.payType", "nextTocUrl": "@js:\nvar urls=[];\nif(String(baseUrl||\"\").indexOf(\"/yyting/bookclient/ClientGetBookResource.action\")>=0){\n  var total=parseInt(String(java.getString(\"$.sections\")||\"0\"),10);\n  var bookId=String(java.getString(\"$.bookId\")||\"\");\n  var pageSize=50;\n  var pageCount=isFinite(total)&&total>0?Math.ceil(total/pageSize):1;\n  if(!bookId)throw new Error(\"目录分页响应缺少 bookId\");\n  for(var pageNum=2;pageNum<=pageCount;pageNum++){\n    urls.push(lrtsUrl(java,source,\"/yyting/bookclient/ClientGetBookResource.action\",{\n      bookId:bookId,\n      isUp:\"0\",\n      pageNum:String(pageNum),\n      pageSize:String(pageSize),\n      sceneId:\"B3\",\n      sortType:\"0\"\n    }));\n  }\n}\nurls;", "updateTime": "{{java.timeFormatUTC(java.getString('$.lastModify'),'yyyy-MM-dd',8)}}"}, "searchUrl": "@js:\nvar p=Number(page)||1;\nvar searchId=\"\";\nvar referId=\"\";\nif(p===1){\n  searchId=\"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g,function(ch){\n    var value=Math.floor(Math.random()*16);\n    return (ch===\"x\"?value:(value&3)|8).toString(16);\n  });\n  source.put(\"lrts_search_id\",searchId);\n  source.put(\"lrts_search_refer\",\"\");\n}else{\n  searchId=String(source.get(\"lrts_search_id\")||\"\");\n  referId=String(source.get(\"lrts_search_refer\")||\"\");\n}\nvar out=null;\nif(searchId&&(p===1||(referId&&referId!==\"end\"))){\n  out=lrtsAppUrl(java,source,\"/yyting/v2/search/searchBookAlbum\",{\n    filters:\"0,0,0,0\",\n    keyWord:String(key),\n    pageId:\"g1\",\n    searchId:searchId,\n    sort:\"1\",\n    referId:referId||undefined\n  });\n}\nout;", "weight": 0},{"bookSourceGroup": "漫画,18禁", "bookSourceName": "绅士漫画（下拉）", "bookSourceType": 2, "bookSourceUrl": "https://www.wnacg.com", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\":\"更新\",\"url\":\"/albums-index-page-{{page}}.html\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n{\"title\":\"全彩\",\"url\":\"/albums-index-page-{{page}}-tag-%E5%85%A8%E5%BD%A9.html\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n{\"title\":\"无修正\",\"url\":\"/albums-index-page-{{page}}-tag-%E7%84%A1%E4%BF%AE%E6%AD%A3.html\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n{\"title\":\"同人志\",\"url\":\"/albums-index-page-{{page}}-cate-5.html\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n{\"title\":\"汉化\",\"url\":\"/albums-index-page-{{page}}-cate-1.html\",\"style\":{\"layout_flexBasisPercent\":0.4,\"layout_flexGrow\":1}},\n{\"title\":\"日语\",\"url\":\"/albums-index-page-{{page}}-cate-12.html\",\"style\":{\"layout_flexBasisPercent\":0.4,\"layout_flexGrow\":1}},\n{\"title\":\"英语\",\"url\":\"/albums-index-page-{{page}}-cate-16.html\",\"style\":{\"layout_flexBasisPercent\":0.4,\"layout_flexGrow\":1}},\n{\"title\":\"GG书籍\",\"url\":\"/albums-index-page-{{page}}-cate-2.html\",\"style\":{\"layout_flexBasisPercent\":0.4,\"layout_flexGrow\":1}},\n{\"title\":\"CosPlay\",\"url\":\"/albums-index-page-{{page}}-cate-3.html\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n{\"title\":\"单行本\",\"url\":\"/albums-index-page-{{page}}-cate-6.html\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n{\"title\":\"汉化\",\"url\":\"/albums-index-page-{{page}}-cate-9.html\",\"style\":{\"layout_flexBasisPercent\":0.4,\"layout_flexGrow\":1}},\n{\"title\":\"日语\",\"url\":\"/albums-index-page-{{page}}-cate-13.html\",\"style\":{\"layout_flexBasisPercent\":0.4,\"layout_flexGrow\":1}},\n{\"title\":\"英语\",\"url\":\"/albums-index-page-{{page}}-cate-17.html\",\"style\":{\"layout_flexBasisPercent\":0.4,\"layout_flexGrow\":1}},\n{\"title\":\"杂志&短篇\",\"url\":\"/albums-index-page-{{page}}-cate-7.html\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n{\"title\":\"汉化\",\"url\":\"/albums-index-page-{{page}}-cate-10.html\",\"style\":{\"layout_flexBasisPercent\":0.4,\"layout_flexGrow\":1}},\n{\"title\":\"日语\",\"url\":\"/albums-index-page-{{page}}-cate-14.html\",\"style\":{\"layout_flexBasisPercent\":0.4,\"layout_flexGrow\":1}},\n{\"title\":\"韩漫\",\"url\":\"/albums-index-page-{{page}}-cate-19.html\",\"style\":{\"layout_flexBasisPercent\":1,\"layout_flexGrow\":1}},\n{\"title\":\"汉化\",\"url\":\"/albums-index-page-{{page}}-cate-20.html\",\"style\":{\"layout_flexBasisPercent\":0.4,\"layout_flexGrow\":1}},\n{\"title\":\"韩语\",\"url\":\"/albums-index-page-{{page}}-cate-21.html\",\"style\":{\"layout_flexBasisPercent\":0.4,\"layout_flexGrow\":1}}]", "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36\"}", "lastUpdateTime": "1786250551686", "loginUrl": "https://www.wnacg.com/users-login.html", "respondTime": 180000, "ruleBookInfo": {"author": "class.asTBcell uwuinfo@tag.p.0@text", "intro": "class.asTBcell uwconn@tag.p.0@text", "kind": "class.asTBcell uwconn@tag.label.0@text##分類：", "name": "class.asTBcell uwthumb@tag.img@alt", "wordCount": "class.asTBcell uwconn@tag.label.1@text##頁數："}, "ruleContent": {"content": "@js:src.split('//img5.qy0.ru/').slice(1).map(p=>'//img5.qy0.ru/'+p.substring(0,p.indexOf('\\\\\"')).trim()).filter(u=>u.indexOf('cover.jpg')===-1).map(u=>'<img src=\"https:'+u+'\">').join('\\n')", "imageStyle": "FULL", "nextContentUrl": "text.下一頁@href"}, "ruleExplore": {"bookList": "tag.ul@tag.li", "bookUrl": "class.pic_box@tag.a@href", "coverUrl": "class.pic_box@tag.a@tag.img@src", "intro": "class.info@class.info_col@text", "name": "class.title@text"}, "ruleSearch": {"bookList": "class.cc@tag.li", "bookUrl": "class.pic_box@tag.a@href", "coverUrl": "tag.img@src", "intro": "class.info_col@text", "name": "tag.a@title"}, "ruleToc": {"chapterList": "class.gallary_wrap@tag.li.0", "chapterName": "@js:book.name+' 全本'", "chapterUrl": "@js:baseUrl.replace('photos-index','photos-gallery')", "nextTocUrl": "@js:''", "updateTime": "class.info_col@text"}, "searchUrl": "/search/?q={{key}}&f=_all&s=create_time_DESC&syn=yes&p={{page}}", "weight": 0},{"bookSourceComment": "by 狼崽儿 //2026.8.9\n第三方的开放番茄小说API。无法同步账号\n\n1.支持小说，漫画，听书，短剧（但是这个API的短剧资源无法播放，所以实际上只支持前三种模式），默认小说，切换类型在登录切换，别忘了在左上角切换源类型。\n2.仅支持小说评论和小说发现页。（其实也支持其他类型的评论，但是阅读会有兼容问题）\n3.评论支持看用户名，评论正文，用户评分，点赞数，回复数。但是无法看楼中楼和具体用户信息。\n4.评论数默认拉取100条，实测会在100多条的数量变动。如果需要拉取更多评论，在正文的LIMIT处修改数字，但是太多评论会很慢。\n5.全面兼容所有版本的阅读\n6.发现页精选112个标签", "bookSourceName": "🍅 番茄小说聚合API", "bookSourceType": 0, "bookSourceUrl": "http://101.35.133.34:5000", "customButton": false, "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:GEN_EXPLORE()", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 Mobile Safari/537.36 SearchCraft/3.6.5 (Baidu; P1 9.0)\"\n}", "jsLib": "var TypeNames = [\"小说\", \"听书\", \"漫画\", \"短剧\"];\nvar TypeValues = [3, 2, 8, 11];\n\nfunction TYPE() {\n    var v = String(this.source.getVariable()).split(\",\");\n    var idx = parseInt(v[0]) || 0;\n    return TypeValues[idx] !== undefined ? TypeValues[idx] : 3;\n}\n\nfunction MODE_NAME() {\n    var v = String(this.source.getVariable()).split(\",\");\n    var idx = parseInt(v[0]) || 0;\n    return TypeNames[idx] !== undefined ? TypeNames[idx] : \"小说\";\n}\n\nfunction TAB() {\n    var v = String(this.source.getVariable()).split(\",\");\n    var idx = parseInt(v[0]) || 0;\n    var tabs = [\"%E5%B0%8F%E8%AF%B4\", \"%E5%90%AC%E4%B9%A6\", \"%E6%BC%AB%E7%94%BB\", \"%E7%9F%AD%E5%89%A7\"];  // 小说/听书/漫画/短剧\n    return tabs[idx] !== undefined ? tabs[idx] : \"%E5%B0%8F%E8%AF%B4\";\n}\n\nfunction CMTOFF() {\n    var v = String(this.source.getVariable()).split(\",\");\n    return v[1] == 'off';\n}\n\nfunction GEN_EXPLORE() {\n  var cats = [\n    [1, '都市'],[2, '都市生活'],[3, '现代言情'],[4, '校园'],[6, '奇幻'],[7, '玄幻'],[9, '仙侠'],[10, '悬疑'],[11, '乡村'],[12, '历史'],[16, '武侠'],[17, '鉴宝'],[19, '系统'],[20, '神豪'],[24, '快穿'],[25, '赘婿'],[26, '神医'],[27, '战神赘婿'],[29, '总裁'],[32, '幻想言情'],[34, '婚恋'],[36, '重生'],[37, '穿越'],[42, '奶爸'],[46, '诗歌散文'],[66, '洪荒'],[68, '末世'],[69, '直播'],[70, '无限流'],[71, '诸天万界'],[74, '宠物'],[82, '学霸'],[90, '天才'],[91, '多女主'],[92, '腹黑'],[96, '甜宠'],[98, '中国名著'],[100, '灵异'],[116, '国学'],[124, '都市修真'],[125, '家庭'],[127, '职场'],[165, '悬疑推理'],[241, '历史文化'],[257, '玄幻脑洞'],[258, '传统玄幻'],[259, '奇幻仙侠'],[261, '都市日常'],[262, '都市脑洞'],[267, '现言脑洞'],[273, '历史古代'],[369, '反派'],[382, '穿书'],[384, '无敌'],[385, '校花'],[389, '单女主'],[391, '无女主'],[400, '现实小说'],[409, '人物传记'],[410, '个人成长'],[412, '人际交往'],[419, '美食休闲'],[452, '架空'],[453, '开局'],[484, 'HE'],[487, '医生'],[496, '国运'],[511, '东方玄幻'],[512, '异世大陆'],[514, '灵气复苏'],[516, '都市异能'],[519, '大小姐'],[520, '大佬'],[522, '打脸'],[525, '古籍'],[558, '仕途'],[597, '爽文'],[705, '克苏鲁'],[747, '女频悬疑'],[749, '青春甜宠'],[750, '职场婚恋'],[754, '现实情感'],[757, '现代'],[759, '先虐后甜'],[778, '搞笑轻松'],[830, '升级流'],[832, '科举'],[834, '1v1'],[837, '争霸'],[838, '无后宫'],[841, '群像'],[845, '高手下山'],[850, '无脑爽'],[852, '魂穿'],[856, '全能'],[857, '斩神'],[862, '家长里短'],[941, '文学经典'],[955, '文艺名人'],[960, '生活百科'],[963, '百科常识'],[970, '精品小说'],[971, '玄幻小说'],[972, '情感小说'],[990, '中国文学'],[993, '武侠小说'],[995, '励志提升'],[1014, '都市高武'],[1140, '东方仙侠'],[1141, '西方奇幻'],[1379, '婚姻家庭'],[1385, '悬疑惊悚'],\n  ];\n  var arr = [];\n  for (var i = 0; i < cats.length; i++) {\n   arr.push({title: '📖' + cats[i][1], url: 'http://101.35.133.34:5000/api/discover?type=' + cats[i][0]});\n  }\n  return JSON.stringify(arr);\n}", "lastUpdateTime": "1786247381673", "loginUi": "[\n    {\n        \"name\": \"当前模式\",\n        \"type\": \"button\",\n        \"action\": \"A()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"主页\",\n        \"type\": \"button\",\n        \"action\": \"C()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"📖小说\",\n        \"type\": \"button\",\n        \"action\": \"B(0)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"🎧听书\",\n        \"type\": \"button\",\n        \"action\": \"B(1)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"🖼漫画\",\n        \"type\": \"button\",\n        \"action\": \"B(2)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"🎬短剧\",\n        \"type\": \"button\",\n        \"action\": \"B(3)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"💬 评论: 开启/关闭\",\n        \"type\": \"button\",\n        \"action\": \"D()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.5\n      }\n   }\n]", "loginUrl": "A = () => {\n    let v = String(this.source.getVariable()).split(\",\");\n    let x = v[0] || 0;\n    let names = [\"小说\", \"听书\", \"漫画\", \"短剧\"];\n    let values = [3, 2, 8, 11];\n    java.toast('当前模式：' + names[x] + '（type=' + values[x] + '）');\n}\n\nB = (x) => {\n    let v = String(this.source.getVariable()).split(\",\");\n    v[0] = x;\n    this.source.setVariable(v.join(\",\"));\n    let names = [\"小说\", \"听书\", \"漫画\", \"短剧\"];\n    java.toast('已切换到：' + names[x]);\n}\n\nC = () => {\n    java.startBrowser('http://101.35.133.34:5000', '');\n}\n\nD = () => {\n    let v = String(this.source.getVariable()).split(\",\");\n    v[1] = (v[1] == 'off') ? 'on' : 'off';\n    this.source.setVariable(v.join(\",\"));\n    java.toast('💬 评论已' + (v[1] == 'on' ? '开启' : '关闭'));\n}", "respondTime": 180000, "ruleBookInfo": {"author": "$.data.data.author", "coverUrl": "$.data.data.thumb_url", "intro": "@js:\nvar d = JSON.parse(result);\nvar dd = d.data.data;\nfunction pad(n) { return n < 10 ? '0' + n : '' + n; }\nfunction fmtTime(ts) {\n  var t = new Date(parseInt(ts) * 1000);\n  return t.getFullYear() + '-' + pad(t.getMonth() + 1) + '-' + pad(t.getDate()) + ' ' + pad(t.getHours()) + ':' + pad(t.getMinutes()) + ':' + pad(t.getSeconds());\n}\nvar info = '';\ninfo += '🆔 书号：' + (dd.book_id || '') + '\\n';\ninfo += '📕 书名：' + (dd.book_name || '') + '\\n';\ninfo += '🎯 状况：' + (dd.creation_status == '0' ? '连载中' : '已完结') + '\\n';\ninfo += '✏️ 开坑：' + String(dd.create_time || '').substring(0, 10) + '\\n';\ninfo += '🕰️ 更新：' + (dd.last_publish_time ? fmtTime(dd.last_publish_time) : '') + '\\n';\ninfo += '⌨️ 字数：' + (dd.word_number || '0') + '字\\n';\ninfo += '🏷️ 标签：' + (dd.tags || '') + '\\n';\ninfo += '📊 评分：' + (dd.score || '0') + '分\\n';\ninfo += '🔖 分类：' + (dd.category || '') + '\\n';\ninfo += '📜 简介：\\n' + (dd.abstract || '');\nresult = info;", "kind": "$.data.data.category", "name": "$.data.data.book_name", "tocUrl": "@js:\nvar u = baseUrl + '';\nif (u.indexOf('detail') > -1) {\n  result = u.split('detail').join('book');\n} else {\n  result = u;\n}"}, "ruleContent": {"content": "@js:\nvar d = JSON.parse(result);\nvar content = d.data.content;\nvar v = String(source.getVariable()).split(',');\nvar mode = parseInt(v[0]) || 0;\nif (mode == 0 && !CMTOFF()) {\n  var bid = '';\n  var m = baseUrl.match(/bid=(\\d+)/);\n  if (m) bid = m[1];\n  try {\n    var all = [];\n    var offset = 0;\n    var LIMIT = 100;    //评论总数量\n    while (all.length < LIMIT) {\n      var cr = JSON.parse(java.ajax('http://101.35.133.34:5000/api/comment?book_id=' + bid + '&count=50&offset=' + offset));\n      var cmts = cr.data.data.comment;\n      if (!cmts || cmts.length === 0) break;\n      all = all.concat(cmts);\n      if (!cr.data.data.has_more) break;\n      offset += 50;\n    }\n    if (all.length > 0) {\n      content += '\\n\\n━━━━━━━━━━━━━━━━━━\\n💬 本书书评（共' + all.length + '条）\\n━━━━━━━━━━━━━━━━━━\\n';\n      for (var i = 0; i < all.length; i++) {\n        var c = all[i];\n        var nick = (c.user_info && c.user_info.user_name) ? c.user_info.user_name : '匿名';\n        var digg = c.digg_count || 0;\n        var rep = c.reply_count || 0;\n        var sc = c.score || '';\n        var txt = String(c.text).split('\\n').join(' ').substring(0, 80);\n        var line = '👤 ' + nick;\n        if (sc) line += ' ⭐' + sc;\n        line += ' 👍' + digg + ' 💬' + rep;\n        content += line + '\\n📝 ' + txt + '\\n';\n      }\n    }\n  } catch (e) {}\n}\nresult = content;"}, "ruleExplore": {"author": "$.author", "bookList": "@Json:data", "bookUrl": "$.book_id@js:'http://101.35.133.34:5000/api/detail?book_id=' + result", "coverUrl": "$.thumb_url", "intro": "$.abstract", "kind": "$.category", "name": "$.book_name"}, "ruleSearch": {"author": "$.author", "bookList": "@js:\nvar d = JSON.parse(result);\nvar tabs = d.data.search_tabs;\nvar v = String(this.source.getVariable()).split(\",\");\nvar idx = parseInt(v[0]) || 0;\nvar typeValues = [3, 2, 8, 11];\nvar currentType = typeValues[idx] !== undefined ? typeValues[idx] : 3;\nvar books = [];\nfor (var i = 0; i < tabs.length; i++) {\n    if (tabs[i].tab_type == currentType && tabs[i].data) {\n        for (var j = 0; j < tabs[i].data.length; j++) {\n            var g = tabs[i].data[j];\n            if (currentType == 11) {\n                // === 短剧: 从 video_data 取, 统一成书结构 ===\n                var vd = g.video_data;\n                if (vd) {\n                    for (var k = 0; k < vd.length; k++) {\n                        var it = vd[k];\n                        var cat = '';\n                        try {\n                            var cs = JSON.parse(it.category_schema || '[]');\n                            if (cs[0]) cat = cs[0].name;\n                        } catch (e) {}\n                        books.push(JSON.stringify({\n                            book_name: it.title || it.raw_book_name || '',\n                            author: it.author || '',\n                            category: cat,\n                            abstract: it.rec_text || it.sub_title || '',\n                            thumb_url: it.cover || it.horiz_cover || '',\n                            book_id: it.series_id || it.vid || ''\n                        }));\n                    }\n                }\n            } else {\n                // === 小说/听书/漫画: 原有逻辑 ===\n                var bd = g.book_data;\n                if (bd) {\n                    for (var k = 0; k < bd.length; k++) {\n                        books.push(JSON.stringify(bd[k]));\n                    }\n                }\n            }\n        }\n    }\n}\nresult = books;", "bookUrl": "$.book_id@js:'http://101.35.133.34:5000/api/detail?book_id=' + result", "coverUrl": "$.thumb_url", "intro": "$.abstract", "kind": "$.category", "name": "$.book_name"}, "ruleToc": {"chapterList": "@Json:data.data.chapterListWithVolume@js:\nvar arr=[];\nfor(var i=0;\ni<result.length;\ni++){arr=arr.concat(result[i]);\n}result=arr;", "chapterName": "title", "chapterUrl": "@js:\nvar bid = '';\nvar m = baseUrl.match(/book_id=(\\d+)/);\nif (m) bid = m[1];\n'http://101.35.133.34:5000/api/content?tab=' + TAB() + '&item_id=' + result.itemId + '&bid=' + bid"}, "searchUrl": "@js:\nvar base = 'http://101.35.133.34:5000';\nvar offset = (page - 1) * 10;\nbase + '/api/search?key=' + java.encodeURI(key) + '&tab_type=' + TYPE() + '&offset=' + offset", "weight": 0},{"bookSourceComment": "//2025.1.11by.◎辞晨◎\n触发CF以后在首页随便点击一本漫画进入正文关掉再搜索。如果还是没能成功获取cookie就退出阅读，删掉后台，再进一次，点击进入漫画正文直到触发CF继续获取cookie就可以了。", "bookSourceGroup": "a", "bookSourceName": "MY漫画◎辞晨◎", "bookSourceType": 2, "bookSourceUrl": "https://mycomic.com/cn", "customButton": false, "customOrder": 724, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nsort=[];\npush=(title,url,type1,type2)=>sort.push({\n\t\ttitle: title,\n\t\turl: url,\n\t\tstyle: {\n\t\t\t\tlayout_flexGrow: type1,\n\t\t\t\tlayout_flexBasisPercent: type2\n\t\t\t}\n\t});\npush(\"全部🌊分类\",null,1,1)\n\tarList=[ [\"🌊魔幻🌊\",\"mohuan\"],[\"🌊魔法🌊\",\"mofa\"],[\"🌊熱血🌊\",\"rexue\"],[\"🌊冒險🌊\",\"maoxian\"],[\"🌊懸疑🌊\",\"xuanyi\"],[\"🌊偵探🌊\",\"zhentan\"],[\"🌊愛情🌊\",\"aiqing\"],[\"🌊校園🌊\",\"xiaoyuan\"],[\"🌊搞笑🌊\",\"gaoxiao\"],[\"🌊四格🌊\",\"sige\"],[\"🌊科幻🌊\",\"kehuan\"],[\"🌊神鬼🌊\",\"shengui\"],[\"🌊舞蹈🌊\",\"wudao\"],[\"🌊音樂🌊\",\"yinyue\"],[\"🌊百合🌊\",\"baihe\"],[\"🌊後宮🌊\",\"hougong\"],[\"🌊機戰🌊\",\"jizhan\"],[\"🌊格鬥🌊\",\"gedou\"],[\"🌊恐怖🌊\",\"kongbu\"],[\"🌊萌系\",\"mengxi\"],[\"🌊武俠🌊\",\"wuxia\"],[\"🌊社會🌊\",\"shehui\"],[\"🌊歷史🌊\",\"lishi\"],[\"🌊耽美🌊\",\"danmei\"],[\"🌊勵志🌊\",\"lizhi\"],[\"🌊職場🌊\",\"zhichang\"],[\"生活🌊\",\"shenghuo\"],[\"🌊治癒🌊\",\"zhiyu\"],[\"🌊偽娘🌊\",\"weiniang\"],[\"🌊黑道🌊\",\"heidao\"],[\"🌊戰爭🌊\",\"zhanzheng\"],[\"🌊競技🌊\",\"jingji\"],[\"🌊體育🌊\",\"tiyu\"],[\"🌊美食🌊\",\"meishi\"],[\"🌊腐女\",\"funv\"],[\"🌊宅男🌊\",\"zhainan\"],[\"🌊推理🌊\",\"tuili\"],[\"🌊雜誌🌊\",\"zazhi\"]]\n\tnrList=[[\"最近更新\",\"sort=-update\"],[\"最高人气\",\"sort=-views\"],[\"最新上架\",\"\"]]\n\tmrList=[[\"日本\",\"japan\"],[\"港台\",\"hongkong\"],[\"欧美\",\"europe\"],[\"内地\",\"china\"],[\"韩国\",\"korea\"],[\"其他\",\"other\"]]\n\t\t\t\tarList.map(([tag,uri])=>{\n\t\t\tjava.put(\"p\",`${uri}`)\n\t\t\ttag=java.t2s(tag);\n\t\turl=`/comics?filter%5Btag%5D=${uri}&page={{page}}`;\n\t\tpush(tag, url, 1, 1);\n\t\t\n\t\tnrList.map(([teg,ure])=>{\n\t\t\tjava.put(\"k\",`${ure}`)\npush(teg,`/comics?filter%5Btag%5D=${uri}&${ure}&page={{page}}`,1,0.29)\n}) \t\nmrList.map(([trg,uro])=>{\nnrList.map(([teg,ure])=>{\n\t\t​push(trg,`/comics?filter%5Btag%5D=${uri}&filter%5Bcountry%5D=${uro}&${ure}&page={{page}}`,1,0.25);\n});\n});\n});\n\t\t\t\t//java.log(JSON.stringify(sort))\nJSON.stringify(sort)", "header": "{\n  'User-Agent': \"Mozilla/5.0 (Linux; Android 15; V2304A Build/AP3A.240905.015.A2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/126.0.6478.71 Mobile Safari/537.36\",\n  'sec-ch-ua-platform': \"\\\"Android\\\"\",\n  'origin': \"https://mycomic.com/cn\",\n  'x-requested-with': \"cn.mujiankeji.mbrowser\",\n  'referer': \"https://mycomic.com/cn\",\n  'accept-language': \"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7\"\n}", "jsLib": "s = '皑蔼碍爱翱袄奥坝罢摆败颁办绊帮绑镑谤剥饱宝报鲍辈贝钡狈备惫绷笔毕毙闭边编贬变辩辫鳖瘪濒滨宾摈饼拨钵铂驳卜补参蚕残惭惨灿苍舱仓沧厕侧册测层诧搀掺蝉馋谗缠铲产阐颤场尝长偿肠厂畅钞车彻尘陈衬撑称惩诚骋痴迟驰耻齿炽冲虫宠畴踌筹绸丑橱厨锄雏础储触处传疮闯创锤纯绰辞词赐聪葱囱从丛凑窜错达带贷担单郸掸胆惮诞弹当挡党荡档捣岛祷导盗灯邓敌涤递缔点垫电淀钓调迭谍叠钉顶锭订东动栋冻斗犊独读赌镀锻断缎兑队对吨顿钝夺鹅额讹恶饿儿尔饵贰发罚阀珐矾钒烦范贩饭访纺飞废费纷坟奋愤粪丰枫锋风疯冯缝讽凤肤辐抚辅赋复负讣妇缚该钙盖干赶秆赣冈刚钢纲岗皋镐搁鸽阁铬个给龚宫巩贡钩沟构购够蛊顾剐关观馆惯贯广规硅归龟闺轨诡柜贵刽辊滚锅国过骇韩汉阂鹤贺横轰鸿红后壶护沪户哗华画划话怀坏欢环还缓换唤痪焕涣黄谎挥辉毁贿秽会烩汇讳诲绘荤浑伙获货祸击机积饥讥鸡绩缉极辑级挤几蓟剂济计记际继纪夹荚颊贾钾价驾歼监坚笺间艰缄茧检碱硷拣捡简俭减荐槛鉴践贱见键舰剑饯渐溅涧浆蒋桨奖讲酱胶浇骄娇搅铰矫侥脚饺缴绞轿较秸阶节茎惊经颈静镜径痉竞净纠厩旧驹举据锯惧剧鹃绢杰洁结诫届紧锦仅谨进晋烬尽劲荆觉决诀绝钧军骏开凯颗壳课垦恳抠库裤夸块侩宽矿旷况亏岿窥馈溃扩阔蜡腊莱来赖蓝栏拦篮阑兰澜谰揽览懒缆烂滥捞劳涝乐镭垒类泪篱离里鲤礼丽厉励砾历沥隶俩联莲连镰怜涟帘敛脸链恋炼练粮凉两辆谅疗辽镣猎临邻鳞凛赁龄铃凌灵岭领馏刘龙聋咙笼垄拢陇楼娄搂篓芦卢颅庐炉掳卤虏鲁赂禄录陆驴吕铝侣屡缕虑滤绿峦挛孪滦乱抡轮伦仑沦纶论萝罗逻锣箩骡骆络妈玛码蚂马骂吗买麦卖迈脉瞒馒蛮满谩猫锚铆贸么霉没镁门闷们锰梦谜弥觅绵缅庙灭悯闽鸣铭谬谋亩钠纳难挠脑恼闹馁腻撵捻酿鸟聂啮镊镍柠狞宁拧泞钮纽脓浓农疟诺欧鸥殴呕沤盘庞国爱赔喷鹏骗飘频贫苹凭评泼颇扑铺朴谱脐齐骑岂启气弃讫牵扦钎铅迁签谦钱钳潜浅谴堑枪呛墙蔷强抢锹桥乔侨翘窍窃钦亲轻氢倾顷请庆琼穷趋区躯驱龋颧权劝却鹊让饶扰绕热韧认纫荣绒软锐闰润洒萨鳃赛伞丧骚扫涩杀纱筛晒闪陕赡缮伤赏烧绍赊摄慑设绅审婶肾渗声绳胜圣师狮湿诗尸时蚀实识驶势释饰视试寿兽枢输书赎属术树竖数帅双谁税顺说硕烁丝饲耸怂颂讼诵擞苏诉肃虽绥岁孙损笋缩琐锁獭挞抬摊贪瘫滩坛谭谈叹汤烫涛绦腾誊锑题体屉条贴铁厅听烃铜统头图涂团颓蜕脱鸵驮驼椭洼袜弯湾顽万网韦违围为潍维苇伟伪纬谓卫温闻纹稳问瓮挝蜗涡窝呜钨乌诬无芜吴坞雾务误锡牺袭习铣戏细虾辖峡侠狭厦锨鲜纤咸贤衔闲显险现献县馅羡宪线厢镶乡详响项萧销晓啸蝎协挟携胁谐写泻谢锌衅兴汹锈绣虚嘘须许绪续轩悬选癣绚学勋询寻驯训讯逊压鸦鸭哑亚讶阉烟盐严颜阎艳厌砚彦谚验鸯杨扬疡阳痒养样瑶摇尧遥窑谣药爷页业叶医铱颐遗仪彝蚁艺亿忆义诣议谊译异绎荫阴银饮樱婴鹰应缨莹萤营荧蝇颖哟拥佣痈踊咏涌优忧邮铀犹游诱舆鱼渔娱与屿语吁御狱誉预驭鸳渊辕园员圆缘远愿约跃钥岳粤悦阅云郧匀陨运蕴酝晕韵杂灾载攒暂赞赃脏凿枣灶责择则泽贼赠扎札轧铡闸诈斋债毡盏斩辗崭栈战绽张涨帐账胀赵蛰辙锗这贞针侦诊镇阵挣睁狰帧郑证织职执纸挚掷帜质钟终种肿众诌轴皱昼骤猪诸诛烛瞩嘱贮铸筑驻专砖转赚桩庄装妆壮状锥赘坠缀谆浊兹资渍踪综总纵邹诅组钻致钟么为只凶准启板里雳余链泄';\nt = '皚藹礙愛翺襖奧壩罷擺敗頒辦絆幫綁鎊謗剝飽寶報鮑輩貝鋇狽備憊繃筆畢斃閉邊編貶變辯辮鼈癟瀕濱賓擯餅撥缽鉑駁蔔補參蠶殘慚慘燦蒼艙倉滄廁側冊測層詫攙摻蟬饞讒纏鏟産闡顫場嘗長償腸廠暢鈔車徹塵陳襯撐稱懲誠騁癡遲馳恥齒熾沖蟲寵疇躊籌綢醜櫥廚鋤雛礎儲觸處傳瘡闖創錘純綽辭詞賜聰蔥囪從叢湊竄錯達帶貸擔單鄲撣膽憚誕彈當擋黨蕩檔搗島禱導盜燈鄧敵滌遞締點墊電澱釣調叠諜疊釘頂錠訂東動棟凍鬥犢獨讀賭鍍鍛斷緞兌隊對噸頓鈍奪鵝額訛惡餓兒爾餌貳發罰閥琺礬釩煩範販飯訪紡飛廢費紛墳奮憤糞豐楓鋒風瘋馮縫諷鳳膚輻撫輔賦複負訃婦縛該鈣蓋幹趕稈贛岡剛鋼綱崗臯鎬擱鴿閣鉻個給龔宮鞏貢鈎溝構購夠蠱顧剮關觀館慣貫廣規矽歸龜閨軌詭櫃貴劊輥滾鍋國過駭韓漢閡鶴賀橫轟鴻紅後壺護滬戶嘩華畫劃話懷壞歡環還緩換喚瘓煥渙黃謊揮輝毀賄穢會燴彙諱誨繪葷渾夥獲貨禍擊機積饑譏雞績緝極輯級擠幾薊劑濟計記際繼紀夾莢頰賈鉀價駕殲監堅箋間艱緘繭檢堿鹼揀撿簡儉減薦檻鑒踐賤見鍵艦劍餞漸濺澗漿蔣槳獎講醬膠澆驕嬌攪鉸矯僥腳餃繳絞轎較稭階節莖驚經頸靜鏡徑痙競淨糾廄舊駒舉據鋸懼劇鵑絹傑潔結誡屆緊錦僅謹進晉燼盡勁荊覺決訣絕鈞軍駿開凱顆殼課墾懇摳庫褲誇塊儈寬礦曠況虧巋窺饋潰擴闊蠟臘萊來賴藍欄攔籃闌蘭瀾讕攬覽懶纜爛濫撈勞澇樂鐳壘類淚籬離裏鯉禮麗厲勵礫曆瀝隸倆聯蓮連鐮憐漣簾斂臉鏈戀煉練糧涼兩輛諒療遼鐐獵臨鄰鱗凜賃齡鈴淩靈嶺領餾劉龍聾嚨籠壟攏隴樓婁摟簍蘆盧顱廬爐擄鹵虜魯賂祿錄陸驢呂鋁侶屢縷慮濾綠巒攣孿灤亂掄輪倫侖淪綸論蘿羅邏鑼籮騾駱絡媽瑪碼螞馬罵嗎買麥賣邁脈瞞饅蠻滿謾貓錨鉚貿麽黴沒鎂門悶們錳夢謎彌覓綿緬廟滅憫閩鳴銘謬謀畝鈉納難撓腦惱鬧餒膩攆撚釀鳥聶齧鑷鎳檸獰甯擰濘鈕紐膿濃農瘧諾歐鷗毆嘔漚盤龐國愛賠噴鵬騙飄頻貧蘋憑評潑頗撲鋪樸譜臍齊騎豈啓氣棄訖牽扡釺鉛遷簽謙錢鉗潛淺譴塹槍嗆牆薔強搶鍬橋喬僑翹竅竊欽親輕氫傾頃請慶瓊窮趨區軀驅齲顴權勸卻鵲讓饒擾繞熱韌認紉榮絨軟銳閏潤灑薩鰓賽傘喪騷掃澀殺紗篩曬閃陝贍繕傷賞燒紹賒攝懾設紳審嬸腎滲聲繩勝聖師獅濕詩屍時蝕實識駛勢釋飾視試壽獸樞輸書贖屬術樹豎數帥雙誰稅順說碩爍絲飼聳慫頌訟誦擻蘇訴肅雖綏歲孫損筍縮瑣鎖獺撻擡攤貪癱灘壇譚談歎湯燙濤縧騰謄銻題體屜條貼鐵廳聽烴銅統頭圖塗團頹蛻脫鴕馱駝橢窪襪彎灣頑萬網韋違圍爲濰維葦偉僞緯謂衛溫聞紋穩問甕撾蝸渦窩嗚鎢烏誣無蕪吳塢霧務誤錫犧襲習銑戲細蝦轄峽俠狹廈鍁鮮纖鹹賢銜閑顯險現獻縣餡羨憲線廂鑲鄉詳響項蕭銷曉嘯蠍協挾攜脅諧寫瀉謝鋅釁興洶鏽繡虛噓須許緒續軒懸選癬絢學勳詢尋馴訓訊遜壓鴉鴨啞亞訝閹煙鹽嚴顔閻豔厭硯彥諺驗鴦楊揚瘍陽癢養樣瑤搖堯遙窯謠藥爺頁業葉醫銥頤遺儀彜蟻藝億憶義詣議誼譯異繹蔭陰銀飲櫻嬰鷹應纓瑩螢營熒蠅穎喲擁傭癰踴詠湧優憂郵鈾猶遊誘輿魚漁娛與嶼語籲禦獄譽預馭鴛淵轅園員圓緣遠願約躍鑰嶽粵悅閱雲鄖勻隕運蘊醞暈韻雜災載攢暫贊贓髒鑿棗竈責擇則澤賊贈紮劄軋鍘閘詐齋債氈盞斬輾嶄棧戰綻張漲帳賬脹趙蟄轍鍺這貞針偵診鎮陣掙睜猙幀鄭證織職執紙摯擲幟質鍾終種腫衆謅軸皺晝驟豬諸誅燭矚囑貯鑄築駐專磚轉賺樁莊裝妝壯狀錐贅墜綴諄濁茲資漬蹤綜總縱鄒詛組鑽緻鐘麼為隻兇準啟闆裡靂餘鍊洩';\nfunction tzs(z){\n\tconst {java} = this;\n\t//安卓L不支持解构\n\t//const java = this.java;\n\tvar a = '';\n\tvar l = z.length;\n\tfor(var i=0; i<l; i++){\n\t\tvar c = z.charAt(i);\n\t\tvar p = t.indexOf(c);\n\t\ta += p < 0 ? c : s.charAt(p);\n\t}\n\treturn java.t2s(a);\n}", "lastUpdateTime": "1786188605338", "loginCheckJs": "var src = result.body();\nif (src.match(/Just a moment|Checking your browser|Performing security verification|Verifying you are human/)) {\n    cookie.removeCookie(source.bookSourceUrl);\n    var url = result.url();\n    java.startBrowserAwait(url, \"Cloudflare验证\");\n    result = java.connect(url);\n}\nresult;", "loginUrl": "https://mycomic.com", "respondTime": 49565, "ruleBookInfo": {"author": "[name$=\"author\"]@content", "coverUrl": "[property=\"og:image\"]@content", "init": "<js>tzs(result)</js>", "intro": "[property=\"og:description\"]@content", "kind": "{{@@[name$=\"keywords\"]@content}},{{@@time@text}}", "name": "{{book.name}}", "wordCount": "[property$=status]@content"}, "ruleContent": {"content": ".-mx-6@img@src&&img@data-src\n<js>\n//java.log(result);\nlet newResult = result.split(\"\\n\").map(x => x);\nlet headers = JSON.stringify({\"headers\":{\"Referer\":baseUrl}});\nnewResult.map(x => `<img src=\"${x},${headers}\">`).join(\"\\n\");\n</js>", "imageStyle": "FULL"}, "ruleExplore": [], "ruleSearch": {"bookList": "<js>tzs(result)</js>\n.group", "bookUrl": "a.0@href", "coverUrl": "img@data-src", "lastChapter": ".text-white@text", "name": ".text-sm.1@text"}, "ruleToc": {"chapterList": "<js>\np = result.match(/chapters\\:\\s(\\[.*\\])/);\n//java.log(p[1])\nif (p && p[1]) {\n  let arr = JSON.parse(p[1]);\n  arr.reverse();\n  result = JSON.stringify(arr);\n} else {\n  java.log('未匹配到相关内容');\n}\nresult\n</js>\n$.[*]", "chapterName": "$.title", "chapterUrl": "https://mycomic.com/cn/chapters/{{$.id}}"}, "searchUrl": "/comics?q={{key}}&page={{page}}", "weight": 0},{"bookSourceComment": "2026.8.8 修复搜索只有一本书的情况，原代码为{{eval(String(source.loginUrl));GetUL();}}/search.html?q={{key}}&f=_all&sort={{Sort_('search')}}&p={{page}}&serialize=\n\t修复后{{eval(String(source.loginUrl));GetUL();}}/search.html?q={{key}}&f=_al\n2026.7.29 修复获取站源，优化书评格式 ◎夜泽川◎\n2026.6.21 更新获取站源目标 ◎夜泽川◎\n2026.5.24 修复诸多问题 ◎夜泽川◎\n2024.7.26 ◎夜泽川◎\n//搜索和发现需要封面可复制规则到相应位置，因为封面是从详情取的，所以可能会导致加载变慢甚至超时，自行斟酌。↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓\na@href\n<js>\nul = GetUL() + result;\njava.ajax(ul);\n</js>\n[property$=image]@content", "bookSourceGroup": "自制", "bookSourceName": "®️爱丽丝书屋（路人修）", "bookSourceType": 0, "bookSourceUrl": "爱丽丝书屋", "bookUrlPattern": "https?:\\/\\/.*?\\..*?(xnxnxn|alice|爱丽丝|als).*?\\.[a-zA-Z]+?\\/novel\\/\\d+\\.html", "customButton": false, "customOrder": 3, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\neval(String(source.loginUrl));\nlet Cookie = cookie.getCookie(GetUL());\nif (!/lf_user_auth/.test(Cookie) && source.getLoginHeader()) {\n    let ck = source.getLoginHeaderMap()['Cookie']\n    cookie.setCookie(GetUL(), ck);\n    java.toast('登录状态掉了，已重新登陆');\n}\nvar result = [];\nvar headers = JSON.stringify({\"headers\":{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.6167.171 Safari/537.36\"}});\nvar push = (title, url, size) =>\n    result.push({\n        title: title,\n        url: url ? `{{GetUL()}}${url},` + headers : url,\n        style: {\n            layout_flexGrow: 1,\n            layout_flexBasisPercent: size\n        }\n    });\npush(`当前站源：${GetUL()}`, null, 1)\nif (source.getLoginHeader()) {\n    let jc = source.getLoginHeaderMap();\n    let inf = decodeURIComponent(jc.get(\"Cookie\"));\n    let info = decodeURIComponent(inf).match(/\\{[\\s\\S]+\\}/)[0];\n    let username = JSON.parse(info)['username'];\n    let expe = Ajax(`${GetUL()}/user/index/index.html`);\n    let ex = org.jsoup.Jsoup.parse(expe).select('.group , .user-data li');\n    push(`用户◎${username}◎中心`, null, 1);\n    push(\"书架\", \"/user/bookshelf?page={{page}}\", 0.45);\n    push(\"阅读记录\", \"/user/recentread/index.html\", 0.45);\n    ex.forEach(xp => {\n        nam = String(xp.text()).replace(/[^\\u4e00-\\u9fa5a-zA-Z0-9]/g, \"\");\n        title = /\\d/.test(nam) ? nam.replace(/(\\d+)([^\\d]+)/, \"$2：$1\") : nam.replace(/^/, \"用户等级：\");\n        push(title, null, 0.45);\n    });\n} else {\n    push(\"未登录\", null, 1);\n}\npush(\"--------书库--------\", null, 1);\npush(\"最近更新\", \"/all{{Sort_()}}.html\", 0.45);\npush(\"原创\", \"/original.html?page={{page}}\", 0.45);\npush(\"排行\", null, 1);\nvar src = Ajax(`${GetUL()}/all/order/hits+desc.html`);\nvar ph = org.jsoup.Jsoup.parse(src).select('.paihang_ds a');\nph.forEach(ta => {\n    nam = ta.text();\n    ul = ta.attr('href')\n    push(nam, ul, 0.45);\n})\npush(\"分类\", null, 1);\nvar tag = org.jsoup.Jsoup.parse(src).select('.fenlei_ds a');\ntag.forEach(ta => {\n    nam = ta.text();\n    ul = String(ta.attr('href')).replace(/$/, \"?page={{page}}\").replace(/lists/, \"all/id\").replace(/\\.html/, `{{Sort_()}}$&`);\n    push(nam, ul, 0.25);\n})\nif (source.getLoginInfoMap()?.[\"发现自定义标签🏷️（中 / 英逗号分隔）\"] != \"\") {\n\t   push(\"自定义标签🏷️\", null, 1);\n\t   let myTags = String(source.getLoginInfoMap()[\"发现自定义标签🏷️（中 / 英逗号分隔）\"]).split(/[,，]/);\n\t   myTags.forEach(tag => {\n\t   \tlet url = `/search.html?q=${tag}&f=tag&sort={{Sort_('search')}}&p={{page}}&serialize=`;\n\t   \tpush(tag, url, 0.25);\n\t   \t});\n}\nJSON.stringify(result);", "header": "{\"User-Agent\": \"Mozilla/5.0 (Android 11; Mobile; rv:147.0) Gecko/147.0 Firefox/147.0\"}", "jsLib": "//构建验证参数\nfunction calculateChecksum(nonce, cookieString) {\n    var cpk = \"ge_ua_p\";\n    if (!cookieString || !nonce) {\n        return null;\n    }\n    \n    var cookieValue = \"\";\n    var cookieArray = cookieString.toString().split(\";\");\n    \n    for (var i = 0; i < cookieArray.length; i++) {\n        var cookie = cookieArray[i].trim();\n        var parts = cookie.split(\"=\");\n        if (parts.length === 2 && parts[0] === cpk) {\n            cookieValue = parts[1];\n            break;\n        }\n    }\n    \n    if (cookieValue.length === 0) {\n        return null;\n    }\n    \n    var sum = 12345;\n    for (var i = 0; i < cookieValue.length; i++) {\n        var char = cookieValue[i];\n        if (/^[a-zA-Z0-9]$/.test(char)) {\n            sum += cookieValue.charCodeAt(i) * (nonce + i);\n        }\n    }\n    \n    return {\n    \t\"body\": \"sum=\" + sum + \"&nonce=\" + nonce,\n    \t\"cookieValue\": cookieValue\n    \t};\n}\n\nfunction Check_(src, cookies = null, url) {\n    const { java } = this;\n    if (!/Checking your browser/.test(src)) return src;\n    java.toast('检测到验证，正在自动处理中……');\n    let nonce = parseInt(src.match(/nonce\\s*=\\s*(\\d+)/)[1]);\n    cookies = String(cookies);\n    //java.log(`${cookies}|${nonce}`);\n\n    let data = calculateChecksum(nonce, cookies);\n\n    let headers = {\n        \"User-Agent\": \"Mozilla/5.0 (Android 11; Mobile; rv:140.0) Gecko/140.0 Firefox/140.0\",\n        \"Content-Type\": \"application/x-www-form-urlencoded\",\n        \"Referer\": String(this.GetUL() + \"/\"),\n        \"X-Ge-Ua-Step\": \"prev\",\n        \"Cookie\": String(\"ge_ua_p=\" + data.cookieValue)\n    };\n    \n    let postResponse = java.post(this.GetUL(), data.body, headers);\n    \n    let success = JSON.parse(postResponse.body()).ok;\n    java.toast(success ? '验证通过' : '验证失败，请重试！');\n\n    if (!success) return src;\n    \n    return java.ajax(url);\n}\n\nfunction Sort_(t) {\n\t   const { source } = this\n    const sgvs = JSON.parse(source.getVariable())?.s || 0;\n    \n    if (!sgvs) return t === 'search' ? 'relevance' : '';\n    const sorts = ['update_time+desc', 'hits+desc', 'word+desc'];\n    const sort = sorts[sgvs - 1];\n    \n    if (t === 'search') {\n        return sort.replace('+', '_');\n    }\n    return '/order/' + sort;\n}\n\nfunction GetUL() {\n\tconst { source } = this;\n\tlet sourceul = JSON.parse(source.getVariable()).sourl;\n\treturn sourceul;\n}\n\nfunction timeov(times) {\n    const date = new Date(times);\n    const year = date.getFullYear();\n    const month = String(date.getMonth() + 1).padStart(2, '0');\n    const day = String(date.getDate()).padStart(2, '0');\n    const hours = String(date.getHours()).padStart(2, '0');\n    const minutes = String(date.getMinutes()).padStart(2, '0');\n    const seconds = String(date.getSeconds()).padStart(2, '0');\n    \n    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n}\n\ncodesvg = \"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIAogICAgIHZpZXdCb3g9IjAgMCA3MDAgMjAwIiAKICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIgogICAgIHN0eWxlPSJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyI+CiAgPHJlY3Qgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0id2hpdGUiLz4KICAKICA8IS0tIOmhtumDqOagh+mimCAtLT4KICA8dGV4dCB4PSI1MCUiIHk9IjQwIiAKICAgICAgICBmb250LXNpemU9IjIwIiAKICAgICAgICBmb250LXdlaWdodD0iYm9sZCIgCiAgICAgICAgdGV4dC1hbmNob3I9Im1pZGRsZSIgCiAgICAgICAgZmlsbD0iIzAwMCI+6YCJ5oup5Y+R6YCB57G75Z6LPC90ZXh0PgogIAogIDwhLS0g6K+E6K665qih5Z2XIC0tPgogIDx0ZXh0IHg9IjI1JSIgeT0iOTAiIAogICAgICAgIGZvbnQtc2l6ZT0iMTYiIAogICAgICAgIGZvbnQtd2VpZ2h0PSJib2xkIiAKICAgICAgICB0ZXh0LWFuY2hvcj0ibWlkZGxlIiAKICAgICAgICBmaWxsPSIjMDAwIj7or4Torro8L3RleHQ+CiAgPHRleHQgeD0iMjUlIiB5PSIxMTAiIAogICAgICAgIGZvbnQtc2l6ZT0iMTQiIAogICAgICAgIGZvbnQtd2VpZ2h0PSJib2xkIiAKICAgICAgICB0ZXh0LWFuY2hvcj0ibWlkZGxlIiAKICAgICAgICBmaWxsPSIjMDAwIj4o5aGr5YaZIuivhOiuuiIpPC90ZXh0PgogIAogIDwhLS0g5Zue5aSN5qih5Z2XIC0tPgogIDx0ZXh0IHg9Ijc1JSIgeT0iOTAiIAogICAgICAgIGZvbnQtc2l6ZT0iMTYiIAogICAgICAgIGZvbnQtd2VpZ2h0PSJib2xkIiAKICAgICAgICB0ZXh0LWFuY2hvcj0ibWlkZGxlIiAKICAgICAgICBmaWxsPSIjMDAwIj7lm57lpI08L3RleHQ+CiAgPHRleHQgeD0iNzUlIiB5PSIxMTAiIAogICAgICAgIGZvbnQtc2l6ZT0iMTQiIAogICAgICAgIGZvbnQtd2VpZ2h0PSJib2xkIiAKICAgICAgICB0ZXh0LWFuY2hvcj0ibWlkZGxlIiAKICAgICAgICBmaWxsPSIjMDAwIj4o5aGr5YaZIkBpZCIpPC90ZXh0PgogIAogIDwhLS0g5bqV6YOo5L+h5oGvIC0tPgogIDx0ZXh0IHg9IjUwJSIgeT0iMTgwIiAKICAgICAgICBmb250LXNpemU9IjE0IiAKICAgICAgICBmb250LXdlaWdodD0iYm9sZCIgCiAgICAgICAgdGV4dC1hbmNob3I9Im1pZGRsZSIgCiAgICAgICAgZmlsbD0iIzAwMCI+5qW85bGCaWTnroDku4vmnIk8L3RleHQ+Cjwvc3ZnPg==\";\n\nfunction Ajax(url) {\n     const { java, cookie } = this;\n     let result = java.ajax(url);\n     result = this.Check_(result, cookie.getCookie(this.GetUL()), url);\n     return result;\n}\n\nconst SALT1 = \"B3wlP9Tzo$0RIdlvX&^sg30^0&feAox%\";\nconst SALT2 = \"Rs4qM7mGrQ6aTMr8HHvv3WikTcY&kW8R\";\n\nconst PRIVATE_KEY = [\n    \"MIIEogIBAAKCAQEAnOUiABBEw9zzOqivp4uJxTd3D5Givmwx2i+JLVdyj9iO2S1E\",\n    \"crWOaO5k6lD4fbL0MnMH+luJhO3ySm1xDZy22ruzvPHhd+Sh3nH56+hOcj1jfpBx\",\n    \"lDPlwyo2nDshY0VFr/3fonFjepp5PP+eZKYt9YWtxrVMWOc0yNH6HuRA+zwUX28W\",\n    \"RlP/4vMWi6vEYt0XLt+lTBGqyvwxPYJBYivIehGz4exC7K1bpvX8LJWVARkvEIuf\",\n    \"Y3sQHtC/BTeYoEsipfZYafTgQHJ+KAOZSq/CET0USeTt+Evfn6YcbWX577DrRyGt\",\n    \"siJjojMEG5TKdDQWmGKTQb4E2+EpTrQYaCcaowIDAQABAoIBAC8L9noWZshkxPre\",\n    \"Am43RYTB8Q3WGfsH7psCjhvukQfZZFxzWocbMiz8733j8d+ffeJy4/2K3V3jDDiN\",\n    \"QM1YJOzKREdwMLAG+xL9EnhPHNbc2azmG2jZdxhi3CVVBdoCt7biZeEMJ0xobdqA\",\n    \"vDpqKnXpNAbV7qLqEcX2UQ5aW7H6BdCgGk9HRBKXs/ll65NZmxORXLoAVg+w7Vzi\",\n    \"XaLP6+43KNXUPLz0EPndDH9VkGlMcyu6q7pWLoz6eN0fNiP4Jfl9PbV4KFlye2xo\",\n    \"4FI+Go8luM0onDL1+bKE5RJHXqfS+ow9hYzBJSz39jyNpiH7j8Hg8mMDPm0VIYtM\",\n    \"sOF/RgECgYEAzuuziQzrT74ZW27AQqMFQFLvqMmnrhR4CPg0mRq/PMHSzh+Bs+nS\",\n    \"Gib2d1ulkKIDHPOG9EWKXBOUvHOBmGro+sOS9fnfoJYeNhLmX5K1xcDJpsBOMdZv\",\n    \"euEit2i7yy+KAc26fP+SoCQEHm1mlgZG1vcfJlPDofqwRyBeKHPAkGMCgYEAwhvb\",\n    \"Fw3udE0hws92+9GYmjES8jNauBaP3hlu3lmxcnjlVqlkHbc9PkvddmCsSB/5TUCH\",\n    \"7qJRgYLo+uov40zNNavXv8cTqWvDrJxTuDFn0OSjeIvqS9kXeVHjpBP6d4CCLAZM\",\n    \"b6owfM8JtBFx9ef9ll5mwBekZDrspEXOgoCQwMECgYBujaILvFpQ7alQn5ibQcxB\",\n    \"dM5VKQCs0oTbjflUP+UjCg+eT1kWDfxSOrT+SnnoD5eINVjKVAk7br7N/QylqaE2\",\n    \"sZ1oTIu9mdckXu6064aw1HMo46AjooVHatgIlC2ZvpmGoytbM5VceEG3HA5uY4Yf\",\n    \"vkLnUGO6vFzIc7O6+zVMLwKBgFmIab0vkt6YOUtXUIWEvwPYQOnwoBaraX7Dcm0j\",\n    \"KAMqGnanuWMvgxM6ARO6MZ0vCloEuu5qdnfrfzVFUgNhCIKKGgD+fWY3K9FxZfhe\",\n    \"6Yjj/Tb8Kn0DzJ0MFZk4Ed6PKvvNh/I1qRnYkZw6M7t+X2y9bF2MSiplN4PqIv/0\",\n    \"90/BAoGAQXzOzA3q+vcA9mwKvwXrPiSscmZMekV6RBUxf1riRzTnds9uWSTKz8QM\",\n    \"LpEoNB3tKSB+4raK6xJGJ914b+jc/B7ayHDksStOLeJLV6t5+bmoKjk6qBrUjTQX\",\n    \"y8x2rsHReaJw0SbZy+4x55nYTi/0mdzomR7N27EzYtzM7iWk5w0=\",\n].join(\"\\n\");\n\nfunction getAuthHeaders(sourceId, chapterId, t) {\n    const { java } = this;\n    const signStr = SALT1 + t + sourceId + chapterId + SALT2;\n    const token = java.digestHex(signStr, \"SHA-256\");\n\n    return {\n        \"User-Agent\": \"Mozilla/5.0 (Android 11; Mobile; rv:147.0) Gecko/147.0 Firefox/147.0\",\n        \"x-request-timestamp\": t,\n        \"x-request-token\": token,\n        \"X-Requested-With\": \"XMLHttpRequest\"\n    };\n}\n\nfunction decryptChapter(chapterData) {\n    const { java } = this;\n    const rsa = java.createAsymmetricCrypto(\"RSA/ECB/PKCS1Padding\");\n    rsa.setPrivateKey(java.base64DecodeToByteArray(PRIVATE_KEY));\n   \n    const AesKeyByte = java.base64DecodeToByteArray(rsa.decryptStr(chapterData.aes_key_encrypt, false));\n    \n    const aes = java.createSymmetricCrypto(\"AES/CBC/PKCS5Padding\", AesKeyByte, java.base64DecodeToByteArray(chapterData.iv));\n    \n    return aes.decryptStr(java.base64DecodeToByteArray(chapterData.content_encrypt));\n}\n\nfunction getContent(Data) {\n    const { java, source } = this;\n    const { source_id: sourceId, chapter_id:chapterId, t, sign} = Data;\n    const url = `${this.GetUL()}/home/chapter/info?id=${sourceId}&key=${chapterId}&t=${t}&sign=${sign}`;\n\n    const headers = this.getAuthHeaders(sourceId, chapterId, t);\n    //java.log(JSON.stringify(headers))\n    const response = java.get(url, headers);\n    //java.log(response.body())\n    const json = JSON.parse(response.body());\n\n    if (json.code === 1) {\n        const chapter = json.data.chapter;\n        const content = this.decryptChapter(chapter);\n        return content;\n    } else {\n        return \"加载失败：\" + json.msg;\n    }\n}", "lastUpdateTime": "1786172006113", "loginCheckJs": "if (/小说被禁用或已删除/.test(result.body())) java.toast('小说被禁用或已删除！');\nlet sr = Check_(result.body(), result.headers().get('set-cookie'), result.url());\nresult = Packages.io.legado.app.help.http.StrResponse(result.url(), sr);\nresult;", "loginUi": "[   \n    {\n        \"name\": \"获取站源\",\n        \"type\": \"button\",\n        \"action\": \"Geturls()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"站源1\",\n        \"type\": \"button\",\n        \"action\": \"Puturl(0)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"站源2\",\n        \"type\": \"button\",\n        \"action\": \"Puturl(1)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"站源3\",\n        \"type\": \"button\",\n        \"action\": \"Puturl(2)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"站源4\",\n        \"type\": \"button\",\n        \"action\": \"Puturl(3)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"用户名/邮箱\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"密码\",\n        \"type\": \"password\"\n    },\n    {\n        \"name\": \"注册\",\n        \"type\": \"button\",\n        \"action\": \"reg()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"登录\",\n        \"type\": \"button\",\n        \"action\": \"Login()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"登出\",\n        \"type\": \"button\",\n        \"action\": \"out()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"信息\",\n        \"type\": \"button\",\n        \"action\": \"show()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"评论展示开 / 关\",\n        \"type\": \"button\",\n        \"action\": \"Comment()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"点击切换分类排序方式\",\n        \"type\": \"button\",\n        \"action\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"默认\",\n        \"type\": \"button\",\n        \"action\": \"Tgch(0)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"时间\",\n        \"type\": \"button\",\n        \"action\": \"Tgch(1)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"人气\",\n        \"type\": \"button\",\n        \"action\": \"Tgch(2)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"字数\",\n        \"type\": \"button\",\n        \"action\": \"Tgch(3)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"发现自定义标签🏷️（中 / 英逗号分隔）\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"◎↓网络书架↓◎\",\n        \"type\": \"button\",\n        \"action\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"书籍ID\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"添加\",\n        \"type\": \"button\",\n        \"action\": \"AFBook(true)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"移除\",\n        \"type\": \"button\",\n        \"action\": \"AFBook(false)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"跳转\",\n        \"type\": \"button\",\n        \"action\": \"BookShelf()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    }\n]", "loginUrl": "var r = {\n\t   \"z\": 0,\n    \"s\": 0,\n    \"co\": 0,\n    \"urls\": [],\n    \"sourl\": \"https://www.alicesw.com\"\n};\n\ntry {\n    let v = JSON.parse(source.getVariable());\n    if (v === null && typeof v !== 'object' && Array.isArray(v)) {\n        source.setVariable(JSON.stringify(r, null, \"\\t\"));\n        java.toast('已初始化，使用默认站源');\n    }\n} catch (err) {\n    java.log(err.message);\n    source.setVariable(JSON.stringify(r, null, \"\\t\"));\n    java.toast('已初始化，使用默认站源');\n}\n\nvar sgv = JSON.parse(source.getVariable());\nvar sg = source.get(\"list\");\nvar ul = GetUL();\n\nfunction reg() {\n    java.startBrowser(`${ul}/user/user/reg.html`, \"注册账号\");\n}\n\nfunction Comment() {\n    let sgvo = sgv.co;\n    sgv.co = sgv.co ? 0 : 1;\n    source.setVariable(JSON.stringify(sgv, null, \"\\t\"));\n    java.toast(`\\n评论区\\n【${[\"开启\", \"禁用\"][sgvo]} → ${[\"开启\", \"禁用\"][sgv.co]}】`);\n}\n\nfunction login() {}\n\nfunction Tgch(o) {\n    const sort = [\"默认\", \"更新时间\", \"人气\", \"字数\"];\n    const one_ = sgv.s;\n    const msg = (sgv.s = o, source.setVariable(JSON.stringify(sgv, null, \"\\t\")), `排序方式\\n【${sort[one_]}→${sort[o]}】`);\n    java.toast(\"\\n\" + msg);\n}\n\nfunction Geturls() {\n    sgv.urls.length = 0;\n    try {\n        const res = org.jsoup.Jsoup.parse(java.get('https://xn--vcsx64d.asw4.cc/', {}).body()).select('.container a');\n        const url1 = java.base64Decode(res[0].attr('href').match(/['\"](.*?)['\"]/)[1]);\n        sgv.urls.push(String(url1).replace(/\\/?$/, \"\"));\n        const url2 = java.base64Decode(res[1].attr('href').match(/['\"](.*?)['\"]/)[1]);\n        let src = java.get(java.connect(url2).url(), {}).body();\n        src = java.get(org.jsoup.Jsoup.parse(src).select('#redirectButton').attr('href'), {}).body();\n        const seen = new Set();\n        for (let match of src.matchAll(/u\\d+\\s*=\\s*r\\([\"'](.*?)[\"']\\)/g)) {\n            if (!seen.has(match[1])) {\n                sgv.urls.push(match[1].split('').reverse().join(''));\n                seen.add(match[1]);\n            }\n        }\n        source.setVariable(JSON.stringify(sgv, null, \"\\t\"));\n\n        if (sgv.urls.length >= 2) {\n            java.toast(`获取成功，共获取到${sgv.urls.length}个站源\\n┎┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┒\\n${sgv.urls.join('\\n')}\\n┖┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┚`);\n        } else {\n            java.toast('获取失败，请重试或检查网络状况');\n        }\n    } catch (e) {\n        java.log(e);\n        java.toast('\\n未知错误，请检查网络或更新阅读版本！');\n    }\n}\n\nfunction Puturl(e) {\n    if (!sgv.urls.length) return java.toast('\\n当前没有站源，请获取后选择');\n    if (e + 1 > sgv.urls.length) return java.toast(`暂无站源${e+1}`);\n    \n    try {\n        const stime = Date.now();\n        java.get(sgv.urls[e], {});\n        const speedtime = (Date.now() - stime) / 1000;\n        \n        sgv.sourl = sgv.urls[e];\n        sgv?.booklist?.forEach(item => {\n            item.img = item.img.replace(/https?:\\/\\/[^\\/]+/, sgv.urls[e]);\n            item.url = item.url.replace(/https?:\\/\\/[^\\/]+/, sgv.urls[e]);\n        });\n        source.setVariable(JSON.stringify(sgv, null, \"\\t\"));\n        \n        // 切换接口保持登录状态\n        const Cookie = cookie.getCookie(sgv.urls[e]);\n        if (!/lf_user_auth/.test(Cookie) && source.getLoginHeader()) {\n            cookie.setCookie(sgv.urls[e], source.getLoginHeaderMap().get('Cookie'));\n        }\n        java.toast(`站源已设置为【站源${e + 1}】：\\n${sgv.urls[e]}\\n♦解析用时${speedtime}秒♦`);\n    } catch (err) {\n        java.log(err.message);\n        java.toast(`\\n【站源${e+1}：${sgv.urls[e]}】\\n已失效，请检查网络状况或切换其他站源`);\n    }\n}\n\nfunction Login() {\n    cookie.removeCookie(ul);\n    const na = result['用户名/邮箱'];\n    const pa = result['密码'];\n    \n    if (!na || !pa) return;\n    \n    try {\n        const phpid = java.get(`${ul}/user/user/verify.html`, {}).header(\"set-cookies\");\n        const code = java.getVerificationCode(`${ul}/user/user/verify.html`);\n        const response = java.post(`${ul}/user/user/login.html`, \n            `username=${na}&password=${pa}&code=${code}`, \n            { \"x-requested-with\": \"XMLHttpRequest\", \"Cookie\": phpid });\n        \n        const ck = cookie.mapToCookie(response.cookies());\n        const usercode = JSON.parse(response.body()).msg;\n        java.toast(usercode);\n        \n        if (ck) {\n            source.putLoginHeader(JSON.stringify({\"Cookie\": ck}));\n            cookie.replaceCookie(GetUL(), ck);\n        } else {\n            source.removeLoginHeader();\n            cookie.removeCookie(GetUL());\n        }\n    } catch (e) {\n        java.log(e);\n        java.toast('\\n登录出错，请切换其他站源重试！');\n    }\n}\n\nfunction out() {\n    source.removeLoginHeader();\n    cookie.removeCookie(GetUL());\n    java.toast(\"已退出登录状态\");\n}\n\nfunction show() {\n    const jc = source.getLoginHeaderMap();\n    let us, id, codes;\n    \n    if (jc) {\n        const info = decodeURIComponent(decodeURIComponent(jc.get(\"Cookie\")).match(/\\{[\\s\\S]+\\}/)[0]);\n        const userInfo = JSON.parse(info);\n        us = userInfo.username;\n        id = userInfo.uid;\n        codes = \"✔️已登录\";\n    } else {\n        us = id = \"无\";\n        codes = \"❌未登录\";\n    }\n    \n    java.longToast(`\\n◎用户：${us}◎\\n◎用户ID：${id}◎\\n◎登录状态：${codes}◎`);\n}\n\nfunction AFBook(ta) {\n    const info = result['书籍ID'];\n    if (!info) return java.toast(\"\\n未填入书籍id，请进书籍详情页，或者手动填写。\");\n    if (!source.getLoginHeaderMap()) return java.toast(\"未登录，请登录后使用\");\n    \n    try {\n        let url;\n        if (ta) {\n            url = `${ul}/user/bookshelf/add?novel_id=${info}`;\n        } else {\n            let src = \"\";\n            for (let page = 1;; page++) {\n                let sr = java.ajax(`${ul}/user/bookshelf/index.html?page=${page}`);\n                if (!/书架空空如也/.test(sr)) {\n                    src += sr + \"\\n\";\n                } else break;\n            }\n            \n            const booklist = src.match(/\\/novel\\/\\d+\\.html/g);\n            const dfid = src.match(/\\/user\\/bookshelf\\/del\\/id[^\"']+/g);\n            const index = booklist.findIndex(book => book.includes(info));\n            if (index === -1) return java.toast('未找到书籍');\n            url = GetUL() + dfid[index];\n        }\n        const msg = java.get(url, {\"x-requested-with\": \"XMLHttpRequest\"});\n        java.toast(JSON.parse(msg.body()).msg);\n    } catch (error) {\n    \t   java.log(error);\n        java.toast('未知错误，已打印至日志');\n    }\n}\n\nfunction BookShelf() {\n    if (source.getLoginHeaderMap()) {\n        java.startBrowser(`${ul}/user/bookshelf/`, \"书架\");\n    } else {\n        java.toast(\"未登录，请登录后再使用此功能。\");\n    }\n}", "respondTime": 190259, "ruleBookInfo": {"author": "@get:{a}", "canReName": "1", "coverUrl": "@get:{i}\n@js:let url = /^https?/.test(result) ? result : GetUL() + result;\nresult = java.connect(url).code() == 200 ? url : 'https://img.321cdn.com/img/01.png';\nresult;", "init": "<js>\nvar bookid = baseUrl.match(/novel\\/(\\d+)/)[1];\n//书评发送\nconst bookva = book.getVariable(\"custom\");\nif (bookva && bookva != \"\") {\n    if (source.getLoginHeader()) {\n        const commenturl = `${GetUL()}/home/comment/add.html`;\n        let body = `content=${bookva}&type=novel&mid=${bookid}`;\n        \n        try {\n            const code = String(java.getVerificationCode(`data:image/svg+xml;base64,${codesvg}`));\n            \n            if (code == \"评论\" || /^@\\d+$/.test(code)) {\n                if (/^@\\d+$/.test(code)) {\n                    body += `&pid=${code.match(/(\\d+)/)[1]}`;\n                }\n                \n                const headers = { \"x-requested-with\": \"XMLHttpRequest\" };\n                const response = java.post(commenturl, body, headers).body();\n                java.toast(JSON.parse(response).msg);\n            } else {\n                Packages.java.lang.Thread.sleep(40);\n                java.toast('请按图片要求填写');\n            }\n        } catch (err) {\n            java.log(err);\n        }\n    } else {\n        java.toast(\"未登录，请登录后操作\");\n    }\n    book.putCustomVariable(\"\");\n}\n\ntry {\n    sourceinfo = source.getLoginInfoMap();\n    sourceinfo['书籍ID'] = bookid;\n    if (bookid) {\n        source.putLoginInfo(JSON.stringify(sourceinfo));\n    }\n    $ = _ => String(java.getString(_));\n    img = /^https?/.test($('[property$=image]@content')) ? $('[property$=image]@content') : GetUL() + $('[property$=image]@content');\n    list = {\n        \"ID\": bookid,\n        \"img\": img,\n        \"name\": $('[property$=book_name]@content'),\n        \"author\": $('[property$=author]@content'),\n        \"info\": $('[property$=description]@content').slice(0, 45),\n        \"url\": \"legado://import/addToBookshelf?src=\" + baseUrl\n    }\n    source.put(\"list\", JSON.stringify(list));\n} catch (err) {\n    java.log(\"登录UI未初始化保存数据：\" + err);\n}\nsrc;\n</js>\n@put:{\"n\":\"[property$=book_name]@content\",\n\"a\":\"[property$=author]@content\",\n\"t\":\"class.fix@p.2:-2@text##.*[：:]\",\n\"k\":\"class.tg@a@ownText##\\n##,\",\n\"i\":\"[property$=image]@content\",\n\"l\":\"[property$=latest_chapter_name]@content\",\n\"r\":\"class.fix@p.3@text##\\\\s·\\\\s##\\n📂\",\n\"T\":\"[property$=update_time]@content\",\n\"m\":\"text.查看全部章节@href\",\n\"z\":\"class.fix@p.4@text##.*：(.*)·##$1###\",\n\"o\":\"[property$=description]@content\"}", "intro": "&nbsp;&nbsp;📖书籍ID：{{baseUrl.match(/novel\\/(\\d+)/)[1]}}\n☑当前站源：{{GetUL()}}\n🔥@get:{r}\n🏷️标签：@get:{k}\n🕰️更新时间：@get:{T}\n📜简介：\n@get:{o}\n<js>\nconst Bookid = baseUrl.match(/novel\\/(\\d+)/)[1];\nconst contul = `${GetUL()}/index.php?s=/Home/comment/lists/id/${Bookid}/type/novel/limit/5/size/12`;\nvar CommentNur = JSON.parse(source.getVariable()).co;\nvar cont = \"\";\nif (!CommentNur) {\n    var src = java.ajax(contul);\n    java.setContent(src);\n    var list = java.getElement('//script[@src=\"/public/static/jquery/jquery.min.js\"]/following-sibling::script[1]');\n    var lists = JSON.parse(String(list[0]).match(/var\\s*trre=([\\s\\S]+),page_num/)[1]);\n\n    cont += \"🔻评论区：\\n❗️右上角书籍变量填入评论后刷新详情页发送评论。❗️\\n\";\n    if (lists.length > 0) {\n        if (source.getLoginHeader()) {\n            let jc = source.getLoginHeaderMap();\n            let inf = decodeURIComponent(jc.get(\"Cookie\"));\n            let info = decodeURIComponent(inf).match(/\\{[\\s\\S]+\\}/)[0];\n            let myuid = JSON.parse(info)['uid'];\n            //处理我的评论数据\n            var myComments = [];\n\n            function collectMyComments(comment, parentPath) {\n                let floor = parentPath ? `${parentPath}-${comment.floorIndex}` : comment.floorIndex;\n                if (comment.uid === Number(myuid)) {\n                    myComments.push({\n                        id: comment.id,\n                        username: comment.user.username,\n                        group: comment.user.group,\n                        floor: `【${floor}楼】`,\n                        time: timeov(comment.create_time * 1000),\n                        content: comment.content\n                    });\n                }\n                if (comment._?.forEach) {\n                    comment._.forEach((child, index) => {\n                        child.floorIndex = index + 1;\n                        collectMyComments(child, floor);\n                    });\n                }\n            }\n            lists.forEach((c, i) => {\n                c.floorIndex = i + 1;\n                collectMyComments(c, \"\");\n            });\n\n            var mySection = \"=== 我的评论（共找到\" + myComments.length + \"条） ===\\n\\n\";\n            myComments.forEach(m => {\n                mySection += `┌【ID：${m.id}】| 👤${m.username} | ${m.group} | ${m.time}\\n└评论：${m.content}\\n${m.floor}\\n `;\n            });\n        } else {\n            mySection = \"\";\n        }\n\n        function formatComments(items, parentName) {\n            if (!items || !items.length) return '';\n            return items.map(item => {\n                let time = timeov(item.create_time * 1000);\n                let replyTag = parentName ? ` | @${parentName}` : '';\n                let content = (parentName ? 'ㅤ' : '') + item.content;\n                let username = item.user?.username || \"已注销用户\";\n                let group = item.user?.group || \"未知\";\n\n                let block = `${parentName ? '└' + username : username} | ${group} | ${time}${replyTag}\\n${parentName ? content.replaceAll('\\n', '\\nㅤ') : content}`;\n\n                if (item._ && item._.length) {\n                    block += '\\n' + formatComments(item._, username);\n                }\n                return block;\n            }).join(parentName ? '\\n' : '\\nㅤ\\n');\n        }\n\n        var allSection = \"=== 全部评论（共\" + lists.length + \"条） ===\\n\\n\";\n        allSection += formatComments(lists);\n\n        cont += mySection + \"\\n\" + allSection;\n    } else {\n        cont += \"本书暂时没有评论喔\";\n    }\n}\nresult = result + \"\\n\" + cont;\nresult;\n</js>", "kind": "@get:{t}\n@get:{k}", "lastChapter": "@get:{l}◎@get:{T}", "name": "@get:{n}", "tocUrl": "@get:{m}\n@js: GetUL() + result;", "wordCount": "@get:{z}"}, "ruleContent": {"content": "@js:\nvar url = GetUL();\n//处理强制登录\nvar nn = String(cookie.getCookie(url));\nvar coks = nn.split('; ');\nvar ckk = coks.filter(item => !item.startsWith(\"lf_reader_num\")).join('; ');\ncookie.setCookie(url, ckk);\nconst chapterul = java.hexDecodeToString(src);\n\nfunction content() {\n    let html = java.ajax(chapterul);\n    let content = String(java.getString('.content_txt@html', html));\n    return content.includes('正在获取小说信息') ? (eval('bookdata = ' + html.match(/book\\.initial\\s*=\\s*({[\\s\\S]+?};)/)[1]),getContent(bookdata)) : content;\n}\n\nconst text = content().trim();\n\nlet retryCount = 0;\nconst maxRetries = 3;\nlet result;\nwhile (retryCount < maxRetries) {\n    if (text != \"\" && !/正在加载小说中,请稍后/.test(text)) {\n        result = text;\n        break;\n    } else {\n        retryCount++;\n        java.toast(`\\n未获取到文本，正在重试...\\n（当前第${retryCount} / ${maxRetries}次重试）`);\n        text = content();\n    }\n}\nif (retryCount === maxRetries) {\n    result = \"重试三次仍未获取到文本，请检查网络状况。\";\n}\nresult;", "imageStyle": "DEFAULT", "replaceRegex": "##\\n*{{chapter.title}}\\n*"}, "ruleExplore": {"author": ".four@text||.t4@text||a[href$=\"author\"]@text||.datainfobox@p.1@a@text", "bookList": ".novel-item||.rec_rullist > ul||.list-group-item", "bookUrl": "a[href^=\"/novel/\"]@href\n@js: GetUL() + result;", "coverUrl": "img@src\n@js: /^https?/.test(result) ? result : GetUL() + result;", "intro": ".content-txt@text", "kind": "{{@@.sev@text%%.six@text}}\n{{@@.t6@text}}\n{{@@.t5@text}}\n{{@@.mb-1@text##浏览：(.*)##$1浏览###}}\n{{@@.badges@text}}\n{{@@.datainfobox@p.0:-1@text##.*?：}}", "lastChapter": ".datainfobox@p.-2@a@text||a[href^=\"/book/\"]@text", "name": "a[href^=\"/novel/\"]@text##^\\d+?\\.|全文阅读$", "wordCount": ".five@text||.mb-1@text||.datainfobox@p.2@ownText\n@js:\nif (/search/.test(baseUrl)) result = result.split(/\\s|\\u3000/)[1].replace(/.*?：/, \"\");\nresult;"}, "ruleSearch": {"author": ".mb-1 a@text", "bookList": ".list-group-item", "bookUrl": "a@href\n@js: GetUL() + result;", "intro": ".content-txt@text", "kind": "{{@@.mb-1@text##浏览：(.*)##$1浏览###}}\n{{@@a[href$=\"tag\"]@text%%small@text##\\[|\\]}}\n###", "name": "h5 a@text##^\\d+\\.", "wordCount": ".mb-1@text\n@js:result.split(/\\s|\\u3000/)[1].replace(/.*?：/, \"\");"}, "ruleToc": {"chapterList": "class.section-list@a", "chapterName": "text", "chapterUrl": "href\n<js>\nvar url = GetUL() + result;\nresult = `data:;base64,${java.base64Encode(url)},{\"type\":\"chapter\"}`;\nresult;\n</js>", "preUpdateJs": "eval(String(source.loginUrl));\nvar sourceUL = GetUL();\nif (!String(book.bookUrl).includes(sourceUL)) {\n  book.bookUrl = String(book.bookUrl).replace(/https?:\\/\\/[^\\/]+/,sourceUL);\n  book.tocUrl = String(book.tocUrl).replace(/https?:\\/\\/[^\\/]+/,sourceUL);\n  java.toast(\"\\n检测到切换源站，已更新目录链接。\");\n   java.refreshTocUrl();\n}"}, "searchUrl": "{{eval(String(source.loginUrl));GetUL();}}/search.html?q={{key}}&f=_al", "weight": 0},{"bookSourceUrl": "https://m.zjrtqs.com", "bookSourceName": "燃文小说", "bookSourceGroup": "小说", "bookSourceType": 0, "loginUrl": "", "ruleSearch": {"list": "css: article", "name": "css: .title", "author": "css: p:nth-child(2)", "cover": "css: div.image img@src", "detail": "css: div.image a@href", "intro": "css: .intro"}, "ruleBookInfo": {"name": "css: .info .title", "author": "css: .info p:nth-child(2)", "cover": "css: .image img@src", "intro": "css: .introbar"}, "ruleToc": {"list": "css: .chapter li a", "name": "text", "url": "@href", "next": "css: .listpage .right a@href"}, "ruleContent": {"content": "css: #text p", "next": "css: .pagebar a:nth-child(4)@href"}, "lastUpdateTime": "1786091900268"},{"bookSourceComment": "//2000+韩漫资源\n//备用：https://nnhm6.com/\n//繁转简函数\nflag = 1\ni = \"錒皚藹礙愛噯嬡璦曖靄諳銨鵪骯襖奧媼驁鰲壩罷鈀擺敗唄頒辦絆鈑幫綁鎊謗剝飽寶報鮑鴇齙輩貝鋇狽備憊鵯賁錛繃筆畢斃幣閉蓽嗶潷鉍篳蹕邊編貶變辯辮芐緶籩標驃颮飆鏢鑣鰾鱉別癟瀕濱賓擯儐繽檳殯臏鑌髕鬢餅稟撥缽鉑駁餑鈸鵓補鈽財參蠶殘慚慘燦驂黲蒼艙倉滄廁側冊測惻層詫鍤儕釵攙摻蟬饞讒纏鏟產闡顫囅諂讖蕆懺嬋驏覘禪鐔場嘗長償腸廠暢倀萇悵閶鯧鈔車徹硨塵陳襯傖諶櫬磣齔撐稱懲誠騁棖檉鋮鐺癡遲馳恥齒熾飭鴟沖衝蟲寵銃疇躊籌綢儔幬讎櫥廚鋤雛礎儲觸處芻絀躕傳釧瘡闖創愴錘綞純鶉綽輟齪辭詞賜鶿聰蔥囪從叢蓯驄樅湊輳躥竄攛錯銼鹺達噠韃帶貸駘紿擔單鄲撣膽憚誕彈殫賧癉簞當擋黨蕩檔讜碭襠搗島禱導盜燾燈鄧鐙敵滌遞締糴詆諦綈覿鏑顛點墊電巔鈿癲釣調銚鯛諜疊鰈釘頂錠訂鋌丟銩東動棟凍崠鶇竇犢獨讀賭鍍瀆櫝牘篤黷鍛斷緞籪兌隊對懟鐓噸頓鈍燉躉奪墮鐸鵝額訛惡餓諤堊閼軛鋨鍔鶚顎顓鱷誒兒爾餌貳邇鉺鴯鮞發罰閥琺礬釩煩販飯訪紡鈁魴飛誹廢費緋鐨鯡紛墳奮憤糞僨豐楓鋒風瘋馮縫諷鳳灃膚輻撫輔賦復負訃婦縛鳧駙紱紼賻麩鮒鰒釓該鈣蓋賅桿趕稈贛尷搟紺岡剛鋼綱崗戇鎬睪誥縞鋯擱鴿閣鉻個紇鎘潁給亙賡綆鯁龔宮鞏貢鉤溝茍構購夠詬緱覯蠱顧詁轂鈷錮鴣鵠鶻剮掛鴰摑關觀館慣貫詿摜鸛鰥廣獷規歸龜閨軌詭貴劊匭劌媯檜鮭鱖輥滾袞緄鯀鍋國過堝咼幗槨蟈鉿駭韓漢闞絎頡號灝顥閡鶴賀訶闔蠣橫轟鴻紅黌訌葒閎鱟壺護滬戶滸鶘嘩華畫劃話驊樺鏵懷壞歡環還緩換喚瘓煥渙奐繯鍰鯇黃謊鰉揮輝毀賄穢會燴匯諱誨繪詼薈噦澮繢琿暉葷渾諢餛閽獲貨禍鈥鑊擊機積饑跡譏雞績緝極輯級擠幾薊劑濟計記際繼紀訐詰薺嘰嚌驥璣覬齏磯羈蠆躋霽鱭鯽夾莢頰賈鉀價駕郟浹鋏鎵蟯殲監堅箋間艱緘繭檢堿鹼揀撿簡儉減薦檻鑒踐賤見鍵艦劍餞漸濺澗諫縑戔戩瞼鶼筧鰹韉將漿蔣槳獎講醬絳韁膠澆驕嬌攪鉸矯僥腳餃繳絞轎較撟嶠鷦鮫階節潔結誡屆癤頜鮚緊錦僅謹進晉燼盡勁荊莖巹藎饉縉贐覲鯨驚經頸靜鏡徑痙競凈剄涇逕弳脛靚糾廄舊鬮鳩鷲駒舉據鋸懼劇詎屨櫸颶鉅鋦窶齟鵑絹錈鐫雋覺決絕譎玨鈞軍駿皸開凱剴塏愾愷鎧鍇龕閌鈧銬顆殼課騍緙軻鈳錁頷墾懇齦鏗摳庫褲嚳塊儈鄶噲膾寬獪髖礦曠況誆誑鄺壙纊貺虧巋窺饋潰匱蕢憒聵簣閫錕鯤擴闊蠐蠟臘萊來賴崍徠淶瀨賚睞錸癩籟藍欄攔籃闌蘭瀾讕攬覽懶纜爛濫嵐欖斕鑭襤瑯閬鋃撈勞澇嘮嶗銠鐒癆樂鰳鐳壘類淚誄縲籬貍離鯉禮麗厲勵礫歷瀝隸儷酈壢藶蒞蘺嚦邐驪縭櫪櫟轢礪鋰鸝癘糲躒靂鱺鱧倆聯蓮連鐮憐漣簾斂臉鏈戀煉練蘞奩瀲璉殮褳襝鰱糧涼兩輛諒魎療遼鐐繚釕鷯獵臨鄰鱗凜賃藺廩檁轔躪齡鈴靈嶺領綾欞蟶鯪餾劉瀏騮綹鎦鷚龍聾嚨籠壟攏隴蘢瀧瓏櫳朧礱樓婁摟簍僂蔞嘍嶁鏤瘺耬螻髏蘆盧顱廬爐擄鹵虜魯賂祿錄陸壚擼嚕閭瀘淥櫨櫓轤輅轆氌臚鸕鷺艫鱸巒攣孿灤亂臠孌欒鸞鑾掄輪倫侖淪綸論圇蘿羅邏鑼籮騾駱絡犖玀濼欏腡鏍驢呂鋁侶屢縷慮濾綠櫚褸鋝嘸媽瑪碼螞馬罵嗎嘜嬤榪買麥賣邁脈勱瞞饅蠻滿謾縵鏝顙鰻貓錨鉚貿麼沒鎂門悶們捫燜懣鍆錳夢瞇謎彌覓冪羋謐獼禰綿緬澠靦黽廟緲繆滅憫閩閔緡鳴銘謬謨驀饃歿鏌謀畝鉬吶鈉納難撓腦惱鬧鐃訥餒內擬膩鈮鯢攆輦鯰釀鳥蔦裊聶嚙鑷鎳隉蘗囁顢躡檸獰寧擰濘苧嚀聹鈕紐膿濃農儂噥駑釹諾儺瘧歐鷗毆嘔漚謳慪甌盤蹣龐拋皰賠轡噴鵬紕羆鈹騙諞駢飄縹頻貧嬪蘋憑評潑頗釙撲鋪樸譜鏷鐠棲臍齊騎豈啟氣棄訖蘄騏綺榿磧頎頏鰭牽釬鉛遷簽謙錢鉗潛淺譴塹僉蕁慳騫繾槧鈐槍嗆墻薔強搶嬙檣戧熗錆鏘鏹羥蹌鍬橋喬僑翹竅誚譙蕎繰磽蹺竊愜鍥篋欽親寢鋟輕氫傾頃請慶撳鯖瓊窮煢蛺巰賕蟣鰍趨區軀驅齲詘嶇闃覷鴝顴權勸詮綣輇銓卻鵲確闋闕愨讓饒擾繞蕘嬈橈熱韌認紉飪軔榮絨嶸蠑縟銣顰軟銳蜆閏潤灑薩颯鰓賽傘毿糝喪騷掃繅澀嗇銫穡殺剎紗鎩鯊篩曬釃刪閃陜贍繕訕姍騸釤鱔墑傷賞坰殤觴燒紹賒攝懾設厙灄畬紳審嬸腎滲詵諗瀋聲繩勝師獅濕詩時蝕實識駛勢適釋飾視試謚塒蒔弒軾貰鈰鰣壽獸綬樞輸書贖屬術樹豎數攄紓帥閂雙誰稅順說碩爍鑠絲飼廝駟緦鍶鷥聳慫頌訟誦擻藪餿颼鎪蘇訴肅謖穌雖隨綏歲誶孫損筍蓀猻縮瑣鎖嗩脧獺撻闥鉈鰨臺態鈦鮐攤貪癱灘壇譚談嘆曇鉭錟頇湯燙儻餳鐋鏜濤絳討韜鋱騰謄銻題體屜緹鵜闐條糶齠鰷貼鐵廳聽烴銅統慟頭鈄禿圖釷團摶頹蛻飩脫鴕馱駝橢籜鼉襪媧膃彎灣頑萬紈綰網輞韋違圍為濰維葦偉偽緯謂衛諉幃闈溈潿瑋韙煒鮪溫聞紋穩問閿甕撾蝸渦窩臥萵齷嗚鎢烏誣無蕪吳塢霧務誤鄔廡憮嫵騖鵡鶩錫犧襲習銑戲細餼鬩璽覡蝦轄峽俠狹廈嚇硤鮮纖賢銜閑顯險現獻縣餡羨憲線莧薟蘚峴獫嫻鷴癇蠔秈躚廂鑲鄉詳響項薌餉驤緗饗蕭囂銷曉嘯嘵瀟驍綃梟簫協挾攜脅諧寫瀉謝褻擷紲纈鋅釁興陘滎兇洶銹繡饈鵂虛噓須許敘緒續詡頊軒懸選癬絢諼鉉鏇學謔澩鱈勛詢尋馴訓訊遜塤潯鱘壓鴉鴨啞亞訝埡婭椏氬閹煙鹽嚴巖顏閻艷厭硯彥諺驗厴贗儼兗讞懨閆釅魘饜鼴鴦楊揚瘍陽癢養樣煬瑤搖堯遙窯謠藥軺鷂鰩爺頁業葉靨謁鄴曄燁醫銥頤遺儀蟻藝億憶義詣議誼譯異繹詒囈嶧飴懌驛縊軼貽釔鎰鐿瘞艤蔭陰銀飲隱銦癮櫻嬰鷹應纓瑩螢營熒蠅贏穎塋鶯縈鎣攖嚶瀅瀠瓔鸚癭頦罌喲擁傭癰踴詠鏞優憂郵鈾猶誘蕕銪魷輿魚漁娛與嶼語獄譽預馭傴俁諛諭蕷崳飫閾嫗紆覦歟鈺鵒鷸齬鴛淵轅園員圓緣遠櫞鳶黿約躍鑰粵悅閱鉞鄖勻隕運蘊醞暈韻鄆蕓惲慍紜韞殞氳雜災載攢暫贊瓚趲鏨贓臟駔鑿棗責擇則澤賾嘖幘簀賊譖贈綜繒軋鍘閘柵詐齋債氈盞斬輾嶄棧戰綻譫張漲帳賬脹趙詔釗蟄轍鍺這謫輒鷓貞針偵診鎮陣湞縝楨軫賑禎鴆掙睜猙爭幀癥鄭證諍崢鉦錚箏織職執紙摯擲幟質滯騭櫛梔軹輊贄鷙螄縶躓躑觶鐘終種腫眾鍾謅軸皺晝驟紂縐豬諸誅燭矚囑貯鑄駐佇櫧銖專磚轉賺囀饌顳樁莊裝妝壯狀錐贅墜綴騅縋諄準著濁諑鐲茲資漬諮緇輜貲眥錙齜鯔蹤總縱傯鄒諏騶鯫詛組鏃鉆纘躦鱒翺並蔔沈醜澱叠鬥範幹臯矽櫃後夥稭傑訣誇裏淩麽黴撚淒扡聖屍擡塗窪餵汙鍁鹹蠍彜湧遊籲禦願嶽雲竈紮劄築於誌註雕訁譾郤猛氹阪壟堖垵墊檾蕒葤蓧蒓菇槁摣咤唚哢噝噅撅噼謔襆嶴脊仿僥獁麅餘餷饊饢楞怵懍爿漵灩溷濫瀦淡寧糸絝緔瑉梘棬案橰櫫軲軤賫膁腖飈糊煆溜湣渺碸滾瞘鈈鉕鋣銱鋥鋶鐦鐧鍩鍀鍃錇鎄鎇鎿鐝鑥鑹鑔穭鶓鶥鸌癧屙瘂臒襇繈耮顬蟎麯鮁鮃鮎鯗鯝鯴鱝鯿鰠鰵鱅鞽韝齇葯慾裡姊佔徵唷勐砲髮澹噁姦乾鬆姪囉\";\nz = \"锕皑蔼碍爱嗳嫒瑷暧霭谙铵鹌肮袄奥媪骜鳌坝罢钯摆败呗颁办绊钣帮绑镑谤剥饱宝报鲍鸨龅辈贝钡狈备惫鹎贲锛绷笔毕毙币闭荜哔滗铋筚跸边编贬变辩辫苄缏笾标骠飑飙镖镖鳔鳖别瘪濒滨宾摈傧缤槟殡膑镔髌鬓饼禀拨钵铂驳饽钹鹁补钸财参蚕残惭惨灿骖黪苍舱仓沧厕侧册测恻层诧锸侪钗搀掺蝉馋谗缠铲产阐颤冁谄谶蒇忏婵骣觇禅镡场尝长偿肠厂畅伥苌怅阊鲳钞车彻砗尘陈衬伧谌榇碜龀撑称惩诚骋枨柽铖铛痴迟驰耻齿炽饬鸱冲冲虫宠铳畴踌筹绸俦帱雠橱厨锄雏础储触处刍绌蹰传钏疮闯创怆锤缍纯鹑绰辍龊辞词赐鹚聪葱囱从丛苁骢枞凑辏蹿窜撺错锉鹾达哒鞑带贷骀绐担单郸掸胆惮诞弹殚赕瘅箪当挡党荡档谠砀裆捣岛祷导盗焘灯邓镫敌涤递缔籴诋谛绨觌镝颠点垫电巅钿癫钓调铫鲷谍叠鲽钉顶锭订铤丢铥东动栋冻岽鸫窦犊独读赌镀渎椟牍笃黩锻断缎簖兑队对怼镦吨顿钝炖趸夺堕铎鹅额讹恶饿谔垩阏轭锇锷鹗颚颛鳄诶儿尔饵贰迩铒鸸鲕发罚阀珐矾钒烦贩饭访纺钫鲂飞诽废费绯镄鲱纷坟奋愤粪偾丰枫锋风疯冯缝讽凤沣肤辐抚辅赋复负讣妇缚凫驸绂绋赙麸鲋鳆钆该钙盖赅杆赶秆赣尴擀绀冈刚钢纲岗戆镐睾诰缟锆搁鸽阁铬个纥镉颍给亘赓绠鲠龚宫巩贡钩沟苟构购够诟缑觏蛊顾诂毂钴锢鸪鹄鹘剐挂鸹掴关观馆惯贯诖掼鹳鳏广犷规归龟闺轨诡贵刽匦刿妫桧鲑鳜辊滚衮绲鲧锅国过埚呙帼椁蝈铪骇韩汉阚绗颉号灏颢阂鹤贺诃阖蛎横轰鸿红黉讧荭闳鲎壶护沪户浒鹕哗华画划话骅桦铧怀坏欢环还缓换唤痪焕涣奂缳锾鲩黄谎鳇挥辉毁贿秽会烩汇讳诲绘诙荟哕浍缋珲晖荤浑诨馄阍获货祸钬镬击机积饥迹讥鸡绩缉极辑级挤几蓟剂济计记际继纪讦诘荠叽哜骥玑觊齑矶羁虿跻霁鲚鲫夹荚颊贾钾价驾郏浃铗镓蛲歼监坚笺间艰缄茧检碱硷拣捡简俭减荐槛鉴践贱见键舰剑饯渐溅涧谏缣戋戬睑鹣笕鲣鞯将浆蒋桨奖讲酱绛缰胶浇骄娇搅铰矫侥脚饺缴绞轿较挢峤鹪鲛阶节洁结诫届疖颌鲒紧锦仅谨进晋烬尽劲荆茎卺荩馑缙赆觐鲸惊经颈静镜径痉竞净刭泾迳弪胫靓纠厩旧阄鸠鹫驹举据锯惧剧讵屦榉飓钜锔窭龃鹃绢锩镌隽觉决绝谲珏钧军骏皲开凯剀垲忾恺铠锴龛闶钪铐颗壳课骒缂轲钶锞颔垦恳龈铿抠库裤喾块侩郐哙脍宽狯髋矿旷况诓诳邝圹纩贶亏岿窥馈溃匮蒉愦聩篑阃锟鲲扩阔蛴蜡腊莱来赖崃徕涞濑赉睐铼癞籁蓝栏拦篮阑兰澜谰揽览懒缆烂滥岚榄斓镧褴琅阆锒捞劳涝唠崂铑铹痨乐鳓镭垒类泪诔缧篱狸离鲤礼丽厉励砾历沥隶俪郦坜苈莅蓠呖逦骊缡枥栎轹砺锂鹂疠粝跞雳鲡鳢俩联莲连镰怜涟帘敛脸链恋炼练蔹奁潋琏殓裢裣鲢粮凉两辆谅魉疗辽镣缭钌鹩猎临邻鳞凛赁蔺廪檩辚躏龄铃灵岭领绫棂蛏鲮馏刘浏骝绺镏鹨龙聋咙笼垄拢陇茏泷珑栊胧砻楼娄搂篓偻蒌喽嵝镂瘘耧蝼髅芦卢颅庐炉掳卤虏鲁赂禄录陆垆撸噜闾泸渌栌橹轳辂辘氇胪鸬鹭舻鲈峦挛孪滦乱脔娈栾鸾銮抡轮伦仑沦纶论囵萝罗逻锣箩骡骆络荦猡泺椤脶镙驴吕铝侣屡缕虑滤绿榈褛锊呒妈玛码蚂马骂吗唛嬷杩买麦卖迈脉劢瞒馒蛮满谩缦镘颡鳗猫锚铆贸麽没镁门闷们扪焖懑钔锰梦眯谜弥觅幂芈谧猕祢绵缅渑腼黾庙缈缪灭悯闽闵缗鸣铭谬谟蓦馍殁镆谋亩钼呐钠纳难挠脑恼闹铙讷馁内拟腻铌鲵撵辇鲶酿鸟茑袅聂啮镊镍陧蘖嗫颟蹑柠狞宁拧泞苎咛聍钮纽脓浓农侬哝驽钕诺傩疟欧鸥殴呕沤讴怄瓯盘蹒庞抛疱赔辔喷鹏纰罴铍骗谝骈飘缥频贫嫔苹凭评泼颇钋扑铺朴谱镤镨栖脐齐骑岂启气弃讫蕲骐绮桤碛颀颃鳍牵钎铅迁签谦钱钳潜浅谴堑佥荨悭骞缱椠钤枪呛墙蔷强抢嫱樯戗炝锖锵镪羟跄锹桥乔侨翘窍诮谯荞缲硗跷窃惬锲箧钦亲寝锓轻氢倾顷请庆揿鲭琼穷茕蛱巯赇虮鳅趋区躯驱龋诎岖阒觑鸲颧权劝诠绻辁铨却鹊确阕阙悫让饶扰绕荛娆桡热韧认纫饪轫荣绒嵘蝾缛铷颦软锐蚬闰润洒萨飒鳃赛伞毵糁丧骚扫缫涩啬铯穑杀刹纱铩鲨筛晒酾删闪陕赡缮讪姗骟钐鳝墒伤赏垧殇觞烧绍赊摄慑设厍滠畲绅审婶肾渗诜谂渖声绳胜师狮湿诗时蚀实识驶势适释饰视试谥埘莳弑轼贳铈鲥寿兽绶枢输书赎属术树竖数摅纾帅闩双谁税顺说硕烁铄丝饲厮驷缌锶鸶耸怂颂讼诵擞薮馊飕锼苏诉肃谡稣虽随绥岁谇孙损笋荪狲缩琐锁唢睃獭挞闼铊鳎台态钛鲐摊贪瘫滩坛谭谈叹昙钽锬顸汤烫傥饧铴镗涛绦讨韬铽腾誊锑题体屉缇鹈阗条粜龆鲦贴铁厅听烃铜统恸头钭秃图钍团抟颓蜕饨脱鸵驮驼椭箨鼍袜娲腽弯湾顽万纨绾网辋韦违围为潍维苇伟伪纬谓卫诿帏闱沩涠玮韪炜鲔温闻纹稳问阌瓮挝蜗涡窝卧莴龌呜钨乌诬无芜吴坞雾务误邬庑怃妩骛鹉鹜锡牺袭习铣戏细饩阋玺觋虾辖峡侠狭厦吓硖鲜纤贤衔闲显险现献县馅羡宪线苋莶藓岘猃娴鹇痫蚝籼跹厢镶乡详响项芗饷骧缃飨萧嚣销晓啸哓潇骁绡枭箫协挟携胁谐写泻谢亵撷绁缬锌衅兴陉荥凶汹锈绣馐鸺虚嘘须许叙绪续诩顼轩悬选癣绚谖铉镟学谑泶鳕勋询寻驯训讯逊埙浔鲟压鸦鸭哑亚讶垭娅桠氩阉烟盐严岩颜阎艳厌砚彦谚验厣赝俨兖谳恹闫酽魇餍鼹鸯杨扬疡阳痒养样炀瑶摇尧遥窑谣药轺鹞鳐爷页业叶靥谒邺晔烨医铱颐遗仪蚁艺亿忆义诣议谊译异绎诒呓峄饴怿驿缢轶贻钇镒镱瘗舣荫阴银饮隐铟瘾樱婴鹰应缨莹萤营荧蝇赢颖茔莺萦蓥撄嘤滢潆璎鹦瘿颏罂哟拥佣痈踊咏镛优忧邮铀犹诱莸铕鱿舆鱼渔娱与屿语狱誉预驭伛俣谀谕蓣嵛饫阈妪纡觎欤钰鹆鹬龉鸳渊辕园员圆缘远橼鸢鼋约跃钥粤悦阅钺郧匀陨运蕴酝晕韵郓芸恽愠纭韫殒氲杂灾载攒暂赞瓒趱錾赃脏驵凿枣责择则泽赜啧帻箦贼谮赠综缯轧铡闸栅诈斋债毡盏斩辗崭栈战绽谵张涨帐账胀赵诏钊蛰辙锗这谪辄鹧贞针侦诊镇阵浈缜桢轸赈祯鸩挣睁狰争帧症郑证诤峥钲铮筝织职执纸挚掷帜质滞骘栉栀轵轾贽鸷蛳絷踬踯觯钟终种肿众锺诌轴皱昼骤纣绉猪诸诛烛瞩嘱贮铸驻伫槠铢专砖转赚啭馔颞桩庄装妆壮状锥赘坠缀骓缒谆准着浊诼镯兹资渍谘缁辎赀眦锱龇鲻踪总纵偬邹诹驺鲰诅组镞钻缵躜鳟翱并卜沉丑淀迭斗范干皋硅柜后伙秸杰诀夸里凌么霉捻凄扦圣尸抬涂洼喂污锨咸蝎彝涌游吁御愿岳云灶扎札筑于志注凋讠谫郄勐凼坂垅垴埯埝苘荬荮莜莼菰藁揸吒吣咔咝咴噘劈嚯幞岙嵴彷徼犸狍馀馇馓馕愣憷懔丬溆滟混漤潴澹甯纟绔绱珉枧桊桉槔橥轱轷赍肷胨飚煳煅熘愍淼砜磙眍钚钷铘铞锃锍锎锏锘锝锪锫锿镅镎镢镥镩镲稆鹋鹛鹱疬疴痖癯裥襁耢颥螨麴鲅鲆鲇鲞鲴鲺鲼鳊鳋鳘鳙鞒鞴齄药欲里姐占征哟猛炮发淡恶奸干松侄啰\";\nfunction traditionalToSimplified(str) {\n let result = str;\n for (let idx = 0; idx < i.length; idx++) {\n if (i[idx] && z[idx]) {\n result = result.replace(new RegExp(i[idx], 'g'), z[idx]);\n }\n }\n return result;\n}", "bookSourceGroup": "R18", "bookSourceName": "🌸鸟鸟韩漫", "bookSourceType": 2, "bookSourceUrl": "https://nnhm7.org/", "customButton": false, "customOrder": 464, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[\n  {\n    \"title\": \"总榜\",\n    \"url\": \"https://nnhm7.org/ranking/all\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"月榜\",\n    \"url\": \"https://nnhm7.org/ranking/monthly\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"周榜\",\n    \"url\": \"https://nnhm7.org/ranking/weekly\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"日榜\",\n    \"url\": \"https://nnhm7.org/ranking/daily\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  }\n]", "header": "@js:\nJSON.stringify({\n  \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36\",\n  \"Referer\": baseUrl,\n  \"Accept-Language\": \"zh-CN,zh;q=0.9\"\n})", "lastUpdateTime": "1786081044667", "respondTime": 8717, "ruleBookInfo": {"author": "//div[@class='sub_r']/p[@class='txtItme'][1]/text()@js:\neval(String(source.bookSourceComment));\nvar toS = traditionalToSimplified(result)\ntoS", "coverUrl": "//div[@id='Cover']//img/@src", "intro": "//p[contains(@class,'txtDesc')]/text()@js:\neval(String(source.bookSourceComment));\nvar toS = traditionalToSimplified(result)\ntoS", "kind": "//div[@class='sub_r']/p[@class='txtItme'][2]/a/text()@js:\nlet types  = Array.from(result).join(\",\")\neval(String(source.bookSourceComment));\ntypes = traditionalToSimplified(types)\ntypes.split(\",\")", "name": "//div[@id='Cover']//img/@title@js:\neval(String(source.bookSourceComment));\nvar toS = traditionalToSimplified(result)\ntoS"}, "ruleContent": {"content": "//div[@class=\"img-wrap\"]/img"}, "ruleExplore": {"bookList": "//div[@class='select']/div[@class='itemBox']", "bookUrl": "//div[@class='itemTxt']/a/@href", "coverUrl": "//div[@class='itemImg']//img/@src", "kind": "//div[@class='itemTxt']/p[@class='txtItme'][3]/span[@class='date']/text()", "lastChapter": "//div[@class='itemTxt']/p[@class='txtItme'][1]/a/text()@js:\neval(String(source.bookSourceComment));\nvar toS = traditionalToSimplified(result)\ntoS", "name": "//div[@class='itemTxt']/a/text()@js:\neval(String(source.bookSourceComment));\nvar toS = traditionalToSimplified(result)\ntoS"}, "ruleSearch": {"bookList": "//div[@class='imgBox']/ul/li", "bookUrl": "//a[@class='txtA']/@href", "checkKeyWord": "熟女", "coverUrl": "//a[@class='ImgA']//img/@src", "kind": "//span[@class='info']/text()", "name": "//a[@class='txtA']/text()@js:\neval(String(source.bookSourceComment));\nvar toS = traditionalToSimplified(result)\ntoS"}, "ruleToc": {"chapterList": "//div[@id='list']/ul/li@js:\nArray.from(result).reverse()", "chapterName": "//a/span/text()@js:\neval(String(source.bookSourceComment));\nvar toS = traditionalToSimplified(result)\ntoS", "chapterUrl": "//a/@href"}, "searchUrl": "https://nnhm7.org/search/{{key}}/page/{{page}}", "weight": 0},{"bookSourceComment": "// 严禁下载\n// 严格控制在30/60\n// 🍓为服务器缓存章节\n// 温馨提示：已不支持老版本阅读，请更新(Sigma)", "bookSourceGroup": "🪭优质起点", "bookSourceName": "♠️免费小说", "bookSourceType": 0, "bookSourceUrl": "https://cuerm.kaeundfoir.my", "bookUrlPattern": "https://cuerm.kaeundfoir.my/api/detail/.*/(\\d+)", "concurrentRate": "30/60000", "customButton": false, "customOrder": 3, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "jsLib": "const _0x1975=['VnBjSFY=','dElmck8=','YXBwbHk=','YndYSWU=','R01lRms=','cWlkaWFu','VmRiano=','8J+Niei1t+eCuQ==','S2lFakQ=','Y0lqaXI=','Y29uc29sZQ==','TWNsTEg=','d1ZuVkI=','ZEdCUmE=','cUJVR1k=','dHJhY2U=','Q21acWE=','YWN0aW9u','aXVZZ04=','Z3ZPQlg=','bG9n','Y29tcGlsZQ==','eUthVWw=','cGFyc2U=','RHVWV3k=','8J+NheeVquiMhA==','dHlwZQ==','akhuQko=','YnV0dG9u','YWFackI=','bGF5b3V0X2ZsZXhCYXNpc1BlcmNlbnQ=','SlNQbGU=','ZGVidWc=','ZXJyb3I=','V09Tdkk=','ZXhjZXB0aW9u','Z2V0VmFyaWFibGU=','WFl1b0o=','XihbXiBdKyggK1teIF0rKSspK1teIF19','cmV0dXJuIC8iICsgdGhpcyArICIv','UGlIWWc=','aW5mbw==','c2V0VmFyaWFibGU=','T3luVWc=','TFFUdFM=','d0ZuSHI=','Q0ZBbk8=','bmFtZQ==','d2Fybg==','d0pLWng=','bGF5b3V0X2ZsZXhHcm93','cExZeFg=','Zk9SWUY=','S25CaHk=','Y29uc3RydWN0b3I=','alNjQkU=','RGJ0Qkw=','VEdmeUs=','c3R5bGU=','QVlYWnE=','dGFibGU='];(function(_0x96355f,_0x197592){const _0x1b5225=function(_0x49a9e8){while(--_0x49a9e8){_0x96355f['push'](_0x96355f['shift']());}};const _0xd5a897=function(){const _0x2ba3b3={'data':{'key':'cookie','value':'timeout'},'setCookie':function(_0x3a1d1b,_0x2f5343,_0x5ab2e5,_0x365130){_0x365130=_0x365130||{};let _0x5c88fd=_0x2f5343+'='+_0x5ab2e5;let _0x1805e3=0x0;for(let _0x2b311a=0x0,_0x42f37e=_0x3a1d1b['length'];_0x2b311a<_0x42f37e;_0x2b311a++){const _0x30485b=_0x3a1d1b[_0x2b311a];_0x5c88fd+=';\\x20'+_0x30485b;const _0xbc49e6=_0x3a1d1b[_0x30485b];_0x3a1d1b['push'](_0xbc49e6);_0x42f37e=_0x3a1d1b['length'];if(_0xbc49e6!==!![]){_0x5c88fd+='='+_0xbc49e6;}}_0x365130['cookie']=_0x5c88fd;},'removeCookie':function(){return'dev';},'getCookie':function(_0x2ffc3e,_0xa609a3){_0x2ffc3e=_0x2ffc3e||function(_0x4cdf8a){return _0x4cdf8a;};const _0x2468e2=_0x2ffc3e(new RegExp('(?:^|;\\x20)'+_0xa609a3['replace'](/([.$?*|{}()[]\\/+^])/g,'$1')+'=([^;]*)'));const _0x1bc079=function(_0x301c7b,_0x1e69b4){_0x301c7b(++_0x1e69b4);};_0x1bc079(_0x1b5225,_0x197592);return _0x2468e2?decodeURIComponent(_0x2468e2[0x1]):undefined;}};const _0x320751=function(){const _0x3d21c1=new RegExp('\\x5cw+\\x20*\\x5c(\\x5c)\\x20*{\\x5cw+\\x20*[\\x27|\\x22].+[\\x27|\\x22];?\\x20*}');return _0x3d21c1['test'](_0x2ba3b3['removeCookie']['toString']());};_0x2ba3b3['updateCookie']=_0x320751;let _0x350153='';const _0x416180=_0x2ba3b3['updateCookie']();if(!_0x416180){_0x2ba3b3['setCookie'](['*'],'counter',0x1);}else if(_0x416180){_0x350153=_0x2ba3b3['getCookie'](null,'counter');}else{_0x2ba3b3['removeCookie']();}};_0xd5a897();}(_0x1975,0x8b));const _0x1b52=function(_0x96355f,_0x197592){_0x96355f=_0x96355f-0x0;let _0x1b5225=_0x1975[_0x96355f];if(_0x1b52['lRflQO']===undefined){(function(){let _0x49a9e8;try{const _0x320751=Function('return\\x20(function()\\x20'+'{}.constructor(\\x22return\\x20this\\x22)(\\x20)'+');');_0x49a9e8=_0x320751();}catch(_0x350153){_0x49a9e8=window;}const _0x2ba3b3='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';_0x49a9e8['atob']||(_0x49a9e8['atob']=function(_0x416180){const _0x3a1d1b=String(_0x416180)['replace'](/=+$/,'');let _0x2f5343='';for(let _0x5ab2e5=0x0,_0x365130,_0x5c88fd,_0x1805e3=0x0;_0x5c88fd=_0x3a1d1b['charAt'](_0x1805e3++);~_0x5c88fd&&(_0x365130=_0x5ab2e5%0x4?_0x365130*0x40+_0x5c88fd:_0x5c88fd,_0x5ab2e5++%0x4)?_0x2f5343+=String['fromCharCode'](0xff&_0x365130>>(-0x2*_0x5ab2e5&0x6)):0x0){_0x5c88fd=_0x2ba3b3['indexOf'](_0x5c88fd);}return _0x2f5343;});}());_0x1b52['NNcsld']=function(_0x2b311a){const _0x42f37e=atob(_0x2b311a);let _0x30485b=[];for(let _0xbc49e6=0x0,_0x2ffc3e=_0x42f37e['length'];_0xbc49e6<_0x2ffc3e;_0xbc49e6++){_0x30485b+='%'+('00'+_0x42f37e['charCodeAt'](_0xbc49e6)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x30485b);};_0x1b52['jBiLzv']={};_0x1b52['lRflQO']=!![];}const _0xd5a897=_0x1b52['jBiLzv'][_0x96355f];if(_0xd5a897===undefined){const _0xa609a3=function(_0x2468e2){this['desrOz']=_0x2468e2;this['mIXvPU']=[0x1,0x0,0x0];this['IceEQd']=function(){return'newState';};this['atBRXD']='\\x5cw+\\x20*\\x5c(\\x5c)\\x20*{\\x5cw+\\x20*';this['DuTIXK']='[\\x27|\\x22].+[\\x27|\\x22];?\\x20*}';};_0xa609a3['prototype']['FOScYW']=function(){const _0x1bc079=new RegExp(this['atBRXD']+this['DuTIXK']);const _0x4cdf8a=_0x1bc079['test'](this['IceEQd']['toString']())?--this['mIXvPU'][0x1]:--this['mIXvPU'][0x0];return this['ZDlUTi'](_0x4cdf8a);};_0xa609a3['prototype']['ZDlUTi']=function(_0x301c7b){if(!Boolean(~_0x301c7b)){return _0x301c7b;}return this['AFrrwo'](this['desrOz']);};_0xa609a3['prototype']['AFrrwo']=function(_0x1e69b4){for(let _0x3d21c1=0x0,_0x3bf3b9=this['mIXvPU']['length'];_0x3d21c1<_0x3bf3b9;_0x3d21c1++){this['mIXvPU']['push'](Math['round'](Math['random']()));_0x3bf3b9=this['mIXvPU']['length'];}return _0x1e69b4(this['mIXvPU'][0x0]);};new _0xa609a3(_0x1b52)['FOScYW']();_0x1b5225=_0x1b52['NNcsld'](_0x1b5225);_0x1b52['jBiLzv'][_0x96355f]=_0x1b5225;}else{_0x1b5225=_0xd5a897;}return _0x1b5225;};const _0x3a1d1b=function(){const _0x536c30={};_0x536c30[_0x1b52('0x39')]=_0x1b52('0x15');_0x536c30['WOSvI']=_0x1b52('0x31');_0x536c30[_0x1b52('0x2')]=function(_0x50b487,_0x250e6c){return _0x50b487!==_0x250e6c;};_0x536c30['KnBhy']=_0x1b52('0x38');_0x536c30[_0x1b52('0x28')]=_0x1b52('0xc');const _0x47b4cc=_0x536c30;let _0x5b951a=!![];return function(_0x24a1a4,_0x291a02){if(_0x1b52('0xe')===_0x47b4cc['TGfyK']){const _0x48b96a=test[_0x1b52('0x25')](_0x1b52('0x16'))()['compile'](_0x47b4cc[_0x1b52('0x39')]);return!_0x48b96a['test'](_0x416180);}else{const _0x735ec5=_0x5b951a?function(){const _0x1ed9f6={};_0x1ed9f6['pLYxX']=_0x47b4cc[_0x1b52('0x11')];const _0xe71268=_0x1ed9f6;if(_0x47b4cc[_0x1b52('0x2')](_0x47b4cc[_0x1b52('0x24')],_0x47b4cc['KnBhy'])){const {source}=this;let _0x383441;try{_0x383441=JSON['parse'](_0x42fdbb['getVariable']());}catch(_0x3d1dab){const _0x5ae7bd={};_0x5ae7bd['source']=_0xe71268[_0x1b52('0x22')];_0x383441=_0x5ae7bd;_0x42fdbb[_0x1b52('0x19')](JSON['stringify'](_0x383441));}return _0x383441;}else{if(_0x291a02){const _0x3eaa65=_0x291a02[_0x1b52('0x2e')](_0x24a1a4,arguments);_0x291a02=null;return _0x3eaa65;}}}:function(){};_0x5b951a=![];return _0x735ec5;}};}();const _0x416180=_0x3a1d1b(this,function(){const _0x116572={};_0x116572[_0x1b52('0x27')]=function(_0x56c2ee,_0x4ea310){return _0x56c2ee===_0x4ea310;};_0x116572[_0x1b52('0x3c')]='zkfBx';_0x116572[_0x1b52('0x26')]=_0x1b52('0x7');_0x116572[_0x1b52('0x34')]=_0x1b52('0x16');_0x116572[_0x1b52('0x37')]=_0x1b52('0x15');const _0xd138c9=_0x116572;const _0x52836c=function(){if(_0xd138c9['DbtBL'](_0xd138c9[_0x1b52('0x3c')],_0xd138c9[_0x1b52('0x26')])){if(fn){const _0x1920d1=fn[_0x1b52('0x2e')](context,arguments);fn=null;return _0x1920d1;}}else{const _0x204541=_0x52836c['constructor'](_0xd138c9['KiEjD'])()[_0x1b52('0x4')](_0xd138c9[_0x1b52('0x37')]);return!_0x204541['test'](_0x416180);}};return _0x52836c();});_0x416180();const _0x2ba3b3=function(){const _0x2743d6={};_0x2743d6['EvTsM']=function(_0x3af495,_0x3e73b5){return _0x3af495!==_0x3e73b5;};_0x2743d6[_0x1b52('0x17')]=_0x1b52('0x14');_0x2743d6[_0x1b52('0x1c')]=function(_0x3b84c7,_0x57408a){return _0x3b84c7!==_0x57408a;};_0x2743d6[_0x1b52('0x2c')]=_0x1b52('0x3a');const _0x40aa27=_0x2743d6;let _0x2562c8=!![];return function(_0x79413b,_0x4b120c){const _0x3eac9e={};_0x3eac9e[_0x1b52('0x30')]='qidian';const _0x54ead3=_0x3eac9e;const _0x48c04b=_0x2562c8?function(){if(_0x40aa27['EvTsM']('XYuoJ',_0x40aa27[_0x1b52('0x17')])){const _0xc8f8d6=_0x2562c8?function(){if(_0x4b120c){const _0x9e4491=_0x4b120c[_0x1b52('0x2e')](_0x79413b,arguments);_0x4b120c=null;return _0x9e4491;}}:function(){};_0x2562c8=![];return _0xc8f8d6;}else{if(_0x4b120c){if(_0x40aa27[_0x1b52('0x1c')](_0x40aa27[_0x1b52('0x2c')],_0x40aa27['VpcHV'])){const _0x466845={};_0x466845['source']=_0x54ead3[_0x1b52('0x30')];variable=_0x466845;source[_0x1b52('0x19')](JSON['stringify'](variable));}else{const _0xfa9f17=_0x4b120c[_0x1b52('0x2e')](_0x79413b,arguments);_0x4b120c=null;return _0xfa9f17;}}}}:function(){};_0x2562c8=![];return _0x48c04b;};}();const _0x49a9e8=_0x2ba3b3(this,function(){const _0x588b77={};_0x588b77[_0x1b52('0x1b')]=function(_0x50bc3c,_0x5539d5){return _0x50bc3c!==_0x5539d5;};_0x588b77[_0x1b52('0x20')]=_0x1b52('0x2a');_0x588b77[_0x1b52('0x1d')]=function(_0x220fe7,_0x5bb3ea){return _0x220fe7(_0x5bb3ea);};_0x588b77[_0x1b52('0x35')]=function(_0x5334bc,_0x4ab81e){return _0x5334bc+_0x4ab81e;};_0x588b77[_0x1b52('0x1a')]='return\\x20(function()\\x20';_0x588b77['tIfrO']='{}.constructor(\\x22return\\x20this\\x22)(\\x20)';const _0x1fe5c3=_0x588b77;const _0x14917f=function(){};const _0xc2d873=function(){let _0x449867;try{if(_0x1fe5c3['LQTtS'](_0x1fe5c3[_0x1b52('0x20')],'ZJEQU')){_0x449867=_0x1fe5c3[_0x1b52('0x1d')](Function,_0x1fe5c3[_0x1b52('0x35')](_0x1fe5c3[_0x1b52('0x1a')],_0x1fe5c3[_0x1b52('0x2d')])+');')();}else{const _0x11bbde=fn['apply'](context,arguments);fn=null;return _0x11bbde;}}catch(_0x9d2181){_0x449867=window;}return _0x449867;};const _0x206b32=_0xc2d873();if(!_0x206b32['console']){_0x206b32[_0x1b52('0x36')]=function(_0x56a91e){const _0x9a554f={};_0x9a554f[_0x1b52('0x3')]=_0x56a91e;_0x9a554f[_0x1b52('0x1f')]=_0x56a91e;_0x9a554f['debug']=_0x56a91e;_0x9a554f[_0x1b52('0x18')]=_0x56a91e;_0x9a554f[_0x1b52('0x10')]=_0x56a91e;_0x9a554f[_0x1b52('0x12')]=_0x56a91e;_0x9a554f[_0x1b52('0x2b')]=_0x56a91e;_0x9a554f['trace']=_0x56a91e;return _0x9a554f;}(_0x14917f);}else{_0x206b32[_0x1b52('0x36')][_0x1b52('0x3')]=_0x14917f;_0x206b32[_0x1b52('0x36')]['warn']=_0x14917f;_0x206b32[_0x1b52('0x36')][_0x1b52('0xf')]=_0x14917f;_0x206b32[_0x1b52('0x36')][_0x1b52('0x18')]=_0x14917f;_0x206b32['console']['error']=_0x14917f;_0x206b32[_0x1b52('0x36')]['exception']=_0x14917f;_0x206b32['console'][_0x1b52('0x2b')]=_0x14917f;_0x206b32[_0x1b52('0x36')][_0x1b52('0x3b')]=_0x14917f;}});_0x49a9e8();const _0x31de00={};_0x31de00[_0x1b52('0x21')]=0x1;_0x31de00['layout_flexBasisPercent']=0.4;const _0x5b7293={};_0x5b7293[_0x1b52('0x1e')]=_0x1b52('0x33');_0x5b7293[_0x1b52('0x9')]=_0x1b52('0xb');_0x5b7293[_0x1b52('0x0')]='setSource(\\x27qidian\\x27)';_0x5b7293[_0x1b52('0x29')]=_0x31de00;const _0x3185eb={};_0x3185eb[_0x1b52('0x21')]=0x1;_0x3185eb[_0x1b52('0xd')]=0.4;const _0x54f3c9={};_0x54f3c9[_0x1b52('0x1e')]=_0x1b52('0x8');_0x54f3c9[_0x1b52('0x9')]=_0x1b52('0xb');_0x54f3c9[_0x1b52('0x0')]='setSource(\\x27fanqie\\x27)';_0x54f3c9[_0x1b52('0x29')]=_0x3185eb;var loginUI=[_0x5b7293,_0x54f3c9];function Config(){const _0x456c10={};_0x456c10[_0x1b52('0x1')]='return\\x20/\\x22\\x20+\\x20this\\x20+\\x20\\x22/';_0x456c10[_0x1b52('0x23')]=_0x1b52('0x15');_0x456c10['jHnBJ']=function(_0x1eac2e){return _0x1eac2e();};_0x456c10[_0x1b52('0x5')]=function(_0x5909af,_0x81f129){return _0x5909af===_0x81f129;};_0x456c10[_0x1b52('0x32')]='IkntI';_0x456c10[_0x1b52('0x2f')]=_0x1b52('0x31');const _0x5411d0=_0x456c10;const {source}=this;let _0x23d4ed;try{if(_0x5411d0[_0x1b52('0x5')]('IkntI',_0x5411d0[_0x1b52('0x32')])){_0x23d4ed=JSON[_0x1b52('0x6')](source[_0x1b52('0x13')]());}else{const _0x4ff58c=function(){const _0x21ee94=_0x4ff58c[_0x1b52('0x25')](_0x5411d0[_0x1b52('0x1')])()[_0x1b52('0x4')](_0x5411d0[_0x1b52('0x23')]);return!_0x21ee94['test'](_0x416180);};return _0x5411d0[_0x1b52('0xa')](_0x4ff58c);}}catch(_0x2999d8){const _0x9cc18f={};_0x9cc18f['source']=_0x5411d0[_0x1b52('0x2f')];_0x23d4ed=_0x9cc18f;source['setVariable'](JSON['stringify'](_0x23d4ed));}return _0x23d4ed;}const api='https://cumcuer.sunianxincue.love';", "lastUpdateTime": "1786074074117", "loginUi": "@js:\nresult = JSON.stringify(loginUI);", "loginUrl": "const _0x4a56=['c3RyaW5naWZ5','cmV0dXJuIChmdW5jdGlvbigpIA==','VWFtS0Q=','R2JrRE0=','cmV0dXJuIC8iICsgdGhpcyArICIv','aFdoQmU=','aW5mbw==','5bey5YiH5o2i5Yiw','dVZuVm0=','cGFyc2U=','b0FzSG8=','dWxvUEU=','bG9n','XihbXiBdKyggK1teIF0rKSspK1teIF19','cXhJVW0=','T3hKdkc=','UERtbmw=','MHwxfDV8N3wzfDJ8NHw2','VlBESWU=','dHJhY2U=','dGVzdA==','c291cmNl','Q01TaUI=','Y29tcGlsZQ==','d2Fybg==','aU5iQWY=','cWlkaWFu','8J+Niei1t+eCuQ==','UWNaVUo=','SmJrdVk=','ZXV4elQ=','ZGVidWc=','Z2V0VmFyaWFibGU=','Y29uc3RydWN0b3I=','ZXhjZXB0aW9u','dHRKUHc=','TElpa3A=','8J+NheeVquiMhA==','Y3hKV0g=','dGFibGU=','Y29uc29sZQ==','RVVXeGc=','ZHFQRFo=','ekNYUmc=','QktTUWQ=','ZXJyb3I=','Um9qUWM=','T3NCdHU=','ZnFWUGc=','dXBOb2M=','enBzT3c=','dG9hc3Q=','YXRLTFA=','RWdxQ0g=','R1NXQ0Q=','eHFFbFY=','YXBwbHk=','ZmFucWll','elBDTXg=','a1JveHU=','c2luQVo=','TUJtZ3M=','eHZBUXM=','c2V0VmFyaWFibGU='];(function(_0x479115,_0x4a56c0){const _0x259b1f=function(_0x4f9dce){while(--_0x4f9dce){_0x479115['push'](_0x479115['shift']());}};const _0x148637=function(){const _0x2c174d={'data':{'key':'cookie','value':'timeout'},'setCookie':function(_0x257082,_0x6bc846,_0xd0d5f9,_0x24a097){_0x24a097=_0x24a097||{};let _0x3d7c14=_0x6bc846+'='+_0xd0d5f9;let _0x223922=0x0;for(let _0x414c60=0x0,_0x3f6e72=_0x257082['length'];_0x414c60<_0x3f6e72;_0x414c60++){const _0x12ad91=_0x257082[_0x414c60];_0x3d7c14+=';\\x20'+_0x12ad91;const _0x4c9718=_0x257082[_0x12ad91];_0x257082['push'](_0x4c9718);_0x3f6e72=_0x257082['length'];if(_0x4c9718!==!![]){_0x3d7c14+='='+_0x4c9718;}}_0x24a097['cookie']=_0x3d7c14;},'removeCookie':function(){return'dev';},'getCookie':function(_0x2d18fd,_0x21556f){_0x2d18fd=_0x2d18fd||function(_0x8993a6){return _0x8993a6;};const _0x2055e5=_0x2d18fd(new RegExp('(?:^|;\\x20)'+_0x21556f['replace'](/([.$?*|{}()[]\\/+^])/g,'$1')+'=([^;]*)'));const _0x1e28c7=function(_0x4c45ba,_0x17cc7f){_0x4c45ba(++_0x17cc7f);};_0x1e28c7(_0x259b1f,_0x4a56c0);return _0x2055e5?decodeURIComponent(_0x2055e5[0x1]):undefined;}};const _0x45f5f2=function(){const _0x2623e5=new RegExp('\\x5cw+\\x20*\\x5c(\\x5c)\\x20*{\\x5cw+\\x20*[\\x27|\\x22].+[\\x27|\\x22];?\\x20*}');return _0x2623e5['test'](_0x2c174d['removeCookie']['toString']());};_0x2c174d['updateCookie']=_0x45f5f2;let _0x17e6be='';const _0x112593=_0x2c174d['updateCookie']();if(!_0x112593){_0x2c174d['setCookie'](['*'],'counter',0x1);}else if(_0x112593){_0x17e6be=_0x2c174d['getCookie'](null,'counter');}else{_0x2c174d['removeCookie']();}};_0x148637();}(_0x4a56,0x190));const _0x259b=function(_0x479115,_0x4a56c0){_0x479115=_0x479115-0x0;let _0x259b1f=_0x4a56[_0x479115];if(_0x259b['XWZzbk']===undefined){(function(){const _0x4f9dce=function(){let _0x17e6be;try{_0x17e6be=Function('return\\x20(function()\\x20'+'{}.constructor(\\x22return\\x20this\\x22)(\\x20)'+');')();}catch(_0x112593){_0x17e6be=window;}return _0x17e6be;};const _0x2c174d=_0x4f9dce();const _0x45f5f2='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';_0x2c174d['atob']||(_0x2c174d['atob']=function(_0x257082){const _0x6bc846=String(_0x257082)['replace'](/=+$/,'');let _0xd0d5f9='';for(let _0x24a097=0x0,_0x3d7c14,_0x223922,_0x414c60=0x0;_0x223922=_0x6bc846['charAt'](_0x414c60++);~_0x223922&&(_0x3d7c14=_0x24a097%0x4?_0x3d7c14*0x40+_0x223922:_0x223922,_0x24a097++%0x4)?_0xd0d5f9+=String['fromCharCode'](0xff&_0x3d7c14>>(-0x2*_0x24a097&0x6)):0x0){_0x223922=_0x45f5f2['indexOf'](_0x223922);}return _0xd0d5f9;});}());_0x259b['mvHRBN']=function(_0x3f6e72){const _0x12ad91=atob(_0x3f6e72);let _0x4c9718=[];for(let _0x2d18fd=0x0,_0x21556f=_0x12ad91['length'];_0x2d18fd<_0x21556f;_0x2d18fd++){_0x4c9718+='%'+('00'+_0x12ad91['charCodeAt'](_0x2d18fd)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x4c9718);};_0x259b['UEcyrC']={};_0x259b['XWZzbk']=!![];}const _0x148637=_0x259b['UEcyrC'][_0x479115];if(_0x148637===undefined){const _0x2055e5=function(_0x1e28c7){this['IAxGhL']=_0x1e28c7;this['kvQUAp']=[0x1,0x0,0x0];this['ooIunC']=function(){return'newState';};this['MsraKU']='\\x5cw+\\x20*\\x5c(\\x5c)\\x20*{\\x5cw+\\x20*';this['jXvcqQ']='[\\x27|\\x22].+[\\x27|\\x22];?\\x20*}';};_0x2055e5['prototype']['nWBklo']=function(){const _0x8993a6=new RegExp(this['MsraKU']+this['jXvcqQ']);const _0x4c45ba=_0x8993a6['test'](this['ooIunC']['toString']())?--this['kvQUAp'][0x1]:--this['kvQUAp'][0x0];return this['nDoGCF'](_0x4c45ba);};_0x2055e5['prototype']['nDoGCF']=function(_0x17cc7f){if(!Boolean(~_0x17cc7f)){return _0x17cc7f;}return this['jAdSTn'](this['IAxGhL']);};_0x2055e5['prototype']['jAdSTn']=function(_0x2623e5){for(let _0x49c1ef=0x0,_0xfc402c=this['kvQUAp']['length'];_0x49c1ef<_0xfc402c;_0x49c1ef++){this['kvQUAp']['push'](Math['round'](Math['random']()));_0xfc402c=this['kvQUAp']['length'];}return _0x2623e5(this['kvQUAp'][0x0]);};new _0x2055e5(_0x259b)['nWBklo']();_0x259b1f=_0x259b['mvHRBN'](_0x259b1f);_0x259b['UEcyrC'][_0x479115]=_0x259b1f;}else{_0x259b1f=_0x148637;}return _0x259b1f;};const _0x257082=function(){const _0x5bcf2f={};_0x5bcf2f[_0x259b('0x33')]=function(_0x499dc3,_0x3a702b){return _0x499dc3!==_0x3a702b;};_0x5bcf2f[_0x259b('0x19')]=_0x259b('0x1a');_0x5bcf2f['mXOye']=_0x259b('0x34');_0x5bcf2f['euxzT']=function(_0x3604d8){return _0x3604d8();};_0x5bcf2f[_0x259b('0x1e')]=function(_0x1caf6a,_0x346854){return _0x1caf6a===_0x346854;};_0x5bcf2f[_0x259b('0xd')]=_0x259b('0x14');_0x5bcf2f[_0x259b('0x0')]=_0x259b('0xc');const _0x32f951=_0x5bcf2f;let _0x2c19c5=!![];return function(_0x513a9f,_0x165dee){const _0x189960={};_0x189960[_0x259b('0x32')]=_0x32f951['mXOye'];_0x189960['uloPE']=_0x259b('0x3d');_0x189960['MBmgs']=function(_0x29b6d4){return _0x32f951[_0x259b('0xe')](_0x29b6d4);};const _0x59d6c7=_0x189960;if(_0x32f951[_0x259b('0x1e')](_0x32f951[_0x259b('0xd')],_0x32f951[_0x259b('0x0')])){const _0x434a07={};_0x434a07[_0x259b('0x1b')]=_0x59d6c7['UamKD'];_0x434a07[_0x259b('0x2c')]=_0x59d6c7[_0x259b('0x3b')];const _0x415b4b=_0x434a07;const _0x43f59d=function(){const _0x121ce0=_0x43f59d[_0x259b('0x11')](_0x415b4b['zCXRg'])()[_0x259b('0x7')](_0x415b4b[_0x259b('0x2c')]);return!_0x121ce0[_0x259b('0x4')](_0x112593);};return _0x59d6c7[_0x259b('0x2d')](_0x43f59d);}else{const _0x883124=_0x2c19c5?function(){if(_0x165dee){if(_0x32f951[_0x259b('0x33')](_0x32f951[_0x259b('0x19')],_0x32f951[_0x259b('0x19')])){const _0x175932={};_0x175932[_0x259b('0x5')]='qidian';data=_0x175932;source[_0x259b('0x2f')](JSON[_0x259b('0x30')](data));}else{const _0x12d249=_0x165dee[_0x259b('0x28')](_0x513a9f,arguments);_0x165dee=null;return _0x12d249;}}}:function(){};_0x2c19c5=![];return _0x883124;}};}();const _0x112593=_0x257082(this,function(){const _0x45ff13={};_0x45ff13[_0x259b('0x2')]=function(_0x4136da,_0x24795b){return _0x4136da===_0x24795b;};_0x45ff13[_0x259b('0x38')]=_0x259b('0x1c');_0x45ff13[_0x259b('0x25')]=_0x259b('0x34');const _0x35fa54=_0x45ff13;const _0x1fb3ff=function(){if(_0x35fa54[_0x259b('0x2')](_0x259b('0x1c'),_0x35fa54['uVnVm'])){const _0x693377=_0x1fb3ff[_0x259b('0x11')](_0x35fa54[_0x259b('0x25')])()[_0x259b('0x7')]('^([^\\x20]+(\\x20+[^\\x20]+)+)+[^\\x20]}');return!_0x693377[_0x259b('0x4')](_0x112593);}else{if(fn){const _0x4cd377=fn[_0x259b('0x28')](context,arguments);fn=null;return _0x4cd377;}}};return _0x1fb3ff();});_0x112593();const _0x2c174d=function(){const _0x4aa69c={};_0x4aa69c[_0x259b('0x9')]=function(_0x20a526,_0x428a1c){return _0x20a526===_0x428a1c;};_0x4aa69c[_0x259b('0x20')]=_0x259b('0x3a');_0x4aa69c[_0x259b('0x21')]=_0x259b('0x3f');_0x4aa69c[_0x259b('0x3e')]=_0x259b('0x16');const _0x3ced03=_0x4aa69c;let _0x35ebd8=!![];return function(_0x5a10a8,_0x15d260){if(_0x3ced03['upNoc']!==_0x3ced03[_0x259b('0x3e')]){const _0x1cd3dc=_0x35ebd8?function(){if(_0x3ced03['iNbAf'](_0x3ced03[_0x259b('0x20')],_0x259b('0x3a'))){if(_0x15d260){const _0x26791f=_0x15d260[_0x259b('0x28')](_0x5a10a8,arguments);_0x15d260=null;return _0x26791f;}}else{const _0x148cd7={};_0x148cd7[_0x259b('0x3c')]=func;_0x148cd7[_0x259b('0x8')]=func;_0x148cd7[_0x259b('0xf')]=func;_0x148cd7[_0x259b('0x36')]=func;_0x148cd7[_0x259b('0x1d')]=func;_0x148cd7[_0x259b('0x12')]=func;_0x148cd7[_0x259b('0x17')]=func;_0x148cd7[_0x259b('0x3')]=func;return _0x148cd7;}}:function(){};_0x35ebd8=![];return _0x1cd3dc;}else{that[_0x259b('0x18')]=function(_0x16b7be){const _0x1d676a={};_0x1d676a[_0x259b('0x3c')]=_0x16b7be;_0x1d676a[_0x259b('0x8')]=_0x16b7be;_0x1d676a[_0x259b('0xf')]=_0x16b7be;_0x1d676a[_0x259b('0x36')]=_0x16b7be;_0x1d676a[_0x259b('0x1d')]=_0x16b7be;_0x1d676a[_0x259b('0x12')]=_0x16b7be;_0x1d676a[_0x259b('0x17')]=_0x16b7be;_0x1d676a[_0x259b('0x3')]=_0x16b7be;return _0x1d676a;}(func);}};}();const _0x4f9dce=_0x2c174d(this,function(){const _0x34d2ab={};_0x34d2ab[_0x259b('0x24')]=function(_0x5de253,_0x3a8d4e){return _0x5de253(_0x3a8d4e);};_0x34d2ab[_0x259b('0x35')]=function(_0x381ba6,_0x465964){return _0x381ba6+_0x465964;};_0x34d2ab['CMSiB']=function(_0x50e60b,_0x41d14f){return _0x50e60b+_0x41d14f;};_0x34d2ab[_0x259b('0x27')]=_0x259b('0x31');_0x34d2ab[_0x259b('0x22')]=function(_0x436683,_0xe1066f){return _0x436683===_0xe1066f;};_0x34d2ab[_0x259b('0x2a')]=_0x259b('0x2e');_0x34d2ab['ttJPw']='DpEUL';_0x34d2ab['lnCjD']=function(_0xdad423){return _0xdad423();};_0x34d2ab[_0x259b('0x26')]=_0x259b('0x1');const _0x2bd487=_0x34d2ab;const _0x1a6f5b=function(){};const _0x1f5762=function(){let _0x45fbb2;try{_0x45fbb2=_0x2bd487[_0x259b('0x24')](Function,_0x2bd487[_0x259b('0x35')](_0x2bd487[_0x259b('0x6')](_0x2bd487['xqElV'],'{}.constructor(\\x22return\\x20this\\x22)(\\x20)'),');'))();}catch(_0x343b5d){_0x45fbb2=window;}return _0x45fbb2;};const _0x66bb73=_0x2bd487['lnCjD'](_0x1f5762);if(!_0x66bb73[_0x259b('0x18')]){_0x66bb73[_0x259b('0x18')]=function(_0x2e4779){if(_0x2bd487[_0x259b('0x22')](_0x2bd487[_0x259b('0x2a')],_0x2bd487[_0x259b('0x13')])){const _0x30d6b1=firstCall?function(){if(fn){const _0x40df73=fn['apply'](context,arguments);fn=null;return _0x40df73;}}:function(){};firstCall=![];return _0x30d6b1;}else{const _0x43f34b={};_0x43f34b[_0x259b('0x3c')]=_0x2e4779;_0x43f34b[_0x259b('0x8')]=_0x2e4779;_0x43f34b[_0x259b('0xf')]=_0x2e4779;_0x43f34b[_0x259b('0x36')]=_0x2e4779;_0x43f34b[_0x259b('0x1d')]=_0x2e4779;_0x43f34b[_0x259b('0x12')]=_0x2e4779;_0x43f34b[_0x259b('0x17')]=_0x2e4779;_0x43f34b[_0x259b('0x3')]=_0x2e4779;return _0x43f34b;}}(_0x1a6f5b);}else{const _0x1669de=_0x2bd487[_0x259b('0x26')]['split']('|');let _0x25a365=0x0;while(!![]){switch(_0x1669de[_0x25a365++]){case'0':_0x66bb73[_0x259b('0x18')][_0x259b('0x3c')]=_0x1a6f5b;continue;case'1':_0x66bb73['console'][_0x259b('0x8')]=_0x1a6f5b;continue;case'2':_0x66bb73['console'][_0x259b('0x12')]=_0x1a6f5b;continue;case'3':_0x66bb73[_0x259b('0x18')]['error']=_0x1a6f5b;continue;case'4':_0x66bb73[_0x259b('0x18')]['table']=_0x1a6f5b;continue;case'5':_0x66bb73[_0x259b('0x18')][_0x259b('0xf')]=_0x1a6f5b;continue;case'6':_0x66bb73[_0x259b('0x18')][_0x259b('0x3')]=_0x1a6f5b;continue;case'7':_0x66bb73['console'][_0x259b('0x36')]=_0x1a6f5b;continue;}break;}}});_0x4f9dce();function login(){}function setSource(_0x3cecf7){const _0x4ce43d={};_0x4ce43d[_0x259b('0x1f')]=_0x259b('0xb');_0x4ce43d[_0x259b('0x2b')]=_0x259b('0x15');const _0x52d8d0=_0x4ce43d;const _0x3b2f6f={};_0x3b2f6f[_0x259b('0xa')]=_0x52d8d0[_0x259b('0x1f')];_0x3b2f6f[_0x259b('0x29')]=_0x52d8d0[_0x259b('0x2b')];const _0x3ca11b=_0x3b2f6f;let _0x2f3302;try{_0x2f3302=JSON[_0x259b('0x39')](source[_0x259b('0x10')]());}catch(_0x11c9dd){const _0x280c21={};_0x280c21[_0x259b('0x5')]='qidian';_0x2f3302=_0x280c21;source[_0x259b('0x2f')](JSON['stringify'](_0x2f3302));}if(_0x3cecf7){_0x2f3302[_0x259b('0x5')]=_0x3cecf7;java[_0x259b('0x23')](_0x259b('0x37')+_0x3ca11b[_0x3cecf7]);source['setVariable'](JSON[_0x259b('0x30')](_0x2f3302));}}", "respondTime": 180000, "ruleBookInfo": {"author": "$.author", "coverUrl": "$.thumb_url", "init": "$.data.detail", "intro": "<js>const _0xfd6f=['QUx4Uks=','cmV0dXJuIChmdW5jdGlvbigpIA==','dUhEdXg=','elpHaFA=','dFp1dHc=','d0NKeGw=','YXdCUWQ=','cmV0dXJuIC8iICsgdGhpcyArICIv','e30uY29uc3RydWN0b3IoInJldHVybiB0aGlzIikoICk=','dGVzdA==','JC5jb3B5cmlnaHRfaW5mbw==','akJtVFE=','JC5ib29rX2lk','RVhZdEE=','XihbXiBdKyggK1teIF0rKSspK1teIF19','d2Fybg==','a0h2Yms=','QnpXd3A=','Y29tcGlsZQ==','Cgrwn5Oc566A5LuL77ya','U0FIT1g=','YXBwbHk=','c3Vic3RyaW5n','bUNESms=','eXFJcFY=','Cgrwn5ONwqk=','ZlhKRUo=','dGFibGU=','dHJhY2U=','N3w0fDV8NnwxfDJ8M3ww','dHFUZ1c=','ZGV0YWlsLw==','Jm5ic3A7Jm5ic3A7CvCfjJ/mupDnq5nvvJo=','bGVuZ3Ro','Z2V0U3RyaW5n','TkhiU3U=','aEF6Rng=','ZXhjZXB0aW9u','cktDSHA=','ZGVidWc=','bG9n','aW5kZXhPZg==','aW5mbw==','cU5pYUk=','bGptY2o=','cWlkaWFu','bnNPekk=','dEx4RmQ=','R2RRV3Q=','Y29uc3RydWN0b3I=','eXdYc2s=','TkhCRlI=','a1d3dlU=','Y29uc29sZQ==','ZXJyb3I='];(function(_0x103a98,_0xfd6f7a){const _0x5bd09d=function(_0x2367f8){while(--_0x2367f8){_0x103a98['push'](_0x103a98['shift']());}};const _0x214618=function(){const _0xa5f14={'data':{'key':'cookie','value':'timeout'},'setCookie':function(_0x4abc70,_0x554c8b,_0x16239c,_0xede1d){_0xede1d=_0xede1d||{};let _0x448c24=_0x554c8b+'='+_0x16239c;let _0x5aa3ab=0x0;for(let _0x3cca0e=0x0,_0x55db99=_0x4abc70['length'];_0x3cca0e<_0x55db99;_0x3cca0e++){const _0x1b9b90=_0x4abc70[_0x3cca0e];_0x448c24+=';\\x20'+_0x1b9b90;const _0xa95228=_0x4abc70[_0x1b9b90];_0x4abc70['push'](_0xa95228);_0x55db99=_0x4abc70['length'];if(_0xa95228!==!![]){_0x448c24+='='+_0xa95228;}}_0xede1d['cookie']=_0x448c24;},'removeCookie':function(){return'dev';},'getCookie':function(_0x19720b,_0x2d738e){_0x19720b=_0x19720b||function(_0x372d2e){return _0x372d2e;};const _0x3a0d9b=_0x19720b(new RegExp('(?:^|;\\x20)'+_0x2d738e['replace'](/([.$?*|{}()[]\\/+^])/g,'$1')+'=([^;]*)'));const _0x108455=function(_0x445331,_0x52ad80){_0x445331(++_0x52ad80);};_0x108455(_0x5bd09d,_0xfd6f7a);return _0x3a0d9b?decodeURIComponent(_0x3a0d9b[0x1]):undefined;}};const _0x40cefe=function(){const _0x373f3a=new RegExp('\\x5cw+\\x20*\\x5c(\\x5c)\\x20*{\\x5cw+\\x20*[\\x27|\\x22].+[\\x27|\\x22];?\\x20*}');return _0x373f3a['test'](_0xa5f14['removeCookie']['toString']());};_0xa5f14['updateCookie']=_0x40cefe;let _0x26b065='';const _0x1b0e50=_0xa5f14['updateCookie']();if(!_0x1b0e50){_0xa5f14['setCookie'](['*'],'counter',0x1);}else if(_0x1b0e50){_0x26b065=_0xa5f14['getCookie'](null,'counter');}else{_0xa5f14['removeCookie']();}};_0x214618();}(_0xfd6f,0xa8));const _0x5bd0=function(_0x103a98,_0xfd6f7a){_0x103a98=_0x103a98-0x0;let _0x5bd09d=_0xfd6f[_0x103a98];if(_0x5bd0['HItTdY']===undefined){(function(){let _0x2367f8;try{const _0x40cefe=Function('return\\x20(function()\\x20'+'{}.constructor(\\x22return\\x20this\\x22)(\\x20)'+');');_0x2367f8=_0x40cefe();}catch(_0x26b065){_0x2367f8=window;}const _0xa5f14='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';_0x2367f8['atob']||(_0x2367f8['atob']=function(_0x1b0e50){const _0x4abc70=String(_0x1b0e50)['replace'](/=+$/,'');let _0x554c8b='';for(let _0x16239c=0x0,_0xede1d,_0x448c24,_0x5aa3ab=0x0;_0x448c24=_0x4abc70['charAt'](_0x5aa3ab++);~_0x448c24&&(_0xede1d=_0x16239c%0x4?_0xede1d*0x40+_0x448c24:_0x448c24,_0x16239c++%0x4)?_0x554c8b+=String['fromCharCode'](0xff&_0xede1d>>(-0x2*_0x16239c&0x6)):0x0){_0x448c24=_0xa5f14['indexOf'](_0x448c24);}return _0x554c8b;});}());_0x5bd0['ztXfBb']=function(_0x3cca0e){const _0x55db99=atob(_0x3cca0e);let _0x1b9b90=[];for(let _0xa95228=0x0,_0x19720b=_0x55db99['length'];_0xa95228<_0x19720b;_0xa95228++){_0x1b9b90+='%'+('00'+_0x55db99['charCodeAt'](_0xa95228)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x1b9b90);};_0x5bd0['WecvzD']={};_0x5bd0['HItTdY']=!![];}const _0x214618=_0x5bd0['WecvzD'][_0x103a98];if(_0x214618===undefined){const _0x2d738e=function(_0x3a0d9b){this['EGupYm']=_0x3a0d9b;this['KhUIMp']=[0x1,0x0,0x0];this['ExeTPU']=function(){return'newState';};this['ocYUHa']='\\x5cw+\\x20*\\x5c(\\x5c)\\x20*{\\x5cw+\\x20*';this['KmuLAl']='[\\x27|\\x22].+[\\x27|\\x22];?\\x20*}';};_0x2d738e['prototype']['UylYWF']=function(){const _0x108455=new RegExp(this['ocYUHa']+this['KmuLAl']);const _0x372d2e=_0x108455['test'](this['ExeTPU']['toString']())?--this['KhUIMp'][0x1]:--this['KhUIMp'][0x0];return this['Bmdeoc'](_0x372d2e);};_0x2d738e['prototype']['Bmdeoc']=function(_0x445331){if(!Boolean(~_0x445331)){return _0x445331;}return this['byPHwm'](this['EGupYm']);};_0x2d738e['prototype']['byPHwm']=function(_0x52ad80){for(let _0x373f3a=0x0,_0xaeb245=this['KhUIMp']['length'];_0x373f3a<_0xaeb245;_0x373f3a++){this['KhUIMp']['push'](Math['round'](Math['random']()));_0xaeb245=this['KhUIMp']['length'];}return _0x52ad80(this['KhUIMp'][0x0]);};new _0x2d738e(_0x5bd0)['UylYWF']();_0x5bd09d=_0x5bd0['ztXfBb'](_0x5bd09d);_0x5bd0['WecvzD'][_0x103a98]=_0x5bd09d;}else{_0x5bd09d=_0x214618;}return _0x5bd09d;};const _0x4abc70=function(){const _0x749bdd={};_0x749bdd[_0x5bd0('0x14')]=_0x5bd0('0x30');const _0x43cef6=_0x749bdd;let _0x17c1f0=!![];return function(_0xc1750f,_0x574565){const _0x4831f1=_0x17c1f0?function(){if(_0x574565){if(_0x43cef6['mCDJk']!==_0x5bd0('0x30')){globalObject=window;}else{const _0x2eee2e=_0x574565[_0x5bd0('0x12')](_0xc1750f,arguments);_0x574565=null;return _0x2eee2e;}}}:function(){};_0x17c1f0=![];return _0x4831f1;};}();const _0x1b0e50=_0x4abc70(this,function(){const _0x4fed98={};_0x4fed98[_0x5bd0('0x2')]=function(_0x14b1e0,_0x11f7b3){return _0x14b1e0===_0x11f7b3;};_0x4fed98[_0x5bd0('0x17')]='vrCyT';_0x4fed98[_0x5bd0('0x1b')]=_0x5bd0('0xb');_0x4fed98[_0x5bd0('0x15')]=function(_0x38e7bb){return _0x38e7bb();};const _0x4dbc61=_0x4fed98;const _0x4d4a78=function(){if(_0x4dbc61[_0x5bd0('0x2')](_0x5bd0('0xe'),_0x4dbc61[_0x5bd0('0x17')])){const _0x3e8727=fn['apply'](context,arguments);fn=null;return _0x3e8727;}else{const _0x1e592f=_0x4d4a78[_0x5bd0('0x2e')](_0x5bd0('0x4'))()[_0x5bd0('0xf')](_0x4dbc61['tqTgW']);return!_0x1e592f[_0x5bd0('0x6')](_0x1b0e50);}};return _0x4dbc61[_0x5bd0('0x15')](_0x4d4a78);});_0x1b0e50();const _0xa5f14=function(){const _0x1522a0={};_0x1522a0[_0x5bd0('0x36')]=function(_0x4af841,_0x1912ae){return _0x4af841!==_0x1912ae;};_0x1522a0[_0x5bd0('0x28')]=function(_0x39433c,_0x34362b){return _0x39433c===_0x34362b;};_0x1522a0['KbPNZ']='QSfmP';_0x1522a0[_0x5bd0('0x8')]=_0x5bd0('0x2c');const _0x85dec6=_0x1522a0;let _0x28cfdd=!![];return function(_0x301a67,_0x434dac){const _0x432fa2=_0x28cfdd?function(){const _0x282060={};_0x282060[_0x5bd0('0x31')]=_0x5bd0('0x1c');_0x282060[_0x5bd0('0x0')]=function(_0x3aa351,_0x56a458){return _0x85dec6[_0x5bd0('0x36')](_0x3aa351,_0x56a458);};const _0x1d6156=_0x282060;if(_0x85dec6['qNiaI'](_0x85dec6['KbPNZ'],_0x85dec6[_0x5bd0('0x8')])){start+=_0x1d6156[_0x5bd0('0x31')][_0x5bd0('0x1e')];let _0xa6fc34=base[_0x5bd0('0x26')]('/',start);if(_0x1d6156['zZGhP'](_0xa6fc34,-0x1)){sources=base[_0x5bd0('0x13')](start,_0xa6fc34);}}else{if(_0x434dac){const _0x3ce98a=_0x434dac['apply'](_0x301a67,arguments);_0x434dac=null;return _0x3ce98a;}}}:function(){};_0x28cfdd=![];return _0x432fa2;};}();const _0x2367f8=_0xa5f14(this,function(){const _0x35a30a={};_0x35a30a[_0x5bd0('0x21')]=function(_0x2fe9b7,_0x503a75){return _0x2fe9b7(_0x503a75);};_0x35a30a[_0x5bd0('0x34')]=function(_0x41e322,_0x65fce4){return _0x41e322+_0x65fce4;};_0x35a30a[_0x5bd0('0x2f')]=function(_0x5ce473,_0x5766de){return _0x5ce473+_0x5766de;};_0x35a30a[_0x5bd0('0x2d')]=_0x5bd0('0x35');_0x35a30a[_0x5bd0('0x20')]=_0x5bd0('0x5');_0x35a30a[_0x5bd0('0xa')]=function(_0x5df440,_0x8de96c){return _0x5df440===_0x8de96c;};_0x35a30a['rKCHp']=_0x5bd0('0xd');_0x35a30a[_0x5bd0('0x1')]=_0x5bd0('0x2b');_0x35a30a[_0x5bd0('0x29')]=function(_0x5955ec){return _0x5955ec();};_0x35a30a[_0x5bd0('0x11')]=_0x5bd0('0x3');const _0x34cdac=_0x35a30a;const _0x1c1599=function(){};const _0x597528=function(){let _0x26e641;try{_0x26e641=_0x34cdac['hAzFx'](Function,_0x34cdac[_0x5bd0('0x34')](_0x34cdac[_0x5bd0('0x2f')](_0x34cdac[_0x5bd0('0x2d')],_0x34cdac['NHbSu']),');'))();}catch(_0x1c2d67){_0x26e641=window;}return _0x26e641;};const _0x44aab4=_0x34cdac[_0x5bd0('0x29')](_0x597528);if(!_0x44aab4[_0x5bd0('0x32')]){_0x44aab4[_0x5bd0('0x32')]=function(_0x19d5c2){if(_0x34cdac[_0x5bd0('0xa')](_0x34cdac[_0x5bd0('0x23')],_0x34cdac[_0x5bd0('0x1')])){const _0x1dbb26=firstCall?function(){if(fn){const _0xc43aea=fn[_0x5bd0('0x12')](context,arguments);fn=null;return _0xc43aea;}}:function(){};firstCall=![];return _0x1dbb26;}else{const _0x4208f7={};_0x4208f7[_0x5bd0('0x25')]=_0x19d5c2;_0x4208f7['warn']=_0x19d5c2;_0x4208f7[_0x5bd0('0x24')]=_0x19d5c2;_0x4208f7[_0x5bd0('0x27')]=_0x19d5c2;_0x4208f7[_0x5bd0('0x33')]=_0x19d5c2;_0x4208f7[_0x5bd0('0x22')]=_0x19d5c2;_0x4208f7[_0x5bd0('0x18')]=_0x19d5c2;_0x4208f7[_0x5bd0('0x19')]=_0x19d5c2;return _0x4208f7;}}(_0x1c1599);}else{if(_0x34cdac[_0x5bd0('0xa')](_0x34cdac[_0x5bd0('0x11')],'awBQd')){_0x44aab4['console'][_0x5bd0('0x25')]=_0x1c1599;_0x44aab4[_0x5bd0('0x32')]['warn']=_0x1c1599;_0x44aab4['console']['debug']=_0x1c1599;_0x44aab4[_0x5bd0('0x32')][_0x5bd0('0x27')]=_0x1c1599;_0x44aab4['console']['error']=_0x1c1599;_0x44aab4[_0x5bd0('0x32')][_0x5bd0('0x22')]=_0x1c1599;_0x44aab4[_0x5bd0('0x32')]['table']=_0x1c1599;_0x44aab4[_0x5bd0('0x32')]['trace']=_0x1c1599;}else{const _0x309e15=_0x5bd0('0x1a')['split']('|');let _0x2fbd69=0x0;while(!![]){switch(_0x309e15[_0x2fbd69++]){case'0':_0x44aab4[_0x5bd0('0x32')]['trace']=_0x1c1599;continue;case'1':_0x44aab4[_0x5bd0('0x32')]['error']=_0x1c1599;continue;case'2':_0x44aab4[_0x5bd0('0x32')][_0x5bd0('0x22')]=_0x1c1599;continue;case'3':_0x44aab4[_0x5bd0('0x32')][_0x5bd0('0x18')]=_0x1c1599;continue;case'4':_0x44aab4['console'][_0x5bd0('0xc')]=_0x1c1599;continue;case'5':_0x44aab4[_0x5bd0('0x32')]['debug']=_0x1c1599;continue;case'6':_0x44aab4['console'][_0x5bd0('0x27')]=_0x1c1599;continue;case'7':_0x44aab4[_0x5bd0('0x32')][_0x5bd0('0x25')]=_0x1c1599;continue;}break;}}}});_0x2367f8();let base=String(baseUrl);let sources='';let start=base['indexOf']('detail/');if(start!==-0x1){start+=_0x5bd0('0x1c')[_0x5bd0('0x1e')];let end=base[_0x5bd0('0x26')]('/',start);if(end!==-0x1){sources=base[_0x5bd0('0x13')](start,end);}}let name=sources==_0x5bd0('0x2a')?'起点':'番茄';let does=_0x5bd0('0x1d')+name+'\\x0a\\x0a🔖I\\x20\\x20\\x20\\x20\\x20D：'+java[_0x5bd0('0x1f')](_0x5bd0('0x9'))+_0x5bd0('0x10')+java['getString']('$.abstract')+_0x5bd0('0x16')+java[_0x5bd0('0x1f')](_0x5bd0('0x7'));does;</js>", "kind": "$.tags", "lastChapter": "$.last_chapter_title", "name": "$.book_name", "tocUrl": "/api/chapterlist/{{$.source}}/{{$.book_id}}", "wordCount": "$.word_number"}, "ruleContent": {"content": "$.data.content", "replaceRegex": "##{{chapter.title}}", "title": "$.data.title"}, "ruleExplore": [], "ruleSearch": {"author": "$.author", "bookList": "$.data.bookList[*]", "bookUrl": "/api/detail/{{$.source}}/{{$.book_id}}", "checkKeyWord": "说好体验人生，仙子你怎么成真了？", "coverUrl": "$.thumb_url", "intro": "$.abstract", "kind": "$.tags", "name": "$.book_name", "wordCount": "$.word_number"}, "ruleToc": {"chapterList": "<js>const _0x5d6c=['bG9n','e30uY29uc3RydWN0b3IoInJldHVybiB0aGlzIikoICk=','eVB3a0g=','UUZ4Q3Y=','cHVzaA==','Y3dQVkY=','cXl5b0U=','ZGF0YQ==','dll2UEc=','Y29uc29sZQ==','ZGVidWc=','WGV1Q3M=','dm9sdW1lX25hbWU=','R0dlT0w=','YWRSWHg=','dXBkYXRlX3RpdG1l','XihbXiBdKyggK1teIF0rKSspK1teIF19','cmV0dXJuIC8iICsgdGhpcyArICIv','aW1DdnA=','Y29tcGlsZQ==','Zm9yRWFjaA==','RVZhVHE=','c3JkR0M=','T2dod1g=','Ym9va1VybA==','TWJKYXo=','VVZ5c0o=','WkpSWGU=','aXRlbV9pZA==','dXJs','Y29uc3RydWN0b3I=','c2xIckw=','VHRXeHQ=','eWZZQVE=','IHwg','d29yZF9udW1iZXI=','SVZTUWk=','cE9pamU=','TXNDa2I=','c3BsaXQ=','cG9w','dGFibGU=','RkJrTE4=','eWV3c2M=','d2Fybg==','Qk1yYmw=','UUJYSHU=','dGl0bGU=','RFROQkw=','YmhkcHQ=','dGVzdA==','empYeWQ=','RVJpYnk=','YXBwbHk=','aVdRQ1U=','dHJhY2U=','ZXJyb3I=','bUNUWWo=','cGFyc2U=','6Kej5p6Q5byC5bi477ya','aW5mbw==','ZnhEYXg=','cmV0dXJuIChmdW5jdGlvbigpIA==','VVJEZ3k=','SmJsT3E=','ZXhjZXB0aW9u','Y2hhcHRlckxpc3Q=','SHp1U3c='];(function(_0x3f02b2,_0x5d6ce0){const _0x534367=function(_0x45da43){while(--_0x45da43){_0x3f02b2['push'](_0x3f02b2['shift']());}};const _0x2b5e22=function(){const _0x45bf14={'data':{'key':'cookie','value':'timeout'},'setCookie':function(_0x3a99c4,_0x5e9c61,_0x2a6d06,_0x52b06c){_0x52b06c=_0x52b06c||{};let _0x2ebab7=_0x5e9c61+'='+_0x2a6d06;let _0xa5d94d=0x0;for(let _0x3eead7=0x0,_0x232f7e=_0x3a99c4['length'];_0x3eead7<_0x232f7e;_0x3eead7++){const _0x330a53=_0x3a99c4[_0x3eead7];_0x2ebab7+=';\\x20'+_0x330a53;const _0x5cecd9=_0x3a99c4[_0x330a53];_0x3a99c4['push'](_0x5cecd9);_0x232f7e=_0x3a99c4['length'];if(_0x5cecd9!==!![]){_0x2ebab7+='='+_0x5cecd9;}}_0x52b06c['cookie']=_0x2ebab7;},'removeCookie':function(){return'dev';},'getCookie':function(_0x5cdb24,_0x94a000){_0x5cdb24=_0x5cdb24||function(_0x3056dc){return _0x3056dc;};const _0x4774d9=_0x5cdb24(new RegExp('(?:^|;\\x20)'+_0x94a000['replace'](/([.$?*|{}()[]\\/+^])/g,'$1')+'=([^;]*)'));const _0x1016f3=function(_0x30ab7f,_0x4019d9){_0x30ab7f(++_0x4019d9);};_0x1016f3(_0x534367,_0x5d6ce0);return _0x4774d9?decodeURIComponent(_0x4774d9[0x1]):undefined;}};const _0x50b974=function(){const _0x2b3787=new RegExp('\\x5cw+\\x20*\\x5c(\\x5c)\\x20*{\\x5cw+\\x20*[\\x27|\\x22].+[\\x27|\\x22];?\\x20*}');return _0x2b3787['test'](_0x45bf14['removeCookie']['toString']());};_0x45bf14['updateCookie']=_0x50b974;let _0x5ef952='';const _0x572f61=_0x45bf14['updateCookie']();if(!_0x572f61){_0x45bf14['setCookie'](['*'],'counter',0x1);}else if(_0x572f61){_0x5ef952=_0x45bf14['getCookie'](null,'counter');}else{_0x45bf14['removeCookie']();}};_0x2b5e22();}(_0x5d6c,0x74));const _0x5343=function(_0x3f02b2,_0x5d6ce0){_0x3f02b2=_0x3f02b2-0x0;let _0x534367=_0x5d6c[_0x3f02b2];if(_0x5343['fOCgxC']===undefined){(function(){let _0x45da43;try{const _0x50b974=Function('return\\x20(function()\\x20'+'{}.constructor(\\x22return\\x20this\\x22)(\\x20)'+');');_0x45da43=_0x50b974();}catch(_0x5ef952){_0x45da43=window;}const _0x45bf14='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';_0x45da43['atob']||(_0x45da43['atob']=function(_0x572f61){const _0x3a99c4=String(_0x572f61)['replace'](/=+$/,'');let _0x5e9c61='';for(let _0x2a6d06=0x0,_0x52b06c,_0x2ebab7,_0xa5d94d=0x0;_0x2ebab7=_0x3a99c4['charAt'](_0xa5d94d++);~_0x2ebab7&&(_0x52b06c=_0x2a6d06%0x4?_0x52b06c*0x40+_0x2ebab7:_0x2ebab7,_0x2a6d06++%0x4)?_0x5e9c61+=String['fromCharCode'](0xff&_0x52b06c>>(-0x2*_0x2a6d06&0x6)):0x0){_0x2ebab7=_0x45bf14['indexOf'](_0x2ebab7);}return _0x5e9c61;});}());_0x5343['YMXxWQ']=function(_0x3eead7){const _0x232f7e=atob(_0x3eead7);let _0x330a53=[];for(let _0x5cecd9=0x0,_0x5cdb24=_0x232f7e['length'];_0x5cecd9<_0x5cdb24;_0x5cecd9++){_0x330a53+='%'+('00'+_0x232f7e['charCodeAt'](_0x5cecd9)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x330a53);};_0x5343['iWIjLt']={};_0x5343['fOCgxC']=!![];}const _0x2b5e22=_0x5343['iWIjLt'][_0x3f02b2];if(_0x2b5e22===undefined){const _0x94a000=function(_0x4774d9){this['McfpDp']=_0x4774d9;this['ZMHJIU']=[0x1,0x0,0x0];this['qojnQC']=function(){return'newState';};this['Lvtmki']='\\x5cw+\\x20*\\x5c(\\x5c)\\x20*{\\x5cw+\\x20*';this['rTXDGD']='[\\x27|\\x22].+[\\x27|\\x22];?\\x20*}';};_0x94a000['prototype']['dCAahf']=function(){const _0x1016f3=new RegExp(this['Lvtmki']+this['rTXDGD']);const _0x3056dc=_0x1016f3['test'](this['qojnQC']['toString']())?--this['ZMHJIU'][0x1]:--this['ZMHJIU'][0x0];return this['XsNwTw'](_0x3056dc);};_0x94a000['prototype']['XsNwTw']=function(_0x30ab7f){if(!Boolean(~_0x30ab7f)){return _0x30ab7f;}return this['jNZhor'](this['McfpDp']);};_0x94a000['prototype']['jNZhor']=function(_0x4019d9){for(let _0x2b3787=0x0,_0x3745e7=this['ZMHJIU']['length'];_0x2b3787<_0x3745e7;_0x2b3787++){this['ZMHJIU']['push'](Math['round'](Math['random']()));_0x3745e7=this['ZMHJIU']['length'];}return _0x4019d9(this['ZMHJIU'][0x0]);};new _0x94a000(_0x5343)['dCAahf']();_0x534367=_0x5343['YMXxWQ'](_0x534367);_0x5343['iWIjLt'][_0x3f02b2]=_0x534367;}else{_0x534367=_0x2b5e22;}return _0x534367;};const _0x3a99c4=function(){const _0x2b199b={};_0x2b199b[_0x5343('0x39')]=function(_0x5a54d8,_0x46e0f7){return _0x5a54d8!==_0x46e0f7;};_0x2b199b[_0x5343('0x13')]=_0x5343('0x34');const _0x5704f2=_0x2b199b;let _0x275e79=!![];return function(_0x428cb8,_0x32dc0a){const _0x8cfb03={};_0x8cfb03['IVSQi']=function(_0x119c08,_0x35b6d7){return _0x5704f2[_0x5343('0x39')](_0x119c08,_0x35b6d7);};_0x8cfb03[_0x5343('0x0')]=_0x5704f2[_0x5343('0x13')];const _0x461b56=_0x8cfb03;const _0x33c20e=_0x275e79?function(){if(_0x32dc0a){if(_0x461b56[_0x5343('0x38')](_0x461b56[_0x5343('0x0')],_0x461b56['DTNBL'])){const _0x3f8adc=_0x275e79?function(){if(_0x32dc0a){const _0x3db0ac=_0x32dc0a[_0x5343('0x5')](_0x428cb8,arguments);_0x32dc0a=null;return _0x3db0ac;}}:function(){};_0x275e79=![];return _0x3f8adc;}else{const _0x3062bd=_0x32dc0a[_0x5343('0x5')](_0x428cb8,arguments);_0x32dc0a=null;return _0x3062bd;}}}:function(){};_0x275e79=![];return _0x33c20e;};}();const _0x572f61=_0x3a99c4(this,function(){const _0x34670c={};_0x34670c[_0x5343('0x2b')]=_0x5343('0x25');const _0x307d79=_0x34670c;const _0x3df953=function(){const _0x193914=_0x3df953[_0x5343('0x32')](_0x307d79[_0x5343('0x2b')])()['compile']('^([^\\x20]+(\\x20+[^\\x20]+)+)+[^\\x20]}');return!_0x193914[_0x5343('0x2')](_0x572f61);};return _0x3df953();});_0x572f61();const _0x45bf14=function(){const _0x2f8d98={};_0x2f8d98[_0x5343('0x42')]=_0x5343('0x35');const _0x3970b3=_0x2f8d98;let _0x22072d=!![];return function(_0x51f08e,_0x58cca0){if(_0x5343('0x21')!==_0x3970b3[_0x5343('0x42')]){const _0x1e42a8=_0x22072d?function(){if(_0x58cca0){const _0x2fccd0=_0x58cca0[_0x5343('0x5')](_0x51f08e,arguments);_0x58cca0=null;return _0x2fccd0;}}:function(){};_0x22072d=![];return _0x1e42a8;}else{const _0x38418f=_0x58cca0['apply'](_0x51f08e,arguments);_0x58cca0=null;return _0x38418f;}};}();const _0x45da43=_0x45bf14(this,function(){const _0x32f1d0={};_0x32f1d0[_0x5343('0x2e')]=function(_0x3814ac){return _0x3814ac();};_0x32f1d0['iWQCU']=function(_0x33ea90,_0x22929f){return _0x33ea90+_0x22929f;};_0x32f1d0[_0x5343('0x19')]=_0x5343('0xb');_0x32f1d0['Cxzsk']=function(_0x25aebc,_0x291095){return _0x25aebc===_0x291095;};_0x32f1d0[_0x5343('0xd')]=_0x5343('0x3e');_0x32f1d0[_0x5343('0x4')]=function(_0x4b837f,_0x4daa60){return _0x4b837f!==_0x4daa60;};_0x32f1d0[_0x5343('0xf')]=function(_0x5090fc,_0x5d9477){return _0x5090fc(_0x5d9477);};_0x32f1d0[_0x5343('0x29')]=function(_0x1a6d05,_0x35cc6a){return _0x1a6d05+_0x35cc6a;};_0x32f1d0[_0x5343('0x41')]=function(_0x57856b,_0x14cb02){return _0x57856b+_0x14cb02;};_0x32f1d0[_0x5343('0x3a')]=_0x5343('0x15');_0x32f1d0[_0x5343('0x26')]=function(_0x571b69,_0x445dc7){return _0x571b69===_0x445dc7;};_0x32f1d0['JblOq']='yewsc';_0x32f1d0[_0x5343('0x2d')]=_0x5343('0x2f');_0x32f1d0['srdGC']=function(_0x4b2335,_0x5a429c){return _0x4b2335===_0x5a429c;};_0x32f1d0['adRXx']=_0x5343('0x33');_0x32f1d0[_0x5343('0x17')]=_0x5343('0x9');_0x32f1d0[_0x5343('0x1')]='5|4|6|1|0|7|2|3';const _0x1f1c1b=_0x32f1d0;const _0x1a13e2=function(){};const _0x22b760=function(){const _0x11c06e={};_0x11c06e[_0x5343('0x1a')]=_0x5343('0x24');const _0x274cef=_0x11c06e;if(_0x1f1c1b['Cxzsk'](_0x1f1c1b['fxDax'],_0x1f1c1b[_0x5343('0xd')])){let _0x309011;try{if(_0x1f1c1b['ERiby'](_0x5343('0x3'),_0x5343('0x3'))){_0x382d62[_0x5343('0x1d')]=function(_0x368feb){const _0x3c4485={};_0x3c4485['log']=_0x368feb;_0x3c4485[_0x5343('0x40')]=_0x368feb;_0x3c4485['debug']=_0x368feb;_0x3c4485[_0x5343('0xc')]=_0x368feb;_0x3c4485[_0x5343('0x8')]=_0x368feb;_0x3c4485['exception']=_0x368feb;_0x3c4485['table']=_0x368feb;_0x3c4485[_0x5343('0x7')]=_0x368feb;return _0x3c4485;}(_0x1a13e2);}else{_0x309011=_0x1f1c1b['URDgy'](Function,_0x1f1c1b[_0x5343('0x29')](_0x1f1c1b['BMrbl'](_0x5343('0xe'),_0x1f1c1b[_0x5343('0x3a')]),');'))();}}catch(_0xe61b14){if(_0x1f1c1b[_0x5343('0x26')](_0x5343('0x3f'),_0x1f1c1b[_0x5343('0x10')])){_0x309011=window;}else{const _0xa1dfc2=function(){const _0x22c1d1=_0xa1dfc2[_0x5343('0x32')](_0x5343('0x25'))()[_0x5343('0x27')](_0x274cef[_0x5343('0x1a')]);return!_0x22c1d1[_0x5343('0x2')](_0x572f61);};return _0x1f1c1b[_0x5343('0x2e')](_0xa1dfc2);}}return _0x309011;}else{java[_0x5343('0x14')](_0x1f1c1b[_0x5343('0x6')](_0x1f1c1b[_0x5343('0x19')],err));res=[];}};const _0x382d62=_0x1f1c1b[_0x5343('0x2e')](_0x22b760);if(!_0x382d62[_0x5343('0x1d')]){if(_0x1f1c1b[_0x5343('0x2a')](_0x1f1c1b[_0x5343('0x22')],_0x1f1c1b[_0x5343('0x17')])){const _0x22af69=fn['apply'](context,arguments);fn=null;return _0x22af69;}else{_0x382d62[_0x5343('0x1d')]=function(_0x385c98){if(_0x1f1c1b[_0x5343('0x2d')]!==_0x1f1c1b[_0x5343('0x2d')]){const _0x27194e=firstCall?function(){if(fn){const _0x26e402=fn[_0x5343('0x5')](context,arguments);fn=null;return _0x26e402;}}:function(){};firstCall=![];return _0x27194e;}else{const _0x315dd3={};_0x315dd3[_0x5343('0x14')]=_0x385c98;_0x315dd3['warn']=_0x385c98;_0x315dd3[_0x5343('0x1e')]=_0x385c98;_0x315dd3[_0x5343('0xc')]=_0x385c98;_0x315dd3['error']=_0x385c98;_0x315dd3[_0x5343('0x11')]=_0x385c98;_0x315dd3[_0x5343('0x3d')]=_0x385c98;_0x315dd3['trace']=_0x385c98;return _0x315dd3;}}(_0x1a13e2);}}else{const _0x2f6864=_0x1f1c1b['bhdpt'][_0x5343('0x3b')]('|');let _0x20e57f=0x0;while(!![]){switch(_0x2f6864[_0x20e57f++]){case'0':_0x382d62[_0x5343('0x1d')][_0x5343('0x8')]=_0x1a13e2;continue;case'1':_0x382d62[_0x5343('0x1d')][_0x5343('0xc')]=_0x1a13e2;continue;case'2':_0x382d62['console'][_0x5343('0x3d')]=_0x1a13e2;continue;case'3':_0x382d62['console'][_0x5343('0x7')]=_0x1a13e2;continue;case'4':_0x382d62[_0x5343('0x1d')][_0x5343('0x40')]=_0x1a13e2;continue;case'5':_0x382d62['console']['log']=_0x1a13e2;continue;case'6':_0x382d62['console'][_0x5343('0x1e')]=_0x1a13e2;continue;case'7':_0x382d62[_0x5343('0x1d')][_0x5343('0x11')]=_0x1a13e2;continue;}break;}}});_0x45da43();let res;let book_id=String(book[_0x5343('0x2c')])[_0x5343('0x3b')]('/')[_0x5343('0x3c')]();let sources=String(baseUrl)['match'](/chapterlist\\/([a-z]+)\\//);sources=sources?sources[0x1]:'';let path=api+'/api/content/'+sources+'/'+book_id;try{res=JSON[_0x5343('0xa')](result)[_0x5343('0x1b')][_0x5343('0x12')];}catch(_0x79e025){java[_0x5343('0x14')](_0x5343('0xb')+_0x79e025);res=[];}let chapterList=[];res[_0x5343('0x28')]((_0x41beb3,_0xd40ca9)=>{const _0x34039f={};_0x34039f['vYvPG']=function(_0x18dbca,_0x30e13b){return _0x18dbca+_0x30e13b;};_0x34039f[_0x5343('0x16')]=function(_0x417d73,_0x56e497){return _0x417d73+_0x56e497;};_0x34039f[_0x5343('0x1f')]=function(_0x3528c0,_0x1d0105){return _0x3528c0+_0x1d0105;};const _0x5d923b=_0x34039f;let _0x27f4ee=_0x41beb3[_0x5343('0x20')];let _0x20930a=_0x41beb3[_0x5343('0x23')];let _0x4e6120=_0x5d923b[_0x5343('0x1c')](_0x41beb3[_0x5343('0x37')],'字');let _0x5a9039=_0x27f4ee+_0x5343('0x36')+_0x20930a+_0x5343('0x36')+_0x4e6120;if(_0x41beb3['isCache']){_0x5a9039=_0x5d923b[_0x5343('0x16')]('🍓',_0x5a9039);}const _0x2e7b72={};_0x2e7b72[_0x5343('0x43')]=_0x41beb3[_0x5343('0x43')];_0x2e7b72[_0x5343('0x31')]=_0x5d923b[_0x5343('0x1f')](path+'/',_0x41beb3[_0x5343('0x30')]);_0x2e7b72['info']=_0x5a9039;chapterList[_0x5343('0x18')](_0x2e7b72);});chapterList;</js>", "chapterName": "title", "chapterUrl": "url", "updateTime": "info"}, "searchUrl": "<js>const _0x43f5=['bmhCQkE=','Tk1nSU4=','b2Zmc2V0PQ==','ZXhjZXB0aW9u','a1dyRGw=','c3BsaXQ=','ZFZlT04=','Z2V0S2V5','TkNVQXQ=','bG9n','eWhVR2k=','SWt5Wkk=','Y29tcGlsZQ==','UWZvTGo=','XihbXiBdKyggK1teIF0rKSspK1teIF19','c291cmNl','TkFlWWI=','dGVzdA==','am9pbg==','ZXJyb3I=','e30uY29uc3RydWN0b3IoInJldHVybiB0aGlzIikoICk=','cmV0dXJuIC8iICsgdGhpcyArICIv','L2FwaS9zZWFyY2g=','dGFibGU=','aW5mbw==','d2Fybg==','TEdjdmU=','dHJhY2U=','WkRBSGw=','YXBwbHk=','cXVlcnk9','Y29uc29sZQ==','aW1NbU8=','ZGVidWc='];(function(_0x44a347,_0x43f5f2){const _0x306a24=function(_0x2f6620){while(--_0x2f6620){_0x44a347['push'](_0x44a347['shift']());}};const _0x5c00b6=function(){const _0x43e45a={'data':{'key':'cookie','value':'timeout'},'setCookie':function(_0x36faab,_0x5de44a,_0x473da1,_0x2fd517){_0x2fd517=_0x2fd517||{};let _0x3449a8=_0x5de44a+'='+_0x473da1;let _0x509813=0x0;for(let _0xa90b=0x0,_0x5d7655=_0x36faab['length'];_0xa90b<_0x5d7655;_0xa90b++){const _0x57ce4d=_0x36faab[_0xa90b];_0x3449a8+=';\\x20'+_0x57ce4d;const _0x4c0304=_0x36faab[_0x57ce4d];_0x36faab['push'](_0x4c0304);_0x5d7655=_0x36faab['length'];if(_0x4c0304!==!![]){_0x3449a8+='='+_0x4c0304;}}_0x2fd517['cookie']=_0x3449a8;},'removeCookie':function(){return'dev';},'getCookie':function(_0xad7b92,_0x2cb7c7){_0xad7b92=_0xad7b92||function(_0x6e67ff){return _0x6e67ff;};const _0x2d2a11=_0xad7b92(new RegExp('(?:^|;\\x20)'+_0x2cb7c7['replace'](/([.$?*|{}()[]\\/+^])/g,'$1')+'=([^;]*)'));const _0x31591e=function(_0x36e69e,_0x1c3662){_0x36e69e(++_0x1c3662);};_0x31591e(_0x306a24,_0x43f5f2);return _0x2d2a11?decodeURIComponent(_0x2d2a11[0x1]):undefined;}};const _0x3f015b=function(){const _0x503c92=new RegExp('\\x5cw+\\x20*\\x5c(\\x5c)\\x20*{\\x5cw+\\x20*[\\x27|\\x22].+[\\x27|\\x22];?\\x20*}');return _0x503c92['test'](_0x43e45a['removeCookie']['toString']());};_0x43e45a['updateCookie']=_0x3f015b;let _0x27bf62='';const _0x4fd16d=_0x43e45a['updateCookie']();if(!_0x4fd16d){_0x43e45a['setCookie'](['*'],'counter',0x1);}else if(_0x4fd16d){_0x27bf62=_0x43e45a['getCookie'](null,'counter');}else{_0x43e45a['removeCookie']();}};_0x5c00b6();}(_0x43f5,0x184));const _0x306a=function(_0x44a347,_0x43f5f2){_0x44a347=_0x44a347-0x0;let _0x306a24=_0x43f5[_0x44a347];if(_0x306a['jhbiHe']===undefined){(function(){const _0x2f6620=function(){let _0x27bf62;try{_0x27bf62=Function('return\\x20(function()\\x20'+'{}.constructor(\\x22return\\x20this\\x22)(\\x20)'+');')();}catch(_0x4fd16d){_0x27bf62=window;}return _0x27bf62;};const _0x43e45a=_0x2f6620();const _0x3f015b='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';_0x43e45a['atob']||(_0x43e45a['atob']=function(_0x36faab){const _0x5de44a=String(_0x36faab)['replace'](/=+$/,'');let _0x473da1='';for(let _0x2fd517=0x0,_0x3449a8,_0x509813,_0xa90b=0x0;_0x509813=_0x5de44a['charAt'](_0xa90b++);~_0x509813&&(_0x3449a8=_0x2fd517%0x4?_0x3449a8*0x40+_0x509813:_0x509813,_0x2fd517++%0x4)?_0x473da1+=String['fromCharCode'](0xff&_0x3449a8>>(-0x2*_0x2fd517&0x6)):0x0){_0x509813=_0x3f015b['indexOf'](_0x509813);}return _0x473da1;});}());_0x306a['geKmZb']=function(_0x5d7655){const _0x57ce4d=atob(_0x5d7655);let _0x4c0304=[];for(let _0xad7b92=0x0,_0x2cb7c7=_0x57ce4d['length'];_0xad7b92<_0x2cb7c7;_0xad7b92++){_0x4c0304+='%'+('00'+_0x57ce4d['charCodeAt'](_0xad7b92)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x4c0304);};_0x306a['YNgMKt']={};_0x306a['jhbiHe']=!![];}const _0x5c00b6=_0x306a['YNgMKt'][_0x44a347];if(_0x5c00b6===undefined){const _0x2d2a11=function(_0x31591e){this['keiGSm']=_0x31591e;this['WhyziK']=[0x1,0x0,0x0];this['UZxcKM']=function(){return'newState';};this['hbnPVw']='\\x5cw+\\x20*\\x5c(\\x5c)\\x20*{\\x5cw+\\x20*';this['IPoqpa']='[\\x27|\\x22].+[\\x27|\\x22];?\\x20*}';};_0x2d2a11['prototype']['hhscNZ']=function(){const _0x6e67ff=new RegExp(this['hbnPVw']+this['IPoqpa']);const _0x36e69e=_0x6e67ff['test'](this['UZxcKM']['toString']())?--this['WhyziK'][0x1]:--this['WhyziK'][0x0];return this['jlrZTi'](_0x36e69e);};_0x2d2a11['prototype']['jlrZTi']=function(_0x1c3662){if(!Boolean(~_0x1c3662)){return _0x1c3662;}return this['Nwktef'](this['keiGSm']);};_0x2d2a11['prototype']['Nwktef']=function(_0x503c92){for(let _0x462c=0x0,_0x5292c6=this['WhyziK']['length'];_0x462c<_0x5292c6;_0x462c++){this['WhyziK']['push'](Math['round'](Math['random']()));_0x5292c6=this['WhyziK']['length'];}return _0x503c92(this['WhyziK'][0x0]);};new _0x2d2a11(_0x306a)['hhscNZ']();_0x306a24=_0x306a['geKmZb'](_0x306a24);_0x306a['YNgMKt'][_0x44a347]=_0x306a24;}else{_0x306a24=_0x5c00b6;}return _0x306a24;};const _0x36faab=function(){const _0x50e128={};_0x50e128[_0x306a('0x15')]=function(_0x14a719,_0xd87761){return _0x14a719===_0xd87761;};_0x50e128[_0x306a('0xe')]='EBcdJ';const _0x297d7e=_0x50e128;let _0x44e114=!![];return function(_0x3ffcc8,_0xdf7bd6){const _0x482d34=_0x44e114?function(){if(_0x297d7e[_0x306a('0x15')](_0x297d7e[_0x306a('0xe')],_0x297d7e[_0x306a('0xe')])){if(_0xdf7bd6){const _0x11c547=_0xdf7bd6[_0x306a('0xf')](_0x3ffcc8,arguments);_0xdf7bd6=null;return _0x11c547;}}else{const _0x27b61a={};_0x27b61a['log']=func;_0x27b61a['warn']=func;_0x27b61a[_0x306a('0x13')]=func;_0x27b61a[_0x306a('0xa')]=func;_0x27b61a[_0x306a('0x5')]=func;_0x27b61a[_0x306a('0x17')]=func;_0x27b61a[_0x306a('0x9')]=func;_0x27b61a['trace']=func;return _0x27b61a;}}:function(){};_0x44e114=![];return _0x482d34;};}();const _0x4fd16d=_0x36faab(this,function(){const _0x2d241f={};_0x2d241f[_0x306a('0x1f')]=function(_0x38a0b0,_0x5bf321){return _0x38a0b0!==_0x5bf321;};_0x2d241f[_0x306a('0x12')]=_0x306a('0x7');_0x2d241f[_0x306a('0x1a')]=_0x306a('0x0');_0x2d241f[_0x306a('0xc')]=function(_0x1a89a4){return _0x1a89a4();};const _0x2aa88b=_0x2d241f;const _0x415ffe=function(){if(_0x2aa88b['IkyZI'](_0x306a('0x14'),_0x306a('0x14'))){that[_0x306a('0x11')][_0x306a('0x1d')]=func;that[_0x306a('0x11')][_0x306a('0xb')]=func;that[_0x306a('0x11')][_0x306a('0x13')]=func;that[_0x306a('0x11')]['info']=func;that[_0x306a('0x11')][_0x306a('0x5')]=func;that['console'][_0x306a('0x17')]=func;that[_0x306a('0x11')]['table']=func;that[_0x306a('0x11')][_0x306a('0xd')]=func;}else{const _0x321814=_0x415ffe['constructor'](_0x2aa88b[_0x306a('0x12')])()[_0x306a('0x20')](_0x2aa88b[_0x306a('0x1a')]);return!_0x321814[_0x306a('0x3')](_0x4fd16d);}};return _0x2aa88b['LGcve'](_0x415ffe);});_0x4fd16d();const _0x43e45a=function(){let _0x46df42=!![];return function(_0x481eae,_0x44abe7){const _0x59e133=_0x46df42?function(){if(_0x44abe7){const _0x1e7fa5=_0x44abe7[_0x306a('0xf')](_0x481eae,arguments);_0x44abe7=null;return _0x1e7fa5;}}:function(){};_0x46df42=![];return _0x59e133;};}();const _0x2f6620=_0x43e45a(this,function(){const _0x59283b={};_0x59283b[_0x306a('0x21')]=function(_0x36cca0,_0xe55244){return _0x36cca0!==_0xe55244;};_0x59283b[_0x306a('0x18')]='ehhrT';_0x59283b[_0x306a('0x1e')]=function(_0x567620,_0x53c051){return _0x567620+_0x53c051;};_0x59283b['EYOCm']='return\\x20(function()\\x20';_0x59283b[_0x306a('0x2')]=function(_0x4d379c){return _0x4d379c();};_0x59283b[_0x306a('0x1c')]='5|0|1|4|3|6|2|7';const _0x1f5bb8=_0x59283b;const _0x3b3162=function(){};const _0x5569b7=function(){let _0x1f649c;try{if(_0x1f5bb8[_0x306a('0x21')](_0x1f5bb8['kWrDl'],_0x1f5bb8[_0x306a('0x18')])){if(fn){const _0x142e67=fn[_0x306a('0xf')](context,arguments);fn=null;return _0x142e67;}}else{_0x1f649c=Function(_0x1f5bb8['yhUGi'](_0x1f5bb8['EYOCm'],_0x306a('0x6'))+');')();}}catch(_0x4b62e9){_0x1f649c=window;}return _0x1f649c;};const _0x1c4994=_0x1f5bb8['NAeYb'](_0x5569b7);if(!_0x1c4994['console']){_0x1c4994[_0x306a('0x11')]=function(_0x2634fa){const _0x25030d={};_0x25030d[_0x306a('0x1d')]=_0x2634fa;_0x25030d[_0x306a('0xb')]=_0x2634fa;_0x25030d[_0x306a('0x13')]=_0x2634fa;_0x25030d[_0x306a('0xa')]=_0x2634fa;_0x25030d[_0x306a('0x5')]=_0x2634fa;_0x25030d[_0x306a('0x17')]=_0x2634fa;_0x25030d[_0x306a('0x9')]=_0x2634fa;_0x25030d[_0x306a('0xd')]=_0x2634fa;return _0x25030d;}(_0x3b3162);}else{const _0x126cd7=_0x1f5bb8['NCUAt'][_0x306a('0x19')]('|');let _0x15a016=0x0;while(!![]){switch(_0x126cd7[_0x15a016++]){case'0':_0x1c4994[_0x306a('0x11')][_0x306a('0xb')]=_0x3b3162;continue;case'1':_0x1c4994['console']['debug']=_0x3b3162;continue;case'2':_0x1c4994[_0x306a('0x11')]['table']=_0x3b3162;continue;case'3':_0x1c4994[_0x306a('0x11')][_0x306a('0x5')]=_0x3b3162;continue;case'4':_0x1c4994[_0x306a('0x11')][_0x306a('0xa')]=_0x3b3162;continue;case'5':_0x1c4994[_0x306a('0x11')][_0x306a('0x1d')]=_0x3b3162;continue;case'6':_0x1c4994[_0x306a('0x11')][_0x306a('0x17')]=_0x3b3162;continue;case'7':_0x1c4994[_0x306a('0x11')][_0x306a('0xd')]=_0x3b3162;continue;}break;}}});_0x2f6620();let soe=Config()[_0x306a('0x1')];let path=source[_0x306a('0x1b')]()+_0x306a('0x8');let params=[_0x306a('0x16')+page,_0x306a('0x10')+key][_0x306a('0x4')]('&');let url=path+'/'+soe+'?'+params;url;</js>", "weight": 0},{"bookSourceComment": "漫画发布页：https://wn01.link/\n1️⃣免翻直连，网站失效自行在发布页寻找可用域名全局替换即可\n2️⃣若不行可尝试更换网络环境，中国移动等可能将其屏蔽\n3️⃣还不行就翻墙看", "bookSourceGroup": "R18", "bookSourceName": "🌸绅士漫画（优+）", "bookSourceType": 2, "bookSourceUrl": "https://www.wn09.shop/", "customButton": false, "customOrder": 463, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[\n  {\n    \"title\": \"🔖总榜🔖\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n    },\n {\n    \"title\": \"年榜\",\n    \"url\": \"https://www.wn09.shop/albums-favorite_ranking-page-{{page}}-type-year.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },   \n  {\n    \"title\": \"月榜\",\n    \"url\": \"https://www.wn09.shop/albums-favorite_ranking-page-{{page}}-type-month.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"周榜\",\n    \"url\": \"https://www.wn09.shop/albums-favorite_ranking-page-{{page}}-type-week.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n {\n    \"title\": \"日榜\",\n    \"url\": \"https://www.wn09.shop/albums-favorite_ranking-page-{{page}}-type-day.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"🔖同人志🔖\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n    },\n {\n    \"title\": \"年榜\",\n    \"url\": \"https://www.wn09.shop/albums-favorite_ranking-page-{{page}}-type-year-cate-1.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },   \n  {\n    \"title\": \"月榜\",\n    \"url\": \"https://www.wn09.shop/albums-favorite_ranking-page-{{page}}-type-month-cate-1.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"周榜\",\n    \"url\": \"https://www.wn09.shop/albums-favorite_ranking-page-{{page}}-type-week-cate-1.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n {\n    \"title\": \"日榜\",\n    \"url\": \"https://www.wn09.shop/albums-favorite_ranking-page-{{page}}-type-day-cate-1.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"🔖单行本🔖\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n    },\n {\n    \"title\": \"年榜\",\n    \"url\": \"https://www.wn09.shop/albums-favorite_ranking-page-{{page}}-type-year-cate-9.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },   \n  {\n    \"title\": \"月榜\",\n    \"url\": \"https://www.wn09.shop/albums-favorite_ranking-page-{{page}}-type-month-cate-9.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"周榜\",\n    \"url\": \"https://www.wn09.shop/albums-favorite_ranking-page-{{page}}-type-week-cate-9.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n {\n    \"title\": \"日榜\",\n    \"url\": \"https://www.wn09.shop/albums-favorite_ranking-page-{{page}}-type-day-cate-9.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"🔖杂志&短篇🔖\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n    },\n {\n    \"title\": \"年榜\",\n    \"url\": \"https://www.wn09.shop/albums-favorite_ranking-page-{{page}}-type-year-cate-10.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },   \n  {\n    \"title\": \"月榜\",\n    \"url\": \"https://www.wn09.shop/albums-favorite_ranking-page-{{page}}-type-month-cate-10.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"周榜\",\n    \"url\": \"https://www.wn09.shop/albums-favorite_ranking-page-{{page}}-type-week-cate-10.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n {\n    \"title\": \"日榜\",\n    \"url\": \"https://www.wn09.shop/albums-favorite_ranking-page-{{page}}-type-day-cate-10.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"🔖韩漫🔖\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n    },\n {\n    \"title\": \"年榜\",\n    \"url\": \"https://www.wn09.shop/albums-favorite_ranking-page-{{page}}-type-year-cate-20.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },   \n  {\n    \"title\": \"月榜\",\n    \"url\": \"https://www.wn09.shop/albums-favorite_ranking-page-{{page}}-type-month-cate-20.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"周榜\",\n    \"url\": \"https://www.wn09.shop/albums-favorite_ranking-page-{{page}}-type-week-cate-20.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n {\n    \"title\": \"日榜\",\n    \"url\": \"https://www.wn09.shop/albums-favorite_ranking-page-{{page}}-type-day-cate-20.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  }\n]", "header": "@js:\nJSON.stringify({\n  \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36\",\n  \"Referer\": baseUrl,\n  \"Accept-Language\": \"zh-CN,zh;q=0.9\"\n})", "lastUpdateTime": "1786024314486", "respondTime": 180000, "ruleBookInfo": {"coverUrl": "//div[@class='asTB']/div[@class='asTBcell uwthumb']/img/@src##////##https://", "downloadUrls": "//div[@id='ads']/a[@class='btn']/@href", "intro": "//div[@class='asTBcell uwconn']/p/text()", "kind": "//div[@class='addtags']/a[@class='tagshow']/text()", "name": "{{book.name}}", "wordCount": "//div[@class='asTBcell uwconn']/label/text()@js:\nconst infoSplit =  result.split('\\n')\nif(infoSplit.length>0){\n infoSplit[1].split('：')[1]\n}"}, "ruleContent": {"content": "//img[@id='picarea']/@src##//##https://@js:\n\n//获取图片服务器\nvar server = result.match(/img(\\d+)/g)\n//匹配出数组，进行修复\nif(server.length>1){\nserver = server[0]\n}\n\n// 获取前缀URL，注意wnimg1可能变换\nconst regexStr = \"^https://\"+server+\"\\\\.wnimg1\\\\.ru/data/\\\\d+/\\\\d+/\";\nconst regex = new RegExp(regexStr, \"g\");\nconst prefixUrlMatch = result.match(regex);\nconst prefixUrl = prefixUrlMatch ? prefixUrlMatch[0] : \"\";\n\n// 解析图片信息数组（容错：数组为空时设为[]）\nconst imgInfoList = JSON.parse(java.get('imgInfoList') || '[]');\n\n// 拼接完整图片链接（直接使用原始imgName）\nconst imgUrlList = [];\nif (prefixUrl) {\n    imgInfoList.forEach(item => {\n        // 仅做空值容错，不修改imgName原始值\n        const imgName = item.imgName || '';\n        const imgExtension = item.imgExtension || 'jpg';\n        const fullImgUrl = prefixUrl + imgName + \".\" + imgExtension;\n        imgUrlList.push(fullImgUrl);\n    });\n}\n\n// 规则输出拼接后的img标签\nimgUrlList.map(x=>'<img src=\\\"'+x+'\\\">')\n.join(\"\\n\")", "imageStyle": "FULL"}, "ruleExplore": {"bookList": "//div[@class='gallary_wrap']/ul/li", "bookUrl": "//div[@class='info']/div[@class='title']/a/@href", "coverUrl": "//li/div[1]/a/img/@src", "intro": "//li/div[@class='info']/div[@class='info_col']/text()@js:\nvar timeStr = result.split(\"，\")[1] || \"\";\ntimeStr.trim()", "kind": "//div[@class='pic_box']/div[2]/text()@js:\nresult = Array.from(result)\n\nvar pages =java.getString(\"//li/div[@class='info']/div[@class='info_col']/text()\")\nvar imgNum = pages.split(\"，\")[0].match(/\\d+(?=張圖片)/g)[0]\nresult.push(imgNum+'P')\n\nresult ", "name": "//div[@class='info']/div[@class='title']/a//text()@js:\nconst bookname= result.split('\\n').join('').replace(/^.*?]/g, '')\nbookname"}, "ruleSearch": {"bookList": "//div[@class='gallary_wrap']/ul/li", "bookUrl": "//div[@class='info']/div[@class='title']/a/@href", "checkKeyWord": "僕にしか触れないサキュバス3姉妹に搾られる", "coverUrl": "//li/div[1]/a/img/@src", "intro": "//li/div[@class='info']/div[@class='info_col']/text()@js:\nvar timeStr = result.split(\"，\")[1] || \"\";\ntimeStr.trim()", "kind": "//li/div[1]/@class@js:\nif (result[0].indexOf('cate-1') !== -1) { \n    '同人志/汉化'\n} else if (result[0].indexOf('cate-12') !== -1) {\n    '同人志/日语'\n} else if (result[0].indexOf('cate-9') !== -1) {\n    '单行本/汉化'\n} else if (result[0].indexOf('cate-13') !== -1) {\n    '单行本/日语'\n} else if (result[0].indexOf('cate-10') !== -1) {\n    '杂志&短篇/汉化'\n} else if (result[0].indexOf('cate-14') !== -1) {\n    '杂志&短篇/日语'\n} else if (result[0].indexOf('cate-18') !== -1) {\n     '杂志&短篇/English'\n} else if (result[0].indexOf('cate-20') !== -1) {\n    '韩漫/汉化'\n} else if (result[0].indexOf('cate-21') !== -1) {\n    '韩漫/生肉'\n} ", "name": "//div[@class='info']/div[@class='title']/a//text()@js:\nconst bookname= result.split('\\n').join('').replace(/^.*?]/g, '')\nbookname", "wordCount": "@js:\nvar pages =java.getString(\"//li/div[@class='info']/div[@class='info_col']/text()\")\nvar imgNum = pages.split(\"，\")[0].match(/\\d+(?=張圖片)/g)[0]\nimgNum+'P'"}, "ruleToc": {"chapterList": "//div[@class='gallary_wrap tb']/ul/li[1]@js:\nvar imgInfoList = [];\nvar nextPageUrl = [];\n\n// === 生成完整分页列表 ===\n\n// 1. 获取分页区的所有链接字符串\nvar paginatorHrefs = java.getString(\"//div[@class='f_left paginator']//a/@href\") || \"\";\n\n// 2. 初始化变量\nvar maxPage = 1;\nvar aid = \"\";\nvar urlPattern = /page-(\\d+)-aid-(\\d+)/; // 匹配 page-数字-aid-数字\n\n// 3. 遍历链接找到“最大页码”和“相册ID”\n// 分割字符串并过滤空行\nvar links = paginatorHrefs.split('\\n');\nfor (var i = 0; i < links.length; i++) {\n    var link = links[i].trim();\n    var match = link.match(urlPattern);\n    \n    if (match) {\n        var pageNum = parseInt(match[1]); // 提取页码\n        var currentAid = match[2];        // 提取AID\n        \n        // 更新最大页码\n        if (pageNum > maxPage) {\n            maxPage = pageNum;\n        }\n        // 提取AID（如果还没提取到）\n        if (!aid) {\n            aid = currentAid;\n        }\n    }\n}\n\n// 4. 根据获取到的 maxPage 和 aid 生成完整的 URL 列表\nif (aid && maxPage > 1) {\n    for (var i = 1; i <= maxPage; i++) {\n        // 拼接标准URL格式：photos-index-page-{页码}-aid-{ID}.html\n        nextPageUrl.push(\"https://www.wn09.shop/photos-index-page-\" + i + \"-aid-\" + aid + \".html\");\n    }\n} else {\n    // 如果没有找到分页（只有一页的情况），直接使用当前页面\n    nextPageUrl.push(baseUrl);\n}\n\n// 2. 核心工具函数：预处理HTML（移除注释+清理空格）\nfunction cleanHtml(html) {\n    if (!html) return \"\";\n    // 步骤1：移除所有HTML注释（<!-- ... -->），彻底消除干扰\n    html = html.replace(/<!--[\\s\\S]*?-->/g, \"\");\n    // 步骤2：移除多余空白字符（换行、制表符等），简化匹配\n    html = html.replace(/\\s+/g, \" \");\n    return html;\n}\n\n// 3. 核心工具函数：提取单页的“序号数组”和“图片src数组”\nfunction extractPageData(cleanedHtml) {\n    var names = []; // 序号数组（001、002、003...）\n    var srcs = [];  // 图片src数组（与序号一一对应）\n\n    // 提取所有序号（<span class=\"name tb\">xxx</span>）\n    var nameRegex = /<span class=\"name tb\">([\\d]+)<\\/span>/g;\n    var nameMatch;\n    while ((nameMatch = nameRegex.exec(cleanedHtml)) !== null) {\n        names.push(nameMatch[1]);\n    }\n\n    // 提取所有有效图片src（与序号对应的img，alt包含“_序号”）\n    var srcRegex = /<img src=\"([^\"]+)\" alt=\"[^\"]+_([\\d]+)\"/g;\n    var srcMatch;\n    while ((srcMatch = srcRegex.exec(cleanedHtml)) !== null) {\n        // 确保src对应的序号在names数组中（避免无关图片）\n        if (names.includes(srcMatch[2])) {\n            srcs.push(srcMatch[1]);\n        }\n    }\n\n    return { names: names, srcs: srcs };\n}\n\n// 4. 执行多页提取\ntry {\n    for (var p = 0; p < nextPageUrl.length; p++) {\n        var pageUrl = nextPageUrl[p];\n        var pageNum = p + 1;\n\n        // 步骤1：获取并清理HTML（移除注释+多余空格）\n        var rawHtml = new String(java.ajax(pageUrl)) || \"\";\n        var cleanedHtml = cleanHtml(rawHtml);\n\n        // 步骤2：提取当前页的序号和src数组\n        var pageData = extractPageData(cleanedHtml);\n        var pageNames = pageData.names;\n        var pageSrcs = pageData.srcs;\n\n        // 步骤3：按索引配对（序号和src一一对应），避免漏配\n        var addedNum = 0;\n        for (var i = 0; i < pageNames.length; i++) {\n            var imgName = pageNames[i];\n            var imgSrc = pageSrcs[i] || \"\";\n            var imgExtension = \"\";\n\n            // 提取扩展名\n            if (imgSrc) {\n                var dotIndex = imgSrc.lastIndexOf(\".\");\n                if (dotIndex !== -1) {\n                    imgExtension = imgSrc.slice(dotIndex + 1).toLowerCase().split(/[?#]/)[0];\n                }\n            }\n\n            // 去重并添加到数组\n            if (imgName && imgExtension && !imgInfoList.some(item => item.imgName === imgName)) {\n                imgInfoList.push({ imgName: imgName, imgExtension: imgExtension });\n                addedNum++;\n            }\n        }\n\n    }\n} catch (e) {\n    java.log(\"提取报错：\" + e.message);\n}\n\nimgInfoList.sort((a, b) => parseInt(a.imgName) - parseInt(b.imgName));\n\n// 返回原结果，不影响目录列表\njava.put('imgInfoList',JSON.stringify(imgInfoList))\nresult;", "chapterName": "//li/text()@js:'全话阅读'", "chapterUrl": "//li//a/@href##$##{\"webView\":true}", "updateTime": "//li/div[@class='info']/div[@class='info_col']/text()"}, "searchUrl": "https://www.wn09.shop//search/?q={{key}}&f=_all&s=create_time_DESC&syn=yes&p={{page}}", "weight": 100},{"bookSourceComment": "漫画发布页：https://wn01.link/\n1️⃣免翻直连，网站失效自行在发布页寻找可用域名全局替换即可\n2️⃣若不行可尝试更换网络环境，中国移动等可能将其屏蔽\n3️⃣还不行就翻墙看", "bookSourceGroup": "R18", "bookSourceName": "🌸绅士漫画（优+）", "bookSourceType": 2, "bookSourceUrl": "https://www.wn09.shop/", "customButton": false, "customOrder": 463, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[\n  {\n    \"title\": \"🔖排行🔖\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n    },\n  {\n    \"title\": \"月榜\",\n    \"url\": \"https://www.wn09.shop/albums-favorite_ranking-page-{{page}}-type-month.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"周榜\",\n    \"url\": \"https://www.wn09.shop/albums-favorite_ranking-page-{{page}}-type-week.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n {\n    \"title\": \"日榜\",\n    \"url\": \"https://www.wn09.shop/albums-favorite_ranking-page-{{page}}-type-day.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n    {\n    \"title\": \"🔖同人志🔖\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n    },\n  {\n    \"title\": \"创建时间\",\n    \"url\": \"https://www.wn09.shop/albums-index-page-{{page}}-cate-1.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"上传时间\",\n    \"url\": \"https://www.wn09.shop/albums-index-page-{{page}}-cate-1.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n {\n    \"title\": \"图片数\",\n    \"url\": \"https://www.wn09.shop/albums-index-page-{{page}}-cate-1.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"🔖韩漫🔖\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n    },\n  {\n    \"title\": \"创建时间\",\n    \"url\": \"https://www.wn09.shop/albums-index-page-{{page}}-cate-20.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"上传时间\",\n    \"url\": \"https://www.wn09.shop/albums-index-page-{{page}}-cate-20.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n {\n    \"title\": \"图片数\",\n    \"url\": \"https://www.wn09.shop/albums-index-page-{{page}}-cate-20.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n\n  {\n    \"title\": \"🔖单行本🔖\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n    },\n  {\n    \"title\": \"创建时间\",\n    \"url\": \"https://www.wn09.shop/albums-index-page-{{page}}-cate-9.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"上传时间\",\n    \"url\": \"https://www.wn09.shop/albums-index-page-{{page}}-cate-9.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n {\n    \"title\": \"图片数\",\n    \"url\": \"https://www.wn09.shop/albums-index-page-{{page}}-cate-9.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"🔖杂志&短篇🔖\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n    },\n  {\n    \"title\": \"创建时间\",\n    \"url\": \"https://www.wn09.shop/albums-index-page-{{page}}-cate-10.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"上传时间\",\n    \"url\": \"https://www.wn09.shop/albums-index-page-{{page}}-cate-10.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n {\n    \"title\": \"图片数\",\n    \"url\": \"https://www.wn09.shop/albums-index-page-{{page}}-cate-10.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  }\n]", "header": "@js:\nJSON.stringify({\n  \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36\",\n  \"Referer\": baseUrl,\n  \"Accept-Language\": \"zh-CN,zh;q=0.9\"\n})", "lastUpdateTime": "1786019007454", "respondTime": 180000, "ruleBookInfo": {"coverUrl": "//div[@class='asTB']/div[@class='asTBcell uwthumb']/img/@src##////##https://", "downloadUrls": "//div[@id='ads']/a[1]/@href", "intro": "//div[@class='asTBcell uwconn']/p/text()@js:result.split('\\n').join('')", "kind": "//div[@class='addtags']/a[@class='tagshow']/text()", "wordCount": "//div[@class='asTBcell uwconn']/label/text()@js:\nconst infoSplit =  result.split('\\n')\nconst info = []\nfor(var i  = 0;i<infoSplit .length;i++){\ninfo.push(infoSplit[i].split('：')[1])\n}\ninfo.join('  ')"}, "ruleContent": {"content": "//span[@id='imgarea']/a/img/@src##//##https://@js:\n\n//获取图片服务器\nvar server = result.match(/img(\\d+)/g)\n//匹配出数组，进行修复\nif(server.length>1){\nserver = server[0]\n}\n\n// 获取前缀URL，注意wnimg1可能变换\nconst regexStr = \"^https://\"+server+\"\\\\.wnimg1\\\\.ru/data/\\\\d+/\\\\d+/\";\nconst regex = new RegExp(regexStr, \"g\");\nconst prefixUrlMatch = result.match(regex);\nconst prefixUrl = prefixUrlMatch ? prefixUrlMatch[0] : \"\";\n\n// 解析图片信息数组（容错：数组为空时设为[]）\nconst imgInfoList = JSON.parse(java.get('imgInfoList') || '[]');\n\n// 拼接完整图片链接（直接使用原始imgName）\nconst imgUrlList = [];\nif (prefixUrl) {\n    imgInfoList.forEach(item => {\n        // 仅做空值容错，不修改imgName原始值\n        const imgName = item.imgName || '';\n        const imgExtension = item.imgExtension || 'jpg';\n        const fullImgUrl = prefixUrl + imgName + \".\" + imgExtension;\n        imgUrlList.push(fullImgUrl);\n    });\n}\n\n// 规则输出拼接后的img标签\nimgUrlList.map(x=>'<img src=\\\"'+x+'\\\">')\n.join(\"\\n\")", "imageStyle": "FULL"}, "ruleExplore": {"bookList": "//div[@class='gallary_wrap']/ul/li", "bookUrl": "//div[@class='info']/div[@class='title']/a/@href,{\"webView\":true}", "coverUrl": "//li/div[1]/a/img/@src", "kind": "//div[@class='pic_box']/div[2]/text()|//div[@class='info']/div[@class='info_col']/text()", "name": "//div[@class='info']/div[@class='title']/a//text()@js:\nconst bookname= result.split('\\n').join('').replace(/^.*?]/g, '')\nbookname"}, "ruleSearch": {"bookList": "//div[@class='gallary_wrap']/ul/li", "bookUrl": "//div[@class='info']/div[@class='title']/a/@href,{\"webView\":true}", "checkKeyWord": "僕にしか触れないサキュバス3姉妹に搾られる", "coverUrl": "//li/div[1]/a/img/@src", "intro": "//li/div[@class='info']/div[@class='info_col']/text()@js:\nvar timeStr = result.split(\"，\")[1] || \"\";\nvar updateTime = timeStr.match(/創建於(\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2})/)?.[1] || \"无时间\";\n'更新时间:  ' + updateTime;", "kind": "//li/div[1]/@class@js:\nvar pages =java.getString(\"//li/div[@class='info']/div[@class='info_col']/text()\")\nvar imgNum = pages.split(\"，\")[0].match(/\\d+(?=張圖片)/g)[0]\nif (result[0].indexOf('cate-1') !== -1) { \n    '绅士漫画,同人志/汉化,'+imgNum+'页';\n} else if (result[0].indexOf('cate-12') !== -1) {\n    '绅士漫画,同人志/日语,'+imgNum+'页'; \n} else if (result[0].indexOf('cate-9') !== -1) {\n    '绅士漫画,单行本/汉化,'+imgNum+'页';\n} else if (result[0].indexOf('cate-13') !== -1) {\n    '绅士漫画,单行本/日语,'+imgNum+'页';\n} else if (result[0].indexOf('cate-10') !== -1) {\n    '绅士漫画,杂志&短篇/汉化,'+imgNum+'页';\n} else if (result[0].indexOf('cate-14') !== -1) {\n    '绅士漫画,杂志&短篇/日语,'+imgNum+'页';\n} else if (result[0].indexOf('cate-18') !== -1) {\n     '绅士漫画,杂志&短篇/English,'+imgNum+'页';\n} else if (result[0].indexOf('cate-20') !== -1) {\n    '绅士漫画,韩漫/汉化,'+imgNum+'页';\n} else if (result[0].indexOf('cate-21') !== -1) {\n    '绅士漫画,韩漫/生肉,'+imgNum+'页';\n} else {\n    '绅士漫画,'+imgNum+'页'; \n}", "name": "//div[@class='info']/div[@class='title']/a//text()@js:\nconst bookname= result.split('\\n').join('').replace(/^.*?]/g, '')\nbookname"}, "ruleToc": {"chapterList": "//div[@class='gallary_wrap tb']/ul/li[1]@js:\nvar imgInfoList = [];\nvar nextPageUrl = [];\n\n\n// === 生成完整分页列表 ===\n\n// 1. 获取分页区的所有链接字符串\nvar paginatorHrefs = java.getString(\"//div[@class='f_left paginator']//a/@href\") || \"\";\n\n// 2. 初始化变量\nvar maxPage = 1;\nvar aid = \"\";\nvar urlPattern = /page-(\\d+)-aid-(\\d+)/; // 匹配 page-数字-aid-数字\n\n// 3. 遍历链接找到“最大页码”和“相册ID”\n// 分割字符串并过滤空行\nvar links = paginatorHrefs.split('\\n');\nfor (var i = 0; i < links.length; i++) {\n    var link = links[i].trim();\n    var match = link.match(urlPattern);\n    \n    if (match) {\n        var pageNum = parseInt(match[1]); // 提取页码\n        var currentAid = match[2];        // 提取AID\n        \n        // 更新最大页码\n        if (pageNum > maxPage) {\n            maxPage = pageNum;\n        }\n        // 提取AID（如果还没提取到）\n        if (!aid) {\n            aid = currentAid;\n        }\n    }\n}\n\n// 4. 根据获取到的 maxPage 和 aid 生成完整的 URL 列表\nif (aid && maxPage > 1) {\n    for (var i = 1; i <= maxPage; i++) {\n        // 拼接标准URL格式：photos-index-page-{页码}-aid-{ID}.html\n        nextPageUrl.push(\"https://www.wn09.shop/photos-index-page-\" + i + \"-aid-\" + aid + \".html\");\n    }\n} else {\n    // 如果没有找到分页（只有一页的情况），直接使用当前页面\n    nextPageUrl.push(baseUrl);\n}\n\n// 2. 核心工具函数：预处理HTML（移除注释+清理空格）\nfunction cleanHtml(html) {\n    if (!html) return \"\";\n    // 步骤1：移除所有HTML注释（<!-- ... -->），彻底消除干扰\n    html = html.replace(/<!--[\\s\\S]*?-->/g, \"\");\n    // 步骤2：移除多余空白字符（换行、制表符等），简化匹配\n    html = html.replace(/\\s+/g, \" \");\n    return html;\n}\n\n// 3. 核心工具函数：提取单页的“序号数组”和“图片src数组”\nfunction extractPageData(cleanedHtml) {\n    var names = []; // 序号数组（001、002、003...）\n    var srcs = [];  // 图片src数组（与序号一一对应）\n\n    // 提取所有序号（<span class=\"name tb\">xxx</span>）\n    var nameRegex = /<span class=\"name tb\">([\\d]+)<\\/span>/g;\n    var nameMatch;\n    while ((nameMatch = nameRegex.exec(cleanedHtml)) !== null) {\n        names.push(nameMatch[1]);\n    }\n\n    // 提取所有有效图片src（与序号对应的img，alt包含“_序号”）\n    var srcRegex = /<img src=\"([^\"]+)\" alt=\"[^\"]+_([\\d]+)\"/g;\n    var srcMatch;\n    while ((srcMatch = srcRegex.exec(cleanedHtml)) !== null) {\n        // 确保src对应的序号在names数组中（避免无关图片）\n        if (names.includes(srcMatch[2])) {\n            srcs.push(srcMatch[1]);\n        }\n    }\n\n    return { names: names, srcs: srcs };\n}\n\n// 4. 执行多页提取\ntry {\n    for (var p = 0; p < nextPageUrl.length; p++) {\n        var pageUrl = nextPageUrl[p];\n        var pageNum = p + 1;\n\n        // 步骤1：获取并清理HTML（移除注释+多余空格）\n        var rawHtml = new String(java.ajax(pageUrl)) || \"\";\n        var cleanedHtml = cleanHtml(rawHtml);\n\n        // 步骤2：提取当前页的序号和src数组\n        var pageData = extractPageData(cleanedHtml);\n        var pageNames = pageData.names;\n        var pageSrcs = pageData.srcs;\n\n        // 步骤3：按索引配对（序号和src一一对应），避免漏配\n        var addedNum = 0;\n        for (var i = 0; i < pageNames.length; i++) {\n            var imgName = pageNames[i];\n            var imgSrc = pageSrcs[i] || \"\";\n            var imgExtension = \"\";\n\n            // 提取扩展名\n            if (imgSrc) {\n                var dotIndex = imgSrc.lastIndexOf(\".\");\n                if (dotIndex !== -1) {\n                    imgExtension = imgSrc.slice(dotIndex + 1).toLowerCase().split(/[?#]/)[0];\n                }\n            }\n\n            // 去重并添加到数组\n            if (imgName && imgExtension && !imgInfoList.some(item => item.imgName === imgName)) {\n                imgInfoList.push({ imgName: imgName, imgExtension: imgExtension });\n                addedNum++;\n            }\n        }\n\n    }\n} catch (e) {\n    java.log(\"提取报错：\" + e.message);\n}\n\nimgInfoList.sort((a, b) => parseInt(a.imgName) - parseInt(b.imgName));\n\n// 返回原结果，不影响目录列表\njava.put('imgInfoList',JSON.stringify(imgInfoList))\nresult;", "chapterName": "//li/text()@js:'全话阅读'", "chapterUrl": "//li//a/@href,{\"webView\":true}", "updateTime": "//li/div[@class='info']/div[@class='info_col']/text()"}, "searchUrl": "https://www.wn09.shop//search/?q={{key}}&f=_all&s=create_time_DESC&syn=yes", "weight": 100},{"bookSourceComment": "调出真实浏览器过人机验证", "bookSourceGroup": "AI", "bookSourceName": "kk笔趣阁新站", "bookSourceType": 0, "bookSourceUrl": "http://www.kkbiquge.net", "bookUrlPattern": "http://www.kkbiquge.net/\\d+_\\d+/", "customOrder": 1, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "exploreUrl": "玄幻::/class/xuanhuanmofa/{{page}}/\n仙侠::/class/xianxiaxiuzhen/{{page}}/\n都市::/class/dushuyanqing/{{page}}/\n历史::/class/lishijunshi/{{page}}/\n网游::/class/wangyoudongman/{{page}}/\n科幻::/class/kehuanxiaoshuo/{{page}}/\n女生::/class/nvshengxiaoshuo/{{page}}/\n其他::/class/qitaxiaoshuo/{{page}}/", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 14; Pixel 8 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/126.0.0.0 Mobile Safari/537.36\",\n  \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\n  \"Accept-Language\": \"zh-CN,zh;q=0.9\"\n}", "lastUpdateTime": "1785949328842", "loginCheckJs": "var src = result.body();\nif (/<script>\\s*window/i.test(src)) {\n    cookie.removeCookie(source.bookSourceUrl);\n    java.toast('需要先访问首页获取验证');\n    java.startBrowserAwait(source.bookSourceUrl, '请等待加载完成后返回');\n    result = java.connect(result.url());\n}\nresult;", "loginUrl": "http://www.kkbiquge.net/", "respondTime": 180000, "ruleBookInfo": {"author": "#info p a@text", "coverUrl": "img[data-original]@data-original||#fmimg img@src", "intro": "#intro@text", "kind": "p.sort@text##类别：|\\s*", "lastChapter": "#info a[rel=\"chapter\"]@text", "name": "#info h1@text"}, "ruleContent": {"content": "#chaptercontent #booktxt@html##<p[^>]*>\\s*</p>", "nextContentUrl": "a#next_url@href"}, "ruleExplore": {"author": "div.btm a@text", "bookList": "div.item", "bookUrl": "dt a@href", "coverUrl": "img@data-original||img@src", "intro": "dd@text", "name": "dt a@text"}, "ruleSearch": {"author": "div.btm a@text", "bookList": "div.item", "bookUrl": "dt a@href", "coverUrl": "img@data-original||img@src", "intro": "dd@text", "name": "dt a@text", "wordCount": "div.btm em.orange@text"}, "ruleToc": {"chapterList": "#list dl a[href]", "chapterName": "dd@text", "chapterUrl": "@href"}, "searchUrl": "{{url=source.getKey();\ncookie.removeCookie(url);}}{{(function(){\n    var baseUrl = 'http://www.kkbiquge.net';\n    var html = java.ajax(baseUrl + '/');\n    var match = html.match(/<form[^>]*id=\"search\"[^>]*action=\"([^\"]+)\"/);\n    var action = match ? match[1] : '/search21.html';\n    return baseUrl + action + '?searchkey=' + java.encodeURI(key);\n})()}}", "weight": 0},{"bookSourceComment": "沱书·文存 - 完整版，支持搜索、详情、目录、正文\n\n2026.8.3\n原作者absolutely-thats-right\n修复了搜索和目录获取，同时添加了发现 by狼崽儿", "bookSourceGroup": "小说", "bookSourceName": "沱书·文存", "bookSourceType": 0, "bookSourceUrl": "https://tuoverse.com", "bookUrlPattern": "", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "甜宠::https://tuoverse.com/category/tian-chong/\n情有独钟::https://tuoverse.com/category/qing-you-du-zhong/\n天作之合::https://tuoverse.com/category/tian-zuo-zhi-he/\n欢喜冤家::https://tuoverse.com/category/huan-xi-yuan-jia/\n破镜重圆::https://tuoverse.com/category/po-jing-chong-yuan/\n先婚后爱::https://tuoverse.com/category/xian-hun-hou-ai/\n青梅竹马::https://tuoverse.com/category/qing-mei-zhu-ma/\n相爱相杀::https://tuoverse.com/category/xiang-ai-xiang-sha/\n虐恋情深::https://tuoverse.com/category/nve-lian-qing-shen/\n近水楼台::https://tuoverse.com/category/jin-shui-lou-tai/\n追妻火葬场::https://tuoverse.com/category/zhui-qi-huo-zang-chang/\n强取豪夺::https://tuoverse.com/category/qiang-qu-hao-duo/\n前世今生::https://tuoverse.com/category/qian-shi-jin-sheng/\n暗恋::https://tuoverse.com/category/an-lian/\n因缘邂逅::https://tuoverse.com/category/yin-yuan-xie-hou/\n阴差阳错::https://tuoverse.com/category/yin-cha-yang-cuo/\n婚恋::https://tuoverse.com/category/hun-lian/\n不伦之恋::https://tuoverse.com/category/bu-lun-zhi-lian/\n恋爱合约::https://tuoverse.com/category/lian-ai-he-yue/\n西方罗曼::https://tuoverse.com/category/xi-fang-luo-man/\n女追男::https://tuoverse.com/category/nv-zhui-nan/\n强强::https://tuoverse.com/category/qiang-qiang/\n主受::https://tuoverse.com/category/zhu-shou/\n天之骄子::https://tuoverse.com/category/tian-zhi-jiao-zi/\n无CP::https://tuoverse.com/category/wu/\n年下::https://tuoverse.com/category/nian-xia/\n生子::https://tuoverse.com/category/sheng-zi/\nABO::https://tuoverse.com/category/abo/\n业界精英::https://tuoverse.com/category/ye-jie-jing-ying/\n美强惨::https://tuoverse.com/category/mei-qiang-can/\n萌宠::https://tuoverse.com/category/meng-chong/\n万人迷::https://tuoverse.com/category/wan-ren-mi/\n主攻::https://tuoverse.com/category/zhu-gong/\n女强::https://tuoverse.com/category/nv-qiang/\n攻受不明::https://tuoverse.com/category/gong-shou-bu-ming/\n钓系::https://tuoverse.com/category/diao-xi/\n忠犬::https://tuoverse.com/category/zhong-quan/\n高岭之花::https://tuoverse.com/category/gao-ling-zhi-hua/\n互攻::https://tuoverse.com/category/hu-gong/\n乔装改扮::https://tuoverse.com/category/qiao-zhuang-gai-ban/\n女扮男装::https://tuoverse.com/category/nv-ban-nan-zhuang/\n腹黑::https://tuoverse.com/category/fu-hei/\n白月光::https://tuoverse.com/category/bai-yue-guang/\n病娇::https://tuoverse.com/category/bing-jiao/\n团宠::https://tuoverse.com/category/tuan-chong/\n性别转换::https://tuoverse.com/category/xing-bie-zhuan-huan/\n群像::https://tuoverse.com/category/qun-xiang/\n大叔文::https://tuoverse.com/category/da-shu-wen/\n替身::https://tuoverse.com/category/ti-shen/\n养娃文::https://tuoverse.com/category/yang-wa/\n糙汉文::https://tuoverse.com/category/cao-han/\n师徒文::https://tuoverse.com/category/shi-tu/\n系统::https://tuoverse.com/category/xi-tong/\n穿书::https://tuoverse.com/category/chuan-shu/\n穿越::https://tuoverse.com/category/chuan-yue/\n重生::https://tuoverse.com/category/chong-sheng/\n快穿::https://tuoverse.com/category/kuai-chuan/\n空间文::https://tuoverse.com/category/kong-jian/\n无限流::https://tuoverse.com/category/wu-xian-liu/\n灵魂转换::https://tuoverse.com/category/ling-hun-zhuan-huan/\n异能::https://tuoverse.com/category/yi-neng/\n升级流::https://tuoverse.com/category/sheng-ji-liu/\n清穿::https://tuoverse.com/category/qing-chuan/\n古穿今::https://tuoverse.com/category/gu-chuan-jin/\n女配::https://tuoverse.com/category/nv-pei/\n读心::https://tuoverse.com/category/du-xin/\n炮灰::https://tuoverse.com/category/pao-hui/\n失忆梗::https://tuoverse.com/category/shi-yi-geng/\n双重生::https://tuoverse.com/category/shuang-chong-sheng/\n大冒险::https://tuoverse.com/category/da-mao-xian/\n玄幻::https://tuoverse.com/category/xuan-huan/\n灵异::https://tuoverse.com/category/ling-yi/\n幻想空间::https://tuoverse.com/category/huan-xiang-kong-jian/\n星际::https://tuoverse.com/category/xing-ji/\n修真::https://tuoverse.com/category/xiu-zhen/\n仙侠::https://tuoverse.com/category/xian-xia/\n末世::https://tuoverse.com/category/mo-shi/\n异世大陆::https://tuoverse.com/category/yi-shi-da-lu/\n未来架空::https://tuoverse.com/category/wei-lai-jia-kong/\n科幻::https://tuoverse.com/category/ke-huan/\n奇幻::https://tuoverse.com/category/qi-huan/\n西幻::https://tuoverse.com/category/xi-huan/\n玄学::https://tuoverse.com/category/xuan-xue/\n机甲::https://tuoverse.com/category/ji-jia/\n惊悚::https://tuoverse.com/category/jing-song/\n虫族::https://tuoverse.com/category/chong-zu/\n恐怖::https://tuoverse.com/category/kong-bu/\n都市异闻::https://tuoverse.com/category/du-shi-yi-wen/\n废土::https://tuoverse.com/category/fei-tu/\n洪荒::https://tuoverse.com/category/hong-huang/\n血族::https://tuoverse.com/category/xue-zu/\n古代幻想::https://tuoverse.com/category/gu-dai-huan-xiang/\n位面::https://tuoverse.com/category/wei-mian/\n朝堂权谋::https://tuoverse.com/category/chao-tang-quan-mou/\n豪门::https://tuoverse.com/category/hao-men/\n娱乐圈::https://tuoverse.com/category/yu-le-quan/\n都市::https://tuoverse.com/category/du-shi/\n现代::https://tuoverse.com/category/xian-dai/\n宫廷侯爵::https://tuoverse.com/category/gong-ting-hou-jue/\n古言::https://tuoverse.com/category/gu-yan/\n校园::https://tuoverse.com/category/xiao-yuan/\n架空::https://tuoverse.com/category/jia-kong/\n年代文::https://tuoverse.com/category/nian-dai/\n江湖恩怨::https://tuoverse.com/category/jiang-hu-en-yuan/\n古代::https://tuoverse.com/category/gu-dai/\n黑帮情仇::https://tuoverse.com/category/hei-bang-qing-chou/\n历史::https://tuoverse.com/category/li-shi/\n市井生活::https://tuoverse.com/category/bu-yi-sheng-huo/\n宫斗::https://tuoverse.com/category/gong-dou/\n武侠::https://tuoverse.com/category/wu-xia/\n宅斗::https://tuoverse.com/category/zhai-dou/\n民国::https://tuoverse.com/category/min-guo/\n乡村爱情::https://tuoverse.com/category/xiang-cun-ai-qing/\n港风文::https://tuoverse.com/category/gang-feng-wen/\n公路文::https://tuoverse.com/category/gong-lu/\n高干::https://tuoverse.com/category/gao-gan/\n网红::https://tuoverse.com/category/wang-hong/\n种田文::https://tuoverse.com/category/zhong-tian/\n基建::https://tuoverse.com/category/ji-jian/\n美食::https://tuoverse.com/category/mei-shi/\n游戏网游::https://tuoverse.com/category/you-xi-wang-you/\n悬疑推理::https://tuoverse.com/category/xuan-yi-tui-li/\n竞技::https://tuoverse.com/category/jing-ji/\n直播::https://tuoverse.com/category/zhi-bo/\n科举::https://tuoverse.com/category/ke-ju/\n刑侦::https://tuoverse.com/category/xing-zhen/\n电竞::https://tuoverse.com/category/dian-jing/\n足球::https://tuoverse.com/category/zu-qiu/\n军旅::https://tuoverse.com/category/jun-lv/\n职场::https://tuoverse.com/category/zhi-chang/\n商战::https://tuoverse.com/category/shang-zhan/\n体育竞技::https://tuoverse.com/category/ti-yu-jing-ji/\n经营::https://tuoverse.com/category/jing-ying/\n同人::https://tuoverse.com/category/tong-ren/\n少年漫::https://tuoverse.com/category/shao-nian-man/\n柯南::https://tuoverse.com/category/ke-nan/\n咒回::https://tuoverse.com/category/zhou-hui/\n文野::https://tuoverse.com/category/wen-ye/\n综漫::https://tuoverse.com/category/zong-man/\n综英美::https://tuoverse.com/category/zong-ying-mei/\nhp同人::https://tuoverse.com/category/tong-ren-2/\n火影::https://tuoverse.com/category/huo-ying/\n综武侠::https://tuoverse.com/category/zong-wu-xia/\n猎人::https://tuoverse.com/category/lie-ren/\n原神同人::https://tuoverse.com/category/yuan-shen-tong-ren/\n古典名著::https://tuoverse.com/category/gu-dian-ming-zhu/", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\"\n}", "lastUpdateTime": "1785770601570", "loginUrl": "", "respondTime": 180000, "ruleBookInfo": {"author": "@css:.detail-author a@text", "coverUrl": "", "intro": "@css:.description-content@text", "kind": "@css:.category-tag@text", "lastChapter": "@css:.latest-link@text", "name": "@css:.detail-title@text", "tocUrl": "", "wordCount": "@css:.detail-meta@text"}, "ruleContent": {"content": "@css:.chapter-text p@textNodes", "nextContentUrl": "", "webJs": ""}, "ruleExplore": {"author": ".novel-row-author@text", "bookList": "article.novel-row", "bookUrl": ".novel-row-title a@href", "intro": ".novel-row-desc@text", "kind": ".novel-row-tags a@text&&", "name": ".novel-row-title a@text"}, "ruleSearch": {"author": "@css:.author-name@text", "bookList": "@css:.novel-card", "bookUrl": "@css:.novel-title a@href", "coverUrl": "", "intro": "@css:.novel-description@text", "kind": "@css:.category-tag@text", "lastChapter": "@css:.latest-link@text", "name": "@css:.novel-title a@text", "wordCount": "@css:.word-count@text"}, "ruleToc": {"chapterList": ".page-list__cell", "chapterName": ".page-list__num@text", "chapterUrl": "href", "nextTocUrl": "", "updateTime": ""}, "searchUrl": "/search/?q={{key}}&page={{page}},{\"webView\":true}", "weight": 0},{"bookSourceComment": "", "bookSourceGroup": "漫画书源", "bookSourceName": "武芊漫画（优+）", "bookSourceType": 2, "bookSourceUrl": "https://comic.mkzcdn.com", "customButton": false, "customOrder": 623, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nlet url = 'https://comic.mkzcdn.com/search/filter/?audience=0&order=sort&page_num={{page}}&page_size=18&theme_id=class'\nlet class_name=\"全部&修真&霸总&恋爱&校园&冒险&搞笑&生活&热血&架空&后宫&玄幻&悬疑&恐怖&灵异&动作&科幻&战争&古风&穿越&竞技&励志&同人&真人\".split(\"&\");\nlet class_url=\"0&2&1&3&4&5&6&7&8&9&10&12&13&14&15&16&17&18&19&20&21&23&24&26\".split(\"&\")\n\nlet sort_name='推荐&最热&最新'.split(\"&\")\nlet sort_url='3&1&2'.split(\"&\")\nlet model = (title,url,num)=>{\n    return {title:title,url:url,style:{layout_flexGrow:1,layout_flexBasisPercent:num}}\n}\n\ntop=[{\"title\":\"热门人气\",\"url\":\"https://comic.mkzcdn.com/search/filter/?order=1&page_num={{page}}&page_size=12\",\"style\":{\"layout_flexBasisPercent\":0.4,\"layout_flexGrow\":1}},\n{\"title\":\"更新时间\",\"url\":\"https://comic.mkzcdn.com/search/filter/?order=2&page_num={{page}}&page_size=12\",\"style\":{\"layout_flexBasisPercent\":0.4,\"layout_flexGrow\":1}}]\n\nlet list = []\nlist=list.concat(top)\n\nfor (let i = 0; i < sort_name.length; i++) {\n    list.push(model(\"══ \" + sort_name[i] + \" ══\",\"\",1))\n    for (let j = 0; j < class_name.length; j++) {\n        let t = url.replace(\"sort\",`${sort_url[i]}`).replace(\"class\",`${class_url[j]}`)\n        list.push(model(class_name[j],t,0.2))\n    }\n}\nJSON.stringify(list)", "lastUpdateTime": "1785691709352", "respondTime": 5043, "ruleBookInfo": {"intro": "$..content##^##<br/>", "kind": "$..theme_id\n@js:\nlet class_name=\"全部&修真&霸总&恋爱&校园&冒险&搞笑&生活&热血&架空&后宫&玄幻&悬疑&恐怖&灵异&动作&科幻&战争&古风&穿越&竞技&励志&同人&真人\".split(\"&\");\nlet class_url=\"0&2&1&3&4&5&6&7&8&9&10&12&13&14&15&16&17&18&19&20&21&23&24&26\".split(\"&\");\nlet map = {};\nfor(let i=0; i<class_url.length; i++){\n    map[class_url[i]] = class_name[i];\n}\nlet res = result.toString().replace(/\\[|\\]/g, '').split(/[,\\s]+/);\nlet tags = [];\nfor(let i=0; i<res.length; i++){\n    let id = res[i].trim();\n    if(map[id] && map[id] !== \"全部\"){\n        tags.push(map[id]);\n    }\n}\nArray.from(new Set(tags)).join(\" \");", "name": "@put:{comic_id:$..comic_id}", "tocUrl": "https://comic.mkzcdn.com/chapter/v1/?comic_id={{$..comic_id}}"}, "ruleContent": {"content": "$.data[*].image\n@js:\nresult.split(\"\\n\").map(x=>'<img src=\"'+x+'\">').join(\"\\n\")"}, "ruleExplore": [], "ruleSearch": {"author": "$.author_title", "bookList": "$..list[*]", "bookUrl": "https://comic.mkzcdn.com/comic/info/?comic_id={{$.comic_id}}", "coverUrl": "$.cover", "intro": "$.feature", "lastChapter": "$.chapter_title", "name": "$.title"}, "ruleToc": {"chapterList": "$.data", "chapterName": "$.title", "chapterUrl": "https://comic.mkzcdn.com/chapter/content/?chapter_id={{$.chapter_id}}&comic_id=@get:{comic_id}", "updateTime": "$..start_time\n@js:\"🕗 \"+java.timeFormat(result*1000)+\"    \"+(new Date(result*1000)>new Date()?\"❗️未发布\":\"\")"}, "searchUrl": "https://comic.mkzcdn.com/search/keyword/?keyword={{key}}&page_num={{page}}&page_size=20", "weight": 0},{"bookSourceComment": "// 免翻稳定，部分小说内容需登录，推荐登录使用\n\n// 国内发布页：https://www.asw2.cc/\n// 台湾站：https://www.alicesw.tw/\n\n//繁转简函数\nflag = 1\ni = \"錒皚藹礙愛噯嬡璦曖靄諳銨鵪骯襖奧媼驁鰲壩罷鈀擺敗唄頒辦絆鈑幫綁鎊謗剝飽寶報鮑鴇齙輩貝鋇狽備憊鵯賁錛繃筆畢斃幣閉蓽嗶潷鉍篳蹕邊編貶變辯辮芐緶籩標驃颮飆鏢鑣鰾鱉別癟瀕濱賓擯儐繽檳殯臏鑌髕鬢餅稟撥缽鉑駁餑鈸鵓補鈽財參蠶殘慚慘燦驂黲蒼艙倉滄廁側冊測惻層詫鍤儕釵攙摻蟬饞讒纏鏟產闡顫囅諂讖蕆懺嬋驏覘禪鐔場嘗長償腸廠暢倀萇悵閶鯧鈔車徹硨塵陳襯傖諶櫬磣齔撐稱懲誠騁棖檉鋮鐺癡遲馳恥齒熾飭鴟沖衝蟲寵銃疇躊籌綢儔幬讎櫥廚鋤雛礎儲觸處芻絀躕傳釧瘡闖創愴錘綞純鶉綽輟齪辭詞賜鶿聰蔥囪從叢蓯驄樅湊輳躥竄攛錯銼鹺達噠韃帶貸駘紿擔單鄲撣膽憚誕彈殫賧癉簞當擋黨蕩檔讜碭襠搗島禱導盜燾燈鄧鐙敵滌遞締糴詆諦綈覿鏑顛點墊電巔鈿癲釣調銚鯛諜疊鰈釘頂錠訂鋌丟銩東動棟凍崠鶇竇犢獨讀賭鍍瀆櫝牘篤黷鍛斷緞籪兌隊對懟鐓噸頓鈍燉躉奪墮鐸鵝額訛惡餓諤堊閼軛鋨鍔鶚顎顓鱷誒兒爾餌貳邇鉺鴯鮞發罰閥琺礬釩煩販飯訪紡鈁魴飛誹廢費緋鐨鯡紛墳奮憤糞僨豐楓鋒風瘋馮縫諷鳳灃膚輻撫輔賦復負訃婦縛鳧駙紱紼賻麩鮒鰒釓該鈣蓋賅桿趕稈贛尷搟紺岡剛鋼綱崗戇鎬睪誥縞鋯擱鴿閣鉻個紇鎘潁給亙賡綆鯁龔宮鞏貢鉤溝茍構購夠詬緱覯蠱顧詁轂鈷錮鴣鵠鶻剮掛鴰摑關觀館慣貫詿摜鸛鰥廣獷規歸龜閨軌詭貴劊匭劌媯檜鮭鱖輥滾袞緄鯀鍋國過堝咼幗槨蟈鉿駭韓漢闞絎頡號灝顥閡鶴賀訶闔蠣橫轟鴻紅黌訌葒閎鱟壺護滬戶滸鶘嘩華畫劃話驊樺鏵懷壞歡環還緩換喚瘓煥渙奐繯鍰鯇黃謊鰉揮輝毀賄穢會燴匯諱誨繪詼薈噦澮繢琿暉葷渾諢餛閽獲貨禍鈥鑊擊機積饑跡譏雞績緝極輯級擠幾薊劑濟計記際繼紀訐詰薺嘰嚌驥璣覬齏磯羈蠆躋霽鱭鯽夾莢頰賈鉀價駕郟浹鋏鎵蟯殲監堅箋間艱緘繭檢堿鹼揀撿簡儉減薦檻鑒踐賤見鍵艦劍餞漸濺澗諫縑戔戩瞼鶼筧鰹韉將漿蔣槳獎講醬絳韁膠澆驕嬌攪鉸矯僥腳餃繳絞轎較撟嶠鷦鮫階節潔結誡屆癤頜鮚緊錦僅謹進晉燼盡勁荊莖巹藎饉縉贐覲鯨驚經頸靜鏡徑痙競凈剄涇逕弳脛靚糾廄舊鬮鳩鷲駒舉據鋸懼劇詎屨櫸颶鉅鋦窶齟鵑絹錈鐫雋覺決絕譎玨鈞軍駿皸開凱剴塏愾愷鎧鍇龕閌鈧銬顆殼課騍緙軻鈳錁頷墾懇齦鏗摳庫褲嚳塊儈鄶噲膾寬獪髖礦曠況誆誑鄺壙纊貺虧巋窺饋潰匱蕢憒聵簣閫錕鯤擴闊蠐蠟臘萊來賴崍徠淶瀨賚睞錸癩籟藍欄攔籃闌蘭瀾讕攬覽懶纜爛濫嵐欖斕鑭襤瑯閬鋃撈勞澇嘮嶗銠鐒癆樂鰳鐳壘類淚誄縲籬貍離鯉禮麗厲勵礫歷瀝隸儷酈壢藶蒞蘺嚦邐驪縭櫪櫟轢礪鋰鸝癘糲躒靂鱺鱧倆聯蓮連鐮憐漣簾斂臉鏈戀煉練蘞奩瀲璉殮褳襝鰱糧涼兩輛諒魎療遼鐐繚釕鷯獵臨鄰鱗凜賃藺廩檁轔躪齡鈴靈嶺領綾欞蟶鯪餾劉瀏騮綹鎦鷚龍聾嚨籠壟攏隴蘢瀧瓏櫳朧礱樓婁摟簍僂蔞嘍嶁鏤瘺耬螻髏蘆盧顱廬爐擄鹵虜魯賂祿錄陸壚擼嚕閭瀘淥櫨櫓轤輅轆氌臚鸕鷺艫鱸巒攣孿灤亂臠孌欒鸞鑾掄輪倫侖淪綸論圇蘿羅邏鑼籮騾駱絡犖玀濼欏腡鏍驢呂鋁侶屢縷慮濾綠櫚褸鋝嘸媽瑪碼螞馬罵嗎嘜嬤榪買麥賣邁脈勱瞞饅蠻滿謾縵鏝顙鰻貓錨鉚貿麼沒鎂門悶們捫燜懣鍆錳夢瞇謎彌覓冪羋謐獼禰綿緬澠靦黽廟緲繆滅憫閩閔緡鳴銘謬謨驀饃歿鏌謀畝鉬吶鈉納難撓腦惱鬧鐃訥餒內擬膩鈮鯢攆輦鯰釀鳥蔦裊聶嚙鑷鎳隉蘗囁顢躡檸獰寧擰濘苧嚀聹鈕紐膿濃農儂噥駑釹諾儺瘧歐鷗毆嘔漚謳慪甌盤蹣龐拋皰賠轡噴鵬紕羆鈹騙諞駢飄縹頻貧嬪蘋憑評潑頗釙撲鋪樸譜鏷鐠棲臍齊騎豈啟氣棄訖蘄騏綺榿磧頎頏鰭牽釬鉛遷簽謙錢鉗潛淺譴塹僉蕁慳騫繾槧鈐槍嗆墻薔強搶嬙檣戧熗錆鏘鏹羥蹌鍬橋喬僑翹竅誚譙蕎繰磽蹺竊愜鍥篋欽親寢鋟輕氫傾頃請慶撳鯖瓊窮煢蛺巰賕蟣鰍趨區軀驅齲詘嶇闃覷鴝顴權勸詮綣輇銓卻鵲確闋闕愨讓饒擾繞蕘嬈橈熱韌認紉飪軔榮絨嶸蠑縟銣顰軟銳蜆閏潤灑薩颯鰓賽傘毿糝喪騷掃繅澀嗇銫穡殺剎紗鎩鯊篩曬釃刪閃陜贍繕訕姍騸釤鱔墑傷賞坰殤觴燒紹賒攝懾設厙灄畬紳審嬸腎滲詵諗瀋聲繩勝師獅濕詩時蝕實識駛勢適釋飾視試謚塒蒔弒軾貰鈰鰥壽獸綬樞輸書贖屬術樹豎數攄紓帥閂雙誰稅順說碩爍鑠絲飼廝駟緦鍶鷥聳慫頌訟誦擻藪餿颼鎪蘇訴肅謖穌雖隨綏歲誶孫損筍蓀猻縮瑣鎖嗩脧獺撻闥鉈鰨臺態鈦鮐攤貪癱灘壇譚談嘆曇鉭錟頇湯燙儻餳鐋鏜濤絳討韜鋱騰謄銻題體屜緹鵜闐條糶齠鰷貼鐵廳聽烴銅統慟頭鈄禿圖釷團摶頹蛻飩脫鴕馱駝橢籜鼉襪媧膃彎灣頑萬紈綰網輞韋違圍為濰維葦偉偽緯謂衛諉幃闈溈潿瑋韙煒鮪溫聞紋穩問閿甕撾蝸渦窩臥萵齷嗚鎢烏誣無蕪吳塢霧務誤鄔廡憮嫵騖鵡鶩錫犧襲習銑戲細餼鬩璽覡蝦轄峽俠狹廈嚇硤鮮纖賢銜閑顯險現獻縣餡羨憲線莧薟蘚峴獫嫻鷴癇蠔秈躚廂鑲鄉詳響項薌餉驤緗饗蕭囂銷曉嘯嘵瀟驍綃梟簫協挾攜脅諧寫瀉謝褻擷紲纈鋅釁興陘滎兇洶銹繡饈鵂虛噓須許敘緒續詡頊軒懸選癬絢諼鉉鏇學謔澩鱈勛詢尋馴訓訊遜塤潯鱘壓鴉鴨啞亞訝埡婭椏氬閹煙鹽嚴巖顏閻艷厭硯彥諺驗厴贗儼兗讞懨閆釅魘饜鼴鴦楊揚瘍陽癢養樣煬瑤搖堯遙窯謠藥軺鷂鰩爺頁業葉靨謁鄴曄燁醫銥頤遺儀蟻藝億憶義詣議誼譯異繹詒囈嶧飴懌驛縊軼貽釔鎰鐿瘞艤蔭陰銀飲隱銦癮櫻嬰鷹應纓瑩螢營熒蠅贏穎塋鶯縈鎣攖嚶瀅瀠瓔鸚癭頦罌喲擁傭癰踴詠鏞優憂郵鈾猶誘蕕銪魷輿魚漁娛與嶼語獄譽預馭傴俁諛諭蕷崳飫閾嫗紆覦歟鈺鵒鷸齬鴛淵轅園員圓緣遠櫞鳶黿約躍鑰粵悅閱鉞鄖勻隕運蘊醞暈韻鄆蕓惲慍紜韞殞氳雜災載攢暫贊瓚趲鏨贓臟駔鑿棗責擇則澤賾嘖幘簀賊譖贈綜繒軋鍘閘柵詐齋債氈盞斬輾嶄棧戰綻譫張漲帳賬脹趙詔釗蟄轍鍺這謫輒鷓貞針偵診鎮陣湞縝楨軫賑禎鴆掙睜猙爭幀癥鄭證諍崢鉦錚箏織職執紙摯擲幟質滯騭櫛梔軹輊贄鷙螄縶躓躑觶鐘終種腫眾鍾謅軸皺晝驟紂縐豬諸誅燭矚囑貯鑄駐佇櫧銖專磚轉賺囀饌顳樁莊裝妝壯狀錐贅墜綴騅縋諄準著濁諑鐲茲資漬諮緇輜貲眥錙齜鯔蹤總縱傯鄒諏騶鯫詛組鏃鉆纘躦鱒翺並蔔沈醜澱叠鬥範幹臯矽櫃後夥稭傑訣誇裏淩麽黴撚淒扡聖屍擡塗窪餵汙鍁鹹蠍彜湧遊籲禦願嶽雲竈紮劄築於誌註雕訁譾郤猛氹阪壟堖垵墊檾蕒葤蓧蒓菇槁摣咤唚哢噝噅撅噼謔襆嶴脊仿僥獁麅餘餷饊饢楞怵懍爿漵灩溷濫瀦淡寧糸絝緔瑉梘棬案橰櫫軲軤賫膁腖飈糊煆溜湣渺碸滾瞘鈈鉕鋣銱鋥鋶鐦鐧鍩鍀鍃錇鎄鎇鎿鐝鑥鑹鑔穭鶓鶥鸌癧屙瘂臒襇繈耮顬蟎麯鮁鮃鮎鯗鯝鯴鱝鯿鰠鰵鱅鞽韝齇葯慾裡姊佔徵唷勐砲髮澹噁姦乾鬆姪囉\";\nz = \"锕皑蔼碍爱嗳嫒瑷暧霭谙铵鹌肮袄奥媪骜鳌坝罢钯摆败呗颁办绊钣帮绑镑谤剥饱宝报鲍鸨龅辈贝钡狈备惫鹎贲锛绷笔毕毙币闭荜哔滗铋筚跸边编贬变辩辫苄缏笾标骠飑飙镖镖鳔鳖别瘪濒滨宾摈傧缤槟殡膑镔髌鬓饼禀拨钵铂驳饽钹鹁补钸财参蚕残惭惨灿骖黪苍舱仓沧厕侧册测恻层诧锸侪钗搀掺蝉馋谗缠铲产阐颤冁谄谶蒇忏婵骣觇禅镡场尝长偿肠厂畅伥苌怅阊鲳钞车彻砗尘陈衬伧谌榇碜龀撑称惩诚骋枨柽铖铛痴迟驰耻齿炽饬鸱冲冲虫宠铳畴踌筹绸俦帱雠橱厨锄雏础储触处刍绌蹰传钏疮闯创怆锤缍纯鹑绰辍龊辞词赐鹚聪葱囱从丛苁骢枞凑辏蹿窜撺错锉鹾达哒鞑带贷骀绐担单郸掸胆惮诞弹殚赕瘅箪当挡党荡档谠砀裆捣岛祷导盗焘灯邓镫敌涤递缔籴诋谛绨觌镝颠点垫电巅钿癫钓调铫鲷谍叠鲽钉顶锭订铤丢铥东动栋冻岽鸫窦犊独读赌镀渎椟牍笃黩锻断缎簖兑队对怼镦吨顿钝炖趸夺堕铎鹅额讹恶饿谔垩阏轭锇锷鹗颚颛鳄诶儿尔饵贰迩铒鸸鲕发罚阀珐矾钒烦贩饭访纺钫鲂飞诽废费绯镄鲱纷坟奋愤粪偾丰枫锋风疯冯缝讽凤沣肤辐抚辅赋复负讣妇缚凫驸绂绋赙麸鲋鳆钆该钙盖赅杆赶秆赣尴擀绀冈刚钢纲岗戆镐睾诰缟锆搁鸽阁铬个纥镉颍给亘赓绠鲠龚宫巩贡钩沟苟构购够诟缑觏蛊顾诂毂钴锢鸪鹄鹘剐挂鸹掴关观馆惯贯诖掼鹳鳏广犷规归龟闺轨诡贵刽匦刿妫桧鲑鳜辊滚衮绲鲧锅国过埚呙帼椁蝈铪骇韩汉阚绗颉号灏颢阂鹤贺诃阖蛎横轰鸿红黉讧荭闳鲎壶护沪户浒鹕哗华画划话骅桦铧怀坏欢环还缓换唤痪焕涣奂缳锾鲩黄谎鳇挥辉毁贿秽会烩汇讳诲绘诙荟哕浍缋珲晖荤浑诨馄阍获货祸钬镬击机积饥迹讥鸡绩缉极辑级挤几蓟剂济计记际继纪讦诘荠叽哜骥玑觊齑矶羁虿跻霁鲚鲫夹荚颊贾钾价驾郏浃铗镓蛲歼监坚笺间艰缄茧检碱硷拣捡简俭减荐槛鉴践贱见键舰剑饯渐溅涧谏缣戋戬睑鹣笕鲣鞯将浆蒋桨奖讲酱绛缰胶浇骄娇搅铰矫侥脚饺缴绞轿较挢峤鹪鲛阶节洁结诫届疖颌鲒紧锦仅谨进晋烬尽劲荆茎卺荩馑缙赆觐鲸惊经颈静镜径痉竞净刭泾迳弪胫靓纠厩旧阄鸠鹫驹举据锯惧剧讵屦榉飓钜锔窭龃鹃绢锩镌隽觉决绝谲珏钧军骏皲开凯剀垲忾恺铠锴龛闶钪铐颗壳课骒缂轲钶锞颔垦恳龈铿抠库裤喾块侩郐哙脍宽狯髋矿旷况诓诳邝圹纩贶亏岿窥馈溃匮蒉愦聩篑阃锟鲲扩阔蛴蜡腊莱来赖崃徕涞濑赉睐铼癞籁蓝栏拦篮阑兰澜谰揽览懒缆烂滥岚榄斓镧褴琅阆锒捞劳涝唠崂铑铹痨乐鳓镭垒类泪诔缧篱狸离鲤礼丽厉励砾历沥隶俪郦坜苈莅蓠呖逦骊缡枥栎轹砺锂鹂疠粝跞雳鲡鳢俩联莲连镰怜涟帘敛脸链恋炼练蔹奁潋琏殓裢裣鲢粮凉两辆谅魉疗辽镣缭钌鹩猎临邻鳞凛赁蔺廪檩辚躏龄铃灵岭领绫棂蛏鲮馏刘浏骝绺镏鹨龙聋咙笼垄拢陇茏泷珑栊胧砻楼娄搂篓偻蒌喽嵝镂瘘耧蝼髅芦卢颅庐炉掳卤虏鲁赂禄录陆垆撸噜闾泸渌栌橹轳辂辘氇胪鸬鹭舻鲈峦挛孪滦乱脔娈栾鸾銮抡轮伦仑沦纶论囵萝罗逻锣箩骡骆络荦猡泺椤脶镙驴吕铝侣屡缕虑滤绿榈褛锊呒妈玛码蚂马骂吗唛嬷杩买麦卖迈脉劢瞒馒蛮满谩缦镘颡鳗猫锚铆贸麽没镁门闷们扪焖懑钔锰梦眯谜弥觅幂芈谧猕祢绵缅渑腼黾庙缈缪灭悯闽闵缗鸣铭谬谟蓦馍殁镆谋亩钼呐钠纳难挠脑恼闹铙讷馁内拟腻铌鲵撵辇鲶酿鸟茑袅聂啮镊镍陧蘖嗫颟蹑柠狞宁拧泞苎咛聍钮纽脓浓农侬哝驽钕诺傩疟欧鸥殴呕沤讴怄瓯盘蹒庞抛疱赔辔喷鹏纰罴铍骗谝骈飘缥频贫嫔苹凭评泼颇钋扑铺朴谱镤镨栖脐齐骑岂启气弃讫蕲骐绮桤碛颀颃鳍牵钎铅迁签谦钱钳潜浅谴堑佥荨悭骞缱椠钤枪呛墙蔷强抢嫱樯戗炝锖锵镪羟跄锹桥乔侨翘窍诮谯荞缲硗跷窃惬锲箧钦亲寝锓轻氢倾顷请庆揿鲭琼穷茕蛱巯赇虮鳅趋区躯驱龋诎岖阒觑鸲颧权劝诠绻辁铨却鹊确阕阙悫让饶扰绕荛娆桡热韧认纫饪轫荣绒嵘蝾缛铷颦软锐蚬闰润洒萨飒鳃赛伞毵糁丧骚扫缫涩啬铯穑杀刹纱铩鲨筛晒酾删闪陕赡缮讪姗骟钐鳝墒伤赏垧殇觞烧绍赊摄慑设厍滠畲绅审婶肾渗诜谂渖声绳胜师狮湿诗时蚀实识驶势适释饰视试谥埘莳弑轼贳铈鲥寿兽绶枢输书赎属术树竖数摅纾帅闩双谁税顺说硕烁铄丝饲厮驷缌锶鸶耸怂颂讼诵擞薮馊飕锼苏诉肃谡稣虽随绥岁谇孙损笋荪狲缩琐锁唢睃獭挞闼铊鳎台态钛鲐摊贪瘫滩坛谭谈叹昙钽锬顸汤烫傥饧铴镗涛绦讨韬铽腾誊锑题体屉缇鹈阗条粜龆鲦贴铁厅听烃铜统恸头钭秃图钍团抟颓蜕饨脱鸵驮驼椭箨鼍袜娲腽弯湾顽万纨绾网辋韦违围为潍维苇伟伪纬谓卫诿帏闱沩涠玮韪炜鲔温闻纹稳问阌瓮挝蜗涡窝卧莴龌呜钨乌诬无芜吴坞雾务误邬庑怃妩骛鹉鹜锡牺袭习铣戏细饩阋玺觋虾辖峡侠狭厦吓硖鲜纤贤衔闲显险现献县馅羡宪线苋莶藓岘猃娴鹇痫蚝籼跹厢镶乡详响项芗饷骧缃飨萧嚣销晓啸哓潇骁绡枭箫协挟携胁谐写泻谢亵撷绁缬锌衅兴陉荥凶汹锈绣馐鸺虚嘘须许叙绪续诩顸轩悬选癣绚谖铉镟学谑泶鳕勋询寻驯训讯逊埙浔鲟压鸦鸭哑亚讶垭娅桠氩阉烟盐严岩颜阎艳厌砚彦谚验厣赝俨兖谳恹闫酽魇餍鼹鸯杨扬疡阳痒养样炀瑶摇尧遥窑谣药轺鹞鳐爷页业叶靥谒邺晔烨医铱颐遗仪蚁艺亿忆义诣议谊译异绎诒呓峄饴怿驿缢轶贻钇镒镱瘗舣荫阴银饮隐铟瘾樱婴鹰应缨莹萤营荧蝇赢颖茔莺萦蓥撄嘤滢潆璎鹦瘿颏罂哟拥佣痈踊咏镛优忧邮铀犹诱莸铕鱿舆鱼渔娱与屿语狱誉预驭伛俣谀谕蓣嵛饫阈妪纡觎欤钰鹆鹬龉鸳渊辕园员圆缘远橼鸢鼋约跃钥粤悦阅钺郧匀陨运蕴酝晕韵郓芸恽愠纭韫殒氲杂灾载攒暂赞瓒趲錾赃脏驵凿枣责择则泽赜啧帻箦贼谮赠综缯轧铡闸栅诈斋债毡盏斩辗崭栈战绽谵张涨帐账胀赵诏钊蛰辙锗这谪辄鹧贞针侦诊镇阵浈缜桢轸赈祯鸩挣睁狰争帧症郑证诤峥钲铮筝织职执纸挚掷帜质滞骘栉栀轵轾贽鸷蛳絷踬踯觯钟终种肿众锺诌轴皱昼骤纣绉猪诸诛烛瞩嘱贮铸驻伫槠铢专砖转赚啭馔颞桩庄装妆壮状锥赘坠缀骓缒谆准着浊诼镯兹资渍谘缁辎赀眦锱龇鲻踪总纵偬邹诹驺鲰诅组镞钻缵躜鳟翱并卜沉丑淀迭斗范干皋硅柜后伙秸杰诀夸里凌么霉捻凄扦圣尸抬涂洼喂污锨咸蝎彝涌游吁御愿岳云灶扎札筑于志注凋讠谫郄勐凼坂垅垴埯埝苘荬荮莜莼菰藁揸吒吣咔咝咴噘劈嚯幞岙嵴彷徼犸狍馀馇馓馕愣憷懔丬溆滟混漤潴澹甯纟绔绱珉枧桊桉槔橥轱轷赍肷胨飚煳煅熘愍淼砜磙眍钚钷铘铞锃锍锎锏锘锝锪锫锿镅镎镢镥镩镲稆鹋鹛鹱疬疴痖癯裥襁耢颥螨麴鲅鲆鲇鲞鲴鲺鲼鳊鳋鳘鳙鞒鞴齄药欲里姐占征哟猛炮发淡恶奸干松侄啰\";\nfunction traditionalToSimplified(str) {\n  let result = String(str).replace(/[\\[\\]]/g,\"\");\n  for (let idx = 0; idx < i.length; idx++) {\n    if (i[idx] && z[idx]) {\n      result = result.replace(new RegExp(i[idx], 'g'), z[idx]);\n    }\n  }\n  return result;\n}", "bookSourceGroup": "R18", "bookSourceName": "🌸爱丽丝书屋", "bookSourceType": 0, "bookSourceUrl": "https://www.alicesw.tw/", "customButton": false, "customOrder": 459, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[\n  {\n    \"title\": \"🔖TOP50🔖\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"title\": \"总排行\",\n    \"url\": \"https://www.alicesw.tw/other/rank_hits/order/hits.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"月排行\",\n    \"url\": \"https://www.alicesw.tw/other/rank_hits/order/hits_month.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"周排行\",\n    \"url\": \"https://www.alicesw.tw/other/rank_hits/order/hits_week.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"日排行\",\n    \"url\": \"https://www.alicesw.tw/other/rank_hits/order/hits_day.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"🔖分类（人气）🔖\",\n    \"url\": \"\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  },\n  {\n    \"title\": \"科幻\",\n    \"url\": \"https://www.alicesw.tw/all/id/71/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"校园\",\n    \"url\": \"https://www.alicesw.tw/all/id/61/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"玄幻\",\n    \"url\": \"https://www.alicesw.tw/all/id/62/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"乡村\",\n    \"url\": \"https://www.alicesw.tw/all/id/63/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"都市\",\n    \"url\": \"https://www.alicesw.tw/all/id/64/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"乱伦\",\n    \"url\": \"https://www.alicesw.tw/all/id/65/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"历史\",\n    \"url\": \"https://www.alicesw.tw/all/id/67/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"武侠\",\n    \"url\": \"https://www.alicesw.tw/all/id/68/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"系统\",\n    \"url\": \"https://www.alicesw.tw/all/id/69/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"明星\",\n    \"url\": \"https://www.alicesw.tw/all/id/72/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"同人\",\n    \"url\": \"https://www.alicesw.tw/all/id/73/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"强奸\",\n    \"url\": \"https://www.alicesw.tw/all/id/74/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"奇幻\",\n    \"url\": \"https://www.alicesw.tw/all/id/75/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"经典\",\n    \"url\": \"https://www.alicesw.tw/all/id/79/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"穿越\",\n    \"url\": \"https://www.alicesw.tw/all/id/70/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"凌辱\",\n    \"url\": \"https://www.alicesw.tw/all/id/46/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"反差\",\n    \"url\": \"https://www.alicesw.tw/all/id/22/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"堕落\",\n    \"url\": \"https://www.alicesw.tw/all/id/18/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"纯爱\",\n    \"url\": \"https://www.alicesw.tw/all/id/19/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"伪娘\",\n    \"url\": \"https://www.alicesw.tw/all/id/52/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"萝莉\",\n    \"url\": \"https://www.alicesw.tw/all/id/48/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"熟女\",\n    \"url\": \"https://www.alicesw.tw/all/id/56/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"禁忌\",\n    \"url\": \"https://www.alicesw.tw/all/id/51/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"NTR\",\n    \"url\": \"https://www.alicesw.tw/all/id/54/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"媚黑\",\n    \"url\": \"https://www.alicesw.tw/all/id/53/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"绿帽\",\n    \"url\": \"https://www.alicesw.tw/all/id/55/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"调教\",\n    \"url\": \"https://www.alicesw.tw/all/id/58/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"女主\",\n    \"url\": \"https://www.alicesw.tw/all/id/59/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"正太\",\n    \"url\": \"https://www.alicesw.tw/all/id/50/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"下克上\",\n    \"url\": \"https://www.alicesw.tw/all/id/43/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"百合\",\n    \"url\": \"https://www.alicesw.tw/all/id/47/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"重口\",\n    \"url\": \"https://www.alicesw.tw/all/id/21/order/hits+desc.html?page={{page}}\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  }\n]", "header": "Mozilla/5.0 (Linux; Android 10; Mobile) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36", "lastUpdateTime": "1785650979938", "loginUrl": "https://www.alicesw.tw/user/user/login.html", "respondTime": 180000, "ruleBookInfo": {"author": "//div[@class='box_info']/div[@class='novel_info']/p[1]/a/text()@js:\neval(String(source.bookSourceComment));\ntraditionalToSimplified(result)", "coverUrl": "@js:\nvar cover = java.getString(\"//div[@class='box_intro']/div[@class='pic']/img/@src\", true);\nif(cover && /img\\/\\d+\\.webp/.test(cover)){cover = \"https://img.321cdn.com/img/01.png\"}\ncover", "intro": "@js:\neval(String(source.bookSourceComment));\nvar info = java.getString(\"//div[@class='box_info']/div[@class='novel_info']//p[not(.//a)]//text()\")\nvar intro = java.getString(\"//div[@class='jianjie']/p/text()\")\ntraditionalToSimplified(intro+\"\\n◤-------------------------------◥\\n\"+info+\"\\n◣-------------------------------◢\\n\")", "kind": "//div[@class='box_info']/div[@class='tags_list']/a/text()@js:\neval(String(source.bookSourceComment));\ntraditionalToSimplified(result)", "lastChapter": "//div[@class='box_info']/table/tbody/tr[1]/td/div/p[1]/a[2]/text()@js:\neval(String(source.bookSourceComment));\ntraditionalToSimplified(result)", "name": "//div[@class='box_info']/div[@class='novel_title']/text()@js:\neval(String(source.bookSourceComment));\ntraditionalToSimplified(result)", "tocUrl": "//div[@class='book_newchap']//a[contains(text(),'查看所有章')]/@href", "wordCount": "//div[@class='box_info']/div[@class='novel_info']/p[4]/text()@js:\nlet txt = result.split(\"\\n\").join(\"\");\ntxt = txt.replace(/[\\n\\s　]/g,\"\");\nlet m = txt.match(/\\d+(?:\\.\\d+)?/);\nm[0]+\"万\""}, "ruleContent": {"content": "//div[contains(@class,'read-content')]/p/text()", "title": "//div[@class='text-head']/h3/text()"}, "ruleExplore": {"author": "//li[@class='four']/text()@js:\neval(String(source.bookSourceComment));\ntraditionalToSimplified(result)", "bookList": "//div[@class='clearfix rec_rullist']/ul", "bookUrl": "//li[@class='two']/a/@href", "kind": "@js:\neval(String(source.bookSourceComment));\nvar tag  = java.getString(\"//li[@class='sev']/span/a/text()\")\nvar views=  java.getString(\"//li[@class='diyhot']/text()\")\ntraditionalToSimplified(tag+\",👀\"+views)", "lastChapter": "//li[@class='three']/a/text()@js:\neval(String(source.bookSourceComment));\ntraditionalToSimplified(result)", "name": "//li[@class='two']/a/text()@js:\neval(String(source.bookSourceComment));\ntraditionalToSimplified(result)", "wordCount": "//li[@class='five']/text()@js:\nlet txt = result.split(\"\\n\").join(\"\");\ntxt = txt.replace(/[\\n\\s　]/g,\"\");\nlet m = txt.match(/\\d+(?:\\.\\d+)?/);\nm[0]+\"万\""}, "ruleSearch": {"author": "//p[@class='mb-1 text-muted']/a/text()@js:\neval(String(source.bookSourceComment));\ntraditionalToSimplified(result)", "bookList": "//div[@class='list-group']/div[@class='list-group-item']", "bookUrl": "//h5/a/@href", "checkKeyWord": "美母为妻", "intro": "//p[@class='content-txt']@js:\neval(String(source.bookSourceComment));\ntraditionalToSimplified(result)", "kind": "<js>\neval(String(source.bookSourceComment));\nvar status = java.getString(\"//h5/small/text()\");\nvar tags = java.getString(\"//p[@class='text-muted']/a/text()\");\nvar views = java.getString(\"//p[@class='mb-1 text-muted']//text()\").match(/\\d+?.\\d+/g)[1]\ntraditionalToSimplified(status+\",👀\"+views+\",\"+tags)\n</js>\n##\\[|]##", "name": "//h5/a//text()@js:\neval(String(source.bookSourceComment));\ntraditionalToSimplified(result).replace(/\\d+.|\\n/g,\"\")", "wordCount": "//p[1]/text()@js:\nlet txt = result.split(\"\\n\").join(\"\");\ntxt = txt.replace(/[\\n\\s　]/g,\"\");\nlet m = txt.match(/\\d+(?:\\.\\d+)?/);\nm[0]+\"万\""}, "ruleToc": {"chapterList": "//ul[@class='mulu_list']/li", "chapterName": "//a/text()@js:\neval(String(source.bookSourceComment));\ntraditionalToSimplified(result)", "chapterUrl": "//a/@href"}, "searchUrl": "https://www.alicesw.tw/search.html?q={{key}}&f=_all", "weight": 0},{"bookSourceComment": "推荐登录使用", "bookSourceGroup": "R18", "bookSourceName": "🌸搬山人小说网", "bookSourceType": 0, "bookSourceUrl": "https://www.banshanren.com/", "concurrentRate": "1000", "customButton": false, "customOrder": 460, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "[\n{\n    \"title\": \"年排行\",\n    \"url\": \"https://www.banshanren.com/api/rank?range=3\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n{\n    \"title\": \"月排行\",\n    \"url\": \"https://www.banshanren.com/api/rank?range=2\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n{\n    \"title\": \"周排行\",\n    \"url\": \"https://www.banshanren.com/api/rank?range=1\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n  {\n    \"title\": \"浏览量\",\n    \"url\": \"https://www.banshanren.com/all/0-0-0-0-0-0-3-1/\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n{\n    \"title\": \"收藏榜\",\n    \"url\": \"https://www.banshanren.com/api/rank?range=5\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n{\n    \"title\": \"新作榜\",\n    \"url\": \"https://www.banshanren.com/api/rank?range=4\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  }\n]", "header": "{\n \"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36\",\n\"Referer\":\"https://www.banshanren.com/\"\n}", "lastUpdateTime": "1785648390491", "loginUrl": "https://www.banshanren.com", "respondTime": 180000, "ruleBookInfo": {"author": "//div[@class='novel_brief_box']/div[@class='novel_title_box']/div[@class='info_box'][2]/span/text()", "coverUrl": "//div[@class='novel_brief_box']/div[@class='cover_box']/img/@data-src@js:\n(function(){\nif (!result) return '';\ntry {\nvar client = new Packages.okhttp3.OkHttpClient();\nvar request = new Packages.okhttp3.Request.Builder()\n    .url(result)\n    .header('Referer', 'https://www.banshanren.com/')\n    .header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36')\n    .build();\nvar response = client.newCall(request).execute();\nif (!response.isSuccessful()) return '';\nvar raw = response.body().bytes();\nif (raw.length < 32) return '';\nvar iv = Packages.java.util.Arrays.copyOfRange(raw, 0, 16);\nvar ct = Packages.java.util.Arrays.copyOfRange(raw, 16, raw.length);\nvar keyBytes = new Packages.java.lang.String('V4@.Tx+uXZn)AiH>').getBytes('UTF-8');\nvar keySpec = new Packages.javax.crypto.spec.SecretKeySpec(keyBytes, 'AES');\nvar ivSpec = new Packages.javax.crypto.spec.IvParameterSpec(iv);\nvar cipher = Packages.javax.crypto.Cipher.getInstance('AES/CBC/PKCS5Padding');\ncipher.init(Packages.javax.crypto.Cipher.DECRYPT_MODE, keySpec, ivSpec);\nvar decrypted = cipher.doFinal(ct);\nvar base64 = Packages.java.util.Base64.getEncoder().encodeToString(decrypted);\nreturn 'data:image/webp;base64,' + base64;\n} catch(e) {\nreturn '';\n}\n})();", "intro": "//div[@class='novel_brief_box']/div[@class='novel_title_box']/div[@class='novel_intro_box pc']/p[1]/text()", "kind": "//div[@class='novel_brief_box']/div[@class='novel_title_box']/ul[@class='novel_tag_list pc']/li/a/@title", "lastChapter": "//div[@class='catalog_box']/div[@class='catalog_top_box']/div[1]/p[1]/span[@class='hl']/text()", "name": "//div[@class='novel_brief_box']/div[@class='novel_title_box']/h1/text()", "wordCount": "//div[@class='novel_brief_box']/div[@class='novel_title_box']/div[@class='novel_summary_box pc']/div[4]/p/b/text()"}, "ruleContent": {"content": "<js>\nvar html = String(result);\nvar limited = /limit_box|访问异常/.test(html);\nif (limited) {\n    html = String(java.startBrowserAwait(String(baseUrl), \"检测到限流，请处理\"));\n}\nvar doc = org.jsoup.Jsoup.parse(html);\nvar ps = doc.select(\"div.chapter_content_box > p\");\nvar arr = [];\nfor (var i = 0; i < ps.size(); i++) {\n    arr.push(ps.get(i).ownText());\n}\nresult = arr.join(\"\\n\");\n</js>"}, "ruleExplore": {"author": "$.authors", "bookList": "$.model", "bookUrl": "@js:\n\"https://www.banshanren.com/novel/{{$.slug}}\"", "intro": "$.description", "kind": "$.tagNames", "lastChapter": "$.latestUpdate", "name": "$.title", "wordCount": "$.wordCountFormat"}, "ruleSearch": {"author": "//div[@class='title_box']/div[@class='info_box'][2]/text()@js:\nresult.split('·')[0].trim()", "bookList": "//ul[@class='novel_list']/li[@class='novel_li']", "bookUrl": "//div[@class='title_box']/a[@class='title']/@href", "checkKeyWord": "琼明神女录", "intro": "//div[@class='title_box']/div[@class='novel_intro_box']/p", "kind": "//div[@class='title_box']/ul[@class='category_list']/li/a/@title", "name": "//div[@class='title_box']/a[@class='title']/text()"}, "ruleToc": {"chapterList": "//div[@class='catalog_box']/div[@class='volume_box']/ul/li[.//a]", "chapterName": "//a/@title", "chapterUrl": "//a/@href", "updateTime": "//p/text()"}, "searchUrl": "https://www.banshanren.com/search/index?keyword={{key}}", "weight": 0},{"bookSourceComment": "漫画发布页：https://wn01.link/\n当前可用域名：https://www.wn08.cfd/\n1、若域名失效，去发布页寻找正常域名，替换书源URL即可（本书源所有地址均跟随书源URL）\n2、若还不行，可能是书源网站被中国移动屏蔽了，翻墙看", "bookSourceGroup": "漫画,🌸漫画", "bookSourceName": "🌸绅士漫画", "bookSourceType": 2, "bookSourceUrl": "https://www.wn08.cfd/", "customOrder": 446, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "[\n  {\n    \"title\": \"月榜\",\n    \"url\": \"{{source.bookSourceUrl}}albums-favorite_ranking-page-{{page}}-type-month.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"周榜\",\n    \"url\": \"{{source.bookSourceUrl}}albums-favorite_ranking-page-{{page}}-type-week.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  },\n  {\n    \"title\": \"日榜\",\n    \"url\": \"{{source.bookSourceUrl}}albums-favorite_ranking-page-{{page}}-type-day.html\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.2\n    }\n  }\n]", "header": "@js:\nJSON.stringify({\n  \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36\",\n  \"Referer\": baseUrl,\n  \"Accept-Language\": \"zh-CN,zh;q=0.9\"\n})", "lastUpdateTime": "1785614405001", "respondTime": 180000, "ruleBookInfo": {"coverUrl": "//div[@class='asTB']/div[@class='asTBcell uwthumb']/img/@src##////##https://", "downloadUrls": "//div[@id='ads']/a[1]/@href", "intro": "//div[@class='asTBcell uwconn']/p/text()@js:result.split('\\n').join('')", "kind": "//div[@class='addtags']/a[@class='tagshow']/text()", "wordCount": "//div[@class='asTBcell uwconn']/label/text()@js:\nconst infoSplit =  result.split('\\n')\nconst info = []\nfor(var i  = 0;i<infoSplit .length;i++){\ninfo.push(infoSplit[i].split('：')[1])\n}\ninfo.join('  ')"}, "ruleContent": {"content": "//span[@id='imgarea']/a/img/@src##//##https://@js:\n\n// 获取前缀URL（动态提取，不写死图片域名，服务器变更也能自适应）\nconst prefixUrlMatch = result.match(/^(https?:\\/\\/[^/]+\\/data\\/\\d+\\/\\d+\\/)/m);\nconst prefixUrl = prefixUrlMatch ? prefixUrlMatch[1] : \"\";\n\n// 解析图片信息数组（容错：数组为空时设为[]）\nconst imgInfoList = JSON.parse(java.get('imgInfoList') || '[]');\n\n// 拼接完整图片链接（直接使用原始imgName）\nconst imgUrlList = [];\nif (prefixUrl) {\n    imgInfoList.forEach(item => {\n        // 仅做空值容错，不修改imgName原始值\n        const imgName = item.imgName || '';\n        const imgExtension = item.imgExtension || 'jpg';\n        const fullImgUrl = prefixUrl + imgName + \".\" + imgExtension;\n        imgUrlList.push(fullImgUrl);\n    });\n}\n\n// 规则输出拼接后的img标签\nimgUrlList.map(x=>'<img src=\\\"'+x+'\\\">')\n.join(\"\\n\")", "imageStyle": "FULL"}, "ruleExplore": {"bookList": "//div[@class='gallary_wrap']/ul/li", "bookUrl": "//div[@class='info']/div[@class='title']/a/@href,{\"webView\":true}", "coverUrl": "//li/div[1]/a/img/@src", "kind": "//div[@class='pic_box']/div[2]/text()|//div[@class='info']/div[@class='info_col']/text()", "name": "//div[@class='info']/div[@class='title']/a//text()@js:\nconst bookname= result.split('\\n').join('').replace(/^.*?]/g, '')\nbookname"}, "ruleSearch": {"bookList": "//div[@class='gallary_wrap']/ul/li", "bookUrl": "//div[@class='info']/div[@class='title']/a/@href,{\"webView\":true}", "checkKeyWord": "元魔法", "coverUrl": "//li/div[1]/a/img/@src", "intro": "//li/div[@class='info']/div[@class='info_col']/text()@js:\nvar timeStr = result.split(\"，\")[1] || \"\";\nvar updateTime = timeStr.match(/創建於(\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2})/)?.[1] || \"无时间\";\n'更新时间:  ' + updateTime;", "kind": "//li/div[1]/@class@js:\nvar pages =java.getString(\"//li/div[@class='info']/div[@class='info_col']/text()\")\nvar imgNum = pages.split(\"，\")[0].match(/\\d+(?=張圖片)/g)[0]\nif (result[0].indexOf('cate-1') !== -1) { \n    '绅士漫画,同人志/汉化,'+imgNum+'页';\n} else if (result[0].indexOf('cate-12') !== -1) {\n    '绅士漫画,同人志/日语,'+imgNum+'页'; \n} else if (result[0].indexOf('cate-9') !== -1) {\n    '绅士漫画,单行本/汉化,'+imgNum+'页';\n} else if (result[0].indexOf('cate-13') !== -1) {\n    '绅士漫画,单行本/日语,'+imgNum+'页';\n} else if (result[0].indexOf('cate-10') !== -1) {\n    '绅士漫画,杂志&短篇/汉化,'+imgNum+'页';\n} else if (result[0].indexOf('cate-14') !== -1) {\n    '绅士漫画,杂志&短篇/日语,'+imgNum+'页';\n} else if (result[0].indexOf('cate-18') !== -1) {\n     '绅士漫画,杂志&短篇/English,'+imgNum+'页';\n} else if (result[0].indexOf('cate-20') !== -1) {\n    '绅士漫画,韩漫/汉化,'+imgNum+'页';\n} else if (result[0].indexOf('cate-21') !== -1) {\n    '绅士漫画,韩漫/生肉,'+imgNum+'页';\n} else {\n    '绅士漫画,'+imgNum+'页'; \n}", "name": "//div[@class='info']/div[@class='title']/a//text()@js:\nconst bookname= result.split('\\n').join('').replace(/^.*?]/g, '')\nbookname"}, "ruleToc": {"chapterList": "//div[@class='gallary_wrap tb']/ul/li[1]@js:\nvar imgInfoList = [];\nvar nextPageUrl = [];\n\n\n// === 生成完整分页列表 ===\n\n// 1. 获取分页区的所有链接字符串\nvar paginatorHrefs = java.getString(\"//div[@class='f_left paginator']//a/@href\") || \"\";\n\n// 2. 初始化变量\nvar maxPage = 1;\nvar aid = \"\";\nvar urlPattern = /page-(\\d+)-aid-(\\d+)/; // 匹配 page-数字-aid-数字\n\n// 3. 遍历链接找到“最大页码”和“相册ID”\n// 分割字符串并过滤空行\nvar links = paginatorHrefs.split('\\n');\nfor (var i = 0; i < links.length; i++) {\n    var link = links[i].trim();\n    var match = link.match(urlPattern);\n    \n    if (match) {\n        var pageNum = parseInt(match[1]); // 提取页码\n        var currentAid = match[2];        // 提取AID\n        \n        // 更新最大页码\n        if (pageNum > maxPage) {\n            maxPage = pageNum;\n        }\n        // 提取AID（如果还没提取到）\n        if (!aid) {\n            aid = currentAid;\n        }\n    }\n}\n\n// 4. 根据获取到的 maxPage 和 aid 生成完整的 URL 列表\nif (aid && maxPage > 1) {\n    for (var i = 1; i <= maxPage; i++) {\n        // 拼接标准URL格式：photos-index-page-{页码}-aid-{ID}.html\n        nextPageUrl.push(source.bookSourceUrl + \"photos-index-page-\" + i + \"-aid-\" + aid + \".html\");\n    }\n} else {\n    // 如果没有找到分页（只有一页的情况），直接使用当前页面\n    nextPageUrl.push(baseUrl);\n}\n\njava.log(\"生成的总页数: \" + nextPageUrl.length);\n\n\njava.log(\"nexturl\"+nextPageUrl.join(\"\\n\"))\n// 2. 核心工具函数：预处理HTML（移除注释+清理空格）\nfunction cleanHtml(html) {\n    if (!html) return \"\";\n    // 步骤1：移除所有HTML注释（<!-- ... -->），彻底消除干扰\n    html = html.replace(/<!--[\\s\\S]*?-->/g, \"\");\n    // 步骤2：移除多余空白字符（换行、制表符等），简化匹配\n    html = html.replace(/\\s+/g, \" \");\n    return html;\n}\n\n// 3. 核心工具函数：提取单页的“序号数组”和“图片src数组”\nfunction extractPageData(cleanedHtml) {\n    var names = []; // 序号数组（001、002、003...）\n    var srcs = [];  // 图片src数组（与序号一一对应）\n\n    // 提取所有序号（<span class=\"name tb\">xxx</span>）\n    var nameRegex = /<span class=\"name tb\">([\\d]+)<\\/span>/g;\n    var nameMatch;\n    while ((nameMatch = nameRegex.exec(cleanedHtml)) !== null) {\n        names.push(nameMatch[1]);\n    }\n\n    // 提取所有有效图片src（与序号对应的img，alt包含“_序号”）\n    var srcRegex = /<img src=\"([^\"]+)\" alt=\"[^\"]+_([\\d]+)\"/g;\n    var srcMatch;\n    while ((srcMatch = srcRegex.exec(cleanedHtml)) !== null) {\n        // 确保src对应的序号在names数组中（避免无关图片）\n        if (names.includes(srcMatch[2])) {\n            srcs.push(srcMatch[1]);\n        }\n    }\n\n    return { names: names, srcs: srcs };\n}\n\n// 4. 执行多页提取\ntry {\n    for (var p = 0; p < nextPageUrl.length; p++) {\n        var pageUrl = nextPageUrl[p];\n        var pageNum = p + 1;\n\n        // 步骤1：获取并清理HTML（移除注释+多余空格）\n        var rawHtml = new String(java.ajax(pageUrl)) || \"\";\n        var cleanedHtml = cleanHtml(rawHtml);\n\n        // 步骤2：提取当前页的序号和src数组\n        var pageData = extractPageData(cleanedHtml);\n        var pageNames = pageData.names;\n        var pageSrcs = pageData.srcs;\n\n        // 步骤3：按索引配对（序号和src一一对应），避免漏配\n        var addedNum = 0;\n        for (var i = 0; i < pageNames.length; i++) {\n            var imgName = pageNames[i];\n            var imgSrc = pageSrcs[i] || \"\";\n            var imgExtension = \"\";\n\n            // 提取扩展名\n            if (imgSrc) {\n                var dotIndex = imgSrc.lastIndexOf(\".\");\n                if (dotIndex !== -1) {\n                    imgExtension = imgSrc.slice(dotIndex + 1).toLowerCase().split(/[?#]/)[0];\n                }\n            }\n\n            // 去重并添加到数组\n            if (imgName && imgExtension && !imgInfoList.some(item => item.imgName === imgName)) {\n                imgInfoList.push({ imgName: imgName, imgExtension: imgExtension });\n                addedNum++;\n            }\n        }\n\n    }\n} catch (e) {\n    java.log(\"提取报错：\" + e.message);\n}\n\nimgInfoList.sort((a, b) => parseInt(a.imgName) - parseInt(b.imgName));\n\n// 返回原结果，不影响目录列表\njava.put('imgInfoList',JSON.stringify(imgInfoList))\nresult;", "chapterName": "//li/text()@js:'全话阅读'", "chapterUrl": "//li//a/@href,{\"webView\":true}", "updateTime": "//li/div[@class='info']/div[@class='info_col']/text()"}, "searchUrl": "{{source.bookSourceUrl}}search/?q={{key}}&f=_all&s=create_time_DESC&syn=yes", "weight": 100},{"bookSourceComment": "完本神站（m.wanbenshenzhan.com）\n搜索通过搜搜书(sososhu.com)搜索引擎进行，需登录后使用。\n\n【技术实现】\n搜索：sososhu.com 搜索（GET /?s={{key}}&web=38kanshu）\n  - 搜索结果由 JS 从 Base64 编码的 JSON 动态渲染\n  - bookList 规则直接从 HTML 提取 Base64 数据并解码，不依赖 WebView\n  - 搜索结果链接指向 m.wanbenshenzhan.com\n发现：wanbenshenzhan.com 书库/排行榜（表格+卡片两种布局）\n详情：wanbenshenzhan.com CSS 选择器\n目录：wanbenshenzhan.com CSS 选择器（?chapter_page=N 分页）\n正文：wanbenshenzhan.com CSS 选择器\n\n【登录说明】\n- 登录需填写手机号、密码、图形验证码。\n- 点击「刷新验证码」会在浏览器中打开验证码图片，查看后返回输入。\n- 登录成功后自动保存 Cookie，后续请求自动携带。\n- 登出按钮可清除 Cookie 和登录状态。\n- ★ 「签 到」按钮：登录后点击即可完成每日签到，成功后 Toast 提示。\n- ★ 搜索时自动检测签到状态，若未签到则自动签到。\n\n【局限性】\n- 搜索需要登录：未登录访问搜索会跳转登录页，请先登录。\n- 搜索每账号每天限 8 次。\n- 搜索结果搜索次数提示会自动 Toast 显示剩余次数和签到状态。\n- 搜索结果 URL 中的 token 参数已自动去除，避免过期问题。", "bookSourceGroup": "AI,优质", "bookSourceName": "完本神站（登录）", "bookSourceType": 0, "bookSourceUrl": "https://m.wanbenshenzhan.com", "bookUrlPattern": "https://m\\.wanbenshenzhan\\.com/\\d+/", "customButton": false, "customOrder": 10, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "————————书库——————————\n全部::/all/0_lastupdate_0_0_{{page}}.html\n玄幻::/all/1_lastupdate_0_0_{{page}}.html\n奇幻::/all/2_lastupdate_0_0_{{page}}.html\n武侠::/all/3_lastupdate_0_0_{{page}}.html\n仙侠::/all/4_lastupdate_0_0_{{page}}.html\n都市::/all/5_lastupdate_0_0_{{page}}.html\n军事::/all/6_lastupdate_0_0_{{page}}.html\n历史::/all/7_lastupdate_0_0_{{page}}.html\n游戏::/all/8_lastupdate_0_0_{{page}}.html\n竞技::/all/9_lastupdate_0_0_{{page}}.html\n科幻::/all/10_lastupdate_0_0_{{page}}.html\n悬疑::/all/11_lastupdate_0_0_{{page}}.html\n灵异::/all/12_lastupdate_0_0_{{page}}.html\n————————言情——————————\n古代言情::/all/14_lastupdate_0_0_{{page}}.html\n仙侠奇缘::/all/15_lastupdate_0_0_{{page}}.html\n现代言情::/all/16_lastupdate_0_0_{{page}}.html\n浪漫青春::/all/17_lastupdate_0_0_{{page}}.html\n玄幻言情::/all/18_lastupdate_0_0_{{page}}.html\n悬疑灵异::/all/19_lastupdate_0_0_{{page}}.html\n科幻空间::/all/20_lastupdate_0_0_{{page}}.html\n游戏竞技::/all/21_lastupdate_0_0_{{page}}.html\nBL文::/all/22_lastupdate_0_0_{{page}}.html\nGL文::/all/23_lastupdate_0_0_{{page}}.html\n二次元::/all/24_lastupdate_0_0_{{page}}.html\n————————完本——————————\n完本全部::/all/0_lastupdate_1_0_{{page}}.html\n完本玄幻::/all/1_lastupdate_1_0_{{page}}.html\n完本仙侠::/all/4_lastupdate_1_0_{{page}}.html\n完本都市::/all/5_lastupdate_1_0_{{page}}.html\n完本历史::/all/7_lastupdate_1_0_{{page}}.html\n————————排行——————————\n点击榜::/top/allvisit.html\n周点击::/top/weekvisit.html\n收藏榜::/top/goodnum.html\n推荐榜::/top/allvote.html\n新书榜::/top/postdate.html\n更新榜::/top/lastupdate.html", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"}", "lastUpdateTime": "1785595334089", "loginUi": "[{\"name\": \"手机号\", \"type\": \"text\"}, {\"name\": \"密码\", \"type\": \"password\"}, {\"name\": \"验证码\", \"type\": \"text\"}, {\"name\": \"刷新验证码\", \"type\": \"button\", \"action\": \"refreshCaptcha()\"}, {\"name\": \"登 录\", \"type\": \"button\", \"action\": \"login(true)\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}}, {\"name\": \"登 出\", \"type\": \"button\", \"action\": \"logout()\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}}, {\"name\": \"签 到\", \"type\": \"button\", \"action\": \"checkin()\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}}]", "loginUrl": "function getBaseUrl() { return 'https://www.sososhu.com'; }\n\nfunction refreshCaptcha() {\n    var url = getBaseUrl() + '/?action=captcha_api&t=' + Math.random();\n    java.startBrowser(url, '验证码');\n}\n\nfunction login(b) {\n    if (b == undefined) return true;\n    var info = result;\n    var mobile = info['手机号'];\n    var password = info['密码'];\n    var captcha = info['验证码'];\n    if (!mobile || !password || !captcha) {\n        java.toast('请完整填写手机号、密码和验证码');\n        return;\n    }\n    var url = getBaseUrl() + '/?action=user_api&act=login';\n    var body = 'mobile=' + encodeURIComponent(mobile) + '&password=' + encodeURIComponent(password) + '&captcha=' + encodeURIComponent(captcha);\n    var post = JSON.stringify({\n        method: 'POST',\n        body: body,\n        headers: {\n            'Content-Type': 'application/x-www-form-urlencoded'\n        }\n    });\n    var resp = java.ajax(url + ',' + post);\n    try {\n        // 处理BOM字符\n        var respText = resp;\n        if (respText.charCodeAt(0) === 0xFEFF) respText = respText.substring(1);\n        var json = JSON.parse(respText);\n        if (json.code === 0) {\n            var cookieString = java.getCookie(getBaseUrl());\n            if (cookieString) {\n                source.putLoginHeader(cookieString);\n            }\n            java.toast('登录成功');\n        } else {\n            java.toast('登录失败：' + json.msg);\n            refreshCaptcha();\n        }\n    } catch(e) {\n        java.toast('登录异常：' + e.message);\n    }\n}\n\nfunction logout() {\n    source.removeLoginHeader();\n    cookie.removeCookie(getBaseUrl());\n    result['手机号'] = '';\n    result['密码'] = '';\n    result['验证码'] = '';\n    source.putLoginInfo(JSON.stringify(result));\n    java.toast('已登出');\n}\n\nfunction checkin() {\n    var url = getBaseUrl() + '/?action=user_api&act=sign_in';\n    var post = JSON.stringify({\n        method: 'POST',\n        headers: {\n            'Content-Type': 'application/x-www-form-urlencoded'\n        }\n    });\n    var resp = java.ajax(url + ',' + post);\n    try {\n        var respText = resp;\n        if (respText.charCodeAt(0) === 0xFEFF) respText = respText.substring(1);\n        var json = JSON.parse(respText);\n        if (json.code === 0) {\n            java.toast('✅ 签到成功：' + (json.msg || ''));\n        } else {\n            java.toast('❌ 签到失败：' + json.msg);\n        }\n    } catch(e) {\n        java.toast('签到异常：' + e.message);\n    }\n}", "respondTime": 180000, "ruleBookInfo": {"author": "class.book-meta@tag.span.0@text##作者：", "coverUrl": "class.book-cover-large@tag.img@src", "intro": "class.book-intro@tag.p@text", "kind": "class.book-meta@tag.span.1@text##分类：", "lastChapter": "class.latest-chapter-link@tag.a@text", "name": "class.book-info-detail@tag.h1@text##编辑", "wordCount": "class.book-meta@tag.span.3@text##字数："}, "ruleContent": {"content": "class.chapter-content@html##<p>【完本神站】[^<]*</p>|<p>\\s*</p>"}, "ruleExplore": {"author": "class.author@text||class.rank-book-info@class.meta@tag.span.0@text##作者：", "bookList": "class.data-table@tag.tbody@tag.tr||class.rank-item", "bookUrl": "class.book-name@tag.a@href||class.rank-cover@tag.a@href", "coverUrl": "class.rank-cover@tag.img@src", "intro": "class.desc@text", "kind": "class.sort@text##\\[|\\]||class.rank-book-info@class.meta@tag.span.1@text##分类：", "lastChapter": "class.chapter@tag.a@text||class.latest@tag.a@text", "name": "class.book-name@tag.a@text||class.rank-book-info@tag.h4@tag.a@text", "wordCount": "class.words@text"}, "ruleSearch": {"author": "class.book-meta@class.author@text##作者：", "bookList": "<js>\nvar doc = org.jsoup.Jsoup.parse(result);\nvar bodyText = doc.text();\n\n// 搜索次数检测\nif (bodyText.indexOf(\"已用完\") > -1) {\n    var match = bodyText.match(/(\\d+)次[\\/每]天/);\n    java.longToast(match ? \"⚠️ 今日搜索次数已用完（\" + match[1] + \"次/天），明天再来吧！\" : \"⚠️ 今日搜索次数已用完，明天再来吧！\");\n} else if (bodyText.indexOf(\"需要登录\") > -1 || result.indexOf(\"action=login\") > -1) {\n    java.longToast(\"⚠️ 未检测到登录状态，请先登录！\");\n} else {\n    // 从页面提取剩余搜索次数\n    var quotaEl = doc.select(\"#quota-remaining\");\n    if (quotaEl && quotaEl.size() > 0) {\n        var remaining = quotaEl.first().text();\n        // 尝试从 profile API 获取更详细的信息\n        try {\n            var profile = java.ajax(\"https://www.sososhu.com/?action=user_api&act=profile\");\n            // 处理BOM字符\n            if (profile.charCodeAt(0) === 0xFEFF) profile = profile.substring(1);\n            var pJson = JSON.parse(profile);\n            if (pJson.code === 0 && pJson.data) {\n                var d = pJson.data;\n                var signMsg = \"\";\n                if (!d.signedToday) {\n                    // 未签到，自动签到\n                    try {\n                        var signPost = JSON.stringify({method: \"POST\", headers: {\"Content-Type\": \"application/x-www-form-urlencoded\"}});\n                        var signResp = java.ajax(\"https://www.sososhu.com/?action=user_api&act=sign_in,\" + signPost);\n                        if (signResp.charCodeAt(0) === 0xFEFF) signResp = signResp.substring(1);\n                        var signJson = JSON.parse(signResp);\n                        signMsg = signJson.code === 0 ? \" | 已自动签到 ✅\" : \" | 签到失败: \" + signJson.msg;\n                    } catch(e2) {\n                        signMsg = \" | 自动签到异常\";\n                    }\n                } else {\n                    signMsg = \" | 今日已签到 ✅\";\n                }\n                java.longToast(\"🔍 今日剩余搜索: \" + d.searchRemaining + \"/\" + d.searchMax + \" 次\" + signMsg);\n            } else {\n                java.longToast(\"🔍 今日剩余搜索: \" + remaining + \" 次\");\n            }\n        } catch(e) {\n            java.longToast(\"🔍 今日剩余搜索: \" + remaining + \" 次\");\n        }\n    }\n}\n\n// 从HTML中提取Base64编码的书籍数据（不依赖WebView渲染）\nvar match = result.match(/var books = JSON\\.parse\\(d\\(\"([^\"]+)\"\\)\\)/);\nif (match) {\n    var b64 = match[1];\n    // 使用Legado的Base64解码（Android默认UTF-8）\n    var decoded = java.base64Decode(b64);\n    var books = JSON.parse(decoded);\n\n    // HTML转义函数\n    function esc(s) { return String(s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;'); }\n    // 构造HTML元素列表（用数组拼接，不用StringBuilder）\n    var htmlArr = [\"<html><body>\"];\n    for (var i = 0; i < books.length; i++) {\n        var b = books[i];\n        var cleanUrl = b.url.replace(/\\?token=.*$/, \"\");\n        var tag = b.fullflag ? '<span class=\"tag tag-end\">完结</span>' : '<span class=\"tag tag-serial\">连载</span>';\n        var lastHtml = b.lastchap ? '<p class=\"book-last\">最新：' + esc(b.lastchap) + '</p>' : '';\n        htmlArr.push('<div class=\"book-card\">');\n        htmlArr.push('<a href=\"' + cleanUrl + '\" class=\"book-cover\"><img src=\"' + b.cover + '\"></a>');\n        htmlArr.push('<div class=\"book-info\">');\n        htmlArr.push('<h3><a href=\"' + cleanUrl + '\">' + esc(b.name) + '</a>' + tag + '</h3>');\n        htmlArr.push('<p class=\"book-meta\"><span class=\"author\">作者：' + esc(b.author) + '</span>');\n        htmlArr.push('<span class=\"count\">' + b.chapters + '章 · ' + b.allvisit + '阅读</span></p>');\n        htmlArr.push('<p class=\"book-intro\">' + esc(b.intro) + '</p>');\n        htmlArr.push(lastHtml);\n        htmlArr.push('</div></div>');\n    }\n    htmlArr.push(\"</body></html>\");\n    org.jsoup.Jsoup.parse(htmlArr.join(\"\")).select(\"div.book-card\");\n} else {\n    // 如果Base64提取失败，尝试直接从DOM中查找（兼容WebView模式）\n    doc.select(\"div.book-card\");\n}\n</js>", "bookUrl": "class.book-info@tag.h3@tag.a@href##\\?token=.*$", "coverUrl": "class.book-cover@tag.img@src", "intro": "class.book-intro@text", "kind": "class.book-info@tag.h3@tag.span@text", "lastChapter": "class.book-last@text##最新：", "name": "class.book-info@tag.h3@tag.a@text", "wordCount": "class.book-meta@class.count@text##.*章 · |阅读"}, "ruleToc": {"chapterList": "id.chapter-list@class.chapter-list@tag.a", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": "text.下一页@href"}, "searchUrl": "<js>\nvar url = \"https://www.sososhu.com/?s=\" + encodeURIComponent(key) + \"&web=38kanshu\";\nif (page > 1) {\n    url += \"&page=\" + page;\n}\nurl;\n</js>", "weight": 0},{"bookSourceComment": "本源修改自 狼崽儿(langzaier)大佬😅\n更换线路 改成 点击按钮\n不知道为什么java.refreshBookToc()方法不生效\n切换线路后在详情页手动刷新一下\n刷新方法——详情页右上角三点第一个按钮", "bookSourceGroup": "🔞视频", "bookSourceName": "🔞漫蛙动漫", "bookSourceType": 4, "bookSourceUrl": "https://manwane.cc#大改", "customButton": false, "customOrder": 12, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\nconst host = cleanHost();\nconst list = [];\nconst push = (title, typeId, size) => {\n\t const tag = title == \"全部\" ? \"\" : title;\n  list.push({\n    title,\n    url: host + \"/api/cate/,\"+ JSON.stringify({\n        \"method\": \"POST\",\n        \"body\": `{\"page\":{\"page\":{{page}},\"pageSize\":36},\"category\":\"video\",\"sort\":0,\"comic\":{\"status\":-1,\"day\":0,\"year\":0,\"tag\":\"\"},\"video\":{\"year\":0,\"typeId\":${typeId},\"area\":\"\",\"lang\":\"\",\"status\":-1,\"tag\":\"${tag}\"},\"novel\":{\"status\":-1,\"day\":0,\"sortId\":0}}`,\n        \"headers\": {\n          \"Content-Type\": \"application/json\",\n          \"X-Requested-With\": \"XMLHttpRequest\",\n          \"User-Agent\": \"Mozilla/5.0 (Linux; Android 16; 25102RKBEC Build/BP2A.250605.031.A3) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/143.0.7499.192 Mobile Safari/537.36\",\n          \"Referer\": host + \"/cate/\"\n        }\n    }),\n    style: {\n        layout_flexGrow: 1,\n        layout_flexBasisPercent: size\n    }\n  })\n};\n\n// 分类\nconst types = [\"全部\", \"国产\", \"日韩\", \"欧美\", \"港台\", \"电影\", \"里番\"];\n// tag列表\nconst tags = [\"全部\", \"动画\", \"喜剧\", \"奇幻\", \"剧情\", \"冒险\", \"动作\", \"科幻\", \"爱情\", \"儿童\", \"短片\", \"家庭\", \"悬疑\", \"运动\"];\n\nconst type = infoMap[\"分类\"] || types[0];\nconst typeId = types.findIndex(t => t == type);\n\nlist.push({\n\t title: \"分类\",\n\t type: \"select\",\n\t action: \"java.refreshExplore()\",\n\t chars: types,\n\t default: type,\n\t style: {layout_flexBasisPercent: 1}\n})\n\ntags.forEach(tag => push(tag, typeId, 0.29))\n\nJSON.stringify(list);", "header": "{  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 8.1.0; JKM-AL00b Build/HUAWEIJKM-AL00b; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044807 Mobile Safari/537.36\"}", "jsLib": "function cleanHost(){\n\t return this.java.toURL(this.source.key).origin\n}", "lastUpdateTime": "1785591386308", "loginUrl": "/", "respondTime": 8118, "ruleBookInfo": {"author": ":contains(导演：) > span@text", "coverUrl": ".comic-cover@src", "intro": "<js>\nlet info = java.getString(\"@@.comic-info@html\");\nlet desc = java.getString(\"@@.comic-desc@textNodes\");\nlet episodes = java.getString(\"@@.episode-group@all\");\n\nlet options = java.getElements(\"option\");\nlet buttons = [];\noptions.forEach(opt => {\n  let title = opt.text().trim();\n  let id = opt.attr(\"value\");\n  buttons.push(`<button onclick=\"set(${id});java.refreshBookToc();\">${title}</button>`)\n});\nlet cacheKey = String(book.name);\n\nlet html = `\n  <useweb>\n    <head>\n      <style>\n.btn {\n  display: flex;\n  gap: 10px;\n  margin: 20px;\n}\n.btn button {\n  flex: 1;\n  padding: 10px 0;\n  border: none;\n  background: #409eff;\n  color: #fff;\n  border-radius: 4px;\n  cursor: pointer;\n}\n.btn button.active-btn {\n  background: #2b7cd3;\n}\n      </style>\n    </head>\n    <body>\n      <div class=\"btn\">${buttons.join(\"\")}</div>\n      ${info}<br>\n      <div class=\"desc\">简介：${desc}</div>\n      <div hidden>${episodes}</div>\n      <script>\n        function set(index) {\n          let allGroups = document.querySelectorAll('.episode-group');\n          let line = \"grid-\" + index;\n          cache.putMemory('${cacheKey}', line);\n          let btns = document.querySelectorAll('.btn button');\n          btns.forEach(btn => btn.classList.remove('active-btn'));\n          btns[index].classList.add('active-btn');\n          java.toast('线路切换成功');\n        }\n      </script>\n    </body>\n  </useweb>\n`;\nhtml\n</js>", "kind": ".comic-tags .tag@text", "name": ".comic-title@text", "tocUrl": "@js:\nlet gridId = cache.getFromMemory(String(book.name));\nif(!gridId) gridId = \"grid-0\";\n`data:;base64,${java.base64Encode(gridId)},{\"type\":\"jpg\"}`"}, "ruleContent": {"content": "@js:\nlet playerUrl = java.getString(\"@@iframe@src\");\nString(playerUrl).replace(/^.*url=/, '');"}, "ruleExplore": {"author": "$.author", "bookList": "$.data.list", "bookUrl": "$.url", "coverUrl": "$.pic", "intro": "$.intro", "kind": "$.tags", "name": "$.title"}, "ruleSearch": {"author": "$.author", "bookList": "$.data.list", "bookUrl": "$.url", "coverUrl": "$.cover", "intro": "$.description", "kind": "$.tags", "name": "$.title"}, "ruleToc": {"chapterList": "@js:\nlet line = java.hexDecodeToString(result);\n//if(!line) line = \"grid-0\";\njava.toast(\"当前线路：\"+line);\n\njava.setContent(book.intro);\njava.getElements(`@@#${line} .episode-item`)", "chapterName": "text", "chapterUrl": "href##^##{{cleanHost()}}"}, "searchUrl": "/api/search?type=mh&page={{page}}&pageSize=20&keyword={{key}}", "weight": 0},{"bookSourceName": "69 成人小說網", "bookSourceUrl": "https://69story.com", "bookSourceType": 0, "bookSourceGroup": "自制,小说,繁体", "bookSourceComment": "2026-08-01 按 69story.com 当前 HTML 结构编写。站点普通搜索、REST API、RSS 搜索均不可用或不按关键词过滤，因此本书源只启用发现/分类/正文，不启用阅读 App 全局搜索。", "enabled": true, "enabledExplore": true, "enabledCookieJar": true, "header": "{\"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120 Safari/537.36\",\"Accept-Language\":\"zh-TW,zh;q=0.9\"}", "lastUpdateTime": "1785587184372", "weight": 0, "exploreUrl": "最新::https://69story.com/page/{{page}}\n人妻熟女::https://69story.com/wife/page/{{page}}\n學生校園::https://69story.com/school/page/{{page}}\n家庭亂倫::https://69story.com/family/page/{{page}}\n強暴虐待::https://69story.com/bdsm-abuse/page/{{page}}\n都市生活::https://69story.com/sex-in-the-city/page/{{page}}\n主題-人妻::https://69story.com/topic/%e8%80%81%e5%a9%86/page/{{page}}\n主題-學生::https://69story.com/topic/%e5%ad%b8%e7%94%9f/page/{{page}}\n主題-第一次::https://69story.com/topic/%e7%ac%ac%e4%b8%80%e6%ac%a1/page/{{page}}", "ruleExplore": {"bookList": "@css:tr.post", "name": "@css:td.entry-content a[rel=bookmark]@text##\\s*/\\s*.*$##", "author": "69 成人小說網", "kind": "@css:td.entry-header small a@text", "intro": "@css:td.entry-content a[rel=bookmark]@text", "bookUrl": "@css:td.entry-content a[rel=bookmark]@href"}, "ruleBookInfo": {"name": "@css:h1.entry-title@text", "author": "69 成人小說網", "kind": "@css:ul.cat-list-icon a@text&&@css:ul.tag-list-icon a@text", "intro": "@css:meta[name=description]@content", "tocUrl": "@js:baseUrl"}, "ruleToc": {"chapterList": "@css:article", "chapterName": "@css:h1.entry-title@text", "chapterUrl": "@js:baseUrl"}, "ruleContent": {"title": "@css:h1.entry-title@text", "content": "@css:.entry-content p@text##The post[\\s\\S]*$##", "nextContentUrl": ""}},{"bookSourceComment": "1. 新增： 触发限流后，弹框在内置浏览器中进行验证码或登录等操作后，刷新页面重新加载内容", "bookSourceGroup": "R18", "bookSourceName": "🌸搬山人小说网", "bookSourceType": 0, "bookSourceUrl": "https://www.banshanren.com/", "concurrentRate": "1000", "customButton": false, "customOrder": 459, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "[\n{\n    \"title\": \"年排行\",\n    \"url\": \"https://www.banshanren.com/api/rank?range=3\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n{\n    \"title\": \"月排行\",\n    \"url\": \"https://www.banshanren.com/api/rank?range=2\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n{\n    \"title\": \"周排行\",\n    \"url\": \"https://www.banshanren.com/api/rank?range=1\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n  {\n    \"title\": \"浏览量\",\n    \"url\": \"https://www.banshanren.com/all/0-0-0-0-0-0-3-1/\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n{\n    \"title\": \"收藏榜\",\n    \"url\": \"https://www.banshanren.com/api/rank?range=5\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n{\n    \"title\": \"新作榜\",\n    \"url\": \"https://www.banshanren.com/api/rank?range=4\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  }\n]", "header": "{\n \"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36\",\n\"Referer\":\"https://www.banshanren.com/\"\n}", "lastUpdateTime": "1785587221028", "loginUrl": "https://www.banshanren.com", "respondTime": 180000, "ruleBookInfo": {"author": "//div[@class='novel_brief_box']/div[@class='novel_title_box']/div[@class='info_box'][2]/span/text()", "coverUrl": "//div[@class='novel_brief_box']/div[@class='cover_box']/img/@data-src@js:\n(function(){\nif (!result) return '';\ntry {\nvar client = new Packages.okhttp3.OkHttpClient();\nvar request = new Packages.okhttp3.Request.Builder()\n    .url(result)\n    .header('Referer', 'https://www.banshanren.com/')\n    .header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36')\n    .build();\nvar response = client.newCall(request).execute();\nif (!response.isSuccessful()) return '';\nvar raw = response.body().bytes();\nif (raw.length < 32) return '';\nvar iv = Packages.java.util.Arrays.copyOfRange(raw, 0, 16);\nvar ct = Packages.java.util.Arrays.copyOfRange(raw, 16, raw.length);\nvar keyBytes = new Packages.java.lang.String('V4@.Tx+uXZn)AiH>').getBytes('UTF-8');\nvar keySpec = new Packages.javax.crypto.spec.SecretKeySpec(keyBytes, 'AES');\nvar ivSpec = new Packages.javax.crypto.spec.IvParameterSpec(iv);\nvar cipher = Packages.javax.crypto.Cipher.getInstance('AES/CBC/PKCS5Padding');\ncipher.init(Packages.javax.crypto.Cipher.DECRYPT_MODE, keySpec, ivSpec);\nvar decrypted = cipher.doFinal(ct);\nvar base64 = Packages.java.util.Base64.getEncoder().encodeToString(decrypted);\nreturn 'data:image/webp;base64,' + base64;\n} catch(e) {\nreturn '';\n}\n})();", "intro": "//div[@class='novel_brief_box']/div[@class='novel_title_box']/div[@class='novel_intro_box pc']/p[1]/text()", "kind": "//div[@class='novel_brief_box']/div[@class='novel_title_box']/ul[@class='novel_tag_list pc']/li/a/@title", "lastChapter": "//div[@class='catalog_box']/div[@class='catalog_top_box']/div[1]/p[1]/span[@class='hl']/text()", "name": "//div[@class='novel_brief_box']/div[@class='novel_title_box']/h1/text()", "wordCount": "//div[@class='novel_brief_box']/div[@class='novel_title_box']/div[@class='novel_summary_box pc']/div[4]/p/b/text()"}, "ruleContent": {"content": "<js>\nvar html = String(result);\nvar limited = /limit_box|访问异常/.test(html);\nif (limited) {\n    html = String(java.startBrowserAwait(String(baseUrl), \"检测到限流，请处理\"));\n}\nvar doc = org.jsoup.Jsoup.parse(html);\nvar ps = doc.select(\"div.chapter_content_box p\");\nvar arr = [];\nfor (var i = 0; i < ps.size(); i++) {\n    arr.push(ps.get(i).text());\n}\nresult = arr.join(\"\\n\");\n</js>"}, "ruleExplore": {"author": "$.authors", "bookList": "$.model", "bookUrl": "@js:\n\"https://www.banshanren.com/novel/{{$.slug}}\"", "intro": "$.description", "kind": "$.tagNames", "lastChapter": "$.latestUpdate", "name": "$.title", "wordCount": "$.wordCountFormat"}, "ruleSearch": {"author": "//div[@class='title_box']/div[@class='info_box'][2]/text()@js:\nresult.split('·')[0].trim()", "bookList": "//ul[@class='novel_list']/li[@class='novel_li']", "bookUrl": "//div[@class='title_box']/a[@class='title']/@href", "checkKeyWord": "琼明神女录", "intro": "//div[@class='title_box']/div[@class='novel_intro_box']/p", "kind": "//div[@class='title_box']/ul[@class='category_list']/li/a/@title", "name": "//div[@class='title_box']/a[@class='title']/text()"}, "ruleToc": {"chapterList": "//div[@class='catalog_box']/div[@class='volume_box']/ul/li[.//a]", "chapterName": "//a/@title", "chapterUrl": "//a/@href", "updateTime": "//p/text()"}, "searchUrl": "https://www.banshanren.com/search/index?keyword={{key}}", "weight": 0},{"bookSourceName": "禁忌书屋", "bookSourceUrl": "https://www.cool18.com/bbs4", "bookSourceType": 0, "bookSourceGroup": "自制,论坛,小说", "bookSourceComment": "2026-08-01 按 cool18.com/bbs4 当前 HTML 结构编写。该站是论坛结构，本书源按“一个帖子=一本单章书”处理，不自动合并同系列多帖。", "enabled": true, "enabledExplore": true, "enabledCookieJar": true, "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 12; Mobile) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120 Mobile Safari/537.36\",\"Accept-Language\":\"zh-CN,zh;q=0.9\"}", "lastUpdateTime": "1785587142391", "weight": 0, "loginUrl": "https://www.cool18.com/pub_page/index.php?action=login", "searchUrl": "https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&keywords={{java.encodeURI(key)}}&submit=%E6%9F%A5%E8%AF%A2&p={{page}}", "exploreUrl": "都市::https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&type=%E9%83%BD%E5%B8%82&submit=%E6%9F%A5%E8%AF%A2&p={{page}}\n校园::https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&type=%E6%A0%A1%E5%9B%AD&submit=%E6%9F%A5%E8%AF%A2&p={{page}}\n乡野::https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&type=%E4%B9%A1%E9%87%8E&submit=%E6%9F%A5%E8%AF%A2&p={{page}}\n古风::https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&type=%E5%8F%A4%E9%A3%8E&submit=%E6%9F%A5%E8%AF%A2&p={{page}}\n异国::https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&type=%E5%BC%82%E5%9B%BD&submit=%E6%9F%A5%E8%AF%A2&p={{page}}\n玄幻::https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&type=%E7%8E%84%E5%B9%BB&submit=%E6%9F%A5%E8%AF%A2&p={{page}}\n红绿::https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&type=%E7%BA%A2%E7%BB%BF&submit=%E6%9F%A5%E8%AF%A2&p={{page}}\n伦理::https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&type=%E4%BC%A6%E7%90%86&submit=%E6%9F%A5%E8%AF%A2&p={{page}}\n独爱::https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&type=%E7%8B%AC%E7%88%B1&submit=%E6%9F%A5%E8%AF%A2&p={{page}}\n暴虐::https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&type=%E6%9A%B4%E8%99%90&submit=%E6%9F%A5%E8%AF%A2&p={{page}}\n摄心::https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&type=%E6%91%84%E5%BF%83&submit=%E6%9F%A5%E8%AF%A2&p={{page}}\n其他::https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&type=%E5%85%B6%E4%BB%96&submit=%E6%9F%A5%E8%AF%A2&p={{page}}\n精华热帖::https://www.cool18.com/bbs4/index.php?app=forum&act=gold&p={{page}}\n人气热帖::https://www.cool18.com/bbs4/index.php?app=forum&act=hot&p={{page}}", "ruleSearch": {"bookList": "@css:.thread-list li", "name": "@css:a@text", "author": "@css:font@text", "kind": "禁忌书屋", "lastUpdateTime": "@css:i@text", "intro": "@css:a@text", "bookUrl": "@css:a@href"}, "ruleExplore": {"bookList": "@css:.thread-list li", "name": "@css:a@text", "author": "@css:font@text", "kind": "禁忌书屋", "lastUpdateTime": "@css:i@text", "intro": "@css:a@text", "bookUrl": "@css:a@href"}, "ruleBookInfo": {"name": "@css:.main-title@text", "author": "@css:meta[name=author]@content", "kind": "论坛帖子", "intro": "@css:meta[name=description]@content", "tocUrl": "@js:baseUrl"}, "ruleToc": {"chapterList": "@css:.title-section", "chapterName": "@css:.main-title@text", "chapterUrl": "@js:baseUrl"}, "ruleContent": {"title": "@css:.main-title@text", "content": "@css:#content-section pre@text##\\n{3,}##\\n\\n", "nextContentUrl": ""}},{"bookSourceComment": "by狼崽儿 //2026.7.1\n有些资源只有一条线路，所以单线路时换线路没有用。\n修改了目录列表，确保能正确换线路。//2026.7.6\n\n2026.8.1\n如果网站失效，就去该漫蛙的发布页https://ManWaLa.CC/进去任一漫画网站再跳到动漫网页，获取最新网站更新源域名即可。\n套了第三方播放器，不依赖阅读自身的解析能力，提高了播放链接的播放成功率。以下是只给出M3U8直链文本而不拉起播放器的正文规则，直接复制粘贴即可。\n@js:\nvar iframe = src.match(/<iframe[^>]*src=\"([^\"]+)\"/);\nvar videoUrl = '';\nif (iframe) {\n  var m = iframe[1].match(/[?&]url=([^&]+)/);\n  if (m) {\n    videoUrl = decodeURIComponent(m[1]);\n  }\n}\nresult = videoUrl;\n\n如果想优先播放直链，就把原正文规则的java.startBrowser(playUrl, book.name + ' - ' + chapter.title);改成java.startBrowser(videoUrl || playerUrl, book.name + ' - ' + chapter.title);", "bookSourceName": "🌟漫蛙动漫🔞", "bookSourceType": 0, "bookSourceUrl": "https://manwane.cc", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "@js:\nvar result = [];\nvar push = (title, typeId, tag, size) => result.push({\n    title: title,\n    url: \"/api/cate/,\" + JSON.stringify({\n        \"body\": \"{\\\"page\\\":{\\\"page\\\":{{page}},\\\"pageSize\\\":36},\\\"category\\\":\\\"video\\\",\\\"sort\\\":0,\\\"comic\\\":{\\\"status\\\":-1,\\\"day\\\":0,\\\"year\\\":0,\\\"tag\\\":\\\"\\\"},\\\"video\\\":{\\\"typeId\\\":\" + typeId + \",\\\"tag\\\":\\\"\" + tag + \"\\\",\\\"area\\\":\\\"\\\",\\\"lang\\\":\\\"\\\",\\\"status\\\":-1,\\\"year\\\":0},\\\"novel\\\":{\\\"status\\\":-1,\\\"day\\\":0,\\\"sortId\\\":0}}\",\n        \"method\": \"POST\"\n    }),\n    style: {\n        layout_flexGrow: 1,\n        layout_flexBasisPercent: size\n    }\n});\n\n// typeId名称映射\nvar types = [\"\", \"国产\", \"日韩\", \"欧美\", \"港台\", \"电影\", \"里番\"];\n// 全部tag列表（含空=全部）\nvar tags = [\"全部\", \"动画\", \"喜剧\", \"奇幻\", \"剧情\", \"冒险\", \"动作\", \"科幻\", \"爱情\", \"儿童\", \"短片\", \"家庭\", \"悬疑\", \"运动\"];\n\nfor (var t = 1; t <= 6; t++) {\n    for (var g = 0; g < tags.length; g++) {\n        var title = types[t] + '-' + tags[g];\n        var tag = (g === 0) ? '' : tags[g];\n        var size = (g === 0) ? 1 : 0.25;\n        push(title, t, tag, size);\n    }\n}\n\nJSON.stringify(result);", "header": "{  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 8.1.0; JKM-AL00b Build/HUAWEIJKM-AL00b; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044807 Mobile Safari/537.36\"}", "lastUpdateTime": "1785556734823", "loginUi": "", "respondTime": 4885, "ruleBookInfo": {"author": "@js:var m=src.match(new RegExp('导演：<span>([^<]+)</span>'));result=m?m[1]:'';", "coverUrl": ".comic-cover@src", "intro": "<js>\nfunction d(s) {\n  return s.replace(/&#x([0-9a-f]+);/gi, function(_, h) {\n    return String.fromCharCode(parseInt(h, 16));\n  });\n}\nvar m0 = src.match(/option value=\"0\">\\s*([^<]+)\\s*<\\//);\nvar m1 = src.match(/option value=\"1\">\\s*([^<]+)\\s*<\\//);\nvar name0 = m0 ? d(m0[1].trim()) : '线路0';\nvar name1 = m1 ? d(m1[1].trim()) : '线路1';\nvar xu = (book.getVariable('custom') != null && book.getVariable('custom') != '') ? book.getVariable('custom') : '0';\njava.put('custom', xu);\nvar descM = src.match(/comic-desc[^>]*>([\\s\\S]*?)<div\\s/);\nvar dsc = descM ? descM[1].replace(/<[^>]+>/g,'').trim() : '';\nresult = '【线路列表】(右上角书籍变量输入序号刷新切换)\\n◖0◗' + name0 + '\\n◖1◗' + name1 + '\\n当前来源◖' + xu + '◗\\n------------\\n' + dsc;\n</js>", "kind": "@js:var tags=[];var re=new RegExp('<span class=\\\"tag\\\">([^<]+)</span>','g');var m;while((m=re.exec(src))!==null){tags.push(m[1]);}result=tags.join(',');", "name": ".comic-title@text", "tocUrl": "@js:\nbook.tocUrl"}, "ruleContent": {"content": "@js:\nvar iframe = src.match(/<iframe[^>]*src=\"([^\"]+)\"/);\nvar playerUrl = '';\nvar videoUrl = '';\nif (iframe) {\n  playerUrl = iframe[1];\n  var m = iframe[1].match(/[?&]url=([^&]+)/);\n  if (m) { videoUrl = decodeURIComponent(m[1]); }\n}\n// 优先播放器地址，没有再播直链\nvar playUrl = playerUrl || videoUrl;\nif (playUrl) {\n  java.startBrowser(playUrl, book.name + ' - ' + chapter.title);\n  java.toast('正在播放');\n}\nresult = '【刷新正文】播放器:' + String.fromCharCode(10) + playerUrl + String.fromCharCode(10, 10) + '直链:' + String.fromCharCode(10) + videoUrl;"}, "ruleExplore": {"author": "$.author", "bookList": "$.data.list", "bookUrl": "$.url", "coverUrl": "$.pic", "intro": "$.intro", "kind": "$.tags", "name": "$.title"}, "ruleSearch": {"author": "$.author", "bookList": "$.data.list", "bookUrl": "$.url", "coverUrl": "$.cover", "intro": "$.description", "kind": "$.tags", "name": "$.title"}, "ruleToc": {"chapterList": "@js:\nvar m = String(book.intro).match(/来源◖(\\d+)◗/);\nvar xu = (m && m[1]) ? m[1] : '0';\nvar gridId = (xu === '1') ? 'grid-1' : 'grid-0';\nvar start = src.indexOf('<div id=\"' + gridId + '\"');\nvar end = src.indexOf('<div id=\"grid-', start + 10);\nif (end < 0) { end = src.indexOf('<script', start + 10); }\nif (end < 0) { end = src.length; }\nvar block = src.substring(start, end);\nvar list = [];\nvar re = new RegExp('<a href=\"(/video/\\\\d+/\\\\d+)\"[^>]*class=\"episode-item\"[^>]*>\\\\s*([^<]+)\\\\s*</a>', 'g');\nvar m;\nwhile ((m = re.exec(block)) !== null) {\n  list.push({ text: m[2].trim(), href: m[1] });\n}\nlist", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "/api/search?type=mh&page={{page}}&pageSize=20&keyword={{key}}", "weight": 0},{"bookSourceComment": "更新日志请点击登录，更新书源中查看\n\n基础使用教程：\n1、搜索：\n    1)基础搜索：在发现页长按该书源，点击搜索，直接搜，搜索范围(全部来源小说)\n    2)进阶搜索：在登陆-书源设置中选择指定模式/来源，可搜索指定模式/来源内容\n    3)快捷搜索：使用特殊关键词(x,t,m,d,@)搜索\n         x:书名@来源  如(x:十日终焉@番茄)\n         t:书名@来源  如(t:十日终焉@番茄)\n         m:书名@来源  如(m:十日终焉@番茄)\n         d:书名@来源  如(d:十日终焉@番茄)\n         其中：x表示小说(可省略)，t表示听书，m表示漫画，d表示短剧\n         冒号支持中文英文\n         \n2、发现页：\n    在书源设置中选择指定模式或者单个来源，然后刷新发现页即可\n    \n3、更多使用方式长按发现页书源选择登录一目了然\n4、用户后台有视频教程\n         ", "bookSourceGroup": "大灰狼聚合", "bookSourceName": "🍅大灰狼聚合5.7.31.2(vip完全版)", "bookSourceType": 0, "bookSourceUrl": "大灰狼融合VIP5.0", "bookUrlPattern": "https?:\\/\\/(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z0-9-]+(?::\\d+)?\\/detail.*", "customButton": false, "customOrder": 5, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>\nvar open_argument = source.getVariable();\nif (!open_argument || open_argument == '') {\n    var initData = {\n        tab: \"小说\",\n        tone_id: \"默认音色\",\n        server: host[0],\n        sources: \"番茄\",\n        source_type: \"男频\",\n        find_source: \"番茄\",\n        find_tab: \"小说\",\n        fqpara: \"on\",\n        fqcommunity: \"on\"\n    };\n    source.setVariable(JSON.stringify(initData));\n    open_argument = source.getVariable();\n}\nvar base_url = getArguments(open_argument, 'server') || host[0];\nvar ms = getArguments(open_argument, 'tone_id') || '';\nvar source_type = getArguments(open_argument, 'source_type') || '男频';\nvar tab = getArguments(open_argument, 'find_tab') || getArguments(open_argument, 'tab') || '小说';\nvar sources =  getArguments(open_argument, 'sources') || '番茄';\nvar fxyjr = getArguments(open_argument, 'fxyjr');\n\n\nfunction checkEnv() {\n    let isModified = false;\n    try {\n        new Packages.io.legato.kazusa.utils.TimeoutCancellationException('');\n        isModified = true;\n    } catch (e) {\n        isModified = typeof source.loginUi == 'function' ? false : true;\n    }\n\n    return isModified;\n}\n\nvar islyc = checkEnv();\nlet device_type = '安卓';\ntry {\n\t  try {\n\t  java.qread();\n\t  device_type =\"轻阅读\";\n\t  } catch {\n\t  \tjava.deviceID();\n    device_type = \"苹果\";\n\t  \t}\n    \n} catch (e) {\n    try {\n        java.androidId();\n        device_type = \"安卓\";\n    } catch (e) {\n        device_type = \"安卓\";\n    }\n}\n\nif (((islyc&&device_type!='苹果') || device_type=='轻阅读') && fxyjr != \"on\"){\n\tsources = getArguments(open_argument, 'find_source') || sources;\n\tsetArguments('find_source', sources);\n\t}\nvar sdtoken;\ntry {\n    var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n    sdtoken = String(loginInfoMap['手动填写番茄token(可不填)'] || '');\n} catch (e) {\n    sdtoken = '';\n}\n\nvar rawCookie = getFanqieCookie() || sdtoken;\nvar match = rawCookie.match(/sessionid=[^;]+/);\nvar fqcookie = match ? match[0] : '';\nvar fqssionid = '';\nif (!fqcookie && (sources == '番茄' || sources == '全部')) {\n    java.toast('您还未登陆番茄账号，无法同步数据哦！');\n} else {\n    fqssionid = getSessionId(fqcookie)\n}\nvar fqsjurl = base_url + \"/bookshelf?page={{page}}&ssionid=\" + fqssionid;\nvar fqtjurl = base_url + \"/fqrecommend?page={{page}}&ssionid=\" + fqssionid;\nvar fqlsurl = base_url + \"/fqhistory?page={{page}}&ssionid=\" + fqssionid;\n\nvar groupDatas = [];\nvar infoData = [ ];\nif (sources == '番茄' || sources == '全部') {\ninfoData = [{\n        \"title\": \"登录番茄\",\n        \"url\": '{\\{java.startBrowser(\"https://fanqienovel.com/\",\"番茄登录\");}}',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.45\n        }\n    }];\n}\n\nvar hasValidCookie = fqcookie.length > 0;\n\nif (hasValidCookie && (sources == '番茄' || sources == '全部')) {\n    function groupQuery() {\n        try {\n            var url = base_url + \"/group_name?ssionid=\" + fqssionid;\n            var res = java.ajax(url);\n            var response = JSON.parse(res);\n\n            if (!(response && response.data)) {}\n\n            response.data.forEach(function(group) {\n                var keys = Object.keys(group);\n                if (keys.length > 0) {\n                    var key = keys[0];\n                    var value = group[key];\n                    if (value && value.length) {\n                        var option = {\n                            \"method\": \"POST\",\n                            \"body\": {\n                                \"book_ids\": value,\n                                \"page\": \"{{page}}\"\n                            }\n                        };\n                        groupDatas.push({\n                            title: key,\n                            url: base_url + \"/bookshelf,\" + JSON.stringify(option),\n                            style: {\n                                layout_flexGrow: 1,\n                                layout_flexBasisPercent: 0.45\n                            }\n                        });\n                    }\n                }\n            });\n\n            if (groupDatas.length % 2 !== 0) {\n                groupDatas.push({\n                    title: \"--\",\n                    url: \"\",\n                    style: {\n                        layout_flexGrow: 1,\n                        layout_flexBasisPercent: 0.45\n                    }\n                });\n            }\n        } catch (e) {\n            java.longToast(\"番茄登录过期，已隐藏番茄书架\" + fqssionid);\n        }\n    }\n\n    try {\n        java.longToast(\"正在加载分组数据...\");\n        var userUrl = base_url + \"/fquser?ssionid=\" + fqssionid;\n        var userRes = java.ajax(userUrl);\n        var userData = JSON.parse(userRes);\n\n        var userName = (userData && userData.data && userData.data.name) ? userData.data.name : '未知用户';\n        if (!userName.includes('未知用户')) {\n            infoData = [{\n                title: \"番茄个人中心\",\n                url: fqsjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }, {\n                title: \"个性推荐(番茄)\",\n                url: fqtjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }, {\n                title: \"历史阅读(番茄)\",\n                url: fqlsurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.45\n                }\n            }];\n        }\n        groupQuery();\n    } catch (e) {\n        java.longToast(\"番茄登录过期，已隐藏番茄书架\");\n    }\n}\n\nvar style_list = [];\ntry {\n    var durl = `${base_url}/discovestyle?source=${sources}&source_type=${source_type}&tab=${tab}`;\n    var res = java.ajax(durl);\n    var result = JSON.parse(res);\n    style_list = result.data || [];\n    if (result.msg) {\n        java.toast(result.msg);\n    }\n} catch (e) {\n    java.toast(\"发现样式获取失败\");\n}\nlet qtcookie = cookie.getCookie(base_url);\n//let qtcookie = \"\"\nlet qtop = {\n    method: \"GET\",\n    headers: {\n        cookie: qtcookie\n    },\n};\n\n\n\nqtop = JSON.stringify(qtop);\nlet qtsjurl = base_url + '/get_book_shelf,' + qtop;\n\nlet qtsj = [];\n\nif (((islyc&&device_type!='苹果') || device_type=='轻阅读') && fxyjr !=\"on\") {\n    try {\n        qtsj.push(createFilter(\n            \"线路\",\n            host,\n            base_url,\n            \"server\",\n            1\n        ));\n        qtsj.push(createFilter(\n            \"模式\",\n            [\"小说\", \"听书\", \"短剧\", \"漫画\"],\n            tab,\n            \"find_tab\",\n            0.33\n        ));\n        qtsj.push(createFilter(\n            \"频道\",\n            [\"男频\", \"女频\"],\n            source_type,\n            \"source_type\",\n            0.33\n        ));\n        let source_list = ['番茄', '七猫', '书旗', '塔读', '江湖', '小米', '米读', 'QQ阅读', '酷我小说','幻梦轻小说', '西瓜小说', '69书吧', '顶点', '爱下电子书', '伪69', '超会专属小说', '3A小说', '阅友小说', '笔趣阁22', '追更人', '久久小说', '52书库', '腐小说', '完本小说', '盐选文库', '有度中文', '三零读书', '鹿鹿', '星空小说', '365小说', '冷冷文学', '万相书城', '独步小说', '福书网', '速读谷', '全本同人'];\n        if (tab == '听书') {\n            source_list = ['番茄', '七猫', '喜马拉雅', '酷我'];\n        }\n        if (tab == '漫画') {\n            source_list = ['全免漫画', '番茄', '漫画屋', '漫画网', '漫客栈', '鸟韩漫', '新新漫画', '武芊漫画', '拷贝漫画', '漫画屋'];\n        }\n        if (tab == '短剧') {\n            source_list = ['番茄', 'YY短剧', '东梨短剧', '星芽短剧', '极速影视'];\n        }\n        qtsj.push(createFilter(\n            \"平台\",\n            source_list,\n            sources,\n            \"find_source\",\n            1\n        ));\n       const excludeTitles = ['点击登录可切换来源', '切换后长按刷新即可'];\n       style_list = style_list.filter(item => !excludeTitles.includes(item.title));\n    } catch {}\n} else {\n\tif (device_type == '安卓'){\n\tqtsj.push({\n        \"title\": \"下载阅读Sigma最新测试版\",\n        \"url\": '{\\{java.longToast(\"本书源推荐使用最新版洛娅橙改版阅读Σ\\\\n请安装后重新导入书源\");java.startBrowser(\"https://legado.langge.cf\",\"下载阅读Sigma最新测试版\");}}',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    })}\n\t}\n\nif (qtcookie) {\nqtsj.push({\n    title: \"大灰狼个人中心\",\n    url: qtsjurl,\n    style: {\n        layout_flexGrow: 1,\n        layout_flexBasisPercent: 0.45\n    }\n})\n} else {\nqtsj.push({\n    title: \"登录大灰狼书源\",\n    url: `{\\{java.startBrowser(\"${base_url}/login\",\"登录书源\");}}`,\n    style: {\n        layout_flexGrow: 1,\n        layout_flexBasisPercent: 0.45\n    }\n})\n}\n\n\nvar finalData = infoData.concat(groupDatas, style_list);\nfinalData = qtsj.concat(finalData);\nJSON.stringify(finalData);\n</js>", "header": "{ \"User-Agent\":\"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Mobile Safari/537.36 Edg/138.0.0.0\" }", "jsLib": "var host = [\n    'https://v2.czyl.cf',\n    'https://api.langge.cf',\n    'http://219.154.201.122:5006',\n    'https://20.langge.tk',\n    'https://v4.czyl.cf',\n    'https://v5.czyl.cf',\n    'https://v7.czyl.cf',\n    'https://v8.czyl.cf',\n    'https://v9.czyl.cf',\n    'https://v10.czyl.cf'\n];\n\nfunction getArguments(open_argument, key) {\n    try {\n        open_argument = JSON.parse(open_argument);\n    } catch (e) {\n        open_argument = {\n            tab: \"小说\",\n            tone_id: \"默认音色\",\n            server: host[0],\n            sources: \"全部\",\n            source_type: \"男频\",\n            fqpara: \"on\",\n            fqcommunity: \"on\",\n        };\n    }\n    // 旧版本没有保存 fqpara 字段；缺失时按“开启”处理。\n    // 用户明确选择 off 时仍然保留关闭状态。\n    if (open_argument.fqpara === undefined || open_argument.fqpara === null || open_argument.fqpara === '') {\n        open_argument.fqpara = 'on';\n    }\n    if (key) {\n        return open_argument[key];\n    } else {\n        return open_argument;\n    }\n}\n\nfunction setArguments(key, value) {\n    const {\n        source\n    } = this;\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    open_argument[key] = value;\n    open_argument = JSON.stringify(open_argument);\n    source.setVariable(open_argument);\n    return open_argument;\n}\n\nfunction getFanqieCookie() {\n    var cookieManager = null;\n    try {\n        cookieManager = this.cookie;\n    } catch (e) {}\n    if (!cookieManager) {\n        try {\n            if (typeof cookie !== 'undefined') cookieManager = cookie;\n        } catch (e) {}\n    }\n    if (!cookieManager || typeof cookieManager.getCookie !== 'function') return '';\n\n    var hosts = [\n        'fanqienovel.com',\n        'https://fanqienovel.com/',\n        'https://fanqienovel.com',\n        'https://api5-normal-sinfonlinec.fqnovel.com/'\n    ];\n    var fallback = '';\n    for (var i = 0; i < hosts.length; i++) {\n        try {\n            var value = String(cookieManager.getCookie(hosts[i]) || '');\n            if (!fallback && value) fallback = value;\n            if (/(?:^|;\\s*)sessionid(?:_ss)?=/.test(value)) return value;\n        } catch (e) {}\n    }\n    return fallback;\n}\n\nfunction getSessionId(cookieValue) {\n    var value = String(cookieValue || '');\n    var match = value.match(/(?:^|;\\s*)sessionid(?:_ss)?=([^;]+)/);\n    if (!match) return '';\n    try {\n        return decodeURIComponent(match[1]);\n    } catch (e) {\n        return match[1];\n    }\n}\n\nfunction escapeFanqieCommunityText(value) {\n    return String(value || '')\n        .replace(/&/g, '&amp;')\n        .replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;')\n        .replace(/\"/g, '&quot;');\n}\n\nfunction normalizeFanqieCommunityText(value) {\n    return String(value || '').replace(/\\s+/g, ' ').trim();\n}\n\nfunction shortenFanqieCommunityText(value, maxLength) {\n    var text = normalizeFanqieCommunityText(value);\n    if (!maxLength || text.length <= maxLength) return text;\n    return text.substring(0, Math.max(1, maxLength - 1)) + '\\u2026';\n}\n\nvar FANQIE_EMOJI_PATHS = {\n    \"[微笑]\": \"/static/emoji/emoji_dr_1.png\",\n    \"[偷笑]\": \"/static/emoji/emoji_dr_2.png\",\n    \"[笑]\": \"/static/emoji/emoji_dr_3.png\",\n    \"[什么]\": \"/static/emoji/emoji_dr_4.png\",\n    \"[害羞]\": \"/static/emoji/emoji_dr_5.png\",\n    \"[爱慕]\": \"/static/emoji/emoji_dr_6.png\",\n    \"[飞吻]\": \"/static/emoji/emoji_dr_7.png\",\n    \"[奸笑]\": \"/static/emoji/emoji_dr_8.png\",\n    \"[尬笑]\": \"/static/emoji/emoji_dr_9.png\",\n    \"[思考]\": \"/static/emoji/emoji_dr_10.png\",\n    \"[撇嘴]\": \"/static/emoji/emoji_dr_11.png\",\n    \"[做鬼脸]\": \"/static/emoji/emoji_dr_12.png\",\n    \"[酷]\": \"/static/emoji/emoji_dr_13.png\",\n    \"[翻白眼]\": \"/static/emoji/emoji_dr_14.png\",\n    \"[惊呆]\": \"/static/emoji/emoji_dr_15.png\",\n    \"[震惊]\": \"/static/emoji/emoji_dr_16.png\",\n    \"[送心]\": \"/static/emoji/emoji_dr_17.png\",\n    \"[委屈]\": \"/static/emoji/emoji_dr_18.png\",\n    \"[快哭了]\": \"/static/emoji/emoji_dr_19.png\",\n    \"[笑哭]\": \"/static/emoji/emoji_dr_20.png\",\n    \"[哭]\": \"/static/emoji/emoji_dr_21.png\",\n    \"[大笑]\": \"/static/emoji/emoji_dr_22.png\",\n    \"[舔屏]\": \"/static/emoji/emoji_dr_23.png\",\n    \"[怒]\": \"/static/emoji/emoji_dr_24.png\",\n    \"[捂脸]\": \"/static/emoji/emoji_dr_25.png\",\n    \"[吐]\": \"/static/emoji/emoji_dr_26.png\",\n    \"[恐惧]\": \"/static/emoji/emoji_dr_27.png\",\n    \"[抓狂]\": \"/static/emoji/emoji_dr_28.png\",\n    \"[敬礼]\": \"/static/emoji/emoji_dr_29.png\",\n    \"[石化]\": \"/static/emoji/emoji_dr_30.png\",\n    \"[OK]\": \"/static/emoji/emoji_dr_31.png\",\n    \"[赞]\": \"/static/emoji/emoji_dr_32.png\",\n    \"[爱心]\": \"/static/emoji/emoji_dr_33.png\",\n    \"[伤心]\": \"/static/emoji/emoji_dr_34.png\",\n    \"[KISS]\": \"/static/emoji/emoji_dr_35.png\",\n    \"[懂了]\": \"/static/emoji/emoji_dr_36.png\",\n    \"[探究]\": \"/static/emoji/emoji_dr_37.png\",\n    \"[重拳出击]\": \"/static/emoji/emoji_dr_38.png\",\n    \"[吃瓜]\": \"/static/emoji/emoji_dr_39.png\",\n    \"[盯]\": \"/static/emoji/emoji_dr_40.png\",\n    \"[你细品]\": \"/static/emoji/emoji_dr_41.png\",\n    \"[赶稿中]\": \"/static/emoji/emoji_dr_42.png\",\n    \"[注意]\": \"/static/emoji/emoji_dr_43.png\",\n    \"[饱了]\": \"/static/emoji/emoji_dr_44.png\",\n    \"[码住]\": \"/static/emoji/emoji_dr_45.png\",\n    \"[学会了]\": \"/static/emoji/emoji_dr_46.png\",\n    \"[顶帖]\": \"/static/emoji/emoji_dr_47.png\",\n    \"[求爆更]\": \"/static/emoji/emoji_dr_48.png\",\n    \"[求关注]\": \"/static/emoji/emoji_dr_49.png\",\n    \"[我也强推]\": \"/static/emoji/emoji_dr_50.png\",\n    \"[雀食神作]\": \"/static/emoji/emoji_dr_51.png\",\n    \"[已种草]\": \"/static/emoji/emoji_dr_52.png\",\n    \"[书架加一]\": \"/static/emoji/emoji_dr_53.png\",\n    \"[歪头笑哭]\": \"/static/emoji/emoticon_emoji_wtxk.png\",\n    \"[神评]\": \"/static/emoji/emoticon_xiaoqi_sp.png\",\n    \"[狗头]\": \"/static/emoji/emoticon_emoji_doge.png\",\n    \"[哈哈]\": \"/static/emoji/emoticon_emoji_hhh.png\",\n    \"[流泪]\": \"/static/emoji/emoticon_emoji_tears.png\",\n    \"[可爱]\": \"/static/emoji/emoticon_emoji_cute.png\",\n    \"[色]\": \"/static/emoji/emoticon_emoji_smimi.png\",\n    \"[调皮]\": \"/static/emoji/emoticon_emoji_tpi.png\",\n    \"[小七_神评]\": \"/static/emoji/emoticon_xiaoqi_sp.png\",\n    \"[小七_狗头]\": \"/static/emoji/emoticon_xiaoqi_gt.png\",\n    \"[小七_鄙视]\": \"/static/emoji/emoticon_xiaoqi_bs.png\",\n    \"[小七_高兴]\": \"/static/emoji/emoticon_xiaoqi_gx.png\",\n    \"[小七_黑人问号]\": \"/static/emoji/emoticon_xiaoqi_hrwh.png\",\n    \"[小七_厉害]\": \"/static/emoji/emoticon_xiaoqi_lh.png\",\n    \"[小七_流泪]\": \"/static/emoji/emoticon_xiaoqi_ll.png\",\n    \"[小七_OK]\": \"/static/emoji/emoticon_xiaoqi_ok.png\",\n    \"[小七_色]\": \"/static/emoji/emoticon_xiaoqi_s.png\",\n    \"[小七_伤心]\": \"/static/emoji/emoticon_xiaoqi_sx.png\",\n    \"[小七_调皮]\": \"/static/emoji/emoticon_xiaoqi_tq.png\",\n    \"[小七_委屈]\": \"/static/emoji/emoticon_xiaoqi_wh.png\",\n    \"[小七_笑哭]\": \"/static/emoji/emoticon_xiaoqi_xk.png\",\n    \"[小七_笑嘻嘻]\": \"/static/emoji/emoticon_xiaoqi_xxy.png\",\n    \"[小七_斜眼笑]\": \"/static/emoji/emoticon_xiaoqi_xyx.png\",\n    \"[小七_赞美]\": \"/static/emoji/emoticon_xiaoqi_zm.png\",\n    \"[眯眼笑]\": \"/static/emoji/emoticon_xiaoqi_xxy.png\"\n};\n\nfunction getFanqieEmojiMap(baseUrl) {\n    var root = String(baseUrl || \"\").replace(/\\/$/, \"\");\n    var result = {};\n    Object.keys(FANQIE_EMOJI_PATHS).forEach(function(name) {\n        result[name] = root + FANQIE_EMOJI_PATHS[name];\n    });\n    return result;\n}\n\nfunction splitFanqieGodNoteEmojis(value, baseUrl) {\n    var emojiMap = getFanqieEmojiMap(baseUrl);\n    var images = [];\n    var text = String(value || \"\").replace(/\\[[^\\[\\]]+\\]/g, function(token) {\n        var imageUrl = emojiMap[token];\n        if (!imageUrl) return token;\n        images.push(\"<img src=\\\"\" + imageUrl + \",{'style':'TEXT'}\\\" width=\\\"44\\\" height=\\\"44\\\" style=\\\"width:44px;height:44px;vertical-align:middle\\\">\");\n        return \"\";\n    }).replace(/\\s+/g, \" \").trim();\n    if (!text && images.length) text = \"\\u67e5\\u770b\\u8868\\u60c5\";\n    return { text: text, images: images.join(\"\") };\n}\n\nfunction decodeFanqieNoteText(value) {\n    return String(value || '')\n        .replace(/&#x([0-9a-f]+);/gi, function(_match, code) {\n            return String.fromCharCode(parseInt(code, 16));\n        })\n        .replace(/&#([0-9]+);/g, function(_match, code) {\n            return String.fromCharCode(parseInt(code, 10));\n        })\n        .replace(/&quot;/g, '\"')\n        .replace(/&apos;|&lsquo;|&rsquo;/g, \"'\")\n        .replace(/&lt;/g, '<')\n        .replace(/&gt;/g, '>')\n        .replace(/&amp;/g, '&');\n}\n\n// 将后端返回的 <note> 神评标签转换成阅读/源阅可渲染的 SVG 卡片。\nfunction getFanqieNoteAttribute(noteTag, name) {\n    var reg = new RegExp(name + '=\\\"([^\\\"]*)\\\"');\n    var match = String(noteTag || '').match(reg);\n    if (!match) return '';\n    try { return decodeFanqieNoteText(match[1]); } catch (e) { return match[1]; }\n}\n\nfunction cleanFanqieGodNoteText(value) {\n    var text = String(value || '')\n        .replace(/<[^>]*>/g, ' ')\n        .replace(/\\[fn=(\\d+)\\]/g, '[表情]')\n        .replace(/\\s+/g, ' ')\n        .trim();\n    return text;\n}\n\nfunction createFanqieGodNoteCard(noteTag, sources) {\n    var noteUrl = getFanqieNoteAttribute(noteTag, 'ident');\n    var rawNoteText = getFanqieNoteAttribute(noteTag, 'text');\n    var originMatch = String(noteUrl || '').match(/^(https?:\\/\\/[^\\/]+)/);\n    var baseUrl = originMatch ? originMatch[1] : getArguments(this.source.getVariable(), 'server');\n    var emojiResult = splitFanqieGodNoteEmojis(rawNoteText, baseUrl);\n    var noteText = cleanFanqieGodNoteText(emojiResult.text);\n    if (!noteText) return '';\n    var displayText = shortenFanqieCommunityText(noteText, 27);\n    var svg = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1000\" height=\"108\" viewBox=\"0 0 1000 108\">' +\n        '<rect width=\"100%\" height=\"100%\" fill=\"rgba(255,255,255,0.55)\" rx=\"30\"/>' +\n        '<rect x=\"35\" y=\"28\" width=\"125\" height=\"52\" rx=\"16\" fill=\"#F06260\"/>' +\n        '<text x=\"97\" y=\"65\" font-size=\"32\" fill=\"#FFFFFF\" text-anchor=\"middle\" font-weight=\"bold\">神评论</text>' +\n        '<text x=\"175\" y=\"67\" font-size=\"38\" fill=\"#333333\">' + escapeFanqieCommunityText(displayText) + '</text>' +\n        '</svg>';\n    var jc = 'js';\n    try { if (this.checkEnv() == '改版') jc = 'click'; } catch (e) {}\n    var actionUrl = String(noteUrl || '').replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\").replace(/[\\r\\n]/g, '');\n    var title = String(sources || '番茄').replace(/'/g, '');\n    var meta = '{\"' + jc + '\":\"showCmt(\\'' + actionUrl + '\\',\\'' + title + '\\',\\'段评\\')\",\"style\":\"FULL\"}';\n    return '<img src=\"data:image/svg+xml;base64,' + this.java.base64Encode(svg) + ',' + meta + '\">';\n}\n\nfunction renderFanqieGodNoteCards(value, sources) {\n    var runtime = this;\n    return String(value || '').replace(/<note\\b[^>]*>(?:<\\/note>)?/g, function(noteTag) {\n        return createFanqieGodNoteCard.call(runtime, noteTag, sources) || '';\n    });\n}\nfunction checkEnv() {\n    const {\n        java,\n        source\n    } = this;\n\n    try {\n        java.qread();\n        return \"轻阅读\";\n    } catch (e) {}\n\n    try {\n        if (typeof java.reLoginView == 'function') {\n            return \"改版\";\n        }\n        new Packages.io.legato.kazusa.utils.TimeoutCancellationException('');\n        return \"改版\";\n    } catch (e) {}\n    try {\n        java.deviceID();\n        return \"苹果\";\n    } catch (e) {}\n\n    if (typeof source.loginUi == 'function') {\n        return \"安卓\";\n    }\n\n    return \"改版\";\n}\n\n// 获取番茄token\n\nfunction createGod(url,svg) {\n    var jc = 'js';\n    let islyc = this.checkEnv()\n    if (islyc == \"改版\") {\n        jc = 'click'\n    }\n   let cz= `{\"${jc}\":\"showCmt('${url}','段评' )\",\"style\":\"FULL\"}`\n\tlet img = `<img src=\"${svg},${cz}\">`\n\treturn img\n\t}\n\nlet svgs = [\n    \"<svg t='1760002253572' class='icon' viewBox='-150 0 1224 1224' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='1490' width='800' height='800'><g transform='rotate(90 512 512) scale(1 1.2)'><path d='M224 149.333333h576c40.533333 0 74.666667 34.133333 74.666667 74.666667v460.8c0 40.533333-34.133333 74.666667-74.666667 74.666667h-108.8c-40.533333 0-78.933333 17.066667-104.533334 46.933333l-49.066666 55.466667c-4.266667 6.4-14.933333 10.666667-23.466667 10.666667-10.666667 0-19.2-4.266667-25.6-10.666667l-46.933333-55.466667c-25.6-29.866667-64-46.933333-104.533334-46.933333h-110.933333c-40.533333 0-74.666667-34.133333-74.666667-74.666667V224c0-40.533333 34.133333-74.666667 74.666667-74.666667z' fill='$tccolor' p-id='1529'></path><path d='M512 938.666667c-27.733333 0-55.466667-12.8-72.533333-34.133334l-46.933334-55.466666c-14.933333-17.066667-34.133333-25.6-57.6-25.6h-110.933333c-76.8 0-138.666667-61.866667-138.666667-138.666667V224C85.333333 147.2 147.2 85.333333 224 85.333333h573.866667c76.8 0 138.666667 61.866667 138.666666 138.666667v460.8c0 76.8-61.866667 138.666667-138.666666 138.666667h-108.8c-21.333333 0-42.666667 8.533333-55.466667 25.6l-49.066667 55.466666c-17.066667 21.333333-44.8 34.133333-72.533333 34.133334zM224 149.333333C183.466667 149.333333 149.333333 183.466667 149.333333 224v460.8c0 40.533333 34.133333 74.666667 74.666667 74.666667h110.933333c40.533333 0 78.933333 17.066667 104.533334 49.066666l46.933333 55.466667c6.4 6.4 14.933333 10.666667 25.6 10.666667 8.533333 0 19.2-4.266667 23.466667-10.666667l49.066666-55.466667c25.6-29.866667 64-46.933333 104.533334-46.933333h108.8c40.533333 0 74.666667-34.133333 74.666666-74.666667V224C874.666667 183.466667 840.533333 149.333333 800 149.333333h-576z' fill='$color' p-id='1530'></path> </g><text x='460' y='650' font-family='Arial, sans-serif' text-anchor='middle' font-size='400' fill='$fontcolor'>$displayText</text></svg>\",\n\n    \"<svg xmlns='http://www.w3.org/2000/svg' width='100' height='90' viewBox='0 0 25 17' fill='none' style='color: $color; opacity: 1;'><path stroke='currentColor' stroke-width='1.00' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='4.00' style='stroke: $color; stroke-opacity: 0.5; stroke-width: 1px; stroke-linejoin: round; fill: $tccolor; fill-opacity: 0.5;' d='M 7.5 0.5 L 16.5 0.5 A 7 7 0 0 1 23.5 7.5 L 23.5 7.5 A 7 7 0 0 1 16.5 14.5 L 8.5 14.5 L 5.192 16.5 L 5.5 14.5 A 7 7 30 0 1 0.5 7.5 L 0.5 7.5 A 7 7 0 0 1 7.5 0.5 Z'/><text fill='$fontcolor' font-family='Arial, sans-serif' font-size='10' font-weight='500' text-anchor='middle' dy='0.35em' x='12.00' y='7.50'>$displayText</text></svg>\",\n\n    \"<svg xmlns='http://www.w3.org/2000/svg' width='100' height='90' viewBox='0 0 25 17' fill='none' style='color: $color; opacity: 1;'><path d='M24 14.5v-12a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v7.528a2 2 0 0 1-.211.894l-2.065 4.13a1 1 0 0 0 .894 1.448H22a2 2 0 0 0 2-2z' stroke='currentColor' style='stroke: $color; stroke-opacity: 0.5; stroke-width: 1px; stroke-linejoin: round; fill: $tccolor; fill-opacity: 0.5;'></path><text x='13.5' y='12' text-anchor='middle' alignment-baseline='auto' font-size='10' fill='currentColor' font-family='Arial, sans-serif' font-weight='500' style='fill: $fontcolor; opacity: 1;'>$displayText</text></svg>\",\n\n\n    \"<svg xmlns='http://www.w3.org/2000/svg' width='100' height='90' viewBox='6 10 88 76' style='color: $color; opacity: 1;'><path d='M12,12 L88,12 Q92,12 92,16 L92,68 Q92,72 88,72 L28,72 L12,84 L12,72 Q8,72 8,68 L8,16 Q8,12 12,12 Z' stroke='currentColor' stroke-width='4' stroke-linejoin='round' style='stroke: $color; stroke-opacity: 0.5; stroke-width: 2.5px; stroke-linejoin: round; fill: $tccolor; fill-opacity: 0.5;'></path><text x='50' y='60' font-family='Arial, sans-serif' text-anchor='middle' font-size='45' fill='currentColor' font-weight='500' alignment-baseline='auto' style='fill: $fontcolor; opacity: 1;'>$displayText</text></svg>\",\n\n\n    \"<svg xmlns='http://www.w3.org/2000/svg' width='100' height='90' viewBox='0 0 25 17' fill='none' style='color: $color; opacity: 1;'><rect x='0.5' y='0.5' width='24' height='16' rx='2.5' ry='2.5' stroke='currentColor' style='stroke: $color; stroke-opacity: 0.5; stroke-width: 1px; stroke-linejoin: round; fill: $tccolor; fill-opacity: 0.5;'></rect><text x='12.5' y='12' text-anchor='middle' alignment-baseline='auto' font-size='10' fill='currentColor' font-family='Arial, sans-serif' font-weight='500' style='fill: $fontcolor; opacity: 1;'>$displayText</text></svg>\",\n\n\n     `<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 216 200'>\n  <path fill='#802622' d='M110 0h14l1 1h8v1h4v1h4v1h4v1h3v1h2l1 1h2l1 1h1l1 1h2v1h2v1h2v1h2v1h1v1h2v1h2v1h1v1h1l1 1h1v1h1v1h2v1h1v1h1l1 1v1h2v1h1v1h1v1l1 1h1v1h1v1h1v1h1v2h1v1h1v1h1v1h1v1h1v2h1v1h1v1l1 1v1h1v2h1v1h1v2h1v1l1 1v1l1 1v1h1v2h1v2h1v2h1v3h1v2h1v3a5 5 0 0 0 1 2h1v1h-1v4h1v4h1v5h1v8h1v18h-1v7h-1v5h-1v2h-1l-1 2v3h-1v2l-1 1v3h-1v2h-1v2h-1v2h-1v2h-1v2h-1v2h-1v1l-1 1v1h-1v2h-1v1l-1 1v1h-1v1h-1v1h-1v2h-1l-1 1v1h-1v1h-1v1h-1v1h-1v1h-1v1h-1v1l-1 1h-1v1h-1l-1 1h-1 1v-1h1v-1h1v-1h1a1 1 0 0 1 0-1 2 2 0 0 1 1-1h1v-2h1v-1h1v-1h1v-1h1v-1l1-1v-1h1v-1h1v-1l1-1h1v-2h1v-1l1-1v-1h1v-1l1-1v-1h1v-2h1v-1l1-1v-2h1v-2h1v-2h1v-2h1v-3h1v-5h1v-4l1-1v-6h1v-11h1v-2h-1v-1h1v-1h-1 1v-2h-1v-7h-1v24h-1v3h-1v1h-1v4h-1v4h-1v3h-1v2h-1v3l-1 1v1h-1v2l-1 1-1 2v1h-1v1h-1v2h-1v2h-1v1h-1v2h-1v1h-1v1h-1v1h-1v2h-1v1h-2v2h-1l-1 1v1h-2v1h-1v1h-1v1h-1v1h-1l-1 1-1 1h-2v1h-1v-1h1v-1h2v-1h1v-1h1v-1h1v-1h1v-1h1v-1l1-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1l1-1v-1h1v-1h1v-2l1-1v-1h1v-1h1v-2l1-1v-1h1v-2l1-1v-1h1l-1-1h1v-2h1v-2l1-1v-3h1v-3l1-1v-3h1v-4l1-1v-10h1V98h-1v-9h-1v-4l-1-1v-4l-1-1v-4h-1v-3h-1a6 6 0 0 0 0-3h-1v-1l-1-1v-2h-1v-2h-1v-1h-1v-2h-1v-1h-1v-1l-1-1v-1h-2v-1 2a2 2 0 0 1-1-1v-2h-1v-1h-1v-2h-1v-1l-1-1-1-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1l-1-1h-1v-1l-1-1h-1v-1h-1v-1h-1v-1h-1v-1h-1l-1-1v-1h-2v-1h-1v-1h-1v-1h-2v-1a1 1 0 0 1-1 0v-1h-2v-1h-1l-1-1h-1v-1h-2v-1h-2v-1h-2v-1h-1v-1h-4v-1h-1v-1h-2l-1-1h-2v-1h-5v-1a1 1 0 0 1-1-1v1h-1v-1 1h-2l-1-1h-3v-1h-23 1-2v1h-1v-1h-2v1h-4v1h-2v2l1-1h4v-1h4v-1h23v1h6v1h4v1h4v1h3v1h3v1h2l1 1h2l1 1 1 1h1v1h1l2 1h2v1h1v1-1 1h2v1h1v1h2v1h1v1h1v1h1v1h1v1h1l1 1h1v1h1v2h1l1 1 1 1v1h1v1h1v1h1v2l1 1v1h1v1h1v1h1v1h1v2l1 1v1h1v2h1v1l1 1v1h1v2l1 1v2h1v2h1v1l1 2v3h1v4l1 1v5h1v9l1 1v6h-1v8h-1v1-16h-1v-2h1v-2h-1v-5h-1v-4h-1v-3l-1-1v-3a2 2 0 0 1-1-1v-2l-1-1v-1h-1v-3h-1v-1h-1v-2l-1-1v3h1v3h1v4h1v3l1 1v3h1v5h1v25h-1v6h-1v4l-1 1v2h-1v2h-1v3h-1v2h-1v2l-1 1v1h-1v2h-1v2h-1v2h-1v1h-1v2l-1 1-1 1v1h-1v1h-1v2h-1l-1 1v1h-1v1h-1v1h-1v1h-1v1l-1 1-1 1h-1v1h-1v1h-1v1h-1l-1 1h-1v1h-1v-1h1v-1h1v-1l1-1h1v-1l2-1v-1h1v-1l1-1v-1h1v-1h1v-1h1v-2h1v-1l1-1v-1h1v-1l1-1v-2h1v-2h1v-1l1-1v-1h1v-3h1v-2h1v-1h1v-2l1-1v-2h1v-3h1v-5h1v-5h1v5-21h-1v-6h-1v-5h-1v-3h-1v-3h-1v-2h-1v-3h-1v-1l-1-1v-2h-1v-1l-1-3h-1v-1h-1a1 1 0 0 1 0-1v-1h-1v-2h-1v-1h-1v-1l-1-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1l-1-1v-1h-2v-1h-1v-1h-1v-1h-1l-1-1h-1v-1h-1v-1h-1l-1-1h-1v-1h-2v-1h-2v-1h-1v-1h-2a2 2 0 0 0-1-1h-1v-1h-2l-1-1h-2v-1h-3v-1h-2l-2-1h-2v-1h-5v-1h-2 3-22v1h-5v1h-4v1h-2l-2 1h-2v1h-2l-1 1h-2v1h-1l-1 1h-1v1h-2v1h-1l-1 1h-1v1h-1l-1 1h-1v1h-1v1h-1l-1 1-1 1-1 1h-1v1h-1v1h-1v1h-1v1h-1v1h-1v2h-1v1h-1v1h-1v1h-1v2h-1v1h-1v1h-1v2h-1v1l-1 1v1h-1v2h-1v2h-1v2h-1v3h-1v3h-1v3l-1 1v3l-1 1v6h-1v12h1v5l1 3v3h1v4h1v3h1v3h1v3h1v2l1 1v1h1v2l1 2v1h1v1l1 1v1h1v1h1v2h1v1h1v2h1v1h1v1h1v1h1v2h1v1h1l1 1h1v1h1v1l1 1h1v1h2v1h1v1h1v1h2v1h2v1h1v1h1v1h2v1h7v1h1v2h1v2h-4l-3-1v1h1a3 3 0 0 1 2 1h1v1-1 1h1v-1h1v2h5v1h1v1h1v1h2v1h-2l1 1v1h-1 1v3h-1v2h-2 1v1h1v1h-1v2h-1 1v3h-1l-1 1h-1v1h-3v1h-2v-1h-1l-1-1h-1v-1 1h-5v1h-4v-1l-1-1h-1v1h-2v-1h-1v-1h-1v2h2v1h2v1h2l1 1h2v1h1v1h2v1h1v1h5v1h1v1h1v1l-1 1h-4v-1h-2v-1h-3v-1h-5v-1h-1v-1h-1v1h-1a1 1 0 0 1 0-1l1-1h1-1v-1h-2a2 2 0 0 0-1-1h-1v-1h-2v-1h-2v-1h-3v-1h-1v-1h-2v-1h-1v-1h-1v-1h-2v-1h-2v-1h-1v-1h-1v-1h-1v-1h-2v-1a2 2 0 0 1-1-1h-1v-1h-1v-1h-1v-1h-1v-1h-1l-1-1v-1h-1v-1h-1v-1h-1a1 1 0 0 1 0-1h-1v-1l-1-1-1-1v-1h-1v-1h-1v-1h-1v-1h-1v-2h-1v-1h-1v-1l-1-1v-1h-1v-2h-1v-1h-1v-2h-1v-1l-1-1v-1h-1v-2h-1v-1h-2v-2a1 1 0 0 1-1 0v-2h-1v-1h-1l-1 1v1h-1v-1h-1l-1-2h1v-5h-1v-4a2 2 0 0 1-1-1v-3H9v-3a2 2 0 0 1-1-1v-2H7v-3H6v-7H5v-1h1v-1h1v-5l-1-2v-7l1-2v-6h1v-1H7h2v1H8v8H7v9h1V91h1v-7h1v-4h1v-1a3 3 0 0 1 0-2h-1v-1h1l1-1-1-1h1v-2h1v-3h1v-6h1v-2h1v-1 1-1h1-1v-1h1v-1h1v-1h-1v-1h1v-1h1-1v-1h1v-2h1v-2h1v-1h-1v2h-1v1h-1v2h-1v-1l1-1v-2h1v-1h1v-1l1-1v-2h1v-1h1v-3h1v-1h2v-1h1v-1h1v-2h1v-1h1v-1h1v-2h1l1-1v-1h1v-1h1v-2h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1l1-1h1v-1h1v-1h1v-1h1v-1h1l1-1h1v-1h1l1-1 1-1v1-1h1V8h2V7h1l1-1h1V5h2V4h1l1-1h2V2h2V1h2V0h1v1h-1l-1 1h-1v1h-2v1h-3v1h-1v1h-2v1h-1v1h-2v1h-2v1h-1v1h-1l-1 1-1 1h-1l-1 1h-1v1h-1v1h-1v1h-1v1h-1v1h-1l-1 1h-1v2h-1l-1 1v1h-2v1h-1v2h-1v1h-1v1h-1v1h-1v1l-1 1v1h-1v1h-1v1l-1 1v1h-1v2h-1v1h-1v2h-1v1h1v1h-1v1l-1 1h-1v1h-1v2l-1 1v2h-1v2h-1v2h-1v2h-1v3h-1v3h-1v3h-1v2l-1 1v3h-1v4H9v6H8v6H7v11-5h1v-3l1-2v-3h1v-4h1v-5l1-1v-3h1v-4h1v-3h1v-3h1v-3l1-2h1v-3h1v-1l1-1v-2h1v-1h1v-2h1v-1h1v-1l1-1v-1l1-1v-1h1v-1h1v-1h1v-1h1v-2h1v-1h1v-1h1v-1h1v-1h1v-2h1v-1h1l1-1h1v-1l1-1 1-1h1v-1h1v-1h1v-1h1v-1h1v-1h2v-1h1v-1h1v-1h2v-1h1l1-1v-1h2v-1h1l1-1h1v-1h2v-1h2v-1h2v-1h1l2-1h1V8h2V7h3V6h3V4h6V3h4V2h4l1-1h7V0h8z'/>\n      <text x=\"115\" y=\"130\" font-family=\"Arial, sans-serif\"  text-anchor=\"middle\" font-size=\"80\" font-weight=\"700\" fill='#802632'>$displayText</text>\n</svg>`\n];\n\n\n// 创建svg\n\nfunction showFanqieComment(url, title) {\n    let { java } = this;\n    title = title || '本章说';\n    let pageUrl = String(url || '');\n    if (!pageUrl) {\n        try { java.toast('评论地址为空，请刷新本章'); } catch (e) {}\n        return;\n    }\n    let islyc = this.checkEnv();\n    try {\n        if (islyc == '轻阅读') {\n            java.startBrowserDp(pageUrl, title);\n            return;\n        }\n        if (islyc == '改版') {\n            let htmlContent = java.ajax(pageUrl);\n            java.showBrowser(\n                pageUrl,\n                htmlContent,\n                `window.java=java;`,\n                JSON.stringify({\n                    \"expandedCornersRadius\": 20,\n                    \"dismissOnTouchOutside\": true,\n                    \"isDraggable\": true,\n                    \"shouldDimBackground\": true,\n                    \"backgroundDimAmount\": 0.5,\n                    \"hardwareAccelerated\": true,\n                    \"isNestedScrollingEnabled\": true,\n                    \"isGestureInsetBottomIgnored\": true,\n                    \"setFitToContents\": true,\n                    \"isHideable\": true,\n                    \"heightPercentage\": 0.8\n                })\n            );\n            return;\n        }\n        try {\n            java.showReadingBrowser(pageUrl, title);\n            return;\n        } catch (e) {}\n        java.startBrowser(pageUrl, title);\n    } catch (e) {\n        try { java.startBrowser(pageUrl, title); } catch (err) { java.log('打开番茄评论页失败:' + err); }\n    }\n}\n\n\n// 生成本章说尾部卡片的点击协议，只负责打开官方评论聚合页，不复用段评点击逻辑。\nfunction endclick(url, title) {\n    var jc = 'js';\n    let islyc = this.checkEnv();\n    if (islyc == '改版') {\n        jc = 'click';\n    }\n    title = title || '本章说';\n    return `\"${jc}\":\"showFanqieComment('${url}','${title}')\"`;\n}\n\n\nfunction paraForAndroid(content, sources) {\n    let {\n        java,\n        cache,\n        source\n    } = this;\n    const createSvg = this.createSvg.bind(this);\n    const createGod = this.createGod.bind(this);\n    content = renderFanqieGodNoteCards.call(this, content, sources);\n     content = content.replace(\n        /<p><img ident=\"([^\"]*)\" src=\"([^\"]*)\"\\s*\\/><\\/p>/g,\n        (match, ident, src) => {\n            return `<p>${createGod(ident, src)}</p>`;\n        }\n    );\n    \n\n    return content.replace(/<p>(.*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\/>)?<\\/p>/g,\n        (match, text, url, count) => {\n            if (url && count) {\n                const click = 0;\n                cache.putMemory(url, click);\n                const encodedUrl = url;\n                return `<p>${text}<img src=\"${createSvg(count, encodedUrl,sources)}\"></p>`;\n            } else {\n                return `<p>${text}</p>`;\n            }\n        }\n    );\n}\n// 创建神评论\n\nfunction showCmt(url, sources,ident) {\n    let {\n        java,\n        cache\n    } = this;\n    if (ident == null) ident = '段评';\n    const currentTime = Date.now();\n    const click = cache.getFromMemory(url);\n    let islyc = this.checkEnv()\n    if (click < 1 && islyc == \"安卓\") {\n        cache.putMemory(url, click + 1);\n        return;\n    } else {\n        if (islyc == \"轻阅读\") {\n            java.startBrowserDp(url, sources + ident);\n        } else if (islyc == \"改版\") {\n            let paradata = new Date().toLocaleDateString();\n            let htmlContent = cache.get(paradata+ident+\"new2\");\n            if (!htmlContent || String(htmlContent).indexOf(\"评论\") == -1) {\n                java.longToast(`\\n${paradata} 初始化${ident}页面,请稍等~`);\n                try {\n                    htmlContent = java.ajax(url);\n                } catch {\n\n                }\n\n                cache.put(paradata+ident+\"new2\", htmlContent);\n                java.longToast(`\\n${paradata} 初始化${ident}页面成功~`);\n            }\n            java.showBrowser(\n                url,\n                htmlContent,\n                `window.java=java;`,\n                JSON.stringify({\n                    \"expandedCornersRadius\": 20,\n                    \"dismissOnTouchOutside\": true,\n                    \"isDraggable\": true,\n                    \"shouldDimBackground\": true,\n                    \"backgroundDimAmount\": 0.5,\n                    \"hardwareAccelerated\": true,\n                    \"isNestedScrollingEnabled\": true,\n                    \"isGestureInsetBottomIgnored\": true,\n                    \"setFitToContents\": true,\n                    \"isHideable\": true,\n                    \"heightPercentage\": 0.8\n                })\n            );\n        } else {\n            java.startBrowser(url, sources + ident);\n        }\n    }\n}\n\n//源阅段评\n\nfunction createSvg(number, encodedUrl, sources) {\n    var displayText = number > 99 ? \"99+\" : number.toString();\n    let data = {'段评样式':'0','段评边框颜色':'#A7A7A7','段评填充颜色':'transparent','段评字体颜色':'#A7A7A7','气泡增大':'false','自定义段评样式':{}};\n    let svgstyle = data['段评样式'] || \"0\";\n    let color = data['段评边框颜色'] || \"#A7A7A7\";\n    let tccolor = data['段评填充颜色'] || \"transparent\";\n    let fontcolor = data['段评字体颜色'] || \"#A7A7A7\";\n    let zdy = svgs[0];\n    try {\n        zdy = data['自定义段评样式'][svgstyle] || svgs[0];\n    } catch {}\n    const styleMap = {\n        \"0\": svgs[0],\n        \"1\": svgs[1],\n        \"2\": svgs[2],\n        \"3\": svgs[3],\n        \"4\": svgs[4],\n        \"5\": svgs[5],\n    };\n    let svg = styleMap[svgstyle] || zdy;\n    svg = svg.replace('$color', color)\n        .replace('$tccolor', tccolor)\n        .replace('$fontcolor', fontcolor)\n        .replace('$displayText', displayText);\n    var jc = 'js';\n    let islyc = this.checkEnv()\n    if (islyc == \"改版\") {\n        jc = 'click'\n    }\n    let style = data['气泡增大'] == \"true\" ? 'TEXT' : 'text';\n    var encodedSvg = this.java.base64Encode(svg);\n    return `data:image/svg+xml;base64,${encodedSvg},{\"${jc}\":\"showCmt('${encodedUrl}', '${sources}' ,'段评')\",\"style\":\"${style}\"}`;\n}\n\n\n// 显示弹窗\n\nfunction cleanHTML(html) {\n    let result = html\n        .replace(/<header[^>]*>[\\s\\S]*?<\\/header>/gi, \"\")\n        .replace(/<div class=\"tt-title\"[^>]*>[\\s\\S]*?<\\/div>/gi, \"\")\n        .replace(/<(?!\\/?p\\b|\\/?img\\b)[^>]+>/gi, \"\");\n    result = result.replace(/<\\/?p[^>]*>/g, \"\\n\");\n    return result.replace(/\\n+/g, \"\\n\").trim();\n}\n\nvar CompatibilityUtils = {\n    hasJavaClass: function(className) {\n        try {\n            var parts = className.split('.');\n            var obj = Packages;\n            for (var i = 0; i < parts.length; i++) {\n                obj = obj[parts[i]];\n                if (!obj) return false;\n            }\n            return true;\n        } catch (e) {\n            return false;\n        }\n    },\n    \n    safeImport: function(javaImport) {\n        var classes = [\n            'android.util.Base64',\n            'java.lang.String', \n            'java.net.URL',\n            'okhttp3.HttpUrl'\n        ];\n        \n        classes.forEach(function(className) {\n            if (this.hasJavaClass(className)) {\n                try {\n                    var classObj = eval('Packages.' + className);\n                    javaImport.importClass(classObj);\n                } catch (e) {\n                    java.log('无法导入类: ' + className);\n                }\n            }\n        }.bind(this));\n        \n        return javaImport;\n    }\n};\n\n\nvar javaImport = CompatibilityUtils.safeImport(new JavaImporter());\n\nwith(javaImport) {\n    function btoa(data) {\n        return Base64.encodeToString(String(data).getBytes(\"UTF-8\"), 2);\n    }\n\n    function getSubDomain(url) {\n        let baseUrl = getBaseUrl(url);\n        if (!baseUrl) {\n            return url;\n        }\n        try {\n            let mURL = URL(baseUrl);\n            let host = mURL.host;\n            if (isIPAddress(host)) return host;\n            return HttpUrl.parse(baseUrl).topPrivateDomain() || host;\n        } catch (e) {\n            this.java.log(e);\n            return baseUrl;\n        }\n    }\n\n    function getDomain(url) {\n        let baseUrl = getBaseUrl(url);\n        if (!baseUrl) {\n            return url;\n        }\n        try {\n            return URL(baseUrl).host;\n        } catch (e) {\n            return baseUrl;\n        }\n    }\n    /**\n     * 移除cookie\n     */\n    function removeCookie(url) {\n        const {\n            cookie\n        } = this;\n        cookie.removeCookie(url);\n        let domains = [getDomain(url), getSubDomain(url)];\n        domains.forEach((domain) => {\n            cookie.removeCookie(domain);\n        });\n    }\n}\n\nfunction getBaseUrl(url) {\n    if (!url) {\n        return null;\n    }\n    url = String(url);\n    if (url.match(/https?:\\/\\//i)) {\n        var index = url.indexOf(\"/\", 9);\n        return index == -1 ? url : url.substring(0, index);\n    }\n    return null;\n}\n\nfunction isIPv4Address(ip) {\n    ip = String(ip);\n    let parts = ip.split(\".\");\n    if (parts.length !== 4) return false;\n\n    for (let part of parts) {\n        if (!/^\\d+$/.test(part)) return false; // 必须是数字\n        if (part.length > 1 && part[0] === \"0\") return false; // 禁止前导零\n        let num = parseInt(part, 10);\n        if (num < 0 || num > 255) return false; // 范围检查\n    }\n    return true;\n}\n\nfunction isIPv6Address(ip) {\n    ip = String(ip);\n    // 处理双冒号（最多出现一次）\n    if (ip.includes(\":::\")) return false;\n    let doubleColonCount = (ip.match(/::/g) || []).length;\n    if (doubleColonCount > 1) return false;\n\n    // 分割成组\n    let groups = ip.split(\":\");\n    let validGroupCount = 8;\n    let actualGroupCount = groups.filter((g) => g !== \"\").length;\n\n    // 验证组数\n    if (doubleColonCount === 1) {\n        if (actualGroupCount > validGroupCount - 1) return false;\n    } else {\n        if (groups.length !== validGroupCount) return false;\n    }\n\n    // 验证每组内容\n    for (let group of groups) {\n        if (group === \"\") continue; // 跳过空组（双冒号部分）\n        if (!/^[0-9a-fA-F]{1,4}$/.test(group)) return false; // 1-4位十六进制\n    }\n    return true;\n}\n\nfunction isIPAddress(input) {\n    return isIPv4Address(input) || isIPv6Address(input);\n}\n\nfunction getKey(key) {\n    let parts = key.split(\";\");\n    for (let part of parts) {\n        if (part.includes(\"qttoken\")) {\n            return part.split(\"=\")[1];\n        }\n    }\n    return \"\";\n}\n\nfunction paraForiOS(html, sources) {\n    html = renderFanqieGodNoteCards.call(this, html, sources);\n\t   let result = html.replace(\n        /<p><img ident=\"([^\"]*)\" src=\"([^\"]*)\"\\s*\\/><\\/p>/g,\n        (match, ident, src) => {\n            return `<div rs-native>${createGod(ident, src)}</div>`;\n        }\n    );\n    result = result.replace(\n        /<p>(.*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\/>)?<\\/p>/g,\n        function(match, text, url, count) {\n            if (url && count) {\n                const encodedUrl = url.replace(/&/g, '&amp;');\n                let displayCount = count;\n                const numCount = Number(count);\n                if (!isNaN(numCount) && numCount > 99) {\n                    displayCount = '99';\n                }\n                return `<div rs-native>${text}<comment count=\"${displayCount}\" onPress=\"java.showReadingBrowser('${encodedUrl}','${sources}段评')\"></div>`;\n            } else {\n                return `<div rs-native>${text}</div>`;\n            }\n        }\n    );\n    return result.replace(/&#34;/g, '\"');\n}\n\nfunction paraHtml(url) {\n    let burl = url.split('?');\n    let baser_url = burl[0].replace(\"/get_para_review\", \"\");\n    url = burl[1];\n    return `<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\">\n    <link rel=\"shortcut icon\" href=\"${baser_url}/static/favicon.ico\" type=\"image/x-icon\">\n    <link rel=\"stylesheet\" href=\"${baser_url}/static/css/all.min.css\">\n    <title>段落评论</title>\n    <style>\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n            -webkit-tap-highlight-color: transparent;\n        }\n\n        body {\n            font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"PingFang SC\", \"Hiragino Sans GB\", \"Microsoft YaHei\", sans-serif;\n            background: #f5f5f5;\n            color: #333;\n            line-height: 1.5;\n            min-height: 100vh;\n            padding-bottom: 70px;\n        }\n\n        /* 顶部栏 */\n        .header {\n            position: fixed;\n            top: 0;\n            left: 0;\n            right: 0;\n            z-index: 100;\n            background: #fff;\n            padding: 12px 16px;\n            display: flex;\n            align-items: center;\n            justify-content: space-between;\n            border-bottom: 1px solid #eee;\n            box-shadow: 0 1px 3px rgba(0,0,0,0.05);\n        }\n\n        .header-left {\n            display: flex;\n            align-items: center;\n            gap: 12px;\n        }\n\n        .header-back {\n            font-size: 20px;\n            color: #666;\n            cursor: pointer;\n            padding: 4px;\n        }\n\n        .header-title {\n            font-size: 16px;\n            font-weight: 600;\n            color: #333;\n        }\n\n        /* 排序按钮 */\n        .sort-buttons {\n            display: flex;\n            gap: 8px;\n        }\n\n        .sort-btn {\n            padding: 6px 14px;\n            font-size: 13px;\n            border-radius: 16px;\n            cursor: pointer;\n            background: #f5f5f5;\n            color: #666;\n            border: none;\n            transition: all 0.2s;\n            font-weight: 500;\n        }\n\n        .sort-btn.active {\n            background: #07c160;\n            color: #fff;\n        }\n\n        .sort-btn:hover:not(.active) {\n            background: #eee;\n        }\n\n        /* 评论按钮样式 */\n        .comment-btn {\n            padding: 6px 5px;\n            font-size: 13px;\n            border-radius: 0;\n            cursor: pointer;\n            background: transparent;\n            color: #07c160;\n            border: none;\n            transition: all 0.2s;\n            font-weight: 500;\n            white-space: nowrap;\n            flex-shrink: 0;\n            box-shadow: none;\n        }\n\n        .comment-btn:hover {\n            color: #05a850;\n            transform: none;\n            box-shadow: none;\n        }\n\n        .comment-btn:active {\n            transform: none;\n            box-shadow: none;\n        }\n\n        /* 确保头部布局不会变形 */\n        .header {\n            flex-wrap: wrap;\n        }\n\n        .header-left {\n            flex-shrink: 1;\n            overflow: hidden;\n            min-width: 0;\n        }\n\n        .header-title {\n            white-space: nowrap;\n            overflow: hidden;\n            text-overflow: ellipsis;\n            max-width: 180px;\n        }\n\n        .sort-buttons {\n            flex-shrink: 1;\n            min-width: 0;\n        }\n\n        /* 排序按钮 */\n        .sort-btn {\n            padding: 5px 10px;\n            font-size: 12px;\n        }\n\n        /* 评论按钮样式 */\n        .comment-btn {\n            padding: 5px 8px;\n            font-size: 12px;\n        }\n\n        /* 响应式调整 */\n        @media (max-width: 480px) {\n            .header {\n                padding: 10px 12px;\n            }\n\n            .header-left {\n                gap: 8px;\n            }\n\n            .header-title {\n                font-size: 14px;\n                max-width: 150px;\n            }\n\n            .sort-buttons {\n                gap: 6px;\n            }\n\n            .sort-btn {\n                padding: 4px 10px;\n                font-size: 11px;\n            }\n\n            .comment-btn {\n                padding: 4px 6px;\n                font-size: 11px;\n            }\n\n            .theme-toggle {\n                width: 32px;\n                height: 32px;\n                margin-left: 8px;\n            }\n        }\n\n        /* 主容器 */\n        .main-container {\n            padding: 60px 0 0;\n        }\n\n        /* 段落引用 */\n        .paragraph-quote {\n            background: #fff;\n            padding: 16px;\n            margin: 12px;\n            border-radius: 8px;\n            border-left: 3px solid #07c160;\n            font-size: 14px;\n            color: #666;\n            line-height: 1.7;\n        }\n\n        /* 热门评论区域 */\n        .hot-section {\n            margin: 12px;\n        }\n\n        .section-header {\n            display: flex;\n            align-items: center;\n            padding: 8px 0;\n            margin-bottom: 8px;\n        }\n\n        .section-header i {\n            color: #ff6b6b;\n            margin-right: 8px;\n            font-size: 16px;\n        }\n\n        .section-title {\n            font-size: 15px;\n            font-weight: 600;\n            color: #333;\n        }\n\n        .section-count {\n            color: #999;\n            font-size: 13px;\n            margin-left: 8px;\n            font-weight: normal;\n        }\n\n        /* 评论列表 */\n        .comment-list {\n            background: #fff;\n            border-radius: 8px;\n            overflow: hidden;\n        }\n\n        /* 评论卡片 */\n        .comment-item {\n            padding: 16px;\n            border-bottom: 1px solid #f0f0f0;\n        }\n\n        .comment-item:last-child {\n            border-bottom: none;\n        }\n\n        .comment-main {\n            display: flex;\n            gap: 12px;\n        }\n\n        .comment-avatar {\n            flex-shrink: 0;\n        }\n\n        .comment-avatar img {\n            width: 40px;\n            height: 40px;\n            border-radius: 50%;\n            object-fit: cover;\n            background: #f0f0f0;\n        }\n\n        .comment-body {\n            flex: 1;\n            min-width: 0;\n        }\n\n        .comment-header {\n            display: flex;\n            align-items: center;\n            flex-wrap: wrap;\n            margin-bottom: 6px;\n        }\n\n        .comment-username {\n            font-size: 14px;\n            font-weight: 500;\n            color: #333;\n            margin-right: 8px;\n        }\n\n        .comment-tag {\n            font-size: 10px;\n            padding: 2px 6px;\n            border-radius: 4px;\n            margin-right: 6px;\n            font-weight: 500;\n        }\n\n        .tag-author {\n            background: linear-gradient(135deg, #ff6b6b, #ff8787);\n            color: #fff;\n        }\n\n        .tag-vip {\n            background: linear-gradient(135deg, #ffa726, #ffcc02);\n            color: #7c5200;\n        }\n\n        .tag-custom {\n            background: linear-gradient(135deg, #4fc3f7, #29b6f6);\n            color: #fff;\n        }\n\n        .comment-content {\n            font-size: 15px;\n            color: #333;\n            line-height: 1.6;\n            word-break: break-word;\n            margin-bottom: 10px;\n        }\n\n        .comment-content .bq {\n            width: 20px;\n            height: 20px;\n            vertical-align: middle;\n            margin: 0 1px;\n        }\n\n        .comment-image {\n            max-width: 200px;\n            max-height: 200px;\n            border-radius: 8px;\n            margin-bottom: 10px;\n            cursor: pointer;\n        }\n\n        .comment-footer {\n            display: flex;\n            align-items: center;\n            justify-content: space-between;\n        }\n\n        .comment-meta {\n            display: flex;\n            align-items: center;\n            gap: 16px;\n        }\n\n        .comment-time {\n            font-size: 12px;\n            color: #999;\n        }\n\n        .comment-reply-btn {\n            font-size: 12px;\n            color: #666;\n            cursor: pointer;\n            padding: 4px 8px;\n            border-radius: 4px;\n            transition: background 0.2s;\n        }\n\n        .comment-reply-btn:hover {\n            background: #f5f5f5;\n        }\n\n        .comment-likes {\n            display: flex;\n            align-items: center;\n            gap: 4px;\n            color: #999;\n            font-size: 13px;\n        }\n\n        .comment-likes i {\n            font-size: 14px;\n        }\n\n        /* 展开回复 */\n        .expand-replies {\n            display: flex;\n            align-items: center;\n            margin-top: 12px;\n            padding-left: 52px;\n            color: #576b95;\n            font-size: 13px;\n            cursor: pointer;\n        }\n\n        .expand-replies::before {\n            content: '';\n            width: 20px;\n            height: 1px;\n            background: #ddd;\n            margin-right: 8px;\n        }\n\n        .expand-replies i {\n            margin-left: 4px;\n            font-size: 10px;\n            transition: transform 0.3s;\n        }\n\n        .expand-replies.expanded i {\n            transform: rotate(180deg);\n        }\n\n        /* 回复列表 */\n        .reply-list {\n            margin-top: 12px;\n            padding-left: 52px;\n            display: none;\n        }\n\n        .reply-list.show {\n            display: block;\n        }\n\n        .reply-item {\n            padding: 12px 0;\n            border-bottom: 1px solid #f5f5f5;\n        }\n\n        .reply-item:last-child {\n            border-bottom: none;\n        }\n\n        .reply-main {\n            display: flex;\n            gap: 10px;\n        }\n\n        .reply-avatar img {\n            width: 28px;\n            height: 28px;\n            border-radius: 50%;\n            object-fit: cover;\n            background: #f0f0f0;\n        }\n\n        .reply-body {\n            flex: 1;\n            min-width: 0;\n        }\n\n        .reply-header {\n            display: flex;\n            align-items: center;\n            flex-wrap: wrap;\n            margin-bottom: 4px;\n        }\n\n        .reply-username {\n            font-size: 13px;\n            font-weight: 500;\n            color: #333;\n        }\n\n        .reply-to {\n            font-size: 13px;\n            color: #999;\n            margin: 0 4px;\n        }\n\n        .reply-to-username {\n            font-size: 13px;\n            color: #576b95;\n        }\n\n        .reply-content {\n            font-size: 14px;\n            color: #333;\n            line-height: 1.5;\n            margin-bottom: 6px;\n        }\n\n        .reply-content .bq {\n            width: 18px;\n            height: 18px;\n            vertical-align: middle;\n            margin: 0 1px;\n        }\n\n        .reply-footer {\n            display: flex;\n            align-items: center;\n            justify-content: space-between;\n        }\n\n        .reply-time {\n            font-size: 11px;\n            color: #999;\n        }\n\n        .reply-likes {\n            display: flex;\n            align-items: center;\n            gap: 3px;\n            color: #999;\n            font-size: 12px;\n        }\n\n        /* 默认头像 */\n        .default-avatar {\n            width: 40px;\n            height: 40px;\n            border-radius: 50%;\n            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            color: #fff;\n            font-size: 18px;\n        }\n\n        .default-avatar.small {\n            width: 28px;\n            height: 28px;\n            font-size: 12px;\n        }\n\n        /* 底部输入栏 */\n        .bottom-bar {\n            position: fixed;\n            bottom: 0;\n            \n            left: 0;\n            right: 0;\n            background: #fff;\n            padding: 10px 16px;\n            padding-bottom: 20px;\n            display: flex;\n            align-items: center;\n            gap: 12px;\n            border-top: 1px solid #eee;\n            z-index: 100;\n        }\n\n        .input-wrapper {\n            flex: 1;\n            display: flex;\n            align-items: center;\n            background: #f5f5f5;\n            border-radius: 20px;\n            padding: 8px 16px;\n            cursor: pointer;\n        }\n\n        .input-wrapper span {\n            color: #999;\n            font-size: 14px;\n        }\n\n        .bottom-actions {\n            display: flex;\n            align-items: center;\n            gap: 16px;\n        }\n\n        .bottom-action-btn {\n            font-size: 22px;\n            color: #666;\n            cursor: pointer;\n            transition: color 0.2s;\n        }\n\n        .bottom-action-btn:hover {\n            color: #333;\n        }\n\n        /* 加载状态 */\n        .loading {\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            justify-content: center;\n            padding: 60px 20px;\n            color: #999;\n        }\n\n        .loading-spinner {\n            width: 32px;\n            height: 32px;\n            border: 3px solid #f0f0f0;\n            border-top-color: #07c160;\n            border-radius: 50%;\n            animation: spin 0.8s linear infinite;\n            margin-bottom: 12px;\n        }\n\n        @keyframes spin {\n            to { transform: rotate(360deg); }\n        }\n\n        /* 空状态 */\n        .empty {\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            justify-content: center;\n            padding: 80px 20px;\n            color: #999;\n        }\n\n        .empty i {\n            font-size: 48px;\n            margin-bottom: 16px;\n            opacity: 0.3;\n        }\n\n        .empty-title {\n            font-size: 15px;\n            color: #666;\n            margin-bottom: 8px;\n        }\n\n        .empty-desc {\n            font-size: 13px;\n            color: #999;\n        }\n\n        /* 没有更多 */\n        .no-more {\n            text-align: center;\n            padding: 20px;\n            color: #999;\n            font-size: 13px;\n        }\n\n        /* 评论弹窗 */\n        .modal-overlay {\n            position: fixed;\n            top: 0;\n            left: 0;\n            right: 0;\n            bottom: 0;\n            background: rgba(0, 0, 0, 0.5);\n            z-index: 200;\n            display: none;\n            align-items: flex-start;\n            justify-content: center;\n            overflow: hidden;\n            padding-top: 180px;\n        }\n\n        .modal-overlay.show {\n            display: flex;\n        }\n\n        .modal-content {\n            background: #fff;\n            width: 90%;\n            max-width: 500px;\n            border-radius: 16px;\n            padding: 20px;\n            animation: slideDown 0.3s ease;\n            transition: transform 0.3s ease;\n            max-height: 80vh;\n            box-shadow: 0 10px 40px rgba(0,0,0,0.2);\n        }\n\n        @keyframes slideDown {\n            from {\n                transform: translateY(-100%);\n            }\n            to {\n                transform: translateY(0);\n            }\n        }\n\n        .modal-header {\n            display: flex;\n            align-items: center;\n            justify-content: space-between;\n            margin-bottom: 16px;\n        }\n\n        .modal-title {\n            font-size: 16px;\n            font-weight: 600;\n        }\n\n        .modal-close {\n            font-size: 24px;\n            color: #999;\n            cursor: pointer;\n            padding: 4px;\n        }\n\n        .modal-textarea-wrapper {\n            position: relative;\n            margin-bottom: 12px;\n        }\n\n        .modal-textarea {\n            width: 100%;\n            min-height: 120px;\n            border: 1px solid #eee;\n            border-radius: 8px;\n            padding: 12px;\n            padding-bottom: 40px;\n            font-size: 15px;\n            resize: none;\n            outline: none;\n        }\n\n        .modal-textarea:focus {\n            border-color: #07c160;\n        }\n\n        .emoji-toggle-btn {\n            position: absolute;\n            bottom: 10px;\n            right: 10px;\n            font-size: 22px;\n            color: #999;\n            cursor: pointer;\n            background: none;\n            border: none;\n            padding: 4px;\n            transition: color 0.2s;\n        }\n\n        .emoji-toggle-btn:hover {\n            color: #07c160;\n        }\n\n        /* 表情面板 */\n        .emoji-panel {\n            position: absolute;\n            bottom: 45px;\n            right: 0;\n            background: #fff;\n            border: 1px solid #eee;\n            border-radius: 8px;\n            box-shadow: 0 4px 20px rgba(0,0,0,0.15);\n            padding: 12px;\n            width: 320px;\n            max-height: 280px;\n            overflow-y: auto;\n            z-index: 10;\n            display: none;\n        }\n\n        .emoji-panel.show {\n            display: block;\n        }\n\n        .emoji-grid {\n            display: grid;\n            grid-template-columns: repeat(6, 1fr);\n            gap: 6px;\n        }\n\n        .emoji-btn {\n            padding: 8px;\n            border: none;\n            background: transparent;\n            cursor: pointer;\n            border-radius: 6px;\n            transition: background 0.2s;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            aspect-ratio: 1;\n        }\n\n        .emoji-btn:hover {\n            background: #f0f0f0;\n        }\n\n        .emoji-btn img {\n            width: 24px;\n            height: 24px;\n        }\n\n        .modal-footer {\n            display: flex;\n            align-items: center;\n            justify-content: space-between;\n        }\n\n        .char-count {\n            font-size: 13px;\n            color: #999;\n        }\n\n        .char-count.over {\n            color: #ff4d4f;\n        }\n\n        .submit-btn {\n            background: #07c160;\n            color: #fff;\n            border: none;\n            padding: 8px 24px;\n            border-radius: 20px;\n            font-size: 14px;\n            font-weight: 500;\n            cursor: pointer;\n        }\n\n        .submit-btn:disabled {\n            background: #ccc;\n            cursor: not-allowed;\n        }\n\n        /* 图片预览 */\n        .image-preview {\n            position: fixed;\n            top: 0;\n            left: 0;\n            right: 0;\n            bottom: 0;\n            background: rgba(0, 0, 0, 0.9);\n            z-index: 300;\n            display: none;\n            align-items: center;\n            justify-content: center;\n        }\n\n        .image-preview.show {\n            display: flex;\n        }\n\n        .image-preview img {\n            max-width: 90%;\n            max-height: 90%;\n            border-radius: 8px;\n        }\n\n        .image-preview-close {\n            position: absolute;\n            top: 20px;\n            right: 20px;\n            font-size: 32px;\n            color: #fff;\n            cursor: pointer;\n        }\n\n        /* Toast */\n        .toast {\n            position: fixed;\n            top: 50%;\n            left: 50%;\n            transform: translate(-50%, -50%);\n            background: rgba(0, 0, 0, 0.75);\n            color: #fff;\n            padding: 12px 24px;\n            border-radius: 8px;\n            font-size: 14px;\n            z-index: 400;\n            display: none;\n        }\n\n        .toast.show {\n            display: block;\n        }\n\n        /* 隐藏 */\n        .hidden {\n            display: none !important;\n        }\n\n        /* 深色模式 */\n        html.dark, body.dark {\n            background: #1a1a1a;\n            color: #e0e0e0;\n        }\n\n        /* 确保在深色模式下整个页面都是深色背景 */\n        .dark {\n            background: #1a1a1a;\n        }\n\n        .dark .header {\n            background: #2d2d2d;\n            border-bottom-color: #3d3d3d;\n        }\n\n        .dark .header-title {\n            color: #e0e0e0;\n        }\n\n        .dark .header-back {\n            color: #999;\n        }\n\n        .dark .sort-btn {\n            background: #3d3d3d;\n            color: #999;\n        }\n\n        .dark .sort-btn:hover:not(.active) {\n            background: #4d4d4d;\n        }\n\n        .dark .sort-btn.active {\n            background: #07c160;\n            color: #fff;\n        }\n\n        .dark .comment-btn {\n            background: transparent;\n            color: #07c160;\n            box-shadow: none;\n        }\n\n        .dark .comment-btn:hover {\n            background: transparent;\n            color: #05a850;\n            box-shadow: none;\n        }\n\n        .dark .comment-btn:active {\n            background: transparent;\n            box-shadow: none;\n        }\n\n        .dark .paragraph-quote {\n            background: #2d2d2d;\n            color: #aaa;\n        }\n\n        .dark .comment-list {\n            background: #2d2d2d;\n        }\n\n        .dark .comment-item {\n            border-bottom-color: #3d3d3d;\n        }\n\n        .dark .comment-username {\n            color: #e0e0e0;\n        }\n\n        .dark .comment-content {\n            color: #ccc;\n        }\n\n        .dark .comment-time {\n            color: #777;\n        }\n\n        .dark .comment-likes {\n            color: #777;\n        }\n\n        .dark .expand-replies {\n            color: #5b9bd5;\n        }\n\n        .dark .expand-replies::before {\n            background: #4d4d4d;\n        }\n\n        .dark .reply-item {\n            border-bottom-color: #3d3d3d;\n        }\n\n        .dark .reply-username {\n            color: #e0e0e0;\n        }\n\n        .dark .reply-content {\n            color: #bbb;\n        }\n\n        .dark .reply-to-username {\n            color: #5b9bd5;\n        }\n\n        .dark .reply-time,\n        .dark .reply-likes {\n            color: #666;\n        }\n\n        .dark .bottom-bar {\n            background: #2d2d2d;\n            border-top-color: #3d3d3d;\n        }\n\n        .dark .input-wrapper {\n            background: #3d3d3d;\n        }\n\n        .dark .input-wrapper span {\n            color: #777;\n        }\n\n        .dark .bottom-action-btn {\n            color: #999;\n        }\n\n        .dark .modal-content {\n            background: #2d2d2d;\n        }\n\n        .dark .modal-title {\n            color: #e0e0e0;\n        }\n\n        .dark .modal-textarea {\n            background: #3d3d3d;\n            border-color: #4d4d4d;\n            color: #e0e0e0;\n        }\n\n        .dark .modal-textarea:focus {\n            border-color: #07c160;\n        }\n\n        .dark .emoji-panel {\n            background: #2d2d2d;\n            border-color: #4d4d4d;\n        }\n\n        .dark .emoji-btn:hover {\n            background: #3d3d3d;\n        }\n\n        .dark .section-title {\n            color: #e0e0e0;\n        }\n\n        .dark .loading {\n            color: #777;\n        }\n\n        .dark .loading-spinner {\n            border-color: #3d3d3d;\n            border-top-color: #07c160;\n        }\n\n        .dark .empty {\n            color: #666;\n        }\n\n        .dark .empty-title {\n            color: #999;\n        }\n\n        .dark .no-more {\n            color: #666;\n        }\n\n        .dark .default-avatar {\n            background: linear-gradient(135deg, #4a5568 0%, #2d3748 100%);\n        }\n\n        /* 深色模式切换按钮 */\n        .theme-toggle {\n            width: 36px;\n            height: 36px;\n            border-radius: 50%;\n            border: none;\n            background: #f5f5f5;\n            color: #666;\n            font-size: 16px;\n            cursor: pointer;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            transition: all 0.2s;\n            margin-left: 12px;\n        }\n\n        .theme-toggle:hover {\n            background: #eee;\n        }\n\n        .dark .theme-toggle {\n            background: #3d3d3d;\n            color: #ffc107;\n        }\n\n        .dark .theme-toggle:hover {\n            background: #4d4d4d;\n        }\n\n        /* ==================== PC端响应式优化 ==================== */\n        @media (min-width: 768px) {\n            body {\n                background: #e8e8e8;\n            }\n\n            .dark body,\n            body.dark {\n                background: #121212;\n            }\n\n            .header {\n                max-width: 800px;\n                left: 50%;\n                transform: translateX(-50%);\n                border-radius: 0 0 12px 12px;\n                box-shadow: 0 2px 12px rgba(0,0,0,0.08);\n            }\n\n            .main-container {\n                max-width: 800px;\n                margin: 0 auto;\n                padding-top: 72px;\n                background: transparent;\n            }\n\n            .paragraph-quote {\n                margin: 16px 0;\n                border-radius: 12px;\n                box-shadow: 0 2px 8px rgba(0,0,0,0.04);\n            }\n\n            .hot-section {\n                margin: 16px 0;\n            }\n\n            .comment-list {\n                border-radius: 12px;\n                box-shadow: 0 2px 8px rgba(0,0,0,0.04);\n            }\n\n            .comment-item {\n                padding: 20px 24px;\n            }\n\n            .comment-item:hover {\n                background: #fafafa;\n            }\n\n            .dark .comment-item:hover {\n                background: #363636;\n            }\n\n            .comment-avatar img,\n            .default-avatar {\n                width: 48px;\n                height: 48px;\n                font-size: 20px;\n            }\n\n            .comment-main {\n                gap: 16px;\n            }\n\n            .comment-username {\n                font-size: 15px;\n            }\n\n            .comment-content {\n                font-size: 15px;\n                line-height: 1.7;\n            }\n\n            .comment-image {\n                max-width: 300px;\n                max-height: 300px;\n            }\n\n            .expand-replies {\n                padding-left: 64px;\n            }\n\n            .reply-list {\n                padding-left: 64px;\n            }\n\n            .reply-avatar img,\n            .default-avatar.small {\n                width: 32px;\n                height: 32px;\n                font-size: 14px;\n            }\n\n            .reply-main {\n                gap: 12px;\n            }\n\n            .reply-username {\n                font-size: 14px;\n            }\n\n            .reply-content {\n                font-size: 14px;\n                line-height: 1.6;\n            }\n\n            .bottom-bar {\n                max-width: 800px;\n                left: 50%;\n                transform: translateX(-50%);\n                border-radius: 12px 12px 0 0;\n                box-shadow: 0 -2px 12px rgba(0,0,0,0.08);\n            }\n\n            .modal-content {\n                max-width: 600px;\n                margin: 0 auto;\n                border-radius: 16px;\n                margin-bottom: 20px;\n            }\n\n            /* 更多评论区域 */\n            #moreSection {\n                margin: 16px 0;\n            }\n\n            /* 加载状态 */\n            .loading,\n            .empty {\n                background: #fff;\n                border-radius: 12px;\n                margin: 16px 0;\n            }\n\n            .dark .loading,\n            .dark .empty {\n                background: #2d2d2d;\n            }\n\n            .no-more {\n                padding: 30px;\n            }\n\n            /* 列表容器 */\n            .main-container > div[style*=\"margin: 0 12px\"] {\n                margin: 0 !important;\n            }\n        }\n\n        /* 更大屏幕 */\n        @media (min-width: 1200px) {\n            .header,\n            .main-container,\n            .bottom-bar {\n                max-width: 900px;\n            }\n\n            .comment-item {\n                padding: 24px 32px;\n            }\n\n            .comment-avatar img,\n            .default-avatar {\n                width: 52px;\n                height: 52px;\n            }\n\n            .expand-replies,\n            .reply-list {\n                padding-left: 68px;\n            }\n        }\n\n        /* 超宽屏幕双栏布局（可选） */\n        @media (min-width: 1400px) {\n            .header,\n            .main-container,\n            .bottom-bar {\n                max-width: 1000px;\n            }\n        }\n    </style>\n</head>\n<body>\n    <!-- 顶部栏 -->\n    <div class=\"header\">\n        <div class=\"header-left\">\n            <span class=\"header-title\" id=\"headerTitle\">评论</span>\n        </div>\n        <div class=\"sort-buttons\" id=\"sortButtons\">\n            <button class=\"comment-btn\" id=\"commentBtn\" onclick=\"openCommentModal()\" style=\"display:none;\">\n                <i class=\"fas fa-pen\"></i> 去评论\n            </button>\n            <button class=\"sort-btn active\" id=\"sortByHot\" onclick=\"sortComments('hot')\">\n                <i class=\"fas fa-fire\"></i> 最热\n            </button>\n            <button class=\"sort-btn\" id=\"sortByTime\" onclick=\"sortComments('time')\">\n                <i class=\"fas fa-clock\"></i> 最新\n            </button>\n\n            <button class=\"theme-toggle\" id=\"themeToggle\" onclick=\"toggleTheme()\">\n                <i class=\"fas fa-moon\" id=\"themeIcon\"></i>\n            </button>\n        </div>\n    </div>\n\n    <!-- 主容器 -->\n    <div class=\"main-container\">\n        <!-- 段落内容 -->\n        <div class=\"paragraph-quote hidden\" id=\"paragraphQuote\"></div>\n\n        <!-- 热门评论区域（仅七猫） -->\n        <div class=\"hot-section hidden\" id=\"hotSection\">\n            <div class=\"section-header\">\n                <i class=\"fas fa-fire\"></i>\n                <span class=\"section-title\">热门评论</span>\n                <span class=\"section-count\" id=\"hotCount\"></span>\n            </div>\n            <div class=\"comment-list\" id=\"hotCommentList\"></div>\n        </div>\n\n        <!-- 更多评论标题（仅七猫） -->\n        <div class=\"hot-section hidden\" id=\"moreSection\">\n            <div class=\"section-header\">\n                <i class=\"fas fa-clock\" style=\"color: #07c160;\"></i>\n                <span class=\"section-title\">更多评论</span>\n                <span class=\"section-count\" id=\"moreCount\"></span>\n            </div>\n        </div>\n\n        <!-- 评论列表 -->\n        <div style=\"margin: 0 12px;\">\n            <div class=\"comment-list\" id=\"commentList\"></div>\n        </div>\n\n        <!-- 加载状态 -->\n        <div class=\"loading\" id=\"loading\">\n            <div class=\"loading-spinner\"></div>\n            <span>加载中...</span>\n        </div>\n\n        <!-- 空状态 -->\n        <div class=\"empty hidden\" id=\"empty\">\n            <i class=\"fas fa-comment-slash\"></i>\n            <div class=\"empty-title\">暂无评论</div>\n            <div class=\"empty-desc\">快来发表第一条评论吧</div>\n        </div>\n\n        <!-- 没有更多 -->\n        <div class=\"no-more hidden\" id=\"noMore\">— 没有更多评论了 —</div>\n    </div>\n\n    <!-- 底部输入栏（仅番茄显示） -->\n    <div class=\"bottom-bar hidden\" id=\"bottomBar\">\n        <div class=\"input-wrapper\" onclick=\"openCommentModal()\">\n            <span>趣评千万条，你也来...</span>\n        </div>\n        <div class=\"bottom-actions\">\n            <i class=\"far fa-smile bottom-action-btn\" onclick=\"openCommentModal()\"></i>\n        </div>\n    </div>\n\n    <!-- 评论弹窗 -->\n    <div class=\"modal-overlay\" id=\"commentModal\" onclick=\"closeCommentModal(event)\">\n        <div class=\"modal-content\" onclick=\"event.stopPropagation()\">\n            <div class=\"modal-header\">\n                <span class=\"modal-title\">发表评论</span>\n                <i class=\"fas fa-times modal-close\" onclick=\"closeCommentModal()\"></i>\n            </div>\n            <div class=\"modal-textarea-wrapper\">\n                <textarea class=\"modal-textarea\" id=\"commentTextarea\" placeholder=\"写下你的想法...\" maxlength=\"500\"></textarea>\n                <button type=\"button\" class=\"emoji-toggle-btn\" id=\"emojiToggleBtn\" onclick=\"toggleEmojiPanel(event)\">\n                    <i class=\"far fa-smile\"></i>\n                </button>\n                <div class=\"emoji-panel\" id=\"emojiPanel\">\n                    <div class=\"emoji-grid\" id=\"emojiGrid\"></div>\n                </div>\n            </div>\n            <div class=\"modal-footer\">\n                <span class=\"char-count\" id=\"charCount\">0/500</span>\n                <button class=\"submit-btn\" id=\"submitBtn\" onclick=\"submitComment()\">发表</button>\n            </div>\n        </div>\n    </div>\n\n    <!-- 图片预览 -->\n    <div class=\"image-preview\" id=\"imagePreview\" onclick=\"closeImagePreview()\">\n        <i class=\"fas fa-times image-preview-close\"></i>\n        <img id=\"previewImage\" src=\"\" alt=\"\">\n    </div>\n\n    <!-- Toast -->\n    <div class=\"toast\" id=\"toast\"></div>\n\n    <script>\n        // 配置\n        const urlParams = new URLSearchParams(\"${url}\");\n        const config = {\n            bookId: urlParams.get('book_id'),\n            itemId: urlParams.get('item_id'),\n            currentPara: urlParams.get('para'),\n            ssionid: urlParams.get('ssionid'),\n            source: urlParams.get('source') || '番茄',\n            cursor: '',\n            lastCursor: '', // 保存上一个cursor用于错误恢复\n            hasMore: false,\n            isLoading: false,\n            currentSort: 'hot',\n            comments: [],\n            hotComments: [],\n            allComments: [],\n            loadRetryCount: 0, // 加载重试次数\n            maxRetryCount: 3 // 最大重试次数\n        };\n\n        // 表情映射\n        const emojiMap = ${JSON.stringify(getFanqieEmojiMap(baser_url))};\n\n        // 初始化\n        document.addEventListener('DOMContentLoaded', () => {\n            initTheme();\n            initSortButtons();\n\n            // 隐藏底部输入栏，使用顶部评论按钮\n            document.body.style.paddingBottom = '20px';\n\n            document.getElementById('commentTextarea').addEventListener('input', updateCharCount);\n\n            initEmojiPanel(); // 初始化表情面板\n            initInfiniteScroll();\n            loadComments();\n        });\n\n        function initTheme() {\n            let readerSettings = localStorage.getItem('readerSettings');\n            let theme = localStorage.getItem('theme');\n            if (readerSettings) {\n                try {\n                    const parsed = JSON.parse(readerSettings);\n                    if (parsed.theme !== undefined) {\n                        theme = parsed.theme;\n                    }\n                } catch {}\n            }\n            \n            // 设置默认值为auto\n            if (!theme) {\n                theme = 'auto';\n                localStorage.setItem('theme', 'auto');\n            }\n            \n            updateTheme(theme);\n        }\n\n        function updateTheme(theme) {\n            const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n            let isDark;\n            \n            if (theme === 'auto') {\n                isDark = prefersDark;\n            } else {\n                isDark = theme === 'dark';\n            }\n            \n            if (isDark) {\n                document.documentElement.classList.add('dark');\n                document.body.classList.add('dark');\n            } else {\n                document.documentElement.classList.remove('dark');\n                document.body.classList.remove('dark');\n            }\n            \n            updateThemeIcon(theme);\n        }\n\n        function updateThemeIcon(theme) {\n            const icon = document.getElementById('themeIcon');\n            \n            if (theme === 'auto') {\n                icon.className = 'fas fa-adjust';\n            } else if (theme === 'dark') {\n                icon.className = 'fas fa-sun';\n            } else {\n                icon.className = 'fas fa-moon';\n            }\n        }\n\n        function toggleTheme() {\n            let currentTheme = localStorage.getItem('theme');\n            let newTheme;\n            \n            if (currentTheme === 'auto') {\n                // From auto to opposite of current system preference\n                const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n                newTheme = prefersDark ? 'light' : 'dark';\n            } else if (currentTheme === 'light') {\n                newTheme = 'dark';\n            } else {\n                newTheme = 'auto';\n            }\n            \n            localStorage.setItem('theme', newTheme);\n            updateTheme(newTheme);\n        }\n\n        // Listen for system theme changes in auto mode\n        window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {\n            const currentTheme = localStorage.getItem('theme');\n            if (currentTheme === 'auto') {\n                updateTheme('auto');\n            }\n        });\n\n        function initInfiniteScroll() {\n            let scrollTimeout;\n            let lastScrollTime = 0;\n            \n            window.addEventListener('scroll', () => {\n                const now = Date.now();\n                if (now - lastScrollTime < 100) return; // 节流，100ms内不重复处理\n                lastScrollTime = now;\n                \n                clearTimeout(scrollTimeout);\n                scrollTimeout = setTimeout(() => {\n                    if (config.isLoading || !config.hasMore) return;\n                    \n                    const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;\n                    const windowHeight = window.innerHeight;\n                    const documentHeight = document.documentElement.scrollHeight;\n                    const distance = documentHeight - (scrollTop + windowHeight);\n\n                    // 增加触发距离，避免过早加载\n                    if (distance < 100 && distance > -50) {\n                        loadComments();\n                    }\n                }, 150); // 防抖，150ms后执行\n            }, { passive: true });\n        }\n\n        function initSortButtons() {\n            const sortByHot = document.getElementById('sortByHot');\n            if (config.source === '七猫') {\n                sortByHot.innerHTML = '<i class=\"fas fa-history\"></i> 最早';\n            }\n        }\n\n        function initEmojiPanel() {\n            const emojiGrid = document.getElementById('emojiGrid');\n            if (!emojiGrid) return;\n\n            Object.entries(emojiMap).forEach(([text, src]) => {\n                const btn = document.createElement('button');\n                btn.type = 'button';\n                btn.className = 'emoji-btn';\n                btn.innerHTML = \\`<img src=\"\\${src}\" alt=\"\\${text}\">\\`;\n                btn.onclick = (e) => {\n                    e.preventDefault();\n                    e.stopPropagation();\n                    insertEmoji(text);\n                };\n                emojiGrid.appendChild(btn);\n            });\n        }\n\n        function toggleEmojiPanel(e) {\n            e.preventDefault();\n            e.stopPropagation();\n            document.getElementById('emojiPanel').classList.toggle('show');\n        }\n\n        function insertEmoji(text) {\n            const textarea = document.getElementById('commentTextarea');\n            const start = textarea.selectionStart;\n            const end = textarea.selectionEnd;\n            const textBefore = textarea.value.substring(0, start);\n            const textAfter = textarea.value.substring(end);\n            textarea.value = textBefore + text + textAfter;\n            textarea.focus();\n            textarea.selectionStart = textarea.selectionEnd = start + text.length;\n            updateCharCount();\n            document.getElementById('emojiPanel').classList.remove('show');\n        }\n\n        function sortComments(sortType) {\n            if (config.currentSort === sortType) return;\n            config.currentSort = sortType;\n\n            document.querySelectorAll('.sort-btn').forEach(btn => btn.classList.remove('active'));\n            if (sortType === 'time') {\n                document.getElementById('sortByTime').classList.add('active');\n            } else {\n                document.getElementById('sortByHot').classList.add('active');\n            }\n\n            let sortedComments = [...config.allComments];\n            \n            if (config.source === '七猫') {\n                if (sortType === 'hot') {\n                    sortedComments.reverse();\n                }\n            } else {\n                if (sortType === 'hot') {\n                    sortedComments.sort((a, b) => (b.like_count || 0) - (a.like_count || 0));\n                } else {\n                    sortedComments.sort((a, b) => (b.create_timestamp || 0) - (a.create_timestamp || 0));\n                }\n            }\n\n            config.comments = sortedComments;\n            renderComments(sortedComments, false);\n        }\n\n        async function loadComments(retryCount = 0) {\n            if (config.isLoading) return;\n            \n            // 预检查：如果已经确定没有更多数据，直接返回\n            if (!config.cursor && config.comments.length > 0) {\n                console.log('没有更多数据可加载（cursor为空）');\n                return;\n            }\n            \n            // 如果已经有大量数据但cursor为空，认为已经加载完毕\n            if (!config.cursor && config.comments.length > 20) {\n                console.log('数据量充足且cursor为空，停止加载');\n                config.hasMore = false;\n                return;\n            }\n            \n            config.isLoading = true;\n\n            const isFirstLoad = !config.cursor;\n            if (!isFirstLoad) {\n                document.getElementById('noMore').classList.add('hidden');\n                showLoadingMore(true);\n            }\n\n            try {\n                let url = \\`${baser_url}/para_review?book_id=\\${config.bookId}&item_id=\\${config.itemId}&para=\\${config.currentPara}&source=\\${encodeURIComponent(config.source)}\\`;\n                \n                if (config.cursor) {\n                    url += \\`&cursor=\\${encodeURIComponent(config.cursor)}\\`;\n                }\n\n                // 添加超时控制\n                const controller = new AbortController();\n                const timeoutId = setTimeout(() => controller.abort(), 10000); // 10秒超时\n\n                const response = await fetch(url, {\n                    signal: controller.signal,\n                    headers: {\n                        'Accept': 'application/json',\n                        'Content-Type': 'application/json'\n                    }\n                });\n                \n                clearTimeout(timeoutId);\n                \n                if (!response.ok) {\n                    throw new Error(\\`HTTP \\${response.status}: \\${response.statusText}\\`);\n                }\n                \n                const result = await response.json();\n\n                document.getElementById('loading').classList.add('hidden');\n                showLoadingMore(false);\n\n                if (result.code === 0 && result.data) {\n                    const data = result.data;\n\n                    if (isFirstLoad) {\n                        // 修复：如果 total 为 0 但实际有评论，使用评论数组长度\n                        const commentCount = data.total || \n                            (data.comments?.length || 0) + (data.hot_comments?.length || 0);\n                        document.getElementById('headerTitle').textContent = commentCount > 0 \n                            ? \\`\\${commentCount}条评论\\` \n                            : '评论';\n                    }\n\n                    if (isFirstLoad && data.paragraph_content) {\n                        const paraEl = document.getElementById('paragraphQuote');\n                        paraEl.textContent = data.paragraph_content.length > 100 \n                            ? data.paragraph_content.substring(0, 100) + '...' \n                            : data.paragraph_content;\n                        paraEl.classList.remove('hidden');\n                    }\n\n                    if (isFirstLoad && data.hot_comments && data.hot_comments.length > 0) {\n                        config.hotComments = data.hot_comments;\n                        renderHotComments(data.hot_comments);\n                        document.getElementById('hotSection').classList.remove('hidden');\n                        document.getElementById('moreSection').classList.remove('hidden');\n                        document.getElementById('moreCount').textContent = \\`(\\${data.total || 0})\\`;\n                    }\n\n                    // 处理评论数据（包括空数据情况）\n                    const comments = data.comments || [];\n                    if (comments.length > 0) {\n                        if (isFirstLoad) {\n                            config.allComments = [...comments];\n                            config.comments = [...comments];\n                            renderComments(comments, false);\n                        } else {\n                            config.allComments = config.allComments.concat(comments);\n                            config.comments = config.comments.concat(comments);\n                            renderComments(comments, true);\n                        }\n                    }\n\n                    // 更严谨的状态判断\n                    const hasMoreFromServer = data.has_more;\n                    const nextCursor = data.next_cursor || '';\n                    \n                    // 如果服务器明确返回hasMore=false，或者没有下一页游标且当前页数据为空，则停止加载\n                    config.hasMore = hasMoreFromServer === true && nextCursor !== '' && comments.length > 0;\n                    \n                    // 特殊情况：如果服务器返回hasMore=true但没有数据，可能是后端bug，保守处理\n                    if (hasMoreFromServer === true && comments.length === 0) {\n                        console.warn('服务器返回hasMore=true但没有数据，停止加载以避免死循环');\n                        config.hasMore = false;\n                    }\n                    \n                    config.lastCursor = config.cursor; // 保存上一个cursor\n                    config.cursor = nextCursor;\n\n                    // 调试日志\n                    console.log(\\`加载完成: 当前页\\${comments.length}条, hasMore=\\${config.hasMore}, cursor='\\${config.cursor}'\\`);\n                    \n                    if (!config.hasMore && config.comments.length > 0) {\n                        document.getElementById('noMore').classList.remove('hidden');\n                        console.log('已到达最后一页，停止加载更多');\n                    }\n\n                    if (config.comments.length === 0 && config.hotComments.length === 0) {\n                        document.getElementById('empty').classList.remove('hidden');\n                    }\n                } else {\n                    if (isFirstLoad) {\n                        document.getElementById('empty').classList.remove('hidden');\n                    }\n                }\n            } catch (error) {\n                console.error('加载评论失败:', error);\n                document.getElementById('loading').classList.add('hidden');\n                showLoadingMore(false);\n                \n                // 更详细的错误处理\n                let errorMsg = '加载失败，请重试';\n                if (error.name === 'AbortError') {\n                    errorMsg = '请求超时，请检查网络后重试';\n                } else if (error.message.includes('HTTP')) {\n                    errorMsg = '服务器错误，请稍后重试';\n                } else if (error.message.includes('Failed to fetch')) {\n                    errorMsg = '网络连接失败，请检查网络';\n                }\n                \n                showToast(errorMsg);\n                \n                // 重置cursor，允许重试\n                if (!isFirstLoad) {\n                    config.cursor = config.lastCursor || '';\n                }\n                \n                // 自动重试机制\n                if (retryCount < config.maxRetryCount && !isFirstLoad) {\n                    const retryDelay = Math.min(1000 * Math.pow(2, retryCount), 5000); // 指数退避，最大5秒\n                    console.log(\\`加载失败，\\${retryDelay/1000}秒后重试(\\${retryCount + 1}/\\${config.maxRetryCount})\\`);\n                    \n                    setTimeout(() => {\n                        loadComments(retryCount + 1);\n                    }, retryDelay);\n                    \n                    // 显示重试提示\n                    showToast(\\`加载失败，\\${retryDelay/1000}秒后自动重试\\`);\n                    return; // 不重置isLoading，让重试逻辑处理\n                }\n            } finally {\n                config.isLoading = false;\n            }\n        }\n\n        function showLoadingMore(show) {\n            let loadingMore = document.getElementById('loadingMore');\n            if (!loadingMore) {\n                loadingMore = document.createElement('div');\n                loadingMore.id = 'loadingMore';\n                loadingMore.className = 'loading';\n                loadingMore.style.padding = '20px';\n                loadingMore.style.opacity = '0';\n                loadingMore.style.transition = 'opacity 0.3s ease';\n                loadingMore.innerHTML = '<div class=\"loading-spinner\" style=\"width:24px;height:24px;margin-bottom:8px;\"></div><span style=\"font-size:13px;\">加载更多...</span>';\n                document.querySelector('.main-container').appendChild(loadingMore);\n                \n                // 强制重排后添加动画\n                setTimeout(() => {\n                    loadingMore.style.opacity = '1';\n                }, 10);\n            }\n            \n            if (show) {\n                loadingMore.style.display = 'flex';\n                setTimeout(() => {\n                    loadingMore.style.opacity = '1';\n                }, 10);\n            } else {\n                loadingMore.style.opacity = '0';\n                setTimeout(() => {\n                    loadingMore.style.display = 'none';\n                }, 300);\n            }\n        }\n\n        function renderHotComments(comments) {\n            const container = document.getElementById('hotCommentList');\n            container.innerHTML = '';\n            document.getElementById('hotCount').textContent = \\`(\\${comments.length})\\`;\n\n            comments.forEach(comment => {\n                container.appendChild(createCommentElement(comment, 'hot'));\n            });\n        }\n\n        function renderComments(comments, append = false) {\n            const container = document.getElementById('commentList');\n            if (!append) {\n                container.innerHTML = '';\n            }\n\n            comments.forEach(comment => {\n                container.appendChild(createCommentElement(comment, 'normal'));\n            });\n        }\n\n        function createCommentElement(comment, type) {\n            const div = document.createElement('div');\n            div.className = 'comment-item';\n            div.dataset.commentId = comment.comment_id;\n\n            // 用户标签\n            let tagsHtml = '';\n            if (comment.user && comment.user.is_author) {\n                tagsHtml += '<span class=\"comment-tag tag-author\">作者</span>';\n            }\n            if (comment.user && comment.user.is_vip) {\n                tagsHtml += '<span class=\"comment-tag tag-vip\">VIP</span>';\n            }\n            if (comment.user && comment.user.tags) {\n                comment.user.tags.forEach(tag => {\n                    tagsHtml += \\`<span class=\"comment-tag tag-custom\">\\${tag}</span>\\`;\n                });\n            }\n\n            // 图片\n            let imageHtml = '';\n            if (comment.image_url) {\n                imageHtml = \\`<img class=\"comment-image\" src=\"\\${comment.image_url}\" onclick=\"openImagePreview('\\${comment.image_url}')\" alt=\"\" onerror=\"this.style.display='none'\">\\`;\n            }\n\n            // 展开回复逻辑\n            let expandHtml = '';\n            let replyListHtml = '';\n            \n            const inlineReplyCount = (comment.replies && comment.replies.length) || 0;\n            const serverReplyCount = comment.reply_count || 0;\n            \n            // 只有当有回复时才显示展开按钮\n            if (serverReplyCount > 0 || inlineReplyCount > 0) {\n                const uniqueId = \\`\\${type}-\\${comment.comment_id}\\`;\n                const totalReplies = Math.max(serverReplyCount, inlineReplyCount);\n                \n                // 七猫：始终从接口获取回复（内嵌回复只是预览）\n                if (config.source === '七猫') {\n                    expandHtml = \\`\n                        <div class=\"expand-replies\" onclick=\"toggleReplies('\\${uniqueId}', '\\${comment.comment_id}')\">\n                            展开\\${totalReplies}条回复\n                            <i class=\"fas fa-chevron-down\"></i>\n                        </div>\n                    \\`;\n                    replyListHtml = \\`<div class=\"reply-list\" id=\"replies-\\${uniqueId}\"></div>\\`;\n                } else if (inlineReplyCount > 0) {\n                    // 番茄/塔读：有内嵌回复，默认收起，标记已加载\n                    replyListHtml = \\`<div class=\"reply-list\" id=\"replies-\\${uniqueId}\" data-loaded=\"true\">\\${renderRepliesHtml(comment.replies)}</div>\\`;\n                    expandHtml = \\`\n                        <div class=\"expand-replies\" onclick=\"toggleReplies('\\${uniqueId}', '\\${comment.comment_id}')\">\n                            展开\\${totalReplies}条回复\n                            <i class=\"fas fa-chevron-down\"></i>\n                        </div>\n                    \\`;\n                } else {\n                    // 没有内嵌回复，需要从接口加载\n                    expandHtml = \\`\n                        <div class=\"expand-replies\" onclick=\"toggleReplies('\\${uniqueId}', '\\${comment.comment_id}')\">\n                            展开\\${totalReplies}条回复\n                            <i class=\"fas fa-chevron-down\"></i>\n                        </div>\n                    \\`;\n                    replyListHtml = \\`<div class=\"reply-list\" id=\"replies-\\${uniqueId}\"></div>\\`;\n                }\n            }\n\n            // 头像\n            const userName = comment.user?.user_name || '匿名用户';\n            const userAvatar = comment.user?.user_avatar || '';\n            const avatarHtml = userAvatar \n                ? \\`<img src=\"\\${userAvatar}\" alt=\"\" onerror=\"this.style.visibility='hidden'\">\\`\n                : \\`<div class=\"default-avatar\"><i class=\"fas fa-user\"></i></div>\\`;\n\n            div.innerHTML = \\`\n                <div class=\"comment-main\">\n                    <div class=\"comment-avatar\">\n                        \\${avatarHtml}\n                    </div>\n                    <div class=\"comment-body\">\n                        <div class=\"comment-header\">\n                            <span class=\"comment-username\">\\${userName}</span>\n                            \\${tagsHtml}\n                        </div>\n                        <div class=\"comment-content\">\\${convertEmoji(comment.content || '')}</div>\n                        \\${imageHtml}\n                        <div class=\"comment-footer\">\n                            <div class=\"comment-meta\">\n                                <span class=\"comment-time\">\\${comment.create_time || ''}</span>\n                                \\${config.source === '番茄' ? '<span class=\"comment-reply-btn\" style=\"display:none;\">回复</span>' : ''}\n                            </div>\n                            <div class=\"comment-likes\">\n                                <i class=\"far fa-heart\"></i>\n                                <span>\\${comment.like_count || 0}</span>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n                \\${expandHtml}\n                \\${replyListHtml}\n            \\`;\n\n            return div;\n        }\n\n        function renderRepliesHtml(replies) {\n            if (!replies || replies.length === 0) return '';\n\n            return replies.map(reply => {\n                let replyToHtml = '';\n                if (reply.reply_to_user && reply.reply_to_user.user_name) {\n                    replyToHtml = \\`\n                        <span class=\"reply-to\">回复</span>\n                        <span class=\"reply-to-username\">\\${reply.reply_to_user.user_name}</span>\n                    \\`;\n                }\n\n                let tagsHtml = '';\n                if (reply.user && reply.user.is_author) {\n                    tagsHtml += '<span class=\"comment-tag tag-author\" style=\"margin-left:6px;\">作者</span>';\n                }\n\n                const userName = reply.user?.user_name || '匿名';\n                const userAvatar = reply.user?.user_avatar || '';\n                const avatarHtml = userAvatar \n                    ? \\`<img src=\"\\${userAvatar}\" alt=\"\" onerror=\"this.style.visibility='hidden'\">\\`\n                    : \\`<div class=\"default-avatar small\"><i class=\"fas fa-user\"></i></div>\\`;\n\n                return \\`\n                    <div class=\"reply-item\">\n                        <div class=\"reply-main\">\n                            <div class=\"reply-avatar\">\n                                \\${avatarHtml}\n                            </div>\n                            <div class=\"reply-body\">\n                                <div class=\"reply-header\">\n                                    <span class=\"reply-username\">\\${userName}</span>\n                                    \\${tagsHtml}\n                                    \\${replyToHtml}\n                                </div>\n                                <div class=\"reply-content\">\\${convertEmoji(reply.content || '')}</div>\n                                <div class=\"reply-footer\">\n                                    <span class=\"reply-time\">\\${reply.create_time || ''}</span>\n                                    <div class=\"reply-likes\">\n                                        <i class=\"far fa-heart\"></i>\n                                        <span>\\${reply.like_count || 0}</span>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                \\`;\n            }).join('');\n        }\n\n        async function toggleReplies(uniqueId, commentId) {\n            const container = document.getElementById(\\`replies-\\${uniqueId}\\`);\n            const expandLink = document.querySelector(\\`[onclick*=\"toggleReplies('\\${uniqueId}'\"]\\`);\n            const isExpanded = container.classList.contains('show');\n\n            if (isExpanded) {\n                // 收起\n                container.classList.remove('show');\n                const replyCount = container.querySelectorAll('.reply-item').length;\n                expandLink.innerHTML = \\`展开\\${replyCount}条回复 <i class=\"fas fa-chevron-down\"></i>\\`;\n                expandLink.classList.remove('expanded');\n            } else {\n                // 展开\n                if (container.dataset.loaded === 'true') {\n                    // 已有数据，直接显示\n                    container.classList.add('show');\n                    expandLink.innerHTML = '收起回复 <i class=\"fas fa-chevron-down\"></i>';\n                    expandLink.classList.add('expanded');\n                } else {\n                    // 需要加载\n                    expandLink.innerHTML = '加载中... <i class=\"fas fa-spinner fa-spin\"></i>';\n                    container.classList.add('show');\n\n                    try {\n                        const url = \\`${baser_url}/para_review?book_id=\\${config.bookId}&item_id=\\${config.itemId}&comment_id=\\${commentId}&source=\\${encodeURIComponent(config.source)}\\`;\n                        const response = await fetch(url);\n                        const result = await response.json();\n\n                        if (result.code === 0 && result.data && result.data.replies && result.data.replies.length > 0) {\n                            container.innerHTML = renderRepliesHtml(result.data.replies);\n                            container.dataset.loaded = 'true';\n                            expandLink.innerHTML = '收起回复 <i class=\"fas fa-chevron-down\"></i>';\n                            expandLink.classList.add('expanded');\n                        } else {\n                            container.innerHTML = '<div style=\"padding:16px;color:#999;font-size:13px;text-align:center;\">暂无回复</div>';\n                            container.dataset.loaded = 'true';\n                            expandLink.innerHTML = '收起 <i class=\"fas fa-chevron-down\"></i>';\n                            expandLink.classList.add('expanded');\n                        }\n                    } catch (error) {\n                        console.error('加载回复失败:', error);\n                        container.innerHTML = '<div style=\"padding:16px;color:#ff4d4f;font-size:13px;text-align:center;\">加载失败，点击重试</div>';\n                        container.classList.remove('show');\n                        expandLink.innerHTML = '展开回复 <i class=\"fas fa-chevron-down\"></i>';\n                    }\n                }\n            }\n        }\n\n        function convertEmoji(text) {\n                    if (!text) return '';\n            Object.entries(emojiMap).forEach(([key, src]) => {\n                const regex = new RegExp(key.replace(/[.*+?^\\${}()|[\\\\]\\\\\\\\]/g, '\\\\\\\\$&'), 'g');\n                text = text.replace(regex, \\`<img src=\"\\${src}\" class=\"bq\" alt=\"\\${key}\">\\`);\n            });\n            return text;\n        }\n\n        function openCommentModal() {\n            if (config.source !== '番茄') {\n                showToast('当前平台暂不支持评论');\n                return;\n            }\n            document.getElementById('commentModal').classList.add('show');\n            document.getElementById('commentTextarea').focus();\n        }\n\n        function closeCommentModal(event) {\n            if (event && event.target !== document.getElementById('commentModal')) return;\n            document.getElementById('commentModal').classList.remove('show');\n            document.getElementById('emojiPanel').classList.remove('show');\n        }\n\n        function updateCharCount() {\n            const textarea = document.getElementById('commentTextarea');\n            const charCount = document.getElementById('charCount');\n            const length = textarea.value.length;\n            charCount.textContent = \\`\\${length}/500\\`;\n            charCount.classList.toggle('over', length > 500);\n        }\n\n        async function submitComment() {\n            const content = document.getElementById('commentTextarea').value.trim();\n            if (!content) {\n                showToast('请输入评论内容');\n                return;\n            }\n            if (content.length > 500) {\n                showToast('评论内容不能超过500字');\n                return;\n            }\n\n            try {\n                const url = \\`${baser_url}/post_idea_review?ssionid=\\${config.ssionid}\\`;\n                const response = await fetch(url, {\n                    method: 'POST',\n                    headers: { 'Content-Type': 'application/json' },\n                    body: JSON.stringify({\n                        text: content,\n                        book_id: config.bookId,\n                        item_id: config.itemId,\n                        para: config.currentPara,\n                        para_content: content\n                    })\n                });\n                const result = await response.json();\n\n                if (result.code === 0) {\n                    showToast('发表成功');\n                    closeCommentModal();\n                    document.getElementById('commentTextarea').value = '';\n                    updateCharCount();\n                    config.cursor = '';\n                    config.allComments = [];\n                    config.comments = [];\n                    config.hotComments = [];\n                    loadComments();\n                } else {\n                    showToast(result.msg || '发表失败');\n                }\n            } catch (error) {\n                console.error('发表评论失败:', error);\n                showToast('发表失败，请重试');\n            }\n        }\n\n        function openImagePreview(url) {\n            document.getElementById('previewImage').src = url;\n            document.getElementById('imagePreview').classList.add('show');\n        }\n\n        function closeImagePreview() {\n            document.getElementById('imagePreview').classList.remove('show');\n        }\n\n        function showToast(message) {\n            const toast = document.getElementById('toast');\n            toast.textContent = message;\n            toast.classList.add('show');\n            setTimeout(() => toast.classList.remove('show'), 2000);\n        }\n    </script>\n</body>\n</html>`\n}\n\n\n//按钮切换时改变源变量并刷新发现\nfunction show(m, t) {\n    const {\n        java,\n        source\n    } = this;\n    //源变量为空时刷新发现，重置源变量\n    source.getVariable()==''?java.refreshExplore():'';//\n    var data = JSON.parse(source.getVariable());\n    //java.log(data);\n    data[t] = m;\n    if (t==\"find_tab\"){\n    \tdata[\"find_source\"]=\"番茄\";\n    \t}\n    //java.longToast(JSON.stringify(data));\n    source.setVariable(JSON.stringify(data, null, 2));\n    java.refreshExplore();\n}\n\n/**\n * 创建筛选器配置\n * @param {string} title - 筛选器标题\n * @param {string[]} chars - 选项列表\n * @param {string} defaultVal - 默认值\n * @param {string} paramKey - URL参数名\n * @param {number} size - 布局占比（0-1之间，如0.33表示33%）\n * @returns {Object} 筛选器配置对象\n */\nfunction createFilter(title, chars, defaultVal, paramKey, size) {\n    return {\n        title: title,\n        type: \"select\",\n        chars: chars,\n        default: defaultVal,\n        action: `show(infoMap['${title}'],'${paramKey}')`,\n        style: {\n            layout_flexGrow: 1,\n            layout_flexBasisPercent: size\n        }\n    };\n}\n\nfunction removeAllImgTags(htmlString) {\n    const imgTagRegex = /<img\\b[^>]*>|<\\/img>|<img\\b[^>]*\\/>/gi;\n    return htmlString.replace(imgTagRegex, '');\n}\n", "lastUpdateTime": "1785502151197", "loginUi": "[{\n        \"name\": \"邮箱\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"密码\",\n        \"type\": \"password\"\n    }, {\n        \"name\": \"♥登录书源\",\n        \"type\": \"button\",\n        \"action\": \"login(true)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"🔐注册书源\",\n        \"type\": \"button\",\n        \"action\": \"register()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"⛔️清空设置\",\n        \"type\": \"button\",\n        \"action\": \"reCookieSettings()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"✨设置检测\",\n        \"type\": \"button\",\n        \"action\": \"applyCookieSettings()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \" 🔚 退出登录\",\n        \"type\": \"button\",\n        \"action\": \"logout()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"📡 发现页兼容\",\n        \"type\": \"button\",\n        \"action\": \"fxyjr()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🏝用户后台\",\n        \"type\": \"button\",\n        \"action\": \"loginqt()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \" 🗑 清除设备\",\n        \"type\": \"button\",\n        \"action\": \"clearDevice()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🔮 检测登录\",\n        \"type\": \"button\",\n        \"action\": \"checkStatus()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"☕打赏享福利\",\n        \"type\": \"button\",\n        \"action\": \"vip()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"❇️ 更新书源\",\n        \"type\": \"button\",\n        \"action\": \"renderVersionPage()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"==下方配置为书源设置页面==\",\n        \"type\": \"button\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"📑更少简介\",\n        \"type\": \"button\",\n        \"action\": \"set_info()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"📝段评开关\",\n        \"type\": \"button\",\n        \"action\": \"paracomment('fqpara')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"📚 同步书架\",\n        \"type\": \"button\",\n        \"action\": \"set_reading()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"💬 本章说\",\n        \"type\": \"button\",\n        \"action\": \"fanqieChapterSwitch()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"💢 强制搜索全部\",\n        \"type\": \"button\",\n        \"action\": \"disabledSources()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"🍅番茄登录\",\n        \"type\": \"button\",\n        \"action\": \"fq_login()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"➿️ 图片显示\",\n        \"type\": \"button\",\n        \"action\": \"closeImg()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"📐 使用教程\",\n        \"type\": \"button\",\n        \"action\": \"jc()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"🗂当前模式\",\n        \"type\": \"button\",\n        \"action\": \"get_media()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"📖小说模式\",\n        \"type\": \"button\",\n        \"action\": \"set_media('小说')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"🔊听书模式\",\n        \"type\": \"button\",\n        \"action\": \"set_media('听书')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"🏞漫画模式\",\n        \"type\": \"button\",\n        \"action\": \"set_media('漫画')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"🖲短剧模式\",\n        \"type\": \"button\",\n        \"action\": \"set_media('短剧')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"🎚切换服务器\",\n        \"type\": \"button\",\n        \"action\": \"set_server()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"♻️检测当前服务器\",\n        \"type\": \"button\",\n        \"action\": \"checkNet()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"⚕️本地/服务器 \",\n        \"type\": \"button\",\n        \"action\": \"get_proxy()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"📌永久发布页📌\",\n        \"type\": \"button\",\n        \"action\": \"api()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"↓↓下方可切换来源用于搜索/发现页↓↓\",\n        \"type\": \"button\",\n        \"action\": \"get_media()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"💖我来推荐\",\n        \"type\": \"button\",\n        \"action\": \"put_book()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"全部\",\n        \"type\": \"button\",\n        \"action\": \"set_source('全部')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('番茄')\",\n        'name': '番茄',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('69书吧')\",\n        'name': '69书吧',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('七猫')\",\n        'name': '七猫',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('百度')\",\n        'name': '百度',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('起点')\",\n        'name': '起点(第三方)',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('得间')\",\n        'name': '得间',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('塔读')\",\n        'name': '塔读',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('书旗')\",\n        'name': '书旗',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('QQ')\",\n        'name': 'QQ',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('猫眼')\",\n        'name': '猫眼',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('搜书神器')\",\n        'name': '搜书神器',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('得奇')\",\n        'name': '得奇',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('伪69')\",\n        'name': '伪69',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('爱下电子书')\",\n        'name': '爱下电子书',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('小米')\",\n        'name': '小米',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('星星小说')\",\n        'name': '星星小说',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('笔趣阁22')\",\n        'name': '笔趣阁22',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('顶点')\",\n        'name': '顶点',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('幻梦轻小说')\",\n        'name': '幻梦轻小说',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('江湖')\",\n        'name': '江湖',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('知乎')\",\n        'name': '知乎',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('vip')\",\n        'name': '下方为VIP专属书源(点击此处搜所有vip)',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        'action': \"set_source('喜马拉雅')\",\n        'name': '喜马拉雅',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('svip')\",\n            'name': '下方为SVIP专属书源(点击此处搜所有svip)',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 1\n            }\n        }, {\n            'action': \"set_source('超会专属短剧')\",\n            'name': '超会专属短剧',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('超会专属小说')\",\n            'name': '超会专属小说',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n        'action': \"set_source('酷我')\",\n        'name': '酷我',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n            'action': \"set_source('台湾小说')\",\n            'name': '台湾小说',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('3A小说')\",\n            'name': '3A小说',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {       \t  \t\n            'action': \"set_source('QQ阅读')\",\n            'name': 'QQ(会员书籍免费)',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('久久小说')\",\n            'name': '久久小说',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n        \t    'action': \"set_source('追更人')\",\n            'name': '追更人',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('漫画屋')\",\n            'name': '漫画屋',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('漫画网')\",\n            'name': '漫画网',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('52书库')\",\n            'name': '52书库',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('腐小说')\",\n            'name': '腐小说',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('完本小说')\",\n            'name': '完本小说',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('盐选文库')\",\n            'name': '盐选文库',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {    \t     \t\n            'action': \"set_source('有度中文')\",\n            'name': '有度中文',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('三零读书')\",\n            'name': '三零读书',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('鹿鹿')\",\n            'name': '鹿鹿',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('阅友小说')\",\n            'name': '阅友小说',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('星空小说')\",\n            'name': '星空小说',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('全免漫画')\",\n            'name': '全免漫画',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('365小说')\",\n            'name': '365小说',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('冷冷文学')\",\n            'name': '冷冷文学',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('万相书城')\",\n            'name': '万相书城',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n             'action': \"set_source('幻梦轻小说')\",\n            'name': '幻梦轻小说',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\t\n            'action': \"set_source('独步小说')\",\n            'name': '独步小说',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('福书网')\",\n            'name': '福书网',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('速读谷')\",\n            'name': '速读谷',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n            'action': \"set_source('书斋阁')\",\n            'name': '书斋阁',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {      \t\n            'action': \"set_source('全本同人')\",\n            'name': '全本同人',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n             }\n        }, {\n        'action': \"set_source('漫客栈')\",\n        'name': '漫客栈',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('武芊漫画')\",\n        'name': '武芊漫画',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n    \t    'action': \"set_source('鸟韩漫')\",\n        'name': '鸟韩漫',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n    \t    'action': \"set_source('新新漫画')\",\n        'name': '新新漫画',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n    \t    'action': \"set_source('拷贝漫画')\",\n        'name': '拷贝漫画',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {  \t\n        'action': \"set_source('YY短剧')\",\n        'name': 'YY短剧',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n    \t    'action': \"set_source('极速影视')\",\n        'name': '极速影视',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        'action': \"set_source('东梨短剧')\",\n        'name': '东梨短剧',\n        'type': 'button',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {     \n       \n             'action': \"set_source('星芽短剧')\",\n            'name': '星芽短剧',\n            'type': 'button',\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4\n            }\n        }, {\n        \"name\": \"自定义搜索源(多个用英文,分割)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"自定义服务器(可不填)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"自定义评论颜色(可不填)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"段评气泡样式(0-4)\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"手动填写番茄token(可不填)\",\n        \"type\": \"text\"\n    }\n]", "loginUrl": "// 当前书源版本号，切勿修改，否则影响更新的识别\nconst localVersion = '5.7.31.2';\n\nlet controlUrl = host[0];\n\nfunction login(flag) {\n    if (flag == undefined) {\n        result = JSON.parse(source.getLoginInfo())\n    } else {\n        java.longToast(\"\\n\\n💞正在登录中...\")\n        putLoginInfo(JSON.stringify(result))\n    }\n    let base_url = getArgument('server') || host[0]\n    let zdyserver = String(result['自定义服务器(可不填)']);\n    if (zdyserver.includes('http')) {\n        setArgument('server', zdyserver);\n        if (getKey(String(cookie.getCookie(base_url)))) {\n            let cookies = cookie.getCookie(base_url)\n            try {\n                cookie.removeCookie(base_url)\n            } catch (e) {}\n            cookie.setCookie(zdyserver, cookies)\n        }\n        java.toast(`\\n\\n当前服务器为自定义服务器\\n${zdyserver}\\n\\n切换服务器请先清空服务器地址中的数据`);\n    }\n    let plcolor = String(getArgument('plcolor') || result['自定义评论颜色(可不填)'] || '#000000');\n    if (plcolor) {\n        setArgument('plcolor', plcolor);\n    } else {\n        setArgument('plcolor', '#000000');\n    }\n    let zdysources = String(result['自定义搜索源(多个用英文,分割)'] || '');\n    if (zdysources) {\n        setArgument('sources', zdysources);\n    };\n    base_url = getArgument('server')\n    let register_email = String(result['邮箱'])\n    let password = String(result['密码'])\n    let key = String(result['密钥'] || '')\n\n    if ((register_email && password || key) && !String(getKey(String(cookie.getCookie(base_url))))) {\n        try {\n            cookie.removeCookie(base_url)\n        } catch (e) {}\n        let deviceKey = '';\n        try {\n            deviceKey = java.deviceID();\n        } catch (e) {\n            deviceKey = java.androidId();\n        };\n        let deviceId = deviceKey;\n        if (register_email && password) {\n            let options = JSON.stringify({\n                method: 'POST',\n                headers: {\n                    'Content-Type': 'application/json'\n                },\n                body: JSON.stringify({\n                    register_email: result['邮箱'],\n                    password: result['密码']\n                })\n            })\n            try {\n                let data = JSON.parse(java.ajax(`${base_url}/login_api,${options}`))\n                if (data.code == 0) {\n                    //java.toast(deviceId)\n                    java.toast(\"\\n\\n✅️登录成功\")\n                    cookie.setCookie(base_url, `qttoken=${data.key};deviceId=${deviceId}`);\n                    for (var _h = 0; _h < host.length; _h++) { try { cookie.setCookie(host[_h], `qttoken=${data.key};deviceId=${deviceId}`); } catch(_e){} }\n                    result['密钥'] = data.key\n                    setArgument('qttoken', data.key);\n                    putLoginInfo(JSON.stringify(result))\n                } else {\n                    java.toast('\\n\\n💔' + data.msg || \"登录失败，请重试！\")\n                }\n            } catch (e) {\n                java.toast(\"\\n\\n💔登录失败，请重试！\\n\" + e.message)\n            }\n        } else {\n            cookie.setCookie(base_url, `qttoken=${key};deviceId=${deviceId}`)\n            let res = java.ajax(`${base_url}/user_api,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n            try {\n                res = JSON.parse(res)\n                if (res.id != undefined) {\n                    setArgument('qttoken', key);\n                    java.toast('\\n\\n密钥登录成功')\n                    result['邮箱'] = res.email\n                    putLoginInfo(JSON.stringify(result))\n                } else {\n                    throw new Error()\n                }\n            } catch (e) {\n                java.log(e)\n                java.toast(\"\\n\\n💔登录失败\")\n            }\n        }\n    } else if (flag && String(getKey(String(cookie.getCookie(base_url))))) {\n        java.toast(\"\\n\\n当前✅️已登录，请🚫退出登录后重新登录\");\n        //checkStatus();\n    } else if (flag) {\n        java.toast(\"\\n\\n⛔️请先填写邮箱和密码\");\n    }\n}\n\nfunction objectToCookieString(obj) {\n    if (!obj || typeof obj !== 'object') {\n        return '';\n    }\n    return Object.entries(obj)\n        .map(([key, value]) => {\n            const stringValue = String(value);\n            const encodedKey = encodeURIComponent(key);\n            const encodedValue = encodeURIComponent(stringValue);\n            return `${encodedKey}=${encodedValue}`;\n        })\n        .join('; ');\n}\n\nfunction control() {\n    controlUrla = getArgument('controlUrl');\n    if (controlUrla) {\n        controlUrla = findFirstAvailableHost([controlUrla]);\n    }\n    if (!controlUrla) {\n        controlUrla = findFirstAvailableHost(host) || controlUrl;\n    }\n    setArgument('controlUrl', controlUrla);\n    try {\n        let open_argument = source.getVariable();\n        open_argument = JSON.parse(open_argument);\n        let control_cookie = objectToCookieString(open_argument);\n        cookie.setCookie(controlUrla, control_cookie);\n    } catch {}\n    //java.toast(cookie.getCookie(controlUrla))\n    java.startBrowserAwait(controlUrla + '/control', '大灰狼小说设置');\n    applyCookieSettings();\n}\n\nfunction applyCookieSettings() {\n    let controlUrla = getArgument('controlUrl') || controlUrl;\n    var cookieStr = String(cookie.getCookie(controlUrla));\n\n    var cookieData = {};\n    if (cookieStr && cookieStr !== 'null' && cookieStr !== 'undefined' && cookieStr !== '') {\n        var pairs = cookieStr.split('; ');\n        for (var i = 0; i < pairs.length; i++) {\n            var pair = pairs[i];\n            var eqIndex = pair.indexOf('=');\n            if (eqIndex > -1) {\n                var key = pair.substring(0, eqIndex).trim();\n                var value = decodeURIComponent(pair.substring(eqIndex + 1).trim());\n                cookieData[key] = value;\n                setArgument(key, value);\n            }\n        }\n    }\n\n    var displayConfig = [{\n            key: 'server',\n            label: '服务器',\n            defaultValue: host[0]\n        },\n        {\n            key: 'proxy',\n            label: '访问模式',\n            defaultValue: '云端'\n        },\n        {\n            key: 'tab',\n            label: '阅读模式',\n            defaultValue: '小说'\n        },\n        {\n            key: 'fqcommunity',\n            label: '本章说',\n            defaultValue: 'on'\n        },\n        {\n            key: 'sources',\n            label: '书源选择',\n            defaultValue: '全部'\n        },\n        {\n            key: 'fqpara',\n            label: '段评显示',\n            defaultValue: 'on'\n        },\n        {\n            key: 'disabled_sources',\n            label: '强制搜索',\n            defaultValue: '0'\n        },\n        {\n            key: 'reading',\n            label: '同步书架',\n            defaultValue: '0'\n        },\n        {\n            key: 'info',\n            label: '完整简介',\n            defaultValue: 'on'\n        }\n    ];\n\n    var valueMap = {\n        // 访问模式\n        '本地': '💻 本地',\n        '云端': '☁️ 云端',\n\n        // 开关状态\n        'on': '✅ 开启',\n        'off': '❌ 关闭',\n        '1': '✅ 开启',\n        '0': '❌ 关闭',\n\n        // 频道类型\n        '男频': '👨 男频',\n        '女频': '👩 女频',\n\n        // 内容类型\n        '小说': '📖 小说',\n        '听书': '🎧 听书',\n        '漫画': '🎨 漫画',\n        '短剧': '🎬 短剧',\n\n        // 来源类型\n        'vip': '💎 VIP专属',\n        'svip': '👑 SVIP专属',\n        '推荐': '⭐ 网友推荐',\n        '全部': '📚 全部'\n    };\n\n\n    var displayLines = [];\n\n    for (var i = 0; i < displayConfig.length; i++) {\n        var config = displayConfig[i];\n        var value = cookieData[config.key] || getArgument(config.key) || config.defaultValue;\r\n\n\n        if (!cookieData[config.key]) {\n            setArgument(config.key, config.defaultValue);\n        }\n\n        var displayValue = valueMap[value] || value;\n        if (config.key === 'sources' && displayValue.length > 25) {\n            displayValue = displayValue.substring(0, 25) + '...';\n        }\n\n        displayLines.push(config.label + ': ' + displayValue);\n    }\n\n    // 构建提示模板\n    var template = '✨ 当前配置\\n';\n    template += '━━━━━━━━━━━━━━━━\\n';\n    template += displayLines.join('\\n');\n    template += '\\n━━━━━━━━━━━━━━━━\\n';\n    template += '❤️当前应用的 *⚙️长按书源登录设置* 中的配置哦❤️'\n\n    // 显示提示\n    java.longToast(template);\n\n    return displayLines.length;\n}\n\n\nfunction reCookieSettings() {\n    let controlUrla = getArgument('controlUrl') || controlUrl;\n    cookie.removeCookie(controlUrla);\n    applyCookieSettings();\n\n}\n// 检测服务器\nfunction checkNet() {\n    let url = getArgument('server');\n    java.longToast(`\\n\\n♻️正在检测：${url}\\n请稍等~`);\n    let date1 = new Date().getTime();\n    let html = java.ajax(url + '/health');\n    let date2 = new Date().getTime();\n    let t = date2 - date1;\n    let res = {};\n    try {\n        res = JSON.parse(html);\n    } catch {}\n    let c = res.status != \"healthy\";\n    let code = 1;\n    let time = t / 1000 + 's';\n    let logTime = '【' + url + '】\\n┋┋\\n' + '解析时间：' + time;\n    if (c || t > 5000) {\n        java.longToast('\\n💔【访问失败提示】\\n' + '┏┅━┅━┅━┅━┅┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♣️当前接口无法访问(可能被墙)♣️\\n┋┋\\n请切换其他接口/切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅┅━┅━┅┛');\n    } else if (t < 1000) {\n        java.longToast('\\n💖【网络环境优良】\\n' + '┏┅━┅━┅━┅━┅┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n❤️延迟低，推荐使用此接口❤️\\n┋┋\\n网络环境优良，请继续保持状态\\n┋┋' + '\\n┗┅━┅━┅━┅━┅┅━┅━┅┛');\n    } else if (t >= 1000 && t < 2000) {\n        java.longToast('\\n💛【网络环境一般】\\n' + '┏┅━┅━┅━┅━┅┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♦️延迟一般，勉强可使用♦️\\n┋┋\\n请切换其他接口或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅┅━┅━┅┛');\n    } else if (t >= 2000 && t < 5000) {\n        java.longToast('\\n💔【网络环境堪忧】\\n' + '┏┅━┅━┅━┅━┅┅━┅━┅┓\\n┋┋\\n' + logTime + '\\n┋┋\\n♠延迟过高，不建议使用♠\\n┋┋\\n请切换其他接口或切换网络环境\\n┋┋' + '\\n┗┅━┅━┅━┅━┅┅━┅━┅┛');\n    }\n}\n\n\nfunction findFirstAvailableHost(hosts) {\n    // 按顺序检测，找到第一个可用的就返回\n    for (var i = 0; i < hosts.length; i++) {\n        var host = hosts[i];\n\n        try {\n            java.longToast(\"🔍 正在检测: \" + host);\n\n            var start = new Date().getTime();\n            var response = java.ajax(host + \"/health\");\n            var end = new Date().getTime();\n            var time = end - start;\n\n            // 检查是否可用\n            if (String(response).indexOf(\"大灰狼\") !== -1 && time <= 5000) {\n                // 显示结果\n                var status = \"✅ 可用\";\n                if (time < 1000) {\n                    status = \"💚 优秀\";\n                } else if (time < 2000) {\n                    status = \"💛 一般\";\n                } else {\n                    status = \"🧡 较慢\";\n                }\n                java.longToast(status + \"\\n主机: \" + host + \"\\n延迟: \" + time + \"ms\");\n                return host; // 直接返回找到的主机\n            }\n        } catch (e) {\n            // 这个主机失败，继续下一个\n        }\n    }\n\n    // 所有主机都不可用\n    java.longToast(\"❌ 没有可用的主机\");\n    return null;\n}\n\nfunction isVips(res) {\n    let isVIP = '';\n    let vipEndTime = res.vip_end_time;\n    let formattedDate = '';\n\n    if (vipEndTime && vipEndTime !== 0) {\n        let date = new Date(vipEndTime * 1000);\n        formattedDate = `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;\n        let currentTime = Math.floor(Date.now() / 1000);\n        let remainingDays = Math.ceil((vipEndTime - currentTime) / (24 * 60 * 60));\n        if (currentTime > vipEndTime) {\n            isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} (已过期)`;\n        } else if (remainingDays <= 7) {\n            isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} 剩余${remainingDays}天`;\n        } else {\n            if (vipEndTime < 1912946812) {\n                isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"}(${formattedDate})`;\n            } else {\n                isVIP = `${res.vip_level === 1 ? \"VIP\" : \"SVIP\"} (永久)`;\n            }\n        }\n    } else {\n        isVIP = '您尚未开通VIP';\n    }\n    return isVIP;\n}\n\nfunction checkStatus() {\n    java.longToast('\\n\\n♻️检测中...');\n    let base_url = getArgument('server')\n    let res = java.ajax(`${base_url}/user_api,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n    try {\n        res = JSON.parse(res)\n        if (res.id != undefined) {\n            result['邮箱'] = res.email\n            putLoginInfo(JSON.stringify(result))\n            let devices\n            try {\n                devices = Object.keys(JSON.parse(res.device)).length;\n            } catch (e) {\n                devices = res.device ? 1 : 0;\n            }\n            let isVip = isVips(res);\n            tips = `\n┏┅┅┅┅┅┅┱┄┄┄┄┄┄┄┄┄┄┐\n　 🧢昵称 　　　　${res.nickname.padEnd(20,\"\\t\") || \"未设置\".padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　✉️邮箱　　　　${res.email.replace(/(.{3}).*?@/,\"$1***@\").padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　🔑密钥　　　　${(`${res.user_key.substring(0,4)}***${res.user_key.slice(-4)}`).padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　📅注册时间　　${java.timeFormat(res.register_time*1000).padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　🗒️今日阅读　　${(java.timeFormat(new Date()).slice(0,10)==java.timeFormat(res.last_read_time * 1000).slice(0,10)?res.day_read_count:0).toString().padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　📚累计阅读　　${res.all_read_count.toString().padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　🕓最后阅读　　${(res.last_read_time != 0?java.timeFormat(res.last_read_time * 1000):'未阅读').padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　📱在线设备　　${devices.toString().padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　👑会员状态　　${isVip.padEnd(20,\"\\t\")}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　🚫封禁状态　　${res.is_banned?'已封禁':'正常　'}　　　　　　　\n┗┅┅┅┅┅┅┹┄┄┄┄┄┄┄┄┄┄┘\n`\n            java.log(tips)\n            java.longToast(tips)\n        } else {\n            throw new Error(res.msg)\n        }\n    } catch (e) {\n        //java.log(e)\n        java.toast(\"\\n检测登录失败\\n\" + e.message)\n    }\n}\n\nfunction clearDevice() {\n    let base_url = getArgument('server')\n    let res = java.ajax(`${base_url}/clear,{\"method\":\"POST\",\"headers\":{\"cookie\":\"${cookie.getCookie(base_url)}\"}}`)\n    res = JSON.parse(res);\n    java.toast(res.code == 0 ? \"\\n\\n📴设备清除成功\" : res.msg)\n    Packages.java.lang.Thread.sleep(500)\n    checkStatus()\n}\n// 保存登录UI信息\nfunction putLoginInfo(info) {\n    try {\n        let key = java.androidId()\n        let encodeStr = Packages.android.util.Base64.encodeToString(java.createSymmetricCrypto(\"AES\", key).encrypt(info), 2)\n        cache.put(`userInfo_${source.getKey()}`, encodeStr)\n        return true\n    } catch (e) {\n        java.log(e)\n        return source.putLoginInfo(info)\n    }\n}\n\n// 用户后台\nfunction loginqt() {\n    let base_url = getArgument('server');\n    let ck = String(cookie.getKey(base_url, \"qttoken\"));\n    if (!ck) {\n        java.longToast('\\n\\n🚫请先登录!')\n    } else {\n        java.startBrowserAwait(getArgument('server') + '/user', '大灰狼小说后台');\n    }\n}\n\n// 用户注册\nfunction register() {\n    let base_url = getArgument('server');\n    java.startBrowserAwait(getArgument('server') + '/register', '大灰狼小说注册');\n}\n\n//登录番茄\nfunction fq_login() {\n    try {\n        cookie.removeCookie(\"snssdk.com\");\n        cookie.removeCookie(\"fanqienovel.com\")\n    } catch (e) {}\n    try {\n        java.startBrowserAwait(\"https://fanqienovel.com/\", \"登录\")\n    } catch (e) {\n        java.toast(e)\n    }\n    var cookie_ = \"sessionid=\" + (String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) ? String(cookie.getKey(\"fanqienovel.com\", \"sessionid\")) : source.getLoginInfoMap()['手动登录Token'])\n    let user\n    try {\n        user = JSON.parse(java.ajax(\"https://fanqienovel.com/api/user/info/v2,\" + JSON.stringify({\n            method: \"GET\",\n            headers: {\n                \"Cookie\": cookie_\n            }\n        }))).data.name\n    } catch (e) {\n        java.log(e)\n    }\n    if (!cookie_ || cookie_ == \"sessionid=\" || !user) {\n        java.toast(\"未获取到登录凭据，登录失败\")\n        return false\n    }\n    java.toast(\"\\n\\n欢迎 \" + user + \"\\n登录成功！\")\n    return true\n}\n\n//退出登录\nfunction logout() {\n    cookie.removeCookie(\"fanqienovel.com\");\n    cookie.removeCookie(\"snssdk.com\");\n    cookie.removeCookie(\"69shuba.com\");\n    /*\n    let servers = host\n    for (let server of servers) {\n    \ttry{removeCookie(server )} catch(e){cookie.removeCookie(server )}\n    }\n    */\n    try {\n        cookie.removeCookie(getArgument('server'))\n    } catch (e) {}\n    java.toast(\"退出登录成功\");\n}\n\n//获取参数\nfunction getArgument(key) {\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    return open_argument[key];\n}\n\n//设置参数\nfunction setArgument(key, value) {\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '');\n    open_argument[key] = value;\n    open_argument = JSON.stringify(open_argument);\n    source.setVariable(open_argument);\n    return open_argument;\n}\n\n// 设置本地or云端访问\nfunction get_proxy() {\n    let proxy = getArgument('proxy');\n    if (proxy == '本地') {\n        setArgument('proxy', '云端');\n        java.longToast('\\n所有数据采用\\n\\n服务器网络访问\\n\\n如果发现用不了，请切换本地网络访问，如69书吧');\n    } else {\n        setArgument('proxy', '本地');\n        java.longToast('\\n所有数据采用\\n\\n本地网络访问\\n\\n如果发现用不了，请开启网络代理，如69书吧');\n    }\n}\n\n\nfunction closeImg() {\n    let close_img = getArgument('close_img');\n    if (close_img == 'on') {\n        setArgument('close_img', 'off');\n        java.longToast('\\n显示文中图片');\n    } else {\n        setArgument('close_img', 'on');\n        java.longToast('\\n不显示文中图片');\n    }\n}\n\n//设置男女频\nfunction set_source_type() {\n    let source_type = getArgument(\"source_type\");\n    if (source_type == '女频') {\n        setArgument(\"source_type\", '男频');\n        java.toast(\"\\n发现页已设置为:🙋‍♂️男频\");\n    } else {\n        setArgument(\"source_type\", '女频');\n        java.toast(\"\\n发现页已设置为:🙋‍♀️女频\");\n    }\n\n}\n\nfunction set_reading() {\n    let reading = getArgument(\"reading\");\n    if (reading == '1') {\n        setArgument(\"reading\", '0');\n        java.toast(\"\\n\\n大灰狼书架记录同步已关闭！\");\n    } else {\n        setArgument(\"reading\", '1');\n        java.longToast(\"\\n\\n大灰狼书架记录同步已开启！\\n刷新阅读书架即可将书架书籍同步到大灰狼书架！\");\n    }\n\n}\n\nfunction fxyjr() {\n    let fxyjr = getArgument('fxyjr');\n    if (fxyjr != 'on') {\n        setArgument('fxyjr', 'on');\n        java.longToast('\\n显示旧版发现页');\n    } else {\n        setArgument('fxyjr', 'off');\n        java.longToast('\\n显示新版发现页');\n    }\n}\n\n\n//设置男女频\nfunction set_source_type() {\n    let source_type = getArgument(\"source_type\");\n    if (source_type == '女频') {\n        setArgument(\"source_type\", '男频');\n        java.toast(\"\\n发现页已设置为:🙋‍♂️男频\");\n    } else {\n        setArgument(\"source_type\", '女频');\n        java.toast(\"\\n发现页已设置为:🙋‍♀️女频\");\n    }\n\n}\n\nfunction set_reading() {\n    let reading = getArgument(\"reading\");\n    if (reading == '1') {\n        setArgument(\"reading\", '0');\n        java.toast(\"\\n\\n大灰狼书架记录同步已关闭！\");\n    } else {\n        setArgument(\"reading\", '1');\n        java.longToast(\"\\n\\n大灰狼书架记录同步已开启！\\n刷新阅读书架即可将书架书籍同步到大灰狼书架！\");\n    }\n\n}\n\n//首页\n//首页\nfunction api() {\n    java.startBrowserAwait('http://svip.langge.cf', \"首页\");\n}\n\n//打赏\nfunction vip() {\n    let base_url = getArgument('server');\n    let ck = String(cookie.getKey(base_url, \"qttoken\"));\n    if (!ck) {\n        java.longToast('\\n\\n🚫请先登录!')\n    } else {\n        java.startBrowserAwait(getArgument('server') + '/coffee', '大灰狼小说会员开通');\n    }\n}\n\nvar server = getArgument('server');\n\n//设置搜索媒体\nfunction set_media(media) {\n    const mediaConfig = {\n        '喜马拉雅': ['听书'],\n        '番茄': '*',\n        '福利小说': ['小说'],\n        '如漫画': ['漫画'],\n        '包子漫画': ['漫画'],\n        '九妖漫画': ['漫画'],\n        '绅士漫画': ['漫画'],\n        '福利漫画': ['漫画'],\n        '好看漫画': ['漫画'],\n        '拷贝漫画': ['漫画'],\n        '新新漫画': ['漫画'],\n        '鸟韩漫漫画': ['漫画'],\n        '武芊漫画': ['漫画'],                                \n        '酷我听书': ['听书'],                \n        '七猫': ['小说', '听书', '短剧'],\n        '全部': '*', // 允许所有模式\n        '默认': ['小说']\n    };\n\n    const source = getArgument('sources');\n    const allowedModes = mediaConfig[source] || mediaConfig['默认'];\n    let targetMedia = mediaConfig['默认'][0];\n    let isAllowed = false;\n\n    if (allowedModes === '*' || allowedModes.includes(media)) {\n        targetMedia = media;\n        isAllowed = true;\n    } else if (Array.isArray(allowedModes)) {\n        targetMedia = allowedModes[0];\n    }\n\n    const message = isAllowed ?\n        `\\n\\n已切换至：${targetMedia}\\n请重新搜索书籍！` :\n        `\\n\\n目前${source}：不支持【${media}】模式！\\n已自动切换至：${targetMedia}`;\n\n    setArgument('tab', targetMedia);\n    java.toast(message);\n}\n\n//获取搜索媒体\nfunction get_media() {\n    let media = getArgument('tab');\n    let source = getArgument('sources');\n    if (media == '') {\n        media = '全部';\n    }\n    var tishi = '\\n\\n当前服务器：' + getArgument('server')\n    java.longToast(`\\n\\n当前使用源：${source}-${media}${tishi}`);\n}\n\n\n//设置服务器\nfunction set_server() {\n    putLoginInfo(JSON.stringify(result))\n    let zdyserver;\n    let base_url = getArgument('server')\n    try {\n        zdyserver = String(result['自定义服务器(可不填)']);\n        if (zdyserver.includes('http')) {\n            setArgument('server', zdyserver);\n            if (getKey(String(cookie.getCookie(base_url)))) {\n                let cookies = cookie.getCookie(base_url)\n                try {\n                    cookie.removeCookie(base_url)\n                } catch (e) {}\n                cookie.setCookie(zdyserver, cookies)\n            }\n            java.toast(`\\n\\n当前服务器为自定义服务器\\n${zdyserver}\\n\\n切换服务器请先清空服务器地址中的数据`);\n        } else {\n            zdyserver = '';\n        }\n    } catch (error) {\n        zdyserver = '';\n    }\n    if (!zdyserver) {\n        const servers = host\n        const currentServer = getArgument('server') || '';\n        const currentIndex = servers.indexOf(currentServer);\n\n        const nextIndex = currentIndex >= 0 ? (currentIndex + 1) % servers.length : 0;\n        const nextServer = servers[nextIndex];\n\n        setArgument('server', nextServer);\n        if (getKey(String(cookie.getCookie(currentServer)))) {\n            let cookies = cookie.getCookie(currentServer)\n            try {\n                cookie.removeCookie(currentServer)\n            } catch (e) {}\n            cookie.setCookie(nextServer, cookies)\n        }\n        java.longToast(`\\n\\n服务器【${nextIndex+1}】：${nextServer}`);\n    }\n}\n\n//获取音色\nvar tone_id = getArgument('tone_id');\n\nfunction get_tone_id(arg) {\n    var datadist = {\n        \"0\": \"默认音色\",\n        \"-1\": \"阅读模式\",\n        \"-2\": \"漫画模式\",\n        \"51\": \"多人发音\",\n        \"1\": \"甜美少女\",\n        \"2\": \"清亮青叔\",\n        \"5\": \"开朗青年\",\n        \"6\": \"温柔淑女\",\n        \"4\": \"成熟大叔\",\n        \"74\": \"大叔升级\",\n        \"30\": \"优雅御姐\"\n    };\n    var tone_id = datadist[arg] || arg;\n    var tishi = '\\n\\n当前音色：' + tone_id;\n    java.toast(tishi);\n}\n\n\n//设置来源\nfunction set_source(sources) {\n    let zdysources = String(result['自定义搜索源(多个用英文,分割)'] || '');\n    if (zdysources.length > 1 && zdysources != 'undefined') {\n        java.toast('\\n\\n请先清空自定义源再设置');\n    } else {\n        setArgument('sources', sources);\n        set_media('小说');\n        java.toast(`\\n\\n当前来源已切换为:\\n${sources}\\n\\n切换后请重新搜索`);\n    }\n}\n\n// 设置简介\nfunction set_info() {\n    var info = getArgument('info');\n    if (info == 'off') {\n        setArgument('info', 'on');\n        java.toast('\\n\\n已恢复详情页详细简介');\n    } else {\n        setArgument('info', 'off');\n        java.toast('\\n\\n已精简详情页简介');\n    }\n}\n\n// 番茄段评\nfunction paracomment() {\n    var fqpara = getArgument('fqpara');\n    if (fqpara != 'on') {\n        setArgument('fqpara', 'on');\n        java.longToast(\"\\n\\n段评已开启\\n\\n长按刷新段后面的图片即可\\n\\n如果图片不显示，刷新无反应\\n请更新测试版阅读app\");\n    } else {\n        setArgument('fqpara', 'off');\n        java.longToast('\\n\\n段评已关闭');\n    }\n}\n\n// 番茄正文末尾的本章说开关\nfunction fanqieChapterSwitch() {\n    var fqcommunity = getArgument('fqcommunity');\n    if (fqcommunity == 'off') {\n        setArgument('fqcommunity', 'on');\n        java.longToast('\\n\\n本章说已开启\\n\\n刷新正文后生效');\n    } else {\n        setArgument('fqcommunity', 'off');\n        java.longToast('\\n\\n本章说已关闭\\n\\n刷新正文后生效');\n    }\n}\n\n// 强制搜索被禁用的源\nfunction disabledSources() {\n    var disabled_sources = getArgument('disabled_sources');\n    if (disabled_sources == '1') {\n        setArgument('disabled_sources', '0');\n        java.longToast('\\n\\n强制搜索禁用的源已关闭');\n    } else {\n        setArgument('disabled_sources', '1');\n        setArgument('sources', '全部');\n        java.longToast(\"\\n\\n强制搜索禁用的源已开启\\n\\n注意：开启后搜索时间会变长！\");\n    }\n}\n\n// 我要推荐\nfunction put_book() {\n    java.startBrowserAwait(getArgument('server') + '/put_book', '我来推荐');\n}\n\n\n// 使用教程\nfunction jc(){\n\t  let html = `<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>使用教程</title>\n    <style>\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n        }\n\n        body {\n            background-color: #f5f5f5;\n            padding: 20px;\n        }\n\n        .container {\n            max-width: 800px;\n            margin: 0 auto;\n        }\n\n        h1 {\n            text-align: center;\n            color: #333;\n            margin-bottom: 30px;\n            padding-bottom: 10px;\n            border-bottom: 2px solid #4CAF50;\n        }\n\n        .tutorial-card {\n            background-color: white;\n            border-radius: 8px;\n            box-shadow: 0 2px 15px rgba(0, 0, 0, 0.1);\n            padding: 25px;\n            margin-bottom: 25px;\n            transition: transform 0.3s ease, box-shadow 0.3s ease;\n        }\n\n        .tutorial-card:hover {\n            transform: translateY(-5px);\n            box-shadow: 0 5px 20px rgba(0, 0, 0, 0.15);\n        }\n\n        .card-title {\n            color: #4CAF50;\n            margin-bottom: 15px;\n            font-size: 1.4em;\n        }\n\n        .card-content {\n            line-height: 1.6;\n            color: #555;\n        }\n\n        .keyword-list {\n            background-color: #f9f9f9;\n            border-left: 4px solid #4CAF50;\n            padding: 15px;\n            margin-top: 15px;\n            border-radius: 0 4px 4px 0;\n            font-family: monospace;\n        }\n\n        .keyword-item {\n            margin-bottom: 8px;\n        }\n    </style>\n</head>\n<body>\n    <div class=\"container\">\n        <h1>使用教程</h1>\n\n        <div class=\"tutorial-card\">\n            <h2 class=\"card-title\">搜索功能</h2>\n            <div class=\"card-content\">\n                <p><strong>1) 基础搜索：</strong>在发现页长按该书源，点击搜索，可直接搜索全部来源的小说。</p>\n                <p><strong>2) 进阶搜索：</strong>在“登陆-书源设置”中选择指定模式或来源，即可搜索指定内容。</p>\n                <p><strong>3) 快捷搜索：</strong>使用特殊关键词进行搜索。</p>\n                <div class=\"keyword-list\">\n                    <p class=\"keyword-item\">x:书名@来源 (例如: x:十日终焉@番茄)</p>\n                    <p class=\"keyword-item\">t:书名@来源 (例如: t:十日终焉@番茄)</p>\n                    <p class=\"keyword-item\">m:书名@来源 (例如: m:十日终焉@番茄)</p>\n                    <p class=\"keyword-item\">d:书名@来源 (例如: d:十日终焉@番茄)</p>\n                </div>\n                <p>其中，x表示小说（可省略），t表示听书，m表示漫画，d表示短剧。冒号支持中文和英文。</p>\n            </div>\n        </div>\n\n        <div class=\"tutorial-card\">\n            <h2 class=\"card-title\">发现页</h2>\n            <div class=\"card-content\">\n                <p>在书源设置中选择指定模式或者单个来源，然后刷新发现页即可。</p>\n            </div>\n        </div>\n\n        <div class=\"tutorial-card\">\n            <h2 class=\"card-title\">更多使用方式</h2>\n            <div class=\"card-content\">\n                <p>进入书源设置页面应该能一目了然。</p>\n            </div>\n        </div>\n    </div>\n</body>\n</html>`;\n\t  java.startBrowser(`data:text/html;base64,${java.base64Encode(html)}`, '大灰狼书源教程');\n\t}\n\n// 书源更新\nfunction renderVersionPage() {\n    let yd = '';\n    let html = `\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n  <meta charset=\"UTF-8\" />\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>书源更新</title>\n  <!-- Font Awesome 图标库 -->\n  <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css\" />\n  <style>\n    :root {\n      --primary-gradient: linear-gradient(135deg, #4e6ef2, #6b2dd8);\n      --latest-gradient: linear-gradient(135deg, #8e2de2 0%, #4a00e0 50%, #d4af37 100%);\n      --success-color: #28c76f;\n      --warning-color: #ff9f43;\n      --error-color: #ea5455;\n      --text-main: #1f2937;\n      --text-secondary: #6b7280;\n      --card-bg: #ffffff;\n      --border-color: #e5e7eb;\n      --light-bg: #f9fafb;\n      --shadow: 0 4px 12px rgba(78, 110, 242, 0.1);\n      --shadow-hover: 0 6px 18px rgba(78, 110, 242, 0.2);\n      --glow-shadow: 0 0 25px rgba(142, 45, 226, 0.5), 0 0 50px rgba(212, 175, 55, 0.3);\n      --modal-bg: rgba(31, 41, 55, 0.8);\n      --modal-content-bg: #ffffff;\n    }\n\n    * {\n      box-sizing: border-box;\n      margin: 0;\n      padding: 0;\n      font-family: 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;\n    }\n\n    body {\n      background: linear-gradient(135deg, #eef2ff, #f5f7ff);\n      color: var(--text-main);\n      min-height: 100vh;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      padding: 16px;\n    }\n\n    /* 加载动画 */\n    .loading-wrapper {\n      text-align: center;\n      animation: fadeIn 0.3s ease;\n    }\n\n    .loading-spinner {\n      width: 50px;\n      height: 50px;\n      border: 4px solid rgba(78, 110, 242, 0.3);\n      border-top-color: #4e6ef2;\n      border-radius: 50%;\n      margin: 0 auto 20px;\n      animation: spin 1s linear infinite;\n    }\n\n    .loading-text {\n      color: var(--text-main);\n      font-size: 16px;\n      font-weight: 500;\n    }\n\n    @keyframes spin {\n      to { transform: rotate(360deg); }\n    }\n\n    @keyframes fadeIn {\n      from { opacity: 0; transform: translateY(20px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n\n    @keyframes slideIn {\n      from { opacity: 0; transform: translateY(30px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n\n    @keyframes pulse {\n      0%, 100% { opacity: 1; }\n      50% { opacity: 0.7; }\n    }\n\n    @keyframes gradientAnimation {\n      0% { background-position: 0% 50%; }\n      50% { background-position: 100% 50%; }\n      100% { background-position: 0% 50%; }\n    }\n\n    @keyframes breathe {\n      0%, 100% { \n        transform: scale(1);\n        box-shadow: var(--glow-shadow), var(--shadow);\n      }\n      50% { \n        transform: scale(1.02);\n        box-shadow: 0 0 30px rgba(142, 45, 226, 0.6), 0 0 60px rgba(212, 175, 55, 0.4), var(--shadow);\n      }\n    }\n\n    @keyframes shimmer {\n      0% {\n        background-position: -200% center;\n      }\n      100% {\n        background-position: 200% center;\n      }\n    }\n\n    /* 主容器 */\n    .container {\n      width: 100%;\n      max-width: 420px;\n      background: var(--card-bg);\n      border-radius: 24px;\n      overflow: hidden;\n      box-shadow: var(--shadow);\n      position: relative;\n      z-index: 1;\n      animation: slideIn 0.5s ease;\n      display: none;\n    }\n\n    /* 头部 */\n    .header {\n      background: var(--primary-gradient);\n      color: #ffffff;\n      padding: 24px 16px;\n      text-align: center;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .header::before {\n      content: '';\n      position: absolute;\n      top: -30px;\n      left: -30px;\n      width: 80px;\n      height: 80px;\n      background: rgba(255, 255, 255, 0.15);\n      border-radius: 50%;\n    }\n\n    .header::after {\n      content: '';\n      position: absolute;\n      bottom: -60px;\n      right: -60px;\n      width: 150px;\n      height: 150px;\n      background: rgba(255, 255, 255, 0.1);\n      border-radius: 50%;\n    }\n\n    .header h1 {\n      font-size: 1.4rem;\n      font-weight: 700;\n      margin-bottom: 8px;\n      position: relative;\n      z-index: 2;\n    }\n\n    .header p {\n      font-size: 0.9rem;\n      opacity: 0.9;\n      line-height: 1.4;\n      position: relative;\n      z-index: 2;\n    }\n\n    .header-icon {\n      font-size: 48px;\n      margin-bottom: 10px;\n      display: inline-block;\n      animation: bounce 2s ease infinite;\n    }\n\n    @keyframes bounce {\n      0%, 100% { transform: translateY(0); }\n      50% { transform: translateY(-10px); }\n    }\n\n    /* 版本对比 */\n    .version-comparison {\n      display: flex;\n      flex-wrap: nowrap;\n      gap: 12px;\n      padding: 16px;\n      margin-top: 8px;\n      position: relative;\n      z-index: 10;\n    }\n\n    .version-card {\n      flex: 1;\n      min-width: 45%;\n      background: var(--card-bg);\n      border-radius: 16px;\n      padding: 28px 16px 16px;\n      box-shadow: var(--shadow);\n      text-align: center;\n      position: relative;\n      transition: transform 0.3s ease, box-shadow 0.3s ease;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n    }\n\n    .version-card:hover {\n      transform: translateY(-4px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .version-card.current-version {\n      background: linear-gradient(135deg, #ffffff 0%, #f8f9ff 100%);\n      border: 1px solid rgba(78, 110, 242, 0.15);\n    }\n\n    .version-card.current-version:hover {\n      box-shadow: 0 6px 20px rgba(78, 110, 242, 0.15);\n    }\n\n    .version-card.current-version h3,\n    .version-card.current-version .version-number,\n    .version-card.current-version .version-date {\n      color: var(--text-main);\n    }\n\n    .version-card.latest-version {\n      background: var(--latest-gradient);\n      background-size: 300% 300%;\n      box-shadow: var(--glow-shadow), var(--shadow);\n      color: #fff;\n      z-index: 2;\n      animation: gradientAnimation 6s ease infinite, breathe 3s ease-in-out infinite;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .version-card.latest-version::before {\n      content: '';\n      position: absolute;\n      top: -50%;\n      left: -50%;\n      width: 200%;\n      height: 200%;\n      background: linear-gradient(\n        90deg,\n        transparent,\n        rgba(255, 255, 255, 0.3),\n        transparent\n      );\n      transform: rotate(45deg);\n      animation: shimmer 3s infinite;\n    }\n\n    .version-card.latest-version h3,\n    .version-card.latest-version .version-number,\n    .version-card.latest-version .version-date {\n      color: #fff;\n      text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n      position: relative;\n      z-index: 1;\n    }\n\n    .version-status {\n      position: absolute;\n      top: 6px;\n      right: 6px;\n      padding: 3px 7px;\n      font-size: 0.65rem;\n      font-weight: 600;\n      border-radius: 6px;\n      color: #fff;\n      line-height: 1.2;\n      white-space: nowrap;\n      z-index: 2;\n    }\n\n    .version-card.latest-version .version-status {\n      background: rgba(255, 255, 255, 0.25);\n      backdrop-filter: blur(5px);\n      border: 1px solid rgba(255, 255, 255, 0.3);\n      color: #fff;\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n    }\n\n    .status-outdated { background: var(--warning-color); }\n    .status-latest { background: var(--success-color); }\n    .status-invalid { background: var(--error-color); }\n\n    .version-card h3 {\n      font-size: 0.9rem;\n      color: var(--text-secondary);\n      margin-bottom: 8px;\n      font-weight: 500;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 6px;\n    }\n\n    .version-number {\n      font-size: 1.25rem;\n      font-weight: 700;\n      color: var(--text-main);\n      margin: 8px 0;\n      transition: all 0.3s ease;\n      font-family: 'Courier New', monospace;\n    }\n\n    .version-card.latest-version .version-number {\n      font-size: 1.4rem;\n      transform: scale(1.05);\n      text-shadow: \n        0 2px 4px rgba(0, 0, 0, 0.3),\n        0 0 10px rgba(212, 175, 55, 0.8),\n        0 0 20px rgba(212, 175, 55, 0.5);\n      animation: pulse-glow 2s ease-in-out infinite;\n    }\n\n    @keyframes pulse-glow {\n      0%, 100% {\n        text-shadow: \n          0 2px 4px rgba(0, 0, 0, 0.3),\n          0 0 10px rgba(212, 175, 55, 0.8),\n          0 0 20px rgba(212, 175, 55, 0.5);\n      }\n      50% {\n        text-shadow: \n          0 2px 4px rgba(0, 0, 0, 0.3),\n          0 0 15px rgba(212, 175, 55, 1),\n          0 0 30px rgba(212, 175, 55, 0.7);\n      }\n    }\n\n    .version-date {\n      font-size: 0.8rem;\n      color: var(--text-secondary);\n      margin-top: 4px;\n    }\n\n    /* 版本对比指示器 */\n    .version-indicator {\n      position: absolute;\n      left: 50%;\n      top: 50%;\n      transform: translate(-50%, -50%);\n      z-index: 5;\n      width: 32px;\n      height: 32px;\n      border-radius: 50%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n      color: white;\n    }\n\n    .version-indicator.update-needed {\n      background: var(--error-color);\n      box-shadow: 0 2px 8px rgba(234, 84, 85, 0.4);\n      animation: pulse-indicator 1.5s infinite;\n    }\n\n    .version-indicator.is-latest {\n      background: var(--success-color);\n      box-shadow: 0 2px 8px rgba(40, 199, 111, 0.4);\n    }\n\n    @keyframes pulse-indicator {\n      0% { transform: translate(-50%, -50%) scale(1); }\n      50% { transform: translate(-50%, -50%) scale(1.1); }\n      100% { transform: translate(-50%, -50%) scale(1); }\n    }\n\n    /* 内容区 */\n    .content-container {\n      padding: 16px;\n    }\n\n    /* 状态提示 */\n    .status-alert {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      padding: 12px 16px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 10px;\n      font-weight: 500;\n      font-size: 14px;\n      animation: slideIn 0.5s ease 0.3s backwards;\n    }\n\n    .status-alert i {\n      font-size: 20px;\n    }\n\n    .status-alert.update-available {\n      background: linear-gradient(135deg, #ffeaa7 0%, #fdcb6e 100%);\n      color: #d63031;\n      box-shadow: 0 4px 15px rgba(253, 203, 110, 0.4);\n    }\n\n    .status-alert.up-to-date {\n      background: linear-gradient(135deg, #55efc4 0%, #00b894 100%);\n      color: white;\n      box-shadow: 0 4px 15px rgba(0, 184, 148, 0.4);\n    }\n\n    /* 更新容器 */\n    .update-container {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      animation: slideIn 0.5s ease 0.4s backwards;\n    }\n\n    .update-header {\n      background: var(--light-bg);\n      padding: 12px 16px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid var(--border-color);\n    }\n\n    .update-header h2 {\n      font-size: 1rem;\n      font-weight: 600;\n      color: var(--text-main);\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .update-header h2 i {\n      color: #4e6ef2;\n    }\n\n    .update-tag {\n      background: rgba(78, 110, 242, 0.1);\n      color: #4e6ef2;\n      padding: 4px 8px;\n      border-radius: 8px;\n      font-size: 0.75rem;\n      font-weight: 600;\n    }\n\n    .update-content {\n      padding: 16px;\n    }\n\n    .update-date {\n      font-weight: 600;\n      color: #4e6ef2;\n      margin-bottom: 12px;\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      padding: 8px 0;\n      border-bottom: 1px dashed #e0e0e0;\n    }\n\n    .update-text {\n      margin: 8px 0;\n      position: relative;\n      padding-left: 16px;\n      line-height: 1.5;\n      color: var(--text-main);\n      font-size: 0.95rem;\n      white-space: pre-wrap;\n      word-break: break-word;\n    }\n\n    .update-text::before {\n      content: '•';\n      position: absolute;\n      left: 0;\n      font-weight: bold;\n      color: #4e6ef2;\n      font-size: 1.2rem;\n      line-height: 1;\n    }\n\n    /* 历史日志 */\n    .history-container {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      animation: slideIn 0.5s ease 0.5s backwards;\n    }\n\n    .history-header {\n      background: var(--light-bg);\n      padding: 12px 16px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid var(--border-color);\n      cursor: pointer;\n      user-select: none;\n    }\n\n    .history-header:hover {\n      opacity: 0.8;\n    }\n\n    .history-header h2 {\n      font-size: 1rem;\n      font-weight: 600;\n      color: var(--text-main);\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .history-header h2 i {\n      color: #4e6ef2;\n    }\n\n    .toggle-history {\n      background: none;\n      border: none;\n      color: var(--text-secondary);\n      cursor: pointer;\n      font-weight: 500;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      font-size: 0.85rem;\n      transition: color 0.2s ease;\n    }\n\n    .toggle-history:hover {\n      color: #4e6ef2;\n    }\n\n    .history-content {\n      padding: 0 16px;\n      max-height: 0;\n      overflow: hidden;\n      transition: max-height 0.4s ease, padding 0.4s ease;\n    }\n\n    .history-content.expanded {\n      max-height: 60vh;\n      overflow-y: auto;\n      padding: 16px;\n      scrollbar-width: thin;\n      scrollbar-color: #4e6ef2 #f0f0f0;\n    }\n\n    .history-content.expanded::-webkit-scrollbar {\n      width: 6px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-track {\n      background: #f0f0f0;\n      border-radius: 4px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-thumb {\n      background: #4e6ef2;\n      border-radius: 4px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-thumb:hover {\n      background: #3a56d0;\n    }\n\n    .history-item {\n      margin-bottom: 16px;\n      padding-bottom: 16px;\n      border-bottom: 1px dashed var(--border-color);\n    }\n\n    .history-item:last-child {\n      border-bottom: none;\n      margin-bottom: 0;\n      padding-bottom: 0;\n    }\n\n    .history-date {\n      font-weight: 600;\n      color: var(--text-main);\n      margin-bottom: 8px;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      font-size: 0.9rem;\n      background: rgba(78, 110, 242, 0.05);\n      padding: 6px 10px;\n      border-radius: 6px;\n    }\n\n    .history-text {\n      margin: 8px 0;\n      padding-left: 16px;\n      line-height: 1.4;\n      color: var(--text-secondary);\n      position: relative;\n      font-size: 0.9rem;\n      white-space: pre-wrap;\n      word-break: break-word;\n    }\n\n    .history-text::before {\n      content: '•';\n      position: absolute;\n      left: 0;\n      color: #4e6ef2;\n      font-weight: bold;\n      font-size: 1.2rem;\n      line-height: 1;\n    }\n\n    /* 按钮组 */\n    .button-group {\n      display: flex;\n      flex-direction: column;\n      gap: 10px;\n      margin-bottom: 16px;\n    }\n\n    .button {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 10px;\n      padding: 14px 28px;\n      text-align: center;\n      font-size: 1rem;\n      border: none;\n      border-radius: 12px;\n      text-decoration: none;\n      background: var(--primary-gradient);\n      color: white;\n      font-weight: 600;\n      transition: all 0.3s ease;\n      box-shadow: var(--shadow);\n      position: relative;\n      overflow: hidden;\n      cursor: pointer;\n    }\n\n    .button i {\n      font-size: 1rem;\n    }\n\n    .button::after {\n      content: '';\n      position: absolute;\n      top: -50%;\n      left: -50%;\n      width: 200%;\n      height: 200%;\n      background: rgba(255, 255, 255, 0.1);\n      transform: rotate(30deg);\n      transition: all 0.6s ease;\n      pointer-events: none;\n    }\n\n    .button:hover {\n      transform: translateY(-3px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .button:hover::after {\n      transform: rotate(30deg) translate(20%, 20%);\n    }\n\n    .button:active {\n      transform: scale(0.95);\n    }\n\n    /* 错误状态 */\n    .error-state {\n      text-align: center;\n      padding: 40px 20px;\n      color: var(--text-main);\n    }\n\n    .error-icon {\n      font-size: 64px;\n      margin-bottom: 20px;\n      color: var(--error-color);\n    }\n\n    .error-text {\n      font-size: 16px;\n      line-height: 1.6;\n      margin-bottom: 20px;\n    }\n\n    .retry-button {\n      background: var(--primary-gradient);\n      color: white;\n      padding: 12px 30px;\n      border-radius: 12px;\n      border: none;\n      font-weight: 600;\n      cursor: pointer;\n      transition: all 0.3s ease;\n      font-size: 14px;\n      box-shadow: var(--shadow);\n    }\n\n    .retry-button:hover {\n      transform: translateY(-2px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .retry-button:active {\n      transform: scale(0.95);\n    }\n\n    /* 装饰元素 */\n    .decoration {\n      position: absolute;\n      z-index: 0;\n      pointer-events: none;\n    }\n\n    .decoration.circle {\n      width: 120px;\n      height: 120px;\n      border-radius: 50%;\n      background: rgba(107, 45, 216, 0.05);\n      top: 10%;\n      left: 10%;\n    }\n\n    .decoration.square {\n      width: 80px;\n      height: 80px;\n      transform: rotate(45deg);\n      background: rgba(78, 110, 242, 0.05);\n      bottom: 10%;\n      right: 10%;\n    }\n\n    /* 响应式 */\n    @media (max-width: 768px) {\n      body {\n        padding: 12px;\n      }\n\n      .container {\n        max-width: 100%;\n        border-radius: 20px;\n      }\n\n      .header {\n        padding: 20px 15px;\n      }\n\n      .header h1 {\n        font-size: 1.3rem;\n      }\n\n      .header-icon {\n        font-size: 40px;\n      }\n\n      .version-comparison {\n        flex-direction: row;\n        flex-wrap: nowrap;\n        gap: 10px;\n        padding: 12px;\n        margin-top: 6px;\n        overflow-x: auto;\n      }\n\n      .version-card {\n        min-width: 45%;\n        padding: 26px 12px 12px;\n      }\n\n      /* 移动端减弱呼吸动效 */\n      .version-card.latest-version {\n        animation: gradientAnimation 6s ease infinite;\n      }\n\n      .version-status {\n        top: 5px;\n        right: 5px;\n        padding: 2px 5px;\n        font-size: 0.6rem;\n      }\n\n      .version-number {\n        font-size: 1.1rem;\n      }\n\n      .version-card.latest-version .version-number {\n        font-size: 1.2rem;\n      }\n\n      .update-header h2, .history-header h2 {\n        font-size: 0.9rem;\n      }\n\n      .button {\n        padding: 12px 24px;\n        font-size: 0.95rem;\n      }\n\n      .history-content.expanded {\n        max-height: 50vh;\n        -webkit-overflow-scrolling: touch;\n      }\n    }\n\n    @media (max-width: 380px) {\n      .header h1 {\n        font-size: 1.2rem;\n      }\n\n      .version-number {\n        font-size: 1rem;\n      }\n\n      .version-card.latest-version .version-number {\n        font-size: 1.1rem;\n      }\n\n      .button {\n        padding: 11px;\n        font-size: 0.9rem;\n      }\n    }\n  </style>\n</head>\n<body>\n  <div class=\"decoration circle\"></div>\n  <div class=\"decoration square\"></div>\n\n  <div id=\"loading\" class=\"loading-wrapper\">\n    <div class=\"loading-spinner\"></div>\n    <div class=\"loading-text\"><i class=\"fas fa-search\"></i> 正在检查更新...</div>\n  </div>\n\n  <div class=\"container\" id=\"container\">\n    <div class=\"header\">\n      <div class=\"header-icon\"><i class=\"fas fa-book\"></i></div>\n      <h1>大灰狼书源更新</h1>\n      <p>推荐使用阅读Sigma版本<br>正式版可能存在兼容性问题-<a href='https://legado.langge.cf'>下载</a></p>\n    </div>\n\n    <div class=\"version-comparison\">\n      <div class=\"version-card current-version\">\n        <div class=\"version-status status-outdated\" id=\"currentStatus\">待检查</div>\n        <h3><i class=\"fas fa-cube\"></i> 当前版本</h3>\n        <div class=\"version-number\" id=\"currentVersion\">-</div>\n        <div class=\"version-date\">您的当前版本</div>\n      </div>\n\n      <div class=\"version-indicator update-needed\" id=\"versionIndicator\" style=\"display: none;\">\n        <i class=\"fas fa-arrow-right\"></i>\n      </div>\n\n      <div class=\"version-card latest-version\">\n        <div class=\"version-status status-latest\" id=\"latestStatus\">最新版本</div>\n        <h3><i class=\"fas fa-star\"></i> 最新版本</h3>\n        <div class=\"version-number\" id=\"latestVersion\">-</div>\n        <div class=\"version-date\">可用最新版本</div>\n      </div>\n    </div>\n\n    <div class=\"content-container\">\n      <div class=\"status-alert\" id=\"statusAlert\" style=\"display: none;\"></div>\n\n      <div id=\"latestLogContainer\" style=\"display: none;\">\n        <div class=\"update-container\">\n          <div class=\"update-header\">\n            <h2><i class=\"fas fa-bolt\"></i> 最新更新</h2>\n            <div class=\"update-tag\">最新发布</div>\n          </div>\n          <div class=\"update-content\">\n            <div class=\"update-date\" id=\"latestLogDate\"></div>\n            <div class=\"update-text\" id=\"latestLogContent\"></div>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"button-group\" id=\"buttonGroup\" style=\"display: none;\"></div>\n\n      <div class=\"history-container\" id=\"logs\" style=\"display: none;\">\n        <div class=\"history-header\" onclick=\"toggleLogs()\">\n          <h2><i class=\"fas fa-history\"></i> 历史更新 <span id=\"historyCount\"></span></h2>\n          <button class=\"toggle-history\" id=\"toggleButton\">\n            <span id=\"toggleText\">展开历史</span>\n            <i class=\"fas fa-chevron-down\" id=\"toggleIcon\"></i>\n          </button>\n        </div>\n        <div class=\"history-content\" id=\"logList\"></div>\n      </div>\n    </div>\n  </div>\n\n  <script>\n  let logsCollapsed = true;\n\n  function toggleLogs() {\n    logsCollapsed = !logsCollapsed;\n    const logList = document.getElementById('logList');\n    const toggleText = document.getElementById('toggleText');\n    const toggleIcon = document.getElementById('toggleIcon');\n    \n    if (logsCollapsed) {\n      logList.classList.remove('expanded');\n      toggleText.textContent = '展开历史';\n      toggleIcon.className = 'fas fa-chevron-down';\n    } else {\n      logList.classList.add('expanded');\n      toggleText.textContent = '收起历史';\n      toggleIcon.className = 'fas fa-chevron-up';\n    }\n  }\n\n  (async function() {\n    const loading = document.getElementById('loading');\n    const container = document.getElementById('container');\n    const currentVersion = document.getElementById('currentVersion');\n    const latestVersion = document.getElementById('latestVersion');\n    const currentStatus = document.getElementById('currentStatus');\n    const latestStatus = document.getElementById('latestStatus');\n    const versionIndicator = document.getElementById('versionIndicator');\n    const statusAlert = document.getElementById('statusAlert');\n    const buttonGroup = document.getElementById('buttonGroup');\n    const latestLogContainer = document.getElementById('latestLogContainer');\n    const latestLogDate = document.getElementById('latestLogDate');\n    const latestLogContent = document.getElementById('latestLogContent');\n    const logsContainer = document.getElementById('logs');\n    const logList = document.getElementById('logList');\n    const historyCount = document.getElementById('historyCount');\n\n    const localVer = '${String(localVersion)}';\n\n    // 统一的服务器配置 - 方便维护\n    const serverConfig = {\n      main: {\n        name: '主线路',\n        icon: 'rocket',\n        baseUrl: 'https://sy.langge.cf',\n        downloadPath: '/download/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup1: {\n        name: '备用线路1',\n        icon: 'box',\n        baseUrl: 'https://api.langge.cf',\n        downloadPath: '/sy/download/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup2: {\n        name: '备用线路2',\n        icon: 'satellite',\n        baseUrl: 'https://20.langge.tk',\n        downloadPath: '/sy/download/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup3: {\n        name: '备用线路3',\n        icon: 'link',\n        baseUrl: 'http://219.154.201.122:5006',\n        downloadPath: '/sy/download/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup4: {\n        name: '备用线路4',\n        icon: 'bolt',\n        baseUrl: 'https://v2.czyl.cf',\n        downloadPath: '/sy/download/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup5: {\n        name: '备用线路5',\n        icon: 'globe',\n        baseUrl: 'https://v10.czyl.cf',\n        downloadPath: '/sy/download/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      },\n      backup6: {\n        name: '备用线路6',\n        icon: 'broadcast-tower',\n        baseUrl: 'https://v4.czyl.cf',\n        downloadPath: '/sy/download/%E5%AE%89%E5%8D%93%E9%98%85%E8%AF%BBapp-%E5%A4%A7%E7%81%B0%E7%8B%BC%E8%9E%8D%E5%90%884.0(vip%E5%AE%8C%E5%85%A8%E7%89%88).json'\n      }\n    };\n\n    // 版本比较函数\n    function compareVersions(vs) {\n      const normalize = (v) => {\n        return v.split('.').map(n => {\n          const num = parseInt(n, 10);\n          return isNaN(num) ? 0 : num;\n        });\n      };\n\n      const parts1 = normalize(localVer);\n      const parts2 = normalize(vs);\n      const maxLength = Math.max(parts1.length, parts2.length);\n      \n      for (let i = 0; i < maxLength; i++) {\n        const num1 = parts1[i] || 0;\n        const num2 = parts2[i] || 0;\n        if (num1 > num2) return 1;\n        if (num1 < num2) return -1;\n      }\n      return 0;\n    }\n\n    async function fetchVersionData() {\n      // 使用统一配置中除主线路外的备用线路进行版本检查\n      const serversToCheck = Object.values(serverConfig).filter(s => s.baseUrl.includes('czyl.cf') || s.baseUrl.includes('219.154'));\n      \n      for (const server of serversToCheck) {\n        try {\n          const response = await fetch(server.baseUrl + '/version', { timeout: 2000 });\n          if (response.ok) {\n            return await response.json();\n          }\n        } catch (e) {\n          console.warn(\\`接口失败：\\${server.baseUrl}\\`, e);\n        }\n      }\n      throw new Error('所有更新接口都请求失败');\n    }\n\n    function showError(message) {\n      loading.innerHTML = \\`\n        <div class=\"error-state\">\n          <div class=\"error-icon\"><i class=\"fas fa-exclamation-triangle\"></i></div>\n          <div class=\"error-text\">\\${message}</div>\n          <button class=\"retry-button\" onclick=\"location.reload()\"><i class=\"fas fa-redo\"></i> 重试</button>\n        </div>\n      \\`;\n    }\n\n    try {\n      const data = await fetchVersionData();\n      const cloudVersion = String(data.version3);\n      const updateLog = data.update_log || {};\n\n      // 显示版本信息\n      currentVersion.textContent = \\`v\\${localVer}\\`;\n      latestVersion.textContent = \\`v\\${cloudVersion}\\`;\n\n      // 处理日志\n      const logEntries = Object.entries(updateLog);\n      if (logEntries.length > 0) {\n        // 显示最新日志\n        const [latestDate, latestContent] = logEntries[0];\n        latestLogDate.innerHTML = \\`<i class=\"fas fa-calendar-alt\"></i> \\${latestDate}\\`;\n        latestLogContent.textContent = latestContent;\n        latestLogContainer.style.display = 'block';\n\n        // 显示历史日志\n        if (logEntries.length > 1) {\n          const historyLogs = logEntries.slice(1);\n          historyCount.textContent = \\`(\\${historyLogs.length}条)\\`;\n          logList.innerHTML = historyLogs.map(([date, content]) => \\`\n            <div class=\"history-item\">\n              <div class=\"history-date\">\n                <i class=\"fas fa-calendar-day\"></i>\n                <span>\\${date}</span>\n              </div>\n              <div class=\"history-text\">\\${content}</div>\n            </div>\n          \\`).join('');\n          logsContainer.style.display = 'block';\n        }\n      }\n\n      // 检查更新状态\n      const compareResult = compareVersions(cloudVersion);\n      \n      // 显示版本指示器\n      versionIndicator.style.display = 'flex';\n      \n      if (compareResult === -1) {\n        // 需要更新\n        currentStatus.textContent = '待更新';\n        currentStatus.className = 'version-status status-outdated';\n        versionIndicator.className = 'version-indicator update-needed';\n        versionIndicator.innerHTML = '<i class=\"fas fa-arrow-right\"></i>';\n\n        // 使用统一配置生成下载按钮\n        buttonGroup.innerHTML = Object.values(serverConfig).map(server => {\n          const fullUrl = server.baseUrl + server.downloadPath;\n          return \\`\n            <a href=\"yuedu://booksource/importonline?src=\\${encodeURIComponent(fullUrl)}\" class=\"button\">\n              <i class=\"fas fa-\\${server.icon}\"></i>\n              <span>\\${server.name}</span>\n            </a>\n          \\`;\n        }).join('');\n        buttonGroup.style.display = 'flex';\n      } else {\n        // 已是最新版本\n        currentStatus.textContent = '最新';\n        currentStatus.className = 'version-status status-latest';\n        versionIndicator.className = 'version-indicator is-latest';\n        versionIndicator.innerHTML = '<i class=\"fas fa-check\"></i>';\n        \n        statusAlert.className = 'status-alert up-to-date';\n        statusAlert.innerHTML = '<i class=\"fas fa-check-circle\"></i> <div>您已是最新版本</div>';\n        statusAlert.style.display = 'flex';\n      }\n\n      // 显示主容器，隐藏加载\n      loading.style.display = 'none';\n      container.style.display = 'block';\n\n    } catch (err) {\n      console.error('版本检查失败：', err);\n      showError('<i class=\"fas fa-exclamation-circle\"></i> 检查更新失败，请稍后重试<br><small>' + err.message + '</small>');\n    }\n  })();\n  </script>\n</body>\n</html>\n`;\n    java.startBrowser(`data:text/html;base64,${java.base64Encode(html)}`, '大灰狼书源更新');\n}", "respondTime": 180000, "ruleBookInfo": {"author": "$.author", "canReName": "1", "coverUrl": "$.thumb_url", "init": "<js>\nif (String(baseUrl).startsWith(\"data:\")) {\n    let res = JSON.parse(java.hexDecodeToString(result));\n    let book_id = res.book_id;\n    let tab = res.tab;\n    let sources = res.sources;\n    let url = res.url;\n    let html = \"\";\n    let proxy = getArguments(source.getVariable(), \"proxy\");\n    if (url != \"\" && proxy == \"本地\") {\n        if (sources == '69书吧') {\n            let ck69 = String(cookie.getCookie('https://www.69shuba.com'));\n            let headers = {\n        \t \"Referer\": url,\n            \"Cookie\": ck69,\n            \"User-Agent\":  java.getWebViewUA()\n             };            \n             let op = JSON.stringify({\n                \"headers\": headers\n            });\n            html = java.ajax(`${url},${op}`);\n        } else {\n            html = java.ajax(url);\n        }\n        //java.log(html);\n        if (html.includes(\"Just a moment...\") && sources == '69书吧') {\n            cookie.removeCookie('https://www.69shuba.com');\n            java.longToast('需要真人验证，请进入任意书籍详情页过验证');\n            html = java.startBrowserAwait(url, \"需要真人验证，请进入任意书籍详情页过验证\").body();\n\n             java.log(html);\n        }\n    }\n    let base_url = getArguments(source.getVariable(), \"server\");\n    let op = {\n        method: \"POST\",\n        body: {\n            html: html\n        }\n    };\n    op = JSON.stringify(op);\n    let varia = String(book.getVariable('custom'));\n    if (varia == 'null') {\n        varia = '';\n    }\n    varia = JSON.stringify({\n        'custom': varia\n    });\n    //varia = java.base64Encode(varia);\n    java.log(`${base_url}/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n    try {\n        result = java.ajax(`${base_url}/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n        JSON.parse(result);\n    } catch(_err) {\n        for (var _i = 0; _i < host.length; _i++) {\n            if (host[_i] === base_url) continue;\n            try {\n                result = java.ajax(`${host[_i]}/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\n                JSON.parse(result);\n                setArguments(\"server\", host[_i]);\n                java.longToast(\"\\n\\n线路故障，已自动切换到：\" + host[_i]);\n                break;\n            } catch(_e2) { continue; }\n        }\n    }\n}\nresult\n</js>$.data", "intro": "<js>\nlet {\n    book_id,\n    source: sources,\n    tab,\n    book_tts,\n    tags,\n    role,\n    last_chapter_title,\n    last_chapter_update_time,\n    word_number,\n    status,\n    score,\n    abstract,\n    copyright_info\n} = result;\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (proxy == \"本地\") {\n    proxy = \"本地网络\";\n} else {\n    proxy = \"服务器网络\";\n}\njava.put(\"book_detail\", JSON.stringify(result));\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet key3 = \"\";\ntry {\n    let cookieValue =\n        String(cookie.getCookie(base_url)) || String(java.getCookie(base_url));\n    key3 = getKey(cookieValue);\n} catch (e) {\n    key3 = \"\";\n}\n\nif (key3 == \"\") {\n    java.log(\"当前服务器未查询到登录状态，尝试查询其他服务器登录状态...\");\n    let cookieValue;\n    for (let h of host) {\n        try {\n            cookieValue = String(cookie.getCookie(h)) || String(java.getCookie(h));\n            key3 = getKey(cookieValue);\n        } catch (e) {\n            key3 = \"\";\n        }\n        if (key3) {\n            java.log(`已在${h}登录，退出查询，正在转移登录状态到当前服务${base_url}`);\n            //java.log(cookieValue)\n            cookie.removeCookie(h);\n            cookie.removeCookie(base_url);\n            cookie.setCookie(base_url, cookieValue);\n            break;\n        }\n    }\n}\n\nif (book.readConfig == null || book.readConfig.useReplaceRule == null) {\n    book.setUseReplaceRule(false);\n}\n\nlet nickname = '账号状态：⚠️ 未登录 | 点击右上角 🔖 登录';\ntry {\n    let opcx = {\n        method: \"GET\",\n        headers: {\n            cookie: 'qttoken=' + key3 + ';'\n        },\n    };\n    opcx = JSON.stringify(opcx);\n    let user_info = JSON.parse(java.ajax(base_url + '/get_avatar,' + opcx));\n    if (user_info.code == 0) {\n        if (user_info.nickname) {\n            nickname = '欢迎回来：' + user_info.nickname\n        } else {\n            nickname = '欢迎回来：' + user_info.email + \"(请前往用户后台设置用户名)\"\n        }\n    }\n} catch (e) {\n    if (key) {\n        nickname = '账号状态：已登录'\n    }\n};\n\nlet loginStatus = nickname;\n\nlet lightDivider = \"❇️───────❇️───────❇️\";\nlet heavyDivider = \"&lrm;\\n&lrm;\";\n\nlet isValid = (value) => String(value).length > 1;\nlet ctitle = book.durChapterTitle || '未开始';\nlet info = `\n    📡 当前服务：${base_url}\n    🔑 ${loginStatus}\n    🏷 数据来源：${sources}\n    🔄 当前模式：${tab}\n    ⚙️ 访问模式：${proxy}\n    📖 阅读至：${ctitle}\n`;\n\nif (tab == \"听书\") {\n    //let toneId = getArguments(source.getVariable(), \"tone_id\");\n    let toneId = String(book.getVariable('custom'));\n    if (toneId == '') {\n    \ttoneId= '4';\n    \t}\n    if (isValid(book_tts)) {\n        info += `${lightDivider}\n    🎵 音色配置：${toneId}\n    ✨ AI音色请点击右上角书籍变量填写相关值，真人听书请重新搜索选择带有主播的书籍\n    ${book_tts}\n`;\n    }\n}\n\nlet basicInfo = \"\";\nlet addBasicInfo = (value, prefix, icon) => {\n    if (isValid(value)) basicInfo += `    ${icon} ${prefix} ${value}\\n`;\n};\n\naddBasicInfo(tags, \"书籍分类：\", \"🌈\");\naddBasicInfo(role, \"书籍主角：\", \"👑\");\naddBasicInfo(last_chapter_title, \"最新章节：\", \"📚\");\naddBasicInfo(last_chapter_update_time, \"更新时间：\", \"⏳\");\naddBasicInfo(word_number, \"书籍字数：\", \"📊\");\naddBasicInfo(status, \"书籍状态：\", \"🚩\");\naddBasicInfo(score, \"书籍评分：\", \"⭐\");\n\nif (basicInfo) info += `${lightDivider}\\n${basicInfo}`;\n\nif (isValid(abstract)) {\n    let indentedAbstract = abstract\n        .split(\"\\n\")\n        .map((line) => `    ${line}`)\n        .join(\"\\n\");\n    info += `${heavyDivider}\n    📖 书籍简介：\n${indentedAbstract}\n`;\n} else {\n    info += `${heavyDivider}`;\n}\n\nif (isValid(copyright_info)) {\n    info += `${lightDivider}\n    © ${copyright_info}\n`;\n} else {\n    info += `${lightDivider}`;\n}\n\ninfo += `\n${heavyDivider}\n    💠💠💠 数据更新于 ${new Date().toLocaleString()} 💠💠💠\n`;\nlet jjinfo = getArguments(source.getVariable(), \"info\");\n\nif (jjinfo != \"off\") {\n    info = String(info)\n        .split(\"\\n\")\n        .map((line) => line.replace(/^ {4}/, \"\"))\n        .join(\"\\n\");\n} else {\n    basicInfo = \"\";\n    addBasicInfo(last_chapter_title, \"最新章节：\", \"📚\");\n    addBasicInfo(last_chapter_update_time, \"更新时间：\", \"⏳\");\n    addBasicInfo(word_number, \"书籍字数：\", \"📊\");\n    addBasicInfo(status, \"书籍状态：\", \"🚩\");\n    addBasicInfo(score, \"书籍评分：\", \"⭐\");\n    if (isValid(abstract)) {\n        let indentedAbstract = abstract\n            .split(\"\\n\")\n            .map((line) => `    ${line}`)\n            .join(\"\\n\");\n        basicInfo += `\n    \\n&lrm;\n    📖 书籍简介：\n${indentedAbstract}\n`;\n    } else {\n        basicInfo += `${heavyDivider}`;\n    }\n    info = `&lrm;\\n🏷 数据来源：${sources}\\n` + basicInfo;\n}\n</js>", "lastChapter": "{{$.source}} {{$.last_chapter_title}} {{$.last_chapter_update_time}}", "name": "$.book_name", "tocUrl": "<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || \"小说\";\nlet url = result.toc_url || \"\";\nvar sdtoken;\ntry {\n    var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n    sdtoken = String(loginInfoMap['手动填写番茄token(可不填)'] || '');\n} catch (e) {\n    sdtoken = '';\n}\nvar rawCookie = getFanqieCookie() || sdtoken;\nvar match = rawCookie.match(/sessionid=[^;]+/);\nvar fqcookie = match ? match[0] : '';\nvar fqssionid = '';\nif (fqcookie) {\n    fqssionid = getSessionId(fqcookie);\n};\nsetArguments('fqssionid', fqssionid);\njava.put(\"tab\", tab);\njava.put(\"book_id\", book_id);\nlet qtcatalog = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url,\n};\nqtcatalog = java.base64Encode(JSON.stringify(qtcatalog));\n`data:;base64,${qtcatalog},{\"type\":\"qingtian2\"}`;\n</js>", "wordCount": "$.word_number"}, "ruleContent": {"content": "<js>\njava.log(result)\nresult = String(java.hexDecodeToString(result));\nlet res;\nif (result.match(/大灰狼融合/)) {\n    result = result.split(\"大灰狼融合4\");\n    res = {\n        item_id: result[0],\n        tab: result[1],\n        title: result[2],\n        sources: result[3],\n        url: \"\"\n    };\n} else {\n    res = JSON.parse(result);\n}\n\nfunction checkEnv() {\n    try {\n        java.qread();\n        return \"轻阅读\";\n    } catch (e) {}\n\n    try {\n        if (typeof java.reLoginView == 'function') {\n            return \"改版\";\n        }\n        new Packages.io.legato.kazusa.utils.TimeoutCancellationException('');\n        return \"改版\";\n    } catch (e) {}\n\n    try {\n        java.deviceID();\n        return \"苹果\";\n    } catch (e) {}\n\n    if (typeof source.loginUi == 'function') {\n        return \"安卓\";\n    }\n    return \"改版\";\n}\n\nvar clientEnv = checkEnv();\nvar islyc = clientEnv == \"改版\";\ntry {\nif (islyc) {\n\tbook.imageStyle = 'FULL';\n\t} else {\n\t\tbook.imageStyle = 'TEXT';\n\t\t}\n} catch {}\nlet varia1 = String(book.getVariable('custom'));\nif (varia1 == 'null') {\n    varia1 = '';\n}\nlet varia = JSON.stringify({\n    'custom': varia1\n});\n//  varia = java.base64Encode(varia);\nlet book_id = res.book_id;\nlet item_id = res.item_id;\nlet tab = res.tab;\nlet title = res.title;\nlet sources = res.sources;\nlet url = res.url;\nlet html = \"\";\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (url != \"\" && proxy == \"本地\") {\n    if (sources == '69书吧') {\n        let ck69 = String(cookie.getCookie('https://www.69shuba.com'));\n        let headers = {\n            \"Referer\": url,\n            \"Cookie\": ck69,\n            \"User-Agent\": java.getWebViewUA()\n        };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        java.log(url);\n        java.log(op);\n        html = java.ajax(`${url},${op}`);\n    } else {\n        html = java.ajax(url);\n    }\n    java.log('dddddddddddddddddddddddddddd')\n    java.log(html);\n    if (html.includes(\"Just a moment...\") && sources == '69书吧' && book.durChapterIndex === chapter.index) {\n        cookie.removeCookie('https://www.69shuba.com');\n        java.longToast('需要真人验证，请进入任意书籍详情页过验证');\n        html = java.startBrowserAwait(url, \"需要真人验证，请进入任意书籍详情页过验证\").body();\n        java.log('cscscscs')\n        java.log(html);\n    }\n};\nlet content = \"\";\nlet data;\n//let tone_id = getArguments(source.getVariable(), \"tone_id\");\nlet tone_id = varia1;\nif (tone_id == '') {\n    tone_id = '4';\n}\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet fqpara = getArguments(source.getVariable(), \"fqpara\");\nlet fqcommunity = getArguments(source.getVariable(), \"fqcommunity\");\nlet close_img = getArguments(source.getVariable(), \"close_img\");\nif (!fqcommunity) {\n    fqcommunity = \"on\";\n}\nlet device, device_type;\ntry {\n    device = java.deviceID();\n    device_type = \"苹果\";\n} catch (e) {\n    try {\n        device = java.androidId();\n        device_type = \"安卓\";\n    } catch (e) {\n        device = \"\";\n        device_type = \"安卓\";\n    }\n}\nlet isQiyue = device_type == \"苹果\" && clientEnv == \"改版\";\n\nlet qtcookie = cookie.getCookie(base_url);\ntry {\n\t   let device2 = String(cookie.getKey(base_url, \"device\"));\n\t   if (!device2){\n\t   \tdevice2 = device;\n\t   \t}\n    qtcookie = `qttoken=${String(cookie.getKey(base_url, \"qttoken\"))}; deviceId=${device2};`\n} catch (e) {java.log(e)}\n\nvar params = {\n    html: html,\n    item_id: item_id,\n    source: sources,\n    tab: tab,\n    tone_id: tone_id,\n    variable: varia,\n    version: '4.11.5.1',\n    app: '\\u9605\\u8bfb\\u795e\\u8bc4\\u8868\\u60c5',\n    god: fqpara == 'on'\n};\n\nvar content_url = '/content';\nif ((sources == \"番茄\" || sources == \"七猫\" || sources == \"塔读\" || sources == \"QQ阅读\" || sources == \"svip_QQ阅读\") && fqpara == \"on\" && tab == \"小说\") {\n    content_url = '/content?review=1';\n}\n\n//var signInfo = generateComplexSignature('POST', content_url, {}, APP_SECRET, params);\n\n\n//var signedParams = copyObject(params);\n//signedParams.timestamp = signInfo.timestamp;\n//signedParams.nonce = signInfo.nonce;\n//signedParams.sign = signInfo.sign;\n\n\nvar op = {\n    method: \"POST\",\n    body: JSON.stringify(params),\n    headers: {\n        cookie: qtcookie,\n        'Content-Type': 'application/json'\n    }\n};\n\nop = JSON.stringify(op);\njava.log(op);\njava.log(cookie.getCookie(base_url))\ntry {\n    data = java.ajax(base_url + content_url + `,${op}`);\n    JSON.parse(data);\n} catch(_err) {\n    for (var _i = 0; _i < host.length; _i++) {\n        if (host[_i] === base_url) continue;\n        try {\n            data = java.ajax(host[_i] + content_url + `,${op}`);\n            JSON.parse(data);\n            setArguments(\"server\", host[_i]);\n            try { var _oldCk = cookie.getCookie(base_url); if (_oldCk) cookie.setCookie(host[_i], _oldCk); } catch(_ce) {}\n            base_url = host[_i];\n            java.longToast(\"\\n\\n线路故障，已自动切换到：\" + host[_i]);\n            break;\n        } catch(_e2) { continue; }\n    }\n}\ntry {\n    data = JSON.parse(data);\n    if (data.msg) {\n        java.toast(data.msg);\n    }\n} catch (e) {}\ncontent = data.content\n\nif (close_img == 'on') {\n\tcontent = removeAllImgTags(content);\n\t}\n\nif ((sources == \"番茄\" || sources == \"七猫\" || sources == \"塔读\" || sources == \"QQ阅读\" || sources == \"svip_QQ阅读\") && tab == \"小说\") {\n    var sdtoken;\n    try {\n        var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n        sdtoken = String(loginInfoMap['手动填写番茄token(可不填)'] || '');\n    } catch (e) {\n        sdtoken = '';\n    }\n    var rawCookie = getFanqieCookie() || sdtoken;\n    var match = rawCookie.match(/sessionid=[^;]+/);\n    var fqcookie = match ? match[0] : '';\n    var fqssionid = '';\n    if (!fqcookie) {} else {\n        fqssionid = getSessionId(fqcookie)\n    }\n    content = content\n        .replace(/ident=\"/g, `ident=\"${base_url}`)\n        .replace(/book_id=/g, `book_id=${book_id}&ssionid=${fqssionid}`);\n    if (fqpara == \"on\") {\n        if (device_type == \"苹果\") {\n            content = paraForiOS(content, sources);\n        } else {\n            content = paraForAndroid(content, sources);\n        }\n    }\n}\nif (sources == \"番茄\" && fqcommunity != \"off\" && tab == \"小说\") {\n    let svg = `${base_url}/chapter_review_svg?book_id=${book_id}&item_id=${item_id}&source=${encodeURIComponent(sources)}&ssionid=${fqssionid}&cache=${Date.now()}`;\n    let commentPageUrl = `${base_url}/fanqie_comment?book_id=${book_id}&item_id=${item_id}&source=${encodeURIComponent(sources)}&tab=${encodeURIComponent(tab)}&ssionid=${fqssionid}&cache=${Date.now()}`;\n    let chapterSvg = '';\n    let chapterSvgChecked = false;\n    try {\n        chapterSvg = java.ajax(svg);\n        chapterSvgChecked = true;\n    } catch (e) {}\n\n    // 请求成功但没有 SVG，说明本章没有评论，不插入本章说图片。\n    // 请求失败时保留原直链兜底，避免临时网络故障隐藏已有评论。\n    let hasChapterCard = String(chapterSvg || '').indexOf('<svg') >= 0;\n    if (!chapterSvgChecked) hasChapterCard = true;\n    if (hasChapterCard) {\n        if (device_type == \"苹果\" && chapterSvg) {\n            svg = 'data:image/svg+xml;base64,' + java.base64Encode(chapterSvg);\n        } else {\n            svg += '&img=1';\n        }\n        if (device_type == '苹果') {\n            // iOS 不使用 qtbzs 专用类型，并同时提供两种点击字段，避免退化为图片预览。\n            let chapterAction = 'showFanqieComment(' + JSON.stringify(commentPageUrl) + ',' + JSON.stringify('本章说') + ')';\n            let chapterMeta = {style: 'FULL', click: chapterAction, js: chapterAction};\n            content = content + `\\n<img src=\"${svg},${JSON.stringify(chapterMeta)}\">`;\n        } else {\n            // 安卓保留原有 qtbzs 协议，避免改变已经可用的点击行为。\n            content = content + `\\n<img src=\"${svg},{'type':'qtbzs',${endclick(commentPageUrl, '本章说')},'style':'FULL'}\">`;\n        }\n    }\n}\ndata = JSON.stringify({\n    content: content,\n});\nif (device_type == \"安卓\" && (tab == \"短剧\" || tab == \"视频\" || sources.includes('毒舌影视') || sources.includes('NT动漫'))) {\n    data = {\n        content: `【右上角刷新】开启播放(下一集请切换下一章刷新)\\n播放直链：\\n${content}`,\n    };\n    data = JSON.stringify(data);\n    if (book.durChapterIndex === chapter.index) {\n        let video_url = `${base_url}/online_video?book_id=${book_id}&source=${sources}&tab=${tab}`;\n        if (sources.includes('毒舌影视') || sources.includes('NT动漫')) {\n            video_url = content;\n        };\n        java.startBrowser(video_url, title);\n        java.toast(\"正在加载视频...\");\n    }\n\n}\ndata;\n</js>$.content", "imageStyle": "full"}, "ruleExplore": {"author": "$.author", "bookList": "$.data", "bookUrl": "<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '小说';\nlet url = result.toc_url || '';\n\nlet qtdetail = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url\n}\nqtdetail = java.base64Encode(JSON.stringify(qtdetail));\n`data:;base64,${qtdetail},{\"type\":\"qingtian\"}`\n</js>", "coverUrl": "$.thumb_url", "intro": "$.abstract", "kind": "{{$.category}}\n{{$.score}}\n{{$.status}}\n{{$.source}}\n{{$.tags}}", "lastChapter": "{{$.last_chapter_title}} • {{$.last_update_time}}", "name": "$.book_name", "wordCount": "$.word_number"}, "ruleSearch": {"author": "$.author", "bookList": "$.data", "bookUrl": "<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '小说';\nlet url = result.toc_url || '';\n\nlet qtdetail = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url\n}\nqtdetail = java.base64Encode(JSON.stringify(qtdetail));\n`data:;base64,${qtdetail},{\"type\":\"qingtian\"}`\n</js>", "checkKeyWord": "我的26岁女房客@番茄", "coverUrl": "$.thumb_url", "intro": "$.abstract", "kind": "{{$.status}},{{$.score}},{{$.tags}},{{$.last_chapter_update_time}}", "lastChapter": "{{$.source}} {{$.last_chapter_title}}", "name": "$.book_name##（别名：.*?）", "wordCount": "$.word_number"}, "ruleToc": {"chapterList": "<js>\nlet res = JSON.parse(java.hexDecodeToString(result));\nif (res.method) {\n    res = Object.fromEntries(\n        res.body\n        .replace(\"source\", \"sources\")\n        .split(\"&\")\n        .map((query) => query.split(\"=\"))\n    );\n    res.url = \"\";\n}\nlet book_id = res.book_id;\njava.put('book_id', book_id);\nlet tab = res.tab;\nlet sources = res.sources;\nlet url = res.url;\nlet html = \"\";\nlet proxy = getArguments(source.getVariable(), \"proxy\");\nif (url != \"\" && proxy == \"本地\") {\n    if (sources == '69书吧') {\n        let ck69 = String(cookie.getCookie('https://www.69shuba.com'));\n        let headers = {\n        \t \"Referer\": url,\n            \"Cookie\": ck69,\n            \"User-Agent\":  java.getWebViewUA()\n             };\n        let op = JSON.stringify({\n            \"headers\": headers\n        });\n        html = java.ajax(`${url},${op}`);    \n    } else {\n        html = java.ajax(url);\n    }\n    //java.log(html);\n    if (html.includes(\"Just a moment...\") && sources == '69书吧') {\n        cookie.removeCookie('https://www.69shuba.com');\n        java.longToast('需要真人验证，请进入任意书籍详情页过验证');\n        html = java.startBrowserAwait(url, \"需要真人验证，请进入任意书籍详情页过验证\").body();\n\n           java.log(html);\n    }\n};\nlet base_url = getArguments(source.getVariable(), \"server\");\nlet op = {\n    method: \"POST\",\n    body: {\n        html: html\n    }\n};\nop = JSON.stringify(op);\nlet varia = String(book.getVariable('custom'));\nif (varia == 'null') {\n    varia = '';\n}\nvaria = JSON.stringify({\n    'custom': varia\n});\n// varia = java.base64Encode(varia);\n//java.log(`${base_url}/catalog?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`);\nlet data = java.ajax(\n    `${base_url}/catalog?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia},${op}`\n);\nlet device, device_type;\ntry {\n    device = java.deviceID();\n    device_type = \"苹果\";\n} catch (e) {\n    try {\n        device = java.androidId();\n        device_type = \"安卓\";\n    } catch (e) {\n        device = \"\";\n        device_type = \"安卓\";\n    }\n}\n\nif (tab == \"小说\") {\n    if (device_type == \"安卓\") {\n        book.type = 8;\n    } else {\n        book.type = 0;\n    }\n} else if (tab == \"听书\") {\n    if (device_type == \"安卓\") {\n        book.type = 32;\n    } else {\n        book.type = 1;\n    }\n} else if (tab == \"漫画\") {\n    if (device_type == \"安卓\") {\n        book.type = 64;\n    } else {\n        book.type = 2;\n    }\n} else if (tab == \"短剧\") {\n    if (device_type == \"安卓\") {\n        book.type = 8;\n    } else {\n        book.type = 3;\n    }\n} else {\n    if (device_type == \"安卓\") {\n        book.type = 8;\n    } else {\n        book.type = 0;\n    }\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet reading = getArguments(source.getVariable(), \"reading\");\n\nif (book && book.order != 0 && reading == '1') {\n    try {\n        if (!data || !book.variable || !base_url || !qtcookie) {\n            java.log('缺少必要参数');\n        } else {\n            let parsedData;\n            try {\n                parsedData = JSON.parse(data);\n            } catch (e) {\n                java.log('解析data数据失败:' + e);\n            }\n            \n            if (parsedData && parsedData.data && Array.isArray(parsedData.data) && parsedData.data[book.durChapterIndex]) {\n                let ritem = parsedData.data[book.durChapterIndex];\n                let bookInfoObj;\n                try {\n                    bookInfoObj = JSON.parse(book.variable);\n                } catch (e) {\n                    java.log('解析book.variable失败:' + e);\n                }\n                \n                if (bookInfoObj) {\n                    let book_info;\n                    try {\n                        book_info = JSON.parse(bookInfoObj.book_detail || JSON.stringify(bookInfoObj));\n                    } catch (e) {\n                        java.log('解析book_detail失败:' + e);\n                    }\n                    \n                    if (book_info && typeof book_info === 'object') {\n                        let rurl = base_url + '/add_book_to_book_shelf,';\n                        book_info['read_status'] = 1;\n                        book_info['last_chapter_item_id'] = ritem.item_id || '';\n                        book_info['last_chapter_title'] = ritem.title || '';\n                        let rop = {\n                            method: \"POST\",\n                            headers: {\n                                cookie: qtcookie\n                            },\n                            body: book_info\n                        };\n                        let check_book_url = base_url + '/check_book_in_book_shelf,';\n                        let checkResponse;\n                        \n                        try {\n                            checkResponse = java.ajax(check_book_url + JSON.stringify(rop));\n                        } catch (e) {\n                            java.log('检查书籍请求失败:' + e);\n                        }\n                        \n                        if (checkResponse) {\n                            let check_data;\n                            try {\n                                check_data = JSON.parse(checkResponse).data;\n                            } catch (e) {\n                                java.log('解析检查响应失败:' + e);\n                            }\n                            try {\n                                if (check_data && check_data.id) {\n                                    book_info['id'] = check_data.id;\n                                    let uurl = base_url + '/update_book_shelf,';\n                                    java.ajax(uurl + JSON.stringify(rop));\n                                } else {\n                                    java.ajax(rurl + JSON.stringify(rop));\n                                }\n                            } catch (e) {\n                                java.log('书架操作失败:' + e);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    } catch (error) {\n        java.log('书籍同步流程异常:' + error);\n        java.longToast('\\n同步阅读进度失败，但不影响阅读，可以前往登录关闭书架同步功能。');\n    }\n}\ndata;\n</js>$.data", "chapterName": "$.title", "chapterUrl": "<js>\nlet tab = result.tab;\nlet sources = result.source;\nlet title = result.title;\nlet item_id = result.item_id;\nlet book_id = java.get(\"book_id\");\nlet url = result.toc_url || \"\";\nlet qtcontent = {\n    book_id: book_id,\n    item_id: item_id,\n    title: title,\n    sources: sources,\n    tab: tab,\n    url: url,\n};\nqtcontent = java.base64Encode(JSON.stringify(qtcontent));\nif (sources == '卷') {\n    content_url = item_id\n} else {\n    content_url = `data:;base64,${qtcontent},{\"type\":\"qingtian3\"}`;\n}\n</js>", "updateTime": "$.first_pass_time"}, "searchUrl": "<js>\nlet base_url = getArguments(source.getVariable(), 'server');\nlet media;\nlet sources = getArguments(source.getVariable(), 'sources') || getArguments(source.getVariable(), 'source');\nlet disabled_sources = getArguments(source.getVariable(), 'disabled_sources') || '0';\nif (String(key).startsWith(\"m:\") || String(key).startsWith(\"m：\")) {\n    media = \"漫画\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"t:\") || String(key).startsWith(\"t：\")) {\n    media = \"听书\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"d:\") || String(key).startsWith(\"d：\")) {\n    media = \"短剧\"\n    key = key.slice(2)\n} else if (String(key).startsWith(\"x:\") || String(key).startsWith(\"x：\")) {\n    media = \"小说\"\n    key = key.slice(2)\n} else {\n    media = getArguments(source.getVariable(), 'tab') || getArguments(source.getVariable(), 'media');\n}\nif (key.includes('@')) {\n    var parts = key.split('@');\n    key = parts[0];\n    sources = parts[1] || sources;\n}\nlet qtcookie = cookie.getCookie(base_url);\nlet op = {\n    method: \"GET\",\n    headers: {\n        cookie: qtcookie\n    },\n};\nop = JSON.stringify(op);\n`${base_url}/search?title=${key}&tab=${media}&source=${sources}&page={{page}}&disabled_sources=${disabled_sources},${op}`\n</js>", "weight": 0},{"bookSourceComment": "原：www.boluomao.com\n移动网用：www.boluomao1.com\n【技术实现】\n搜索：HTML 搜索（GET /search/?q={{key}}&page={{page}}）\n发现：CSS 选择器（书库/分类/完结/排行/专题）\n详情：CSS 选择器\n目录：CSS 选择器（?cp=N 分页，已配置 nextTocUrl）\n正文：CSS 选择器（章节内 ?p=N 分页，已配置 nextContentUrl 自动合并）\n\n【登录说明】\n- 登录需填写手机号、密码、图形验证码。\n- 点击「刷新验证码」会在浏览器中打开验证码图片，查看后返回输入。\n- 登录成功后自动保存 Cookie，后续请求自动携带。\n- 登出按钮可清除 Cookie 和登录状态。\n- ★ 新增「签 到」按钮：登录后点击即可完成每日签到，成功后 Toast 提示。\n\n【局限性】\n- 搜索需要登录：未登录访问 /search/ 会 302 跳转登录页，请先登录。\n- 搜索每账号每天限 10 次。\n- 网站有 WAF 防护，会封禁机房/代理 IP，请在正常网络环境使用。", "bookSourceGroup": "AI,优质", "bookSourceName": "菠萝猫", "bookSourceType": 0, "bookSourceUrl": "https://www.boluomao1.com", "bookUrlPattern": "https://www.boluomao.*?\\.com/book/\\d+.html", "customButton": false, "customOrder": 3, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "————————二次元——————————\n二次元书库::/gender/acg/page/{{page}}/\n原生幻想::/gender/acg/category/22/page/{{page}}/\n恋爱日常::/gender/acg/category/23/page/{{page}}/\n衍生同人::/gender/acg/category/24/page/{{page}}/\n搞笑吐槽::/gender/acg/category/25/page/{{page}}/\n\n\n二次元完结::/full/gender/acg/page/{{page}}/\n排行榜::/rank/\nSF轻小说::/topic/1.html?p={{page}}\n刺猬猫小说::/topic/2.html?p={{page}}\n少年梦小说::/topic/3.html?p={{page}}\n飞卢小说::/topic/4.html?p={{page}}\n息壤小说::/topic/5.html?p={{page}}\n————————男频———————————\n男生书库::/gender/boy/page/{{page}}/\n男生完结::/full/gender/boy/page/{{page}}/\n玄幻::/gender/boy/category/1/page/{{page}}/\n奇幻::/gender/boy/category/2/page/{{page}}/\n武侠::/gender/boy/category/3/page/{{page}}/\n仙侠::/gender/boy/category/4/page/{{page}}/\n都市::/gender/boy/category/5/page/{{page}}/\n军事::/gender/boy/category/6/page/{{page}}/\n历史::/gender/boy/category/7/page/{{page}}/\n游戏::/gender/boy/category/8/page/{{page}}/\n体育::/gender/boy/category/9/page/{{page}}/\n科幻::/gender/boy/category/10/page/{{page}}/\n诸天无限::/gender/boy/category/11/page/{{page}}/\n悬疑::/gender/boy/category/12/page/{{page}}/\n————————女频———————————\n女生书库::/gender/girl/page/{{page}}/\n女生完结::/full/gender/girl/page/{{page}}/\n古代言情::/gender/girl/category/13/page/{{page}}/\n仙侠奇缘::/gender/girl/category/14/page/{{page}}/\n现代言情::/gender/girl/category/15/page/{{page}}/\n浪漫青春::/gender/girl/category/16/page/{{page}}/\n玄幻言情::/gender/girl/category/17/page/{{page}}/\n悬疑推理::/gender/girl/category/18/page/{{page}}/\n科幻空间::/gender/girl/category/19/page/{{page}}/\n游戏竞技::/gender/girl/category/20/page/{{page}}/\n短篇言情::/gender/girl/category/21/page/{{page}}/\n耽美::/gender/girl/category/32/page/{{page}}/\n百合::/gender/girl/category/33/page/{{page}}/\n轻小说::/gender/girl/category/34/page/{{page}}/", "lastUpdateTime": "1785387550132", "loginUi": "[{\"name\":\"手机号\",\"type\":\"text\"},{\"name\":\"密码\",\"type\":\"password\"},{\"name\":\"验证码\",\"type\":\"text\"},{\"name\":\"刷新验证码\",\"type\":\"button\",\"action\":\"refreshCaptcha()\"},{\"name\":\"登 录\",\"type\":\"button\",\"action\":\"login(true)\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.5}},{\"name\":\"登 出\",\"type\":\"button\",\"action\":\"logout()\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.5}},{\"name\":\"签 到\",\"type\":\"button\",\"action\":\"checkin()\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.5}}]", "loginUrl": "function getBaseUrl() { return 'https://www.boluomao1.com'; }\n\nfunction refreshCaptcha() {\n    var url = getBaseUrl() + '/api/captcha.php?r=' + Math.random();\n    java.startBrowser(url, '验证码');\n}\n\nfunction login(b) {\n    if (b == undefined) return true;\n    var info = result;\n    var mobile = info['手机号'];\n    var password = info['密码'];\n    var captcha = info['验证码'];\n    if (!mobile || !password || !captcha) {\n        java.toast('请完整填写手机号、密码和验证码');\n        return;\n    }\n    var url = getBaseUrl() + '/api/auth.php';\n    var body = 'action=login&mobile=' + encodeURIComponent(mobile) + '&password=' + encodeURIComponent(password) + '&captcha=' + encodeURIComponent(captcha);\n    var post = JSON.stringify({\n        method: 'POST',\n        body: body,\n        headers: {\n            'Content-Type': 'application/x-www-form-urlencoded'\n        }\n    });\n    var resp = java.ajax(url + ',' + post);\n    try {\n        var json = JSON.parse(resp);\n        if (json.code === 0) {\n            var cookieString = java.getCookie(getBaseUrl());\n            if (cookieString) {\n                source.putLoginHeader(cookieString);\n                java.toast('登录成功');\n            } else {\n                java.toast('登录成功但未获取到Cookie，请重试');\n            }\n        } else {\n            java.toast('登录失败：' + json.msg);\n            refreshCaptcha();\n        }\n    } catch(e) {\n        java.toast('登录异常：' + e.message);\n    }\n}\n\nfunction logout() {\n    source.removeLoginHeader();\n    // 可选清除cookie\n    // java.removeCookie(getBaseUrl());\n    result['手机号'] = '';\n    result['密码'] = '';\n    result['验证码'] = '';\n    source.putLoginInfo(JSON.stringify(result));\n    java.toast('已登出');\n}\n\n// ★ 新增签到函数\nfunction checkin() {\n    var url = getBaseUrl() + '/api/checkin.php';\n    var body = 'action=checkin';\n    var post = JSON.stringify({\n        method: 'POST',\n        body: body,\n        headers: {\n            'Content-Type': 'application/x-www-form-urlencoded'\n        }\n    });\n    var resp = java.ajax(url + ',' + post);\n    try {\n        var json = JSON.parse(resp);\n        if (json.code === 0) {\n            java.toast('✅ 签到成功：' + json.msg);\n        } else {\n            java.toast('❌ 签到失败：' + json.msg);\n        }\n    } catch(e) {\n        java.toast('签到异常：' + e.message);\n    }\n}", "respondTime": 180000, "ruleBookInfo": {"author": ".bookTitleLeft .author@text", "coverUrl": ".picb .pic img.0@src", "intro": ".intro.font16@text", "kind": "class.info@tag.dl.0@tag.dd@text&&class.info@tag.dl.1@tag.dd@text&&class.tags-line@tag.a@text", "lastChapter": ".latest-link@text", "name": ".bookTitleRow h1@text", "wordCount": ".num.font14@text"}, "ruleContent": {"content": ".content@html@js:var html = result; var matches = html.match(/data-obf=\\\"([^\\\"]*)\\\"/g); var decoded = ''; if (matches) { for (var i = 0; i < matches.length; i++) { var obf = matches[i].match(/data-obf=\\\"([^\\\"]*)\\\"/)[1]; var bytes = java.base64DecodeToByteArray(obf); for (var j = 0; j < bytes.length; j++) { bytes[j] = bytes[j] ^ ((j % 127) + 1); } decoded += java.bytesToStr(bytes, 'utf-8') + '\\n'; } } decoded;", "nextContentUrl": "text.下一页@href"}, "ruleExplore": {"author": ".author@text", "bookList": ".picList li||.fullCardList li", "bookUrl": ".name a@href", "coverUrl": ".pic img@src", "intro": ".intro@text", "kind": ".label@text", "name": ".name a@text", "wordCount": ".num@text||.words@text"}, "ruleSearch": {"author": ".author@text", "bookList": ".picList li", "bookUrl": ".name a@href", "coverUrl": ".pic img@src", "intro": ".intro@text", "kind": ".label@text", "name": ".name a@text", "wordCount": ".num@text"}, "ruleToc": {"chapterList": "#chapters .direList li", "chapterName": ".name a@text", "chapterUrl": ".name a@href", "nextTocUrl": ".page-range-list .cur+a@href"}, "searchUrl": "https://www.boluomao1.com/search/?q={{key}}&page={{page}}", "weight": 0},{"bookSourceComment": "↓漫蛙走失页：\nhttps://mwmissing7.cc\nhttps://fuwbl.cc/maKapG\n↓大陆网域，会自动跳转最新的网域：\nhttps://fuwbl.cc\nhttps://manwapm.cc\nhttps://manwapl.cc\nhttps://manwapk.cc\n(进不去请先切换WiFi/4g及开关飞航模式试试刷新试试看)\n↓非大陆地区：\nhttps://manwa.me\n\nby狼崽儿 //2026.7.27\n原作者ljy911028\n登录接口默认第一个。部分作品需要先登录才能访问。\n如果是第一次使用某个接口，可以先登录再搜索，阅读会长期保存该接口的登录状态。但是不同接口都需要单独登录，如果切换到第一次使用的域名，切记记得登录。\n没有测试接口快慢的功能，所以需要自己慢慢试哪个接口可以用❤️", "bookSourceName": "🐸漫蛙", "bookSourceType": 2, "bookSourceUrl": "https://manwapm.cc", "customOrder": 18, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "exploreUrl": "全部::/booklist/?page={{page}}\n连载中::/booklist?tag=&end=2&gender=-1&has_full=-1&area=&sort=-1&level=-1&page={{page}}\n完结::/booklist?tag=&end=1&gender=-1&has_full=-1&area=&sort=-1&level=-1&page={{page}}\n收藏::/booklist?tag=&end=&gender=-1&has_full=-1&area=&sort=1&level=-1&page={{page}}\n新漫::/booklist?tag=&end=&gender=-1&has_full=-1&area=&sort=2&level=-1&page={{page}}\n一般向::/booklist?tag=&end=&gender=2&has_full=-1&area=&sort=-1&level=-1&page={{page}}\nBL向::/booklist?tag=&end=&gender=0&has_full=-1&area=&sort=-1&level=-1&page={{page}}\n禁漫::/booklist?tag=&end=&gender=1&has_full=-1&area=&sort=-1&level=-1&page={{page}}\nTL向::/booklist?tag=&end=&gender=3&has_full=-1&area=&sort=-1&level=-1&page={{page}}\nGL向::/booklist?tag=&end=&gender=4&has_full=-1&area=&sort=-1&level=-1&page={{page}}\n韩漫::/booklist?tag=&end=&gender=-1&has_full=-1&area=2&sort=-1&level=-1&page={{page}}\n日漫::/booklist?tag=&end=&gender=-1&has_full=-1&area=3&sort=-1&level=-1&page={{page}}\n国漫::/booklist?tag=&end=&gender=-1&has_full=-1&area=4&sort=-1&level=-1&page={{page}}\n台漫::/booklist?tag=&end=&gender=-1&has_full=-1&area=5&sort=-1&level=-1&page={{page}}\n其他::/booklist?tag=&end=&gender=-1&has_full=-1&area=6&sort=-1&level=-1&page={{page}}\n未分类::/booklist?tag=&end=&gender=-1&has_full=-1&area=1&sort=-1&level=-1&page={{page}}\n                            标  签                              \n中文::/booklist?page={{page}}&tag=中文\n巨乳::/booklist?page={{page}}&tag=巨乳\n中出::/booklist?page={{page}}&tag=中出\n口交::/booklist?page={{page}}&tag=口交\n19R::/booklist?page={{page}}&tag=19R\n透视::/booklist?page={{page}}&tag=透视\n全彩::/booklist?page={{page}}&tag=全彩\n 3D ::/booklist?page={{page}}&tag=3D\n自己添加", "jsLib": "var Url = [\n    \"https://manwapa.cc\",\n    \"https://manwapb.cc\",\n    \"https://manwapc.cc\",\n    \"https://manwapd.cc\",\n    \"https://manwape.cc\",\n    \"https://manwapf.cc\",\n    \"https://manwapg.cc\",\n    \"https://manwaph.cc\",\n    \"https://manwapj.cc\",\n    \"https://manwapk.cc\",\n    \"https://manwapl.cc\",\n    \"https://manwapm.cc\",\n    \"https://manwapn.cc\",\n    \"https://manwapo.cc\",\n    \"https://manwapp.cc\",\n    \"https://manwapq.cc\",\n    \"https://manwapr.cc\",\n    \"https://manwaps.cc\",\n    \"https://manwapt.cc\",\n    \"https://manwapu.cc\",\n    \"https://manwapv.cc\",\n    \"https://manwapw.cc\",\n    \"https://manwapx.cc\",\n    \"https://manwapy.cc\",\n    \"https://manwapz.cc\",\n    \"https://manwa.me/\"\n];\n\nfunction URL() {\n    var v = String(this.source.getVariable()).split(\",\");\n    var x = parseInt(v[0], 10);\n    // 如果索引有效则返回对应域名，否则返回第一个\n    return (x >= 0 && x < Url.length) ? Url[x] : Url[0];\n}", "lastUpdateTime": "1785147842628", "loginUi": "[\n    {\n        \"name\": \"👍当前接口👍\",\n        \"type\": \"button\",\n        \"action\": \"A()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"发布页\",\n        \"type\": \"button\",\n        \"action\": \"Z()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"登录页面\",\n        \"type\": \"button\",\n        \"action\": \"C()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n       {\n        \"name\": \"❤️以下点击切换接口❤️\",\n        \"type\": \"button\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"a\",\n        \"type\": \"button\",\n        \"action\": \"B(0)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"b\",\n        \"type\": \"button\",\n        \"action\": \"B(1)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"c\",\n        \"type\": \"button\",\n        \"action\": \"B(2)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"d\",\n        \"type\": \"button\",\n        \"action\": \"B(3)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"e\",\n        \"type\": \"button\",\n        \"action\": \"B(4)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"f\",\n        \"type\": \"button\",\n        \"action\": \"B(5)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"g\",\n        \"type\": \"button\",\n        \"action\": \"B(6)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"h\",\n        \"type\": \"button\",\n        \"action\": \"B(7)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"j\",\n        \"type\": \"button\",\n        \"action\": \"B(8)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"k\",\n        \"type\": \"button\",\n        \"action\": \"B(9)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"l\",\n        \"type\": \"button\",\n        \"action\": \"B(10)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"m\",\n        \"type\": \"button\",\n        \"action\": \"B(11)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"n\",\n        \"type\": \"button\",\n        \"action\": \"B(12)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"o\",\n        \"type\": \"button\",\n        \"action\": \"B(13)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"p\",\n        \"type\": \"button\",\n        \"action\": \"B(14)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"q\",\n        \"type\": \"button\",\n        \"action\": \"B(15)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"r\",\n        \"type\": \"button\",\n        \"action\": \"B(16)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"s\",\n        \"type\": \"button\",\n        \"action\": \"B(17)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"t\",\n        \"type\": \"button\",\n        \"action\": \"B(18)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"u\",\n        \"type\": \"button\",\n        \"action\": \"B(19)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"v\",\n        \"type\": \"button\",\n        \"action\": \"B(20)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"w\",\n        \"type\": \"button\",\n        \"action\": \"B(21)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"x\",\n        \"type\": \"button\",\n        \"action\": \"B(22)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"y\",\n        \"type\": \"button\",\n        \"action\": \"B(23)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"z\",\n        \"type\": \"button\",\n        \"action\": \"B(24)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"主域名，需✈️\",\n        \"type\": \"button\",\n        \"action\": \"B(25)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.6\n        }\n    }\n]", "loginUrl": "//Z：发布页\nZ = () =>{\n  java.startBrowser(\"https://mwmissing7.cc/\",\"\")\n}\n// A：显示当前接口\nA = () => {\n    java.toast('\\n' + URL());\n}\n// B：切换接口\nB = (x) => {\n    source.setVariable(String(x));\n    java.toast('\\n' + '成功设置 ' + URL());\n}\n//C：登录页面\nC = () => {\n    var base = URL();\n    // 去除末尾斜杠（如果有）\n    if (base.endsWith(\"/\")) base = base.slice(0, -1);\n    java.startBrowser(base + \"/login.html\", \"\");\n}", "respondTime": 6762, "ruleBookInfo": {"author": ".detail-main-info-author@a@text", "coverUrl": ".detail-main-cover@img@data-original", "intro": ".detail-desc@text", "kind": ".detail-main-info-class@a@text", "lastChapter": ".detail-list-select@a.-1@text", "name": ".detail-main-info-title@text"}, "ruleContent": {"content": ".content-img@data-r-src\n@js:\nheaders={\"headers\":{\"Referer\":\"https://manwapg.cc/\"}};\nresult.split(\"\\n\").map(x=>'<img src=\\\"'+x+','+JSON.stringify(headers)+'\\\">').join(\"\\n\")", "imageDecode": "/**  https://manwa2.site/static/js/ch.js?v=202208132\n*/\n\nfunction decode(bytes, key){\n\nreturn java.createSymmetricCrypto(\n\t\"aes/cbc/pkcs7padding\", \n\t key,\n\t key\n\t)\n.decrypt(bytes)\n}\n\nkey = cache.get(\"manwa_aes_key\") || \"my2ecret782ecret\"\n\ndecode(result, key)", "imageStyle": "FULL"}, "ruleExplore": {"bookList": ".manga-list@li", "bookUrl": "a@href", "coverUrl": "img@src", "intro": ".manga-list-2-tip@text", "name": ".manga-list-2-title@text"}, "ruleSearch": {"author": "span.0@text##作者：", "bookList": ".book-list@li", "bookUrl": "a@href", "coverUrl": "img@data-original", "intro": ".book-list-info-desc@text", "kind": "span.1@text", "name": ".book-list-info-title@text"}, "ruleToc": {"chapterList": ".detail-list-select@li a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "@js: URL() + \"/search?keyword=\" + encodeURIComponent(key) + \"&page=\" + page", "weight": 0},{"bookSourceComment": "池鱼 2025.05.15\n\n本网站所有的小说都是免费的，目前已经有了PC端和wap端，APP端目前还有点问题需要调试\n\n如果想要查看插图的话可以去网页端，为了避免被刷昂贵的图床流量，所以阅读的书源没有适配插图\n\n更多详情内容，可以关注：www.huanmengacg.com\n\n网站QQ群：907189428", "bookSourceGroup": "优质无错", "bookSourceName": "幻梦轻小说", "bookSourceType": 0, "bookSourceUrl": "https://www.huanmengacg.com", "customOrder": 3, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "header": "@js: \nJSON.stringify({\n  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36\"\n})", "lastUpdateTime": "1785080045602", "respondTime": 180000, "ruleBookInfo": {"author": ".book-metas.0@text##作者：", "coverUrl": "dt@img@src", "intro": ".book-summary@text", "kind": ".book-metas.1@text&&.book-metas.2@text&&.book-metas.3@text##(?:分类|状态|更新)：| [\\d：:]+\n<js>result.replace(/ /,\",\")</js>", "name": ".book-title@text", "tocUrl": "text.章节列表@href"}, "ruleContent": {"content": "#BookText@p@text\n<js>\nresult.replace(/(<img src=\"[^\"]+\")[^>]+>/g,\"$1>\")\n</js>\n##本文来自 幻梦轻小说|最新最全的日本动漫轻小说 幻梦轻小说|更多轻小说与TXT下载，尽在幻梦轻小说网（www.huanmengacg.com）|\\(http://www.huanmengacg.com\\)|", "imageStyle": "FULL", "nextContentUrl": "text.下一页@href"}, "ruleExplore": [], "ruleSearch": {"author": ".book-module@text##··.*", "bookList": ".boxbd@.common-list", "bookUrl": "a@href", "checkKeyWord": "--https://www.huanmengacg.com/index.php/book_read_794_763.html", "coverUrl": "img@data-original", "intro": ".book-profile@text", "kind": ".book-module@text##.*··", "name": "dt@text"}, "ruleToc": {"chapterList": "#chapterlist li a", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": "text.下一页@href"}, "searchUrl": "/index.php/book/search?action=search&key={{key}}", "weight": 0},{"bookSourceComment": "需登录，且偶尔登录后滑块验证", "bookSourceGroup": "R18", "bookSourceName": "🔞搬山人小说网", "bookSourceType": 0, "bookSourceUrl": "https://www.banshanren.com/", "concurrentRate": "1000", "customButton": false, "customOrder": 460, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[\n{\n    \"title\": \"年排行\",\n    \"url\": \"https://www.banshanren.com/api/rank?range=3\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n{\n    \"title\": \"月排行\",\n    \"url\": \"https://www.banshanren.com/api/rank?range=2\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n{\n    \"title\": \"周排行\",\n    \"url\": \"https://www.banshanren.com/api/rank?range=1\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n  {\n    \"title\": \"浏览量\",\n    \"url\": \"https://www.banshanren.com/all/0-0-0-0-0-0-3-1/\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n{\n    \"title\": \"收藏榜\",\n    \"url\": \"https://www.banshanren.com/api/rank?range=5\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  },\n{\n    \"title\": \"新作榜\",\n    \"url\": \"https://www.banshanren.com/api/rank?range=4\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 0.3\n    }\n  }\n]", "header": "{\n \"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36\",\n\"Referer\":\"https://www.banshanren.com/\"\n}", "lastUpdateTime": "1785072394551", "loginUrl": "https://www.banshanren.com", "respondTime": 180000, "ruleBookInfo": {"author": "//div[@class='novel_brief_box']/div[@class='novel_title_box']/div[@class='info_box'][2]/span/text()", "coverUrl": "//div[@class='novel_brief_box']/div[@class='cover_box']/img/@data-src", "intro": "//div[@class='novel_brief_box']/div[@class='novel_title_box']/div[@class='novel_intro_box pc']/p[1]/text()", "kind": "//div[@class='novel_brief_box']/div[@class='novel_title_box']/ul[@class='novel_tag_list pc']/li/a/@title", "lastChapter": "//div[@class='catalog_box']/div[@class='catalog_top_box']/div[1]/p[1]/span[@class='hl']/text()", "name": "//div[@class='novel_brief_box']/div[@class='novel_title_box']/h1/text()", "wordCount": "//div[@class='novel_brief_box']/div[@class='novel_title_box']/div[@class='novel_summary_box pc']/div[4]/p/b/text()"}, "ruleContent": {"content": "//div[@class='chapter_content_box']/p/text()"}, "ruleExplore": {"author": "$.authors", "bookList": "$.model", "bookUrl": "@js:\n\"https://www.banshanren.com/novel/{{$.slug}}\"", "coverUrl": "$.coverUrl", "intro": "$.description", "kind": "$.tagNames", "lastChapter": "$.latestUpdate", "name": "$.title", "wordCount": "$.wordCountFormat"}, "ruleSearch": {"author": "//div[@class='title_box']/div[@class='info_box'][2]/text()@js:\nresult.split('·')[0].trim()", "bookList": "//ul[@class='novel_list']/li[@class='novel_li']", "bookUrl": "//div[@class='title_box']/a[@class='title']/@href", "checkKeyWord": "琼明神女录", "coverUrl": "//img/@data-src", "intro": "//div[@class='title_box']/div[@class='novel_intro_box']/p", "kind": "//div[@class='title_box']/ul[@class='category_list']/li/a/@title", "name": "//div[@class='title_box']/a[@class='title']/text()"}, "ruleToc": {"chapterList": "//div[@class='catalog_box']/div[@class='volume_box']/ul/li[.//a]", "chapterName": "//a/@title", "chapterUrl": "//a/@href", "updateTime": "//p/text()"}, "searchUrl": "https://www.banshanren.com/search/index?keyword={{key}}", "weight": 0},{"bookSourceComment": "", "bookSourceGroup": "六趣", "bookSourceName": "自用番茄", "bookSourceType": 0, "bookSourceUrl": "https://8080-50646e17d294cd3a.monkeycode-ai.online", "contentType": 1, "customOrder": 1, "enabled": true, "customButton": true, "jsLib": "function showCmt(url,sources,ydv){var java=this.java;var src=this.source;var fq='on';try{fq=JSON.parse(src.getVariable()).fqpara||'on'}catch(e){}if(fq=='off'){java.longToast('段评已关闭，长按书源→登录→开启段评');return;}var apikey='sk-517295872e6081587dc1b610ba3ef0dc7bf51a70b202be16';try{var k=JSON.parse(src.getVariable()).apikey;if(k)apikey=k}catch(e){}var bu=String(src.bookSourceUrl).replace(/\\/+$/,'');if(url.indexOf('/api/v1/')===-1&&url.indexOf('/api/')===0){url='/api/v1'+url;}if(url.indexOf('key=')===-1){url+=(url.indexOf('?')===-1?'?':'&')+'key='+apikey;}var fu=bu+url;var js='(function(){document.body.style.background=\"#1a1a2e\";document.body.style.color=\"#e0e0e0\";window.java=java;})();';var cfg='{\"heightPercentage\":0.8,\"isDraggable\":true,\"dismissOnTouchOutside\":true,\"shouldDimBackground\":true,\"isHideable\":true,\"expandedCornersRadius\":20,\"hardwareAccelerated\":true}';try{java.showBrowser(fu,null,js,cfg)}catch(e1){try{java.startBrowser(fu,(sources||'番茄')+'段评')}catch(e2){}}}", "enabledCookieJar": false, "enabledExplore": true, "exploreUrl": "<js>\nfunction getArgument(key){var o;try{o=JSON.parse(source.getVariable()||'{}')}catch(e){o={}}return o[key]}\nvar base=String(source.bookSourceUrl||'https://8080-50646e17d294cd3a.monkeycode-ai.online').replace(/\\/+$/,'');\nvar key=String(getArgument('apikey')||'sk-517295872e6081587dc1b610ba3ef0dc7bf51a70b202be16').trim();\nvar data=[\n{\"title\":\"男生\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},\n{\"title\":\"玄幻\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=7&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#1565c0\",\"borderRadius\":\"6px\"}},\n{\"title\":\"都市\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=1&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#1565c0\",\"borderRadius\":\"6px\"}},\n{\"title\":\"历史\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=12&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#1565c0\",\"borderRadius\":\"6px\"}},\n{\"title\":\"穿越\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=37&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#1565c0\",\"borderRadius\":\"6px\"}},\n{\"title\":\"重生\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=36&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#1565c0\",\"borderRadius\":\"6px\"}},\n{\"title\":\"系统\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=19&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#1565c0\",\"borderRadius\":\"6px\"}},\n{\"title\":\"修仙\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=517&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#1565c0\",\"borderRadius\":\"6px\"}},\n{\"title\":\"悬疑\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=10&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#1565c0\",\"borderRadius\":\"6px\"}},\n{\"title\":\"游戏\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=17&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#1565c0\",\"borderRadius\":\"6px\"}},\n{\"title\":\"科幻\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=9&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#1565c0\",\"borderRadius\":\"6px\"}},\n{\"title\":\"武侠\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=11&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#1565c0\",\"borderRadius\":\"6px\"}},\n{\"title\":\"灵异\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=22&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#1565c0\",\"borderRadius\":\"6px\"}},\n{\"title\":\"竞技\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=20&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#1565c0\",\"borderRadius\":\"6px\"}},\n{\"title\":\"军事\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=15&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#1565c0\",\"borderRadius\":\"6px\"}},\n{\"title\":\"同人\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=538&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#1565c0\",\"borderRadius\":\"6px\"}},\n{\"title\":\"无敌\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=82&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#1565c0\",\"borderRadius\":\"6px\"}},\n{\"title\":\"脑洞\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=64&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#1565c0\",\"borderRadius\":\"6px\"}},\n{\"title\":\"神豪\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=89&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#1565c0\",\"borderRadius\":\"6px\"}},\n{\"title\":\"女生\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},\n{\"title\":\"言情\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=4&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#c62828\",\"borderRadius\":\"6px\"}},\n{\"title\":\"总裁\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=28&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#c62828\",\"borderRadius\":\"6px\"}},\n{\"title\":\"宠文\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=60&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#c62828\",\"borderRadius\":\"6px\"}},\n{\"title\":\"快穿\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=84&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#c62828\",\"borderRadius\":\"6px\"}},\n{\"title\":\"种田\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=72&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#c62828\",\"borderRadius\":\"6px\"}},\n{\"title\":\"宫斗\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=78&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#c62828\",\"borderRadius\":\"6px\"}},\n{\"title\":\"娱乐圈\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=53&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#c62828\",\"borderRadius\":\"6px\"}},\n{\"title\":\"豪门\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=108&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#c62828\",\"borderRadius\":\"6px\"}},\n{\"title\":\"青梅竹马\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=62&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#c62828\",\"borderRadius\":\"6px\"}},\n{\"title\":\"甜文\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=81&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#c62828\",\"borderRadius\":\"6px\"}},\n{\"title\":\"女强\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=51&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#c62828\",\"borderRadius\":\"6px\"}},\n{\"title\":\"搞笑\",\"url\":base + '/api/v1/api/fqnovel/category/landing?categoryId=63&limit=20&key=' + encodeURIComponent(key),\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25,\"background\":\"#c62828\",\"borderRadius\":\"6px\"}}\n];\nJSON.stringify(data);\n</js>", "header": "Content-Type: application/json\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36\nX-API-Key: sk-517295872e6081587dc1b610ba3ef0dc7bf51a70b202be16", "lastUpdateTime": "1785039511307", "respondTime": 180000, "loginUrl": "function login(flag){if(flag==undefined){try{result=JSON.parse(source.getLoginInfo()||'{}')}catch(e){result={}}}else{try{source.putLoginInfo(JSON.stringify(result))}catch(e){java.longToast('保存失败: '+e)}java.longToast('设置已保存')}}\nfunction parseConfig(){var o;try{o=JSON.parse(source.getVariable()||'{}')}catch(e){o={}}return o||{}}\nfunction saveConfig(o){source.setVariable(JSON.stringify(o||{}))}\nfunction getArgument(key){return parseConfig()[key]}\nfunction setArgument(key,val){var o=parseConfig();o[key]=val;saveConfig(o);return val}\nfunction removeArgument(key){var o=parseConfig();delete o[key];saveConfig(o)}\nfunction cnSwitch(val){return val=='off'?'关闭':'开启'}\nfunction activeKey(){var k='sk-517295872e6081587dc1b610ba3ef0dc7bf51a70b202be16';try{k=String(getArgument('apikey')||'').trim()}catch(e){}if(!k||k=='undefined'||k=='null'){k='sk-517295872e6081587dc1b610ba3ef0dc7bf51a70b202be16'}return k}\nfunction baseUrl(){return String(source.bookSourceUrl||'https://8080-50646e17d294cd3a.monkeycode-ai.online').replace(/\\/+$/,'')}\nfunction saveKey(){var k='sk-517295872e6081587dc1b610ba3ef0dc7bf51a70b202be16';try{k=String(result['密钥']||'').trim()}catch(e){}if(!k){java.longToast('请先填写密钥');return}setArgument('apikey',k);try{source.putLoginInfo(JSON.stringify(result))}catch(e){}java.longToast('密钥已保存\\n'+k.substring(0,12)+'...')}\nfunction clearKey(){removeArgument('apikey');java.longToast('已清除登录区保存的密钥，将使用导入书源时的默认密钥')}\nfunction togglePara(){var fq=getArgument('fqpara');if(fq=='off'){setArgument('fqpara','on');java.longToast('书评: 开启')}else{setArgument('fqpara','off');java.longToast('书评: 关闭')}}\nfunction copyText(text){try{java.copy(text);java.longToast('已复制到剪贴板')}catch(e1){try{java.setClip(text);java.longToast('已复制到剪贴板')}catch(e2){java.longToast(text)}}}\nfunction copyImportUrl(){copyText(baseUrl()+'/api/legado/book-source?key='+activeKey())}\nfunction openUser(){java.startBrowser(baseUrl()+'/user/login.html','用户控制台')}\nfunction resetConfig(){source.setVariable('{}');java.longToast('书源配置已重置，重新打开登录页后生效')}\nfunction configDetail(){var key=activeKey();var saved=String(getArgument('apikey')||'').trim();var sourceName=source.bookSourceName||'自用番茄';var group=source.bookSourceGroup||'六趣';var base=baseUrl();var fq=getArgument('fqpara')||'on';var importUrl=base+'/api/legado/book-source?key='+key;var userUrl=base+'/user/login.html';var detail='书源配置详情\\n书源名称: '+sourceName+'\\n书源分组: '+group+'\\n网关地址: '+base+'\\n密钥来源: '+(saved?'登录页保存':'导入链接默认')+'\\n密钥预览: '+(key?key.substring(0,12)+'...':'未设置')+'\\n书评状态: '+cnSwitch(fq)+'\\n发现与搜索: 使用当前密钥访问\\n详情、目录与正文: 使用导入密钥访问\\n用户控制台: '+userUrl+'\\n导入链接: '+importUrl;java.longToast(detail)}", "loginUi": "[\n    {\n        \"name\": \"密钥\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"保存密钥\",\n        \"type\": \"button\",\n        \"action\": \"saveKey()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.5,\n            \"background\": \"#1565c0\",\n            \"borderRadius\": \"8px\"\n        }\n    },\n    {\n        \"name\": \"书评: 开启/关闭\",\n        \"type\": \"button\",\n        \"action\": \"togglePara()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.5,\n            \"background\": \"#37474f\",\n            \"borderRadius\": \"8px\"\n        }\n    },\n    {\n        \"name\": \"配置详情\",\n        \"type\": \"button\",\n        \"action\": \"configDetail()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.5,\n            \"background\": \"#5d4037\",\n            \"borderRadius\": \"8px\"\n        }\n    },\n    {\n        \"name\": \"复制导入链接\",\n        \"type\": \"button\",\n        \"action\": \"copyImportUrl()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.5,\n            \"background\": \"#6a1b9a\",\n            \"borderRadius\": \"8px\"\n        }\n    },\n    {\n        \"name\": \"用户控制台\",\n        \"type\": \"button\",\n        \"action\": \"openUser()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.5,\n            \"background\": \"#00838f\",\n            \"borderRadius\": \"8px\"\n        }\n    },\n    {\n        \"name\": \"清空书源配置\",\n        \"type\": \"button\",\n        \"action\": \"resetConfig()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1,\n            \"background\": \"#b71c1c\",\n            \"borderRadius\": \"8px\"\n        }\n    }\n]", "ruleBookInfo": {"author": "$.data.author||$.data.authorName||$.data.author_name", "coverUrl": "$.data.coverUrl||$.data.cover_url||$.data.thumbUrl", "intro": "$.data.description||$.data.abstract||$.data.bookAbstractV2", "kind": "$.data.category||$.data.categoryV2||$.data.genre", "lastChapter": "$.data.lastChapterTitle||$.data.last_chapter_title", "name": "$.data.bookName||$.data.book_name||$.data.name||$.data.title", "tocUrl": "https://8080-50646e17d294cd3a.monkeycode-ai.online/api/v1/api/fqsearch/directory/{{$.data.bookId}}?bookId={{$.data.bookId}}&key=sk-517295872e6081587dc1b610ba3ef0dc7bf51a70b202be16@js:\nvar o={};try{o=JSON.parse(source.getVariable()||'{}')||{}}catch(e){}\nvar k=o.apikey||'sk-517295872e6081587dc1b610ba3ef0dc7bf51a70b202be16';\nresult=result.replace(/([?&])key=[^&]*/, '$1key=' + encodeURIComponent(k));\nif(result.indexOf('key=')===-1)result+=(result.indexOf('?')===-1?'?':'&')+'key='+encodeURIComponent(k);\nresult", "wordCount": "$.data.wordNumber"}, "ruleContent": {"content": "$.data.txtContent", "title": "$.data.title"}, "ruleExplore": {"author": "$.author", "bookList": "$.data.books[*]||$.data.book_info[*]", "bookUrl": "https://8080-50646e17d294cd3a.monkeycode-ai.online/api/v1/api/fqnovel/book/{{$.bookId||$.book_id||$.id}}?bookId={{$.bookId||$.book_id||$.id}}&key=sk-517295872e6081587dc1b610ba3ef0dc7bf51a70b202be16@js:\nvar o={};try{o=JSON.parse(source.getVariable()||'{}')||{}}catch(e){}\nvar k=o.apikey||'sk-517295872e6081587dc1b610ba3ef0dc7bf51a70b202be16';\nresult=result.replace(/([?&])key=[^&]*/, '$1key=' + encodeURIComponent(k));\nif(result.indexOf('key=')===-1)result+=(result.indexOf('?')===-1?'?':'&')+'key='+encodeURIComponent(k);\nresult", "coverUrl": "$.coverUrl||$.cover_url||$.thumbUrl", "intro": "$.description||$.abstract||$.bookAbstractV2", "kind": "$.category||$.categoryV2||$.genre", "lastChapter": "$.lastChapterTitle||$.last_chapter_title", "name": "$.bookName||$.book_name||$.name||$.title", "wordCount": "$.wordCount||$.wordNumber"}, "ruleSearch": {"author": "$.author", "bookList": "$.data.books[*]||$.data", "bookUrl": "https://8080-50646e17d294cd3a.monkeycode-ai.online/api/v1/api/fqnovel/book/{{$.bookId||$.book_id||$.id}}?bookId={{$.bookId||$.book_id||$.id}}&key=sk-517295872e6081587dc1b610ba3ef0dc7bf51a70b202be16@js:\nvar o={};try{o=JSON.parse(source.getVariable()||'{}')||{}}catch(e){}\nvar k=o.apikey||'sk-517295872e6081587dc1b610ba3ef0dc7bf51a70b202be16';\nresult=result.replace(/([?&])key=[^&]*/, '$1key=' + encodeURIComponent(k));\nif(result.indexOf('key=')===-1)result+=(result.indexOf('?')===-1?'?':'&')+'key='+encodeURIComponent(k);\nresult", "coverUrl": "$.coverUrl||$.cover_url||$.thumbUrl", "intro": "$.description||$.abstract||$.bookAbstractV2", "kind": "$.category||$.categoryV2||$.genre", "lastChapter": "$.lastChapterTitle||$.last_chapter_title", "name": "$.bookName||$.book_name||$.name||$.title\n<js>\nif (java.get('current_page') == null || java.get('current_page') == '1') {\n    var searchId = java.getString('$..searchId');\n    if (searchId) {\n        java.put('search_id', searchId);\n    }\n}\nresult\n</js>", "wordCount": "$.wordCount||$.wordNumber"}, "ruleToc": {"chapterList": "$.data.item_data_list[*]", "chapterName": "$.title", "chapterUrl": "@js:\n'https://8080-50646e17d294cd3a.monkeycode-ai.online/api/v1/api/fqnovel/chapter/enriched/'+java.getString('$.book_id')+'/'+java.getString('$.item_id')+'?key='+encodeURIComponent(java.getString('$.api_key')||'sk-517295872e6081587dc1b610ba3ef0dc7bf51a70b202be16')", "volGroup": "$.volume_name", "updateTime": "{{$.volume_name}} | {{$.chapter_word_number}}字 | {{java.timeFormatUTC(java.getString(\"$.first_pass_time\") * 1000, 'yyyy-MM-dd HH:mm:ss', 8)}}##第一卷：默认\n@js:\nif (result.startsWith(\" |\")) result = result.slice(2)\nif (result.startsWith(\"| \")) result = result.slice(2)\nresult"}, "searchUrl": "https://8080-50646e17d294cd3a.monkeycode-ai.online/api/v1/api/fqsearch/books?query={{key}}&offset={{(page-1)*20}}&count=20&tabType=3&key=sk-517295872e6081587dc1b610ba3ef0dc7bf51a70b202be16@js:\nvar o={};try{o=JSON.parse(source.getVariable()||'{}')||{}}catch(e){}\nvar k=o.apikey||'sk-517295872e6081587dc1b610ba3ef0dc7bf51a70b202be16';\nvar rawKey = String(java.get('key') || '').trim();\nif (/^\\d+$/.test(rawKey)) {\n    result = source.bookSourceUrl + '/api/v1/api/fqnovel/book/' + rawKey + '?key=' + encodeURIComponent(k);\n} else {\n    result = result.replace(/([?&])key=[^&]*/, '$1key=' + encodeURIComponent(k));\n    if (result.indexOf('key=') === -1) result += (result.indexOf('?') === -1 ? '?' : '&') + 'key=' + encodeURIComponent(k);\n    var currentPage = java.get('current_page') || '1';\n    java.put('current_page', (parseInt(currentPage) + 1).toString());\n    var searchId = java.get('search_id');\n    if (searchId && currentPage != '1') {\n        result = result + '&searchId=' + encodeURIComponent(searchId);\n    }\n}", "weight": 0},{"bookSourceComment": "webview登录：点击登录打开登录页面，手动输入账号密码。\n※ 注册请点击登录页面的「新用户注册」链接\n※ 站点有Cloudflare防护", "bookSourceName": "🍩轻小说文库2.1[修复]", "bookSourceType": 0, "bookSourceUrl": "http://www.wenku8.net/index.php#xsw8093", "customOrder": -7384, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "电击文库::https://www.wenku8.net/modules/article/articlelist.php?class=1&page={{page}}\n富士见文库::https://www.wenku8.net/modules/article/articlelist.php?class=2&page={{page}}\n角川文库::https://www.wenku8.net/modules/article/articlelist.php?class=3&page={{page}}\nMF文库J::https://www.wenku8.net/modules/article/articlelist.php?class=4&page={{page}}\nFami通文库::https://www.wenku8.net/modules/article/articlelist.php?class=5&page={{page}}\nGA文库::https://www.wenku8.net/modules/article/articlelist.php?class=6&page={{page}}\nHJ文库::https://www.wenku8.net/modules/article/articlelist.php?class=7&page={{page}}\n一迅社::https://www.wenku8.net/modules/article/articlelist.php?class=8&page={{page}}\n集英社::https://www.wenku8.net/modules/article/articlelist.php?class=9&page={{page}}\n小学馆::https://www.wenku8.net/modules/article/articlelist.php?class=10&page={{page}}\n讲谈社::https://www.wenku8.net/modules/article/articlelist.php?class=11&page={{page}}\n少女文库::https://www.wenku8.net/modules/article/articlelist.php?class=12&page={{page}}\n其他文库::https://www.wenku8.net/modules/article/articlelist.php?class=13&page={{page}}\n游戏剧本::https://www.wenku8.net/modules/article/articlelist.php?class=14&page={{page}}\n全部轻小说::https://www.wenku8.net/modules/article/articlelist.php?page={{page}}\n动画化作品::https://www.wenku8.net/modules/article/toplist.php?sort=anime&page={{page}}\n完结全本::https://www.wenku8.net/modules/article/articlelist.php?fullflag=1&page={{page}}\n排行榜::https://www.wenku8.net/modules/article/toplist.php?sort=allvisit&page={{page}}\n总收藏榜::https://www.wenku8.net/modules/article/toplist.php?sort=goodnum&page={{page}}\n总排行榜::https://www.wenku8.net/modules/article/toplist.php?sort=allvisit&page={{page}}\n月排行榜::https://www.wenku8.net/modules/article/toplist.php?sort=monthvisit&page={{page}}\n周排行榜::https://www.wenku8.net/modules/article/toplist.php?sort=weekvisit&page={{page}}\n日排行榜::https://www.wenku8.net/modules/article/toplist.php?sort=dayvisit&page={{page}}\n总推荐榜::https://www.wenku8.net/modules/article/toplist.php?sort=allvote&page={{page}}\n月推荐榜::https://www.wenku8.net/modules/article/toplist.php?sort=monthvote&page={{page}}\n周推荐榜::https://www.wenku8.net/modules/article/toplist.php?sort=weekvote&page={{page}}\n日推荐榜::https://www.wenku8.net/modules/article/toplist.php?sort=dayvote&page={{page}}\n最新入库::https://www.wenku8.net/modules/article/toplist.php?sort=postdate&page={{page}}\n最近更新::https://www.wenku8.net/modules/article/toplist.php?sort=lastupdate&page={{page}}\n字数排行::https://www.wenku8.net/modules/article/toplist.php?sort=size&page={{page}}\n校园::https://www.wenku8.net/modules/article/tags.php?t=%D0%A3%D4%B0&page={{page}}\n青春::https://www.wenku8.net/modules/article/tags.php?t=%C7%E0%B4%BA&page={{page}}\n恋爱::https://www.wenku8.net/modules/article/tags.php?t=%C1%B5%B0%AE&page={{page}}\n治愈::https://www.wenku8.net/modules/article/tags.php?t=%D6%CE%D3%FA&page={{page}}\n群像::https://www.wenku8.net/modules/article/tags.php?t=%C8%BA%CF%F1&page={{page}}\n竞技::https://www.wenku8.net/modules/article/tags.php?t=%BE%BA%BC%BC&page={{page}}\n音乐::https://www.wenku8.net/modules/article/tags.php?t=%D2%F4%C0%D6&page={{page}}\n美食::https://www.wenku8.net/modules/article/tags.php?t=%C3%C0%CA%B3&page={{page}}\n旅行::https://www.wenku8.net/modules/article/tags.php?t=%C2%C3%D0%D0&page={{page}}\n欢乐向::https://www.wenku8.net/modules/article/tags.php?t=%BB%B6%C0%D6%CF%F2&page={{page}}\n经营::https://www.wenku8.net/modules/article/tags.php?t=%BE%AD%D3%AA&page={{page}}\n职场::https://www.wenku8.net/modules/article/tags.php?t=%D6%B0%B3%A1&page={{page}}\n斗智::https://www.wenku8.net/modules/article/tags.php?t=%B6%B7%D6%C7&page={{page}}\n脑洞::https://www.wenku8.net/modules/article/tags.php?t=%C4%D4%B6%B4&page={{page}}\n宅文化::https://www.wenku8.net/modules/article/tags.php?t=%D5%AC%CE%C4%BB%AF&page={{page}}\n穿越::https://www.wenku8.net/modules/article/tags.php?t=%B4%A9%D4%BD&page={{page}}\n奇幻::https://www.wenku8.net/modules/article/tags.php?t=%C6%E6%BB%C3&page={{page}}\n魔法::https://www.wenku8.net/modules/article/tags.php?t=%C4%A7%B7%A8&page={{page}}\n异能::https://www.wenku8.net/modules/article/tags.php?t=%D2%EC%C4%DC&page={{page}}\n战斗::https://www.wenku8.net/modules/article/tags.php?t=%D5%BD%B6%B7&page={{page}}\n科幻::https://www.wenku8.net/modules/article/tags.php?t=%BF%C6%BB%C3&page={{page}}\n机战::https://www.wenku8.net/modules/article/tags.php?t=%BB%FA%D5%BD&page={{page}}\n战争::https://www.wenku8.net/modules/article/tags.php?t=%D5%BD%D5%F9&page={{page}}\n冒险::https://www.wenku8.net/modules/article/tags.php?t=%C3%B0%CF%D5&page={{page}}\n龙傲天::https://www.wenku8.net/modules/article/tags.php?t=%C1%FA%B0%C1%CC%EC&page={{page}}\n悬疑::https://www.wenku8.net/modules/article/tags.php?t=%D0%FC%D2%C9&page={{page}}\n犯罪::https://www.wenku8.net/modules/article/tags.php?t=%B7%B8%D7%EF&page={{page}}\n复仇::https://www.wenku8.net/modules/article/tags.php?t=%B8%B4%B3%F0&page={{page}}\n黑暗::https://www.wenku8.net/modules/article/tags.php?t=%BA%DA%B0%B5&page={{page}}\n猎奇::https://www.wenku8.net/modules/article/tags.php?t=%C1%D4%C6%E6&page={{page}}\n惊悚::https://www.wenku8.net/modules/article/tags.php?t=%BE%AA%E3%A4&page={{page}}\n间谍::https://www.wenku8.net/modules/article/tags.php?t=%BC%E4%B5%FD&page={{page}}\n末日::https://www.wenku8.net/modules/article/tags.php?t=%C4%A9%C8%D5&page={{page}}\n游戏::https://www.wenku8.net/modules/article/tags.php?t=%D3%CE%CF%B7&page={{page}}\n大逃杀::https://www.wenku8.net/modules/article/tags.php?t=%B4%F3%CC%D3%C9%B1&page={{page}}\n青梅竹马::https://www.wenku8.net/modules/article/tags.php?t=%C7%E0%C3%B7%D6%F1%C2%ED&page={{page}}\n妹妹::https://www.wenku8.net/modules/article/tags.php?t=%C3%C3%C3%C3&page={{page}}\n女儿::https://www.wenku8.net/modules/article/tags.php?t=%C5%AE%B6%F9&page={{page}}\nJK::https://www.wenku8.net/modules/article/tags.php?t=JK&page={{page}}\nJC::https://www.wenku8.net/modules/article/tags.php?t=JC&page={{page}}\n大小姐::https://www.wenku8.net/modules/article/tags.php?t=%B4%F3%D0%A1%BD%E3&page={{page}}\n性转::https://www.wenku8.net/modules/article/tags.php?t=%D0%D4%D7%AA&page={{page}}\n伪娘::https://www.wenku8.net/modules/article/tags.php?t=%CE%B1%C4%EF&page={{page}}\n人外::https://www.wenku8.net/modules/article/tags.php?t=%C8%CB%CD%E2&page={{page}}\n后宫::https://www.wenku8.net/modules/article/tags.php?t=%BA%F3%B9%AC&page={{page}}\n百合::https://www.wenku8.net/modules/article/tags.php?t=%B0%D9%BA%CF&page={{page}}\n耽美::https://www.wenku8.net/modules/article/tags.php?t=%B5%A2%C3%C0&page={{page}}\nNTR::https://www.wenku8.net/modules/article/tags.php?t=NTR&page={{page}}\n女性视角::https://www.wenku8.net/modules/article/tags.php?t=%C5%AE%D0%D4%CA%D3%BD%C7&page={{page}}\nnull", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36\", \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\", \"Accept-Language\": \"zh-CN,zh;q=0.9,en;q=0.8\"}", "lastUpdateTime": "1785032056320", "loginUrl": "https://www.wenku8.net/login.php,{\"webView\": true}", "respondTime": 180000, "ruleBookInfo": {"author": "text.小说作者@textNodes##小说作者[：:]*", "intro": "//span[6]", "kind": "text.文库分类@text##文库分类：", "lastChapter": "tag.tbody@tag.tr@tag.td.1@tag.span.3@text", "name": "h1@text||tag.h1@text||@tag.tbody.0@tag.tr.0@tag.td.0@tag.span@tag.b@text", "tocUrl": "text.小说目录@href", "wordCount": "text.全文长度@text##全文长度："}, "ruleContent": {"content": "id.content@html##本文来自.*|最新.*一网打尽！", "webJs": "(function(){\n    var c = document.getElementById('content');\n    if(!c || c.innerText.trim().length < 30) {\n        return '';\n    }\n    return c.outerHTML;\n})()"}, "ruleExplore": {"author": "//div[2]/p[1]/text()##/分类.*", "bookList": "//div[@id='content']//td/div", "bookUrl": "text.我要阅读@href", "coverUrl": "img@src", "intro": "//p[4]", "kind": "//p[3]/span/text()&&//p[2]/text()", "name": "//div[2]/b/a/text()"}, "ruleSearch": {"author": "text.作者@textNodes##作者[：:]\\s*|/.*", "bookList": "id.content@tag.table@tag.tbody@tag.tr@tag.td@tag.div", "bookUrl": "text.我要阅读@href", "coverUrl": "img@src", "intro": "//p[4]", "kind": "text.分类@text##作者.*分类:", "lastChapter": "text.更新@text##更新:|/.*", "name": "a[href*=\"/book/\"]@text||@tag.b@tag.a@text||tag.a@text", "wordCount": "text.字数@text##.*字数:|/.*"}, "ruleToc": {"chapterList": "class.css@tag.td@a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "@js:\n\"https://www.wenku8.net/modules/article/search.php?searchtype=articlename&searchkey={{key}}&page={{page}},\"+JSON.stringify({\r\n\t \"charset\": \"GBK\",\r  \n\t \"method\": \"GET\",\r \r\n\t})", "weight": 0},{"bookSourceName": "海豚书屋", "bookSourceType": 0, "bookSourceUrl": "https://m.haitunsw.com", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "全部::/cate/0_{{page}}_0_0_0_0_0.html\n言情小说::/cate/1_{{page}}_0_0_0_0_0.html\n都市小说::/cate/2_{{page}}_0_0_0_0_0.html\n历史小说::/cate/3_{{page}}_0_0_0_0_0.html\n灵异小说::/cate/4_{{page}}_0_0_0_0_0.html\n推理小说::/cate/5_{{page}}_0_0_0_0_0.html\n武侠小说::/cate/6_{{page}}_0_0_0_0_0.html\n二次元::/cate/7_{{page}}_0_0_0_0_0.html\n玄幻奇幻::/cate/8_{{page}}_0_0_0_0_0.html\n虚拟网游::/cate/9_{{page}}_0_0_0_0_0.html", "header": "{\"User-Agent\": \"Mozilla/5.0 (Linux; Android 9) Mobile Safari/537.36\"}", "lastUpdateTime": "1784982455492", "loginCheckJs": "var src = result.body();\nif (src.match(/Loading\\.\\.\\.|wafjs/)) {\n    cookie.removeCookie(source.bookSourceUrl);\n    var url = result.url();\n    java.startBrowserAwait(url, \"海豚书屋验证\");\n    java.connect(url);\n    result = java.connect(url);\n}\nresult;", "loginUrl": "https://m.haitunsw.com", "respondTime": 180000, "ruleBookInfo": {"author": "@get:{a}", "coverUrl": "http:@get:{c}", "init": "@put:{n:\"[property$=book_name]@content\",\na:\"[property$=author]@content\",\nk:\"[property~=category|status|update_time]@content\",\nl:\"[property$=latest_chapter_name]@content\",\ni:\"[property$=description]@content&&.sectionTwo-content p.0@html\",\nc:\"[property$=image]@content\",\nt:\"text.目录@href\"}", "intro": "@get:{i}", "kind": "@get:{k}", "lastChapter": "@get:{l}", "name": "@get:{n}", "tocUrl": "@get:{t}"}, "ruleContent": {"content": "@js:\nurl=\"https:\"+result.match(/initTxt\\(\"([^\"]+)\",\"[^\"]+\"\\)/)[1];\nr=String(java.ajax(url).match(/_txt_call\\(([\\s\\S]+\\})\\)/)[1]);\nvar r = eval('(' + r + ')');\n\t\t\t\tif(r.content!=null){\t\t\t\t\n      var e = r.replace;\n\t\t\t\tfor (var n in e) {\n\t\t\t\t\tvar i = new RegExp(e[n], \"ig\");\n\t\t\t\t\tr.content = r.content.replace(i, n)\n\t\t\t\t}\n\t\t\t\tresult=r.content\n\t\t\t\t\t}else{result=\"章节加载失败，或者内容正在手打中，请稍后访问~\"}"}, "ruleExplore": {"author": "p.-1@text", "bookList": ".item-text", "bookUrl": "a.0@href", "coverUrl": "", "intro": "", "kind": "", "lastChapter": "p.-1@text", "name": "a.0@text"}, "ruleSearch": {"author": "a.1@text", "bookList": "@js:\npath = '.search-card';\nc=java.getElement(path);\nif( !c.length ){\n  res = java.startBrowserAwait(baseUrl,'等待至跳转，然后重搜');\n  java.setContent(res.body());\n  c=java.getElement(path);\n}\nc", "bookUrl": "a.0@href", "intro": ".sc-content@text", "kind": "span.-1@text", "lastChapter": "span.-2@text", "name": "a.0@text", "wordCount": ""}, "ruleToc": {"chapterList": ".chapter-list li a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "/search/,{\n  \"body\": \"keyword={{key}}\",\n  \"method\": \"POST\"\n}", "weight": 0},{"bookSourceComment": "如果是用的官方版阅读，或者低版本阅读，推荐更新阅读以使用新功能，否则很多功能无法使用哦\n软件下载地址：https://legado.gyks.cf\n推荐使用阅读R或者阅读Sigma\n\n\n晴天聚合重构，已适配所有安卓版本阅读\n目前不适配苹果端栖阅(可以正常阅读，发现页无法适配)\n\n更新日志请点击登录，更新书源中查看\n\n基础使用教程：\n1、搜索：\n    1)基础搜索：在发现页长按该书源，点击搜索，直接搜，搜索范围(全部来源小说)\n    2)进阶搜索：在登陆-书源设置中选择指定模式/来源，可搜索指定模式/来源内容\n    3)快捷搜索：使用特殊关键词(x,t,m,d,@)搜索\n         x:书名@来源  如(x:十日终焉@番茄)\n         t:书名@来源  如(t:十日终焉@番茄)\n         m:书名@来源  如(m:十日终焉@番茄)\n         d:书名@来源  如(d:十日终焉@番茄)\n         其中：x表示小说(可省略)，t表示听书，m表示漫画，d表示短剧\n         冒号支持中文英文\n         \n2、发现页：\n    在书源设置中选择指定模式或者单个来源，然后刷新发现页即可\n    \n3、更多使用方式进入书源设置页面应该能一目了然", "bookSourceGroup": "聚合,番茄,七猫,塔读,QQ阅读,书旗,轻小说", "bookSourceName": "番茄聚合", "bookSourceType": 0, "bookSourceUrl": "番茄聚合", "bookUrlPattern": "https?:\\/\\/(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z0-9-]+(?::\\d+)?\\/detail.*", "customButton": false, "customOrder": 12, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "<js>\nlet moreSettings = getVariable('更多设置');\nvar base_url = BaseUrl();\nvar source_type = getVariable('频道') || '男频';\nlet tab = moreSettings && moreSettings['搜索模式'] || '小说';\nlet sources = getVariable(\"发现页来源\") || moreSettings && moreSettings[tab] || '全部';\nlet islyc = checkEnv();\n\nif (islyc != \"苹果\" && islyc != \"安卓\"){\n\ttab = getVariable(\"发现页类型\");\n\t}\n\n\nlet js;\n\njs = getVariable('云端配置');\n//java.longToast(JSON.stringify(js))\nif (!!!js) {\n    getCloudSettings(true);\n    js = getVariable('云端配置');\n }\n\n\nlet source_list = [];\ntry{\nsource_list = js[tab];\n} catch (e) {\n\tjava.longToast(e);\n\t}\n\nlet fqssionid = getFqToken();\nif (!fqssionid && (sources == '番茄' || sources == '全部')) {\n    java.toast('您还未登陆番茄账号，无法同步数据哦！');\n} \nvar fqsjurl = base_url + \"/bookshelf?page={{page}}&ssionid=\" + fqssionid;\nvar fqtjurl = base_url + \"/fqrecommend?page={{page}}&ssionid=\" + fqssionid;\nvar fqlsurl = base_url + \"/fqhistory?page={{page}}&ssionid=\" + fqssionid;\n\n\nvar groupDatas = [];\nvar infoData = [ ];\nif (sources == '番茄' || sources == '全部') {\ninfoData = [{\n        \"title\": \"登录番茄\",\n        \"url\": '{\\{java.startBrowser(\"https://fanqienovel.com/\",\"番茄登录\");}}',\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.45\n        }\n    }];\n}\n\nvar hasValidCookie = fqssionid.length > 0;\n\nif (hasValidCookie && (sources == '番茄' || sources == '全部')) {\n    function groupQuery() {\n        try {\n            var url = base_url + \"/group_name?ssionid=\" + fqssionid;\n            var res = java.ajax(url);\n            var response = JSON.parse(res);\n\n            if (!(response && response.data)) {}\n\n            response.data.forEach(function(group) {\n                var keys = Object.keys(group);\n                if (keys.length > 0) {\n                    var key = keys[0];\n                    var value = group[key];\n                    if (value && value.length) {\n                        var option = {\n                            \"method\": \"POST\",\n                            \"body\": {\n                                \"book_ids\": value,\n                                \"page\": \"{{page}}\"\n                            }\n                        };\n                        groupDatas.push({\n                            title: key,\n                            url: base_url + \"/bookshelf,\" + JSON.stringify(option),\n                            style: {\n                                layout_flexGrow: 1,\n                                layout_flexBasisPercent: 0.25\n                            }\n                        });\n                    }\n                }\n            });\n\n            if (groupDatas.length % 2 != 0) {\n                groupDatas.push({\n                    title: \"--\",\n                    url: \"\",\n                    style: {\n                        layout_flexGrow: 1,\n                        layout_flexBasisPercent: 0.25\n                    }\n                });\n            }\n            if (groupDatas.length % 3 != 0) {\n                groupDatas.push({\n                    title: \"--\",\n                    url: \"\",\n                    style: {\n                        layout_flexGrow: 1,\n                        layout_flexBasisPercent: 0.25\n                    }\n                });\n            }\n        } catch (e) {\n            java.longToast(\"番茄登录过期，已隐藏番茄书架\" + fqssionid);\n        }\n    }\n\n    try {\n       java.longToast(\"正在加载番茄分组数据...\");\n        var userUrl = base_url + \"/fquser?ssionid=\" + fqssionid;\n        var userRes = java.ajax(userUrl);\n        var userData = JSON.parse(userRes);\n\n        var userName = (userData && userData.data && userData.data.name) ? userData.data.name : '未知用户';\n        if (!userName.includes('未知用户')) {\n            infoData = [{\n                title: userName+'的番茄',\n                url: '',\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 1\n                }\n            },\n            {\n                title: '番茄书架',\n                url: fqsjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.25\n                }\n            }, \n            {\n                title: \"个性推荐\",\n                url: fqtjurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.25\n                }\n            }, {\n                title: \"历史阅读\",\n                url: fqlsurl,\n                style: {\n                    layout_flexGrow: 1,\n                    layout_flexBasisPercent: 0.25\n                }\n            }];\n        }\n        groupQuery();\n    } catch (e) {\n        java.longToast(\"番茄登录过期，已隐藏番茄书架\");\n    }\n}\n\nvar style_list = [];\ntry {\n    var durl = `${base_url}/discovestyle?source=${sources}&source_type=${source_type}&tab=${tab}`;\n    var res = java.ajax(durl);\n    var result = JSON.parse(res);\n    style_list = result.data || [];\n    if (result.msg) {\n        java.toast(result.msg);\n    }\n} catch (e) {\n    java.toast(\"发现样式获取失败\");\n}\nlet qttoken = getToken();\n//let qtcookie = \"\"\nlet qtop = {\n    method: \"GET\",\n    headers: {\n        cookie: `qttoken=${qttoken}`\n    },\n};\n\n\n\nqtop = JSON.stringify(qtop);\nlet qtsjurl = base_url + '/get_book_shelf,' + qtop;\n\nlet qtsj = [];\n\nif (islyc != \"苹果\" && islyc != \"安卓\") {\n    try {\n        let hostsbk = getVariable('云端配置')['hosts'] || hosts;\n        qtsj.push(createFilter(\n            \"线路\",\n            hostsbk,\n            base_url,\n            \"线路\",\n            1,\n            \"'线路'\"\n        ));\n        qtsj.push(createFilter(\n            \"类型\",\n            [\"小说\", \"听书\", \"短剧\", \"漫画\"],\n            tab,\n            \"发现页类型\",\n            0.4,\n            \"'类型'\"\n        ));\n        qtsj.push(createFilter(\n            \"频道\",\n            [\"男频\", \"女频\"],\n            source_type,\n            \"频道\",\n            0.4,\n            \"'频道'\"\n        ));\n        qtsj.push(createFilter(\n            \"平台\",\n            source_list,\n            sources,\n            \"发现页来源\",\n            1,\n            \"'平台'\"\n        ));\n        let searchKey = getVariable('搜索关键词') || \"\";\n        qtsj.push(createText(\n            '搜索关键词', \n            \"setVariable('搜索关键词',(infoMap['搜索关键词'] || (infoMap.get && infoMap.get('搜索关键词'))))\", \n            searchKey , \n            0.5,\n             \"'搜索书名或作者'\"\n             ));\n             \n  qtsj.push(createButton(\n      '🔍搜索', \n      'exploreSearch()', \n      0.3\n      ));\n\n        qtsj.push({\n        \"title\": \"更新配置\",\n        \"type\": \"button\",\n        \"action\": \"getCloudSettings(true)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    })\n    qtsj.push({\n        \"title\": \"更新书源\",\n        \"type\": \"button\",\n        \"action\": \"renderVersionPage()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    })\n    qtsj.push({\n        \"title\": \"书源设置\",\n        \"type\": \"button\",\n        \"action\": \"getHtmlSettings()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    })\n       const excludeTitles = ['点击登录可切换来源', '切换后长按刷新即可'];\n       style_list = style_list.filter(item => !excludeTitles.includes(item.title));\n       style_list.forEach(item => {\n  if (item.url && typeof item.url == 'string') {\n    item.url += '&ssionid='+fqssionid;\n  }\n});\n    } catch {}\n} else {\n\tif (islyc == '安卓'){\n\tqtsj.push({\n        \"title\": \"下载阅读Sigma最新测试版\",\n        \"url\": `{\\{java.longToast(\"本书源推荐使用最新版洛娅橙改版阅读Σ\\\\n请安装后重新导入书源\");java.startBrowser(\"https://legado.gyks.cf\",\"下载阅读Sigma最新测试版\");}}`,\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    })}\n\t}\n\nif (qttoken.length > 10) {\nqtsj.push({\n    title: \"晴天书架\",\n    url: qtsjurl,\n    style: {\n        layout_flexGrow: 1,\n        layout_flexBasisPercent: 1\n    }\n})\n} else {\nqtsj.push({\n    title: \"登录晴天书源\",\n    url: `{\\{java.startBrowser(\"${base_url}/login\",\"登录书源\");}}`,\n    style: {\n        layout_flexGrow: 1,\n        layout_flexBasisPercent: 1\n    }\n})\n}\n\n\nvar finalData = infoData.concat(groupDatas, style_list);\nfinalData = qtsj.concat(finalData);\nJSON.stringify(finalData);\n</js>", "jsLib": "// 当前书源版本号，切勿修改，否则影响更新的识别\nlet localVersion = '26.7.16.1';\n\n// 初始服务器列表\nlet hosts = [\n    'https://v1.gyks.cf',\n    'https://v2.gyks.cf',\n    'https://v3.gyks.cf',\n    'https://v4.gyks.cf',\n    'https://v5.gyks.cf',\n    'https://v6.gyks.cf',\n    'https://v7.gyks.cf',\n    'http://101.35.133.34:8888'\n];\n\n\nfunction isVs (sources) {\n\tlet SOURCES_VIDEO = ['毒舌影视', 'NT动漫'];\n\t return SOURCES_VIDEO.some(src => sources.includes(src));\n\t}\n\n\n\n// 初始化值\nconst defaultConfig = {\n    线路: hosts[0],\n    发现页来源: \"番茄\",\n    发现页类型: \"小说\"\n};\n\n// 获取云端配置\nfunction getCloudSettings(r) {\n    if (r == undefined) r = false;\n    const {\n        java,\n        cache\n    } = this;\n    let c = this.getVariable('云端配置').version;\n    if (r || !c) {\n        java.longToast(`\\n正在更新最新配置`);\n        try {\n            let url = `/static/source_config/config.json`;\n            //\tjava.longToast(url)\n            let js = this.request(url);\n            js = JSON.parse(String(js));\n            let intc = parseInt(c);\n            let intv = parseInt(js['version']);\n            if (intc >= intv) {\n            \t    java.longToast(`\\n已是最新配置：${js['version']}`);\n            \t    return;\n            \t} else if (!intc && intv) {\n            \t\tjava.longToast(`\\n已初始化配置：${intv}`);\n            \t\t} else if (intc < intv || !intc && intv) {\n            java.longToast(`\\n已更新配置：${intc}→${intv}`);\n            } else {\n            java.longToast(`\\n获取配置失败：请切换线路再试试~`);\n            return;\n            }\n            this.setVariable('云端配置', js);\n            \n            return js;\n        } catch (e) {\n            java.longToast(`\\n获取最新配置失败：${e}`);\n        }\n    }\n}\n\n// 统一获取和解析变量\nfunction _getParsedVariable() {\n    const {\n        source,\n        java\n    } = this;\n    let v = source.getVariable();\n    try {\n        return JSON.parse(v);\n    } catch {\n        return defaultConfig;\n    }\n}\n\n// 获取设置变量\nfunction getLoginInfo(k) {\n    const {\n        source,\n        java\n    } = this;\n    let res = source.getLoginInfoMap();\n    if (!res) {\n        res = defaultConfig;\n    }\n    if (res[k] == '❌') {\n        return '0';\n    } else if (res[k] == '✅') {\n        return '1';\n    }\n    return res[k]\n}\n\n// 还原\nfunction deleteVariable() {\n    const {\n        source,\n        java,\n        cache\n    } = this;\n    source.setVariable('');\n    cache.delete('gyksconfig');\n    java.longToast('\\n所有设置已还原到初始化导入状态');\n}\n\n// 获取源变量\nfunction getVariable(k) {\n    if (k == undefined) k = \"\";\n    const { source } = this;\n    let parsed = {}\n    try {\n        parsed = JSON.parse(source.getVariable());\n    } catch {}\n    if (k == \"\") {\n        return parsed;\n    }\n    let value = parsed[k];\n    if (value == undefined) {\n        value = defaultConfig[k];\n    }\n    return value != undefined ? value : \"\";\n}\n\n// 设置源变量\nfunction setVariable(k, v, t) {\n    if (t == undefined) t = true;\n    const {\n        source,\n        java\n    } = this;\n    const vs = this.getVariable();\n    vs[k] = v;\n    source.setVariable(JSON.stringify(vs, null, 4));\n    if (k != '云端配置' && t && k!='搜索关键词') {\n        java.toast(`\\n设置 ${k} 为 ${v}`)\n    }\n}\n\n// 获取正在使用的线路\nfunction BaseUrl() {\n    let hostsbk = this.getVariable('云端配置')['hosts'] || hosts;\n    let h = this.getVariable(\"线路\");\n    if (!h || String(h) == \"undefind\") {\n        h = hostsbk[0]\n    }\n    return h;\n}\n\n// 切换线路\nfunction switchToNextLine(toast) {\n    if (toast == undefined) toast = false;\n    const currentLine = this.BaseUrl();\n    let hostsbk = this.getVariable('云端配置')['hosts'] || hosts;\n    let currentIndex = hostsbk.findIndex(item => item == currentLine);\n    let nextIndex = (currentIndex + 1) % hostsbk.length;\n    const nextLine = hostsbk[nextIndex];\n    this.setVariable(\"线路\", nextLine,false);\n    let switchToast = this.getVariable(\"切换提醒\") || \"false\";\n    if (toast && switchToast  == \"true\") {\n        this.java.longToast(`\\n${toast}\\n自动切换到:${nextLine}`)\n    }\n    return nextLine;\n}\n\n\n// 备用设置方案\nfunction ste(v) {\n    const {\n        java\n    } = this;\n    let moreSettings = this.getVariable(\"更多设置\") || {};\n    let paraSettings = this.getVariable(\"段评设置\") || {};\n    if (v==\"段评\"){\n        if (paraSettings[\"段评开关\"] != \"false\"){\n            paraSettings[\"段评开关\"]= \"false\";\n            java.longToast(\"\\n❌段评已关闭\");\n        }else{\n            paraSettings[\"段评开关\"]= \"true\";\n            java.longToast(\"\\n✅段评已开启\");\n        }\n    }\n    if (v==\"小说\" || v==\"听书\" || v==\"漫画\" || v==\"短剧\"){\n        moreSettings[\"搜索模式\"]=v;\n        java.longToast(`\\n已设置搜索模式为 ${v}`);\n    }\n    if (v==\"图片\"){\n        if (moreSettings[\"显示图片\"] != \"false\"){\n            moreSettings[\"显示图片\"]= \"false\";\n            java.longToast(\"\\n❌已关闭图片显示\");\n        }else{\n            moreSettings[\"显示图片\"]= \"true\";\n            java.longToast(\"\\n✅已开启图片显示\");\n        }\n    }\n    if (v==\"简介\"){\n        if (moreSettings[\"完整简介\"] != \"false\"){\n            moreSettings[\"完整简介\"]= \"false\";\n            java.longToast(\"\\n❌已关闭完整简介\");\n        }else{\n            moreSettings[\"完整简介\"]= \"true\";\n            java.longToast(\"\\n✅已开启完整简介\");\n        }\n    }\n    if (v==\"同步\"){\n        if (moreSettings[\"同步书架\"] != \"false\"){\n            moreSettings[\"同步书架\"]= \"false\";\n            java.longToast(\"\\n❌已关闭同步书架\");\n        }else{\n            moreSettings[\"同步书架\"]= \"true\";\n            java.longToast(\"\\n✅已开启同步书架\");\n        }\n    }\n    if (v==\"强制\"){\n        if (moreSettings[\"强制搜索\"] != \"false\"){\n            moreSettings[\"强制搜索\"]= \"false\";\n            java.longToast(\"\\n❌已关闭强制搜索\");\n        }else{\n            moreSettings[\"强制搜索\"]= \"true\";\n            java.longToast(\"\\n✅已开启强制搜索\");\n        }\n    }\n    if (v==\"目录\"){\n        if (moreSettings[\"目录显示来源\"] != \"false\"){\n            moreSettings[\"目录显示来源\"]= \"false\";\n            java.longToast(\"\\n❌已关闭目录显示来源\");\n        }else{\n            moreSettings[\"目录显示来源\"]= \"true\";\n            java.longToast(\"\\n✅已开启目录显示来源\");\n        }\n    }\n    if (v==\"网络\"){\n        if (moreSettings[\"网络模式\"] != \"服务器\"){\n            moreSettings[\"网络模式\"]= \"服务器\";\n            java.longToast(\"\\n已切换为 服务器 模式\");\n        }else{\n            moreSettings[\"网络模式\"]= \"本地\";\n            java.longToast(\"\\n已切换为 本地 模式\");\n        }\n    }\n    this.setVariable(\"更多设置\", moreSettings, false);\n    this.setVariable(\"段评设置\", paraSettings, false);\n}\n\nfunction parseBadMap(str) {\n    str = str\n        .replace(/^{|}$/g, '');\n\n    const result = {};\n\n    str.split(',').forEach(item => {\n        const parts = item.split('=');\n\n        if (parts.length === 2) {\n            const key = parts[0].trim();\n            const value = parts[1].trim();\n\n            result[key] = value;\n        }\n    });\n\n    return result;\n}\n\nfunction findItemIndex(data, item_id) {\n    if (!data || !Array.isArray(data)) {\n        return 0;\n    }\n    for (let i = 0; i < data.length; i++) {\n        if (data[i] && data[i].item_id == item_id) {\n            return i;\n        }\n    }\n    return 0;\n}\n\n// 判断当前环境\nfunction checkEnv() {\n    const {\n        java,\n        source\n    } = this;\n\n    try {\n        java.qread();\n        return \"轻阅读\";\n    } catch (e) {}\n\n    try {\n        if (typeof java.reLoginView == 'function') {\n            return \"改版\";\n        }\n        new Packages.io.legato.kazusa.utils.TimeoutCancellationException('');\n        return \"改版\";\n    } catch (e) {}\n    try {\n        java.deviceID();\n        return \"苹果\";\n    } catch (e) {}\n\n    if (typeof source.loginUi == 'function') {\n        return \"安卓\";\n    }\n\n    return \"改版\";\n}\n\n// 获取番茄token\nfunction getFqToken() {\n    const {\n        java,\n        cookie\n    } = this;\n\n    try {\n        let cookieValue = String(cookie.getCookie('fanqienovel.com')) || String(java.getCookie('fanqienovel.com'));\n        let parts = cookieValue.split(\";\");\n        for (let part of parts) {\n            if (part.includes(\"sessionid\")) {\n                return part.split(\"=\")[1];\n            }\n        }\n    } catch {}\n    return \"\";\n}\n\n// 获取登陆token\nfunction getToken() {\n    const {\n        java,\n        cookie\n    } = this;\n    let hostsbk = this.getVariable('云端配置')['hosts'] || hosts;\n    try {\n        for (let h of hostsbk) {\n            let cookieValue = String(cookie.getCookie(h)) || String(java.getCookie(h));\n            let parts = cookieValue.split(\";\");\n            for (let part of parts) {\n                if (part.includes(\"qttoken\")) {\n                    return part.split(\"=\")[1];\n                }\n            }\n        }\n    } catch {}\n    return \"\";\n}\n\n// 移除ck\nfunction removeAllCookies() {\n    const {\n        java,\n        cookie\n    } = this;\n    let hostsbk = this.getVariable('云端配置')['hosts'] || hosts;\n    for (let h of hostsbk) {\n        cookie.removeCookie(h);\n    }\n    cookie.removeCookie('fanqienovel.com');\n    java.toast('\\n已退出登陆')\n}\n\n// 设置ck\nfunction setAllCookies(ck) {\n    const {\n        cookie\n    } = this;\n    let hostsbk = this.getVariable('云端配置')['hosts'] || hosts;\n    for (let h of hostsbk) {\n        cookie.setCookie(h, ck);\n    }\n}\n\n// 请求封装\nfunction request(url, method, body, req, index) {\n    if (method == undefined) method = 'GET';\n    if (body == undefined) body = {};\n    if (req == undefined) req = true;\n    if (index == undefined) index = 0;\n\n    let urla = url;\n    if (!url.includes('http')) {\n        urla = this.BaseUrl() + url;\n    }\n\n    const { java } = this;\n    let device = '';\n    try {\n        device = java.androidId();\n    } catch {\n        try {\n            device = java.deviceID();\n        } catch {}\n    }\n\n    let qttoken = this.getToken();\n    let options = {\n        method: method,\n        headers: {\n            'cookie': `qttoken=${qttoken};deviceId=${device};`,\n            'Content-Type': 'application/json'\n        },\n        body: JSON.stringify(body)\n    };\n\n    urla = `${urla},${JSON.stringify(options)}`;\n    java.log(urla);\n\n    if (!req) {\n        return urla;\n    }\n\n    const startTime = new Date().getTime();\n\n    let data;\n    let requestTimedOut = false;\n    let requestFailed = false;\n\n    try {\n        data = java.ajax(urla);\n        JSON.parse(data);\n    } catch (error) {\n        requestFailed = true;\n    } finally {\n        const endTime = new Date().getTime();\n        const duration = endTime - startTime;\n        let timeout = this.getVariable('超时时间') || '10';\n        timeout = parseInt(timeout)*1000\n        if (!requestFailed && duration > timeout ) {\n            requestTimedOut = true;\n        }\n    }\n    if (requestTimedOut) {\n        let timeoutSwitch = this.getVariable('超时自动切换') || 'true';\n        if (timeoutSwitch!= \"false\") {\n             java.log('检测到当前线路较慢，已切换线路');\n            this.switchToNextLine('⚠️当前线路较慢');\n        }\n        return data;\n    }\n    if (requestFailed) {\n        java.log('线路报错，自动切换下一个');\n        let hostsbk = this.getVariable('云端配置')['hosts'] || hosts;\n        let autoSwitch = this.getVariable('自动切换') || 'true';\n\n        if (hostsbk.length > index && autoSwitch != \"false\") {\n            this.switchToNextLine('❌线路报错');\n            return this.request(url, method, body, req, index + 1);\n        } else {\n            return \"\";\n        }\n    }\n    return data;\n}\n\nfunction parseJsonSafely(str, defaultValue) {\n    if (defaultValue == null) defaultValue = null;\n    try {\n        return JSON.parse(str);\n    } catch (e) {\n        return defaultValue;\n    }\n}\n\n\n//去除图片\nfunction removeAllImgTags(htmlString) {\n    const imgTagRegex = /<img\\b[^>]*>|<\\/img>|<img\\b[^>]*\\/>/gi;\n    return htmlString.replace(imgTagRegex, '');\n}\n\n// 段评气泡生成\nfunction paraForAndroid(content, sources) {\n    let {\n        java,\n        cache,\n        source\n    } = this;\n    const createSvg = this.createSvg.bind(this);\n    const createGod = this.createGod.bind(this);\n     content = content.replace(\n        /<p><img ident=\"([^\"]*)\" src=\"([^\"]*)\"\\s*\\/><\\/p>/g,\n        (match, ident, src) => {\n            return `<p>${createGod(ident, src)}</p>`;\n        }\n    );\n    \n\n    return content.replace(/<p>(.*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\/>)?<\\/p>/g,\n        (match, text, url, count) => {\n            if (url && count) {\n                const click = 0;\n                cache.putMemory(url, click);\n                const encodedUrl = url;\n                return `<p>${text}<img src=\"${createSvg(count, encodedUrl,sources)}\"></p>`;\n            } else {\n                return `<p>${text}</p>`;\n            }\n        }\n    );\n}\n// 创建神评论\nfunction createGod(url,svg) {\n    var jc = 'js';\n    let islyc = this.checkEnv()\n    if (islyc == \"改版\") {\n        jc = 'click'\n    }\n   let cz= `{\"${jc}\":\"showCmt('${url}','段评' )\",\"style\":\"FULL\"}`\n\tlet img = `<img src=\"${svg},${cz}\">`\n\treturn img\n\t}\n\nlet svgs = [\n    \"<svg t='1760002253572' class='icon' viewBox='-150 0 1224 1224' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='1490' width='800' height='800'><g transform='rotate(90 512 512) scale(1 1.2)'><path d='M224 149.333333h576c40.533333 0 74.666667 34.133333 74.666667 74.666667v460.8c0 40.533333-34.133333 74.666667-74.666667 74.666667h-108.8c-40.533333 0-78.933333 17.066667-104.533334 46.933333l-49.066666 55.466667c-4.266667 6.4-14.933333 10.666667-23.466667 10.666667-10.666667 0-19.2-4.266667-25.6-10.666667l-46.933333-55.466667c-25.6-29.866667-64-46.933333-104.533334-46.933333h-110.933333c-40.533333 0-74.666667-34.133333-74.666667-74.666667V224c0-40.533333 34.133333-74.666667 74.666667-74.666667z' fill='$tccolor' p-id='1529'></path><path d='M512 938.666667c-27.733333 0-55.466667-12.8-72.533333-34.133334l-46.933334-55.466666c-14.933333-17.066667-34.133333-25.6-57.6-25.6h-110.933333c-76.8 0-138.666667-61.866667-138.666667-138.666667V224C85.333333 147.2 147.2 85.333333 224 85.333333h573.866667c76.8 0 138.666667 61.866667 138.666666 138.666667v460.8c0 76.8-61.866667 138.666667-138.666666 138.666667h-108.8c-21.333333 0-42.666667 8.533333-55.466667 25.6l-49.066667 55.466666c-17.066667 21.333333-44.8 34.133333-72.533333 34.133334zM224 149.333333C183.466667 149.333333 149.333333 183.466667 149.333333 224v460.8c0 40.533333 34.133333 74.666667 74.666667 74.666667h110.933333c40.533333 0 78.933333 17.066667 104.533334 49.066666l46.933333 55.466667c6.4 6.4 14.933333 10.666667 25.6 10.666667 8.533333 0 19.2-4.266667 23.466667-10.666667l49.066666-55.466667c25.6-29.866667 64-46.933333 104.533334-46.933333h108.8c40.533333 0 74.666667-34.133333 74.666666-74.666667V224C874.666667 183.466667 840.533333 149.333333 800 149.333333h-576z' fill='$color' p-id='1530'></path> </g><text x='460' y='650' font-family='Arial, sans-serif' text-anchor='middle' font-size='400' fill='$fontcolor'>$displayText</text></svg>\",\n\n    \"<svg xmlns='http://www.w3.org/2000/svg' width='100' height='90' viewBox='0 0 25 17' fill='none' style='color: $color; opacity: 1;'><path stroke='currentColor' stroke-width='1.00' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='4.00' style='stroke: $color; stroke-opacity: 0.5; stroke-width: 1px; stroke-linejoin: round; fill: $tccolor; fill-opacity: 0.5;' d='M 7.5 0.5 L 16.5 0.5 A 7 7 0 0 1 23.5 7.5 L 23.5 7.5 A 7 7 0 0 1 16.5 14.5 L 8.5 14.5 L 5.192 16.5 L 5.5 14.5 A 7 7 30 0 1 0.5 7.5 L 0.5 7.5 A 7 7 0 0 1 7.5 0.5 Z'/><text fill='$fontcolor' font-family='Arial, sans-serif' font-size='10' font-weight='500' text-anchor='middle' dy='0.35em' x='12.00' y='7.50'>$displayText</text></svg>\",\n\n    \"<svg xmlns='http://www.w3.org/2000/svg' width='100' height='90' viewBox='0 0 25 17' fill='none' style='color: $color; opacity: 1;'><path d='M24 14.5v-12a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v7.528a2 2 0 0 1-.211.894l-2.065 4.13a1 1 0 0 0 .894 1.448H22a2 2 0 0 0 2-2z' stroke='currentColor' style='stroke: $color; stroke-opacity: 0.5; stroke-width: 1px; stroke-linejoin: round; fill: $tccolor; fill-opacity: 0.5;'></path><text x='13.5' y='12' text-anchor='middle' alignment-baseline='auto' font-size='10' fill='currentColor' font-family='Arial, sans-serif' font-weight='500' style='fill: $fontcolor; opacity: 1;'>$displayText</text></svg>\",\n\n\n\n    \"<svg xmlns='http://www.w3.org/2000/svg' width='100' height='90' viewBox='6 10 88 76' style='color: $color; opacity: 1;'><path d='M12,12 L88,12 Q92,12 92,16 L92,68 Q92,72 88,72 L28,72 L12,84 L12,72 Q8,72 8,68 L8,16 Q8,12 12,12 Z' stroke='currentColor' stroke-width='4' stroke-linejoin='round' style='stroke: $color; stroke-opacity: 0.5; stroke-width: 2.5px; stroke-linejoin: round; fill: $tccolor; fill-opacity: 0.5;'></path><text x='50' y='60' font-family='Arial, sans-serif' text-anchor='middle' font-size='45' fill='currentColor' font-weight='500' alignment-baseline='auto' style='fill: $fontcolor; opacity: 1;'>$displayText</text></svg>\",\n\n\n\n    \"<svg xmlns='http://www.w3.org/2000/svg' width='100' height='90' viewBox='0 0 25 17' fill='none' style='color: $color; opacity: 1;'><rect x='0.5' y='0.5' width='24' height='16' rx='2.5' ry='2.5' stroke='currentColor' style='stroke: $color; stroke-opacity: 0.5; stroke-width: 1px; stroke-linejoin: round; fill: $tccolor; fill-opacity: 0.5;'></rect><text x='12.5' y='12' text-anchor='middle' alignment-baseline='auto' font-size='10' fill='currentColor' font-family='Arial, sans-serif' font-weight='500' style='fill: $fontcolor; opacity: 1;'>$displayText</text></svg>\",\n\n\n\n\n     `<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 216 200'>\n  <path fill='#802622' d='M110 0h14l1 1h8v1h4v1h4v1h4v1h3v1h2l1 1h2l1 1h1l1 1h2v1h2v1h2v1h2v1h1v1h2v1h2v1h1v1h1l1 1h1v1h1v1h2v1h1v1h1l1 1v1h2v1h1v1h1v1l1 1h1v1h1v1h1v1h1v2h1v1h1v1h1v1h1v1h1v2h1v1h1v1l1 1v1h1v2h1v1h1v2h1v1l1 1v1l1 1v1h1v2h1v2h1v2h1v3h1v2h1v3a5 5 0 0 0 1 2h1v1h-1v4h1v4h1v5h1v8h1v18h-1v7h-1v5h-1v2h-1l-1 2v3h-1v2l-1 1v3h-1v2h-1v2h-1v2h-1v2h-1v2h-1v2h-1v1l-1 1v1h-1v2h-1v1l-1 1v1h-1v1h-1v1h-1v2h-1l-1 1v1h-1v1h-1v1h-1v1h-1v1h-1v1h-1v1l-1 1h-1v1h-1l-1 1h-1 1v-1h1v-1h1v-1h1a1 1 0 0 1 0-1 2 2 0 0 1 1-1h1v-2h1v-1h1v-1h1v-1h1v-1l1-1v-1h1v-1h1v-1l1-1h1v-2h1v-1l1-1v-1h1v-1l1-1v-1h1v-2h1v-1l1-1v-2h1v-2h1v-2h1v-2h1v-3h1v-5h1v-4l1-1v-6h1v-11h1v-2h-1v-1h1v-1h-1 1v-2h-1v-7h-1v24h-1v3h-1v1h-1v4h-1v4h-1v3h-1v2h-1v3l-1 1v1h-1v2l-1 1-1 2v1h-1v1h-1v2h-1v2h-1v1h-1v2h-1v1h-1v1h-1v1h-1v2h-1v1h-2v2h-1l-1 1v1h-2v1h-1v1h-1v1h-1v1h-1l-1 1-1 1h-2v1h-1v-1h1v-1h2v-1h1v-1h1v-1h1v-1h1v-1h1v-1l1-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1l1-1v-1h1v-1h1v-2l1-1v-1h1v-1h1v-2l1-1v-1h1v-2l1-1v-1h1l-1-1h1v-2h1v-2l1-1v-3h1v-3l1-1v-3h1v-4l1-1v-10h1V98h-1v-9h-1v-4l-1-1v-4l-1-1v-4h-1v-3h-1a6 6 0 0 0 0-3h-1v-1l-1-1v-2h-1v-2h-1v-1h-1v-2h-1v-1h-1v-1l-1-1v-1h-2v-1 2a2 2 0 0 1-1-1v-2h-1v-1h-1v-2h-1v-1l-1-1-1-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1l-1-1h-1v-1l-1-1h-1v-1h-1v-1h-1v-1h-1v-1h-1l-1-1v-1h-2v-1h-1v-1h-1v-1h-2v-1a1 1 0 0 1-1 0v-1h-2v-1h-1l-1-1h-1v-1h-2v-1h-2v-1h-2v-1h-1v-1h-4v-1h-1v-1h-2l-1-1h-2v-1h-5v-1a1 1 0 0 1-1-1v1h-1v-1 1h-2l-1-1h-3v-1h-23 1-2v1h-1v-1h-2v1h-4v1h-2v2l1-1h4v-1h4v-1h23v1h6v1h4v1h4v1h3v1h3v1h2l1 1h2l1 1 1 1h1v1h1l2 1h2v1h1v1-1 1h2v1h1v1h2v1h1v1h1v1h1v1h1v1h1l1 1h1v1h1v2h1l1 1 1 1v1h1v1h1v1h1v2l1 1v1h1v1h1v1h1v1h1v2l1 1v1h1v2h1v1l1 1v1h1v2l1 1v2h1v2h1v1l1 2v3h1v4l1 1v5h1v9l1 1v6h-1v8h-1v1-16h-1v-2h1v-2h-1v-5h-1v-4h-1v-3l-1-1v-3a2 2 0 0 1-1-1v-2l-1-1v-1h-1v-3h-1v-1h-1v-2l-1-1v3h1v3h1v4h1v3l1 1v3h1v5h1v25h-1v6h-1v4l-1 1v2h-1v2h-1v3h-1v2h-1v2l-1 1v1h-1v2h-1v2h-1v2h-1v1h-1v2l-1 1-1 1v1h-1v1h-1v2h-1l-1 1v1h-1v1h-1v1h-1v1h-1v1l-1 1-1 1h-1v1h-1v1h-1v1h-1l-1 1h-1v1h-1v-1h1v-1h1v-1l1-1h1v-1l2-1v-1h1v-1l1-1v-1h1v-1h1v-1h1v-2h1v-1l1-1v-1h1v-1l1-1v-2h1v-2h1v-1l1-1v-1h1v-3h1v-2h1v-1h1v-2l1-1v-2h1v-3h1v-5h1v-5h1v5-21h-1v-6h-1v-5h-1v-3h-1v-3h-1v-2h-1v-3h-1v-1l-1-1v-2h-1v-1l-1-3h-1v-1h-1a1 1 0 0 1 0-1v-1h-1v-2h-1v-1h-1v-1l-1-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1l-1-1v-1h-2v-1h-1v-1h-1v-1h-1l-1-1h-1v-1h-1v-1h-1l-1-1h-1v-1h-2v-1h-2v-1h-1v-1h-2a2 2 0 0 0-1-1h-1v-1h-2l-1-1h-2v-1h-3v-1h-2l-2-1h-2v-1h-5v-1h-2 3-22v1h-5v1h-4v1h-2l-2 1h-2v1h-2l-1 1h-2v1h-1l-1 1h-1v1h-2v1h-1l-1 1h-1v1h-1l-1 1h-1v1h-1v1h-1l-1 1-1 1-1 1h-1v1h-1v1h-1v1h-1v1h-1v1h-1v2h-1v1h-1v1h-1v1h-1v2h-1v1h-1v1h-1v2h-1v1l-1 1v1h-1v2h-1v2h-1v2h-1v3h-1v3h-1v3l-1 1v3l-1 1v6h-1v12h1v5l1 3v3h1v4h1v3h1v3h1v3h1v2l1 1v1h1v2l1 2v1h1v1l1 1v1h1v1h1v2h1v1h1v2h1v1h1v1h1v1h1v2h1v1h1l1 1h1v1h1v1l1 1h1v1h2v1h1v1h1v1h2v1h2v1h1v1h1v1h2v1h7v1h1v2h1v2h-4l-3-1v1h1a3 3 0 0 1 2 1h1v1-1 1h1v-1h1v2h5v1h1v1h1v1h2v1h-2l1 1v1h-1 1v3h-1v2h-2 1v1h1v1h-1v2h-1 1v3h-1l-1 1h-1v1h-3v1h-2v-1h-1l-1-1h-1v-1 1h-5v1h-4v-1l-1-1h-1v1h-2v-1h-1v-1h-1v2h2v1h2v1h2l1 1h2v1h1v1h2v1h1v1h5v1h1v1h1v1l-1 1h-4v-1h-2v-1h-3v-1h-5v-1h-1v-1h-1v1h-1a1 1 0 0 1 0-1l1-1h1-1v-1h-2a2 2 0 0 0-1-1h-1v-1h-2v-1h-2v-1h-3v-1h-1v-1h-2v-1h-1v-1h-1v-1h-2v-1h-2v-1h-1v-1h-1v-1h-1v-1h-2v-1a2 2 0 0 1-1-1h-1v-1h-1v-1h-1v-1h-1v-1h-1l-1-1v-1h-1v-1h-1v-1h-1a1 1 0 0 1 0-1h-1v-1l-1-1-1-1v-1h-1v-1h-1v-1h-1v-1h-1v-2h-1v-1h-1v-1l-1-1v-1h-1v-2h-1v-1h-1v-2h-1v-1l-1-1v-1h-1v-2h-1v-1h-2v-2a1 1 0 0 1-1 0v-2h-1v-1h-1l-1 1v1h-1v-1h-1l-1-2h1v-5h-1v-4a2 2 0 0 1-1-1v-3H9v-3a2 2 0 0 1-1-1v-2H7v-3H6v-7H5v-1h1v-1h1v-5l-1-2v-7l1-2v-6h1v-1H7h2v1H8v8H7v9h1V91h1v-7h1v-4h1v-1a3 3 0 0 1 0-2h-1v-1h1l1-1-1-1h1v-2h1v-3h1v-6h1v-2h1v-1 1-1h1-1v-1h1v-1h1v-1h-1v-1h1v-1h1-1v-1h1v-2h1v-2h1v-1h-1v2h-1v1h-1v2h-1v-1l1-1v-2h1v-1h1v-1l1-1v-2h1v-1h1v-3h1v-1h2v-1h1v-1h1v-2h1v-1h1v-1h1v-2h1l1-1v-1h1v-1h1v-2h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1l1-1h1v-1h1v-1h1v-1h1v-1h1l1-1h1v-1h1l1-1 1-1v1-1h1V8h2V7h1l1-1h1V5h2V4h1l1-1h2V2h2V1h2V0h1v1h-1l-1 1h-1v1h-2v1h-3v1h-1v1h-2v1h-1v1h-2v1h-2v1h-1v1h-1l-1 1-1 1h-1l-1 1h-1v1h-1v1h-1v1h-1v1h-1v1h-1l-1 1h-1v2h-1l-1 1v1h-2v1h-1v2h-1v1h-1v1h-1v1h-1v1l-1 1v1h-1v1h-1v1l-1 1v1h-1v2h-1v1h-1v2h-1v1h1v1h-1v1l-1 1h-1v1h-1v2l-1 1v2h-1v2h-1v2h-1v2h-1v3h-1v3h-1v3h-1v2l-1 1v3h-1v4H9v6H8v6H7v11-5h1v-3l1-2v-3h1v-4h1v-5l1-1v-3h1v-4h1v-3h1v-3h1v-3l1-2h1v-3h1v-1l1-1v-2h1v-1h1v-2h1v-1h1v-1l1-1v-1l1-1v-1h1v-1h1v-1h1v-1h1v-2h1v-1h1v-1h1v-1h1v-1h1v-2h1v-1h1l1-1h1v-1l1-1 1-1h1v-1h1v-1h1v-1h1v-1h1v-1h2v-1h1v-1h1v-1h2v-1h1l1-1v-1h2v-1h1l1-1h1v-1h2v-1h2v-1h2v-1h1l2-1h1V8h2V7h3V6h3V4h6V3h4V2h4l1-1h7V0h8z'/>\n      <text x=\"115\" y=\"130\" font-family=\"Arial, sans-serif\"  text-anchor=\"middle\" font-size=\"80\" font-weight=\"700\" fill='#802632'>$displayText</text>\n</svg>`\n];\n\n\n// 创建svg\nfunction createSvg(number, encodedUrl, sources) {\n    var displayText = number > 99 ? \"99+\" : number.toString();\n    let data = this.getVariable('段评设置');\n    let svgstyle = data['段评样式'] || \"0\";\n    let color = data['段评边框颜色'] || \"#A7A7A7\";\n    let tccolor = data['段评填充颜色'] || \"transparent\";\n    let fontcolor = data['段评字体颜色'] || \"#A7A7A7\";\n    let zdy = svgs[0];\n    try {\n        zdy = data['自定义段评样式'][svgstyle] || svgs[0];\n    } catch {}\n    const styleMap = {\n        \"0\": svgs[0],\n        \"1\": svgs[1],\n        \"2\": svgs[2],\n        \"3\": svgs[3],\n        \"4\": svgs[4],\n        \"5\": svgs[5],\n    };\n    let svg = styleMap[svgstyle] || zdy;\n    svg = svg.replace('$color', color)\n        .replace('$tccolor', tccolor)\n        .replace('$fontcolor', fontcolor)\n        .replace('$displayText', displayText);\n    var jc = 'js';\n    let islyc = this.checkEnv()\n    if (islyc == \"改版\") {\n        jc = 'click'\n    }\n    let style = data['气泡增大'] == \"true\" ? 'TEXT' : 'text';\n    var encodedSvg = this.java.base64Encode(svg);\n    return `data:image/svg+xml;base64,${encodedSvg},{\"${jc}\":\"showCmt('${encodedUrl}', '${sources}' ,'段评')\",\"style\":\"${style}\"}`;\n}\n\n\n\n\n// 显示弹窗\nfunction showCmt(url, sources,ident) {\n    let {\n        java,\n        cache\n    } = this;\n    if (ident == null) ident = '段评';\n    const currentTime = Date.now();\n    const click = cache.getFromMemory(url);\n    let islyc = this.checkEnv()\n    if (click < 1 && islyc == \"安卓\") {\n        cache.putMemory(url, click + 1);\n        return;\n    } else {\n        if (islyc == \"轻阅读\") {\n            java.startBrowserDp(url, sources + ident);\n        } else if (islyc == \"改版\") {\n            let paradata = new Date().toLocaleDateString();\n            let htmlContent = cache.get(paradata+ident+\"new\");\n            if (!htmlContent || String(htmlContent).indexOf(\"评论\") == -1) {\n                java.longToast(`\\n${paradata} 初始化${ident}页面,请稍等~`);\n                try {\n                    htmlContent = java.ajax(url);\n                } catch {\n\n                }\n\n                cache.put(paradata+ident+\"new\", htmlContent);\n                java.longToast(`\\n${paradata} 初始化${ident}页面成功~`);\n            }\n            java.showBrowser(\n                url,\n                htmlContent,\n                `window.java=java;`,\n                JSON.stringify({\n                    \"expandedCornersRadius\": 20,\n                    \"dismissOnTouchOutside\": true,\n                    \"isDraggable\": true,\n                    \"shouldDimBackground\": true,\n                    \"backgroundDimAmount\": 0.5,\n                    \"hardwareAccelerated\": true,\n                    \"isNestedScrollingEnabled\": true,\n                    \"isGestureInsetBottomIgnored\": true,\n                    \"setFitToContents\": true,\n                    \"isHideable\": true,\n                    \"heightPercentage\": 0.8\n                })\n            );\n        } else {\n            java.startBrowser(url, sources + ident);\n        }\n    }\n}\n\n//源阅段评\nfunction paraForiOS(html, sources) {\n\t   let result = html.replace(\n        /<p><img ident=\"([^\"]*)\" src=\"([^\"]*)\"\\s*\\/><\\/p>/g,\n        (match, ident, src) => {\n            return `<div rs-native>${createGod(ident, src)}</div>`;\n        }\n    );\n    result = result.replace(\n        /<p>(.*?)(?:<comment ident=\"([^\"]*)\" count=\"([^\"]*)\" \\/>)?<\\/p>/g,\n        function(match, text, url, count) {\n            if (url && count) {\n                const encodedUrl = url.replace(/&/g, '&amp;');\n                let displayCount = count;\n                const numCount = Number(count);\n                if (!isNaN(numCount) && numCount > 99) {\n                    displayCount = '99';\n                }\n                return `<div rs-native>${text}<comment count=\"${displayCount}\" onPress=\"java.showReadingBrowser('${encodedUrl}','${sources}段评')\"></div>`;\n            } else {\n                return `<div rs-native>${text}</div>`;\n            }\n        }\n    );\n    return result.replace(/&#34;/g, '\"');\n}\n\n\nfunction endclick(url) {\n    var jc = 'js';\n    let islyc = this.checkEnv()\n    if (islyc == \"改版\") {\n        jc = 'click'\n    }\n   return `\"${jc}\":\"showCmt('${url}','番茄','本章说' )\"`\n}\n\n\n//按钮切换时改变源变量并刷新发现\nfunction show(m, t) {\n    const {\n        java,\n        source\n    } = this;\n    let data = {};\n    try {\n        data = JSON.parse(source.getVariable())\n    } catch {}\n    data[t] = m;\n    if (t == \"发现页类型\") {\n        data[\"发现页来源\"] = '番茄';\n    }\n    source.setVariable(JSON.stringify(data, null, 2));\n    java.refreshExplore();\n}\n\nfunction createFilter(title, chars, defaultVal, paramKey, size, viewName) {\n    if (viewName == undefined) viewName = \"'请选择类型'\";\n    return {\n        title: title,\n        type: \"select\",\n        chars: chars,\n        default: defaultVal,\n        \"viewName\": viewName,\n        action: `show(infoMap['${title}'],'${paramKey}')`,\n        style: {\n            layout_flexGrow: 1,\n            layout_flexBasisPercent: size\n        }\n    };\n}\n\nfunction createLoginFilter(title, chars, defaultVal, paramKey, size, viewName) {\n    const {\n        source,\n        java\n    } = this;\n    if (viewName == undefined) viewName = \"'请选择类型'\";\n    \n    let loginMap = source.getLoginInfoMap();\n    //java.longToast(loginMap);\n    return {\n        name: title,\n        type: \"select\",\n        chars: chars,\n        default: defaultVal,\n        \"viewName\": viewName,\n        action: `show('${loginMap[title]}','${paramKey}')`,\n        style: {\n            layout_flexGrow: 1,\n            layout_flexBasisPercent: size\n        }\n    };\n}\n\nfunction createText(title, action, defaultValue, size, viewName) {\n    return {\n      title: title,\n      type: 'text',\n      default: defaultValue || '',\n      action: action,\n      viewName: viewName || title,\n      style: {\n        layout_flexGrow: 1,\n        layout_flexBasisPercent: size\n      }\n    };\n  }\nfunction createButton(title, action, size) {\n    return {\n      title: title,\n      type: 'button',\n      action: action,\n      style: {\n        layout_flexGrow: 1,\n        layout_flexBasisPercent: size\n      }\n    };\n  }\n\nfunction exploreSearch() {\n  let {java,source} = this;\n  var key = this.getVariable('搜索关键词');\n  var tab = this.getVariable('发现页类型') || '小说';\n  var sources = this.getVariable('发现页来源') || '全部';\n  if (!key) {\n    try { java.toast('请输入搜索关键词'); } catch (e) {}\n    return;\n  }\n  if (['t:', 'x:', 'd:', 'm:', 't：', 'x：', 'd：', 'm：'].some(p => key.startsWith(p))) {\n  tab = '';\n}\nif(key.includes('@')) {\n\tsources=\"\";\n\t} else {\n\t\tsources = `@${sources}`\n\t\t}\n  var tabMap = {\n  \t'小说':'x:',\n  \t'漫画':'m:',\n  \t'听书':'t:',\n  \t'短剧':'d:',\n  \t'':''\n  \t}\n  key = `${tabMap[tab]}${key}${sources}`;\n  try {\n    java.searchBook(key, source);\n  } catch (e1) {\n    try { java.open('search', key); } catch (e2) { try { java.toast('搜索失败'); } catch (e3) {} }\n  }\n  java.refreshExplore();\n}\n\n// 书源更新\nfunction renderVersionPage() {\n    let {\n        java\n    } = this;\n    let hostsbk = this.getVariable('云端配置')['hosts'] || hosts;\n    let yd = '';\n    let html = `\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n  <meta charset=\"UTF-8\" />\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>书源更新</title>\n  <!-- Font Awesome 图标库 -->\n  <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css\" />\n  <style>\n    :root {\n      --primary-gradient: linear-gradient(135deg, #4e6ef2, #6b2dd8);\n      --latest-gradient: linear-gradient(135deg, #8e2de2 0%, #4a00e0 50%, #d4af37 100%);\n      --success-color: #28c76f;\n      --warning-color: #ff9f43;\n      --error-color: #ea5455;\n      --text-main: #1f2937;\n      --text-secondary: #6b7280;\n      --card-bg: #ffffff;\n      --border-color: #e5e7eb;\n      --light-bg: #f9fafb;\n      --shadow: 0 4px 12px rgba(78, 110, 242, 0.1);\n      --shadow-hover: 0 6px 18px rgba(78, 110, 242, 0.2);\n      --glow-shadow: 0 0 25px rgba(142, 45, 226, 0.5), 0 0 50px rgba(212, 175, 55, 0.3);\n      --modal-bg: rgba(31, 41, 55, 0.8);\n      --modal-content-bg: #ffffff;\n    }\n\n    * {\n      box-sizing: border-box;\n      margin: 0;\n      padding: 0;\n      font-family: 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;\n    }\n\n    body {\n      background: linear-gradient(135deg, #eef2ff, #f5f7ff);\n      color: var(--text-main);\n      min-height: 100vh;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      padding: 16px;\n    }\n\n    /* 加载动画 */\n    .loading-wrapper {\n      text-align: center;\n      animation: fadeIn 0.3s ease;\n    }\n\n    .loading-spinner {\n      width: 50px;\n      height: 50px;\n      border: 4px solid rgba(78, 110, 242, 0.3);\n      border-top-color: #4e6ef2;\n      border-radius: 50%;\n      margin: 0 auto 20px;\n      animation: spin 1s linear infinite;\n    }\n\n    .loading-text {\n      color: var(--text-main);\n      font-size: 16px;\n      font-weight: 500;\n    }\n\n    @keyframes spin {\n      to { transform: rotate(360deg); }\n    }\n\n    @keyframes fadeIn {\n      from { opacity: 0; transform: translateY(20px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n\n    @keyframes slideIn {\n      from { opacity: 0; transform: translateY(30px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n\n    @keyframes pulse {\n      0%, 100% { opacity: 1; }\n      50% { opacity: 0.7; }\n    }\n\n    @keyframes gradientAnimation {\n      0% { background-position: 0% 50%; }\n      50% { background-position: 100% 50%; }\n      100% { background-position: 0% 50%; }\n    }\n\n    @keyframes breathe {\n      0%, 100% { \n        transform: scale(1);\n        box-shadow: var(--glow-shadow), var(--shadow);\n      }\n      50% { \n        transform: scale(1.02);\n        box-shadow: 0 0 30px rgba(142, 45, 226, 0.6), 0 0 60px rgba(212, 175, 55, 0.4), var(--shadow);\n      }\n    }\n\n    @keyframes shimmer {\n      0% {\n        background-position: -200% center;\n      }\n      100% {\n        background-position: 200% center;\n      }\n    }\n\n    /* 主容器 */\n    .container {\n      width: 100%;\n      max-width: 420px;\n      background: var(--card-bg);\n      border-radius: 24px;\n      overflow: hidden;\n      box-shadow: var(--shadow);\n      position: relative;\n      z-index: 1;\n      animation: slideIn 0.5s ease;\n      display: none;\n    }\n\n    /* 头部 */\n    .header {\n      background: var(--primary-gradient);\n      color: #ffffff;\n      padding: 24px 16px;\n      text-align: center;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .header::before {\n      content: '';\n      position: absolute;\n      top: -30px;\n      left: -30px;\n      width: 80px;\n      height: 80px;\n      background: rgba(255, 255, 255, 0.15);\n      border-radius: 50%;\n    }\n\n    .header::after {\n      content: '';\n      position: absolute;\n      bottom: -60px;\n      right: -60px;\n      width: 150px;\n      height: 150px;\n      background: rgba(255, 255, 255, 0.1);\n      border-radius: 50%;\n    }\n\n    .header h1 {\n      font-size: 1.4rem;\n      font-weight: 700;\n      margin-bottom: 8px;\n      position: relative;\n      z-index: 2;\n    }\n\n    .header p {\n      font-size: 0.9rem;\n      opacity: 0.9;\n      line-height: 1.4;\n      position: relative;\n      z-index: 2;\n    }\n\n    .header-icon {\n      font-size: 48px;\n      margin-bottom: 10px;\n      display: inline-block;\n      animation: bounce 2s ease infinite;\n    }\n\n    @keyframes bounce {\n      0%, 100% { transform: translateY(0); }\n      50% { transform: translateY(-10px); }\n    }\n\n    /* 版本对比 */\n    .version-comparison {\n      display: flex;\n      flex-wrap: nowrap;\n      gap: 12px;\n      padding: 16px;\n      margin-top: 8px;\n      position: relative;\n      z-index: 10;\n    }\n\n    .version-card {\n      flex: 1;\n      min-width: 45%;\n      background: var(--card-bg);\n      border-radius: 16px;\n      padding: 28px 16px 16px;\n      box-shadow: var(--shadow);\n      text-align: center;\n      position: relative;\n      transition: transform 0.3s ease, box-shadow 0.3s ease;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n    }\n\n    .version-card:hover {\n      transform: translateY(-4px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .version-card.current-version {\n      background: linear-gradient(135deg, #ffffff 0%, #f8f9ff 100%);\n      border: 1px solid rgba(78, 110, 242, 0.15);\n    }\n\n    .version-card.current-version:hover {\n      box-shadow: 0 6px 20px rgba(78, 110, 242, 0.15);\n    }\n\n    .version-card.current-version h3,\n    .version-card.current-version .version-number,\n    .version-card.current-version .version-date {\n      color: var(--text-main);\n    }\n\n    .version-card.latest-version {\n      background: var(--latest-gradient);\n      background-size: 300% 300%;\n      box-shadow: var(--glow-shadow), var(--shadow);\n      color: #fff;\n      z-index: 2;\n      animation: gradientAnimation 6s ease infinite, breathe 3s ease-in-out infinite;\n      position: relative;\n      overflow: hidden;\n    }\n\n    .version-card.latest-version::before {\n      content: '';\n      position: absolute;\n      top: -50%;\n      left: -50%;\n      width: 200%;\n      height: 200%;\n      background: linear-gradient(\n        90deg,\n        transparent,\n        rgba(255, 255, 255, 0.3),\n        transparent\n      );\n      transform: rotate(45deg);\n      animation: shimmer 3s infinite;\n    }\n\n    .version-card.latest-version h3,\n    .version-card.latest-version .version-number,\n    .version-card.latest-version .version-date {\n      color: #fff;\n      text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n      position: relative;\n      z-index: 1;\n    }\n\n    .version-status {\n      position: absolute;\n      top: 6px;\n      right: 6px;\n      padding: 3px 7px;\n      font-size: 0.65rem;\n      font-weight: 600;\n      border-radius: 6px;\n      color: #fff;\n      line-height: 1.2;\n      white-space: nowrap;\n      z-index: 2;\n    }\n\n    .version-card.latest-version .version-status {\n      background: rgba(255, 255, 255, 0.25);\n      backdrop-filter: blur(5px);\n      border: 1px solid rgba(255, 255, 255, 0.3);\n      color: #fff;\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n    }\n\n    .status-outdated { background: var(--warning-color); }\n    .status-latest { background: var(--success-color); }\n    .status-invalid { background: var(--error-color); }\n\n    .version-card h3 {\n      font-size: 0.9rem;\n      color: var(--text-secondary);\n      margin-bottom: 8px;\n      font-weight: 500;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 6px;\n    }\n\n    .version-number {\n      font-size: 1.25rem;\n      font-weight: 700;\n      color: var(--text-main);\n      margin: 8px 0;\n      transition: all 0.3s ease;\n      font-family: 'Courier New', monospace;\n    }\n\n    .version-card.latest-version .version-number {\n      font-size: 1.4rem;\n      transform: scale(1.05);\n      text-shadow: \n        0 2px 4px rgba(0, 0, 0, 0.3),\n        0 0 10px rgba(212, 175, 55, 0.8),\n        0 0 20px rgba(212, 175, 55, 0.5);\n      animation: pulse-glow 2s ease-in-out infinite;\n    }\n\n    @keyframes pulse-glow {\n      0%, 100% {\n        text-shadow: \n          0 2px 4px rgba(0, 0, 0, 0.3),\n          0 0 10px rgba(212, 175, 55, 0.8),\n          0 0 20px rgba(212, 175, 55, 0.5);\n      }\n      50% {\n        text-shadow: \n          0 2px 4px rgba(0, 0, 0, 0.3),\n          0 0 15px rgba(212, 175, 55, 1),\n          0 0 30px rgba(212, 175, 55, 0.7);\n      }\n    }\n\n    .version-date {\n      font-size: 0.8rem;\n      color: var(--text-secondary);\n      margin-top: 4px;\n    }\n\n    /* 版本对比指示器 */\n    .version-indicator {\n      position: absolute;\n      left: 50%;\n      top: 50%;\n      transform: translate(-50%, -50%);\n      z-index: 5;\n      width: 32px;\n      height: 32px;\n      border-radius: 50%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n      color: white;\n    }\n\n    .version-indicator.update-needed {\n      background: var(--error-color);\n      box-shadow: 0 2px 8px rgba(234, 84, 85, 0.4);\n      animation: pulse-indicator 1.5s infinite;\n    }\n\n    .version-indicator.is-latest {\n      background: var(--success-color);\n      box-shadow: 0 2px 8px rgba(40, 199, 111, 0.4);\n    }\n\n    @keyframes pulse-indicator {\n      0% { transform: translate(-50%, -50%) scale(1); }\n      50% { transform: translate(-50%, -50%) scale(1.1); }\n      100% { transform: translate(-50%, -50%) scale(1); }\n    }\n\n    /* 内容区 */\n    .content-container {\n      padding: 16px;\n    }\n\n    /* 状态提示 */\n    .status-alert {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      padding: 12px 16px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 10px;\n      font-weight: 500;\n      font-size: 14px;\n      animation: slideIn 0.5s ease 0.3s backwards;\n    }\n\n    .status-alert i {\n      font-size: 20px;\n    }\n\n    .status-alert.update-available {\n      background: linear-gradient(135deg, #ffeaa7 0%, #fdcb6e 100%);\n      color: #d63031;\n      box-shadow: 0 4px 15px rgba(253, 203, 110, 0.4);\n    }\n\n    .status-alert.up-to-date {\n      background: linear-gradient(135deg, #55efc4 0%, #00b894 100%);\n      color: white;\n      box-shadow: 0 4px 15px rgba(0, 184, 148, 0.4);\n    }\n\n    /* 更新容器 */\n    .update-container {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      overflow: hidden;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      animation: slideIn 0.5s ease 0.4s backwards;\n    }\n\n    .update-header {\n      background: var(--light-bg);\n      padding: 12px 16px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid var(--border-color);\n    }\n\n    .update-header h2 {\n      font-size: 1rem;\n      font-weight: 600;\n      color: var(--text-main);\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .update-header h2 i {\n      color: #4e6ef2;\n    }\n\n    .update-tag {\n      background: rgba(78, 110, 242, 0.1);\n      color: #4e6ef2;\n      padding: 4px 8px;\n      border-radius: 8px;\n      font-size: 0.75rem;\n      font-weight: 600;\n    }\n\n    .update-content {\n      padding: 16px;\n    }\n\n    .update-date {\n      font-weight: 600;\n      color: #4e6ef2;\n      margin-bottom: 12px;\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      padding: 8px 0;\n      border-bottom: 1px dashed #e0e0e0;\n    }\n\n    .update-text {\n      margin: 8px 0;\n      position: relative;\n      padding-left: 16px;\n      line-height: 1.5;\n      color: var(--text-main);\n      font-size: 0.95rem;\n      white-space: pre-wrap;\n      word-break: break-word;\n    }\n\n    .update-text::before {\n      content: '•';\n      position: absolute;\n      left: 0;\n      font-weight: bold;\n      color: #4e6ef2;\n      font-size: 1.2rem;\n      line-height: 1;\n    }\n\n    /* 历史日志 */\n    .history-container {\n      background: var(--card-bg);\n      border-radius: 16px;\n      box-shadow: var(--shadow);\n      margin-bottom: 16px;\n      border: 1px solid rgba(120, 130, 240, 0.1);\n      animation: slideIn 0.5s ease 0.5s backwards;\n    }\n\n    .history-header {\n      background: var(--light-bg);\n      padding: 12px 16px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid var(--border-color);\n      cursor: pointer;\n      user-select: none;\n    }\n\n    .history-header:hover {\n      opacity: 0.8;\n    }\n\n    .history-header h2 {\n      font-size: 1rem;\n      font-weight: 600;\n      color: var(--text-main);\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .history-header h2 i {\n      color: #4e6ef2;\n    }\n\n    .toggle-history {\n      background: none;\n      border: none;\n      color: var(--text-secondary);\n      cursor: pointer;\n      font-weight: 500;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      font-size: 0.85rem;\n      transition: color 0.2s ease;\n    }\n\n    .toggle-history:hover {\n      color: #4e6ef2;\n    }\n\n    .history-content {\n      padding: 0 16px;\n      max-height: 0;\n      overflow: hidden;\n      transition: max-height 0.4s ease, padding 0.4s ease;\n    }\n\n    .history-content.expanded {\n      max-height: 60vh;\n      overflow-y: auto;\n      padding: 16px;\n      scrollbar-width: thin;\n      scrollbar-color: #4e6ef2 #f0f0f0;\n    }\n\n    .history-content.expanded::-webkit-scrollbar {\n      width: 6px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-track {\n      background: #f0f0f0;\n      border-radius: 4px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-thumb {\n      background: #4e6ef2;\n      border-radius: 4px;\n    }\n\n    .history-content.expanded::-webkit-scrollbar-thumb:hover {\n      background: #3a56d0;\n    }\n\n    .history-item {\n      margin-bottom: 16px;\n      padding-bottom: 16px;\n      border-bottom: 1px dashed var(--border-color);\n    }\n\n    .history-item:last-child {\n      border-bottom: none;\n      margin-bottom: 0;\n      padding-bottom: 0;\n    }\n\n    .history-date {\n      font-weight: 600;\n      color: var(--text-main);\n      margin-bottom: 8px;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      font-size: 0.9rem;\n      background: rgba(78, 110, 242, 0.05);\n      padding: 6px 10px;\n      border-radius: 6px;\n    }\n\n    .history-text {\n      margin: 8px 0;\n      padding-left: 16px;\n      line-height: 1.4;\n      color: var(--text-secondary);\n      position: relative;\n      font-size: 0.9rem;\n      white-space: pre-wrap;\n      word-break: break-word;\n    }\n\n    .history-text::before {\n      content: '•';\n      position: absolute;\n      left: 0;\n      color: #4e6ef2;\n      font-weight: bold;\n      font-size: 1.2rem;\n      line-height: 1;\n    }\n\n    /* 按钮组 */\n    .button-group {\n      display: flex;\n      flex-direction: column;\n      gap: 10px;\n      margin-bottom: 16px;\n    }\n\n    .button {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 10px;\n      padding: 14px 28px;\n      text-align: center;\n      font-size: 1rem;\n      border: none;\n      border-radius: 12px;\n      text-decoration: none;\n      background: var(--primary-gradient);\n      color: white;\n      font-weight: 600;\n      transition: all 0.3s ease;\n      box-shadow: var(--shadow);\n      position: relative;\n      overflow: hidden;\n      cursor: pointer;\n    }\n\n    .button i {\n      font-size: 1rem;\n    }\n\n    .button::after {\n      content: '';\n      position: absolute;\n      top: -50%;\n      left: -50%;\n      width: 200%;\n      height: 200%;\n      background: rgba(255, 255, 255, 0.1);\n      transform: rotate(30deg);\n      transition: all 0.6s ease;\n      pointer-events: none;\n    }\n\n    .button:hover {\n      transform: translateY(-3px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .button:hover::after {\n      transform: rotate(30deg) translate(20%, 20%);\n    }\n\n    .button:active {\n      transform: scale(0.95);\n    }\n\n    /* 错误状态 */\n    .error-state {\n      text-align: center;\n      padding: 40px 20px;\n      color: var(--text-main);\n    }\n\n    .error-icon {\n      font-size: 64px;\n      margin-bottom: 20px;\n      color: var(--error-color);\n    }\n\n    .error-text {\n      font-size: 16px;\n      line-height: 1.6;\n      margin-bottom: 20px;\n    }\n\n    .retry-button {\n      background: var(--primary-gradient);\n      color: white;\n      padding: 12px 30px;\n      border-radius: 12px;\n      border: none;\n      font-weight: 600;\n      cursor: pointer;\n      transition: all 0.3s ease;\n      font-size: 14px;\n      box-shadow: var(--shadow);\n    }\n\n    .retry-button:hover {\n      transform: translateY(-2px);\n      box-shadow: var(--shadow-hover);\n    }\n\n    .retry-button:active {\n      transform: scale(0.95);\n    }\n\n    /* 装饰元素 */\n    .decoration {\n      position: absolute;\n      z-index: 0;\n      pointer-events: none;\n    }\n\n    .decoration.circle {\n      width: 120px;\n      height: 120px;\n      border-radius: 50%;\n      background: rgba(107, 45, 216, 0.05);\n      top: 10%;\n      left: 10%;\n    }\n\n    .decoration.square {\n      width: 80px;\n      height: 80px;\n      transform: rotate(45deg);\n      background: rgba(78, 110, 242, 0.05);\n      bottom: 10%;\n      right: 10%;\n    }\n\n    /* 响应式 */\n    @media (max-width: 768px) {\n      body {\n        padding: 12px;\n      }\n\n      .container {\n        max-width: 100%;\n        border-radius: 20px;\n      }\n\n      .header {\n        padding: 20px 15px;\n      }\n\n      .header h1 {\n        font-size: 1.3rem;\n      }\n\n      .header-icon {\n        font-size: 40px;\n      }\n\n      .version-comparison {\n        flex-direction: row;\n        flex-wrap: nowrap;\n        gap: 10px;\n        padding: 12px;\n        margin-top: 6px;\n        overflow-x: auto;\n      }\n\n      .version-card {\n        min-width: 45%;\n        padding: 26px 12px 12px;\n      }\n\n      /* 移动端减弱呼吸动效 */\n      .version-card.latest-version {\n        animation: gradientAnimation 6s ease infinite;\n      }\n\n      .version-status {\n        top: 5px;\n        right: 5px;\n        padding: 2px 5px;\n        font-size: 0.6rem;\n      }\n\n      .version-number {\n        font-size: 1.1rem;\n      }\n\n      .version-card.latest-version .version-number {\n        font-size: 1.2rem;\n      }\n\n      .update-header h2, .history-header h2 {\n        font-size: 0.9rem;\n      }\n\n      .button {\n        padding: 12px 24px;\n        font-size: 0.95rem;\n      }\n\n      .history-content.expanded {\n        max-height: 50vh;\n        -webkit-overflow-scrolling: touch;\n      }\n    }\n\n    @media (max-width: 380px) {\n      .header h1 {\n        font-size: 1.2rem;\n      }\n\n      .version-number {\n        font-size: 1rem;\n      }\n\n      .version-card.latest-version .version-number {\n        font-size: 1.1rem;\n      }\n\n      .button {\n        padding: 11px;\n        font-size: 0.9rem;\n      }\n    }\n  </style>\n</head>\n<body>\n  <div class=\"decoration circle\"></div>\n  <div class=\"decoration square\"></div>\n\n  <div id=\"loading\" class=\"loading-wrapper\">\n    <div class=\"loading-spinner\"></div>\n    <div class=\"loading-text\"><i class=\"fas fa-search\"></i> 正在检查更新...</div>\n  </div>\n\n  <div class=\"container\" id=\"container\">\n    <div class=\"header\">\n      <div class=\"header-icon\"><i class=\"fas fa-book\"></i></div>\n      <h1>光遇书源更新</h1>\n<p>推荐使用阅读Sigma版本<br>正式版可能存在兼容性问题-<a href='https://legado.gyks.cf' style='text-decoration: none; color: #2D9D78; font-weight: 600;'>下载</a></p>\n    </div>\n\n    <div class=\"version-comparison\">\n      <div class=\"version-card current-version\">\n        <div class=\"version-status status-outdated\" id=\"currentStatus\">待检查</div>\n        <h3><i class=\"fas fa-cube\"></i> 当前版本</h3>\n        <div class=\"version-number\" id=\"currentVersion\">-</div>\n        <div class=\"version-date\">您的当前版本</div>\n      </div>\n\n      <div class=\"version-indicator update-needed\" id=\"versionIndicator\" style=\"display: none;\">\n        <i class=\"fas fa-arrow-right\"></i>\n      </div>\n\n      <div class=\"version-card latest-version\">\n        <div class=\"version-status status-latest\" id=\"latestStatus\">最新版本</div>\n        <h3><i class=\"fas fa-star\"></i> 最新版本</h3>\n        <div class=\"version-number\" id=\"latestVersion\">-</div>\n        <div class=\"version-date\">可用最新版本</div>\n      </div>\n    </div>\n\n    <div class=\"content-container\">\n      <div class=\"status-alert\" id=\"statusAlert\" style=\"display: none;\"></div>\n\n      <div id=\"latestLogContainer\" style=\"display: none;\">\n        <div class=\"update-container\">\n          <div class=\"update-header\">\n            <h2><i class=\"fas fa-bolt\"></i> 最新更新</h2>\n            <div class=\"update-tag\">最新发布</div>\n          </div>\n          <div class=\"update-content\">\n            <div class=\"update-date\" id=\"latestLogDate\"></div>\n            <div class=\"update-text\" id=\"latestLogContent\"></div>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"button-group\" id=\"buttonGroup\" style=\"display: none;\"></div>\n\n      <div class=\"history-container\" id=\"logs\" style=\"display: none;\">\n        <div class=\"history-header\" onclick=\"toggleLogs()\">\n          <h2><i class=\"fas fa-history\"></i> 历史更新 <span id=\"historyCount\"></span></h2>\n          <button class=\"toggle-history\" id=\"toggleButton\">\n            <span id=\"toggleText\">展开历史</span>\n            <i class=\"fas fa-chevron-down\" id=\"toggleIcon\"></i>\n          </button>\n        </div>\n        <div class=\"history-content\" id=\"logList\"></div>\n      </div>\n    </div>\n  </div>\n\n  <script>\n  let logsCollapsed = true;\n\n  function toggleLogs() {\n    logsCollapsed = !logsCollapsed;\n    const logList = document.getElementById('logList');\n    const toggleText = document.getElementById('toggleText');\n    const toggleIcon = document.getElementById('toggleIcon');\n    \n    if (logsCollapsed) {\n      logList.classList.remove('expanded');\n      toggleText.textContent = '展开历史';\n      toggleIcon.className = 'fas fa-chevron-down';\n    } else {\n      logList.classList.add('expanded');\n      toggleText.textContent = '收起历史';\n      toggleIcon.className = 'fas fa-chevron-up';\n    }\n  }\n\n  (async function() {\n    const loading = document.getElementById('loading');\n    const container = document.getElementById('container');\n    const currentVersion = document.getElementById('currentVersion');\n    const latestVersion = document.getElementById('latestVersion');\n    const currentStatus = document.getElementById('currentStatus');\n    const latestStatus = document.getElementById('latestStatus');\n    const versionIndicator = document.getElementById('versionIndicator');\n    const statusAlert = document.getElementById('statusAlert');\n    const buttonGroup = document.getElementById('buttonGroup');\n    const latestLogContainer = document.getElementById('latestLogContainer');\n    const latestLogDate = document.getElementById('latestLogDate');\n    const latestLogContent = document.getElementById('latestLogContent');\n    const logsContainer = document.getElementById('logs');\n    const logList = document.getElementById('logList');\n    const historyCount = document.getElementById('historyCount');\n\n    const localVer = '${String(localVersion)}';\n    let hosts = \\`${hostsbk}\\`;\n    hosts = hosts.split(',');\n    \nconst icons = ['box', 'satellite', 'link', 'bolt', 'globe', 'broadcast-tower'];\n\n// 初始化serverConfig\nconst serverConfig = {\n    main: {\n        name: '主线路导入',\n        icon: 'rocket',\n        baseUrl: 'https://sy.gyks.cf',\n        downloadPath: '/download/光遇聚合.json'\n    }\n};\n\nhosts.forEach((host, index) => {\n    const backupNumber = index + 1;\n    const key =\\`备用线路\\${backupNumber}\\`;\n\n    serverConfig[key] = {\n        name: \\`\\${key}导入\\`,\n        icon: icons[index] || 'broadcast-tower',\n        baseUrl: host,\n        downloadPath: '/sy/download/光遇聚合.json'\n    };\n});\n\n    // 版本比较函数\n    function compareVersions(vs) {\n      const normalize = (v) => {\n        return v.split('.').map(n => {\n          const num = parseInt(n, 10);\n          return isNaN(num) ? 0 : num;\n        });\n      };\n\n      const parts1 = normalize(localVer);\n      const parts2 = normalize(vs);\n      const maxLength = Math.max(parts1.length, parts2.length);\n      \n      for (let i = 0; i < maxLength; i++) {\n        const num1 = parts1[i] || 0;\n        const num2 = parts2[i] || 0;\n        if (num1 > num2) return 1;\n        if (num1 < num2) return -1;\n      }\n      return 0;\n    }\n\nasync function fetchVersionData() {\n  const serversToCheck = Object.values(serverConfig);\n  \n  for (const server of serversToCheck) {\n    try {\n      const apiPath = server.baseUrl.includes('sy.gyks.cf') \n        ? '/fils-groups' \n        : '/get_sy_log';\n      \n      const response = await fetch(server.baseUrl + apiPath, { timeout: 2000 });\n      if (response.ok) {\n        return await response.json();\n      }\n    } catch (e) {\n      console.warn(\\`接口失败：\\${server.baseUrl}\\`, e);\n    }\n  }\n  throw new Error('所有更新接口都请求失败');\n}\n\n\n    function showError(message) {\n      loading.innerHTML = \\`\n        <div class=\"error-state\">\n          <div class=\"error-icon\"><i class=\"fas fa-exclamation-triangle\"></i></div>\n          <div class=\"error-text\">\\${message}</div>\n          <button class=\"retry-button\" onclick=\"location.reload()\"><i class=\"fas fa-redo\"></i> 重试</button>\n        </div>\n      \\`;\n    }\n\n    try {\n      const data = await fetchVersionData();\nconst legadoData = (data.data && data.data.find(item => item.key == 'legado_aggregate')) || {};\nconst cloudVersion = String(legadoData.current_version || '');\nconst updateLog = legadoData.update_log || [];\n\n// 显示版本信息\ncurrentVersion.textContent = \\`v\\${localVer}\\`;\nlatestVersion.textContent = \\`v\\${cloudVersion}\\`;\n\n// 处理日志（update_log 是数组格式）\nif (updateLog.length > 0) {\n// 显示最新日志\nconst latestLog = updateLog[0];\nlatestLogDate.innerHTML = \\`<i class=\"fas fa-calendar-alt\"></i> v\\${latestLog.version}\\`;\nlatestLogContent.innerHTML = latestLog.log;\nlatestLogContainer.style.display = 'block';\n\n// 显示历史日志\nif (updateLog.length > 1) {\nconst historyLogs = updateLog.slice(1);\nhistoryCount.textContent = \\`(\\${historyLogs.length}条)\\`;\nlogList.innerHTML = historyLogs.map(item => \\`\n<div class=\"history-item\">\n    <div class=\"history-date\">\n    <i class=\"fas fa-calendar-day\"></i>\n    <span>v\\${item.version}</span>\n    </div>\n    <div class=\"history-text\">\\${item.log}</div>\n</div>\n\\`).join('');\nlogsContainer.style.display = 'block';\n}\n}\n\n// 检查更新状态\nconst compareResult = compareVersions(cloudVersion);\n\n// 显示版本指示器\nversionIndicator.style.display = 'flex';\n\nif (compareResult === -1) {\n// 需要更新\ncurrentStatus.textContent = '待更新';\ncurrentStatus.className = 'version-status status-outdated';\nversionIndicator.className = 'version-indicator update-needed';\nversionIndicator.innerHTML = '<i class=\"fas fa-arrow-right\"></i>';\n\n// 使用统一配置生成下载按钮\nbuttonGroup.innerHTML = Object.values(serverConfig).map(server => {\nconst fullUrl = server.baseUrl + server.downloadPath;\nreturn \\`\n<a href=\"yuedu://booksource/importonline?src=\\${encodeURIComponent(fullUrl)}\" class=\"button\">\n    <i class=\"fas fa-\\${server.icon}\"></i>\n    <span>\\${server.name}</span>\n</a>\n\\`;\n}).join('');\nbuttonGroup.style.display = 'flex';\n} else {\n// 已是最新版本\ncurrentStatus.textContent = '最新';\ncurrentStatus.className = 'version-status status-latest';\nversionIndicator.className = 'version-indicator is-latest';\nversionIndicator.innerHTML = '<i class=\"fas fa-check\"></i>';\n\nstatusAlert.className = 'status-alert up-to-date';\nstatusAlert.innerHTML = '<i class=\"fas fa-check-circle\"></i> <div>您已是最新版本</div>';\nstatusAlert.style.display = 'flex';\n}\n\n      // 显示主容器，隐藏加载\n      loading.style.display = 'none';\n      container.style.display = 'block';\n\n    } catch (err) {\n      console.error('版本检查失败：', err);\n      showError('<i class=\"fas fa-exclamation-circle\"></i> 检查更新失败，请稍后重试<br><small>' + err.message + '</small>');\n    }\n  })();\n  </script>\n</body>\n</html>\n`;\n    java.startBrowser(`data:text/html;base64,${java.base64Encode(html)}`, '光遇书源更新');\n}\n\n\n\n// 线路设置\nfunction getServerSettings() {\n    const {java} = this;\n    let data = this.getVariable('线路');\n    //java.toast(data)\n    let hostsbk = this.getVariable('云端配置')['hosts'] || hosts;\n    \n    let html = `\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no\">\n<title>光遇小说 - 线路设置</title>\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css\">\n<style>\n* {\n  margin: 0;\n  padding: 0;\n  box-sizing: border-box;\n  -webkit-tap-highlight-color: transparent;\n}\n\n:root {\n  --color-primary: #2D9D78;\n  --color-primary-light: #3DB893;\n  --bg-dark: #f5f7fa;\n  --bg-darker: #ffffff;\n  --bg-card: rgba(255, 255, 255, 0.95);\n  --bg-elevated: #f8fafb;\n  --text-primary: #1a1d23;\n  --text-secondary: #6b7280;\n  --border-color: rgba(0, 0, 0, 0.08);\n}\n\n[data-theme=\"dark\"] {\n  --bg-dark: #0A1628;\n  --bg-darker: #050B14;\n  --bg-card: #142235;\n  --bg-elevated: #1A2B42;\n  --text-primary: #FFFFFF;\n  --text-secondary: rgba(255, 255, 255, 0.7);\n  --border-color: rgba(255, 255, 255, 0.1);\n}\n\nhtml, body {\n  width: 100%;\n  min-height: 100vh;\n  font-family: -apple-system, BlinkMacSystemFont, sans-serif;\n  font-size: 16px;\n  color: var(--text-primary);\n  background: var(--bg-darker);\n  overflow-x: hidden;\n}\n\n.container {\n  padding: 16px;\n  max-width: 600px;\n  margin: 0 auto;\n}\n\n.main-card {\n  background: var(--bg-card);\n  border-radius: 20px;\n  box-shadow: 0 4px 24px rgba(0, 0, 0, 0.1);\n  border: 1px solid var(--border-color);\n  overflow: hidden;\n}\n\n.header {\n  padding: 20px 16px;\n  background: linear-gradient(135deg, var(--color-primary), var(--color-primary-light));\n  text-align: center;\n}\n\n.header-title {\n  font-size: 18px;\n  font-weight: 700;\n  color: white;\n  margin-bottom: 4px;\n}\n\n.header-desc {\n  font-size: 12px;\n  color: rgba(255, 255, 255, 0.8);\n}\n\n.last-check {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  font-size: 12px;\n  color: var(--text-secondary);\n  padding: 12px 16px;\n  border-bottom: 1px solid var(--border-color);\n}\n\n.last-check i {\n  color: var(--color-primary);\n}\n\n.server-list {\n  padding: 8px;\n}\n\n.server-card {\n  background: var(--bg-elevated);\n  border-radius: 12px;\n  padding: 14px 16px;\n  margin-bottom: 8px;\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  cursor: pointer;\n  transition: all 0.2s ease;\n  border: 2px solid transparent;\n}\n\n.server-card:hover {\n  border-color: var(--color-primary);\n  background: rgba(45, 157, 120, 0.05);\n}\n\n.server-card.selected {\n  border-color: var(--color-primary);\n  background: rgba(45, 157, 120, 0.1);\n}\n\n.server-icon {\n  width: 36px;\n  height: 36px;\n  border-radius: 10px;\n  background: linear-gradient(135deg, rgba(45, 157, 120, 0.15), rgba(61, 184, 147, 0.1));\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  font-size: 16px;\n  color: var(--color-primary);\n  flex-shrink: 0;\n}\n\n.server-card.selected .server-icon {\n  background: linear-gradient(135deg, var(--color-primary), var(--color-primary-light));\n  color: white;\n}\n\n.server-info {\n  flex: 1;\n  min-width: 0;\n}\n\n.server-url {\n  font-size: 14px;\n  font-weight: 700;\n  color: var(--text-primary);\n  word-break: break-all;\n  line-height: 1.4;\n}\n\n.server-details {\n  font-size: 11px;\n  color: var(--text-secondary);\n  margin-top: 2px;\n}\n\n.server-status {\n  padding: 4px 12px;\n  border-radius: 16px;\n  font-size: 11px;\n  font-weight: 700;\n  white-space: nowrap;\n  flex-shrink: 0;\n}\n\n.server-status.checking {\n  background: rgba(255, 193, 7, 0.2);\n  color: #f57f17;\n}\n\n.server-status.online {\n  background: rgba(76, 175, 80, 0.2);\n  color: #2e7d32;\n}\n\n.server-status.slow {\n  background: rgba(255, 193, 7, 0.2);\n  color: #f57f17;\n}\n\n.server-status.offline {\n  background: rgba(244, 67, 54, 0.2);\n  color: #c62828;\n}\n\n.server-status.not-support {\n  background: rgba(156, 163, 175, 0.2);\n  color: #6b7280;\n}\n\n.selected-badge {\n  width: 20px;\n  height: 20px;\n  border-radius: 50%;\n  background: var(--color-primary);\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex-shrink: 0;\n}\n\n.selected-badge i {\n  color: white;\n  font-size: 12px;\n}\n\n.footer {\n  padding: 16px;\n  border-top: 1px solid var(--border-color);\n  text-align: center;\n}\n\n.footer-text {\n  font-size: 12px;\n  color: var(--text-secondary);\n  line-height: 1.5;\n}\n\n.footer-text .highlight {\n  color: var(--color-primary);\n  font-weight: 700;\n}\n\n/* 自动切换开关样式 */\n.auto-switch-section {\n  padding: 14px 16px;\n  border-bottom: 1px solid var(--border-color);\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  background: var(--bg-elevated);\n}\n\n.auto-switch-section:hover {\n  background: rgba(45, 157, 120, 0.05);\n}\n\n.auto-switch-info {\n  flex: 1;\n  min-width: 0;\n}\n\n.auto-switch-title {\n  font-size: 14px;\n  font-weight: 600;\n  color: var(--text-primary);\n  display: flex;\n  align-items: center;\n  gap: 8px;\n}\n\n.auto-switch-title i {\n  color: var(--color-primary);\n  font-size: 14px;\n}\n\n.auto-switch-desc {\n  font-size: 11px;\n  color: var(--text-secondary);\n  margin-top: 3px;\n  line-height: 1.4;\n}\n\n/* 开关基础样式 */\n.switch {\n  position: relative;\n  display: inline-block;\n  width: 48px;\n  height: 28px;\n  flex-shrink: 0;\n}\n\n.switch input {\n  opacity: 0;\n  width: 0;\n  height: 0;\n}\n\n.switch-slider {\n  position: absolute;\n  cursor: pointer;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background-color: #d1d5db;\n  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n  border-radius: 28px;\n  box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n.switch-slider:before {\n  position: absolute;\n  content: \"\";\n  height: 22px;\n  width: 22px;\n  left: 3px;\n  bottom: 3px;\n  background-color: white;\n  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n  border-radius: 50%;\n  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n.switch input:checked + .switch-slider {\n  background: linear-gradient(135deg, var(--color-primary), var(--color-primary-light));\n  box-shadow: 0 2px 8px rgba(45, 157, 120, 0.3);\n}\n\n.switch input:checked + .switch-slider:before {\n  transform: translateX(20px);\n  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n}\n\n/* 开关焦点状态 */\n.switch input:focus + .switch-slider {\n  outline: 2px solid var(--color-primary);\n  outline-offset: 2px;\n}\n\n/* 下拉框样式 */\n.timeout-select {\n  padding: 6px 12px;\n  font-size: 13px;\n  font-weight: 600;\n  color: var(--text-primary);\n  background: var(--bg-card);\n  border: 2px solid var(--border-color);\n  border-radius: 10px;\n  cursor: pointer;\n  min-width: 70px;\n  appearance: none;\n  background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%236b7280' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");\n  background-repeat: no-repeat;\n  background-position: right 8px center;\n  background-size: 14px;\n}\n\n.timeout-select:focus {\n  outline: none;\n  border-color: var(--color-primary);\n}\n\n.timeout-select option {\n  background: var(--bg-darker);\n  color: var(--text-primary);\n}\n\n.hidden-settings {\n  display: none;\n}/* 提示文案样式 */\n.tip-alert {\n  background: linear-gradient(135deg, rgba(255, 193, 7, 0.12) 0%, rgba(255, 152, 0, 0.08) 100%);\n  border: 1px solid rgba(255, 193, 7, 0.25);\n  border-radius: 16px;\n  padding: 16px 18px;\n  margin: 20px;\n  display: flex;\n  align-items: flex-start;\n  gap: 14px;\n  box-shadow: 0 4px 16px rgba(255, 193, 7, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.8);\n  position: relative;\n  overflow: hidden;\n}\n\n.tip-alert::before {\n  content: '';\n  position: absolute;\n  top: -50%;\n  right: -20%;\n  width: 100px;\n  height: 100px;\n  background: rgba(255, 193, 7, 0.1);\n  border-radius: 50%;\n}\n\n.tip-alert i {\n  color: #f97316;\n  font-size: 22px;\n  flex-shrink: 0;\n  margin-top: 2px;\n  position: relative;\n  z-index: 1;\n}\n\n.tip-alert p {\n  font-size: 13px;\n  color: var(--text-secondary);\n  line-height: 1.6;\n  margin: 0;\n  position: relative;\n  z-index: 1;\n}\n\n.tip-alert .highlight-text {\n  color: #ea580c;\n  font-weight: 700;\n}\n\n@media (max-width: 600px) {\n  .tip-alert {\n    margin: 16px;\n    padding: 14px 16px;\n  }\n}\n</style>\n</head>\n<body data-theme=\"light\">\n<div class=\"container\">\n  <div class=\"main-card\">\n    <div class=\"header\">\n      <div class=\"header-title\">\n        <i class=\"fas fa-server\"></i>\n        <span style=\"margin-left: 8px;\">线路选择</span>\n      </div>\n      <div class=\"header-desc\">选择最快的服务器线路以获得最佳体验</div>\n    </div>\n    \n    <!-- 提示文案 -->\n    <div class=\"tip-alert\">\n      <p>设置完成后请点击右上角的<span class=\"highlight-text\">√</span>应用设置</p>\n    </div>\n    \n    <div class=\"footer\">\n      <div class=\"footer-text\">\n        当前选中: <span class=\"highlight\" id=\"currentServer\">--</span>\n      </div>\n    </div>\n    \n    <div class=\"last-check\">\n      <i class=\"fas fa-clock\"></i>\n      <span id=\"lastCheckTime\">最后检测: --:--:--</span>\n      <button id=\"refreshBtn\" style=\"margin-left: auto; padding: 4px 10px; font-size: 11px; font-weight: 600; color: var(--color-primary); background: rgba(45, 157, 120, 0.1); border: 1px solid var(--color-primary); border-radius: 6px; cursor: pointer;\">\n        <i class=\"fas fa-sync-alt\"></i>\n        刷新\n      </button>\n    </div>\n    \n    <div class=\"auto-switch-section\">\n      <div class=\"auto-switch-info\">\n        <div class=\"auto-switch-title\"><i class=\"fas fa-refresh\"></i>失败自动切换</div>\n        <div class=\"auto-switch-desc\">当前线路失败时自动尝试切换到其他可用线路</div>\n      </div>\n      <label class=\"switch\">\n        <input type=\"checkbox\" id=\"autoSwitchToggle\">\n        <span class=\"switch-slider\"></span>\n      </label>\n    </div>\n    \n    <div class=\"auto-switch-section\">\n      <div class=\"auto-switch-info\">\n        <div class=\"auto-switch-title\"><i class=\"fas fa-clock\"></i>超时自动切换</div>\n        <div class=\"auto-switch-desc\">请求超时后自动切换到其他可用线路</div>\n      </div>\n      <div style=\"display: flex; align-items: center; gap: 12px;\">\n        <label class=\"switch\">\n          <input type=\"checkbox\" id=\"timeoutSwitchToggle\">\n          <span class=\"switch-slider\"></span>\n        </label>\n        <select id=\"timeoutSelect\" class=\"timeout-select\">\n          <option value=\"1\">1秒</option>\n          <option value=\"2\">2秒</option>\n          <option value=\"3\">3秒</option>\n          <option value=\"4\">4秒</option>\n          <option value=\"5\">5秒</option>\n          <option value=\"6\">6秒</option>\n          <option value=\"7\">7秒</option>\n          <option value=\"8\">8秒</option>\n          <option value=\"9\">9秒</option>\n          <option value=\"10\" selected>10秒</option>\n           <option value=\"11\">11秒</option>\n          <option value=\"12\">12秒</option>\n          <option value=\"13\">13秒</option>\n          <option value=\"14\">14秒</option>\n          <option value=\"15\">15秒</option>\n        </select>\n      </div>\n    </div>\n    \n    <div class=\"auto-switch-section\">\n      <div class=\"auto-switch-info\">\n        <div class=\"auto-switch-title\"><i class=\"fas fa-bell\"></i>切换提醒弹窗</div>\n        <div class=\"auto-switch-desc\">线路切换时显示提醒弹窗通知</div>\n      </div>\n      <label class=\"switch\">\n        <input type=\"checkbox\" id=\"notifySwitchToggle\">\n        <span class=\"switch-slider\"></span>\n      </label>\n    </div>\n    \n    <div id=\"serverList\" class=\"server-list\"></div>\n    \n    <div class=\"hidden-settings\">\n      <span id=\"serverValue\">${data || hostsbk[0]}</span>\n      <span id=\"autoSwitchValue\">${this.getVariable('自动切换') || 'true'}</span>\n      <span id=\"timeoutSwitchValue\">${this.getVariable('超时自动切换') || 'true'}</span>\n      <span id=\"timeoutValue\">${this.getVariable('超时时间') || '10'}</span>\n      <span id=\"notifySwitchValue\">${this.getVariable('切换提醒') || 'false'}</span>\n    </div>\n  </div>\n</div>\n\n<script>\nconst HOSTS = ${JSON.stringify(hostsbk)};\nlet currentServer = '${data || hostsbk[0]}';\n\nfunction renderServerList() {\n  const serverList = document.getElementById('serverList');\n  serverList.innerHTML = '';\n  \n  HOSTS.forEach((host, index) => {\n    const card = document.createElement('div');\n    card.className = 'server-card' + (currentServer === host ? ' selected' : '');\n    card.dataset.host = host;\n    card.dataset.index = index;\n    \n    card.innerHTML = \\`\n      <div class=\"server-icon\">\n        <i class=\"fas fa-server\"></i>\n      </div>\n      <div class=\"server-info\">\n        <div class=\"server-url\">\\${host}</div>\n        <div class=\"server-details\" id=\"details-\\${index}\">状态: 检测中</div>\n      </div>\n      <span class=\"server-status checking\" id=\"status-\\${index}\">\n        <i class=\"fas fa-spinner fa-spin\"></i>\n        <span>检测中</span>\n      </span>\n      \\${currentServer === host ? '<div class=\"selected-badge\"><i class=\"fas fa-check\"></i></div>' : ''}\n    \\`;\n    \n    card.addEventListener('click', () => {\n      selectServer(host);\n    });\n    \n    serverList.appendChild(card);\n  });\n}\n\nfunction selectServer(host) {\n  currentServer = host;\n  \n  document.querySelectorAll('.server-card').forEach(card => {\n    card.classList.remove('selected');\n    const badge = card.querySelector('.selected-badge');\n    if (badge) badge.remove();\n  });\n  \n  const selectedCard = document.querySelector(\\`[data-host=\"\\${host}\"]\\`);\n  if (selectedCard) {\n    selectedCard.classList.add('selected');\n    const icon = selectedCard.querySelector('.server-icon');\n    icon.style.background = 'linear-gradient(135deg, var(--color-primary), var(--color-primary-light))';\n    icon.style.color = 'white';\n    \n    const statusEl = selectedCard.querySelector('.server-status');\n    const newBadge = document.createElement('div');\n    newBadge.className = 'selected-badge';\n    newBadge.innerHTML = '<i class=\"fas fa-check\"></i>';\n    selectedCard.appendChild(newBadge);\n  }\n  \n  document.getElementById('currentServer').textContent = host;\n  document.getElementById('serverValue').textContent = host;\n}\n\nasync function checkSingleServer(host, index) {\n  const currentProtocol = window.location.protocol;\n  const statusEl = document.getElementById(\\`status-\\${index}\\`);\n  const detailsEl = document.getElementById(\\`details-\\${index}\\`);\n  \n  try {\n    const serverProtocol = new URL(host).protocol;\n    if (currentProtocol === 'https:' && serverProtocol === 'http:') {\n      statusEl.className = 'server-status not-support';\n      statusEl.innerHTML = '<i class=\"fas fa-exclamation-triangle\"></i><span>不支持</span>';\n      detailsEl.textContent = '浏览器安全策略限制';\n      return;\n    }\n    \n    const startTime = performance.now();\n    const controller = new AbortController();\n    const timeout = setTimeout(() => controller.abort(), 5000);\n    \n    const response = await fetch(\\`\\${host}/health?t=\\${Date.now()}\\`, {\n      signal: controller.signal,\n      method: 'GET',\n      mode: 'cors',\n      cache: 'no-cache'\n    });\n    \n    clearTimeout(timeout);\n    const responseTime = Math.round(performance.now() - startTime);\n    \n    if (response.ok) {\n      if (responseTime < 1000) {\n        statusEl.className = 'server-status online';\n        statusEl.innerHTML = \\`<i class=\"fas fa-check-circle\"></i><span>\\${responseTime}ms</span>\\`;\n      } else if (responseTime < 2000) {\n        statusEl.className = 'server-status slow';\n        statusEl.innerHTML = \\`<i class=\"fas fa-exclamation-circle\"></i><span>\\${responseTime}ms</span>\\`;\n      } else {\n        statusEl.className = 'server-status slow';\n        statusEl.innerHTML = '<i class=\"fas fa-exclamation-circle\"></i><span>缓慢</span>';\n      }\n      detailsEl.textContent = '运行正常';\n    } else {\n      statusEl.className = 'server-status offline';\n      statusEl.innerHTML = '<i class=\"fas fa-times-circle\"></i><span>异常</span>';\n      detailsEl.textContent = 'HTTP状态码: ' + response.status;\n    }\n  } catch (error) {\n    statusEl.className = 'server-status offline';\n    statusEl.innerHTML = '<i class=\"fas fa-times-circle\"></i><span>离线</span>';\n    detailsEl.textContent = '连接失败';\n  }\n}\n\nasync function checkServers() {\n  HOSTS.forEach((_, index) => {\n    const statusEl = document.getElementById(\\`status-\\${index}\\`);\n    const detailsEl = document.getElementById(\\`details-\\${index}\\`);\n    if (statusEl && detailsEl) {\n      statusEl.className = 'server-status checking';\n      statusEl.innerHTML = '<i class=\"fas fa-spinner fa-spin\"></i><span>检测中</span>';\n      detailsEl.textContent = '状态: 检测中';\n    }\n  });\n  \n  const promises = HOSTS.map((host, index) => checkSingleServer(host, index));\n  await Promise.all(promises);\n  \n  const now = new Date();\n  document.getElementById('lastCheckTime').textContent = \\`最后检测: \\${now.toLocaleTimeString()}\\`;\n}\n\ndocument.getElementById('refreshBtn').addEventListener('click', checkServers);\n\ndocument.addEventListener('DOMContentLoaded', () => {\n  renderServerList();\n  document.getElementById('currentServer').textContent = currentServer;\n  checkServers();\n  \n  // 初始化自动切换开关\n  const autoSwitchToggle = document.getElementById('autoSwitchToggle');\n  const autoSwitchValue = document.getElementById('autoSwitchValue').textContent;\n  autoSwitchToggle.checked = autoSwitchValue !== 'false';\n  \n  // 监听开关变化\n  autoSwitchToggle.addEventListener('change', (e) => {\n    document.getElementById('autoSwitchValue').textContent = e.target.checked ? 'true' : 'false';\n  });\n  \n  // 初始化超时自动切换开关\n  const timeoutSwitchToggle = document.getElementById('timeoutSwitchToggle');\n  const timeoutSwitchValue = document.getElementById('timeoutSwitchValue').textContent;\n  timeoutSwitchToggle.checked = timeoutSwitchValue !== 'false';\n  \n  // 监听超时自动切换开关变化\n  timeoutSwitchToggle.addEventListener('change', (e) => {\n    document.getElementById('timeoutSwitchValue').textContent = e.target.checked ? 'true' : 'false';\n  });\n  \n  // 初始化超时时间下拉框\n  const timeoutSelect = document.getElementById('timeoutSelect');\n  const timeoutValue = document.getElementById('timeoutValue').textContent;\n  timeoutSelect.value = timeoutValue;\n  \n  // 监听超时时间变化\n  timeoutSelect.addEventListener('change', (e) => {\n    document.getElementById('timeoutValue').textContent = e.target.value;\n  });\n  \n  // 初始化切换提醒弹窗开关\n  const notifySwitchToggle = document.getElementById('notifySwitchToggle');\n  const notifySwitchValue = document.getElementById('notifySwitchValue').textContent;\n  notifySwitchToggle.checked = notifySwitchValue !== 'false';\n  \n  // 监听切换提醒弹窗开关变化\n  notifySwitchToggle.addEventListener('change', (e) => {\n    document.getElementById('notifySwitchValue').textContent = e.target.checked ? 'true' : 'false';\n  });\n});\n</script>\n</body>\n</html>\n    `;\n    let body;\n    try {\n        body = java.startBrowserAwait(`data:text/html;base64,${java.base64Encode(html)}`, '光遇服务器设置', false).body();\n    } catch (e) {\n        let islyc = this.checkEnv()\n        if (islyc == \"安卓\") {\n            this.switchToNextLine();\n        } else {\n            java.longToast(\"\\n请点击页面右上角√才能设置成功哦~\");\n        }\n        return;\n    }\n    \n    let host = hostsbk[0];\n    let autoSwitch = 'true';\n    let timeoutSwitch = 'true';\n    let timeout = '10';\n    let notifySwitch = 'false';\n    try {\n        const getSpanText = (spanId) => {\n            const regex = new RegExp('id=\"' + spanId + '\"\\s*>\\s*([^<]*?)\\s*<\\/span>');\n            const match = body.match(regex);\n            return match ? match[1].trim() : \"\";\n        };\n        host = getSpanText('serverValue') || hostsbk[0];\n        autoSwitch = getSpanText('autoSwitchValue') || 'true';\n        timeoutSwitch = getSpanText('timeoutSwitchValue') || 'true';\n        timeout = getSpanText('timeoutValue') || '10';\n        notifySwitch = getSpanText('notifySwitchValue') || 'false';\n    } catch (e) {\n        host = hostsbk[0];\n        autoSwitch = 'true';\n        timeoutSwitch = 'true';\n        timeout = '10';\n        notifySwitch = 'true';\n    }\n    const settingsText = `线路: ${host}\\n失败自动切换: ${autoSwitch == 'true' ? '开启' : '关闭'}\\n超时自动切换: ${timeoutSwitch == 'true' ? '开启' : '关闭'}\\n超时时间: ${timeout}秒\\n切换提醒弹窗: ${notifySwitch == 'true' ? '开启' : '关闭'}`;\n    java.longToast(\"\\n\" + settingsText);\n    this.setVariable(\"线路\", host, false);\n    this.setVariable(\"自动切换\", autoSwitch, false);\n    this.setVariable(\"超时自动切换\", timeoutSwitch, false);\n    this.setVariable(\"超时时间\", timeout, false);\n    this.setVariable(\"切换提醒\", notifySwitch, false);\n}\n\n\n// 更多设置\nfunction getHtmlSettings() {\n    const {\n        java\n    } = this;\n    let data = this.getVariable('更多设置');\n    let config = this.getVariable('云端配置');\n    if (!config) {\n        try {\n            this.getCloudSettings();\n            config = this.getVariable('云端配置');\n        } catch {}\n    }\n    let html = `\n    <!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no\">\n<title>光遇小说 - 管理中心</title>\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css\">\n<style>\n* {\n  margin: 0;\n  padding: 0;\n  box-sizing: border-box;\n  -webkit-tap-highlight-color: transparent;\n}\n\n:root {\n  --color-primary: #2D9D78;\n  --color-primary-light: #3DB893;\n  --color-primary-dark: #1E6F55;\n  --color-accent: #FFB74D;\n  --color-success: #4CAF50;\n  --color-error: #F44336;\n  --color-warning: #FFC107;\n  --color-info: #2196F3;\n  \n  --bg-dark: #f0f3f8;\n  --bg-darker: #e8edf5;\n  --bg-card: rgba(255, 255, 255, 0.98);\n  --bg-elevated: #fafbfc;\n  \n  --text-primary: #1a1d23;\n  --text-secondary: #6b7280;\n  --text-tertiary: #9ca3af;\n  \n  --border-color: rgba(0, 0, 0, 0.06);\n}\n\n[data-theme=\"dark\"] {\n  --bg-dark: #0A1628;\n  --bg-darker: #050B14;\n  --bg-card: #142235;\n  --bg-elevated: #1A2B42;\n  \n  --text-primary: #FFFFFF;\n  --text-secondary: rgba(255, 255, 255, 0.7);\n  --text-tertiary: rgba(255, 255, 255, 0.5);\n  \n  --border-color: rgba(255, 255, 255, 0.08);\n}\n\nhtml, body {\n  width: 100%;\n  min-height: 100vh;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n  font-size: 16px;\n  color: var(--text-primary);\n  background: linear-gradient(135deg, var(--bg-darker) 0%, var(--bg-dark) 100%);\n  background-attachment: fixed;\n  overflow-x: hidden;\n  transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.container {\n  padding: 24px 20px;\n  max-width: 820px;\n  margin: 0 auto;\n  animation: fadeIn 0.5s ease-out;\n}\n\n@keyframes fadeIn {\n  from { opacity: 0; transform: translateY(10px); }\n  to { opacity: 1; transform: translateY(0); }\n}\n\n.main-card {\n  background: var(--bg-card);\n  border-radius: 24px;\n  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.08), 0 2px 8px rgba(0, 0, 0, 0.04), inset 0 1px 0 rgba(255, 255, 255, 0.8);\n  border: 1px solid var(--border-color);\n  overflow: hidden;\n  backdrop-filter: blur(20px);\n}\n\n/* 主Tab切换 */\n.main-tabs {\n  display: flex;\n  background: linear-gradient(180deg, var(--bg-elevated) 0%, rgba(255, 255, 255, 0.5) 100%);\n  border-bottom: 1px solid var(--border-color);\n  position: relative;\n}\n\n.main-tabs::after {\n  content: '';\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  height: 1px;\n  background: linear-gradient(90deg, transparent, var(--border-color), transparent);\n}\n\n.main-tab {\n  flex: 1;\n  padding: 20px 24px;\n  text-align: center;\n  font-size: 15px;\n  font-weight: 700;\n  color: var(--text-secondary);\n  cursor: pointer;\n  transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n  border-bottom: 3px solid transparent;\n  position: relative;\n  overflow: hidden;\n}\n\n.main-tab::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 50%;\n  transform: translateX(-50%) scaleX(0);\n  width: 60%;\n  height: 3px;\n  background: linear-gradient(90deg, var(--color-primary), var(--color-primary-light));\n  transition: transform 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n  border-radius: 0 0 3px 3px;\n}\n\n.main-tab.active {\n  color: var(--color-primary);\n  background: linear-gradient(180deg, rgba(45, 157, 120, 0.06) 0%, transparent 100%);\n}\n\n.main-tab.active::before {\n  transform: translateX(-50%) scaleX(1);\n}\n\n.main-tab:hover {\n  color: var(--color-primary);\n  background: rgba(45, 157, 120, 0.04);\n}\n\n.tab-content {\n  padding: 20px;\n  display: none;\n  animation: slideIn 0.3s ease-out;\n}\n\n.tab-content.active {\n  display: block;\n}\n\n@keyframes slideIn {\n  from { opacity: 0; transform: translateY(8px); }\n  to { opacity: 1; transform: translateY(0); }\n}\n\n/* 来源选择子Tab */\n.source-subtabs {\n  display: grid;\n  grid-template-columns: repeat(4, 1fr);\n  gap: 10px;\n  margin-bottom: 20px;\n}\n\n.source-subtab {\n  padding: 14px 10px;\n  text-align: center;\n  font-size: 12px;\n  font-weight: 600;\n  color: var(--text-secondary);\n  background: var(--bg-elevated);\n  border-radius: 14px;\n  cursor: pointer;\n  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n  border: 2px solid transparent;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  gap: 6px;\n}\n\n.source-subtab i {\n  font-size: 18px;\n  transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.source-subtab.novel.active {\n  color: white;\n  background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);\n  border-color: rgba(239, 68, 68, 0.5);\n  box-shadow: 0 8px 24px rgba(239, 68, 68, 0.35);\n  transform: translateY(-2px);\n}\n\n.source-subtab.audio.active {\n  color: white;\n  background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%);\n  border-color: rgba(59, 130, 246, 0.5);\n  box-shadow: 0 8px 24px rgba(59, 130, 246, 0.35);\n  transform: translateY(-2px);\n}\n\n.source-subtab.comic.active {\n  color: white;\n  background: linear-gradient(135deg, #a855f7 0%, #9333ea 100%);\n  border-color: rgba(168, 85, 247, 0.5);\n  box-shadow: 0 8px 24px rgba(168, 85, 247, 0.35);\n  transform: translateY(-2px);\n}\n\n.source-subtab.drama.active {\n  color: white;\n  background: linear-gradient(135deg, #f97316 0%, #ea580c 100%);\n  border-color: rgba(249, 115, 22, 0.5);\n  box-shadow: 0 8px 24px rgba(249, 115, 22, 0.35);\n  transform: translateY(-2px);\n}\n\n.source-subtab:hover:not(.active) {\n  border-color: var(--color-primary);\n  background: rgba(45, 157, 120, 0.06);\n  transform: translateY(-1px);\n}\n\n.source-subtab.active i {\n  transform: scale(1.1);\n}\n\n/* 来源选项 */\n.source-options {\n  display: grid;\n  grid-template-columns: repeat(auto-fill, minmax(125px, 1fr));\n  gap: 12px;\n}\n\n.source-option {\n  padding: 14px 16px;\n  background: var(--bg-elevated);\n  border-radius: 12px;\n  text-align: center;\n  font-size: 13px;\n  font-weight: 600;\n  color: var(--text-secondary);\n  cursor: pointer;\n  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n  border: 2px solid transparent;\n}\n\n.source-option:hover {\n  border-color: var(--color-primary);\n  background: rgba(45, 157, 120, 0.05);\n  transform: translateY(-2px);\n}\n\n.source-option.selected {\n  background: linear-gradient(135deg, rgba(45, 157, 120, 0.18), rgba(61, 184, 147, 0.08));\n  color: var(--color-primary);\n  border-color: var(--color-primary);\n  box-shadow: 0 4px 16px rgba(45, 157, 120, 0.2);\n  transform: translateY(-2px);\n}\n\n.source-option.all {\n  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n  color: white;\n  box-shadow: 0 4px 16px rgba(102, 126, 234, 0.3);\n}\n\n.source-option.all.selected {\n  background: linear-gradient(135deg, #764ba2 0%, #667eea 100%);\n  box-shadow: 0 6px 24px rgba(102, 126, 234, 0.45);\n  transform: translateY(-3px);\n}\n\n.source-option.all:hover {\n  border-color: transparent;\n  transform: translateY(-3px);\n}\n\n/* 选中状态提示 */\n.selected-info {\n  margin-top: 20px;\n  padding: 16px 18px;\n  background: var(--bg-elevated);\n  border-radius: 12px;\n  font-size: 13px;\n  color: var(--text-secondary);\n  border: 1px solid var(--border-color);\n}\n\n.selected-info span {\n  color: var(--color-primary);\n  font-weight: 700;\n}\n\n/* 设置项样式 */\n.setting-item {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding: 20px;\n  background: var(--bg-elevated);\n  border-radius: 16px;\n  margin-bottom: 12px;\n  border: 1px solid var(--border-color);\n  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n  position: relative;\n  overflow: hidden;\n}\n\n\n.setting-item:hover::before {\n  opacity: 1;\n}\n\n.setting-info {\n  flex: 1;\n  min-width: 0;\n}\n\n.setting-title {\n  font-size: 16px;\n  font-weight: 700;\n  color: var(--text-primary);\n  margin-bottom: 6px;\n}\n\n.setting-desc {\n  font-size: 13px;\n  color: var(--text-secondary);\n  line-height: 1.5;\n}\n\n/* 开关样式 */\n.switch {\n  position: relative;\n  width: 54px;\n  height: 30px;\n  flex-shrink: 0;\n}\n\n.switch input {\n  opacity: 0;\n  width: 0;\n  height: 0;\n}\n\n.slider {\n  position: absolute;\n  cursor: pointer;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background: linear-gradient(135deg, #e5e7eb 0%, #d1d5db 100%);\n  transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n  border-radius: 30px;\n  box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.1), inset 0 -2px 4px rgba(0, 0, 0, 0.05);\n}\n\n.slider:before {\n  position: absolute;\n  content: \"\";\n  height: 24px;\n  width: 24px;\n  left: 3px;\n  bottom: 3px;\n  background: linear-gradient(135deg, #ffffff 0%, #f3f4f6 100%);\n  transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n  border-radius: 50%;\n  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\ninput:checked + .slider {\n  background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-primary-light) 100%);\n  box-shadow: 0 4px 16px rgba(45, 157, 120, 0.35), inset 0 1px 0 rgba(255, 255, 255, 0.2);\n}\n\ninput:checked + .slider:before {\n  transform: translateX(24px);\n  background: linear-gradient(135deg, #ffffff 0%, #fefefe 100%);\n  box-shadow: 0 3px 8px rgba(0, 0, 0, 0.2), 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n/* 关键词高亮样式 */\n.highlight {\n  color: var(--color-primary);\n  font-weight: 700;\n  position: relative;\n}\n\n.highlight::after {\n  content: '';\n  position: absolute;\n  bottom: -2px;\n  left: 0;\n  width: 100%;\n  height: 2px;\n  background: linear-gradient(90deg, var(--color-primary), var(--color-primary-light));\n  border-radius: 2px;\n}\n\n.highlight-orange {\n  color: #f97316;\n  font-weight: 700;\n}\n\n.highlight-blue {\n  color: #3b82f6;\n  font-weight: 700;\n}\n\n.highlight-purple {\n  color: #a855f7;\n  font-weight: 700;\n}\n\n.highlight-red {\n  color: #ef4444;\n  font-weight: 700;\n}\n\n/* 选择器样式 */\n.select-wrapper {\n  position: relative;\n  flex-shrink: 0;\n}\n\n.select-wrapper select {\n  appearance: none;\n  -webkit-appearance: none;\n  padding: 10px 34px 10px 14px;\n  font-size: 13px;\n  font-weight: 600;\n  color: var(--text-primary);\n  background: var(--bg-card);\n  border: 2px solid var(--border-color);\n  border-radius: 10px;\n  cursor: pointer;\n  min-width: 110px;\n  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.select-wrapper select:hover {\n  border-color: var(--color-primary);\n}\n\n.select-wrapper select:focus {\n  outline: none;\n  border-color: var(--color-primary);\n  box-shadow: 0 0 0 3px rgba(45, 157, 120, 0.1);\n}\n\n.select-wrapper::after {\n  content: '\\\\f078';\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 900;\n  position: absolute;\n  right: 10px;\n  top: 50%;\n  transform: translateY(-50%);\n  color: var(--text-secondary);\n  pointer-events: none;\n  font-size: 13px;\n  transition: transform 0.3s ease;\n}\n\n.select-wrapper:hover::after {\n  transform: translateY(-50%) rotate(180deg);\n}\n\n/* 提示文案样式 */\n.tip-alert {\n  background: linear-gradient(135deg, rgba(255, 193, 7, 0.12) 0%, rgba(255, 152, 0, 0.08) 100%);\n  border: 1px solid rgba(255, 193, 7, 0.25);\n  border-radius: 16px;\n  padding: 16px 18px;\n  margin: 20px;\n  display: flex;\n  align-items: flex-start;\n  gap: 14px;\n  box-shadow: 0 4px 16px rgba(255, 193, 7, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.8);\n  position: relative;\n  overflow: hidden;\n}\n\n.tip-alert::before {\n  content: '';\n  position: absolute;\n  top: -50%;\n  right: -20%;\n  width: 100px;\n  height: 100px;\n  background: rgba(255, 193, 7, 0.1);\n  border-radius: 50%;\n}\n\n.tip-alert i {\n  color: #f97316;\n  font-size: 22px;\n  flex-shrink: 0;\n  margin-top: 2px;\n  position: relative;\n  z-index: 1;\n}\n\n.tip-alert p {\n  font-size: 13px;\n  color: var(--text-secondary);\n  line-height: 1.6;\n  margin: 0;\n  position: relative;\n  z-index: 1;\n}\n\n.tip-alert .highlight-text {\n  color: #ea580c;\n  font-weight: 700;\n}\n\n/* 响应式 */\n@media (max-width: 600px) {\n  .container {\n    padding: 16px 12px;\n  }\n  \n  .main-card {\n    border-radius: 20px;\n  }\n  \n  .tab-content {\n    padding: 16px;\n  }\n  \n  .tip-alert {\n    margin: 16px;\n    padding: 14px 16px;\n  }\n  \n  .source-subtabs {\n    grid-template-columns: repeat(2, 1fr);\n    gap: 8px;\n  }\n  \n  .source-options {\n    grid-template-columns: repeat(auto-fill, minmax(105px, 1fr));\n    gap: 10px;\n  }\n  \n  .setting-item {\n    padding: 16px;\n  }\n  \n  .setting-title {\n    font-size: 15px;\n  }\n  \n  .setting-desc {\n    font-size: 12px;\n  }\n}\n\n::-webkit-scrollbar {\n  width: 6px;\n  height: 6px;\n}\n\n::-webkit-scrollbar-track {\n  background: var(--bg-elevated);\n  border-radius: 3px;\n}\n\n::-webkit-scrollbar-thumb {\n  background: var(--text-tertiary);\n  border-radius: 3px;\n}\n\n::-webkit-scrollbar-thumb:hover {\n  background: var(--text-secondary);\n}\n</style>\n</head>\n<body data-theme=\"light\">\n<div class=\"container\">\n  <div class=\"main-card\">\n    <div class=\"tip-alert\">\n      <p>设置完成后请点击右上角的<span class=\"highlight-text\">√</span>应用设置</p>\n    </div>\n    \n    <div class=\"main-tabs\">\n      <div class=\"main-tab active\" id=\"tabBookSource\">书源设置</div>\n      <div class=\"main-tab\" id=\"tabSource\">搜索设置</div>\n    </div>\n    \n    <div class=\"tab-content active\" id=\"contentBookSource\">\n      <div class=\"setting-item\">\n        <div class=\"setting-info\">\n          <div class=\"setting-title\">搜索模式</div>\n          <div class=\"setting-desc\">切换后会搜索对应的类型，不推荐手动设置，可以在搜索的时候使用关键词：<span class=\"highlight-orange\">t:书名</span> 搜听书，<span class=\"highlight-blue\">d:书名</span> 搜短剧，<span class=\"highlight-purple\">m:书名</span> 搜漫画</div>\n        </div>\n        <div class=\"select-wrapper\">\n          <select id=\"searchMode\">\n            <option value=\"小说\">小说</option>\n            <option value=\"听书\">听书</option>\n            <option value=\"短剧\">短剧</option>\n            <option value=\"漫画\">漫画</option>\n          </select>\n        </div>\n      </div>\n      \n      <div class=\"setting-item\">\n        <div class=\"setting-info\">\n          <div class=\"setting-title\">显示图片</div>\n          <div class=\"setting-desc\">关闭后，文章内的图片将会清除</div>\n        </div>\n        <label class=\"switch\">\n          <input type=\"checkbox\" id=\"showImageSwitch\" checked>\n          <span class=\"slider\"></span>\n        </label>\n      </div>\n      \n      <div class=\"setting-item\">\n        <div class=\"setting-info\">\n          <div class=\"setting-title\">完整简介</div>\n          <div class=\"setting-desc\">关闭后，书籍详情页会精简简介内容</div>\n        </div>\n        <label class=\"switch\">\n          <input type=\"checkbox\" id=\"fullDescSwitch\" checked>\n          <span class=\"slider\"></span>\n        </label>\n      </div>\n      \n      <div class=\"setting-item\">\n        <div class=\"setting-info\">\n          <div class=\"setting-title\">同步书架</div>\n          <div class=\"setting-desc\">开启后，刷新书籍详情页会将书架书籍同步到光遇网站网页端书架</div>\n        </div>\n        <label class=\"switch\">\n          <input type=\"checkbox\" id=\"syncBookshelfSwitch\">\n          <span class=\"slider\"></span>\n        </label>\n      </div>\n      \n      <div class=\"setting-item\" id=\"syncPopupSection\" style=\"display: none;\">\n        <div class=\"setting-info\">\n          <div class=\"setting-title\">同步弹窗</div>\n          <div class=\"setting-desc\">弹窗开关可以让您知晓同步状态，关闭后不会弹窗</div>\n        </div>\n        <label class=\"switch\">\n          <input type=\"checkbox\" id=\"syncPopupSwitch\">\n          <span class=\"slider\"></span>\n        </label>\n      </div>\n      \n      <div class=\"setting-item\">\n        <div class=\"setting-info\">\n          <div class=\"setting-title\">网络模式</div>\n          <div class=\"setting-desc\">开启后部分来源会使用本地网络请求，如<span class=\"highlight-orange\">69书吧</span>，可能需要开梯子访问，不推荐开启</div>\n        </div>\n        <div class=\"select-wrapper\">\n          <select id=\"networkMode\">\n            <option value=\"服务器\">服务器</option>\n            <option value=\"本地\">本地</option>\n          </select>\n        </div>\n      </div>\n      \n      <div class=\"setting-item\">\n        <div class=\"setting-info\">\n          <div class=\"setting-title\">强制搜索</div>\n          <div class=\"setting-desc\">开启后搜索时会 <span class=\"highlight-red\">强制搜索全部来源</span>，搜索时长会 <span class=\"highlight-orange\">明显增长</span>，若无必要不建议开启</div>\n        </div>\n        <label class=\"switch\">\n          <input type=\"checkbox\" id=\"forceSearchSwitch\">\n          <span class=\"slider\"></span>\n        </label>\n      </div>\n      \n      <div class=\"setting-item\">\n        <div class=\"setting-info\">\n          <div class=\"setting-title\">目录显示来源</div>\n          <div class=\"setting-desc\">开启后，目录最后一个章节的标题将显示来源，方便换源的时候开启加载目录可以知道是哪个来源</div>\n        </div>\n        <label class=\"switch\">\n          <input type=\"checkbox\" id=\"showSourceInTocSwitch\" checked>\n          <span class=\"slider\"></span>\n        </label>\n      </div>\n    </div>\n    \n    <div class=\"tab-content\" id=\"contentSource\">\n      <div class=\"source-subtabs\">\n        <div class=\"source-subtab novel active\" id=\"subtabNovel\" data-type=\"小说\">\n          <i class=\"fas fa-book-open\"></i>\n          <span>小说</span>\n        </div>\n        <div class=\"source-subtab audio\" id=\"subtabAudio\" data-type=\"听书\">\n          <i class=\"fas fa-headphones\"></i>\n          <span>听书</span>\n        </div>\n        <div class=\"source-subtab comic\" id=\"subtabComic\" data-type=\"漫画\">\n          <i class=\"fas fa-image\"></i>\n          <span>漫画</span>\n        </div>\n        <div class=\"source-subtab drama\" id=\"subtabDrama\" data-type=\"短剧\">\n          <i class=\"fas fa-video\"></i>\n          <span>短剧</span>\n        </div>\n      </div>\n      <div class=\"selected-info\" style=\"margin-bottom: 10px; background: rgba(45, 157, 120, 0.08); border-color: rgba(45, 157, 120, 0.2);\">\n        推荐选择全部，如需要搜索特定的资源可以搜索的时候使用 <span class=\"highlight\">书名@来源</span> 进行搜索\n      </div>\n      <div id=\"sourceOptions\" class=\"source-options\"></div>\n      <div class=\"selected-info\" id=\"selectedInfo\">\n        当前选中: <span id=\"selectedCount\">0</span> 个来源\n      </div>\n    </div>\n    \n    <div id=\"hiddenSettings\" style=\"display: none;\">\n      <script type=\"application/json\" id=\"settingsJson\">\n        ${JSON.stringify(data || {\"小说\":\"全部\",\"听书\":\"全部\",\"漫画\":\"全部\",\"短剧\":\"全部\",\"搜索模式\":\"小说\",\"显示图片\":\"true\",\"完整简介\":\"true\",\"同步书架\":\"false\",\"同步弹窗\":\"true\",\"网络模式\":\"服务器\",\"强制搜索\":\"false\",\"目录显示来源\":\"true\"})}\n      </script>\n      <div id=\"settingsDiv\">\n        <span id=\"novelSource\">${(data && data.小说) || '全部'}</span>\n        <span id=\"audioSource\">${(data && data.听书) || '全部'}</span>\n        <span id=\"comicSource\">${(data && data.漫画) || '全部'}</span>\n        <span id=\"dramaSource\">${(data && data.短剧) || '全部'}</span>\n        <span id=\"searchModeValue\">${(data && data.搜索模式) || '小说'}</span>\n        <span id=\"showImageSwitchValue\">${(data && data.显示图片) || 'true'}</span>\n        <span id=\"fullDescSwitchValue\">${(data && data.完整简介) || 'true'}</span>\n        <span id=\"syncBookshelfSwitchValue\">${(data && data.同步书架) || 'false'}</span>\n        <span id=\"syncPopupSwitchValue\">${(data && data.同步弹窗) || 'true'}</span>\n        <span id=\"networkModeValue\">${(data && data.网络模式) || '服务器'}</span>\n        <span id=\"forceSearchSwitchValue\">${(data && data.强制搜索) || 'false'}</span>\n        <span id=\"showSourceInTocValue\">${(data && data.目录显示来源) || 'true'}</span>\n      </div>\n    </div>\n  </div>\n</div>\n\n<script>\nconst SOURCES = ${JSON.stringify(config)};\nlet settings = ${JSON.stringify(data)};\nlet currentType = '小说';\n\ndocument.getElementById('tabSource').addEventListener('click', () => {\n  document.getElementById('tabSource').classList.add('active');\n  document.getElementById('tabBookSource').classList.remove('active');\n  document.getElementById('contentSource').classList.add('active');\n  document.getElementById('contentBookSource').classList.remove('active');\n});\n\ndocument.getElementById('tabBookSource').addEventListener('click', () => {\n  document.getElementById('tabBookSource').classList.add('active');\n  document.getElementById('tabSource').classList.remove('active');\n  document.getElementById('contentBookSource').classList.add('active');\n  document.getElementById('contentSource').classList.remove('active');\n});\n\nconst subtabs = document.querySelectorAll('.source-subtab');\nsubtabs.forEach(tab => {\n  tab.addEventListener('click', () => {\n    subtabs.forEach(t => t.classList.remove('active'));\n    tab.classList.add('active');\n    currentType = tab.dataset.type;\n    renderSourceOptions();\n  });\n});\n\nfunction renderSourceOptions() {\n  const optionsContainer = document.getElementById('sourceOptions');\n  const key = \\`搜索\\${currentType}\\`;\n  const sources = SOURCES[key] || [];\n  const savedValue = settings[currentType] || '';\n  const selectedValues = savedValue === '全部' ? ['全部'] : (savedValue ? savedValue.split(',') : []);\n  \n  optionsContainer.innerHTML = '';\n  \n  const allOption = document.createElement('div');\n  allOption.className = \\`source-option all \\${selectedValues.includes('全部') ? 'selected' : ''}\\`;\n  allOption.textContent = '全部';\n  allOption.addEventListener('click', () => selectOption('全部'));\n  optionsContainer.appendChild(allOption);\n  \n  sources.forEach(source => {\n    const option = document.createElement('div');\n    option.className = \\`source-option \\${selectedValues.includes(source) ? 'selected' : ''}\\`;\n    option.textContent = source;\n    option.addEventListener('click', () => selectOption(source));\n    optionsContainer.appendChild(option);\n  });\n  \n  updateSelectedInfo();\n}\n\nfunction updateHiddenSettings() {\n  const jsonEl = document.getElementById('settingsJson');\n  if (jsonEl) {\n    jsonEl.textContent = JSON.stringify(settings);\n  }\n  \n  const typeMap = {\n    '小说': 'novelSource',\n    '听书': 'audioSource',\n    '漫画': 'comicSource',\n    '短剧': 'dramaSource',\n    '搜索模式': 'searchModeValue',\n    '显示图片': 'showImageSwitchValue',\n    '完整简介': 'fullDescSwitchValue',\n    '同步书架': 'syncBookshelfSwitchValue',\n    '同步弹窗': 'syncPopupSwitchValue',\n    '网络模式': 'networkModeValue',\n    '强制搜索': 'forceSearchSwitchValue',\n    '目录显示来源': 'showSourceInTocValue'\n  };\n  \n  Object.keys(typeMap).forEach(type => {\n    const el = document.getElementById(typeMap[type]);\n    if (el) {\n      el.textContent = settings[type] != undefined ? settings[type] : (type.includes('开关') ? 'false' : '全部');\n    }\n  });\n}\n\nfunction setupBookSourceSettings() {\n  document.getElementById('searchMode').addEventListener('change', (e) => {\n    settings['搜索模式'] = e.target.value;\n    updateHiddenSettings();\n  });\n  \n  document.getElementById('showImageSwitch').addEventListener('change', (e) => {\n    settings['显示图片'] = e.target.checked ? 'true' : 'false';\n    updateHiddenSettings();\n  });\n  \n  document.getElementById('fullDescSwitch').addEventListener('change', (e) => {\n    settings['完整简介'] = e.target.checked ? 'true' : 'false';\n    updateHiddenSettings();\n  });\n  \n  document.getElementById('syncBookshelfSwitch').addEventListener('change', (e) => {\n    settings['同步书架'] = e.target.checked ? 'true' : 'false';\n    updateHiddenSettings();\n    \n    const syncPopupSection = document.getElementById('syncPopupSection');\n    const syncPopupSwitch = document.getElementById('syncPopupSwitch');\n    if (e.target.checked) {\n      syncPopupSection.style.display = 'flex';\n      if (settings['同步弹窗'] == undefined) {\n        settings['同步弹窗'] = 'true';\n        syncPopupSwitch.checked = true;\n        updateHiddenSettings();\n      }\n    } else {\n      syncPopupSection.style.display = 'none';\n    }\n  });\n  \n  document.getElementById('syncPopupSwitch').addEventListener('change', (e) => {\n    settings['同步弹窗'] = e.target.checked ? 'true' : 'false';\n    updateHiddenSettings();\n  });\n  \n  document.getElementById('networkMode').addEventListener('change', (e) => {\n    settings['网络模式'] = e.target.value;\n    updateHiddenSettings();\n  });\n  \n  document.getElementById('forceSearchSwitch').addEventListener('change', (e) => {\n    settings['强制搜索'] = e.target.checked ? 'true' : 'false';\n    updateHiddenSettings();\n  });\n  \n  document.getElementById('showSourceInTocSwitch').addEventListener('change', (e) => {\n    settings['目录显示来源'] = e.target.checked ? 'true' : 'false';\n    updateHiddenSettings();\n  });\n}\n\nfunction initBookSourceSettings() {\n  const searchModeEl = document.getElementById('searchMode');\n  if (searchModeEl && settings['搜索模式']) {\n    searchModeEl.value = settings['搜索模式'];\n  }\n  \n  const showImageEl = document.getElementById('showImageSwitch');\n  if (showImageEl) {\n    showImageEl.checked = settings['显示图片'] != 'false';\n  }\n  \n  const fullDescEl = document.getElementById('fullDescSwitch');\n  if (fullDescEl) {\n    fullDescEl.checked = settings['完整简介'] != 'false';\n  }\n  \n  const syncBookshelfEl = document.getElementById('syncBookshelfSwitch');\n  if (syncBookshelfEl) {\n    syncBookshelfEl.checked = settings['同步书架'] === 'true';\n  }\n  \n  const syncPopupSection = document.getElementById('syncPopupSection');\n  const syncPopupSwitch = document.getElementById('syncPopupSwitch');\n  if (syncPopupSwitch) {\n    syncPopupSwitch.checked = settings['同步弹窗'] != 'false';\n  }\n  if (syncPopupSection) {\n    syncPopupSection.style.display = (settings['同步书架'] === 'true') ? 'flex' : 'none';\n  }\n  \n  const networkModeEl = document.getElementById('networkMode');\n  if (networkModeEl && settings['网络模式']) {\n    networkModeEl.value = settings['网络模式'];\n  }\n  \n  const forceSearchEl = document.getElementById('forceSearchSwitch');\n  if (forceSearchEl) {\n    forceSearchEl.checked = settings['强制搜索'] === 'true';\n  }\n  \n  const showSourceInTocEl = document.getElementById('showSourceInTocSwitch');\n  if (showSourceInTocEl) {\n    showSourceInTocEl.checked = settings['目录显示来源'] != 'false';\n  }\n}\n\nfunction selectOption(value) {\n  const key = \\`搜索\\${currentType}\\`;\n  const sources = SOURCES[key] || [];\n  \n  if (value === '全部') {\n    settings[currentType] = '全部';\n    updateHiddenSettings();\n    renderSourceOptions();\n    return;\n  }\n  \n  let currentValue = settings[currentType] || '';\n  \n  if (currentValue === '全部') {\n    currentValue = '';\n  }\n  \n  let values = currentValue ? currentValue.split(',') : [];\n  \n  const index = values.indexOf(value);\n  if (index > -1) {\n    values.splice(index, 1);\n  } else {\n    values.push(value);\n  }\n  \n  if (values.length === 0) {\n    settings[currentType] = '全部';\n  } else {\n    settings[currentType] = values.join(',');\n  }\n  \n  updateHiddenSettings();\n  renderSourceOptions();\n}\n\nfunction updateSelectedInfo() {\n  const key = \\`搜索\\${currentType}\\`;\n  const sources = SOURCES[key] || [];\n  const savedValue = settings[currentType] || '';\n  \n  if (savedValue === '全部') {\n    document.getElementById('selectedCount').textContent = '全部';\n  } else {\n    const count = savedValue ? savedValue.split(',').length : 0;\n    document.getElementById('selectedCount').textContent = count;\n  }\n}\n\ndocument.addEventListener('DOMContentLoaded', () => {\n  let savedSettings = {};\n  try {\n    const jsonEl = document.getElementById('settingsJson');\n    if (jsonEl) {\n      savedSettings = JSON.parse(jsonEl.textContent);\n    }\n  } catch (e) {\n    console.error('读取初始设置失败:', e);\n  }\n  \n  settings = {\n    '小说': savedSettings['小说'] || '全部',\n    '听书': savedSettings['听书'] || '全部',\n    '漫画': savedSettings['漫画'] || '全部',\n    '短剧': savedSettings['短剧'] || '全部',\n    '搜索模式': savedSettings['搜索模式'] || '小说',\n    '显示图片': savedSettings['显示图片'] || 'true',\n    '完整简介': savedSettings['完整简介'] || 'true',\n    '同步书架': savedSettings['同步书架'] || 'false',\n    '同步弹窗': savedSettings['同步弹窗'] || 'true',\n    '网络模式': savedSettings['网络模式'] || '服务器',\n    '强制搜索': savedSettings['强制搜索'] || 'false',\n    '目录显示来源': savedSettings['目录显示来源'] || 'true'\n  };\n  \n  initBookSourceSettings();\n  setupBookSourceSettings();\n  renderSourceOptions();\n});\n</script>\n</body>\n</html>\n    `\n    let body;\n    try {\n        body = java.startBrowserAwait(`data:text/html;base64,${java.base64Encode(html)}`, '光遇书源设置', false).body();\n    } catch (e) {\n        let islyc = this.checkEnv();\n        if (islyc == \"安卓\") {\n            java.longToast(\"\\n当前软件版本过低，请更新软件，或者使用底部备用设置方案~\");\n        } else {\n            java.longToast(\"\\n请点击页面右上角√才能设置成功哦~\");\n        }\n        return;\n    }\n    \n    let settings = {};\n    try {\n        const getSpanText = (spanId) => {\n            const regex = new RegExp('id=\"' + spanId + '\"\\s*>\\s*([^<]*?)\\s*<\\/span>');\n            const match = body.match(regex);\n            return match ? match[1].trim() : \"\";\n        };\n        settings = {\n            '搜索模式': getSpanText('searchModeValue'),\n            '显示图片': getSpanText('showImageSwitchValue'),\n            '完整简介': getSpanText('fullDescSwitchValue'),\n            '同步书架': getSpanText('syncBookshelfSwitchValue'),\n            '同步弹窗': getSpanText('syncPopupSwitchValue'),\n            '网络模式': getSpanText('networkModeValue'),\n            '强制搜索': getSpanText('forceSearchSwitchValue'),\n            '目录显示来源': getSpanText('showSourceInTocValue'),\n            '小说': getSpanText('novelSource'),\n            '听书': getSpanText('audioSource'),\n            '漫画': getSpanText('comicSource'),\n            '短剧': getSpanText('dramaSource'),\n        };\n        const settingsText = Object.keys(settings).map(key => `${key}: ${settings[key]}`).join('\\n');\n        java.longToast(\"\\n\" + settingsText);\n\n    } catch (e) {\n        settings = {\n            '搜索模式': '小说',\n            '显示图片': 'true',\n            '完整简介': 'true',\n            '同步书架': 'false',\n            '同步弹窗': 'true',\n            '网络模式': '服务器',\n            '强制搜索': 'false',\n            '目录显示来源': 'true',\n            '小说': '全部',\n            '听书': '全部',\n            '漫画': '全部',\n            '短剧': '全部',\n        };\n    }\n    this.setVariable(\"更多设置\", settings, false)\n}\n\n\n// 段评设置页面\nfunction getSvgSettings() {\n    const {\n        java\n    } = this;\n    const islyc = this.checkEnv();\n    if (islyc == \"苹果\") {\n        java.longToast(\"\\n当前软件不支持设置段评样式\");\n        return;\n    }\n    let data = this.getVariable('段评设置');\n    let base_url = this.BaseUrl();\n    let qttoken = this.getToken();\n\n    let html = `\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no\">\n<title>光遇小说 - 段评设置</title>\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css\">\n<style>\n* {\n  margin: 0;\n  padding: 0;\n  box-sizing: border-box;\n  -webkit-tap-highlight-color: transparent;\n}\n\n:root {\n  --color-primary: #2D9D78;\n  --color-primary-light: #3DB893;\n  --color-primary-dark: #1E6F55;\n  --color-accent: #FFB74D;\n  --color-success: #4CAF50;\n  --color-error: #F44336;\n  --color-warning: #FFC107;\n  --color-info: #2196F3;\n  \n  --bg-dark: #f5f7fa;\n  --bg-darker: #ffffff;\n  --bg-card: rgba(255, 255, 255, 0.95);\n  --bg-elevated: #f8fafb;\n  \n  --text-primary: #1a1d23;\n  --text-secondary: #6b7280;\n  --text-tertiary: #9ca3af;\n  \n  --border-color: rgba(0, 0, 0, 0.08);\n  \n  --font-display: 'Libre Baskerville', serif;\n  --font-body: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;\n}\n\n[data-theme=\"dark\"] {\n  --bg-dark: #0A1628;\n  --bg-darker: #050B14;\n  --bg-card: #142235;\n  --bg-elevated: #1A2B42;\n  \n  --text-primary: #FFFFFF;\n  --text-secondary: rgba(255, 255, 255, 0.7);\n  --text-tertiary: rgba(255, 255, 255, 0.5);\n  \n  --border-color: rgba(255, 255, 255, 0.1);\n}\n\nhtml, body {\n  width: 100%;\n  min-height: 100vh;\n  font-family: var(--font-body);\n  font-size: 16px;\n  color: var(--text-primary);\n  background: var(--bg-darker);\n  overflow-x: hidden;\n}\n\n.container {\n  padding: 20px;\n  max-width: 800px;\n  margin: 0 auto;\n}\n\n.main-card {\n  background: var(--bg-card);\n  border-radius: 20px;\n  box-shadow: 0 4px 24px rgba(0, 0, 0, 0.1);\n  border: 1px solid var(--border-color);\n  overflow: hidden;\n}\n/* 提示文案样式 */\n.tip-alert {\n  background: linear-gradient(135deg, rgba(255, 193, 7, 0.12) 0%, rgba(255, 152, 0, 0.08) 100%);\n  border: 1px solid rgba(255, 193, 7, 0.25);\n  border-radius: 16px;\n  padding: 16px 18px;\n  margin: 20px;\n  display: flex;\n  align-items: flex-start;\n  gap: 14px;\n  box-shadow: 0 4px 16px rgba(255, 193, 7, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.8);\n  position: relative;\n  overflow: hidden;\n}\n\n.tip-alert::before {\n  content: '';\n  position: absolute;\n  top: -50%;\n  right: -20%;\n  width: 100px;\n  height: 100px;\n  background: rgba(255, 193, 7, 0.1);\n  border-radius: 50%;\n}\n\n.tip-alert i {\n  color: #f97316;\n  font-size: 22px;\n  flex-shrink: 0;\n  margin-top: 2px;\n  position: relative;\n  z-index: 1;\n}\n\n.tip-alert p {\n  font-size: 13px;\n  color: var(--text-secondary);\n  line-height: 1.6;\n  margin: 0;\n  position: relative;\n  z-index: 1;\n}\n\n.tip-alert .highlight-text {\n  color: #ea580c;\n  font-weight: 700;\n}\n/* 设置项样式 */\n.setting-item {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding: 16px;\n  border-bottom: 1px solid var(--border-color);\n}\n\n.setting-item:last-child {\n  border-bottom: none;\n}\n\n.setting-info {\n  flex: 1;\n  min-width: 0;\n}\n\n.setting-title {\n  font-size: 15px;\n  font-weight: 700;\n  color: var(--text-primary);\n  margin-bottom: 4px;\n}\n\n.setting-desc {\n  font-size: 12px;\n  color: var(--text-secondary);\n  line-height: 1.4;\n}\n\n/* 开关样式 */\n.switch {\n  position: relative;\n  display: inline-block;\n  width: 48px;\n  height: 28px;\n  flex-shrink: 0;\n}\n\n.switch input {\n  opacity: 0;\n  width: 0;\n  height: 0;\n}\n\n.slider {\n  position: absolute;\n  cursor: pointer;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background-color: #ccc;\n  transition: 0.3s;\n  border-radius: 28px;\n}\n\n.slider:before {\n  position: absolute;\n  content: \"\";\n  height: 22px;\n  width: 22px;\n  left: 3px;\n  bottom: 3px;\n  background-color: white;\n  transition: 0.3s;\n  border-radius: 50%;\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n}\n\ninput:checked + .slider {\n  background: linear-gradient(135deg, var(--color-primary), var(--color-primary-light));\n}\n\ninput:checked + .slider:before {\n  transform: translateX(20px);\n}\n\n/* 选择器样式 */\n.select-wrapper {\n  position: relative;\n  flex-shrink: 0;\n}\n\n.select-wrapper select {\n  appearance: none;\n  -webkit-appearance: none;\n  padding: 8px 32px 8px 12px;\n  font-size: 13px;\n  font-weight: 600;\n  color: var(--text-primary);\n  background: var(--bg-elevated);\n  border: 1px solid var(--border-color);\n  border-radius: 8px;\n  cursor: pointer;\n  min-width: 120px;\n}\n\n.select-wrapper::after {\n  content: '\\\\f078';\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 900;\n  position: absolute;\n  right: 8px;\n  top: 50%;\n  transform: translateY(-50%);\n  color: var(--text-secondary);\n  pointer-events: none;\n  font-size: 12px;\n}\n\n/* 颜色选择器样式 */\n.color-picker-wrapper {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  flex-shrink: 0;\n}\n\n.color-input {\n  width: 40px;\n  height: 40px;\n  border: none;\n  border-radius: 8px;\n  cursor: pointer;\n  background: transparent;\n  padding: 2px;\n}\n\n.color-input::-webkit-color-swatch-wrapper {\n  padding: 0;\n}\n\n.color-input::-webkit-color-swatch {\n  border-radius: 6px;\n  border: 2px solid var(--border-color);\n}\n\n.color-text-input {\n  width: 100px;\n  padding: 8px 10px;\n  font-size: 12px;\n  font-weight: 600;\n  color: var(--text-primary);\n  background: var(--bg-elevated);\n  border: 1px solid var(--border-color);\n  border-radius: 6px;\n  text-transform: uppercase;\n}\n\n.transparent-btn {\n  padding: 8px 12px;\n  font-size: 11px;\n  font-weight: 600;\n  color: var(--color-primary);\n  background: rgba(45, 157, 120, 0.1);\n  border: 1px solid var(--color-primary);\n  border-radius: 6px;\n  cursor: pointer;\n  transition: all 0.2s ease;\n}\n\n.transparent-btn:hover {\n  background: rgba(45, 157, 120, 0.2);\n}\n\n/* 预览区域 */\n/* 自定义样式容器 */\n.custom-style-container {\n  padding: 0 16px 16px;\n}\n\n.custom-style-container textarea {\n  width: 100%;\n  padding: 12px;\n  font-size: 13px;\n  font-family: monospace;\n  color: var(--text-primary);\n  background: var(--bg-card);\n  border: 1px solid var(--border-color);\n  border-radius: 8px;\n  resize: vertical;\n  min-height: 100px;\n  box-sizing: border-box;\n}\n\n/* 添加样式按钮 */\n.add-style-btn {\n  width: 36px;\n  height: 36px;\n  border-radius: 50%;\n  background: linear-gradient(135deg, var(--color-primary), var(--color-primary-light));\n  border: none;\n  color: white;\n  font-size: 16px;\n  cursor: pointer;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  box-shadow: 0 2px 8px rgba(45, 157, 120, 0.3);\n  transition: all 0.2s ease;\n}\n\n.add-style-btn:hover {\n  transform: scale(1.1);\n  box-shadow: 0 4px 12px rgba(45, 157, 120, 0.4);\n}\n\n.save-style-btn {\n  padding: 8px 16px;\n  border-radius: 8px;\n  background: linear-gradient(135deg, var(--color-accent), #f59e0b);\n  border: none;\n  color: white;\n  font-size: 13px;\n  font-weight: 600;\n  cursor: pointer;\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  box-shadow: 0 2px 8px rgba(251, 146, 60, 0.3);\n  transition: all 0.2s ease;\n}\n\n.save-style-btn:hover {\n  transform: translateY(-1px);\n  box-shadow: 0 4px 12px rgba(251, 146, 60, 0.4);\n}\n\n.more-styles-btn {\n  padding: 8px 12px;\n  border-radius: 8px;\n  background: linear-gradient(135deg, #6366f1, #8b5cf6);\n  border: none;\n  color: white;\n  font-size: 13px;\n  font-weight: 600;\n  cursor: pointer;\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  box-shadow: 0 2px 8px rgba(99, 102, 241, 0.3);\n  transition: all 0.2s ease;\n}\n\n.more-styles-btn:hover {\n  transform: translateY(-1px);\n  box-shadow: 0 4px 12px rgba(99, 102, 241, 0.4);\n}\n\n/* 自定义样式区域 */\n.custom-style-section {\n  padding: 0 16px 16px;\n}\n\n.custom-styles-container {\n  margin-top: 12px;\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n}\n\n.empty-custom-styles {\n  text-align: center;\n  padding: 20px;\n  color: var(--text-secondary);\n  font-size: 13px;\n  background: var(--bg-elevated);\n  border-radius: 12px;\n  border: 1px dashed var(--border-color);\n}\n\n/* 自定义样式卡片 */\n.custom-style-card {\n  background: var(--bg-elevated);\n  border-radius: 12px;\n  padding: 12px;\n  border: 1px solid var(--border-color);\n}\n\n.custom-style-header {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  margin-bottom: 10px;\n}\n\n.style-name-input {\n  flex: 1;\n  padding: 6px 10px;\n  font-size: 13px;\n  font-weight: 600;\n  color: var(--text-primary);\n  background: var(--bg-card);\n  border: 1px solid var(--border-color);\n  border-radius: 6px;\n}\n\n.style-actions {\n  display: flex;\n  gap: 6px;\n}\n\n.style-btn {\n  width: 28px;\n  height: 28px;\n  border: none;\n  border-radius: 6px;\n  cursor: pointer;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  font-size: 12px;\n  transition: all 0.2s ease;\n}\n\n.preview-btn {\n  background: rgba(45, 157, 120, 0.1);\n  color: var(--color-primary);\n}\n\n.preview-btn:hover {\n  background: rgba(45, 157, 120, 0.2);\n}\n\n.delete-btn {\n  background: rgba(244, 67, 54, 0.1);\n  color: #f44336;\n}\n\n.delete-btn:hover {\n  background: rgba(244, 67, 54, 0.2);\n}\n\n.style-code-textarea {\n  width: 100%;\n  padding: 10px;\n  font-size: 12px;\n  font-family: monospace;\n  color: var(--text-primary);\n  background: var(--bg-card);\n  border: 1px solid var(--border-color);\n  border-radius: 8px;\n  resize: vertical;\n  min-height: 80px;\n  box-sizing: border-box;\n  margin-bottom: 10px;\n}\n\n.style-preview-small {\n  display: flex;\n  justify-content: center;\n  padding: 10px;\n  background: var(--bg-card);\n  border-radius: 8px;\n}\n\n.preview-svg-container svg {\n  width: 50px;\n  height: 45px;\n}\n\n.preview-section {\n  padding: 20px;\n  background: var(--bg-elevated);\n  border-top: 1px solid var(--border-color);\n}\n\n.preview-title {\n  font-size: 14px;\n  font-weight: 700;\n  color: var(--text-primary);\n  margin-bottom: 16px;\n  display: flex;\n  align-items: center;\n  gap: 8px;\n}\n\n.preview-title i {\n  color: var(--color-primary);\n}\n\n.preview-container {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 16px;\n  justify-content: center;\n  align-items: center;\n  min-height: 150px;\n}\n\n.preview-item {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  gap: 8px;\n  padding: 12px;\n  background: var(--bg-card);\n  border-radius: 12px;\n  border: 1px solid var(--border-color);\n}\n\n.preview-item.selected {\n  border-color: var(--color-primary);\n  background: rgba(45, 157, 120, 0.05);\n}\n\n.preview-item svg {\n  width: 60px;\n  height: 54px;\n  cursor: pointer;\n  transition: transform 0.2s ease;\n}\n\n.preview-item svg:hover {\n  transform: scale(1.1);\n}\n\n.preview-item .preview-label {\n  font-size: 11px;\n  color: var(--text-secondary);\n  text-align: center;\n}\n\n.preview-item.selected .preview-label {\n  color: var(--color-primary);\n  font-weight: 600;\n}\n\n/* 高亮文本 */\n.highlight {\n  color: var(--color-primary);\n  font-weight: 700;\n}\n\n.highlight-red {\n  color: #ef4444;\n  font-weight: 700;\n}\n\n/* Toast提示样式 */\n.toast-container {\n  position: fixed;\n  top: 20px;\n  right: 20px;\n  z-index: 1000;\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n}\n\n.toast {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  padding: 14px 18px;\n  border-radius: 12px;\n  background: var(--bg-card);\n  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);\n  border: 1px solid var(--border-color);\n  min-width: 200px;\n  max-width: 320px;\n  animation: toastSlideIn 0.3s ease-out;\n}\n\n.toast.fade-out {\n  animation: toastFadeOut 0.3s ease-out forwards;\n}\n\n@keyframes toastSlideIn {\n  from {\n    transform: translateX(100%);\n    opacity: 0;\n  }\n  to {\n    transform: translateX(0);\n    opacity: 1;\n  }\n}\n\n@keyframes toastFadeOut {\n  from {\n    opacity: 1;\n    transform: translateX(0);\n  }\n  to {\n    opacity: 0;\n    transform: translateX(20px);\n  }\n}\n\n.toast-icon {\n  width: 32px;\n  height: 32px;\n  border-radius: 50%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  font-size: 16px;\n  flex-shrink: 0;\n}\n\n.toast-icon.success {\n  background: rgba(76, 175, 80, 0.1);\n  color: #4CAF50;\n}\n\n.toast-icon.error {\n  background: rgba(244, 67, 54, 0.1);\n  color: #F44336;\n}\n\n.toast-icon.warning {\n  background: rgba(255, 193, 7, 0.1);\n  color: #FFC107;\n}\n\n.toast-icon.info {\n  background: rgba(33, 150, 243, 0.1);\n  color: #2196F3;\n}\n\n.toast-icon.loading {\n  background: rgba(45, 157, 120, 0.1);\n  color: var(--color-primary);\n}\n\n.toast-content {\n  flex: 1;\n  font-size: 14px;\n  color: var(--text-primary);\n  font-weight: 500;\n}\n\n\n\n@keyframes spin {\n  to { transform: rotate(360deg); }\n}\n\n/* 保存按钮加载状态 */\n.save-style-btn.loading {\n  opacity: 0.7;\n  pointer-events: none;\n}\n\n.save-style-btn.loading i {\n  display: none;\n}\n\n.save-style-btn.loading .btn-text {\n  display: none;\n}\n\n\n/* 响应式 */\n@media (max-width: 600px) {\n  .container {\n    padding: 12px;\n  }\n  \n  .main-card {\n    border-radius: 16px;\n  }\n\n  .tip-alert {\n    margin: 16px;\n    padding: 14px 16px;\n  }\n    \n  .setting-item {\n    padding: 14px;\n  }\n  \n  .color-picker-wrapper {\n    flex-direction: column;\n    align-items: flex-end;\n  }\n}\n</style>\n</head>\n<body data-theme=\"light\">\n<div class=\"container\">\n  <div class=\"main-card\">\n    <div class=\"tip-alert\">\n      <p>设置完成后请点击右上角的<span class=\"highlight-text\">√</span>应用设置</p>\n    </div>\n    <!-- 设置项 -->\n    <div class=\"setting-item\">\n      <div class=\"setting-info\">\n        <div class=\"setting-title\">段评</div>\n        <div class=\"setting-desc\">仅 <span class=\"highlight-red\">番茄</span>、<span class=\"highlight\">七猫</span>、<span class=\"highlight-red\">塔读</span>、<span class=\"highlight\">QQ阅读</span> 支持</div>\n      </div>\n      <label class=\"switch\">\n        <input type=\"checkbox\" id=\"duanpingSwitch\" checked>\n        <span class=\"slider\"></span>\n      </label>\n    </div>\n    \n    <div class=\"setting-item\">\n      <div class=\"setting-info\">\n        <div class=\"setting-title\">神评论</div>\n        <div class=\"setting-desc\">需要开启段评开关才可生效，仅支持 <span class=\"highlight-red\">番茄</span></div>\n      </div>\n      <label class=\"switch\">\n        <input type=\"checkbox\" id=\"shenpingSwitch\" checked>\n        <span class=\"slider\"></span>\n      </label>\n    </div>\n    \n    <div class=\"setting-item\">\n      <div class=\"setting-info\">\n        <div class=\"setting-title\">本章说</div>\n        <div class=\"setting-desc\">仅支持 <span class=\"highlight-red\">番茄</span></div>\n      </div>\n      <label class=\"switch\">\n        <input type=\"checkbox\" id=\"benzhangSwitch\" checked>\n        <span class=\"slider\"></span>\n      </label>\n    </div>\n    \n    <div class=\"setting-item\">\n      <div class=\"setting-info\">\n        <div class=\"setting-title\">气泡增大</div>\n        <div class=\"setting-desc\">开启后，气泡显示会加大一些</div>\n      </div>\n      <label class=\"switch\">\n        <input type=\"checkbox\" id=\"bubbleLargeSwitch\">\n        <span class=\"slider\"></span>\n      </label>\n    </div>\n    \n    <div class=\"setting-item\">\n      <div class=\"setting-info\">\n        <div class=\"setting-title\">段评样式</div>\n        <div class=\"setting-desc\">选择段评显示的样式风格，下方可实时预览效果</div>\n      </div>\n      <div class=\"select-wrapper\">\n        <select id=\"duanpingStyle\">\n          <option value=\"0\">起点样式</option>\n          <option value=\"1\">番茄样式</option>\n          <option value=\"2\">精致样式</option>\n          <option value=\"3\">对话样式</option>\n          <option value=\"4\">方框样式</option>\n          <option value=\"5\">圆圈样式</option>\n        </select>\n      </div>\n    </div>\n    \n    <div class=\"setting-item\">\n      <div class=\"setting-info\">\n        <div class=\"setting-title\">边框颜色</div>\n        <div class=\"setting-desc\">设置段评边框颜色</div>\n      </div>\n      <div class=\"color-picker-wrapper\">\n        <input type=\"color\" id=\"borderColor\" value=\"#A7A7A7\" class=\"color-input\">\n        <input type=\"text\" id=\"borderColorText\" value=\"#A7A7A7\" class=\"color-text-input\">\n      </div>\n    </div>\n    \n    <div class=\"setting-item\">\n      <div class=\"setting-info\">\n        <div class=\"setting-title\">字体颜色</div>\n        <div class=\"setting-desc\">设置段评字体颜色</div>\n      </div>\n      <div class=\"color-picker-wrapper\">\n        <input type=\"color\" id=\"fontColor\" value=\"#A7A7A7\" class=\"color-input\">\n        <input type=\"text\" id=\"fontColorText\" value=\"#A7A7A7\" class=\"color-text-input\">\n      </div>\n    </div>\n    \n    <div class=\"setting-item\">\n      <div class=\"setting-info\">\n        <div class=\"setting-title\">填充颜色</div>\n        <div class=\"setting-desc\">设置段评背景填充颜色</div>\n      </div>\n      <div class=\"color-picker-wrapper\">\n        <input type=\"color\" id=\"fillColor\" value=\"#FFFFFF\" class=\"color-input\">\n        <input type=\"text\" id=\"fillColorText\" value=\"transparent\" class=\"color-text-input\">\n        <button id=\"fillColorTransparent\" class=\"transparent-btn\">透明</button>\n      </div>\n    </div>\n    \n    <!-- 自定义样式管理 -->\n    <div class=\"custom-style-section\">\n      <div class=\"setting-item\" style=\"flex-direction: column; align-items: flex-start; gap: 12px;\">\n        <div class=\"setting-info\">\n          <div class=\"setting-title\">自定义样式管理</div>\n          <div class=\"setting-desc\">点击下方\"+\"添加新的自定义样式，支持自定义名称</div>\n        </div>\n        <div style=\"display: flex; gap: 10px; align-items: center; width: 100%; justify-content: flex-end;\">\n          <button id=\"moreStylesBtn\" class=\"more-styles-btn\">\n            <i class=\"fas fa-external-link-alt\"></i>\n            <span class=\"btn-text\">更多样式</span>\n          </button>\n          <button id=\"saveCustomStyleBtn\" class=\"save-style-btn\">\n            <i class=\"fas fa-save\"></i>\n            <span class=\"btn-text\">保存自定义</span>\n          </button>\n          <button id=\"addCustomStyleBtn\" class=\"add-style-btn\">\n            <i class=\"fas fa-plus\"></i>\n          </button>\n        </div>\n      </div>\n      \n      <div id=\"customStylesContainer\" class=\"custom-styles-container\">\n      </div>\n    </div>\n    \n    <!-- 实时预览区域 -->\n    <div class=\"preview-section\">\n      <div class=\"preview-title\">\n        <i class=\"fas fa-eye\"></i>\n        <span>实时预览</span>\n      </div>\n      <div id=\"previewContainer\" class=\"preview-container\"></div>\n    </div>\n  </div>\n  \n  <!-- 隐藏的设置数据 -->\n  <div id=\"hiddenSettings\" style=\"display: none;\">\n    <div id=\"settingsDiv\">\n      <span id=\"duanpingSwitchValue\">${(data && data.段评开关) || 'true'}</span>\n      <span id=\"shenpingSwitchValue\">${(data && data.神评论开关) || 'true'}</span>\n      <span id=\"benzhangSwitchValue\">${(data && data.本章说开关) || 'true'}</span>\n      <span id=\"bubbleLargeSwitchValue\">${(data && data.气泡增大) || 'false'}</span>\n      <span id=\"duanpingStyleValue\">${(data && data.段评样式) || '0'}</span>\n      <span id=\"borderColorValue\">${(data && data.段评边框颜色) || '#A7A7A7'}</span>\n      <span id=\"fontColorValue\">${(data && data.段评字体颜色) || '#A7A7A7'}</span>\n      <span id=\"fillColorValue\">${(data && data.段评填充颜色) || 'transparent'}</span>\n      <span id=\"baseUrlValue\">${base_url}</span>\n      <span id=\"qttokenValue\">${qttoken}</span>\n    </div>\n    <textarea id=\"customStylesValue\" style=\"display: none;\">{}</textarea>\n  </div>\n  \n  <!-- Toast提示容器 -->\n  <div id=\"toastContainer\" class=\"toast-container\"></div>\n</div>\n\n<script>\n// SVG模板数据\nconst SVG_TEMPLATES = ${JSON.stringify(svgs)};\nconst STYLE_NAMES = ['起点样式', '番茄样式', '精致样式', '对话样式', '方框样式', '圆圈样式'];\n\n// Toast提示函数\nfunction showToast(message, type = 'info', duration = 2500) {\n  const container = document.getElementById('toastContainer');\n  const toast = document.createElement('div');\n  toast.className = 'toast';\n  \n  const icons = {\n    success: '<i class=\"fas fa-check\"></i>',\n    error: '<i class=\"fas fa-times\"></i>',\n    warning: '<i class=\"fas fa-exclamation-triangle\"></i>',\n    info: '<i class=\"fas fa-info-circle\"></i>',\n    loading: '<span class=\"loading-spinner\"></span>'\n  };\n  \n  toast.innerHTML = \\`\n    <div class=\"toast-icon \\${type}\">\\${icons[type] || icons.info}</div>\n    <div class=\"toast-content\">\\${message}</div>\n  \\`;\n  \n  container.appendChild(toast);\n  \n  setTimeout(() => {\n    toast.classList.add('fade-out');\n    setTimeout(() => {\n      container.removeChild(toast);\n    }, 300);\n  }, duration);\n}\n\nfunction showAlert(message) {\n  showToast(message, 'info');\n}\n\nfunction showSuccess(message) {\n  showToast(message, 'success');\n}\n\nfunction showError(message) {\n  showToast(message, 'error');\n}\n\nfunction showConfirm(message, onConfirm) {\n  const confirm = window.confirm(message);\n  if (confirm && onConfirm) {\n    onConfirm();\n  }\n}\n\n// 当前设置\nlet settings = {\n  '段评开关': '${(data && data.段评开关) || 'true'}',\n  '神评论开关': '${(data && data.神评论开关) || 'true'}',\n  '本章说开关': '${(data && data.本章说开关) || 'true'}',\n  '气泡增大': '${(data && data.气泡增大) || 'false'}',\n  '段评样式': '${(data && data.段评样式) || '0'}',\n  '段评边框颜色': '${(data && data.段评边框颜色) || '#A7A7A7'}',\n  '段评字体颜色': '${(data && data.段评字体颜色) || '#A7A7A7'}',\n  '段评填充颜色': '${(data && data.段评填充颜色) || 'transparent'}'\n};\n\n// 自定义样式对象 {\"自定义样式1\": \"<svg>...</svg>\", ...}\nlet customStyles = {};\nfunction initCustomStyles() {\n  customStyles = {};\n}\nfunction fetchCustomStyles() {\n  const baseUrl = document.getElementById('baseUrlValue').textContent;\n  const qttoken = document.getElementById('qttokenValue').textContent;\n  if (!baseUrl || !qttoken) {\n    return;\n  }\n  const url = baseUrl + '/user_settings?set_type=legado_para&qttoken=' + encodeURIComponent(qttoken);\n  fetch(url, {\n    method: 'GET',\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  }).then(response => response.json())\n    .then(data => {\n      if (data && data.data && data.data['自定义段评样式']) {\n        customStyles = data.data['自定义段评样式'];\n      }\n      updateHiddenSettings();\n      renderCustomStyles();\n      updateStyleSelector();\n      renderPreview();\n    })\n    .catch(err => {\n      console.error('获取自定义段评样式失败:', err);\n    });\n}\nfunction saveCustomStyles() {\n  const saveBtn = document.getElementById('saveCustomStyleBtn');\n  const baseUrl = document.getElementById('baseUrlValue').textContent;\n  const qttoken = document.getElementById('qttokenValue').textContent;\n  if (!baseUrl || !qttoken) {\n    showAlert('无法获取配置信息');\n    return;\n  }    \n  const url = baseUrl + '/user_settings?qttoken=' + encodeURIComponent(qttoken);\n  const body = {\n    legado_para: {\n        '段评开关': settings['段评开关'],\n        '神评论开关': settings['神评论开关'],\n        '本章说开关': settings['本章说开关'],\n        '气泡增大': settings['气泡增大'],\n        '段评样式': settings['段评样式'],\n        '段评边框颜色': settings['段评边框颜色'],\n        '段评字体颜色': settings['段评字体颜色'],\n        '段评填充颜色': settings['段评填充颜色'],\n        '自定义段评样式': customStyles\n    }\n  };\n  fetch(url, {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application/json'\n    },\n    body: JSON.stringify(body)\n  }).then(response => response.json())\n    .then(data => {\n      saveBtn.classList.remove('loading');\n      if (data && data.code === 0) {\n        showSuccess('保存成功');\n      } else {\n        showError('保存失败: ' + (data && data.message || '未知错误'));\n      }\n    })\n    .catch(err => {\n      console.error('保存自定义段评样式失败:', err);\n      showError('保存失败');\n    });\n}\n\n// HTML转义函数\nfunction htmlEscape(str) {\n  if (!str) return str;\n  return str.replace(/&/g, '&amp;')\n            .replace(/</g, '&lt;')\n            .replace(/>/g, '&gt;')\n            .replace(/\"/g, '&quot;')\n            .replace(/'/g, '&#039;');\n}\n\n// HTML反转义函数\nfunction htmlUnescape(str) {\n  if (!str) return str;\n  return str.replace(/&amp;/g, '&')\n            .replace(/&lt;/g, '<')\n            .replace(/&gt;/g, '>')\n            .replace(/&quot;/g, '\"')\n            .replace(/&#039;/g, \"'\");\n}\n\n// 更新隐藏设置\nfunction updateHiddenSettings() {\n  document.getElementById('duanpingSwitchValue').textContent = settings['段评开关'];\n  document.getElementById('shenpingSwitchValue').textContent = settings['神评论开关'];\n  document.getElementById('benzhangSwitchValue').textContent = settings['本章说开关'];\n  document.getElementById('bubbleLargeSwitchValue').textContent = settings['气泡增大'];\n  document.getElementById('duanpingStyleValue').textContent = settings['段评样式'];\n  document.getElementById('borderColorValue').textContent = settings['段评边框颜色'];\n  document.getElementById('fontColorValue').textContent = settings['段评字体颜色'];\n  document.getElementById('fillColorValue').textContent = settings['段评填充颜色'];\n  document.getElementById('customStylesValue').textContent = htmlEscape(JSON.stringify(customStyles));\n}\n\n// 获取下一个自定义样式名称\nfunction getNextStyleName() {\n  let count = 1;\n  while (customStyles['自定义样式' + count]) {\n    count++;\n  }\n  return '自定义样式' + count;\n}\n\n// 添加自定义样式\nfunction addCustomStyle() {\n  const name = getNextStyleName();\n  customStyles[name] = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"90\" viewBox=\"0 0 25 17\" fill=\"none\"><rect x=\"0.5\" y=\"0.5\" width=\"24\" height=\"16\" rx=\"2.5\" ry=\"2.5\" stroke=\"$color\" style=\"stroke-opacity: 0.5; fill: $tccolor; fill-opacity: 0.5;\"/><text x=\"12.5\" y=\"12\" text-anchor=\"middle\" font-size=\"10\" fill=\"$fontcolor\" font-family=\"Arial, sans-serif\">$displayText</text></svg>';\n  renderCustomStyles();\n  updateHiddenSettings();\n  updateStyleSelector();\n  renderPreview();\n}\n\n// 获取选中的样式名称\nfunction getSelectedStyleName() {\n  const styleValue = settings['段评样式'];\n  // 如果是数字，返回默认样式名称\n  if (!isNaN(styleValue)) {\n    return STYLE_NAMES[parseInt(styleValue)] || styleValue;\n  }\n  // 如果是自定义样式，返回自定义名称\n  return styleValue;\n}\n\n// 删除自定义样式\nfunction deleteCustomStyle(name) {\n  showConfirm('确定删除 \"' + name + '\" 吗？', function() {\n    delete customStyles[name];\n    if (settings['段评样式'] === name) {\n      settings['段评样式'] = '0';\n    }\n    renderCustomStyles();\n    updateHiddenSettings();\n    updateStyleSelector();\n    renderPreview();\n  });\n}\n\n// 更新自定义样式\nfunction updateCustomStyle(name, value) {\n  customStyles[name] = value;\n  updateHiddenSettings();\n  renderPreview();\n}\n\n// 重命名自定义样式\nfunction renameCustomStyle(oldName, newName) {\n  if (!newName || newName.trim() == '') return;\n  if (customStyles[newName] && newName != oldName) {\n    showAlert('名称已存在');\n    return;\n  }\n  customStyles[newName] = customStyles[oldName];\n  delete customStyles[oldName];\n  // 如果当前选中的是旧名称，更新为新名称\n  if (settings['段评样式'] === oldName) {\n    settings['段评样式'] = newName;\n  }\n  renderCustomStyles();\n  updateHiddenSettings();\n  updateStyleSelector();\n  renderPreview();\n}\n\n// 渲染自定义样式列表\nfunction renderCustomStyles() {\n  const container = document.getElementById('customStylesContainer');\n  container.innerHTML = '';\n  \n  if (Object.keys(customStyles).length === 0) {\n    container.innerHTML = '<div class=\"empty-custom-styles\">暂无自定义样式，点击上方\"+\"添加</div>';\n    return;\n  }\n  \n  Object.keys(customStyles).forEach((name, index) => {\n    const styleCard = document.createElement('div');\n    styleCard.className = 'custom-style-card';\n    // 转义SVG代码中的特殊字符\n    const escapedSvg = customStyles[name]\n      .replace(/&/g, '&amp;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;')\n      .replace(/\"/g, '&quot;')\n      .replace(/'/g, '&#039;');\n    \n    styleCard.innerHTML = \\`\n      <div class=\"custom-style-header\">\n        <input type=\"text\" class=\"style-name-input\" value=\"\\${name}\" data-original=\"\\${name}\">\n        <div class=\"style-actions\">\n          <button class=\"style-btn preview-btn\" title=\"预览\">\n            <i class=\"fas fa-eye\"></i>\n          </button>\n          <button class=\"style-btn delete-btn\" title=\"删除\">\n            <i class=\"fas fa-trash\"></i>\n          </button>\n        </div>\n      </div>\n      <textarea class=\"style-code-textarea\" rows=\"4\" placeholder=\"输入SVG代码...\">\\${escapedSvg}</textarea>\n      <div class=\"style-preview-small\">\n        <div class=\"preview-svg-container\"></div>\n      </div>\n    \\`;\n    \n    // 绑定事件\n    const nameInput = styleCard.querySelector('.style-name-input');\n    const codeTextarea = styleCard.querySelector('.style-code-textarea');\n    const deleteBtn = styleCard.querySelector('.delete-btn');\n    const previewBtn = styleCard.querySelector('.preview-btn');\n    \n    nameInput.addEventListener('change', () => {\n      const newName = nameInput.value.trim();\n      const originalName = nameInput.dataset.original;\n      if (newName != originalName) {\n        renameCustomStyle(originalName, newName);\n      }\n    });\n    \n    codeTextarea.addEventListener('input', () => {\n      updateCustomStyle(name, codeTextarea.value);\n      // 更新小预览\n      updateSmallPreview(styleCard.querySelector('.preview-svg-container'), codeTextarea.value);\n    });\n    \n    deleteBtn.addEventListener('click', () => deleteCustomStyle(name));\n    \n    previewBtn.addEventListener('click', () => {\n      // 设置为当前选中样式（使用自定义名称）\n      settings['段评样式'] = name;\n      document.getElementById('duanpingStyle').value = name;\n      updateHiddenSettings();\n      renderPreview();\n    });\n    \n    // 初始化小预览\n    updateSmallPreview(styleCard.querySelector('.preview-svg-container'), customStyles[name]);\n    \n    container.appendChild(styleCard);\n  });\n}\n\n// 更新小预览\nfunction updateSmallPreview(container, svgCode) {\n  try {\n    const preview = svgCode\n      .split('$color').join(settings['段评边框颜色'])\n      .split('$fontcolor').join(settings['段评字体颜色'])\n      .split('$tccolor').join(settings['段评填充颜色'])\n      .split('$displayText').join('99+');\n    container.innerHTML = preview;\n  } catch (e) {\n    container.innerHTML = '<span style=\"color: #999; font-size: 12px;\">解析失败</span>';\n  }\n}\n\n// 渲染预览\nfunction renderPreview() {\n  const container = document.getElementById('previewContainer');\n  container.innerHTML = '';\n  \n  // 添加默认样式\n  SVG_TEMPLATES.forEach((svgTemplate, index) => {\n    const svgContent = svgTemplate\n      .split('$color').join(settings['段评边框颜色'])\n      .split('$fontcolor').join(settings['段评字体颜色'])\n      .split('$tccolor').join(settings['段评填充颜色'])\n      .split('$displayText').join('99+');\n    \n    const item = document.createElement('div');\n    item.className = \\`preview-item \\${settings['段评样式'] === String(index) ? 'selected' : ''}\\`;\n    item.innerHTML = \\`\n      \\${svgContent}\n      <div class=\"preview-label\">\\${STYLE_NAMES[index]}</div>\n    \\`;\n    \n    item.addEventListener('click', () => {\n      settings['段评样式'] = String(index);\n      document.getElementById('duanpingStyle').value = String(index);\n      updateHiddenSettings();\n      renderPreview();\n    });\n    \n    container.appendChild(item);\n  });\n  \n  // 添加自定义样式预览\n  Object.keys(customStyles).forEach((name) => {\n    const svgCode = customStyles[name];\n    let svgContent;\n    try {\n      svgContent = svgCode\n        .split('$color').join(settings['段评边框颜色'])\n        .split('$fontcolor').join(settings['段评字体颜色'])\n        .split('$tccolor').join(settings['段评填充颜色'])\n        .split('$displayText').join('99+');\n    } catch (e) {\n      svgContent = '<svg width=\"60\" height=\"54\" viewBox=\"0 0 60 54\"><text x=\"30\" y=\"27\" text-anchor=\"middle\" fill=\"#999\" font-size=\"10\">解析失败</text></svg>';\n    }\n    \n    const item = document.createElement('div');\n    item.className = \\`preview-item \\${settings['段评样式'] === name ? 'selected' : ''}\\`;\n    item.innerHTML = \\`\n      \\${svgContent}\n      <div class=\"preview-label custom-label\">\\${name}</div>\n    \\`;\n    \n    item.addEventListener('click', () => {\n      settings['段评样式'] = name;\n      document.getElementById('duanpingStyle').value = name;\n      updateHiddenSettings();\n      renderPreview();\n    });\n    \n    container.appendChild(item);\n  });\n}\n\n// 初始化事件监听\nfunction setupEventListeners() {\n  // 段评开关\n  document.getElementById('duanpingSwitch').addEventListener('change', (e) => {\n    settings['段评开关'] = e.target.checked ? 'true' : 'false';\n    updateHiddenSettings();\n  });\n  \n  // 神评论开关\n  document.getElementById('shenpingSwitch').addEventListener('change', (e) => {\n    settings['神评论开关'] = e.target.checked ? 'true' : 'false';\n    updateHiddenSettings();\n  });\n  \n  // 本章说开关\n  document.getElementById('benzhangSwitch').addEventListener('change', (e) => {\n    settings['本章说开关'] = e.target.checked ? 'true' : 'false';\n    updateHiddenSettings();\n  });\n  \n  // 气泡增大开关\n  document.getElementById('bubbleLargeSwitch').addEventListener('change', (e) => {\n    settings['气泡增大'] = e.target.checked ? 'true' : 'false';\n    updateHiddenSettings();\n  });\n  \n  // 段评样式选择\n  document.getElementById('duanpingStyle').addEventListener('change', (e) => {\n    settings['段评样式'] = e.target.value;\n    updateHiddenSettings();\n    renderPreview();\n  });\n  \n  // 边框颜色选择器\n  document.getElementById('borderColor').addEventListener('input', (e) => {\n    const color = e.target.value;\n    settings['段评边框颜色'] = color;\n    document.getElementById('borderColorText').value = color;\n    updateHiddenSettings();\n    renderPreview();\n  });\n  \n  // 边框颜色文本输入\n  document.getElementById('borderColorText').addEventListener('input', (e) => {\n    const color = e.target.value;\n    if (/^#[0-9A-Fa-f]{6}$/.test(color) || /^#[0-9A-Fa-f]{3}$/.test(color)) {\n      settings['段评边框颜色'] = color;\n      document.getElementById('borderColor').value = color;\n      updateHiddenSettings();\n      renderPreview();\n    }\n  });\n  \n  // 字体颜色选择器\n  document.getElementById('fontColor').addEventListener('input', (e) => {\n    const color = e.target.value;\n    settings['段评字体颜色'] = color;\n    document.getElementById('fontColorText').value = color;\n    updateHiddenSettings();\n    renderPreview();\n  });\n  \n  // 字体颜色文本输入\n  document.getElementById('fontColorText').addEventListener('input', (e) => {\n    const color = e.target.value;\n    if (/^#[0-9A-Fa-f]{6}$/.test(color) || /^#[0-9A-Fa-f]{3}$/.test(color)) {\n      settings['段评字体颜色'] = color;\n      document.getElementById('fontColor').value = color;\n      updateHiddenSettings();\n      renderPreview();\n    }\n  });\n  \n  // 填充颜色选择器\n  document.getElementById('fillColor').addEventListener('input', (e) => {\n    const color = e.target.value;\n    settings['段评填充颜色'] = color;\n    document.getElementById('fillColorText').value = color;\n    updateHiddenSettings();\n    renderPreview();\n  });\n  \n  // 填充颜色文本输入\n  document.getElementById('fillColorText').addEventListener('input', (e) => {\n    const color = e.target.value;\n    if (color.toLowerCase() == 'transparent' || /^#[0-9A-Fa-f]{6}$/.test(color) || /^#[0-9A-Fa-f]{3}$/.test(color)) {\n      settings['段评填充颜色'] = color;\n      if (color.toLowerCase() != 'transparent') {\n        document.getElementById('fillColor').value = color;\n      }\n      updateHiddenSettings();\n      renderPreview();\n    }\n  });\n  \n  // 透明按钮\n  document.getElementById('fillColorTransparent').addEventListener('click', () => {\n    settings['段评填充颜色'] = 'transparent';\n    document.getElementById('fillColorText').value = 'transparent';\n    document.getElementById('fillColor').value = '#FFFFFF';\n    updateHiddenSettings();\n    renderPreview();\n  });\n  \n  // 添加自定义样式按钮\n  document.getElementById('addCustomStyleBtn').addEventListener('click', addCustomStyle);\n  \n  // 保存自定义样式按钮\n  document.getElementById('saveCustomStyleBtn').addEventListener('click', saveCustomStyles);\n  \n  // 更多样式按钮\n  document.getElementById('moreStylesBtn').addEventListener('click', () => {\n    const baseUrl = document.getElementById('baseUrlValue').textContent;\n    if (baseUrl) {\n      window.open(baseUrl + '/user?tab=3&btype=1', '_blank');\n    }\n  });\n}\n\n// 初始化UI\nfunction initUI() {\n  // 设置段评开关\n  document.getElementById('duanpingSwitch').checked = settings['段评开关'] != 'false';\n  \n  // 设置神评论开关\n  document.getElementById('shenpingSwitch').checked = settings['神评论开关'] != 'false';\n  \n  // 设置本章说开关\n  document.getElementById('benzhangSwitch').checked = settings['本章说开关'] != 'false';\n  \n  // 设置气泡增大开关\n  document.getElementById('bubbleLargeSwitch').checked = settings['气泡增大'] == 'true';\n  \n  // 设置段评样式\n  document.getElementById('duanpingStyle').value = settings['段评样式'];\n  \n  // 设置边框颜色\n  const borderColorValue = settings['段评边框颜色'];\n  document.getElementById('borderColor').value = borderColorValue === 'transparent' ? '#A7A7A7' : borderColorValue;\n  document.getElementById('borderColorText').value = borderColorValue;\n  \n  // 设置字体颜色\n  const fontColorValue = settings['段评字体颜色'];\n  document.getElementById('fontColor').value = fontColorValue === 'transparent' ? '#A7A7A7' : fontColorValue;\n  document.getElementById('fontColorText').value = fontColorValue;\n  \n  // 设置填充颜色\n  const fillColorValue = settings['段评填充颜色'];\n  document.getElementById('fillColor').value = fillColorValue === 'transparent' ? '#FFFFFF' : fillColorValue;\n  document.getElementById('fillColorText').value = fillColorValue;\n  \n  // 渲染自定义样式列表\n  renderCustomStyles();\n  \n  // 更新段评样式选择器，添加自定义样式选项\n  updateStyleSelector();\n}\n\n// 更新段评样式选择器\nfunction updateStyleSelector() {\n  const select = document.getElementById('duanpingStyle');\n  const currentValue = settings['段评样式'];\n  \n  // 移除所有非默认选项\n  while (select.options.length > 6) {\n    select.remove(6);\n  }\n  \n  // 添加自定义样式选项\n  Object.keys(customStyles).forEach((name) => {\n    const option = document.createElement('option');\n    option.value = name;\n    option.textContent = name;\n    select.appendChild(option);\n  });\n  \n  // 设置当前选中值\n  select.value = currentValue;\n}\n\n// 页面加载完成后初始化\ninitCustomStyles();\ninitUI();\nsetupEventListeners();\nrenderPreview();\nfetchCustomStyles();\n</script>\n</body>\n</html>\n    `;\n    let body;\n    try {\n        body = java.startBrowserAwait(`data:text/html;base64,${java.base64Encode(html)}`, '光遇段评设置', false).body();\n    } catch (e) {\n        if (islyc == \"安卓\") {\n            java.longToast(\"\\n当前软件版本过低，请更新软件，或者使用底部备用设置方案~\");\n        } else {\n            java.longToast(\"\\n请点击页面右上角√才能设置成功哦~\");\n        }\n        return;\n    }\n    \n    let settings = {};\n    try {\n        const getSpanText = (spanId) => {\n            const regex = new RegExp('id=\"' + spanId + '\"\\s*>\\s*([^<]*?)\\s*<\\/span>');\n            const match = body.match(regex);\n            return match ? match[1].trim() : \"\";\n        };\n        const getTextareaValue = (textareaId) => {\n            const regex = new RegExp('<textarea[^>]*id=\"' + textareaId + '\"[^>]*>([\\\\s\\\\S]*?)<\\/textarea>', 'i');\n            const match = body.match(regex);\n            return match ? match[1].trim() : \"\";\n        };\n        const htmlDecode = (str) => {\n            if (!str) return str;\n            return str.replace(/&amp;/g, '&')\n                .replace(/&lt;/g, '<')\n                .replace(/&gt;/g, '>')\n                .replace(/&quot;/g, '\"')\n                .replace(/&#039;/g, \"'\");\n        };\n\n        const customStylesValue = getTextareaValue('customStylesValue') || '{}';\n        const decodedStyles = htmlDecode(customStylesValue);\n\n        settings = {\n            '段评开关': getSpanText('duanpingSwitchValue'),\n            '神评论开关': getSpanText('shenpingSwitchValue'),\n            '本章说开关': getSpanText('benzhangSwitchValue'),\n            '气泡增大': getSpanText('bubbleLargeSwitchValue'),\n            '段评样式': getSpanText('duanpingStyleValue') || '0',\n            '段评边框颜色': getSpanText('borderColorValue') || '#A7A7A7',\n            '段评字体颜色': getSpanText('fontColorValue') || '#A7A7A7',\n            '段评填充颜色': getSpanText('fillColorValue') || 'transparent',\n            '自定义段评样式': JSON.parse(decodedStyles),\n        };\n        const settingsText = Object.keys(settings).map(key => `${key}: ${settings[key]}`).join('\\n');\n        java.longToast(\"\\n\" + settingsText);\n    } catch (e) {\n        settings = {\n            '段评开关': 'true',\n            '神评论开关': 'true',\n            '本章说开关': 'true',\n            '气泡增大': 'false',\n            '段评样式': '0',\n            '段评边框颜色': '#A7A7A7',\n            '段评字体颜色': '#A7A7A7',\n            '段评填充颜色': 'transparent',\n            '自定义段评样式': {},\n        };\n    }\n    this.setVariable(\"段评设置\", settings, false);\n}\n", "lastUpdateTime": "1784782157066", "loginUi": "[\n     {\n        \"name\": \"🔭 切换线路\",\n        \"type\": \"button\",\n        \"action\": \"getServerSettings()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },{\n        \"name\": \"⚙️ 书源设置\",\n        \"type\": \"button\",\n        \"action\": \"getHtmlSettings()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },  {\n        \"name\": \"🗨 段评设置\",\n        \"type\": \"button\",\n        \"action\": \"getSvgSettings()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },{\n        \"name\": \"邮箱\",\n        \"type\": \"text\"\n    }, {\n        \"name\": \"密码\",\n        \"type\": \"password\"\n    }, {\n        \"name\": \"🔅登录账号\",\n        \"type\": \"button\",\n        \"action\": \"login(true)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"🔐注册账号\",\n        \"type\": \"button\",\n        \"action\": \"register()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \" 🔚 退出登录\",\n        \"type\": \"button\",\n        \"action\": \"logout()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🏝用户后台\",\n        \"type\": \"button\",\n        \"action\": \"user()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },{\n        \"name\": \"📴 清理设备\",\n        \"type\": \"button\",\n        \"action\": \"clearDevice()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },{\n        \"name\": \"🪪 查看信息\",\n        \"type\": \"button\",\n        \"action\": \"checkStatus()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },{\n        \"name\": \"🌷求打赏\",\n        \"type\": \"button\",\n        \"action\": \"vip()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },{\n        \"name\": \"🎈永久发布页\",\n        \"type\": \"button\",\n        \"action\": \"fb()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },{\n        \"name\": \"✳️ 更新配置\",\n        \"type\": \"button\",\n        \"action\": \"_getCloudSettings()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    },{\n        \"name\": \"❇️ 更新书源\",\n        \"type\": \"button\",\n        \"action\": \"renderVersionPage()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"📤保存设置到云端\",\n        \"type\": \"button\",\n        \"action\": \"saveSettings()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \" 📨从云端获取设置\",\n        \"type\": \"button\",\n        \"action\": \"getSettings()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"⛔‼️ 清空还原设置\",\n        \"type\": \"button\",\n        \"action\": \"deleteVariable()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"===下方为备用设置方案===\",\n        \"type\": \"button\",\n        \"action\": \"\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"📖搜索小说\",\n        \"type\": \"button\",\n        \"action\": \"ste('小说')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"🎧搜索听书\",\n        \"type\": \"button\",\n        \"action\": \"ste('听书')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"🎥搜索短剧\",\n        \"type\": \"button\",\n        \"action\": \"ste('短剧')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"🎨搜索漫画\",\n        \"type\": \"button\",\n        \"action\": \"ste('漫画')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"段评开关\",\n        \"type\": \"button\",\n        \"action\": \"ste('段评')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    }, {\n        \"name\": \"图片开关\",\n        \"type\": \"button\",\n        \"action\": \"ste('图片')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    }, {\n        \"name\": \"简介开关\",\n        \"type\": \"button\",\n        \"action\": \"ste('简介')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    }, {\n        \"name\": \"同步书架\",\n        \"type\": \"button\",\n        \"action\": \"ste('同步')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    }, {\n        \"name\": \"强制搜索\",\n        \"type\": \"button\",\n        \"action\": \"ste('强制')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    }, {\n        \"name\": \"网络模式\",\n        \"type\": \"button\",\n        \"action\": \"ste('网络')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    }, {\n        \"name\": \"目录显示来源开关\",\n        \"type\": \"button\",\n        \"action\": \"ste('目录')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"发现页来源(支持的平台请前往源变量中查看)\",\n        \"type\": \"text\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"搜索来源(支持的平台请前往源变量中查看,多个来源用英文逗号分割)\",\n        \"type\": \"text\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    }, {\n        \"name\": \"设置发现页来源\",\n        \"type\": \"button\",\n        \"action\": \"setFindSource()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"设置搜索来源\",\n        \"type\": \"button\",\n        \"action\": \"setSearchSource()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.4\n        }\n    }\n]", "loginUrl": "//登陆\nfunction login(flag) {\n    const token = getToken();\n    if (String(token).length > 10) {\n        java.longToast(flag ? '\\n当前✅️已登录，请🚫退出登录后重新登录' : '\\n✅️已登录');\n        return true;\n    }\n    if (flag == undefined) {\n        result = JSON.parse(source.getLoginInfo())\n    } else {\n        java.longToast(\"\\n\\n💞正在登录中...\")\n    }\n    let email = result.邮箱;\n    let pwd = result.密码;\n\n    if (!email || !pwd) {\n        java.longToast('\\n请先输入账号密码！');\n        return false;\n    }\n    if (!email.includes('@')) {\n        java.longToast('\\n请输入正确的邮箱格式！');\n        return false;\n    }\n    try {\n        let data = request('/login_api','POST',{\n                register_email: email,\n                password: pwd\n            })\n        const response = JSON.parse(data);\n        if (response.code == 0) {\n            setAllCookies(`qttoken=${response.key}`);\n            java.longToast(\"\\n✅️登录成功\");\n            return true;\n        } else {\n            let msg = response.msg;\n            if (msg.includes('多次登录失败')) {\n                java.longToast('\\n💔多次登录失败，请检查账号密码，切换线路后重试或等2小时后重试！');\n            } else {\n                java.longToast('\\n💔' + (msg || \"登录失败，请重试！\"));\n            }\n            return false;\n        }\n    } catch (error) {\n        java.longToast('\\n💔登录失败，服务器错误，请更换线路后重试！\\n' + error);\n        return false;\n    }\n}\n\n// 用户注册\nfunction register() {\n    java.startBrowserAwait(BaseUrl() + '/register', '光遇看书注册');\n}\n\n//用户后台\nfunction user() {\n    const token = getToken();\n    if (String(token).length < 10) {\n        java.longToast('\\n🤔请先登陆');\n        return;\n    }\n    java.startBrowserAwait(BaseUrl() + '/user', '光遇看书用户后台');\n}\n\n// 退出登陆\nfunction logout() {\n    removeAllCookies();\n}\n\n// 获取云端配置\nfunction _getCloudSettings() {\n    getCloudSettings(true)\n}\n\n//打赏\nfunction vip() {\n    const token = getToken();\n    if (String(token).length < 10) {\n        java.longToast('\\n🤔请先登陆');\n        return;\n    }\n    java.startBrowserAwait(BaseUrl() + '/coffee', '光遇聚合会员开通');\n}\n\nfunction formatDate(timestamp) {\n    const date = new Date(timestamp * 1000);\n    return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;\n}\n\nfunction isVips(res) {\n    const vipEndTime = res.vip_end_time;\n    const isVipValue = res.is_vip;\n\n    let vipType;\n    if (isVipValue == 0) {\n        return '普通用户';\n    } else if (isVipValue == 1) {\n        vipType = 'VIP';\n    } else {\n        vipType = 'SVIP';\n    }\n\n    if (!vipEndTime || vipEndTime == 0) {\n        return `${vipType} (已过期)`;\n    }\n\n    const currentTime = Math.floor(Date.now() / 1000);\n    const remainingDays = Math.ceil((vipEndTime - currentTime) / (24 * 60 * 60));\n\n    if (currentTime > vipEndTime) {\n        return `${vipType} (已过期)`;\n    }\n\n    if (remainingDays <= 7) {\n        return `${vipType} 剩余${remainingDays}天`;\n    }\n\n    if (vipEndTime >= 1912946812) {\n        return `${vipType} (永久)`;\n    }\n\n    return `${vipType}(${formatDate(vipEndTime)})`;\n}\n\nfunction checkStatus() {\n    const token = getToken();\n    if (String(token).length < 10) {\n        java.longToast('\\n🤔请先登陆');\n        return;\n    }\n    java.longToast('\\n\\n♻️查询中...');\n\n    try {\n        const res = JSON.parse(request(`/user_api`, 'POST'));\n\n        if (res.id == undefined) {\n            throw new Error(res.msg || '获取用户信息失败');\n        }\n\n        result.邮箱 = res.email;\n        \n        source.putLoginInfo(JSON.stringify(result));\n\n        let devices = 0;\n        try {\n            devices = res.device ? Object.keys(JSON.parse(res.device)).length : 0;\n        } catch (e) {\n            devices = res.device ? 1 : 0;\n        }\n\n        const isVip = isVips(res);\n        const today = java.timeFormat(new Date()).slice(0, 10);\n        const lastReadDate = res.last_read_time ? java.timeFormat(res.last_read_time * 1000).slice(0, 10) : '';\n        const todayReadCount = today == lastReadDate ? res.day_read_count : 0;\n\n        const tips = `\n${BaseUrl()}\n┏┅┅┅┅┅┅┱┄┄┄┄┄┄┄┄┄┄┐\n　 🧢昵称 　　　　${(res.nickname || '未设置').padEnd(20, '\\t')}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　✉️邮箱　　　　${res.email.replace(/(.{3}).*?@/, '$1***@').padEnd(20, '\\t')}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　🔑密钥　　　　${(`${res.user_key.substring(0, 4)}***${res.user_key.slice(-4)}`).padEnd(20, '\\t')}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　📅注册时间　　${java.timeFormat(res.register_time * 1000).padEnd(20, '\\t')}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n🗒️今日阅读　　${todayReadCount.toString().padEnd(20, '\\t')}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n📚累计阅读　　${res.all_read_count.toString().padEnd(20, '\\t')}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n🕓最后阅读　　${(res.last_read_time ? java.timeFormat(res.last_read_time * 1000) : '未阅读').padEnd(20, '\\t')}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n📱在线设备　　${devices.toString().padEnd(20, '\\t')}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　👑会员状态　　${isVip.padEnd(20, '\\t')}\n┣┅┅┅┅┅┅╉┄┄┄┄┄┄┄┄┄┄┤\n　🚫封禁状态　　${res.is_banned ? '已封禁' : '正常　'}　　　　　　　\n┗┅┅┅┅┅┅┹┄┄┄┄┄┄┄┄┄┄┘\n`;\n\n        java.log(tips);\n        java.longToast(tips);\n\n    } catch (e) {\n        java.toast(`\\n检测登录失败\\n${e.message}`);\n    }\n}\n\nfunction clearDevice() {\n    const token = getToken();\n    if (String(token).length < 10) {\n        java.longToast('\\n🤔请先登陆');\n        return;\n    }\n    let res = request(`/clear`, \"POST\");\n    res = JSON.parse(res);\n    java.toast(res.code == 0 ? \"\\n\\n📴设备清除成功\" : res.msg)\n    //Packages.java.lang.Thread.sleep(500)\n    //checkStatus()\n}\n\nfunction fb() {\n    java.startBrowser('http://vip.gyks.cf', '光遇看书');\n}\n\nfunction setFindSource() {\n\tlet findSource = result[\"发现页来源(支持的平台请前往源变量中查看)\"];\n\tif (String(findSource)==\"\" || String(findSource) == \"undefined\") {\n\t\tfindSource = \"番茄\";\n\t\t}\n\tsetVariable(\"发现页来源\",findSource);\n java.longToast(`\\n已设置发现页来源为:${findSource}\\n设置后请刷新发现页！`)\n \n\t}\n\t\n\t\nfunction setSearchSource() {\n\tlet searchSource = result[\"搜索来源(支持的平台请前往源变量中查看,多个来源用英文逗号分割)\"];\n\tif (String(searchSource)==\"\" || String(searchSource) == \"undefined\") {\n\t\tsearchSource = '全部';\n\t\t}\n\tlet moreSettings = getVariable(\"更多设置\") || {};\n\tlet tab = moreSettings && moreSettings['搜索模式'] || '小说';\n\tmoreSettings[tab] = searchSource;\n\tsetVariable(\"更多设置\",moreSettings)\n  java.longToast(`\\n已设置搜索来源为:${tab}-${moreSettings[tab]}\\n设置后请重新搜索`)\n\t}\n\nfunction saveSettings() {\n\t  java.longToast(`\\n正在保存~`);\n    let moreSettings = getVariable(\"更多设置\") || {};\n    let body_more = {\n        \"legado_more\":moreSettings\n    }\n\tlet data_more = request('/user_settings','POST',body_more)\n    const response_more = JSON.parse(data_more);\n    let paraSettings = getVariable(\"段评设置\") || {};\n    let body_para = {\n        \"legado_para\":paraSettings\n    }\n\tlet data_para = request('/user_settings','POST',body_para)\n    const response_para = JSON.parse(data_para);\n    java.longToast(`\\n书源设置:${response_more.msg}\\n段评设置:${response_para.msg}`);\n\t}\n    \n    function getSettings() {\n    \tjava.longToast(`\\n正在获取~`);\n        let more = false;\n        let para = false;\n        let data_more = request('/user_settings?set_type=legado_more','GET');\n        const response_more = JSON.parse(data_more);\n        if (response_more.data) {\n            setVariable(\"更多设置\",response_more.data)\n            more = true;\n        }\n        let data_para = request('/user_settings?set_type=legado_para','GET');\n        const response_para = JSON.parse(data_para);\n        if (response_para.data) {\n            setVariable(\"段评设置\",response_para.data)\n            para=true;\n        }\n        java.longToast(`\\n书源设置:${more?'应用成功':'应用失败'}\\n段评设置:${para?'应用成功':'应用失败'}`);\n    }", "respondTime": 180000, "ruleBookInfo": {"author": "$.author", "canReName": "1", "coverUrl": "$.thumb_url", "init": "<js>\nlet moreSettings = getVariable('更多设置');\n\n\nfunction fetchBookDetail(result) {\n\t  let res = {};\n\t  //java.log(baseUrl)\n\t  //java.longToast(result)\n\t  if (String(baseUrl).startsWith(\"data:\")) {\n    res = JSON.parse(java.hexDecodeToString(result));\n    } else {\n    \treturn result;\n    \t}\n    const book_id = res.book_id;\n    const tab = res.tab;\n    const sources = res.sources || res.source;\n    const url = res.url;\n    let html = \"\";\n    const proxy  = moreSettings && moreSettings['网络模式'] || '服务器';\n\n    if (url && proxy == \"本地\") {\n        html = fetchHtmlWithFallback(url, sources);\n    }\n\n    const varia = getAndFormatCustomVariable();\n    const requestUrl = `/detail?book_id=${book_id}&source=${sources}&tab=${tab}&variable=${varia}`;\n\n    java.log(requestUrl);\n    return request(requestUrl, 'POST', { html: html });\n}\n\nfunction fetchHtmlWithFallback(url, sources) {\n    let html;\n    let ck69 = '';\n    let headers = {};\n    let op = '';\n\n    if (sources == '69书吧') {\n        ck69 = String(cookie.getCookie('https://www.69shuba.com'));\n        headers = {\n            \"Referer\": url,\n            \"Cookie\": ck69,\n            \"User-Agent\": java.getWebViewUA()\n        };\n        op = JSON.stringify({ \"headers\": headers });\n        html = java.ajax(`${url},${op}`);\n    } else {\n        html = java.ajax(url);\n    }\n\n    if (html.includes(\"Just a moment...\") && sources == '69书吧') {\n        cookie.removeCookie('https://www.69shuba.com');\n        java.longToast('需要真人验证，请进入任意书籍详情页过验证');\n        html = java.startBrowserAwait(url, \"需要真人验证，请进入任意书籍详情页过验证\").body();\n    }\n\n    return html;\n}\n\nfunction getAndFormatCustomVariable() {\n    let varia = String(book.getVariable('custom'));\n    if (varia === 'null') {\n        varia = '';\n    }\n    return JSON.stringify({ 'custom': varia });\n}\nfetchBookDetail(result)\n</js>$.data", "intro": "<js>\nconst {\n    source:sources,\n    book_id,\n    tab,\n    book_tts,\n    tags,\n    role,\n    last_chapter_title,\n    last_chapter_update_time,\n    word_number,\n    status,\n    score,\n    abstract,\n    copyright_info,\n    read_count,\n    read_count_all\n} = result;\nlet moreSettings = getVariable('更多设置');\n\n\nconst proxy = (moreSettings && moreSettings['网络模式'] || '服务器') == \"本地\" ? \"本地网络\" : \"服务器网络\";\n\nif ((book.readConfig && book.readConfig.useReplaceRule) == null) {\n    book.setUseReplaceRule(false);\n}\n\nlet nickname = '账号状态：⚠️ 未登录 | 点击右上角 🔖 登录';\nlet qttoken = getToken();\nif (qttoken.length > 10) {\n     nickname = '账号状态：✅已登录';\n}\ntry {\n    const user_info = JSON.parse(request(`/get_avatar`, 'GET'));\n    if (user_info.code === 0) {\n        nickname = user_info.nickname \n            ? `欢迎回来：${user_info.nickname}`\n            : `欢迎回来：${user_info.email}(请前往用户后台设置用户名)`;\n    }\n} catch (e) {\n    \n}\n\nconst loginStatus = nickname;\nconst lightDivider = \"❇️───────❇️───────❇️\";\nconst heavyDivider = \"&lrm;\\n&lrm;\";\n\nconst isValid = (value) => String(value).length > 1;\nlet ctitle =  book.durChapterTitle || '未开始';\n\nconst formatAbstract = (text) => {\n    return text.split(\"\\n\").map(line => `    ${line}`).join(\"\\n\");\n};\n\nconst buildBasicInfo = (items) => {\n    let info = \"\";\n    for (let [value, prefix, icon] of items) {\n        if (isValid(value)) {\n            info += `    ${icon} ${prefix} ${value}\\n`;\n        }\n    }\n    return info;\n};\n\nlet info = `\n    📡 当前服务：${BaseUrl()}\n    🔑 ${loginStatus}\n    🏷 数据来源：${sources}\n    🔄 当前模式：${tab}\n    ⚙️ 访问模式：${proxy}\n    📖 阅读至：${ctitle}\n`;\n\nif (tab == \"听书\") {\n    let toneId = String(book.getVariable('custom')) || '4';\n    if (isValid(book_tts)) {\n        info += `${lightDivider}\n    🎵 音色配置：${toneId}\n    ✨ AI音色请点击右上角书籍变量填写相关值，真人听书请重新搜索选择带有主播的书籍\n    ${book_tts}\n`;\n    }\n}\n\nconst fullBasicInfo = buildBasicInfo([\n    [tags, \"书籍分类：\", \"🌈\"],\n    [role, \"书籍主角：\", \"👑\"],\n    [last_chapter_title, \"最新章节：\", \"📚\"],\n    [last_chapter_update_time, \"更新时间：\", \"⏳\"],\n    [word_number, \"书籍字数：\", \"📝\"],\n    [status, \"书籍状态：\", \"🚩\"],\n    [score, \"书籍评分：\", \"⭐\"],\n    [read_count, \"今阅读人数：\", \"📃\"],\n    [read_count_all, \"总阅读人数：\", \"📈\"]\n]);\n\nif (fullBasicInfo) {\n    info += `${lightDivider}\\n${fullBasicInfo}`;\n}\n\nif (isValid(abstract)) {\n    info += `${heavyDivider}\n    📖 书籍简介：\n${formatAbstract(abstract)}\n`;\n} else {\n    info += heavyDivider;\n}\n\nif (isValid(copyright_info)) {\n    info += `${lightDivider}\n    © ${copyright_info}\n`;\n} else {\n    info += lightDivider;\n}\n\ninfo += `\n${heavyDivider}\n    数据更新于 ${new Date().toLocaleString()}\n`;\n\nconst abstractMode = moreSettings && moreSettings['完整简介'] || 'true';\nif (abstractMode == \"false\") {\n    const simplifiedBasicInfo = buildBasicInfo([\n        [last_chapter_title, \"最新章节：\", \"📚\"],\n        [last_chapter_update_time, \"更新时间：\", \"⏳\"],\n        [word_number, \"书籍字数：\", \"📊\"],\n        [status, \"书籍状态：\", \"🚩\"],\n        [score, \"书籍评分：\", \"⭐\"]\n    ]);\n    \n    info = `\\n&lrm;${isValid(abstract) ? `📖 书籍简介：\\n${formatAbstract(abstract)}\\n${heavyDivider}` : ''}\n🏷 数据来源：${sources}\n${simplifiedBasicInfo}`;\n\n} else {\n    info = info.split(\"\\n\").map(line => line.replace(/^ {4}/, \"\")).join(\"\\n\");\n}\n</js>", "lastChapter": "{{$.source}} {{$.last_chapter_title}} {{$.last_chapter_update_time}}", "name": "$.book_name", "tocUrl": "<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet book_name = result.book_name;\nlet author = result.author;\nlet abstract = result.abstract;\nlet thumb_url = result.thumb_url;\nlet tab = result.tab || getVariable('类型');\nlet url = result.toc_url || \"\";\nlet gycatalog = {\n\t  book_name,\n\t  author,\n\t  abstract,\n\t  thumb_url,\n    book_id,\n    sources,\n    tab,\n    url,\n};\ngycatalog = java.base64Encode(JSON.stringify(gycatalog));\n`data:;base64,${gycatalog},{\"type\":\"gycatalog\"}`;\n</js>", "wordCount": "$.word_number"}, "ruleContent": {"content": "<js>\nlet DEFAULT_TONE_ID = '4';\nlet CONTENT_URL = '/content';\nlet CONTENT_URL_WITH_REVIEW = '/content?review=1';\nlet VERSION = localVersion;\nlet SOURCES_WITH_REVIEW = ['番茄', '七猫', '塔读', 'QQ阅读', 'svip_QQ阅读'];\nlet moreSettings = getVariable('更多设置');\nconst proxy  = moreSettings && moreSettings['网络模式'] || '服务器';\nconst reading = moreSettings && moreSettings['同步书架'] || 'false';\nconst reading_toast = moreSettings && moreSettings['同步弹窗'] || 'true';\n\nresult = String(java.hexDecodeToString(result));\nlet res = JSON.parse(result);\nlet { book_id, item_id, tab, title, sources, url } = res;\n\nlet islyc = checkEnv();\ntry {\n    book.imageStyle = islyc == '改版' ? 'FULL' : 'TEXT';\n} catch (e) {\n    \n}\n\nconst syncBookShelf = (book) => {\n    if (!book) {\n        return;\n    }\n    let book_order = book.order;\n    if (book_order!=0) {\n    \t   book_order = 1;\n    \t} else {\n    \t\t//book_order = 2;\n    \t\treturn;\n    \t\t}\n    \n    if (reading != \"true\") {\n        return;\n    }\n\n    try {\n        const ritem = item_id;\n        \nlet book_info = {\n            book_name:book.name,\n            author:book.author,\n            //abstract:book.abstract,\n            thumb_url:book.coverUrl,\n            book_id,\n            tab,\n            source: sources\n        };\n        if (!book_info || typeof book_info != \"object\") {\n            return;\n        }\n        const rurl = `/add_book_to_book_shelf`;\n        book_info.read_status = book_order;\n        book_info.last_chapter_item_id = item_id;\n        book_info.last_chapter_title = chapter.title || \"\";\n        //java.toast(JSON.stringify(book_info));\n       \ttry {\n       \t\tconst check_book_url = `/check_book_in_book_shelf`;\n    checkResponse = request(check_book_url, \"POST\", {book_id,source:sources,tab});\n} catch (e) {\n    java.log(`检查书籍请求失败: ${e}`);\n}\n    \n        const check_data = parseJsonSafely(checkResponse);\n        try {\n            if (check_data.data.id) {\n                book_info.id = check_data.data.id;\n                const uurl = `/update_book_shelf`;\n                let up = request(uurl, \"POST\", book_info);\n                if (reading_toast == \"true\") {\n                \t    java.toast(up)\n                \t}\n                \n            } else {\n                let up = request(rurl, \"POST\", book_info);\n                if (reading_toast == \"true\") {\n                \t    java.toast(up)\n                \t}\n            }\n        } catch (e) {\n            try {\n                let up = request(rurl, \"POST\", book_info);\n                java.toast(up)\n            } catch (e) {\n                if (reading_toast == \"true\") {\n                \t    java.toast(`书架操作失败: ${e}`);\n                \t}\n            }\n\n        }\n    } catch (error) {\n        java.log(`书籍同步流程异常: ${error}`);\n        \n        if (reading_toast == \"true\") {\n                \t    java.longToast(\"\\n同步阅读进度失败，但不影响阅读，可以前往登录关闭书架同步功能。\");\n                \t}\n    }\n};\n\n//java.log(book)\n\n\nif (book.durChapterIndex == chapter.index) {\n\ttry {syncBookShelf(book)} catch {}\n\t}\n\n\n\n\nlet varia1 = String(book.getVariable('custom')) || '';\nlet varia = JSON.stringify({ custom: varia1 });\n\n\nlet html = '';\n\nif (url && proxy === '本地') {\n    if (sources === '69书吧') {\n        let ck69 = String(cookie.getCookie('https://www.69shuba.com'));\n        let headers = {\n            Referer: url,\n            Cookie: ck69,\n            'User-Agent': java.getWebViewUA()\n        };\n        let op = JSON.stringify({ headers });\n        html = java.ajax(`${url},${op}`);\n    } else {\n        html = java.ajax(url);\n    }\n    \n    if (html.includes('Just a moment...') && sources == '69书吧' && book.durChapterIndex == chapter.index) {\n        cookie.removeCookie('https://www.69shuba.com');\n        java.longToast('需要真人验证，请进入任意书籍详情页过验证');\n        html = java.startBrowserAwait(url, '需要真人验证，请进入任意书籍详情页过验证').body();\n    }\n}\n\nlet tone_id = varia1 || DEFAULT_TONE_ID;\nlet base_url = BaseUrl();\nlet dpSettings = getVariable('段评设置');\nlet para = dpSettings && dpSettings['段评开关'] || 'true';\nlet godop = dpSettings && dpSettings['神评论开关'] || 'true';\nlet endop = dpSettings && dpSettings['本章说开关'] || 'true';\nlet show_img = moreSettings && moreSettings['显示图片'] || 'true';\n\n\nlet god = false;\n\nif (sources == \"番茄\" && godop == 'true' && tab == \"小说\") {\n\tgod = true\n\t}\nlet params = {\n    html,\n    item_id,\n    source: sources,\n    tab,\n    tone_id,\n    variable: varia,\n    version: VERSION,\n    god\n};\n\nlet hasReview = SOURCES_WITH_REVIEW.includes(sources) && para==\"true\" && tab == '小说';\nlet content_url = hasReview ? CONTENT_URL_WITH_REVIEW : CONTENT_URL;\n\nlet data = request(content_url, 'POST', params);\ntry {\n    data = JSON.parse(data);\n    if (data.msg) {\n        java.toast(data.msg);\n    }\n} catch (e) {\n    //console.error('Parse content data failed:', e);\n}\n\nlet content = data.content || '';\n\nif (show_img == 'false') {\n    content = removeAllImgTags(content);\n}\n\nlet fqssionid = getFqToken();\nlet deviceType = '安卓';\n    try {\n    \tjava.deviceID();\n    \tdeviceType = '苹果'\n    \t} catch {}\nif (hasReview) {\n    content = content\n        .replace(/ident=\"/g, `ident=\"${base_url}`)\n        .replace(/book_id=/g, `book_id=${book_id}&ssionid=${fqssionid}`);\n    \n    content = deviceType == '苹果' \n        ? paraForiOS(content, sources) \n        : paraForAndroid(content, sources);\n}\nif (sources == \"番茄\" && endop == 'true' && tab == \"小说\") {\n   let svg = `${base_url}/chapter_review_svg?book_id=${book_id}&item_id=${item_id}&source=${sources}&ssionid=${fqssionid}`;\n\tlet eurl = `${base_url}/get_review?book_id=${book_id}&item_id=${item_id}&source=${sources}`;\n   if (deviceType == '苹果') {\n     let chapterSvg = java.ajax(svg);\n     svg = 'data:image/svg+xml;base64,'+java.base64Encode(chapterSvg);\n   } else {\n     svg += '&img=1'\n   }\n\tcontent = content+ `\\n<img src=\"${svg},{'type':'qtbzs',${endclick(eurl)},'style':'FULL'}\">`;\n\t}\ndata = JSON.stringify({ content });\n\nlet isVideoSource = isVs(sources);\nlet isVideoTab = tab == '短剧' || tab == '视频';\nif (islyc != '苹果' && (isVideoTab || isVideoSource)) {\n\tjava.log(isVideoSource)\n    if (!java.getAppVariant || isVideoSource) {\n        data = JSON.stringify({\n            content: `【右上角刷新】开启播放(下一集请切换下一章刷新)\\n播放直链：\\n${content}`\n        });\n        if (book.durChapterIndex == chapter.index) {\n            let video_url = `${base_url}/online_video?book_id=${book_id}&source=${sources}&tab=${tab}`;\n            if (isVideoSource) {\n                video_url = content;\n            }\n            //java.openVideoPlayer(content, title)\n            java.startBrowser(video_url, title);\n            java.toast('正在加载视频...');\n        }\n        \n    }\n\n\n}\n//java.log(data)\ndata;\n</js>$.content", "title": "@js:\nresult = String(java.hexDecodeToString(result))\nJSON.parse(result)['title'].replace(JSON.parse(result)['sources']+':','')"}, "ruleExplore": {"author": "$.author", "bookList": "$.data", "bookUrl": "<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '小说';\nlet url = result.toc_url || '';\n\nlet gydetail = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url\n}\ngydetail = java.base64Encode(JSON.stringify(gydetail));\n`data:;base64,${gydetail},{\"type\":\"gydetail\"}`\n</js>", "coverUrl": "$.thumb_url", "intro": "$.abstract", "kind": "{{$.status}},{{$.score}},{{$.tags}},{{$.last_chapter_update_time}}", "lastChapter": "{{$.source}} {{$.last_chapter_title}}", "name": "$.book_name##（别名：.*?）", "wordCount": "$.word_number"}, "ruleSearch": {"author": "$.author", "bookList": "<js>\nconst res = JSON.parse(java.hexDecodeToString(result));\nconst {\n    key,\n    tab,\n    sourcesKey,\n    page,\n    disabled_sources\n} = res;\nlet url = `/search?title=${key}&tab=${tab}&source=${sourcesKey}&page=${page}&disabled_sources=${disabled_sources}`;\nrequest(url);\n</js>\n$.data", "bookUrl": "<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '小说';\nlet url = result.toc_url || '';\n\nlet gydetail = {\n    book_id: book_id,\n    sources: sources,\n    tab: tab,\n    url: url\n}\ngydetail = java.base64Encode(JSON.stringify(gydetail));\n`data:;base64,${gydetail},{\"type\":\"gydetail\"}`\n</js>", "checkKeyWord": "我的@番茄", "coverUrl": "$.thumb_url", "intro": "$.abstract", "kind": "{{$.status}},{{$.score}},{{$.tags}},{{$.last_chapter_update_time}}", "lastChapter": "{{$.source}} {{$.last_chapter_title}}", "name": "$.book_name##（别名：.*?）", "wordCount": "$.word_number"}, "ruleToc": {"chapterList": "<js>\nconst res = JSON.parse(java.hexDecodeToString(result));\nconst {\n\tbook_name,\n\tauthor,\n\tabstract,\n\tthumb_url,\n    book_id,\n    tab,\n    sources,\n    url\n} = res;\nlet durChapterIndex = book.durChapterIndex;\njava.put('book_id', book_id);\nlet html = \"\";\nlet moreSettings = getVariable('更多设置');\nconst proxy = moreSettings && moreSettings['网络模式'] || '服务器';\nconst showSource = moreSettings && moreSettings['目录显示来源'] || 'true';\nconst gytoken = getToken();\nconst reading = moreSettings && moreSettings['同步书架'] || 'false';\nconst reading_toast = moreSettings && moreSettings['同步弹窗'] || 'true';\n\nif (url && proxy == \"本地\") {\n    if (sources == \"69书吧\") {\n        const ck69 = String(cookie.getCookie(\"https://www.69shuba.com\"));\n        const headers = {\n            \"Referer\": url,\n            \"Cookie\": ck69,\n            \"User-Agent\": java.getWebViewUA()\n        };\n        const op = JSON.stringify({\n            headers\n        });\n        html = java.ajax(`${url},${op}`);\n    } else {\n        html = java.ajax(url);\n    }\n\n    if (html.includes(\"Just a moment...\") && sources === \"69书吧\") {\n        cookie.removeCookie(\"https://www.69shuba.com\");\n        java.longToast(\"需要真人验证，请进入任意书籍详情页过验证\");\n        html = java.startBrowserAwait(url, \"需要真人验证，请进入任意书籍详情页过验证\").body();\n        java.log(html);\n    }\n}\n\n\nconst customVar = String(book.getVariable(\"custom\"));\nconst varia = JSON.stringify({\n    custom: customVar == \"null\" ? \"\" : customVar\n});\n\nconst queryString = `book_id=${encodeURIComponent(book_id)}&source=${encodeURIComponent(sources)}&tab=${encodeURIComponent(tab)}&variable=${encodeURIComponent(varia)}`;\nconst data = request(`/catalog?${queryString}`, \"POST\", {\n    html\n});\n\nconst device_type = checkEnv();\n\nconst typeMap = {\n    \"小说\": {\n        \"苹果\": 0,\n        default: 8\n    },\n    \"听书\": {\n        \"苹果\": 1,\n        default: 32\n    },\n    \"漫画\": {\n        \"苹果\": 2,\n        default: 64\n    },\n    \"短剧\": {\n        \"苹果\": 3,\n        \"备用\": 4,\n        default: java.getAppVariant&&!isVs(sources)?4:8\n    }\n};\nconst currentType = typeMap[tab] || typeMap[\"小说\"];\nbook.type = currentType[device_type] || currentType.default;\n\n\n\nconst syncBookShelf = (data, book, gytoken) => {\n    if (!book) {\n        return;\n    }\n    let book_order = book.order;\n    if (book_order!=0) {\n    \t   book_order = 1;\n    \t} else {\n    \t\tbook_order = 2;\n    \t\t}\n    if (reading != \"true\") {\n        return;\n    }\n\n    try {\n        if (!data || !gytoken) {\n            java.log(\"缺少必要参数\");\n            return;\n        }\n\n        const parsedData = parseJsonSafely(data);\n        if (!parsedData || !parsedData.data || !Array.isArray(parsedData.data) || !parsedData.data[durChapterIndex]) {\n            return;\n        }\n\n        const ritem = parsedData.data[durChapterIndex];\n        \nlet book_info = {\n            book_name,\n            author,\n            abstract,\n            thumb_url,\n            book_id,\n            tab,\n            source: sources\n        };\n        if (!book_info || typeof book_info != \"object\") {\n            return;\n        }\n        const rurl = `/add_book_to_book_shelf`;\n        book_info.read_status = book_order;\n        book_info.last_chapter_item_id = ritem.item_id || \"\";\n        book_info.last_chapter_title = ritem.title || \"\";\n        //java.toast(JSON.stringify(book_info));\n       \ttry {\n       \t\tconst check_book_url = `/check_book_in_book_shelf`;\n    checkResponse = request(check_book_url, \"POST\", {book_id,source:sources,tab});\n} catch (e) {\n    java.log(`检查书籍请求失败: ${e}`);\n}\n    \n        const check_data = parseJsonSafely(checkResponse);\n        try {\n            let chapterIndex = findItemIndex(parsedData.data,check_data.data.last_chapter_item_id)\n            durChapterIndex = chapterIndex;\n            if (book.durChapterIndex < chapterIndex) {\n            \tbook_info.last_chapter_item_id = check_data.data.last_chapter_item_id;\n            \t}\n            \n            if (chapterIndex != 0 && book.durChapterIndex < chapterIndex) {\n                book.durChapterIndex = chapterIndex;\n            }\n            if (check_data.data.id) {\n                book_info.id = check_data.data.id;\n                const uurl = `/update_book_shelf`;\n                if (book_order==1){\n                \tlet up = request(uurl, \"POST\", book_info);\n                   if (reading_toast == \"true\") {\n                \t    java.toast(up)\n                \t  }\n                \t}\n                \n            } else {\n                if (book_order==1){\n                let up = request(rurl, \"POST\", book_info);\n                if (reading_toast == \"true\") {\n                \t    java.toast(up)\n                \t}\n            }}\n        } catch (e) {\n            try {\n                if (book_order==1){\n                let up = request(rurl, \"POST\", book_info);\n                if (reading_toast == \"true\") {\n                \t    java.toast(up)\n                \t}}\n            } catch (e) {\n                if (reading_toast == \"true\") {\n                \t    java.toast(`书架操作失败: ${e}`);\n                \t}\n            }\n\n        }\n    } catch (error) {\n        java.log(`书籍同步流程异常: ${error}`);\n        if (reading_toast == \"true\") {\n                \t    java.longToast(\"\\n同步阅读进度失败，但不影响阅读，可以前往登录关闭书架同步功能。\");\n                \t}\n        \n    }\n};\n\ntry {syncBookShelf(data, book, gytoken);}catch{}\n\n\nfunction processCatalogList(data) {\n    let catalog_list = parseJsonSafely(data).data;\n\n\n    if (catalog_list && catalog_list.length > 0) {\n\n        let lastItem = catalog_list[catalog_list.length - 1];\n\n\n        if (lastItem && typeof lastItem == 'object' && lastItem.source && lastItem.title) {\n\n            lastItem.title = lastItem.source + ':' + lastItem.title;\n        }\n    }\n    return JSON.stringify({\n        'data': catalog_list\n    });\n}\n\nif (showSource == \"true\") {\n    processCatalogList(data);\n} else {\n    data;\n}\n\n</js>$.data", "chapterName": "$.title", "chapterUrl": "<js>\nlet { tab, source: sources, title, item_id } = result;\nlet book_id = java.get('book_id');\nlet base_url = BaseUrl();\nlet url = result.toc_url || \"\";\n\nlet gycontent = { book_id, item_id, title, sources, tab, url };\nlet encodedGycontent = java.base64Encode(JSON.stringify(gycontent));\n\nlet content_url;\n\nif (sources == '卷') {\n    content_url = item_id;\n} else if (['番茄', '七猫', '塔读'].includes(sources) && tab == \"小说\") {\n    const fqssionid = java.getCookie('fanqienovel.com', 'sessionid');\n    const sourcess = sources.replace('svip_', '');\n    content_url = `data:;base64,${encodedGycontent},${JSON.stringify({\n        type: \"gycontent\",\n        js: `book ? result : '${base_url}/get_review?book_id=${book_id}&item_id=${item_id}&ssionid=${fqssionid}&source=${sourcess}'`\n    })}`;\n} else {\n    content_url = `data:;base64,${encodedGycontent},${JSON.stringify({ type: \"gycontent\" })}`;\n}\n</js>", "updateTime": "$.first_pass_time"}, "searchUrl": "<js>\nlet moreSettings = getVariable('更多设置');\n\nlet tab = moreSettings && moreSettings['搜索模式'] || '小说';\n\nlet sourcesKey = moreSettings && moreSettings[tab] || '全部';\n\nlet disabled_sources = moreSettings && moreSettings['强制搜索'] || \"0\";\nif (disabled_sources == \"false\") {\n    disabled_sources = \"0\";\n} else if (disabled_sources == \"true\") {\n    disabled_sources = \"1\";\n}\nlet gysearch = {\n    key: key,\n    tab: tab,\n    sourcesKey: sourcesKey,\n    page: page,\n    disabled_sources:disabled_sources\n}\ngysearch = java.base64Encode(JSON.stringify(gysearch));\n`data:;base64,${gysearch},{\"type\":\"gysearch\"}`;\n</js>", "weight": 0},{"bookSourceComment": "建议第一次使用时，通过登录页面进去搜索作品并观看，一次性拿完所有cookie", "bookSourceGroup": "免费", "bookSourceName": "AO3镜像网站", "bookSourceType": 0, "bookSourceUrl": "https://ao3mirror.com", "customOrder": 3658, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "lastUpdateTime": "1784712731987", "loginCheckJs": "", "loginUi": "", "loginUrl": "https://ao3mirror.com", "respondTime": 7449, "ruleBookInfo": {"author": "", "coverUrl": "", "init": "", "intro": "class.summary module@html&&class.notes module@html&&id.work_endnotes@html", "kind": "", "lastChapter": "", "name": "", "tocUrl": "@js:\nif(result.match(/Proceed/)){\n    result=result.match(/href=\"([^\"]+)\".*?Proceed/)[1]\n}else{\n    result=baseUrl\n}\nresult+\"?view_adult=true\"", "wordCount": ""}, "ruleContent": {"content": "@js:doc=org.jsoup.Jsoup.parse(result.match(/content-->([\\s\\S]+?)<!--\\/(chapter|main)-->/)[1]);\ndoc.select(\"h3\").remove();\nresult=doc.html()", "imageStyle": "0", "nextContentUrl": "", "replaceRegex": "##<!-- end cache -->", "sourceRegex": "", "webJs": ""}, "ruleExplore": {"author": "", "bookList": "", "bookUrl": "", "coverUrl": "", "intro": "", "kind": "", "lastChapter": "", "name": "", "wordCount": ""}, "ruleSearch": {"author": "h4@tag.a.1@text", "bookList": "class.work index group@li", "bookUrl": "h4@tag.a.0@href", "checkKeyWord": "", "coverUrl": "", "intro": "class.tags commas@text&&class.summary@text", "kind": "class.language@text##Language:|Chapters:", "lastChapter": "class.chapters@text##\\s*", "name": "h4@tag.a.0@text", "wordCount": "class.words@text##Words:\\s*|,"}, "ruleToc": {"chapterList": "tag.select@option||tag.html", "chapterName": "class.title heading@text||text", "chapterUrl": "@value", "isVip": "", "nextTocUrl": "", "updateTime": ""}, "searchUrl": "/works/search?page={{page}}&utf8=%E2%9C%93&work_search%5Bquery%5D={{key}}", "weight": 0},{"bookSourceComment": "禁忌书屋精华区独立书源", "bookSourceGroup": "论坛小说", "bookSourceName": "🔞禁忌书屋 精华区", "bookSourceType": 0, "bookSourceUrl": "https://www.cool18.com/bbs4", "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "[{\"title\":\"⭐精华区\",\"url\":\"https://www.cool18.com/bbs4/index.php?app=forum&act=gold&p={{page}}\",\"style\":{\"layout_flexGrow\":1}}]", "header": "[]", "lastUpdateTime": "1784704089197", "respondTime": 180000, "ruleBookInfo": [], "ruleContent": {"content": "<js>\nvar document = org.jsoup.Jsoup.parse(result);\nvar preElements = document.select('div#content-section.content-section > pre');\nif (preElements.isEmpty()) {\n    result = '未找到 div#content-section.content-section > pre 元素';\n} else {\n    var preElement = preElements.first();\n    preElement.select('b font[size=4]').remove();\n    var innerHtml = preElement.html();\n    function convertHtmlToPlainTextWithLineBreaks(html) {\n        var text = html;\n        text = text.replaceAll(\"&nbsp;\", \" \");\n        text = text.replaceAll(\"(?i)<p[^>]*><\\\\/p>\", \"\\n\");\n        text = text.replaceAll(\"(?i)<p[^>]*>(.*?)<\\\\/p>\", \"\\n$1\\n\");\n        text = text.replaceAll(\"(?i)<br\\\\s*\\\\/?>\", \"\\n\");\n        text = text.replaceAll(\"<[^>]+>\", \"\");\n        text = text.replaceAll(\"\\\\n{3,}\", \"\\n\\n\");\n        return text.trim();\n    }\n    var plainText = convertHtmlToPlainTextWithLineBreaks(innerHtml);\n    result = plainText;\n}\n</js>"}, "ruleExplore": [], "ruleSearch": {"author": "a@text##^(.*?)(?:作者[：|:](.*))?$##$2", "bookList": "ul.post-list > li.post-item", "bookUrl": "a@href", "name": "a@text##作者.*##"}, "ruleToc": {"chapterList": "<js>\nvar doc=org.jsoup.Jsoup.parse(result);\nvar links=doc.select('pre a[href*=\"threadview\"]');\nvar list=[];\nvar pdf=0;\nif(links.size()>0){\nvar firstNext=links.get(links.size()-1).text();\nvar nm=firstNext.match(/([0-9０-９]+)[-–—]/);\nif(nm)pdf=parseInt(nm[1].replace(/[０-９]/g,function(c){return String.fromCharCode(c.charCodeAt(0)-0xFEE0)}))-1;\n}\nvar m=result.match(/【[^】]+】/);\nvar title=m?m[0]:'第1章';\nvar cn=pdf>0?title+'（1-'+pdf+'）':title;\nvar selfA=doc.createElement('a');\nselfA.attr('href',baseUrl);\nselfA.text(cn);\nlist.push(selfA);\nfor(var i=links.size()-1;i>=0;i--){list.push(links.get(i))}\nresult=list\n</js>", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "https://www.cool18.com/bbs4/index.php?app=forum&act=gold", "weight": 0},{"bookSourceName": "🔞禁忌书屋 cool18 \n", "bookSourceType": 0, "bookSourceUrl": "https://www.cool18.com", "customOrder": 2, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "[{\"title\": \"〖书屋原创区〗\", \"url\": \"https://www.cool18.com/bbs4/index.php?act=threadsearch&app=forum&keywords=%E5%8E%9F%E5%88%9B&submit=%E6%A0%8F%E7%9B%AE%E6%90%9C%E7%B4%A2&first=1&p={{page}}\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}}, {\"title\": \"『都市』\", \"url\": \"https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&type=%E9%83%BD%E5%B8%82&submit=%E6%9F%A5%E8%AF%A2&p={{page}}&p={{page}}\", \"style\": {\"layout_flexGrow\": 1}}, {\"title\": \"『校园』\", \"url\": \"https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&type=%E6%A0%A1%E5%9B%AD&submit=%E6%9F%A5%E8%AF%A2&p={{page}}&p={{page}}\", \"style\": {\"layout_flexGrow\": 1}}, {\"title\": \"『乡野』\", \"url\": \"https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&type=%E4%B9%A1%E9%87%8E&submit=%E6%9F%A5%E8%AF%A2&p={{page}}&p={{page}}\", \"style\": {\"layout_flexGrow\": 1}}, {\"title\": \"『古风』\", \"url\": \"https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&type=%E5%8F%A4%E9%A3%8E&submit=%E6%9F%A5%E8%AF%A2&p={{page}}&p={{page}}\", \"style\": {\"layout_flexGrow\": 1}}, {\"title\": \"『异国』\", \"url\": \"https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&type=%E5%BC%82%E5%9B%BD&submit=%E6%9F%A5%E8%AF%A2&p={{page}}&p={{page}}\", \"style\": {\"layout_flexGrow\": 1}}, {\"title\": \"『玄幻』\", \"url\": \"https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&type=%E7%8E%84%E5%B9%BB&submit=%E6%9F%A5%E8%AF%A2&p={{page}}&p={{page}}\", \"style\": {\"layout_flexGrow\": 1}}, {\"title\": \"『红绿』\", \"url\": \"https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&type=%E7%BA%A2%E7%BB%BF&submit=%E6%9F%A5%E8%AF%A2&p={{page}}&p={{page}}\", \"style\": {\"layout_flexGrow\": 1}}, {\"title\": \"『伦理』\", \"url\": \"https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&type=%E4%BC%A6%E7%90%86&submit=%E6%9F%A5%E8%AF%A2&p={{page}}&p={{page}}\", \"style\": {\"layout_flexGrow\": 1}}, {\"title\": \"『独爱』\", \"url\": \"https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&type=%E7%8B%AC%E7%88%B1&submit=%E6%9F%A5%E8%AF%A2&p={{page}}&p={{page}}\", \"style\": {\"layout_flexGrow\": 1}}, {\"title\": \"『暴虐』\", \"url\": \"https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&type=%E6%9A%B4%E8%99%90&submit=%E6%9F%A5%E8%AF%A2&p={{page}}&p={{page}}\", \"style\": {\"layout_flexGrow\": 1}}, {\"title\": \"『摄心』\", \"url\": \"https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&type=%E6%91%84%E5%BF%83&submit=%E6%9F%A5%E8%AF%A2&p={{page}}&p={{page}}\", \"style\": {\"layout_flexGrow\": 1}}, {\"title\": \"『其他』\", \"url\": \"https://www.cool18.com/bbs4/index.php?action=search&act=threadsearch&app=forum&type=%E5%85%B6%E4%BB%96&submit=%E6%9F%A5%E8%AF%A2&p={{page}}&p={{page}}\", \"style\": {\"layout_flexGrow\": 1}}]", "header": "[]", "lastUpdateTime": "1784703640384", "respondTime": 180000, "ruleBookInfo": [], "ruleContent": {"content": "<js>\nvar document = org.jsoup.Jsoup.parse(result);\nvar preElements = document.select('div#content-section.content-section > pre');\nif (preElements.isEmpty()) {\n    result = '未找到 div#content-section.content-section > pre 元素';\n} else {\n    var preElement = preElements.first();\n    preElement.select('b font[size=4]').remove();\n    var innerHtml = preElement.html();\n    function convertHtmlToPlainTextWithLineBreaks(html) {\n        var text = html;\n        text = text.replaceAll(\"&nbsp;\", \" \");\n        text = text.replaceAll(\"(?i)<p[^>]*><\\\\/p>\", \"\\n\");\n        text = text.replaceAll(\"(?i)<p[^>]*>(.*?)<\\\\/p>\", \"\\n$1\\n\");\n        text = text.replaceAll(\"(?i)<br\\\\s*\\\\/?>\", \"\\n\");\n        text = text.replaceAll(\"<[^>]+>\", \"\");\n        text = text.replaceAll(\"\\\\n{3,}\", \"\\n\\n\");\n        return text.trim();\n    }\n    var plainText = convertHtmlToPlainTextWithLineBreaks(innerHtml);\n    result = plainText;\n}\n</js>"}, "ruleExplore": [], "ruleSearch": {"author": "li.l-m1 > a > b@text##^(.*?)(?:作者[：|:](.*))?$##$2", "bookList": "div.container > section.section > ul.post-list.thread-list > li.l-m1", "bookUrl": ".l-m1 a@href", "name": "li.l-m1 > a > b@text##作者.*##"}, "ruleToc": {"chapterList": "<js>\nvar list=[];\nvar m=baseUrl.match(/tid=(\\d+)/);\nvar tid=m?m[1]:'';\ntry{\nvar api='https://www.cool18.com/bbs4/index.php?app=forum&act=achildlist&tid='+tid;\nvar jsonStr=org.jsoup.Jsoup.connect(api).ignoreContentType(true).execute().body();\nvar json=eval('('+jsonStr+')');\nvar chapters=[];\nfor(var i=0;i<json.length;i++){if(json[i].subject.indexOf('【')===0)chapters.push(json[i])}\nvar doc=org.jsoup.Jsoup.parse(result);\nvar selfA=doc.createElement('a');\nselfA.attr('href',baseUrl);\nselfA.text('第1章');\nvar t=doc.select('h1').first();if(t)selfA.text(t.text())\nlist.push(selfA);\nvar base='https://www.cool18.com/bbs4/index.php?app=forum&act=threadview&tid=';\nfor(var i=chapters.length-1;i>=0;i--){\nvar a=doc.createElement('a');\na.attr('href',base+chapters[i].tid);\na.text(chapters[i].subject);\nlist.push(a);\n}\n}catch(e){\nvar doc=org.jsoup.Jsoup.parse(result);\nvar a=doc.createElement('a');\na.attr('href',baseUrl);\na.text('第1章');\nlist.push(a);\n}\nresult=list;\n</js>", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "https://www.cool18.com/bbs4/index.php?action=search&bbsdr=bbs4&act=threadsearch&app=forum&keywords={{key}}&submit=%E6%9F%A5%E8%AF%A2&p={{page}}", "weight": 0},{"bookSourceComment": "基于AO3-3订阅源，二改修复了目录无法解析的问题\n原作者：Baovine\n如有侵权等问题请联系：behtnnrtop@163.com\n\n\n【原注释如下：】\n\n来自Boavine\n自用，注意该站阅读需科学上网。你也可以把源URL改为镜像网站（自己找）\n为方便阅读，可以科学上网缓存后关闭书籍更新即可随时阅读。也可以将源类型改为3(文件)然后下载阅读。无需操作或登录即可直接阅读成人向作品。\n如有疑问请联系boavine@163.com\n\n【2024.4.5更新】\n相较AO3-2 1、增加了下载功能 2、去除了简介中的donate宣传\n\n【下载说明】\n将源类型改成3（文件）！\n如果不想要epub\n可以将下载地址中的li.1改为对应序号\nli.0 AZW3; li.1 epub; li.2 MOBI; li.3 PDF; li.4 html", "bookSourceGroup": "ao3", "bookSourceName": "AO3-3 修复目录", "bookSourceType": 0, "bookSourceUrl": "https://archiveofourown.org", "customButton": false, "customOrder": 5, "enabled": true, "enabledCookieJar": false, "enabledExplore": false, "eventListener": false, "lastUpdateTime": "1784606804956", "loginUrl": "https://archiveofourown.org/", "respondTime": 187094, "ruleBookInfo": {"downloadUrls": "@js:\nvar h0=java.getString(\"class.download@ul@li.1@a@href\"); \nvar url0=h0.match(/.*(?=\\?updated)/); \nresult=\"https://archiveofourown.org\"+url0;\n//下载格式说明：如果不想要epub，可以将下载地址中的li.1改为对应序号\n//li.0 AZW3; li.1 epub; li.2 MOBI; li.3 PDF; li.4 html", "intro": "{{@@class.summary module@class.userstuff@html}}\n{{@@class.fandom@text}}\n{{@@class.relationship@text}}\n{{@@dt.character@text}}\n{{@@dd.character@a@text##\\n## ※ }}\n{{@@dt.freeform@text}}\n{{@@dd.freeform@a@text##\\n## ※ }}\n{{@@dt.warning@text}}\n{{@@dd.warning@a@text##\\n## ※ }}\n{{@@class.category@text&&class.hits@text}}##(.*):\\n##[$1]：", "kind": "class.work meta group@dd.characters&&dd.relationship@ul@li@text&&dd.language@ul@li@text", "lastChapter": "class.stats.-1@class.chapters.-1@text", "tocUrl": "@js:\nif(result.match(/Proceed/)){\n    result=result.match(/href=\"([^\"]+)\".*?Proceed/)[1]\n}else{\n    result=baseUrl\n}\nresult+\"?view_adult=true\""}, "ruleContent": {"content": "id.chapters@tag.p@html"}, "ruleExplore": [], "ruleSearch": {"author": "h4@a.1@text", "bookList": "tag.li", "bookUrl": "@js:\n\"https://archiveofourown.org\"+java.getString(\"h4@tag.a.0@href\")", "checkKeyWord": "授权翻译", "intro": "tag.blockquote@text", "kind": "class.tags commas@tag.li@class.characters@text&&class.tags commas@tag.li@class.relationships@text## - Relationship", "lastChapter": "dd.chapters@text##(.*)##Chapter: $1##", "name": "h4@a.0@text", "wordCount": "dl@dd.1@text"}, "ruleToc": {"chapterList": "tag.select@option", "chapterName": "@text", "chapterUrl": "@value"}, "searchUrl": "/works/search?page={{page}}&utf8=%E2%9C%93&work_search%5Bquery%5D={{key}}", "weight": 0},{"bookSourceName": "Tuoverse沱书文存", "bookSourceUrl": "https://tuoverse.com", "bookSourceGroup": "书单导航类", "charset": "UTF-8", "userAgent": "Mozilla/5.0 (Android Mobile) Chrome/120.0 Safari/537.36", "ruleSearch": {"searchUrl": "https://tuoverse.com/search?key={{key}}", "searchList": ".book-item", "searchName": "h3.book-title a@text|trim", "searchAuthor": "span.author@text|trim", "searchIntroduce": ".book-desc@text|trim", "searchCoverUrl": ".book-cover img@src", "searchNoteUrl": "h3.book-title a@href|absurl"}, "ruleFind": {"findUrl": "https://tuoverse.com", "findList": ".hot-book-item", "findName": "h3 a@text|trim", "findAuthor": ".author-text@text|trim", "findIntroduce": ".desc-text@text|trim", "findCoverUrl": "img.cover-img@src", "findNoteUrl": "h3 a@href|absurl"}, "ruleBookInfo": {"bookIntroduce": ".detail-intro@html|removeTags(script,style)", "tocUrl": "a.read-link@href|absurl"}, "enableAnalyze": true, "lastUpdateTime": "1784473029348"},{"bookSourceComment": "69书吧当前启用了全站人机验证。首次访问详情、目录、正文或发现页时，可能会弹出验证页面，通过后会依赖 CookieJar 保持验证状态。\n搜索接口为 GBK POST 请求，但当前容易触发 Cloudflare 验证，稳定版默认关闭搜索；请优先通过“发现”找书，或在浏览器打开书籍详情页后，在阅读中添加网址。\n若验证无限循环，请确认 Android System WebView 已更新，并让请求头中的 Chrome 大版本与手机 WebView 大版本一致。本配置按 Chrome/WebView 149 编写。", "bookSourceGroup": "人机验证-全站,搜索暂不可用", "bookSourceName": "69书吧", "bookSourceType": 0, "bookSourceUrl": "https://www.69shuba.com", "bookUrlPattern": "https://www\\.69shuba\\.com/book/\\d+(?:\\.htm|/?)", "concurrentRate": "3000", "coverDecodeJs": "", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "男生推荐::/novels/male\n女生推荐::/novels/female\n热门小说::/novels/hot\n全部分类::/novels/class/0.htm\n玄幻魔法::/novels/class/1.htm\n武侠修真::/novels/class/2.htm\n言情小说::/novels/class/3.htm\n历史军事::/novels/class/4.htm\n游戏竞技::/novels/class/5.htm\n科幻空间::/novels/class/6.htm\n悬疑惊悚::/novels/class/7.htm\n同人小说::/novels/class/8.htm\n都市小说::/novels/class/9.htm\n官场职场::/novels/class/10.htm\n穿越时空::/novels/class/11.htm\n青春校园::/novels/class/12.htm\n完本-全部分类::/novels/full/0.htm\n完本-玄幻魔法::/novels/full/1.htm\n完本-武侠修真::/novels/full/2.htm\n完本-言情小说::/novels/full/3.htm\n完本-历史军事::/novels/full/4.htm\n完本-游戏竞技::/novels/full/5.htm\n完本-科幻空间::/novels/full/6.htm\n完本-悬疑惊悚::/novels/full/7.htm\n完本-同人小说::/novels/full/8.htm\n完本-都市小说::/novels/full/9.htm\n完本-官场职场::/novels/full/10.htm\n完本-穿越时空::/novels/full/11.htm\n完本-青春校园::/novels/full/12.htm\n连载人气榜::/novels/weekvisit_0_2_{{page}}.htm\n连载推荐榜::/novels/allvote_0_2_{{page}}.htm\n连载新书榜::/novels/newhot_0_2_{{page}}.htm\n完本人气榜::/novels/weekvisit_0_1_{{page}}.htm\n完本推荐榜::/novels/allvote_0_1_{{page}}.htm\n完本新书榜::/novels/newhot_0_1_{{page}}.htm", "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 16; PJZ110 Build/BP2A.250605.015; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/149.0.7827.160 Mobile Safari/537.36\",\"Referer\":\"https://www.69shuba.com/\"}", "jsLib": "function cfCheck(html, targetUrl) {\n  var text = String(html || '');\n  if (/Just a moment|cf-turnstile|onloadTurnstileCallback|challenges\\.cloudflare\\.com/i.test(text)) {\n    java.longToast('请按网页提示完成人机验证；若无限循环，请检查 WebView 与请求头 UA 版本。');\n    return java.startBrowserAwait(targetUrl, '69书吧人机验证').body();\n  }\n  return html;\n}", "lastUpdateTime": "1784388119284", "loginUrl": "https://www.69shuba.com/", "respondTime": 180000, "ruleBookInfo": {"author": "//meta[@property='og:novel:author']/@content", "coverUrl": "//meta[@property='og:image']/@content", "init": "<js>cfCheck(result, baseUrl);</js>", "intro": "//meta[@property='og:description']/@content", "kind": "//meta[@property='og:novel:category' or @property='og:novel:status' or @property='og:novel:update_time']/@content", "lastChapter": "//meta[@property='og:novel:latest_chapter_name']/@content##\\d+\\.(?=第)", "name": "//meta[@property='og:novel:book_name']/@content", "tocUrl": "@js:baseUrl.endsWith('/') ? baseUrl : baseUrl.replace('.htm','/')", "wordCount": ".booknav2 p.2@text##( \\|.+)"}, "ruleContent": {"content": "<js>cfCheck(result, baseUrl);</js>.txtnav@textNodes", "nextContentUrl": "", "replaceRegex": "##\\s*({{book.durChapterTitle}}|.*作者：.*|\\(本章完\\)|（本章完）|PS：.*|P\\.S\\..*|感谢.*打赏.*|感谢.*推荐票.*|感谢.*月票.*|为防止采集.*|请记住本站.*|loadAdv.*)\\s*", "title": "h1@text##\\d+\\.(?=第)"}, "ruleExplore": {"author": "label.0@text", "bookList": "<js>cfCheck(result, baseUrl);</js>#article_list_content li", "bookUrl": "a.0@href", "coverUrl": "img@data-src||img@src", "intro": ".ellipsis_2@text", "kind": "label.1@text&&label.2@text", "lastChapter": ".zxzj p@textNodes##\\d+\\.(?=第)", "name": "h3 a.1@text||img@alt", "wordCount": ""}, "ruleSearch": {"author": "label.0@text", "bookList": ".newbox li", "bookUrl": "a.0@href", "checkKeyWord": "", "coverUrl": "img@data-src||img@src", "intro": ".ellipsis_2@text||ol@text", "kind": "label.1@text&&label.2@text", "lastChapter": ".zxzj p@textNodes##\\d+\\.(?=第)", "name": "h3 a.1@text||h3@text", "wordCount": ""}, "ruleToc": {"chapterList": "<js>cfCheck(result, baseUrl);</js>#catalog ul a[-1:0]", "chapterName": "text##\\d+\\.(?=第)", "chapterUrl": "href", "isVolume": "", "nextTocUrl": "", "preUpdateJs": ""}, "searchUrl": "<js>/modules/article/search.php,{'charset':'gbk','body':'searchkey={{key}}&searchtype=all','method':'POST'};result='';result;</js>", "variableComment": "", "weight": 25},{"bookSourceComment": "", "bookSourceGroup": "", "bookSourceName": "69书吧", "bookSourceType": 0, "bookSourceUrl": "https://www.69shuba.com/", "bookUrlPattern": "https://www.69shuba.com/book/[0-9]+\\.htm", "concurrentRate": "", "coverDecodeJs": "", "customOrder": 0, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "exploreUrl": "[{\"title\":\"分类\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},\n{\"title\":\"男生推荐\",\"url\":\"/novels/male\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.4}},\n{\"title\":\"女生推荐\",\"url\":\"/novels/female\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.4}},\n{\"title\":\"玄幻魔法\",\"url\":\"/novels/class/1.htm\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"武侠修真\",\"url\":\"/novels/class/2.htm\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"言情小说\",\"url\":\"/novels/class/3.htm\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"历史军事\",\"url\":\"/novels/class/4.htm\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"游戏竞技\",\"url\":\"/novels/class/5.htm\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"科幻空间\",\"url\":\"/novels/class/6.htm\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"悬疑惊悚\",\"url\":\"/novels/class/7.htm\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"同人小说\",\"url\":\"/novels/class/8.htm\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"都市小说\",\"url\":\"/novels/class/9.htm\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"官场职场\",\"url\":\"/novels/class/10.htm\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"穿越时空\",\"url\":\"/novels/class/11.htm\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"青春校园\",\"url\":\"/novels/class/12.htm\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"排行榜\",\"url\":\"\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":1}},\n{\"title\":\"连载人气榜\",\"url\":\"/novels/weekvisit_0_2_{{page}}.htm\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"连载推荐榜\",\"url\":\"/novels/allvote_0_2_{{page}}.htm\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"连载新书榜\",\"url\":\"/novels/newhot_0_2_{{page}}.htm\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"完本人气榜\",\"url\":\"/novels/weekvisit_0_1_{{page}}.htm\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"完本推荐榜\",\"url\":\"/novels/allvote_0_1_{{page}}.htm\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}},\n{\"title\":\"完本新书榜\",\"url\":\"/novels/newhot_0_1_{{page}}.htm\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.25}}]", "header": "@js:\nJSON.stringify({\n  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 16; PJZ110 Build/BP2A.250605.015) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.7827.160 Mobile Safari/537.36\",\n  \"Referer\": baseUrl\n})", "jsLib": "function getSearchOpt() {\n\t var { java, key } = this\n\t key = key ? java.put(\"key\", key) : java.get(\"key\")\n\t return  \",\" + JSON.stringify(\n\t \t  {\n\t \t  \t  \"charset\": \"GBK\",\n\t \t  \t  \"method\": \"POST\",\n\t \t  \t  \"body\": `searchkey=${key}&searchtype=all`\n\t \t  \t}\n\t \t)\n}", "lastUpdateTime": "1784387281411", "loginUrl": "", "respondTime": 180000, "ruleBookInfo": {"author": "[property$=\"author\"]@content", "coverUrl": "img@src", "init": "", "intro": "&nbsp;\n🏷️ 标签：{{\n  eval(String(java.getElement(\"script.0\").html()))\n  bookinfo.tags.slice(0,-1).replaceAll(\"|\",\", \")||\"无\"\n}}\n📖 详情：{{@@.navtxt p.0@text}}", "kind": "[property$=\"category\"]@content&& \n[property$=\"status\"]@content&& \n[property$=\"update_time\"]@content", "lastChapter": "[property$=\"latest_chapter_name\"]@content##\\d+\\.(?=第)", "name": "[property$=\"book_name\"]@content", "tocUrl": ".addbtn .btn@href", "wordCount": ".infolist li.0@textNodes"}, "ruleContent": {"content": ".txtnav@textNodes", "replaceRegex": "##\\s*({{ book.durChapterTitle }}|.*作者：.*|\\(本章完\\)|PS：.*求推荐！|PS：.*求收藏！|感谢.*打赏.*|感谢.*推荐票.*|感谢.*月票.*|（.*月票.*）|（为大家的.*票加更.*）|第二更在.*|为防止采集.*支持！|如果您.*观看！|（看完.*阅读！.*）|推荐一本书.*|loadAdv.*)\\s*", "title": "h1@text##\\d+\\.(?=第)"}, "ruleExplore": {"author": "", "bookList": "", "bookUrl": "", "coverUrl": "", "intro": "", "name": ""}, "ruleSearch": {"author": "label[0]@text", "bookList": "<js>\nif (result.match(/onloadTurnstileCallback/)) {\n\t cookie.removeCookie(source.getKey())\n\t url = baseUrl + getSearchOpt()\n  java.startBrowserAwait(url, \"\").body()\n} else result\n</js>\n.newbox li", "bookUrl": "h3 a@href\n@js:\nif (!result.startsWith(source.getKey())) {\n\t url = String(book.coverUrl)\n  url.replace(/^.*\\/(\\d+)s\\.jpg$/, \"/book/$1.htm\")\n} else result", "checkKeyWord": "", "coverUrl": "img@data-src", "intro": "ol@text", "kind": "label[1:-1]@text", "lastChapter": ".zxzj p@textNodes##\\d+\\.(?=第)", "name": "h3@text", "wordCount": ""}, "ruleToc": {"chapterList": "-#catalog li a", "chapterName": "text##\\d+\\.(?=第)", "chapterUrl": "href", "preUpdateJs": ""}, "searchUrl": "/modules/article/search.php{{getSearchOpt()}}", "variableComment": "", "weight": 0},{"bookSourceUrl": "http://www.zwduxs.com#grid tr!0#芜恙", "bookSourceName": "八一中文", "bookSourceGroup": "", "bookSourceComment": "coolapk@芜恙;wordCount", "loginUrl": "", "loginUi": "", "loginCheckJs": "", "loginHeader": "", "bookUrlPattern": "", "searchUrl": "/modules/article/search.php,{\n  \"method\": \"POST\",\n  \"body\": \"searchkey={{key}}\"\n}", "exploreUrl": "", "jsLib": "", "header": "", "bookListRule": {"bookList": "", "name": "", "author": "", "coverUrl": "", "intro": "", "kind": "", "lastChapter": "", "bookUrl": "", "wordCount": ""}, "searchRule": {"checkKeyWord": "", "bookList": ".grid tr!0\n<js>\nresult.toArray().slice(0, 3).map(el => {\n\tvar url = String(el.select('a:eq(0)').attr('href')).replace(/^\\//, baseUrl.match(/(.+?\\/\\/[^\\/]+\\/)/)[1]);\n\tvar J = org.jsoup.Jsoup.parse(java.ajax(url));\n\tvar o = selector => String(J.select(selector).text());\n\tvar og = selector => String(J.select('[property=\"og:' + selector + '\"]').attr('content'));\n\treturn {\n\t\tname: og('novel:book_name').replace(/(全文|小说|免费阅读|最新章节).*|[(（].*[）)]/g, ''),\n\t\tauthor: og('novel:author'),\n\t\tkind: og('novel:category') + ',' + og('novel:status').replace(/中|已/, ''),\n\t\tlatest: og('novel:latest_chapter_name').replace(/^(正文|VIP章节|最新章节)?(\\s+|_)|[\\(（【].*[求更谢乐发推].*/g, '') + ' • ' + og('novel:update_time').replace(/(T|\\s).*/, ' ').replace(/\\//g, '-'),\n\t\tintro: og('description').replace(/.*(观看小说|简介)[:：]|各位书友.*|\\s+/g, ''),\n\t\tcover: og('image'),\n\t\turl: url,\n\t};\n}); \n</js>", "name": "name", "author": "author", "kind": "kind", "wordCount": "", "lastChapter": "latest", "intro": "intro", "coverUrl": "cover", "bookUrl": "url", "updateTime": ""}, "exploreRule": {"bookList": "", "name": "", "author": "", "kind": "", "wordCount": "", "lastChapter": "", "intro": "", "coverUrl": "", "bookUrl": "", "updateTime": ""}, "bookInfoRule": {"init": "<js> \nvar J = org.jsoup.Jsoup.parse(result);\nvar o = selector => String(J.select(selector).text()) ;\nvar og = selector => String(J.select('[property=\"og:' + selector + '\"]').attr('content'));\nvar book = {\n\tname: og('novel:book_name').replace(/(全文|小说|免费阅读|最新章节).*|[(（].*[）)]/g, ''),\n\tauthor: og('novel:author'),\n\tkind: og('novel:category') + ',' + og('novel:status').replace(/中|已/, ''),\n\tlatest: og('novel:latest_chapter_name').replace(/^(正文|VIP章节|最新章节)?(\\s+|_)|[\\(（【].*[求更谢乐发推].*/g, ''),\n\tintro: '　　最近更新:' + og('novel:update_time').replace(/(T|\\s).*/, ' ').replace(/\\//g, '-') + '\\n' + og('description').replace(/.*(观看小说|简介)[:：]|各位书友.*/g, '').replace(/\\s+/g, '\\n'),\n\tcover: og('image'),\n\turl: og('url'),\n};\nbook;\n</js>", "name": "name", "author": "author", "kind": "kind", "wordCount": "", "lastChapter": "latest", "intro": "intro", "coverUrl": "cover", "tocUrl": "url", "canReName": "", "downloadUrls": "", "updateTime": ""}, "tocRule": {"preUpdateJs": "", "chapterList": "#list dd a", "chapterName": "text##^(正文|VIP章节|最新章节)?(\\s+|_)|[\\(（【].*[求更谢乐发推].*", "chapterUrl": "href", "formatJs": "", "isVolume": "", "isVip": "", "isPay": "", "nextTocUrl": "", "updateTime": "", "wordCount": ""}, "contentRule": {"content": "#content@html", "title": "", "nextContentUrl": "", "webJs": "", "sourceRegex": "", "replaceRegex": "", "imageStyle": "full", "imageDecode": "", "payAction": ""}, "variableComment": "", "lastUpdateTime": "1784360103428", "customOrder": 0, "enabled": true, "enabledExplore": true, "weight": 0, "concurrentRate": ""},{"bookSourceComment": "// 26.7.18制作\n//加载有点慢，挂梯会好点", "bookSourceGroup": "精品源", "bookSourceName": "🏠 小说屋", "bookSourceType": 0, "bookSourceUrl": "https://www.xiaoshuo5.com", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "[\n  {\"title\":\"玄幻小说\",\"url\":\"/list1/{{page}}.html\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"武侠小说\",\"url\":\"/list2/{{page}}.html\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"都市小说\",\"url\":\"/list3/{{page}}.html\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"历史小说\",\"url\":\"/list4/{{page}}.html\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"网游小说\",\"url\":\"/list5/{{page}}.html\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"科幻小说\",\"url\":\"/list6/{{page}}.html\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"言情小说\",\"url\":\"/list7/{{page}}.html\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"其他小说\",\"url\":\"/list8/{{page}}.html\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"总排行榜\",\"url\":\"/top/all_0_{{page}}.html\",\"style\":{\"layout_flexGrow\":1}},\n  {\"title\":\"完本小说\",\"url\":\"/full/0_{{page}}.html\",\"style\":{\"layout_flexGrow\":1}}\n]", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 12; Pixel 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\"\n}", "lastUpdateTime": 1784381200000, "respondTime": 180000, "ruleBookInfo": {"author": "[property=\"og:novel:author\"]@content", "coverUrl": "[property=\"og:image\"]@content", "intro": "[property=\"og:description\"]@content", "kind": "[property=\"og:novel:category\"]@content&&[property=\"og:novel:status\"]@content", "lastChapter": "[property=\"og:novel:latest_chapter_name\"]@content", "name": "[property=\"og:novel:book_name\"]@content", "tocUrl": "[property=\"og:novel:read_url\"]@content"}, "ruleToc": {"chapterList": ".book_list2 ul li a", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": "@js:\nvar tocUrls = [];\nvar totalText = String(org.jsoup.Jsoup.parse(result).select('.book_list2').prev('h2').text());\nvar totalMatch = totalText.match(/共\\s*(\\d+)\\s*章/);\nif(totalMatch) {\n    var totalChapters = parseInt(totalMatch[1]);\n    var totalPages = Math.ceil(totalChapters / 100);\n    for(var i = 1; i <= totalPages; i++) {\n        tocUrls.push(baseUrl + 'index_' + i + '.html');\n    }\n}\ntocUrls;"}, "ruleContent": {"content": "article@html", "nextContentUrl": "@js:\nvar nextUrl = String(org.jsoup.Jsoup.parse(result).select('#next1').attr('href'));\nif (nextUrl.indexOf('_') > -1) {\n    nextUrl;\n} else {\n    \"\";\n}", "replaceRegex": "##第\\(\\d+/\\d+\\)页"}, "ruleExplore": {"author": ".book_other:contains(作者) span@text||.author a@text||span.update:contains(作者)@text##作者：##", "bookList": ".box.hot .row > div:has(h3)", "bookUrl": "h3 a@href", "coverUrl": "img@src", "kind": "h3 a@text##^\\s*\\[([^\\]]+)\\].*##$1###.book_other:contains(状态)@text", "lastChapter": ".book_other:contains(最新) a@text||.book_other:contains(最新章节) a@text", "name": "h3 a@text##\\[.*\\]##"}, "ruleSearch": {"author": ".book_other:contains(作者) a@text", "bookList": ".box.hot .row > div:has(h3)", "bookUrl": "h3 a@href", "coverUrl": "img@src", "kind": "h3 a@text", "lastChapter": ".book_other:contains(最新) a@text", "name": "h3 a@text"}, "searchUrl": "/search.php?q={{key}}&p={{page}}", "weight": 10},{"bookSourceComment": "//26.7.17修复\n//修复正文为空，添加搜索切换长篇和短篇，更改简体", "bookSourceGroup": "老司机", "bookSourceName": "情色网小说网🎋", "bookSourceType": 0, "bookSourceUrl": "https://www.book18.org", "customOrder": 6491, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "[\n  {\"title\":\"发现-最新(长篇)\",\"url\":\"https://www.book18.org/zh-hans?sort=created&page={{page}}&per-page=50\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.4}},\n  {\"title\":\"发现-最多(长篇)\",\"url\":\"https://www.book18.org/zh-hans?sort=hits&page={{page}}&per-page=50\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.4}},\n  {\"title\":\"发现-最火(长篇)\",\"url\":\"https://www.book18.org/zh-hans?sort=views&page={{page}}&per-page=50\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.4}},\n  {\"title\":\"发现-推荐(长篇)\",\"url\":\"https://www.book18.org/zh-hans?sort=score&page={{page}}&per-page=50\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.4}},\n  {\"title\":\"发现-最好(长篇)\",\"url\":\"https://www.book18.org/zh-hans?sort=likes&page={{page}}&per-page=50\",\"style\":{\"layout_flexGrow\":1,\"layout_flexBasisPercent\":0.4}}\n]", "lastUpdateTime": 1784371200000, "respondTime": 180000, "loginUrl": "https://www.book18.org/zh-hans", "loginUi": "[\n  {\n    \"name\": \"🔄 点击一键切换【长篇/短篇】搜索\",\n    \"type\": \"button\",\n    \"action\": \"var currentType = source.getVariable() || '长篇'; var nextType = currentType == '长篇' ? '短篇' : '长篇'; source.setVariable(nextType); java.toast('🎋 切换成功！当前状态：【' + nextType + '】，请直接按手机返回键退出弹窗');\",\n    \"style\": {\n      \"layout_flexGrow\": 1,\n      \"layout_flexBasisPercent\": 1\n    }\n  }\n]", "ruleBookInfo": {"author": "[property=\"og:description\"]@content##.*作者：(\\S+)##$1", "intro": "[property=\"og:description\"]@content", "name": "h1@text"}, "ruleContent": {"content": "#content@html", "replaceRegex": "##\\s*book18\\.org"}, "ruleExplore": {"bookList": ".list-group-item", "bookUrl": "a@href", "name": "a@text"}, "ruleSearch": {"bookList": ".list-group-item", "bookUrl": "a@href", "name": "a@text"}, "ruleToc": {"chapterList": ".list-group-item a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "@js:\nvar type = \"长篇\";\ntry {\n    type = source.getVariable() || \"长篇\";\n} catch(e) {}\n\nif (type == \"短篇\") {\n    \"https://www.book18.org/zh-hans/article/index?q=\" + java.encodeURI(key, \"UTF-8\");\n} else {\n    \"https://www.book18.org/zh-hans?q=\" + java.encodeURI(key, \"UTF-8\");\n}", "weight": 0},{"bookSourceGroup": "AI", "bookSourceName": "笔趣阁新站", "bookSourceType": 0, "bookSourceUrl": "http://www.kkbiquge.net", "customButton": false, "customOrder": 1, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "玄幻魔法::http://www.kkbiquge.net/class/xuanhuanmofa/{{page}}/\n仙侠修真::http://www.kkbiquge.net/class/xianxiaxiuzhen/{{page}}/\n都市言情::http://www.kkbiquge.net/class/dushuyanqing/{{page}}/\n历史军事::http://www.kkbiquge.net/class/lishijunshi/{{page}}/\n网游动漫::http://www.kkbiquge.net/class/wangyoudongman/{{page}}/\n科幻小说::http://www.kkbiquge.net/class/kehuanxiaoshuo/{{page}}/\n女生小说::http://www.kkbiquge.net/class/nvshengxiaoshuo/{{page}}/\n其他小说::http://www.kkbiquge.net/class/qitaxiaoshuo/{{page}}/\n总排行榜::http://www.kkbiquge.net/rank/allvisit/{{page}}/\n月排行榜::http://www.kkbiquge.net/rank/monthvisit/{{page}}/\n周排行榜::http://www.kkbiquge.net/rank/weekvisit/{{page}}/\n收藏榜::http://www.kkbiquge.net/rank/goodnum/{{page}}/\n全本小说::http://www.kkbiquge.net/quanben/class/{{page}}/", "header": "User-Agent: Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Mobile Safari/537.36", "lastUpdateTime": "1784180257492", "respondTime": 180000, "ruleBookInfo": {"author": "div#info a.0@text", "intro": "div#intro@text", "kind": "div#info@text##[\\s\\S]*类别：(\\S+)[\\s\\S]*##$1", "name": "h1@text", "wordCount": "div#info@text##[\\s\\S]*?(\\d+万字)[\\s\\S]*##$1"}, "ruleContent": {"content": "#booktxt@html", "nextContentUrl": "text.下一页@href"}, "ruleExplore": {"author": ".btm a.0@text", "bookList": ".item", "bookUrl": "dt a@href", "coverUrl": ".image img@data-original", "intro": "dd@text", "name": "dt a@text", "wordCount": ".btm em.orange@text"}, "ruleSearch": {"author": ".btm a.0@text", "bookList": ".item", "bookUrl": "dt a@href", "intro": "dd@text", "name": "dt a@text", "wordCount": ".btm em.orange@text"}, "ruleToc": {"chapterList": "div#list a[rel=chapter]", "chapterName": "dd@text", "chapterUrl": "@href"}, "searchUrl": "{{cookie.removeCookie(source.getKey())}}http://www.kkbiquge.net/search2c.html?searchkey={{key}}", "weight": 0},{"bookSourceGroup": "AI,18加", "bookSourceName": "搬山人小说网", "bookSourceType": 0, "bookSourceUrl": "https://www.banshanren.com", "bookUrlPattern": "https://www.banshanren.com/novel/.*", "customButton": false, "customOrder": 62, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[{\"title\": \"奇幻玄幻\", \"url\": \"/all/0-4-0-0-0-0-1-{{page}}/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"武侠仙侠\", \"url\": \"/all/0-5-0-0-0-0-1-{{page}}/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"都市言情\", \"url\": \"/all/0-6-0-0-0-0-1-{{page}}/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"历史军事\", \"url\": \"/all/0-7-0-0-0-0-1-{{page}}/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"游戏竞技\", \"url\": \"/all/0-8-0-0-0-0-1-{{page}}/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"科幻未来\", \"url\": \"/all/0-9-0-0-0-0-1-{{page}}/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"悬疑灵异\", \"url\": \"/all/0-10-0-0-0-0-1-{{page}}/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"同人衍生\", \"url\": \"/all/0-11-0-0-0-0-1-{{page}}/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"轻小说\", \"url\": \"/all/0-12-0-0-0-0-1-{{page}}/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"名著传记\", \"url\": \"/all/0-13-0-0-0-0-1-{{page}}/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.25}}, {\"title\": \"最近更新\", \"url\": \"/all/0-0-0-0-0-1-1-{{page}}/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}}, {\"title\": \"最新上架\", \"url\": \"/all/0-0-0-0-0-2-1-{{page}}/\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.5}}]", "header": "{\"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36\"}", "lastUpdateTime": "1784123206817", "loginUrl": "https://www.banshanren.com", "respondTime": 180000, "ruleBookInfo": {"author": "[name=\"description\"]@content<js>\nvar m = String(result).match(/》是(.*?)创作/);\nresult = m ? m[1] : '';\n</js>", "coverUrl": "[property=\"og:image\"]@content", "intro": "[property=\"og:description\"]@content", "kind": ".novel_tag_list a@title&&.category_list a@text##\\#", "lastChapter": ".catalog_top_box .hl@text", "name": "h1@text"}, "ruleContent": {"content": ".chapter_content_box p@html##\\<span.*\\>\\d+\\</span\\>", "nextContentUrl": "text.下一章@href"}, "ruleExplore": {"author": ".info_box.1@text## ·.*", "bookList": "ul[class=\"novel_list\"] .novel_li", "bookUrl": ".title@href", "coverUrl": "img@data-src", "kind": ".category_list a@text", "name": ".title@text", "wordCount": ".info_box.1@text##.*· "}, "ruleSearch": {"author": ".info_box.1@text## ·.*", "bookList": "ul[class=\"novel_list\"] .novel_li", "bookUrl": ".title@href", "coverUrl": "img@data-src", "intro": ".novel_intro_box p@text", "kind": ".category_list a@text", "name": ".title@text##🔞", "wordCount": ".info_box.1@text##.*· "}, "ruleToc": {"chapterList": "li[class~=volume_chapter] a&&ul[class~=chapter_list] a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "https://www.banshanren.com/search/index?keyword={{key}}&page={{page}},{\"charset\": \"UTF-8\"}", "weight": 0},{"bookSourceComment": "//目录，正文可能夹带网址\n//26.7.15制作", "bookSourceGroup": "🔞, 耽美", "bookSourceName": "📚 18ii", "bookSourceType": 0, "bookSourceUrl": "https://www.18ii.net", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "enabledSearch": true, "exploreUrl": "精品推荐 & 本周强推::/\n完整书城::/bookstack/\n热门排行榜::/book/ranking.html", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\"\n}", "ruleBookInfo": {"author": "meta[name=og:novel:author]@content", "coverUrl": "meta[name=og:image]@content", "intro": ".intro@text", "kind": "meta[name=og:novel:category]@content, meta[name=og:novel:status]@content", "lastChapter": "meta[name=og:novel:latest_chapter_name]@content", "name": "meta[name=og:novel:book_name]@content", "tocUrl": "text.查看完整章節目錄@href || text.查看目錄@href || a[href$=dir]@href"}, "ruleContent": {"content": ".content@html", "nextContentUrl": "@js:\nvar nextUrl = String(java.getString('text.下一章@href, .foot-nav a:contains(下一章)@href', false));\n(nextUrl && nextUrl.indexOf('_') > -1) ? nextUrl : '';", "replaceRegex": "##(?is)<div class=\"adBlock\".*?</div>"}, "ruleExplore": {"author": ".author@text || span.author@text", "bookList": "ul.list li || .search-list ul.list li || ul.news li", "bookUrl": "h3 a@href", "coverUrl": "img@src", "intro": ".desc@text", "name": "h3 a@text"}, "ruleSearch": {"author": ".author@text", "bookList": ".search-list ul.list li", "bookUrl": "h3 a@href", "coverUrl": "img@src", "intro": ".desc@text", "name": "h3 a@text"}, "ruleToc": {"chapterList": ".chaplist ul li a || a[href~=\\d+\\.html]", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "/search/{{key}}", "weight": 0},{"bookSourceName": "爱丽丝书屋", "bookSourceGroup": "成人小说", "bookSourceUrl": "https://www.alicesw.com", "bookSourceType": 0, "bookUrlPattern": "https?://www\\.alicesw\\.com/novel/\\d+\\.html", "searchUrl": "https://www.alicesw.com/search.html?q={{key}}", "exploreUrl": "乱伦::https://www.alicesw.com/lists/65.html\n都市::https://www.alicesw.com/lists/64.html\n玄幻::https://www.alicesw.com/lists/62.html\n校园::https://www.alicesw.com/lists/61.html\n同人::https://www.alicesw.com/lists/73.html\n系统::https://www.alicesw.com/lists/69.html\n穿越::https://www.alicesw.com/lists/70.html\n重口::https://www.alicesw.com/lists/21.html\nNTR::https://www.alicesw.com/lists/54.html\n调教::https://www.alicesw.com/lists/58.html", "ruleSearch": {"bookList": "h2 a, li:has(a), .novel-item", "name": "a@text", "author": "作者：@text|作者：(.*?)\\s", "coverUrl": "img@src||https://www.alicesw.com/favicon.ico", "kind": "字数：@text|分类：@text", "intro": "@text", "lastChapter": "", "bookUrl": "a@href"}, "ruleExplore": {"bookList": "table tr, tbody tr, li:has(a[href*='/novel/']), .list-item", "name": "a@text", "author": "作者@text", "coverUrl": "img@src||https://www.alicesw.com/favicon.ico", "kind": "", "intro": "@text", "lastChapter": "最新章节@text", "bookUrl": "a@href"}, "ruleBookInfo": {"name": "h1@text", "author": "作 者：@text|作者：(.*?)\\s", "kind": "分 类：@text", "intro": "内容简介：@text|简介@text", "coverUrl": "img@src||https://www.alicesw.com/favicon.ico", "lastChapter": "最新章节：@text"}, "ruleToc": {"chapterList": "#chapters a, .chapter-list a, .list a", "chapterName": "a@text", "chapterUrl": "a@href"}, "ruleContent": {"content": "#content@html|article@html|div.content@html|.chapter-content@html", "nextUrl": "下一章@href|下一页@href", "replaceRegex": ["\\s+阅读更多请访问.*", "爱丽丝书屋.*", "本书由网友上传.*", "所有小说中出现的人物均为18岁以上的成人.*"]}, "httpUserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36", "weight": 100, "lastUpdateTime": "1783933338604"},{"bookSourceComment": "需要先在登录页面获取网址。\n部分内容需要登录才会显示，可登可不登。\n原作寿横、jiajunjin大佬，优化了发现和登录ui，添加了jm号搜索，添加魔法线路，有问题换魔法别用日韩。", "bookSourceGroup": "漫画", "bookSourceName": "🎨禁漫天堂", "bookSourceType": 2, "bookSourceUrl": "https://jmcomicqa.cc", "customButton": false, "customOrder": 36, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "@js:\neval(String(source.loginUrl));\n\nvar URL =  $$$.url;\nvar lineType = $$$.lineType || '主线路'; \nvar shunt = $$$.shunt || 1;\nvar weekIndex = $$$.weekIndex || 0; \nvar list = [];\n\nfunction push(title, url, size) { \n    list.push({\n        \"title\": title,\n        \"url\": url,\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": size\n        }\n    });\n}\n\nvar urlHint = (lineType === '备用线路') ? ' (备用线路)' : (lineType === '国际通用' ? ' (国际通用)' : (lineType === '东南亚' ? ' (东南亚)' : ' (主线路)'));\n\npush('❗❗为空请获取/更换链接，然后刷新❗❗','', 1);\npush('[▶ '+$$$.name+' ◀]', '', 1);\npush('[ '+$$$.url + urlHint + ' 分流' + $$$.shunt + ' ]', '', 1);\n\nvar sortConfigs = [\n  { key: 'mr', title: '按时间' },\n  { key: 'mv', title: '按阅读' },\n  { key: 'tf', title: '按最爱' },\n  { key: 'mo', title: '按收藏' },\n  { key: 'tr', title: '按评分' },\n  { key: 'md', title: '按评论' },\n  { key: 'mp', title: '按图片' }\n];\n\nvar categories = [\n[\"全部\", \"albums?o={key}&page=\"],\n  [\"COS\", \"albums/another/sub/cosplay?o={key}&page=\"],\n  [\"3D\", \"search/photos?search_query=3D&o={key}&page=\"],\n  [\"韩漫\", \"albums/hanman?o={key}&page=\"],\n  [\"热门\", \"albums?o={key}&page=\"],\n  [\"单本\", \"albums/single?o={key}&page=<,{{page}}>\"],\n  [\"CG\", \"albums/doujin/sub/CG?o={key}&page=<,{{page}}>\"],\n  [\"青年漫\", \"albums/single/sub/youth?o={key}&page=<,{{page}}>\"],\n  [\"短篇\", \"albums/short?o={key}&page=<,{{page}}>\"],\n  [\"同人\", \"albums/doujin?o={key}&page=<,{{page}}>\"],\n  [\"其他\", \"albums/another?o={key}&page=<,{{page}}>\"],\n  [\"小说\", \"novels?o=mv?o={key}&page=<,{{page}}>\"],\n  [\"美漫\", \"albums/meiman?o={key}&page=<,{{page}}>\"],\n  [\"C106&推荐本本\", \"promotes/29?o={key}&page=<,{{page}}>\"],\n  [\"禁漫去码&全彩化\", \"promotes/30?o={key}&page=<,{{page}}>\"],\n  [\"禁漫汉化组\", \"search/photos?main_tag=0&search_query=%E7%A6%81%E6%BC%AB%E6%B1%89%E5%C%96%E7%BB%84?o={key}&page=<,{{page}}>\"]\n];\n\nvar currentTagIndex = Math.min(Math.max($$$.tag || 0, 0), sortConfigs.length - 1);\nvar currentKey = sortConfigs[currentTagIndex].key;\nvar currentTitle = sortConfigs[currentTagIndex].title;\n\n\npush('🏷️分类标签---' + currentTitle + '🏷️', '', 1);\n\n\n\nfor (var j = 0; j < categories.length; j++) {\n  var arr = categories[j];\n  var t = arr[0];\n  var u = arr[1];\n  var url = URL + '/' + u.replace('{key}', currentKey);\n  if (u.indexOf('<,{{page}}>') === -1) {\n    url += '{{page}}';\n  }\n  push(t, url, 0.25);\n}\npush('🏷️每周必看 (当前: ' + weekIndex + ', 范围 0-210,0为最新)🏷️','',1); \n\ntry {\n    var pageHtml = java.ajax(URL + '/albums'); \n    var albumRegex = /href=\"\\/album\\/(\\d+)\"/g;\n    var matches = [];\n    var match;\n    while ((match = albumRegex.exec(pageHtml)) !== null) {\n        matches.push(match[1]);\n    }\n    if (matches.length > 0) {\n        var randomId = matches[Math.floor(Math.random() * matches.length)];\n        var randomUrl = URL + '/album/' + randomId;\n        push('🎲 随机看一本(仅测试版可用) 🎲', randomUrl, 1);\n    }\n} catch (e) {\n    java.log('Failed to fetch random album: ' + e);\n}\n\nvar weeklyTypes = [['日漫','manga'],['韩漫','hanman'],['其他','another']];\nfor (var i = 0; i < weeklyTypes.length; i++) {\n    var arr = weeklyTypes[i];\n    var t = arr[0];\n    var p = arr[1];\n    push(t, URL + '/week/' + weekIndex + '?skdad=1&type=' + p + '&page={{page}}', 0.25);\n}\n\n\n\npush('🏷️每周连载🏷️', '', 1);\nlet _list = [[\"周一\", \"serialization/1&page=\"], [\"周二\", \"serialization/2&page=\"], [\"周三\", \"serialization/3&page=\"], [\"周四\", \"serialization/4&page=\"],[\"周五\", \"serialization/5&page=\"], [\"周六\", \"serialization/6&page=\"], [\"周日\", \"serialization/7&page=\"], [\"已完结\", \"serialization/7&page=\"]];\n    _list.map(([t, u]) => {\n    \t    push(t, `${URL}/${u}` + '{{page}}', 0.25);\n    \t});\npush('👁‍🗨阅读排行榜👁‍🗨', '', 1);\nvar typeList = [[\"日榜\", \"&t=t\"], [\"周榜\", \"&t=w\"], [\"月榜\", \"&t=m\"],[\"总榜\", \"\"]];\nfor (var k = 0; k < typeList.length; k++) {\n    var arr = typeList[k];\n    var t = arr[0];\n    var type = arr[1];\n    push(t, URL + '/albums?o=mv' + type + '&page=' + '{{page}}' , 0.2);\n}\n\t\npush('♥️收藏排行榜♥️', '', 1);\nfor (var l = 0; l < typeList.length; l++) {\n    var arr = typeList[l];\n    var t = arr[0];\n    var type = arr[1];\n    push(t, URL + '/albums?o=mo' + type + '&page=' + '{{page}}', 0.2);\n}\n\nvar sorts1 = [\"無修正\",\"劇情向\",\"青年漫\",\"校服\",\"純愛\",\"人妻\",\"教師\",\"百合\",\"Yaoi\",\"性轉\",\"女裝\",\"癡女\",\"全彩\",\"女性向\",\"完結\",\"純愛\",\"禁漫漢化組\"];\nvar sorts2 = [\"御姐\",\"熟女\",\"未成年\",\"巨乳\",\"貧乳\",\"女性支配\",\"教師\",\"女僕\",\"護士\",\"泳裝\",\"眼鏡\",\"連褲襪\",\"其他制服\",\"兔女郎\"];\nvar sorts3 = [\"群交\",\"足交\",\"束縛\",\"肛交\",\"阿黑顏\",\"藥物\",\"扶他\",\"調教\",\"野外露出\",\"催眠\",\"自慰\",\"觸手\",\"獸交\",\"亞人\",\"怪物女孩\",\"皮物\",\"附身\",\"ryona\",\"骑大车\"];\nvar sorts4 = [\"CG\",\"重口\",\"獵奇\",\"非H\",\"血腥暴力\",\"站長推薦\"];\nvar sortCriteria = [\n  { label: '🏷️标签---按时间🏷️', sort: 'mr' },\n  { label: '🏷️标签---按阅读🏷️', sort: 'mv' },\n  { label: '🏷️标签---按最爱🏷️', sort: 'tf' },\n  { label: '🏷️标签---按收藏🏷️', sort: 'mo' },\n  { label: '🏷️标签---按评分🏷️', sort: 'tr' },\n  { label: '🏷️标签---按评论🏷️', sort: 'md' },\n  { label: '🏷️标签---按图片🏷️', sort: 'mp' }\n];\n\nvar sort =  sortCriteria[$$$.tag].sort;\nvar label = sortCriteria[$$$.tag].label;\n\npush(label, '', 1);\npush('▶主题A漫◀','', 1);\nfor (var m = 0; m < sorts1.length; m++) {\n    var s = sorts1[m];\n    push(s, URL + '/search/photos?search_query=' + s + '&o=' + sort + '&page=' + '{{page}}', 0.25);\n}\n\npush('▶角色/扮演◀','', 1);\nfor (var n = 0; n < sorts2.length; n++) {\n    var s = sorts2[n];\n    push(s, URL + '/search/photos?search_query=' + s + '&o=' + sort + '&page=' + '{{page}}', 0.25);\n}\n\npush('▶特殊PLAY◀','', 1);\nfor (var p = 0; p < sorts3.length; p++) {\n    var s = sorts3[p];\n    push(s, URL + '/search/photos?search_query=' + s + '&o=' + sort + '&page=' + '{{page}}', 0.25);\n}\n\npush('▶其他◀','', 1);\nfor (var q = 0; q < sorts4.length; q++) {\n    var s = sorts4[q];\n    push(s, URL + '/search/photos?search_query=' + s + '&o=' + sort + '&page=' + '{{page}}', 0.25);\n}\n    \nJSON.stringify(list);", "header": "{\n\t\"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0\",\n\"Referer\":\"https://18comic.vip/\"\n}", "jsLib": "function Get(e) {\n    var $this = this;\n    var java = $this.java;\n    var source = $this.source;\n    var cookie = $this.cookie;\n    var get = JSON.parse(source.getVariable());\n    return get[e];\n}", "lastUpdateTime": "1783741235277", "loginCheckJs": " var resultUrl = result.url();\n var resultCode = result.code();\n var resultBoDy = result.body();\n if (/_cf_|ge_ua|verify.php/ig.test(resultBoDy) ) {\n     if (key) {\n         url = baseUrl + java.ruleUrl;\n     }\n     cookie.removeCookie(baseUrl)\n     result = java.startBrowserAwait(resultUrl, \n     \t\"验证\", false);\n }\nresult;", "loginUi": "[ \n    {\n        \"name\": \"账号\",\n        \"type\": \"text\"\n    },\n    {\n        \"name\": \"密码\",\n        \"type\": \"password\"\n    },\n    {\n        \"name\": \"༺»`点击切换分流´«༻\",\n        \"type\": \"button\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"切换分流线路(1-4)\",\n        \"type\": \"button\",\n        \"action\": \"toggleShunt()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.3\n        }\n    },\n    {\n        \"name\": \"切换国际线路\",\n        \"type\": \"button\",\n        \"action\": \"setIntlUrl()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.3,\n            \"fontSize\": \"medium\",\n            \"padding\": \"10px\",\n            \"fontWeight\": \"bold\",\n            \"color\": \"white\",\n            \"backgroundColor\": \"#28a745\"\n        }\n    },\n    {\n        \"name\": \"切换东南亚线路\",\n        \"type\": \"button\",\n        \"action\": \"setSeaUrl()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.3,\n            \"fontSize\": \"medium\",\n            \"padding\": \"10px\",\n            \"fontWeight\": \"bold\",\n            \"color\": \"#000000\",\n            \"backgroundColor\": \"#ffc107\"\n        }\n    },\n    {\n        \"name\": \"❤️获取/切换国内直连\",\n        \"type\": \"button\",\n        \"action\": \"url()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.3,\n            \"fontSize\": \"large\",\n            \"padding\": \"15px\",\n            \"fontWeight\": \"bold\",\n            \"color\": \"white\",\n            \"backgroundColor\": \"#007bff\"\n        }\n    },\n    \n    {\n        \"name\": \"༺ˇ»`ʚ  点击切换排序    ɞ´«ˇ༻\",\n        \"type\": \"button\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"时间\",\n        \"type\": \"button\",\n        \"action\": \"tag(0)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"阅读\",\n        \"type\": \"button\",\n        \"action\": \"tag(1)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"最爱\",\n        \"type\": \"button\",\n        \"action\": \"tag(2)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"收藏\",\n        \"type\": \"button\",\n        \"action\": \"tag(3)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"评分\",\n        \"type\": \"button\",\n        \"action\": \"tag(4)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"评论\",\n        \"type\": \"button\",\n        \"action\": \"tag(5)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"图片\",\n        \"type\": \"button\",\n        \"action\": \"tag(6)\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.25\n        }\n    },\n    {\n        \"name\": \"༺»`每周必看索引 (0-210)´«༻\",\n        \"type\": \"button\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 1\n        }\n    },\n    {\n        \"name\": \"重置\",\n        \"type\": \"button\",\n        \"action\": \"resetWeekIndex()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"随机\",\n        \"type\": \"button\",\n        \"action\": \"randomWeekIndex()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"+1\",\n        \"type\": \"button\",\n        \"action\": \"incrementWeekIndex()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        \"name\": \"-1\",\n        \"type\": \"button\",\n        \"action\": \"decrementWeekIndex()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    }\n]", "loginUrl": "var intlLinks = [];\nvar seaLinks = [];\nvar defaultIntlLinks = ['https://18comic.vip', 'https://18comic.ink'];\nvar defaultSeaLinks = ['https://jmcomic-zzz.one', 'https://jmcomic-zzz.org'];\nvar cachedPageHtml = null;\n\nfunction extractLinks(pageHtml, blockRegex) {\n    var links = [];\n    if (!pageHtml) return links;\n    var blockMatch = pageHtml.match(blockRegex);\n    if (blockMatch && blockMatch[1]) {\n        var blockContent = blockMatch[1];\n        var linkMatches = blockContent.match(/<span>(.*?)<\\/span>/g);\n        if (linkMatches) {\n            links = linkMatches.map(function(spanTag) {\n                var domain = spanTag.replace(/<\\/?span>/g, '').trim();\n                return 'https://' + domain;\n            }).filter(function(url) {\n                return url !== 'https://';\n            });\n        }\n    }\n    return links;\n}\n\nvar intlBlockRegex = /<div class=\"international\">([\\s\\S]*?)<\\/div>/;\nvar seaBlockRegex = /<div class=\"southeast_asia\">([\\s\\S]*?)<\\/div>/;\n\ntry {\n    cachedPageHtml = java.ajax('https://jmcomicqa.cc');\n    intlLinks = extractLinks(cachedPageHtml, intlBlockRegex);\n    seaLinks = extractLinks(cachedPageHtml, seaBlockRegex);\n\n    if (intlLinks.length === 0) {\n        java.log('未能从jmcomicqa.cc提取国际线路, 启用备用线路。');\n        intlLinks = defaultIntlLinks;\n    }\n    if (seaLinks.length === 0) {\n        java.log('未能从jmcomicqa.cc提取东南亚线路, 启用备用线路。');\n        seaLinks = defaultSeaLinks;\n    }\n} catch (e) {\n    java.log('访问jmcomicqa.cc失败, 启用备用线路: ' + e);\n    intlLinks = defaultIntlLinks;\n    seaLinks = defaultSeaLinks;\n}\n\nvar original = {\n    'url': 'https://jmcomicqa.cc',\n    'name': '寿横',\n    'tag': 0,\n    'weekIndex': 0, \n    'shunt': 1,\n    'usedIndexes': [],\n    'lineType': '主线路',\n    'intlLinkIndex': 0,\n    'seaLinkIndex': 0\n};\ntry {\n    $$$= JSON.parse(source.getVariable());\n    if ($$$ == null) {\n        throw new Error();\n    } else {\n        if (!$$$.hasOwnProperty('usedIndexes'))$$$.usedIndexes = [];\n        if (!$$$.hasOwnProperty('weekIndex')) $$$.weekIndex = 0;\n        if (!$$$.hasOwnProperty('tag')) $$$.tag = 0;\n        if (!$$$.hasOwnProperty('shunt')) $$$.shunt = 1; \n        if (!$$$.hasOwnProperty('lineType')) $$$.lineType = '主线路';\n        if (!$$$.hasOwnProperty('intlLinkIndex')) $$$.intlLinkIndex = 0;\n        if (!$$$.hasOwnProperty('seaLinkIndex')) $$$.seaLinkIndex = 0;\n    };\n} catch (e) {\n    $$$= original;\n    put($$$);\n}\n\nfunction put(data) {\n    return source.setVariable(JSON.stringify(data, null, '\\t'));\n}\n\nfunction n(e) {\n    var n_str = '\\n';\n    for (var m = 1; m < e; m++) {\n        n_str = n_str + '\\n';\n    }\n    return n_str;\n}\n\nfunction log(e) {\n    if (e == undefined) {\n        return;\n    }\n    java.longToast(e);\n}\n\nvar regexList = [\n    /china\"><span>(.*?)<\\/span>/,\n    /first_line\"><span>(.*?)<\\/span>/,\n    /second_line\"><span>(.*?)<\\/span>/\n];\n\nfunction getRandomUnusedIndex() {\n    if ($$$.usedIndexes.length === regexList.length) {\n       $$$.usedIndexes = [];\n    }\n    var randomIndex;\n    do {\n        randomIndex = Math.floor(Math.random() * regexList.length);\n    } while ($$$.usedIndexes.indexOf(randomIndex) !== -1);\n    $$$.usedIndexes.push(randomIndex);\n    put($$$);\n    return randomIndex;\n}\n\nvar MAX_INDEX = 210;\nvar MIN_INDEX = 0;\n\nfunction updateIndex(newIndex) {\n    if (newIndex !== $$$.weekIndex) {\n        $$$.weekIndex = newIndex;\n        put($$$);\n        log('【索引更新】每周必看索引已更新为: ' + newIndex + n(2) + '请刷新探索页');\n    } else {\n        log('【提示】索引值未更改，当前值为: ' + newIndex);\n    }\n}\n\nfunction randomWeekIndex() {\n    var newIndex = Math.floor(Math.random() * (MAX_INDEX + 1));\n    updateIndex(newIndex);\n}\n\nfunction incrementWeekIndex() {\n    var newIndex = $$$.weekIndex + 1;\n    if (newIndex > MAX_INDEX) {\n        newIndex = MAX_INDEX;\n        log('【警告】已达最大索引值: ' + MAX_INDEX);\n    }\n    updateIndex(newIndex);\n}\n\nfunction decrementWeekIndex() {\n    var newIndex = $$$.weekIndex - 1;\n    if (newIndex < MIN_INDEX) {\n        newIndex = MIN_INDEX;\n        log('【警告】已达最小索引值: ' + MIN_INDEX);\n    }\n    updateIndex(newIndex);\n}\n\nfunction resetWeekIndex() {\n    updateIndex(MIN_INDEX);\n}\n\nfunction login() {\n    var result = JSON.parse(source.getLoginInfo());\n    var username = result['账号'];\n    $$$.name = username;\n    var password = result['密码'];\n    var options = {\n\t   body: 'username=' + username + '&password=' + password + '&submit_login=1',\n\t   method: 'POST'\n\t};\n    if (!cachedPageHtml) {\n        cachedPageHtml = java.ajax('https://jmcomicqa.cc');\n    }\n    var randomIndex = getRandomUnusedIndex();\n    var currentRegex = regexList[randomIndex];\n    var matchResult = cachedPageHtml.match(currentRegex);\n    var url = matchResult ? matchResult[1] : $$$.url;\n    \n    var lineType = randomIndex === 0 ? '主线路' : '备用线路';\n    var lineHint = randomIndex === 0 ? ' (默认主线路)' : ' (备用线路)';\n    log('站点变更:' + url + lineHint);\n    \n    $$$.url = url;\n    $$$.lineType = lineType;\n    put($$$);\n    java.ajax(url + '/login,' + JSON.stringify(options));\n    return put($$$);\n}\n\nvar P = ['时间', '阅读', '最爱', '收藏', '评分', '评论', '图片'];\n\nfunction typeP(e) {\n    if (e == undefined || e < 0 || e >= P.length) {\n        e = 0;\n    }\n    return P[e];\n}\n\nfunction tag(e) {\n    if (e == $$$.tag) {\n        return log('【标签切换提示】' + n(2) + '已经选择[' + typeP(e) + ']，无需更换');\n    }\n    log('【标签切换提示】' + n(2) + '已经切换到[' + typeP(e) + ']，请刷新探索页');\n    $$$.tag = e;\n    return put($$$);\n}\n\nfunction url() {\n    if (!cachedPageHtml) {\n        cachedPageHtml = java.ajax('https://jmcomicqa.cc');\n    }\n    var randomIndex = getRandomUnusedIndex();\n    var currentRegex = regexList[randomIndex];\n    var matchResult = cachedPageHtml.match(currentRegex);\n    var url = matchResult ? matchResult[1] : $$$.url;\n    \n    var lineType = randomIndex === 0 ? '主线路' : '备用线路';\n    var lineHint = randomIndex === 0 ? ' (默认主线路)' : ' (备用线路)';\n    \n    if (url == $$$.url) {\n        return log('【站点提示】' + n(2) + '站点无需更换，当前为' + lineHint);\n    }\n    log('站点变更:' + url + lineHint);\n    $$$.url = url;\n    $$$.lineType = lineType;\n    return put($$$);\n}\n\nfunction setIntlUrl() {\n    if (typeof $$$.intlLinkIndex === 'undefined') $$$.intlLinkIndex = 0;\n    $$$.intlLinkIndex = ($$$.intlLinkIndex + 1) % intlLinks.length;\n    var newUrl = intlLinks[$$$.intlLinkIndex];\n    $$$.url = newUrl;\n    $$$.lineType = '国际通用，需魔法';\n    put($$$);\n    log('【国际站点】已切换 (' + ($$$.intlLinkIndex + 1) + '/' + intlLinks.length + '): ' + newUrl + n(2) + '请刷新探索页');\n}\n\nfunction setSeaUrl() {\n    if (typeof $$$.seaLinkIndex === 'undefined') $$$.seaLinkIndex = 0;\n    $$$.seaLinkIndex = ($$$.seaLinkIndex + 1) % seaLinks.length;\n    var newUrl = seaLinks[$$$.seaLinkIndex];\n    $$$.url = newUrl;\n    $$$.lineType = '东南亚，需魔法';\n    put($$$);\n    log('【东南亚站点】已切换 (' + ($$$.seaLinkIndex + 1) + '/' + seaLinks.length + '): ' + newUrl + n(2) + '请刷新探索页');\n}\n\nfunction toggleShunt() {\n    var newShunt = $$$.shunt + 1;\n    if (newShunt > 4) {\n        newShunt = 1;\n    }\n    log('【分流切换提示】' + n(2) + '已切换分流: ' + $$$.shunt + ' -> ' + newShunt + '，请刷新探索页');\n    $$$.shunt = newShunt;\n    return put($$$);\n}\n\n\nfunction shunt(e) {\n    if (e < 1 || e > 4) {\n        return log('【分流提示】' + n(2) + '分流值不合法，范围为1-4。');\n    }\n    if (e == $$$.shunt) {\n        return log('【分流切换提示】' + n(2) + '已经选择分流[' + e + ']，无需更换');\n    }\n    log('【分流切换提示】' + n(2) + '已经切换到分流[' + e + ']，请刷新探索页');\n    $$$.shunt = e;\n    return put($$$);}", "respondTime": 180000, "ruleBookInfo": {"author": "{{@@.phone-author-tag@text}}", "coverUrl": ".thumb-overlay.2@img@src", "init": "<js>\nurl = baseUrl\nvar num = baseUrl.indexOf(\"novel\") !== -1 ? 1 : 2;\njava.put(\"btype\",num);\nresult\n</js>", "intro": " {{@@class.train-number@text}}\n{{@@class.intro-collapse-content@text}}\n{{@@class.p-t-5 float-left@text##日期}}    {{@@class.p-t-5 float-right@text##日期}}\n{{@@class.col-xs-12 col-lg-7 nav-tab-content@class.p-t-5 p-b-5@text##叙述：|敘述：}}", "kind": "@js:\nvar text;\nif (baseUrl.indexOf('novel') !== -1){\n\ttext=java.getString('span[data-type=tags]@a@text');\n}else {\n\ttext=java.getString('#intro-block@[data-type=tags]@a@text');\n}\ntext;", "name": "{{@@h1@text}}", "tocUrl": "baseUrl", "wordCount": "{{@class.train-number@text}}"}, "ruleContent": {"content": "{{@class.novel-content@html}}\n{{@class.row thumb-overlay-albums@tag.img@data-original}}\n@js:var url = baseUrl\nif(baseUrl.indexOf(\"novel\") !== -1){\n\tresult\n\t} else {\n        var lines = result.split(\"\\n\");\n        var newLines = [];\n        for (var i = 0; i < lines.length; i++) {\n            newLines.push('<img src=\"' + lines[i] + '\">');\n        }\n        newLines.join(\"\\n\")\n}", "imageDecode": "if (src.search(\"qyyuapi.com\") != -1) {\n    result;\n} else {\n    var Magua = new JavaImporter();\n    Magua.importPackage(Packages.java.io, Packages.android.graphics);\n    with(Magua) {\n        var mac = src.match(/photos\\/(\\d+)?\\/(\\d+)?/);\n        var bookId = mac[1];\n        var imgId = mac[2];\n        if (src.search(\"gif\") != -1 || Number(bookId) < 220980) {\n            result;\n        } else {\n            var num;\n            if (Number(bookId) > 421925) {\n                var md5 = java.md5Encode((bookId + imgId));\n                var ascii = md5.substr( - 1).charCodeAt(0);\n                num = (ascii % 8 + 1) * 2;\n            } else if (Number(bookId) >= 268850) {\n                var md5 = java.md5Encode((bookId + imgId));\n                var ascii = md5.substr( - 1).charCodeAt(0);\n                num = (ascii % 10 + 1) * 2;\n            } else {\n                num = 10;\n            }\n            var img = BitmapFactory.decodeByteArray(result, 0, result.length);\n            var height = img.getHeight();\n            var width = img.getWidth();\n            var y = Math.floor(height / num);\n            var remainder = height % num;\n            var newImg = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);\n            var canvas = new Canvas(newImg);\n            for (var i = 1; i <= num; i++) {\n                var h = i === num ? remainder: 0;\n                canvas.drawBitmap(Bitmap.createBitmap(img, 0, y * (i - 1), width, y + h), 0, height - y * i - h, null);\n            }\n            var newbit = new ByteArrayOutputStream();\n            newImg.compress(Bitmap.CompressFormat.PNG, 100, newbit);\n            newbit.toByteArray();\n        }\n    }\n}", "imageStyle": "FULL"}, "ruleExplore": [], "ruleSearch": {"author": "@js:\nvar text;\nif (baseUrl.indexOf('novel') !== -1){\n\ttext=java.getString('.title-truncate.2@text');\n}else {\n\ttext=java.getString('.title-truncate.1@text');\n}\ntext;", "bookList": ".list-col||.list-item||.thumb-overlay-guess_likes", "bookUrl": "tag.a.0@href", "coverUrl": "img@data-original||img@src", "intro": ".video-title@text", "kind": ".tag@text", "lastChapter": "@js:\nvar text;\nif (baseUrl.indexOf('novel') !== -1){\n\ttext=java.getString('.title-truncate.1@text');\n}else {\n\ttext=java.getString('');\n}\ntext;", "name": ".video-title@text", "wordCount": "span.0@text##^##👍🏻"}, "ruleToc": {"chapterList": "class.btn-toolbar.0@tag.a||.reading\n<js>\nvar type = +(java.get('btype'))\njava.log(type)\nswitch (type) {\n  case 1:\n    book.type = 8;\n    break;\n  case 2:\n    book.type = 64;\n}\nresult\n</js>", "chapterName": "text", "chapterUrl": "href##(.*)##$1/?shunt={{Get('shunt')}}", "preUpdateJs": "{{}}", "updateTime": "span@text"}, "searchUrl": "{{Get('url')}}/search/photos?search_query={{key}}&search-type=photos&main_tag=0&page={{page}}", "weight": 0},{"bookSourceComment": "//2026.6.20\n用了夜泽川的猕猴桃漫画的代码做了发布页和翻页规则，在此郑重感谢。\n！！！大家一定要擦亮眼睛，不要给这个网站买会员啊！直接在Legado阅读里阅读或者去正版漫蛙网站里看。正版漫蛙是htpps://www.mw777.me。这个源爬的网站胜在国内连接稳定，更换了域名也容易改，网速差可以考虑挂梯或换域名。\n用户ljy911028发的是正版漫蛙的源，大家可以也去那里看看。\n我也是在昨天才发现这个网站是需要开会员看部分漫画的，之前一直都是直接抓取api阅读，所以不要在这个网站充钱，真正的漫蛙是完全免费的。", "bookSourceGroup": "", "bookSourceName": "漫蛙", "bookSourceType": 2, "bookSourceUrl": "https://www.manware.cc/", "bookUrlPattern": "", "concurrentRate": "", "coverDecodeJs": "", "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreScreen": "", "exploreUrl": "@js:\nvar result = [];\nvar push = (title, tag, p, size) => result.push({\n    title: title,\n    url: `https://www.manware.cc/api${p}` + \",\" + JSON.stringify({\n        \"body\": `{\\\"page\\\":{\\\"page\\\":{{page}},\\\"pageSize\\\":36},\\\"category\\\":\\\"comic\\\",\\\"sort\\\":0,\\\"comic\\\":{\\\"status\\\":-1,\\\"day\\\":0,\\\"tag\\\":\\\"${tag}\\\"},\\\"video\\\":{\\\"year\\\":0,\\\"typeId\\\":0,\\\"typeId1\\\":0,\\\"area\\\":\\\"\\\",\\\"lang\\\":\\\"\\\",\\\"status\\\":-1,\\\"day\\\":0},\\\"novel\\\":{\\\"status\\\":-1,\\\"day\\\":0,\\\"sortId\\\":0}}`,\n        \"method\": \"POST\"\n    }),\n    style: {\n        layout_flexGrow: 1,\n        layout_flexBasisPercent: size\n    }\n});\nvar tags = org.jsoup.Jsoup.parse(java.ajax('https://www.manware.cc/cate')).select('.tag-container').toArray().at(-1).select('a');\nfor (let i in tags) {\n    let size = i == 0 ? 1 : 0.25;\n    push(tags[i].text(), tags[i].attr('data-value'), tags[i].attr('href'), size);\n}\nJSON.stringify(result);", "header": "{  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 8.1.0; JKM-AL00b Build/HUAWEIJKM-AL00b; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044807 Mobile Safari/537.36\"}", "lastUpdateTime": "1783686438097", "loginCheckJs": "", "loginUi": "", "loginUrl": "", "respondTime": 3990, "ruleBookInfo": {"author": "a[href*=\"author\"]@text", "canReName": "", "coverUrl": "", "init": "", "intro": "p.comic-desc@text", "kind": "a[href^=\"/cate/\"]@text", "lastChapter": "a#newch@text", "name": "h2#page-title@text", "tocUrl": "", "wordCount": ""}, "ruleContent": {"content": "@js:\nvar imglist = JSON.parse(src).data.images;\nvar html = '';\nfor (var i = 0; i < imglist.length; i++) {\n    html += '<img src=\\\"' + imglist[i].url + '\\\">\\\n';\n}\nhtml", "imageDecode": "(function() {\n    var isImage = (result[0] === 0xFF && result[1] === 0xD8) ||\n        (result[0] === 0x89 && result[1] === 0x50) ||\n        (result[0] === 0x47 && result[1] === 0x49) ||\n        (result[0] === 0x52 && result[1] === 0x49);\n    if (isImage) return result;\n    var iv = result.slice(0, 16);\n    var ciphertext = result.slice(16);\n    var key = java.strToBytes('0B6666A0-BB59-1381-B746-a0E4C9AC');\n    var cipher = java.createSymmetricCrypto('AES/CBC/PKCS5Padding', key, iv);\n    return cipher.decrypt(ciphertext);\n})();", "imageStyle": "", "nextContentUrl": "@js:\nvar pageList = [];\nlet Data = JSON.parse(src).data.pagination;\nvar page = Math.ceil(Data.total / Data.page_size);\nfor (let i = 2;i <= page;i++) {\npageList.push(baseUrl.replace(\"page=1\",`page=${i}`));\n}\npageList;", "replaceRegex": "", "sourceRegex": "", "webJs": ""}, "ruleExplore": {"author": "", "bookList": "$.data.list[*]", "bookUrl": "@json:$.url##/api/comic/##/comic/", "coverUrl": "$.pic", "intro": "$.description", "kind": "$.tags", "lastChapter": "", "name": "$.title", "wordCount": ""}, "ruleSearch": {"author": "$.author", "bookList": "$.data.list", "bookUrl": "$.url", "coverUrl": "$.cover", "intro": "$.description", "kind": "$.tags", "lastChapter": "", "name": "$.title", "wordCount": ""}, "ruleToc": {"chapterList": "#chapter-grid-container a", "chapterName": "@data-title", "chapterUrl": "@href@js:a=result.split(\"/\")[3];b=`https://www.manware.cc/api/comic/image/${a}?count=true&page=1`", "isVip": "", "isVolume": "", "nextTocUrl": "", "updateTime": "span@text##\\n##|"}, "searchUrl": "/api/search?type=mh&page={{page}}&pageSize=20&keyword={{key}}", "variableComment": "", "weight": 0},{"bookSourceComment": "//by:九梦", "bookSourceGroup": "3", "bookSourceName": "STV", "bookSourceType": 0, "bookSourceUrl": "http://www.sjwx.la", "customButton": false, "customOrder": 355, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "eventListener": false, "exploreUrl": "[\n    {\n        \"title\": \"武侠小说\",\n        \"url\": \"/soft/1/Soft_001_{{page}}.html\",\n        \"style\": {\n            \"layout_flexBasisPercent\": 0.3,\n            \"layout_flexGrow\": 1\n        }\n    },\n    {\n        \"title\": \"玄幻小说\",\n        \"url\": \"/soft/2/Soft_002_{{page}}.html\",\n        \"style\": {\n            \"layout_flexBasisPercent\": 0.3,\n            \"layout_flexGrow\": 1\n        }\n    },\n    {\n        \"title\": \"都市言情\",\n        \"url\": \"/soft/3/Soft_003_{{page}}.html\",\n        \"style\": {\n            \"layout_flexBasisPercent\": 0.3,\n            \"layout_flexGrow\": 1\n        }\n    },\n    {\n        \"title\": \"恐怖灵异\",\n        \"url\": \"/soft/4/Soft_004_{{page}}.html\",\n        \"style\": {\n            \"layout_flexBasisPercent\": 0.3,\n            \"layout_flexGrow\": 1\n        }\n    },\n    {\n        \"title\": \"现代文学\",\n        \"url\": \"/soft/5/Soft_005_{{page}}.html\",\n        \"style\": {\n            \"layout_flexBasisPercent\": 0.3,\n            \"layout_flexGrow\": 1\n        }\n    },\n    {\n        \"title\": \"侦探推理\",\n        \"url\": \"/soft/6/Soft_006_{{page}}.html\",\n        \"style\": {\n            \"layout_flexBasisPercent\": 0.3,\n            \"layout_flexGrow\": 1\n        }\n    },\n    {\n        \"title\": \"科幻小说\",\n        \"url\": \"/soft/7/Soft_007_{{page}}.html\",\n        \"style\": {\n            \"layout_flexBasisPercent\": 0.3,\n            \"layout_flexGrow\": 1\n        }\n    },\n    {\n        \"title\": \"穿越架空\",\n        \"url\": \"/soft/9/Soft_009_{{page}}.html\",\n        \"style\": {\n            \"layout_flexBasisPercent\": 0.3,\n            \"layout_flexGrow\": 1\n        }\n    },\n    {\n        \"title\": \"古典名著\",\n        \"url\": \"/soft/10/Soft_010_{{page}}.html\",\n        \"style\": {\n            \"layout_flexBasisPercent\": 0.3,\n            \"layout_flexGrow\": 1\n        }\n    },\n    {\n        \"title\": \"历史军事\",\n        \"url\": \"/soft/12/Soft_012_{{page}}.html\",\n        \"style\": {\n            \"layout_flexBasisPercent\": 0.3,\n            \"layout_flexGrow\": 1\n        }\n    },\n    {\n        \"title\": \"网游小说\",\n        \"url\": \"/soft/14/Soft_014_{{page}}.html\",\n        \"style\": {\n            \"layout_flexBasisPercent\": 0.3,\n            \"layout_flexGrow\": 1\n        }\n    }\n]\n", "lastUpdateTime": "1783554063832", "respondTime": 21198, "ruleBookInfo": {"author": ".small.-2@text##.+：", "coverUrl": ".detail_pic@img@src", "intro": "&nbsp;{{@@.small[!1,2,-2]@text}}\n{{@@.showInfo@p@text}}", "kind": "span@a.1@text", "lastChapter": ".small.-1@text##.+：", "name": "h1.0@text", "tocUrl": "text.在线阅读@href"}, "ruleContent": {"content": "#content1@html", "replaceRegex": "##最新网址.+la"}, "ruleExplore": [], "ruleSearch": {"author": "text.作者：@text##\\s.+", "bookList": ".listBox@ul@li", "bookUrl": "a@href", "coverUrl": "a@img@src", "intro": "text.连载：@text##\\S+\\s(\\S+)\\s\\S+\\s(\\S+)##&nbsp;$1\n$2", "name": "a@text"}, "ruleToc": {"chapterList": ".pc_list.-1@ul@li", "chapterName": "a@text", "chapterUrl": "a@href"}, "searchUrl": "http://www.sjwx.la/search.php?s=&searchkey={{key}}", "weight": 0},{"bookSourceComment": "//26.7.9制作", "bookSourceGroup": "耽美", "bookSourceName": "📚 爱书网 (耽美TXT论坛)", "bookSourceType": 0, "bookSourceUrl": "https://asw227.com", "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "enabledSearch": true, "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36\",\n  \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\",\n  \"Accept-Language\": \"zh-CN,zh;q=0.9,en;q=0.8\",\n  \"Connection\": \"keep-alive\",\n  \"Upgrade-Insecure-Requests\": \"1\"\n}", "searchUrl": "https://asw227.com/search.php?kw={{key}}", "exploreUrl": "耽美-最新上传::https://asw227.com/index.php?page={{page}}\n耽美-下载排行::https://asw227.com/index.php?sort=hits&page={{page}}\n耽美-周热门::https://asw227.com/index.php?sort=week&page={{page}}\n耽美-月热门::https://asw227.com/index.php?sort=month&page={{page}}\n耽美-24小时热榜::https://asw227.com/index.php?sort=day&page={{page}}\n言情-最新上传::https://www.asw7777.com/index.php?page={{page}}\n言情-下载排行::https://www.asw7777.com/index.php?sort=hits&page={{page}}\n男生频道::https://www.asw7777.com/searchns.php?kw=[%E7%94%B7%E7%94%9F]&page={{page}}", "ruleSearch": {"bookList": ".file-card", "name": ".file-name@text##\\.txt$##", "author": ".file-name@text##.*?(?:作者[:：]|by|By|著)(.*?)(?:\\.txt|\\)|）|\\+|著|\\s|$).*##$1###.file-name@text", "kind": ".file-details@text##📦|🏷️|🕒|txt|热度:##", "bookUrl": "a.file-card-link@href", "checkKeyWord": "斗罗大陆"}, "ruleBookInfo": {"name": ".elsetext p span@text##\\.txt$##", "author": ".elsetext p span@text##.*?(?:作者[:：]|by|By|著)(.*?)(?:\\.txt|\\)|）|\\+|著|\\s|$).*##$1###.elsetext p span@text", "kind": ".info-item.1@text", "lastChapter": ".info-item.3@text", "tocUrl": "a:contains(阅读)@href##\\.txt$##"}, "ruleToc": {"chapterList": ".pagination a:matches(\\d)", "chapterName": "text##\\\\D*(\\\\d+)\\\\D*##第 $1 页\"", "chapterUrl": "href"}, "ruleContent": {"content": ".content-box@html", "replaceRegex": "##此文件由小说互动共享平台书友上传|网址：www\\.[a-zA-Z0-9]+\\.com|提醒：若文中被插入微信号，请点击上面的举报！"}},{"bookSourceComment": "//26.7.8修复\n改用标准内置charset独立参数进行GBK搜索，彻底解决JS引擎不兼容报错；根据最新搜索源码重新精调ruleSearch，精准匹配列表。\n//搜索间隔30s", "bookSourceGroup": "🔞", "bookSourceName": "🚭肉文ＮＰ (PO文学)", "bookSourceType": 0, "bookSourceUrl": "https://www.powenxue3.com", "charset": "gbk", "customOrder": 1177, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "enabledSearch": true, "respondTime": 120000, "loginUrl": "/login.php,{\n  \"method\": \"POST\",\n  \"body\": \"action=login&username={{username}}&password={{password}}&usecookie=525600\"\n}", "searchUrl": "/modules/article/search.php,{\n  \"method\": \"POST\",\n  \"charset\": \"gbk\",\n  \"body\": \"searchkey={{key}}\"\n}", "exploreUrl": "耽美::/danmei/{{page==1?'':page+'.html'}}\n百合::/baihe/{{page==1?'':page+'.html'}}\n同人::/tongren/{{page==1?'':page+'.html'}}\n校园言情::/xiaoyuan/{{page==1?'':page+'.html'}}\n都市言情::/dushi/{{page==1?'':page+'.html'}}\n古代言情::/gudai/{{page==1?'':page+'.html'}}\n罗曼史::/luoman/{{page==1?'':page+'.html'}}\n奇幻玄幻::/qihuan/{{page==1?'':page+'.html'}}\n武侠仙侠::/wuxia/{{page==1?'':page+'.html'}}\n网游竞技::/wangyou/{{page==1?'':page+'.html'}}\n穿越重生::/chuanyue/{{page==1?'':page+'.html'}}\n科幻异能::/kehuan/{{page==1?'':page+'.html'}}\n恐怖灵异::/kongbu/{{page==1?'':page+'.html'}}\n惊悚推理::/jingsong/{{page==1?'':page+'.html'}}\n历史军事::/lishi/{{page==1?'':page+'.html'}}\n浓情::/nongqing/{{page==1?'':page+'.html'}}\n综合其他::/qita/{{page==1?'':page+'.html'}}", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\",\n  \"Referer\": \"https://www.powenxue3.com/\",\n  \"Origin\": \"https://www.powenxue3.com\",\n  \"Connection\": \"keep-alive\"\n}", "ruleSearch": {"author": ".s4@text", "bookList": ".txt-list-row5 li:has(a)", "bookUrl": ".s2 a@href", "intro": ".s3 a@text", "kind": ".s1@text", "name": ".s2 a@text"}, "ruleExplore": {"author": "dt span@text||.s4@text||.s5@text", "bookList": ".item||.txt-list-row5 li:has(a)", "bookUrl": "dt a@href||.s2 a@href", "coverUrl": ".image img@src||img@src", "intro": "dd a@text||.s3 a@text", "kind": ".s1@text", "lastChapter": ".s3 a@text", "name": "dt a@text||.s2 a@text"}, "ruleBookInfo": {"author": "[property=\"og:novel:author\"]@content", "coverUrl": "[property=\"og:image\"]@content||.imgbox img@src", "downloadUrl": "a.btn-dl@href||text.TXT下载@href||/modules/article/txtarticle.php?id={{bookId}}", "intro": "[property=\"og:description\"]@content||.desc@textNodes", "kind": "[property=\"og:novel:category\"]@content", "lastChapter": "[property=\"og:novel:latest_chapter_name\"]@content", "name": "[property=\"og:novel:book_name\"]@content", "tocUrl": "link[rel=\"canonical\"]@href||@js:baseUrl"}, "ruleToc": {"chapterList": "#section-list li a", "chapterName": "text", "chapterUrl": "href"}, "ruleContent": {"content": "#content@textNodes", "replaceRegex": "##最新章节.*|PO文学.*|www\\.powenxue3\\.com.*"}, "weight": 0},{"bookSourceComment": "修复发现页只有一本书且点开无目录的Bug（修正逗号分隔导致的URL属性解析失效），完善发现页的完美翻页支持。", "bookSourceGroup": "🔞,满血复活🔥", "bookSourceName": "中文成人文学", "bookSourceType": 0, "bookSourceUrl": "https://xbookcn.org", "customOrder": 254, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "enabledSearch": true, "respondTime": 120000, "searchUrl": "/search?q={{key}}&page={{page}}", "ruleBookInfo": {"author": ".tk-meta span:contains(作者) + span@text||[property=\"og:novel:author\"]@content||@js:\"佚名\"", "coverUrl": "[property=\"og:image\"]@content", "intro": "[property=\"og:description\"]@content||p.tk-body@text", "kind": ".tk-meta span:contains(标签) ~ div a@text||.list-tag-pill@text||[property=\"og:novel:category\"]@content", "wordCount": ".tk-meta span:contains(字数) + span@text", "name": "h1.tk-h1@text||[property=\"og:title\"]@content", "tocUrl": "@js:baseUrl"}, "ruleContent": {"content": "#read-article p@textNodes", "replaceRegex": "##推广：.*|阅读提示：.*|本故事包含.*|（看精彩成人小说上《小黄书》：https://xchina.info）"}, "ruleExplore": {"author": "p.text-xs@textNodes##\t|\\s|·.*", "bookList": "article[role=\"listitem\"]||article.list-feed-item||article.home-feed-item", "bookUrl": "a.list-feed-link@href||a.home-feed-link@href", "intro": "p.line-clamp-2@text", "kind": ".list-tag-pill@text", "name": "h3@text##🎧\\s*"}, "ruleSearch": {"author": "p.text-xs@textNodes##\t|\\s|·.*", "bookList": "article[role=\"listitem\"]||article.list-feed-item", "bookUrl": "a.list-feed-link@href", "intro": "p.line-clamp-2@text", "kind": ".list-tag-pill@text", "name": "h3@text##🎧\\s*"}, "ruleToc": {"chapterList": "#chapters-list li a||.preview-hero-cta a", "chapterName": "span.truncate@text||a@text||text##-.*|🎧\\s*", "chapterUrl": "@href"}, "exploreUrl": "最新收录::/novels?page={{page}}\n人妻女友::/tag/wife?page={{page}}\n学生校园::/tag/student?page={{page}}\n动漫游戏::/tag/anime?page={{page}}\n名人明星::/tag/celebrities?page={{page}}\n古典玄幻::/tag/fantasy?page={{page}}\n家庭乱伦::/tag/family?page={{page}}\n多人群交::/tag/group?page={{page}}\n露出暴露::/tag/exposure?page={{page}}\n强暴性虐::/tag/bdsm?page={{page}}\n同性主题::/tag/lgbt?page={{page}}\n绿帽主题::/tag/ntr?page={{page}}\n耽美小说::/tag/boys?page={{page}}\n漫画小说::/tag/comic?page={{page}}\n有声专区::/tag/audio?page={{page}}", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\",\n  \"Referer\": \"https://xbookcn.org/\"\n}", "weight": 0},{"bookSourceComment": "精准区分首页与搜索页的容器结构，修复搜索永远为空的BUG。重写目录精准抓取规则，绕开'最新章节'干扰。", "bookSourceGroup": "🔞肉书屋(修复)", "bookSourceName": "腐文网 (原肉书屋)", "bookSourceType": 0, "bookSourceUrl": "https://web.popo.city", "customOrder": 1564, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "enabledSearch": true, "respondTime": 120000, "searchUrl": "/search.php,{\n  \"method\": \"POST\",\n  \"body\": \"searchkey={{key}}\",\n  \"charset\": \"gbk\"\n}", "ruleSearch": {"author": ".newbook_author a@text||.list_author a@text", "bookList": ".sort_box_list .newbook_list||.wap_rankinglist_list li||ul.list li", "bookUrl": ".newbook_title a@href||.p1 a@href||.list_name a@href", "coverUrl": ".newbook_pic img@src||img@src", "intro": ".newbook_intor@text", "kind": ".wanben_serial_novelsort span.s1@text", "name": ".newbook_title a@text||.p1 a@text||.list_name a@text"}, "ruleExplore": {"author": ".newbook_author a@text||.list_author a@text||.p2 a@text", "bookList": ".newbook_list||ul.list li||.wap_rankinglist_list li", "bookUrl": ".newbook_title a@href||.list_name a@href||.p1 a@href", "coverUrl": ".newbook_pic img@src||img@src", "intro": ".newbook_intor@text", "kind": ".wanben_serial_novelsort span.s2@text", "name": ".newbook_title a@text||.list_name a@text||.p1 a@text"}, "ruleBookInfo": {"author": ".catalog_author a@text||[property=\"og:novel:author\"]@content", "coverUrl": ".catalog_pic_left img@src||[property=\"og:image\"]@content", "intro": ".catalog_intor@textNodes||[property=\"og:description\"]@content", "kind": ".sort_finish_serial span.s1@text||[property=\"og:novel:category\"]@content", "lastChapter": ".catalog_newest a@text||[property=\"og:novel:latest_chapter_name\"]@content", "name": ".catalog_info_right h3@text||[property=\"og:novel:book_name\"]@content"}, "ruleToc": {"chapterList": ".catalog_list:contains(章节列表) li a||.catalog_list:nth-of-type(2) li a", "chapterName": "text", "chapterUrl": "href", "nextTocUrl": "text.下一页@href"}, "ruleContent": {"content": ".chapter_content@textNodes||#acontent@textNodes", "replaceRegex": "##（看精彩成人小说上《小黄书》：https://xchina.info）|腐文网.*"}, "exploreUrl": "校园言情::/sort/1_{{page}}.html\n都市言情::/sort/2_{{page}}.html\n古代言情::/sort/3_{{page}}.html\n罗曼史::/sort/4_{{page}}.html\n耽美::/sort/5_{{page}}.html\n百合::/sort/6_{{page}}.html\n同人::/sort/7_{{page}}.html\n奇幻玄幻::/sort/8_{{page}}.html\n网游竞技::/sort/9_{{page}}.html\n科幻异能::/sort/10_{{page}}.html\n恐怖灵异::/sort/11_{{page}}.html\n惊悚推理::/sort/12_{{page}}.html\n武侠仙侠::/sort/13_{{page}}.html\n历史军事::/sort/14_{{page}}.html\n穿越重生::/sort/15_{{page}}.html\n综合其它::/sort/16_{{page}}.html", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36\",\n  \"Referer\": \"https://web.popo.city/\"\n}", "weight": 0},{"bookSourceName": "H图书馆(高级完全体)", "bookSourceType": 0, "bookSourceUrl": "https://hlib.cc/", "bookSourceComment": "⚠️破盾指南：搜索或发现为空时，长按书源选择【登录】，点击【一键搜索/破盾】完成认证即可。\n支持无限翻页，完美兼容小说/系列合集，登录弹窗内可切换往期榜单。", "bookUrlPattern": "https://hlib.cc/(n|s)/\\d+", "customOrder": 1, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "header": "{\"User-Agent\":\"Mozilla/5.0 (Linux; Android 12) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Mobile Safari/537.36\",\"Accept-Language\":\"zh-CN,zh;q=0.9\"}", "lastUpdateTime": 1783482729326, "respondTime": 180000, "concurrentRate": "1000", "loginUi": "[\n  {\"name\": \"email\", \"type\": \"text\", \"placeholder\": \"请输入邮箱\"},\n  {\"name\": \"password\", \"type\": \"password\", \"placeholder\": \"请输入密码\"},\n  {\"name\": \"切换为往期历史榜单(昨日/上周等)\", \"type\": \"button\", \"action\": \"var current = source.getVariable() == 'history'; var nextState = !current ? 'history' : 'latest'; source.setVariable(nextState); java.toast('成功切换！当前模式：' + (nextState == 'history' ? '【查看往期历史】' : '【查看最新榜单】') + '，请点击对勾保存并刷新发现页');\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1}},\n  {\"name\": \"一键账号登录\", \"type\": \"button\", \"action\": \"var info = source.getLoginInfoMap(); var email = info.get('email'); var pass = info.get('password'); if (!email || !pass) { java.toast('请先填写邮箱和密码！'); } else { var injectJs = 'setTimeout(function(){document.querySelector(\\\"input[name=\\\\\\\"email\\\\\\\"]\\\").value=\\\"' + email + '\\\";document.querySelector(\\\"input[name=\\\\\\\"password\\\\\\\"]\\\").value=\\\"' + pass + '\\\";document.querySelector(\\\"input[name=\\\\\\\"remember\\\\\\\"]\\\").checked=true;}, 800);'; java.startBrowserAwait('https://hlib.cc/login,{\\\"js\\\":\\\"' + injectJs + '\\\"}', '请完成验证并登录'); }\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.45}},\n  {\"name\": \"一键搜索/破盾\", \"type\": \"button\", \"action\": \"java.startBrowserAwait('https://hlib.cc/search?query=我的', '请点掉人机验证，看到列表即可返回');\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.45}}\n]", "loginUrl": "function login() {\n    return \"\";\n}", "exploreUrl": "<js>\nvar isHistory = source.getVariable() == 'history';\nvar list = [];\n\nif (isHistory) {\n    list.push({\"title\": \"⏳ 小说 · 昨日榜\", \"url\": \"https://hlib.cc/rank?type=day&hist=1&p={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.45}});\n    list.push({\"title\": \"⏳ 系列 · 昨日榜\", \"url\": \"https://hlib.cc/rank/s?type=day&hist=1&p={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.45}});\n    list.push({\"title\": \"📅 小说 · 上周榜\", \"url\": \"https://hlib.cc/rank?type=week&hist=1&p={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.45}});\n    list.push({\"title\": \"📅 系列 · 上周榜\", \"url\": \"https://hlib.cc/rank/s?type=week&hist=1&p={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.45}});\n    list.push({\"title\": \"🗓️ 小说 · 上月榜\", \"url\": \"https://hlib.cc/rank?type=month&hist=1&p={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.45}});\n    list.push({\"title\": \"🗓️ 系列 · 上月榜\", \"url\": \"https://hlib.cc/rank/s?type=month&hist=1&p={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.45}});\n    list.push({\"title\": \"⌛ 小说 · 前日榜\", \"url\": \"https://hlib.cc/rank?type=day&hist=2&p={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.45}});\n    list.push({\"title\": \"⌛ 系列 · 前日榜\", \"url\": \"https://hlib.cc/rank/s?type=day&hist=2&p={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.45}});\n} else {\n    list.push({\"title\": \"🔥 小说 · 热榜\", \"url\": \"https://hlib.cc/rank?type=hour&p={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.45}});\n    list.push({\"title\": \"🔥 系列 · 热榜\", \"url\": \"https://hlib.cc/rank/s?type=hour&p={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.45}});\n    list.push({\"title\": \"📊 小说 · 日榜\", \"url\": \"https://hlib.cc/rank?type=day&p={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.45}});\n    list.push({\"title\": \"📊 系列 · 日榜\", \"url\": \"https://hlib.cc/rank/s?type=day&p={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.45}});\n    list.push({\"title\": \"📚 小说 · 周榜\", \"url\": \"https://hlib.cc/rank?type=week&p={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.45}});\n    list.push({\"title\": \"📚 系列 · 周榜\", \"url\": \"https://hlib.cc/rank/s?type=week&p={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.45}});\n    list.push({\"title\": \"🏆 小说 · 月榜\", \"url\": \"https://hlib.cc/rank?type=month&p={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.45}});\n    list.push({\"title\": \"🏆 系列 · 月榜\", \"url\": \"https://hlib.cc/rank/s?type=month&p={{page}}\", \"style\": {\"layout_flexBasisPercent\": 0.45}});\n}\nJSON.stringify(list);\n</js>", "ruleBookInfo": {"author": "@CSS:div.col-lg-3.mt-3 li.list-group-item.text-center a.me-2@text", "intro": "@CSS:div.row.flex-lg-row-reverse > div.col-lg-3.mt-3 > ul.mt-3.list-group > li.list-group-item@text", "name": "@CSS:title@text", "tocUrl": "@url"}, "ruleContent": {"content": "id.content@html"}, "ruleExplore": {"bookList": "@CSS:ul.list-group li.list-group-item:has(.fw-bold)", "name": "@CSS:.fw-bold@text", "bookUrl": "@CSS:a:has(.fw-bold)@href", "author": "@CSS:a[href^=/u/] > span.text-body@text", "wordCount": "@CSS:span.text-sm.text-gray@text", "intro": "@CSS:span.short@text", "coverUrl": "@CSS:img.avatar@src"}, "ruleSearch": {"bookList": "@CSS:ul.list-group li.list-group-item:has(.fw-bold)", "name": "@CSS:.fw-bold@text", "bookUrl": "@CSS:a:has(.fw-bold)@href", "author": "@CSS:a[href^=/u/] > span.text-body@text", "wordCount": "@CSS:span.text-sm.text-gray@text", "checkKeyWord": "我的", "intro": "@CSS:span.short@text", "coverUrl": "@CSS:img.avatar@src"}, "ruleToc": {"chapterList": "<js>\nvar list = [];\nvar pages = java.getElements(\"li.list-group-item.p-0#s-pages > ul.list-group > li\");\nif (!pages.isEmpty()) {\n    for (var i = 0; i < pages.size(); i++) {\n        var li = pages.get(i);\n        var a = li.select(\"a\");\n        if (!a.isEmpty()) {\n            list.push({name: a.text(), url: a.attr(\"href\")});\n        } else {\n            list.push({name: li.text(), url: baseUrl});\n        }\n    }\n} else {\n    var bookElements = java.getElements(\"ul.list-group li.list-group-item div.my-1 a\");\n    if (!bookElements.isEmpty()) {\n        for (var i = 0; i < bookElements.size(); i++) {\n            var b = bookElements.get(i);\n            if (b.attr(\"href\").indexOf(\"/n/\") != -1) {\n                list.push({name: b.text(), url: b.attr(\"href\")});\n            }\n        }\n    }\n    if (list.length == 0) {\n        list.push({name: \"正文\", url: baseUrl});\n    }\n}\nlist;\n</js>", "chapterName": "name", "chapterUrl": "url"}, "searchUrl": "https://hlib.cc/search?query={{key}}&p={{page}}, {\"webView\":true,\"webViewDelayTime\":2500}", "weight": 0},{"bookSourceComment": "//修复目录：详情页取 data-cata；目录页按 li 的隐藏序号排序，并解码 a 的 Base64 链接\nhttps://www.lanlanbo.com\nhttps://www.gosealib.com/\nhttps://www.haitangss.com/\nhttps://www.sadseas.com/", "bookSourceGroup": "", "bookSourceName": "海棠搜书🔞蓝海搜书", "bookSourceType": 0, "bookSourceUrl": "https://www.lanlanbo.com", "customButton": false, "customOrder": -1, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "eventListener": false, "exploreUrl": "言情::/s/new/言情/{{page}}/\n耽美::/s/耽美/{{page}}/\n同人::/s/同人/{{page}}/\n综合::/s/综合/{{page}}/\nP018::/s/new/PO18/{{page}}/\n都市::/s/都市/{{page}}/\n现言::/s/现言/{{page}}/\n古言::/s/new/古言/{{page}}/\n轻小说::/s/轻小说/{{page}}/\n原创::/s/原创小说/{{page}}/\n科幻::/s/科幻/{{page}}/\n仙侠::/s/仙侠/{{page}}/\n奇幻::/s/奇幻/{{page}}/\n玄幻::/s/玄幻/{{page}}/\n衍生::/s/同人衍生/{{page}}/\n古代::/s/古代/{{page}}/\n现代::/s/现代/{{page}}/\n男性::/s/男男/{{page}}/\n女性::/s/女女/{{page}}/\n励志::/s/励志/{{page}}/\n清水::/s/清水/{{page}}/\n甜文::/s/甜文/{{page}}/\n校园::/s/校园/{{page}}/\n职场::/s/职场/{{page}}/\n种田::/s/种田/{{page}}/\n年下::/s/年下/{{page}}/\nABO::/s/ABO/{{page}}/\n1V1::/s/1V1/{{page}}/\n腹黑::/s/腹黑/{{page}}/\nNP::/s/new/NP/{{page}}/\n美人::/s/美人/{{page}}/\nBL::/s/BL/{{page}}/\n情欲::/s/情欲/{{page}}/\n百合::/s/百合/{{page}}/\n强强::/s/强强/{{page}}/\n爽文::/s/爽文/{{page}}/\n狗血::/s/狗血/{{page}}/\n娱乐圈::/s/娱乐圈/{{page}}/\n快穿::/s/快穿/{{page}}/", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36\"\n}", "lastUpdateTime": "1783407901198", "respondTime": 180000, "ruleBookInfo": {"author": ".b@text", "coverUrl": "class.BGsectionOne-top-left@img@src", "intro": "id.intro@html", "kind": ".category@a@text", "lastChapter": "class.newestChapter@a@text", "name": ".title@text", "tocUrl": "@js:(function(){var s=String(result);var m=s.match(/data-cata=[\"']([^\"']+)[\"']/);if(!m)return '';var u=m[1].replace(/&amp;/g,'&');var q=u.match(/[?&]u=([^&]+)/);if(q){try{return decodeURIComponent(q[1]);}catch(e){return q[1];}}if(/^https?:/i.test(u))return u;if(/^\\/\\//.test(u))return 'https:'+u;var b=typeof baseUrl!='undefined'?String(baseUrl):'https://www.lanlanbo.com';var h=b.match(/^(https?:\\/\\/[^\\/]+)/i);return (h?h[1]:'https://www.lanlanbo.com')+u;})()"}, "ruleContent": {"content": "class.RBGsectionThree-content@html@js:(function(){var s=String(result);s=s.replace(/<script[\\s\\S]*?<\\/script>/gi,'').replace(/<style[\\s\\S]*?<\\/style>/gi,'');s=s.replace(/<br\\s*\\/?\\s*>/gi,'\\n').replace(/<\\/p>/gi,'\\n').replace(/<[^>]+>/g,'');s=s.replace(/&nbsp;|&emsp;/g,' ').replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&quot;/g,'\"').replace(/&#39;|&apos;/g,\"'\").replace(/&amp;/g,'&');s=s.replace(/Loading[\\s\\S]*/,'').replace(/未加载完[\\s\\S]*/,'').replace(/移动流量[\\s\\S]*/,'').replace(/收藏网址[\\s\\S]*/,'').replace(/www\\.[^\\n]*/g,'').replace(/[（(]＞人＜；?[）)]/g,'');return s.replace(/\\r/g,'').replace(/[ \\t]+\\n/g,'\\n').replace(/\\n{3,}/g,'\\n\\n').trim();})()"}, "ruleExplore": [], "ruleSearch": {"author": "span[1]@a@title", "bookList": ".SHsectionThree-middle>p:nth-child(even)", "bookUrl": "span[0]@a@href", "checkKeyWord": "", "intro": "", "kind": "span[2]@a@title", "name": "span[0]@a@title"}, "ruleToc": {"chapterList": "+@js:(function(){var h=String(result),r=/<li[^>]*class=[\"'][^\"']*BCsectionTwo-top-chapter[^\"']*[\"'][^>]*>[\\s\\S]*?<\\/li>/gi,m,o=[],idx=0;while((m=r.exec(h))){var x=m[0],li=(x.match(/^<li[^>]*>/i)||[''])[0],ns=[],mm,nr=/data-[^=]+=[\"'](\\d+)[\"']/g;while((mm=nr.exec(li)))ns.push(parseInt(mm[1]));var ord=ns.length?ns[ns.length-1]:idx;o.push({html:x,order:ord,idx:idx});idx++;}o.sort(function(a,b){return a.order===b.order?a.idx-b.idx:a.order-b.order});var out=typeof Packages!='undefined'?new Packages.java.util.ArrayList():[];for(var i=0;i<o.length;i++){out.add?out.add(o[i].html):out.push(o[i].html);}return out;})()", "chapterName": "@js:(function(){function e(s){return String(s||'').replace(/&amp;/g,'&').replace(/&quot;/g,'\\\"').replace(/&#39;/g,\"'\").replace(/&lt;/g,'<').replace(/&gt;/g,'>');}var s=String(result),a=(s.match(/<a[\\s\\S]*?>/i)||[''])[0],m,ar=/data-[^=]+=[\"']([^\"']*)[\"']/g;while((m=ar.exec(a))){var v=e(m[1]);if(v&&!/^[A-Za-z0-9+\\/]+={0,2}$/.test(v)&&!/^\\d+$/.test(v))return v;}m=s.match(/<a[\\s\\S]*?>([\\s\\S]*?)<\\/a>/i);return m?e(m[1].replace(/<[^>]+>/g,'').replace(/\\s+/g,' ').trim()):'';})()", "chapterUrl": "@js:(function(){function e(s){return String(s||'').replace(/&amp;/g,'&').replace(/&quot;/g,'\\\"').replace(/&#39;/g,\"'\").replace(/&lt;/g,'<').replace(/&gt;/g,'>');}function a(u,b){u=e(u);if(/^https?:\\/\\//i.test(u))return u;if(/^\\/\\//.test(u))return (String(b).match(/^(https?:)/i)||['https:'])[1]+u;var h=String(b||'').match(/^(https?:\\/\\/[^\\/]+)/i);if(u.charAt(0)=='/')return h?h[1]+u:u;return String(b||'').replace(/[?#].*$/,'').replace(/\\/[^\\/]*$/,'/')+u;}var s=String(result),b=typeof baseUrl!='undefined'?String(baseUrl):'',at=(s.match(/<a[\\s\\S]*?>/i)||[''])[0],m,ar=/data-[^=]+=[\"']([^\"']*)[\"']/g;while((m=ar.exec(at))){var v=e(m[1]);if(/^[A-Za-z0-9+\\/]+={0,2}$/.test(v)){try{var d=String(java.base64Decode(v));if(d&&/\\.html?(?:$|[?#])/.test(d))return a(d,b);}catch(err){}}}m=at.match(/href=[\"']([^\"']+)[\"']/i);return m?a(m[1],b):'';})()", "nextTocUrl": "@js:(function(){function e(s){return String(s||'').replace(/&amp;/g,'&').replace(/&quot;/g,'\"').replace(/&#39;/g,\"'\").replace(/&lt;/g,'<').replace(/&gt;/g,'>');}function a(u,b){u=e(u);if(!u)return '';if(/^https?:\\/\\//i.test(u))return u;if(/^\\/\\//.test(u))return (String(b).match(/^(https?:)/i)||['https:'])[1]+u;var h=String(b||'').match(/^(https?:\\/\\/[^\\/]+)/i);if(u.charAt(0)=='/')return h?h[1]+u:u;return String(b||'').replace(/[?#].*$/,'').replace(/\\/[^\\/]*$/,'/')+u;}var h=String(result),cm=h.match(/<link[^>]+rel=[\"']canonical[\"'][^>]+href=[\"']([^\"']+)/i)||h.match(/<link[^>]+href=[\"']([^\"']+)[\"'][^>]+rel=[\"']canonical/i),b=cm?cm[1]:(typeof baseUrl!='undefined'?String(baseUrl):''),m=h.match(/<a[^>]+href=[\"']([^\"']+)[\"'][^>]*id=[\"']next[\"'][^>]*>/i)||h.match(/<a[^>]+id=[\"']next[\"'][^>]*href=[\"']([^\"']+)[\"'][^>]*>/i);return m?a(m[1],b):'';})()"}, "searchUrl": "/s/{{key}}/{{page}}/", "weight": 0},{"bookSourceComment": "//GET搜索；发现/分类、详情、封面、静态完整目录、正文可用；xbqg77 在部分网络会解析到 127.0.0.1，主域名改用站点同源备用域名 xbqg777", "bookSourceName": "新笔趣阁", "bookSourceType": 0, "bookSourceUrl": "https://www.xbqg777.com", "bookUrlPattern": "https?://www\\.xbqg77[7]?\\.com/\\d+/?", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "[{\"title\":\"首页\",\"url\":\"/\"},{\"title\":\"玄幻奇幻\",\"url\":\"/xh\"},{\"title\":\"修真武侠\",\"url\":\"/xz\"},{\"title\":\"都市言情\",\"url\":\"/ds\"},{\"title\":\"穿越历史\",\"url\":\"/cy\"},{\"title\":\"网游竞技\",\"url\":\"/wy\"},{\"title\":\"科幻灵异\",\"url\":\"/kh\"},{\"title\":\"完结小说\",\"url\":\"/wj\"},{\"title\":\"排行榜\",\"url\":\"/ph\"}]", "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36\"\n}", "lastUpdateTime": "1783408077694", "respondTime": 180000, "ruleBookInfo": {"author": "[property=\"og:novel:author\"]@content||.detail .zuthor@text##^作者：##", "coverUrl": ".detail .cover img@src||script@html@js:(function(){var m=String(result||'').match(/imgUrl\\s*=\\s*['\"]([^'\"]+)['\"]/);return m?m[1]:'';})()", "intro": "[property=\"og:description\"]@content||.detail .des .text@text##[^\\n]*最新章节由网友提供[\\s\\S]*", "kind": "[property~=category|status|update_time]@content||.detail .state@text##^状态：##||.crumb a.1@text", "lastChapter": "[property=\"og:novel:latest_chapter_name\"]@content||.detail .upcont a@text", "name": "[property=\"og:novel:book_name\"]@content||.detail .title@text", "tocUrl": ".crumb a:last-child@href||[property=\"og:novel:read_url\"]@content##https?://www\\.xbqg77\\.com##https://www.xbqg777.com"}, "ruleContent": {"content": "#article@html@js:(function(){var s=String(result||'');s=s.replace(/<p[^>]+class=[\"']readinline[\"'][\\s\\S]*?<\\/p>/gi,'');s=s.replace(/<!--over-->/gi,'');s=s.replace(/<br\\s*\\/?\\>/gi,'\\n').replace(/<\\/p>/gi,'\\n').replace(/<[^>]+>/g,'');s=s.replace(/&nbsp;|&emsp;/g,' ').replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&quot;/g,'\"').replace(/&#39;/g,\"'\").replace(/&amp;/g,'&');return s.split(/\\n+/).map(function(x){return x.replace(/^\\s+|\\s+$/g,'');}).filter(function(x){return x;}).join('\\n').replace(/\\n{3,}/g,'\\n\\n').trim();})()"}, "ruleExplore": {"author": ".author@text", "bookList": ".card", "bookUrl": "a@href", "coverUrl": "img@src", "intro": ".des@text", "name": ".title@text||a@title", "nextUrl": "text.下一页@href"}, "ruleSearch": {"author": ".author@text", "bookList": ".card", "bookUrl": "a@href", "coverUrl": "img@src", "intro": ".des@text", "name": ".title@text||a@title", "nextUrl": "text.下一页@href"}, "ruleToc": {"chapterList": ".chapter ol li a", "chapterName": "text", "chapterUrl": "href"}, "searchUrl": "https://www.xbqg777.com/search?keyword={{key}}", "weight": 0},{"ruleSearch": {"bookList": "class.comic-sort col3 search-result@li", "bookUrl": "tag.a@href", "name": "tag.a@tag.p@text", "checkKeyWord": "我的"}, "ruleBookInfo": {"name": "class.comic-info@class.comic-detail@tag.h1@text"}, "ruleToc": {"chapterList": "class.weui-cells@tag.a", "chapterUrl": "tag.a@href", "chapterName": "class.weui-cell__bd@text"}, "ruleContent": {"content": "class.center padding5@img@html"}, "ruleReview": [], "ruleExplore": [], "bookSourceUrl": "https://www.fumanmanhua.com", "bookSourceName": "腐漫", "bookSourceType": 2, "bookUrlPattern": "(https?://)?(www\\.)?fumanmanhua\\.com", "searchUrl": "https://www.fumanmanhua.com/search/index?keywords={{key}}", "lastUpdateTime": "1783309698298"}]